﻿/* Client-side access to querystring name=value pairs Version 1.3 28 May 2008 License (Simplified BSD): http://adamv.com/dev/javascript/qslicense.txt */
function Querystring(qs) { this.params = {}; if (qs == null) qs = location.search.substring(1, location.search.length); if (qs.length == 0) return; qs = qs.replace(/\+/g, ' '); var args = qs.split('&'); for (var i = 0; i < args.length; i++) { var pair = args[i].split('='); var name = decodeURIComponent(pair[0]); var value = (pair.length == 2) ? decodeURIComponent(pair[1]) : name; this.params[name] = value; } }
Querystring.prototype.get = function(key, default_) { var value = this.params[key]; return (value != null) ? value : default_; }
Querystring.prototype.contains = function(key) { var value = this.params[key]; return (value != null); }
/**/

function registerNS(ns) { var nsParts = ns.split("."); var root = window; for (var i = 0; i < nsParts.length; i++) { if (typeof root[nsParts[i]] == "undefined") root[nsParts[i]] = new Object(); root = root[nsParts[i]]; } }
registerNS("eom.ecl.eec");


/** copy events **/
//jQuery.fn.extend({
//    copyEvents: function(from) {
//        jQuery.event.copy(from, this);
//        return this;
//    },
//    copyEventsTo: function(to) {
//        jQuery.event.copy(this, to);
//        return this;
//    },
//    cloneWithEvents: function(deep) {
//        return this.clone(deep).copyEvents(this);
//    }
//});

//jQuery.event.copy = function(from, to) {
//    from = (from.jquery) ? from : jQuery(from);
//    to = (to.jquery) ? to : jQuery(to);

//    if (!from.size() || !from[0].events || !to.size()) return;

//    var events = from[0].events;
//    to.each(function() {
//        for (var type in events)
//            for (var handler in events[type])
//            jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
//    });
//};


/********************/


var monthOfyear = new Array();
monthOfyear[0] = "January";
monthOfyear[1] = "February";
monthOfyear[2] = "March";
monthOfyear[3] = "April";
monthOfyear[4] = "May";
monthOfyear[5] = "June";
monthOfyear[6] = "July";
monthOfyear[7] = "August";
monthOfyear[8] = "September";
monthOfyear[9] = "October";
monthOfyear[10] = "November";
monthOfyear[11] = "December";

var dayOfWeek = new Array();
dayOfWeek[0] = "Sunday";
dayOfWeek[1] = "Monday";
dayOfWeek[2] = "Tuesday";
dayOfWeek[3] = "Wednesday";
dayOfWeek[4] = "Thursday";
dayOfWeek[5] = "Friday";
dayOfWeek[6] = "Saturday";

eom.ecl.eec.CalendarDS = function(ws_accesspoint, calendarEventData_Alias, calendarEventTitle_Alias, calendarEventSummary_Alias, calendarEventDetails_Alias, calendarCategoryTitle_Alias, calendarCategoryColor_Alias, calendarId, calendarEvent_NodeTypeAliasId, category_NodeAliasId) {
    this._ws_accesspoint = ws_accesspoint;
    this._calendarEventData_Alias = calendarEventData_Alias;
    this._calendarEventTitle_Alias = calendarEventTitle_Alias;
    this._calendarEventSummary_Alias = calendarEventSummary_Alias;
    this._calendarEventDetails_Alias = calendarEventDetails_Alias;
    this._calendarCategoryTitle_Alias = calendarCategoryTitle_Alias;
    this._calendarCategoryColor_Alias = calendarCategoryColor_Alias;
    this._calendarId = calendarId;
    this._calendarEvent_NodeTypeAliasId = calendarEvent_NodeTypeAliasId;
    this._category_NodeAliasId = category_NodeAliasId;

    this.data = "\"calendarEventData_Alias\":\"" + this._calendarEventData_Alias + "\"";
    this.data += ",\"calendarEventTitle_Alias\":\"" + this._calendarEventTitle_Alias + "\"";
    this.data += ",\"calendarEventSummary_Alias\":\"" + this._calendarEventSummary_Alias + "\"";
    this.data += ",\"calendarEventDetails_Alias\":\"" + this._calendarEventDetails_Alias + "\"";
    this.data += ",\"calendarCategoryTitle_Alias\":\"" + this._calendarCategoryTitle_Alias + "\"";
    this.data += ",\"calendarCategoryColor_Alias\":\"" + this._calendarCategoryColor_Alias + "\"";
    this.data += ",\"calendarId\":\"" + this._calendarId + "\"";
    this.data += ",\"calendarEvent_NodeTypeAliasId\":\"" + this._calendarEvent_NodeTypeAliasId + "\"";
    this.data += ",\"category_NodeAliasId\":\"" + this._category_NodeAliasId + "\"";
}
eom.ecl.eec.CalendarDS.prototype.getEvents = function(start, end, callback) {
    var ds = this;
    var eventsList;
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{" + ds.data + ",\"start\":\"" + start + "\", \"end\":\"" + end + "\"}",
        dataFilter: function(data) {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                    typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: ds._ws_accesspoint + "/getEvents",
        success: function(msg) {
            callback(msg);
        },
        failure: function(msg) {
            //$("#Result").text("Modifiers did not load");
            alert(msg);
        }
    });
}
eom.ecl.eec.CalendarDS.prototype.getCalendars = function(callback) {
    var ds = this;
    var calendarsList;
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{" + ds.data + "}",
        dataFilter: function(data) {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                    typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: ds._ws_accesspoint + "/getCalendars",
        success: function(msg) {
            callback(msg);
        },
        failure: function(msg) {
            //$("#Result").text("Modifiers did not load");
            alert(msg);
        }
    });
}

