
// Verifica compatibilidade
if(!GBrowserIsCompatible()) window.location.href='compatibilidade.html';

// Declarando variáveis
	var geocoder = new GClientGeocoder(); 
	var map;  
	var directionsPanel;  
	var directions;  
	var gdir = new GDirections();  
	var addr = new Array();  
	var distances = new Array();  
	var arrLocais = [];
	var buscado = new Local();
	buscado.setEndereco("");
	
function Local(coordenada, html, endereco, distancia) {
	var coordenada = coordenada;
	var html = html;
	var endereco = endereco;
	var distancia = distancia;

	this.getCoordenada = getCoordenada;
    this.getHTML = getHTML; 
    this.getEndereco = getEndereco; 
	this.getDistancia = getDistancia; 
	this.setCoordenada = setCoordenada;
    this.setHTML = setHTML; 
    this.setEndereco = setEndereco; 
	this.setDistancia = setDistancia; 

    function getCoordenada() {  
        return coordenada;  
    }  
    function setCoordenada(_coordenada) {  
        coordenada = _coordenada;  
    }
	
    function getEndereco() {  
        return endereco;  
    }  
    function setEndereco(_endereco) {  
        endereco = _endereco;  
    }
	
    function getHTML() {  
        return html;  
    }  
    function setHTML(_html) {  
        html = _html;  
    }
		
    function getDistancia() {  
        return distancia;  
    }  
    function setDistancia(_distancia) {  
        distancia = _distancia;  
    } 	
}

// Setando configurações regionais
	geocoder.setBaseCountryCode("pt_BR");

// Ícones no mapa
	var baseIcon = new GIcon();
	baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png"; // sobra do marcador
	baseIcon.iconSize = new GSize(64, 19);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	//baseIcon.image = "http://www.google.com/mapfiles/shadow50.png"; // sobra do marcador
// O mapa  
	map = new GMap2(document.getElementById("map"), { size: new GSize(520,442),backgroundColor:'#ffffff' })  
	map.setCenter(new GLatLng(-23.60552,-46.66391), 16); //centro da cidade de São Paulo  		
	//" lg="-46.659708"
// Adicionando-23.595295" lg="-46.659708" controles ao mapa
	map.addControl(new GLargeMapControl(false,false));
	map.addControl(new GMapTypeControl(false,false));
	//map.addControl(new GOverviewMapControl());

// Carregando itens no mapa
	function mapa() {
		map.clearOverlays(); // limpa todas as marcações existentes no mapa
		
		// faz a leitura do XML para marcar o mapa com os locais
		var request = GXmlHttp.create();
		request.open("GET", "/lojas.xml", true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = request.responseXML;
				var points = xmlDoc.documentElement.getElementsByTagName("point");
				conteudo = "";
				for (var i = 0; i < points.length; i++) {
					var coordenada = new Array();
					var nome = points[i].getAttribute("nome");
					var endereco = points[i].getAttribute("endereco");
					
					var telefones = points[i].getAttribute("telefones");
					coordenada[1] = points[i].getAttribute("lt");
					coordenada[0] = points[i].getAttribute("lg");
					
					html = "<b>"+nome+"</b><br>"+endereco+"<br>"+telefones;
					
					// cria o marcador no mapa
					marcador(coordenada, i, html);
					
					if(buscado.getEndereco()!="") {
						linka = "tracaRota("+i+");";
						distAB = (arrLocais[i].getDistancia()/1000).toFixed(2)+"km";
					} else {
						var local = new Local(); 
						local.setCoordenada(coordenada); 
						local.setEndereco(endereco); 
						local.setHTML(html); 
						local.setDistancia(0); 
						arrLocais[i] = local;						
						linka = "centraMapa("+arrLocais[i].getCoordenada()[0]+","+arrLocais[i].getCoordenada()[1]+");";
						distAB = "&nbsp;"						
					}
					
					
					conteudo += "<tr class='dirsegment'><td valign='top' class='dirsegtext'><a href='javascript:"+linka+"'>"+arrLocais[i].getHTML()+"</a></td><td align='right' valign='top' class='sdist'><div id='sxdist' class='nw'>"+distAB+"</div></td></tr>";
				}
				saida = "<table width='100%' class='ddr_steps' cellspacing='0'><tbody>"+conteudo+"</tbody></table>";
				// Mostra a lista de endereços em uma DIV
				window.document.getElementById("enderecos").innerHTML = saida;
			}
		}
		
		request.send(null);
	}
	
