	/*Funcion para transformar a ñ, usada en el autocompletar de aereo*/
	String.prototype.getIsoValue = function()
	{
	   return this.replace('&ntilde;', 'ñ');
	}

	/* GOOGLE MAPS */
var cont = '<html><body><h4>Hoteles</h4>Ofertas</body></html>';
function addMarker(response) {
   if (!response) {

   } else {
	  var icon = new GIcon(G_DEFAULT_ICON);
	  icon.image = "images/hotelcosta_google.png";
	  var tamanoIcon = new GSize(29, 35);
	  icon.iconSize = tamanoIcon;
	  icon.shadow = "images/hotelcosta_google_sombra.png";
	  var tamanoSombra = new GSize(29, 35);
	  icon.shadowSize = tamanoSombra;

	  var point;
	  if (!response.Status) {

		 var point = new GLatLng(response.y, response.x);
		 var marker = new GMarker(point, icon);
		 if (message)
			map.addOverlay(createMarker(point, message[point.y + '*' + point.x]));
	  } else {
		 /* Codigo 200: sitio encontrado */
		 if (response.Status.code == "200") {
			var place = response.Placemark[0];
			point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
			map.addOverlay(createMarker(point, response.name));
		 }
	  }
   }
}


function createMarker(point, number) {
   var icon = new GIcon(G_DEFAULT_ICON);
   icon.image = "images/hotelcosta_google.png";
   var tamanoIcon = new GSize(29, 35);
   icon.iconSize = tamanoIcon;
   icon.shadow = "images/hotelcosta_google_sombra.png";
   var tamanoSombra = new GSize(29, 35);
   icon.shadowSize = tamanoSombra;
   var marker = new GMarker(point, icon);
   marker.value = number;

   /* si hacemos doble click ejecuta la accion correspondiente del arbol */
   GEvent.addListener(marker, "dblclick", function() {
	  tree.onItemSelect(ids[number]);
   });

   /* si hacemos un click mostramos informacion */
   GEvent.addListener(marker, "click", function() {
	  var myHtml = number;
	  map.openInfoWindowHtml(point, myHtml);
   });

   return marker;
}

/*
* Names es un string de los nombres de los lugares separados por una parrilla, el primer nombre pertenece al nivel superior( provincia o pais)
* zoom es el nivel de zoom (normalmente 8 o9)
* enfocar es un booleano, si es verdadero, enfocara al lugar especifico, si no, enfocara al elemento del nivel superior
*/
function setPoints(names, zoom, single, objJsonCostas) {
   var arr_points = new Array();
   var sel_pais = document.getElementById('select_pais');
   var pais = sel_pais.options[sel_pais.selectedIndex].innerHTML;
   if (geocoder) {
	  if (single) {
		 if (!objJsonCostas.coord[names]) {
			address = objJsonCostas.nombres[names] + ', ' + pais;
			geocoder.getLocations(
				  address,
				  function(response) {
					 if (!response) {

					 } else {
						map.setCenter(new GLatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]), zoom);
						if (single) {
						   addMarker(response);
						}
						/*marker.openInfoWindowHtml(address);*/
					 }
				  }
				  );
		 } else {
			var coords = objJsonCostas.coord[names];
			var gpoint = new GLatLng(coords.lat, coords.long)
			addMarker(gpoint);
		 }
	  } else {
		 for (var i = 0; i < names.length; i++) {
			if (!objJsonCostas.coord[names[i]]) {
			   address = objJsonCostas.nombres[names[i]];
			   geocoder.getLocations(
					 address,
					 addMarker
					 );
			} else {
			   var coords = objJsonCostas.coord[names[i]];
			   var gpoint = new GLatLng(parseFloat(coords.lat), parseFloat(coords.long))
			   addMarker(gpoint);
			}
		 }
	  }
   }
}

function center(name, zoom, objJsonCostas) {
   if (geocoder) {
	  if (!objJsonCostas.coord[name]) {
		 address = objJsonCostas.nombres[name];
		 if (name != objJsonCostas.codloc) {
			address += ' ';
			address += objJsonCostas.nombres[objJsonCostas.codloc];
		 }
		 geocoder.getLatLng(
			   address,
			   function(point) {
				  if (!point) {

				  } else {
					 map.setCenter(point, zoom);
				  }
			   }
			   );
	  } else {
		 var coords = objJsonCostas.coord[name];
		 var gpoint = new GLatLng(coords.lat, coords.long)
		 map.setCenter(gpoint, zoom);
	  }
   }
}


