﻿
//Copyright (C) 5760,5761 (2000 CE), by Abu Mami and Yisrael Hersch. All Rights Reserved.
// jw wrote these:
function writeDate() {
   var dt = new Date();
///var dt = new Date('9/8/2010');
   var d = dt.getDate();
   var m = dt.getMonth();
   var y = dt.getFullYear();
   var hdate = civ2heb(d,m+1,y);
   var hd = eval(hdate.substring(0, hdate.indexOf(' ')));
   var h1 = hdate.indexOf(" ");
   var h2 = hdate.lastIndexOf(" ");
   var hm = eval(hdate.substring(h1, h2));
   var hy = hdate.slice(h2+1);
   var dow = DOW(d,m+1,y);
   var holiday = getHoliday(d,m,y);
   var moed = moadim(d, m, y, hd, hm, dow);
   if ((hd == 1 && hm != 6) || hd == 30) { 
	if (hd == 1) {moed = hebMonth[hm] } else { moed = hebMonth[hm+1] }
	moed = "Rosh Chodesh " + moed;
   }
   var txt = weekDay[dow-1] + ", " + civMonth[m] + " " + d + ", " + y;
   if (holiday.length > 0) {txt += "<BR>" + holiday};
   txt += "<BR>"
   txt += hd + " " + hebMonth[hm] + " " + hy
   if (moed.length > 0) {txt += "<BR>" + moed};
   return txt;
}
function writeDate2() {
   var dt = new Date();
   var d = dt.getDate();
   var m = dt.getMonth();
   var y = dt.getFullYear();
   var hdate = civ2heb(d,m+1,y);
   var hd = eval(hdate.substring(0, hdate.indexOf(' ')));
   var h1 = hdate.indexOf(" ");
   var h2 = hdate.lastIndexOf(" ");
   var hm = eval(hdate.substring(h1, h2));
   var hy = hdate.slice(h2+1);
   var dow = DOW(d,m+1,y);
   var holiday = getHoliday(d,m,y);
   var moed = moadim(d, m, y, hd, hm, dow);
   if ((hd == 1 && hm != 6) || hd == 30) { 
	if (hd == 1) {moed = hebMonth[hm] } else { moed = hebMonth[hm+1] }
	moed = "Rosh Chodesh " + moed;
   }
   var txt = weekDay[dow-1] + ", " + civMonth[m] + " " + d + ", " + y;
   if (holiday.length > 0) {txt += " / " + holiday};
   txt += " / "
   txt += hd + " " + hebMonth[hm] + " " + hy
   if (moed.length > 0) {txt += " / " + moed};
   return txt;
}
function writeMonth() {
   var dt = new Date();
//////var dt = new Date('9/22/2010');
   var d = dt.getDate();
   var m = dt.getMonth();
   var y = dt.getFullYear();
   var hdate = civ2heb(1,m+1,y);
   var hd = eval(hdate.substring(0, hdate.indexOf(' ')));
   var hm = eval(hdate.substring(hdate.indexOf(' '), hdate.lastIndexOf(' ')));
   var hy = hdate.slice(hdate.lastIndexOf(' ') + 1);
   var monthLength = civMonthLength(m+1, y);
   var hdate2 = civ2heb(monthLength,m+1,y);
   var hm2 = eval(hdate2.substring(hdate2.indexOf(' '), hdate2.lastIndexOf(' ')));
   var hy2 = hdate2.slice(hdate2.lastIndexOf(' ') + 1);
   var txt = civMonth[m] + " " + y + " / ";
   txt += hebMonth[hm];
   if (hm2 != hm && hy2 != hy) { txt += " " + hy };
   if (hm2 != hm) { txt += "-" + hebMonth[hm2]  };
   txt += " " + hy2;
   return txt;
}



function makeArray() {
	this[0] = makeArray.arguments.length;
	for (i = 0; i < makeArray.arguments.length; i = i + 1)
		this[i+1] = makeArray.arguments[i];
}

var hebMonth = new Array('Nisan', 'Iyar', 'Sivan', 'Tamuz', 'Av', 'Elul',
	'Tishrei', 'Cheshvan', 'Kislev', 'Teves', 'Shevat',
	'Adar', 'Adar I', 'Adar II')
var civMonth = new Array('January', 'February', 'March', 'April', 'May', 'June',
	'July', 'August', 'September', 'October', 'November', 'December');
var weekDay = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');

