// global "map" variable var mapAA; var routeOverlay; var currentRouteData = {}; var aaInfoWindow = ""; var draggedRoute = false; var gMarkers = []; var placeElements = []; var htmlMarkers = []; var autoCompleteService; var placeService; var aaGeoCoder; var aaMapPage = ''; var aaPanorama; var bolaaPOImgrLoaded = false; var aamaptileoptions; var $xhrRouteRequest; /*infowindow route links - required by poi-overlay*/ var bolRedirectToRP = false; var bolShowVia = true; var hc1; // Hierarchical map control var curMapZoom = 0; var routeingDatabase = "B"; //default to UK var metresToKilometres = 1000; var metresToMiles = 1609.344; //var distanceConversion = metresToKilometres; // Default to km var distanceConversion = metresToMiles; // Default to miles var routeStepMarker; // ====== Array for decoding the Google failure codes ====== var reasons = []; var loadingImageURI = "/images/routes/ajax-loader-summary.gif"; var G_START_ICON,G_PAUSE_ICON,G_END_ICON; var directionsService = new google.maps.DirectionsService(); /*Handlebars helpers*/ Handlebars.registerHelper('ifMoto', function(conditional, options) { if(conditional.mainBrand.brandId==19) { return options.fn(this) } else { return options.inverse(this); } }); Handlebars.registerHelper('convDistance',function(context, options) { //do distance conversion based on user setting return (context/distanceConversion).toFixed(1); }); Handlebars.registerHelper('ifMandB', function(conditional, options) { if(conditional.mainBrand.brandId==10|| conditional.mainBrand.brandId==11 || conditional.mainBrand.brandId==12 || conditional.mainBrand.brandId==13 || conditional.mainBrand.brandId==26 || conditional.mainBrand.brandId==29 || conditional.mainBrand.brandId==30 || conditional.mainBrand.brandId==31 || conditional.mainBrand.brandId==32) { return options.fn(this) } else { return options.inverse(this); } }); //handlebars precompiled template !function(){var n=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a["route-directions"]=n({1:function(n,a,l,r,e){var i;return'\r\n'+(null!=(i=l.each.call(null!=a?a:{},null!=a?a.legs:a,{name:"each",hash:{},fn:n.program(2,e,0),inverse:n.noop,data:e}))?i:"")+"
\r\n"},2:function(n,a,l,r,e){var i,s=n.lambda,o=n.escapeExpression;return"\r\n"+(null!=(i=l.each.call(null!=a?a:{},null!=a?a.steps:a,{name:"each",hash:{},fn:n.program(3,e,0),inverse:n.noop,data:e}))?i:"")+'\r\n  \r\n Section time: '+o(s(null!=(i=null!=a?a.duration:a)?i.text:i,a))+", Total time: "+o(s(null!=(i=null!=a?a.totalDuration:a)?i.text:i,a))+"\r\n \r\n"},3:function(n,a,l,r,e){var i,s,o=n.lambda,t=n.escapeExpression,u=null!=a?a:{},c=l.helperMissing;return'\r\n \r\n '+(null!=(i=(l.convDistance||a&&a.convDistance||c).call(u,null!=(i=null!=a?a.accumDistance:a)?i.value:i,{name:"convDistance",hash:{},fn:n.program(4,e,0),inverse:n.noop,data:e}))?i:"")+'\r\n \r\n
\r\n'+(null!=(i=l["if"].call(u,e&&e.first,{name:"if",hash:{},fn:n.program(6,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(u,e&&e.last,{name:"if",hash:{},fn:n.program(8,e,0),inverse:n.noop,data:e}))?i:"")+" "+(null!=(s=null!=(s=l.instruction||(null!=a?a.instruction:a))?s:c,i="function"==typeof s?s.call(u,{name:"instruction",hash:{},data:e}):s)?i:"")+"\r\n"+(null!=(i=l["if"].call(u,null!=(i=null!=(i=null!=a?a.branding:a)?i.mainBrand:i)?i.brandId:i,{name:"if",hash:{},fn:n.program(10,e,0),inverse:n.program(11,e,0),data:e}))?i:"")+"
"+(null!=(i=l["if"].call(u,null!=a?a.warningPOIs:a,{name:"if",hash:{},fn:n.program(14,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(u,null!=(i=null!=(i=null!=a?a.branding:a)?i.mainBrand:i)?i.brandId:i,{name:"if",hash:{},fn:n.program(17,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(u,null!=a?a.signposting:a,{name:"if",hash:{},fn:n.program(23,e,0),inverse:n.noop,data:e}))?i:"")+"\r\n \r\n"},4:function(n,a,l,r,e){return""},6:function(n,a,l,r,e){return' Start:\r\n'},8:function(n,a,l,r,e){return' Arrive:\r\n'},10:function(n,a,l,r,e){var i;return null!=(i=(l.ifMandB||a&&a.ifMandB||l.helperMissing).call(null!=a?a:{},null!=a?a.branding:a,{name:"ifMandB",hash:{},fn:n.program(4,e,0),inverse:n.program(11,e,0),data:e}))?i:""},11:function(n,a,l,r,e){var i;return null!=(i=l.each.call(null!=a?a:{},null!=a?a.instructions:a,{name:"each",hash:{},fn:n.program(12,e,0),inverse:n.noop,data:e}))?i:""},12:function(n,a,l,r,e){var i;return'
'+(null!=(i=n.lambda(a,a))?i:"")+"
"},14:function(n,a,l,r,e){var i;return null!=(i=l.each.call(null!=a?a:{},null!=a?a.warningPOIs:a,{name:"each",hash:{},fn:n.program(15,e,0),inverse:n.noop,data:e}))?i:""},15:function(n,a,l,r,e){var i,s=n.lambda;return'
\r\n
'+(null!=(i=s(null!=a?a.name:a,a))?i:"")+'
\r\n
'+(null!=(i=s(null!=a?a.description:a,a))?i:"")+"
\r\n
"},17:function(n,a,l,r,e){var i,s=null!=a?a:{},o=l.helperMissing;return'
'+(null!=(i=(l.ifMoto||a&&a.ifMoto||o).call(s,null!=a?a.branding:a,{name:"ifMoto",hash:{},fn:n.program(18,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=(l.ifMandB||a&&a.ifMandB||o).call(s,null!=a?a.branding:a,{name:"ifMandB",hash:{},fn:n.program(20,e,0),inverse:n.noop,data:e}))?i:"")+"
"},18:function(n,a,l,r,e){var i,s=n.lambda,o=n.escapeExpression;return''+o(s(null!=(i=null!=(i=null!=a?a.branding:a)?i.mainBrand:i)?i.name:i,a))+'\r\n
AA Members save 20% (10% M&S)
'},20:function(n,a,l,r,e){var i,s,o=null!=a?a:{},t=l.helperMissing,u="function",c=n.escapeExpression,p=n.lambda;return''+c(p(null!=(i=null!=(i=null!=a?a.branding:a)?i.mainBrand:i)?i.name:i,a))+'\r\n
'+(null!=(i=l.each.call(o,null!=a?a.instructions:a,{name:"each",hash:{},fn:n.program(21,e,0),inverse:n.noop,data:e}))?i:"")+"\r\n
"},21:function(n,a,l,r,e){var i;return null!=(i=n.lambda(a,a))?i:""},23:function(n,a,l,r,e){var i;return null!=(i=l.each.call(null!=a?a:{},null!=(i=null!=a?a.signposting:a)?i.signs:i,{name:"each",hash:{},fn:n.program(24,e,0),inverse:n.noop,data:e}))?i:""},24:function(n,a,l,r,e){var i,s,o=null!=a?a:{};return'
\r\n\r\n'+(null!=(i=l["if"].call(o,null!=a?a.prefix:a,{name:"if",hash:{},fn:n.program(25,e,0),inverse:n.program(27,e,0),data:e}))?i:"")+(null!=(i=l["if"].call(o,null!=a?a.prefix:a,{name:"if",hash:{},fn:n.program(29,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(o,null!=a?a.prefix:a,{name:"if",hash:{},fn:n.program(31,e,0),inverse:n.program(33,e,0),data:e}))?i:"")+'
'+(null!=(i=l.each.call(o,null!=a?a.roads:a,{name:"each",hash:{},fn:n.program(35,e,0),inverse:n.noop,data:e}))?i:"")+"
\r\n\r\n"+(null!=(i=l["if"].call(o,null!=a?a.prefix:a,{name:"if",hash:{},fn:n.program(51,e,0),inverse:n.program(53,e,0),data:e}))?i:"")+(null!=(i=l["if"].call(o,null!=a?a.suffix:a,{name:"if",hash:{},fn:n.program(55,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(o,null!=a?a.prefix:a,{name:"if",hash:{},fn:n.program(57,e,0),inverse:n.program(59,e,0),data:e}))?i:"")+"
\r\n"},25:function(n,a,l,r,e){return"
"},27:function(n,a,l,r,e){var i;return null!=(i=l["if"].call(null!=a?a:{},null!=a?a.suffix:a,{name:"if",hash:{},fn:n.program(25,e,0),inverse:n.noop,data:e}))?i:""},29:function(n,a,l,r,e){var i,s=n.lambda,o=n.escapeExpression;return"
\r\n "+o(s(null!=(i=null!=a?a.prefix:a)?i.name:i,a))+"\r\n
"},31:function(n,a,l,r,e){return"
"},33:function(n,a,l,r,e){var i;return null!=(i=l["if"].call(null!=a?a:{},null!=a?a.suffix:a,{name:"if",hash:{},fn:n.program(31,e,0),inverse:n.noop,data:e}))?i:""},35:function(n,a,l,r,e){var i,s,o=null!=a?a:{};return'
"+(null!=(i=l["if"].call(o,null!=a?a.places:a,{name:"if",hash:{},fn:n.program(42,e,0),inverse:n.noop,data:e}))?i:"")+(null!=(i=l["if"].call(o,null!=a?a.name:a,{name:"if",hash:{},fn:n.program(45,e,0),inverse:n.program(48,e,0),data:e}))?i:"")+"
\r\n"},36:function(n,a,l,r,e){return"routeTextIcon"},38:function(n,a,l,r,e){var i,s=n.lambda,o=n.escapeExpression;return' data-loc="'+o(s(null!=(i=null!=a?a.placeLocation:a)?i.lat:i,a))+","+o(s(null!=(i=null!=a?a.placeLocation:a)?i.lng:i,a))+'"'},40:function(n,a,l,r,e){var i;return' data-url="'+n.escapeExpression((i=null!=(i=l.placeUrl||(null!=a?a.placeUrl:a))?i:l.helperMissing,"function"==typeof i?i.call(null!=a?a:{},{name:"placeUrl",hash:{},data:e}):i))+'"'},42:function(n,a,l,r,e){var i;return'
'+(null!=(i=l.each.call(null!=a?a:{},null!=a?a.places:a,{name:"each",hash:{},fn:n.program(43,e,0),inverse:n.noop,data:e}))?i:"")+"
"},43:function(n,a,l,r,e){return" "+n.escapeExpression(n.lambda(a,a))+""},45:function(n,a,l,r,e){var i,s,o=null!=a?a:{};return'
\r\n "+n.escapeExpression((s=null!=(s=l.name||(null!=a?a.name:a))?s:l.helperMissing,"function"==typeof s?s.call(o,{name:"name",hash:{},data:e}):s))+"\r\n
"},46:function(n,a,l,r,e){var i;return'class="roadSignIcon roadSignIcon'+n.escapeExpression((i=null!=(i=l.iconName||(null!=a?a.iconName:a))?i:l.helperMissing,"function"==typeof i?i.call(null!=a?a:{},{name:"iconName",hash:{},data:e}):i))+'"'},48:function(n,a,l,r,e){var i;return null!=(i=l["if"].call(null!=a?a:{},null!=a?a.iconName:a,{name:"if",hash:{},fn:n.program(49,e,0),inverse:n.noop,data:e}))?i:""},49:function(n,a,l,r,e){var i;return'
\r\n \r\n
"},51:function(n,a,l,r,e){return"
"},53:function(n,a,l,r,e){var i;return null!=(i=l["if"].call(null!=a?a:{},null!=a?a.suffix:a,{name:"if",hash:{},fn:n.program(51,e,0),inverse:n.noop,data:e}))?i:""},55:function(n,a,l,r,e){var i,s=n.lambda,o=n.escapeExpression;return"
\r\n "+o(s(null!=(i=null!=a?a.suffix:a)?i.name:i,a))+"\r\n
"},57:function(n,a,l,r,e){return"
"},59:function(n,a,l,r,e){var i;return null!=(i=l["if"].call(null!=a?a:{},null!=a?a.suffix:a,{name:"if",hash:{},fn:n.program(57,e,0),inverse:n.noop,data:e}))?i:""},compiler:[7,">= 4.0.0"],main:function(n,a,l,r,e){var i;return"\r\n\r\n"+(null!=(i=l.each.call(null!=a?a:{},null!=a?a.routes:a,{name:"each",hash:{},fn:n.program(1,e,0),inverse:n.noop,data:e}))?i:"")},useData:!0})}(); function createRouteMarker(latlong,i,html,bolDraggable) { var iconPath="/resources/images/maps/"; var iconImage="route-marker-blank.png"; var IconOrigin=i*26; var IconHeight=135; if (IconOrigin === null || IconOrigin < 0) { IconOrigin = 0; } var Icon = { url:"/resources/images/maps/map-sprite-006.png", size: new google.maps.Size(26, 34), origin:new google.maps.Point(IconOrigin,IconHeight), anchor:new google.maps.Point(13,34) } var IconShadow = { url: "/resources/images/maps/map-sprite-006.png", size: new google.maps.Size(31, 17), origin: new google.maps.Point(0, 203), anchor: new google.maps.Point(0, 17) }; var IconShape = { coords: [0, 0, 26, 34], type: 'rect' }; var marker = new google.maps.Marker({ position: latlong, map: mapAA, title: "", shape: IconShape, shadow: IconShadow, icon: Icon, html: html, routePosition: i }); if (bolDraggable) { marker.setDraggable(true); } google.maps.event.addListener(marker, "click", function() { aaInfoWindow.setContent(this.html); aaInfoWindow.close(); aaInfoWindow.open(mapAA,marker); }); google.maps.event.addListener(marker, "dragend", function(e) { setLatLngMarker(e.latLng, this.routePosition); draggedRoute = true; aaInfoWindow.close(); processingError = false; // reset //delete any new/empty vias as dragging has to use existing markers on map if (viaCount + 2 > gMarkers.length) { for(var i=viaCount+2; i > gMarkers.length; i--) { removeVia(i-3); } } //if not mobile then make sure route panel is shown if ($(window).width()>480){ aaRP.displayPanel("route"); //in case viewing a different panel } onGetNewRoute(true,"",true,false); }); gMarkers[i]=marker; } /*function addEncodedRouteOverlay(encPoints) { var decodedPath=Decode(trim(encPoints)); //var decodedPath=google.maps.geometry.encoding.decodePath(trim(encPoints)); var polyOptions={strokeColor:'#FF00FF', strokeWeight: 10, clickable:false, strokeOpacity: 0.5, path: decodedPath} routeOverlay = new google.maps.Polyline(polyOptions); routeOverlay.setMap(mapAA); }*/ function addDecodedRouteOverlay(decPoints) { var polyOptions = { strokeColor:'#FF00FF', strokeWeight: 10, clickable:false, strokeOpacity: 0.5, path: decPoints }; if(routeOverlay==null){ routeOverlay = new google.maps.Polyline(polyOptions); } else { routeOverlay.setOptions(polyOptions) } routeOverlay.setMap(mapAA); } function showAAMapLocation($target,$targetRow, lat, lng) { if($target.is("a") || checkAndShowRouteSignPOIMarker($target)) { //don't show mini map if clicking on brown sign return; } toggleStreetView(aaPanorama,"hide"); var point = new google.maps.LatLng(lat, lng); var instructionHTML = ""; instructionHTML=$targetRow.find("div.text-instruction").html(); addMiniMap(lat,lng, false, instructionHTML); //if mobile then flip to map view if ($(window).width()<=480){ aaRP.mobile.toggleMobilePanel("map"); } } function checkAndShowRouteSignPOIMarker($tgt){ var gotPOIMarker=false; //doesn't necessarily need icon, just URL if ($tgt.hasClass("roadSignIcon") && $tgt.parent().parent().data("loc") != null) { var $dataParent=$tgt.parent().parent() var latlng=$dataParent.data("loc").split(","); var poiName=trim($dataParent.text()); //includes child nodes var url=$dataParent.data("url"); var poiClass=$tgt.attr("class"); gotPOIMarker=true; } else if ($tgt.hasClass("routeTextSignItem") && $tgt.find(".roadSignIcon").length!=0 && $tgt.parent().data("loc") != null) { var $dataParent=$tgt.parent(); var latlng=$dataParent.data("loc").split(","); var poiName=trim($tgt.find(".roadSignIcon").text()); var url=$dataParent.data("url"); var poiClass=$tgt.find(".roadSignIcon").attr("class"); gotPOIMarker=true; } else if ($tgt.parent().hasClass("routeTextSignItem") && $tgt.parent().parent().data("loc") != null){ //&& $tgt.parent().parent().find(".roadSignIcon").length!=0 // brown sign without icon // or where brown sign used inside other sign var $dataParent=$tgt.parent().parent() var latlng=$dataParent.data("loc").split(","); var poiName=trim($dataParent.text()); //includes child nodes var url=$dataParent.data("url"); var poiClass=$dataParent.find(".roadSignIcon").attr("class"); gotPOIMarker=true; } if (gotPOIMarker) { var desc = ""; if(poiClass != "") { desc+="
"}; desc+="

