﻿/*
 * gestion des dates
 */
var bookingEngine = {
    arrival_date: null,
    departure_date: null,
    maxStay : 23,
    maxPeriod : 405,
 
    init: function()
    {
  			this.setupRoomsDatesCalendar();
  
  			if ($('jour_arrivee').value != '' && $('mois_arrivee').value != '' && $('annee_arrivee').value != '' ){
	  			var arrival_date = new Date(Number($('annee_arrivee').value), Number($('mois_arrivee').value)-1, Number($('jour_arrivee').value));
				
					this.arrival_date =arrival_date.print(Calendar._TT["DEF_DATE_FORMAT"]);
					$("arrivee").value = this.arrival_date; 
					this.updateDepartureDate();
				}
    
    },

	//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(dDate.getTime() < now.getTime()-Date.DAY)
	        {
	          return true; // inférieur à today
	        }
	        if (isNaN(this.nights_select_index))	this.nights_select_index = 0;
	        var max_period = now.getTime() + 
	          (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 ($("eraser")) {
				    Event.observe(
				      $("eraser"),     'click',     function(){
					      $("arrivee").value = '';
					      $("jour_arrivee").value = '';
					      $("mois_arrivee").value = '';
					      $("annee_arrivee").value = '';
					      if($("depart").down('.jour')) $("depart").down('.jour').innerHTML ='' ;
					      if($("depart").down('.date')) $("depart").down('.date').innerHTML ='' ;
					     
					      $("nb_nuit").value = '';
				     }
				    );
				   }	

	    }
	    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);
		}
		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');
		var nuits = select.value ;
		var options_array = select.descendants();
		var count = 0;
		//empty select box if not empty
		this.nights_select_index = nuits;
		
		
		Event.observe(			select,			"change",
			function(e)
			{
				var date = new Date(); 
				if (this.arrival_date && $('annee_arrivee').value != '' )
				{
					 	var d = new Date(); 
						date = new Date(Number($('annee_arrivee').value), Number($('mois_arrivee').value)-1, Number($('jour_arrivee').value));
					$("arrivee").value = date.print(Calendar._TT["DEF_DATE_FORMAT"]);
				} else if ($("nb_nuit").value!=""){
				// 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;
				
				if (this.nights_select_index == 0){
					$("arrivee").value = '';
					this.arrival_date = '';
					$("jour_arrivee").value = '';
		      $("mois_arrivee").value = '';
		      $("annee_arrivee").value = '';
				}
				
				this.updateDepartureDate();
			}.bind(this)
		);
	}, 
	
	updateDepartureDate: function()
	{
		if(this.arrival_date == undefined) {
			 if ($("arrivee").value != '') {
				 this.arrival_date = $("arrivee").value ;  
			 }
		}
		
		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 = departure_date.print(Calendar._TT["DEF_DATE_FORMAT"]);
		}
	}
		
}


Event.observe(window, 'load', function () {
		if(document.body.id != 'home') bookingEngine.init();
});
/*
ACC.tools.addDomReadyListener(function() {
	//alert('calendar ok');
	bookingEngine.init();
});

*/