]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/directions-endpoint.js
Merge remote-tracking branch 'upstream/pull/5082'
[rails.git] / app / assets / javascripts / index / directions-endpoint.js
1 OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, geocodeCallback) {
2   var endpoint = {};
3
4   endpoint.marker = L.marker([0, 0], {
5     icon: L.icon({
6       iconUrl: iconUrl,
7       iconSize: [25, 41],
8       iconAnchor: [12, 41],
9       popupAnchor: [1, -34],
10       shadowUrl: OSM.MARKER_SHADOW,
11       shadowSize: [41, 41]
12     }),
13     draggable: true,
14     autoPan: true
15   });
16
17   endpoint.marker.on("drag dragend", function (e) {
18     var latlng = e.target.getLatLng();
19
20     setLatLng(latlng);
21     setInputValueFromLatLng(latlng);
22     endpoint.value = input.val();
23     dragCallback(e.type === "drag");
24   });
25
26   input.on("keydown", function () {
27     input.removeClass("is-invalid");
28   });
29
30   input.on("change", function (e) {
31     // make text the same in both text boxes
32     var value = e.target.value;
33     endpoint.setValue(value);
34   });
35
36   endpoint.setValue = function (value, latlng) {
37     endpoint.value = value;
38     delete endpoint.latlng;
39     input.removeClass("is-invalid");
40     input.val(value);
41
42     if (latlng) {
43       setLatLng(latlng);
44       setInputValueFromLatLng(latlng);
45     } else {
46       endpoint.getGeocode();
47     }
48   };
49
50   endpoint.getGeocode = function () {
51     // if no one has entered a value yet, then we can't geocode, so don't
52     // even try.
53     if (!endpoint.value) {
54       return;
55     }
56
57     endpoint.awaitingGeocode = true;
58
59     var viewbox = map.getBounds().toBBoxString(); // <sw lon>,<sw lat>,<ne lon>,<ne lat>
60
61     $.getJSON(OSM.NOMINATIM_URL + "search?q=" + encodeURIComponent(endpoint.value) + "&format=json&viewbox=" + viewbox, function (json) {
62       endpoint.awaitingGeocode = false;
63       endpoint.hasGeocode = true;
64       if (json.length === 0) {
65         input.addClass("is-invalid");
66         alert(I18n.t("javascripts.directions.errors.no_place", { place: endpoint.value }));
67         return;
68       }
69
70       setLatLng(L.latLng(json[0]));
71
72       input.val(json[0].display_name);
73
74       geocodeCallback();
75     });
76   };
77
78   function setLatLng(ll) {
79     endpoint.hasGeocode = true;
80     endpoint.latlng = ll;
81     endpoint.marker
82       .setLatLng(ll)
83       .addTo(map);
84   }
85
86   function setInputValueFromLatLng(latlng) {
87     var precision = OSM.zoomPrecision(map.getZoom());
88
89     input.val(latlng.lat.toFixed(precision) + ", " + latlng.lng.toFixed(precision));
90   }
91
92   return endpoint;
93 };