/**
 Crea y inicializa un arbol de zapatec
 Es imprescindible haber incluido las librerias de zptree
 @param: strUrl es la localizacion del json
 @param: idText es el id del elemento que recojera el resultado de seleccionar en el arbol
 @param: idDivArb es el div que contiene el arbol, inicialmente oculto
 ej: <div id="arbol" style="border: solid 1px black; float: left; position: absolute; display: none; background-color: white;"></div>
 El div del arbol se coloca automaticamente debajo del elemento idText y coje su misma anchura
 @return: se devuelve el objeto arbol
 La funcion miembro despliegaArbol() sirve para mostrar el arbol.
 El arbol solo se oculta cuando se selecciona un elemento de segundo nivel.
 La funcion jsonCostasCallback() se encarga de parsear el json y transformarlo de manera que sea compatible para el componente de zapatec
 */
//Hacemos la llamada sincrona para que se cree el arbol despues de recuperar el json
function getJson(urlJson) {
	var xmlhttp=false;
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		xmlhttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
   xmlhttp.open("GET", urlJson, false);
   xmlhttp.send(null);
   return xmlhttp;
}

/* Crea un arbol de tres niveles desde el json */
function jsonCostas3Levels(objJson) {

   var codigos = new Array();
   var nombres = new Array();
   var coord = new Array();
   var message = new Array();
   if (objJson && objJson.zonas && objJson.zonas.length) {

	  for (var iZonas = 0; iZonas < objJson.zonas.length; iZonas++) {
		 if (objJson.zonas[iZonas].codsup == 'top') {
			pais = objJson.zonas[iZonas].codigo;
		 } else if (objJson.zonas[iZonas].codsup == objJson.codloc) {
			/* primer nivel */
			codigos[objJson.zonas[iZonas].codigo] = new Array();
		 } else if (codigos[objJson.zonas[iZonas].codsup]) {
			/* segundo nivel */
			codigos[objJson.zonas[iZonas].codsup][objJson.zonas[iZonas].codigo] = new Array();
			/* guardamos un puntero a la zona que se trata actualmente, ya que a continuacion vienen sus elementos */
			temp = codigos[objJson.zonas[iZonas].codsup][objJson.zonas[iZonas].codigo];
		 } else {
			temp.push(objJson.zonas[iZonas].codigo);
		 }
	  }

	  for (var iZonas = 0; iZonas < objJson.zonas.length; iZonas++) {
		 /* Mapeamos los codigos */
		 if (!nombres[objJson.zonas[iZonas].codigo])
			nombres[objJson.zonas[iZonas].codigo] = objJson.zonas[iZonas].nombre.getIsoValue();
		 /* Mapeamos las coordenadas */
		 if (objJson.zonas[iZonas].point && !coord[objJson.zonas[iZonas].codigo]) {
			coord[objJson.zonas[iZonas].codigo] = objJson.zonas[iZonas].point;
			/* lo utilizamos para saber que zona es desde un punto en el click del gevent */
			message[objJson.zonas[iZonas].point.lat + '*' + objJson.zonas[iZonas].point.long] = objJson.zonas[iZonas].nombre.getIsoValue();
		 }
	  }


   }/* fin del if*/

   var ret = new Object();
   ret.codigos = codigos;
   ret.nombres = nombres;
   ret.coord = coord;
   ret.codloc = objJson.codloc;
   ret.message = message;
   ret.getPadre = function(cod) {
	  for (x in this.codigos) {
		 for (y in this.codigos[x]) {
			if (y == cod) {
			   return x;
			}
			for (z in this.codigos[x][y]) {
			   if (this.codigos[x][y][z] == cod) {
				  return y;
			   }
			}
		 }
	  }
   };
   return ret;
}

