document.write("<script type=\"text/javascript\" src=\"assets/scripts/EdeptiveAjax.js\"></script>");

// constants
var kGetModeDay = 1, kGetModeWeek = 2, kGetModeMonth = 3, kGetModeYear = 4;
// globals
var gstrDomain = "http://www.kings-school.co.uk";
var goAjaxEvents = null;
var goAjaxEventsFormatted = null;
var now = new Date();
var giClientID, gsDay =(now.getDate()<10?"0":"")+now.getDate()+"/"+(now.getMonth()<9?"0":"")+(now.getMonth()+1)+"/"+now.getFullYear();
var giGetMode=kGetModeWeek, gfGroupByDay=true, gfGroupByWeek=false, gfGroupByMonth=false, gsDateFormat='yyyy-MM-ddThh:mm:ss_w', gsXslUrl='/assets/xsl/event.xsl';
var giYear = now.getFullYear(), giMonth = now.getMonth() + 1;

// display this weeks calendar entries
function thisWeek() {
	getEventsFormatted();
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}

// display this months calendar entries
function thisMonth() {
	getEventsFormatted(gsDay, 3);
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}

// display this years calendar entries
function thisYear() {
	getEventsFormatted(gsDay, 4);
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}


// get content items from webservice (gets params from url)
function getEventsFormatted(sDay, iGetMode, sCategoryIDs) {
	var strUrl = gstrDomain + "/webservices/event_io.asmx/getEventsFormatted";
	var strParams = "";
	var strHtml = "";

	if(sCategoryIDs == null) {
		sCategoryIDs = gsActiveCategories;
	}
	strParams += (strParams == "" ? "" : "&") + "Day=" + (sDay ? sDay : gsDay);
	strParams += (strParams == "" ? "" : "&") + "GetMode=" + (iGetMode ? iGetMode : giGetMode);
	strParams += (strParams == "" ? "" : "&") + "GroupByDay=" + (gfGroupByDay ? gfGroupByDay : false);
	strParams += (strParams == "" ? "" : "&") + "GroupByWeek=" + (gfGroupByWeek ? gfGroupByWeek : false);
	strParams += (strParams == "" ? "" : "&") + "GroupByMonth=" + (gfGroupByMonth ? gfGroupByMonth : false);
	strParams += (strParams == "" ? "" : "&") + "DateFormat=" + (gsDateFormat ? gsDateFormat : "");
	if(sCategoryIDs) {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=" + "1,0,2,0";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=" + sCategoryIDs;
	} else {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=";
	}
	strParams += (strParams == "" ? "" : "&") + "SortOrder=1";
	strParams += (strParams == "" ? "" : "&") + "XslUrl=" + (gsXslUrl ? gsXslUrl : "");
	try {
		goAjaxEventsFormatted = new EdeptiveAjax();
		goAjaxEventsFormatted.postRequest(strUrl, strParams, onEventsFormattedResponse);
	} catch(e) {
		displayError(e.description);
	}
	// show loading animation
	document.getElementById("eventsDiv").innerHTML = "<div id='eventsLoading'><img src='assets/images/loading.gif' width='31' height='31' alt='Loading...' class='loading' /><br />&nbsp;&nbsp;&nbsp;Loading...</div>";
}
// get content items from webservice (gets params from url) WITHIN DATE RANGE
function getEventsInDateRangeFormatted(sDay, iGetMode, sCategoryIDs, sFromDate, sToDate) {
	var strUrl = gstrDomain + "/webservices/event_io.asmx/getEventsInDateRangeFormatted";
	var strParams = "";
	var strHtml = "";

	if(sCategoryIDs == null) {
		sCategoryIDs = gsActiveCategories;
	}
	strParams += (strParams == "" ? "" : "&") + "Day=" + (sDay ? sDay : gsDay);
	strParams += (strParams == "" ? "" : "&") + "GetMode=" + (iGetMode ? iGetMode : giGetMode);
	strParams += (strParams == "" ? "" : "&") + "GroupByDay=" + (gfGroupByDay ? gfGroupByDay : false);
	strParams += (strParams == "" ? "" : "&") + "GroupByWeek=" + (gfGroupByWeek ? gfGroupByWeek : false);
	strParams += (strParams == "" ? "" : "&") + "GroupByMonth=" + (gfGroupByMonth ? gfGroupByMonth : false);
	strParams += (strParams == "" ? "" : "&") + "DateFormat=" + (gsDateFormat ? gsDateFormat : "");
	if(sCategoryIDs) {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=" + "1,0,2,0";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=" + sCategoryIDs;
	} else {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=";
	}
	strParams += (strParams == "" ? "" : "&") + "SortOrder=1";
	strParams += (strParams == "" ? "" : "&") + "FromDate=" + (sFromDate ? sFromDate : "");
	strParams += (strParams == "" ? "" : "&") + "ToDate=" + (sToDate ? sToDate : "");
	strParams += (strParams == "" ? "" : "&") + "XslUrl=" + (gsXslUrl ? gsXslUrl : "");
	try {
		goAjaxEventsFormatted = new EdeptiveAjax();
		goAjaxEventsFormatted.postRequest(strUrl, strParams, onEventsFormattedResponse);
	} catch(e) {
		displayError(e.description);
	}
	// show loading animation
	document.getElementById("eventsDiv").innerHTML = "<div id='eventsLoading'><img src='assets/images/loading.gif' width='31' height='31' alt='Loading...' class='loading' /><br />&nbsp;&nbsp;&nbsp;Loading...</div>";
}
function onEventsFormattedResponse() {
	var sStatus = goAjaxEventsFormatted.checkReadyState("devnull", null, null, null);
	
	if(sStatus == "OK") {
		var response = goAjaxEventsFormatted.request.responseText;
		
		if(response != "") {
			document.getElementById("eventsDiv").innerHTML = response.replace(/\&lt\;/g, "<").replace(/\&gt\;/g, ">");
		} else {
			document.getElementById("eventsDiv").innerHTML = "Sorry no events loaded...";
		}
	} else if(sStatus != null) {
		document.getElementById("eventsDiv").innerHTML = "Sorry an error occurred: " + sStatus;
	}
}
// starts an Ajax call to get data for given iYear (full year) and iMonth (1 based)
// if sCategoryIDs is a comma-separated list of ContentIDs then only events matching those categories will be returned
function getEventXml(iYear, iMonth, sCategoryIDs) {
	var strUrl = gstrDomain + "/webservices/event_io.asmx/getEvents";
	var strParams = "";
	var strHtml = "";
	var r = null;

	if(iYear != null) {
		giYear = iYear;
		giMonth = iMonth;
	}
	if(sCategoryIDs == null) {
		sCategoryIDs = gsActiveCategories;
	}
	strParams += (strParams == "" ? "" : "&") + "Day=" + (iYear != null ? "01/" + (iMonth < 10 ? "0" : "") + iMonth + "/" + iYear : gsDay);
	strParams += (strParams == "" ? "" : "&") + "GetMode=" + 3;
	strParams += (strParams == "" ? "" : "&") + "GroupByDay=" + true;
	strParams += (strParams == "" ? "" : "&") + "GroupByWeek=" + false;
	strParams += (strParams == "" ? "" : "&") + "GroupByMonth=" + false;
	strParams += (strParams == "" ? "" : "&") + "DateFormat=" + "yyyyMMdd";
	if(sCategoryIDs) {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=" + "1,0,2,0";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=" + sCategoryIDs;
	} else {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=";
	}
	strParams += (strParams == "" ? "" : "&") + "SortOrder=2";
	try {
		goAjaxEvents = new EdeptiveAjax();
		goAjaxEvents.postRequest(strUrl, strParams, onEventXmlResponse);
	} catch(e) {
		displayError(e.description);
	}
	// show loading animation
	document.getElementById("calendar").innerHTML = "<div id='calLoading'><img src='" + gstrDomain + "/assets/images/loading.gif' width='31' height='31' alt='Loading...' class='loading' /><br />&nbsp;&nbsp;&nbsp;Loading...</div>";
}
function onEventXmlResponse() {
	var sStatus = goAjaxEvents.checkReadyState("devnull", null, null, null);
	
	try {
	if(sStatus == "OK") {
		var root = goAjaxEvents.request.responseXML.documentElement;
		var strHtml = "";
		var arrDays, arrEvents;
		var oEvent = null;
		
		gCalendarSettings.aEventsDates = new Array();
		gCalendarSettings.aEvents = new Array();
		if(root.selectNodes("day").length > 0) {
			arrDays = root.selectNodes("day");
			for(var i = 0; i < arrDays.length; i++) {
				arrEvents = arrDays[i].selectNodes("content_item");
				for(var j = 0; j < arrEvents.length; j++) {
					oEvent = new CalendarEvent(arrEvents[j].getAttribute("id"), getText(arrEvents[j].selectSingleNode("date_start")), getText(arrEvents[j].selectSingleNode("date_end")), getText(arrEvents[j].selectSingleNode("headline")), getText(arrEvents[j].selectSingleNode("subhead")), getText(arrEvents[j].selectSingleNode("bodytext")));
					if(gCalendarSettings.aEventsDates[arrDays[i].getAttribute("date")] == null) {
						// more than one event can exist per day => hold array of them
						gCalendarSettings.aEventsDates[arrDays[i].getAttribute("date")] = new Array();
					}
					gCalendarSettings.aEventsDates[arrDays[i].getAttribute("date")].push(oEvent);
					gCalendarSettings.aEvents[oEvent.sID] = oEvent;
				}
			}
			document.getElementById('calendar').innerHTML = buildCalendar(giYear, giMonth - 1);
		} else {
			document.getElementById('calendar').innerHTML = buildCalendar(giYear, giMonth - 1);
		}
		setRefreshTime();
	}
	}catch(e) {
		alert(e.message);
	}
}

