﻿/**
* gestion des dates POUR LA PAGE PROMOS UNIQUEMENT
*/
var bookingEngine = {
	bookingEngineViewBean: null,
	profileViewBean: null,
	arrival_date: null,
	departure_date: null,
	maxStay : 30,
	maxPeriod : 405,
	
	init: function() {
		this.setupRoomsDatesCalendar();
	},
	
	//setup calendar for stay dates
	setupRoomsDatesCalendar: function() {
		var dateArrivee = $('arrivee');
		if(dateArrivee) {
			var d;
			if(dateArrivee.value) {
				d = Date.parseDate(dateArrivee.value, Calendar._TT.DEF_DATE_FORMAT);
				if(d) {
					// early booking : min date = now + 7 days
					if($(document.body).hasClassName('early-booking')) {
						var tmp = new Date().getTime() + (7 * Date.DAY);
						if(d.getTime() < tmp) {
							d.setTime(tmp);
							dateArrivee.value = d.print(Calendar._TT.DEF_DATE_FORMAT);
						}
					}
					this.setDateHiddenFieldsValue(d);
					this.arrival_date = d;
				}
			} else {
				d = new Date();
				// early booking : min date = now + 7 days
				if($(document.body).hasClassName('early-booking')) {
					d.setTime(d.getTime() + (7 * Date.DAY));
				}
				dateArrivee.value = d.print(Calendar._TT.DEF_DATE_FORMAT);
				this.setDateHiddenFieldsValue(d);
				this.arrival_date = d;
			}
			
			//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(dateArrivee, 'focus', function(e) {
				Event.element(e).blur();
			});
			
			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(dateArrivee.previous('span.jour')) {
						dateArrivee.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();
				// early booking : min date = now + 7 days
				if($(document.body).hasClassName('early-booking')) {
					now.setTime(now.getTime() + (7 * Date.DAY));
				}
				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.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');
		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));
		
		
		if(this.arrival_date != undefined) {this.updateDepartureDate();}
	},
	
	updateDepartureDate: function() {
		if(this.arrival_date=="undefined"){
			if ($("arrivee").value != '') {
				this.arrival_date = window.calendar.date.getTime() ; 
			} 
			else {
				var today = new Date();
				this.arrival_date = today;
			}
		}
		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.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);
			departure_date.setTime(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();
			date.innerHTML=departure_date.print(Calendar._TT["DEF_DATE_FORMAT"]);
		}
	}
};

Event.observe(window, 'load', function () {
		bookingEngine.init();
		if($('arrivee').previous('span.jour'))$('arrivee').previous('span.jour').innerHTML = Calendar._DN[new Date().getDay()];
		
		bookingEngine.updateDepartureDate();
});

