var xmlobj;
var last_date;
var base_url = '/';
//var base_url = 'http://localhost/cda/';
var cur_month;
var event_id;

//---Helper Functions

//Takes in a date object
function getISODate(date)
{
	var cur_date = date.getFullYear()+'-';
	var day = (date.getDate() < 10) ? '0' + date.getDate() : date.getDate();
	var month = date.getMonth() + 1;
	month = (month < 10) ? '0' + month : month;
	cur_date += month+'-'+day;
	
	return cur_date;
}

function getTextualDate(date)
{
	var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	var day = date.getDate();
	var sup = "";
	
	if (day == 1 || day == 21 || day ==31)
		sup = "st";
	else if (day == 2 || day == 22)
		sup = "nd";
	else if (day == 3 || day == 23)
		sup = "rd";
	else
		sup = "th";

	var month = date.getMonth();
	//var year = date.getFullYear();

	return day + "<sup>" + sup + "</sup> " + months[month];
}

function getTextualTime(date)
{
	var hours 	= date.getHours();
	var mins 	= date.getMinutes();
	var str 	= '';
	var ampm	= 'am';
	
	if(hours == 0)
		str = '12:';
	else if(hours > 12)
		str = hours - 12+':';
	else
		str = hours+':';
	
	if(hours > 11)
		ampm = 'pm';
	
	if(mins < 10)
		mins = '0' + mins;
	
	return str += mins+' '+ampm;	
}

function getDateObject(ISO_Date_String)
{
	if(ISO_Date_String.length < 10)
		return null;
		
	var year 	= ISO_Date_String.substring(0,4);
	var month 	= ISO_Date_String.substring(5,7)-1;
	var day 	= ISO_Date_String.substring(8,10);
	var date 	= new Date(year,month,day);
	
	if(ISO_Date_String.length == 10)
		return date;
	else
	{
		date.setHours(ISO_Date_String.substring(11,13));
		date.setMinutes(ISO_Date_String.substring(14,16));
		return date;
	}
}

function getCurrentMonth()
{
	var months = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	return months[cur_month - 1];
}

function setCurrentMonth(Month_String)
{
	cur_month = Month_String;
}

function getLoaderAnimation()
{
	var str = '<div id="loader"><img src="images/ajax-loader.gif" /></div>';
	return str;
}

function getMasterDiv()
{
	return document.getElementById('events');
}

function getTitleDiv()
{
	return document.getElementById('month-title');
}

function setTitle(value)
{
	getTitleDiv().innerHTML = value;
}

function highlightEvent(date)
{
	var divs = getMasterDiv().getElementsByTagName('div');
	
	for(var i=0; i < divs.length ; i++)
	{
		if(divs[i].className.indexOf('highlight') >= 0)
			divs[i].className = divs[i].className.replace('highlight','');
		
		if(divs[i].className.indexOf('event_'+date) >= 0)
			divs[i].className += ' highlight';
	}
}

function clearEvents()
{
	getMasterDiv().innerHTML = '';
}

function writeEvent(id,date,title,description)
{
	var str = eventHTML(id,date,title,description);
	getMasterDiv().innerHTML += str;
}

function eventHTML(id,date,title,description)
{
	var textual_date = getTextualDate(getDateObject(date));
	var str = '<div class="event event_'+date+'">' +
				'			<a name="'+date+'" id="'+date+'"></a>' +		
				'			<h4>'+textual_date+'</h4>' +
				'			<p><a href="javascript:fetchEvent('+id+')"><strong>'+title+'</strong> <em>more</em> &raquo;</a></p>';
	
	if(description != '' && description != null)
		str +=	' <p><a href="javascript:fetchEvent('+id+')">'+description+'</a>.</p>';
	
	str +='</div>';
	return str;
}

function displayEvents( ResponseObject )
{
	clearEvents(); // clear current date
	setTitle('UPCOMING EVENTS in '+getCurrentMonth());
		
	var response = ResponseObject.responseXML;
	if(!response || response.firstChild == null || !response.getElementsByTagName('events').length)
	{
		getMasterDiv().innerHTML = '<div class="event">There are no events in this month</div>';
		return;
	}
	
	var events = response.getElementsByTagName('events')[0].getElementsByTagName('event');	
	var enable_dates = Array(); //used to enable dates in the datePicker
	
	for(var i=0; i < events.length ; i++)
	{
		var id = events[i].getElementsByTagName('id')[0].firstChild.nodeValue;
		var title = events[i].getElementsByTagName('title')[0].firstChild.nodeValue;
		var sdate = events[i].getElementsByTagName('start_date')[0].firstChild.nodeValue;
		//var desc = events[i].getElementsByTagName('description')[0].firstChild.nodeValue;
		
		enable_dates[i] = sdate.replace(/-/g,'');		
		writeEvent(id,sdate,title,'');
	}
	
	if(events.length > 0)
	{
		datePickerController.datePickers['dp-normal-1'].setEnabledDates(enable_dates);
	}
	
	highlightEvent(last_date);
}

