var AtisContextMenu=function(e,t){var s,n={populateMenu:function(e,r,a,i,u){var t=16;$.ajax("/api/route/getlocations?latitude="+MapComp.lat(i)+"&longitude="+MapComp.lng(i)+"&zoom="+t).done(function(e){var t="";if(s=[],null!=e)if(e.length)for(var n=0,o=e.length;n<o;n++)e[n].name&&(t+='<li><a  href="#'+n+'">'+e[n].nameDirection+"</a></li>",s.push(e[n]));else t='<li><p class="error">'+resources.CouldNotRetrieveMapLocation+"</p></li>";u(t,r,a,i)}).fail(function(){u(null,r,a,i)})},doAction:function(e,t,n){n=s[n];o(t,n,e)},setupEventHandlers:function(e){e.find("a").hover(function(){$(this).parent().addClass("hover")},function(){$(this).parent().removeClass("hover")})},resetMarkers:function(e){$(document).trigger("resetRoutePlanner-contextMenu")}},o=function(e,t,n){var e=$(e.target),o=e.parent(),r=e.detach(),a=this;a.mostRecentLocation=t,o.append(a.toHereFromHereMenuItem||'<div class="btn-group" id="contextMenuToFrom"><button class="btn btn-info" data-type="fromHere">'+resources.FromHere+'</button><button class="btn btn-info" data-type="toHere">'+resources.ToHere+"</button></div>"),a.toHereFromHereMenuItem||(e=o.children().first(),$('[data-type="fromHere"],[data-type="toHere"]',e).on("click",function(e){var t;t=$(this).attr("data-type"),$(document).trigger("locationSelected-contextMenu",[t,a.mostRecentLocation]),n.fadeOut(75)}).css("cursor","pointer")),o.on("mouseleave.atisContextMenu",function(e){a.toHereFromHereMenuItem=o.children().first().detach(),o.append(r),o.off("mouseleave.atisContextMenu"),o.removeClass("hover")})};return n};
var NewAtisContextMenu=function(r,e){var a,u,n,t,o,s,i={populateMenu:function(e,t,o,n,r){a=n,r('<a class="list-group-item contextPointButton" data-type="fromHere" href="#1">'+resources.FromHere+'</a><a class="list-group-item contextPointButton" data-type="toHere" href="#2">'+resources.ToHere+"</a>",t,o,n)}},c=(i.AddWaypointToContextMenu=function(e){0},i.getNearestLocations=function(e,t,o){var n=16;o&&(n=r.map.zoom),$.ajax("/api/route/getlocations?latitude="+MapComp.lat(e)+"&longitude="+MapComp.lng(e)+"&zoom="+n).done(function(e){t(e||[])}).fail(function(){t(null)})},function(e){u.empty(),l(e);e=$(map.getDiv());t>e.width()-u.width()&&(t-=u.width()),o>e.height()-u.height()&&(o-=u.height()),u.css({top:o,left:t}).fadeIn(300)}),l=function(e){"True"==resources.DisplayLocationsInContextMenu?(u.append(e+"<hr>"),u.append('<li><a href="#resetMarkers">'+resources.StartOver+'</a></li><li><a href="#zoomIn">'+resources.ZoomIn+'</a></li><li><a href="#zoomOut">'+resources.ZoomOut+'</a></li><li><a href="#centerMap">'+resources.CenterHere+"</a></li>")):(u.append(e),u.append('<a href="#resetMarkers" class="list-group-item defaultMenu">'+resources.StartOver+'</a><a href="#zoomIn" class="list-group-item defaultMenu">'+resources.ZoomIn+'</a><a href="#zoomOut" class="list-group-item defaultMenu">'+resources.ZoomOut+'</a><a href="#centerMap" class="list-group-item defaultMenu">'+resources.CenterHere+"</a>")),setUpMenuEventHandlers()},p=(i.setupEventHandlers=function(e){},i.setupEventHandlersold=function(){"True"==resources.DisplayLocationsInContextMenu?u.find("a").click(function(e){e.preventDefault();var t=$(e.target).attr("href").substr(1),o=m(t);if(null!=o){o=s[o];p(e,o)}else switch(u.fadeOut(75),t){case"resetMarkers":$(document).trigger("resetRoutePlanner-contextMenu");break;case"zoomIn":map.setZoom(map.getZoom()+1),map.panTo(n);break;case"zoomOut":map.setZoom(map.getZoom()-1),map.panTo(n);break;case"centerMap":map.panTo(n)}}):$(".defaultMenu").click(function(e){e.preventDefault();var t=$(e.target).attr("href").substr(1),o=m(t);if(null!=o){o=s[o];p(e,o)}else switch(u.fadeOut(75),t){case"resetMarkers":$(document).trigger("resetRoutePlanner-contextMenu");break;case"zoomIn":map.setZoom(map.getZoom()+1),map.panTo(n);break;case"zoomOut":map.setZoom(map.getZoom()-1),map.panTo(n);break;case"centerMap":map.panTo(n)}}),u.find("a").hover(function(){$(this).parent().addClass("hover")},function(){$(this).parent().removeClass("hover")})},function(e,t){var e=$(e.target),o=e.parent(),n=e.detach(),r=this;r.mostRecentLocation=t,o.append(r.toHereFromHereMenuItem||'<div class="btn-group" id="contextMenuToFrom"><button class="btn btn-info" data-type="fromHere">'+resources.FromHere+'</button><button class="btn btn-info" data-type="toHere">'+resources.ToHere+"</button></div>"),r.toHereFromHereMenuItem||(e=o.children().first(),$('[data-type="fromHere"],[data-type="toHere"]',e).on("click",function(e){var t;t=$(this).attr("data-type"),$(document).trigger("locationSelected-contextMenu",[t,r.mostRecentLocation]),u.fadeOut(75)}).css("cursor","pointer")),o.on("mouseleave.atisContextMenu",function(e){r.toHereFromHereMenuItem=o.children().first().detach(),o.append(n),o.off("mouseleave.atisContextMenu"),o.removeClass("hover")})}),m=function(e){try{var t=parseInt(e);return isNaN(t)?null:t}catch(e){return null}};return i.resetMarkers=function(e){$(document).trigger("resetRoutePlanner-contextMenu")},i.doAction=function(e,t,o){$(document).trigger("locationSelected-contextMenu",[1==o?"fromHere":"toHere",{point:{latitude:MapComp.lat(a),longitude:MapComp.lng(a)}}]),$("#mapLocation").is(":visible")&&$(".myRouteBtn").trigger("click"),e.fadeOut(75)},i},NewAtisContextMenuFromErs=function(r,e){var a,t={populateMenu:function(e,t,o,n,r){a=n,r('<a class="list-group-item contextPointButton" data-type="fromHere" href="1">'+resources.FromHere+'</a><a class="list-group-item contextPointButton" data-type="toHere" href="2">'+resources.ToHere+"</a>",t,o,n)},doAction:function(e,t,o){$(document).trigger("locationSelected-contextMenu",[1==o?"fromHere":"toHere",{point:{latitude:MapComp.lat(a),longitude:MapComp.lng(a)}}]),contextMenu.fadeOut(75)},setupEventHandlers:function(e){},getNearestLocations:function(e,t,o){var n=16;o&&(n=r.zoom),$.ajax("/api/route/getlocations?latitude="+MapComp.lat(e)+"&longitude="+MapComp.lng(e)+"&zoom="+n).done(function(e){t(e||[])}).fail(function(){t(null)})}};return t.resetMarkers=function(e){$(document).trigger("resetRoutePlanner-contextMenu")},t};
$(()=>{$("#setStartGeolocation")[0].addEventListener("focus",()=>{""!==$("#startLocationText").val()&&$("#swapLocationsBtn").focus()}),$("#setEndGeolocation")[0].addEventListener("focus",()=>{""!==$("#endLocationText").val()&&$("#generateRouteBtn").focus()}),$("#generateRouteBtn").keydown(function(t){"Tab"===t.key&&t.shiftKey&&setTimeout(()=>{$("#endLocationText").focus()})}),$("#swapLocationsBtn").keydown(function(t){"Tab"===t.key&&t.shiftKey&&setTimeout(()=>{$("#startLocationText").focus()})})});let RoutePlanner=function(p,t,e){function n(e){e.preventDefault(),u=[];var t=$("#startLocationText").val(),n=$("#endLocationText").val();t.match(/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/g)&&n.match(/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/g)?B([{point:{latitude:t.split(",")[0],longitude:t.split(",")[1]}},{point:{latitude:n.split(",")[0],longitude:n.split(",")[1]}}],e):g.getLocationArray().then(t=>{d(t)?y(!0):!function(t){let e=(t[0].point.latitude||"rand")==t[t.length-1].point.latitude&&(t[0].point.longitude||"rand")==t[t.length-1].point.longitude,n=(t[0].linkId||"rand")==t[t.length-1].linkId;return e||n}(t)?(P(),B(t,e)):(P(resources.StartAndEndLocationCannotBeSame),y(!0))}).catch(()=>P(resources.PleaseCheckStartEndLocation)),MapComp.isGoogle&&f.getStreetView().setVisible(!1)}function o(){$(".waypointContainer").hide(),y(),u=[],h="",localStorage.setItem("routeGenerateButton",""),"undefined"!=typeof TransitOptions&&TransitOptions.reset(),g.clearAll(),$("#btnSaveRoute").text(resources.Save),$(document).trigger("routeCleared-routePlanner"),0<$("#Map_Index_RoutePlannerDescription > div").contents().length&&$("#routePlannerDesc").show()}let a={},s=RoutePlannerAutocomplete(p.map,e,window.extraPoi||[]),g=new WaypointManager(p.map,s,t,a),i=new RoutingPolyline(p,t,a,g),f=(MapComp.routePolyline=i,p.map),r=new UserGeolocation(s,g,t,p.map,p),l=new TransitDirections(p,i,document.getElementById("transitRouteResults")),c=new MapFctns,u=[],h="",d=(s.SetupAutoComplete("#startLocationText",g.getLocations()),s.SetupAutoComplete("#endLocationText",g.getLocations()),function(e){for(let t=0;t<e.length;t++)if(!e[t])return 0===t?P(resources.PleaseCheckStartLocation):t===e.length-1?P(resources.PleaseCheckEndLocation):P(resources.PleaseCheckWaypoints),!0;return!1}),y=function(t){i.DeleteAll(),$(".linkIcons").hide(),$("#routeResults").hide(),$("#routeTabContent").empty(),$("#routeTabs").empty(),t||P(),l.Reset()},R=($(document).on("clearRouteView-routePlanner",function(t){y()}),$(document).on("saveRoutePoints",function(){var t={locations:$.map(g.getLocations(),function(t){return t.point}),avoidToll:$("#avoidTollsCheckBox").is(":checked")};localStorage.setItem("routeLocations",JSON.stringify(t))}),function(){$(document).trigger("routingFail-routePlanner")}),T=function(){$(document).trigger("routingSuccess-routePlanner")},m=function(t,e,n){$(".waypointContainer").hide(),$("#transitRouteResults").show(),l.Directions(t,e,n),$("#routeResults").trigger("adjustTransitResultsHeight"),P(resources.TransitForImmediateDepartures),$(".linkIcons").show()},v=function(t,n,e,o){let a=t,i;n&&(a=[t[0],n],i=[n,t[1]]),$.ajax("/api/route/getroutes",{type:"POST",data:{Waypoints:a,Options:e},transitHubLocation:n}).done(function(e){if(0<e.length){if(MapComp.isGoogle)for(let t=0;t<e[0].waypoints.length&&(1!==t||!n);t++)g.adjustMarker(t,e[0].waypoints[t].point.latitude,e[0].waypoints[t].point.longitude);$(document).trigger("routeGenerated-loginModal")}b(e,!1!==n,n.name),n&&(m(i,o,!0),c.fitMapToRoute(f,t),loadBlockerApi.hideSpinner("calculateDriveTransitRoute")),T()}).fail(function(){R(),P(resources.ErrorRetrievingYourRoute),loadBlockerApi.hideSpinner("calculateDriveTransitRoute")}).always(function(){loadBlockerApi.hideSpinner("calculateRoute")})},k=function(t,e){t.forEach(function(t){t.listenerAdded=!1,google.maps.event.clearListeners(t,e)})};const L=(o,t,a,i,r)=>{o.listenerAdded||(o.listenerAdded=!0,o.addListener("mouseup",function(n){g.getLocationArray().then(t=>{var e;d(t)?(y(),k(a,"mouseup"),loadBlockerApi.hideSpinner("calculateDriveTransitRoute")):(loadBlockerApi.showSpinner("calculateDriveTransitRoute"),e=s.GetCustomSimplePlace(o.title,null,n.latLng.lat(),n.latLng.lng(),!1),v(t,e,i,r),$("#transitRouteResults").addClass("padFix"),k(a,"mouseup"))})}))};let w=function(){var t={};return 0<$("#avoidTollsCheckBox").length&&(t.AvoidTolls=$("#avoidTollsCheckBox").is(":checked")),0<$("#avoidFerriesCheckBox").length&&(t.AvoidFerries=$("#avoidFerriesCheckBox").is(":checked")),t},S=function(t){if("undefined"==typeof TransitOptions)return{};switch(t){case"generateWalkOnlyRouteBtn":TransitOptions.UpdateTransitOptions("WALK");break;case"generateBicycleOnlyRouteBtn":TransitOptions.UpdateTransitOptions("BICYCLE");break;case"generateTransitRouteBtn":TransitOptions.UpdateTransitOptionsFromDropDown()}try{return JSON.stringify(TransitOptions.GetTransitOptions())}catch(t){return{error:t}}};function B(t,e){let n="";CTVars.markerDragEnded&&""!==h?(n=h,CTVars.markerDragEnded=!1):n=(e?.currentTarget?.id?e?.currentTarget:e?.target).id,h=n,e?.currentTarget&&(e.currentTarget.id=n),loadBlockerApi.showSpinner("calculateRoute"),y(),$("#routePlannerDesc").hide(),g.setDetails();var o,a,i,r,s=w(),l=S(n);if(l?.error)loadBlockerApi.hideSpinner("calculateRoute"),RoutePlannerStatus.updateStatus(l.errMsg,RoutePlannerStatus.StatusTypes.danger);else switch(n){case"generateDriveTransitRouteBtn":{var c=t;var u=l;var d=s;u.travelMode="transit",$(".waypointContainer").hide(),loadBlockerApi.hideSpinner("calculateRoute"),$(".routeName").toggle(!1),$("#btnSaveRoute").toggle(!1),f.setZoom(12),f.panTo(new google.maps.LatLng(c[0].point.latitude,c[0].point.longitude)),MapComp.methods.clearAllLegendLayers(),P(resources.DriveTransitHelpText);let o=resources.ParkAndRideLayers.split(","),a=[];o.forEach(function(t){$(document).on("layerRefreshed-iconsAdded."+t,function(t,e,n){-1<o.indexOf(e)&&($(document).off("layerRefreshed-iconsAdded."+e),e=p.appHelper.iconManager.GetIconLayer(e).GetIcons(),a=a.concat(e),e.forEach(t=>L(t,0,a,d,u)))});t=document.querySelector(`#${t} input`),t.checked||t.click(),t=t.parentElement.parentElement;t.dataset.section&&"false"===t.ariaExpanded&&document.querySelector(`[data-target=".collapse.${t.dataset.section}"]`).click()})}break;case"generateTransitRouteBtn":c=t,(r=l).travelMode="transit",m(c,r,!1);break;case"generateWalkOnlyRouteBtn":r=t,(i=l).travelMode="walking",m(r,i,!1);break;case"generateBicycleOnlyRouteBtn":i=t,(a=l).travelMode="bicycling",m(i,a,!1);break;default:a=t,o=s,$("#transitRouteResults").hide(),v(a,!1,o)}}let b=function(e,n,o){if($("#routePlannerDesc").hide(),0==e.length){R();var t=g.getLocations();P(t.length<=2?resources.RouteNotAvailable:resources.RouteNotAvailableWithWaypoints)}else{$(".waypointContainer").show(),$("#routeTabs").show(),$(document).trigger("routeGenerated-routePlanner",[e]),y(!0);for(let t=0;t<e.length;t++)addRouteTab(e[t],t+1,n,o,i);$("#routeTabs a").click(function(t){t.preventDefault(),$(this).tab("show"),i.MakeActive($(this).attr("data-guids")+A("#transitRouteTabs li.active a"))}),i.MakeActive($("#routeTabs a:first").attr("data-guids")+A("#transitRouteTabs li.active a")),$("#routeTabs a:first").tab("show"),$("#routeResults").show(),$("#routeResults").scrollTop(0),0<e[0].waypoints.length&&c.fitMapToRoute(f,e[0].waypoints),$("#routeResults").trigger("adjustRoutePlannerHeight");var a=e[0].enableMapLayers;for(let e in a){let t=$("input[type='checkbox'][data-layerid ="+a[e]+"]",$("#layerSelection"));if(t&&t[0]&&!t[0].checked)t[0].click();else p.appHelper.iconManager.RefreshLayer(a[e],true)}MapComp.isGoogle&&f.getStreetView().setVisible(!1),checkEventOnRoutePlanner(),$("#routeTabs a").on("shown.bs.tab",function(){checkEventOnRoutePlanner()}),$(".linkIcons").show()}};function A(t){t=$(t);let e="";return e=null!=t&&t.length&&t!=this?";"+t.attr("data-guids"):e}function C(){var t=0<$("#routeTabs").html().length,e=0<$("#transitRouteResults").html().length;t||e?$(t&&e?"#routeTabContent div.active, #transitRouteResults":t?"#routeTabContent div.active":"#transitRouteResults").printThis():P(resources.NoRouteDetailGenerated,RoutePlannerStatus.StatusTypes.danger)}String.prototype.replaceAll=function(t,e){return this.split(t).join(e)};let P=RoutePlannerStatus.updateStatus,x=function(t,e){e=s.GetSimplePlace(e);e&&g.setLocation(!1,e,!0)},D=(a.SetWaypoint=function(t,e,n){g.setWaypoint(t,Number(e)+1,!0,n)},a.getActiveRouteIndex=function(){var t=$("#routeTabs li.active a").attr("data-id");return isNaN(t)?null:t-1},a.getNameForSimplePlace=function(t,e){g.getNameForSimplePlace(t,e)},a.displayRoutes=function(t){o(),0<t[0].waypoints.length&&(t[0].waypoints[t[0].waypoints.length-1].poiId?(x(null,t[0].waypoints[t[0].waypoints.length].poiId),g.setLocation(!0,t[0].waypoints[0],!0)):g.setAllLocations(t[0].waypoints)),s.SetupAutoComplete("#startLocationText",g.getLocations()),s.SetupAutoComplete("#endLocationText",g.getLocations()),b(t,!1)},a.displayRoute=function(t){a.displayRoutes([t],!1)},{WALK:"generateWalkOnlyRouteBtn",BICYCLE:"generateBicycleOnlyRouteBtn","TRANSIT,WALK":"generateTransitRouteBtn"}),O=(a.displayTransitRoute=function(n){o(),g.setStartEndPoint(new s.GetCustomSimplePlace(n.fromAddress,null,n.fromLat,n.fromLong,!1),new s.GetCustomSimplePlace(n.toAddress,null,n.toLat,n.toLong,!1)),g.getLocationArray().then(t=>{var e;d(t)?y():(n.options?(e=JSON.parse(n.options),h=D[e.Mode.value]):(n.options={},n.options.travelMode="transit"),m(t,n.options,!1))}),"undefined"!=typeof TransitOptions&&TransitOptions.SetTransitOptions(n.options)},a.resetRoutePlanner=o,a.calculateRoute=function(t){var e={};e.currentTarget={id:t},e.target={id:t},e.preventDefault=function(){},n(e)},a.clearLoationsWithoutPoints=function(){g.clearLoationsWithoutPoints()},function(t,e,n){var o='<div class="form-group hidden-print" data-waypointparent="'+t+'"><div class="input-group"><label class="sr-only" for="waypointText-'+t+'">'+resources.Waypoint+" "+t+'</label><div class="input-group-addon"><div class="waypointCircle" aria-hidden="true"></div></div><input type="text" class="form-control waypointText" id="waypointText-'+t+'" placeholder="'+resources.Waypoint+'"><div class="input-group-btn"><button class="btn btn-default" id="setWaypointGeolocation-'+t+'" type="button" data-wpId="'+t+'" title="'+resources.MyLocation+'"><i class="far fa-crosshairs" aria-hidden="true"></i><span class="sr-only">'+resources.MyLocation+'</span></button><button class="btn btn-default" aria-label= "'+resources.Remove+'" id="deleteWaypoint-'+t+'" type="button" data-wpId="'+t+'" title="'+resources.Remove+'"><i class="far fa-times"</button></div></div></div>';$("#waypoints").append(o),$("#waypointText-"+t).val(e),$("#deleteWaypoint-"+t).click(function(){var t=$(this).data("wpid");g.ClearWaypoint(t,"lookupGMarker",!0)}),$("#setWaypointGeolocation-"+t).click(function(){var t=$(this).data("wpid");r.AttemptToSetWaypointWithUsersGeolocation(t)}),s.SetupAutoComplete("#waypointText-"+t,g.getLocations(),n)});a.redrawWaypoints=function(t,e){var n=g.getLocations();if(e){e=n.length-1;g.addWaypoint(e),O(e,t,!1)}else{$("#waypoints").html("");for(let t=1;t<n.length-1;t++)O(t,n[t].text,!0)}},a.AddWaypointToPlanner=function(t,e){a.redrawWaypoints(t,e)},$(document).on("UserRouteDropDownVisible",function(){$(".linkRoute").toggle(!0)}),setAllLocations=function(e){g.setStartEndPoint(e[0],e[e.length-1]);for(let t=1;t<e.length-1;++t)O(t,"",!1),g.setWaypoint(e[t],t,!0,!1)};return $(document).ready(function(){var t,e;$("#generateRouteBtn").click(n),$("#generateTransitRouteBtn").click(n),$("#generateDriveTransitRouteBtn").click(n),$("#generateWalkOnlyRouteBtn").click(n),$("#generateBicycleOnlyRouteBtn").click(n),$("#generateRouteBtn").submit(function(t){t.preventDefault()}),$("#generateTransitRouteBtn").submit(function(t){t.preventDefault()}),$("#generateWalkOnlyRouteBtn").submit(function(t){t.preventDefault()}),$("#generateBicycleOnlyRouteBtn").submit(function(t){t.preventDefault()}),$("#generateDriveTransitRouteBtn").submit(function(t){t.preventDefault()}),window.location.hash.indexOf("#route-")<0?(t=localStorage.getItem("routeLocations"))&&(t=JSON.parse(t),setAllLocations(t.locations),t.avoidToll&&($("#avoidTollsCheckBox").prop("checked",!0),$("#routeOptions").click()),$(".myRouteBtn").trigger("click",{skipPtBSetup:!0}),("TRANSIT"===(t=localStorage.getItem("routeGenerateButton"))?$("#generateTransitRouteBtn"):"DRIVETRANSIT"===t?$("#generateDriveTransitRouteBtn"):"WALK"===t?$("#generateWalkOnlyRouteBtn"):"CYCLE"===t?$("#generateBicycleOnlyRouteBtn"):$("#generateRouteBtn")).click(),localStorage.removeItem("routeLocations")):localStorage.removeItem("routeLocations"),$(document).on("resetRoutePlanner-contextMenu",o),$(document).on("setCarpoolDestination.carpoolTooltip",function(t,e,n,o,a){"block"==$(".showSideBar").css("display")&&$(".showSideBar").trigger("click"),g.setLocation(!1,s.GetCustomSimplePlace(o,null,n,e,!1),!0),bootbox.closeMapPageDialog()}),$(document).on("clearRouteButtonClicked.routeSave",urlHash.clearHash),$("#clearRouteBtn").click(function(){o(),$(document).trigger("clearRouteButtonClicked"),$(".clearLocateBtn").trigger("click")}),$(document).on("clearUserRouteTrigger",function(){$("#clearRouteBtn").trigger("click")}),$("#swapLocationsBtn").click(function(e){var t;$("#startLocationText").val()!=$("#endLocationText").val()&&(t=$("#startLocationText").val(),$("#startLocationText").val($("#endLocationText").val()),$("#endLocationText").val(t),g.swapStartEnd(),g.setDetails(),"True"===resources.AutoGenerateDriveRoute)&&g.getLocationArray().then(t=>{null!=t&&n(e)})}),t=$.QueryString.placeId,e=$.QueryString.destination,t?x(null,parseInt(t)):e&&s.GetSimplePlaceByTextSearch(e,function(t){t&&g.setLocation(!1,t,!0)}),$(".printRoute").click(C),$(".printRoute").bind("keydown",function(t){13==t.keyCode&&C()}),0<$("#routeNotificationAlert").length&&$(".createRouteAlert .close").on("click",function(){$(".createRouteAlert").hide()}),$("#setStartGeolocation").click(function(){r.AttemptToSetLocationWithUsersGeolocation(!0,!0)}),$("#setEndGeolocation").click(function(){r.AttemptToSetLocationWithUsersGeolocation(!1,!0)}),$("#addWaypointBtn").click(function(){var t=null!=(t=$(".waypointText:last")).html()&&0===t.val().length;t||a.AddWaypointToPlanner(null,!0)}),$(document).on("checkEventOnRoutePlanner",checkEventOnRoutePlanner)}),a};$(document).on("appInitComplete",function(t,e,n){let o;o="true"==resources.DisplayLocationsInContextMenu?new AtisContextMenu(e.map,n):new NewAtisContextMenu(e,n);var a=new ContextMenu(e.map,o),e=RoutePlanner(e,a,n);new UserRoutePlanner(e),$(document).trigger("hashChanged-urlHash"),$(document).trigger("BeforeDisplayRoute")});
let RoutePlannerAutocomplete=function(e,o,n){function i(e,t,o,n,l,i,u,c){this.name=e,this.placeId=t,this.point={latitude:o,longitude:n},this.isGoogle=l,this.linkId=null,this.streetNumber=i,this.streetName=u,this.postalCode=c}let u={},c=MapComp.methods.routePlannerAutoComplete,s=(n&&$(n).each(function(e,t){t.isGoogle=!1}),c.startServices(o,n),u.GetGoogleLocation=c.setupGetGoogleLocation(i),u.GetLocationDetails=function(t){return t.point?.name===t.text?Promise.resolve(t.point):u.autoCompleteSource(t,t.text).then(e=>{if(0<e.length)return e=e[0],Object.assign(t,e),$(t.selector).val(t.label),c.GetLocationInformation(t,i).then(e=>(t.point=e,t.text=e.name,e))})},u.autoCompleteSource=function(e,t){return!(t=(t||e.text||"").trim())||t.length<resources.AutoCompleteNumCharacters?Promise.resolve($.ui.autocomplete.filter(n,t)):c.autoCompleteSource(e,t,o.RoutingModel.AutoCompleteCountryCode)},u.GetCustomSimplePlace=function(e,t,o,n,l){return new i(e,t,o,n,l)},u.selectHandler=c.setupSelectHandler(i),u.SetupAutoComplete=function(n,l,e){var t={locations:l,selector:n};$(n).autocomplete({minLength:resources.AutoCompleteNumCharacters,source:function(e,t){var o=this.locations.find(e=>e.selector==this.selector);u.autoCompleteSource(o,e.term).then(e=>{t(e)}).catch(s)}.bind(t),select:u.selectHandler.bind(t),open:c.appendGoogleLogoToAutocompleteResults,delay:150}).click(function(){$(this).select()}).attr({"data-exists":"undefined"!=e&&e}),$(n).off("focusout"),$(n).on("focusout",e=>{const t=l.find(e=>e.selector==n);var o=t.point?.name;t.text=$(t.selector).val(),o!==t.text&&t.text&&t.text.length>=resources.AutoCompleteNumCharacters&&u.GetLocationDetails(t).then(()=>{$(document).trigger("locationSelected-autocomplete",t)})})},function(e){console.log(e)});return u};
var RoutePlannerStatus=new function(){var c={StatusTypes:{info:"alert-info",success:"alert-success",danger:"alert-danger"},updateStatus:function(t,e,o,a,r){var i,s,u,l,n=$("#statusBar"),d=$("#routePlannerDesc"),h=!1;for(i in c.StatusTypes)n.removeClass(c.StatusTypes[i]),e==c.StatusTypes[i]&&(h=!0);n.addClass(h?e:c.StatusTypes.info),0<$("#routeNotificationAlert").length?(s=$(".createRouteAlert"),u=$(".createRouteAlert .msg"),t&&1<t.length?(d.hide(),n.attr("style","display:block;"),n.html(t).show(),o&&a&&(u.html('<i class="fas fa-bell" aria-hidden="true"></i><a href= "/my511/routealert?routeID='+o+'">'+window.resources.CreateAlertLink),Modernizr.mq("(min-width: 993px)")?(l=$(".sideBarColContainer").width()+40,s.css("left",l+"px")):s.insertAfter("#routingInput #statusBar"),s.show())):(n.text("").hide(),u.html(""),s.hide())):t&&1<t.length?(d.hide(),n.attr("style","display:block;"),n.html(t).show(),o&&a&&("true"===resources.ShowSimplifyRouteNotificationModal?Cookies.get("_hideSimplifyRouteNotificationModal")||($("#subscriberRouteName").attr("data-subscriberRouteId",o).text(r),$(".routeNotificationMsg").show(),$(".doNotShowThisMessageAgain").show(),l="/my511/routealert?routeID="+o,$(".editRouteAlert").attr("href",l),$("#quickRouteNotificationModal").modal("show")):Cookies.get("_hideRouteNotificationModal")||($("#createAlterForRoute").attr("href","/my511/routealert?routeID="+o),$("#routeNotificationModal").modal("show")))):n.text("").hide()}};return c};
$(document).ready(function(){var e=!0,t=($("ul.nav-tabs > li").hasClass("active")||(t=""===window.location.hash||0<=window.location.hash.indexOf("-")?"#MyRoutes":window.location.hash.replace(":",""),1===(t=$("#MainTabs a[href='"+t+"']")).length?t.tab("show"):0===t.length&&$("#RoutesTab > a").trigger("click")),$("#MainTabs a").click(function(e){e.preventDefault(),$(this).tab("show"),"#MyRoutes"==$(this).attr("href")?window.DisplayMyCameras():"#Alerts"==$(this).attr("href")&&$(document).trigger("checkAlertsTab")}),$("ul.nav-tabs > li > a").on("shown.bs.tab",function(e){e=$(e.target).attr("href").substr(1);window.location.hash=":"+e}),window.location.hash.replace(":","")),a=(setTimeout(function(){$(".twitter-timeline").each(function(){var e=$(this).contents().find("head");e.length&&e.append('<style type="text/css">.timeline { max-width: 100% !important; } </style>')})},1e3),0<=t.toLowerCase().indexOf("route")),n=0<=t.toLowerCase().indexOf("camera"),o=0<=t.toLowerCase().indexOf("transitregion"),i=0<=t.toLocaleLowerCase().indexOf("news"),s=0<=t.toLocaleLowerCase().indexOf("alerts"),i=(a||n||o||i||0<=t.indexOf("-")?(e=!1,$("#RoutesTab").hasClass("active")||i||($("#RoutesTab > a").trigger("click"),a=window.location.hash.replace(":",""),n=t.lastIndexOf("#"),o=t.length,t=0===n?t:t.substring(n,o),a.toLowerCase()!==t&&(window.location.hash+=t))):(e=!0,!s&&0<=t.indexOf("#")&&AlertHelper.addAlertText(AlertType.Error,resources.InvalidHashUrl)),$(document).on("contentFiltered",function(){GetAlertContent(e),e=!1}),OrganizeRouting(),document.querySelector(".openInfoTab")),n=null!=document.getElementById("AlertsTab");i&&n&&(i.style.display="block")});
let RoutingPolyline=function(o,e,d,l){let s={},c=[],x=o.map,t={zIndex:-99,strokeWeight:4,strokeOpacity:1,strokeColor:resources.RoutePolylineColour,defaultStrokeColor:resources.RoutePolylineColour},g=(s.getInactiveRouteClr=()=>MapComp.isDarkMode?"#e8e3e3":"#6A6A6A",s.AddRoute=function(e,o,t,r,n,i,a,l=!1){("string"==typeof e||e instanceof String)&&(e=[e]);var s,u=g();for(s in t=f({...t,defaultStrokeColor:t?.strokeColor}),e){var p=e[s];r&&(t.map=x);polylinePath=l?MapComp.decodeHereFlexiblePolyline(p):MapComp.decodePolyline(p),p={index:s,id:u+"_"+s,pid:u,options:t,isTransit:n,routeNum:a,waypoints:o,polylinePath:polylinePath,addWaypoint:({latLng:e,lineIndex:o})=>{e={point:MapComp.getLatLngObj({latLng:e})};d.getNameForSimplePlace(e,function(e){d.clearLoationsWithoutPoints(),d.SetWaypoint(e,o,!1),d.AddWaypointToPlanner(e.name,!1),"True"!==resources.AutoGenerateDriveRoute&&d.calculateRoute()})},polylineInfoArray:i,draggableRoutesEnabled:!n},c.push(p)}return u},s.getRoutePolylineObjById=function({id:o}){var e=c.findIndex(e=>e.id===o);return-1!==e?c[e]:void 0},function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var o=16*Math.random()|0;return("x"===e?o:3&o|8).toString(16)})}),f=function(e){var o=JSON.parse(JSON.stringify(t));return e&&(o.zIndex=e.zIndex||o.zIndex,o.strokeWeight=e.strokeWeight||o.strokeWeight,o.strokeOpacity=e.strokeOpacity||o.strokeOpacity,o.strokeColor=e.strokeColor||o.strokeColor,o.defaultStrokeColor=e.defaultStrokeColor||o.defaultStrokeColor),o},u=(s.HideAll=function(){for(var e in o.appHelper.closeInfoWindow(),c)MapComp.clearRouteLines(c[e])},s.ShowAll=function(){var e,o={};for(e in c)o[c[e].id]=c[e].polylinePath,MapComp.createRouteLine({...c[e],index:e});MapComp.fitRoutesOnMap({allLines:o})},s.DeleteAll=function(){s.HideAll(),c=[],MapComp.transitColours.light=[],MapComp.transitColours.dark=[]},s.Delete=function(o){var e=$.grep(c,function(e){return e.pid==o});if(0<e.length){for(var t of e)t.polyline.setMap(null);c=$.grep(c,function(e){return e.pid==o},!0)}},"");return s.MakeActive=function(e){var o,t=(u=e).split(";");for(o in c){var r,n=c[o].polylinePath,i=(c[o].draggableRoutesEnabled=!c[o].isTransit&&"True"===resources.DraggableRoutesEnabled&&Modernizr.mq("(min-width: 992px)"),{zIndex:2,strokeWeight:3.5,strokeColor:c[o].options.defaultStrokeColor,draggable:c[o].draggableRoutesEnabled}),a={zIndex:1,strokeWeight:3,strokeColor:s.getInactiveRouteClr(),draggable:!1};-1<t.indexOf(c[o].pid)?(c[o]={...c[o],isActive:!0,options:{...c[o].options,...i}},MapComp.isLibre&&c[o].draggableRoutesEnabled&&(2==c[o].waypoints.length?(l.adjustMarker(0,n[0][0]-1e-7,n[0][1]),i=n[n.length-1],l.adjustMarker(1,i[0]-1e-7,i[1])):(i=parseInt(c[o].index),r=n[n.length-1],0==i&&l.adjustMarker(i,n[0][0]-1e-7,n[0][1]),l.adjustMarker(i+1,r[0]-1e-7,r[1])))):c[o]={...c[o],isActive:!1,options:{...c[o].options,...a}}}s.ShowAll()},s.repaint=()=>{var t,e;!function(){let o=!0;return c.forEach(e=>{e.isTransit||(o=!1)}),o}()||(e=MapComp.transitColours[MapComp.isDarkMode?"dark":"light"],MapComp.updateTransitColours(c,e),t=e,(e=Array.from(document.querySelectorAll(".directionStep"))).length===t.length?e.forEach((e,o)=>{e.style.borderColor=t[o]}):console.error("could not update Direction Step Line colour")),0!==u.length&&s.MakeActive(u)},s};
MapComp.transitColours={light:[],dark:[]};var TransitDirections=function(u,c,d){function i(t,e,a){if($(d).html(e.summaryHtml),e.polyline&&0<e.polyline.length){for(j=0;j<e.polyline.length;j++)for(s=0;s<e.polyline[j].length;s++){var r=e.polyline[j][s].polyline,o={strokeWeight:4,strokeOpacity:1,strokeColor:"#252525",zIndex:2};e.polyline[j][s].transit_details&&(e.polyline[j][s].line_color&&-1==e.polyline[j][s].line_color.indexOf("#")&&(e.polyline[j][s].line_color="#"+e.polyline[j][s].line_color),o.strokeColor=e.polyline[j][s].line_color||"#00BFFF"),o.strokeColor=(i=void 0,i=function(t){t.startsWith("#")&&(t=t.slice(1));var e=parseInt(t.substring(0,2),16),a=parseInt(t.substring(2,4),16),t=parseInt(t.substring(4,6),16);e=255-e,a=255-a,t=255-t;var r=t=>{t=t.toString(16);return 1===t.length?"0"+t:t};return"#"+r(e)+r(a)+r(t)}(n=o.strokeColor),MapComp.transitColours.light.push(n),MapComp.transitColours.dark.push(i),MapComp.isDarkMode?i:n),p=c.AddRoute(r,null,o,0==j,!0,[e.polyline[j][s].infoWindowInformation],j+1,"here"==e.polyline[j][s].type),a&&!$("#transitRouteTabs").length&&$("#routeTabs a").each(function(){$(this).attr("data-guids",$(this).attr("data-guids")+";"+p)},[p]),$("#transitRouteTabs").length&&(i=$("#transitRouteTabs :nth-child("+(j+1)+") a")).attr("data-guids",p+";"+i.attr("data-guids")),document.getElementsByClassName("directionStep")&&(document.getElementsByClassName("directionStep")[s].style.borderColor=o.strokeColor)}c.ShowAll(),a||g.fitMapToRoute(u.map,t)}var n,i,s,l;for(s in e.enableMapLayers)(l=$("input[type='checkbox'][data-layerid = "+e.enableMapLayers[s]+"]",$("#layerSelection")))&&(l[0].checked=!0);for(s in e.disableMapLayers)(l=$("input[type='checkbox'][data-layerid = "+e.disableMapLayers[s]+"]",$("#layerSelection")))&&(l[0].checked=!1);$("#routeResults").show(),$("#transitRouteTabs").length&&($("#transitRouteTabs a").click(function(t){t.preventDefault(),$(this).tab("show"),c.MakeActive($(this).attr("data-guids")+y("#routeTabs li.active a"))}),$("#transitRouteTabs a:first").tab("show"),c.MakeActive($("#transitRouteTabs a:first").attr("data-guids")+y("#routeTabs li.active a"))),$("#routeResults").scrollTop(0),$("#routeResults").trigger("adjustRoutePlannerHeight"),$(".startPoint").text(e.waypoints[0].nameDirection),$(".endPoint").text(e.waypoints[e.waypoints.length-1].nameDirection),a&&$("#routeTabs a").each(function(){var t,e,a=+$(this).attr("data-travelTimeInSeconds")+ +$("#transitTimeInSeconds").val();$(this).find(".badge").text((a=a,t=Math.floor(a/3600),(e=Math.floor((a-3600*t)/60))<1&&0<a-3600*t-60*e&&(e=1),0<t?t+" "+window.resources.Hr+" "+e+" "+window.resources.Min:e+" "+window.resources.Min))})}var t={},p=null,g=new MapFctns;function y(t){var t=$(t),e="";return e=null!=t&&t.length&&t!=this?";"+t.attr("data-guids"):e}return t.Reset=function(){c.Delete(p),$(d).html(null)},t.Directions=function(r,o,n){$.ajax("/map/GetTransitRoute",{type:"POST",data:{Waypoints:r,travelMode:o.travelMode||o}}).done(function(t){"OK"==t.status?(n?$(document).trigger("driveTransitRouteGenerated-routePlanner",[t]):$(document).trigger("transitRouteGenerated-routePlanner",[t]),i(r,t,n),e={walking:"walking",bicycling:"bicycle",transit:"bus"},(a=document.getElementById("transitRouteResults").getElementsByTagName("i")[0])&&(a.className="far fa-"+e[o.travelMode]+" fa-2x",a.setAttribute("title",e[o.travelMode]))):n?($(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.DriveAndTransitRouteNotAvailable)):"ZERO_RESULTS"==t.status||"NOT_FOUND"==t.status||"PATH_NOT_FOUND"==t.status?($(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.RouteNotAvailable)):"OUTSIDE_BOUNDS"==t.status?($(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.AreaNotCovered)):($(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.ErrorRetrievingYourRoute,RoutePlannerStatus.StatusTypes.danger));var e,a=Array.from(document.getElementsByClassName("substeps"));a.forEach(t=>{arrowDirection.setTransitSubstepImg(t)}),0==a.length&&Array.from(document.getElementsByClassName("directionStep")).forEach(t=>{arrowDirection.setStepImg(t)})}).fail(function(){$(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.ErrorRetrievingYourRoute,RoutePlannerStatus.StatusTypes.danger),loadBlockerApi.hideSpinner("calculateDriveTransitRoute")}).always(function(){loadBlockerApi.hideSpinner("calculateRoute")})},t.SaveRoute=function(t,e){$.ajax("/map/SaveTransitRoute",{type:"POST",data:{Waypoints:t}}).done(function(t){}).fail(function(){$(document).trigger("clearRouteView-routePlanner"),RoutePlannerStatus.updateStatus(window.resources.ErrorRetrievingYourRoute,RoutePlannerStatus.StatusTypes.danger),loadBlockerApi.hideSpinner("calculateDriveTransitRoute")}).always(function(){loadBlockerApi.hideSpinner("calculateRoute")})},t};
var UserRoutePlanner=function(i){function n(){if(window.atisUserRoutes){var e,t=$(".atisUserDdVals");for(e in t.empty(),window.atisUserRoutes)t.append($('<li role="presentation">').append($('<a role="menuitem" tabindex="-1" href="">').attr("data-id",e).text(window.atisUserRoutes[e].routeName)))}$(document).trigger("dropdownPopulated-userRoutePlanner")}var u=null,l=$("#btnSaveRoute"),a=$(".routeName"),d=$("#routeName",a),c=null,r=null,t=null,s=function(){var e=$(".atisUserDd");$(".btn .atisUserDdBtnText",e).text(t).removeAttr("data-id")},o=!1;function p(e){var t;0<$("#btnSaveRoute").length&&(o=e,(t=$("#btnSaveRoute")[0]).disabled=e,t.classList.toggle("disabled",e))}var e,g,R=function(e){null!=e&&0<e.length&&(0<=e.indexOf("-")?(loadBlockerApi.showSpinner("loadSavedRoute"),$.ajax("/Api/Route/GetRouteByShareID?shareId="+e,{type:"POST"}).done(function(e){e?1==e.isTransit?i.displayTransitRoute(e):(i.displayRoute(w(e)),i.redrawWaypoints(!1)):(i.resetRoutePlanner(),RoutePlannerStatus.updateStatus(resources.SorryUnableToFetchRoute))}).fail(function(){RoutePlannerStatus.updateStatus(resources.SorryUnableToFetchRoute)}),loadBlockerApi.hideSpinner("loadSavedRoute")):window.location.href="my511/login?ReturnUrl=/map%23route-"+e)},S=function(e){var t,o=-1;for(t in window.atisUserRoutes=window.atisUserRoutes||[],window.atisUserRoutes)(window.atisUserRoutes[t].shareId==e.shareId||window.atisUserRoutes[t].routeName==e.routeName)&&(window.atisUserRoutes[t]=e,o=t);-1==o&&(window.atisUserRoutes.push(e),o=window.atisUserRoutes.length-1),s(),n(),$('.atisUserDd li a[data-id="'+o+'"]').click()},h=function(e){var t=urlHash.hash();return e||t&&0==t.toLowerCase().lastIndexOf("route-",0)?(t="route-{0}".replace("{0}",e||""),e?urlHash.hash(t):e=(e=urlHash.hash()).substring(e.indexOf("-")+1),e):null},f=function(){if(r&&r.shareId){let e=!1;bootbox.dialog({title:resources.LinkToYourRoute,message:`<input class="form-control linkToRoute" value="${window.location.protocol}//${window.location.host}/map#route-${r.shareId}"/> 
                          <p class="copyRouteLink">${resources.CopyFromBrowserText}</p>
                          <p class="copyRouteLinkFeedback">${resources.LinkCopied}</p>`,buttons:{copyBtn:{label:resources.CopyLink,className:"btn btn-info",callback:function(){return e||(e=!0,navigator.clipboard.writeText(document.querySelector(".linkToRoute").value),$(".copyRouteLinkFeedback").fadeIn(500).delay(500).fadeOut(1e3),setTimeout(()=>{e=!1},2e3)),!1}}}})}else RoutePlannerStatus.updateStatus(resources.SelectRouteFromDropdownText,RoutePlannerStatus.StatusTypes.danger)},m=function(e,t){e.statistics&&e.statistics.date&&new Date-e.statistics.date<6e4?t(e.statistics):$.ajax("/Api/Route/GetUserRouteStatistics?segmentId="+e.segmentId,{type:"POST"}).done(function(e){e.date=new Date,t(e)}).fail(function(){t(null)})},v=function(e){var t,o=null;for(t in window.atisUserRoutes){if(window.atisUserRoutes[t].shareId==e){o=t;break}if(window.atisUserRoutes[t].segmentId==e){o=t;break}}return o},w=function(e){var t={};return t.segmentId=e.segmentId,t.routeName=e.routeName,t.encodedPolyline=e.encodedPolyline,t.includesTollLink=e.includesTollLink,t.includesFerryLink=e.includesFerryLink,t.allLinks=e.allLinks,t.statistics=e.statistics,t.shareId=e.shareId,t.cacheId=e.cacheId,t.instructions=e.instructions,t.saveable=e.saveable,t.waypoints=y(e.encodedMarkers),t},y=function(e){var t=[];if(e){e=JSON.parse(e);for(var o=0;o<e.length;o++){var n=e[o],a={};a.linkId=n.location.LinkId,a.name=a.nameDirection=n.location.Name,a.isForward=n.location.IsForward,a.poiId=n.location.PoiId,a.point={latitude:n.lat,longitude:n.lng},t.push(a)}}return t},I=function(e,t){var o={},n=u;return o.shareId=n.shareId,o.routeName=e,o.fromAddress=n.waypoints[0].name,o.fromLat=n.waypoints[0].point.latitude,o.fromLong=n.waypoints[0].point.longitude,o.toAddress=n.waypoints[n.waypoints.length-1].name,o.toLat=n.waypoints[n.waypoints.length-1].point.latitude,o.toLong=n.waypoints[n.waypoints.length-1].point.longitude,o.options=t,o},k=function(e,t){var o={},t=u[t];return o.cacheId=t.cacheId,o.segmentId=t.segmentId,o.routeName=e,o.encodedPolyline=t.encodedPolyline,o.encodedMarkers=function(e){for(var t=[],o=0;o<e.length;o++){var n=e[o];var a={};var s=o==0?"A":o==e.length-1?"B":"W";a.lat=n.point.latitude;a.lng=n.point.longitude;a.letter=s;a.location={Name:n.nameDirection==null?n.name:n.nameDirection,X:n.point.longitude,Y:n.point.latitude,LinkId:n.linkId,IsForward:n.isForward,Letter:s,PoiId:n.poiId};t.push(a)}return JSON.stringify(t)}(t.waypoints),o.includesTollLink=t.includesTollLink,o.includesFerryLink=t.includesFerryLink,o.lengthMeters=t.statistics.lengthMeters,o.postedTravelTimeSeconds=t.statistics.postedTravelTimeSeconds,o.subscriberRouteId=t.subscriberRouteId,o.shareId=t.shareId,t.statistics.instructions&&(o.instructions=t.statistics.instructions),o.previousTransitShareId=u.shareId,o};if($(document).on("routeCleared-routePlanner.routeSave routingFail-routePlanner.routeSave driveTransitRouteGenerated-routePlanner.routeSave",function(e){r=u=null,a.toggle(!1),l.toggle(!1),d.val(null),s()}),$(document).on("clearRouteButtonClicked",function(e){c=null,p(!1)}),$(document).on("transitRouteGenerated-routePlanner.routeSave",function(e,t){"true"===resources.SaveTransit?(u=t,r&&(u.shareId=r.shareId),c="transit",a.toggle(!0),d.focus(),l.toggle(!0)):(a.toggle(!1),l.toggle(!1))}),$(document).on("routeGenerated-routePlanner.routeSave",function(e,t){var o=null!=u&&u.length&&u[0].segmentId?u[0].segmentId:null;c="drive",u=t,r&&(u.shareId=r.shareId),$(u).each(function(e,t){t.statistics.date=new Date}),o&&$(u).each(function(e,t){t.segmentId=o}),a.toggle(!0),d.focus(),!1===u[0].saveable?(l.toggle(!1),a.toggle(!1)):(l.toggle(!0),a.toggle(!0),d.focus())}),$(document).on("hashChanged-urlHash",function(e,t){var o=h(),n=null;o&&(n=v(o))?($('.atisUserDd li a[data-id="'+n+'"]').click(),l.text(resources.Update)):o&&(R(o),l.text(resources.Save))}),$(document).on("dropdownPopulated-userRoutePlanner",function(){var e=null!=window.atisUserRoutes&&0<window.atisUserRoutes.length;$(".atisUserDd").toggle(e),e&&$(document).trigger("UserRouteDropDownVisible")}),l.on("click.routeSave",function(e){var t=(t=d.val()||"").trim();if(RoutePlannerStatus.updateStatus(),t)if(loadBlockerApi.showSpinner("saveRoute"),"transit"==c){var o="";if("undefined"!=typeof TransitOptions){var n=TransitOptions.GetTransitOptions();try{o=JSON.stringify(n)}catch(e){o=n}}var a=I(t,o);$.ajax("/My511/SaveTransitRoute",{data:a,type:"POST"}).done(function(e){a.shareId=e.shareId,a.isTransit=!0,$(document).one("transitRouteGenerated-routePlanner.routeSave-msg",function(){RoutePlannerStatus.updateStatus(resources.YourRouteHasBeenSaved,RoutePlannerStatus.StatusTypes.success)}),S(a),l.text(resources.Update)}).fail(function(){RoutePlannerStatus.updateStatus(resources.SorryErrorSavingRoute)}).always(function(){loadBlockerApi.hideSpinner("saveRoute")})}else{var s=l.text()===resources.Save,r=i.getActiveRouteIndex(),a=k(t,r);$.ajax("/Api/Route/SaveUserRoute",{data:a,type:"POST"}).done(function(e){a.segmentId=e.segmentId,a.allLinks=e.allLinks,a.statistics=u[r].statistics,a.subscriberRouteId=e.subscriberRouteId,a.shareId=e.shareId,$(document).one("routeGenerated-routePlanner.routeSave-msg",function(){RoutePlannerStatus.updateStatus(resources.YourRouteHasBeenSaved,RoutePlannerStatus.StatusTypes.success,a.subscriberRouteId,s,a.routeName)}),S(a),l.text(resources.Update)}).fail(function(e){if(400==e.status){for(var t="",o=0;o<e.responseJSON.length;o++)t+=e.responseJSON[o].errorMessage+"<br>";RoutePlannerStatus.updateStatus(t)}else RoutePlannerStatus.updateStatus(resources.SorryErrorSavingRoute)}).always(function(){loadBlockerApi.hideSpinner("saveRoute")})}else RoutePlannerStatus.updateStatus(resources.PleaseEnterRouteNameToSave);return!1}),$(".linkRoute").click(f),$(".linkRoute").bind("keydown",function(e){13==e.keyCode&&f()}),document.querySelector("#routeName")){let t=document.querySelector("#statusBar");document.querySelector("#routeName").addEventListener("input",e=>{e.target.value.length>parseInt(resources.RouteNameLengthLimit)&&!o?($("#routeNameTooLong").show(),p(!0)):e.target.value.length<=parseInt(resources.RouteNameLengthLimit)&&o&&($("#routeNameTooLong").hide(),p(!1)),"none"!==t.style.display&&(t.style.display="none")}),document.querySelector(".atisUserDdVals").addEventListener("click",e=>{$("#routeNameTooLong").hide()})}return"undefined"!=typeof TransitOptions&&TransitOptions.init(),l.length&&(l.toggle(!1),a.toggle(!1),d.attr("placeholder",resources.EnterRouteNameToSave),e=$(".atisUserDd"),g=$(".btn .atisUserDdBtnText",e),t=g.text(),e.on("click","li a",function(e){var t,o,n,a=$(this),s=a.attr("data-id");(r=window.atisUserRoutes[s]).isTransit?(t=r.routeName,h((o=r).shareId),i.displayTransitRoute(r),r=o,d.val(t),g.text(a.text()).attr("data-id",s),l.text(resources.Update)):(loadBlockerApi.showSpinner("loadSavedRoute"),n=w(r),m(n,function(e){e?(r.statistics=e,n.statistics=e,i.displayRoute(n),r=window.atisUserRoutes[s],h(n.shareId),setTimeout(function(){g.text(a.text()).attr("data-id",s),u=[n],d.val(n.routeName)},0)):(i.resetRoutePlanner(),RoutePlannerStatus.updateStatus(resources.SorryUnableToFetchRoute)),i.redrawWaypoints(!1),loadBlockerApi.hideSpinner("loadSavedRoute"),l.text(resources.Update)})),e.preventDefault()}),n()),{}};
