/**
 * Google Map instance (of <kbd>GMap2</kbd> class).
 */
var map = null;

/**
 * Instance of GClientGeocoder.
 */
var geocoder = null;

/**
 * Instance of directions.
 */
var routing;

/**
 * Inicializar el mapa.
 *
 * @return
 * @type void
 */
function initGoogleMap() {
	if (!GBrowserIsCompatible()) {
		return;
	}
    map = new GMap2(document.getElementById("maparea"));
    if (map == null) {
    } else {
	    //map.addControl(new GLargeMapControl());
	    var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(80,10));
    	map.addControl(new GMapTypeControl(),topRight);
    	//map.addControl(new GSmallZoomControl());
    	map.addControl(new GSmallMapControl());
    	map.setCenter(new GLatLng(40.206764, -3.713379), 6);
    	geocoder = new GClientGeocoder();
    	map.enableScrollWheelZoom();
    	//map.enableGoogleBar();
    }
}

/**
 * Procesar el documento xml con los puntos no geocodificados para realizar llamada recursiva y georeferenciarlos con google.
 *
 * @param {XML.ObjTree} kml Documento xml con los puntos a geocodificar.
 * @return
 * @type void
 */
function procesarKml(kml) {
	if (typeof(kml.kml.Document.Placemark) == 'undefined') {
		geocodificarPunto(kml, 0, 0, false, false);
	} else {
		geocodificarPunto(kml, 0, kml.kml.Document.Placemark.length, false, false);
	}
}

/**
 * Busca los puntos que no se han cotejado en la bd. 
 *
 * @param {XML.ObjTree} kml Documento xml con los puntos a geocodificar.
 * @param {int} i Posicion del array de puntos a geocodificar.
 * @param {int} maximo Longitud maxima del array de puntos a geocodificar.
 * @param {int} segundaBusqueda Buscar una segunda vez pasando solamente la localidad y la provincia.
 * @param {int} terminar Despues de ejecutar una segunda vez y no encontrarla, terminar la busqueda y buscar otro punto.
 * @return
 * @type void
 */
function geocodificarPunto(kml, i, maximo, segundaBusqueda, terminar) {
	//si se sobrepasa el maximo, terminar.
	if (i < maximo) {
		//geocodificar
		//Si no encuentra el punto, continuar con el siguiente punto para llegar al maximo.
		if (typeof(kml.kml.Document.Placemark[i]) == 'undefined') {
			geocodificarPunto(kml, i + 1, maximo, false, false);
		} else {
			//encontrar geoposicion.
			var desc;
			desc = kml.kml.Document.Placemark[i].description;
			
			var cadenaInicioInformacion = "<div style='display: none;'>";
			var cadenaFinInformacion = "</div>";
			
			desc = desc.replace(/&lt;/g,"<");
			desc = desc.replace(/&gt;/g,">");
			desc = desc.replace(/&apos;/g,"'");
			
			var descripcion = desc.substring(
								desc.indexOf(cadenaInicioInformacion) + cadenaInicioInformacion.length,
								desc.indexOf(cadenaFinInformacion));
			
			//alert("Descripcion: " + descripcion);
			
			var inf = descripcion.split("***");
			
			var carretera = replaceChars(inf[2]);
			var localidad = replaceChars(inf[4]);
			var provincia = replaceChars(inf[5]);
			
			var direccion;
			
			//alert("Segunda busqueda? " + segundaBusqueda);
			
			if (segundaBusqueda == true) {
				direccion = localidad + "," + provincia;
			} else {
				if (carretera.indexOf("(") >= 0) {
					carretera = carretera.substring(0, carretera.indexOf("("));
				}
				
				direccion = carretera + "," + localidad + "," + provincia;
			}
			
			//alert("Direccion: " + direccion);
			
			if (geocoder) {
				geocoder.getLatLng(
					direccion,
					function(point) {
						//alert(!point);
						if (!point) {
							//alert("No encuentra direccion: " + direccion + "\n\tSegundaBusqueda: " + segundaBusqueda + "\n\tTerminar: " + terminar);
							if (terminar == false) {
								//alert("Entra para segunda busqueda: " + direccion + "\n\tSegundaBusqueda: " + segundaBusqueda + "\n\tTerminar: " + terminar);
								geocodificarPunto(kml, i, maximo, true, true);
							} else {
								//alert("Entra para eliminar busqueda: " + direccion + "\n\tSegundaBusqueda: " + segundaBusqueda + "\n\tTerminar: " + terminar);
								//punto no encontrado, eliminar
								kml.kml.Document.Placemark[i].Point.coordinates = "-1000.0,-1000.0,0.0";
								kml.kml.Document.Placemark.splice(i,1);
								geocodificarPunto(kml, i, maximo, false, false);
							}
						} else {
							//encontrado, anadir al documento
							kml.kml.Document.Placemark[i].Point.coordinates = point.lng() + "," + point.lat() + ",0.0";
							geocodificarPunto(kml, i + 1, maximo, false, false);
						}
					}
				);
			}
		}
		
	} else {
		//fin, pasar a informeTrafico.
		informeTrafico(kml, false);
	}
}