Visit " + url + " for more information"; if(poiName!=null&&poiName!=''){ desc+=" about " + poiName + ""; } desc+='.

Plan a new route to here | from here"; aaInfoWindow.close(); aaInfoWindow.setContent("

" + poiName + "

" + desc + "
"); aaInfoWindow.setPosition(new google.maps.LatLng(latlng[0],latlng[1])); aaInfoWindow.open(mapAA); //need a unique poiid here ideally... addSimplePOIMarker({type:"999",location:{lat:latlng[0],lng:latlng[1]},name:poiName,description:desc,poiId:999}) //if mobile then flip to map view if ($(window).width()<=480){ aaRP.mobile.toggleMobilePanel("map"); } return true; } return false; } function addMiniMap(lat,lng,isAARoute, instructionHTML) { var point = new google.maps.LatLng(lat, lng); var myOptions = { zoom: 15, center: point, mapTypeId: google.maps.MapTypeId.ROADMAP, streetViewControl: false }; aaInfoWindow.close(); aaInfoWindow.setContent('
 
' + instructionHTML + '
'); aaInfoWindow.setPosition(point); aaInfoWindow.open(mapAA); var mini_map = new google.maps.Map(document.getElementById("minimap"), myOptions); // Copy the markers for (var markerIndex = 0; markerIndex < gMarkers.length; markerIndex++) { var marker = new google.maps.Marker({ position: gMarkers[markerIndex].getPosition(), map: mini_map, icon: gMarkers[markerIndex].getIcon(), shadow: gMarkers[markerIndex].getShadow(), title:"" }); } // Copy the line of route copyRoute(isAARoute,mini_map); //add POI markers var miniPOImgr=new MarkerManager(mini_map); //check if manager loaded var poiMiniMgrListener=google.maps.event.addListener(miniPOImgr, 'loaded', function(){ addMiniMapMarkers(miniPOImgr); google.maps.event.removeListener(poiMiniMgrListener); }); } function addMiniMapMarkers(miniPOImgr) { var item, tmpPOITypeID, tmppoiMarker, tmppoiMediumMarker, tmppoiSmallMarker; for (item in aaRoutePOIMarkers) { //only for speed cameras and route markers var tmpPOITypeID=aaRoutePOIMarkers[item][1]; if(tmpPOITypeID<0) { /*strTitle="Warning: speed cameras"; strDescription="

