167 lines
5.4 KiB
JavaScript
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();
|
|
};
|