var Booking = Class.create();
Booking.prototype = {
    initialize: function(accordion, urls){
        this.accordion = accordion;
        this.progressUrl = urls.progress;
        this.reviewUrl = urls.review;
        this.saveMethodUrl = urls.saveMethod;
        this.failureUrl = urls.failure;
        this.billingForm = false;
        this.shippingForm= false;
        this.syncBillingShipping = false;
        this.method = '';
        this.payment = '';
        this.loadWaiting = false;
        this.steps = ['time', 'rooms', 'services','personal', 'payment', 'review'];

        //this.onSetMethod = this.nextStep.bindAsEventListener(this);

        this.accordion.disallowAccessToNextSections = true;
    },

    ajaxFailure: function(transport){
		new Ajax.Request('http://www.atlantahotel.ru/booking/onepage/errorLog', {
		  method: 'post',
		  parameters: {error: "Unknown error\n"+transport.responseText+"\n\n"}
		  });
    	alert('Unknown error'); 
    	location.href = 'http://www.atlantahotel.ru/booking.html';
    	return;
        location.href = this.failureUrl;
    },
    
/*
    reloadProgressBlock: function(){
        var updater = new Ajax.Updater('checkout-progress-wrapper', this.progressUrl, {method: 'get', onFailure: this.ajaxFailure.bind(this)});
    },*/

    reloadReviewBlock: function(){
        var updater = new Ajax.Updater('checkout-review-load', this.reviewUrl, {method: 'get', onFailure: this.ajaxFailure.bind(this)});
    },
    	
    _disableEnableAll: function(element, isDisabled) {
        var descendants = element.descendants();
        for (var k in descendants) {
            descendants[k].disabled = isDisabled;
        }
        element.disabled = isDisabled;
    },

    setLoadWaiting: function(step, keepDisabled) {
        if (step) {
            if (this.loadWaiting) {
                this.setLoadWaiting(false);
            }
            var container = $(step+'-buttons-container');
            container.addClassName('disabled');
            container.setStyle({opacity:.5});
            this._disableEnableAll(container, true);
            Element.show(step+'-please-wait');
        } else {
            if (this.loadWaiting) {
                var container = $(this.loadWaiting+'-buttons-container');
                var isDisabled = (keepDisabled ? true : false);
                if (!isDisabled) {
                    container.removeClassName('disabled');
                    container.setStyle({opacity:1});
                }
                this._disableEnableAll(container, isDisabled);
                Element.hide(this.loadWaiting+'-please-wait');
            }
        }
        this.loadWaiting = step;
    },

    gotoSection: function(section)
    {
        section = $('opb-'+section);
        section.addClassName('allow');
        this.accordion.openSection(section);
    },

    setTime: function(){
        /*if ($('login:guest') && $('login:guest').checked) {
            this.method = 'guest';
            var request = new Ajax.Request(
                this.saveMethodUrl,
                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'guest'}}
            );
            Element.hide('register-customer-password');
            this.gotoSection('billing');
        }
        else if($('login:register') && ($('login:register').checked || $('login:register').type == 'hidden')) {
            this.method = 'register';
            var request = new Ajax.Request(
                this.saveMethodUrl,
                {method: 'post', onFailure: this.ajaxFailure.bind(this), parameters: {method:'register'}}
            );
            Element.show('register-customer-password');
            this.gotoSection('billing');
        }
        else{
            alert(Translator.translate('Please choose to register or to checkout as a guest'));
            return false;
        }*/
    	this.gotoSection('rooms');
    },
    
    setRooms: function() {
    	this.gotoSection('services');
    },

    setServices: function() {
    	this.gotoSection('personal');
    },
    setPersonal: function() {
    	
    	this.gotoSection('payment');
    },

    setPayment: function() {
        //this.reloadProgressBlock();
        //this.nextStep();
        this.gotoSection('review');
        //this.accordion.openNextSection(true);
    },

    setReview: function() {
        this.reloadProgressBlock();
        //this.nextStep();
        //this.accordion.openNextSection(true);
    },

    back: function(){
        if (this.loadWaiting) return;
        this.accordion.openPrevSection(true);
    },

    setStepResponse: function(response){
        if (response.update_section) {
            $('booking-'+response.update_section.name+'-load').update(response.update_section.html);
        }
        if (response.allow_sections) {
            response.allow_sections.each(function(e){
               	$('opb-'+e).addClassName('allow');
            });
        }

        if (response.goto_section) {
            //this.reloadProgressBlock();
            this.gotoSection(response.goto_section);
            location.hash = 'opb-'+response.goto_section;
            return true;
        }
        if (response.redirect) {
            location.href = response.redirect;
            return true;
        }
        return false;
    }

}
//time
var Time = Class.create();
Time.prototype = {
	initialize: function(form, saveUrl){
		this.date_in = $('date_in').value;
		this.date_out = $('date_out').value;
	    this.form = form;
	    if ($(this.form)) {
	        $('tariff').style.display = 'none';
	        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
	        /*$('hours6').observe('click',function(event){this.toogleDate();}.bind(this))
	        //$('hours12').observe('click',function(event){this.toogleDate();}.bind(this))
	        //$('hours24').observe('click',function(event){this.toogleDate();}.bind(this))
	        */
	        //$('date_in').observe('click',function(event){$('date_in_trig').onclick()});
	        //$('date_out').observe('click',function(event){$('date_out_trig').onclick()});
	        /*$(this.form).date_in.observe('click',function(event){$('date_in_trig').onclick()})
	        //$(this.form).date_out.observe('click',function(event){$('date_out_trig').onclick()})
	        */
	        /*
	        $('time_in').observe('change',this.totalHours);
	        $('time_out').observe('change',this.totalHours);
	        $('date_in').observe('keypress',this.totalHours);
	        $('date_out').observe('change',this.totalHours);
	        */
	        
	        setInterval(this.totalHours, 300);
	    }
	    this.saveUrl = saveUrl;
	    
	    //this.onAddressLoad = this.fillForm.bindAsEventListener(this);
	    this.onSave = this.nextStep.bindAsEventListener(this);
	    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
	    //this.toogleDate();
	},		
	
	totalHours: function(){
        var date_out = $('date_out').value.split('.');
        var date_in = $('date_in').value.split('.');

		if(this.date_in != $('date_in').value){
	        //var date_in_days = parseFloat(date_in[0]) + parseFloat(date_in[1])*31 + parseFloat(date_in[2])*375;
	        //var date_out_days = parseFloat(date_out[0]) + parseFloat(date_out[1])*31 + parseFloat(date_out[2])*375;
	        var date_in_days = Math.floor(Date.parse(date_in[1]+'/'+date_in[0]+'/'+'20'+date_in[2])/86400000);
	        var date_out_days = Math.floor(Date.parse(date_out[1]+'/'+date_out[0]+'/'+'20'+date_out[2])/86400000);
	        if(date_in_days > date_out_days){
	        	$('date_out').value = date_in[0]+'.'+date_in[1]+'.'+date_in[2];
	        }/*else if(date_out_days - date_in_days >= 31){
	        	newDate = new Date(date_in_days*86400000 + 86400000*31);
	        	$('date_out').value = newDate.toLocaleFormat('%d.%m.%y');
        	}*/
	        this.date_in = $('date_in').value;
    	}
        

        if($('time_out').value != '' && $('time_in').value != ''){
	        var time_out = $('time_out').value.split(':');
	        var time_in = $('time_in').value.split(':');
	        //alert(date_out[0]+':'+date_in[0]);
	        var days = parseFloat(date_out[0]) - parseFloat(date_in[0]);
	        var months = parseFloat(date_out[1]) - parseFloat(date_in[1]);
	        var years = parseFloat(date_out[2]) - parseFloat(date_in[2]);
	        var hours = parseFloat(time_out[0]) - parseFloat(time_in[0]);
	        var minutes = parseFloat(time_out[1]) - parseFloat(time_in[1]);
	        var total_millisec_out = Date.parse(date_out[1]+'/'+date_out[0]+'/'+'20'+date_out[2]+' '+time_out[0]+':'+time_out[1]+' GMT'); // Date.parse("month/day/year hours:minutes")
	        var total_millisec_in = Date.parse(date_in[1]+'/'+date_in[0]+'/'+'20'+date_in[2]+' '+time_in[0]+':'+time_in[1]+' GMT');
	        //var total_hours_in = parseFloat(time_in[1])/60 + parseFloat(time_in[0]) + parseFloat(date_in[0])*24 + parseFloat(date_in[1])*31*24 + parseFloat(date_in[2])*375*24;
	        //var total_hours_out = parseFloat(time_out[1])/60 + parseFloat(time_out[0]) + parseFloat(date_out[0])*24 + parseFloat(date_out[1])*31*24 + parseFloat(date_out[2])*375*24;
	        //var total_hours = minutes/60 + hours + days*24 + months*31*24 + years*375*24;
	        var total_hours = (total_millisec_out - total_millisec_in)/3600000;
	        var tariff = '';
	        if(total_hours <= 6){
	        	tariff = 6;
	        	$('label_6').setStyle({display: 'inline'});
	        	$('label_12').setStyle({display: 'none'});
	        	$('label_24').setStyle({display: 'none'});
	        }else if(total_hours <= 12){
	        	tariff = 12;
	        	$('label_6').setStyle({display: 'none'});
	        	$('label_12').setStyle({display: 'inline'});
	        	$('label_24').setStyle({display: 'none'});
	        }else{
	        	tariff = 24;
	        	$('label_6').setStyle({display: 'none'});
	        	$('label_12').setStyle({display: 'none'});
	        	$('label_24').setStyle({display: 'inline'});
	        }
	        //$('tariff').style.display = 'inline'; //uncomment to show tariff line
	        $('hours').value = tariff;
	    }else{
	    	$('tariff').style.display = 'none';
	    }
        //alert(total_hours);
	},
	
	toogleDate: function(){
		if ($('hours24').checked){
			$('date_out').up().show();
			$('time_out').up().show();
			//$(this.form).date_out.parentNode.show();
			//$(this.form).time_out.parentNode.show();
		}else {
			$('date_out').up().hide();
			$('time_out').up().hide();
			//$(this.form).date_out.parentNode.hide();
			//$(this.form).time_out.parentNode.hide();
		}
		
	},
    save: function(){
//	alert('SAVE: ok');
        if (booking.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            booking.setLoadWaiting('time');
            
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        } else {
//			alert('validate - false');
		}
    },
    
    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false);
    },
    
    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        
        if (response.error){
            if ((typeof response.message) == 'string') {
                alert(response.message);
            } else {
                alert(response.message.join("\n"));
            }
            
            if(response.error == -1){
            	location.href = '/contacts.html';
           	}

            return false;
        }
        
		//location.hash = 'opb-rooms';
        booking.setStepResponse(response);
        //payment.initWhatIsCvvListeners();
        // DELETE
        //alert('error: ' + response.error + ' / redirect: ' + response.redirect + ' / shipping_methods_html: ' + response.shipping_methods_html);
        // This moves the accordion panels of one page checkout and updates the checkout progress
        //checkout.setBilling();
    }
}