" + 'Safety camera' + " Warning: safety cameras

" + "

Visit RoadPilot.com - link opens a new window RoadPilot for your mobile

";*/ tmppoiMarker = createPOIMarker(aaRoutePOIMarkers[item][3],aaRoutePOIMarkers[item][0],'l',tmpPOITypeID,aaRoutePOIMarkers[item][2],aaRoutePOIMarkers[7],aaRoutePOIMarkers[8]); //actual icon tmppoiMediumMarker=createPOIMarker(aaRoutePOIMarkers[item][3],aaRoutePOIMarkers[item][0],'m',tmpPOITypeID,aaRoutePOIMarkers[item][2],aaRoutePOIMarkers[7],aaRoutePOIMarkers[8]); //med icons tmppoiSmallMarker=createPOIMarker(aaRoutePOIMarkers[item][3],aaRoutePOIMarkers[item][0],'s',tmpPOITypeID,aaRoutePOIMarkers[item][2],aaRoutePOIMarkers[7],aaRoutePOIMarkers[8]); //small icons tmppoiMarker.setClickable(false); tmppoiMediumMarker.setClickable(false); tmppoiSmallMarker.setClickable(false); miniPOImgr.addMarker(tmppoiMarker,11,17); miniPOImgr.addMarker(tmppoiMediumMarker,8,10); miniPOImgr.addMarker(tmppoiSmallMarker,0,7); } } miniPOImgr.refresh(); } function copyRoute(isAARoute,mini_map) { var poly2Options={strokeColor:'#FF00FF', strokeWeight: 10, clickable:false, strokeOpacity: 0.5, path: routeOverlay.getPath() } var poly2 = new google.maps.Polyline(poly2Options); poly2.setMap(mini_map); } //map functions function initMap() { //api v3 var myOptions = { zoom: 5, center: new google.maps.LatLng(54.522005, -3.083582), mapTypeControlOptions: { mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.SATELLITE] }, mapTypeId: google.maps.MapTypeId.ROADMAP, streetViewControl: true }; google.maps.controlStyle = 'azteca'; mapAA = new google.maps.Map(document.getElementById("map"), myOptions); aaPanorama=new google.maps.StreetViewPanorama(mapAA.getDiv()); aaPanorama.setVisible(false); aaPanorama.setPano("FVqTcrZw3yuMA3df4_elIQ"); //RG21 4EA aaPanorama.set('enableCloseButton',true); mapAA.setStreetView(aaPanorama); setupControls(mapAA); //set up poi overlays aaPOImgr=new MarkerManager(mapAA); parkingmgr=new MarkerManager(mapAA); var overlayMapMessage= document.getElementById("overlayMapMessage"); if (overlayMapMessage != null) { overlayMapMessage.style.position='absolute'; var mapNode=mapAA.getDiv(); mapNode.appendChild(overlayMapMessage); overlayMapMessage.style.zIndex='1000'; overlayMapMessage.style.left='0px'; overlayMapMessage.style.top='0px'; } var sidebarSlider=document.getElementById("sidebarSlider"); if(sidebarSlider!=null) { sidebarSlider.style.display='block'; sidebarSlider.zIndex=1; mapAA.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(sidebarSlider); } //check if manager loaded var poimgrListener=google.maps.event.addListener(aaPOImgr, 'loaded', function(){ bolaaPOImgrLoaded=true; google.maps.event.removeListener(poimgrListener); }); autoCompleteService=new google.maps.places.AutocompleteService(); placeService=new google.maps.places.PlacesService(mapAA); aaGeoCoder = new google.maps.Geocoder(); /*update/add parks on scroll or zoom*/ google.maps.event.addListener(mapAA, "dragstart", function() { clearTimeout(aaPOI.parking.parkingCallTimer); }); google.maps.event.addListener(mapAA, "dragend", function() { var curZoom=mapAA.getZoom(); if(curZoom>=11) { var carparkType=getCarParkType(); callCarParks(mapAA,carparkType); } /*update traffic if selected*/ moveTraffic(); /*if($("#dispTrafficAlert").prop("checked") && curZoom>4 && curZoom<=17){ aaTrafficOverlay.displayTrafficAlertOverlay(mapAA,true,'overlayMapMessage',{alerts:true,roadworks:false,congestion:false}); }*/ }); google.maps.event.addListener(mapAA, "zoom_changed",function() { clearTimeout(aaPOI.parking.parkingCallTimer); var newZoom=mapAA.getZoom(); if(newZoom==11 || (newZoom>=11&&curMapZoom<11) || (newZoom>=11 && newZoom=aaPOI.parking.pmhZoomThreshold && curMapZoom<11)) { var carparkType=getCarParkType(); callCarParks(mapAA,carparkType); //will not show car parks if carparkType==parkatmyhouse and zoom < pmhzoomthreshold } curMapZoom=newZoom; /*update traffic if selected*/ zoomTraffic(); /* if($("#dispTrafficAlert").prop("checked") && newZoom>4 && newZoom<=17){ aaTrafficOverlay.displayTrafficAlertOverlay(mapAA,true,'overlayMapMessage',{alerts:true,roadworks:false,congestion:false}); } */ }); aaInfoWindow= new google.maps.InfoWindow({ content: '', maxWidth:320 }); aaInfoWindow.setOptions({maxWidth:320}); G_START_ICON=new google.maps.MarkerImage('http://maps.gstatic.com/intl/en_ALL/mapfiles/dd-start.png', new google.maps.Size(20,34), new google.maps.Point(0,0), new google.maps.Point(10,34)); G_PAUSE_ICON=new google.maps.MarkerImage('http://maps.gstatic.com/intl/en_ALL/mapfiles/dd-pause.png', new google.maps.Size(20,34), //size new google.maps.Point(0,0), //origin new google.maps.Point(10,34)); //anchor G_END_ICON=new google.maps.MarkerImage('http://maps.gstatic.com/intl/en_ALL/mapfiles/dd-end.png', new google.maps.Size(20,34), new google.maps.Point(0,0), new google.maps.Point(10,34)); initContextMenu(); } function onGetNewRoute(clearMapFlag, switchUnits, setDatabaseFlag,clearMarkers) { // Get a new route from the stuff selected from the gazetteer drop downs var checkAvoidMotorways = document.getElementById("avoidMotorways"); var checkAvoidTolls = document.getElementById("avoidTolls"); var checkAvoidTraffic = document.getElementById("avoidTraffic"); var i; var bAvoidMWays = checkAvoidMotorways == null ? false : checkAvoidMotorways.checked; var bAvoidTolls = checkAvoidTolls == null ? false : checkAvoidTolls.checked; var bAvoidTraffic = checkAvoidTraffic == null ? false : checkAvoidTraffic.checked; //change button to loader showLoading(); // Remove the current route directions and summary $("#routeSummary .altRouteRow").off(); //remove hover events var $routeSummaryElement = $('#routeSummary'); $routeSummaryElement.html(''); var routeDirectionsElement = document.getElementById('routeDirections'); routeDirectionsElement.innerHTML = ' '; $("#routeTargetedAd").hide(); //reset to first alt route aaRP.selectedAltRoute=0; // Remove poi markers clearAllPOIMarkers(); // Remove the curent route/markers.info window from the map if (clearMapFlag) { if (routeOverlay != null) { routeOverlay.setMap(null); } if(clearMarkers||clearMarkers==null||clearMarkers==undefined) { for (i = 0; i < gMarkers.length; i++) { //mapGoogle.removeOverlay(gMarkers[i]); gMarkers[i].setMap(null); gMarkers[i]=null; } gMarkers.length = 0; } } // Remove the info window aaInfoWindow.close(); getAARoute(bAvoidMWays, bAvoidTolls, bAvoidTraffic); if(bAvoidTraffic && !$("#dispTrafficAlert").is(":checked")) { $("#dispTrafficAlert").click(); } } function routeSwitchUnits(unit) { onGetNewRoute(false, unit, false); } function getAARoute(bAvoidMWays, bAvoidTolls, bAvoidTraffic) { currentRouteData={}; //clear current route data var i, originLatLng, destinationLatLng, waypointPlaces=[]; var placeHTML; var placeValue; var fromPlaceValue = $("#confirmFrom").val(); var toPlaceValue = $("#confirmTo").val(); var $routeMessageElement = $('#routeMessage'); var $routeSummaryElement = $('#routeSummary'); i = 0; placeElements.length = 0; // Set the start marker if (fromPlaceValue != null && fromPlaceValue != "") { placeValue = fromPlaceValue.split('|'); placeHTML = "Start:
" + placeValue[1]; //originLatLng = new google.maps.LatLng(placeValue[4], placeValue[3]); originGLatLng = convertAndGetGoogleLatLng(placeValue[4], placeValue[3]); originLatLng = originGLatLng.lat() + "," + originGLatLng.lng(); var placeElementEntry = new Array(); placeElementEntry[0] = placeValue[1]; placeElementEntry[1] = new Array(); placeElementEntry[1][0] = placeValue[4]; placeElementEntry[1][1] = placeValue[3]; placeElementEntry[2] = G_START_ICON; placeElementEntry[3] = placeHTML; placeElements[i++] = placeElementEntry; } else { $routeMessageElement.html('
Please check you have entered a start and end location
').show(); hideLoading(); postRouteTidyUp(); return; } bLatLngArr = ""; // Add the vias (if any) if (viaCount > 0) { var dropDownId; var selectVia; var viaIndex; var viaPlaceName; var viaPlaceValue; for (viaIndex = 0; viaIndex < viaCount; viaIndex++) { var dropDownId="viaChoice" + viaIndex.toString() viaPlaceValue = $("#" + dropDownId).val(); if (viaPlaceValue != null && viaPlaceValue != "") { placeValue = viaPlaceValue.split('|'); placeHTML = "Via:
" + placeValue[1]; waypointGLatLng=convertAndGetGoogleLatLng(placeValue[4], placeValue[3]); waypointPlaces.push({location:waypointGLatLng.lat() + "," + waypointGLatLng.lng()}); //,stopover:false var placeElementEntry = new Array(); placeElementEntry[0] = placeValue[1]; placeElementEntry[1] = new Array(); placeElementEntry[1][0] = placeValue[4]; placeElementEntry[1][1] = placeValue[3]; placeElementEntry[2] = G_PAUSE_ICON; placeElementEntry[3] = placeHTML; placeElements[i++] = placeElementEntry; } else { //don't submit with empty vias $routeMessageElement.html('
Please check you have entered a via location
').show(); hideLoading(); postRouteTidyUp(); return; } } } // Set the end marker if (toPlaceValue != null && toPlaceValue != "") { placeValue = toPlaceValue.split('|'); placeHTML = "End:
" + placeValue[1]; //c = " to: " + placeValue[1] + "@" + placeValue[4] + "," + placeValue[3]; destinationGLatLng = convertAndGetGoogleLatLng(placeValue[4], placeValue[3]); destinationLatLng = destinationGLatLng.lat() + "," + destinationGLatLng.lng(); var placeValue4=placeValue[4]; var placeElementEntry = new Array(); placeElementEntry[0] = placeValue[1]; placeElementEntry[1] = new Array(); placeElementEntry[1][0] = placeValue[4]; placeElementEntry[1][1] = placeValue[3]; placeElementEntry[2] = G_END_ICON; placeElementEntry[3] = placeHTML; placeElements[i++] = placeElementEntry; } else { $routeMessageElement.html('
Please check you have entered a destination location
').show(); hideLoading(); postRouteTidyUp(); return; } var gReqOptions= { origin: originLatLng, destination: destinationLatLng, travelMode: google.maps.DirectionsTravelMode.DRIVING, unitSystem: google.maps.DirectionsUnitSystem.IMPERIAL, waypoints: waypointPlaces, optimizeWaypoints: false, avoidHighways: bAvoidMWays, avoidTolls: bAvoidTolls, provideRouteAlternatives: aaRP.displayAltRoutes } if(bAvoidTraffic) { gReqOptions.drivingOptions={ departureTime:new Date() } } //trafficModel: BEST_GUESS //trafficModel: OPTIMISTIC //trafficModel: PESSIMISTIC //durationInTraffic: bAvoidTraffic, retrieveExtDirections(gReqOptions); } function retrieveExtDirections(gReqOptions) { //use JS API to request directions initially var startTime = new Date().getTime(); aaRP.gDirResult={}; aaRP.selectedAltRoute=0; //select first route in array directionsService.route(gReqOptions, function (result, status) { if (status == google.maps.DirectionsStatus.OK) { //store google response for alternative routes //deep clone! //aaRP.gDirResult=Object.create(result); aaRP.gDirResult={}; $.extend(aaRP.gDirResult,result); //reduce routes array to 1 for processing result.routes=new Array(result.routes[aaRP.selectedAltRoute]); var googleRoute = reformatGoogleRouteResponse(result); googleRoute.routeGenerationTime = new Date().getTime() - startTime; // Post a 'pre-canned route' request //processPOIs: disable POI layer eg services //processTollZones: disable text processing eg tolls //processSignposting: disable signposts //change channel if an 'avoid traffic' route var selectedChannel='route-planner-v3g'; if($("#avoidTraffic").prop("checked")){ selectedChannel='route-planner-v3gt'; } var reqParamsWithDirs = { gr: googleRoute, processSignposting: true, removeOriginalSignposting: false, processPOIs: true, showPOIsInRouteText: true, processTollZones: true, channel: selectedChannel }; retrieveAADirections(reqParamsWithDirs); } else { //error calling google... //console.log("Error with google routes"); var $routeMessageElement = $('#routeMessage'); var errorMsg="Sorry, there was an error retrieving your route. Please try again later or try alternative locations."; if(status=="NOT_FOUND") { errorMsg='Sorry, one of your places could not be found. Please try an alternative.'; } else if (status=="ZERO_RESULTS") { errorMsg='Sorry, no route could be found between your chosen places. Please try alternative locations.'; } else if (status=="OVER_QUERY_LIMIT") { //unlikely } displayDirectionsError(errorMsg); } }); } function retrieveAADirections(reqParamsWithDirs) { var url="/routes-traffic/app/endpoint/v1/directions"; try { $xhrRouteRequest.abort(); //prevent any other requests from returning } catch(e) {} $xhrRouteRequest=$.ajax({ url: url, type: "POST", data: reqParamsWithDirs, dataType: "json", success: function(data) { //check for error response if(data.status!="OK"){ var $routeMessageElement = $('#routeMessage'); var errorMsg="Sorry, there was an error retrieving your route. Please try again later or try alternative locations."; if(data.status=="NOT_FOUND") { displayDirectionsError('Sorry, one of your places could not be found. Please try an alternative.'); } else if (data.status=="ZERO_RESULTS") { displayDirectionsError('Sorry, no route could be found between your chosen places. Please try alternative locations.'); } else if (data.status=="OVER_QUERY_LIMIT") { //unlikely to happen } return; } currentRouteData=data; if(draggedRoute==true) { displayAARouteDirectionsAPI3(false); //don't add new markers } else { displayAARouteDirectionsAPI3(true); } }, error: function(xhr, desc, exceptionobj) { //error getting route if(desc=="abort") { //user initiated, so do nothing return; } displayDirectionsError('Sorry, there was an error retrieving your route. Please try again later or try alternative locations.'); }, timeout: 30000 }); //end ajax call } function displayDirectionsError(errorMsg) { var $routeMessageElement = $('#routeMessage'); if(errorMsg==null||errorMsg==undefined) { errorMsg='Sorry, there was an error retrieving your route. Please try again later or try alternative locations.'; } $routeMessageElement.html('

