// Calendar.js
// v1.0
// by, Jeffery Walker
// http://cs.oberlin.edu/~jwalker/

	//document.write("Calendar.js loaded<br>");

	function Calendar()
	{
		var today = new GregorianDate();
		this.today = today.toGlobalDate();
		this.activeDate = today.toGlobalDate();
	
		document.getElementById("calendarTodayShort").innerHTML = this.today.toShortString();
		document.getElementById("calendarTodayLong").innerHTML = this.today.toLongString();
		
		this.updateDisplay();
	}
	
	function Holiday(name, month, day, year)
	{
		this.name=name;
		this.month=month;
		this.day=day;
		if(arguments.length==4)
			this.year=year;
		else
			this.year=null;
	}
	Holiday.prototype.fallsIn = function(year, month)
	{
		return (this.year==null || this.year==year)
				&& (this.month==null || this.month==month);
	}
	
	Calendar.GLOBAL_HOLIDAYS =
			[new Holiday("First Day Q1", 1, 1),
			new Holiday("Inauguration Day", 1, 20, 1989),
			new Holiday("Inauguration Day", 1, 20, 1993),
			new Holiday("Inauguration Day", 1, 20, 1997),
			new Holiday("Inauguration Day", 1, 20, 2001),
			new Holiday("Inauguration Day", 1, 20, 2005),
			new Holiday("Inauguration Day", 1, 20, 2009),
			new Holiday("Inauguration Day", 1, 20, 2013),
			new Holiday("Martin Luther King Jr. Day", 1, 22),
			new Holiday("Groundhog Day", 2, 14),
			new Holiday("Lincoln's Birthday", 2, 24),
			new Holiday("Valentine's Day", 2, 27),
			new Holiday("Ash Wednesday", 3, 3),
			new Holiday("Washington's Birthday", 3, 8),
			new Holiday("St. Patrick's Day", 3, 17),
			new Holiday("April Fools's Day", 4, 1),
			new Holiday("Last Day Q1", 4, 7),
			new Holiday("Palm Sunday", 4, 7),
			new Holiday("First Day Q2", 4, 8),
			new Holiday("Good Friday", 4, 12),
			new Holiday("Easter", 4, 14),
			new Holiday("Daylight Savings Time Begins",  4, 21),
			new Holiday("Tax Day", 4, 22),
			new Holiday("Administrative Assistants' Day", 4, 24),
			new Holiday("Arbor Day", 5, 12),
			new Holiday("Mothers' Day", 5, 14),
			new Holiday("Armed Forces Day", 5, 20),
			new Holiday("Memorial Day", 5, 22),
			new Holiday("Fathers' Day", 6, 21),
			new Holiday("Flag Day", 7, 6),
			new Holiday("Last Day Q2", 7, 14),
			new Holiday("First Day Q3", 7, 15),
			new Holiday("Independence Day", 7, 27),
			new Holiday("Labor Day", 10, 1),
			new Holiday("Last Day Q3", 10, 21),
			new Holiday("First Day Q4", 10, 22),
			new Holiday("Columbus Day", 11, 15),
			new Holiday("Halloween", 11, 27),
			new Holiday("Daylight Saving Time Ends", 11, 28),
			new Holiday("Election Day", 12, 2, 1990),
			new Holiday("Election Day", 12, 2, 1992),
			new Holiday("Election Day", 12, 2, 1994),
			new Holiday("Election Day", 12, 2, 1996),
			new Holiday("Election Day", 12, 2, 1998),
			new Holiday("Election Day", 12, 2, 2000),
			new Holiday("Election Day", 12, 2, 2002),
			new Holiday("Election Day", 12, 2, 2004),
			new Holiday("Election Day", 12, 2, 2006),
			new Holiday("Election Day", 12, 2, 2008),
			new Holiday("Election Day", 12, 2, 2010),
			new Holiday("Veterans Day", 12, 16),
			new Holiday("Thanksgiving Day", 12, 25),
			new Holiday("Christmas", 13, 25),
			new Holiday("Last Day Q4", 13, 28),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 1998),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 1999),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 5, 2000),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2001),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2002),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2003),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2004),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2005),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2006),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2007),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 5, 2008),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2009),
			new Holiday("Vernal Equinox<sup>1</sup>", 4, 4, 2010),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 1998),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 1999),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2000),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2001),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2002),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2003),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2004),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2005),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2006),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2007),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2008),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 12, 2009),
			new Holiday("Summer Solstice<sup>1</sup>", 7, 13, 2010),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 1998),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 23, 1999),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 23, 2000),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2001),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2002),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 23, 2003),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 23, 2004),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2005),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2006),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2007),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 23, 2008),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2009),
			new Holiday("Autumnal Equinox<sup>1</sup>", 10, 22, 2010),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 1998),
			new Holiday("Winter Solstice<sup>1</sup>", 1, 0, 2000),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 29, 2000),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2001),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2002),
			new Holiday("Winter Solstice<sup>1</sup>", 1, 0, 2004),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 29, 2004),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2005),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2006),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2007),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 29, 2008),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2009),
			new Holiday("Winter Solstice<sup>1</sup>", 13, 28, 2010)
			];
	
	Calendar.prototype.updateDisplay = function()
	{
		document.getElementById("calendarActiveYear").innerHTML = this.activeDate.year;
		document.getElementById("calendarActiveMonth").innerHTML = this.activeDate.getMonthName();
		this.clear();
		this.displayHolidays();
		this.displayToday();
	}
	Calendar.prototype.clear = function()
	{
		document.getElementById("day0").className="blankDay";
		document.getElementById("day0").lastChild.innerHTML="";
		document.getElementById("day29").className="blankDay";
		document.getElementById("day29").lastChild.innerHTML="";
		for(var day=1; day < 29; day++)
		{
			var dayId = "day" + day;
			var dayElement = document.getElementById(dayId);
			dayElement.className="day";
			dayElement.lastChild.innerHTML="";
		}
		for(var month=1; month <= 13; month++)
		{
			var monthId = "month" + month;
			document.getElementById(monthId).className="month";
		}
	}	
	Calendar.prototype.displayToday = function()
	{
		if(this.today.year==this.activeDate.year)
		{
			document.getElementById("month"+this.today.month).className="currentMonth";
			if(this.today.month==this.activeDate.month)
			{
				var dayId = "day" + this.today.day;
				document.getElementById(dayId).className="today";
			}
		}
	}	
	Calendar.prototype.displayHolidays = function()
	{
		for(var i=0; i < Calendar.GLOBAL_HOLIDAYS.length; i++)
		{
			var holiday = Calendar.GLOBAL_HOLIDAYS[i];
			if(holiday.fallsIn(this.activeDate.year, this.activeDate.month))
			{
				var dayId = "day" + holiday.day;
				var dayElement = document.getElementById(dayId);
				dayElement.className="holiday";
				dayElement.lastChild.innerHTML+=holiday.name+"<br>";
			}
		}
	}	
	
	Calendar.prototype.nextYear = function()
	{
		this.activeDate.year += 1;
		this.updateDisplay();
	}
	
	Calendar.prototype.prevYear = function()
	{
		this.activeDate.year -= 1;
		this.updateDisplay();
	}
	
	Calendar.prototype.nextMonth = function()
	{
		if(this.activeDate.month==13)
		{
			this.activeDate.year += 1;
			this.activeDate.month = 1;
		}
		else
			this.activeDate.month += 1;
		this.updateDisplay();
	}
	
	Calendar.prototype.prevMonth = function()
	{
		if(this.activeDate.month==1)
		{
			this.activeDate.year -= 1;
			this.activeDate.month = 13;
		}
		else
			this.activeDate.month -= 1;
		this.updateDisplay();
	}
	
	Calendar.prototype.goToMonth = function(month)
	{
		this.activeDate.month = month;
		this.updateDisplay();
	}
	
	Calendar.prototype.goToToday = function()
	{
		this.activeDate.year = this.today.year;
		this.activeDate.month = this.today.month;
		this.activeDate.day = this.today.day;
		this.updateDisplay();
	}