//Variables globales
var map = null;
var geocoder = null;
var xmlDoc = null;
var markers_calle = null;
var markers_noticia = null;
//Variables con las rutas de las imagenes de los iconos (Image1=Noticias | Image2=Calle20)
var iconimage1 = "";
var iconimage2 = "";
var iconshadow = "";
var control_mov = 0;
var control_mov_bis = 0;
var control_mov_globo = 1;
var marcador_buscado = null;

function load()
{
    if (GBrowserIsCompatible()) //si el browser-navegador es compatible
    {
        map = new GMap2(document.getElementById("map")); //Crea un nuevo mapa dentro de una capa div
        var kbdHandler = new GKeyboardHandler(map); //Añade herramientas al mapa, subir, bajar, derecha, izquierda...
        map.addControl(new GLargeMapControl()); //Creal el control para 4 direcciones, y mas zoom o menos zoom, zona izquierda
        map.addControl(new GScaleControl()); //Muestra la escala del mapa
        map.addControl(new GMapTypeControl()); //Crea los botones con los distintos tipos de mapa:Mapa,Satélite,Híbrido.
        map.addControl(new GOverviewMapControl()); //Ver mapita pequeño en la esquina inferior derecha
        geocoder = new GClientGeocoder();//Esta clase se utiliza para comunicarse directamente con los 
                                                    //servidores de Google para obtener los geocodes para las direcciones 
                                                    //especificadas usuario
                                    
        //Si la dirección es distinta de vacia
        if(document.getElementById('address').value != '')
        {
            //Se llama al Geolocalizador de Google Maps para obtener los resultados con esta dirección
            showCoincidences(document.getElementById('address').value);    
        }
        else if (document.getElementById("latitud").value!='' || 
                  document.getElementById("longitud").value!='') //Si hay datos que han llegado por parámetros
        {
                var type_map='';
                trim(document.getElementById("tipomapa").value);
                switch (document.getElementById("tipomapa").value) {
                   case 'm': //mapa
                       type_map=G_NORMAL_MAP;
                 break;
                 case 'k': //satelite
                     type_map=G_SATELLITE_MAP;
                 break;
                 case 'h': //hibrido
                     type_map=G_HYBRID_MAP;
                 break;
                 default:
                     type_map=G_NORMAL_MAP;
             }
                
             latitude=parseFloat(document.getElementById("latitud").value);
            longitude=parseFloat(document.getElementById("longitud").value);
            zoom=parseFloat(document.getElementById("zoom").value);
            
            if (isNaN(zoom)){
                zoom=12;
                document.getElementById("zoom").value=zoom;
            }
            
            label_address=URLDecode(trim(document.getElementById("vineta").value));
            
                        
            //Creamos el mapa con los parámetros que nos llegan    
           map.clearOverlays();
        
             map.setCenter(new GLatLng(latitude, longitude), zoom, type_map);
             
             //Si nos llega etiqueta de dirección pintamos una viñeta
             if ((label_address != '') && (label_address!='0')){
                 //showLocation(label_address,zoom,label_address);
                 showCoincidences(label_address);
              }
              
              map.setCenter(new GLatLng(latitude, longitude), zoom, type_map);
              
        }
        else //si no ha llegado nada por parámetros se crea un mapa hibrido centrado de la península ibérica
        {
            map.setCenter(new GLatLng(40, -4.24072265625), 6, G_HYBRID_MAP);
        }
        if(document.getElementById('address'))
        {
            document.getElementById('address').disabled = false;
        }
        if(document.getElementById('buscar2'))
        {
            document.getElementById('buscar2').disabled = false;
        }        
    }
    
    //Si está definido el campo address2, lanzamos la búsqueda.
    if(document.getElementById('address2').value != '')
    {
        deleteVariables(); showCoincidences(document.getElementById('address2').value);
        document.getElementById('address2').value = '';
    }
    
    //Almacenamos la variable botones del formulario
    botones=parseFloat(document.getElementById("botones").value);
    //Activamos los marcadores que vengan por parámetros
    if ((botones!='') && !(isNaN(botones))){
        activar_marcadores(botones);
    }
}