/* Crea un arbol de dos niveles desde el json */
function jsonCostas2Levels(objJson) {

   var codigos = new Array();
   var nombres = new Array();
   var coord = new Array();
   var message = new Array();
   if (objJson && objJson.zonas && objJson.zonas.length) {
	  for (var iZonas = 0; iZonas < objJson.zonas.length; iZonas++) {
		 if (objJson.zonas[iZonas].codsup == 'top') {
			pais = objJson.zonas[iZonas].codigo;
		 } else if (objJson.zonas[iZonas].codsup == objJson.codloc) {
			/* primer nivel */
			codigos[objJson.zonas[iZonas].codigo] = new Array();
		 } else {
			/* segundo nivel */
			codigos[objJson.zonas[iZonas].codsup].push(objJson.zonas[iZonas].codigo);
		}
	  }

	  for (var iZonas = 0; iZonas < objJson.zonas.length; iZonas++) {
		 /* Mapeamos los codigos */
		 if (!nombres[objJson.zonas[iZonas].codigo])
			nombres[objJson.zonas[iZonas].codigo] = objJson.zonas[iZonas].nombre.getIsoValue();
		 /* Mapeamos las coordenadas */
		 if (objJson.zonas[iZonas].point && !coord[objJson.zonas[iZonas].codigo]) {
			coord[objJson.zonas[iZonas].codigo] = objJson.zonas[iZonas].point;
			/* lo utilizamos para saber que zona es desde un punto en el click del gevent */
			message[objJson.zonas[iZonas].point.lat + '*' + objJson.zonas[iZonas].point.long] = objJson.zonas[iZonas].nombre.getIsoValue();
		 }
	  }


   }/* fin del if*/

   var ret = new Object();
   ret.codigos = codigos;
   ret.nombres = nombres;
   ret.coord = coord;
   ret.codloc = objJson.codloc;
   ret.message = message;
   ret.getPadre = function(cod) {
	  for (x in this.codigos) {
		 for (y in this.codigos[x]) {
			if (y == cod) {
			   return x;
			}
			for (z in this.codigos[x][y]) {
			   if (this.codigos[x][y][z] == cod) {
				  return y;
			   }
			}
		 }
	  }
   };
   return ret;
}


/* mapeo de los nombres con los id
el id contiene los datos del arbol */
var ids = new Array();
/* Funcion que elementos de una lista con hijos lista */
function creaUL(arbol, nombres, nivel) {
	var ret = document.createElement("UL");
	for (var i in arbol){
		var li = document.createElement("LI");
		li.appendChild(document.createTextNode(nombres[i]));
		li.id = nivel + '#' + i + '#' + nombres[i];
		ids[nombres[i]] = li.id;/* hacemos esto para poder ejecutar la funcionalidad del arbol desde el mapa */
		ret.appendChild(li);
		if (!arbol[i][0]){
			var ul = creaUL(arbol[i], nombres, nivel + 1);
			li.appendChild(ul);
		} else {
			var ul2 = document.createElement("UL");
			for (var n in arbol[i]){
				var li2 = document.createElement("LI");
				li2.appendChild(document.createTextNode(nombres[arbol[i][n]]));
				li2.id = (nivel + 1).toString() + '#' + arbol[i][n] + '#' + nombres[arbol[i][n]];
				ids[nombres[arbol[i][n]]] = li2.id;
				ul2.appendChild(li2);
			}
			li.appendChild(ul2);
		}
	}
   return ret;
}

/* Se descarga el json lo transforma a html y crea un arbol zapatec */
var tree;
var map = null;
var geocoder = null;
var mapInit = false;
function initDMap() {
  if (document.getElementById('map_canvas') && !mapInit) {
	if (GBrowserIsCompatible()){
		map = new GMap2(document.getElementById("map_canvas"));
		map.setCenter(new GLatLng(40.463667, -3.749220), 13);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		geocoder = new GClientGeocoder();
	}
  }
  mapInit = true;
}

function reajustaIframe() {
   if (navigator.appName.indexOf('Explorer') != -1){
	  var idArb = 'arbol';
	  var arb = document.getElementById(idArb);
	  var dim_arb = Zapatec.Utils.getElementOffset(arb);
	  var iframe = document.getElementById("iframeShimArbol");
	  iframe.style.left = dim_arb.left + 'px';
	  iframe.style.top = dim_arb.top + 'px';
	  iframe.style.width = dim_arb.width + 'px';
	  iframe.style.height = dim_arb.height + 'px';
	  iframe.style.display = 'block';
   }
}

