/**
 * Agrega la función trim a los Strings
 */
String.prototype.trim = function(){
    var reExtraSpace = /^\s+(.*?)\s+$/;
    return this.replace(reExtraSpace, "$1");
};

/**
 * Dependencias
 * 				locationReserveDomain.js
 * 				Common.js
 */

var _CURRENCY = "U$D ";

var _VENDEDOR = null; //Instancia de vendedor con la que se trabaja (seleccionado)
var _TYPE_ROOM_FILTER = null; //Si es null, muestra todas las hab disponibles, sino sólo las hab disponibles de ese tipo
var _CALENDAR_CONTAINER = "calendar-container"; //Contenedor gráfico del calendario (td, div, span...)
var _CALENDAR_ICON_IN = "calendarIn";
var _CALENDAR_ICON_OUT = "calendarOut";
var _CHECKIN_INPUT = "checkInInput";
var _CHECKOUT_INPUT = "checkOutInput";

/**
 * id del input que posee la cantidad de adultos
 */
var _CANT_ADULTOS = "totalAdults";
/**
 * id del input que posee la cantidad de menores
 */
var _CANT_MENORES = "totalMinors";

/**
 * Cantidad de habitaciones a ocupar
 */
var _CANT_HAB = "totalRooms"


var _COMBO_VENDEDORES = "comboVendedores";

var _TABLE_TYPE_ROOM = "typeRooms";

var _TYPEROOM_IMG = "typeRoomImg";

var _TYPEROOM_TUMB = "tumb";

var _TYPEROOM_DESC = "typeRoomDesc";

var _SUMMARY_CHECKIN = "checkIn";
var _SUMMARY_CHECKOUT = "checkOut";
var _SUMMARY_TYPEROOM = "summaryTypeRoom";
var _SUMMARY_TYPEROOMID = "typeRoomId";
var _SUMMARY_CANTROOMS = "summaryCantHab";
var _SUMMARY_NIGHTS = "summaryNights";
var _SUMMARY_ADULTS = "greaters";
var _SUMMARY_MINORS = "minors";
var _SUMMARY_TOTAL = "summaryTotal";
var _SUMMARY_TOTAL_LABEL = "summaryTotalLabel";

var _GUEST_FIRSTNAME = "guestFirstName";
var _GUEST_LASTNAME = "guestLastName";
var _GUEST_MAIL = "guestMail";
var _GUEST_TELEPHONE = "guestTelephone";
var _GUEST_NUMBERDOCUMENT = "guestDocNumber";
var _GUEST_TYPEDOCUMENT = "guestDocTypeCombo";
var _GUEST_TYPEDOCUMENT_HIDDEN = "guestDocType";
var _GUEST_CIVILSTATE = "guestCivilStateCombo";
var _GUEST_CIVILSTATE_HIDDEN = "guestCivilState";
var _GUEST_DATEBIRTH = "guestDateBirth";
var _GUEST_NATIONALITY = "nationalityCombo";
var _GUEST_NATIONALITY_HIDDEN = "nationality";
var _GUEST_SEX = "guestSexCombo";
var _GUEST_SEX_HIDDEN = "guestSex";
var _GUEST_ID = "guestId";var _HIDDEN_IDENTIFICADOR = "hiddenInput";

var _PANEL_PROGRESS_ID = "panelProgress";

var _STYLE_TYPEROOM = "filaTypeRoom";
var _STYLE_SEL_TYPEROOM = "filaSelected";

var _LOGO_VENDEDOR = "logoVendedor";
var _LOGO_VENDEDOR_MINI = "logoVendedorMini";

var _RESELLER_ID = "reseller";
var _TRAVELAGENCY_ID = "travelAgency";

var _WEB_PARAM_ID = "webParamId";
var _FIXED_CHECKIN_CHECKOUT = "fixedCheckInCheckOut";
var _FIXED_CHECKIN = "fixedCheckIn";
var _FIXED_CHECKOUT = "fixedCheckOut";
var _FIXED_VENTA_WEB = "fixedVentaWeb";
var _IMPORTE_VENTA_WEB = "importeVentaWeb";
var _CANT_NOCHES = "cantNoches";

var _TRAVEL_AGENCY_LOGUEADO = false;
var _TRAVEL_AGENCY_ID = "";

function getCantNoches(){
	return document.getElementById(_CANT_NOCHES).value;
}

function filtrarPorCantidadNoches(){
	var cantNoches = Number(getCantNoches());
	if(cantNoches >0){
		return true;
	}
	return false;
}

function getFixedVentaWeb(){
	return document.getElementById(_FIXED_VENTA_WEB).value;
}

function getImporteVentaWeb(){
	return document.getElementById(_IMPORTE_VENTA_WEB).value;
}

function getFixedCheckInCheckOut(){
	return document.getElementById(_FIXED_CHECKIN_CHECKOUT).value;
}

function getFixedCheckIn(){
	return document.getElementById(_FIXED_CHECKIN).value;
}

function getFixedCheckOut(){
	return document.getElementById(_FIXED_CHECKOUT).value;
}

/**
 * Devuelve el identificador de parámetro web actual
 */
function getWebParamId(){
	return document.getElementById(_WEB_PARAM_ID).value;
}

