
// ATENCIÓN: Clase HotelSearch tras código Yahoo de inicialización.

// js_search: Objeto HotelSearch
initialize = function(js_search, language) {

	var today = new Date();
	var currentDay = today.getDate(), currentMonth = today.getMonth()
		, currentYear = today.getFullYear();
	var nextYear = eval(currentYear +1)
	var next = eval(currentDay+1);

	var firstDate = eval(currentMonth+1) + "/" + currentDay + "/" + currentYear;
	var secondDate = eval(currentMonth+1) + "/" + next + "/" + currentYear;
	var maxdate = eval(currentMonth) + "/" + currentDay + "/" +  nextYear;

	var hiddenInDay = document.getElementById(js_search.prefix + "_checkin_day");
	var hiddenInMonthYear = document.getElementById(js_search.prefix + "_month_year_checkin");

	var calin = new YAHOO.widget.CalendarGroup("calin", js_search.prefix + "_calinContainer"
		, { pages:2, close:true } );
	var calout = new YAHOO.widget.CalendarGroup("calout", js_search.prefix + "_caloutContainer"
		, { pages:2, close:true } );

	cMonth = (currentMonth < 9) ? "0"+eval(currentMonth+1) : eval(currentMonth+1);
	cDate = cMonth+"/"+today.getFullYear();

	function handleTxt(type,args,obj) {
		var dates = args[0];
		var date = dates[0];
		var year = date[0], month = date[1], day = date[2];

		var hiddenInDay = document.getElementById(js_search.prefix + "_checkin_day");
		var hiddenInMonthYear = document.getElementById(js_search.prefix + "_month_year_checkin");

		currentMonth = eval(today.getMonth()+1);
		resta = month-currentMonth;
		month1 = (resta >= 1 ? month-1 : month);
		month1 = (month1 < 10) ? "0"+month1 : month1;

		month = (month < 10) ? "0"+month : month;
		day = (day < 10) ? "0"+day : day;

		hiddenInMonthYear.value = month+"/"+year;
		js_search.mostrarDias(js_search.prefix + "_month_year_checkin"
			, js_search.prefix + "_inoptions", js_search.prefix + "_checkin_day"
			, js_search.prefix + "_checkin_day", 1, 1, 1, day);
		hiddenInDay.value = day;

		checkinDate = month + "/" + day + "/" + year;
		checkinMonthYear=  month + "/"  + year;

		caloutpagedate= month1 + "/"  + year;
		calout.cfg.setProperty("pagedate", caloutpagedate);
		calout.cfg.setProperty("mindate", checkinDate);
		calout.cfg.setProperty("mindate",checkinDate,false);
		calout.cfg.setProperty("selected",checkinDate);
		calout.render();

		js_search.changeCheckOutDate();
		js_search.changeNumNights();
		calin.hide();
	}

	function handleTxt2(type,args,obj) {
		var dates = args[0];
		var date = dates[0];
		var year = date[0], month = date[1], day = date[2];

		var hiddenOutDay = document.getElementById(js_search.prefix + "_checkout_day");
		var hiddenOutMonthYear = document.getElementById(js_search.prefix + "_month_year_checkout");
		month = (month < 10) ? "0"+month : month;
		day = (day < 10) ? "0"+day : day;

		hiddenOutMonthYear.value = month+"/"+year;
		js_search.mostrarDias(js_search.prefix + "_month_year_checkout"
			, js_search.prefix + "_outoptions", js_search.prefix + "_checkout_day"
			, js_search.prefix + "_checkout_day", 2, 1, 0, day);

		hiddenOutDay.value = day;
		js_search.changeNumNights();
		calout.hide();
	}

	calin.selectEvent.subscribe(handleTxt, calin, true);
	calout.selectEvent.subscribe(handleTxt2, calout, true);

	// configs
	if(language == "ar" || language == "ja" || language == "zt") {
		calin.cfg.setProperty("LOCALE_WEEKDAYS", "long");
		calout.cfg.setProperty("LOCALE_WEEKDAYS", "long");
	} else {
		calin.cfg.setProperty("LOCALE_WEEKDAYS", "short");
		calout.cfg.setProperty("LOCALE_WEEKDAYS", "short");
	}

	calin.cfg.setProperty("hide_blank_weeks", true);
	calout.cfg.setProperty("hide_blank_weeks", true);

	calin.cfg.setProperty("START_WEEKDAY", 1);
	calout.cfg.setProperty("START_WEEKDAY", 1);
	calin.cfg.setProperty("mindate", firstDate);
	calin.cfg.setProperty("selected",firstDate);
	calin.cfg.setProperty("maxdate", maxdate);
	calin.cfg.setProperty("close", true);
	calout.cfg.setProperty("mindate", secondDate);
	calout.cfg.setProperty("selected", secondDate);
	calout.cfg.setProperty("maxdate", maxdate);
	calout.cfg.setProperty("close", true);

	localeArrays = getLocaleLabels(language);
	localeProperties = getLocaleProperties();

	for (i=0;i<localeArrays.length;i++) {
		calin.cfg.setProperty(localeProperties[i], localeArrays[i]);
		calout.cfg.setProperty(localeProperties[i], localeArrays[i]);
	}

	calin.render();
	calout.render();

	YAHOO.util.Event.addListener(js_search.prefix + "_show1up", "click", calin.show, calin, true);
	YAHOO.util.Event.addListener(js_search.prefix + "_show2up", "click", calout.show, calout, true);
}


