
var JAN=0,FEB=1,MAR=2,APR=3,MAY=4,JUN=5,JUL=6,AUG=7,SEP=8,OCT=9,NOV=10,DEC=11;
var SUN=0,MON=1,TUE=2,WED=3,THU=4,THUR=4,FRI=5,SAT=6;
var Days = ["Sunday", "Monday", "Tuesday", "Wednesday", 
               "Thursday", "Friday", "Saturday"];
var Months = ["January", "Feburary", "March", "April",
                 "May", "June", "July", "August",
                 "September", "October", "November", "December"];
var MSInDay=3600*24*1000;
var today=new Date();
var startDay = new Date(today.getTime());
if (startDay.getDate() < startDay.getDay())
   startDay.setDate(1)
else
   startDay.setDate(startDay.getDate()-startDay.getDay());

var endDay = new Date(startDay.getTime()+(6-startDay.getDay())*MSInDay+5*7*MSInDay);

function thead()
{
   document.write('<TABLE rules="all"> <COLGROUP span="7" width = "14%" valign="top"></COLGROUP>');
}
   

function ttail()
{
   document.write('</TABLE>');
   //  printAllBlurbs();
}

function topLinks()
{
    var mo = startDay.getMonth();
    document.write('<SPAN CLASS=noprint>');
    document.write('<CENTER>');
    var done=false;
    while(!done)
    {
        document.write ( '<A HREF="#' + Months[mo] + '">' + Months[mo] + '</A><BR>');
	if (mo == endDay.getMonth()) done = true;
	mo = (mo+1)%12;
    }
    document.write('</SPAN>');
}

function putMonth(mo)
{
    document.write('<TR><TD COLSPAN="7"><B><CENTER><A NAME="'
                  + Months[mo]
		  + '"></A>'
		  + Months[mo]
		  + '</CENTER></TD></TR>'
		  );
}

function putDays()
{
    document.write('<TR>');
    for (i=0; i < 7; i++)
        document.write('<TD><B>' + Days[i] + '</B></TD>');
    document.write('</TR>');
}

function doDay(day)
{
     if (day.getDay()==0) document.write("<TR>");
     else if (day.getDate()==1)
     {
         var i = 0;
	 document.write("<TR>");
	 while (i < day.getDay()){document.write("<TD></TD>"); i++;}
     }
     document.write("<TD><B>"+day.getDate()+"</B>");
     var splDay = null;
     while (splDay = getSplDay(day,splDay))
     {
          document.write("<BR><I>" + splDay.text + "</I>");
     }

     var events = scanEvents(day);
     events.sort(eventCompare);
     var s = formatEvents(events);
     document.write(s);

     document.write("</TD>");
     if (day.getDay()==6) document.write("</TR>");
}
function doCalendar()
{
    var day = new Date(startDay.getTime());
    var mo = day.getMonth();
    putMonth(mo);
    putDays();
    while(day.getTime() <= endDay.getTime())
    {
	if (day.getMonth() != mo)
	{
            var i = day.getDay();
	    while (i !=0){document.write("<TD></TD>"); i = (i+1)%7;}
	    document.write("<TR>");
	    mo=day.getMonth();
            putMonth(mo);
            putDays();
	}
        doDay(day);
	day.setTime(day.getTime()+MSInDay);
    }
}

var regEvents = new Array();
var splEvents = new Array();
var splDays   = new Array();
var blurbs = new Array();
for (i = 0; i < 7; i++) regEvents[i] = new Array(); 
for (i = 0; i < 7; i++) splEvents[i] = new Array(); 

var EVERY=0, FIRST=1,SECOND=2,THIRD=3,FORTH=4,FIFTH=5,FIRSTandTHIRD=6,EVEN=7,ODD=8,NOTFIRST=9,SECONDSECOND=10;

function regEvent(day,which,time, timeText,text,tag)
{
    this.which = which;
    this.time = time;
    this.timeText = timeText;
    this.text = text;
    this.tag = tag;
    var events = regEvents[day];
    this.blurb = null;
    this.start=-1;
    this.end=-1;
    events[events.length] = this;
}
regEvent.prototype.setMonths = function(startMonth,endMonth)
{
    this.start = startMonth;
    this.end = endMonth;
}

