function buildCalendar(xml, calendar, buildLegend)
{
	var httpRequest = newXmlHttpRequest();
	httpRequest.onreadystatechange = function()
	{
		if(httpRequest.readyState == 4 && httpRequest.status != 200)
		{
			//alert("Unable to load calendar data.");
			return;
		}
		else if(httpRequest.readyState == 4)
		{
			if(!httpRequest.responseXML)
			{
				alert(httpRequest.responseText);
				return;
			}

			for(var i = 0; i < httpRequest.responseXML.childNodes.length; i++)
			{
				if(httpRequest.responseXML.childNodes[i].nodeName == "events")
				{
					buildCalendarHtml(processCalendarXml(httpRequest.responseXML.childNodes[i]), calendar, buildLegend);
					return;
				}
			}
			
			alert("Unable to parse XML file.");
			return;
		}
	};
	httpRequest.open("GET", xml, true);
	httpRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");
	httpRequest.send(null);
}

function processCalendarXml(xml)
{
	var data = {
		month: "",
		monthdigit: 0,
		year: "",
		next: "",
		prev: "",
		days: new Array()
	};
	
	for(var i = 0; i < xml.childNodes.length; i++)
	{
		var workforce = false;
		var business = false;
		var community = false;
		var planning = false;
		
		if(xml.childNodes[i].nodeName == "day")
		{
			var date = 0;
			for(var j = 0; j < xml.childNodes[i].attributes.length; j++)
			{
				
				if(xml.childNodes[i].attributes[j].nodeName == "date")
					date = parseInt(xml.childNodes[i].attributes[j].nodeValue, 10);
				if(xml.childNodes[i].attributes[j].nodeName == "workforce")
					workforce = true;
				if(xml.childNodes[i].attributes[j].nodeName == "business")
					business = true;
				if(xml.childNodes[i].attributes[j].nodeName == "community")
					community = true;
				if(xml.childNodes[i].attributes[j].nodeName == "planning")
					planning = true;
				
			}
			if(date)
			{
				var day = data.days[date] ? data.days[date] : { events: false, today: false };
				for(var j = 0; j < xml.childNodes[i].childNodes.length; j++)
				{
					if(xml.childNodes[i].childNodes[j].nodeName == "event")
						day.events = true;
					if(xml.childNodes[i].childNodes[j].nodeName == "today")
						day.today = true;
					if(workforce)
						day.workforce = true;
					if(business)
						day.business = true;
					if(community)
						day.community = true;
					if(planning)
						day.planning = true;
					
				}
				data.days[date] = day;
			}
		}
		else if(xml.childNodes[i].nodeName == "month")
			data.month = xml.childNodes[i].firstChild.nodeValue;
		else if(xml.childNodes[i].nodeName == "monthdigit")
			data.monthdigit = parseInt(xml.childNodes[i].firstChild.nodeValue, 10);
		else if(xml.childNodes[i].nodeName == "year")
			data.year = xml.childNodes[i].firstChild.nodeValue;
		else if(xml.childNodes[i].nodeName == "next")
			data.next = xml.childNodes[i].firstChild.nodeValue;
		else if(xml.childNodes[i].nodeName == "prev")
			data.prev = xml.childNodes[i].firstChild.nodeValue;
	}

	return data;
}

