    // const
    var SATS_MAP_ID = "map";
    
    // var
    var map;
    var bounds;
    var mapLoading = false;
    var waitAddressTime = 200;
    var addressOK = false;
    var searchingAddress = false;
    var currentMarker;
    var currentAddress;
    var currentAccuracy;
    var currentZoom;
    var vlatitud = "";
    var vlongitud = "";
    var vzoom = "";

    // initialize the Map
    function initMap() {

//        // Situar coordenadas
//        map = new google.maps.Map2(document.getElementById(SATS_MAP_ID));
//        map.addControl(new GLargeMapControl());
//        
//        // centrado por defecto
//        defaultCenterAndZoomMap();
        
        var myLatlng = new google.maps.LatLng(39.90973623453719, -4.833984375);
        var myOptions = {
          zoom: 4,
          center: myLatlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        var map = new google.maps.Map(document.getElementById(SATS_MAP_ID), myOptions);
        
        
        // obtenemos limites
        bounds = new GLatLngBounds();
        
        // Event listener para doble click
//        GEvent.addListener(map, "dblclick", function(overlay, latlng) {
//        
//        debugger;
//           // Clear current points
//           clearPos();
//           
//           addAddressMapMarker( currentAddress, latlng.y, latlng.x );
//           centerAndZoomMap();
//           savePos(latlng.y, latlng.x, currentZoom );
//           
//        });
        
        // lanzamos query inicial si la hay
        //initQuery();
    }

    // default centering and zoom
    function defaultCenterAndZoomMap() {
        
       // spain
       var point = new GLatLng(39.90973623453719, -4.833984375);
       currentZoom = 4;
       map.setCenter(point, currentZoom);
        
    }
    
    // This function centers the map and sets the zoom level based the lat/long of the markers.
    function centerAndZoomMap() {
        
        currentZoom = map.getBoundsZoomLevel(bounds);
        map.setZoom(currentZoom);
        map.setCenter(bounds.getCenter());
        
    }
    
    // This function centers the map and sets the zoom level based the lat/long of the markers.
    function centerAndZoomMap2( zoom ) {
        
        currentZoom = zoom;
        map.setZoom(zoom);
        map.setCenter(bounds.getCenter());
        
    }
    
    // loading actions
    function setLoading(loading){
    
        mapLoading = loading;
        searchingAddress = loading;
    
        if(loading){
        
            addressOK = false;
            
            // Limpiamos mapa
            clearPos();
            
            // limpiamos errores
            document.getElementById('errorSearch').innerHTML = "";
            
            // disable buttons
            document.getElementById('btnSearch').disabled = "disabled";
            
            // mostramos hint
            displayHint(document.getElementById(SATS_MAP_ID), 'bl','<table border="0" cellspacing="0" cellpadding="0"><tr><td><img src="/img/loading3.gif" border="0" /></td><td width="10px">&nbsp;</td><td>Buscando direcci&oacute;n...<br/>Por favor espere...</td></table>', 0, 32, 180, 10);
        
        }else{
        
            // enable butons
            document.getElementById('btnSearch').disabled = "";
            
            // escondemos hint
            hideHintElement();
        
        }
    
    }
    
    function processSearch(address, latitud, longitud, zoom){
    
        vlatitud = latitud;
        vlongitud = longitud;
        vzoom = zoom;
    
        // loading
        setLoading(true);
    
        // search address
        searchAddress( address );
    }
    
    function searchAddress(address, lblErrorId) { 
        
        //debugger;
          
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(
            address,
            function(response) {   
                                         
                if (response.Status.code == 200) {
                    
                    var place = response.Placemark[0];
                    
                    if(place!=null){
                                   
                        if (place.Point.coordinates[0] == place.Point.coordinates[1]) {
                            
                            // mensaje
                            document.getElementById(lblErrorId).innerHTML = "Direcci&oacute;n incorrecta o no encontrada. Por favor, intente afinar la b&uacute;squeda.";
                            return;
                        }
                        
                        // guardamos dirección encontrada
                        currentAddress = place.address;
                        
                        // exactitud de la direccion introducida
                        currentAccuracy = place.AddressDetails.Accuracy;
                        
                        // direccion encontrada
                        addressOK = true; 
                       
                        // pintamos marker
                        addAddressMapMarker(currentAddress, place.Point.coordinates[1], place.Point.coordinates[0]);
                        
                        // Centramos mapa
                        centerAndZoomMap();
                        
                        // retorno
                        return place.point;
                        
                        // Guardamos posicion
                        //savePos(place.Point.coordinates[1], place.Point.coordinates[0], currentZoom );      
                        
                    }else{
                        // mensaje
                        document.getElementById(lblErrorId).innerHTML = "Direcci&oacute;n incorrecta o no encontrada. Por favor, intente afinar la b&uacute;squeda.";
                    }
                                                                              
                } else {
                    if (response.Status.code != 500) { // 500 is server error, retry
                        // mensaje
                        document.getElementById(lblErrorId).innerHTML = "Direcci&oacute;n incorrecta o no encontrada. Por favor, intente afinar la b&uacute;squeda.";                                                              
                    } else {
                        // mensaje
                        document.getElementById(lblErrorId).innerHTML = "Error consultando direcci&oacute;n. Por favor, intentelo de nuevo.";                                                             
                    }
                }
                
                setLoading(false);
                if( addressOK )
                {
                    displayHint(document.getElementById(SATS_MAP_ID), 'bl','<table border="0" cellspacing="0" cellpadding="0"><tr><td width="10px">&nbsp;</td><td><b>Direcci&oacute encontrada</b></td></table>', 2000, 32, 180, 10);
                }
                    
            }
        );
    }
    
    function addAddressMapMarker( address, lat, lng ) {
                
        var point = new GLatLng(lat, lng);
        
        // extendemos limites
        bounds.extend(point);
        
        //DEFINO EL ICONO
		var iconoMarca = new GIcon(G_DEFAULT_ICON);
		//iconoMarca.image = "/img/green-arrow.png";
		iconoMarca.image = "/img/loctk.png";
		
		var tamanoIcono = new GSize(20,20);
		iconoMarca.iconSize = tamanoIcono;
		//iconoMarca.shadow = "/img/green-arrow.png";
		iconoMarca.shadow = "/img/loctk.png";
		var tamanoSombra = new GSize(20,20);
		iconoMarca.shadowSize = tamanoSombra;
		iconoMarca.iconAnchor = new GPoint(20, 20);
        
        markerOptions = { icon:iconoMarca };
        currentMarker = new GMarker(point, markerOptions);
        map.addOverlay(currentMarker);

        GEvent.addListener(currentMarker, "click", function() {
           currentMarker.openInfoWindowHtml( createAddressInfoWindowHtml( address ) );
        });
    }
    
    function savePos( lat, lng, zoom ) {
    
        savePosControl( lat, lng, zoom )
    
    }
    
    function clearPos() {
    
        // Clear current points
         
        map.clearOverlays();
        bounds = new GLatLngBounds();
       
        clearPosControl();
    
    }
    
    function createAddressInfoWindowHtml( address ){
        
        html= '<span style="width: 180px;"><b>Direcci&oacute;n:</b><br/><br/>' + address + "</span>";
    
        return html;
        
    }
