diff --git a/app/assets/javascripts/index/directions.js b/app/assets/javascripts/index/directions.js index ae01cb566f5..82bb7bae1f4 100644 --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@ -71,7 +71,9 @@ OSM.Directions = function (map) { var dragging = (e.type === "drag"); if (dragging && !chosenEngine.draggable) return; if (dragging && awaitingRoute) return; - endpoint.setLatLng(e.target.getLatLng()); + + endpoint.setLatLng(e.target.getLatLng(), true); + dragCallback(dragging); }); @@ -82,17 +84,28 @@ 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, false); }); - endpoint.setValue = function (value, latlng) { + endpoint.setValue = function (value, force_reverse_geocoding, latlng) { + if (!value) { + return; + } + + if (value === endpoint.value) { + endpoint.setLatLng(endpoint.latlng, false); + return; + } + endpoint.value = value; delete endpoint.latlng; input.removeClass("is-invalid"); input.val(value); if (latlng) { - endpoint.setLatLng(latlng); + endpoint.setLatLng(latlng, true); + } else if (!force_reverse_geocoding && endpoint.value.match(/^([+-]?\d+(\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(\.\d*)?)$/)) { + endpoint.setLatLng(L.latLng(endpoint.value.split(/[/,]/)), false); } else { endpoint.getGeocode(); } @@ -118,7 +131,12 @@ OSM.Directions = function (map) { return; } - endpoint.setLatLng(L.latLng(json[0])); + if (endpoint.value.match(/^([+-]?\d+(\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(\.\d*)?)$/)) { + endpoint.setLatLng(L.latLng(endpoint.value.split(/[/,]/)), false); + } else { + endpoint.setLatLng(L.latLng(json[0]), false); + } + endpoint.value = json[0].display_name; input.val(json[0].display_name); @@ -126,9 +144,12 @@ OSM.Directions = function (map) { }); }; - endpoint.setLatLng = function (ll) { - var precision = OSM.zoomPrecision(map.getZoom()); - input.val(ll.lat.toFixed(precision) + ", " + ll.lng.toFixed(precision)); + endpoint.setLatLng = function (ll, populate_input) { + if (populate_input) { + var precision = OSM.zoomPrecision(map.getZoom()); + endpoint.value = ll.lat.toFixed(precision) + ", " + ll.lng.toFixed(precision); + input.val(endpoint.value); + } endpoint.hasGeocode = true; endpoint.latlng = ll; endpoint.marker @@ -246,6 +267,14 @@ OSM.Directions = function (map) { $("#sidebar_content").html("
" + I18n.t("javascripts.directions.errors.no_route") + "
"); } + if (fitRoute) { + var partiallyCombinedBounds = L.latLngBounds(); + partiallyCombinedBounds.extend(L.latLngBounds(o, o)); + partiallyCombinedBounds.extend(L.latLngBounds(d, d)); + + map.fitBounds(partiallyCombinedBounds.pad(0.05)); + } + return; } @@ -254,7 +283,12 @@ OSM.Directions = function (map) { .addTo(map); if (fitRoute) { - map.fitBounds(polyline.getBounds().pad(0.05)); + var fullyCombinedBounds = L.latLngBounds(); + fullyCombinedBounds.extend(polyline.getBounds()); + fullyCombinedBounds.extend(L.latLngBounds(o, o)); + fullyCombinedBounds.extend(L.latLngBounds(d, d)); + + map.fitBounds(fullyCombinedBounds.pad(0.05)); } var distanceText = $("

").append( @@ -385,14 +419,14 @@ OSM.Directions = function (map) { var pt = L.DomEvent.getMousePosition(oe, map.getContainer()); // co-ordinates of the mouse pointer at present pt.y += 20; var ll = map.containerPointToLatLng(pt); - endpoints[type === "from" ? 0 : 1].setLatLng(ll); + endpoints[type === "from" ? 0 : 1].setLatLng(ll, true); getRoute(true, true); }); var params = Qs.parse(location.search.substring(1)), route = (params.route || "").split(";"), - from = route[0] && L.latLng(route[0].split(",")), - to = route[1] && L.latLng(route[1].split(",")); + from = route[0] && L.latLng(route[0].split(/[/,]/)), + to = route[1] && L.latLng(route[1].split(/[/,]/)); if (params.engine) { var engineIndex = findEngine(params.engine); @@ -402,8 +436,10 @@ OSM.Directions = function (map) { } } - endpoints[0].setValue(params.from || "", from); - endpoints[1].setValue(params.to || "", to); + var ll_from_search_form = decodeURIComponent(location.search).match(/^\?from=([+-]?\d+(\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(\.\d*)?)$/); + + endpoints[0].setValue(params.from || "", !ll_from_search_form, from); + endpoints[1].setValue(params.to || "", !ll_from_search_form, to); map.setSidebarOverlaid(!from || !to);