﻿Type.registerNamespace("Sembo.Site.Transportation.UC");

Sembo.Site.Transportation.UC.TransportationSearchFields = function(element) {
    Sembo.Site.Transportation.UC.TransportationSearchFields.initializeBase(this, [element]);

    function getChildControl(controlId) {
        return $get(element.id + "_" + controlId);
    };

    this._ferryHomeDateTextBox = getChildControl("FerryDateHomeTextBox");
    this._ferryOutDateTextBox = getChildControl("FerryDateOutTextBox");
    this._ferryTimeOutDropdown = getChildControl("FerryTimeOutDropdown");
    this._ferryTimeHomeDropdown = getChildControl("FerryTimeHomeDropdown");
    this._numberOfVehiclesDropDown = getChildControl("FerryVehicleNumberDropdown");
    this._ferryVehicleTypeDropdown = getChildControl("FerryVehicleTypeDropdown");
    this._ferryOutDropDown = getChildControl("FerryOutDropdown");
    this._ferryHomeDropDown = getChildControl("FerryHomeDropDown");

    this._singleVehicleRoutes = [];
    this.earliestSelectableDateString = null;
    this.latestSelectableDateString = null;
    this.earliestDateMessage = null;
    this.latestDateMessage = null;
    
    this._homeDateSet = false;
    this._outDateSet = false;

    this.userChangedDateInControl = false;
}

