var map;
var geocoder;
var baseIcon;

function initializeGmaps() {
    if (GBrowserIsCompatible() && document.getElementById("map-canvas")) {
        map = new GMap2(document.getElementById("map-canvas"));
        map.setCenter(new GLatLng(40, -4), 5);

        map.enableScrollWheelZoom();
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());

        // MIN zoom
        G_PHYSICAL_MAP.getMinimumResolution = function () { return 5 }; 
        G_NORMAL_MAP.getMinimumResolution = function () { return 5 }; 
        G_SATELLITE_MAP.getMinimumResolution = function () { return 5 }; 
        G_HYBRID_MAP.getMinimumResolution = function () { return 5 };

        geocoder = new GClientGeocoder();
        geocoder.setBaseCountryCode("es");
        geocoder.setViewport(new GLatLngBounds(new GLatLng(27.274161, -18.874512),  new GLatLng(43.897892, 5.361328)));

        document.getElementById("ui-message").style.display = "none";

        baseIcon = new GIcon();
        baseIcon.shadow = "/modules/gmaps/images/shadow50.png";
        baseIcon.iconSize = new GSize(20, 34);
        baseIcon.shadowSize = new GSize(37, 34);
        baseIcon.iconAnchor = new GPoint(9, 34);
        baseIcon.infoWindowAnchor = new GPoint(9, 2);
        baseIcon.infoShadowAnchor = new GPoint(18, 25);

        if (document.getElementById("utilbox_address").value != "null") {
            document.getElementById("centros-q").value = document.getElementById("utilbox_address").value;
            document.getElementById("utilbox_address").value = "null";
            getAddress();
        }

        if (document.getElementById("show_results").value == "true") {
            showResults();
        }
    }
}

// Llamamos cuando le das a Buscar
function getAddress() {
    var uiMessage = document.getElementById("ui-message");
    uiMessage.style.display = "none";

    var address = document.getElementById("centros-q").value;
    geocoder.getLocations(address, getCentros);
}

