@raruto/leaflet-elevation 2.3.4 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["/**\r\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\r\n **/\r\nexport const Colors = {\r\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\r\n\t'magenta' : { area: '#FF005E' },\r\n\t'yellow' : { area: '#FF0' },\r\n\t'purple' : { area: '#732C7B' },\r\n\t'steelblue': { area: '#4682B4' },\r\n\t'red' : { area: '#F00' },\r\n\t'lime' : { area: '#9CC222', line: '#566B13' }\r\n};\r\n\r\nconst SEC = 1000;\r\nconst MIN = SEC * 60;\r\nconst HOUR = MIN * 60;\r\nconst DAY = HOUR * 24;\r\n\r\nexport function resolveURL(src, baseUrl) {\r\n\treturn (new URL(src, (src.startsWith('../') || src.startsWith('./')) ? baseUrl : undefined)).toString()\r\n};\r\n\r\n/**\r\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\r\n */\r\nexport function formatTime(t) {\r\n\tlet d = Math.floor(t / DAY);\r\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\r\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\r\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\r\n\tif ( s === 60 ) { m++; s = 0; }\r\n\tif ( m === 60 ) { h++; m = 0; }\r\n\tif ( h === 24 ) { d++; h = 0; }\r\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\r\n}\r\n\r\n/**\r\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\r\n */\r\n export function formatDate(format) {\r\n\tif (!format) {\r\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\r\n\t} else if (format == 'time') {\r\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\r\n\t} else if (format == 'date') {\r\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\r\n\t}\r\n\treturn (time) => format(time);\r\n}\r\n\r\n/**\r\n * Generate download data event.\r\n */\r\n export function saveFile(dataURI, fileName) {\r\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\r\n\tlet b = document.body;\r\n\tb.appendChild(a);\r\n\ta.click();\r\n\tb.removeChild(a);\r\n}\r\n\r\n\r\n/**\r\n * Convert SVG Path into Path2D and then update canvas\r\n */\r\n export function drawCanvas(ctx, path) {\r\n\tpath.classed('canvas-path', true);\r\n\r\n\tctx.beginPath();\r\n\tctx.moveTo(0, 0);\r\n\tlet p = new Path2D(path.attr('d'));\r\n\r\n\tctx.strokeStyle = path.attr('stroke');\r\n\tctx.fillStyle = path.attr('fill');\r\n\tctx.lineWidth = 1.25;\r\n\tctx.globalCompositeOperation = 'source-over';\r\n\r\n\t// stroke opacity\r\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\r\n\tctx.stroke(p);\r\n\r\n\t// fill opacity\r\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\r\n\tctx.fill(p);\r\n\r\n\tctx.globalAlpha = 1;\r\n\r\n\tctx.closePath();\r\n}\r\n\r\n/**\r\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\r\n */\r\nexport function coordPropsToMeta(coordProps, name, parser) {\r\n\treturn coordProps && (({props, point, id, isMulti }) => {\r\n\t\tif (props) {\r\n\t\t\tfor (const key of coordProps) {\r\n\t\t\t\tif (key in props) {\r\n\t\t\t\t\tpoint.meta[name] = (parser || parseNumeric).call(this, (isMulti ? props[key][isMulti] : props[key]), id);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Extract numeric property (id) from GeoJSON object\r\n */\r\nexport const parseNumeric = (property, id) => parseInt((typeof property === 'object' ? property[id] : property));\r\n\r\n/**\r\n * Extract datetime property (id) from GeoJSON object\r\n */\r\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\r\n\r\n/**\r\n * A little bit shorter than L.DomUtil\r\n */\r\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\r\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\r\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\r\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\r\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\r\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\r\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\r\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\r\nexport const create = (tag, str, attrs, n) => { let elem = L.DomUtil.create(tag, str || \"\"); if (attrs) setAttributes(elem, attrs); if (n) append(n, elem); return elem; };\r\nexport const append = (n, c) => n.appendChild(c);\r\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\r\nexport const select = (str, n) => (n || document).querySelector(str);\r\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\r\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\r\n\r\n/**\r\n * TODO: use generators instead? (ie. \"yield\")\r\n */\r\nexport const iMax = (iVal, max = -Infinity) => (iVal > max ? iVal : max); \r\nexport const iMin = (iVal, min = +Infinity) => (iVal < min ? iVal : min);\r\nexport const iAvg = (iVal, avg = 0, idx = 1) => (iVal + avg * (idx - 1)) / idx;\r\nexport const iSum = (iVal, sum = 0) => iVal + sum;\r\n\r\n/**\r\n * Alias for some leaflet core functions\r\n */\r\nexport const { on, off } = L.DomEvent;\r\nexport const { throttle, wrapNum } = L.Util;\r\nexport const { hasClass } = L.DomUtil;\r\n\r\n/**\r\n * Limit floating point precision\r\n */\r\nexport const round = L.Util.formatNum;\r\n\r\n/**\r\n * Limit a number between min / max values\r\n */\r\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\r\n\r\n/**\r\n * Limit a delta difference between two values\r\n */\r\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\r\n\r\nexport var Options = {\r\n\tautofitBounds: true,\r\n\tautohide: false,\r\n\tautohideMarker: true,\r\n\talmostover: true,\r\n\taltitude: true,\r\n\tcloseBtn: true,\r\n\tcollapsed: false,\r\n\tdetached: true,\r\n\tdistance: true,\r\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\r\n\tdragging: !L.Browser.mobile,\r\n\tdownloadLink: 'link',\r\n\televationDiv: \"#elevation-div\",\r\n\tedgeScale: { bar: true, icon: false, coords: false },\r\n\tfollowMarker: true,\r\n\timperial: false,\r\n\tlegend: true,\r\n\thandlers: [\"Distance\", \"Time\", \"Altitude\", \"Slope\", \"Speed\", \"Acceleration\"],\r\n\thotline: 'elevation',\r\n\tmarker: 'elevation-line',\r\n\tmarkerIcon: L.divIcon({\r\n\t\tclassName: 'elevation-position-marker',\r\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\r\n\t\ticonSize: [32, 32],\r\n\t\ticonAnchor: [16, 16],\r\n\t}),\r\n\tposition: \"topright\",\r\n\tpolyline: {\r\n\t\tclassName: 'elevation-polyline',\r\n\t\tcolor: '#000',\r\n\t\topacity: 0.75,\r\n\t\tweight: 5,\r\n\t\tlineCap: 'round'\r\n\t},\r\n\tpolylineSegments: {\r\n\t\tclassName: 'elevation-polyline-segments',\r\n\t\tcolor: '#F00',\r\n\t\tinteractive: false,\r\n\t},\r\n\tpreferCanvas: false,\r\n\treverseCoords: false,\r\n\truler: true,\r\n\ttheme: \"lightblue-theme\",\r\n\tsummary: 'inline',\r\n\tslope: false,\r\n\tspeed: false,\r\n\ttime: true,\r\n\ttimeFactor: 3600,\r\n\ttimestamps: false,\r\n\ttrkStart: { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false },\r\n\ttrkEnd: { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false },\r\n\twaypoints: true,\r\n\twptIcons: {\r\n\t\t'': L.divIcon({\r\n\t\t\tclassName: 'elevation-waypoint-marker',\r\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\r\n\t\t\ticonSize: [30, 30],\r\n\t\t\ticonAnchor: [8, 30],\r\n\t\t}),\r\n\t},\r\n\twptLabels: true,\r\n\txAttr: \"dist\",\r\n\txLabel: \"km\",\r\n\tyAttr: \"z\",\r\n\tyLabel: \"m\",\r\n\tzFollow: false,\r\n\tzooming: !L.Browser.Mobile,\r\n\r\n\t// Quite uncommon and undocumented options\r\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\r\n\theight: (screen.height * 0.3) || 200,\r\n\twidth: (screen.width * 0.6) || 600,\r\n\txTicks: undefined,\r\n\tyTicks: undefined,\r\n\r\n\tdecimalsX: 2,\r\n\tdecimalsY: 0,\r\n\tforceAxisBounds: false,\r\n\tinterpolation: \"curveLinear\",\r\n\tyAxisMax: undefined,\r\n\tyAxisMin: undefined,\r\n\r\n\t// Prevent CORS issues for relative locations (dynamic import)\r\n\tsrcFolder: ((document.currentScript && document.currentScript.src) || (import.meta && import.meta.url)).split(\"/\").slice(0,-1).join(\"/\") + '/',\r\n};\r\n","import * as _ from './utils';\r\nimport { Options } from './options';\r\n\r\n// \"leaflet-i18n\" fallback\r\nif (!L._ || !L.i18n) {\r\n\tL._ = L.i18n = (string, data) => string;\r\n}\r\n\r\nexport const Elevation = L.Control.Elevation = L.Control.extend({\r\n\r\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\r\n\r\n\toptions: Options,\r\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\r\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\r\n\t__D3: 'https://unpkg.com/d3@7.8.4/dist/d3.min.js',\r\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@5.6.0/dist/togeojson.umd.js',\r\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.10.1/src/leaflet.geometryutil.js',\r\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\r\n\t__LHOTLINE: '../libs/leaflet-hotline.min.js',\r\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\r\n\t__LEDGESCALE: '../libs/leaflet-edgescale.min.js',\r\n\t__LCHART: '../src/components/chart.js',\r\n\t__LMARKER: '../src/components/marker.js',\r\n\t__LSUMMARY: '../src/components/summary.js',\r\n\t__modulesFolder: '../src/handlers/',\r\n\t__btnIcon: '../images/elevation.svg',\r\n\r\n\t/*\r\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\r\n\t */\r\n\taddData(d, layer) {\r\n\t\tthis.import(this.__D3)\r\n\t\t\t.then(() => {\r\n\t\t\t\tif (this._modulesLoaded) {\r\n\t\t\t\t\tlayer = layer ?? (d.on && d);\r\n\t\t\t\t\tthis._addData(d);\r\n\t\t\t\t\tthis._addLayer(layer);\r\n\t\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.once('modules_loaded', () => this.addData(d,layer));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Adds the control to the given map.\r\n\t */\r\n\taddTo(map) {\r\n\t\tif (this.options.detached) {\r\n\t\t\tlet parent = _.select(this.options.elevationDiv);\r\n\t\t\tlet eleDiv = this.onAdd(map);\r\n\t\t\tparent ? _.append(parent, eleDiv) : _.insert(map.getContainer(), eleDiv, 'afterend');\r\n\t\t} else {\r\n\t\t\tL.Control.prototype.addTo.call(this, map);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/*\r\n\t * Reset data and display\r\n\t */\r\n\tclear() {\r\n\t\tif (this._marker) this._marker.remove();\r\n\t\tif (this._chart) this._clearChart();\r\n\t\tif (this._layers) this._clearLayers(this._layers);\r\n\t\tif (this._markers) this._clearLayers(this._markers);\r\n\t\tif (this._circleMarkers) this._circleMarkers.remove();\r\n\t\tif (this._hotline) this._hotline.eachLayer(l => l.options.renderer.remove()); // hotfix for: https://github.com/Raruto/leaflet-elevation/issues/233\r\n\t\tif (this._hotline) this._clearLayers(this._hotline);\r\n\r\n\t\tthis._data = [];\r\n\t\tthis.track_info = {};\r\n\r\n\t\tthis._fireEvt(\"eledata_clear\");\r\n\r\n\t\tthis._updateChart();\r\n\t},\r\n\r\n\t_clearChart() {\r\n\t\tif (this._events && this._events.elechart_updated) {\r\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\r\n\t\t}\r\n\t\tif (this._chart && this._chart._container) {\r\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\r\n\t\t\tthis._chart.clear();\r\n\t\t}\r\n\t},\r\n\r\n\t_clearLayers(l) {\r\n\t\tl = l || this._layers;\r\n\t\tif (l && l.eachLayer) {\r\n\t\t\tl.eachLayer(f => f.remove())\r\n\t\t\tl.clearLayers();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\r\n\t * \r\n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\r\n\t */\r\n\t// addHandler: function (name, HandlerClass) {\r\n\t// \tif (HandlerClass) {\r\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\r\n\t// \t\tthis.handlers.push(handler);\r\n\t// \t\tif (this.options[name]) {\r\n\t// \t\t\thandler.enable();\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \treturn this;\r\n\t// },\r\n\r\n\t/**\r\n\t * Disable chart brushing.\r\n\t */\r\n\tdisableBrush() {\r\n\t\tthis._chart._brushEnabled = false;\r\n\t\tthis._resetDrag();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart brushing.\r\n\t */\r\n\tenableBrush() {\r\n\t\tthis._chart._brushEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Disable chart zooming.\r\n\t */\r\n\tdisableZoom() {\r\n\t\tthis._chart._zoomEnabled = false;\r\n\t\tthis._chart._resetZoom();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart zooming.\r\n\t */\r\n\tenableZoom() {\r\n\t\tthis._chart._zoomEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Sets a map view that contains the given geographical bounds.\r\n\t */\r\n\tfitBounds(bounds) {\r\n\t\tbounds = bounds || this.getBounds();\r\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\r\n\t},\r\n\r\n\tgetBounds(data) {\r\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\r\n\t},\r\n\r\n\t/**\r\n\t * Get default zoom level (followMarker: true).\r\n\t */\r\n\tgetZFollow() {\r\n\t\treturn this.options.zFollow;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\thide() {\r\n\t\t_.style(this._container, \"display\", \"none\");\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize chart control \"options\" and \"container\".\r\n\t */\r\n\tinitialize(opts) {\r\n\r\n\t\t// opts = L.setOptions(this, opts);\r\n\r\n\t\t// Fixes: https://github.com/Raruto/leaflet-elevation/pull/240\r\n\t\topts = L.setOptions(this, L.extend({}, structuredClone(Options), opts)); // \"deep copy\" nested objects (multiple charts)\r\n\r\n\t\tthis._data = [];\r\n\t\tthis._layers = L.featureGroup();\r\n\t\tthis._markers = L.featureGroup();\r\n\t\tthis._hotline = L.featureGroup();\r\n\t\tthis._circleMarkers = L.featureGroup();\r\n\t\tthis._markedSegments = L.polyline([]);\r\n\t\tthis._start = L.circleMarker([0,0], (opts.trkStart || Options.trkStart));\r\n\t\tthis._end = L.circleMarker([0,0], (opts.trkEnd || Options.trkEnd));\r\n\t\tthis._chartEnabled = true;\r\n\t\tthis._yCoordMax = -Infinity;\r\n\t\tthis.track_info = {};\r\n\t\t// this.handlers = [];\r\n\r\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\r\n\t\tif (opts.legend) opts.margins.bottom += 30;\r\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\r\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\r\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\r\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\r\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\r\n\r\n\r\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\r\n\r\n\t\t// Leaflet canvas renderer colors\r\n\t\tL.extend(_.Colors, opts.colors || {});\r\n\r\n\t\t// Various stuff\r\n\t\tthis._fixCanvasPaths();\r\n\t\tthis._fixTooltipSize();\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Javascript scripts downloader (lazy loader)\r\n\t */\r\n\timport(src, condition) {\r\n\t\tswitch(src) {\r\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\r\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\r\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\r\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\r\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\r\n\t\t\tcase this.__LEDGESCALE: condition = typeof L.Control.EdgeScale !== 'function'; break;\r\n\t\t\tcase this.__LHOTLINE: condition = typeof L.Hotline !== 'function'; break;\r\n\t\t}\r\n\t\treturn condition !== false ? import(_.resolveURL(src, this.options.srcFolder)) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\r\n\t */\r\n\tload(data) {\r\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\r\n\t},\r\n\r\n\t/**\r\n\t * Create container DOM element and related event listeners.\r\n\t * Called on control.addTo(map).\r\n\t */\r\n\tonAdd(map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control \" + this.options.theme + \" \" + (this.options.detached ? 'elevation-detached' : 'leaflet-control'), this.options.detached ? { id: 'elevation-' + _.randomId() } : {});\r\n\r\n\t\tif (!this.eleDiv) this.eleDiv = container;\r\n\r\n\t\tthis._loadModules(this.options.handlers).then(() => { // Inject here required modules (data handlers)\r\n\t\t\tthis._initChart(container);\r\n\t\t\tthis._initButton(container);\r\n\t\t\tthis._initSummary(container);\r\n\t\t\tthis._initMarker(map);\r\n\t\t\tthis._initLayer(map);\r\n\t\t\tthis._modulesLoaded = true;\r\n\t\t\tthis.fire('modules_loaded');\r\n\t\t});\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\t/**\r\n\t * Clean up control code and related event listeners.\r\n\t * Called on control.remove().\r\n\t */\r\n\tonRemove(map) {\r\n\t\tthis._container = null;\r\n\r\n\t\tmap\r\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t.off('resize', this._resetView, this)\r\n\t\t\t.off('resize', this._resizeChart, this)\r\n\t\t\t.off('mousedown', this._resetDrag, this);\r\n\r\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\tthis\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\tthis.fire('remove');\r\n\t},\r\n\r\n\t/**\r\n\t * Redraws the chart control. Sometimes useful after screen resize.\r\n\t */\r\n\tredraw() {\r\n\t\tthis._resizeChart();\r\n\t},\r\n\r\n\t/**\r\n\t * Set default zoom level (followMarker: true).\r\n\t */\r\n\tsetZFollow(zoom) {\r\n\t\tthis.options.zFollow = zoom;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\tshow() {\r\n\t\t_.style(this._container, \"display\", \"block\");\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\r\n\t */\r\n\t_addData(d) {\r\n\t\tif (!d) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Standard GeoJSON\r\n\t\tif (d.type === \"FeatureCollection\" ) {\r\n\t\t\treturn _.each(d.features, feature => this._addData(feature));\r\n\t\t} else if (d.type === \"Feature\") {\r\n\t\t\tlet geom = d.geometry;\r\n\t\t\tif (geom) {\r\n\t\t\t\tswitch (geom.type) {\r\n\t\t\t\t\tcase 'LineString':\t\treturn this._addGeoJSONData(geom.coordinates, d.properties);\r\n\t\t\t\t\tcase 'MultiLineString':\treturn _.each(geom.coordinates, (coords, i) => this._addGeoJSONData(coords, d.properties, i));\r\n\t\t\t\t\tcase 'Point':\r\n\t\t\t\t\tdefault:\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fallback for leaflet layers (eg. L.Gpx)\r\n\t\tif (d._latlngs) {\r\n\t\t\treturn this._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\r\n\t */\r\n\t_addGeoJSONData(coords, properties, nestingLevel) {\r\n\r\n\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\r\n\t\tlet props = (properties && properties.coordinateProperties) || properties;\r\n\r\n\t\tcoords.forEach((point, i) => {\r\n\r\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\r\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\r\n\t\t\t\r\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\r\n\r\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i, isMulti: nestingLevel });\r\n\r\n\t\t\tthis._addPoint(\r\n\t\t\t\tpoint.lat ?? point[1], \r\n\t\t\t\tpoint.lng ?? point[0],\r\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\r\n\t\t\t);\r\n\r\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\r\n\r\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\r\n\t},\r\n\r\n\t/*\r\n\t * Parse and push a single (x, y, z) point to current elevation profile.\r\n\t */\r\n\t_addPoint(x, y, z) {\r\n\t\tif (this.options.reverseCoords) {\r\n\t\t\t[x, y] = [y, x];\r\n\t\t}\r\n\r\n\t\tthis._data.push({\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z,\r\n\t\t\tlatlng: L.latLng(x, y, z)\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\r\n\t},\r\n\r\n\t_addLayer(layer) {\r\n\t\tif (layer) this._layers.addLayer(layer)\r\n\t\t// Postpone adding the distance markers (lazy: true)\r\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\r\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\r\n\t\t}\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_addMarker(marker) {\r\n\t\tif (marker) this._markers.addLayer(marker)\r\n\t\treturn marker;\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" integration\r\n\t */\r\n\t_initAlmostOverHandler(map, layer) {\r\n\t\treturn (map && this.options.almostOver && !L.Browser.mobile) ? Promise.all([\r\n\t\t\tthis.import(this.__LGEOMUTIL),\r\n\t\t\tthis.import(this.__LALMOSTOVER)\r\n\t\t]).then(() => {\r\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\r\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\r\n\t\t\t\tmap.almostOver.addLayer(layer);\r\n\t\t\t\tmap\r\n\t\t\t\t\t.on('almost:move', this._onMouseMoveLayer, this)\r\n\t\t\t\t\t.on('almost:out', this._onMouseOut, this);\r\n\t\t\t\tthis.once('eledata_clear', () => {\r\n\t\t\t\t\tmap.almostOver.removeLayer(layer);\r\n\t\t\t\t\tmap\r\n\t\t\t\t\t.off('almost:move', this._onMouseMoveLayer, this)\r\n\t\t\t\t\t.off('almost:out', this._onMouseOut, this);\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.DistanceMarkers\" integration\r\n\t */\r\n\t_initDistanceMarkers() {\r\n\t\treturn this.options.distanceMarkers ? Promise.all([this.import(this.__LGEOMUTIL), this.import(this.__LDISTANCEM)]) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.Control.EdgeScale\" integration\r\n\t */\r\n\t_initEdgeScale(map) {\r\n\t\treturn this.options.edgeScale ? Promise.all([this.import(this.__LEDGESCALE)])\r\n\t\t\t.then(() => {\r\n\t\t\t\tmap.edgeScaleControl = map.edgeScaleControl || L.control.edgeScale('boolean' !== typeof this.options.edgeScale ? this.options.edgeScale : {}).addTo(map);\r\n\t\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t_initHotLine(layer) {\r\n\t\tlet prop = typeof this.options.hotline == 'string' ? this.options.hotline : 'elevation';\r\n\t\treturn this.options.hotline ? this.import(this.__LHOTLINE)\r\n\t\t\t.then(() => {\r\n\t\t\t\tlayer.eachLayer((trkseg) => {\r\n\t\t\t\t\tif(trkseg.feature.geometry.type != \"Point\") {\r\n\t\t\t\t\t\tlet geo = L.geoJson(trkseg.toGeoJSON(), { coordsToLatLng: (coords) => L.latLng(coords[0], coords[1], coords[2] * (this.options.altitudeFactor || 1))});\r\n\t\t\t\t\t\tlet line = L.hotline(geo.toGeoJSON().features[0].geometry.coordinates, {\r\n\t\t\t\t\t\t\trenderer: L.Hotline.renderer(),\r\n\t\t\t\t\t\t\tmin: isFinite(this.track_info[prop + '_min']) ? this.track_info[prop + '_min'] : 0,\r\n\t\t\t\t\t\t\tmax: isFinite(this.track_info[prop + '_max']) ? this.track_info[prop + '_max'] : 1,\r\n\t\t\t\t\t\t\tpalette: {\r\n\t\t\t\t\t\t\t\t0.0: '#008800',\r\n\t\t\t\t\t\t\t\t0.5: '#ffff00',\r\n\t\t\t\t\t\t\t\t1.0: '#ff0000'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tweight: 5,\r\n\t\t\t\t\t\t\toutlineColor: '#000000',\r\n\t\t\t\t\t\t\toutlineWidth: 1\r\n\t\t\t\t\t\t}).addTo(this._hotline);\r\n\t\t\t\t\t\tlet alpha = trkseg.options.style && trkseg.options.style.opacity || 1;\r\n\t\t\t\t\t\ttrkseg.on('add remove', ({type}) => {\r\n\t\t\t\t\t\t\ttrkseg.setStyle({opacity: (type == 'add' ? 0 : alpha)});\r\n\t\t\t\t\t\t\tline[(type == 'add' ? 'addTo' : 'removeFrom')](trkseg._map);\r\n\t\t\t\t\t\t\tif (line._renderer) line._renderer._container.parentElement.insertBefore(line._renderer._container, line._renderer._container.parentElement.firstChild);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\r\n\t */\r\n\t_initMapIntegrations(layer) {\r\n\t\tlet map = this._map;\r\n\t\tif (map) {\r\n\t\t\tif (this._data.length) {\r\n\t\t\t\tthis._start.setLatLng(this._data[0].latlng);\r\n\t\t\t\tthis._end.setLatLng(this._data[this._data.length -1].latlng);\r\n\t\t\t}\r\n\t\t\tPromise.all([\r\n\t\t\t\tthis._initHotLine(layer),\r\n\t\t\t\tthis._initAlmostOverHandler(map, layer),\r\n\t\t\t\tthis._initDistanceMarkers(),\r\n\t\t\t\tthis._initEdgeScale(map),\r\n\t\t\t]).then(() => {\r\n\t\t\t\tif (this.options.polyline) {\r\n\t\t\t\t\tthis._layers.addLayer(layer.addTo(map)); // hotfix for: https://github.com/Raruto/leaflet-elevation/issues/233\r\n\t\t\t\t\tthis._circleMarkers.addTo(map);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.options.autofitBounds) {\r\n\t\t\t\t\tthis.fitBounds(layer.getBounds());\r\n\t\t\t\t}\r\n\t\t\t\tmap.invalidateSize();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.once('add', () => this._initMapIntegrations(layer));\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Collapse current chart control.\r\n\t */\r\n\t_collapse() {\r\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/*\r\n\t * Expand current chart control.\r\n\t */\r\n\t_expand() {\r\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/**\r\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\r\n\t */\r\n\t_fixCanvasPaths() {\r\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\r\n\t\tlet control = this;\r\n\r\n\t\tlet theme = this.options.theme.split(' ')[0].replace('-theme', '');\r\n\t\tlet color = _.Colors[theme] || {};\r\n\r\n\t\tL.Canvas.include({\r\n\t\t\t_fillStroke(ctx, layer) {\r\n\t\t\t\tif (control._layers.hasLayer(layer)) {\r\n\r\n\t\t\t\t\tlet options = layer.options;\r\n\r\n\t\t\t\t\toptions.color = color.line || color.area || theme;\r\n\t\t\t\t\toptions.stroke = !!options.color;\r\n\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\r\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\r\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\r\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\r\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\r\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\r\n\t\t\t\t\t\tctx.stroke();\r\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Partial fix for initial tooltip size\r\n\t * \r\n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\r\n\t */\r\n\t_fixTooltipSize() {\r\n\t\tthis.on('elechart_init', () =>\r\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\r\n\t\t\t\tif (this._chartEnabled) {\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t}\r\n\t\t\t\tthis._updateMarker(data);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given LatLng\r\n\t */\r\n\t_findItemForLatLng(latlng) {\r\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given xDiagCoord\r\n\t */\r\n\t_findItemForX(x) {\r\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\r\n\t},\r\n\r\n\t/**\r\n\t * Fires an event of the specified type.\r\n\t */\r\n\t_fireEvt(type, data, propagate) {\r\n\t\tif (this.fire) this.fire(type, data, propagate);\r\n\t\tif (this._map) this._map.fire(type, data, propagate);\r\n\t},\r\n\r\n\t/*\r\n\t * Hides the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_hideMarker() {\r\n\t\tif (this.options.autohideMarker) {\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Generate \"svg\" chart (DOM element).\r\n\t */\r\n\t_initChart(container) {\r\n\t\tlet opts = this.options;\r\n\t\tlet map = this._map;\r\n\r\n\t\tif (opts.detached) {\r\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\r\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\r\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\r\n\t\t} else {\r\n\t\t\tlet { clientWidth } = map.getContainer();\r\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\r\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\r\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\r\n\t\t}\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LCHART)\r\n\t\t]).then((m) => {\r\n\r\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\td3\r\n\t\t\t\t.select(container)\r\n\t\t\t\t.call(chart.render())\r\n\t\r\n\t\t\tchart\r\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\r\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\r\n\t\t\t\t.on('dragged', this._onDragEnd, this)\r\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\r\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\r\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\r\n\t\t\t\t.on('zoom', this._updateChart, this)\r\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\r\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\r\n\t\r\n\t\r\n\t\t\tthis.fire(\"elechart_init\");\r\n\r\n\t\t\tmap\r\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t\t.on('resize', this._resetView, this)\r\n\t\t\t\t.on('resize', this._resizeChart, this)\r\n\t\t\t\t.on('rotate', this._rotateMarker, this)\r\n\t\t\t\t.on('mousedown', this._resetDrag, this);\r\n\r\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\t\tthis\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\t\tthis._updateChart();\r\n\t\t\tthis._updateSummary();\r\n\t\t});\r\n\r\n\r\n\t},\r\n\r\n\t_initLayer() {\r\n\t\tthis._layers\r\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\r\n\t\t\t\tlet node = layer.getElement && layer.getElement();\r\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\r\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\r\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\r\n\t\t\t});\r\n\t},\r\n\r\n\t_initMarker(map) {\r\n\t\tlet pane = map.getPane('elevationPane');\r\n\t\tif (!pane) {\r\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\r\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\r\n\t\t\tpane.style.pointerEvents = 'none';\r\n\t\t}\r\n\r\n\t\tif (this._renderer) this._renderer.remove()\r\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LMARKER)\r\n\t\t]).then((m) => {\r\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\r\n\t\t\tthis.fire(\"elechart_marker\");\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Inspired by L.Control.Layers\r\n\t */\r\n\t_initButton(container) {\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(container)\r\n\t\t\t.disableScrollPropagation(container);\r\n\r\n\t\tthis.options.collapsed ? this._collapse() : this._expand();\r\n\r\n\t\tif (this.options.autohide) {\r\n\t\t\t_.on(container, 'mouseover', this._expand, this);\r\n\t\t\t_.on(container, 'mouseout', this._collapse, this);\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.closeBtn) {\r\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle-icon\", { href: '#', title: L._('Elevation'), }, container);\r\n\t\t\t_.on(link, 'click', L.DomEvent.stop);\r\n\t\t\t_.on(link, 'click', this._toggle, this);\r\n\t\t\t_.on(link, 'focus', this._toggle, this);\r\n\t\t\tfetch(_.resolveURL(this.__btnIcon, this.options.srcFolder)).then(r => r.ok && r.text().then(img => link.innerHTML = img));\r\n\t\t}\r\n\t},\r\n\r\n\t_initSummary(container) {\r\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\r\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\r\n\r\n\t\t\tthis.on('elechart_init', () => {\r\n\t\t\t\td3.select(container).call(this._summary.render());\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Retrieve data from a remote url (HTTP).\r\n\t */\r\n\t_loadFile(url) {\r\n\t\tfetch(url)\r\n\t\t\t.then((response) => response.text())\r\n\t\t\t.then((data) => {\r\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\r\n\t\t\t\tthis._parseFromString(data)\r\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\r\n\t\t\t}).catch((err) => console.warn(err));\r\n\t},\r\n\r\n\t/**\r\n\t * Dynamically import only required javascript modules (code splitting)\r\n\t */\r\n\t_loadModules(handlers) {\r\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\r\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof Elevation[h] !== \"undefined\" ? Elevation[h] : h);\r\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\r\n\t\tlet modules = handlers.map(file => (typeof file === 'string' && this.import(this.__modulesFolder + file.toLowerCase() + '.js')) || (file instanceof Promise && file) || Promise.resolve());\r\n\t\treturn Promise.all(modules).then((m) => {\r\n\t\t\t_.each(m, (exported, i) => {\r\n\t\t\t\tlet fn = exported && Object.keys(exported)[0];\r\n\t\t\t\tif (fn) {\r\n\t\t\t\t\thandlers[i] = Elevation[fn] = (Elevation[fn] ?? exported[fn]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_.each(handlers, h => [\"function\", \"object\"].includes(typeof h) && this._registerHandler(h));\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON data loader (L.GeoJSON).\r\n\t */\r\n\t_loadLayer(geojson) {\r\n\t\tlet { polyline, theme, waypoints, wptIcons, wptLabels, distanceMarkers } = this.options;\r\n\t\tlet style = L.extend({}, polyline);\r\n\r\n\t\tif (theme) {\r\n\t\t\tstyle.className += ' ' + theme;\r\n\t\t}\r\n\r\n\t\tif (geojson.name) {\r\n\t\t\tthis.track_info.name = geojson.name;\r\n\t\t}\r\n\r\n\t\tlet layer = L.geoJson(geojson, {\r\n\t\t\tdistanceMarkers: distanceMarkers,\r\n\t\t\tstyle: style,\r\n\t\t\tpointToLayer: (feature, latlng) => {\r\n\t\t\t\tif (waypoints) {\r\n\t\t\t\t\tlet { desc, name, sym } = feature.properties;\r\n\t\t\t\t\tdesc = desc || '';\r\n\t\t\t\t\tname = name || '';\r\n\t\t\t\t\t// Handle chart waypoints (dots)\r\n\t\t\t\t\tif ([true, 'dots'].includes(waypoints)) {\r\n\t\t\t\t\t\tthis._registerCheckPoint({\r\n\t\t\t\t\t\t\tlatlng: latlng,\r\n\t\t\t\t\t\t\tlabel : ([true, 'dots'].includes(wptLabels) ? name : '')\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Handle map waypoints (markers)\r\n\t\t\t\t\tif ([true, 'markers'].includes(waypoints) && wptIcons != false) {\r\n\t\t\t\t\t\treturn this._registerMarker({\r\n\t\t\t\t\t\t\tlatlng : latlng,\r\n\t\t\t\t\t\t\tsym : (sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase(),\r\n\t\t\t\t\t\t\tcontent: [true, 'markers'].includes(wptLabels) && (name || desc) && decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''))\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonEachFeature: (feature, layer) => feature.geometry && feature.geometry.type != 'Point' && this.addData(feature, layer),\r\n\t\t});\r\n\r\n\t\tthis.import(this.__D3).then(() => {\r\n\t\t\tthis._initMapIntegrations(layer);\r\n\t\t\tthis._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info });\r\n\t\t});\r\n\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_onDragEnd({ dragstart, dragend}) {\r\n\t\tthis._hideMarker();\r\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\r\n\r\n\t\tthis.fire(\"elechart_dragged\");\r\n\t},\r\n\r\n\t_onKeyDown({key}) {\r\n\t\tif(!this.options.detached && key === \"Escape\"){\r\n\t\t\tthis._collapse()\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Trigger mouseenter event.\r\n\t */\r\n\t_onMouseEnter() {\r\n\t\tthis.fire('elechart_enter');\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseover the chart and displays distance and altitude level.\r\n\t */\r\n\t_onMouseMove({xCoord}) {\r\n\t\tif (this._chartEnabled && this._data.length) {\r\n\t\t\tlet item = this._findItemForX(xCoord);\r\n\t\t\tif (item) {\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\t\t\tthis._setMapView(item);\r\n\r\n\t\t\t\tif (this._map) {\r\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles mouseover events of the data layers on the map.\r\n\t */\r\n\t_onMouseMoveLayer({latlng}) {\r\n\t\tif (this._data.length) {\r\n\t\t\tlet item = this._findItemForLatLng(latlng);\r\n\t\t\tif (item) {\r\n\t\t\t\tlet xCoord = item.xDiagCoord;\r\n\t\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\t\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseout over the chart.\r\n\t */\r\n\t_onMouseOut() {\r\n\t\tif (!this.options.detached) {\r\n\t\t\tthis._hideMarker();\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t}\r\n\r\n\t\tif (this._map) {\r\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t}\r\n\r\n\t\tthis.fire(\"elechart_leave\");\r\n\t},\r\n\r\n\t/**\r\n\t * Handles the drag event over the ruler filter.\r\n\t */\r\n\t_onRulerFilter({coords}) {\r\n\t\tthis._updateMapSegments(coords);\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle chart data on legend click\r\n\t */\r\n\t_onToggleChart({ name, enabled }) {\r\n\r\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\r\n\r\n\t\t// toggle layer visibility on empty chart\r\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\r\n\r\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\r\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\r\n\r\n\t\t// remove marker on empty chart\r\n\t\tif (!this._chartEnabled) {\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON Parser\r\n\t */\r\n\t_parseFromGeoJSONString(data) {\r\n\t\ttry {\r\n\t\t\treturn JSON.parse(data);\r\n\t\t} catch (e) { }\r\n\t},\r\n\r\n\t/**\r\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\r\n\t */\r\n\t_parseFromString(data) {\r\n\t\treturn new Promise(resolve =>\r\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\r\n\t\t\t\tlet geojson;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\r\n\t\t\t\t}\r\n\t\t\t\tif (geojson) {\r\n\t\t\t\t\tgeojson.name = geojson.name || (this._downloadURL || '').split('/').pop().split('#')[0].split('?')[0];\r\n\t\t\t\t}\r\n\t\t\t\tresolve(geojson);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Simple XML Parser (GPX, KML, TCX)\r\n\t */\r\n\t_parseFromXMLString(data) {\r\n\t\tif (data.indexOf(\"<\") != 0) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\r\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\r\n\t\tlet name = xml.getElementsByTagName('name');\r\n\t\tif (xml.getElementsByTagName('parsererror').length) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tif (!(type in toGeoJSON)) {\r\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\r\n\t\t}\r\n\t\tlet geojson = toGeoJSON[type](xml);\r\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\r\n\t\treturn geojson;\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart profile to diagram\r\n\t */\r\n\t_registerAreaPath(props) {\r\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart grid to diagram\r\n\t */\r\n\t_registerAxisGrid(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart axis to diagram\r\n\t */\r\n\t_registerAxisScale(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add a point of interest over the diagram\r\n\t */\r\n\t_registerCheckPoint(props) {\r\n\t\tconst cb = () => this._chart._registerCheckPoint(props);\r\n\t\tthis\r\n\t\t\t.on(\"elechart_updated\", cb)\r\n\t\t\t.once(\"eledata_clear\", () => this.off(\"elechart_updated\", cb));\r\n\t},\r\n\r\n\t/**\r\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\r\n\t */\r\n\t _registerDataAttribute(props) {\r\n\r\n\t\t// parse of \"coordinateProperties\" for later usage\r\n\t\tif (props.coordPropsToMeta) {\r\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\r\n\t\t}\r\n\r\n\t\t// prevent excessive variabile instanstations\r\n\t\tlet i, curr, prev, attr = props.attr || props.name;\r\n\r\n\t\t// save here a reference to last used point\r\n\t\tlet lastValid = {};\r\n\r\n\t\t// iteration\r\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\r\n\t\t\ti = index;\r\n\r\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\r\n\t\t\tcurr = this._data[i];\r\n\r\n\t\t\t// retrieve point value\r\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\r\n\r\n\t\t\t// check and fix missing data on last added point\r\n\t\t\tif (i > 0 && isNaN(prev[attr])) {\r\n\t\t\t\tif (!isNaN(lastValid[attr]) && !isNaN(curr[attr])) {\r\n\t\t\t\t\tprev[attr] = (lastValid[attr] + curr[attr]) / 2;\r\n\t\t\t\t} else if (!isNaN(lastValid[attr])) {\r\n\t\t\t\t\tprev[attr] = lastValid[attr];\r\n\t\t\t\t} else if (!isNaN(curr[attr])) {\r\n\t\t\t\t\tprev[attr] = curr[attr];\r\n\t\t\t\t}\r\n\t\t\t\t// update \"yAttr\" and \"xAttr\"\r\n\t\t\t\tif (props.meta) {\r\n\t\t\t\t\tprev[props.meta] = prev[attr];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// skip to next iteration for invalid or missing data (eg. i == 0)\r\n\t\t\tif (isNaN(curr[attr])) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// update reference to last used point\r\n\t\t\tlastValid[attr] = curr[attr];\r\n\r\n\t\t\t// Limit \"crazy\" delta values.\r\n\t\t\tif (props.deltaMax) {\r\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Range of acceptable values.\r\n\t\t\tif (props.clampRange) {\r\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\r\n\t\t\t}\r\n\r\n\t\t\t// Limit floating point precision.\r\n\t\t\tif (!isNaN(props.decimals)) {\r\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\r\n\t\t\t}\r\n\r\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\r\n\t\t\tif (props.stats) {\r\n\t\t\t\tfor (const key in props.stats) {\r\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\r\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key], this._data.length);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\r\n\t\t\tif (props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Parse a module definition and attach related function listeners\r\n\t */\r\n\t_registerHandler(props) {\r\n\r\n\t\t// eg. L.Control.Altitude\r\n\t\tif (typeof props === \"function\") {\r\n\t\t\treturn this._registerHandler(props.call(this));\r\n\t\t}\r\n\r\n\t\tlet {\r\n\t\t\tname,\r\n\t\t\tattr,\r\n\t\t\trequired,\r\n\t\t\tdeltaMax,\r\n\t\t\tclampRange,\r\n\t\t\tdecimals,\r\n\t\t\tmeta,\r\n\t\t\tunit,\r\n\t\t\tcoordinateProperties,\r\n\t\t\tcoordPropsToMeta,\r\n\t\t\tpointToAttr,\r\n\t\t\tonPointAdded,\r\n\t\t\tstats,\r\n\t\t\tstatsName,\r\n\t\t\tgrid,\r\n\t\t\tscale,\r\n\t\t\tpath,\r\n\t\t\ttooltip,\r\n\t\t\tsummary\r\n\t\t} = props;\r\n\r\n\t\t// eg. \"altitude\" == true\r\n\t\tif (this.options[name] || required) {\r\n\r\n\t\t\tthis._registerDataAttribute({\r\n\t\t\t\tname,\r\n\t\t\t\tattr,\r\n\t\t\t\tmeta,\r\n\t\t\t\tdeltaMax,\r\n\t\t\t\tclampRange,\r\n\t\t\t\tdecimals,\r\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(coordinateProperties, meta || name, coordPropsToMeta),\r\n\t\t\t\tpointToAttr,\r\n\t\t\t\tonPointAdded,\r\n\t\t\t\tstats,\r\n\t\t\t\tstatsName,\r\n\t\t\t});\r\n\r\n\t\t\tif (grid) {\r\n\t\t\t\tthis._registerAxisGrid(L.extend({ name }, grid));\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options[name] !== \"summary\") {\r\n\t\t\t\tif (scale) this._registerAxisScale(L.extend({ name, label: unit }, scale));\r\n\t\t\t\tif (path) this._registerAreaPath(L.extend({ name }, path));\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltip || props.tooltips) {\r\n\t\t\t\t_.each([tooltip, ...(props.tooltips || [])], t => t && this._registerTooltip(L.extend({ name }, t)));\r\n\t\t\t}\r\n\r\n\t\t\tif (summary) {\r\n\t\t\t\t_.each(summary, (s, k) => summary[k] = L.extend({ unit }, s));\r\n\t\t\t\tthis._registerSummary(summary);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_registerMarker({latlng, sym, content}) {\r\n\t\tlet { wptIcons } = this.options;\r\n\t\t// generate and cache appropriate icon symbol\r\n\t\tif (!wptIcons.hasOwnProperty(sym)) {\r\n\t\t\twptIcons[sym] = L.divIcon(L.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } ));\r\n\t\t}\r\n\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\r\n\t\tif (content) {\r\n\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\r\n\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\r\n\t\t}\r\n\t\treturn this._addMarker(marker)\r\n\t},\r\n\t\r\n\t/**\r\n\t * Add chart or marker tooltip info\r\n\t */\r\n\t_registerTooltip(props) {\r\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\r\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\r\n\t},\r\n\r\n\t/**\r\n\t * Add summary info to diagram\r\n\t */\r\n\t_registerSummary(props) {\r\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\r\n\t},\r\n\r\n\t/*\r\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\r\n\t */\r\n\t_resetDrag() {\r\n\t\tthis._chart._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t},\r\n\r\n\t/**\r\n\t * Resets drag, marker and bounds.\r\n\t */\r\n\t_resetView() {\r\n\t\tif (this._map && this._map._isFullscreen) return;\r\n\t\tthis._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t\tif (this.options.autofitBounds) {\r\n\t\t\tthis.fitBounds();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\r\n\t */\r\n\t_resizeChart() {\r\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\r\n\t\t\tlet opts = this.options;\r\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\r\n\t\t\tif (newWidth) {\r\n\t\t\t\topts.width = newWidth;\r\n\t\t\t\tif (this._chart && this._chart._chart) {\r\n\t\t\t\t\tthis._chart._chart._resize(opts);\r\n\t\t\t\t\tthis._updateChart();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis._updateMapSegments();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Collapse or Expand chart control.\r\n\t */\r\n\t_toggle() {\r\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\r\n\t},\r\n\r\n\t/**\r\n\t * Update map center and zoom (followMarker: true)\r\n\t */\r\n\t_setMapView(item) {\r\n\t\tif (this._map && this.options.followMarker) {\r\n\t\t\tlet zoom = this._map.getZoom();\r\n\t\t\tlet z = this.options.zFollow;\r\n\t\t\tif (typeof z === \"number\") {\r\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\r\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\r\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates [x, y] domain and then update chart.\r\n\t */\r\n\t_updateChart() {\r\n\t\tif (this._chart && this._container) {\r\n\t\t\tthis.fire(\"elechart_axis\");\r\n\t\r\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\tthis.fire('elechart_updated');\t\t\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Update the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_updateMarker(item) {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update({\r\n\t\t\t\tmap : this._map,\r\n\t\t\t\titem : item,\r\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\r\n\t\t\t\toptions : this.options\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fix marker rotation on rotated maps\r\n\t */\r\n\t_rotateMarker() {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Highlight track segments on the map.\r\n\t */\r\n\t_updateMapSegments(coords) {\r\n\t\tthis._markedSegments.setLatLngs(coords || []);\r\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\r\n\t\t\tthis._markedSegments.addTo(this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Update chart summary.\r\n\t */\r\n\t_updateSummary() {\r\n\t\tif (this._summary) {\r\n\t\t\tthis._summary.reset();\r\n\t\t\tif (this.options.summary) {\r\n\t\t\t\tthis.fire(\"elechart_summary\");\r\n\t\t\t\tthis._summary.update();\r\n\t\t\t}\r\n\t\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\r\n\t\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\r\n\t\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\r\n\t\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\r\n\t\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\r\n\t\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\r\n\t\t\t\t\t\tevent.confirm();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.fire('eletrack_download', event);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Calculates chart width.\r\n\t */\r\n\t_width() {\r\n\t\tif (this._chart) return this._chart._width();\r\n\t\tconst { width, margins } = this.options;\r\n\t\treturn width - margins.left - margins.right;\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates chart height.\r\n\t */\r\n\t_height() {\r\n\t\tif (this._chart) return this._chart._height();\r\n\t\tconst { height, margins } = this.options;\r\n\t\treturn height - margins.top - margins.bottom;\r\n\t},\r\n\r\n});\r\n","/*\r\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\r\n *\r\n * This file is free software: you may copy, redistribute and/or modify it\r\n * under the terms of the GNU General Public License as published by the\r\n * Free Software Foundation, either version 2 of the License, or (at your\r\n * option) any later version.\r\n *\r\n * This file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n * This file incorporates work covered by the following copyright and\r\n * permission notice:\r\n *\r\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\r\n *\r\n * Permission to use, copy, modify, and/or distribute this software\r\n * for any purpose with or without fee is hereby granted, provided\r\n * that the above copyright notice and this permission notice appear\r\n * in all copies.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\r\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\r\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\r\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\r\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\r\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\r\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n */\r\n\r\nimport * as _ from './utils';\r\nimport { Elevation } from './control';\r\n\r\nElevation.Utils = _;\r\n\r\nL.control.elevation = (options) => new Elevation(options);\r\n"],"names":["Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","resolveURL","src","baseUrl","URL","startsWith","undefined","toString","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","isMulti","key","meta","parseNumeric","call","this","property","parseInt","addClass","n","str","split","every","s","L","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","substr","on","off","DomEvent","throttle","wrapNum","Util","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","t","d","floor","h","m","padStart","iVal","avg","idx","max","Infinity","min","sum","parse","Options","autofitBounds","autohide","autohideMarker","almostover","altitude","closeBtn","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","Browser","mobile","downloadLink","elevationDiv","edgeScale","bar","icon","coords","followMarker","imperial","legend","handlers","hotline","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","margins","top","right","bottom","left","height","screen","width","xTicks","yTicks","decimalsX","decimalsY","forceAxisBounds","interpolation","yAxisMax","yAxisMin","srcFolder","currentScript","url","location","require","pathToFileURL","__filename","baseURI","slice","join","_","i18n","string","data","Elevation","Control","extend","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LHOTLINE","__LDISTANCEM","__LEDGESCALE","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","__btnIcon","addData","layer","import","then","_modulesLoaded","_addData","_addLayer","_fireEvt","track_info","once","addTo","map","parent","_.select","eleDiv","onAdd","_.append","_.insert","getContainer","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_hotline","eachLayer","l","renderer","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","structuredClone","featureGroup","_markedSegments","_start","circleMarker","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","EdgeScale","Hotline","_.resolveURL","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","_.randomId","_loadModules","_initChart","_initButton","_initSummary","_initMarker","_initLayer","fire","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","console","warn","_latlngs","nestingLevel","coordinateProperties","ele","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","removeLayer","_initDistanceMarkers","_initEdgeScale","edgeScaleControl","control","_initHotLine","prop","trkseg","geo","geoJson","coordsToLatLng","altitudeFactor","isFinite","palette","outlineColor","outlineWidth","_renderer","parentElement","insertBefore","firstChild","_initMapIntegrations","setLatLng","invalidateSize","_collapse","_.replaceClass","_expand","oldProto","Canvas","_fillStroke","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","fetch","r","ok","text","img","innerHTML","_summary","Summary","response","_downloadURL","catch","err","modules","file","toLowerCase","exported","Object","keys","_registerHandler","pointToLayer","desc","sym","_registerCheckPoint","label","_registerMarker","content","decodeURI","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","pop","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","cb","_registerDataAttribute","lastValid","pointToAttr","isNaN","_.wrapDelta","clampRange","_.clamp","decimals","_.round","stats","sname","statsName","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","hasOwnProperty","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","elevation"],"mappings":"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"}
1
+ {"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["/**\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\n **/\nexport const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\nexport function resolveURL(src, baseUrl) {\n\treturn (new URL(src, (src.startsWith('../') || src.startsWith('./')) ? baseUrl : undefined)).toString()\n};\n\n/**\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\n */\n export function formatDate(format) {\n\tif (!format) {\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (format == 'time') {\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (format == 'date') {\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\n\t}\n\treturn (time) => format(time);\n}\n\n/**\n * Generate download data event.\n */\n export function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n\n/**\n * Convert SVG Path into Path2D and then update canvas\n */\n export function drawCanvas(ctx, path) {\n\tpath.classed('canvas-path', true);\n\n\tctx.beginPath();\n\tctx.moveTo(0, 0);\n\tlet p = new Path2D(path.attr('d'));\n\n\tctx.strokeStyle = path.attr('stroke');\n\tctx.fillStyle = path.attr('fill');\n\tctx.lineWidth = 1.25;\n\tctx.globalCompositeOperation = 'source-over';\n\n\t// stroke opacity\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\tctx.stroke(p);\n\n\t// fill opacity\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\tctx.fill(p);\n\n\tctx.globalAlpha = 1;\n\n\tctx.closePath();\n}\n\n/**\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\n */\nexport function coordPropsToMeta(coordProps, name, parser) {\n\treturn coordProps && (({props, point, id, isMulti }) => {\n\t\tif (props) {\n\t\t\tfor (const key of coordProps) {\n\t\t\t\tif (key in props) {\n\t\t\t\t\tpoint.meta[name] = (parser || parseNumeric).call(this, (isMulti ? props[key][isMulti] : props[key]), id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Extract numeric property (id) from GeoJSON object\n */\nexport const parseNumeric = (property, id) => parseInt((typeof property === 'object' ? property[id] : property));\n\n/**\n * Extract datetime property (id) from GeoJSON object\n */\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\n\n/**\n * A little bit shorter than L.DomUtil\n */\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\nexport const create = (tag, str, attrs, n) => { let elem = L.DomUtil.create(tag, str || \"\"); if (attrs) setAttributes(elem, attrs); if (n) append(n, elem); return elem; };\nexport const append = (n, c) => n.appendChild(c);\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\nexport const select = (str, n) => (n || document).querySelector(str);\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\n\n/**\n * TODO: use generators instead? (ie. \"yield\")\n */\nexport const iMax = (iVal, max = -Infinity) => (iVal > max ? iVal : max); \nexport const iMin = (iVal, min = +Infinity) => (iVal < min ? iVal : min);\nexport const iAvg = (iVal, avg = 0, idx = 1) => (iVal + avg * (idx - 1)) / idx;\nexport const iSum = (iVal, sum = 0) => iVal + sum;\n\n/**\n * Alias for some leaflet core functions\n */\nexport const { on, off } = L.DomEvent;\nexport const { throttle, wrapNum } = L.Util;\nexport const { hasClass } = L.DomUtil;\n\n/**\n * Limit floating point precision\n */\nexport const round = L.Util.formatNum;\n\n/**\n * Limit a number between min / max values\n */\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\n\n/**\n * Limit a delta difference between two values\n */\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;\n\n/**\n * A deep copy implementation that takes care of correct prototype chain and cycles, references\n * \n * @see https://web.dev/structured-clone/#features-and-limitations\n */\nexport function cloneDeep(o, skipProps = [], cache = []) {\n\tswitch(!o || typeof o) {\n\t\tcase 'object':\n\t\t\tconst hit = cache.filter(c => o === c.original)[0];\n\t\t\tif (hit) return hit.copy; // handle circular structures\n\t\t\tconst copy = Array.isArray(o) ? [] : Object.create(Object.getPrototypeOf(o));\n\t\t\tcache.push({ original: o, copy });\n\t\t\tObject\n\t\t\t\t.getOwnPropertyNames(o)\n\t\t\t\t.forEach(function (prop) {\n\t\t\t\t\tconst propdesc = Object.getOwnPropertyDescriptor(o, prop);\n\t\t\t\t\tObject.defineProperty(\n\t\t\t\t\t\tcopy,\n\t\t\t\t\t\tprop,\n\t\t\t\t\t\tpropdesc.get || propdesc.set\n\t\t\t\t\t\t\t? propdesc // just copy accessor properties\n\t\t\t\t\t\t\t: { // deep copy data properties\n\t\t\t\t\t\t\t\twritable: propdesc.writable,\n\t\t\t\t\t\t\t\tconfigurable: propdesc.configurable,\n\t\t\t\t\t\t\t\tenumerable: propdesc.enumerable,\n\t\t\t\t\t\t\t\tvalue: skipProps.includes(prop) ? propdesc.value : cloneDeep(propdesc.value, skipProps, cache),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\treturn copy;\n\t\tcase 'function':\n\t\tcase 'symbol':\n\t\t\tconsole.warn('cloneDeep: ' + typeof o + 's not fully supported:', o);\n\t\tcase true:\n\t\t\t// null, undefined or falsy primitive\n\t\tdefault:\n\t\t\treturn o;\n\t}\n}","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: false,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcloseBtn: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tedgeScale: { bar: true, icon: false, coords: false },\n\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [\"Distance\", \"Time\", \"Altitude\", \"Slope\", \"Speed\", \"Acceleration\"],\n\thotline: 'elevation',\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\ttheme: \"lightblue-theme\",\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\ttime: true,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false },\n\ttrkEnd: { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false },\n\twaypoints: true,\n\twptIcons: {\n\t\t'': L.divIcon({\n\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\n\t\t\ticonSize: [30, 30],\n\t\t\ticonAnchor: [8, 30],\n\t\t}),\n\t},\n\twptLabels: true,\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\tyAttr: \"z\",\n\tyLabel: \"m\",\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n\n\t// Quite uncommon and undocumented options\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: (screen.height * 0.3) || 200,\n\twidth: (screen.width * 0.6) || 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Prevent CORS issues for relative locations (dynamic import)\n\tsrcFolder: ((document.currentScript && document.currentScript.src) || (import.meta && import.meta.url)).split(\"/\").slice(0,-1).join(\"/\") + '/',\n};\n","import * as _ from './utils';\nimport { Options } from './options';\n\n// \"leaflet-i18n\" fallback\nif (!L._ || !L.i18n) {\n\tL._ = L.i18n = (string, data) => string;\n}\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\n\t__D3: 'https://unpkg.com/d3@7.8.4/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@5.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.10.1/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LHOTLINE: '../libs/leaflet-hotline.min.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\n\t__LEDGESCALE: '../libs/leaflet-edgescale.min.js',\n\t__LCHART: '../src/components/chart.js',\n\t__LMARKER: '../src/components/marker.js',\n\t__LSUMMARY: '../src/components/summary.js',\n\t__modulesFolder: '../src/handlers/',\n\t__btnIcon: '../images/elevation.svg',\n\n\t/*\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\n\t */\n\taddData(d, layer) {\n\t\tthis.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tif (this._modulesLoaded) {\n\t\t\t\t\tlayer = layer ?? (d.on && d);\n\t\t\t\t\tthis._addData(d);\n\t\t\t\t\tthis._addLayer(layer);\n\t\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t\t} else {\n\t\t\t\t\tthis.once('modules_loaded', () => this.addData(d,layer));\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet parent = _.select(this.options.elevationDiv);\n\t\t\tlet eleDiv = this.onAdd(map);\n\t\t\tparent ? _.append(parent, eleDiv) : _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers(this._layers);\n\t\tif (this._markers) this._clearLayers(this._markers);\n\t\tif (this._circleMarkers) this._circleMarkers.remove();\n\t\tif (this._hotline) this._hotline.eachLayer(l => l.options.renderer.remove()); // hotfix for: https://github.com/Raruto/leaflet-elevation/issues/233\n\t\tif (this._hotline) this._clearLayers(this._hotline);\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\n\t\tthis._updateChart();\n\t},\n\n\t_clearChart() {\n\t\tif (this._events && this._events.elechart_updated) {\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\n\t\t}\n\t\tif (this._chart && this._chart._container) {\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\n\t\t\tthis._chart.clear();\n\t\t}\n\t},\n\n\t_clearLayers(l) {\n\t\tl = l || this._layers;\n\t\tif (l && l.eachLayer) {\n\t\t\tl.eachLayer(f => f.remove())\n\t\t\tl.clearLayers();\n\t\t}\n\t},\n\n\t/**\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\n\t * \n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\n\t */\n\t// addHandler: function (name, HandlerClass) {\n\t// \tif (HandlerClass) {\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\n\t// \t\tthis.handlers.push(handler);\n\t// \t\tif (this.options[name]) {\n\t// \t\t\thandler.enable();\n\t// \t\t}\n\t// \t}\n\t// \treturn this;\n\t// },\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds(data) {\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level (followMarker: true).\n\t */\n\tgetZFollow() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize(opts) {\n\n\t\t// opts = L.setOptions(this, opts);\n\n\t\t// Fixes: https://github.com/Raruto/leaflet-elevation/pull/240\n\t\topts = L.setOptions(this, L.extend({}, _.cloneDeep(Options), opts)); // \"deep copy\" nested objects (multiple charts)\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._hotline = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = L.circleMarker([0,0], (opts.trkStart || Options.trkStart));\n\t\tthis._end = L.circleMarker([0,0], (opts.trkEnd || Options.trkEnd));\n\t\tthis._chartEnabled = true;\n\t\tthis._yCoordMax = -Infinity;\n\t\tthis.track_info = {};\n\t\t// this.handlers = [];\n\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\n\t\tif (opts.legend) opts.margins.bottom += 30;\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\n\n\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(_.Colors, opts.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\timport(src, condition) {\n\t\tswitch(src) {\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\n\t\t\tcase this.__LEDGESCALE: condition = typeof L.Control.EdgeScale !== 'function'; break;\n\t\t\tcase this.__LHOTLINE: condition = typeof L.Hotline !== 'function'; break;\n\t\t}\n\t\treturn condition !== false ? import(_.resolveURL(src, this.options.srcFolder)) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control \" + this.options.theme + \" \" + (this.options.detached ? 'elevation-detached' : 'leaflet-control'), this.options.detached ? { id: 'elevation-' + _.randomId() } : {});\n\n\t\tif (!this.eleDiv) this.eleDiv = container;\n\n\t\tthis._loadModules(this.options.handlers).then(() => { // Inject here required modules (data handlers)\n\t\t\tthis._initChart(container);\n\t\t\tthis._initButton(container);\n\t\t\tthis._initSummary(container);\n\t\t\tthis._initMarker(map);\n\t\t\tthis._initLayer(map);\n\t\t\tthis._modulesLoaded = true;\n\t\t\tthis.fire('modules_loaded');\n\t\t});\n\n\t\tthis.fire('add');\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\tthis.fire('remove');\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Standard GeoJSON\n\t\tif (d.type === \"FeatureCollection\" ) {\n\t\t\treturn _.each(d.features, feature => this._addData(feature));\n\t\t} else if (d.type === \"Feature\") {\n\t\t\tlet geom = d.geometry;\n\t\t\tif (geom) {\n\t\t\t\tswitch (geom.type) {\n\t\t\t\t\tcase 'LineString':\t\treturn this._addGeoJSONData(geom.coordinates, d.properties);\n\t\t\t\t\tcase 'MultiLineString':\treturn _.each(geom.coordinates, (coords, i) => this._addGeoJSONData(coords, d.properties, i));\n\t\t\t\t\tcase 'Point':\n\t\t\t\t\tdefault:\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fallback for leaflet layers (eg. L.Gpx)\n\t\tif (d._latlngs) {\n\t\t\treturn this._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\n\t\t}\n\n\t},\n\n\t/*\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\n\t */\n\t_addGeoJSONData(coords, properties, nestingLevel) {\n\n\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\tlet props = (properties && properties.coordinateProperties) || properties;\n\n\t\tcoords.forEach((point, i) => {\n\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\n\t\t\t\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\n\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i, isMulti: nestingLevel });\n\n\t\t\tthis._addPoint(\n\t\t\t\tpoint.lat ?? point[1], \n\t\t\t\tpoint.lng ?? point[0],\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\n\t\t\t);\n\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\n\t\t});\n\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parse and push a single (x, y, z) point to current elevation profile.\n\t */\n\t_addPoint(x, y, z) {\n\t\tif (this.options.reverseCoords) {\n\t\t\t[x, y] = [y, x];\n\t\t}\n\n\t\tthis._data.push({\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tz: z,\n\t\t\tlatlng: L.latLng(x, y, z)\n\t\t});\n\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\n\t},\n\n\t_addLayer(layer) {\n\t\tif (layer) this._layers.addLayer(layer)\n\t\t// Postpone adding the distance markers (lazy: true)\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\n\t\t}\n\t\treturn layer;\n\t},\n\n\t_addMarker(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t\treturn marker;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" integration\n\t */\n\t_initAlmostOverHandler(map, layer) {\n\t\treturn (map && this.options.almostOver && !L.Browser.mobile) ? Promise.all([\n\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\tthis.import(this.__LALMOSTOVER)\n\t\t]).then(() => {\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\tmap\n\t\t\t\t\t.on('almost:move', this._onMouseMoveLayer, this)\n\t\t\t\t\t.on('almost:out', this._onMouseOut, this);\n\t\t\t\tthis.once('eledata_clear', () => {\n\t\t\t\t\tmap.almostOver.removeLayer(layer);\n\t\t\t\t\tmap\n\t\t\t\t\t.off('almost:move', this._onMouseMoveLayer, this)\n\t\t\t\t\t.off('almost:out', this._onMouseOut, this);\n\t\t\t\t})\n\t\t\t}\n\t\t}) : Promise.resolve();\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers() {\n\t\treturn this.options.distanceMarkers ? Promise.all([this.import(this.__LGEOMUTIL), this.import(this.__LDISTANCEM)]) : Promise.resolve();\n\t},\n\n\t/**\n\t * Initialize \"L.Control.EdgeScale\" integration\n\t */\n\t_initEdgeScale(map) {\n\t\treturn this.options.edgeScale ? Promise.all([this.import(this.__LEDGESCALE)])\n\t\t\t.then(() => {\n\t\t\t\tmap.edgeScaleControl = map.edgeScaleControl || L.control.edgeScale('boolean' !== typeof this.options.edgeScale ? this.options.edgeScale : {}).addTo(map);\n\t\t\t}) : Promise.resolve();\n\t},\n\n\t_initHotLine(layer) {\n\t\tlet prop = typeof this.options.hotline == 'string' ? this.options.hotline : 'elevation';\n\t\treturn this.options.hotline ? this.import(this.__LHOTLINE)\n\t\t\t.then(() => {\n\t\t\t\tlayer.eachLayer((trkseg) => {\n\t\t\t\t\tif(trkseg.feature.geometry.type != \"Point\") {\n\t\t\t\t\t\tlet geo = L.geoJson(trkseg.toGeoJSON(), { coordsToLatLng: (coords) => L.latLng(coords[0], coords[1], coords[2] * (this.options.altitudeFactor || 1))});\n\t\t\t\t\t\tlet line = L.hotline(geo.toGeoJSON().features[0].geometry.coordinates, {\n\t\t\t\t\t\t\trenderer: L.Hotline.renderer(),\n\t\t\t\t\t\t\tmin: isFinite(this.track_info[prop + '_min']) ? this.track_info[prop + '_min'] : 0,\n\t\t\t\t\t\t\tmax: isFinite(this.track_info[prop + '_max']) ? this.track_info[prop + '_max'] : 1,\n\t\t\t\t\t\t\tpalette: {\n\t\t\t\t\t\t\t\t0.0: '#008800',\n\t\t\t\t\t\t\t\t0.5: '#ffff00',\n\t\t\t\t\t\t\t\t1.0: '#ff0000'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tweight: 5,\n\t\t\t\t\t\t\toutlineColor: '#000000',\n\t\t\t\t\t\t\toutlineWidth: 1\n\t\t\t\t\t\t}).addTo(this._hotline);\n\t\t\t\t\t\tlet alpha = trkseg.options.style && trkseg.options.style.opacity || 1;\n\t\t\t\t\t\ttrkseg.on('add remove', ({type}) => {\n\t\t\t\t\t\t\ttrkseg.setStyle({opacity: (type == 'add' ? 0 : alpha)});\n\t\t\t\t\t\t\tline[(type == 'add' ? 'addTo' : 'removeFrom')](trkseg._map);\n\t\t\t\t\t\t\tif (line._renderer) line._renderer._container.parentElement.insertBefore(line._renderer._container, line._renderer._container.parentElement.firstChild);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}) : Promise.resolve();\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations(layer) {\n\t\tlet map = this._map;\n\t\tif (map) {\n\t\t\tif (this._data.length) {\n\t\t\t\tthis._start.setLatLng(this._data[0].latlng);\n\t\t\t\tthis._end.setLatLng(this._data[this._data.length -1].latlng);\n\t\t\t}\n\t\t\tPromise.all([\n\t\t\t\tthis._initHotLine(layer),\n\t\t\t\tthis._initAlmostOverHandler(map, layer),\n\t\t\t\tthis._initDistanceMarkers(),\n\t\t\t\tthis._initEdgeScale(map),\n\t\t\t]).then(() => {\n\t\t\t\tif (this.options.polyline) {\n\t\t\t\t\tthis._layers.addLayer(layer.addTo(map)); // hotfix for: https://github.com/Raruto/leaflet-elevation/issues/233\n\t\t\t\t\tthis._circleMarkers.addTo(map);\n\t\t\t\t}\n\t\t\t\tif (this.options.autofitBounds) {\n\t\t\t\t\tthis.fitBounds(layer.getBounds());\n\t\t\t\t}\n\t\t\t\tmap.invalidateSize();\n\t\t\t});\n\t\t} else {\n\t\t\tthis.once('add', () => this._initMapIntegrations(layer));\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t\tif (this._map) this._map.invalidateSize();\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t\tif (this._map) this._map.invalidateSize();\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.split(' ')[0].replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke(ctx, layer) {\n\t\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\t\tlet options = layer.options;\n\n\t\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Partial fix for initial tooltip size\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\t */\n\t_fixTooltipSize() {\n\t\tthis.on('elechart_init', () =>\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(data);\n\t\t\t})\n\t\t);\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart (DOM element).\n\t */\n\t_initChart(container) {\n\t\tlet opts = this.options;\n\t\tlet map = this._map;\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LCHART)\n\t\t]).then((m) => {\n\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\td3\n\t\t\t\t.select(container)\n\t\t\t\t.call(chart.render())\n\t\n\t\t\tchart\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\n\t\t\t\t.on('dragged', this._onDragEnd, this)\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\n\t\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\n\t\n\t\n\t\t\tthis.fire(\"elechart_init\");\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\n\t},\n\n\t_initLayer() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LMARKER)\n\t\t]).then((m) => {\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\n\t\t\tthis.fire(\"elechart_marker\");\n\t\t});\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton(container) {\n\t\tL.DomEvent\n\t\t\t.disableClickPropagation(container)\n\t\t\t.disableScrollPropagation(container);\n\n\t\tthis.options.collapsed ? this._collapse() : this._expand();\n\n\t\tif (this.options.autohide) {\n\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\tthis._map.on('click', this._collapse, this);\n\t\t}\n\n\t\tif (this.options.closeBtn) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle-icon\", { href: '#', title: L._('Elevation'), }, container);\n\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t_.on(link, 'focus', this._toggle, this);\n\t\t\tfetch(_.resolveURL(this.__btnIcon, this.options.srcFolder)).then(r => r.ok && r.text().then(img => link.innerHTML = img));\n\t\t}\n\t},\n\n\t_initSummary(container) {\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\n\n\t\t\tthis.on('elechart_init', () => {\n\t\t\t\td3.select(container).call(this._summary.render());\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Retrieve data from a remote url (HTTP).\n\t */\n\t_loadFile(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis._parseFromString(data)\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\n\t\t\t}).catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Dynamically import only required javascript modules (code splitting)\n\t */\n\t_loadModules(handlers) {\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof Elevation[h] !== \"undefined\" ? Elevation[h] : h);\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\n\t\tlet modules = handlers.map(file => (typeof file === 'string' && this.import(this.__modulesFolder + file.toLowerCase() + '.js')) || (file instanceof Promise && file) || Promise.resolve());\n\t\treturn Promise.all(modules).then((m) => {\n\t\t\t_.each(m, (exported, i) => {\n\t\t\t\tlet fn = exported && Object.keys(exported)[0];\n\t\t\t\tif (fn) {\n\t\t\t\t\thandlers[i] = Elevation[fn] = (Elevation[fn] ?? exported[fn]);\n\t\t\t\t}\n\t\t\t});\n\t\t\t_.each(handlers, h => [\"function\", \"object\"].includes(typeof h) && this._registerHandler(h));\n\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer(geojson) {\n\t\tlet { polyline, theme, waypoints, wptIcons, wptLabels, distanceMarkers } = this.options;\n\t\tlet style = L.extend({}, polyline);\n\n\t\tif (theme) {\n\t\t\tstyle.className += ' ' + theme;\n\t\t}\n\n\t\tif (geojson.name) {\n\t\t\tthis.track_info.name = geojson.name;\n\t\t}\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: distanceMarkers,\n\t\t\tstyle: style,\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (waypoints) {\n\t\t\t\t\tlet { desc, name, sym } = feature.properties;\n\t\t\t\t\tdesc = desc || '';\n\t\t\t\t\tname = name || '';\n\t\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\t\tif ([true, 'dots'].includes(waypoints)) {\n\t\t\t\t\t\tthis._registerCheckPoint({\n\t\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\t\tlabel : ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\t\tif ([true, 'markers'].includes(waypoints) && wptIcons != false) {\n\t\t\t\t\t\treturn this._registerMarker({\n\t\t\t\t\t\t\tlatlng : latlng,\n\t\t\t\t\t\t\tsym : (sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase(),\n\t\t\t\t\t\t\tcontent: [true, 'markers'].includes(wptLabels) && (name || desc) && decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''))\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => feature.geometry && feature.geometry.type != 'Point' && this.addData(feature, layer),\n\t\t});\n\n\t\tthis.import(this.__D3).then(() => {\n\t\t\tthis._initMapIntegrations(layer);\n\t\t\tconst event_data = { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info };\n\t\t\tif (this._modulesLoaded) {\n\t\t\t\tthis._fireEvt(\"eledata_loaded\", event_data);\n\t\t\t} else {\n\t\t\t\tthis.once('modules_loaded', () => this._fireEvt(\"eledata_loaded\", event_data));\n\t\t\t}\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_onDragEnd({ dragstart, dragend}) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\n\n\t\tthis.fire(\"elechart_dragged\");\n\t},\n\n\t_onKeyDown({key}) {\n\t\tif(!this.options.detached && key === \"Escape\"){\n\t\t\tthis._collapse()\n\t\t};\n\t},\n\n\t/**\n\t * Trigger mouseenter event.\n\t */\n\t_onMouseEnter() {\n\t\tthis.fire('elechart_enter');\n\t},\n\n\t/*\n\t * Handles the moueseover the chart and displays distance and altitude level.\n\t */\n\t_onMouseMove({xCoord}) {\n\t\tif (this._chartEnabled && this._data.length) {\n\t\t\tlet item = this._findItemForX(xCoord);\n\t\t\tif (item) {\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\t\tthis._updateMarker(item);\n\t\t\t\tthis._setMapView(item);\n\n\t\t\t\tif (this._map) {\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t\t}\n\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_onMouseMoveLayer({latlng}) {\n\t\tif (this._data.length) {\n\t\t\tlet item = this._findItemForLatLng(latlng);\n\t\t\tif (item) {\n\t\t\t\tlet xCoord = item.xDiagCoord;\n\t\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\t\n\t\t\t\tthis._updateMarker(item);\n\t\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_onMouseOut() {\n\t\tif (!this.options.detached) {\n\t\t\tthis._hideMarker();\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t}\n\n\t\tif (this._map) {\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\n\t\t}\n\n\t\tthis.fire(\"elechart_leave\");\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_onRulerFilter({coords}) {\n\t\tthis._updateMapSegments(coords);\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_onToggleChart({ name, enabled }) {\n\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\n\n\t\t// toggle layer visibility on empty chart\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\n\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\n\n\t\t// remove marker on empty chart\n\t\tif (!this._chartEnabled) {\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Simple GeoJSON Parser\n\t */\n\t_parseFromGeoJSONString(data) {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch (e) { }\n\t},\n\n\t/**\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\n\t */\n\t_parseFromString(data) {\n\t\treturn new Promise(resolve =>\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\n\t\t\t\tlet geojson;\n\t\t\t\ttry {\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\n\t\t\t\t}\n\t\t\t\tif (geojson) {\n\t\t\t\t\tgeojson.name = geojson.name || (this._downloadURL || '').split('/').pop().split('#')[0].split('?')[0];\n\t\t\t\t}\n\t\t\t\tresolve(geojson);\n\t\t\t})\n\t\t);\n\t},\n\n\t/**\n\t * Simple XML Parser (GPX, KML, TCX)\n\t */\n\t_parseFromXMLString(data) {\n\t\tif (data.indexOf(\"<\") != 0) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\tlet name = xml.getElementsByTagName('name');\n\t\tif (xml.getElementsByTagName('parsererror').length) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tif (!(type in toGeoJSON)) {\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t}\n\t\tlet geojson = toGeoJSON[type](xml);\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add a point of interest over the diagram\n\t */\n\t_registerCheckPoint(props) {\n\t\tconst cb = () => this._chart._registerCheckPoint(props);\n\t\tthis\n\t\t\t.on(\"elechart_updated\", cb)\n\t\t\t.once(\"eledata_clear\", () => this.off(\"elechart_updated\", cb));\n\t},\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute(props) {\n\n\t\t// parse of \"coordinateProperties\" for later usage\n\t\tif (props.coordPropsToMeta) {\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\n\t\t}\n\n\t\t// prevent excessive variabile instanstations\n\t\tlet i, curr, prev, attr = props.attr || props.name;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = {};\n\n\t\t// iteration\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\n\t\t\ti = index;\n\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\n\t\t\tcurr = this._data[i];\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (i > 0 && isNaN(prev[attr])) {\n\t\t\t\tif (!isNaN(lastValid[attr]) && !isNaN(curr[attr])) {\n\t\t\t\t\tprev[attr] = (lastValid[attr] + curr[attr]) / 2;\n\t\t\t\t} else if (!isNaN(lastValid[attr])) {\n\t\t\t\t\tprev[attr] = lastValid[attr];\n\t\t\t\t} else if (!isNaN(curr[attr])) {\n\t\t\t\t\tprev[attr] = curr[attr];\n\t\t\t\t}\n\t\t\t\t// update \"yAttr\" and \"xAttr\"\n\t\t\t\tif (props.meta) {\n\t\t\t\t\tprev[props.meta] = prev[attr];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// skip to next iteration for invalid or missing data (eg. i == 0)\n\t\t\tif (isNaN(curr[attr])) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// update reference to last used point\n\t\t\tlastValid[attr] = curr[attr];\n\n\t\t\t// Limit \"crazy\" delta values.\n\t\t\tif (props.deltaMax) {\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\n\t\t\t}\n\t\t\t\n\t\t\t// Range of acceptable values.\n\t\t\tif (props.clampRange) {\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\n\t\t\t}\n\n\t\t\t// Limit floating point precision.\n\t\t\tif (!isNaN(props.decimals)) {\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\n\t\t\t}\n\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\n\t\t\tif (props.stats) {\n\t\t\t\tfor (const key in props.stats) {\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key], this._data.length);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\n\t\t\tif (props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\n\t\t});\n\t},\n\n\t/**\n\t * Parse a module definition and attach related function listeners\n\t */\n\t_registerHandler(props) {\n\n\t\t// eg. L.Control.Altitude\n\t\tif (typeof props === \"function\") {\n\t\t\treturn this._registerHandler(props.call(this));\n\t\t}\n\n\t\tlet {\n\t\t\tname,\n\t\t\tattr,\n\t\t\trequired,\n\t\t\tdeltaMax,\n\t\t\tclampRange,\n\t\t\tdecimals,\n\t\t\tmeta,\n\t\t\tunit,\n\t\t\tcoordinateProperties,\n\t\t\tcoordPropsToMeta,\n\t\t\tpointToAttr,\n\t\t\tonPointAdded,\n\t\t\tstats,\n\t\t\tstatsName,\n\t\t\tgrid,\n\t\t\tscale,\n\t\t\tpath,\n\t\t\ttooltip,\n\t\t\tsummary\n\t\t} = props;\n\n\t\t// eg. \"altitude\" == true\n\t\tif (this.options[name] || required) {\n\n\t\t\tthis._registerDataAttribute({\n\t\t\t\tname,\n\t\t\t\tattr,\n\t\t\t\tmeta,\n\t\t\t\tdeltaMax,\n\t\t\t\tclampRange,\n\t\t\t\tdecimals,\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(coordinateProperties, meta || name, coordPropsToMeta),\n\t\t\t\tpointToAttr,\n\t\t\t\tonPointAdded,\n\t\t\t\tstats,\n\t\t\t\tstatsName,\n\t\t\t});\n\n\t\t\tif (grid) {\n\t\t\t\tthis._registerAxisGrid(L.extend({ name }, grid));\n\t\t\t}\n\n\t\t\tif (this.options[name] !== \"summary\") {\n\t\t\t\tif (scale) this._registerAxisScale(L.extend({ name, label: unit }, scale));\n\t\t\t\tif (path) this._registerAreaPath(L.extend({ name }, path));\n\t\t\t}\n\n\t\t\tif (tooltip || props.tooltips) {\n\t\t\t\t_.each([tooltip, ...(props.tooltips || [])], t => t && this._registerTooltip(L.extend({ name }, t)));\n\t\t\t}\n\n\t\t\tif (summary) {\n\t\t\t\t_.each(summary, (s, k) => summary[k] = L.extend({ unit }, s));\n\t\t\t\tthis._registerSummary(summary);\n\t\t\t}\n\t\t}\n\t},\n\n\t_registerMarker({latlng, sym, content}) {\n\t\tlet { wptIcons } = this.options;\n\t\t// generate and cache appropriate icon symbol\n\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\twptIcons[sym] = L.divIcon(L.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } ));\n\t\t}\n\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\tif (content) {\n\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\n\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\n\t\t}\n\t\treturn this._addMarker(marker)\n\t},\n\t\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerTooltip(props) {\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart() {\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\n\t\t\tlet opts = this.options;\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\n\t\t\tif (newWidth) {\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (this._chart && this._chart._chart) {\n\t\t\t\t\tthis._chart._chart._resize(opts);\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._updateMapSegments();\n\t\t}\n\t},\n\n\t/**\n\t * Collapse or Expand chart control.\n\t */\n\t_toggle() {\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\n\t},\n\n\t/**\n\t * Update map center and zoom (followMarker: true)\n\t */\n\t_setMapView(item) {\n\t\tif (this._map && this.options.followMarker) {\n\t\t\tlet zoom = this._map.getZoom();\n\t\t\tlet z = this.options.zFollow;\n\t\t\tif (typeof z === \"number\") {\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart() {\n\t\tif (this._chart && this._container) {\n\t\t\tthis.fire(\"elechart_axis\");\n\t\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\tthis.fire('elechart_updated');\t\t\n\t\t}\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker(item) {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update({\n\t\t\t\tmap : this._map,\n\t\t\t\titem : item,\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\n\t\t\t\toptions : this.options\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker() {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update();\n\t\t}\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary() {\n\t\tif (this._summary) {\n\t\t\tthis._summary.reset();\n\t\t\tif (this.options.summary) {\n\t\t\t\tthis.fire(\"elechart_summary\");\n\t\t\t\tthis._summary.update();\n\t\t\t}\n\t\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\t\tevent.confirm();\n\t\t\t\t\t}\n\t\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width() {\n\t\tif (this._chart) return this._chart._width();\n\t\tconst { width, margins } = this.options;\n\t\treturn width - margins.left - margins.right;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height() {\n\t\tif (this._chart) return this._chart._height();\n\t\tconst { height, margins } = this.options;\n\t\treturn height - margins.top - margins.bottom;\n\t},\n\n});\n","/*\r\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\r\n *\r\n * This file is free software: you may copy, redistribute and/or modify it\r\n * under the terms of the GNU General Public License as published by the\r\n * Free Software Foundation, either version 2 of the License, or (at your\r\n * option) any later version.\r\n *\r\n * This file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n * This file incorporates work covered by the following copyright and\r\n * permission notice:\r\n *\r\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\r\n *\r\n * Permission to use, copy, modify, and/or distribute this software\r\n * for any purpose with or without fee is hereby granted, provided\r\n * that the above copyright notice and this permission notice appear\r\n * in all copies.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\r\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\r\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\r\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\r\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\r\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\r\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n */\r\n\r\nimport * as _ from './utils';\r\nimport { Elevation } from './control';\r\n\r\nElevation.Utils = _;\r\n\r\nL.control.elevation = (options) => new Elevation(options);\r\n"],"names":["Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","resolveURL","src","baseUrl","URL","startsWith","undefined","toString","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","isMulti","key","meta","parseNumeric","call","this","property","parseInt","addClass","n","str","split","every","s","L","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","substr","on","off","DomEvent","throttle","wrapNum","Util","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","cloneDeep","o","skipProps","cache","hit","filter","original","copy","Array","isArray","Object","getPrototypeOf","push","getOwnPropertyNames","forEach","prop","propdesc","getOwnPropertyDescriptor","defineProperty","get","set","writable","configurable","enumerable","value","includes","console","warn","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","t","d","floor","h","m","padStart","iVal","avg","idx","max","Infinity","min","sum","parse","Options","autofitBounds","autohide","autohideMarker","almostover","altitude","closeBtn","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","Browser","mobile","downloadLink","elevationDiv","edgeScale","bar","icon","coords","followMarker","imperial","legend","handlers","hotline","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","margins","top","right","bottom","left","height","screen","width","xTicks","yTicks","decimalsX","decimalsY","forceAxisBounds","interpolation","yAxisMax","yAxisMin","srcFolder","currentScript","url","location","require","pathToFileURL","__filename","baseURI","slice","join","_","i18n","string","data","Elevation","Control","extend","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LHOTLINE","__LDISTANCEM","__LEDGESCALE","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","__btnIcon","addData","layer","import","then","_modulesLoaded","_addData","_addLayer","_fireEvt","track_info","once","addTo","map","parent","_.select","eleDiv","onAdd","_.append","_.insert","getContainer","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_hotline","eachLayer","l","renderer","_data","_updateChart","_events","elechart_updated","_container","selectAll","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","_.cloneDeep","featureGroup","_markedSegments","_start","circleMarker","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","EdgeScale","Hotline","_.resolveURL","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","_.randomId","_loadModules","_initChart","_initButton","_initSummary","_initMarker","_initLayer","fire","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","_latlngs","nestingLevel","coordinateProperties","ele","_addPoint","lat","lng","alt","index","length","x","y","z","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","removeLayer","_initDistanceMarkers","_initEdgeScale","edgeScaleControl","control","_initHotLine","trkseg","geo","geoJson","coordsToLatLng","altitudeFactor","isFinite","palette","outlineColor","outlineWidth","_renderer","parentElement","insertBefore","firstChild","_initMapIntegrations","setLatLng","invalidateSize","_collapse","_.replaceClass","_expand","oldProto","Canvas","_fillStroke","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","fetch","r","ok","text","img","innerHTML","_summary","Summary","response","_downloadURL","catch","err","modules","file","toLowerCase","exported","keys","_registerHandler","pointToLayer","desc","sym","_registerCheckPoint","label","_registerMarker","content","decodeURI","onEachFeature","event_data","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","pop","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","from","find","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","cb","_registerDataAttribute","lastValid","pointToAttr","isNaN","_.wrapDelta","clampRange","_.clamp","decimals","_.round","stats","sname","statsName","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","hasOwnProperty","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","elevation"],"mappings":"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"}