

// Funcion que crea un objeto para usar AJAX
//
//

function nuevoAjax(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

var xmlhttp=nuevoAjax();


// Funciones para tratar las peticiones de presupuestos, reservas y offline
//
//

function PedirListaOfertas(){

	if (SonFechasCorrectas() == false) {
		alert ("Bitte bestätigen Sie das Datum");
	} else if (EsFechaViable() == false) {
		alert ("Ab 20.00 Uhr können Sie nur noch Reservierungen für den nächsten Tag ab 10.00 Uhr realisieren.");
	} else if (EsFechaConMargen() == false) {
		alert ("Online bookings should be made with a minimum of two hours.");
	} else {

		OcultarForms();
		document.getElementById('reasonoffline').value = '';	
		document.getElementById("ListaOfertas").innerHTML='<table width="96%"><tr><td align="center"><fieldset><table width="99%"><tr><td align="center"><h2>In Arbeit</h2><br /><img src="../images/espera.gif"></td></tr></table></fieldset></td></tr></table>';
	
		// Paso del fuera de horas a [0-1]
		hora = document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value;
		if (hora  < 700) {
			fuera_de_horas = 1;
		} else {
			fuera_de_horas = 0;
		}
		
		cadena = "offerlist_xmlhttp.php?a=p&"+		// Action = Presupuestar
		"rand="+Math.random()+"&"+ // Número aleatorio para evitar cachés
		"agencycode="+GetUrlParameters('agencycode')+"&"+
		"lgr_rtr="	+document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].value+"&"+
		"lgr_ent="	+document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].value+"&"+
		"vhc="		+document.formPresupuesto.vhc.options[document.formPresupuesto.vhc.selectedIndex].value+"&"+
		"day_rtr="	+document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value+"&"+
		"msn_rtr="	+document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value+"&"+
		"hrm_rtr="	+document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value+"&"+
		"day_ent="	+document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value+"&"+
		"msn_ent="	+document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value+"&"+
		"hrm_ent="	+document.formPresupuesto.hrm_ent.options[document.formPresupuesto.hrm_ent.selectedIndex].value+"&"+
		"num_dias="	+CalculaNumeroDeDias()+"&"+
		"fdh="  	+fuera_de_horas;
		
//		document.getElementById("ListaOfertas").innerHTML = cadena;	

		xmlhttp.open("GET",	cadena, true);
		
		xmlhttp.onreadystatechange=xmlhttpstatechangeListaOfertas;
		xmlhttp.send(null)

	} // if

}


// Funciones que tratan el cambio de estado en un objeto AJAX
//
//


function xmlhttpstatechangeListaOfertas() {
	
	// Si la transrefencia se ha completado (4), y con estado OK (200)
	if (xmlhttp.readyState==4) {
		if (xmlhttp.status == 200) {
		
			// Se recoge el documento XML con la respuesta, ya sea 
			// satisfactoria, o con el mensaje de error correspondiente
			if (xmlhttp.responseXML != null) {
				var respuesta = xmlhttp.responseXML.documentElement;
				
				// Ahora se compone la tabla HTML, a partir del XML
				var tabla = ComponerTablaSinOfertas(respuesta);
				
				// Finalmente, se coloca todo lo anterior en el cuadro ajax
				document.getElementById("ListaOfertas").innerHTML = tabla;
			} else {
				// Se anota el motivo de la reserva offline
				document.getElementById('reasonoffline').value = "Server timeout";
				
				// Lo juntamos todo en una tabla
				var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio">';
				tabla = tabla + '<h2>In diesem Moment können wir leider ihre Reservierung nicht bestätigen, bitte senden Sie uns ihre Reservierung ausgefüllt zu.Wir werden sie schnellst möglichst kontaktieren.</h2>';
				tabla = tabla + '<INPUT TYPE="button" VALUE="Formular ausfüllen" onClick="JavaScript:CambiarVisibilidadFormularioReservaOffline();" class="booknow" !disabled></p></td></tr></table></fieldset></td></tr></table>';
				
				// Finalmente, se coloca todo lo anterior en el cuadro ajax
				document.getElementById("ListaOfertas").innerHTML = tabla;
			} // if xmlhttp.responseXML != null
			
		} else {
		} // if (xmlhttp.status == 200)
	} else {
	} // if (xmlhttp.readyState==4)

} // xmlhttpstatechange


// Función auxiliar para ordenar en función del precio
function sortByPrize(x, y) {
	return x[3] - y[3];
}


