AddFunctionToOnLoad(init);

/*	
	Set global calendar varibles
*/
var selected_month;
var selected_year;
//var current_date = new Date();
//var current_month = current_date.getMonth();
var days_in_month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var month_label = new Array('JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER');

//var current_year = current_date.getYear();
if (current_year < 1000) current_year+=1900;

var today = current_date;
var calendarDates_id;
var monthYear_id;
var back_id;
var advance_id;


function init() {
	selected_month = current_month;
	selected_year = current_year;
	calendarDates_id = document.getElementById("calendarDates");
	monthYear_id = document.getElementById("monthYear");
	
	var removeRow = document.getElementById("defaultRow");
	calendarDates_id.removeChild(removeRow);
	
	LoadXMLDoc();
	
	back_id = document.getElementById("back");
	back_id.onclick = new Function("Skip('-');");
	advance_id = document.getElementById("advance");
	advance_id.onclick = new Function("Skip('+');");
}
/*	EVENT CALENDAR FLYOUT

*/
// Simple follow the mouse script
var flyout = 'flyout';	// div that is to follow the mouse
var offX = -120;		// X offset from mouse position
var offY = 15;			// Y offset from mouse position

function mouseX(evt) {if (!evt) evt = window.event; if (evt.pageX) return evt.pageX; else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft); else return 0;}
function mouseY(evt) {if (!evt) evt = window.event; if (evt.pageY) return evt.pageY; else if (evt.clientY)return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); else return 0;}

function follow(evt) {
	if (document.getElementById) {
		var obj = document.getElementById(flyout).style;
		obj.display = 'block';
		obj.left = (parseInt(mouseX(evt))+offX) + 'px';
		obj.top = (parseInt(mouseY(evt))+offY) + 'px';
	}
}

function HideFlyout() {
	var obj = document.getElementById(flyout).style;
	obj.display = 'none';
}


function LoadXMLDoc() {
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        xml = new XMLHttpRequest();
        xml.onreadystatechange = ProcessXML;
        xml.open("GET", "monthlyevents.cfm?menuID=8&year="+selected_year+"&monthID="+convertNumberToString(selected_month)+"&categoryID", true);
        xml.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        isIE = true;
        xml = new ActiveXObject("Microsoft.XMLHTTP");
        if (xml) {
            xml.onreadystatechange = ProcessXML;
            xml.open("GET", "monthlyevents.cfm?menuID=8&year="+selected_year+"&monthID="+convertNumberToString(selected_month)+"&categoryID", true);
            xml.send();
        }
    }
}

// handle onreadystatechange event of req object
function ProcessXML() {
    // only if req shows "loaded"
    if (xml.readyState == 4) {
        // only if "OK"
        if (xml.status == 200) {
			BuildCalendar(selected_month, selected_year);
            EventCalendarFlyout();
         } else {
            alert("There was a problem retrieving the XML data:\n" +xml.statusText);
         }
    }
}


function ParseXmlIntoFlyout(id) {
	var fo = document.getElementById("flyout");
	var fo_dl = document.createElement("dl");
	var fo_dt = document.createElement("dt");
	var fo_dd = document.createElement("dd");
	var evts = xml.responseXML.getElementsByTagName("event");
	
	if (fo.firstChild != null) {
		fo.removeChild(fo.firstChild);
	}
	
	for (i=0; i<evts.length; i++) {
		if (evts[i].nodeType != 1) continue;
		
		if (evts[i].getAttribute('id') == id) {
			var evtTitle = evts[i].getElementsByTagName("title");
			fo_dt.className = evtTitle[0].getAttribute("class");
			evtTitle = document.createTextNode(evtTitle[0].firstChild.nodeValue);
			fo_dt.appendChild(evtTitle);
			fo_dl.appendChild(fo_dt);
			
			var evtDesc = evts[i].getElementsByTagName("description");
			evtDesc = document.createTextNode(evtDesc[0].firstChild.nodeValue);
			fo_dd.appendChild(evtDesc);
			fo_dl.appendChild(fo_dd);
		}
	}
	
	fo.appendChild(fo_dl);
}

