//classes from stylesheet
var gActiveClass = "cell";
var gNonActiveClass = "notMonth";
//global events array (filled by xmlhttp)
var gEvents = new Array();

/****** Utility Functions ******/
//Returns number of days in the given month
Date.prototype.daysInMonth = DaysInMonth;
Date.prototype.monthName = MonthName;
function DaysInMonth() { return new Date(this.getFullYear(), this.getMonth()+1, 0).getDate(); }
function MonthName()
{
	var aName = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	return aName[this.getMonth()];
}
Array.prototype.clear = ArrClear;
function ArrClear() { this.length = 0; }


//Returns the Day that the month begins on (Sun=0, Mon=1, etc)
function monthBeginsOnDay(d)
{
	return new Date(d.getFullYear(), d.getMonth(), 1).getDay();
}

//Returns a string, class name, based on Calendar's properties
function toggleClass(s)
{
	return (s==gNonActiveClass) ? gActiveClass : gNonActiveClass;
}

//Accepts a date, creates correct day numbers in correct cells of calendar
function updateCalendar(d) 
{
	var yr = d.getFullYear();
	var mo = d.getMonth();
	var dt = d.getDate();
	var dInPrev = new Date(yr, mo-1, 1).daysInMonth();
	var dStart = monthBeginsOnDay(d);
	var cnt;
	var clsName = gNonActiveClass;
	var evt = "";

	updateEventArray(yr, mo+1); //xmlhttp
	
	//this month starts in cell 1
	if(dStart == 0)
	{
		cnt = 1;
		dInPrev = d.daysInMonth();
		clsName = toggleClass(clsName);
	}
	else
	{
		cnt = dInPrev - dStart + 1;
	}

	for(r=0; r<6; r++)
	{
		for(c=0; c<7; c++)
		{
			tempCell = document.getElementById("r"+r+"c"+c);
			tempCell.className = clsName;
			if(clsName==gActiveClass) /* cnt has already been incremented when function is called */
				tempCell.innerHTML = "<div class=\"cellDate\">" + cnt++ + "</div><span class=\"cellEvent\">" + getEvent(new Date(yr, mo, cnt-1)) + "</span>";
			else
				tempCell.innerHTML = "<div class=\"cellDate\">" + cnt++ + "</div><span class=\"cellEvent\"></span>";

			if(cnt > dInPrev)
			{
				cnt = 1;
				dInPrev = d.daysInMonth();
				clsName = toggleClass(clsName);
			}
		} 
	}

	//var frm = document.getElementById("calendarDate");
	var frm = document.forms[0];
	frm.monthInput.value = mo;
	frm.yearInput.value = yr;
	
	document.getElementById("cal_header").innerHTML =  d.monthName() + " " + yr;

}

function updateEventArray(yr, mo)
{
	var req;
	var response;
	var rowcount;

	//clear gEvents
	gEvents.clear();

	//xmlhttp object
	if( window.XMLHttpRequest )
		req = new XMLHttpRequest();
	else if( window.ActiveXObject )
		req = new ActiveXObject("Microsoft.XMLHTTP");
			
	req.open("GET", "static/scripts/xml_events.asp?year=" + yr + "&month=" + mo, false);
	req.send(null);

	response = req.responseXML.documentElement;
	
	try {
		rowcount = response.getElementsByTagName("rowcount")[0].firstChild.data;
	} catch (err) { return false; } //destroyed xml object
	
	if (rowcount == 0) return false;
	
	for(i=0; i<rowcount; i++)
	{
		bigEvent = response.getElementsByTagName("event")[i];
		eYear = bigEvent.getElementsByTagName("year")[0].firstChild.data;
		eMonth = bigEvent.getElementsByTagName("month")[0].firstChild.data;
		eDate = bigEvent.getElementsByTagName("date")[0].firstChild.data;
		eSDesc = bigEvent.getElementsByTagName("shortdesc")[0].firstChild.data;
		
		gEvents.push(new Event( parseInt(eYear), parseInt(eMonth), parseInt(eDate), eSDesc ));
	}
	
}

//Returns a string that is the event description occurring on argument date.
function getEvent(d)
{
	for(i=0; i<gEvents.length; i++)
	{
		if(d.getFullYear() == gEvents[i].eventDate.getFullYear() &&
		   d.getMonth()    == gEvents[i].eventDate.getMonth()    &&
		   d.getDate()     == gEvents[i].eventDate.getDate()       )
		{
			return gEvents[i].eventDescription;
		}
	}
	return "";
}

function Event(y,m,d,desc)
{
	this.eventDate = new Date(y,m-1,d);
	this.eventDescription = desc;
}

//Gets the date off of the form at the heading of the calendar
function readDate() 
{
	//var frm = document.getElementById("calendarDate");
	var frm = document.forms[0];
	var monthIndex = frm.monthInput.value;
	var year = parseInt(frm.yearInput.value);

	//clean year
	switch(true)
	{
	case year < 10:	year = "200" + year; break;
	case year < 50: year = "20" + year; break;
	case year < 100: year = "19" + year; break;
	case year < 1000: year = "2" + year; break;
	}
	year = (year < 3000 && year > 1000) ? year : new Date().getFullYear();
	return new Date(year, monthIndex, 1);
}

//creates the HTML for the calendar
//this function uses .write(), so it must not be called except when first rendering the page
//create the calendar with "drawCalendar(); updateCalendar(new Date());"
function drawCalendar() 
{
	//header
	var hdrHTML = '<div id="calendarContainer">'
	+ '<table id="myCalendar"><thead><tr>'
	+ '<th colspan="7">'
	//+ '<form name="calendarDate" id="calendarDate" onsubmit="updateCalendar(readDate()); return false;">'
	+ '<select name="monthInput" id="monthInput" onchange="updateCalendar(readDate()); return false;">'
	+ '<option value="0">January</option><option value="1">February</option><option value="2">March</option><option value="3">April</option><option value="4">May</option><option value="5">June</option>'
	+ '<option value="6">July</option><option value="7">August</option><option value="8">Sepember</option><option value="9">October</option><option value="10">November</option><option value="11">December</option>'
	+ '</select>'
	+ '<input type="text" size="3" id="yearInput" maxlength="4" value="2005" />'
	+ '<button onclick="updateCalendar(readDate()); return false;">Go</button><h2 id="cal_header"></h2>'
	//+ '</form>
	+ '</th></tr>'
	+ '<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>R</th><th>F</th><th>S</th></tr></thead>';

	var midHTML = '<tbody>';
	for(row=0; row<6; row++)
	{
		midHTML += "\n<tr>";
		for(column=0; column<7; column++)
			midHTML += "\n<td class=\"" + gActiveClass + "\" id=\"r" + row + "c" + column + "\"></td>";
		midHTML += "\n\t\t\t</tr>";
	}
	midHTML += '</tbody>';

	var ftrHTML = '</table></div>';
	document.write(hdrHTML + midHTML + ftrHTML);
}