/**
 * Setea el id del parámetro web actual
 * @param {Object} webParam
 */
function setWebParamId(webParamId){
	document.getElementById(_WEB_PARAM_ID).value = webParamId;
}

/**
 * Muestra la barra de progreso
 */
function toggleProgressBar(){
	actual = document.getElementById(_PANEL_PROGRESS_ID).style.display;
	if(actual == ""){
		document.getElementById(_PANEL_PROGRESS_ID).style.display = "none";
	}else{
		document.getElementById(_PANEL_PROGRESS_ID).style.display = "";
	}
}

/**
 * Retorna el vendedor seleccionado
 * @param {Array} vendedores arreglo asociativo de vendedores
 * @return {Vendedor} vendedor seleccionado
 */
function getVendedor(vendedores){
	var combo = document.getElementById(_COMBO_VENDEDORES);
	return vendedores[combo.options[combo.selectedIndex].value];
}

/**
 * @return {String} checkIn seleccionado en la pantalla
 * 
 */
function getCheckIn(){
	return document.getElementById(_CHECKIN_INPUT).value;
}

function setCheckOut(value){
	return document.getElementById(_CHECKOUT_INPUT).value = value;
}
/**
 * @return {String} checkOut seleccionado en la pantalla
 * 
 */
function getCheckOut(){
	return document.getElementById(_CHECKOUT_INPUT).value;
}

/**
 * Obtiene la cantidad de mayores más menores
 */
function getCantPersonas(){
	var mayores = parseInt(document.getElementById(_CANT_ADULTOS).value);
	var menores = parseInt(document.getElementById(_CANT_MENORES).value);
	return mayores + menores;
}

/**
 * Retorna la cantidad de mayores
 */
function getCantMayores(){
	return document.getElementById(_CANT_ADULTOS).value;
}

/**
 * Retorna la cantidad de menores
 */
function getCantMenores(){
	return document.getElementById(_CANT_MENORES).value;
}

/**
 * Retorna la cantidad de habitaciones seleccionadas
 */
function getCantHabitaciones(){
	return document.getElementById(_CANT_HAB).value;
}


/**
 * Actualiza la lista de vendedores por destino
 */
function changeDestino(comboDestino, comboVendedores, rubros, vendedoresXdestinoXrubro){
	clearCombo(comboVendedores);
	destino = comboDestino.value;
	cargarVendedores(comboVendedores, rubros, vendedoresXdestinoXrubro[destino]);
	comboVendedores.onchange();
}

/**
 * Actualiza la lista de vendedores por destino
 */
function cargarVendedores(comboVendedores, rubros, vendedoresXrubro, vendorSelected){
	clearCombo(comboVendedores);
	for(var r in rubros){
		rubro = rubros[r];
		optg = document.createElement('optgroup');
		optg.label = rubro.descripcion;
		comboVendedores.appendChild(optg);
		for(j in vendedoresXrubro[rubro.id]){
			vendedor = vendedoresXrubro[rubro.id][j];
			option = addOption(comboVendedores);
			option.text = vendedor.name;
			option.value = vendedor.id;
			if(vendedor.id == vendorSelected)
				option.selected = true;
		}
	}
	sortComboByGroups(comboVendedores);
}

/**
 * Realiza las acciones necesarias al momento de seleccionar un vendedor
 * @param {Combo} comboVendedores
 * @param {Array} vendedores arreglo asociativo de todos los vendedores [id=>vendedor]
 * @param {Number} idComprador
 */
function changeVendedor(vendedores, idComprador){
	/*if(_VENDEDOR!=null)
		_VENDEDOR.hideCalendar();*/
		
	_VENDEDOR = getVendedor(vendedores);
	if(_VENDEDOR!=null){
		var cinDefault = dateToStr(new Date());
		var coutDefault = dateToStr(shiftDate(new Date(), 365));
		
		if(getFixedCheckInCheckOut() == 'true'){
			cinDefault = getFixedCheckIn();
			coutDefault = getFixedCheckOut();
		}
		
		_VENDEDOR.getEntradasFijas(cinDefault, coutDefault, idComprador);
		_VENDEDOR.retrieveAvailability(idComprador, cinDefault, coutDefault);
		
		if(getFixedCheckInCheckOut() == 'true'){
			_VENDEDOR.availability.ifNotPresentRetrieve = function(){return;}
		}	
		
		_VENDEDOR.availability.setCantPersonas(getCantPersonas());
		_VENDEDOR.availability.setCheckIn(cinDefault);
		_VENDEDOR.availability.setCheckOut(coutDefault);
		_VENDEDOR.availability.setMercadoId(_VENDEDOR.webMarket.id);
		_VENDEDOR.checkInValue = getCheckIn();
		_VENDEDOR.checkOutValue = _VENDEDOR.getDefaultCheckOut(getCheckIn()); //getCheckOut();
		setCheckOut(_VENDEDOR.checkOutValue);
		_VENDEDOR.onchangecheckin = function (){
										document.getElementById(_SUMMARY_CHECKIN).value = getCheckIn();
										changeDates(vendedores, idComprador);
									}
		_VENDEDOR.onchangecheckin.vendedores = vendedores;
		_VENDEDOR.onchangecheckin.idComprador = idComprador;
		_VENDEDOR.onchangecheckout = function (){
										var cout = getCheckOut();
										if(differenceDays(strToDate(cout), strToDate(getCheckIn()))<0){
											//cout = dateToStr(shiftDate(strToDate(getCheckIn()), 1));
											//document.getElementById(_CHECKOUT_INPUT).value = cout;
											setCheckOut(_VENDEDOR.getDefaultCheckOut(getCheckIn()));
										}
										document.getElementById(_SUMMARY_CHECKOUT).value = getCheckOut();
										changeDates(vendedores, idComprador);
									}
		_VENDEDOR.onchangecheckout.vendedores = vendedores;
		_VENDEDOR.onchangecheckout.idComprador = idComprador;
		//_VENDEDOR.checkInOutCalendar(_CHECKIN_INPUT, _CHECKOUT_INPUT, true, _CALENDAR_CONTAINER, strToDate(getCheckIn()));
		document.getElementById(_TYPEROOM_DESC).innerHTML = _VENDEDOR.getDescripcionVendedor();
		try {
			document.getElementById(_LOGO_VENDEDOR).src = getLogoVendedor(_VENDEDOR.id);
			document.getElementById(_LOGO_VENDEDOR_MINI).src = getLogoVendedor(_VENDEDOR.id);
		} catch(e){}
		changeDates(vendedores, idComprador);
		//updateAvailablesTypeRoomsTimeOut(idComprador);
	}
}

