﻿function eventUpdateHandler(event, dayDelta, minuteDelta, allDay, revertFunc) {
    var moduleId = event.moduleId;
    var startDate = new Date();
    startDate.setUTCFullYear(event.start.getFullYear());
    startDate.setUTCMonth(event.start.getMonth());
    startDate.setUTCDate(event.start.getDate());
    startDate.setUTCHours(event.start.getHours());
    startDate.setUTCMinutes(event.start.getMinutes());
    startDate.setUTCSeconds(event.start.getSeconds());
    var endDate = new Date();
    endDate.setUTCFullYear(event.end.getFullYear());
    endDate.setUTCMonth(event.end.getMonth());
    endDate.setUTCDate(event.end.getDate());
    endDate.setUTCHours(event.end.getHours());
    endDate.setUTCMinutes(event.end.getMinutes());
    endDate.setUTCSeconds(event.end.getSeconds());
    var data = {
        id: event.id,
        startDate: startDate,
        endDate: endDate,
        description: event.description,
        title: event.title
    };
    var value = Sys.Serialization.JavaScriptSerializer.serialize(data);
    jQueryCS144.ajax({
        url: event.controlPath + "/Handlers/Update.ashx",
        dataType: "json",
        data: {
            moduleId: moduleId,
            tabId: event.tabId,
            eventId: event.id,
            event: value,
            cache: new Date().getTime() //special parameter for not to cache data in IE.
        },
        success: function (data, textStatus, XMLHttpRequest) {
            showActionResult(data, moduleId);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            showActionResult(data, moduleId);
        }
    });
}

function startChangeEventHangler(event, jsEvent, ui, view) {
    jQueryCS144("#dvEventHint_" + event.moduleId).dialog("close");
}

function eventClickHandler(event, jsEvent, view) {
    var moduleId = event.moduleId;
    var container = jQueryCS144("#dvEventHint_" + moduleId);
    container.find(".spEventHintTitle").text(event.title);
    var description = event.description.replace(new RegExp("<img.*/>"), "<div class='insert'></div>");
    container.find(".lblEventHintDescription").html(description);
    if (event.description.length > 200) {
        container.find(".lnkEventHintMore").css("visibility", "visible");
        var description = description.substr(0, 200) + "... "
        container.find(".lblDescriptionValue").html(description);
    }
    else {
        container.find(".lnkEventHintMore").css("visibility", "hidden");
    }
    var format = event.dateFormat;
    if (!event.allDay) {
        format = format + ' ' + event.timeFormat;
    }
    container.find(".lblEventHintStartDate").text(event.start.format(format).toLowerCase());
    container.find(".lblEventHintEndDate").text(event.end.format(format).toLowerCase());
    container.find(".lnkEventHintEdit").unbind("click");
    container.find(".lnkEventHintDelete").unbind("click");
    container.find(".lnkEventHintMore").unbind("click");
    container.find(".lnkEventHintSeeDetails").unbind("click");
    container.find(".lnkEventHintMore").click(function () { eval(event.viewHandler) });
    container.find(".lnkEventHintSeeDetails").click(function () { eval(event.viewHandler) });
    if (event.isExternal) {
        container.find(".lnkEventHintEdit").hide();
        container.find(".lnkEventHintDelete").hide();
        container.find(".lblExternalMessage").show();
    }
    else {
        container.find(".lnkEventHintEdit").show();
        container.find(".lnkEventHintEdit").click(function () { eval(event.editHandler) });
        container.find(".lnkEventHintDelete").show();
        container.find(".lnkEventHintDelete").click(function () { eventDeleteHandler(event) });
        container.find(".lblExternalMessage").hide();
    }
    container.parent().find(".ui-dialog-titlebar").hide();
    var originalScrollTop = jQueryCS144(window).scrollTop();
    container.dialog({ autoOpen: true, position: [jsEvent.pageX, jsEvent.clientY], minHeight: 30 });
    jQueryCS144(window).scrollTop(originalScrollTop);
}

