@raruto/leaflet-elevation 1.9.5 → 2.0.1

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":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/components.js","../src/chart.js","../src/marker.js","../src/index.js","../src/summary.js","../src/options.js","../src/control.js","../src/distance.js","../src/time.js","../src/altitude.js","../src/slope.js","../src/speed.js","../src/acceleration.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","const SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a duration time (millis) to a human readable 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 * 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 * Async JS script download.\n */\nexport function lazyLoader(url, skip, loader) {\n\tif (skip === false) {\n\t\treturn Promise.resolve();\n\t}\n\tif (loader instanceof Promise) {\n\t\treturn loader;\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tlet tag = document.createElement(\"script\");\n\t\ttag.addEventListener('load', resolve, { once: true });\n\t\ttag.src = url;\n\t\tdocument.head.appendChild(tag);\n\t});\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 * Limit a number between min / max values\n */\n export function clamp(val, range) {\n\tif (range) return val < range[0] ? range[0] : val > range[1] ? range[1] : val;\n\treturn val;\n}\n\n/**\n * A little bit safier than L.DomUtil.addClass\n */\nexport function addClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.addClass(targetNode, s));\n}\n\n/**\n * A little bit safier than L.DomUtil.removeClass()\n */\nexport function removeClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.removeClass(targetNode, s));\n}\n\nexport function toggleClass(targetNode, className, conditional) {\n\treturn (conditional ? addClass : removeClass).call(null, targetNode, className)\n}\n\nexport function replaceClass(targetNode, removeClassName, addClassName) {\n\tif (removeClassName) removeClass(targetNode, removeClassName);\n\tif (addClassName) addClass(targetNode, addClassName);\n}\n\nexport function style(targetNode, name, value) {\n\tif (typeof value === \"undefined\") return L.DomUtil.getStyle(targetNode, name);\n\telse return targetNode.style.setProperty(name, value);\n}\n\nexport function toggleStyle(targetNode, name, value, conditional) {\n\treturn style(targetNode, name, conditional ? value : '');\n}\n\nexport function toggleEvent(leafletElement, eventName, handler, conditional) {\n\treturn leafletElement[conditional ? 'on' : 'off'](eventName, handler);\n}\n\n/**\n * A little bit shorter than L.DomUtil.create()\n */\nexport function create(tagName, className, attributes, parent) {\n\tlet elem = L.DomUtil.create(tagName, className || \"\");\n\tif (attributes) setAttributes(elem, attributes);\n\tif (parent) append(parent, elem);\n\treturn elem;\n}\n\n/**\n * Same as node.appendChild()\n */\nexport function append(parent, child) {\n\treturn parent.appendChild(child);\n}\n\n/**\n * Same as node.insertAdjacentElement()\n */\nexport function insert(parent, child, position) {\n\treturn parent.insertAdjacentElement(position, child);\n}\n\n/**\n * Loop for node.setAttribute()\n */\nexport function setAttributes(elem, attrs) {\n\tfor (let k in attrs) { elem.setAttribute(k, attrs[k]); }\n}\n\n/**\n * Same as node.querySelector().\n */\nexport function select(selector, context) {\n\treturn (context || document).querySelector(selector);\n}\n\n/**\n * Alias for L.DomEvent.on.\n */\nexport const on = L.DomEvent.on;\n\n/**\n * Alias for L.DomEvent.off.\n */\nexport const off = L.DomEvent.off;\n\n/**\n * Alias for L.DomUtil.hasClass.\n */\nexport const hasClass = L.DomUtil.hasClass;\n\n\n/**\n * Generate a random string\n */\nexport function randomId() {\n\treturn Math.random().toString(36).substr(2, 9);\n}\n\n/**\n * Execute a function foreach element in object\n */\nexport function each(obj, fn) {\n\tfor (let i in obj) fn(obj[i], i);\n}","export 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\nexport const Area = ({\n\twidth,\n\theight,\n\txAttr,\n\tyAttr,\n\tscaleX,\n\tscaleY,\n\tinterpolation = \"curveLinear\"\n}) => {\n\treturn d3.area()\n\t\t.curve(typeof interpolation === 'string' ? d3[interpolation] : interpolation)\n\t\t.x(d => (d.xDiagCoord = scaleX(d[xAttr])))\n\t\t.y0(height)\n\t\t.y1(d => scaleY(d[yAttr]));\n};\n\nexport const Path = ({\n\tname,\n\tcolor,\n\tstrokeColor,\n\tstrokeOpacity,\n\tfillOpacity,\n}) => {\n\tlet path = d3.create('svg:path')\n\n\tif (name) path.classed(name, true);\n\n\tpath.style(\"pointer-events\", \"none\");\n\n\tpath\n\t.attr(\"fill\", color || '#3366CC')\n\t.attr(\"stroke\", strokeColor || '#000')\n\t.attr(\"stroke-opacity\", strokeOpacity || '1')\n\t.attr(\"fill-opacity\", fillOpacity || '0.8');\n\n\treturn path;\n};\n\nexport const Axis = ({\n\ttype = \"axis\",\n\ttickSize = 6,\n\ttickPadding = 3,\n\tposition,\n\theight,\n\twidth,\n\taxis,\n\tscale,\n\tticks,\n\ttickFormat,\n\tlabel,\n\tlabelX,\n\tlabelY,\n\tname = \"\",\n\tonAxisMount,\n}) => {\n\treturn g => {\n\t\tlet [w, h] = [0, 0];\n\t\tif (position == \"bottom\") h = height;\n\t\tif (position == \"right\") w = width;\n\n\t\tif (axis == \"x\" && type == \"grid\") {\n\t\t\ttickSize = -height;\n\t\t} else if (axis == \"y\" && type == \"grid\") {\n\t\t\ttickSize = -width;\n\t\t}\n\n\t\tlet axisScale = d3[\"axis\" + position.replace(/\\b\\w/g, l => l.toUpperCase())]()\n\t\t\t.scale(scale)\n\t\t\t.ticks(ticks)\n\t\t\t.tickPadding(tickPadding)\n\t\t\t.tickSize(tickSize)\n\t\t\t.tickFormat(tickFormat);\n\n\t\tlet axisGroup = g.append(\"g\")\n\t\t\t.attr(\"class\", [axis, type, position, name].join(\" \"))\n\t\t\t.attr(\"transform\", \"translate(\" + w + \",\" + h + \")\")\n\t\t\t.call(axisScale);\n\n\t\tif (label) {\n\t\t\taxisGroup.append(\"svg:text\")\n\t\t\t\t.attr(\"x\", labelX)\n\t\t\t\t.attr(\"y\", labelY)\n\t\t\t\t.text(label);\n\t\t}\n\n\t\tif (onAxisMount) {\n\t\t\taxisGroup.call(onAxisMount);\n\t\t}\n\n\t\treturn axisGroup;\n\t};\n};\n\nexport const Grid = (props) => {\n\tprops.type = \"grid\";\n\treturn Axis(props);\n};\n\nexport const PositionMarker = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlabels = {},\n\titem = {},\n\tlength = 0,\n}) => {\n\treturn g => {\n\n\t\tg.attr(\"class\", \"height-focus-group\");\n\n\t\tlet line = g.select('.height-focus.line');\n\t\tlet circle = g.select('.height-focus.circle-lower');\n\t\tlet text = g.select('.height-focus-label');\n\n\t\tif (!line.node()) line = g.append('svg:line');\n\t\tif (!circle.node()) circle = g.append('svg:circle');\n\t\tif (!text.node()) text = g.append('svg:text');\n\n\t\tif (isNaN(xCoord) || isNaN(yCoord)) return g;\n\n\t\tcircle\n\t\t\t.attr(\"class\", theme + \" height-focus circle-lower\")\n\t\t\t.attr(\"transform\", \"translate(\" + xCoord + \",\" + yCoord + \")\")\n\t\t\t.attr(\"r\", 6)\n\t\t\t.attr(\"cx\", 0)\n\t\t\t.attr(\"cy\", 0);\n\n\t\tline\n\t\t\t.attr(\"class\", theme + \" height-focus line\")\n\t\t\t.attr(\"x1\", xCoord)\n\t\t\t.attr(\"x2\", xCoord)\n\t\t\t.attr(\"y1\", yCoord)\n\t\t\t.attr(\"y2\", length);\n\n\t\ttext\n\t\t\t.attr(\"class\", theme + \" height-focus-label\")\n\t\t\t.style(\"pointer-events\", \"none\")\n\t\t\t.attr(\"x\", xCoord + 5)\n\t\t\t.attr(\"y\", length);\n\n\t\tlet label;\n\n\t\tObject\n\t\t.keys(labels)\n\t\t.sort((a, b) => labels[a].order - labels[b].order) // TODO: any performance issues?\n\t\t.forEach((i)=> {\n\t\t\tlabel = text.select(\".height-focus-\" + labels[i].name);\n\n\t\t\tif (!label.size()) {\n\t\t\t\tlabel = text.append(\"svg:tspan\")\n\t\t\t\t\t.attr(\"class\", \"height-focus-\" + labels[i].name)\n\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t}\n\n\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(item));\n\n\t\t});\n\n\t\ttext.select('tspan').attr(\"dy\", text.selectAll('tspan').size() > 1 ? \"-1.5em\" : \"0em\" );\n\t\ttext.selectAll('tspan').attr(\"x\", xCoord + 5);\n\n\t\treturn g;\n\t}\n};\n\nexport const LegendItem = ({\n\tname,\n\tlabel,\n\twidth,\n\theight,\n\tmargins = {},\n\tcolor,\n\tpath\n}) => {\n\treturn g => {\n\t\tg\n\t\t\t.attr(\"class\", \"legend-item legend-\" + name.toLowerCase())\n\t\t\t.attr(\"data-name\", name);\n\n\t\tg.on('click.legend', () => d3.select(g.node().ownerSVGElement || g)\n\t\t\t.dispatch(\"legend_clicked\", {\n\t\t\t\tdetail: {\n\t\t\t\t\tpath: path.node(),\n\t\t\t\t\tname: name,\n\t\t\t\t\tlegend: g.node(),\n\t\t\t\t\tenabled: !path.classed('leaflet-hidden'),\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\tg.append(\"svg:rect\")\n\t\t\t.attr(\"x\", (width / 2) - 50)\n\t\t\t.attr(\"y\", height + margins.bottom / 2)\n\t\t\t.attr(\"width\", 50)\n\t\t\t.attr(\"height\", 10)\n\t\t\t.attr(\"fill\", color)\n\t\t\t.attr(\"stroke\", \"#000\")\n\t\t\t.attr(\"stroke-opacity\", \"0.5\")\n\t\t\t.attr(\"fill-opacity\", \"0.25\");\n\n\t\tg.append('svg:text')\n\t\t\t.text(L._(label || name))\n\t\t\t.attr(\"x\", (width / 2) + 5)\n\t\t\t.attr(\"font-size\", 10)\n\t\t\t.style(\"text-decoration-thickness\", \"2px\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr('y', height + margins.bottom / 2)\n\t\t\t.attr('dy', \"0.75em\");\n\n\t\treturn g;\n\t}\n};\n\nexport const Tooltip = ({\n\txCoord,\n\tyCoord,\n\twidth,\n\theight,\n\tlabels = {},\n\titem = {},\n}) => {\n\treturn g => {\n\n\t\tlet line = g.select('.mouse-focus-line');\n\t\tlet box = g.select('.mouse-focus-label');\n\n\t\tif (!line.node()) line = g.append('svg:line');\n\t\tif (!box.node()) box = g.append(\"g\");\n\n\t\tlet rect = box.select(\".mouse-focus-label-rect\");\n\t\tlet text = box.select(\".mouse-focus-label-text\");\n\n\t\tif (!rect.node()) rect = box.append(\"svg:rect\");\n\t\tif (!text.node()) text = box.append(\"svg:text\");\n\n\t\t// Sets focus-label-text position to the left / right of the mouse-focus-line\n\t\tlet xAlign = 0;\n\t\tlet yAlign = 0;\n\t\tlet bbox = { width: 0, height: 0 };\n\t\ttry { bbox = text.node().getBBox(); } catch (e) { return g; }\n\n\t\tif (xCoord) xAlign = xCoord + (xCoord < width / 2 ? 10 : -bbox.width - 10);\n\t\tif (yCoord) yAlign = Math.max(yCoord - bbox.height, L.Browser.webkit ? 0 : -Infinity);\n\n\t\tline\n\t\t\t.attr('class', 'mouse-focus-line')\n\t\t\t.attr('x2', xCoord)\n\t\t\t.attr('y2', 0)\n\t\t\t.attr('x1', xCoord)\n\t\t\t.attr('y1', height);\n\n\t\tbox\n\t\t\t.attr('class', 'mouse-focus-label');\n\n\t\trect\n\t\t\t.attr(\"class\", \"mouse-focus-label-rect\")\n\t\t\t.attr(\"x\", xAlign - 5)\n\t\t\t.attr(\"y\", yAlign - 5)\n\t\t\t.attr(\"width\", bbox.width + 10)\n\t\t\t.attr(\"height\", bbox.height + 10)\n\t\t\t.attr(\"rx\", 3)\n\t\t\t.attr(\"ry\", 3);\n\n\t\ttext\n\t\t\t.attr(\"class\", \"mouse-focus-label-text\")\n\t\t\t.style(\"font-weight\", \"700\")\n\t\t\t.attr(\"y\", yAlign);\n\n\t\tlet label;\n\n\t\tObject\n\t\t\t.keys(labels)\n\t\t\t.sort((a, b) => labels[a].order - labels[b].order) // TODO: any performance issues?\n\t\t\t.forEach((i)=> {\n\t\t\t\tlabel = text.select(\".mouse-focus-label-\" + labels[i].name);\n\n\t\t\t\tif (!label.size()) {\n\t\t\t\t\tlabel = text.append(\"svg:tspan\", \".mouse-focus-label-x\")\n\t\t\t\t\t\t.attr(\"class\", \"mouse-focus-label-\" + labels[i].name)\n\t\t\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t\t\t}\n\n\t\t\t\tlabel.text(typeof labels[i].value !== \"function\" ? labels[i].value : labels[i].value(item));\n\t\t\t});\n\n\t\ttext.select('tspan').attr(\"dy\", \"1em\");\n\t\ttext.selectAll('tspan').attr(\"x\", xAlign);\n\n\t\treturn g;\n\t};\n};\n\nexport const Ruler = ({\n\theight,\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.data([{\n\t\t\t\t\"x\": 0,\n\t\t\t\t\"y\": height,\n\t\t\t}])\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tlet rect = g.selectAll('.horizontal-drag-rect')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet line = g.selectAll('.horizontal-drag-line')\n\t\t\t.data([{ w: width }]);\n\n\t\tlet label = g.selectAll('.horizontal-drag-label')\n\t\t\t.data([{ w: width - 8 }]);\n\n\t\tlet symbol = g.selectAll('.horizontal-drag-symbol')\n\t\t\t.data([{\n\t\t\t\t\"type\": d3.symbolTriangle,\n\t\t\t\t\"x\": width + 7,\n\t\t\t\t\"y\": 0,\n\t\t\t\t\"angle\": -90,\n\t\t\t\t\"size\": 50\n\t\t\t}]);\n\n\t\trect.exit().remove();\n\t\tline.exit().remove();\n\t\tlabel.exit().remove();\n\t\tsymbol.exit().remove();\n\n\t\trect.enter()\n\t\t\t.append(\"svg:rect\")\n\t\t\t.attr(\"class\", \"horizontal-drag-rect\")\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", -8)\n\t\t\t.attr(\"height\", 8)\n\t\t\t.attr('fill', 'none')\n\t\t\t.attr('pointer-events', 'all')\n\t\t\t.merge(rect)\n\t\t\t.attr(\"width\", d => d.w);\n\n\t\tline.enter()\n\t\t\t.append(\"svg:line\")\n\t\t\t.attr(\"class\", \"horizontal-drag-line\")\n\t\t\t.attr(\"x1\", 0)\n\t\t\t.merge(line)\n\t\t\t.attr(\"x2\", d => d.w);\n\n\t\tlabel.enter()\n\t\t\t.append(\"svg:text\")\n\t\t\t.attr(\"class\", \"horizontal-drag-label\")\n\t\t\t.attr(\"text-anchor\", \"end\")\n\t\t\t.attr(\"y\", -8)\n\t\t\t.merge(label)\n\t\t\t.attr(\"x\", d => d.w)\n\n\t\tsymbol\n\t\t\t.enter()\n\t\t\t.append(\"svg:path\")\n\t\t\t.attr(\"class\", \"horizontal-drag-symbol\")\n\t\t\t.merge(symbol)\n\t\t\t.attr(\"d\",\n\t\t\t\td3.symbol()\n\t\t\t\t.type(d => d.type)\n\t\t\t\t.size(d => d.size)\n\t\t\t)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \") rotate(\" + d.angle + \")\");\n\n\t\treturn g;\n\t}\n};\n\nexport const CheckPoint = ({\n\tpoint,\n\theight,\n\twidth,\n\tx,\n\ty\n}) => {\n\treturn g => {\n\n\t\tif (isNaN(x) || isNaN(y)) return g;\n\n\t\tif (!point.item || !point.item.property('isConnected')) {\n\t\t\tpoint.position = point.position || \"bottom\";\n\n\t\t\tpoint.item = g.append('g');\n\n\t\t\tpoint.item.append(\"svg:line\")\n\t\t\t\t.attr(\"y1\", 0)\n\t\t\t\t.attr(\"x1\", 0)\n\t\t\t\t.attr(\"style\",\"stroke: rgb(51, 51, 51); stroke-width: 0.5; stroke-dasharray: 2, 2;\");\n\n\t\t\tpoint.item\n\t\t\t\t.append(\"svg:circle\")\n\t\t\t\t.attr(\"class\", \" height-focus circle-lower\")\n\t\t\t\t.attr(\"r\", 3);\n\n\t\t\tif (point.label) {\n\t\t\t\tpoint.item.append(\"svg:text\")\n\t\t\t\t\t.attr(\"dx\", \"4px\")\n\t\t\t\t\t.attr(\"dy\", \"-4px\");\n\t\t\t}\n\t\t}\n\n\t\tpoint.item\n\t\t\t.datum({\n\t\t\t\tpos: point.position,\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t})\n\t\t\t.attr(\"class\", d => \"point \" + d.pos)\n\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\");\n\n\t\tpoint.item.select('line')\n\t\t\t.datum({\n\t\t\t\ty2: ({'top': -y, 'bottom': height - y})[point.position],\n\t\t\t\tx2: ({'left': -x, 'right': width - x})[point.position] || 0\n\t\t\t})\n\t\t\t.attr(\"y2\", d => d.y2)\n\t\t\t.attr(\"x2\", d => d.x2)\n\n\t\tif (point.label) {\n\t\t\tpoint.item.select('text')\n\t\t\t\t.text(point.label);\n\t\t}\n\n\t\treturn g;\n\t}\n};\n\nexport const Domain = ({\n\tmin,\n\tmax,\n\tattr,\n\tname,\n\tforceBounds,\n\tscale\n}) => function(data) {\n\tattr = attr || name;\n\tif (scale && scale.attr) attr = scale.attr;\n\tlet domain = data && data.length ? d3.extent(data, d => d[attr]) : [0, 1];\n\tif (typeof min !== \"undefined\" && (min < domain[0] || forceBounds)) {\n\t\tdomain[0] = min;\n\t}\n\tif (typeof max !== \"undefined\" && (max > domain[1] || forceBounds)) {\n\t\tdomain[1] = max;\n\t}\n\treturn domain;\n};\n\nexport const Range = ({\n\taxis\n}) => function(width, height) {\n\tif (axis == 'x') return [0, width];\n\telse if (axis == 'y') return [height, 0];\n};\n\nexport const Scale = ({\n\tdata,\n\tattr,\n\tmin,\n\tmax,\n\tforceBounds,\n\trange,\n}) => {\n\treturn d3.scaleLinear()\n\t\t.range(range)\n\t\t.domain(Domain({min, max, attr, forceBounds})(data));\n};\n\nexport const Bisect = ({\n\tdata = [0, 1],\n\tscale,\n\tx,\n\tattr\n}) => {\n\treturn d3\n\t\t.bisector(d => d[attr])\n\t\t.left(data, scale.invert(x));\n};\n\nexport const Chart = ({\n\twidth,\n\theight,\n\tmargins = {},\n\truler,\n}) => {\n\n\tconst _width = width - margins.left - margins.right;\n\tconst _height = height - margins.top - margins.bottom;\n\n\t// SVG Container\n\tconst svg = d3.create(\"svg:svg\").attr(\"class\", \"background\");\n\n\t// SVG Groups\n\tconst g = svg.append(\"g\");\n\tconst panes = {\n\t\tgrid : g.append(\"g\").attr(\"class\", \"grid\"),\n\t\tarea : g.append('g').attr(\"class\", \"area\"),\n\t\taxis : g.append('g').attr(\"class\", \"axis\"),\n\t\tpoint : g.append('g').attr(\"class\", \"point\"),\n\t\tbrush : g.append(\"g\").attr(\"class\", \"brush\"),\n\t\ttooltip: g.append(\"g\").attr(\"class\", \"tooltip\").attr('display', 'none'),\n\t\truler : g.append('g').attr('class', 'ruler'),\n\t\tlegend : g.append('g').attr(\"class\", \"legend\"),\n\t};\n\n\t// SVG Paths\n\tconst mask = panes.area.append(\"svg:mask\").attr(\"id\", 'elevation-clipper').attr('fill-opacity', 1);\n\tconst maskRect = mask.append(\"svg:rect\").attr('class', 'zoom').attr('fill', 'white'); // white = transparent\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject').attr('mask', 'url(#' + mask.attr('id') + ')');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Add tooltip\n\tpanes.tooltip.call(Tooltip({ xCoord: 0, yCoord: 0, height: _height, width : _width, labels: {} }));\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => panes.brush.select(\".overlay\").attr('cursor', null));\n\n\t// Scales\n\tconst scale = (opts) => ({ x: Scale(opts.x), y: Scale(opts.y)});\n\n\tlet utils = {\n\t\tmask,\n\t\tcanvas,\n\t\tcontext,\n\t\tbrush,\n\t};\n\n\tlet chart = {\n\t\tsvg,\n\t\tg,\n\t\tpanes,\n\t\tutils,\n\t\tscale,\n\t};\n\n\t// Resize\n\tchart._resize = ({\n\t\twidth,\n\t\theight,\n\t\tmargins = {},\n\t\truler,\n\t}) => {\n\n\t\tconst _width = width - margins.left - margins.right;\n\t\tconst _height = height - margins.top - margins.bottom;\n\n\t\tsvg.attr(\"viewBox\", `0 0 ${width} ${height}`)\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height);\n\n\t\tg.attr(\"transform\", \"translate(\" + margins.left + \",\" + margins.top + \")\");\n\n\t\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/123\n\t\tif(/Mac|iPod|iPhone|iPad/.test(navigator.platform) && /AppleWebkit/i.test(navigator.userAgent)) {\n\t\t\tcanvas\n\t\t\t.style(\"transform\", \"translate(\" + margins.left + \"px,\" + margins.top + \"px)\");\n\t\t}\n\n\t\tmaskRect\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", _width)\n\t\t\t.attr(\"height\", _height);\n\n\t\tforeignObject\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tcanvas\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tif (ruler) {\n\t\t\tpanes.ruler.call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tpanes.brush.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tpanes.brush.select(\".overlay\").attr('cursor', null);\n\n\t\tchart._width = _width;\n\t\tchart._height = _height;\n\n\t\tchart.svg.dispatch('resize', { detail: { width: _width, height: _height } } );\n\n\t};\n\n\tchart.pane = (name) => {\n\t\tif (!panes[name]) {\n\t\t\tpanes[name] = g.append('g').attr(\"class\", name);\n\t\t}\n\t\treturn panes[name];\n\t}\n\n\tchart.get = (name) => utils[name];\n\n\tchart._resize({ width, height, margins});\n\n\treturn chart;\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Chart = L.Class.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tthis._data = [];\n\n\t\t// cache registered components\n\t\tthis._props = {\n\t\t\tscales : {},\n\t\t\tpaths : {},\n\t\t\tareas : {},\n\t\t\tgrids : {},\n\t\t\taxes : {},\n\t\t\tlegendItems : {},\n\t\t\ttooltipItems: {},\n\t\t};\n\n\t\tthis._scales = {};\n\t\tthis._domains = {};\n\t\tthis._ranges = {};\n\t\tthis._paths = {};\n\n\t\tthis._brushEnabled = opts.dragging;\n\t\tthis._zoomEnabled = opts.zooming;\n\n\t\tlet chart = this._chart = D3.Chart(opts);\n\n\t\t// SVG Container\n\t\tlet svg = this._container = chart.svg;\n\n\t\t// Panes\n\t\tthis._grid = chart.pane('grid');\n\t\tthis._area = chart.pane('area');\n\t\tthis._point = chart.pane('point');\n\t\tthis._axis = chart.pane('axis');\n\t\tthis._legend = chart.pane('legend');\n\t\tthis._tooltip = chart.pane('tooltip');\n\t\tthis._ruler = chart.pane('ruler');\n\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._mask = chart.get('mask');\n\t\tthis._context = chart.get('context');\n\t\tthis._brush = chart.get('brush');\n\n\t\tthis._zoom = d3.zoom();\n\t\tthis._drag = d3.drag();\n\n\t\t// Interactions\n\t\tthis._initInteractions();\n\n\t\t// svg.on('resize', (e)=>console.log(e.detail));\n\n\t\t// Handle multi-track segments (BETA)\n\t\tthis._maskGaps = [];\n\t\tcontrol.on('eletrack_added', (e) => {\n\t\t\tthis._maskGaps.push(e.index);\n\t\t\tcontrol.once('eledata_updated', (e) => this._maskGaps.push(e.index));\n\t\t});\n\n\t},\n\n\tupdate: function(props) {\n\t\tif (props) {\n\t\t\tif (props.data) this._data = props.data;\n\t\t\tif (props.options) this.options = props.options;\n\t\t}\n\n\t\tthis._updateScale();\n\t\tthis._updateArea();\n\t\tthis._updateAxis();\n\t\tthis._updateLegend();\n\t\tthis._updateClipper();\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container.node());\n\t},\n\n\tclear: function() {\n\t\tthis._resetDrag();\n\t\tthis._hideDiagramIndicator()\n\t\tthis._area.selectAll('path').attr(\"d\", \"M0 0\");\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\n\t\t// if (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t// }\n\n\t\tthis._maskGaps = [];\n\t\tthis._mask.selectAll(\".gap\").remove();\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\n\t\tpath.datum(this._data).attr(\"d\",\n\t\t\tD3.Area(\n\t\t\t\tL.extend({}, area, {\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tscaleX : this._scales[area.scaleX],\n\t\t\t\t\tscaleY : this._scales[area.scaleY]\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (this.options.preferCanvas) {\n\t\t\t_.drawCanvas(this._context, path);\n\t\t} else {\n\t\t\tthis._area.append(() => path.node());\n\t\t}\n\t},\n\n\t_hasActiveLayers: function() {\n\t\tconst paths = this._paths;\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Initialize \"d3-brush\".\n\t */\n\t_initBrush: function(e) {\n\t\tconst brush = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tlet extent = e.selection;\n\t\t\tif (extent) {\n\t\t\t\tlet start = this._findIndexForXCoord(extent[0]);\n\t\t\t\tlet end = this._findIndexForXCoord(extent[1]);\n\t\t\t\tthis.fire('dragged', { dragstart: this._data[start], dragend: this._data[end] });\n\t\t\t}\n\t\t}\n\n\t\tconst focus = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tif (e.type == 'brush' && !e.sourceEvent) return;\n\t\t\tlet rect = this._chart.panes.brush.select('.overlay').node();\n\t\t\tlet coords = d3.pointers(e, rect)[0];\n\t\t\tlet xCoord = coords[0];\n\t\t\tlet item = this._data[this._findIndexForXCoord(xCoord)];\n\n\t\t\tthis.fire(\"mouse_move\", { item: item, xCoord: xCoord });\n\t\t};\n\n\t\tthis._brush\n\t\t\t.filter((e) => this._brushEnabled && !e.shiftKey && !e.button)\n\t\t\t.on(\"end.update\", brush)\n\t\t\t.on(\"brush.update\", focus);\n\n\t\tthis._chart.panes.brush\n\t\t\t.on(\"mouseenter.focus touchstart.focus\", this.fire.bind(this, \"mouse_enter\"))\n\t\t\t.on(\"mouseout.focus touchend.focus\", this.fire.bind(this, \"mouse_out\") )\n\t\t\t.on(\"mousemove.focus touchmove.focus\", focus );\n\n\t},\n\n\t/**\n\t * Initialize \"d3-zoom\"\n\t */\n\t_initClipper: function() {\n\t\tlet svg = this._container;\n\t\tlet margin = this.options.margins;\n\n\t\tconst zoom = this._zoom;\n\n\t\tconst onStart = (e) => {\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousedown\") svg.style('cursor', 'grabbing');\n\t\t\tif (e.transform.k == 1 && e.transform.x == 0) {\n\t\t\t\tthis._container.classed('zoomed', true);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = true;\n\t\t};\n\n\t\tconst onEnd = (e) => {\n\t\t\tif (e.transform.k ==1 && e.transform.x == 0){\n\t\t\t\tthis._container.classed('zoomed', false);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = false;\n\t\t\tsvg.style('cursor', '');\n\t\t};\n\n\t\tconst onZoom = (e) => {\n\t\t\t// TODO: find a faster way to redraw the chart.\n\t\t\tthis.zooming = false;\n\t\t\tthis._updateScale(); // hacky way for restoring x scale when zooming out\n\t\t\tthis.zooming = true;\n\t\t\tthis._scales.distance = this._x = e.transform.rescaleX(this._x); // calculate x scale at zoom level\n\t\t\tif (this._scales.time) this._scales.time = e.transform.rescaleX(this._scales.time); // calculate x scale at zoom level\n\t\t\tthis._resetDrag();\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousemove\") {\n\t\t\t\tthis._hideDiagramIndicator();\n\t\t\t}\n\t\t\tthis.fire('zoom');\n\t\t};\n\n\t\tzoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t])\n\t\t\t.filter((e) => this._zoomEnabled && (e.shiftKey || e.buttons == 4))\n\t\t\t.on(\"start\", onStart)\n\t\t\t.on(\"end\", onEnd)\n\t\t\t.on(\"zoom\", onZoom);\n\n\t\tsvg.call(zoom); // add zoom functionality to \"svg\" group\n\n\t\t// d3.select(\"body\").on(\"keydown.grabzoom keyup.grabzoom\", (e) => svg.style('cursor', e.shiftKey ? 'move' : ''));\n\n\t},\n\n\t_initInteractions: function() {\n\t\tthis._initBrush();\n\t\tthis._initRuler();\n\t\tthis._initClipper();\n\t\tthis._initLegend();\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_initLegend: function() {\n\t\tthis._container.on('legend_clicked', (e) => {\n\t\t\tlet { path, legend, name, enabled } = e.detail;\n\n\t\t\tif (!path) return;\n\n\t\t\tlet label = _.select('text', legend);\n\t\t\tlet rect = _.select('rect', legend);\n\n\t\t\t_.toggleStyle(label, 'text-decoration-line', 'line-through', enabled);\n\t\t\t_.toggleStyle(rect, 'fill-opacity', '0', enabled);\n\t\t\t_.toggleClass(path, 'leaflet-hidden', enabled);\n\n\t\t\tthis._updateArea();\n\n\t\t\tthis.fire(\"elepath_toggle\", { path, name, legend, enabled })\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"ruler\".\n\t */\n\t_initRuler: function() {\n\t\tif (!this.options.ruler) return;\n\n\t\t// const yMax = this._height();\n\t\tconst formatNum = d3.format(\".0f\");\n\t\tconst drag = this._drag;\n\n\t\tconst label = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet y = this._ruler.data()[0].y;\n\t\t\tif (y >= yMax || y <= 0) this._ruler.select(\".horizontal-drag-label\").text('');\n\t\t\tthis._hideDiagramIndicator();\n\t\t};\n\n\t\tconst position = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet yCoord = d3.pointers(e, this._area.node())[0][1];\n\t\t\tlet y = yCoord > 0 ? (yCoord < yMax ? yCoord : yMax) : 0;\n\t\t\tlet z = this._y.invert(y);\n\t\t\tlet data = L.extend(this._ruler.data()[0], { y: y });\n\n\t\t\tthis._ruler\n\t\t\t\t.data([data])\n\t\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\")\n\t\t\t\t.classed('active', y < yMax);\n\n\t\t\tthis._container.select(\".horizontal-drag-label\")\n\t\t\t\t.text(formatNum(z) + \" \" + (this.options.imperial ? 'ft' : 'm'));\n\n\t\t\tthis.fire('ruler_filter', { coords: yCoord < yMax && yCoord > 0 ? this._findCoordsForY(yCoord) : [] });\n\t\t}\n\n\t\tdrag\n\t\t.on(\"start end\", label)\n\t\t.on(\"drag\", position);\n\n\t\tthis._ruler.call(drag);\n\n\t},\n\n\t/**\n\t * Initialize x and y scales\n\t */\n\t_initScale: function() {\n\t\tlet opts = this.options;\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'x',\n\t\t\tposition: 'bottom',\n\t\t\tattr : opts.xAttr,\n\t\t\tmin : opts.xAxisMin,\n\t\t\tmax : opts.xAxisMax,\n\t\t\tname : 'distance'\n\t\t});\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'y',\n\t\t\tposition : 'left',\n\t\t\tattr : opts.yAttr,\n\t\t\tmin : opts.yAxisMin,\n\t\t\tmax : opts.yAxisMax,\n\t\t\tname : 'altitude'\n\t\t});\n\n\t\tthis._x = this._scales.distance;\n\t\tthis._y = this._scales.altitude;\n\t},\n\n\t_registerAreaPath: function(props) {\n\t\tif (props.scale == 'y') props.scale = this._y;\n\t\telse if (props.scale == 'x') props.scale = this._x;\n\n\t\tlet opts = this.options;\n\n\t\tif (!props.xAttr) props.xAttr = opts.xAttr;\n\t\tif (!props.yAttr) props.yAttr = opts.yAttr;\n\t\tif (typeof props.preferCanvas === \"undefined\") props.preferCanvas = opts.preferCanvas;\n\n\t\tlet path = D3.Path(props);\n\n\t\t// Save paths in memory for latter usage\n\t\tthis._paths[props.name] = path;\n\t\tthis._props.areas[props.name] = props;\n\n\t\tif (opts.legend) {\n\t\t\tthis._props.legendItems[props.name] = {\n\t\t\t\tname : props.name,\n\t\t\t\tlabel : props.label,\n\t\t\t\tcolor : props.color,\n\t\t\t\tpath : path\n\t\t\t};\n\t\t}\n\n\t},\n\n\t_registerAxisGrid: function(props) {\n\t\tif (props.scale == 'y') props.scale = this._y;\n\t\telse if(props.scale == 'x') props.scale = this._x;\n\n\t\tthis._props.grids[props.name || props.axis] = props;\n\t},\n\n\t_registerAxisScale: function(props) {\n\t\tif (props.scale == 'y') props.scale = this._y;\n\t\telse if(props.scale == 'x') props.scale = this._x;\n\n\t\tlet opts = this.options;\n\t\tlet scale = props.scale;\n\n\t\tif (typeof this._scales[props.name] === 'function') {\n\t\t\tprops.scale = this._scales[props.name]; // retrieve cached scale\n\t\t} else if (typeof scale !== 'function') {\n\t\t\tscale = L.extend({\n\t\t\t\tdata : this._data,\n\t\t\t\tforceBounds: opts.forceAxisBounds\n\t\t\t}, scale);\n\n\t\t\tscale.attr = scale.attr || props.name;\n\n\t\t\tlet domain = this._domains[props.name] = D3.Domain(props);\n\t\t\tlet range = this._ranges[props.name] = D3.Range(props);\n\t\t\tscale.range = scale.range || range(this._width(),this._height());\n\t\t\tscale.domain = scale.domain || domain(this._data);\n\n\t\t\tthis._props.scales[props.name] = scale;\n\n\t\t\tprops.scale = this._scales[props.name] = D3.Scale(scale);\n\t\t}\n\n\t\tif (!props.ticks) {\n\t\t\tif (props.axis == 'x') props.ticks = opts.xTicks;\n\t\t\telse if (props.axis == 'y') props.ticks = opts.yTicks;\n\t\t}\n\n\t\tthis._props.axes[props.name] = props;\n\n\t\treturn scale;\n\t},\n\n\t/**\n\t * Add a point of interest over the chart\n\t */\n\t_registerCheckPoint: function(point) {\n\t\tif (!this._data.length) return;\n\n\t\tlet item, x, y;\n\n\t\tif (point.latlng) {\n\t\t\titem = this._data[this._findIndexForLatLng(point.latlng)];\n\t\t\tx = this._x(item.dist);\n\t\t\ty = this._y(item.z);\n\t\t} else if (!isNaN(point.dist)) {\n\t\t\tx = this._x(point.dist);\n\t\t\titem = this._data[this._findIndexForXCoord(x)]\n\t\t\ty = this._y(item.z);\n\t\t} \n\n\t\tthis._point.call(D3.CheckPoint({\n\t\t\tpoint: point,\n\t\t\twidth: this._width(),\n\t\t\theight: this._height(),\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t}));\n\t},\n\n\t_registerTooltip: function(props) {\n\t\tprops.order = props.order ?? 100;\n\t\tthis._props.tooltipItems[props.name] = props;\n\t},\n\n\t_updateArea: function() {\n\t\tlet paths = this._paths;\n\t\t// Reset and update chart profiles\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\tthis._drawPath(i);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updateAxis: function() {\n\n\t\tlet opts = this.options;\n\n\t\t// Reset chart axis.\n\t\tthis._grid.selectAll('g').remove();\n\t\tthis._axis.selectAll('g').remove();\n\n\t\tlet grids = this._props.grids;\n\t\tlet axes = this._props.axes;\n\t\tlet props, axis, grid;\n\n\t\tlet gridOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\ttickFormat: \"\",\n\t\t};\n\t\tlet axesOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t};\n\n\t\t// Render grids\n\t\tfor (let i in grids) {\n\t\t\tprops = L.extend({}, gridOpts, grids[i]);\n\t\t\tgrid = D3.Grid(props);\n\t\t\tthis._grid.call(grid);\n\t\t}\n\n\t\t// Render axis\n\t\tfor (let i in axes) {\n\t\t\tif (opts[i] === false || opts[i] === 'summary') continue;\n\t\t\tprops = L.extend({}, axesOpts, axes[i]);\n\t\t\taxis = D3.Axis(props);\n\t\t\tthis._axis.call(axis);\n\t\t}\n\n\t\t// Adjust axis scale positions\n\t\tthis._axis\n\t\t\t.selectAll('.y.axis.right')\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet axis = d3.select(n[i]);\n\t\t\t\tlet transform = axis.attr('transform');\n\t\t\t\tlet translate = transform.substring(transform.indexOf(\"(\") + 1, transform.indexOf(\")\")).split(\",\");\n\n\t\t\t\taxis.attr('transform', 'translate(' + (+translate[0] + (i * 40)) + ',' + translate[1] + ')')\n\n\t\t\t\tif (i > 0) {\n\t\t\t\t\taxis.select(':scope > path') .attr('opacity', 0.25);\n\t\t\t\t\taxis.selectAll(':scope > .tick line').attr('opacity', 0.75);\n\t\t\t\t}\n\n\t\t\t});\n\n\t},\n\n\t_updateClipper: function() {\n\t\tlet margin = this.options.margins;\n\n\t\tthis._zoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t]);\n\n\t\t// Apply svg mask on multi-track segments (BETA)\n\t\tthis._mask.selectAll(\".gap\").remove()\n\t\tthis._maskGaps.forEach((d, i) => {\n\t\t\tif(i >= this._maskGaps.length - 2) return;\n\t\t\tlet d1 = this._data[this._maskGaps[i]];\n\t\t\tlet d2 = this._data[this._maskGaps[i + 1]];\n\t\t\tlet x1 = this._x(this._data[this._findIndexForLatLng(d1.latlng)].dist);\n\t\t\tlet x2 = this._x(this._data[this._findIndexForLatLng(d2.latlng)].dist);\n\t\t\tthis._mask\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"x\", x1)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"width\", x2 - x1 )\n\t\t\t\t.attr(\"height\", this._height())\n\t\t\t\t.attr('class', 'gap')\n\t\t\t\t.attr('fill-opacity', '0.8')\n\t\t\t\t.attr(\"fill\", 'black'); // black = hide\n\t\t});\n\t},\n\n\t_updateLegend: function () {\n\n\t\tif (this.options.legend === false) return;\n\n\t\tlet legends = this._props.legendItems;\n\t\tlet legend;\n\n\t\t// Reset legend items\n\t\tthis._legend.selectAll('g').remove();\n\t\tfor (var i in legends) {\n\t\t\tlegend = D3.LegendItem(\n\t\t\t\tL.extend({\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tmargins: this.options.margins,\n\t\t\t\t}, legends[i])\n\t\t\t)\n\t\t\tthis._legend.append(\"g\").call(legend);\n\t\t}\n\n\t\t// Get legend items\n\t\tlet items = this._legend.selectAll('.legend-item');\n\n\t\t// Calculate legend item positions\n\t\tlet n = items.nodes().length;\n\t\tlet v = Array(Math.floor(n / 2)).fill(null).map((d, i) => (i + 1) * 2 - (1 - Math.sign(n % 2)));\n\t\tlet rev = v.slice().reverse().map((d) => -(d));\n\n\t\tif (n % 2 !== 0) {\n\t\t\trev.push(0);\n\t\t}\n\t\tv = rev.concat(v);\n\n\t\t// Get chart margins\n\t\tlet xAxesB = this._axis.selectAll('.x.axis.bottom').nodes().length;\n\t\tlet marginB = 30 + (xAxesB * 2);\n\t\tlet marginR = n * 30;\n\n\t\t// Adjust chart right margins\n\t\tif (n && this.options.margins.right < marginR) {\n\t\t\tthis.options.margins.right = marginR;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\t// Adjust chart bottom margins\n\t\tif(xAxesB && this.options.margins.bottom < marginB) {\n\t\t\tthis.options.margins.bottom = marginB;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\titems\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet legend = d3.select(n[i]);\n\t\t\t\tlet rect = legend.select('rect');\n\t\t\t\tlet name = legend.attr('data-name');\n\t\t\t\tlet path = this._paths[name];\n\n\t\t\t\tlet tx = v[i] * 55;\n\t\t\t\tlet ty = xAxesB * 2;\n\n\t\t\t\tlegend\n\n\t\t\t\t// Adjust legend item positions\n\t\t\t\t.attr(\"transform\", \"translate(\" + tx + \", \" + ty + \")\");\n\n\t\t\t\t// Set initial state (disabled controls)\n\t\t\t\tif (name in this.options && this.options[name] == 'disabled') {\n\t\t\t\t\tpath.classed('leaflet-hidden', true);\n\t\t\t\t\tlegend.select('text').style('text-decoration-line', 'line-through');\n\t\t\t\t\tlegend.select('rect').style('fill-opacity', '0');\n\t\t\t\t}\n\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tpath.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\n\t\t\t});\n\t},\n\n\t_updateScale: function() {\n\t\tif (this.zooming) return { x: this._x, y: this._y };\n\n\t\tfor (let i in this._scales) {\n\t\t\tthis._scales[i]\n\t\t\t\t.domain(this._domains[i](this._data))\n\t\t\t\t.range(this._ranges[i](this._width(), this._height()))\n\t\t}\n\n\t\treturn { x: this._x, y: this._y };\n\t},\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\treturn this._chart._width;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\treturn this._chart._height;\n\t},\n\n\t/*\n\t * Finds data entries above a given y-elevation value and returns geo-coordinates\n\t */\n\t_findCoordsForY: function(y) {\n\t\tlet data = this._data;\n\t\tlet z = this._y.invert(y);\n\n\t\t// save indexes of elevation values above the horizontal line\n\t\tconst list = data.reduce((array, item, index) => {\n\t\t\tif (item.z >= z) array.push(index);\n\t\t\treturn array;\n\t\t}, []);\n\n\t\tlet start = 0;\n\t\tlet next;\n\n\t\t// split index list into blocks of coordinates\n\t\tconst coords = list.reduce((array, _, curr) => {\n\t\t\tnext = curr + 1;\n\t\t\tif (list[next] !== list[curr] + 1 || next === list.length) {\n\t\t\t\tarray.push(\n\t\t\t\t\tlist\n\t\t\t\t\t.slice(start, next)\n\t\t\t\t\t.map(i => data[i].latlng)\n\t\t\t\t);\n\t\t\t\tstart = next;\n\t\t\t}\n\t\t\treturn array;\n\t\t}, []);\n\n\t\treturn coords;\n\t},\n\n\t/*\n\t * Finds a data entry for a given x-coordinate of the diagram\n\t */\n\t_findIndexForXCoord: function(x) {\n\t\treturn d3\n\t\t\t.bisector(d => d[this.options.xAttr])\n\t\t\t.left(this._data || [0, 1], this._x.invert(x));\n\t},\n\n\t/*\n\t * Finds a data entry for a given latlng of the map\n\t */\n\t_findIndexForLatLng: function(latlng) {\n\t\tlet result = null;\n\t\tlet d = Infinity;\n\t\tthis._data.forEach((item, index) => {\n\t\t\tlet dist = latlng.distanceTo(item.latlng);\n\t\t\tif (dist < d) {\n\t\t\t\td = dist;\n\t\t\t\tresult = index;\n\t\t\t}\n\t\t});\n\t\treturn result;\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\tif (this._chart.panes.brush.select(\".selection\").attr('width')) {\n\t\t\tthis._chart.panes.brush.call(this._brush.clear);\n\t\t\tthis._hideDiagramIndicator();\n\t\t\tthis.fire('reset_drag');\n\t\t}\n\t},\n\n\t_resetZoom: function() {\n\t\tif (this._zoom) {\n\t\t\tthis._zoom.transform(this._chart.svg, d3.zoomIdentity);\n\t\t}\n\t},\n\n\t/**\n\t * Display distance and altitude level (\"focus-rect\").\n\t */\n\t_showDiagramIndicator: function(item, xCoordinate) {\n\t\tthis._tooltip\n\t\t\t.attr(\"display\", null)\n\t\t\t.call(D3.Tooltip({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: this._y(item[this.options.yAttr]),\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabels: this._props.tooltipItems,\n\t\t\t\titem: item\n\t\t\t}));\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._tooltip.attr(\"display\", 'none');\n\t},\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Marker = L.Class.extend({\n\n\tinitialize: function(options) {\n\t\tthis.options = options;\n\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line':\n\t\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\tbreak;\n\t\t\tcase 'position-marker':\n\t\t\t\t// this._marker = L.circleMarker([0, 0], { pane: 'overlayPane', radius: 6, fillColor: '#fff', fillOpacity:1, color: '#000', weight:1, interactive: false });\n\t\t\t\tthis._marker = L.marker([0, 0], { icon: this.options.markerIcon, zIndexOffset: 1000000, interactive: false });\n\t\t\tbreak;\n\t\t}\n\n\t\tthis._labels = {};\n\n\t\treturn this;\n\t},\n\n\taddTo: function(map) {\n\t\tthis._map = map;\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line': this._container = d3.select(map.getPane('elevationPane')).select(\"svg > g\").call(D3.PositionMarker({})); break;\n\t\t\tcase 'position-marker': this._marker.addTo(map, { pane: 'overlayPane' }); break;\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Update position marker (\"leaflet-marker\").\n\t */\n\tupdate: function(props) {\n\t\tif (props) this._props = props;\n\t\telse props = this._props;\n\n\t\tif(!props) return;\n\n\t\tif (props.options) this.options = props.options;\n\t\tif (!this._map) this.addTo(props.map);\n\n\t\tthis._latlng = props.item.latlng;\n\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line':\n\t\t\t\tif (this._container) {\n\t\t\t\t\tlet point = this._map.latLngToLayerPoint(this._latlng);\n\t\t\t\t\tpoint = L.extend({}, props.item, this._map._rotate ? this._map.rotatedPointToMapPanePoint(point) : point);\n\n\t\t\t\t\tthis._container.classed(\"leaflet-hidden\", false);\n\t\t\t\t\tthis._container.call(D3.PositionMarker({\n\t\t\t\t\t\ttheme : this.options.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\t\tlength: point.y - (this._height() / props.maxElevation * point.z), // normalized Y\n\t\t\t\t\t\tlabels: this._labels,\n\t\t\t\t\t\titem: point\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'position-marker':\n\t\t\t\t_.removeClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t\t\tthis._marker.setLatLng(this._latlng);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\tremove: function() {\n\t\tthis._props = null;\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line': this._container && this._container.classed(\"leaflet-hidden\", true); break;\n\t\t\tcase 'position-marker': _.addClass(this._marker.getElement(), 'leaflet-hidden'); break;\n\t\t}\n\t},\n\n\tgetLatLng: function() {\n\t\treturn this._latlng;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t_registerTooltip: function(props) {\n\t\tthis._labels[props.name] = props;\n\t}\n\n});\n","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Elevation } from './control';\nimport './distance';\nimport './time';\nimport './altitude';\nimport './slope';\nimport './speed';\nimport './acceleration';\n\nElevation.Utils = _;\nElevation.Components = D3;\nElevation.Chart = Chart;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\n// Alias deprecated functions\n Elevation.addInitHook(function() {\n\tthis.enableDragging = this.enableBrush;\n\tthis.disableDragging = this.disableBrush;\n\tthis.loadChart = this.addTo;\n\tthis.loadData = this.load;\n\tthis.loadGPX = this.load;\n\tthis.loadGeoJSON = this.load;\n\tthis.loadXML = this.load;\n\tthis.loadFile = this.load;\n\tthis._addGPXData = this._addGeoJSONData;\n\tthis._registerFocusLabel = this._registerTooltip;\n});\n\nL.control.elevation = (options) => new Elevation(options);\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Summary = L.Class.extend({\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\t\tthis.labels = {};\n\n\t\tlet summary = this._container = _.create(\"div\", \"elevation-summary \" + (opts.summary ? opts.summary + \"-summary\" : ''));\n\t\t_.style(summary, 'max-width', opts.width ? opts.width + 'px' : '');\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container);\n\t},\n\n\treset: function() {\n\t\tthis._container.innerHTML = '';\n\t},\n\n\tappend: function(className, label, value) {\n\t\tthis._container.innerHTML += `<span class=\"${className}\"><span class=\"summarylabel\">${label}</span><span class=\"summaryvalue\">${value}</span></span>`;\n\t\treturn this;\n\t},\n\n\tupdate: function() {\n\t\tObject\n\t\t.keys(this.labels)\n\t\t.sort((a, b) => this.labels[a].order - this.labels[b].order) // TODO: any performance issues?\n\t\t.forEach((i)=> {\n\t\t\tthis.append(i, L._(this.labels[i].label), typeof this.labels[i].value !== \"function\" ? this.labels[i].value : this.labels[i].value(this.control.track_info));\n\t\t});\n\t},\n\n\t_registerSummary: function(data) {\n\t\tfor (let i in data) {\n\t\t\tdata[i].order = data[i].order ?? 100;\n\t\t\tthis.labels[i] = data[i];\n\t\t}\n\t}\n\n});\n","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceMarkers: {\n\t\tlazy: true,\n\t\tdistance: true,\n\t\tdirection: true\n\t},\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\tforceAxisBounds: false,\n\theight: 200,\n\timperial: false,\n\tinterpolation: \"curveLinear\",\n\tlazyLoadJS: true,\n\tlegend: true,\n\tmargins: {\n\t\ttop: 30,\n\t\tright: 30,\n\t\tbottom: 30,\n\t\tleft: 40\n\t},\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\tskipNullZCoords: false,\n\ttheme: \"lightblue-theme\",\n\tsummary: 'inline',\n\tslope: false,\n\tslopeDeltaMax: undefined,\n\tslopeRange: undefined,\n\tspeed: false,\n\tspeedDeltaMax: undefined,\n\tspeedRange: undefined,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimeFormat: false,\n\ttimestamps: false,\n\twidth: 600,\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\txTicks: undefined,\n\tyAttr: \"z\",\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\tyLabel: \"m\",\n\tyTicks: undefined,\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Chart } from './chart';\nimport { Marker } from './marker';\nimport { Summary } from './summary';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371,\n\t__footFactor: 3.28084,\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.5.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: 'https://unpkg.com/@raruto/leaflet-elevation@1.9.5/libs/leaflet-distance-marker.min.js',\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.lazyLoad(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\t\t\tlayer = d;\n\t\t\t\t}\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers();\n\t\tif (this._markers) this._clearMarkers();\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(e => this.off('elechart_updated', e.fn, e.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() {\n\t\tif (this._layers && this._layers.eachLayer) {\n\t\t\tthis._layers.eachLayer(l => l.remove())\n\t\t\tthis._layers.clearLayers();\n\t\t}\n\t},\n\n\t_clearMarkers: function() {\n\t\tif (this._markers && this._markers.eachLayer) {\n\t\t\tthis._markers.eachLayer(l => l.remove())\n\t\t\tthis._markers.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\tdata = data || this._data;\n\t\treturn L.latLngBounds(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(options) {\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._chartEnabled = true,\n\t\tthis.track_info = {};\n\t\tthis.handlers = [];\n\n\t\tL.setOptions(this, options);\n\n\t\tif (this.options.followMarker) this._setMapView = L.Util.throttle(this._setMapView, 300, this);\n\t\tif (this.options.legend) this.options.margins.bottom += 30;\n\t\tif (this.options.theme) this.options.polylineSegments.className += ' ' + this.options.theme;\n\t\tif (this.options.wptIcons === true) this.options.wptIcons = Options.wptIcons;\n\t\tif (this.options.distanceMarkers === true) this.options.distanceMarkers = Options.distanceMarkers;\n\n\t\tthis._markedSegments.setStyle(this.options.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(D3.Colors, this.options.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\tlazyLoad: function(src, condition = false, loader = '') {\n\t\tif (!this.options.lazyLoadJS) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tswitch(src) {\n\t\t\tcase this.__D3:\n\t\t\t\tloader = '_d3LazyLoader';\n\t\t\t\tcondition = typeof d3 !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__TOGEOJSON:\n\t\t\t\tloader = '_togeojsonLazyLoader';\n\t\t\t\tcondition = typeof toGeoJSON !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__LGEOMUTIL:\n\t\t\t\tloader = '_geomutilLazyLoader';\n\t\t\t\tcondition = typeof L.GeometryUtil !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__LALMOSTOVER:\n\t\t\t\tloader = '_almostoverLazyLoader';\n\t\t\t\tcondition = typeof L.Handler.AlmostOver !== 'function';\n\t\t\tbreak;\n\t\t\tcase this.__LDISTANCEM:\n\t\t\t\tloader = '_distanceMarkersLazyLoader';\n\t\t\t\tcondition = typeof L.DistanceMarkers !== 'function';\n\t\t\tbreak;\n\t\t}\n\t\treturn L.Control.Elevation[loader] = _.lazyLoader(src, condition, L.Control.Elevation[loader]);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\t\t\n\t\tthis.lazyLoad(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tthis._initButton(container);\n\t\t\t\tthis._initChart(container);\n\t\t\t\tthis._initSummary(container);\n\t\t\t\tthis._initMarker(map);\n\t\t\t\tthis._initLayer(map);\n\n\t\t\t\tmap\n\t\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t\t_.on(document, 'keydown', this._keydownHandler, this);\n\n\t\t\t\tthis\n\t\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\t\tthis._updateChart();\n\t\t\t\tthis._updateSummary();\n\t\t\t});\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._keydownHandler, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Standard GeoJSON --> doesn't handle \"time\", \"heart\", …\n\t\t */\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\t/**\n\t\t * Extended GeoJSON --> rely on leaflet implementation\n\t\t */\n\t\tif (d._latlngs) {\n\t\t\tthis._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\n\t\t}\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) {\n\t\tcoords.forEach((point, i) => {\n\n\t\t\t// Inspired by L.GPX layer properties\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\n\t\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\t\tlet props = (properties && properties.coordinateProperties) || properties;\n\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i });\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\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', (e) => L.DistanceMarkers && e.target instanceof L.Polyline && e.target[e.type + 'DistanceMarkers']());\n\t\t}\n\t},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" integration\n\t */\n\t_initAlmostOverHandler: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tthis.lazyLoad(this.__LGEOMUTIL)\n\t\t\t.then(() => this.lazyLoad(this.__LALMOSTOVER))\n\t\t\t.then(() => {\n\t\t\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t}\n\t\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tthis.lazyLoad(this.__LGEOMUTIL)\n\t\t\t\t.then(() => this.lazyLoad(this.__LDISTANCEM))\n\t\t\t\t.then(() => this.options.polyline && layer.addTo(map));\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._map) {\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\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 theme = control.options.theme.replace('-theme', '');\n\t\t\t\t\tlet color = D3.Colors[theme] || {};\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', e => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(e.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 * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart (DOM element).\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\topts.xTicks = this._xTicks();\n\t\topts.yTicks = this._yTicks();\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tlet chart = this._chart = new Chart(opts, this);\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(chart.render())\n\n\t\tchart\n\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t.on('mouse_enter', this._mouseenterHandler, this)\n\t\t\t.on('dragged', this._dragendHandler, this)\n\t\t\t.on('mouse_move', this._mousemoveHandler, this)\n\t\t\t.on('mouse_out', this._mouseoutHandler, this)\n\t\t\t.on('ruler_filter', this._rulerFilterHandler, this)\n\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t.on('elepath_toggle', this._toggleChartHandler, this)\n\t\t\t.on('margins_updated',this._resizeChart, this);\n\n\n\t\tthis.fire(\"elechart_axis\");\n\n\t\tif (this.options.legend) this.fire(\"elechart_legend\");\n\n\t\tthis.fire(\"elechart_init\");\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', (e) => {\n\t\t\t\tlet layer = e.layer\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, e.type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._mousemoveLayerHandler.bind(this), e.type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._mouseoutHandler.bind(this), e.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\t\tthis._marker = new Marker(this.options);\n\n\t\tthis.fire(\"elechart_marker\");\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tthis._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3.select(container).call(this._summary.render());\n\t},\n\n\t_keydownHandler: function(e) {\n\t\tif(!this.options.detached && e.key === \"Escape\"){\n\t\t\tthis._collapse()\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 * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(geojson) {\n\t\tlet control = this;\n\n\t\tlet { wptIcons, wptLabels } = control.options;\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: control.options.distanceMarkers,\n\t\t\tstyle: (feature) => {\n\t\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\t\tif (control.options.theme) {\n\t\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t\t}\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (!control.options.waypoints) return;\n\n\t\t\t\tlet prop = feature.properties;\n\t\t\t\tlet desc = prop.desc ?? '';\n\t\t\t\tlet name = prop.name ?? '';\n\t\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\t\t\t\t\tcontrol._registerCheckPoint({\n\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\tlabel: ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\t\tlet content = decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''));\n\t\t\t\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\n\t\t\t\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\n\t\t\t\t\t}\n\t\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\t\treturn marker;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => {\n\t\t\t\tif (feature.geometry && feature.geometry.type != 'Point') {\n\t\t\t\t\tcontrol.addData(layer);\n\t\t\t\t\tcontrol.track_info = L.extend({}, control.track_info, { name: geojson.name });\n\t\t\t\t} \n\t\t\t},\n\t\t});\n\n\t\tcontrol.lazyLoad(control.__D3).then(() => {\n\t\t\tcontrol._initMapIntegrations(control, layer);\n\t\t\tcontrol._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_dragendHandler: function(e) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([e.dragstart.latlng, e.dragend.latlng]));\n\n\t\tthis.fire(\"elechart_dragged\");\n\t},\n\n\t/**\n\t * Trigger mouseenter event\n\t */\n\t_mouseenterHandler: function(e) {\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_mousemoveHandler: function(e) {\n\t\tif (!this._data.length || !this._chartEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet item = this._findItemForX(e.xCoord);\n\n\t\tif (item) {\n\t\t\tlet xCoord = e.xCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\t\t\tthis._setMapView(item);\n\n\t\t\tif (this._map) {\n\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t}\n\n\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_mousemoveLayerHandler: function(e) {\n\t\tif (!this._data.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet item = this._findItemForLatLng(e.latlng);\n\t\tif (item) {\n\t\t\tlet xCoord = item.xDiagCoord;\n\n\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\tthis._updateMarker(item);\n\n\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_mouseoutHandler: 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 * 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.lazyLoad(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 = this._prepareMultiLineStrings(geojson);\n\t\t\t\t\tgeojson = this._prepareAdditionalProperties(geojson);\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 * Extend GeoJSON properties (name, time, ...)\n\t */\n\t _prepareAdditionalProperties: function(geojson) {\n\t\tif (!geojson.name && this._downloadURL) {\n\t\t\tgeojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0];\n\t\t}\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Just a temporary fix for MultiLineString data (trk > trkseg + trkseg),\n\t * just split them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/56\n\t */\n\t_prepareMultiLineStrings: function(geojson) {\n\t\tgeojson.features.forEach(feauture => {\n\t\t\tif (feauture.geometry.type == \"MultiLineString\") {\n\t\t\t\tfeauture.geometry.coordinates.forEach(coords => {\n\t\t\t\t\tgeojson.features.push({\n\t\t\t\t\t\tgeometry: { type: 'LineString', coordinates: coords },\n\t\t\t\t\t\tproperties: feauture.properties,\n\t\t\t\t\t\ttype: 'Feature'\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} \n\t\t});\n\t\treturn geojson.features.filter(feauture => feauture.geometry.type != \"MultiLineString\");\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\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \n\n\t\t// parse of \"coordinateProperties\" for later usage\n\t\tif (props.init) {\n\t\t\tthis.on(\"elepoint_init\", (e) => props.init.call(this, e));\n\t\t}\n\n\t\t// iteration\n\t\tthis.on(\"elepoint_added\", (e) => {\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[e.index][props.name];\n\t\t\t\tif(e.index > 0) {\n\t\t\t\t\tlet prev = this._data[e.index - 1][props.name];\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(e.index - 1, 1);\n\t\t\t\t\t\tthis._data[e.index - 1][props.name] = 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\tthis._data[e.index][props.name] = props.fetch.call(this, e.index, e.point);\n\n\t\t\t// update here some mixins (eg. \"track_info\", value validators, ...)\n\t\t\tif(props.update) this._data[e.index][props.name] = props.update.call(this, this._data[e.index][props.name], e.index, e.point)\n\t\t});\n\t},\n\t\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerTooltip: function(props) {\n\t\tif (props.chart) {\n\t\t\tlet label = L.extend({}, props, { value: props.chart });\n\t\t\tthis.on(\"elechart_init\", () => this._chart._registerTooltip(label));\n\t\t}\n\t\tif (props.marker) {\n\t\t\tlet label = L.extend({}, props, { value: props.marker });\n\t\t\tthis.on(\"elechart_marker\", () => this._marker._registerTooltip(label));\n\t\t}\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) return;\n\n\t\t// prevent displaying chart on resize if hidden\n\t\tif (_.style(this._container, \"display\") == \"none\") return;\n\n\t\tlet opts = this.options;\n\n\t\tlet newWidth;\n\n\t\tif (opts.detached) {\n\t\t\tnewWidth = (this.eleDiv || this._container).offsetWidth;\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\tnewWidth = opts._maxWidth > clientWidth ? clientWidth - 30 : opts._maxWidth;\n\t\t}\n\t\t\n\t\tif (newWidth) {\n\t\t\tlet chart = this._chart;\n\t\t\topts.width = newWidth;\n\t\t\tif (chart && chart._chart) {\n\t\t\t\tchart._chart._resize(opts);\n\t\t\t\topts.xTicks = this._xTicks();\n\t\t\t\topts.yTicks = this._yTicks();\n\t\t\t\tthis._updateChart();\n\t\t\t}\n\t\t}\n\n\t\tthis._updateMapSegments();\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_rulerFilterHandler: function(e) {\n\t\tthis._updateMapSegments(e.coords);\n\t},\n\n\t/**\n\t * Collapse or Expand chart control.\n\t */\n\t_toggle: function() {\n\t\tif (_.hasClass(this._container, \"elevation-expanded\"))\n\t\t\tthis._collapse();\n\t\telse\n\t\t\tthis._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.options.followMarker || !this._map) return;\n\t\tlet zoom = this._map.getZoom();\n\t\tlet z = this.options.zFollow;\n\t\tif (typeof z === \"number\") {\n\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\n\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t}\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_toggleChartHandler: function(e) {\n\t\tlet { name, enabled } = e;\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' || 'disabled' })\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 * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (/*!this._data.length ||*/ !this._chart || !this._container) return;\n\n\t\tthis.fire(\"elechart_axis\");\n\t\tthis.fire(\"elechart_area\");\n\n\t\tthis._chart.update({ data: this._data, options: this.options });\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\tthis.fire('elechart_updated');\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\tmaxElevation: this.track_info.elevation_max || 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\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis.fire(\"elechart_summary\");\n\t\t\tthis._summary.update();\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\tevent.confirm();\n\t\t\t\t}\n\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tlet opts = this.options;\n\t\treturn opts.width - opts.margins.left - opts.margins.right;\n\t},\n\n\t/**\n\t * Calculate chart xTicks\n\t */\n\t_xTicks: function() {\n\t\tif (this.__xTicks) this.__xTicks = this.options.xTicks;\n\t\treturn this.__xTicks || Math.round(this._width() / 75);\n\t},\n\n\t/**\n\t * Calculate chart yTicks\n\t */\n\t_yTicks: function() {\n\t\tif (this.__yTicks) this.__yTicks = this.options.yTicks;\n\t\treturn this.__yTicks || Math.round(this._height() / 30);\n\t}\n\n});","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet distance = {};\n\n\tif (opts.imperial) {\n\t\topts.distanceFactor = this.__mileFactor;\n\t\tdistance.label = \"mi\";\n\t} else {\n\t\topts.distanceFactor = opts.distanceFactor || 1;\n\t\tdistance.label = opts.xLabel;\n\t}\n\n\tthis._registerDataAttribute({\n\t\tname: 'dist',\n\t\tinit: () => {\n\t\t\t// this.track_info.distance = 0;\n\t\t},\n\t\tfetch: (i) => {\n\t\t\tlet delta = this._data[i].latlng.distanceTo(this._data[i > 0 ? i - 1 : i].latlng) * opts.distanceFactor;\n\t\t\treturn Math.round(delta / 1000 * 100000) / 100000; // handles floating points calc\n\t\t},\n\t\tupdate: (distance) => {\n\t\t\tthis.track_info.distance = this.track_info.distance || 0;\n\t\t\tthis.track_info.distance += distance;\n\t\t\treturn this.track_info.distance;\n\t\t}\n\t});\n\n\tif (this.options.distance != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"x\",\n\t\t\tposition: \"bottom\",\n\t\t\tscale : \"x\", // this._chart._x,\n\t\t\tlabel : distance.label,\n\t\t\tlabelY : 25,\n\t\t\tlabelX : () => this._width() + 6,\n\t\t\tname : \"distance\",\n\t\t});\n\n\t}\n\n\tthis._registerAxisGrid({\n\t\taxis : \"x\",\n\t\tposition : \"bottom\",\n\t\tscale : \"x\" // this._chart._x,\n\t});\n\n\tthis._registerTooltip({\n\t\tname: 'x',\n\t\tchart: (item) => L._(\"x: \") + d3.format(\".\" + opts.decimalsX + \"f\")(item[opts.xAttr]) + \" \" + distance.label,\n\t\torder: 20\n\t});\n\n\tthis._registerSummary({\n\t\t\"totlen\" : {\n\t\t\tlabel: \"Total Length: \",\n\t\t\tvalue: (track) => (track.distance || 0).toFixed(2) + '&nbsp;' + distance.label,\n\t\t\torder: 10\n\t\t}\n\t});\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet time = {};\n\n\ttime.label = opts.timeLabel || 't';\n\topts.timeFactor = opts.timeFactor || 3600;\n\n\t/**\n\t * Common AVG speeds:\n\t * ----------------------\n\t * slow walk = 1.8 km/h\n\t * walking = 3.6 km/h <-- default: 3.6\n\t * running = 10.8 km/h\n\t * cycling = 18 km/h\n\t * driving = 72 km/h\n\t * ----------------------\n\t */\n\tthis._timeAVGSpeed = (opts.timeAVGSpeed || 3.6) * (opts.speedFactor || 1);\n\n\tif (!opts.timeFormat) {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (opts.timeFormat == 'time') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (opts.timeFormat == 'date') {\n\t\topts.timeFormat = (time) => (new Date(time)).toLocaleDateString();\n\t}\n\n\topts.xTimeFormat = opts.xTimeFormat || ((t) => _.formatTime(t).split(\"'\")[0]);\n\n\tthis._registerDataAttribute({\n\t\tname: 'time',\n\t\tinit: function({ point, props, id }) {\n\t\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\t\tif (props) {\n\t\t\t\tif(\"coordTimes\" in props) point.meta.time = new Date(Date.parse(props.coordTimes[id]));\n\t\t\t\telse if(\"times\" in props) point.meta.time = new Date(Date.parse(props.times[id]));\n\t\t\t\telse if(\"time\" in props) point.meta.time = new Date(Date.parse((typeof props.time === 'object' ? props.time[id] : props.time)));\n\t\t\t}\n\t\t},\n\t\tfetch: function(i, point) {\n\t\t\t// Add missing timestamps (see: options.timeAVGSpeed)\n\t\t\tif (!point.meta || !point.meta.time) {\n\t\t\t\tpoint.meta = point.meta || {};\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet dx = (this._data[i].dist - this._data[i - 1].dist);\n\t\t\t\t\tlet t0 = this._data[i - 1].time.getTime();\n\t\t\t\t\tlet dt = ( dx / this._timeAVGSpeed) * this.options.timeFactor * 1000;\n\t\t\t\t\tpoint.meta.time = new Date(t0 + dt);\n\t\t\t\t} else {\n\t\t\t\t\tpoint.meta.time = new Date(Date.now())\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Handle timezone offset\n\t\t\tif (point.meta.time.getTime() - point.meta.time.getTimezoneOffset() * 60 * 1000 === 0) {\n\t\t\t\tpoint.meta.time = 0;\n\t\t\t}\n\t\t\treturn point.meta.time.getTime();\n\t\t},\n\t\tupdate: function(time, i) {\n\t\t\tthis.track_info.time = (this.track_info.time || 0) + Math.abs(this._data[i].time - this._data[i > 0 ? i - 1 : i].time);\n\t\t\tthis._data[i].duration = this.track_info.time;\n\t\t\treturn new Date(time);\n\t\t}\n\t});\n\n\tif (opts.time && opts.time != \"summary\" && !L.Browser.mobile) {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"top\",\n\t\t\tscale : {\n\t\t\t\tattr : \"duration\",\n\t\t\t\tmin : 0,\n\t\t\t},\n\t\t\tlabel : time.label,\n\t\t\tlabelY : -10,\n\t\t\tlabelX : () => this._width(),\n\t\t\tname : \"time\",\n\t\t\ttickFormat : (d) => (d == 0 ? '' : opts.xTimeFormat(d)),\n\t\t\tonAxisMount: axis => {\n\t\t\t\taxis.select(\".domain\")\n\t\t\t\t\t.remove();\n\t\t\t\taxis.selectAll(\"text\")\n\t\t\t\t\t.attr('opacity', 0.65)\n\t\t\t\t\t.style('font-family', 'Monospace')\n\t\t\t\t\t.style('font-size', '110%');\n\t\t\t\taxis.selectAll(\".tick line\")\n\t\t\t\t\t.attr('y2', this._height())\n\t\t\t\t\t.attr('stroke-dasharray', 2)\n\t\t\t\t\t.attr('opacity', 0.75);\n\t\t\t\t}\n\t\t});\n\n\t}\n\n\tif (this.options.timestamps) {\n\t\tthis._registerTooltip({\n\t\t\tname: 'date',\n\t\t\tchart: (item) => L._(\"t: \") + this.options.timeFormat(item.time),\n\t\t\torder: 20,\n\t\t});\n\t}\n\n\tif (this.options.time) {\n\t\tthis._registerTooltip({\n\t\t\tname: 'time',\n\t\t\tchart: (item) => L._(\"T: \") + _.formatTime(item.duration || 0),\n\t\t\torder: 20\n\t\t});\n\t\tthis._registerSummary({\n\t\t\t\"tottime\" : {\n\t\t\t\tlabel: \"Total Time: \",\n\t\t\t\tvalue: (track) => _.formatTime(track.time || 0),\n\t\t\t\torder: 20\n\t\t\t}\n\t\t});\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tlet opts = this.options;\n\tlet altitude = {};\n\n\tlet theme = opts.theme.replace('-theme', '');\n\tlet color = D3.Colors[theme] || {};\n\n\tif (opts.imperial) {\n\t\topts.altitudeFactor = this.__footFactor;\n\t\taltitude.label = \"ft\";\n\t} else {\n\t\topts.altitudeFactor = opts.heightFactor || opts.altitudeFactor || 1;\n\t\taltitude.label = opts.yLabel;\n\t}\n\n\tthis._registerDataAttribute({\n\t\tname: 'z',\n\t\tskipNull: this.options.skipNullZCoords,\n\t\tinit: ({point, }) => {\n\t\t\t// \"alt\" property is generated inside \"leaflet\"\n\t\t\tif (\"alt\" in point) point.meta.ele = point.alt;\n\n\t\t\t// this.track_info.elevation_max = -Infinity;\n\t\t\t// this.track_info.elevation_min = +Infinity;\n\t\t\t// this.track_info.elevation_avg = 0;\n\t\t},\n\t\tfetch: (i) => {\n\t\t\treturn this._data[i].z * opts.altitudeFactor;\n\t\t},\n\t\tupdate: (z, i) => {\n\t\t\tthis.track_info.elevation_max = this.track_info.elevation_max || -Infinity;\n\t\t\tthis.track_info.elevation_min = this.track_info.elevation_max || +Infinity;\n\t\t\tthis.track_info.elevation_avg = this.track_info.elevation_avg || 0;\n\n\t\t\tlet data = this._data;\n\t\t\tlet track = this.track_info;\n\n\t\t\t// Try to smooth \"crazy\" elevation values.\n\t\t\tif (this.options.altitudeDeltaMax) {\n\t\t\t\tlet delta = z - data[i > 0 ? i - 1 : i].z;\n\t\t\t\tlet deltaMax = this.options.altitudeDeltaMax;\n\t\t\t\tif (Math.abs(delta) > deltaMax) {\n\t\t\t\t\tz = data[i - 1].z + deltaMax * Math.sign(delta);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Range of acceptable elevation values.\n\t\t\tz = _.clamp(z, this.options.altitudeRange);\n\n\t\t\tif (z > track.elevation_max) track.elevation_max = z;\n\t\t\tif (z < track.elevation_min) track.elevation_min = z;\n\n\t\t\ttrack.elevation_avg = (z + track.elevation_avg) / 2.0;\n\n\t\t\treturn z;\n\t\t}\n\t});\n\n\tthis._registerAxisScale({\n\t\taxis : \"y\",\n\t\tposition: \"left\",\n\t\tscale : \"y\", // this._chart._y,\n\t\tlabel : altitude.label,\n\t\tlabelX : -3,\n\t\tlabelY : -8,\n\t\tname : \"altitude\",\n\t\tvisbile : this.options.altitude != \"summary\"\n\t});\n\n\tthis._registerAxisGrid({\n\t\taxis : \"y\",\n\t\tposition : \"left\",\n\t\tscale : \"y\" // this._chart._y,\n\t});\n\n\tthis._registerAreaPath({\n\t\tname : 'altitude',\n\t\tlabel : 'Altitude',\n\t\tscaleX : 'distance',\n\t\tscaleY : 'altitude',\n\t\tcolor : color.area || theme,\n\t\tstrokeColor : opts.detached ? color.stroke : '#000',\n\t\tstrokeOpacity: \"1\",\n\t\tfillOpacity : opts.detached ? (color.alpha || '0.8') : 1,\n\t\tpreferCanvas : opts.preferCanvas,\n\t\tvisbile : this.options.altitude != \"summary\"\n\t});\n\n\tthis._registerTooltip({\n\t\tname: 'y',\n\t\tchart: (item) => L._(\"y: \") + d3.format(\".\" + opts.decimalsY + \"f\")(item[opts.yAttr]) + \" \" + altitude.label,\n\t\tmarker: (item) => d3.format(\".\" + opts.decimalsY + \"f\")(item[opts.yAttr]) + \" \" + altitude.label,\n\t\torder: 10,\n\t});\n\n\tthis._registerSummary({\n\t\t\"maxele\" : {\n\t\t\tlabel: \"Max Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_max || 0).toFixed(2) + '&nbsp;' + altitude.label,\n\t\t\torder: 30,\n\t\t},\n\t\t\"minele\" : {\n\t\t\tlabel: \"Min Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_min || 0).toFixed(2) + '&nbsp;' + altitude.label,\n\t\t\torder: 30,\n\t\t},\n\t\t\"avgele\" : {\n\t\t\tlabel: \"Avg Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_avg || 0).toFixed(2) + '&nbsp;' + altitude.label,\n\t\t\torder: 30,\n\t\t},\n\t});\n});","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.slope) return;\n\n\tlet opts = this.options;\n\tlet slope = {};\n\n\tslope.label = opts.slopeLabel || '%';\n\n\tthis._registerDataAttribute({\n\t\tname: 'slope',\n\t\t// init: () => {\n\t\t// \t// this.track_info.ascent = 0; // Total Ascent\n\t\t// \t// this.track_info.descent = 0; // Total Descent\n\t\t// \t// this.track_info.slope_max = -Infinity; // Slope Max\n\t\t// \t// this.track_info.slope_min = +Infinity; // Slope Min\n\t\t// \t// this.track_info.slope_avg = 0; // Acceleration Avg\n\t\t// },\n\t\tfetch: (i) => {\n\t\t\tlet data = this._data;\n\t\t\tlet dx = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tlet dz = data[i].z - data[i > 0 ? i - 1 : i].z;\n\t\t\treturn (!isNaN(dz) && dx !== 0) ? (dz / dx) * 100 : 0; // slope in % = ( height / length ) * 100;\n\t\t},\n\t\tupdate: (slope, i) => {\n\t\t\tthis.track_info.ascent = this.track_info.ascent || 0; // Total Ascent\n\t\t\tthis.track_info.descent = this.track_info.descent || 0; // Total Descent\n\t\t\tthis.track_info.slope_max = this.track_info.slope_max || -Infinity; // Slope Max\n\t\t\tthis.track_info.slope_min = this.track_info.slope_min || +Infinity; // Slope Min\n\t\t\tthis.track_info.slope_avg = this.track_info.slope_avg || 0; // Acceleration Avg\n\n\t\t\tlet track = this.track_info;\n\t\t\tlet data = this._data;\n\t\t\tlet dz = data[i].z - data[i > 0 ? i - 1 : i].z;\n\n\t\t\t// Try to smooth \"crazy\" acceleration values.\n\t\t\tif (this.options.slopeDeltaMax) {\n\t\t\t\tlet delta = slop - data[i > 0 ? i - 1 : i].slope;\n\t\t\t\tlet deltaMax = this.options.slopeDeltaMax;\n\t\t\t\tif (Math.abs(delta) > deltaMax) {\n\t\t\t\t\tslope = data[i - 1].slope + deltaMax * Math.sign(delta);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Range of acceptable slope values.\n\t\t\tslope = _.clamp(slope, this.options.slopeRange);\n\n\t\t\tif (dz > 0) this.track_info.ascent += dz;\n\t\t\telse if (dz < 0) this.track_info.descent -= dz;\n\n\t\t\tif (slope > track.slope_max) track.slope_max = slope;\n\t\t\tif (slope < track.slope_min) track.slope_min = slope;\n\n\t\t\ttrack.slope_avg = (slope + track.slope_avg) / 2.0;\n\n\t\t\treturn L.Util.formatNum(slope, 2);;\n\t\t}\n\t});\n\n\tthis._registerAxisScale({\n\t\taxis : \"y\",\n\t\tposition : \"right\",\n\t\tscale : {\n\t\t\tmin : -1,\n\t\t\tmax : +1,\n\t\t},\n\t\ttickPadding: 16,\n\t\tlabel : slope.label,\n\t\tlabelX : 25,\n\t\tlabelY : -8,\n\t\tname : 'slope',\n\t\tvisbile : this.options.slope != \"summary\"\n\t});\n\n\tthis._registerAreaPath({\n\t\tname : 'slope',\n\t\tlabel : 'Slope',\n\t\tyAttr : 'slope',\n\t\tscaleX : 'distance',\n\t\tscaleY : 'slope',\n\t\tcolor : '#F00',\n\t\tstrokeColor : '#000',\n\t\tstrokeOpacity: \"0.5\",\n\t\tfillOpacity : \"0.25\",\n\t\tvisbile : this.options.slope != \"summary\"\n\t});\n\n\tthis._registerTooltip({\n\t\tname: 'slope',\n\t\tchart: (item) => L._(\"m: \") + item.slope + slope.label,\n\t\tmarker: (item) => Math.round(item.slope) + slope.label,\n\t\torder: 40,\n\t});\n\n\tthis._registerSummary({\n\t\t\"ascent\" : {\n\t\t\tlabel: \"Total Ascent: \",\n\t\t\tvalue: (track) => Math.round(track.ascent || 0) + '&nbsp;' + (this.options.imperial ? 'ft' : 'm'),\n\t\t\torder: 40\n\t\t},\n\t\t\"descent\" : {\n\t\t\tlabel: \"Total Descent: \",\n\t\t\tvalue: (track) => Math.round(track.descent || 0) + '&nbsp;' + (this.options.imperial ? 'ft' : 'm'),\n\t\t\torder: 40\n\t\t},\n\t\t\"minslope\": {\n\t\t\tlabel: \"Min Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_min || 0) + '&nbsp;' + slope.label,\n\t\t\torder: 40\n\t\t},\n\t\t\"maxslope\": {\n\t\t\tlabel: \"Max Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_max || 0) + '&nbsp;' + slope.label,\n\t\t\torder: 40\n\t\t},\n\t\t\"avgslope\": {\n\t\t\tlabel: \"Avg Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_avg || 0) + '&nbsp;' + slope.label,\n\t\t\torder: 40\n\t\t}\n\t});\n\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.speed && !this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet speed = {};\n\n\tspeed.label = opts.speedLabel || L._(opts.imperial ? 'mph' : 'km/h');\n\topts.speedFactor = opts.speedFactor || 1;\n\n\n\tthis._registerDataAttribute({\n\t\tname: 'speed',\n\t\tinit: () => {\n\t\t\t// this.track_info.speed_max = -Infinity; // Speed Max\n\t\t\t// this.track_info.speed_min = +Infinity; // Speed Min\n\t\t\t// this.track_info.speed_avg = 0; // Speed Avg\n\t\t},\n\t\tfetch: (i) => {\n\t\t\tlet data = this._data;\n\t\t\tlet dx = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tlet dt = data[i].time - data[ i > 0 ? i - 1 : i].time;\n\t\t\treturn dt > 0 ? Math.abs((dx / dt) * opts.timeFactor) * opts.speedFactor : 0;\n\t\t},\n\t\tupdate: (speed, i) => {\n\t\t\tthis.track_info.speed_max = this.track_info.speed_max || -Infinity; // Speed Max\n\t\t\tthis.track_info.speed_min = this.track_info.speed_min || +Infinity; // Speed Min\n\t\t\tthis.track_info.speed_avg = this.track_info.speed_avg || 0; // Speed Avg\n\n\t\t\tlet data = this._data;\n\t\t\tlet track = this.track_info;\n\n\t\t\t// Try to smooth \"crazy\" speed values.\n\t\t\tif (this.options.speedDeltaMax) {\n\t\t\t\tlet delta = speed - data[i > 0 ? i - 1 : i].speed;\n\t\t\t\tlet deltaMax = this.options.speedDeltaMax;\n\t\t\t\tif (Math.abs(delta) > deltaMax) {\n\t\t\t\t\tspeed = data[i - 1].speed + deltaMax * Math.sign(delta);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Range of acceptable speed values.\n\t\t\tspeed = _.clamp(speed, this.options.speedRange);\n\n\t\t\tif (speed > track.speed_max) track.speed_max = speed;\n\t\t\tif (speed < track.speed_min) track.speed_min = speed;\n\n\t\t\ttrack.speed_avg = (speed + track.speed_avg) / 2.0;\n\n\t\t\treturn L.Util.formatNum(speed, 2);\n\t\t},\n\t});\n\n\tif (this.options.speed && this.options.speed != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : speed.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : \"speed\",\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'speed',\n\t\t\tlabel : 'Speed',\n\t\t\tyAttr : \"speed\",\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'speed',\n\t\t\tcolor : '#03ffff',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tif (this.options.speed) {\n\n\t\tthis._registerTooltip({\n\t\t\tname: 'speed',\n\t\t\tchart: (item) => L._('v: ') + item.speed + \" \" + speed.label,\n\t\t\tmarker: (item) => Math.round(item.speed) + \" \" + speed.label,\n\t\t\torder: 50,\n\t\t});\n\n\t\tthis._registerSummary({\n\t\t\t\"minspeed\" : {\n\t\t\t\tlabel: \"Min Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_min || 0) + '&nbsp;' + speed.label,\n\t\t\t\torder: 50\n\t\t\t},\n\t\t\t\"maxspeed\" : {\n\t\t\t\tlabel: \"Max Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_max || 0) + '&nbsp;' + speed.label,\n\t\t\t\torder: 50\n\t\t\t},\n\t\t\t\"avgspeed\": {\n\t\t\t\tlabel: \"Avg Speed: \",\n\t\t\t\tvalue: (track) => Math.round(track.speed_avg || 0) + '&nbsp;' + speed.label,\n\t\t\t\torder: 50\n\t\t\t}\n\t\t});\n\n\t}\n\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\nimport { Elevation } from './control';\n\nElevation.addInitHook(function() {\n\n\tif (!this.options.acceleration) return;\n\n\tlet opts = this.options;\n\tlet acceleration = {};\n\n\tacceleration.label = opts.accelerationLabel || L._(opts.imperial ? 'ft/s²' : 'm/s²');\n\topts.accelerationFactor = opts.accelerationFactor || 1;\n\n\tthis._registerDataAttribute({\n\t\tname: 'acceleration',\n\t\tinit: () => {\n\t\t\t// this.track_info.acceleration_max = -Infinity; // Acceleration Max\n\t\t\t// this.track_info.acceleration_min = +Infinity; // Acceleration Min\n\t\t\t// this.track_info.acceleration_avg = 0; // Acceleration Avg\n\t\t},\n\t\tfetch: (i) => {\n\t\t\tlet data = this._data;\n\t\t\tlet dv = (data[i].speed - data[i > 0 ? i - 1 : i].speed) * (1000 / opts.timeFactor);\n\t\t\tlet dt = (data[i].time - data[i > 0 ? i - 1 : i].time) / 1000;\n\t\t\treturn dt > 0 ? Math.abs((dv / dt)) * opts.accelerationFactor : 0;\n\t\t},\n\t\tupdate: (acceleration, i) => {\n\t\t\tthis.track_info.acceleration_max = this.track_info.acceleration_max || -Infinity; // Acceleration Max\n\t\t\tthis.track_info.acceleration_min = this.track_info.acceleration_min || +Infinity; // Acceleration Min\n\t\t\tthis.track_info.acceleration_avg = this.track_info.acceleration_avg || 0; // Acceleration Avg\n\n\t\t\tlet data = this._data;\n\t\t\tlet track = this.track_info;\n\n\t\t\t// Try to smooth \"crazy\" acceleration values.\n\t\t\tif (this.options.accelerationDeltaMax) {\n\t\t\t\tlet delta = acceleration - data[i > 0 ? i - 1 : i].acceleration;\n\t\t\t\tlet deltaMax = this.options.accelerationDeltaMax;\n\t\t\t\tif (Math.abs(delta) > deltaMax) {\n\t\t\t\t\tacceleration = data[i - 1].acceleration + deltaMax * Math.sign(delta);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Range of acceptable acceleration values.\n\t\t\tacceleration = _.clamp(acceleration, this.options.accelerationRange);\n\t\n\t\t\tif (acceleration > track.acceleration_max) track.acceleration_max = acceleration;\n\t\t\tif (acceleration < track.acceleration_min) track.acceleration_min = acceleration;\n\n\t\t\ttrack.acceleration_avg = (acceleration + track.acceleration_avg) / 2.0;\n\n\t\t\treturn L.Util.formatNum(acceleration, 2);\n\t\t},\n\t});\n\n\tif (this.options.acceleration != \"summary\") {\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"right\",\n\t\t\tscale : {\n\t\t\t\tmin : 0,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : acceleration.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'acceleration',\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'acceleration',\n\t\t\tlabel : 'Acceleration',\n\t\t\tyAttr : 'acceleration',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'acceleration',\n\t\t\tcolor : '#050402',\n\t\t\tstrokeColor : '#000',\n\t\t\tstrokeOpacity: \"0.5\",\n\t\t\tfillOpacity : \"0.25\",\n\t\t});\n\n\t}\n\n\tthis._registerTooltip({\n\t\tname : 'acceleration',\n\t\tchart: (item) => L._(\"a: \") + item.acceleration + \" \" + acceleration.label,\n\t\tmarker: (item) => Math.round(item.acceleration) + \" \" + acceleration.label,\n\t\torder: 60,\n\t});\n\n\tthis._registerSummary({\n\t\t\"minacceleration\" : {\n\t\t\tlabel: \"Min Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_min || 0) + '&nbsp;' + acceleration.label,\n\t\t\torder: 60\n\t\t},\n\t\t\"maxacceleration\" : {\n\t\t\tlabel: \"Max Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_max || 0) + '&nbsp;' + acceleration.label,\n\t\t\torder: 60\n\t\t},\n\t\t\"avgacceleration\": {\n\t\t\tlabel: \"Avg Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_avg || 0) + '&nbsp;' + acceleration.label,\n\t\t\torder: 60\n\t\t}\n\t});\n\n});\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","MIN","SEC","HOUR","DAY","formatTime","t","d","Math","floor","h","m","s","round","toString","padStart","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","addEventListener","once","src","head","drawCanvas","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","stroke","fill","closePath","clamp","val","range","addClass","targetNode","className","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","name","value","getStyle","setProperty","toggleStyle","toggleEvent","leafletElement","eventName","handler","tagName","attributes","parent","elem","setAttributes","append","child","insert","position","insertAdjacentElement","attrs","k","setAttribute","select","selector","context","querySelector","on","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","i","Colors","area","alpha","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","d3","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","Axis","type","tickSize","tickPadding","axis","scale","ticks","tickFormat","label","labelX","labelY","onAxisMount","g","w","axisScale","replace","l","toUpperCase","axisGroup","join","text","Grid","props","PositionMarker","theme","xCoord","yCoord","labels","item","length","circle","node","isNaN","Object","keys","sort","order","forEach","size","selectAll","LegendItem","margins","toLowerCase","ownerSVGElement","dispatch","detail","legend","enabled","bottom","Tooltip","box","rect","xAlign","yAlign","bbox","getBBox","e","max","Browser","webkit","Infinity","Ruler","y","symbol","symbolTriangle","exit","remove","enter","merge","angle","CheckPoint","point","property","datum","pos","y2","x2","Domain","min","forceBounds","domain","extent","Range","Scale","scaleLinear","Chart","_width","ruler","left","right","_height","top","svg","panes","grid","brush","tooltip","mask","maskRect","foreignObject","canvas","getContext","brushX","utils","chart","opts","test","navigator","platform","userAgent","_resize","bisector","invert","Class","includes","Evented","prototype","Mixin","Events","initialize","control","options","_data","_props","scales","paths","areas","grids","axes","legendItems","tooltipItems","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","this","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_tooltip","_ruler","_initScale","_mask","get","_context","_brush","_zoom","zoom","_drag","drag","_initInteractions","_maskGaps","_this","push","index","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this2","clear","_resetDrag","_hideDiagramIndicator","clearRect","_drawPath","preferCanvas","_hasActiveLayers","_initBrush","focus","_this3","sourceEvent","pointers","_findIndexForXCoord","fire","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this4","buttons","transform","distance","_x","rescaleX","time","_initRuler","_initLegend","_this5","formatNum","format","yMax","_this6","z","_y","imperial","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_registerCheckPoint","latlng","_findIndexForLatLng","dist","_registerTooltip","gridOpts","axesOpts","n","translate","substring","indexOf","_this7","d1","d2","x1","legends","items","nodes","v","Array","map","sign","rev","slice","reverse","concat","xAxesB","marginB","marginR","_this8","tx","ty","next","list","reduce","array","curr","_this9","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","proto","Marker","marker","_marker","icon","markerIcon","zIndexOffset","interactive","_labels","addTo","_map","getPane","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","maxElevation","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","track_info","_registerSummary","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","distanceMarkers","lazy","direction","decimalsX","decimalsY","downloadLink","elevationDiv","followMarker","lazyLoadJS","divIcon","html","iconSize","iconAnchor","polyline","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","slope","slopeDeltaMax","undefined","slopeRange","speed","speedDeltaMax","speedRange","timeFactor","timeFormat","timestamps","waypoints","wptIcons","wptLabels","xLabel","yLabel","zFollow","Mobile","Elevation","Control","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","addData","layer","lazyLoad","then","_addData","_addLayer","_fireEvt","eleDiv","_initElevationDiv","isConnected","getContainer","onAdd","_clearChart","_layers","_clearLayers","_markers","_clearMarkers","_updateChart","_events","elechart_updated","eachLayer","clearLayers","disableBrush","enableBrush","disableZoom","enableZoom","fitBounds","bounds","getBounds","isValid","latLngBounds","getZFollow","hide","featureGroup","_markedSegments","_chartEnabled","handlers","setOptions","_setMapView","throttle","setStyle","colors","_fixCanvasPaths","_fixTooltipSize","condition","toGeoJSON","_typeof","GeometryUtil","Handler","AlmostOver","DistanceMarkers","load","_parseFromString","geojson","_loadLayer","_loadFile","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_keydownHandler","_updateSummary","onRemove","redraw","setZFollow","show","geom","geometry","_addGeoJSONData","coordinates","console","warn","features","feature","_latlngs","properties","meta","ele","hr","cad","atemp","coordinateProperties","id","_addPoint","lat","lng","alt","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","addHandler","_mousemoveLayerHandler","_mouseoutHandler","_initDistanceMarkers","_initMapIntegrations","_collapse","_expand","oldProto","Canvas","_fillStroke","include","hasLayer","oldVal","outline","_updateMarker","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","_mouseenterHandler","_dragendHandler","_mousemoveHandler","_rulerFilterHandler","_toggleChartHandler","_this10","_pane","createPane","zIndex","pointerEvents","_renderer","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","key","fetch","response","_this11","_downloadURL","catch","geoJson","pointToLayer","prop","desc","sym","hasOwnProperty","content","decodeURI","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","element","onEachFeature","_parseFromGeoJSONString","JSON","parse","_this12","_parseFromXMLString","trim","_prepareMultiLineStrings","_prepareAdditionalProperties","xml","DOMParser","parseFromString","documentElement","getElementsByTagName","from","find","parentElement","textContent","pop","feauture","_this13","_this14","_this15","_this16","_registerDataAttribute","lastValid","init","_this17","skipNull","prev","splice","_this18","_this19","_isFullscreen","newWidth","_updateMapSegments","getZoom","setView","animate","duration","contains","_this20","elevation_max","setLatLngs","onclick","preventDefault","event","_this21","confirm","CustomEvent","dispatchEvent","__xTicks","__yTicks","addInitHook","distanceFactor","delta","track","toFixed","timeLabel","_timeAVGSpeed","timeAVGSpeed","speedFactor","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","xTimeFormat","coordTimes","times","dx","t0","getTime","dt","now","getTimezoneOffset","abs","altitudeFactor","heightFactor","elevation_min","elevation_avg","altitudeDeltaMax","deltaMax","altitudeRange","visbile","slopeLabel","dz","ascent","descent","slope_max","slope_min","slope_avg","slop","acceleration","speedLabel","speed_max","speed_min","speed_avg","accelerationLabel","accelerationFactor","dv","acceleration_max","acceleration_min","acceleration_avg","accelerationDeltaMax","accelerationRange","Utils","Components","enableDragging","disableDragging","loadChart","loadData","loadGPX","loadGeoJSON","loadXML","loadFile","_addGPXData","_registerFocusLabel","elevation"],"mappings":"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"}
1
+ {"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","/**\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\n **/\nexport const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\n */\n export function formatDate(format) {\n\tif (!format) {\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (format == 'time') {\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (format == 'date') {\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\n\t}\n\treturn (time) => format(time);\n}\n\n/**\n * Generate download data event.\n */\n export function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n\n/**\n * Convert SVG Path into Path2D and then update canvas\n */\n export function drawCanvas(ctx, path) {\n\tpath.classed('canvas-path', true);\n\n\tctx.beginPath();\n\tctx.moveTo(0, 0);\n\tlet p = new Path2D(path.attr('d'));\n\n\tctx.strokeStyle = path.attr('stroke');\n\tctx.fillStyle = path.attr('fill');\n\tctx.lineWidth = 1.25;\n\tctx.globalCompositeOperation = 'source-over';\n\n\t// stroke opacity\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\tctx.stroke(p);\n\n\t// fill opacity\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\tctx.fill(p);\n\n\tctx.globalAlpha = 1;\n\n\tctx.closePath();\n}\n\n/**\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\n */\nexport function coordPropsToMeta(coordProps, name, parser) {\n\treturn coordProps && (({props, point, id}) => {\n\t\tif (props) {\n\t\t\tfor (const key of coordProps) {\n\t\t\t\tif (key in props) {\n\t\t\t\t\tpoint.meta[name] = (parser || parseInt).call(this, props[key], id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Extract numeric property (id) from GeoJSON object\n */\nexport const parseInt = (property, id) => window.parseInt((typeof property === 'object' ? property[id] : property));\n\n/**\n * Extract datetime property (id) from GeoJSON object\n */\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\n\n/**\n * A little bit shorter than L.DomUtil\n */\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\nexport const create = (tag, str, attrs, n) => { let elem = L.DomUtil.create(tag, str || \"\"); if (attrs) setAttributes(elem, attrs); if (n) append(n, elem); return elem; };\nexport const append = (n, c) => n.appendChild(c);\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\nexport const select = (str, n) => (n || document).querySelector(str);\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\n\n/**\n * TODO: use generators instead? (ie. \"yield\")\n */\nexport const iMax = (iVal, max) => (iVal > max ? iVal : max) || -Infinity; \nexport const iMin = (iVal, min) => (iVal < min ? iVal : min) || +Infinity;\nexport const iAvg = (iVal, avg) => (iVal + (avg || 0)) / 2.0;\nexport const iSum = (iVal, sum) => iVal + (sum || 0);\n\n/**\n * Alias for some leaflet core functions\n */\nexport const { on, off } = L.DomEvent;\nexport const { throttle } = L.Util;\nexport const { hasClass } = L.DomUtil;\n\n/**\n * Limit floating point precision\n */\nexport const round = L.Util.formatNum;\n\n/**\n * Limit a number between min / max values\n */\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\n\n/**\n * Limit a delta difference between two values\n */\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [],\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\ttheme: \"lightblue-theme\",\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: L.circleMarker([0,0], { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false }),\n\ttrkEnd: L.circleMarker([0,0], { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false }),\n\twaypoints: true,\n\twptIcons: {\n\t\t'': L.divIcon({\n\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\n\t\t\ticonSize: [30, 30],\n\t\t\ticonAnchor: [8, 30],\n\t\t}),\n\t},\n\twptLabels: true,\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\tyAttr: \"z\",\n\tyLabel: \"m\",\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n\n\t// Quite uncommon and undocumented options (quite useless)\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tskipNullZCoords: false,\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Probably no longer functional as expected (internally overwritten)\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: 200,\n\twidth: 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\n\t__LCHART: '../src/components/chart.js',\n\t__LMARKER: '../src/components/marker.js',\n\t__LSUMMARY: '../src/components/summary.js',\n\t__modulesFolder: '../src/handlers/',\n\n\t/*\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\n\t */\n\taddData: function(d, layer) {\n\t\tthis.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\t\t\tlayer = d;\n\t\t\t\t}\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers(this._layers);\n\t\tif (this._markers) this._clearLayers(this._markers);\n\t\tif (this._circleMarkers) this._clearLayers(this._circleMarkers);\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\n\t\tthis._updateChart();\n\t},\n\n\t_clearChart: function() {\n\t\tif (this._events && this._events.elechart_updated) {\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\n\t\t}\n\t\tif (this._chart && this._chart._container) {\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\n\t\t\tthis._chart.clear();\n\t\t}\n\t},\n\n\t_clearLayers: function(l) {\n\t\tl = l || this._layers;\n\t\tif (l && l.eachLayer) {\n\t\t\tl.eachLayer(f => f.remove())\n\t\t\tl.clearLayers();\n\t\t}\n\t},\n\n\t/**\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\n\t * \n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\n\t */\n\t// addHandler: function (name, HandlerClass) {\n\t// \tif (HandlerClass) {\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\n\t// \t\tthis.handlers.push(handler);\n\t// \t\tif (this.options[name]) {\n\t// \t\t\thandler.enable();\n\t// \t\t}\n\t// \t}\n\t// \treturn this;\n\t// },\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom: function() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(data) {\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level (followMarker: true).\n\t */\n\tgetZFollow: function() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize: function(opts) {\n\n\t\topts = L.setOptions(this, opts);\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = (opts.trkStart || Options.trkStart);\n\t\tthis._end = (opts.trkEnd || Options.trkEnd);\n\t\tthis._chartEnabled = true;\n\t\tthis._yCoordMax = -Infinity;\n\t\tthis.track_info = {};\n\t\t// this.handlers = [];\n\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\n\t\tif (opts.legend) opts.margins.bottom += 30;\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\n\n\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(_.Colors, opts.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\timport: function(src, condition) {\n\t\tswitch(src) {\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\n\t\t}\n\t\treturn condition !== false ? import(src) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\n\t\tlet modules = [\n\t\t\t\"Distance\",\n\t\t\t\"Time\",\n\t\t\t\"Altitude\",\n\t\t\t\"Slope\",\n\t\t\t\"Speed\",\n\t\t\t\"Acceleration\",\n\t\t\t...this.options.handlers\n\t\t].filter(m => false !== this.options[typeof m == \"string\" && m.toLowerCase()]);\n\n\t\tthis._loadModules(modules);\t// Inject here required modules (data handlers)\n\t\tthis._initButton(container);\n\t\tthis._initChart(container);\n\t\tthis._initSummary(container);\n\t\tthis._initMarker(map);\n\t\tthis._initLayer(map);\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Standard GeoJSON --> doesn't handle \"time\", \"heart\", …\n\t\t */\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\t/**\n\t\t * Extended GeoJSON --> rely on leaflet implementation\n\t\t */\n\t\tif (d._latlngs) {\n\t\t\tthis._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\n\t\t}\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) {\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\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\t\tlet props = (properties && properties.coordinateProperties) || properties;\n\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 });\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},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" integration\n\t */\n\t_initAlmostOverHandler: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tPromise.all([\n\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\tthis.import(this.__LALMOSTOVER)\n\t\t]).then(() => {\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\tmap\n\t\t\t\t\t.on('almost:move', (e) => this._onMouseMoveLayer(e))\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tPromise.all([\n\t\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\t\tthis.import(this.__LDISTANCEM)\n\t\t\t]).then(() => this.options.polyline && layer.addTo(map) && this._circleMarkers.bringToFront());\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._data.length) {\n\t\t\tcontrol._start.setLatLng(control._data[0].latlng);\n\t\t\tcontrol._end.setLatLng(control._data[control._data.length -1].latlng);\n\t\t}\n\t\tif (map) {\n\t\t\tcontrol._circleMarkers.addTo(map);\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(ctx, layer) {\n\t\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\t\tlet options = layer.options;\n\n\t\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Partial fix for initial tooltip size\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\t */\n\t_fixTooltipSize: function() {\n\t\tthis.on('elechart_init', () =>\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(data);\n\t\t\t})\n\t\t);\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart (DOM element).\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LCHART)\n\t\t]).then((m) => {\n\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\td3\n\t\t\t\t.select(container)\n\t\t\t\t.call(chart.render())\n\t\n\t\t\tchart\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\n\t\t\t\t.on('dragged', this._onDragEnd, this)\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\n\t\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\n\t\n\t\n\t\t\tthis.fire(\"elechart_axis\");\n\t\n\t\t\tif (this.options.legend) this.fire(\"elechart_legend\");\n\t\n\t\t\tthis.fire(\"elechart_init\");\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker: function(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LMARKER)\n\t\t]).then((m) => {\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\n\t\t\tthis.fire(\"elechart_marker\");\n\t\t});\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\n\n\t\t\tthis.on('elechart_init', () => {\n\t\t\t\td3.select(container).call(this._summary.render());\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Retrieve data from a remote url (HTTP).\n\t */\n\t_loadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis._parseFromString(data)\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\n\t\t\t}).catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Dynamically import only required javascript modules (code splitting)\n\t */\n\t_loadModules: function(handlers) {\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof L.Control.Elevation[h] !== \"undefined\" ? L.Control.Elevation[h] : h);\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\n\t\tPromise.\n\t\t\tall(\n\t\t\t\thandlers\n\t\t\t\t\t.filter(h => typeof h === 'string' || h instanceof Promise)\n\t\t\t\t\t.map(file => file instanceof Promise ? file : this.import(this.__modulesFolder + file.toLowerCase() + '.js'))\n\t\t\t)\n\t\t\t.then((m) => {\n\t\t\t\t_.each(m, (exported) => {\n\t\t\t\t\tlet fn = Object.keys(exported)[0];\n\t\t\t\t\tif (fn && typeof L.Control.Elevation[fn] === \"undefined\" ) {\n\t\t\t\t\t\thandlers[fn] = L.Control.Elevation[fn] = exported[fn];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_.each(handlers, h => this._registerHandler(h));\n\t\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(geojson) {\n\t\tlet control = this;\n\n\t\tlet { wptIcons, wptLabels } = control.options;\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: control.options.distanceMarkers,\n\t\t\tstyle: (feature) => {\n\t\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\t\tif (control.options.theme) {\n\t\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t\t}\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (!control.options.waypoints) return;\n\n\t\t\t\tlet prop = feature.properties;\n\t\t\t\tlet desc = prop.desc ?? '';\n\t\t\t\tlet name = prop.name ?? '';\n\t\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\t\t\t\t\tcontrol._registerCheckPoint({\n\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\tlabel: ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\t\tlet content = decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''));\n\t\t\t\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\n\t\t\t\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\n\t\t\t\t\t}\n\t\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\t\treturn marker;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => {\n\t\t\t\tif (feature.geometry && feature.geometry.type != 'Point') {\n\t\t\t\t\tcontrol.addData(layer);\n\t\t\t\t\tcontrol.track_info = L.extend({}, control.track_info, { name: geojson.name });\n\t\t\t\t} \n\t\t\t},\n\t\t});\n\n\t\tcontrol.import(control.__D3).then(() => {\n\t\t\tcontrol._initMapIntegrations(control, layer);\n\t\t\tcontrol._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: control.track_info.name, track_info: control.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 = this._prepareMultiLineStrings(geojson);\n\t\t\t\t\tgeojson = this._prepareAdditionalProperties(geojson);\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 * Extend GeoJSON properties (name, time, ...)\n\t */\n\t _prepareAdditionalProperties: function(geojson) {\n\t\tif (!geojson.name && this._downloadURL) {\n\t\t\tgeojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0];\n\t\t}\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Just a temporary fix for MultiLineString data (trk > trkseg + trkseg),\n\t * just split them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/56\n\t */\n\t_prepareMultiLineStrings: function(geojson) {\n\t\tgeojson.features.forEach(feauture => {\n\t\t\tif (feauture.geometry.type == \"MultiLineString\") {\n\t\t\t\tfeauture.geometry.coordinates.forEach(coords => {\n\t\t\t\t\tgeojson.features.push({\n\t\t\t\t\t\tgeometry: { type: 'LineString', coordinates: coords },\n\t\t\t\t\t\tproperties: feauture.properties,\n\t\t\t\t\t\ttype: 'Feature'\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} \n\t\t});\n\t\treturn geojson.features.filter(feauture => feauture.geometry.type != \"MultiLineString\");\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath: function(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add a point of interest over the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute: function(props) {\n\n\t\t// parse of \"coordinateProperties\" for later usage\n\t\tif (props.coordPropsToMeta) {\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\n\t\t}\n\n\t\t// prevent excessive variabile instanstations\n\t\tlet i, curr, prev, attr;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \n\n\t\t// iteration\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\n\t\t\ti = index;\n\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\n\t\t\tcurr = this._data[i];\n\t\t\tattr = props.attr || props.name;\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (props.skipNull === false) {\n\t\t\t\tlet curr = this._data[i][attr];\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\n\t\t\t\t\tif (isNaN(prev)) {\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\n\t\t\t\t\t\t\tprev = lastValid;\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\n\t\t\t\t\t\t\tprev = curr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// update reference to last used point (ie. if it has data)\n\t\t\t\tif (!isNaN(curr)) {\n\t\t\t\t\tlastValid = curr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\n\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\n\t\t\tif (props.stats) {\n\t\t\t\tfor (const key in props.stats) {\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Limit \"crazy\" delta values.\n\t\t\tif (props.deltaMax) {\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\n\t\t\t}\n\t\t\t\n\t\t\t// Range of acceptable values.\n\t\t\tif (props.clampRange) {\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\n\t\t\t}\n\n\t\t\t// Limit floating point precision.\n\t\t\tif (!isNaN(props.decimals)) {\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\n\t\t\t}\n\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\n\t\t\tif(props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\n\t\t});\n\t},\n\n\t/**\n\t * Parse a module definition and attach related function listeners\n\t */\n\t_registerHandler: function(props) {\n\n\t\t// eg. L.Control.Altitude\n\t\tif (typeof props === \"function\") {\n\t\t\treturn this._registerHandler(props.call(this));\n\t\t}\n\n\t\t// eg. \"altitude\" == true\n\t\tif (this.options[props.name] || props.required) {\n\n\t\t\tthis._registerDataAttribute({\n\t\t\t\tname: props.name,\n\t\t\t\tattr: props.attr,\n\t\t\t\tskipNull: props.skipNull,\n\t\t\t\tdeltaMax: props.deltaMax,\n\t\t\t\tclampRange: props.clampRange,\n\t\t\t\tdecimals: props.decimals,\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(props.coordinateProperties, props.meta || props.name, props.coordPropsToMeta),\n\t\t\t\tpointToAttr: props.pointToAttr,\n\t\t\t\tonPointAdded: props.onPointAdded,\n\t\t\t\tstats: props.stats,\n\t\t\t\tstatsName: props.statsName,\n\t\t\t});\n\n\t\t\tif (props.grid) {\n\t\t\t\tprops.grid.name = props.grid.name || props.name;\n\t\t\t\tthis._registerAxisGrid(props.grid);\n\t\t\t}\n\n\t\t\tif (this.options[props.name] !== \"summary\") {\n\t\t\t\tif (props.scale) {\n\t\t\t\t\tprops.scale.name = props.scale.name || props.name;\n\t\t\t\t\tprops.scale.label = props.scale.label || props.unit;\n\t\t\t\t\tthis._registerAxisScale(props.scale);\n\t\t\t\t}\n\t\t\t\tif (props.path) {\n\t\t\t\t\tprops.path.name = props.path.name || props.name;\n\t\t\t\t\tthis._registerAreaPath(props.path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.tooltips) {\n\t\t\t\t_.each(props.tooltips, t => {\n\t\t\t\t\tif (t) {\n\t\t\t\t\t\tt.name = t.name || props.name;\n\t\t\t\t\t\tthis._registerTooltip(t)\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (props.tooltip) {\n\t\t\t\tprops.tooltip.name = props.tooltip.name || props.name;\n\t\t\t\tthis._registerTooltip(props.tooltip)\n\t\t\t}\n\n\t\t\tif (props.summary) {\n\t\t\t\tfor (const key in props.summary) {\n\t\t\t\t\tprops.summary[key].unit = props.summary[key].unit || props.unit;\n\t\t\t\t}\n\t\t\t\tthis._registerSummary(props.summary);\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerTooltip: function(props) {\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary: function(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView: function() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart: function() {\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\n\t\t\tlet opts = this.options;\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\n\t\t\tif (newWidth) {\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (this._chart && this._chart._chart) {\n\t\t\t\t\tthis._chart._chart._resize(opts);\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._updateMapSegments();\n\t\t}\n\t},\n\n\t/**\n\t * Collapse or Expand chart control.\n\t */\n\t_toggle: function() {\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\n\t},\n\n\t/**\n\t * Update map center and zoom (followMarker: true)\n\t */\n\t_setMapView: function(item) {\n\t\tif (this._map && this.options.followMarker) {\n\t\t\tlet zoom = this._map.getZoom();\n\t\t\tlet z = this.options.zFollow;\n\t\t\tif (typeof z === \"number\") {\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (this._chart && this._container) {\n\t\t\tthis.fire(\"elechart_axis\");\n\t\t\tthis.fire(\"elechart_area\");\n\t\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\tthis.fire('elechart_updated');\t\t\n\t\t}\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker: function(item) {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update({\n\t\t\t\tmap : this._map,\n\t\t\t\titem : item,\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\n\t\t\t\toptions : this.options\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker: function() {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update();\n\t\t}\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments: function(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary: function() {\n\t\tif (!this._summary) return;\n\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis.fire(\"elechart_summary\");\n\t\t\tthis._summary.update();\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = ({preventDefault}) => {\n\t\t\t\tpreventDefault();\n\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\tevent.confirm();\n\t\t\t\t}\n\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tconst { width, margins } = this.options;\n\t\treturn width - margins.left - margins.right;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tconst { height, margins } = this.options;\n\t\treturn height - margins.top - margins.bottom;\n\t},\n\n});","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Elevation } from './control';\n\nElevation.Utils = _;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","key","meta","parseInt","call","this","property","addClass","n","str","split","every","s","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","toString","substr","on","off","DomEvent","throttle","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","sum","Options","autofitBounds","autohide","Browser","mobile","autohideMarker","almostover","altitude","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","circleMarker","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","undefined","yAxisMin","margins","top","right","bottom","left","height","width","xTicks","yTicks","Elevation","Control","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","addData","layer","import","then","_addData","_addLayer","_fireEvt","track_info","addTo","map","eleDiv","_initElevationDiv","isConnected","_.insert","getContainer","_.append","onAdd","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","src","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","modules","filter","toLowerCase","_loadModules","_initButton","_initChart","_initSummary","_initMarker","_initLayer","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","geom","geometry","type","_addGeoJSONData","coordinates","_.each","coords","console","warn","features","feature","_latlngs","properties","ele","coordinateProperties","fire","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","bringToFront","_.select","_.randomId","_.replaceClass","_initMapIntegrations","control","setLatLng","once","_collapse","_expand","oldProto","Canvas","_fillStroke","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","_renderer","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","Summary","url","fetch","response","text","_downloadURL","catch","file","exported","Object","keys","_registerHandler","geoJson","pointToLayer","prop","desc","sym","_registerCheckPoint","label","hasOwnProperty","icon","content","decodeURI","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","element","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","_prepareMultiLineStrings","_prepareAdditionalProperties","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","parentElement","textContent","pop","feauture","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","_.coordPropsToMeta","grid","scale","unit","tooltips","_registerTooltip","tooltip","_registerSummary","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","innerHTML","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","proto","elevation"],"mappings":"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"}