endpoint.setValue always calls changeCallback on its successful completion, with geocoding or without. This allows to decide when to call getRoute entirely from callbacks and event listeners.
94 lines
2.3 KiB
JavaScript
94 lines
2.3 KiB
JavaScript
OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, changeCallback) {
|
|
var endpoint = {};
|
|
|
|
endpoint.marker = L.marker([0, 0], {
|
|
icon: L.icon({
|
|
iconUrl: iconUrl,
|
|
iconSize: [25, 41],
|
|
iconAnchor: [12, 41],
|
|
popupAnchor: [1, -34],
|
|
shadowUrl: OSM.MARKER_SHADOW,
|
|
shadowSize: [41, 41]
|
|
}),
|
|
draggable: true,
|
|
autoPan: true
|
|
});
|
|
|
|
endpoint.marker.on("drag dragend", function (e) {
|
|
var latlng = e.target.getLatLng();
|
|
|
|
setLatLng(latlng);
|
|
setInputValueFromLatLng(latlng);
|
|
endpoint.value = input.val();
|
|
dragCallback(e.type === "drag");
|
|
});
|
|
|
|
input.on("keydown", function () {
|
|
input.removeClass("is-invalid");
|
|
});
|
|
|
|
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, latlng) {
|
|
endpoint.value = value;
|
|
delete endpoint.latlng;
|
|
input.removeClass("is-invalid");
|
|
input.val(value);
|
|
|
|
if (latlng) {
|
|
setLatLng(latlng);
|
|
setInputValueFromLatLng(latlng);
|
|
changeCallback();
|
|
} else {
|
|
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;
|
|
|
|
var viewbox = map.getBounds().toBBoxString(); // <sw lon>,<sw lat>,<ne lon>,<ne lat>
|
|
|
|
$.getJSON(OSM.NOMINATIM_URL + "search?q=" + encodeURIComponent(endpoint.value) + "&format=json&viewbox=" + viewbox, function (json) {
|
|
endpoint.awaitingGeocode = false;
|
|
endpoint.hasGeocode = true;
|
|
if (json.length === 0) {
|
|
input.addClass("is-invalid");
|
|
alert(I18n.t("javascripts.directions.errors.no_place", { place: endpoint.value }));
|
|
return;
|
|
}
|
|
|
|
setLatLng(L.latLng(json[0]));
|
|
|
|
input.val(json[0].display_name);
|
|
|
|
changeCallback();
|
|
});
|
|
};
|
|
|
|
function setLatLng(ll) {
|
|
endpoint.hasGeocode = true;
|
|
endpoint.latlng = ll;
|
|
endpoint.marker
|
|
.setLatLng(ll)
|
|
.addTo(map);
|
|
}
|
|
|
|
function setInputValueFromLatLng(latlng) {
|
|
var precision = OSM.zoomPrecision(map.getZoom());
|
|
|
|
input.val(latlng.lat.toFixed(precision) + ", " + latlng.lng.toFixed(precision));
|
|
}
|
|
|
|
return endpoint;
|
|
};
|