// Función que, dada una matriz de compañias y de grupos, la contrasta con la lista de
// competencias, dando como resultado una lista de ganadores
function ExtraerGanadores(companies) {
	ganadores = new Array();

	// Tenemos una lista de competidores. Cada elemento de la lista se corresponde con
	// un grupo de competencia, así que podrá contener tantos codigos como proveedores
	// hay en el sistema.
	
	// Si en un elemento concreto de la lista, tenemos al menos dos grupos en "companies",
	// entonces nos quedamos con el ganador, y lo añadimos a ganadores
	for (var i = 0; i < competidores.length; i++) {
		candidatos = new Array();
		for (var j = 0; j < competidores[i].length; j++) {


			for (var k = 0; k < companies.length; k++) {
				for (var l = 0; l < companies[k].length; l++) {

					// Se buscan todos los competidores, y luego, si hay al menos dos, s
					// ordenan por precio, y se code el primero
					if (competidores[i][j] == companies[k][l][0]) { // Es decir, si el elemento i,j de la lista
																	// de competencias es igual al codigo de grupo
						candidatos.push(companies[k][l]);
					}

				}
			} // Itera por cada vehículo en "companies"
			
			
		} // Itera por cada competidor

		candidatos.sort(sortByPrize);
		if (candidatos.length > 1) {
			ganadores.push(candidatos[0]);
		}
	
	} // Itera por cada competencia
	
	ganadores.sort(sortByPrize);
	return ganadores;
}