var hebMonthHANSI = new makeArray('ïñéð', 'øééà', 'ïåéñ', 'æåîú', 'áà', 'ìåìà', 'éøùú', ' ïåùç ', 'åìñë', 'úáè', 'èáù','øãà', 'à øãà', 'á øãà');

function Gauss(year) {
	var a,b,c;
	var m;
	var Mar;	// day in March on which Pesach falls

	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 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 civ2heb(day, month, year) {
	var d = day;
	var m = month;
	var y = year;
	var hy;
	var pesach;
	var anchor;
	var adarType;

	m -= 2;
	if (m <= 0) { // Jan or Feb
		m += 12;
		y -= 1;
	}
	d += Math.floor(7 * m / 12 + 30 * (m - 1)); // day in March
	hy = y + 3760;		// get Hebrew year
	pesach = Gauss(hy);
	if (d <= pesach - 15) { 	// before 1 Nisan
		anchor = pesach;
		d += 365;
		if(leap(y))
			d++;
			y -= 1;
			hy -= 1;
			pesach = Gauss(hy);
	}
	else
		anchor = Gauss(hy + 1);

		d -= pesach - 15;
		anchor -= pesach - 12;
		y++;

		if(leap(y))
			anchor++;

	for(m = 0; m < 11; m++) {
		var days;
		if(m == 7 && anchor % 30 == 2)
			days = 30; // Cheshvan
		else if(m == 8 && anchor % 30 == 0)
			days = 29; // Kislev
		else
			days = 30 - m % 2;
		if(d <= days)
			break;
		d -= days;
	}
	adarType = 0;			// plain Adar
	if (m == 11 && anchor >= 30) {
		if (d > 30) {
			adarType = 2;	// Adar 2
			d -= 30;
		}
		else
			adarType = 1;	// Adar 1
	}

	if(m >= 6)			// Tishrei or after?
		hy++;		// then bump up year

	if(m == 11)		// Adar?
		m += adarType;	// adjust for Adars

	return (d + ' ' + m + ' ' + hy);
}
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 moadim(cday, cmonth, cyear, hday, hmonth, dow) {
	if(hmonth == 6) {
		if(hday == 1 || hday == 2)
			return "Rosh Hashanah";
		else if(hday == 3 && dow != 7)
			return "Tzom Gedalia";
		else if(hday == 4 && dow == 1)
			return "Tzom Gedalia";
		else if(hday == 10)
			return "Yom Kippur";
		else if(hday == 14)
			return "Erev Sukkos";
		else if(hday == 15)
			return "Sukkos 1";
		else if(hday == 16)
			return "Sukkos 2";
		else if(hday == 17)
			return "Chol Hamoed Sukkos 1";
		else if(hday == 18)
			return "Chol Hamoed Sukkos 2";
		else if(hday == 19)
			return "Chol Hamoed Sukkos 3";
		else if(hday == 20)
			return "Chol Hamoed Sukkos 4";
		else if(hday == 21)
			return "Hoshana Raba";
		else if(hday == 22)
			return "Shemini Atzeres"
		else if(hday == 23)
			return "Simchas Torah";
	}
	else if(hmonth == 8) {
		if(hday >= 25)
			return "Chanuka " + (hday-24)
	}
	else if(hmonth == 9) {
		////if Kislev is maleh or chaser.
		if(hday <= 3) {
			cday = cday - hday + 1;
			if (cday <= 0) {
				cday += 30; cmonth = 11;
			}
			var hdate = civ2heb(cday, cmonth, cyear);
			hd = eval(hdate.substring(0, hdate.indexOf(' ')));
			if(hd == 29) { var addOne = 1 } else { var addOne = 0 }
			var chanuka = eval(6 + eval(hday) + addOne);
			if (chanuka <= 8) { return "Chanukah " + " " + chanuka }
		}
		else if(hday == 10)
			return "Asara B\'teves"
	}
	else if(hmonth == 10) {
		if(hday==15)
			return "Tu B\'Shvat"
	}
	else if(hmonth == 11 || hmonth == 13) {
		if(hday == 11 && dow == 5)
			return "Taanis Esther"
		else if(hday == 13 && dow != 7)
			return "Taanis Esther"
		else if(hday == 14)
			return "Purim"
		else if(hday == 15)
			return "Shushan Purim"
	}
	else if(hmonth == 0) {
		if(hday == 14)
			return "Erev Pesach"
		else if(hday >= 15 && hday <= 22)
			return "Pesach " + (hday-14)
	}
	else if(hmonth == 1) {
		if(hday == 3 && dow == 5)
			return "Yom Haatzmaut"
		else if(hday == 4 && dow == 5)
			return "Yom Haatzmaut"
		else if(hday == 5 && dow != 6 && dow != 7)
			return "Yom Haatzmaut"
		if(hday == 14)
			return "Pesach Sheni"
		else if(hday == 18)
			return "Lag B\'Omer"
		if(hday == 28)
			return "Yom Yerushalayim"
	}
	else if(hmonth == 2) {
		if(hday == 5)
			return "Erev Shevuos"
		else if(hday == 6)
			return "Shevuos"
		else if(hday == 7)
			return "Shevuos"
	}
	else if(hmonth == 3) {
		if(hday == 17 && dow != 7)
			return "Shiva Asar B\'Tamuz"
		if(hday == 18 && dow == 1)
			return "Shiva Asar B\'Tamuz"
	}
	else if(hmonth == 4) {
		if(hday == 9 && dow != 7)
			return "Tisha B\'Av"
		if(hday == 10 && dow == 1)
			return "Tisha B\'Av"
		if(hday == 15)
			return "Tu B\'Av"
	}
	else if(hmonth == 5) {
		if(hday == 29)
			return "Erev Rosh Hashanah"
	}
	return "";
}

function getHoliday(dayNumber,month,year) {
if (month == 0) {
	if (dayNumber == 1) {
		return 'New Year\'s Day'
	} 
	var n3 = new Date("January 1, " + year)
	var n4 = 2
	var n6 = n3.getDay() + 1
	n6 = 7 - n6
	var n8 = (14 + n4) + n6 + 1
	if (n4 + n6 >= 7) {
		n8 = n8 - 7
	}
	if (n8 == dayNumber) {
		return 'M. L. King, Jr. Day'
	} 
}
	if (month == 1) {
	// Calculate President's Day
	var n3 = new Date("February 1, " + year)
	var n4 = 2
	var n6 = n3.getDay() + 1
	n6 = 7 - n6
	var n8 = (14 + n4) + n6 + 1
	if (n4 + n6 >= 7) {
		n8 = n8 - 7
	}
	if (n8 == dayNumber) {
		return 'President\'s Day'
	} 
}
if (month == 2 || month == 3) {
//Thanks to Marcos Montes for posting the Carter algorithm
	var b = 225 - 11 * (year % 19)
	var d = ((b-21) % 30) + 21
	if (d > 48) {
		d = d - 1
	}
	var e = Math.floor((year + (year/4) + d + 1) % 7)
	var q = d + 7 - e
	if (q > 31) {
		q = q - 31
		var m = 3
	} else {
		var m = 2
	}
	if (m == month && q == dayNumber) {
		return 'Easter'
	}
}
if (month == 4) {
	var mWeek = new Date("May 31, " + year)
		var lDay = mWeek.getDay()
		if (lDay == 0) {
			lDay = 6
		} else {
			lDay = lDay - 1
		}
		var mDay = 31 - lDay
		if (mDay == dayNumber) {
			return 'Memorial Day'
		}
}
if (month == 6) {
	if (dayNumber == 4) {
		return 'Independence Day'
	}
}
if (month == 8) {
	var n3 = new Date("September 1, " + year)
	var n4 = 2
	var n6 = n3.getDay() + 1
	n6 = 7 - n6
	var n8 = n4 + n6 + 1
	if (n4 + n6 >= 7) {
		n8 = n8 - 7
	}
	if (n8 == dayNumber) {
		return 'Labor Day'
	}
}
if (month == 9) {
	var n3 = new Date("October 1, " + year)
	var n4 = 2
	var n6 = n3.getDay() + 1
	n6 = 7 - n6
	var n8 = (7 + n4) + n6 + 1
	if (n4 + n6 >= 7) {
		n8 = n8 - 7
	}
	if (n8 == dayNumber) {
		return 'Columbus Day'
	}
}
if (month == 10) {
	if (dayNumber == 11) {
		return 'Veteran\'s Day'
	}
	var n3 = new Date("November 1, " + year)
	var n4 = 5
	var n6 = n3.getDay() + 1
	n6 = 7 - n6
	var n8 = (21 + n4) + n6 + 1
	if (n4 + n6 >= 7) {
		n8 = n8 - 7
	}
	if (n8 == dayNumber) {
		return 'Thanksgiving Day'
	}
}
if (month == 11) {
	if (dayNumber == 25) {
		return 'Christmas'
	}
}	
	return ""
}

