]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/directions-endpoint.js
Move empty value check out of endpoint.getGeocode
[rails.git] / app / assets / javascripts / index / directions-endpoint.js
1 OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, changeCallback) {
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       changeCallback();
46     } else if (endpoint.value) {
47       endpoint.getGeocode();
48     }
49   };
50
51   endpoint.getGeocode = function () {
52     endpoint.awaitingGeocode = true;
53
54     var viewbox = map.getBounds().toBBoxString(); // <sw lon>,<sw lat>,<ne lon>,<ne lat>
55
56     $.getJSON(OSM.NOMINATIM_URL + "search?q=" + encodeURIComponent(endpoint.value) + "&format=json&viewbox=" + viewbox, function (json) {
57       endpoint.awaitingGeocode = false;
58       if (json.length === 0) {
59         input.addClass("is-invalid");
60         alert(I18n.t("javascripts.directions.errors.no_place", { place: endpoint.value }));
61         return;
62       }
63
64       setLatLng(L.latLng(json[0]));
65
66       input.val(json[0].display_name);
67
68       changeCallback();
69     });
70   };
71
72   function setLatLng(ll) {
73     endpoint.latlng = ll;
74     endpoint.marker
75       .setLatLng(ll)
76       .addTo(map);
77   }
78
79   function setInputValueFromLatLng(latlng) {
80     var precision = OSM.zoomPrecision(map.getZoom());
81
82     input.val(latlng.lat.toFixed(precision) + ", " + latlng.lng.toFixed(precision));
83   }
84
85   return endpoint;
86 };