/**
 * Muestra el calendario para checkIn
 */
function showCalendarIn(){
	_VENDEDOR.checkInCalendar(_CHECKIN_INPUT, _CHECKIN_INPUT, _CHECKOUT_INPUT, _CALENDAR_ICON_IN, true);
}

/**
 * Muestra el calendario para checkIn
 */
function showCalendarOut(){
	_VENDEDOR.checkOutCalendar(_CHECKOUT_INPUT, _CHECKOUT_INPUT, _CHECKOUT_INPUT, _CALENDAR_ICON_OUT, true, getCheckIn());
}

/**
 * Ejecuta la función updateAvailablesTypeRooms con un intervalo de tiempo
 * para mostrar correctamente la barra de progreso
 */
function updateAvailablesTypeRoomsTimeOut(buyerId){
	toggleProgressBar();
	setTimeout("updateAvailablesTypeRooms("+buyerId+","+_VENDEDOR.webMarket.id+"); toggleProgressBar();", 500);
}

/**
 * Retorna true si la cantidad de ocupantes de la reserva es una persona o mas. Caso contrario, retorna false
 */
function validarOcupantes(){
	if(getCantPersonas() == 0){
		return false;
	}
	return true;	
}

/**
 * Retorna true si la cantidad de ocupantes es mayor o igual a la cantidad de habitaciones
 */
function validarOcupantesEnHabs(){
	if(getCantPersonas() >= getCantHabitaciones()){
		return true;
	}
	return false;
}

/**
* True si hubo error en la ocupacion. Es decir, no se seleccionaron ocupantes o bien la cantidad de ocupantes es inferior a la cantidad de habitaciones seleccionadas
*/
function isErrorOcupacion(){
	return !(validarOcupantes() && validarOcupantesEnHabs());
}

/**
* function que muestra los mensajes de error relacionados con ocupacion cuando corresponde
*/ 
function mostrarErrorOcupacion(){
	if(!validarOcupantes()){
		alert(I18N.get("error.web.reserva.pasajeros"));
	} else if(!validarOcupantesEnHabs()){
		alert(I18N.get("error.web.reserva.habitaciones"));
	}
}

/**
 * Actualiza la disponibilidad en caso de modificar menores o mayores
 */
function changeCantPersonas(vendedores, buyerId){
	var cantPersonas = getCantPersonas();
	for(i in vendedores){
		if(vendedores[i].availability)
			vendedores[i].availability.setCantPersonas(cantPersonas);
	}
	document.getElementById(_SUMMARY_ADULTS).value = getCantMayores();
	document.getElementById(_SUMMARY_MINORS).value = getCantMenores();
	
	if(!isErrorOcupacion()){
		//_VENDEDOR.calendar.refresh();
		updateAvailablesTypeRoomsTimeOut(buyerId);
	} else {
		mostrarErrorOcupacion();
		clearTypeRooms();
	}
}

/**
* Actualiza la disponibilidad en caso de cambiar la cantidad de habitaciones
*/
function changeCantHabitaciones(vendedores, buyerId){
	document.getElementById(_SUMMARY_CANTROOMS).value = getCantHabitaciones();

	if(!isErrorOcupacion()){
		updateAvailablesTypeRoomsTimeOut(buyerId);
	} else {
		mostrarErrorOcupacion();
		clearTypeRooms();
	}
}

function errorFechasIntervalo() {
	var cin = strToDate(getCheckIn());
	var cout = strToDate(getCheckOut());
	var minFechaCheckIn = strToDate(getFixedCheckIn());
	var maxFechaCheckOut = strToDate(getFixedCheckOut());
	
	if((differenceDays(cin, minFechaCheckIn)<0) ||(differenceDays(cout, maxFechaCheckOut)>0) ){
		return true;
	}
	
	return false;
}


