// 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 '},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 "},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="
"
+ '
'
+ " Warning: safety cameras
"
+ "
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('').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 += '';
}
summaryHTML += '
Print';
//native app nav
if(viaCount==0) {
if(navigator.userAgent.match(/iPhone/i)) {
summaryHTML += '

';
}
else if (navigator.userAgent.match(/Android/i)) {
summaryHTML += '

';
}
}
summaryHTML += '
Via ' + routeTextSummary + '
'+
'
' +
'
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();
}
*/