function splEvent(month,date,time, timeText,text,tag)
{
    var day=new Date();

    if (month < day.getMonth()) day.setYear(day.getYear()+1);
    day.setDate(1);  // setMonth() not safe if after the 28th of resulting month
    day.setMonth(month);
    day.setDate(date);

    this.month = month;
    this.date = date;
    this.time = time;
    this.timeText = timeText;
    this.text = text;
    this.tag = tag;
    this.blurb = null;
    var events = splEvents[day.getDay()];
    events[events.length] = this;
}
function eventCompare(e1,e2)
{
   return e1.time - e2.time;
}

var blurbCnt = 0;
function blurb(title, text)
{
    this.title = title;
    this.text = text;
    this.tag = blurbCnt++;
    this.linked = false;
    blurbs[blurbs.length] = this;
}

function findDay(month,day,number)
{
    // get the next date for a day defined, for example, as the 4th Thursday
    // in November
    var year = today.getYear();
    if (today.getMonth() > month)
      year += 1;
    d=new Date(year,month,number*7-6);
    d.setTime(d.getTime()+MSInDay/2); // point to noon of day
    while (d.getDay() != day)
       d.setTime(d.getTime()+MSInDay);
    if (d.getMonth() != month)  // If past last day in month
       d.setTime(d.getTime()-7*MSInDay);
    return d;
}

function splDay(date,text)
{
    this.date = date;
    this.text = text;
    splDays[splDays.length]=this;
}

function getSplDay(day, splDay)
{
      for (i = 0; i < splDays.length; i++)
      {
	  if (splDay)
	  {
	      if (splDays[i]==splDay)
	          splDay=null;
	      continue;
	  }
	  var date=splDays[i].date;

          if (date.getDate() == day.getDate()
	      && date.getMonth() == day.getMonth()
	      && date.getYear() == day.getYear()
	      )
	      return splDays[i];
      }
      return null;
}

function setEasterDays()
{
    var Easters = new Array
	        ( new Date(2003,APR,20)
	        , new Date(2004,APR,11)
	        , new Date(2005,MAR,27)
	        , new Date(2006,APR,16)
	        , new Date(2007,APR,8)
	        , new Date(2008,MAR,23)
	        , new Date(2009,APR,12)
	        , new Date(2010,APR,4)
	        );

    var i = 0;
    var easter = null;
    while (i < Easters.length && easter===null)
    {
        if (Easters[i].getYear() == today.getYear())
	   easter = Easters[i];
	i++;
    }
    if (i < Easters.length)
    {
	 easter.setHours(12); // Noon, avoids Daylight Savings time confussion
         new splDay(easter,"Easter");

	 var date = new Date();
	 date.setTime(easter.getTime()-MSInDay*2);
         new splDay(date,"Good Friday");

	 date = new Date();
	 date.setTime(easter.getTime()-MSInDay*3);
         new splDay(date,"Maundy Thursday");

	 date = new Date();
	 date.setTime(easter.getTime()-MSInDay*7);
         new splDay(date,"Palm Sunday");

	 date = new Date();
	 date.setTime(easter.getTime()-MSInDay*49);
         new splDay(date,"Transfiguration Sunday");

	 date = new Date();
	 date.setTime(easter.getTime()-MSInDay*46);
         new splDay(date,"Ash Wednesday");

	 date = new Date();
	 date.setTime(easter.getTime()+MSInDay*42);
         new splDay(date,"Ascension Sunday");

	 date = new Date();
	 date.setTime(easter.getTime()+MSInDay*49);
         new splDay(date,"Pentecost");

	 date = new Date();
	 date.setTime(easter.getTime()+MSInDay*56);
         new splDay(date,"Trinity Sunday");
    }
}

function setXmass()
{
    var year = today.getYear();
    if (today.getMonth() == JAN) year-=1;
    var xmass = new Date(year,DEC,25);
    xmass.setHours(12);
    new splDay(xmass,"Christmas");

    var date = new Date();
    date.setTime(xmass.getTime()-MSInDay);
    new splDay(date,"Christmas Eve");

    var advent = new Date();
    advent.setTime(xmass.getTime()-(MSInDay*(xmass.getDay()+21)));
    if (xmass.getDay()==0)
        advent.setTime(advent.getTime()-7*MSInDay);
    new splDay(advent,"Advent begins");

    var epiph = new Date(year+1,JAN,6);
    new splDay(epiph,"Epiphany");

    var bap = new Date(year+1,JAN,13);
    bap.setTime(bap.getTime()-bap.getDay()*MSInDay);
    new splDay(bap,"Baptism of Jesus");

    var thankgiv = new Date(year,NOV,22);
    while (thankgiv.getDay() != THUR)
        thankgiv.setTime(thankgiv.getTime()+MSInDay);
    new splDay(thankgiv,"Thanksgiving");

    var cthankgiv = new Date(year,OCT,8);
    while (cthankgiv.getDay() != MON)
        cthankgiv.setTime(cthankgiv.getTime()+MSInDay);
    new splDay(cthankgiv,"Canadian Thanksgiving");

    new splDay(new Date(year,NOV,1), "All Saints Day");

    // National Day of Prayer: First Thursday in May
    // Has nothing to do with Christmas, but use same technique as for Thanksgiving
    var nationalDay = new Date(year,MAY,1);
    while (nationalDay.getDay() != THUR)
        nationalDay.setTime(nationalDay.getTime()+MSInDay);
    new splDay(nationalDay,"National Day of Prayer");
}

