@raruto/leaflet-elevation 1.7.4 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/dist/leaflet-elevation.js +637 -847
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.js +3 -1
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/package.json +1 -1
- package/src/acceleration.js +11 -21
- package/src/altitude.js +21 -22
- package/src/chart.js +55 -175
- package/src/components.js +159 -111
- package/src/control.js +115 -209
- package/src/distance.js +15 -13
- package/src/index.js +12 -1
- package/src/marker.js +38 -98
- package/src/options.js +1 -8
- package/src/slope.js +9 -18
- package/src/speed.js +11 -21
- package/src/time.js +15 -10
- package/src/utils.js +113 -137
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/components.js","../src/chart.js","../src/marker.js","../src/summary.js","../src/options.js","../src/control.js","../src/distance.js","../src/altitude.js","../src/time.js","../src/slope.js","../src/speed.js","../src/acceleration.js","../src/index.js"],"sourcesContent":["/**\n * Recursive deep merge objects.\n * Alternative to L.Util.setOptions(this, options).\n */\nexport function deepMerge(target, ...sources) {\n\tif (!sources.length) return target;\n\tconst source = sources.shift();\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) Object.assign(target, {\n\t\t\t\t\t[key]: {}\n\t\t\t\t});\n\t\t\t\tdeepMerge(target[key], source[key]);\n\t\t\t} else {\n\t\t\t\tObject.assign(target, {\n\t\t\t\t\t[key]: source[key]\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\n/**\n * Wait for document load before execute function.\n */\nexport function deferFunc(f) {\n\tif (document.readyState !== 'complete') window.addEventListener(\"load\", f, { once: true });\n\telse f();\n}\n/**\n * Debounce function to limit events are being fired.\n */\nexport function debounce(func, wait, context, immediate) {\n\tvar timeout;\n\treturn function() {\n\t\tvar args = arguments;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\tif (!immediate) func.apply(context, args);\n\t\t}, wait);\n\t\tif (immediate && !timeout) func.apply(context, args);\n\t};\n}\n\nconst 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 * Simple GeoJSON data loader.\n */\nexport function GeoJSONLoader(data, control) {\n\tif (typeof data === \"string\") {\n\t\tdata = JSON.parse(data);\n\t}\n\tcontrol = control || this;\n\n let distanceMarkers = (\n\t\t\tcontrol.options.distanceMarkers === true\n\t\t\t\t? { lazy: true }\n\t\t\t\t: L.extend({ lazy: true }, control.options.distanceMarkers)\n\t);\n\n let wptIcons = control.options.wptIcons;\n let wptLabels = control.options.wptLabels;\n\n\tlet layer = L.geoJson(data, {\n\t\tdistanceMarkers: distanceMarkers,\n\t\tstyle: (feature) => {\n\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\tif (control.options.theme) {\n\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tpointToLayer: (feature, latlng) => {\n\t\t\tif (!control.options.waypoints) return;\n\n\t\t\tlet prop = feature.properties;\n\t\t\tlet desc = prop.desc ?? '';\n\t\t\tlet name = prop.name ?? '';\n\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n // Handle waypoint lables (markers and dots)\n if (!wptLabels) {\n name = '';\n desc = '';\n }\n\n // Handle chart waypoints (dots)\n if ([true, \"dots\"].includes(control.options.waypoints)) {\n control._registerCheckPoint({latlng: latlng, label: name}, true);\n }\n\n // Handle map waypoints (markers)\n if ([true, \"markers\"].includes(control.options.waypoints) && wptIcons != false) {\n // generate and cache appropriate icon symbol\n if (!wptIcons.hasOwnProperty(sym)) {\n wptIcons[sym] = L.divIcon(\n L.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n );\n }\n \t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n \t\t\tif (name || desc) {\n \t\t\t\tmarker.bindPopup(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : '')).openPopup();\n \t\t\t}\n control._addMarker(marker);\n \t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n return marker;\n }\n\t\t},\n\t\tonEachFeature: (feature, layer) => {\n\t\t\tif (feature.geometry && feature.geometry.type == 'Point') return;\n\n\t\t\t// Standard GeoJSON\n\t\t\t// control.addData(feature, layer); // NB uses \"_addGeoJSONData\"\n\n\t\t\t// Extended GeoJSON\n\t\t\tlayer._latlngs.forEach((point, i, data) => {\n\t\t\t\t// same properties as L.GPX layer\n\t\t\t\tpoint.meta = { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\tif(\"alt\" in point) point.meta.ele = point.alt;\n\t\t\t\tif(feature.properties) {\n\t\t\t\t\tlet prop = feature.properties;\n\t\t\t\t\tif(\"coordTimes\" in prop) point.meta.time = new Date(Date.parse(prop.coordTimes[i]));\n\t\t\t\t\telse if(\"times\" in prop) point.meta.time = new Date(Date.parse(prop.times[i]));\n\t\t\t\t\telse if(\"time\" in prop) point.meta.time = new Date(Date.parse((typeof prop.time === 'object' ? prop.time[i] : prop.time)));\n\t\t\t\t\tif(\"heartRates\" in prop) point.meta.hr = parseInt(prop.heartRates[i]);\n\t\t\t\t\telse if(\"heartRate\" in prop) point.meta.hr = parseInt((typeof prop.heartRate === 'object' ? prop.heartRate[i] : prop.heartRate));\n\t\t\t\t\t// TODO: cadence, temperature\n\t\t\t\t}\n\t\t\t});\n\t\t\tcontrol.addData(layer); // NB uses \"_addGPXData\"\n\n\t\t\t// Postpone adding the distance markers (lazy: true)\n\t\t\tif(control.options.distanceMarkers && distanceMarkers.lazy) {\n\t\t\t layer.on('add remove', (e) => {\n\t\t\t let path = e.target;\n\t\t\t if (L.DistanceMarkers && path instanceof L.Polyline) {\n\t\t\t\t\t\tpath[e.type + 'DistanceMarkers']();\n\t\t\t }\n\t\t\t });\n\t\t\t}\n\n\t\t\tcontrol.track_info = L.extend({}, control.track_info, { type: \"geojson\", name: data.name });\n\t\t},\n\t});\n\n\tL.Control.Elevation._d3LazyLoader.then(() => {\n\t\tcontrol._fireEvt(\"eledata_loaded\", { data: data, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t});\n\n\treturn layer;\n}\n\n/**\n * Check DOM element visibility.\n */\nexport function isDomVisible(elem) {\n\treturn !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\n}\n\n/**\n * Check object type.\n */\nexport function isObject(item) {\n\treturn (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n * Check DOM element viewport visibility.\n */\nexport function isVisible(elem) {\n\tif (!elem) return false;\n\n\tlet styles = window.getComputedStyle(elem);\n\n\tfunction isVisibleByStyles(elem, styles) {\n\t\treturn styles.visibility !== 'hidden' && styles.display !== 'none';\n\t}\n\n\tfunction isAboveOtherElements(elem, styles) {\n\t\tlet boundingRect = elem.getBoundingClientRect();\n\t\tlet left = boundingRect.left + 1;\n\t\tlet right = boundingRect.right - 1;\n\t\tlet top = boundingRect.top + 1;\n\t\tlet bottom = boundingRect.bottom - 1;\n\t\tlet above = true;\n\n\t\tlet pointerEvents = elem.style.pointerEvents;\n\n\t\tif (styles['pointer-events'] == 'none') elem.style.pointerEvents = 'auto';\n\n\t\tif (document.elementFromPoint(left, top) !== elem) above = false;\n\t\tif (document.elementFromPoint(right, top) !== elem) above = false;\n\n\t\t// Only for completely visible elements\n\t\t// if (document.elementFromPoint(left, bottom) !== elem) above = false;\n\t\t// if (document.elementFromPoint(right, bottom) !== elem) above = false;\n\n\t\telem.style.pointerEvents = pointerEvents;\n\n\t\treturn above;\n\t}\n\n\tif (!isVisibleByStyles(elem, styles)) return false;\n\tif (!isAboveOtherElements(elem, styles)) return false;\n\treturn true;\n}\n\n/**\n * Check JSON object type.\n */\nexport function isJSONDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"{\") == 0 || doc.indexOf(\"[\") == 0;\n\t} else {\n\t\ttry {\n\t\t\tJSON.parse(doc.toString());\n\t\t} catch (e) {\n\t\t\tif (typeof doc === \"object\" && lazy) return true;\n\t\t\tconsole.warn(e);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/**\n * Check XML object type.\n */\nexport function isXMLDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"<\") == 0;\n\t} else {\n\t\tlet documentElement = (doc ? doc.ownerDocument || doc : 0).documentElement;\n\t\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n\t}\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 * Generate download data event.\n */\nexport 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 * Wait for element visible before execute function.\n */\nexport function waitHolder(elem) {\n\treturn new Promise((resolve, reject) => {\n\t\tlet ticking = false;\n\t\tlet scrollFn = () => {\n\t\t\tif (!ticking) {\n\t\t\t\tL.Util.requestAnimFrame(() => {\n\t\t\t\t\tif (isVisible(elem)) {\n\t\t\t\t\t\twindow.removeEventListener('scroll', scrollFn);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t\tticking = false;\n\t\t\t\t});\n\t\t\t\tticking = true;\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('scroll', scrollFn);\n\t\tif (elem) elem.addEventListener('mouseenter', scrollFn, { once: true });\n\t\tscrollFn();\n\t});\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 if (removeClassName) removeClass(targetNode, removeClassName);\n if (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 return 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\nexport function randomId() {\n\treturn Math.random().toString(36).substr(2, 9);\n}\n\nexport function each(obj, fn) {\n\tfor (let i in obj) fn(obj[i], i);\n}\n","// 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","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 HeightFocusLine = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlength = 0,\n}) => {\n\treturn line => line\n\t\t.attr(\"class\", theme + \" height-focus line\")\n\t\t.attr(\"x1\", xCoord)\n\t\t.attr(\"x2\", xCoord)\n\t\t.attr(\"y1\", yCoord)\n\t\t.attr(\"y2\", length);\n};\n\nexport const HeightFocusLabel = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlabel,\n}) => {\n\treturn text => {\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\", yCoord);\n\n\t\tlet y = text.select(\".height-focus-y\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\n\t\ty\n\t\t\t.attr(\"class\", \"height-focus-y\")\n\t\t\t.text(label);\n\n\t\ttext.selectAll('tspan').attr(\"x\", xCoord + 5);\n\n\t\treturn text;\n\t};\n};\n\nexport const HeightFocusMarker = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n}) => {\n\treturn circle => circle\n\t\t.attr(\"class\", theme + \" height-focus circle-lower\")\n\t\t.attr(\"transform\", \"translate(\" + xCoord + \",\" + yCoord + \")\")\n\t\t.attr(\"r\", 6)\n\t\t.attr(\"cx\", 0)\n\t\t.attr(\"cy\", 0);\n};\n\nexport const LegendItem = ({\n\tname,\n label,\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\tconst svg = d3.select(g.node().ownerSVGElement || g);\n\n\t\tg.on('click.legend', () => svg.dispatch(\"legend_clicked\", {\n\t\t\tdetail: {\n\t\t\t\tpath: path.node(),\n\t\t\t\tname: name,\n\t\t\t\tlegend: g.node(),\n\t\t\t\tenabled: !path.classed('leaflet-hidden'),\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 MouseFocusLine = ({\n\txCoord = 0,\n\theight,\n}) => {\n\treturn line => line\n\t\t.attr('class', 'mouse-focus-line')\n\t\t.attr('x2', xCoord)\n\t\t.attr('y2', 0)\n\t\t.attr('x1', xCoord)\n\t\t.attr('y1', height);\n};\n\nexport const MouseFocusLabel = ({\n\txCoord,\n\tyCoord,\n\tlabelX = \"\",\n\tlabelY = \"\",\n\twidth,\n}) => {\n\treturn g => {\n\n\t\tg.attr('class', 'mouse-focus-label');\n\n\t\tlet rect = g.select(\".mouse-focus-label-rect\");\n\t\tlet text = g.select(\".mouse-focus-label-text\");\n\t\tlet y = text.select(\".mouse-focus-label-y\");\n\t\tlet x = text.select(\".mouse-focus-label-x\");\n\n\t\tif (!rect.node()) rect = g.append(\"svg:rect\");\n\t\tif (!text.node()) text = g.append(\"svg:text\");\n\t\tif (!y.node()) y = text.append(\"svg:tspan\");\n\t\tif (!x.node()) x = text.append(\"svg:tspan\");\n\n\t\ty.text(labelY);\n\t\tx.text(labelX);\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\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\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\t\ty\n\t\t\t.attr(\"class\", \"mouse-focus-label-y\")\n\t\t\t.attr(\"dy\", \"1em\");\n\t\tx\n\t\t\t.attr(\"class\", \"mouse-focus-label-x\")\n\t\t\t.attr(\"dy\", \"2em\");\n\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 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\tpoint : g.append('g').attr(\"class\", \"point\"),\n\t\taxis : g.append('g').attr(\"class\", \"axis\"),\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 clipPath = panes.area.append(\"svg:clipPath\").attr(\"id\", 'elevation-clipper');\n\tconst clipRect = clipPath.append(\"svg:rect\");\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Mouse Focus\n\tconst dragG = panes.ruler;\n\tconst focusG = panes.tooltip;\n\tconst brushG = panes.brush;\n\n\tfocusG.append('svg:line')\n\t\t.call(\n\t\t\tMouseFocusLine({\n\t\t\t\txCoord: 0,\n\t\t\t\theight: _height\n\t\t\t})\n\t\t);\n\n\tfocusG.append(\"g\")\n\t\t.call(\n\t\t\tMouseFocusLabel({\n\t\t\t\txCoord: 0,\n\t\t\t\tyCoord: 0,\n\t\t\t\theight: _height,\n\t\t\t\twidth : _width,\n\t\t\t\tlabelX: \"\",\n\t\t\t\tlabelY: \"\",\n\t\t\t})\n\t\t);\n\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => brushG.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\tclipPath,\n\t\tcanvas,\n\t\tcontext,\n\t\tdragG,\n\t\tfocusG,\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\tclipRect\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\tdragG .call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tbrushG.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tbrushG.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\tfocusLabels: {},\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\tif (opts.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = opts.xLabel;\n\t\t\tthis._yLabel = opts.yLabel;\n\t\t}\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\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._clipPath = chart.get('clipPath');\n\t\tthis._canvas = chart.get('canvas');\n\t\tthis._context = chart.get('context');\n\t\tthis._dragG = chart.get('dragG');\n\t\tthis._focusG = chart.get('focusG');\n\t\tthis._brush = chart.get('brush');\n\n\t\t// Tooltip\n\t\tthis._focusline = this._focusG.select('.mouse-focus-line');\n\t\tthis._focuslabel = this._focusG.select('.mouse-focus-label');\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},\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\tif (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t}\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet opts = this.options;\n\t\tlet ctx = this._context;\n\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\t\tlet node = path.node();\n\t\tlet scaleX = this._scales[area.scaleX];\n\t\tlet scaleY = this._scales[area.scaleY];\n\n\t\tarea = L.extend({}, area, {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\tscaleX : scaleX,\n\t\t\tscaleY : scaleY\n\t\t});\n\n\t\tif (!scaleY || !scaleY) {\n\t\t\treturn console.warn('Unable to render path:' + name);\n\t\t}\n\n\t\tpath.datum(this._data).attr(\"d\", D3.Area(area));\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (opts.preferCanvas) {\n\t\t\tpath.classed('canvas-path', true);\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(0, 0);\n\t\t\tlet p = new Path2D(path.attr('d'));\n\n\t\t\tctx.strokeStyle = path.attr('stroke');\n\t\t\tctx.fillStyle = path.attr('fill');\n\t\t\tctx.lineWidth = 1.25;\n\t\t\tctx.globalCompositeOperation = 'source-over';\n\n\t\t\t// stroke opacity\n\t\t\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\t\t\tctx.stroke(p);\n\n\t\t\t// fill opacity\n\t\t\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\t\t\tctx.fill(p);\n\n\t\t\tctx.globalAlpha = 1;\n\n\t\t\tctx.closePath();\n\t\t} else {\n\t\t\tthis._area.append(() => 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}\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}\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\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._dragG.data()[0].y;\n\t\t\tif (y >= yMax || y <= 0) this._dragG.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._dragG.data()[0], { y: y });\n\n\t\t\tthis._dragG\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._yLabel);\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._dragG.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\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\tthis._props.grids[props.name || props.axis] = props;\n\t},\n\n\t_registerAxisScale: function(props) {\n\t\tlet opts = this.options;\n\t\tlet scale = props.scale;\n\n\t\tif (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 waypoint 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} else\n\n\t\tif (isNaN(x) || isNaN(y)) return;\n\n\t\tif (!point.item || !point.item.property('isConnected')) {\n\t\t\tpoint.position = point.position || \"bottom\";\n\n\t\t\tpoint.item = this._point.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': this._height() - y})[point.position],\n\t\t\t\tx2: ({'left': -x, 'right': this._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},\n\n\t_registerFocusLabel: function(props) {\n\t\tthis._props.focusLabels[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},\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._clipPath) {\n\t\t\t\t\tpath.attr('clip-path', 'url(#' + this._clipPath.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\tlet opts = this.options;\n\n\t\tlet scales = this._scales;\n\t\tlet d = this._domains;\n\t\tlet r = this._ranges;\n\n\t\tfor (let i in scales) {\n\t\t\tscales[i]\n\t\t\t.domain(d[i](this._data))\n\t\t\t.range(r[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\tlet opts = this.options;\n\t\tlet yCoordinate = this._y(item[opts.yAttr]);\n\n\t\tthis._focusG.attr(\"display\", null);\n\n\t\tthis._focusline.call(\n\t\t\tD3.MouseFocusLine({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\theight: this._height()\n\t\t\t})\n\t\t);\n\t\tthis._focuslabel.call(\n\t\t\tD3.MouseFocusLabel({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: yCoordinate,\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabelX: d3.format(\".\"+ opts.decimalsX +\"f\")(item[opts.xAttr]) + \" \" + this._xLabel,\n\t\t\t\tlabelY: d3.format(\".\"+ opts.decimalsY +\"f\")(item[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t})\n\t\t);\n\n\t\t// this._focuslabel.selectAll('tspan').data(Object.values(this._focuslabels));\n\n\t\tlet labels = this._props.focusLabels;\n\t\tlet tooltip = this._focuslabel.select('text');\n\t\tlet label;\n\n\t\tfor (var i in labels) {\n\t\t\tlabel = tooltip.select(\".mouse-focus-label-\" + labels[i].name);\n\n\t\t\tif (!label.size()) {\n\t\t\t\tlabel = tooltip.append(\"svg:tspan\", \".mouse-focus-label-x\")\n\t\t\t\t\t.attr(\"class\", \"mouse-focus-label-\" + 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\tthis._focuslabel.select('.mouse-focus-label-x')\n\t\t\t\t.attr(\"dy\", \"1.5em\");\n\t\t}\n\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._focusG.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\tif (this.options.imperial) {\n\t\t\tthis._xLabel = \"mi\";\n\t\t\tthis._yLabel = \"ft\";\n\t\t} else {\n\t\t\tthis._xLabel = this.options.xLabel;\n\t\t\tthis._yLabel = this.options.yLabel;\n\t\t}\n\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\tthis._focusline = d3.create('svg:line');\n\t\t\tthis._focusmarker = d3.create(\"svg:circle\");\n\t\t\tthis._focuslabel = d3.create(\"svg:text\");\n\t\t} else if (this.options.marker == 'position-marker') {\n\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\tthis._marker = L.marker([0, 0], { icon: this.options.markerIcon, zIndexOffset: 1000000, interactive: false });\n\t\t}\n\n\t\tthis._focuslabels = {};\n\n\t\treturn this;\n\t},\n\n\taddTo: function(map) {\n\t\tthis._map = map;\n\t\tif (this.options.marker == 'elevation-line') {\n\t\t\tlet g = this._container = d3.select(map.getPane('elevationPane')).select(\"svg > g\")\n\t\t\t\t.attr(\"class\", \"height-focus-group\");\n\t\t\tg.append(() => this._focusline.node());\n\t\t\tg.append(() => this._focusmarker.node());\n\t\t\tg.append(() => this._focuslabel.node());\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\tthis._marker.addTo(map, { pane: 'overlayPane' });\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\tlet opts = this.options;\n\t\tlet map = this._map;\n\n\t\tthis._latlng = props.item.latlng;\n\n\t\tlet pos = map.latLngToLayerPoint(this._latlng);\n\n\t\tif (map._rotate) {\n\t\t\tpos = map.rotatedPointToMapPanePoint(pos);\n\t\t}\n\n\t\tlet point = L.extend({}, props.item, pos);\n\n\t\tif (this.options.marker == 'elevation-line') {\n\n\t\t\tlet normalizedAlt = this._height() / props.maxElevation * point.z;\n\t\t\tlet normalizedY = point.y - normalizedAlt;\n\n\t\t\tthis._container.classed(\"leaflet-hidden\", false);\n\n\t\t\tthis._focusmarker\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusMarker({\n\t\t\t\t\t\ttheme : opts.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}));\n\n\t\t\tthis._focusline\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLine({\n\t\t\t\t\t\ttheme : opts.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: normalizedY\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\tthis._focuslabel\n\t\t\t\t.call(\n\t\t\t\t\tD3.HeightFocusLabel({\n\t\t\t\t\t\ttheme : opts.theme,\n\t\t\t\t\t\txCoord: point.x,\n\t\t\t\t\t\tyCoord: normalizedY,\n\t\t\t\t\t\tlabel : d3.format(\".\" + opts.decimalsY + \"f\")(point[opts.yAttr]) + \" \" + this._yLabel\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\tlet labels = this._focuslabels;\n\t\t\tlet tooltip = this._focuslabel;\n\t\t\tlet label;\n\n\t\t\tfor (var i in labels) {\n\t\t\t\tlabel = tooltip.select(\".height-focus-\" + labels[i].name);\n\n\t\t\t\tif (!label.size()) {\n\t\t\t\t\tlabel = tooltip.append(\"svg:tspan\")\n\t\t\t\t\t\t.attr(\"class\", \"height-focus-\" + 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(props.item) );\n\n\t\t\t\tthis._focuslabel.select('.height-focus-y')\n\t\t\t\t\t.attr(\"dy\", \"-1.5em\");\n\t\t\t}\n\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.removeClass(this._marker.getElement(), 'leaflet-hidden');\n\t\t\tthis._marker.setLatLng(this._latlng);\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\tif (this.options.marker == 'elevation-line') {\n\t\t\tif (this._container) this._container.classed(\"leaflet-hidden\", true);\n\t\t} else if (this.options.marker == 'position-marker') {\n\t\t\t_.addClass(this._marker.getElement(), 'leaflet-hidden');\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_registerFocusLabel: function(props) {\n\t\tthis._focuslabels[props.name] = props;\n\t}\n\n});\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\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\t_registerSummary: function(data) {\n\t\tfor (let i in data) {\n\t\t\tthis.append(i, L._(data[i].label), typeof data[i].value !== \"function\" ? data[i].value : data[i].value(this.control.track_info));\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\tdistanceFactor: 1,\n\tdistanceMarkers: false,\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\theightFactor: 1,\n\timperial: false,\n\tinterpolation: \"curveLinear\",\n\tlazyLoadJS: true,\n\tlegend: true,\n\tloadData: {\n\t\tdefer: false,\n\t\tlazy: false,\n\t},\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\tplaceholder: false,\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\tresponsive: true,\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\tsLimit: undefined,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimeFormat: false,\n\tsDeltaMax: undefined,\n\tsInterpolation: \"curveStepAfter\",\n\tsRange: undefined,\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\"></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.3.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.7.3/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\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\tlayer = d;\n\t\t}\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._addData(d);\n\t\t\tthis._addLayer(layer);\n\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\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 * 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 * Alias for enableBrush\n\t */\n\tenableDragging: function() {\n\t\tthis.enableBrushing();\n\t},\n\n\t/**\n\t * Alias for disableBrush\n\t */\n\tdisableDragging: function() {\n\t\tthis.disableBrushing();\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 when \"followMarker\" is true.\n\t */\n\tgetZFollow: function() {\n\t\treturn this._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\n\t\tthis.track_info = {};\n\n\t\tthis.options = _.deepMerge({}, this.options, options);\n\n\t\tthis._zFollow = this.options.zFollow;\n\n\t\tif (this.options.followMarker) this._setMapView = L.Util.throttle(this._setMapView, 300, this);\n\t\tif (this.options.placeholder) this.options.loadData.lazy = this.options.loadData.defer = true;\n\n\t\tif (this.options.legend) this.options.margins.bottom += 30;\n\n\t\tif (this.options.theme) this.options.polylineSegments.className += ' ' + this.options.theme;\n\n\t\tthis._markedSegments.setStyle(this.options.polylineSegments);\n\n\t\t// this._resizeChart = _.debounce(this._resizeChart, 300, this);\n\t\t// this._resizeChart = L.Util.throttle(this._resizeChart, 300, this);\n\n\t\t// if (L.Browser.mobile) {\n\t\t// \tthis._updateChart = _.debounce(this._updateChart, 300, this);\n\t\t// \tthis._updateSummary = _.debounce(this._updateSummary, 300, this);\n\t\t// }\n\n\t\tif (this.options.wptIcons === true) this.options.wptIcons = Options.wptIcons;\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(D3.Colors, this.options.colors || {});\n\t},\n\n\t/**\n\t * Alias for loadData\n\t */\n\tload: function(data, opts) {\n\t\tthis.loadData(data, opts);\n\t},\n\n\t/**\n\t * Alias for addTo\n\t */\n\tloadChart: function(map) {\n\t\tthis.addTo(map);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON or KML).\n\t */\n\tloadData: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tif (opts.defer) {\n\t\t\tthis.loadDefer(data, opts);\n\t\t} else if (opts.lazy) {\n\t\t\tthis.loadLazy(data, opts);\n\t\t} else if (_.isXMLDoc(data)) {\n\t\t\tthis.loadXML(data);\n\t\t} else if (_.isJSONDoc(data)) {\n\t\t\tthis.loadGeoJSON(data);\n\t\t} else {\n\t\t\tthis.loadFile(data);\n\t\t}\n\t},\n\n\t/**\n\t * Wait for document load before download data.\n\t */\n\tloadDefer: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\topts.defer = false;\n\t\t_.deferFunc(L.bind(this.loadData, this, data, opts));\n\t},\n\n\t/**\n\t * Load data from a remote url.\n\t */\n\tloadFile: 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.loadData(data, { lazy: false, defer: false });\n\t\t\t})\n\t\t\t.catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Load raw GeoJSON data.\n\t */\n\tloadGeoJSON: function(data) {\n\t\t_.GeoJSONLoader(data, this);\n\t},\n\n\t/**\n\t * Alias for loadXML\n\t */\n\tloadGPX: function(data){\n\t\tthis.loadXML(data);\n\t},\n\n\t/**\n\t * Load raw XML data.\n\t */\n\tloadXML: function(data) {\n\t\tElevation._togeojsonLazyLoader = _.lazyLoader(\n\t\t\tthis.__TOGEOJSON,\n\t\t\ttypeof toGeoJSON !== 'function' || !this.options.lazyLoadJS,\n\t\t\tElevation._togeojsonLazyLoader\n\t\t).then(\n\t\t\t() => {\n\t\t\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\t\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\t\t\tif (!(type in toGeoJSON)) {\n\t\t\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t\t\t}\n\t\t\t\tlet geojson = toGeoJSON[type](xml);\n\t\t\t\tlet name = xml.getElementsByTagName('name');\n\t\t\t\tif(name[0]) { geojson.name = name[0].innerHTML; }\n\t\t\t\telse if(this._downloadURL) { geojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0]; }\n\n\t\t\t\treturn this.loadGeoJSON(geojson, this);\n\t\t\t}\n\t\t);\n\t},\n\n\t/**\n\t * Wait for chart container visible before download data.\n\t */\n\tloadLazy: function(data, opts) {\n\t\topts = L.extend({}, this.options.loadData, opts);\n\t\tlet elem = opts.lazy.parentNode ? opts.lazy : this.placeholder;\n\t\t_.waitHolder(elem)\n\t\t\t.then(() => {\n\t\t\t\topts.lazy = false;\n\t\t\t\tthis.loadData(data, opts)\n\t\t\t\tthis.once('eledata_loaded', () => this.placeholder.parentNode.removeChild(elem));\n\t\t\t});\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);\n\n\t\tif (!this.options.detached) {\n\t\t\t_.addClass(container, 'leaflet-control');\n\t\t}\n\n\t\tif (this.options.placeholder && !this._data.length) {\n\t\t\tthis.placeholder = _.create('img', 'elevation-placeholder', typeof this.options.placeholder === 'string' ? { src: this.options.placeholder, alt: '' } : this.options.placeholder);\n\t\t\t_.insert(container, this.placeholder, 'afterbegin');\n\t\t}\n\n\t\tElevation._d3LazyLoader = _.lazyLoader(\n\t\t\tthis.__D3,\n\t\t\ttypeof d3 !== 'object' || !this.options.lazyLoadJS,\n\t\t\tElevation._d3LazyLoader\n\t\t).then(() => {\n\t\t\tthis._initButton(container);\n\t\t\tthis._initChart(container);\n\t\t\tthis._initSummary(container);\n\t\t\tthis._initMarker(map);\n\t\t\tthis._initLayer(map);\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\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\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\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 when \"followMarker\" is true.\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis._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\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\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\tif (d._latlngs) {\n\t\t\tthis._addGPXData(d._latlngs);\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) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point[1], point[0], point[2]);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parsing function for GPX data and their elevation in z-coordinate\n\t */\n\t_addGPXData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point.lat, point.lng, typeof point.alt !== \"undefined\" ? point.alt : point.meta.ele);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"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._fireEvt(\"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},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\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\tthis.eleDiv = eleDiv;\n\t\treturn this.eleDiv;\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 * 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.responsive) {\n\t\t\tif (opts.detached) {\n\t\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t\t}\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._fireEvt.bind('elechart_enter'), 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._fireEvt(\"elechart_axis\");\n\t\tif (this.options.legend) this._fireEvt(\"elechart_legend\");\n\n\t\tthis._fireEvt(\"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._fireEvt(\"elechart_marker\");\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\n\t\tcontainer.setAttribute('aria-haspopup', true);\n\n\t\tif (!this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container);\n\t\t\t//.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (L.Browser.mobile) {\n\t\t\t_.on(container, 'click', L.DomEvent.stopPropagation);\n\t\t}\n\n\t\t_.on(container, 'mousewheel', this._mousewheelHandler, this);\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\t// TODO: keyboard accessibility\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO: handle autohide when detached=true\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tlet summary = this._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(summary.render());\n\n\t\tthis.summaryDiv = this._summary._container;\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._fireEvt(\"elechart_dragged\");\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._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\tthis._fireEvt(\"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._fireEvt(\"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._fireEvt(\"elechart_leave\");\n\t},\n\n\t/*\n\t * Handles the mouesewheel over the chart.\n\t */\n\t_mousewheelHandler: function(e) {\n\t\tif (this._map.gestureHandling && this._map.gestureHandling._enabled) return;\n\t\tlet ll = this._marker.getLatLng() || this._map.getCenter();\n\t\tlet z = this._map.getZoom() + Math.sign(e.deltaY);\n\t\tthis._resetDrag();\n\t\tthis._map.flyTo(ll, z);\n\t},\n\n\t/**\n\t * Add a waypoint marker to the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\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 chart or marker tooltip info\n\t */\n\t_registerFocusLabel: 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._registerFocusLabel(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._registerFocusLabel(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\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\tif (opts.responsive) {\n\t\t\tlet newWidth;\n\t\t\tif (opts.detached) {\n\t\t\t\tnewWidth = (this.eleDiv || this._container).offsetWidth;\n\t\t\t} else {\n\t\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\t\tnewWidth = opts._maxWidth > clientWidth ? clientWidth - 30 : opts._maxWidth;\n\t\t\t}\n\t\t\tif (newWidth) {\n\t\t\t\tlet chart = this._chart;\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (chart && chart._chart) {\n\t\t\t\t\tchart._chart._resize(opts);\n\t\t\t\t\topts.xTicks = this._xTicks();\n\t\t\t\t\topts.yTicks = this._yTicks();\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\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 current 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 * Sets the view of the map (center and zoom). Useful when \"followMarker\" is 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\tif (\"number\" === typeof this._zFollow) {\n\t\t\tif (zoom < this._zFollow) zoom = this._zFollow;\n\t\t\tthis._map.setView(item.latlng, 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 { path, 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 => {\n\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled);\n\t\t\t}\n\t\t);\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._container) return;\n\n\t\tthis._fireEvt(\"elechart_axis\");\n\t\tthis._fireEvt(\"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._fireEvt('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) return;\n\t\tthis._marker.update({\n\t\t\tmap : this._map,\n\t\t\titem : item,\n\t\t\tmaxElevation: this.track_info.elevation_max || 0,\n\t\t\toptions : this.options\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) return;\n\t\tthis._marker.update();\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._fireEvt(\"elechart_summary\");\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.summaryDiv.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this.summaryDiv).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._fireEvt('eletrack_download', { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) });\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});\n\n/**\n * Attach here some useful elevation hooks.\n */\nElevation.addInitHook(function() {\n\n\tthis.on('waypoint_added', function(e) {\n\t\tlet p = e.point,\n\t\t\tpop = p._popup;\n\t\tif (pop) {\n\t\t\tpop.options.className = 'elevation-popup';\n\t\t}\n\t\tif (pop && pop._content) {\n\t\t\tpop._content = decodeURI(pop._content);\n\t\t\tp.bindTooltip(pop._content, { direction: 'auto', sticky: true, opacity: 1, className: 'elevation-tooltip' }).openTooltip();\n\t\t}\n\t});\n\n\tthis.on(\"eletrack_download\", function(e) {\n\t\tif (e.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: e }));\n\t\t} else if (e.downloadLink == 'link' || e.downloadLink === true) {\n\t\t\te.confirm();\n\t\t}\n\t});\n\n\tthis.on('eledata_loaded', function(e) {\n\t\tlet map = this._map;\n\t\tlet layer = e.layer;\n\t\tif (!map) {\n\t\t\tconsole.warn(\"Undefined elevation map object\");\n\t\t\treturn;\n\t\t}\n\t\tmap.once('layeradd', (e) => this.options.autofitBounds && this.fitBounds(layer.getBounds()));\n\n\t\tif (L.Browser.mobile) {\n\n\t\t\tif (this.options.polyline) layer.addTo(map);\n\n\t\t} else {\n\n\t\t\t// leaflet-geometryutil\n\t\t\tElevation._geomutilLazyLoader = _.lazyLoader(\n\t\t\t\tthis.__LGEOMUTIL,\n\t\t\t\ttypeof L.GeometryUtil !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\tElevation._geomutilLazyLoader\n\t\t\t).then(\n\t\t\t\t() => {\n\n\t\t\t\t\t// leaflet-almostover\n\t\t\t\t\tif (this.options.almostOver) {\n\t\t\t\t\t\tElevation._almostoverLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LALMOSTOVER,\n\t\t\t\t\t\t\ttypeof L.Handler.AlmostOver !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._almostoverLazyLoader\n\t\t\t\t\t\t).then(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tmap.addHandler('almostOver',L.Handler.AlmostOver)\n\t\t\t\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// leaflet-distance-markers\n\t\t\t\t\tif (this.options.distanceMarkers) {\n\t\t\t\t\t\tElevation._distanceMarkersLazyLoader = _.lazyLoader(\n\t\t\t\t\t\t\tthis.__LDISTANCEM,\n\t\t\t\t\t\t\ttypeof L.DistanceMarkers !== 'function' || !this.options.lazyLoadJS,\n\t\t\t\t\t\t\tElevation._distanceMarkersLazyLoader\n\t\t\t\t\t\t).then(() => this.options.polyline && layer.addTo(map));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.options.polyline) layer.addTo(map);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t);\n\t\t}\n\t});\n\n\t// Basic canvas renderer support.\n\tlet oldProto = L.Canvas.prototype._fillStroke;\n\tlet control = this;\n\tL.Canvas.include({\n\t\t_fillStroke: function(ctx, layer) {\n\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\tlet theme = control.options.theme.replace('-theme', '');\n\t\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\t\tlet options = layer.options;\n\n\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\tctx.strokeStyle = '#FFF';\n\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\tthis.on('elechart_init', function() {\n\t\tthis.once('elechart_change elechart_hover', function(e) {\n\t\t\tif (this._chartEnabled) {\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t}\n\t\t\tthis._updateMarker(e.data);\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 distance = {};\n\n\tif (this.options.imperial) {\n\t\tthis._distanceFactor = this.__mileFactor;\n\t\tthis._xLabel = \"mi\";\n\t} else {\n\t\tthis._distanceFactor = opts.distanceFactor;\n\t\tthis._xLabel = opts.xLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet track = this.track_info;\n\t\tlet dist = track.distance || 0;\n\n\t\tlet curr = data[i].latlng;\n\t\tlet prev = i > 0 ? data[i - 1].latlng : curr;\n\n\t\tlet delta = curr.distanceTo(prev) * this._distanceFactor;\n\n\t\tdist += Math.round(delta / 1000 * 100000) / 100000; // handles floating points calc\n\n\t\tdata[i].dist = dist;\n\n\t\ttrack.distance = dist;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"bottom\",\n\t\t\tscale : this._chart._x,\n\t\t});\n\n\t});\n\n\tif (this.options.distance != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\tdistance.x = this._chart._x;\n\t\t\tdistance.label = this._chart._xLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"x\",\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tscale : distance.x,\n\t\t\t\tlabel : distance.label,\n\t\t\t\tlabelY : 25,\n\t\t\t\tlabelX : () => this._width() + 6,\n\t\t\t\tname : \"distance\",\n\t\t\t});\n\n\t\t});\n\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) + ' ' + this._xLabel\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\tif (opts.imperial) {\n\t\tthis._heightFactor = this.__footFactor;\n\t\tthis._yLabel = \"ft\";\n\t} else {\n\t\tthis._heightFactor = opts.heightFactor;\n\t\tthis._yLabel = opts.yLabel;\n\t}\n\n\tthis.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z * this._heightFactor;\n\n\t\tlet track = this.track_info;\n\t\tlet eleMax = track.elevation_max || -Infinity;\n\t\tlet eleMin = track.elevation_min || +Infinity;\n\n\t\t// check and fix missing elevation data on last added point\n\t\tif (!this.options.skipNullZCoords && i > 0) {\n\t\t\tlet prevZ = data[i - 1].z;\n\t\t\tif (isNaN(prevZ)) {\n\t\t\t\tlet lastZ = this._lastValidZ;\n\t\t\t\tlet currZ = z;\n\t\t\t\tif (!isNaN(lastZ) && !isNaN(currZ)) {\n\t\t\t\t\tprevZ = (lastZ + currZ) / 2;\n\t\t\t\t} else if (!isNaN(lastZ)) {\n\t\t\t\t\tprevZ = lastZ;\n\t\t\t\t} else if (!isNaN(currZ)) {\n\t\t\t\t\tprevZ = currZ;\n\t\t\t\t}\n\t\t\t\tif (!isNaN(prevZ)) return data.splice(i - 1, 1);\n\t\t\t\tdata[i - 1].z = prevZ;\n\t\t\t}\n\t\t}\n\t\t// skip point if it has not elevation\n\t\tif (!isNaN(z)) {\n\t\t\teleMax = eleMax < z ? z : eleMax;\n\t\t\teleMin = eleMin > z ? z : eleMin;\n\t\t\tthis._lastValidZ = z;\n\t\t}\n\n\t\tdata[i].z = z;\n\n\t\ttrack.elevation_max = eleMax;\n\t\ttrack.elevation_min = eleMin;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"left\",\n\t\t\tscale : this._chart._y,\n\t\t});\n\n\t});\n\n\tif (this.options.altitude != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\taltitude.y = this._chart._y;\n\t\t\taltitude.label = this._yLabel;\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"y\",\n\t\t\t\tposition: \"left\",\n\t\t\t\tscale : altitude.y,\n\t\t\t\tlabel : altitude.label,\n\t\t\t\tlabelX : -3,\n\t\t\t\tlabelY : -8,\n\t\t\t\tname : \"altitude\",\n\t\t\t});\n\n\t\t});\n\n\t\tthis.on(\"elechart_init\", function() {\n\n\t\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\tlet alpha = (this.options.detached ? (color.alpha || '0.8') : 1);\n\t\t\tlet stroke = (this.options.detached ? color.stroke : false);\n\n\t\t\tthis._chart._registerAreaPath({\n\t\t\t\tname : 'altitude',\n\t\t\t\tlabel : 'Altitude',\n\t\t\t\tscaleX : 'distance',\n\t\t\t\tscaleY : 'altitude',\n\t\t\t\tcolor : color.area || theme,\n\t\t\t\tstrokeColor : stroke || '#000',\n\t\t\t\tstrokeOpacity: \"1\",\n\t\t\t\tfillOpacity : alpha,\n\t\t\t\tpreferCanvas : this.options.preferCanvas,\n\t\t\t});\n\n\t\t});\n\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) + ' ' + this._yLabel\n\t\t},\n\t\t\"minele\" : {\n\t\t\tlabel: \"Min Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_min || 0).toFixed(2) + ' ' + this._yLabel\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\tthis._timeFactor = opts.timeFactor;\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\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\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\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\t// Add missing timestamps (see: options.timeAVGSpeed)\n\t\tif (!e.point.meta || !e.point.meta.time) {\n\t\t\te.point.meta = e.point.meta || {};\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist);\n\t\t\tlet speed = this._timeAVGSpeed;\n\t\t\te.point.meta.time = new Date(\n\t\t\t\t(\n\t\t\t\t\ti > 0\n\t\t\t\t\t\t? data[i - 1].time.getTime() + ((( delta / speed) * this._timeFactor) * 1000)\n\t\t\t\t\t\t: Date.now()\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tlet time = e.point.meta.time;\n\n\t\t// Handle timezone offset\n\t\tif (time.getTime() - time.getTimezoneOffset() * 60 * 1000 === 0) {\n\t\t\ttime = 0;\n\t\t}\n\n\t\tlet currT = time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = Math.abs(currT - prevT);\n\t\tlet duration = (this.track_info.time || 0) + deltaT;\n\n\t\tdata[i].time = time;\n\t\tdata[i].duration = duration;\n\n\t\tthis.track_info.time = duration;\n\t});\n\n\tif (this.options.time) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'time',\n\t\t\tchart: (item) => this.options.timeFormat(item.time)\n\t\t});\n\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}\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.slope) return;\n\n\tlet opts = this.options;\n\tlet slope = {};\n\n\tslope.label = opts.slopeLabel || '%';\n\n\tif (this.options.slope != \"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 : -1,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : slope.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'slope'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'slope',\n\t\t\tlabel : 'Slope',\n\t\t\tyAttr : 'slope',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'slope',\n\t\t\tcolor : '#F00',\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.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z;\n\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\n\t\t// Slope / Gain\n\t\tlet track = this.track_info;\n\t\tlet tAsc = track.ascent || 0; // Total Ascent\n\t\tlet tDes = track.descent || 0; // Total Descent\n\t\tlet sMax = track.slope_max || 0; // Slope Max\n\t\tlet sMin = track.slope_min || 0; // Slope Min\n\t\tlet slope = 0;\n\n\t\tif (!isNaN(z)) {\n\t\t\tlet deltaZ = i > 0 ? z - data[i - 1].z : 0;\n\t\t\tif (deltaZ > 0) tAsc += deltaZ;\n\t\t\telse if (deltaZ < 0) tDes -= deltaZ;\n\t\t\t// slope in % = ( height / length ) * 100\n\t\t\tif (delta !== 0) slope = (deltaZ / delta) * 100;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" slope values.\n\t\tif (this.options.sDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? slope - data[i - 1].slope : 0;\n\t\t\tlet maxDeltaS = this.options.sDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tslope = data[i - 1].slope + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable slope values.\n\t\tif (this.options.sRange) {\n\t\t\tlet range = this.options.sRange;\n\t\t\tif (slope < range[0]) slope = range[0];\n\t\t\telse if (slope > range[1]) slope = range[1];\n\t\t}\n\n\t\tslope = L.Util.formatNum(slope, 2);\n\n\t\tif (slope > sMax) sMax = slope;\n\t\tif (slope < sMin) sMin = slope;\n\n\t\tdata[i].slope = slope;\n\n\t\ttrack.ascent = tAsc;\n\t\ttrack.descent = tDes;\n\t\ttrack.slope_max = sMax;\n\t\ttrack.slope_min = sMin;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname: 'slope',\n\t\tchart: (item) => item.slope + slope.label,\n\t\tmarker: (item) => Math.round(item.slope) + slope.label\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) + ' ' + this._yLabel\n\t\t},\n\t\t\"descent\" : {\n\t\t\tlabel: \"Total Descent: \",\n\t\t\tvalue: (track) => Math.round(track.descent || 0) + ' ' + this._yLabel\n\t\t},\n\t\t\"minslope\": {\n\t\t\tlabel: \"Min Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_min || 0) + ' ' + slope.label\n\t\t},\n\t\t\"maxslope\": {\n\t\t\tlabel: \"Max Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_max || 0) + ' ' + slope.label\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._(this.options.imperial ? 'mph' : 'km/h');\n\tthis._speedFactor = opts.speedFactor || 1;\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\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = currT - prevT;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.speed_max || -Infinity; // Speed Max\n\t\tlet sMin = track.speed_min || +Infinity; // Speed Min\n\t\tlet sAvg = track.speed_avg || 0; // Speed Avg\n\t\tlet speed = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tspeed = Math.abs((delta / deltaT) * this._timeFactor) * this._speedFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" speed values.\n\t\tif (this.options.speedDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? speed - data[i - 1].speed : 0;\n\t\t\tlet maxDeltaS = this.options.speedDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tspeed = data[i - 1].speed + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable speed values.\n\t\tif (this.options.speedRange) {\n\t\t\tlet range = this.options.speedRange;\n\t\t\tif (speed < range[0]) speed = range[0];\n\t\t\telse if (speed > range[1]) speed = range[1];\n\t\t}\n\n\t\tspeed = L.Util.formatNum(speed, 2);\n\n\t\tsMax = speed > sMax ? speed : sMax;\n\t\tsMin = speed < sMin ? speed : sMin;\n\t\tsAvg = (speed + sAvg) / 2.0;\n\n\t\tdata[i].speed = speed;\n\n\t\ttrack.speed_max = sMax;\n\t\ttrack.speed_min = sMin;\n\t\ttrack.speed_avg = sAvg;\n\t});\n\n\tif (this.options.speed) {\n\n\t\tthis._registerFocusLabel({\n\t\t\tname: 'speed',\n\t\t\tchart: (item) => item.speed + \" \" + speed.label,\n\t\t\tmarker: (item) => Math.round(item.speed) + \" \" + speed.label\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) + ' ' + speed.label\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) + ' ' + speed.label\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) + ' ' + speed.label\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._(this.options.imperial ? 'ft/s²' : 'm/s²');\n\tthis._accelerationFactor = opts.accelerationFactor || 1;\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.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = (currT - prevT) / 1000;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.acceleration_max || -Infinity; // Acceleration Max\n\t\tlet sMin = track.acceleration_min || +Infinity; // Acceleration Min\n\t\tlet sAvg = track.acceleration_avg || 0; // Acceleration Avg\n\t\tlet acceleration = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet curr = data[i].speed;\n\t\t\tlet prev = i > 0 ? data[i - 1].speed : curr;\n\t\t\tlet delta = (curr - prev) * (1000 / this._timeFactor);\n\t\t\tacceleration = Math.abs((delta / deltaT)) * this._accelerationFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" acceleration values.\n\t\tif (this.options.accelerationDeltaMax) {\n\t\t\tlet deltaA = i > 0 ? acceleration - data[i - 1].acceleration : 0;\n\t\t\tlet maxDeltaS = this.options.accelerationDeltaMax;\n\t\t\tif (Math.abs(deltaA) > maxDeltaS) {\n\t\t\t\tacceleration = data[i - 1].acceleration + maxDeltaS * Math.sign(deltaA);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable acceleration values.\n\t\tif (this.options.accelerationRange) {\n\t\t\tlet range = this.options.accelerationRange;\n\t\t\tif (acceleration < range[0]) acceleration = range[0];\n\t\t\telse if (acceleration > range[1]) acceleration = range[1];\n\t\t}\n\n\t\tacceleration = L.Util.formatNum(acceleration, 2);\n\n\t\tif (acceleration > sMax) sMax = acceleration;\n\t\tif (acceleration < sMin) sMin = acceleration;\n\t\tsAvg = (acceleration + sAvg) / 2.0;\n\n\t\tdata[i].acceleration = acceleration;\n\n\t\ttrack.acceleration_max = sMax;\n\t\ttrack.acceleration_min = sMin;\n\t\ttrack.acceleration_avg = sAvg;\n\t});\n\n\tthis._registerFocusLabel({\n\t\tname : 'acceleration',\n\t\tchart : (item) => item.acceleration + \" \" + acceleration.label,\n\t\tmarker: (item) => Math.round(item.acceleration) + \" \" + acceleration.label,\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) + ' ' + acceleration.label\n\t\t},\n\t\t\"maxacceleration\" : {\n\t\t\tlabel: \"Max Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_max || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"avgacceleration\": {\n\t\t\tlabel: \"Avg Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_avg || 0) + ' ' + acceleration.label\n\t\t}\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 './altitude';\nimport './time';\nimport './slope';\nimport './speed';\nimport './acceleration';\n\nElevation.Utils = _;\nElevation.Components = D3;\nElevation.Chart = Chart;\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["deepMerge","target","sources","length","source","shift","isObject","key","Object","assign","deferFunc","f","document","readyState","window","addEventListener","once","factory","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","GeoJSONLoader","control","JSON","parse","distanceMarkers","this","options","lazy","wptIcons","wptLabels","layer","geoJson","style","feature","polyline","theme","className","pointToLayer","latlng","waypoints","prop","properties","desc","name","sym","replace","toLowerCase","includes","_registerCheckPoint","label","hasOwnProperty","divIcon","html","marker","icon","bindPopup","openPopup","_addMarker","fire","point","element","onEachFeature","geometry","type","_latlngs","forEach","i","meta","time","ele","hr","cad","atemp","alt","Date","coordTimes","times","_typeof","parseInt","heartRates","heartRate","addData","on","e","path","DistanceMarkers","Polyline","track_info","Control","Elevation","_d3LazyLoader","then","_fireEvt","item","Array","isArray","isVisible","elem","styles","getComputedStyle","visibility","display","isVisibleByStyles","boundingRect","getBoundingClientRect","left","right","top","above","bottom","pointerEvents","elementFromPoint","isAboveOtherElements","isJSONDoc","doc","trim","indexOf","console","warn","isXMLDoc","documentElement","ownerDocument","nodeName","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","src","head","appendChild","saveFile","dataURI","fileName","a","create","href","download","b","body","click","removeChild","waitHolder","ticking","scrollFn","requestAnimFrame","removeEventListener","addClass","targetNode","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","value","getStyle","setProperty","toggleStyle","toggleEvent","leafletElement","eventName","handler","tagName","attributes","parent","setAttributes","append","child","insert","position","insertAdjacentElement","attrs","k","setAttribute","select","selector","context","querySelector","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","func","wait","immediate","timeout","args","arguments","clearTimeout","setTimeout","apply","offsetWidth","offsetHeight","getClientRects","Colors","area","alpha","stroke","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","d3","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","classed","attr","Axis","tickSize","tickPadding","axis","scale","ticks","tickFormat","labelX","labelY","onAxisMount","g","w","axisScale","l","toUpperCase","axisGroup","join","text","Grid","props","HeightFocusLine","xCoord","yCoord","HeightFocusLabel","y","node","selectAll","HeightFocusMarker","circle","LegendItem","margins","svg","ownerSVGElement","dispatch","detail","legend","enabled","MouseFocusLine","MouseFocusLabel","rect","xAlign","yAlign","bbox","getBBox","max","Browser","webkit","Infinity","Ruler","symbol","symbolTriangle","exit","remove","enter","merge","size","angle","Domain","min","forceBounds","domain","extent","Range","Scale","range","scaleLinear","Chart","_width","ruler","_height","panes","grid","brush","tooltip","clipPath","clipRect","foreignObject","canvas","getContext","dragG","focusG","brushG","brushX","utils","chart","opts","test","navigator","platform","userAgent","_resize","bisector","invert","Class","Evented","prototype","Mixin","Events","initialize","_data","_props","scales","paths","areas","grids","axes","legendItems","focusLabels","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","imperial","_xLabel","_yLabel","xLabel","yLabel","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_initScale","_clipPath","get","_canvas","_context","_dragG","_focusG","_brush","_focusline","_focuslabel","_zoom","zoom","_drag","drag","_initInteractions","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this","clear","_resetDrag","_hideDiagramIndicator","clearRect","_path","_drawPath","ctx","datum","preferCanvas","beginPath","moveTo","p","Path2D","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","_hasActiveLayers","_initBrush","focus","_this2","sourceEvent","pointers","_findIndexForXCoord","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this3","buttons","transform","distance","_x","rescaleX","_initRuler","_initLegend","_this4","formatNum","format","yMax","_this5","z","_y","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_findIndexForLatLng","dist","isNaN","property","pos","y2","x2","_registerFocusLabel","gridOpts","axesOpts","n","translate","substring","legends","items","nodes","v","map","sign","rev","slice","reverse","push","concat","xAxesB","marginB","marginR","_this6","tx","ty","r","next","list","reduce","array","index","curr","_this7","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","yCoordinate","decimalsX","decimalsY","labels","Marker","_focusmarker","_marker","markerIcon","zIndexOffset","interactive","_focuslabels","addTo","_map","getPane","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","normalizedAlt","maxElevation","normalizedY","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","_registerSummary","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","distanceFactor","downloadLink","elevationDiv","followMarker","heightFactor","lazyLoadJS","loadData","defer","iconSize","iconAnchor","placeholder","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","responsive","slope","speed","sLimit","undefined","timeFactor","timeFormat","sDeltaMax","sInterpolation","sRange","zFollow","Mobile","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","_addData","_addLayer","eleDiv","_initElevationDiv","isConnected","getContainer","onAdd","_clearChart","_layers","_clearLayers","_markers","_clearMarkers","_updateChart","_events","elechart_updated","eachLayer","clearLayers","disableBrush","enableBrush","enableDragging","enableBrushing","disableDragging","disableBrushing","disableZoom","enableZoom","fitBounds","bounds","getBounds","isValid","latLngBounds","getZFollow","_zFollow","hide","featureGroup","_markedSegments","_chartEnabled","_setMapView","throttle","setStyle","colors","load","loadChart","loadDefer","loadLazy","loadXML","loadGeoJSON","loadFile","fetch","response","_downloadURL","catch","loadGPX","_togeojsonLazyLoader","toGeoJSON","xml","DOMParser","parseFromString","geojson","getElementsByTagName","pop","parentNode","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_updateSummary","onRemove","redraw","setZFollow","show","geom","_addGeoJSONData","coordinates","features","_addGPXData","_this8","_addPoint","_this9","lat","lng","latLng","addLayer","id","_collapse","_expand","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_mouseoutHandler","_rulerFilterHandler","_toggleChartHandler","_this10","_mousemoveLayerHandler","_pane","createPane","zIndex","_renderer","disableClickPropagation","stopPropagation","_mousewheelHandler","link","_button","title","stop","_toggle","_summary","summaryDiv","_updateMarker","gestureHandling","_enabled","ll","getCenter","getZoom","deltaY","flyTo","_this11","_this12","_this13","_this14","_this15","_this16","_isFullscreen","newWidth","_updateMapSegments","setView","animate","duration","contains","_this17","elevation_max","setLatLngs","hasLayer","onclick","preventDefault","_this18","confirm","__xTicks","__yTicks","addInitHook","_popup","_content","decodeURI","bindTooltip","direction","sticky","openTooltip","CustomEvent","dispatchEvent","_this19","_geomutilLazyLoader","GeometryUtil","almostOver","_almostoverLazyLoader","Handler","AlmostOver","addHandler","_distanceMarkersLazyLoader","oldProto","Canvas","_fillStroke","include","oldVal","_distanceFactor","track","prev","delta","toFixed","_heightFactor","eleMax","eleMin","elevation_min","prevZ","lastZ","_lastValidZ","currZ","splice","timeLabel","_timeFactor","_timeAVGSpeed","timeAVGSpeed","speedFactor","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","xTimeFormat","getTime","now","getTimezoneOffset","currT","prevT","deltaT","abs","slopeLabel","tAsc","ascent","tDes","descent","sMax","slope_max","sMin","slope_min","deltaZ","deltaS","maxDeltaS","acceleration","speedLabel","_speedFactor","speed_max","speed_min","sAvg","speed_avg","speedDeltaMax","speedRange","accelerationLabel","_accelerationFactor","accelerationFactor","acceleration_max","acceleration_min","acceleration_avg","accelerationDeltaMax","deltaA","accelerationRange","Utils","Components","elevation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/index.js","../src/components.js","../src/chart.js","../src/marker.js","../src/summary.js","../src/options.js","../src/control.js","../src/altitude.js","../src/distance.js","../src/time.js","../src/slope.js","../src/speed.js","../src/acceleration.js"],"sourcesContent":["/**\n * Recursive deep merge objects.\n * Alternative to L.Util.setOptions(this, options).\n */\nexport function deepMerge(target, ...sources) {\n\tif (!sources.length) return target;\n\tconst source = sources.shift();\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) Object.assign(target, {\n\t\t\t\t\t[key]: {}\n\t\t\t\t});\n\t\t\t\tdeepMerge(target[key], source[key]);\n\t\t\t} else {\n\t\t\t\tObject.assign(target, {\n\t\t\t\t\t[key]: source[key]\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn deepMerge(target, ...sources);\n}\n\nconst 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 * Simple GeoJSON data loader.\n */\nexport function GeoJSONLoader(data, control) {\n\tif (typeof data === \"string\") {\n\t\tdata = JSON.parse(data);\n\t}\n\tcontrol = control || this;\n\n\tlet distanceMarkers = (\n\t\t\tcontrol.options.distanceMarkers === true\n\t\t\t\t? { lazy: true }\n\t\t\t\t: L.extend({ lazy: true }, control.options.distanceMarkers)\n\t);\n\n\tlet { wptIcons, wptLabels } = control.options;\n\n\tlet layer = L.geoJson(data, {\n\t\tdistanceMarkers: distanceMarkers,\n\t\tstyle: (feature) => {\n\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\tif (control.options.theme) {\n\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t}\n\t\t\treturn style;\n\t\t},\n\t\tpointToLayer: (feature, latlng) => {\n\t\t\tif (!control.options.waypoints) return;\n\n\t\t\tlet prop = feature.properties;\n\t\t\tlet desc = prop.desc ?? '';\n\t\t\tlet name = prop.name ?? '';\n\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t// Handle chart waypoints (dots)\n\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\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\ttrue\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Handle map waypoints (markers)\n\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\tmarker.bindPopup(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : '')).openPopup();\n\t\t\t\t}\n\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\treturn marker;\n\t\t\t}\n\t\t},\n\t\tonEachFeature: (feature, layer) => {\n\t\t\tif (feature.geometry && feature.geometry.type == 'Point') return;\n\n\t\t\t// Standard GeoJSON\n\t\t\t// control.addData(feature, layer); // NB uses \"_addGeoJSONData\"\n\n\t\t\t// Extended GeoJSON\n\t\t\tlayer._latlngs.forEach((point, i, data) => {\n\t\t\t\t// same properties as L.GPX layer\n\t\t\t\tpoint.meta = { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\tif(\"alt\" in point) point.meta.ele = point.alt;\n\t\t\t\tif(feature.properties) {\n\t\t\t\t\tlet prop = feature.properties;\n\t\t\t\t\tif(\"coordTimes\" in prop) point.meta.time = new Date(Date.parse(prop.coordTimes[i]));\n\t\t\t\t\telse if(\"times\" in prop) point.meta.time = new Date(Date.parse(prop.times[i]));\n\t\t\t\t\telse if(\"time\" in prop) point.meta.time = new Date(Date.parse((typeof prop.time === 'object' ? prop.time[i] : prop.time)));\n\t\t\t\t\tif(\"heartRates\" in prop) point.meta.hr = parseInt(prop.heartRates[i]);\n\t\t\t\t\telse if(\"heartRate\" in prop) point.meta.hr = parseInt((typeof prop.heartRate === 'object' ? prop.heartRate[i] : prop.heartRate));\n\t\t\t\t\t// TODO: cadence, temperature\n\t\t\t\t}\n\t\t\t});\n\t\t\tcontrol.addData(layer); // NB uses \"_addGPXData\"\n\n\t\t\t// Postpone adding the distance markers (lazy: true)\n\t\t\tif(control.options.distanceMarkers && distanceMarkers.lazy) {\n\t\t\t\tlayer.on('add remove', (e) => {\n\t\t\t\t\tlet path = e.target;\n\t\t\t\t\tif (L.DistanceMarkers && path instanceof L.Polyline) {\n\t\t\t\t\t\tpath[e.type + 'DistanceMarkers']();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tcontrol.track_info = L.extend({}, control.track_info, { type: \"geojson\", name: data.name });\n\t\t},\n\t});\n\n\tL.Control.Elevation._d3LazyLoader.then(() => {\n\t\tcontrol._fireEvt(\"eledata_loaded\", { data: data, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t});\n\n\treturn layer;\n}\n\n/**\n * Check object type.\n */\nexport function isObject(item) {\n\treturn (item && typeof item === 'object' && !Array.isArray(item));\n}\n\n/**\n * Check JSON object type.\n */\nexport function isJSONDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"{\") == 0 || doc.indexOf(\"[\") == 0;\n\t} else {\n\t\ttry {\n\t\t\tJSON.parse(doc.toString());\n\t\t} catch (e) {\n\t\t\tif (typeof doc === \"object\" && lazy) return true;\n\t\t\tconsole.warn(e);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/**\n * Check XML object type.\n */\nexport function isXMLDoc(doc, lazy) {\n\tlazy = typeof lazy === \"undefined\" ? true : lazy;\n\tif (typeof doc === \"string\" && lazy) {\n\t\tdoc = doc.trim();\n\t\treturn doc.indexOf(\"<\") == 0;\n\t} else {\n\t\tlet documentElement = (doc ? doc.ownerDocument || doc : 0).documentElement;\n\t\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n\t}\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\nexport function lazyLoad(src, control) {\n\tif (!control.options.lazyLoadJS) return Promise.resolve();\n\n\tconst Elevation = L.Control.Elevation;\n\tlet loader = '';\n\tlet condition = false;\n\n\tswitch(src) {\n\t\tcase control.__D3:\n\t\t\tloader = '_d3LazyLoader';\n\t\t\tcondition = typeof d3 !== 'object';\n\t\tbreak;\n\t\tcase control.__TOGEOJSON:\n\t\t\tloader = '_togeojsonLazyLoader';\n\t\t\tcondition = typeof toGeoJSON !== 'object';\n\t\tbreak;\n\t\tcase control.__LGEOMUTIL:\n\t\t\tloader = '_geomutilLazyLoader';\n\t\t\tcondition = typeof L.GeometryUtil !== 'object';\n\t\tcase control.__LALMOSTOVER:\n\t\t\tloader = '_almostoverLazyLoader';\n\t\t\tcondition = typeof L.Handler.AlmostOver !== 'function ';\n\t\tbreak;\n\t\tcase control.__LDISTANCEM:\n\t\t\tloader = '_distanceMarkersLazyLoader';\n\t\t\tcondition = typeof L.DistanceMarkers !== 'function';\n\t\tbreak;\n\t}\n\treturn Elevation[loader] = lazyLoader(src, condition, Elevation[loader]);\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}","// 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 * 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 './altitude';\nimport './distance';\nimport './time';\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\nL.control.elevation = (options) => new Elevation(options);\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\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\tfor (var i in labels) {\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\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\tfor (let i in labels) {\n\t\t\tlabel = text.select(\".mouse-focus-label-\" + labels[i].name);\n\n\t\t\tif (!label.size()) {\n\t\t\t\tlabel = text.append(\"svg:tspan\", \".mouse-focus-label-x\")\n\t\t\t\t\t.attr(\"class\", \"mouse-focus-label-\" + 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\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\tpoint : g.append('g').attr(\"class\", \"point\"),\n\t\taxis : g.append('g').attr(\"class\", \"axis\"),\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 clipPath = panes.area.append(\"svg:clipPath\").attr(\"id\", 'elevation-clipper');\n\tconst clipRect = clipPath.append(\"svg:rect\");\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject');\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\tclipPath,\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\tclipRect\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._clipPath = chart.get('clipPath');\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},\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\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}\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}\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\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\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\tthis._props.grids[props.name || props.axis] = props;\n\t},\n\n\t_registerAxisScale: function(props) {\n\t\tlet opts = this.options;\n\t\tlet scale = props.scale;\n\n\t\tif (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\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},\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._clipPath) {\n\t\t\t\t\tpath.attr('clip-path', 'url(#' + this._clipPath.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\t\tthis._container = d3.select(map.getPane('elevationPane')).select(\"svg > g\")\n\t\t\t\t\t.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.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\tlet point = this._map.latLngToLayerPoint(this._latlng);\n\t\t\t\tpoint = L.extend({}, props.item, this._map._rotate ? this._map.rotatedPointToMapPanePoint(point) : point);\n\t\t\n\t\t\t\tthis._container.classed(\"leaflet-hidden\", false);\n\t\t\t\tthis._container.call(D3.PositionMarker({\n\t\t\t\t\ttheme : this.options.theme,\n\t\t\t\t\txCoord: point.x,\n\t\t\t\t\tyCoord: point.y,\n\t\t\t\t\tlength: point.y - (this._height() / props.maxElevation * point.z), // normalized Y\n\t\t\t\t\tlabels: this._labels,\n\t\t\t\t\titem: point\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","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\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\t_registerSummary: function(data) {\n\t\tfor (let i in data) {\n\t\t\tthis.append(i, L._(data[i].label), typeof data[i].value !== \"function\" ? data[i].value : data[i].value(this.control.track_info));\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: false,\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\tspeed: false,\n\tsLimit: undefined,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimeFormat: false,\n\ttimestamps: false,\n\tsDeltaMax: undefined,\n\tsInterpolation: \"curveStepAfter\",\n\tsRange: undefined,\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\"></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.3.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.7.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 * 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 when \"followMarker\" is 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.options = _.deepMerge({}, this.options, 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\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\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\tlazyLoad: function(src) {\n\t\treturn _.lazyLoad(src, this);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON or KML).\n\t */\n\tload: function(data) {\n\t\tif (_.isXMLDoc(data)) {\n\t\t\tthis.loadXML(data);\n\t\t} else if (_.isJSONDoc(data)) {\n\t\t\tthis.loadGeoJSON(data);\n\t\t} else {\n\t\t\tthis.loadFile(data);\n\t\t}\n\t},\n\n\t/**\n\t * Load data from a remote url.\n\t */\n\tloadFile: 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.load(data);\n\t\t\t})\n\t\t\t.catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Load raw GeoJSON data.\n\t */\n\tloadGeoJSON: function(data) {\n\t\t_.GeoJSONLoader(data, this);\n\t},\n\n\t/**\n\t * Load raw XML data.\n\t */\n\tloadXML: function(data) {\n\t\tthis.lazyLoad(this.__TOGEOJSON)\n\t\t\t.then(() => {\n\t\t\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\t\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\t\t\tif (!(type in toGeoJSON)) {\n\t\t\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t\t\t}\n\t\t\t\tlet geojson = toGeoJSON[type](xml);\n\t\t\t\tlet name = xml.getElementsByTagName('name');\n\t\t\t\tif(name[0]) { geojson.name = name[0].innerHTML; }\n\t\t\t\telse if(this._downloadURL) { geojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0]; }\n\n\t\t\t\treturn this.loadGeoJSON(geojson, this);\n\t\t\t});\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);\n\n\t\tif (!this.options.detached) {\n\t\t\t_.addClass(container, '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\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\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 when \"followMarker\" is 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\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\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\tif (d._latlngs) {\n\t\t\tthis._addGPXData(d._latlngs);\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) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point[1], point[0], point[2]);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parsing function for GPX data and their elevation in z-coordinate\n\t */\n\t_addGPXData: function(coords) {\n\t\t_.each(coords, point => {\n\t\t\tthis._addPoint(point.lat, point.lng, point.alt ?? point.meta.ele);\n\t\t\tthis._fireEvt(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\t\t});\n\t\tthis._fireEvt(\"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._fireEvt(\"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},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\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\tthis.eleDiv = eleDiv;\n\t\treturn this.eleDiv;\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 * 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._fireEvt.bind('elechart_enter'), 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._fireEvt(\"elechart_axis\");\n\t\tif (this.options.legend) this._fireEvt(\"elechart_legend\");\n\n\t\tthis._fireEvt(\"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._fireEvt(\"elechart_marker\");\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\n\t\tcontainer.setAttribute('aria-haspopup', true);\n\n\t\tif (!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 (L.Browser.mobile) {\n\t\t\t_.on(container, 'click', L.DomEvent.stopPropagation);\n\t\t}\n\n\t\t_.on(container, 'mousewheel', this._mousewheelHandler, this);\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\t// TODO: keyboard accessibility\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO: handle autohide when detached=true\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tlet summary = this._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(summary.render());\n\n\t\tthis.summaryDiv = this._summary._container;\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._fireEvt(\"elechart_dragged\");\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._fireEvt(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\tthis._fireEvt(\"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._fireEvt(\"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._fireEvt(\"elechart_leave\");\n\t},\n\n\t/*\n\t * Handles the mouesewheel over the chart.\n\t */\n\t_mousewheelHandler: function(e) {\n\t\tif (this._map.gestureHandling && this._map.gestureHandling._enabled) return;\n\t\tlet ll = this._marker.getLatLng() || this._map.getCenter();\n\t\tlet z = this._map.getZoom() + Math.sign(e.deltaY);\n\t\tthis._resetDrag();\n\t\tthis._map.flyTo(ll, z);\n\t},\n\n\t/**\n\t * Add a waypoint marker to the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\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 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 current 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 * Sets the view of the map (center and zoom). Useful when \"followMarker\" is 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 { path, 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 => {\n\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled);\n\t\t\t}\n\t\t);\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._fireEvt(\"elechart_axis\");\n\t\tthis._fireEvt(\"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._fireEvt('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._fireEvt(\"elechart_summary\");\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.summaryDiv.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this.summaryDiv).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._fireEvt('eletrack_download', { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) });\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});\n\n/**\n * Attach here some useful elevation hooks.\n */\nElevation.addInitHook(function() {\n\n\t// Alias deprecated functions\n\tthis.enableDragging = this.enableBrush;\n\tthis.disableDragging = this.disableBrush;\n\tthis.loadChart = this.addTo;\n\tthis.loadData = this.load;\n\tthis.loadGPX = this.loadXML;\n\n\tthis.on('waypoint_added', function(e) {\n\t\tlet p = e.point,\n\t\t\tpop = p._popup;\n\t\tif (pop) {\n\t\t\tpop.options.className = 'elevation-popup';\n\t\t}\n\t\tif (pop && pop._content) {\n\t\t\tpop._content = decodeURI(pop._content);\n\t\t\tp.bindTooltip(pop._content, { direction: 'auto', sticky: true, opacity: 1, className: 'elevation-tooltip' }).openTooltip();\n\t\t}\n\t});\n\n\tthis.on(\"eletrack_download\", function(e) {\n\t\tif (e.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: e }));\n\t\t} else if (e.downloadLink == 'link' || e.downloadLink === true) {\n\t\t\te.confirm();\n\t\t}\n\t});\n\n\tthis.on('eledata_loaded', function(e) {\n\t\tlet map = this._map;\n\t\tlet layer = e.layer;\n\t\tif (!map) {\n\t\t\tconsole.warn(\"Undefined elevation map object\");\n\t\t\treturn;\n\t\t}\n\t\tmap.once('layeradd', (e) => this.options.autofitBounds && this.fitBounds(layer.getBounds()));\n\n\t\tif (L.Browser.mobile) {\n\n\t\t\tif (this.options.polyline) layer.addTo(map);\n\n\t\t} else {\n\n\t\t\t// leaflet-geometryutil\n\t\t\tthis.lazyLoad(this.__LGEOMUTIL)\n\t\t\t\t.then(() => {\n\n\t\t\t\t\t// leaflet-almostover\n\t\t\t\t\tif (this.options.almostOver) {\n\t\t\t\t\t\tthis.lazyLoad(this.__LALMOSTOVER)\n\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\t\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// leaflet-distance-markers\n\t\t\t\t\tif (this.options.distanceMarkers) {\n\t\t\t\t\t\tthis.lazyLoad(this.__LDISTANCEM)\n\t\t\t\t\t\t\t.then(() => this.options.polyline && layer.addTo(map));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.options.polyline) layer.addTo(map);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t});\n\n\t// Basic canvas renderer support.\n\tlet oldProto = L.Canvas.prototype._fillStroke;\n\tlet control = this;\n\tL.Canvas.include({\n\t\t_fillStroke: function(ctx, layer) {\n\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\tlet theme = control.options.theme.replace('-theme', '');\n\t\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\t\tlet options = layer.options;\n\n\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t}\n\t\t}\n\t});\n\n\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\tthis.on('elechart_init', function() {\n\t\tthis.once('elechart_change elechart_hover', function(e) {\n\t\t\tif (this._chartEnabled) {\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t}\n\t\t\tthis._updateMarker(e.data);\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\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.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z * opts.altitudeFactor;\n\n\t\tlet track = this.track_info;\n\t\tlet zMax = track.elevation_max || -Infinity;\n\t\tlet zMin = track.elevation_min || +Infinity;\n\n\t\t// check and fix missing elevation data on last added point\n\t\tif (!this.options.skipNullZCoords && i > 0) {\n\t\t\tlet prevZ = data[i - 1].z;\n\t\t\tif (isNaN(prevZ)) {\n\t\t\t\tlet lastZ = this._lastValidZ;\n\t\t\t\tlet currZ = z;\n\t\t\t\tif (!isNaN(lastZ) && !isNaN(currZ)) {\n\t\t\t\t\tprevZ = (lastZ + currZ) / 2;\n\t\t\t\t} else if (!isNaN(lastZ)) {\n\t\t\t\t\tprevZ = lastZ;\n\t\t\t\t} else if (!isNaN(currZ)) {\n\t\t\t\t\tprevZ = currZ;\n\t\t\t\t}\n\t\t\t\tif (!isNaN(prevZ)) return data.splice(i - 1, 1);\n\t\t\t\tdata[i - 1].z = prevZ;\n\t\t\t}\n\t\t}\n\t\t// skip point if it has not elevation\n\t\tif (!isNaN(z)) {\n\t\t\tthis._lastValidZ = z;\n\t\t}\n\n\t\ttrack.elevation_max = z > zMax ? z : zMax;\n\t\ttrack.elevation_min = z < zMin ? z : zMin;\n\n\t\tdata[i].z = z;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"y\",\n\t\t\tposition : \"left\",\n\t\t\tscale : this._chart._y,\n\t\t});\n\n\t});\n\n\tif (this.options.altitude != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"y\",\n\t\t\t\tposition: \"left\",\n\t\t\t\tscale : this._chart._y,\n\t\t\t\tlabel : altitude.label,\n\t\t\t\tlabelX : -3,\n\t\t\t\tlabelY : -8,\n\t\t\t\tname : \"altitude\",\n\t\t\t});\n\n\t\t});\n\n\t\tthis.on(\"elechart_init\", function() {\n\n\t\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\t\tlet color = D3.Colors[theme] || {};\n\n\t\t\tthis._chart._registerAreaPath({\n\t\t\t\tname : 'altitude',\n\t\t\t\tlabel : 'Altitude',\n\t\t\t\tscaleX : 'distance',\n\t\t\t\tscaleY : 'altitude',\n\t\t\t\tcolor : color.area || theme,\n\t\t\t\tstrokeColor : this.options.detached ? color.stroke : '#000',\n\t\t\t\tstrokeOpacity: \"1\",\n\t\t\t\tfillOpacity : this.options.detached ? (color.alpha || '0.8') : 1,\n\t\t\t\tpreferCanvas : this.options.preferCanvas,\n\t\t\t});\n\n\t\t});\n\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});\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) + ' ' + altitude.label\n\t\t},\n\t\t\"minele\" : {\n\t\t\tlabel: \"Min Elevation: \",\n\t\t\tvalue: (track) => (track.elevation_min || 0).toFixed(2) + ' ' + altitude.label\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 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.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet track = this.track_info;\n\t\tlet dist = track.distance || 0;\n\n\t\tlet curr = data[i].latlng;\n\t\tlet prev = i > 0 ? data[i - 1].latlng : curr;\n\n\t\tlet delta = curr.distanceTo(prev) * opts.distanceFactor;\n\n\t\tdist += Math.round(delta / 1000 * 100000) / 100000; // handles floating points calc\n\n\t\ttrack.distance = dist;\n\n\t\tdata[i].dist = dist;\n\t});\n\n\tthis.on(\"elechart_axis\", function() {\n\n\t\tthis._chart._registerAxisGrid({\n\t\t\taxis : \"x\",\n\t\t\tposition : \"bottom\",\n\t\t\tscale : this._chart._x,\n\t\t});\n\n\t});\n\n\tif (this.options.distance != \"summary\") {\n\n\t\tthis.on(\"elechart_axis\", function() {\n\n\t\t\tthis._chart._registerAxisScale({\n\t\t\t\taxis : \"x\",\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tscale : this._chart._x,\n\t\t\t\tlabel : distance.label,\n\t\t\t\tlabelY : 25,\n\t\t\t\tlabelX : () => this._width() + 6,\n\t\t\t\tname : \"distance\",\n\t\t\t});\n\n\t\t});\n\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});\n\n\tthis._registerSummary({\n\t\t\"totlen\" : {\n\t\t\tlabel: \"Total Length: \",\n\t\t\tvalue: (track) => (track.distance || 0).toFixed(2) + ' ' + distance.label\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\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\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\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\t// Add missing timestamps (see: options.timeAVGSpeed)\n\t\tif (!e.point.meta || !e.point.meta.time) {\n\t\t\te.point.meta = e.point.meta || {};\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist);\n\t\t\tlet speed = this._timeAVGSpeed;\n\t\t\te.point.meta.time = new Date(\n\t\t\t\t(\n\t\t\t\t\ti > 0\n\t\t\t\t\t\t? data[i - 1].time.getTime() + ((( delta / speed) * opts.timeFactor) * 1000)\n\t\t\t\t\t\t: Date.now()\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tlet time = e.point.meta.time;\n\n\t\t// Handle timezone offset\n\t\tif (time.getTime() - time.getTimezoneOffset() * 60 * 1000 === 0) {\n\t\t\ttime = 0;\n\t\t}\n\n\t\tlet currT = time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = Math.abs(currT - prevT);\n\t\tlet duration = (this.track_info.time || 0) + deltaT;\n\n\t\tthis.track_info.time = duration;\n\n\t\tdata[i].time = time;\n\t\tdata[i].duration = duration;\n\t});\n\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});\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});\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}\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\tif (!this.options.slope) return;\n\n\tlet opts = this.options;\n\tlet slope = {};\n\n\tslope.label = opts.slopeLabel || '%';\n\n\tif (this.options.slope != \"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 : -1,\n\t\t\t\tmax : +1,\n\t\t\t},\n\t\t\ttickPadding: 16,\n\t\t\tlabel : slope.label,\n\t\t\tlabelX : 25,\n\t\t\tlabelY : -8,\n\t\t\tname : 'slope'\n\t\t});\n\n\t\tthis._registerAreaPath({\n\t\t\tname : 'slope',\n\t\t\tlabel : 'Slope',\n\t\t\tyAttr : 'slope',\n\t\t\tscaleX : 'distance',\n\t\t\tscaleY : 'slope',\n\t\t\tcolor : '#F00',\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.on(\"eledata_updated\", function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\t\tlet z = data[i].z;\n\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\n\t\t// Slope / Gain\n\t\tlet track = this.track_info;\n\t\tlet tAsc = track.ascent || 0; // Total Ascent\n\t\tlet tDes = track.descent || 0; // Total Descent\n\t\tlet sMax = track.slope_max || 0; // Slope Max\n\t\tlet sMin = track.slope_min || 0; // Slope Min\n\t\tlet slope = 0;\n\n\t\tif (!isNaN(z)) {\n\t\t\tlet deltaZ = i > 0 ? z - data[i - 1].z : 0;\n\t\t\tif (deltaZ > 0) tAsc += deltaZ;\n\t\t\telse if (deltaZ < 0) tDes -= deltaZ;\n\t\t\t// slope in % = ( height / length ) * 100\n\t\t\tif (delta !== 0) slope = (deltaZ / delta) * 100;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" slope values.\n\t\tif (this.options.sDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? slope - data[i - 1].slope : 0;\n\t\t\tlet maxDeltaS = this.options.sDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tslope = data[i - 1].slope + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable slope values.\n\t\tslope = _.clamp(slope, this.options.sRange);\n\n\t\ttrack.ascent = tAsc;\n\t\ttrack.descent = tDes;\n\t\ttrack.slope_max = slope > sMax ? slope : sMax;\n\t\ttrack.slope_min = slope < sMin ? slope : sMin;\n\n\t\tdata[i].slope = L.Util.formatNum(slope, 2);\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});\n\n\tthis._registerSummary({\n\t\t\"ascent\" : {\n\t\t\tlabel: \"Total Ascent: \",\n\t\t\tvalue: (track) => Math.round(track.ascent || 0) + ' ' + (this.options.imperial ? 'ft' : 'm')\n\t\t},\n\t\t\"descent\" : {\n\t\t\tlabel: \"Total Descent: \",\n\t\t\tvalue: (track) => Math.round(track.descent || 0) + ' ' + (this.options.imperial ? 'ft' : 'm')\n\t\t},\n\t\t\"minslope\": {\n\t\t\tlabel: \"Min Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_min || 0) + ' ' + slope.label\n\t\t},\n\t\t\"maxslope\": {\n\t\t\tlabel: \"Max Slope: \",\n\t\t\tvalue: (track) => Math.round(track.slope_max || 0) + ' ' + slope.label\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\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\tthis.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = currT - prevT;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.speed_max || -Infinity; // Speed Max\n\t\tlet sMin = track.speed_min || +Infinity; // Speed Min\n\t\tlet sAvg = track.speed_avg || 0; // Speed Avg\n\t\tlet speed = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet delta = (data[i].dist - data[i > 0 ? i - 1 : i].dist) * 1000;\n\t\t\tspeed = Math.abs((delta / deltaT) * opts.timeFactor) * opts.speedFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" speed values.\n\t\tif (this.options.speedDeltaMax) {\n\t\t\tlet deltaS = i > 0 ? speed - data[i - 1].speed : 0;\n\t\t\tlet maxDeltaS = this.options.speedDeltaMax;\n\t\t\tif (Math.abs(deltaS) > maxDeltaS) {\n\t\t\t\tspeed = data[i - 1].speed + maxDeltaS * Math.sign(deltaS);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable speed values.\n\t\tspeed = _.clamp(speed, this.options.speedRange);\n\n\t\ttrack.speed_max = speed > sMax ? speed : sMax;\n\t\ttrack.speed_min = speed < sMin ? speed : sMin;\n\t\ttrack.speed_avg = (speed + sAvg) / 2.0;\n\n\t\tdata[i].speed = L.Util.formatNum(speed, 2);\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});\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) + ' ' + speed.label\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) + ' ' + speed.label\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) + ' ' + speed.label\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\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.on('elepoint_added', function(e) {\n\t\tlet data = this._data;\n\t\tlet i = e.index;\n\n\t\tlet currT = data[i].time;\n\t\tlet prevT = i > 0 ? data[i - 1].time : currT;\n\n\t\tlet deltaT = (currT - prevT) / 1000;\n\n\t\tlet track = this.track_info;\n\t\tlet sMax = track.acceleration_max || -Infinity; // Acceleration Max\n\t\tlet sMin = track.acceleration_min || +Infinity; // Acceleration Min\n\t\tlet sAvg = track.acceleration_avg || 0; // Acceleration Avg\n\t\tlet acceleration = 0;\n\n\t\tif (deltaT > 0) {\n\t\t\tlet curr = data[i].speed;\n\t\t\tlet prev = i > 0 ? data[i - 1].speed : curr;\n\t\t\tlet delta = (curr - prev) * (1000 / opts.timeFactor);\n\t\t\tacceleration = Math.abs((delta / deltaT)) * opts.accelerationFactor;\n\t\t}\n\n\t\t// Try to smooth \"crazy\" acceleration values.\n\t\tif (this.options.accelerationDeltaMax) {\n\t\t\tlet deltaA = i > 0 ? acceleration - data[i - 1].acceleration : 0;\n\t\t\tlet maxDeltaS = this.options.accelerationDeltaMax;\n\t\t\tif (Math.abs(deltaA) > maxDeltaS) {\n\t\t\t\tacceleration = data[i - 1].acceleration + maxDeltaS * Math.sign(deltaA);\n\t\t\t}\n\t\t}\n\n\t\t// Range of acceptable acceleration values.\n\t\tacceleration = _.clamp(acceleration, this.options.accelerationRange);\n\n\t\ttrack.acceleration_max = acceleration > sMax ? acceleration : sMax;\n\t\ttrack.acceleration_min = acceleration < sMin ? acceleration : sMin;\n\t\ttrack.acceleration_avg = (acceleration + sAvg) / 2.0;\n\n\t\tdata[i].acceleration = L.Util.formatNum(acceleration, 2);\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});\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) + ' ' + acceleration.label\n\t\t},\n\t\t\"maxacceleration\" : {\n\t\t\tlabel: \"Max Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_max || 0) + ' ' + acceleration.label\n\t\t},\n\t\t\"avgacceleration\": {\n\t\t\tlabel: \"Avg Acceleration: \",\n\t\t\tvalue: (track) => Math.round(track.acceleration_avg || 0) + ' ' + acceleration.label\n\t\t}\n\t});\n\n});\n"],"names":["deepMerge","target","sources","length","source","shift","isObject","key","Object","assign","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","GeoJSONLoader","control","JSON","parse","distanceMarkers","this","options","lazy","wptIcons","wptLabels","layer","geoJson","style","feature","polyline","theme","className","pointToLayer","latlng","waypoints","prop","properties","desc","name","sym","replace","toLowerCase","includes","_registerCheckPoint","label","hasOwnProperty","divIcon","html","marker","icon","bindPopup","openPopup","_addMarker","fire","point","element","onEachFeature","geometry","type","_latlngs","forEach","i","meta","time","ele","hr","cad","atemp","alt","Date","coordTimes","times","_typeof","parseInt","heartRates","heartRate","addData","on","e","path","DistanceMarkers","Polyline","track_info","Control","Elevation","_d3LazyLoader","then","_fireEvt","item","Array","isArray","isJSONDoc","doc","trim","indexOf","console","warn","isXMLDoc","documentElement","ownerDocument","nodeName","saveFile","dataURI","fileName","a","create","href","download","b","document","body","appendChild","click","removeChild","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","addEventListener","once","src","head","lazyLoad","lazyLoadJS","condition","__D3","d3","__TOGEOJSON","toGeoJSON","__LGEOMUTIL","GeometryUtil","__LALMOSTOVER","Handler","AlmostOver","__LDISTANCEM","drawCanvas","ctx","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","stroke","fill","closePath","clamp","val","range","addClass","targetNode","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","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","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","proto","Colors","area","alpha","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","Axis","tickSize","tickPadding","axis","scale","ticks","tickFormat","labelX","labelY","onAxisMount","g","w","axisScale","l","toUpperCase","axisGroup","join","text","Grid","props","PositionMarker","xCoord","yCoord","labels","circle","node","isNaN","size","selectAll","LegendItem","margins","ownerSVGElement","dispatch","detail","legend","enabled","bottom","Tooltip","box","rect","xAlign","yAlign","bbox","getBBox","max","Browser","webkit","Infinity","Ruler","y","symbol","symbolTriangle","exit","remove","enter","merge","angle","CheckPoint","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","clipPath","clipRect","foreignObject","canvas","getContext","brushX","utils","chart","opts","test","navigator","platform","userAgent","_resize","bisector","invert","Class","Evented","prototype","Mixin","Events","initialize","_data","_props","scales","paths","areas","grids","axes","legendItems","tooltipItems","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_tooltip","_ruler","_initScale","_clipPath","get","_context","_brush","_zoom","zoom","_drag","drag","_initInteractions","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this","clear","_resetDrag","_hideDiagramIndicator","clearRect","_drawPath","preferCanvas","_hasActiveLayers","_initBrush","focus","_this2","sourceEvent","pointers","_findIndexForXCoord","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this3","buttons","transform","distance","_x","rescaleX","_initRuler","_initLegend","_this4","formatNum","format","yMax","_this5","z","_y","imperial","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_findIndexForLatLng","dist","_registerTooltip","gridOpts","axesOpts","n","translate","substring","legends","items","nodes","v","map","sign","rev","slice","reverse","push","concat","xAxesB","marginB","marginR","_this6","tx","ty","next","list","reduce","array","index","curr","_this7","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","Marker","getPane","_marker","markerIcon","zIndexOffset","interactive","_labels","addTo","_map","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","maxElevation","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","_registerSummary","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","decimalsX","decimalsY","downloadLink","elevationDiv","followMarker","iconSize","iconAnchor","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","slope","speed","sLimit","undefined","timeFactor","timeFormat","timestamps","sDeltaMax","sInterpolation","sRange","xLabel","yLabel","zFollow","Mobile","__mileFactor","__footFactor","_addData","_addLayer","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","_setMapView","throttle","setStyle","colors","load","loadXML","loadGeoJSON","loadFile","fetch","response","_downloadURL","catch","xml","DOMParser","parseFromString","geojson","getElementsByTagName","pop","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_updateSummary","onRemove","redraw","setZFollow","show","geom","_addGeoJSONData","coordinates","features","_addGPXData","_addPoint","_this8","lat","lng","latLng","addLayer","id","_collapse","_expand","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_mouseoutHandler","_rulerFilterHandler","_toggleChartHandler","_this9","_mousemoveLayerHandler","_pane","createPane","zIndex","pointerEvents","_renderer","disableClickPropagation","disableScrollPropagation","stopPropagation","_mousewheelHandler","link","_button","title","stop","_toggle","_summary","summaryDiv","_updateMarker","gestureHandling","_enabled","ll","getCenter","getZoom","deltaY","flyTo","_this10","_this11","_this12","_this13","_this14","_this15","_isFullscreen","newWidth","_updateMapSegments","setView","animate","duration","contains","_this16","elevation_max","setLatLngs","hasLayer","onclick","preventDefault","_this17","confirm","__xTicks","__yTicks","addInitHook","enableDragging","disableDragging","loadChart","loadData","loadGPX","_popup","_content","decodeURI","bindTooltip","direction","sticky","openTooltip","CustomEvent","dispatchEvent","_this18","almostOver","addHandler","oldProto","Canvas","_fillStroke","include","oldVal","outline","altitudeFactor","heightFactor","track","zMax","zMin","elevation_min","prevZ","lastZ","_lastValidZ","currZ","splice","toFixed","distanceFactor","prev","delta","timeLabel","_timeAVGSpeed","timeAVGSpeed","speedFactor","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","xTimeFormat","getTime","now","getTimezoneOffset","currT","prevT","deltaT","abs","slopeLabel","tAsc","ascent","tDes","descent","sMax","slope_max","sMin","slope_min","deltaZ","deltaS","maxDeltaS","acceleration","speedLabel","speed_max","speed_min","sAvg","speed_avg","speedDeltaMax","speedRange","accelerationLabel","accelerationFactor","acceleration_max","acceleration_min","acceleration_avg","accelerationDeltaMax","deltaA","accelerationRange","Utils","Components","elevation"],"mappings":"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"}
|