/*
########################################################
CLASE gmGeoLocalizar    -   2007-04-10
---
Utiliza la clase GClientGeocoder() de la API Google Maps
para geolocalizar múltiples direcciones a la vez.
--------------------------------------------------------
Agustín Roldán
agus@ntskoala.com
NTS Koala Global S.L.
www.ntskoala.com
########################################################

---

Funciones:

    addDireccion(dirstr)        - Añade la dirección <<dirstr>> a su colección.
    setDireccion(indice,dirstr) - Cambia la dirección de la lísta con índice <<indice>> a <<dirstr>>.
    countDirecciones            - Devuelve el número de direcciones de la colección.
    getDireccion(indice)        - Devuelve la dirección de la colección con índice <<indice>>.
    getLon(indice)              - Devuelve la Longitud de una dirección geolocalizada. Si la longitud es 0 y isGeocoded=1 significa que GM no ha podido determinar su ubicación.
    getLat(indice)              - Devuelve la Latitud de una dirección geolocalizada. Si la latitud es 0 y isGeocoded=1 significa que GM no ha podido determinar su ubicación.
    getGeo(indice)              - Devuelve la colección <<placemark>> de la clase GClientGeocoder() de la API de Google Maps referente a la dirección con índice <<indice>>.
    isGeocoded(indice)          - Determina si la dirección con índice <<indice>> se ha geolocalizado mediante GM. Devuelve 1 o true si es verdadero y 0 o false si es falso.
    onGeocode(funcion)          - Ejecuta la funcion <<funcion>> con un parámetro <<n>> cuando GM devuelve la dirección solicitada donde <<n>> es el índice de la dirección.
    onGeocodeAll(funcion)       - Ejecuta la función <<funcion>> cuando acaba de geolocalizar todas las direcciones de la colección.
    geocodeAll()                - Geolocaliza todas las direcciones de la colección de direcciones.
    
########################################################
*/
function gmGeoLocalizar(){	
	var direcciones;
	var formato='';
	var stautsCode=0;
	var gcActual=0;
	var request_count=0;
	var interval;
	var geocoder = new GClientGeocoder();
    var functionAfterGeocode=null;
	var functionAfterGeocodeAll=null;
	
	direcciones = new Array();
	
	this.callback=function() {};
  	
	this.registerCallback=function(callbackFunction) {    	
    	var f=this;
		  return function() {
		    f();callbackFunction();
		  }
  	}

    this.onGeocode = function(funcion){
        functionAfterGeocode = funcion;
    }
    
    this.onGeocodeAll = function(funcion){
        functionAfterGeocodeAll = funcion;
    }
  	
	
	this.addDireccion = function(dirstr){
		direcciones[direcciones.length]=new Array();
		direcciones[direcciones.length-1]["Direccion"]=dirstr;
		direcciones[direcciones.length-1]["Geocoded"]=false;
		direcciones[direcciones.length-1]["Geo"] = new Object();
		direcciones[direcciones.length-1]["Lat"]=0;
		direcciones[direcciones.length-1]["Lon"]=0;
	}
	
	this.clearDirecciones = function(){
		direcciones.length = 0;
	}
	
	this.countDirecciones = function(){
		return direcciones.length;
	}
	
	this.getDireccion = function(indice){
		return direcciones[indice]["Direccion"];
	}
	
	this.setDireccion = function(indice,dirstr){
		direcciones[indice]["Direccion"]=dirstr;
	}
	
	this.isGeocoded = function(indice){
		return direcciones[indice]["Geocoded"];
	}
	
	this.getLat = function(indice){		
		return direcciones[indice]["Lat"];
	}
	this.getLon = function(indice){
		return direcciones[indice]["Lon"];
	}
	
	this.getGeo = function(indice){
	    return direcciones[indice]["Geo"];
	}
	
	this.geocodeDireccion = function(indice){
		    var address = direcciones[indice]["Direccion"];		
		    try{
    			
			    if (document.getElementById("q")!=undefined){
    				
				    var theQ = document.getElementById("q");
				    var theForm = theQ.parentNode;
			    } else {
    				
				    //if (document.forms.count > 0){
					//    var theForm = document.forms[0];
				    //} else{
					    var theForm = document.createElement("FORM");
						theForm.id = "formGeocode";
						document.body.appendChild(theForm);
				    //}
				    var theQ = document.createElement("INPUT");
					theQ.type = "hidden";
					theForm.appendChild(theQ);
			    }
			    theQ.id = "q";
			    theQ.name = "q";
			    theQ.value = address;
    			
			    gcActual=indice;			
			    geocoder.getLocations(address, this.addAddressToMap);
    			
		    }
		    catch (err){
		    	//alert('Error: ' + err);	
		    }
		    //alert('Valor de q: ' + document.getElementById("gmap").q.value);
	}
	
	this.geocodeAll = function(postFunction){
		request_count=0;
		this.geocodeDireccion(0);
	}
	
	
	this.addAddressToMap = function(response) {	 
		if (!response || response.Status.code != 200) {	  	
		    //No consigue obtener la localización
		    //No le cambiamos el nombre puesto que no nos devuelve su nombre original		    
			direcciones[request_count]["Geocoded"]=1;
		    direcciones[request_count]["Lat"]=0;
		    direcciones[request_count]["Lon"]=0;
	  	} else {	  	
	  	    //Localización obtenida correctamente
		    place = response.Placemark[0];
		    direcciones[request_count]["Direccion"]=place.address;
		    direcciones[request_count]["Geocoded"]=1;
		    direcciones[request_count]["Geo"]=place;
		    direcciones[request_count]["Lat"]=place.Point.coordinates[1];
		    direcciones[request_count]["Lon"]=place.Point.coordinates[0];
		}
		//document.agmap.getObj
		request_count++;
		
		if (request_count < direcciones.length) {
			// Si hay una funcion como evento para cuando acabe de geolocalizar una dirección, la ejecuta:
		    if (functionAfterGeocode!=null) functionAfterGeocode(request_count-1);
		    
		    // Geolocalizamos la siguiente
		    geoDirs.geocodeDireccion(request_count);
		} else {
		    // Ha acabado de geolocalizar todas las direcciones
			
		    // Si hay una funcion como evento para cuando acabe de geolocalizar una dirección, la ejecuta:
		    if (functionAfterGeocode!=null) functionAfterGeocode(request_count-1);
		    
		    // Ejecuta la función como evento de fin de geolocalizar todas:
		    if (functionAfterGeocodeAll!=null) functionAfterGeocodeAll();
		}
		
	}
	
	
}