X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/2b252e8337109de714bb8aa38ccf6d46e7686e42..098f8e98f2f6dbb5a3906a2355a244cef9d8b812:/app/assets/javascripts/index/directions.js.erb diff --git a/app/assets/javascripts/index/directions.js.erb b/app/assets/javascripts/index/directions.js.erb index 9c9df6515..faa922635 100644 --- a/app/assets/javascripts/index/directions.js.erb +++ b/app/assets/javascripts/index/directions.js.erb @@ -1,5 +1,5 @@ //= require_self -//= require_tree ./directions_engines +//= require_tree ./directions OSM.Directions = function (map) { var awaitingGeocode; // true if the user has requested a route, but we're waiting on a geocode result @@ -46,15 +46,36 @@ OSM.Directions = function (map) { if (dragging && !chosenEngine.draggable) return; if (dragging && awaitingRoute) return; endpoint.setLatLng(e.target.getLatLng()); - r.requestRoute(!dragging, false); + if (map.hasLayer(polyline)) { + getRoute(); + } }); input.on("change", function (e) { + // make text the same in both text boxes + var value = e.target.value; + endpoint.setValue(value) + }); + + endpoint.setValue = function(value) { + endpoint.value = value; + delete endpoint.latlng; + input.val(value); + endpoint.getGeocode(); + } + + endpoint.getGeocode = function() { + // if no one has entered a value yet, then we can't geocode, so don't + // even try. + if (!endpoint.value) { + return; + } + endpoint.awaitingGeocode = true; - $.getJSON('<%= NOMINATIM_URL %>search?q=' + encodeURIComponent(e.target.value) + '&format=json', function (json) { + $.getJSON(document.location.protocol + '<%= NOMINATIM_URL %>search?q=' + encodeURIComponent(endpoint.value) + '&format=json', function (json) { endpoint.awaitingGeocode = false; - + endpoint.hasGeocode = true; if (json.length == 0) { alert(I18n.t('javascripts.directions.errors.no_place')); return; @@ -69,13 +90,15 @@ OSM.Directions = function (map) { if (awaitingGeocode) { awaitingGeocode = false; - r.requestRoute(true, true); + getRoute(); } }); - }); + } endpoint.setLatLng = function (ll) { - input.val(Math.round(ll.lat * 10000) / 10000 + " " + Math.round(ll.lng * 10000) / 10000); + var precision = OSM.zoomPrecision(map.getZoom()); + input.val(ll.lat.toFixed(precision) + ", " + ll.lng.toFixed(precision)); + endpoint.hasGeocode = true; endpoint.latlng = ll; endpoint.marker .setLatLng(ll) @@ -85,6 +108,16 @@ OSM.Directions = function (map) { return endpoint; } + $(".directions_form a.directions_close").on("click", function(e) { + e.preventDefault(); + var route_from = endpoints[0].value; + if (route_from) { + OSM.router.route("/?query=" + encodeURIComponent(route_from) + OSM.formatHash(map)); + } else { + OSM.router.route("/" + OSM.formatHash(map)); + } + }); + function formatDistance(m) { if (m < 1000) { return Math.round(m) + "m"; @@ -102,109 +135,53 @@ OSM.Directions = function (map) { return h + ":" + (m < 10 ? '0' : '') + m; } - var engines = OSM.Directions.engines; - - engines.sort(function (a, b) { - return I18n.t(a.name) > I18n.t(b.name); - }); - - var select = $('select.routing_engines'); - - for (var i = 0; i < engines.length; i++) { - var engine = engines[i]; - - select.append(""); - - if (engine.name == 'javascripts.directions.engines.osrm_car') { - chosenEngine = engine; - select.val(i); - } + function setEngine(id) { + engines.forEach(function(engine, i) { + if (engine.id == id) { + chosenEngine = engine; + select.val(i); + } + }); } - select.on("change", function (e) { - chosenEngine = engines[e.target.selectedIndex]; - if (map.hasLayer(polyline)) { // and if a route is currently showing, must also refresh, else confusion - r.requestRoute(true, false); + function getRoute() { + // go fetch geocodes for any endpoints which have not already + // been geocoded. + for (var ep_i = 0; ep_i < 2; ++ep_i) { + var endpoint = endpoints[ep_i]; + if (!endpoint.hasGeocode && !endpoint.awaitingGeocode) { + endpoint.getGeocode(); + awaitingGeocode = true; + } } - }); - - $(".get_directions").on("click", function (e) { - e.preventDefault(); - $(".search").hide(); - $(".routing").show(); - $(".search_form input[type='submit']").addClass("routing_submit"); - $(".query_wrapper.routing [name=route_from]").focus(); - - $("#map").on('dragend dragover', function (e) { - e.preventDefault(); - }); - - $("#map").on('drop', function (e) { - e.preventDefault(); - var oe = e.originalEvent; - var id = oe.dataTransfer.getData('id'); - var pt = L.DomEvent.getMousePosition(oe, map.getContainer()); // co-ordinates of the mouse pointer at present - pt.x += Number(oe.dataTransfer.getData('offsetX')); - pt.y += Number(oe.dataTransfer.getData('offsetY')); - var ll = map.containerPointToLatLng(pt); - endpoints[id === 'marker_from' ? 0 : 1].setLatLng(ll); - r.requestRoute(true, false); - }); - - $(".routing_marker").on('dragstart', function (e) { - e.originalEvent.dataTransfer.effectAllowed = 'move'; - e.originalEvent.dataTransfer.setData('id', this.id); - var xo = e.originalEvent.clientX - $(e.target).offset().left; - var yo = e.originalEvent.clientY - $(e.target).offset().top; - e.originalEvent.dataTransfer.setData('offsetX', e.originalEvent.target.width / 2 - xo); - e.originalEvent.dataTransfer.setData('offsetY', e.originalEvent.target.height - yo); - }); - }); - - $(".close_directions").on("click", function (e) { - e.preventDefault(); - $(".search").show(); - $(".routing").hide(); - $(".search_form input[type='submit']").removeClass("routing_submit"); - $("#content").addClass("overlay-sidebar"); - $(".query_wrapper.routing input").val(""); - map - .removeLayer(popup) - .removeLayer(polyline) - .removeLayer(endpoints[0].marker) - .removeLayer(endpoints[1].marker); - endpoints[0].latlng = endpoints[1].latlng = null; - $("#map").off('dragend drop dragover'); - $(".routing_marker").off('dragstart'); - $(".query_wrapper.search [name=query]").focus(); - }); - - var r = {}; - - r.requestRoute = function (isFinal, updateZoom) { if (endpoints[0].awaitingGeocode || endpoints[1].awaitingGeocode) { awaitingGeocode = true; return; } - var origin = endpoints[0].latlng, - destination = endpoints[1].latlng; + var o = endpoints[0].latlng, + d = endpoints[1].latlng; - if (!origin || !destination) { - return; - } + if (!o || !d) return; + $("header").addClass("closed"); - $(".query_wrapper.routing .spinner").show(); - awaitingRoute = true; + var precision = OSM.zoomPrecision(map.getZoom()); - if (updateZoom) { - map.fitBounds(L.latLngBounds(origin, destination).pad(0.05)); - } + OSM.router.replace("/directions?" + querystring.stringify({ + engine: chosenEngine.id, + route: o.lat.toFixed(precision) + ',' + o.lng.toFixed(precision) + ';' + + d.lat.toFixed(precision) + ',' + d.lng.toFixed(precision) + })); - chosenEngine.getRoute(isFinal, [origin, destination], function (err, route) { - awaitingRoute = false; + // copy loading item to sidebar and display it. we copy it, rather than + // 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); - $(".query_wrapper.routing .spinner").hide(); + chosenEngine.getRoute([o, d], function (err, route) { + awaitingRoute = false; if (err) { map.removeLayer(polyline); @@ -220,14 +197,16 @@ OSM.Directions = function (map) { .setLatLngs(route.line) .addTo(map); - $("#content").removeClass("overlay-sidebar"); + if (!dragging) { + map.fitBounds(polyline.getBounds().pad(0.05)); + } - var html = ('

