﻿
var LS = {}


LS.ScheduleListControl = function(options) {

    var defaultOptions = {
        id: "scheduleListControl_" + Math.floor(Math.random() * 10000000),
        regions: null,
        schedule: {
            element: null,
            initialItemCount: 5,
            maxItemCount: 20,
            template: "",
            defaultLocation: null,
            onUpdated: null
        },
        scheduleControls: {
            visible: true,
            element: null,
            template: "",
            onUpdated: null
        },
        registrationMessage: {
            visible: true,
            element: null,
            template: "{$T.RegistrationMessage}"
        }
    };

    this._settings = jQuery.extend({}, options);

    this._settings.schedule = jQuery.extend({
        element: null,
        initialItemCount: 5,
        maxItemCount: 20,
        template: "",
        emptyTemplate: "<div class=\"empty-schedule\">There are currently no upcoming dates for this course in the selected location. Check back soon!</div>",
        defaultLocation: null,
        onUpdated: null
    }, options.schedule);

    this._settings.scheduleControls = jQuery.extend({
        visible: true,
        element: null,
        template: "",
        onUpdated: null
    }, options.scheduleControls);

    this._settings.registrationMessage = jQuery.extend({
        visible: true,
        element: null,
        template: "{$T.RegistrationMessage}"
    }, options.registrationMessage);



    if (this._settings.platformUrl != null && this._settings.platformUrl.charAt(this._settings.platformUrl.length - 1) != "/") {
        this._settings.platformUrl += "/";
    }

    this._currentScheduleItemMaxCount = this._settings.schedule.initialItemCount;

    this._scriptElementID = this._settings.id;
    if (this._scriptElementID == null) {
        this._scriptElementID = "scheduleListControl_" + Math.floor(Math.random() * 10000000);
    }

    var platformUrlLength = this._settings.platformUrl.length;
    this._isLocalPlatform = window.location.href.toLowerCase().substr(0, platformUrlLength) == this._settings.platformUrl.toLowerCase();

    this._currentLocation = this._settings.schedule.defaultLocation;
    if (this._currentLocation == null) {
        this._currentLocation = "";
    }
}

