var map;
    var gdir;
    var geocoder = null;
    var addressMarker;


    function initializeMapSingleDiv(gps,elementDiv, contextRoot) {
    	ll = gps.split(',');
      if (GBrowserIsCompatible()) {    	
        map = new GMap2(elementDiv);
        map.setMapType(G_NORMAL_MAP);
        // Centra el mapa en unas coordenadas determinadas 
        //con un nivel de zoom (15)
        map.setCenter(new GLatLng(ll[0], ll[1]), 13);
        // Crea un punto.
        var point = new GLatLng(ll[0], ll[1]);
        // Pinta el punto en el mapa
        map.addOverlay(new GMarker(point));
        // Define los controles que se veran sobre el mapa
        map.addControl(new GLargeMapControl());
        var mapControl = new GMapTypeControl();
        map.addControl(mapControl);
  
        //Asociamos el div 'directions' a las direcciones que 
        //devolverá Google Maps
       // gdir = new GDirections(map, document.getElementById("directions"));
        //Listener para los errores que se produzcan cuando procese la petición
        //GEvent.addListener(gdir, "error", handleErrors);
      }
    }
    
    function initializeMapSingle(gps, contextRoot) {
    	ll = gps.split(',');
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"),{ size: new GSize(620,400) });
        map.setMapType(G_NORMAL_MAP);
        // Centra el mapa en unas coordenadas determinadas 
        //con un nivel de zoom (15)
        map.setCenter(new GLatLng(ll[0],ll[1]), 13);
        // Crea un punto.
        var point = new GLatLng(ll[0],ll[1]);
        // Pinta el punto en el mapa
        map.addOverlay(new GMarker(point));
        // Define los controles que se veran sobre el mapa
        map.addControl(new GLargeMapControl());
        var mapControl = new GMapTypeControl();
        map.addControl(mapControl);
      }
    }

    function initializeMapMini(gps) {
    	ll = gps.split(',');
      if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        map.setMapType(G_NORMAL_MAP);
        // Centra el mapa en unas coordenadas determinadas 
        //con un nivel de zoom (15)
        map.setCenter(new GLatLng(ll[0], ll[1]),5);
        // Crea un punto.
        //var point = new GLatLng(ll[0], ll[1]);
        // Pinta el punto en el mapa
        //map.addOverlay(new GMarker(point));
        // Define los controles que se veran sobre el mapa
        //map.addControl(new GLargeMapControl());
        //var mapControl = new GMapTypeControl();
        //map.addControl(mapControl);
        //Asociamos el div 'directions' a las direcciones que 
        //devolverá Google Maps
       // gdir = new GDirections(map, document.getElementById("directions"));
        //Listener para los errores que se produzcan cuando procese la petición
        GEvent.addListener(gdir, "error", handleErrors);
      }
    }
    
    //Función encargada de calcular la ruta con el API de Maps
    function setDirections(fromAddress) {
      gdir.load("from: " + fromAddress + " to: @40.420603, -3.688649",
                { "locale": "es" });
        //Como es de suponer la opción locale:es hace que la ruta que  
        //nos escriba esté en español.
    }

    //Manejo de errores
    function handleErrors(){
       if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
         alert("No se puede calcular la ruta desde la dirección indicada, compruebe que está bien escrita o esta no sa ambigua");
       else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
         alert("Error desconocido");

       else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
         alert("No se ha introducido una dirección de inicio");

       else if (gdir.getStatus().code == G_GEO_BAD_KEY)
         alert("Clave usada por el mapa no valida o no corresponde con el dominio desde el que se usa.");

       else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
         alert("La dirección no puede ser parseada.");

       else alert("oppps ha ocurrido un error :(.");

    }

    function onGDirectionsLoad(){ 
    }
    
    
    function initializeMap() {
      	if (GBrowserIsCompatible()) {
      	    map = new GMap2(document.getElementById("map_canvas_searchResults"));
      		map.setMapType(G_NORMAL_MAP);
	        map.addControl(new GSmallMapControl());
        	return map;
		}
	}
	
	
    
    function addLodgingMarker(map, gps, identificador, contextRoot) {
      ll = gps.split(',');
      if (GBrowserIsCompatible()) {
        var point = new GLatLng(ll[0], ll[1]);
      	if (map == null) {
        	map = initializeMap();
        }
      	
      	var marker = createMarker(point, identificador, 'default', contextRoot);
//      GEvent.addListener(marker, "mouseover", function() {
//		    marker.openInfoWindowHtml("texto ejemplo");  
//		});  
      	map.addOverlay(marker);
      }
    	
    }
    
    function createMarker(point, identificador, tipoimg, contextRoot) {
		var baseIcon = new GIcon();
		
		baseIcon.iconAnchor = new GPoint(9, 34);
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
		baseIcon.infoShadowAnchor = new GPoint(18, 25);
		
		var letteredIcon = new GIcon(baseIcon);
		switch(tipoimg){			
			default: //Para busquedas
				letteredIcon.iconSize = new GSize(20, 34);
				letteredIcon.image = contextRoot + "/img/markers/marker" + identificador + ".png";
		}
		// Set up our GMarkerOptions object
		markerOptions = { icon:letteredIcon };
		var marker = new GMarker(point, markerOptions);
							
		return marker;
    }
   
	function centerMap(map, arrayX, arrayY){
				var xMedio= coordenadaMedio(arrayX,41.92475971933974);
				var yMedio= coordenadaMedio(arrayY,-0.54107666015625);
				var zOptimo= zoomOptimo(arrayX,arrayY,0.0026524443);
				map.setCenter(new GLatLng(xMedio,yMedio), zOptimo); 
	}
	
	function coordenadaMin(array_coords){
		var valor=0;		
		for(i=0;i<array_coords.length;i++){
			if(valor!=""){
				if (valor > array_coords[i]){
					valor = array_coords[i];
				}
			}else{
				valor = array_coords[i];
			}
		}
		return valor;
	}

	function coordenadaMax(array_coords){
		var valor='';
		for(i=0;i<array_coords.length;i++){
			if(valor!=""){
				if (valor < array_coords[i]){
					valor = array_coords[i];
				}
			}else{
				valor = array_coords[i];
			}
		}
		return valor;
	}

	function coordenadaMedio(array_coords, valorDefault){
		var resultado = valorDefault;
		if(array_coords.length>0){	
			var valormin = validarFloat(coordenadaMin(array_coords));
			var valormax = validarFloat(coordenadaMax(array_coords));
	
			if(valormin!='' && valormax!=''){
				if(valormax<0 && valormin<0){
					resultado = Redondear((valormin - valormax),4)/(-2) + valormin;
				}else{
					resultado = Redondear((valormax - valormin),4)/2 + valormin;
				}
				resultado = validarFloat(Redondear(resultado,7));
			}
		}
		return resultado;
	}
	
    function zoomOptimo(arrayX,arrayY,Constante){
		var Xmin= coordenadaMin(arrayX);
		var Xmax= coordenadaMax(arrayX);
		var Ymin= coordenadaMin(arrayY);
		var Ymax= coordenadaMax(arrayY);
		var aux1= Math.pow((Xmax -Xmin),2);
		var aux2= Math.pow((Ymax -Ymin),2);
		var distanciaXY = Math.sqrt(aux1+aux2);
		var	resultZoom = 17;
		
		if(distanciaXY==0){
			resultZoom = 14;
		}else{
			for(i=0;i<17-1;i++){
				if (distanciaXY > Constante * Math.pow(2,i)){
					resultZoom = 17 - 1 - i;
				}
			}
		}
	
		//Comprobemos resultado
		if (resultZoom < 0){
			resultZoom = 0;
		}
		return resultZoom;
	}
    
	function validarFloat(valor){
		if(valor!=0){
			valor = parseFloat(valor);
			if (isNaN(valor)) {
				return "";
			}
		}
		return valor;
	}
	function Redondear(x, places){
		return Math.round(x * Math.pow(10, places)) / Math.pow(10, places);
	}
	

    
