var day_abbrev = new Array("S", "M", "T", "W", "T", "F", "S");
var month_abbrev = new Array("Jan.", "Feb.", "Mar.", "Apr.", "May", "June",
								"July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec.");
function make_caption(date, mlen) {
	var edate = new HDate(date.julianDay + mlen - 1);
	if (date.civilMonth == edate.civilMonth)
		return month_abbrev[date.civilMonth-1] + " " + date.getCivilYear();
	if (date.civilYear == edate.civilYear)
		return month_abbrev[date.civilMonth-1] + " - " +
					month_abbrev[edate.civilMonth-1] + " " + date.getCivilYear();
	return month_abbrev[date.civilMonth-1] + " " + date.getCivilYear() + " - " +
				month_abbrev[edate.civilMonth-1] + " " + edate.getCivilYear();
}
function make_hmonth(date) {
	var dow = date.getDayOfWeekN();
	var hmlen = date.getHebrewMonthLen();
	var cd = date.civilDay;
	var cdmax = date.getCivilMonthLen();
	var cmlen = cdmax + 1 - cd;
	var j = date.julianDay;
	var tbl = document.createElement("table");
	var tbody = document.createElement("tbody");
	var tr, td, w, d, a, t;
	// make header row for month names
	tr = document.createElement("tr");
	td = document.createElement("th");
	td.setAttribute("class", "monthname");
	td.setAttribute("colSpan", "7");
	t = document.createTextNode(date.getHebrewMonthName() + " " + date.hebrewYear);
	td.appendChild(t);
	tr.appendChild(td);
	td = document.createElement("td");
	td.setAttribute("class", "gutter");
	tr.appendChild(td);
	td = document.createElement("th");
	td.setAttribute("class", "monthname");
	td.setAttribute("colSpan", "7");
	t = document.createTextNode(make_caption(date, hmlen));
	td.appendChild(t);
	tr.appendChild(td);
	tbody.appendChild(tr);
	// make header row for column headings
	tr = document.createElement("tr");
	for (d = 0; d < 7; d++) {
		td = document.createElement("th");
		t = document.createTextNode(day_abbrev[d]);
		td.appendChild(t);
		tr.appendChild(td);
	}
	td = document.createElement("td");
	td.setAttribute("class", "gutter");
	tr.appendChild(td);
	for (d = 0; d < 7; d++) {
		td = document.createElement("th");
		t = document.createTextNode(day_abbrev[d]);
		td.appendChild(t);
		tr.appendChild(td);
	}
	tbody.appendChild(tr);
	for (w = -dow; w <= hmlen; w += 7) {
		tr = document.createElement("tr");
		for (d = 0; d < 7; d++) {
			td = document.createElement("td");
			if (w+d >= 0 && w+d < hmlen) {
				a = document.createElement("a");
				t = document.createTextNode(w+d+1);
				a.href = "javascript:select_date(" + (j+w+d) + ")";
				a.appendChild(t);
				td.appendChild(a);
			}
			tr.appendChild(td);
		}
		td = document.createElement("td");
		td.setAttribute("class", "gutter");
		tr.appendChild(td);
		for (d = 0; d < 7; d++) {
			// Special case for September 1752
			if (cdmax == 19 && cd == 3) { cd = 14; cdmax = 30 }
			td = document.createElement("td");
			if (w+d >= 0 && w+d < hmlen) {
				a = document.createElement("a");
				t = document.createTextNode(cd);
				a.href = "javascript:select_date(" + (j+w+d) + ")";
				a.appendChild(t);
				td.appendChild(a);
				cd++;
				if (cd > cdmax) {
					date.addDays(cmlen);
					cmlen = cdmax = date.getCivilMonthLen();
					cd = 1;
				}
			}
			tr.appendChild(td);
		}
		tbody.appendChild(tr);
	}
	tbl.appendChild(tbody);
	return tbl;
}
function make_hcaption(date, cmlen) {
	var edate = new HDate(date.julianDay + cmlen - 1);
	if (date.hebrewMonth == edate.hebrewMonth)
		return date.getHebrewMonthName() + " " + date.hebrewYear;
	if (date.hebrewYear == edate.hebrewYear)
		return date.getHebrewMonthName() + " - " +
					edate.getHebrewMonthName() + " " + date.hebrewYear;
	return date.getHebrewMonthName() + " " + date.hebrewYear + " - " +
				edate.getHebrewMonthName() + " " + edate.hebrewYear;
}
function make_cmonth(date) {
	var dow = date.getDayOfWeekN();
	var hd = date.hebrewDay;
	var hdmax = date.getHebrewMonthLen();
	var hmlen = hdmax + 1 - hd;
	var cd = date.civilDay;
	var cmlen = date.getCivilMonthLen();
	var j = date.julianDay;
	var tbl = document.createElement("table");
	var tbody = document.createElement("tbody");
	var tr, td, w, d, a, t;
	// make header row for month names
	tr = document.createElement("tr");
	td = document.createElement("th");
	td.setAttribute("class", "monthname");
	td.setAttribute("colSpan", "7");
	t = document.createTextNode(date.getCivilMonthName() + " " + date.getCivilYear());
	td.appendChild(t);
	tr.appendChild(td);
	td = document.createElement("td");
	td.setAttribute("class", "gutter");
	tr.appendChild(td);
	td = document.createElement("th");
	td.setAttribute("class", "monthname");
	td.setAttribute("colSpan", "7");
	t = document.createTextNode(make_hcaption(date, cmlen));
	td.appendChild(t);
	tr.appendChild(td);
	tbody.appendChild(tr);
	// make header row for column headings
	tr = document.createElement("tr");
	for (d = 0; d < 7; d++) {
		td = document.createElement("th");
		t = document.createTextNode(day_abbrev[d]);
		td.appendChild(t);
		tr.appendChild(td);
	}
	td = document.createElement("td");
	td.setAttribute("class", "gutter");
	tr.appendChild(td);
	for (d = 0; d < 7; d++) {
		td = document.createElement("th");
		t = document.createTextNode(day_abbrev[d]);
		td.appendChild(t);
		tr.appendChild(td);
	}
	tbody.appendChild(tr);
	for (w = -dow; w <= cmlen; w += 7) {
		tr = document.createElement("tr");
		for (d = 0; d < 7; d++) {
			// Special case for September 1752
			if (cmlen == 19 && cd == 3) cd = 14;
			td = document.createElement("td");
			if (w+d >= 0 && w+d < cmlen) {
				a = document.createElement("a");
				t = document.createTextNode(cd);
				a.href = "javascript:select_date(" + (j+w+d) + ")";
				a.appendChild(t);
				td.appendChild(a);
				cd++;
			}
			tr.appendChild(td);
		}
		td = document.createElement("td");
		td.setAttribute("class", "gutter");
		tr.appendChild(td);
		for (d = 0; d < 7; d++) {
			td = document.createElement("td");
			if (w+d >= 0 && w+d < cmlen) {
				a = document.createElement("a");
				t = document.createTextNode(hd);
				a.href = "javascript:select_date(" + (j+w+d) + ")";
				a.appendChild(t);
				td.appendChild(a);
				hd++;
				if (hd > hdmax) {
					date.addDays(hmlen);
					hmlen = hdmax = date.getHebrewMonthLen();
					hd = 1;
				}
			}
			tr.appendChild(td);
		}
		tbody.appendChild(tr);
	}
	tbl.appendChild(tbody);
	return tbl;
}
function draw_calendar() {
	var div = document.createElement("div");
	var y = parseInt(document.getElementById("y").value, 10);
	if (document.currentDate && document.currentDate.hebrewYear == y && document.preferredCalendar == 2) return;
	if (!document.currentDate)
		document.currentDate = new HDate(0);
	document.currentDate.setHebrewDate(y, 7, 1);
	// var elem = document.getElementById("cy");
	// elem.value = document.currentDate.civilYear + 1;
	var nm = document.currentDate.getHebrewYearLen() > 355 ? 13 : 12;
	for (var m = 7; m <= nm; m++) {
		document.currentDate.setHebrewDate(y, m, 1);
		var tbl = make_hmonth(document.currentDate);
		div.appendChild(tbl);
	}
	for (var m = 1; m <= 6; m++) {
		document.currentDate.setHebrewDate(y, m, 1);
		var tbl = make_hmonth(document.currentDate);
		div.appendChild(tbl);
	}
	var cal = document.getElementById("calendartable");
	if (cal.firstChild)
		cal.removeChild(cal.firstChild);
	cal.appendChild(div);
}
function draw_ccalendar() {
	var div = document.createElement("div");
	var y = parseInt(document.getElementById("cy").value, 10);
	if (document.currentDate && document.currentDate.hebrewYear == y && document.preferredCalendar == 1) return;
	if (!document.currentDate)
		document.currentDate = new HDate(0);
	document.currentDate.setCivilDate(y, 1, 1);
	// var elem = document.getElementById("y");
	// elem.value = document.currentDate.hebrewYear;
	var nm = document.currentDate.getHebrewYearLen() > 355 ? 13 : 12;
	for (var m = 1; m <= 12; m++) {
		document.currentDate.setCivilDate(y, m, 1);
		var tbl = make_cmonth(document.currentDate);
		div.appendChild(tbl);
	}
	var cal = document.getElementById("calendartable");
	if (cal.firstChild)
		cal.removeChild(cal.firstChild);
	cal.appendChild(div);
}
function make_holiday_row(n, name, y, m, d, special, erev) {
	// special = 1: not Friday, Saturday, or Sunday (Yom HaAtzmaut)
	// special = 2: Saturday (S'lichot)
	var date = new HDate(y, m, d);
	var dow = date.getDayOfWeekN();
	var adjust = 0;
	if (special == 1) {
		if (dow == 0) adjust = 1;
		else if (dow == 5) adjust = -1;
		else if (dow == 6) adjust = -2;
	} else if (special == 2) {
		if (dow > 0) adjust = 7 - dow;
	}
	date.addDays(adjust);
	var hdate = (erev ? "Erev " : "") + date.getHebrewDateString();
	if (erev) date.addDays(-1);
	var cdate = date.getDayOfWeek() + ", " + date.getCivilDateString();
	var tr, td, t;
	tr = document.createElement("tr");
	// tr.setAttribute("class", (i%2)==1 ? "odd" : "even");
	if (n%2 == 0) tr.style.backgroundColor = "rgb(216, 216, 255)";
	td = document.createElement("td");
	t = document.createTextNode(name);
	td.appendChild(t);
	tr.appendChild(td);
	td = document.createElement("td");
	t = document.createTextNode(hdate);
	td.appendChild(t);
	tr.appendChild(td);
	td = document.createElement("td");
	t = document.createTextNode(cdate);
	td.appendChild(t);
	tr.appendChild(td);
	return tr;
}
function calculate_holidays() {
	var y = parseInt(document.getElementById("y").value, 10);
	document.currentDate.setHebrewDate(y, 7, 1);
	// var elem = document.getElementById("cy");
	// elem.value = document.currentDate.civilYear + 1;
	var tbl = document.createElement("table");
	tbl.setAttribute("cellspacing", "0");
	var tbody = document.createElement("tbody");
	tbody = document.createElement("tbody");
	var n = 1;
	tbody.appendChild(make_holiday_row(n++, "Erev Rosh Hashanah",      y,  7,  1, 0, 1));
	tbody.appendChild(make_holiday_row(n++, "Rosh Hashanah",           y,  7,  1, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Erev Yom Kippur",         y,  7, 10, 0, 1));
	tbody.appendChild(make_holiday_row(n++, "Yom Kippur",              y,  7, 10, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Erev Sukkot",             y,  7, 15, 0, 1));
	tbody.appendChild(make_holiday_row(n++, "Sukkot",                  y,  7, 15, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Simchat Torah",           y,  7, 22, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "First night of Chanukah", y,  9, 25, 0, 1));
	tbody.appendChild(make_holiday_row(n++, "Chanukah",                y,  9, 25, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Tu BiSh'vat",             y, 11, 15, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Purim",                   y, 13, 14, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "First night of Passover", y,  1, 15, 0, 1));
	tbody.appendChild(make_holiday_row(n++, "Passover",                y,  1, 15, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Yom HaShoah",             y,  1, 27, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Yom HaAtzmaut",           y,  2,  5, 1, 0));
	tbody.appendChild(make_holiday_row(n++, "Lag BaOmer",              y,  2, 18, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Yom Yerushalayim",        y,  2, 28, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Shavuot",                 y,  3,  6, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Tisha B'Av",              y,  5,  9, 0, 0));
	tbody.appendChild(make_holiday_row(n++, "Selichot",                y,  6, 21, 2, 1));
	tbl.appendChild(tbody);
	elem = document.getElementById("holidaytable");
	if (elem.firstChild)
		elem.removeChild(elem.firstChild);
	elem.appendChild(tbl);
}
var rule_30 = 0;	//  0 = Rosh Chodesh rule
					//  1 = observe on 1st
					// 29 = observe on 29th
var rule_adar = 2;	//  1 = observe in Adar I
					//  2 = observe in Adar II
					//  3 = observe in both
function calculate_yahrzeits(start, n) {
	var tbl, tbody, tr, td, t, elem;
	var y = document.currentDate.hebrewYear;
	var m = document.currentDate.hebrewMonth;
	var d = document.currentDate.hebrewDay;
	var ylen = document.currentDate.hebrewYearLen;
	var adjust30 = 0;
	var d1 = new HDate(y+1, m, d);
	if (d == 30 && (m == 8 || m == 9)) {
		if (rule_30 == 0) {
			if (d1.hebrewDay != 30)
				adjust30 = -1;
		} else if (rule_30 == 29) {
			adjust30 = -1;
		}
	} else if (d == 30 && m == 12) {
		adjust30 = -30;
	} else  if (d < 30 && m == 12) {
		if (rule_adar != 1) {
			if (ylen > 355) {
				if (rule_adar == 3) rule_adar = 1;
			} else {
				if (rule_adar == 2) m = 13;
			}
		}
	}
	tbl = document.createElement("table");
	tbl.setAttribute("cellspacing", "0");
	tbody = document.createElement("tbody");
	for (var i = start; i < start + n; i++) {
		d1.setHebrewDate(y+i, m, d);
		if (d == 30 && adjust30 != 0) {
			if (d1.hebrewDay != 30)
				d1.addDays(adjust30);
		}
		tr = document.createElement("tr");
		// tr.setAttribute("class", (i%2)==1 ? "odd" : "even");
		if (i%2 == 0) tr.style.backgroundColor = "rgb(216, 216, 255)";
		td = document.createElement("td");
		t = document.createTextNode(i);
		td.appendChild(t);
		tr.appendChild(td);
		td = document.createElement("td");
		t = document.createTextNode(d1.getHebrewDateString());
		td.appendChild(t);
		tr.appendChild(td);
		td = document.createElement("td");
		t = document.createTextNode(d1.getDayOfWeek() + ", " +
										d1.getCivilDateString());
		td.appendChild(t);
		tr.appendChild(td);
		tbody.appendChild(tr);
	}
	tbl.appendChild(tbody);
	elem = document.getElementById("yahrzeitdate");
	t = document.createTextNode(document.currentDate.getHebrewDateString());
	if (elem.firstChild)
		elem.removeChild(elem.firstChild);
	elem.appendChild(t);
	elem = document.getElementById("yahrzeittable");
	if (elem.firstChild)
		elem.removeChild(elem.firstChild);
	elem.appendChild(tbl);
}
function show_first_yahrzeit_page() {
	document.yahrzeitStart = 1;
	calculate_yahrzeits(1, 10);
}
function show_prev_yahrzeit_page() {
	document.yahrzeitStart -= 10;
	if (document.yahrzeitStart < 1)
		document.yahrzeitStart = 1;
	calculate_yahrzeits(document.yahrzeitStart, 10);
}
function show_next_yahrzeit_page() {
	document.yahrzeitStart += 10;
	calculate_yahrzeits(document.yahrzeitStart, 10);
}
function hide_div(id) {	
	var elem = document.getElementById(id);
	if (elem) elem.style.display = "none";
}
function show_div(id) {	
	var elem = document.getElementById(id);
	if (elem) elem.style.display = "block";
}
function hide_input(id) {	
	var elem = document.getElementById(id);
	if (elem) elem.style.display = "none";
}
function show_input(id) {	
	var elem = document.getElementById(id);
	if (elem) elem.style.display = "inline";
}
function deactivate_tab(id) {
	var elem = document.getElementById(id);
	// if (elem) elem.setAttribute("class", "inactive")
	if (elem && elem.style) {
		elem.style.backgroundImage = 'url("../images/tabs_right_off.gif")';
		var a = elem.getElementsByTagName("a")[0];
		if (a && a.style) {
			a.style.backgroundImage = 'url("../images/tabs_left_off.gif")';
			a.style.paddingBottom = "4px";
		}
	}
}	
function activate_tab(id) {
	var elem = document.getElementById(id);
	// if (elem) elem.setAttribute("class", "active")
	if (elem && elem.style) {
		elem.style.backgroundImage = 'url("../images/tabs_right_on.gif")';
		var a = elem.getElementsByTagName("a")[0];
		if (a && a.style) {
			a.style.backgroundImage = 'url("../images/tabs_left_on.gif")';
			a.style.paddingBottom = "5px";
		}
	}
}	
function show_yahrzeit_pane() {
	if (document.preferredCalendar == 1)
		draw_ccalendar();
	else
		draw_calendar();
	hide_div("holidays");
	deactivate_tab("holidaystab");
	hide_div("yahrzeits");
	deactivate_tab("calendartab");
	deactivate_tab("ccalendartab");
	hide_input(document.preferredCalendar == 1 ? "y" : "cy");
	show_input(document.preferredCalendar == 1 ? "cy" : "y");
	show_div("yselector");
	show_div("calendar");
	activate_tab("yahrzeitstab");
	document.currentPane = "yahrzeits";
}
function select_date(j) {
	document.currentDate.setJulianDay(j);
	show_first_yahrzeit_page();
	hide_div("calendar");
	hide_div("yselector");
	deactivate_tab("calendartab");
	deactivate_tab("ccalendartab");
	show_div("yahrzeits");
	activate_tab("yahrzeitstab");
	document.currentPane = "yahrzeits";
}
function show_calendar_pane(i) {
	if (i == 1)
		draw_ccalendar();
	else
		draw_calendar();
	hide_div("holidays");
	deactivate_tab("holidaystab");
	hide_div("yahrzeits");
	deactivate_tab("yahrzeitstab");
	deactivate_tab(i == 1 ? "calendartab" : "ccalendartab");
	hide_input(i == 1 ? "y" : "cy");
	show_input(i == 1 ? "cy" : "y");
	show_div("yselector");
	show_div("calendar");
	activate_tab(i == 1 ? "ccalendartab" : "calendartab");
	document.currentPane = "calendar";
	document.preferredCalendar = i;
}
function show_holiday_pane() {
	calculate_holidays();
	hide_div("calendar");
	deactivate_tab("calendartab");
	deactivate_tab("ccalendartab");
	hide_div("yahrzeits");
	deactivate_tab("yahrzeitstab");
	hide_input("cy");
	show_input("y");
	show_div("yselector");
	show_div("holidays");
	activate_tab("holidaystab");
	document.currentPane = "holidays";
	document.preferredCalendar = 2;
}
function increment_year(i) {
	var yelem = document.getElementById("y");
	var cyelem = document.getElementById("cy");
	if (document.preferredCalendar == 1) {
		var cy = parseInt(cyelem.value, 10) + i;
		cyelem.value = cy;
		yelem.value = cy + document.yearDifferential;
	}
	else {
		var y = parseInt(yelem.value, 10) + i;
		yelem.value = y;
		cyelem.value = y - document.yearDifferential;
	}
	if (document.currentPane == "calendar") {
		show_calendar_pane(document.preferredCalendar);
	}
	else if (document.currentPane == "yahrzeits") {
		show_yahrzeit_pane();
	}
	else {
		show_holiday_pane();
	}
}
function init_form() {
	var yelem = document.getElementById("y");
	var cyelem = document.getElementById("cy");
	var date = new HDate();
	yelem.value = date.hebrewYear;
	cyelem.value = date.civilYear;
	document.currentPane = "calendar";
	document.preferredCalendar = 1;
	document.yearDifferential = date.hebrewYear - date.civilYear;
	draw_ccalendar();
}
