document.write("<script type=\"text/javascript\" src=\"assets/scripts/EdeptiveAjax.js\"></script>");


// Get URL Parameter
function gup(name){
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp( regexS );
	var results = regex.exec( window.location.href );
	if( results == null )
		return "";
	else 
		return results[1];
}

// constants
var kGetModeDay = 1, kGetModeWeek = 2, kGetModeMonth = 3, kGetModeYear = 4;
// globals
var gstrDomain = "http://" + window.location.host;
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;
var gsFilterParam = gup('filter');
var gsParentIDs = '';
var gsFromDate = null, gsToDate = null;

// Make a comma seperated list of options slected
function setCategoriesFromSelect() {
	var filter = document.getElementById('filter');
	var strOption = "";
	
	if (filter) {
		for (var i=0; i<filter.options.length; i++) {
			if (filter.options[i].selected) {
				strOption += (strOption?",":"") + filter.options[i].value;
			}
		}
		gsActiveCategories = strOption;
	}
	//alert(gsActiveCategories);
}

function formatDate(dateObj) {
	return (dateObj.getDate()<10?"0":"")+dateObj.getDate()+"/"+(dateObj.getMonth()<9?"0":"")+(dateObj.getMonth()+1)+"/"+dateObj.getFullYear();	
}

// display this weeks calendar entries
function thisWeek() {
	setCategoriesFromSelect();
	gsFromDate = gsDay;
	gsToDate = null;
	giGetMode = kGetModeWeek;
	giYear = now.getFullYear();
	giMonth = now.getMonth() + 1;
	getEventsFormatted();
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}

// display this months calendar entries
function thisMonth() {
	setCategoriesFromSelect();
	gsFromDate = gsDay;
	gsToDate = null;
	giGetMode = kGetModeMonth;
	giYear = now.getFullYear();
	giMonth = now.getMonth() + 1;
	getEventsFormatted();
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}

// display next months calendar entries
function nextMonth() {
	setCategoriesFromSelect();
	var nextMonth = new Date(now);
	nextMonth.setDate(1);
	nextMonth.setMonth(nextMonth.getMonth()+1);
	var addMonth_gsDay =(nextMonth.getDate()<10?"0":"")+nextMonth.getDate()+"/"+(nextMonth.getMonth()<9?"0":"")+(nextMonth.getMonth()+1)+"/"+nextMonth.getFullYear();	
	gsFromDate = addMonth_gsDay;
	gsToDate = null;
	giGetMode = kGetModeMonth;
	giYear = nextMonth.getFullYear();
	giMonth = nextMonth.getMonth() + 1;
	getEventsFormatted(addMonth_gsDay);
}

// display this years calendar entries
function thisYear() {
	setCategoriesFromSelect();
	gsFromDate = gsDay;
	gsToDate = null;
	giGetMode = kGetModeYear;
	giYear = now.getFullYear();
	giMonth = now.getMonth() + 1;
	getEventsFormatted();
	//getEventXml(now.getFullYear(), now.getMonth()+1);
}

// display next years calendar entries
function nextYear() {
	setCategoriesFromSelect();
	var nextYear = new Date(now);
	nextYear.setDate(1);
	nextYear.setFullYear(nextYear.getFullYear()+1);
	var addYear_gsDay =(nextYear.getDate()<10?"0":"")+nextYear.getDate()+"/"+(nextYear.getMonth()<9?"0":"")+(nextYear.getMonth()+1)+"/"+nextYear.getFullYear();	
	gsFromDate = addYear_gsDay;
	gsToDate = null;
	giGetMode = kGetModeYear;
	giYear = nextYear.getFullYear();
	giMonth = nextYear.getMonth() + 1;
	getEventsFormatted(addYear_gsDay);
}

// get content items from webservice (gets params from url)
function getEventsFormatted(sDay, iGetMode, sCategoryIDs, sParentIDs, sCategoryMatching) {
	var strUrl = gstrDomain + "/webservices/event_io.asmx/getEventsByParentFormatted";
	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=" + (sCategoryMatching != null ? sCategoryMatching : "1,0,2,0");
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=" + sCategoryIDs;
	} else {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=";
	}
	strParams += (strParams == "" ? "" : "&") + "SortOrder=1";
	strParams += (strParams == "" ? "" : "&") + "ParentIDs=" + (sParentIDs ? sParentIDs : gsParentIDs);
	strParams += (strParams == "" ? "" : "&") + "IncludeCategoryNames=true";
	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='70' height='10' 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, sCategoryMatching) {
	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=" + (sCategoryMatching != null ? sCategoryMatching : "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='70' height='10' 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, ">");
			// Edeptive R4 Admin
			try {InitialiseAdminMode();}
				catch(e){};
		} 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, sParentIDs, sCategoryMatching) {
	var strUrl = gstrDomain + "/webservices/event_io.asmx/getEventsByParent";
	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=" + (sCategoryMatching != null ? sCategoryMatching : "1,0,2,0");
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=" + sCategoryIDs;
	} else {
		strParams += (strParams == "" ? "" : "&") + "CategoryMatching=";
		strParams += (strParams == "" ? "" : "&") + "CategoryIDs=";
	}
	strParams += (strParams == "" ? "" : "&") + "SortOrder=2";
	strParams += (strParams == "" ? "" : "&") + "ParentIDs=" + (sParentIDs ? sParentIDs : gsParentIDs);
	strParams += (strParams == "" ? "" : "&") + "IncludeCategoryNames=true";
	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