function displayEvent( ResponseObject )
{
	clearEvents(); 
	
	var response = ResponseObject.responseXML;
	if(!response || response.firstChild == null || !response.getElementsByTagName('events').length)
	{
		getMasterDiv().innerHTML = '<div class="event">This event is invalid or has expired</div>';
		return;
	}
	
	var events 			= response.getElementsByTagName('events')[0].getElementsByTagName('event');	
	var i=0;
	event_id 			= events[i].getElementsByTagName('id')[0].firstChild.nodeValue;
	var title 			= events[i].getElementsByTagName('title')[0].firstChild.nodeValue;
	var date 			= events[i].getElementsByTagName('start_date')[0].firstChild.nodeValue;
	var end_date 		= events[i].getElementsByTagName('end_date')[0].firstChild.nodeValue;
	var description 		= events[i].getElementsByTagName('description')[0].firstChild.nodeValue;
	
	getMasterDiv().innerHTML = '<div class="event_details">' +
				'	<h4>'+title+'</h4>' +
				'	<p>'+description+'.</p>' +
				'	<br /><p style="font-weight:bold;">&laquo; <a href="index.php">Back to all Events</a></p>' +
				'	</div>';
	
	var date_obj 			= getDateObject(date);
	var end_date_obj 		= getDateObject(end_date);
	var textual_date 		= getTextualDate(date_obj);
	var textual_time 		= getTextualTime(date_obj);
	var end_textual_date 	= getTextualDate(end_date_obj);
	var end_textual_time 	= getTextualTime(end_date_obj);
	
	
	if(getISODate(date_obj) != getISODate(end_date_obj))
		var title = 'from '+textual_date+' ( '+textual_time+' ) - '+end_textual_date+' ( '+end_textual_time+' ) ';
	else
		var title = 'On '+textual_date+' ( '+textual_time+' - '+end_textual_time+' ) ';
	setTitle(title);
}

function fetchEvent(id)
{
	sendRequest(base_url+"date_request.php?id="+id,displayEvent,null);
}

//--- Calendar Functions
function onUpdateEventHandler(dp)
{
	var cur_date = getISODate(dp.date);
	setCurrentMonth(cur_date.substring(5,7));
	
	if(last_date == null || last_date.substring(0,7) != cur_date.substring(0,7) || (event_id != null && event_id != '') ) // if the year and month are not the same, then send a request
	{
		event_id = null;
		getMasterDiv().innerHTML = getLoaderAnimation();		
		sendRequest(base_url+"date_request.php?date="+cur_date,displayEvents,null);		
	}
	else if(last_date != cur_date && getMasterDiv().childNodes.length > 1)
	{
		highlightEvent(cur_date);
		
		var anchors= getMasterDiv().getElementsByTagName('a');
		
		for(var i=0; i<anchors.length; i++)
		{
			if(anchors[i].name == cur_date)
			{
				anchors[i].focus();
			}
		}
	}
		
	last_date = cur_date;
}

//--- AJAX Functions
function createXMLHTTPObject()
{
	var xmlobj = false; 
	var XMLHttpFactories = [
		function(){return new XMLHttpRequest()},
		function(){return new ActiveXObject("Msxml2.XMLHTTP")},
		function(){return new ActiveXObject("Msxml3.XMLHTTP")},
		function(){return new ActiveXObject("Microsoft.XMLHTTP")}
	]
	
	for(var i=0; i < XMLHttpFactories.length; i++)
	{
		try{
			xmlobj = XMLHttpFactories[i]();
		}
		catch(Exception){continue;}
		break;
	}
	
	return xmlobj;
}

function sendRequest(url, callback, postData)
{
	var req = createXMLHTTPObject();
	if(!req) return;
	
	var method = (postData)?"POST":"GET";
	
	try{
		req.open(method,url,true);
	}catch(Exception){ alert('Connection Error : '+Exception); }
	
	req.setRequestHeader('User-Agent','XMLHTTP');
	
	if(postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		
	req.onreadystatechange = function() {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304){
			alert('HTTP Error '+req.status);
			return;
		}
		
		callback(req);
	}
	
	if(req.readyState == 4) return;
	req.send(postData);
}


function initialize()
{
	xmlobj = createXMLHTTPObject();
	var supportCheck = document.createElement && document.getElementsByTagName && xmlobj;
	
	if(!(xmlobj))
		alert('XMLHTTPREQUEST object could not be created');
	else if(!supportCheck) 
		alert('This browser does not support Ajax. Please use another mainstream browser to check this site');
	else
	{
		datePickerController.onupdate = onUpdateEventHandler;
		datePickerController.date = new Date();
		onUpdateEventHandler(datePickerController);
	}
}

window.onload = initialize;