@raruto/leaflet-elevation 2.0.2 → 2.0.3
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.
- package/dist/leaflet-elevation.css +1 -0
- package/dist/leaflet-elevation.js +24 -28
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.css +1 -1
- package/dist/leaflet-elevation.min.js +1 -1
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chart.js +77 -53
- package/src/components/d3.js +74 -16
- package/src/control.js +19 -25
- package/src/handlers/heart.js +2 -2
- package/src/index.css +1 -0
- package/src/utils.js +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","/**\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\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 || parseInt).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 parseInt = (property, id) => window.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) => (iVal > max ? iVal : max) || -Infinity; \nexport const iMin = (iVal, min) => (iVal < min ? iVal : min) || +Infinity;\nexport const iAvg = (iVal, avg) => (iVal + (avg || 0)) / 2.0;\nexport const iSum = (iVal, sum) => iVal + (sum || 0);\n\n/**\n * Alias for some leaflet core functions\n */\nexport const { on, off } = L.DomEvent;\nexport const { throttle } = 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;","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: 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\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [],\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: false,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: L.circleMarker([0,0], { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false }),\n\ttrkEnd: L.circleMarker([0,0], { 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 (quite useless)\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tskipNullZCoords: false,\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Probably no longer functional as expected (internally overwritten)\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: 200,\n\twidth: 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Options } from './options';\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@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.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\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: function(d, layer) {\n\t\tthis.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tlayer = layer ?? (d.on && d);\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\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: function() {\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._clearLayers(this._circleMarkers);\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: function() {\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: function(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: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\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: function() {\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: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(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: function() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\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: function(opts) {\n\n\t\topts = L.setOptions(this, opts);\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = (opts.trkStart || Options.trkStart);\n\t\tthis._end = (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: function(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}\n\t\treturn condition !== false ? import(src) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(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: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\n\t\tlet modules = [\n\t\t\t\"Distance\",\n\t\t\t\"Time\",\n\t\t\t\"Altitude\",\n\t\t\t\"Slope\",\n\t\t\t\"Speed\",\n\t\t\t\"Acceleration\",\n\t\t\t...this.options.handlers\n\t\t].filter(m => false !== this.options[typeof m == \"string\" && m.toLowerCase()]);\n\n\t\tthis._loadModules(modules);\t// Inject here required modules (data handlers)\n\t\tthis._initButton(container);\n\t\tthis._initChart(container);\n\t\tthis._initSummary(container);\n\t\tthis._initMarker(map);\n\t\tthis._initLayer(map);\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: function(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\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\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: function(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': return _.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: function(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: function(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: function(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: function(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: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tPromise.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', (e) => this._onMouseMoveLayer(e))\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tPromise.all([\n\t\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\t\tthis.import(this.__LDISTANCEM)\n\t\t\t]).then(() => this.options.polyline && layer.addTo(map) && this._circleMarkers.bringToFront());\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._data.length) {\n\t\t\tcontrol._start.setLatLng(control._data[0].latlng);\n\t\t\tcontrol._end.setLatLng(control._data[control._data.length -1].latlng);\n\t\t}\n\t\tif (map) {\n\t\t\tcontrol._circleMarkers.addTo(map);\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(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: function() {\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: function(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: function(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: function(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: function() {\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: function(container) {\n\t\tlet opts = this.options;\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 } = this._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_axis\");\n\t\n\t\t\tif (this.options.legend) this.fire(\"elechart_legend\");\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\t},\n\n\t_initLayer: function() {\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: function(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: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(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: function(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: function(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\tPromise.\n\t\t\tall(\n\t\t\t\thandlers\n\t\t\t\t\t.filter(h => typeof h === 'string' || h instanceof Promise)\n\t\t\t\t\t.map(file => file instanceof Promise ? file : this.import(this.__modulesFolder + file.toLowerCase() + '.js'))\n\t\t\t)\n\t\t\t.then((m) => {\n\t\t\t\t_.each(m, (exported) => {\n\t\t\t\t\tlet fn = Object.keys(exported)[0];\n\t\t\t\t\tif (fn && typeof Elevation[fn] === \"undefined\" ) {\n\t\t\t\t\t\thandlers[fn] = Elevation[fn] = exported[fn];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_.each(handlers, h => this._registerHandler(h));\n\t\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(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(this, layer);\n\t\t\tthis._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info });\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_onDragEnd: function({ 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: function({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: function() {\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: function({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: function({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: function() {\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: function({coords}) {\n\t\tthis._updateMapSegments(coords);\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_onToggleChart: function({ 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: function(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: function(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: function(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: function(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: function(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: function(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: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute: function(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;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \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\t\t\tattr = props.attr || props.name;\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (props.skipNull === false) {\n\t\t\t\tlet curr = this._data[i][attr];\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\n\t\t\t\t\tif (isNaN(prev)) {\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\n\t\t\t\t\t\t\tprev = lastValid;\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\n\t\t\t\t\t\t\tprev = curr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// update reference to last used point (ie. if it has data)\n\t\t\t\tif (!isNaN(curr)) {\n\t\t\t\t\tlastValid = curr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\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]);\n\t\t\t\t}\n\t\t\t}\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 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: function(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\tskipNull,\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\tskipNull,\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: function(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: function(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: function() {\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: function() {\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: function() {\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: function() {\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: function(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: function() {\n\t\tif (this._chart && this._container) {\n\t\t\tthis.fire(\"elechart_axis\");\n\t\t\tthis.fire(\"elechart_area\");\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: function(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: function() {\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: function(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: function() {\n\t\tif (!this._summary) return;\n\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis.fire(\"elechart_summary\");\n\t\t\tthis._summary.update();\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = ({preventDefault}) => {\n\t\t\t\tpreventDefault();\n\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\tevent.confirm();\n\t\t\t\t}\n\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\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: function() {\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 * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Elevation } from './control';\n\nElevation.Utils = _;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","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","parseInt","call","this","property","addClass","n","str","split","every","s","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","toString","substr","on","off","DomEvent","throttle","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","sum","Options","autofitBounds","autohide","Browser","mobile","autohideMarker","almostover","altitude","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","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","circleMarker","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","undefined","yAxisMin","margins","top","right","bottom","left","height","width","xTicks","yTicks","Elevation","Control","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","addData","layer","import","then","_addData","_addLayer","_fireEvt","track_info","addTo","map","eleDiv","_initElevationDiv","isConnected","_.insert","getContainer","_.append","onAdd","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","src","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","modules","filter","toLowerCase","_loadModules","_initButton","_initChart","_initSummary","_initMarker","_initLayer","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","coords","console","warn","_latlngs","nestingLevel","coordinateProperties","ele","fire","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","bringToFront","_.select","_.randomId","_.replaceClass","_initMapIntegrations","control","setLatLng","once","_collapse","_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","_renderer","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","Summary","url","fetch","response","text","_downloadURL","catch","file","exported","Object","keys","_registerHandler","geoJson","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","parentElement","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","[object Object]","hasOwnProperty","icon","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","innerHTML","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","proto","elevation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","/**\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\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 || parseInt).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 parseInt = (property, id) => window.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) => (iVal > max ? iVal : max) || -Infinity; \nexport const iMin = (iVal, min) => (iVal < min ? iVal : min) || +Infinity;\nexport const iAvg = (iVal, avg) => (iVal + (avg || 0)) / 2.0;\nexport const iSum = (iVal, sum) => iVal + (sum || 0);\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;","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: 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\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [],\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: false,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: L.circleMarker([0,0], { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false }),\n\ttrkEnd: L.circleMarker([0,0], { 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 (quite useless)\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tskipNullZCoords: false,\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Probably no longer functional as expected (internally overwritten)\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: 200,\n\twidth: 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Options } from './options';\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@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.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\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: function(d, layer) {\n\t\tthis.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tlayer = layer ?? (d.on && d);\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\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: function() {\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._clearLayers(this._circleMarkers);\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: function() {\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: function(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: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\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: function() {\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: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(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: function() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\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: function(opts) {\n\n\t\topts = L.setOptions(this, opts);\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = (opts.trkStart || Options.trkStart);\n\t\tthis._end = (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: function(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}\n\t\treturn condition !== false ? import(src) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(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: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\n\t\tlet modules = [\n\t\t\t\"Distance\",\n\t\t\t\"Time\",\n\t\t\t\"Altitude\",\n\t\t\t\"Slope\",\n\t\t\t\"Speed\",\n\t\t\t\"Acceleration\",\n\t\t\t...this.options.handlers\n\t\t].filter(m => false !== this.options[typeof m == \"string\" && m.toLowerCase()]);\n\n\t\tthis._loadModules(modules);\t// Inject here required modules (data handlers)\n\t\tthis._initButton(container);\n\t\tthis._initChart(container);\n\t\tthis._initSummary(container);\n\t\tthis._initMarker(map);\n\t\tthis._initLayer(map);\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: function(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\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\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: function(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': return _.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: function(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: function(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: function(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: function(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: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tPromise.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', (e) => this._onMouseMoveLayer(e))\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tPromise.all([\n\t\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\t\tthis.import(this.__LDISTANCEM)\n\t\t\t]).then(() => this.options.polyline && layer.addTo(map) && this._circleMarkers.bringToFront());\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._data.length) {\n\t\t\tcontrol._start.setLatLng(control._data[0].latlng);\n\t\t\tcontrol._end.setLatLng(control._data[control._data.length -1].latlng);\n\t\t}\n\t\tif (map) {\n\t\t\tcontrol._circleMarkers.addTo(map);\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(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: function() {\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: function(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: function(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: function(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: function() {\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: function(container) {\n\t\tlet opts = this.options;\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 } = this._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\t},\n\n\t_initLayer: function() {\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: function(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: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(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: function(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: function(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\tPromise.\n\t\t\tall(\n\t\t\t\thandlers\n\t\t\t\t\t.filter(h => typeof h === 'string' || h instanceof Promise)\n\t\t\t\t\t.map(file => file instanceof Promise ? file : this.import(this.__modulesFolder + file.toLowerCase() + '.js'))\n\t\t\t)\n\t\t\t.then((m) => {\n\t\t\t\t_.each(m, (exported) => {\n\t\t\t\t\tlet fn = Object.keys(exported)[0];\n\t\t\t\t\tif (fn && typeof Elevation[fn] === \"undefined\" ) {\n\t\t\t\t\t\thandlers[fn] = Elevation[fn] = exported[fn];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_.each(handlers, h => this._registerHandler(h));\n\t\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(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(this, layer);\n\t\t\tthis._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info });\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_onDragEnd: function({ 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: function({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: function() {\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: function({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: function({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: function() {\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: function({coords}) {\n\t\tthis._updateMapSegments(coords);\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_onToggleChart: function({ 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: function(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: function(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: function(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: function(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: function(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: function(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: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute: function(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;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \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\t\t\tattr = props.attr || props.name;\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (props.skipNull === false) {\n\t\t\t\tlet curr = this._data[i][attr];\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\n\t\t\t\t\tif (isNaN(prev)) {\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\n\t\t\t\t\t\t\tprev = lastValid;\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\n\t\t\t\t\t\t\tprev = curr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// update reference to last used point (ie. if it has data)\n\t\t\t\tif (!isNaN(curr)) {\n\t\t\t\t\tlastValid = curr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\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]);\n\t\t\t\t}\n\t\t\t}\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 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: function(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\tskipNull,\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\tskipNull,\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: function(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: function(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: function() {\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: function() {\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: function() {\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: function() {\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: function(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: function() {\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: function(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: function() {\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: function(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: function() {\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 = ({preventDefault}) => {\n\t\t\t\t\tpreventDefault();\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: function() {\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: function() {\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 * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Elevation } from './control';\n\nElevation.Utils = _;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","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","parseInt","call","this","property","addClass","n","str","split","every","s","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","toString","substr","on","off","DomEvent","throttle","wrapNum","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","sum","Options","autofitBounds","autohide","Browser","mobile","autohideMarker","almostover","altitude","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","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","circleMarker","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","undefined","yAxisMin","margins","top","right","bottom","left","height","width","xTicks","yTicks","Elevation","Control","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","addData","layer","import","then","_addData","_addLayer","_fireEvt","track_info","addTo","map","eleDiv","_initElevationDiv","isConnected","_.insert","getContainer","_.append","onAdd","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","src","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","modules","filter","toLowerCase","_loadModules","_initButton","_initChart","_initSummary","_initMarker","_initLayer","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","coords","console","warn","_latlngs","nestingLevel","coordinateProperties","ele","fire","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","bringToFront","_.select","_.randomId","_.replaceClass","_initMapIntegrations","control","setLatLng","once","_collapse","_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","_renderer","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","Summary","url","fetch","response","text","_downloadURL","catch","file","exported","Object","keys","_registerHandler","geoJson","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","parentElement","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","[object Object]","hasOwnProperty","icon","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","innerHTML","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","proto","elevation"],"mappings":"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"}
|
package/package.json
CHANGED