﻿/**
 * gestion des dates
 */
var bookingEngine = {
    bookingEngineViewBean: null,
    profileViewBean: null,
    arrival_date: null,
    departure_date: null,
    maxStay : 23,
    maxPeriod : 405,
    minStay : 1,
 
    init: function()
    {
    			this.setupRoomsDatesCalendar();
			if ($('promo21'))	this.initGivenDates();
    },
	
	initGivenDates : function(){
		var todayDate = new Date();
		var startDate = new Date(todayDate.getTime() + 21*Date.DAY);
		if($('arrivee')){
			this.arrival_date =  $('arrivee').value = startDate.print(Calendar._TT["DEF_DATE_FORMAT"]);
			
		}
		
		if($('jour_arrivee') && $('mois_arrivee') && $('annee_arrivee')){
			$('jour_arrivee').value = startDate.getDate();
			$('mois_arrivee').value = startDate.getMonth()+1;
			$('annee_arrivee').value = startDate.getFullYear();
		}
		
		if($('nb_nuit')){
			$('nb_nuit').options[0].selected = true;
		
		}
	},

	//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()]; 
	          this.updateDepartureDate();
	          $("arrivee").value = date;
	          cal.hide();
	        }
	        
	        return true;
	        
	      } 
	      
	      var disableDates = function(dDate, y, m, d)
	      {
	       
	        var now = new Date();
	        
	       	if ($('promo21') && dDate.getTime() < now.getTime() +Date.DAY *20)
	        {
	          return true;
	        }
	        
	        if(!$('promo21') && dDate.getTime() < now.getTime()-Date.DAY)   
	        {
	          return true;
	        }
	        
	        var max_period = now.getTime() + ($('promo21') ? Date.DAY *21 : 0) +
	          (Date.DAY* this.maxPeriod) -
	          (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 ($('les_mardis')) {
	    	this.maxStay = 2 ; this.minStay = 2 ;
	    }
	    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();
		 if($("nb_nuit").value=="") $("nb_nuit").value=1;
	},
	
	
	//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');
		if(select.options.length) {
			select.options.length = 0;
		}
	
		for(var i = this.minStay; i <= this.maxStay; i++) {
			option = new Option(i,i) ;
			select.options.add(option);
		}
		this.nights_select_index = 0;

		
		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 && $('annee_arrivee').value != '' )
				{
					//date.setTime(this.arrival_date.getTime());
					 	var d = new Date(); 
		    		date.setFullYear($('annee_arrivee').value);
						date.setMonth   ($('mois_arrivee').value-1);
						date.setDate    ($('jour_arrivee').value);
					
				} else {
				// sinon, today
					this.arrival_date = $("arrivee").value = date.print(Calendar._TT["DEF_DATE_FORMAT"]);
					this.setDateHiddenFieldsValue(date);
				}
				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)
		);
		//update max stay display
		/* desactivation pour test NGI
		if($('stay-dates')){
			$('stay-dates').down('span.max-stay-display').innerHTML = this.maxStay;
		} */
	
  	if(this.arrival_date != undefined) this.updateDepartureDate();
	}, 
	
	updateDepartureDate: function()
	{
		
			if(this.arrival_date == undefined) {
			 if ($("arrivee").value != '') {
				 this.arrival_date = $("arrivee").value ; 
					 
			 } else {
				 	alert("Sélectionnez une date d'arrivée");
					return false;
			 }
		}
	
		if($('nb_nuit'))
		{
      var select = $('nb_nuit');
      var departure_date_display_element = $("depart");
      var week_day = departure_date_display_element.down("span.jour");
      var date = departure_date_display_element.down("span.date");
      //compute new date
      var nights_stay_in_days = Number(select.options[select.selectedIndex].value);
      var nights_stay_in_ms = nights_stay_in_days * Date.DAY;
      var departure_date = new Date();
        if (window.calendar) {
      	var t = window.calendar.date.getTime() ;
      	
      } else {
      	var d = new Date(); 
    		d.setFullYear($('annee_arrivee').value);
				d.setMonth   ($('mois_arrivee').value-1);
				d.setDate    ($('jour_arrivee').value);
			
    		var t = d.getTime();
      }
      departure_date.setTime(   t + nights_stay_in_ms  );

     if(week_day) week_day.innerHTML = Calendar._DN[departure_date.getDay()];
      /*var day_unit_zero = (departure_date.getDate() < 10)? "0" : '';
      var month_unit_zero = ((Number(departure_date.getMonth())+1) < 10)? "0" : '';
      date.innerHTML = day_unit_zero + departure_date.getDate() + '/' + month_unit_zero + (Number(departure_date.getMonth())+1) + '/' + departure_date.getFullYear() ;
 		*/	date.innerHTML = departure_date.print(Calendar._TT["DEF_DATE_FORMAT"]);

		}
	}
	
	
	
	
	
}
Event.observe(window, 'load', function () {
		bookingEngine.init();
});