﻿Type.registerNamespace("Sembo.Site.Accommodation.UC");

Sembo.Site.Accommodation.UC.AccommodationSearchFields = function (element)
{

    Sembo.Site.Accommodation.UC.AccommodationSearchFields.initializeBase(this, [element]);

    function getChildControl(controlId)
    {
        return $get(element.id + "_" + controlId);
    };

    this._arrivalDateTextBox = getChildControl("AccomodationArrivalTextBox");
    this._departureDateTextBox = getChildControl("AccomodationDepartureTextbox");
    this._childAgesTextBox = getChildControl("AccomodationChildAgeTextBox");
    this._countryDropDown = getChildControl("AccommodationCountryDropdown");
    this._cityDropDown = getChildControl("AccommodationCityDropDown");
    this._arrivalRangeValidator = getChildControl("AccommodationArrivalRangeValidator");
    this._departureRangeValidator = getChildControl("AccommodationDepartureRangeValidator");

    this.earliestSelectableDateString = null;
    this.latestSelectableDateString = null;
    this.earliestDateMessage = null;
    this.latestDateMessage = null;
    this.minimumNights = null;
    this.maximumNights = null;

    this._arrivalDateSet = false;
    this._departureDateSet = false;

    this.countryDisable = false;
    this.cityDisable = false;
    this.supplierDisable = false;


    this.userChangedDateInControl = false;
}

