google.load("maps","2");
var map;
var arraymarcadoresaislados = new Array();
var arrayareas = new Array();
var arraytmpmarcadoresarea  = 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;


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('Tiene que haber como mínimo 3 puntos');
        }else{
            if(confirm('¿Desea eliminar el 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!=""){
        iconOptions.width = 32;
        iconOptions.height = 32;
        iconOptions.primaryColor = color;
        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 = "Ha pulsado usted sobre un área. <br />" +
                 "Dispone de las siguientes operaciones sobre ella: <br />" +
                 "<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(zoomOriginal,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);
        if (!zoomOriginal) {
            zoom=map.getBoundsZoomLevel(zonaconposiciones);
        }
        else {
            zoom = zoomOriginal;
        }    
        //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);
        map.setZoom(zoomOriginal);
    }else{
        //para que Aragón quepa completo a zoom 7 es mecesario un alto de 400 y un ancho de 320.
        map.setCenter(new google.maps.LatLng(41.4, -0.5), 12);
    }
    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_RIGHT) );
        // 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();
    }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('¿Desea eliminar el 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' });
}

// Dibuja un punto aislado con un color, letra y url para el infowindow
function Dibujar_punto_publico(latlng,color,letra,url,clicable){
    var icono;
    var marcador;
    var iconOptions = {};
    if (color!=""){
        iconOptions.width = 32;
        iconOptions.height = 32;
        iconOptions.primaryColor = color;
        iconOptions.label = letra;
        icono = MapIconMaker.createLabeledMarkerIcon(iconOptions)
        var opmarcador = { icon:icono, clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }else{
        var opmarcador = { clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }
    google.maps.Event.addListener(marcador,"click", function(latlng){
        Abrir_InfoWindowPublico(latlng,url);
    });
    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": []};
// cambio Paco Martinez
var markerGroups = { "directorio": []};


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){
    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 punto = new google.maps.LatLng(lat,lng);
            var marcador = Dibujar_punto_publico(punto,color,letra,url,clicable);
            arraypuntos.push(punto);
        };
    }
}

// Pinta los puntos de interes
function pintaPuntosInteresDKV(arrcoord, arraypuntos,clicable){
    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 punto = new google.maps.LatLng(lat,lng);
            var marcador = Dibujar_punto_publicoDKV(punto,color,letra,url,clicable);
        };
    }
}

// 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);
        }
    }
}

// Dibuja un punto aislado con un color, letra y url para el infowindow
function Dibujar_punto_publicoDKV(latlng,color,letra,url,clicable){
    var icono;
    var marcador;
    var iconOptions = {};
    if (color!=""){
         //   
        //iconOptions.width = 32;
        //iconOptions.height = 32;
        //iconOptions.primaryColor = color;
        //icono = MapIconMaker.createLabeledMarkerIcon(iconOptions)        
        //iconOptions.label = letra;
        icono = new google.maps.Icon(G_DEFAULT_ICON, 'http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png');
        var opmarcador = { icon:icono, clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }else{
        icono = new google.maps.Icon(G_DEFAULT_ICON);
        icono.image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png";     
        var opmarcador = { icon:icono, clickable:clicable};
        marcador = new google.maps.Marker(latlng,opmarcador);
    }
    google.maps.Event.addListener(marcador,"click", function(latlng){
        Abrir_InfoWindowPublico(latlng,url);
    });
    map.addOverlay(marcador);
    return marcador;
}


function CalcularMaxMinLatLngDKV(arraypuntos,arrayareas,MaxMin,latlng){
    var ml;
    if (MaxMin=="MAX"){
        ml=-5000;
    }else{
        ml=5000;
    };
    var i;
    for(i=0;i<arraypuntos.length;i++) {
        var lat   = arraypuntos[i].split(",")[0];
        var lng   = arraypuntos[i].split(",")[1];    
        var punto = new google.maps.LatLng(lat,lng);        
        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;
};
//google.setOnLoadCallback(initialize);