/**
 * Actualiza la disponibilidad en caso de modificar checkIn o checkOut
 */
function changeDates(vendedores, buyerId){
	var cin = getCheckIn();
	var cout = getCheckOut();
	
	for(i in vendedores){
		if(vendedores[i].availability){
			vendedores[i].availability.setCheckIn(cin);
			vendedores[i].availability.setCheckOut(cout);
		}
	}
	document.getElementById(_SUMMARY_NIGHTS).value = differenceDays(strToDate(cout), strToDate(cin));
	
	if(getFixedCheckInCheckOut() == 'true'){
		if(errorFechasIntervalo()) {
			alert('Las fecha de check-in y check-out de la reserva deben estar compredidas entre ' + getFixedCheckIn() + ' y ' + getFixedCheckOut());
			clearTypeRooms();
			return;
		}
	}
	
	if(!isErrorOcupacion()){
		updateAvailablesTypeRoomsTimeOut(buyerId);
	} else {
		mostrarErrorOcupacion();
		clearTypeRooms();
	}
}

/**
 * Actualiza la tabla de tipos de habitación disponibles
 * @param buyerId identificador del comprador
 */
function updateAvailablesTypeRooms(buyerId){
	clearTypeRooms();
	
	var checkIn = getCheckIn();
	var checkOut = getCheckOut();
	var cantAdultos = getCantMayores();
	var cantMenores = getCantMenores();
	var cantHabitaciones = getCantHabitaciones();
	if((checkIn!='')&&(checkOut!='')&&(checkIn!=checkOut)){
		if (_TRAVEL_AGENCY_LOGUEADO==false)
		{
			var typeRooms = _VENDEDOR.availability.getAvailableRooms(_VENDEDOR.id, buyerId, checkIn, checkOut, cantAdultos, cantMenores, _VENDEDOR.webMarket.id,cantHabitaciones, getWebParamId()).list;
			renderTypeRooms(typeRooms);
		} 
		else
		{
			var typeRooms = _VENDEDOR.availability.getAvailableRoomsTravelAgency(_VENDEDOR.id, buyerId, _TRAVEL_AGENCY_ID, checkIn, checkOut, cantAdultos, cantMenores, _VENDEDOR.webMarket.id,cantHabitaciones, getWebParamId()).list;
			renderTypeRooms(typeRooms);
		}
	}else
		clearTypeRooms();
}

/**
 * Cambia la imagen de tipo de habitación
 * @param shift incremento o decremento de cantidad de imágenes
 */
function shiftImg(shift){
	var imgIndex = document.getElementById(_TYPEROOM_IMG).imgIndex;
	if((imgIndex!=null)&&(imgIndex!=undefined)){
		var imgs = document.getElementById(_TYPEROOM_IMG).imgList;
		imgIndex += shift;
		if(imgs[imgIndex]==undefined)
			imgIndex = 0;
		document.getElementById(_TYPEROOM_IMG).imgIndex = imgIndex;
		document.getElementById(_TYPEROOM_IMG).src = imgs[imgIndex];
	}
}

/**
 * Resetea el estilo de las filas con las descripciones de los tipos de habitación
 */
function deselectTypeRooms(){
	var table = document.getElementById(_TABLE_TYPE_ROOM);
	for(var i=0; i< table.tBodies[0].rows.length; i++){
		table.tBodies[0].rows[i].className = _STYLE_TYPEROOM;
		table.tBodies[0].rows[i].radioButton.checked = false;
	}
	for(var i=0; i<4; i++)
		document.getElementById(_TYPEROOM_TUMB + i).style.display = "none";
}

/**
 * Se dispara cuando el usuario selecciona un tipo de habitación
 */
function selectTypeRoom(){
	deselectTypeRooms();
	
	document.getElementById(_TYPEROOM_DESC).innerHTML = this.typeRoom.description;
	document.getElementById(_SUMMARY_TYPEROOM).value = this.typeRoom.denomination;
	document.getElementById(_SUMMARY_TYPEROOMID).value = this.typeRoom.id;
	if(isPrecioFijo()) {
		document.getElementById(_SUMMARY_TOTAL).value = _CURRENCY + " " + getCostoTotalFijo();
	} else if (!_TRAVEL_AGENCY_LOGUEADO){
		document.getElementById(_SUMMARY_TOTAL).value = _CURRENCY + " " + getRoomRateForWeb(this.typeRoom.id, getCheckIn(), getCheckOut(), getCantMayores(), getCantMenores(), getCantHabitaciones() ,this.idMercado, getWebParamId());
	} else {
		document.getElementById(_SUMMARY_TOTAL).value = _CURRENCY + " " + getRoomRateForWebTravelAgency(_TRAVEL_AGENCY_ID, this.typeRoom.id, getCheckIn(), getCheckOut(), getCantMayores(), getCantMenores(), getCantHabitaciones() ,this.idMercado, getWebParamId());
	}
	document.getElementById(_SUMMARY_TOTAL_LABEL).innerHTML = document.getElementById(_SUMMARY_TOTAL).value;
	document.getElementById(_SUMMARY_CANTROOMS).value = getCantHabitaciones();
	
	this.radioButton.checked = true;
	
	this.className = _STYLE_SEL_TYPEROOM;
	
	var imgs = getTypeRoomImgs(this.typeRoom.id);
	
	if(imgs!=null){
		if(imgs[0]!=undefined){
			document.getElementById(_TYPEROOM_IMG).imgList = imgs;
			document.getElementById(_TYPEROOM_IMG).imgIndex = 0;
			document.getElementById(_TYPEROOM_IMG).src = imgs[0];
			document.getElementById(_TYPEROOM_IMG).style.display = "";
			
			var i = 0;
			while(imgs[i]!=undefined){
				document.getElementById(_TYPEROOM_TUMB + i).src = imgs[i];
				document.getElementById(_TYPEROOM_TUMB + i).style.display = "";
				i++;
			}		}else
			showVendorImg();
	}
}