Sembo.Site.Transportation.UC.TransportationSearchFields.prototype =
{
    // properties
    get_homeDateSet: function() {
        return this._homeDateSet;
    },

    get_outDateSet: function() {
        return this._outDateSet;
    },

    get_ferryOutDate: function() {
        return Date.parseLocale(this._ferryOutDateTextBox.value);
    },

    set_ferryOutDate: function(value, changeOriginatesFromOtherControl) {
        Sembo.ThrowHelper.argumentNullException(value, "value");

        var stringValue = value.localeFormat("d");

        if (this._ferryOutDateTextBox.value !== stringValue) {
            this._ferryOutDateTextBox.value = stringValue;
            this.onFerryOutDateChanged(changeOriginatesFromOtherControl);
        }
    },

    get_ferryHomeDate: function() {
        return Date.parseLocale(this._ferryHomeDateTextBox.value);
    },

    set_ferryHomeDate: function(value, changeOriginatesFromOtherControl) {
        Sembo.ThrowHelper.argumentNullException(value, "value");

        var stringValue = value.localeFormat("d");

        if (this._ferryHomeDateTextBox.value !== stringValue) {
            this._ferryHomeDateTextBox.value = stringValue;
            this.onFerryHomeDateChanged(changeOriginatesFromOtherControl);
        }
    },

    get_earliestSelectableDate: function() {
        return Date.parseLocale(this.earliestSelectableDateString);
    },

    set_earliestSelectableDate: function(value) {
        this.earliestSelectableDateString = value.localeFormat();
    },

    get_latestSelectableDate: function() {
        return Date.parseLocale(this.latestSelectableDateString);
    },

    set_latestSelectableDate: function(value) {
        this.latestSelectableDateString = value.localeFormat();
    },

    get_userChangedDateInControl: function() {
        return this.userChangedDateInControl;
    },

    set_userChangedDateInControl: function(value) {
        this.userChangedDateInControl = value;
    },

    get_earliestDateMessage: function() {
        return this.earliestDateMessage;
    },

    set_earliestDateMessage: function(value) {
        this.earliestDateMessage = value;
    },

    get_latestDateMessage: function() {
        return this.latestDateMessage;
    },

    set_latestDateMessage: function(value) {
        this.latestDateMessage = value;
    },

    get_selectedHomeRouteId: function() {
        var value = Sembo.Dom.getSelectedValue(this._ferryHomeDropDown);
        return value ? parseInt(value, 10) : null;
    },

    get_selectedOutRouteId: function() {
        var value = Sembo.Dom.getSelectedValue(this._ferryOutDropDown);
        return value ? parseInt(value, 10) : null;
    },

    get_selectedVehicleType: function() {
        var value = Sembo.Dom.getSelectedValue(this._ferryVehicleTypeDropdown);
        return value ? parseInt(value, 10) : null;
    },

    get_singleVehicleRoutes: function() {
        /// <summary>
        /// Gets an array containing the ids of the routes that can only book one vehicle.
        /// </summary>
        return this._singleVehicleRoutes;
    },

    set_singleVehicleroutes: function(value) {
        /// <summary>
        /// Gets an array containing the ids of the routes that can only book one vehicle.
        /// </summary>
        this._singleVehicleRoutes = value;
    },

    get_multipleVehiclesIsAllowed: function() {
        /// <summary>
        /// Gets a value indicating if more than one vehicle
        /// can be searched for the selected route combination.
        /// </summary>

        if (this.get_selectedVehicleType() === 3) {
            // The option "no vehicle" is selected.
            return false;
        }

        var singleVehicleRoutes = this.get_singleVehicleRoutes();
        var homeRoute = this.get_selectedHomeRouteId();
        var outRoute = this.get_selectedOutRouteId();

        if (homeRoute === null || outRoute === null) return false;

        for (var i = 0; i < singleVehicleRoutes.length; i++) {
            if (singleVehicleRoutes[i] === homeRoute || singleVehicleRoutes[i] === outRoute) {
                return false;
            }
        }

        return true;
    },

    // methods
    initialize: function() {
        Sembo.Site.Transportation.UC.TransportationSearchFields.callBaseMethod(this, "initialize");
        var me = this;

        // event handlers
        this.ferryOutDateTextBox_change = function() {
            me._outDateSet = true;
            me.onFerryOutDateChanged();
        };

        this.ferryHomeDateTextBox_change = function() {
            me._homeDateSet = true;
            me.onFerryHomeDateChanged();
        };

        this.ferryOutDropDown_change = function(sender, eventArgs) {
            me.setStateOfNumberOfVechiclesDropDown();
        };

        this.ferryHomeDropDown_change = function(sender, eventArgs) {
            me.setStateOfNumberOfVechiclesDropDown();
        };

        this.ferryVehicleTypeDropdown_change = function(sender, eventArgs) {
            me.setStateOfNumberOfVechiclesDropDown();
        };

        $addHandler(this._ferryOutDateTextBox, "change", this.ferryOutDateTextBox_change);
        $addHandler(this._ferryHomeDateTextBox, "change", this.ferryHomeDateTextBox_change);
        $addHandler(this._ferryOutDropDown, "change", this.ferryOutDropDown_change);
        $addHandler(this._ferryHomeDropDown, "change", this.ferryHomeDropDown_change);
        $addHandler(this._ferryVehicleTypeDropdown, "change", this.ferryVehicleTypeDropdown_change);
        this.setStateOfNumberOfVechiclesDropDown();
    },

    dispose: function() {
        Sembo.Site.Transportation.UC.TransportationSearchFields.callBaseMethod(this, "dispose");

        $removeHandler(this._ferryOutDateTextBox, "change", this.ferryOutDateTextBox_change);
        $removeHandler(this._ferryHomeDateTextBox, "change", this.ferryHomeDateTextBox_change);
        $removeHandler(this._ferryOutDropDown, "change", this.ferryOutDropDown_change);
        $removeHandler(this._ferryHomeDropDown, "change", this.ferryHomeDropDown_change);
        $removeHandler(this._ferryVehicleTypeDropdown, "change", this.ferryVehicleTypeDropdown_change);
    },

    setStateOfNumberOfVechiclesDropDown: function() {
        var dd = this._numberOfVehiclesDropDown;

        if (this.get_multipleVehiclesIsAllowed()) {
            dd.disabled = false;
        }
        else {
            // Set selected value to 1 if hidden.
            var dd = this._numberOfVehiclesDropDown;
            Sembo.Dom.setSelectedValue(dd, "1");
            dd.disabled = true;
        }
    },

    onFerryOutDateChanged: function(changeOriginatesFromOtherControl) {
        if (!this.get_isInitialized()) return;

        if (!this.get_userChangedDateInControl() && !changeOriginatesFromOtherControl) {
            this.set_userChangedDateInControl(true);
        }

        var value = this.get_ferryOutDate();

        if (value) {
            if (value < this.get_earliestSelectableDate()) {
                Sys.Debug.trace("Changing the specified out date.");
                value = this.get_earliestSelectableDate();
                this.set_ferryOutDate(value, changeOriginatesFromOtherControl);
                alert(this.get_earliestDateMessage() + " " + this.get_earliestSelectableDate().localeFormat("d"));
                return;
            }

            //Sys.Debug.trace(this.get_earliestSelectableDate());
            Sys.Debug.trace(this.get_ferryHomeDate());
            Sys.Debug.trace(this.get_ferryOutDate());
            Sys.Debug.trace(this.get_earliestSelectableDate());

            var calendar = $find(this.get_element().id + "_TransportationDepartureCalendarExtender");
            if (calendar) calendar.set_selectedDate(value);

            this.raiseEvent("ferryOutDateChanged", Sys.EventArgs.empty);

            if (value > this.get_ferryHomeDate()) {
                this.set_ferryHomeDate(value, changeOriginatesFromOtherControl);
            }
        }

    },

    onFerryHomeDateChanged: function(changeOriginatesFromOtherControl) {
        if (!this.get_isInitialized()) return;

        if (!this.get_userChangedDateInControl() && !changeOriginatesFromOtherControl) {
            this.set_userChangedDateInControl(true);
        }

        var value = this.get_ferryHomeDate();

        if (value) {
            if (value > this.get_latestSelectableDate()) {
                Sys.Debug.trace("Changing the specified out date.");
                value = this.get_latestSelectableDate();
                this.set_ferryHomeDate(value, changeOriginatesFromOtherControl);
                alert(this.get_latestDateMessage() + " " + this.get_latestSelectableDate().localeFormat("d"));
                return;
            }

            var calendar = $find(this.get_element().id + "_TransportationReturnCalendarExtender");
            if (calendar) calendar.set_selectedDate(value);

            this.raiseEvent("ferryHomeDateChanged", Sys.EventArgs.empty);

            if (value < this.get_ferryOutDate()) {
                this.set_ferryOutDate(value, changeOriginatesFromOtherControl);
            }
        }

    },

    raiseEvent: function(eventName, eventArgs) {
        var handler = this.get_events().getHandler(eventName);

        if (handler) {
            handler(this, eventArgs);
        }
    },

    // events
    add_ferryOutDateChanged: function(handler) {
        this.get_events().addHandler("ferryOutDateChanged", handler);
    },

    remove_ferryOutDateChanged: function(handler) {
        this.get_events().removeHandler("ferryOutDateChanged", handler);
    },

    add_ferryHomeDateChanged: function(handler) {
        this.get_events().addHandler("ferryHomeDateChanged", handler);
    },

    remove_ferryHomeDateChanged: function(handler) {
        this.get_events().removeHandler("ferryHomeDateChanged", handler);
    }
}

Sembo.Site.Transportation.UC.TransportationSearchFields.registerClass("Sembo.Site.Transportation.UC.TransportationSearchFields", Sys.UI.Control);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();