/**
 * Referência para a instância de GMap2.
 */
var mapaobj;

/**
 * Referência para a instância de GClientGeocoder.
 */
var geocoder; 

/**
 * Busca a localização no Google Maps e gera o mapa.
 */
function gerarMapa() {
	initGMap();
 	// Realiza a consulta pelo endereço:
 	geocoder.getLocations($F('endereco'), resolverEnderecos);
}
 
/**
 * Inicializa os objetos da API do Google Maps.
 */
function initGMap() {
	// Cria o objeto principal referenciando a div 'mapa':
	mapaobj = new GMap2(document.getElementById("mapa"));
	// Cria o objeto que resolverá as consultas de endereço:
	geocoder = new GClientGeocoder();
}

/**
 * Trata as informações da consulta do endereço.
 */
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:
		alert("Não foi possível localizar o endereço solicitado. Código de erro: " +  resposta.Status.code);
	}
	else {
		var num_resultados = resposta.Placemark.length;
		// Verifica o número de resultados:
		if(num_resultados > 1) {
			alert("Foram localizados múltiplos endereços. É necessário verificar o cadastro do endereço.");
  		}
		// Se encontrou apenas um resultado:
		else {
			// Obtém uma referência ao endereço retornado:
			var local = resposta.Placemark[0];
			// Extrai o objeto GLatLng representando as coordenadas do endereço solicitado:
			var ponto = local.Point.coordinates;
			// Extrai a precisão do endereço:
			var acc = resposta.Placemark[0].AddressDetails.Accuracy;
			// Centraliza o mapa:
			centralizaMapa(ponto[1],ponto[0],resposta.Placemark[0].address, acc);
		}
	}
}

/**
 * Centraliza o mapa.
 */
function centralizaMapa(x, y, info, acc) {
	var nivelZoom = initArrZoom();
	// Cria um ponto GLatLng:
	var p = new GLatLng(x,y);
	// Define o novo centro do mapa e o seu novo nível de zoom:
	mapaobj.setCenter(p,nivelZoom[acc]);
	// Cria um novo marcador que sera exibido no ponto p solicitado:
	marcador = new GMarker(p);
	// Adiciona o marcador ao mapa
	mapaobj.addOverlay(marcador);
}

/**
 * Inicializa o array de zoom.
 */
function initArrZoom() {
	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;
	return nivelZoom;
}
