PageSourceSearch

https://visitacuenca.es/sites/all/modules/custom/mapa_turisticoleaflet/js/gestionmapa.js?tluomp

js visitacuenca.es collected 2026-09-24 21:30:59 UTC 53,021 bytes, 1,826 lines download raw bytes

1/***************************************************************************************
2 *
3 * Evolucion visor de recursos turisticos a la nueva version del api de googlemaps v3.
4 *
5 * Dependencias nuevas:
6 *
7 * 			- jquery 1.4.3
8 * 			- encode.js
9 *
10 * Notas:
11 *
12 *  La mayor parte de la configuracion del servicio, se ha migrado al fichero
13 *  <code>mapconfig.js</code> que expone la configuracion a traves del objeto
14 *  MAP_CONFIG.
15 *
16 * @author cmendez Marzo 2011.
17 *
18 ***************************************************************************************/
19
20/**
21 * Tipos de recursos a cargar en el mapa separados por comas:
22 *
23 * ejempo:  A1_K,A1_W,A1_Z,B1_1
24 */
25
26CONST_LABEL_ORIGEN = '';
27CONST_LABEL_DESTINO = '';
28var resource_types = "";
29
30
31//Daclaracion de variables para recoger valores de las vistas de recursos turisticos
32
33/**
34 * Lenguaje por defecto. En la inicializacion de la aplicacion se
35 * obtiene la proporcionada por el servidor.
36 */
37
38 var lang = "";
39
40/**
41 * Compatibilidad con otros controles y scripts empleados por la aplicacion.
42 */
43
44 var gPeticionEnCurso = false; 
45
46/**
47 * Referencia al objeto mapa que se visualiza en la pagina.
48 * Objeto google.maps.Map
49 */
50
51 var r_map;
52 var eVisitarMap;
53
54/**
55 * Referencia a la ventana de informacion que se emplea para visualizar las miniaturas
56 * de los recursos que se visualizan en el mapa.
57 *
58 * Se sigue la recomendacion del api, de emplear una unica ventana de informacion, para
59 * visualizar todas las informaciones.
60 *
61 * Objeto google.maps.InfoWindow
62 */
63var infoWindow;
64
65/**
66 * Referencia al recurso vinculado a la ventana de informacion
67 *
68 * Si se elimina el marcador asociado a la ventana de informacion esta desaparece, para evitar que
69 * esto ocurra en el desplazamiento automatico, en el open, se mantendra esta referencia al marcador hasta
70 * que sea necesario eliminarlo
71 *
72 * Objeto RecursoTuristico
73 */
74var infoWindowRecurso;
75
76/**
77 * Indica cuando hay que borrar este marcador del mapa
78 *
79 */
80var borrarInfoWindowRecurso = false;
81
82/**
83 * Implementa el renderizador del servicio Directions del api de maps V3.
84 * Cuando se calcula una ruta, se le deben proporcionar dos objetos:
85 * 1) El mapa en el que visualizar la ruta.
86 * 2) Un panel en el que cargar las indicaciones de la ruta.
87 *
88 * Objeto google.maps.DirectionsRenderer
89 */
90var directionsDisplay;
91
92/**
93 * Se inicializa con el servicio Directions del api de maps V3.
94 *
95 * Objeto google.maps.DirectionsService
96 */
97var directionsService;
98
99/**
100 * Se inicializa con el servicio de Panoramio.
101 *
102 * Objeto google.maps.panoramio.PanoramioLayer
103 */
104var panoramioLayer;
105
106/**
107 * Punto de inicio de la ruta.
108 *
109 * Objeto google.maps.LatLng
110 */
111var r_start = null;
112
113/**
114 * Punto de finalizacion de la ruta.
115 *
116 * Objeto google.maps.LatLng
117 */
118var r_end = null;
119
120/**
121 * Overlay que visualiza un marcador verde con la letra A para identificar
122 * el inicio de la ruta.
123 *
124 * Objeto google.maps.Marker
125 */
126var r_start_o = null;
127
128/**
129 * Overlay que visualiza un marcador verde con la letra B para identificar
130 * el fin de la ruta.
131 *
132 * Objeto google.maps.Marker
133 */
134var r_end_o = null;
135
136/**
137 * Indica si se deben visualizar resultados obtenidos de panoramio en el mapa.
138 */
139var isPanoramioActive = false;
140
141/**
142 * Fecha del ultimo evento que actualiza el mapa. Se emplea para limitar el numero
143 * de conexiones que se relizan al servidor a por datos.
144 */
145//var eventType = null; /*Ivan - Puesto para que siga ejecuntando el js*/
146var lastEvent = null;
147
148/**
149 * Array de recursos turisticos.
150 *
151 * Array de objetos RecursoTuristico procedentes de la ruta
152 */
153var vRecursosRuta = [];
154
155
156
157/**
158 * Array de recursos turisticos.
159 *
160 * Array de objetos RecursoTuristico
161 */
162var vRecursos = [];
163
164/**
165 * Array de recursos turisticos procedentes de un formulario de búsqueda.
166 *
167 * Array de objetos RecursoTuristico
168 */
169var vRecursosFiltro = [];
170
171/**
172 * Overlay dragable, que representa el puntero del radar de posicion
173 *
174 * Objeto google.maps.Marker
175 */
176var pointer = null;
177
178/**
179 * Circulo de radio determinado por el rango del radar asociado al puntero.
180 *
181 * Objeto google.maps.Circle
182 */
183var circle = null;
184
185/**
186 * Arrays de circulos de radio determinados por el rando del radar asociad
186os a
187 * cada punto de la ruta.
188 *
189 * Array de objetos google.maps.Circle
190 */
191var ruteCircles = [];
192
193/**
194 * Rango del radar, este se debe proporcionar en metros.
195 */
196var range = 0;
197
198/**
199 * Inicializador del visor de recursos turisticos.
200 *
201 * Anade al listado de funciones que se ejecutan al cargarse la pagina (onLoad),
202 * la funcion <code>inicializarMapa</code> de arranque de la aplicacion.
203 */
204
205
206if (window.addEventListener) {
207	// window.addEventListener('load', inicializarMapa, false);
208	window.addEventListener('load', inicializarLeafletMapa, false);
209} else if (window.attachEvent) {
210	// window.attachEvent('onload', inicializarMapa);
211	window.attachEvent('onload', inicializarLeafletMapa);
212}
213
214/**
215 * Crea el infowindow de un recurso turistico con los enlaces correspondientss a la
216 * descarga de POI y Desde, Hasta y en funcion del nivel de zoom
217 * incluye o no el enlace de visualizacion de los recursos del municipio
218 *
219 * @param marker Marcador asociado a la ventana de informacion. Objeto google.maps.Marker
220 * @param recurso Recurso turistico. Objeto RecursoTuristico
221 */
222function openInfoWindow(marker, recurso) {
223  lastEvent = new Date();
224  var markerLatLng = marker.getPosition();
225
226  como = "C\u00F3mo llegar";
227  desde = "Desde aqu\u00ED";
228  hasta = "Hasta aqu\u00ED";
229  info= "Informaci\u00F3n";
230  
231  if (lang=="en"){
232	 como = "How to arrive";
233	 desde = "From here";
234	 hasta = "To here";
235	 info = "Information";
236	}	
237  
238   if (lang=="fr"){
239	 como = "Comment arriver";
240	 desde = "D'ici";
241	 hasta = "Jusqu'ici";
242	 info="Information";
243	}
244  
245  
246  
247	if(recurso.codigoRecurso != ''){
248		var styleTitle = 'conInfo';
249	}
250
251  var view = [		
252	"<div id=\"municipios_ie6_contents\">", 
253        "<div  class='contenedor-imagen' style='float:left' >",
254        "<img class='img_infoView' src='",
255        recurso.imagen,
256        "'>",
257        "</div>", 
258        "<p class='descr_infoView "+ styleTitle +"'><strong>",
259        recurso.nombreRecurso,
260        "</strong></p>",
261        //"<div class='descr_infoView2'>",
262        //recurso.descripcion,
263        //"</div>",
264        "<div class='capa_mas_info aqui'>",
265        "<a class='masinfo_maps' href='/",
266        lang,
267        "/node/",
268        recurso.codigoRecurso,
269        "'>"+info+"</a>",
270        "</div>",
271        "</div>",
272        "<div id=\"comollegar\">",
273        "<span  class='como-llegar-capa'>",
274        como,
275        ":&nbsp;</span>",
276        "<a",
277        " href=\"javascript:refreshResourceRuteFromTo('",
278        recurso.nombreRecurso,
279        "', ",
280		recurso.longitudRecurso,
281        ", ",
282		recurso.latitudRecurso,
283        ", true);\" class='desde-punto'>",
284        desde,
285        "</a>",
286        "&nbsp;-&nbsp;",
287        "<a",
288        " href=\"javascript:refreshResourceRuteFromTo('",
289        recurso.nombreRecurso,
290        "', ",
291        recurso.longitudRecurso,
292        ", ",
293        recurso.latitudRecurso,
294        ", false);\" class='hasta-punto'>",
295        hasta,
296        "</a>",
297        "</div>",
298        //"</div>"
299
300	].join('');
301
302  infoWindow.setContent(view);
303  infoWindow.open(r_map, marker);
304
305  // Codigo necesario para que el infoWindow no desaparezca al tener habilitado el autopan
306  if (borrarInfoWindowRecurso) {
307  	infoWindowRecurso.borrar();
308  	borrarInfoWindowRecurso = false;
309  }
310  infoWindowRecurso = recurso;
311  ///////////////
312  //jQuery('#municipios_ie6_contents').parent().parent().parent().addClass("popupMapsRiba");
313  
314  
315}
316
317
318function openInfoWindow2(marker,titulo,imagen,descripcion,codigoRecurso,latitudRecurso,longitudRecurso) {
319  lastEvent = new Date();
320  var markerLatLng = marker.getPosition();
321	
322	var descripcion_recortada = descripcion.substring(0, 125) + ' ...' ;
323
324 	//	var view2="<div class='mapEmpresa'>"+titulo+"</div>";       
325    //    view2=view2+"<div class='capa_mas_info'><a class='masinfo_maps' href='/"+lang+"/node/"+codigoRecurso+"'>+ info</a></div>";
326
327  como = "C\u00F3mo llegar";
328  desde = "Desde aqu\u00ED";
329  hasta = "Hasta aqu\u00ED";
330  info= "Informaci\u00F3n";
331  
332  if (lang=="fr"){
333	 como = "Comment arriver";
334	 desde = "D'ici";
335	 hasta = "Jusqu'ici";
336  }
337  
338   if (lang=="en"){
339	 como = "How to arrive";
340	 desde = "From here";
341	 hasta = "To here";
342	}	
343    
344	if(titulo != ''){
345		var styleTitle = 'sinInfo';
346	}     
347
348  var view = [		
349	"<div id=\"municipios_ie6_contents\" >", 
350        "<div class='contenedor-imagen' style='float:left'>",
351        "<img class='img_infoView' src='",
352        imagen,
353        "'>",
354        "</div>", 
355        "<p class='descr_infoView "+ styleTitle +"'><strong>",
356        titulo,
357        "</strong></p>",
358        //"<div class='descr_infoView2'>",
359        //descripcion_recortada,
360        //"</div>",
361        "</div>",
362        "<div id=\"comollegar\">",
363        "<span class='como-llegar-capa'>",
364        como,
365        ":&nbsp;</span>",
366        "<a",
367        " href=\"javascript:refreshResourceRuteFromTo('",
368        titulo,
369        "', ",
370		longitudRecurso,
371        ", ",
372		latitudRecurso,
373        ", true);\" class='desde-punto'>",
374        desde,
375        "</a>",
376        "&nbsp;-&nbsp;",
377        "<a",
378        " href=\"javascript:refreshResourceRuteFromTo('",
379        titulo,
380        "', ",
381        longitudRecurso,
382        ", ",
383        latitudRecurso,
384        ", false);\" class='hasta-punto'>",
385        hasta,
386        "</a>",
387        "</div>",
388        //"</div>"
389
390	].join('');
391
392  infoWindow.setContent(view);
393  infoWindow.open(r_map, marker);
394}
395
396
397/**
398 * Proporciona el icono a emplear en funcion del tipo de recurso. Esta informacion, esta
399 * registrada en el objeto MAP_CONFIG.
400 *
401 * @param oidType Tipo de recurso.
402 * @return icono asociado al tipo de recurso.
403 */
404function _getResourceIcon(oidType) {
405    return getLabel(MAP_CONFIG.path_imagen) + "" + eval("MAP_CONFIG.icon_type." + oidType);     
406}
407
408/**
409 * Inicializacion de la aplicacion.
410 *
411 * 	- Inicializacion del idioma desde el servidor.
412 * 	- Configuracion inicial del mapa. (centro y nivel de zoom).
413 * 	- Inicializacion del infowindow de visualizacion de miniaturas.
414 * 	- Inicializacion del servicio Directions del api de maps V3.
415 *  - Inicializacion del renderizador para el servicio Directions.
416 *  - Inicializacion de las capas de Panoramio
417 *  - Inicializacion de controles del mapa y del visor de recursos turisticos.
418 *  - Inicializacion de eventos del mapa (zoom y cambio de zona).
419 *
420 */
421
422function inicializarLeafletMapa(){
423
424	lang = languageDrupal(); //No se que hace
425	//Cosas de RRTT
426	//CREO que al ser ruta y no RRTT devuelve NULL para que lo que se muestre en el mapa sea distinto
427	tituloRecurso = Drupal.settings.mapa_turistico.titulo; //NULL. Parece que lo usa como null para determinar ciertas circunstancias. Creo que para diferencias ruta de poi
428	if (tituloRecurso != null)
429	{
430		// tituloRecurso dice que no esta definido
431		
432		descripcionRecurso = Drupal.settings.mapa_turistico.descripcion;
433		codigoRecurso = Drupal.settings.mapa_turistico.codigo_recurso;
434		imagenRecurso = Drupal.settings.mapa_turistico.imagen;
435		latitudRecurso = Drupal.settings.mapa_turistico.latitud;
436		longitudRecurso = Drupal.settings.mapa_turistico.longitud;
437
438	}
439	//FIN cosas RRTT
440	 /*********************************
441	 * Recogemos los valores de las coordenanadas y el zoom del mapa que las pasamos desde
442	 * el archivo .module, mediante la funcion drupal_add_js.
443	 * Pasamos estos valores al mapa de google maps
444	 **********************************/
445
446	var zoom_inicial = parseInt(Drupal.settings.mapa_turistico.zoom_inicial);
447
448
449	if(zoom_inicial == null) { zoom_inicial = 14}
450
451	//Es una landing page, le cambio el zoom 
452	//VALORAR 
453	// if(jQuery('#landingpage').length>0){
454	// 	zoom_inicial =12;
455	// }
456	// if (!jQuery('#frontpage').length==0 && jQuery('#frontpage').val() == "merindades"){
457	// 	zoom_inicial = 10;
458	// }
459	//Gestión de las posibles rutas
460	var ruta = new String(Drupal.settings.mapa_turistico.ruta);
461
462	if (ruta.length > 5) { //Si la ruta existe y su length es mayor que 5
463		// Drupal.settings.mapa_turistico.latitud = null; //Para que entre por la ruta// 20/09/18 esta fila proboca que no salga por defecto en las LP los 
464		ruta = ruta.substring(12,ruta.length-1);
465		ruta = ruta.replace(",",""); 		
466		ruta = ruta.split(" ");
467		
468		for (i = 0; i < ruta.length; i++) {
469		  ruta[i] = ruta[i].replace(",","");
470		  ruta[i] = parseFloat(ruta[i]);		 
471		}	
472	}
473
474	//Tipos de mapas de base:
475	//http://leaflet-extras.github.io/leaflet-providers/preview/
476
477	var merindadesMapa = L.tileLayer( 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
478		attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
479		 subdomains: ['a','b','c']
480	});
481
482
483	var openStreeMap = L.tileLayer('https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}{r}.{ext}', {
484		attribution: 'Map tiles by <a href="http://stamen.com">Stamen Design</a>, <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a> &mdash; Map data &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
485		subdomains: 'abcd',
486		minZoom: 0,
487		maxZoom: 18,
488		ext: 'png'
489	});
490
491	var OpenMapSurfer_Hillshade = L.tileLayer('https://maps.heigit.org/openmapsurfer/tiles/asterh/webmercator/{z}/{x}/{y}.png', {
492	maxZoom: 18,
493	attribution: 'Imagery from <a href="http://giscience.uni-hd.de/">GIScience Research Group @ University of Heidelberg</a> | Map data  <a href="https://lpdaac.usgs.gov/products/aster_policies">ASTER GDEM</a>, <a href="http://srtm.csi.cgiar.org/">SRTM</a>'
494	});
495
496	
497	var esriTopo = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
498		attribution: 'Tiles &copy; Esri &mdash; Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'
499	});
500
501	var MtbMap  = L.tileLayer('http://tile.mtbmap.cz/mtbmap_tiles/{z}/{x}/{y}.png', {
502		attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> &amp; USGS'
503	});
504
505
506
507	
508	//Creación del objeto mapa
509
510	if (Drupal.settings.mapa_turistico.latitud != null) {
511		 //Creación de la configuración de mapa en caso de que latitud no sea null
512
513
514		} 
515	
516
517	if (Drupal.settings.mapa_turistico.latitud != null && Drupal.settings.mapa_turistico.ruta == null ) {  
518		
519		if (jQuery('#baseURL').val() == "merindades"){ // 
520			eVisitarMap = L.map('leafletMap').
521			setView([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud],
522			10);
523			
524		} else if (jQuery('#baseURL').val() == "cuenca"){ // 
525			eVisitarMap = L.map('leafletMap').
526			setView([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud],
527			12);
528
529		} else {
530
531			eVisitarMap = L.map('leafletMap').
532			setView([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud],
533			zoom_inicial);
534		}
535
536		merindadesMapa.addTo( eVisitarMap );				// Carga el mapa
537		// OpenMapSurfer_Hillshade.addTo( eVisitarMap );	// le añadimos la segunda capa para dar relieve
538
539
540
541
542		//Creamos el marcador del RRTT
543		if(jQuery(".node-touristic-resource").length>0 || jQuery(".node-agenda").length>0) { //Para que solo pinte el primer marcador en el RRTT
544			var rrttMarker = L.marker([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud]).addTo(eVisitarMap);
545			//Le añadimos el pop-up con su información
546			if( Drupal.settings.mapa_turistico.titulo != null ){
547				rrttMarker.bindPopup("<div class='leafletPopup'>" +
548				Drupal.settings.mapa_turistico.titulo +
549				" <div class='leafletPopup__image' style='background-image:url(" + 
550				Drupal.settings.mapa_turistico.imagen +
551				")'></div></div>"
552				).openPopup();
553			}
554		}
555		else if(jQuery(".node-agenda").length>0) { //Para que solo pinte el primer marcador en la agenda sin bocadillo
556			var rrttMarker = L.marker([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud])
557				.addTo(eVisitarMap);
558						
559		} else {
560			getMapDataLL();
561		}
562	}
563	
564
565	//Caso ruta: La ruta no es NULL
566	else if (Drupal.settings.mapa_turistico.ruta != null) {  
567		//Creación de la configuración de mapa en caso de que latitud sea null y ruta no sea null  
568		if (jQuery('#baseURL').val() == "merindades"){ // 
569			eVisitarMap = L.map('leafletMap').
570				setView([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud], // le pasamos los datos proporcionados por drupal en el template donde llamamos al mapa, para conseguir centrar la ruta y no su punto inicial
571				10); // zoom del mapa de ruta
572		} else {
573			eVisitarMap = L.map('leafletMap').
574			setView([Drupal.settings.mapa_turistico.latitud,Drupal.settings.mapa_turistico.longitud], // le pasamos los datos proporcionados por drupal en el template donde llamamos al mapa, para conseguir centrar la ruta y no su punto inicial
575			12); // zoom del mapa de ruta
576		}
577
578		merindadesMapa.addTo( eVisitarMap );
579
580		//Creamos un array de coordenadas
581		var latlngsRoutePath = [];
582
583		//Metemos las coordenadas de la ruta en nuestro array
584		for (i = 0; i < ruta.length; i = i+2) {
585			latlngsRoutePath.push([ruta[i+1], ruta[i]]);
586		}
587		
588		//Creamos el polyline, le metemos el array de coordenadas y lo asignamos al mapa
589		var routePath = L.polyline(latlngsRoutePath, {
590			color: '#fb8b01' //Color cuenca #fb8b01
591		});
592		routePath.addTo(eVisitarMap);
593
594		var rrttMarker = L.marker([ruta[1], ruta[0]])
595					.addTo(eVisitarMap); // punto de inicio de la ruta
596
597	} else {
598		if (jQuery('#baseURL').val() == "merindades"){ // 
599			eVisitarMap = L.map('leafletMap').
600			setView([42.932256,-3.486947], // le pasamos los datos proporcionados por drupal en el template donde llamamos al mapa, para conseguir centrar la ruta y no su punto inicial
601			10);
602		} else {
603		eVisitarMap = L.map('leafletMap').
604			setView([40.4167,-3.70325], // le pasamos los datos proporcionados por drupal en el template donde llamamos al mapa, para conseguir centrar la ruta y no su punto inicial
605			6);
606		}	
607			merindadesMapa.addTo( eVisitarMap );
608		//Creación de la configuración de mapa en caso de que latitud y ruta sean null
609	}
610
611	//Cuando el mapa hace zoom o se mueve o se carga aplica la "recarga"
612
613	var rechargeMap= function(){
614		getMapDataLL();
615
616		if(document.getElementById('edit-field-type-tid')) {     
617			getMapDataFiltroLL(null); 
618		} 
619
620		if(document.getElementById('route_type-tid-value')) {
621			getMapDataFiltroLL(null); 
622		}
623		var idruta = new String(Drupal.settings.mapa_turistico.idruta);
624		if (idruta > 0){
625			getMapDataRuta("idle");
626		}
627	};
628
629	eVisitarMap.whenReady( rechargeMap);
630	eVisitarMap.on("load moveend", rechargeMap);	
631
632
633	eVisitarMap.scrollWheelZoom.disable();
634	//eVisitarMap.dragging.disable();
635}
636
637
638
639
640/**
641 * Redimensiona el mapa en funcion del tamaño de la página
642 */
643function mapsize_fixed() {
644	document.getElementById("map").style.width = jQuery(document).width();
645	document.getElementById("map").style.height = jQuery(document).height();
646	google.maps.event.trigger(r_map, 'resize');
647	
648}
649 
650
651
652/**
653 * Obtencion de datos externos desde los servicios recursos. Pintar� los puntos de las etapas relacionadas en el mapa.
654 *
655 * Esta funcion es invocada por los eventos del mapa (cambio de zoom o de zona) y
656 * explicitamente (eventType=null) por acciones del usuario en la pagina.
657 *
658 * Cuando el invocante es un evento, se aplica una limitacion de tiempo, de forma
659 * que solo se admite una peticion al/los servicios cada medio segundo.
660 *
661 * @param eventType evento que desencadena la peticion o null en caso de una accion de
662 * usuario.
663 */
664function getMapDataRuta(eventType) {
665	// Limitador de eventos, evita encolar eventos del mapa, solo procesa un evento cada 1/2 segundo.
666	vRecursosRuta = [];
667	// Calculo de la nueva ventana y obtencion de los nuevos overlays
668	var bounds = r_map.getBounds();
669	var southWest = bounds.getSouthWest(); 
670	var northEast = bounds.getNorthEast(); 
671
672	var _lng1 = southWest.lng();
673	var _lat1 = southWest.lat();
674	var _lng2 = northEast.lng();
675	var _lat2 = northEast.lat();
676	var zona = "All";   
677	var tematica = "All";
678	var nombre = "";
679	var precioHasta = "";
680	var gratuito = "All";
681 	var nidruta = Drupal.settings.mapa_turistico.idruta;
682    	
683
684	jQuery.getJSON(getLabel(MAP_CONFIG.resources_service), {
685		peticion: "recursos",
686		lat1: _lat1,
687		lng1: _lng1,
688		lat2: _lat2,
689		lng2: _lng2,
690		Zoom: "Municipios",
691		tipos_recursos: '0',
692		idioma: lang,
693		zona: zona,
694		tematica: tematica,
695		nombre: nombre,
696		preciohasta: precioHasta,
697		gratuito: gratuito, 
698		idruta: nidruta,                                           
699		mod: "JSON"
700	}, function(data) {
701		prepareResourcesRuta(data);
702	});
703		
704}
705
706/**
707 * Obtencion de datos externos desde los servicios recursos. Filtro por arbol de tipos de recurso.
708 *
709 * Esta funcion es invocada por los eventos del mapa (cambio de zoom o de zona) y
710 * explicitamente (eventType=null) por acciones del usuario en la pagina.
711 *
712 * Cuando el invocante es un evento, se aplica una limitacion de tiempo, de forma
713 * que solo se admite una peticion al/los servicios cada medio segundo.
714 *
715 * @param eventType evento que desencadena la peticion o null en caso de una accion de
716 * usuario.
717 */
718
719
720function getMapDataLL() {
721
722	/**
723	 * GHernandez esto esta porque no se borraban los pois y las sombras, al mover cargana unas nuevas a terminaba por bloquear el navegador.
724	 */
725	if(typeof ($contTyp) == "undefined"){ 
726		jQuery(".leaflet-shadow-pane img").remove();
727		jQuery(".leaflet-marker-pane img").remove();
728	}
729	// jQuery(".leaflet-popup-pane .leaflet-popup").remove();
730	// GHernandez Fin 
731
732	// Borrado de los overlays de recursos PRUEBA
733	for (var t = 0; t < vRecursos.length; t++) {
734		if (vRecursos[t] != infoWindowRecurso) {
735			vRecursos[t].borrar(null);
736		} else {
737			borrarInfoWindowRecurso = true;
738		}
739	} 
740
741	vRecursos = [];
742
743	//FIN PRUEBA
744
745	//Calculo de los bounds de leaflet
746	var boundsLL = eVisitarMap.getBounds();
747	var southWestLL = boundsLL._southWest; 
748	var northEastLL = boundsLL._northEast; 
749	var _lng1 = southWestLL.lng;
750	var _lat1 = southWestLL.lat;
751	var _lng2 = northEastLL.lng;
752	var _lat2 = northEastLL.lat;
753
754	var zona = "All";   
755	var tematica = "All";
756	var nombre = "";
757	var precioHasta = "";
758	var gratuito = "All";
759	
760	// Variables para los tipos de contenido Rutas
761	var route_type = "All"; 
762	var travel = "All";   
763	var dificultad = "All";  
764	var duration = "All";  
765
766 	var nidruta = new String(Drupal.settings.mapa_turistico.idruta);
767	
768	if(jQuery('#zone-tid-value').length) {
769        zona = document.getElementById('zone-tid-value').value;
770	}
771
772	if(jQuery('#route_type-tid-value').length) {
773        route_type = document.getElementById('route_type-tid-value').value;
774	}
775
776	if(jQuery('#travel-tid-value').length) {
777        travel = document.getElementById('travel-tid-value').value;
778	}
779	
780	if(jQuery('#dificultad-tid-value').length) {
781        dificultad = document.getElementById('dificultad-tid-value').value;
782	}
783
784	if(jQuery('#duration-tid-value').length) {
785        duration = document.getElementById('duration-tid-value').value;
786	}
787
788	if(jQuery('#theme-tid-value').length) {
789        tematica = document.getElementById('theme-tid-value').value;
790	}
791
792	if(jQuery('#resource-tid-value').length) {
793        tematica = document.getElementById('resource-tid-value').value;
794    }
795	if (!jQuery('#frontpage').length==0 ){
796		//resource_types='All';
797	}
798	//Esta variable se utiliza para que el json sepa que estoy en una landing page y tiene que sacar todos los recursos tops de la zona 
799	// m�s las categorias seleccionadas.
800	var flag_landing= 0;
801	if(jQuery('#landingpage').length>0){
802		flag_landing = 1;
803	}
804
805	//Comprobamos si tiene #resource-tid-value y si tiene lo asinamos a resource types.
806
807
808    if (resource_types != '') {
809		
810		if(jQuery('#resource-tid-value').length ) {
811			//resource_types = resource_types + "," + document.getElementById('resource-tid-value').value;
812		}
813
814		jQuery.getJSON(getLabel(MAP_CONFIG.resources_service), {
815			peticion: "recursos",
816			lat1: _lat1,
817			lng1: _lng1,
818			lat2: _lat2,
819			lng2: _lng2,
820			Zoom: "Municipios",
821			tipos_recursos: resource_types,
822			idioma: lang,
823			zona: zona,
824			tematica: tematica,
825			nombre: nombre,
826			preciohasta: precioHasta,
827			gratuito: gratuito, 
828			idruta: nidruta,  
829			tipos_recursos3 : flag_landing,	
830
831			// Tipo de contenido rutas
832			route_type: route_type,
833			travel: travel,
834			dificultad: dificultad,
835			duration: duration,
836
837			mod: "JSON"
838			
839		}, function(data) {
840			console.log(data)
841			prepareResourcesLL(data);
842
843		});
844	} else {
845		jQuery("#div_tree_loading_filtros").css("display", "none");
846		
847		if(jQuery('#resource-tid-value').length>0) {
848			
849			resource_types = document.getElementById('resource-tid-value').value;
850		}
851	}            
852
853}
854/**
855 * Obtencion de datos externos desde los servicios recursos. Filtro por formulario.
856 *
857 * Esta funcion es invocada por los eventos del mapa (cambio de zoom o de zona) y
858 * explicitamente (eventType=null) por acciones del usuario en la pagina.
859 *
860 * Cuando el invocante es un evento, se aplica una limitacion de tiempo, de forma
861 * que solo se admite una peticion al/los servicios cada medio segundo.
862 *
863 * @param eventType evento que desencadena la peticion o null en caso de una accion de
864 * usuario.
865 */
866 function getMapDataFiltroLL(eventType) {
867
868	for (var t = 0; t < vRecursosFiltro.length; t++) {
869		if (vRecursosFiltro[t] != infoWindowRecurso) {
870			vRecursosFiltro[t].borrar(null);
871		} else {
872			borrarInfoWindowRecurso = true;
873		}
874	} 
875
876	//Calculo de los bounds de leaflet
877	var boundsLL = eVisitarMap.getBounds();
878	var southWestLL = boundsLL._southWest; 
879	var northEastLL = boundsLL._northEast; 
880
881	var _lng1 = southWestLL.lng;
882	var _lat1 = southWestLL.lat;
883	var _lng2 = northEastLL.lng;
884	var _lat2 = northEastLL.lat;
885
886	var recurso = "";
887	var zona = "";
888	var tematica = "";
889	var nombre = "";
890	var precioHasta = "";
891	var gratuito = "";
892
893	var route_type = "All"; 
894	var travel = "All";   
895	var dificultad = "All";  
896	var duration = "All";  
897
898	if(jQuery('#edit-field-type-tid').length) {
899		recurso = document.getElementById('edit-field-type-tid').value;
900	}
901	else {
902		recurso = "All";
903	}
904	
905	if(jQuery('#edit-field-zone-tid').length) {
906		zona = document.getElementById('edit-field-zone-tid').value;
907	}
908	else {
909		zona = "All";
910	}
911
912	if(jQuery('#edit-field-theme-tid').length) {
913		tematica = document.getElementById('edit-field-theme-tid').value;
914	}
915	else {
916		tematica = "All";
917	}
918	
919	if(jQuery('#edit-title').length) {
920		nombre = document.getElementById('edit-title').value;
921	}
922	else {
923		nombre = "";
924	}
925	
926	if(jQuery('#edit-field-price-min-value').length) {
927		precioHasta = document.getElementById('edit-field-price-min-value').value;
928	}
929	else {
930		precioHasta = "";
931	}
932	
933	if(jQuery('#edit-field-free-value').length) {
934		gratuito = document.getElementById('edit-field-free-value').value;
935	}
936	else {
937		gratuito = "All";
938	}
939	if(jQuery('#type-tid-value').length) {
940        recurso = document.getElementById('type-tid-value').value;
941	}
942
943
944	if(jQuery('#route_type-tid-value').length) {
945        route_type = document.getElementById('route_type-tid-value').value;
946	}
947
948	if(jQuery('#travel-tid-value').length) {
949        travel = document.getElementById('travel-tid-value').value;
950	}
951	if(jQuery('#dificultad-tid-value').length) {
952        dificultad = document.getElementById('dificultad-tid-value').value;
953	}
954
955	if(jQuery('#duration-tid-value').length) {
956        duration = document.getElementById('duration-tid-value').value;
957	}
958	
959	if(document.getElementById('route_type-tid-value')) {
960		var peticion = "rutas";
961	} else {
962		var peticion = "recursos";
963	}
964	
965	/*alert("Categoria " + recurso);	 
966	 alert("Zona " + zona);
967         alert("Tematica " + tematica);
968         alert("Nombre " + nombre);
969         alert("Precio Hasta " + precioHasta);
970         alert("Gratuito " + gratuito);*/ 
971	if (document.getElementById('route_type-tid-value')) {
972		jQuery.getJSON(getLabel(MAP_CONFIG.resources_service), {
973			peticion: peticion,
974			lat1: _lat1,
975			lng1: _lng1,
976			lat2: _lat2,
977			lng2: _lng2,
978			Zoom: "Municipios",
979			tipos_recursos: recurso,
980			idioma: lang,
981			zona: zona,
982			tematica: tematica,
983			nombre: nombre,
984			preciohasta: precioHasta,
985			gratuito: gratuito,
986			route_type: route_type,
987			travel: travel,
988			dificultad: dificultad,
989			duration: duration,  
990			mod: "JSON"
991			
992		}, function(data) {
993			prepareResourcesFiltroLL(data);
994		});
995	} 
996
997	if (recurso != '' && !document.getElementById('route_type-tid-value')) {
998		jQuery.getJSON(getLabel(MAP_CONFIG.resources_service), {
999			peticion: peticion,
1000			lat1: _lat1,
1001			lng1: _lng1,
1002			lat2: _lat2,
1003			lng2: _lng2,
1004			Zoom: "Municipios",
1005			tipos_recursos: recurso,
1006			idioma: lang,
1007			zona: zona,
1008			tematica: tematica,
1009			nombre: nombre,
1010			preciohasta: precioHasta,
1011			gratuito: gratuito,  
1012			route_type: route_type,
1013			travel: travel,
1014			dificultad: dificultad,
1015			duration: duration, 
1016			mod: "JSON"
1017		}, function(data) {
1018			prepareResourcesFiltroLL(data);
1019		});
1020	} else {
1021		jQuery("#div_tree_loading_filtros").css("display", "none");
1022	}
1023
1024};
1025
1026/**
1027 * Carga y configuracion de overlays de los recursos tur�sticos de las etapas.
1028 * Tiene en cuenta si alguno de los radares (posicion o ruta) estan activos, para
1029 * cargar solo los recursos en el area de influencia del rada, si no carga todos
1030 * recursos otenidos del servicio de recursos.
1031 *
1032 * @param data Datos obtenidos del servicio de recursos en la peticion. Objeto de la forma:
1033 * {"p":[{"n":[{"r":codigo_recurso,"t":tipo_recurso,"m":nombre_recurso,"y":latitud,"x":longitud},...]}]}
1034 *
1035 * Ej. {"p":[{"n":[{"r":"5101","t":"D2","m":"DONOSTIA&#45;SAN&#32;SEBASTI&#193;N","y":"43.320725","x":"-1.984449"},
1036 * {"r":"5686","t":"D2","m":"ANDOAIN","y":"43.2204799","x":"-2.0211221"},
1037 * {"r":"5699","t":"D2","m":"BERNEDO","y":"42.626684","x":"-2.497532"}]}]}
1038 * Pinta lo que recogemos de JSON
1039 */
1040
1041function prepareResourcesRuta(data) { // no entra en /rutas
1042
1043	if (data.p.n) {
1044		for (var t = 0; t < data.p.n.length; t++) {		
1045			vRecursosRuta[t] = new RecursoTuristicoSimple(data.p.n[t],r_map);
1046		}
1047
1048		if (!isRadarActive()) { // Si no hay ningun filtro adicional de radar se muestran todos los puntos
1049			for (var t = 0; t < vRecursosRuta.length; t++) {
1050				vRecursosRuta[t].mostrar();
1051			}
1052		} else {	// Si hay un filtro adicional solo se muestran aquellos puntos que se encuentren dentro del area fijada
1053			if (circle != null) {
1054				for (var t = 0; t < vRecursosRuta.length; t++) {
1055					if (google.maps.geometry.spherical.computeLength([circle.getCenter(), vRecursosRuta[t].marker.getPosition()]) < radiusInKm*1000 ) {
1056						vRecursosRuta[t].mostrar();
1057					}
1058				}
1059			}
1060
1061			if (ruteCircles.length > 0) {	//Se muestran los recursos que se encuentren dentro del halo (polígono + círculos de inicio y fin de ruta)
1062				for (var t = 0; t < vRecursos.length; t++) {
1063					if (google.maps.geometry.poly.containsLocation(vRecursos[t].marker.getPosition(), ruteCircles[0])) {
1064							vRecursos[t].mostrar();
1065					} else if (ruteCircles[1].getBounds().contains(vRecursos[t].marker.getPosition())){
1066							vRecursos[t].mostrar();
1067					} else if (ruteCircles[2].getBounds().contains(vRecursos[t].marker.getPosition())){
1068							vRecursos[t].mostrar();
1069					}
1070				}
1071			}
1072		}
1073	}
1074	jQuery("#div_tree_loading_filtros").css("display", "none");
1075}
1076
1077
1078/**
1079 * Carga y configuracion de overlays de recursos turisticos. Filtro por arbol de tipos de recurso.
1080 * Tiene en cuenta si alguno de los radares (posicion o ruta) estan activos, para
1081 * cargar solo los recursos en el area de influencia del radar, si no carga todos
1082 * recursos otenidos del servicio de recursos.
1083 *
1084 * @param data Datos obtenidos del servicio de recursos en la peticion. Objeto de la forma:
1085 * {"p":[{"n":[{"r":codigo_recurso,"t":tipo_recurso,"m":nombre_recurso,"y":latitud,"x":longitud},...]}]}
1086 *
1087 * Ej. {"p":[{"n":[{"r":"5101","t":"D2","m":"DONOSTIA&#45;SAN&#32;SEBASTI&#193;N","y":"43.320725","x":"-1.984449"},
1088 * {"r":"5686","t":"D2","m":"ANDOAIN","y":"43.2204799","x":"-2.0211221"},
1089 * {"r":"5699","t":"D2","m":"BERNEDO","y":"42.626684","x":"-2.497532"}]}]}
1090 * Pinta lo que recogemos de JSON
1091 */
1092
1093function prepareResourcesLL(data){ // no entra en /rutas ni en contenido agenda
1094
1095	if (data.p.n) {
1096		for (var t = 0; t < data.p.n.length; t++) {		
1097			vRecursos[t] = new RecursoTuristicoSimple(data.p.n[t],eVisitarMap);
1098		}
1099
1100		if (!isRadarActive()) { // Si no hay ningun filtro adicional de radar se muestran todos los puntos
1101			for (var t = 0; t < vRecursos.length; t++) {
1102				vRecursos[t].mostrar();
1103				
1104			}
1105		} else { // Si hay un filtro adicional solo se muestran aquellos puntos que se encuentren dentro del area fijada
1106			if (circle != null) {
1107				for (var t = 0; t < vRecursos.length; t++) {
1108					if (google.maps.geometry.spherical.computeLength([circle.getCenter(), vRecursos[t].marker.getPosition()]) < radiusInKm*1000 ) {
1109						vRecursos[t].mostrar();
1110					}
1111				}
1112			}
1113
1114			if (ruteCircles.length > 0) { //Se muestran los recursos que se encuentren dentro del halo (polígono + círculos de inicio y fin de ruta)
1115				for (var t = 0; t < vRecursos.length; t++) {
1116					if (google.maps.geometry.poly.containsLocation(vRecursos[t].marker.getPosition(), ruteCircles[0])) {
1117							vRecursos[t].mostrar();
1118					} else if (ruteCircles[1].getBounds().contains(vRecursos[t].marker.getPosition())){
1119							vRecursos[t].mostrar();
1120					} else if (ruteCircles[2].getBounds().contains(vRecursos[t].marker.getPosition())){
1121							vRecursos[t].mostrar();
1122					}
1123				}
1124			}
1125		}
1126	}
1127	jQuery("#div_tree_loading_filtros").css("display", "none");
1128
1129}
1130
1131/**
1132 * Carga y configuracion de overlays de recursos turisticos. Filtro por formulario.
1133 * Tiene en cuenta si alguno de los radares (posicion o ruta) estan activos, para
1134 * cargar solo los recursos en el area de influencia del rada, si no carga todos
1135 * recursos otenidos del servicio de recursos.
1136 *
1137 * @param data Datos obtenidos del servicio de recursos en la peticion. Objeto de la forma:
1138 * {"p":[{"n":[{"r":codigo_recurso,"t":tipo_recurso,"m":nombre_recurso,"y":latitud,"x":longitud},...]}]}
1139 *
1140 * Ej. {"p":[{"n":[{"r":"5101","t":"D2","m":"DONOSTIA&#45;SAN&#32;SEBASTI&#193;N","y":"43.320725","x":"-1.984449"},
1141 * {"r":"5686","t":"D2","m":"ANDOAIN","y":"43.2204799","x":"-2.0211221"},
1142 * {"r":"5699","t":"D2","m":"BERNEDO","y":"42.626684","x":"-2.497532"}]}]}
1143 * Pinta lo que recogemos de JSON
1144 */
1145
1146
1147//Prepare resources filter Leaflet
1148
1149// creo que no se usa
1150function prepareResourcesFiltroLL(data) { // entro /rutas 4 veces con solo 1 resultado
1151
1152	
1153	if (data.p.n) {
1154		for (var t = 0; t < data.p.n.length; t++) {		
1155			vRecursosFiltro[t] = new RecursoTuristicoSimple(data.p.n[t],eVisitarMap);
1156		}
1157
1158		// Si no hay ningun filtro adicional de radar se muestran todos los puntos
1159		if (!isRadarActive()) {
1160			for (var t = 0; t < vRecursosFiltro.length; t++) {
1161				vRecursosFiltro[t].mostrar();
1162			}
1163		} else {
1164			// Si hay un filtro adicional solo se muestran aquellos puntos que se encuentren dentro del area fijada
1165			if (circle != null) {
1166				for (var t = 0; t < vRecursosFiltro.length; t++) {
1167					if (google.maps.geometry.spherical.computeLength([circle.getCenter(), vRecursosFiltro[t].marker.getPosition()]) < radiusInKm*1000 ) {
1168						vRecursosFiltro[t].mostrar();
1169					}
1170				}
1171			}
1172
1173			if (ruteCircles.length > 0) {
1174				//Se muestran los recursos que se encuentren dentro del halo (polígono + círculos de inicio y fin de ruta)
1175				for (var t = 0; t < vRecursos.length; t++) {
1176					if (google.maps.geometry.poly.containsLocation(vRecursos[t].marker.getPosition(), ruteCircles[0])) {
1177							vRecursos[t].mostrar();
1178					} else if (ruteCircles[1].getBounds().contains(vRecursos[t].marker.getPosition())){
1179							vRecursos[t].mostrar();
1180					} else if (ruteCircles[2].getBounds().contains(vRecursos[t].marker.getPosition())){
1181							vRecursos[t].mostrar();
1182					}
1183				}
1184			}
1185		}
1186	}
1187	jQuery("#div_tree_loading_filtros").css("display", "none");
1188
1189}
1190
1191/**
1192 * Crea los controles del mapa.
1193 *
1194 * 	- menu opciones
1195 * 	- boton panoramio
1196 *
1197 * Estos datos estan configurados en el objeto MAP_CONFIG.
1198 *
1199 * @param r_map mapa en el que se cargaron los controles. Objeto google.maps.Map
1200 *
1201 */
1202function createControls(r_map) {
1203	var mapControls = document.createElement("div");
1204	mapControls.style.marginTop = "5px";
1205
1206	var mapControns_view = ["<ul id=\"jsddm\">",
1207		"<li onmouseover=\"gmenuOpen(this);\" onmouseout=\"gmenuClose(this);\"><a href=\"javascript:void()\" >",
1208			getLabel(MAP_CONFIG.action),
1209		"&nbsp;<img src=\"" + getLabel(MAP_CONFIG.resources_path) + "/flechadesplegar.gif\" border=\"none\"/></a>",
1210		"<ul>",
1211		createActionsMenu(MAP_CONFIG.action.actions),
1212		  
1213		"</ul>", 
1214		
1215		"</ul>"].join('');
1216
1217	mapControls.innerHTML = mapControns_view;
1218
1219	mapControls.index = 1;
1220	r_map.controls[google.maps.ControlPosition.TOP_RIGHT].push(mapControls);
1221}
1222
1223/**
1224 * Funcion que gestiona los controles de menu, en este caso visualiza el menu.
1225 *
1226 * @param element menu seleccionado.
1227 *
1228 */
1229function gmenuOpen(element) {
1230	if (element.getElementsByTagName("ul").length > 0) {
1231		element.getElementsByTagName("ul")[0].style.visibility = "visible";
1232	}
1233}
1234
1235/**
1236 * Funcion que gestiona los controles de menu, en este caso oculta el menu.
1237 *
1238 * @param element menu seleccionado.
1239 *
1240 */
1241function gmenuClose(element) {
1242	if (element.getElementsByTagName("ul").length > 0) {
1243		element.getElementsByTagName("ul")[0].style.visibility = "hidden";
1244	}
1245}
1246
1247/**
1248 * Crea el control de menu acciones desde el objeto MAP_CONFIG.
1249 *
1250 * @param elements objeto que representa la lista de acciones a cargar en el menu. Array de objetos de la forma:
1251 * [{label: idiomatico, name: nombre_defecto, action: llamada_funcion, icon: ruta_icono},...]
1252 *
1253 */
1254function createActionsMenu(elements) {
1255	var output = "";
1256
1257	for (var t = 0; t < elements.length; t++) {
1258		output += ["<li><a href=\"javascript: ",
1259		 elements[t].action,
1260		 "\">",
1261		 "<img src=\"",
1262		 getLabel(MAP_CONFIG.resources_path) +"/" + elements[t].icon,
1263		 "\" border=\"none\"/>&nbsp;",
1264		 getLabel(elements[t]),
1265		 "</a></li>"].join('');
1266	}
1267	return output;
1268}
1269
1270/**
1271 * Utilidad para obtener el valor de una constante cargada desde el servidor o un
1272 * valor por defecto.
1273 *
1274 * El metodo, admite cualquier objeto que exponga las propiedades label y name.
1275 *
1276 * 	- label 	es la etiqueta generada por el servidor a calcular.
1277 * 	- name		es el valor que se empleara por defecto en caso de no encontrar la
1278 * 				etiqueta.
1279 *
1280 * @param element cualquier objeto de la forma {label: xx, name: yy, ....}
1281 *
1282 * @return El valor de la etiqueta o el valor por defecto proporcionado por name.
1283 */
1284function getLabel(element) {
1285	if (element.label) {
1286		return eval(element.label);
1287	}
1288	return element.name;
1289}
1290
1291/**
1292 * Limpia todos los elementos cargados en el mapa.
1293 *
1294 * 	- Elimina la ruta del usuario si esta cargada.
1295 * 	- Limpia la seleccion del arbol de recuros.
1296 *
1297 */
1298function limpiarTodo() {
1299	removeRute();
1300	for (var t = 0; t < vRecursos.length; t++) {
1301		vRecursos[t].borrar();
1302	}
1303	vRecursos = [];
1304	resource_types = "";
1305	var divtree = document.getElementById("div_tree");
1306	gPeticionEnCurso = true; // ponemos flag para q no haga peticiones al deschequear items del tree
1307	gPeticionSolicitante = null;
1308
1309	// recorro los hijos del divtree para descheckearlos
1310	for (var i = 0; i < divtree.childNodes.length; i++) {
1311		for (var j = 0; j < divtree.childNodes[i].childNodes.length; j++) {
1312			try {				
1313  				webFXTreeHandler.all[divtree.childNodes[i].childNodes[j].id.replace('-cont','')].setChecked(false); 			
1314			} catch(err) {
1315		}
1316  	}
1317  }
1318
1319  if (infoWindowRecurso) {
1320		infoWindowRecurso.borrar();
1321		infoWindowRecurso = null;
1322		borrarInfoWindowRecurso = false;
1323	}
1324
1325	gPeticionEnCurso = false;
1326}
1327
1328
1329
1330//Ya no lo usamos
1331
1332/*****************************************************************************
1333 *
1334 * 				TRATAMIENTO DE RUTAS
1335 *
1336 *
1337 ****************************************************************************/
1338
1339/**
1340 * Inicializa una ruta desde los botones Desde/Hasta de las ventanas de informacion
1341 * de los recursos turisticos.
1342 *
1343 * Visualiza el tab de rutas y carga la informacion adecuada para que el usuario
1344 * continue la configuracion de la ruta.
1345 *
1346 * @param name nombre del recurso
1347 * @param lat latitud del recurso
1348 * @param lng longitud del recurso
1349 * @param isFrom indica si la peticion provienen del enlace Desde (isFrom=true), en
1350 * caso contrario lo considera enlace Hasta (isFrom=false).
1351 *
1352 */
1353
1354// creo que no se usa
1355function refreshResourceRuteFromTo(name, lat, lng, isFrom) {
1356	//removeRute();
1357	infoWindow.close();
1358
1359	if (isFrom) {
1360		document.getElementById("INPUT_RUTA_ORIGEN").value = name;
1361		r_start = new google.maps.LatLng(lng, lat);
1362		r_start_o = new google.maps.Marker({
1363			position: r_start,
1364			icon: new google.maps.MarkerImage(getLabel(MAP_CONFIG.resources_path) + "/icon_greenA.png", new google.maps.Size(24,38), new google.maps.Point(0,0), new google.maps.Point(12,38)),
1365			shadow: new google.maps.MarkerImage(getLabel(MAP_CONFIG.resources_path) + "/shadow_iconOrigenDestino.png", new google.maps.Size(44,38), new google.maps.Point(0,0), new google.maps.Point(12,38)),
1366			title: Encoder.htmlDecode(name)
1367		});
1368		r_start_o.setMap(r_map);
1369	} else {
1370		document.getElementById("INPUT_RUTA_DESTINO").value = name;
1371		r_end = new google.maps.LatLng(lng, lat);
1372		r_end_o = new google.maps.Marker({
1373			position: r_end,
1374			icon: new google.maps.MarkerImage(getLabel(MAP_CONFIG.resources_path) + "/icon_greenB.png", new google.maps.Size(24,38), new google.maps.Point(0,0), new google.maps.Point(12,38)),
1375			shadow: new google.maps.MarkerImage(getLabel(MAP_CONFIG.resources_path) + "/shadow_iconOrigenDestino.png", new google.maps.Size(44,38), new google.maps.Point(0,0), new google.maps.Point(12,38)),
1376			title: Encoder.htmlDecode(name)
1377		});
1378		r_end_o.setMap(r_map);
1379	}
1380
1381	cambiarTab('mtabRutas');
1382}
1383
1384/**
1385 * Realiza una peticion al servicio Directions del api, con los datos proporcionados.
1386 * Si faltan datos o no se puede calcular la ruta lanza mensajes de advertencia.
1387 *
1388 */
1389function calculateRute() {
1390	var start = document.getElementById("INPUT_RUTA_ORIGEN").value;
1391	var end = document.getElementById("INPUT_RUTA_DESTINO").value;
1392
1393	if (start == "" || end == "" || start == CONST_LABEL_ORIGEN || end == CONST_LABEL_DESTINO) {
1394		alert(CONST_LABEL_ERRORCAMPOSRUTA);
1395		return;
1396	}
1397
1398	if (r_start_o == null) {
1399		r_start = start;
1400	}
1401
1402	if (r_end_o == null) {
1403		r_end = end;
1404	}
1405
1406	var request = {
1407		origin: r_start,
1408		destination: r_end,
1409		travelMode: google.maps.DirectionsTravelMode.DRIVING,
1410		region: "es"
1411	};
1412
1413	directionsService.route(request, function(response, status) {
1414  	if (status == google.maps.DirectionsStatus.OK) {
1415  		if (r_start_o) {
1416  			r_start_o.setMap(null);
1417  			r_start_o = null;
1418  		}
1419
1420  		if (r_end_o) {
1421  			r_end_o.setMap(null);
1422  			r_end_o = null;
1423  		}
1424
1425  		directionsDisplay.setDirections(response);
1426		directionsDisplay.setMap(r_map);
1427  		directionsDisplay.setPanel(document.getElementById("DIV_RUTA_INFORME"));
1428    } else {
1429  		alert(CONST_LABEL_ERRORCALCULARRUTA);
1430  		r_start = null;
1431  		r_end = null;
1432  	}
1433  });
1434}
1435
1436/**
1437 * Elimina la ruta cargada en el mapa, si se ha creado un radar asociado a la ruta,
1438 * este es eliminado.
1439 *
1440 */
1441function removeRute() {
1442
1443	directionsDisplay.setMap(null);
1444	directionsDisplay.setPanel(null);
1445	directionsDisplay = new google.maps.DirectionsRenderer({draggable: true});
1446
1447	google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
1448		document.getElementById("INPUT_RUTA_ORIGEN").value = directionsDisplay.directions.routes[0].legs[0].start_address;
1449		document.getElementById("INPUT_RUTA_DESTINO").value = directionsDisplay.directions.routes[directionsDisplay.directions.routes.length-1].legs[directionsDisplay.directions.routes[directionsDisplay.directions.routes.length-1].legs.length-1].end_address;
1450	});
1451
1452	document.getElementById("INPUT_RUTA_ORIGEN").value = CONST_LABEL_ORIGEN;
1453	document.getElementById("INPUT_RUTA_DESTINO").value = CONST_LABEL_DESTINO;
1454	r_start = null;
1455	r_end = null;
1456	if (r_start_o) {
1457		r_start_o.setMap(null);
1458	}
1459
1460	if (r_end_o) {
1461		r_end_o.setMap(null);
1462	}
1463
1464	if (ruteCircles.length > 0) {
1465		for (var t = 0; t < ruteCircles.length; t++) {
1466			ruteCircles[t].setMap(null);
1467		}
1468
1469		ruteCircles = [];
1470		getMapData(null);
1471	}
1472}
1473
1474/**Rutas a pié*/
1475
1476function calculateWalkingRute() {
1477	var start = document.getElementById("INPUT_RUTA_ORIGEN").value;
1478	var end = document.getElementById("INPUT_RUTA_DESTINO").value;
1479
1480	if (start == "" || end == "" || start == CONST_LABEL_ORIGEN || end == CONST_LABEL_DESTINO) {
1481		alert(CONST_LABEL_ERRORCAMPOSRUTA);
1482		return;
1483	}
1484
1485	if (r_start_o == null) {
1486		r_start = start;
1487	}
1488
1489	if (r_end_o == null) {
1490		r_end = end;
1491	}
1492
1493	var request = {
1494		origin: r_start,
1495		destination: r_end,
1496		travelMode: google.maps.DirectionsTravelMode.WALKING,
1497		region: "es"
1498	};
1499
1500  directionsService.route(request, function(response, status) {
1501  	if (status == google.maps.DirectionsStatus.OK) {
1502  		if (r_start_o) {
1503  			r_start_o.setMap(null);
1504  			r_start_o = null;
1505  		}
1506
1507  		if (r_end_o) {
1508  			r_end_o.setMap(null);
1509  			r_end_o = null;
1510  		}
1511
1512  		directionsDisplay.setDirections(response);
1513  		directionsDisplay.setMap(r_map);
1514  		directionsDisplay.setPanel(document.getElementById("DIV_RUTA_INFORME"));
1515    } else {
1516  		alert(CONST_LABEL_ERRORCALCULARRUTA);
1517  		r_start = null;
1518  		r_end = null;
1519  	}
1520  });
1521}
1522
1523/**Rutas servicio Público*/
1524
1525function calculateTransitRute() {
1526	var start = document.getElementById("INPUT_RUTA_ORIGEN").value;
1527	var end = document.getElementById("INPUT_RUTA_DESTINO").value;
1528
1529	if (start == "" || end == "" || start == CONST_LABEL_ORIGEN || end == CONST_LABEL_DESTINO) {
1530		alert(CONST_LABEL_ERRORCAMPOSRUTA);
1531		return;
1532	}
1533
1534	if (r_start_o == null) {
1535		r_start = start;
1536	}
1537
1538	if (r_end_o == null) {
1539		r_end = end;
1540	}
1541
1542	var request = {
1543		origin: r_start,
1544		destination: r_end,
1545		travelMode: google.maps.DirectionsTravelMode.TRANSIT,
1546		region: "es"
1547	};
1548
1549	directionsService.route(request, function(response, status) {
1550		if (status == google.maps.DirectionsStatus.OK) {
1551			if (r_start_o) {
1552				r_start_o.setMap(null);
1553				r_start_o = null;
1554			}
1555
1556			if (r_end_o) {
1557				r_end_o.setMap(null);
1558				r_end_o = null;
1559			}
1560	
1561			directionsDisplay.setDirections(response);
1562			directionsDisplay.setMap(r_map);
1563			directionsDisplay.setPanel(document.getElementById("DIV_RUTA_INFORME"));
1564		} else {
1565			alert(CONST_LABEL_ERRORCALCULARRUTA);
1566			r_start = null;
1567			r_end = null;
1568		}
1569	});
1570}
1571
1572
1573
1574
1575/**************/
1576/**************************************************************************
1577 *
1578 * 					RADARES
1579 *
1580 **************************************************************************/
1581
1582var radiusInKm = 1; // Radio alrededor del coche virtual. El poligono no es un circulo real, por eso el radio es una distancia estimada alrededor del coche.
1583
1584/**
1585 * Se llama cuando el usuario cambia el valor del radio del poligono que rodea al coche
1586 * cambiando el area de busqueda alrededor del coche para los puntos de interes.
1587 */
1588function changeRadius() {
1589	var tempradius = parseFloat(document.getElementById('radarRange').value);
1590
1591	if (isNaN(tempradius)) {
1592		radiusInKm = 1;
1593		document.getElementById('radarRange').value = radiusInKm;
1594	}
1595	else {
1596		radiusInKm = tempradius;
1597	}
1598
1599    startRadarsPosicion();
1600}
1601
1602/**
1603 * Se llama cuando el usuario cambia el valor del radio del poligono que rodea la ruta
1604 * cambiando el area de busqueda alrededor de la ruta para los puntos de interes.
1605 */
1606function changeRadiusRutas() {
1607  var tempradius = parseFloat(document.getElementById('radarRange2').value);
1608
1609	if (isNaN(tempradius)) {
1610		radiusInKm = 1;
1611		document.getElementById('radarRange2').value = radiusInKm;
1612	}
1613	else {
1614		radiusInKm = tempradius;
1615	}
1616
1617    startRadarsRutas();
1618}
1619
1620/**
1621 * Indica si hay algun radar activo.
1622 *
1623 * @return boolean indicando si algun radar esta activo.
1624 */
1625function isRadarActive() {
1626	if (ruteCircles.length > 0 || pointer != null) {
1627		return true;
1628	}
1629	return false;
1630}
1631
1632/**
1633 * Inicializa el radar de ruta
1634 *
1635 */
1636function startRadarsRutas() {
1637    // Determinar el rango en el que localizar recursos
1638	var i_distance = parseFloat(document.getElementById("radarRange2").value);
1639
1640	if (i_distance != NaN) {
1641		range = i_distance * 1000;
1642	} else {
1643		range = 0;
1644	}
1645        
1646    clearPointerRadar();
1647	if (ruteCircles.length > 0) {
1648		for(var t = 0; t < ruteCircles.length; t++) {
1649			ruteCircles[t].setMap(null);
1650		}
1651	}
1652	if (directionsDisplay.getDirections()) {
1653		var rutePoints = directionsDisplay.getDirections().routes[0].overview_path;
1654		ruteCircles = [];
1655		var PointsIzquierda = new Array();
1656		var PointsDerecha = new Array();
1657		var polygonPoints = new Array();
1658
1659		for (var t = 0; t < rutePoints.length-1; t++) {
1660			// Se calculan los ángulos
1661			var heading1 = google.maps.geometry.spherical.computeHeading(rutePoints[t], rutePoints[t+1])+90;
1662			var heading2 = google.maps.geometry.spherical.computeHeading(rutePoints[t], rutePoints[t+1])+270;
1663			// Se calculan los puntos vértices del polígono que rodea a la recta
1664			var endPoint1 = google.maps.geometry.spherical.computeOffset(rutePoints[t], range, heading1);
1665			var endPoint2 = google.maps.geometry.spherical.computeOffset(rutePoints[t], range, heading2);
1666			var endPoint3 = google.maps.geometry.spherical.computeOffset(rutePoints[t+1], range, heading1);
1667			var endPoint4 = google.maps.geometry.spherical.computeOffset(rutePoints[t+1], range, heading2);
1668			// Se añaden los puntos en 2 arrays, 2 a la izquierda y 2 a la derecha
1669			PointsIzquierda.push(endPoint1);
1670			PointsDerecha.push(endPoint2);
1671			PointsDerecha.push(endPoint4);
1672			PointsIzquierda.push(endPoint3);
1673		}
1674		// Se recorren los arrays de puntos para añadirlos al array de puntos que se pintan en el polígono halo.
1675		// El array de los puntos de la derecha se recorre en orden inverso
1676		for (var u = 0; u < PointsIzquierda.length; u++) {
1677			polygonPoints.push(PointsIzquierda[u]);
1678		}
1679		for (var v = 0; v < PointsDerecha.length; v++) {
1680			var n = PointsDerecha.length - v;
1681			polygonPoints.push(PointsDerecha[n-1]);
1682		}
1683		// Se pinta el polígono
1684		ruteCircles.push(new google.maps.Polygon({
1685			clickable: false,
1686			strokeColor: "#FFFF00",
1687			strokeOpacity: 0.01,
1688			strokeWeight: 3,
1689			fillColor: "#FFFF00",
1690			fillOpacity: 0.3,
1691			map: r_map,
1692			path: polygonPoints
1693		}));
1694		//Se pinta un círculo en cada extremo de la ruta
1695		ruteCircles.push(new google.maps.Circle({
1696			map: r_map,
1697			center: rutePoints[0],
1698			radius: range,
1699			strokeColor: "#FFFF00",
1700			strokeOpacity: 0.01,
1701			fillColor: "#FFFF00",
1702			fillOpacity: 0.3
1703        }));
1704		ruteCircles.push(new google.maps.Circle({
1705			map: r_map,
1706      		center: rutePoints[rutePoints.length-1],
1707      		radius: range,
1708      		strokeColor: "#FFFF00",
1709      		strokeOpacity: 0.01,
1710      		fillColor: "#FFFF00",
1711      		fillOpacity: 0.3
1712        }));
1713	}
1714	
1715	getMapData(null);
1716}
1717
1718/**
1719 * Inicializa el radar de posicion
1720 *
1721 */
1722function startRadarsPosicion() {
1723    var i_distance = parseFloat(document.getElementById("radarRange").value);
1724    
1725	if (i_distance != NaN) {
1726		range = i_distance * 1000;
1727	} else {
1728		range = 0;
1729	}
1730        
1731	if (ruteCircles.length > 0) {
1732		for(var t = 0; t < ruteCircles.length; t++) {
1733			ruteCircles[t].setMap(null);
1734		}
1735
1736		ruteCircles = [];
1737	}
1738
1739	/*
1740	 * Crear circulo de radio adecuado y unirlo a un markador dragable,
1741	 * si existe un pointer ya creado, eliminarlo antes de crear el
1742	 * nuevo.
1743	 */
1744	// creo que no se usa
1745	clearPointerRadar();
1746        var arrastras = '';
1747	pointer = new google.maps.Marker({
1748		map: r_map,
1749		position: r_map.getCenter(),
1750		draggable: true,
1751		icon: getLabel(MAP_CONFIG.resources_path) + "/Poi-27x27.png",
1752		title: 'Drag me!' 
1753	});
1754
1755	google.maps.event.addListener(pointer, 'dragend', function() {
1756		getMapData(null);
1757	});
1758
1759	if (range != 0) {
1760		 circle = new google.maps.Circle({
1761			 map: r_map,
1762			 radius: range,
1763			 fillOpacity: 0.2,
1764			 strokeWeight: 0
1765		});
1766
1767		circle.bindTo('center', pointer, 'position');
1768    }
1769 
1770    getMapData(null);  
1771}
1772
1773/**
1774 * Elimina el radar de posicion.
1775 */
1776function deleteRadarsPosicion(){   
1777    document.getElementById("radarRange").value = "";
1778    changeRadius();
1779    
1780}
1781
1782/**
1783 * Elimina el radar de ruta.
1784 */
1785function deleteRadarsRute() {   
1786    document.getElementById("radarRange2").value = "";
1787    changeRadiusRutas();    
1788}
1789
1790/**
1791 * Elimina el radar de posición.
1792 */
1793function clearPointerRadar() {
1794	if (pointer != null) {
1795		pointer.setMap(null);
1796		pointer = null;
1797	}
1798
1799	if (circle != null) {
1800		circle.setMap(null);
1801		circle = null;
1802	}
1803}
1804
1805/*
1806 * Centra el mapa en la direccion introducida en el campo "direccionLugar" e inicializa el radar de posicion
1807 */
1808function initialize() { 
1809	var geocoder = new google.maps.Geocoder();
1810	var address = document.getElementById("direccionLugar").value;
1811
1812	geocoder.geocode( {'address': address}, function(results, status) {
1813		if (status == google.maps.GeocoderStatus.OK) {
1814			r_map.setCenter(results[0].geometry.location);		
1815			startRadarsPosicion();
1816		}
1817	})  
1818}
1819 
1820jQuery(document).ready(function() {
1821	jQuery("#direccionLugar").keyup(function(event) {
1822		if (event.keyCode == 13) {
1823			initialize();			
1824		}
1825	});
1826})

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.