X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/af1397436f0a1fd1c8170e3935a13c3ec51ea948..1f13321a60239881f7016044b79e9a4d58045e30:/app/assets/javascripts/index/directions.js?ds=sidebyside diff --git a/app/assets/javascripts/index/directions.js b/app/assets/javascripts/index/directions.js index 94f9bb1f0..dd408debc 100644 --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@ -4,10 +4,9 @@ OSM.Directions = function (map) { var awaitingGeocode; // true if the user has requested a route, but we're waiting on a geocode result var awaitingRoute; // true if we've asked the engine for a route and are waiting to hear back - 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', @@ -29,6 +28,20 @@ OSM.Directions = function (map) { var expiry = new Date(); expiry.setYear(expiry.getFullYear() + 10); + var engines = OSM.Directions.engines; + + engines.sort(function (a, b) { + a = I18n.t('javascripts.directions.engines.' + a.id); + b = I18n.t('javascripts.directions.engines.' + b.id); + return a.localeCompare(b); + }); + + var select = $('select.routing_engines'); + + engines.forEach(function(engine, i) { + select.append(""); + }); + function Endpoint(input, iconUrl) { var endpoint = {}; @@ -41,30 +54,43 @@ OSM.Directions = function (map) { shadowUrl: OSM.MARKER_SHADOW, shadowSize: [41, 41] }), - draggable: true + draggable: true, + autoPan: true }); endpoint.marker.on('drag dragend', function (e) { - dragging = (e.type === 'drag'); + var dragging = (e.type === 'drag'); if (dragging && !chosenEngine.draggable) return; if (dragging && awaitingRoute) return; endpoint.setLatLng(e.target.getLatLng()); if (map.hasLayer(polyline)) { - getRoute(); + getRoute(false, !dragging); } }); + input.on("keydown", function() { + input.removeClass("error"); + }); + input.on("change", function (e) { + awaitingGeocode = true; + // make text the same in both text boxes var value = e.target.value; endpoint.setValue(value); }); - endpoint.setValue = function(value) { + endpoint.setValue = function(value, latlng) { endpoint.value = value; delete endpoint.latlng; + input.removeClass("error"); input.val(value); - endpoint.getGeocode(); + + if (latlng) { + endpoint.setLatLng(latlng); + } else { + endpoint.getGeocode(); + } }; endpoint.getGeocode = function() { @@ -80,20 +106,18 @@ OSM.Directions = function (map) { endpoint.awaitingGeocode = false; endpoint.hasGeocode = true; if (json.length === 0) { - alert(I18n.t('javascripts.directions.errors.no_place')); + input.addClass("error"); + alert(I18n.t('javascripts.directions.errors.no_place', {place: endpoint.value})); return; } - input.val(json[0].display_name); + endpoint.setLatLng(L.latLng(json[0])); - endpoint.latlng = L.latLng(json[0]); - endpoint.marker - .setLatLng(endpoint.latlng) - .addTo(map); + input.val(json[0].display_name); if (awaitingGeocode) { awaitingGeocode = false; - getRoute(); + getRoute(true, true); } }); }; @@ -111,6 +135,17 @@ OSM.Directions = function (map) { return endpoint; } + $(".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: to.lat + "," + to.lng + ";" + from.lat + "," + from.lng + })); + }); + $(".directions_form .close").on("click", function(e) { e.preventDefault(); var route_from = endpoints[0].value; @@ -138,16 +173,18 @@ OSM.Directions = function (map) { return h + ":" + (m < 10 ? '0' : '') + m; } - function setEngine(id) { - engines.forEach(function(engine, i) { - if (engine.id === id) { - chosenEngine = engine; - select.val(i); - } + function findEngine(id) { + return engines.findIndex(function(engine) { + return engine.id === id; }); } - function getRoute() { + function setEngine(index) { + chosenEngine = engines[index]; + select.val(index); + } + + function getRoute(fitRoute, reportErrors) { // Cancel any route that is already in progress if (awaitingRoute) awaitingRoute.abort(); @@ -191,7 +228,7 @@ OSM.Directions = function (map) { if (err) { map.removeLayer(polyline); - if (!dragging) { + if (reportErrors) { $('#sidebar_content').html('
' + I18n.t('javascripts.directions.errors.no_route') + '
'); } @@ -202,7 +239,7 @@ OSM.Directions = function (map) { .setLatLngs(route.line) .addTo(map); - if (!dragging) { + if (fitRoute) { map.fitBounds(polyline.getBounds().pad(0.05)); } @@ -222,7 +259,6 @@ OSM.Directions = function (map) { .html(html); // Add each row - var cumulative = 0; route.steps.forEach(function (step) { var ll = step[0], direction = step[1], @@ -230,8 +266,6 @@ OSM.Directions = function (map) { dist = step[3], lineseg = step[4]; - cumulative += dist; - if (dist < 5) { dist = ""; } else if (dist < 200) { @@ -281,37 +315,23 @@ OSM.Directions = function (map) { }); } - var engines = OSM.Directions.engines; - - engines.sort(function (a, b) { - a = I18n.t('javascripts.directions.engines.' + a.id); - b = I18n.t('javascripts.directions.engines.' + b.id); - return a.localeCompare(b); - }); - - var select = $('select.routing_engines'); - - engines.forEach(function(engine, i) { - select.append(""); - }); - - var chosenEngineId = $.cookie('_osm_directions_engine'); - if(!chosenEngineId) { - chosenEngineId = 'osrm_car'; + var chosenEngineIndex = findEngine('fossgis_osrm_car'); + if ($.cookie('_osm_directions_engine')) { + chosenEngineIndex = findEngine($.cookie('_osm_directions_engine')); } - setEngine(chosenEngineId); + setEngine(chosenEngineIndex); select.on("change", function (e) { chosenEngine = engines[e.target.selectedIndex]; $.cookie('_osm_directions_engine', chosenEngine.id, { expires: expiry, path: '/' }); if (map.hasLayer(polyline)) { - getRoute(); + getRoute(true, true); } }); $(".directions_form").on("submit", function(e) { e.preventDefault(); - getRoute(); + getRoute(true, true); }); $(".routing_marker").on('dragstart', function (e) { @@ -344,28 +364,28 @@ OSM.Directions = function (map) { pt.y += 20; var ll = map.containerPointToLatLng(pt); endpoints[type === 'from' ? 0 : 1].setLatLng(ll); - getRoute(); + getRoute(true, true); }); var params = querystring.parse(location.search.substring(1)), - route = (params.route || '').split(';'); + route = (params.route || '').split(';'), + from = route[0] && L.latLng(route[0].split(',')), + to = route[1] && L.latLng(route[1].split(',')); if (params.engine) { - setEngine(params.engine); - } + var engineIndex = findEngine(params.engine); - endpoints[0].setValue(params.from || ""); - endpoints[1].setValue(params.to || ""); - - var o = route[0] && L.latLng(route[0].split(',')), - d = route[1] && L.latLng(route[1].split(',')); + if (engineIndex >= 0) { + setEngine(engineIndex); + } + } - if (o) endpoints[0].setLatLng(o); - if (d) endpoints[1].setLatLng(d); + endpoints[0].setValue(params.from || "", from); + endpoints[1].setValue(params.to || "", to); - map.setSidebarOverlaid(!o || !d); + map.setSidebarOverlaid(!from || !to); - getRoute(); + getRoute(true, true); }; page.load = function() {