//Copyright 2009 www.liteweb.info
//Version  1.13

var Calendar =
{
	Root: "",
	Id: "liteweb_Net_Calendar",
	CalFormName: "liteweb_Net_Calendar_Form",
	Events: {},
	AllCats: 0,
	Categories: {},
	EventsByCat: {},
	testEvents: {},
	CurrentField: "",
	Div: null,
	Days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
	Months: ["January", "February", "March", "April", "May", "June", "July", "August", "September",
		"October", "November", "December"],
	CurrentDate: new Date(),
	CurrentZoom: 0,
	CurrentFade: 0,
	_initDiv: function(oldway) {
		if (oldway) {
			if (!document.getElementById(Calendar.Id))
				document.write("<div id={0} class=CalendarDiv></div>".Format(Calendar.Id));
			Calendar.Div = document.getElementById(Calendar.Id);
		}
		else {
			if (!document.getElementById(Calendar.Id)) {
				var div = document.createElement("div");
				div.id = Calendar.Id;
				div.className = "CalendarDiv";
				document.body.insertBefore(div, null);
				Calendar.Div = document.getElementById(Calendar.Id);
			}
		}
	},
	WriteIcon: function(FormName, FieldName, pos) {
		Calendar._initDiv(true);
		if (!pos)
			pos = { "top": 0, "left": 0 };
		document.open();
		var str = "<img class=\"Calendar\" src=\"{0}/Images/Icons/Calendar.Gif\" onclick=\"Calendar.ShowCalendar('{1}', '{2}', this, {3}, {4})\" /><BR/>".Format(liteweb.vroot, FormName, FieldName, pos.top, pos.left);
		document.write(str);
		document.close();
	},
	FillCalDiv: function(d, div) {
		$(div).addClass("CalendarDiv");
		var _cM = d.getMonth(), _cY = d.getFullYear();

		with (Calendar) {
			var m = ["<select id=Cal_Months onchange=Calendar.Change()>"];
			for (var i = 0; i < Months.length; i++)
				m.push("<option value={0}{2}>{1}</option>".Format(i, Months[i], _cM == i ? " selected" : ""));
			m.push("</select>");

			var y = ["<select id=Cal_Years onchange=Calendar.Change()>"];
			for (var i = d.getFullYear() - 5; i < d.getFullYear() + 5; i++)
				y.push("<option value={0}{1}>{0}</option>".Format(i, _cY == i ? " selected" : ""));
			y.push("</select>");

			var str1 = "<div class=\"CalHeader\">{0}<br />{1}</div>".Format(m.join(""), y.join(""));
			var srtMnthes = "<div class=\"CalHeader\"><img src=\"{0}/Images/Icons/back.gif\" Alt=Previous onclick=Calendar.MoveBack()>{1}<img src=\"{0}/Images/Icons/fwd.gif\" Alt=Next onclick=Calendar.MoveNext()></div>".Format(liteweb.vroot, m.join(""), y);
			var str3 = "";

			var cal = [
			/* var header = */
				"<div class=h><div class=l onclick=Calendar.MoveBack()></div><div id=CalMonth>{0}, {1}</div><div class=r onclick=Calendar.MoveNext()></div></div>".Format(Months[_cM], d.getFullYear()),
			/* var days = */
				"<div id=CalBody>",
				CalDaysTable(d),
				"</div>",
			/* var msg = */
				"<div class=info>",
				"Click on the dates Highlighted in red, to view our events.",
				"</div>",
			/* var ooption = */
				"<div title=\"Show / Hide Calendar Options\" onclick=Calendar.Options() class=options>Options</div>",
			/* var footer = */
				"<div class=f>{0}{1}</div>".Format(m.join(""), y.join(""))
			];

			(div || Div).innerHTML = cal.join("");
		}
		var div = document.createElement("div");
		div.id = "PopupInfo";
		div.innerHTML = "";
		document.body.insertBefore(div, null);
	},
	Options: function() {
		if (Calendar.HideOptions) {
			$("#calendar .f").slideUp("slow");
			Calendar.HideOptions = false;
		} else {
			$("#calendar .f").slideDown("slow");
			Calendar.HideOptions = true;
		}
	},
	StickTo: function(fieldId) {
		Calendar._initDiv();
		var el = document.getElementById(fieldId);
		el.onfocus = new Function("Calendar.ShowFieldCalendar('{0}')".Format(el.id));
	},
	ShowFieldCalendar: function(id) {

		var el = document.getElementById(id);

		with (Calendar) {
			CurrentField = el;
			var d = GetCurrentFieldDate();

			FillCalDiv(d);
			InitCalValues(d);

			var pos = GetPosition(el);


			with (Div.style) {
				var main = document.body.childNodes[0].childNodes[0];
				if (document.body.childNodes[0].nodeType == 3)
					main = document.body.childNodes[1].childNodes[1];
				var dim = new Dimension(el);
				var dimbody = new Dimension(main);
				var posbody = GetPosition(main);

				var _left = (pos.left);
				if (pos.left + 257 > (dimbody.width + posbody.left)) {
					_left = pos.left - 257 + dim.width;
				}

				top = (pos.top + dim.height) + "px";
				left = _left + "px";
				//Zoomin();
				FadeIn();
			}
		}
	},
	MoveNext: function() {
		var d = Calendar.CurrentDate;
		d.setMonth(d.getMonth() + 1);
		Calendar.InitCalValues(d);
		Calendar.Change();
	},
	MoveBack: function() {
		var d = Calendar.CurrentDate;
		d.setMonth(d.getMonth() - 1);
		Calendar.InitCalValues(d);
		Calendar.Change();
	},
	FadeIn: function() {
		with (Calendar) {
			if (CurrentFade >= 98)
				return;

			if (CurrentFade == 0)
				Div.style.visibility = "visible";

			if ("string" == typeof Div.style.filter) {
				CurrentFade += 10;
				Div.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity={0})".Format(CurrentFade);
			}
			else {
				CurrentFade += 2;
				Div.style.opacity = CurrentFade / 100;
			}
			setTimeout(FadeIn, 10);
		}
	},
	FadeOut: function() {
		with (Calendar) {

			if ("string" == typeof Div.style.filter) {
				CurrentFade -= 20;
				Div.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity={0})".Format(CurrentFade);
			}
			else {
				CurrentFade -= 10;
				Div.style.opacity = CurrentFade / 100;
			}
			if (CurrentFade < 10) {
				Div.style.visibility = "hidden";
				CurrentFade = 0;
				return;
			}

			setTimeout(FadeOut, 10);
		}
	},
	Zoomout: function() {
		with (Calendar) {
			CurrentZoom -= 10;
			Div.style.zoom = CurrentZoom + "%";
			if (CurrentZoom < 10) {
				Div.style.visibility = "hidden";
				return;
			}
			setTimeout(Zoomout, 10);
		}
	},
	Zoomin: function() {
		with (Calendar) {
			if (CurrentZoom >= 100)
				return;

			if (CurrentZoom == 0)
				Div.style.visibility = "visible";

			CurrentZoom += 20;
			Div.style.zoom = CurrentZoom + "%";
			setTimeout(Zoomin, 10);
		}
	},
	Close: function() {
		//Calendar.Zoomout();
		Calendar.FadeOut();
	},
	Change: function() {
		var d = Calendar.CurrentDate;
		d.setMonth(document.getElementById("Cal_Months").value);
		d.setFullYear(document.getElementById("Cal_Years").value);
		$("#CalBody").html(Calendar.CalDaysTable(d));
		$("#CalMonth").html(Calendar.Months[document.getElementById("Cal_Months").value] + ", " + document.getElementById("Cal_Years").value);
	},
	ShowCalendar: function(FormName, FieldName, icon, _top, _left) {
		if ("string" == typeof icon)
			icon = document.getElementById(icon);

		with (Calendar) {
			CurrentField = document.forms[FormName][FieldName];
			var d = GetCurrentFieldDate();

			FillCalDiv(d);

			InitCalValues(d);

			var pos = GetPosition(icon);

			with (Div.style) {
				top = (pos.top + _top) + "px";
				left = pos.left + _left + (new Dimension(icon)).width + 2 + "px";
				//Zoomin();
				FadeIn();
			}
		}
	},
	CalDaysTable: function(date) {
		var m = date.getDate();
		var cols = 7, rows = 6;
		var date1 = new Date(date.toString());
		date1.setDate(1);
		var StartDay = parseInt(date1.getDay());
		var bool = 1, start = 0;
		var tm = date.getMonth() + 1;
		var limit = 30;
		if ((tm == 1) || (tm == 3) || (tm == 5) || (tm == 7) || (tm == 8) || (tm == 10) || (tm == 12))
			limit = 31;
		if (tm == 2) {
			if (parseInt(date.getFullYear()) % 4 == 0)
				limit = 29;
			else
				limit = 28;
		}
		var currentMonth = date.getMonth() == (new Date()).getMonth();
		var str = ["<table cellspacing=0 cellpadding=0>"];
		for (var i = 0; i < cols; i++)
			str.push("<th>" + Trank(Calendar.Days[i], 10) + "</th>");
		//str.push("</th>");
		var IsContinue = 1;
		str.push("<tr>" + ((StartDay > 0) ? "<td colspan=" + StartDay + ">" + ("&nbsp;") + "</td>" : ""));



		for (var i = 1; i <= limit; i++) {
			var key = "{0}/{1}/{2}".Format(tm, i, date.getFullYear());
			if ((i + StartDay) % cols == 1 && i > 1)
				str.push("<tr>");
			var title = (Calendar.Days[(i + StartDay) % cols - 1 < 0 ? 6 : (i + StartDay) % cols - 1] + " - " + Calendar.Months[date.getMonth()] + " " + i + " - " + date.getFullYear());
			var events = Calendar.Events[key];

			if (events != null && events.length > 0) {
				events = "<span class=\"calevent\">" + events[0][0] + "</span><span>" + "</span>";
			}
			else {
				events = "";
			}
			str.push("<td title=\"{0}\" class=\"{1}\"><a href=\"javascript:void(0)\" onclick=\"Calendar.DayClick(this, '{2}', '{0}')\"><span class=day-no>{3}</span>{4}</a></td>".Format(title, (i + 1 == m && currentMonth ? "CalCurrent" : (Calendar.testEvents && Calendar.testEvents[key] ? "CalHasEvent" : "CalReg")), key, i, events));
			if ((i + StartDay) % cols == 0)
				str.push("</tr>");
		}
		str.push("</TBODY></table>");
		return str.join("");
	},
	SwitchSel: function(sel) {
		var _ = Calendar;

		var cond = _.AllCats;

		if (sel.selectedIndex != 0)
			cond = Math.pow(2, parseInt(sel.value));

		_.testEvents = {};

		for (var i in _.Events) {
			for (var j = 0; j < _.Events[i].length; j++) {
				if ((_.Events[i][j][2] & cond) != 0)
					_.testEvents[i] = true;
			}
		}

		_.FillCalDiv(new Date(), document.getElementById("CalendarDiv"));
	},
	DayClick: function(el, key, title) {
		var _ = Calendar;
		if (_.Events && _.Events[key]) {
			var calEntries = [];

			var cond = _.AllCats;

			var ar = [];
			for (var j = 0; j < _.Events[key].length; j++) {
				ar.push(_.Events[key][j][0]);
			}
			if (ar.length > 0)
				calEntries.push("<p><B>{0}:</b><BR>{1}</p>".Format("MSANO", ar.join("<BR />")));

			if (calEntries.length > 0)
				InfoPopup(el, "<div class=title>{0}</div><div class=cal-text>{1}</div><div title=\"Close\" onclick=\"HideInfoPopup()\" class=\"close\"><img src={2}/images/t.gif /></div>".Format(
					title, calEntries.join(""), liteweb.vroot));
		}
		return;
	},
	GetCurrentFieldDate: function() {
		with (Calendar) {
			if (CurrentField != null) {
				try {
					var d = new Date(CurrentField.value);
				}
				catch (e) { }
				if (isNaN(d))
					return new Date();
				return d;
			}
			else
				return new Date();
		}
	},
	Init: function() {
		if (!document.getElementById(Calendar.Id)) {
			document.open();
			document.write("<div id={0} class=CalendarDiv></div>".Format(Calendar.Id, Calendar.CalFormName));
			document.close();
			Calendar.Div = document.getElementById(Calendar.Id);
		}
	},
	InitCalValues: function(d) {
		InitFormValue(document.getElementById("Cal_Years"), d.getFullYear());
		InitFormValue(document.getElementById("Cal_Months"), d.getMonth());
	},
	InitEvents: function(events, categories) {
		var _ = Calendar;
		var e = _.Events;
		var c = _.EventsByCat;
		_.Categories = categories;
		var cats = _.Categories;
		for (var i = 0; i < events.length; i++) {
			var r = events[i];
			if ("object" != typeof r || r.length < 3)
				continue;
			if (e[r[1]])
				e[r[1]].push(r);
			else
				e[r[1]] = [r];
			_.testEvents[r[1]] = true;
		}
		var sel = document.getElementById("CalendarSelect");
		if (sel) {
			sel.options.length++;
			sel.options[0].text = "Select your school";
			for (var j = 0; j < categories.length; j++) {
				_.AllCats |= Math.pow(2, categories[j][0]);
				sel.options.length++;
				sel.options[sel.options.length - 1].value = categories[j][0];
				sel.options[sel.options.length - 1].text = categories[j][1];
			}
		}
	}
}