function setSplDays()
{
    setEasterDays();
    setXmass();

    new splDay(findDay(NOV,THUR,4),"Thanksgiving");
    new splDay(findDay(OCT,MON,2),"Canadian Thanksgiving");
    new splDay(findDay(MAY,THUR,1),"National Day of Prayer");
    new splDay(findDay(MAY,SUN,2),"Mother's Day");
    new splDay(findDay(JUN,SUN,3),"Father's Day");
    new splDay(findDay(APR,SUN,1),"Daylight Savings");
    new splDay(findDay(OCT,SUN,5),"End Daylight Savings");
    new splDay(findDay(OCT,SAT,4),"Make A Difference Day");
}
setSplDays();

function linkBlurb( blurb)
{
    blurb.linked = true;
    return ('<BR><SPAN CLASS=noprint><A HREF="javascript:popupBlurb(' + blurb.tag + ')"> info</A></SPAN>');
}

function printBlurb(doc, blurb)
{
    doc.write( '<P align="left"><A NAME=blurb' + blurb.tag
             + '><B><FONT color=#990000>' + blurb.title + '</FONT></B></A><BR>'
             + blurb.text );
}

function printCloseMe(doc)
{
    doc.write('<P><CENTER><FORM><INPUT TYPE="BUTTON" VALUE="Close", onClick="self.close()"></FORM>');
}

var blurbWin = null;
function popupBlurb(tag)
{
    var blurb = blurbs[tag];
    blurbWin=window.open("", "blurbWin", "height=300,width=300,scrollbars");
    var doc = blurbWin.document;
    doc.open();
    doc.write('<HTML><BODY  width="260" height="198" >');
    printBlurb(doc,blurb);
    printCloseMe(doc);
    doc.write("</BODY></HTML>");
    doc.close();
    blurbWin.focus();
}

function printAllBlurbs()
{
    for (i = 0; i < blurbs.length; i++)
       if (blurbs[i].linked)
           printBlurb(document, blurbs[i]);
}

function scanEvents(day)
{
    var ret = new Array();
    var events = regEvents[day.getDay()];
    var i = 0;
    while (i < events.length)
    {
        var e = events[i++];
	var append = false;
	switch(e.which)
	{
	case EVERY:
	     append=true; break;
	case FIRST:
	     if (day.getDate() <= 7) append = true; break;
	case SECOND:
	     if (day.getDate() >= 8 && day.getDate() <= 14) append = true; break;
	case THIRD:
	     if (day.getDate() >= 15 && day.getDate() <= 21) append = true; break;
	case FORTH:
	     if (day.getDate() >= 22 && day.getDate() <= 28) append = true; break;
	case FIFTH:
	     if (day.getDate() >= 29 ) append = true; break;
	case FIRSTandTHIRD:
	     if (day.getDate() <= 7) append = true;
	     if (day.getDate() >= 15 && day.getDate() <= 21) append = true; break;
	case EVEN:
	     if (day.getDate() >= 8 && day.getDate() <= 14) append = true;
	     if (day.getDate() >= 22 && day.getDate() <= 28) append = true; break;
	case ODD:
	     if (day.getDate() <= 7) append = true;
	     if (day.getDate() >= 15 && day.getDate() <= 21) append = true;
	     if (day.getDate() >= 29 ) append = true; break;
	case NOTFIRST:
	     if (day.getDate() > 7) append = true; break;
	case SECONDSECOND: /* For Food Drive on Second Saternday of Even Months */
	     if (day.getDate() >= 8 && day.getDate() <= 14)
	     {
	        mo=day.getMonth();
	        if (mo == FEB || mo==APR || mo == JUN || mo == AUG || mo == OCT || mo == DEC)
	           append = true;
	     }
	     break;
	}
	if (append)
	{
	    m=day.getMonth();
	    if (e.start > 0 )
	    {
	        if (e.end > e.start)
		{
		    if (m < e.start || m > e.end) // June-August
		       append = false;
		} else if (e.end > 0 )
		{
		    if (m < e.start && m > e.end) // Sept-May
		       append = false;
		}
		else
		{
		    if (m<e.start)      // Program starts next month
		       append = false;
		}
	    }
	    else if (e.end > 0 )
	    {
		    if (m>e.end)      // Program ended last month
		       append = false;
	    }
	}
	if (append)
	    ret[ret.length] = e;
    }

    events = splEvents[day.getDay()];
    i = 0;
    while (i < events.length)
    {
        var e = events[i++];
	if (e.month == day.getMonth() && e.date == day.getDate())
	{
	    var j = 0;
            if (e.tag)
            {
	         while (j < ret.length && ret[j].tag != e.tag)
	             j++;
            } else
            {
	        j = ret.length;
            }
	    ret[j] = e;
	}
    }
    return ret;

}

