X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/e256c837b56d9f1c40c0c57dd89db4825bc7489e..161ce947c3b753f68f5c6b27fea369d2e2b8c7ea:/app/assets/javascripts/index/directions.js diff --git a/app/assets/javascripts/index/directions.js b/app/assets/javascripts/index/directions.js index 31144a547..165d57f40 100644 --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@ -7,7 +7,7 @@ OSM.Directions = function (map) { var dragging; // true if the user is dragging a start/end point var chosenEngine; - var popup = L.popup(); + var popup = L.popup({autoPanPadding: [100, 100]}); var polyline = L.polyline([], { color: '#03f', @@ -26,6 +26,9 @@ OSM.Directions = function (map) { Endpoint($("input[name='route_to']"), OSM.MARKER_RED) ]; + var expiry = new Date(); + expiry.setYear(expiry.getFullYear() + 10); + function Endpoint(input, iconUrl) { var endpoint = {}; @@ -42,7 +45,7 @@ OSM.Directions = function (map) { }); endpoint.marker.on('drag dragend', function (e) { - dragging = (e.type == 'drag'); + dragging = (e.type === 'drag'); if (dragging && !chosenEngine.draggable) return; if (dragging && awaitingRoute) return; endpoint.setLatLng(e.target.getLatLng()); @@ -54,15 +57,20 @@ OSM.Directions = function (map) { input.on("change", function (e) { // make text the same in both text boxes var value = e.target.value; - endpoint.setValue(value) + endpoint.setValue(value); }); - endpoint.setValue = function(value) { + endpoint.setValue = function(value, latlng) { endpoint.value = value; delete endpoint.latlng; input.val(value); - endpoint.getGeocode(); - } + + if (latlng) { + endpoint.setLatLng(latlng); + } else { + endpoint.getGeocode(); + } + }; endpoint.getGeocode = function() { // if no one has entered a value yet, then we can't geocode, so don't @@ -73,10 +81,10 @@ OSM.Directions = function (map) { endpoint.awaitingGeocode = true; - $.getJSON(document.location.protocol + OSM.NOMINATIM_URL + 'search?q=' + encodeURIComponent(endpoint.value) + '&format=json', function (json) { + $.getJSON(OSM.NOMINATIM_URL + 'search?q=' + encodeURIComponent(endpoint.value) + '&format=json', function (json) { endpoint.awaitingGeocode = false; endpoint.hasGeocode = true; - if (json.length == 0) { + if (json.length === 0) { alert(I18n.t('javascripts.directions.errors.no_place')); return; } @@ -93,7 +101,7 @@ OSM.Directions = function (map) { getRoute(); } }); - } + }; endpoint.setLatLng = function (ll) { var precision = OSM.zoomPrecision(map.getZoom()); @@ -108,7 +116,18 @@ OSM.Directions = function (map) { return endpoint; } - $(".directions_form a.directions_close").on("click", function(e) { + $(".directions_form .reverse_directions").on("click", function() { + var from = endpoints[0].latlng, + to = endpoints[1].latlng; + + OSM.router.route("/directions?" + querystring.stringify({ + from: $("#route_to").val(), + to: $("#route_from").val(), + route: from.lat + "," + from.lng + ";" + to.lat + "," + to.lng + })); + }); + + $(".directions_form .close").on("click", function(e) { e.preventDefault(); var route_from = endpoints[0].value; if (route_from) { @@ -137,7 +156,7 @@ OSM.Directions = function (map) { function setEngine(id) { engines.forEach(function(engine, i) { - if (engine.id == id) { + if (engine.id === id) { chosenEngine = engine; select.val(i); } @@ -145,6 +164,9 @@ OSM.Directions = function (map) { } function getRoute() { + // Cancel any route that is already in progress + if (awaitingRoute) awaitingRoute.abort(); + // go fetch geocodes for any endpoints which have not already // been geocoded. for (var ep_i = 0; ep_i < 2; ++ep_i) { @@ -177,17 +199,16 @@ OSM.Directions = function (map) { // just using it in-place and replacing it in case it has to be used // again. $('#sidebar_content').html($('.directions_form .loader_copy').html()); - awaitingRoute = true; map.setSidebarOverlaid(false); - chosenEngine.getRoute([o, d], function (err, route) { - awaitingRoute = false; + awaitingRoute = chosenEngine.getRoute([o, d], function (err, route) { + awaitingRoute = null; if (err) { map.removeLayer(polyline); if (!dragging) { - alert(I18n.t('javascripts.directions.errors.no_route')); + $('#sidebar_content').html('
' + I18n.t('javascripts.directions.errors.no_route') + '
'); } return; @@ -205,8 +226,13 @@ OSM.Directions = function (map) { '' + I18n.t('javascripts.directions.directions') + '' + I18n.t('javascripts.directions.distance') + ': ' + formatDistance(route.distance) + '. ' + - I18n.t('javascripts.directions.time') + ': ' + formatTime(route.time) + '.
' + - '