var map=null;var geocoder=null;var markerManager=null;var followRoads=false;var editmode=false;var recording=false;var polyline=null;var undostack=new Array();var oldPoints=new Array();var undoFlag=false;var milestones=new Array();var distanceMarkers=new Array();var icons=new Array();var startFlag=null;var endFlag=null;var startMarker=null;var endMarker=null;var opacity=0.5;var graphHeight=0;var findPolylines=new Array();var findPage=0;var routeCount=0;var unsavedData=false;var mapMapnik=null;window.onresize=resizeMap;if(navigator.appVersion.indexOf("Safari")!=-1){window.onbeforeunload=function(){if(unsavedData){unsavedData=false;return"You have unsaved changes. You will lose them if you continue."}};window.onunload=function(){saveMapLocation();GUnload()}}else{window.onunload=myUnload}var mapLocation=new MyCookie("maplocation");function myUnload(){if(unsavedData){unsavedData=false;saveTempRoute(route_id)}saveMapLocation();GUnload()}function loadMap(f,g,a,h,b){if(GBrowserIsCompatible()){var e=new GCopyrightCollection('<a href="http://www.openstreetmap.org/">OpenStreetMap</a>');e.addCopyright(new GCopyright(1,new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0," "));var d=new GTileLayer(e,1,17,{tileUrlTemplate:"http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"});mapMapnik=new GMapType([d],G_NORMAL_MAP.getProjection(),"OpenSM");map=new GMap2(document.getElementById("map"),{mapTypes:[G_NORMAL_MAP,mapMapnik,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP],draggableCursor:"crosshair"});map.addControl(new GLargeMapControl());map.addControl(new GMapTypeControl());map.addControl(new GScaleControl(),new GControlPosition(G_ANCHOR_BOTTOM_RIGHT,new GSize(220,1)));if(b==true){map.addControl(new AltitudeControl())}setView(h);var c=new GLatLng(f,g);var j=9;if(typeof(a)=="number"||typeof(a)=="int"){j=a}else{j=map.getBoundsZoomLevel(a)}map.setCenter(c,j);geocoder=new GClientGeocoder();markerManager=new MarkerManager(map,{borderPadding:200});loadIcons();GEvent.addListener(map,"click",function(l,k){if(l&&l.advert_id){fetchInfoWindow(l)}else{if(l==map.getInfoWindow()){}else{if(polyline.getVertexCount()==0||followRoads==false){addPoint(k)}else{addRoute(k)}}}});loadRoute("",c,j,h)}else{document.getElementById("map").innerHTML="<h1>Browser not compatible with Google Maps. Sorry...</h1>"}}function AltitudeControl(){}AltitudeControl.prototype=new GControl();AltitudeControl.prototype.initialize=function(b){var a=document.createElement("div");var d=document.createElement("div");d.id="altShowDiv";this.setButtonStyle_(d);a.appendChild(d);GEvent.addDomListener(d,"click",function(){if(displayGraph()){$("#altShowDiv").hide();$("#altRefreshDiv").show();$("#altHideDiv").show()}});var e=document.createElement("div");e.id="altHideDiv";this.setButtonStyle_(e);e.style.backgroundPosition="0px -34px";e.style.display="none";a.appendChild(e);GEvent.addDomListener(e,"click",function(){if(!displayGraph()){$("#altRefreshDiv").hide();$("#altHideDiv").hide();$("#altShowDiv").show()}});var c=document.createElement("div");c.id="altRefreshDiv";c.style.display="none";this.setButtonStyle_(c);c.style.backgroundPosition="0px -68px";a.appendChild(c);GEvent.addDomListener(c,"click",function(){refreshGraph()});b.getContainer().appendChild(a);return a};AltitudeControl.prototype.getDefaultPosition=function(){return new GControlPosition(G_ANCHOR_BOTTOM_LEFT,new GSize(70,0))};AltitudeControl.prototype.setButtonStyle_=function(a){a.style.background="white url(/images/alt_button_sprite.png) no-repeat 0 0";a.style.border="0px solid";a.style.marginRight="3px";a.style.width="108px";a.style.height="34px";a.style.cursor="pointer";a.style.cssFloat="left";a.style.styleFloat="left"};function loadSetupMap(d,b,c,a){if(GBrowserIsCompatible()){var g=new GCopyrightCollection('<a href="http://www.openstreetmap.org/">OpenStreetMap</a>');g.addCopyright(new GCopyright(1,new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0," "));var f=new GTileLayer(g,1,17,{tileUrlTemplate:"http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"});mapMapnik=new GMapType([f],G_NORMAL_MAP.getProjection(),"OpenSM");map=new GMap2(document.getElementById("map"),{mapTypes:[G_NORMAL_MAP,mapMapnik,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP],draggableCursor:"crosshair"});map.addControl(new GLargeMapControl());map.addControl(new GMapTypeControl());map.addControl(new GScaleControl());setView(a);var e=new GLatLng(d,b);map.setCenter(e,c);geocoder=new GClientGeocoder();loadIcons();GEvent.addListener(map,"moveend",function(){mapChanged=true})}else{document.getElementById("map").innerHTML="<h1>Browser not compatible with Google Maps. Sorry...</h1>"}}function loadRoute(h,a,j,e){setView(e);map.setCenter(a,j);var g=new Array();if(h!=""){var c=h.split(",");for(var d=0;d<c.length;d++){var b=c[d].split(":");var f=new GLatLng(parseFloat(b[0]),parseFloat(b[1]));if(d==0){g.push(f)}else{if(f.lat().toFixed(6)!=g[g.length-1].lat().toFixed(6)||f.lng().toFixed(6)!=g[g.length-1].lng().toFixed(6)){g.push(f)}}}}polyline=new GPolyline(g,"#ff0000",3,opacity,{clickable:false});map.addOverlay(polyline);update();oldPoints.length=0;for(var d=0;d<polyline.getVertexCount();d++){oldPoints[d]=polyline.getVertex(d)}addPolylineListener()}function update(){if(endMarker!==null&&endMarker!==undefined){map.removeOverlay(endMarker);endMarker=undefined}if(startMarker!==null&&startMarker!==undefined){map.removeOverlay(startMarker);startMarker=undefined}if(polyline.getVertexCount()>0){if(polyline.getVertexCount()>1){var a=polyline.getVertex(polyline.getVertexCount()-1);endMarker=new GMarker(a,{icon:endFlag,clickable:false,title:"Finish"});map.addOverlay(endMarker)}startMarker=new GMarker(polyline.getVertex(0),{icon:startFlag,clickable:false,title:"Start"});map.addOverlay(startMarker)}displayDistance();displayEnergy();updateMarkers()}function updateMarkers(){if(distanceMarkers.length>0){for(var d=0;d<distanceMarkers.length;d++){map.removeOverlay(distanceMarkers[d])}distanceMarkers.length=0}var b=document.getElementById("showMarkers");if(b&&b.checked&&polyline.getVertexCount()>1){var e=document.getElementById("miles");if(e.checked==true){unitDistance=1000/0.621367}else{unitDistance=1000}var l=new Array();l[0]=0;for(d=1;d<polyline.getVertexCount();d++){l[d]=l[d-1]+polyline.getVertex(d-1).distanceFrom(polyline.getVertex(d))/unitDistance}var a=l[l.length-1];step=1;if(a>30){step=5}if(a>104){step=10}if(a>209){step=20}if(a>519){step=50}var j=0;var g=0;for(d=1;d<l.length;d++){var f=Math.floor(l[d]);while(f>=j+step){j+=step;var n=(j-l[d-1])/((l[d]-l[d-1]));var h=polyline.getVertex(d-1).lat()+(polyline.getVertex(d).lat()-polyline.getVertex(d-1).lat())*n;var k=polyline.getVertex(d-1).lng()+(polyline.getVertex(d).lng()-polyline.getVertex(d-1).lng())*n;var m=new GLatLng(h,k);if(milestones[j]){var c=new GMarker(m,{icon:milestones[j],clickable:false})}else{var c=new GMarker(m,{icon:milestones[0],clickable:false})}map.addOverlay(c);distanceMarkers[g++]=c}}}}function searchRoutes(page){var zoom=map.getZoom();if(zoom<11){alert("Route search only works at zoom level 11 or greater\n\nClick 'OK' to search at zoom level 11");map.setZoom(11)}var bounds=map.getBounds();var sw=bounds.getSouthWest();var ne=bounds.getNorthEast();var params="allsports="+document.getElementById("all_sports").checked;if(!document.getElementById("all_sports").checked){params+="&sports=";var sportList="";if(document.getElementById("running_select").checked){sportList+="running|"}if(document.getElementById("walking_select").checked){sportList+="walking|"}if(document.getElementById("cycling_select").checked){sportList+="cycling|"}if(document.getElementById("mountain_biking_select").checked){sportList+="mountain biking|"}if(document.getElementById("horse_riding_select").checked){sportList+="horse riding|"}if(document.getElementById("canoeing_select").checked){sportList+="canoeing|"}if(document.getElementById("downhill_skiing_select").checked){sportList+="downhill skiing|"}if(document.getElementById("cross-country_skiing_select").checked){sportList+="cross-country skiing|"}if(document.getElementById("swimming_select").checked){sportList+="swimming|"}params+=encodeURIComponent(sportList)}params+="&min_dist="+document.getElementById("minlength").value;params+="&max_dist="+document.getElementById("maxlength").value;var bounds=map.getBounds();var sw=bounds.getSouthWest();var ne=bounds.getNorthEast();params+="&n="+ne.lat()+"&e="+ne.lng()+"&s="+sw.lat()+"&w="+sw.lng();var oldpage=-1;if(page==0){findPage=0;var requestC=GXmlHttp.create();requestC.open("POST","/main/ajax/searchRouteCount",true);requestC.setRequestHeader("Content-type","application/x-www-form-urlencoded");requestC.setRequestHeader("Content-length",params.length);requestC.setRequestHeader("Connection","close");requestC.onreadystatechange=function(){if(requestC.readyState==4&&requestC.status==200){routeCount=parseInt(requestC.responseText);if(isNaN(routeCount)){alert("RouteCount: "+requestC.responseText);routeCount=0}if(document.getElementById("routesShowing")){var perPage=parseInt(document.getElementById("per_page").value);var from=findPage*perPage+1;var to=(1+findPage)*perPage;if(from>routeCount){from=routeCount}if(to>routeCount){to=routeCount}routesHTML='<input type="button" onclick="searchRoutes(-1);return false;" class="previousButton" />';routesHTML+='<input type="button" onclick="searchRoutes(1);return false;" class="nextButton" />';routesHTML+="<p>"+from+"-"+to+" "+ofLang+" "+routeCount;if(to<100){routesHTML+=" "+matchesLang}routesHTML+="</p>";document.getElementById("routesShowing").innerHTML=routesHTML}}};requestC.send(params)}else{oldpage=findPage;findPage+=page;maxPage=Math.floor(routeCount/parseInt(document.getElementById("per_page").value));if(findPage>maxPage){findPage=maxPage}if(findPage<0){findPage=0}}if(oldpage!=findPage){params+="&page="+findPage;params+="&per_page="+document.getElementById("per_page").value;params+="&sort_by="+document.getElementById("sort_by").value;var request=GXmlHttp.create();request.open("POST","/main/ajax/searchRoutes",true);request.setRequestHeader("Content-type","application/x-www-form-urlencoded");request.setRequestHeader("Content-length",params.length);request.setRequestHeader("Connection","close");request.onreadystatechange=function(){if(request.readyState==4&&request.status==200){var routesHTML="";var countContent="";if(request.responseText.length>0){var findRoutes=eval("("+request.responseText+")")}else{var findRoutes=new Array()}var perPage=parseInt(document.getElementById("per_page").value);var from=findPage*perPage+1;var to=(1+findPage)*perPage;if(from>routeCount){from=routeCount}if(to>routeCount){to=routeCount}routesHTML='<div id="routesShowing" style="margin-bottom:5px;"><input type="button" onclick="searchRoutes(-1);return false;" class="previousButton" />';routesHTML+='<input type="button" onclick="searchRoutes(1);return false;" class="nextButton" />';routesHTML+="<p>"+from+"-"+to+" "+ofLang+" "+routeCount;if(to<100){routesHTML+=" "+matchesLang}routesHTML+="</p></div>";if(findRoutes.length>0){var light_bg=true;for(var i=0;i<findRoutes.length;i++){var route=findRoutes[i];var points=new Array();for(var j=0;j<route.points.length;j++){points.push(new GLatLng(route.points[j].lat,route.points[j].lng))}if(findPolylines[i]){map.removeOverlay(findPolylines[i])}findPolylines[i]=new GPolyline(points,route.color,5,1);map.addOverlay(findPolylines[i]);var km=(route.distance/1000);var miles=(route.distance*0.621367/1000);routesHTML+='<div class="found_route'+(light_bg?" light_bg":"")+'">';routesHTML+='<div class="route_colour" style="background-color:'+route.color+';"></div>';routesHTML+="<div>"+route.name+"<br /></div>";routesHTML+='<div style="float:right;padding:2px 0 5px 0;"><a class="search_view" href="'+route.sport+"/route_"+route.route_id+'.html" onclick="var w=window.open(this.href, \'view_route\'); w.focus(); return false;">View Route</a></div>';routesHTML+='<div><span class="distance">'+km.toFixed(1)+"Km&nbsp;/&nbsp;"+miles.toFixed(1)+"Ml</span></div>";routesHTML+="</div>";light_bg=!light_bg}}else{routesHTML=sorrynomatchesLang}var routeContainerElement=document.getElementById("routeContainer");routeContainerElement.innerHTML=routesHTML}};request.send(params);$("#routes_form").css("display","block");var routeContainerElement=document.getElementById("routeContainer");routeContainerElement.innerHTML=holdingHTML;for(var i=0;i<findPolylines.length;i++){map.removeOverlay(findPolylines[i])}findPolylines.length=0}}function clearSearchResults(){var a=document.getElementById("routeContainer");a.innerHTML=""}function minimiseSearch(){document.getElementById("searchControls").style.display="none";document.getElementById("searchRestore").style.display="block"}function maximiseSearch(){document.getElementById("searchRestore").style.display="none";document.getElementById("searchControls").style.display="block";$("#routes_form").css("display","none")}function saveMapLocation(){if(map){mapLocation=new MyCookie("maplocation");var b=map.getCenter();mapLocation.lat=b.lat();mapLocation.lng=b.lng();mapLocation.zoom=map.getZoom();var a=window.top.location.hostname;a=a.substring(a.indexOf("."));mapLocation.store("/",a)}}function fetchInfoWindow(a){var b=GXmlHttp.create();b.open("POST","/main/ajax/getInfoWindow",true);var c="advert_id="+encodeURIComponent(a.advert_id);b.setRequestHeader("Content-type","application/x-www-form-urlencoded");b.setRequestHeader("Content-length",c.length);b.setRequestHeader("Connection","close");b.onreadystatechange=function(){if(b.readyState==4&&b.status==200){if(b.responseText.length>1){var e=a.type.split("_");var f=b.responseText.split("|");var d=new Array();d[0]=new GInfoWindowTab(e[0],f[0]);d[1]=new GInfoWindowTab("description",f[1]);a.openInfoWindowTabsHtml(d,{maxWidth:250})}}};b.send(c)}function setView(a){switch(a){case"Satellite":mapType=G_SATELLITE_MAP;break;case"Hybrid":mapType=G_HYBRID_MAP;break;case"Terrain":mapType=G_PHYSICAL_MAP;break;case"OpenSM":mapType=mapMapnik;break;default:mapType=G_NORMAL_MAP}map.setMapType(mapType)}function setMapDefaults(){mapChanged=false;latElement=document.getElementById("lat");lngElement=document.getElementById("lng");zoomElement=document.getElementById("zoom");viewElement=document.getElementById("view");var a=map.getCenter();latElement.value=a.lat();lngElement.value=a.lng();zoomElement.value=map.getZoom();mapType=map.getCurrentMapType();if(mapType==G_SATELLITE_MAP){viewType="Satellite"}else{if(mapType==G_HYBRID_MAP){viewType="Hybrid"}else{if(mapType==G_PHYSICAL_MAP){viewType="Terrain"}else{if(mapType==mapMapnik){viewType="OpenSM"}else{viewType="Map"}}}}viewElement.value=viewType;return true}function resizeMap(){var b=document.getElementById("map");var d=document.getElementById("menu");var a=$(window).height()-70-graphHeight;b.style.height=a+"px";var c=$(window).width()-402;b.style.width=c+"px";d.style.width=c+"px";var e=document.getElementById("google_graph");if(e){if(e.style.width!=(c-140)+"px"){e.style.width=(c-140)+"px";redrawGraph()}}}function changeLocation(){if(geocoder){var b=$("#country").val();var a=$("#locationBox").val();if(a&&a!=""){if(b!="WWW"){geocoder.setBaseCountryCode(b)}geocoder.getLatLng(a,function(c){if(!c){alert(a+" not found")}else{map.setCenter(c,14)}})}}}function startRecording(){recording=true;if($("#stopButton").hasClass("selected")){$("#stopButton").removeClass("selected")}if(!$("#startButton").hasClass("selected")){$("#startButton").addClass("selected")}$("#startButton").removeAttr("disabled")}function stopRecording(){recording=false;if($("#startButton").hasClass("selected")){$("#startButton").removeClass("selected")}if(!$("#stopButton").hasClass("selected")){$("#stopButton").addClass("selected")}$("#startButton").removeAttr("disabled")}function saveRoute(b){if(polyline.getVertexCount()<2){alert("no route to save")}else{var d="alt_"+getAltParams();d+="&points=";if(polyline){for(var h=0;h<polyline.getVertexCount();h++){var g=polyline.getVertex(h);if(h>0){d+=","}d+=g.lat().toFixed(6)+":"+g.lng().toFixed(6)}d+="&distance="+polyline.getLength().toFixed(0)}else{d+="&distance=0"}var c=document.getElementById("showMarkers");var f=c.checked;var j=document.getElementById("miles");if(j.checked==true){var l="miles"}else{var l="km"}var k=document.getElementById("sport");d+="&sport="+k.value;var a=map.getCenter();d+="&location="+a.lat()+":"+a.lng();d+="&zoom="+map.getZoom();d+="&view="+map.getCurrentMapType().getName();d+="&units="+l;d+="&markers="+f;if(b){d+="&id="+b}var e=GXmlHttp.create();e.open("POST","/main/ajax/save",true);e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.setRequestHeader("Content-length",d.length);e.setRequestHeader("Connection","close");e.onreadystatechange=function(){if(e.readyState==4&&e.status==200){unsavedData=false;window.top.location=e.responseText}};e.send(d)}}function saveTempRoute(b){if(polyline&&polyline.getVertexCount()>1){var d="points=";for(var h=0;h<polyline.getVertexCount();h++){var g=polyline.getVertex(h);if(h>0){d+=","}d+=g.lat().toFixed(6)+":"+g.lng().toFixed(6)}d+="&distance="+polyline.getLength();var c=document.getElementById("showMarkers");var f=c.checked;var j=document.getElementById("miles");if(j.checked==true){var l="miles"}else{var l="km"}var k=document.getElementById("sport");d+="&sport="+k.value;var a=map.getCenter();d+="&location="+a.lat()+":"+a.lng();d+="&zoom="+map.getZoom();d+="&view="+map.getCurrentMapType().getName();d+="&units="+l;d+="&markers="+f;d+="&temp=1";if(b){d+="&route_id="+b}var e=GXmlHttp.create();e.open("POST","/main/ajax/save_temp",true);e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.setRequestHeader("Content-length",d.length);e.setRequestHeader("Connection","close");e.send(d)}}function saveViewedRoute(a){params="route_id="+a;var b=GXmlHttp.create();b.open("POST","/main/ajax/saveViewed",true);b.setRequestHeader("Content-type","application/x-www-form-urlencoded");b.setRequestHeader("Content-length",params.length);b.setRequestHeader("Connection","close");b.onreadystatechange=function(){if(b.readyState==4&&b.status==200){location=b.responseText}};b.send(params)}function addPoint(a){if(editmode!=true&&recording){polyline.insertVertex(polyline.getVertexCount(),a);update();unsavedData=true}}function addRoute(a){if(editmode!=true&&recording){var b=new Array();b[0]=polyline.getVertex(polyline.getVertexCount()-1);b[1]=a;paneldiv=document.getElementById("panel");directions=new GDirections(null,paneldiv);GEvent.addListener(directions,"load",function(){var f=directions.getPolyline();var g=polyline.getVertexCount();for(var d=1;d<f.getVertexCount();d++){var c=f.getVertex(d);var e=polyline.getVertex(polyline.getVertexCount()-1);if(c.lat().toFixed(6)!=e.lat().toFixed(6)||c.lng().toFixed(6)!=e.lng().toFixed(6)){polyline.insertVertex(polyline.getVertexCount(),c)}}panelElement=document.getElementById("panel");panelElement.innerHTML="";unsavedData=true});GEvent.addListener(directions,"error",function(){switch(directions.getStatus().code){case 604:alert('We could not compute directions to the last point you clicked.\nThis is usually because there is no route available between the two\npoints, or because we do not have data for routing in that region.\n\nTry turning off the "auto-follow roads" feature and follow the route\nby hand until you reach a larger road or path');break;case 500:alert("A geocoding or directions request could not be successfully\nprocessed - the exact reason for the failure is not known (status"+directions.getStatus().code+").");break;default:alert("An error occured in finding directions (status "+directions.getStatus().code+")");break}});directions.loadFromWaypoints(b,{getPolyline:true,travelMode:G_TRAVEL_MODE_WALKING})}}function showUndostack(){var a="";for(i=0;i<undostack.length;i++){if(undostack[i].latlng){a+=i+" - "+undostack[i].position+"-"+undostack[i].latlng.lat()+":"+undostack[i].latlng.lng()+" \n"}else{a+=i+" - "+undostack[i].start+":"+undostack[i].end+" \n"}}alert(a)}function undoPoint(){undoFlag=true;if(undostack.length>0){var d=undostack.pop();if(d.start!==undefined){panTo=d.start-1;for(var a=d.end;a>=d.start;a--){var b=polyline.getVertexCount();if(d.start==0){deletePolyline();unsavedData=false;break}else{if(b==2){firstpoint=polyline.getVertex(0);deletePolyline();polyline.insertVertex(0,firstpoint);undostack.push({start:0,end:0});unsavedData=true}else{if(b>2){polyline.deleteVertex(a);unsavedData=true}}}}}else{if(d.position!==undefined){panTo=d.position;polyline.insertVertex(d.position,d.latlng);polyline.deleteVertex(d.position+1);unsavedData=true}}}else{if(polyline.getVertexCount()>2){polyline.deleteVertex(polyline.getVertexCount()-1);unsavedData=true}else{if(polyline.getVertexCount()==2){firstpoint=polyline.getVertex(0);deletePolyline();polyline.insertVertex(0,firstpoint);undostack.push({start:0,end:0});unsavedData=true}}}if(unsavedData==true){oldPoints.length=0;for(var a=0;a<polyline.getVertexCount();a++){oldPoints[a]=polyline.getVertex(a)}var c=document.getElementById("autoScroll");if(c&&c.checked&&panTo!==undefined){if(panTo<polyline.getVertexCount()&&panTo>=0){map.panTo(polyline.getVertex(panTo))}}update()}setTimeout("undoFlag=false;",100)}function clearRoute(a){if(confirm(a)){clearRoute2();deletePolyline();update();refreshElement=document.getElementById("refGraph");if(refreshElement){refreshGraph()}unsavedData=false}}function clearRoute2(){map.clearOverlays()}function deletePolyline(){polyline.disableEditing();oldpolyline=polyline;polyline=new GPolyline([],"#ff0000",3,opacity,{clickable:false});undostack.length=0;oldPoints.length=0;map.addOverlay(polyline);drawMode();addPolylineListener();setTimeout("map.removeOverlay(oldpolyline);",100)}function closeLoop(){if(polyline.getVertex(0).lat()!=polyline.getVertex(polyline.getVertexCount()-1).lat()||polyline.getVertex(0).lng()!=polyline.getVertex(polyline.getVertexCount()-1).lng()){if(followRoads==false&&polyline.getVertexCount()>0){polyline.insertVertex(polyline.getVertexCount(),polyline.getVertex(0))}else{if(followRoads==true&&polyline.getVertexCount()>0){addRoute(polyline.getVertex(0))}}unsavedData=true}}function outBack(){var b=polyline.getVertexCount();if(b>1){for(i=polyline.getVertexCount()-2;i>=0;i--){var a=new GLatLng(polyline.getVertex(i).lat()+0.000025,polyline.getVertex(i).lng()+0.000025);polyline.insertVertex(polyline.getVertexCount(),a)}unsavedData=true}}function displayDistance(){var d=0;if(polyline&&polyline.getVertexCount()>0){d=polyline.getLength()/1000}var b=document.getElementById("miles");if(b&&b.checked==true){d=d*0.621367;var a=" Miles"}else{var a=" Km"}d=d.toFixed(2);var c=document.getElementById("distance");if(c){c.innerHTML=d+a}return d}function displayEnergy(){var c=document.getElementById("energy");if(c){var h=0;var f=document.getElementById("sport");var b=f.value;if(polyline&&polyline.getVertexCount()>0){var g={running:0.999,cycling:0.403,walking:0.699,"mountain biking":0.544,swimming:2.941,"horse riding":0.502,canoeing:0.765,"cross-country skiing":1.211,"downhill skiing":0.118};var a=document.getElementById("weight");var e=parseInt(a.value);var d=g[b];h=d*e*polyline.getLength()/1000}var k=document.getElementById("joules");if(k.checked==true){var j=" kJ";h=h*4.184}else{var j=" kCal"}h=h.toFixed(0);c.innerHTML=h+j;var l=document.getElementById("sport_icon");if(l){l.src="/images/sports/"+b.replace(/ /,"_")+".png"}}}function showMarkers(a,h){unitDistance=1000;if(h=="miles"){unitDistance=1000/0.621367}var g=new Array();g[0]=0;for(i=1;i<polyline.getVertexCount();i++){g[i]=g[i-1]+polyline.getVertex(i-1).distanceFrom(polyline.getVertex(i))/unitDistance}var a=g[g.length-1];step=1;if(a>30){step=5}if(a>104){step=10}if(a>209){step=20}if(a>519){step=50}var e=0;for(i=1;i<g.length;i++){var c=Math.floor(g[i]);while(c>=e+step){e+=step;var k=(e-g[i-1])/(g[i]-g[i-1]);var d=polyline.getVertex(i-1).lat()+(polyline.getVertex(i).lat()-polyline.getVertex(i-1).lat())*k;var f=polyline.getVertex(i-1).lng()+(polyline.getVertex(i).lng()-polyline.getVertex(i-1).lng())*k;var j=new GLatLng(d,f);if(milestones[e]){var b=new GMarker(j,{icon:milestones[e],clickable:false})}else{var b=new GMarker(j,{icon:milestones[0],clickable:false})}map.addOverlay(b)}}}function followMode(){if($("#dontButton").hasClass("selected")){$("#dontButton").removeClass("selected")}if(!$("#followButton").hasClass("selected")){$("#followButton").addClass("selected")}followRoads=true}function dontFollowMode(){if($("#followButton").hasClass("selected")){$("#followButton").removeClass("selected")}if(!$("#dontButton").hasClass("selected")){$("#dontButton").addClass("selected")}followRoads=false}function drawMode(){if($("#editButton").hasClass("selected")){$("#editButton").removeClass("selected")}if(!$("#drawButton").hasClass("selected")){$("#drawButton").addClass("selected")}$("#drawButton").removeAttr("disabled");editmode=false;polyline.disableEditing()}function editMode(){if($("#drawButton").hasClass("selected")){$("#drawButton").removeClass("selected")}if(!$("#editButton").hasClass("selected")){$("#editButton").addClass("selected")}$("#drawButton").removeAttr("disabled");editmode=true;polyline.enableEditing()}function addPolylineListener(){GEvent.addListener(polyline,"lineupdated",function(){if(!undoFlag){if(polyline.getVertexCount()>oldPoints.length){if(oldPoints.length==0&&polyline.getVertexCount()==1){undostack.push({start:0,end:0});panTo=0}else{var f=oldPoints[oldPoints.length-1];var e=polyline.getVertex(oldPoints.length-1);if(f.lat()==e.lat()&&f.lng()==e.lng()){undostack.push({start:oldPoints.length,end:polyline.getVertexCount()-1});panTo=polyline.getVertexCount()-1}else{for(var b=0;b<oldPoints.length;b++){var a=oldPoints[b];var d=polyline.getVertex(b);if(a.lat()!=d.lat()||a.lng()!=d.lng()){undostack.push({start:b,end:b});panTo=b;break}}}}}else{if(polyline.getVertexCount()==oldPoints.length){for(var b=0;b<oldPoints.length;b++){var a=oldPoints[b];var d=polyline.getVertex(b);if(a.lat()!=d.lat()||a.lng()!=d.lng()){undostack.push({position:b,latlng:a});panTo=b;break}}}}oldPoints.length=0;for(var b=0;b<polyline.getVertexCount();b++){oldPoints[b]=polyline.getVertex(b)}update()}var c=document.getElementById("autoScroll");if(c&&c.checked&&panTo!==undefined){if(panTo<polyline.getVertexCount()&&panTo>=0){map.panTo(polyline.getVertex(panTo))}}})}function loadIcons(){milestones[0]=new GIcon();milestones[0].sprite={image:"/images/markers/milestones_sprite.png",width:15,height:15,top:0,left:0};milestones[0].shadow="/images/markers/milestone_shadow.png";milestones[0].shadowSize=new GSize(24,15);milestones[0].iconAnchor=new GPoint(15,8);var a=15;for(i=1;i<=30;i++){milestones[i]=new GIcon(milestones[0]);milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:15,height:15,top:a,left:0};a+=15}for(i=35;i<=100;i+=5){milestones[i]=new GIcon(milestones[0]);if(i<100){milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:15,height:15,top:a,left:0}}else{milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0}}a+=15}for(i=110;i<=200;i+=10){milestones[i]=new GIcon(milestones[100]);milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15}for(i=220;i<=500;i+=20){milestones[i]=new GIcon(milestones[100]);milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15}for(i=550;i<=950;i+=50){milestones[i]=new GIcon(milestones[100]);milestones[i].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15}milestones[250]=new GIcon(milestones[100]);milestones[250].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15;milestones[350]=new GIcon(milestones[100]);milestones[350].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15;milestones[450]=new GIcon(milestones[100]);milestones[450].sprite={image:"/images/markers/milestones_sprite.png",width:22,height:15,top:a,left:0};a+=15;startFlag=new GIcon();startFlag.sprite={image:"/images/markers/flags_sprite.png",width:20,height:20,top:0,left:0};startFlag.shadow="/images/markers/flag_shadow.png";startFlag.shadowSize=new GSize(34,20);startFlag.iconSize=new GSize(20,20);startFlag.iconAnchor=new GPoint(2,20);endFlag=new GIcon(startFlag);endFlag.iconAnchor=new GPoint(8,20);endFlag.sprite={image:"/images/markers/flags_sprite.png",width:20,height:20,top:20,left:0};icons.club_cycling=new GIcon();icons.club_cycling.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:0,left:0};icons.club_cycling.shadow=null;icons.club_cycling.shadowSize=null;icons.club_cycling.iconAnchor=new GPoint(15,15);icons.club_cycling.infoWindowAnchor=new GPoint(15,15);icons.club_mountain_bike=new GIcon(icons.club_cycling);icons.club_mountain_bike.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:30,left:0};icons.club_running=new GIcon(icons.club_cycling);icons.club_running.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:60,left:0};icons.club_walking=new GIcon(icons.club_cycling);icons.club_walking.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:90,left:0};icons.gym=new GIcon(icons.club_cycling);icons.gym.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:120,left:0};icons.misc=new GIcon(icons.club_cycling);icons.misc.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:150,left:0};icons.shop_cycling=new GIcon(icons.club_cycling);icons.shop_cycling.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:180,left:0};icons.shop_outdoor=new GIcon(icons.club_cycling);icons.shop_outdoor.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:210,left:0};icons.shop_running=new GIcon(icons.club_cycling);icons.shop_running.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:240,left:0};icons.shop_sports=new GIcon(icons.club_cycling);icons.shop_sports.sprite={image:"/images/markers/ad_sprite.png",width:30,height:30,top:270,left:0}}function checkForReturn(b){var c=b||window.event;var a=c.charcode||c.keyCode;if(a==13||a==10){changeLocation()}}function getAltParams(){var d=document.getElementById("miles");unitDistance=1000;var a=new Array();a[0]=0;for(i=1;i<polyline.getVertexCount();i++){a[i]=a[i-1]+polyline.getVertex(i-1).distanceFrom(polyline.getVertex(i))/unitDistance}step=a[a.length-1]/200;var e=0;var g="points=0.0,"+polyline.getVertex(0).lat().toFixed(6)+","+polyline.getVertex(0).lng().toFixed(6);for(i=1;i<a.length;i++){while(e+step<=a[i]){e+=step;var c=(e-a[i-1])/((a[i]-a[i-1]));var f=polyline.getVertex(i-1).lat()+(polyline.getVertex(i).lat()-polyline.getVertex(i-1).lat())*c;var b=polyline.getVertex(i-1).lng()+(polyline.getVertex(i).lng()-polyline.getVertex(i-1).lng())*c;g+=":"+e.toFixed(3)+","+f.toFixed(6)+","+b.toFixed(6)}}g+=":"+a[a.length-1].toFixed(3)+","+polyline.getVertex(polyline.getVertexCount()-1).lat().toFixed(6)+","+polyline.getVertex(polyline.getVertexCount()-1).lng().toFixed(6);return g}function refreshGraph(){if(polyline.getVertexCount()>1){var b=getAltParams();var a=GXmlHttp.create();a.open("POST","/main/ajax/graph",true);a.setRequestHeader("Content-type","application/x-www-form-urlencoded");a.setRequestHeader("Content-length",b.length);a.setRequestHeader("Connection","close");a.onreadystatechange=function(){if(a.readyState==4&&a.status==200){redrawGraph()}};a.send(b)}}function redrawGraph(){var graphElement=document.getElementById("google_graph");if(graphElement){var width=parseInt(graphElement.style.width);var metric=document.getElementById("kms").checked;var request=GXmlHttp.create();var rand=Math.random()*1000000;request.open("GET","/main/ajax/getGraphData/"+rand.toFixed(0),true);request.setRequestHeader("Connection","close");request.onreadystatechange=function(){if(request.readyState==4&&request.status==200){var heightData=eval("("+request.responseText+")");if(heightData){var data=new google.visualization.DataTable();data.addColumn("number","distance");data.addColumn("number","height");if(metric==true){unitDistance=1;unitHeight=1;titleX="Distance (km)";titleY=altitudeGraphTitleMeters}else{unitDistance=0.621367;unitHeight=3.2808399;titleX="Distance (miles)";titleY=altitudeGraphTitleFeet}var maxHeight=-9999;var minHeight=+99999;var totalAsc=0;var totalDesc=0;for(var i=0;i<(heightData==null?0:heightData.length);++i){if(parseInt(heightData[i][1])>maxHeight){maxHeight=parseInt(heightData[i][1])}if(parseInt(heightData[i][1])<minHeight){minHeight=parseInt(heightData[i][1])}if(i>0){if(heightData[i][1]>heightData[i-1][1]){totalAsc+=heightData[i][1]-heightData[i-1][1]}else{totalDesc+=heightData[i-1][1]-heightData[i][1]}}var distance=Math.round(1000*parseFloat(heightData[i][0])*unitDistance)/1000;var height=Math.round(10*parseFloat(heightData[i][1])*unitHeight)/10;data.addRow([distance,height])}var ac=new google.visualization.ScatterChart(document.getElementById("google_graph"));ac.draw(data,{width:(width),height:120,chartArea:{top:10,height:60},hAxis:{title:titleX},vAxis:{title:titleY},lineSize:3,pointSize:1,titleFontSize:11,enableInteractivity:false,legend:"none"});if(metric==true){var statsContent='<div style="float:right; text-align:right;">'+maxHeight+"m<br />"+minHeight+"m<br />"+totalAsc+"m<br />"+totalDesc+"m</div><div>"+maxHeightText+":<br />"+minHeightText+":<br />"+totalAscText+":<br />"+totalDescText+":</div>"}else{meterToFeet=3.2808399;var statsContent='<div style="float:right; text-align:right;">'+Math.round(maxHeight*meterToFeet)+"ft<br />"+Math.round(minHeight*meterToFeet)+"ft<br />"+Math.round(totalAsc*meterToFeet)+"ft<br />"+Math.round(totalDesc*meterToFeet)+"ft</div><div>"+maxHeightText+":<br />"+minHeightText+":<br />"+totalAscText+":<br />"+totalDescText+":</div>"}var statsDiv=document.getElementById("alt_stats");statsDiv.innerHTML=statsContent}}};request.send(null)}}function displayGraph(){var a=false;if(graphHeight==120){graphElement=document.getElementById("graph");graphElement.style.display="none";graphHeight=0;resizeMap()}else{if(polyline.getVertexCount()>=2){graphElement=document.getElementById("graph");graphElement.style.display="block";graphHeight=120;refreshGraph();resizeMap();a=true}}return a}function printRoute(b,a){if(polyline&&polyline.getVertexCount()>1){if(a){var d=getAltParams();var c=GXmlHttp.create();c.open("POST","/main/ajax/graph",true);c.setRequestHeader("Content-type","application/x-www-form-urlencoded");c.setRequestHeader("Content-length",d.length);c.setRequestHeader("Connection","close");c.onreadystatechange=function(){if(c.readyState==4&&c.status==200){printRoute2()}};c.send(d)}else{printRoute2()}}else{alert("No route to print")}}function printRoute2(){print_params="graph=true";print_params+="|point_data=";for(var c=0;c<polyline.getVertexCount();c++){if(c>0){print_params+=","}print_params+=polyline.getVertex(c).lat()+":"+polyline.getVertex(c).lng()}print_params+="|distance="+polyline.getLength();var b=map.getCenter();print_params+="|lat="+b.lat();print_params+="|lng="+b.lng();print_params+="|zoom="+map.getZoom();print_params+="|view="+map.getCurrentMapType().getName();if(route_id){print_params+="|route_id="+route_id}$("#route_params").val(print_params);var a=0;if(window.innerHeight){a=window.innerHeight}else{a=document.documentElement.offsetHeight}window.open("","printWindow","height="+a+",width=700,location=no,menubar=no,resizeable=yes,scrollbars=yes,status=no,toolbar=no,top=0,left=0");$("#mapControls").submit()}function printdraw(c,d){if(polyline.getVertexCount()>0){if(polyline.getVertexCount()>1){map.addOverlay(polyline);var a=polyline.getVertex(polyline.getVertexCount()-1);var b=new GMarker(a,{icon:endFlag,clickable:false,title:"Finish"});map.addOverlay(b)}var b=new GMarker(polyline.getVertex(0),{icon:startFlag,clickable:false,title:"Start"});map.addOverlay(b)}var e=displayDistance();displayEnergy();if(polyline.getVertexCount()>0&&c){showMarkers(e,d)}}function MarkerManager(d,e){var b=this;b.map_=d;b.mapZoom_=d.getZoom();b.projection_=d.getCurrentMapType().getProjection();e=e||{};b.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var a=MarkerManager.DEFAULT_MAX_ZOOM_;if(e.maxZoom!=undefined){a=e.maxZoom}b.maxZoom_=a;b.trackMarkers_=e.trackMarkers;var c;if(typeof e.borderPadding=="number"){c=e.borderPadding}else{c=MarkerManager.DEFAULT_BORDER_PADDING_}b.swPadding_=new GSize(-c,c);b.nePadding_=new GSize(c,-c);b.borderPadding_=c;b.gridWidth_=[];b.grid_=[];b.grid_[a]=[];b.numMarkers_=[];b.numMarkers_[a]=0;GEvent.bind(d,"moveend",b,b.onMapMoveEnd_);b.removeOverlay_=function(f){if(!f.isInfoWindowOpened){d.removeOverlay(f);b.shownMarkers_--}};b.addOverlay_=function(f){if(!f.isInfoWindowOpened){f.isInfoWindowOpened=false;d.addOverlay(f);b.shownMarkers_++}};b.resetManager_();b.shownMarkers_=0;b.shownBounds_=b.getMapGridBounds_()}MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_MAX_ZOOM_=17;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var c=this;var a=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var b=0;b<=c.maxZoom_;++b){c.grid_[b]=[];c.numMarkers_[b]=0;c.gridWidth_[b]=Math.ceil(a/c.tileSize_);a<<=1}};MarkerManager.prototype.clearMarkers=function(){var a=this;a.processAll_(a.shownBounds_,a.removeOverlay_);a.resetManager_()};MarkerManager.prototype.getTilePoint_=function(d,b,c){var a=this.projection_.fromLatLngToPixel(d,b);return new GPoint(Math.floor((a.x+c.width)/this.tileSize_),Math.floor((a.y+c.height)/this.tileSize_))};MarkerManager.prototype.addMarkerBatch_=function(c,g,b){var f=c.getPoint();if(this.trackMarkers_){GEvent.bind(c,"changed",this,this.onMarkerMoved_)}GEvent.addListener(c,"infowindowopen",function(){c.isInfoWindowOpened=true});GEvent.addListener(c,"infowindowclose",function(){c.isInfoWindowOpened=false});var d=this.getTilePoint_(f,b,GSize.ZERO);for(var e=b;e>=g;e--){var a=this.getGridCellCreate_(d.x,d.y,e);a.push(c);d.x=d.x>>1;d.y=d.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(b){var f=this;var d=f.shownBounds_.minY<=b.y&&b.y<=f.shownBounds_.maxY;var a=f.shownBounds_.minX;var c=a<=b.x&&b.x<=f.shownBounds_.maxX;if(!c&&a<0){var e=f.gridWidth_[f.shownBounds_.z];c=a+e<=b.x&&b.x<=e-1}return d&&c};MarkerManager.prototype.onMarkerMoved_=function(e,a,c){var g=this;var j=g.maxZoom_;var d=false;var b=g.getTilePoint_(a,j,GSize.ZERO);var f=g.getTilePoint_(c,j,GSize.ZERO);while(j>=0&&(b.x!=f.x||b.y!=f.y)){var h=g.getGridCellNoCreate_(b.x,b.y,j);if(h){if(g.removeFromArray(h,e)){g.getGridCellCreate_(f.x,f.y,j).push(e)}}if(j==g.mapZoom_){if(g.isGridPointVisible_(b)){if(!g.isGridPointVisible_(f)){g.removeOverlay_(e);d=true}}else{if(g.isGridPointVisible_(f)){g.addOverlay_(e);d=true}}}b.x=b.x>>1;b.y=b.y>>1;f.x=f.x>>1;f.y=f.y>>1;--j}if(d){g.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(c){var f=this;var e=f.maxZoom_;var g=false;var b=c.getPoint();var d=f.getTilePoint_(b,e,GSize.ZERO);while(e>=0){var a=f.getGridCellNoCreate_(d.x,d.y,e);if(a){f.removeFromArray(a,c)}if(e==f.mapZoom_){if(f.isGridPointVisible_(d)){f.removeOverlay_(c);g=true}}d.x=d.x>>1;d.y=d.y>>1;--e}if(g){f.notifyListeners_()}};MarkerManager.prototype.addMarkers=function(d,e,c){var a=this.getOptMaxZoom_(c);for(var b=d.length-1;b>=0;b--){this.addMarkerBatch_(d[b],e,a)}this.numMarkers_[e]+=d.length};MarkerManager.prototype.getOptMaxZoom_=function(a){return a!=undefined?a:this.maxZoom_};MarkerManager.prototype.getMarkerCount=function(b){var a=0;for(var c=0;c<=b;c++){a+=this.numMarkers_[c]}return a};MarkerManager.prototype.addMarker=function(b,f,d){var e=this;var a=this.getOptMaxZoom_(d);e.addMarkerBatch_(b,f,a);var c=e.getTilePoint_(b.getPoint(),e.mapZoom_,GSize.ZERO);if(e.isGridPointVisible_(c)&&f<=e.shownBounds_.z&&e.shownBounds_.z<=a){e.addOverlay_(b);e.notifyListeners_()}this.numMarkers_[f]++};GBounds.prototype.containsPoint=function(a){var b=this;return(b.minX<=a.x&&b.maxX>=a.x&&b.minY<=a.y&&b.maxY>=a.y)};MarkerManager.prototype.getGridCellCreate_=function(a,f,e){var c=this.grid_[e];if(a<0){a+=this.gridWidth_[e]}var b=c[a];if(!b){b=c[a]=[];return b[f]=[]}var d=b[f];if(!d){return b[f]=[]}return d};MarkerManager.prototype.getGridCellNoCreate_=function(a,e,d){var c=this.grid_[d];if(a<0){a+=this.gridWidth_[d]}var b=c[a];return b?b[e]:undefined};MarkerManager.prototype.getGridBounds_=function(a,j,h,f){j=Math.min(j,this.maxZoom_);var b=a.getSouthWest();var e=a.getNorthEast();var g=this.getTilePoint_(b,j,h);var d=this.getTilePoint_(e,j,f);var k=this.gridWidth_[j];if(e.lng()<b.lng()||d.x<g.x){g.x-=k}if(d.x-g.x+1>=k){g.x=0;d.x=k-1}var c=new GBounds([g,d]);c.z=j;return c};MarkerManager.prototype.getMapGridBounds_=function(){var a=this;return a.getGridBounds_(a.map_.getBounds(),a.mapZoom_,a.swPadding_,a.nePadding_)};MarkerManager.prototype.onMapMoveEnd_=function(){var a=this;a.objectSetTimeout_(this,this.updateMarkers_,0)};MarkerManager.prototype.objectSetTimeout_=function(b,c,a){return window.setTimeout(function(){c.call(b)},a)};MarkerManager.prototype.refresh=function(){var a=this;if(a.shownMarkers_>0){a.processAll_(a.shownBounds_,a.removeOverlay_)}a.processAll_(a.shownBounds_,a.addOverlay_);a.notifyListeners_()};MarkerManager.prototype.updateMarkers_=function(){var a=this;a.mapZoom_=this.map_.getZoom();var b=a.getMapGridBounds_();if(b.equals(a.shownBounds_)&&b.z==a.shownBounds_.z){return}if(b.z!=a.shownBounds_.z){a.processAll_(a.shownBounds_,a.removeOverlay_);a.processAll_(b,a.addOverlay_)}else{a.rectangleDiff_(a.shownBounds_,b,a.removeCellMarkers_);a.rectangleDiff_(b,a.shownBounds_,a.addCellMarkers_)}a.shownBounds_=b;a.notifyListeners_()};MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_)};MarkerManager.prototype.processAll_=function(b,d){for(var a=b.minX;a<=b.maxX;a++){for(var c=b.minY;c<=b.maxY;c++){this.processCellMarkers_(a,c,b.z,d)}}};MarkerManager.prototype.processCellMarkers_=function(b,f,d,e){var a=this.getGridCellNoCreate_(b,f,d);if(a){for(var c=a.length-1;c>=0;c--){e(a[c])}}};MarkerManager.prototype.removeCellMarkers_=function(a,c,b){this.processCellMarkers_(a,c,b,this.removeOverlay_)};MarkerManager.prototype.addCellMarkers_=function(a,c,b){this.processCellMarkers_(a,c,b,this.addOverlay_)};MarkerManager.prototype.rectangleDiff_=function(b,a,d){var c=this;c.rectangleDiffCoords(b,a,function(e,f){d.apply(c,[e,f,b.z])})};MarkerManager.prototype.rectangleDiffCoords=function(b,a,m){var f=b.minX;var n=b.minY;var h=b.maxX;var d=b.maxY;var e=a.minX;var l=a.minY;var g=a.maxX;var c=a.maxY;for(var k=f;k<=h;k++){for(var j=n;j<=d&&j<l;j++){m(k,j)}for(var j=Math.max(c+1,n);j<=d;j++){m(k,j)}}for(var j=Math.max(n,l);j<=Math.min(d,c);j++){for(var k=Math.min(h+1,e)-1;k>=f;k--){m(k,j)}for(var k=Math.max(f,g+1);k<=h;k++){m(k,j)}}};MarkerManager.prototype.removeFromArray=function(e,c,d){var a=0;for(var b=0;b<e.length;++b){if(e[b]===c||(d&&e[b]==c)){e.splice(b--,1);a++}}return a};