let addRouteTab = function (route, id, isTransit, hubName, routePolyline) {
    //reference to route statistics.
    let routeStats = route.statistics;
    let useRouteClosureDisclaimer = resources.EnableRouteClosureDisclaimer == "True" && route.statistics.includesClosures;
    let useRouteConditionDisclaimer = resources.EnableRouteConditionDisclaimer == "True" && route.statistics.includesRouteConditions;
    let options = useRouteClosureDisclaimer ? { strokeColor: '#FF0000' } : null;
    //add route polyline.
    let guid = routePolyline.AddRoute(route.encodedPolyline, route.waypoints, options, false, isTransit);

    let fromLocation = '';
    let endLocation = '';
    if (route.waypoints.length > 1) {
        fromLocation = route.waypoints[0].nameDirection;
        endLocation = route.waypoints[route.waypoints.length - 1].nameDirection;
    }

    let withDisclaimerClass = useRouteClosureDisclaimer || useRouteConditionDisclaimer ? 'withDisclaimer' : '';
    //Add the route tab. // We add transit to the beginning of the id so that we don't confuse the tabs when we do drive+transit
    $('#routeTabs').append('<li class=\'routeTabHeader ' + withDisclaimerClass + '\' role=\'presentation\'><a href=\'#' + (isTransit ? 'transit' : '') + 'routeTab-' + id + '\' data-id=\'' + id + '\' data-guids=\'' + guid + '\' data-travelTimeInSeconds=\'' + routeStats.postedTravelTimeSeconds + '\'>' + resources.Route + ' ' + id + '  <span class=\'badge\'>' + routeStats.travelTimeDisplay + '</span></a></li>');
    let html = '';

    if (useRouteClosureDisclaimer || useRouteConditionDisclaimer) {
        //first, we put a notification at the top of the tab.
        html += '<div id="routeIncludesDisclaimerDiv' + id + '" class="alert alert-danger" role="alert">';
        if (useRouteClosureDisclaimer) {
            if (useRouteConditionDisclaimer) {
                html += '<p>' + resources.RouteIncludesClosuresAndConditionsDisclaimer + '</p>';
            } else {
                html += '<p>' + resources.RouteIncludesClosuresDisclaimer + '</p>';
            }
        } else {
            html += '<p>' + resources.RouteIncludesConditionsDisclaimer + '</p>';
        }

        html += '<button id="acceptRouteDisclaimerBtn' + id + '" type="button" class="btn btn-info">' + resources.OK + '</button>'
            + '</div >';

        //then we add a div with opacity over the whole thing
        html += '<div class="hideRouteTab' + id + '" style="opacity: .10;">';
    }

    //Add the route details.
    html += '<div class=\'panel panel-default routeContent ' + withDisclaimerClass + '\'><h3 class=\'printHeader\'>'
        + resources.SiteHeader + ' ' + resources.RouteDetails
        + '</h3><div class=\'panel-body\'><i class=\'far fa-car fa-2x\'></i><span class=\'printToFrom\'>'
        + resources.From
        + ' '
        + fromLocation
        + ' '
        + resources.To
        + ' '
        + endLocation
        + '</span><p><b>'
        + resources.TotalTime
        + ' <span class=\'pull-right\'> '
        + routeStats.travelTimeDisplay + '</span></b><br />';

    html += '<b>' + resources.TotalTravelDistance + ' <span class=\'pull-right\'> ' + routeStats.lengthDisplay + '</span></b></p>';

    // route info msg for Tolls, Ferries and Closures combination
    let text = [];
    if (route.includesTollLink) {
        text.push(resources.Tolls.toLowerCase());
    }
    if (route.includesFerryLink) {
        text.push(resources.Ferries.toLowerCase());
    }

    let infoText = "";
    if (text.length == 2) {
        infoText = text[0] + " " + resources.And + " " + text[1];
    } else if (text.length == 1) {
        infoText = text[0];
    }

    if (text.length > 0) {
        html += '<div class="route-alert"><i class="fas fa-exclamation-triangle" aria-hidden="true"></i> '
            + resources.ThisRouteIncludes + " " + infoText
            + '.</div>';
    }

    html += '</div>';
    html += '<ul class=\'list-group\'>';

    if (hubName) {
        hubName = ' (' + hubName + ')';
    } else {
        hubName = '';
    }

    if (routeStats.instructions) {
        for (let j = 0; j < routeStats.instructions.length; j++) {
            let step = routeStats.instructions[j];
            let arrowImg = arrowDirection.getDriveImg(step.instruction);
            html += '<li class="list-group-item">';
            if (step.linkConditions && step.linkConditions.length > 0) {
                // draw border around RC colors that are hard to see like white. 
                html += '<div class="vLineBorder"></div>';
            }
            html += '<div class="directionArrow">' + arrowImg +
                '</div><div ' + applyWTAStyling(step.linkConditions) +
                '>' + step.instruction +
                linkEventsHtml(step.linkEvents, id, j) +
                linkCamerasHtml(step.linkCameras, id, j) +
                linkWtaHtml(step.linkConditions) +
                '</div></li>';
        }
    } else {
        for (let j = 0; j < routeStats.links.length; j++) {
            if (j == routeStats.links.length - 1) {
                //Last link.
                html += '<li class=\'list-group-item\'><b>' + routeStats.links[j].nameDirection + hubName + '</b><br/>' + routeStats.links[j].travelTimeDisplay + ' (' + routeStats.links[j].lengthDisplay + ')' + linkEventsHtml(routeStats.links[j].linkEvents, id, j) + linkCamerasHtml(routeStats.links[j].linkCameras, id, j) + '</li>';
            } else {
                html += '<li class=\'list-group-item\'><b>' + resources.From + ' ' + routeStats.links[j].nameDirection + ' ' + resources.To + ' ' + routeStats.links[j + 1].nameDirection + '</b><br/>' + routeStats.links[j].travelTimeDisplay + ' (' + routeStats.links[j].lengthDisplay + ')' + linkEventsHtml(routeStats.links[j].linkEvents, id, j) + linkCamerasHtml(routeStats.links[j].linkCameras, id, j) + '</li>';
            }
        }
    }
    html += '</ul></div>';

    if (useRouteClosureDisclaimer || useRouteConditionDisclaimer) {
        html += '</div>'
    }

    let notes;

    if (route.includesFerryLink || resources.OutsideONTTDistanceTravelPortions !== '') {
        notes = `<div class="routeNotes">
                        <p>${resources.Notes}</p>
                        <ul>
                            <li>${resources.AllTravelTimesBasedOnEstimates}</li>
                            ${resources.OutsideONTTDistanceTravelPortions !== '' ? '<li>' + resources.OutsideONTTDistanceTravelPortions + '</li>' : ''}
                            ${route.includesFerryLink ? '<li>' + resources.FerryNote + '</li> ' : ''}   
                        </ul>
                     </div> `;
    } else {
        notes = `<p class="routeNote"><b>${resources.NoteColon}</b> ${resources.AllTravelTimesBasedOnEstimates}</p>`;
    }

    // We add transit to the beginning of the id so that we don't confuse the tabs when we do drive+transit
    $('#routeTabContent').append('<div id="' + (isTransit ? 'transit' : '') + 'routeTab-' + id + '" data-id="' + id + '" class="routeTab tab-pane fade">' + html + notes + '</div>');


    $("#cameraRouteToggle" + id + " , #eventRouteToggle" + id).on("click", function () {
        let id = $(this).data("id");
        $("i[id='" + id + "circle'").toggleClass('fa-plus-circle fa-minus-circle');
        $("div[id='" + id + "div'").toggle(400);
        if (this.className == "eventRouteToggle") {
            let hasShowMore = $(this).parent().find(".showMore").length > 0;
            if (!hasShowMore) {
                checkEventOnRoutePlanner(this);
            }
        }
    });
    $('#acceptRouteDisclaimerBtn' + id).on('click', function () {
        $(".hideRouteTab" + id).css({ "opacity": "1" });
        $("#routeIncludesDisclaimerDiv" + id).hide();
    });
};