/**
 * Se dispara cuando se hizo click en una de los tumbs para mostrar
 * la imagen en el cuadro principal
 * @param {HTMLImg} img
 */
function selectTumb(img){
	document.getElementById(_TYPEROOM_IMG).src = img.src;
}

/**
 * Limpia la tabla de tipos de habitación
 */
function clearTypeRooms(){
	delRowsTable(document.getElementById(_TABLE_TYPE_ROOM), 0);
	document.getElementById(_SUMMARY_TYPEROOM).value = "-";
	document.getElementById(_SUMMARY_TYPEROOMID).value = "";
	document.getElementById(_SUMMARY_TOTAL).value = "-";
	document.getElementById(_SUMMARY_TOTAL_LABEL).innerHTML = document.getElementById(_SUMMARY_TOTAL).value;
	document.getElementById(_TYPEROOM_IMG).style.display= "none";
	/*document.getElementById(_TYPEROOM_DESC).innerHTML = "";*/
	document.getElementById(_TYPEROOM_DESC).innerHTML = _VENDEDOR.getDescripcionVendedor();
	showVendorImg();
	
	for(var i=0; i<4; i++)
		document.getElementById(_TYPEROOM_TUMB + i).style.display = "none";
}

/**
 * Muestra la imagen de un vendedor
 */
function showVendorImg(){
	var url = _VENDEDOR.getUrlImg1();
	if(url!=null){
		document.getElementById(_TYPEROOM_IMG).style.display = "";
		document.getElementById(_TYPEROOM_IMG).src = url;
		document.getElementById(_TYPEROOM_IMG).imgList = null;
	}
}

/**
 * 
 * @return True si esta fijado el precio de la venta web
 */
function isPrecioFijo(){
	if(getFixedVentaWeb() == 'true'){
		return true;
	} else {
		return false;
	}
}

/**
 * 
 */
function getCostoPromedioFijo(){
	var total = Number(getImporteVentaWeb());
	var cantHabitaciones = Number(getCantHabitaciones());
	var cin = getCheckIn();
	var cout = getCheckOut();
	var cantDias = differenceDays(strToDate(cout), strToDate(getCheckIn()));
	return Math.round(total*cantHabitaciones/cantDias);
}

function getCostoTotalFijo(){
	var total = Number(getImporteVentaWeb());
	var cantHabitaciones = Number(getCantHabitaciones());
	return total*cantHabitaciones;
}
/**
 * Muestra la tabla de tipos de habitación disponibles
 */
function renderTypeRooms(typeRooms){
	var tabla = document.getElementById(_TABLE_TYPE_ROOM);
	clearTypeRooms();
	for(i in typeRooms){
		var tr = typeRooms[i];
		if((_TYPE_ROOM_FILTER==null)||(_TYPE_ROOM_FILTER==tr.id)){
			tabla.insertRow(0);
			tabla.rows[0].style.cursor = "pointer";
			tabla.rows[0].onclick = selectTypeRoom;
			tabla.rows[0].typeRoom = tr;
			tabla.rows[0].idMercado = _VENDEDOR.webMarket.id;
			tabla.rows[0].className = _STYLE_TYPEROOM;
			
			tabla.rows[0].insertCell(0);
			var radio = createRadioButton('', '', {});
			tabla.rows[0].cells[0].appendChild(radio);
			tabla.rows[0].radioButton = radio;
			tabla.rows[0].insertCell(1);
			//tabla.rows[0].cells[0].className = style;
			tabla.rows[0].cells[1].appendChild(document.createTextNode(tr.denomination));
			tabla.rows[0].insertCell(2);
			//tabla.rows[0].cells[1].className = style;
			if(isPrecioFijo()) {
				tabla.rows[0].cells[2].appendChild(document.createTextNode(_CURRENCY + getCostoPromedioFijo()));
			} else {
				tabla.rows[0].cells[2].appendChild(document.createTextNode(_CURRENCY + tr.averageCost));
			}
		}
	}
}