' + + var html = '

' + '' + I18n.t('javascripts.directions.directions') + '

' + I18n.t('javascripts.directions.distance') + ': ' + formatDistance(route.distance) + '. ' + I18n.t('javascripts.directions.time') + ': ' + formatTime(route.time) + '.

' + - '').replace(/~/g, "'"); + '
'; $('#sidebar_content') .html(html); @@ -256,7 +235,7 @@ OSM.Directions = function (map) { } var row = $(""); - row.append(" "); row.append("
"); + row.append("
" + instruction); row.append("" + dist); @@ -281,10 +260,119 @@ OSM.Directions = function (map) { $('#sidebar_content').append('

' + I18n.t('javascripts.directions.instructions.courtesy', {link: chosenEngine.creditline}) + '

'); + + $('#sidebar_content a.geolink').on('click', function(e) { + e.preventDefault(); + map.removeLayer(polyline); + $('#sidebar_content').html(''); + map.setSidebarOverlaid(true); + // TODO: collapse width of sidebar back to previous + }); }); + } + + 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(""); + }); + + setEngine('osrm_car'); + + select.on("change", function (e) { + chosenEngine = engines[e.target.selectedIndex]; + if (map.hasLayer(polyline)) { + getRoute(); + } + }); + + $(".directions_form").on("submit", function(e) { + e.preventDefault(); + getRoute(); + }); + + $(".routing_marker").on('dragstart', function (e) { + e.originalEvent.dataTransfer.effectAllowed = 'move'; + e.originalEvent.dataTransfer.setData('id', this.id); + var xo = e.originalEvent.clientX - $(e.target).offset().left; + var yo = e.originalEvent.clientY - $(e.target).offset().top; + e.originalEvent.dataTransfer.setData('offsetX', e.originalEvent.target.width / 2 - xo); + e.originalEvent.dataTransfer.setData('offsetY', e.originalEvent.target.height - yo); + }); + + var page = {}; + + page.pushstate = page.popstate = function() { + $(".search_form").hide(); + $(".directions_form").show(); + + $("#map").on('dragend dragover', function (e) { + e.preventDefault(); + }); + + $("#map").on('drop', function (e) { + e.preventDefault(); + var oe = e.originalEvent; + var id = oe.dataTransfer.getData('id'); + var pt = L.DomEvent.getMousePosition(oe, map.getContainer()); // co-ordinates of the mouse pointer at present + pt.x += Number(oe.dataTransfer.getData('offsetX')); + pt.y += Number(oe.dataTransfer.getData('offsetY')); + var ll = map.containerPointToLatLng(pt); + endpoints[id === 'marker_from' ? 0 : 1].setLatLng(ll); + getRoute(); + }); + + var params = querystring.parse(location.search.substring(1)), + route = (params.route || '').split(';'); + + if (params.engine) { + setEngine(params.engine); + } + + if (params.from) { + endpoints[0].setValue(params.from); + endpoints[1].setValue(""); + } else { + endpoints[0].setValue(""); + endpoints[1].setValue(""); + } + + var o = route[0] && L.latLng(route[0].split(',')), + d = route[1] && L.latLng(route[1].split(',')); + + if (o) endpoints[0].setLatLng(o); + if (d) endpoints[1].setLatLng(d); + + map.setSidebarOverlaid(!o || !d); + + getRoute(); + }; + + page.load = function() { + page.pushstate(); + }; + + page.unload = function() { + $(".search_form").show(); + $(".directions_form").hide(); + $("#map").off('dragend dragover drop'); + + map + .removeLayer(popup) + .removeLayer(polyline) + .removeLayer(endpoints[0].marker) + .removeLayer(endpoints[1].marker); }; - return r; + return page; }; OSM.Directions.engines = [];