function formatEvents(events)
{
    var i = 0
    var s = "";
    while(i < events.length)
    {
       var e = events[i++];
       s += '<P><B>'+e.timeText+'</B><BR>' + e.text;
       if (e.blurb)
           s+= linkBlurb(e.blurb);
    }
    return s;
}

var evnt;
evnt = new regEvent(WED,EVERY,1800,"6PM-8PM", "Bell Choir and Chancel Choir Rehearsal","Choir");

evnt = new regEvent(TUE,EVERY,1900,"7PM-9PM", "Men's Group","MensGroup");
  evnt.blurb = new blurb("Men's Spirituality Group", 
               'Meets Tuesday nights from 7 to 9PM.');

evnt = new regEvent(TUE,EVERY,1000,"10AM-3PM", "Quilters","Quilters");
evnt.setMonths(SEP,MAY);
evnt = new regEvent(TUE,SECOND,1300,"1-3PM", "Women's Fellowship","WomenFellow");
evnt.setMonths(SEP,MAY);
evnt = new regEvent(MON,EVERY,1200,"Noon", "Ecumenical Bible Study Group","BrownBag");
//var pflagBlurb = new blurb("East Snohomish County PFLAG",
//'<A HREF="http://www.pflag.org/" TARGET="_blank">PFLAG</A> is an outreach support group for Parents and Friends of Lesbians And Gays. The East Snohomish branch meets in our Fellowship Hall on the 3<SUP>rd</SUP> Monday of the month.'
//);
//evnt = new regEvent(MON,THIRD,1930,"7:00PM", "East Snohomish County PFLAG","BrownBag");
//evnt.blurb = pflagBlurb;
evnt = new regEvent(SUN,SECOND,1200,"12PM", "Cabinet Meeting","Cabinet");
evnt = new regEvent(SUN,FORTH,1200,"12PM", "Outreach Committee Meeting","Outreach");
evnt = new regEvent(SUN,FORTH,1201,"12PM", "Christian Ed Committee Meeting","XEd");
evnt = new regEvent(SUN,FORTH,1202,"12PM", "Diaconate Meeting","Diaconate");
evnt = new regEvent(WED,FIRST,1700,"5PM", "Trustees Meeting","Trustees");
//var bibleStudyBlurb = new blurb("Sunday Morning Bible Study",
//      "Begining November 6, Tom will lead us in a study of Islam.");
evnt = new regEvent(SUN,EVERY,900,"9AM", "Bible Study","SundayBS");
//evnt.blurb = bibleStudyBlurb;
evnt = new regEvent(SUN,FIRST,1030,"10:30AM", "Communion Worship","Worship");
evnt = new regEvent(SUN,NOTFIRST,1030,"10:30AM", "Worship","Worship");
// evnt = new regEvent(WED,ODD,1730,"5:30PM", "Renewal Task Force","Renewal");
//evnt = new regEvent(SAT,SECONDSECOND,1000,"10AM-4PM", "Food Drive at Fred Meyers'","FoodDrive");
evnt = new regEvent(WED,EVERY,1030,"10:30AM", "Lectionary Study Group at Merrill Gardens","Lectionary");
evnt = new regEvent(SUN,EVERY,1930,"7:30PM", "AA Meets in Fellowship Hall","AA");
evnt = new splEvent(SEP,10,1200,"After Worship", "Annual Church Picnic","Cabinet");