//Muestra la localización, recibe el nombre de la dirección y el nivel de zoom
function showLocation(address,zoomLevel,label_address)
{
    //Si el objeto geocoder exite (comunicacion con los servidores de google)
   map.clearOverlays();
   control_mov=0;
   control_mov_bis=-4;
   
   if(geocoder)
    {
        geocoder.getLatLng(
            address,
            function(point)
            {
                if (!point) //si no hay respuesta, se llama a la función que evalúa el parámetro de entrada
                {
                    showCoincidences(address+', españa');
                }
                else
                {
                    if (document.getElementById("latitud").value=='' &&
                             document.getElementById("longitud").value==''){
                             map.setMapType(G_NORMAL_MAP);
                             map.setCenter(point); //Centra el mapa
                             map.setZoom(zoomLevel); //Da el zoom que le lleva por parámetro
                       }
                     
                     // Para crear un icono y pasarselo a GMarker y pintar la etiqueta en la localización
                    var icon = new GIcon();
                    icon.image = "/imgs/iconos/marcador_googlemaps_verde.png";//Imagen del icono
                    icon.iconSize = new GSize(30, 35);

                    icon.iconAnchor = new GPoint(12, 34);//Coordenada del pixel esquina izquierda superior de la imagen
                    icon.infoWindowAnchor = new GPoint(12, 0);//coordenada del pixel esquina izquierda superior de la ventana de info


                    //Crea una marca en el punto con uno icono, el que le pasemos o el de defecto,
                    //si el último parámetro es true la marca no es clicable y hará caso omiso a los eventos
                    var marker = new GMarker(point,icon); 
                
                    //Guardamos las coordenadas buscadas
                                        marcador_buscado = point;
                                     
                
                    //Añade una pequeña capa a la marca para pintar la dirección
                    map.clearOverlays();
                    map.addOverlay(marker);
    
                    var icon = new GIcon();
                        icon.image = iconimage1;
                        icon.shadow = iconshadow;
                        icon.iconSize = new GSize(24, 40);
                        icon.shadowSize = new GSize(44, 44);
                        icon.iconAnchor = new GPoint(12, 40);
                        icon.infoWindowAnchor = new GPoint(12, 2);
                        iconcalle20 = new GIcon(icon,iconimage2);
                                                    
                    if(markers_noticia!=null)
                    marcadores(1,icon,iconcalle20);
                    if(markers_calle!=null)
                    marcadores(2,icon,iconcalle20);

                    if (document.getElementById("latitud").value=='' &&
                             document.getElementById("longitud").value==''){                    
                        //Muestra una ventana con información en formato html, con la localización que buscabamos
                        marker.openInfoWindowHtml('<p>'+label_address+'</p>');
                    }
                                        
                    //Rellenamos la varible vineta del formulario
                    document.getElementById("vineta").value=label_address;
                    
                    //Obtenemos las coordenadas del mapa
                    //calcular_coordenadas_mapa();                
                }
            }
        );
    }
}


function ZoomLevel(accuracy)
{
    zoom = Math.floor(accuracy*2.5);
    if(zoom > 16)
    {
        zoom = 16;    
    }
    return zoom;
}


//Mira el resultado de la búsqueda a partir de la respuesta
function addAddressToMap(response)
{
    //No se obtiene ningún resultado
    if(!response || response.Status.code != 200) 
    {
        alert("¡¡¡ No hemos encontrado nada !!! ");
    }
    else //Si encuentra una unica coincidencia
    {
        //Se vacia el div de coincidencias
        borrarCoincidencias();
        
        //Si solo hay una coincidencia mostramos directamente el mapa
        if(response.Placemark.length == 1) 
        {
            place = response.Placemark[0];

            //Valor de accuracy que devuelve el geolocalizador, marca el nivel de zoom
            accuracy = place.AddressDetails.Accuracy;

            //Multiplicamos el valor de acurracy por 2
            zoom = ZoomLevel(accuracy);    
            
            //Pasamos a mostrar la localización, pasándole el nombre de la dirección y el nivel de zoom
            place_once=printAddress(place);
            showLocation(place_once,zoom,printAddress2(place));
        }
        else //Si encuentra mas de una coincidencia
        {
            //Introducimos un pequeño texto en la capa coincidencias
            var map_result = '';
            map_result = '<p>No hemos encontrado nada, aunque quizás quiso decir:</p>';
            map_result += '<ul>';
            
            //Recorremos todas las posibles coincidencias recibidas
            for(i=0;i<response.Placemark.length;i++)            
            {      
                place = response.Placemark[i];
                accuracy = place.AddressDetails.Accuracy;
                zoom = ZoomLevel(accuracy);    
                place_once=printAddress(place);        
                newLocation = '<li><a href="/callejero/" onclick="borrarCoincidencias(); showLocation(\''+place_once+'\','+zoom+',\''+printAddress2(place)+'\'); return false;">'+place_once+'</a></li>';
                map_result += newLocation;
            }
            map_result += '</ul>';
            
            //Rellenamos el div del mapa con los resultados
            mostrarCoincidencias(map_result);
            
            if(map.getCenter() == null) //si el mapa no estaba centrado se centra
            {
                //GLatLng da coordenadas geográficas latitud y longitud
                map.setCenter(new GLatLng(40, -4.24072265625), 6, G_HYBRID_MAP);
            }
        }
    }
}

