﻿/**
 * gestion des dates
 */
var bookingEngine = {
    bookingEngineViewBean: null,
    profileViewBean: null,
    arrival_date: null,
    departure_date: null,
    maxStay : 23,
    maxPeriod : 405,
   
 
    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()]; 
	          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;
	        }
	        
	        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($("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();
	},
	
	
	//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 = 1; i <= this.maxStay; i++)
		{
			selected = false;
			this.nights_select_index = 0;
			
			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)
		);
		//update max stay display
		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) {
			alert("Sélectionnez une date d'arrivée");
			return false;
		}
		
		if($('nb_nuit') && $('depart'))
		{
			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();
			departure_date.setTime(
			((window.calendar)?  window.calendar.date.getTime() : this.arrival_date.getTime()) + 
			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();
		}
	}
	
	
	
	
	
}
Event.observe(window, 'load', function () {
		bookingEngine.init();
});