/* Copyright (c) 2009-2010 Eduardo Pereira Habkost. Todos os direitos reservados. */

var autoadjust=[];function setAutoadjust(bounds,replacement)
{autoadjust.push({b:bounds,r:replacement});}
function doAutoadjust(point)
{for(var i in autoadjust){var h=autoadjust[i];var sw=h.b.getSouthWest();var ne=h.b.getNorthEast();if(h.b.containsLatLng(point)){return h.r;}}
return point;}
function AddrSearcher(city,calculator,centerPoint)
{var coord_re=/^(.*) *@(-?\d+\.?\d*),(-?\d+\.?\d*) *$/;var gs1,gs2;var waiting=false;function recalculate()
{var from,to;from=gs1.selectedResult();to=gs2.selectedResult();if(!waiting&&from&&to){waiting=true;function c(r){return r.lat+","+r.lng;}
calculator.calcAndShow(c(from),c(to),function(){waiting=false;});gs1.setState("showingresults");gs2.setState("showingresults");function d(r){return r.titleNoFormatting+' @'+r.lat+','+r.lng;}
trackEvent(city,'calculate','',d(from),d(to));}};function hideCalcResults()
{hideResults();waiting=false;}
function Searcher(opts)
{var that=this;var linkUrl="#";var name=opts.name;var smallIconUrl='http://chart.apis.google.com/chart?cht=mm&chs=16x16&chco=FFFFFF,'+opts.color+',000000&ext=.png';var gs;var theQuery;var matches=[];var selector=eid("select"+name);var mapselect=eid("mapselect_"+name);var input=eid(name);var submit=eid("submit_"+name);var legend=eid("selecticon_"+name);var label=eid("label_"+name);var msg=eid("msg_select"+name);var spinner=eid("spinner_"+name);var matchlist=eid("matchlist_"+name);var attr=eid("attribution_"+name);var branding=eid("branding_"+name);var draggableMarker=null;var states={input:{e:null,enter:null,exit:null},selector:{e:selector,enter:function(){that.showMarkers();},exit:function(){that.hideMarkers();}},mapselect:{e:null,enter:function(){draggableMarker.show();},exit:function(){draggableMarker.closeInfoWindow();draggableMarker.hide();}},selected:{e:null,enter:function(){var r=selectedResult;var p=new GLatLng(r.lat,r.lng);createDraggableMarker(p);draggableMarker.setLatLng(p);draggableMarker.show();var t=r.titleNoFormatting;if(t)t+=" ";input.value=t+"@"+r.lat+","+r.lng;},exit:function(){draggableMarker.hide();}},showingresults:{e:null,enter:null,exit:null}};var currentState=null;function setToMarker(){input.value="@"+draggableMarker.getLatLng().toUrlValue();}
function createDraggableMarker(position)
{if(draggableMarker)
return;var icon=MapIconMaker.createMarkerIcon({width:32,height:32,primaryColor:'#'+opts.color,cornerColor:"#FFFFFF",strokeColor:"#000000"});draggableMarker=new GMarker(position,{draggable:true,icon:icon});map.addOverlay(draggableMarker);GEvent.addListener(draggableMarker,'dragstart',function(){draggableMarker.closeInfoWindow();setState("mapselect");});GEvent.addListener(draggableMarker,'drag',setToMarker);GEvent.addListener(draggableMarker,'dragend',function(){setToMarker();var p=draggableMarker.getLatLng();setSingleResult("",p.lat(),p.lng());});};function setSingleResult(title,lat,lng)
{var r={titleNoFormatting:title,lat:lat,lng:lng};selectedResult=r;setState("selected");}
function selectOnMap()
{hideCalcResults();createDraggableMarker(map.getCenter());setState("mapselect");map.panTo(draggableMarker.getLatLng());draggableMarker.openInfoWindowHtml("<h3>"+opts.title+"</h3><p>"+opts.dragme+"</p>",{maxWidth:250});setToMarker();}
function setMsg(m,spin)
{setElemText(msg,m);msg.style.display="block";if(spin)
spinner.style.display="inline";else
spinner.style.display="none";}
function clearMsg()
{spinner.style.display="none";msg.style.display="none";setElemText(msg,"");}
var selectedResult=null;this.selectedResult=function()
{return selectedResult;}
function resultMarker(r,point,lbl)
{var icon=MapIconMaker.createLabeledMarkerIcon({primaryColor:"#"+opts.color,strokeColor:"#000000",label:lbl,labelColor:"#000000",addStar:false});var m=new GMarker(point,{icon:icon});if(r.html)
m.bindInfoWindow(r.html.cloneNode(true));map.addOverlay(m);var smallUrl='http://chart.apis.google.com/chart?cht=it&chs=16x16&chco='+opts.color+',000000ff,ffffff01&chl='+lbl+'&chx=000000,0&chf=bg,s,00000000&ext=.png';return{marker:m,url:smallUrl};};function Match(r)
{var that=this;var li,a;var marker;function displayName()
{if(r.streetAddress)
return r.streetAddress;else
return r.titleNoFormatting;};this.createHtmlStuff=function(i)
{li=document.createElement("li");a=createTagWithText("a",r.titleNoFormatting);a.href=linkUrl;li.appendChild(a);if(r.streetAddress&&r.streetAddress!=r.titleNoFormatting){var ad=createTagWithText("span",r.streetAddress);ad.className="matchaddr";li.appendChild(document.createTextNode(" "));li.appendChild(ad);}
var am=document.createElement("a");am.className="maplink";am.title="Ver no mapa";am.href="#";var im=document.createElement("img");am.appendChild(im);var point=new GLatLng(r.lat,r.lng);point=doAutoadjust(point);r.lat=point.lat();r.lng=point.lng();var lbl=String.fromCharCode('a'.charCodeAt(0)+i);var m=resultMarker(r,point,lbl);im.src=m.url;marker=m.marker;setOnclick(am,function(){map.panTo(point);if(r.html)
m.marker.openInfoWindow(r.html.cloneNode(true));});li.appendChild(am);matchlist.appendChild(li);setOnclick(a,that.select);};this.unselect=function(){li.className="";};this.setLink=function(url){a.href=url;};this.select=function(){for(var i=0;i<matches.length;i++)
matches[i].unselect();li.className="selected";setElemText(label,opts.title);selectedResult=r;setState('selected');recalculate();trackEvent(city,'resultselect','',r.titleNoFormatting+' @'+r.lat+','+r.lng,'');};this.kill=function(){map.removeOverlay(marker);};this.showMarker=function(){marker.show();};this.hideMarker=function(){marker.hide();};matches.push(this);};this.changeLinks=function(url){for(var i=0;i<matches.length;i++)
matches[i].setLink(url);linkUrl=url;};function reset()
{selectedResult=null;clearChildren(attr);clearChildren(matchlist);clearMsg();for(var i=0;i<matches.length;i++)
matches[i].kill();matches=[]}
this.hideMarkers=function()
{for(var i=0;i<matches.length;i++)
matches[i].hideMarker();}
this.showMarkers=function()
{for(var i=0;i<matches.length;i++)
matches[i].showMarker();}
function setState(name)
{if(currentState){if(currentState.e)
currentState.e.style.display="none";if(currentState.exit)
currentState.exit();}
currentState=states[name];if(currentState){if(currentState.e)
currentState.e.style.display="block";if(currentState.enter)
currentState.enter();}};this.setState=setState;this.numMatches=function(){return matches.length;}
function showMatches(results){reset();if(results.length<1){setMsg("Nenhum resultado encontrado",false);}else{matches=[];for(var i=0;i<results.length;i++){var r=results[i];var match=new Match(r);match.createHtmlStuff(i);}
var at=gs.getAttribution();if(at){attr.appendChild(at);}
if(results.length>1)
setElemText(label,opts.select_title);else
setElemText(label,opts.title);}
setState('selector');if(results.length==1)
matches[0].select();};function found()
{trackEvent(city,'searchresults',name,gs.results.length,'');showMatches(gs.results);}
function localSearch(query)
{setMsg("Buscando endereço...",true);gs.clearResults();gs.setCenterPoint(centerPoint);gs.setAddressLookupMode(google.search.LocalSearch.ADDRESS_LOOKUP_ENABLED);gs.setSearchCompleteCallback(this,pr(found));gs.setResultSetSize(google.search.Search.SMALL_RESULTSET);gs.setRestriction(google.search.Search.RESTRICT_TYPE,google.search.LocalSearch.TYPE_BLENDED_RESULTS);gs.execute(query);}
function manualCoord(match)
{var title=match[1];var lat=Number(match[2]);var lng=Number(match[3]);title=trim(title);setSingleResult(title,lat,lng);}
this.search=function(query)
{reset();setState('selector');trackEvent(city,'addrsearch',name,query,'');if(!query){setMsg("Digite um endereço ou local para busca",false);}else{theQuery=query;m=coord_re.exec(query);if(m)
manualCoord(m);else
localSearch(query);}};this.dosearch=function()
{that.changeLinks("#");return that.search(input.value);};setState('input');legend.src=smallIconUrl;spinner.src="http://www.tarifadetaxi.com/images/spinner.gif";setOnclick(mapselect,selectOnMap);if(submit)
setOnclick(submit,this.dosearch);google.search.Search.getBranding(branding);gs=new google.search.LocalSearch();};this.initialize=function()
{op1={name:'from',color:"0000FF",title:"Origem:",select_title:"Selecione a Origem:",dragme:"Arraste o marcador para selecionar o ponto de origem"};gs1=new Searcher(op1);op2={name:'to',color:"00FF00",title:"Destino:",select_title:"Selecione o Destino:",dragme:"Arraste o marcador para selecionar o ponto de destino"};gs2=new Searcher(op2);var submit=eid("submit");if(submit)
setOnclick(submit,this.search);};this.search=function(){hideCalcResults();gs1.dosearch();gs2.dosearch();recalculate();return false;};}