﻿var aDate = new Array();
var oEvents = new Array();
var aEvents = new Array();
var aRetrieved = new Array(); //if already retrieved, don't get it again
var contributers;
var _async = true;

//helper functions

function getDateId(date)
{
	return "_" + date.getDate() + "_" + date.getMonth() + "_" + date.getYear();
}

function getDateFromString(s)
{
    var strDate = s.replace(/\//g, "");
    var date = eval("new " + strDate);
    return date;
}

function get12HourTimeFromString(date)
{
	date = getDateFromString(date);
	var h = date.getHours();
	var m = date.getMinutes();
	var p = "am";
	if(h > 12)
	{
		h = (h == 24) ? 12 : h%12;
		p = "pm";
	}
	if(String(m).length <= 1)
		m = "0" + m;
	return h+":"+m+p;
}

function addEvent(date, dateId, eventData)
{
	if($("#" + dateId).length == 0)
	{
		$("#eventsDiv").append("<div id='" + dateId + "'></div>");
	}
	if($("#toolTip" + dateId).length == 0)
	{
		$("#eventsDiv").append("<div id='toolTip"+dateId+"'></div>");
	}
	var contribData;
	try{
		var contributer = contributers[eventData.Contributer];
		contribData = "<a href='" + contributer.url + "'><h4>" + contributer.name + "</h4></a>"
	}catch(err)
	{
		contribData = "";
	}
	
	var start;
	var end;
	var toolTipStart;
	
	if(eventData.AllDay)
	{
		start = getDateFromString(eventData.Start).toDateString();
		end = getDateFromString(eventData.End).toDateString() + " (end of the day)";
		toolTipStart = "All Day";
	}
	else
	{
		start = get12HourTimeFromString(eventData.Start);
		end = get12HourTimeFromString(eventData.End);
		toolTipStart = start;
	}
	
	var sEventTime = "<strong>Start: </strong>" + start + " <br/>";	
	
	if(eventData.Start != eventData.End)
	{
		sEventTime += "<strong>End: </strong> " + end + " <br/>";
	}
	
	$("#" + dateId).append("<div>" + contribData + "<a href='/Pages/calendar.aspx?event=" + eventData.ID + "' target='_blank'><div><h3>" + eventData.Title + "</h3><span class='eventDesc'>" + sEventTime + eventData.Description + "</span></div></a></div>");
	$("#toolTip" + dateId).append("<div><span>" + toolTipStart + ": </span>"+eventData.Title+"</div>");
}

var callback = function processCalendarXml(xml)
{	
    var data = $(xml).find("string").text();
    if(data.length > 0 && data!= null)
    {
		var json = JSON.parse(data);
		var eventList = json.EventList;
		contributers = json.Contributers;
	
		for(var i = 0; i < eventList.length; i++)
		{
		  if(oEvents[eventList[i].ID+eventList[i].Start] == undefined)
		  {
			  var date = getDateFromString(eventList[i].Start);
			  var dateId = getDateId(date);
			  addEvent(date, dateId, eventList[i]);
			  
			  aDate[date.toDateString()] = eventList[i].Title;
			  oEvents[eventList[i].ID+eventList[i].Start] = true;
		  }
		}
    }
}

function renderCalendar()
{
    _async = false;
	 $("#datepicker").datepick({
  	    onChangeMonthYear: getMonthEvents,
    	beforeShowDay: function(date){
    		var ar = new Array();
    		if(aDate[date.toDateString()] != undefined)
    		{
    		    var dateId = getDateId(date);
    			ar[0] = true;
    			ar[1] = dateId;
    			ar[2] = "";
    		}
    		else
    		{
    			ar[0] = false;
    			ar[1] = "noEvents";
    			ar[2] = "nothing scheduled for this day";
    		}
    		return ar;
    	},
    	onHover: function(value, date){
    		if(date != undefined)
    		{
    		if(aDate[date.toDateString()] != undefined)
    		{
    		    var dateId = getDateId(date);
    		    $("." + dateId).easytooltip("toolTip"+dateId);
			    $("." + dateId + " a").colorbox({inline:true, href:"#"+dateId, height:"500px",width:"500px", title:date.toDateString()}); 		
			}
			}
    	},
    	onSelect: function(value, date, inst){ $("#tool_tip_action").hide().css({"left": 0, "top" : 0}); },
    	changeMonth: false,
    	changeYear: false
    });
}

//logic will have to be revisted if async needs to be true... 
function getMonthEvents(year, month)
{
	var sRetrieved = year+","+month;	
	if(aRetrieved[sRetrieved] == undefined)
	{
	  aRetrieved[sRetrieved] = true;
	
	$.ajax({
	type: "POST",
	url: "/_vti_bin/calendar.asmx/RetrieveMonth",
	dataType: "xml",
	data: {'month':month, 'year':year, 'categories':cats, 'contributers':conts, 'legacy':legacy},
	success: callback,
	complete: renderCalendar,
	error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); },
	async: _async
	});
	}
}