//google.load("maps","2");
var map;
var arraymarcadores = new Array();
var arraymarcadoresaislados = new Array();
var arrayareas = new Array();
var arraytmpmarcadoresarea  = new Array();
//en este aaray se definirán las lad, long y zoom de inicio por defecto
var arrayCoordIni = new Array();

var ruta;
var medio;
var indiceAreaEditar;
// collin es color de línea en formato HTML (Ej.#ff0000)
var collin  = "#ff0000";
// groslin es el grueso de la línea
var groslin = 2;
// opalin es un valor entre 0 y 1.
var opalin  = 1;
var opafon  = .7;
//Coordenadas de las provincias
var crdProv = new Array();

function Geoposicionando_Procesa_Punto(overlay,latlng){
    if (latlng) {
        var tipomarcador = obtenerValor("registro","flag_tipo");
        //SI Estamos marcando puntos aislados
        if(tipomarcador==1){
            // Dibujar el marcador
            var marcador = Dibujar_punto(latlng,"","",false,true);
            //Añadir el marcador a arraymarcadoresaislados
            arraymarcadoresaislados.push(marcador);
        //SI Estamos creando o editando un área
        }else if(tipomarcador==2){
            //Añadir el marcador a arraytmpmarcadoresarea
            if(arraytmpmarcadoresarea.length>0){
                // Dibujar un nuevo punto sobre el area
                var marcador = Dibujar_punto(latlng,"","",true,true,"area");
                if(arraytmpmarcadoresarea.length>0){
                    var ultimo=arraytmpmarcadoresarea.pop();
                    arraytmpmarcadoresarea.push(marcador);
                    arraytmpmarcadoresarea.push(ultimo);
                }else{
                    arraytmpmarcadoresarea.push(marcador);
                    arraytmpmarcadoresarea.push(marcador);
                }
            }else{
                // Dibujar un area
                var lat = latlng.lat();
                var lon = latlng.lng();
                var escala = 10000000;
                var zoomactual = map.getZoom();
                var resto = zoomactual%3;
                var exponente10 = zoomactual/3;
                if(resto==0){
                  resto=3;
                  exponente10 = exponente10-1;
                }
                var dividendo = escala/Math.pow(10,Math.floor(exponente10));
                var divisor = Math.pow(2,resto-1);
                escala = dividendo/divisor;
                var escalacadena = escala.toString();
                escala = parseFloat(escalacadena.substr(0,1) + '0' + escalacadena.substr(2));
                //alert('zoom=' + zoomactual + ' resto=' +resto + ' dividendo=' + dividendo+ ' divisor=' + divisor + ' escala=' + escala);
        //alert(escalacadena);
                var latOffset = escala/(2*111317);
                var lonOffset = escala/(2*111317);
                var marcador1 = Dibujar_punto(new google.maps.LatLng(lat + latOffset, lon - lonOffset),"","",true,true,"area");
                var marcador2 = Dibujar_punto(new google.maps.LatLng(lat + latOffset, lon + lonOffset),"","",true,true,"area");
                var marcador3 = Dibujar_punto(new google.maps.LatLng(lat - latOffset, lon + lonOffset),"","",true,true,"area");
                var marcador4 = Dibujar_punto(new google.maps.LatLng(lat - latOffset, lon - lonOffset),"","",true,true,"area");
                arraytmpmarcadoresarea.push(marcador1);
                arraytmpmarcadoresarea.push(marcador2);
                arraytmpmarcadoresarea.push(marcador3);
                arraytmpmarcadoresarea.push(marcador4);
                arraytmpmarcadoresarea.push(marcador1);
                //map.setZoom(8);
                map.panTo(latlng);
            }
            Actualizar_Vista_Area();
            mostrarDivArea();
        }
    }else{
        // Elimina un punto aislado
        Geoposicion_Borrar_punto(overlay);
    }
}