// calendar object
eom.ecl.eec.Calendar = function(ds) {
    var today = new Date();
    this.year = today.getFullYear();
    this.month = today.getMonth();
    this.day = today.getDate();

    this.datasource = ds;

    // instantiate and bind default view
    this.view = new eom.ecl.eec.CalendarMonthView(this, this.year, this.month);

    // calendar (category) selector
    this.cs = new eom.ecl.eec.CalendarSelector($("#eec-calendars"), this);
}

eom.ecl.eec.Calendar.prototype.init = function() {
    this.view.render();
    this.cs.loadCalendarsFromDataSource(this.datasource);
    this.view.loadEvents();
}

eom.ecl.eec.Calendar.prototype.DateSelected = function() {
    this.view.Day = this.ds.Day;
    this.view.Month = this.ds.Month;
    this.view.Year = this.ds.Year;
    this.view.RefreshView();
}

eom.ecl.eec.Calendar.prototype.viewDateSelected = function() {
    var cal = this;
    cal.view.RefreshView();
    cal.DisplayDate();
}

eom.ecl.eec.Calendar.prototype.DisplayDate = function() {
    //var cal = this;
    //$("#eom_ecl_eec_viewselector_date").html(cal.view.formatDisplayDate());
}

eom.ecl.eec.Calendar.prototype.LoadEvents = function(calEvents) {
    this.view.addCalendarEvents(calEvents);
}


//// date selector object
//eom.ecl.eec.DateSelector = function(cal, y, m, d) {
//    this.Calendar = cal;
//    this.Year = y;
//    this.Month = m;
//    this.Day = d;
//    this.containerId = "eom_ecl_eec_dateselector";
//    this.monthyearLinkId = "eom_ecl_eec_dateselector_monthyear"
//    this.monthyearLink = $("#" + this.monthyearLinkId);
//}
//eom.ecl.eec.DateSelector.prototype.setYear = function(y) { this.Year = y; };
//eom.ecl.eec.DateSelector.prototype.setMonth = function(m) { this.Month = m; };
//eom.ecl.eec.DateSelector.prototype.setDay = function(d) { this.Day = d; };
//eom.ecl.eec.DateSelector.prototype.bindMonthYearLink = function() {
//    var ds = this;
//    this.monthyearLink.attr('href', 'javascript:void(0)');
//    this.monthyearLink.bind('click', function() {
//        alert(ds.Year + ' - ' + ds.Month + ' - ' + ds.Day);
//    });
//}
//eom.ecl.eec.DateSelector.prototype.refreshSelector = function() {
//    var viewToShow = eom_ecl_eec_currentView;
//    var ds = this;
//    $("#eom_ecl_eec_dateselector > ul.DateSelector").load('?webmethod=dateselector&' + constructNewQueryString(ds.Year, ds.Month, ds.Day, viewToShow) + " #eom_ecl_eec_dateselector > ul.DateSelector > li ", null, function() {
//        ds.displayDate();
//        ds.bindDays();
//    });
//};

//eom.ecl.eec.DateSelector.prototype.displayDate = function() {

//    this.monthyearLink.html(monthOfyear[this.Month - 1] + ' ' + this.Year);
//}

//eom.ecl.eec.DateSelector.prototype.previous = function() {
//    this.Month -= 1;
//    if (this.Month == 0) {
//        this.Month = 12;
//        this.Year -= 1;
//    }
//    this.refreshSelector();
//}

//eom.ecl.eec.DateSelector.prototype.next = function() {
//    this.Month += 1;
//    if (this.Month == 13) {
//        this.Month = 1;
//        this.Year += 1;
//    }
//    this.refreshSelector();
//};

//eom.ecl.eec.DateSelector.prototype.bind = function() {
//    var ds = this;
//    $(document).find("a#eom_ecl_eec_dateselector_lnk_prev").attr('href', 'javascript:void(0)');
//    $(document).find("a#eom_ecl_eec_dateselector_lnk_prev").bind('click', function() {
//        ds.previous();
//    });

//    $(document).find("a#eom_ecl_eec_dateselector_lnk_next").attr('href', 'javascript:void(0)');
//    $(document).find("a#eom_ecl_eec_dateselector_lnk_next").bind('click', function() {
//        ds.next();
//    });
//    this.bindMonthYearLink();
//    this.bindDays();
//};

