﻿
var Error = {
    selects: [{element:'nb_nuit', height:'22px'}],
    messagesList: null,
    display: function(elementPositionReference, isDefaultMessage) {
        if($('errorMessage')) {
            if($$('#errorMessage .defaultMessage')[0] && $$('#errorMessage .otherMessage')[0]) {
                if(isDefaultMessage) {
                    $$('#errorMessage .defaultMessage')[0].show();
                    $$('#errorMessage .otherMessage')[0].hide();
                } else {
                    $$('#errorMessage .defaultMessage')[0].hide();
                    this.selectMessage($$('#errorMessage .otherMessage')[0], 0);
                    $$('#errorMessage .otherMessage')[0].show();  
                }
            }
            $('errorMessage').setStyle('position', 'absolute');
            Position.clone(elementPositionReference, $('errorMessage'), {setLeft: false, setWidth: false, setHeight: false});
            $('errorMessage').addClassName('show');
            $('errorMessage').addClassName('show');
            //this.hideShowSelects(false);
            Event.observe($('errorMessage'), 'click', function(){
                $('errorMessage').removeClassName('show');
                $$('#errorMessage .defaultMessage')[0].show();
                $$('#errorMessage .otherMessage')[0].hide();
                //this.hideShowSelects(true);
            }.bind(this));
        }
    },
    hideShowSelects: function(isShown) {
        this.selects.each(function(item) {
            if(isShown) {
                $(item.element).show();
                $(item.element).up(0).setStyle({height: item.height, display: 'inline'});
            } else {
                $(item.element).hide();
                $(item.element).up(0).setStyle({height: item.height, display: 'block'});
            }
        }.bind(this));
    },
    selectMessage: function(element, index) {
        if(!this.messagesList) {
            this.messagesList = element.innerHTML.split('$$');
        }
        element.innerHTML = this.messagesList[index];
    }
}

/**
 * gestion des dates
 */
var bookingEngine = {
    bookingEngineViewBean: null,
    profileViewBean: null,
    arrival_date: null,
    departure_date: null,
    firstBookingDate: new Date(),
    maxStay: 30,
    minStay: 1,
    maxPeriod: 405,
    maxPeriodInit: this.maxPeriod,
    nights_select_index: null,
    init: function() {
        this.setupRoomsDatesCalendar();
    },
    //setup calendar for stay dates
    setupRoomsDatesCalendar: function() {
        if ($("arrivee")) { //since we want to be able to create a calendar when focusin or clicking on the field
            //but we don't want manual input int the field
            //blur it when focus is gained
            Event.observe($("arrivee"), 'focus',
            function(e) {
                Event.element(e).blur();
            });
            $("date_arrivee_img").style.cursor = "pointer";
            var onSelect = function(cal, date) { //computes departure date to check if cal date + departure date < today + maxPeriod
                var departure_date = new Date();
                departure_date.setTime(cal.date.getTime() + (this.nights_select_index + 1) * Date.DAY);
               if (!this.checkDate(departure_date)) {
                    return false;
                } 
                if (cal.dateClicked) {
                    this.arrival_date = cal.date;
                    this.setDateHiddenFieldsValue(cal.date);
                    if ($("arrivee").previous('span.jour')) $("arrivee").previous('span.jour').innerHTML = Calendar._DN[cal.date.getDay()];
                    if($('depart')) {
                        this.updateDepartureDate();
                    }
                    $("arrivee").value = date;
                    cal.hide();
                }
                return true;
            }
            var disableDates = function(dDate, y, m, d) {
                var now = new Date(this.firstBookingDate.getFullYear(),this.firstBookingDate.getMonth(), this.firstBookingDate.getDate(), 0, 0, 0);
                if (dDate.getTime() < now.getTime()) {
                    return true;
                }

                var max_period = now.getTime() + (Date.DAY * this.maxPeriodInit) - (Date.DAY * (this.nights_select_index + 1));
                
                if (dDate.getTime() > max_period) {
                    return true;
                }
                return false;
            }
            var calendarDate = null;
            if (typeof(this.arrival_date) != "undefined" && this.arrival_date) {
                var calendarDate = this.arrival_date;
                this.setDateHiddenFieldsValue(this.arrival_date);
            }
            
            Calendar.setup({
                inputField: "arrivee",
                button: 'date_arrivee_img',
                button_eventNames: ['click'],
                inputField_eventNames: ['click', 'focus'],
                ifFormat: Calendar._TT["DEF_DATE_FORMAT"],
                singleClick: true,
                onSelect: onSelect.bind(this),
                dateStatusFunc: disableDates.bind(this)
            });
            calendar = window.calendar = window.flatCalendar;
        }
        if ($("nb_nuit") && this.maxStay) {
            this.setupMaxStayDropDown();
        }
    },
    checkDate: function(date) {
        var b = true;
        var msg_code = null;
        var now = new Date();
        if (date.getTime() < now.getTime() && date.getMonth() != now.getMonth()) {
            b = false;
            msg_code = "outOfMinDate";
            var min_date = new Date();
            min_date.setTime(now.getTime());
            window.calendar.setDate(min_date);
        }
        var max_period = now.getTime() + (Date.DAY * (this.maxPeriod ? this.maxPeriod: 405));
        if (date.getTime() >= max_period) {
            b = false;
            msg_code = "outOfMaxDate";
            var safe_date = new Date();
            safe_date.setTime(max_period - ((this.nights_select_index + 1) * Date.DAY));
            window.calendar.setDate(safe_date);
        }
        if (!b) alert(I18N._('calendar', msg_code));
        return b;
    },
    setDateHiddenFieldsValue: function(date) {
        $("jour_arrivee").value = date.getDate();
        $("mois_arrivee").value = date.getMonth() + 1; // janvier=0
        $("annee_arrivee").value = date.getFullYear();
    },
    showDate: function() {
         $('arrivee').value = this.firstBookingDate.print(Calendar._TT["DEF_DATE_FORMAT"]);
    },
    //adds the number of options to the nb_nuit select box based on the json var
    //also writes the nb of nights where appropriate
    setupMaxStayDropDown: function() {
        var select = $('nb_nuit');
        var options_array = select.descendants();
        var count = 0; //empty select box if not empty
        if (options_array.length) {
            options_array.each(function(option) {
                $(option).remove();
            })
        } //fill select box with maxStay value
        for (var i = this.minStay; i <= this.maxStay; i++) {
            var selected = false;
            this.nights_select_index = this.minStay;
            var option = new Option(i, i, selected); //3rd parameter seems to be ignored by ie
            select.options.add(option);
        }
        Event.observe(select, "change",
        function(e) {
            var date = new Date();
            if (window.calendar && window.calendar.date) {
                date.setTime(window.calendar.date.getTime());
            } else if (this.arrival_date) {
                date.setTime(this.arrival_date.getTime());
            }
            date.setTime(date.getTime() + Date.DAY * Event.element(e).options[Event.element(e).selectedIndex].value);
            if (!this.checkDate(date)) {
                Event.element(e).selectedIndex = this.nights_select_index;
                return false;
            }
            this.nights_select_index = Event.element(e).selectedIndex;
            this.updateDepartureDate();
        }.bind(this));
        if (this.arrival_date != undefined) this.updateDepartureDate();
    },
    updateDepartureDate: function() {
        if (this.arrival_date == undefined) {
            return false;
        }
    }
}
Event.observe(window, 'load', function() {
    if (typeof(bookingEngineUnload) == 'undefined') {
        bookingEngine.init();
        //bookingEngine.showDate();  permettre le choix d'une réservation sans date
    }
});