// Marca o mapa com o local
	function marcador(coordinates, i, html) {
		
		addr[i] = coordinates;  // grava a latitude/longitude do endereço
		point = new GLatLng(coordinates[1], coordinates[0]);  
		var marker = createMarker(point, html);  
		 map.addOverlay(new GMarker(point));
		 
	}

// Centra o Mapa
function centraMapa(lg,lt) {
	map.setCenter(new GLatLng(lt, lg), 16);
}
	
	
// Marcadores <<< [TODO] melhorar montagem do balão de informações
	function createMarker(point, html) {  
		
		var icon = new GIcon(baseIcon);
		icon.image = "/site/_images/iconGmaps.gif";

		var marker = new GMarker(point, icon); 

		GEvent.addListener(marker, "click", function() {
			windowOptions = {maxWidth: "280",maxHeight: "180"};
			marker.openInfoWindowHtml(html, windowOptions); 														 
			//marker.openInfoWindowHtml("<a href='http://www.alobebe.com.br' target='_blank'><img src='icon.gif' vspace='10' align='right' border='0'></a><br><font face='Verdana' size=2><b style='color:#FE2806;'>"+nome+"</b><br>"+endereco+"<p>Telefones:<br>"+telefones+"</p></font>");
		});

		return marker;  
	} 		

	
	function buscaABB(txfrom) {
		mapa(); // Limpa o mapa, e recoloca os marcadores de locais
		if(txfrom=="") {
			alert("Preencha com seu endereço primeiro");
		} else {
			// Descobre o endereço digitado
			geocoder.getLocations(  
				txfrom,  
					function(point) {  
						// O endereço existe
						if(point.Placemark) {  
							if(point.Placemark.length==1) {
								window.document.getElementById('resultados').style.display = 'none';
								// Guarda as coordenadas do endereço pesquisado  
								var a = new GLatLng(point.Placemark[0].Point.coordinates[1], point.Placemark[0].Point.coordinates[0]);
								var coordenada = new Array();
								coordenada[1] = point.Placemark[0].Point.coordinates[1];
								coordenada[0] = point.Placemark[0].Point.coordinates[0];								
								buscado.setCoordenada(coordenada); 
								buscado.setEndereco(txfrom);
								var distancia;
								var localMaisProximo;
								
								// Percorre a lista de locais
								conteudo = "";
								window.document.getElementById("enderecos").innerHTML = "";
								for(var i=0; i < addr.length; i++) {
									var b = new GLatLng(addr[i][1], addr[i][0]);  
									var x = a.distanceFrom(b); 
									arrLocais[i].setDistancia(x);
									if(x < distancia || i == 0) {  
										distancia = x;  
										localMaisProximo = i;
									}
									conteudo += "<tr class='dirsegment'><td valign='top' class='dirsegtext'><a href='javascript:tracaRota("+i+");'>"+arrLocais[i].getHTML()+"</a></td><td align='right' valign='top' class='sdist'><div id='sxdist' class='nw'>"+(arrLocais[i].getDistancia()/1000).toFixed(2)+"km</div></td></tr>";
								}
								saida = "<table width='100%' class='ddr_steps' cellspacing='0'><tbody>"+conteudo+"</tbody></table>";
								window.document.getElementById("enderecos").innerHTML = saida;
								//alert('Distância de '+ distancia/1000 + 'km');
								// Guarda o endereço mais próximo e o endereço pesquisado
								var pesquisaRota = [a, new GLatLng(addr[localMaisProximo][1], addr[localMaisProximo][0])]  
								
								// Cria o objeto de rotas << [TODO] estudar melhor o objeto
								document.getElementById("painel").innerHTML = " Faça uma consulta para obter a rota da loja mais próxima de você! ";
								document.getElementById("painel").className = 'ad_map_box_content';
								directions = new GDirections(map,document.getElementById("painel"));
								document.getElementById("painel").className = 'ad_map_box_content2';
								
								// Traça a rota
								directions.loadFromWaypoints(pesquisaRota, {locale: "pt_BR", getPolyline: true, getSteps: true});
								
								// Centraliza o mapa no ponto de partida com Zoom
								map.setCenter(a, 16);
							} else {
								// O endereço tem redundância - Cria a lista para escolha do endereço correto
								lista = "<b>Foram encontrados mais de um resultado para o endereço desejado</b><br>";
								lista += "<table width=\"100%\" class=\"ddr_steps\" id=\"ddr_steps_0\" cellspacing=\"0\"><tbody>";
								for (var j=0; j<point.Placemark.length; ++j) {
									var info = point.Placemark[j].address;
									lista += "<tr class=\"dirsegment\"><td valign=\"top\" class=\"num\"><strong>"+(j+1)+"</strong></td>";
									lista += "<td valign=\"top\" class=\"dirsegtext\"><a href=\"javascript:;\" onClick=\"buscaABB('" + info + "');\">"+info+"</a></td>";
									lista += "<td align=\"right\" valign=\"top\" class=\"sdist\"><div id=\"sxdist\" class=\"nw\">&nbsp;</div></td></tr>"
								}
								lista += "</tbody></table>";								
								window.document.getElementById('resultados').innerHTML = lista;
								window.document.getElementById('resultados').style.display = 'block';
							}
						} else {
							alert("Endereço não encontrado, verifique o preenchimento");
						}
					}  
			  )
		}
	}
	
