
var civilHolidays = 1;
var showFamilyEvents = 1;
var timezone = -6;



/* Returns the absolute date of the DAYNAME on or before absolute DATE.
 * DAYNAME=0 means Sunday, DAYNAME=1 means Monday, and so on.
 *
 * Note: Applying this function to d+6 gives us the DAYNAME on or after an
 * absolute day d.  Similarly, applying it to d+3 gives the DAYNAME nearest to
 * absolute date d, applying it to d-1 gives the DAYNAME previous to absolute
 * date d, and applying it to d+7 gives the DAYNAME following absolute date d.
 */
function day_on_or_before (day_of_week, dt) {
	return dt - ((dt - day_of_week) % 7);
	}


//						 J   F   M    A   M  J   J   A   S   O   N   D
// hebdate.js has a civMonthLength(month, year) that does the same thing
var DaysInMonth = new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function DaysInCivMonth(ly, m) {
	var days = DaysInMonth[m-1];
	if (m == 1 && ly) ++days;
	return (days);
	}



function makeArray() {
	this[0] = makeArray.arguments.length;
	for (i = 0; i < makeArray.arguments.length; i = i + 1)
		this[i+1] = makeArray.arguments[i];
}

var civMonth = new makeArray(
	'January', 'February', 'March', 'April', 'May', 'June',
	'July', 'August', 'September', 'October', 'November', 'December');

var weekDay = new makeArray(
	'Sun', 'Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Saturday');

function Gauss(year) {
	var a,b,c;
	var m;
	var	Mar;	// "day in March" on which Pesach falls (return value)

	a = Math.floor((12 * year + 17) % 19);
	b = Math.floor(year % 4);
	m = 32.044093161144 + 1.5542417966212 * a +  b / 4.0 - 0.0031777940220923 * year;
	if (m < 0)
		m -= 1;
	Mar = Math.floor(m);
	if (m < 0)
		m++;
	m -= Mar;

	c = Math.floor((Mar + 3 * year + 5 * b + 5) % 7);
	if(c == 0 && a > 11 && m >= 0.89772376543210 )
		Mar++;
	else if(c == 1 && a > 6 && m >= 0.63287037037037)
		Mar += 2;
	else if(c == 2 || c == 4 || c == 6)
		Mar++;

	Mar += Math.floor((year - 3760) / 100) - Math.floor((year - 3760) / 400) - 2;
	return Mar;
}

function isDST(y, m, d) {
	if (m < 4 || m > 10) return (0);
	if (m == 4) {	// DST starts in Apr
		return (d >= NthDOW(1, 1, 4, y));
		}
	else if (m > 4 && m < 10) 
		return (1);
	else if (m == 10) {	// ends in Oct
		return (d < NthDOW(0, 1, 10, y));
		}
	}


function leap(y) {
	return ((y % 400 == 0) || (y % 100 != 0 && y % 4 == 0));
}

function civMonthLength(month, year) {
	if(month == 2)
		return 28 + leap(year);
	else if(month == 4 || month == 6 || month == 9 || month == 11)
	   return 30;
	else
		return 31;
}


function Easter(Y) {
	// based on the algorithm of Oudin
    var C = Math.floor(Y / 100);
    var N = Y - 19 * Math.floor(Y / 19);
    var K = Math.floor((C - 17) / 25);
    var I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15;
    I = I - 30*Math.floor((I / 30));
    I = I - Math.floor(I / 28) * (1 - Math.floor(I / 28) * Math.floor(29 / (I + 1)) * Math.floor((21 - N) / 11));
    var J = Y + Math.floor(Y / 4) + I + 2 - C + Math.floor(C / 4);
    J = J - 7 * Math.floor(J / 7);
    var L = I - J;
    var M = 3 + Math.floor((L + 40) / 44);
    var D = L + 28 - 31 * Math.floor(M / 4);

	var ret = new Object();
	ret[1] = M;
	ret[2] = D;
	return ret;
}

function DOW(day,month,year) {
	var a = Math.floor((14 - month)/12);
	var y = year - a;
	var m = month + 12*a - 2;
	var d = (day + y + Math.floor(y/4) - Math.floor(y/100) +
			Math.floor(y/400) + Math.floor((31*m)/12)) % 7;
	return d + 1;
}

