// Marcador para la geolocalizacion
var marcadorGeolocalizacion = null;
// Lista de marcadores para la vista de mapa
var marcadoresVistaMapa = new Array();
// Para el como llegar
var gdir;
// Iconos de la red de distribucion
var iconos;

//Inicializa el mapa
function cargarMapa(latitudInicial,longitudInicial,zoomInicial,tipoMapa,marcadores){
    var objMapa = document.getElementById("mapaGM");
    if(objMapa){
        var esSelectorLoc = (objMapa.className=="mapaSelectorLocalizacion");
        var esSelectorVista = (objMapa.className=="mapaSelectorVista");
        var esSelector = (esSelectorLoc || esSelectorVista);
        if(GBrowserIsCompatible()){
            map = new GMap2(objMapa);
            //Añade la capacidad de aumentar el zoom con doble click
            map.enableDoubleClickZoom();
            //si no es selector ponemos el control de mapa
            map.addControl(new GOverviewMapControl(new GSize(100,100)));
            map.addControl(new GLargeMapControl());
            map.enableContinuousZoom();
            map.addControl(new GMapTypeControl());

            //si hay punto inicial lo ponemos
            if(longitudInicial && latitudInicial){
                map.setCenter(new GLatLng(latitudInicial,longitudInicial),zoomInicial?parseInt(zoomInicial):10);
                if(esSelectorLoc)
                    ponerLocalizacion(null,new GLatLng(latitudInicial,longitudInicial));
            }else
                map.setCenter(new GLatLng(39.67406,-3.161336), 10);

            if(tipoMapa)
                map.setMapType(tipoMapa2tipoGoogle(parseInt(tipoMapa)));

            if(esSelector){ //si es selector de localizacion ponemos el evento para añadir marcador en la posicion actual
                map.enableGoogleBar();
                if(esSelectorLoc){
                    GEvent.addListener(map, "click", function(marker, point){                    
                                                        if(!marker){
                                                            ponerLocalizacion(null,point);
                                                        }
                                                    });
                    //quitamos todos los eventos de doubleclick
                    GEvent.clearListeners(map,"doubleclick");
                }else if(esSelectorVista){
                    marcadoresVistaMapa = new Array();
                    for(var i=0;i<marcadores.length;i++)
                        anadirMarcadorVistaMapa(marcadores[i][2],marcadores[i][3],marcadores[i][0],marcadores[i][1]);
                }
            }
            //si no es selector
            else{
                if(marcadores && marcadores.length>0){
                    for(var i=0;i<marcadores.length;i++){
                        anadirMarcadorVistaMapa(marcadores[i][2],marcadores[i][3],marcadores[i][0],marcadores[i][1]);}
                }
                
            }
            //creamos objeto para el como llegar
            gdir = new GDirections(map);
        }
    }
}

var ventanaMapa;
function verSituacion(latitud,longitud,zoom,marcadores){
    //obtenemos/creamos la ventana para selectores
    var nuevo = false;
    if(!ventanaMapa){
        ventanaMapa = document.createElement("div");
        ventanaMapa.className = "previsualizacion popupMapa";
        var contenedor = document.createElement("div");
        contenedor.className = "popupMapaContenedor";
        contenedor.innerHTML = "<div id='mapaGM'>&nbsp;</div>";
        //una vez cargado, llamamos a la funcion load() para que lo cargue
        //abrimos la ventana
        ventanaMapa.appendChild(botonCierreVentana());
        ventanaMapa.appendChild(contenedor);
        nuevo = true;
    }
    abrirVentana(ventanaMapa);
    window.scrollTo(0,0);
    if(nuevo)
        cargarMapa(latitud,longitud,zoom?parseInt(zoom):10,'',marcadores);
    else
        ponerLocalizacion(null,new GLatLng(latitud,longitud),false);
}

//pone un marcador en la posicion pulsada
function ponerLocalizacion(marker,point,imagen){
    if(!marker){
        if(marcadorGeolocalizacion)
            map.removeOverlay(marcadorGeolocalizacion);
        
        if(imagen){
            var icono = new GIcon();
            icono.image = "/img/iconos/maps/midred.gif";
            icono.iconSize = new GSize(20,24);
            icono.iconAnchor = new GPoint(10,23);
            icono.infoWindowAnchor = new GPoint(8,10);
            marcadorGeolocalizacion = new GMarker(point,icono);
        }else{   
            marcadorGeolocalizacion = new GMarker(point); 
        }           
        var contenido = document.getElementById('contenidoMapa');
        if(contenido){
            direccion = "<div id='popupMapa'>";
            direccion += contenido.innerHTML;
            direccion += "</div>";
            map.openInfoWindow(point,direccion);
        }
        map.addOverlay(marcadorGeolocalizacion);
        map.panTo(point);
    }
}