// creates a timeout to refresh the calendar data
function setRefreshTime() {
	var dateNow = new Date();
	var iMillisecondOffset = dateNow.getMinutes() * 60000 + dateNow.getSeconds() * 1000 + dateNow.getMilliseconds();
	var iMillisecondsWait = 0;
	
	switch(gCalendarSettings.iRefreshPattern) {
		case kRefreshSchool:
			// call refresh at next of 08.00, 13.00, 18.00 (or midnight)
			if(dateNow.getHours() < 8) {
				iMillisecondsWait = (8 - dateNow.getHours()) * (1000 * 60 * 60) - iMillisecondOffset;
			} else if(dateNow.getHours() < 13) {
				iMillisecondsWait = (13 - dateNow.getHours()) * (1000 * 60 * 60) - iMillisecondOffset;
			} else if(dateNow.getHours() < 18) {
				iMillisecondsWait = (18 - dateNow.getHours()) * (1000 * 60 * 60) - iMillisecondOffset;
			} else {
				iMillisecondsWait = (24 - dateNow.getHours()) * (1000 * 60 * 60) - iMillisecondOffset;
			}
			break;
		case kRefreshHourly:
			// call refresh on the next hour
			iMillisecondsWait = 1000 * 60 * 60 - iMillisecondOffset;
			break;
		case kRefreshDaily:
			// call refresh on the next day
			iMillisecondsWait = (24 - dateNow.getHours()) * (1000 * 60 * 60) - iMillisecondOffset;
			break;
	}
	// set the timeout
	if(gCalendarSettings.oRefreshTimeout != null) {
		clearTimeout(gCalendarSettings.oRefreshTimeout);
	}
	gCalendarSettings.oRefreshTimeout = setTimeout("getEventXml()", iMillisecondsWait);
	// display last updated time
	displayMessage("updated at " + dateNow.getHours() + ":" + dateNow.getMinutes());
} // end setRefreshTime