function editClickHandler(event, editUrl) {
    window.location = editUrl + event.id;
}

function eventDeleteHandler(event) {
    var controlPath = event.controlPath;
    var moduleId = event.moduleId;
    jQueryCS144.ajax({
        url: controlPath + "Handlers/Delete.ashx",
        dataType: "json",
        data: {
            moduleId: moduleId,
            tabId: event.tabId,
            eventId: event.id,
            cache: new Date().getTime() //special parameter for not to cache data in IE.
        },
        success: function (data, textStatus, XMLHttpRequest) {
            jQueryCS144("#calendar_" + moduleId).fullCalendar("removeEvents", event.id);
            jQueryCS144("#dvEventHint_" + moduleId).dialog("close");
            showActionResult(data, moduleId)
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            showActionResult(data, moduleId);
        }
    });
}

function detailsClickHandler(event) {
    var moduleId = event.moduleId;
    var container = jQueryCS144("#dvEventProperty_" + moduleId);
    container.find(".lblDetailsTitleValue").text(event.title);
    container.find(".lblDetailsDescriptionValue").html(event.description);
    container.find(".chkDetailsAllDay").attr('checked', event.allDay);
    container.find(".chkDetailsAllDay > input").attr('checked', event.allDay);
    var format = event.dateFormat;
    if (event.allDay) {
        container.find(".dvDetailsAllDay").css('display', '');
    }
    else {
        format = format + ' ' + event.timeFormat;
        container.find(".dvDetailsAllDay").css('display', 'none');
    }
    container.find(".lblDetailsStartTimeValue").text(event.start.format(format).toLowerCase());
    container.find(".lblDetailsEndTimeValue").text(event.end.format(format).toLowerCase());
    var originalScrollTop = jQueryCS144(window).scrollTop();
    jQueryCS144("#dvEventHint_" + moduleId).dialog('close');
    container.parent().find(".ui-dialog-titlebar").show();
    var popup = jQueryCS144("#dvEventProperty_" + moduleId);
    popup.dialog("option", "draggable", false);
    popup.dialog('open');
    jQueryCS144(window).scrollTop(originalScrollTop);
}

function initializeEventProperties(dateFormat, convention) {
    //format date in .net and js datepicker different, see datepicker documentation
    dateformat = dateFormat.replace(/D/g, "d");
    dateFormat = dateFormat.replace(/Y/g, "y").replace(/yy/g, "y");
    if (dateFormat.indexOf("MMM") != -1 || dateFormat.indexOf("MMMM") != -1) {
        dateFormat = dateFormat.replace("MMM", "M");
    }
    else {
        dateFormat = dateFormat.replace(/M/g, "m");
    }
    convention = parseInt(convention);
    jQueryCS144('.calendarStartDate').datepicker({ showAnim: 'fadeIn', dateFormat: dateFormat, onSelect: function (dateText, inst) { setEndDate(); validate(); } });
    jQueryCS144('.calendarEndDate').datepicker({ showAnim: 'fadeIn', dateFormat: dateFormat, onSelect: function (dateText, inst) { validate(); } });
    jQueryCS144('.calendarStartTime').timepickr({ convention: convention });
    jQueryCS144('.calendarEndTime').timepickr({ convention: convention });
}

function addButtonScript(moduleId, editUrl, dayViewName, text) {
    var custom_buttons = '<td>' +
            '<span class=\'fc-header-space\'></span>' +
        '</td>' +
        '<td>' +
            '<div class=\'ui-state-default ui-corner-left ui-corner-right\'>' +
                '<a onclick=\"addButtonHandler(\'' + moduleId + '\', \'' + editUrl + '\', \'' + text + '\', \'' + dayViewName + '\');\">' +
                '<span>' + text + '</span></a>' +
            '</div>' +
        '</td>';
    jQueryCS144("#calendar_" + moduleId).find('.fc-header-left').find('td:last').after(custom_buttons);
    jQueryCS144("#calendar_" + moduleId).fullCalendar('setSize');
}