function buildCalendarHtml(data, calendar, buildLegend)
{
	var e1, e2, e3, e4, e5, e6, e7, table, tr, tbody, thead;

	while(calendar.firstChild)
		calendar.removeChild(calendar.firstChild);
	
	table = document.createElement("table");
	table.cellSpacing = 1;
	table.cellPadding = 0;
	
	thead = document.createElement("thead");

	e5 = document.createElement("img");
	e5.src = "./assets/images/img_arrow-left.gif";
	e5.alt = "Previous Month";

	e4 = document.createElement("a");
	e4.href = "#";
	e4.onclick = function() {
		buildCalendar(data.prev, calendar);
		return false;
	}
	e4.appendChild(e5);

	e1 = document.createElement("td");
	e1.appendChild(e4);

	e2 = document.createElement("td");
	e2.className = "month";
	e2.colSpan = 5
	e2.appendChild(document.createTextNode(data.month + " " + data.year));

	e5 = document.createElement("img");
	e5.src = "./assets/images/img_arrow-right.gif";
	e5.alt = "Next Month";

	e4 = document.createElement("a");
	e4.href = "#";
	e4.onclick = function() {
		buildCalendar(data.next, calendar);
		return false;
	}
	e4.appendChild(e5);

	e3 = document.createElement("td");
	e3.appendChild(e4);
	
	tr = document.createElement("tr");
	tr.appendChild(e1);
	tr.appendChild(e2);
	tr.appendChild(e3);
	thead.appendChild(tr);
	
	tbody = document.createElement("tbody");
	
	e1 = document.createElement("th");
	e1.appendChild(document.createTextNode("S"));
										   
	e2 = document.createElement("th");
	e2.appendChild(document.createTextNode("M"));
										   
	e3 = document.createElement("th");
	e3.appendChild(document.createTextNode("T"));
										   
	e4 = document.createElement("th");
	e4.appendChild(document.createTextNode("W"));
										   
	e5 = document.createElement("th");
	e5.appendChild(document.createTextNode("T"));
										   
	e6 = document.createElement("th");
	e6.appendChild(document.createTextNode("F"));
										   
	e7 = document.createElement("th");
	e7.appendChild(document.createTextNode("S"));
	
	tr = document.createElement("tr");
	tr.appendChild(e1);
	tr.appendChild(e2);
	tr.appendChild(e3);
	tr.appendChild(e4);
	tr.appendChild(e5);
	tr.appendChild(e6);
	tr.appendChild(e7);
	tbody.appendChild(tr);

	var firstDate = new Date(data.month + " 1, " + data.year);
	var totalDays = daysInMonth(firstDate.getFullYear(), firstDate.getMonth()+1);

	j = (firstDate.getDay() * -1) + 1;
	while(j < totalDays)
	{
		tr = document.createElement("tr");
		for(var i = 0; i < 7; i++, j++)
		{
			e1 = document.createElement("td");
			if(j > 0 && j <= totalDays)
			{
				if(data.days[j] && data.days[j].events)
				{
					e2 = document.createElement("a");
					e2.href = base_url + 'calendar/calendar-date.html?day=' + data.year + '-' + (data.monthdigit < 10 ? '0' + data.monthdigit : data.monthdigit) + '-' + (j < 10 ? '0' + j : j);
				}
				else
				{
					e2 = document.createElement("span");
				}
				e2.appendChild(document.createTextNode(j));
				if(data.days[j])
				{
					if(data.days[j].today && data.days[j].events)
						e1.className = "today events";
					else if(data.days[j].events)
						e1.className = "events";
					else if(data.days[j].today)
						e1.className = "today";
					
					var holder = document.createElement('div');
					var holderEmpty = true;
					
					if(data.days[j].workforce) {
						var span = document.createElement('span');
						span.className = 'workforce';
						holder.appendChild(span);
						holderEmpty = false;
					}
					if(data.days[j].business) {
						var span = document.createElement('span');
						span.className = 'business';
						holder.appendChild(span);
						holderEmpty = false;
					}
					if(data.days[j].community) {
						var span = document.createElement('span');
						span.className = 'community';
						holder.appendChild(span);
						holderEmpty = false;
					}
					if(data.days[j].planning) {
						var span = document.createElement('span');
						span.className = 'planning';
						holder.appendChild(span);
						holderEmpty = false;
					}
					
					if (!holderEmpty)
						e2.appendChild(holder);
				}
				
			}
			else
			{
				e2 = document.createTextNode("\u00a0");
			}
			e1.appendChild(e2);
			tr.appendChild(e1);
		}
		tbody.appendChild(tr);
	}
	
	table.appendChild(thead);
	table.appendChild(tbody);
	calendar.appendChild(table);
	
	if(buildLegend){
		var legend = document.createElement('div');
		legend.id = 'legend';
		var workforce = document.createElement('span');
		workforce.className = 'workforce';
		workforce.appendChild(document.createTextNode('Workforce'));
		legend.appendChild(workforce);
		
		var business = document.createElement('span');
		business.className = 'business';
		business.appendChild(document.createTextNode('Business'));
		legend.appendChild(business);
		
		var community = document.createElement('span');
		community.className = 'community';
		community.appendChild(document.createTextNode('Community'));
		legend.appendChild(community);
		
		var planning = document.createElement('span');
		planning.className = 'planning';
		planning.appendChild(document.createTextNode('Planning'));
		legend.appendChild(planning);
		
		calendar.appendChild(legend);
	}
}

function daysInMonth(year, month)
{
	var m = [31,28,31,30,31,30,31,31,30,31,30,31];
	if(month != 2) return m[month - 1];
	if(year%4 != 0) return m[1];
	if(year%100 == 0 && year%400 != 0) return m[1];
	return m[1] + 1;
} 
