// TpvDispForm Js File
// Dependences: tpvBookingJsClient.js

// ---------- Search Disponibility Form Class ---------
tpvB.dispForm = function (params) {

		// --------- Properties ---------
			// Public
			this.id = null; // Object Id
			this.lng = 'en'; // Language
			this.type = 'hotel'; // FormType
			this.action = null; // Action to pass the form
			this.method = 'GET'; // GET or POST
			this.dateFormat = 'yy-mm-dd';
			this.minDate = new Date();
			this.maxDate = new Date();
			this.defaultDate = new Date();
			this.showAdvices = [];
		
			this.checkIn = null;
			this.checkOut = null;
			this.nights = null;
			this.adults = null;
			this.children = null;
			this.babies = null;
			this.optionalParams = []; // optional params to pass to the action
			this.dayNames = null;
			this.dayNamesMin = null;
			this.dayNamesShort = null;
			this.monthNames = null;
			this.monthNamesShort = null;
			this.dic = null;
			this.chain = null;
			
			// Properties for form-type hotel and chain
			this.hotel = null; // The selected hotel in the select-box. 
			this.hotels = []; // Contains info for hotels. Codes, Minimum stay, Children and babies ages, etc
			
			// Private
			this.objects = [];
		
		// --------- Constructor --------
		
		// --- [private] Constructor ---
		this._construct = function(params) {
			
				// --- Required values & basic params ---
				if (params.id != null && params.action != null) {
					this.id = params.id;
					this.action = params.action;
					
					if (params.lng != null) { this.lng = params.lng; }
					if (params.type != null) { this.type = params.type; }
					if (params.method != null) { this.method = params.method; }
					if (params.dateFormat != null) { this.dateFormat = params.dateFormat; }
					if (params.minDate != null) { this.minDate = tpvB.sqlToDate(params.minDate); }
					if (params.maxDate != null) { this.maxDate = tpvB.sqlToDate(params.maxDate); }
					if (params.defaultDate != null) { this.defaultDate = tpvB.sqlToDate(params.defaultDate); }
					
					if (params.dayNames != null) { this.dayNames = params.dayNames; }
					if (params.dayNamesMin != null) { this.dayNamesMin = params.dayNamesMin; }
					if (params.dayNamesShort != null) { this.dayNamesShort = params.dayNamesShort; }
					if (params.monthNames != null) { this.monthNames = params.monthNames; }
					if (params.monthNamesShort != null) { this.monthNamesShort = params.monthNamesShort; }
					
					if (params.dic != null) { this.dic = params.dic; }
					
					if (params.showHelp != null) { this.showHelp = params.showHelp; }
					if (params.showAdvices != null) { this.showAdvices = params.showAdvices; }
					if (params.optionalParams != null) { this.optionalParams = params.optionalParams; }
					
					// Get basic params by type
					if (params.type == 'hotel' || params.type == 'chain' || params.type == 'hotels') {
						if (params.hotels != null) { this.hotels = params.hotels; }
						if (params.chain != null) { this.chain = params.chain; }
					}
				
				// --- Interface objects ---
				
					// Get basic interface objects
						// CheckIn input
						this.objects.checkIn = $('#'+params.id+'_dates_checkin_datepicker')[0];
						// CheckIn tmp
						this.objects.checkInTmp = $('#'+params.id+'_dates_checkin_datepicker_tmp')[0];
						
						// Check-out
						this.objects.checkOut = $('#'+params.id+'_dates_checkout_label')[0];
						
						// Nights
						this.objects.nights = $('#'+params.id+'_dates_nights_select')[0];
						
						// Adults
						this.objects.adults = $('#'+params.id+'_guests_adults_select')[0];
						
						// Children
						this.objects.children = $('#'+params.id+'_guests_children_select')[0];
						
						// Babies
						this.objects.babies = $('#'+params.id+'_guests_babies_select')[0];
						
						// Form
						this.objects.form = $('#'+params.id+'_form')[0];
						
					// Get objects by form type
						// Chain & hotels
						if (params.type == 'chain' || params.type == 'hotels') {
							// Hotel
							this.objects.hotels = $('#'+params.id+'_hotels_select')[0];
						}
						
						
					// --- Jquery datepicker initialization ---
						params.jqueryCalendarOptions.minDate = this.minDate;
						params.jqueryCalendarOptions.maxDate = this.maxDate;
					
						// Shared params with dispFormControl
						params.jqueryCalendarOptions.dayNames = params.dayNames;
						params.jqueryCalendarOptions.dayNamesMin = params.dayNamesMin;
						params.jqueryCalendarOptions.dayNamesShort = params.dayNamesShort;
						params.jqueryCalendarOptions.monthNames = params.monthNames;
						params.jqueryCalendarOptions.monthNamesShort = params.monthNamesShort;
						params.jqueryCalendarOptions.dateFormat = params.dateFormat;
						// Datepicker
						$('#'+params.id+'_dates_checkin_datepicker').datepicker(params.jqueryCalendarOptions);
					// --- /Jquery datepicker initialization ---
					
					
				// ---/ Interface objects ---
				
				// --- Get default values from the interface ---
					this.nights = parseInt(this.objects.nights.value,10);
					this.adults = parseInt(this.objects.adults.value,10);
					this.children = parseInt(this.objects.children.value,10);
					this.babies = parseInt(this.objects.babies.value,10);
					if (this.type == 'chain' || this.type == 'hotels') {
						this.hotel = this.objects.hotels.value;
					} else if (this.type == 'hotel') {
						// if hotel is unique get the first code
						var cont = 0;
						for (x in this.hotels) {
							if (cont == 0) { this.hotel=x; cont++; }
						}
					}
				// --- /Get default values from the interface ---
				
				// Default checkIn
				if (this.defaultDate != null) this.checkIn = this.defaultDate;
				
				// Update the view
				this.update();
				
			} else {
				alert('Error creating dispForm control. id or action not specified.');
			}
		}
	
		// ---------- Methods ----------
		
		// ----------------------------------- Public methods ----------------------------------- 
	
		// --- [Public] submit ---
		this.submit = function() {
			
			if (typeof(this.action) == 'function') {
				this.action(this.getFormData());
			} else if (typeof(this.action) == 'string'){
			
				// GET method
				if (this.method == 'GET' || this.method == 'get') this.objects.form.method='get';
				
				// POST method
				if (this.method == 'POST' || this.method == 'post') this.objects.form.method='post';
				
				this.objects.form.action=this.action;
				this.objects.form.target='_self';
				this.setFormData();
				this.objects.form.submit();
			}
		}
			
		// --- [Public] setCheckIn ---
		this.setCheckIn = function(date) {
			
			// Detect format
			// SQL format
			if(typeof(date) == 'string') {
				var date = tpvB.sqlToDate(date);
			} 
			
			if (date >= this.minDate && date <= this.maxDate) {
				this.checkIn = date;
				this.update();
			} else {
				return false;
			}
		}
		
		// --- [Public] getCheckIn ---
		this.getCheckIn = function(format) {
			var checkIn = '';
			if (format == null || format == 'date') {
				checkIn = this.checkIn;
			} else if (format == 'sql') {
				checkIn = tpvB.dateToSql(this.checkIn);
			}
			return checkIn;
		}
		

		// --- [Public] getCheckOut ---
		this.getCheckOut = function(format) {
			
			var checkOut = '';
			if (format == null || format == 'date') {
				checkOut = this.checkOut;
			} else if (format == 'sql') {
				checkOut = this.checkOut.getFullYear()+'-'+(this.checkOut.getMonth()+1)+'-'+this.checkOut.getDate();
			}
			return checkOut;
		}
	
		// --- [Public] setNights ---
		this.setNights = function(nights) {
			this.nights = parseInt(nights,10);
			this.update();
		}
		
		// --- [Public] getNights ---
		this.getNights = function() {
			return this.nights;
		}
		
		// --- [Public] setAdults ---
		this.setAdults = function(adults) {
			this.adults = parseInt(adults,10);
			this.update();
		}
		
		// --- [Public] getAdults ---
		this.getAdults = function() {

			return this.adults;
		}
		
		// --- [Public] setChildren ---
		this.setChildren = function(children) {
			this.children = parseInt(children,10);
			this.update();
		}
		
		// --- [Public] getChildren ---
		this.getChildren = function() {
			return this.children;
		}
		
		// --- [Public] setBabies ---
		this.setBabies = function(babies) {
			this.babies = parseInt(babies,10);
			this.update();
		}
		
		// --- [Public] getBabies ---
		this.getBabies = function() {
			return this.babies;
		}
		
		// --- [Public] setHotel ---
		this.setHotel = function(hotel) {
			if (this.type == 'chain' || this.type == 'hotels') {
				
				if (hotel==0) {
					this.hotel = hotel;
					this.update();
				} 
				// Check if exist
				else {
					var exist = false;
					for (x in this.hotels) { if (x==hotel) { exist=true;  } }
					if (exist) {
						this.hotel = hotel;
						this.update();
					}
				}
			}
		}
		
		// --- [Public] getHotel ---
		this.getHotel = function() {
			return this.hotel;
		}
		
		// ----------------------------------- Private methods ----------------------------------- 
		
		// --- [Private] Update ---
		this.update = function() {
			
			// --- Hotel dependences ---
			if (this.type == 'hotel' || this.type == 'hotels' || this.type == 'chain') {
				
				if (this.type == 'hotels' || this.type=='chain') this.objects.hotels.value = this.hotel;
				
				// All hotels
				if (this.hotel == 0) {
					if (this.showAdvices.minimumStay) {
						$('#'+params.id+'_dates_advice_stay')[0].style.display = 'none'; 
					}
					if(this.showAdvices.ages) {
						
						$('#'+params.id+'_guests_age_advice')[0].style.display = 'none'; 
					}
					
					this.enableSelect('adults');
					this.enableSelect('children');
					this.enableSelect('babies');
					this.setMinNights(1);
				} 
				// One hotel
				else {
					var tmpHotel = this.hotels[this.hotel];

					
					// Sets minimum Stay
					if (this.showAdvices.minimumStay) {
						$('#'+params.id+'_dates_advice_stay')[0].style.display = 'none';
					}
					if (tmpHotel['minimumStay'] != null && tmpHotel['minimumStay']>1) {
						this.setMinNights(tmpHotel['minimumStay']);
						if (this.showAdvices.minimumStay) {
							$('#'+params.id+'_dates_advice_stay_label')[0].innerHTML = this.dic['minimumStay'].replace('#minimumStay#',tmpHotel['minimumStay']);
							$('#'+params.id+'_dates_advice_stay')[0].style.display = '';
						}
					}
					
					
					// Childrens and babies age advices
					
					if (this.showAdvices.ages) {
					
						$('#'+params.id+'_guests_age_advice')[0].style.display = 'none';
						$('#'+params.id+'_guests_age_babies_label')[0].style.display = 'none';
						$('#'+params.id+'_guests_age_children_label')[0].style.display = 'none';
					}
					
					if (this.showAdvices.ages && tmpHotel['selectChildren'] && tmpHotel['selectBabies']) {
						if (tmpHotel['childrenAge'] != null || tmpHotel['babiesAge'] != null) { 
							// All values
							if (  (tmpHotel['babiesAge'] != null && tmpHotel['childrenAge'] != null) && (tmpHotel['childrenAge'] > tmpHotel['babiesAge'])  ) {
								// Exact
								if ( (tmpHotel['babiesAge']+1) == tmpHotel['childrenAge']) {
									var strAdvice = '';
									strAdvice = this.dic['exactAgeAdvice'].replace('#persons#',this.dic['ninios']);
									strAdvice = strAdvice.replace('#age#',tmpHotel['childrenAge']);
									$('#'+params.id+'_guests_age_children_label')[0].innerHTML = strAdvice;
								} 
								// Between
								else {
									var strAdvice = '';
									strAdvice = this.dic['betweenAgeAdvice'].replace('#persons#',this.dic['ninios']);
									strAdvice = strAdvice.replace('#age_min#',tmpHotel['babiesAge']);
									strAdvice = strAdvice.replace('#age_max#',tmpHotel['childrenAge']);
									$('#'+params.id+'_guests_age_children_label')[0].innerHTML = strAdvice;
									
								}
								
								var strAdvice = '';
								strAdvice = this.dic['youngerAgeAdvice'].replace('#persons#',this.dic['bebes']);
								strAdvice = strAdvice.replace('#age#',tmpHotel['babiesAge']);
								$('#'+params.id+'_guests_age_babies_label')[0].innerHTML = strAdvice;
								
								$('#'+params.id+'_guests_age_children_label')[0].style.display = '';
								$('#'+params.id+'_guests_age_babies_label')[0].style.display = '';
								$('#'+params.id+'_guests_age_advice')[0].style.display = '';
							}
							// Only Childrens
							else if (tmpHotel['babiesAge'] == null && tmpHotel['childrenAge'] != null) {
								var strAdvice = '';
								strAdvice = this.dic['youngerAgeAdvice'].replace('#persons#',this.dic['ninios']);
								strAdvice = strAdvice.replace('#age#',tmpHotel['childrenAge']);
								$('#'+params.id+'_guests_age_children_label')[0].innerHTML = strAdvice;
								
								$('#'+params.id+'_guests_age_children_label')[0].style.display = '';
								$('#'+params.id+'_guests_age_advice')[0].style.display = '';
							}
							// Only babies
							else if (tmpHotel['babiesAge'] != null && tmpHotel['childrenAge'] == null) {
								var strAdvice = '';
								strAdvice = this.dic['youngerAgeAdvice'].replace('#persons#',this.dic['bebes']);
								strAdvice = strAdvice.replace('#age#',tmpHotel['babiesAge']);
								$('#'+params.id+'_guests_age_babies_label')[0].innerHTML = strAdvice;
								
								$('#'+params.id+'_guests_age_babies_label')[0].style.display = '';
								$('#'+params.id+'_guests_age_advice')[0].style.display = '';
							}
						} 
					}
				
				
					// Adults, children, and babies selects
						// Adults
						if (tmpHotel['selectAdults']) {
							this.enableSelect('adults');
						} else {
							this.disableSelect('adults');
						}
						
						// Children
						if (tmpHotel['selectChildren']) {
							this.enableSelect('children');
						} else {
							this.disableSelect('children');
						}
						
						// Babies
						if (tmpHotel['selectBabies']) {
							this.enableSelect('babies');
						} else {
							this.disableSelect('babies');
						}
					
				}
				
			}
			// --- /Hotel dependences ---
			
			// --- Checkin dependences ---
			if (this.checkIn != null && this.nights != null) {
			
				// -- Sets the datepicker --
				if (this.objects.checkInTmp.value == '' || this.objects.checkInTmp.value != tpvB.normalizeDate(this.getCheckIn('sql'))) {
					$('#'+params.id+'_dates_checkin_datepicker').datepicker('setDate',this.checkIn);
					$('#'+params.id+'_dates_checkin_datepicker')[0].blur();
				}
				
				// Adapts checkin width to the selected date
				// FIXME: Aca deberia auto agrandar el inputtext con alguna técnica especial porque no funciona bien la medición por pixels
				var newSize = (this.objects.checkIn.value.length*7);
				this.objects.checkIn.style.width = newSize+'px';
				// -- /Sets the datepicker --
				
				// -- Set the checkout --
				this.checkOut = new Date(this.checkIn.getFullYear(),this.checkIn.getMonth(),this.checkIn.getDate());
				this.checkOut.setDate(this.checkIn.getDate()+this.nights);
				/* *PARCHE*: No reemplaza las variables sino que lo saca por descarte */
				if (this.dateFormat == 'd/m/yy') {
					this.objects.checkOut.innerHTML = this.checkOut.getDate()+'/'+(this.checkOut.getMonth()+1)+'/'+this.checkOut.getFullYear();
				} else if(this.dateFormat == 'm/d/yy') {
					this.objects.checkOut.innerHTML = (this.checkOut.getMonth()+1)+'/'+this.checkOut.getDate()+'/'+this.checkOut.getFullYear();
				} else {
					// Day of the week
					var dayOfWeek = '';
					if (this.dateFormat.indexOf('DD') != -1){
						dayOfWeek = this.dayNames[this.checkOut.getDay()];
					} else if (this.dateFormat.indexOf('D') != -1) {
						dayOfWeek = this.dayNamesShort[this.checkOut.getDay()];
					}
					
					
					// Month
					var month = '';
					if (this.dateFormat.indexOf('MM') != -1){
						month = this.monthNames[this.checkOut.getMonth()];
					} else {
						month = this.monthNamesShort[this.checkOut.getMonth()];
					}
					
					this.objects.checkOut.innerHTML = dayOfWeek+' '+this.checkOut.getDate()+', '+month+' '+this.checkOut.getFullYear();
				}
				// -- /Set the checkout --
				
			} else {
				$('#'+params.id+'_dates_checkin_datepicker').datepicker('setDate',null);
				$('#'+params.id+'_dates_checkin_datepicker')[0].blur();
				this.objects.checkIn.value = '';
				this.objects.checkInTmp.value = '';
				this.objects.checkOut.innerHTML = '---';
			}
			// --- /Checkin dependences ---

			// --- Guests and nights ---
			if (this.nights != null) this.objects.nights.value = this.nights;
			if (this.adults != null) this.objects.adults.value = this.adults;
			if (this.children != null) this.objects.children.value = this.children;
			if (this.babies != null) this.objects.babies.value = this.babies;
			// --- /Guests and nights ---				
		}			
		
		// --- [Private]  getDaysOfMonth ---
		this.getDaysOfMonth = function(month,year) {
		
			switch (month){ 
				case 0: return 31; break; 
				case 1: 
					if (year % 4 == 0) { 
						if (year % 400 == 0) { return 29; } 
						else { if (year % 100 == 0) { return 28; } 
						else { return 29; } 
					} 
					} else { return 28; }; 
				break; 
				case 2: return 31; break; 
				case 3: return 30; break; 
				case 4: return 31; break; 
				case 5: return 30; break; 
				case 6: return 31; break; 
				case 7: return 31; break; 
				case 8: return 30; break; 
				case 9: return 31; break; 
				case 10: return 30; break; 
				case 11: return 31; break; 
			} // end switch
		}
		
		// --- [Private]  setMinNights ---
		this.setMinNights = function(minNights) {
			
			if (minNights < 31) {
				// Preview selected option
				var pre = this.objects.nights.value;
				
				// Remove all options
				$('#'+this.id+'_dates_nights_select').removeOption(/./);
				
				// Add new options
				var options = [];
				for (n=minNights; n<=31 ;n=n+1) {
					options[n] = n;
				}
				$('#'+this.id+'_dates_nights_select').addOption(options, false);
				
				// Select the previously selected options
				if ($('#'+this.id+'_dates_nights_select').containsOption(pre)) {
					$('#'+this.id+'_dates_nights_select').selectOptions(pre,true);
				} else {
					$('#'+this.id+'_dates_nights_select').selectOptions(minNights,true);
					this.nights = minNights;
				}
			
			}
			
		}
		
		// --- [Private] setFormData ---
		// Set the actual data to the hidden form preparing for submiting
		this.setFormData = function() {
			// Basic data
			this.addFormParam('checkin',tpvB.normalizeDate(this.getCheckIn('sql')));
			this.addFormParam('checkout',tpvB.normalizeDate(this.getCheckOut('sql')));
			this.addFormParam('noches',this.nights);
			this.addFormParam('adultos',this.adults);
			this.addFormParam('idioma',this.lng);
			
			// Hotels
				// One specified hotel
				if (this.hotel != 0) {
					this.addFormParam('hotel',this.hotel);
					if (this.hotels[this.hotel]['selectChildren']) {
						this.addFormParam('ninios',this.children);
					}
					
					if (this.hotels[this.hotel]['selectBabies']) {
						this.addFormParam('bebes',this.babies);
					}
				} 
				// All hotels
				else {
					
					this.addFormParam('ninios',this.children);
					this.addFormParam('bebes',this.babies);
					
					// Chain
					if (this.chain != null) {
						this.addFormParam('cadena',this.chain);
					}
					// Multihotels
					else {
						var str='';
						var cont=0;
						for (x in this.hotels) {
							if (cont>0) str +=';';
							str += x;
							cont++;
						}
						this.addFormParam('hotel',str);
					}
				}
			
				
			// Optional params
			for (x in this.optionalParams) {
				this.addFormParam(x,this.optionalParams[x]);
			}
		}
		
		// --- [Private] addFormParam ---
		// Create a new hidden input for submit
		this.addFormParam = function(name,value) {
			var inputHidden = document.createElement('input');
			inputHidden.setAttribute('type','hidden');
			inputHidden.setAttribute('name',name);
			inputHidden.setAttribute('value',value);
			$('#'+this.id+'_form').append(inputHidden);
		}
		
		// --- [Private] getFormData ---
		// Get the actual form data in array format. 
		// This function prepares information to pass it to a external function
		this.getFormData = function() {
			
			// Get data
			var tmp = {
				'checkin': this.checkIn,
				'checkout': this.checkOut,
				'nights': this.nights,
				'adults': this.adults,
				'lng': this.lng
			}
			
			if (this.hotels[this.hotel]['selectChildren']) {
				tmp.children = this.children;
			}
			
			if (this.hotels[this.hotel]['selectBabies']) {
				tmp.babies = this.babies;
			}
			
			// One specified hotel
			if (this.hotel != 0) {
				tmp['hotel'] = this.hotel;
			} 
			// All hotels
			else {
				// Chain
				if (this.chain != null) {
					tmp['chain'] = this.chain;
				}
				// Multihotels
				else {
					tmp['hotel'] = [];
					cont=0;
					for (x in this.hotels) {
						tmp['hotel'][cont] = x;
						cont++;
					}
				}
			}
			
			// Optional params
			for (x in this.optionalParams) {
				tmp[x]= this.optionalParams[x];
			}
			
			return tmp;
		}
		
		// --- [Private] enableSelect ---
		// Enables the select for adults, children and babies
		this.enableSelect = function(type) {
			if (type=='adults') {
				$('#'+params.id+'_guests_adults')[0].style.display = ''; 
			} 
			
			if (type=='children') {
				$('#'+params.id+'_guests_children')[0].style.display = ''; 
			}
			
			if (type=='babies') {
				$('#'+params.id+'_guests_babies')[0].style.display = ''; 
			}
		}
		
		// --- [Private] disableSelect ---
		// Disables the select for adults, children and babies
		this.disableSelect = function(type) {
			if (type=='adults') {
				$('#'+params.id+'_guests_adults_select')[0].value = 0;
				$('#'+params.id+'_guests_adults')[0].style.display = 'none'; 
			} 
			
			if (type=='children') {
				$('#'+params.id+'_guests_children_select')[0].value = 0;
				$('#'+params.id+'_guests_children')[0].style.display = 'none'; 
			}
			
			if (type=='babies') {
				$('#'+params.id+'_guests_babies_select')[0].value = 0;
				$('#'+params.id+'_guests_babies')[0].style.display = 'none'; 
			}
		}

	this._construct(params);
}
// ---------- /Search Disponibility Form Class ---------