diff --git a/dist/TravelNotes.min.js b/dist/TravelNotes.min.js index 25398d34..1463b272 100644 --- a/dist/TravelNotes.min.js +++ b/dist/TravelNotes.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 @@ -41,7 +41,7 @@ @private @------------------------------------------------------------------------------------------------------------------------------ - */const e=Object.freeze({fixed:2,invalid:-1,defaultValue:0}),t=Object.freeze({refusedByUser:-1,disabled:0,inactive:1,active:2}),o=Object.freeze({invalidPane:"43a6a53e-008a-4910-80a6-7a87d301ea15",itineraryPane:"8fbf0da7-4e6f-4bc7-8e20-1388461ccde7",travelNotesPane:"dffe782b-07df-4b81-a318-f287c0cf5ec6",searchPane:"228f00d7-43a8-4c13-897d-70400cb6dd58"}),a=Object.freeze({fixed:2,defaultValue:0}),n=Object.freeze({defaultValue:0,fixed:6}),r=Object.freeze({notEdited:0,editedNoChange:1,editedChanged:2}),i=Object.freeze({margin:100,height:500,width:1e3,yDeltaText:30,xDeltaText:10,vScales:[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3],hScales:[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3,1e4,2e4,5e4,1e5]}),l=Object.freeze({width:40,height:40,svgViewboxDim:200}),s=[.3,10,1],d="http://www.w3.org/2000/svg";let c=new Map;c.set("a",["href","target"]),c.set("div",[]),c.set("del",[]),c.set("em",[]),c.set("figcaption",[]),c.set("figure",[]),c.set("h1",[]),c.set("h2",[]),c.set("h3",[]),c.set("h4",[]),c.set("h5",[]),c.set("h6",[]),c.set("hr",[]),c.set("img",["src","alt","width","height"]),c.set("ins",[]),c.set("li",[]),c.set("mark",[]),c.set("ol",[]),c.set("p",[]),c.set("s",[]),c.set("small",[]),c.set("strong",[]),c.set("span",[]),c.set("sub",[]),c.set("sup",[]),c.set("ul",[]),c.set("svg",["xmlns","viewBox","class"]),c.set("text",["x","y","text-anchor"]),c.set("polyline",["points","class","transform"]);const u=window.location.protocol,g=new DOMParser;function v(e){return e.replaceAll(//g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}function h(e,t="href"){let o=g.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let a=o.querySelector("body").firstChild,n="";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,""),n!==e)return{url:"",errorsString:"Invalid characters found in the url"};let r=["https:"];if("http:"!==u&&"href"!==t||r.push("http:"),"href"===t){r.push("mailto:"),r.push("sms:"),r.push("tel:");let e=n.match(/^#\w*/);if(e&&n===e[0])return{url:n,errorsString:""}}"src"===t&&r.push("data:");let i=null;try{i=new URL(n)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(-1===r.indexOf(i.protocol))return{url:"",errorsString:"Invalid protocol "+i.protocol};if(-1!==["sms:","tel:"].indexOf(i.protocol)&&i.pathname.match(/^\+[0-9,*,#]*$/))return{url:n,errorsString:""};try{encodeURIComponent(i.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:n,errorsString:""}}const p=Object.freeze(new class{sanitizeToColor(e){let t=e.match(/^#[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t){return h(e,t)}sanitizeToJsString(e){return function(e){let t=g.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.querySelector("body").firstChild,a="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),a}(e)}sanitizeToHtmlElement(e,t){!function(e,t){let o=g.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?function e(t,o){let a=t.childNodes;for(let n=0;n{if(t)a.hasAttributeNS(null,e)&&(n.setAttributeNS(null,e,a.getAttribute(e)),a.removeAttributeNS(null,e));else if(a.hasAttribute(e))if("href"===e||"src"===e){let t=h(a.getAttribute(e),e).url;""!==t&&n.setAttribute(e,t)}else n.setAttribute(e,a.getAttribute(e))}),a.hasAttribute("style")){a.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.appendChild(n),e(a,n)}else"#text"===r&&o.appendChild(document.createTextNode(a.nodeValue))}}(o.querySelector("body").firstChild,t):t.textContent=""}(e,t)}sanitizeToHtmlString(e){return function(e){let t="",o="",a=g.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return a&&"#document"===a.nodeName?(function e(a){let n=a.childNodes;for(let r=0;r{if(a)n.hasAttributeNS(null,e)&&(t+=" "+e+'="'+v(n.getAttribute(e))+'"',n.removeAttribute(e));else if(n.hasAttribute(e))if("href"===e||"src"===e){let a=h(n.getAttribute(e),e).url;""===a?o+="\nAn invalid url ("+n.getAttribute(e)+") was removed from a "+e+" attribute":t+=" "+e+'="'+a+'"',n.removeAttribute(e)}else t+=" "+e+'="'+v(n.getAttribute(e))+'"',n.removeAttribute(e)}),t+=">",e(n),t+=""}else"#text"===i?t+=v(n.nodeValue):o+="\nAn invalid tag "+i+" was removed";if(n.hasAttributes)for(let e=0;e/g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}function h(e,t="href"){let o=g.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let a=o.querySelector("body").firstChild,n="";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,""),n!==e)return{url:"",errorsString:"Invalid characters found in the url"};let r=["https:"];if("http:"!==u&&"href"!==t||r.push("http:"),"href"===t){r.push("mailto:"),r.push("sms:"),r.push("tel:");let e=n.match(/^#\w*/);if(e&&n===e[0])return{url:n,errorsString:""}}"src"===t&&r.push("data:");let i=null;try{i=new URL(n)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(-1===r.indexOf(i.protocol))return{url:"",errorsString:"Invalid protocol "+i.protocol};if(-1!==["sms:","tel:"].indexOf(i.protocol)&&i.pathname.match(/^\+[0-9,*,#]*$/))return{url:n,errorsString:""};try{encodeURIComponent(i.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:n,errorsString:""}}const p=Object.freeze(new class{sanitizeToColor(e){let t=e.match(/^#[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t){return h(e,t)}sanitizeToJsString(e){return function(e){let t=g.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.querySelector("body").firstChild,a="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),a}(e)}sanitizeToHtmlElement(e,t){!function(e,t){let o=g.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?function e(t,o){let a=t.childNodes;for(let n=0;n{if(t)a.hasAttributeNS(null,e)&&(n.setAttributeNS(null,e,a.getAttribute(e)),a.removeAttributeNS(null,e));else if(a.hasAttribute(e))if("href"===e||"src"===e){let t=h(a.getAttribute(e),e).url;""!==t&&n.setAttribute(e,t)}else n.setAttribute(e,a.getAttribute(e))}),a.hasAttribute("style")){a.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.appendChild(n),e(a,n)}else"#text"===r&&o.appendChild(document.createTextNode(a.nodeValue))}}(o.querySelector("body").firstChild,t):t.textContent=""}(e,t)}sanitizeToHtmlString(e){return function(e){let t="",o="",a=g.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return a&&"#document"===a.nodeName?(function e(a){let n=a.childNodes;for(let r=0;r{if(a)n.hasAttributeNS(null,e)&&(t+=" "+e+'="'+v(n.getAttribute(e))+'"',n.removeAttribute(e));else if(n.hasAttribute(e))if("href"===e||"src"===e){let a=h(n.getAttribute(e),e).url;""===a?o+="\nAn invalid url ("+n.getAttribute(e)+") was removed from a "+e+" attribute":t+=" "+e+'="'+a+'"',n.removeAttribute(e)}else t+=" "+e+'="'+v(n.getAttribute(e))+'"',n.removeAttribute(e)}),t+=">",e(n),t+=""}else"#text"===i?t+=v(n.nodeValue):o+="\nAn invalid tag "+i+" was removed";if(n.hasAttributes)for(let e=0;e=e?null:o[e-1]},get next(){return e=o.length},get first(){return 0===e},get last(){return e>=o.length-1},get index(){return e}})}function i(e){return o.findIndex(t=>t.objId===e)}function l(e,t,a){let n=i(e);if(-1===n)throw new Error("invalid objId for next or previous function");if(1!==a&&-1!==a)throw new Error("invalid direction");let r=t;for(r||(r=()=>!0),n+=a;-1{a=t(),a.jsonObject=e,n(a)})}})}let I=new Map;const L=Object.freeze(new class{setTranslations(e){e.forEach(e=>I.set(e.msgid,p.sanitizeToJsString(e.msgstr)))}getText(e,t){let o=I.get(e);return t&&o&&Object.getOwnPropertyNames(t).forEach(e=>o=o.replace("{"+e+"}",t[e])),o||e}});const A=Object.freeze(new class{get UUID(){let e=new Uint16Array(8);const t=["","-","-","-","-","","",""];window.crypto.getRandomValues(e);let o="";for(let a=0;a<8;a++)o+=e[a].toString(16).padStart(4,"0")+t[a];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}}saveFile(e,t,o){try{let a=window.URL.createObjectURL(new File([t],e,{type:o||"text/plain"})),n=document.createElement("a");n.setAttribute("href",a),n.setAttribute("download",e),n.click(),window.URL.revokeObjectURL(a)}catch(e){console.log(e||"An error occurs when saving file")}}formatTime(e){let t=Math.floor(e);if(0===t)return"";let o=Math.floor(t/86400),a=Math.floor(t%86400/3600),n=Math.floor(t%3600/60),r=Math.floor(t%60);return 0=t?"0 km":Math.floor(t/1e3)+","+Math.floor(t%1e3/10).toFixed(0).padStart(2,"0").padEnd(3,"0")+" km"}formatLat(e){return e>0?e.toFixed(n.fixed)+" N":(-e).toFixed(n.fixed)+" S"}formatLng(e){return e>0?e.toFixed(n.fixed)+" E":(-e).toFixed(n.fixed)+" W"}formatLatLng(e){return 0===e[0]&&0===e[1]?"":this.formatLat(e[0])+" - "+this.formatLng(e[1])}}),E=T("WayPoint"),j=new WeakMap;class P{constructor(){this.name="",this.address="",this.lat=n.defaultValue,this.lng=n.defaultValue,j.set(this,N())}get fullName(){let e=""===this.name?this.address:this.name+", "+this.address;return""===e&&(e=A.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 j.get(this)}get objType(){return E}get jsonObject(){return{name:this.name,address:this.address,lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),objId:j.get(this),objType:E.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+E.name);if(E.validate(e.objType),E.version!==e.objType.version)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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+E.name)}let t=Object.getOwnPropertyNames(e);return["address","name","lat","lng","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+E.name)}),e}(e);this.address=t.address||"",this.name=t.name||"",this.lat=t.lat||n.defaultValue,this.lng=t.lng||n.defaultValue,j.set(this,N()),this.validateData()}validateData(){"string"==typeof this.address?this.address=p.sanitizeToJsString(this.address):this.address="","string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="","number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue)}}function D(){return Object.seal(new P)}const C=T("ItineraryPoint"),R=new WeakMap;class M{constructor(){this.lat=n.defaultValue,this.lng=n.defaultValue,this.distance=e.defaultValue,this.elev=a.defaultValue,R.set(this,N())}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return C}get objId(){return R.get(this)}get jsonObject(){return{lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),distance:parseFloat(this.distance.toFixed(e.fixed)),elev:parseFloat(this.elev.toFixed(a.fixed)),objId:R.get(this),objType:C.jsonObject}}set jsonObject(t){let o=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+C.name);if(C.validate(e.objType),C.version!==e.objType.version)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=a.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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+C.name)}let t=Object.getOwnPropertyNames(e);return["lat","lng","distance","elev","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+C.name)}),e}(t);this.lat=o.lat||n.defaultValue,this.lng=o.lng||n.defaultValue,this.distance=o.distance||e.defaultValue,this.elev=o.elev||a.defaultValue,R.set(this,N()),this.validateData()}validateData(){"number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue),"number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.elev&&(this.elev=a.defaultValue)}}function S(){return Object.seal(new M)}const O=T("Maneuver"),U=new WeakMap;class k{constructor(){this.iconName="",this.instruction="",this.itineraryPointObjId=-1,this.distance=e.defaultValue,this.duration=e.defaultValue,U.set(this,N())}get objType(){return O}get objId(){return U.get(this)}get jsonObject(){return{iconName:this.iconName,instruction:this.instruction,distance:parseFloat(this.distance.toFixed(e.fixed)),duration:this.duration,itineraryPointObjId:this.itineraryPointObjId,objId:U.get(this),objType:O.jsonObject}}set jsonObject(t){let o=function(t){if(!Object.getOwnPropertyNames(t).includes("objType"))throw new Error("No objType for "+O.name);if(O.validate(t.objType),O.version!==t.objType.version)switch(t.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"===t.iconName&&(t.distance=e.defaultValue);case"1.12.0":case"1.13.0":case"2.0.0":t.objType.version="2.1.0";break;default:throw new Error("invalid version for "+O.name)}let o=Object.getOwnPropertyNames(t);return["iconName","instruction","distance","duration","itineraryPointObjId","objId"].forEach(e=>{if(!o.includes(e))throw new Error("No "+e+" for "+O.name)}),t}(t);this.iconName=o.iconName||"",this.instruction=o.instruction||"",this.distance=o.distance||e.defaultValue,this.duration=o.duration||e.defaultValue,this.itineraryPointObjId=o.itineraryPointObjId||-1,U.set(this,N()),this.validateData()}validateData(){"string"==typeof this.iconName?this.iconName=p.sanitizeToJsString(this.iconName):this.iconName="","string"==typeof this.instruction?this.instruction=p.sanitizeToJsString(this.instruction):this.instruction="","number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.duration&&(this.duration=e.defaultValue),"number"!=typeof this.itineraryPointObjId&&(this.itineraryPointObjId=-1)}}function B(){return Object.seal(new k)}const H=T("Itinerary"),z=new WeakMap;class V{constructor(){this.hasProfile=!1,this.ascent=0,this.descent=0,this.provider="",this.transitMode="",this.itineraryPoints=x(S),this.maneuvers=x(B),z.set(this,N())}get objType(){return H}get objId(){return z.get(this)}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:z.get(this),objType:H.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+H.name);if(H.validate(e.objType),H.version!==e.objType.version)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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+H.name)}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 "+H.name)}),e}(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||"",z.set(this,N());let o=new Map,a=0,n=this.itineraryPoints.iterator;for(;!n.done;)o.set(t.itineraryPoints[a].objId,n.value.objId),a++;let r=this.maneuvers.iterator;for(;!r.done;)r.value.itineraryPointObjId=o.get(r.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=p.sanitizeToJsString(this.provider):this.provider="","string"==typeof this.transitMode?this.transitMode=p.sanitizeToJsString(this.transitMode):this.transitMode=""}}function F(){return Object.seal(new V)}const W=T("Note"),K=new WeakMap;function J(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,"")}class Z{constructor(){this.iconHeight=0,this.iconWidth=0,this.iconContent="",this.popupContent="",this.tooltipContent="",this.phone="",this.url="",this.address="",this.iconLat=n.defaultValue,this.iconLng=n.defaultValue,this.lat=n.defaultValue,this.lng=n.defaultValue,this.distance=e.invalid,this.chainedDistance=e.defaultValue,K.set(this,N())}get isRouteNote(){return this.distance!==e.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 W}get objId(){return K.get(this)}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(n.fixed)),iconLng:parseFloat(this.iconLng.toFixed(n.fixed)),lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),distance:parseFloat(this.distance.toFixed(e.fixed)),chainedDistance:parseFloat(this.chainedDistance.toFixed(e.fixed)),objId:K.get(this),objType:W.jsonObject}}set jsonObject(t){let o=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+W.name);if(W.validate(e.objType),W.version!==e.objType.version)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=J(e.iconContent),e.popupContent=J(e.popupContent),e.tooltipContent=J(e.tooltipContent),e.phone=J(e.phone),e.address=J(e.address);case"2.0.0":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+W.name)}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 "+W.name)}),e}(t);this.iconHeight=o.iconHeight||0,this.iconWidth=o.iconWidth||0,this.iconContent=o.iconContent||"",this.popupContent=o.popupContent||"",this.tooltipContent=o.tooltipContent||"",this.phone=o.phone||"",this.url=o.url||"",this.address=o.address||"",this.iconLat=o.iconLat||n.defaultValue,this.iconLng=o.iconLng||n.defaultValue,this.lat=o.lat||n.defaultValue,this.lng=o.lng||n.defaultValue,this.distance=o.distance||e.invalid,this.chainedDistance=o.chainedDistance||e.defaultValue,K.set(this,N()),this.validateData(!0)}validateData(t){if("number"!=typeof this.iconHeight&&(this.iconHeight=0),"number"!=typeof this.iconWidth&&(this.iconWidth=0),"string"==typeof this.iconContent){let e=p.sanitizeToHtmlString(this.iconContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.iconContent+")"),this.iconContent=e.htmlString}else this.iconContent="";if("string"==typeof this.popupContent){let e=p.sanitizeToHtmlString(this.popupContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.popupContent+")"),this.popupContent=e.htmlString}else this.popupContent="";if("string"==typeof this.tooltipContent){let e=p.sanitizeToHtmlString(this.tooltipContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.tooltipContent+")"),this.tooltipContent=e.htmlString}else this.tooltipContent="";if("string"==typeof this.phone){let e=p.sanitizeToHtmlString(this.phone);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.phone+")"),this.phone=e.htmlString}else this.phone="";if("string"==typeof this.url&&""!==this.url){let e=p.sanitizeToUrl(this.url);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.url+")"),this.url=encodeURI(e.url)}else this.url="";"string"==typeof this.address?this.address=p.sanitizeToHtmlString(this.address).htmlString:this.address="","number"!=typeof this.iconLat&&(this.iconLat=n.defaultValue),"number"!=typeof this.iconLng&&(this.iconLng=n.defaultValue),"number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue),"number"!=typeof this.distance&&(this.distance=e.invalid),"number"!=typeof this.chainedDistance&&(this.chainedDistance=e.defaultValue)}}function X(){return Object.seal(new Z)}const G=T("Route"),q=new WeakMap;class Y{constructor(){this.name="",this.wayPoints=x(D),this.wayPoints.add(D()),this.wayPoints.add(D()),this.notes=x(X),this.itinerary=F(),this.width=f.route.width,this.color=f.route.color,this.dashArray=f.route.dashArray,this.chain=!1,this.chainedDistance=e.defaultValue,this.distance=e.defaultValue,this.duration=e.defaultValue,this.editionStatus=r.notEdited,this.hidden=!1,q.set(this,N())}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 q.get(this)}get objType(){return G}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(e.fixed)),duration:this.duration,editionStatus:this.editionStatus,hidden:this.hidden,chainedDistance:parseFloat(this.chainedDistance.toFixed(e.fixed)),objId:q.get(this),objType:G.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+G.name);if(G.validate(e.objType),G.version!==e.objType.version)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=r.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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+G.name)}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 "+G.name)}),e}(e);this.name=t.name||"",this.wayPoints.jsonObject=t.wayPoints||[],this.notes.jsonObject=t.notes||[],this.itinerary.jsonObject=t.itinerary||F().jsonObject,this.width=t.width||f.route.width,this.color=t.color||"#000000",this.dashArray=t.dashArray||0,this.chain=t.chain||!1,this.distance=t.distance,this.duration=t.duration,this.editionStatus=t.editionStatus||r.notEdited,this.hidden=t.hidden||!1,this.chainedDistance=t.chainedDistance,q.set(this,N()),this.validateData()}validateData(){"string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="","number"!=typeof this.width&&(this.width=f.route.width),"string"==typeof this.color?this.color=p.sanitizeToColor(this.color)||f.route.color:this.color=f.route.color,"number"!=typeof this.dashArray&&(this.dashArray=0),this.dashArray>=f.route.dashChoices.length&&(this.dashArray=0),"boolean"!=typeof this.chain&&(this.chain=!1),"number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.duration&&(this.duration=e.defaultValue),"number"!=typeof this.editionStatus&&(this.editionStatus=r.notEdited),"boolean"!=typeof this.hidden&&(this.hidden=!1),"number"!=typeof this.chainedDistance&&(this.chainedDistance=e.defaultValue)}}function Q(){return Object.seal(new Y)}const _=T("Travel"),$=new WeakMap;class ee{constructor(){this.editedRoute=Q(),this.routes=x(Q),this.notes=x(X),this.layerName="OSM - Color",this.name="",this.readOnly=!1,$.set(this,N())}get objId(){return $.get(this)}get objType(){return _}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:$.get(this),objType:_.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+_.name);if(_.validate(e.objType),_.version!==e.objType.version)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=Q();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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+_.name)}let t=Object.getOwnPropertyNames(e);return["name","editedRoute","routes","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+_.name)}),e}(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||[],$.set(this,N()),this.validateData()}validateData(){"string"==typeof this.layerName?this.layerName=p.sanitizeToJsString(this.layerName):this.layerName="OSM - Color","string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="TravelNotes","boolean"!=typeof this.readOnly&&(this.readOnly=!0)}}function te(){return Object.seal(new ee)}let oe=new Map,ae=new Map,ne=Object.seal({provider:"",transitMode:""}),re=A.UUID;const ie=Object.seal(new class{constructor(){this.map=null,this.travel=te(),this.editedRouteObjId=-1,this.searchData=[]}get providers(){return oe}get mapObjects(){return ae}get routing(){return ne}get UUID(){return re}});function le(){let e=0,t=0,o=0,a=0,n=0,r=0,i=null,l=null,s=null,d=null,c=null,u=null,g=null,v=null,h=null,m=null,f=null,y=null,w=null,N=!0,T=null,x=null,I=null;function A(e){N&&("Escape"===e.key||"Esc"===e.key?y.click():"Enter"===e.key&&f.click())}function E(i){o+=i.screenX-e,a+=i.screenY-t,o=Math.min(Math.max(o,20),n-s.clientWidth-20),a=Math.max(a,20);let l=r-Math.max(a,0)-20;s.style.top=String(a)+"px",s.style.left=String(o)+"px",s.style["max-height"]=String(l)+"px"}function j(o){try{o.dataTransfer.setData("Text","1")}catch(e){console.log(e)}e=o.screenX,t=o.screenY}function P(){document.removeEventListener("keydown",A,!0),document.querySelector("body").removeChild(i)}function D(){P(),I("Canceled by user")}function C(){let e=null;w&&(e=w(),!e)||(f.removeEventListener("click",C,!1),P(),x(e))}function R(e,t){x=e,I=t,document.querySelector("body").appendChild(i),document.addEventListener("keydown",A,!0),n=i.clientWidth,r=i.clientHeight,function(){o=(n-s.clientWidth)/2,a=(r-s.clientHeight)/2,o=Math.min(Math.max(o,20),n-s.clientWidth-20),a=Math.max(a,20);let e=r-Math.max(a,0)-20;s.style.top=String(a)+"px",s.style.left=String(o)+"px",s.style["max-height"]=String(e)+"px"}(),T&&T()}i=b.create("div",{className:"TravelNotes-Background"}),i.addEventListener("dragover",()=>null,!1),i.addEventListener("drop",()=>null,!1),s=b.create("div",{className:"TravelNotes-BaseDialog-Container"},i),l=b.create("div",{className:"TravelNotes-BaseDialog-TopBar",draggable:!0},s),l.addEventListener("dragstart",j,!1),l.addEventListener("dragend",E,!1),y=b.create("div",{textContent:"❌",className:"TravelNotes-BaseDialog-CancelButton",title:L.getText("BaseDialog - Cancel")},l),y.addEventListener("click",D,!1),d=b.create("div",{className:"TravelNotes-BaseDialog-HeaderDiv"},s),c=b.create("div",{className:"TravelNotes-BaseDialog-ContentDiv"},s),u=b.create("div",{className:"TravelNotes-BaseDialog-ErrorDiv TravelNotes-BaseDialog-Hidden"},s),g=b.create("div",{className:"TravelNotes-BaseDialog-WaitDiv"},s),m=b.create("div",{className:"TravelNotes-WaitAnimationBullet TravelNotes-BaseDialog-Hidden"},h=b.create("div",{className:"TravelNotes-WaitAnimation TravelNotes-BaseDialog-Hidden"},g)),v=b.create("div",{className:"TravelNotes-BaseDialog-FooterDiv"},s),f=b.create("div",{textContent:"🆗",className:"TravelNotes-BaseDialog-Button"},v),f.addEventListener("click",C,!1);return Object.seal(new class{set okButtonListener(e){w=e}set keyboardEventListenerEnabled(e){N=e}set onShow(e){T=e}set title(e){d.textContent=e}get content(){return c}get footer(){return v}get okButton(){return f}get cancelButton(){return y}showError(e){u.textContent="",p.sanitizeToHtmlElement(e,u),u.classList.remove("TravelNotes-BaseDialog-Hidden")}hideError(){u.textContent="",u.classList.add("TravelNotes-BaseDialog-Hidden")}showWait(){m.classList.remove("TravelNotes-BaseDialog-Hidden"),h.classList.remove("TravelNotes-BaseDialog-Hidden"),f.classList.add("TravelNotes-BaseDialog-Hidden")}hideWait(){m.classList.add("TravelNotes-BaseDialog-Hidden"),h.classList.add("TravelNotes-BaseDialog-Hidden"),f.classList.remove("TravelNotes-BaseDialog-Hidden")}show(){return new Promise(R)}})}function se(e){let t=null,o=null,a=null;function n(){return t.hideError(),!e||!(a.value.length<12)&&a.value.match(RegExp("[0-9]+"))&&a.value.match(RegExp("[a-z]+"))&&a.value.match(RegExp("[A-Z]+"))&&a.value.match(RegExp("[^0-9a-zA-Z]"))?(new window.TextEncoder).encode(a.value):(t.showError("

"+L.getText("PasswordDialog - Password rules1")+"

  • "+L.getText("PasswordDialog - Password rules2")+"
  • "+L.getText("PasswordDialog - Password rules3")+"
  • "+L.getText("PasswordDialog - Password rules4")+"
  • "+L.getText("PasswordDialog - Password rules5")+"
  • "+L.getText("PasswordDialog - Password rules6")+"
"),void a.focus())}return t=le(),t.title=L.getText("PasswordDialog - password"),t.okButtonListener=n,o=b.create("div",null,t.content),a=b.create("input",{type:"password"},o),t.onShow=function(){a.focus()},t} + */function T(e){const t=e;return Object.seal(new class{get name(){return t}get version(){return"2.1.0"}get jsonObject(){return{name:t,version:"2.1.0"}}validate(e){if(!Object.getOwnPropertyNames(e).includes("name"))throw new Error("No name for "+t);if(t!==e.name)throw new Error("Invalid name for "+t);if(!Object.getOwnPropertyNames(e).includes("version"))throw new Error("No version for "+t)}})}function x(e){const t=e;let o=[];const a=function(){let e=t();if(!e.objType||!e.objType.name)throw new Error("invalid object name for collection");return e.objType.name}();function n(e){if(!e.objType||!e.objType.name||e.objType.name!==a)throw new Error("invalid object name for add function");o.push(e)}function r(){let e=-1;return Object.seal({get value(){return e=e?null:o[e-1]},get next(){return e=o.length},get first(){return 0===e},get last(){return e>=o.length-1},get index(){return e}})}function i(e){return o.findIndex(t=>t.objId===e)}function l(e,t,a){let n=i(e);if(-1===n)throw new Error("invalid objId for next or previous function");if(1!==a&&-1!==a)throw new Error("invalid direction");let r=t;for(r||(r=()=>!0),n+=a;-1{a=t(),a.jsonObject=e,n(a)})}})}let I=new Map;const L=Object.freeze(new class{setTranslations(e){e.forEach(e=>I.set(e.msgid,p.sanitizeToJsString(e.msgstr)))}getText(e,t){let o=I.get(e);return t&&o&&Object.getOwnPropertyNames(t).forEach(e=>o=o.replace("{"+e+"}",t[e])),o||e}});const A=Object.freeze(new class{get UUID(){let e=new Uint16Array(8);const t=["","-","-","-","-","","",""];window.crypto.getRandomValues(e);let o="";for(let a=0;a<8;a++)o+=e[a].toString(16).padStart(4,"0")+t[a];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}}saveFile(e,t,o){try{let a=window.URL.createObjectURL(new File([t],e,{type:o||"text/plain"})),n=document.createElement("a");n.setAttribute("href",a),n.setAttribute("download",e),n.click(),window.URL.revokeObjectURL(a)}catch(e){console.log(e||"An error occurs when saving file")}}formatTime(e){let t=Math.floor(e);if(0===t)return"";let o=Math.floor(t/86400),a=Math.floor(t%86400/3600),n=Math.floor(t%3600/60),r=Math.floor(t%60);return 0=t?"0 km":Math.floor(t/1e3)+","+Math.floor(t%1e3/10).toFixed(0).padStart(2,"0").padEnd(3,"0")+" km"}formatLat(e){return e>0?e.toFixed(n.fixed)+" N":(-e).toFixed(n.fixed)+" S"}formatLng(e){return e>0?e.toFixed(n.fixed)+" E":(-e).toFixed(n.fixed)+" W"}formatLatLng(e){return 0===e[0]&&0===e[1]?"":this.formatLat(e[0])+" - "+this.formatLng(e[1])}}),E=T("WayPoint"),j=new WeakMap;class P{constructor(){this.name="",this.address="",this.lat=n.defaultValue,this.lng=n.defaultValue,j.set(this,N())}get fullName(){let e=""===this.name?this.address:this.name+", "+this.address;return""===e&&(e=A.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 j.get(this)}get objType(){return E}get jsonObject(){return{name:this.name,address:this.address,lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),objId:j.get(this),objType:E.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+E.name);if(E.validate(e.objType),E.version!==e.objType.version)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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+E.name)}let t=Object.getOwnPropertyNames(e);return["address","name","lat","lng","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+E.name)}),e}(e);this.address=t.address||"",this.name=t.name||"",this.lat=t.lat||n.defaultValue,this.lng=t.lng||n.defaultValue,j.set(this,N()),this.validateData()}validateData(){"string"==typeof this.address?this.address=p.sanitizeToJsString(this.address):this.address="","string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="","number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue)}}function D(){return Object.seal(new P)}const R=T("ItineraryPoint"),C=new WeakMap;class M{constructor(){this.lat=n.defaultValue,this.lng=n.defaultValue,this.distance=e.defaultValue,this.elev=a.defaultValue,C.set(this,N())}get latLng(){return[this.lat,this.lng]}set latLng(e){this.lat=e[0],this.lng=e[1]}get objType(){return R}get objId(){return C.get(this)}get jsonObject(){return{lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),distance:parseFloat(this.distance.toFixed(e.fixed)),elev:parseFloat(this.elev.toFixed(a.fixed)),objId:C.get(this),objType:R.jsonObject}}set jsonObject(t){let o=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+R.name);if(R.validate(e.objType),R.version!==e.objType.version)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=a.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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+R.name)}let t=Object.getOwnPropertyNames(e);return["lat","lng","distance","elev","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+R.name)}),e}(t);this.lat=o.lat||n.defaultValue,this.lng=o.lng||n.defaultValue,this.distance=o.distance||e.defaultValue,this.elev=o.elev||a.defaultValue,C.set(this,N()),this.validateData()}validateData(){"number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue),"number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.elev&&(this.elev=a.defaultValue)}}function S(){return Object.seal(new M)}const O=T("Maneuver"),U=new WeakMap;class k{constructor(){this.iconName="",this.instruction="",this.itineraryPointObjId=-1,this.distance=e.defaultValue,this.duration=e.defaultValue,U.set(this,N())}get objType(){return O}get objId(){return U.get(this)}get jsonObject(){return{iconName:this.iconName,instruction:this.instruction,distance:parseFloat(this.distance.toFixed(e.fixed)),duration:this.duration,itineraryPointObjId:this.itineraryPointObjId,objId:U.get(this),objType:O.jsonObject}}set jsonObject(t){let o=function(t){if(!Object.getOwnPropertyNames(t).includes("objType"))throw new Error("No objType for "+O.name);if(O.validate(t.objType),O.version!==t.objType.version)switch(t.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"===t.iconName&&(t.distance=e.defaultValue);case"1.12.0":case"1.13.0":case"2.0.0":t.objType.version="2.1.0";break;default:throw new Error("invalid version for "+O.name)}let o=Object.getOwnPropertyNames(t);return["iconName","instruction","distance","duration","itineraryPointObjId","objId"].forEach(e=>{if(!o.includes(e))throw new Error("No "+e+" for "+O.name)}),t}(t);this.iconName=o.iconName||"",this.instruction=o.instruction||"",this.distance=o.distance||e.defaultValue,this.duration=o.duration||e.defaultValue,this.itineraryPointObjId=o.itineraryPointObjId||-1,U.set(this,N()),this.validateData()}validateData(){"string"==typeof this.iconName?this.iconName=p.sanitizeToJsString(this.iconName):this.iconName="","string"==typeof this.instruction?this.instruction=p.sanitizeToJsString(this.instruction):this.instruction="","number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.duration&&(this.duration=e.defaultValue),"number"!=typeof this.itineraryPointObjId&&(this.itineraryPointObjId=-1)}}function B(){return Object.seal(new k)}const H=T("Itinerary"),z=new WeakMap;class V{constructor(){this.hasProfile=!1,this.ascent=0,this.descent=0,this.provider="",this.transitMode="",this.itineraryPoints=x(S),this.maneuvers=x(B),z.set(this,N())}get objType(){return H}get objId(){return z.get(this)}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:z.get(this),objType:H.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+H.name);if(H.validate(e.objType),H.version!==e.objType.version)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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+H.name)}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 "+H.name)}),e}(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||"",z.set(this,N());let o=new Map,a=0,n=this.itineraryPoints.iterator;for(;!n.done;)o.set(t.itineraryPoints[a].objId,n.value.objId),a++;let r=this.maneuvers.iterator;for(;!r.done;)r.value.itineraryPointObjId=o.get(r.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=p.sanitizeToJsString(this.provider):this.provider="","string"==typeof this.transitMode?this.transitMode=p.sanitizeToJsString(this.transitMode):this.transitMode=""}}function F(){return Object.seal(new V)}const W=T("Note"),K=new WeakMap;function J(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,"")}class Z{constructor(){this.iconHeight=0,this.iconWidth=0,this.iconContent="",this.popupContent="",this.tooltipContent="",this.phone="",this.url="",this.address="",this.iconLat=n.defaultValue,this.iconLng=n.defaultValue,this.lat=n.defaultValue,this.lng=n.defaultValue,this.distance=e.invalid,this.chainedDistance=e.defaultValue,K.set(this,N())}get isRouteNote(){return this.distance!==e.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 W}get objId(){return K.get(this)}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(n.fixed)),iconLng:parseFloat(this.iconLng.toFixed(n.fixed)),lat:parseFloat(this.lat.toFixed(n.fixed)),lng:parseFloat(this.lng.toFixed(n.fixed)),distance:parseFloat(this.distance.toFixed(e.fixed)),chainedDistance:parseFloat(this.chainedDistance.toFixed(e.fixed)),objId:K.get(this),objType:W.jsonObject}}set jsonObject(t){let o=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+W.name);if(W.validate(e.objType),W.version!==e.objType.version)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=J(e.iconContent),e.popupContent=J(e.popupContent),e.tooltipContent=J(e.tooltipContent),e.phone=J(e.phone),e.address=J(e.address);case"2.0.0":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+W.name)}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 "+W.name)}),e}(t);this.iconHeight=o.iconHeight||0,this.iconWidth=o.iconWidth||0,this.iconContent=o.iconContent||"",this.popupContent=o.popupContent||"",this.tooltipContent=o.tooltipContent||"",this.phone=o.phone||"",this.url=o.url||"",this.address=o.address||"",this.iconLat=o.iconLat||n.defaultValue,this.iconLng=o.iconLng||n.defaultValue,this.lat=o.lat||n.defaultValue,this.lng=o.lng||n.defaultValue,this.distance=o.distance||e.invalid,this.chainedDistance=o.chainedDistance||e.defaultValue,K.set(this,N()),this.validateData(!0)}validateData(t){if("number"!=typeof this.iconHeight&&(this.iconHeight=0),"number"!=typeof this.iconWidth&&(this.iconWidth=0),"string"==typeof this.iconContent){let e=p.sanitizeToHtmlString(this.iconContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.iconContent+")"),this.iconContent=e.htmlString}else this.iconContent="";if("string"==typeof this.popupContent){let e=p.sanitizeToHtmlString(this.popupContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.popupContent+")"),this.popupContent=e.htmlString}else this.popupContent="";if("string"==typeof this.tooltipContent){let e=p.sanitizeToHtmlString(this.tooltipContent);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.tooltipContent+")"),this.tooltipContent=e.htmlString}else this.tooltipContent="";if("string"==typeof this.phone){let e=p.sanitizeToHtmlString(this.phone);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.phone+")"),this.phone=e.htmlString}else this.phone="";if("string"==typeof this.url&&""!==this.url){let e=p.sanitizeToUrl(this.url);t&&""!==e.errorsString&&console.log(e.errorsString+" ("+this.url+")"),this.url=encodeURI(e.url)}else this.url="";"string"==typeof this.address?this.address=p.sanitizeToHtmlString(this.address).htmlString:this.address="","number"!=typeof this.iconLat&&(this.iconLat=n.defaultValue),"number"!=typeof this.iconLng&&(this.iconLng=n.defaultValue),"number"!=typeof this.lat&&(this.lat=n.defaultValue),"number"!=typeof this.lng&&(this.lng=n.defaultValue),"number"!=typeof this.distance&&(this.distance=e.invalid),"number"!=typeof this.chainedDistance&&(this.chainedDistance=e.defaultValue)}}function X(){return Object.seal(new Z)}const G=T("Route"),q=new WeakMap;class Y{constructor(){this.name="",this.wayPoints=x(D),this.wayPoints.add(D()),this.wayPoints.add(D()),this.notes=x(X),this.itinerary=F(),this.width=f.route.width,this.color=f.route.color,this.dashArray=f.route.dashArray,this.chain=!1,this.chainedDistance=e.defaultValue,this.distance=e.defaultValue,this.duration=e.defaultValue,this.editionStatus=r.notEdited,this.hidden=!1,q.set(this,N())}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 q.get(this)}get objType(){return G}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(e.fixed)),duration:this.duration,editionStatus:this.editionStatus,hidden:this.hidden,chainedDistance:parseFloat(this.chainedDistance.toFixed(e.fixed)),objId:q.get(this),objType:G.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+G.name);if(G.validate(e.objType),G.version!==e.objType.version)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=r.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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+G.name)}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 "+G.name)}),e}(e);this.name=t.name||"",this.wayPoints.jsonObject=t.wayPoints||[],this.notes.jsonObject=t.notes||[],this.itinerary.jsonObject=t.itinerary||F().jsonObject,this.width=t.width||f.route.width,this.color=t.color||"#000000",this.dashArray=t.dashArray||0,this.chain=t.chain||!1,this.distance=t.distance,this.duration=t.duration,this.editionStatus=t.editionStatus||r.notEdited,this.hidden=t.hidden||!1,this.chainedDistance=t.chainedDistance,q.set(this,N()),this.validateData()}validateData(){"string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="","number"!=typeof this.width&&(this.width=f.route.width),"string"==typeof this.color?this.color=p.sanitizeToColor(this.color)||f.route.color:this.color=f.route.color,"number"!=typeof this.dashArray&&(this.dashArray=0),this.dashArray>=f.route.dashChoices.length&&(this.dashArray=0),"boolean"!=typeof this.chain&&(this.chain=!1),"number"!=typeof this.distance&&(this.distance=e.defaultValue),"number"!=typeof this.duration&&(this.duration=e.defaultValue),"number"!=typeof this.editionStatus&&(this.editionStatus=r.notEdited),"boolean"!=typeof this.hidden&&(this.hidden=!1),"number"!=typeof this.chainedDistance&&(this.chainedDistance=e.defaultValue)}}function Q(){return Object.seal(new Y)}const _=T("Travel"),$=new WeakMap;class ee{constructor(){this.editedRoute=Q(),this.routes=x(Q),this.notes=x(X),this.layerName="OSM - Color",this.name="",this.readOnly=!1,$.set(this,N())}get objId(){return $.get(this)}get objType(){return _}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:$.get(this),objType:_.jsonObject}}set jsonObject(e){let t=function(e){if(!Object.getOwnPropertyNames(e).includes("objType"))throw new Error("No objType for "+_.name);if(_.validate(e.objType),_.version!==e.objType.version)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=Q();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":e.objType.version="2.1.0";break;default:throw new Error("invalid version for "+_.name)}let t=Object.getOwnPropertyNames(e);return["name","editedRoute","routes","objId"].forEach(e=>{if(!t.includes(e))throw new Error("No "+e+" for "+_.name)}),e}(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||[],$.set(this,N()),this.validateData()}validateData(){"string"==typeof this.layerName?this.layerName=p.sanitizeToJsString(this.layerName):this.layerName="OSM - Color","string"==typeof this.name?this.name=p.sanitizeToJsString(this.name):this.name="TravelNotes","boolean"!=typeof this.readOnly&&(this.readOnly=!0)}}function te(){return Object.seal(new ee)}let oe=new Map,ae=new Map,ne=Object.seal({provider:"",transitMode:""}),re=A.UUID;const ie=Object.seal(new class{constructor(){this.map=null,this.travel=te(),this.editedRouteObjId=-1,this.searchData=[]}get providers(){return oe}get mapObjects(){return ae}get routing(){return ne}get UUID(){return re}});function le(){let e=0,t=0,o=0,a=0,n=0,r=0,i=null,l=null,s=null,d=null,c=null,u=null,g=null,v=null,h=null,m=null,f=null,y=null,w=null,N=!0,T=null,x=null,I=null;function A(e){N&&("Escape"===e.key||"Esc"===e.key?y.click():"Enter"===e.key&&f.click())}function E(i){o+=i.screenX-e,a+=i.screenY-t,o=Math.min(Math.max(o,20),n-s.clientWidth-20),a=Math.max(a,20);let l=r-Math.max(a,0)-20;s.style.top=String(a)+"px",s.style.left=String(o)+"px",s.style["max-height"]=String(l)+"px"}function j(o){try{o.dataTransfer.setData("Text","1")}catch(e){console.log(e)}e=o.screenX,t=o.screenY}function P(){document.removeEventListener("keydown",A,!0),document.querySelector("body").removeChild(i)}function D(){P(),I("Canceled by user")}function R(){let e=null;w&&(e=w(),!e)||(f.removeEventListener("click",R,!1),P(),x(e))}function C(e,t){x=e,I=t,document.querySelector("body").appendChild(i),document.addEventListener("keydown",A,!0),n=i.clientWidth,r=i.clientHeight,function(){o=(n-s.clientWidth)/2,a=(r-s.clientHeight)/2,o=Math.min(Math.max(o,20),n-s.clientWidth-20),a=Math.max(a,20);let e=r-Math.max(a,0)-20;s.style.top=String(a)+"px",s.style.left=String(o)+"px",s.style["max-height"]=String(e)+"px"}(),T&&T()}i=b.create("div",{className:"TravelNotes-Background"}),i.addEventListener("dragover",()=>null,!1),i.addEventListener("drop",()=>null,!1),s=b.create("div",{className:"TravelNotes-BaseDialog-Container"},i),l=b.create("div",{className:"TravelNotes-BaseDialog-TopBar",draggable:!0},s),l.addEventListener("dragstart",j,!1),l.addEventListener("dragend",E,!1),y=b.create("div",{textContent:"❌",className:"TravelNotes-BaseDialog-CancelButton",title:L.getText("BaseDialog - Cancel")},l),y.addEventListener("click",D,!1),d=b.create("div",{className:"TravelNotes-BaseDialog-HeaderDiv"},s),c=b.create("div",{className:"TravelNotes-BaseDialog-ContentDiv"},s),u=b.create("div",{className:"TravelNotes-BaseDialog-ErrorDiv TravelNotes-BaseDialog-Hidden"},s),g=b.create("div",{className:"TravelNotes-BaseDialog-WaitDiv"},s),m=b.create("div",{className:"TravelNotes-WaitAnimationBullet TravelNotes-BaseDialog-Hidden"},h=b.create("div",{className:"TravelNotes-WaitAnimation TravelNotes-BaseDialog-Hidden"},g)),v=b.create("div",{className:"TravelNotes-BaseDialog-FooterDiv"},s),f=b.create("div",{textContent:"🆗",className:"TravelNotes-BaseDialog-Button"},v),f.addEventListener("click",R,!1);return Object.seal(new class{set okButtonListener(e){w=e}set keyboardEventListenerEnabled(e){N=e}set onShow(e){T=e}set title(e){d.textContent=e}get content(){return c}get footer(){return v}get okButton(){return f}get cancelButton(){return y}showError(e){u.textContent="",p.sanitizeToHtmlElement(e,u),u.classList.remove("TravelNotes-BaseDialog-Hidden")}hideError(){u.textContent="",u.classList.add("TravelNotes-BaseDialog-Hidden")}showWait(){m.classList.remove("TravelNotes-BaseDialog-Hidden"),h.classList.remove("TravelNotes-BaseDialog-Hidden"),f.classList.add("TravelNotes-BaseDialog-Hidden")}hideWait(){m.classList.add("TravelNotes-BaseDialog-Hidden"),h.classList.add("TravelNotes-BaseDialog-Hidden"),f.classList.remove("TravelNotes-BaseDialog-Hidden")}show(){return new Promise(C)}})}function se(e){let t=null,o=null,a=null;function n(){return t.hideError(),!e||!(a.value.length<12)&&a.value.match(RegExp("[0-9]+"))&&a.value.match(RegExp("[a-z]+"))&&a.value.match(RegExp("[A-Z]+"))&&a.value.match(RegExp("[^0-9a-zA-Z]"))?(new window.TextEncoder).encode(a.value):(t.showError("

"+L.getText("PasswordDialog - Password rules1")+"

  • "+L.getText("PasswordDialog - Password rules2")+"
  • "+L.getText("PasswordDialog - Password rules3")+"
  • "+L.getText("PasswordDialog - Password rules4")+"
  • "+L.getText("PasswordDialog - Password rules5")+"
  • "+L.getText("PasswordDialog - Password rules6")+"
"),void a.focus())}return t=le(),t.title=L.getText("PasswordDialog - password"),t.okButtonListener=n,o=b.create("div",null,t.content),a=b.create("input",{type:"password"},o),t.onShow=function(){a.focus()},t} /** @------------------------------------------------------------------------------------------------------------------------------ @@ -82,7 +82,7 @@ class{getTextPromise(e,t){return new Promise((function(o,a){let n=new XMLHttpReq @private @------------------------------------------------------------------------------------------------------------------------------ - */function de(){function e(e){return window.crypto.subtle.importKey("raw",e,{name:"PBKDF2"},!1,["deriveKey"])}function t(e){return window.crypto.subtle.deriveKey({name:"PBKDF2",salt:(new window.TextEncoder).encode("Tire la chevillette la bobinette cherra. Le Petit Chaperon rouge tira la chevillette."),iterations:1e6,hash:"SHA-256"},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}return Object.freeze(new class{encryptData(o,a,n,r){!function(o,a,n,r){let i=window.crypto.getRandomValues(new Uint8Array(16));r.then(e).then(t).then((function(e){return window.crypto.subtle.encrypt({name:"AES-GCM",iv:i},e,o)})).then((function(e){a(new Blob([i,new Uint8Array(e)],{type:"application/octet-stream"}))})).catch(n)}(o,a,n,r)}decryptData(o,a,n,r){!function(o,a,n,r){r.then(e).then(t).then((function(e){return window.crypto.subtle.decrypt({name:"AES-GCM",iv:new Uint8Array(o.slice(0,16))},e,new Uint8Array(o.slice(16)))})).then(a).catch(n)}(o,a,n,r)}})}let ce=null,ue=null,ge=null,ve=null,he=f.errorUI.showHelp;function pe(){he=!ge.checked}function me(){ue&&(clearTimeout(ue),ue=null),ce.classList.remove("TravelNotes-ErrorsUI-Error"),ce.classList.remove("TravelNotes-ErrorsUI-Warning"),ce.classList.remove("TravelNotes-ErrorsUI-Info"),ce.classList.remove("TravelNotes-ErrorsUI-Help"),ce.classList.add("TravelNotes-ErrorsUI-Hidden"),ge&&(ge.removeEventListener("change",pe,!1),ge=null,ve=null),ce.textContent=""}function fe(e,t){if("Error"===t&&!f.errorUI.showError||"Warning"===t&&!f.errorUI.showWarning||"Info"===t&&!f.errorUI.showInfo||"Help"===t&&!f.errorUI.showHelp||"Help"===t&&!he)return;ue&&me();let o=b.create("div",{id:"TravelNotes-ErrorsUI-Header"},ce);b.create("span",{id:"TravelNotes-ErrorsUI-CancelButton",textContent:"❌"},o).addEventListener("click",me,!1),p.sanitizeToHtmlElement(e,b.create("div",{id:"TravelNotes-ErrorsUI-Message"},ce)),ce.classList.add("TravelNotes-ErrorsUI-"+t);let a=f.errorUI.timeOut;"Help"===t&&(ve=b.create("div",{id:"TravelNotes-ErrorsUI-HelpInputDiv"},ce),ge=b.create("input",{id:"TravelNotes-ErrorsUI-HelpInput",type:"checkbox"},ve),ge.addEventListener("change",pe,!1),b.create("label",{id:"TravelNotes-ErrorsUI-HelpInputLabel",for:"TravelNotes-ErrorsUI-HelpInput",textContent:L.getText("ErrorUI - Dont show again")},ve),a=f.errorUI.helpTimeOut),ce.classList.remove("TravelNotes-ErrorsUI-Hidden"),ue=setTimeout(me,a)}const be=Object.freeze(new class{createUI(){ce||(ce=b.create("div",{id:"TravelNotes-ErrorsUI",className:"TravelNotes-ErrorsUI-Hidden"},document.querySelector("body")))}showError(e){fe(e,"Error")}showWarning(e){fe(e,"Warning")}showInfo(e){fe(e,"Info")}showHelp(e){fe(e,"Help")}});function ye(e){let t=null,o=null,a=null,n=null,r=null,i=null,l=null,s=null,d=null,c=null,u=null;function g(){let e=[],t=a.childNodes;for(let o=0;op(e)),t.hideWait(),t.hideError(),t.keyboardEventListenerEnabled=!0}function N(e){e.stopPropagation(),t.showWait(),t.keyboardEventListenerEnabled=!1,y.getBinaryPromise(window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"APIKeys").then(e=>{de().decryptData(e,w,m,se(!1).show())}).catch(()=>{t.showError(L.getText("APIKeysDialog - An error occurs when loading the APIKeys file")),t.hideWait(),t.keyboardEventListenerEnabled=!0})}function T(){t.showError(L.getText("APIKeysDialog - An error occurs when saving the keys")),t.hideWait(),t.keyboardEventListenerEnabled=!0}function x(e){t.hideError(),t.hideWait();let o=URL.createObjectURL(e),a=document.createElement("a");a.setAttribute("href",o),a.setAttribute("download","APIKeys"),a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),window.URL.revokeObjectURL(o),t.keyboardEventListenerEnabled=!0}function I(e){e.stopPropagation(),t.hideError(),v()&&(t.showWait(),t.keyboardEventListenerEnabled=!1,de().encryptData((new window.TextEncoder).encode(JSON.stringify(g())),x,T,se(!0).show()))}function E(e){t.hideError(),t.showWait(),t.keyboardEventListenerEnabled=!1,e.stopPropagation();let o=new FileReader;o.onload=function(){de().decryptData(o.result,w,m,se(!1).show())},o.readAsArrayBuffer(e.target.files[0])}function j(){n.click()}function P(e){e.stopPropagation(),p({providerName:"",providerKey:""})}function D(e){e.stopPropagation(),t.hideError(),v()&&A.saveFile("APIKeys.json",JSON.stringify(g()))}function C(e){e.stopPropagation(),t.hideError();let o=new FileReader;o.onload=function(){try{let e=JSON.parse(o.result);for(;a.firstChild;)a.removeChild(a.firstChild);e.forEach(e=>p(e))}catch(e){t.showError(e.message),console.log(e||"An error occurs when reading the file")}},o.readAsText(e.target.files[0])}function R(){r.click()}function M(){if(t.hideError(),v())return g()}return t=le(),t.title=L.getText("APIKeysDialog - API keys"),t.okButtonListener=M,o=b.create("div",{className:"TravelNotes-APIKeysDialog-ToolbarDiv"},t.content),f.haveCrypto&&(i=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Reload from server"),textContent:"🔄"},o),i.addEventListener("click",N,!1),l=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Save to file"),textContent:"💾"},o),l.addEventListener("click",I,!1),n=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},o),n.addEventListener("change",E,!1),s=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Open file"),textContent:"📂"},o),s.addEventListener("click",j,!1)),d=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - new API key"),textContent:"+"},o),d.addEventListener("click",P,!1),f.APIKeys.dialogHaveUnsecureButtons&&(c=b.create("div",{className:"TravelNotes-BaseDialog-Button TravelNotes-APIKeysDialog-AtRightButton",title:L.getText("APIKeysDialog - Save to json file"),textContent:"💾"},o),c.addEventListener("click",D,!1),r=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},o),r.addEventListener("change",C,!1),u=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Open json file"),textContent:"📂"},o),u.addEventListener("click",R,!1)),a=b.create("div",{id:"TravelNotes-APIKeysDialog-DataDiv"},t.content),e.forEach(e=>p(e)),be.showHelp("

"+L.getText("Help - Complete the APIKeys1")+"

"+L.getText("Help - Complete the APIKeys2")+"

"+L.getText("Help - Complete the APIKeys3")+"

"),t}const we=Object.freeze(new class{dispatch(e,t){let o=function(e){return-1<["showitinerary","updateitinerary","showtravelnotes","updatetravelnotes","showsearch","updatesearch","setrouteslist","setprovider","providersadded","travelnameupdated","settransitmode"].indexOf(e)?document.getElementById("TravelNotes-UI-MainDiv"):-1<["removeobject","removeallobjects","zoomto","additinerarypointmarker","addsearchpointmarker","addrectangle","addwaypoint","layerchange","geolocationstatuschanged","geolocationpositionchanged","routeupdated","routepropertiesupdated","noteupdated","roadbookupdate","profileclosed"].indexOf(e)?document:null}(e);if(o){let a=new Event(e);t&&(a.data=t),o.dispatchEvent(a)}}});let Ne=new Map;function Te(e){return Ne.get(e.toLowerCase())}function xe(e,t){Ne.set(e.toLowerCase(),t)}function Ie(e){sessionStorage.clear(),Ne.clear();let t=A.storageAvailable("sessionStorage")&&f.APIKeys.saveToSessionStorage;e.forEach(e=>{t&&sessionStorage.setItem(e.providerName.toLowerCase()+"ProviderKey",btoa(e.providerKey)),xe(e.providerName,e.providerKey)}),ie.providers.forEach(e=>{e.providerKey=Te(e.name)||""}),we.dispatch("providersadded")}function Le(e){Ie(JSON.parse((new TextDecoder).decode(e)))}function Ae(e){console.log(e||"An error occurs when reading the APIKeys file"),e&&"Canceled by user"!==e&&be.showError(L.getText("APIKeysManager - An error occurs when reading the APIKeys file"))}function Ee(e){de().decryptData(e,Le,Ae,se(!1).show())}const je=Object.seal(new class{getKey(e){return Te(e)}setKeysFromServerFile(){0===function(){let e=0;for(let t=0;t{e.providerKey=Te(e.name)||""}),e}()?f.haveCrypto&&y.getBinaryPromise(window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"APIKeys").then(Ee).catch(e=>console.log(e||"APIKeys not found on server")):we.dispatch("providersadded")}setKeysFromDialog(){let e=[];Ne.forEach((t,o)=>e.push({providerName:o,providerKey:t})),e.sort((e,t)=>e.providerName.localeCompare(t.providerName)),ye(e).show().then(e=>Ie(e)).catch(e=>console.log(e||"canceled by user"))}addProvider(e){let t=e.name.toLowerCase(),o=Te(t);e.providerKeyNeeded&&!o&&A.storageAvailable("sessionStorage")&&(o=sessionStorage.getItem(t),o&&(o=atob(o))),e.providerKeyNeeded&&o&&(e.providerKey=o),ie.providers.set(e.name.toLowerCase(),e)}});const Pe=Object.seal(new class{getRoute(e){let t=null;return t=ie.travel.routes.getAt(e),t||e===ie.travel.editedRoute.objId&&(t=ie.travel.editedRoute),t}getNoteAndRoute(e){let t=null,o=null;if(t=ie.travel.notes.getAt(e),!t){let a=ie.travel.routes.iterator;for(;!a.done&&!t;)t=a.value.notes.getAt(e),t&&(o=a.value);t||(t=ie.travel.editedRoute.notes.getAt(e),t&&(o=ie.travel.editedRoute))}return Object.freeze({note:t,route:o})}getWayPoint(e){let t=ie.travel.editedRoute.wayPoints.getAt(e);if(!t){let o=ie.travel.routes.iterator;for(;!o.done&&!t;)t=o.value.wayPoints.getAt(e)}return t}});function De(){let e="",t="",o=null;function a(a){o=Pe.getRoute(a),o&&(t='time="'+(new Date).toISOString()+'" ',e='\n',e+='',function(){let a=o.wayPoints.iterator;for(;!a.done;)e+='\n\t"}(),function(){e+="\n\t";let a=o.itinerary.maneuvers.iterator;for(;!a.done;){let n=o.itinerary.itineraryPoints.getAt(a.value.itineraryPointObjId),r=a.value.instruction.replace("&","&").replace('"',"'").replace('"',""e;").replace(">",">").replace("<","<");e+='\n\t\t'}e+="\n\t"}(),function(){e+="\n\t",e+="\n\t\t";let a=o.itinerary.itineraryPoints.iterator;for(;!a.done;)e+='\n\t\t\t";e+="\n\t\t",e+="\n\t"}(),e+="\n",function(){let t=(""===ie.travel.name?"":ie.travel.name+" - ")+o.computedName;""===t&&(t="TravelNote"),t+=".gpx",A.saveFile(t,e)}())}return Object.seal(new class{routeToGpx(e){a(e)}})}class Ce{constructor(e,t,o){this.red=("number"==typeof e?e:255)%256,this.green=("number"==typeof t?t:255)%256,this.blue=("number"==typeof o?o:255)%256}get cssColor(){return"#"+this.red.toString(16).padStart(2,"0")+this.green.toString(16).padStart(2,"0")+this.blue.toString(16).padStart(2,"0")}set cssColor(e){this.red=parseInt(e.substr(1,2),16),this.green=parseInt(e.substr(3,2),16),this.blue=parseInt(e.substr(5,2),16)}clone(){return new Ce(this.red,this.green,this.blue)}copyTo(e){e.red=this.red,e.green=this.green,e.blue=this.blue}}function Re(e){let t=null,o=null,a=null,n=null,r=null,i=null;function l(){return e.color=document.getElementById("TravelNotes-ColorDialog-ColorSampleDiv").color.cssColor,e.computedName!==a.value&&(e.name=a.value),e.width=parseInt(n.value),e.chain=r.checked,e.dashArray=i.selectedIndex,e.validateData(),e}return t=function(e){let t=null,o=new Ce;o.cssColor=e;let a=null,n=[],r=null,i=null,l=null,s=null;function d(e){o=e.target.color.clone(),r.value=o.red,i.value=o.green,l.value=o.blue,s.style["background-color"]=o.cssColor,s.color=o}function c(e){for(let t=0;t<6;++t)for(let o=0;o<6;++o){let a=n[6*t+o];a.color.red=e,a.style["background-color"]=a.color.cssColor}}function u(e){c(Math.ceil(2.55*e.target.valueAsNumber))}function g(e){c(255-e.target.color.blue)}function v(){o.red=parseInt(r.value),o.green=parseInt(i.value),o.blue=parseInt(l.value),s.style["background-color"]=o.cssColor,s.color=o}return t=le(),t.title=L.getText("ColorDialog - Colors"),a=b.create("div",{id:"TravelNotes-ColorDialog-ColorDiv"},t.content),function(){let e=b.create("div",null,a),t=new Ce(f.colorDialog.initialRed,0,0);for(let o=0;o<6;++o){let o=b.create("div",{className:"TravelNotes-ColorDialog-RowColorDiv"},e);t.green=0;for(let e=0;e<6;++e){let e=b.create("div",{className:"TravelNotes-ColorDialog-CellColorDiv"},o);e.color=t.clone(),e.style["background-color"]=t.cssColor,e.addEventListener("click",d,!1),t.green+=51,n.push(e)}t.blue+=51}}(),f.colorDialog.haveSlider?function(){let e=b.create("div",null,a),t=Math.ceil(f.colorDialog.initialRed*(100/255)),o=b.create("input",{type:"range",className:"TravelNotes-ColorDialog-SliderInput",value:t,min:0,max:100,step:20},e);o.addEventListener("input",u,!1),o.focus()}():function(){let e=b.create("div",null,a),t=new Ce(255,0,0),o=b.create("div",{className:"TravelNotes-ColorDialog-RowColorDiv",id:"TravelNotes-ColorDialog-RedButtonsRowDiv"},e);for(let e=0;e<6;++e){let e=b.create("div",{className:"TravelNotes-ColorDialog-CellColorDiv"},o);e.color=t.clone(),e.style["background-color"]=e.color.cssColor,e.addEventListener("click",g,!1),t.green+=51,t.blue+=51}}(),function(){let e=b.create("div",null,a);b.create("text",{value:L.getText("ColorDialog - Red")},e),r=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.red,min:0,max:255},e),r.addEventListener("input",v,!1),b.create("text",{value:L.getText("ColorDialog - Green")},e),i=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.green,min:0,max:255},e),i.addEventListener("input",v,!1),b.create("text",{value:L.getText("ColorDialog - Blue")},e),l=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.blue,min:0,max:255},e),l.addEventListener("input",v,!1)}(),s=b.create("div",{id:"TravelNotes-ColorDialog-ColorSampleDiv"},a),s.style["background-color"]=o.cssColor,s.color=o,t}(e.color),t.title=L.getText("RoutePropertiesDialog - Route properties"),t.okButtonListener=l,o=b.create("div",{id:"TravelNotes-RoutePropertiesDialog-MainDataDiv"}),t.content.insertBefore(o,t.content.firstChild),function(){let t=b.create("div",null,o);b.create("div",{textContent:L.getText("RoutePropertiesDialog - Name")},t);let n=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv",id:"TravelNotes-RoutePropertiesDialog-NameInputDiv"},t);a=b.create("input",{type:"text",id:"TravelNotes-RoutePropertiesDialog-NameInput",value:e.computedName},n)}(),function(){let t=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv"},o);b.create("text",{value:L.getText("RoutePropertiesDialog - Width")},b.create("span",null,t)),n=b.create("input",{type:"number",id:"TravelNotes-RoutePropertiesDialog-WidthInput",value:e.width,min:1,max:40},t)}(),function(){let t=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv"},o);b.create("text",{value:L.getText("RoutePropertiesDialog - Linetype")},b.create("span",null,t)),i=b.create("select",null,t);let a=f.route.dashChoices;for(let e=0;e=t)return null;let o=0,a=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/6371e3/Me,a=e[0]*Me,n=Math.acos((Math.cos(t/6371e3)-Math.sin(a)**2)/Math.cos(a)**2)/Me;return window.L.latLngBounds(window.L.latLng([e[0]-o,e[1]-n]),window.L.latLng([e[0]+o,e[1]+n]))}project(e,t){let o=ie.map.project(window.L.latLng(e),t);return[o.x,o.y]}screenCoordToLatLng(e,t){let o=ie.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]]}}),Oe=Math.PI/180;function Ue(e){return(e+540)%360-180}const ke=Object.freeze(new class{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]*Oe,a=t[0]*Oe,n=(Ue(t[1])-Ue(e[1]))*Oe;return 6371e3*Math.acos(Math.sin(o)*Math.sin(a)+Math.cos(o)*Math.cos(a)*Math.cos(n))}});function Be(){let e=[];function t(t){e.push(t.latLng),e.push(t.iconLatLng)}function o(o){o.itinerary.itineraryPoints.forEach(t=>e.push(t.latLng)),o.notes.forEach(e=>t(e))}return Object.seal(new class{zoomToLatLng(e){we.dispatch("zoomto",{latLng:e})}zoomToManeuver(e){let t=ie.travel.editedRoute.itinerary.maneuvers.getAt(e).itineraryPointObjId,o=ie.travel.editedRoute.itinerary.itineraryPoints.getAt(t).latLng;we.dispatch("zoomto",{latLng:o})}zoomToNote(o){e=[],t(Pe.getNoteAndRoute(o).note),we.dispatch("zoomto",{geometry:[e]})}zoomToRoute(t){e=[],o(Pe.getRoute(t)),we.dispatch("zoomto",{geometry:[e]})}zoomToTravel(){e=[],ie.travel.routes.forEach(e=>o(e)),-1!==ie.travel.editedRouteObjId&&o(ie.travel.editedRoute),ie.travel.notes.forEach(e=>t(e)),we.dispatch("zoomto",{geometry:[e]})}zoomToPoi(e){we.dispatch("zoomto",e)}})} + */function de(){function e(e){return window.crypto.subtle.importKey("raw",e,{name:"PBKDF2"},!1,["deriveKey"])}function t(e){return window.crypto.subtle.deriveKey({name:"PBKDF2",salt:(new window.TextEncoder).encode("Tire la chevillette la bobinette cherra. Le Petit Chaperon rouge tira la chevillette."),iterations:1e6,hash:"SHA-256"},e,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}return Object.freeze(new class{encryptData(o,a,n,r){!function(o,a,n,r){let i=window.crypto.getRandomValues(new Uint8Array(16));r.then(e).then(t).then((function(e){return window.crypto.subtle.encrypt({name:"AES-GCM",iv:i},e,o)})).then((function(e){a(new Blob([i,new Uint8Array(e)],{type:"application/octet-stream"}))})).catch(n)}(o,a,n,r)}decryptData(o,a,n,r){!function(o,a,n,r){r.then(e).then(t).then((function(e){return window.crypto.subtle.decrypt({name:"AES-GCM",iv:new Uint8Array(o.slice(0,16))},e,new Uint8Array(o.slice(16)))})).then(a).catch(n)}(o,a,n,r)}})}let ce=null,ue=null,ge=null,ve=null,he=f.errorUI.showHelp;function pe(){he=!ge.checked}function me(){ue&&(clearTimeout(ue),ue=null),ce.classList.remove("TravelNotes-ErrorsUI-Error"),ce.classList.remove("TravelNotes-ErrorsUI-Warning"),ce.classList.remove("TravelNotes-ErrorsUI-Info"),ce.classList.remove("TravelNotes-ErrorsUI-Help"),ce.classList.add("TravelNotes-ErrorsUI-Hidden"),ge&&(ge.removeEventListener("change",pe,!1),ge=null,ve=null),ce.textContent=""}function fe(e,t){if("Error"===t&&!f.errorUI.showError||"Warning"===t&&!f.errorUI.showWarning||"Info"===t&&!f.errorUI.showInfo||"Help"===t&&!f.errorUI.showHelp||"Help"===t&&!he)return;ue&&me();let o=b.create("div",{id:"TravelNotes-ErrorsUI-Header"},ce);b.create("span",{id:"TravelNotes-ErrorsUI-CancelButton",textContent:"❌"},o).addEventListener("click",me,!1),p.sanitizeToHtmlElement(e,b.create("div",{id:"TravelNotes-ErrorsUI-Message"},ce)),ce.classList.add("TravelNotes-ErrorsUI-"+t);let a=f.errorUI.timeOut;"Help"===t&&(ve=b.create("div",{id:"TravelNotes-ErrorsUI-HelpInputDiv"},ce),ge=b.create("input",{id:"TravelNotes-ErrorsUI-HelpInput",type:"checkbox"},ve),ge.addEventListener("change",pe,!1),b.create("label",{id:"TravelNotes-ErrorsUI-HelpInputLabel",for:"TravelNotes-ErrorsUI-HelpInput",textContent:L.getText("ErrorUI - Dont show again")},ve),a=f.errorUI.helpTimeOut),ce.classList.remove("TravelNotes-ErrorsUI-Hidden"),ue=setTimeout(me,a)}const be=Object.freeze(new class{createUI(){ce||(ce=b.create("div",{id:"TravelNotes-ErrorsUI",className:"TravelNotes-ErrorsUI-Hidden"},document.querySelector("body")))}showError(e){fe(e,"Error")}showWarning(e){fe(e,"Warning")}showInfo(e){fe(e,"Info")}showHelp(e){fe(e,"Help")}});function ye(e){let t=null,o=null,a=null,n=null,r=null,i=null,l=null,s=null,d=null,c=null,u=null;function g(){let e=[],t=a.childNodes;for(let o=0;op(e)),t.hideWait(),t.hideError(),t.keyboardEventListenerEnabled=!0}function N(e){e.stopPropagation(),t.showWait(),t.keyboardEventListenerEnabled=!1,y.getBinaryPromise(window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"APIKeys").then(e=>{de().decryptData(e,w,m,se(!1).show())}).catch(()=>{t.showError(L.getText("APIKeysDialog - An error occurs when loading the APIKeys file")),t.hideWait(),t.keyboardEventListenerEnabled=!0})}function T(){t.showError(L.getText("APIKeysDialog - An error occurs when saving the keys")),t.hideWait(),t.keyboardEventListenerEnabled=!0}function x(e){t.hideError(),t.hideWait();let o=URL.createObjectURL(e),a=document.createElement("a");a.setAttribute("href",o),a.setAttribute("download","APIKeys"),a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),window.URL.revokeObjectURL(o),t.keyboardEventListenerEnabled=!0}function I(e){e.stopPropagation(),t.hideError(),v()&&(t.showWait(),t.keyboardEventListenerEnabled=!1,de().encryptData((new window.TextEncoder).encode(JSON.stringify(g())),x,T,se(!0).show()))}function E(e){t.hideError(),t.showWait(),t.keyboardEventListenerEnabled=!1,e.stopPropagation();let o=new FileReader;o.onload=function(){de().decryptData(o.result,w,m,se(!1).show())},o.readAsArrayBuffer(e.target.files[0])}function j(){n.click()}function P(e){e.stopPropagation(),p({providerName:"",providerKey:""})}function D(e){e.stopPropagation(),t.hideError(),v()&&A.saveFile("APIKeys.json",JSON.stringify(g()))}function R(e){e.stopPropagation(),t.hideError();let o=new FileReader;o.onload=function(){try{let e=JSON.parse(o.result);for(;a.firstChild;)a.removeChild(a.firstChild);e.forEach(e=>p(e))}catch(e){t.showError(e.message),console.log(e||"An error occurs when reading the file")}},o.readAsText(e.target.files[0])}function C(){r.click()}function M(){if(t.hideError(),v())return g()}return t=le(),t.title=L.getText("APIKeysDialog - API keys"),t.okButtonListener=M,o=b.create("div",{className:"TravelNotes-APIKeysDialog-ToolbarDiv"},t.content),f.haveCrypto&&(i=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Reload from server"),textContent:"🔄"},o),i.addEventListener("click",N,!1),l=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Save to file"),textContent:"💾"},o),l.addEventListener("click",I,!1),n=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},o),n.addEventListener("change",E,!1),s=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Open file"),textContent:"📂"},o),s.addEventListener("click",j,!1)),d=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - new API key"),textContent:"+"},o),d.addEventListener("click",P,!1),f.APIKeys.dialogHaveUnsecureButtons&&(c=b.create("div",{className:"TravelNotes-BaseDialog-Button TravelNotes-APIKeysDialog-AtRightButton",title:L.getText("APIKeysDialog - Save to json file"),textContent:"💾"},o),c.addEventListener("click",D,!1),r=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},o),r.addEventListener("change",R,!1),u=b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("APIKeysDialog - Open json file"),textContent:"📂"},o),u.addEventListener("click",C,!1)),a=b.create("div",{id:"TravelNotes-APIKeysDialog-DataDiv"},t.content),e.forEach(e=>p(e)),be.showHelp("

"+L.getText("Help - Complete the APIKeys1")+"

"+L.getText("Help - Complete the APIKeys2")+"

"+L.getText("Help - Complete the APIKeys3")+"

"),t}const we=Object.freeze(new class{dispatch(e,t){let o=function(e){return-1<["showitinerary","updateitinerary","showtravelnotes","updatetravelnotes","showsearch","updatesearch","setrouteslist","setprovider","providersadded","travelnameupdated","settransitmode"].indexOf(e)?document.getElementById("TravelNotes-UI-MainDiv"):-1<["removeobject","removeallobjects","zoomto","additinerarypointmarker","addsearchpointmarker","addrectangle","addwaypoint","layerchange","geolocationstatuschanged","geolocationpositionchanged","routeupdated","routepropertiesupdated","noteupdated","roadbookupdate","profileclosed"].indexOf(e)?document:null}(e);if(o){let a=new Event(e);t&&(a.data=t),o.dispatchEvent(a)}}});let Ne=new Map;function Te(e){return Ne.get(e.toLowerCase())}function xe(e,t){Ne.set(e.toLowerCase(),t)}function Ie(e){sessionStorage.clear(),Ne.clear();let t=A.storageAvailable("sessionStorage")&&f.APIKeys.saveToSessionStorage;e.forEach(e=>{t&&sessionStorage.setItem(e.providerName.toLowerCase()+"ProviderKey",btoa(e.providerKey)),xe(e.providerName,e.providerKey)}),ie.providers.forEach(e=>{e.providerKey=Te(e.name)||""}),we.dispatch("providersadded")}function Le(e){Ie(JSON.parse((new TextDecoder).decode(e)))}function Ae(e){console.log(e||"An error occurs when reading the APIKeys file"),e&&"Canceled by user"!==e&&be.showError(L.getText("APIKeysManager - An error occurs when reading the APIKeys file"))}function Ee(e){de().decryptData(e,Le,Ae,se(!1).show())}const je=Object.seal(new class{getKey(e){return Te(e)}setKeysFromServerFile(){0===function(){let e=0;for(let t=0;t{e.providerKey=Te(e.name)||""}),e}()?f.haveCrypto&&y.getBinaryPromise(window.location.href.substr(0,window.location.href.lastIndexOf("/")+1)+"APIKeys").then(Ee).catch(e=>console.log(e||"APIKeys not found on server")):we.dispatch("providersadded")}setKeysFromDialog(){let e=[];Ne.forEach((t,o)=>e.push({providerName:o,providerKey:t})),e.sort((e,t)=>e.providerName.localeCompare(t.providerName)),ye(e).show().then(e=>Ie(e)).catch(e=>console.log(e||"canceled by user"))}addProvider(e){let t=e.name.toLowerCase(),o=Te(t);e.providerKeyNeeded&&!o&&A.storageAvailable("sessionStorage")&&(o=sessionStorage.getItem(t),o&&(o=atob(o))),e.providerKeyNeeded&&o&&(e.providerKey=o),ie.providers.set(e.name.toLowerCase(),e)}});const Pe=Object.seal(new class{getRoute(e){let t=null;return t=ie.travel.routes.getAt(e),t||e===ie.travel.editedRoute.objId&&(t=ie.travel.editedRoute),t}getNoteAndRoute(e){let t=null,o=null;if(t=ie.travel.notes.getAt(e),!t){let a=ie.travel.routes.iterator;for(;!a.done&&!t;)t=a.value.notes.getAt(e),t&&(o=a.value);t||(t=ie.travel.editedRoute.notes.getAt(e),t&&(o=ie.travel.editedRoute))}return Object.freeze({note:t,route:o})}getWayPoint(e){let t=ie.travel.editedRoute.wayPoints.getAt(e);if(!t){let o=ie.travel.routes.iterator;for(;!o.done&&!t;)t=o.value.wayPoints.getAt(e)}return t}});function De(){let e="",t="",o=null;function a(a){o=Pe.getRoute(a),o&&(t='time="'+(new Date).toISOString()+'" ',e='\n',e+='',function(){let a=o.wayPoints.iterator;for(;!a.done;)e+='\n\t"}(),function(){e+="\n\t";let a=o.itinerary.maneuvers.iterator;for(;!a.done;){let n=o.itinerary.itineraryPoints.getAt(a.value.itineraryPointObjId),r=a.value.instruction.replace("&","&").replace('"',"'").replace('"',""e;").replace(">",">").replace("<","<");e+='\n\t\t'}e+="\n\t"}(),function(){e+="\n\t",e+="\n\t\t";let a=o.itinerary.itineraryPoints.iterator;for(;!a.done;)e+='\n\t\t\t";e+="\n\t\t",e+="\n\t"}(),e+="\n",function(){let t=(""===ie.travel.name?"":ie.travel.name+" - ")+o.computedName;""===t&&(t="TravelNote"),t+=".gpx",A.saveFile(t,e)}())}return Object.seal(new class{routeToGpx(e){a(e)}})}class Re{constructor(e,t,o){this.red=("number"==typeof e?e:255)%256,this.green=("number"==typeof t?t:255)%256,this.blue=("number"==typeof o?o:255)%256}get cssColor(){return"#"+this.red.toString(16).padStart(2,"0")+this.green.toString(16).padStart(2,"0")+this.blue.toString(16).padStart(2,"0")}set cssColor(e){this.red=parseInt(e.substr(1,2),16),this.green=parseInt(e.substr(3,2),16),this.blue=parseInt(e.substr(5,2),16)}clone(){return new Re(this.red,this.green,this.blue)}copyTo(e){e.red=this.red,e.green=this.green,e.blue=this.blue}}function Ce(e){let t=null,o=null,a=null,n=null,r=null,i=null;function l(){return e.color=document.getElementById("TravelNotes-ColorDialog-ColorSampleDiv").color.cssColor,e.computedName!==a.value&&(e.name=a.value),e.width=parseInt(n.value),e.chain=r.checked,e.dashArray=i.selectedIndex,e.validateData(),e}return t=function(e){let t=null,o=new Re;o.cssColor=e;let a=null,n=[],r=null,i=null,l=null,s=null;function d(e){o=e.target.color.clone(),r.value=o.red,i.value=o.green,l.value=o.blue,s.style["background-color"]=o.cssColor,s.color=o}function c(e){for(let t=0;t<6;++t)for(let o=0;o<6;++o){let a=n[6*t+o];a.color.red=e,a.style["background-color"]=a.color.cssColor}}function u(e){c(Math.ceil(2.55*e.target.valueAsNumber))}function g(e){c(255-e.target.color.blue)}function v(){o.red=parseInt(r.value),o.green=parseInt(i.value),o.blue=parseInt(l.value),s.style["background-color"]=o.cssColor,s.color=o}return t=le(),t.title=L.getText("ColorDialog - Colors"),a=b.create("div",{id:"TravelNotes-ColorDialog-ColorDiv"},t.content),function(){let e=b.create("div",null,a),t=new Re(f.colorDialog.initialRed,0,0);for(let o=0;o<6;++o){let o=b.create("div",{className:"TravelNotes-ColorDialog-RowColorDiv"},e);t.green=0;for(let e=0;e<6;++e){let e=b.create("div",{className:"TravelNotes-ColorDialog-CellColorDiv"},o);e.color=t.clone(),e.style["background-color"]=t.cssColor,e.addEventListener("click",d,!1),t.green+=51,n.push(e)}t.blue+=51}}(),f.colorDialog.haveSlider?function(){let e=b.create("div",null,a),t=Math.ceil(f.colorDialog.initialRed*(100/255)),o=b.create("input",{type:"range",className:"TravelNotes-ColorDialog-SliderInput",value:t,min:0,max:100,step:20},e);o.addEventListener("input",u,!1),o.focus()}():function(){let e=b.create("div",null,a),t=new Re(255,0,0),o=b.create("div",{className:"TravelNotes-ColorDialog-RowColorDiv",id:"TravelNotes-ColorDialog-RedButtonsRowDiv"},e);for(let e=0;e<6;++e){let e=b.create("div",{className:"TravelNotes-ColorDialog-CellColorDiv"},o);e.color=t.clone(),e.style["background-color"]=e.color.cssColor,e.addEventListener("click",g,!1),t.green+=51,t.blue+=51}}(),function(){let e=b.create("div",null,a);b.create("text",{value:L.getText("ColorDialog - Red")},e),r=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.red,min:0,max:255},e),r.addEventListener("input",v,!1),b.create("text",{value:L.getText("ColorDialog - Green")},e),i=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.green,min:0,max:255},e),i.addEventListener("input",v,!1),b.create("text",{value:L.getText("ColorDialog - Blue")},e),l=b.create("input",{type:"number",className:"TravelNotes-ColorDialog-NumberInput",value:o.blue,min:0,max:255},e),l.addEventListener("input",v,!1)}(),s=b.create("div",{id:"TravelNotes-ColorDialog-ColorSampleDiv"},a),s.style["background-color"]=o.cssColor,s.color=o,t}(e.color),t.title=L.getText("RoutePropertiesDialog - Route properties"),t.okButtonListener=l,o=b.create("div",{id:"TravelNotes-RoutePropertiesDialog-MainDataDiv"}),t.content.insertBefore(o,t.content.firstChild),function(){let t=b.create("div",null,o);b.create("div",{textContent:L.getText("RoutePropertiesDialog - Name")},t);let n=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv",id:"TravelNotes-RoutePropertiesDialog-NameInputDiv"},t);a=b.create("input",{type:"text",id:"TravelNotes-RoutePropertiesDialog-NameInput",value:e.computedName},n)}(),function(){let t=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv"},o);b.create("text",{value:L.getText("RoutePropertiesDialog - Width")},b.create("span",null,t)),n=b.create("input",{type:"number",id:"TravelNotes-RoutePropertiesDialog-WidthInput",value:e.width,min:1,max:40},t)}(),function(){let t=b.create("div",{className:"TravelNotes-RoutePropertiesDialog-DataDiv"},o);b.create("text",{value:L.getText("RoutePropertiesDialog - Linetype")},b.create("span",null,t)),i=b.create("select",null,t);let a=f.route.dashChoices;for(let e=0;e=t)return null;let o=0,a=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/6371e3/Me,a=e[0]*Me,n=Math.acos((Math.cos(t/6371e3)-Math.sin(a)**2)/Math.cos(a)**2)/Me;return window.L.latLngBounds(window.L.latLng([e[0]-o,e[1]-n]),window.L.latLng([e[0]+o,e[1]+n]))}project(e,t){let o=ie.map.project(window.L.latLng(e),t);return[o.x,o.y]}screenCoordToLatLng(e,t){let o=ie.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]]}}),Oe=Math.PI/180;function Ue(e){return(e+540)%360-180}const ke=Object.freeze(new class{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]*Oe,a=t[0]*Oe,n=(Ue(t[1])-Ue(e[1]))*Oe;return 6371e3*Math.acos(Math.sin(o)*Math.sin(a)+Math.cos(o)*Math.cos(a)*Math.cos(n))}});function Be(){let e=[];function t(t){e.push(t.latLng),e.push(t.iconLatLng)}function o(o){o.itinerary.itineraryPoints.forEach(t=>e.push(t.latLng)),o.notes.forEach(e=>t(e))}return Object.seal(new class{zoomToLatLng(e){we.dispatch("zoomto",{latLng:e})}zoomToManeuver(e){let t=ie.travel.editedRoute.itinerary.maneuvers.getAt(e).itineraryPointObjId,o=ie.travel.editedRoute.itinerary.itineraryPoints.getAt(t).latLng;we.dispatch("zoomto",{latLng:o})}zoomToNote(o){e=[],t(Pe.getNoteAndRoute(o).note),we.dispatch("zoomto",{geometry:[e]})}zoomToRoute(t){e=[],o(Pe.getRoute(t)),we.dispatch("zoomto",{geometry:[e]})}zoomToTravel(){e=[],ie.travel.routes.forEach(e=>o(e)),-1!==ie.travel.editedRouteObjId&&o(ie.travel.editedRoute),ie.travel.notes.forEach(e=>t(e)),we.dispatch("zoomto",{geometry:[e]})}zoomToPoi(e){we.dispatch("zoomto",e)}})} /** @------------------------------------------------------------------------------------------------------------------------------ @@ -92,7 +92,7 @@ class{getTextPromise(e,t){return new Promise((function(o,a){let n=new XMLHttpReq @private @------------------------------------------------------------------------------------------------------------------------------ - */function He(){let e=null,t=null,o=null,a=0,n=0,r=0,i=0,l=0,s=0,d=null;function c(e){try{e.dataTransfer.setData("Text","1")}catch(e){console.log(e)}a=e.screenX,n=e.screenY}function u(t){r+=t.screenX-a,i+=t.screenY-n,r=Math.min(Math.max(r,20),l-e.clientWidth-20),i=Math.max(i,20);let o=s-Math.max(i,0)-20;e.style.top=String(i)+"px",e.style.left=String(r)+"px",e.style["max-height"]=String(o)+"px"}function g(){d&&d(),document.querySelector("body").removeChild(e)}return new class{createWindow(){l=ie.map.getContainer().clientWidth,s=ie.map.getContainer().clientHeight,e=b.create("div",{className:"TravelNotes-FloatWindow-Container"},document.querySelector("body")),function(){let t=b.create("div",{className:"TravelNotes-FloatWindow-TopBar",draggable:!0},e);t.addEventListener("dragstart",c,!1),t.addEventListener("dragend",u,!1),b.create("div",{textContent:"❌",className:"TravelNotes-FloatWindow-CancelButton",title:L.getText("FloatWindow - Close")},t).addEventListener("click",g,!1)}(),t=b.create("div",{className:"TravelNotes-FloatWindow-HeaderDiv"},e),o=b.create("div",{className:"TravelNotes-FloatWindow-ContentDiv"},e)}close(){g()}set onClose(e){d=e}get header(){return t}get content(){return o}}}let ze=null,Ve=n.defaultValue,Fe=n.defaultValue,We=null,Ke=null,Je=-1,Ze=-1,Xe=-1,Ge=[],qe=null,Ye=null;function Qe(e){-1!==Xe&&We.childNodes[Xe+1].firstChild.classList.remove("TravelNotes-ContextMenu-ItemSelected"),e?(We.childNodes[Je+1].firstChild.classList.add("TravelNotes-ContextMenu-ItemSelected"),Xe=Je):(We.childNodes[Ze+1].firstChild.classList.add("TravelNotes-ContextMenu-ItemSelected"),Xe=Ze,Je=Ze)}function _e(e){We&&("Escape"===e.key||"Esc"===e.key?(e.stopPropagation(),qe.click()):"ArrowDown"===e.key||"ArrowRight"===e.key||"Tab"===e.key?(e.stopPropagation(),Je=-1===Je||Ge.length-1===Je?0:++Je,Qe(!0)):"ArrowUp"===e.key||"ArrowLeft"===e.key?(e.stopPropagation(),Je=-1===Je||0===Je?Ge.length-1:--Je,Qe(!0)):"Home"===e.key?(e.stopPropagation(),Je=0,Qe(!0)):"End"===e.key?(e.stopPropagation(),Je=Ge.length-1,Qe(!0)):"Enter"===e.key&&Je>=0&&Ge[Je].action&&(e.stopPropagation(),Qe(!0),We.childNodes[Xe+1].firstChild.click()))}function $e(e){e.stopPropagation();let t=Ge[e.target.menuItem];qe.click(),t.param?t.action.call(t.context,t.param):t.action.call(t.context)}function et(e){Ze=e.target.objId,Qe(!1)}function tt(){Ke&&(clearTimeout(Ke),Ke=null),document.removeEventListener("keydown",_e,!0),Ye.removeChild(We),ze=null,Ve=n.defaultValue,Fe=n.defaultValue,We=null,Je=-1,Ze=-1,Xe=-1,Ge=[],qe=null,Ye=null}function ot(e,t,o){function a(){if(ze=e,ze.fromUI||ze.latlng.lat!==Ve||ze.latlng.lng!==Fe){if(Ve=ze.latlng.lat,Fe=ze.latlng.lng,We)return Ke&&(clearTimeout(Ke),Ke=null),void tt();We=null,Je=-1,Ze=-1,Xe=-1,qe=null,Ye=o||document.querySelector("body"),Ge=t,We=b.create("div",{id:"TravelNotes-ContextMenu-Container",className:"TravelNotes-ContextMenu-Container"},Ye),0{Ke&&(clearTimeout(Ke),Ke=null)},!1),We.addEventListener("mouseleave",()=>{Ke=setTimeout(tt,f.contextMenu.timeout)},!1)),qe=b.create("div",{textContent:"❌",className:"TravelNotes-ContextMenu-CloseButton",title:L.getText("ContextMenu - Close")},We),qe.addEventListener("click",tt,!1),function(){let e=0;Ge.forEach(t=>{let o=b.create("div",{className:"TravelNotes-ContextMenu-ItemContainer"},We),a=b.create("div",{textContent:t.name,id:"TravelNotes-ContextMenu-Item"+e,objId:e,className:t.action?"TravelNotes-ContextMenu-Item":"TravelNotes-ContextMenu-Item TravelNotes-ContextMenu-ItemDisabled"},o);a.addEventListener("mouseenter",et,!1),t.action&&a.addEventListener("click",$e,!1),a.menuItem=e,++e})}(),function(){let e=document.querySelector("body"),t=b.create("div",{className:"TravelNotes-ContextMenu-Panel"},e),a=t.clientWidth,n=t.clientHeight;e.removeChild(t);let r=Math.min(ze.originalEvent.clientY,n-We.clientHeight-20),i=Math.min(ze.originalEvent.clientX,a-We.clientWidth-20);o?(We.style.top=String(r)+"px",We.style.right=String(20)+"px"):(We.style.top=String(r)+"px",We.style.left=String(i)+"px")}(),document.addEventListener("keydown",_e,!0)}}return new class{show(){a()}}}let at=!1;function nt(){let t=Object.seal({latLng:[n.defaultValue,n.defaultValue],distance:e.defaultValue}),o=null,a=null,r={},i=new Map,s=new Map,c=[],u=null,g="",v=null,h=0,p=[0,0],m=0,b=null,w=f.note.svgZoom,N=f.note.svgAngleDistance,T=" ",x="",I="",A="";function E(e){let t=!1;return a.wayPoints.forEach(o=>{Math.abs(e.lat-o.lat)<1e-5&&Math.abs(e.lng-o.lng)<1e-5&&(t=!0)}),!t&&(o.lat!==e.lat||o.lng!==e.lng)}function j(j,P){at?P("A request is already running"):(at=!0,r={},v=null,g="",T=" ",x="",I="",function(){let n=Number.MAX_VALUE,r=e.defaultValue;a.itinerary.itineraryPoints.forEach(e=>{let a=ke.pointsDistance(t.latLng,e.latLng);n>a&&(n=a,o=e,t.distance=r),r+=e.distance}),t.latLng=o.latLng}(),y.getJsonPromise(function(){let e=t.latLng[0].toFixed(n.fixed)+","+t.latLng[1].toFixed(n.fixed);return f.overpassApi.url+"?data=[out:json][timeout:"+f.note.svgTimeOut+"];way[highway](around:"+(1.5*l.svgViewboxDim).toFixed(0)+","+e+")->.a;(.a >;.a;)->.a;.a out;is_in("+e+')->.e;area.e[admin_level="2"][name="United Kingdom"]->.f;area.e[admin_level="8"]->.g;area.e[admin_level="10"]->.h;if(f.count(deriveds)==0){.g->.i;}else{if(h.count(deriveds)==0){.g->.i;}else{.h->.i;}}.i out;(node(area.i)[place="village"];node(area.i)[place="hamlet"];node(area.i)[place="city"];node(area.i)[place="town"];)->.k;( node(around:'+f.note.svgHamletDistance+","+e+')[place="hamlet"];node(around:'+f.note.svgVillageDistance+","+e+')[place="village"];node(around:'+f.note.svgCityDistance+","+e+')[place="city"];node(around:'+f.note.svgTownDistance+","+e+')[place="town"];)->.l;node.k.l->.m;.m out;'}()).then((function(n){r=n,i.clear(),s.clear(),r.elements.forEach(e=>{switch(e.type){case"area":e.tags&&e.tags.boundary&&e.tags.name&&(g=e.tags.name);break;case"way":e.nodesIds=e.nodes,delete e.nodes,i.set(e.id,e);break;case"node":s.set(e.id,e),e.tags&&e.tags.place&&["town","city","village","hamlet"].includes(e.tags.place)&&c.push(e)}}),v=document.createElementNS(d,"svg"),v.setAttributeNS(null,"viewBox",String(l.svgViewboxDim/4)+" "+l.svgViewboxDim/4+" "+l.svgViewboxDim/2+" "+l.svgViewboxDim/2),v.setAttributeNS(null,"class","TravelNotes-SvgIcon"),function(){let e=Number.MAX_VALUE;c.forEach(t=>{let a=ke.pointsDistance(o.latLng,[t.lat,t.lon]);e>a&&(e=a,u=t.tags.name)})}(),p=Se.subtrackPoints([l.svgViewboxDim/2,l.svgViewboxDim/2],Se.project(t.latLng,w)),function(){let n=e.defaultValue,r=a.itinerary.itineraryPoints.first,i=a.itinerary.itineraryPoints.last,l=!1;a.itinerary.itineraryPoints.forEach(e=>{t.distance-n>N&&(r=e),n-t.distance>N&&!l&&(i=e,l=!0),n+=e.distance});let s=Se.addPoints(Se.project(t.latLng,w),p);if(o.objId!==a.itinerary.itineraryPoints.first.objId){let e=Se.addPoints(Se.project(r.latLng,w),p);m=180*Math.atan((s[1]-e[1])/(e[0]-s[0]))/Math.PI,0>m&&(m+=360),m-=270,0>e[0]-s[0]&&(m+=180)}if(o.objId!==a.itinerary.itineraryPoints.last.objId){let e=Se.addPoints(Se.project(i.latLng,w),p);for(b=180*Math.atan((s[1]-e[1])/(e[0]-s[0]))/Math.PI,0>e[0]-s[0]&&(b+=180),b-=m;0>b;)b+=360;for(;360{o&&(v=ke.pointsDistance([e.lat,e.lon],o.latLng),v{if(!e.nodesIds.includes(r))return;let t=function(e){return(e.tags.name?e.tags.name:"")+(e.tags.name&&e.tags.ref?" ":"")+(e.tags.ref?"["+e.tags.ref+"]":"")}(e),o=""!==t,a=e.nodesIds.includes(l),n=e.nodesIds.includes(d),i=2*e.nodesIds.filter(e=>e===r).length;if(e.nodesIds[0]===r&&i--,e.nodesIds[e.nodesIds.length-1]===r&&i--,a&&(f=o?t:"???",i--,e.tags.junction&&"roundabout"===e.tags.junction&&(w=!0)),0!==i&&(n&&(b=o?t:"???",i--,e.tags.junction&&"roundabout"===e.tags.junction&&(y=!0)),0!==i&&o))for(;0!==i;)I=""===I?t:I+" ⪥ "+t,i--}),I=-1===h?"🟢 "+b:1===h?f+" 🔴 ":f+(""===I?"":" ⪥ "+I)+" "+T+" "+b,y&&!w?x+=L.getText("SvgIconFromOsmFactory - entry roundabout"):!y&&w?x+=L.getText("SvgIconFromOsmFactory - exit roundabout"):y&&w&&(x+=L.getText("SvgIconFromOsmFactory - continue roundabout")),m&&(x+=L.getText("SvgIconFromOsmFactory - at the small roundabout on the ground"))}(),function(){let e=-1,t=-1,o=-1,n=[];if(a.itinerary.itineraryPoints.forEach(a=>{e++;let r=Se.addPoints(Se.project(a.latLng,w),p);n.push(r),r[0]>=0&&r[1]>=0&&r[0]<=l.svgViewboxDim&&r[1]<=l.svgViewboxDim&&(-1===t&&(t=e),o=e)}),-1!==t&&-1!==o){0o&&o++;let r="";for(e=t;e<=o;e++)r+=n[e][0].toFixed(0)+","+n[e][1].toFixed(0)+" ";let i=document.createElementNS(d,"polyline");i.setAttributeNS(null,"points",r),i.setAttributeNS(null,"class","TravelNotes-OSM-Itinerary"),i.setAttributeNS(null,"transform","rotate("+m+","+l.svgViewboxDim/2+","+l.svgViewboxDim/2+")"),v.appendChild(i)}}(),i.forEach(e=>{let t=-1,o=-1,a=-1,n=[];if(e.nodesIds.forEach(e=>{a++;let r=s.get(e),i=Se.addPoints(Se.project([r.lat,r.lon],w),p);n.push(i),i[0]>=0&&i[1]>=0&&i[0]<=l.svgViewboxDim&&i[1]<=l.svgViewboxDim&&(-1===t&&(t=a),o=a)}),-1!==t&&-1!==o){0o&&o++;let r="";for(a=t;a<=o;a++)r+=n[a][0].toFixed(0)+","+n[a][1].toFixed(0)+" ";let i=document.createElementNS(d,"polyline");i.setAttributeNS(null,"points",r),i.setAttributeNS(null,"class","TravelNotes-OSM-Highway TravelNotes-OSM-Highway-"+e.tags.highway),i.setAttributeNS(null,"transform","rotate("+m+","+l.svgViewboxDim/2+","+l.svgViewboxDim/2+")"),v.appendChild(i)}}),function(){if(""===A)return;let e=document.createElementNS(d,"text");e.textContent=A,e.setAttributeNS(null,"x",String(l.svgViewboxDim/2)),e.setAttributeNS(null,"y",String(.6*l.svgViewboxDim)),e.setAttributeNS(null,"class","TravelNotes-OSM-RcnRef"),v.appendChild(e)}(),at=!1,j(Object.freeze({svg:v,tooltip:x,city:g,place:u,streets:I,latLng:o.latLng}))})).catch(e=>{at=!1,P(e)}))}return Object.seal(new class{getPromiseIconAndAdress(e,o){return t.latLng=e,a=Pe.getRoute(o),new Promise(j)}})}const rt=Math.max(f.note.svgHamletDistance,f.note.svgVillageDistance,f.note.svgCityDistance,f.note.svgTownDistance);function it(){let e=null;return Object.seal(new class{parseResponse(t){let o="fulfilled"===t[1].status?function(t){const o=f.nominatim.language;let a=[],n={hamlet:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgHamletDistance},village:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgVillageDistance},city:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgCityDistance},town:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgTownDistance}};t.elements.forEach(t=>{if("area"===t.type){let e=t.tags.name;o&&"*"!==o&&t.tags["name:"+o]&&(e=t.tags["name:"+o]),a[Number.parseInt(t.tags.admin_level)]=e}if("node"===t.type&&t.tags&&t.tags.place&&n[t.tags.place]&&t.tags.name){let o=ke.pointsDistance(e,[t.lat,t.lon]),a=n[t.tags.place];a.maxDistance>o&&a.distance>o&&(a.distance=o,a.name=t.tags.name)}});let r=null,i=null;for(let e=2;e=e?r=a[e]:i=a[e]);let l=null,s=Number.MAX_VALUE;return Object.values(n).forEach(e=>{e.distance.e;area.e[admin_level][boundary="administrative"]->.f;node(around:'+rt+","+t[0]+","+t[1]+")[place]->.g;(.f;.g;)->.h;.h out;";return Promise.allSettled([y.getJsonPromise(o,n),y.getJsonPromise(r)])}})}let lt=[],st=[],dt=null,ct=null,ut=null,gt=null;function vt(){st.forEach(e=>ct.add(b.create("option",{text:p.sanitizeToJsString(e.name)}))),ct.selectedIndex=-1}function ht(){lt.forEach(e=>{let t=b.create("button",{type:"button",htmlBefore:e.htmlBefore||"",htmlAfter:e.htmlAfter||"",className:"TravelNotes-NoteDialog-EditorButton"},dt);p.sanitizeToHtmlElement(e.title||"?",t),t.addEventListener("click",gt.onButtonClickEventListener,!1)})}function pt(e){let t=new FileReader;t.onload=function(){try{let e=JSON.parse(t.result);lt=lt.concat(e.editionButtons),st=st.concat(e.preDefinedIconsList),st.sort((e,t)=>e.name.localeCompare(t.name)),document.querySelectorAll(".TravelNotes-NoteDialog-EditorButton").forEach(e=>{e.removeEventListener("click",gt.onButtonClickEventListener,!1),dt.removeChild(e)}),ht();for(let e=ct.length-1;e>=0;e--)ct.remove(e);vt(),gt.hideError()}catch(e){console.log(e?e.message:"An error occurs when opening the file"),gt.showError(L.getText("NoteDialogToolbar - An error was found in the json file",{error:e.message}))}},t.readAsText(e.target.files[0])}function mt(){ut.click()}function ft(e){gt.toggleContents(),e.target.textContent="▼"===e.target.textContent?"▶":"▼"}const bt=Object.seal(new class{set selectOptions(e){st=st.concat(e),st.sort((e,t)=>e.name.localeCompare(t.name))}set buttons(e){lt=lt.concat(e)}getIconData(e){return st[e]}getIconDataFromName(e){let t=st.find(t=>t.name===e);return t?t.icon:null}createToolbar(e){return gt=e,dt=b.create("div",{className:"TravelNotes-NoteDialog-ToolbarDiv",id:"TravelNotes-NoteDialog-ToolbarDiv"}),ct=b.create("select",{className:"TravelNotes-NoteDialog-Select",id:"TravelNotes-NoteDialog-IconSelect"},dt),ct.addEventListener("change",gt.onSelectEventListener,!1),vt(),ut=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},dt),ut.addEventListener("change",pt,!1),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - show hidden contents"),textContent:"▼"},dt).addEventListener("click",ft,!1),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - Open a configuration file"),textContent:"📂"},dt).addEventListener("click",mt,!1),ht(),dt}});function yt(){let e=null,t=1,o=1,a=Number.MAX_VALUE,n=0,r=0,l=null,s=0,c=f.route.elev.smoothCoefficient,u=f.route.elev.smoothPoints;function g(){let e=function(){let e=0,t=0,o=[],a=l.itinerary.itineraryPoints.iterator,n=0,r=a.done;for(o.push({distance:e,elev:a.value.elev}),n+=a.value.distance,r=a.done;!r;){for(e+=s;e>=n&&!r;)n+=a.value.distance,r=a.done;if(!r){let r=(a.value.elev-a.previous.elev)/a.previous.distance;t=a.value.elev-(n-e)*r,o.push({distance:e,elev:t})}}return o.push({distance:n,elev:l.itinerary.itineraryPoints.last.elev}),o}(),t=new Map,o=(e[u].elev-e[0].elev)/u,a=0;for(a=0;a=t;t++)o+=e[t].elev;t.set(e[a].distance,{distance:e[a].distance,elev:o/(2*u+1)})}return a--,o=s*(e[e.length-1].elev-e[e.length-1-u].elev)/(e[e.length-1].distance-e[e.length-1-u].distance),t.set(e[a].distance+s,{distance:e[a].distance+s,elev:e[a].elev+o}),t.set(e[a].distance+2*s,{distance:e[a].distance+2*s,elev:e[a].elev+2*o}),t}function v(s){return l=s,a=Number.MAX_VALUE,n=0,l.itinerary.itineraryPoints.forEach(e=>{n=Math.max(n,e.elev),a=Math.min(a,e.elev)}),r=n-a,t=i.height/r,o=i.width/l.distance,e=document.createElementNS(d,"svg"),e.setAttributeNS(null,"viewBox","0 0 "+(i.width+2*i.margin)+" "+(i.height+2*i.margin)),e.setAttributeNS(null,"class","TravelNotes-SvgProfile"),function(){let a="",r=0,s=0,c=0;l.itinerary.itineraryPoints.forEach(e=>{s=(i.margin+o*r).toFixed(0),c=(i.margin+t*(n-e.elev)).toFixed(0),a+=s+","+c+" ",r+=e.distance});let u=document.createElementNS(d,"polyline");u.setAttributeNS(null,"points",a),u.setAttributeNS(null,"class","TravelNotes-SvgProfile-profilePolyline"),e.appendChild(u)}(),function(){const t=i.margin.toFixed(0),o=(i.margin+i.height).toFixed(0),a=(i.margin+i.width).toFixed(0),n=i.margin.toFixed(0);let r=t+","+n+" "+t+","+o+" "+a+","+o+" "+a+","+n,l=document.createElementNS(d,"polyline");l.setAttributeNS(null,"points",r),l.setAttributeNS(null,"class","TravelNotes-SvgProfile-framePolyline"),e.appendChild(l)}(),function(){let o=Number.MAX_VALUE,l=0;i.vScales.forEach(e=>{let t=Math.abs(r/4-e);t{let t=Math.abs(l.distance/8-e);t"+L.getText("HTMLViewsFactory - Address")+" : "+o.address,b.create("div",{className:e+"NoteHtml-Address"},a)),0!==o.url.length&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Link")+"'+o.url.substr(0,40)+"...",b.create("div",{className:e+"NoteHtml-Url"},a)),0!==o.phone.length){let t=o.phone;if(o.phone.match(/^\+[0-9, ,*,#]*$/)){let e=o.phone.replaceAll(/\u0020/g,""),a=o.phone.replaceAll(/\u0020/g," ");t=L.getText("HTMLViewsFactory - Phone")+" : "+L.getText("HTMLViewsFactory - call")+''+a+""+L.getText("HTMLViewsFactory - Send a sms to")+''+a+""}else t=L.getText("HTMLViewsFactory - Phone")+" : "+o.phone;p.sanitizeToHtmlElement(t,b.create("div",{className:e+"NoteHtml-Phone"},a))}if(p.sanitizeToHtmlElement(A.formatLatLng(o.latLng),b.create("div",{className:e+"NoteHtml-LatLng"},a)),t.route){t.route.chain&&p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of travel")+" : "+A.formatDistance(o.chainedDistance+o.distance),b.create("div",{className:e+"NoteHtml-Distance"},a)),p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of route")+" : "+A.formatDistance(o.distance),b.create("div",{className:e+"NoteHtml-Distance"},a));let n=t.route.notes.next(o.objId);if(n){let t=n.distance-o.distance;9"+L.getText("HTMLViewsFactory - Next note after")+" : "+A.formatDistance(t),b.create("div",{className:e+"NoteHtml-NextDistance"},a))}}return a}function Nt(e,t){let o=b.create("div"),a=b.create("div",{className:e+"Travel-Notes-IconCell"},o);p.sanitizeToHtmlElement(t.note.iconContent,a),a.style.width=String(t.note.iconWidth)+"px",a.style.height=String(t.note.iconHeight)+"px","TravelNotes-Roadbook-"===e&&a.firstChild&&("svg"===a.firstChild.tagName?(a.firstChild.setAttributeNS(null,"viewBox","0 0 "+l.svgViewboxDim+" "+l.svgViewboxDim),a.style.width=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px",a.style.height=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px"):a.firstChild.classList.contains("TravelNotes-MapNoteCategory-0073")&&(a.style.width=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px",a.style.height=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px"));let n=wt(e,t);return n.className=e+"Travel-Notes-Cell",o.appendChild(n),o.noteObjId=t.note.objId,o}function Tt(e){let t=b.create("div",{className:e+"Travel-Notes"}),o=ie.travel.notes.iterator;for(;!o.done;){let a=Nt(e,{note:o.value,route:null});a.className=e+"Travel-Notes-Row",t.appendChild(a)}return t}function xt(e,t){let o=b.create("div",{className:e+"Route-Header",id:"route"+t.objId});return p.sanitizeToHtmlElement(t.computedName,b.create("div",{className:e+"Route-Header-Name"},o)),0!==t.distance&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Route distance",{distance:A.formatDistance(t.distance)}),b.create("div",{className:e+"Route-Header-Distance"},o)),ie.travel.readOnly||"bike"===t.itinerary.transitMode||p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Duration",{duration:A.formatTime(t.duration)}),b.create("div",{className:e+"Route-Header-Duration"},o)),t.itinerary.hasProfile&&(p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Ascent",{ascent:t.itinerary.ascent.toFixed(0)}),b.create("div",{className:e+"Route-Header-Ascent"},o)),p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Descent",{descent:t.itinerary.descent.toFixed(0)}),b.create("div",{className:e+"Route-Header-Descent"},o))),o}function It(t,o){let a=b.create("div");b.create("div",{className:t+"Route-ManeuversAndNotes-IconCell TravelNotes-ManeuverNote-"+o.maneuver.iconName},a);let n=b.create("div",{className:t+"Route-ManeuversAndNotes-Cell"},a);return p.sanitizeToHtmlElement(o.maneuver.instruction,b.create("div",null,n)),o.route.chain&&p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of travel")+" : "+A.formatDistance(o.route.chainedDistance+o.maneuverDistance),b.create("div",null,n)),p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of route")+" : "+A.formatDistance(o.maneuverDistance),b.create("div",null,n)),e.defaultValue"+L.getText("HTMLViewsFactory - Next maneuver after")+" : "+A.formatDistance(o.maneuver.distance),b.create("div",null,n)),a}function Lt(e,t){let o=[],a=t.notes.iterator;for(;!a.done;){let n=Nt(e,{note:a.value,route:t});n.className=e+"Route-Notes-Row",n.objId=N(),n.latLng=a.value.latLng,n.noteObjId=a.value.objId,n.distance=a.value.distance,o.push(n)}let n=t.itinerary.maneuvers.iterator,r=0;for(;!n.done;){let a=It(e,{route:t,maneuver:n.value,maneuverDistance:r});a.className=e+"Route-Maneuvers-Row",a.objId=N(),a.latLng=t.itinerary.itineraryPoints.getAt(n.value.itineraryPointObjId).latLng,a.maneuverObjId=n.value.objId,a.distance=r,o.push(a),r+=n.value.distance}o.sort((e,t)=>e.distance-t.distance);let i=b.create("div",{className:e+"Route-ManeuversAndNotes"});return o.forEach(e=>i.appendChild(e)),i}function At(e,t){let o="";""!==t.itinerary.provider&&""!==t.itinerary.transitMode&&(o=L.getText("HTMLViewsFactory - Itinerary computed by {provider} and optimized for {transitMode}",{provider:t.itinerary.provider,transitMode:L.getText("HTMLViewsFactory - TransitMode "+t.itinerary.transitMode)}));let a=b.create("div",{className:e+"RouteFooter"});return p.sanitizeToHtmlElement(o,a),a}function Et(e,t){let o=b.create("div",{className:e+"RouteProfile"});return p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Profile"),o),o.appendChild(yt().createSvg(t)),o}function jt(t){let o=b.create("div",{className:t+"Travel"});o.appendChild(function(t){let o=b.create("div",{className:t+"Travel-Header"});p.sanitizeToHtmlElement(ie.travel.name,b.create("div",{className:t+"Travel-Header-Name"},o));let a=e.defaultValue,n=0,r=0,i=ie.travel.routes.iterator;for(;!i.done;){let e=i.value.objId===ie.editedRouteObjId&&f.routeEditor.displayEditionInHTMLPage?ie.travel.editedRoute:i.value;p.sanitizeToHtmlElement(''+e.computedName+" : "+A.formatDistance(e.distance)+".",b.create("div",{className:t+"Travel-Header-RouteName"},o)),e.chain&&(a+=e.distance,n+=e.itinerary.ascent,r+=e.itinerary.descent)}return p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel distance",{distance:A.formatDistance(a)}),b.create("div",{className:t+"Travel-Header-TravelDistance"},o)),0!==n&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel ascent",{ascent:n.toFixed(0)}),b.create("div",{className:t+"Travel-Header-TravelAscent"},o)),0!==r&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel descent",{descent:r.toFixed(0)}),b.create("div",{className:t+"Travel-Header-TravelDescent"},o)),o}(t)),o.appendChild(Tt(t));let a=ie.travel.routes.iterator;for(;!a.done;){let e=f.routeEditor.displayEditionInHTMLPage&&a.value.objId===ie.editedRouteObjId?ie.travel.editedRoute:a.value;o.appendChild(xt(t,e)),e.itinerary.hasProfile&&o.appendChild(Et(t,e)),o.appendChild(Lt(t,e)),o.appendChild(At(t,e))}return o.appendChild(function(e){let t=L.getText("HTMLViewsFactory - Travel footer")+'Travel & Notes, © wwwouaiebe 2017 2021 © '+L.getText("HTMLViewsFactory - OpenStreetMap contributors")+"",o=b.create("div",{className:e+"TravelFooter"});return p.sanitizeToHtmlElement(t,o),o}(t)),o}const Pt=Object.freeze(new class{getTravelHTML(e){return jt(e)}getNoteTextAndIconHTML(e,t){return Nt(e,t)}getNoteTextHTML(e,t){return wt(e,t)}getEditedRouteManeuversAndNotesHTML(e){return Lt(e,ie.travel.editedRoute)}getTravelNotesHTML(e){return Tt(e)}getRouteHeaderHTML(e,t){return xt(e,t)}});function Dt(e,t,o){let a=null,r=it(),i=e.latLng,s="",d="",c=null,u=null,g=null,v=null,h=null,m=null,y=null,w=null,N=null,T=null,x=null,I=null,A=null,E=null,j=null,P=null,D=null,C=null,R=null,M=null,S=null,O=null;function U(){if(""!==E.value){if(""===M.value||""!==p.sanitizeToUrl(M.value).url)return e.iconWidth=Number.parseInt(j.value),e.iconHeight=Number.parseInt(P.value),e.iconContent=E.value,e.popupContent=D.value,e.tooltipContent=C.value,e.address=R.value,e.url=M.value,e.phone=S.value,e.latLng=i,e.validateData(),e;I.showError(L.getText("Notedialog - invalidUrl"))}else I.showError(L.getText("Notedialog - The icon content cannot be empty"))}function k(){""===E.value?c.iconContent="?????":c.iconContent=E.value,c.popupContent=D.value,c.tooltipContent=C.value,c.address=R.value,c.url=M.value,c.phone=S.value,c.iconWidth=j.value,c.iconHeight=P.value,O.textContent="",O.appendChild(Pt.getNoteTextAndIconHTML("TravelNotes-NoteDialog-",{note:c,route:null}))}function B(t){let a=r.parseResponse(t);s=a.street,""!==a.city&&(s+=' '+a.city+""),d=a.city,f.note.reverseGeocoding&&""===e.address&&o&&(R.value=s),k()}function H(e){I.showError(L.getText("Notedialog - an error occurs when searching the adress")),console.log(e||"an error occurs when searching the adress."),k()}function z(e){E.value=e.svg.outerHTML,C.value=e.tooltip;let t=e.streets,o=""===e.city?d:e.city;""!==o&&(t+=' '+o+""),e.place&&e.place!==o&&(t+=" ("+e.place+")"),R.value=t,i=e.latLng,I.hideWait(),k()}function V(e){I.hideWait(),I.showError(L.getText("Notedialog - an error occurs when creating the SVG icon")),console.log(e||"an error occurs when creating the SVG icon."),k()}function F(o){let a=bt.getIconData(o.target.selectedIndex);"SvgIcon"===a.icon?-1===t?I.showError(L.getText("Notedialog - not possible to create a SVG icon for a travel note")):(I.showWait(),nt().getPromiseIconAndAdress(e.latLng,t).then(z).catch(V)):(I.hideError(),j.value=a.width,P.value=a.height,E.value=a.icon,C.value=a.tooltip,k())}function W(e){if(!a)return;let t=e.target;for(;!t.htmlBefore;)t=t.parentNode;let o=a.selectionStart,n=a.selectionEnd;a.value=a.value.slice(0,o)+t.htmlBefore+(0===t.htmlAfter.length?"":a.value.slice(o,n))+t.htmlAfter+a.value.slice(n),o===n||0===t.htmlAfter.length?(o+=t.htmlBefore.length,n=o):n+=t.htmlBefore.length+t.htmlAfter.length,a.setSelectionRange(o,n),a.focus(),k()}function K(){R.value=s,k()}function J(e){a=e.target}function Z(e){if(""===e.target.value)return;let t=p.sanitizeToUrl(e.target.value);""===t.errorsString?I.hideError():I.showError(t.errorsString)}function G(){f.noteDialog.toggleIconDimension&&u.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleIconTextArea&&g.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.togglePopupContent&&v.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleTooltip&&h.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleAddress&&(m.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),y.classList.toggle("TravelNotes-NoteDialog-HiddenItem")),f.noteDialog.toggleLink&&(w.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),N.classList.toggle("TravelNotes-NoteDialog-HiddenItem")),f.noteDialog.togglePhone&&(T.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),x.classList.toggle("TravelNotes-NoteDialog-HiddenItem"))}return c=X(),c.jsonObject=e.jsonObject,""===c.iconContent&&(c.iconContent="?????"),I=le(),I.title=L.getText("NoteDialog - Note"),I.okButtonListener=U,A=b.create("div",{id:"TravelNotes-NoteDialog-MainDataDiv"},I.content),A.appendChild(bt.createToolbar({onButtonClickEventListener:W,onSelectEventListener:F,hideError:I.hideError,showError:I.showError,toggleContents:G})),u=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("text",{value:L.getText("NoteDialog - Icon width")},u),j=b.create("input",{type:"number",className:"TravelNotes-NoteDialog-NumberInput",value:0===e.iconWidth?l.width:e.iconWidth},u),j.addEventListener("input",k,!1),b.create("text",{value:L.getText("NoteDialog - Icon height")},u),P=b.create("input",{type:"number",className:"TravelNotes-NoteDialog-NumberInput",value:0===e.iconHeight?l.height:e.iconHeight},u),P.addEventListener("input",k,!1),g=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Icon content")},A),E=b.create("textarea",{className:"TravelNotes-NoteDialog-TextArea",value:e.iconContent,placeholder:"?????",rows:f.noteDialog.iconAreaHeight},g),E.addEventListener("focus",J,!1),E.addEventListener("input",k,!1),h=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Tooltip content")},A),C=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.tooltipContent},h),C.addEventListener("focus",J,!1),C.addEventListener("input",k,!1),v=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Text")},A),D=b.create("textarea",{className:"TravelNotes-NoteDialog-TextArea",value:e.popupContent,rows:f.noteDialog.popupAreaHeigth},v),D.addEventListener("focus",J,!1),D.addEventListener("input",k,!1),m=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - Reset address"),textContent:"🔄"},m).addEventListener("click",K,!1),b.create("text",{value:L.getText("NoteDialog - Address")},m),y=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),R=b.create("input",{type:"text",value:e.address,className:"TravelNotes-NoteDialog-InputText"},y),R.addEventListener("focus",J,!1),R.addEventListener("input",k,!1),w=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),f.note.theDevil.addButton&&b.create("text",{value:"👿"},b.create("a",{href:"https://www.google.com/maps/@"+e.lat.toFixed(n.fixed)+","+e.lng.toFixed(n.fixed)+","+f.note.theDevil.noteZoom+"z",target:"_blank",title:"Reminder! The devil will know everything about you"},b.create("div",{className:"TravelNotes-BaseDialog-Button",title:"Reminder! The devil will know everything about you"},w))),b.create("text",{value:L.getText("NoteDialog - Link")},w),N=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),M=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.url},N),M.addEventListener("focus",()=>{a=null},!1),M.addEventListener("blur",Z,!1),M.addEventListener("input",k,!1),T=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("text",{value:" "+L.getText("NoteDialog - Phone")},T),x=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),S=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.phone},x),S.addEventListener("focus",J,!1),S.addEventListener("input",k,!1),O=b.create("div",{className:"TravelNotes-NoteDialog-PreviewDiv"},I.footer),O.appendChild(Pt.getNoteTextAndIconHTML("TravelNotes-NoteDialog-",{note:c,route:null})),r.getPromiseAddress(e.latLng).then(B).catch(H),G(),I}function Ct(){let e=null,t=null;return Object.freeze(new class{createUI(){if(document.getElementById("TravelNotes-WaitUI"))return;e=b.create("div",{className:"TravelNotes-Background"},document.querySelector("body"));let o=b.create("div",{id:"TravelNotes-WaitUI"},e);t=b.create("div",{id:"TravelNotes-WaitUI-MessageDiv"},o),b.create("div",{className:"TravelNotes-WaitAnimationBullet"},b.create("div",{className:"TravelNotes-WaitAnimation"},o))}showInfo(e){t.textContent=e}close(){document.querySelector("body").removeChild(e),e=null}})}let Rt=null,Mt=0,St=0,Ot=f.note.osmSearchNoteDialog;function Ut(e,t){let o=X();o.iconContent=e.svg.outerHTML,o.popupContent="",o.iconWidth=l.width,o.iconHeight=l.height,o.tooltipContent=e.tooltip,o.address=e.streets,""!==e.city&&(o.address+=' '+e.city+""),e.place&&e.place!==e.city&&(o.address+=" ("+e.place+")"),o.latLng=e.latLng,o.iconLatLng=e.latLng,o.distance=Se.getClosestLatLngDistance(t,o.latLng).distance,o.chainedDistance=t.chainedDistance,t.notes.add(o),we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:o.objId}),we.dispatch("roadbookupdate")}function kt(e,t,o){if(o)if(-1===t)ie.travel.notes.add(e),we.dispatch("showtravelnotes");else{let o=Pe.getRoute(t);o.notes.add(e),e.chainedDistance=o.chainedDistance,o.notes.sort((e,t)=>e.distance-t.distance),we.dispatch("showitinerary")}else-1===t?we.dispatch("updatetravelnotes"):we.dispatch("updateitinerary");we.dispatch("noteupdated",{removedNoteObjId:e.objId,addedNoteObjId:e.objId}),we.dispatch("roadbookupdate")}function Bt(e,t,o){Dt(e,t,o).show().then(()=>{kt(e,t,o)}).catch(e=>console.log(e||"An error occurs in the note dialog"))}function Ht(e){let t=X();return t.latLng=e,t.iconLatLng=e,t}const zt=Object.seal(new class{get osmSearchNoteDialog(){return Ot}changeOsmSearchNoteDialog(){Ot=!Ot}addAllManeuverNotes(e){let t=Pe.getRoute(e),o=t.itinerary.maneuvers.iterator;for(St=0;!o.done;)"kDepartDefault"===o.value.iconName&&!o.first||"kArriveDefault"===o.value.iconName&&!o.last||St++;f.note.maxManeuversNotest.cancelButton.click(),!0)}e.textContent&&b.create("div",{id:"TravelNotes-TwoButtonsDialog-MessageDiv",textContent:e.textContent},t.content)}(),t}({title:L.getText("NoteEditor - Add a note for each maneuver"),textContent:L.getText("NoteEditor - Add a note for each maneuver. Are you sure?",{noteLength:St}),secondButtonContent:"❌"}).show().then(()=>{o=t.itinerary.maneuvers.iterator,o.done||(Rt=Ct(),Rt.createUI(),Mt=1,function e(t,o){function a(){t.done?(o.notes.sort((e,t)=>e.distance-t.distance),we.dispatch("updateitinerary"),we.dispatch("roadbookupdate"),Rt.close(),Rt=null):e(t,o)}if(Rt.showInfo(L.getText("NoteEditor - Creating note",{noteNumber:Mt,notesLength:St})),"kDepartDefault"===t.value.iconName&&!t.first||"kArriveDefault"===t.value.iconName&&!t.last)a();else{Mt++;let e=o.itinerary.itineraryPoints.getAt(t.value.itineraryPointObjId).latLng;nt().getPromiseIconAndAdress(e,o.objId).then(e=>{Ut(e,o),a()}).catch(e=>{console.log(e||"an error occurs when creating the SVG icon."),a()})}}(o,t))}).catch(e=>console.log(e||"An error occurs in the note dialog"))}newRouteNote(e){let t=Pe.getRoute(e.routeObjId),o=Se.getClosestLatLngDistance(t,[e.lat,e.lng]),a=Ht(o.latLng);a.distance=o.distance,Bt(a,t.objId,!0)}newSearchNote(e){let t=[e.osmElement.lat,e.osmElement.lon],o=[e.osmElement.lat,e.osmElement.lon],a=-1,n=Number.MAX_VALUE;function r(e){if(e.objId!==ie.editedRouteObjId){let r=Se.getClosestLatLngDistance(e,t);if(r){let i=ke.pointsDistance(t,r.latLng);i"+e.osmElement.tags.rcn_ref+"":i.iconContent=bt.getIconDataFromName(e.osmElement.description)||"",i.address=(e.osmElement.tags["addr:housenumber"]?e.osmElement.tags["addr:housenumber"]+" ":"")+(e.osmElement.tags["addr:street"]?e.osmElement.tags["addr:street"]+" ":"")+(e.osmElement.tags["addr:postcode"]?e.osmElement.tags["addr:postcode"]+" ":"")+(e.osmElement.tags["addr:city"]?e.osmElement.tags["addr:city"]+" ":""),i.url=e.osmElement.tags.website||"",i.phone=e.osmElement.tags.phone||"",i.tooltipContent=e.osmElement.description||"",i.popupContent=e.osmElement.tags.name||"",e.isTravelNote||-1!==a?Ot||""===i.iconContent?Bt(i,a,!0):kt(i,a,!0):be.showError(L.getText("NoteEditor - No route was found"))}newManeuverNote(e){Rt=Ct(),Rt.createUI();let t=ie.travel.editedRoute,o=t.itinerary.maneuvers.getAt(e),a=t.itinerary.itineraryPoints.getAt(o.itineraryPointObjId).latLng;nt().getPromiseIconAndAdress(a,t.objId).then(o=>{Ut(o,t),t.notes.sort((e,t)=>e.distance-t.distance),t.itinerary.maneuvers.remove(e),we.dispatch("showitinerary"),we.dispatch("roadbookupdate"),Rt.close(),Rt=null}).catch(e=>{console.log(e||"an error occurs when creating the SVG icon."),Rt.close(),Rt=null})}newTravelNote(e){Bt(Ht(e),-1,!0)}editNote(e){let t=Pe.getNoteAndRoute(e),o=null===t.route?-1:t.route.objId;Bt(t.note,o,!1)}removeNote(e){let t=Pe.getNoteAndRoute(e);t.route?(t.route.notes.remove(e),we.dispatch("updateitinerary")):(ie.travel.notes.remove(e),we.dispatch("updatetravelnotes")),we.dispatch("noteupdated",{removedNoteObjId:e,addedNoteObjId:-1}),we.dispatch("roadbookupdate")}hideNotes(){let e=ie.travel.notes.iterator;for(;!e.done;)we.dispatch("removeobject",{objId:e.value.objId});let t=ie.travel.routes.iterator;for(;!t.done;)for(e=t.value.notes.iterator;!e.done;)we.dispatch("removeobject",{objId:e.value.objId});if(-1!==ie.editedRouteObjId)for(e=ie.travel.editedRoute.notes.iterator;!e.done;)we.dispatch("removeobject",{objId:e.value.objId})}showNotes(){this.hideNotes();let e=ie.travel.notes.iterator;for(;!e.done;)we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:e.value.objId});let t=ie.travel.routes.iterator;for(;!t.done;)t.value.hidden||we.dispatch("routeupdated",{removedRouteObjId:t.value.objId,addedRouteObjId:t.value.objId})}attachNoteToRoute(e){let t=Pe.getNoteAndRoute(e),o=Number.MAX_VALUE,a=null,n=null,r=null;ie.travel.routes.forEach(e=>{let i=Se.getClosestLatLngDistance(e,t.note.latLng);if(i){let l=ke.pointsDistance(t.note.latLng,i.latLng);le.distance-t.distance),we.dispatch("noteupdated",{removedNoteObjId:e,addedNoteObjId:e}),we.dispatch("updateitinerary"),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate"))}detachNoteFromRoute(t){let o=Pe.getNoteAndRoute(t);o.route.notes.remove(t),o.note.distance=e.invalid,o.note.chainedDistance=e.defaultValue,ie.travel.notes.add(o.note),we.dispatch("updateitinerary"),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate")}travelNoteDropped(e,t,o){ie.travel.notes.moveTo(e,t,o),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate")}}); + */function He(){let e=null,t=null,o=null,a=0,n=0,r=0,i=0,l=0,s=0,d=null;function c(e){try{e.dataTransfer.setData("Text","1")}catch(e){console.log(e)}a=e.screenX,n=e.screenY}function u(t){r+=t.screenX-a,i+=t.screenY-n,r=Math.min(Math.max(r,20),l-e.clientWidth-20),i=Math.max(i,20);let o=s-Math.max(i,0)-20;e.style.top=String(i)+"px",e.style.left=String(r)+"px",e.style["max-height"]=String(o)+"px"}function g(){d&&d(),document.querySelector("body").removeChild(e)}return new class{createWindow(){l=ie.map.getContainer().clientWidth,s=ie.map.getContainer().clientHeight,e=b.create("div",{className:"TravelNotes-FloatWindow-Container"},document.querySelector("body")),function(){let t=b.create("div",{className:"TravelNotes-FloatWindow-TopBar",draggable:!0},e);t.addEventListener("dragstart",c,!1),t.addEventListener("dragend",u,!1),b.create("div",{textContent:"❌",className:"TravelNotes-FloatWindow-CancelButton",title:L.getText("FloatWindow - Close")},t).addEventListener("click",g,!1)}(),t=b.create("div",{className:"TravelNotes-FloatWindow-HeaderDiv"},e),o=b.create("div",{className:"TravelNotes-FloatWindow-ContentDiv"},e)}close(){g()}set onClose(e){d=e}get header(){return t}get content(){return o}}}let ze=null,Ve=n.defaultValue,Fe=n.defaultValue,We=null,Ke=null,Je=-1,Ze=-1,Xe=-1,Ge=[],qe=null,Ye=null;function Qe(e){-1!==Xe&&We.childNodes[Xe+1].firstChild.classList.remove("TravelNotes-ContextMenu-ItemSelected"),e?(We.childNodes[Je+1].firstChild.classList.add("TravelNotes-ContextMenu-ItemSelected"),Xe=Je):(We.childNodes[Ze+1].firstChild.classList.add("TravelNotes-ContextMenu-ItemSelected"),Xe=Ze,Je=Ze)}function _e(e){We&&("Escape"===e.key||"Esc"===e.key?(e.stopPropagation(),qe.click()):"ArrowDown"===e.key||"ArrowRight"===e.key||"Tab"===e.key?(e.stopPropagation(),Je=-1===Je||Ge.length-1===Je?0:++Je,Qe(!0)):"ArrowUp"===e.key||"ArrowLeft"===e.key?(e.stopPropagation(),Je=-1===Je||0===Je?Ge.length-1:--Je,Qe(!0)):"Home"===e.key?(e.stopPropagation(),Je=0,Qe(!0)):"End"===e.key?(e.stopPropagation(),Je=Ge.length-1,Qe(!0)):"Enter"===e.key&&Je>=0&&Ge[Je].action&&(e.stopPropagation(),Qe(!0),We.childNodes[Xe+1].firstChild.click()))}function $e(e){e.stopPropagation();let t=Ge[e.target.menuItem];qe.click(),t.param?t.action.call(t.context,t.param):t.action.call(t.context)}function et(e){Ze=e.target.objId,Qe(!1)}function tt(){Ke&&(clearTimeout(Ke),Ke=null),document.removeEventListener("keydown",_e,!0),Ye.removeChild(We),ze=null,Ve=n.defaultValue,Fe=n.defaultValue,We=null,Je=-1,Ze=-1,Xe=-1,Ge=[],qe=null,Ye=null}function ot(e,t,o){function a(){if(ze=e,ze.fromUI||ze.latlng.lat!==Ve||ze.latlng.lng!==Fe){if(Ve=ze.latlng.lat,Fe=ze.latlng.lng,We)return Ke&&(clearTimeout(Ke),Ke=null),void tt();We=null,Je=-1,Ze=-1,Xe=-1,qe=null,Ye=o||document.querySelector("body"),Ge=t,We=b.create("div",{id:"TravelNotes-ContextMenu-Container",className:"TravelNotes-ContextMenu-Container"},Ye),0{Ke&&(clearTimeout(Ke),Ke=null)},!1),We.addEventListener("mouseleave",()=>{Ke=setTimeout(tt,f.contextMenu.timeout)},!1)),qe=b.create("div",{textContent:"❌",className:"TravelNotes-ContextMenu-CloseButton",title:L.getText("ContextMenu - Close")},We),qe.addEventListener("click",tt,!1),function(){let e=0;Ge.forEach(t=>{let o=b.create("div",{className:"TravelNotes-ContextMenu-ItemContainer"},We),a=b.create("div",{textContent:t.name,id:"TravelNotes-ContextMenu-Item"+e,objId:e,className:t.action?"TravelNotes-ContextMenu-Item":"TravelNotes-ContextMenu-Item TravelNotes-ContextMenu-ItemDisabled"},o);a.addEventListener("mouseenter",et,!1),t.action&&a.addEventListener("click",$e,!1),a.menuItem=e,++e})}(),function(){let e=document.querySelector("body"),t=b.create("div",{className:"TravelNotes-ContextMenu-Panel"},e),a=t.clientWidth,n=t.clientHeight;e.removeChild(t);let r=Math.min(ze.originalEvent.clientY,n-We.clientHeight-20),i=Math.min(ze.originalEvent.clientX,a-We.clientWidth-20);o?(We.style.top=String(r)+"px",We.style.right=String(20)+"px"):(We.style.top=String(r)+"px",We.style.left=String(i)+"px")}(),document.addEventListener("keydown",_e,!0)}}return new class{show(){a()}}}let at=!1;function nt(){let t=Object.seal({latLng:[n.defaultValue,n.defaultValue],distance:e.defaultValue}),o=null,a=null,r={},i=new Map,s=new Map,c=[],u=null,g="",v=null,h=0,p=[0,0],m=0,b=null,w=f.note.svgZoom,N=f.note.svgAngleDistance,T=" ",x="",I="",A="";function E(e){let t=!1;return a.wayPoints.forEach(o=>{Math.abs(e.lat-o.lat)<1e-5&&Math.abs(e.lng-o.lng)<1e-5&&(t=!0)}),!t&&(o.lat!==e.lat||o.lng!==e.lng)}function j(j,P){at?P("A request is already running"):(at=!0,r={},v=null,g="",T=" ",x="",I="",function(){let n=Number.MAX_VALUE,r=e.defaultValue;a.itinerary.itineraryPoints.forEach(e=>{let a=ke.pointsDistance(t.latLng,e.latLng);n>a&&(n=a,o=e,t.distance=r),r+=e.distance}),t.latLng=o.latLng}(),y.getJsonPromise(function(){let e=t.latLng[0].toFixed(n.fixed)+","+t.latLng[1].toFixed(n.fixed);return f.overpassApi.url+"?data=[out:json][timeout:"+f.note.svgTimeOut+"];way[highway](around:"+(1.5*l.svgViewboxDim).toFixed(0)+","+e+")->.a;(.a >;.a;)->.a;.a out;is_in("+e+')->.e;area.e[admin_level="2"][name="United Kingdom"]->.f;area.e[admin_level="8"]->.g;area.e[admin_level="10"]->.h;if(f.count(deriveds)==0){.g->.i;}else{if(h.count(deriveds)==0){.g->.i;}else{.h->.i;}}.i out;(node(area.i)[place="village"];node(area.i)[place="hamlet"];node(area.i)[place="city"];node(area.i)[place="town"];)->.k;( node(around:'+f.note.svgHamletDistance+","+e+')[place="hamlet"];node(around:'+f.note.svgVillageDistance+","+e+')[place="village"];node(around:'+f.note.svgCityDistance+","+e+')[place="city"];node(around:'+f.note.svgTownDistance+","+e+')[place="town"];)->.l;node.k.l->.m;.m out;'}()).then((function(n){r=n,i.clear(),s.clear(),r.elements.forEach(e=>{switch(e.type){case"area":e.tags&&e.tags.boundary&&e.tags.name&&(g=e.tags.name);break;case"way":e.nodesIds=e.nodes,delete e.nodes,i.set(e.id,e);break;case"node":s.set(e.id,e),e.tags&&e.tags.place&&["town","city","village","hamlet"].includes(e.tags.place)&&c.push(e)}}),v=document.createElementNS(d,"svg"),v.setAttributeNS(null,"viewBox",String(l.svgViewboxDim/4)+" "+l.svgViewboxDim/4+" "+l.svgViewboxDim/2+" "+l.svgViewboxDim/2),v.setAttributeNS(null,"class","TravelNotes-SvgIcon"),function(){let e=Number.MAX_VALUE;c.forEach(t=>{let a=ke.pointsDistance(o.latLng,[t.lat,t.lon]);e>a&&(e=a,u=t.tags.name)})}(),p=Se.subtrackPoints([l.svgViewboxDim/2,l.svgViewboxDim/2],Se.project(t.latLng,w)),function(){let n=e.defaultValue,r=a.itinerary.itineraryPoints.first,i=a.itinerary.itineraryPoints.last,l=!1;a.itinerary.itineraryPoints.forEach(e=>{t.distance-n>N&&(r=e),n-t.distance>N&&!l&&(i=e,l=!0),n+=e.distance});let s=Se.addPoints(Se.project(t.latLng,w),p);if(o.objId!==a.itinerary.itineraryPoints.first.objId){let e=Se.addPoints(Se.project(r.latLng,w),p);m=180*Math.atan((s[1]-e[1])/(e[0]-s[0]))/Math.PI,0>m&&(m+=360),m-=270,0>e[0]-s[0]&&(m+=180)}if(o.objId!==a.itinerary.itineraryPoints.last.objId){let e=Se.addPoints(Se.project(i.latLng,w),p);for(b=180*Math.atan((s[1]-e[1])/(e[0]-s[0]))/Math.PI,0>e[0]-s[0]&&(b+=180),b-=m;0>b;)b+=360;for(;360{e.tags&&e.tags.rcn_ref&&"bike"===a.itinerary.transitMode&&(p=e),o&&(v=ke.pointsDistance([e.lat,e.lon],o.latLng),ve&&(m=p)}let b=m&&m.tags&&m.tags.highway&&"mini_roundabout"===m.tags.highway;m&&m.tags&&m.tags.rcn_ref&&m.tags["network:type"]&&"node_network"===m.tags["network:type"]&&"bike"===a.itinerary.transitMode&&(A=m.tags.rcn_ref,x+=L.getText("SvgIconFromOsmFactory - rcnRef",{rcnRef:A}));let y="",w="",N=!1,j=!1;i.forEach(e=>{if(!e.nodesIds.includes(r))return;let t=function(e){return(e.tags.name?e.tags.name:"")+(e.tags.name&&e.tags.ref?" ":"")+(e.tags.ref?"["+e.tags.ref+"]":"")}(e),o=""!==t,a=e.nodesIds.includes(l),n=e.nodesIds.includes(d),i=2*e.nodesIds.filter(e=>e===r).length;if(e.nodesIds[0]===r&&i--,e.nodesIds[e.nodesIds.length-1]===r&&i--,a&&(y=o?t:"???",i--,e.tags.junction&&"roundabout"===e.tags.junction&&(j=!0)),0!==i&&(n&&(w=o?t:"???",i--,e.tags.junction&&"roundabout"===e.tags.junction&&(N=!0)),0!==i&&o))for(;0!==i;)I=""===I?t:I+" ⪥ "+t,i--}),I=-1===h?"🟢 "+w:1===h?y+" 🔴 ":y+(""===I?"":" ⪥ "+I)+" "+T+" "+w,N&&!j?x+=L.getText("SvgIconFromOsmFactory - entry roundabout"):!N&&j?x+=L.getText("SvgIconFromOsmFactory - exit roundabout"):N&&j&&(x+=L.getText("SvgIconFromOsmFactory - continue roundabout")),b&&(x+=L.getText("SvgIconFromOsmFactory - at the small roundabout on the ground"))}(),function(){let e=-1,t=-1,o=-1,n=[];if(a.itinerary.itineraryPoints.forEach(a=>{e++;let r=Se.addPoints(Se.project(a.latLng,w),p);n.push(r),r[0]>=0&&r[1]>=0&&r[0]<=l.svgViewboxDim&&r[1]<=l.svgViewboxDim&&(-1===t&&(t=e),o=e)}),-1!==t&&-1!==o){0o&&o++;let r="";for(e=t;e<=o;e++)r+=n[e][0].toFixed(0)+","+n[e][1].toFixed(0)+" ";let i=document.createElementNS(d,"polyline");i.setAttributeNS(null,"points",r),i.setAttributeNS(null,"class","TravelNotes-OSM-Itinerary"),i.setAttributeNS(null,"transform","rotate("+m+","+l.svgViewboxDim/2+","+l.svgViewboxDim/2+")"),v.appendChild(i)}}(),i.forEach(e=>{let t=-1,o=-1,a=-1,n=[];if(e.nodesIds.forEach(e=>{a++;let r=s.get(e),i=Se.addPoints(Se.project([r.lat,r.lon],w),p);n.push(i),i[0]>=0&&i[1]>=0&&i[0]<=l.svgViewboxDim&&i[1]<=l.svgViewboxDim&&(-1===t&&(t=a),o=a)}),-1!==t&&-1!==o){0o&&o++;let r="";for(a=t;a<=o;a++)r+=n[a][0].toFixed(0)+","+n[a][1].toFixed(0)+" ";let i=document.createElementNS(d,"polyline");i.setAttributeNS(null,"points",r),i.setAttributeNS(null,"class","TravelNotes-OSM-Highway TravelNotes-OSM-Highway-"+e.tags.highway),i.setAttributeNS(null,"transform","rotate("+m+","+l.svgViewboxDim/2+","+l.svgViewboxDim/2+")"),v.appendChild(i)}}),function(){if(""===A)return;let e=document.createElementNS(d,"text");e.textContent=A,e.setAttributeNS(null,"x",String(l.svgViewboxDim/2)),e.setAttributeNS(null,"y",String(.6*l.svgViewboxDim)),e.setAttributeNS(null,"class","TravelNotes-OSM-RcnRef"),v.appendChild(e)}(),at=!1,j(Object.freeze({svg:v,tooltip:x,city:g,place:u,streets:I,latLng:o.latLng}))})).catch(e=>{at=!1,P(e)}))}return Object.seal(new class{getPromiseIconAndAdress(e,o){return t.latLng=e,a=Pe.getRoute(o),new Promise(j)}})}const rt=Math.max(f.note.svgHamletDistance,f.note.svgVillageDistance,f.note.svgCityDistance,f.note.svgTownDistance);function it(){let e=null;return Object.seal(new class{parseResponse(t){let o="fulfilled"===t[1].status?function(t){const o=f.nominatim.language;let a=[],n={hamlet:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgHamletDistance},village:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgVillageDistance},city:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgCityDistance},town:{name:null,distance:Number.MAX_VALUE,maxDistance:f.note.svgTownDistance}};t.elements.forEach(t=>{if("area"===t.type){let e=t.tags.name;o&&"*"!==o&&t.tags["name:"+o]&&(e=t.tags["name:"+o]),a[Number.parseInt(t.tags.admin_level)]=e}if("node"===t.type&&t.tags&&t.tags.place&&n[t.tags.place]&&t.tags.name){let o=ke.pointsDistance(e,[t.lat,t.lon]),a=n[t.tags.place];a.maxDistance>o&&a.distance>o&&(a.distance=o,a.name=t.tags.name)}});let r=null,i=null;for(let e=2;e=e?r=a[e]:i=a[e]);let l=null,s=Number.MAX_VALUE;return Object.values(n).forEach(e=>{e.distance.e;area.e[admin_level][boundary="administrative"]->.f;node(around:'+rt+","+t[0]+","+t[1]+")[place]->.g;(.f;.g;)->.h;.h out;";return Promise.allSettled([y.getJsonPromise(o,n),y.getJsonPromise(r)])}})}let lt=[],st=[],dt=null,ct=null,ut=null,gt=null;function vt(){st.forEach(e=>ct.add(b.create("option",{text:p.sanitizeToJsString(e.name)}))),ct.selectedIndex=-1}function ht(){lt.forEach(e=>{let t=b.create("button",{type:"button",htmlBefore:e.htmlBefore||"",htmlAfter:e.htmlAfter||"",className:"TravelNotes-NoteDialog-EditorButton"},dt);p.sanitizeToHtmlElement(e.title||"?",t),t.addEventListener("click",gt.onButtonClickEventListener,!1)})}function pt(e){let t=new FileReader;t.onload=function(){try{let e=JSON.parse(t.result);lt=lt.concat(e.editionButtons),st=st.concat(e.preDefinedIconsList),st.sort((e,t)=>e.name.localeCompare(t.name)),document.querySelectorAll(".TravelNotes-NoteDialog-EditorButton").forEach(e=>{e.removeEventListener("click",gt.onButtonClickEventListener,!1),dt.removeChild(e)}),ht();for(let e=ct.length-1;e>=0;e--)ct.remove(e);vt(),gt.hideError()}catch(e){console.log(e?e.message:"An error occurs when opening the file"),gt.showError(L.getText("NoteDialogToolbar - An error was found in the json file",{error:e.message}))}},t.readAsText(e.target.files[0])}function mt(){ut.click()}function ft(e){gt.toggleContents(),e.target.textContent="▼"===e.target.textContent?"▶":"▼"}const bt=Object.seal(new class{set selectOptions(e){st=st.concat(e),st.sort((e,t)=>e.name.localeCompare(t.name))}set buttons(e){lt=lt.concat(e)}getIconData(e){return st[e]}getIconDataFromName(e){let t=st.find(t=>t.name===e);return t?t.icon:null}createToolbar(e){return gt=e,dt=b.create("div",{className:"TravelNotes-NoteDialog-ToolbarDiv",id:"TravelNotes-NoteDialog-ToolbarDiv"}),ct=b.create("select",{className:"TravelNotes-NoteDialog-Select",id:"TravelNotes-NoteDialog-IconSelect"},dt),ct.addEventListener("change",gt.onSelectEventListener,!1),vt(),ut=b.create("input",{className:"TravelNotes-BaseDialog-OpenFileInput",type:"file"},dt),ut.addEventListener("change",pt,!1),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - show hidden contents"),textContent:"▼"},dt).addEventListener("click",ft,!1),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - Open a configuration file"),textContent:"📂"},dt).addEventListener("click",mt,!1),ht(),dt}});function yt(){let e=null,t=1,o=1,a=Number.MAX_VALUE,n=0,r=0,l=null,s=0,c=f.route.elev.smoothCoefficient,u=f.route.elev.smoothPoints;function g(){let e=function(){let e=0,t=0,o=[],a=l.itinerary.itineraryPoints.iterator,n=0,r=a.done;for(o.push({distance:e,elev:a.value.elev}),n+=a.value.distance,r=a.done;!r;){for(e+=s;e>=n&&!r;)n+=a.value.distance,r=a.done;if(!r){let r=(a.value.elev-a.previous.elev)/a.previous.distance;t=a.value.elev-(n-e)*r,o.push({distance:e,elev:t})}}return o.push({distance:n,elev:l.itinerary.itineraryPoints.last.elev}),o}(),t=new Map,o=(e[u].elev-e[0].elev)/u,a=0;for(a=0;a=t;t++)o+=e[t].elev;t.set(e[a].distance,{distance:e[a].distance,elev:o/(2*u+1)})}return a--,o=s*(e[e.length-1].elev-e[e.length-1-u].elev)/(e[e.length-1].distance-e[e.length-1-u].distance),t.set(e[a].distance+s,{distance:e[a].distance+s,elev:e[a].elev+o}),t.set(e[a].distance+2*s,{distance:e[a].distance+2*s,elev:e[a].elev+2*o}),t}function v(s){return l=s,a=Number.MAX_VALUE,n=0,l.itinerary.itineraryPoints.forEach(e=>{n=Math.max(n,e.elev),a=Math.min(a,e.elev)}),r=n-a,t=i.height/r,o=i.width/l.distance,e=document.createElementNS(d,"svg"),e.setAttributeNS(null,"viewBox","0 0 "+(i.width+2*i.margin)+" "+(i.height+2*i.margin)),e.setAttributeNS(null,"class","TravelNotes-SvgProfile"),function(){let a="",r=0,s=0,c=0;l.itinerary.itineraryPoints.forEach(e=>{s=(i.margin+o*r).toFixed(0),c=(i.margin+t*(n-e.elev)).toFixed(0),a+=s+","+c+" ",r+=e.distance});let u=document.createElementNS(d,"polyline");u.setAttributeNS(null,"points",a),u.setAttributeNS(null,"class","TravelNotes-SvgProfile-profilePolyline"),e.appendChild(u)}(),function(){const t=i.margin.toFixed(0),o=(i.margin+i.height).toFixed(0),a=(i.margin+i.width).toFixed(0),n=i.margin.toFixed(0);let r=t+","+n+" "+t+","+o+" "+a+","+o+" "+a+","+n,l=document.createElementNS(d,"polyline");l.setAttributeNS(null,"points",r),l.setAttributeNS(null,"class","TravelNotes-SvgProfile-framePolyline"),e.appendChild(l)}(),function(){let o=Number.MAX_VALUE,l=0;i.vScales.forEach(e=>{let t=Math.abs(r/4-e);t{let t=Math.abs(l.distance/8-e);t"+L.getText("HTMLViewsFactory - Address")+" : "+o.address,b.create("div",{className:e+"NoteHtml-Address"},a)),0!==o.url.length&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Link")+"'+o.url.substr(0,40)+"...",b.create("div",{className:e+"NoteHtml-Url"},a)),0!==o.phone.length){let t=o.phone;if(o.phone.match(/^\+[0-9, ,*,#]*$/)){let e=o.phone.replaceAll(/\u0020/g,""),a=o.phone.replaceAll(/\u0020/g," ");t=L.getText("HTMLViewsFactory - Phone")+" : "+L.getText("HTMLViewsFactory - call")+''+a+""+L.getText("HTMLViewsFactory - Send a sms to")+''+a+""}else t=L.getText("HTMLViewsFactory - Phone")+" : "+o.phone;p.sanitizeToHtmlElement(t,b.create("div",{className:e+"NoteHtml-Phone"},a))}if(p.sanitizeToHtmlElement(A.formatLatLng(o.latLng),b.create("div",{className:e+"NoteHtml-LatLng"},a)),t.route){t.route.chain&&p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of travel")+" : "+A.formatDistance(o.chainedDistance+o.distance),b.create("div",{className:e+"NoteHtml-Distance"},a)),p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of route")+" : "+A.formatDistance(o.distance),b.create("div",{className:e+"NoteHtml-Distance"},a));let n=t.route.notes.next(o.objId);if(n){let t=n.distance-o.distance;9"+L.getText("HTMLViewsFactory - Next note after")+" : "+A.formatDistance(t),b.create("div",{className:e+"NoteHtml-NextDistance"},a))}}return a}function Nt(e,t){let o=b.create("div"),a=b.create("div",{className:e+"Travel-Notes-IconCell"},o);p.sanitizeToHtmlElement(t.note.iconContent,a),a.style.width=String(t.note.iconWidth)+"px",a.style.height=String(t.note.iconHeight)+"px","TravelNotes-Roadbook-"===e&&a.firstChild&&("svg"===a.firstChild.tagName?(a.firstChild.setAttributeNS(null,"viewBox","0 0 "+l.svgViewboxDim+" "+l.svgViewboxDim),a.style.width=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px",a.style.height=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px"):a.firstChild.classList.contains("TravelNotes-MapNoteCategory-0073")&&(a.style.width=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px",a.style.height=String(t.note.iconWidth*f.note.svgRoadbookDimCoef)+"px"));let n=wt(e,t);return n.className=e+"Travel-Notes-Cell",o.appendChild(n),o.noteObjId=t.note.objId,o}function Tt(e){let t=b.create("div",{className:e+"Travel-Notes"}),o=ie.travel.notes.iterator;for(;!o.done;){let a=Nt(e,{note:o.value,route:null});a.className=e+"Travel-Notes-Row",t.appendChild(a)}return t}function xt(e,t){let o=b.create("div",{className:e+"Route-Header",id:"route"+t.objId});return p.sanitizeToHtmlElement(t.computedName,b.create("div",{className:e+"Route-Header-Name"},o)),0!==t.distance&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Route distance",{distance:A.formatDistance(t.distance)}),b.create("div",{className:e+"Route-Header-Distance"},o)),ie.travel.readOnly||"bike"===t.itinerary.transitMode||p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Duration",{duration:A.formatTime(t.duration)}),b.create("div",{className:e+"Route-Header-Duration"},o)),t.itinerary.hasProfile&&(p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Ascent",{ascent:t.itinerary.ascent.toFixed(0)}),b.create("div",{className:e+"Route-Header-Ascent"},o)),p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Descent",{descent:t.itinerary.descent.toFixed(0)}),b.create("div",{className:e+"Route-Header-Descent"},o))),o}function It(t,o){let a=b.create("div");b.create("div",{className:t+"Route-ManeuversAndNotes-IconCell TravelNotes-ManeuverNote-"+o.maneuver.iconName},a);let n=b.create("div",{className:t+"Route-ManeuversAndNotes-Cell"},a);return p.sanitizeToHtmlElement(o.maneuver.instruction,b.create("div",null,n)),o.route.chain&&p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of travel")+" : "+A.formatDistance(o.route.chainedDistance+o.maneuverDistance),b.create("div",null,n)),p.sanitizeToHtmlElement(""+L.getText("HTMLViewsFactory - Distance from start of route")+" : "+A.formatDistance(o.maneuverDistance),b.create("div",null,n)),e.defaultValue"+L.getText("HTMLViewsFactory - Next maneuver after")+" : "+A.formatDistance(o.maneuver.distance),b.create("div",null,n)),a}function Lt(e,t){let o=[],a=t.notes.iterator;for(;!a.done;){let n=Nt(e,{note:a.value,route:t});n.className=e+"Route-Notes-Row",n.objId=N(),n.latLng=a.value.latLng,n.noteObjId=a.value.objId,n.distance=a.value.distance,o.push(n)}let n=t.itinerary.maneuvers.iterator,r=0;for(;!n.done;){let a=It(e,{route:t,maneuver:n.value,maneuverDistance:r});a.className=e+"Route-Maneuvers-Row",a.objId=N(),a.latLng=t.itinerary.itineraryPoints.getAt(n.value.itineraryPointObjId).latLng,a.maneuverObjId=n.value.objId,a.distance=r,o.push(a),r+=n.value.distance}o.sort((e,t)=>e.distance-t.distance);let i=b.create("div",{className:e+"Route-ManeuversAndNotes"});return o.forEach(e=>i.appendChild(e)),i}function At(e,t){let o="";""!==t.itinerary.provider&&""!==t.itinerary.transitMode&&(o=L.getText("HTMLViewsFactory - Itinerary computed by {provider} and optimized for {transitMode}",{provider:t.itinerary.provider,transitMode:L.getText("HTMLViewsFactory - TransitMode "+t.itinerary.transitMode)}));let a=b.create("div",{className:e+"RouteFooter"});return p.sanitizeToHtmlElement(o,a),a}function Et(e,t){let o=b.create("div",{className:e+"RouteProfile"});return p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Profile"),o),o.appendChild(yt().createSvg(t)),o}function jt(t){let o=b.create("div",{className:t+"Travel"});o.appendChild(function(t){let o=b.create("div",{className:t+"Travel-Header"});p.sanitizeToHtmlElement(ie.travel.name,b.create("div",{className:t+"Travel-Header-Name"},o));let a=e.defaultValue,n=0,r=0,i=ie.travel.routes.iterator;for(;!i.done;){let e=i.value.objId===ie.editedRouteObjId&&f.routeEditor.displayEditionInHTMLPage?ie.travel.editedRoute:i.value;p.sanitizeToHtmlElement(''+e.computedName+" : "+A.formatDistance(e.distance)+".",b.create("div",{className:t+"Travel-Header-RouteName"},o)),e.chain&&(a+=e.distance,n+=e.itinerary.ascent,r+=e.itinerary.descent)}return p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel distance",{distance:A.formatDistance(a)}),b.create("div",{className:t+"Travel-Header-TravelDistance"},o)),0!==n&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel ascent",{ascent:n.toFixed(0)}),b.create("div",{className:t+"Travel-Header-TravelAscent"},o)),0!==r&&p.sanitizeToHtmlElement(L.getText("HTMLViewsFactory - Travel descent",{descent:r.toFixed(0)}),b.create("div",{className:t+"Travel-Header-TravelDescent"},o)),o}(t)),o.appendChild(Tt(t));let a=ie.travel.routes.iterator;for(;!a.done;){let e=f.routeEditor.displayEditionInHTMLPage&&a.value.objId===ie.editedRouteObjId?ie.travel.editedRoute:a.value;o.appendChild(xt(t,e)),e.itinerary.hasProfile&&o.appendChild(Et(t,e)),o.appendChild(Lt(t,e)),o.appendChild(At(t,e))}return o.appendChild(function(e){let t=L.getText("HTMLViewsFactory - Travel footer")+'Travel & Notes, © wwwouaiebe 2017 2021 © '+L.getText("HTMLViewsFactory - OpenStreetMap contributors")+"",o=b.create("div",{className:e+"TravelFooter"});return p.sanitizeToHtmlElement(t,o),o}(t)),o}const Pt=Object.freeze(new class{getTravelHTML(e){return jt(e)}getNoteTextAndIconHTML(e,t){return Nt(e,t)}getNoteTextHTML(e,t){return wt(e,t)}getEditedRouteManeuversAndNotesHTML(e){return Lt(e,ie.travel.editedRoute)}getTravelNotesHTML(e){return Tt(e)}getRouteHeaderHTML(e,t){return xt(e,t)}});function Dt(e,t,o){let a=null,r=it(),i=e.latLng,s="",d="",c=null,u=null,g=null,v=null,h=null,m=null,y=null,w=null,N=null,T=null,x=null,I=null,A=null,E=null,j=null,P=null,D=null,R=null,C=null,M=null,S=null,O=null;function U(){if(""!==E.value){if(""===M.value||""!==p.sanitizeToUrl(M.value).url)return e.iconWidth=Number.parseInt(j.value),e.iconHeight=Number.parseInt(P.value),e.iconContent=E.value,e.popupContent=D.value,e.tooltipContent=R.value,e.address=C.value,e.url=M.value,e.phone=S.value,e.latLng=i,e.validateData(),e;I.showError(L.getText("Notedialog - invalidUrl"))}else I.showError(L.getText("Notedialog - The icon content cannot be empty"))}function k(){""===E.value?c.iconContent="?????":c.iconContent=E.value,c.popupContent=D.value,c.tooltipContent=R.value,c.address=C.value,c.url=M.value,c.phone=S.value,c.iconWidth=j.value,c.iconHeight=P.value,O.textContent="",O.appendChild(Pt.getNoteTextAndIconHTML("TravelNotes-NoteDialog-",{note:c,route:null}))}function B(t){let a=r.parseResponse(t);s=a.street,""!==a.city&&(s+=' '+a.city+""),d=a.city,f.note.reverseGeocoding&&""===e.address&&o&&(C.value=s),k()}function H(e){I.showError(L.getText("Notedialog - an error occurs when searching the adress")),console.log(e||"an error occurs when searching the adress."),k()}function z(e){E.value=e.svg.outerHTML,R.value=e.tooltip;let t=e.streets,o=""===e.city?d:e.city;""!==o&&(t+=' '+o+""),e.place&&e.place!==o&&(t+=" ("+e.place+")"),C.value=t,i=e.latLng,I.hideWait(),k()}function V(e){I.hideWait(),I.showError(L.getText("Notedialog - an error occurs when creating the SVG icon")),console.log(e||"an error occurs when creating the SVG icon."),k()}function F(o){let a=bt.getIconData(o.target.selectedIndex);"SvgIcon"===a.icon?-1===t?I.showError(L.getText("Notedialog - not possible to create a SVG icon for a travel note")):(I.showWait(),nt().getPromiseIconAndAdress(e.latLng,t).then(z).catch(V)):(I.hideError(),j.value=a.width,P.value=a.height,E.value=a.icon,R.value=a.tooltip,k())}function W(e){if(!a)return;let t=e.target;for(;!t.htmlBefore;)t=t.parentNode;let o=a.selectionStart,n=a.selectionEnd;a.value=a.value.slice(0,o)+t.htmlBefore+(0===t.htmlAfter.length?"":a.value.slice(o,n))+t.htmlAfter+a.value.slice(n),o===n||0===t.htmlAfter.length?(o+=t.htmlBefore.length,n=o):n+=t.htmlBefore.length+t.htmlAfter.length,a.setSelectionRange(o,n),a.focus(),k()}function K(){C.value=s,k()}function J(e){a=e.target}function Z(e){if(""===e.target.value)return;let t=p.sanitizeToUrl(e.target.value);""===t.errorsString?I.hideError():I.showError(t.errorsString)}function G(){f.noteDialog.toggleIconDimension&&u.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleIconTextArea&&g.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.togglePopupContent&&v.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleTooltip&&h.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),f.noteDialog.toggleAddress&&(m.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),y.classList.toggle("TravelNotes-NoteDialog-HiddenItem")),f.noteDialog.toggleLink&&(w.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),N.classList.toggle("TravelNotes-NoteDialog-HiddenItem")),f.noteDialog.togglePhone&&(T.classList.toggle("TravelNotes-NoteDialog-HiddenItem"),x.classList.toggle("TravelNotes-NoteDialog-HiddenItem"))}return c=X(),c.jsonObject=e.jsonObject,""===c.iconContent&&(c.iconContent="?????"),I=le(),I.title=L.getText("NoteDialog - Note"),I.okButtonListener=U,A=b.create("div",{id:"TravelNotes-NoteDialog-MainDataDiv"},I.content),A.appendChild(bt.createToolbar({onButtonClickEventListener:W,onSelectEventListener:F,hideError:I.hideError,showError:I.showError,toggleContents:G})),u=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("text",{value:L.getText("NoteDialog - Icon width")},u),j=b.create("input",{type:"number",className:"TravelNotes-NoteDialog-NumberInput",value:0===e.iconWidth?l.width:e.iconWidth},u),j.addEventListener("input",k,!1),b.create("text",{value:L.getText("NoteDialog - Icon height")},u),P=b.create("input",{type:"number",className:"TravelNotes-NoteDialog-NumberInput",value:0===e.iconHeight?l.height:e.iconHeight},u),P.addEventListener("input",k,!1),g=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Icon content")},A),E=b.create("textarea",{className:"TravelNotes-NoteDialog-TextArea",value:e.iconContent,placeholder:"?????",rows:f.noteDialog.iconAreaHeight},g),E.addEventListener("focus",J,!1),E.addEventListener("input",k,!1),h=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Tooltip content")},A),R=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.tooltipContent},h),R.addEventListener("focus",J,!1),R.addEventListener("input",k,!1),v=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv",textContent:L.getText("NoteDialog - Text")},A),D=b.create("textarea",{className:"TravelNotes-NoteDialog-TextArea",value:e.popupContent,rows:f.noteDialog.popupAreaHeigth},v),D.addEventListener("focus",J,!1),D.addEventListener("input",k,!1),m=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("NoteDialog - Reset address"),textContent:"🔄"},m).addEventListener("click",K,!1),b.create("text",{value:L.getText("NoteDialog - Address")},m),y=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),C=b.create("input",{type:"text",value:e.address,className:"TravelNotes-NoteDialog-InputText"},y),C.addEventListener("focus",J,!1),C.addEventListener("input",k,!1),w=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),f.note.theDevil.addButton&&b.create("text",{value:"👿"},b.create("a",{href:"https://www.google.com/maps/@"+e.lat.toFixed(n.fixed)+","+e.lng.toFixed(n.fixed)+","+f.note.theDevil.noteZoom+"z",target:"_blank",title:"Reminder! The devil will know everything about you"},b.create("div",{className:"TravelNotes-BaseDialog-Button",title:"Reminder! The devil will know everything about you"},w))),b.create("text",{value:L.getText("NoteDialog - Link")},w),N=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),M=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.url},N),M.addEventListener("focus",()=>{a=null},!1),M.addEventListener("blur",Z,!1),M.addEventListener("input",k,!1),T=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),b.create("text",{value:" "+L.getText("NoteDialog - Phone")},T),x=b.create("div",{className:"TravelNotes-NoteDialog-DataDiv"},A),S=b.create("input",{type:"text",className:"TravelNotes-NoteDialog-InputText",value:e.phone},x),S.addEventListener("focus",J,!1),S.addEventListener("input",k,!1),O=b.create("div",{className:"TravelNotes-NoteDialog-PreviewDiv"},I.footer),O.appendChild(Pt.getNoteTextAndIconHTML("TravelNotes-NoteDialog-",{note:c,route:null})),r.getPromiseAddress(e.latLng).then(B).catch(H),G(),I}function Rt(){let e=null,t=null;return Object.freeze(new class{createUI(){if(document.getElementById("TravelNotes-WaitUI"))return;e=b.create("div",{className:"TravelNotes-Background"},document.querySelector("body"));let o=b.create("div",{id:"TravelNotes-WaitUI"},e);t=b.create("div",{id:"TravelNotes-WaitUI-MessageDiv"},o),b.create("div",{className:"TravelNotes-WaitAnimationBullet"},b.create("div",{className:"TravelNotes-WaitAnimation"},o))}showInfo(e){t.textContent=e}close(){document.querySelector("body").removeChild(e),e=null}})}let Ct=null,Mt=0,St=0,Ot=f.note.osmSearchNoteDialog;function Ut(e,t){let o=X();o.iconContent=e.svg.outerHTML,o.popupContent="",o.iconWidth=l.width,o.iconHeight=l.height,o.tooltipContent=e.tooltip,o.address=e.streets,""!==e.city&&(o.address+=' '+e.city+""),e.place&&e.place!==e.city&&(o.address+=" ("+e.place+")"),o.latLng=e.latLng,o.iconLatLng=e.latLng,o.distance=Se.getClosestLatLngDistance(t,o.latLng).distance,o.chainedDistance=t.chainedDistance,t.notes.add(o),we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:o.objId}),we.dispatch("roadbookupdate")}function kt(e,t,o){if(o)if(-1===t)ie.travel.notes.add(e),we.dispatch("showtravelnotes");else{let o=Pe.getRoute(t);o.notes.add(e),e.chainedDistance=o.chainedDistance,o.notes.sort((e,t)=>e.distance-t.distance),we.dispatch("showitinerary")}else-1===t?we.dispatch("updatetravelnotes"):we.dispatch("updateitinerary");we.dispatch("noteupdated",{removedNoteObjId:e.objId,addedNoteObjId:e.objId}),we.dispatch("roadbookupdate")}function Bt(e,t,o){Dt(e,t,o).show().then(()=>{kt(e,t,o)}).catch(e=>console.log(e||"An error occurs in the note dialog"))}function Ht(e){let t=X();return t.latLng=e,t.iconLatLng=e,t}const zt=Object.seal(new class{get osmSearchNoteDialog(){return Ot}changeOsmSearchNoteDialog(){Ot=!Ot}addAllManeuverNotes(e){let t=Pe.getRoute(e),o=t.itinerary.maneuvers.iterator;for(St=0;!o.done;)"kDepartDefault"===o.value.iconName&&!o.first||"kArriveDefault"===o.value.iconName&&!o.last||St++;f.note.maxManeuversNotest.cancelButton.click(),!0)}e.textContent&&b.create("div",{id:"TravelNotes-TwoButtonsDialog-MessageDiv",textContent:e.textContent},t.content)}(),t}({title:L.getText("NoteEditor - Add a note for each maneuver"),textContent:L.getText("NoteEditor - Add a note for each maneuver. Are you sure?",{noteLength:St}),secondButtonContent:"❌"}).show().then(()=>{o=t.itinerary.maneuvers.iterator,o.done||(Ct=Rt(),Ct.createUI(),Mt=1,function e(t,o){function a(){t.done?(o.notes.sort((e,t)=>e.distance-t.distance),we.dispatch("updateitinerary"),we.dispatch("roadbookupdate"),Ct.close(),Ct=null):e(t,o)}if(Ct.showInfo(L.getText("NoteEditor - Creating note",{noteNumber:Mt,notesLength:St})),"kDepartDefault"===t.value.iconName&&!t.first||"kArriveDefault"===t.value.iconName&&!t.last)a();else{Mt++;let e=o.itinerary.itineraryPoints.getAt(t.value.itineraryPointObjId).latLng;nt().getPromiseIconAndAdress(e,o.objId).then(e=>{Ut(e,o),a()}).catch(e=>{console.log(e||"an error occurs when creating the SVG icon."),a()})}}(o,t))}).catch(e=>console.log(e||"An error occurs in the note dialog"))}newRouteNote(e){let t=Pe.getRoute(e.routeObjId),o=Se.getClosestLatLngDistance(t,[e.lat,e.lng]),a=Ht(o.latLng);a.distance=o.distance,Bt(a,t.objId,!0)}newSearchNote(e){let t=[e.osmElement.lat,e.osmElement.lon],o=[e.osmElement.lat,e.osmElement.lon],a=-1,n=Number.MAX_VALUE;function r(e){if(e.objId!==ie.editedRouteObjId){let r=Se.getClosestLatLngDistance(e,t);if(r){let i=ke.pointsDistance(t,r.latLng);i"+e.osmElement.tags.rcn_ref+"":i.iconContent=bt.getIconDataFromName(e.osmElement.description)||"",i.address=(e.osmElement.tags["addr:housenumber"]?e.osmElement.tags["addr:housenumber"]+" ":"")+(e.osmElement.tags["addr:street"]?e.osmElement.tags["addr:street"]+" ":"")+(e.osmElement.tags["addr:postcode"]?e.osmElement.tags["addr:postcode"]+" ":"")+(e.osmElement.tags["addr:city"]?e.osmElement.tags["addr:city"]+" ":""),i.url=e.osmElement.tags.website||"",i.phone=e.osmElement.tags.phone||"",i.tooltipContent=e.osmElement.description||"",i.popupContent=e.osmElement.tags.name||"",e.isTravelNote||-1!==a?Ot||""===i.iconContent?Bt(i,a,!0):kt(i,a,!0):be.showError(L.getText("NoteEditor - No route was found"))}newManeuverNote(e){Ct=Rt(),Ct.createUI();let t=ie.travel.editedRoute,o=t.itinerary.maneuvers.getAt(e),a=t.itinerary.itineraryPoints.getAt(o.itineraryPointObjId).latLng;nt().getPromiseIconAndAdress(a,t.objId).then(o=>{Ut(o,t),t.notes.sort((e,t)=>e.distance-t.distance),t.itinerary.maneuvers.remove(e),we.dispatch("showitinerary"),we.dispatch("roadbookupdate"),Ct.close(),Ct=null}).catch(e=>{console.log(e||"an error occurs when creating the SVG icon."),Ct.close(),Ct=null})}newTravelNote(e){Bt(Ht(e),-1,!0)}editNote(e){let t=Pe.getNoteAndRoute(e),o=null===t.route?-1:t.route.objId;Bt(t.note,o,!1)}removeNote(e){let t=Pe.getNoteAndRoute(e);t.route?(t.route.notes.remove(e),we.dispatch("updateitinerary")):(ie.travel.notes.remove(e),we.dispatch("updatetravelnotes")),we.dispatch("noteupdated",{removedNoteObjId:e,addedNoteObjId:-1}),we.dispatch("roadbookupdate")}hideNotes(){let e=ie.travel.notes.iterator;for(;!e.done;)we.dispatch("removeobject",{objId:e.value.objId});let t=ie.travel.routes.iterator;for(;!t.done;)for(e=t.value.notes.iterator;!e.done;)we.dispatch("removeobject",{objId:e.value.objId});if(-1!==ie.editedRouteObjId)for(e=ie.travel.editedRoute.notes.iterator;!e.done;)we.dispatch("removeobject",{objId:e.value.objId})}showNotes(){this.hideNotes();let e=ie.travel.notes.iterator;for(;!e.done;)we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:e.value.objId});let t=ie.travel.routes.iterator;for(;!t.done;)t.value.hidden||we.dispatch("routeupdated",{removedRouteObjId:t.value.objId,addedRouteObjId:t.value.objId})}attachNoteToRoute(e){let t=Pe.getNoteAndRoute(e),o=Number.MAX_VALUE,a=null,n=null,r=null;ie.travel.routes.forEach(e=>{let i=Se.getClosestLatLngDistance(e,t.note.latLng);if(i){let l=ke.pointsDistance(t.note.latLng,i.latLng);le.distance-t.distance),we.dispatch("noteupdated",{removedNoteObjId:e,addedNoteObjId:e}),we.dispatch("updateitinerary"),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate"))}detachNoteFromRoute(t){let o=Pe.getNoteAndRoute(t);o.route.notes.remove(t),o.note.distance=e.invalid,o.note.chainedDistance=e.defaultValue,ie.travel.notes.add(o.note),we.dispatch("updateitinerary"),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate")}travelNoteDropped(e,t,o){ie.travel.notes.moveTo(e,t,o),we.dispatch("updatetravelnotes"),we.dispatch("roadbookupdate")}}); /** @------------------------------------------------------------------------------------------------------------------------------ @@ -103,7 +103,7 @@ class{getTextPromise(e,t){return new Promise((function(o,a){let n=new XMLHttpReq @------------------------------------------------------------------------------------------------------------------------------ */ -function Vt(){let e=N(),t=null,o=null,a=null,n=null,r=null,l=null,s=null,c=null;function u(e){let o=t.getBoundingClientRect(),a=(e.clientX-o.x-i.margin/(2*i.margin+i.width)*o.width)/(i.width/(2*i.margin+i.width)*o.width)*c.distance;return Se.getLatLngElevAtDist(c,a)}function g(e){e.preventDefault(),e.stopPropagation();let t=u(e);t&&(e.routeObjId=c.objId,e.latlng={lat:t.latLng[0],lng:t.latLng[1]},e.originalEvent={clientX:e.clientX,clientY:e.clientY},function(e){let t=Be(),o=ot(e,[{context:zt,name:L.getText("ProfileContextMenu - Add a note to the route at this point"),action:zt.newRouteNote,param:{routeObjId:e.routeObjId,lat:e.latlng.lat,lng:e.latlng.lng}},{context:t,name:L.getText("ProfileContextMenu - Zoom to this point"),action:t.zoomToLatLng,param:[e.latlng.lat,e.latlng.lng]}]);return Object.seal(o)}(e).show())}function v(){we.dispatch("removeobject",{objId:e})}function h(l){let s=t.getBoundingClientRect(),g=u(l);if(g){const u=3;we.dispatch("removeobject",{objId:e}),we.dispatch("additinerarypointmarker",{objId:e,latLng:g.latLng}),o&&(t.removeChild(o),t.removeChild(r),t.removeChild(a),t.removeChild(n));let v=(2*i.margin+i.width)*(l.clientX-s.x)/s.width,h=i.margin+i.height;o=document.createElementNS(d,"polyline"),o.setAttributeNS(null,"points",String(v)+","+i.margin+" "+v+","+h),o.setAttributeNS(null,"class","TravelNotes-SvgProfile-markerPolyline"),t.appendChild(o);let p=g.routeDistance>c.distance/2?"end":"start",m=g.routeDistance>c.distance/2?-i.xDeltaText:i.xDeltaText;r=document.createElementNS(d,"text"),r.appendChild(document.createTextNode(A.formatDistance(g.routeDistance))),r.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),r.setAttributeNS(null,"x",v+m),r.setAttributeNS(null,"y",i.margin+i.yDeltaText),r.setAttributeNS(null,"text-anchor",p),t.appendChild(r),a=document.createElementNS(d,"text"),a.appendChild(document.createTextNode("Alt. "+g.elev.toFixed(0)+" m.")),a.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),a.setAttributeNS(null,"x",v+m),a.setAttributeNS(null,"y",i.margin+2*i.yDeltaText),a.setAttributeNS(null,"text-anchor",p),t.appendChild(a),n=document.createElementNS(d,"text"),n.appendChild(document.createTextNode("Pente "+g.ascent.toFixed(0)+" % ")),n.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),n.setAttributeNS(null,"x",v+m),n.setAttributeNS(null,"y",i.margin+i.yDeltaText*u),n.setAttributeNS(null,"text-anchor",p),t.appendChild(n)}}function p(){t&&(t.removeEventListener("contextmenu",g,!1),t.removeEventListener("mousemove",h,!1),t.removeEventListener("mouseleave",v,!1),we.dispatch("removeobject",{objId:e}),l.content.removeChild(s),l.content.removeChild(t)),t=null,o=null,n=null,r=null,a=null,s=null}return l=He(),l.createWindow(),l.onClose=function(){p(),we.dispatch("profileclosed",{objId:c.objId})},l.update=function(e){p(),c=e,t=yt().createSvg(e),l.header.textContent=L.getText("ProfileWindow - Profile {name}",c),l.content.appendChild(t),t.addEventListener("contextmenu",g,!1),t.addEventListener("mousemove",h,!1),t.addEventListener("mouseleave",v,!1),s=b.create("div",{className:"TravelNotes-ProfileWindow-Ascent",textContent:L.getText("ProfileWindow - Ascent: {ascent} m. - Descent: {descent} m. - Distance: {distance}",{ascent:c.itinerary.ascent.toFixed(0),descent:c.itinerary.descent.toFixed(0),distance:A.formatDistance(c.distance)})}),l.content.appendChild(s)},Object.seal(l)}let Ft=new Map,Wt=yt();const Kt=Object.seal(new class{createProfile(e){let t=Ft.get(e.objId);if(e.itinerary.hasProfile){f.route.elev.smooth&&Wt.smooth(e),e.itinerary.ascent=0,e.itinerary.descent=0;let o=e.itinerary.itineraryPoints.first.elev;e.itinerary.itineraryPoints.forEach(t=>{let a=t.elev-o;0>a?e.itinerary.descent-=a:e.itinerary.ascent+=a,o=t.elev}),t&&t.update(e)}else t&&t.close()}updateProfile(e,t){let o=Ft.get(e);o&&(Ft.delete(e),t&&t.itinerary.hasProfile?(o.update(t),Ft.set(t.objId,o)):o.close())}deleteProfile(e){let t=Ft.get(e);t&&t.close()}deleteAllProfiles(){Ft.forEach(e=>e.close())}showProfile(e){let t=Ft.get(e);t||(t=Vt());let o=Pe.getRoute(e);t.update(o),Ft.set(e,t)}onProfileClosed(e){Ft.delete(e)}});const Jt=Object.seal(new class{createUI(){b.create("div",{id:"TravelNotes-AttributionsUI"},document.querySelector("body")),this.attributions=""}set attributions(e){let t='© Leaflet | © OpenStreetMap contributors '+e+'| © Travel & Notes',o=document.getElementById("TravelNotes-AttributionsUI");for(;o.firstChild;)o.removeChild(o.firstChild);p.sanitizeToHtmlElement(t,o)}});class Zt{constructor(e){if(!e.name||"string"!=typeof e.name)throw new Error("invalid name for layer");if(this.name=p.sanitizeToJsString(e.name),!e.service||"wms"!==e.service&&"wmts"!==e.service)throw new Error("invalid service for layer "+this.name);if(this.service=e.service,!e.url||"string"!=typeof e.url)throw new Error("invalid url for layer "+this.name);if(this.url=e.url,"wms"===this.service){if(!(e.wmsOptions&&e.wmsOptions.layers&&"string"==typeof e.wmsOptions.layers&&e.wmsOptions.format&&"string"==typeof e.wmsOptions.format&&e.wmsOptions.transparent&&"boolean"==typeof e.wmsOptions.transparent))throw new Error("invalid wmsOptions for layer "+this.name);this.wmsOptions=e.wmsOptions,this.wmsOptions.layers=p.sanitizeToJsString(this.wmsOptions.layers),this.wmsOptions.format=p.sanitizeToJsString(this.wmsOptions.format)}try{e.bounds&&"number"==typeof e.bounds[0][0]&&"number"==typeof e.bounds[0][1]&&"number"==typeof e.bounds[1][0]&&"number"==typeof e.bounds[1][1]&&(this.bounds=e.bounds)}catch(e){throw new Error("invalid bounds for layer "+this.name)}if(e.minZoom&&"number"==typeof e.minZoom&&(this.minZoom=e.minZoom),e.maxZoom&&"number"==typeof e.maxZoom&&(this.maxZoom=e.maxZoom),!(e.toolbar&&e.toolbar.text&&"string"==typeof e.toolbar.text&&e.toolbar.color&&"string"==typeof e.toolbar.color&&e.toolbar.backgroundColor&&"string"==typeof e.toolbar.backgroundColor))throw new Error("invalid toolbar for layer "+this.name);if(this.toolbar=e.toolbar,this.toolbar.text=p.sanitizeToJsString(this.toolbar.text),this.toolbar.color=p.sanitizeToColor(this.toolbar.color)||"#000000",this.toolbar.backgroundColor=p.sanitizeToColor(this.toolbar.backgroundColor)||"#ffffff",!e.providerName||"string"!=typeof e.providerName)throw new Error("invalid providerName for layer "+this.name);if(this.providerName=p.sanitizeToJsString(e.providerName),"boolean"!=typeof e.providerKeyNeeded)throw new Error("invalid providerKeyNeeded for layer "+this.name);if(this.providerKeyNeeded=e.providerKeyNeeded,""===e.attribution)this.attribution="";else{if(!e.attribution||"string"!=typeof e.attribution)throw new Error("invalid attribution for layer "+this.name);this.attribution=p.sanitizeToHtmlString(e.attribution).htmlString}if(e.getCapabilitiesUrl&&"string"==typeof e.getCapabilitiesUrl&&(this.getCapabilitiesUrl=p.sanitizeToUrl(e.getCapabilitiesUrl).url,""===this.getCapabilitiesUrl))throw new Error("invalid getCapabilitiesUrl for layer "+this.name)}}function Xt(e){return Object.freeze(new Zt(e))}let Gt=[Xt({service:"wmts",url:"https://{s}.tile.osm.org/{z}/{x}/{y}.png",name:"OSM - Color",toolbar:{text:"OSM",color:"#ff0000",backgroundColor:"#ffffff"},providerName:"OSM",providerKeyNeeded:!1,attribution:""})],qt=null,Yt=null,Qt=null,_t=0,$t=0,eo=0,to=0;function oo(e){e.target.style.color=e.target.layer.toolbar.backgroundColor,e.target.style["background-color"]=e.target.layer.toolbar.color}function ao(e){e.target.style.color=e.target.layer.toolbar.color,e.target.style["background-color"]=e.target.layer.toolbar.backgroundColor}function no(e){e.target.classList.add("TravelNotes-LayersToolbarUI-LinkButton-Enter"),e.target.classList.remove("TravelNotes-LayersToolbarUI-LinkButton-Leave")}function ro(e){we.dispatch("layerchange",{layer:e.target.layer}),Jt.attributions=e.target.layer.attribution,ie.travel.layerName=e.target.layer.name}function io(e){e.target.classList.add("TravelNotes-LayersToolbarUI-LinkButton-Leave"),e.target.classList.remove("TravelNotes-LayersToolbarUI-LinkButton-Enter")}function lo(e){e.deltaY&&(_t-=e.deltaY*s[e.deltaMode],_t=_t>to?to:_t,_t=_tfunction(e){if(e.providerKeyNeeded&&!je.getKey(e.providerName.toLowerCase()))return;let t=b.create("div",{type:"layer",className:"TravelNotes-LayersToolbarUI-Button",title:e.name,layer:e,textContent:e.toolbar.text,style:"color:"+e.toolbar.color+";background-color:"+e.toolbar.backgroundColor},Qt);t.addEventListener("mouseenter",oo,!1),t.addEventListener("mouseleave",ao,!1),t.addEventListener("click",ro,!1),$t=t.clientHeight,eo+=$t}(e)),f.layersToolbarUI.theDevil&&f.layersToolbarUI.theDevil.addButton&&function(e,t,o){let a=b.create("div",{type:"link",className:"TravelNotes-LayersToolbarUI-Button TravelNotes-LayersToolbarUI-LinkButton-Leave"},Qt);b.create("a",{href:e,title:t,textContent:o,target:"_blank"},a),a.addEventListener("mouseenter",no,!1),a.addEventListener("mouseleave",io,!1),eo+=a.clientHeight}("https://www.google.com/maps/@"+ie.map.getCenter().lat+","+ie.map.getCenter().lng+","+ie.map.getZoom()+"z","Reminder! The devil will know everything about you","👿"),to+=$t,_t=to,Qt.style.marginTop=String(_t)+"px",Qt.addEventListener("wheel",lo,!1)}const go=Object.freeze(new class{createUI(){Yt=b.create("div",{id:"TravelNotes-LayersToolbarUI"},document.querySelector("body")),b.create("div",{id:"TravelNotes-LayersToolbarUI-Header",textContent:L.getText("LayersToolbarUI - Layers")},Yt),Yt.addEventListener("mouseenter",uo,!1),Yt.addEventListener("mouseleave",co,!1),we.dispatch("layerchange",{layer:Gt[0]}),Jt.attributions=Gt[0].attribution}getLayer(e){let t=Gt.find(t=>t.name===e)||Gt[0];if(t.providerKeyNeeded){je.getKey(t.providerName.toLowerCase())||(t=Gt[0])}return t}setLayer(e){let t=Gt.find(t=>t.name===e)||Gt[0];if(t.providerKeyNeeded){je.getKey(t.providerName.toLowerCase())||(t=Gt[0])}we.dispatch("layerchange",{layer:t}),Jt.attributions=t.attribution,ie.travel.layerName=t.name}addLayers(e){e.forEach(e=>{Gt.push(Xt(e))})}});function vo(){let e=null,t=null,o=null,a=[],n=0,r=null,i=document.querySelector("body"),l=0;function s(){for(;0window.print(),!1),document.getElementById("TravelNotes-PrintToolbar-CancelButton").removeEventListener("click",s,!1),i.removeChild(document.getElementById("TravelNotes-PrintToolbar"));let e=i.children;for(let t=0;to.lat?e.bottomLeft.lat:e.upperRight.lat,lng:t.lng}:t.lat===o.lat?{lat:t.lat,lng:t.lng=e.bottomLeft.lat&&n.lng=e.bottomLeft.lng&&n.lng<=e.upperRight.lng&&n.lat=e.bottomLeft.lat&&n.lng>a.lng)return n;if(n={lat:e.bottomLeft.lat,lng:(e.bottomLeft.lat-i)/r},n.lng>=e.bottomLeft.lng&&n.lng<=e.upperRight.lng&&n.lat>a.lat)return n;throw new Error("intermediate point not found")}function c(o){n++;let a="TravelNotes-RouteViewDiv"+n,l=b.create("div",{className:"TravelNotes-routeViewDiv",id:a},i);e.pageBreak&&l.classList.add("TravelNotes-PrintPageBreak"),l.style.width=String(e.paperWidth)+"mm",l.style.height=String(e.paperHeight)+"mm";let s=e.printNotes?function(){let e=[];return t.notes.forEach(t=>{let o=window.L.divIcon({iconSize:[t.iconWidth,t.iconHeight],iconAnchor:[t.iconWidth/2,t.iconHeight/2],popupAnchor:[0,-t.iconHeight/2],html:t.iconContent,className:"TravelNotes-AllNotes "});let a=window.L.marker(t.iconLatLng,{zIndexOffset:100,icon:o,draggable:!0});e.push(a)}),e}():[];s.push(function(){let e=go.getLayer(ie.travel.layerName),t=e.url;if(e.providerKeyNeeded){let o=je.getKey(e.providerName.toLowerCase());t=t.replace("{providerKey}",o)}let o=null;return o="wmts"===e.service.toLowerCase()?window.L.tileLayer(t):window.L.tileLayer.wms(t,e.wmsOptions),o.options.attribution=' © OpenStreetMap contributors '+e.attribution+'| © Travel & Notes ',o}()),s.push(window.L.circleMarker([o.entryPoint.lat,o.entryPoint.lng],f.printRouteMap.entryPointMarker)),s.push(window.L.circleMarker([o.exitPoint.lat,o.exitPoint.lng],f.printRouteMap.exitPointMarker)),s.push(r),window.L.map(a,{attributionControl:!0,zoomControl:!1,center:[(o.bottomLeft.lat+o.upperRight.lat)/2,(o.bottomLeft.lng+o.upperRight.lng)/2],zoom:e.zoomFactor,minZoom:e.zoomFactor,maxZoom:e.zoomFactor,layers:s})}function u(){let e=i.children;for(let t=0;twindow.print(),!1),b.create("div",{id:"TravelNotes-PrintToolbar-CancelButton",className:"TravelNotes-UI-Button",title:L.getText("PrintFactory - Cancel print"),textContent:"❌"},e).addEventListener("click",s,!1)}(),window.addEventListener("afterprint",s,!0);let o=[],l=t.itinerary.itineraryPoints.iterator;for(;!l.done;)o.push(l.value.latLng);r=window.L.polyline(o,{color:t.color,weight:t.width}),n=0,a.forEach(c)}return Object.freeze(new class{print(n,r){t=Pe.getRoute(r),t&&(e=n,function(){let t=document.querySelector("body"),a=b.create("div",{},t);a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width=String(e.paperWidth-2*e.borderWidth)+"mm",a.style.height=String(e.paperHeight-2*e.borderWidth)+"mm",l=Math.ceil(a.clientWidth/256)*Math.ceil(a.clientHeight/256);let n=Se.screenCoordToLatLng(0,0),r=Se.screenCoordToLatLng(a.clientWidth,a.clientHeight);t.removeChild(a);let i=ie.map.getZoomScale(ie.map.getZoom(),e.zoomFactor);o=[Math.abs(n[0]-r[0])*i,Math.abs(n[1]-r[1])*i]}(),function(){a=[];let e=t.itinerary.itineraryPoints.iterator,n=e.done,r={bottomLeft:{lat:e.value.lat,lng:e.value.lng},upperRight:{lat:e.value.lat,lng:e.value.lng}},i={lat:e.value.lat,lng:e.value.lng},s=e.value;n=e.done;let c=e.value;for(;!n;){let t={bottomLeft:{lat:Math.min(r.bottomLeft.lat,c.lat),lng:Math.min(r.bottomLeft.lng,c.lng)},upperRight:{lat:Math.max(r.upperRight.lat,c.lat),lng:Math.max(r.upperRight.lng,c.lng)}},u=[t.upperRight.lat-t.bottomLeft.lat,t.upperRight.lng-t.bottomLeft.lng];o[0]>u[0]&&o[1]>u[1]?(r=t,s=e.value,n=e.done,c=e.value,n&&(r.entryPoint=i,r.exitPoint=s,a.push(r))):(s=d(r,s,c),r.bottomLeft={lat:Math.min(r.bottomLeft.lat,s.lat),lng:Math.min(r.bottomLeft.lng,s.lng)},r.upperRight={lat:Math.max(r.upperRight.lat,s.lat),lng:Math.max(r.upperRight.lng,s.lng)},r.entryPoint=i,r.exitPoint=s,a.push(r),r={bottomLeft:{lat:s.lat,lng:s.lng},upperRight:{lat:s.lat,lng:s.lng}},i={lat:s.lat,lng:s.lng}),f.printRouteMap.maxTiles{t=t&&n.defaultValue!==e.lat&&n.defaultValue!==e.lng}),t}function bo(e){po=!1,be.showError(e),console.log(e||"An error occurs when asking the route to the provider")}function yo(){po=!1,ie.travel.editedRoute.itinerary.validateData();let t=ie.travel.editedRoute.itinerary.maneuvers.iterator;for(;!t.done;)t.value.validateData();let o=ie.travel.editedRoute.itinerary.itineraryPoints.iterator;for(;!o.done;)o.value.validateData();if(function(t){let o=t.itinerary.itineraryPoints.iterator,a=t.itinerary.maneuvers.iterator;for(o.done,a.done,a.value.distance=e.defaultValue,a.done,t.distance=e.defaultValue,t.duration=e.defaultValue;!o.done;)o.previous.distance=ke.pointsDistance(o.previous.latLng,o.value.latLng),t.distance+=o.previous.distance,a.previous.distance+=o.previous.distance,a.value.itineraryPointObjId===o.value.objId&&(t.duration+=a.previous.duration,a.value.distance=e.defaultValue,a.next&&a.value.itineraryPointObjId===a.next.itineraryPointObjId&&(a.done,a.value.distance=e.defaultValue),a.done)}(ie.travel.editedRoute),"circle"!==ie.travel.editedRoute.itinerary.transitMode){let e=ie.travel.editedRoute.wayPoints.iterator;for(;!e.done;)e.first?e.value.latLng=ie.travel.editedRoute.itinerary.itineraryPoints.first.latLng:e.last?e.value.latLng=ie.travel.editedRoute.itinerary.itineraryPoints.last.latLng:e.value.latLng=Se.getClosestLatLngDistance(ie.travel.editedRoute,e.value.latLng).latLng}let a=ie.travel.editedRoute.notes.iterator;for(;!a.done;){let e=Se.getClosestLatLngDistance(ie.travel.editedRoute,a.value.latLng);a.value.latLng=e.latLng,a.value.distance=e.distance}mo(),ie.travel.editedRoute.notes.sort((e,t)=>e.distance-t.distance),ho&&Be().zoomToRoute(ie.travel.editedRoute.objId),Kt.createProfile(ie.travel.editedRoute),we.dispatch("routeupdated",{removedRouteObjId:ie.travel.editedRoute.objId,addedRouteObjId:ie.travel.editedRoute.objId}),we.dispatch("roadbookupdate"),we.dispatch("showitinerary")}const wo=Object.seal(new class{addRoute(){let e=Q();ie.travel.routes.add(e),r.editedChanged===ie.travel.editedRoute.editionStatus?(mo(),we.dispatch("setrouteslist"),we.dispatch("roadbookupdate")):this.editRoute(e.objId)}editRoute(e){if(r.editedChanged===ie.travel.editedRoute.editionStatus)return void be.showError(L.getText("RouteEditor - Not possible to edit a route without a save or cancel"));let t=Pe.getRoute(e),o=t.itinerary.provider,a=ie.providers.get(o.toLowerCase());if(o&&""!==o&&(!a||a.providerKeyNeeded&&!je.getKey(o)))return void be.showError(L.getText("RouteEditor - Not possible to edit a route created with this provider",{provider:o}));-1!==ie.editedRouteObjId&&this.cancelEdition(),o&&""!==o&&we.dispatch("setprovider",{provider:o});let n=t.itinerary.transitMode;n&&""!==n&&we.dispatch("settransitmode",{transitMode:n}),ie.travel.editedRoute=Q(),t.editionStatus=r.editedNoChange,ie.travel.editedRoute.jsonObject=t.jsonObject,ie.editedRouteObjId=t.objId,ie.travel.editedRoute.hidden=!1,t.hidden=!1,Kt.updateProfile(ie.editedRouteObjId,ie.travel.editedRoute),mo(),we.dispatch("routeupdated",{removedRouteObjId:t.objId,addedRouteObjId:ie.travel.editedRoute.objId}),we.dispatch("roadbookupdate"),we.dispatch("showitinerary"),we.dispatch("setrouteslist")}removeRoute(e){let t=e;if(t===ie.editedRouteObjId||t===ie.travel.editedRoute.objId){if(r.editedChanged===ie.travel.editedRoute.editionStatus)return void be.showError(L.getText("TravelEditor - Cannot remove an edited route"));t=ie.editedRouteObjId,this.cancelEdition()}we.dispatch("routeupdated",{removedRouteObjId:t,addedRouteObjId:-1}),ie.travel.routes.remove(t),Kt.deleteProfile(t),mo(),we.dispatch("roadbookupdate"),we.dispatch("setrouteslist")}removeManeuver(t){(ie.travel.editedRoute.itinerary.maneuvers.previous(t,t=>e.defaultValue{mo(),fo(t)&&we.dispatch("routepropertiesupdated",{routeObjId:t.objId}),we.dispatch("roadbookupdate"),we.dispatch("setrouteslist"),we.dispatch("updateitinerary")}).catch(e=>console.log(e||"An error occurs in the route properties dialog"))}printRouteMap(e){(function(){let e=null,t=null,o=null,a=null,n=null,r=null,i=null,l=null;function s(){return Object.seal({paperWidth:parseInt(o.value),paperHeight:parseInt(a.value),borderWidth:parseInt(n.value),zoomFactor:parseInt(l.value),pageBreak:r.checked,printNotes:i.checked})}return e=le(),e.title=L.getText("PrintRouteMapDialog - Print"),e.okButtonListener=s,t=b.create("div",{id:"TravelNotes-PrintRouteMapDialog-MainDataDiv"},e.content),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Paper width")},e),o=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput"},e),o.value=f.printRouteMap.paperWidth,b.create("text",{value:L.getText("PrintRouteMapDialog - Paper width units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Paper height")},e),a=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",value:f.printRouteMap.paperHeight},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Paper height units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Border width")},e),n=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",id:"TravelNotes-PrintRouteMapDialog-BorderWidthNumberInput",value:f.printRouteMap.borderWidth},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Border width units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-ZoomFactorDataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Zoom factor")},e),l=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",value:Math.min(f.printRouteMap.zoomFactor,15),min:ie.map.getMinZoom(),max:Math.min(ie.map.getMaxZoom(),15)},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-PageBreakDataDiv"},t);r=b.create("input",{type:"checkbox",id:"TravelNotes-PrintRouteMapDialog-PageBreakInput",checked:f.printRouteMap.pageBreak},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Page break")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-PrintNotesDataDiv"},t);i=b.create("input",{type:"checkbox",id:"TravelNotes-PrintRouteMapDialog-PrintNotesInput",checked:f.printRouteMap.printNotes},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Print notes")},e)}(),e})().show().then(t=>vo().print(t,e)).catch(e=>console.log(e||"An error occurs in the route properties dialog"))}showRoute(e){Pe.getRoute(e).hidden=!1,we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e}),we.dispatch("setrouteslist")}hideRoute(e){Pe.getRoute(e).hidden=!0,we.dispatch("routeupdated",{removedRouteObjId:e,addedRouteObjId:-1}),we.dispatch("setrouteslist")}showRoutes(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden&&(e.value.hidden=!1,we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e.value.objId}));we.dispatch("setrouteslist")}hideRoutes(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden||e.value.objId===ie.editedRouteObjId||(e.value.hidden=!0,we.dispatch("routeupdated",{removedRouteObjId:e.value.objId,addedRouteObjId:-1}));we.dispatch("setrouteslist")}});function No(e,t){if(!f.wayPoint.reverseGeocoding)return;let o=it();o.getPromiseAddress(e).then(e=>{let a=o.parseResponse(e),n=a.street;""!==a.city&&(n+=" "+a.city),function(e,t){ie.travel.editedRoute.editionStatus=r.editedChanged;let o=ie.travel.editedRoute.wayPoints.getAt(t);o.name=e.name,o.address=e.address,we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}(Object.seal({name:a.name,address:n}),t)}).catch(e=>console.log(e||"An error occurs in the geoCoder"))}const To=Object.seal(new class{addWayPoint(e){ie.travel.editedRoute.editionStatus=r.editedChanged;let t=D();t.latLng=e,No(e,t.objId),ie.travel.editedRoute.wayPoints.add(t),we.dispatch("addwaypoint",{wayPoint:ie.travel.editedRoute.wayPoints.last,letter:ie.travel.editedRoute.wayPoints.length-2}),ie.travel.editedRoute.wayPoints.swap(t.objId,!0),wo.startRouting()}addWayPointOnRoute(e,t){let o=Se.getClosestLatLngDistance(ie.travel.editedRoute,e).distance;ie.travel.editedRoute.editionStatus=r.editedChanged;let a=D();a.latLng=t,No(t,a.objId),ie.travel.editedRoute.wayPoints.add(a),we.dispatch("addwaypoint",{wayPoint:ie.travel.editedRoute.wayPoints.last,letter:ie.travel.editedRoute.wayPoints.length-2});let n=ie.travel.editedRoute.wayPoints.iterator;for(;!n.done;){if(o{let t=o.parseResponse(e),a=t.street;""!==t.city&&(a+=" "+t.city),n.value=a}).catch(e=>console.log(e||"An error occurs in the geoCoder"))}return t=le(),t.title=L.getText("WayPointPropertiesDialog - Waypoint properties"),t.okButtonListener=r,o=b.create("div",{id:"TravelNotes-WayPointPropertiesDialog-DataDiv"},t.content),b.create("div",{textContent:L.getText("WayPointPropertiesDialog - Name")},o),a=b.create("input",{type:"text",value:e.name,className:"TravelNotes-WayPointPropertiesDialog-Input"},b.create("div",null,o)),function(){let t=b.create("div",null,o);b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("WayPointPropertiesDialog - Reset address"),textContent:"🔄"},t).addEventListener("click",i,!1),b.create("text",{value:L.getText("WayPointPropertiesDialog - Address")},t),n=b.create("input",{type:"text",value:e.address,className:"TravelNotes-WayPointPropertiesDialog-Input"},b.create("div",null,o))}(),t})(ie.travel.editedRoute.wayPoints.getAt(e)).show().then(()=>{we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}).catch(e=>console.log(e||"An error occurs in the waypoint properties dialog"))}});function xo(e,t){let o=e.target.objId,a=Pe.getRoute(o),n=Be();let i=ot(e,function(){let t=[{context:wo,name:L.getText("RouteContextMenu - Edit this route"),action:o===ie.travel.editedRoute.objId||r.editedChanged===ie.travel.editedRoute.editionStatus?null:wo.editRoute,param:o},{context:wo,name:L.getText("RouteContextMenu - Delete this route"),action:o===ie.travel.editedRoute.objId&&r.editedChanged===ie.travel.editedRoute.editionStatus?null:wo.removeRoute,param:o},a.hidden?{context:wo,name:L.getText("RouteContextMenu - Show this route"),action:wo.showRoute,param:o}:{context:wo,name:L.getText("RouteContextMenu - Hide this route"),action:ie.travel.editedRoute.objId===o?null:wo.hideRoute,param:o},{context:wo,name:L.getText("RouteContextMenu - Properties"),action:a.hidden?null:wo.routeProperties,param:o},{context:n,name:L.getText("RouteContextMenu - Zoom to route"),action:n.zoomToRoute,param:o},{context:Kt,name:L.getText("RouteContextMenu - View the elevation"),action:a.itinerary.hasProfile?Kt.showProfile:null,param:o}];return f.printRouteMap.isEnabled&&t.push({context:wo,name:L.getText("RouteContextMenu - Print route map"),action:wo.printRouteMap,param:o}),t=t.concat([{context:wo,name:L.getText("RouteContextMenu - Save this route in a GPX file"),action:0",className:"TravelNotes-Note-Bullet"}),opacity:f.note.grip.opacity,draggable:!ie.travel.readOnly});o.objId=t.objId;let a=window.L.divIcon({iconSize:[t.iconWidth,t.iconHeight],iconAnchor:[t.iconWidth/2,t.iconHeight/2],popupAnchor:[0,-t.iconHeight/2],html:t.iconContent,className:"TravelNotes-AllNotes "});let n=window.L.marker(t.iconLatLng,{zIndexOffset:100,icon:a,draggable:!ie.travel.readOnly});n.objId=t.objId,n.bindPopup(e=>Pt.getNoteTextHTML("TravelNotes-",Pe.getNoteAndRoute(e.objId))),0!==t.tooltipContent.length&&(n.bindTooltip(e=>Pe.getNoteAndRoute(e.objId).note.tooltipContent),n.getTooltip().options.offset[0]=t.iconWidth/2);let r=window.L.polyline([t.latLng,t.iconLatLng],f.note.polyline);r.objId=t.objId;let i=window.L.layerGroup([n,r,o]);return i.markerId=window.L.Util.stamp(n),i.polylineId=window.L.Util.stamp(r),i.bulletId=window.L.Util.stamp(o),jo(t.objId,i),f.note.haveBackground&&document.querySelectorAll(".TravelNotes-MapNote,.TravelNotes-SvgIcon").forEach(e=>e.classList.add("TravelNotes-MapNote-Background")),Object.freeze({marker:n,polyline:r,bullet:o})}function Do(e){e.dashArray>=f.route.dashChoices.length&&(e.dashArray=0);let t=f.route.dashChoices[e.dashArray].iDashArray;if(t){let o="",a=0;for(a=0;a{let t=Pe.getRoute(e.objId);return Pt.getRouteHeaderHTML("TravelNotes-UI-",t)}),window.L.DomEvent.on(n,"click",e=>e.target.openPopup(e.latlng));let i=t.notes.iterator;for(;!i.done;)Po(i.value.objId);return t}addNote(e){return Po(e)}getDashArray(e){return Do(e)}zoomTo(e,t){if(t){let e=[];t.forEach(t=>e=e.concat(t)),ie.map.fitBounds(Se.getLatLngBounds(e))}else ie.map.setView(e,f.itineraryPointZoom)}setLayer(e,t){let o=null;o="wmts"===e.service.toLowerCase()?window.L.tileLayer(t):window.L.tileLayer.wms(t,e.wmsOptions),Lo&&ie.map.removeLayer(Lo),ie.map.addLayer(o),Lo=o,ie.travel.readOnly||(ie.map.getZoom()<(e.minZoom||0)&&ie.map.setZoom(e.minZoom||0),ie.map.setMinZoom(e.minZoom||0),ie.map.getZoom()>(e.maxZoom||18)&&ie.map.setZoom(e.maxZoom||18),ie.map.setMaxZoom(e.maxZoom||18),e.bounds?(ie.map.getBounds().intersects(e.bounds)&&!ie.map.getBounds().contains(e.bounds)||(ie.map.setMaxBounds(null),ie.map.fitBounds(e.bounds),ie.map.setZoom(e.minZoom||0)),ie.map.setMaxBounds(e.bounds)):ie.map.setMaxBounds(null)),ie.map.fire("baselayerchange",o)}onGeolocationStatusChanged(e){t.active!==e&&Ao&&(ie.map.removeLayer(Ao),Ao=null)}onGeolocationPositionChanged(e){let t=f.geoLocation.zoomToPosition;Ao&&(ie.map.removeLayer(Ao),t=!1),Ao=window.L.circleMarker(window.L.latLng(e.coords.latitude,e.coords.longitude),{radius:f.geoLocation.radius,color:f.geoLocation.color}).bindTooltip(A.formatLatLng([e.coords.latitude,e.coords.longitude])).addTo(ie.map),t&&ie.map.setView(window.L.latLng(e.coords.latitude,e.coords.longitude),f.geoLocation.zoomFactor)}});let Ro=null,Mo=null,So=1;function Oo(){Ro&&(window.L.DomEvent.off(Ro),ie.map.removeLayer(Ro),Ro=null)}function Uo(){window.L.DomEvent.off(Ro,"mouseout",Oo)}function ko(e){e.latlng.lat=Mo[0],e.latlng.lng=Mo[1],e.target.objId=ie.travel.editedRoute.objId,xo(e).show()}function Bo(e){To.addWayPointOnRoute(Mo,[e.target.getLatLng().lat,e.target.getLatLng().lng]),Ro&&(window.L.DomEvent.off(Ro,"dragstart",Uo),window.L.DomEvent.off(Ro,"dragend",Bo),window.L.DomEvent.off(Ro,"contextmenu",ko),ie.map.removeLayer(Ro),Ro=null)}function Ho(e){let t=Pe.getNoteAndRoute(e.target.objId),o=t.note,a=t.route,n=ie.mapObjects.get(e.target.objId);if(null===a)o.latLng=[e.target.getLatLng().lat,e.target.getLatLng().lng],we.dispatch("updatetravelnotes");else{let t=Se.getClosestLatLngDistance(a,[e.target.getLatLng().lat,e.target.getLatLng().lng]);o.latLng=t.latLng,o.distance=t.distance,a.notes.sort((e,t)=>e.distance-t.distance),n.getLayer(n.bulletId).setLatLng(t.latLng),we.dispatch("updateitinerary")}n.getLayer(n.polylineId).setLatLngs([o.latLng,o.iconLatLng]),we.dispatch("roadbookupdate")}function zo(e){let t=Pe.getNoteAndRoute(e.target.objId).note,o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([[e.latlng.lat,e.latlng.lng],t.iconLatLng])}function Vo(e){e.originalEvent.target.style.opacity=f.note.grip.moveOpacity}function Fo(e){e.originalEvent.target.style.opacity=f.note.grip.opacity}function Wo(e){Io(e).show()}function Ko(e){let t=Pe.getNoteAndRoute(e.target.objId).note;t.iconLatLng=[e.target.getLatLng().lat,e.target.getLatLng().lng];let o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([t.latLng,t.iconLatLng])}function Jo(e){let t=Pe.getNoteAndRoute(e.target.objId).note,o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([t.latLng,[e.latlng.lat,e.latlng.lng]])}function Zo(e){let t=Pe.getRoute(e.target.objId);if(r.notEdited!==t.editionStatus)if(Mo=[e.latlng.lat,e.latlng.lng],Ro)Ro.setLatLng(e.latlng);else{let t='
?
';Ro=window.L.marker(e.latlng,{icon:window.L.divIcon({iconSize:[40,40],iconAnchor:[20,40],html:t,className:"TravelNotes-WayPointStyle"}),draggable:!0}),(-1===f.route.showDragTooltip||So<=f.route.showDragTooltip)&&(So++,Ro.bindTooltip(L.getText("MapEditor - Drag and drop to add a waypoint")),Ro.getTooltip().options.offset=[0,0]),Ro.addTo(ie.map),window.L.DomEvent.on(Ro,"mouseout",Oo),window.L.DomEvent.on(Ro,"dragstart",Uo),window.L.DomEvent.on(Ro,"dragend",Bo),window.L.DomEvent.on(Ro,"contextmenu",ko)}}function Xo(e){xo(e).show()}function Go(e){(function(e){let t=e.target.objId,o=ot(e,function(){let e=ie.travel.editedRoute.wayPoints.first.objId!==t&&ie.travel.editedRoute.wayPoints.last.objId!==t;return[{context:To,name:L.getText("WayPointContextMenu - Delete this waypoint"),action:e?To.removeWayPoint:null,param:t},{context:To,name:L.getText("WayPointContextMenu - Modify properties"),action:To.wayPointProperties,param:t}]}());return Object.seal(o)})(e).show()}function qo(e){ie.travel.editedRoute.wayPoints.getAt(e.target.objId).latLng=[e.target.getLatLng().lat,e.target.getLatLng().lng],To.wayPointDragEnd(e.target.objId)}function Yo(e,t){t.objId=e,t.addTo(ie.map),ie.mapObjects.set(e,t)}function Qo(e){let t=ie.mapObjects.get(e);t&&(window.L.DomEvent.off(t),ie.map.removeLayer(t),ie.mapObjects.delete(e))}function _o(e,t){if(n.defaultValue===e.lat&&n.defaultValue===e.lng)return;let o='
'+t+"
",a=window.L.marker(e.latLng,{icon:window.L.divIcon({iconSize:[40,40],iconAnchor:[20,40],html:o,className:"TravelNotes-WayPointStyle"}),draggable:!0});a.bindTooltip(e=>Pe.getWayPoint(e.objId).fullName),a.getTooltip().options.offset=[20,-20],window.L.DomEvent.on(a,"contextmenu",Go),a.objId=e.objId,Yo(e.objId,a),window.L.DomEvent.on(a,"dragend",qo)}const $o=Object.seal(new class{updateRoute(e,t){-1!==e&&function(e){let t=Pe.getRoute(e);Qo(t.objId);let o=t.notes.iterator;for(;!o.done;)Qo(o.value.objId);let a=t.wayPoints.iterator;for(;!a.done;)Qo(a.value.objId)}(e),-1!==t&&function(e){let t=Co.addRoute(e),o=ie.mapObjects.get(e);if(!ie.travel.readOnly){window.L.DomEvent.on(o,"contextmenu",Xo),window.L.DomEvent.on(o,"mouseover",Zo);let e=t.notes.iterator;for(;!e.done;){let t=ie.mapObjects.get(e.value.objId),o=t.getLayer(t.markerId),a=t.getLayer(t.bulletId);window.L.DomEvent.on(a,"dragend",Ho),window.L.DomEvent.on(a,"drag",zo),window.L.DomEvent.on(a,"mouseenter",Vo),window.L.DomEvent.on(a,"mouseleave",Fo),window.L.DomEvent.on(o,"contextmenu",Wo),window.L.DomEvent.on(o,"dragend",Ko),window.L.DomEvent.on(o,"drag",Jo)}}if(!ie.travel.readOnly&&r.notEdited!==t.editionStatus){let e=ie.travel.editedRoute.wayPoints.iterator;for(;!e.done;)_o(e.value,e.first?"A":e.last?"B":e.index)}}(t)}updateRouteProperties(e){let t=ie.mapObjects.get(e),o=Pe.getRoute(e);t.setStyle({color:o.color,weight:o.width,dashArray:Co.getDashArray(o)})}updateNote(e,t){let o=!1;if(-1!==e){let t=ie.mapObjects.get(e);t&&(o=t.getLayer(t.markerId).isPopupOpen()),Qo(e)}-1!==t&&function(e,t){let o=Co.addNote(e);t&&o.marker.openPopup(),ie.travel.readOnly||(window.L.DomEvent.on(o.bullet,"dragend",Ho),window.L.DomEvent.on(o.bullet,"drag",zo),window.L.DomEvent.on(o.bullet,"mouseenter",Vo),window.L.DomEvent.on(o.bullet,"mouseleave",Fo),window.L.DomEvent.on(o.marker,"contextmenu",Wo),window.L.DomEvent.on(o.marker,"dragend",Ko),window.L.DomEvent.on(o.marker,"drag",Jo))}(t,o)}removeObject(e){Qo(e)}removeAllObjects(){ie.mapObjects.forEach(e=>{window.L.DomEvent.off(e),ie.map.removeLayer(e)}),ie.mapObjects.clear()}addWayPoint(e,t){_o(e,t)}addItineraryPointMarker(e,t){Yo(e,window.L.circleMarker(t,f.itineraryPointMarker))}addSearchPointMarker(e,t,o){let a=!1;if(o){let e=[];o.forEach(t=>{e=e.concat(t)});let t=Se.getLatLngBounds(e),n=ie.map.getBounds();a=(t.getEast()-t.getWest())/(n.getEast()-n.getWest())>.01&&(t.getNorth()-t.getSouth())/(n.getNorth()-n.getSouth())>.01}Yo(e,a?window.L.polyline(o,f.searchPointPolyline):window.L.circleMarker(t,f.searchPointMarker))}addRectangle(e,t,o){Yo(e,window.L.rectangle(t,o))}setLayer(e){let t=e.url;if(e.providerKeyNeeded){let o=je.getKey(e.providerName.toLowerCase());if(!o)return;t=t.replace("{providerKey}",o)}Co.setLayer(e,t)}});function ea(e){return Math.floor(Math.abs(e)+.5)*(0<=e?1:-1)}const ta=Object.freeze(new class{encode(e,t){if(!e.length)return"";let o=t.length,a=Array.from(t,e=>Math.pow(10,e));function n(e,t,o){let a=ea(e*o),n=ea(t*o),r=a-n;r<<=1,0>a-n&&(r=~r);let i="";for(;32<=r;)i+=String.fromCharCode(63+(32|31&r)),r>>=5;return i+=String.fromCharCode(r+63),i}let r="";for(let t=0;tMath.pow(10,e)),i=new Array(o).fill(0);function l(){let t=null,o=0,n=0;do{t=e.charCodeAt(a++)-63,n|=(31&t)<>1):n>>1}for(;a{a.push([e.lat,e.lng,e.distance,e.elev,e.objId])}),o.values=ta.encode(a,[n.fixed,n.fixed,2,2,0]),e.itinerary.itineraryPoints=o}function o(t){let o=[];if(t.itinerary.itineraryPoints.values)ta.decode(t.itinerary.itineraryPoints.values,[n.fixed,n.fixed,2,2,0]).forEach(r=>{let i={lat:n.defaultValue,lng:n.defaultValue,distance:e.defaultValue,elev:a.defaultValue,objId:-1};[i.lat,i.lng,i.distance,i.elev,i.objId]=r,i.objType=t.itinerary.itineraryPoints.objType,o.push(i)});else{t.itinerary.itineraryPoints.latLngs=ta.decode(t.itinerary.itineraryPoints.latLngs,[n.fixed,n.fixed]);let e=0;t.itinerary.itineraryPoints.latLngs.forEach(n=>{let r={};r.lat=n[0],r.lng=n[1],r.distance=t.itinerary.itineraryPoints.distances[e],t.itinerary.itineraryPoints.elevs?r.elev=t.itinerary.itineraryPoints.elevs[e]:r.elev=a.defaultValue,r.objId=t.itinerary.itineraryPoints.objIds[e],r.objType=t.itinerary.itineraryPoints.objType,o.push(r),e++})}t.itinerary.itineraryPoints=o}function i(e){e.routes.forEach(o),e.editedRoute&&o(e.editedRoute)}return Object.seal(new class{decompress(e){i(e),ie.travel.jsonObject=e,ie.editedRouteObjId=-1,ie.travel.routes.forEach(e=>{r.notEdited!==e.editionStatus&&(ie.editedRouteObjId=e.objId)})}decompressMerge(e){i(e);let t=te();t.jsonObject=e;let o=t.routes.iterator;for(;!o.done;)ie.travel.routes.add(o.value);let a=t.notes.iterator;for(;!a.done;)ie.travel.notes.add(a.value)}compress(){let e=ie.travel.jsonObject;return e.routes.forEach(t),t(e.editedRoute),e}})}const aa=Object.seal(new class{routeDropped(e,t,o){ie.travel.routes.moveTo(e,t,o),wo.chainRoutes(),we.dispatch("setrouteslist"),we.dispatch("roadbookupdate")}saveTravel(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden=!1;let t=oa().compress(ie.travel);A.saveFile(t.name+".trv",JSON.stringify(t))}clear(){window.confirm(L.getText("TravelEditor - This page ask to close; data are perhaps not saved."))&&(Kt.deleteAllProfiles(),we.dispatch("removeallobjects"),ie.travel.editedRoute=Q(),ie.editedRouteObjId=-1,ie.travel=te(),ie.travel.routes.add(Q()),we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate"),we.dispatch("travelnameupdated"),f.travelEditor.startupRouteEdition&&wo.editRoute(ie.travel.routes.first.objId))}});function na(){return Object.seal(new class{openDistantFile(e){oa().decompress(e),ie.travel.readOnly=!0,this.display()}display(){document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name);let e=ie.travel.routes.iterator;for(;!e.done;)r.notEdited===e.value.editionStatus&&we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e.value.objId});-1!==ie.editedRouteObjId&&we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:ie.travel.editedRoute.objId});let t=ie.travel.notes.iterator;for(;!t.done;)we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:t.value.objId});Be().zoomToTravel()}})}function ra(){function e(e,t){let o=new FileReader;o.onload=function(){let e={};try{e=JSON.parse(o.result)}catch(e){console.log(e||"An error occurs when reading the file")}t?oa().decompressMerge(e):(Kt.deleteAllProfiles(),oa().decompress(e)),function(){if(we.dispatch("removeallobjects"),na().display(),go.setLayer(ie.travel.layerName),we.dispatch("setrouteslist"),-1!==ie.editedRouteObjId){let e=ie.travel.editedRoute.itinerary.provider;if(e&&""!==e&&!ie.providers.get(e.toLowerCase()))be.showError(L.getText("FileLoader - Not possible to select as provider",{provider:e}));else{let t=ie.travel.editedRoute.itinerary.transitMode;we.dispatch("setprovider",{provider:e}),t&&""!==t&&we.dispatch("settransitmode",{transitMode:t})}}wo.chainRoutes(),we.dispatch("travelnameupdated"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}()},o.readAsText(e.target.files[0])}return Object.seal(new class{openLocalFile(t){e(t,!1)}mergeLocalFile(t){e(t,!0)}})}let ia=null,la=null,sa=null,da=0,ca=null,ua=null,ga=null,va=null;function ha(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}function pa(e){ie.travel.name=p.sanitizeToJsString(e.target.value),document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name),we.dispatch("roadbookupdate")}function ma(e){e.stopPropagation(),aa.clear(),document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name)}function fa(e){e.stopPropagation(),""===ie.travel.name?be.showError(L.getText("TravelUI - Gives a name to the travel")):aa.saveTravel()}function ba(e){e.stopPropagation(),ra().openLocalFile(e)}function ya(){window.confirm(L.getText("TravelEditor - This page ask to close; data are perhaps not saved."))&&ua.click()}function wa(e){e.stopPropagation(),ra().mergeLocalFile(e)}function Na(){-1===ie.editedRouteObjId?ga.click():be.showError(L.getText("TravelUI - Not possible to merge a travel when a route is edited"))}function Ta(){ca=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},sa),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Cancel travel"),textContent:"❌"},ca).addEventListener("click",ma,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Save travel"),textContent:"💾"},ca).addEventListener("click",fa,!1),ua=b.create("input",{className:"TravelNotes-TravelUI-OpenFileInput",type:"file",accept:".trv"},ca),ua.addEventListener("change",ba,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Open travel"),textContent:"📂"},ca).addEventListener("click",ya,!1),ga=b.create("input",{className:"TravelNotes-TravelUI-OpenFileInput",type:"file",accept:".trv,.map"},ca),ga.addEventListener("change",wa,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Import travel"),textContent:"🌏"},ca).addEventListener("click",Na,!1),b.create("text",{value:"📋"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:"TravelNotesRoadbook.html?lng="+f.language+"&page="+ie.UUID,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Open travel roadbook")},ca)))}function xa(e){e.stopPropagation(),ia.classList.toggle("TravelNotes-TravelUI-HiddenRouteList");let t=ia.classList.contains("TravelNotes-TravelUI-HiddenRouteList");e.target.textContent=t?"▶":"▼",e.target.title=t?L.getText("TravelUI - Show"):L.getText("TravelUI - Hide")}function Ia(e){e.stopPropagation(),wo.addRoute()}function La(){va=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},sa),b.create("div",{textContent:"▼",className:"TravelNotes-TravelUI-RouteList-ExpandButton"},va).addEventListener("click",xa,!1),b.create("span",{textContent:L.getText("TravelUI - Travel routes")},va),b.create("div",{className:"TravelNotes-UI-Button TravelNotes-UI-FlexRow-RightButton",title:L.getText("TravelUI - Add a route"),textContent:"+"},va).addEventListener("click",Ia,!1)}function Aa(e){e.stopPropagation();try{e.dataTransfer.setData("Text",e.target.objId),e.dataTransfer.dropEffect="move",e.dataTransfer.routeObjId=e.target.objId}catch(e){console.log(e)}da=e.target.objId}function Ea(e){e.preventDefault()}function ja(e){e.preventDefault();let t=e.target;for(;!t.objId;)t=t.parentElement;let o=t.getBoundingClientRect();aa.routeDropped(da,t.objId,e.clientY-o.top{e.paneId===Ca?e.classList.add("TravelNotes-DataPaneUI-ActivePaneButton"):e.classList.remove("TravelNotes-DataPaneUI-ActivePaneButton")})}function Ua(e){Oa(e.target.paneId)}function ka(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}const Ba=Object.freeze(new class{createUI(e){if(Ma)return;let t=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e);Sa=b.create("div",{id:"TravelNotes-PanesManagerUI-PaneControlsDiv"},e),Ma=b.create("div",{id:"TravelNotes-PanesManagerUI-PaneDataDiv"},e),Ma.addEventListener("wheel",ka,!1),Ra.forEach(e=>{b.create("div",{textContent:e.getButtonText(),className:"TravelNotes-DataPaneUI-PaneButton",paneId:e.getId()},t).addEventListener("click",Ua,!1),e.setPaneDivs(Ma,Sa)})}addPane(e){Ra.set(e.getId(),e)}showPane(e){Oa(e)}updatePane(e){e===Ca&&Oa(e)}});let Ha=null,za=!1;const Va=["bike","pedestrian","car","train","line","circle"];let Fa={bike:null,pedestrian:null,car:null,train:null,line:null,circle:null},Wa=null;const Ka={bike:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEIChYTLGSDtAAAA65JREFUSMftVl1sk1UYfs53vnZft4/R/W+hHaUrbshcQch06VCGWd\t\tBohmNRCRiXKXphZCOacCEYBeOFXHhDlHDjQDEBdKIx9sL4Q8bqtEPqLAOE/YDrGPspa2m7bt/Xr8eLr3WddFuJ88b4Xp285z1P3v\t\tOe533eQ9xud3FxMcdxmMMURWGMUUoJIUjNFEUZHBwkPp8vovBnHVfB7gghACNIsgEQQgjAwBjiAfFIQqqrLBpNhKeU/to9Vr/fic\t\tWzbw6iqrKEQ/Ks/pkxAODwr9n/0HcHLWq5uoqlXMqMTjR+nj2bKWPlcrH9t4komyHRmgLt3pcq0gQNGOr2dSJZMyycteNaSJKjlk\t\tIh0dk9KjnO3QhORtrsV+YmXjzreW576qfxlrrlJUXCrUkWlBgDlmgJI+Tn7pvHfvTOeYzEodncTfP8xoIu93h7XzDR+Vx1vj8kVx\t\toEp2fqrlvGWihsseoFnggCv2JZRql+1pNMK+xL10T5yiyeI6/UFuzbalydq12YIbWW9CMt1u2bDeVm8VCzdZUl+1j7yEPr8wmBlh\t\tJTJg+AEgBI1+L4Gw9OSez8ldsv1JvfbbonKUNi1U6jZNuW0p3vuVRG1K8P6wUc2G4++OlAU03Rh98PV63OKvNNXR8K2oxCqTn747\t\taLgVCkfSBkv+Bvqs5985kV+08OzGTNEoi192lTm71XdTSs1RMl2trhzczUBWXm6vG2PGHcue2+xzeZHNfDWx81vX308tcX/BbTEp\t\tX0rR3jOdnpswqSKPAZomC/FABQadA1PlX+uWsCAM8xAK4Rqb7WvMlmebZhzQ5bXl6u+MC9WS9uzM/R6z7ac796fHJa+XtB/sKOSJ\t\tEqg9DpmXJ6wnWvd8RGRjS273TdqFxnvnh5+BPH2Nqy7N/7/F/5ZABArAiiQNUFpRwATlEUhmnVdeiz/saGWa/xWJkoyxF1vefo1Y\t\twNrR8c7wbQ+kX/q42rEiN3bS76Y+i2uo5GGQCeUhplkuryhJROp+fIbmuXa9h9LfTkw0WimNZ8uGeGrwxDo2EAPV75bOfg4eaK8b\t\tFAKCQtM+i9t8JvneiPQ0cBkEAgcO6XkZrXvksYe3j5kYK8HN2ZrtEz/ZPza1CNRczP0p4+PyEpM3Swv7Nug62UBwBCZ7USw/vfjq\t\tQobz/0BpNoHs8voHzzik9SsUtZVFNH+Y8NMMqRxQWllAdA/H6/RqPr7bvJGBYcgSz28wIhJK49SR7WUlIoy2HidruNRiOldBGzVr\t\t+TfwLXzWMKJ+iQhAAAAABJRU5ErkJggg==",pedestrian:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICholT2tZIQAAAyxJREFUSMetll1IFFEUx/93PtZ13cykJNvWNDXEMkgoyYKICCJISK\t\tkIIYjqpU98kB77loogjCzKCvoQkqigh8ioKKS01NS2grDwY7ddLa3dNVt37r1ze5haLXVzV8/TmTN3fufMYeacP3E4HCkpKZIkYX\t\twmhCCEhD/DOXc6ncTr9TKu1D5vgxj7LCEQYvglAYQQnOuSTAiMTAQGgpDlSzNUlSmyLLe0fl1/6BUmzx6exNIl6RLwV7kygUomzB\t\tYA8G+LuQD9kyoxRrqxf9HFvQtIVMmUMPeqDuevWZUNgDJ917n3kaLDfRhZmUmGE2dRo6g6HLr6bmtQY+5u78kr7ycZ3fCmlzGdUj\t\t01yTyZ6MOb0q6dLYyzmObYE29VFp3Ykjk56HXZU0p2rrDE/m6xJda0c1v+yjTLeIgyCYveujHb0+MfCLBQxOsPHi1dNh40F2HRVm\t\tvMz4AW1IbQZyrrF8637S+wT7QhVovKGedMD0U8Xwau3mzYsyM/XpUmhDaZVKHrus5DEVUmu8+/8/T4LpbmGpFjxelvb6zLSjRFhl\t\tZUhTGu86GqzSYJwL6Dz3Lm21ZnWgEkxMfYbdP8QT0ydMWluoorjRrlnAtKdQCKTAC8cAXKymsvn1p752Desry0/h+D+ZnWyNCVtX\t\t3XG7yDQdbU3F52+nEIDaDq1bfj5c/efei1z060JSdUnS86snluxH+jRjkIqMYAmIZNkXNPejpc/dOmxgLo6PpeVLDQqkiRoRnjBM\t\tTbTwEoyl+Dtbgw25i0U+PNJQce5SSbx0SPOpB1ziVJcvdp/xyYZVEW56YaftJ0K+Woc/4cEz3qXqSUg8DVpwEAGXq/HJv53v0Wd7\t\tfvZVNXp/PbjAQ14l4HBhkAt4/+2bS/rabtR/GJlt6+gYZmV3tnb3XT92jQhBBPvyYEMGKJCcBsVijTo1lg92rarHGqLkRQ46NpD/\t\tHZ4/d0+6NBX3jaYzhOt3f4FDSs8XXXg+fuetdgNOiQzdtwe2Rwe7nj/+NJlqJXHqM+KcsKAOLz+VQ19uOnbiEwht4gMGSZGJJp4S\t\t0jfSalAeJwOOx2uyzLYfTjCAU4Ljn5C1w5SWBHSm1MAAAAAElFTkSuQmCC",car:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICh4hLGpYPAAAAlZJREFUSMfdlk1oE0EUx/+zszEx3UhD0zZYkn5ksfWjlVgrVk1RQV\t\tR6EMFaK9qjggdBRO1NvSiIB8/iyQ/akxepSKteRPxoETXamkQtJAbbBN0ky0boZne8FIu23exqKuhjDgMz78ef/3u8GRIOh/1+P8\t\tdxKF1ompZIJEgmkylo/KPHMTBL6QQzCXM2hGxpF222Ak8pffkqvff88xKqHrqE9g0BDrAo10wwAOCwaPFvovmFDo6Gak4f3+x0gj\t\tHoOjQNTIfOoOvQ9dn93aF3p268tobu3R9sqC+XJACgdGbxPCgFIbPXHPYWa+gKWtbS7M3nIe669VVTfjm1aRUC53AtwYObHXW1rr\t\tZK90haMuv1mZ4VgsBFYlNzuQBU+kUiybiajMYmeR69e0QLZdwW8gMYGU0ZF+rp6GcArcHlZg3Z5K1avaqKMUwkpGNbawzQ2VxB09\t\tDU6Gl0lUVkpQj6xA7xwtntdjsjBBfPdZhpMnc5fXL7wO5DA8+mFCND1gddDgcA8nFCVtUi0OlpRKKyrsPtphuby015PTYuB7r67w\t\t3HjdH3H8abDva/eStZKGOt33n9ZNu6tZXG6NagZ6AvVF+3zEJfCwI93BMs6nJ1tbN730rTM+R3JyxjxVQfuRztu5IaG+4UBORyWL\t\tNz0AD34k6nx4NCAYHQ4Cc1XQStMEVRlR8SEmrSjOT4fNf++lBNpfR8npNlzThZlmG3Y6H2nx8tdl8zo6uh6+p/94AtMppypLRQSn\t\tkAJJvN2mxL33+YZOynR+9PQgx4VfUbCYfDPp+PUlry7+R3HyvZuSYHFFYAAAAASUVORK5CYII=",train:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiI23EqkBAAABQpJREFUSMetVm1QVFUYfs+55+4u+zEsshK0iuy6iuAHbaSwJhkZNp\t\tWjaWn2oQ2Zk1lmpjMllmNqDYZjM+Y0TdkIg8WYHwU6KjqUIzl8KGhihcgCu8Auu3uBXXfZT+89/cBAYFex8f1173nOfea973ne5z\t\t2oqrouNUWHMYb7CUqBAkWAEAqD8jxvMplRd08vpWzlhRtA74scwe0PRjwgNMegIyRERCypq3cs/qwWHlyc+RIyZ2oxAASCXniwQQ\t\tEAMAB4ff6wG6Yr4YMcVaoi+D/IEUIEAFhCwsL5G6elTEnc8A6RSgnP05vuQOP1juXbrnjpqM4cA4BIxIbFnv/0mnbpyQlLyo6VXU\t\tEIHfn1kiYpLjlmtIkTACAMGwleZZAumK8bo5SFQoGxseyhXxqezkyYYnFVXPPYb5F7UyMU/gfzX43f+P5z5L9yvZWrHoACgUDlhb\t\t9e23LRHkJ3o4Zw6LIZUevW5HCcc++354/+Zp6YIDPoVZN1YxPiY5TRoujo6NSUpIL3uNw9RgExkalHhAwLX3ySTQizeUd5YU0fgL\t\tTJSE8ZHQCOYTvTov1/3pRFpKZ0eCMeLzBoNeofiioKa/p2r4yfnjpeLGb9gWCfx2/nvOZOd7vFIxETsZg0Gb2Tgu4bfkWErKlwxz\t\tt/umD2E3OmHSg+t3Zfc+m2tIULDHc/LquVe2TJ0ZFFx/367n/JfAguFz2TMVOXv+dETb2t6cjCe/ICQEKC6utNqeF1jQADwJsGeW\t\tnh0lDo1surD6VNjdtX8GJS0sOjlPCz8/UaqRAx68na2IMl52+6AysWa2ama1mWHX1bKxTyzbmTwioEAYBCRlSxyrlZ08tOVAGAz+\t\tezO1wWa4+5vcfY2t3U6q66xjl9vEpGdGq5LmmMNIpixDMYE4IZBndYXBHF12J2tpgFrudsZY3l8311tZxoRHJSALB74O/rPFwfrk\t\tI5+BlgeRjUOBlQXnl1t8kVctNeAAAQ3a/VeUCiZjydvHyQemAEbV2rX7QgzcE5u2xOk7nncoOl+LTN5B/SafvXaV56YZYgCEU/VW\t\t840N6/uH6efOVyvcXqXLOjFvjhBaEA8H1Jg9frmZ2p06fp0vV4ySLY+lGoo8PeZHRUXzR9d9xiCTJFx0xPZiXHKOUK2aDt3DD7lU\t\tolBUSGDkrkdrsv1TuyPzw7sDRvAlm1LPFR/WTdRDXDMAN+1GnhzO2cg+tze0L9Zi+RiAiDCRNSKhVJibElR+q2HOoCgDO7MgwZE8\t\tN4SIXplre4dT3GbSabIPCPpSePVcWIxWKtRq3VqCPVus1k3f6z5baaB3U9wvqquujyXc2m9t6sOTNaWjr3Hyj/p7E1GIw4ybju3m\t\t27KgJDp8/d7Pztb9r+qLXtyMuZmqotOXzhqdxTr2SrtBOUcSoFYXiEkVgkkkhoe4fr3b3GPgGPylQHoviS7+Sy0oPb01e9Me/xTN\t\t3HO899dcbZD2XEwabVU+dm6bPnRs3OnFJxrjG/sPlORTF5eXkWq7eo3BiJ3SegHyusgt0cJcGJCezvF7kgMADQ2QeHKx2nTzTIWb\t\tfb7ZPLRbNSotoabbYAWZEzbvy4MQQAGIzu2RE7Szko5QAAYIi31HP09d1NdyxIAIBhCAAgl8vFslHNxi5KASGgdPhkGHmto/T2Fk\t\toppVSgFCggBBhjQMBgPEkXHwr50NWrDYmJ4zFmYMilDwECBEBppBsM9KcSNniebzOZ/gWOPRAUHy2iQwAAAABJRU5ErkJggg==",line:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiINbUFNIAAAAfZJREFUSMdjvHz5spycHBMTEwP1wN+/fx8/fsz44cOHP39ZDh+9zf\t\tCfJO2MDFANGAxGRhtLFVbWPyzMzMwXLr4ObDxFRVfv6mKwNFNmYmAg0bnEgP8MDAwMZAZxoqXgomJd/GrIMdpCkq270SMi1Iz6Rs\t\t9sdxIW4l2x+hSVjV5UrKunI3fpyqO43svUNDrfVSwi1Oztu8/plfsIKmYiKYhrS50ZGBiau/eeeP6LmkbDg3ji7lfEqGeiehCTZj\t\tRJQYzTaMb/bBQGMU6j/zOia57f60ZSEBMbIBsbTTXUpI6dvE18EMMBCx65mgBpT3e9Fy8/FLccxZUcE4OUv//4XTD3DglGW0iyle\t\tY7MTAwVLXsRgtiiIl21srKSuKsLMyPn7wlzej5vW58vJyz5h+ef/w9VhN///l7997LQ0fvzl93l4QAgQdx+tTrAVrcUQFqxoZysr\t\tIiaCbiTzAsuIL40+fvb958ubvaX0lRnIGB4fv3X9dvPD1x+iFBE3EaDQliVhZmVl5OP2/D799/nTl3/+jJ+1hDkzSjixK1+Xg5v3\t\t//dfX6U/JMxGl03/yrl669atnwlPIKEt3oE89/naCGueRXu4PAaGYmRuoayszMwsDAwPjx40dWVs47d1/8/8/ASCUrVJQlfv/+zn\t\tj58mVZWVlmZmaqNycB+D3rTYmxQpEAAAAASUVORK5CYII=",circle:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiEaxb+bJAAAAqNJREFUSMdjvHz5spycHBMTEwP1wN+/fx8/fsz44cOHP39ZDh+9zf\t\tCfJO2MDFANGAxGRhtLFVbWPyzMzMwXLr4ObDxFRVfv6mKwNFNmYmAg0bnEgP8MDAwMTAw0Ayz4pS0k2RKDlO2slUVFeIWFeBkYGN\t\t6++/z6zedDR+/OX3f3xPNfZBo9M1szIsTk48dvBw7fOnvp5cTdrxgYGPJdxYz1xD1dtWIjzBevOJk+9TrJRu/vszUyVJg6+1DVso\t\tfI4hN3v2LY/Yqh93JNgHRpvpOOloR19n6sJjDhMldZSSw+ex2aucigZcNT96iVstJCR6c6Emv0zGxNI0OFvKodG659xR8TJ57/Cs\t\tvcrKMlMzNbk7DRFpJssRHm3RP3ETQXbnr3xH2xEeYWkmwEjE4MUn7z9nPLhqfEJ7KWDU/fvP2cFaVOwGg7a+UDh2+RmoS3775mai\t\txPwGhREd6zl16SavSJcy+kJAUJGC0sxAtJvySB+cff8/FyEpX4qALQjf70+Xu+qxippiRaCn76/J2A0c+evzfWEyfVaAsjiWfP3x\t\tMw+vTZhw62aqQabWetfPrsQwJGT1t2U0SYty1KnnhzawKk5WVFpi27ScDoE89/LV5xMjvVDjN34Sp1S/OdFq84iVnAYkkh6VOvX7\t\tn2ZNV0X4KmW0iyrZrue+XaE6xFK/bEZ529//HTdzuXhdcESOMJh53Lwh8/fYerUMVZXltn75+ZrVlV7JoY/X7PgVsnzr2Yf/w9JJ\t\t1ZGEm4OKhJSgiSWRVAQmb+urtZUep21soRISbzeDkhCf/Z8/dHT9ybtuwm+RUYJFZP9F5mYLhMhdxI5YzOzMRIXUOZmVkYGBgYP3\t\t78yMrKeefui///GRipZIWKssTv398ZL1++LCsry8zMTPXmJADJwQv2CCSQygAAAABJRU5ErkJggg=="};function Ja(e){ie.routing.transitMode=e;let t=document.querySelector(".TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton");t&&t.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"),document.getElementById("TravelNotes-ProvidersToolbarUI-"+e+"ImgButton").classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton")}function Za(e){e.stopPropagation(),Ja(e.target.transitMode),wo.startRouting()}function Xa(e){ie.routing.provider=e;let t=document.querySelector(".TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton");t&&t.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"),document.getElementById("TravelNotes-ProvidersToolbarUI-"+e+"ImgButton").classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton");let o=ie.providers.get(e.toLowerCase());if(Va.forEach(e=>{o.transitModes[e]?Fa[e].classList.remove("TravelNotes-ProvidersToolbarUI-InactiveImgButton"):Fa[e].classList.add("TravelNotes-ProvidersToolbarUI-InactiveImgButton")}),!o.transitModes[ie.routing.transitMode]){let e=null;Va.forEach(t=>{o.transitModes[t]&&(e=e||t)}),Ja(e)}}function Ga(e){e.stopPropagation(),Xa(e.target.provider),wo.startRouting()}function qa(e){if(0===e.providerKey)return;let t=b.create("img",{src:e.icon,id:"TravelNotes-ProvidersToolbarUI-"+e.name+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:e.name,provider:e.name},Ha);if(t.addEventListener("click",Ga,!1),!za){t.classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"),ie.routing.provider=t.provider,za=!0;let o=null;Va.forEach(t=>{e.transitModes[t]&&(o=o||t)}),Fa[o].classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"),ie.routing.transitMode=o,Va.forEach(t=>{e.transitModes[t]||Fa[t].classList.add("TravelNotes-ProvidersToolbarUI-InactiveImgButton")})}}const Ya=Object.freeze(new class{createUI(e){Wa=e,Ha=b.create("div",{className:"TravelNotes-UI-FlexRowDiv TravelNotes-ProvidersToolbarUI-ImgButtonsDiv"},e),Va.forEach(e=>{Fa[e]=b.create("img",{src:Ka[e],id:"TravelNotes-ProvidersToolbarUI-"+e+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:L.getText("ProvidersToolbarUI - "+e),transitMode:e},Ha),Fa[e].addEventListener("click",Za,!1)}),ie.providers&&(za=!1,ie.providers.forEach(qa))}set provider(e){Xa(e)}set transitMode(e){Ja(e)}providersAdded(){Wa.removeChild(Ha),this.createUI(Wa)}});let Qa="geolocation"in navigator?t.inactive:t.disabled,_a=null;function $a(e){we.dispatch("geolocationpositionchanged",{position:e})}function en(){t.active===Qa&&(Qa=t.inactive),we.dispatch("geolocationstatuschanged",{status:Qa}),navigator.geolocation.clearWatch(_a),_a=null}function tn(e){1===e.code&&(Qa=t.refusedByUser),en()}const on=Object.seal(new class{get status(){return Qa}switch(){switch(Qa){case t.inactive:Qa=t.active,we.dispatch("geolocationstatuschanged",{status:Qa}),navigator.geolocation.getCurrentPosition($a,tn,f.geoLocation.options),_a=navigator.geolocation.watchPosition($a,tn,f.geoLocation.options);break;case t.active:en()}return Qa}});let an=null,nn=null,rn=null,ln=null,sn=!1;function dn(){nn&&(clearTimeout(nn),nn=null),ln.classList.remove("TravelNotes-UI-MainDiv-Minimize"),ln.classList.add("TravelNotes-UI-MainDiv-Maximize")}function cn(){ln.classList.remove("TravelNotes-UI-MainDiv-Maximize"),ln.classList.add("TravelNotes-UI-MainDiv-Minimize")}function un(){nn=setTimeout(cn,f.travelEditor.timeout)}function gn(e){e.stopPropagation(),je.setKeysFromDialog()}function vn(e){e.stopPropagation(),on.switch()}function hn(e){sn?(e.target.textContent="📌",ln.addEventListener("mouseenter",dn,!1),ln.addEventListener("mouseleave",un,!1)):(e.target.textContent="❌",ln.removeEventListener("mouseenter",dn,!1),ln.removeEventListener("mouseleave",un,!1)),sn=!sn}const pn=Object.freeze(new class{createUI(e){ln=e,rn=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e),b.create("text",{value:"🏠"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:window.location.origin,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Home"},rn))),b.create("text",{value:"?"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:"https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages/TravelNotesGuides",target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Help"},rn))),b.create("text",{value:"@"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:f.travelNotesToolbarUI.contactMail.url||window.location.origin,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Contact"},rn))),f.APIKeys.showDialogButton&&b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelNotesToolbarUI - API keys"),textContent:"🔑"},rn).addEventListener("click",gn,!1),t.disabled{e.classList.toggle("TravelNotes-UI-Route-Notes-Row-Hidden")})}function h(e){t=e.target.checked,document.querySelectorAll(".TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Maneuvers-Row-Hidden")})}return Object.freeze(new class{remove(){!function(){document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row, .TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.removeEventListener("contextmenu",c,!1),e.removeEventListener("mouseenter",u,!1),e.removeEventListener("mouseleave",g,!1)});let e=document.querySelector(".TravelNotes-UI-Route-ManeuversAndNotes");e&&a.removeChild(e)}(),i&&(d&&(d.removeEventListener("click",h,!1),i.removeChild(d),d=null),s&&(s.removeEventListener("click",v,!1),i.removeChild(s),s=null),r.removeChild(i),i=null),l&&(r.removeChild(l),l=null)}add(){-1!==ie.editedRouteObjId&&(i=b.create("div",null,r),b.create("text",{value:L.getText("ItineraryPaneUI - Show notes")},i),s=b.create("input",{type:"checkbox",id:"TravelNotes-ItineraryPane-ShowNotesInput",checked:e},i),s.addEventListener("click",v,!1),b.create("text",{value:L.getText("ItineraryPaneUI - Show maneuvers")},i),d=b.create("input",{type:"checkbox",id:"TravelNotes-ItineraryPane-ShowManeuversInput",checked:t},i),d.addEventListener("click",h,!1),l=Pt.getRouteHeaderHTML("TravelNotes-UI-",ie.travel.editedRoute),r.appendChild(l),a.appendChild(Pt.getEditedRouteManeuversAndNotesHTML("TravelNotes-UI-")),document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row, .TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.addEventListener("contextmenu",c,!1),e.addEventListener("mouseenter",u,!1),e.addEventListener("mouseleave",g,!1)}),e||document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Notes-Row-Hidden")}),t||document.querySelectorAll(".TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Maneuvers-Row-Hidden")}))}getId(){return o.itineraryPane}getButtonText(){return L.getText("PanesManagerUI - Itinerary")}setPaneDivs(e,t){a=e,r=t}})}let fn=-1,bn=-1,yn=!1;let wn=null,Nn=null,Tn=null,xn=[];class In{constructor(e,t){this.name=p.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)}}function Ln(){-1===bn?bn=N():we.dispatch("removeobject",{objId:bn});let e=ie.map.getCenter();Nn=ie.map.getBounds();let t=Se.getSquareBoundingBox([e.lat,e.lng],5e3);Nn.getSouthWest().lat=Math.max(Nn.getSouthWest().lat,t.getSouthWest().lat),Nn.getSouthWest().lng=Math.max(Nn.getSouthWest().lng,t.getSouthWest().lng),Nn.getNorthEast().lat=Math.min(Nn.getNorthEast().lat,t.getNorthEast().lat),Nn.getNorthEast().lng=Math.min(Nn.getNorthEast().lng,t.getNorthEast().lng),we.dispatch("addrectangle",{objId:bn,bounds:Nn,properties:f.nextSearchLimit})}function An(e){e.isSelected&&0{o.filterTagsArray.forEach(a=>{(function(e,t){let o=!0;for(const[a,n]of Object.entries(t))o=o&&e.tags[a]&&(e.tags[a]===n||"*"===n);return o})(e,a)&&(e.description=o.name,t.set(e.id,e))})})}function jn(e){let t=new Map,o=new Map,a=new Map,r=new Map;function i(e){e.geometry=[[]],e.lat=n.defaultValue,e.lon=n.defaultValue;let t=0;e.nodes.forEach(a=>{let n=o.get(a);e.geometry[0].push([n.lat,n.lon]),e.lat+=n.lat,e.lon+=n.lon,t++}),0!==t&&(e.lat/=t,e.lon/=t)}e.forEach(e=>{switch(e.type){case"node":o.set(e.id,e);break;case"way":a.set(e.id,e);break;case"relation":r.set(e.id,e)}e.tags&&En(e,t)}),t.forEach(e=>{switch(e.type){case"way":i(e);break;case"relation":!function(e){e.geometry=[[]],e.lat=n.defaultValue,e.lon=n.defaultValue;let t=0;e.members.forEach(o=>{if("way"===o.type){let n=a.get(o.ref);i(n),e.geometry.push(n.geometry[0]),e.lat+=n.lat,e.lon+=n.lon,t++}}),0!==t&&(e.lat/=t,e.lon/=t)}(e)}}),ie.searchData=Array.from(t.values()).sort((e,t)=>e.description>t.description?1:e.description{"fulfilled"===e.status?t=t.concat(e.value.elements):console.log(e.reason)}),jn(t)}const Dn=Object.seal(new class{get dictionary(){return Tn}search(){yn||(yn=!0,xn=[],An(Tn),Promise.allSettled(function(){let e=[];wn=Nn;let t={node:new Map,way:new Map,relation:new Map};xn.forEach(e=>{e.elementTypes.forEach(o=>{e.filterTagsArray.forEach(e=>{t[o].set(e,e)})})});let o={node:"",way:"",relation:""},a="("+Nn.getSouthWest().lat.toFixed(n.fixed)+","+Nn.getSouthWest().lng.toFixed(n.fixed)+","+Nn.getNorthEast().lat.toFixed(n.fixed)+","+Nn.getNorthEast().lng.toFixed(n.fixed)+")";for(const[e,n]of Object.entries(t))n.forEach(t=>{let[n,r]=Object.entries(t)[0];o[e]+=e+"["+n+("*"===r?"":"="+r)+"]"+a+";"});for(const[t,a]of Object.entries(o))if(""!==a){let o=f.overpassApi.url+"?data=[out:json][timeout:40];("+a+");"+("node"===t?"":"(._;>;);")+"out;";e.push(y.getJsonPromise(o))}return e}()).then(Pn))}show(){ie.map.on("zoom",Ln),ie.map.on("move",Ln),Ln(),wn&&(-1===fn?fn=N():we.dispatch("removeobject",{objId:fn}),we.dispatch("addrectangle",{objId:fn,bounds:[[wn.getSouthWest().lat,wn.getSouthWest().lng],[wn.getNorthEast().lat,wn.getNorthEast().lng]],properties:f.previousSearchLimit}))}hide(){let e=we;ie.map.off("zoom",Ln),ie.map.off("move",Ln),-1!==bn&&(e.dispatch("removeobject",{objId:bn}),bn=-1),-1!==fn&&(e.dispatch("removeobject",{objId:fn}),fn=-1)}parseDictionary(e){Tn=new In("All",!0);let t=[Tn.items],o=null,a=null;e.split(/\r\n|\r|\n/).forEach(e=>{""!==e&&function(e){let n=e.split(";");for(;""===n[n.length-1];)n.pop();let r=0,i=null;n.forEach(e=>{if(""!==e)if(-1===e.indexOf("="))a=new In(e),t[r].push(a),t[r+1]=a.items,o=a.filterTagsArray;else{let t=e.split("=");"element"===t[0]?a.elementTypes=[t[1]]:(i=i||{},i[t[0]]=t[1])}r++}),i&&o.push(i)}(e)})}});function Cn(){let e=null,t=null,a=null,r=null,i=null,l=-1,d=0;function c(t){t.stopPropagation(),t.preventDefault();let o=t.target;for(;!o.osmElement;)o=o.parentNode;t.latlng={lat:n.defaultValue,lng:n.defaultValue},t.fromUI=!0,t.originalEvent={clientX:t.clientX,clientY:t.clientY,latLng:[o.osmElement.lat,o.osmElement.lon],osmElement:o.osmElement,geometry:o.osmElement.geometry},function(e,t){let o=Be(),a=ot(e,function(){let t=e.originalEvent.latLng;return[{context:To,name:L.getText("MapContextMenu - Select this point as start point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.first.lat?To.setStartPoint:null,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as way point"),action:-1===ie.editedRouteObjId?null:To.addWayPoint,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as end point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.last.lat?To.setEndPoint:null,param:t},{context:zt,name:L.getText("OsmSearchContextMenu - Create a route note with this result"),action:zt.newSearchNote,param:{osmElement:e.originalEvent.osmElement,isTravelNote:!1}},{context:zt,name:L.getText("OsmSearchContextMenu - Create a travel note with this result"),action:zt.newSearchNote,param:{osmElement:e.originalEvent.osmElement,isTravelNote:!0}},{context:zt,name:zt.osmSearchNoteDialog?L.getText("OsmSearchContextMenu - Hide note dialog"):L.getText("OsmSearchContextMenu - Show note dialog"),action:zt.changeOsmSearchNoteDialog},{context:o,name:L.getText("OsmSearchContextMenu - Zoom to this result"),action:o.zoomToPoi,param:{latLng:e.originalEvent.latLng,geometry:e.originalEvent.geometry}}]}(),t);return Object.seal(a)}(t,e).show()}function u(e){e.stopPropagation(),l=e.target.objId,we.dispatch("addsearchpointmarker",{objId:e.target.objId,latLng:[e.target.osmElement.lat,e.target.osmElement.lon],geometry:e.target.osmElement.geometry})}function g(e){e.stopPropagation(),we.dispatch("removeobject",{objId:e.target.objId})}function v(){document.querySelectorAll(".TravelNotes-OsmSearchPaneUI-SearchResult").forEach(t=>{t.removeEventListener("contextmenu",c,!1),t.removeEventListener("mouseenter",u,!1),t.removeEventListener("mouseleave",g,!1),e.removeChild(t)})}function h(e){d++;let t=b.create("div",{className:"TravelNotes-SearchPaneUI-SearchItem TravelNotes-SearchPaneUI-SearchItemMargin"+d,dictItem:e},i);if(!e.isRoot){b.create("input",{type:"checkbox",checked:e.isSelected},t).addEventListener("change",(function(e){!function e(t,o){t.isSelected=o,t.items.forEach(t=>{e(t,o)})}(e.target.parentNode.dictItem,e.target.checked),i.textContent="",h(Dn.dictionary)}),!1)}if(0===e.filterTagsArray.length){b.create("div",{className:"TravelNotes-UI-Button TravelNotes-OsmSearchPaneUI-TreeArrow",textContent:e.isExpanded?"▼":"▶"},t).addEventListener("click",(function(e){e.target.parentNode.dictItem.isExpanded=!e.target.parentNode.dictItem.isExpanded,i.textContent="",h(Dn.dictionary)}),!1)}b.create("text",{value:e.name},t),e.isExpanded&&e.items.forEach(h),d--}function m(){v(),Dn.dictionary.isExpanded=!1,i.textContent="",h(Dn.dictionary),r=b.create("div",{className:"TravelNotes-WaitAnimation"},t),b.create("div",{className:"TravelNotes-WaitAnimationBullet"},r),Dn.search()}function f(e){e.items.forEach(f),e.isSelected=!1}function y(){f(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function w(e){e.items.forEach(w),e.isExpanded=!0}function T(){w(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function x(e){e.items.forEach(x),e.isRoot||(e.isExpanded=!1)}function I(){x(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function A(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}function E(e,t){t&&b.create("div",{textContent:t},e)}function j(t){let o=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Row",osmElement:t,objId:N()},e),a="";a=t.tags.rcn_ref?"
"+t.tags.rcn_ref+"
":bt.getIconDataFromName(t.description)||"";let n=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-IconCell"},o);p.sanitizeToHtmlElement(a,n);let r=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Cell"},o);E(r,t.description),E(r,t.tags.name),E(r,t.tags.rcn_ref),E(r,function(e){let t=(e.tags["addr:street"]?(e.tags["addr:housenumber"]?e.tags["addr:housenumber"]+" ":"")+e.tags["addr:street"]+" ":"")+(e.tags["addr:city"]?(e.tags["addr:postcode"]?e.tags["addr:postcode"]+" ":"")+e.tags["addr:city"]:"");return""===t?null:t}(t)),t.tags.phone&&E(r,"☎️ : "+t.tags.phone),t.tags.email&&b.create("a",{href:"mailto:"+t.tags.email,textContent:t.tags.email},b.create("div",{textContent:"📧 : "},r)),t.tags.website&&b.create("a",{href:t.tags.website,target:"_blank",textContent:t.tags.website},b.create("div",null,r)),o.title="";for(const[e,a]of Object.entries(t.tags))o.title+=e+"="+a+"\n";o.addEventListener("contextmenu",c,!1),o.addEventListener("mouseenter",u,!1),o.addEventListener("mouseleave",g,!1)}return Object.freeze(new class{remove(){Dn.hide(),v(),i&&(t.removeChild(i),i=null),a&&t.removeChild(a),r&&(t.removeChild(r),r=null),we.dispatch("removeobject",{objId:l})}add(){Dn.show(),a=b.create("div",null,t),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Search OpenStreetMap"),textContent:"🔎"},a).addEventListener("click",m,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Expand tree"),textContent:"▼"},a).addEventListener("click",T,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Collapse tree"),textContent:"▶"},a).addEventListener("click",I,!1),b.create("div",{id:"TravelNotes-OsmSearchPaneUI-ClearAllButton",className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Clear tree"),textContent:"❌"},a).addEventListener("click",y,!1),i=b.create("div",{id:"TravelNotes-OsmSearchPaneUI-SearchTree"},t),i.addEventListener("wheel",A,!1),Dn.dictionary.name="",h(Dn.dictionary),ie.searchData.forEach(j)}getId(){return o.searchPane}getButtonText(){return L.getText("PanesManagerUI - Search")}setPaneDivs(o,a){e=o,t=a}})}let Rn=null;const Mn=Object.freeze(new class{createUI(e){Rn||(Rn=b.create("div",{id:"TravelNotes-UI-MainDiv"},e),b.create("div",{id:"TravelNotes-UI-MainDiv-Title",textContent:"Travel & Notes"},Rn),pn.createUI(Rn),Da.createUI(Rn),Ba.addPane(mn()),Ba.addPane(function(){let e=0,t=null,a=null;function r(t){t.stopPropagation();try{t.dataTransfer.setData("Text",t.target.dataObjId),t.dataTransfer.dropEffect="move"}catch(e){console.log(e)}e=t.target.noteObjId}function i(e){e.preventDefault()}function l(t){t.preventDefault();let o=t.target;for(;!o.noteObjId;)o=o.parentElement;let a=o.getBoundingClientRect();zt.travelNoteDropped(e,o.noteObjId,t.clientY-a.top{e.removeEventListener("contextmenu",s,!1),e.removeEventListener("dragstart",r,!1)}),t.removeChild(a)),a=null}add(){a=Pt.getTravelNotesHTML("TravelNotes-UI-"),a.addEventListener("drop",l,!1),a.addEventListener("dragover",i,!1),t.appendChild(a),a.childNodes.forEach(e=>{e.draggable=!0,e.addEventListener("contextmenu",s,!1),e.addEventListener("dragstart",r,!1),e.classList.add("TravelNotes-UI-MoveCursor")})}getId(){return o.travelNotesPane}getButtonText(){return L.getText("PanesManagerUI - Travel notes")}setPaneDivs(e){t=e}})}()),Ba.addPane(Cn()),Ba.createUI(Rn),Ya.createUI(Rn),Rn.addEventListener("travelnameupdated",()=>Da.setTravelName(),!1),Rn.addEventListener("setrouteslist",()=>Da.setRoutesList(),!1),Rn.addEventListener("showitinerary",()=>Ba.showPane(o.itineraryPane),!1),Rn.addEventListener("updateitinerary",()=>Ba.updatePane(o.itineraryPane),!1),Rn.addEventListener("showtravelnotes",()=>Ba.showPane(o.travelNotesPane),!1),Rn.addEventListener("updatetravelnotes",()=>Ba.updatePane(o.travelNotesPane),!1),Rn.addEventListener("showsearch",()=>Ba.showPane(o.searchPane),!1),Rn.addEventListener("updatesearch",()=>Ba.updatePane(o.searchPane),!1),Rn.addEventListener("providersadded",()=>Ya.providersAdded(),!1),Rn.addEventListener("setprovider",e=>{e.data&&e.data.provider&&(Ya.provider=e.data.provider)},!1),Rn.addEventListener("settransitmode",e=>{e.data&&e.data.provider&&(Ya.transitMode=e.data.transitMode)},!1),document.addEventListener("geolocationstatuschanged",e=>{pn.geoLocationStatusChanged(e.data.status)},!1),Rn.addEventListener("click",e=>{e.target.id&&"TravelNotes-UI-MainDiv"===e.target.id&&(e.stopPropagation(),e.preventDefault())},!1),Rn.addEventListener("dblclick",e=>{e.stopPropagation(),e.preventDefault()},!1),Rn.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault()},!1),Rn.addEventListener("wheel",e=>{e.stopPropagation(),e.preventDefault()},!1))}});function Sn(){let e=le();e.title=L.getText("AboutDialog - About Travel & Notes");p.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 : 2.1.0.

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

',e.content),e.show().then().catch(e=>console.log(e||"An error occurs in the dialog"))}let On=null;const Un=Object.freeze(new class{getOpenPromise(){return new Promise((function(e,t){if(On)return void e();let o=window.indexedDB.open("TravelNotesDb",1);o.onerror=function(){On=null,t(new Error("Not possible to open the db"))},o.onsuccess=function(t){On=t.target.result,e()},o.onupgradeneeded=function(e){On=e.target.result,On.createObjectStore("Travels",{keyPath:"UUID"})}}))}getReadPromise(e){return new Promise((function(t,o){if(!On)return void o(new Error("Database not opened"));let a=On.transaction(["Travels"],"readonly");a.onerror=function(){o(new Error("Transaction error"))},a.objectStore("Travels").get(e).onsuccess=function(e){t(e.target.result?e.target.result.data:null)}}))}getWritePromise(e,t){return new Promise((function(o,a){if(!On)return void a(new Error("Database not opened"));let n=null;try{n=On.transaction(["Travels"],"readwrite")}catch(e){return void a(e)}n.onerror=function(){a(new Error("Transaction error"))},n.objectStore("Travels").put({UUID:e,data:t}).onsuccess=function(){o()}}))}closeDb(e){if(!On)return;if(!e)return On.close(),void(On=null);let t=On.transaction(["Travels"],"readwrite");t.onerror=function(){};let o=t.objectStore("Travels").delete(e);o.onerror=function(){On.close(),On=null},o.onsuccess=function(){On.close(),On=null}}});let kn=null,Bn=null,Hn=null;function zn(){kn.textContent=Bn+" - Zoom : "+Hn}function Vn(e){Bn=A.formatLat(e.latlng.lat)+" - "+A.formatLng(e.latlng.lng),zn()}function Fn(){Hn=ie.map.getZoom(),zn()}const Wn=Object.freeze(new class{createUI(){Hn=ie.map.getZoom();let e=ie.map.getCenter();Bn=A.formatLat(e.lat)+" - "+A.formatLng(e.lng),kn=b.create("span",null,b.create("div",{id:"TravelNotes-MouseUI"},document.querySelector("body"))),ie.map.on("mousemove",Vn),ie.map.on("zoomend",Fn)}});let Kn=!1;function Jn(){document.addEventListener("routeupdated",e=>{e.data&&$o.updateRoute(e.data.removedRouteObjId,e.data.addedRouteObjId)},!1),document.addEventListener("routepropertiesupdated",e=>{e.data&&$o.updateRouteProperties(e.data.routeObjId)},!1),document.addEventListener("noteupdated",e=>{e.data&&$o.updateNote(e.data.removedNoteObjId,e.data.addedNoteObjId)},!1),document.addEventListener("removeobject",e=>{e.data&&$o.removeObject(e.data.objId)},!1),document.addEventListener("removeallobjects",()=>$o.removeAllObjects(),!1),document.addEventListener("zoomto",e=>{e.data&&Co.zoomTo(e.data.latLng,e.data.geometry)},!1),document.addEventListener("additinerarypointmarker",e=>{e.data&&$o.addItineraryPointMarker(e.data.objId,e.data.latLng)},!1),document.addEventListener("addsearchpointmarker",e=>{e.data&&$o.addSearchPointMarker(e.data.objId,e.data.latLng,e.data.geometry)},!1),document.addEventListener("addrectangle",e=>{e.data&&$o.addRectangle(e.data.objId,e.data.bounds,e.data.properties)},!1),document.addEventListener("addwaypoint",e=>{e.data&&$o.addWayPoint(e.data.wayPoint,e.data.letter)},!1),document.addEventListener("layerchange",e=>{e.data&&$o.setLayer(e.data.layer)}),document.addEventListener("geolocationpositionchanged",e=>{e.data&&Co.onGeolocationPositionChanged(e.data.position)},!1),document.addEventListener("geolocationstatuschanged",e=>{e.data&&Co.onGeolocationStatusChanged(e.data.status)},!1),document.addEventListener("roadbookupdate",()=>{A.storageAvailable("localStorage")&&Un.getOpenPromise().then(()=>{Un.getWritePromise(ie.UUID,Pt.getTravelHTML("TravelNotes-Roadbook-").outerHTML)}).then(()=>localStorage.setItem(ie.UUID,Date.now())).catch(e=>console.log(e||"An error occurs when writing the content"))},!1),document.addEventListener("profileclosed",e=>{e.data&&Kt.onProfileClosed(e.data.objId)},!1)}function Zn(e){ie.travel.readOnly||function(e){let t=[e.latlng.lat,e.latlng.lng],o=Be(),a=ot(e,[{context:To,name:L.getText("MapContextMenu - Select this point as start point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.first.lat?To.setStartPoint:null,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as way point"),action:-1===ie.editedRouteObjId?null:To.addWayPoint,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as end point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.last.lat?To.setEndPoint:null,param:t},{context:wo,name:L.getText("MapContextMenu - Add a route"),action:wo.addRoute},{context:wo,name:L.getText("MapContextMenu - Hide all routes"),action:wo.hideRoutes},{context:wo,name:L.getText("MapContextMenu - Show all routes"),action:wo.showRoutes},{context:zt,name:L.getText("MapContextMenu - New travel note"),action:zt.newTravelNote,param:t},{context:zt,name:L.getText("MapContextMenu - Hide all notes"),action:zt.hideNotes},{context:zt,name:L.getText("MapContextMenu - Show all notes"),action:zt.showNotes},{context:o,name:L.getText("MapContextMenu - Zoom to travel"),action:o.zoomToTravel},{context:null,name:L.getText("MapContextMenu - About Travel & Notes"),action:Sn}]);return Object.seal(a)} +function Vt(){let e=N(),t=null,o=null,a=null,n=null,r=null,l=null,s=null,c=null;function u(e){let o=t.getBoundingClientRect(),a=(e.clientX-o.x-i.margin/(2*i.margin+i.width)*o.width)/(i.width/(2*i.margin+i.width)*o.width)*c.distance;return Se.getLatLngElevAtDist(c,a)}function g(e){e.preventDefault(),e.stopPropagation();let t=u(e);t&&(e.routeObjId=c.objId,e.latlng={lat:t.latLng[0],lng:t.latLng[1]},e.originalEvent={clientX:e.clientX,clientY:e.clientY},function(e){let t=Be(),o=ot(e,[{context:zt,name:L.getText("ProfileContextMenu - Add a note to the route at this point"),action:zt.newRouteNote,param:{routeObjId:e.routeObjId,lat:e.latlng.lat,lng:e.latlng.lng}},{context:t,name:L.getText("ProfileContextMenu - Zoom to this point"),action:t.zoomToLatLng,param:[e.latlng.lat,e.latlng.lng]}]);return Object.seal(o)}(e).show())}function v(){we.dispatch("removeobject",{objId:e})}function h(l){let s=t.getBoundingClientRect(),g=u(l);if(g){const u=3;we.dispatch("removeobject",{objId:e}),we.dispatch("additinerarypointmarker",{objId:e,latLng:g.latLng}),o&&(t.removeChild(o),t.removeChild(r),t.removeChild(a),t.removeChild(n));let v=(2*i.margin+i.width)*(l.clientX-s.x)/s.width,h=i.margin+i.height;o=document.createElementNS(d,"polyline"),o.setAttributeNS(null,"points",String(v)+","+i.margin+" "+v+","+h),o.setAttributeNS(null,"class","TravelNotes-SvgProfile-markerPolyline"),t.appendChild(o);let p=g.routeDistance>c.distance/2?"end":"start",m=g.routeDistance>c.distance/2?-i.xDeltaText:i.xDeltaText;r=document.createElementNS(d,"text"),r.appendChild(document.createTextNode(A.formatDistance(g.routeDistance))),r.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),r.setAttributeNS(null,"x",v+m),r.setAttributeNS(null,"y",i.margin+i.yDeltaText),r.setAttributeNS(null,"text-anchor",p),t.appendChild(r),a=document.createElementNS(d,"text"),a.appendChild(document.createTextNode("Alt. "+g.elev.toFixed(0)+" m.")),a.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),a.setAttributeNS(null,"x",v+m),a.setAttributeNS(null,"y",i.margin+2*i.yDeltaText),a.setAttributeNS(null,"text-anchor",p),t.appendChild(a),n=document.createElementNS(d,"text"),n.appendChild(document.createTextNode("Pente "+g.ascent.toFixed(0)+" % ")),n.setAttributeNS(null,"class","TravelNotes-SvgProfile-elevText"),n.setAttributeNS(null,"x",v+m),n.setAttributeNS(null,"y",i.margin+i.yDeltaText*u),n.setAttributeNS(null,"text-anchor",p),t.appendChild(n)}}function p(){t&&(t.removeEventListener("contextmenu",g,!1),t.removeEventListener("mousemove",h,!1),t.removeEventListener("mouseleave",v,!1),we.dispatch("removeobject",{objId:e}),l.content.removeChild(s),l.content.removeChild(t)),t=null,o=null,n=null,r=null,a=null,s=null}return l=He(),l.createWindow(),l.onClose=function(){p(),we.dispatch("profileclosed",{objId:c.objId})},l.update=function(e){p(),c=e,t=yt().createSvg(e),l.header.textContent=L.getText("ProfileWindow - Profile {name}",c),l.content.appendChild(t),t.addEventListener("contextmenu",g,!1),t.addEventListener("mousemove",h,!1),t.addEventListener("mouseleave",v,!1),s=b.create("div",{className:"TravelNotes-ProfileWindow-Ascent",textContent:L.getText("ProfileWindow - Ascent: {ascent} m. - Descent: {descent} m. - Distance: {distance}",{ascent:c.itinerary.ascent.toFixed(0),descent:c.itinerary.descent.toFixed(0),distance:A.formatDistance(c.distance)})}),l.content.appendChild(s)},Object.seal(l)}let Ft=new Map,Wt=yt();const Kt=Object.seal(new class{createProfile(e){let t=Ft.get(e.objId);if(e.itinerary.hasProfile){f.route.elev.smooth&&Wt.smooth(e),e.itinerary.ascent=0,e.itinerary.descent=0;let o=e.itinerary.itineraryPoints.first.elev;e.itinerary.itineraryPoints.forEach(t=>{let a=t.elev-o;0>a?e.itinerary.descent-=a:e.itinerary.ascent+=a,o=t.elev}),t&&t.update(e)}else t&&t.close()}updateProfile(e,t){let o=Ft.get(e);o&&(Ft.delete(e),t&&t.itinerary.hasProfile?(o.update(t),Ft.set(t.objId,o)):o.close())}deleteProfile(e){let t=Ft.get(e);t&&t.close()}deleteAllProfiles(){Ft.forEach(e=>e.close())}showProfile(e){let t=Ft.get(e);t||(t=Vt());let o=Pe.getRoute(e);t.update(o),Ft.set(e,t)}onProfileClosed(e){Ft.delete(e)}});const Jt=Object.seal(new class{createUI(){b.create("div",{id:"TravelNotes-AttributionsUI"},document.querySelector("body")),this.attributions=""}set attributions(e){let t='© Leaflet | © OpenStreetMap contributors '+e+'| © Travel & Notes',o=document.getElementById("TravelNotes-AttributionsUI");for(;o.firstChild;)o.removeChild(o.firstChild);p.sanitizeToHtmlElement(t,o)}});class Zt{constructor(e){if(!e.name||"string"!=typeof e.name)throw new Error("invalid name for layer");if(this.name=p.sanitizeToJsString(e.name),!e.service||"wms"!==e.service&&"wmts"!==e.service)throw new Error("invalid service for layer "+this.name);if(this.service=e.service,!e.url||"string"!=typeof e.url)throw new Error("invalid url for layer "+this.name);if(this.url=e.url,"wms"===this.service){if(!(e.wmsOptions&&e.wmsOptions.layers&&"string"==typeof e.wmsOptions.layers&&e.wmsOptions.format&&"string"==typeof e.wmsOptions.format&&e.wmsOptions.transparent&&"boolean"==typeof e.wmsOptions.transparent))throw new Error("invalid wmsOptions for layer "+this.name);this.wmsOptions=e.wmsOptions,this.wmsOptions.layers=p.sanitizeToJsString(this.wmsOptions.layers),this.wmsOptions.format=p.sanitizeToJsString(this.wmsOptions.format)}try{e.bounds&&"number"==typeof e.bounds[0][0]&&"number"==typeof e.bounds[0][1]&&"number"==typeof e.bounds[1][0]&&"number"==typeof e.bounds[1][1]&&(this.bounds=e.bounds)}catch(e){throw new Error("invalid bounds for layer "+this.name)}if(e.minZoom&&"number"==typeof e.minZoom&&(this.minZoom=e.minZoom),e.maxZoom&&"number"==typeof e.maxZoom&&(this.maxZoom=e.maxZoom),!(e.toolbar&&e.toolbar.text&&"string"==typeof e.toolbar.text&&e.toolbar.color&&"string"==typeof e.toolbar.color&&e.toolbar.backgroundColor&&"string"==typeof e.toolbar.backgroundColor))throw new Error("invalid toolbar for layer "+this.name);if(this.toolbar=e.toolbar,this.toolbar.text=p.sanitizeToJsString(this.toolbar.text),this.toolbar.color=p.sanitizeToColor(this.toolbar.color)||"#000000",this.toolbar.backgroundColor=p.sanitizeToColor(this.toolbar.backgroundColor)||"#ffffff",!e.providerName||"string"!=typeof e.providerName)throw new Error("invalid providerName for layer "+this.name);if(this.providerName=p.sanitizeToJsString(e.providerName),"boolean"!=typeof e.providerKeyNeeded)throw new Error("invalid providerKeyNeeded for layer "+this.name);if(this.providerKeyNeeded=e.providerKeyNeeded,""===e.attribution)this.attribution="";else{if(!e.attribution||"string"!=typeof e.attribution)throw new Error("invalid attribution for layer "+this.name);this.attribution=p.sanitizeToHtmlString(e.attribution).htmlString}if(e.getCapabilitiesUrl&&"string"==typeof e.getCapabilitiesUrl&&(this.getCapabilitiesUrl=p.sanitizeToUrl(e.getCapabilitiesUrl).url,""===this.getCapabilitiesUrl))throw new Error("invalid getCapabilitiesUrl for layer "+this.name)}}function Xt(e){return Object.freeze(new Zt(e))}let Gt=[Xt({service:"wmts",url:"https://{s}.tile.osm.org/{z}/{x}/{y}.png",name:"OSM - Color",toolbar:{text:"OSM",color:"#ff0000",backgroundColor:"#ffffff"},providerName:"OSM",providerKeyNeeded:!1,attribution:""})],qt=null,Yt=null,Qt=null,_t=0,$t=0,eo=0,to=0;function oo(e){e.target.style.color=e.target.layer.toolbar.backgroundColor,e.target.style["background-color"]=e.target.layer.toolbar.color}function ao(e){e.target.style.color=e.target.layer.toolbar.color,e.target.style["background-color"]=e.target.layer.toolbar.backgroundColor}function no(e){e.target.classList.add("TravelNotes-LayersToolbarUI-LinkButton-Enter"),e.target.classList.remove("TravelNotes-LayersToolbarUI-LinkButton-Leave")}function ro(e){we.dispatch("layerchange",{layer:e.target.layer}),Jt.attributions=e.target.layer.attribution,ie.travel.layerName=e.target.layer.name}function io(e){e.target.classList.add("TravelNotes-LayersToolbarUI-LinkButton-Leave"),e.target.classList.remove("TravelNotes-LayersToolbarUI-LinkButton-Enter")}function lo(e){e.deltaY&&(_t-=e.deltaY*s[e.deltaMode],_t=_t>to?to:_t,_t=_tfunction(e){if(e.providerKeyNeeded&&!je.getKey(e.providerName.toLowerCase()))return;let t=b.create("div",{type:"layer",className:"TravelNotes-LayersToolbarUI-Button",title:e.name,layer:e,textContent:e.toolbar.text,style:"color:"+e.toolbar.color+";background-color:"+e.toolbar.backgroundColor},Qt);t.addEventListener("mouseenter",oo,!1),t.addEventListener("mouseleave",ao,!1),t.addEventListener("click",ro,!1),$t=t.clientHeight,eo+=$t}(e)),f.layersToolbarUI.theDevil&&f.layersToolbarUI.theDevil.addButton&&function(e,t,o){let a=b.create("div",{type:"link",className:"TravelNotes-LayersToolbarUI-Button TravelNotes-LayersToolbarUI-LinkButton-Leave"},Qt);b.create("a",{href:e,title:t,textContent:o,target:"_blank"},a),a.addEventListener("mouseenter",no,!1),a.addEventListener("mouseleave",io,!1),eo+=a.clientHeight}("https://www.google.com/maps/@"+ie.map.getCenter().lat+","+ie.map.getCenter().lng+","+ie.map.getZoom()+"z","Reminder! The devil will know everything about you","👿"),to+=$t,_t=to,Qt.style.marginTop=String(_t)+"px",Qt.addEventListener("wheel",lo,!1)}const go=Object.freeze(new class{createUI(){Yt=b.create("div",{id:"TravelNotes-LayersToolbarUI"},document.querySelector("body")),b.create("div",{id:"TravelNotes-LayersToolbarUI-Header",textContent:L.getText("LayersToolbarUI - Layers")},Yt),Yt.addEventListener("mouseenter",uo,!1),Yt.addEventListener("mouseleave",co,!1),we.dispatch("layerchange",{layer:Gt[0]}),Jt.attributions=Gt[0].attribution}getLayer(e){let t=Gt.find(t=>t.name===e)||Gt[0];if(t.providerKeyNeeded){je.getKey(t.providerName.toLowerCase())||(t=Gt[0])}return t}setLayer(e){let t=Gt.find(t=>t.name===e)||Gt[0];if(t.providerKeyNeeded){je.getKey(t.providerName.toLowerCase())||(t=Gt[0])}we.dispatch("layerchange",{layer:t}),Jt.attributions=t.attribution,ie.travel.layerName=t.name}addLayers(e){e.forEach(e=>{Gt.push(Xt(e))})}});function vo(){let e=null,t=null,o=null,a=[],n=0,r=null,i=document.querySelector("body"),l=0;function s(){for(;0window.print(),!1),document.getElementById("TravelNotes-PrintToolbar-CancelButton").removeEventListener("click",s,!1),i.removeChild(document.getElementById("TravelNotes-PrintToolbar"));let e=i.children;for(let t=0;to.lat?e.bottomLeft.lat:e.upperRight.lat,lng:t.lng}:t.lat===o.lat?{lat:t.lat,lng:t.lng=e.bottomLeft.lat&&n.lng=e.bottomLeft.lng&&n.lng<=e.upperRight.lng&&n.lat=e.bottomLeft.lat&&n.lng>a.lng)return n;if(n={lat:e.bottomLeft.lat,lng:(e.bottomLeft.lat-i)/r},n.lng>=e.bottomLeft.lng&&n.lng<=e.upperRight.lng&&n.lat>a.lat)return n;throw new Error("intermediate point not found")}function c(o){n++;let a="TravelNotes-RouteViewDiv"+n,l=b.create("div",{className:"TravelNotes-routeViewDiv",id:a},i);e.pageBreak&&l.classList.add("TravelNotes-PrintPageBreak"),l.style.width=String(e.paperWidth)+"mm",l.style.height=String(e.paperHeight)+"mm";let s=e.printNotes?function(){let e=[];return t.notes.forEach(t=>{let o=window.L.divIcon({iconSize:[t.iconWidth,t.iconHeight],iconAnchor:[t.iconWidth/2,t.iconHeight/2],popupAnchor:[0,-t.iconHeight/2],html:t.iconContent,className:"TravelNotes-AllNotes "});let a=window.L.marker(t.iconLatLng,{zIndexOffset:100,icon:o,draggable:!0});e.push(a)}),e}():[];s.push(function(){let e=go.getLayer(ie.travel.layerName),t=e.url;if(e.providerKeyNeeded){let o=je.getKey(e.providerName.toLowerCase());t=t.replace("{providerKey}",o)}let o=null;return o="wmts"===e.service.toLowerCase()?window.L.tileLayer(t):window.L.tileLayer.wms(t,e.wmsOptions),o.options.attribution=' © OpenStreetMap contributors '+e.attribution+'| © Travel & Notes ',o}()),s.push(window.L.circleMarker([o.entryPoint.lat,o.entryPoint.lng],f.printRouteMap.entryPointMarker)),s.push(window.L.circleMarker([o.exitPoint.lat,o.exitPoint.lng],f.printRouteMap.exitPointMarker)),s.push(r),window.L.map(a,{attributionControl:!0,zoomControl:!1,center:[(o.bottomLeft.lat+o.upperRight.lat)/2,(o.bottomLeft.lng+o.upperRight.lng)/2],zoom:e.zoomFactor,minZoom:e.zoomFactor,maxZoom:e.zoomFactor,layers:s})}function u(){let e=i.children;for(let t=0;twindow.print(),!1),b.create("div",{id:"TravelNotes-PrintToolbar-CancelButton",className:"TravelNotes-UI-Button",title:L.getText("PrintFactory - Cancel print"),textContent:"❌"},e).addEventListener("click",s,!1)}(),window.addEventListener("afterprint",s,!0);let o=[],l=t.itinerary.itineraryPoints.iterator;for(;!l.done;)o.push(l.value.latLng);r=window.L.polyline(o,{color:t.color,weight:t.width}),n=0,a.forEach(c)}return Object.freeze(new class{print(n,r){t=Pe.getRoute(r),t&&(e=n,function(){let t=document.querySelector("body"),a=b.create("div",{},t);a.style.position="absolute",a.style.top="0",a.style.left="0",a.style.width=String(e.paperWidth-2*e.borderWidth)+"mm",a.style.height=String(e.paperHeight-2*e.borderWidth)+"mm",l=Math.ceil(a.clientWidth/256)*Math.ceil(a.clientHeight/256);let n=Se.screenCoordToLatLng(0,0),r=Se.screenCoordToLatLng(a.clientWidth,a.clientHeight);t.removeChild(a);let i=ie.map.getZoomScale(ie.map.getZoom(),e.zoomFactor);o=[Math.abs(n[0]-r[0])*i,Math.abs(n[1]-r[1])*i]}(),function(){a=[];let e=t.itinerary.itineraryPoints.iterator,n=e.done,r={bottomLeft:{lat:e.value.lat,lng:e.value.lng},upperRight:{lat:e.value.lat,lng:e.value.lng}},i={lat:e.value.lat,lng:e.value.lng},s=e.value;n=e.done;let c=e.value;for(;!n;){let t={bottomLeft:{lat:Math.min(r.bottomLeft.lat,c.lat),lng:Math.min(r.bottomLeft.lng,c.lng)},upperRight:{lat:Math.max(r.upperRight.lat,c.lat),lng:Math.max(r.upperRight.lng,c.lng)}},u=[t.upperRight.lat-t.bottomLeft.lat,t.upperRight.lng-t.bottomLeft.lng];o[0]>u[0]&&o[1]>u[1]?(r=t,s=e.value,n=e.done,c=e.value,n&&(r.entryPoint=i,r.exitPoint=s,a.push(r))):(s=d(r,s,c),r.bottomLeft={lat:Math.min(r.bottomLeft.lat,s.lat),lng:Math.min(r.bottomLeft.lng,s.lng)},r.upperRight={lat:Math.max(r.upperRight.lat,s.lat),lng:Math.max(r.upperRight.lng,s.lng)},r.entryPoint=i,r.exitPoint=s,a.push(r),r={bottomLeft:{lat:s.lat,lng:s.lng},upperRight:{lat:s.lat,lng:s.lng}},i={lat:s.lat,lng:s.lng}),f.printRouteMap.maxTiles{t=t&&n.defaultValue!==e.lat&&n.defaultValue!==e.lng}),t}function bo(e){po=!1,be.showError(e),console.log(e||"An error occurs when asking the route to the provider")}function yo(){po=!1,ie.travel.editedRoute.itinerary.validateData();let t=ie.travel.editedRoute.itinerary.maneuvers.iterator;for(;!t.done;)t.value.validateData();let o=ie.travel.editedRoute.itinerary.itineraryPoints.iterator;for(;!o.done;)o.value.validateData();if(function(t){let o=t.itinerary.itineraryPoints.iterator,a=t.itinerary.maneuvers.iterator;for(o.done,a.done,a.value.distance=e.defaultValue,a.done,t.distance=e.defaultValue,t.duration=e.defaultValue;!o.done;)o.previous.distance=ke.pointsDistance(o.previous.latLng,o.value.latLng),t.distance+=o.previous.distance,a.previous.distance+=o.previous.distance,a.value.itineraryPointObjId===o.value.objId&&(t.duration+=a.previous.duration,a.value.distance=e.defaultValue,a.next&&a.value.itineraryPointObjId===a.next.itineraryPointObjId&&(a.done,a.value.distance=e.defaultValue),a.done)}(ie.travel.editedRoute),"circle"!==ie.travel.editedRoute.itinerary.transitMode){let e=ie.travel.editedRoute.wayPoints.iterator;for(;!e.done;)e.first?e.value.latLng=ie.travel.editedRoute.itinerary.itineraryPoints.first.latLng:e.last?e.value.latLng=ie.travel.editedRoute.itinerary.itineraryPoints.last.latLng:e.value.latLng=Se.getClosestLatLngDistance(ie.travel.editedRoute,e.value.latLng).latLng}let a=ie.travel.editedRoute.notes.iterator;for(;!a.done;){let e=Se.getClosestLatLngDistance(ie.travel.editedRoute,a.value.latLng);a.value.latLng=e.latLng,a.value.distance=e.distance}mo(),ie.travel.editedRoute.notes.sort((e,t)=>e.distance-t.distance),ho&&Be().zoomToRoute(ie.travel.editedRoute.objId),Kt.createProfile(ie.travel.editedRoute),we.dispatch("routeupdated",{removedRouteObjId:ie.travel.editedRoute.objId,addedRouteObjId:ie.travel.editedRoute.objId}),we.dispatch("roadbookupdate"),we.dispatch("showitinerary")}const wo=Object.seal(new class{addRoute(){let e=Q();ie.travel.routes.add(e),r.editedChanged===ie.travel.editedRoute.editionStatus?(mo(),we.dispatch("setrouteslist"),we.dispatch("roadbookupdate")):this.editRoute(e.objId)}editRoute(e){if(r.editedChanged===ie.travel.editedRoute.editionStatus)return void be.showError(L.getText("RouteEditor - Not possible to edit a route without a save or cancel"));let t=Pe.getRoute(e),o=t.itinerary.provider,a=ie.providers.get(o.toLowerCase());if(o&&""!==o&&(!a||a.providerKeyNeeded&&!je.getKey(o)))return void be.showError(L.getText("RouteEditor - Not possible to edit a route created with this provider",{provider:o}));-1!==ie.editedRouteObjId&&this.cancelEdition(),o&&""!==o&&we.dispatch("setprovider",{provider:o});let n=t.itinerary.transitMode;n&&""!==n&&we.dispatch("settransitmode",{transitMode:n}),ie.travel.editedRoute=Q(),t.editionStatus=r.editedNoChange,ie.travel.editedRoute.jsonObject=t.jsonObject,ie.editedRouteObjId=t.objId,ie.travel.editedRoute.hidden=!1,t.hidden=!1,Kt.updateProfile(ie.editedRouteObjId,ie.travel.editedRoute),mo(),we.dispatch("routeupdated",{removedRouteObjId:t.objId,addedRouteObjId:ie.travel.editedRoute.objId}),we.dispatch("roadbookupdate"),we.dispatch("showitinerary"),we.dispatch("setrouteslist")}removeRoute(e){let t=e;if(t===ie.editedRouteObjId||t===ie.travel.editedRoute.objId){if(r.editedChanged===ie.travel.editedRoute.editionStatus)return void be.showError(L.getText("TravelEditor - Cannot remove an edited route"));t=ie.editedRouteObjId,this.cancelEdition()}we.dispatch("routeupdated",{removedRouteObjId:t,addedRouteObjId:-1}),ie.travel.routes.remove(t),Kt.deleteProfile(t),mo(),we.dispatch("roadbookupdate"),we.dispatch("setrouteslist")}removeManeuver(t){(ie.travel.editedRoute.itinerary.maneuvers.previous(t,t=>e.defaultValue{mo(),fo(t)&&we.dispatch("routepropertiesupdated",{routeObjId:t.objId}),we.dispatch("roadbookupdate"),we.dispatch("setrouteslist"),we.dispatch("updateitinerary")}).catch(e=>console.log(e||"An error occurs in the route properties dialog"))}printRouteMap(e){(function(){let e=null,t=null,o=null,a=null,n=null,r=null,i=null,l=null;function s(){return Object.seal({paperWidth:parseInt(o.value),paperHeight:parseInt(a.value),borderWidth:parseInt(n.value),zoomFactor:parseInt(l.value),pageBreak:r.checked,printNotes:i.checked})}return e=le(),e.title=L.getText("PrintRouteMapDialog - Print"),e.okButtonListener=s,t=b.create("div",{id:"TravelNotes-PrintRouteMapDialog-MainDataDiv"},e.content),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Paper width")},e),o=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput"},e),o.value=f.printRouteMap.paperWidth,b.create("text",{value:L.getText("PrintRouteMapDialog - Paper width units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Paper height")},e),a=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",value:f.printRouteMap.paperHeight},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Paper height units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Border width")},e),n=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",id:"TravelNotes-PrintRouteMapDialog-BorderWidthNumberInput",value:f.printRouteMap.borderWidth},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Border width units")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-ZoomFactorDataDiv"},t);b.create("text",{value:L.getText("PrintRouteMapDialog - Zoom factor")},e),l=b.create("input",{type:"number",className:"TravelNotes-PrintRouteMapDialog-NumberInput",value:Math.min(f.printRouteMap.zoomFactor,15),min:ie.map.getMinZoom(),max:Math.min(ie.map.getMaxZoom(),15)},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-PageBreakDataDiv"},t);r=b.create("input",{type:"checkbox",id:"TravelNotes-PrintRouteMapDialog-PageBreakInput",checked:f.printRouteMap.pageBreak},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Page break")},e)}(),function(){let e=b.create("div",{className:"TravelNotes-PrintRouteMapDialog-DataDiv",id:"TravelNotes-PrintRouteMapDialog-PrintNotesDataDiv"},t);i=b.create("input",{type:"checkbox",id:"TravelNotes-PrintRouteMapDialog-PrintNotesInput",checked:f.printRouteMap.printNotes},e),b.create("text",{value:L.getText("PrintRouteMapDialog - Print notes")},e)}(),e})().show().then(t=>vo().print(t,e)).catch(e=>console.log(e||"An error occurs in the route properties dialog"))}showRoute(e){Pe.getRoute(e).hidden=!1,we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e}),we.dispatch("setrouteslist")}hideRoute(e){Pe.getRoute(e).hidden=!0,we.dispatch("routeupdated",{removedRouteObjId:e,addedRouteObjId:-1}),we.dispatch("setrouteslist")}showRoutes(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden&&(e.value.hidden=!1,we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e.value.objId}));we.dispatch("setrouteslist")}hideRoutes(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden||e.value.objId===ie.editedRouteObjId||(e.value.hidden=!0,we.dispatch("routeupdated",{removedRouteObjId:e.value.objId,addedRouteObjId:-1}));we.dispatch("setrouteslist")}});function No(e,t){if(!f.wayPoint.reverseGeocoding)return;let o=it();o.getPromiseAddress(e).then(e=>{let a=o.parseResponse(e),n=a.street;""!==a.city&&(n+=" "+a.city),function(e,t){ie.travel.editedRoute.editionStatus=r.editedChanged;let o=ie.travel.editedRoute.wayPoints.getAt(t);o.name=e.name,o.address=e.address,we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}(Object.seal({name:a.name,address:n}),t)}).catch(e=>console.log(e||"An error occurs in the geoCoder"))}const To=Object.seal(new class{addWayPoint(e){ie.travel.editedRoute.editionStatus=r.editedChanged;let t=D();t.latLng=e,No(e,t.objId),ie.travel.editedRoute.wayPoints.add(t),we.dispatch("addwaypoint",{wayPoint:ie.travel.editedRoute.wayPoints.last,letter:ie.travel.editedRoute.wayPoints.length-2}),ie.travel.editedRoute.wayPoints.swap(t.objId,!0),wo.startRouting()}addWayPointOnRoute(e,t){let o=Se.getClosestLatLngDistance(ie.travel.editedRoute,e).distance;ie.travel.editedRoute.editionStatus=r.editedChanged;let a=D();a.latLng=t,No(t,a.objId),ie.travel.editedRoute.wayPoints.add(a),we.dispatch("addwaypoint",{wayPoint:ie.travel.editedRoute.wayPoints.last,letter:ie.travel.editedRoute.wayPoints.length-2});let n=ie.travel.editedRoute.wayPoints.iterator;for(;!n.done;){if(o{let t=o.parseResponse(e),a=t.street;""!==t.city&&(a+=" "+t.city),n.value=a}).catch(e=>console.log(e||"An error occurs in the geoCoder"))}return t=le(),t.title=L.getText("WayPointPropertiesDialog - Waypoint properties"),t.okButtonListener=r,o=b.create("div",{id:"TravelNotes-WayPointPropertiesDialog-DataDiv"},t.content),b.create("div",{textContent:L.getText("WayPointPropertiesDialog - Name")},o),a=b.create("input",{type:"text",value:e.name,className:"TravelNotes-WayPointPropertiesDialog-Input"},b.create("div",null,o)),function(){let t=b.create("div",null,o);b.create("div",{className:"TravelNotes-BaseDialog-Button",title:L.getText("WayPointPropertiesDialog - Reset address"),textContent:"🔄"},t).addEventListener("click",i,!1),b.create("text",{value:L.getText("WayPointPropertiesDialog - Address")},t),n=b.create("input",{type:"text",value:e.address,className:"TravelNotes-WayPointPropertiesDialog-Input"},b.create("div",null,o))}(),t})(ie.travel.editedRoute.wayPoints.getAt(e)).show().then(()=>{we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}).catch(e=>console.log(e||"An error occurs in the waypoint properties dialog"))}});function xo(e,t){let o=e.target.objId,a=Pe.getRoute(o),n=Be();let i=ot(e,function(){let t=[{context:wo,name:L.getText("RouteContextMenu - Edit this route"),action:o===ie.travel.editedRoute.objId||r.editedChanged===ie.travel.editedRoute.editionStatus?null:wo.editRoute,param:o},{context:wo,name:L.getText("RouteContextMenu - Delete this route"),action:o===ie.travel.editedRoute.objId&&r.editedChanged===ie.travel.editedRoute.editionStatus?null:wo.removeRoute,param:o},a.hidden?{context:wo,name:L.getText("RouteContextMenu - Show this route"),action:wo.showRoute,param:o}:{context:wo,name:L.getText("RouteContextMenu - Hide this route"),action:ie.travel.editedRoute.objId===o?null:wo.hideRoute,param:o},{context:wo,name:L.getText("RouteContextMenu - Properties"),action:a.hidden?null:wo.routeProperties,param:o},{context:n,name:L.getText("RouteContextMenu - Zoom to route"),action:n.zoomToRoute,param:o},{context:Kt,name:L.getText("RouteContextMenu - View the elevation"),action:a.itinerary.hasProfile?Kt.showProfile:null,param:o}];return f.printRouteMap.isEnabled&&t.push({context:wo,name:L.getText("RouteContextMenu - Print route map"),action:wo.printRouteMap,param:o}),t=t.concat([{context:wo,name:L.getText("RouteContextMenu - Save this route in a GPX file"),action:0",className:"TravelNotes-Note-Bullet"}),opacity:f.note.grip.opacity,draggable:!ie.travel.readOnly});o.objId=t.objId;let a=window.L.divIcon({iconSize:[t.iconWidth,t.iconHeight],iconAnchor:[t.iconWidth/2,t.iconHeight/2],popupAnchor:[0,-t.iconHeight/2],html:t.iconContent,className:"TravelNotes-AllNotes "});let n=window.L.marker(t.iconLatLng,{zIndexOffset:100,icon:a,draggable:!ie.travel.readOnly});n.objId=t.objId,n.bindPopup(e=>Pt.getNoteTextHTML("TravelNotes-",Pe.getNoteAndRoute(e.objId))),0!==t.tooltipContent.length&&(n.bindTooltip(e=>Pe.getNoteAndRoute(e.objId).note.tooltipContent),n.getTooltip().options.offset[0]=t.iconWidth/2);let r=window.L.polyline([t.latLng,t.iconLatLng],f.note.polyline);r.objId=t.objId;let i=window.L.layerGroup([n,r,o]);return i.markerId=window.L.Util.stamp(n),i.polylineId=window.L.Util.stamp(r),i.bulletId=window.L.Util.stamp(o),jo(t.objId,i),f.note.haveBackground&&document.querySelectorAll(".TravelNotes-MapNote,.TravelNotes-SvgIcon").forEach(e=>e.classList.add("TravelNotes-MapNote-Background")),Object.freeze({marker:n,polyline:r,bullet:o})}function Do(e){e.dashArray>=f.route.dashChoices.length&&(e.dashArray=0);let t=f.route.dashChoices[e.dashArray].iDashArray;if(t){let o="",a=0;for(a=0;a{let t=Pe.getRoute(e.objId);return Pt.getRouteHeaderHTML("TravelNotes-UI-",t)}),window.L.DomEvent.on(n,"click",e=>e.target.openPopup(e.latlng));let i=t.notes.iterator;for(;!i.done;)Po(i.value.objId);return t}addNote(e){return Po(e)}getDashArray(e){return Do(e)}zoomTo(e,t){if(t){let e=[];t.forEach(t=>e=e.concat(t)),ie.map.fitBounds(Se.getLatLngBounds(e))}else ie.map.setView(e,f.itineraryPointZoom)}setLayer(e,t){let o=null;o="wmts"===e.service.toLowerCase()?window.L.tileLayer(t):window.L.tileLayer.wms(t,e.wmsOptions),Lo&&ie.map.removeLayer(Lo),ie.map.addLayer(o),Lo=o,ie.travel.readOnly||(ie.map.getZoom()<(e.minZoom||0)&&ie.map.setZoom(e.minZoom||0),ie.map.setMinZoom(e.minZoom||0),ie.map.getZoom()>(e.maxZoom||18)&&ie.map.setZoom(e.maxZoom||18),ie.map.setMaxZoom(e.maxZoom||18),e.bounds?(ie.map.getBounds().intersects(e.bounds)&&!ie.map.getBounds().contains(e.bounds)||(ie.map.setMaxBounds(null),ie.map.fitBounds(e.bounds),ie.map.setZoom(e.minZoom||0)),ie.map.setMaxBounds(e.bounds)):ie.map.setMaxBounds(null)),ie.map.fire("baselayerchange",o)}onGeolocationStatusChanged(e){t.active!==e&&Ao&&(ie.map.removeLayer(Ao),Ao=null)}onGeolocationPositionChanged(e){let t=f.geoLocation.zoomToPosition;Ao&&(ie.map.removeLayer(Ao),t=!1),Ao=window.L.circleMarker(window.L.latLng(e.coords.latitude,e.coords.longitude),{radius:f.geoLocation.radius,color:f.geoLocation.color}).bindTooltip(A.formatLatLng([e.coords.latitude,e.coords.longitude])).addTo(ie.map),t&&ie.map.setView(window.L.latLng(e.coords.latitude,e.coords.longitude),f.geoLocation.zoomFactor)}});let Co=null,Mo=null,So=1;function Oo(){Co&&(window.L.DomEvent.off(Co),ie.map.removeLayer(Co),Co=null)}function Uo(){window.L.DomEvent.off(Co,"mouseout",Oo)}function ko(e){e.latlng.lat=Mo[0],e.latlng.lng=Mo[1],e.target.objId=ie.travel.editedRoute.objId,xo(e).show()}function Bo(e){To.addWayPointOnRoute(Mo,[e.target.getLatLng().lat,e.target.getLatLng().lng]),Co&&(window.L.DomEvent.off(Co,"dragstart",Uo),window.L.DomEvent.off(Co,"dragend",Bo),window.L.DomEvent.off(Co,"contextmenu",ko),ie.map.removeLayer(Co),Co=null)}function Ho(e){let t=Pe.getNoteAndRoute(e.target.objId),o=t.note,a=t.route,n=ie.mapObjects.get(e.target.objId);if(null===a)o.latLng=[e.target.getLatLng().lat,e.target.getLatLng().lng],we.dispatch("updatetravelnotes");else{let t=Se.getClosestLatLngDistance(a,[e.target.getLatLng().lat,e.target.getLatLng().lng]);o.latLng=t.latLng,o.distance=t.distance,a.notes.sort((e,t)=>e.distance-t.distance),n.getLayer(n.bulletId).setLatLng(t.latLng),we.dispatch("updateitinerary")}n.getLayer(n.polylineId).setLatLngs([o.latLng,o.iconLatLng]),we.dispatch("roadbookupdate")}function zo(e){let t=Pe.getNoteAndRoute(e.target.objId).note,o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([[e.latlng.lat,e.latlng.lng],t.iconLatLng])}function Vo(e){e.originalEvent.target.style.opacity=f.note.grip.moveOpacity}function Fo(e){e.originalEvent.target.style.opacity=f.note.grip.opacity}function Wo(e){Io(e).show()}function Ko(e){let t=Pe.getNoteAndRoute(e.target.objId).note;t.iconLatLng=[e.target.getLatLng().lat,e.target.getLatLng().lng];let o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([t.latLng,t.iconLatLng])}function Jo(e){let t=Pe.getNoteAndRoute(e.target.objId).note,o=ie.mapObjects.get(e.target.objId);o.getLayer(o.polylineId).setLatLngs([t.latLng,[e.latlng.lat,e.latlng.lng]])}function Zo(e){let t=Pe.getRoute(e.target.objId);if(r.notEdited!==t.editionStatus)if(Mo=[e.latlng.lat,e.latlng.lng],Co)Co.setLatLng(e.latlng);else{let t='
?
';Co=window.L.marker(e.latlng,{icon:window.L.divIcon({iconSize:[40,40],iconAnchor:[20,40],html:t,className:"TravelNotes-WayPointStyle"}),draggable:!0}),(-1===f.route.showDragTooltip||So<=f.route.showDragTooltip)&&(So++,Co.bindTooltip(L.getText("MapEditor - Drag and drop to add a waypoint")),Co.getTooltip().options.offset=[0,0]),Co.addTo(ie.map),window.L.DomEvent.on(Co,"mouseout",Oo),window.L.DomEvent.on(Co,"dragstart",Uo),window.L.DomEvent.on(Co,"dragend",Bo),window.L.DomEvent.on(Co,"contextmenu",ko)}}function Xo(e){xo(e).show()}function Go(e){(function(e){let t=e.target.objId,o=ot(e,function(){let e=ie.travel.editedRoute.wayPoints.first.objId!==t&&ie.travel.editedRoute.wayPoints.last.objId!==t;return[{context:To,name:L.getText("WayPointContextMenu - Delete this waypoint"),action:e?To.removeWayPoint:null,param:t},{context:To,name:L.getText("WayPointContextMenu - Modify properties"),action:To.wayPointProperties,param:t}]}());return Object.seal(o)})(e).show()}function qo(e){ie.travel.editedRoute.wayPoints.getAt(e.target.objId).latLng=[e.target.getLatLng().lat,e.target.getLatLng().lng],To.wayPointDragEnd(e.target.objId)}function Yo(e,t){t.objId=e,t.addTo(ie.map),ie.mapObjects.set(e,t)}function Qo(e){let t=ie.mapObjects.get(e);t&&(window.L.DomEvent.off(t),ie.map.removeLayer(t),ie.mapObjects.delete(e))}function _o(e,t){if(n.defaultValue===e.lat&&n.defaultValue===e.lng)return;let o='
'+t+"
",a=window.L.marker(e.latLng,{icon:window.L.divIcon({iconSize:[40,40],iconAnchor:[20,40],html:o,className:"TravelNotes-WayPointStyle"}),draggable:!0});a.bindTooltip(e=>Pe.getWayPoint(e.objId).fullName),a.getTooltip().options.offset=[20,-20],window.L.DomEvent.on(a,"contextmenu",Go),a.objId=e.objId,Yo(e.objId,a),window.L.DomEvent.on(a,"dragend",qo)}const $o=Object.seal(new class{updateRoute(e,t){-1!==e&&function(e){let t=Pe.getRoute(e);Qo(t.objId);let o=t.notes.iterator;for(;!o.done;)Qo(o.value.objId);let a=t.wayPoints.iterator;for(;!a.done;)Qo(a.value.objId)}(e),-1!==t&&function(e){let t=Ro.addRoute(e),o=ie.mapObjects.get(e);if(!ie.travel.readOnly){window.L.DomEvent.on(o,"contextmenu",Xo),window.L.DomEvent.on(o,"mouseover",Zo);let e=t.notes.iterator;for(;!e.done;){let t=ie.mapObjects.get(e.value.objId),o=t.getLayer(t.markerId),a=t.getLayer(t.bulletId);window.L.DomEvent.on(a,"dragend",Ho),window.L.DomEvent.on(a,"drag",zo),window.L.DomEvent.on(a,"mouseenter",Vo),window.L.DomEvent.on(a,"mouseleave",Fo),window.L.DomEvent.on(o,"contextmenu",Wo),window.L.DomEvent.on(o,"dragend",Ko),window.L.DomEvent.on(o,"drag",Jo)}}if(!ie.travel.readOnly&&r.notEdited!==t.editionStatus){let e=ie.travel.editedRoute.wayPoints.iterator;for(;!e.done;)_o(e.value,e.first?"A":e.last?"B":e.index)}}(t)}updateRouteProperties(e){let t=ie.mapObjects.get(e),o=Pe.getRoute(e);t.setStyle({color:o.color,weight:o.width,dashArray:Ro.getDashArray(o)})}updateNote(e,t){let o=!1;if(-1!==e){let t=ie.mapObjects.get(e);t&&(o=t.getLayer(t.markerId).isPopupOpen()),Qo(e)}-1!==t&&function(e,t){let o=Ro.addNote(e);t&&o.marker.openPopup(),ie.travel.readOnly||(window.L.DomEvent.on(o.bullet,"dragend",Ho),window.L.DomEvent.on(o.bullet,"drag",zo),window.L.DomEvent.on(o.bullet,"mouseenter",Vo),window.L.DomEvent.on(o.bullet,"mouseleave",Fo),window.L.DomEvent.on(o.marker,"contextmenu",Wo),window.L.DomEvent.on(o.marker,"dragend",Ko),window.L.DomEvent.on(o.marker,"drag",Jo))}(t,o)}removeObject(e){Qo(e)}removeAllObjects(){ie.mapObjects.forEach(e=>{window.L.DomEvent.off(e),ie.map.removeLayer(e)}),ie.mapObjects.clear()}addWayPoint(e,t){_o(e,t)}addItineraryPointMarker(e,t){Yo(e,window.L.circleMarker(t,f.itineraryPointMarker))}addSearchPointMarker(e,t,o){let a=!1;if(o){let e=[];o.forEach(t=>{e=e.concat(t)});let t=Se.getLatLngBounds(e),n=ie.map.getBounds();a=(t.getEast()-t.getWest())/(n.getEast()-n.getWest())>.01&&(t.getNorth()-t.getSouth())/(n.getNorth()-n.getSouth())>.01}Yo(e,a?window.L.polyline(o,f.searchPointPolyline):window.L.circleMarker(t,f.searchPointMarker))}addRectangle(e,t,o){Yo(e,window.L.rectangle(t,o))}setLayer(e){let t=e.url;if(e.providerKeyNeeded){let o=je.getKey(e.providerName.toLowerCase());if(!o)return;t=t.replace("{providerKey}",o)}Ro.setLayer(e,t)}});function ea(e){return Math.floor(Math.abs(e)+.5)*(0<=e?1:-1)}const ta=Object.freeze(new class{encode(e,t){if(!e.length)return"";let o=t.length,a=Array.from(t,e=>Math.pow(10,e));function n(e,t,o){let a=ea(e*o),n=ea(t*o),r=a-n;r<<=1,0>a-n&&(r=~r);let i="";for(;32<=r;)i+=String.fromCharCode(63+(32|31&r)),r>>=5;return i+=String.fromCharCode(r+63),i}let r="";for(let t=0;tMath.pow(10,e)),i=new Array(o).fill(0);function l(){let t=null,o=0,n=0;do{t=e.charCodeAt(a++)-63,n|=(31&t)<>1):n>>1}for(;a{a.push([e.lat,e.lng,e.distance,e.elev,e.objId])}),o.values=ta.encode(a,[n.fixed,n.fixed,2,2,0]),e.itinerary.itineraryPoints=o}function o(t){let o=[];if(t.itinerary.itineraryPoints.values)ta.decode(t.itinerary.itineraryPoints.values,[n.fixed,n.fixed,2,2,0]).forEach(r=>{let i={lat:n.defaultValue,lng:n.defaultValue,distance:e.defaultValue,elev:a.defaultValue,objId:-1};[i.lat,i.lng,i.distance,i.elev,i.objId]=r,i.objType=t.itinerary.itineraryPoints.objType,o.push(i)});else{t.itinerary.itineraryPoints.latLngs=ta.decode(t.itinerary.itineraryPoints.latLngs,[n.fixed,n.fixed]);let e=0;t.itinerary.itineraryPoints.latLngs.forEach(n=>{let r={};r.lat=n[0],r.lng=n[1],r.distance=t.itinerary.itineraryPoints.distances[e],t.itinerary.itineraryPoints.elevs?r.elev=t.itinerary.itineraryPoints.elevs[e]:r.elev=a.defaultValue,r.objId=t.itinerary.itineraryPoints.objIds[e],r.objType=t.itinerary.itineraryPoints.objType,o.push(r),e++})}t.itinerary.itineraryPoints=o}function i(e){e.routes.forEach(o),e.editedRoute&&o(e.editedRoute)}return Object.seal(new class{decompress(e){i(e),ie.travel.jsonObject=e,ie.editedRouteObjId=-1,ie.travel.routes.forEach(e=>{r.notEdited!==e.editionStatus&&(ie.editedRouteObjId=e.objId)})}decompressMerge(e){i(e);let t=te();t.jsonObject=e;let o=t.routes.iterator;for(;!o.done;)ie.travel.routes.add(o.value);let a=t.notes.iterator;for(;!a.done;)ie.travel.notes.add(a.value)}compress(){let e=ie.travel.jsonObject;return e.routes.forEach(t),t(e.editedRoute),e}})}const aa=Object.seal(new class{routeDropped(e,t,o){ie.travel.routes.moveTo(e,t,o),wo.chainRoutes(),we.dispatch("setrouteslist"),we.dispatch("roadbookupdate")}saveTravel(){let e=ie.travel.routes.iterator;for(;!e.done;)e.value.hidden=!1;let t=oa().compress(ie.travel);A.saveFile(t.name+".trv",JSON.stringify(t))}clear(){window.confirm(L.getText("TravelEditor - This page ask to close; data are perhaps not saved."))&&(Kt.deleteAllProfiles(),we.dispatch("removeallobjects"),ie.travel.editedRoute=Q(),ie.editedRouteObjId=-1,ie.travel=te(),ie.travel.routes.add(Q()),we.dispatch("setrouteslist"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate"),we.dispatch("travelnameupdated"),f.travelEditor.startupRouteEdition&&wo.editRoute(ie.travel.routes.first.objId))}});function na(){return Object.seal(new class{openDistantFile(e){oa().decompress(e),ie.travel.readOnly=!0,this.display()}display(){document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name);let e=ie.travel.routes.iterator;for(;!e.done;)r.notEdited===e.value.editionStatus&&we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:e.value.objId});-1!==ie.editedRouteObjId&&we.dispatch("routeupdated",{removedRouteObjId:-1,addedRouteObjId:ie.travel.editedRoute.objId});let t=ie.travel.notes.iterator;for(;!t.done;)we.dispatch("noteupdated",{removedNoteObjId:-1,addedNoteObjId:t.value.objId});Be().zoomToTravel()}})}function ra(){function e(e,t){let o=new FileReader;o.onload=function(){let e={};try{e=JSON.parse(o.result)}catch(e){console.log(e||"An error occurs when reading the file")}t?oa().decompressMerge(e):(Kt.deleteAllProfiles(),oa().decompress(e)),function(){if(we.dispatch("removeallobjects"),na().display(),go.setLayer(ie.travel.layerName),we.dispatch("setrouteslist"),-1!==ie.editedRouteObjId){let e=ie.travel.editedRoute.itinerary.provider;if(e&&""!==e&&!ie.providers.get(e.toLowerCase()))be.showError(L.getText("FileLoader - Not possible to select as provider",{provider:e}));else{let t=ie.travel.editedRoute.itinerary.transitMode;we.dispatch("setprovider",{provider:e}),t&&""!==t&&we.dispatch("settransitmode",{transitMode:t})}}wo.chainRoutes(),we.dispatch("travelnameupdated"),we.dispatch("showitinerary"),we.dispatch("roadbookupdate")}()},o.readAsText(e.target.files[0])}return Object.seal(new class{openLocalFile(t){e(t,!1)}mergeLocalFile(t){e(t,!0)}})}let ia=null,la=null,sa=null,da=0,ca=null,ua=null,ga=null,va=null;function ha(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}function pa(e){ie.travel.name=p.sanitizeToJsString(e.target.value),document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name),we.dispatch("roadbookupdate")}function ma(e){e.stopPropagation(),aa.clear(),document.title="Travel & Notes"+(""===ie.travel.name?"":" - "+ie.travel.name)}function fa(e){e.stopPropagation(),""===ie.travel.name?be.showError(L.getText("TravelUI - Gives a name to the travel")):aa.saveTravel()}function ba(e){e.stopPropagation(),ra().openLocalFile(e)}function ya(){window.confirm(L.getText("TravelEditor - This page ask to close; data are perhaps not saved."))&&ua.click()}function wa(e){e.stopPropagation(),ra().mergeLocalFile(e)}function Na(){-1===ie.editedRouteObjId?ga.click():be.showError(L.getText("TravelUI - Not possible to merge a travel when a route is edited"))}function Ta(){ca=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},sa),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Cancel travel"),textContent:"❌"},ca).addEventListener("click",ma,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Save travel"),textContent:"💾"},ca).addEventListener("click",fa,!1),ua=b.create("input",{className:"TravelNotes-TravelUI-OpenFileInput",type:"file",accept:".trv"},ca),ua.addEventListener("change",ba,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Open travel"),textContent:"📂"},ca).addEventListener("click",ya,!1),ga=b.create("input",{className:"TravelNotes-TravelUI-OpenFileInput",type:"file",accept:".trv,.map"},ca),ga.addEventListener("change",wa,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Import travel"),textContent:"🌏"},ca).addEventListener("click",Na,!1),b.create("text",{value:"📋"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:"TravelNotesRoadbook.html?lng="+f.language+"&page="+ie.UUID,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelUI - Open travel roadbook")},ca)))}function xa(e){e.stopPropagation(),ia.classList.toggle("TravelNotes-TravelUI-HiddenRouteList");let t=ia.classList.contains("TravelNotes-TravelUI-HiddenRouteList");e.target.textContent=t?"▶":"▼",e.target.title=t?L.getText("TravelUI - Show"):L.getText("TravelUI - Hide")}function Ia(e){e.stopPropagation(),wo.addRoute()}function La(){va=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},sa),b.create("div",{textContent:"▼",className:"TravelNotes-TravelUI-RouteList-ExpandButton"},va).addEventListener("click",xa,!1),b.create("span",{textContent:L.getText("TravelUI - Travel routes")},va),b.create("div",{className:"TravelNotes-UI-Button TravelNotes-UI-FlexRow-RightButton",title:L.getText("TravelUI - Add a route"),textContent:"+"},va).addEventListener("click",Ia,!1)}function Aa(e){e.stopPropagation();try{e.dataTransfer.setData("Text",e.target.objId),e.dataTransfer.dropEffect="move",e.dataTransfer.routeObjId=e.target.objId}catch(e){console.log(e)}da=e.target.objId}function Ea(e){e.preventDefault()}function ja(e){e.preventDefault();let t=e.target;for(;!t.objId;)t=t.parentElement;let o=t.getBoundingClientRect();aa.routeDropped(da,t.objId,e.clientY-o.top{e.paneId===Ra?e.classList.add("TravelNotes-DataPaneUI-ActivePaneButton"):e.classList.remove("TravelNotes-DataPaneUI-ActivePaneButton")})}function Ua(e){Oa(e.target.paneId)}function ka(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}const Ba=Object.freeze(new class{createUI(e){if(Ma)return;let t=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e);Sa=b.create("div",{id:"TravelNotes-PanesManagerUI-PaneControlsDiv"},e),Ma=b.create("div",{id:"TravelNotes-PanesManagerUI-PaneDataDiv"},e),Ma.addEventListener("wheel",ka,!1),Ca.forEach(e=>{b.create("div",{textContent:e.getButtonText(),className:"TravelNotes-DataPaneUI-PaneButton",paneId:e.getId()},t).addEventListener("click",Ua,!1),e.setPaneDivs(Ma,Sa)})}addPane(e){Ca.set(e.getId(),e)}showPane(e){Oa(e)}updatePane(e){e===Ra&&Oa(e)}});let Ha=null,za=!1;const Va=["bike","pedestrian","car","train","line","circle"];let Fa={bike:null,pedestrian:null,car:null,train:null,line:null,circle:null},Wa=null;const Ka={bike:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEIChYTLGSDtAAAA65JREFUSMftVl1sk1UYfs53vnZft4/R/W+hHaUrbshcQch06VCGWd\t\tBohmNRCRiXKXphZCOacCEYBeOFXHhDlHDjQDEBdKIx9sL4Q8bqtEPqLAOE/YDrGPspa2m7bt/Xr8eLr3WddFuJ88b4Xp285z1P3v\t\tOe533eQ9xud3FxMcdxmMMURWGMUUoJIUjNFEUZHBwkPp8vovBnHVfB7gghACNIsgEQQgjAwBjiAfFIQqqrLBpNhKeU/to9Vr/fic\t\tWzbw6iqrKEQ/Ks/pkxAODwr9n/0HcHLWq5uoqlXMqMTjR+nj2bKWPlcrH9t4komyHRmgLt3pcq0gQNGOr2dSJZMyycteNaSJKjlk\t\tIh0dk9KjnO3QhORtrsV+YmXjzreW576qfxlrrlJUXCrUkWlBgDlmgJI+Tn7pvHfvTOeYzEodncTfP8xoIu93h7XzDR+Vx1vj8kVx\t\toEp2fqrlvGWihsseoFnggCv2JZRql+1pNMK+xL10T5yiyeI6/UFuzbalydq12YIbWW9CMt1u2bDeVm8VCzdZUl+1j7yEPr8wmBlh\t\tJTJg+AEgBI1+L4Gw9OSez8ldsv1JvfbbonKUNi1U6jZNuW0p3vuVRG1K8P6wUc2G4++OlAU03Rh98PV63OKvNNXR8K2oxCqTn747\t\taLgVCkfSBkv+Bvqs5985kV+08OzGTNEoi192lTm71XdTSs1RMl2trhzczUBWXm6vG2PGHcue2+xzeZHNfDWx81vX308tcX/BbTEp\t\tX0rR3jOdnpswqSKPAZomC/FABQadA1PlX+uWsCAM8xAK4Rqb7WvMlmebZhzQ5bXl6u+MC9WS9uzM/R6z7ac796fHJa+XtB/sKOSJ\t\tEqg9DpmXJ6wnWvd8RGRjS273TdqFxnvnh5+BPH2Nqy7N/7/F/5ZABArAiiQNUFpRwATlEUhmnVdeiz/saGWa/xWJkoyxF1vefo1Y\t\twNrR8c7wbQ+kX/q42rEiN3bS76Y+i2uo5GGQCeUhplkuryhJROp+fIbmuXa9h9LfTkw0WimNZ8uGeGrwxDo2EAPV75bOfg4eaK8b\t\tFAKCQtM+i9t8JvneiPQ0cBkEAgcO6XkZrXvksYe3j5kYK8HN2ZrtEz/ZPza1CNRczP0p4+PyEpM3Swv7Nug62UBwBCZ7USw/vfjq\t\tQobz/0BpNoHs8voHzzik9SsUtZVFNH+Y8NMMqRxQWllAdA/H6/RqPr7bvJGBYcgSz28wIhJK49SR7WUlIoy2HidruNRiOldBGzVr\t\t+TfwLXzWMKJ+iQhAAAAABJRU5ErkJggg==",pedestrian:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICholT2tZIQAAAyxJREFUSMetll1IFFEUx/93PtZ13cykJNvWNDXEMkgoyYKICCJISK\t\tkIIYjqpU98kB77loogjCzKCvoQkqigh8ioKKS01NS2grDwY7ddLa3dNVt37r1ze5haLXVzV8/TmTN3fufMYeacP3E4HCkpKZIkYX\t\twmhCCEhD/DOXc6ncTr9TKu1D5vgxj7LCEQYvglAYQQnOuSTAiMTAQGgpDlSzNUlSmyLLe0fl1/6BUmzx6exNIl6RLwV7kygUomzB\t\tYA8G+LuQD9kyoxRrqxf9HFvQtIVMmUMPeqDuevWZUNgDJ917n3kaLDfRhZmUmGE2dRo6g6HLr6bmtQY+5u78kr7ycZ3fCmlzGdUj\t\t01yTyZ6MOb0q6dLYyzmObYE29VFp3Ykjk56HXZU0p2rrDE/m6xJda0c1v+yjTLeIgyCYveujHb0+MfCLBQxOsPHi1dNh40F2HRVm\t\tvMz4AW1IbQZyrrF8637S+wT7QhVovKGedMD0U8Xwau3mzYsyM/XpUmhDaZVKHrus5DEVUmu8+/8/T4LpbmGpFjxelvb6zLSjRFhl\t\tZUhTGu86GqzSYJwL6Dz3Lm21ZnWgEkxMfYbdP8QT0ydMWluoorjRrlnAtKdQCKTAC8cAXKymsvn1p752Desry0/h+D+ZnWyNCVtX\t\t3XG7yDQdbU3F52+nEIDaDq1bfj5c/efei1z060JSdUnS86snluxH+jRjkIqMYAmIZNkXNPejpc/dOmxgLo6PpeVLDQqkiRoRnjBM\t\tTbTwEoyl+Dtbgw25i0U+PNJQce5SSbx0SPOpB1ziVJcvdp/xyYZVEW56YaftJ0K+Woc/4cEz3qXqSUg8DVpwEAGXq/HJv53v0Wd7\t\tfvZVNXp/PbjAQ14l4HBhkAt4/+2bS/rabtR/GJlt6+gYZmV3tnb3XT92jQhBBPvyYEMGKJCcBsVijTo1lg92rarHGqLkRQ46NpD/\t\tHZ4/d0+6NBX3jaYzhOt3f4FDSs8XXXg+fuetdgNOiQzdtwe2Rwe7nj/+NJlqJXHqM+KcsKAOLz+VQ19uOnbiEwht4gMGSZGJJp4S\t\t0jfSalAeJwOOx2uyzLYfTjCAU4Ljn5C1w5SWBHSm1MAAAAAElFTkSuQmCC",car:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICh4hLGpYPAAAAlZJREFUSMfdlk1oE0EUx/+zszEx3UhD0zZYkn5ksfWjlVgrVk1RQV\t\tR6EMFaK9qjggdBRO1NvSiIB8/iyQ/akxepSKteRPxoETXamkQtJAbbBN0ky0boZne8FIu23exqKuhjDgMz78ef/3u8GRIOh/1+P8\t\tdxKF1ompZIJEgmkylo/KPHMTBL6QQzCXM2hGxpF222Ak8pffkqvff88xKqHrqE9g0BDrAo10wwAOCwaPFvovmFDo6Gak4f3+x0gj\t\tHoOjQNTIfOoOvQ9dn93aF3p268tobu3R9sqC+XJACgdGbxPCgFIbPXHPYWa+gKWtbS7M3nIe669VVTfjm1aRUC53AtwYObHXW1rr\t\tZK90haMuv1mZ4VgsBFYlNzuQBU+kUiybiajMYmeR69e0QLZdwW8gMYGU0ZF+rp6GcArcHlZg3Z5K1avaqKMUwkpGNbawzQ2VxB09\t\tDU6Gl0lUVkpQj6xA7xwtntdjsjBBfPdZhpMnc5fXL7wO5DA8+mFCND1gddDgcA8nFCVtUi0OlpRKKyrsPtphuby015PTYuB7r67w\t\t3HjdH3H8abDva/eStZKGOt33n9ZNu6tZXG6NagZ6AvVF+3zEJfCwI93BMs6nJ1tbN730rTM+R3JyxjxVQfuRztu5IaG+4UBORyWL\t\tNz0AD34k6nx4NCAYHQ4Cc1XQStMEVRlR8SEmrSjOT4fNf++lBNpfR8npNlzThZlmG3Y6H2nx8tdl8zo6uh6+p/94AtMppypLRQSn\t\tkAJJvN2mxL33+YZOynR+9PQgx4VfUbCYfDPp+PUlry7+R3HyvZuSYHFFYAAAAASUVORK5CYII=",train:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiI23EqkBAAABQpJREFUSMetVm1QVFUYfs+55+4u+zEsshK0iuy6iuAHbaSwJhkZNp\t\tWjaWn2oQ2Zk1lmpjMllmNqDYZjM+Y0TdkIg8WYHwU6KjqUIzl8KGhihcgCu8Auu3uBXXfZT+89/cBAYFex8f1173nOfea973ne5z\t\t2oqrouNUWHMYb7CUqBAkWAEAqD8jxvMplRd08vpWzlhRtA74scwe0PRjwgNMegIyRERCypq3cs/qwWHlyc+RIyZ2oxAASCXniwQQ\t\tEAMAB4ff6wG6Yr4YMcVaoi+D/IEUIEAFhCwsL5G6elTEnc8A6RSgnP05vuQOP1juXbrnjpqM4cA4BIxIbFnv/0mnbpyQlLyo6VXU\t\tEIHfn1kiYpLjlmtIkTACAMGwleZZAumK8bo5SFQoGxseyhXxqezkyYYnFVXPPYb5F7UyMU/gfzX43f+P5z5L9yvZWrHoACgUDlhb\t\t9e23LRHkJ3o4Zw6LIZUevW5HCcc++354/+Zp6YIDPoVZN1YxPiY5TRoujo6NSUpIL3uNw9RgExkalHhAwLX3ySTQizeUd5YU0fgL\t\tTJSE8ZHQCOYTvTov1/3pRFpKZ0eCMeLzBoNeofiioKa/p2r4yfnjpeLGb9gWCfx2/nvOZOd7vFIxETsZg0Gb2Tgu4bfkWErKlwxz\t\tt/umD2E3OmHSg+t3Zfc+m2tIULDHc/LquVe2TJ0ZFFx/367n/JfAguFz2TMVOXv+dETb2t6cjCe/ICQEKC6utNqeF1jQADwJsGeW\t\tnh0lDo1surD6VNjdtX8GJS0sOjlPCz8/UaqRAx68na2IMl52+6AysWa2ama1mWHX1bKxTyzbmTwioEAYBCRlSxyrlZ08tOVAGAz+\t\tezO1wWa4+5vcfY2t3U6q66xjl9vEpGdGq5LmmMNIpixDMYE4IZBndYXBHF12J2tpgFrudsZY3l8311tZxoRHJSALB74O/rPFwfrk\t\tI5+BlgeRjUOBlQXnl1t8kVctNeAAAQ3a/VeUCiZjydvHyQemAEbV2rX7QgzcE5u2xOk7nncoOl+LTN5B/SafvXaV56YZYgCEU/VW\t\t840N6/uH6efOVyvcXqXLOjFvjhBaEA8H1Jg9frmZ2p06fp0vV4ySLY+lGoo8PeZHRUXzR9d9xiCTJFx0xPZiXHKOUK2aDt3DD7lU\t\tolBUSGDkrkdrsv1TuyPzw7sDRvAlm1LPFR/WTdRDXDMAN+1GnhzO2cg+tze0L9Zi+RiAiDCRNSKhVJibElR+q2HOoCgDO7MgwZE8\t\tN4SIXplre4dT3GbSabIPCPpSePVcWIxWKtRq3VqCPVus1k3f6z5baaB3U9wvqquujyXc2m9t6sOTNaWjr3Hyj/p7E1GIw4ybju3m\t\t27KgJDp8/d7Pztb9r+qLXtyMuZmqotOXzhqdxTr2SrtBOUcSoFYXiEkVgkkkhoe4fr3b3GPgGPylQHoviS7+Sy0oPb01e9Me/xTN\t\t3HO899dcbZD2XEwabVU+dm6bPnRs3OnFJxrjG/sPlORTF5eXkWq7eo3BiJ3SegHyusgt0cJcGJCezvF7kgMADQ2QeHKx2nTzTIWb\t\tfb7ZPLRbNSotoabbYAWZEzbvy4MQQAGIzu2RE7Szko5QAAYIi31HP09d1NdyxIAIBhCAAgl8vFslHNxi5KASGgdPhkGHmto/T2Fk\t\toppVSgFCggBBhjQMBgPEkXHwr50NWrDYmJ4zFmYMilDwECBEBppBsM9KcSNniebzOZ/gWOPRAUHy2iQwAAAABJRU5ErkJggg==",line:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiINbUFNIAAAAfZJREFUSMdjvHz5spycHBMTEwP1wN+/fx8/fsz44cOHP39ZDh+9zf\t\tCfJO2MDFANGAxGRhtLFVbWPyzMzMwXLr4ObDxFRVfv6mKwNFNmYmAg0bnEgP8MDAwMZAZxoqXgomJd/GrIMdpCkq270SMi1Iz6Rs\t\t9sdxIW4l2x+hSVjV5UrKunI3fpyqO43svUNDrfVSwi1Oztu8/plfsIKmYiKYhrS50ZGBiau/eeeP6LmkbDg3ji7lfEqGeiehCTZj\t\tRJQYzTaMb/bBQGMU6j/zOia57f60ZSEBMbIBsbTTXUpI6dvE18EMMBCx65mgBpT3e9Fy8/FLccxZUcE4OUv//4XTD3DglGW0iyle\t\tY7MTAwVLXsRgtiiIl21srKSuKsLMyPn7wlzej5vW58vJyz5h+ef/w9VhN///l7997LQ0fvzl93l4QAgQdx+tTrAVrcUQFqxoZysr\t\tIiaCbiTzAsuIL40+fvb958ubvaX0lRnIGB4fv3X9dvPD1x+iFBE3EaDQliVhZmVl5OP2/D799/nTl3/+jJ+1hDkzSjixK1+Xg5v3\t\t//dfX6U/JMxGl03/yrl669atnwlPIKEt3oE89/naCGueRXu4PAaGYmRuoayszMwsDAwPjx40dWVs47d1/8/8/ASCUrVJQlfv/+zn\t\tj58mVZWVlmZmaqNycB+D3rTYmxQpEAAAAASUVORK5CYII=",circle:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAIAAAC0Ujn1AAAABmJLR0QAAAAzAJlWvctWAAAACXBIWX\t\tMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5AEICiEaxb+bJAAAAqNJREFUSMdjvHz5spycHBMTEwP1wN+/fx8/fsz44cOHP39ZDh+9zf\t\tCfJO2MDFANGAxGRhtLFVbWPyzMzMwXLr4ObDxFRVfv6mKwNFNmYmAg0bnEgP8MDAwMTAw0Ayz4pS0k2RKDlO2slUVFeIWFeBkYGN\t\t6++/z6zedDR+/OX3f3xPNfZBo9M1szIsTk48dvBw7fOnvp5cTdrxgYGPJdxYz1xD1dtWIjzBevOJk+9TrJRu/vszUyVJg6+1DVso\t\tfI4hN3v2LY/Yqh93JNgHRpvpOOloR19n6sJjDhMldZSSw+ex2aucigZcNT96iVstJCR6c6Emv0zGxNI0OFvKodG659xR8TJ57/Cs\t\tvcrKMlMzNbk7DRFpJssRHm3RP3ETQXbnr3xH2xEeYWkmwEjE4MUn7z9nPLhqfEJ7KWDU/fvP2cFaVOwGg7a+UDh2+RmoS3775mai\t\txPwGhREd6zl16SavSJcy+kJAUJGC0sxAtJvySB+cff8/FyEpX4qALQjf70+Xu+qxippiRaCn76/J2A0c+evzfWEyfVaAsjiWfP3x\t\tMw+vTZhw62aqQabWetfPrsQwJGT1t2U0SYty1KnnhzawKk5WVFpi27ScDoE89/LV5xMjvVDjN34Sp1S/OdFq84iVnAYkkh6VOvX7\t\tn2ZNV0X4KmW0iyrZrue+XaE6xFK/bEZ529//HTdzuXhdcESOMJh53Lwh8/fYerUMVZXltn75+ZrVlV7JoY/X7PgVsnzr2Yf/w9JJ\t\t1ZGEm4OKhJSgiSWRVAQmb+urtZUep21soRISbzeDkhCf/Z8/dHT9ybtuwm+RUYJFZP9F5mYLhMhdxI5YzOzMRIXUOZmVkYGBgYP3\t\t78yMrKeefui///GRipZIWKssTv398ZL1++LCsry8zMTPXmJADJwQv2CCSQygAAAABJRU5ErkJggg=="};function Ja(e){ie.routing.transitMode=e;let t=document.querySelector(".TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton");t&&t.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"),document.getElementById("TravelNotes-ProvidersToolbarUI-"+e+"ImgButton").classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton")}function Za(e){e.stopPropagation(),Ja(e.target.transitMode),wo.startRouting()}function Xa(e){ie.routing.provider=e;let t=document.querySelector(".TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton");t&&t.classList.remove("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"),document.getElementById("TravelNotes-ProvidersToolbarUI-"+e+"ImgButton").classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton");let o=ie.providers.get(e.toLowerCase());if(Va.forEach(e=>{o.transitModes[e]?Fa[e].classList.remove("TravelNotes-ProvidersToolbarUI-InactiveImgButton"):Fa[e].classList.add("TravelNotes-ProvidersToolbarUI-InactiveImgButton")}),!o.transitModes[ie.routing.transitMode]){let e=null;Va.forEach(t=>{o.transitModes[t]&&(e=e||t)}),Ja(e)}}function Ga(e){e.stopPropagation(),Xa(e.target.provider),wo.startRouting()}function qa(e){if(0===e.providerKey)return;let t=b.create("img",{src:e.icon,id:"TravelNotes-ProvidersToolbarUI-"+e.name+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:e.name,provider:e.name},Ha);if(t.addEventListener("click",Ga,!1),!za){t.classList.add("TravelNotes-ProvidersToolbarUI-ActiveProviderImgButton"),ie.routing.provider=t.provider,za=!0;let o=null;Va.forEach(t=>{e.transitModes[t]&&(o=o||t)}),Fa[o].classList.add("TravelNotes-ProvidersToolbarUI-ActiveTransitModeImgButton"),ie.routing.transitMode=o,Va.forEach(t=>{e.transitModes[t]||Fa[t].classList.add("TravelNotes-ProvidersToolbarUI-InactiveImgButton")})}}const Ya=Object.freeze(new class{createUI(e){Wa=e,Ha=b.create("div",{className:"TravelNotes-UI-FlexRowDiv TravelNotes-ProvidersToolbarUI-ImgButtonsDiv"},e),Va.forEach(e=>{Fa[e]=b.create("img",{src:Ka[e],id:"TravelNotes-ProvidersToolbarUI-"+e+"ImgButton",className:"TravelNotes-ProvidersToolbarUI-ImgButton",title:L.getText("ProvidersToolbarUI - "+e),transitMode:e},Ha),Fa[e].addEventListener("click",Za,!1)}),ie.providers&&(za=!1,ie.providers.forEach(qa))}set provider(e){Xa(e)}set transitMode(e){Ja(e)}providersAdded(){Wa.removeChild(Ha),this.createUI(Wa)}});let Qa="geolocation"in navigator?t.inactive:t.disabled,_a=null;function $a(e){we.dispatch("geolocationpositionchanged",{position:e})}function en(){t.active===Qa&&(Qa=t.inactive),we.dispatch("geolocationstatuschanged",{status:Qa}),navigator.geolocation.clearWatch(_a),_a=null}function tn(e){1===e.code&&(Qa=t.refusedByUser),en()}const on=Object.seal(new class{get status(){return Qa}switch(){switch(Qa){case t.inactive:Qa=t.active,we.dispatch("geolocationstatuschanged",{status:Qa}),navigator.geolocation.getCurrentPosition($a,tn,f.geoLocation.options),_a=navigator.geolocation.watchPosition($a,tn,f.geoLocation.options);break;case t.active:en()}return Qa}});let an=null,nn=null,rn=null,ln=null,sn=!1;function dn(){nn&&(clearTimeout(nn),nn=null),ln.classList.remove("TravelNotes-UI-MainDiv-Minimize"),ln.classList.add("TravelNotes-UI-MainDiv-Maximize")}function cn(){ln.classList.remove("TravelNotes-UI-MainDiv-Maximize"),ln.classList.add("TravelNotes-UI-MainDiv-Minimize")}function un(){nn=setTimeout(cn,f.travelEditor.timeout)}function gn(e){e.stopPropagation(),je.setKeysFromDialog()}function vn(e){e.stopPropagation(),on.switch()}function hn(e){sn?(e.target.textContent="📌",ln.addEventListener("mouseenter",dn,!1),ln.addEventListener("mouseleave",un,!1)):(e.target.textContent="❌",ln.removeEventListener("mouseenter",dn,!1),ln.removeEventListener("mouseleave",un,!1)),sn=!sn}const pn=Object.freeze(new class{createUI(e){ln=e,rn=b.create("div",{className:"TravelNotes-UI-FlexRowDiv"},e),b.create("text",{value:"🏠"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:window.location.origin,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Home"},rn))),b.create("text",{value:"?"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:"https://github.com/wwwouaiebe/leaflet.TravelNotes/tree/gh-pages/TravelNotesGuides",target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Help"},rn))),b.create("text",{value:"@"},b.create("a",{className:"TravelNotes-UI-LinkButton",href:f.travelNotesToolbarUI.contactMail.url||window.location.origin,target:"_blank"},b.create("div",{className:"TravelNotes-UI-Button",title:"Contact"},rn))),f.APIKeys.showDialogButton&&b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("TravelNotesToolbarUI - API keys"),textContent:"🔑"},rn).addEventListener("click",gn,!1),t.disabled{e.classList.toggle("TravelNotes-UI-Route-Notes-Row-Hidden")})}function h(e){t=e.target.checked,document.querySelectorAll(".TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Maneuvers-Row-Hidden")})}return Object.freeze(new class{remove(){!function(){document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row, .TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.removeEventListener("contextmenu",c,!1),e.removeEventListener("mouseenter",u,!1),e.removeEventListener("mouseleave",g,!1)});let e=document.querySelector(".TravelNotes-UI-Route-ManeuversAndNotes");e&&a.removeChild(e)}(),i&&(d&&(d.removeEventListener("click",h,!1),i.removeChild(d),d=null),s&&(s.removeEventListener("click",v,!1),i.removeChild(s),s=null),r.removeChild(i),i=null),l&&(r.removeChild(l),l=null)}add(){-1!==ie.editedRouteObjId&&(i=b.create("div",null,r),b.create("text",{value:L.getText("ItineraryPaneUI - Show notes")},i),s=b.create("input",{type:"checkbox",id:"TravelNotes-ItineraryPane-ShowNotesInput",checked:e},i),s.addEventListener("click",v,!1),b.create("text",{value:L.getText("ItineraryPaneUI - Show maneuvers")},i),d=b.create("input",{type:"checkbox",id:"TravelNotes-ItineraryPane-ShowManeuversInput",checked:t},i),d.addEventListener("click",h,!1),l=Pt.getRouteHeaderHTML("TravelNotes-UI-",ie.travel.editedRoute),r.appendChild(l),a.appendChild(Pt.getEditedRouteManeuversAndNotesHTML("TravelNotes-UI-")),document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row, .TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.addEventListener("contextmenu",c,!1),e.addEventListener("mouseenter",u,!1),e.addEventListener("mouseleave",g,!1)}),e||document.querySelectorAll(".TravelNotes-UI-Route-Notes-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Notes-Row-Hidden")}),t||document.querySelectorAll(".TravelNotes-UI-Route-Maneuvers-Row").forEach(e=>{e.classList.toggle("TravelNotes-UI-Route-Maneuvers-Row-Hidden")}))}getId(){return o.itineraryPane}getButtonText(){return L.getText("PanesManagerUI - Itinerary")}setPaneDivs(e,t){a=e,r=t}})}let fn=-1,bn=-1,yn=!1;let wn=null,Nn=null,Tn=null,xn=[];class In{constructor(e,t){this.name=p.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)}}function Ln(){-1===bn?bn=N():we.dispatch("removeobject",{objId:bn});let e=ie.map.getCenter();Nn=ie.map.getBounds();let t=Se.getSquareBoundingBox([e.lat,e.lng],5e3);Nn.getSouthWest().lat=Math.max(Nn.getSouthWest().lat,t.getSouthWest().lat),Nn.getSouthWest().lng=Math.max(Nn.getSouthWest().lng,t.getSouthWest().lng),Nn.getNorthEast().lat=Math.min(Nn.getNorthEast().lat,t.getNorthEast().lat),Nn.getNorthEast().lng=Math.min(Nn.getNorthEast().lng,t.getNorthEast().lng),we.dispatch("addrectangle",{objId:bn,bounds:Nn,properties:f.nextSearchLimit})}function An(e){e.isSelected&&0{o.filterTagsArray.forEach(a=>{(function(e,t){let o=!0;for(const[a,n]of Object.entries(t))o=o&&e.tags[a]&&(e.tags[a]===n||"*"===n);return o})(e,a)&&(e.description=o.name,t.set(e.id,e))})})}function jn(e){let t=new Map,o=new Map,a=new Map,r=new Map;function i(e){e.geometry=[[]],e.lat=n.defaultValue,e.lon=n.defaultValue;let t=0;e.nodes.forEach(a=>{let n=o.get(a);e.geometry[0].push([n.lat,n.lon]),e.lat+=n.lat,e.lon+=n.lon,t++}),0!==t&&(e.lat/=t,e.lon/=t)}e.forEach(e=>{switch(e.type){case"node":o.set(e.id,e);break;case"way":a.set(e.id,e);break;case"relation":r.set(e.id,e)}e.tags&&En(e,t)}),t.forEach(e=>{switch(e.type){case"way":i(e);break;case"relation":!function(e){e.geometry=[[]],e.lat=n.defaultValue,e.lon=n.defaultValue;let t=0;e.members.forEach(o=>{if("way"===o.type){let n=a.get(o.ref);i(n),e.geometry.push(n.geometry[0]),e.lat+=n.lat,e.lon+=n.lon,t++}}),0!==t&&(e.lat/=t,e.lon/=t)}(e)}}),ie.searchData=Array.from(t.values()).sort((e,t)=>e.description>t.description?1:e.description{"fulfilled"===e.status?t=t.concat(e.value.elements):console.log(e.reason)}),jn(t)}const Dn=Object.seal(new class{get dictionary(){return Tn}search(){yn||(yn=!0,xn=[],An(Tn),Promise.allSettled(function(){let e=[];wn=Nn;let t={node:new Map,way:new Map,relation:new Map};xn.forEach(e=>{e.elementTypes.forEach(o=>{e.filterTagsArray.forEach(e=>{t[o].set(e,e)})})});let o={node:"",way:"",relation:""},a="("+Nn.getSouthWest().lat.toFixed(n.fixed)+","+Nn.getSouthWest().lng.toFixed(n.fixed)+","+Nn.getNorthEast().lat.toFixed(n.fixed)+","+Nn.getNorthEast().lng.toFixed(n.fixed)+")";for(const[e,n]of Object.entries(t))n.forEach(t=>{let[n,r]=Object.entries(t)[0];o[e]+=e+"["+n+("*"===r?"":"="+r)+"]"+a+";"});for(const[t,a]of Object.entries(o))if(""!==a){let o=f.overpassApi.url+"?data=[out:json][timeout:40];("+a+");"+("node"===t?"":"(._;>;);")+"out;";e.push(y.getJsonPromise(o))}return e}()).then(Pn))}show(){ie.map.on("zoom",Ln),ie.map.on("move",Ln),Ln(),wn&&(-1===fn?fn=N():we.dispatch("removeobject",{objId:fn}),we.dispatch("addrectangle",{objId:fn,bounds:[[wn.getSouthWest().lat,wn.getSouthWest().lng],[wn.getNorthEast().lat,wn.getNorthEast().lng]],properties:f.previousSearchLimit}))}hide(){let e=we;ie.map.off("zoom",Ln),ie.map.off("move",Ln),-1!==bn&&(e.dispatch("removeobject",{objId:bn}),bn=-1),-1!==fn&&(e.dispatch("removeobject",{objId:fn}),fn=-1)}parseDictionary(e){Tn=new In("All",!0);let t=[Tn.items],o=null,a=null;e.split(/\r\n|\r|\n/).forEach(e=>{""!==e&&function(e){let n=e.split(";");for(;""===n[n.length-1];)n.pop();let r=0,i=null;n.forEach(e=>{if(""!==e)if(-1===e.indexOf("="))a=new In(e),t[r].push(a),t[r+1]=a.items,o=a.filterTagsArray;else{let t=e.split("=");"element"===t[0]?a.elementTypes=[t[1]]:(i=i||{},i[t[0]]=t[1])}r++}),i&&o.push(i)}(e)})}});function Rn(){let e=null,t=null,a=null,r=null,i=null,l=-1,d=0;function c(t){t.stopPropagation(),t.preventDefault();let o=t.target;for(;!o.osmElement;)o=o.parentNode;t.latlng={lat:n.defaultValue,lng:n.defaultValue},t.fromUI=!0,t.originalEvent={clientX:t.clientX,clientY:t.clientY,latLng:[o.osmElement.lat,o.osmElement.lon],osmElement:o.osmElement,geometry:o.osmElement.geometry},function(e,t){let o=Be(),a=ot(e,function(){let t=e.originalEvent.latLng;return[{context:To,name:L.getText("MapContextMenu - Select this point as start point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.first.lat?To.setStartPoint:null,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as way point"),action:-1===ie.editedRouteObjId?null:To.addWayPoint,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as end point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.last.lat?To.setEndPoint:null,param:t},{context:zt,name:L.getText("OsmSearchContextMenu - Create a route note with this result"),action:zt.newSearchNote,param:{osmElement:e.originalEvent.osmElement,isTravelNote:!1}},{context:zt,name:L.getText("OsmSearchContextMenu - Create a travel note with this result"),action:zt.newSearchNote,param:{osmElement:e.originalEvent.osmElement,isTravelNote:!0}},{context:zt,name:zt.osmSearchNoteDialog?L.getText("OsmSearchContextMenu - Hide note dialog"):L.getText("OsmSearchContextMenu - Show note dialog"),action:zt.changeOsmSearchNoteDialog},{context:o,name:L.getText("OsmSearchContextMenu - Zoom to this result"),action:o.zoomToPoi,param:{latLng:e.originalEvent.latLng,geometry:e.originalEvent.geometry}}]}(),t);return Object.seal(a)}(t,e).show()}function u(e){e.stopPropagation(),l=e.target.objId,we.dispatch("addsearchpointmarker",{objId:e.target.objId,latLng:[e.target.osmElement.lat,e.target.osmElement.lon],geometry:e.target.osmElement.geometry})}function g(e){e.stopPropagation(),we.dispatch("removeobject",{objId:e.target.objId})}function v(){document.querySelectorAll(".TravelNotes-OsmSearchPaneUI-SearchResult").forEach(t=>{t.removeEventListener("contextmenu",c,!1),t.removeEventListener("mouseenter",u,!1),t.removeEventListener("mouseleave",g,!1),e.removeChild(t)})}function h(e){d++;let t=b.create("div",{className:"TravelNotes-SearchPaneUI-SearchItem TravelNotes-SearchPaneUI-SearchItemMargin"+d,dictItem:e},i);if(!e.isRoot){b.create("input",{type:"checkbox",checked:e.isSelected},t).addEventListener("change",(function(e){!function e(t,o){t.isSelected=o,t.items.forEach(t=>{e(t,o)})}(e.target.parentNode.dictItem,e.target.checked),i.textContent="",h(Dn.dictionary)}),!1)}if(0===e.filterTagsArray.length){b.create("div",{className:"TravelNotes-UI-Button TravelNotes-OsmSearchPaneUI-TreeArrow",textContent:e.isExpanded?"▼":"▶"},t).addEventListener("click",(function(e){e.target.parentNode.dictItem.isExpanded=!e.target.parentNode.dictItem.isExpanded,i.textContent="",h(Dn.dictionary)}),!1)}b.create("text",{value:e.name},t),e.isExpanded&&e.items.forEach(h),d--}function m(){v(),Dn.dictionary.isExpanded=!1,i.textContent="",h(Dn.dictionary),r=b.create("div",{className:"TravelNotes-WaitAnimation"},t),b.create("div",{className:"TravelNotes-WaitAnimationBullet"},r),Dn.search()}function f(e){e.items.forEach(f),e.isSelected=!1}function y(){f(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function w(e){e.items.forEach(w),e.isExpanded=!0}function T(){w(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function x(e){e.items.forEach(x),e.isRoot||(e.isExpanded=!1)}function I(){x(Dn.dictionary),i.textContent="",h(Dn.dictionary)}function A(e){e.deltaY&&(e.target.scrollTop+=e.deltaY*s[e.deltaMode]),e.stopPropagation()}function E(e,t){t&&b.create("div",{textContent:t},e)}function j(t){let o=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Row",osmElement:t,objId:N()},e),a="";a=t.tags.rcn_ref?"
"+t.tags.rcn_ref+"
":bt.getIconDataFromName(t.description)||"";let n=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-IconCell"},o);p.sanitizeToHtmlElement(a,n);let r=b.create("div",{className:"TravelNotes-OsmSearchPaneUI-SearchResult-Cell"},o);E(r,t.description),E(r,t.tags.name),E(r,t.tags.rcn_ref),E(r,function(e){let t=(e.tags["addr:street"]?(e.tags["addr:housenumber"]?e.tags["addr:housenumber"]+" ":"")+e.tags["addr:street"]+" ":"")+(e.tags["addr:city"]?(e.tags["addr:postcode"]?e.tags["addr:postcode"]+" ":"")+e.tags["addr:city"]:"");return""===t?null:t}(t)),t.tags.phone&&E(r,"☎️ : "+t.tags.phone),t.tags.email&&b.create("a",{href:"mailto:"+t.tags.email,textContent:t.tags.email},b.create("div",{textContent:"📧 : "},r)),t.tags.website&&b.create("a",{href:t.tags.website,target:"_blank",textContent:t.tags.website},b.create("div",null,r)),o.title="";for(const[e,a]of Object.entries(t.tags))o.title+=e+"="+a+"\n";o.addEventListener("contextmenu",c,!1),o.addEventListener("mouseenter",u,!1),o.addEventListener("mouseleave",g,!1)}return Object.freeze(new class{remove(){Dn.hide(),v(),i&&(t.removeChild(i),i=null),a&&t.removeChild(a),r&&(t.removeChild(r),r=null),we.dispatch("removeobject",{objId:l})}add(){Dn.show(),a=b.create("div",null,t),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Search OpenStreetMap"),textContent:"🔎"},a).addEventListener("click",m,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Expand tree"),textContent:"▼"},a).addEventListener("click",T,!1),b.create("div",{className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Collapse tree"),textContent:"▶"},a).addEventListener("click",I,!1),b.create("div",{id:"TravelNotes-OsmSearchPaneUI-ClearAllButton",className:"TravelNotes-UI-Button",title:L.getText("OsmSearchPaneUI - Clear tree"),textContent:"❌"},a).addEventListener("click",y,!1),i=b.create("div",{id:"TravelNotes-OsmSearchPaneUI-SearchTree"},t),i.addEventListener("wheel",A,!1),Dn.dictionary.name="",h(Dn.dictionary),ie.searchData.forEach(j)}getId(){return o.searchPane}getButtonText(){return L.getText("PanesManagerUI - Search")}setPaneDivs(o,a){e=o,t=a}})}let Cn=null;const Mn=Object.freeze(new class{createUI(e){Cn||(Cn=b.create("div",{id:"TravelNotes-UI-MainDiv"},e),b.create("div",{id:"TravelNotes-UI-MainDiv-Title",textContent:"Travel & Notes"},Cn),pn.createUI(Cn),Da.createUI(Cn),Ba.addPane(mn()),Ba.addPane(function(){let e=0,t=null,a=null;function r(t){t.stopPropagation();try{t.dataTransfer.setData("Text",t.target.dataObjId),t.dataTransfer.dropEffect="move"}catch(e){console.log(e)}e=t.target.noteObjId}function i(e){e.preventDefault()}function l(t){t.preventDefault();let o=t.target;for(;!o.noteObjId;)o=o.parentElement;let a=o.getBoundingClientRect();zt.travelNoteDropped(e,o.noteObjId,t.clientY-a.top{e.removeEventListener("contextmenu",s,!1),e.removeEventListener("dragstart",r,!1)}),t.removeChild(a)),a=null}add(){a=Pt.getTravelNotesHTML("TravelNotes-UI-"),a.addEventListener("drop",l,!1),a.addEventListener("dragover",i,!1),t.appendChild(a),a.childNodes.forEach(e=>{e.draggable=!0,e.addEventListener("contextmenu",s,!1),e.addEventListener("dragstart",r,!1),e.classList.add("TravelNotes-UI-MoveCursor")})}getId(){return o.travelNotesPane}getButtonText(){return L.getText("PanesManagerUI - Travel notes")}setPaneDivs(e){t=e}})}()),Ba.addPane(Rn()),Ba.createUI(Cn),Ya.createUI(Cn),Cn.addEventListener("travelnameupdated",()=>Da.setTravelName(),!1),Cn.addEventListener("setrouteslist",()=>Da.setRoutesList(),!1),Cn.addEventListener("showitinerary",()=>Ba.showPane(o.itineraryPane),!1),Cn.addEventListener("updateitinerary",()=>Ba.updatePane(o.itineraryPane),!1),Cn.addEventListener("showtravelnotes",()=>Ba.showPane(o.travelNotesPane),!1),Cn.addEventListener("updatetravelnotes",()=>Ba.updatePane(o.travelNotesPane),!1),Cn.addEventListener("showsearch",()=>Ba.showPane(o.searchPane),!1),Cn.addEventListener("updatesearch",()=>Ba.updatePane(o.searchPane),!1),Cn.addEventListener("providersadded",()=>Ya.providersAdded(),!1),Cn.addEventListener("setprovider",e=>{e.data&&e.data.provider&&(Ya.provider=e.data.provider)},!1),Cn.addEventListener("settransitmode",e=>{e.data&&e.data.provider&&(Ya.transitMode=e.data.transitMode)},!1),document.addEventListener("geolocationstatuschanged",e=>{pn.geoLocationStatusChanged(e.data.status)},!1),Cn.addEventListener("click",e=>{e.target.id&&"TravelNotes-UI-MainDiv"===e.target.id&&(e.stopPropagation(),e.preventDefault())},!1),Cn.addEventListener("dblclick",e=>{e.stopPropagation(),e.preventDefault()},!1),Cn.addEventListener("contextmenu",e=>{e.stopPropagation(),e.preventDefault()},!1),Cn.addEventListener("wheel",e=>{e.stopPropagation(),e.preventDefault()},!1))}});function Sn(){let e=le();e.title=L.getText("AboutDialog - About Travel & Notes");p.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 : 2.1.0.

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

',e.content),e.show().then().catch(e=>console.log(e||"An error occurs in the dialog"))}let On=null;const Un=Object.freeze(new class{getOpenPromise(){return new Promise((function(e,t){if(On)return void e();let o=window.indexedDB.open("TravelNotesDb",1);o.onerror=function(){On=null,t(new Error("Not possible to open the db"))},o.onsuccess=function(t){On=t.target.result,e()},o.onupgradeneeded=function(e){On=e.target.result,On.createObjectStore("Travels",{keyPath:"UUID"})}}))}getReadPromise(e){return new Promise((function(t,o){if(!On)return void o(new Error("Database not opened"));let a=On.transaction(["Travels"],"readonly");a.onerror=function(){o(new Error("Transaction error"))},a.objectStore("Travels").get(e).onsuccess=function(e){t(e.target.result?e.target.result.data:null)}}))}getWritePromise(e,t){return new Promise((function(o,a){if(!On)return void a(new Error("Database not opened"));let n=null;try{n=On.transaction(["Travels"],"readwrite")}catch(e){return void a(e)}n.onerror=function(){a(new Error("Transaction error"))},n.objectStore("Travels").put({UUID:e,data:t}).onsuccess=function(){o()}}))}closeDb(e){if(!On)return;if(!e)return On.close(),void(On=null);let t=On.transaction(["Travels"],"readwrite");t.onerror=function(){};let o=t.objectStore("Travels").delete(e);o.onerror=function(){On.close(),On=null},o.onsuccess=function(){On.close(),On=null}}});let kn=null,Bn=null,Hn=null;function zn(){kn.textContent=Bn+" - Zoom : "+Hn}function Vn(e){Bn=A.formatLat(e.latlng.lat)+" - "+A.formatLng(e.latlng.lng),zn()}function Fn(){Hn=ie.map.getZoom(),zn()}const Wn=Object.freeze(new class{createUI(){Hn=ie.map.getZoom();let e=ie.map.getCenter();Bn=A.formatLat(e.lat)+" - "+A.formatLng(e.lng),kn=b.create("span",null,b.create("div",{id:"TravelNotes-MouseUI"},document.querySelector("body"))),ie.map.on("mousemove",Vn),ie.map.on("zoomend",Fn)}});let Kn=!1;function Jn(){document.addEventListener("routeupdated",e=>{e.data&&$o.updateRoute(e.data.removedRouteObjId,e.data.addedRouteObjId)},!1),document.addEventListener("routepropertiesupdated",e=>{e.data&&$o.updateRouteProperties(e.data.routeObjId)},!1),document.addEventListener("noteupdated",e=>{e.data&&$o.updateNote(e.data.removedNoteObjId,e.data.addedNoteObjId)},!1),document.addEventListener("removeobject",e=>{e.data&&$o.removeObject(e.data.objId)},!1),document.addEventListener("removeallobjects",()=>$o.removeAllObjects(),!1),document.addEventListener("zoomto",e=>{e.data&&Ro.zoomTo(e.data.latLng,e.data.geometry)},!1),document.addEventListener("additinerarypointmarker",e=>{e.data&&$o.addItineraryPointMarker(e.data.objId,e.data.latLng)},!1),document.addEventListener("addsearchpointmarker",e=>{e.data&&$o.addSearchPointMarker(e.data.objId,e.data.latLng,e.data.geometry)},!1),document.addEventListener("addrectangle",e=>{e.data&&$o.addRectangle(e.data.objId,e.data.bounds,e.data.properties)},!1),document.addEventListener("addwaypoint",e=>{e.data&&$o.addWayPoint(e.data.wayPoint,e.data.letter)},!1),document.addEventListener("layerchange",e=>{e.data&&$o.setLayer(e.data.layer)}),document.addEventListener("geolocationpositionchanged",e=>{e.data&&Ro.onGeolocationPositionChanged(e.data.position)},!1),document.addEventListener("geolocationstatuschanged",e=>{e.data&&Ro.onGeolocationStatusChanged(e.data.status)},!1),document.addEventListener("roadbookupdate",()=>{A.storageAvailable("localStorage")&&Un.getOpenPromise().then(()=>{Un.getWritePromise(ie.UUID,Pt.getTravelHTML("TravelNotes-Roadbook-").outerHTML)}).then(()=>localStorage.setItem(ie.UUID,Date.now())).catch(e=>console.log(e||"An error occurs when writing the content"))},!1),document.addEventListener("profileclosed",e=>{e.data&&Kt.onProfileClosed(e.data.objId)},!1)}function Zn(e){ie.travel.readOnly||function(e){let t=[e.latlng.lat,e.latlng.lng],o=Be(),a=ot(e,[{context:To,name:L.getText("MapContextMenu - Select this point as start point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.first.lat?To.setStartPoint:null,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as way point"),action:-1===ie.editedRouteObjId?null:To.addWayPoint,param:t},{context:To,name:L.getText("MapContextMenu - Select this point as end point"),action:-1!==ie.editedRouteObjId&&n.defaultValue===ie.travel.editedRoute.wayPoints.last.lat?To.setEndPoint:null,param:t},{context:wo,name:L.getText("MapContextMenu - Add a route"),action:wo.addRoute},{context:wo,name:L.getText("MapContextMenu - Hide all routes"),action:wo.hideRoutes},{context:wo,name:L.getText("MapContextMenu - Show all routes"),action:wo.showRoutes},{context:zt,name:L.getText("MapContextMenu - New travel note"),action:zt.newTravelNote,param:t},{context:zt,name:L.getText("MapContextMenu - Hide all notes"),action:zt.hideNotes},{context:zt,name:L.getText("MapContextMenu - Show all notes"),action:zt.showNotes},{context:o,name:L.getText("MapContextMenu - Zoom to travel"),action:o.zoomToTravel},{context:null,name:L.getText("MapContextMenu - About Travel & Notes"),action:Sn}]);return Object.seal(a)} /** @------------------------------------------------------------------------------------------------------------------------------ diff --git a/dist/TravelNotesConfig.json b/dist/TravelNotesConfig.json index 0f990967..983e1c4e 100644 --- a/dist/TravelNotesConfig.json +++ b/dist/TravelNotesConfig.json @@ -165,6 +165,7 @@ "sharpRight":340 }, "svgZoom":17, + "svgRcnRefDistance":20, "svgAngleDistance":10, "svgHamletDistance":200, "svgVillageDistance":400, diff --git a/dist/TravelNotesEN.json b/dist/TravelNotesEN.json index 8bbf0369..1ef242c7 100644 --- a/dist/TravelNotesEN.json +++ b/dist/TravelNotesEN.json @@ -699,6 +699,10 @@ "msgid" : "SvgIconFromOsmFactory - Turn sharp right", "msgstr" : "Turn sharp right" }, + { + "msgid" : "SvgIconFromOsmFactory - rcnRef", + "msgstr" : " (node-point {rcnRef})" + }, { "msgid" : "SvgIconFromOsmFactory - entry roundabout", "msgstr" : " to enter the roundabout" diff --git a/dist/TravelNotesFR.json b/dist/TravelNotesFR.json index 6f5b91bc..ffce31f5 100644 --- a/dist/TravelNotesFR.json +++ b/dist/TravelNotesFR.json @@ -699,6 +699,10 @@ "msgid" : "SvgIconFromOsmFactory - Turn sharp right", "msgstr" : "Tourner fortement à droite" }, + { + "msgid" : "SvgIconFromOsmFactory - rcnRef", + "msgstr" : " (point-nœud {rcnRef})" + }, { "msgid" : "SvgIconFromOsmFactory - entry roundabout", "msgstr" : " pour entrer dans le rond-point" diff --git a/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js b/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js index a88bac11..25254aa9 100644 --- a/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js +++ b/dist/TravelNotesProviders/GraphHopperRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 5d0325a2..1429daa1 100644 --- a/dist/TravelNotesProviders/MapboxRouteProvider.min.js +++ b/dist/TravelNotesProviders/MapboxRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 39661d56..47d81390 100644 --- a/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js +++ b/dist/TravelNotesProviders/MapzenValhallaRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 93a77299..7846d018 100644 --- a/dist/TravelNotesProviders/OSRMRouteProvider.min.js +++ b/dist/TravelNotesProviders/OSRMRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 ef5406bc..c32e21d0 100644 --- a/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js +++ b/dist/TravelNotesProviders/OpenRouteServiceRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 8ff67fa7..241936c7 100644 --- a/dist/TravelNotesProviders/PolylineRouteProvider.min.js +++ b/dist/TravelNotesProviders/PolylineRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 eb62f620..bfd2e0ae 100644 --- a/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js +++ b/dist/TravelNotesProviders/PublicTransportRouteProvider.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:43:58+0100 + * Build 00436 - 2021-01-21T17:08:33+0100 * 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 681892b9..984f92d4 100644 --- a/dist/TravelNotesRoadbook.min.js +++ b/dist/TravelNotesRoadbook.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:44:04+0100 + * Build 00436 - 2021-01-21T17:08:39+0100 * 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 0f990967..983e1c4e 100644 --- a/dist/viewer/TravelNotesConfig.json +++ b/dist/viewer/TravelNotesConfig.json @@ -165,6 +165,7 @@ "sharpRight":340 }, "svgZoom":17, + "svgRcnRefDistance":20, "svgAngleDistance":10, "svgHamletDistance":200, "svgVillageDistance":400, diff --git a/dist/viewer/TravelNotesEN.json b/dist/viewer/TravelNotesEN.json index 8bbf0369..1ef242c7 100644 --- a/dist/viewer/TravelNotesEN.json +++ b/dist/viewer/TravelNotesEN.json @@ -699,6 +699,10 @@ "msgid" : "SvgIconFromOsmFactory - Turn sharp right", "msgstr" : "Turn sharp right" }, + { + "msgid" : "SvgIconFromOsmFactory - rcnRef", + "msgstr" : " (node-point {rcnRef})" + }, { "msgid" : "SvgIconFromOsmFactory - entry roundabout", "msgstr" : " to enter the roundabout" diff --git a/dist/viewer/TravelNotesFR.json b/dist/viewer/TravelNotesFR.json index 6f5b91bc..ffce31f5 100644 --- a/dist/viewer/TravelNotesFR.json +++ b/dist/viewer/TravelNotesFR.json @@ -699,6 +699,10 @@ "msgid" : "SvgIconFromOsmFactory - Turn sharp right", "msgstr" : "Tourner fortement à droite" }, + { + "msgid" : "SvgIconFromOsmFactory - rcnRef", + "msgstr" : " (point-nœud {rcnRef})" + }, { "msgid" : "SvgIconFromOsmFactory - entry roundabout", "msgstr" : " pour entrer dans le rond-point" diff --git a/dist/viewer/TravelNotesViewer.min.js b/dist/viewer/TravelNotesViewer.min.js index 1027e133..f54ba12e 100644 --- a/dist/viewer/TravelNotesViewer.min.js +++ b/dist/viewer/TravelNotesViewer.min.js @@ -6,7 +6,7 @@ * JavaScript code in this page. * * leaflet.travelnotes - version 2.1.0 - * Build 00425 - 2021-01-19T22:44:03+0100 + * Build 00436 - 2021-01-21T17:08:38+0100 * Copyright 2017 2021 wwwouaiebe * Contact: https://www.ouaie.be/ * License: GPL-3.0 @@ -41,7 +41,7 @@ @private @------------------------------------------------------------------------------------------------------------------------------ - */const e=Object.freeze({fixed:2,invalid:-1,defaultValue:0}),t=Object.freeze({refusedByUser:-1,disabled:0,inactive:1,active:2}),o=(Object.freeze({invalidPane:"43a6a53e-008a-4910-80a6-7a87d301ea15",itineraryPane:"8fbf0da7-4e6f-4bc7-8e20-1388461ccde7",travelNotesPane:"dffe782b-07df-4b81-a318-f287c0cf5ec6",searchPane:"228f00d7-43a8-4c13-897d-70400cb6dd58"}),Object.freeze({fixed:2,defaultValue:0})),a=Object.freeze({defaultValue:0,fixed:6}),n=Object.freeze({notEdited:0,editedNoChange:1,editedChanged:2}),i=Object.freeze({margin:100,height:500,width:1e3,yDeltaText:30,xDeltaText:10,vScales:[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3],hScales:[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3,1e4,2e4,5e4,1e5]}),r=Object.freeze({width:40,height:40,svgViewboxDim:200}),s="http://www.w3.org/2000/svg";let l=new Map;l.set("a",["href","target"]),l.set("div",[]),l.set("del",[]),l.set("em",[]),l.set("figcaption",[]),l.set("figure",[]),l.set("h1",[]),l.set("h2",[]),l.set("h3",[]),l.set("h4",[]),l.set("h5",[]),l.set("h6",[]),l.set("hr",[]),l.set("img",["src","alt","width","height"]),l.set("ins",[]),l.set("li",[]),l.set("mark",[]),l.set("ol",[]),l.set("p",[]),l.set("s",[]),l.set("small",[]),l.set("strong",[]),l.set("span",[]),l.set("sub",[]),l.set("sup",[]),l.set("ul",[]),l.set("svg",["xmlns","viewBox","class"]),l.set("text",["x","y","text-anchor"]),l.set("polyline",["points","class","transform"]);const c=window.location.protocol,d=new DOMParser;function u(e){return e.replaceAll(//g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}function h(e,t="href"){let o=d.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let a=o.querySelector("body").firstChild,n="";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,""),n!==e)return{url:"",errorsString:"Invalid characters found in the url"};let i=["https:"];if("http:"!==c&&"href"!==t||i.push("http:"),"href"===t){i.push("mailto:"),i.push("sms:"),i.push("tel:");let e=n.match(/^#\w*/);if(e&&n===e[0])return{url:n,errorsString:""}}"src"===t&&i.push("data:");let r=null;try{r=new URL(n)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(-1===i.indexOf(r.protocol))return{url:"",errorsString:"Invalid protocol "+r.protocol};if(-1!==["sms:","tel:"].indexOf(r.protocol)&&r.pathname.match(/^\+[0-9,*,#]*$/))return{url:n,errorsString:""};try{encodeURIComponent(r.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:n,errorsString:""}}const g=Object.freeze(new class{sanitizeToColor(e){let t=e.match(/^#[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t){return h(e,t)}sanitizeToJsString(e){return function(e){let t=d.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.querySelector("body").firstChild,a="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),a}(e)}sanitizeToHtmlElement(e,t){!function(e,t){let o=d.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?function e(t,o){let a=t.childNodes;for(let n=0;n{if(t)a.hasAttributeNS(null,e)&&(n.setAttributeNS(null,e,a.getAttribute(e)),a.removeAttributeNS(null,e));else if(a.hasAttribute(e))if("href"===e||"src"===e){let t=h(a.getAttribute(e),e).url;""!==t&&n.setAttribute(e,t)}else n.setAttribute(e,a.getAttribute(e))}),a.hasAttribute("style")){a.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.appendChild(n),e(a,n)}else"#text"===i&&o.appendChild(document.createTextNode(a.nodeValue))}}(o.querySelector("body").firstChild,t):t.textContent=""}(e,t)}sanitizeToHtmlString(e){return function(e){let t="",o="",a=d.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return a&&"#document"===a.nodeName?(function e(a){let n=a.childNodes;for(let i=0;i{if(a)n.hasAttributeNS(null,e)&&(t+=" "+e+'="'+u(n.getAttribute(e))+'"',n.removeAttribute(e));else if(n.hasAttribute(e))if("href"===e||"src"===e){let a=h(n.getAttribute(e),e).url;""===a?o+="\nAn invalid url ("+n.getAttribute(e)+") was removed from a "+e+" attribute":t+=" "+e+'="'+a+'"',n.removeAttribute(e)}else t+=" "+e+'="'+u(n.getAttribute(e))+'"',n.removeAttribute(e)}),t+=">",e(n),t+=""}else"#text"===r?t+=u(n.nodeValue):o+="\nAn invalid tag "+r+" was removed";if(n.hasAttributes)for(let e=0;e/g,">").replaceAll(/"/g,""").replaceAll(/\u0027/g,"'").replaceAll(/\u0a00/g," ")}function h(e,t="href"){let o=d.parseFromString("
"+e+"
","text/html");if(!o||"#document"!==o.nodeName)return{url:"",errorsString:"Parsing error"};let a=o.querySelector("body").firstChild,n="";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,""),n!==e)return{url:"",errorsString:"Invalid characters found in the url"};let i=["https:"];if("http:"!==c&&"href"!==t||i.push("http:"),"href"===t){i.push("mailto:"),i.push("sms:"),i.push("tel:");let e=n.match(/^#\w*/);if(e&&n===e[0])return{url:n,errorsString:""}}"src"===t&&i.push("data:");let r=null;try{r=new URL(n)}catch(e){return{url:"",errorsString:"Invalid url string"}}if(-1===i.indexOf(r.protocol))return{url:"",errorsString:"Invalid protocol "+r.protocol};if(-1!==["sms:","tel:"].indexOf(r.protocol)&&r.pathname.match(/^\+[0-9,*,#]*$/))return{url:n,errorsString:""};try{encodeURIComponent(r.href)}catch(e){return{url:"",errorsString:"Invalid character in url"}}return{url:n,errorsString:""}}const g=Object.freeze(new class{sanitizeToColor(e){let t=e.match(/^#[0-9,A-F,a-f]{6}$/);return t?t[0]:null}sanitizeToUrl(e,t){return h(e,t)}sanitizeToJsString(e){return function(e){let t=d.parseFromString("
"+e+"
","text/html");if(!t||"#document"!==t.nodeName)return"";let o=t.querySelector("body").firstChild,a="";for(let e=0;e/g,"≻").replaceAll(/"/g,"″").replaceAll(/\u0027/g,"′"),a}(e)}sanitizeToHtmlElement(e,t){!function(e,t){let o=d.parseFromString("
"+e+"
","text/html");o&&"#document"===o.nodeName?function e(t,o){let a=t.childNodes;for(let n=0;n{if(t)a.hasAttributeNS(null,e)&&(n.setAttributeNS(null,e,a.getAttribute(e)),a.removeAttributeNS(null,e));else if(a.hasAttribute(e))if("href"===e||"src"===e){let t=h(a.getAttribute(e),e).url;""!==t&&n.setAttribute(e,t)}else n.setAttribute(e,a.getAttribute(e))}),a.hasAttribute("style")){a.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.appendChild(n),e(a,n)}else"#text"===i&&o.appendChild(document.createTextNode(a.nodeValue))}}(o.querySelector("body").firstChild,t):t.textContent=""}(e,t)}sanitizeToHtmlString(e){return function(e){let t="",o="",a=d.parseFromString("
"+e.replace(" ","਀")+"
","text/html");return a&&"#document"===a.nodeName?(function e(a){let n=a.childNodes;for(let i=0;i{if(a)n.hasAttributeNS(null,e)&&(t+=" "+e+'="'+u(n.getAttribute(e))+'"',n.removeAttribute(e));else if(n.hasAttribute(e))if("href"===e||"src"===e){let a=h(n.getAttribute(e),e).url;""===a?o+="\nAn invalid url ("+n.getAttribute(e)+") was removed from a "+e+" attribute":t+=" "+e+'="'+a+'"',n.removeAttribute(e)}else t+=" "+e+'="'+u(n.getAttribute(e))+'"',n.removeAttribute(e)}),t+=">",e(n),t+=""}else"#text"===r?t+=u(n.nodeValue):o+="\nAn invalid tag "+r+" was removed";if(n.hasAttributes)for(let e=0;e