@raruto/leaflet-elevation 2.2.2 → 2.2.5

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