//eom.ecl.eec.DateSelector.prototype.bindDays = function() {
//    var ds = this;
//    $("#eom_ecl_eec_dateselector > ul.DateSelector > li > a").attr('href', 'javascript:void(0)');
//    $("#eom_ecl_eec_dateselector > ul.DateSelector > li > a").bind('click', function() {
//        var selectedDate = this.id;
//        selectedDate = selectedDate.replace('eom_ecl_eec_ds_day_', '');
//        alert('selected date: ' + selectedDate);
//        $(this).closest('ul.DateSelector').find('a').removeClass('selected');
//        $(this).addClass('selected');

//        var selectedYear = parseInt(selectedDate.substring(0, 4));
//        var selectedMonth = parseInt(selectedDate.substring(5, 7));
//        var selectedDay = parseInt(selectedDate.substring(8));
//        ds.selectDate(selectedYear, selectedMonth, selectedDay);
//    });
//}
//eom.ecl.eec.DateSelector.prototype.selectDate = function(y, m, d) {
//    this.Year = y;
//    this.Month = m;
//    this.Day = d;
//    this.Calendar.DateSelected();
//}



// calendar view
eom.ecl.eec.CalendarView = function(cal, y, m, d, v) {
    this.Calendar = cal;
    this.Day = d;
    this.Month = m;
    this.Year = y;
    this.ViewName = v;
}


eom.ecl.eec.CalendarView.prototype.formatDisplayDate = function() {
    //    return monthOfyear[this.Month - 1] + this.Day + ', ' + this.Year;
}

eom.ecl.eec.CalendarView.prototype.bind = function(year, month, day) {
    //    var cv = this;
    //    $(document).find("#eom_ecl_eec_viewselector").find("a#lnk_prev").attr('href', 'javascript:void(0)');
    //    $(document).find("#eom_ecl_eec_viewselector").find("a#lnk_prev").bind('click', function() {
    //        cv.previous();
    //    });

    //    $(document).find("#eom_ecl_eec_viewselector").find("a#lnk_next").attr('href', 'javascript:void(0)');
    //    $(document).find("#eom_ecl_eec_viewselector").find("a#lnk_next").bind('click', function() {
    //        cv.next();
    //    });
}

eom.ecl.eec.CalendarMonthView = function(cal, y, m) {
    eom.ecl.eec.CalendarView.call(this, cal, y, m, 1, 'm');
}
eom.ecl.eec.CalendarMonthView.prototype = new eom.ecl.eec.CalendarView();

eom.ecl.eec.CalendarMonthView.prototype.next = function() {
    this.Month += 1;
    if (this.Month == 12) {
        this.Month = 0;
        this.Year += 1;
    }
    this.Calendar.viewDateSelected();
}

eom.ecl.eec.CalendarMonthView.prototype.previous = function() {
    this.Month -= 1;
    if (this.Month == -1) {
        this.Month = 11;
        this.Year -= 1;
    }
    this.Calendar.viewDateSelected();
}

eom.ecl.eec.CalendarMonthView.prototype.render = function(calendarJqueryElement) {
    var mw = this;
    var calendarDiv = $("#eec-mw");


    calendarDiv.append(mw.renderCalendarNav());
    calendarDiv.append("<div class=\"eec_ecl_eom_clr\">&nbsp;</div>");



    var calendarNav = $("<div id=\"eec-mw-header\" class=\"eec-mw-header\"></div>");

    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[0] + "\">" + dayOfWeek[0] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[1] + "\">" + dayOfWeek[1] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[2] + "\">" + dayOfWeek[2] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[3] + "\">" + dayOfWeek[3] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[4] + "\">" + dayOfWeek[4] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[5] + "\">" + dayOfWeek[5] + "</div>");
    calendarNav.append("<div class=\"eec-mw-header-day " + dayOfWeek[6] + "\">" + dayOfWeek[6] + "</div>");

    calendarDiv.append(calendarNav);


    var calendarDays = $("<div  id=\"eec-mw-days\" class=\"eec-mw-days\"></div>");

    var startDate = new Date(this.Year, this.Month, 1);
    var endDate = new Date(this.Year, this.Month, daysInMonth(startDate));

    startDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() - startDate.getDay());
    endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + (6 - endDate.getDay()));
    var currentDate = startDate;
    while ((endDate - currentDate) >= 0) {

        calendarDays.append(this.renderCalendarDay(currentDate, calendarDiv));
        currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate() + 1);
    }


    calendarDiv.append(calendarDays);
}