function NthDOW(nth,weekday,month,year) {
	if (nth > 0)
		return (nth - 1) * 7 + 1 + (7 + weekday - DOW((nth - 1) * 7 + 1, month, year)) % 7;
	var days = civMonthLength(month, year);
	return days - (DOW(days, month, year) - weekday + 7) % 7;
}

function holidays(cday, cmonth, cyear) {
	// American civil holidays and some major religious holiday
	if (cmonth == 1 && cday == 1)
		return "New Year's Day";
	else if (cmonth == 2 && cday == 12)
		return "Lincoln's Birthday";
	else if (cmonth == 2 && cday == 14)
		return "Valentine's Day";
	else if (cmonth == 2 && cday == NthDOW(3, 2, 2, cyear))
		return "President's Day";
	else if (cmonth == 3 && cday == 17)
		return "St. Patrick's Day";
	else if (cmonth == 4 && cday == NthDOW(1, 1, 4, cyear))
		return "Daylight Savings Time Begins";
	else if (cmonth == 3 || cmonth == 4) {
		var e = Easter(cyear);
	    if (cmonth == e[1] && cday == e[2])
			return "Easter";
	}
	else if (cmonth == 5 && cday == NthDOW(2, 1, 5, cyear))
		return "Mother's Day";
	else if (cmonth == 5 && cday == NthDOW(3, 7, 5, cyear))
		return "Armed Forces Day";
	else if (cmonth == 5 && cday == NthDOW(0, 2, 5, cyear))
		return "Memorial Day";
	else if (cmonth == 6 && cday == 14)
		return "Flag Day";
	else if (cmonth == 6 && cday == NthDOW(3, 1, 6, cyear))
		return "Father's Day";
	else if (cmonth == 7 && cday == 4)
		return "Independence Day";
	else if (cmonth == 9 && cday == NthDOW(1, 2, 9, cyear))
		return "Labor Day";
	else if (cmonth == 10 && cday == NthDOW(0, 1, 10, cyear))
		return "Daylight Savings Time Ends";
	else if (cmonth == 10 && cday == NthDOW(2, 2, 10, cyear))
		return "Columbus Day";
	else if (cmonth == 10 && cday == 31)
		return "Halloween";
	else if (cmonth == 11 && cday == 11)
		return "Veterans' Day";
	else if (cmonth == 11 && cday == NthDOW(4, 5, 11, cyear))
		return "Thanksgiving";
	else if (cmonth == 12 && cday == 25)
		return "Christmas";
	else if (cyear == 2004 && cmonth == 7 && (cday == 24 || cday == 25))
		return "Family Reunion";

	return "";
}


var monCount = new makeArray(1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366);


function doy(d, m, y) {
	return monCount[m] + d + (m > 2 && leap(y));
}


