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 {
		
		if(document.getElementById("deEndereco1").value != '') {
			idioma = document.getElementById("idioma1").value;
			paraEndereco = document.getElementById("paraEndereco1").value;
			deEndereco = document.getElementById("deEndereco1").value;
		}else{
			idioma = document.getElementById("idioma2").value;
			paraEndereco = document.getElementById("paraEndereco2").value;
			deEndereco = document.getElementById("deEndereco2").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 = '#fff';

        // 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ê 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...
}
$(document).ready(function(){
	
	$("#mapForm").submit(function(){
		if(!validar.form(this)){return false;}
		if(document.getElementById("deEndereco1").value != '') {
		//if(validaForm(this)){
			$("#map_canvas").css("display","block");
			$("#directions").css("display","block");
			var inicializado = typeof($(this).attr("class")) == "undefined" ? false : $(this).attr("class").indexOf("inicializado") == -1 ? false : true;
			if(!inicializado){
				$(this).addClass("inicializado");
				initialize();
			}
			setDirections(this.deEndereco1.value, this.paraEndereco1.value, this.idioma1.value);
		/*}
		return false;*/
		} else {alert("É preciso digitar um endereço ou CEP no campo 'De:' antes de continuar.");}
	});
	
	$("body").unload(function(){
		GUnload();
	});
	
});