//Esta función evalúa el parámetro introducido por el usuario, es decir la dirección
function showCoincidences(address)
{
    if (trim(address) == ''){
        alert('¡¡¡ No has introducido ningún criterio de búsqueda !!!');
        return false;
    }

    //la capa coincidencias se vacia
    borrarCoincidencias();
    
    //Si la dirección introducida no contiene el literal "españa" se le añade.
    if((address.toLowerCase()).indexOf("españa")== -1) 
    {
        address += ", España";
    }
      
    //Se llama al geolocalizador con una dirección y esta dirección la maneja la función addAddressToMap 
    //Envía una petición a los servidores de Google al geocode la dirección especificada
    geocoder.getLocations(address, addAddressToMap);
}

//Obtenemos las coordenadas del mapa
function calcular_coordenadas_mapa(){

    //OBTENEMOS LAS COORDENADAS DEL MAPA PARA LAS HERRAMIENTAS
    var center_map = map.getCenter();//Nos dice las coordenadas del mapa
    var zoom_map = map.getZoom();
    document.getElementById("latitud").value=center_map.y;
    document.getElementById("longitud").value=center_map.x
    document.getElementById("zoom").value=map.getZoom();
    document.getElementById("tipomapa").value=map.getCurrentMapType().getUrlArg();
}

//Formamos la url para las herramientas
function formar_url(href){
    calcular_coordenadas_mapa();
    url = document.getElementById('vineta').value;
    url = url.replace('<br>','-');
    url = url.replace('<br>','-');
    if (url == ''){
        url='0';
    }
    if (document.getElementById('botones').value == ''){
        document.getElementById('botones').value=0;
    }
    url_enviar_mapa=href+document.getElementById('latitud').value+'/'+document.getElementById('longitud').value+'/'+document.getElementById('zoom').value+'/'+document.getElementById('tipomapa').value+'/'+ URLEncode(url)+'/'+ document.getElementById('botones').value+'/';
    return url_enviar_mapa;
}