LS.ScheduleListControl.prototype = {

    init: function() {

        var self = this;

        if (this._settings.element == null) {
            return;
        }

        this._createChildElements();

        this._loadData();

    },

    _initLocation: function() {
        jQuery(this._settings.scheduleControls.element).find(".location-control select option[value=\"" + this._currentLocation + "\"]").attr("selected", "selected");
    },

    _createChildElements: function() {
        var container = this._settings.element;

        var scriptControlElement = document.createElement("div");
        scriptControlElement.id = this._scriptElementID;
        scriptControlElement.obj = this;

        container.append(scriptControlElement);

        if (this._settings.scheduleControls.element == null && this._settings.scheduleControls.visible) {
            this._settings.scheduleControls.element = document.createElement("div");
            container.append(this._settings.scheduleControls.element);
        }

        if (this._settings.schedule.element == null) {
            this._settings.schedule.element = document.createElement("div");
            container.append(this._settings.schedule.element);
        }

        if (this._settings.registrationMessage.element == null && this._settings.registrationMessage.visible) {
            this._settings.registrationMessage.element = document.createElement("div");
            container.append(this._settings.registrationMessage.element);
        }
    },

    _loadScheduleData: function() {
        this._loadData("LS.ScheduleListControl._loadScheduleDataCallback");
    },

    _loadData: function(callbackFunctionName) {
        if (callbackFunctionName == null) {
            callbackFunctionName = "LS.ScheduleListControl._loadDataCallback";
        }
        var serviceUrl = this._settings.platformUrl;
        if (serviceUrl != null && serviceUrl.charAt(serviceUrl.length - 1) != "/") {
            serviceUrl += "/";
        }
        var regionsParam = "";
        if (this._settings.regions != null && this._settings.regions instanceof Array) {
            regionsParam = escape(this._settings.regions.join(","));
        }
        serviceUrl += "Website/Resources/Services/ScheduleListControlService.svc/GetScheduleItems?eventID=" + escape(this._settings.courseID) + "&regions=" + regionsParam + "&maxResultCount=" + escape(this._currentScheduleItemMaxCount) + "&filter=" + escape(this._currentLocation);
        if (!this._isLocalPlatform) {
            jQuery.getScript(serviceUrl + "&callback=" + escape(callbackFunctionName) + "&callbackParam=" + escape(this._scriptElementID));
        }
        else {
            var callbackParam = this._scriptElementID;
            jQuery.ajax({
                url: serviceUrl,
                type: "GET",
                cache: false,
                processData: false,
                contentType: "application/json",
                timeout: 30000,
                dataType: "json",
                success: function(serviceResultObj) {
                    var func = eval(callbackFunctionName);
                    func(serviceResultObj, callbackParam);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        }
    },

    _processServiceResult: function(serviceResult) {
        if (serviceResult != null) {
            serviceResult.ScriptControlReference = "LS.ScheduleListControl.getInstance(\"" + this._scriptElementID + "\")";
        }
    },

    _loadDataCallbackInternal: function(serviceResultObj) {
        if (serviceResultObj.Success) {
            var serviceResult = serviceResultObj.Result;

            if (serviceResult != null) {

                this._processServiceResult(serviceResult);

                var container;
                if (this._settings.scheduleControls.visible) {
                    container = jQuery(this._settings.scheduleControls.element);
                    container.setTemplate(this._settings.scheduleControls.template);
                    container.processTemplate(serviceResult);
                }
                if (this._settings.scheduleControls.onUpdated != null && jQuery.isFunction(this._settings.scheduleControls.onUpdated)) {
                    this._settings.scheduleControls.onUpdated();
                }

                this._loadScheduleDataCallbackInternal(serviceResultObj);

                if (this._registrationMessageVisible) {
                    container = jQuery(this._settings.registrationMessage.element);
                    container.setTemplate(this._settings.registrationMessage.template, null, { filter_data: false });
                    container.processTemplate(serviceResult);
                }
            }

            if (this._settings.scheduleControls.element != null && this._currentLocation != null) {
                this._initLocation();
            }
        }
    },

    _loadScheduleDataCallbackInternal: function(serviceResultObj) {
        if (serviceResultObj.Success) {
            var serviceResult = serviceResultObj.Result;

            if (serviceResult != null) {

                this._processServiceResult(serviceResult);

                var container;

                container = jQuery(this._settings.schedule.element);
                if (serviceResult.Schedules != null && serviceResult.Schedules.length > 0) {
                    container.setTemplate(this._settings.schedule.template);
                }
                else {
                    container.setTemplate(this._settings.schedule.emptyTemplate);
                }
                container.processTemplate(serviceResult);

                container.find('a[name="viewSessionDetailsLink"]')
                    .click(function() {
                        var id = jQuery(this).attr('scheduleId');
                        var sessionTable = jQuery(this).parents('table.schedule-table');
                        var sessionDetails = sessionTable.find('[name="sessionDetails' + id + '"]');
                        sessionDetails.slideToggle('normal').focus();

                        sessionTable.find('tr[name="spacer' + id + '"]').toggleClass('hidden');

                        var linkText;
                        if (jQuery(this).text().indexOf('View') != -1) {
                            linkText = 'Hide details <span class="arrow">&#x25b2;</span>';
                        }
                        else {
                            linkText = 'View details <span class="arrow">&#x25bc;</span>';
                        }
                        jQuery(this).html(linkText);
                        return false;
                    });
                if (this._settings.schedule.onUpdated != null && jQuery.isFunction(this._settings.schedule.onUpdated)) {
                    this._settings.schedule.onUpdated();
                }
            }
        }
    },

    _showMore: function() {
        this._currentScheduleItemMaxCount = this._settings.schedule.maxItemCount;
        this._loadScheduleData();
    },

    _locationChanged: function(newLocation) {
        this._currentLocation = newLocation;
        this._loadScheduleData();
    }
}

LS.ScheduleListControl.getInstance = function(elementID) {
    var domElement = jQuery("#" + elementID);
    if (domElement.length == 0) {
        return;
    }

    var instance = domElement[0].obj;

    return instance;
}

LS.ScheduleListControl._loadDataCallback = function(r, elementID) {
    var instance = LS.ScheduleListControl.getInstance(elementID);
    if (instance == null || !jQuery.isFunction(instance._loadDataCallbackInternal)) {
        return null;
    }
    instance._loadDataCallbackInternal(r);

}

LS.ScheduleListControl._loadScheduleDataCallback = function(r, elementID) {
    var instance = LS.ScheduleListControl.getInstance(elementID);
    if (instance == null || !jQuery.isFunction(instance._loadScheduleDataCallbackInternal)) {
        return;
    }

    instance._loadScheduleDataCallbackInternal(r);
}