// Todas as variáveis utilizadas no sistema
// Referência para a instância de GMap2var mapaobj;
// Referência para a instância de GClientGeocodervar 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 = [];
nivelZoom[0] = 2; 
nivelZoom[1] = 8; 
nivelZoom[2] = 9;
nivelZoom[3] = 10;
nivelZoom[4] = 12; 
nivelZoom[5] = 13;
nivelZoom[6] = 14; 
nivelZoom[7] = 15; 
nivelZoom[8] = 16;
// Função chamada ao carregar a página HTML
function inicializa(end) {
// 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(34, 0), 3);
// Cria o objeto que resolverá as consultas de endereço
geocoder = new GClientGeocoder();
realizaConsulta(end);

}
// Função chamada quando o usuário envia a consulta
function realizaConsulta(end) {
// Recebe o endereço digitado no campo 'consulta' do form
var endereco = end;
//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 = "<p> A pesquisa retornou " +
placemark.length + " resultado(s): </p>";
// 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>"); }
