
var map;
var gdir;
var geocoder = null;
var addressMarker;

function initialize() {
	if (GBrowserIsCompatible()) {      

		//setDirections("Av Paulista, 0, São Paulo, SP", "Av. Caxingui, 655 - Butantã, São Paulo - SP, 05579-001", "pt");
	}
}

function setDirections(deEndereco, paraEndereco, idioma) {
	
	geocoder = new GClientGeocoder();
	geocoder.getLocations(deEndereco, resolverEnderecos);
	
	//gdir.load("from: " + deEndereco + " to: " + paraEndereco, { "locale": idioma });
	
}


// 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.
    //map.clearOverlays(); 
        
    // Verifica o status da resposta
    if (!resposta || resposta.Status.code != G_GEO_SUCCESS) {

        // Caso a resposta seja inválida, exibe o motivo.
        alert("Não foi possível localizar o endereço 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 {
		
		idioma = document.getElementById("idioma").value;
		paraEndereco = document.getElementById("paraEndereco").value;
		deEndereco = document.getElementById("deEndereco").value;

//		if(document.getElementById("deEndereco1")) {
//			deEndereco = document.getElementById("deEndereco1").value;
//		}else{
//			deEndereco = document.getElementById("deEndereco2").value;
//		}
		
        // 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("map_canvas");
		document.getElementById("directions").innerHTML = '';
		alvo.style.backgroundColor = 'transparent';

        // Caso haja múltiplos resultados, informa o fato ao usuário
        if (num_resultados > 1) {
              
              // Invoca a função listarLocais, explicada posteriormente
		      listarLocais(alvo, resposta.Placemark, deEndereco, paraEndereco, idioma);
			  
			  //alert('A sua consulta retornou resultados ambígüos.' +
              //      '\nEscolha a localidade mais adequada à consulta.');
			  

        } else {
			
			map = new GMap2(document.getElementById("map_canvas"), {draggableCursor:"crosshair"});
			//map.addControl(new GScaleControl());
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			//map.addControl(new GOverviewMapControl());
			//map.enableDragging();
			
			gdir = new GDirections(map, document.getElementById("directions"));
			GEvent.addListener(gdir, "load", onGDirectionsLoad);
			GEvent.addListener(gdir, "error", handleErrors);
			
       		gdir.load("from: " + resposta.Placemark[0].address + " to: " + paraEndereco,	{ "locale": idioma });
         
       }
    }
}
// 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, deEndereco, paraEndereco, idioma) {

    //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>";
    alvo.innerHTML = "<p>Voc&ecirc; quis dizer:</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 +='<p><a href="javascript:setDirections(\''+placemark[i].address+'\', \''+paraEndereco+'\', \''+idioma+'\')" title="' + placemark[i].address +'"><strong>' + placemark[i].address +'</strong></a></p>';
	}
} 








function handleErrors(){
	if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
		alert("O endereço pesquisado não foi localizado. Isto pode ocorrer se o endereço é novo ou incorreto.\nCódigo do erro: " + gdir.getStatus().code);
	else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
		alert("Sua pesquisa não pode ser processada, o problema exato não foi identificado, por favor, tente novamente.\n Código do erro: " + gdir.getStatus().code);
	
	else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
		alert("Requisição HTTP inválida. Para requisição geocoder, o endereço está vazio. Para requisição de direção, não foi especifidado a direção.\n Código do erro: " + gdir.getStatus().code);
	
	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
		//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
	
	else if (gdir.getStatus().code == G_GEO_BAD_KEY)
		alert("A chave utilizada é inválida ou não coincide com este domínio. \n Código do erro: " + gdir.getStatus().code);
	
	else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
		alert("A direção solicitada não foi analisado com sucesso, por favor, tente novamente.\n Código do erro: " + gdir.getStatus().code);
	
	else alert("Ocorreu um erro! Possivelmente o endereço digitado é inválido ou não foi encontrado.");
   
}

function onGDirectionsLoad(){ 
  // Use this function to access information about the latest load()
  // results.
  // e.g.
  // document.getElementById("getStatus").innerHTML = gdir.getStatus().code;
  // and yada yada yada...
}

jQuery(function($) {
	
	$("#form_ver_rota").submit(function(){
		$("#map_canvas").css("display","block");
		$("#directions").css("display","block");
		setDirections(this.deEndereco.value, this.paraEndereco.value, this.idioma.value);
			
		return false;
	});
	
});