eom.ecl.eec.CalendarMonthView.prototype.renderCalendarNav = function() {
    var cv = this;
    var calNav = $("<div id=\"eec-mw-nav\"></div>");

    var lnkPrev = $("<a id=\"eec-mw-nav-lnkPrev\"></a>");
    lnkPrev.addClass("eec-mw-nav-lnkPrev");
    //lnkPrev.html("&lt;");
    lnkPrev.attr('href', 'javascript:void(0);');
    lnkPrev.bind('click', function() {
        cv.previous();
    });
    calNav.append(lnkPrev);


    var calNavDisplayDate = $("<span id=\"eec-mw-nav-date\"></span>");
    var currentDate = new Date(this.Year, this.Month, this.Day);
    calNavDisplayDate.html(monthOfyear[currentDate.getMonth()] + "&nbsp;" + currentDate.getFullYear());
    calNav.append(calNavDisplayDate);



    var lnkNext = $("<a id=\"eec-mw-nav-lnkNext\"></a>");
    lnkNext.addClass("eec-mw-nav-lnkNext");
    //lnkNext.html("&gt;");
    lnkNext.attr('href', 'javascript:void(0);');
    lnkNext.bind('click', function() {
        cv.next();
    });
    calNav.append(lnkNext);

    calNav.append("<div class=\"eec_ecl_eom_clr\">&nbsp;</div>");

    return calNav;
}

eom.ecl.eec.CalendarMonthView.prototype.renderCalendarDay = function(date) {
    var calDay = $("<div id=\"eec-mw-day-" + date.valueOf() + "\"></div>");
    calDay.addClass("eec-mw-day");
    calDay.addClass(dayOfWeek[date.getDay()]);


    if ((this.Year == date.getFullYear()) && (this.Month == (date.getMonth()))) {
        calDay.addClass("thisMonth");

    } else {
        //alert(this.Year + "/" + this.Month + " - " + date.getFullYear() + "/" + date.getMonth());
        //alert(date + " - " + this.Year + " " + this.Month);
    }


    var today = new Date();
    if ((today.getFullYear() == date.getFullYear()) && (today.getMonth() == date.getMonth()) && (today.getDate() == date.getDate())) {
        calDay.addClass("today");
    }





    var calDayDate = $("<span >" + date.getDate() + "</span>");
    calDayDate.addClass("eec-mw-day-date");

    calDay.append(calDayDate);


    var moreEventsLink = $("<a></a>");
    moreEventsLink.addClass("eec-mw-day-more-link");
    moreEventsLink.bind('click', function() {
        var moreEventsContainer = $("<div></div>");
        moreEventsContainer.addClass("eec-mw-day-more-events");

        //        var htmlCopy = $("#" + calDay.attr('id')).html();

        //        moreEventsContainer.html(htmlCopy);

        //calDay.children.clone().appendTo(moreEventsContainer);
        calDay.children().clone(true).each(function() {
            if ($(this).attr('id')) {
                $(this).attr('id', "eec-mw-day-more-link" + $(this).attr('id'))
            }
            $(this).find("*").each(function() {
                if ($(this).attr('id')) {
                    $(this).attr('id', eec - mw - day - more - link + $(this).attr('id'))
                }
            });
            $(this).appendTo(moreEventsContainer);
        });




        moreEventsContainer.find('.eec-mw-day-more-link').remove();

        var moreEventsContainerTitle = $("<div><div>");
        moreEventsContainerTitle.addClass("eec-mw-day-more-events-title");

        var moreEventsContainerTitleText = $("<div><div>");
        moreEventsContainerTitleText.addClass("eec-mw-day-more-events-title-text");
        moreEventsContainerTitleText.html(dayOfWeek[date.getDay()] + ", " + monthOfyear[date.getMonth()] + " " + date.getDate());



        var moreEventsContainerCloseButton = $("<a></a>");
        moreEventsContainerCloseButton.addClass("eec-mw-day-more-events-close");
        moreEventsContainerCloseButton.html("X");
        moreEventsContainerCloseButton.attr('href', 'javascript:void(0);');
        moreEventsContainerCloseButton.bind('click', function() {
            moreEventsContainer.remove();
        });

        moreEventsContainerTitle.append(moreEventsContainerTitleText);
        moreEventsContainerTitle.append(moreEventsContainerCloseButton);
        moreEventsContainerTitle.append("<div class=\"eec_ecl_eom_clr\">&nbsp;</div>");

        moreEventsContainer.prepend(moreEventsContainerTitle);
        //        moreEventsContainer.find(".eec-mw-calendarEvent").each(function(){
        //           $(this).show();
        //        });
        moreEventsContainer.find(".eec-mw-day-date").remove();

        calDay.append(moreEventsContainer);
    });
    moreEventsLink.attr('href', 'javascript:void(0);');
    moreEventsLink.html("<span class=\"eec-mw-day-more-counter\">0</span> more events");

    calDay.append(moreEventsLink);
    calDay.moreEventsLink = moreEventsLink;
    moreEventsLink.hide();

    return calDay;
}

