﻿var IsAutoUpdateArrivalDate = false;
var IsAutoUpdateDepartureDate = false;
//check-in date
function ArrivalDateChanged(arrivalDate, departureDatePicker, durationComboBox) {
    var departureDate = departureDatePicker.get_selectedDate();
    var daysDiff = GetDateDiff(departureDate, arrivalDate);

    var shouldChangeDepartureDate = true;
    if (daysDiff <= 0)
        daysDiff = 1;
    else if (daysDiff > 60)
        daysDiff = 60;
    else
        shouldChangeDepartureDate = false;

    if (shouldChangeDepartureDate) {
        if (typeof (window.innerWidth) == 'number') {    /*Non-IE*/
            dDate = AddDaysToDate(arrivalDate, daysDiff);
            departureDate.setFullYear(dDate.getFullYear() + 1900);
            departureDate.setMonth(dDate.getMonth());
            departureDate.setDate(dDate.getDate());
        }
        else
            departureDate = AddDaysToDate(arrivalDate, daysDiff);

        IsAutoUpdateDepartureDate = true;   //prevent double-adjustment of departure date when call-back is triggered
        departureDatePicker.set_selectedDate(departureDate);
    }
    SetComboBoxValue(durationComboBox, daysDiff);
}
//check-out date
function DepartureDateChanged(departureDate, arrivalDatePicker, departureDatePicker, durationComboBox) {
    var arrivalDate = arrivalDatePicker.get_selectedDate();
    var daysDiff = GetDateDiff(departureDate, arrivalDate);

    if (daysDiff > 0) {
        if (daysDiff > 60) {
            daysDiff = 60;

            departureDate = new Date();

            if (typeof (window.innerWidth) == 'number') {    /*Non-IE*/
                dDate = AddDaysToDate(arrivalDate, daysDiff);
                departureDate.setFullYear(dDate.getFullYear() + 1900);
                departureDate.setMonth(dDate.getMonth());
                departureDate.setDate(dDate.getDate());
            }
            else
                departureDate = AddDaysToDate(arrivalDate, daysDiff);

            IsAutoUpdateDepartureDate = true; //prevent re-entry of this method when call-back is triggered
            departureDatePicker.set_selectedDate(departureDate);
        }
    }
    else {
        daysDiff = 1;
        arrivalDate = new Date();
        if (typeof (window.innerWidth) == 'number') {    /*Non-IE*/
            aDate = SubtractOneDayFromDate(departureDate)
            arrivalDate.setFullYear(aDate.getFullYear() + 1900);
            arrivalDate.setMonth(aDate.getMonth());
            arrivalDate.setDate(aDate.getDate());
        }
        else
            arrivalDate =  SubtractOneDayFromDate(departureDate)

        IsAutoUpdateArrivalDate = true;
        arrivalDatePicker.set_selectedDate(arrivalDate);
    }
    SetComboBoxValue(durationComboBox, daysDiff);
}
function DurationIndexChanged(durationComboBox, arrivalDatePicker, departureDatePicker) {

    var duration = parseInt(durationComboBox.get_value());
    var arrivalDate = arrivalDatePicker.get_selectedDate();
    var departureDate = new Date();

    if (typeof (window.innerWidth) == 'number') {    /*Non-IE*/
        dDate = AddDaysToDate(arrivalDate, duration);
        departureDate.setFullYear(dDate.getFullYear() + 1900);
        departureDate.setMonth(dDate.getMonth());
        departureDate.setDate(dDate.getDate());
    }
    else
        departureDate = AddDaysToDate(arrivalDate, duration);

    IsAutoUpdateDepartureDate = true;   //prevent re-entry of this method when call-back is triggered
    departureDatePicker.set_selectedDate(departureDate);
}
function RoomsIndexChanged(roomsComboBox, adultsComboBox, childrenComboBox) {
    var adultPax = 2;
    var pax = 4;
    var rooms = parseInt(roomsComboBox.get_value());
    var adults = parseInt(adultsComboBox.get_value());
    var children = parseInt(childrenComboBox.get_value());

    var originalAdults = adults;
    var originalChildren = children;

    var minGuests = rooms;
    var maxGuests = rooms * pax;
    var maxAdults = rooms * adultPax;

    if (adults > maxAdults)
        adults = maxAdults;

    var totalGuests = adults + children;

    if (totalGuests < minGuests)
        adults = adults + (minGuests - totalGuests);
    else if (totalGuests > maxGuests)
        children = children - (totalGuests - maxGuests);

    if (adults != originalAdults)
        SetComboBoxValue(adultsComboBox, adults);
    if (children != originalChildren)
        SetComboBoxValue(childrenComboBox, children);
}
function AdultsIndexChanged(roomsComboBox, adultsComboBox, childrenComboBox) {
    var adultPax = 2;
    var pax = 4;
    var rooms = parseInt(roomsComboBox.get_value());
    var adults = parseInt(adultsComboBox.get_value());
    var children = parseInt(childrenComboBox.get_value());

    var originalRooms = rooms;
    var originalChildren = children;

    var totalGuests = adults + children;

    rooms = Math.max(RoundUp(totalGuests, pax), RoundUp(adults, adultPax));
    rooms = Math.min(rooms, 9);

    if (rooms == 9 && totalGuests > 9 * pax)
        children = children - (totalGuests - (9 * pax));

    if (rooms != originalRooms)
        SetComboBoxValue(roomsComboBox, rooms);
    if (children != originalChildren)
        SetComboBoxValue(childrenComboBox, children);
}
function ChildrenIndexChanged(roomsComboBox, adultsComboBox, childrenComboBox) {
    var adultPax = 2;
    var pax = 4;
    var rooms = parseInt(roomsComboBox.get_value());
    var adults = parseInt(adultsComboBox.get_value());
    var children = parseInt(childrenComboBox.get_value());

    var originalRooms = rooms;
    var originalAdults = adults;
    var originalChildren = children;

    var tempAdults = adults;
    var totalGuests = adults + children;

    rooms = Math.max(RoundUp(totalGuests, pax), RoundUp(adults, adultPax));
    rooms = Math.min(rooms, 9);

    if (rooms == 9 && totalGuests > 9 * pax) {
        tempAdults = tempAdults - (totalGuests - (9 * pax));

        if (tempAdults <= 0) {
            tempAdults = 1;
            children = (9 * pax) - 1;
        }
    }

    adults = tempAdults;

    if (rooms != originalRooms)
        SetComboBoxValue(roomsComboBox, rooms);
    if (adults != originalAdults)
        SetComboBoxValue(adultsComboBox, adults);
    if (children != originalChildren)
        SetComboBoxValue(childrenComboBox, children);
}
function GetDateDiff(date1, date2) {
    var ONE_DAY = 1000 * 60 * 60 * 24
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()
    var difference_ms =date1_ms - date2_ms;
    return Math.round(difference_ms/ONE_DAY)
}
function AddDaysToDate(date, days) {
    var day = date.getDate();
    var month = date.getMonth() + 1;
    var year = date.getYear();

    day = eval(day) + eval(days);   //without eval() it works out to "1" + "1" = "11" not 1+1=2
    var daysInThisMonth = daysInMonth(month, year);
    while (day > daysInThisMonth) {
        day = day - daysInThisMonth;
        month = month + 1;
        if (month > 12) {
            month = 1;
            year = year + 1;
        }
        daysInThisMonth = daysInMonth(month, year);
    }
    var result = new Date(year, month-1, day);
    return result;
}
function SubtractOneDayFromDate(date) {
    var day = date.getDate();
    var month = date.getMonth()+1;
    var year = date.getYear();

    day = day - 1;
    if (day == 0)
    {
        month = month - 1;
        if (month <= 0) {
            month = 12;
            year = year - 1;
        }
        day = daysInMonth(month, year);
    }
    var result = new Date(year, month-1, day);
    return result;
}
function daysInMonth(month, year)
{
    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
        return 31;
    else if (month == 2)
    {
        year = 2000 - year;
        if (year % 4 == 0) //is leap year
            return 29;
        else
            return 28;
    }
    else
        return 30;
}
function SetComboBoxValue(comboBox, value) {
    comboBox.trackChanges();
    var item = comboBox.findItemByValue(value);
    if (item)
        item.select();
    comboBox.commitChanges();
}
function RoundUp(value1, value2) {
    var result = Math.floor(value1 / value2);
    if (value1 % value2 != 0)
        result = result + 1;
    return result;
}