// Clase HotelSearch
// Véase http://mckoss.com/jscript/object.htm
function HotelSearch() {

	// Véase http://stackoverflow.com/questions/55611/javascript-private-methods
	// Uso de this y var para métodos públicos y métodos privados

	var _getElementValue = function(element_id) {
		if(document.getElementById(element_id))
			return document.getElementById(element_id).value;
		else alert("El elemento con id " + element_id + ' no existe.')
	}

	var _setElementValue = function(element_id, element_value) {
		if(document.getElementById(element_id))
			document.getElementById(element_id).value=element_value;
		else alert("El elemento con id " + element_id + ' no existe.')
	}

	var _getElement = function(element_id) {
		return document.getElementById(element_id);
	}

	var _calculateDifference = function(laterdate, earlierdate) {
		var difference = laterdate.getTime() - earlierdate.getTime();
		var milliseconds_in_day = 1000*60*60*24;
		var daysDifference = Math.round(difference/milliseconds_in_day);
		return daysDifference;
	}

	this.changeNumNights = function() {

		var selm1 = _getElement(this.prefix + "_month_year_checkin");
		var selm2 = _getElement(this.prefix + "_month_year_checkout");
		var sel1 = _getElement(this.prefix + "_checkin_day");
		var sel2 = _getElement(this.prefix + "_checkout_day");
		var nights = _getElement(this.prefix + "_num_nights");

		checkout_year = selm2.value.substr(3,6);
		checkout_month = selm2.value.substr(0,2);
		checkout_day = sel2.value;
		checkout_date = new Date(checkout_month+"/"+checkout_day+"/"+checkout_year);

		checkin_year = selm1.value.substr(3,6);
		checkin_month = selm1.value.substr(0,2);
		checkin_day = sel1.value;
		checkin_date = new Date(checkin_month+"/"+checkin_day+"/"+checkin_year);

		var num_nights = _calculateDifference ( checkout_date , checkin_date );
		if ((num_nights<1)||(num_nights>=29)) {

			//if (num_nights>=29) alert (this.msgs[3923]);
			//changeCheckOutDate();

		} else { _setElementValue(this.prefix + "_num_nights", num_nights); }

		_setElementValue(this.prefix + "_num_nights", num_nights);

	}

	///////////////////////////////////////FIN CAMBIO DE NUM NIGHTS/////////////////////////////////////
	//MOSTRAR LOS SELECTS DE LOS DÍAS DEL MES DE FORMA DINÁMICA

	var _daysInMonth = function(month,year) {

		var dd = new Date(year, month, 0);
		return dd.getDate();

	}

	//esta es la función que muestra los días en función del mes en el que nos encontramos
	//probando
	this.mostrarDias = function(id_campo_meses, targetID, id_campo_dias, name_campo_dias
		, inicio, dias_mas, check_in, selected_day) {

		var sDay = "";

		if(_getElement(id_campo_dias) != null) sDay = _getElementValue(id_campo_dias);

		if ((selected_day!=0) && (selected_day!="00")) sDay=selected_day;

		var monthYear = _getElementValue(id_campo_meses);
		var thismonth = monthYear.slice(0,2);
		var thisyear = parseInt(monthYear.slice(3,7));
		var maxdays = _daysInMonth(thismonth, thisyear);
		var maxdays2 = _daysInMonth(thismonth-1, thisyear);

		// today
		if ((selected_day!=0)&&(selected_day!="00")){

		var tDate = new Date(thisyear,thismonth-1,sDay);

			}else{
		var tDate = new Date();
		}


		if((sDay != "") && (sDay != "00")) tDate.setDate(sDay);
		else {
			cday = eval(tDate.getDate()+dias_mas);
			tDate.setDate(cday);
		}

		switch(inicio) {
		case 1:
			if((sDay == "") || (sDay == "00")) {

				var yesterday = tDate.getDate();
				if(yesterday == eval(maxdays+1)) {

					var today = 1;

					if(thismonth == 12) {
						var month = 1;
						var year = eval(thisyear+1);
					} else {
						var month = eval(thismonth+1);
						var year = thisyear;
					}

				} else if(yesterday == 1) {

					var today = 1;
					if(thismonth == 1) {
						var month = 1;
						var year = eval(thisyear+1);
					} else {
						var month = eval(thismonth);
						var year = thisyear;
					}

				} else {

					var today = tDate.getDate();
					var month = thismonth;
					var year = thisyear;

				}

				month = (month < 10) ? "0"+month : month;
				_getElement(id_campo_meses).value = month+"/"+year;

			} else var today = tDate.getDate();

			break;

		case 2:

			if((sDay == "")||(sDay == "00")) {

				var yesterday = tDate.getDate();
				if(yesterday == maxdays) {

					var today = 1;
					if(thismonth == 12) {
						var month = 1;
						var year = eval(thisyear+1);
					} else {
						var month = eval(thismonth);
						var year = thisyear;
					}

				} else if(yesterday == 1) {
					var month = thismonth;
					var today = eval(tDate.getDate()+1);
					var year = thisyear;
				} else {
					var today = eval(tDate.getDate()+1);
					var month = thismonth;
					var year = thisyear;
				}

				month = (month < 10) ? "0"+month : month;
				_getElement(id_campo_meses).value = month+"/"+year;

			} else var today = tDate.getDate();

			break;

		}

		var options = "";
		var selected = "";
		for(x=1;x<=maxdays;x++) {

			if(x<10) {
				xStr = "0"+x;
			} else {
				xStr = x;
			}

			if(x == today) {
				selected = 'selected = "selected"';
			} else {
				selected = '';
			}
			options = options + "<option "+selected+" value='"+xStr+"'>"+x+"</option>";
		}

		var output="<select name='"+name_campo_dias+"' onchange='";

		// en caso de ser la fecha de entrada, debemos incluir una función que cambie la de
		// salida automáticamente
		if (check_in==1) output = output + " " + this.my_name +".changeCheckOutDate();";
		output = output + " " + this.my_name +".changeNumNights();' ";
		output = output + "' class='txt05' id='"+id_campo_dias+"'>"+options+"</select>";

		target = _getElement(targetID);
		target.innerHTML = output;

	}

	// ¿No se utiliza?
	this.mostrarMeses = function(flag){

		// flagsi estamos en la carga por defecto este valor será vacio o cero pero si no es asi, esta
		// funcion no debe modificar el mes.
		if((flag == "") || (flag == "00")) {

			var today = new Date();
			var milisegundos = parseInt(1*24*60*60*1000);
			var tiempo = today.getTime();
			var total = today.setTime(parseInt(tiempo+milisegundos));
			var todaymonth = eval(today.getMonth())+1;
			var todayyear = eval(today.getFullYear());
			var tiempo = today.getTime();
			var total = today.setTime(parseInt(tiempo+milisegundos));

			if (todaymonth.toString().length==1) todaymonth = "0"+todaymonth;

			var tomorrowmonth=today.getMonth()+1;
			var tomorrowyear=today.getFullYear();

			if (tomorrowmonth.toString().length==1) tomorrowmonth = "0"+tomorrowmonth;

			var monthyear = todaymonth+"/"+todayyear;
		  	var monthyear2 = tomorrowmonth+"/"+tomorrowyear;

		  	_setElementValue(this.prefix + "_month_year_checkin" ,monthyear);
		  	_setElementValue(this.prefix + "_month_year_checkout" ,monthyear2);

		}
	}

	////////////////////////VALIDACIÓN DE LA FECHA///////////////////////////////////////
	/**Valida Si la fecha entrada y salida son correctas**/
	var _getTodayDate = function() {
		current_date = new Date(); //Fecha Actual.
		current_date.setHours(0);
		current_date.setMinutes(0);
		current_date.setSeconds(0);
		return current_date;
	}

	var _getMyDate = function(day_form_id,monthyear_form_id) {
		dia = document.getElementById(day_form_id).value;
		mes = document.getElementById(monthyear_form_id).value.substring(0,2);
		anno = document.getElementById(monthyear_form_id).value.substring(3,7);

		//El mes de la clase empieza desde 0, por eso tengo q restarle 1.
		calculated_date = new Date(anno, mes-1, dia);

		return (calculated_date.getDate() != dia ? 0 : calculated_date);

	}

	// Esta función chequea las fechas de entrada y de salida del formulario. el formato de esta fecha
	// es el que utilizamos
	// en los desplegables tradicionales de destinia (chek_in_day, check_in_month_year)
	var _validateDatewithSelect = function(check_in_day_form_id, check_in_monthyear_form_id
		,check_out_day_form_id,check_out_monthyear_form_id){

		Error= new Array(3);
		Error = 0;
		var current_date = _getTodayDate();
		var earlierdate = _getMyDate(check_in_day_form_id, check_in_monthyear_form_id);
		var laterdate = _getMyDate(check_out_day_form_id, check_out_monthyear_form_id);

		// indicates input date is invalid
		if (earlierdate==0) Error = 1222;
		else{

			// indicates input date is invalid
			if (laterdate==0) Error = 1525;

			if (getElementValue(this.prefix + "_num_nights")<1) Error = 427;

			if (Error==0) {

				daysDifference = _calculateDifference(earlierdate, current_date);

				// Minimo fecha Actual.
				if (daysDifference < 0) Error = 421;

				// Minimo fecha Actual.
				if (daysDifference > 334) Error = 1205;

				if(earlierdate == laterdate) Error = 427;

			}

			datesDifference = _calculateDifference(laterdate, earlierdate);
			if (datesDifference <= 0) Error = 428;

		}// endif invalid input date

		return Error;
	}

	////////////////////////FIN DE VALIDACIÓN DE LA FECHA///////////////////////////////////////

	///////////////////////////MOSTRAR OCULTAR DESPLEGABLES EN EL BUSCADOR/////////////////////////////
	// MOSTRAR - OCULTAR DESPLEGABLES DE NIÑOS SEGÚN TIPOS DE HABITACIÓN--------------------------------
	// función que muestra los desplegables de las edades de los niños, en funcion del tipo de
	// habitación y para la habitación adecuada. Los tipos de habitación 4, 3 y 7 solo requieren un
	// desplegable (solo un niño) el tipo 5 requiere de 1 y el resto de ninguno

	this.displayChildren = function(id_habitacion) {

		var habitacion_selected = this.prefix + "_" + id_habitacion
			+ "_hotelsearchroomoccupancy_user_room_type";
		var age_child_1 = this.prefix + "_" + id_habitacion + "_hotelsearchroomoccupancy_edad_1";
		var age_child_2 = this.prefix + "_"+id_habitacion+"_hotelsearchroomoccupancy_edad_2";

		if ((_getElementValue (habitacion_selected) == 4)
			|| (_getElementValue(habitacion_selected) == 3)
			|| (_getElementValue(habitacion_selected)== 7)) {

			_getElement(this.prefix + "_etiqueta_ninyos").style.visibility = "visible";
			_getElement(age_child_1).style.display = "block";
			_getElement(age_child_2).style.display = "none";

		} else if(_getElementValue(habitacion_selected) == 5) {
		    _getElement(this.prefix + "_etiqueta_ninyos").style.visibility = "visible";
			_getElement(age_child_1).style.display = "block";
			_getElement(age_child_2).style.display = "block";
		} else {
		    _getElement(this.prefix + "_etiqueta_ninyos").style.visibility = "hidden";
		    _getElement(age_child_1).style.display = "none";
			_getElement(age_child_2).style.display = "none";
		}

	}

	//función que muestra los desplegables de los tipos de habitaciones en función del número
	//de habitaciones que podemos contratar. suponemos que los desplegables se encuentran
	//ya insertados en el código ocultos mediante un div
	this.displayRoomsTypes = function(){

		var num_habitaciones = _getElementValue(this.prefix + "_num_rooms");

		for (i = 1; i <= this.max_num_rooms; i++){

			var room_to_show = this.prefix + "_" + i + "_hotelsearchroomoccupancy_habitacion_repeat";
			var options_of_rooms = this.prefix + "_"+ i +"_hotelsearchroomoccupancy_user_room_type";
			var age_of_babies = this.prefix + "_" + i + "_hotelsearchroomoccupancy_edad_1";
			var age_of_babies_2 = this.prefix + "_"+ i +"_hotelsearchroomoccupancy_edad_2";

			if(i <= num_habitaciones){

				_getElement(room_to_show).style.display = "block";

				rt = _getElementValue(options_of_rooms);

				if((rt == 4) || (rt == 3) || (rt == 7) || (rt == 5)){
					_getElement(this.prefix + "_etiqueta_ninyos").style.visibility = "visible";
					_getElement(age_of_babies).style.display = "block";
				}

				if(rt==5) _getElement(age_of_babies_2).style.display = "block";

			} else {

				_getElement(room_to_show).style.display = "none";
				_setElementValue (options_of_rooms, 1);
				_getElement(age_of_babies).style.display = "none";
				_getElement(age_of_babies_2).style.display = "none";
				_setElementValue(age_of_babies, "--");
				_setElementValue(age_of_babies_2, "--");

			}
		}
	}


	//FIN MOSTRAR - OCULTAR DESPLEGABLES DE NIÑOS SEGÚN TIPOS DE HABITACIÓN-----------------------------

	/**Funcion que valida el formulario**/
	//valida cualquier campo que le pasemos por parámetro (field_id) , devolviendo el código de error
	// que le pasemos por parámetro (error)
	//si el campo coincide con el valor que le pasemos también por parámetro (not_valid_value)
	var _validateEmptyField = function(field_id, not_valid_value, error) {
		var field_value;
		field_value = getElementValue( field_id );
		return (field_value == not_valid_value ? error : 0);
	}

	// esta función traduce el tipo de habitación. En algunos casos, dependiendo de la edad de los
	// niños, aunque sea de un tipo, a nivel de peticiones a proveedor es otro. Por tanto esta función
	// traduce al tipo definitivo.
	var _translateFinalTypeOfRoom = function(room_id) {

		 var aux = this.prefix + "_" + room_id + "_hotelsearchroomoccupancy_user_room_type";
		 var aux_baby1 = this.prefix + "_" + room_id + "_hotelsearchroomoccupancy_edad_1";
		 var aux_baby2 = this.prefix + "_" + room_id + "_hotelsearchroomoccupancy_edad_2";
		 var type_of_room_selected = getElementValue(aux);
		 var type_of_room_translated = type_of_room_selected;

		//habitación triple con niño menor o igual a 1 año es una triple
		 if ((type_of_room_selected == 7) && ((getElementValue(aux_baby1) == "-1")
		 	||(getElementValue(aux_baby1).value == 1))) type_of_room_translated = 6;

		//habitación doble con niño menor o igual a 1 año es una doble
		if ((type_of_room_selected == 3) && ((getElementValue(aux_baby1) == "-1")
			||(getElementValue(aux_baby1) == 1))) type_of_room_translated = 1;

	 	// habitación doble con 2 niños: si los dos niños son menores o de 1 año se considera una
	 	// doble (1) y si es con solo un niño menor se considera doble + 1 niño (3)
		 if ((type_of_room_selected==5) && (((getElementValue(aux_baby1) == "-1")
		 	||(getElementValue(aux_baby1).value == 1)) || (getElementValue(aux_baby2).value == "-1")
		 	||(getElementValue(aux_baby2) == 1))) {

			if (((getElementValue(aux_baby1)== "-1" ) ||(getElementValue(aux_baby1) == 1))
				&& (getElementValue(aux_baby2) == "-1") ||(getElementValue(aux_baby2) == 1))
				type_of_room_translated = 1;
			else type_of_room_translated = 3;

		 }

		return type_of_room_translated;
	}

	// se encarga de validar que no hemos superado el máximo número de tipos de habitaciones distintas.
	// esto viene condicionado por la naturaleza de los proveedores que solo permiten peticiones de un
	// máximo de 3 tipos de habitaciones diferentes.
	// criterios de diferenciación incluidos en wiki
	var _validateMaxTypesofRoomsinHotels = function(error) {

		// a esta función debo invocarla después de que el usuario haya metido las edades de los niños
		// porque si no no puedo comprobar que tengo más de 3 tipos de habitación
		var total_types_of_rooms = 7;
		var max_types_of_rooms = this.prefix + "_max_types_of_rooms";
		var max_num_rooms = this.prefix + "_max_num_rooms";
		type_of_rooms = new Array();

		for(i = 1; i <= total_types_of_rooms; i++) type_of_rooms[i]=0;

		//pongo a 1 los registros del vector de los tipos de habitaciones que ha elegido el usuario
		for (i=1; i<=getElementValue(this.prefix + "_num_rooms"); i++) {

			var aux = this.prefix + "_"+ i + "_hotelsearchroomoccupancy_room_type";
			//tengo que traducir los tipos de habitaciones porqeu hay ciertas reglas con la edad
			// de los niños que debemos tener en cuenta
			var type_of_room_translated = _translateFinalTypeOfRoom(i);
			type_of_rooms[type_of_room_translated] = 1;

		}

		var total_rooms_selected=0;
	    //si tengo habitaciones dobles (tipo 1) las del tipo 4 no se consideran como distintas.
		if(type_of_rooms[1] == 1) type_of_rooms[4] = 0;
		//calculo el número de habitaciones diferentes que tengo
	    for(i=1; i<=total_types_of_rooms; i++) total_rooms_selected += type_of_rooms[i];

	    return (total_rooms_selected > max_types_of_rooms ? error : 0);

	}

	//Valida que el usuario ha insertado las edades de los niños en los casos en los qeu
	//ha elegido habitaciones con niños. El máximo número de habitaciones, y el máximo
	//número de niños por habitación está definido para la correcta comprobación
	var _validateChildrenAges = function(not_valid_value,error){

		var max_num_rooms= this.prefix + "max_num_rooms";
		var max_num_children_per_room=2;
		var mensaje=0;
		var detected=false;

		for (i = 1; i <= _getElementValue(this.prefix + '_num_rooms'); i++) {

			var aux = this.prefix + "_" + i + "_hotelsearchroomoccupancy_user_room_type";
			var room_type=document.getElementById(aux).value;
		    //desde el momento que ya tenga una edad no insertada dejo de comprobar
			if(!(detected)) {
				if (room_type==5) {
					//aquí tengo que evaluar las edades de 2 niños
					for (j=1; j<=max_num_children_per_room; j++) {
						if(!(detected)){
							var aux2 = this.prefix + "_" + i + "_hotelsearchroomoccupancy_edad_"+ j;
							mensaje = _validateEmptyField(aux2,"--",error);
							if (mensaje == error) detected = true;
						}
					}
				}

				if ((room_type == 4)||(room_type == 3)||(room_type == 7)){
					//aquí solo evalúo la edad de un niño
					var aux2 = this.prefix + "_" + i + "_hotelsearchroomoccupancy_edad_1";
					mensaje = _validateEmptyField(aux2, "--", error);
					if (mensaje == error) detected = true;
				}
			}
		}

		return mensaje;
	}


	// se encarga de realizar cambios en la fecha de salida en función de los cambios
	// realizados en el número de noches, o en el campo de la fecha de entrada ya sea
	// por el desplegable o por el calendario
	this.changeCheckOutDate = function(){

	  	num_nights = _getElementValue(this.prefix + "_num_nights");
	  	checkout_date = new Date(_getElementValue(this.prefix + "_month_year_checkin").substr(0,2)
	  		+ "/" + _getElementValue(this.prefix + "_checkin_day") + "/"
	  		+ _getElementValue(this.prefix + "_month_year_checkin").substr(3,6)
	  		+ " 01:00");
	  	checkout_date.setTime(checkout_date.getTime()+ num_nights * 1000 * 60 * 60 * 24)

	  	checkoutmonth= checkout_date.getMonth();
	  	checkoutmonth++;
	  	checkmonth = checkoutmonth.toString();
		if (checkmonth.length==1) checkmonth = "0"+checkmonth;
	  	checkoutyear =checkout_date.getFullYear();
	  	_setElementValue(this.prefix + "_month_year_checkout", checkmonth + '/' + checkoutyear);
		this.mostrarDias(this.prefix + "_month_year_checkout", this.prefix + "_outoptions"
			, this.prefix + "_checkout_day", this.prefix + "_checkout_day", num_nights ,1,0,0);
	  	checkoutday = checkout_date.getDate();
	  	checkout = checkoutday.toString();
	  	lenday = checkout.length;
		if (lenday==1) checkout = "0" + checkout;

	  	_setElementValue(this.prefix + "_checkout_day", checkout);

	}


	this.onChangeMonthYear = function(id_campo_meses, targetID, id_campo_dias,name_campo_dias
		, inicio, dias_mas, check_in) {

		this.mostrarDias(id_campo_meses, targetID, id_campo_dias,name_campo_dias, inicio, dias_mas
			, check_in,0);

		if (check_in==1) this.changeCheckOutDate();
		else this.changeNumNights();

	}

	if(this.is_bank_off) {

		// evaluamos aquí si la reserva que intentamos hacer es para mañana en cuyo caso, debe
		// saltar un mensaje de error pues no funcionaría lo de bank_off
		this.validateDaysforBankOff = function (check_in_day_form_id, check_in_monthyear_form_id) {

			error=0;
			var current_date = getTodayDate();
			var earlierdate = _getMyDate(check_in_day_form_id, check_in_monthyear_form_id);
			daysDifference = _calculateDifference(earlierdate, current_date);
			if (daysDifference <= 1) error = 1222;
			return error;

		}

	}

	if(this.hotelsearch_show_more_search_options_value)
		this.mostrar_adicionales = function() {
				getElement(this.prefix + "adicionales").style.display = "block";
		}


	this.validate = function(){

		mensaje=0;
		datosOk=false;

		if(this.validate_search_string_box) {
			var mensaje = _validateEmptyField(this.prefix + '_town_search_string'
				, this.msgs[4161], '426');
		    if (mensaje == 0)
		    	var mensaje = _validateEmptyField(this.prefix + '_town_search_string','','426');
		}

		if(this.zone_page)
	    	var mensaje = _validateEmptyField(this.prefix + '_geounit_id','','426');

		if(mensaje==0) var mensaje = _validateChildrenAges("--","3729");
		if(mensaje==0) var mensaje = _validateMaxTypesofRoomsinHotels('111');
		if(mensaje==0) var mensaje = _validateDatewithSelect(this.prefix + "_checkin_day"
			, this.prefix + "_checkin_month_year", this.prefix + "_checkout_day%>"
			, this.prefix + "_checkout_month_year");

		if(this.bank_off)
			if(mensaje==0) var mensaje = validateDaysforBankOff(this.prefix + "_checkin_day"
				, this.prefix + "_checkin_month_year");

		switch (mensaje){

			case '111': alert(this.hs_msgs[3371]); break;
			case 421: alert(this.hs_msgs[421]); break;
			case '426': alert(this.hs_msgs[426]); break;
			case 427: alert(this.hs_msgs[427]); break;
			case 428: alert(this.hs_msgs[428]); break;
			case 1205: alert(this.hs_msgs[1205]); break;
			case 1222: alert(this.hs_msgs[4263]); break;
			case "3729": alert(this.hs_msgs[3729]); break;
			case 2: statement; break;
			default :
				document.getElementById("indicator").style.display = "block";
				document.getElementById("boton_enviar").style.display = "none";
	    		return true;
		}

		return false;
	}

	this.clearInput = function(element, valor) {

		if (valor == element.value) element.value= '';

	}

}