function getCentros(response) {
    // Mensaje de respuesta al usuario
    var uiMessage = document.getElementById("ui-message");

    // --------------------------------------------------------------
    // No hay respuesta del Gmaps o no encuentra nada para la dirección introducida
    if (!response || response.Status.code != 200) {
        // messageCA = "Introduzca su dirección completa (Ejemplo: Muntaner 22, 08011 Barcelona) o simplemente su código postal";
        // messageES = "Introduzca su dirección completa (Ejemplo: Muntaner 22, 08011 Barcelona) o simplemente su código postal";
        messageCA = "L'adreça no s'ha trobat.";
        messageES = "No se encuentra la dirección.";
        messageEN = "The address was not found.";
        switch (language) {
            case "ca": uiMessage.innerHTML = messageCA; break;
            case "es": uiMessage.innerHTML = messageES; break;
            case "en": uiMessage.innerHTML = messageEN; break;
        }
        uiMessage.className = "resultMessage-negative";
        uiMessage.style.display = "inline";

        // --------------------------------------------------------------
        // Resultado fuera de España
    } else if (response.Placemark[0].AddressDetails.Country.CountryNameCode != 'ES') {
        // } else if (false) {
            messageCA = "L'adreça no s'ha trobat.";
            messageES = "No se encuentra la dirección.";
            messageEN = "The address was not found.";
            switch (language) {
                case "ca": uiMessage.innerHTML = messageCA; break;
                case "es": uiMessage.innerHTML = messageES; break;
                case "en": uiMessage.innerHTML = messageEN; break;
            }
            uiMessage.className = "resultMessage-negative";
            uiMessage.style.display = "inline";


            // --------------------------------------------------------------
            // No alcanzo tener el código postal
            } else if (
                typeof(response.Placemark[0].AddressDetails.Country.AdministrativeArea) == 'undefined' 
                || typeof(response.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea) == 'undefined' 
                || typeof(response.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) == 'undefined' 
                || typeof(response.Placemark[0].AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) == 'undefined'
                || response.Placemark[0].AddressDetails.Accuracy < 5
            ) {
                userPlace = response.Placemark[0];
                userPoint = new GLatLng(userPlace.Point.coordinates[1], userPlace.Point.coordinates[0]);

                document.getElementById("my_address").value = document.getElementById("centros-q").value;

                messageCA = "Adreça trobada: <strong>";
                messageCA_2 = "No podem assignar-li un Centre de Servei Unipost. Introdueixi la seva adreça completa o el seu codi postal.";
                messageES = "Dirección encontrada: <strong>";
                messageES_2 = "No podemos asignarle un Centro de Servicio Unipost. Introduzca su dirección completa o su código postal.";
                messageEN = "Address found: <strong>";
                messageEN_2 = "We cannot assign you a Service centre. Please enter your full address or postcode.";

                switch (language) {
                    case "ca": document.getElementById("g_address").value = messageCA + userPlace.address.slice(0,-7) + "</strong>.&#160;&#160;" + messageCA_2 ; break;
                    case "es": document.getElementById("g_address").value = messageES + userPlace.address.slice(0,-7) + "</strong>.&#160;&#160;" + messageES_2 ; break;
                    case "en": document.getElementById("g_address").value = messageEN + userPlace.address.slice(0,-7) + "</strong>.&#160;&#160;" + messageEN_2 ; break;
                }
                // uiMessage.className = "resultMessage-negative";
                // uiMessage.style.display = "inline";
                document.getElementById("p_lat").value = userPlace.Point.coordinates[1];
                document.getElementById("p_lng").value = userPlace.Point.coordinates[0];
                document.getElementById("p_codpos").value = "null";

                document.getElementById("centros-q-data").submit();

                // --------------------------------------------------------------
                // Dirección OK OK
            } else {
                userPlace = response.Placemark[0];
                userPoint = new GLatLng(userPlace.Point.coordinates[1], userPlace.Point.coordinates[0]);
                userCodpos = userPlace.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;

                document.getElementById("my_address").value = document.getElementById("centros-q").value;
                // messageCA = "Li indiquem els 5 centres més propers a: <strong>";
                // messageES = "Le indicamos los 5 centros más cercanos a: <strong>";
                messageCA = "Adreça trobada: <strong>";
                messageES = "Dirección encontrada: <strong>";
                messageEN = "Address found: <strong>";
                switch (language) {
                    case "ca": document.getElementById("g_address").value = messageCA + userPlace.address.slice(0,-7) + "</strong>"; break;
                    case "es": document.getElementById("g_address").value = messageES + userPlace.address.slice(0,-7) + "</strong>"; break;
                    case "en": document.getElementById("g_address").value = messageEN + userPlace.address.slice(0,-7) + "</strong>"; break;
                }
                document.getElementById("p_lat").value = userPlace.Point.coordinates[1];
                document.getElementById("p_lng").value = userPlace.Point.coordinates[0];
                document.getElementById("p_codpos").value = userCodpos;

                document.getElementById("centros-q-data").submit();
            }
        }

        // Muestra delegaciones en el mapa (1-5)
        function showResults() {
            map.clearOverlays();
            var uiMessage = document.getElementById("ui-message");

            document.getElementById("centros-q").value = document.getElementById("my_address").value;

            uiMessage.innerHTML = document.getElementById("g_address").value;
            document.getElementById("p_codpos").value == "null" ? uiMessage.className = "resultMessage-negative" : uiMessage.className = "resultMessage-positive";
            uiMessage.style.display = "inline";

            results = getResultsFromElements();

            var centrosPoints = new Array(6);
            var centrosMarkers = new Array(6);
            var firstElementIndex;

            if (results) {
                for (i=0; i<7; i++) {
                    if (results[i]) {
                        centrosPoints[i] = new GLatLng(results[i][1], results[i][2]);
                        centrosMarkers[i] = createMarker(centrosPoints[i], i);
                        map.addOverlay(centrosMarkers[i]);
                        if (firstElementIndex == null) {
                            firstElementIndex = i;
                        }
                    }
                }
                map.setCenter(centrosPoints[firstElementIndex], 15);
            } else {
                messageCA = "Temporalment fora de servei.";
                messageES = "Temporalmente fuera de servicio.";
                messageEN = "Temporarily out of service.";
                switch (language) {
                    case "ca": uiMessage.innerHTML = messageCA; break;
                    case "es": uiMessage.innerHTML = messageES; break;
                    case "en": uiMessage.innerHTML = messageEN; break;
                }
                //uiMessage.innerHTML = "Temporalmente fuera de servicio.";
                uiMessage.className = "resultMessage-negative";
                uiMessage.style.display = "inline";
            }
        }


        // Lee la info de hidden inputs en el formulario (1-5)
        function getResultsFromElements() {
            var results = new Array(6);

            for (i=0; i<7; i++){
                if (document.getElementById("centro_"+i+"_id")) {
                    results[i] = new Array(10);
                    results[i][0] = document.getElementById("centro_"+i+"_id").value;
                    results[i][1] = document.getElementById("centro_"+i+"_lat").value;
                    results[i][2] = document.getElementById("centro_"+i+"_lng").value;
                    results[i][3] = document.getElementById("centro_"+i+"_dist").value;
                    //} else break;
                }
            }
            return results;
        }


        // Centra una delegación en el canvas del mapa
        function goToLocation(index){
            map.panTo(new GLatLng(document.getElementById("centro_"+index+"_lat").value, document.getElementById("centro_"+index+"_lng").value));
        }


        // Pone un marker en una ubicación point
        function createMarker(point, index) {
            if (index == 0) {
                var letteredIcon = new GIcon(baseIcon);
                letteredIcon.image = "/modules/gmaps/images/marker_Unipost.png";
            } else {
                index--;
                // Create a lettered icon for this point using our icon class
                var letter = String.fromCharCode("A".charCodeAt(0) + index);
                var letteredIcon = new GIcon(baseIcon);
                letteredIcon.image = "/modules/gmaps/images/marker" + letter + ".png";
            }

            // Set up our GMarkerOptions object
            markerOptions = { icon:letteredIcon };
            var marker = new GMarker(point, markerOptions);

            return marker;
        }