//Rooms
var Rooms = Class.create();
Rooms.prototype = {
	initialize: function(form, saveUrl, promoUrl){
	    this.form = form;
	    if ($(this.form)) {
	        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
	    }
	    this.saveUrl = saveUrl;
	    this.promoUrl = promoUrl;
	    //this.onAddressLoad = this.fillForm.bindAsEventListener(this);
	    this.onSave = this.nextStep.bindAsEventListener(this);
	    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
	},		
	
    save: function(){
        if (booking.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            booking.setLoadWaiting('rooms');
            
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },
    promo: function(){
        if (booking.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            booking.setLoadWaiting('rooms');
            
            var request = new Ajax.Request(
                this.promoUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },
    
    orderQty: function(el) {
    	var i = 1;
    	while($(el.id+'_'+i)) {
    		if ($(el.id).value >= i) {
    			$(el.id+'_'+i).style.display = 'block';
    		}else {
    			$(el.id+'_'+i).hide();
    		}
    		i++;
    	}
    },
    
    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false);
    },
    
    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        if (response.error){
            if ((typeof response.message) == 'string') {
                alert(response.message);
            } else {
                alert(response.message.join("\n"));
            }

            return false;
        }
        booking.setStepResponse(response);
        //location.hash = 'opb-services';
        services.initToogle();
        services.initToogleGarant();
    }
}



