/**
 * @fileOverview Classes, functions for accm pages
 * 
 * @author Whl Member 
 */

/**
* @namespace Contains common functions, classes for ACCM
*/
Whl.Accm = {pickupRate: null};

/**
 * Control is used for accm rate, to filter the date that has season
 * 
 * @class Whl.Accm.Rate
 * @param {String} accmUrl Accm URL string
 * @param {Array} initData Array of date that has season.
 */
Whl.Accm.Rate = function(accmUrl, initData)
{
    this._data = initData || null;
    this._checkin = $('#checkin');
    this._checkout = $('#checkout');    
    this._accmUrl = accmUrl + '?act=GetDateRate' + ( (typeof isNewHotelSite != 'undefined' && isNewHotelSite)?"&new_hotel_site=true":"" );
    this.initialize();
};

Whl.Accm.Rate.prototype = {
    /**
     * Initialize the calendars and controls
     * 
     * @returns {void}
     */
    initialize: function() {
        // Init the calendars
        var option = {dateFormat: 'dd M yy', showOn: 'both', buttonImage: '/images/blue/en/icon_calendar.gif', buttonImageOnly: true, minDate: new Date()};
        option.beforeShowDay = this._beforeShowday.bind(this); 
        option.onChangeMonthYear = this._changeMonth.bind(this);

        this._checkin.datepicker(Object.extend({
            onSelect: function(dateText, inst) {
                var date = new Date(dateText);
                var checkOutDate = $('#checkout').datepicker('getDate');
                if (date.getTime() >= checkOutDate.getTime()) {
                    date.setDate(date.getDate() + 1);
                    //$('#checkout').val((date.getDate() < 10 ? '0' : '') +date.toDateStringExt());
                    $('#checkout').val(date.toDateStringExt());
                }
            }
        }, option));
        option.beforeShow = function(input) {
            var date = this._checkin.datepicker('getDate');
            date.setDate(date.getDate() + 1);
            this._checkout.datepicker('option', 'minDate', date);
        }.bind(this);
        this._checkout.datepicker(option);
        // Init Adult & Child
        var adult = Whl.getCookie('accm_adult');
        if (!adult) adult = 2;
        Whl.Combo.get('adult').setSelectedItems([adult]);
        // Check the accm has been allowed children or not
        if ($('#child').isExist()) {
            var child = Whl.getCookie('accm_child');
            if (!child) child = 0;
            Whl.Combo.get('child').setSelectedItems([child]);
        }
        // Show prices
        $('#show-price').click(function () {
            $('#frmUpdatePrice').submit();
        });
        // Get rate for this month
        if (this._data == null) {
            this._data = {};
            var fromDate = this._checkin.datepicker('getDate');
            var toDate = this._checkout.datepicker('getDate');
            if (fromDate.getMonth() != toDate.getMonth()) this.get(fromDate, this.get(toDate));
            else this.get(fromDate);
        }
    },
    /**
     * Get rate in month
     * 
     * @param {String|Object} date
     * @param {Function} complete Function will be called after request is completed
     * @param {Object|Array} param More optional params
     * @returns {void}
     */
    get: function(date, complete, param) {
        param = param || [];
        complete = complete || null;
        if (Object.isObject(date)) date = '01/' + (date.getMonth() + 1) + '/' + date.getFullYear();
        var data = Object.createQueryString(param);
        data += (data ? '&' : '') + 'date=' +  date;
        var option = {
            type: 'POST',
            url: this._accmUrl,
            dataType: 'text',
            data: data,
            success:  function(data) {
                if (Whl.isJson(data)) {
                    data = eval('(' + data + ')');
                    Object.extend(this._data, data);
                    if (Object.isFunction(complete)) complete();
                } else {
                    //Whl.Dialog.error({msg: data});
                }
            }.bind(this),
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                //Whl.Dialog.error({msg: textStatus});
            }
        };
        $.ajax(option);
    },
    /**
     * Event handler for before show day of calendar, hide/show date if season is avialable or not
     * 
     * @param {Date} date Date object
     * @returns {Object}
     */
    _beforeShowday: function(date) {
        var monthYear = (date.getMonth() + 1) + '-' + date.getFullYear();
        var isAvailable = false;
        if (!Object.isUndefined(this._data[monthYear])) {
            var dates = this._data[monthYear];
            for (var k in dates) {
                var dateRate =  new Date(dates[k]);
                if (date.getTime() == dateRate.getTime()) {
                    isAvailable = true;
                    break;
                }
            }
        }
        if (isAvailable) {
            return [true, ''];
        } else {
            return [false, ''];
        }
    },
    /**
     * Event handler change the month. Get the date that has season in month 
     * Get data and then refresh the calendar
     * 
     * @param {Number} year
     * @param {Number} month
     * @param {Object} inst Calendar Elment object
     * @returns {void}
     */
    _changeMonth: function(year, month, inst) {
        if (Object.isUndefined(this._data[month + '-' + year])) {
            this.get('01/' + month + '/' + year, function() {
                DP_jQuery.datepicker._adjustDate('#' + inst.id);
            });
        }
    }
};

