// JavaScript Holiday Functions
//
// Author:  Rick Pike
// Website: http://calendar.pikesys.com
// Email: calendar@pikesys.com
//
// adapted to work with calendar from code by Martin Webb (http://www.irt.org)
// 
// additional functions to calculate Easter and other Christian holidays dates are available at www.irt.org
// additional functions to calculate Easter and Jewish holidays are available at www.kaluach.net
//
// A reference (and on-line calculator) for American holidays is at http://www.smart.net/~mmontes/ushols.html by Marcos J. Montes
//
// YOU SHOULD CONFIRM THAT THE CALCULATED DATES ARE CORRECT
//
// Permission is granted to use my adaptations in this script as long as the above information is included
//
// Instructions:
//	To get a list of American holidays whose dates vary for a given year, call "calcHolidays(year)" in your JavaScript
//           To get an appropriate text string for a given date, call "holidays(day, month, year)" in your JavaScript

showAltHoly = true;
//AltHolyFormat = "<font  size=2 color=#ff0000><b><center>|</center></b></font>";
function getAltHoly(day, month, year) { return my_alt_holiday(day, month, year); }

var weekday = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
var dow = "";
var wom = 0;
var leapyear = false; 
var quote = String.fromCharCode (34)

function jDate (day, month, year) {
	var d = new Date ();
	d.setFullYear (year);
	d.setMonth (month - 1);
	d.setDate (day);
	dow = weekday [d.getDay()];
	wom = Math.floor ((day - 1) / 7) + 1;
	leapYear = (year % 4) == 0;
	return d;}

