(function($){$.jmap.markers=[];$.jmap.tooltip=null;var mapShown=false;$.jmap.showMap=function(options,callback){var options=$.extend({},$.jmap.JOptions,options);var map=$($.jmap.GMap2.getContainer());var initMap=function(){if(!mapShown){$.jmap.GMap2.checkResize();mapShown=true;map.jmap("displayMarkers");if(options.showSearch){var display=function(){map.jmap("showSearch");return false};if(options.showSearchAuto){display()}else{var search=$('<a href="#">Try our new search interface</a>').click(display);map.before(search);map.parent().height(map.parent().height()+30)}}}};if(!map.is(":visible")){var cb=function(){initMap();if(typeof callback=="function"){callback()}};map.show(options.durationShow,cb)}else{initMap();if(typeof callback=="function"){callback()}}};$.jmap.hideMap=function(options,callback){var options=$.extend({},$.jmap.JOptions,options);var map=$($.jmap.GMap2.getContainer());if(map.is(":visible")){var cb=function(){};if(typeof callback=="function"){cb=callback}map.hide(options.durationHide,cb)}else{if(typeof callback=="function"){callback()}}};$.extend($.jmap.JMarkerDefaults,{pointToolTip:"",pointLink:"",pointInfoWindowHtml:"",toolTipHoverDomId:"",pointIconName:"",pointIconSize:[12,20],pointIconShadowName:"http://labs.google.com/ridefinder/images/mm_20_shadow.png",pointIconShadowSize:[22,20],pointIconAnchor:[6,20],pointIconInfoWindowAnchor:[5,1]});$.jmap.pointerIcons={};$.jmap.createMarker=function(options,callback){try{var options=$.extend({},$.jmap.JMarkerDefaults,options);var markerOptions={};if(typeof options.pointIcon=="object"&&options.pointIcon){$.extend(markerOptions,{icon:options.pointIcon})}else{if(options.pointIconName){if(!$.jmap.pointerIcons[options.pointIconName]){var icon=new GIcon();icon.image=options.pointIconName;icon.iconSize=new GSize(options.pointIconSize[0],options.pointIconSize[1]);if(options.pointIconShadowName){icon.shadow=options.pointIconShadowName;icon.shadowSize=new GSize(options.pointIconShadowSize[0],options.pointIconShadowSize[1])}icon.iconAnchor=new GPoint(options.pointIconAnchor[0],options.pointIconAnchor[1]);icon.infoWindowAnchor=new GPoint(options.pointIconInfoWindowAnchor[0],options.pointIconInfoWindowAnchor[1]);$.jmap.pointerIcons[options.pointIconName]=icon}$.extend(markerOptions,{icon:$.jmap.pointerIcons[options.pointIconName]})}}if(options.pointIsDraggable){$.extend(markerOptions,{draggable:options.pointIsDraggable})}$.extend(markerOptions,{zIndexProcess:function(a,b){return 1}});var marker=new GMarker(new GLatLng(options.pointLatLng[0],options.pointLatLng[1]),markerOptions);if(options.pointToolTip){if(!$.jmap.tooltip){$.jmap.tooltip=$("<div/>")[0];$.jmap.GMap2.getPane(G_MAP_FLOAT_PANE).appendChild($.jmap.tooltip)}var map=$.jmap.GMap2;var tooltip='<div class="tooltip">'+options.pointToolTip+"</div>";GEvent.addListener(marker,"mouseover",function(){$.jmap.tooltip.innerHTML=tooltip;var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());var anchor=marker.getIcon().iconAnchor;var width=marker.getIcon().iconSize.width;var height=$.jmap.tooltip.clientHeight;var pos=new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(offset.x-point.x-anchor.x+width,offset.y-point.y-anchor.y-height));pos.apply($.jmap.tooltip);$.jmap.tooltip.style.visibility="visible"});GEvent.addListener(marker,"mouseout",function(){$.jmap.tooltip.style.visibility="hidden"})}if(options.pointLink){GEvent.addListener(marker,"click",function(){startpos=$.cookie("tlSavedStartPos");if(startpos){cntr=$.jmap.GMap2.getCenter();var newval=(cntr.lat()+","+cntr.lng());if(startpos!=newval){$.cookie("tlSavedExitPos",newval)}}window.location.href=options.pointLink})}if(options.pointInfoWindowHtml){marker.jMapInfoWindow=options.pointInfoWindowHtml}if(options.toolTipHoverDomId){marker.jMapToolTipHoverDomId=options.toolTipHoverDomId}if(callback){callback(marker)}}catch(er){}};$.jmap.registerMarker=function(options,callback){$.jmap.createMarker(options,function(marker){$.jmap.markers.push(marker);if(callback){callback(marker)}})};$.extend($.jmap.JPolylineDefaults,{polylineZoomToFit:true});$.jmap.addPolyline=function(options,callback){var options=$.extend({},$.jmap.JPolylineDefaults,options);var polyLineOptions={};if(options.polylineGeodesic){$.extend({},polyLineOptions,{geodesic:true})}if(!options.polylineClickable){$.extend({},polyLineOptions,{clickable:false})}if(options.mapCenter[0]&&options.mapCenter[1]){$.jmap.GMap2.setCenter(new GLatLng(options.mapCenter[0],options.mapCenter[1]))}var polyline=new GPolyline(options.polylinePoints,options.polylineStrokeColor,options.polylineStrokeWidth,options.polylineStrokeOpacity,polyLineOptions);$.jmap.GMap2.addOverlay(polyline);if(options.polylineZoomToFit){var bounds=polyline.getBounds();$.jmap.GMap2.setCenter(bounds.getCenter(),$.jmap.GMap2.getBoundsZoomLevel(bounds))}window.setTimeout(function(){try{$("svg").parent().removeClass("gmnoprint")}catch(er){}},1000);if(typeof callback=="function"){return callback()}};$.jmap.addPolylineFromArray=function(options,callback){try{var points=new Array();for(var i=0;i<options.polylinePoints.length;++i){points.push(new GLatLng(options.polylinePoints[i][0],options.polylinePoints[i][1]))}options.polylinePoints=points}catch(er){}$.jmap.addPolyline(options,callback)};$.jmap.getMarker=function(options,callback){try{var options=$.extend({markerId:0},options);return $.jmap.markers[options.markerId]}catch(er){}};$.jmap.displayMarkers=function(){try{if(1==$.jmap.markers.length){var marker=$.jmap.markers[0];$.jmap.GMap2.addOverlay(marker);$.jmap.GMap2.setCenter(marker.getLatLng(),$.jmap.JOptions.mapZoom);if(marker.jMapInfoWindow){GEvent.addListener(marker,"click",function(){if(!(marker.jMapInfoWindow instanceof Array)){marker.openInfoWindowHtml(marker.jMapInfoWindow)}else{var tabs=new Array();for(var i=0;i<marker.jMapInfoWindow.length;++i){tabs.push(new GInfoWindowTab(marker.jMapInfoWindow[i].title,marker.jMapInfoWindow[i].html))}marker.openInfoWindowTabsHtml(tabs)}});GEvent.trigger(marker,"click")}}else{if($.jmap.markers.length>1){var bounds=new GLatLngBounds();for(var i=0;i<$.jmap.markers.length;++i){marker=$.jmap.markers[i];bounds.extend(marker.getLatLng());$.jmap.GMap2.addOverlay(marker);if(marker.jMapToolTipHoverDomId){(function(){var mkr=marker;var el=$("#"+mkr.jMapToolTipHoverDomId)[0];GEvent.addDomListener(el,"mouseover",function(){GEvent.trigger(mkr,"mouseover")});GEvent.addDomListener(el,"mouseout",function(){GEvent.trigger(mkr,"mouseout")})})()}}if($.jmap.JOptions.mapNoAutoZoom){var mb=$.jmap.GMap2.getBounds();var bsw=bounds.getSouthWest();var bne=bounds.getNorthEast();var msw=mb.getSouthWest();var mne=mb.getNorthEast();var dlng1=msw.lng()-bsw.lng();var dlng2=bne.lng()-mne.lng();if(dlng1<0){dlng1=0}if(dlng2<0){dlng2=0}var dlng=(dlng1>dlng2?dlng1:dlng2);var dlat1=msw.lat()-bsw.lat();var dlat2=bne.lat()-mne.lat();if(dlat1<0){dlat1=0}if(dlat2<0){dlat2=0}var dlat=(dlat1>dlat2?dlat1:dlat2);if(0!=dlng||0!=dlat){bounds.extend(new GLatLng(mne.lat()+dlat,mne.lng()+dlng));bounds.extend(new GLatLng(msw.lat()-dlat,msw.lng()-dlng))}}$.jmap.GMap2.setCenter(bounds.getCenter(),$.jmap.GMap2.getBoundsZoomLevel(bounds))}}}catch(er){}};$.jmap.setCenter=function(newCenter,callback){$.jmap.GMap2.setCenter(newCenter);$.jmap.variables.mapCenter=newCenter;if(typeof callback=="function"){return callback(center)}};$.extend($.jmap.JDefaults,{mapNoAutoZoom:false,durationShow:"slow",durationHide:"slow",showSearch:false,showSearchAuto:false,showSearchModal:false,showSearchTips:false,searchAreaPadding:7,searchAreaBorder:1,searchAreaBackground:"#fff",searchAreaBorderStyle:"solid #ccc",searchMapPercentage:65,searchAjaxUri:"",searchAjaxType:"",searchMarkerAjaxArgs:{},searchRadarUri:"",searchResultsUri:"",searchUnit:"km",searchRadii:[10,20,30,50,100,150,200],searchInitialRadius:30,searchInitialLocation:"",searchRingColor:"0000c0",searchBusyIcon:"",searchCloseIcon:"",searchUseTagCloud:false,searchRestrictCountry:true,searchInlineResultsLimit:25,searchInlineResultsStyle:"span"});$.jmap.showSearch=function(options,callback){try{var options=$.extend({},$.jmap.JOptions,options);var map=$($.jmap.GMap2.getContainer());if(options.showSearchModal){map.jqm({modal:true});map.jqmShow()}var map_orig_width=map.width();var search=$('<div class="tlMapSearch" />');var offset=map.offset();var margin=(map.width()*options.searchMapPercentage/100);var padding=options.searchAreaPadding;var border=options.searchAreaBorder;search.css("overflow","auto");search.css("position","absolute");search.css("margin-left",margin);search.css("padding",padding);search.css("border",border+"px "+options.searchAreaBorderStyle);search.css("background",options.searchAreaBackground);search.width(map_orig_width-margin-((padding+border)*2));search.height(map.height()-((padding+border)*2));search.css("left",0);search.css("top",0);map.prepend(search);var close=false;if(!options.showSearchAuto&&options.searchCloseIcon){close=$('<img alt="close" />');close.attr("src",options.searchCloseIcon);close.css("float","right");search.append(close)}var show_tip=function(tipText){};var hide_tips=function(){};if(options.showSearchTips){var tips=$('<div class="tlMapSearchTips" />');tips.css("display","none");tips.css("position","absolute");tips.css("padding",padding);tips.css("border",border+"px "+options.searchAreaBorderStyle);tips.css("background",options.searchAreaBackground);tips.css("opacity","0.85");tips.css("left",0);tips.css("top",map.height());tips.width(map_orig_width-((padding+border)*2));map.prepend(tips);tips.append($("<h3>Tips</h3>"));var tip=$("<div />");tips.append(tip);show_tip=function(tipText){if("none"==tips.css("display")){tip.html(tipText);tips.slideDown(500)}else{tip.fadeOut(200,function(){tip.html(tipText);tip.fadeIn(200)})}};hide_tips=function(){tips.slideUp(1500)}}var div=$('<div style="text-align: center"/>');search.append(div);var tools=$("<div/>");div.append(tools);tools.append("Look&nbsp;");var radius=$("<select/>");for(var i=0;i<options.searchRadii.length;++i){radius.append($("<option/>").attr("value",options.searchRadii[i]).append(options.searchRadii[i]+options.searchUnit))}tools.append(radius);tools.append("&nbsp;from");var loctext="Enter location...";var loc=$('<input type="text" />');loc.width(search.width()-20);if(options.searchInitialLocation){loc.attr("value",options.searchInitialLocation)}else{loc.attr("value",loctext)}loc.blur(function(){if(""==loc.val()){loc.val(loctext)}hide_tips()});loc.focus(function(){if(loctext==loc.val()){loc.val("")}else{loc[0].select()}show_tip("Enter your search terms here. After a short delay your matches will be shown below.<br/>When you see a matching location, simply click on the name to recentre the map.<br/>You can then choose your desired search radius and display a list of matching results.")});div.append(loc);var noresults=$("<div><em>There are no results to display. Try moving your search location or expanding your search radius.</em></div>");noresults.css("display","none");div.append(noresults);var button=$('<input type="button" value="View Results"/>');button.css("display","none");div.append(button);var busy=$("<div/>");if(options.searchBusyIcon){var img=$('<img alt="Busy"/>');img.attr("src",options.searchBusyIcon);busy.append(img);busy.css("visibility","hidden");div.append(busy)}var curloc=$('<p class="tlMapCurLoc">lat/lng: ?/?</p>');curloc.css("display","none");div.append(curloc);var content=$("<div/>");search.append(content);var named_location=false;button.click(function(){var latlng=$.jmap.GMap2.getCenter();var uri=options.searchResultsUri;uri+=((uri.indexOf("?")>=0)?"&":"?");uri+="geoloc="+latlng.lat()+","+latlng.lng()+"&r="+radius.val();window.location=uri});var map_events=Array();if(close){close.click(function(){for(var i=0;i<map_events.length;++i){GEvent.removeListener(map_events[i])}$.jmap.GMap2.clearOverlays();tips.remove();search.remove();map.animate({width:map_orig_width},1500,"swing",function(){map.jqmHide();map.css("display","block");$.jmap.GMap2.checkResize();$.jmap.GMap2.returnToSavedPosition();$.jmap.displayMarkers()})})}var bootstrap=function(){show_tip("Please use the map above to target the area you are interested in. You can drag the map to pinpoint exactly where you want to search.<br/>When you move the map, nearby locations will be displayed; clicking on a location name will recenter the map for you."+(options.searchUseTagCloud?" Larger/more populated areas will be displayed in bigger type.":"")+"<br/>If you want to search by place name, please enter the name above to get a list of potential matches.");$.jmap.GMap2.checkResize();$.jmap.GMap2.returnToSavedPosition();var proj=G_NORMAL_MAP.getProjection();var circle=false;var getMaxZoom=function(){var zoom=$.jmap.GMap2.getZoom();var center=$.jmap.GMap2.getCenter();km=radius.val();if("km"!=options.searchUnit){km*=1.609344}var rad=new GLatLng(center.lat()+(km/111),center.lng());var cpt=proj.fromLatLngToPixel(center,zoom);var rpt=proj.fromLatLngToPixel(rad,zoom);var bounds=new GLatLngBounds();with(Math){radval=floor(sqrt(pow((cpt.x-rpt.x),2)+pow((cpt.y-rpt.y),2)));var piover180=(PI/180);var ar,x,y,p;for(var a=0;a<=360;a+=72){ar=a*piover180;y=cpt.y+radval*sin(ar);x=cpt.x+radval*cos(ar);bounds.extend(proj.fromPixelToLatLng(new GPoint(x,y),zoom))}}return $.jmap.GMap2.getBoundsZoomLevel(bounds)};var drawcircle=function(zoomMode){if("initial"==zoomMode){var bounds=$.jmap.GMap2.getBounds();var sw=bounds.getSouthWest();var ne=bounds.getNorthEast();var latdelta=Math.abs(sw.lat()-ne.lat())*111/2;if("km"!=options.searchUnit){latdelta/=1.609344}var rad=false;radius.children("option").each(function(){var val=$(this).val();if(val>latdelta){return}rad=val});if(false===rad){zoomMode="radius"}else{if("auto"==options.searchInitialRadius){radius.val(rad)}else{radius.val(options.searchInitialRadius);zoomMode="radius"}}}var zoom=$.jmap.GMap2.getZoom();var center=$.jmap.GMap2.getCenter();km=radius.val();if("km"!=options.searchUnit){km*=1.609344}var rad=new GLatLng(center.lat()+(km/111),center.lng());var cpt,rpt;if("radius"==zoomMode){$.jmap.GMap2.setZoom(getMaxZoom());zoom=$.jmap.GMap2.getZoom();cpt=proj.fromLatLngToPixel(center,zoom);rpt=proj.fromLatLngToPixel(rad,zoom)}else{cpt=proj.fromLatLngToPixel(center,zoom);rpt=proj.fromLatLngToPixel(rad,zoom)}var pxrad=cpt.y-rpt.y;if(!circle){circle={radius:pxrad,overlay:false};var copts={radius:pxrad,padding:3,color:options.searchRingColor+"00",updateUrl:options.searchRadarUri};circle.overlay=new tlJmapCrossHair(copts);$.jmap.GMap2.addOverlay(circle.overlay)}else{if(circle.radius!=pxrad){circle.overlay.setRadius(pxrad);circle.radius=pxrad}}};var cloudify=function(o,val,limit){if(!options.searchUseTagCloud){return}var segment=limit/4;if(val<(segment)){o.css("font-size","150%")}else{if(val<(segment*2)){o.css("font-size","120%")}else{if(val<(segment*3)){o.css("font-size","100%")}else{o.css("font-size","90%")}}}};var update_search=function(){busy.css("visibility","hidden");locval=loc.val();if(""==locval||loctext==locval){busy.css("visibility","hidden");return}var restrict_country="";if(options.searchRestrictCountry){var latlng=$.jmap.GMap2.getCenter();restrict_country="&restrict_country="+latlng.lat()+","+latlng.lng()}$.getJSON(options.searchAjaxUri+"?view=name&mt="+options.searchAjaxType+"&name="+escape(loc.val())+"&limit="+options.searchInlineResultsLimit+restrict_country,function(data){button.hide();busy.css("visibility","hidden");show_tip("Your search results have been updated with a list of matches. Please click on one of the places shown to recentre the map.<br />"+(options.searchUseTagCloud?"Larger/more populated places are shown in bigger type.":""));content.text("");content.append($("<h5>Matches:</h5>"));var $container=content;var $item=$("<span/>");var use_comma=true;if("li"==options.searchInlineResultsStyle){$container=$("<ul/>");content.append($container);$item=$("<li/>");use_comma=false}var resultcount=0;$.each(data.results,function(i,item){var li=$item.clone().append(item.name);cloudify(li,item.population_order,data.resultCount);li.click(function(){$.jmap.GMap2.setCenter(new GLatLng(item.latitude,item.longitude));named_location=item.name;curloc.text(item.name);loc.val(item.name)});if(use_comma&&i>0){$container.append(", ")}$container.append(li);resultcount++});if(!resultcount){content.append($("<p>Sorry, but no matching terms were found. Please try again.</p>"))}})};var markers=Array();var update_markers=function(){for(var i=0;i<markers.length;++i){$.jmap.GMap2.removeOverlay(markers[i])}markers=Array();var latlng=$.jmap.GMap2.getCenter();var limit=20;var uri=options.searchAjaxUri+"?view=markers&geoloc="+latlng.lat()+","+latlng.lng()+"&r="+radius.val()+"&limit="+limit;$.each(options.searchMarkerAjaxArgs,function(key,value){uri+="&"+escape(key)+"="+escape(value)});$.getJSON(uri,function(data){if(data.resultCount<1){button.hide();noresults.show();return}noresults.css("display","none");if(data.resultCount<2){button.val("View only new result")}else{button.val("Show "+data.resultCount+" new results")}button.show();$.each(data.results,function(i,item){$.jmap.createMarker(item,function(marker){$.jmap.GMap2.addOverlay(marker);markers.push(marker)})})})};var first_nearby=true;var update_nearby=function(){var latlng=$.jmap.GMap2.getCenter();$.getJSON(options.searchAjaxUri+"?view=nearby&geoloc="+latlng.lat()+","+latlng.lng()+"&r="+radius.val()+"&limit="+options.searchInlineResultsLimit,function(data){if(!options.showSearchAuto||!first_nearby){update_markers()}busy.css("visibility","hidden");if(!first_nearby){show_tip("The list of nearby locations has been updated. Please click on one of the places shown to recentre the map.<br />"+(options.searchUseTagCloud?"Larger/more populated places are shown in bigger type. ":"")+"They are ordered by their distance from the centre point of the map.")}first_nearby=false;content.text("");content.append($("<h5>Nearby:</h5>"));var $container=content;var $item=$("<span/>");var use_comma=true;if("li"==options.searchInlineResultsStyle){$container=$('<ul id="tlMapSearchNearby" />');content.append($container);$item=$("<li/>");use_comma=false}var resultcount=0;$.each(data.results,function(i,item){var li=$item.clone().append("<span>"+item.name+"</span>");cloudify(li,item.population_order,data.resultCount);li.click(function(){$.jmap.GMap2.setCenter(new GLatLng(item.latitude,item.longitude));named_location=item.name;curloc.text(item.name);loc.val(item.name)});if(use_comma&&i>0){$container.append(", ")}$container.append(li);resultcount++});if(!resultcount){content.append($("<p>Sorry, but we could not find any nearby locations.</p>"))}})};var timeout=false;var dp3=function(num){return Math.round(num*1000)/1000};var update=function(mode){if("initial"==mode){named_location=loc.val();if(loctext==named_location){named_location=false}}else{loc.val(loctext);named_location=false}var center=$.jmap.GMap2.getCenter();curloc.text("lat/lng: "+dp3(center.lat())+"/"+dp3(center.lng()));drawcircle(mode);if(timeout){window.clearTimeout(timeout)}busy.css("visibility","visible");timeout=window.setTimeout(update_nearby,500)};loc.keyup(function(){if(timeout){window.clearTimeout(timeout)}busy.css("visibility","visible");locval=loc.val();if(""==locval||loctext==locval){return}timeout=window.setTimeout(update_search,1000)});update("initial");radius.change(function(){var save_name=named_location;update("radius");if(save_name){named_location=save_name;curloc.text(named_location);loc.val(named_location)}});map_events.push(GEvent.addListener($.jmap.GMap2,"move",update));map_events.push(GEvent.addListener($.jmap.GMap2,"moveend",update));map_events.push(GEvent.addListener($.jmap.GMap2,"click",function(overlay,point){$.jmap.GMap2.setCenter(point)}))};if(options.showSearchAuto){var cntr=$.jmap.GMap2.getCenter();map.width(options.searchMapPercentage+"%");$.jmap.GMap2.checkResize();$.jmap.GMap2.setCenter(cntr);$.jmap.GMap2.savePosition();bootstrap();var saved_pos=$.cookie("tlSavedStartPos");cntr=$.jmap.GMap2.getCenter();if(saved_pos){latlng=saved_pos.split(",");if(cntr.lat()==latlng[0]&&cntr.lng()==latlng[1]){saved_pos=$.cookie("tlSavedExitPos");if(saved_pos){latlng=saved_pos.split(",");window.setTimeout(function(){$.jmap.GMap2.panTo(new GLatLng(latlng[0],latlng[1]))},1000)}}}$.cookie("tlSavedStartPos",(cntr.lat()+","+cntr.lng()));$.cookie("tlSavedExitPos",null)}else{var cntr=$.jmap.GMap2.getCenter();$.jmap.GMap2.clearOverlays();$.jmap.GMap2.savePosition();map.animate({width:options.searchMapPercentage+"%"},1500,"swing",function(){bootstrap();$.jmap.GMap2.panTo(cntr)})}}catch(er){}}})(jQuery);