let linkCamerasFormat = null;
let linkCamerasHtml = function (cameras, tabId, rowId) {
    if (!cameras || !cameras.length) {
        return '';
    }

    let sectionId = cameras[0].id + tabId + rowId;

    if (!linkCamerasFormat) {
        linkCamerasFormat = '<div class="route-tooltip routeLinkCamera"><p><img src="{IconURL}" alt="{Name}">&nbsp;<a class="Cctv-link" href="#Cameras-{Id}" data-id="{Id}">{Name}</a></p></div>';
    }

    let text = '';
    for (let i in cameras) {
        text += linkCamerasFormat.replaceAll('{Name}', cameras[i].displayName).replaceAll('{Id}', cameras[i].id).replaceAll('{IconURL}', cameras[i].icon.svgUrl);
    }

    if (cameras.length > 1) {
        let prepend = '<div class="cameraRouteSection"><button id="cameraRouteToggle' + tabId + '" class="cameraRouteToggle" data-id="' + sectionId + '" data-toggle="collapse" title="Toggle" aria-expanded="true" class="">' + resources.Cameras + ' <span class="badge">' + cameras.length + '</span><i id="' + sectionId + 'circle" class="far fa-plus-circle"></i></button><div id="' + sectionId + 'div" class="routeCameras" style="display:none;">';
        let append = '</div>';
        text = prepend + text + append;
    }

    return text;
};

