123 lines
4.7 KiB
JavaScript
123 lines
4.7 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();
|
|
};
|