// Función que compone una tabla HTML a partir de un documento XML
function ComponerTabla(xmlDoc, vehicle_count) {

// El resultado de esta página va a ser una lista de ofertas de grupos. En cada oferta
// se colocará un boton "Book now", que lleva directamente al enlace offer.php
// Es necesario componer los parametros de esta llamada.
llamada = "offer.php?" +
"referer="+document.getElementById('referer').value+"&"+
"agencycode="+GetUrlParameters('agencycode')+"&"+
"lgr_rtr="	+document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].value+"&" +
"lgr_rtr_descr="	+document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].text+"&" +
"lgr_ent="	+document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].value+"&" +
"lgr_ent_descr="	+document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].text+"&" +
"day_rtr="	+document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value+"&" +
"msn_rtr="	+document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value+"&" +
"hrm_rtr="	+document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value+"&" +
"day_ent="	+document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value+"&" +
"msn_ent="	+document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value+"&" +
"hrm_ent="	+document.formPresupuesto.hrm_ent.options[document.formPresupuesto.hrm_ent.selectedIndex].value;

	
if (xmlDoc.getElementsByTagName("QueryStatus")[0].childNodes[0].nodeValue == 'Ok') {

	// En una primera pasada, se almacenan todos los grupos en una esructura
	// de matriz por compañias y grupos
	companies = new Array();
	vehicle_count = 0;
	
	var x = xmlDoc.getElementsByTagName("Company");

	for (var i = 0; i < x.length; i++) {

		prov = x[i].getElementsByTagName("CompanyName")[0].childNodes[0].nodeValue;
		vehic = new Array();

		var x2 = x[i].getElementsByTagName("Group");
		
		for (var i2 = 0; i2 < x2.length; i2++) {
			one_vehicle = new Array();
			one_vehicle[0] = x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue;

			one_vehicle[1] = x2[i2].getElementsByTagName("GroupName")[0].childNodes[0].nodeValue;

			one_vehicle[2] = x2[i2].getElementsByTagName("GroupDetails")[0].childNodes[0].nodeValue;

			one_vehicle[3] = x2[i2].getElementsByTagName("GroupPrice")[0].childNodes[0].nodeValue;
			
			// Extras
			var x3 = x2[i2].getElementsByTagName("Extra");
			var extras = "";
			for (var i3 = 0; i3 < x3.length; i3++) {
				var extracode =  x3[i3].getElementsByTagName("ExtraCode")[0].childNodes[0].nodeValue;
				var extraname =  x3[i3].getElementsByTagName("ExtraName")[0].childNodes[0].nodeValue;
				var extramax =  x3[i3].getElementsByTagName("ExtraMaxItems")[0].childNodes[0].nodeValue;
				// ExtraDetails puede venir vacio
				var element = x3[i3].getElementsByTagName("ExtraDetails")[0];
				if (element.hasChildNodes()) {
					var extradetails =  element.childNodes[0].nodeValue;
				} else {
					var extradetails = "";
				}
				
				extras = extras + "&extra" + i3 + "code=" + extracode;
				extras = extras + "&extra" + i3 + "name=" + extraname + " " + extradetails;
				extras = extras + "&extra" + i3 + "max=" + extramax;
			}
			// Guardo en la informacion del vehiculo, la cadena ya formada para los extras, en caso
			// de que este vehic. prospere, será de utilidad
			one_vehicle[4] = extras;

			one_vehicle[5] = prov;
			
			vehic[i2] = one_vehicle;
			vehicle_count++;
			
		} // for group
		
		companies[i] = vehic;
		
	} // for company
			
	// Ahora se extraen de la tabla solamente los grupos que estén en la lista de
	// competencias (tengan competencia con otro), de cada competencia sólo el ganador
	vehicles = ExtraerGanadores(companies);
	
	vehicles.sort(sortByPrize);

/*
document.write("<br /><br />");
for (i = 0; i < companies.length; i++) {
	for (j = 0; j < companies[i].length; j++) {
		document.write(companies[i][j] + "<br />");
	}
}
*/

	if (vehicle_count == 0) { // No hay ningún resultado

		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio"><h2>';
		tabla = tabla + 'Suche ohne ergebniss, bitte versuchen Sie es nochmal.';
		tabla = tabla + '</h2></p></td></tr></table></fieldset></td></tr></table>';

	} else if (vehicles.length == 0) { // No hay ofertas de Élite
		
		var tabla = '';

	} else {

		// Se compone la tabla con todos los vehiculos existentes en el XML
		var tabla = '<table>';
		
		tabla = tabla + '<table width="96%"><tr><td><fieldset><table width="99%">';
		tabla = tabla + "<tr>";
		tabla = tabla + '<td align="left" class="ofertas_reserva"><img src="../images/prov/0.jpg"></td>' +
		'<td align="center"><strong>BESTE PREISE</strong>';
		tabla = tabla + "</td>";
		tabla = tabla + "</tr>";
	
		for (i = 0; i < vehicles.length; i++) {
			tabla = tabla + "<tr>";
			
			tabla = tabla + '<td align="center" width="113"><span class="ofertas_reserva"><img src="../images/coches/';
			tabla = tabla + vehicles[i][0];
			tabla = tabla + '.jpg"></span></td>';
			tabla = tabla + '<td width="149" align="center"><p>';
			tabla = tabla + vehicles[i][1];
			tabla = tabla + '</br><img src="../images/extras/';
			tabla = tabla + vehicles[i][2];
			tabla = tabla + '.jpg"></p></td>';
	
			tabla = tabla + '<td width="136" align="center" class="ofertas_reserva1">';
			tabla = tabla + vehicles[i][3].substring(0, vehicles[i][3].length - 2) + ',' +
							vehicles[i][3].substring(vehicles[i][3].length - 2) + ' Euros' +
	        '<div><button type="button" onclick="document.location.href=\'' + llamada + '&vhc=' + vehicles[i][0] + '&prov=' + vehicles[i][5] + vehicles[i][4] + '\'">Preisangabe</button></div>';
			tabla = tabla + "</td>";
			tabla = tabla + "</tr>";
		}
	
		tabla = tabla + "</table></fieldset></td></tr></table>";
	} // si hay vehiculos en el resultado y ofertas
	
	
	
	// Y en una segunda pasada, se cogen todos los vehiculos de los provedores
	var x = xmlDoc.getElementsByTagName("Company");
	
		for (var i = 0; i < x.length; i++) {
		tabla = tabla + '</br><table width="96%"><tr><td><fieldset><table width="99%">';
		tabla = tabla + "<tr>";
		tabla = tabla + '<td colspan="2" align="left"><img src="../images/prov/';
		tabla = tabla + x[i].getElementsByTagName("CompanyCode")[0].childNodes[0].nodeValue;
		tabla = tabla + '.jpg">';
		//	tabla = tabla + '<table width="98%" border="1" cellspacing="0" cellpadding="0">';
			prov = x[i].getElementsByTagName("CompanyName")[0].childNodes[0].nodeValue;

			var x2 = x[i].getElementsByTagName("Group");
			
			for (var i2 = 0; i2 < x2.length; i2++) {
				tabla = tabla + "<tr>";
				
				tabla = tabla + '<td align="center" width="113"><span class="ofertas_reserva"><img src="../images/coches/';
				tabla = tabla + x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue;
				tabla = tabla + '.jpg"></span></td>';
				tabla = tabla + '<td width="149" align="center"><p>';
				tabla = tabla + x2[i2].getElementsByTagName("GroupName")[0].childNodes[0].nodeValue;
				tabla = tabla + '</br><img src="../images/extras/';
				tabla = tabla + x2[i2].getElementsByTagName("GroupDetails")[0].childNodes[0].nodeValue;
				tabla = tabla + '.jpg"></p></td>';

				// Extras
				var x3 = x2[i2].getElementsByTagName("Extra");
				var extras = "";
				for (var i3 = 0; i3 < x3.length; i3++) {
					var extracode =  x3[i3].getElementsByTagName("ExtraCode")[0].childNodes[0].nodeValue;
					var extraname =  x3[i3].getElementsByTagName("ExtraName")[0].childNodes[0].nodeValue;
					var extramax =  x3[i3].getElementsByTagName("ExtraMaxItems")[0].childNodes[0].nodeValue;
					// ExtraDetails puede venir vacio
					var element = x3[i3].getElementsByTagName("ExtraDetails")[0];
					if (element.hasChildNodes()) {
						var extradetails =  element.childNodes[0].nodeValue;
					} else {
						var extradetails = "";
					}
					
					extras = extras + "&extra" + i3 + "code=" + extracode;
					extras = extras + "&extra" + i3 + "name=" + extraname + " " + extradetails;
					extras = extras + "&extra" + i3 + "max=" + extramax;
				}

				               
   				tabla = tabla + '<td width="136" align="center"><strong>';
   				precio = x2[i2].getElementsByTagName("GroupPrice")[0].childNodes[0].nodeValue;
				tabla = tabla + precio.substring(0, precio.length - 2) + ',' +
								precio.substring(precio.length - 2) + ' Euros' +
                '</strong><div><button type="button" onclick="document.location.href=\'' + llamada + '&vhc=' + x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue + '&prov=' + prov + extras + '\'">Preisangabe</button></div>';
				tabla = tabla + "</td>";
				tabla = tabla + "</tr>";
			}
						

		tabla = tabla + "</table>";

		tabla = tabla + "</td>";
		tabla = tabla + "</tr>";
		tabla = tabla + "</fieldset></td></tr></table>";
	}

	tabla = tabla + "</table>";

} else if (xmlDoc.getElementsByTagName("QueryStatus")[0].childNodes[0].nodeValue == 'Error') {
		
	errorcode = xmlDoc.getElementsByTagName("ErrorCode")[0].childNodes[0].nodeValue;
	if (	(errorcode == "ERR-01") ||
			(errorcode == "ERR-02") ||
			(errorcode == "ERR-03") ||
			(errorcode == "ERR-04") ||
			(errorcode == "ERR-05") ||
			(errorcode == "ERR-07")		) {

		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio"><h2>';
		tabla = tabla + xmlDoc.getElementsByTagName("ErrorForEliteCustomer")[0].childNodes[0].nodeValue;
		tabla = tabla + '</h2></p></td></tr></table></fieldset></td></tr></table>';

	} else {
		
		// Se anota el motivo de la reserva offline
		document.getElementById('reasonoffline').value = xmlDoc.getElementsByTagName("ErrorCode")[0].childNodes[0].nodeValue +
												' -> ' + xmlDoc.getElementsByTagName("ErrorDescription")[0].childNodes[0].nodeValue;
		
		// Lo juntamos todo en una tabla
		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio">';
		tabla = tabla + '<h2>In diesem Moment können wir leider ihre Reservierung nicht bestätigen, bitte senden Sie uns ihre Reservierung ausgefüllt zu.Wir werden sie schnellst möglichst kontaktieren.</h2>';
		tabla = tabla + '<INPUT TYPE="button" VALUE="Formular ausfüllen" onClick="JavaScript:CambiarVisibilidadFormularioReservaOffline();" class="booknow" !disabled></p></td></tr></table></fieldset></td></tr></table>';
	}
	
}

	return tabla;
	
}