function habilitarDatosPersonales(habilitar){
	document.getElementById(_GUEST_FIRSTNAME).readOnly = !habilitar;
	document.getElementById(_GUEST_LASTNAME).readOnly = !habilitar;
	document.getElementById(_GUEST_NATIONALITY).disabled = !habilitar;
	document.getElementById(_GUEST_SEX).disabled = !habilitar;
	document.getElementById(_GUEST_MAIL).readOnly = !habilitar;
	document.getElementById(_GUEST_DATEBIRTH).readOnly = !habilitar;
	document.getElementById(_GUEST_NUMBERDOCUMENT).readOnly = !habilitar;
	document.getElementById(_GUEST_TYPEDOCUMENT).disabled = !habilitar;
	document.getElementById(_GUEST_CIVILSTATE).disabled = !habilitar;
	//document.getElementById(_GUEST_TELEPHONE).readOnly = !habilitar;
}

/**
 * En caso de presionar el boton volver, se limpian los datos adicionales que se hayan completado
 */
function limpiarDatosAdicionales(){
	//Datos adicionales
	var docType = document.getElementById(_GUEST_TYPEDOCUMENT);
	var docNum = document.getElementById(_GUEST_NUMBERDOCUMENT);
	var dateBirth = document.getElementById(_GUEST_DATEBIRTH);
	var telephone = document.getElementById(_GUEST_TELEPHONE);
	docType.value = "";
	docNum.value = "";
	dateBirth.value = "";
	telephone.value = "";
}
/**
 * Verifica la existencia de una persona, en caso de existir, carga sus datos
 * sino pide mas datos
 * 
 * El sistema realiza una busqueda fonetica del nombre y el apellido. 
 * Si el mail cargado por el cliente coincide con alguno de los mails que retorno la busqueda fonetica por nombre y apellido, 
 * entonces se determina que esa es la persona que esta realizando la reserva.
 * Caso contrario, si el mail existe en el sistema, y el nombre y apellido no coinciden, 
 * se le dice que hay alguien mas con esa direccion de mail.
 * Si el mail no coincide con los mails que trajo la consulta, 
 * se pedira como dato adicional la fecha de nacimiento y el dni para determinar si se trata o no de la persona.
 * Si estos datos difieren, se procede al alta de un nuevo huesped.
 */
function verificarPersona(tipoHabMsg, mailExistsMsg, newUserMsg, emptyNameMsg, mailMsg, errorNacionalidad){
	if(!validatePersonalData(emptyNameMsg, mailMsg, errorNacionalidad))
		return false;
	
	var nombre = document.getElementById(_GUEST_FIRSTNAME).value;
	var apellido = document.getElementById(_GUEST_LASTNAME).value;
	var nationality = document.getElementById(_GUEST_NATIONALITY).value;
	var sex = document.getElementById(_GUEST_SEX).value;
	var mail = document.getElementById(_GUEST_MAIL).value.trim().toLowerCase();
	var typeRoomId = document.forms[0].typeRoomId;
	if ((typeRoomId!=null)&&(typeRoomId.value.length==0))
	{
		alert(tipoHabMsg);
		var td = document.getElementById('seleccioneTipoHab');
		td.className='textoRojo';
		return false;
	}
	//Datos adicionales
	var docType = document.getElementById(_GUEST_TYPEDOCUMENT).value;
	var docNum = document.getElementById(_GUEST_NUMBERDOCUMENT).value;
	var dateBirth = document.getElementById(_GUEST_DATEBIRTH).value;
	
	var mailExist = jsonrpc.JsonUsers.mailExists(mail);
	
	//Si todavía no ingresó los datos adicionales, hace la búsqueda simple
	//if(docNum=="")
		var person = jsonrpc.JsonUsers.getPerson(nombre, apellido, nationality, sex, mail);
	/*else
		var person = jsonrpc.JsonUsers.getPerson(nombre, apellido, nationality, sex, dateBirth, docType, docNum);*/
	
	if((person == null)&&(mailExist)){//La persona no existe y alguien ya está utilizando el mail
		alert(mailExistsMsg);
		return false;
	}else
	if((person!=null)&&(person.id!=null)){ //La persona se encuentra registrada en el sistema
		document.getElementById(_GUEST_ID).value = person.id;
		var birth = new Date();
		birth.setTime(person.dateBirth.time);
		document.getElementById(_GUEST_DATEBIRTH).value = dateToStr(birth);
		document.getElementById(_GUEST_NUMBERDOCUMENT).value = person.numberDocument;
		document.getElementById(_GUEST_TYPEDOCUMENT).selectedIndex = findValue(document.getElementById(_GUEST_TYPEDOCUMENT), person.typeDocument);
		document.getElementById(_GUEST_CIVILSTATE).value = person.civilState;
		document.getElementById(_GUEST_TELEPHONE).value = person.phone;
		habilitarDatosPersonales(false);
		
		return true;
	}else if(person==null){ //La información indica que el usuario no está registrado, ya se completó el resto de la información, se procede
		return undefined;
	}
}
/**
 * Valida la primera información personal ingresada, utilizada para la verificación de identidad
 */
function validatePersonalData(emptyNameMsg, mailMsg, errorNacionalidad){
	var firstName = document.getElementById(_GUEST_FIRSTNAME).value;
	var lastName = document.getElementById(_GUEST_LASTNAME).value;
	if((firstName.length == 0)||(lastName.length == 0)){
		alert(emptyNameMsg);
		return false;
	}
	var nationality = document.getElementById('nationality').value;
	if (nationality.length==0){
		alert(errorNacionalidad);
		return false;
	}
	
	var idTravelAgency = jsonrpc.JsonWebReserve.getTravelAgency();
	var mail = document.getElementById(_GUEST_MAIL).value;
	var emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/;
	if(!emailRegExp.test(mail) && !((mail.length==0 && idTravelAgency != 0))){
		alert(mailMsg);
		return false;
	}
	return true;
}