function Geoposicion_Borrar_punto(overlay){
    //BUSCAR EL MARCADOR QUE SE HA PULSADO EN ARRAY TEMPORAL DE MARCADORES Y PEDIR CONFIRMACIÓN PARA ELIMINARLO
    var arr;
    var encontrado;
    var ind;
    if (arraymarcadoresaislados){
        for (m=0;m<arraymarcadoresaislados.length;m++){
            var marcador=arraymarcadoresaislados[m];
            if (overlay===marcador){
                encontrado=marcador;
                arr=arraymarcadoresaislados;
                ind=m;
            }
        }
    }
    if (arraytmpmarcadoresarea){
        for (m=0;m<arraytmpmarcadoresarea.length;m++){
            var marcador=arraytmpmarcadoresarea[m];
            if (overlay===marcador){
                encontrado=marcador;
                arr=arraytmpmarcadoresarea;
                ind=m;
            }
        }
    }
    if (encontrado){
        // Si solo hay 4 puntos no dejaremos eliminarlo
        if(arr===arraytmpmarcadoresarea && arr.length==4){
            alert(LBL_3_PUNTOS);
        }else{
            if(confirm(LBL_ELIMINAR_MARCADOR)) {
                if((ind==0 || ind==arr.length-1) && arr===arraytmpmarcadoresarea){
                    // Elimina el primer punto
                    map.removeOverlay(0);
                    arr.shift();
                    // Elimina el ultimo punto
                    map.removeOverlay(arr[arr.length-1]);
                    arr.pop();
                    // Añade el ultimo punto al principio del arr
                    map.addOverlay(arr[arr.length-1]);
                    arr.unshift(arr[arr.length-1]);
                    Actualizar_Vista_Area();
                }else{
                    // Elimina el punto seleccionado
                    map.removeOverlay(encontrado);
                    arr.splice(ind,1);
                    if(arr===arraytmpmarcadoresarea){
                        Actualizar_Vista_Area();
                    }
                }
            }
        }
    }
}

function Dibujar_puntos(arraypuntos,color,arrmarcadores,arrastrable,clicable,vistaactualizar) {
    if(arraypuntos){
        //var letra = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
        for(i = 0; i < arraypuntos.length; i++){
            var marcador = Dibujar_punto(arraypuntos[i],color,"",arrastrable,clicable,vistaactualizar);
            if(arrmarcadores){
                //Añadir el marcador a arrmarcadores
                arrmarcadores.push(marcador);
            }
        }
    }
}