function EventCalendarFlyout() {
	var z = document.getElementById("eventsCalendar");
	if (z!=null) {
		var x = z.getElementsByTagName("li");
		var matchClassName = "event";
		for (var i=0;i<x.length;i++){
			var str = x[i].className;
			if (str.search(matchClassName) != -1) {
				x[i].onmousemove = follow;
				x[i].onmouseover = new Function("ParseXmlIntoFlyout(this.id);");
				x[i].onmouseout = new Function("HideFlyout();");
			}
		}
	}
}

function MonthAndYear(year, month) { //Return formatted display for <thead> month and year
	if (month == 1) {
		days_in_month[1] = ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 !=0))) ? 29 : 28;
	}
	return month_label[month] + ' ' + year;
}

function removeLeadingZero(num) {
	if (num.charAt(0) == "0") {
		num = num.substr(1,1);	
	}
	return parseInt(num);
}

function BuildCalendar(month, year) { //Calendar
	var First_Date = new Date(year, month, 1);
	var First_Day = First_Date.getDay() + 1;
	var Day_Counter = 1;
	var Loop_Counter = 1;
	var monthYearValue = document.createTextNode(MonthAndYear(year, month));
	
	monthYear_id.appendChild(monthYearValue);
	
	var Calendar_Date = new Object();
	
	for (var a=1; a<days_in_month[month]+1; a++) {
		Calendar_Date["date"+a] = new Object();
		Calendar_Date["date"+a].events = new Array();
	}
	
	var evts = xml.responseXML.getElementsByTagName("event");
	for (var e=0; e<evts.length; e++) {
		/*	
			Find event start date.
		*/
		
		var startDate		= evts[e].getElementsByTagName("eventDateStart");
		var startDateArray	= String(startDate[0].firstChild.nodeValue).split('/');
		var startMonth		= removeLeadingZero(startDateArray[0]);
		var startYear		= parseInt(startDateArray[2]);
		startDate			= removeLeadingZero(startDateArray[1]);
		
		
		
		/*	
			Determine if the event lasts for more than one day. If not, than assign the endDate the
			same value as startDate.
			
			Also, if event lasts several months, and the current month does not contain the endDate,
			then event should appear on every day for current month. If month contains the endDate
			for the event, then event appears only through endDate. This also applies to the event's
			month and year.
		*/
			
		var endDate			= evts[e].getElementsByTagName("eventDateEnd");
		var endDateArray	= String(endDate[0].firstChild.nodeValue).split('/');
		if (endDate[0].firstChild != null) {
			var endMonth	= removeLeadingZero(endDateArray[0]);
			var endYear		= parseInt(endDateArray[2]);
			endDate			= removeLeadingZero(endDateArray[1]);
		} else {
			endDate			= startDate;
		}
		
		//alert(selected_year+"/"+endYear);
		//alert((selected_month+1)+"/"+endMonth);
		
		if (endYear > selected_year) {
			endDate			= days_in_month[month];
			
			//alert("endDate: "+days_in_month[month]);
		}
		
		if (endMonth > (selected_month+1)) {
			endDate			= days_in_month[month];
		}
		
		/*	
			Pull title and descriptions from event node and append them to the correct date(s) event_array.
		*/
		
		var id = evts[e].getAttribute("id");
		
		var class_list = evts[e].getElementsByTagName("title");
		var class_name = class_list[0].getAttribute("class");
		
		var title_list = evts[e].getElementsByTagName("title");
		var title = title_list[0].firstChild.nodeValue;
		
		var description_list = evts[e].getElementsByTagName("description");
		var description = description_list[0].firstChild.nodeValue;
		
		for (var f=startDate; f<endDate+1; f++) {
			Calendar_Date["date"+f].events.push([id,class_name,title,description]);
		}
	}
	
	
	//Determine the number of rows in Calendar <tbody />
	if (((days_in_month[month] == 31) && (First_Day >= 6)) || ((days_in_month[month] == 30) && (First_Day == 7))) {
		var Rows = 6;
	} else if ((days_in_month[month] == 28) && (First_Day == 1)) {
		var Rows = 4;
	} else {
		var Rows = 5;
	}
	
	for (var j=1; j<Rows+1; j++) {
		var tr = document.createElement("tr");
		tr.id = "row"+j
		
		for (var i=1; i<8; i++) {
			var td = document.createElement("td");
			var ul = document.createElement("ul");
			var li_date = document.createElement("li");
			var a = document.createElement("a");
			
			if ((Loop_Counter >= First_Day) && (Day_Counter <= days_in_month[month])) {
				
				var date = document.createTextNode(Day_Counter);
				
				if ((Day_Counter == today) && (year == current_year) && (month == current_month)) {
					td.className = "today";
					a.className = "today";
				}
				
				if (Calendar_Date["date"+Day_Counter].events[0] != undefined) {
					td.className = "events";
					
					
					a.href="eventsListDay.cfm?menuID=8&year="+year+"&monthID="+convertNumberToString(month)+"&day="+convertNumberToString(Day_Counter-1);
					a.appendChild(date);
					li_date.appendChild(a);
					li_date.className = "date";
					ul.appendChild(li_date);
					
					/*
					code for appending events
					*/
					for (var k=0; k<Calendar_Date["date"+Day_Counter].events.length; k++) {
						
						var li_event = document.createElement("li");
						var a_event = document.createElement("a");
						var span_a = document.createElement("span");
						var span_title = document.createTextNode(String(Calendar_Date["date"+Day_Counter].events[k][2]).substr(0,7)+"...");
						li_event.id = Calendar_Date["date"+Day_Counter].events[k][0];
						li_event.className = "event "+Calendar_Date["date"+Day_Counter].events[k][1];
						
						var monthID = convertNumberToString(month);
						var calendarID = String(li_event.id).substr(7,String(li_event.id).length);
						
						a_event.href="specificEvent.cfm?menuID=8&calendarID="+calendarID;
						
						span_a.appendChild(span_title);
						a_event.appendChild(span_a);
						li_event.appendChild(a_event);
						ul.appendChild(li_event);						
						
					}
					
				} else {
					li_date.appendChild(date);
					li_date.className = "date";
					ul.appendChild(li_date);
				}
				
				
				td.appendChild(ul);
				Day_Counter++;    
			} else {
				td.className = "inactive";
			}
			tr.appendChild(td);
			Loop_Counter++;
		}
		calendarDates_id.appendChild(tr);
	}
}

function convertNumberToString(num) {
	var str = String(num+1);
	if (str.length == 1) {
		return "0"+str;
	} else {
		return str;
	}
}

function ClearCalendar() { //Clear out any existing data before appending new data
	if (calendarDates_id.childNodes[1] != "undefined") {
		monthYear_id.removeChild(monthYear_id.lastChild);
		var previousRows = calendarDates_id.childNodes.length;
		for (var i=1; i<previousRows+1; i++) {
			var removeRow = document.getElementById("row"+i);
			if (removeRow != null) {
				calendarDates_id.removeChild(removeRow);
			}
		}
	}
}

function Skip(direction) { //Navigation functionality that runs on Calendar Advance/Previous events
	if (direction == '+') {
		if (selected_month == 11) {
			selected_month = 0;
			selected_year++;
		} else {
			selected_month++;
		}
	} else {
		if (selected_month == 0) {
			selected_month = 11;
			selected_year--;
		} else {
			selected_month--;
		}
	}
	ClearCalendar();
	LoadXMLDoc();
}

function BuildCalendarURL() {
	window.location = "eventsListMonth.cfm?menuID=8&year="+selected_year+"&monthID="+convertNumberToString(selected_month)+"&categoryID";
}

