// Referência para a instância de GMap2
var mapaobj;

// Referência para a instância de GClientGeocoder
var geocoder;

//String que armazena o endereco buscado
var busca;

//Pais padrao
var pais;

// 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() {
	// Cria o objeto principal referenciando a div 'mapa'
	mapaobj = new GMap2(document.getElementById("mapa"));
	mapaobj.addControl(new GSmallMapControl());
	var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
	mapaobj.addControl(new GMapTypeControl(), bottomRight);
	
	// Centraliza o mapa na coordenada (34, 0) com nível de zoom 3
	//mapaobj.setCenter(new GLatLng(34, 0), 2);
	// 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(buscar) {
	this.busca = buscar;
	var endereco = buscar;
	// 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) {
			mapaobj.setCenter(new GLatLng(34, 0), 2);
			realizaConsulta(busca+", "+pais);
			/*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+1);

	// 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>");
}