eom.ecl.eec.CalendarMonthView.prototype.loadEvents = function() {
    var mw = this;

    var startDate = new Date(this.Year, this.Month, 1);
    var endDate = new Date(this.Year, this.Month, daysInMonth(startDate));

    startDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() - startDate.getDay());
    endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + (6 - endDate.getDay()));


    var strStartDate = startDate.getFullYear() + "-" + (startDate.getMonth() + 1) + "-" + startDate.getDate();
    var strEndDate = endDate.getFullYear() + "-" + (endDate.getMonth() + 1) + "-" + endDate.getDate();

    mw.addCalendarEvents(mw.Calendar.datasource.getEvents(strStartDate, strEndDate, function(events) {
        mw.addCalendarEvents(events);
        mw.Calendar.cs.filterCategories();
        mw.calculateDayEventsVisiblity();
        mw.Calendar.cs.applyCalendarStyles();
    }));
}

eom.ecl.eec.CalendarMonthView.prototype.addCalendarEvents = function(calendarEvents) {
    var mw = this;
    for (key in calendarEvents) {
        mw.addCalendarEvent(calendarEvents[key]);
    }
}

eom.ecl.eec.CalendarMonthView.prototype.addCalendarEvent = function(calendarEvent) {
    eventDate = parseDotNetJsonDate(calendarEvent.start);
    var cv = this;


    if (eventDate) {
        eventDate.setHours(0);
        eventDate.setMinutes(0);
        eventDate.setSeconds(0);
        //eventDate = new Date(eventDate.getFullYear(), eventDate.getMonth(), eventDate.getDate());
        var dayDiv = $("#eec-mw-day-" + eventDate.valueOf());
        if (dayDiv) {
            var calEventTitle = $("<span><span>");
            calEventTitle.html(calendarEvent.title);

            var calEventLink = $("<a></a>");
            calEventLink.addClass("eec-mw-calendarEvent-Link");
            //calEventLink.attr("href", calendarEvent.url);
            calEventLink.html(calendarEvent.title);
            calEventLink.attr("href", "javascript:void(0);");
            calEventLink.bind('click', { calendarView: cv, summaryEventDate: eventDate, eventCategoryId: calendarEvent.category }, function(e) {
                summaryEventDate = e.data.summaryEventDate;
                var calendarView = e.data.calendarView;
                var eventCategoryId = e.data.eventCategoryId;
                $(document).find(".eec-mw-eventSummary").remove();
                var eventSummaryPopup = $("<div></div>");
                eventSummaryPopup.attr('id', "eec-mw-calendarEvent-summary-" + calendarEvent.id);
                eventSummaryPopup.addClass("eec-mw-eventSummary");

                var eventSummaryPopupTitle = $("<div></div>");
                eventSummaryPopupTitle.addClass("eec-mw-calendarEvent-summary-title");


                var eventSummaryPopupTitleText = $("<span></span>");
                eventSummaryPopupTitleText.addClass("eec-mw-calendarEvent-summary-title-text");
                eventSummaryPopupTitleText.html(monthOfyear[summaryEventDate.getMonth()] + " " + summaryEventDate.getDate() + " " + summaryEventDate.getFullYear());

                var eventSummaryPopupTitleClose = $("<a></a>");
                eventSummaryPopupTitleClose.addClass("eec-mw-calendarEvent-summary-title-close");
                eventSummaryPopupTitleClose.html('X');
                eventSummaryPopupTitleClose.attr('href', 'javascript:void(0);');
                eventSummaryPopupTitleClose.bind('click', function() {
                    eventSummaryPopup.remove();
                });

                eventSummaryPopupTitle.append(eventSummaryPopupTitleText);
                eventSummaryPopupTitle.append(eventSummaryPopupTitleClose);
                eventSummaryPopup.append(eventSummaryPopupTitle);


                var eventSummaryPopupContent = $("<div></div>");
                eventSummaryPopupContent.addClass("eec-mw-calendarEvent-summary-content");

                var eventSummaryPopupContent_eventTitle = $("<h1></h1>");
                eventSummaryPopupContent_eventTitle.html(calendarEvent.title);
                eventSummaryPopupContent.append(eventSummaryPopupContent_eventTitle);

                // event date
                var eventSummaryPopupContent_eventDate = $("<div></div>");
                eventSummaryPopupContent_eventDate.addClass("eec-mw-calendarEvent-summary-content-eventdate");
                eventSummaryPopupContent_eventDate.addClass("eec-mw-calendarEvent-summary-content-eventproperty");

                var eventSummaryPopupContent_eventDate_label = $("<span></span>");
                eventSummaryPopupContent_eventDate_label.addClass("label");
                eventSummaryPopupContent_eventDate_label.html("Date:");

                var eventSummaryPopupContent_eventDate_value = $("<span></span>");
                eventSummaryPopupContent_eventDate_value.addClass("value");
                eventSummaryPopupContent_eventDate_value.html(monthOfyear[summaryEventDate.getMonth()] + " " + (summaryEventDate.getDate()) + " " + summaryEventDate.getFullYear());


                eventSummaryPopupContent_eventDate.append(eventSummaryPopupContent_eventDate_label);
                eventSummaryPopupContent_eventDate.append(eventSummaryPopupContent_eventDate_value);
                eventSummaryPopupContent.append(eventSummaryPopupContent_eventDate);



                eventStartDate = new Date(parseDotNetJsonDate(calendarEvent.start));
                eventEndDate = new Date(parseDotNetJsonDate(calendarEvent.end));

                if ((eventStartDate.getHours() != 0) || (eventStartDate.getMinutes() != 0)) {

                    var startHour = eventStartDate.getHours();
                    var startMinute = eventStartDate.getMinutes();
                    if (startMinute < 10) { startMinute = "0" + startMinute }

                    var ampm = "am";
                    if (startHour > 12) { startHour -= 12; ampm = "pm"; }


                    // event start Time
                    var eventSummaryPopupContent_eventStartTime = $("<div></div>");
                    eventSummaryPopupContent_eventStartTime.addClass("eec-mw-calendarEvent-summary-content-eventstarttime");
                    eventSummaryPopupContent_eventStartTime.addClass("eec-mw-calendarEvent-summary-content-eventproperty");

                    var eventSummaryPopupContent_eventStartTime_label = $("<span></span>");
                    eventSummaryPopupContent_eventStartTime_label.addClass("label");
                    eventSummaryPopupContent_eventStartTime_label.html("Start:");

                    var eventSummaryPopupContent_eventStartTime_value = $("<span></span>");
                    eventSummaryPopupContent_eventStartTime_value.addClass("value");
                    eventSummaryPopupContent_eventStartTime_value.html(startHour + ":" + startMinute + " " + ampm);

                    eventSummaryPopupContent_eventStartTime.append(eventSummaryPopupContent_eventStartTime_label);
                    eventSummaryPopupContent_eventStartTime.append(eventSummaryPopupContent_eventStartTime_value);
                    eventSummaryPopupContent.append(eventSummaryPopupContent_eventStartTime);

                    if ((eventEndDate.getHours() != eventStartDate.getHours()) || (eventEndDate.getMinutes() != eventStartDate.getMinutes())) {

                        var endHour = eventEndDate.getHours();
                        var endMinute = eventEndDate.getMinutes();
                        if (endMinute < 10) {
                            endMinute = '0' + endMinute;
                        }

                        var endAmpm = "am";
                        if (endHour > 12) { endHour -= 12; endAmpm = "pm"; }


                        // event start Time
                        var eventSummaryPopupContent_eventEndTime = $("<div></div>");
                        eventSummaryPopupContent_eventEndTime.addClass("eec-mw-calendarEvent-summary-content-eventendtime");
                        eventSummaryPopupContent_eventEndTime.addClass("eec-mw-calendarEvent-summary-content-eventproperty");

                        var eventSummaryPopupContent_eventEndTime_label = $("<span></span>");
                        eventSummaryPopupContent_eventEndTime_label.addClass("label");
                        eventSummaryPopupContent_eventEndTime_label.html("End:");

                        var eventSummaryPopupContent_eventEndTime_value = $("<span></span>");
                        eventSummaryPopupContent_eventEndTime_value.addClass("value");
                        eventSummaryPopupContent_eventEndTime_value.html(endHour + ":" + endMinute + " " + endAmpm);

                        eventSummaryPopupContent_eventEndTime.append(eventSummaryPopupContent_eventEndTime_label);
                        eventSummaryPopupContent_eventEndTime.append(eventSummaryPopupContent_eventEndTime_value);
                        eventSummaryPopupContent.append(eventSummaryPopupContent_eventEndTime);
                    }
                }

                var eventSummaryPopupContent_eventSummaryDiv = $("<div></div>");
                eventSummaryPopupContent_eventSummaryDiv.addClass("eec-mw-calendarEvent-summary-content-eventsummary");
                eventSummaryPopupContent_eventSummaryDiv.addClass("eec-mw-calendarEvent-summary-content-eventproperty");
                eventSummaryPopupContent_eventSummaryDiv.html(calendarEvent.summary + "&nbsp;");
                eventSummaryPopupContent.append(eventSummaryPopupContent_eventSummaryDiv);





                var cat = calendarView.Calendar.cs.getCalendarById(eventCategoryId);
                if (cat) {
                    var eventSummaryPopupContent_eventCategoryDiv = $("<div></div>");

                    eventSummaryPopupContent_eventCategoryDiv.addClass("eec-mw-calendarEvent-summary-content-eventsCategory");
                    eventSummaryPopupContent_eventCategoryDiv.addClass("eec-mw-calendarEvent-summary-content-eventproperty");

                    eventSummaryPopupContent_eventCategoryDiv.append("<div class=\"eec-mw-calendarEvent-summary-content-eventsCategory-indicator categoryStyle-" + cat.Color + "\">&nbsp;</div>");
                    eventSummaryPopupContent_eventCategoryDiv.append("<div class=\"eec-mw-calendarEvent-summary-content-eventsCategory-title\">" + cat.Name + "</div>");
                    eventSummaryPopupContent_eventCategoryDiv.append("<div class=\"eec_ecl_eom_clr\">&nbsp;</div>");
                    eventSummaryPopupContent.append(eventSummaryPopupContent_eventCategoryDiv);
                }


                if (calendarEvent.linkToDetails) {
                    var eventSummaryPopupContent_eventDetailsLink = $("<a></a>");
                    eventSummaryPopupContent_eventDetailsLink.addClass("eec-mw-calendarEvent-summary-content-eventdetailslink");
                    eventSummaryPopupContent_eventDetailsLink.attr('href', calendarEvent.url);
                    eventSummaryPopupContent_eventDetailsLink.html("&nbsp;");
                    eventSummaryPopupContent.append(eventSummaryPopupContent_eventDetailsLink);


                }

                eventSummaryPopup.append(eventSummaryPopupContent);
                $("#eec-mw-outter").append(eventSummaryPopup);

                var relativeToElement = $(this);

                eom.ecl.eec.helper.positionInside($("#eec-mw-outter"), eventSummaryPopup, relativeToElement);

            });



            var eventDiv = $("<div id=\"eec-mw-calendarEvent-" + calendarEvent.id + "-" + eventDate.valueOf() + "\"  class=\"eec-mw-calendarEvent category-" + calendarEvent.category + "\">" + +"</div>");

            //eventDiv.append(calEventTitle);
            eventDiv.append(calEventLink);

            dayDiv.find(".eec-mw-day-date").after(eventDiv);

            //dayDiv.append("<div id=\"eec-mw-calendarEvent-" + calendarEvent.id + "-" + eventDate.valueOf() + "\"  class=\"eec-mw-calendarEvent category-" + calendarEvent.category + "\">" + +"</div>");
        }
    }
}