//ejecuta sobre el mapa el como llegar desde un punto a otro
function ejecutarComoLlegar(destino, descDestino){
    var controlOrigen = document.getElementById('origen');
    var origen = controlOrigen.value;
    if("albacete,ciudad real,toledo,cuenca,guadalajara,valencia".indexOf(origen.toLowerCase())!=-1)
        origen += ", España";
    var datosRuta = document.getElementById('datosRuta');
    var resumen = document.getElementById('resumenRuta');
    var indicaciones = document.getElementById('indicacionesRuta');
    function comoLlegarError(){
        if(origen.indexOf("España")==-1){ //si no encontramos resultados probamos a hacerlo con España detras
            origen += ", España";
            gdir.load("from: "+origen+" to: "+destino,{ "locale": "es"});
        }else{
            //ocultamos todo
            datosRuta.style.display = "none";
            alerta("No se encuentra el destino");
        }
    }
    //ponemos una imagen de "cargando"
    datosRuta.style.display = "block";
    if(resumen)
        resumen.innerHTML = "<img src='/img/cargando.gif' />";
    //borramos posibles resultados anteriores
    if(gdir)
        gdir.clear();

    var descripcionOrigen = origen;
    var descripcionDestino = descDestino;
    gdir = new GDirections(map);
    GEvent.addListener(gdir, "load", function(){
        comoLlegarRecibido(descripcionOrigen,descripcionDestino);
    });
    GEvent.addListener(gdir, "error", comoLlegarError);
    gdir.load("from: "+origen+" to: "+destino,{ "locale": "es", "getSteps": true});
}

//procesamiento al recibir el como llegar
function comoLlegarRecibido(descOrigen,descDestino){
    //procesamiento al recibir el como llegar
    var resumen = document.getElementById('resumenRuta');
    var indicaciones = document.getElementById('indicacionesRuta');
    //rellenamos los datos del resumen de ruta
    if(resumen){
        var html;
        html  = '<ul>';
        html +=     '<li>Distancia: '+ gdir.getDistance().html.toString()+'</li>';
        html +=     '<li>Duración: '+ gdir.getDuration().html.toString()+'</li>';
        html += '</ul>';
        resumen.innerHTML = html;
    }

    //rellenamos las indicaciones
    if(indicaciones){
        html  = "<table>";
        html +=     "<tr class='extremoRuta'><td colspan='3'>Salida <strong>"+descOrigen.toUpperCase()+"</strong></td></tr>";
        var n=1;
        for(var i=0;i<gdir.getNumRoutes();i++){
            var ruta = gdir.getRoute(i);
            for(var j=0;j<ruta.getNumSteps();j++){
                html += '<tr onclick="map.showMapBlowup(gdir.getRoute('+i+').getStep('+j+').getLatLng())" class="fila'+(n%2)+'">';
                html +=     "<td class='num'>";
                html +=         "<a href='javascript:void(0)'>"+n+"</a>";
                html +=     "</td>";
                html +=     "<td>";
                html +=         ruta.getStep(j).getDescriptionHtml();
                html +=     "</td>";
                html +=     "<td>";
                html +=         ruta.getStep(j).getDistance().html;
                html +=     "</td>";
                html += "</tr>";
                n++;
            }
        }
        html +=        "<tr class='extremoRuta'><td colspan='3'>Llegada <strong>"+descDestino.toUpperCase()+"</strong></td></tr>";
        html +=    "</table>";
        indicaciones.innerHTML = html;
    }
    map.zoomOut();
}

function tipoGoogle2tipoMapa(tipoGoogle){
    switch(tipoGoogle){
        case G_NORMAL_MAP:
            return 'roadmap';
        break;
        case G_SATELLITE_MAP:
            return 'satellite';
        break;
        case G_HYBRID_MAP:
            return 'hybrid';
        break;
    }
}

function tipoMapa2tipoGoogle(tipoMapa){
    switch(tipoMapa){
        case 'roadmap':
            return G_NORMAL_MAP;
        break;
        case 'satellite':
            return G_SATELLITE_MAP;
        break;
        case 'hybrid':
            return G_HYBRID_MAP;
        break;
    }
}