function creaArbol(idSelect, idDivArb, idTex, levels,path) {
   var select = document.getElementById(idSelect);
   var extension = '.json'
   var UrlJson = path + select.value + extension;
   if (!UrlJson.match('json')) {
	  return;
   }
   var objJson = JSON.parse(getJson(UrlJson).responseText);
   var objJsonCostas;
	if (levels == 2) 
		objJsonCostas = jsonCostas2Levels(objJson);
	else if (levels == 3)
		objJsonCostas = jsonCostas3Levels(objJson);
   /* Creamos un array con los elementos padre de la lista */
	var ul = creaUL(objJsonCostas.codigos, objJsonCostas.nombres, 1);

   /* Ponemos la lista de elmementos que formaran el arbol zapatec */
   var div = document.getElementById(idDivArb);
   div.innerHTML = '';
   ul.id = 'tree';

   div.appendChild(ul);
  /* Si tenemos mapa de google */
	initDMap();
   if (map) {
	   /* Ponemos los puntos */
	   var arr = new Array();

	   for (var i in objJsonCostas.codigos) {
		  arr.push(i);
	   }
	   /* Mapeamos los puntos introducidos manualmente */
	   message = objJsonCostas.message;
	   /* inicializamos el mapa */
	   initDMap();

		if (levels == '3'){
			center(objJsonCostas.codloc, 3, objJsonCostas);
		}
		else {
			center(objJsonCostas.codloc, 5, objJsonCostas);
		}
	  map.clearOverlays();
	  setPoints(arr, 0, false, objJsonCostas);
	  /* utilizado para los puntos sin getLocations*/
   }
   /* Creamos el arbol zapatec */
   tree = new Zapatec.Tree(
   {
	  tree: "tree",
	  compact: true,
	  initLevel: 0,
	  theme: "default",
	  eventListeners: {
		 'collapse': reajustaIframe,
		 'expand': reajustaIframe
	  }
   });
   
   function itemdobleclick() {
	  var form = ''
	  document.getElementById('buscador') ?  form = document.getElementById('buscador') : form = document.getElementById('minibuscador');
	  var text = document.getElementById(idTex);
	  var arbol = document.getElementById(idDivArb);
	  var itsp = this.data.attributes.id.split('#');
	  var level = itsp[0];
	  var cod = itsp[1];
	  var nom = itsp[2];
	  if (level == '1') {
		 text.value = nom;
		 arbol.style.display = 'none';
		 form.autht.value = cod;
		 var padre = objJsonCostas.getPadre(cod);
		 if (navigator.appName.indexOf('Explorer') != -1) {
			document.getElementById("iframeShimArbol").style.display = 'none';
		 }
	  }
   }
   tree.onItemSelect = function(item_id) {
	  var lev = levels;
	  var form = '';
	  document.getElementById('buscador') ?  form = document.forms['buscador'] : form = document.forms['minibuscador'];
	  var text = document.getElementById(idTex);
	  var arbol = document.getElementById(idDivArb);
	  var itsp = item_id.split('#');
	  var level = itsp[0];
	  var cod = itsp[1];
	  var nom = itsp[2];
	  if (level == lev) {
		 /* es final */
		 text.value = nom;
		 arbol.style.display = 'none';
		 form.autht.value = cod;
		 var padre = objJsonCostas.getPadre(cod);
		 /* Si tenemos mapa de google */
		 if (map) {
			map.clearOverlays();
			setPoints(cod, 9, true, objJsonCostas);
		 }
		 if (navigator.appName.indexOf('Explorer') != -1) {
			document.getElementById("iframeShimArbol").style.display = 'none';
		 }
	  } else if (level != lev) {
		 /* no es final */
		 var arr = new Array();
		 var padre = objJsonCostas.getPadre(cod);
		 if (padre) {
			/*arr.push(objJsonCostas.nombres[padre]); El primero es el padre */
			for (var i in objJsonCostas.codigos[padre][cod]) {
			   arr.push(objJsonCostas.codigos[padre][cod][i]);
			}
		 } else {
			/*arr.push(objJsonCostas.nombres[cod]); El primero es el padre */
			for (var i in objJsonCostas.codigos[cod]) {
				/* compatibilidad arbol 2 o 3 niveles */
			   if (lev == 2)
					arr.push(objJsonCostas.codigos[cod][i]);
			   else 
					arr.push(i);
			}
		 }

		 /* Si tenemos mapa de google */
		 if (map) {
			map.clearOverlays();
			center(cod, 7, objJsonCostas);
			setPoints(arr, 0, false, objJsonCostas);
		 }
	  }
   };
}

/**
 idText: input donde se recojera el resultado
 idDivArb: div que aloja el arbol
 */
function despliegaArbol(idText, idArb) {
   if (tree) {
	  var text = document.getElementById(idText);
	  var arb = document.getElementById(idArb);
	  var dim = Zapatec.Utils.getElementOffset(text);
	  if (navigator.appName.indexOf('Explorer') != -1) {
		 dim.left += 2;
	  }
	  arb.style.top = dim.top + dim.height + 'px';
	  arb.style.left = dim.left + 'px';
	  arb.style.width = dim.width + 'px';
	  arb.style.display = 'block';
	  var dim_arb = Zapatec.Utils.getElementOffset(arb);
	  var iframe = document.getElementById("iframeShimArbol");
	  if (navigator.appName.indexOf('Explorer') != -1)
	  {
		 iframe.style.top = dim.top + dim.height + 'px';
		 iframe.style.left = dim.left + 'px';
		 iframe.style.width = dim.width + 'px';
		 iframe.style.height = dim_arb.height + 'px';
		 iframe.style.display = 'block';
	  }
   }
}