eom.ecl.eec.CalendarMonthView.prototype.calculateDayEventsVisiblity = function() {
    
    // number of events to show per cell
    var evetnsToShow = 3;
    $(".eec-mw-day").each(function() {
        $(this).children(".eec-mw-calendarEvent").removeClass("hideoverflow");
        var numberOfEvents = $(this).children(".eec-mw-calendarEvent").length;
        var nubmerOfFilteredeEvents = $(this).children(".hidecalendar").length;
        numberOfEvents = numberOfEvents - nubmerOfFilteredeEvents;

        $(this).find(".eec-mw-day-more-counter").html(numberOfEvents - evetnsToShow);

        if (numberOfEvents > evetnsToShow) {
            // hide overflowing events
            var ePointer = 0;
            $(this).children(".eec-mw-calendarEvent").each(function() {
                ePointer += 1;
                if (ePointer > evetnsToShow) {
                    $(this).addClass("hideoverflow");
                } else {
                    $(this).removeClass("hideoverflow");
                }
            });

            $(this).find(".eec-mw-day-more-link").show();
        } else {
            $(this).find(".eec-mw-day-more-link").hide();
        }
    });
}


eom.ecl.eec.CalendarMonthView.prototype.clear = function(calendarEvent) {
    $("#eec-mw-days .eec-mw-day").remove();
}