//personal
var Personal = Class.create();
Personal.prototype = {
	initialize: function(form, saveUrl){
	    this.form = form;
	    if ($(this.form)) {
	        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
	    }
	    this.saveUrl = saveUrl;
	    this.onSave = this.nextStep.bindAsEventListener(this);
	    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
	},		
	
    save: function(){
        if (booking.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            booking.setLoadWaiting('personal');
            
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },
    
    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false);
    },
    
    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        
        if (response.error){
            if ((typeof response.message) == 'string') {
                alert(response.message);
            } else {
                alert(response.message.join("\n"));
            }

            return false;
        }

        booking.setStepResponse(response);
        //location.hash = 'opb-payment';
    }
}


// payment
var Payment = Class.create();
Payment.prototype = {
    beforeInitFunc:$H({}),
    afterInitFunc:$H({}),
	initialize: function(form, saveUrl){
	    this.form = form;
	    if ($(this.form)) {
	        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
	    }
	    this.saveUrl = saveUrl;
	    this.onSave = this.nextStep.bindAsEventListener(this);
	    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
	},		
	
    beforeInit : function() {
        (this.beforeInitFunc).each(function(init){
           (init.value)();;
        });
    },
	
    init : function () {
        this.beforeInit();
        var elements = Form.getElements(this.form);
        if ($(this.form)) {
            $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
        }
        var method = null;
        for (var i=0; i<elements.length; i++) {
            if (elements[i].name=='payment[method]') {
                if (elements[i].checked) {
                    method = elements[i].value;
                }
            } else {
                elements[i].disabled = true;
            }
            elements[i].setAttribute('autocomplete','off');
        }
        if (method) this.switchMethod(method);
        this.afterInit();
    },
    
    afterInit : function() {
        (this.afterInitFunc).each(function(init){
            (init.value)();
        });
    },

    
    switchMethod: function(method){
        if (this.currentMethod && $('payment_form_'+this.currentMethod)) {
            var form = $('payment_form_'+this.currentMethod);
            form.style.display = 'none';
            var elements = form.select('input', 'select', 'textarea');
            for (var i=0; i<elements.length; i++) elements[i].disabled = true;
        }
        if ($('payment_form_'+method)){
            var form = $('payment_form_'+method);
            form.style.display = '';
            var elements = form.select('input', 'select', 'textarea');
            for (var i=0; i<elements.length; i++) elements[i].disabled = false;
        }
        this.currentMethod = method;
    },
	
    save: function(){
        if (booking.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            booking.setLoadWaiting('payment');
            
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },
    
    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false);
    },
    
    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        
        if (response.error){
            if ((typeof response.message) == 'string') {
                alert(response.message);
            } else {
                alert(response.message.join("\n"));
            }

            return false;
        }

        booking.setStepResponse(response);
        //location.hash = 'opb-review';
    }
}

