﻿//Copyright 2009 www.liteweb.info
//Version  1.14
/// <reference path="jquery-1.4.1-vsdoc.js" />

var 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"],
    Months: ["January", "February", "March", "April", "May", "June", "July", "August", "September",
        "October", "November", "December"],
    CurrentDate: new Date(),
    CurrentZoom: 0,
    CurrentFade: 0,
    SelectedCat: 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);
            }
        }
    },
    FillCalDiv: function (d, div) {
        Calendar.InitEvents();
        $(div).addClass("CalendarDiv");
        var _cM = d.getMonth(), _cY = d.getFullYear();

        with (Calendar) {
            var str = "{0}<div class=\"CalBody\" id=\"CalBody\">{1}</div>{2}";

            var _monthDiv = "";
            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" : ""));
                if (_cM == i) {
                    _monthDiv = "<div class=month>" + Months[i] + "</div>";
                }
            }
            m.push("</select>");

            var _yearDiv = "";
            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" : ""));
                if (_cY == i) {
                    _yearDiv = "<div class=year>" + i + "</div>";
                }
            }
            y.push("</select>");

            var str1 = "<div class=\"CalHeader\"><img src=\"{0}/Images/Icons/back-purple.gif\" Alt=Previous onclick=Calendar.MoveBack()>{1}{2}<img src=\"{0}/Images/Icons/fwd-purple.gif\" Alt=Next onclick=Calendar.MoveNext()></div>".Format(lw.vroot, m.join(""), y);
            var str2 = CalDaysTable(d);
            var str3 = "";
            (div || Div).innerHTML = str.Format(str1, str2, str3);
        }
        var div = $("<div />");
        div.attr("id", "PopupInfo");
        Calendar.popupVisible = false;
        $(document.body).append(div);
    },
    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();
    },
    Today: function () {
        var d = new Date();
        d.setMonth(d.getMonth());
        Calendar.InitCalValues(d);
        Calendar.Change();
    },
    Change: function () {
        var d = Calendar.CurrentDate;
        d.setMonth(document.getElementById("Cal_Months").value);
        d.setFullYear(document.getElementById("Cal_Years").value);
        document.getElementById("CalBody").innerHTML = 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("<th " + (i == 0 ? "class=first" : i == cols - 1 ? " class=last " + ($.browser.msie && $.browser.version == 8.0 ? " style=\"border-left-width:2px;\"" : "") : "") + ">" + Trank(Calendar.Days[i], 2) + "</th>");
        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 = (Calendar.Days[(i + StartDay) % cols - 1 < 0 ? 6 : (i + StartDay) % cols - 1] + " - " + Calendar.Months[date.getMonth()] + " " + i + " - " + date.getFullYear());
            str.push("<td title=\"{0}\" class=\"{1}\"><a href=\"javascript:void(0)\" onclick=\"Calendar.DayClick(this, '{2}', '{0}')\">{3}</a></td>".Format(title, (i == m && currentMonth ? "CalCurrent" : 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 _ = Calendar;
        _.SelectedCat = Math.pow(2, parseInt(sel));
        _.Events = {};
        _.FillCalDiv(new Date(), document.getElementById("CalendarDiv"));
    },
    DayClick: function (el, key, title) {
        _ = Calendar;
        var ev = _.GetDayEvents(key);
        if (ev.length == 0)
            return;
        var ret = ["<div class=close onclick=Calendar.ClosePopup()/>"];
        ret.push("<h2>" + title + "</h2>");
        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 (!Calendar.popupVisible) {
            popup.css({
                top: -400,
                left: $el.offset().left - 300,
                visibility: "visible",
                display: "block"
            });
        }
        popup.html(ret.join(""));
        Calendar.popupVisible = true;
        popup.animate({
            top: $el.offset().top - popup.height() - 50,
            left: $el.offset().left - 300
        },
        {
            duration: 800,
            easing: "easeOutCirc"
        });
    },
    ClosePopup: function () {
        var popup = $("#PopupInfo");
        Calendar.popupVisible = false;
        popup.animate({ top: -400 }, { duration: 600, easing: "easeInCirc",
            complete: function () {
                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 date = new Date(key);
        date.setHours(0, 0, 0, 0);
        if (Calendar.Events[date])
            return Calendar.Events[date];
        var ev = [];
        var events = lw.calendarData.events;

        for (var i = 0; i < events.length; i++) {
            if ((Calendar.SelectedCat & events[i][8]) == 0)
                continue;
            var fromDate = new Date(parseInt(/\/Date\((\d+).*/.exec(events[i][1])[1]));
            var toDate = new Date(parseInt(/\/Date\((\d+).*/.exec(events[i][2])[1]));
            toDate = toDate.setHours(23, 59, 59, 999);
            if (date >= fromDate && date <= toDate)
                ev.push(events[i]);
        }
        Calendar.Events[date] = ev;
        return ev;
    },
    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());

        $(".CalHeader .month").html(Calendar.Months[d.getMonth()]);
        $(".CalHeader .year").html(d.getFullYear());
    },
    InitEvents: function () {
        var _ = 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;
        }
    }
}