function selectLoad() {
	var now = new Date();
	var m = now.getMonth();
	var y = now.getYear();
	if(y < 1000)
		y += 1900;

	document.calendar_control.month.selectedIndex = m;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectCurrent() {
	var now = new Date();
	var y = now.getYear();
	var m = now.getMonth();
	if(y < 1000) y += 1900;

	document.calendar_control.month.selectedIndex = m;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectNext() {
	var y = parseInt(document.calendar_control.yr.value);
	var m = document.calendar_control.month.selectedIndex;

	if(m < 11)
		m++;
	else {
		m = 0;
		y++;
		}

	document.calendar_control.month.selectedIndex = m;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectPrev() {
	var y = parseInt(document.calendar_control.yr.value);
	var m = document.calendar_control.month.selectedIndex;

	if(m > 0)
		m -= 1;
	else {
		m = 11;
		y -= 1;
		}

	document.calendar_control.month.selectedIndex = m;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectNextYear(num) {
	var y = parseInt(document.calendar_control.yr.value);
	var m = document.calendar_control.month.selectedIndex;
	y += num;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectPrevYear(num) {
	var y = parseInt(document.calendar_control.yr.value);
	var m = document.calendar_control.month.selectedIndex;
	y -= num;
	document.calendar_control.yr.value = y;
	doCal(m, y);
	}

function selectForm(form) {
	var y = parseInt(form.yr.value);
	var m = form.month.selectedIndex;
	doCal(m, y);
	}

function toggleTempleEvents(form) {
	var y = parseInt(form.yr.value);
	var m = form.month.selectedIndex;
	showFamilyEvents = form.TempleEvents.checked;
	doCal(m, y);
	}

function doCal(month, year) {
	var ret = calendar(month, year);
	var result = BuildCalendar(ret);
	setContent("CalDiv", result);
	}

function calendar(selM, selY) {
	var m = selM + 1;
	var y = selY;
	var d = civMonthLength(m, y);
	var firstOfMonth = new Date (y, selM, 1);
	var startPos = firstOfMonth.getDay() + 1;
	var retVal = new Object();
	retVal[1] = startPos;
	retVal[2] = d;
	retVal[3] = m;
	retVal[4] = y;
	return (retVal);
	}

function BuildCalendar(parms)  {
	var hdrSize = "+2";				// size of tables header font
	var border = 2;					// 3D height of table's border
	var cellspacing = 0;			// width of table's border
	var hdrHeight = 50;				// height of the table's header cell
	var dayCellHeight = 25;			// height of cells containing days of the week
	var dayColor = "darkred";		// color of font representing week days
	var civColor = "darkgreen";		// color of font representing Civ date
	var cellWidth  = "80";			// width of columns in table
	var cellHeight = 55;			// height of day cells calendar
	var now = new Date();
	var tday = now.getDate();
	var tmonth = now.getMonth();
	var tyear = now.getYear();
	if(tyear < 1000)
		tyear += 1900;
	var cMonth = parms[3];
	var cYear = parms[4];
	var monthName = civMonth[cMonth];
	var lastDate = civMonthLength(cMonth, cYear);
	var hm;
	var hMonth;
	var hYear;

	// Something to insert to cause a half line space between calendar entries
	var halfBlankLine = '<br><span style="line-height:7px">&nbsp;</span><br>';

	// Addition by Dave Williss.  Read event data out of a hidden IFRAME
	// Assumes format of C YYYY MM DD text
	// Where "C" is either "H" for Hebrew date or "C" for Civil date
	// Year can be "*" to indicate every year
	// 
	var events = new Array(32);
	for (var i=1; i <= 31 ; ++i) {
		events[i] = "";
		}

	if (showFamilyEvents) {
		var re = /\{([A-Za-z1-9]+)\}/;

		for (var i=0; i < allCalData.length ; ++i) {
			var parts = allCalData[i].split(' ');
			if ((parts[0] == '*' || parts[0] == cYear) 
			 && (parts[1] == '*' || parts[1] == cMonth)) {

				var edata, icon;
				if (parts[3] == "B") {
					icon = "bdaycake.gif";
					}
				else if (parts[3] == "A") {
					icon = "rings.gif";
					}
				else if (parts[3] == "D") {
					icon = "ycandle.gif";
					}
				edata = '<img src="' + icon + '" height="10" width="10">';
				if (parts[4] == "R") color="red";
				if (parts[4] == "G") color="darkgreen";
				if (parts[4] == "B") color="blue";
				if (parts[4] == "P") color="purple";
			   edata += '<font color="' + color + '">';
				edata += parts.slice(5).join(' ');
				if (re.test(edata)) {
					var xx = re.exec(edata);
					var rep = "$`" + calAbbr[xx[1]] + "$'";
					edata = edata.replace(re, rep);
					}
				edata += '</font>';
				var dom;
				if (parseInt(parts[2])) {
					dom = parts[2];
					if (events[dom] != "") 
						events[dom] += halfBlankLine;
					events[dom] += edata;
					}
				else {
					dayname = parts[2].substr(0,3);
					dayname = dayname.toLowerCase();
					if (dayname == "sun") dow = 1;
					else if (dayname == "mon") dow = 2;
					else if (dayname == "tue") dow = 3;
					else if (dayname == "wed") dow = 4;
					else if (dayname == "thu") dow = 5;
					else if (dayname == "fri") dow = 6;
					else if (dayname == "sat") dow = 7;
					weeknum = parts[2].substr(3,5);
					if (weeknum == "*") weeknum="12345";
					for (j = 0 ; j < weeknum.length; ++j) {
						var n = parseInt(weeknum.substr(j,1));
						dom = NthDOW(n, dow, cMonth, cYear);
						if (dom) {
							if (edata == "-")
								events[dom] = "";
							else {
								if (events[dom] != "") 
									events[dom] += halfBlankLine;
								events[dom] += edata;
								}
							}
						}
					}	
				}
			}
		}

    var result = '';
   // result += '<center><br>';

	// set up our table structure
	result += '<TABLE WIDTH="100%" BORDER=' + border + ' CELLSPACING=' + cellspacing + '>';		// table settings
	result +=	 '<TH COLSPAN=7 HEIGHT=' + hdrHeight + ' align="center">';		// create table header cell
	result +=		'<FONT face="Arial" COLOR="' + civColor + '" SIZE=' + hdrSize + '>';	// set font for table header
	result +=			monthName + ' ' + cYear;
	result +=		'</FONT>';		// close table header's font settings
	result +=	 '</TH>'; // close header cell

	// variables to hold constant settings
	//var openCol = '<TD WIDTH=' + cellWidth + ' HEIGHT=' + dayCellHeight + '>';
	var openCol = '<TD WIDTH="14.28%" HEIGHT=' + dayCellHeight + '>';
	openCol += '<FONT face="Arial" COLOR="' + dayColor + '">';
	var closeCol = '</FONT></TD>';

	// create first row of table to set column width and specify week day
	result += '<TR ALIGN="center" VALIGN="center">';
	for (var dayNum = 1; dayNum < 8; ++dayNum) {
	        result += openCol + weekDay[dayNum] + closeCol;
	}
	result += '</TR>';
 
    var cell = 1
    var cDay = 1
    var row;
    for (row = 1; row <= 6; row++) {
        result+='<TR VALIGN="top">'
        for (col = 1; col <= 7; col++)  {


	        if (cell < parms[1])
				result += '<TD></TD>';
	        else {

				var holiday = "";
				if(civilHolidays)
					holiday = holidays(cDay, cMonth, cYear);

				var bg;
		        if((cDay == tday) && (parms[3] == (tmonth+1)) && (parms[4] == tyear))
					// highight the current day
					bg = 'bgColor=#c0d0c0'
				else if (holiday != "") {
					// highlight civil holiday
					bg = 'bgColor=#d0c0c0'
					}
				else
					// no highlight
					bg = '';

				// assemble the contents of our day cell
				var cYMD = cYear + "," + cMonth + "," + cDay;
				result += '<TD HEIGHT=' + cellHeight + ' align="left" valign="top" ' + bg + '>';
				//result +=   '<table BORDER=0 COLS=2 WIDTH=' + cellWidth + 'HEIGHT=' + cellHeight + ' >';
				//result +=   '<table BORDER=0 COLS=2 WIDTH="100%" HEIGHT=' + cellHeight + ' >';
				result +=   '<table BORDER=0 COLS=2 WIDTH="100%"  >';
				result +=     '<tr>';
				result +=       '<td>';
				result +=         '<FONT face="Arial" COLOR="' + civColor + '"><b>';
				result +=           cDay + '</b></td>';
				result +=         '</font>';
				result +=     '</tr>';
				result +=   '</table>';
				result +=   '<FONT face="Arial" size=-2>'

				if (showFamilyEvents && events[cDay] != "") {
					result += events[cDay];
					if (col == 7 ||  holiday != "")
						result += halfBlankLine;
					}

				if (holiday != "")
					result += halfBlankLine;
				if (holiday != "")
					result += "<FONT COLOR='red'>" + holiday + "</FONT>";
				result += '</TD>';

		        cDay++
            }

            if (cDay <= lastDate)
                cell++
            else
                break;
        }

        result += '</TR>'
        if(cDay > parms[2])
                break;
    }

    result += '</table>'

    return result;
}


function popupMsg (elem, str) {
	var popup = getObj("Popup");
	if (popup) {
		setContent("Popup", str);

		// XXX I don't know how to find the position of elem in a browser-
		// independant way.  This works in NS6 and IE5.  Not NS4.x
		var x = elem.offsetLeft;
		var y = elem.offsetTop + elem.offsetHeight;
		var parent = elem.offsetParent;
		while (parent) {
			x += parent.offsetLeft;
			y += parent.offsetTop;
			parent = parent.offsetParent;
			}
		x -= popup.offsetWidth - elem.offsetWidth;

		if (document.layers) {
			popup.pageX = x;
			popup.pageY = y;
			}
		else {
			popup.style.left = x;
			popup.style.top = y;
			}
		popup.style.visibility = "visible";
		}
	}