/**
 * Setea el valor seleccionado en el combo en un input. El identificador del input esta parametrizado dentro del mismo combo como atributte
 */
function setValueComboInInput(){
	try {
		var index = this.selectedIndex;
		if(index >= 0){
			var valueCombo = this.options[index].value;
			var hiddenInput = this.getAttribute(_HIDDEN_IDENTIFICADOR);
			var input = document.getElementById(hiddenInput);
			if(input!= null && input != undefined){
				input.value = valueCombo;
			}
		}
	} catch(e){
		
	}	
}

/**
 * Valida el formulario
 */
function validateForm(cutOffMsg, emptyNameMsg, mailMsg, numberDocumentMsg, dateBirthMsg,dateCheckInMsg,telephoneMsg){
	var today = strToDate(dateToStr(new Date()));
	var fechaCheckIn = strToDate(getCheckIn());
	var difference = differenceDays(fechaCheckIn, today);
	if(difference < 0){
		alert(_VENDEDOR.name + ", " + dateCheckInMsg);
		return false;	
	}
	if(difference < _VENDEDOR.params.cutOff){
		alert(_VENDEDOR.name + ", " + cutOffMsg + " " + _VENDEDOR.params.cutOff);
		return false;	
	}
	if(!validatePersonalData(emptyNameMsg, mailMsg))
		return false;
	var numberDocument = document.getElementById(_GUEST_NUMBERDOCUMENT).value;
	var alphaRegExp = /^[0-9a-zA-Z.]+$/;
	if(!alphaRegExp.test(numberDocument) && numberDocument.length!=0){
		alert(numberDocumentMsg);
		return false;
	}
	
	var telephone = document.getElementById(_GUEST_TELEPHONE).value;
	var idTravelAgency = jsonrpc.JsonWebReserve.getTravelAgency();
	
	if(telephone.length == 0 && idTravelAgency ==0){
		alert(telephoneMsg);
		return false;
	}
	var dateBirth = document.getElementById(_GUEST_DATEBIRTH).value;
	if(!isDate(dateBirth) && dateBirth.length!=0){
		alert(dateBirthMsg);
		return false;
	}
	
	return true;
}

//Estructuras para la reserva web
var _RESELLER_ID = false;

var vendedores = new Array();
var rubros = new Array();
var vendedoresXrubro = new Array();
var vendedoresXdestinoXrubro = new Array();

function retrieveVendedores(travelAgencyId, vendedorId){
	vendedores = new Array();
	rubros = new Array();
	vendedoresXrubro = new Array();
	vendedoresXdestinoXrubro = new Array();
	//tmpVendedores = jsonrpc.JsonWebReserve.getBuyerAssociatedVendors(travelAgencyId, vendedorId).map;
	tmpVendedores = jsonrpc.JsonWebReserve.getVendorsForWebParam(getWebParamId()).map;
		
	for(var i in tmpVendedores){
		var vendor = tmpVendedores[i];
		var param = new Params(vendor.params.trasNoche, vendor.params.fechaFija, vendor.params.minNights, vendor.params.cutOff);
		var tipo = new TypeVendedor(vendor.tipoVendedor.id, I18N.get('typeVendedor.'+vendor.tipoVendedor.descripcion), new RubroVendedor(vendor.tipoVendedor.rubro.id, I18N.get('rubro.'+vendor.tipoVendedor.rubro.descripcion)));
		var vendedor = new Vendedor(vendor.id, vendor.name, vendor.destino, tipo, param);
		for(var mar in vendor.mercados.list){
			var mercado = vendor.mercados.list[mar];
			vendedor.addMercado(mercado.id, mercado.descripcion);
		}
		if(vendor.webMarket!=null){
			vendedor.webMarket = new Mercado(vendor.webMarket.id, vendor.webMarket.descripcion);
		}
		
		if(filtrarPorCantidadNoches()) {
			vendedor.setCantidadNoches(getCantNoches());
		}	
		vendedores[vendedor.id] = vendedor;
       	rubros[tipo.rubro.id]=tipo.rubro;
	}
	
	for(i in vendedores){
		try{
			vendedor = vendedores[i];
			if(vendedoresXrubro[vendedor.tipo.rubro.id]==null)
				vendedoresXrubro[vendedor.tipo.rubro.id]=new Array();
			vendedoresXrubro[vendedor.tipo.rubro.id][vendedor.id]= vendedor;
		}catch(e){
			alert(e);
		}
	}
	
	for(i in vendedores){
		try{
			vendedor = vendedores[i];
			if((vendedoresXdestinoXrubro[vendedor.destino]==null)||(vendedoresXdestinoXrubro[vendedor.destino]==undefined))
				vendedoresXdestinoXrubro[vendedor.destino]=new Array();
			if((vendedoresXdestinoXrubro[vendedor.destino][vendedor.tipo.rubro.id]==null)||(vendedoresXdestinoXrubro[vendedor.destino][vendedor.tipo.rubro.id]==undefined))
				vendedoresXdestinoXrubro[vendedor.destino][vendedor.tipo.rubro.id]=new Array();
			vendedoresXdestinoXrubro[vendedor.destino][vendedor.tipo.rubro.id][vendedor.id]= vendedor;
		}catch(e){
		}
	}
	
	cargarDestinos(document.getElementById("location"), getLocations(vendedores));
	
}