let linkEventsFormat = null;
let linkEventsHtml = function (events, tabId, rowId) {
    //no events on this link.
    if (!events || !events.length || typeof SpecialEventData !== 'undefined') {
        return '';
    }

    //if format not yet built.
    if (!linkEventsFormat) {
        let format = '<div class="route-tooltip routeLinkEvent">';
        format += '<button onclick="routeViewOnMap(\'{viewLink}\',\'{layerId}\')" class="routeViewOnMap">' + resources.ViewOnMap + '</button>';
        format += '<h4><img src="{iconUrl}" alt="{heading}">&nbsp;{heading}</h4>';
        format += '<div class="text">';
        format += '{text}';
        format += '</div></div>';

        //set class variable so we do not generate the format string each time.
        linkEventsFormat = format;
    }

    //the text we will return.
    let text = '';

    for (let idx in events) {
        let attrsText = '';

        //build the attributes html.
        for (let infoIdx in events[idx].orderedPiecesOfInfo) {
            if (events[idx].orderedPiecesOfInfo[infoIdx].title == resources.Description) {
                // remove extra spaces
                let content = events[idx].orderedPiecesOfInfo[infoIdx].text.trim().replace(/\s\s+/g, ' ');
                content = content.replace(" .", ".");
                let modHtml = '<div class="shorten">';
                modHtml += content;
                modHtml += '</div>';
                attrsText += linkEventsFormat.replaceAll('{text}', modHtml);
            }
        }

        //build the overall html.
        text += attrsText.replaceAll('{iconUrl}',
            events[idx].icon.svgUrl).replaceAll('{heading}',
                events[idx].heading).replaceAll('{viewLink}',
                    events[idx].urlFriendlyName).replaceAll('{layerId}',
                        events[idx].urlFriendlyName + "-" + events[idx].eventId);
    }

    if (events.length > 1) {
        let sectionId = events[0].eventId + tabId + rowId;
        let prepend = '<div class="eventRouteSection"><button id="eventRouteToggle' + tabId + '" class="eventRouteToggle" data-id="' + sectionId + '" data-toggle="collapse" title="Toggle" aria-expanded="true" class=""> ' + resources.Events + '<span class="badge">' + events.length + '</span><i id="' + sectionId + 'circle" class="far fa-plus-circle"></i></button><div id="' + sectionId + 'div" class="routeEvents" style="display:none;">';
        let append = '</div></div>';
        text = prepend + text + append;
    }

    return text;
};