Sembo.Site.Accommodation.UC.AccommodationSearchFields.prototype =
{
    // properties
    get_arrivalDateSet: function () {
        return this._arrivalDateSet;
    },

    get_departureDateSet: function () {
        return this._departureDateSet;
    },

    get_arrivalDate: function () {
        return Date.parseLocale(this._arrivalDateTextBox.value);
    },

    set_arrivalDate: function (value, changeOriginatesFromOtherControl) {
        Sembo.ThrowHelper.argumentNullException(value, "value");

        var stringValue = value.localeFormat("d");

        if (this._arrivalDateTextBox.value !== stringValue) {
            this._arrivalDateTextBox.value = stringValue;
            this.onArrivalDateChanged(changeOriginatesFromOtherControl);
        }
    },

    get_departureDate: function () {
        return Date.parseLocale(this._departureDateTextBox.value);
    },

    set_departureDate: function (value, changeOriginatesFromOtherControl) {
        Sembo.ThrowHelper.argumentNullException(value, "value");

        var stringValue = value.localeFormat("d");

        if (this._departureDateTextBox.value !== stringValue) {
            this._departureDateTextBox.value = stringValue;
            this.onDepartureDateChanged(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_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_minimumNights: function () {
        return this.minimumNights;
    },

    set_minimumNights: function (value) {
        this.minimumNights = value;
    },

    get_maximumNights: function () {
        return this.maximumNights;
    },

    set_maximumNights: function (value) {
        this.maximumNights = value;
    },

    get_secondsPerDay: function () {
        return 24 * 60 * 60 * 1000;
    },

    get_countryDisable: function () {
        return this.countryDisable;
    },

    set_countryDisable: function (value) {
        this.countryDisable = value;
    },

    get_cityDisable: function () {
        return this.cityDisable;
    },

    set_cityDisable: function (value) {
        this.cityDisable = value;
    },

    get_supplierDisable: function () {
        return this.supplierDisable;
    },

    set_supplierDisable: function (value) {
        this.supplierDisable = value;
    },

    get_userChangedDateInControl: function () {
        return this.userChangedDateInControl;
    },

    set_userChangedDateInControl: function (value) {
        this.userChangedDateInControl = value;
    },



    // methods
    initialize: function () {
        Sembo.Site.Accommodation.UC.AccommodationSearchFields.callBaseMethod(this, "initialize");
        var me = this;

        // event handlers
        this.arrivalDateTextBox_change = function () {
            me._arrivalDateSet = true;
            me.onArrivalDateChanged();
        };

        this.departureDateTextBox_change = function () {
            me._departureDateSet = true;
            me.onDepartureDateChanged();
        };

        this.application_load = function (s, e) {
            var element = me.get_element();
            var countryBehavior = $find("countryBehaviorID");
            var cityBehavior = $find("cityBehaviorID");
            var supplierBehavior = $find("supplierBehaviorID");

            if (countryBehavior && me.countryDisable) {
                countryBehavior.add_populated(me.onPopulating);
            }
            if (cityBehavior && me.cityDisable) {
                cityBehavior.add_populated(me.onPopulating);
            }
            if (supplierBehavior && me.supplierDisable) {
                supplierBehavior.add_populated(me.onPopulating);
            }
        };

        this.onPopulating = function (sender, eventArgs) {
            sender.get_element().disabled = true;
        };

        Sys.Application.add_load(this.application_load);

        $addHandler(this._arrivalDateTextBox, "change", this.arrivalDateTextBox_change);
        $addHandler(this._departureDateTextBox, "change", this.departureDateTextBox_change);
    },

    dispose: function () {
        Sembo.Site.Accommodation.UC.AccommodationSearchFields.callBaseMethod(this, "dispose");

        //if (!!this.application_load) {
        Sys.Application.remove_load(this.application_load);

        $removeHandler(this._arrivalDateTextBox, "change", this.arrivalDateTextBox_change);
        $removeHandler(this._departureDateTextBox, "change", this.departureDateTextBox_change);
        //}
    },

    getNumberOfNights: function () {
        var seconds = this.get_departureDate().getTime() - this.get_arrivalDate().getTime();
        var nights = seconds / this.get_secondsPerDay();

        return nights;
    },

    onArrivalDateChanged: function (changeOriginatesFromOtherControl) {
        if (!this.get_isInitialized()) return;

        if (!this.get_userChangedDateInControl() && !changeOriginatesFromOtherControl) {
            this.set_userChangedDateInControl(true);
        }

        var arrivalDate = Sembo.DateTransformation.ParseDateShortHandForFromDate(this._arrivalDateTextBox.value);
        if (arrivalDate != null) {
            this.set_arrivalDate(arrivalDate, false);
        }

        var value = this.get_arrivalDate();

        if (value && this.get_departureDate()) {
            var nights = this.getNumberOfNights();

            if (value < this.get_earliestSelectableDate()) {
                value = this.get_earliestSelectableDate();
                this.set_arrivalDate(value, changeOriginatesFromOtherControl);
                alert(this.get_earliestDateMessage() + " " + this.get_earliestSelectableDate().localeFormat("d"));
                return;
            }
            else if (value > this.get_latestSelectableDate()) {
                value = this.get_latestSelectableDate()
                this.set_arrivalDate(value, changeOriginatesFromOtherControl);
                alert(this.get_latestDateMessage() + " " + this.get_latestSelectableDate().localeFormat("d"));
                return;
            }

            var calendar = $find(this.get_element().id + "_AccomodationArrivalCalendarExtender");
            if (calendar) calendar.set_selectedDate(value);

            if (value > this.get_departureDate()) {
                this.set_departureDate(value, changeOriginatesFromOtherControl);
            }
        }

        this.raiseEvent("arrivalDateChanged", Sys.EventArgs.empty);
    },

    onDepartureDateChanged: function (changeOriginatesFromOtherControl) {
        if (!this.get_isInitialized()) return;

        if (!this.get_userChangedDateInControl() && !changeOriginatesFromOtherControl) {
            this.set_userChangedDateInControl(true);
        }

        var departureDate = Sembo.DateTransformation.ParseDateShortHandForToDate(this._arrivalDateTextBox.value, this._departureDateTextBox.value);
        if (departureDate != null) {
            this.set_departureDate(departureDate, false);
        }
        var value = this.get_departureDate();

        if (value && this.get_arrivalDate()) {

            var nights = this.getNumberOfNights();

            var calendar = $find(this.get_element().id + "_AccomodationDepartureCalendarExtender");
            if (calendar) calendar.set_selectedDate(value);

            if (value < this.get_arrivalDate()) {
                this.set_arrivalDate(value, changeOriginatesFromOtherControl);
            }
        }

        this.raiseEvent("departureDateChanged", Sys.EventArgs.empty);
    },

    raiseEvent: function (eventName, eventArgs) {
        var handler = this.get_events().getHandler(eventName);

        if (handler) {
            handler(this, eventArgs);
        }
    },

    // events
    add_arrivalDateChanged: function (handler) {
        this.get_events().addHandler("arrivalDateChanged", handler);
    },

    remove_arrivalDateChanged: function (handler) {
        this.get_events().removeHandler("arrivalDateChanged", handler);
    },

    add_departureDateChanged: function (handler) {
        this.get_events().addHandler("departureDateChanged", handler);
    },

    remove_departureDateChanged: function (handler) {
        this.get_events().removeHandler("departureDateChanged", handler);
    },

    hasValidNumberOfNightsSelected: function () {
        return Sembo.Validations.ValidateTimeSpanIsGreaterThanOrEqualToDayCount(this.get_arrivalDate(), this.get_departureDate(), this.get_minimumNights()) &&
          Sembo.Validations.ValidateTimeSpanIsLessThanOrEqualToDayCount(this.get_arrivalDate(), this.get_departureDate(), this.get_maximumNights());
    }
}

Sembo.Site.Accommodation.UC.AccommodationSearchFields.registerClass("Sembo.Site.Accommodation.UC.AccommodationSearchFields", Sys.UI.Control);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