// Función que, dada una matriz de compañias y de grupos, devuelve todos
// los vehículos en una sola lista
function ExtraerTodos(companies) {
	lista = new Array();

	for (var k = 0; k < companies.length; k++) {
		for (var l = 0; l < companies[k].length; l++) {

			lista.push(companies[k][l]);
			
		}
	} // Itera por cada vehículo en "companies"

	return lista;
}


// Función que compone una tabla HTML a partir de un documento XML
// Versión de Mayo de 2009, que no presenta apartado de "OFERTAS", y
// que coloca los vehículos de todos los proveedores ordenados por precio
function ComponerTablaSinOfertas(xmlDoc) {

// El resultado de esta página va a ser una lista de ofertas de grupos. En cada oferta
// se colocará un boton "Book now", que lleva directamente al enlace offer.php
// Es necesario componer los parametros de esta llamada.
llamada = "offer.php?" +
"referer="+document.getElementById('referer').value+"&"+
"agencycode="+GetUrlParameters('agencycode')+"&"+
"lgr_rtr="	+document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].value+"&" +
"lgr_rtr_descr="	+document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].text+"&" +
"lgr_ent="	+document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].value+"&" +
"lgr_ent_descr="	+document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].text+"&" +
"day_rtr="	+document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value+"&" +
"msn_rtr="	+document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value+"&" +
"hrm_rtr="	+document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value+"&" +
"day_ent="	+document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value+"&" +
"msn_ent="	+document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value+"&" +
"hrm_ent="	+document.formPresupuesto.hrm_ent.options[document.formPresupuesto.hrm_ent.selectedIndex].value;

	
if (xmlDoc.getElementsByTagName("QueryStatus")[0].childNodes[0].nodeValue == 'Ok') {

	// En una primera pasada, se almacenan todos los grupos en una esructura
	// de matriz por compañias y grupos
	companies = new Array();
	vehicle_count = 0;
	
	var x = xmlDoc.getElementsByTagName("Company");

	for (var i = 0; i < x.length; i++) {

		prov = x[i].getElementsByTagName("CompanyName")[0].childNodes[0].nodeValue;
		vehic = new Array();

		var x2 = x[i].getElementsByTagName("Group");
		
		for (var i2 = 0; i2 < x2.length; i2++) {
			one_vehicle = new Array();
			one_vehicle[0] = x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue;

			one_vehicle[1] = x2[i2].getElementsByTagName("GroupName")[0].childNodes[0].nodeValue;

			one_vehicle[2] = x2[i2].getElementsByTagName("GroupDetails")[0].childNodes[0].nodeValue;

			one_vehicle[3] = x2[i2].getElementsByTagName("GroupPrice")[0].childNodes[0].nodeValue;
			
			// Extras
			var x3 = x2[i2].getElementsByTagName("Extra");
			var extras = "";
			for (var i3 = 0; i3 < x3.length; i3++) {
				var extracode =  x3[i3].getElementsByTagName("ExtraCode")[0].childNodes[0].nodeValue;
				var extraname =  x3[i3].getElementsByTagName("ExtraName")[0].childNodes[0].nodeValue;
				var extramax =  x3[i3].getElementsByTagName("ExtraMaxItems")[0].childNodes[0].nodeValue;
				// ExtraDetails puede venir vacio
				var element = x3[i3].getElementsByTagName("ExtraDetails")[0];
				if (element.hasChildNodes()) {
					var extradetails =  element.childNodes[0].nodeValue;
				} else {
					var extradetails = "";
				}
				
				extras = extras + "&extra" + i3 + "code=" + extracode;
				extras = extras + "&extra" + i3 + "name=" + extraname + " " + extradetails;
				extras = extras + "&extra" + i3 + "max=" + extramax;
			}
			// Guardo en la informacion del vehiculo, la cadena ya formada para los extras, en caso
			// de que este vehic. prospere, será de utilidad
			one_vehicle[4] = extras;

			one_vehicle[5] = prov;
			
			vehic[i2] = one_vehicle;
			vehicle_count++;
			
		} // for group
		
		companies[i] = vehic;
		
	} // for company
			
	// Ahora se extraen de la tabla solamente los grupos que estén en la lista de
	// competencias (tengan competencia con otro), de cada competencia sólo el ganador
//	vehicles = ExtraerGanadores(companies);

	// Funcion que extrae todos los vehículos colocados por compañias, y los devuelve en
	// una sola lista de vehículos
	vehicles = ExtraerTodos(companies);
	
	vehicles.sort(sortByPrize);


	if (vehicle_count == 0) { // No hay ningún resultado

		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio"><h2>';
		tabla = tabla + 'Suche ohne ergebniss, bitte versuchen Sie es nochmal.';
		tabla = tabla + '</h2></p></td></tr></table></fieldset></td></tr></table>';

	} else if (vehicles.length == 0) { // No hay ofertas de Élite
		
		var tabla = '';

	} else {

		// Se compone la tabla con todos los vehiculos existentes en el XML
		var tabla = '<table>';
		
		tabla = tabla + '<table width="96%"><tr><td><fieldset><table width="99%">';
		tabla = tabla + "<tr>";
		tabla = tabla + '<td align="left" class="ofertas_reserva"><img src="../images/prov/0.jpg"></td>' +
		'<td align="center"><strong>Beste Preise</strong>';
		tabla = tabla + "</td>";
		tabla = tabla + "</tr>";
	
		for (i = 0; i < vehicles.length; i++) {
			tabla = tabla + "<tr>";
			
			tabla = tabla + '<td align="center" width="113"><span class="ofertas_reserva"><img src="../images/coches/';
			tabla = tabla + vehicles[i][0];
			tabla = tabla + '.jpg"></span></td>';
			tabla = tabla + '<td width="149" align="center"><p>';
			tabla = tabla + vehicles[i][1];
			tabla = tabla + '</br><img src="../images/extras/';
			tabla = tabla + vehicles[i][2];
			tabla = tabla + '.jpg"></p></td>';
	
			tabla = tabla + '<td width="136" align="center" class="ofertas_reserva1">';
			tabla = tabla + vehicles[i][3].substring(0, vehicles[i][3].length - 2) + ',' +
							vehicles[i][3].substring(vehicles[i][3].length - 2) + ' Euros' +
	        '<div><button type="button" onclick="document.location.href=\'' + llamada + '&vhc=' + vehicles[i][0] + '&prov=' + vehicles[i][5] + vehicles[i][4] + '\'">Preisangabe</button></div>';
			tabla = tabla + "</td>";
			tabla = tabla + "</tr>";
		}
	
		tabla = tabla + "</table></fieldset></td></tr></table>";
	} // si hay vehiculos en el resultado y ofertas
	

	// Y en una segunda pasada, se cogen todos los vehiculos de los provedores
	var x = xmlDoc.getElementsByTagName("Company");
	
		for (var i = 0; i < x.length; i++) {
		tabla = tabla + '</br><table width="96%"><tr><td><fieldset><table width="99%">';
		tabla = tabla + "<tr>";
		tabla = tabla + '<td colspan="2" align="left"><img src="../images/prov/';
		tabla = tabla + x[i].getElementsByTagName("CompanyCode")[0].childNodes[0].nodeValue;
		tabla = tabla + '.jpg">';
		//	tabla = tabla + '<table width="98%" border="1" cellspacing="0" cellpadding="0">';
			prov = x[i].getElementsByTagName("CompanyName")[0].childNodes[0].nodeValue;

			var x2 = x[i].getElementsByTagName("Group");
			
			for (var i2 = 0; i2 < x2.length; i2++) {
				tabla = tabla + "<tr>";
				
				tabla = tabla + '<td align="center" width="113"><span class="ofertas_reserva"><img src="../images/coches/';
				tabla = tabla + x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue;
				tabla = tabla + '.jpg"></span></td>';
				tabla = tabla + '<td width="149" align="center"><p>';
				tabla = tabla + x2[i2].getElementsByTagName("GroupName")[0].childNodes[0].nodeValue;
				tabla = tabla + '</br><img src="../images/extras/';
				tabla = tabla + x2[i2].getElementsByTagName("GroupDetails")[0].childNodes[0].nodeValue;
				tabla = tabla + '.jpg"></p></td>';

				// Extras
				var x3 = x2[i2].getElementsByTagName("Extra");
				var extras = "";
				for (var i3 = 0; i3 < x3.length; i3++) {
					var extracode =  x3[i3].getElementsByTagName("ExtraCode")[0].childNodes[0].nodeValue;
					var extraname =  x3[i3].getElementsByTagName("ExtraName")[0].childNodes[0].nodeValue;
					var extramax =  x3[i3].getElementsByTagName("ExtraMaxItems")[0].childNodes[0].nodeValue;
					// ExtraDetails puede venir vacio
					var element = x3[i3].getElementsByTagName("ExtraDetails")[0];
					if (element.hasChildNodes()) {
						var extradetails =  element.childNodes[0].nodeValue;
					} else {
						var extradetails = "";
					}
					
					extras = extras + "&extra" + i3 + "code=" + extracode;
					extras = extras + "&extra" + i3 + "name=" + extraname + " " + extradetails;
					extras = extras + "&extra" + i3 + "max=" + extramax;
				}

				               
   				tabla = tabla + '<td width="136" align="center"><strong>';
   				precio = x2[i2].getElementsByTagName("GroupPrice")[0].childNodes[0].nodeValue;
				tabla = tabla + precio.substring(0, precio.length - 2) + ',' +
								precio.substring(precio.length - 2) + ' Euros' +
                '</strong><div><button type="button" onclick="document.location.href=\'' + llamada + '&vhc=' + x2[i2].getElementsByTagName("GroupCode")[0].childNodes[0].nodeValue + '&prov=' + prov + extras + '\'">Preisangabe</button></div>';
				tabla = tabla + "</td>";
				tabla = tabla + "</tr>";
			}
						

		tabla = tabla + "</table>";

		tabla = tabla + "</td>";
		tabla = tabla + "</tr>";
		tabla = tabla + "</fieldset></td></tr></table>";
	}

	tabla = tabla + "</table>";


} else if (xmlDoc.getElementsByTagName("QueryStatus")[0].childNodes[0].nodeValue == 'Error') {
		
	errorcode = xmlDoc.getElementsByTagName("ErrorCode")[0].childNodes[0].nodeValue;
	if (	(errorcode == "ERR-01") ||
			(errorcode == "ERR-02") ||
			(errorcode == "ERR-03") ||
			(errorcode == "ERR-04") ||
			(errorcode == "ERR-05") ||
			(errorcode == "ERR-07")		) {

		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio"><h2>';
		tabla = tabla + xmlDoc.getElementsByTagName("ErrorForEliteCustomer")[0].childNodes[0].nodeValue;
		tabla = tabla + '</h2></p></td></tr></table></fieldset></td></tr></table>';

	} else {
		
		// Se anota el motivo de la reserva offline
		document.getElementById('reasonoffline').value = xmlDoc.getElementsByTagName("ErrorCode")[0].childNodes[0].nodeValue +
												' -> ' + xmlDoc.getElementsByTagName("ErrorDescription")[0].childNodes[0].nodeValue;
		
		// Lo juntamos todo en una tabla
		var tabla = '<table width="96%"><tr><td><fieldset><table width="99%" border="0" cellspacing="0" cellpadding="0"><tr><td align="center"><p class="precio">';
			tabla = tabla + '<h2>In diesem Moment können wir leider ihre Reservierung nicht bestätigen, bitte senden Sie uns ihre Reservierung ausgefüllt zu.Wir werden sie schnellst möglichst kontaktieren.</h2></p></td>';
			tabla = tabla + '<td><div><button type="button" onClick="JavaScript:CambiarVisibilidadFormularioReservaOffline();">Fill the form</button></div></p></td></tr></table></fieldset></td></tr></table>';
	}
	
}

	return tabla;
	
}


