var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var daysShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var daysTotal = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var ajax = new Ajax("calendar/data.php", resultHandler);
var calDate = new Date();
var calParent;
var eventParent;
var gblEvents = new Array();
var gblHeaders = new Array();
var endDateName;
var lastShow = 0;

function myLoad()
{
	var now = new Date();
	var currentYear = now.getFullYear();
	var obj = document.getElementById("year");
	for(var i = currentYear - 2; i <= currentYear + 5; i++)
	{
		var option = document.createElement("option");
		option.text = i;
		option.value = i;
		
		if(i == currentYear)
			option.selected = true;
		
		try
		{
			obj.add(option);
		}
		catch(e)
		{
			obj.add(option, null);
		}
	}
	
	calParent = document.getElementById("calendarHolder");
	eventParent = document.getElementById("eventWrapper");
	changeMonth(calDate.getMonth());
	reloadCalendar();
}

if(window.attachEvent)
	window.attachEvent("onload", myLoad);
else
	window.addEventListener("load", myLoad, false);

function isLeapYear(year)
{
	year = parseInt(year);

	if(year % 4 == 0)
	{
		if(year % 100 != 0)
			return true;
		else
		{
			if(year % 400 == 0)
				return true;
			else
				return false;
		}
	}
	
	return false;
}

function emptyNode(obj)
{
	while(obj.childNodes.length > 0)
		obj.removeChild(obj.childNodes[0]);
}

function createCalendar(parent, date)
{
	if(parent == null)
	{
		alert("NULL Parent!");
		return;
	}
	
	if(isLeapYear(date.getFullYear()))
		daysTotal[1] = 29;
	else
		daysTotal[1] = 28;

	emptyNode(parent);
	var firstDay = new Date();
	var curDate = new Date();
	var table = parent;
	var tr = table.insertRow(0);
	var td;
	var div;
	var caption;
	var dayCounter;
	
	firstDay.setFullYear(date.getFullYear());
	firstDay.setMonth(date.getMonth());
	firstDay.setDate(1);
	
	caption = document.createElement("caption");
	caption.appendChild(document.createTextNode(months[date.getMonth()] + ", " + date.getFullYear().toString()));
	table.appendChild(caption);
	
	tr = table.insertRow(table.rows.length);
	
	for(dayCounter = 0; dayCounter < 7; dayCounter++)
	{
		td = tr.insertCell(dayCounter);
		td.className = "weekday";
		td.appendChild(document.createTextNode(daysShort[dayCounter]));
	}
	
	tr = table.insertRow(table.rows.length);
	
	for(dayCounter = 0; dayCounter < firstDay.getDay(); dayCounter++)
	{
		td = tr.insertCell(dayCounter);
		td.appendChild(document.createTextNode(" "));
		td.className = "empty";
	}
	
	for(i = 0; i < daysTotal[date.getMonth()]; i++)
	{
		td = tr.insertCell(dayCounter);
		td.className = "basic";
		td.isToday = (i == curDate.getDate() - 1)
			&& (curDate.getMonth() == date.getMonth())
			&& (curDate.getFullYear() == date.getFullYear());
		if(td.isToday)
			td.className += " today";
		
		td.isCurrent = (i == date.getDate() - 1);
		if(td.isCurrent)
			td.className += " current";
		
		td.day = i + 1;
		td.onclick = dayClicked;
		td.appendChild(document.createTextNode((i + 1).toString()));
		
		if(gblHeaders[td.day] && gblHeaders[td.day].length > 0)
		{
			td.appendChild(document.createElement("br"));
			
			for(var j = 0; j < gblHeaders[td.day].length; j++)
			{
				div = document.createElement("div");
				div.appendChild(document.createTextNode(gblHeaders[td.day][j]));
				div.className = "miniEvent";
				
				td.appendChild(div);
			}
		}
		
		dayCounter++;
		if(dayCounter >= 7)
		{
			tr = table.insertRow(table.rows.length);
			dayCounter = 0;
		}
	}
	
	if(dayCounter != 0)
	{
		for(; dayCounter < 7; dayCounter++)
		{
			td = tr.insertCell(dayCounter);
			td.appendChild(document.createTextNode(" "));
			td.className = "empty";
		}
	}
}