function anadirMarcadorVistaMapa(color,tam,longitud,latitud){
    var icono = new GIcon();
    icono.image = "/img/iconos/maps/"+tam+color+".png";
    switch(tam){
        case "tiny":
            icono.iconSize = new GSize(12,12);
            icono.iconAnchor = new GPoint(6,12);
            icono.infoWindowAnchor = new GPoint(6,6);
        break;
        case "small":
            icono.iconSize = new GSize(20,20);
            icono.iconAnchor = new GPoint(10,20);
            icono.infoWindowAnchor = new GPoint(10,10);
        break;
        default:
            icono.iconSize = new GSize(32,32);
            icono.iconAnchor = new GPoint(16,32);
            icono.infoWindowAnchor = new GPoint(16,16);
    }

    var punto = map.getCenter();
    if(longitud && latitud)
        punto = new GLatLng(latitud,longitud);

    var marcador = new GMarker(punto,{"draggable":true,"dragCrossMove":true,"icon":icono});
    map.addOverlay(marcador);
    marcadoresVistaMapa.push(new Array(marcador,color,tam));
    actualizarListaMarcadores();
}

function eliminarMarcadorVistaMapa(pos){
    map.removeOverlay(marcadoresVistaMapa[pos][0]);
    marcadoresVistaMapa.splice(pos,1);
    actualizarListaMarcadores();
}

function actualizarListaMarcadores(){
    var listaMarcadores = $('listaMarcadores');
    if(listaMarcadores!=null){
        var html = "<ul>";
        for(var i=0;i<marcadoresVistaMapa.length;i++){
            html += "<li class='"+marcadoresVistaMapa[i][2]+" "+marcadoresVistaMapa[i][1]+marcadoresVistaMapa[i][2]+"'>";
            html +=     "<a href='javascript:;' onclick=\"map.panTo(marcadoresVistaMapa["+i+"][0].getLatLng())\">"+(i+1)+"</span>";
            html +=     "<a href='javascript:;' onclick=\"eliminarMarcadorVistaMapa("+i+");\" class='eliminar'>Eliminar</a>";
            html += "</li>";
        }
        html += "</ul>";
        listaMarcadores.innerHTML = html;
        if(marcadoresVistaMapa.length>0)
            listaMarcadores.parentNode.style.display = "block";
        else
            listaMarcadores.parentNode.style.display = "none";
    }
}

function obtenerParametroMarcadoresVistaMapa(){
    var lista = new Array();
    for(var i=0;i<marcadoresVistaMapa.length;i++)
        lista.push(marcadoresVistaMapa[i][0].getLatLng().lng()+","+marcadoresVistaMapa[i][0].getLatLng().lat()+","+marcadoresVistaMapa[i][1]+","+marcadoresVistaMapa[i][2]);
    return lista.join("|||");
}

//obtiene todos los parametros de la vista de mapa actual
function obtenerParamsVistaMapa(){
    var bounds = map.getBounds();
    var surOeste = bounds.getSouthWest();
    var norEste = bounds.getNorthEast();
    return "xmin="+surOeste.lng()+"&ymin="+surOeste.lat()+"&xmax="+norEste.lng()+"&ymax="+norEste.lat()+"&z="+map.getZoom();
}

function crearMarcadorDistribuidor(datosDistribuidor){
    var marcador = new GMarker(new GLatLng(datosDistribuidor.y,datosDistribuidor.x),iconos[datosDistribuidor.t-1]);
    GEvent.addListener(marcador,"click",function(){
                                ejecutarAjax(
                                            "/lib/ajax/mapa-distribuidores.php",
                                            "d="+datosDistribuidor.n+"&t="+datosDistribuidor.t,
                                            "POST",
                                            function(respuesta){
                                                marcador.openInfoWindowHtml(respuesta);
                                            });
                            });
    return marcador;
}

function actualizarMapaRedDistribucion(){
    if(!iconos){
        var imgs = new Array("icono-dis-propiog.gif","icono-dis-externog.gif");
        iconos = new Array();
        for(var i=0;i<imgs.length;i++){
            iconos[i] = new GIcon();
            iconos[i].image = "/img/mapa/"+imgs[i];
            iconos[i].iconSize = new GSize(24, 27);
            iconos[i].iconAnchor = new GPoint(10,25);
            iconos[i].infoWindowAnchor = new GPoint(8,10);
        }
    }

    var checks = $$(".leyenda li input");
    var listaTipos = new Array();
    for(var i=0;i<checks.length;i++){
        if(checks[i].checked)
            listaTipos.push(checks[i].value);
    }

    ejecutarAjax(
                "/lib/ajax/mapa-distribuidores.php",
                obtenerParamsVistaMapa()+"&t=1",
                "POST",
                function(respuesta){
                    map.clearOverlays();
                    if(respuesta){
                        var distribuidores = eval(respuesta);
                        for(var i=0;i<distribuidores.length;i++){
                            var marcador = crearMarcadorDistribuidor(distribuidores[i]);
                            map.addOverlay(marcador);
                        }
                    }
                }
    );
}