function ConfirmarReservaOffline(){

	if ((document.formPresupuesto.nombreoffline.value.length < 8) 	||
		(document.formPresupuesto.moviloffline.value == '')  		||
		(document.formPresupuesto.emailoffline.value == '')  		||
		(document.formPresupuesto.vuelooffline.value == '')			){

		alert ("Alle Felder mit einem * sind auszufüllen (Name muss mindestens acht oder mehr Satzzeichen haben)");
		
	} else {
	
		OcultarForms();
		document.getElementById("ListaOfertas").innerHTML='<table width="96%"><tr><td align="center"><fieldset><h2>Daten senden </h2><br /><img src="../images/espera.gif"></fieldset></td></tr></table>';

		cadena = "offlinemail.php?a=cat&"+		// Action = Offline
		"agencycode="	+	GetUrlParameters('agencycode')+"&"+
		"lgr_rtr="		+	document.formPresupuesto.lgr_rtr.options[document.formPresupuesto.lgr_rtr.selectedIndex].text+"&" +
		"lgr_ent="		+	document.formPresupuesto.lgr_ent.options[document.formPresupuesto.lgr_ent.selectedIndex].text+"&" +
		"vhc="			+	document.formPresupuesto.vhc.options[document.formPresupuesto.vhc.selectedIndex].text+"&"+
		"day_rtr="		+	document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value+"&"+
		"msn_rtr="		+	document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value+"&"+
		"hrm_rtr="		+	document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value+"&"+
		"day_ent="		+	document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value+"&"+
		"msn_ent="		+	document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value+"&"+
		"hrm_ent="		+	document.formPresupuesto.hrm_ent.options[document.formPresupuesto.hrm_ent.selectedIndex].value+"&"+
		"reasonoffline="+	document.formPresupuesto.reasonoffline.value+"&"+
		"nombre=" 		+	document.formPresupuesto.nombreoffline.value+"&"+
		"movil="  		+	document.formPresupuesto.moviloffline.value+"&"+
		"email="   		+	document.formPresupuesto.emailoffline.value+"&"+
		"vuelo="		+	document.formPresupuesto.vuelooffline.value+"&"+
		"comentarios="	+	document.getElementById("comentariosoffline").value;

		document.location.href = cadena; // Carga una nueva página, usando "cadena" como url

	}  // if
}