eom.ecl.eec.CalendarMonthView.prototype.toggleEventsByCategory = function(categoryId, show) {
    $(".eec-mw-calendarEvent").each(function() {
        if ($(this).hasClass("category-" + categoryId)) {
            if (show) {
                $(this).removeClass("hidecalendar");
            } else {
                if (!($(this).hasClass("hidecalendar"))) {
                    $(this).addClass("hidecalendar");
                }

            }
        }
    });
}

eom.ecl.eec.CalendarMonthView.prototype.reload = function(calendarEvent) {
    var mw = this;
    mw.clear();

    var startDate = new Date(mw.Year, mw.Month, 1);
    var endDate = new Date(mw.Year, mw.Month, daysInMonth(startDate));


    $("#eec-mw-nav-date").html(monthOfyear[startDate.getMonth()] + "&nbsp;" + startDate.getFullYear());


    startDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() - startDate.getDay());
    endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + (6 - endDate.getDay()));
    var currentDate = startDate;
    var calendarDays = $("#eec-mw-days");
    while ((endDate - currentDate) >= 0) {

        calendarDays.append(mw.renderCalendarDay(currentDate));
        currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate() + 1);
    }
    mw.loadEvents();
}

eom.ecl.eec.CalendarView.prototype.RefreshView = function() {
    this.clear();
    this.reload();
}


