@raruto/leaflet-elevation 1.8.3 → 1.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/leaflet-elevation.css +16 -5
- package/dist/leaflet-elevation.js +498 -547
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.css +1 -1
- package/dist/leaflet-elevation.min.js +2 -2
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/libs/leaflet-gpxgroup.js +69 -186
- package/libs/leaflet-gpxgroup.min.js +1 -17
- package/package.json +1 -1
- package/src/chart.js +4 -1
- package/src/control.js +352 -219
- package/src/index.css +16 -5
- package/src/index.js +12 -0
- package/src/utils.js +0 -218
- package/images/remove.svg +0 -1
|
@@ -1 +1 @@
|
|
|
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\t// Partially fix MultiLineStrings (trk > trkseg + trkseg) splitting them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\tdata.features.forEach(d => {\n\t\tif(d.type == 'Feature' && d.geometry.type == \"MultiLineString\") {\n\t\t\td.geometry.coordinates.forEach(coords => {\n\t\t\t\tdata.features.push({\n\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\tgeometry: {\n\t\t\t\t\t\ttype: 'LineString',\n\t\t\t\t\t\tcoordinates: coords,\n\t\t\t\t\t},\n\t\t\t\t\tproperties: d.properties\n\t\t\t\t});\n\t\t\t});\n\t\t} \n\t});\n\tdata.features = data.features.filter(d=> d.type && d.geometry.type != \"MultiLineString\");\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 mask = panes.area.append(\"svg:mask\").attr(\"id\", 'elevation-clipper').attr('fill-opacity', 1);\n\tconst maskRect = mask.append(\"svg:rect\").attr('class', 'zoom').attr('fill', 'white'); // white = transparent\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject').attr('mask', 'url(#' + mask.attr('id') + ')');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Add tooltip\n\tpanes.tooltip.call(Tooltip({ xCoord: 0, yCoord: 0, height: _height, width : _width, labels: {} }));\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => panes.brush.select(\".overlay\").attr('cursor', null));\n\n\t// Scales\n\tconst scale = (opts) => ({ x: Scale(opts.x), y: Scale(opts.y)});\n\n\tlet utils = {\n\t\tmask,\n\t\tcanvas,\n\t\tcontext,\n\t\tbrush,\n\t};\n\n\tlet chart = {\n\t\tsvg,\n\t\tg,\n\t\tpanes,\n\t\tutils,\n\t\tscale,\n\t};\n\n\t// Resize\n\tchart._resize = ({\n\t\twidth,\n\t\theight,\n\t\tmargins = {},\n\t\truler,\n\t}) => {\n\n\t\tconst _width = width - margins.left - margins.right;\n\t\tconst _height = height - margins.top - margins.bottom;\n\n\t\tsvg.attr(\"viewBox\", `0 0 ${width} ${height}`)\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height);\n\n\t\tg.attr(\"transform\", \"translate(\" + margins.left + \",\" + margins.top + \")\");\n\n\t\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/123\n\t\tif(/Mac|iPod|iPhone|iPad/.test(navigator.platform) && /AppleWebkit/i.test(navigator.userAgent)) {\n\t\t\tcanvas\n\t\t\t.style(\"transform\", \"translate(\" + margins.left + \"px,\" + margins.top + \"px)\");\n\t\t}\n\n\t\tmaskRect\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", _width)\n\t\t\t.attr(\"height\", _height);\n\n\t\tforeignObject\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tcanvas\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tif (ruler) {\n\t\t\tpanes.ruler.call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tpanes.brush.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tpanes.brush.select(\".overlay\").attr('cursor', null);\n\n\t\tchart._width = _width;\n\t\tchart._height = _height;\n\n\t\tchart.svg.dispatch('resize', { detail: { width: _width, height: _height } } );\n\n\t};\n\n\tchart.pane = (name) => {\n\t\tif (!panes[name]) {\n\t\t\tpanes[name] = g.append('g').attr(\"class\", name);\n\t\t}\n\t\treturn panes[name];\n\t}\n\n\tchart.get = (name) => utils[name];\n\n\tchart._resize({ width, height, margins});\n\n\treturn chart;\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Chart = L.Class.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tthis._data = [];\n\n\t\t// cache registered components\n\t\tthis._props = {\n\t\t\tscales : {},\n\t\t\tpaths : {},\n\t\t\tareas : {},\n\t\t\tgrids : {},\n\t\t\taxes : {},\n\t\t\tlegendItems : {},\n\t\t\ttooltipItems: {},\n\t\t};\n\n\t\tthis._scales = {};\n\t\tthis._domains = {};\n\t\tthis._ranges = {};\n\t\tthis._paths = {};\n\n\t\tthis._brushEnabled = opts.dragging;\n\t\tthis._zoomEnabled = opts.zooming;\n\n\t\tlet chart = this._chart = D3.Chart(opts);\n\n\t\t// SVG Container\n\t\tlet svg = this._container = chart.svg;\n\n\t\t// Panes\n\t\tthis._grid = chart.pane('grid');\n\t\tthis._area = chart.pane('area');\n\t\tthis._point = chart.pane('point');\n\t\tthis._axis = chart.pane('axis');\n\t\tthis._legend = chart.pane('legend');\n\t\tthis._tooltip = chart.pane('tooltip');\n\t\tthis._ruler = chart.pane('ruler');\n\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._mask = chart.get('mask');\n\t\tthis._context = chart.get('context');\n\t\tthis._brush = chart.get('brush');\n\n\t\tthis._zoom = d3.zoom();\n\t\tthis._drag = d3.drag();\n\n\t\t// Interactions\n\t\tthis._initInteractions();\n\n\t\t// svg.on('resize', (e)=>console.log(e.detail));\n\n\t\t// Handle multi-track segments (BETA)\n\t\tthis._maskGaps = [];\n\t\tcontrol.on('eletrack_added', (e) => {\n\t\t\tthis._maskGaps.push(e.index);\n\t\t\tcontrol.once('eledata_updated', (e) => this._maskGaps.push(e.index));\n\t\t});\n\n\t},\n\n\tupdate: function(props) {\n\t\tif (props) {\n\t\t\tif (props.data) this._data = props.data;\n\t\t\tif (props.options) this.options = props.options;\n\t\t}\n\n\t\tthis._updateScale();\n\t\tthis._updateArea();\n\t\tthis._updateAxis();\n\t\tthis._updateLegend();\n\t\tthis._updateClipper();\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container.node());\n\t},\n\n\tclear: function() {\n\t\tthis._resetDrag();\n\t\tthis._hideDiagramIndicator()\n\t\tthis._area.selectAll('path').attr(\"d\", \"M0 0\");\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\n\t\t// if (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t// }\n\n\t\tthis._maskGaps = [];\n\t\tthis._mask.selectAll(\".gap\").remove();\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\n\t\tpath.datum(this._data).attr(\"d\",\n\t\t\tD3.Area(\n\t\t\t\tL.extend({}, area, {\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tscaleX : this._scales[area.scaleX],\n\t\t\t\t\tscaleY : this._scales[area.scaleY]\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (this.options.preferCanvas) {\n\t\t\t_.drawCanvas(this._context, path);\n\t\t} else {\n\t\t\tthis._area.append(() => path.node());\n\t\t}\n\t},\n\n\t_hasActiveLayers: function() {\n\t\tconst paths = this._paths;\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Initialize \"d3-brush\".\n\t */\n\t_initBrush: function(e) {\n\t\tconst brush = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tlet extent = e.selection;\n\t\t\tif (extent) {\n\t\t\t\tlet start = this._findIndexForXCoord(extent[0]);\n\t\t\t\tlet end = this._findIndexForXCoord(extent[1]);\n\t\t\t\tthis.fire('dragged', { dragstart: this._data[start], dragend: this._data[end] });\n\t\t\t}\n\t\t}\n\n\t\tconst focus = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tif (e.type == 'brush' && !e.sourceEvent) return;\n\t\t\tlet rect = this._chart.panes.brush.select('.overlay').node();\n\t\t\tlet coords = d3.pointers(e, rect)[0];\n\t\t\tlet xCoord = coords[0];\n\t\t\tlet item = this._data[this._findIndexForXCoord(xCoord)];\n\n\t\t\tthis.fire(\"mouse_move\", { item: item, xCoord: xCoord });\n\t\t};\n\n\t\tthis._brush\n\t\t\t.filter((e) => this._brushEnabled && !e.shiftKey && !e.button)\n\t\t\t.on(\"end.update\", brush)\n\t\t\t.on(\"brush.update\", focus);\n\n\t\tthis._chart.panes.brush\n\t\t\t.on(\"mouseenter.focus touchstart.focus\", this.fire.bind(this, \"mouse_enter\"))\n\t\t\t.on(\"mouseout.focus touchend.focus\", this.fire.bind(this, \"mouse_out\") )\n\t\t\t.on(\"mousemove.focus touchmove.focus\", focus );\n\n\t},\n\n\t/**\n\t * Initialize \"d3-zoom\"\n\t */\n\t_initClipper: function() {\n\t\tlet svg = this._container;\n\t\tlet margin = this.options.margins;\n\n\t\tconst zoom = this._zoom;\n\n\t\tconst onStart = (e) => {\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousedown\") svg.style('cursor', 'grabbing');\n\t\t\tif (e.transform.k == 1 && e.transform.x == 0) {\n\t\t\t\tthis._container.classed('zoomed', true);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = true;\n\t\t};\n\n\t\tconst onEnd = (e) => {\n\t\t\tif (e.transform.k ==1 && e.transform.x == 0){\n\t\t\t\tthis._container.classed('zoomed', false);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = false;\n\t\t\tsvg.style('cursor', '');\n\t\t};\n\n\t\tconst onZoom = (e) => {\n\t\t\t// TODO: find a faster way to redraw the chart.\n\t\t\tthis.zooming = false;\n\t\t\tthis._updateScale(); // hacky way for restoring x scale when zooming out\n\t\t\tthis.zooming = true;\n\t\t\tthis._scales.distance = this._x = e.transform.rescaleX(this._x); // calculate x scale at zoom level\n\t\t\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\t// Apply svg mask on multi-track segments (BETA)\n\t\tthis._mask.selectAll(\".gap\").remove()\n\t\tthis._maskGaps.forEach((d, i) => {\n\t\t\tif(i >= this._maskGaps.length - 2) return;\n\t\t\tlet d1 = this._data[this._maskGaps[i]];\n\t\t\tlet d2 = this._data[this._maskGaps[i + 1]];\n\t\t\tlet x1 = this._x(this._data[this._findIndexForLatLng(d1.latlng)].dist);\n\t\t\tlet x2 = this._x(this._data[this._findIndexForLatLng(d2.latlng)].dist);\n\t\t\tthis._mask\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"x\", x1)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"width\", x2 - x1 )\n\t\t\t\t.attr(\"height\", this._height())\n\t\t\t\t.attr('class', 'gap')\n\t\t\t\t.attr('fill-opacity', '0.8')\n\t\t\t\t.attr(\"fill\", 'black'); // black = hide\n\t\t});\n\t},\n\n\t_updateLegend: function () {\n\n\t\tif (this.options.legend === false) return;\n\n\t\tlet legends = this._props.legendItems;\n\t\tlet legend;\n\n\t\t// Reset legend items\n\t\tthis._legend.selectAll('g').remove();\n\t\tfor (var i in legends) {\n\t\t\tlegend = D3.LegendItem(\n\t\t\t\tL.extend({\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tmargins: this.options.margins,\n\t\t\t\t}, legends[i])\n\t\t\t)\n\t\t\tthis._legend.append(\"g\").call(legend);\n\t\t}\n\n\t\t// Get legend items\n\t\tlet items = this._legend.selectAll('.legend-item');\n\n\t\t// Calculate legend item positions\n\t\tlet n = items.nodes().length;\n\t\tlet v = Array(Math.floor(n / 2)).fill(null).map((d, i) => (i + 1) * 2 - (1 - Math.sign(n % 2)));\n\t\tlet rev = v.slice().reverse().map((d) => -(d));\n\n\t\tif (n % 2 !== 0) {\n\t\t\trev.push(0);\n\t\t}\n\t\tv = rev.concat(v);\n\n\t\t// Get chart margins\n\t\tlet xAxesB = this._axis.selectAll('.x.axis.bottom').nodes().length;\n\t\tlet marginB = 30 + (xAxesB * 2);\n\t\tlet marginR = n * 30;\n\n\t\t// Adjust chart right margins\n\t\tif (n && this.options.margins.right < marginR) {\n\t\t\tthis.options.margins.right = marginR;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\t// Adjust chart bottom margins\n\t\tif(xAxesB && this.options.margins.bottom < marginB) {\n\t\t\tthis.options.margins.bottom = marginB;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\titems\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet legend = d3.select(n[i]);\n\t\t\t\tlet rect = legend.select('rect');\n\t\t\t\tlet name = legend.attr('data-name');\n\t\t\t\tlet path = this._paths[name];\n\n\t\t\t\tlet tx = v[i] * 55;\n\t\t\t\tlet ty = xAxesB * 2;\n\n\t\t\t\tlegend\n\n\t\t\t\t// Adjust legend item positions\n\t\t\t\t.attr(\"transform\", \"translate(\" + tx + \", \" + ty + \")\");\n\n\t\t\t\t// Set initial state (disabled controls)\n\t\t\t\tif (name in this.options && this.options[name] == 'disabled') {\n\t\t\t\t\tpath.classed('leaflet-hidden', true);\n\t\t\t\t\tlegend.select('text').style('text-decoration-line', 'line-through');\n\t\t\t\t\tlegend.select('rect').style('fill-opacity', '0');\n\t\t\t\t}\n\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tpath.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\n\t\t\t});\n\t},\n\n\t_updateScale: function() {\n\t\tif (this.zooming) return { x: this._x, y: this._y };\n\n\t\tfor (let i in this._scales) {\n\t\t\tthis._scales[i]\n\t\t\t\t.domain(this._domains[i](this._data))\n\t\t\t\t.range(this._ranges[i](this._width(), this._height()))\n\t\t}\n\n\t\treturn { x: this._x, y: this._y };\n\t},\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\treturn this._chart._width;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\treturn this._chart._height;\n\t},\n\n\t/*\n\t * Finds data entries above a given y-elevation value and returns geo-coordinates\n\t */\n\t_findCoordsForY: function(y) {\n\t\tlet data = this._data;\n\t\tlet z = this._y.invert(y);\n\n\t\t// save indexes of elevation values above the horizontal line\n\t\tconst list = data.reduce((array, item, index) => {\n\t\t\tif (item.z >= z) array.push(index);\n\t\t\treturn array;\n\t\t}, []);\n\n\t\tlet start = 0;\n\t\tlet next;\n\n\t\t// split index list into blocks of coordinates\n\t\tconst coords = list.reduce((array, _, curr) => {\n\t\t\tnext = curr + 1;\n\t\t\tif (list[next] !== list[curr] + 1 || next === list.length) {\n\t\t\t\tarray.push(\n\t\t\t\t\tlist\n\t\t\t\t\t.slice(start, next)\n\t\t\t\t\t.map(i => data[i].latlng)\n\t\t\t\t);\n\t\t\t\tstart = next;\n\t\t\t}\n\t\t\treturn array;\n\t\t}, []);\n\n\t\treturn coords;\n\t},\n\n\t/*\n\t * Finds a data entry for a given x-coordinate of the diagram\n\t */\n\t_findIndexForXCoord: function(x) {\n\t\treturn d3\n\t\t\t.bisector(d => d[this.options.xAttr])\n\t\t\t.left(this._data || [0, 1], this._x.invert(x));\n\t},\n\n\t/*\n\t * Finds a data entry for a given latlng of the map\n\t */\n\t_findIndexForLatLng: function(latlng) {\n\t\tlet result = null;\n\t\tlet d = Infinity;\n\t\tthis._data.forEach((item, index) => {\n\t\t\tlet dist = latlng.distanceTo(item.latlng);\n\t\t\tif (dist < d) {\n\t\t\t\td = dist;\n\t\t\t\tresult = index;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tif (this._chart.panes.brush.select(\".selection\").attr('width')) {\n\t\t\tthis._chart.panes.brush.call(this._brush.clear);\n\t\t\tthis._hideDiagramIndicator();\n\t\t\tthis.fire('reset_drag');\n\t\t}\n\t},\n\n\t_resetZoom: function() {\n\t\tif (this._zoom) {\n\t\t\tthis._zoom.transform(this._chart.svg, d3.zoomIdentity);\n\t\t}\n\t},\n\n\t/**\n\t * Display distance and altitude level (\"focus-rect\").\n\t */\n\t_showDiagramIndicator: function(item, xCoordinate) {\n\t\tthis._tooltip\n\t\t\t.attr(\"display\", null)\n\t\t\t.call(D3.Tooltip({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: this._y(item[this.options.yAttr]),\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabels: this._props.tooltipItems,\n\t\t\t\titem: item\n\t\t\t}));\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._tooltip.attr(\"display\", 'none');\n\t},\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Marker = L.Class.extend({\n\n\tinitialize: function(options) {\n\t\tthis.options = options;\n\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line':\n\t\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\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.8.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\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\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","features","forEach","type","geometry","coordinates","coords","push","properties","filter","layer","geoJson","style","feature","polyline","theme","className","pointToLayer","latlng","waypoints","prop","desc","name","sym","replace","toLowerCase","includes","_registerCheckPoint","label","hasOwnProperty","divIcon","html","marker","icon","bindPopup","openPopup","_addMarker","fire","point","element","onEachFeature","_latlngs","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","mask","maskRect","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","_mask","get","_context","_brush","_zoom","zoom","_drag","drag","_initInteractions","_maskGaps","_this","index","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this2","clear","_resetDrag","_hideDiagramIndicator","clearRect","_drawPath","preferCanvas","_hasActiveLayers","_initBrush","focus","_this3","sourceEvent","pointers","_findIndexForXCoord","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this4","buttons","transform","distance","_x","rescaleX","_initRuler","_initLegend","_this5","formatNum","format","yMax","_this6","z","_y","imperial","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_findIndexForLatLng","dist","_registerTooltip","gridOpts","axesOpts","n","translate","substring","_this7","d1","d2","x1","legends","items","nodes","v","map","sign","rev","slice","reverse","concat","xAxesB","marginB","marginR","_this8","tx","ty","next","list","reduce","array","curr","_this9","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","_addGPXData","_addPoint","lat","lng","latLng","addLayer","id","_collapse","_expand","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_mouseoutHandler","_rulerFilterHandler","_toggleChartHandler","_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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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/components.js","../src/chart.js","../src/marker.js","../src/index.js","../src/summary.js","../src/options.js","../src/control.js","../src/altitude.js","../src/distance.js","../src/time.js","../src/slope.js","../src/speed.js","../src/acceleration.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","const SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a duration time (millis) to a human readable string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Generate download data event.\n */\n export function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n/**\n * Async JS script download.\n */\nexport function lazyLoader(url, skip, loader) {\n\tif (skip === false) {\n\t\treturn Promise.resolve();\n\t}\n\tif (loader instanceof Promise) {\n\t\treturn loader;\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tlet tag = document.createElement(\"script\");\n\t\ttag.addEventListener('load', resolve, { once: true });\n\t\ttag.src = url;\n\t\tdocument.head.appendChild(tag);\n\t});\n}\n\n/**\n * Convert SVG Path into Path2D and then update canvas\n */\n export function drawCanvas(ctx, path) {\n\tpath.classed('canvas-path', true);\n\n\tctx.beginPath();\n\tctx.moveTo(0, 0);\n\tlet p = new Path2D(path.attr('d'));\n\n\tctx.strokeStyle = path.attr('stroke');\n\tctx.fillStyle = path.attr('fill');\n\tctx.lineWidth = 1.25;\n\tctx.globalCompositeOperation = 'source-over';\n\n\t// stroke opacity\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\tctx.stroke(p);\n\n\t// fill opacity\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\tctx.fill(p);\n\n\tctx.globalAlpha = 1;\n\n\tctx.closePath();\n}\n\n/**\n * Limit a number between min / max values\n */\n export function clamp(val, range) {\n\tif (range) return val < range[0] ? range[0] : val > range[1] ? range[1] : val;\n\treturn val;\n}\n\n/**\n * A little bit safier than L.DomUtil.addClass\n */\nexport function addClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.addClass(targetNode, s));\n}\n\n/**\n * A little bit safier than L.DomUtil.removeClass()\n */\nexport function removeClass(targetNode, className) {\n\tif (targetNode) className.split(\" \").every(s => s && L.DomUtil.removeClass(targetNode, s));\n}\n\nexport function toggleClass(targetNode, className, conditional) {\n\treturn (conditional ? addClass : removeClass).call(null, targetNode, className)\n}\n\nexport function replaceClass(targetNode, removeClassName, addClassName) {\n\tif (removeClassName) removeClass(targetNode, removeClassName);\n\tif (addClassName) addClass(targetNode, addClassName);\n}\n\nexport function style(targetNode, name, value) {\n\tif (typeof value === \"undefined\") return L.DomUtil.getStyle(targetNode, name);\n\telse return targetNode.style.setProperty(name, value);\n}\n\nexport function toggleStyle(targetNode, name, value, conditional) {\n\treturn style(targetNode, name, conditional ? value : '');\n}\n\nexport function toggleEvent(leafletElement, eventName, handler, conditional) {\n\treturn leafletElement[conditional ? 'on' : 'off'](eventName, handler);\n}\n\n/**\n * A little bit shorter than L.DomUtil.create()\n */\nexport function create(tagName, className, attributes, parent) {\n\tlet elem = L.DomUtil.create(tagName, className || \"\");\n\tif (attributes) setAttributes(elem, attributes);\n\tif (parent) append(parent, elem);\n\treturn elem;\n}\n\n/**\n * Same as node.appendChild()\n */\nexport function append(parent, child) {\n\treturn parent.appendChild(child);\n}\n\n/**\n * Same as node.insertAdjacentElement()\n */\nexport function insert(parent, child, position) {\n\treturn parent.insertAdjacentElement(position, child);\n}\n\n/**\n * Loop for node.setAttribute()\n */\nexport function setAttributes(elem, attrs) {\n\tfor (let k in attrs) { elem.setAttribute(k, attrs[k]); }\n}\n\n/**\n * Same as node.querySelector().\n */\nexport function select(selector, context) {\n\treturn (context || document).querySelector(selector);\n}\n\n/**\n * Alias for L.DomEvent.on.\n */\nexport const on = L.DomEvent.on;\n\n/**\n * Alias for L.DomEvent.off.\n */\nexport const off = L.DomEvent.off;\n\n/**\n * Alias for L.DomUtil.hasClass.\n */\nexport const hasClass = L.DomUtil.hasClass;\n\n\n/**\n * Generate a random string\n */\nexport function randomId() {\n\treturn Math.random().toString(36).substr(2, 9);\n}\n\n/**\n * Execute a function foreach element in object\n */\nexport function each(obj, fn) {\n\tfor (let i in obj) fn(obj[i], i);\n}","export const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nexport const Area = ({\n\twidth,\n\theight,\n\txAttr,\n\tyAttr,\n\tscaleX,\n\tscaleY,\n\tinterpolation = \"curveLinear\"\n}) => {\n\treturn d3.area()\n\t\t.curve(typeof interpolation === 'string' ? d3[interpolation] : interpolation)\n\t\t.x(d => (d.xDiagCoord = scaleX(d[xAttr])))\n\t\t.y0(height)\n\t\t.y1(d => scaleY(d[yAttr]));\n};\n\nexport const Path = ({\n\tname,\n\tcolor,\n\tstrokeColor,\n\tstrokeOpacity,\n\tfillOpacity,\n}) => {\n\tlet path = d3.create('svg:path')\n\n\tif (name) path.classed(name, true);\n\n\tpath.style(\"pointer-events\", \"none\");\n\n\tpath\n\t.attr(\"fill\", color || '#3366CC')\n\t.attr(\"stroke\", strokeColor || '#000')\n\t.attr(\"stroke-opacity\", strokeOpacity || '1')\n\t.attr(\"fill-opacity\", fillOpacity || '0.8');\n\n\treturn path;\n};\n\nexport const Axis = ({\n\ttype = \"axis\",\n\ttickSize = 6,\n\ttickPadding = 3,\n\tposition,\n\theight,\n\twidth,\n\taxis,\n\tscale,\n\tticks,\n\ttickFormat,\n\tlabel,\n\tlabelX,\n\tlabelY,\n\tname = \"\",\n\tonAxisMount,\n}) => {\n\treturn g => {\n\t\tlet [w, h] = [0, 0];\n\t\tif (position == \"bottom\") h = height;\n\t\tif (position == \"right\") w = width;\n\n\t\tif (axis == \"x\" && type == \"grid\") {\n\t\t\ttickSize = -height;\n\t\t} else if (axis == \"y\" && type == \"grid\") {\n\t\t\ttickSize = -width;\n\t\t}\n\n\t\tlet axisScale = d3[\"axis\" + position.replace(/\\b\\w/g, l => l.toUpperCase())]()\n\t\t\t.scale(scale)\n\t\t\t.ticks(ticks)\n\t\t\t.tickPadding(tickPadding)\n\t\t\t.tickSize(tickSize)\n\t\t\t.tickFormat(tickFormat);\n\n\t\tlet axisGroup = g.append(\"g\")\n\t\t\t.attr(\"class\", [axis, type, position, name].join(\" \"))\n\t\t\t.attr(\"transform\", \"translate(\" + w + \",\" + h + \")\")\n\t\t\t.call(axisScale);\n\n\t\tif (label) {\n\t\t\taxisGroup.append(\"svg:text\")\n\t\t\t\t.attr(\"x\", labelX)\n\t\t\t\t.attr(\"y\", labelY)\n\t\t\t\t.text(label);\n\t\t}\n\n\t\tif (onAxisMount) {\n\t\t\taxisGroup.call(onAxisMount);\n\t\t}\n\n\t\treturn axisGroup;\n\t};\n};\n\nexport const Grid = (props) => {\n\tprops.type = \"grid\";\n\treturn Axis(props);\n};\n\nexport const PositionMarker = ({\n\ttheme,\n\txCoord = 0,\n\tyCoord = 0,\n\tlabels = {},\n\titem = {},\n\tlength = 0,\n}) => {\n\treturn g => {\n\n\t\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 mask = panes.area.append(\"svg:mask\").attr(\"id\", 'elevation-clipper').attr('fill-opacity', 1);\n\tconst maskRect = mask.append(\"svg:rect\").attr('class', 'zoom').attr('fill', 'white'); // white = transparent\n\n\t// Canvas Paths\n\tconst foreignObject = panes.area.append('svg:foreignObject').attr('mask', 'url(#' + mask.attr('id') + ')');\n\tconst canvas = foreignObject.append('xhtml:canvas').attr('class', 'canvas-plot');\n\tconst context = canvas.node().getContext('2d');\n\n\t// Add tooltip\n\tpanes.tooltip.call(Tooltip({ xCoord: 0, yCoord: 0, height: _height, width : _width, labels: {} }));\n\n\t// Add the brushing\n\tlet brush = d3.brushX().on('start.cursor end.cursor brush.cursor', () => panes.brush.select(\".overlay\").attr('cursor', null));\n\n\t// Scales\n\tconst scale = (opts) => ({ x: Scale(opts.x), y: Scale(opts.y)});\n\n\tlet utils = {\n\t\tmask,\n\t\tcanvas,\n\t\tcontext,\n\t\tbrush,\n\t};\n\n\tlet chart = {\n\t\tsvg,\n\t\tg,\n\t\tpanes,\n\t\tutils,\n\t\tscale,\n\t};\n\n\t// Resize\n\tchart._resize = ({\n\t\twidth,\n\t\theight,\n\t\tmargins = {},\n\t\truler,\n\t}) => {\n\n\t\tconst _width = width - margins.left - margins.right;\n\t\tconst _height = height - margins.top - margins.bottom;\n\n\t\tsvg.attr(\"viewBox\", `0 0 ${width} ${height}`)\n\t\t\t.attr(\"width\", width)\n\t\t\t.attr(\"height\", height);\n\n\t\tg.attr(\"transform\", \"translate(\" + margins.left + \",\" + margins.top + \")\");\n\n\t\t// Partially fix: https://github.com/Raruto/leaflet-elevation/issues/123\n\t\tif(/Mac|iPod|iPhone|iPad/.test(navigator.platform) && /AppleWebkit/i.test(navigator.userAgent)) {\n\t\t\tcanvas\n\t\t\t.style(\"transform\", \"translate(\" + margins.left + \"px,\" + margins.top + \"px)\");\n\t\t}\n\n\t\tmaskRect\n\t\t\t.attr(\"x\", 0)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"width\", _width)\n\t\t\t.attr(\"height\", _height);\n\n\t\tforeignObject\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tcanvas\n\t\t\t.attr('width', _width)\n\t\t\t.attr('height', _height);\n\n\t\tif (ruler) {\n\t\t\tpanes.ruler.call(Ruler({ height: _height, width: _width }));\n\t\t}\n\n\t\tpanes.brush.call(brush.extent( [ [0,0], [_width, _height] ] ));\n\t\tpanes.brush.select(\".overlay\").attr('cursor', null);\n\n\t\tchart._width = _width;\n\t\tchart._height = _height;\n\n\t\tchart.svg.dispatch('resize', { detail: { width: _width, height: _height } } );\n\n\t};\n\n\tchart.pane = (name) => {\n\t\tif (!panes[name]) {\n\t\t\tpanes[name] = g.append('g').attr(\"class\", name);\n\t\t}\n\t\treturn panes[name];\n\t}\n\n\tchart.get = (name) => utils[name];\n\n\tchart._resize({ width, height, margins});\n\n\treturn chart;\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Chart = L.Class.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\n\t\tthis._data = [];\n\n\t\t// cache registered components\n\t\tthis._props = {\n\t\t\tscales : {},\n\t\t\tpaths : {},\n\t\t\tareas : {},\n\t\t\tgrids : {},\n\t\t\taxes : {},\n\t\t\tlegendItems : {},\n\t\t\ttooltipItems: {},\n\t\t};\n\n\t\tthis._scales = {};\n\t\tthis._domains = {};\n\t\tthis._ranges = {};\n\t\tthis._paths = {};\n\n\t\tthis._brushEnabled = opts.dragging;\n\t\tthis._zoomEnabled = opts.zooming;\n\n\t\tlet chart = this._chart = D3.Chart(opts);\n\n\t\t// SVG Container\n\t\tlet svg = this._container = chart.svg;\n\n\t\t// Panes\n\t\tthis._grid = chart.pane('grid');\n\t\tthis._area = chart.pane('area');\n\t\tthis._point = chart.pane('point');\n\t\tthis._axis = chart.pane('axis');\n\t\tthis._legend = chart.pane('legend');\n\t\tthis._tooltip = chart.pane('tooltip');\n\t\tthis._ruler = chart.pane('ruler');\n\n\t\t// Scales\n\t\tthis._initScale();\n\n\t\t// Helpers\n\t\tthis._mask = chart.get('mask');\n\t\tthis._context = chart.get('context');\n\t\tthis._brush = chart.get('brush');\n\n\t\tthis._zoom = d3.zoom();\n\t\tthis._drag = d3.drag();\n\n\t\t// Interactions\n\t\tthis._initInteractions();\n\n\t\t// svg.on('resize', (e)=>console.log(e.detail));\n\n\t\t// Handle multi-track segments (BETA)\n\t\tthis._maskGaps = [];\n\t\tcontrol.on('eletrack_added', (e) => {\n\t\t\tthis._maskGaps.push(e.index);\n\t\t\tcontrol.once('eledata_updated', (e) => this._maskGaps.push(e.index));\n\t\t});\n\n\t},\n\n\tupdate: function(props) {\n\t\tif (props) {\n\t\t\tif (props.data) this._data = props.data;\n\t\t\tif (props.options) this.options = props.options;\n\t\t}\n\n\t\tthis._updateScale();\n\t\tthis._updateArea();\n\t\tthis._updateAxis();\n\t\tthis._updateLegend();\n\t\tthis._updateClipper();\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\treturn container => container.append(() => this._container.node());\n\t},\n\n\tclear: function() {\n\t\tthis._resetDrag();\n\t\tthis._hideDiagramIndicator()\n\t\tthis._area.selectAll('path').attr(\"d\", \"M0 0\");\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\n\t\t// if (this._path) {\n\t\t\t// this._x.domain([0, 1]);\n\t\t\t// this._y.domain([0, 1]);\n\t\t// }\n\n\t\tthis._maskGaps = [];\n\t\tthis._mask.selectAll(\".gap\").remove();\n\t},\n\n\t_drawPath: function(name) {\n\t\tlet path = this._paths[name];\n\t\tlet area = this._props.areas[name];\n\n\t\tpath.datum(this._data).attr(\"d\",\n\t\t\tD3.Area(\n\t\t\t\tL.extend({}, area, {\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tscaleX : this._scales[area.scaleX],\n\t\t\t\t\tscaleY : this._scales[area.scaleY]\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\n\t\tif (path.classed('leaflet-hidden')) return;\n\n\t\tif (this.options.preferCanvas) {\n\t\t\t_.drawCanvas(this._context, path);\n\t\t} else {\n\t\t\tthis._area.append(() => path.node());\n\t\t}\n\t},\n\n\t_hasActiveLayers: function() {\n\t\tconst paths = this._paths;\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/**\n\t * Initialize \"d3-brush\".\n\t */\n\t_initBrush: function(e) {\n\t\tconst brush = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tlet extent = e.selection;\n\t\t\tif (extent) {\n\t\t\t\tlet start = this._findIndexForXCoord(extent[0]);\n\t\t\t\tlet end = this._findIndexForXCoord(extent[1]);\n\t\t\t\tthis.fire('dragged', { dragstart: this._data[start], dragend: this._data[end] });\n\t\t\t}\n\t\t}\n\n\t\tconst focus = (e) => {\n\t\t\tif (!this._data.length) return;\n\t\t\tif (e.type == 'brush' && !e.sourceEvent) return;\n\t\t\tlet rect = this._chart.panes.brush.select('.overlay').node();\n\t\t\tlet coords = d3.pointers(e, rect)[0];\n\t\t\tlet xCoord = coords[0];\n\t\t\tlet item = this._data[this._findIndexForXCoord(xCoord)];\n\n\t\t\tthis.fire(\"mouse_move\", { item: item, xCoord: xCoord });\n\t\t};\n\n\t\tthis._brush\n\t\t\t.filter((e) => this._brushEnabled && !e.shiftKey && !e.button)\n\t\t\t.on(\"end.update\", brush)\n\t\t\t.on(\"brush.update\", focus);\n\n\t\tthis._chart.panes.brush\n\t\t\t.on(\"mouseenter.focus touchstart.focus\", this.fire.bind(this, \"mouse_enter\"))\n\t\t\t.on(\"mouseout.focus touchend.focus\", this.fire.bind(this, \"mouse_out\") )\n\t\t\t.on(\"mousemove.focus touchmove.focus\", focus );\n\n\t},\n\n\t/**\n\t * Initialize \"d3-zoom\"\n\t */\n\t_initClipper: function() {\n\t\tlet svg = this._container;\n\t\tlet margin = this.options.margins;\n\n\t\tconst zoom = this._zoom;\n\n\t\tconst onStart = (e) => {\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousedown\") svg.style('cursor', 'grabbing');\n\t\t\tif (e.transform.k == 1 && e.transform.x == 0) {\n\t\t\t\tthis._container.classed('zoomed', true);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = true;\n\t\t};\n\n\t\tconst onEnd = (e) => {\n\t\t\tif (e.transform.k ==1 && e.transform.x == 0){\n\t\t\t\tthis._container.classed('zoomed', false);\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tthis._point.attr('mask', null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.zooming = false;\n\t\t\tsvg.style('cursor', '');\n\t\t};\n\n\t\tconst onZoom = (e) => {\n\t\t\t// TODO: find a faster way to redraw the chart.\n\t\t\tthis.zooming = false;\n\t\t\tthis._updateScale(); // hacky way for restoring x scale when zooming out\n\t\t\tthis.zooming = true;\n\t\t\tthis._scales.distance = this._x = e.transform.rescaleX(this._x); // calculate x scale at zoom level\n\t\t\tif (this._scales.time) this._scales.time = e.transform.rescaleX(this._scales.time); // calculate x scale at zoom level\n\t\t\tthis._resetDrag();\n\t\t\tif (e.sourceEvent && e.sourceEvent.type == \"mousemove\") {\n\t\t\t\tthis._hideDiagramIndicator();\n\t\t\t}\n\t\t\tthis.fire('zoom');\n\t\t};\n\n\t\tzoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t])\n\t\t\t.filter((e) => this._zoomEnabled && (e.shiftKey || e.buttons == 4))\n\t\t\t.on(\"start\", onStart)\n\t\t\t.on(\"end\", onEnd)\n\t\t\t.on(\"zoom\", onZoom);\n\n\t\tsvg.call(zoom); // add zoom functionality to \"svg\" group\n\n\t\t// d3.select(\"body\").on(\"keydown.grabzoom keyup.grabzoom\", (e) => svg.style('cursor', e.shiftKey ? 'move' : ''));\n\n\t},\n\n\t_initInteractions: function() {\n\t\tthis._initBrush();\n\t\tthis._initRuler();\n\t\tthis._initClipper();\n\t\tthis._initLegend();\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_initLegend: function() {\n\t\tthis._container.on('legend_clicked', (e) => {\n\t\t\tlet { path, legend, name, enabled } = e.detail;\n\n\t\t\tif (!path) return;\n\n\t\t\tlet label = _.select('text', legend);\n\t\t\tlet rect = _.select('rect', legend);\n\n\t\t\t_.toggleStyle(label, 'text-decoration-line', 'line-through', enabled);\n\t\t\t_.toggleStyle(rect, 'fill-opacity', '0', enabled);\n\t\t\t_.toggleClass(path, 'leaflet-hidden', enabled);\n\n\t\t\tthis._updateArea();\n\n\t\t\tthis.fire(\"elepath_toggle\", { path, name, legend, enabled })\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"ruler\".\n\t */\n\t_initRuler: function() {\n\t\tif (!this.options.ruler) return;\n\n\t\t// const yMax = this._height();\n\t\tconst formatNum = d3.format(\".0f\");\n\t\tconst drag = this._drag;\n\n\t\tconst label = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet y = this._ruler.data()[0].y;\n\t\t\tif (y >= yMax || y <= 0) this._ruler.select(\".horizontal-drag-label\").text('');\n\t\t\tthis._hideDiagramIndicator();\n\t\t};\n\n\t\tconst position = (e, d) => {\n\t\t\tlet yMax = this._height();\n\t\t\tlet yCoord = d3.pointers(e, this._area.node())[0][1];\n\t\t\tlet y = yCoord > 0 ? (yCoord < yMax ? yCoord : yMax) : 0;\n\t\t\tlet z = this._y.invert(y);\n\t\t\tlet data = L.extend(this._ruler.data()[0], { y: y });\n\n\t\t\tthis._ruler\n\t\t\t\t.data([data])\n\t\t\t\t.attr(\"transform\", d => \"translate(\" + d.x + \",\" + d.y + \")\")\n\t\t\t\t.classed('active', y < yMax);\n\n\t\t\tthis._container.select(\".horizontal-drag-label\")\n\t\t\t\t.text(formatNum(z) + \" \" + (this.options.imperial ? 'ft' : 'm'));\n\n\t\t\tthis.fire('ruler_filter', { coords: yCoord < yMax && yCoord > 0 ? this._findCoordsForY(yCoord) : [] });\n\t\t}\n\n\t\tdrag\n\t\t.on(\"start end\", label)\n\t\t.on(\"drag\", position);\n\n\t\tthis._ruler.call(drag);\n\n\t},\n\n\t/**\n\t * Initialize x and y scales\n\t */\n\t_initScale: function() {\n\t\tlet opts = this.options;\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'x',\n\t\t\tposition: 'bottom',\n\t\t\tattr : opts.xAttr,\n\t\t\tmin : opts.xAxisMin,\n\t\t\tmax : opts.xAxisMax,\n\t\t\tname : 'distance'\n\t\t});\n\n\t\tthis._registerAxisScale({\n\t\t\taxis : 'y',\n\t\t\tposition : 'left',\n\t\t\tattr : opts.yAttr,\n\t\t\tmin : opts.yAxisMin,\n\t\t\tmax : opts.yAxisMax,\n\t\t\tname : 'altitude'\n\t\t});\n\n\t\tthis._x = this._scales.distance;\n\t\tthis._y = this._scales.altitude;\n\t},\n\n\t_registerAreaPath: function(props) {\n\t\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 this._scales[props.name] === 'function') {\n\t\t\tprops.scale = this._scales[props.name]; // retrieve cached scale\n\t\t} else if (typeof scale !== 'function') {\n\t\t\tscale = L.extend({\n\t\t\t\tdata : this._data,\n\t\t\t\tforceBounds: opts.forceAxisBounds\n\t\t\t}, scale);\n\n\t\t\tscale.attr = scale.attr || props.name;\n\n\t\t\tlet domain = this._domains[props.name] = D3.Domain(props);\n\t\t\tlet range = this._ranges[props.name] = D3.Range(props);\n\t\t\tscale.range = scale.range || range(this._width(),this._height());\n\t\t\tscale.domain = scale.domain || domain(this._data);\n\n\t\t\tthis._props.scales[props.name] = scale;\n\n\t\t\tprops.scale = this._scales[props.name] = D3.Scale(scale);\n\t\t}\n\n\t\tif (!props.ticks) {\n\t\t\tif (props.axis == 'x') props.ticks = opts.xTicks;\n\t\t\telse if (props.axis == 'y') props.ticks = opts.yTicks;\n\t\t}\n\n\t\tthis._props.axes[props.name] = props;\n\n\t\treturn scale;\n\t},\n\n\t/**\n\t * Add a point of interest over the chart\n\t */\n\t_registerCheckPoint: function(point) {\n\t\tif (!this._data.length) return;\n\n\t\tlet item, x, y;\n\n\t\tif (point.latlng) {\n\t\t\titem = this._data[this._findIndexForLatLng(point.latlng)];\n\t\t\tx = this._x(item.dist);\n\t\t\ty = this._y(item.z);\n\t\t} else if (!isNaN(point.dist)) {\n\t\t\tx = this._x(point.dist);\n\t\t\titem = this._data[this._findIndexForXCoord(x)]\n\t\t\ty = this._y(item.z);\n\t\t} \n\n\t\tthis._point.call(D3.CheckPoint({\n\t\t\tpoint: point,\n\t\t\twidth: this._width(),\n\t\t\theight: this._height(),\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t}));\n\t},\n\n\t_registerTooltip: function(props) {\n\t\tthis._props.tooltipItems[props.name] = props;\n\t},\n\n\t_updateArea: function() {\n\t\tlet paths = this._paths;\n\t\t// Reset and update chart profiles\n\t\tthis._context.clearRect(0, 0, this._width(), this._height());\n\t\tfor (var i in paths) {\n\t\t\tif (!paths[i].classed('leaflet-hidden')) {\n\t\t\t\tthis._drawPath(i);\n\t\t\t}\n\t\t}\n\t},\n\n\t_updateAxis: function() {\n\n\t\tlet opts = this.options;\n\n\t\t// Reset chart axis.\n\t\tthis._grid.selectAll('g').remove();\n\t\tthis._axis.selectAll('g').remove();\n\n\t\tlet grids = this._props.grids;\n\t\tlet axes = this._props.axes;\n\t\tlet props, axis, grid;\n\n\t\tlet gridOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t\ttickFormat: \"\",\n\t\t};\n\t\tlet axesOpts = {\n\t\t\twidth : this._width(),\n\t\t\theight : this._height(),\n\t\t};\n\n\t\t// Render grids\n\t\tfor (let i in grids) {\n\t\t\tprops = L.extend({}, gridOpts, grids[i]);\n\t\t\tgrid = D3.Grid(props);\n\t\t\tthis._grid.call(grid);\n\t\t}\n\n\t\t// Render axis\n\t\tfor (let i in axes) {\n\t\t\tif (opts[i] === false || opts[i] === 'summary') continue;\n\t\t\tprops = L.extend({}, axesOpts, axes[i]);\n\t\t\taxis = D3.Axis(props);\n\t\t\tthis._axis.call(axis);\n\t\t}\n\n\t\t// Adjust axis scale positions\n\t\tthis._axis\n\t\t\t.selectAll('.y.axis.right')\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet axis = d3.select(n[i]);\n\t\t\t\tlet transform = axis.attr('transform');\n\t\t\t\tlet translate = transform.substring(transform.indexOf(\"(\") + 1, transform.indexOf(\")\")).split(\",\");\n\n\t\t\t\taxis.attr('transform', 'translate(' + (+translate[0] + (i * 40)) + ',' + translate[1] + ')')\n\n\t\t\t\tif (i > 0) {\n\t\t\t\t\taxis.select(':scope > path') .attr('opacity', 0.25);\n\t\t\t\t\taxis.selectAll(':scope > .tick line').attr('opacity', 0.75);\n\t\t\t\t}\n\n\t\t\t});\n\n\t},\n\n\t_updateClipper: function() {\n\t\tlet margin = this.options.margins;\n\n\t\tthis._zoom\n\t\t\t.scaleExtent([1, 10])\n\t\t\t.extent([\n\t\t\t\t[margin.left, 0],\n\t\t\t\t[this._width() - margin.right, this._height()]\n\t\t\t])\n\t\t\t.translateExtent([\n\t\t\t\t[margin.left, -Infinity],\n\t\t\t\t[this._width() - margin.right, Infinity]\n\t\t\t]);\n\n\t\t// Apply svg mask on multi-track segments (BETA)\n\t\tthis._mask.selectAll(\".gap\").remove()\n\t\tthis._maskGaps.forEach((d, i) => {\n\t\t\tif(i >= this._maskGaps.length - 2) return;\n\t\t\tlet d1 = this._data[this._maskGaps[i]];\n\t\t\tlet d2 = this._data[this._maskGaps[i + 1]];\n\t\t\tlet x1 = this._x(this._data[this._findIndexForLatLng(d1.latlng)].dist);\n\t\t\tlet x2 = this._x(this._data[this._findIndexForLatLng(d2.latlng)].dist);\n\t\t\tthis._mask\n\t\t\t\t.append(\"rect\")\n\t\t\t\t.attr(\"x\", x1)\n\t\t\t\t.attr(\"y\", 0)\n\t\t\t\t.attr(\"width\", x2 - x1 )\n\t\t\t\t.attr(\"height\", this._height())\n\t\t\t\t.attr('class', 'gap')\n\t\t\t\t.attr('fill-opacity', '0.8')\n\t\t\t\t.attr(\"fill\", 'black'); // black = hide\n\t\t});\n\t},\n\n\t_updateLegend: function () {\n\n\t\tif (this.options.legend === false) return;\n\n\t\tlet legends = this._props.legendItems;\n\t\tlet legend;\n\n\t\t// Reset legend items\n\t\tthis._legend.selectAll('g').remove();\n\t\tfor (var i in legends) {\n\t\t\tlegend = D3.LegendItem(\n\t\t\t\tL.extend({\n\t\t\t\t\twidth : this._width(),\n\t\t\t\t\theight : this._height(),\n\t\t\t\t\tmargins: this.options.margins,\n\t\t\t\t}, legends[i])\n\t\t\t)\n\t\t\tthis._legend.append(\"g\").call(legend);\n\t\t}\n\n\t\t// Get legend items\n\t\tlet items = this._legend.selectAll('.legend-item');\n\n\t\t// Calculate legend item positions\n\t\tlet n = items.nodes().length;\n\t\tlet v = Array(Math.floor(n / 2)).fill(null).map((d, i) => (i + 1) * 2 - (1 - Math.sign(n % 2)));\n\t\tlet rev = v.slice().reverse().map((d) => -(d));\n\n\t\tif (n % 2 !== 0) {\n\t\t\trev.push(0);\n\t\t}\n\t\tv = rev.concat(v);\n\n\t\t// Get chart margins\n\t\tlet xAxesB = this._axis.selectAll('.x.axis.bottom').nodes().length;\n\t\tlet marginB = 30 + (xAxesB * 2);\n\t\tlet marginR = n * 30;\n\n\t\t// Adjust chart right margins\n\t\tif (n && this.options.margins.right < marginR) {\n\t\t\tthis.options.margins.right = marginR;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\t// Adjust chart bottom margins\n\t\tif(xAxesB && this.options.margins.bottom < marginB) {\n\t\t\tthis.options.margins.bottom = marginB;\n\t\t\tthis.fire('margins_updated');\n\t\t}\n\n\t\titems\n\t\t\t.each((d, i, n) => {\n\n\t\t\t\tlet legend = d3.select(n[i]);\n\t\t\t\tlet rect = legend.select('rect');\n\t\t\t\tlet name = legend.attr('data-name');\n\t\t\t\tlet path = this._paths[name];\n\n\t\t\t\tlet tx = v[i] * 55;\n\t\t\t\tlet ty = xAxesB * 2;\n\n\t\t\t\tlegend\n\n\t\t\t\t// Adjust legend item positions\n\t\t\t\t.attr(\"transform\", \"translate(\" + tx + \", \" + ty + \")\");\n\n\t\t\t\t// Set initial state (disabled controls)\n\t\t\t\tif (name in this.options && this.options[name] == 'disabled') {\n\t\t\t\t\tpath.classed('leaflet-hidden', true);\n\t\t\t\t\tlegend.select('text').style('text-decoration-line', 'line-through');\n\t\t\t\t\tlegend.select('rect').style('fill-opacity', '0');\n\t\t\t\t}\n\n\t\t\t\t// Apply d3-zoom (bind <clipPath> mask)\n\t\t\t\tif (this._mask) {\n\t\t\t\t\tpath.attr('mask', 'url(#' + this._mask.attr('id') + ')');\n\t\t\t\t}\n\n\t\t\t});\n\t},\n\n\t_updateScale: function() {\n\t\tif (this.zooming) return { x: this._x, y: this._y };\n\n\t\tfor (let i in this._scales) {\n\t\t\tthis._scales[i]\n\t\t\t\t.domain(this._domains[i](this._data))\n\t\t\t\t.range(this._ranges[i](this._width(), this._height()))\n\t\t}\n\n\t\treturn { x: this._x, y: this._y };\n\t},\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\treturn this._chart._width;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\treturn this._chart._height;\n\t},\n\n\t/*\n\t * Finds data entries above a given y-elevation value and returns geo-coordinates\n\t */\n\t_findCoordsForY: function(y) {\n\t\tlet data = this._data;\n\t\tlet z = this._y.invert(y);\n\n\t\t// save indexes of elevation values above the horizontal line\n\t\tconst list = data.reduce((array, item, index) => {\n\t\t\tif (item.z >= z) array.push(index);\n\t\t\treturn array;\n\t\t}, []);\n\n\t\tlet start = 0;\n\t\tlet next;\n\n\t\t// split index list into blocks of coordinates\n\t\tconst coords = list.reduce((array, _, curr) => {\n\t\t\tnext = curr + 1;\n\t\t\tif (list[next] !== list[curr] + 1 || next === list.length) {\n\t\t\t\tarray.push(\n\t\t\t\t\tlist\n\t\t\t\t\t.slice(start, next)\n\t\t\t\t\t.map(i => data[i].latlng)\n\t\t\t\t);\n\t\t\t\tstart = next;\n\t\t\t}\n\t\t\treturn array;\n\t\t}, []);\n\n\t\treturn coords;\n\t},\n\n\t/*\n\t * Finds a data entry for a given x-coordinate of the diagram\n\t */\n\t_findIndexForXCoord: function(x) {\n\t\treturn d3\n\t\t\t.bisector(d => d[this.options.xAttr])\n\t\t\t.left(this._data || [0, 1], this._x.invert(x));\n\t},\n\n\t/*\n\t * Finds a data entry for a given latlng of the map\n\t */\n\t_findIndexForLatLng: function(latlng) {\n\t\tlet result = null;\n\t\tlet d = Infinity;\n\t\tthis._data.forEach((item, index) => {\n\t\t\tlet dist = latlng.distanceTo(item.latlng);\n\t\t\tif (dist < d) {\n\t\t\t\td = dist;\n\t\t\t\tresult = index;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tif (this._chart.panes.brush.select(\".selection\").attr('width')) {\n\t\t\tthis._chart.panes.brush.call(this._brush.clear);\n\t\t\tthis._hideDiagramIndicator();\n\t\t\tthis.fire('reset_drag');\n\t\t}\n\t},\n\n\t_resetZoom: function() {\n\t\tif (this._zoom) {\n\t\t\tthis._zoom.transform(this._chart.svg, d3.zoomIdentity);\n\t\t}\n\t},\n\n\t/**\n\t * Display distance and altitude level (\"focus-rect\").\n\t */\n\t_showDiagramIndicator: function(item, xCoordinate) {\n\t\tthis._tooltip\n\t\t\t.attr(\"display\", null)\n\t\t\t.call(D3.Tooltip({\n\t\t\t\txCoord: xCoordinate,\n\t\t\t\tyCoord: this._y(item[this.options.yAttr]),\n\t\t\t\theight: this._height(),\n\t\t\t\twidth : this._width(),\n\t\t\t\tlabels: this._props.tooltipItems,\n\t\t\t\titem: item\n\t\t\t}));\n\t},\n\n\t_hideDiagramIndicator: function() {\n\t\tthis._tooltip.attr(\"display\", 'none');\n\t},\n});\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Marker = L.Class.extend({\n\n\tinitialize: function(options) {\n\t\tthis.options = options;\n\n\t\tswitch(this.options.marker) {\n\t\t\tcase 'elevation-line':\n\t\t\t\t// this._container = d3.create(\"g\").attr(\"class\", \"height-focus-group\");\n\t\t\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","/*\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\n// Alias deprecated functions\n Elevation.addInitHook(function() {\n\tthis.enableDragging = this.enableBrush;\n\tthis.disableDragging = this.disableBrush;\n\tthis.loadChart = this.addTo;\n\tthis.loadData = this.load;\n\tthis.loadGPX = this.load;\n\tthis.loadGeoJSON = this.load;\n\tthis.loadXML = this.load;\n\tthis.loadFile = this.load;\n});\n\nL.control.elevation = (options) => new Elevation(options);\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport * as D3 from './components';\n\nexport var Summary = L.Class.extend({\n\tinitialize: function(opts, control) {\n\t\tthis.options = opts;\n\t\tthis.control = control;\n\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.8.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\n\t\tL.setOptions(this, options);\n\n\t\tif (this.options.followMarker) this._setMapView = L.Util.throttle(this._setMapView, 300, this);\n\t\tif (this.options.legend) this.options.margins.bottom += 30;\n\t\tif (this.options.theme) this.options.polylineSegments.className += ' ' + this.options.theme;\n\t\tif (this.options.wptIcons === true) this.options.wptIcons = Options.wptIcons;\n\t\tif (this.options.distanceMarkers === true) this.options.distanceMarkers = { lazy: true };\n\n\t\tthis._markedSegments.setStyle(this.options.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(D3.Colors, this.options.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\tlazyLoad: function(src, condition = false, loader = '') {\n\t\tif (!this.options.lazyLoadJS) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tswitch(src) {\n\t\t\tcase this.__D3:\n\t\t\t\tloader = '_d3LazyLoader';\n\t\t\t\tcondition = typeof d3 !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__TOGEOJSON:\n\t\t\t\tloader = '_togeojsonLazyLoader';\n\t\t\t\tcondition = typeof toGeoJSON !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__LGEOMUTIL:\n\t\t\t\tloader = '_geomutilLazyLoader';\n\t\t\t\tcondition = typeof L.GeometryUtil !== 'object';\n\t\t\tbreak;\n\t\t\tcase this.__LALMOSTOVER:\n\t\t\t\tloader = '_almostoverLazyLoader';\n\t\t\t\tcondition = typeof L.Handler.AlmostOver !== 'function';\n\t\t\tbreak;\n\t\t\tcase this.__LDISTANCEM:\n\t\t\t\tloader = '_distanceMarkersLazyLoader';\n\t\t\t\tcondition = typeof L.DistanceMarkers !== 'function';\n\t\t\tbreak;\n\t\t}\n\t\treturn L.Control.Elevation[loader] = _.lazyLoader(src, condition, L.Control.Elevation[loader]);\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON or KML).\n\t */\n\tload: function(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\t\t\n\t\tthis.lazyLoad(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tthis._initButton(container);\n\t\t\t\tthis._initChart(container);\n\t\t\t\tthis._initSummary(container);\n\t\t\t\tthis._initMarker(map);\n\t\t\t\tthis._initLayer(map);\n\n\t\t\t\tmap\n\t\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t\t_.on(document, 'keydown', this._keydownHandler, this);\n\n\t\t\t\tthis\n\t\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\t\tthis._updateChart();\n\t\t\t\tthis._updateSummary();\n\t\t\t});\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t_.off(document, 'keydown', this._keydownHandler, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level 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\t// Postpone adding the distance markers (lazy: true)\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\n\t\t\tlayer.on('add remove', (e) => L.DistanceMarkers && e.target instanceof L.Polyline && e.target[e.type + 'DistanceMarkers']());\n\t\t}\n\t},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t_bindPopup: function(marker) {\n\t\tlet popup = marker._popup;\n\t\tif (popup) {\n\t\t\tpopup.options.className = 'elevation-popup';\n\t\t\tif (popup._content) {\n\t\t\t\tpopup._content = decodeURI(popup._content);\n\t\t\t\tpopup.bindTooltip(popup._content, { direction: 'auto', sticky: true, opacity: 1, className: 'elevation-tooltip' }).openTooltip();\n\t\t\t}\n\t\t}\n\t},\n\n\t_initAlmostOverHandler: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tthis.lazyLoad(this.__LGEOMUTIL)\n\t\t\t.then(() => this.lazyLoad(this.__LALMOSTOVER))\n\t\t\t.then(() => {\n\t\t\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\t\t\tmap\n\t\t\t\t\t\t\t.on('almost:move', (e) => this._mousemoveLayerHandler(e))\n\t\t\t\t\t\t\t.on('almost:out', (e) => this._mouseoutHandler(e));\n\t\t\t\t\t}\n\t\t\t});\n\t},\n\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tthis.lazyLoad(this.__LGEOMUTIL)\n\t\t\t\t.then(() => this.lazyLoad(this.__LDISTANCEM))\n\t\t\t\t.then(() => this.options.polyline && layer.addTo(map));\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(ctx, layer) {\n\t\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\t\tlet theme = control.options.theme.replace('-theme', '');\n\t\t\t\t\tlet color = D3.Colors[theme] || {};\n\t\t\t\t\tlet options = layer.options;\n\n\t\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Partial fix for initial tooltip size\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\t */\n\t_fixTooltipSize: function() {\n\t\tthis.on('elechart_init', () =>\n\t\t\tthis.once('elechart_change elechart_hover', e => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(e.data, e.xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(e.data);\n\t\t\t})\n\t\t);\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tlet opts = this.options;\n\t\treturn opts.height - opts.margins.top - opts.margins.bottom;\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart DOM element.\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\topts.xTicks = this._xTicks();\n\t\topts.yTicks = this._yTicks();\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tlet chart = this._chart = new Chart(opts, this);\n\n\t\tthis._x = this._chart._x;\n\t\tthis._y = this._chart._y;\n\n\t\td3\n\t\t\t.select(container)\n\t\t\t.call(chart.render())\n\n\t\tchart\n\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t.on('mouse_enter', this._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\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tthis._summary = new Summary({ summary: this.options.summary }, this);\n\n\t\td3.select(container).call(this._summary.render());\n\t},\n\n\t_keydownHandler: function(e) {\n\t\tif(!this.options.detached && e.key === \"Escape\"){\n\t\t\tthis._collapse()\n\t\t};\n\t},\n\n\t/**\n\t * Retrieve data from a remote url (HTTP).\n\t */\n\t_loadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis._parseFromString(data)\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\n\t\t\t}).catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(geojson) {\n\t\tlet control = this;\n\n\t\tlet { wptIcons, wptLabels } = control.options;\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: control.options.distanceMarkers,\n\t\t\tstyle: (feature) => {\n\t\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\t\tif (control.options.theme) {\n\t\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t\t}\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (!control.options.waypoints) return;\n\n\t\t\t\tlet prop = feature.properties;\n\t\t\t\tlet desc = prop.desc ?? '';\n\t\t\t\tlet name = prop.name ?? '';\n\t\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\t\t\t\t\tcontrol._registerCheckPoint({\n\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\tlabel: ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\t\tmarker.bindPopup(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : '')).openPopup();\n\t\t\t\t\t}\n\t\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\t\tcontrol._bindPopup(marker);\n\t\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\t\treturn marker;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => {\n\t\t\t\tif (feature.geometry && feature.geometry.type == 'Point') return;\n\n\t\t\t\t// Standard GeoJSON --> doesn't handle \"time\"\n\t\t\t\t// control.addData(feature, layer); // NB make use of \"_addGeoJSONData\"\n\t\t\t\t\n\t\t\t\t// Extended GeoJSON --> rely on leaflet implementation\n\t\t\t\tlayer._latlngs.forEach((point, i) => {\n\t\t\t\t\t// same properties as L.GPX layer\n\t\t\t\t\tpoint.meta = { time: null, ele: null, hr: null, cad: null, atemp: null };\n\t\t\t\t\tif(\"alt\" in point) point.meta.ele = point.alt;\n\t\t\t\t\tif(feature.properties) {\n\t\t\t\t\t\tlet prop = feature.properties;\n\t\t\t\t\t\tif(\"coordTimes\" in prop) point.meta.time = new Date(Date.parse(prop.coordTimes[i]));\n\t\t\t\t\t\telse if(\"times\" in prop) point.meta.time = new Date(Date.parse(prop.times[i]));\n\t\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\t\tif(\"heartRates\" in prop) point.meta.hr = parseInt(prop.heartRates[i]);\n\t\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\t// TODO: cadence, temperature\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcontrol.addData(layer); // NB make use of \"_addGPXData\"\n\n\t\t\t\tcontrol.track_info = L.extend({}, control.track_info, { name: geojson.name });\n\t\t\t},\n\t\t});\n\n\t\tcontrol.lazyLoad(control.__D3).then(() => {\n\t\t\tlet map = control._map;\n\t\t\tif (map) {\n\t\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\t\tif (!L.Browser.mobile) {\n\t\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t\t} else if (control.options.polyline) {\n\t\t\t\t\tlayer.addTo(map);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t\t}\n\n\t\t\tcontrol._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: control.track_info.name, track_info: control.track_info })\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_dragendHandler: function(e) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([e.dragstart.latlng, e.dragend.latlng]));\n\n\t\tthis._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 * Simple GeoJSON Parser\n\t */\n\t_parseFromGeoJSONString: function(data) {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch (e) { }\n\t},\n\n\t/**\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\n\t */\n\t_parseFromString: function(data) {\n\t\treturn new Promise(resolve =>\n\t\t\tthis.lazyLoad(this.__TOGEOJSON).then(() => {\n\t\t\t\tlet geojson;\n\t\t\t\ttry {\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\n\t\t\t\t}\n\t\t\t\tif (geojson) {\n\t\t\t\t\tgeojson = this._prepareMultiLineStrings(geojson);\n\t\t\t\t\tgeojson = this._prepareAdditionalProperties(geojson);\n\t\t\t\t}\n\t\t\t\tresolve(geojson);\n\t\t\t})\n\t\t);\n\t},\n\n\t/**\n\t * Simple XML Parser (GPX, KML, TCX)\n\t */\n\t_parseFromXMLString: function(data) {\n\t\tif (data.indexOf(\"<\") != 0) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\tlet name = xml.getElementsByTagName('name');\n\t\tif (xml.getElementsByTagName('parsererror').length) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tif (!(type in toGeoJSON)) {\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t}\n\t\tlet geojson = toGeoJSON[type](xml);\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Extend GeoJSON properties (name, time, ...)\n\t */\n\t _prepareAdditionalProperties: function(geojson){\n\t\tif (!geojson.name && this._downloadURL) {\n\t\t\tgeojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0];\n\t\t}\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Just a temporary fix for MultiLineString data (trk > trkseg + trkseg),\n\t * just split them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/56\n\t */\n\t_prepareMultiLineStrings: function(geojson) {\n\t\tgeojson.features.forEach(feauture => {\n\t\t\tif (feauture.geometry.type == \"MultiLineString\") {\n\t\t\t\tfeauture.geometry.coordinates.forEach(coords => {\n\t\t\t\t\tgeojson.features.push({\n\t\t\t\t\t\tgeometry: { type: 'LineString', coordinates: coords },\n\t\t\t\t\t\tproperties: feauture.properties,\n\t\t\t\t\t\ttype: 'Feature'\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} \n\t\t});\n\t\treturn geojson.features.filter(feauture => feauture.geometry.type != \"MultiLineString\");\n\t},\n\n\t/**\n\t * Add a point of interest over the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\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._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (e.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: e }));\n\t\t\t\t} else if (e.downloadLink == 'link' || e.downloadLink === true) {\n\t\t\t\t\te.confirm();\n\t\t\t\t}\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});","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":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","MIN","SEC","HOUR","DAY","formatTime","t","d","Math","floor","h","m","s","round","toString","padStart","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","lazyLoader","url","skip","loader","Promise","resolve","reject","tag","createElement","addEventListener","once","src","head","drawCanvas","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","stroke","fill","closePath","clamp","val","range","addClass","targetNode","className","split","every","DomUtil","removeClass","toggleClass","conditional","call","replaceClass","removeClassName","addClassName","name","value","getStyle","setProperty","toggleStyle","toggleEvent","leafletElement","eventName","handler","tagName","attributes","parent","elem","setAttributes","append","child","insert","position","insertAdjacentElement","attrs","k","setAttribute","select","selector","context","querySelector","on","DomEvent","off","hasClass","randomId","random","substr","each","obj","fn","i","Colors","area","alpha","line","Area","width","height","xAttr","yAttr","scaleX","scaleY","interpolation","d3","curve","x","xDiagCoord","y0","y1","Path","color","strokeColor","strokeOpacity","fillOpacity","Axis","type","tickSize","tickPadding","axis","scale","ticks","tickFormat","label","labelX","labelY","onAxisMount","g","w","axisScale","replace","l","toUpperCase","axisGroup","join","text","Grid","props","PositionMarker","theme","xCoord","yCoord","labels","item","length","circle","node","isNaN","size","selectAll","LegendItem","margins","toLowerCase","ownerSVGElement","dispatch","detail","legend","enabled","bottom","Tooltip","box","rect","xAlign","yAlign","bbox","getBBox","e","max","Browser","webkit","Infinity","Ruler","y","symbol","symbolTriangle","exit","remove","enter","merge","angle","CheckPoint","point","property","datum","pos","y2","x2","Domain","min","forceBounds","domain","extent","Range","Scale","scaleLinear","Chart","_width","ruler","left","right","_height","top","svg","panes","grid","brush","tooltip","mask","maskRect","foreignObject","canvas","getContext","brushX","utils","chart","opts","test","navigator","platform","userAgent","_resize","bisector","invert","Class","includes","Evented","prototype","Mixin","Events","initialize","control","options","_data","_props","scales","paths","areas","grids","axes","legendItems","tooltipItems","_scales","_domains","_ranges","_paths","_brushEnabled","dragging","_zoomEnabled","zooming","this","_chart","D3","_container","_grid","pane","_area","_point","_axis","_legend","_tooltip","_ruler","_initScale","_mask","get","_context","_brush","_zoom","zoom","_drag","drag","_initInteractions","_maskGaps","_this","push","index","update","_updateScale","_updateArea","_updateAxis","_updateLegend","_updateClipper","render","container","_this2","clear","_resetDrag","_hideDiagramIndicator","clearRect","_drawPath","preferCanvas","_hasActiveLayers","_initBrush","focus","_this3","sourceEvent","pointers","_findIndexForXCoord","fire","filter","shiftKey","button","selection","start","end","dragstart","dragend","bind","_initClipper","margin","scaleExtent","translateExtent","_this4","buttons","transform","distance","_x","rescaleX","time","_initRuler","_initLegend","_this5","formatNum","format","yMax","_this6","z","_y","imperial","coords","_findCoordsForY","_registerAxisScale","xAxisMin","xAxisMax","yAxisMin","yAxisMax","altitude","_registerAreaPath","_registerAxisGrid","forceAxisBounds","xTicks","yTicks","_registerCheckPoint","latlng","_findIndexForLatLng","dist","_registerTooltip","gridOpts","axesOpts","n","translate","substring","indexOf","forEach","_this7","d1","d2","x1","legends","items","nodes","v","Array","map","sign","rev","slice","reverse","concat","xAxesB","marginB","marginR","_this8","tx","ty","next","list","reduce","array","curr","_this9","result","distanceTo","_resetZoom","zoomIdentity","_showDiagramIndicator","xCoordinate","proto","Marker","marker","getPane","_marker","icon","markerIcon","zIndexOffset","interactive","_labels","addTo","_map","_latlng","latLngToLayerPoint","_rotate","rotatedPointToMapPanePoint","maxElevation","getElement","setLatLng","getLatLng","Summary","summary","reset","innerHTML","_registerSummary","track_info","Options","autofitBounds","autohide","mobile","autohideMarker","almostover","collapsed","detached","distanceMarkers","decimalsX","decimalsY","downloadLink","elevationDiv","followMarker","lazyLoadJS","divIcon","html","iconSize","iconAnchor","polyline","opacity","weight","lineCap","polylineSegments","reverseCoords","skipNullZCoords","slope","speed","sLimit","undefined","timeFactor","timeFormat","timestamps","sDeltaMax","sInterpolation","sRange","waypoints","wptIcons","wptLabels","xLabel","yLabel","zFollow","Mobile","Elevation","Control","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","addData","layer","lazyLoad","then","_addData","_addLayer","_fireEvt","eleDiv","_initElevationDiv","isConnected","getContainer","onAdd","_clearChart","_layers","_clearLayers","_markers","_clearMarkers","_updateChart","_events","elechart_updated","eachLayer","clearLayers","disableBrush","enableBrush","disableZoom","enableZoom","fitBounds","bounds","getBounds","isValid","latLngBounds","getZFollow","hide","featureGroup","_markedSegments","_chartEnabled","setOptions","_setMapView","throttle","lazy","setStyle","colors","_fixCanvasPaths","_fixTooltipSize","condition","toGeoJSON","_typeof","GeometryUtil","Handler","AlmostOver","DistanceMarkers","load","_parseFromString","geojson","_loadLayer","_loadFile","_initButton","_initChart","_initSummary","_initMarker","_initLayer","_hideMarker","_resetView","_resizeChart","_rotateMarker","_keydownHandler","_updateSummary","onRemove","redraw","setZFollow","show","geom","geometry","_addGeoJSONData","coordinates","console","warn","features","feature","_latlngs","_addGPXData","_addPoint","lat","lng","alt","meta","ele","latLng","addLayer","Polyline","_addMarker","_bindPopup","popup","_popup","_content","decodeURI","bindTooltip","direction","sticky","openTooltip","_initAlmostOverHandler","almostOver","addHandler","_mousemoveLayerHandler","_mouseoutHandler","_initDistanceMarkers","id","_collapse","_expand","oldProto","Canvas","_fillStroke","include","hasLayer","oldVal","outline","_this10","_updateMarker","_findItemForLatLng","_findItemForX","propagate","_xTicks","_yTicks","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","_dragendHandler","_mousemoveHandler","_rulerFilterHandler","_toggleChartHandler","_this11","_pane","createPane","zIndex","pointerEvents","_renderer","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","key","fetch","response","_this12","_downloadURL","catch","geoJson","pointToLayer","prop","properties","desc","sym","hasOwnProperty","bindPopup","openPopup","element","onEachFeature","hr","cad","atemp","Date","parse","coordTimes","times","parseInt","heartRates","heartRate","_parseFromGeoJSONString","JSON","_this13","_parseFromXMLString","trim","_prepareMultiLineStrings","_prepareAdditionalProperties","xml","DOMParser","parseFromString","documentElement","getElementsByTagName","from","find","parentElement","textContent","pop","feauture","_this14","_this15","_this16","_this17","_this18","_this19","_isFullscreen","newWidth","_updateMapSegments","getZoom","setView","animate","duration","contains","_this20","elevation_max","setLatLngs","onclick","preventDefault","CustomEvent","dispatchEvent","confirm","_this21","__xTicks","__yTicks","addInitHook","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","enableDragging","disableDragging","loadChart","loadData","loadGPX","loadGeoJSON","loadXML","loadFile","elevation"],"mappings":"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"}
|