﻿
var smallCalendar = {
    month_names: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    day_names: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
    dates: null,
    initialUpcoming: null,
    selectedDate: "",
    init: function (selectedDate, eventDates) {
        smallCalendar.selectedDate = selectedDate;
        smallCalendar.dates = eventDates;
        //smallCalendar.initialUpcoming = initialUpcoming;
        $("#datepicker").datepicker({ beforeShowDay: smallCalendar.highlightDays, onSelect: smallCalendar.dateSelected, onChangeMonthYear: smallCalendar.monthSelected });
        smallCalendar.getInitialEvents();

        $(document).mousedown(function (e) {
            var elements = $(e.target).parents().andSelf();
            if (!elements.is('#smallCalPopup')
            && !elements.is('.calendarHighlight')
            ) {
                smallCalendar.closePopup();
            }
        });
    },
    createEventItemHtml: function (eventItem, showTimes) {
        var sbuffer = [];
        sbuffer[sbuffer.length] = '<li><div class="eventItem"><div class="eventItemTitle"><a href="' + smallCalEventPageLocation + '?evId=' + eventItem.Id + '&calId=' + eventItem.CalendarId + '">' + eventItem.Name + '</a></div><p>';
        if (showTimes) {
            if (eventItem.IsMultiDay) {
                sbuffer[sbuffer.length] = smallCalendar.makeShortDateString(eventItem.StartTime)
                    + "-" + smallCalendar.makeShortDateString(eventItem.EndTime);
            }
            else {
                sbuffer[sbuffer.length] = smallCalendar.makeShortDateString(eventItem.StartTime)
            }
        }
        sbuffer[sbuffer.length] = "</p></div></li>";
        var html = sbuffer.join('');
        return html;
    },
    highlightDays: function (date) {
        for (var i = 0; i < smallCalendar.dates.length; i++) {
            var startDate = new Date(smallCalendar.dates[i]);
            if (startDate - date == 0) {
                return [true, 'calendarHighlight'];
            }
        }
        return [true, ''];
    },
    checkDateHasEvents: function (date) {
        for (var i = 0; i < smallCalendar.dates.length; i++) {
            var startDate = new Date(smallCalendar.dates[i]);
            if (startDate - date == 0) {
                return true;
            }
        }
    },
    dateSelected: function (dateText, inst) {
        smallCalendar.selectedDate = dateText;
        var dateObj = new Date(dateText);
        //var height = $('.calendarWrapper').height();
        //$(".calendarWrapper").css({ 'min-height': height + 'px' })
        //$("#eventSummary").hide();
        //$("#smallCalendarLoading").show().delay(2000).hide();

        if ($('#smallCalPopup').is(':visible')) {
            $('#smallCalPopup').css({ 'display': 'none' });
        }
        if (smallCalendar.checkDateHasEvents(dateObj)) {
            $('#smallCalPopup .smallCalPopupMiddle .smallCalPopupContent').html('<div class="calPopupLoading"></div>');
            $('#smallCalPopup .smallCalPopupFooter .smallCalPopupFooterContent').html('');
            $('#smallCalPopup').fadeIn();

            smallCalendar.showEventsForDay(dateText);
        }
    },
    getInitialEvents: function () {
        $.ajax(
            { url: smallCalServiceLocation + "/GetUpcomingEvents",
                type: "POST",
                data: '{"maxItems":"' + maxItemsToDisplay + '"}',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    var results = data.d;
                    var sbuffer = [];
                    sbuffer[sbuffer.length] = '<div class="eventSectionHeader">Upcoming Events</div>';


                    if (results.length > 0) {
                        var days = smallCalendar.getDaysInNextYear();
                        var groupedEvents = smallCalendar.groupEventsByDay(days, results);

                        for (var i = 0; i < groupedEvents.length; i++) {
                            var events = groupedEvents[i].events;
                            var multiDayEvents = groupedEvents[i].multiDayEvents;
                            if (events.length > 0) {
                                sbuffer[sbuffer.length] = '<div class="eventDateHeader">'
                                    + smallCalendar.makePrettyDateString(groupedEvents[i].day) + "</div>"
                                    + '<ul class="eventSummaryList">';

                                for (var j = 0; j < events.length; j++) {
                                    var eventSummary = events[j];
                                    sbuffer[sbuffer.length] = smallCalendar.createEventItemHtml(eventSummary, false);
                                }

                                sbuffer[sbuffer.length] = '</ul>';
                            }
                            if (multiDayEvents.length > 0) {


                                for (var j = 0; j < multiDayEvents.length; j++) {
                                    var event = multiDayEvents[j];
                                    var startDate = new Date();
                                    startDate.setTime(event.StartTime);
                                    var endDate = new Date();
                                    endDate.setTime(event.EndTime);

                                    sbuffer[sbuffer.length] = '<div class="eventDateHeader">'
                                    + smallCalendar.makePrettyDateString(startDate) + ' - ' + smallCalendar.makePrettyDateString(endDate) + "</div>"
                                    + '<ul class="eventSummaryList">';

                                    sbuffer[sbuffer.length] = smallCalendar.createEventItemHtml(event, false);
                                }

                                sbuffer[sbuffer.length] = '</ul>';
                            }
                        }
                    }
                    else {
                        sbuffer[sbuffer.length] = '<ul class="eventSummaryList"><li><div class="eventItem"><div class="eventItemTitle">No events found.</div><p></p></div></li></ul>';
                    }
                    var html = sbuffer.join('');
                    $("#eventSummary").html(html).delay(100).fadeIn(250);
                },
                error: function (err) {
                    //alert(err.Message); $("#smallCalendarLoading").fadeOut(500); 
                }
            });
    },
    monthSelected: function (year, month, inst) {
        var height = $('#eventSummaryWrapper').height();
        $("#eventSummaryWrapper").css({ 'min-height': height + 'px' })
        $("#eventSummary").hide();
        $("#smallCalendarLoading").show().delay(2000).hide();
        smallCalendar.getUpcomingMonthEvents(month, year);
    },
    getUpcomingMonthEvents: function (month, year) {
        $.ajax(
            { url: smallCalServiceLocation + "/GetEventsForMonth",
                type: "POST",
                data: "{\"month\":\"" + month + "\", \"year\":\"" + year + "\"}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    var results = data.d;
                    if (results.length > 5) {
                        results.splice(5, results.length - maxItemsToDisplay); //trim
                    }
                    var sbuffer = [];
                    sbuffer[sbuffer.length] = '<h3 class="eventSummaryHeader">Events - ' + smallCalendar.month_names[month - 1] + '</h3>';


                    if (results.length > 0) {
                        var days = smallCalendar.getDaysInMonth(month - 1, year);
                        var groupedEvents = smallCalendar.groupEventsByDay(days, results);

                        for (var i = 0; i < groupedEvents.length; i++) {
                            var events = groupedEvents[i].events;
                            var multiDayEvents = groupedEvents[i].multiDayEvents;
                            if (events.length > 0) {
                                sbuffer[sbuffer.length] = '<div class="eventDateHeader">'
                                                + smallCalendar.makePrettyDateString(groupedEvents[i].day) + "</div>"
                                                + '<ul class="eventSummaryList">';

                                for (var j = 0; j < events.length; j++) {
                                    var eventSummary = events[j];
                                    sbuffer[sbuffer.length] = smallCalendar.createEventItemHtml(eventSummary, false);
                                }

                                sbuffer[sbuffer.length] = '</ul>';
                            }
                            if (multiDayEvents.length > 0) {


                                for (var j = 0; j < multiDayEvents.length; j++) {
                                    var event = multiDayEvents[j];
                                    var startDate = new Date();
                                    startDate.setTime(event.StartTime);
                                    var endDate = new Date();
                                    endDate.setTime(event.EndTime);

                                    sbuffer[sbuffer.length] = '<h4 class="eventDateHeader">'
                                    + smallCalendar.makePrettyDateString(startDate) + ' - ' + smallCalendar.makePrettyDateString(endDate) + "</h4>"
                                    + '<ul class="eventSummaryList">';

                                    sbuffer[sbuffer.length] = smallCalendar.createEventItemHtml(event, false);
                                }

                                sbuffer[sbuffer.length] = '</ul>';
                            }
                        }
                    }
                    else {
                        sbuffer[sbuffer.length] = '<ul class="eventSummaryList"><li><div class="eventItem"><div class="eventItemTitle">No events found.</div><p></p></div></li></ul>';
                    }
                    var html = sbuffer.join('');
                    $("#eventSummary").html(html).delay(100).fadeIn(250);
                },
                error: function (err) {
                    //alert(err.Message); $("#smallCalendarLoading").fadeOut(500); 
                }
            });
    },
    groupEventsByDay: function (days, events) {
        var groupedEvents = new Array();
        for (var i = 0; i < days.length; i++) {
            var day = days[i];
            var group = { day: day, events: smallCalendar.getEventsOnDay(day, events, true), multiDayEvents: smallCalendar.getEventsStartingOnDay(day, events, true) };
            groupedEvents[groupedEvents.length] = group;
        }
        return groupedEvents;
    },
    getEventsOnDay: function (day, events, singleDayEventsOnly) {
        var results = new Array();
        for (var i = 0; i < events.length; i++) {
            var event = events[i];
            var startDate = new Date();
            startDate.setTime(event.StartTime);
            var endDate = new Date();
            endDate.setTime(event.EndTime);
            if (smallCalendar.datesOnSameDay(startDate, day) || smallCalendar.datesOnSameDay(endDate, day) || smallCalendar.dateInsideRange(day, startDate, endDate)) {
                if (singleDayEventsOnly && event.IsMultiDay) {
                    continue;
                } else {
                    results[results.length] = event;
                }
            }
        }
        return results;
    },
    getEventsStartingOnDay: function (day, events, multiDayEventsOnly) {
        var results = new Array();
        for (var i = 0; i < events.length; i++) {
            var event = events[i];
            var startDate = new Date();
            startDate.setTime(event.StartTime);
            var endDate = new Date();
            endDate.setTime(event.EndTime);
            if (smallCalendar.datesOnSameDay(startDate, day)) {
                if (multiDayEventsOnly && !event.IsMultiDay) {
                    continue;
                } else {
                    results[results.length] = event;
                }
                continue;
            }
        }
        return results;
    },
    getDaysInMonth: function (month, year) {
        var results = new Array();
        var first = new Date(year, month, 1, 0, 0, 0);
        var dateToAdd = new Date(first.valueOf());
        var i = 0;
        while (dateToAdd.getMonth() == first.getMonth()) {
            results[results.length] = dateToAdd;

            i++;
            dateToAdd = new Date(first.valueOf());
            dateToAdd.setDate(first.getDate() + i);
        }
        return results;
    },
    getDaysInNextYear: function () {
        var results = new Array();
        var first = new Date();
        var dateToAdd = new Date(first.valueOf());
        var i = 0;
        while (i < 365) {
            results[results.length] = dateToAdd;
            i++;
            dateToAdd = new Date(first.valueOf());
            dateToAdd.setDate(first.getDate() + i);
        }
        return results;
    },
    showEventsForDay: function (date) {
        $.ajax(
            { url: smallCalServiceLocation + "/GetEventsForDate",
                type: "POST",
                data: "{\"date\":\"" + date + "\"}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    var results = data.d;
                    if (results.length > 5) {
                        results.splice(5, results.length - maxItemsToDisplay); //trim
                    }
                    var sbuffer = [];
                    sbuffer[sbuffer.length] = '<h3>' + smallCalendar.makePrettyDateString(smallCalendar.selectedDate) + '</h3>';
                    sbuffer[sbuffer.length] = '<ul>';

                    for (var i = 0; i < results.length; i++) {
                        var eventItem = results[i];
                        sbuffer[sbuffer.length] = '<li><div class=calPopupItemHeader>';
                        sbuffer[sbuffer.length] = '<a href="' + smallCalEventPageLocation + '?evId=' + eventItem.Id + '&calId=' + eventItem.CalendarId + '">' + eventItem.Name + '</a>';
                        sbuffer[sbuffer.length] = '</div>';

                        
                        sbuffer[sbuffer.length] = '<div class=calPopupItemTimeInfo>';
                        if (!eventItem.IsMultiDay && !eventItem.IsAllDayEvent) {
                            sbuffer[sbuffer.length] = eventItem.StartTimeString + ' - ' + eventItem.EndTimeString;
                        }
                        else if (eventItem.IsMultiDay) {
                            sbuffer[sbuffer.length] = smallCalendar.makeShortDateString(eventItem.StartTime) + ', '+ eventItem.StartTimeString + ' - ' 
                                +smallCalendar.makeShortDateString(eventItem.EndTime) + ', '+ eventItem.EndTimeString;
                        }

                        sbuffer[sbuffer.length] = '</div>';


                        sbuffer[sbuffer.length] = '</div></li>';
                    }

                    sbuffer[sbuffer.length] = "</ul>";
                    var html = sbuffer.join('');
                    $('#smallCalPopup .smallCalPopupMiddle .smallCalPopupContent').html(html);

                },
                error: function (err) {
                    //alert(err.Message); $("#smallCalendarLoading").fadeOut(500); 
                }
            });
    },
    datesOnSameDay: function (date1, date2) {
        if (date1.getDate() == date2.getDate() && date1.getMonth() == date2.getMonth() && date1.getFullYear() == date2.getFullYear()) {
            return true;
        }
        return false;
    },
    dateInsideRange: function (date, rangeStart, rangeEnd) {
        var diffFromStart = date - rangeStart;
        var diffFromEnd = rangeEnd - date;

        if (smallCalendar.datesOnSameDay(date, rangeStart) || smallCalendar.datesOnSameDay(date, rangeEnd) || (diffFromStart >= 0 && diffFromEnd >= 0)) {
            return true;
        }
        return false;
    },
    makePrettyDateString: function (dateString) {
        var date = new Date(dateString);
        return smallCalendar.month_names[date.getMonth()] + " " + date.getDate() + ", " + date.getFullYear();
    },
    makeShortDateString: function (dateString) {
        var date = new Date(dateString);
        return smallCalendar.month_names[date.getMonth()] + " " + date.getDate().toString();
    },
    closePopup: function () {
        $('#smallCalPopup').hide();
    }
};