function parseDotNetJsonDate(s) {
    return eval(s.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
}

function daysInMonth(date) {
    return 32 - new Date(date.getFullYear(), date.getMonth(), 32).getDate();
}

function constructNewQueryString(year, month, day, view) {
    var qs = '';
    if (month) { qs += "m=" + month; }
    if (year) {
        if (qs != '') { qs += "&"; }
        qs += "y=" + year;
    }

    if (day) {
        if (qs != '') { qs += "&"; }
        qs += "d=" + day;
    }


    if (view) {
        if (qs != '') { qs += "&"; }
        qs += "v=" + view;
    }
    return qs
}

function ShowHideCategories() {
    $(document).find(".CalendarDay").find("li.Event").each(function() {
        var isVisible = false;
        $(this).find(".EventCategories").find("a").each(function() {
            if ($(".CategorySelector").find("li.Active").find("a[title='" + $(this).attr('title') + "']").length > 0) {
                isVisible = true;
            }
        });
        if (isVisible) {
            $(this).show();
        } else {
            $(this).hide();
        }
    });
}



eom.ecl.eec.CalendarSelector = function(div, cal) {
    this.CalendarSelectorDiv = div;
    this.Calendar = cal;
    this.Calendars = new Array();
}

eom.ecl.eec.CalendarSelector.prototype.loadCalendarsFromDataSource = function(ds) {
    var cs = this;
    ds.getCalendars(function(calendars) {
        cs.loadCalendars(calendars);
    });
}

eom.ecl.eec.CalendarSelector.prototype.loadCalendars = function(calendars) {
    var cs = this;
    cs.Calendars = calendars;

    var qs = new Querystring(null);
    var onlyActiveCalendarId = qs.get("cid");



    if (calendars.length > 0) {
        var ul = $("<ul></ul>");
        ul.attr('id', 'eec-cs-clist');
        for (key in calendars) {
            var li = $("<li></li>");
            li.attr('id', 'eec-cs-clist-li-' + calendars[key].Id);
            li.addClass('eec-cs-clist-li');
            li.addClass('category-' + calendars[key].Id);

            if (onlyActiveCalendarId) {
                if (onlyActiveCalendarId == calendars[key].Id) {
                    li.addClass("Active");
                } 
            } else {
                li.addClass("Active");
            }

            

            if (key == (calendars.length - 1)) {
                li.addClass("Last");
            }

            var calCheckBox = $("<div class=\"eec-cs-cli-check\">&nbsp;</div>");
            calCheckBox.append("<div class=\"eec-cs-cli-check-inner\">&nbsp;</div>");
            li.append(calCheckBox);

            var a = $("<a></a>");
            a.attr('id', "eec-cs-cli-" + calendars[key].Id)
            a.attr('class', 'eec-cs-cli');
            a.attr('href', 'javascript:void(0);');
            a.colorCode = calendars[key].Color;
            a.html(calendars[key].Name)
            a.bind('click', function() {
                $(this).closest("li").each(function() {

                    if ($(this).hasClass("Active")) {
                        $(this).removeClass("Active");
                    } else {
                        $(this).addClass("Active");
                    }
                });

                cs.Calendar.view.toggleEventsByCategory($(this).attr('id').replace("eec-cs-cli-", ""), $(this).closest("li").hasClass("Active"));
                cs.Calendar.view.calculateDayEventsVisiblity();
                cs.applyCalendarStyles();

            });

            li.append(a);


            li.append("<div class\"eec_ecl_eom_clr \">&nbsp;</div>");

            ul.append(li);

        }
        this.CalendarSelectorDiv.append(ul);
    }
}

eom.ecl.eec.CalendarSelector.prototype.applyCalendarStyles = function() {
    var cs = this;
    for (key in this.Calendars){
        $(".category-" + cs.Calendars[key].Id).each(function (){
            if (! $(this).hasClass("categoryStyle-" + cs.Calendars[key].Color)){
                $(this).addClass("categoryStyle-" + cs.Calendars[key].Color)
            }
        });
    }
}

eom.ecl.eec.CalendarSelector.prototype.filterCategories = function() {
    var cs = this;
    cs.CalendarSelectorDiv.find("a.eec-cs-cli").each(function() {
        cs.Calendar.view.toggleEventsByCategory($(this).attr('id').replace("eec-cs-cli-", ""), $(this).closest("li").hasClass("Active"));

    });
}

eom.ecl.eec.CalendarSelector.prototype.getCalendarById = function(calendarId) {
    for (key in this.Calendars) {
        if (this.Calendars[key].Id == calendarId) {
            return this.Calendars[key]
        }
    }
    return null;
}



// helper functions
eom.ecl.eec.helper = function() {
}


eom.ecl.eec.helper.positionInside = function(container, content, rel) {

    //get the position of the placeholder element



    var container_pos = container.offset();
    var container_width = container.width() - 10; // add 10 for safety
    var container_height = container.height() - 10; // add 10 for safety
    //var link_pos = $(this).offset();


    if (rel) {
        var rel_pos = rel.offset();
        content.css({ "left": (rel_pos.left - container_pos.left) + "px" });
        content.css({ "top": (rel_pos.top - container_pos.top)+ "px" });
    }
    
    var content_pos = content.offset();
    var content_width = content.width();
    var content_height = content.height();




    // adjust x
    if ((content_pos.left + content_width) > (container_pos.left + container_width)) {
        var hOverflow = (content_pos.left + content_width) - (container_pos.left + container_width);
        content.css({ "left": (Number(content.css('left').replace('px', '')) - hOverflow) + "px" });
    }

    // adjust y
    if ((content_pos.top + content_height) > (container_pos.top + container_height)) {
        var vOverflow = (content_pos.top + content_height) - (container_pos.top + container_height);
        content.css({ "top": (Number(content.css('top').replace('px', '')) - vOverflow) + "px" });
    }
}