function DayOfWeek(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 makeArray()    {
    this[0] = makeArray.arguments.length;
    for (i = 0; i<makeArray.arguments.length; i++)
        this[i+1] = makeArray.arguments[i];
}

var daysofmonth   = new makeArray( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var daysofmonthLY = new makeArray( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function LeapYear(year) {
    if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;
    return true;
}

function NthDay(nth,weekday,month,year) {
    if (nth > 0) return (nth-1)*7 + 1 + (7 + weekday - DayOfWeek((nth-1)*7 + 1,month,year))%7;
    if (LeapYear(year)) var days = daysofmonthLY[month];
    else                var days = daysofmonth[month];
    return days - (DayOfWeek(days,month,year) - weekday + 7)%7;
}

var sun=1,mon=2,tue=3,wed=4,thu=5,fri=6,sat=7;
var jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12;
var first=1,second=2,third=3,fourth=4,fifth=5,last=-1;

var daysofweek   = new makeArray('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var monthsofyear = new makeArray('January','February','March','April','May','June','July','August','September','October','November','December');

function DayOfWeek(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 Nths(day) { 
    if (day == 1 || day == 21 || day == 31) return 'st';
    if (day == 2 || day == 22) return 'nd';
    if (day == 3 || day == 23) return 'rd';
    return 'th';
}

function FullDate(day,month,year) {
    return daysofweek[DayOfWeek(day,month,year)] +' '+ day + Nths(day) +' '+ monthsofyear[month] +' '+ year;
}

function HolyDay (year, offset) {
	var e = new easter (year);
	e.setTime (e.getTime () + (offset * 86400000));
	return e;}

function easter (year) {
	var d = new Date ();
	d.setFullYear (year);

	/* the Golden number */
    	var golden = (year % 19) + 1;

	/* GREGORIAN CALENDAR */
	/* the "Dominical number" - finding a Sunday */
	var dom = (year + Math.floor(year/4) - Math.floor(year/100) + (Math.floor(year/400))) % 7;
	if (dom < 0) {dom += 7;}

	/* the solar and lunar corrections */
	var solar = Math.floor((year-1600)/100) - Math.floor((year-1600)/400);
	var lunar = (Math.floor((year-1400) / 100) * 8) / 25;

	/* uncorrected date of the Paschal full moon */
	var pfm = (3 - (11*golden) + solar - lunar) % 30;
	if (pfm < 0) {pfm += 30;}

	/* corrected date of the Paschal full moon - days after 21st March */
    	if ((pfm == 29) || (pfm == 28 && golden > 11)) {pfm--;}

	var tmp = (4-pfm-dom) % 7;
	if (tmp < 0) {tmp += 7;}

	/* Easter as the number of days after 21st March */
    	var easter = pfm + tmp + 1;

	if (easter < 11) {d.setMonth (2); d.setDate (easter + 21);}
	else {d.setMonth (3); d.setDate (easter - 10);}
	return d;}

function calcHolidays(year) {
	document.write("Martin Luther King Day - " + FullDate(NthDay(third,mon,jan,year),jan,year) + '<BR>');
	document.write("President's Day - " + FullDate(NthDay(third,mon,feb,year),feb,year) + '<BR>');
	document.write("Daylight Savings time begins - " + FullDate(NthDay(second,sun,mar,year),mar,year) + '<BR>');
	document.write("Armed Forces Day - " + FullDate(NthDay(third,sat,may,year),may,year) + '<BR>');
	document.write("Mother's Day - " + FullDate(NthDay(second,sun,may,year),may,year) + '<BR>');
	document.write("Memorial Day - " + FullDate(NthDay(last,mon,may,year),may,year) + '<BR>');
	document.write("Father's Day - " + FullDate(NthDay(third,sun,jun,year),jun,year) + '<BR>');
	document.write("Labor Day - " + FullDate(NthDay(first,mon,sep,year),sep,year) + '<BR>');
	document.write("Columbus Day - " + FullDate(NthDay(second,mon,oct,year),oct,year) + '<BR>');
	document.write("Daylight Savings Time ends - " + FullDate(NthDay(first,sun,nov,year),nov,year) + '<BR>');
	document.write("Thanksgiving Day - " + FullDate(NthDay(fourth,thu,nov,year),nov,year) + '<BR>');
}

function holidays(cday, cmonth, cyear) {
	// American civil holidays and some major religious holiday
	if (cmonth == 1 && cday == 1)
		return "<span style='color: red'>New Year's Day</span>";
	else if (cmonth == 1 && cday == NthDay(third, mon, cmonth, cyear))
		return "MLK Day";
	else if (cmonth == 2 && cday == 2)
		return "Groundhog 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 == NthDay(third, mon, cmonth, cyear))
		return "<span style='color: red'>President's Day</span>";
	else if (cmonth == 2 && cday == 22)
		return "Washington's Birthday";
//	else if (cmonth == 3 && cday == 17)
//		return "St. Patrick's Day";
	else if (cmonth == 3 && cday == NthDay(second, sun, cmonth, cyear))
		return "<span style='color: red'>Daylight Savings time begins</span>";
//**************************************************** 	added 2/21/2010	
  else if (cmonth == 3 && dow == "Fri" && cday > 19) {
			var a = HolyDay (cyear, -2);
			if (a.getMonth() == 2 && a.getDate() == cday) return "<span style='color: red'>Good Friday</span>";}
	else if (cmonth == 3 && dow == "Sun" && cday > 21) {
			var e = easter (cyear);
			if (e.getMonth() == 2 && e.getDate() == cday) return "<span style='color: red'>Easter</span>";}
//****************************************************		
//	else if (cmonth == 4 && cday == 1)
//		return "April Fool's Day";
//*************************************************	added 2/21/2010	
  else if (cmonth == 4 && dow == "Fri" && cday < 25) {
    var a = HolyDay (cyear, -2);
    if (a.getMonth() == 3 && a.getDate() == cday) return "<span style='color: red'>Good Friday</span>";}     //holText = "<span style='color: red'>Good Friday</span>";}    
 else if (cmonth == 4 && dow == "Sun" && cday < 27) {
  	var e = easter (cyear);
	  if (e.getMonth() == 3 && e.getDate() == cday) return "<span style='color: red'>Easter</span>";}    //holText = "<span style='color: red'>Easter</span>";}  
//*************************************************  		
//	else if (cmonth == 4 && cday == 22)
//		return "Earth Day";
	else if (cmonth == 4 && cday == NthDay(last, fri, cmonth, cyear))
		return "<a href=http://www.arborday.org/arborday/arbordaydates.cfm>Arbor Day</a>";
	else if (cmonth == 5 && cday == NthDay(second, sun, cmonth, cyear))
		return "Mother's Day";
	else if (cmonth == 5 && cday == NthDay(third, sat, cmonth, cyear))
		return "Armed Forces Day";
	else if (cmonth == 5 && cday == NthDay(last, mon, cmonth, cyear))
		return "<span style='color: red'>Memorial Day</span>";
	else if (cmonth == 6 && cday == 14)
		return "<img src=oldglory.gif><br>Flag Day";
	else if (cmonth == 6 && cday == NthDay(third, sun, cmonth, cyear))
		return "Father's Day";
	else if (cmonth == 7 && cday == 4)
		return "<img src=oldglory.gif><br><span style='color: red'>Independence Day</span>";
	else if (cmonth == 7 && cday == NthDay(fourth, sun, cmonth, cyear))
		return "Parents' Day";
	else if (cmonth == 9 && cday == NthDay(first, mon, cmonth, cyear))
		return "<span style='color: red'>Labor Day</span>";
	else if (cmonth == 9 && DayOfWeek(cday, cmonth, cyear) == 1 && cday > NthDay(first, mon, cmonth, cyear) && cday <= NthDay(first, mon, cmonth, cyear)+7)
		return "Grandparents' Day"; 		// Sunday after Labor Day
	else if (cmonth == 10 && cday == NthDay(second, mon, cmonth, cyear))
		return "Columbus Day";
	else if (cmonth == 10 && cday == 24)
		return "United Nations Day";
	else if (cmonth == 10 && cday == 31)
		return "Halloween";
	else if (cmonth == 11 && cday == NthDay(first, sun, cmonth, cyear))
		return "<span style='color: red'>Daylight Savings time ends</span>";
	else if (cmonth == 11 && cday == 11)
		return "<span style='color: red'>Veterans' Day</span>";
	else if (cmonth == 11 && cday == NthDay(fourth, thu, cmonth, cyear))
		return "<span style='color: red'>Thanksgiving</span>";
	else if (cmonth == 12 && cday == 25)
		return "<span style='color: red'>Christmas</span>";

	return "";
}

function my_alt_holiday(day, month, year) {
	var thisDate = jDate (day, month, year);
	var holText = "";

	switch (month) {
	case 1:  // January
		break;
	case 2:  // February
		break;
	case 3:  // March
	  if (day == 17) holText = "<font color=#999999>St. Patrick's Day</font>";
//		if (dow == "Fri" && day > 19) {
//			var a = HolyDay (year, -2);
//			if (a.getMonth() == 2 && a.getDate() == day) holText = "<span style='color: red'>Good Friday</span>";}
//		if (dow == "Sun" && day > 21) {
//			var e = easter (year);
//			if (e.getMonth() == 2 && e.getDate() == day) holText = "<span style='color: red'>Easter</span>";}
		break;
	case 4:  // April
	   if (day == 1) holText = "<font color=#999999>April Fool's Day</font>";  //"April Fool's Day";
	   if (day == 22) holText = "<font color=#999999>Earth Day</font>";
	//	if (dow == "Sun" && wom == 1 && year < 2007) holText = "Daylight Saving Time Begins";
//    if (dow == "Fri" && day < 25) {
//			var a = HolyDay (year, -2);
//			if (a.getMonth() == 3 && a.getDate() == day) holText = "<span style='color: red'>Good Friday</span>";}
//		if (dow == "Sun" && day < 27) {
//			var e = easter (year);
//			if (e.getMonth() == 3 && e.getDate() == day) holText = "<span style='color: red'>Easter</span>";}
		break;
	case 5:  // May
		break;
	case 6:  // June
		break;
	case 7:  // July
	//	if (year == 2005) {
	//		if (dow == "Sat" && day > 23) {holText = "Family Camp";}
	//		else {	if (dow == "Sun") {if (day > 24) holText = "Family Camp";}
	//			else {if (day - thisDate.getDay() > 23) holText = "Family Camp";}}}
	//	else {	if (dow == "Sat" && day > 22) {holText = "Family Camp";}
	//		else {if (day - thisDate.getDay() > 23) holText = "Family Camp";}}
		break;
	case 8:  //August
	//	if (thisDate.getDay() > day) holText = "Family Camp";
	//	if (dow == "Sun" && day < 7) holText = "Family Camp";
		break;
	case 9:  // September
		break;
	case 10: // October
	//	if (dow == "Sun" && day > 24 && year < 2007) holText = "Daylight Saving Time Ends";
		break;
	case 11: // November
	//	if (dow == "Sun" && wom == 1 && year > 2006) holText = "Daylight Saving Time Ends";
		break;
	case 12: // December
		break;
	}

	return holText;
}