Object.extend(Whl.Accm, {
    pickupOptions: false,
    /**
     * Submit booking 
     * 
     * @memberOf Whl.Accm
     * @param {Number} addTours
     * @param {Boolean} isEmbed
     * @returns {void}
     */
    submitBooking: function(addTours, isEmbed) {
        isEmbed = isEmbed || false;
        if (this.validateRate()) {
            // Check pickup
            var pickup = $('#pickup_none');
            if (pickup.isExist() && !pickup.get(0).checked) {                        
                if($('#start_hour').val() == -1 && $('#start_minute').val() == -1 && !$('#pickup_free').isExist() || $('#click_see_opt').val() == 0){
                    if(!$('#pickup_free').isExist()){
                        Whl.Dialog.error({title: 'Warning', msg: Message.Error.exceedSeeOpt});
                        return false;
                    }
                }
                var fields = [
                    ['start_hour', {blank: Message.Error.arrivalTime.hour}],
                    ['start_minute', {blank: Message.Error.arrivalTime.minute}]
                ];
                if($('#pickup_service').val() != -1)                    
                    fields.push(['transport_no', {blank: 'Please input Transport/Flight No.'}]);
                
                if ($('#pickup_free').isExist()) {
                    fields.push(['location', {blank: Message.Error.pickupLocation}]);
                    if (!Whl.validate(fields, "frmRate", "err_pickup", false)) return false;
                } else {
                    var result = Whl.validate(fields, "frmRate", "err_pickup", false);
                    if (!result) return false;
                    // Check Pickup Options
                    pickup = Whl.Combo.get('pickup_service');
                    if(!Object.isUndefined(pickup.options))
                    {
	                    if (result && pickup.options.length == 1 && !Whl.Accm.pickupOptions) {
	                        fields = [['pickup_service', {blank: Message.Error.pickup}]];
	                        if (!Whl.validate(fields, "frmRate", "err_pickup", false)) return false;
	                    } else if (pickup.options.length > 1 && $(pickup).val() == -1) {
	                        fields = [['pickup_service', {blank: Message.Error.exceedOpt}]];
	                        if (!Whl.validate(fields, "frmRate", "err_pickup", false)) return false;
	                    }
                    }
                }
            }
            addTours = addTours || 0;
            var option = {
                type: 'POST',
                url: '?act=Booking',
                dataType: 'json',
                data: $('#frmRate').serialize() + ('&' +  $('#adult,#child').serialize()) + (addTours ? '&add_tours=1' : ''),
                success:  function(data) {	
                    setTimeout(function() {Whl.Dialog.close('check');}, 100);                    
                    //Whl.Dialog.close('check');								
                    if (data.result) {                        
						/*
                        if (isEmbed){  
                            var userAgent = navigator.userAgent.toString().toLowerCase();                          
                            if(!$.browser.webkit ){
                                var sh=screen.height;
                                var sw=screen.width;
                                window.location.href = data.action;
                                //window.open(data.action,'','status=0,toolbar=1,scrollbars=1,menubar=1,'+'width='+sw+',height='+sh);                            
                            }else{//for safari                     								
                                if($("#bookingOnSafari").length == 0) $('body').append("<div id='bookingOnSafari'>"+Message.continueBooking+"</div>");
                                $("#bookingOnSafari").dialog({
                                    title : '',
                                    bgiframe: true,
                                    autoOpen: false,
                                    modal: true,
                                    width: 300,
                                    height: 100,
                                    buttons: {
                                        "Close": function() {
                                            $('#bookingOnSafari').dialog('close');
                                        },
                                        "OK": function() {
                                            $('#bookingOnSafari').dialog('close');
                                            var sh=screen.height;
                                            var sw=screen.width;
                                            window.open(data.action,'','status=0,toolbar=1,scrollbars=1,menubar=1,'+'width='+sw+',height='+sh); 
                                        }
                                    }
                                });                                
                                $("#bookingOnSafari").dialog('open');                                
                            }
                        }
                        else  */location.href = data.action;
                    } else Whl.Dialog.error({title: 'Error', msg: Message.Error[data.error]});
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    Whl.Dialog.close('check');
//                    Whl.Dialog.error({msg: textStatus, remove: true});
                }
            };
            if (isEmbed) option.async = false;
            Whl.Dialog.msg({id: 'check', title: Message.Dlg.title3, msg: Message.Dlg.checking});
            $.ajax(option);
        }
    },
    /**
     * Validate data
     * 
     * @memberOf Whl.Accm
     * @returns {Boolean}
     */
    validateRate: function() {                       
        var bedNum = travellerNum = 0, firstRoom = null, lastSelectedRoom = null, valid = true;
        var adult = parseInt($('#adult').val()), child = ($('#child').isExist() ? parseInt($('#child').val()) : 0);        
        $('.bed').each(function() {
            if (firstRoom == null) firstRoom = $(this);
            var quantity = parseInt(this.options[this.selectedIndex].value);
            if (quantity > 0) {
                var id = this.id.split('_') ;
                var rateType = parseInt(id[2]);
                var roomParam = $('#room-param-' + id[1]).val();
                roomParam = roomParam.split('-');
                if (0 == rateType) travellerNum += quantity*parseInt(roomParam[2]);
                else if (1 == rateType) travellerNum += quantity;
                if (parseInt(roomParam[3]) > 0 && 0 == rateType) travellerNum += 1*quantity;
                bedNum += quantity;
                if (bedNum > 0 && bedNum > (adult + child)) {
                    Whl.Dialog.msg({title: Message.Dlg.title2, msg: Message.Error.exceedRoom, callback: function() { firstRoom.focus();}});
                    valid = false;
                }
                lastSelectedRoom = $(this);
            }
        });
                  
        if(typeof isInstantBookingOnly != 'undefined' && isInstantBookingOnly){ // for new hotel sites that only accept instant booking
            var allotmentValid = true;  
            $("table.rate_table td").removeClass("alm_error");            
            for (var i=0; i< arrIds.length; i++ ){
                catRmId = arrIds[i];
                if(typeof catRmId == 'number'){ //allotment level is category
                    var quantity = 0;
                    $("td[name=td_"+catRmId+"_0]").each(function(){
                        quantity += parseInt($(this).children("select").val());
                    })
                    var alm = 0;
                    $.each(almData,function(index, almItem){
                        if(catRmId == almItem.id) alm = almItem.num;
                    });
                    if(quantity > alm){                        
                        var firstRoom = $("td[name=td_"+catRmId+"_0]:first").children("select"); 
                        $("td[name=td_"+catRmId+"_0]").closest("tr").children().addClass("alm_error");
                        Whl.Dialog.msg({title: Message.Dlg.title2, msg: Message.Error.exceedAlm, callback: function() { firstRoom.focus();}});
                        valid = false;
                        break;
                    }
                }else{// allotment level is room type
                    var quantity = 0;                   
                    $("td[name=td_"+catRmId+"]").each(function(){
                        quantity += parseInt($(this).children("select").val());
                    })                    
                    var alm = 0;
                    $.each(almData,function(index, almItem){
                        if(catRmId == almItem.id || catRmId.indexOf(almItem.id) == 0 ) alm = almItem.num;
                    });
                    if(quantity > alm){
                        var firstRoom = $("td[name=td_"+catRmId+"]:first").children("select"); 
                        $("td[name=td_"+catRmId+"]").closest("tr").children().addClass("alm_error");             
                        Whl.Dialog.msg({title: Message.Dlg.title2, msg: Message.Error.exceedAlm, callback: function() { firstRoom.focus();}});
                        valid = false;
                        break;
                    }
                }                            
            }            
            if(!allotmentValid ) return false; // stop if checking alloment fail 
        }
        
                                     
        if (0 == bedNum) {
            Whl.Dialog.msg({title: Message.Dlg.title2, id:'msg1', msg: Message.Error.quanlity, callback: function() {firstRoom.focus();}});
            valid = false;
        } else if ((adult + child) > travellerNum) {
            Whl.Dialog.msg({title: Message.Dlg.title2, id:'msg1', msg: Message.Error.exceedBed, callback: function() { lastSelectedRoom.focus();}});
            valid = false;
        }
        return valid;
    },
    /**
     * Get Pickup services
     * 
     * @return {void}
     */
    getPickup: function() {
        $('#click_see_opt').val(1);
        var fields = [
            ['start_hour', {blank: Message.Error.arrivalTime.hour}],
            ['start_minute', {blank: Message.Error.arrivalTime.minute}]
        ];
        if($('input::checked[name=pickup_type]').val() == 2){
        	fields.push(['end_hour', {blank: Message.Error.returnTime.hour}]);
        	fields.push(['end_minute', {blank: Message.Error.returnTime.minute}]);
        }
        if (!Whl.validate(fields, "frmRate", "err_pickup", false)) return false;
        var option = {
            type: 'POST',
            url: '?act=getPickup',
            dataType: 'text',
            data: $('.err_check select,.err_check input').serialize(),
            success:  function(data) {
                data = eval('(' + data + ')');
                Whl.Accm.pickupOptions = true;
                if (data.result) { 
                    Whl.Accm.pickupRate = data.rates;
                    if(data.services.length > 0)
                    {
	                    $('#uxPickupService').show();
                    	if(data.services.length == 1){
                    		$('#uxPickupService1').html('');
                    		var input = "<input type='hidden' id='pickup_service' name='pickup_service' value='"+data.services[0].value+"'/>" + 
                                    "<span id='pickup_service_2' style='float: left; margin-top:4px; margin-left: 4px;margin-right: 4px;'>"+data.services[0].text+"</span>";
                    		$('#uxPickupService2').html('');
                    		$('#uxPickupService2').append(input);
                    	}else{
                    		
                    		$('#uxPickupService2').html('');
                    		var selectObject = "<select id='pickup_service' name='pickup_service' style='max-width:440px; width:auto'>";
                    		selectObject = selectObject + "<option value='-1'>-- Select --</option>";
                    		for(var i= 0; i<data.services.length;i++)
                    		{
                    			selectObject = selectObject + "<option value='"+data.services[i].value+"'>"+data.services[i].text+"</option>";
                    		}	
                    		selectObject = selectObject + "</select>";
                    		$('#uxPickupService1').html('');
                    		$('#uxPickupService1').append(selectObject);
                    		/*Whl.Combo.get('pickup_service')
	                           .removeAll()
	                           .addItem({text: Message.Combo.select, value: -1, selected: true})
	                           .addItems(data.services);*/
                    	}
                    }
                } else {
                	$('#uxPickupService').hide();
                    $('#err_pickup').removeClass().addClass('error').html(Message.Error[data.error]);
                    //Whl.Combo.get('pickup_service').removeAll().addItem({text: Message.Combo.select, value: -1, selected: true});
                }
                Whl.Dialog.closeMsg();
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {}
        };
        Whl.Dialog.msg({title: Message.Dlg.title, msg: Message.Dlg.loading});
        $.ajax(option);
    }
});