function Dibujar_punto(latlng,color,letra,arrastrable,clicable,vistaactualizar){
    var icono;
    var marcador;
    var iconOptions = {};

    if (color!="" && color!='null'){
        iconOptions.width = 32;
        iconOptions.height = 32;
        iconOptions.primaryColor = color;
        if(letra!="" && letra!='null'){
        	iconOptions.label = letra;
        }
        icono = MapIconMaker.createLabeledMarkerIcon(iconOptions)
        var opmarcador = { icon:icono,draggable:arrastrable,clickable:clicable };
        marcador = new google.maps.Marker(latlng,opmarcador);
    }else{
        var opmarcador= {draggable:arrastrable,clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }
    if (arrastrable){
      if(vistaactualizar=="ruta"){
          google.maps.Event.addListener(marcador,"dragend", Crear_Ruta_Dibujar_ruta);
      }else{
          google.maps.Event.addListener(marcador,"dragend", Actualizar_Vista_Area);
      }

    }
    map.addOverlay(marcador);
    return marcador;
}


function Dibujar_areas(arrayareasadibujar,color,clicable) {
    if(arrayareasadibujar){
        for(i=0;i<arrayareasadibujar.length;i++){
            Dibujar_area(arrayareasadibujar[i],color,i,clicable);
        }
    }
}

function Dibujar_area(arrvertices,colorfondo,indice,clicable){
    if (colorfondo!=""){
        colfon = colorfondo;
        collin = colorfondo;
    }else{
        colfon = "#FF0000";
        collin = "#FFFFFF";
    };
    var arrptos = new Array();
    for (v=0;v<arrvertices.length;v++){
        var punto = arrvertices[v];
        var puntolatlng = punto.getLatLng();
        arrptos.push(new google.maps.LatLng(puntolatlng.lat(),puntolatlng.lng()));
    }
    var poligono = new google.maps.Polygon(arrptos,collin,groslin,opalin,colfon,opafon);
    if(indice!=null && clicable){
        google.maps.Event.addListener(poligono,"click", function(latlng){
            map.openInfoWindowHtml(latlng,InfoWindowEditarArea(indice));
        });
    }
    // arrptos es el array de puntos que corresponden con los vértices del área.
    // GoogleMaps cerrará el polígono del último al primer punto.
    // collin y colfon son color de línea y de fondo en formato HTML (Ej.#ff0000)
    // groslin es el grueso de la línea de contorno del polígono
    // opalin y opafon son valores entre 0 y 1.
    map.addOverlay(poligono);
    return poligono;
}


function InfoWindowEditarArea(indicearea){
    var codigoHTML;
    codigoHTML = LBL_TEXTO_AREA_OPERACIONES;
    codigoHTML = codigoHTML + "<a href='javascript:Editar_area(" + indicearea +");'>Editar</a>&nbsp;" +
                 "<a href='javascript:Borrar_area(" + indicearea + ");'>Borrar</a>";
    return codigoHTML;
}


function Editar_area(indice){
    // Borra todos los objetos del mapa
    map.clearOverlays();
    indiceAreaEditar = indice;
    var arrvertices = arrayareas[indice];
    poligono = Dibujar_area(arrvertices,"");
    var arrptos = new Array();
    for (v=0;v<arrvertices.length-1;v++){
        var punto = arrvertices[v];
        var puntolatlng = punto.getLatLng();
        arrptos.push(new google.maps.LatLng(puntolatlng.lat(),puntolatlng.lng()));
    }
    Dibujar_puntos(arrptos,"",arraytmpmarcadoresarea,true,true,"area");
    arraytmpmarcadoresarea.push(arraytmpmarcadoresarea[0]);
    // Marca el radio del area
    document.registro.flag_tipo[1].checked="checked";
    mostrarDivArea();
}

function Borrar_area(indice){
    //arrayareas = new Array();
    arrayareas.splice(indice,1);
    Actualizar_Mapa();
}

function Guardar_area(){
    // Añadir al array de areas el tmp
    if(indiceAreaEditar!=null){
        arrayareas[indiceAreaEditar] = arraytmpmarcadoresarea;
    }else{
        arrayareas.push(arraytmpmarcadoresarea);
    }
    Cancelar();
}

function Cancelar(){
  indiceAreaEditar = null;
    // Borrar el arraytmpmarcadoresarea
    arraytmpmarcadoresarea = new Array();
    Actualizar_Mapa();
    // Marca el radio del area y muestra las opciones posibles
    document.registro.flag_tipo[1].checked="checked";
    mostrarDivArea();
}

function Actualizar_Vista_Area() {
    // Quitar todos los elementos del mapa
    map.clearOverlays();
    Dibujar_area(arraytmpmarcadoresarea,"",null,false);
    // Visualizar los puntos del area
    for (m=0;m<arraytmpmarcadoresarea.length;m++){
        var marcador =arraytmpmarcadoresarea[m];
        map.addOverlay(marcador);
    }
}

function Actualizar_Mapa(){
    // Quitar todos los elementos del mapa
    map.clearOverlays();
    var arrptos = new Array();
    if(arraymarcadoresaislados){
        for(i=0;i<arraymarcadoresaislados.length;i++){
            arrptos.push(arraymarcadoresaislados[i].getLatLng());
        }
    }
    arraymarcadoresaislados=new Array();
    Dibujar_puntos(arrptos,"",arraymarcadoresaislados,false,true,"area");
    Dibujar_areas(arrayareas,"",true);
}
function Inicializar_Mapa(zoomycentrocalculado,arraypuntos,arrayareas,permitirzoom,permitirdrag) {
    //map.setMapType(G_HYBRID_MAP);
    if (zoomycentrocalculado) {
        //Calculamos posición central y nivel de zoom para contener las posiciones
        var puntocentral;
        var maxlat;
        var minlat;
        var maxlng;
        var minlng;
        var puntosw;
        var puntone;
        var zoom;

        maxlat=CalcularMaxMinLatLng(arraypuntos, arrayareas,"MAX","lat");
        minlat=CalcularMaxMinLatLng(arraypuntos, arrayareas,"MIN","lat");
        maxlng=CalcularMaxMinLatLng(arraypuntos, arrayareas,"MAX","lng");
        minlng=CalcularMaxMinLatLng(arraypuntos, arrayareas,"MIN","lng");

        puntocentral=CalcularPuntoCentral(maxlat, minlat, maxlng, minlng);
        puntosw=new google.maps.LatLng(minlat,minlng);
        puntone=new google.maps.LatLng(maxlat,maxlng);
        zonaconposiciones = new google.maps.LatLngBounds(puntosw,puntone);
        zoom=map.getBoundsZoomLevel(zonaconposiciones);
        //Zoom máximo con el que podemos ver información de entorno que nos lo situe.
        if (zoom>12) {
            zoom=12;
        };
        //centramos y seleccionamos zoom.
        map.setCenter(puntocentral, zoom);
    } else {
        if(arrayCoordIni.length > 0){
        	map.setCenter(new google.maps.LatLng(arrayCoordIni[0], arrayCoordIni[1]), arrayCoordIni[2]);
        }else{
    	    //para que España quepa completo a zoom 6 es mecesario un alto de 560 y un ancho de 500.
    	    map.setCenter(new google.maps.LatLng(39.926588, -3.251953), 6);
    	}
    }
    if (permitirdrag) {
      var ancho = map.getSize().width;
      if(ancho>420){
        var miniatura = new google.maps.OverviewMapControl();
          map.addControl(miniatura);
        }
    }else{
        map.disableDragging();
    }

    if (permitirzoom) {
        map.addControl(new google.maps.LargeMapControl3D());
        //map.addControl(new google.maps.ScaleControl(), new google.maps.ControlPosition(G_ANCHOR_TOP_LEFT) );
        // Permite acercar y alejar la imagen de forma continua y gradual en navegadores capacitados para ello
        map.enableContinuousZoom();
        // Permite acercar y alejar la imagen con una rueda de desplazamiento del ratón
        map.enableScrollWheelZoom();

        map.setUIToDefault();
        map.removeMapType(G_PHYSICAL_MAP);
    }else{
        map.disableDoubleClickZoom();
    }
}

function CalcularMaxMinLatLng(arraypuntos,arrayareas,MaxMin,latlng){
    var ml;
    if (MaxMin=="MAX"){
        ml=-5000;
    }else{
        ml=5000;
    };
    var i;
    for(i=0;i<arraypuntos.length;i++) {
        var punto = arraypuntos[i];

        var valor;
        if (latlng=="lat"){
            valor=punto.lat();
        }else{
            valor=punto.lng();
        }
        if (MaxMin=="MAX"){
            if (valor>ml){
                ml = valor;
            }
        }else{
            if (valor<ml){
                ml=valor;
            }
        }
    };
    if (arrayareas.length>0){
        for ( a = 0; a < arrayareas.length; a++ ){
            var vertices = arrayareas[a];
            for ( i = 0; i < vertices.length; i++ ){
                var marcador = vertices[i];
                var punto = marcador.getLatLng();
                var valor;
                if (latlng=="lat"){
                    valor=punto.lat();
                }else{
                    valor=punto.lng();
                }
                if (MaxMin=="MAX"){
                    if (valor>ml){
                        ml = valor;
                    }
                }else{
                    if (valor<ml){
                        ml=valor;
                    }
                }
            }
        };
    };
    // Damos holgura a las coordenadas para q se muestre en el mapa
    var aumento = 0.1;
    if (latlng=="lat"){
        if (MaxMin=="MAX"){
          ml=ml+aumento;
      }else{
          ml=ml-aumento;
      }
    }else{
        if (MaxMin=="MAX"){
          ml=ml+aumento;
      }else{
           ml=ml-aumento;
      }
    }
    return ml;
};

function CalcularPuntoCentral(maxlat, minlat, maxlng, minlng){
    var centrolat;
    var centrolng;
    centrolat=(maxlat+minlat)/2;
    centrolng=(maxlng+minlng)/2;
    var centro = new google.maps.LatLng(centrolat,centrolng);
    return centro;
}


function GetRadioValue(radioObject){
    if (radioObject.length) {
        for (i=0;i<radioObject.length;i++) {
            if (radioObject[i].checked) {
                return radioObject[i].value;
                break;
            }
        }
    }
    return null;
}

function Buscando_Procesa_Punto(overlay,latlng){
    if (latlng) {
        map.clearOverlays();
        var marcador = Dibujar_punto(latlng,"","",false,false);
        Dibujar_zona_busqueda(latlng);
    }
}

function Dibujar_zona_busqueda(latlng, radio){
    map.clearOverlays()
    var arrptos = new Array();
    if(!radio){
        var radio = 5; // en kilómetros
    }
    var Cx;
    var Cy;
    var lat = latlng.lat() ;
    var lng = latlng.lng() ;
    var porciones=50;	    // Número de tramos que contendrá la línea que
                 // trazará la circunferencia. A más porciones mas
                // calidad pero también más tiempo de espera.
    var d2r = Math.PI/180 ; // factor de conversión de grados sexagesimales a radianes
    var r2d = 180/Math.PI ; // factor de conversión de radianes a grados sexagesimales
    var Clat = (radio/6371) * r2d ;   //  Se usa 6371 KM como radio de la tierra se calcula que porción de la circunferencia de la tierra es el radio
    var Clng = Clat/Math.cos(lat*d2r);
    var Clat_min = 0;
    var Clat_max = 0;

    for (var i = 0 ; i < porciones + 1 ; i++){
        var theta = Math.PI * (i/(porciones/2));	// Toda circunferencia tiene una longitud de 2*PI*radio, con lo que el valor a multiplicar por PI no puede ser nunca superior a 2.
        Cx = lng + (Clng * Math.cos(theta)) ;
        Cy = lat + (Clat * Math.sin(theta)) ;
        arrptos[i]=new google.maps.LatLng(Cy,Cx) ;
    }
    var polyOptions = {geodesic:true};
    //var polilinea = new google.maps.Polyline(arrptos, collin ,groslin,opalin,polyOptions);
    var polilinea = new google.maps.Polygon(arrptos, collin ,groslin,opalin,'#FFFF00',0.2,polyOptions);
    // arrptos es el array de puntos que corresponden con los vértices del área.
    // GoogleMaps cerrará la línea del último al primer punto.
    // collin es color de línea en formato HTML (Ej.#ff0000)
    // groslin es el grueso de la línea de contorno del polígono
    // opalin es valor entre 0 y 1.
    map.addOverlay(polilinea);
    return arrptos;
}

function Guardar_geo(){
    // Insertamos en el hidden los puntos aislados
    var txt_puntosaislados;
    if(arraymarcadoresaislados){
        for(i=0;i<arraymarcadoresaislados.length;i++){
            var punto = arraymarcadoresaislados[i].getLatLng().lat() + "," + arraymarcadoresaislados[i].getLatLng().lng();
            if(i>0){
                txt_puntosaislados = txt_puntosaislados + "|" + punto
            }else{
                txt_puntosaislados = punto;
            }
        }
        document.getElementById("arraymarcadoresaislados").value = txt_puntosaislados;
    }
    // Insertamos en el hidden las areas
    var txt_areas;
    if(arrayareas.length>0){
        for(i=0;i<arrayareas.length;i++){
            var arrptos = arrayareas[i];
            var txt_puntosarea ="";
            for(v=0;v<arrptos.length;v++){
                var puntoarea = arrptos[v].getLatLng().lat() + "," + arrptos[v].getLatLng().lng();
                if(txt_puntosarea){
                    txt_puntosarea = txt_puntosarea + "|" + puntoarea;
                }else{
                    txt_puntosarea = puntoarea;
                }
            }
            if(txt_areas){
                txt_areas = txt_areas + "@" + txt_puntosarea;
            }else{
                txt_areas = txt_puntosarea;
            }

        }
        document.getElementById("arrayareas").value = txt_areas;
    }
}

function Presentar_Geoposiciones(limpiar,arraypuntos,arrayareas,color) {
    if (limpiar){
        map.clearOverlays;
    }
    Dibujar_areas(arrayareas,color,false);
    Dibujar_puntos(arraypuntos,color,"",false,false);
}

/////// RUTAS - ADMIN  //////

// Procesa un punto de la ruta al hacer click sobre el mapa
function Crear_Ruta_Procesa_Punto(overlay,latlng,medio){
    if (latlng) {
        // Dibujar el marcador
        var marcador = new google.maps.Marker(latlng,{draggable: true});
        google.maps.Event.addListener(marcador, "dragend", Crear_Ruta_Dibujar_ruta);
        //Añadir el marcador a arraymarcadoresaislados
        arraymarcadoresaislados.push(marcador);
        if(medio=="MIO"){
            Crear_Ruta_Dibujar_ruta();
        }else{
          Crear_Directions_Dibujar_ruta(medio);
        }
    }else{
        // Elimina un punto aislado
        Crear_Ruta_Borrar_punto(overlay);
    }
}

function Crear_Puntos_Ruta(){
  // COMPONER UN ARRAY CON LAS COORDENADAS DE TODOS Y CADA UNO DE LOS MARCADORES DEFINIDOS
    var arraypuntos = new Array();
    var i;
    for (i=0;i<arraymarcadoresaislados.length;i++){
        arraypuntos[i]=arraymarcadoresaislados[i].getLatLng();
    };
    return arraypuntos;
}

// Dibuja una ruta a partir de un array de puntos con sus marcadores para porder editarla
function Crear_Ruta_Dibujar_ruta(){
    map.clearOverlays();
    arraypuntos = Crear_Puntos_Ruta();
    arraymarcadoresaislados= new Array();
    Dibujar_puntos(arraypuntos,"65B94A",arraymarcadoresaislados,true,true,"ruta");
    ruta = new google.maps.Polyline(arraypuntos,collin,groslin,opalin);
    // arrmarcadores es el array de marcadores que corresponden con los vértices de la ruta.
    // collin es color de línea en formato HTML (Ej.#ff0000)
    // groslin es el grueso de la línea
    // opalin es un valor entre 0 y 1.
    map.addOverlay(ruta);
    // ALMACENAR EN ESTE MOMENTO LAS COORDENADAS DE TODOS LOS MARCADORES QUE COMPONEN LA RUTA EN UN
    // CAMPO HTML OCULTO O CUALQUIER OTRO MEDIO ADECUADO PARA SU PROCESAMIENTO DESDE PHP
    Guardar_ruta();
}

// Dibuja una ruta (a pie o en coche) a partir de un array de puntos con sus marcadores para porder editarla
function Crear_Directions_Dibujar_ruta(medio) {
    map.clearOverlays();
    arraypuntos = Crear_Puntos_Ruta();
    ruta = new google.maps.Directions(map,document.getElementById("DetallesRuta"));
    if(medio=="A_PIE"){
        var travelmode=G_TRAVEL_MODE_WALKING;
    }else{
        var travelmode=G_TRAVEL_MODE_DRIVING;
    }
    ruta.loadFromWaypoints(arraypuntos,{ travelMode:travelmode, locale:'es' });
  // sustituimos los marcadores por otros para poder edirta la ruta
    google.maps.Event.addListener(ruta, "addoverlay", function() {
        var newMarkers = [];
        var latLngs = [];
        var icons = [];
        // Loop through the markers and create draggable copies
        for (var i=0; i<=ruta.getNumRoutes(); i++){
            var originalMarker = ruta.getMarker(i);
            latLngs[i] = originalMarker.getLatLng();
            icons[i] = originalMarker.getIcon();
            newMarkers[i] = new GMarker(latLngs[i],{icon:icons[i], draggable:true});
            map.addOverlay(newMarkers[i]);
            // Get the new waypoints from the newMarkers array and call loadFromWaypoints by dragend
            google.maps.Event.addListener(newMarkers[i], "dragend", function(){
                var points = [];
                for (var i=0; i<newMarkers.length; i++){
                    points[i]= newMarkers[i].getLatLng();
                }
                arraymarcadoresaislados = newMarkers;
                Crear_Directions_Dibujar_ruta();
            });
            // Now we can remove the original marker safel
            map.removeOverlay(originalMarker);
        }
        arraymarcadoresaislados = newMarkers;
        map.setZoom(map.getZoom()-1);
        // ALMACENAR EN ESTE MOMENTO LAS COORDENADAS DE TODOS LOS MARCADORES QUE COMPONEN LA RUTA EN UN
      // CAMPO HTML OCULTO O CUALQUIER OTRO MEDIO ADECUADO PARA SU PROCESAMIENTO DESDE PHP
      Guardar_ruta();
    });
}

function Crear_Ruta_Borrar_punto(overlay){
    //BUSCAR EL MARCADOR QUE SE HA PULSADO EN ARRAY DE MARCADORES Y PEDIR CONFIRMACIÓN PARA ELIMINARLO
    if (arraymarcadoresaislados){
        for (m=0;m<arraymarcadoresaislados.length;m++){
            var marcador = arraymarcadoresaislados[m];
            if (marcador===overlay){
                if(confirm(LBL_ELIMINAR_MARCADOR)) {
                    map.removeOverlay(marcador);
                    arraymarcadoresaislados.splice(m,1);
                    if(medio=="MIO"){
                      Crear_Ruta_Dibujar_ruta();
                    }else{
                        Crear_Directions_Dibujar_ruta(medio);
                    }
                }
                break;
            }
        }
    }
}

function Guardar_ruta(){
    // Insertamos en el hidden los puntos aislados de la ruta
    var txt_puntosaislados="";
    if(arraymarcadoresaislados){
        for(i=0;i<arraymarcadoresaislados.length;i++){
            var punto = arraymarcadoresaislados[i].getLatLng().lat() + "," + arraymarcadoresaislados[i].getLatLng().lng();
            if(i>0){
                txt_puntosaislados = txt_puntosaislados + "|" + punto;
            }else{
                txt_puntosaislados = punto;
            }
        }
    }
    document.getElementById("arraymarcadoresaislados").value = txt_puntosaislados;
}


////////////////////////////////////////////////////////////////////////////////////////////////

// Dibuja una ruta a partir de un array de puntos que corresponden con los vértices de la ruta.
function Dibujar_Ruta(arraypuntos) {
    var ruta = new google.maps.Polyline(arraypuntos,collin,groslin,opalin);
    map.addOverlay(ruta);
}


// Dibuja una ruta a partir de un array de puntos que corresponden con los vértices de la ruta.
// El GDirections te indica una ruta a pie o en coche
function Dibujar_Ruta_Directions(arraypuntos,medio) {
    var travelmode=G_TRAVEL_MODE_DRIVING;
    ruta = new google.maps.Directions(map,document.getElementById("DetallesRuta"));
    if (medio=="A_PIE"){
        travelmode=G_TRAVEL_MODE_WALKING;
    }
    ruta.loadFromWaypoints(arraypuntos,{ travelMode:travelmode, locale:'es', preserveViewport: true });
}

// Dibuja una ruta a partir de un array de puntos que corresponden con los vértices de la ruta.
// El GDirections te indica una ruta a pie o en coche
function Dibujar_Ruta_Directions_area(arraypuntos, medio, url) {
    var travelmode=G_TRAVEL_MODE_DRIVING;
    ruta = new google.maps.Directions(map,document.getElementById("DetallesRuta"));
    if (medio=="A_PIE"){
        travelmode=G_TRAVEL_MODE_WALKING;
    }
    ruta.loadFromWaypoints(arraypuntos,{ travelMode:travelmode, locale:'es', preserveViewport: true });

    // Se añade el listener para mostrar el globo al clickar sobre el icono de ruta
    GEvent.addListener(ruta,"load",function() {
        var rutas = ruta.getNumRoutes();
        var marker = null;
        var urlmark = '';
        for(var z = 0; z <= rutas; z++) {
            marker = ruta.getMarker(z);
            var latlng = marker.getLatLng();
            urlmark = url[z];

            function markerListener(marker, urlmark) {
                google.maps.Event.addListener(marker,"click", function(latlng){
                    Abrir_InfoWindowPublico(latlng,urlmark);
                });
            }

            markerListener(marker, urlmark);
        }
    });
}

// Dibuja un punto aislado con un color, letra y url para el infowindow
function Dibujar_punto_publico(latlng,color,letra,url,clicable,icon, cluster) {
    var icono;
    var marcador;
    var iconOptions = {};
    if (color!="" && color!='null') {
        iconOptions.width = 32;
        iconOptions.height = 32;
        iconOptions.primaryColor = color;
        if(letra!="" && letra!='null'){
        	iconOptions.label = letra;
        }
        icono = MapIconMaker.createLabeledMarkerIcon(iconOptions)
        var opmarcador = { icon:icono, clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    } else {
        if(typeof(icon) != 'undefined') {
            icono = new GIcon(G_DEFAULT_ICON);
            icono.image = icon;
        }
        var opmarcador = {clickable:clicable, icon: icono};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }
    google.maps.Event.addListener(marcador,"click", function(latlng){
        Abrir_InfoWindowPublico(latlng,url);
    });
    if(typeof(cluster) != 'undefined' && !cluster) {
        map.addOverlay(marcador);
    }
    return marcador;
}

// Dibuja un area a partir de un array de marcadores con un color, letra y url para el infowindow
function Dibujar_area_publico(arrvertices,colorfondo,url,clicable){
    if (colorfondo!=""){
        colfon = colorfondo;
        collin = colorfondo;
    }else{
        colfon = "#FF0000";
        collin = "#FFFFFF";
    };
    var arrptos = new Array();
    for (v=0;v<arrvertices.length;v++){
        var punto = arrvertices[v];
        var puntolatlng = punto.getLatLng();
        arrptos.push(new google.maps.LatLng(puntolatlng.lat(),puntolatlng.lng()));
    }
    var poligono = new google.maps.Polygon(arrptos,collin,groslin,opalin,colfon,opafon);
    if(clicable){
        google.maps.Event.addListener(poligono, "click", function(latlng){
            Abrir_InfoWindowPublico(latlng,url);
        });
    }
    map.addOverlay(poligono);
    return poligono;
}

// Abre un infowindow
function Abrir_InfoWindowPublico(punto, url){
  google.maps.DownloadUrl(url,function(data,status){
    var divIW = document.createElement('div');
    divIW.innerHTML=data;
    map.openInfoWindow(punto,divIW);
  })
}


// Muestra u oculta los marcadores de un determinado grupo
var markerGroups = { "imagenes": [], "podcasts": [], "videos": [], "documentos": [], "conts": [], "especies": [], "webcams": []};

function toggleGroup(type) {
  for (var i = 0; i < markerGroups[type].length; i++) {
    var marker = markerGroups[type][i];
    if (marker.isHidden()) {
      marker.show();
    } else {
      marker.hide();
    }
  }
}

// Dibuja un poligono de radio x, alrededor de la ruta
function markSearchArea() {
  var center = map.getCenter();
  var zoom = map.getZoom();
  var radObj = document.getElementById('radio');
  var radius = 2;
  if (radObj.value) {
    radius = radObj.value;
  }
  if (arraypuntos && arraypuntos.length) {
    for (n = 0 ; n < arraypuntos.length ; n++) {
      var p = arraypuntos[n];
    }
    var centerPx = normalProj.fromLatLngToPixel(center, zoom);
    var nextPxLatLon =  normalProj.fromPixelToLatLng(new GPoint(centerPx.x+1,centerPx.y), zoom);
    var dPx = nextPxLatLon.distanceFrom(center) / 1609.344;
    var pxWidth = Math.ceil(radius / dPx) * 2;
    searchAreaHighlight = new google.maps.Polyline(arraypuntos,'#FFFF00',pxWidth, 0.30);
    map.addOverlay(searchAreaHighlight);
  }
}

// Pinta los puntos de interes
function pintaPuntosInteres(arrcoord, arraypuntos, clicable, cluster) {
    if(arrcoord){
    	arrcoord = arrcoord.split("|");
        // Componemos un arraypuntos con las geoposiciones aisladas
        for (i=0;i<arrcoord.length;i++){
            var lat   = arrcoord[i].split(",")[0];
            var lng   = arrcoord[i].split(",")[1];
            var color = arrcoord[i].split(",")[2];
            var letra = arrcoord[i].split(",")[3];
            var url   = arrcoord[i].split(",")[4];
            var icon  = arrcoord[i].split(",")[5];
            var punto = new google.maps.LatLng(lat,lng);
            var marcador = Dibujar_punto_publico(punto,color,letra,url,clicable,icon, cluster);
            arraypuntos.push(punto);
            arraymarcadores.push(marcador);
        };
    }
}

// Pinta las areas de interes
function pintaAreasInteres(arrareas, arrayareas) {
  if(arrareas){
        arrareas = arrareas.split("@");
        for (i=0;i<arrareas.length;i++){
            var arrayareasmarcadores = new Array();
            var areacoord = arrareas[i];
            areacoord = areacoord.split("|");
            var opts_area = areacoord.shift();
          var color = opts_area.split("-")[0];
          var url   = opts_area.split("-")[1];
          var cat   = opts_area.split("-")[2];
            for(var j=0;j<areacoord.length;j++){
                var lat = areacoord[j].split(",")[0];
                var lng = areacoord[j].split(",")[1];
                var punto = new google.maps.LatLng(lat,lng);
                var marcador = new google.maps.Marker(punto);
                arrayareasmarcadores.push(marcador);
            }
            var area = Dibujar_area_publico(arrayareasmarcadores,color,url,false);
            arrayareas.push(arrayareasmarcadores);
        }
    }
}

// Pinta rutas interes
function pintaRutasInteres(arrpuntosrutas, arraypuntos){
  if(arrpuntosrutas){
      arrpuntosruta = arrpuntosrutas.split("@");
      for (i=0;i<arrpuntosruta.length;i++){
          arrcoord = arrpuntosruta[i].split("|");
          var opts_ruta = arrcoord.shift();
          var color = opts_ruta.split("-")[0];
          var arraypuntosruta = new Array();
          for (j=0;j<arrcoord.length;j++){
              var lat   = arrcoord[j].split(",")[0];
              var lng   = arrcoord[j].split(",")[1];
              var punto = new google.maps.LatLng(lat,lng);
              arraypuntosruta[j]=punto;
              arraypuntos.push(punto);
          };
          Dibujar_Ruta(arraypuntosruta);
      }
    }
}

//Acerca la provincia
function acercarMapaProvincia(idProvincia) {
    if (idProvincia) {
        acercarMapaCoordenadas(crdProv[idProvincia][0], crdProv[idProvincia][1], crdProv[idProvincia][2]);
    } else {
        acercarMapaPosition(new google.maps.LatLng(39.926588, -3.251953), 6);
    }
}

//Acerca el mapa usando coordenadas y nivel de zoom
function acercarMapaCoordenadas(lat, lng, zoom) {
    acercarMapaPosition(new google.maps.LatLng(lat, lng), zoom);
}

//Acerca el mapa usando position y nivel de zoom
function acercarMapaPosition(position, zoom) {
	map.setCenter(position, parseInt(zoom));
}


//google.setOnLoadCallback(initialize);