//Services
var Services = Class.create();
Services.prototype = {
	initialize: function(form, saveUrl){
	    this.form = form;
	    if ($(this.form)) {
	        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
	        //$('use_transfer').observe('click',function(event){this.toogleDate();}.bind(this))	        
	    }
	    this.saveUrl = saveUrl;
	    this.onSave = this.nextStep.bindAsEventListener(this);
	    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
	},		
	
	toogleType: function(){
		if ($('transfer[use]').checked){
			$('transfer[type]').up().show();

		}else {
			$('transfer[type]').up().hide();
		}
		
	},	
	
	initToogle: function() {
		$('transfer[use]').observe('click',function(event){this.toogleType();}.bind(this));
		this.toogleType();
	},
	
	toogleAgreement: function(){
		if ($('garant[use]').checked){
			$('garant[agreement]').up().show();

		}else {
			$('garant[agreement]').up().hide();
		}
		
	},	
	
	initToogleGarant: function() {
		$('garant[use]').observe('click',function(event){this.toogleAgreement();}.bind(this));
		this.toogleAgreement();
	},
	
	save: function(){
		$('invalid_promcode').style.display = 'none';
        if (booking.loadWaiting!=false) return;

        //var validator = new Validation(this.form);
        if (1) {
            booking.setLoadWaiting('services');
            
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: booking.ajaxFailure.bind(booking),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },
    
    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false);
    },
    
    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        
        if (response.error){
        	if(response.error == 40 || response.error == 41){
        		if(response.error == 41){
        			document.getElementById('garant[use]').checked=false;
					document.getElementById('garant[agreement]').checked=false;
       			}
        		//$('promcode[name]').value = '';
        		$('invalid_promcode').update(response.message);
        		$('invalid_promcode').style.display = 'block';
        	}else{
        		$('invalid_promcode').style.display = 'none';
	            if ((typeof response.message) == 'string') {
	                alert(response.message);
	            } else {
	                alert(response.message.join("\n"));
	            }
	        }

            return false;
        }

        booking.setStepResponse(response);
        //location.hash = 'opb-personal';
    }
}

var Review = Class.create();
Review.prototype = {
    initialize: function(saveUrl, successUrl, agreementsForm){
        this.saveUrl = saveUrl;
        this.successUrl = successUrl;
        this.agreementsForm = agreementsForm;
        this.onSave = this.nextStep.bindAsEventListener(this);
        this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
    },

    save: function(){
        if (booking.loadWaiting!=false) return;
        booking.setLoadWaiting('review');
        var params = Form.serialize(payment.form);
        //params = 'payment%5Bmethod%5D=checkmo';
        if (this.agreementsForm) {
            params += '&'+Form.serialize(this.agreementsForm);
        }
        params.save = true;
        var request = new Ajax.Request(
            this.saveUrl,
            {
                method:'post',
                parameters:params,
                onComplete: this.onComplete,
                onSuccess: this.onSave,
                onFailure: booking.ajaxFailure.bind(booking)
            }
        );
    },

    resetLoadWaiting: function(transport){
        booking.setLoadWaiting(false, this.isSuccess);
    },

    nextStep: function(transport){
        if (transport && transport.responseText) {
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
            if (response.redirect) {
                location.href = response.redirect;
                return;
            }
            if (response.success) {
                this.isSuccess = true;
                window.location=this.successUrl;
            }
            else{
                var msg = response.error_messages;
                if (typeof(msg)=='object') {
                    msg = msg.join("\n");
                }
                alert(msg);
            }

            if (response.update_section) {
                $('booking-'+response.update_section.name+'-load').update(response.update_section.html);
                response.update_section.html.evalScripts();
            }

            if (response.goto_section) {
                booking.gotoSection(response.goto_section);
                //booking.reloadProgressBlock();
            }
        }
    },

    isSuccess: false
}