' + errorMsg + '

').show(); hideLoading(); /*TBD dragged route true/false postRouteTidyUp(); */ } function displayAARouteDirectionsAPI3(bAddMarkers) { //set map bounds var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(currentRouteData.routes[0].bounds.southwest.lat,currentRouteData.routes[0].bounds.southwest.lng), new google.maps.LatLng(currentRouteData.routes[0].bounds.northeast.lat,currentRouteData.routes[0].bounds.northeast.lng)); mapAA.fitBounds(bounds); renderRouteDirectionsAndSetMarkers(bAddMarkers); renderAARoutePath(currentRouteData); //add place markers createRouteMarkersFromPlaceArray(bAddMarkers,placeElements); hideLoading(); currentRouteData.routeDistance = currentRouteData.routes[0].summaryDistance.value; // always in metres currentRouteData.routeDistanceUnits = 'metres'; displayAARouteSummary(currentRouteData.routes[0].summaryDistance.value, currentRouteData.routes[0].summaryDuration.value,currentRouteData.routes[0].summaryDurationInTraffic.value,currentRouteData.routes[0].summary ); //displayTargetedRouteAd(currentRouteData.routes[0].summaryDistance.value, placeElements[0][0],placeElements[placeElements.length-1][0]); postRouteTidyUp(); // add route POIs addAARoutePOIMarkers(); //post route functions if(aaRP.hasLocalStorage){ //add to local storage history aaRP.storage.addToLocalHistoryCountry($("#confirmFrom").val(),$('input[name=changeDB]:checked',"#inputFields").val()); } setURLHistory(); } function renderRouteDirectionsAndSetMarkers(bAddMarkers){ //SIGNPOST ELEMENT TYPE //1 motorway sign //2 primary road sign //3 local road sign //4 place of interest sign //5 AA signs //6 RAF Base sign //7 Hospital sign var i, j; var groute; var sectionTime; var totalTime = 0; var totalTimeInCurrentTraffic=0; var accumDistanceMetres = 0; var accumDistance=0; var gstep; var routeDirections = document.getElementById('routeDirections'); var glatlng; var tmpAddr; //compile HTML from JSON var routeDirectionsText = Handlebars.templates["route-directions"](currentRouteData); // Loop through each route in the GDirections object to set placeElements for (i = 0; i < currentRouteData.routes[0].legs.length; i++) { groute = currentRouteData.routes[0].legs[i]; //set input readable values and marker infowindow //TBD - .toFixed here causes issue if placeElement is E/N as we are currently using presence of a . elsewhere as differentiator between E/N and Lat/Lng. //don't update input text if this is not a dragged route (display google geo results not directions results) if(draggedRoute && i==0) { //start tmpAddr=groute.start_address; if(tmpAddr==undefined||tmpAddr=="") { tmpAddr=aaRP.formatGazOrLatLng(placeElements[i][1][0]) + "," + aaRP.formatGazOrLatLng(placeElements[i][1][1]); } else { $("#routeFrom").val(tmpAddr); } placeElements[i][0]=tmpAddr; //set text address $("#confirmFrom").val("0|" + tmpAddr + "||" + aaRP.formatGazOrLatLng(placeElements[i][1][1]) + "|" + aaRP.formatGazOrLatLng(placeElements[i][1][0])); } if(draggedRoute && (i==(currentRouteData.routes[0].legs.length-1))) { //end tmpAddr=groute.end_address; if(tmpAddr==undefined||tmpAddr=="") { tmpAddr=aaRP.formatGazOrLatLng(placeElements[currentRouteData.routes[0].legs.length][1][0]) + "," + aaRP.formatGazOrLatLng(placeElements[currentRouteData.routes[0].legs.length][1][1]); } else { $("#routeTo").val(tmpAddr); } placeElements[currentRouteData.routes[0].legs.length][0]=tmpAddr; //set text address $("#confirmTo").val("0|" + tmpAddr + "||" + aaRP.formatGazOrLatLng(placeElements[currentRouteData.routes[0].legs.length][1][1]) + "|" + aaRP.formatGazOrLatLng(placeElements[currentRouteData.routes[0].legs.length][1][0])); } if(draggedRoute && (i != 0)) { //via - only one leg if i=0 tmpAddr=groute.start_address; if(tmpAddr==undefined||tmpAddr=="") { tmpAddr=aaRP.formatGazOrLatLng(placeElements[i][1][0]) + ", " + aaRP.formatGazOrLatLng(placeElements[i][1][1]); } else { $("#via" + (i-1)).val(tmpAddr); } placeElements[i][0]=tmpAddr; //set text address $("#viaChoice" + (i-1)).val("0|" + tmpAddr + "||" + aaRP.formatGazOrLatLng(placeElements[i][1][1]) + "|" + aaRP.formatGazOrLatLng(placeElements[i][1][0])); } if(groute.duration_in_traffic && groute.duration_in_traffic.value) { totalTimeInCurrentTraffic = groute.duration_in_traffic.value; } } routeDirections.innerHTML = routeDirectionsText; } function renderAARoutePath(currentRouteData){ var polyPath=[],groute={}; // Loop through each route in the GDirections object for (i = 0; i < currentRouteData.routes[0].legs.length; i++) { groute = currentRouteData.routes[0].legs[i]; // Loop through all the steps in the route for (j = 0; j < groute.steps.length; j++) { gstep = groute.steps[j]; if(gstep.hasOwnProperty('polyline') && gstep.polyline!=null && gstep.polyline.hasOwnProperty('points') && gstep.polyline.points != null) { polyPath = polyPath.concat(Decode(gstep.polyline.points)); } } } //display polyline addDecodedRouteOverlay(polyPath); } function addAARoutePOIMarkers() { //build array of pois if(currentRouteData && currentRouteData.routes[0].routePOIs != undefined && currentRouteData.routes[0].routePOIs.length>0) { addPOIMarkersFromRouteJson(currentRouteData.routes[0].routePOIs); } } function displayAARouteSummary(metres, seconds,totalTimeInCurrentTraffic,routeTextSummary) { var distance = metres / distanceConversion; var timeHours = Math.floor(seconds / 3600); var timeMinutes = Math.floor((seconds - (timeHours * 3600)) / 60); var distanceUnits = distanceConversion == metresToKilometres ? "km" : "miles"; var switchDistanceUnits = distanceConversion == metresToKilometres ? "miles" : "km"; var summaryHTML = ""; var lastElementIndex = placeElements.length - 1; var $routeSummary = $('#routeSummary'); var $routeMessageElement=$("#routeMessage"); var i; //updateMileagePanel(distance, distanceUnits); summaryHTML = '
' + 'From: ' + placeElements[0][0] + '
'; for (i = 1; i < lastElementIndex; i++) { summaryHTML += 'Via: ' + placeElements[i][0] + '
'; } summaryHTML += 'To: ' + placeElements[lastElementIndex][0] + '
' + '
'; if(viaCount==0 && !$("#chkAvoidTraffic").is(":checked") && aaRP.selectedAltRoute==0){ summaryHTML += 'Tweet route'; } summaryHTML += 'Print'; //native app nav if(viaCount==0) { if(navigator.userAgent.match(/iPhone/i)) { summaryHTML += 'Navigate this route'; } else if (navigator.userAgent.match(/Android/i)) { summaryHTML += 'Navigate this route'; } } summaryHTML += '
Via ' + routeTextSummary + '
'+ '
Distance: ' + distance.toFixed(1) + ' ' + distanceUnits + ' (show in ' + switchDistanceUnits + ')
' + '
Time: ' + formatSummaryTime(seconds) + '
'; // show if more than 10 min delay if total journey time < 7200 (2 hours), otherwise if difference is >20% if((seconds<7200 && parseInt(totalTimeInCurrentTraffic,10)>0 && ((parseInt(totalTimeInCurrentTraffic,10)-parseInt(seconds))>600) || (seconds>=7200 && (parseInt(totalTimeInCurrentTraffic,10)/parseInt(seconds,10)>=1.2)))) { summaryHTML+='
' + formatSummaryTime(totalTimeInCurrentTraffic) + ' in current traffic
'; } else if (parseInt(totalTimeInCurrentTraffic,10)>0 && viaCount==0){ summaryHTML+='Time in current traffic: ' + formatSummaryTime(totalTimeInCurrentTraffic) + ''; } summaryHTML+='
'; //hide loading message $routeMessageElement.html('').hide(); $routeSummary.html(summaryHTML).show(function(){ //and show alt routes displayAlternativeRouteSummary(); }); } function displayAlternativeRouteSummary(){ //loop through alternative routes (not selected) and display under main summary $routeSummary=$("#routeSummary"); var strOut=""; for(var altRoute=0;altRoute < aaRP.gDirResult.routes.length; altRoute++) { //TBD - consider mobile if(altRoute!=aaRP.selectedAltRoute) { var distanceUnits = distanceConversion == metresToKilometres ? "km" : "miles"; strOut="
"; //sum total time for each leg within route var tmpRouteDuration=0; var tmpRouteDistance=0; for(var l=0; l < aaRP.gDirResult.routes[altRoute].legs.length;l++){ tmpRouteDuration+=aaRP.gDirResult.routes[altRoute].legs[l].duration.value; tmpRouteDistance+=aaRP.gDirResult.routes[altRoute].legs[l].distance.value; //m } strOut+=formatSummaryTime(tmpRouteDuration) + " / " + (tmpRouteDistance / distanceConversion).toFixed(1) + " " + distanceUnits; strOut+=""; strOut+="
Via " + aaRP.gDirResult.routes[altRoute].summary + "...
"; if(altRoute480){ $("#routeSummary .altRouteRow").on("mouseenter mouseleave",function(event) { //find data attribute of parent row if(event.type=="mouseenter") { var hoveredAltRoute=$(event.target).closest(".altRouteRow").data("altroute"); if(hoveredAltRoute!=null && hoveredAltRoute!=undefined){ //console.log("hoveredAltRoute:" + hoveredAltRoute); aaRP.fn.showAltRoute(hoveredAltRoute); $(this).find(".threedots").show("fast"); } } else { aaRP.fn.hideAltRoute(); $(this).find(".threedots").hide("fast"); } }); } } function createRouteMarkersFromPlaceArray(bAddMarkers,placeElements) { var lastElementIndex = placeElements.length - 1; //clear all route markers and redraw for (i = 0; i < gMarkers.length; i++) { //mapGoogle.removeOverlay(gMarkers[i]); gMarkers[i].setMap(null); gMarkers[i]=null; } gMarkers.length = 0; // Add the markers to the map for (i = 0; i <= lastElementIndex; i++) { createRouteMarker(convertAndGetGoogleLatLng(placeElements[i][1][0], placeElements[i][1][1]), i, placeElements[i][0],true); /*if(bAddMarkers) { createRouteMarker(convertAndGetGoogleLatLng(placeElements[i][1][0], placeElements[i][1][1]), i, placeElements[i][0],true); } else { //need to leave marker in original position if dropped and no route returned gMarkers[i].html=placeElements[i][0]; }*/ } } function switchAADistanceUnits() { // Redisplay the route in the switched units if (distanceConversion == metresToKilometres) { distanceConversion = metresToMiles; } else { distanceConversion = metresToKilometres; } //Just redraw html displayAARouteSummary(currentRouteData.routes[0].summaryDistance.value, currentRouteData.routes[0].summaryDuration.value,currentRouteData.routes[0].summaryDurationInTraffic.value,currentRouteData.routes[0].summary); renderRouteDirectionsAndSetMarkers(false); } function formatSummaryTime(seconds) { return formatTime(seconds, " hr ", " mins"); } function formatSectionTime(seconds) { return formatTime(seconds, ":", ""); } function formatTime(seconds, delim1, delim2) { var timeHours = Math.floor(seconds / 3600); var timeMinutes = Math.floor((seconds - (timeHours * 3600)) / 60); var strMinutes = timeMinutes.toString(); if(timeHours>1 && delim1==" hr ") {delim1=" hrs "}; if (strMinutes.length == 1 && timeHours!=0) { strMinutes = '0' + strMinutes; } if (timeHours==0) { return strMinutes + ' minutes'; } else { return timeHours + delim1 + strMinutes + delim2; } } function trim(str) { return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } /** hide the "Get route" button and show the swirl image **/ function showLoading() { $('.getRouteBtn','#getRouteWrapper').css({"background-position": '0 top'}); $('.getRouteBtn span','#getRouteWrapper').css({"background-position": '100% top'}) } /** hide the swirl image and show the Get Route button **/ function hideLoading() { $('.getRouteBtn','#getRouteWrapper').css({"background-position": '0 -32px'}); $('.getRouteBtn span','#getRouteWrapper').css({"background-position": '100% -32px'}); } function setURLHistory() { setTabLinks(mapAA); //reset hasHashValues=false; if(!window.location) { return; } //only for simple routes without vias, route options if(viaCount==0 && !$("input#avoidMotorways").prop('checked') && !$("input#avoidTolls").prop('checked') && !$("#avoidTraffic").prop('checked') && aaRP.selectedAltRoute==0) { //set hash values var tmpFromPlace=$('#routeFrom').val(); var tmpToPlace= $('#routeFrom').val(); var tmpFromNode=$('#confirmFrom').val(); var tmpToNode= $('#confirmTo').val(); if(tmpFromNode != "" && tmpFromNode != null && tmpToPlace != "" && tmpToNode != null) { //check current hash value!=new has value var currentHashvalue=decodeURI(window.location.hash); var curhashfromNode=''; var curhashtoNode=''; var curhashfromPlace=''; var curhashtoPlace=''; try { if(currentHashvalue.indexOf("|") != -1 && currentHashvalue.indexOf("toNode") != -1 && currentHashvalue.indexOf("fromNode") != -1 && (currentHashvalue.indexOf("toNode") > currentHashvalue.indexOf("fromNode"))) { curhashfromNode=stripNode(currentHashvalue.substring(currentHashvalue.indexOf("fromNode")+9,currentHashvalue.indexOf("|toNode"))); if(hashvalue.indexOf("|db") != -1) { curhashtoNode = stripNode(hashvalue.substring(hashvalue.indexOf("toNode") + 7, hashvalue.lastIndexOf("|db="))); } else if (hashvalue.indexOf("&db") != -1) { curhashtoNode = stripNode(hashvalue.substring(hashvalue.indexOf("toNode") + 7, hashvalue.lastIndexOf("&db="))); } else { //need to use regex here instead... curhashtoNode = stripNode(hashvalue.substring(hashvalue.indexOf("toNode") + 7, hashvalue.length)); } curhashfromPlace=getGazPlaceFromString(curhashfromNode); curhashtoPlace=getGazPlaceFromString(curhashtoNode); } } catch(e){ return; } //prevent infinite loops for browsers which may refresh the page when setting .hash if(curhashfromNode!=tmpFromNode||curhashtoPlace!=tmpToNode) { var newhashValue=encodeURI("fromNode=" + tmpFromNode + "|" + "toNode=" + tmpToNode); window.location.hash = newhashValue; } } } //end if simple route else { //clear hash value if(window.location) { //Doesn't work in FF3.0 //window.location.hash =""; } } } function showAADataOptionsbox(formboxID,buttonID) { if(window.aaDataOptionsTimer) clearTimeout(aaDataOptionsTimer); //hide both $("#aadataoptionsbox, #aaparkdataoptionsbox, #more_inner, #parking_inner").removeClass("hover"); $("#" + formboxID + ",#" + buttonID).addClass("hover"); document.getElementById("aadataoptionsbox").style.display="none"; document.getElementById("aaparkdataoptionsbox").style.display="none"; document.getElementById(formboxID).style.display = "block"; } function closeAADataOptionsBox(formboxID,buttonID) { var layerbox = document.getElementById(formboxID); var button = document.getElementById(buttonID); var bottomColor = "#c0c0c0"; aaDataOptionsTimer = window.setTimeout(function() { layerbox.style.display = "none"; $("#" + formboxID).removeClass("hover"); $("#" + buttonID).removeClass("hover"); }, 400); } function aaDataOptionsControl(controlDiv,map) { controlDiv.style.padding="5px 0 5px 0"; var more = document.getElementById("aadata_more"); var aabuttonDiv = document.createElement("DIV"); aabuttonDiv.id = "morebutton"; aabuttonDiv.title = "Show/Hide AA data"; var textDiv = document.createElement("DIV"); textDiv.id = "more_inner"; textDiv.innerHTML="Traffic "; aabuttonDiv.appendChild(textDiv); // Insert the button just after aadata__more div more.insertBefore(aabuttonDiv, document.getElementById("aadataoptionsbox").parentNode); controlDiv.appendChild(more); //event handlers google.maps.event.addDomListener(controlDiv,'mouseover',function() {showAADataOptionsbox('aadataoptionsbox','more_inner')}); google.maps.event.addDomListener(controlDiv,'mouseout',function() {closeAADataOptionsBox('aadataoptionsbox','more_inner')}); } function aaParkingControl(controlDiv,map) { controlDiv.style.padding="5px 0 5px 0"; controlDiv.id="parkingbuttonWrapper"; var parkingmore = document.getElementById("aaparkdata_more"); var aaParkingbuttonDiv = document.createElement("div"); aaParkingbuttonDiv.id = "parkingbutton"; aaParkingbuttonDiv.title = "Show/Hide car parks"; var textParkingDiv = document.createElement("div"); textParkingDiv.id = "parking_inner"; textParkingDiv.innerHTML="Parking "; aaParkingbuttonDiv.appendChild(textParkingDiv); // Insert the button just after aadata__more div parkingmore.insertBefore(aaParkingbuttonDiv, document.getElementById("aaparkdataoptionsbox").parentNode); controlDiv.appendChild(parkingmore); //event handlers google.maps.event.addDomListener(controlDiv,'mouseover',function() { showAADataOptionsbox('aaparkdataoptionsbox','parking_inner') }); google.maps.event.addDomListener(controlDiv,'mouseout',function() { closeAADataOptionsBox('aaparkdataoptionsbox','parking_inner') }); } function showAADataLayer(checked,cbName,mapref) { if (cbName=='dispTrafficAlert') { if(aaTrafficOverlay&&aaTrafficOverlay.displayTrafficAlertOverlay) { if (checked) { aaTrafficOverlay.displayTrafficAlertOverlay(mapref,true,'overlayMapMessage',{alerts:true}); } else { aaTrafficOverlay.displayTrafficAlertOverlay(mapref,false,'overlayMapMessage',{alerts:true}); //remove messages hidePOIMsg('#overlayMapMessage'); } } } else if (cbName=='dispCarparks') { aaPOI.parking.pmhZoomThreshold=11; hidePOIMsg('#overlayMapMessage'); replaceParkingJsonData(mapref,'overlayMapMessage',getCarParkType()); } else if (cbName=='dispPMHCarparks') { aaPOI.parking.pmhZoomThreshold = 11; hidePOIMsg('#overlayMapMessage'); replaceParkingJsonData(mapref,'overlayMapMessage',getCarParkType()); } } function getCarParkType() { //check tickboxes and return appropriately var parkopediaChecked = $("#dispCarparks").is(":checked"); //true or false? var parkatmyhouseChecked= $("#dispPMHCarparks").is(":checked"); //true or false? if(parkopediaChecked && parkatmyhouseChecked) {return 'all';} else if (parkopediaChecked && !parkatmyhouseChecked) {return 'parkopedia';} else if (!parkopediaChecked && parkatmyhouseChecked) {return 'parkatmyhouse';} else return 'none'; } //v3 map functions function isEmpty(tmp) { if(tmp===undefined) { tmp=''; } return tmp; } function Decode(call) { /*NOT USED IF USING GOOGLE GEO LIBRARY - ONLY AVAILABLE WITH v3.3 of API*/ var c,i,j,k,l,q,w,x,y,z=new Array(); if (typeof(call)!="object") call=[call]; for (i=0;q=call[i];i++) { if (q=q.match(/[\_-\~]*[\?-\^]/g)) for (j=0,k=0,x=0,y=0;;j++) { if (!q[k]) break; for (l=q[k].length,c=63,w=0;l--;c=95) w=(w<<5)+q[k].charCodeAt(l)-c; y+=(w<<31>>31)^(w>>1); k++; if (!q[k]) break; for (l=q[k].length,c=63,w=0;l--;c=95) w=(w<<5)+q[k].charCodeAt(l)-c; x+=(w<<31>>31)^(w>>1); k++; z.push(new google.maps.LatLng((y*(1e-5)),(x*(1e-5)))); } } return z; } function setupControls(map) { var aaDataOptionsControlDiv=document.createElement('DIV'); var dataOptionsControl = new aaDataOptionsControl(aaDataOptionsControlDiv,map) aaDataOptionsControlDiv.index=1; map.controls[google.maps.ControlPosition.TOP_RIGHT].push(aaDataOptionsControlDiv); var parkingControlDiv=document.createElement('DIV'); var parkingControl = new aaParkingControl(parkingControlDiv,map); parkingControlDiv.index=1; map.controls[google.maps.ControlPosition.TOP_RIGHT].push(parkingControlDiv); } /* function displayTargetedRouteAd(distance,from,to) { //distance unit is metres //(price in £ per mile) * distance (in mile) x 3 (number of passengers). var distMiles=distance/metresToMiles; if(distMiles<50) { return;} var outValue = Math.round(0.11 * distMiles * 3); $(".routeprice","#routeTargetedAd").html("£" + outValue); var destURL="https://www.blablacar.co.uk/"; destURL=destURL+"driver-ridesharing?comuto_cmkt=UK_AA_DRVR_CONTEXTUAL-ROUTE-PLANNER_EZDR&utm_source=AA&utm_medium=banner&utm_content=V1&utm_campaign=UK_AA_DRVR_CONTEXTUAL-ROUTE-PLANNER_EZDR&from=" + encodeURI(from) + "&to=" + encodeURI(to); $(".blabla-link","#routeTargetedAd").attr("href",destURL); $("#routeTargetedAd").show(); } */