// Todas as variáveis utilizadas no sistema

// Referência para a instância de GMap2
var mapaobj;

// Referência para a instância de GClientGeocoder
var geocoder; 

// Array para mapear níveis de Zoom com a precisão do resultado
// Sinta-se livre para realizar o mapeamento achar mais conveniente.
// Note que quanto maior o número, maior o nível de zoom.
var nivelZoom = 16;
	
	
//Função chamada ao carregar a página HTML
function inicializa() {
    // Cria o objeto principal referenciando a div 'mapa'
    mapaobj = new GMap2(document.getElementById("mapa"));
    // Centraliza o mapa na coordenada (34, 0) com nível de zoom 3
    mapaobj.setCenter(new GLatLng(-27.6338, -52.2738), 15);
	mapaobj.addControl = new GLargeMapControl();
	mapaobj.addControl = new GMapTypeControl()
    // Cria o objeto que resolverá as consultas de endereço
    geocoder = new GClientGeocoder();
}


// Função chamada quando o usuário envia a consulta
function realizaConsulta() {
    // Recebe o endereço digitado no campo 'consulta' do form
    var endereco = document.forms[0].consulta.value;
    // Realiza a consulta. resolverEnderecos é a função callback
    // Javascript que será chamada quando o método getLocations do 
    // objeto geocoder retornar uma resposta.
    geocoder.getLocations(endereco, resolverEnderecos);
}

// Callback para tratar o retorno de uma chamada ao método
// getLocations() do objeto geocoder. O parâmetro resposta será
// usado para acessar os dados retornados. resolverEnderecos também faz 
// uso da função listarLocais que será explicada adiante.
function resolverEnderecos(resposta) {

    // Retira todos os marcadores existentes no mapa.
    mapaobj.clearOverlays(); 
        
    // Verifica o status da resposta
    if (!resposta || resposta.Status.code != G_GEO_SUCCESS) {

        // Caso a resposta seja inválida, exibe o motivo.
        alert("Nao foi possivel localizar o endereco solicitado");
        // Os códigos de erro são úteis para procurer o motivo
        // exato da falha na consulta de endereços na documentação
        // do GoogleMaps API
        alert("Código de erro: " +  resposta.Status.code);

    } else {

        // Caso o status da resposta seja G_GEO_SUCCESS,
        // iremos navegar em todos os resultados retornados,
        // que podem ser vários em caso de uma consulta ambígüa

        // Extrai o número de resultados retornados. O atributo
        // Placemark matém toda a informação de que precisamos
        // acerca das localidades encontradas.
        var num_resultados = resposta.Placemark.length;
        // Obtemos a referência DOM à div na qual os locais encontrados
        // serão listados através do Javascript
        var alvo = document.getElementById("locais");

        // Invoca a função listarLocais, explicada posteriormente
        listarLocais(alvo, resposta.Placemark);           

        // Caso haja múltiplos resultados, informa o fato ao usuário
        if (num_resultados > 1) {
              
              alert('A sua consulta retornou resultados ambígüos.' +
                    '\nEscolha a localidade mais adequada à consulta.');

        } else {

          // Caso haja um único resultado, 

          // Obtém uma referência ao endereço retornado
          var local = resposta.Placemark[0];

          // Extrai o um objeto GLatLng representando as coordenadas
          // do endereço solicitado
          var ponto = local.Point.coordinates;

          // Extrai a precisão do endereço. Accuracy é um número que
          // indica se o endereço retornado corresponde a um país, 
          // provincial, estado, cidade, bairro, rua, etc. Depende da
          // consulta que foi realizada. Com essa informação em mãos,
          // podemos decidir qual o nível de zoom mais adequado
          var acc = resposta.Placemark[0].AddressDetails.Accuracy;

          // Chama a função centralizaMapa passando como argumento
          // as coordenadas do ponto (posição 1 para latitude, 0 para
          // longitude); O endereço completo do ponto encontrado; a 
          // precisão do endereço para controlar o nível de zoom
          centralizaMapa(ponto[1],ponto[0],resposta.Placemark[0].address, acc);
         
       }
    }
}


// Função lista as localizações encontradas na consulta.
// Os parâmetros são: alvo --> a referência DOM da div que receberá os 
// endereços; placemark --> referência a um array de objetos representando as
// localidades encontradas
function listarLocais(alvo, placemark) {

    //Começa a escrita na div informando a quantidade de resultados
    // encontrados. O máximo retornado pelo geocoder são seis endereços
    alvo.innerHTML = "<span class='editoria'> A pesquisa retornou " +
                         placemark.length + " resultado(s): </span><br>";

    // Loop para escrever informações de cada endereço
    for (var i=0; i<placemark.length; ++i) {

        // Obtém a informação da Unidade Federativa, no caso de um 
        // endereço no Brasil
        var uf = placemark[i].AddressDetails.Country
                            .AdministrativeArea.AdministrativeAreaName;	

        // Obtém a informação sobre a precisão do endereço  
	var acc = placemark[i].AddressDetails.Accuracy;

        // Obtém um ponto GLatLng com as coordenadas da localidade i
        var p = placemark[i].Point.coordinates;
	  
        // Obtém o endereço textual completo
        var info = placemark[i].address;
	
        // Começa a escrita de um link para a função centralizaMapa do
        // endereço i encontrado
        alvo.innerHTML +="<a href='javascript:centralizaMapa(" + p[1] + 
                         "," + p[0] + ",\"" + info + "\", " + acc +
                         ")'>" + placemark[i].address +"</a><br />";
      }
  } 
  
  
  // Função para centralizar o mapa no ponto solicitado
// Parâmetros: x à latitude; y à longitude; info à Um texto que será
// exibido em um quadro informativo que aponta para o endereço;
// acc à a precisão do endereço para utilizar o zoom adequado
function centralizaMapa(x, y, info, acc) {
   
    // Cria um ponto GLatLng
    var p = new GLatLng(x,y);
    
    // Obtém o nível de zoom conforme a precisão do endereço
    var zoom = nivelZoom[acc];

    // Define o novo centro do mapa e o seu novo nível de zoom
    mapaobj.setCenter(p,zoom);

    // Cria um novo marcador que sera exibido no ponto p solicitado
    marcador = new GMarker(p);

    // Adiciona o marcador ao mapa
    mapaobj.addOverlay(marcador);

    // Exibe uma caixa de informação com o texto informado
    // Note que esse método aceita qualquer string com uma
    // formatação html arbitrária
    marcador.openInfoWindowHtml("<b> " + info + "</b>");    
  }