let linkWtaHtml = function (conditions) {
    if (!conditions || !conditions.length) {
        return '';
    }
    let format = '<div class="route-tooltip routeLinkEvent">';
    format += '<h4><img class="notMarker" src="/Content/Images/ic_wta.svg" alt="' + resources.RoadConditions + '">' + resources.RoadConditions + '</h4>';
    format += '<ul class="wtaInfo">';

    let uniqueList = conditions.reduce(function (result, e1) {
        let matches = result.filter(function (e2) {
            return e1.id == e2.id;
        })
        if (matches.length == 0)
            result.push(e1)
        return result;
    }, []);
    for (const item of uniqueList) {
        format += '<li><span class="wtaDot" style="background-color: ' + item.colour + '" aria-hidden="true"></span>' + item.statusName + '</li>';
    }

    format += '</ul>';
    format += '</div>';

    return format;
};

let applyWTAStyling = function (conditions) {
    let gradient = '';
    if (conditions && conditions.length > 0) {
        let step = Math.round(100 / conditions.length);
        for (let i = 0; i < conditions.length; i++) {
            let current = (step * i);
            gradient += conditions[i].colour + ' ' + current + '%, ' + conditions[i].colour + ' ' + (current + step) + '%';
            if ((i + 1) != conditions.length) {
                gradient += ',';
            }
            else {
                gradient += ', ' + conditions[i].colour + ' 100%'; //double up the last colour, this create a solid line if we only have 1 condition.
            }
        }
        return 'class="instructionText" style ="border-style: solid; border-width: 5px; border-right: 0; margin-left: -15px; margin-top: -10px; margin-bottom: -10px; padding-left: 30px; padding-top: 5px; padding-bottom: 5px; border-image: linear-gradient(to bottom, ' + gradient + ') 1 100%;"';
    } else return 'class="instructionText"';
}

// called on load and resize
let checkEventOnRoutePlanner = function (evt, windowResize) {
    let routeLinkEvents = evt ? $(evt).parent().find(".routeLinkEvent") :
        $(".routeTab:visible .routeLinkEvent");
    routeLinkEvents.each(function () {
        let box = $(this).find(".shorten")[0];
        let showMoreLink = $(this).find(".showMore");
        if (windowResize == "windowResize") {
            if ($(box).hasClass("expanded")) {
                $(box).removeClass("expanded");
            }
            if (showMoreLink) {
                showMoreLink.remove();
            }
        }

        //add a show more button only if needed based on height and it hasn't been added already
        if (box && box.clientHeight < box.scrollHeight && !box.nextElementSibling) {
            $(this).find(".text").append("<button class='showMore'>" + resources.ShowMore + "</button>");
        }
    });
}