function addButtonHandler(moduleId, editUrl, text, dayViewName) {
    var url = editUrl;
    var calendarDate = jQueryCS144('#calendar_' + moduleId).fullCalendar('getDate');
    var calendarMode = jQueryCS144('#calendar_' + moduleId).fullCalendar('getView');
    if (calendarMode.name == dayViewName) {
        url = url + '?startDate=' + calendarDate.toDateString();
    }
    window.location.href = url;
}

function dayDoubleClickHandler(date, allDay, jsEvent, view, editUrl) {
    var startDate = new Date();
    startDate.setUTCFullYear(date.getFullYear());
    startDate.setUTCMonth(date.getMonth());
    startDate.setUTCDate(date.getDate());
    if (view.name != "month") {
        startDate.setUTCHours(date.getHours());
        startDate.setUTCMinutes(date.getMinutes());
        startDate.setUTCSeconds(date.getSeconds());
    }
    else {
        startDate.setUTCHours(startDate.getHours());
        startDate.setUTCMinutes(startDate.getMinutes());
        startDate.setUTCSeconds(startDate.getSeconds());
    }
    //getTime return time only UTC
    var url = editUrl + "?startDate=" + startDate.getTime();
    window.location.href = url;
}

function changeViewHandler(view, moduleId) {
    jQueryCS144("#dvEventHint_" + moduleId).dialog("close");
    jQueryCS144("#calendar_" + moduleId).fullCalendar("setSize");
    var container = jQueryCS144("#calendar_" + moduleId).parent().find(".errorSources");
    container.html("");
}

function showActionResult(data, moduleId) {
    var container = jQueryCS144("#dvConfirm_" + moduleId);
    container.find(".lblConfirmation").text(data.Message);
    container.fadeIn(400).delay(2000).fadeOut(1000);
    var dvStyle = container.find("#dvStyle");
    var spIcon = container.find("#spIcon");
    dvStyle.removeClass("ui-state-highlight");
    dvStyle.removeClass("ui-state-error");
    spIcon.removeClass("ui-icon-info");
    spIcon.removeClass("ui-icon-alert");
    if (data.IsError) {
        dvStyle.addClass("ui-state-error");
        spIcon.addClass("ui-icon-alert");
    }
    else {
        dvStyle.addClass("ui-state-highlight");
        spIcon.addClass("ui-icon-info");
    }
}