function OcultarForms() {

	document.getElementById('Reservaoffline').style.display = 'none';

}

function CambiarVisibilidadFormularioReservaOffline(){

	// Se oculta "reserva" y se muestra "offline"
	if (	document.getElementById('Reservaoffline').style.display == 'none') {
		document.getElementById('Reservaoffline').style.display = 'block';
	} else {
		document.getElementById('Reservaoffline').style.display = 'none';
	}
		
}


// Funciones para el tratamiento de fechas
//
//


// Funcion que devuelte "true" si ls reserva que se intenta realizar es realmente viable
// en tiempo,es decir, si ls hora actual está entre las 20:00 y las 9:00, sólo se puede
// reservar como muy pronto para el día siguiente a las 10:00.
// Si la hora actual está entre las 9:00 y las 20:00, se puede reservar sin restricción
// por este motivo.
function EsFechaViable() {

	hora_rtr = document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value;
	day_rtr = document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value;
	msn_rtr = document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value;

	// Separamos los valores de las fechas
	anno_ini = Math.floor(msn_rtr / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_ini  = (msn_rtr % 12) + 1;
	dia_ini  = parseInt(day_rtr);


	var d = new Date();
	var hora = d.getHours();
	
	if (  (hora >=20) || (hora < 9)  ) { // Desde las 20:00 hasta las 8:59 del día sig.
		// Solo permitir la reserva, si la fecha de recogida es para el día siguiente a
		// la fecha actual del ordenador del cliente

		var fecha_ret = new Date();
		if (  (hora >=20) && (hora <= 23)  ) { // Solo se suma un día si la hora es anterior a las 0:00
			fecha_ret.setDate(d.getDate() + 1);
		}
/*
			alert(	anno_ini + " < " + fecha_ret.getFullYear() + " - " +
					anno_ini + "==" + fecha_ret.getFullYear() + " && " + mes_ini + "<" + (fecha_ret.getMonth()+1) + " - " +
					mes_ini + "==" + (fecha_ret.getMonth()+1) + " && " + dia_ini + "<" + fecha_ret.getDate() + " - " +
					dia_ini + "==" + fecha_ret.getDate() + " && " + hora_rtr + "<" + 1000);
*/
		// La fecha de retirada ha de ser igual o porterior a la ya almacenada en fecha_ret
		if (	(anno_ini < fecha_ret.getFullYear()) ||
				(  (anno_ini == fecha_ret.getFullYear())  && (mes_ini < (fecha_ret.getMonth())+1)  ) ||
				(  (mes_ini  == (fecha_ret.getMonth())+1) && (dia_ini < fecha_ret.getDate())       ) ||
				(  (dia_ini  == fecha_ret.getDate())      && (hora_rtr < 1000			       )   )	) {
				
					
			return false;
		} else {
			return true;
		}
		
	} else {
		return true;
	}
}


// Comprueba si la reserva se hace con 2 horas de antelacion. Presupone que se ha hecho una llamada
// previa a "EsFechaViable", con resultado "true", por lo que se tiene 9 < hora < 20
function EsFechaConMargen() {

	hora_rtr = document.formPresupuesto.hrm_rtr.options[document.formPresupuesto.hrm_rtr.selectedIndex].value;
	day_rtr = document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value;
	msn_rtr = document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value;

	// Separamos los valores de las fechas
	anno_ini = Math.floor(msn_rtr / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_ini  = (msn_rtr % 12) + 1;
	dia_ini  = parseInt(day_rtr);


	var d = new Date();
	var hora = d.getHours();

	hora = (hora+2)*100;

	if (	(anno_ini == d.getFullYear()) &&
			(mes_ini  == (d.getMonth()+1)) &&
			(dia_ini  == d.getDate()) &&
			(hora_rtr < hora)	) {
		return false;
	} else {
		return true;
	} // if
}


// Funcion que vevuelve "true" si el día es correcto dentro del mes y del año,
// tanto en la recogida como en la entrega
function SonFechasCorrectas() {

	day_rtr = document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value;
	msn_rtr = document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value;
	day_ent = document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value;
	msn_ent = document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value;

	// Separamos los valores de las fechas
	anno_ini = Math.floor(msn_rtr / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_ini  = (msn_rtr % 12) + 1;
	dia_ini  = parseInt(day_rtr);
	
	anno_fin = Math.floor(msn_ent / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_fin  = (msn_ent % 12) + 1;
	dia_fin  = parseInt(day_ent);

	if (	(dia_ini > DiasQueTieneUnMes(mes_ini, anno_ini)) ||
			(dia_fin > DiasQueTieneUnMes(mes_fin, anno_fin))	) {
//		alert(dia_ini + " " + mes_ini + " " + anno_ini);
//		alert(dia_fin + " " + mes_fin + " " + anno_fin);
		return false;
	} else {
		return true;
	}
	
}


// Función que devuelve el número de dias que hay entre la fecha de recogida
// y la fecha de entrega
function CalculaNumeroDeDias() {

	day_rtr = document.formPresupuesto.day_rtr.options[document.formPresupuesto.day_rtr.selectedIndex].value;
	msn_rtr = document.formPresupuesto.msn_rtr.options[document.formPresupuesto.msn_rtr.selectedIndex].value;
	day_ent = document.formPresupuesto.day_ent.options[document.formPresupuesto.day_ent.selectedIndex].value;
	msn_ent = document.formPresupuesto.msn_ent.options[document.formPresupuesto.msn_ent.selectedIndex].value;

	// Separamos los valores de las fechas
	anno_ini = Math.floor(msn_rtr / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_ini  = (msn_rtr % 12) + 1;
	dia_ini  = parseInt(day_rtr);
	
	anno_fin = Math.floor(msn_ent / 12); // Porque msn = (año * 12) + (mes - 1)
	mes_fin  = (msn_ent % 12) + 1;
	dia_fin  = parseInt(day_ent);
	
	if (dia_ini > DiasQueTieneUnMes(mes_ini, anno_ini) ||	// El dia de inicio no es válido para el mes y año
		dia_fin > DiasQueTieneUnMes(mes_fin, anno_fin) ||	// El dia de fin no es válido para el mes y año
		anno_ini > anno_fin ||								// El año de inicio es mayor que el de fin
		((anno_ini == anno_fin) && (mes_ini > mes_fin)) ||		// O es igual y sí lo es el mes
		((anno_ini == anno_fin) && (mes_ini == mes_fin) && (dia_ini > dia_fin)) ) { // O es igual y sí lo es el día
	    
	    //alert (dia_ini + ' ' + mes_ini + ' ' + anno_ini + ' - ' + dia_fin + ' ' + mes_fin + ' ' + anno_fin +
		//		((anno_ini == anno_fin) && (mes_ini == mes_fin) && (dia_ini > dia_fin)));
		return 0;
	} else {
	
		if (anno_ini == anno_fin) {
			dias_hasta_ini = CuentaDias(anno_ini, mes_ini, dia_ini);
			dias_hasta_fin = CuentaDias(anno_fin, mes_fin, dia_fin);

			//alert(CuentaDias(anno_ini, mes_ini, dia_ini) + ' - ' + CuentaDias(anno_fin, mes_fin, dia_fin));

			return dias_hasta_fin - dias_hasta_ini;
		} else {
			dias_ini_rest = 0;
			dias_annos = 0;
			dias_hasta_fin = 0;

			if (EsBisiesto(anno_ini)) {
				dias_ini_rest = 366 - CuentaDias(anno_ini, mes_ini, dia_ini);
			} else {
				dias_ini_rest = 365 - CuentaDias(anno_ini, mes_ini, dia_ini);
			}
		
			for (i = anno_ini+1; i < anno_fin; i++) {
				dias_annos += 365;
				if (EsBisiesto(i)) dias_annos++;
			}
		
			dias_hasta_fin = CuentaDias(anno_fin, mes_fin, dia_fin);
		
			return dias_ini_rest + dias_annos + dias_hasta_fin;
		} // if anno_ini == anno_fin
		
	} // if 

} // CalculaNumeroDeDias


// Cuenta los días que pasan desde el 1 de enero de "anno", hasta el "dia" de "mes"
function CuentaDias(anno, mes, dia) {
	total = 0;
	for (i = 1; i < mes; i++) {
		total += DiasQueTieneUnMes(i, anno);
	}
	total += dia;

	return total;
}

function EsBisiesto(anno) {
	return ((anno % 4 == 0) && ((anno % 100 != 0) || (anno % 400 == 0)))
}

function DiasQueTieneUnMes(mes,anno) { // 1: Enero
	var dms=new Array(31,28,31,30,31,30,31,31,30,31,30,31)
	dm=dms[mes-1];
	if (EsBisiesto(anno) && (mes == 2)) // Si es febrero
	dm++;
	return dm;
}


function GetUrlParameters( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