function listEvents()
{
	emptyNode(eventParent);
	
	var holder, div, img;
	
	for(var i = 0; i < gblEvents.length; i++)
	{
		holder = document.createElement("div");
		holder.className = "event";
		
		div = document.createElement("div");
		div.className = "title";
		div.appendChild(document.createTextNode(gblEvents[i].title));
		holder.appendChild(div);
		
		div = document.createElement("div");
		if(gblEvents[i].image)
		{
			img = document.createElement("img");
			img.src = gblEvents[i].image;
			div.appendChild(img);
		}
		
		var desc = gblEvents[i].description.split("\n");
		for(var j = 0; j < desc.length; j++)
		{
			div.appendChild(document.createTextNode(desc[j]));
			div.appendChild(document.createElement("br"));
		}
		
		holder.appendChild(div);
		
		div = document.createElement("div");
		div.className = "clearb";
		holder.appendChild(div);
		
		div = document.createElement("div");
		div.className = "startTime";
		div.appendChild(document.createTextNode("Start: " + gblEvents[i].start));
		holder.appendChild(div);
		
		div = document.createElement("div");
		div.className = "endTime";
		div.appendChild(document.createTextNode("End: " + gblEvents[i].end));
		holder.appendChild(div);
		
		div = document.createElement("div");
		div.className = "clearb";
		holder.appendChild(div);
		
		eventParent.appendChild(holder);
	}
}

function formatNum(val)
{
	val = (val > 12 ? val - 12 : val);
	return (val < 10 ? "0" + val.toString() : val.toString());
}

function changeMonth(month)
{
	var obj = document.getElementById("month");
	for(i = 0; i < obj.options.length; i++)
	{
		if(obj.options[i].text == months[month])
			obj.options[i].selected = true;
		else
			obj.options[i].selected = false;
	}
}

function dayClicked()
{
	calDate.setDate(this.day);
	reloadCalendar();
}

function changeCalendar()
{
	var monthObj = document.getElementById("month");
	var yearObj = document.getElementById("year");
	calDate.setMonth(monthObj.options[monthObj.selectedIndex].value);
	calDate.setFullYear(yearObj.options[yearObj.selectedIndex].value);
	reloadCalendar();
}

function nextMonth()
{
	var monthObj = document.getElementById("month");
	if(monthObj.selectedIndex > 10)
	{
		var yearObj = document.getElementById("year");
		if(yearObj.selectedIndex == yearObj.options.length - 1)
		{
			alert("Cannot go ahead farther.");
			return;
		}
		else
			yearObj.selectedIndex++;
		
		monthObj.selectedIndex = 0;
	}
	else
		monthObj.selectedIndex++;
	
	changeCalendar();
	glance("month");
}

function prevMonth()
{
	var monthObj = document.getElementById("month");
	if(monthObj.selectedIndex == 0)
	{
		var yearObj = document.getElementById("year");
		if(yearObj.selectedIndex == 0)
		{
			alert("Cannot go back farther.");
			return;
		}
		else
			yearObj.selectedIndex--;
			
		monthObj.selectedIndex = 11;
	}
	else
		monthObj.selectedIndex--;
	
	changeCalendar();
	glance("month");
}

function resultHandler(result)
{
	//alert(result);
	eval(result);
	createCalendar(calParent, calDate);
	listEvents();
}

function reloadCalendar()
{
	ajax.addParam("act", "getday");
	ajax.addParam("day", calDate.getDate());
	ajax.addParam("month", calDate.getMonth() + 1);
	ajax.addParam("year", calDate.getFullYear());
	ajax.cycle();
}

function glance(type)
{
	//alert('glance');
	ajax.addParam("act", "glance");
	ajax.addParam("type", type);
	ajax.addParam("day", calDate.getDate());
	ajax.addParam("month", calDate.getMonth() + 1);
	ajax.addParam("year", calDate.getFullYear());
	ajax.cycle();
	return false;
}