
/**
 *
 * Namespaces
 * create some namespaces to avoid collision and just be nice and tidy
 */
if(typeof redrocketcms == "undefined") var redrocketcms = new Object();
if(typeof redrocketcms.classes == "undefined") redrocketcms.classes = new Object();

/**
 *
 * ContactPage singleton
 *
 */
if(typeof redrocketcms.classes.Calendar == "undefined") new function () {
	redrocketcms.classes.Calendar = this;
	/**
	 *
	 * Constructor
	 */
	// private members
	var calendarObjects = new Object();
	var publishDir = document.location.href.indexOf("publish")==-1 ? "publish/" : "../../publish/";
	var dayNameTable = ["S", "M", "T", "W", "T", "F", "S"];
	var monthNameTable = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
	// private methods
	function getElementsByClassName(className, tag, elm){
		var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
		var tag = tag || "*";
		var elm = elm || document;
		var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
		var returnElements = [];
		var current;
		var length = elements.length;
		for(var i=0; i<length; i++){
			current = elements[i];
			if(testClass.test(current.className)){
				returnElements.push(current);
			}
		}
		return returnElements;
	}
	function getMonthDays (dateObj) {
		return new Date(dateObj.getFullYear(), dateObj.getMonth()+1, 0).getDate();
	}
	function getMonthFirstDayNum (dateObj) {
		return new Date(dateObj.getFullYear(), dateObj.getMonth(), 1).getDay();
	}
	function init (id) {
		if (calendarObjects[id]==undefined) calendarObjects[id] = new Object();
		var calendarObject = calendarObjects[id];
		calendarObject.inited = true;
		var calendarlayout = getElementsByClassName("CalendarLayout", "div", document.getElementById(id))[0];
		calendarlayout.style.display = "block";
		var table = calendarlayout.getElementsByTagName("table")[0];
		var CalendarHead = getElementsByClassName("CalendarHead", "tr", table)[0];
		var CalendarHead = CalendarHead.getElementsByTagName("td");
		CalendarHead[0].innerHTML = '<a href="javascript:redrocketcms.classes.Calendar.prev(\'' + id + '\');">&lt;</a>';
		CalendarHead[2].innerHTML = '<a href="javascript:redrocketcms.classes.Calendar.next(\'' + id + '\');">&gt;</a>';
		var CalendarWeekDays = getElementsByClassName("CalendarWeekDays", "tr", table)[0];
		CalendarWeekDays = CalendarWeekDays.getElementsByTagName("td");
		var calendarDayNameTable = calendarObject.dayNameTable ? calendarObject.dayNameTable : dayNameTable;
		for (var i=0; i<CalendarWeekDays.length; ++i) {
			CalendarWeekDays[i].innerHTML = calendarDayNameTable[i];
		}
		var CalendarDays = new Array();
		var CalendarWeeks = getElementsByClassName("CalendarWeek", "tr", table);
		for (var i=0; i<CalendarWeeks.length; ++i) {
			var rows = CalendarWeeks[i].getElementsByTagName("td");
			for (var j=0; j<rows.length; ++j) {
				CalendarDays.push(rows[j]);
			}
		}
		var EventObjectLookup = new Object();
		var EventObjects = getElementsByClassName("Event", "div", document.getElementById(id));
		for (var i=0; i<EventObjects.length; ++i) {
			var EventObject = EventObjects[i];
			EventObjectLookup[EventObject.id] = EventObject;
			EventObject.style.display = "none";
		}
		var data = new redrocketcms.classes.AjaxConnection();
		data.onLoad = function () {
			onData (id, this.getXML());
		}
		data.load(publishDir + id + "/index.xml");
		calendarObject.calendarObject = calendarObject;
		calendarObject.table = table;
		calendarObject.CalendarHead = CalendarHead;
		calendarObject.CalendarWeekDays = CalendarWeekDays;
		calendarObject.CalendarDays = CalendarDays;
		calendarObject.EventObjectLookup = EventObjectLookup;
		calendarObject.data = data;
		calendarObject.today = new Date();
		calendarObject.current = new Date(calendarObject.today.getFullYear(), calendarObject.today.getMonth(), calendarObject.today.getDate());
		updateDisplay(id);
	}
	function eventMatches (id, num) {
		var results = new Array();
		var calendarObject = calendarObjects[id];
		if (!calendarObject.events) return results;
		var today = new Date(calendarObject.current.getFullYear(), calendarObject.current.getMonth(), num, 0, 0, 0, 0).getTime();
		var tomorrow = new Date(calendarObject.current.getFullYear(), calendarObject.current.getMonth(), num+1, 0, 0, 0, 0).getTime();
		for (var i=0; i<calendarObject.events.length; ++i) {
			var event = calendarObject.events[i];
			var startsToday = event.start>=today&&event.start<=tomorrow;
			var endsToday = event.end>=today&&event.end<=tomorrow;
			if (startsToday||endsToday) results.push(event);
		}
		return results;
	}
	function updateDisplay (id) {
		var calendarObject = calendarObjects[id];
		var calendarMonthNameTable = calendarObject.monthNameTable ? calendarObject.monthNameTable : monthNameTable;
		var currentMonth = calendarObject.current.getMonth();
		var headerSting = calendarMonthNameTable[currentMonth] + " " + calendarObject.current.getFullYear();
		calendarObject.CalendarHead[1].innerHTML = headerSting;
		var start = getMonthFirstDayNum(calendarObject.current);
		var end = getMonthDays(calendarObject.current)+start;
		var CalendarDays = calendarObject.CalendarDays;
		for (var i=0; i<CalendarDays.length; ++i) {
			var CalendarDay = CalendarDays[i];
			// reset
			var label = "&nbsp;";
			var className = CalendarDay.className.split(" ");
			if (className.length>1) className = [className[0]];
			className.push("Disabled");
			CalendarDay.innerHTML = label;
			CalendarDay.className = className.join(" ");
			// only enable actual month days
			if (i<start||i>=end) continue;
			// c is the actual zero based operator
			var num = i-(start-1);
			label = num;
			// set up the days according to the items array
			className.pop();
			className.push("Enabled");
			var matches = eventMatches(id, num);
			if (matches.length>0) {
				label = '<a href="javascript:redrocketcms.classes.Calendar.showEvents(\'' + id + '\', ' + num + ');">' + num + '</a>';
				className.push("Active");
			}
			if (calendarObject.current.getDate() == num &&
				calendarObject.current.getMonth() == calendarObject.today.getMonth() && 
				calendarObject.current.getFullYear() == calendarObject.today.getFullYear()) className.push("Today");
			CalendarDay.innerHTML = label;
			CalendarDay.className = className.join(" ");
		}
	}
	function onData (id, data) {
		var calendarObject = calendarObjects[id];
		var events = new Array();
		var eventObjects = data.getElementsByTagName("event");
		for (var i=0; i<eventObjects.length; ++i) {
			var eventObject = eventObjects[i];
			var eventid = eventObject.getAttribute("id");
			var datetimeObject = eventObject.getElementsByTagName("datetime")[0];
			var repeatObject = eventObject.getElementsByTagName("repeat")[0];
			var frequencyObject = eventObject.getElementsByTagName("frequency")[0];
			var daysObject = eventObject.getElementsByTagName("days")[0];
			var startObject = eventObject.getElementsByTagName("start")[0];
			var endObject = eventObject.getElementsByTagName("end")[0];
			var event = new Object();
			event.id = eventid;
			event.type = datetimeObject.getAttribute("type");
			event.repeat = repeatObject.getAttribute("type");
			event.frequency = parseInt(frequencyObject.firstChild.nodeValue);
			event.days = daysObject.hasChilden ? daysObject.firstChild.nodeValue.split(",") : [];
			event.start = parseInt(startObject.firstChild.nodeValue);
			event.end = parseInt(endObject.firstChild.nodeValue);
			events.push(event);
		}
		calendarObject.events = events;
		updateDisplay(id);
	}
	// public methods
	this.start = function(id) {
		init(id)
	};
	this.showEvents = function(id, num) {
		var calendarObject = calendarObjects[id];
		var EventObjectLookup = calendarObject.EventObjectLookup;
		var matches = eventMatches(id, num);
		for (var prop in EventObjectLookup) {
			EventObjectLookup[prop].style.display = "none";
		}
		for (var i=0; i<matches.length; ++i) {
			var EventObject = EventObjectLookup[matches[i].id];
			var className = EventObject.className.split(" ");
			className.pop();
			className.push((i%2?"Even":"Odd"));
			EventObject.className = className.join(" ");
			EventObject.style.display = "block";
		}
	};
	this.prev = function(id) {
		var calendarObject = calendarObjects[id];
		var currentMonth = calendarObject.current.getMonth();
		var currentYear = calendarObject.current.getFullYear();
		--currentMonth;
		if (currentMonth==-1) {
			currentMonth = 11;
			--currentYear;
		}
		calendarObject.current.setFullYear(currentYear);
		calendarObject.current.setMonth(currentMonth);
		updateDisplay(id);
	};
	this.next = function(id) {
		var calendarObject = calendarObjects[id];
		var currentMonth = calendarObject.current.getMonth();
		var currentYear = calendarObject.current.getFullYear();
		++currentMonth;
		if (currentMonth==12) {
			currentMonth = 0;
			++currentYear;
		}
		calendarObject.current.setFullYear(currentYear);
		calendarObject.current.setMonth(currentMonth);
		updateDisplay(id);
	};
	this.setGlobalDayNameStringTable = function(arr) {
		dayNameTable = arr;
		for (var id in calendarObjects) if (calendarObjects[id].inited) init(id);
	};
	this.setCalendarDayNameStringTable = function(id, arr) {
		if (calendarObjects[id]==undefined) calendarObjects[id] = new Object();
		calendarObjects[id].dayNameTable = arr;
		if (calendarObjects[id].inited) init(id);
	};
	this.setGlobalMonthNameStringTable = function(arr) {
		monthNameTable = arr;
		for (var id in calendarObjects) if (calendarObjects[id].inited) init(id);
	};
	this.setCalendarMonthNameStringTable = function(id, arr) {
		if (calendarObjects[id]==undefined) calendarObjects[id] = new Object();
		calendarObjects[id].monthNameTable = arr;
		if (calendarObjects[id].inited) init(id);
	};
}