// Pesquisa a rota de dois endereços
	function tracaRota(k) {
		var a = new GLatLng(buscado.getCoordenada()[1], buscado.getCoordenada()[0]);
		var pesquisaRota = [a, new GLatLng(arrLocais[k].getCoordenada()[1], arrLocais[k].getCoordenada()[0])];
		window.document.getElementById('painel').innerHTML = "";
		mapa();
		directions = new GDirections(map,document.getElementById("painel"));
	
		// Traça a rota
		directions.loadFromWaypoints(pesquisaRota, {locale: "pt_BR", getPolyline: true, getSteps: true});
		
		// Centraliza o mapa no ponto de partida com Zoom
		map.setCenter(a, 16);
	}
	
	function marcarEndereco(txfrom) {
		if(txfrom=="") {
			alert("Preencha com seu endereço primeiro");
		} else {
			//tenta encontrar o endereço digitado pelo usuário  
			geocoder.getLocations(  
				txfrom,  
					function(point) {  
						//marca no mapa o endereço citado  
						add_marker(point);
						//se existir o endereço que o usuário digitou...  
						if(!point.Placemark) {  
							alert("Endereço não encontrado, verifique o preenchimento");
						} else {
							map.setCenter(new GLatLng(point.Placemark[0].Point.coordinates[1], point.Placemark[0].Point.coordinates[0]), 12);
						}
					}  
			  )
		}	
	}	
	
	mapa();
	
	
/* PARA DEPOIS */

// Marca o mapa com o local BKP (encontra coordenadas)
	function marcadorBKP(endereco, i, nome, telefones) {  
		geocoder.getLocations(
			endereco,  
			function(response) {
				// Não encontra o endereço
				if(!response.Placemark) return;  
				place = response.Placemark[0];  
				addr[i] = place.Point.coordinates;  // grava a latitude/longitude do endereço

				point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);  
				var marker = createMarker(point, i, nome, telefones+'Lt:'+place.Point.coordinates[1]+'Lg:'+place.Point.coordinates[0], endereco);  
				map.addOverlay(marker); 
			}  
		);  
	}