//Eliminamos espacios en blanco en cadenas
function trim(s) {
    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

//Función que pinta todos los datos necesarios para mostrar la dirección
function printAddress(placemark)
{
    var label_address = '';
    var label_url ='';
    
    //Pais
    country='España';
    label_address=placemark.address;
    label_address=label_address.replace("Spain","");
    label_address=label_address+' '+country;
    if (trim(label_address) == 'España'){
        label_url=document.getElementById('address').value;
        if (label_url == ''){
            label_url=document.getElementById('vineta').value;
        }
        label_address=formatoCadena(label_url)+', '+label_address;
    }
    return label_address;

}

//Función que pinta todos los datos necesarios para mostrar la dirección
function printAddress2(placemark)
{
    var calle ='';
    var cpostal = '';
    var municipio = '';
    var provincia = '';
    var comunidad_autonoma = '';

    //Pais
    country=' España';
        
    if    (typeof(placemark.AddressDetails.Country)!='undefined'){
        //Comunidad Autónoma
        if (typeof(placemark.AddressDetails.Country.AdministrativeArea)!='undefined')
        {
             comunidad_autonoma=placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;

            //Provincia
            if (typeof(placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea)!='undefined')
            {
                 provincia=placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
    
                //Municipio
                if (typeof(placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality)!='undefined')
                {
                     municipio=placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
            
                    //Calle y número
                    if (typeof(placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare)!='undefined')
                    {
                    calle=placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName; 
                    }
            
                    //Código Postal
                    if (typeof(placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode)!='undefined')
                    {
                         cpostal=placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
                    }
                }
            }
        }
        else if (typeof(placemark.AddressDetails.Country.Locality)!='undefined')
        {
            //Ciudad
            municipio=placemark.AddressDetails.Country.Locality.LocalityName;
            
            //Calle
            if (typeof(placemark.AddressDetails.Country.Locality.DependentLocality)!='undefined')
            {
                 calle=placemark.AddressDetails.Country.Locality.DependentLocality.DependentLocalityName;
            }
        
            //Código Postal
            if (typeof(placemark.AddressDetails.Country.Locality.PostalCode)!='undefined')
            {
                 cpostal=placemark.AddressDetails.Country.Locality.PostalCode.PostalCodeNumber;
            }
        }

    }else{ //Si no conoce placemark.AddressDetails.Country
        calle=printAddress(placemark);
    }
    
    direccion = new Array();
    
    if(calle != '') direccion.push(calle);
    if(calle != '') direccion.push('<br>');
    if(cpostal != '') direccion.push(cpostal);
    if(municipio != '') direccion.push(municipio);
    if(cpostal != '' || municipio != '') direccion.push('<br>');
    if(provincia != '') direccion.push(provincia);
    if(comunidad_autonoma != '')
    {
        if(direccion.length > 0)
        {
            direccion.push('('+comunidad_autonoma+')');
        }    
        else
        {
            direccion.push(comunidad_autonoma);
        }
    }
    
    if(direccion.length > 0)
    {
        label_address = direccion.join(' ');
    }
    else
    {
        label_address = placemark.address.replace(', Spain','');
    }
    
    return label_address;
    
}

//Borra los campos del formulario cuando se introduce dirección en la caja de búsqueda
function deleteVariables(){

    document.getElementById("latitud").value='';
    document.getElementById("longitud").value='';
    document.getElementById("zoom").value='';
    document.getElementById("tipomapa").value='';
    document.getElementById("vineta").value='';
}

function borrarCoincidencias(){
    document.getElementById('coincidencias').style.display = 'none';
    document.getElementById('coincidencias').innerHTML = '';
}

function mostrarCoincidencias(txt){
    document.getElementById('coincidencias').innerHTML = txt;
    document.getElementById('coincidencias').style.display = 'block';
}

//Función que pone la primera letra en mayúsculas y las siguientes en minúsculas
function formatoCadena(cadena_txt){

    nueva_cadena = cadena_txt;

    longitud_cadena=cadena_txt.length;
    nueva_cadena_1=cadena_txt.substring(0,1);
    nueva_cadena_2=cadena_txt.substring(1,longitud_cadena);
    nueva_cadena_1=nueva_cadena_1.toUpperCase();
    nueva_cadena_2=nueva_cadena_2.toLowerCase();
    if (nueva_cadena_1 !='' && nueva_cadena_2!=''){
        nueva_cadena=nueva_cadena_1+nueva_cadena_2;
    }
    
    return nueva_cadena;
}

//Función encargada de crear los marcadores
function createMarker(point,name,html,icon) 
{
    var marker = new GMarker(point, {icon:icon});
        GEvent.addListener(marker, "click", function() {
         control_mov_globo = 0;
            marker.openInfoWindowHtml("<div style='margin-top:3px;margin-right:10px;'>" + html + "</div>");
        });
    return marker;
}

//Limpia el mapa de marcadores y cambia el copy de los enlaces
function limpiar_marcadores(origen)
{
    var icon = new GIcon();
    icon.image = iconimage1;
    icon.shadow = iconshadow;    
    icon.iconSize = new GSize(24, 40);
    icon.shadowSize = new GSize(44, 44);
    icon.iconAnchor = new GPoint(12, 40);
    icon.infoWindowAnchor = new GPoint(12, 2);

      iconcalle20 = new GIcon(icon,iconimage2); 
    map.clearOverlays();
    
    //Pintamos el marcador de la busqueda si existe
    if(marcador_buscado != null)
    {
        var icon_b = new GIcon();
            icon_b.image = "/i/marcador_googlemaps_verde.png";//Imagen del icono
            icon_b.iconSize = new GSize(30, 35);
            icon_b.iconAnchor = new GPoint(12, 34);//Coordenada del pixel esquina izquierda superior de la imagen
            icon_b.infoWindowAnchor = new GPoint(12, 0);//coordenada del pixel esquina izquierda superior de la ventana de info
            
        //Crea una marca en el punto con uno icono, el que le pasemos o el de defecto,
            //si el último parámetro es true la marca no es clicable y hará caso omiso a los eventos
            var marker_b = new GMarker(marcador_buscado,icon_b);
            
        //Añade una pequeña capa a la marca para pintar la dirección
            map.addOverlay(marker_b);
    
        //Muestra una ventana con información en formato html, con la localización que buscabamos
                GEvent.addListener(marker_b, "click", function() {
                marker.openInfoWindowHtml('<p>'+document.getElementById("vineta").value+'</p>');
                });
      }
    
    
    if(origen=='noticias')
    {
        document.getElementById('marcadores').innerHTML = 'Ocultando...';
        GEvent.clearListeners(map, "moveend");
        markers_noticia = null;
        
        if(markers_calle != null)
            marcadores(2,icon,iconcalle20);
    
        mostrar_ocultar_texto ();
    }
      if(origen=='calle20')
    {
        document.getElementById('marcadoresc20').innerHTML = 'Ocultando...';    
        GEvent.clearListeners(map, "moveend");
        markers_calle = null;    
        mostrar_ocultar_texto ();

        if(markers_noticia != null)
            marcadores(1,icon,iconcalle20);
    }
}


