    // const
    var GALLERYS_MAP_ID = "map";
    //var QT1_RADIUS = "%2b100km";
    //var QT2_RADIUS = "%2b5km";
    var QT1_RADIUS = "%2b10km";
    var QT2_RADIUS = "%2b5km";
    
    // var
    var map;
    var bounds;
    var geoCountOk = 0;
    var geoCount = 0;
    var mapLoading = false;
    var timeout = 15000;
    var waitAddressTime = 200;
    var addressOK = false;
    var searchingAddress = false;
    var currQTYPE = 0;
    var bq = "";
    var currParam = "";
    
    // GMaps Api
    google.load("maps", "2");

    // initialize map   
    google.setOnLoadCallback(initMap);
    
    // initialize the Map
    function initMap() {

        // Situar coordenadas
        map = new google.maps.Map2(document.getElementById(GALLERYS_MAP_ID));
        map.addControl(new GLargeMapControl());
        
        // centrado por defecto
        defaultCenterAndZoomMap();
        
        // obtenemos limites
        bounds = new GLatLngBounds();
        
        // lanzamos query inicial si la hay
        initQuery();
    }
    
    // loading actions
    function setLoading(loading){
    
        mapLoading = loading;
    
        if(loading){
        
            // limpiamos
            clearDataResults();
        
            // Clear current points
            map.clearOverlays();
            bounds = new GLatLngBounds();
        
            geoCount = 0;
            geoCountOk = 0;
            
            // limpiamos errores
            // document.getElementById('errorsearch1').innerHTML = "";
            
            // disable buttons
            document.getElementById('btnSearch1').disabled = "disabled";
            document.getElementById('btnSearch2').disabled = "disabled";
            document.getElementById('btnSearch3').disabled = "disabled";
            
            displayHint(document.getElementById(GALLERYS_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>Obteniendo datos...<br/>Por favor espere...</td></table>', 0, 32, 180, 10);
        
        }else{
        
            // enable butons
            document.getElementById('btnSearch1').disabled = "";
            document.getElementById('btnSearch2').disabled = "";
            document.getElementById('btnSearch3').disabled = "";
            
            //hideHintElement();
        
        }
    
    }
    
    function processAddressSearch(address) { 
                                 
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(
            accurateFilter( address ),
            //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('errorsearch1').innerHTML = "Direcci&oacute;n incorrecta o no encontrada. Por favor, intente afinar la b&uacute;squeda.";
                            return;
                        }
                        
                        
                        // guardamos direccion encontrada
//                        currParam = place.address;
                        
                        // direccion encontrada
                        addressOK = true; 
                        
                        // anadimos marker
//                        var add = "";
//                        if(place.address == "Spain"){
//                            add = "Espa&ntilde;a";
//                        } else {
//                            add = XReplace(place.address, " Spain", " Espa&ntilde;a");
//                        }
                       
                        //document.getElementById('errorsearch1').innerHTML += "Acc:" + place.AddressDetails.Accuracy;
                       
//                        addAddressMapMarker(add, place.Point.coordinates[1], place.Point.coordinates[0]);      
                        
                    }else{
                        // mensaje
                        document.getElementById('errorsearch1').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('errorsearch1').innerHTML = "Direcci&oacute;n incorrecta o no encontrada. Por favor, intente afinar la b&uacute;squeda.";                                                              
                    } else {
                        // mensaje
                        document.getElementById('errorsearch1').innerHTML = "Error consultando direcci&oacute;n. Por favor, intentelo de nuevo.";                                                             
                    }
                }
                
                searchingAddress = false;
            }
        );
    }
    
    // query google base
    function searchBase(param, qType){
        
        var doQuery = true;      
        
        // current query type
        currQTYPE = qType;
        
         // query
        bq = "";
        currParam = param;
        
        // Loading
        setLoading(true);
        
        // Switch query type
        switch(qType)
        {
            // Address
            case 1:
                if(Trim(param) != ""){
                
                    // inicializamos
                    doQuery = false;
                    addressOK = false;
                    searchingAddress = true;
                    
                    // procasamos validacion direccion
                    processAddressSearch( param );
                    
                    // esperamos respuesta
                    setTimeout("waitAddress()", waitAddressTime);
                } else {
                    // cookie
                    createCookie("SonyGallerys_LastQuery", document.getElementById('hidUsId').value + "|1|");
                }
                    
                break;
            
            // Zip/Costal Pode
            case 2:
                
                if(param != "")
                    bq += '&bq=' + param +'&tipo=cp';
                
                // cookie
                createCookie("SonyGallerys_LastQuery", document.getElementById('hidUsId').value + "|2|" + param);   
                    
                break;
            
            // Text Search    
            case 3:
                
                if(param != "")
                    bq += '&sn=' + param;
                
                // cookie
                createCookie("SonyGallerys_LastQuery", document.getElementById('hidUsId').value + "|3|" + param);  
                
                break;
        }
        
        // OK
        if ( doQuery ){
        
            processSearch( bq );
            
        }
        
    }
    
    // google base query callback
    function searchBaseCallback( gbData ){

        var results = false;

        // si hay errores    
        if(gbData.GallerysResult.HasErrors != "0")
        {
            // TODO: Control errores
            
            // loading
            setLoading(false);
        }
        else
        {
            // if found something
            if(gbData.GallerysResult.Count != "0"){
                
                // results found
                results = true;
                
                // obtenemos numero de elementos
                geoCount = parseInt(gbData.GallerysResult.Count);
                
                // more than one element
                if(gbData.GallerysResult.Entry.length){
                    
                    // Iterate results
                    for (var i = 0; i < gbData.GallerysResult.Entry.length; i++) {
                        
                        // Add Marker
                        addMapMarker(gbData.GallerysResult.Entry[i]);
                        geoCountOk++;
                        
                    }
                    
                    // centramos
                    centerAndZoomMap();
                    
                }else{   
                    
                    // Add Marker
                    addMapMarker(gbData.GallerysResult.Entry);
                    geoCountOk++;
                    
                    // si es consulta por direccion
                    if(currQTYPE == 1){
                        // centramos
                        centerAndZoomMap();
                    } else {
                        // centramos a posicion
                        centerPosition(gbData.GallerysResult.Entry.Lat, gbData.GallerysResult.Entry.Lng, parseInt(gbData.GallerysResult.Entry.Zoom));
                    }
                }
            }
            
            // loading
            setLoading(false);
            
            // if data found
            if(results){
            
                // mostramos numero de elementos encontrados
                hideHintElement();
                displayHint(document.getElementById(GALLERYS_MAP_ID), 'bl','<table border="0" cellspacing="0" cellpadding="0"><tr><td width="10px">&nbsp;</td><td>Mostrando <b>' + gbData.GallerysResult.Count + '</b> resultados...</td></table>', 3000, 32, 180, 10);
            
            }else{
                
                // si es consulta por direccion
//                if(currQTYPE == 1){
//                    // centramos
//                    centerAndZoomMap();
//                } else {
                    // centrado por defecto
                    defaultCenterAndZoomMap();
//                }
                            
                // mostramos mensaje
                hideHintElement();
                displayHint(document.getElementById(GALLERYS_MAP_ID), 'bl','<table border="0" cellspacing="0" cellpadding="0"><tr><td width="10px">&nbsp;</td><td>No se encontraron resultados</td></table>', 0, 32, 180, 10);
            
            }
            
        }
        
        // limpiamos
        clearDataResults();
    }
    
    function waitAddress(){
        
        // si finalizo la busqueda
        if( !searchingAddress ) {
        
            // si se encontro la direccion
            if(addressOK){
            
                //var param = accurateFilter( currParam );
//                var param = currParam;
//                var bq = '';
//                if( param != '' && param.toUpperCase() != 'SPAIN' )
//                    bq = '&bq=%5blocation%3A%20%40%22' + param + '%22' + QT1_RADIUS + '%5d';
                var bq = '&bq=' + currParam;
                // cookie
                createCookie("SonyGallerys_LastQuery", document.getElementById('hidUsId').value + "|1|" + document.getElementById('ddlProvincia').value + "|"+ document.getElementById('ddlPoblaciones').value);
                
                // buscamos
                processSearch( bq );
                
            } else {
                
                // Loading
                setLoading(false);
                
                // Escondemos mensaje carga
                hideHintElement();
            }
        
        } else {
        
            setTimeout("waitAddress()", waitAddressTime);
        
        }
    }
    
    function processSearch( bq ){        
                
        var rewritingOn = false;
        if(document.getElementById('hidRewritingMode').value == "ON")
            rewritingOn = true;
        
        var attributesElement = document.createElement("script");
        attributesElement.setAttribute("id", "gbaseproxyquery");
        if(rewritingOn)
        {
           var randomnumber=Math.floor(Math.random()*10001);
           //attributesElement.setAttribute("src", "/GBaseProxyService/Default.aspx?crp=" + randomnumber + "&callback=searchBaseCallback" + bq);
           attributesElement.setAttribute("src", "/GBaseProxyService/" + randomnumber + "/Default.aspx?callback=searchBaseCallback" + bq);
        }
        else
        {
            attributesElement.setAttribute("src", "/GBaseProxyService/Default.aspx?callback=searchBaseCallback" + bq);
        }
            
        attributesElement.setAttribute("type", "text/javascript");
        document.getElementById('dataResults').appendChild(attributesElement);
    
    }
    
    function accurateFilter( param ){
    
        var country = document.getElementById("country").value;
        param = Trim( param );
    
        if( param.toUpperCase().endsWith( country ) ){
            
            if( !(param.toUpperCase().endsWith( "PLAZA " + country ) || param.toUpperCase().endsWith( "PLAZA DE " + country ) || param.toUpperCase().endsWith( "PLAÇA DE " + country ) || param.toUpperCase().endsWith( "PLAÇA " + country ) || param.toUpperCase().endsWith( "CALLE " + country ) || param.toUpperCase().endsWith( "CALLE DE " + country ) ) ){
                    
                document.getElementById('txtDireccion').value = Trim(param.substring(0, param.length - country.length));
                
                if( document.getElementById('txtDireccion').value.endsWith(",") || document.getElementById('txtDireccion').value.endsWith(".") )
                    document.getElementById('txtDireccion').value = Trim(document.getElementById('txtDireccion').value.substring(0, document.getElementById('txtDireccion').value.length - 1));
                
                param = param.substring(0, param.length - country.length) + "Spain";       
            }
        
        }
        
        if(param != ""){
        
            if( param.toUpperCase().indexOf("SPAIN") == -1){
        
                if( param.toUpperCase().indexOf("ANDORRA") == -1){
                
                    param += ", Spain";
                                
                }
            
            }
        
        } else { 
        
            param = "Spain";
        
        }
        
        // retorno
        return param;
    }
    
    // cleans JSON data
    function clearDataResults(){
    
//        var div = document.getElementById("dataResults");
//        if (div && div.firstChild) {
//            div.removeChild(div.firstChild);
//        }
    
    }
    
    // This function centers the map and sets the zoom level based the lat/long of the markers.
    function centerAndZoomMap() {
        
        map.setZoom(map.getBoundsZoomLevel(bounds));
        map.setCenter(bounds.getCenter());
        
    }
    
    function defaultCenterAndZoomMap() {
        
       // mostramos la peninsula
       // TODO: constants
       var point = new GLatLng(39.90973623453719, -4.833984375);
       var zoom = 5;
       map.setCenter(point, zoom);
        
    }
    
    function centerPosition(lat, lng, zoom){
    
        // centramos al punto especificado
        var point = new GLatLng(lat, lng);
        map.setCenter(point, zoom);
    
    }
    
    function addMapMarker( gbEntry ) {
                
        var point = new GLatLng(gbEntry.Lat, gbEntry.Lng);
        
        // extendemos limites
        bounds.extend(point);
        
        //DEFINO EL ICONO
		var iconoMarca = new GIcon(G_DEFAULT_ICON);
		iconoMarca.image = "/img/topo.png";
		var tamanoIcono = new GSize(34,32);
		iconoMarca.iconSize = tamanoIcono;
		iconoMarca.shadow = "/img/topo.png";
		var tamanoSombra = new GSize(34,32);
		iconoMarca.shadowSize = tamanoSombra;
		iconoMarca.iconAnchor = new GPoint(9,28);
        
        markerOptions = { icon:iconoMarca };
        var marker = new GMarker(point, markerOptions);
        marker.importance = 1;
        map.addOverlay(marker);

        GEvent.addListener(marker, "click", function() {
           marker.openInfoWindowHtml( createInfoWindowHtml( gbEntry ) );
        });
    }
    
    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/estas_aqui.png";
		
		var tamanoIcono = new GSize(20,20);
		iconoMarca.iconSize = tamanoIcono;
		//iconoMarca.shadow = "/img/green-arrow.png";
		iconoMarca.shadow = "/img/estas_aqui.png";
		var tamanoSombra = new GSize(20,20);
		iconoMarca.shadowSize = tamanoSombra;
		iconoMarca.iconAnchor = new GPoint(10, 35);
                       
        markerOptions = { icon:iconoMarca, zIndexProcess:importanceZIndex };
        var marker = new GMarker(point, markerOptions);
        marker.importance = 100;
        map.addOverlay(marker);

        GEvent.addListener(marker, "click", function() {
           marker.openInfoWindowHtml( createAddressInfoWindowHtml( address ) );
        });
    }
    
     function importanceZIndex(marker,b) {
        return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
     }
    
    function createInfoWindowHtml( entry ){  

		html= '<div class="poplocabsoluta">' +		
		    '<div class="poploc"><h1 nowrap="nowrap" style="padding: 8px 20px 7px 18px;" title="' + entry.Name.toUpperCase() + '">' + entry.TruncatedName.toUpperCase() + '</h1><div class="cosloc">' +
			  '<p>' + entry.Direccion + '<br />' + entry.CP + ' ' + entry.Poblacion + ' (' + entry.Provincia + ')<br /><a href="' + entry.Uri + '">Ver tienda</a></p>' +			  
//			    ( entry.Horario != '' ?  '<p class="horari">Horario</p>' : '<p class="horari"></p><p>' ) + 
//			    ( entry.Horario != '' ? entry.Horario + '<br /><br />' : '<br />' ) + 
			    ( entry.Telefono != '' ? 'Tel: ' + entry.Telefono + '<br />' : '<br />' ) + 
//			    ( entry.Fax != '' ? 'Fax: ' + entry.Fax + '<br /><br />' : '<br /><br />' ) + 
//			    ( entry.Email != '' ? '<span class="comlink">email: </span><a href="mailto:' + XReplace(entry.Email, ' ', '.') + '" target="_blank">' + XReplace(entry.Email, ' ', '.') + '</a><br />' : '<br/>' ) + 
//			    ( entry.Web != '' ? '<span class="comlink">web: </span><a href="' + entry.Web + '" target="_blank">' + entry.Web + '</a><br/>' : '<br/>' ) + 
			  '</p></div></div><div class="poplocdimensiona">&nbsp;</div>';			  
			  			    
        return html;
    }
    
    function createAddressInfoWindowHtml( address ){
        
        html= '<b>Direcci&oacute;n:</b><br/><br/>' + address;
    
        return html;
        
    }