﻿//Copyright 2009 www.lw.info
//Version  1.14
/// <reference path="jquery-1.4.1-vsdoc.js" />

lw.Calendar =
{
	Root: "",
	Id: "lw_Net_Calendar",
	CalFormName: "lw_Net_Calendar_Form",
	Events: {},
	AllCats: 0,
	Categories: {},
	EventsByCat: {},
	testEvents: {},
	CurrentField: "",
	Div: null,
	//Days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
	Days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
	//Months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", 
	//"October", "November", "December"],
	Months: ["Janvier", "Fevrier", "Mars", "Avril", "Maie", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"],
	CurrentDate: new Date(),
	CurrentZoom: 0,
	CurrentFade: 0,
	SelectedCat: 0,
	TestCategories: false,
	_initDiv: function (oldway) {
		if (oldway) {
			if (!document.getElementById(lw.Calendar.Id))
				document.write("<div id={0} class=CalendarDiv></div>".Format(lw.Calendar.Id));
			lw.Calendar.Div = document.getElementById(lw.Calendar.Id);
		}
		else {
			if (!document.getElementById(lw.Calendar.Id)) {
				var div = document.createElement("div");
				div.id = lw.Calendar.Id;
				div.className = "CalendarDiv";
				document.body.insertBefore(div, null);
				lw.Calendar.Div = document.getElementById(lw.Calendar.Id);
			}
		}
	},
	FillCalDiv: function (d, div) {

		lw.Calendar.InitEvents();
		$(div).addClass("CalendarDiv");
		var _cM = d.getMonth(), _cY = d.getFullYear();

		with (lw.Calendar) {
			var str = "{0}<div class=\"CalBody\" id=\"CalBody\">{1}</div>{2}";

			var _monthDiv = "";
			var m = ["<select id=Cal_Months onchange=\"lw.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" : ""));
				if (_cM == i) {
					_monthDiv = "<div class=month>" + Months[i].substring(0, 3) + "</div>";
				}
			}
			m.push("</select>");

			var _yearDiv = "";
			var y = ["<select id=Cal_Years onchange=\"lw.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" : ""));
				if (_cY == i) {
					_yearDiv = "<div class=year>" + i + "</div>";
				}
			}
			y.push("</select>");

			var str1 = "<div class=\"CalHeader\">\
				<img src=\"{0}/Images/t.gif\" Alt=Previous onclick=\"lw.Calendar.MoveBack()\" class=previous> \
				<img src=\"{0}/Images/t.gif\" Alt=Next onclick=\"lw.Calendar.MoveNext()\" class=next>\
				{1}{2}{3}{4} \
				</div>".Format(lw.vroot, _monthDiv, _yearDiv, m.join(""), y.join(""));
			//Format(lw.vroot, m.join(""), y.join(""));
			//<img src=\"{0}/Images/t.gif\" Alt=Today onclick=\"lw.Calendar.Today()\" class=today> \
			var str2 = CalDaysTable(d);
			var str3 = "";
			(div || Div).innerHTML = str.Format(str1, str2, str3);
		}
		var div = $("<div />");
		div.attr("id", "PopupInfo");
		lw.Calendar.popupVisible = false;
		$(document.body).append(div);
	},
	MoveNext: function () {
		var d = lw.Calendar.CurrentDate;
		d.setMonth(d.getMonth() + 1);
		lw.Calendar.InitCalValues(d);
		lw.Calendar.Change();
	},
	MoveBack: function () {
		var d = lw.Calendar.CurrentDate;
		d.setMonth(d.getMonth() - 1);
		lw.Calendar.InitCalValues(d);
		lw.Calendar.Change();
	},
	Today: function () {
		var d = new Date();
		d.setMonth(d.getMonth());
		lw.Calendar.InitCalValues(d);
		lw.Calendar.Change();
	},
	Change: function () {
		var d = lw.Calendar.CurrentDate;
		d.setMonth(document.getElementById("Cal_Months").value);
		d.setFullYear(document.getElementById("Cal_Years").value);
		document.getElementById("CalBody").innerHTML = lw.Calendar.CalDaysTable(d);
	},
	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>"];
		str.push("<thead><tr>");
		for (var i = 0; i < cols; i++)
			str.push("<td " + (i == 0 ? "class=first" : i == cols - 1 ? " class=last " + ($.browser.msie && $.browser.version == 8.0 ? " style=\"border-left-width:2px;\"" : "") : "") + ">" + lw.Calendar.Days[i].substring(0, 3) + "</td>");
		str.push("</tr></thead>");
		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 = (lw.Calendar.Days[(i + StartDay) % cols - 1 < 0 ? 6 : (i + StartDay) % cols - 1] + " - " + lw.Calendar.Months[date.getMonth()].substring(0, 3) + " " + i + " - " + date.getFullYear());
			str.push("<td title=\"{0}\" class=\"{1}\"><a href=\"javascript:void(0)\" onclick=\"lw.Calendar.DayClick(this, '{2}', '{0}')\">{3}</a></td>".Format(title, (((i == m && currentMonth) && lw.Calendar.GetDayEvents(key).length > 0) ? "CalCurrentEvent" : i == m && currentMonth ? "CalCurrent" : lw.Calendar.GetDayEvents(key).length > 0 ? "CalHasEvent" : "CalReg"), key, i));
			if ((i + StartDay) % cols == 0)
				str.push("</tr>");
		}
		str.push("</TBODY></table>");
		return str.join("");
	},
	SwitchSel: function (sel) {
		var _ = lw.Calendar;
		_.SelectedCat = Math.pow(2, parseInt(sel));
		_.Events = {};
		_.FillCalDiv(new Date(), document.getElementById("CalendarDiv"));
	},
	DayClick: function (el, key, title) {
		_ = lw.Calendar;
		var ev = _.GetDayEvents(key);
		if (ev.length == 0)
			return;
		var ret = ["<h2>" + title + "</h2>"];
		ret.push("<div class=close onclick=\"lw.Calendar.ClosePopup()\" />");
		ret.push("<div class=details>");
		for (var i = 0; i < ev.length; i++) {
			var thisEvent = _.Parse(ev[i]);
			ret.push("<h3>{0}</h3>".Format(thisEvent.title));
			ret.push("<p>{0}{1}{2}<span class=info>by {3}</span></p>".Format(
				thisEvent.time ? "<span>Time: </span>" + thisEvent.time + "<Br />" : "",
				thisEvent.location ? "<span>Location: </span>" + thisEvent.location + "<Br />" : "",
				thisEvent.description,
				thisEvent.userName)
			);
		}
		ret.push("</div>");
		var popup = $("#PopupInfo");
		var $el = $(el);
		if (!lw.Calendar.popupVisible) {
			popup.css({
				top: -300,
				left: $el.offset().left - popup.outerWidth() + 30,
				visibility: "visible",
				display: "block"
			});
		}
		popup.html(ret.join(""));
		lw.Calendar.popupVisible = true;
		popup.animate({ top: $el.offset().top - popup.height() }, { duration: 800, easing: "easeOutCirc" });
	},
	ClosePopup: function () {
		var popup = $("#PopupInfo");
		lw.Calendar.popupVisible = false;
		popup.animate({ top: -400 }, { duration: 600, easing: "easeInCirc",
			complete: function () {
				lw.Calendar.popupVisible = false;
				popup.css("display", "none");
			}
		});
	},
	Parse: function (ev) {
		return {
			id: ev[0],
			dateFrom: new Date(parseInt(/\/Date\((\d+).*/.exec(ev[1])[1])),
			dateTo: new Date(parseInt(/\/Date\((\d+).*/.exec(ev[2])[1])),
			time: ev[3],
			title: ev[4],
			location: ev[5],
			status: ev[6],
			description: ev[7],
			category: ev[8],
			userId: ev[9],
			userName: ev[10],
			categories: ev[11]
		};
	},
	GetDayEvents: function (key) {
		var _ = lw.Calendar;
		var date = new Date(key);
		date.setHours(12, 0, 0, 0);
		if (_.Events[date])
			return _.Events[date];
		var ev = [];
		var events = lw.calendarData.events;

		for (var i = 0; i < events.length; i++) {
			if (_.TestCategories && (_.SelectedCat & events[i][8]) == 0)
				continue;
			var fromDate = new Date(parseInt(/\/Date\((\d+).*/.exec(events[i][1])[1]));
			fromDate = new Date(fromDate.setHours(0, 0, 0, 1));
			var toDate = new Date(parseInt(/\/Date\((\d+).*/.exec(events[i][2])[1]));
			toDate = new Date(toDate.setHours(23, 59, 59, 999));
			if (date >= fromDate && date <= toDate)
				ev.push(events[i]);
		}
		lw.Calendar.Events[date] = ev;
		return ev;
	},
	Init: function () {
		if (!document.getElementById(lw.Calendar.Id)) {
			document.open();
			document.write("<div id={0} class=CalendarDiv></div>".Format(lw.Calendar.Id, lw.Calendar.CalFormName));
			document.close();
			lw.Calendar.Div = document.getElementById(lw.Calendar.Id);
		}
	},
	InitCalValues: function (d) {
		InitFormValue(document.getElementById("Cal_Years"), d.getFullYear());
		InitFormValue(document.getElementById("Cal_Months"), d.getMonth());

		$(".CalHeader .month").html(lw.Calendar.Months[d.getMonth()].substring(0, 3));
		$(".CalHeader .year").html(d.getFullYear());
	},
	InitEvents: function () {
		var _ = lw.Calendar;
		if (!lw.calendarData)
			return;

		var d = lw.calendarData;
		var categories = d.categories;


		if (!_.CatsInited) {
			_.SelectedCat = 0;


			var sel = document.getElementById("CalendarSelect");
			if (sel) {
				sel.options.length++;
				sel.options[0].text = "" + "Select a project";
				for (var j in categories) {
					if (typeof categories[j] == "function")
						continue;
					_.SelectedCat |= Math.pow(2, j);

					sel.options.length++;
					sel.options[sel.options.length - 1].value = j;
					sel.options[sel.options.length - 1].text = "" + categories[j];
				}
				$('#CalendarSelect').sSelect({ animationSpeed: 400 });
				$('#CalendarSelect').change(function () {
					var val = $('#CalendarSelect').getSetSSValue();
					_.SwitchSel(val);
				});
			} else {
				for (var j in categories) {
					if (typeof categories[j] == "function")
						continue;
					_.SelectedCat |= Math.pow(2, j);
				}
			}
			_.CatsInited = true;
		}
	}
}
