brouter-web/js/control/Export.js
2019-07-20 19:43:07 +02:00

167 lines
5.4 KiB
JavaScript

BR.Export = L.Class.extend({
latLngs: [],
initialize: function(router) {
this.router = router;
this.exportButton = $('#exportButton');
var trackname = (this.trackname = document.getElementById('trackname'));
this.tracknameAllowedChars = BR.conf.tracknameAllowedChars;
if (this.tracknameAllowedChars) {
this.tracknameMessage = document.getElementById(
'trackname-message'
);
var patternRegex = new RegExp(
'[' + this.tracknameAllowedChars + ']+'
);
// warn about special characters getting removed by server quick fix (#194)
trackname.pattern = patternRegex.toString().slice(1, -1);
trackname.addEventListener(
'input',
L.bind(this._validationMessage, this)
);
}
this.exportButton.on('click', L.bind(this._generateTrackname, this));
L.DomUtil.get('submitExport').onclick = L.bind(this._export, this);
this.update([]);
},
update: function(latLngs) {
this.latLngs = latLngs;
if (latLngs.length < 2) {
this.exportButton.addClass('disabled');
} else {
this.exportButton.removeClass('disabled');
}
},
_export: function() {
var exportForm = document.forms['export'];
var format =
exportForm['format'].value ||
$('#export-format input:radio:checked').val();
var name = encodeURIComponent(exportForm['trackname'].value);
var includeWaypoints = exportForm['include-waypoints'].checked;
var uri = this.router.getUrl(
this.latLngs,
format,
name,
includeWaypoints
);
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent(
'click',
true,
true,
window,
0,
0,
0,
0,
0,
false,
false,
false,
false,
0,
null
);
var link = document.createElement('a');
link.href = uri;
link.dispatchEvent(evt);
},
_validationMessage: function() {
var trackname = this.trackname;
var replaceRegex = new RegExp(
'[^' + this.tracknameAllowedChars + ']',
'g'
);
if (trackname.validity.patternMismatch) {
var replaced = trackname.value.replace(replaceRegex, '');
var patternStr = this.tracknameAllowedChars.replace(/\\/g, '');
this.tracknameMessage.textContent =
'[' + patternStr + '] --> ' + replaced;
} else {
this.tracknameMessage.textContent = '';
}
},
_generateTrackname: function() {
var trackname = this.trackname;
this._getCityAtPosition(
this.latLngs[0],
L.bind(function(from) {
this._getCityAtPosition(
this.latLngs[this.latLngs.length - 1],
L.bind(function(to) {
var distance = document.getElementById('distance')
.innerHTML;
if (this.tracknameAllowedChars) {
distance = distance.replace(',', '.'); // temp. fix (#202)
}
if (!from || !to) {
trackname.value = null;
} else if (from === to) {
trackname.value = i18next.t('export.route-loop', {
from: from,
distance: distance
});
} else {
trackname.value = i18next.t(
'export.route-from-to',
{ from: from, to: to, distance: distance }
);
}
if (this.tracknameAllowedChars) {
// temp. fix: replace and remove characters that will get removed by server quick fix (#194)
trackname.value = trackname.value
.replace(/[>)]/g, '')
.replace(/ \(/g, ' - ');
this._validationMessage();
}
}, this)
);
}, this)
);
},
_getCityAtPosition: function(lonlat, cb) {
var url = L.Util.template(
'https://nominatim.openstreetmap.org/reverse?lon={lng}&lat={lat}&format=json',
lonlat
);
BR.Util.get(
url,
L.bind(function(err, response) {
try {
var addr = JSON.parse(response).address;
cb(
addr.village ||
addr.town ||
addr.hamlet ||
addr.city_district ||
addr.city
);
} catch (err) {
BR.message.showError(
'Error getting position city "' + lonlat + '": ' + err
);
return cb(null);
}
})
);
}
});
BR.export = function() {
return new BR.Export();
};