From 36ad3fadfaaed6ac49064e4c4d22fefca7342a9d Mon Sep 17 00:00:00 2001 From: wwwouaiebe Date: Thu, 9 Sep 2021 15:41:49 +0200 Subject: [PATCH] v3.0.0 ready --- README.md | 39 +++++++++---------- TravelNotesGuides/README.md | 38 +++++++++--------- TravelNotesGuides/en/InstallationGuideEN.md | 1 + TravelNotesGuides/en/WhatsNew.md | 11 ++++++ TravelNotesGuides/fr/GuideInstallationFR.md | 1 + TravelNotesGuides/fr/QuoiDeNeuf.md | 27 ++++++++++++- buildNumber.json | 2 +- dist/TravelNotes.min.js | 10 ++--- dist/TravelNotesConfig.json | 3 +- .../GraphHopperRouteProvider.min.js | 4 +- .../MapboxRouteProvider.min.js | 4 +- .../MapzenValhallaRouteProvider.min.js | 4 +- .../OSRMRouteProvider.min.js | 4 +- .../OpenRouteServiceRouteProvider.min.js | 4 +- .../PolylineRouteProvider.min.js | 4 +- .../PublicTransportRouteProvider.min.js | 4 +- dist/TravelNotesRoadbook.min.js | 4 +- dist/viewer/TravelNotesConfig.json | 3 +- dist/viewer/TravelNotesViewer.min.js | 6 +-- package.json | 2 +- src/README.md | 19 +++++---- src/cfg/TravelNotesConfig.json | 3 +- src/coreOsmSearch/OsmSearchEngine.js | 36 ++++++++++++++--- src/data/Config.js | 1 + src/data/Version.js | 2 +- 25 files changed, 150 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 25dd7bf0..8d19ef56 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,9 @@ Other samples: The [gh-pages branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages) is the last stable version. This branch contains all the needed files to run Travel & Notes, but not the sources. -### v2.3.0 branch +### v3.0.0 branch -The [v2.3.0 branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v2.3.0) contains the source files of the last stable version. +The [v3.0.0 branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v3.0.0) contains the source files of the last stable version. ### master branch @@ -72,14 +72,13 @@ how to convert files made with an earlier version. Following bugs are corrected: -- Issue #158: when creating a route note from an Osm search result, the distance from the beginning of route is 0 -- Issue #159: When creating a note from an Osm search result, it's needed to verify the address before adding the note or showing the dialog -- Issue #160: noopener noreferrer are added automaticaly when a link is created with target='_blank' -- Issue #162: Zoom on the map is not working when a dialog is displayed. -- Issue #163: svg icons integrated in js files are not displayed correctly ( Chrome ). -- Issue #164: PolylineProvider and PublicTransportProvider crash when selected from the provider toolbar -- Issue #168: RCN REF numbers are difficult to read in the notes icons. Change the color. -- Issue #170: The apps crash when renaming a waypoint and then saving the route before the end of the renaming operation.. +- Issue #179: Reordering the route list with drag and drop don't work when the dragged route is edited. +- Issue #173: Bad message displayed in the console for rel attribute when opening a file + +And following enhancements are done: + +- Issue #175: Private and static fields and methods are coming with next Firefox... +- Issue #173: UUID generator is not rfc 4122 compliant For other versions, see the document ['What's new?' - en ](https://github.com/wwwouaiebe/leaflet.TravelNotes/blob/gh-pages/TravelNotesGuides/en/WhatsNew.md) @@ -137,9 +136,9 @@ D'autres exemples: La [branche gh-pages](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages) est la dernière version stable. Cette branche contient tous les fichiers nécessaires pour utiliser Travel & Notes, mais ne contient pas les sources. -### branche v2.3.0 +### branche v3.0.0 -La [branche v2.3.0](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v2.3.0) contient les sources de la dernière version stable. +La [branche v3.0.0](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v3.0.0) contient les sources de la dernière version stable. ### branche master @@ -155,14 +154,12 @@ comment convertir des fichiers réalisés avec une version antérieure. Les bugs suivants sont corrigés: -- Issue #158: la distance entre une note de trajet et le début du trajet est 0 quand cette note est créée depuis un résultat de recherche dans OpenStreetMap. -- Issue #159: l'adresse doit être vérifiée quand une note est créée depuis un résultat de recherche dans OpenStreetMap. -- Issue #160: noopener noreferrer sont ajoutés automatiquement quand un lien est créé avec target='_blank' -- Issue #162: le zoom ne fonctionne pas quand un dialogue est affiché ( Firefox ). -- Issue #163: les icônes en svg intégrées dans les fichiers JS ne sont pas affichées correctement ( Chrome ). -- Issue #164: polylineProvider et PublicTransportProvider crash quand les providers sont sélectionnés -- Issue #168: La couleur des références RCN-REF est modifiée dans les icônes. -- Issue #170: un crash survient lorsque un trajet édité est sauvé avant qu'un point de passage soit entièrement renommé. -- Issue #171: un message d'erreur est ajouté quand un fichier créé avec une version postérieure à celle utilisée est ouvert. +- Issue #179: Réordonner la liste des routes avec un glisser/déposer ne fonctionne pas quand la route sélectionnée est la route en cours d'édition. +- Issue #173: Un message incorrect pour l'attribut "rel" est affiché dans la console quand un fichier est ouvert. + +Et les améliorations suivantes ont été apportées: + +- Issue #175: Les variables et méthodes Private et static sont disponible dans Firefox. Une grande mise à jour du code a été effectuée. +- Issue #173: Le generateur de UUID ne suit pas la norme publiée dans la rfc 4122. Pour les autres versions, reportez-vous au document ['quoi de neuf?' - fr ](https://github.com/wwwouaiebe/leaflet.TravelNotes/blob/gh-pages/TravelNotesGuides/fr/QuoiDeNeuf.md) diff --git a/TravelNotesGuides/README.md b/TravelNotesGuides/README.md index 09208520..8d19ef56 100644 --- a/TravelNotesGuides/README.md +++ b/TravelNotesGuides/README.md @@ -53,9 +53,9 @@ Other samples: The [gh-pages branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages) is the last stable version. This branch contains all the needed files to run Travel & Notes, but not the sources. -### v2.3.0 branch +### v3.0.0 branch -The [v2.3.0 branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v2.3.0) contains the source files of the last stable version. +The [v3.0.0 branch](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v3.0.0) contains the source files of the last stable version. ### master branch @@ -72,14 +72,13 @@ how to convert files made with an earlier version. Following bugs are corrected: -- Issue #158: when creating a route note from an Osm search result, the distance from the beginning of route is 0 -- Issue #159: When creating a note from an Osm search result, it's needed to verify the address before adding the note or showing the dialog -- Issue #160: noopener noreferrer are added automaticaly when a link is created with target='_blank' -- Issue #162: Zoom on the map is not working when a dialog is displayed. -- Issue #163: svg icons integrated in js files are not displayed correctly ( Chrome ). -- Issue #164: PolylineProvider and PublicTransportProvider crash when selected from the provider toolbar -- Issue #168: RCN REF numbers are difficult to read in the notes icons. Change the color. -- Issue #170: The apps crash when renaming a waypoint and then saving the route before the end of the renaming operation.. +- Issue #179: Reordering the route list with drag and drop don't work when the dragged route is edited. +- Issue #173: Bad message displayed in the console for rel attribute when opening a file + +And following enhancements are done: + +- Issue #175: Private and static fields and methods are coming with next Firefox... +- Issue #173: UUID generator is not rfc 4122 compliant For other versions, see the document ['What's new?' - en ](https://github.com/wwwouaiebe/leaflet.TravelNotes/blob/gh-pages/TravelNotesGuides/en/WhatsNew.md) @@ -137,9 +136,9 @@ D'autres exemples: La [branche gh-pages](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages) est la dernière version stable. Cette branche contient tous les fichiers nécessaires pour utiliser Travel & Notes, mais ne contient pas les sources. -### branche v2.3.0 +### branche v3.0.0 -La [branche v2.3.0](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v2.3.0) contient les sources de la dernière version stable. +La [branche v3.0.0](https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/v3.0.0) contient les sources de la dernière version stable. ### branche master @@ -155,13 +154,12 @@ comment convertir des fichiers réalisés avec une version antérieure. Les bugs suivants sont corrigés: -- Issue #158: la distance entre une note de trajet et le début du trajet est 0 quand cette note est créée depuis un résultat de recherche dans OpenStreetMap. -- Issue #159: l'adresse doit être vérifiée quand une note est créée depuis un résultat de recherche dans OpenStreetMap. -- Issue #160: noopener noreferrer sont ajoutés automatiquement quand un lien est créé avec target='_blank' -- Issue #162: le zoom ne fonctionne pas quand un dialogue est affiché ( Firefox ). -- Issue #163: les icônes en svg intégrées dans les fichiers JS ne sont pas affichées correctement ( Chrome ). -- Issue #164: polylineProvider et PublicTransportProvider crash quand les providers sont sélectionnés -- Issue #168: La couleur des références RCN-REF est modifiée dans les icônes. -- Issue #170: un crash survient lorsque un trajet édité est sauvé avant qu'un point de passage soit entièrement renommé. +- Issue #179: Réordonner la liste des routes avec un glisser/déposer ne fonctionne pas quand la route sélectionnée est la route en cours d'édition. +- Issue #173: Un message incorrect pour l'attribut "rel" est affiché dans la console quand un fichier est ouvert. + +Et les améliorations suivantes ont été apportées: + +- Issue #175: Les variables et méthodes Private et static sont disponible dans Firefox. Une grande mise à jour du code a été effectuée. +- Issue #173: Le generateur de UUID ne suit pas la norme publiée dans la rfc 4122. Pour les autres versions, reportez-vous au document ['quoi de neuf?' - fr ](https://github.com/wwwouaiebe/leaflet.TravelNotes/blob/gh-pages/TravelNotesGuides/fr/QuoiDeNeuf.md) diff --git a/TravelNotesGuides/en/InstallationGuideEN.md b/TravelNotesGuides/en/InstallationGuideEN.md index afe7efff..dac051ab 100644 --- a/TravelNotesGuides/en/InstallationGuideEN.md +++ b/TravelNotesGuides/en/InstallationGuideEN.md @@ -182,6 +182,7 @@ The contents of the TravelNotesConfig.json file: - __osmSearch.searchPointPolyline.fill__ : the filling of the polyline used to indicate on the map the position of a search result when that result is in the form of a polyline ( default value : false ) - __osmSearch.searchPointPolyline.weight__ : the thickness of the polyline used to indicate on the map the position of a search result when that result is in the form of a polyline ( default value : 4 ) - __osmSearch.showSearchNoteDialog__ : when this value is true, the edit notes dialog box is displayed when a note is created from a search result ( default value : false ) +- __overpassApi.useNwr__ : some OverpassAPIOverpassAPI don't know the nwr instruction. When the case, set useNwr = false ( default value: true ) - __overpassApi.timeOut__ : the time that will elapse, in seconds, between the moment when a request to OverpassAPI is launched and when a timeout will be triggered ( default value : 40 ) - __overpassApi.url__ : the url to use for OverpassAPI ( default value : "https://lz4.overpass-api.de/api/interpreter" ) - __printRouteMap.isEnabled__ : when this value is true, the command to print the maps of a route is active ( default value : true ) diff --git a/TravelNotesGuides/en/WhatsNew.md b/TravelNotesGuides/en/WhatsNew.md index 5247a2b9..3af12fa7 100644 --- a/TravelNotesGuides/en/WhatsNew.md +++ b/TravelNotesGuides/en/WhatsNew.md @@ -124,3 +124,14 @@ Following bugs are corrected: - Issue #168: RCN REF numbers are difficult to read in the notes icons. Change the color. - Issue #170: The apps crash when renaming a waypoint and then saving the route before the end of the renaming operation.. +### What's new in release 3.0.0 + +Following bugs are corrected: + +- Issue #179: Reordering the route list with drag and drop don't work when the dragged route is edited. +- Issue #173: Bad message displayed in the console for rel attribute when opening a file + +And following enhancements are done: + +- Issue #175: Private and static fields and methods are coming with next Firefox... +- Issue #173: UUID generator is not rfc 4122 compliant diff --git a/TravelNotesGuides/fr/GuideInstallationFR.md b/TravelNotesGuides/fr/GuideInstallationFR.md index 03e53ca7..4c88c059 100644 --- a/TravelNotesGuides/fr/GuideInstallationFR.md +++ b/TravelNotesGuides/fr/GuideInstallationFR.md @@ -182,6 +182,7 @@ Le contenu du fichier TravelNotesConfig.json: - __osmSearch.searchPointPolyline.fill__ : le remplissage de la polyline utilisée pour indiquer sur la carte la position d'un résultat de recherche lorsque ce résultat est sous forme de polyline ( valeur par défaut : false ) - __osmSearch.searchPointPolyline.weight__ : l'épaisseur de la polyline utilisée pour indiquer sur la carte la position d'un résultat de recherche lorsque ce résultat est sous forme de polyline ( valeur par défaut : 4 ) - __osmSearch.showSearchNoteDialog__ : quand cette valeur est true, la boite de dialogue d'édition des notes est affichée lorsqu'une note est créée à partir d'un résultat de recherche ( valeur par défaut : false ) +- __overpassApi.useNwr__ : certaines instances de OverpassAPI ne connaissent pas l'instruction nwr. Dans ce cas il faut mettre useNwr = false ( valeur par defaut: true ) - __overpassApi.timeOut__ : le temps qui va s'écouler, en secondes, entre le moment où une requête vers OverpassAPI est lancée et celui où un timeout sera déclenché ( valeur par défaut : 40 ) - __overpassApi.url__ : l'url à utiliser pour OverpassAPI ( valeur par défaut : "https://lz4.overpass-api.de/api/interpreter" ) - __printRouteMap.isEnabled__ : quand cette valeur est true, la commande pour imprimer les cartes d'un trajet est active ( valeur par défaut : true ) diff --git a/TravelNotesGuides/fr/QuoiDeNeuf.md b/TravelNotesGuides/fr/QuoiDeNeuf.md index a9f36b14..1e844391 100644 --- a/TravelNotesGuides/fr/QuoiDeNeuf.md +++ b/TravelNotesGuides/fr/QuoiDeNeuf.md @@ -113,4 +113,29 @@ trajet et/ou SANS les manoeuvres. Cette commande permet d'avoir un fichier beauc - il est possible de faire des zooms et des pans sur la carte quand un dialogue est affiché. - il est possible d'utiliser le clavier pour les commandes du viewer. Voir le [guide pour les utilisateurs - fr ](https://github.com/wwwouaiebe/leaflet.TravelNotes/blob/gh-pages/TravelNotesGuides/fr/GuideUtilisateurFR.md#Viewer) -- et de nombreuses modifications purement techniques ainsi qie la correction de nombreux petits bugs. \ No newline at end of file +- et de nombreuses modifications purement techniques ainsi qie la correction de nombreux petits bugs. + +### Quoi de neuf dans la version 2.3.0 + +Les bugs suivants sont corrigés: + +- Issue #158: la distance entre une note de trajet et le début du trajet est 0 quand cette note est créée depuis un résultat de recherche dans OpenStreetMap. +- Issue #159: l'adresse doit être vérifiée quand une note est créée depuis un résultat de recherche dans OpenStreetMap. +- Issue #160: noopener noreferrer sont ajoutés automatiquement quand un lien est créé avec target='_blank' +- Issue #162: le zoom ne fonctionne pas quand un dialogue est affiché ( Firefox ). +- Issue #163: les icônes en svg intégrées dans les fichiers JS ne sont pas affichées correctement ( Chrome ). +- Issue #164: polylineProvider et PublicTransportProvider crash quand les providers sont sélectionnés +- Issue #168: La couleur des références RCN-REF est modifiée dans les icônes. +- Issue #170: un crash survient lorsque un trajet édité est sauvé avant qu'un point de passage soit entièrement renommé. + +### Quoi de neuf dans la version 3.0.0 + +Les bugs suivants sont corrigés: + +- Issue #179: Réordonner la liste des routes avec un glisser/déposer ne fonctionne pas quand la route sélectionnée est la route en cours d'édition. +- Issue #173: Un message incorrect pour l'attribut "rel" est affiché dans la console quand un fichier est ouvert. + +Et les améliorations suivantes ont été apportées: + +- Issue #175: Les variables et méthodes Private et static sont disponible dans Firefox. Une grande mise à jour du code a été effectuée. +- Issue #173: Le generateur de UUID ne suit pas la norme publiée dans la rfc 4122. diff --git a/buildNumber.json b/buildNumber.json index 91bb93b6..54c7b848 100644 --- a/buildNumber.json +++ b/buildNumber.json @@ -1 +1 @@ -{ "buildNumber" : "02778"} \ No newline at end of file +{ "buildNumber" : "02783"} \ No newline at end of file diff --git a/dist/TravelNotes.min.js b/dist/TravelNotes.min.js index 8bcf3f96..d006b52f 100644 --- a/dist/TravelNotes.min.js +++ b/dist/TravelNotes.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 @@ -41,7 +41,7 @@ @private @------------------------------------------------------------------------------------------------------------------------------ - */let e={APIKeys:{saveToSessionStorage:!0},APIKeysDialog:{haveUnsecureButtons:!0,showAPIKeys:!0,showButton:!0},contextMenu:{timeout:1500},errorsUI:{helpTimeOut:3e4,showError:!0,showHelp:!0,showInfo:!0,showWarning:!0,timeOut:1e4},geoCoder:{distances:{city:1200,hamlet:200,town:1500,village:400},osmCityAdminLevel:{DEFAULT:"8",GB:"10"}},geoLocation:{marker:{color:"#ff0000",radius:11},options:{enableHighAccuracy:!1,maximumAge:0,timeout:1/0},zoomFactor:17,zoomToPosition:!0},itineraryPaneUI:{showManeuvers:!1,showNotes:!0},itineraryPoint:{marker:{color:"#ff0000",fill:!1,radius:7,weight:2},zoomFactor:17},layersToolbarUI:{haveLayersToolbarUI:!0,toolbarTimeOut:1500,theDevil:{addButton:!1}},map:{center:{lat:50.50923,lng:5.49542},zoom:12},mouseUI:{haveMouseUI:!0},nominatim:{url:"https://nominatim.openstreetmap.org/",language:"*"},note:{grip:{size:10,opacity:0,moveOpacity:1},haveBackground:!1,maxManeuversNotes:100,polyline:{color:"#808080",weight:1},reverseGeocoding:!1,svgIcon:{angleDistance:10,angleDirection:{right:35,slightRight:80,continue:100,slightLeft:145,left:200,sharpLeft:270,sharpRight:340},rcnRefDistance:20,roadbookFactor:1,zoom:17}},noteDialog:{areaHeight:{icon:2,popupContent:8},mask:{iconsDimension:!0,iconTextArea:!1,tooltip:!1,popupContent:!1,address:!1,link:!1,phone:!0},theDevil:{addButton:!1,zoomFactor:17}},osmSearch:{nextSearchLimit:{color:"#ff0000",fill:!1,weight:1},previousSearchLimit:{color:"#006400",fill:!1,weight:1},searchPointMarker:{color:"#006400",fill:!1,radius:20,weight:4},searchPointPolyline:{color:"#006400",fill:!1,weight:4},showSearchNoteDialog:!1},overpassApi:{timeOut:40,url:"https://lz4.overpass-api.de/api/interpreter"},printRouteMap:{isEnabled:!0,maxTiles:240,paperWidth:287,paperHeight:200,pageBreak:!1,printNotes:!0,borderWidth:30,zoomFactor:15,entryPointMarker:{color:"#00ff00",weight:4,radius:10,fill:!0,fillOpacity:1},exitPointMarker:{color:"#ff0000",weight:4,radius:10,fill:!0,fillOpacity:1}},route:{color:"#ff0000",dashArray:0,dashChoices:[{text:"——————",iDashArray:[0]},{text:"— — — — —",iDashArray:[4,2]},{text:"—‧—‧—‧—‧—",iDashArray:[4,2,0,2]},{text:"················",iDashArray:[0,2]}],elev:{smooth:!0,smoothCoefficient:.25,smoothPoints:3},showDragTooltip:3,width:3},routeEditor:{showEditedRouteInRoadbook:!0},travelEditor:{startMinimized:!0,startupRouteEdition:!0,timeout:1e3},travelNotes:{autoLoad:!0,haveBeforeUnloadWarning:!0,language:"fr"},travelNotesToolbarUI:{contactMail:{url:"https://github.com/wwwouaiebe/leaflet.TravelNotes/issues"}},wayPoint:{reverseGeocoding:!1,geocodingIncludeName:!1}}; + */let e={APIKeys:{saveToSessionStorage:!0},APIKeysDialog:{haveUnsecureButtons:!0,showAPIKeys:!0,showButton:!0},contextMenu:{timeout:1500},errorsUI:{helpTimeOut:3e4,showError:!0,showHelp:!0,showInfo:!0,showWarning:!0,timeOut:1e4},geoCoder:{distances:{city:1200,hamlet:200,town:1500,village:400},osmCityAdminLevel:{DEFAULT:"8",GB:"10"}},geoLocation:{marker:{color:"#ff0000",radius:11},options:{enableHighAccuracy:!1,maximumAge:0,timeout:1/0},zoomFactor:17,zoomToPosition:!0},itineraryPaneUI:{showManeuvers:!1,showNotes:!0},itineraryPoint:{marker:{color:"#ff0000",fill:!1,radius:7,weight:2},zoomFactor:17},layersToolbarUI:{haveLayersToolbarUI:!0,toolbarTimeOut:1500,theDevil:{addButton:!1}},map:{center:{lat:50.50923,lng:5.49542},zoom:12},mouseUI:{haveMouseUI:!0},nominatim:{url:"https://nominatim.openstreetmap.org/",language:"*"},note:{grip:{size:10,opacity:0,moveOpacity:1},haveBackground:!1,maxManeuversNotes:100,polyline:{color:"#808080",weight:1},reverseGeocoding:!1,svgIcon:{angleDistance:10,angleDirection:{right:35,slightRight:80,continue:100,slightLeft:145,left:200,sharpLeft:270,sharpRight:340},rcnRefDistance:20,roadbookFactor:1,zoom:17}},noteDialog:{areaHeight:{icon:2,popupContent:8},mask:{iconsDimension:!0,iconTextArea:!1,tooltip:!1,popupContent:!1,address:!1,link:!1,phone:!0},theDevil:{addButton:!1,zoomFactor:17}},osmSearch:{nextSearchLimit:{color:"#ff0000",fill:!1,weight:1},previousSearchLimit:{color:"#006400",fill:!1,weight:1},searchPointMarker:{color:"#006400",fill:!1,radius:20,weight:4},searchPointPolyline:{color:"#006400",fill:!1,weight:4},showSearchNoteDialog:!1},overpassApi:{useNwr:!0,timeOut:40,url:"https://lz4.overpass-api.de/api/interpreter"},printRouteMap:{isEnabled:!0,maxTiles:240,paperWidth:287,paperHeight:200,pageBreak:!1,printNotes:!0,borderWidth:30,zoomFactor:15,entryPointMarker:{color:"#00ff00",weight:4,radius:10,fill:!0,fillOpacity:1},exitPointMarker:{color:"#ff0000",weight:4,radius:10,fill:!0,fillOpacity:1}},route:{color:"#ff0000",dashArray:0,dashChoices:[{text:"——————",iDashArray:[0]},{text:"— — — — —",iDashArray:[4,2]},{text:"—‧—‧—‧—‧—",iDashArray:[4,2,0,2]},{text:"················",iDashArray:[0,2]}],elev:{smooth:!0,smoothCoefficient:.25,smoothPoints:3},showDragTooltip:3,width:3},routeEditor:{showEditedRouteInRoadbook:!0},travelEditor:{startMinimized:!0,startupRouteEdition:!0,timeout:1e3},travelNotes:{autoLoad:!0,haveBeforeUnloadWarning:!0,language:"fr"},travelNotesToolbarUI:{contactMail:{url:"https://github.com/wwwouaiebe/leaflet.TravelNotes/issues"}},wayPoint:{reverseGeocoding:!1,geocodingIncludeName:!1}}; /** @------------------------------------------------------------------------------------------------------------------------------ @@ -61,7 +61,7 @@ @private @------------------------------------------------------------------------------------------------------------------------------ - */const T="2.3.0",D="v3.0.0-RC1";class E{_objTypeName="";_validObjTypeNames=["Itinerary","ItineraryPoint","Maneuver","Note","Route","Travel","WayPoint"];constructor(e){if(p===this._validObjTypeNames.indexOf(e))throw new Error("Invalid ObjType name : "+e);this._objTypeName=e}get name(){return this._objTypeName}get version(){return T}get jsonObject(){return{name:this._objTypeName,version:T}}validate(e){if(!Object.getOwnPropertyNames(e).includes("name"))throw new Error("No name for "+this._objTypeName);if(this._objTypeName!==e.name)throw new Error("Invalid name for "+this._objTypeName);if(!Object.getOwnPropertyNames(e).includes("version"))throw new Error("No version for "+this._objTypeName)}}class f{_collection=null;_index=p;constructor(e){this._collection=e}get value(){return this._index=this._index?null:this._collection.at(this._index-1)}get next(){return this._index=this._collection.length}get first(){return 0===this._index}get last(){return this._index>=this._collection.length-1}get index(){return this._index}}class N{_array=[];_objName="";_classCollection=null;_indexOfObjId(e){return this._array.findIndex((t=>t.objId===e))}_nextOrPrevious(e,t,o){let n=this._indexOfObjId(e);if(p===n)throw new Error("invalid objId for next or previous function");if(1!==o&&-1!==o)throw new Error("invalid direction");let a=t;for(a||(a=()=>!0),n+=o;pp?this._array[e]:null}forEach(e){let t=null,o=this.iterator;for(;!o.done;)t=e(o.value,t);return t}getAt(e){let t=this._indexOfObjId(e);return p===t?null:this._array[t]}moveTo(e,t,o){let n=this._indexOfObjId(e),a=this._indexOfObjId(t);if(p===n||p===a)throw new Error("invalid objId for function myMoveTo");o||a++,this._array.splice(a,0,this._array[n]),a{t=new this._classCollection,t.jsonObject=e,this.add(t)}))}}const x=Object.freeze(new class{_validityMap=new Map;_parser=new DOMParser;_addHtmlEntities(e){return e.replaceAll(//g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}_stringify(e){let t="",o="",n=e.childNodes;for(let a=0;a{if(e)n.hasAttributeNS(null,a)&&(t+=" "+a+'="'+this._addHtmlEntities(n.getAttribute(a))+'"',n.removeAttribute(a));else if(n.hasAttribute(a))if("href"===a||"src"===a){let e=this.sanitizeToUrl(n.getAttribute(a),a).url;""===e?o+="\nAn invalid url ("+n.getAttribute(a)+") was removed from a "+a+" attribute":t+=" "+a+'="'+e+'"',n.removeAttribute(a)}else t+=" "+a+'="'+this._addHtmlEntities(n.getAttribute(a))+'"',n.removeAttribute(a)})),t+=">";let a="",r="";[a,r]=this._stringify(n),t+=a,o+=r,t+=""}else"#text"===s?t+=this._addHtmlEntities(n.nodeValue):o+="\nAn invalid tag "+s+" was removed";if(n.hasAttributes)for(let e=0;e{if(e)o.hasAttributeNS(null,t)&&(n.setAttributeNS(null,t,o.getAttribute(t)),o.removeAttributeNS(null,t));else if(o.hasAttribute(t))if("href"===t||"src"===t){let e=this.sanitizeToUrl(o.getAttribute(t),t).url;""!==e&&n.setAttribute(t,e)}else n.setAttribute(t,o.getAttribute(t))})),o.hasAttribute("style")){o.getAttribute("style").split(";").forEach((e=>{let t=e.split(":");2!==t.length||"width"!==t[0].trim()&&"height"!==t[0].trim()||(n.style[t[0].trim()]=t[1].trim())}))}o.hasAttribute("target")&&n.setAttribute("rel","noopener noreferrer"),t.appendChild(n),this._cloneNode(o,n)}else"#text"===a&&t.appendChild(document.createTextNode(o.nodeValue))}}constructor(){this._validityMap.set("a",["href","target"]),this._validityMap.set("div",[]),this._validityMap.set("del",[]),this._validityMap.set("em",[]),this._validityMap.set("figcaption",[]),this._validityMap.set("figure",[]),this._validityMap.set("h1",[]),this._validityMap.set("h2",[]),this._validityMap.set("h3",[]),this._validityMap.set("h4",[]),this._validityMap.set("h5",[]),this._validityMap.set("h6",[]),this._validityMap.set("hr",[]),this._validityMap.set("img",["src","alt","width","height"]),this._validityMap.set("ins",[]),this._validityMap.set("li",[]),this._validityMap.set("mark",[]),this._validityMap.set("ol",[]),this._validityMap.set("p",[]),this._validityMap.set("s",[]),this._validityMap.set("small",[]),this._validityMap.set("strong",[]),this._validityMap.set("span",[]),this._validityMap.set("sub",[]),this._validityMap.set("sup",[]),this._validityMap.set("ul",[]),this._validityMap.set("svg",["xmlns","viewBox","class"]),this._validityMap.set("text",["x","y","text-anchor"]),this._validityMap.set("polyline",["points","class","transform"])}sanitizeToColor(e){let t=e.match(/^\u0023[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t="href"){let o=this._parser.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let n=o.body.firstChild,a="";for(let e=0;e/g,"").replaceAll(/"/g,"").replaceAll(/\u0027/g,"").replaceAll(/</g,"").replaceAll(/>/g,"").replaceAll(/"/g,"").replaceAll(/'/g,"").replaceAll(/%3C/g,"").replaceAll(/%3c/g,"").replaceAll(/%3E/g,"").replaceAll(/%3e/g,"").replaceAll(/%22/g,"").replaceAll(/%27/g,""),a!==e)return{url:"",errorsString:"Invalid characters found in the url"};let s=["https:"];if("http:"!==window.location.protocol&&"href"!==t||s.push("http:"),"href"===t){s.push("mailto:"),s.push("sms:"),s.push("tel:");let e=a.match(/^\u0023\w*/);if(e&&a===e[0])return{url:a,errorsString:""}}"src"===t&&s.push("data:");let i=null;try{i=new URL(a)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(p===s.indexOf(i.protocol))return{url:"",errorsString:"Invalid protocol "+i.protocol};if(p!==["sms:","tel:"].indexOf(i.protocol)&&i.pathname.match(/^\+[0-9,*,\u0023]*$/))return{url:a,errorsString:""};try{encodeURIComponent(i.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:a,errorsString:""}}sanitizeToJsString(e){let t=this._parser.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.body.firstChild,n="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),n}sanitizeToHtmlElement(e,t){let o=this._parser.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?this._cloneNode(o.body.firstChild,t):t.textContent=""}clone(e){let t=document.createElement(e.tagName);return this._cloneNode(e,t),t}sanitizeToHtmlString(e){let t="",o="",n=this._parser.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return n&&"#document"===n.nodeName?([t,o]=this._stringify(n.body.firstChild,o),{htmlString:t,errorsString:o}):{htmlString:"",errorsString:"Parsing error"}}});const M=new class{_translations=new Map;constructor(){}setTranslations(e){e.forEach((e=>this._translations.set(e.msgid,x.sanitizeToJsString(e.msgstr))))}getText(e,t){let o=this._translations.get(e);return t&&o&&Object.getOwnPropertyNames(t).forEach((e=>o=o.replace("{"+e+"}",t[e]))),o||e}};const P=new class{constructor(){}get UUID(){let e=new Uint8Array(16);const t=["","","","-","","-","","-","","-","","","","","",""];window.crypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;let o="";for(let n=0;n<16;n++)o+=e[n].toString(m).padStart(2,"0")+t[n];return o}storageAvailable(e){try{let t=window[e],o="__storage_test__";return t.setItem(o,o),t.removeItem(o),!0}catch(e){return!1}}openFile(e,t){let o=document.createElement("input");o.type="file",t&&(o.accept=t),o.addEventListener("change",e,!1),o.click()}saveFile(e,t,o){try{let n=null;n=o?window.URL.createObjectURL(new File([t],e,{type:o})):URL.createObjectURL(t);let a=document.createElement("a");a.setAttribute("href",n),a.setAttribute("download",e),a.click(),window.URL.revokeObjectURL(n)}catch(e){e instanceof Error&&console.error(e)}}formatTime(e){let t=Math.floor(e);if(0===t)return"";let o=Math.floor(t/86400),n=Math.floor(t%86400/3600),a=Math.floor(t%3600/60),s=Math.floor(t%60);return 0=t?"0 km":Math.floor(t/n.metersInKm)+","+Math.floor(t%n.metersInKm/10).toFixed(0).padStart(2,"0").padEnd(3,"0")+" km"}formatLat(e){return e>0?e.toFixed(r.fixed)+" N":(-e).toFixed(r.fixed)+" S"}formatLng(e){return e>0?e.toFixed(r.fixed)+" E":(-e).toFixed(r.fixed)+" W"}formatLatLng(e){return 0===e[0]&&0===e[1]?"":this.formatLat(e[0])+" - "+this.formatLng(e[1])}},C=new E("WayPoint");class j{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":e.address=e.name,e.name="";case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+C.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+C.name);C.validate(e.objType),C.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["address","name","lat","lng","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+C.name)})),e}constructor(){this.name="",this.address="",this.lat=r.defaultValue,this.lng=r.defaultValue,this._objId=L.nextObjId}get fullName(){let e=""===this.name?this.address:this.name+", "+this.address;return""===e&&(e=P.formatLatLng([this.lat,this.lng])),e}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objId(){return this._objId}get objType(){return C}get jsonObject(){return{name:this.name,address:this.address,lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),objId:this._objId,objType:C.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.address=t.address||"",this.name=t.name||"",this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.address?this.address=x.sanitizeToJsString(this.address):this.address="","string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="","number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue)}}const A=new E("ItineraryPoint");class S{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":e.elev=i.defaultValue;case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+A.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+A.name);A.validate(e.objType),A.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["lat","lng","distance","elev","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+A.name)})),e}constructor(){this.lat=r.defaultValue,this.lng=r.defaultValue,this.distance=n.defaultValue,this.elev=i.defaultValue,this._objId=L.nextObjId}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return A}get objId(){return this._objId}get jsonObject(){return{lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),distance:parseFloat(this.distance.toFixed(n.fixed)),elev:parseFloat(this.elev.toFixed(i.fixed)),objId:this._objId,objType:A.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this.distance=t.distance||n.defaultValue,this.elev=t.elev||i.defaultValue,this._objId=L.nextObjId,this.validateData()}validateData(){"number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue),"number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.elev&&(this.elev=i.defaultValue)}}const O=new E("Maneuver");class k{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":"kArriveDefault"===e.iconName&&(e.distance=n.defaultValue);case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+O.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+O.name);O.validate(e.objType),O.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["iconName","instruction","distance","duration","itineraryPointObjId","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+O.name)})),e}constructor(){this.iconName="",this.instruction="",this.itineraryPointObjId=_,this.distance=n.defaultValue,this.duration=n.defaultValue,this._objId=L.nextObjId}get objType(){return O}get objId(){return this._objId}get jsonObject(){return{iconName:this.iconName,instruction:this.instruction,distance:parseFloat(this.distance.toFixed(n.fixed)),duration:this.duration,itineraryPointObjId:this.itineraryPointObjId,objId:this._objId,objType:O.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.iconName=t.iconName||"",this.instruction=t.instruction||"",this.distance=t.distance||n.defaultValue,this.duration=t.duration||n.defaultValue,this.itineraryPointObjId=t.itineraryPointObjId||_,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.iconName?this.iconName=x.sanitizeToJsString(this.iconName):this.iconName="","string"==typeof this.instruction?this.instruction=x.sanitizeToJsString(this.instruction):this.instruction="","number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.duration&&(this.duration=n.defaultValue),"number"!=typeof this.itineraryPointObjId&&(this.itineraryPointObjId=_)}}const R=new E("Itinerary");class H{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":e.hasProfile=!1,e.ascent=0,e.descent=0;case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+R.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+R.name);R.validate(e.objType),R.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["hasProfile","ascent","descent","itineraryPoints","maneuvers","provider","transitMode","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+R.name)})),e}constructor(){this.hasProfile=!1,this.ascent=0,this.descent=0,this.provider="",this.transitMode="",this.itineraryPoints=new N(S),this.maneuvers=new N(k),this._objId=L.nextObjId}get objType(){return R}get objId(){return this._objId}get jsonObject(){return{hasProfile:this.hasProfile,ascent:this.ascent,descent:this.descent,itineraryPoints:this.itineraryPoints.jsonObject,maneuvers:this.maneuvers.jsonObject,provider:this.provider,transitMode:this.transitMode,objId:this._objId,objType:R.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.hasProfile=t.hasProfile||!1,this.ascent=t.ascent||0,this.descent=t.descent||0,this.itineraryPoints.jsonObject=t.itineraryPoints||[],this.maneuvers.jsonObject=t.maneuvers||[],this.provider=t.provider||"",this.transitMode=t.transitMode||"",this._objId=L.nextObjId;let o=new Map,n=0,a=this.itineraryPoints.iterator;for(;!a.done;)o.set(t.itineraryPoints[n].objId,a.value.objId),n++;let s=this.maneuvers.iterator;for(;!s.done;)s.value.itineraryPointObjId=o.get(s.value.itineraryPointObjId);this.validateData()}validateData(){"boolean"!=typeof this.hasProfile&&(this.hasProfile=!1),"number"!=typeof this.ascent&&(this.ascent=0),"number"!=typeof this.descent&&(this.descent=0),"string"==typeof this.provider?this.provider=x.sanitizeToJsString(this.provider):this.provider="","string"==typeof this.transitMode?this.transitMode=x.sanitizeToJsString(this.transitMode):this.transitMode=""}}const B=new E("Note");class U{_objId=_;_UpdateStyles(e){return e.replaceAll(/style='color:white;background-color:red'/g,"class='TravelNotes-Note-WhiteRed'").replaceAll(/style='color:white;background-color:green'/g,"class='TravelNotes-Note-WhiteGreen'").replaceAll(/style='color:white;background-color:blue'/g,"class='TravelNotes-Note-WhiteBlue'").replaceAll(/style='color:white;background-color:brown'/g,"class='TravelNotes-Note-WhiteBrown'").replaceAll(/style='color:white;background-color:black'/g,"class='TravelNotes-Note-WhiteBlack'").replaceAll(/style='border:solid 0.1em'/g,"class='TravelNotes-Note-BlackWhite'").replaceAll(/style='background-color:white;'/g,"class='TravelNotes-Note-Knooppunt'").replaceAll(/style='fill:green;font:bold 120px sans-serif;'/g,"").replaceAll(/style='fill:none;stroke:green;stroke-width:10;'/g,"")}_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":"string"==typeof e.iconHeight&&(e.iconHeight=Number.parseInt(e.iconHeight)),"string"==typeof e.iconWidth&&(e.iconWidth=Number.parseInt(e.iconWidth)),e.iconContent=this._UpdateStyles(e.iconContent),e.popupContent=this._UpdateStyles(e.popupContent),e.tooltipContent=this._UpdateStyles(e.tooltipContent),e.phone=this._UpdateStyles(e.phone),e.address=this._UpdateStyles(e.address);case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+B.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+B.name);B.validate(e.objType),B.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["iconHeight","iconWidth","iconContent","popupContent","tooltipContent","phone","url","address","iconLat","iconLng","lat","lng","distance","chainedDistance","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+B.name)})),e}constructor(){this.iconHeight=h.height,this.iconWidth=h.width,this.iconContent="",this.popupContent="",this.tooltipContent="",this.phone="",this.url="",this.address="",this.iconLat=r.defaultValue,this.iconLng=r.defaultValue,this.lat=r.defaultValue,this.lng=r.defaultValue,this.distance=n.invalid,this.chainedDistance=n.defaultValue,this._objId=L.nextObjId}get isRouteNote(){return this.distance!==n.invalid}get iconLatLng(){return[this.iconLat,this.iconLng]}set iconLatLng(e){this.iconLat=e[0],this.iconLng=e[1]}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return B}get objId(){return this._objId}get jsonObject(){return{iconHeight:this.iconHeight,iconWidth:this.iconWidth,iconContent:this.iconContent,popupContent:this.popupContent,tooltipContent:this.tooltipContent,phone:this.phone,url:this.url,address:this.address,iconLat:parseFloat(this.iconLat.toFixed(r.fixed)),iconLng:parseFloat(this.iconLng.toFixed(r.fixed)),lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),distance:parseFloat(this.distance.toFixed(n.fixed)),chainedDistance:parseFloat(this.chainedDistance.toFixed(n.fixed)),objId:this._objId,objType:B.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.iconHeight=t.iconHeight||h.height,this.iconWidth=t.iconWidth||h.width,this.iconContent=t.iconContent||"",this.popupContent=t.popupContent||"",this.tooltipContent=t.tooltipContent||"",this.phone=t.phone||"",this.url=t.url||"",this.address=t.address||"",this.iconLat=t.iconLat||r.defaultValue,this.iconLng=t.iconLng||r.defaultValue,this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this.distance=t.distance||n.invalid,this.chainedDistance=t.chainedDistance||n.defaultValue,this._objId=L.nextObjId,this.validateData(!0)}validateData(e){if("number"!=typeof this.iconHeight&&(this.iconHeight=h.height),"number"!=typeof this.iconWidth&&(this.iconWidth=h.width),"string"==typeof this.iconContent){let t=x.sanitizeToHtmlString(this.iconContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.iconContent+")"),this.iconContent=t.htmlString}else this.iconContent="";if("string"==typeof this.popupContent){let t=x.sanitizeToHtmlString(this.popupContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.popupContent+")"),this.popupContent=t.htmlString}else this.popupContent="";if("string"==typeof this.tooltipContent){let t=x.sanitizeToHtmlString(this.tooltipContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.tooltipContent+")"),this.tooltipContent=t.htmlString}else this.tooltipContent="";if("string"==typeof this.phone){let t=x.sanitizeToHtmlString(this.phone);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.phone+")"),this.phone=t.htmlString}else this.phone="";if("string"==typeof this.url&&""!==this.url){let t=x.sanitizeToUrl(this.url);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.url+")"),this.url=encodeURI(t.url)}else this.url="";"string"==typeof this.address?this.address=x.sanitizeToHtmlString(this.address).htmlString:this.address="","number"!=typeof this.iconLat&&(this.iconLat=r.defaultValue),"number"!=typeof this.iconLng&&(this.iconLng=r.defaultValue),"number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue),"number"!=typeof this.distance&&(this.distance=n.invalid),"number"!=typeof this.chainedDistance&&(this.chainedDistance=n.defaultValue)}}const K=new E("Route");class F{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":e.dashArray=0,e.hidden=!1;case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":e.edited=l.notEdited;case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":e.editionStatus=e.edited;case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+K.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+K.name);K.validate(e.objType),K.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["name","wayPoints","notes","itinerary","width","color","dashArray","chain","distance","duration","editionStatus","hidden","chainedDistance","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+K.name)})),e}constructor(){this.name="",this.wayPoints=new N(j),this.wayPoints.add(new j),this.wayPoints.add(new j),this.notes=new N(U),this.itinerary=new H,this.width=e.route.width,this.color=e.route.color,this.dashArray=e.route.dashArray,this.chain=!0,this.chainedDistance=n.defaultValue,this.distance=n.defaultValue,this.duration=n.defaultValue,this.editionStatus=l.notEdited,this.hidden=!1,this._objId=L.nextObjId}get computedName(){let e=this.name;return""===e&&(e=(""===this.wayPoints.first.fullName?"???":this.wayPoints.first.fullName)+" ⮞ "+(""===this.wayPoints.last.fullName?"???":this.wayPoints.last.fullName)),e}get objId(){return this._objId}get objType(){return K}haveValidWayPoints(){let e=!0;return this.wayPoints.forEach((t=>{e=e&&r.defaultValue!==t.lat&&r.defaultValue!==t.lng})),e}get jsonObject(){return{name:this.name,wayPoints:this.wayPoints.jsonObject,notes:this.notes.jsonObject,itinerary:this.itinerary.jsonObject,width:this.width,color:this.color,dashArray:this.dashArray,chain:this.chain,distance:parseFloat(this.distance.toFixed(n.fixed)),duration:this.duration,editionStatus:this.editionStatus,hidden:this.hidden,chainedDistance:parseFloat(this.chainedDistance.toFixed(n.fixed)),objId:this._objId,objType:K.jsonObject}}set jsonObject(t){let o=this._validateObject(t);this.name=o.name||"",this.wayPoints.jsonObject=o.wayPoints||[],this.notes.jsonObject=o.notes||[],this.itinerary.jsonObject=o.itinerary||(new H).jsonObject,this.width=o.width||e.route.width,this.color=o.color||"#000000",this.dashArray=o.dashArray||0,this.chain=o.chain||!1,this.distance=o.distance,this.duration=o.duration,this.editionStatus=o.editionStatus||l.notEdited,this.hidden=o.hidden||!1,this.chainedDistance=o.chainedDistance,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="","number"!=typeof this.width&&(this.width=e.route.width),"string"==typeof this.color?this.color=x.sanitizeToColor(this.color)||e.route.color:this.color=e.route.color,"number"!=typeof this.dashArray&&(this.dashArray=0),this.dashArray>=e.route.dashChoices.length&&(this.dashArray=0),"boolean"!=typeof this.chain&&(this.chain=!1),"number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.duration&&(this.duration=n.defaultValue),"number"!=typeof this.editionStatus&&(this.editionStatus=l.notEdited),"boolean"!=typeof this.hidden&&(this.hidden=!1),"number"!=typeof this.chainedDistance&&(this.chainedDistance=n.defaultValue)}}const V=new E("Travel");class W{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":e.editedRoute=new F;case"1.5.0":if(e.userData.layerId){let t=[{layerId:"0",layerName:"OSM - Color"},{layerId:"1",layerName:"OSM - Black and White"},{layerId:"2",layerName:"Thunderforest - Transport"},{layerId:"3",layerName:"Thunderforest - OpenCycleMap"},{layerId:"4",layerName:"Thunderforest - Outdoors"},{layerId:"5",layerName:"Esri - Aerial view"},{layerId:"6",layerName:"Kartverket - Norway"},{layerId:"7",layerName:"IGN-NGI - Belgium now"},{layerId:"12",layerName:"Thunderforest - Landscape"},{layerId:"24",layerName:"Lantmäteriet - Sweden"},{layerId:"25",layerName:"Maanmittauslaitos - Finland"}].find((t=>t.layerId===e.userData.layerId));e.layerName=t?t.layerName:"OSM - Color"}else e.layerName="OSM - Color";case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+V.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+V.name);V.validate(e.objType),V.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["name","editedRoute","routes","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+V.name)})),e}constructor(){this.editedRoute=new F,this.routes=new N(F),this.notes=new N(U),this.layerName="OSM - Color",this.name="",this.readOnly=!1,this._objId=L.nextObjId}get objId(){return this._objId}get objType(){return V}get jsonObject(){return{editedRoute:this.editedRoute.jsonObject,layerName:this.layerName,name:this.name,routes:this.routes.jsonObject,notes:this.notes.jsonObject,readOnly:this.readOnly,objId:this._objId,objType:V.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.editedRoute.jsonObject=t.editedRoute,this.layerName=e.layerName||"OSM - Color",this.name=t.name||"",this.readOnly=t.readOnly||!1,this.routes.jsonObject=t.routes||[],this.notes.jsonObject=t.notes||[],this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.layerName?this.layerName=x.sanitizeToJsString(this.layerName):this.layerName="OSM - Color","string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="TravelNotes","boolean"!=typeof this.readOnly&&(this.readOnly=!0)}}const z=new class{_providers=new Map;_mapObjects=new Map;_routing=Object.seal({provider:"",transitMode:""});_UUID=P.UUID;constructor(){this.map=null,this.travel=new W,this.editedRouteObjId=_,this.searchData=[]}get providers(){return this._providers}get mapObjects(){return this._mapObjects}get routing(){return this._routing}get UUID(){return this._UUID}};const G=new class{constructor(){}getLatLngElevAtDist(e,t){if(e.distance<=t||0>=t)return null;let o=0,n=e.itinerary.itineraryPoints.iterator;for(;o{t.lat=Math.min(t.lat,e[0]),t.lng=Math.min(t.lng,e[1]),o.lat=Math.max(o.lat,e[0]),o.lng=Math.max(o.lng,e[1])})),window.L.latLngBounds(t,o)}getSquareBoundingBox(e,t){let o=t/b*c.fromRadians,n=e[0]*c.toRadians,a=Math.acos((Math.cos(t/b)-Math.sin(n)**2)/Math.cos(n)**2)*c.fromRadians;return window.L.latLngBounds(window.L.latLng([e[0]-o,e[1]-a]),window.L.latLng([e[0]+o,e[1]+a]))}project(e,t){let o=z.map.project(window.L.latLng(e),t);return[o.x,o.y]}screenCoordToLatLng(e,t){let o=z.map.containerPointToLatLng(window.L.point(e,t));return[o.lat,o.lng]}addPoints(e,t){return[e[0]+t[0],e[1]+t[1]]}subtrackPoints(e,t){return[e[0]-t[0],e[1]-t[1]]}};const X=new class{_normalizeLng(e){return(e+c.d540)%c.d360-c.d180}constructor(){}arcFromSummitArcArc(e,t,o){return Math.acos(Math.cos(t)*Math.cos(o)+Math.sin(t)*Math.sin(o)*Math.cos(e))}summitFromArcArcArc(e,t,o){return Math.acos((Math.cos(o)-Math.cos(e)*Math.cos(t))/(Math.sin(e)*Math.sin(t)))}pointsDistance(e,t){if(e[0]===t[0]&&e[1]===t[1])return 0;let o=e[0]*c.toRadians,n=t[0]*c.toRadians,a=(this._normalizeLng(t[1])-this._normalizeLng(e[1]))*c.toRadians;return Math.acos(Math.sin(o)*Math.sin(n)+Math.cos(o)*Math.cos(n)*Math.cos(a))*b}};const Z=new class{_setNearestRouteData(e,t,o){if(e.objId!==z.editedRouteObjId){let n=G.getClosestLatLngDistance(e,t);if(n){let a=X.pointsDistance(t,n.latLng);athis._setNearestRouteData(o,e,t))),_!==z.editedRouteObjId&&this._setNearestRouteData(z.travel.editedRoute,e,t),Object.freeze(t)}getRoute(e){let t=null;return t=z.travel.routes.getAt(e),t||e===z.travel.editedRoute.objId&&(t=z.travel.editedRoute),t}getNoteAndRoute(e){let t=null,o=null;if(t=z.travel.notes.getAt(e),!t){let n=z.travel.routes.iterator;for(;!n.done&&!t;)t=n.value.notes.getAt(e),t&&(o=n.value);t||(t=z.travel.editedRoute.notes.getAt(e),t&&(o=z.travel.editedRoute))}return Object.freeze({note:t,route:o})}getWayPoint(e){let t=z.travel.editedRoute.wayPoints.getAt(e);if(!t){let o=z.travel.routes.iterator;for(;!o.done&&!t;)t=o.value.wayPoints.getAt(e)}return t}}; + */const T="2.3.0",D="v3.0.0";class E{_objTypeName="";_validObjTypeNames=["Itinerary","ItineraryPoint","Maneuver","Note","Route","Travel","WayPoint"];constructor(e){if(p===this._validObjTypeNames.indexOf(e))throw new Error("Invalid ObjType name : "+e);this._objTypeName=e}get name(){return this._objTypeName}get version(){return T}get jsonObject(){return{name:this._objTypeName,version:T}}validate(e){if(!Object.getOwnPropertyNames(e).includes("name"))throw new Error("No name for "+this._objTypeName);if(this._objTypeName!==e.name)throw new Error("Invalid name for "+this._objTypeName);if(!Object.getOwnPropertyNames(e).includes("version"))throw new Error("No version for "+this._objTypeName)}}class f{_collection=null;_index=p;constructor(e){this._collection=e}get value(){return this._index=this._index?null:this._collection.at(this._index-1)}get next(){return this._index=this._collection.length}get first(){return 0===this._index}get last(){return this._index>=this._collection.length-1}get index(){return this._index}}class N{_array=[];_objName="";_classCollection=null;_indexOfObjId(e){return this._array.findIndex((t=>t.objId===e))}_nextOrPrevious(e,t,o){let n=this._indexOfObjId(e);if(p===n)throw new Error("invalid objId for next or previous function");if(1!==o&&-1!==o)throw new Error("invalid direction");let a=t;for(a||(a=()=>!0),n+=o;pp?this._array[e]:null}forEach(e){let t=null,o=this.iterator;for(;!o.done;)t=e(o.value,t);return t}getAt(e){let t=this._indexOfObjId(e);return p===t?null:this._array[t]}moveTo(e,t,o){let n=this._indexOfObjId(e),a=this._indexOfObjId(t);if(p===n||p===a)throw new Error("invalid objId for function myMoveTo");o||a++,this._array.splice(a,0,this._array[n]),a{t=new this._classCollection,t.jsonObject=e,this.add(t)}))}}const x=Object.freeze(new class{_validityMap=new Map;_parser=new DOMParser;_addHtmlEntities(e){return e.replaceAll(//g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}_stringify(e){let t="",o="",n=e.childNodes;for(let a=0;a{if(e)n.hasAttributeNS(null,a)&&(t+=" "+a+'="'+this._addHtmlEntities(n.getAttribute(a))+'"',n.removeAttribute(a));else if(n.hasAttribute(a))if("href"===a||"src"===a){let e=this.sanitizeToUrl(n.getAttribute(a),a).url;""===e?o+="\nAn invalid url ("+n.getAttribute(a)+") was removed from a "+a+" attribute":t+=" "+a+'="'+e+'"',n.removeAttribute(a)}else t+=" "+a+'="'+this._addHtmlEntities(n.getAttribute(a))+'"',n.removeAttribute(a)})),t+=">";let a="",r="";[a,r]=this._stringify(n),t+=a,o+=r,t+=""}else"#text"===s?t+=this._addHtmlEntities(n.nodeValue):o+="\nAn invalid tag "+s+" was removed";if(n.hasAttributes)for(let e=0;e{if(e)o.hasAttributeNS(null,t)&&(n.setAttributeNS(null,t,o.getAttribute(t)),o.removeAttributeNS(null,t));else if(o.hasAttribute(t))if("href"===t||"src"===t){let e=this.sanitizeToUrl(o.getAttribute(t),t).url;""!==e&&n.setAttribute(t,e)}else n.setAttribute(t,o.getAttribute(t))})),o.hasAttribute("style")){o.getAttribute("style").split(";").forEach((e=>{let t=e.split(":");2!==t.length||"width"!==t[0].trim()&&"height"!==t[0].trim()||(n.style[t[0].trim()]=t[1].trim())}))}o.hasAttribute("target")&&n.setAttribute("rel","noopener noreferrer"),t.appendChild(n),this._cloneNode(o,n)}else"#text"===a&&t.appendChild(document.createTextNode(o.nodeValue))}}constructor(){this._validityMap.set("a",["href","target"]),this._validityMap.set("div",[]),this._validityMap.set("del",[]),this._validityMap.set("em",[]),this._validityMap.set("figcaption",[]),this._validityMap.set("figure",[]),this._validityMap.set("h1",[]),this._validityMap.set("h2",[]),this._validityMap.set("h3",[]),this._validityMap.set("h4",[]),this._validityMap.set("h5",[]),this._validityMap.set("h6",[]),this._validityMap.set("hr",[]),this._validityMap.set("img",["src","alt","width","height"]),this._validityMap.set("ins",[]),this._validityMap.set("li",[]),this._validityMap.set("mark",[]),this._validityMap.set("ol",[]),this._validityMap.set("p",[]),this._validityMap.set("s",[]),this._validityMap.set("small",[]),this._validityMap.set("strong",[]),this._validityMap.set("span",[]),this._validityMap.set("sub",[]),this._validityMap.set("sup",[]),this._validityMap.set("ul",[]),this._validityMap.set("svg",["xmlns","viewBox","class"]),this._validityMap.set("text",["x","y","text-anchor"]),this._validityMap.set("polyline",["points","class","transform"])}sanitizeToColor(e){let t=e.match(/^\u0023[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t="href"){let o=this._parser.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let n=o.body.firstChild,a="";for(let e=0;e/g,"").replaceAll(/"/g,"").replaceAll(/\u0027/g,"").replaceAll(/</g,"").replaceAll(/>/g,"").replaceAll(/"/g,"").replaceAll(/'/g,"").replaceAll(/%3C/g,"").replaceAll(/%3c/g,"").replaceAll(/%3E/g,"").replaceAll(/%3e/g,"").replaceAll(/%22/g,"").replaceAll(/%27/g,""),a!==e)return{url:"",errorsString:"Invalid characters found in the url"};let s=["https:"];if("http:"!==window.location.protocol&&"href"!==t||s.push("http:"),"href"===t){s.push("mailto:"),s.push("sms:"),s.push("tel:");let e=a.match(/^\u0023\w*/);if(e&&a===e[0])return{url:a,errorsString:""}}"src"===t&&s.push("data:");let i=null;try{i=new URL(a)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(p===s.indexOf(i.protocol))return{url:"",errorsString:"Invalid protocol "+i.protocol};if(p!==["sms:","tel:"].indexOf(i.protocol)&&i.pathname.match(/^\+[0-9,*,\u0023]*$/))return{url:a,errorsString:""};try{encodeURIComponent(i.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:a,errorsString:""}}sanitizeToJsString(e){let t=this._parser.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.body.firstChild,n="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),n}sanitizeToHtmlElement(e,t){let o=this._parser.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?this._cloneNode(o.body.firstChild,t):t.textContent=""}clone(e){let t=document.createElement(e.tagName);return this._cloneNode(e,t),t}sanitizeToHtmlString(e){let t="",o="",n=this._parser.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return n&&"#document"===n.nodeName?([t,o]=this._stringify(n.body.firstChild,o),{htmlString:t,errorsString:o}):{htmlString:"",errorsString:"Parsing error"}}});const M=new class{_translations=new Map;constructor(){}setTranslations(e){e.forEach((e=>this._translations.set(e.msgid,x.sanitizeToJsString(e.msgstr))))}getText(e,t){let o=this._translations.get(e);return t&&o&&Object.getOwnPropertyNames(t).forEach((e=>o=o.replace("{"+e+"}",t[e]))),o||e}};const P=new class{constructor(){}get UUID(){let e=new Uint8Array(16);const t=["","","","-","","-","","-","","-","","","","","",""];window.crypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;let o="";for(let n=0;n<16;n++)o+=e[n].toString(m).padStart(2,"0")+t[n];return o}storageAvailable(e){try{let t=window[e],o="__storage_test__";return t.setItem(o,o),t.removeItem(o),!0}catch(e){return!1}}openFile(e,t){let o=document.createElement("input");o.type="file",t&&(o.accept=t),o.addEventListener("change",e,!1),o.click()}saveFile(e,t,o){try{let n=null;n=o?window.URL.createObjectURL(new File([t],e,{type:o})):URL.createObjectURL(t);let a=document.createElement("a");a.setAttribute("href",n),a.setAttribute("download",e),a.click(),window.URL.revokeObjectURL(n)}catch(e){e instanceof Error&&console.error(e)}}formatTime(e){let t=Math.floor(e);if(0===t)return"";let o=Math.floor(t/86400),n=Math.floor(t%86400/3600),a=Math.floor(t%3600/60),s=Math.floor(t%60);return 0=t?"0 km":Math.floor(t/n.metersInKm)+","+Math.floor(t%n.metersInKm/10).toFixed(0).padStart(2,"0").padEnd(3,"0")+" km"}formatLat(e){return e>0?e.toFixed(r.fixed)+" N":(-e).toFixed(r.fixed)+" S"}formatLng(e){return e>0?e.toFixed(r.fixed)+" E":(-e).toFixed(r.fixed)+" W"}formatLatLng(e){return 0===e[0]&&0===e[1]?"":this.formatLat(e[0])+" - "+this.formatLng(e[1])}},C=new E("WayPoint");class j{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":e.address=e.name,e.name="";case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+C.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+C.name);C.validate(e.objType),C.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["address","name","lat","lng","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+C.name)})),e}constructor(){this.name="",this.address="",this.lat=r.defaultValue,this.lng=r.defaultValue,this._objId=L.nextObjId}get fullName(){let e=""===this.name?this.address:this.name+", "+this.address;return""===e&&(e=P.formatLatLng([this.lat,this.lng])),e}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objId(){return this._objId}get objType(){return C}get jsonObject(){return{name:this.name,address:this.address,lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),objId:this._objId,objType:C.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.address=t.address||"",this.name=t.name||"",this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.address?this.address=x.sanitizeToJsString(this.address):this.address="","string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="","number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue)}}const A=new E("ItineraryPoint");class S{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":e.elev=i.defaultValue;case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+A.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+A.name);A.validate(e.objType),A.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["lat","lng","distance","elev","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+A.name)})),e}constructor(){this.lat=r.defaultValue,this.lng=r.defaultValue,this.distance=n.defaultValue,this.elev=i.defaultValue,this._objId=L.nextObjId}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return A}get objId(){return this._objId}get jsonObject(){return{lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),distance:parseFloat(this.distance.toFixed(n.fixed)),elev:parseFloat(this.elev.toFixed(i.fixed)),objId:this._objId,objType:A.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this.distance=t.distance||n.defaultValue,this.elev=t.elev||i.defaultValue,this._objId=L.nextObjId,this.validateData()}validateData(){"number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue),"number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.elev&&(this.elev=i.defaultValue)}}const O=new E("Maneuver");class k{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":"kArriveDefault"===e.iconName&&(e.distance=n.defaultValue);case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+O.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+O.name);O.validate(e.objType),O.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["iconName","instruction","distance","duration","itineraryPointObjId","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+O.name)})),e}constructor(){this.iconName="",this.instruction="",this.itineraryPointObjId=_,this.distance=n.defaultValue,this.duration=n.defaultValue,this._objId=L.nextObjId}get objType(){return O}get objId(){return this._objId}get jsonObject(){return{iconName:this.iconName,instruction:this.instruction,distance:parseFloat(this.distance.toFixed(n.fixed)),duration:this.duration,itineraryPointObjId:this.itineraryPointObjId,objId:this._objId,objType:O.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.iconName=t.iconName||"",this.instruction=t.instruction||"",this.distance=t.distance||n.defaultValue,this.duration=t.duration||n.defaultValue,this.itineraryPointObjId=t.itineraryPointObjId||_,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.iconName?this.iconName=x.sanitizeToJsString(this.iconName):this.iconName="","string"==typeof this.instruction?this.instruction=x.sanitizeToJsString(this.instruction):this.instruction="","number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.duration&&(this.duration=n.defaultValue),"number"!=typeof this.itineraryPointObjId&&(this.itineraryPointObjId=_)}}const R=new E("Itinerary");class H{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":e.hasProfile=!1,e.ascent=0,e.descent=0;case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+R.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+R.name);R.validate(e.objType),R.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["hasProfile","ascent","descent","itineraryPoints","maneuvers","provider","transitMode","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+R.name)})),e}constructor(){this.hasProfile=!1,this.ascent=0,this.descent=0,this.provider="",this.transitMode="",this.itineraryPoints=new N(S),this.maneuvers=new N(k),this._objId=L.nextObjId}get objType(){return R}get objId(){return this._objId}get jsonObject(){return{hasProfile:this.hasProfile,ascent:this.ascent,descent:this.descent,itineraryPoints:this.itineraryPoints.jsonObject,maneuvers:this.maneuvers.jsonObject,provider:this.provider,transitMode:this.transitMode,objId:this._objId,objType:R.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.hasProfile=t.hasProfile||!1,this.ascent=t.ascent||0,this.descent=t.descent||0,this.itineraryPoints.jsonObject=t.itineraryPoints||[],this.maneuvers.jsonObject=t.maneuvers||[],this.provider=t.provider||"",this.transitMode=t.transitMode||"",this._objId=L.nextObjId;let o=new Map,n=0,a=this.itineraryPoints.iterator;for(;!a.done;)o.set(t.itineraryPoints[n].objId,a.value.objId),n++;let s=this.maneuvers.iterator;for(;!s.done;)s.value.itineraryPointObjId=o.get(s.value.itineraryPointObjId);this.validateData()}validateData(){"boolean"!=typeof this.hasProfile&&(this.hasProfile=!1),"number"!=typeof this.ascent&&(this.ascent=0),"number"!=typeof this.descent&&(this.descent=0),"string"==typeof this.provider?this.provider=x.sanitizeToJsString(this.provider):this.provider="","string"==typeof this.transitMode?this.transitMode=x.sanitizeToJsString(this.transitMode):this.transitMode=""}}const B=new E("Note");class U{_objId=_;_UpdateStyles(e){return e.replaceAll(/style='color:white;background-color:red'/g,"class='TravelNotes-Note-WhiteRed'").replaceAll(/style='color:white;background-color:green'/g,"class='TravelNotes-Note-WhiteGreen'").replaceAll(/style='color:white;background-color:blue'/g,"class='TravelNotes-Note-WhiteBlue'").replaceAll(/style='color:white;background-color:brown'/g,"class='TravelNotes-Note-WhiteBrown'").replaceAll(/style='color:white;background-color:black'/g,"class='TravelNotes-Note-WhiteBlack'").replaceAll(/style='border:solid 0.1em'/g,"class='TravelNotes-Note-BlackWhite'").replaceAll(/style='background-color:white;'/g,"class='TravelNotes-Note-Knooppunt'").replaceAll(/style='fill:green;font:bold 120px sans-serif;'/g,"").replaceAll(/style='fill:none;stroke:green;stroke-width:10;'/g,"")}_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":"string"==typeof e.iconHeight&&(e.iconHeight=Number.parseInt(e.iconHeight)),"string"==typeof e.iconWidth&&(e.iconWidth=Number.parseInt(e.iconWidth)),e.iconContent=this._UpdateStyles(e.iconContent),e.popupContent=this._UpdateStyles(e.popupContent),e.tooltipContent=this._UpdateStyles(e.tooltipContent),e.phone=this._UpdateStyles(e.phone),e.address=this._UpdateStyles(e.address);case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+B.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+B.name);B.validate(e.objType),B.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["iconHeight","iconWidth","iconContent","popupContent","tooltipContent","phone","url","address","iconLat","iconLng","lat","lng","distance","chainedDistance","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+B.name)})),e}constructor(){this.iconHeight=h.height,this.iconWidth=h.width,this.iconContent="",this.popupContent="",this.tooltipContent="",this.phone="",this.url="",this.address="",this.iconLat=r.defaultValue,this.iconLng=r.defaultValue,this.lat=r.defaultValue,this.lng=r.defaultValue,this.distance=n.invalid,this.chainedDistance=n.defaultValue,this._objId=L.nextObjId}get isRouteNote(){return this.distance!==n.invalid}get iconLatLng(){return[this.iconLat,this.iconLng]}set iconLatLng(e){this.iconLat=e[0],this.iconLng=e[1]}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return B}get objId(){return this._objId}get jsonObject(){return{iconHeight:this.iconHeight,iconWidth:this.iconWidth,iconContent:this.iconContent,popupContent:this.popupContent,tooltipContent:this.tooltipContent,phone:this.phone,url:this.url,address:this.address,iconLat:parseFloat(this.iconLat.toFixed(r.fixed)),iconLng:parseFloat(this.iconLng.toFixed(r.fixed)),lat:parseFloat(this.lat.toFixed(r.fixed)),lng:parseFloat(this.lng.toFixed(r.fixed)),distance:parseFloat(this.distance.toFixed(n.fixed)),chainedDistance:parseFloat(this.chainedDistance.toFixed(n.fixed)),objId:this._objId,objType:B.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.iconHeight=t.iconHeight||h.height,this.iconWidth=t.iconWidth||h.width,this.iconContent=t.iconContent||"",this.popupContent=t.popupContent||"",this.tooltipContent=t.tooltipContent||"",this.phone=t.phone||"",this.url=t.url||"",this.address=t.address||"",this.iconLat=t.iconLat||r.defaultValue,this.iconLng=t.iconLng||r.defaultValue,this.lat=t.lat||r.defaultValue,this.lng=t.lng||r.defaultValue,this.distance=t.distance||n.invalid,this.chainedDistance=t.chainedDistance||n.defaultValue,this._objId=L.nextObjId,this.validateData(!0)}validateData(e){if("number"!=typeof this.iconHeight&&(this.iconHeight=h.height),"number"!=typeof this.iconWidth&&(this.iconWidth=h.width),"string"==typeof this.iconContent){let t=x.sanitizeToHtmlString(this.iconContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.iconContent+")"),this.iconContent=t.htmlString}else this.iconContent="";if("string"==typeof this.popupContent){let t=x.sanitizeToHtmlString(this.popupContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.popupContent+")"),this.popupContent=t.htmlString}else this.popupContent="";if("string"==typeof this.tooltipContent){let t=x.sanitizeToHtmlString(this.tooltipContent);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.tooltipContent+")"),this.tooltipContent=t.htmlString}else this.tooltipContent="";if("string"==typeof this.phone){let t=x.sanitizeToHtmlString(this.phone);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.phone+")"),this.phone=t.htmlString}else this.phone="";if("string"==typeof this.url&&""!==this.url){let t=x.sanitizeToUrl(this.url);e&&""!==t.errorsString&&console.log(t.errorsString+" ("+this.url+")"),this.url=encodeURI(t.url)}else this.url="";"string"==typeof this.address?this.address=x.sanitizeToHtmlString(this.address).htmlString:this.address="","number"!=typeof this.iconLat&&(this.iconLat=r.defaultValue),"number"!=typeof this.iconLng&&(this.iconLng=r.defaultValue),"number"!=typeof this.lat&&(this.lat=r.defaultValue),"number"!=typeof this.lng&&(this.lng=r.defaultValue),"number"!=typeof this.distance&&(this.distance=n.invalid),"number"!=typeof this.chainedDistance&&(this.chainedDistance=n.defaultValue)}}const K=new E("Route");class F{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":e.dashArray=0,e.hidden=!1;case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":e.edited=l.notEdited;case"1.5.0":case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":e.editionStatus=e.edited;case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+K.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+K.name);K.validate(e.objType),K.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["name","wayPoints","notes","itinerary","width","color","dashArray","chain","distance","duration","editionStatus","hidden","chainedDistance","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+K.name)})),e}constructor(){this.name="",this.wayPoints=new N(j),this.wayPoints.add(new j),this.wayPoints.add(new j),this.notes=new N(U),this.itinerary=new H,this.width=e.route.width,this.color=e.route.color,this.dashArray=e.route.dashArray,this.chain=!0,this.chainedDistance=n.defaultValue,this.distance=n.defaultValue,this.duration=n.defaultValue,this.editionStatus=l.notEdited,this.hidden=!1,this._objId=L.nextObjId}get computedName(){let e=this.name;return""===e&&(e=(""===this.wayPoints.first.fullName?"???":this.wayPoints.first.fullName)+" ⮞ "+(""===this.wayPoints.last.fullName?"???":this.wayPoints.last.fullName)),e}get objId(){return this._objId}get objType(){return K}haveValidWayPoints(){let e=!0;return this.wayPoints.forEach((t=>{e=e&&r.defaultValue!==t.lat&&r.defaultValue!==t.lng})),e}get jsonObject(){return{name:this.name,wayPoints:this.wayPoints.jsonObject,notes:this.notes.jsonObject,itinerary:this.itinerary.jsonObject,width:this.width,color:this.color,dashArray:this.dashArray,chain:this.chain,distance:parseFloat(this.distance.toFixed(n.fixed)),duration:this.duration,editionStatus:this.editionStatus,hidden:this.hidden,chainedDistance:parseFloat(this.chainedDistance.toFixed(n.fixed)),objId:this._objId,objType:K.jsonObject}}set jsonObject(t){let o=this._validateObject(t);this.name=o.name||"",this.wayPoints.jsonObject=o.wayPoints||[],this.notes.jsonObject=o.notes||[],this.itinerary.jsonObject=o.itinerary||(new H).jsonObject,this.width=o.width||e.route.width,this.color=o.color||"#000000",this.dashArray=o.dashArray||0,this.chain=o.chain||!1,this.distance=o.distance,this.duration=o.duration,this.editionStatus=o.editionStatus||l.notEdited,this.hidden=o.hidden||!1,this.chainedDistance=o.chainedDistance,this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="","number"!=typeof this.width&&(this.width=e.route.width),"string"==typeof this.color?this.color=x.sanitizeToColor(this.color)||e.route.color:this.color=e.route.color,"number"!=typeof this.dashArray&&(this.dashArray=0),this.dashArray>=e.route.dashChoices.length&&(this.dashArray=0),"boolean"!=typeof this.chain&&(this.chain=!1),"number"!=typeof this.distance&&(this.distance=n.defaultValue),"number"!=typeof this.duration&&(this.duration=n.defaultValue),"number"!=typeof this.editionStatus&&(this.editionStatus=l.notEdited),"boolean"!=typeof this.hidden&&(this.hidden=!1),"number"!=typeof this.chainedDistance&&(this.chainedDistance=n.defaultValue)}}const V=new E("Travel");class W{_objId=_;_upgradeObject(e){switch(e.objType.version){case"1.0.0":case"1.1.0":case"1.2.0":case"1.3.0":case"1.4.0":e.editedRoute=new F;case"1.5.0":if(e.userData.layerId){let t=[{layerId:"0",layerName:"OSM - Color"},{layerId:"1",layerName:"OSM - Black and White"},{layerId:"2",layerName:"Thunderforest - Transport"},{layerId:"3",layerName:"Thunderforest - OpenCycleMap"},{layerId:"4",layerName:"Thunderforest - Outdoors"},{layerId:"5",layerName:"Esri - Aerial view"},{layerId:"6",layerName:"Kartverket - Norway"},{layerId:"7",layerName:"IGN-NGI - Belgium now"},{layerId:"12",layerName:"Thunderforest - Landscape"},{layerId:"24",layerName:"Lantmäteriet - Sweden"},{layerId:"25",layerName:"Maanmittauslaitos - Finland"}].find((t=>t.layerId===e.userData.layerId));e.layerName=t?t.layerName:"OSM - Color"}else e.layerName="OSM - Color";case"1.6.0":case"1.7.0":case"1.7.1":case"1.8.0":case"1.9.0":case"1.10.0":case"1.11.0":case"1.12.0":case"1.13.0":case"2.0.0":case"2.1.0":case"2.2.0":e.objType.version="2.3.0";break;default:throw new Error("invalid version for "+V.name)}}_validateObject(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+V.name);V.validate(e.objType),V.version!==e.objType.version&&this._upgradeObject(e);let t=Object.getOwnPropertyNames(e);return["name","editedRoute","routes","objId"].forEach((e=>{if(!t.includes(e))throw new Error("No "+e+" for "+V.name)})),e}constructor(){this.editedRoute=new F,this.routes=new N(F),this.notes=new N(U),this.layerName="OSM - Color",this.name="",this.readOnly=!1,this._objId=L.nextObjId}get objId(){return this._objId}get objType(){return V}get jsonObject(){return{editedRoute:this.editedRoute.jsonObject,layerName:this.layerName,name:this.name,routes:this.routes.jsonObject,notes:this.notes.jsonObject,readOnly:this.readOnly,objId:this._objId,objType:V.jsonObject}}set jsonObject(e){let t=this._validateObject(e);this.editedRoute.jsonObject=t.editedRoute,this.layerName=e.layerName||"OSM - Color",this.name=t.name||"",this.readOnly=t.readOnly||!1,this.routes.jsonObject=t.routes||[],this.notes.jsonObject=t.notes||[],this._objId=L.nextObjId,this.validateData()}validateData(){"string"==typeof this.layerName?this.layerName=x.sanitizeToJsString(this.layerName):this.layerName="OSM - Color","string"==typeof this.name?this.name=x.sanitizeToJsString(this.name):this.name="TravelNotes","boolean"!=typeof this.readOnly&&(this.readOnly=!0)}}const z=new class{_providers=new Map;_mapObjects=new Map;_routing=Object.seal({provider:"",transitMode:""});_UUID=P.UUID;constructor(){this.map=null,this.travel=new W,this.editedRouteObjId=_,this.searchData=[]}get providers(){return this._providers}get mapObjects(){return this._mapObjects}get routing(){return this._routing}get UUID(){return this._UUID}};const G=new class{constructor(){}getLatLngElevAtDist(e,t){if(e.distance<=t||0>=t)return null;let o=0,n=e.itinerary.itineraryPoints.iterator;for(;o{t.lat=Math.min(t.lat,e[0]),t.lng=Math.min(t.lng,e[1]),o.lat=Math.max(o.lat,e[0]),o.lng=Math.max(o.lng,e[1])})),window.L.latLngBounds(t,o)}getSquareBoundingBox(e,t){let o=t/b*c.fromRadians,n=e[0]*c.toRadians,a=Math.acos((Math.cos(t/b)-Math.sin(n)**2)/Math.cos(n)**2)*c.fromRadians;return window.L.latLngBounds(window.L.latLng([e[0]-o,e[1]-a]),window.L.latLng([e[0]+o,e[1]+a]))}project(e,t){let o=z.map.project(window.L.latLng(e),t);return[o.x,o.y]}screenCoordToLatLng(e,t){let o=z.map.containerPointToLatLng(window.L.point(e,t));return[o.lat,o.lng]}addPoints(e,t){return[e[0]+t[0],e[1]+t[1]]}subtrackPoints(e,t){return[e[0]-t[0],e[1]-t[1]]}};const X=new class{_normalizeLng(e){return(e+c.d540)%c.d360-c.d180}constructor(){}arcFromSummitArcArc(e,t,o){return Math.acos(Math.cos(t)*Math.cos(o)+Math.sin(t)*Math.sin(o)*Math.cos(e))}summitFromArcArcArc(e,t,o){return Math.acos((Math.cos(o)-Math.cos(e)*Math.cos(t))/(Math.sin(e)*Math.sin(t)))}pointsDistance(e,t){if(e[0]===t[0]&&e[1]===t[1])return 0;let o=e[0]*c.toRadians,n=t[0]*c.toRadians,a=(this._normalizeLng(t[1])-this._normalizeLng(e[1]))*c.toRadians;return Math.acos(Math.sin(o)*Math.sin(n)+Math.cos(o)*Math.cos(n)*Math.cos(a))*b}};const Z=new class{_setNearestRouteData(e,t,o){if(e.objId!==z.editedRouteObjId){let n=G.getClosestLatLngDistance(e,t);if(n){let a=X.pointsDistance(t,n.latLng);athis._setNearestRouteData(o,e,t))),_!==z.editedRouteObjId&&this._setNearestRouteData(z.travel.editedRoute,e,t),Object.freeze(t)}getRoute(e){let t=null;return t=z.travel.routes.getAt(e),t||e===z.travel.editedRoute.objId&&(t=z.travel.editedRoute),t}getNoteAndRoute(e){let t=null,o=null;if(t=z.travel.notes.getAt(e),!t){let n=z.travel.routes.iterator;for(;!n.done&&!t;)t=n.value.notes.getAt(e),t&&(o=n.value);t||(t=z.travel.editedRoute.notes.getAt(e),t&&(o=z.travel.editedRoute))}return Object.freeze({note:t,route:o})}getWayPoint(e){let t=z.travel.editedRoute.wayPoints.getAt(e);if(!t){let o=z.travel.routes.iterator;for(;!o.done&&!t;)t=o.value.wayPoints.getAt(e)}return t}}; /** @------------------------------------------------------------------------------------------------------------------------------ @@ -142,4 +142,4 @@ class Ot{_dragData=null;constructor(e){this._dragData=e}handleEvent(e){this._dra @private @------------------------------------------------------------------------------------------------------------------------------ - */const No=new class{_indexedDb=null;_UUID=null;_data=null;_open(e,t){if(this._indexedDb)return void e();let o=window.indexedDB.open("TravelNotesDb",1);o.onerror=()=>{this._indexedDb=null,t(new Error("Not possible to open the db"))},o.onsuccess=t=>{this._indexedDb=t.target.result,e()},o.onupgradeneeded=e=>{this._indexedDb=e.target.result,this._indexedDb.createObjectStore("Travels",{keyPath:"UUID"})}}_read(e,t){if(!this._indexedDb)return void t(new Error("Database not opened"));let o=this._indexedDb.transaction(["Travels"],"readonly");o.onerror=()=>t(new Error("Transaction error")),o.objectStore("Travels").get(this._UUID).onsuccess=t=>e(t.target.result?t.target.result.data:null)}_write(e,t){if(!this._indexedDb)return void t(new Error("Database not opened"));let o=null;try{o=this._indexedDb.transaction(["Travels"],"readwrite")}catch(e){return void t(e)}o.onerror=()=>t(new Error("Transaction error")),o.objectStore("Travels").put({UUID:this._UUID,data:this._data}).onsuccess=()=>e()}_close(){this._indexedDb.close(),this._indexedDb=null}constructor(){}getOpenPromise(){return new Promise(((e,t)=>this._open(e,t)))}getReadPromise(e){return this._UUID=e,new Promise(((e,t)=>this._read(e,t)))}getWritePromise(e,t){return this._UUID=e,this._data=t,new Promise(((e,t)=>this._write(e,t)))}closeDb(e){if(!this._indexedDb)return;if(!e)return void this._close();let t=this._indexedDb.transaction(["Travels"],"readwrite");t.onerror=()=>{};let o=t.objectStore("Travels").delete(e);o.onerror=()=>this._close(),o.onsuccess=()=>this._close()}};const xo=new class{_getTravelHeaderHTML(t){let o=Y.create("div",{className:t+"Travel-Header"});x.sanitizeToHtmlElement(z.travel.name,Y.create("div",{className:t+"Travel-Header-Name"},o));let a=n.defaultValue,s=0,i=0,r=z.travel.routes.iterator;for(;!r.done;){let n=r.value.objId===z.editedRouteObjId&&e.routeEditor.showEditedRouteInRoadbook?z.travel.editedRoute:r.value;x.sanitizeToHtmlElement(''+n.computedName+" : "+P.formatDistance(n.distance)+".",Y.create("div",{className:t+"Travel-Header-RouteName"},o)),n.chain&&(a+=n.distance,s+=n.itinerary.ascent,i+=n.itinerary.descent)}return x.sanitizeToHtmlElement(""+M.getText("TravelHTMLViewsFactory - Travel distance")+" : "+P.formatDistance(a),Y.create("div",{className:t+"Travel-Header-TravelDistance"},o)),0!==s&&x.sanitizeToHtmlElement(""+M.getText("travelHTMLViewsFactory - Travel ascent")+" : "+String(s.toFixed(0))+" m.",Y.create("div",{className:t+"Travel-Header-TravelAscent"},o)),0!==i&&x.sanitizeToHtmlElement(""+M.getText("TravelHTMLViewsFactory - Travel descent")+" : "+String(i.toFixed(0))+" m.",Y.create("div",{className:t+"Travel-Header-TravelDescent"},o)),o}_getTravelFooterHTML(e){let t=M.getText("TravelHTMLViewsFactory - Travel footer")+'Travel & Notes, © wwwouaiebe 2017 2021 © '+M.getText("TravelHTMLViewsFactory - OpenStreetMap contributors")+"",o=Y.create("div",{className:e+"TravelFooter"});return x.sanitizeToHtmlElement(t,o),o}constructor(){}getTravelHTML(t){let o=Y.create("div",{className:t+"Travel"});o.appendChild(this._getTravelHeaderHTML(t)),o.appendChild(Be.getTravelNotesHTML(t));let n=z.travel.routes.iterator;for(;!n.done;){let a=e.routeEditor.showEditedRouteInRoadbook&&n.value.objId===z.editedRouteObjId?z.travel.editedRoute:n.value;o.appendChild(Ue.getRouteHeaderHTML(t,a)),a.itinerary.hasProfile&&o.appendChild(Ue.getRouteProfileHTML(t,a)),o.appendChild(Ue.getRouteManeuversAndNotesHTML(t,a,!1)),o.appendChild(Ue.getRouteFooterHTML(t,a))}return o.appendChild(this._getTravelFooterHTML(t)),o}};const Mo=new class{_mouseUISpan=null;_saveStatus=o.saved;_mousePosition="";_zoom="";_saveTimer=null;_updateUI(){this._mouseUISpan&&(this._mouseUISpan.textContent=this._saveStatus+" "+this._mousePosition+" - Zoom : "+this._zoom)}constructor(){}set saveStatus(e){o.modified===e&&o.notSaved===this._saveStatus||(this._saveStatus=e,o.modified!==e||this._saveTimer||(this._saveTimer=setTimeout((()=>this._saveStatus=o.notSaved),3e5)),o.saved===e&&this._saveTimer&&(clearTimeout(this._saveTimer),this._saveTimer=null),this._updateUI())}createUI(){this._mouseUISpan=Y.create("span",null,Y.create("div",{id:"TravelNotes-MouseUI"},document.body)),this._zoom=z.map.getZoom(),this._mousePosition=P.formatLat(e.map.center.lat)+" - "+P.formatLng(e.map.center.lng),z.map.on("mousemove",(e=>{this._mousePosition=P.formatLatLng([e.latlng.lat,e.latlng.lng]),this._updateUI()})),z.map.on("zoomend",(()=>{this._zoom=String(z.map.getZoom()),this._updateUI()}))}};const Po=new class{_python2Round(e){return Math.floor(Math.abs(e)+.5)*(0<=e?1:-1)}_encodeDelta(e,t,o){let n=this._python2Round(e*o),a=this._python2Round(t*o),s=n-a;s<<=1,0>n-a&&(s=~s);let i="";for(;32<=s;)i+=String.fromCharCode(63+(32|31&s)),s>>=5;return i+=String.fromCharCode(s+63),i}_index=0;_decodeDelta(e){let t=null,o=0,n=0;do{t=e.charCodeAt(this._index++)-63,n|=(31&t)<>1):n>>1}constructor(){}encode(e,t){if(!e.length)return"";let o=t.length,n=Array.from(t,(e=>Math.pow(10,e))),a="";for(let t=0;tMath.pow(10,e))),s=new Array(o).fill(0);for(;this._index{n.push([e.lat,e.lng,e.distance,e.elev,e.objId])})),o.values=Po.encode(n,[r.fixed,r.fixed,2,2,0]),e.itinerary.itineraryPoints=o}_decompressRoute(e){let t=[];if(e.itinerary.itineraryPoints.values)Po.decode(e.itinerary.itineraryPoints.values,[r.fixed,r.fixed,2,2,0]).forEach((o=>{let a={lat:r.defaultValue,lng:r.defaultValue,distance:n.defaultValue,elev:i.defaultValue,objId:_};[a.lat,a.lng,a.distance,a.elev,a.objId]=o,a.objType=e.itinerary.itineraryPoints.objType,t.push(a)}));else{e.itinerary.itineraryPoints.latLngs=Po.decode(e.itinerary.itineraryPoints.latLngs,[r.fixed,r.fixed]);let o=0;e.itinerary.itineraryPoints.latLngs.forEach((n=>{let a={};a.lat=n[0],a.lng=n[1],a.distance=e.itinerary.itineraryPoints.distances[o],e.itinerary.itineraryPoints.elevs?a.elev=e.itinerary.itineraryPoints.elevs[o]:a.elev=i.defaultValue,a.objId=e.itinerary.itineraryPoints.objIds[o],a.objType=e.itinerary.itineraryPoints.objType,t.push(a),o++}))}e.itinerary.itineraryPoints=t}_decompressTravel(e){e.routes.forEach(this._decompressRoute),e.editedRoute&&this._decompressRoute(e.editedRoute)}constructor(){}decompress(e){this._decompressTravel(e),z.travel.jsonObject=e,z.editedRouteObjId=_,z.travel.routes.forEach((e=>{l.notEdited!==e.editionStatus&&(z.editedRouteObjId=e.objId)}))}decompressMerge(e){this._decompressTravel(e);let t=new W;t.jsonObject=e;let o=t.routes.iterator;for(;!o.done;)z.travel.routes.add(o.value);let n=t.notes.iterator;for(;!n.done;)z.travel.notes.add(n.value)}compress(e){let t=e.jsonObject;return t.routes.forEach(this._compressRoute),this._compressRoute(t.editedRoute),t}}class jo extends le{_removeTravelNotesInput=null;_removeRoutesNotesInput=null;_removeManeuversInput=null;_removeTravelNotesDiv=null;_removeRoutesNotesDiv=null;_removeManeuversDiv=null;_createInputDiv(e){let t=Y.create("div",null),o=Y.create("input",{type:"checkbox",checked:!1},t);return Y.create("text",{value:e},t),[t,o]}constructor(e={}){super(e),[this._removeTravelNotesDiv,this._removeTravelNotesInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Travel Notes")),[this._removeRoutesNotesDiv,this._removeRoutesNotesInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Routes Notes")),[this._removeManeuversDiv,this._removeManeuversInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Maneuvers"))}onOk(){super.onOk(Object.freeze({removeTravelNotes:this._removeTravelNotesInput.checked,removeRoutesNotes:this._removeRoutesNotesInput.checked,removeManeuvers:this._removeManeuversInput.checked}))}get contentHTMLElements(){return[this._removeTravelNotesDiv,this._removeRoutesNotesDiv,this._removeManeuversDiv]}get title(){return M.getText("SaveAsDialog - SaveAs")}}const Ao=new class{_saveAsTravel(e){let t=new W;t.jsonObject=z.travel.jsonObject,t.name+="-partial";let o=t.routes.iterator;for(;!o.done;)o.value.hidden=!1;if(e.removeTravelNotes&&t.notes.removeAll(),e.removeRoutesNotes)for(o=t.routes.iterator;!o.done;)o.value.notes.removeAll();if(e.removeManeuvers)for(o=t.routes.iterator;!o.done;)o.value.itinerary.maneuvers.removeAll();let n=(new Co).compress(t);P.saveFile(n.name+".trv",JSON.stringify(n),"application/json")}constructor(){}routeDropped(e,t,o){let n=e===z.travel.editedRoute.objId?z.editedRouteObjId:e,a=t===z.travel.editedRoute.objId?z.editedRouteObjId:t;z.travel.routes.moveTo(n,a,o),$t.chainRoutes(),xe.dispatch("setrouteslist"),xe.dispatch("roadbookupdate")}saveAsTravel(){""!==z.travel.name?_===z.editedRouteObjId?(new jo).show().then((e=>{this._saveAsTravel(e)})).catch((e=>{e instanceof Error&&console.error(e)})):Me.showError(M.getText("TravelEditor - Not possible to partial save when a route is edited.")):Me.showError(M.getText("TravelEditor - Gives a name to the travel"))}saveTravel(){if(""===z.travel.name)return void Me.showError(M.getText("TravelEditor - Gives a name to the travel"));let e=z.travel.routes.iterator;for(;!e.done;)e.value.hidden=!1;let t=(new Co).compress(z.travel);P.saveFile(t.name+".trv",JSON.stringify(t),"application/json"),Mo.saveStatus=o.saved}newTravel(){e.travelNotes.haveBeforeUnloadWarning&&!window.confirm(M.getText("TravelEditor - This page ask to close; data are perhaps not saved."))||(Wt.deleteAllProfiles(),xe.dispatch("removeallobjects"),z.travel.editedRoute=new F,z.editedRouteObjId=_,z.travel=new W,z.travel.routes.add(new F),xe.dispatch("setrouteslist"),xe.dispatch("showitinerary"),xe.dispatch("roadbookupdate"),xe.dispatch("travelnameupdated"),e.travelEditor.startupRouteEdition&&$t.editRoute(z.travel.routes.first.objId),Mo.saveStatus=o.saved)}};const So=new class{_attributionsDiv=null;constructor(){}createUI(){this._attributionsDiv=Y.create("div",{id:"TravelNotes-AttributionsUI"},document.body)}set attributions(e){let t='© Leaflet | © OpenStreetMap contributors '+e+'| © Travel & Notes';for(;this._attributionsDiv.firstChild;)this._attributionsDiv.removeChild(this._attributionsDiv.firstChild);x.sanitizeToHtmlElement(t,this._attributionsDiv)}};class Oo{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),e.target.style.color=this._mapLayer.toolbar.backgroundColor,e.target.style["background-color"]=this._mapLayer.toolbar.color}}class ko{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),e.target.style.color=this._mapLayer.toolbar.color,e.target.style["background-color"]=this._mapLayer.toolbar.backgroundColor}}class Ro{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),xe.dispatch("layerchange",{layer:this._mapLayer}),So.attributions=this._mapLayer.attribution,z.travel.layerName=this._mapLayer.name}}class Ho{_buttonHTMLElement=null;_eventListeners={mouseEnter:null,mouseLeave:null,click:null};_parentNode=null;constructor(e,t){this._parentNode=t,this._buttonHTMLElement=Y.create("div",{className:"TravelNotes-MapLayersToolbarUI-Button",title:e.name,dataset:{MapLayerName:e.name},textContent:e.toolbar.text,style:"color:"+e.toolbar.color+";background-color:"+e.toolbar.backgroundColor},t),this._eventListeners.mouseEnter=new Oo(e),this._eventListeners.mouseLeave=new ko(e),this._eventListeners.click=new Ro(e),this._buttonHTMLElement.addEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._buttonHTMLElement.addEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._buttonHTMLElement.addEventListener("click",this._eventListeners.click,!1)}destructor(){this._buttonHTMLElement.removeEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._buttonHTMLElement.removeEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._buttonHTMLElement.removeEventListener("click",this._eventListeners.click,!1),this._parentNode.removeChild(this._buttonHTMLElement),this._parentNode=null}get height(){return this._buttonHTMLElement.clientHeight}}class Bo{constructor(){}handleEvent(e){e.stopPropagation(),e.target.classList.add("TravelNotes-MapLayersToolbarUI-LinkButton-Enter"),e.target.classList.remove("TravelNotes-MapLayersToolbarUI-LinkButton-Leave")}}class Uo{constructor(){}handleEvent(e){e.stopPropagation(),e.target.classList.add("TravelNotes-MapLayersToolbarUI-LinkButton-Leave"),e.target.classList.remove("TravelNotes-MapLayersToolbarUI-LinkButton-Enter")}}class Ko{_eventListeners={mouseEnter:null,mouseLeave:null};_linkButton=null;_parentNode=null;constructor(e,t){this._parentNode=t,this._linkButton=Y.create("div",{className:"TravelNotes-MapLayersToolbarUI-Button TravelNotes-MapLayersToolbarUI-LinkButton-Leave"},t),Y.create("a",e,this._linkButton),this._eventListeners.mouseEnter=new Bo,this._eventListeners.mouseLeave=new Uo,this._linkButton.addEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._linkButton.addEventListener("mouseleave",this._eventListeners.mouseLeave,!1)}destructor(){this._linkButton.removeEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._linkButton.removeEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._parentNode.removeChild(this._linkButton),this._parentNode=null}get height(){return this._linkButton.clientHeight}}class Fo{_mapLayersToolbarUI=null;_wheelEventData=null;constructor(e,t){this._mapLayersToolbarUI=e,this._wheelEventData=t}handleEvent(e){e.stopPropagation(),e.deltaY&&(this._wheelEventData.marginTop-=e.deltaY*v[e.deltaMode],this._wheelEventData.marginTop=this._wheelEventData.marginTop>this._wheelEventData.buttonTop?this._wheelEventData.buttonTop:this._wheelEventData.marginTop,this._wheelEventData.marginTop=this._wheelEventData.marginTop{if(e.providerKeyNeeded&&Pe.hasKey(e.providerName.toLowerCase())||!e.providerKeyNeeded){let t=new Ho(e,this._buttonsHTMLElement);this._wheelEventData.buttonHeight=t.height,this._wheelEventData.buttonsHeight+=t.height,this._buttonsAndLinks.push(t)}})),e.layersToolbarUI.theDevil&&e.layersToolbarUI.theDevil.addButton){let e=new Ko({href:"https://www.google.com/maps/@"+z.map.getCenter().lat+","+z.map.getCenter().lng+","+z.map.getZoom()+"z",title:"Reminder! The devil will know everything about you",textContent:"👿",target:"_blank"},this._buttonsHTMLElement);this._wheelEventData.buttonsHeight+=e.height,this._buttonsAndLinks.push(e)}this._wheelEventData.buttonTop+=this._wheelEventData.buttonHeight,this._wheelEventData.marginTop=this._wheelEventData.buttonTop,this._buttonsHTMLElement.style.marginTop=String(this._wheelEventData.marginTop)+"px",this._buttonsHTMLElement.addEventListener("wheel",this._onWheelButtonsEventListener,!1)}_hide(){this._buttonsAndLinks.forEach((e=>e.destructor())),this._buttonsAndLinks.length=0,this._buttonsHTMLElement.removeEventListener("wheel",this._onWheelButtonsEventListener,!1),this._mainHTMLElement.removeChild(this._buttonsHTMLElement),this._timerId=null}_onMouseLeave(){this._timerId=setTimeout((()=>this._hide()),e.layersToolbarUI.toolbarTimeOut)}constructor(){this._onWheelButtonsEventListener=new Fo(this,this._wheelEventData)}createUI(){this._mainHTMLElement=Y.create("div",{id:"TravelNotes-MapLayersToolbarUI"},document.body),Y.create("div",{id:"TravelNotes-MapLayersToolbarUI-Header",textContent:M.getText("MapLayersToolbarUI - Layers")},this._mainHTMLElement),this._mainHTMLElement.addEventListener("mouseenter",(()=>this._show()),!1),this._mainHTMLElement.addEventListener("mouseleave",(()=>this._onMouseLeave()),!1),xe.dispatch("layerchange",{layer:Zt.defaultMapLayer}),So.attributions=Zt.defaultMapLayer.attribution}setMapLayer(e){let t=Zt.getMapLayer(e);xe.dispatch("layerchange",{layer:t}),So.attributions=t.attribution,z.travel.layerName=t.name}get buttonsHTMLElement(){return this._buttonsHTMLElement}};class Wo{_display(){xe.dispatch("removeallobjects"),document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name);let e=z.travel.routes.iterator;for(;!e.done;)l.notEdited===e.value.editionStatus&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:e.value.objId});_!==z.editedRouteObjId&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:z.travel.editedRoute.objId});let t=z.travel.notes.iterator;for(;!t.done;)xe.dispatch("noteupdated",{removedNoteObjId:_,addedNoteObjId:t.value.objId});if((new Rt).zoomToTravel(),Vo.setMapLayer(z.travel.layerName),xe.dispatch("setrouteslist"),_!==z.editedRouteObjId){let e=z.travel.editedRoute.itinerary.provider;if(e&&""!==e&&!z.providers.get(e.toLowerCase()))Me.showError(M.getText("FileLoader - Not possible to select as provider",{provider:e}));else{let t=z.travel.editedRoute.itinerary.transitMode;xe.dispatch("setprovider",{provider:e}),t&&""!==t&&xe.dispatch("settransitmode",{transitMode:t})}}$t.chainRoutes(),xe.dispatch("travelnameupdated"),xe.dispatch("showitinerary"),xe.dispatch("roadbookupdate")}_openFile(e,t){try{t?(new Co).decompressMerge(e):(Wt.deleteAllProfiles(),(new Co).decompress(e)),this._display(),t||(Mo.saveStatus=o.saved)}catch(e){Me.showError("An error occurs when reading the file : "+e.message)}}constructor(){}openLocalFile(e){this._openFile(e,!1)}mergeLocalFile(e){this._openFile(e,!0)}}class zo{handleEvent(e){e.stopPropagation(),Ao.saveAsTravel()}}class Go{handleEvent(e){e.stopPropagation(),Ao.newTravel(),document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name)}}class Xo{handleEvent(e){e.stopPropagation(),Ao.saveTravel()}}class Zo{handleEvent(e){e.stopPropagation();let t=new FileReader;t.onload=()=>{let e={};try{e=JSON.parse(t.result),(new Wo).openLocalFile(e)}catch(e){e instanceof Error&&console.error(e)}},t.readAsText(e.target.files[0])}}class Yo{handleEvent(t){t.stopPropagation(),e.travelNotes.haveBeforeUnloadWarning&&!window.confirm(M.getText("TravelEditor - This page ask to close; data are perhaps not saved."))||P.openFile(new Zo,".trv")}}class Jo{handleEvent(e){e.stopPropagation();let t=new FileReader;t.onload=()=>{let e={};try{e=JSON.parse(t.result),(new Wo).mergeLocalFile(e)}catch(e){e instanceof Error&&console.error(e)}},t.readAsText(e.target.files[0])}}class qo{handleEvent(e){e.stopPropagation(),_===z.editedRouteObjId?P.openFile(new Jo,".trv"):Me.showError(M.getText("TravelUI - Not possible to merge a travel when a route is edited"))}}class Qo{_buttonsDiv=null;_createSaveAsTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button TravelNotes-TravelUI-SaveAsButton",title:M.getText("TravelUI - Save as travel"),textContent:"💾"},this._buttonsDiv).addEventListener("click",new zo,!1)}_createCancelTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Cancel travel"),textContent:"❌"},this._buttonsDiv).addEventListener("click",new Go,!1)}_createSaveTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Save travel"),textContent:"💾"},this._buttonsDiv).addEventListener("click",new Xo,!1)}_createOpenTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Open travel"),textContent:"📂"},this._buttonsDiv).addEventListener("click",new Yo,!1)}_createImportTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Import travel"),textContent:"🌏"},this._buttonsDiv).addEventListener("click",new qo,!1)}_createRoadbookButton(){Y.create("text",{value:"📋"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:"TravelNotesRoadbook.html?lng="+e.travelNotes.language+"&page="+z.UUID,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Open travel roadbook")},this._buttonsDiv)))}constructor(e){this._buttonsDiv=Y.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e),this._createSaveAsTravelButton(),this._createCancelTravelButton(),this._createSaveTravelButton(),this._createOpenTravelButton(),this._createImportTravelButton(),this._createRoadbookButton()}}class $o{constructor(){}handleEvent(e){e.preventDefault()}}class en{constructor(){}handleEvent(e){e.stopPropagation();try{e.dataTransfer.setData("ObjId",e.target.dataset.tanObjId),e.dataTransfer.dropEffect="move"}catch(e){e instanceof Error&&console.error(e)}}}class tn{constructor(){}handleEvent(e){e.preventDefault();let t=e.target,o=t.getBoundingClientRect();Ao.routeDropped(Number.parseInt(e.dataTransfer.getData("ObjId")),Number.parseInt(t.dataset.tanObjId),e.clientY-o.top{e.dataset.tanPaneId===this._activePaneId?e.classList.add("TravelNotes-PanesManagerUI-ActivePaneButton"):e.classList.remove("TravelNotes-PanesManagerUI-ActivePaneButton")}))}updatePane(e){e===this._activePaneId&&this.showPane(e)}}const vn={bike:'data:image/svg+xml;utf8, ',pedestrian:'data:image/svg+xml;utf8, ',car:'data:image/svg+xml;utf8, ',train:'data:image/svg+xml;utf8, ',line:'data:image/svg+xml;utf8, ',circle:'data:image/svg+xml;utf8, '};class _n{_providerToolbarUI=null;_transitMode=null;_buttonHTMLElement=null;constructor(e,t){this._providerToolbarUI=e,this._transitMode=t,this._buttonHTMLElement=Y.create("img",{src:vn[t],id:"TravelNotes-ProvidersToolbarUI-"+t+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:M.getText("ProvidersToolbarUI - "+t)}),this._buttonHTMLElement.addEventListener("click",this),this.visible=!1}handleEvent(e){e.stopPropagation(),this._providerToolbarUI.transitMode=this._transitMode,to.startRouting()}get buttonHTMLElement(){return this._buttonHTMLElement}get transitMode(){return this._transitMode}set active(e){e?this._buttonHTMLElement.classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"):this._buttonHTMLElement.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton")}set visible(e){e?this._buttonHTMLElement.classList.remove("TravelNotes-Hidden"):this._buttonHTMLElement.classList.add("TravelNotes-Hidden")}}class pn{_providerToolbarUI=null;_provider=null;_buttonHTMLElement=null;constructor(e,t){this._providerToolbarUI=e,this._provider=t,this._buttonHTMLElement=Y.create("img",{src:t.icon,id:"TravelNotes-ProvidersToolbarUI-"+t.name+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:t.title||t.name}),this._buttonHTMLElement.addEventListener("click",this)}handleEvent(e){e.stopPropagation(),this._providerToolbarUI.provider=this._provider.name,to.startRouting()}get buttonHTMLElement(){return this._buttonHTMLElement}get provider(){return this._provider}set active(e){e?this._buttonHTMLElement.classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"):this._buttonHTMLElement.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton")}}class mn{_toolbarHTMLElement=null;_transitModeButtons=new Map;_providerButtons=new Map;_activeTransitModeButton=null;_activeProviderButton=null;_createTransitModesButtons(){["bike","pedestrian","car","train","line","circle"].forEach((e=>{let t=new _n(this,e);this._transitModeButtons.set(e,t),this._toolbarHTMLElement.appendChild(t.buttonHTMLElement)}))}_createProvidersButtons(){z.providers.forEach((e=>{if(0!==e.providerKey){let t=new pn(this,e);this._providerButtons.set(e.name,t),this._toolbarHTMLElement.appendChild(t.buttonHTMLElement)}}))}constructor(e){this._toolbarHTMLElement=Y.create("div",{className:"TravelNotes-UI-FlexRowDiv TravelNotes-ProvidersToolbarUI-ImgButtonsDiv"},e),this._createTransitModesButtons(),this._createProvidersButtons(),this.provider=this._providerButtons.keys().next().value}set provider(e){z.routing.provider=e,this._activeProviderButton&&(this._activeProviderButton.active=!1),this._activeProviderButton=this._providerButtons.get(e),this._activeProviderButton.active=!0;let t=z.providers.get(e.toLowerCase());this._transitModeButtons.forEach((e=>{e.visible=p!==t.transitModes.indexOf(e.transitMode)})),this._activeTransitModeButton&&p!==t.transitModes.indexOf(this._activeTransitModeButton.transitMode)||(this._activeTransitModeButton=null,this._transitModeButtons.forEach((e=>{this._activeTransitModeButton||p===t.transitModes.indexOf(e.transitMode)?e.active=!1:(this._activeTransitModeButton=e,e.active=!0,z.routing.transitMode=e.transitMode)})))}set transitMode(e){z.routing.transitMode=e,this._activeTransitModeButton&&(this._activeTransitModeButton.active=!1),this._activeTransitModeButton=this._transitModeButtons.get(e),this._activeTransitModeButton.active=!0}providersAdded(){for(;this._toolbarHTMLElement.firstChild;)this._toolbarHTMLElement.removeChild(this._toolbarHTMLElement.firstChild);this._transitModeButtons.clear(),this._providerButtons.clear(),this._createTransitModesButtons(),this._createProvidersButtons(),this.provider=this._providerButtons.keys().next().value;let e=this._providerButtons.keys().next().value;this.provider=e,this.transitMode=z.providers.get(e.toLowerCase()).transitModes[0]}}const gn=new class{_status="geolocation"in navigator?a.inactive:a.disabled;_watchId=null;_showPosition(e){xe.dispatch("geolocationpositionchanged",{position:e})}_stop(){a.active===this._status&&(this._status=a.inactive),xe.dispatch("geolocationstatuschanged",{status:this._status}),navigator.geolocation.clearWatch(this._watchId),this._watchId=null}_error(e){1===e.code&&(this._status=a.refusedByUser),this._stop()}_start(){this._status=a.active,xe.dispatch("geolocationstatuschanged",{status:this._status}),navigator.geolocation.getCurrentPosition((e=>this._showPosition(e)),(e=>this._error(e)),e.geoLocation.options),this._watchId=navigator.geolocation.watchPosition(this._showPosition,this._error,e.geoLocation.options)}constructor(){}get status(){return this._status}switch(){switch(this._status){case a.inactive:this._start();break;case a.active:this._stop()}return this._status}};class yn{constructor(){}handleEvent(e){e.stopPropagation(),Pe.setKeysFromDialog()}}class bn{constructor(){}handleEvent(e){e.stopPropagation(),gn.switch()}}class In{constructor(){}handleEvent(e){e.target.textContent="📌"===e.target.textContent?"❌":"📌",xe.dispatch("uipinned")}}class wn{_geoLocationButton=null;_buttonsDiv=null;_createHomeButton(){Y.create("text",{value:"🏠"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:window.location.origin,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Home"},this._buttonsDiv)))}_createHelpButton(){Y.create("text",{value:"?"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:"https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages/TravelNotesGuides",target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Help"},this._buttonsDiv)))}_createContactButton(){Y.create("text",{value:"@"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:e.travelNotesToolbarUI.contactMail.url||window.location.origin,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Contact"},this._buttonsDiv)))}_createApiKeysButton(){e.APIKeysDialog.showButton&&Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelNotesToolbarUI - API keys"),textContent:"🔑"},this._buttonsDiv).addEventListener("click",new yn,!1)}_createGeoLocationButton(){a.disablede.classList.toggle("TravelNotes-Hidden")))}toggleManeuvers(){this._maneuversHTML.forEach((e=>e.classList.toggle("TravelNotes-Hidden")))}addData(){this._routeManeuversAndNotesHTML=Ue.getRouteManeuversAndNotesHTML("TravelNotes-ItineraryPaneUI-",z.travel.editedRoute,!0),this._routeManeuversAndNotesHTML.childNodes.forEach((e=>{"Maneuver"===e.dataset.tanObjType?(e.addEventListener("contextmenu",this._eventListeners.onContextMenuManeuver),e.addEventListener("mouseenter",this._eventListeners.onMouseEnterManeuver),e.addEventListener("mouseleave",this._eventListeners.onMouseLeave),this._maneuversHTML.push(e)):"Note"===e.dataset.tanObjType&&(e.addEventListener("contextmenu",this._eventListeners.onContextMenuNote),e.addEventListener("mouseenter",this._eventListeners.onMouseEnterNote),e.addEventListener("mouseleave",this._eventListeners.onMouseLeave),this._notesHTML.push(e))})),this._paneData.appendChild(this._routeManeuversAndNotesHTML)}clearData(){this._maneuversHTML.forEach((e=>{e.removeEventListener("contextmenu",this._eventListeners.onContextMenuManeuver),e.removeEventListener("mouseenter",this._eventListeners.onMouseEnterManeuver),e.removeEventListener("mouseleave",this._eventListeners.onMouseLeave)})),this._maneuversHTML.length=0,this._notesHTML.forEach((e=>{e.removeEventListener("contextmenu",this._eventListeners.onContextMenuNote),e.removeEventListener("mouseenter",this._eventListeners.onMouseEnterNote),e.removeEventListener("mouseleave",this._eventListeners.onMouseLeave)})),this._notesHTML.length=0,this._routeManeuversAndNotesHTML&&this._paneData.removeChild(this._routeManeuversAndNotesHTML),this._routeManeuversAndNotesHTML=null}}class An extends Ln{_itineraryDataUI=null;_itineraryControlUI=null;constructor(e,t){super(e,t),this._itineraryDataUI=new jn(this.paneData),this._itineraryControlUI=new En(this.paneControl,this._itineraryDataUI)}remove(){this._itineraryDataUI.clearData(),this._itineraryControlUI.clearControl()}add(){_!==z.editedRouteObjId&&(this._itineraryDataUI.addData(),this._itineraryControlUI.addControl())}getPaneId(){return s.itineraryPane}getButtonText(){return M.getText("PanesManagerUI - Itinerary")}}class Sn{constructor(){}handleEvent(e){e.stopPropagation();try{e.dataTransfer.setData("ObjId",e.target.dataset.tanObjId),e.dataTransfer.dropEffect="move"}catch(e){e instanceof Error&&console.error(e)}}}class On{constructor(){}handleEvent(e){e.preventDefault()}}class kn{constructor(){}handleEvent(e){e.preventDefault();let t=e.currentTarget,o=t.getBoundingClientRect();ft.travelNoteDropped(Number.parseInt(e.dataTransfer.getData("ObjId")),Number.parseInt(t.dataset.tanObjId),e.clientY-o.top{e.removeEventListener("contextmenu",this._eventListeners.onContextMenu,!1),e.removeEventListener("dragstart",this._eventListeners.onDragStart,!1),e.removeEventListener("drop",this._eventListeners.onDrop,!1)})),this.paneData.removeChild(this._travelNotesDiv)),this._travelNotesDiv=null}add(){this._travelNotesDiv=Be.getTravelNotesHTML("TravelNotes-TravelNotesPaneUI-"),this._travelNotesDiv.addEventListener("dragover",this._eventListeners.onDragOver,!1),this.paneData.appendChild(this._travelNotesDiv),this._travelNotesDiv.childNodes.forEach((e=>{e.draggable=!0,e.addEventListener("contextmenu",this._eventListeners.onContextMenu,!1),e.addEventListener("dragstart",this._eventListeners.onDragStart,!1),e.addEventListener("drop",this._eventListeners.onDrop,!1),e.classList.add("TravelNotes-UI-MoveCursor")}))}getPaneId(){return s.travelNotesPane}getButtonText(){return M.getText("PanesManagerUI - Travel notes")}}class Bn{_objId=_;constructor(e,t){this.name=x.sanitizeToJsString(e),this.items=[],this.filterTagsArray=[],this.elementTypes=["node","way","relation"],this.isSelected=!1,this.isExpanded=!1,this.isRoot=!1,t&&(this.isExpanded=!0,this.isRoot=!0),this._objId=L.nextObjId}get objId(){return this._objId}}const Un=new class{_dictionary=null;_itemsMap=null;_itemsArray=[];_filterTagsArray=null;_currentItem=null;_parseLine(e){let t=e.split(";");for(;""===t[t.length-1];)t.pop();let o=0,n=null;t.forEach((e=>{if(""!==e)if(p===e.indexOf("="))this._currentItem=new Bn(e),this._itemsMap.set(this._currentItem.objId,this._currentItem),this._itemsArray[o].push(this._currentItem),this._itemsArray[o+1]=this._currentItem.items,this._filterTagsArray=this._currentItem.filterTagsArray;else{let t=e.split("=");if("element"===t[0])this._currentItem.elementTypes=[t[1]];else{let e={};e[t[0]]="*"===t[1]?null:t[1],n=n||[],n.push(e)}}o++})),n&&this._filterTagsArray.push(n)}constructor(){this._itemsMap=new Map,this._dictionary=new Bn("All",!0),this._itemsMap.set(this._dictionary.objId,this._dictionary),this._itemsArray=[this._dictionary.items]}parseDictionary(e){e.split(/\r\n|\r|\n/).forEach((e=>{""!==e&&this._parseLine(e)}))}_selectItem(e,t){e.isSelected=t,e.items.forEach((e=>{this._selectItem(e,t)}))}selectItemObjId(e,t){let o=this._itemsMap.get(e);this._selectItem(o,t)}changeExpanded(e){let t=this._itemsMap.get(e);t.isExpanded=!t.isExpanded}expandBranch(e){e.items.forEach((e=>{this.expandBranch(e)})),e.isExpanded=!0}collapseBranch(e){e.items.forEach((e=>{this.collapseBranch(e)})),e.isRoot||(e.isExpanded=!1)}clearBranch(e){e.items.forEach((e=>{this.clearBranch(e)})),e.isSelected=!1}get dictionary(){return this._dictionary}};const Kn=new class{_searchStarted=!1;_filterItems=[];_previousSearchBounds=null;_filterOsmElement(e,t){let o=!0;return t.forEach((t=>{let[n,a]=Object.entries(t)[0];o=o&&e.tags[n]&&(!a||e.tags[n]===a)})),o}_addPointOfInterest(e,t){this._filterItems.forEach((o=>{o.filterTagsArray.forEach((n=>{this._filterOsmElement(e,n)&&(e.description=o.name,t.set(e.id,e))}))}))}_getSearchQueries(){let e=[],t=new Map;this._filterItems.forEach((e=>{e.filterTagsArray.forEach((o=>{let[n,a]=Object.entries(o[0])[0],s=t.get(n);s||(s={values:new Map,elements:new Map},t.set(n,s)),s.values.set(a,a),e.elementTypes.forEach((e=>{s.elements.set(e,e)}))}))}));let o=this._computeSearchBounds();this._previousSearchBounds=o;let n="("+o.getSouthWest().lat.toFixed(r.fixed)+","+o.getSouthWest().lng.toFixed(r.fixed)+","+o.getNorthEast().lat.toFixed(r.fixed)+","+o.getNorthEast().lng.toFixed(r.fixed)+")";return t.forEach(((t,o)=>{let a='"'+o+'"';if(1===t.values.size){let e=t.values.values().next().value;e&&(a+='="'+e+'"')}else 1{a+=e+"|"})),a=a.substr(0,a.length-1)+'"');let s=1===t.elements.size?t.elements.values().next().value:"nwr";e.push(s+"["+a+"]"+n+";"+("node"===s?"":"(._;>;);")+"out;")})),e}_searchFilters(e){e.isSelected&&0this._searchFilters(e)))}_computeSearchBounds(){let e=z.map.getCenter(),t=z.map.getBounds(),o=G.getSquareBoundingBox([e.lat,e.lng],5e3);return t.getSouthWest().lat=Math.max(t.getSouthWest().lat,o.getSouthWest().lat),t.getSouthWest().lng=Math.max(t.getSouthWest().lng,o.getSouthWest().lng),t.getNorthEast().lat=Math.min(t.getNorthEast().lat,o.getNorthEast().lat),t.getNorthEast().lng=Math.min(t.getNorthEast().lng,o.getNorthEast().lng),t}constructor(){}async search(){if(this._searchStarted)return;this._searchStarted=!0,this._filterItems=[],this._searchFilters(Un.dictionary);let e=new Qe({searchPlaces:!1});await e.loadData(this._getSearchQueries());let t=new Map;[e.nodes,e.ways,e.relations].forEach((e=>{e.forEach((e=>{e.tags&&this._addPointOfInterest(e,t)}))})),z.searchData=Array.from(t.values()).sort(((e,t)=>e.description>t.description)),this._searchStarted=!1,xe.dispatch("showsearch")}get searchBounds(){return this._computeSearchBounds()}get previousSearchBounds(){return this._previousSearchBounds}};class Fn{_previousSearchLimitObjId=_;_searchLimitObjId=_;_drawSearchLimit(){_===this._searchLimitObjId?this._searchLimitObjId=L.nextObjId:xe.dispatch("removeobject",{objId:this._searchLimitObjId}),xe.dispatch("addrectangle",{objId:this._searchLimitObjId,bounds:Kn.searchBounds,properties:e.osmSearch.nextSearchLimit})}_drawPreviousSearchlimit(){let t=Kn.previousSearchBounds;t&&(_===this._previousSearchLimitObjId?this._previousSearchLimitObjId=L.nextObjId:xe.dispatch("removeobject",{objId:this._previousSearchLimitObjId}),xe.dispatch("addrectangle",{objId:this._previousSearchLimitObjId,bounds:[[t.getSouthWest().lat,t.getSouthWest().lng],[t.getNorthEast().lat,t.getNorthEast().lng]],properties:e.osmSearch.previousSearchLimit}))}constructor(){}show(){z.map.on("zoom",this._drawSearchLimit,this),z.map.on("move",this._drawSearchLimit,this),this._drawSearchLimit(),this._drawPreviousSearchlimit()}hide(){z.map.off("zoom",this._drawSearchLimit,this),z.map.off("move",this._drawSearchLimit,this),_!==this._searchLimitObjId&&(xe.dispatch("removeobject",{objId:this._searchLimitObjId}),this._searchLimitObjId=_),_!==this._previousSearchLimitObjId&&(xe.dispatch("removeobject",{objId:this._previousSearchLimitObjId}),this._previousSearchLimitObjId=_)}}class Vn extends Ye{_osmElement=null;_latLng=r.defaultValue;constructor(e,t=null){super(e,t),this._osmElement=z.searchData[Number.parseInt(e.currentTarget.dataset.tanElementIndex)],this._latLng=[this._osmElement.lat,this._osmElement.lon]}doAction(e){switch(e){case 0:oo.setStartPoint(this._latLng);break;case 1:oo.addWayPoint(this._latLng);break;case 2:oo.setEndPoint(this._latLng);break;case 3:ft.newSearchNote({osmElement:this._osmElement,isTravelNote:!1});break;case 4:ft.newSearchNote({osmElement:this._osmElement,isTravelNote:!0});break;case 5:ft.changeOsmSearchNoteDialog();break;case 6:(new Rt).zoomToPoi({latLng:this._latLng,geometry:this._osmElement.geometry})}}get menuItems(){return[{itemText:M.getText("MapContextMenu - Select this point as start point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.first.lat},{itemText:M.getText("MapContextMenu - Select this point as way point"),isActive:_!==z.editedRouteObjId},{itemText:M.getText("MapContextMenu - Select this point as end point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.last.lat},{itemText:M.getText("OsmSearchContextMenu - Create a route note with this result"),isActive:!0},{itemText:M.getText("OsmSearchContextMenu - Create a travel note with this result"),isActive:!0},{itemText:M.getText(ft.osmSearchNoteDialog?"OsmSearchContextMenu - Hide note dialog":"OsmSearchContextMenu - Show note dialog"),isActive:!0},{itemText:M.getText("OsmSearchContextMenu - Zoom to this result"),isActive:!0}]}}class Wn{constructor(){}handleEvent(e){e.stopPropagation(),e.preventDefault(),new Vn(e,this.paneDataDiv).show()}}class zn{constructor(){}handleEvent(e){e.stopPropagation();let t=z.searchData[Number.parseInt(e.target.dataset.tanElementIndex)];xe.dispatch("addsearchpointmarker",{objId:Number.parseInt(e.target.dataset.tanObjId),latLng:[t.lat,t.lon],geometry:t.geometry})}}class Gn{constructor(){}handleEvent(e){e.stopPropagation(),xe.dispatch("removeobject",{objId:Number.parseInt(e.target.dataset.tanObjId)})}}class Xn{_paneData=null;_currentOsmElement=null;_currentHtmlElement=null;_elementIndex=0;_eventListeners={onContextMenu:null,onMouseEnter:null,onMouseLeave:null};_buildIcon(){let e="";e=this._currentOsmElement.tags.rcn_ref?"
"+this._currentOsmElement.tags.rcn_ref+"
":Je.getIconContentFromName(this._currentOsmElement.description)||"";let t=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-IconCell"},this._currentHtmlElement);x.sanitizeToHtmlElement(e,t)}_addOsmTag(e,t){e&&Y.create("div",{textContent:e},t)}_addAddress(e){let t=(this._currentOsmElement.tags["addr:street"]?(this._currentOsmElement.tags["addr:housenumber"]?this._currentOsmElement.tags["addr:housenumber"]+" ":"")+this._currentOsmElement.tags["addr:street"]+" ":"")+(this._currentOsmElement.tags["addr:city"]?(this._currentOsmElement.tags["addr:postcode"]?this._currentOsmElement.tags["addr:postcode"]+" ":"")+this._currentOsmElement.tags["addr:city"]:"");""!==t&&this._addOsmTag(t,e)}_addPhone(e){this._currentOsmElement.tags.phone&&this._addOsmTag("☎️ : "+this._currentOsmElement.tags.phone,e)}_addMail(e){this._currentOsmElement.tags.email&&Y.create("a",{href:"mailto:"+this._currentOsmElement.tags.email,textContent:this._currentOsmElement.tags.email},Y.create("div",{textContent:"📧 : "},e))}_addWebSite(e){this._currentOsmElement.tags.website&&Y.create("a",{href:this._currentOsmElement.tags.website,target:"_blank",textContent:this._currentOsmElement.tags.website},Y.create("div",null,e))}_addOsmData(){let e=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Cell"},this._currentHtmlElement);this._addOsmTag(this._currentOsmElement.description,e),this._addOsmTag(this._currentOsmElement.tags.name,e),this._addOsmTag(this._currentOsmElement.tags.rcn_ref,e),this._addAddress(e),this._addPhone(e),this._addMail(e),this._addWebSite(e)}_addTitle(){for(const[e,t]of Object.entries(this._currentOsmElement.tags))this._currentHtmlElement.title+=e+"="+t+"\n"}_addEventListeners(){this._currentHtmlElement.addEventListener("contextmenu",this._eventListeners.onContextMenu,!1),this._currentHtmlElement.addEventListener("mouseenter",this._eventListeners.onMouseEnter,!1),this._currentHtmlElement.addEventListener("mouseleave",this._eventListeners.onMouseLeave,!1)}_buildHtmlElement(e){this._currentHtmlElement=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Row",dataset:{ObjId:L.nextObjId,ElementIndex:this._elementIndex++}},e),this._buildIcon(),this._addOsmData(),this._addTitle(),this._addEventListeners()}constructor(e){this._paneData=e,this._eventListeners.onContextMenu=new Wn,this._eventListeners.onMouseEnter=new zn,this._eventListeners.onMouseLeave=new Gn}addData(){this._currentOsmElement=null,this._currentHtmlElement=null,this._elementIndex=0,z.searchData.forEach((e=>{this._currentOsmElement=e,this._buildHtmlElement(this._paneData)}))}clearData(){for(;this._paneData.firstChild;)this._paneData.firstChild.removeEventListener("contextmenu",this._eventListeners.onContextMenu,!1),this._paneData.firstChild.removeEventListener("mouseenter",this._eventListeners.onMouseEnter,!1),this._paneData.firstChild.removeEventListener("mouseleave",this._eventListeners.onMouseLeave,!1),xe.dispatch("removeobject",{objId:Number.parseInt(this._paneData.firstChild.dataset.tanObjId)}),this._paneData.removeChild(this._paneData.firstChild)}}class Zn{_osmSearchTreeUI=null;_osmSearchWaitUI=null;constructor(e,t){this._osmSearchTreeUI=e,this._osmSearchWaitUI=t}handleEvent(e){e.stopPropagation(),Un.dictionary.isExpanded=!1,this._osmSearchTreeUI.redraw(),z.searchData.length=0,xe.dispatch("showsearch"),this._osmSearchWaitUI.showWait(),Kn.search()}}class Yn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.expandBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class Jn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.collapseBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class qn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.clearBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class Qn{_toolbarHTMLElement=null;constructor(e,t){this._toolbarHTMLElement=Y.create("div"),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Search OpenStreetMap"),textContent:"🔎"},this._toolbarHTMLElement).addEventListener("click",new Zn(e,t),!1),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Expand tree"),textContent:"▼"},this._toolbarHTMLElement).addEventListener("click",new Yn(e),!1),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Collapse tree"),textContent:"▶"},this._toolbarHTMLElement).addEventListener("click",new Jn(e),!1),Y.create("div",{id:"TravelNotes-OsmSearchPaneUI-ClearAllButton",className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Clear tree"),textContent:"❌"},this._toolbarHTMLElement).addEventListener("click",new qn(e),!1)}get toolbarHTMLElement(){return this._toolbarHTMLElement}}class $n{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.selectItemObjId(Number.parseInt(e.target.parentNode.dataset.tanObjId),e.target.checked),this._osmSearchTreeUI.redraw()}}class ea{constructor(){}handleEvent(e){e.stopPropagation(),e.deltaY&&(e.target.scrollTop+=e.deltaY*v[e.deltaMode]),e.stopPropagation()}}class ta{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.changeExpanded(Number.parseInt(e.target.parentNode.dataset.tanObjId)),this._osmSearchTreeUI.redraw()}}class oa{_treeHTMLElement=null;_eventListeners={onClickArrow:null,onChangeCheckbox:null};_deepTree=0;_addItem(e){this._deepTree++;let t=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchItem TravelNotes-OsmSearchPaneUI-SearchItemMargin"+this._deepTree,dataset:{ObjId:e.objId}},this._treeHTMLElement);if(!e.isRoot){Y.create("input",{type:"checkbox",checked:e.isSelected},t).addEventListener("change",this._eventListeners.onChangeCheckbox,!1)}if(0===e.filterTagsArray.length){Y.create("div",{className:"TravelNotes-UI-Button TravelNotes-OsmSearchPaneUI-TreeArrow",textContent:e.isExpanded?"▼":"▶"},t).addEventListener("click",this._eventListeners.onClickArrow,!1)}Y.create("text",{value:e.name},t),e.isExpanded&&e.items.forEach((e=>this._addItem(e))),this._deepTree--}constructor(){this._eventListeners.onChangeCheckbox=new $n(this),this._eventListeners.onClickArrow=new ta(this),this._treeHTMLElement=Y.create("div",{id:"TravelNotes-OsmSearchPaneUI-SearchTree"}),this._treeHTMLElement.addEventListener("wheel",new ea,!1),Un.dictionary.name="",this._addItem(Un.dictionary)}redraw(){this._treeHTMLElement.textContent="",this._addItem(Un.dictionary)}get treeHTMLElement(){return this._treeHTMLElement}}class na{_waitDiv=null;_waitBullet=null;constructor(){this._waitDiv=Y.create("div",{className:"TravelNotes-WaitAnimation"}),this._waitDiv.classList.add("TravelNotes-Hidden")}showWait(){this._waitBullet=Y.create("div",{className:"TravelNotes-WaitAnimationBullet"},this._waitDiv),this._waitDiv.classList.remove("TravelNotes-Hidden")}hideWait(){this._waitBullet&&(this._waitDiv.removeChild(this._waitBullet),this._waitBullet=null),this._waitDiv.classList.add("TravelNotes-Hidden")}get waitHTMLElement(){return this._waitDiv}}class aa{_osmSearchTreeUI=null;_osmSearchToolbar=null;_osmSearchWaitUI=null;_paneControl=null;constructor(e){this._paneControl=e,this._osmSearchTreeUI=new oa,this._osmSearchWaitUI=new na,this._osmSearchToolbar=new Qn(this._osmSearchTreeUI,this._osmSearchWaitUI)}addControl(){this._paneControl.appendChild(this._osmSearchToolbar.toolbarHTMLElement),this._paneControl.appendChild(this._osmSearchTreeUI.treeHTMLElement),this._paneControl.appendChild(this._osmSearchWaitUI.waitHTMLElement)}clearControl(){this._paneControl.removeChild(this._osmSearchTreeUI.treeHTMLElement),this._paneControl.removeChild(this._osmSearchToolbar.toolbarHTMLElement),this._osmSearchWaitUI.hideWait(),this._paneControl.removeChild(this._osmSearchWaitUI.waitHTMLElement)}}class sa extends Ln{_osmSearchDataUI=new Xn(this.paneData);_osmSearchControlUI=new aa(this.paneControl);_osmSearchLimitsUI=new Fn;_addControls(){this._osmSearchControlUI.addControl(this.paneControlDiv)}_addData(){this._osmSearchDataUI.addData(this.paneDataDiv)}_clearPaneControlDiv(){this._osmSearchControlUI.clearControl(this.paneControlDiv)}_clearPaneDataDiv(){this._osmSearchDataUI.clearData(this.paneDataDiv)}constructor(e,t){super(e,t)}remove(){this._osmSearchLimitsUI.hide(),this._clearPaneDataDiv(),this._clearPaneControlDiv()}add(){this._osmSearchLimitsUI.show(),this._addControls(),this._addData()}getPaneId(){return s.searchPane}getButtonText(){return M.getText("PanesManagerUI - Search")}}const ia=new class{_mainHTMLElement=null;_travelNotesToolbarUI=null;_travelUI=null;_panesManagerUI=null;_providersToolbarUI=null;_timerId=null;_titleHTMLElement=null;_isPinned=!1;_addMouseEventListeners(){this._mainHTMLElement.addEventListener("click",(e=>{e.target.id&&"TravelNotes-UI-MainDiv"===e.target.id&&(e.stopPropagation(),e.preventDefault())}),!1),this._mainHTMLElement.addEventListener("dblclick",(e=>{e.stopPropagation(),e.preventDefault()}),!1),this._mainHTMLElement.addEventListener("contextmenu",(e=>{e.stopPropagation(),e.preventDefault()}),!1),this._mainHTMLElement.addEventListener("wheel",(e=>{e.stopPropagation(),e.preventDefault()}),!1)}_onMouseLeave(){this._isPinned||(this._timerId=setTimeout((()=>this._hide()),e.travelEditor.timeout))}_show(){if(this._isPinned)return;this._timerId&&(clearTimeout(this._timerId),this._timerId=null),this._mainHTMLElement.classList.remove("TravelNotes-UI-Minimized"),this._titleHTMLElement.classList.add("TravelNotes-Hidden");let e=this._mainHTMLElement.childNodes;for(let t=1;tthis._show()),!1),this._mainHTMLElement.addEventListener("mouseleave",(()=>this._onMouseLeave()),!1),this._addMouseEventListeners(),e.travelEditor.startMinimized?(this._hide(),this._isPinned=!1):(this._show(),this._isPinned=!0))}get travelNotesToolbarUI(){return this._travelNotesToolbarUI}get travelUI(){return this._travelUI}get panesManagerUI(){return this._panesManagerUI}get providersToolbarUI(){return this._providersToolbarUI}};class ra{constructor(){}openDistantFile(e){(new Co).decompress(e),z.travel.readOnly=!0,document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name);let t=z.travel.routes.iterator;for(;!t.done;)l.notEdited===t.value.editionStatus&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:t.value.objId});_!==z.editedRouteObjId&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:z.travel.editedRoute.objId});let o=z.travel.notes.iterator;for(;!o.done;)xe.dispatch("noteupdated",{removedNoteObjId:_,addedNoteObjId:o.value.objId});(new Rt).zoomToTravel()}}class la extends le{_aboutDiv=null;constructor(e={}){super(e),this._aboutDiv=Y.create("div",{id:"TravelNotes-AboutDialog-AboutDiv"}),x.sanitizeToHtmlElement('

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version.

Copyright - 2017 2021 - wwwouaiebe

Contact : https://www.ouaie.be/

GitHub : https://github.com/wwwouaiebe/leaflet.TravelNotes

Version : v3.0.0-RC1.

This program uses: leaflet, Project-OSRM/osrm-text-instructions and the Overpass API

',this._aboutDiv)}get contentHTMLElements(){return[this._aboutDiv]}get title(){return M.getText("AboutDialog - About Travel & Notes")}}class da extends Ye{_latLng=r.defaultValue;constructor(e,t=null){super(e,t),this._latLng=[this.eventData.lat,this.eventData.lng]}doAction(e){switch(e){case 0:oo.setStartPoint(this._latLng);break;case 1:oo.addWayPoint(this._latLng);break;case 2:oo.setEndPoint(this._latLng);break;case 3:$t.addRoute();break;case 4:$t.hideRoutes();break;case 5:$t.showRoutes();break;case 6:ft.newTravelNote(this._latLng);break;case 7:ft.hideNotes();break;case 8:ft.showNotes();break;case 9:(new Rt).zoomToTravel();break;case 10:(new la).show().catch((()=>{}))}}get menuItems(){return[{itemText:M.getText("MapContextMenu - Select this point as start point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.first.lat},{itemText:M.getText("MapContextMenu - Select this point as way point"),isActive:_!==z.editedRouteObjId},{itemText:M.getText("MapContextMenu - Select this point as end point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.last.lat},{itemText:M.getText("MapContextMenu - Add a route"),isActive:!0},{itemText:M.getText("MapContextMenu - Hide all routes"),isActive:!0},{itemText:M.getText("MapContextMenu - Show all routes"),isActive:!0},{itemText:M.getText("MapContextMenu - New travel note"),isActive:!0},{itemText:M.getText("MapContextMenu - Hide all notes"),isActive:!0},{itemText:M.getText("MapContextMenu - Show all notes"),isActive:!0},{itemText:M.getText("MapContextMenu - Zoom to travel"),isActive:!0},{itemText:M.getText("MapContextMenu - About Travel & Notes"),isActive:!0}]}}const ha=new class{_travelNotesLoaded=!1;async _loadDistantTravel(e){let t=await fetch(e);if(g===t.status&&t.ok){let e=await t.json();(new ra).openDistantFile(e)}else z.map.setView([r.defaultValue,r.defaultValue],2),document.title="Travel & Notes"}constructor(){}addReadOnlyMap(e,t){this._travelNotesLoaded||(this._travelNotesLoaded=!0,e&&(z.map=e),So.createUI(),Vo.setMapLayer("OSM - Color"),this._loadDistantTravel(t))}addControl(t,n){this._travelNotesLoaded||(this._travelNotesLoaded=!0,t&&(z.map=t,z.map.on("contextmenu",(e=>new da(e).show()))),z.travel=new W,z.travel.routes.add(new F),ia.createUI(document.getElementById(n)),So.createUI(),Pe.setKeysFromServerFile(),e.layersToolbarUI.haveLayersToolbarUI?Vo.createUI():Vo.setMapLayer("OSM - Color"),e.mouseUI.haveMouseUI&&Mo.createUI(),e.travelEditor.startupRouteEdition&&$t.editRoute(z.travel.routes.first.objId),xe.dispatch("setrouteslist"),xe.dispatch("roadbookupdate"),z.map.setView([e.map.center.lat,e.map.center.lng],e.map.zoom),Me.showHelp("

"+M.getText("Help - Continue with interface1")+"

"+M.getText("Help - Continue with interface2")+"

"),document.title="Travel & Notes",Mo.saveStatus=o.saved)}addProvider(e){Pe.addProvider(e)}showInfo(e){Me.showInfo(e)}get overpassApiUrl(){return e.overpassApi.url}get map(){return z.map}get version(){return D}};class ca{_copyObjectTo(e,t){if("object"==typeof e&&"object"==typeof t){for(let o in t)"object"==typeof t[o]?this._copyObjectTo(e[o],t[o]):typeof e[o]==typeof t[o]&&("string"==typeof t[o]?t[o]="color"===o?x.sanitizeToColor(e[o])||t[o]:"url"===o?x.sanitizeToUrl(e[o]).url:x.sanitizeToJsString(e[o]):t[o]=e[o]||t[o]);for(let o in e)"object"==typeof e[o]?("[object Array]"===Object.prototype.toString.call(e[o])?t[o]=t[o]||[]:t[o]=t[o]||{},this._copyObjectTo(e[o],t[o])):"string"==typeof t.property?t[o]=x.sanitizeToHtmlString(e[o],[]).htmlString:t[o]=e[o]}}_freeze(e){for(let t in e)"object"==typeof e[t]&&this._freeze(e[t]);Object.freeze(e)}constructor(){}overload(t){this._copyObjectTo(t,e),this._freeze(e)}}class ua{constructor(){}handleEvent(){Mo.saveStatus=o.modified,P.storageAvailable("localStorage")&&No.getOpenPromise().then((()=>{No.getWritePromise(z.UUID,xo.getTravelHTML("TravelNotes-Roadbook-").outerHTML)})).then((()=>localStorage.setItem(z.UUID,Date.now()))).catch((e=>{e instanceof Error&&console.error(e)}))}}(new class{_travelUrl=null;_language=null;_originAndPath=window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"TravelNotes";_errorMessage="";_addEventsListeners(){document.addEventListener("routeupdated",(e=>{e.data&&fo.updateRoute(e.data.removedRouteObjId,e.data.addedRouteObjId)}),!1),document.addEventListener("routepropertiesupdated",(e=>{e.data&&fo.updateRouteProperties(e.data.routeObjId)}),!1),document.addEventListener("noteupdated",(e=>{e.data&&fo.updateNote(e.data.removedNoteObjId,e.data.addedNoteObjId)}),!1),document.addEventListener("removeobject",(e=>{e.data&&fo.removeObject(e.data.objId)}),!1),document.addEventListener("removeallobjects",(()=>fo.removeAllObjects()),!1),document.addEventListener("zoomto",(e=>{e.data&&fo.zoomTo(e.data.latLng,e.data.geometry)}),!1),document.addEventListener("additinerarypointmarker",(e=>{e.data&&fo.addItineraryPointMarker(e.data.objId,e.data.latLng)}),!1),document.addEventListener("addsearchpointmarker",(e=>{e.data&&fo.addSearchPointMarker(e.data.objId,e.data.latLng,e.data.geometry)}),!1),document.addEventListener("addrectangle",(e=>{e.data&&fo.addRectangle(e.data.objId,e.data.bounds,e.data.properties)}),!1),document.addEventListener("addwaypoint",(e=>{e.data&&fo.addWayPoint(e.data.wayPoint,e.data.letter)}),!1),document.addEventListener("layerchange",(e=>{e.data&&fo.setLayer(e.data.layer)})),document.addEventListener("geolocationpositionchanged",(e=>{e.data&&fo.onGeolocationPositionChanged(e.data.position)}),!1),document.addEventListener("geolocationstatuschanged",(e=>{e.data&&fo.onGeolocationStatusChanged(e.data.status)}),!1),document.addEventListener("roadbookupdate",new ua,!1),document.addEventListener("profileclosed",(e=>{e.data&&Wt.onProfileClosed(e.data.objId)}),!1),document.addEventListener("uipinned",(()=>ia.pin()),!1),document.addEventListener("geolocationstatuschanged",(e=>{ia.travelNotesToolbarUI.geoLocationStatusChanged(e.data.status)}),!1),document.addEventListener("travelnameupdated",(()=>ia.travelUI.setTravelName()),!1),document.addEventListener("setrouteslist",(()=>ia.travelUI.routesListUI.setRoutesList()),!1),document.addEventListener("showitinerary",(()=>ia.panesManagerUI.showPane(s.itineraryPane)),!1),document.addEventListener("updateitinerary",(()=>ia.panesManagerUI.updatePane(s.itineraryPane)),!1),document.addEventListener("showtravelnotes",(()=>ia.panesManagerUI.showPane(s.travelNotesPane)),!1),document.addEventListener("updatetravelnotes",(()=>ia.panesManagerUI.updatePane(s.travelNotesPane)),!1),document.addEventListener("showsearch",(()=>ia.panesManagerUI.showPane(s.searchPane)),!1),document.addEventListener("updatesearch",(()=>ia.panesManagerUI.updatePane(s.searchPane)),!1),document.addEventListener("providersadded",(()=>ia.providersToolbarUI.providersAdded()),!1),document.addEventListener("setprovider",(e=>{e.data&&e.data.provider&&(ia.providersToolbarUI.provider=e.data.provider)}),!1),document.addEventListener("settransitmode",(e=>{e.data&&e.data.transitMode&&(ia.providersToolbarUI.transitMode=e.data.transitMode)}),!1)}_addUnloadEventsListeners(){window.addEventListener("unload",(()=>localStorage.removeItem(z.UUID))),window.addEventListener("beforeunload",(t=>{if(No.closeDb(z.UUID),e.travelNotes.haveBeforeUnloadWarning)return t.returnValue="x","x"}))}_readURL(){let e=new URL(window.location),t=e.searchParams.get("fil");if(t&&0!==t.length)try{if(t=atob(t),t.match(/[^\w-%:./]/))throw new Error("invalid char in the url encoded in the fil parameter");let o=new URL(t);if(!(e.protocol&&o.protocol&&e.protocol===o.protocol&&e.hostname&&o.hostname&&e.hostname===o.hostname))throw new Error("The distant file is not on the same site than the app");this._travelUrl=encodeURI(o.href)}catch(e){e instanceof Error&&console.error(e)}let o=e.searchParams.get("lng");o&&o.match(/^[A-Z,a-z]{2}$/)&&(this._language=o.toLowerCase())}async _loadConfig(){let t=await fetch(this._originAndPath+"Config.json");if(g===t.status&&t.ok){let o=await t.json();return o.travelNotes.language=this._language||o.travelNotes.language,"wwwouaiebe.github.io"===window.location.hostname&&(o.APIKeysDialog.haveUnsecureButtons=!0,o.errorsUI.showHelp=!0,o.layersToolbarUI.theDevil.addButton=!1,o.note.maxManeuversNotes=10,o.note.haveBackground=!0,o.noteDialog.theDevil.addButton=!1,o.printRouteMap.maxTiles=120,o.route.showDragTooltip=p),(new ca).overload(o),z.providers.forEach((t=>{t.userLanguage=e.travelNotes.language})),!0}return!1}async _loadTranslations(e,t){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(M.setTranslations(await e.value.json()),!0):"fulfilled"===t.status&&g===t.value.status&&t.value.ok?(M.setTranslations(await t.value.json()),this._errorMessage+="Not possible to load the TravelNotes"+this._language.toUpperCase()+".json file. English will be used. ",!0):(this._errorMessage+="Not possible to load the translations. ",!1)}async _loadNoteDialogConfig(e,t){if("fulfilled"===e.status&&g===e.value.status&&e.value.ok){let t=await e.value.json();return Je.loadJson(t),!0}if("fulfilled"===t.status&&g===t.value.status&&t.value.ok){let e=await t.value.json();return Je.loadJson(e),this._errorMessage+="Not possible to load the TravelNotesNoteDialog"+this._language.toUpperCase()+".json file. English will be used. ",!0}return this._errorMessage+="Not possible to load the translations for the note dialog. ",!1}async _loadOsmSearchDictionary(e,t){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(Un.parseDictionary(await e.value.text()),!0):"fulfilled"===t.status&&g===t.value.status&&t.value.ok?(Un.parseDictionary(await t.value.text()),this._errorMessage+="Not possible to load the TravelNotesSearchDictionary"+this._language.toUpperCase()+".csv file. English will be used. ",!0):(this._errorMessage+="Not possible to load the search dictionary. OSM search will not be available.",!0)}async _loadMapLayers(e){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(Zt.addMapLayers(await e.value.json()),!0):(this._errorMessage+="Not possible to load the TravelNotesLayers.json file. Only the OpenStreetMap background will be available. ",!0)}async _loadJsonFiles(){let e=await Promise.allSettled([fetch(this._originAndPath+this._language.toUpperCase()+".json"),fetch(this._originAndPath+"EN.json"),fetch(this._originAndPath+"NoteDialog"+this._language.toUpperCase()+".json"),fetch(this._originAndPath+"NoteDialogEN.json"),fetch(this._originAndPath+"SearchDictionary"+this._language.toUpperCase()+".csv"),fetch(this._originAndPath+"SearchDictionaryEN.csv"),fetch(this._originAndPath+"Layers.json")]),t=await this._loadTranslations(e[0],e[1])&&await this._loadNoteDialogConfig(e[2],e[3])&&await this._loadOsmSearchDictionary(e[4],e[5])&&await this._loadMapLayers(e[6]);return""!==this._errorMessage&&t?Me.showError(this._errorMessage):""!==this._errorMessage&&(document.body.textContent=this._errorMessage),t}_loadTravelNotes(){if(e.travelNotes.autoLoad){let e=document.createElement("div");e.id="TravelNotes-Map",document.body.appendChild(e),Y.create("div",{id:"TravelNotes-UI"},document.body);let t=window.L.map("TravelNotes-Map",{attributionControl:!1,zoomControl:!1}).setView([r.defaultValue,r.defaultValue],0);this._travelUrl?ha.addReadOnlyMap(t,this._travelUrl):(this._addUnloadEventsListeners(),ha.addControl(t,"TravelNotes-UI")),e.focus()}}constructor(){}async loadApp(){this._addEventsListeners(),this._originAndPath=window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"TravelNotes",window.TaN=ha,this._readURL(),await this._loadConfig()?(this._language=this._language||e.travelNotes.language||"fr",Me.createUI(),await this._loadJsonFiles()&&this._loadTravelNotes()):document.body.textContent="Not possible to load the TravelNotesConfig.json file. "}}).loadApp()}(); \ No newline at end of file + */const No=new class{_indexedDb=null;_UUID=null;_data=null;_open(e,t){if(this._indexedDb)return void e();let o=window.indexedDB.open("TravelNotesDb",1);o.onerror=()=>{this._indexedDb=null,t(new Error("Not possible to open the db"))},o.onsuccess=t=>{this._indexedDb=t.target.result,e()},o.onupgradeneeded=e=>{this._indexedDb=e.target.result,this._indexedDb.createObjectStore("Travels",{keyPath:"UUID"})}}_read(e,t){if(!this._indexedDb)return void t(new Error("Database not opened"));let o=this._indexedDb.transaction(["Travels"],"readonly");o.onerror=()=>t(new Error("Transaction error")),o.objectStore("Travels").get(this._UUID).onsuccess=t=>e(t.target.result?t.target.result.data:null)}_write(e,t){if(!this._indexedDb)return void t(new Error("Database not opened"));let o=null;try{o=this._indexedDb.transaction(["Travels"],"readwrite")}catch(e){return void t(e)}o.onerror=()=>t(new Error("Transaction error")),o.objectStore("Travels").put({UUID:this._UUID,data:this._data}).onsuccess=()=>e()}_close(){this._indexedDb.close(),this._indexedDb=null}constructor(){}getOpenPromise(){return new Promise(((e,t)=>this._open(e,t)))}getReadPromise(e){return this._UUID=e,new Promise(((e,t)=>this._read(e,t)))}getWritePromise(e,t){return this._UUID=e,this._data=t,new Promise(((e,t)=>this._write(e,t)))}closeDb(e){if(!this._indexedDb)return;if(!e)return void this._close();let t=this._indexedDb.transaction(["Travels"],"readwrite");t.onerror=()=>{};let o=t.objectStore("Travels").delete(e);o.onerror=()=>this._close(),o.onsuccess=()=>this._close()}};const xo=new class{_getTravelHeaderHTML(t){let o=Y.create("div",{className:t+"Travel-Header"});x.sanitizeToHtmlElement(z.travel.name,Y.create("div",{className:t+"Travel-Header-Name"},o));let a=n.defaultValue,s=0,i=0,r=z.travel.routes.iterator;for(;!r.done;){let n=r.value.objId===z.editedRouteObjId&&e.routeEditor.showEditedRouteInRoadbook?z.travel.editedRoute:r.value;x.sanitizeToHtmlElement(''+n.computedName+" : "+P.formatDistance(n.distance)+".",Y.create("div",{className:t+"Travel-Header-RouteName"},o)),n.chain&&(a+=n.distance,s+=n.itinerary.ascent,i+=n.itinerary.descent)}return x.sanitizeToHtmlElement(""+M.getText("TravelHTMLViewsFactory - Travel distance")+" : "+P.formatDistance(a),Y.create("div",{className:t+"Travel-Header-TravelDistance"},o)),0!==s&&x.sanitizeToHtmlElement(""+M.getText("travelHTMLViewsFactory - Travel ascent")+" : "+String(s.toFixed(0))+" m.",Y.create("div",{className:t+"Travel-Header-TravelAscent"},o)),0!==i&&x.sanitizeToHtmlElement(""+M.getText("TravelHTMLViewsFactory - Travel descent")+" : "+String(i.toFixed(0))+" m.",Y.create("div",{className:t+"Travel-Header-TravelDescent"},o)),o}_getTravelFooterHTML(e){let t=M.getText("TravelHTMLViewsFactory - Travel footer")+'Travel & Notes, © wwwouaiebe 2017 2021 © '+M.getText("TravelHTMLViewsFactory - OpenStreetMap contributors")+"",o=Y.create("div",{className:e+"TravelFooter"});return x.sanitizeToHtmlElement(t,o),o}constructor(){}getTravelHTML(t){let o=Y.create("div",{className:t+"Travel"});o.appendChild(this._getTravelHeaderHTML(t)),o.appendChild(Be.getTravelNotesHTML(t));let n=z.travel.routes.iterator;for(;!n.done;){let a=e.routeEditor.showEditedRouteInRoadbook&&n.value.objId===z.editedRouteObjId?z.travel.editedRoute:n.value;o.appendChild(Ue.getRouteHeaderHTML(t,a)),a.itinerary.hasProfile&&o.appendChild(Ue.getRouteProfileHTML(t,a)),o.appendChild(Ue.getRouteManeuversAndNotesHTML(t,a,!1)),o.appendChild(Ue.getRouteFooterHTML(t,a))}return o.appendChild(this._getTravelFooterHTML(t)),o}};const Mo=new class{_mouseUISpan=null;_saveStatus=o.saved;_mousePosition="";_zoom="";_saveTimer=null;_updateUI(){this._mouseUISpan&&(this._mouseUISpan.textContent=this._saveStatus+" "+this._mousePosition+" - Zoom : "+this._zoom)}constructor(){}set saveStatus(e){o.modified===e&&o.notSaved===this._saveStatus||(this._saveStatus=e,o.modified!==e||this._saveTimer||(this._saveTimer=setTimeout((()=>this._saveStatus=o.notSaved),3e5)),o.saved===e&&this._saveTimer&&(clearTimeout(this._saveTimer),this._saveTimer=null),this._updateUI())}createUI(){this._mouseUISpan=Y.create("span",null,Y.create("div",{id:"TravelNotes-MouseUI"},document.body)),this._zoom=z.map.getZoom(),this._mousePosition=P.formatLat(e.map.center.lat)+" - "+P.formatLng(e.map.center.lng),z.map.on("mousemove",(e=>{this._mousePosition=P.formatLatLng([e.latlng.lat,e.latlng.lng]),this._updateUI()})),z.map.on("zoomend",(()=>{this._zoom=String(z.map.getZoom()),this._updateUI()}))}};const Po=new class{_python2Round(e){return Math.floor(Math.abs(e)+.5)*(0<=e?1:-1)}_encodeDelta(e,t,o){let n=this._python2Round(e*o),a=this._python2Round(t*o),s=n-a;s<<=1,0>n-a&&(s=~s);let i="";for(;32<=s;)i+=String.fromCharCode(63+(32|31&s)),s>>=5;return i+=String.fromCharCode(s+63),i}_index=0;_decodeDelta(e){let t=null,o=0,n=0;do{t=e.charCodeAt(this._index++)-63,n|=(31&t)<>1):n>>1}constructor(){}encode(e,t){if(!e.length)return"";let o=t.length,n=Array.from(t,(e=>Math.pow(10,e))),a="";for(let t=0;tMath.pow(10,e))),s=new Array(o).fill(0);for(;this._index{n.push([e.lat,e.lng,e.distance,e.elev,e.objId])})),o.values=Po.encode(n,[r.fixed,r.fixed,2,2,0]),e.itinerary.itineraryPoints=o}_decompressRoute(e){let t=[];if(e.itinerary.itineraryPoints.values)Po.decode(e.itinerary.itineraryPoints.values,[r.fixed,r.fixed,2,2,0]).forEach((o=>{let a={lat:r.defaultValue,lng:r.defaultValue,distance:n.defaultValue,elev:i.defaultValue,objId:_};[a.lat,a.lng,a.distance,a.elev,a.objId]=o,a.objType=e.itinerary.itineraryPoints.objType,t.push(a)}));else{e.itinerary.itineraryPoints.latLngs=Po.decode(e.itinerary.itineraryPoints.latLngs,[r.fixed,r.fixed]);let o=0;e.itinerary.itineraryPoints.latLngs.forEach((n=>{let a={};a.lat=n[0],a.lng=n[1],a.distance=e.itinerary.itineraryPoints.distances[o],e.itinerary.itineraryPoints.elevs?a.elev=e.itinerary.itineraryPoints.elevs[o]:a.elev=i.defaultValue,a.objId=e.itinerary.itineraryPoints.objIds[o],a.objType=e.itinerary.itineraryPoints.objType,t.push(a),o++}))}e.itinerary.itineraryPoints=t}_decompressTravel(e){e.routes.forEach(this._decompressRoute),e.editedRoute&&this._decompressRoute(e.editedRoute)}constructor(){}decompress(e){this._decompressTravel(e),z.travel.jsonObject=e,z.editedRouteObjId=_,z.travel.routes.forEach((e=>{l.notEdited!==e.editionStatus&&(z.editedRouteObjId=e.objId)}))}decompressMerge(e){this._decompressTravel(e);let t=new W;t.jsonObject=e;let o=t.routes.iterator;for(;!o.done;)z.travel.routes.add(o.value);let n=t.notes.iterator;for(;!n.done;)z.travel.notes.add(n.value)}compress(e){let t=e.jsonObject;return t.routes.forEach(this._compressRoute),this._compressRoute(t.editedRoute),t}}class jo extends le{_removeTravelNotesInput=null;_removeRoutesNotesInput=null;_removeManeuversInput=null;_removeTravelNotesDiv=null;_removeRoutesNotesDiv=null;_removeManeuversDiv=null;_createInputDiv(e){let t=Y.create("div",null),o=Y.create("input",{type:"checkbox",checked:!1},t);return Y.create("text",{value:e},t),[t,o]}constructor(e={}){super(e),[this._removeTravelNotesDiv,this._removeTravelNotesInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Travel Notes")),[this._removeRoutesNotesDiv,this._removeRoutesNotesInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Routes Notes")),[this._removeManeuversDiv,this._removeManeuversInput]=this._createInputDiv(M.getText("SaveAsDialog - Remove Maneuvers"))}onOk(){super.onOk(Object.freeze({removeTravelNotes:this._removeTravelNotesInput.checked,removeRoutesNotes:this._removeRoutesNotesInput.checked,removeManeuvers:this._removeManeuversInput.checked}))}get contentHTMLElements(){return[this._removeTravelNotesDiv,this._removeRoutesNotesDiv,this._removeManeuversDiv]}get title(){return M.getText("SaveAsDialog - SaveAs")}}const Ao=new class{_saveAsTravel(e){let t=new W;t.jsonObject=z.travel.jsonObject,t.name+="-partial";let o=t.routes.iterator;for(;!o.done;)o.value.hidden=!1;if(e.removeTravelNotes&&t.notes.removeAll(),e.removeRoutesNotes)for(o=t.routes.iterator;!o.done;)o.value.notes.removeAll();if(e.removeManeuvers)for(o=t.routes.iterator;!o.done;)o.value.itinerary.maneuvers.removeAll();let n=(new Co).compress(t);P.saveFile(n.name+".trv",JSON.stringify(n),"application/json")}constructor(){}routeDropped(e,t,o){let n=e===z.travel.editedRoute.objId?z.editedRouteObjId:e,a=t===z.travel.editedRoute.objId?z.editedRouteObjId:t;z.travel.routes.moveTo(n,a,o),$t.chainRoutes(),xe.dispatch("setrouteslist"),xe.dispatch("roadbookupdate")}saveAsTravel(){""!==z.travel.name?_===z.editedRouteObjId?(new jo).show().then((e=>{this._saveAsTravel(e)})).catch((e=>{e instanceof Error&&console.error(e)})):Me.showError(M.getText("TravelEditor - Not possible to partial save when a route is edited.")):Me.showError(M.getText("TravelEditor - Gives a name to the travel"))}saveTravel(){if(""===z.travel.name)return void Me.showError(M.getText("TravelEditor - Gives a name to the travel"));let e=z.travel.routes.iterator;for(;!e.done;)e.value.hidden=!1;let t=(new Co).compress(z.travel);P.saveFile(t.name+".trv",JSON.stringify(t),"application/json"),Mo.saveStatus=o.saved}newTravel(){e.travelNotes.haveBeforeUnloadWarning&&!window.confirm(M.getText("TravelEditor - This page ask to close; data are perhaps not saved."))||(Wt.deleteAllProfiles(),xe.dispatch("removeallobjects"),z.travel.editedRoute=new F,z.editedRouteObjId=_,z.travel=new W,z.travel.routes.add(new F),xe.dispatch("setrouteslist"),xe.dispatch("showitinerary"),xe.dispatch("roadbookupdate"),xe.dispatch("travelnameupdated"),e.travelEditor.startupRouteEdition&&$t.editRoute(z.travel.routes.first.objId),Mo.saveStatus=o.saved)}};const So=new class{_attributionsDiv=null;constructor(){}createUI(){this._attributionsDiv=Y.create("div",{id:"TravelNotes-AttributionsUI"},document.body)}set attributions(e){let t='© Leaflet | © OpenStreetMap contributors '+e+'| © Travel & Notes';for(;this._attributionsDiv.firstChild;)this._attributionsDiv.removeChild(this._attributionsDiv.firstChild);x.sanitizeToHtmlElement(t,this._attributionsDiv)}};class Oo{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),e.target.style.color=this._mapLayer.toolbar.backgroundColor,e.target.style["background-color"]=this._mapLayer.toolbar.color}}class ko{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),e.target.style.color=this._mapLayer.toolbar.color,e.target.style["background-color"]=this._mapLayer.toolbar.backgroundColor}}class Ro{_mapLayer=null;constructor(e){this._mapLayer=e}handleEvent(e){e.stopPropagation(),xe.dispatch("layerchange",{layer:this._mapLayer}),So.attributions=this._mapLayer.attribution,z.travel.layerName=this._mapLayer.name}}class Ho{_buttonHTMLElement=null;_eventListeners={mouseEnter:null,mouseLeave:null,click:null};_parentNode=null;constructor(e,t){this._parentNode=t,this._buttonHTMLElement=Y.create("div",{className:"TravelNotes-MapLayersToolbarUI-Button",title:e.name,dataset:{MapLayerName:e.name},textContent:e.toolbar.text,style:"color:"+e.toolbar.color+";background-color:"+e.toolbar.backgroundColor},t),this._eventListeners.mouseEnter=new Oo(e),this._eventListeners.mouseLeave=new ko(e),this._eventListeners.click=new Ro(e),this._buttonHTMLElement.addEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._buttonHTMLElement.addEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._buttonHTMLElement.addEventListener("click",this._eventListeners.click,!1)}destructor(){this._buttonHTMLElement.removeEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._buttonHTMLElement.removeEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._buttonHTMLElement.removeEventListener("click",this._eventListeners.click,!1),this._parentNode.removeChild(this._buttonHTMLElement),this._parentNode=null}get height(){return this._buttonHTMLElement.clientHeight}}class Bo{constructor(){}handleEvent(e){e.stopPropagation(),e.target.classList.add("TravelNotes-MapLayersToolbarUI-LinkButton-Enter"),e.target.classList.remove("TravelNotes-MapLayersToolbarUI-LinkButton-Leave")}}class Uo{constructor(){}handleEvent(e){e.stopPropagation(),e.target.classList.add("TravelNotes-MapLayersToolbarUI-LinkButton-Leave"),e.target.classList.remove("TravelNotes-MapLayersToolbarUI-LinkButton-Enter")}}class Ko{_eventListeners={mouseEnter:null,mouseLeave:null};_linkButton=null;_parentNode=null;constructor(e,t){this._parentNode=t,this._linkButton=Y.create("div",{className:"TravelNotes-MapLayersToolbarUI-Button TravelNotes-MapLayersToolbarUI-LinkButton-Leave"},t),Y.create("a",e,this._linkButton),this._eventListeners.mouseEnter=new Bo,this._eventListeners.mouseLeave=new Uo,this._linkButton.addEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._linkButton.addEventListener("mouseleave",this._eventListeners.mouseLeave,!1)}destructor(){this._linkButton.removeEventListener("mouseenter",this._eventListeners.mouseEnter,!1),this._linkButton.removeEventListener("mouseleave",this._eventListeners.mouseLeave,!1),this._parentNode.removeChild(this._linkButton),this._parentNode=null}get height(){return this._linkButton.clientHeight}}class Fo{_mapLayersToolbarUI=null;_wheelEventData=null;constructor(e,t){this._mapLayersToolbarUI=e,this._wheelEventData=t}handleEvent(e){e.stopPropagation(),e.deltaY&&(this._wheelEventData.marginTop-=e.deltaY*v[e.deltaMode],this._wheelEventData.marginTop=this._wheelEventData.marginTop>this._wheelEventData.buttonTop?this._wheelEventData.buttonTop:this._wheelEventData.marginTop,this._wheelEventData.marginTop=this._wheelEventData.marginTop{if(e.providerKeyNeeded&&Pe.hasKey(e.providerName.toLowerCase())||!e.providerKeyNeeded){let t=new Ho(e,this._buttonsHTMLElement);this._wheelEventData.buttonHeight=t.height,this._wheelEventData.buttonsHeight+=t.height,this._buttonsAndLinks.push(t)}})),e.layersToolbarUI.theDevil&&e.layersToolbarUI.theDevil.addButton){let e=new Ko({href:"https://www.google.com/maps/@"+z.map.getCenter().lat+","+z.map.getCenter().lng+","+z.map.getZoom()+"z",title:"Reminder! The devil will know everything about you",textContent:"👿",target:"_blank"},this._buttonsHTMLElement);this._wheelEventData.buttonsHeight+=e.height,this._buttonsAndLinks.push(e)}this._wheelEventData.buttonTop+=this._wheelEventData.buttonHeight,this._wheelEventData.marginTop=this._wheelEventData.buttonTop,this._buttonsHTMLElement.style.marginTop=String(this._wheelEventData.marginTop)+"px",this._buttonsHTMLElement.addEventListener("wheel",this._onWheelButtonsEventListener,!1)}_hide(){this._buttonsAndLinks.forEach((e=>e.destructor())),this._buttonsAndLinks.length=0,this._buttonsHTMLElement.removeEventListener("wheel",this._onWheelButtonsEventListener,!1),this._mainHTMLElement.removeChild(this._buttonsHTMLElement),this._timerId=null}_onMouseLeave(){this._timerId=setTimeout((()=>this._hide()),e.layersToolbarUI.toolbarTimeOut)}constructor(){this._onWheelButtonsEventListener=new Fo(this,this._wheelEventData)}createUI(){this._mainHTMLElement=Y.create("div",{id:"TravelNotes-MapLayersToolbarUI"},document.body),Y.create("div",{id:"TravelNotes-MapLayersToolbarUI-Header",textContent:M.getText("MapLayersToolbarUI - Layers")},this._mainHTMLElement),this._mainHTMLElement.addEventListener("mouseenter",(()=>this._show()),!1),this._mainHTMLElement.addEventListener("mouseleave",(()=>this._onMouseLeave()),!1),xe.dispatch("layerchange",{layer:Zt.defaultMapLayer}),So.attributions=Zt.defaultMapLayer.attribution}setMapLayer(e){let t=Zt.getMapLayer(e);xe.dispatch("layerchange",{layer:t}),So.attributions=t.attribution,z.travel.layerName=t.name}get buttonsHTMLElement(){return this._buttonsHTMLElement}};class Wo{_display(){xe.dispatch("removeallobjects"),document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name);let e=z.travel.routes.iterator;for(;!e.done;)l.notEdited===e.value.editionStatus&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:e.value.objId});_!==z.editedRouteObjId&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:z.travel.editedRoute.objId});let t=z.travel.notes.iterator;for(;!t.done;)xe.dispatch("noteupdated",{removedNoteObjId:_,addedNoteObjId:t.value.objId});if((new Rt).zoomToTravel(),Vo.setMapLayer(z.travel.layerName),xe.dispatch("setrouteslist"),_!==z.editedRouteObjId){let e=z.travel.editedRoute.itinerary.provider;if(e&&""!==e&&!z.providers.get(e.toLowerCase()))Me.showError(M.getText("FileLoader - Not possible to select as provider",{provider:e}));else{let t=z.travel.editedRoute.itinerary.transitMode;xe.dispatch("setprovider",{provider:e}),t&&""!==t&&xe.dispatch("settransitmode",{transitMode:t})}}$t.chainRoutes(),xe.dispatch("travelnameupdated"),xe.dispatch("showitinerary"),xe.dispatch("roadbookupdate")}_openFile(e,t){try{t?(new Co).decompressMerge(e):(Wt.deleteAllProfiles(),(new Co).decompress(e)),this._display(),t||(Mo.saveStatus=o.saved)}catch(e){Me.showError("An error occurs when reading the file : "+e.message)}}constructor(){}openLocalFile(e){this._openFile(e,!1)}mergeLocalFile(e){this._openFile(e,!0)}}class zo{handleEvent(e){e.stopPropagation(),Ao.saveAsTravel()}}class Go{handleEvent(e){e.stopPropagation(),Ao.newTravel(),document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name)}}class Xo{handleEvent(e){e.stopPropagation(),Ao.saveTravel()}}class Zo{handleEvent(e){e.stopPropagation();let t=new FileReader;t.onload=()=>{let e={};try{e=JSON.parse(t.result),(new Wo).openLocalFile(e)}catch(e){e instanceof Error&&console.error(e)}},t.readAsText(e.target.files[0])}}class Yo{handleEvent(t){t.stopPropagation(),e.travelNotes.haveBeforeUnloadWarning&&!window.confirm(M.getText("TravelEditor - This page ask to close; data are perhaps not saved."))||P.openFile(new Zo,".trv")}}class Jo{handleEvent(e){e.stopPropagation();let t=new FileReader;t.onload=()=>{let e={};try{e=JSON.parse(t.result),(new Wo).mergeLocalFile(e)}catch(e){e instanceof Error&&console.error(e)}},t.readAsText(e.target.files[0])}}class qo{handleEvent(e){e.stopPropagation(),_===z.editedRouteObjId?P.openFile(new Jo,".trv"):Me.showError(M.getText("TravelUI - Not possible to merge a travel when a route is edited"))}}class Qo{_buttonsDiv=null;_createSaveAsTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button TravelNotes-TravelUI-SaveAsButton",title:M.getText("TravelUI - Save as travel"),textContent:"💾"},this._buttonsDiv).addEventListener("click",new zo,!1)}_createCancelTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Cancel travel"),textContent:"❌"},this._buttonsDiv).addEventListener("click",new Go,!1)}_createSaveTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Save travel"),textContent:"💾"},this._buttonsDiv).addEventListener("click",new Xo,!1)}_createOpenTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Open travel"),textContent:"📂"},this._buttonsDiv).addEventListener("click",new Yo,!1)}_createImportTravelButton(){Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Import travel"),textContent:"🌏"},this._buttonsDiv).addEventListener("click",new qo,!1)}_createRoadbookButton(){Y.create("text",{value:"📋"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:"TravelNotesRoadbook.html?lng="+e.travelNotes.language+"&page="+z.UUID,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelUI - Open travel roadbook")},this._buttonsDiv)))}constructor(e){this._buttonsDiv=Y.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e),this._createSaveAsTravelButton(),this._createCancelTravelButton(),this._createSaveTravelButton(),this._createOpenTravelButton(),this._createImportTravelButton(),this._createRoadbookButton()}}class $o{constructor(){}handleEvent(e){e.preventDefault()}}class en{constructor(){}handleEvent(e){e.stopPropagation();try{e.dataTransfer.setData("ObjId",e.target.dataset.tanObjId),e.dataTransfer.dropEffect="move"}catch(e){e instanceof Error&&console.error(e)}}}class tn{constructor(){}handleEvent(e){e.preventDefault();let t=e.target,o=t.getBoundingClientRect();Ao.routeDropped(Number.parseInt(e.dataTransfer.getData("ObjId")),Number.parseInt(t.dataset.tanObjId),e.clientY-o.top{e.dataset.tanPaneId===this._activePaneId?e.classList.add("TravelNotes-PanesManagerUI-ActivePaneButton"):e.classList.remove("TravelNotes-PanesManagerUI-ActivePaneButton")}))}updatePane(e){e===this._activePaneId&&this.showPane(e)}}const vn={bike:'data:image/svg+xml;utf8, ',pedestrian:'data:image/svg+xml;utf8, ',car:'data:image/svg+xml;utf8, ',train:'data:image/svg+xml;utf8, ',line:'data:image/svg+xml;utf8, ',circle:'data:image/svg+xml;utf8, '};class _n{_providerToolbarUI=null;_transitMode=null;_buttonHTMLElement=null;constructor(e,t){this._providerToolbarUI=e,this._transitMode=t,this._buttonHTMLElement=Y.create("img",{src:vn[t],id:"TravelNotes-ProvidersToolbarUI-"+t+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:M.getText("ProvidersToolbarUI - "+t)}),this._buttonHTMLElement.addEventListener("click",this),this.visible=!1}handleEvent(e){e.stopPropagation(),this._providerToolbarUI.transitMode=this._transitMode,to.startRouting()}get buttonHTMLElement(){return this._buttonHTMLElement}get transitMode(){return this._transitMode}set active(e){e?this._buttonHTMLElement.classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"):this._buttonHTMLElement.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton")}set visible(e){e?this._buttonHTMLElement.classList.remove("TravelNotes-Hidden"):this._buttonHTMLElement.classList.add("TravelNotes-Hidden")}}class pn{_providerToolbarUI=null;_provider=null;_buttonHTMLElement=null;constructor(e,t){this._providerToolbarUI=e,this._provider=t,this._buttonHTMLElement=Y.create("img",{src:t.icon,id:"TravelNotes-ProvidersToolbarUI-"+t.name+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:t.title||t.name}),this._buttonHTMLElement.addEventListener("click",this)}handleEvent(e){e.stopPropagation(),this._providerToolbarUI.provider=this._provider.name,to.startRouting()}get buttonHTMLElement(){return this._buttonHTMLElement}get provider(){return this._provider}set active(e){e?this._buttonHTMLElement.classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"):this._buttonHTMLElement.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton")}}class mn{_toolbarHTMLElement=null;_transitModeButtons=new Map;_providerButtons=new Map;_activeTransitModeButton=null;_activeProviderButton=null;_createTransitModesButtons(){["bike","pedestrian","car","train","line","circle"].forEach((e=>{let t=new _n(this,e);this._transitModeButtons.set(e,t),this._toolbarHTMLElement.appendChild(t.buttonHTMLElement)}))}_createProvidersButtons(){z.providers.forEach((e=>{if(0!==e.providerKey){let t=new pn(this,e);this._providerButtons.set(e.name,t),this._toolbarHTMLElement.appendChild(t.buttonHTMLElement)}}))}constructor(e){this._toolbarHTMLElement=Y.create("div",{className:"TravelNotes-UI-FlexRowDiv TravelNotes-ProvidersToolbarUI-ImgButtonsDiv"},e),this._createTransitModesButtons(),this._createProvidersButtons(),this.provider=this._providerButtons.keys().next().value}set provider(e){z.routing.provider=e,this._activeProviderButton&&(this._activeProviderButton.active=!1),this._activeProviderButton=this._providerButtons.get(e),this._activeProviderButton.active=!0;let t=z.providers.get(e.toLowerCase());this._transitModeButtons.forEach((e=>{e.visible=p!==t.transitModes.indexOf(e.transitMode)})),this._activeTransitModeButton&&p!==t.transitModes.indexOf(this._activeTransitModeButton.transitMode)||(this._activeTransitModeButton=null,this._transitModeButtons.forEach((e=>{this._activeTransitModeButton||p===t.transitModes.indexOf(e.transitMode)?e.active=!1:(this._activeTransitModeButton=e,e.active=!0,z.routing.transitMode=e.transitMode)})))}set transitMode(e){z.routing.transitMode=e,this._activeTransitModeButton&&(this._activeTransitModeButton.active=!1),this._activeTransitModeButton=this._transitModeButtons.get(e),this._activeTransitModeButton.active=!0}providersAdded(){for(;this._toolbarHTMLElement.firstChild;)this._toolbarHTMLElement.removeChild(this._toolbarHTMLElement.firstChild);this._transitModeButtons.clear(),this._providerButtons.clear(),this._createTransitModesButtons(),this._createProvidersButtons(),this.provider=this._providerButtons.keys().next().value;let e=this._providerButtons.keys().next().value;this.provider=e,this.transitMode=z.providers.get(e.toLowerCase()).transitModes[0]}}const gn=new class{_status="geolocation"in navigator?a.inactive:a.disabled;_watchId=null;_showPosition(e){xe.dispatch("geolocationpositionchanged",{position:e})}_stop(){a.active===this._status&&(this._status=a.inactive),xe.dispatch("geolocationstatuschanged",{status:this._status}),navigator.geolocation.clearWatch(this._watchId),this._watchId=null}_error(e){1===e.code&&(this._status=a.refusedByUser),this._stop()}_start(){this._status=a.active,xe.dispatch("geolocationstatuschanged",{status:this._status}),navigator.geolocation.getCurrentPosition((e=>this._showPosition(e)),(e=>this._error(e)),e.geoLocation.options),this._watchId=navigator.geolocation.watchPosition(this._showPosition,this._error,e.geoLocation.options)}constructor(){}get status(){return this._status}switch(){switch(this._status){case a.inactive:this._start();break;case a.active:this._stop()}return this._status}};class yn{constructor(){}handleEvent(e){e.stopPropagation(),Pe.setKeysFromDialog()}}class bn{constructor(){}handleEvent(e){e.stopPropagation(),gn.switch()}}class In{constructor(){}handleEvent(e){e.target.textContent="📌"===e.target.textContent?"❌":"📌",xe.dispatch("uipinned")}}class wn{_geoLocationButton=null;_buttonsDiv=null;_createHomeButton(){Y.create("text",{value:"🏠"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:window.location.origin,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Home"},this._buttonsDiv)))}_createHelpButton(){Y.create("text",{value:"?"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:"https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages/TravelNotesGuides",target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Help"},this._buttonsDiv)))}_createContactButton(){Y.create("text",{value:"@"},Y.create("a",{className:"TravelNotes-UI-LinkButton",href:e.travelNotesToolbarUI.contactMail.url||window.location.origin,target:"_blank"},Y.create("div",{className:"TravelNotes-UI-Button",title:"Contact"},this._buttonsDiv)))}_createApiKeysButton(){e.APIKeysDialog.showButton&&Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("TravelNotesToolbarUI - API keys"),textContent:"🔑"},this._buttonsDiv).addEventListener("click",new yn,!1)}_createGeoLocationButton(){a.disablede.classList.toggle("TravelNotes-Hidden")))}toggleManeuvers(){this._maneuversHTML.forEach((e=>e.classList.toggle("TravelNotes-Hidden")))}addData(){this._routeManeuversAndNotesHTML=Ue.getRouteManeuversAndNotesHTML("TravelNotes-ItineraryPaneUI-",z.travel.editedRoute,!0),this._routeManeuversAndNotesHTML.childNodes.forEach((e=>{"Maneuver"===e.dataset.tanObjType?(e.addEventListener("contextmenu",this._eventListeners.onContextMenuManeuver),e.addEventListener("mouseenter",this._eventListeners.onMouseEnterManeuver),e.addEventListener("mouseleave",this._eventListeners.onMouseLeave),this._maneuversHTML.push(e)):"Note"===e.dataset.tanObjType&&(e.addEventListener("contextmenu",this._eventListeners.onContextMenuNote),e.addEventListener("mouseenter",this._eventListeners.onMouseEnterNote),e.addEventListener("mouseleave",this._eventListeners.onMouseLeave),this._notesHTML.push(e))})),this._paneData.appendChild(this._routeManeuversAndNotesHTML)}clearData(){this._maneuversHTML.forEach((e=>{e.removeEventListener("contextmenu",this._eventListeners.onContextMenuManeuver),e.removeEventListener("mouseenter",this._eventListeners.onMouseEnterManeuver),e.removeEventListener("mouseleave",this._eventListeners.onMouseLeave)})),this._maneuversHTML.length=0,this._notesHTML.forEach((e=>{e.removeEventListener("contextmenu",this._eventListeners.onContextMenuNote),e.removeEventListener("mouseenter",this._eventListeners.onMouseEnterNote),e.removeEventListener("mouseleave",this._eventListeners.onMouseLeave)})),this._notesHTML.length=0,this._routeManeuversAndNotesHTML&&this._paneData.removeChild(this._routeManeuversAndNotesHTML),this._routeManeuversAndNotesHTML=null}}class An extends Ln{_itineraryDataUI=null;_itineraryControlUI=null;constructor(e,t){super(e,t),this._itineraryDataUI=new jn(this.paneData),this._itineraryControlUI=new En(this.paneControl,this._itineraryDataUI)}remove(){this._itineraryDataUI.clearData(),this._itineraryControlUI.clearControl()}add(){_!==z.editedRouteObjId&&(this._itineraryDataUI.addData(),this._itineraryControlUI.addControl())}getPaneId(){return s.itineraryPane}getButtonText(){return M.getText("PanesManagerUI - Itinerary")}}class Sn{constructor(){}handleEvent(e){e.stopPropagation();try{e.dataTransfer.setData("ObjId",e.target.dataset.tanObjId),e.dataTransfer.dropEffect="move"}catch(e){e instanceof Error&&console.error(e)}}}class On{constructor(){}handleEvent(e){e.preventDefault()}}class kn{constructor(){}handleEvent(e){e.preventDefault();let t=e.currentTarget,o=t.getBoundingClientRect();ft.travelNoteDropped(Number.parseInt(e.dataTransfer.getData("ObjId")),Number.parseInt(t.dataset.tanObjId),e.clientY-o.top{e.removeEventListener("contextmenu",this._eventListeners.onContextMenu,!1),e.removeEventListener("dragstart",this._eventListeners.onDragStart,!1),e.removeEventListener("drop",this._eventListeners.onDrop,!1)})),this.paneData.removeChild(this._travelNotesDiv)),this._travelNotesDiv=null}add(){this._travelNotesDiv=Be.getTravelNotesHTML("TravelNotes-TravelNotesPaneUI-"),this._travelNotesDiv.addEventListener("dragover",this._eventListeners.onDragOver,!1),this.paneData.appendChild(this._travelNotesDiv),this._travelNotesDiv.childNodes.forEach((e=>{e.draggable=!0,e.addEventListener("contextmenu",this._eventListeners.onContextMenu,!1),e.addEventListener("dragstart",this._eventListeners.onDragStart,!1),e.addEventListener("drop",this._eventListeners.onDrop,!1),e.classList.add("TravelNotes-UI-MoveCursor")}))}getPaneId(){return s.travelNotesPane}getButtonText(){return M.getText("PanesManagerUI - Travel notes")}}class Bn{_objId=_;constructor(e,t){this.name=x.sanitizeToJsString(e),this.items=[],this.filterTagsArray=[],this.elementTypes=["node","way","relation"],this.isSelected=!1,this.isExpanded=!1,this.isRoot=!1,t&&(this.isExpanded=!0,this.isRoot=!0),this._objId=L.nextObjId}get objId(){return this._objId}}const Un=new class{_dictionary=null;_itemsMap=null;_itemsArray=[];_filterTagsArray=null;_currentItem=null;_parseLine(e){let t=e.split(";");for(;""===t[t.length-1];)t.pop();let o=0,n=null;t.forEach((e=>{if(""!==e)if(p===e.indexOf("="))this._currentItem=new Bn(e),this._itemsMap.set(this._currentItem.objId,this._currentItem),this._itemsArray[o].push(this._currentItem),this._itemsArray[o+1]=this._currentItem.items,this._filterTagsArray=this._currentItem.filterTagsArray;else{let t=e.split("=");if("element"===t[0])this._currentItem.elementTypes=[t[1]];else{let e={};e[t[0]]="*"===t[1]?null:t[1],n=n||[],n.push(e)}}o++})),n&&this._filterTagsArray.push(n)}constructor(){this._itemsMap=new Map,this._dictionary=new Bn("All",!0),this._itemsMap.set(this._dictionary.objId,this._dictionary),this._itemsArray=[this._dictionary.items]}parseDictionary(e){e.split(/\r\n|\r|\n/).forEach((e=>{""!==e&&this._parseLine(e)}))}_selectItem(e,t){e.isSelected=t,e.items.forEach((e=>{this._selectItem(e,t)}))}selectItemObjId(e,t){let o=this._itemsMap.get(e);this._selectItem(o,t)}changeExpanded(e){let t=this._itemsMap.get(e);t.isExpanded=!t.isExpanded}expandBranch(e){e.items.forEach((e=>{this.expandBranch(e)})),e.isExpanded=!0}collapseBranch(e){e.items.forEach((e=>{this.collapseBranch(e)})),e.isRoot||(e.isExpanded=!1)}clearBranch(e){e.items.forEach((e=>{this.clearBranch(e)})),e.isSelected=!1}get dictionary(){return this._dictionary}};const Kn=new class{_searchStarted=!1;_filterItems=[];_previousSearchBounds=null;_filterOsmElement(e,t){let o=!0;return t.forEach((t=>{let[n,a]=Object.entries(t)[0];o=o&&e.tags[n]&&(!a||e.tags[n]===a)})),o}_addPointOfInterest(e,t){this._filterItems.forEach((o=>{o.filterTagsArray.forEach((n=>{this._filterOsmElement(e,n)&&(e.description=o.name,t.set(e.id,e))}))}))}_getSearchQueries(){let t=[],o=new Map;this._filterItems.forEach((e=>{e.filterTagsArray.forEach((t=>{let[n,a]=Object.entries(t[0])[0],s=o.get(n);s||(s={values:new Map,elements:new Map},o.set(n,s)),s.values.set(a,a),e.elementTypes.forEach((e=>{s.elements.set(e,e)}))}))}));let n=this._computeSearchBounds();this._previousSearchBounds=n;let a="("+n.getSouthWest().lat.toFixed(r.fixed)+","+n.getSouthWest().lng.toFixed(r.fixed)+","+n.getNorthEast().lat.toFixed(r.fixed)+","+n.getNorthEast().lng.toFixed(r.fixed)+")";return o.forEach(((o,n)=>{let s='"'+n+'"';if(1===o.values.size){let e=o.values.values().next().value;e&&(s+='="'+e+'"')}else 1{s+=e+"|"})),s=s.substr(0,s.length-1)+'"');if(e.overpassApi.useNwr){let e=1===o.elements.size?o.elements.values().next().value:"nwr";t.push(e+"["+s+"]"+a+";"+("node"===e?"":"(._;>;);")+"out;")}else{let e=[];1===o.elements.size?e.push(o.elements.values().next().value):e=["node","way","rel"],e.forEach((e=>{t.push(e+"["+s+"]"+a+";"+("node"===e?"":"(._;>;);")+"out;")}))}})),t}_searchFilters(e){e.isSelected&&0this._searchFilters(e)))}_computeSearchBounds(){let e=z.map.getCenter(),t=z.map.getBounds(),o=G.getSquareBoundingBox([e.lat,e.lng],5e3);return t.getSouthWest().lat=Math.max(t.getSouthWest().lat,o.getSouthWest().lat),t.getSouthWest().lng=Math.max(t.getSouthWest().lng,o.getSouthWest().lng),t.getNorthEast().lat=Math.min(t.getNorthEast().lat,o.getNorthEast().lat),t.getNorthEast().lng=Math.min(t.getNorthEast().lng,o.getNorthEast().lng),t}constructor(){}async search(){if(this._searchStarted)return;this._searchStarted=!0,this._filterItems=[],this._searchFilters(Un.dictionary);let e=new Qe({searchPlaces:!1});await e.loadData(this._getSearchQueries());let t=new Map;[e.nodes,e.ways,e.relations].forEach((e=>{e.forEach((e=>{e.tags&&this._addPointOfInterest(e,t)}))})),z.searchData=Array.from(t.values()).sort(((e,t)=>e.description>t.description)),this._searchStarted=!1,xe.dispatch("showsearch")}get searchBounds(){return this._computeSearchBounds()}get previousSearchBounds(){return this._previousSearchBounds}};class Fn{_previousSearchLimitObjId=_;_searchLimitObjId=_;_drawSearchLimit(){_===this._searchLimitObjId?this._searchLimitObjId=L.nextObjId:xe.dispatch("removeobject",{objId:this._searchLimitObjId}),xe.dispatch("addrectangle",{objId:this._searchLimitObjId,bounds:Kn.searchBounds,properties:e.osmSearch.nextSearchLimit})}_drawPreviousSearchlimit(){let t=Kn.previousSearchBounds;t&&(_===this._previousSearchLimitObjId?this._previousSearchLimitObjId=L.nextObjId:xe.dispatch("removeobject",{objId:this._previousSearchLimitObjId}),xe.dispatch("addrectangle",{objId:this._previousSearchLimitObjId,bounds:[[t.getSouthWest().lat,t.getSouthWest().lng],[t.getNorthEast().lat,t.getNorthEast().lng]],properties:e.osmSearch.previousSearchLimit}))}constructor(){}show(){z.map.on("zoom",this._drawSearchLimit,this),z.map.on("move",this._drawSearchLimit,this),this._drawSearchLimit(),this._drawPreviousSearchlimit()}hide(){z.map.off("zoom",this._drawSearchLimit,this),z.map.off("move",this._drawSearchLimit,this),_!==this._searchLimitObjId&&(xe.dispatch("removeobject",{objId:this._searchLimitObjId}),this._searchLimitObjId=_),_!==this._previousSearchLimitObjId&&(xe.dispatch("removeobject",{objId:this._previousSearchLimitObjId}),this._previousSearchLimitObjId=_)}}class Vn extends Ye{_osmElement=null;_latLng=r.defaultValue;constructor(e,t=null){super(e,t),this._osmElement=z.searchData[Number.parseInt(e.currentTarget.dataset.tanElementIndex)],this._latLng=[this._osmElement.lat,this._osmElement.lon]}doAction(e){switch(e){case 0:oo.setStartPoint(this._latLng);break;case 1:oo.addWayPoint(this._latLng);break;case 2:oo.setEndPoint(this._latLng);break;case 3:ft.newSearchNote({osmElement:this._osmElement,isTravelNote:!1});break;case 4:ft.newSearchNote({osmElement:this._osmElement,isTravelNote:!0});break;case 5:ft.changeOsmSearchNoteDialog();break;case 6:(new Rt).zoomToPoi({latLng:this._latLng,geometry:this._osmElement.geometry})}}get menuItems(){return[{itemText:M.getText("MapContextMenu - Select this point as start point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.first.lat},{itemText:M.getText("MapContextMenu - Select this point as way point"),isActive:_!==z.editedRouteObjId},{itemText:M.getText("MapContextMenu - Select this point as end point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.last.lat},{itemText:M.getText("OsmSearchContextMenu - Create a route note with this result"),isActive:!0},{itemText:M.getText("OsmSearchContextMenu - Create a travel note with this result"),isActive:!0},{itemText:M.getText(ft.osmSearchNoteDialog?"OsmSearchContextMenu - Hide note dialog":"OsmSearchContextMenu - Show note dialog"),isActive:!0},{itemText:M.getText("OsmSearchContextMenu - Zoom to this result"),isActive:!0}]}}class Wn{constructor(){}handleEvent(e){e.stopPropagation(),e.preventDefault(),new Vn(e,this.paneDataDiv).show()}}class zn{constructor(){}handleEvent(e){e.stopPropagation();let t=z.searchData[Number.parseInt(e.target.dataset.tanElementIndex)];xe.dispatch("addsearchpointmarker",{objId:Number.parseInt(e.target.dataset.tanObjId),latLng:[t.lat,t.lon],geometry:t.geometry})}}class Gn{constructor(){}handleEvent(e){e.stopPropagation(),xe.dispatch("removeobject",{objId:Number.parseInt(e.target.dataset.tanObjId)})}}class Xn{_paneData=null;_currentOsmElement=null;_currentHtmlElement=null;_elementIndex=0;_eventListeners={onContextMenu:null,onMouseEnter:null,onMouseLeave:null};_buildIcon(){let e="";e=this._currentOsmElement.tags.rcn_ref?"
"+this._currentOsmElement.tags.rcn_ref+"
":Je.getIconContentFromName(this._currentOsmElement.description)||"";let t=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-IconCell"},this._currentHtmlElement);x.sanitizeToHtmlElement(e,t)}_addOsmTag(e,t){e&&Y.create("div",{textContent:e},t)}_addAddress(e){let t=(this._currentOsmElement.tags["addr:street"]?(this._currentOsmElement.tags["addr:housenumber"]?this._currentOsmElement.tags["addr:housenumber"]+" ":"")+this._currentOsmElement.tags["addr:street"]+" ":"")+(this._currentOsmElement.tags["addr:city"]?(this._currentOsmElement.tags["addr:postcode"]?this._currentOsmElement.tags["addr:postcode"]+" ":"")+this._currentOsmElement.tags["addr:city"]:"");""!==t&&this._addOsmTag(t,e)}_addPhone(e){this._currentOsmElement.tags.phone&&this._addOsmTag("☎️ : "+this._currentOsmElement.tags.phone,e)}_addMail(e){this._currentOsmElement.tags.email&&Y.create("a",{href:"mailto:"+this._currentOsmElement.tags.email,textContent:this._currentOsmElement.tags.email},Y.create("div",{textContent:"📧 : "},e))}_addWebSite(e){this._currentOsmElement.tags.website&&Y.create("a",{href:this._currentOsmElement.tags.website,target:"_blank",textContent:this._currentOsmElement.tags.website},Y.create("div",null,e))}_addOsmData(){let e=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Cell"},this._currentHtmlElement);this._addOsmTag(this._currentOsmElement.description,e),this._addOsmTag(this._currentOsmElement.tags.name,e),this._addOsmTag(this._currentOsmElement.tags.rcn_ref,e),this._addAddress(e),this._addPhone(e),this._addMail(e),this._addWebSite(e)}_addTitle(){for(const[e,t]of Object.entries(this._currentOsmElement.tags))this._currentHtmlElement.title+=e+"="+t+"\n"}_addEventListeners(){this._currentHtmlElement.addEventListener("contextmenu",this._eventListeners.onContextMenu,!1),this._currentHtmlElement.addEventListener("mouseenter",this._eventListeners.onMouseEnter,!1),this._currentHtmlElement.addEventListener("mouseleave",this._eventListeners.onMouseLeave,!1)}_buildHtmlElement(e){this._currentHtmlElement=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Row",dataset:{ObjId:L.nextObjId,ElementIndex:this._elementIndex++}},e),this._buildIcon(),this._addOsmData(),this._addTitle(),this._addEventListeners()}constructor(e){this._paneData=e,this._eventListeners.onContextMenu=new Wn,this._eventListeners.onMouseEnter=new zn,this._eventListeners.onMouseLeave=new Gn}addData(){this._currentOsmElement=null,this._currentHtmlElement=null,this._elementIndex=0,z.searchData.forEach((e=>{this._currentOsmElement=e,this._buildHtmlElement(this._paneData)}))}clearData(){for(;this._paneData.firstChild;)this._paneData.firstChild.removeEventListener("contextmenu",this._eventListeners.onContextMenu,!1),this._paneData.firstChild.removeEventListener("mouseenter",this._eventListeners.onMouseEnter,!1),this._paneData.firstChild.removeEventListener("mouseleave",this._eventListeners.onMouseLeave,!1),xe.dispatch("removeobject",{objId:Number.parseInt(this._paneData.firstChild.dataset.tanObjId)}),this._paneData.removeChild(this._paneData.firstChild)}}class Zn{_osmSearchTreeUI=null;_osmSearchWaitUI=null;constructor(e,t){this._osmSearchTreeUI=e,this._osmSearchWaitUI=t}handleEvent(e){e.stopPropagation(),Un.dictionary.isExpanded=!1,this._osmSearchTreeUI.redraw(),z.searchData.length=0,xe.dispatch("showsearch"),this._osmSearchWaitUI.showWait(),Kn.search()}}class Yn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.expandBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class Jn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.collapseBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class qn{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.clearBranch(Un.dictionary),this._osmSearchTreeUI.redraw()}}class Qn{_toolbarHTMLElement=null;constructor(e,t){this._toolbarHTMLElement=Y.create("div"),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Search OpenStreetMap"),textContent:"🔎"},this._toolbarHTMLElement).addEventListener("click",new Zn(e,t),!1),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Expand tree"),textContent:"▼"},this._toolbarHTMLElement).addEventListener("click",new Yn(e),!1),Y.create("div",{className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Collapse tree"),textContent:"▶"},this._toolbarHTMLElement).addEventListener("click",new Jn(e),!1),Y.create("div",{id:"TravelNotes-OsmSearchPaneUI-ClearAllButton",className:"TravelNotes-UI-Button",title:M.getText("OsmSearchPaneUI - Clear tree"),textContent:"❌"},this._toolbarHTMLElement).addEventListener("click",new qn(e),!1)}get toolbarHTMLElement(){return this._toolbarHTMLElement}}class $n{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.selectItemObjId(Number.parseInt(e.target.parentNode.dataset.tanObjId),e.target.checked),this._osmSearchTreeUI.redraw()}}class ea{constructor(){}handleEvent(e){e.stopPropagation(),e.deltaY&&(e.target.scrollTop+=e.deltaY*v[e.deltaMode]),e.stopPropagation()}}class ta{_osmSearchTreeUI=null;constructor(e){this._osmSearchTreeUI=e}handleEvent(e){e.stopPropagation(),Un.changeExpanded(Number.parseInt(e.target.parentNode.dataset.tanObjId)),this._osmSearchTreeUI.redraw()}}class oa{_treeHTMLElement=null;_eventListeners={onClickArrow:null,onChangeCheckbox:null};_deepTree=0;_addItem(e){this._deepTree++;let t=Y.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchItem TravelNotes-OsmSearchPaneUI-SearchItemMargin"+this._deepTree,dataset:{ObjId:e.objId}},this._treeHTMLElement);if(!e.isRoot){Y.create("input",{type:"checkbox",checked:e.isSelected},t).addEventListener("change",this._eventListeners.onChangeCheckbox,!1)}if(0===e.filterTagsArray.length){Y.create("div",{className:"TravelNotes-UI-Button TravelNotes-OsmSearchPaneUI-TreeArrow",textContent:e.isExpanded?"▼":"▶"},t).addEventListener("click",this._eventListeners.onClickArrow,!1)}Y.create("text",{value:e.name},t),e.isExpanded&&e.items.forEach((e=>this._addItem(e))),this._deepTree--}constructor(){this._eventListeners.onChangeCheckbox=new $n(this),this._eventListeners.onClickArrow=new ta(this),this._treeHTMLElement=Y.create("div",{id:"TravelNotes-OsmSearchPaneUI-SearchTree"}),this._treeHTMLElement.addEventListener("wheel",new ea,!1),Un.dictionary.name="",this._addItem(Un.dictionary)}redraw(){this._treeHTMLElement.textContent="",this._addItem(Un.dictionary)}get treeHTMLElement(){return this._treeHTMLElement}}class na{_waitDiv=null;_waitBullet=null;constructor(){this._waitDiv=Y.create("div",{className:"TravelNotes-WaitAnimation"}),this._waitDiv.classList.add("TravelNotes-Hidden")}showWait(){this._waitBullet=Y.create("div",{className:"TravelNotes-WaitAnimationBullet"},this._waitDiv),this._waitDiv.classList.remove("TravelNotes-Hidden")}hideWait(){this._waitBullet&&(this._waitDiv.removeChild(this._waitBullet),this._waitBullet=null),this._waitDiv.classList.add("TravelNotes-Hidden")}get waitHTMLElement(){return this._waitDiv}}class aa{_osmSearchTreeUI=null;_osmSearchToolbar=null;_osmSearchWaitUI=null;_paneControl=null;constructor(e){this._paneControl=e,this._osmSearchTreeUI=new oa,this._osmSearchWaitUI=new na,this._osmSearchToolbar=new Qn(this._osmSearchTreeUI,this._osmSearchWaitUI)}addControl(){this._paneControl.appendChild(this._osmSearchToolbar.toolbarHTMLElement),this._paneControl.appendChild(this._osmSearchTreeUI.treeHTMLElement),this._paneControl.appendChild(this._osmSearchWaitUI.waitHTMLElement)}clearControl(){this._paneControl.removeChild(this._osmSearchTreeUI.treeHTMLElement),this._paneControl.removeChild(this._osmSearchToolbar.toolbarHTMLElement),this._osmSearchWaitUI.hideWait(),this._paneControl.removeChild(this._osmSearchWaitUI.waitHTMLElement)}}class sa extends Ln{_osmSearchDataUI=new Xn(this.paneData);_osmSearchControlUI=new aa(this.paneControl);_osmSearchLimitsUI=new Fn;_addControls(){this._osmSearchControlUI.addControl(this.paneControlDiv)}_addData(){this._osmSearchDataUI.addData(this.paneDataDiv)}_clearPaneControlDiv(){this._osmSearchControlUI.clearControl(this.paneControlDiv)}_clearPaneDataDiv(){this._osmSearchDataUI.clearData(this.paneDataDiv)}constructor(e,t){super(e,t)}remove(){this._osmSearchLimitsUI.hide(),this._clearPaneDataDiv(),this._clearPaneControlDiv()}add(){this._osmSearchLimitsUI.show(),this._addControls(),this._addData()}getPaneId(){return s.searchPane}getButtonText(){return M.getText("PanesManagerUI - Search")}}const ia=new class{_mainHTMLElement=null;_travelNotesToolbarUI=null;_travelUI=null;_panesManagerUI=null;_providersToolbarUI=null;_timerId=null;_titleHTMLElement=null;_isPinned=!1;_addMouseEventListeners(){this._mainHTMLElement.addEventListener("click",(e=>{e.target.id&&"TravelNotes-UI-MainDiv"===e.target.id&&(e.stopPropagation(),e.preventDefault())}),!1),this._mainHTMLElement.addEventListener("dblclick",(e=>{e.stopPropagation(),e.preventDefault()}),!1),this._mainHTMLElement.addEventListener("contextmenu",(e=>{e.stopPropagation(),e.preventDefault()}),!1),this._mainHTMLElement.addEventListener("wheel",(e=>{e.stopPropagation(),e.preventDefault()}),!1)}_onMouseLeave(){this._isPinned||(this._timerId=setTimeout((()=>this._hide()),e.travelEditor.timeout))}_show(){if(this._isPinned)return;this._timerId&&(clearTimeout(this._timerId),this._timerId=null),this._mainHTMLElement.classList.remove("TravelNotes-UI-Minimized"),this._titleHTMLElement.classList.add("TravelNotes-Hidden");let e=this._mainHTMLElement.childNodes;for(let t=1;tthis._show()),!1),this._mainHTMLElement.addEventListener("mouseleave",(()=>this._onMouseLeave()),!1),this._addMouseEventListeners(),e.travelEditor.startMinimized?(this._hide(),this._isPinned=!1):(this._show(),this._isPinned=!0))}get travelNotesToolbarUI(){return this._travelNotesToolbarUI}get travelUI(){return this._travelUI}get panesManagerUI(){return this._panesManagerUI}get providersToolbarUI(){return this._providersToolbarUI}};class ra{constructor(){}openDistantFile(e){(new Co).decompress(e),z.travel.readOnly=!0,document.title="Travel & Notes"+(""===z.travel.name?"":" - "+z.travel.name);let t=z.travel.routes.iterator;for(;!t.done;)l.notEdited===t.value.editionStatus&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:t.value.objId});_!==z.editedRouteObjId&&xe.dispatch("routeupdated",{removedRouteObjId:_,addedRouteObjId:z.travel.editedRoute.objId});let o=z.travel.notes.iterator;for(;!o.done;)xe.dispatch("noteupdated",{removedNoteObjId:_,addedNoteObjId:o.value.objId});(new Rt).zoomToTravel()}}class la extends le{_aboutDiv=null;constructor(e={}){super(e),this._aboutDiv=Y.create("div",{id:"TravelNotes-AboutDialog-AboutDiv"}),x.sanitizeToHtmlElement('

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version.

Copyright - 2017 2021 - wwwouaiebe

Contact : https://www.ouaie.be/

GitHub : https://github.com/wwwouaiebe/leaflet.TravelNotes

Version : v3.0.0.

This program uses: leaflet, Project-OSRM/osrm-text-instructions and the Overpass API

',this._aboutDiv)}get contentHTMLElements(){return[this._aboutDiv]}get title(){return M.getText("AboutDialog - About Travel & Notes")}}class da extends Ye{_latLng=r.defaultValue;constructor(e,t=null){super(e,t),this._latLng=[this.eventData.lat,this.eventData.lng]}doAction(e){switch(e){case 0:oo.setStartPoint(this._latLng);break;case 1:oo.addWayPoint(this._latLng);break;case 2:oo.setEndPoint(this._latLng);break;case 3:$t.addRoute();break;case 4:$t.hideRoutes();break;case 5:$t.showRoutes();break;case 6:ft.newTravelNote(this._latLng);break;case 7:ft.hideNotes();break;case 8:ft.showNotes();break;case 9:(new Rt).zoomToTravel();break;case 10:(new la).show().catch((()=>{}))}}get menuItems(){return[{itemText:M.getText("MapContextMenu - Select this point as start point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.first.lat},{itemText:M.getText("MapContextMenu - Select this point as way point"),isActive:_!==z.editedRouteObjId},{itemText:M.getText("MapContextMenu - Select this point as end point"),isActive:_!==z.editedRouteObjId&&r.defaultValue===z.travel.editedRoute.wayPoints.last.lat},{itemText:M.getText("MapContextMenu - Add a route"),isActive:!0},{itemText:M.getText("MapContextMenu - Hide all routes"),isActive:!0},{itemText:M.getText("MapContextMenu - Show all routes"),isActive:!0},{itemText:M.getText("MapContextMenu - New travel note"),isActive:!0},{itemText:M.getText("MapContextMenu - Hide all notes"),isActive:!0},{itemText:M.getText("MapContextMenu - Show all notes"),isActive:!0},{itemText:M.getText("MapContextMenu - Zoom to travel"),isActive:!0},{itemText:M.getText("MapContextMenu - About Travel & Notes"),isActive:!0}]}}const ha=new class{_travelNotesLoaded=!1;async _loadDistantTravel(e){let t=await fetch(e);if(g===t.status&&t.ok){let e=await t.json();(new ra).openDistantFile(e)}else z.map.setView([r.defaultValue,r.defaultValue],2),document.title="Travel & Notes"}constructor(){}addReadOnlyMap(e,t){this._travelNotesLoaded||(this._travelNotesLoaded=!0,e&&(z.map=e),So.createUI(),Vo.setMapLayer("OSM - Color"),this._loadDistantTravel(t))}addControl(t,n){this._travelNotesLoaded||(this._travelNotesLoaded=!0,t&&(z.map=t,z.map.on("contextmenu",(e=>new da(e).show()))),z.travel=new W,z.travel.routes.add(new F),ia.createUI(document.getElementById(n)),So.createUI(),Pe.setKeysFromServerFile(),e.layersToolbarUI.haveLayersToolbarUI?Vo.createUI():Vo.setMapLayer("OSM - Color"),e.mouseUI.haveMouseUI&&Mo.createUI(),e.travelEditor.startupRouteEdition&&$t.editRoute(z.travel.routes.first.objId),xe.dispatch("setrouteslist"),xe.dispatch("roadbookupdate"),z.map.setView([e.map.center.lat,e.map.center.lng],e.map.zoom),Me.showHelp("

"+M.getText("Help - Continue with interface1")+"

"+M.getText("Help - Continue with interface2")+"

"),document.title="Travel & Notes",Mo.saveStatus=o.saved)}addProvider(e){Pe.addProvider(e)}showInfo(e){Me.showInfo(e)}get overpassApiUrl(){return e.overpassApi.url}get map(){return z.map}get version(){return D}};class ca{_copyObjectTo(e,t){if("object"==typeof e&&"object"==typeof t){for(let o in t)"object"==typeof t[o]?this._copyObjectTo(e[o],t[o]):typeof e[o]==typeof t[o]&&("string"==typeof t[o]?t[o]="color"===o?x.sanitizeToColor(e[o])||t[o]:"url"===o?x.sanitizeToUrl(e[o]).url:x.sanitizeToJsString(e[o]):t[o]=e[o]||t[o]);for(let o in e)"object"==typeof e[o]?("[object Array]"===Object.prototype.toString.call(e[o])?t[o]=t[o]||[]:t[o]=t[o]||{},this._copyObjectTo(e[o],t[o])):"string"==typeof t.property?t[o]=x.sanitizeToHtmlString(e[o],[]).htmlString:t[o]=e[o]}}_freeze(e){for(let t in e)"object"==typeof e[t]&&this._freeze(e[t]);Object.freeze(e)}constructor(){}overload(t){this._copyObjectTo(t,e),this._freeze(e)}}class ua{constructor(){}handleEvent(){Mo.saveStatus=o.modified,P.storageAvailable("localStorage")&&No.getOpenPromise().then((()=>{No.getWritePromise(z.UUID,xo.getTravelHTML("TravelNotes-Roadbook-").outerHTML)})).then((()=>localStorage.setItem(z.UUID,Date.now()))).catch((e=>{e instanceof Error&&console.error(e)}))}}(new class{_travelUrl=null;_language=null;_originAndPath=window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"TravelNotes";_errorMessage="";_addEventsListeners(){document.addEventListener("routeupdated",(e=>{e.data&&fo.updateRoute(e.data.removedRouteObjId,e.data.addedRouteObjId)}),!1),document.addEventListener("routepropertiesupdated",(e=>{e.data&&fo.updateRouteProperties(e.data.routeObjId)}),!1),document.addEventListener("noteupdated",(e=>{e.data&&fo.updateNote(e.data.removedNoteObjId,e.data.addedNoteObjId)}),!1),document.addEventListener("removeobject",(e=>{e.data&&fo.removeObject(e.data.objId)}),!1),document.addEventListener("removeallobjects",(()=>fo.removeAllObjects()),!1),document.addEventListener("zoomto",(e=>{e.data&&fo.zoomTo(e.data.latLng,e.data.geometry)}),!1),document.addEventListener("additinerarypointmarker",(e=>{e.data&&fo.addItineraryPointMarker(e.data.objId,e.data.latLng)}),!1),document.addEventListener("addsearchpointmarker",(e=>{e.data&&fo.addSearchPointMarker(e.data.objId,e.data.latLng,e.data.geometry)}),!1),document.addEventListener("addrectangle",(e=>{e.data&&fo.addRectangle(e.data.objId,e.data.bounds,e.data.properties)}),!1),document.addEventListener("addwaypoint",(e=>{e.data&&fo.addWayPoint(e.data.wayPoint,e.data.letter)}),!1),document.addEventListener("layerchange",(e=>{e.data&&fo.setLayer(e.data.layer)})),document.addEventListener("geolocationpositionchanged",(e=>{e.data&&fo.onGeolocationPositionChanged(e.data.position)}),!1),document.addEventListener("geolocationstatuschanged",(e=>{e.data&&fo.onGeolocationStatusChanged(e.data.status)}),!1),document.addEventListener("roadbookupdate",new ua,!1),document.addEventListener("profileclosed",(e=>{e.data&&Wt.onProfileClosed(e.data.objId)}),!1),document.addEventListener("uipinned",(()=>ia.pin()),!1),document.addEventListener("geolocationstatuschanged",(e=>{ia.travelNotesToolbarUI.geoLocationStatusChanged(e.data.status)}),!1),document.addEventListener("travelnameupdated",(()=>ia.travelUI.setTravelName()),!1),document.addEventListener("setrouteslist",(()=>ia.travelUI.routesListUI.setRoutesList()),!1),document.addEventListener("showitinerary",(()=>ia.panesManagerUI.showPane(s.itineraryPane)),!1),document.addEventListener("updateitinerary",(()=>ia.panesManagerUI.updatePane(s.itineraryPane)),!1),document.addEventListener("showtravelnotes",(()=>ia.panesManagerUI.showPane(s.travelNotesPane)),!1),document.addEventListener("updatetravelnotes",(()=>ia.panesManagerUI.updatePane(s.travelNotesPane)),!1),document.addEventListener("showsearch",(()=>ia.panesManagerUI.showPane(s.searchPane)),!1),document.addEventListener("updatesearch",(()=>ia.panesManagerUI.updatePane(s.searchPane)),!1),document.addEventListener("providersadded",(()=>ia.providersToolbarUI.providersAdded()),!1),document.addEventListener("setprovider",(e=>{e.data&&e.data.provider&&(ia.providersToolbarUI.provider=e.data.provider)}),!1),document.addEventListener("settransitmode",(e=>{e.data&&e.data.transitMode&&(ia.providersToolbarUI.transitMode=e.data.transitMode)}),!1)}_addUnloadEventsListeners(){window.addEventListener("unload",(()=>localStorage.removeItem(z.UUID))),window.addEventListener("beforeunload",(t=>{if(No.closeDb(z.UUID),e.travelNotes.haveBeforeUnloadWarning)return t.returnValue="x","x"}))}_readURL(){let e=new URL(window.location),t=e.searchParams.get("fil");if(t&&0!==t.length)try{if(t=atob(t),t.match(/[^\w-%:./]/))throw new Error("invalid char in the url encoded in the fil parameter");let o=new URL(t);if(!(e.protocol&&o.protocol&&e.protocol===o.protocol&&e.hostname&&o.hostname&&e.hostname===o.hostname))throw new Error("The distant file is not on the same site than the app");this._travelUrl=encodeURI(o.href)}catch(e){e instanceof Error&&console.error(e)}let o=e.searchParams.get("lng");o&&o.match(/^[A-Z,a-z]{2}$/)&&(this._language=o.toLowerCase())}async _loadConfig(){let t=await fetch(this._originAndPath+"Config.json");if(g===t.status&&t.ok){let o=await t.json();return o.travelNotes.language=this._language||o.travelNotes.language,"wwwouaiebe.github.io"===window.location.hostname&&(o.APIKeysDialog.haveUnsecureButtons=!0,o.errorsUI.showHelp=!0,o.layersToolbarUI.theDevil.addButton=!1,o.note.maxManeuversNotes=10,o.note.haveBackground=!0,o.noteDialog.theDevil.addButton=!1,o.printRouteMap.maxTiles=120,o.route.showDragTooltip=p),(new ca).overload(o),z.providers.forEach((t=>{t.userLanguage=e.travelNotes.language})),!0}return!1}async _loadTranslations(e,t){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(M.setTranslations(await e.value.json()),!0):"fulfilled"===t.status&&g===t.value.status&&t.value.ok?(M.setTranslations(await t.value.json()),this._errorMessage+="Not possible to load the TravelNotes"+this._language.toUpperCase()+".json file. English will be used. ",!0):(this._errorMessage+="Not possible to load the translations. ",!1)}async _loadNoteDialogConfig(e,t){if("fulfilled"===e.status&&g===e.value.status&&e.value.ok){let t=await e.value.json();return Je.loadJson(t),!0}if("fulfilled"===t.status&&g===t.value.status&&t.value.ok){let e=await t.value.json();return Je.loadJson(e),this._errorMessage+="Not possible to load the TravelNotesNoteDialog"+this._language.toUpperCase()+".json file. English will be used. ",!0}return this._errorMessage+="Not possible to load the translations for the note dialog. ",!1}async _loadOsmSearchDictionary(e,t){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(Un.parseDictionary(await e.value.text()),!0):"fulfilled"===t.status&&g===t.value.status&&t.value.ok?(Un.parseDictionary(await t.value.text()),this._errorMessage+="Not possible to load the TravelNotesSearchDictionary"+this._language.toUpperCase()+".csv file. English will be used. ",!0):(this._errorMessage+="Not possible to load the search dictionary. OSM search will not be available.",!0)}async _loadMapLayers(e){return"fulfilled"===e.status&&g===e.value.status&&e.value.ok?(Zt.addMapLayers(await e.value.json()),!0):(this._errorMessage+="Not possible to load the TravelNotesLayers.json file. Only the OpenStreetMap background will be available. ",!0)}async _loadJsonFiles(){let e=await Promise.allSettled([fetch(this._originAndPath+this._language.toUpperCase()+".json"),fetch(this._originAndPath+"EN.json"),fetch(this._originAndPath+"NoteDialog"+this._language.toUpperCase()+".json"),fetch(this._originAndPath+"NoteDialogEN.json"),fetch(this._originAndPath+"SearchDictionary"+this._language.toUpperCase()+".csv"),fetch(this._originAndPath+"SearchDictionaryEN.csv"),fetch(this._originAndPath+"Layers.json")]),t=await this._loadTranslations(e[0],e[1])&&await this._loadNoteDialogConfig(e[2],e[3])&&await this._loadOsmSearchDictionary(e[4],e[5])&&await this._loadMapLayers(e[6]);return""!==this._errorMessage&&t?Me.showError(this._errorMessage):""!==this._errorMessage&&(document.body.textContent=this._errorMessage),t}_loadTravelNotes(){if(e.travelNotes.autoLoad){let e=document.createElement("div");e.id="TravelNotes-Map",document.body.appendChild(e),Y.create("div",{id:"TravelNotes-UI"},document.body);let t=window.L.map("TravelNotes-Map",{attributionControl:!1,zoomControl:!1}).setView([r.defaultValue,r.defaultValue],0);this._travelUrl?ha.addReadOnlyMap(t,this._travelUrl):(this._addUnloadEventsListeners(),ha.addControl(t,"TravelNotes-UI")),e.focus()}}constructor(){}async loadApp(){this._addEventsListeners(),this._originAndPath=window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"TravelNotes",window.TaN=ha,this._readURL(),await this._loadConfig()?(this._language=this._language||e.travelNotes.language||"fr",Me.createUI(),await this._loadJsonFiles()&&this._loadTravelNotes()):document.body.textContent="Not possible to load the TravelNotesConfig.json file. "}}).loadApp()}(); \ No newline at end of file diff --git a/dist/TravelNotesConfig.json b/dist/TravelNotesConfig.json index 76739d99..5b92e7b7 100644 --- a/dist/TravelNotesConfig.json +++ b/dist/TravelNotesConfig.json @@ -161,8 +161,9 @@ "showSearchNoteDialog":false }, "overpassApi": { + "useNwr":true, "timeOut":40, - "url":"https://z.overpass-api.de/api/interpreter" + "url":"https://lz4.overpass-api.de/api/interpreter" }, "printRouteMap": { diff --git a/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js b/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js index 447e3498..19d912db 100644 --- a/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js +++ b/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/MapboxRouteProvider.min.js b/dist/TravelNotesProviders/MapboxRouteProvider.min.js index 578079ea..4371e93c 100644 --- a/dist/TravelNotesProviders/MapboxRouteProvider.min.js +++ b/dist/TravelNotesProviders/MapboxRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js b/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js index 4ce3e184..b5036bee 100644 --- a/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js +++ b/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/OSRMRouteProvider.min.js b/dist/TravelNotesProviders/OSRMRouteProvider.min.js index e37b2522..8086c292 100644 --- a/dist/TravelNotesProviders/OSRMRouteProvider.min.js +++ b/dist/TravelNotesProviders/OSRMRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js b/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js index 1207dd6b..65593726 100644 --- a/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js +++ b/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/PolylineRouteProvider.min.js b/dist/TravelNotesProviders/PolylineRouteProvider.min.js index bbfa1adf..779de6b6 100644 --- a/dist/TravelNotesProviders/PolylineRouteProvider.min.js +++ b/dist/TravelNotesProviders/PolylineRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js b/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js index 326c9cd7..634b59f0 100644 --- a/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js +++ b/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:21:55+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:34:56+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/TravelNotesRoadbook.min.js b/dist/TravelNotesRoadbook.min.js index 41dcf6dc..510ed65f 100644 --- a/dist/TravelNotesRoadbook.min.js +++ b/dist/TravelNotesRoadbook.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:22:01+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:35:03+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 diff --git a/dist/viewer/TravelNotesConfig.json b/dist/viewer/TravelNotesConfig.json index 76739d99..5b92e7b7 100644 --- a/dist/viewer/TravelNotesConfig.json +++ b/dist/viewer/TravelNotesConfig.json @@ -161,8 +161,9 @@ "showSearchNoteDialog":false }, "overpassApi": { + "useNwr":true, "timeOut":40, - "url":"https://z.overpass-api.de/api/interpreter" + "url":"https://lz4.overpass-api.de/api/interpreter" }, "printRouteMap": { diff --git a/dist/viewer/TravelNotesViewer.min.js b/dist/viewer/TravelNotesViewer.min.js index b7ae086c..8a4e882d 100644 --- a/dist/viewer/TravelNotesViewer.min.js +++ b/dist/viewer/TravelNotesViewer.min.js @@ -5,8 +5,8 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page. * - * leaflet.travelnotes - version 3.0.0-RC1 - * Build 02778 - 2021-09-09T10:22:00+0200 + * leaflet.travelnotes - version 3.0.0 + * Build 02783 - 2021-09-09T15:35:02+0200 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 @@ -41,7 +41,7 @@ @private @------------------------------------------------------------------------------------------------------------------------------ - */let e={APIKeys:{saveToSessionStorage:!0},APIKeysDialog:{haveUnsecureButtons:!0,showAPIKeys:!0,showButton:!0},contextMenu:{timeout:1500},errorsUI:{helpTimeOut:3e4,showError:!0,showHelp:!0,showInfo:!0,showWarning:!0,timeOut:1e4},geoCoder:{distances:{city:1200,hamlet:200,town:1500,village:400},osmCityAdminLevel:{DEFAULT:"8",GB:"10"}},geoLocation:{marker:{color:"#ff0000",radius:11},options:{enableHighAccuracy:!1,maximumAge:0,timeout:1/0},zoomFactor:17,zoomToPosition:!0},itineraryPaneUI:{showManeuvers:!1,showNotes:!0},itineraryPoint:{marker:{color:"#ff0000",fill:!1,radius:7,weight:2},zoomFactor:17},layersToolbarUI:{haveLayersToolbarUI:!0,toolbarTimeOut:1500,theDevil:{addButton:!1}},map:{center:{lat:50.50923,lng:5.49542},zoom:12},mouseUI:{haveMouseUI:!0},nominatim:{url:"https://nominatim.openstreetmap.org/",language:"*"},note:{grip:{size:10,opacity:0,moveOpacity:1},haveBackground:!1,maxManeuversNotes:100,polyline:{color:"#808080",weight:1},reverseGeocoding:!1,svgIcon:{angleDistance:10,angleDirection:{right:35,slightRight:80,continue:100,slightLeft:145,left:200,sharpLeft:270,sharpRight:340},rcnRefDistance:20,roadbookFactor:1,zoom:17}},noteDialog:{areaHeight:{icon:2,popupContent:8},mask:{iconsDimension:!0,iconTextArea:!1,tooltip:!1,popupContent:!1,address:!1,link:!1,phone:!0},theDevil:{addButton:!1,zoomFactor:17}},osmSearch:{nextSearchLimit:{color:"#ff0000",fill:!1,weight:1},previousSearchLimit:{color:"#006400",fill:!1,weight:1},searchPointMarker:{color:"#006400",fill:!1,radius:20,weight:4},searchPointPolyline:{color:"#006400",fill:!1,weight:4},showSearchNoteDialog:!1},overpassApi:{timeOut:40,url:"https://lz4.overpass-api.de/api/interpreter"},printRouteMap:{isEnabled:!0,maxTiles:240,paperWidth:287,paperHeight:200,pageBreak:!1,printNotes:!0,borderWidth:30,zoomFactor:15,entryPointMarker:{color:"#00ff00",weight:4,radius:10,fill:!0,fillOpacity:1},exitPointMarker:{color:"#ff0000",weight:4,radius:10,fill:!0,fillOpacity:1}},route:{color:"#ff0000",dashArray:0,dashChoices:[{text:"——————",iDashArray:[0]},{text:"— — — — —",iDashArray:[4,2]},{text:"—‧—‧—‧—‧—",iDashArray:[4,2,0,2]},{text:"················",iDashArray:[0,2]}],elev:{smooth:!0,smoothCoefficient:.25,smoothPoints:3},showDragTooltip:3,width:3},routeEditor:{showEditedRouteInRoadbook:!0},travelEditor:{startMinimized:!0,startupRouteEdition:!0,timeout:1e3},travelNotes:{autoLoad:!0,haveBeforeUnloadWarning:!0,language:"fr"},travelNotesToolbarUI:{contactMail:{url:"https://github.com/wwwouaiebe/leaflet.TravelNotes/issues"}},wayPoint:{reverseGeocoding:!1,geocodingIncludeName:!1}}; + */let e={APIKeys:{saveToSessionStorage:!0},APIKeysDialog:{haveUnsecureButtons:!0,showAPIKeys:!0,showButton:!0},contextMenu:{timeout:1500},errorsUI:{helpTimeOut:3e4,showError:!0,showHelp:!0,showInfo:!0,showWarning:!0,timeOut:1e4},geoCoder:{distances:{city:1200,hamlet:200,town:1500,village:400},osmCityAdminLevel:{DEFAULT:"8",GB:"10"}},geoLocation:{marker:{color:"#ff0000",radius:11},options:{enableHighAccuracy:!1,maximumAge:0,timeout:1/0},zoomFactor:17,zoomToPosition:!0},itineraryPaneUI:{showManeuvers:!1,showNotes:!0},itineraryPoint:{marker:{color:"#ff0000",fill:!1,radius:7,weight:2},zoomFactor:17},layersToolbarUI:{haveLayersToolbarUI:!0,toolbarTimeOut:1500,theDevil:{addButton:!1}},map:{center:{lat:50.50923,lng:5.49542},zoom:12},mouseUI:{haveMouseUI:!0},nominatim:{url:"https://nominatim.openstreetmap.org/",language:"*"},note:{grip:{size:10,opacity:0,moveOpacity:1},haveBackground:!1,maxManeuversNotes:100,polyline:{color:"#808080",weight:1},reverseGeocoding:!1,svgIcon:{angleDistance:10,angleDirection:{right:35,slightRight:80,continue:100,slightLeft:145,left:200,sharpLeft:270,sharpRight:340},rcnRefDistance:20,roadbookFactor:1,zoom:17}},noteDialog:{areaHeight:{icon:2,popupContent:8},mask:{iconsDimension:!0,iconTextArea:!1,tooltip:!1,popupContent:!1,address:!1,link:!1,phone:!0},theDevil:{addButton:!1,zoomFactor:17}},osmSearch:{nextSearchLimit:{color:"#ff0000",fill:!1,weight:1},previousSearchLimit:{color:"#006400",fill:!1,weight:1},searchPointMarker:{color:"#006400",fill:!1,radius:20,weight:4},searchPointPolyline:{color:"#006400",fill:!1,weight:4},showSearchNoteDialog:!1},overpassApi:{useNwr:!0,timeOut:40,url:"https://lz4.overpass-api.de/api/interpreter"},printRouteMap:{isEnabled:!0,maxTiles:240,paperWidth:287,paperHeight:200,pageBreak:!1,printNotes:!0,borderWidth:30,zoomFactor:15,entryPointMarker:{color:"#00ff00",weight:4,radius:10,fill:!0,fillOpacity:1},exitPointMarker:{color:"#ff0000",weight:4,radius:10,fill:!0,fillOpacity:1}},route:{color:"#ff0000",dashArray:0,dashChoices:[{text:"——————",iDashArray:[0]},{text:"— — — — —",iDashArray:[4,2]},{text:"—‧—‧—‧—‧—",iDashArray:[4,2,0,2]},{text:"················",iDashArray:[0,2]}],elev:{smooth:!0,smoothCoefficient:.25,smoothPoints:3},showDragTooltip:3,width:3},routeEditor:{showEditedRouteInRoadbook:!0},travelEditor:{startMinimized:!0,startupRouteEdition:!0,timeout:1e3},travelNotes:{autoLoad:!0,haveBeforeUnloadWarning:!0,language:"fr"},travelNotesToolbarUI:{contactMail:{url:"https://github.com/wwwouaiebe/leaflet.TravelNotes/issues"}},wayPoint:{reverseGeocoding:!1,geocodingIncludeName:!1}}; /** @------------------------------------------------------------------------------------------------------------------------------ diff --git a/package.json b/package.json index e5519f1b..73fee701 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leaflet.travelnotes", - "version": "3.0.0-RC1", + "version": "3.0.0", "description": "A mapping and routing application.", "main": "src/main/main.js", "dependencies": { diff --git a/src/README.md b/src/README.md index c6cf1462..63759baf 100644 --- a/src/README.md +++ b/src/README.md @@ -4,14 +4,16 @@ First, you need Node.js and a local web server installed on your computer. Havin Then clone leaflet.TravelNotes in your GitHub repository and install it on your computer. -Open a Node.js command prompt or a Git shell and go to the directory where leaflet.TravelNote is installed and run __npm install leafletTravelNotes__. All the needed Node packages wil be installed. +Open a Node.js command prompt or a Git shell and go to the directory where leaflet.TravelNote is installed and run __npm install leaflet.TravelNotes__. All the needed Node packages wil be installed. From the Node.js command prompt or Git shell run: -- __grunt__ to build the application in debug mode -- __grunt docs__ to build the application in debug mode and build the technical documentation -- __grunt release__ to build the application in release mode and build the technical documentation +- __grunt__ to verify the sources with eslint +- __grunt doc__ to build the technical documentation +- __grunt debug__ to build the application in debug mode +- __grunt release__ to build the application in debug and release mode and build the technical documentation -When running grunt, the source files are verified with eslint and rollup. If an error is found, grunt is stopped and the build not executed, so you have to correct all the errors before you can run the application. +When running grunt in debug or release mode, the source files are verified with eslint and rollup. If an error is found, grunt is stopped and the build not executed, +so you have to correct all the errors before you can run the application. ## What's the difference between debug and release modes? @@ -20,7 +22,8 @@ In debug mode, the application is installed in the leaflet.TravelNotes/debug fol In release mode the application is installed in the leaflet.TravelNotes/dist folder and in the leaflet.TravelNotes/gh-page folder. The leaflet.TravelNotes/gh-page folder contains all the needed files to run the application, included last version of leaflet. -In release mode, all the js sources files are grouped in one big js file with rollup and then this file is minified with terser, so the file is quite imposible to understand if an error occurs at the execution time. +In release mode, all the js sources files are grouped in one big js file with rollup, the private fields and methods transformed in public fields and method for compatibility with old browsers, +and then this file is minified with terser, so the file is quite imposible to understand if an error occurs at the execution time. # How the application works @@ -34,8 +37,8 @@ the map (notes, routes, waypoints) or on the user interface (UI), a drag and dro This event is captured by an event listener (one of the classes with the name finishing with __...EL__) and the event listener call a method, mainly in one of the global objects in the __core__ module / folder. When the action is performed, the map and the UI have to be updated with the new/modifed/deleted data. So at the end of the procedure a new event is dispatched to the document with the data -( see the __coreLib/EventDispatcher.js__ file ). This second event is captured by an event listener on the document (see __AppLoader.#addEventsListeners ( )__ method). This event listener call the appropriate methods -of the classes __MapEditor__ and __UI__ to update the map and the UI. +( see the __coreLib/EventDispatcher.js__ file ). This second event is captured by an event listener on the document (see __AppLoader.#addEventsListeners ( )__ method). This event listener call +the appropriate methods of the classes __MapEditor__ and __UI__ to update the map and the UI. Seems to be simple, but remember that there are quite 200 event listeners in the app. diff --git a/src/cfg/TravelNotesConfig.json b/src/cfg/TravelNotesConfig.json index 76739d99..5b92e7b7 100644 --- a/src/cfg/TravelNotesConfig.json +++ b/src/cfg/TravelNotesConfig.json @@ -161,8 +161,9 @@ "showSearchNoteDialog":false }, "overpassApi": { + "useNwr":true, "timeOut":40, - "url":"https://z.overpass-api.de/api/interpreter" + "url":"https://lz4.overpass-api.de/api/interpreter" }, "printRouteMap": { diff --git a/src/coreOsmSearch/OsmSearchEngine.js b/src/coreOsmSearch/OsmSearchEngine.js index 41c8f29c..412e5ad8 100644 --- a/src/coreOsmSearch/OsmSearchEngine.js +++ b/src/coreOsmSearch/OsmSearchEngine.js @@ -49,6 +49,7 @@ Tests ... import theEventDispatcher from '../coreLib/EventDispatcher.js'; import theTravelNotesData from '../data/TravelNotesData.js'; +import theConfig from '../data/Config.js'; import OverpassAPIDataLoader from '../coreLib/OverpassAPIDataLoader.js'; import theOsmSearchDictionary from '../coreOsmSearch/OsmSearchDictionary.js'; import theGeometry from '../coreLib/Geometry.js'; @@ -181,13 +182,36 @@ class OsmSearchEngine { ); queryTag = queryTag.substr ( ZERO, queryTag.length - ONE ) + '"'; } - let queryElement = - ONE === valuesElements.elements.size ? valuesElements.elements.values ( ).next ( ).value : 'nwr'; - searchQueries.push ( - queryElement + '[' + queryTag + ']' + searchBoundingBoxString + ';' + - ( 'node' === queryElement ? '' : '(._;>;);' ) + 'out;' - ); + // This modification due to slow response from https://lz4.overpass-api.de/api/interpreter + // Some overpass API servers don't know nwr... + + if ( theConfig.overpassApi.useNwr ) { + let queryElement = + ONE === valuesElements.elements.size ? valuesElements.elements.values ( ).next ( ).value : 'nwr'; + + searchQueries.push ( + queryElement + '[' + queryTag + ']' + searchBoundingBoxString + ';' + + ( 'node' === queryElement ? '' : '(._;>;);' ) + 'out;' + ); + } + else { + let queryElements = []; + if ( ONE === valuesElements.elements.size ) { + queryElements .push ( valuesElements.elements.values ( ).next ( ).value ); + } + else { + queryElements = [ 'node', 'way', 'rel' ]; + } + queryElements.forEach ( + queryElement => { + searchQueries.push ( + queryElement + '[' + queryTag + ']' + searchBoundingBoxString + ';' + + ( 'node' === queryElement ? '' : '(._;>;);' ) + 'out;' + ); + } + ); + } } ); diff --git a/src/data/Config.js b/src/data/Config.js index 973b5f08..dd72ceff 100644 --- a/src/data/Config.js +++ b/src/data/Config.js @@ -228,6 +228,7 @@ let theConfig = { showSearchNoteDialog : false }, overpassApi : { + useNwr : true, timeOut : 40, url : 'https://lz4.overpass-api.de/api/interpreter' // "https://overpass.openstreetmap.fr/api/interpreter" }, diff --git a/src/data/Version.js b/src/data/Version.js index 575ac951..5392965a 100644 --- a/src/data/Version.js +++ b/src/data/Version.js @@ -84,7 +84,7 @@ and run npm audit fix before a release. */ const theDataVersion = '2.3.0'; -const theAppVersion = 'v3.0.0-RC1'; +const theAppVersion = 'v3.0.0'; export { theDataVersion, theAppVersion };