/**
 * Carga los destinos en el combo indicado
 * @param {HTMLSelect} comboDestinos
 * @param {Array} listaDestinos
 */
function cargarDestinos(comboDestinos, listaDestinos){
	clearCombo(comboDestinos);
	for(var i in listaDestinos){
		var destino = listaDestinos[i];
		var opt = addOption(comboDestinos);
		opt.text = destino;
		opt.value =destino;
	}
	sortComboBox(comboDestinos);
}

/**
 * Obtiene la lista de destinos correspondientes a los vendedores pasados como parámetro
 * @param vendedores
 * @return
 */
function getLocations(vendedores){
	var result = new Array();
	for(var i in vendedores){
		var vendedor = vendedores[i];
		//Si no está el destino
		if((result[vendedor.destino]==undefined)||(result[vendedor.destino]==null))
			result[vendedor.destino]=vendedor.destino;
	}
	
	return result;
}

/**
 * Carga los datos iniciales de un vendedor
 */
function initVendedor(idVendedor){
	var destino = '';
	try{
	var destino = vendedores[idVendedor].destino
	}catch(e){
		
	}
	cargarVendedores(document.getElementById('comboVendedores'), rubros, vendedoresXdestinoXrubro[destino], idVendedor);
	changeVendedor(vendedores, _RESELLER_ID);
	//updateAvailablesTypeRoomsTimeOut(_RESELLER_ID);
	
	document.getElementById("location").selectedIndex = findValue(document.getElementById("location"), _VENDEDOR.destino);
}

/**
 * Inicializa 
 * @param {Number} resellerId identificador del reseller
 * @param {Number} travelAgencyId Opcional, identificador del travelAgency, sino null
 * @param {Number} vendedorId identificador del vendedor
 * @param {Boolean} fixedVendor, indica si sólo se traerá el vendedor indicado desde el servidor
 */
function initWithoutLogin(resellerId, travelAgencyId, vendedorId, fixedVendor){
	_RESELLER_ID = resellerId;
	var vendToServer = null;
	
	if(fixedVendor) {
		vendToServer = vendedorId;
	}	
	
	retrieveVendedores(travelAgencyId, vendToServer);
	
	/*Existia un bug cuando se logueaba un TA y el vendedor seteado en el boton para sugerir la reserva no se encontraba en el PW parametrizado en el vinculo*/
	if(!fixedVendor){
		if(vendedores[vendedorId] == null || vendedores[vendedorId] == undefined){
			for(i in vendedores){
				vendedorId = vendedores[i].id;
				break;
			}
			
		}
	}
	initVendedor(vendedorId);
}

/**
 * Inicializa con un usuario
 * @param {Number} resellerId identificador del reseller
 * @param {Number} vendedorId identificador del vendedor
 * @param {Boolean} fixedVendor, indica si sólo se traerá el vendedor indicado desde el servidor
 */
function initWithLogin(resellerId, vendedorId, fixedVendor){
	var userName = document.getElementById("userName").value;
	var pass = document.getElementById("password").value;
	var userData = jsonrpc.JsonWebReserve.login(userName, pass);
	setWebParamId(jsonrpc.JsonWebReserve.getWebParamId());
	if(userData!=null){
		document.getElementById("personname").innerHTML = userData.firstName + " " + userData.lastName;
		document.getElementById("organizationname").innerHTML = userData.organizationName;
		document.getElementById("profile").innerHTML = I18N.get(userData.profileKey);
		document.getElementById("loginpanel").style.display = "none";
		document.getElementById("welcomepanel").style.display = "";
		initWithoutLogin(resellerId, userData.organizationId, vendedorId, fixedVendor);
		_TRAVEL_AGENCY_LOGUEADO = true;
		_TRAVEL_AGENCY_ID = jsonrpc.JsonWebReserve.getTravelAgency();
	}
	else{
		alert(I18N.get("global.invalidLogin"));
	}
}

/**
 * Finaliza la sesión con un usuario
 * @param {Number} resellerId identificador del reseller
 * @param {Number} vendedorId identificador del vendedor
 * @param {Boolean} fixedVendor, indica si sólo se traerá el vendedor indicado desde el servidor
 */
function logout(resellerId, vendedorId, fixedVendor){
	jsonrpc.JsonWebReserve.logout();
	document.getElementById("loginpanel").style.display = "";
	document.getElementById("welcomepanel").style.display = "none";
	document.getElementById("userName").value="";
	document.getElementById("password").value="";
	_TRAVEL_AGENCY_LOGUEADO = false;
	_TRAVEL_AGENCY_ID = "";
	setWebParamId(jsonrpc.JsonWebReserve.getWebParamId());
	initWithoutLogin(resellerId, 0, vendedorId, fixedVendor);
}