function loadGoogleEvents(params) {
    var parameters = params;
    var callbackFullCalendar;
    
    function loadGoogleEventsInline(start, end, callback) {
        callbackFullCalendar = callback;
        jQueryCS144.jsonp({
            url: parameters.Url,
            callbackParameter: "callback",
            data: {
                alt: "jsonc",
                'start-min': jQueryCS144.fullCalendar.formatDate(start, 'u'),
                'start-max': jQueryCS144.fullCalendar.formatDate(end, 'u'),
                singleevents: true,
                'max-results': 9999,
                cache: new Date().getTime()
            },
            success: function (data, textStatus) {
                var events = new Array();
                if (data === undefined || data.data === undefined || data.data.items === undefined) {
                    //check error not undefined, data.data.items === undefined when no events
                    if (data.error !== undefined) {
                        errorSource = {
                            Message: parameters.ErrorLoadSourceMessage,
                            ModuleId: parameters.ModuleId
                        };
                        handleErrorSourceLoad(errorSource);
                    }
                    var events = new Array();
                    callbackFullCalendar(events);
                    return;
                }
                jQueryCS144(data.data.items).each(function (index) {
                    var eventStart = jQueryCS144.fullCalendar.parseDate(this.when[0].start, true);
                    var eventEnd = jQueryCS144.fullCalendar.parseDate(this.when[0].end, true);
                    var eventAllDay = this.when[0].start.indexOf('T') == -1;
                    if (eventAllDay) {
                        eventEnd = new Date(eventEnd.getTime() - 1000); // make inclusive
                    }
                    events.push({
                        id: this.id,
                        title: this.title,
                        description: this.details,
                        start: eventStart,
                        end: eventEnd,
                        editable: parameters.Editable,
                        moduleId: parameters.ModuleId,
                        tabId: parameters.TabId,
                        allDay: eventAllDay,
                        controlPath: parameters.ControlPath,
                        viewHandler: parameters.ViewHandler,
                        dateFormat: parameters.DateFormat,
                        timeFormat: parameters.TimeFormat,
                        className: parameters.ClassName,
                        isExternal: parameters.IsExternal,
                        cancelChangingMessage: parameters.CancelChangingMessage
                    });
                });
                callbackFullCalendar(events);
            },
            error: function (xOptions, textStatus) {
                errorSource = {
                    Message: parameters.ErrorLoadSourceMessage,
                    ModuleId: parameters.ModuleId
                };
                handleErrorSourceLoad(errorSource);
                var events = new Array();
                callbackFullCalendar(events);
            }
        });
    }

    jQueryCS144("#calendar_" + parameters.ModuleId).fullCalendar("addEventSource", loadGoogleEventsInline);
}

function loadCalendarEvents(params) {
    var parameters = params;

    function loadCalendarEventsInline(start, end, callback) {
        var events = new Array();

        jQueryCS144.ajax({
            url: parameters.Url,
            data: {
                moduleId: parameters.ModuleId,
                tabId: parameters.TabId,
                start: start.getTime(),
                end: end.getTime(),
                cache: new Date().getTime() //special parameter for not to cache data in IE.
            },
            success: function (data, textStatus, XMLHttpRequest) {
                jQueryCS144(data).each(function () {
                    var startDate = new Date(this.TimeFrom);
                    var endDate = new Date(this.TimeTo);
                    events.push({
                        id: this.ItemId,
                        title: this.Name,
                        description: this.Description,
                        editable: parameters.Editable,
                        moduleId: this.ModuleId,
                        tabId: parameters.TabId,
                        controlPath: parameters.ControlPath,
                        viewHandler: parameters.ViewHandler,
                        editHandler: parameters.EditHandler,
                        dateFormat: parameters.DateFormat,
                        timeFormat: parameters.TimeFormat,
                        start: new Date(startDate.getUTCFullYear(), startDate.getUTCMonth(), startDate.getUTCDate(), startDate.getUTCHours(), startDate.getUTCMinutes()),
                        end: new Date(endDate.getUTCFullYear(), endDate.getUTCMonth(), endDate.getUTCDate(), endDate.getUTCHours(), endDate.getUTCMinutes()),
                        allDay: this.AllDayEvent,
                        className: parameters.ClassName,
                        isExternal: parameters.IsExternal
                    });
                });
                callback(events);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                callback(events);
            }
        });
    }

    jQueryCS144("#calendar_" + parameters.ModuleId).fullCalendar("addEventSource", loadCalendarEventsInline);
}

function initializeColourPicker(controlPath, iconId, inputId, key) {
    jQueryCS144('#jquery-colour-picker-' + key + ' select').colourPicker({
        ico: controlPath + "Skins/FullCalendar/Images/jquery.colourPicker.gif",
        title: false,
        iconId: iconId,
        inputId: inputId
    });
}

function initializeDefaultText(textboxId) {
    jQueryCS144(textboxId).addDefaultText();
}

function handleErrorSourceLoad(errorSource) {
    var container = jQueryCS144("#calendar_" + errorSource.ModuleId).parent().find(".errorSources");
    var span = jQueryCS144("<div></div>").html(errorSource.Message);
    container.append(span);
}
