@raruto/leaflet-elevation 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/leaflet-elevation.css +2 -1
- package/dist/leaflet-elevation.js +3 -3
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.css +1 -1
- package/dist/leaflet-elevation.min.js +1 -1
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/package.json +1 -1
- package/src/{chart.js → components/chart.js} +1 -1
- package/src/{components.js → components/d3.js} +0 -0
- package/src/{marker.js → components/marker.js} +1 -1
- package/src/{summary.js → components/summary.js} +0 -0
- package/src/control.js +3 -3
- package/src/index.css +2 -1
- package/src/handlers/acceleration.min.js +0 -1
- package/src/handlers/altitude.min.js +0 -1
- package/src/handlers/distance.min.js +0 -1
- package/src/handlers/slope.min.js +0 -1
- package/src/handlers/speed.min.js +0 -1
- package/src/handlers/time.min.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","/**\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\n **/\nexport const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\n */\n export function formatDate(format) {\n\tif (!format) {\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (format == 'time') {\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (format == 'date') {\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\n\t}\n\treturn (time) => format(time);\n}\n\n/**\n * Generate download data event.\n */\n export function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n\n/**\n * Convert SVG Path into Path2D and then update canvas\n */\n export function drawCanvas(ctx, path) {\n\tpath.classed('canvas-path', true);\n\n\tctx.beginPath();\n\tctx.moveTo(0, 0);\n\tlet p = new Path2D(path.attr('d'));\n\n\tctx.strokeStyle = path.attr('stroke');\n\tctx.fillStyle = path.attr('fill');\n\tctx.lineWidth = 1.25;\n\tctx.globalCompositeOperation = 'source-over';\n\n\t// stroke opacity\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\tctx.stroke(p);\n\n\t// fill opacity\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\tctx.fill(p);\n\n\tctx.globalAlpha = 1;\n\n\tctx.closePath();\n}\n\n/**\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\n */\nexport function coordPropsToMeta(coordProps, name, parser) {\n\treturn coordProps && (({props, point, id}) => {\n\t\tif (props) {\n\t\t\tfor (const key of coordProps) {\n\t\t\t\tif (key in props) {\n\t\t\t\t\tpoint.meta[name] = (parser || parseInt).call(this, props[key], id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Extract numeric property (id) from GeoJSON object\n */\nexport const parseInt = (property, id) => window.parseInt((typeof property === 'object' ? property[id] : property));\n\n/**\n * Extract datetime property (id) from GeoJSON object\n */\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\n\n/**\n * A little bit shorter than L.DomUtil\n */\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\nexport const create = (tag, str, attrs, n) => { let elem = L.DomUtil.create(tag, str || \"\"); if (attrs) setAttributes(elem, attrs); if (n) append(n, elem); return elem; };\nexport const append = (n, c) => n.appendChild(c);\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\nexport const select = (str, n) => (n || document).querySelector(str);\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\n\n/**\n * TODO: use generators instead? (ie. \"yield\")\n */\nexport const iMax = (iVal, max) => (iVal > max ? iVal : max) || -Infinity; \nexport const iMin = (iVal, min) => (iVal < min ? iVal : min) || +Infinity;\nexport const iAvg = (iVal, avg) => (iVal + (avg || 0)) / 2.0;\nexport const iSum = (iVal, sum) => iVal + (sum || 0);\n\n/**\n * Alias for some leaflet core functions\n */\nexport const { on, off } = L.DomEvent;\nexport const { throttle } = L.Util;\nexport const { hasClass } = L.DomUtil;\n\n/**\n * Limit floating point precision\n */\nexport const round = L.Util.formatNum;\n\n/**\n * Limit a number between min / max values\n */\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\n\n/**\n * Limit a delta difference between two values\n */\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [],\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\ttheme: \"lightblue-theme\",\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: L.circleMarker([0,0], { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false }),\n\ttrkEnd: L.circleMarker([0,0], { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false }),\n\twaypoints: true,\n\twptIcons: {\n\t\t'': L.divIcon({\n\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\n\t\t\ticonSize: [30, 30],\n\t\t\ticonAnchor: [8, 30],\n\t\t}),\n\t},\n\twptLabels: true,\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\tyAttr: \"z\",\n\tyLabel: \"m\",\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n\n\t// Quite uncommon and undocumented options (quite useless)\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tskipNullZCoords: false,\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Probably no longer functional as expected (internally overwritten)\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: 200,\n\twidth: 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\n\t__modulesFolder: '../src/handlers/',\n\t__LCHART: '../src/chart.js',\n\t__LMARKER: '../src/marker.js',\n\t__LSUMMARY: '../src/summary.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.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\t\t\tlayer = d;\n\t\t\t\t}\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers(this._layers);\n\t\tif (this._markers) this._clearLayers(this._markers);\n\t\tif (this._circleMarkers) this._clearLayers(this._circleMarkers);\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\n\t\tthis._updateChart();\n\t},\n\n\t_clearChart: function() {\n\t\tif (this._events && this._events.elechart_updated) {\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\n\t\t}\n\t\tif (this._chart && this._chart._container) {\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\n\t\t\tthis._chart.clear();\n\t\t}\n\t},\n\n\t_clearLayers: function(l) {\n\t\tl = l || this._layers;\n\t\tif (l && l.eachLayer) {\n\t\t\tl.eachLayer(f => f.remove())\n\t\t\tl.clearLayers();\n\t\t}\n\t},\n\n\t/**\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\n\t * \n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\n\t */\n\t// addHandler: function (name, HandlerClass) {\n\t// \tif (HandlerClass) {\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\n\t// \t\tthis.handlers.push(handler);\n\t// \t\tif (this.options[name]) {\n\t// \t\t\thandler.enable();\n\t// \t\t}\n\t// \t}\n\t// \treturn this;\n\t// },\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom: function() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(data) {\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level (followMarker: true).\n\t */\n\tgetZFollow: function() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize: function(opts) {\n\n\t\topts = L.setOptions(this, opts);\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = (opts.trkStart || Options.trkStart);\n\t\tthis._end = (opts.trkEnd || Options.trkEnd);\n\t\tthis._chartEnabled = true;\n\t\tthis._yCoordMax = -Infinity;\n\t\tthis.track_info = {};\n\t\t// this.handlers = [];\n\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\n\t\tif (opts.legend) opts.margins.bottom += 30;\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\n\n\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(_.Colors, opts.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\timport: function(src, condition) {\n\t\tswitch(src) {\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\n\t\t}\n\t\treturn condition !== false ? import(src) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\n\t\tlet modules = [\n\t\t\t\"Distance\",\n\t\t\t\"Time\",\n\t\t\t\"Altitude\",\n\t\t\t\"Slope\",\n\t\t\t\"Speed\",\n\t\t\t\"Acceleration\",\n\t\t\t...this.options.handlers\n\t\t].filter(m => false !== this.options[typeof m == \"string\" && m.toLowerCase()]);\n\n\t\tthis._loadModules(modules);\t// Inject here required modules (data handlers)\n\t\tthis._initButton(container);\n\t\tthis._initChart(container);\n\t\tthis._initSummary(container);\n\t\tthis._initMarker(map);\n\t\tthis._initLayer(map);\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Standard GeoJSON --> doesn't handle \"time\", \"heart\", …\n\t\t */\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\t/**\n\t\t * Extended GeoJSON --> rely on leaflet implementation\n\t\t */\n\t\tif (d._latlngs) {\n\t\t\tthis._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\n\t\t}\n\t},\n\n\t/*\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\n\t */\n\t_addGeoJSONData: function(coords, properties) {\n\t\tcoords.forEach((point, i) => {\n\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\n\t\t\t\n\t\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\t\tlet props = (properties && properties.coordinateProperties) || properties;\n\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\n\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i });\n\n\t\t\tthis._addPoint(\n\t\t\t\tpoint.lat ?? point[1], \n\t\t\t\tpoint.lng ?? point[0],\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\n\t\t\t);\n\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\n\t\t});\n\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parse and push a single (x, y, z) point to current elevation profile.\n\t */\n\t_addPoint: function(x, y, z) {\n\t\tif (this.options.reverseCoords) {\n\t\t\t[x, y] = [y, x];\n\t\t}\n\n\t\tthis._data.push({\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tz: z,\n\t\t\tlatlng: L.latLng(x, y, z)\n\t\t});\n\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\n\t},\n\n\t_addLayer: function(layer) {\n\t\tif (layer) this._layers.addLayer(layer)\n\t\t// Postpone adding the distance markers (lazy: true)\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\n\t\t}\n\t},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" integration\n\t */\n\t_initAlmostOverHandler: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tPromise.all([\n\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\tthis.import(this.__LALMOSTOVER)\n\t\t]).then(() => {\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\tmap\n\t\t\t\t\t.on('almost:move', (e) => this._onMouseMoveLayer(e))\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tPromise.all([\n\t\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\t\tthis.import(this.__LDISTANCEM)\n\t\t\t]).then(() => this.options.polyline && layer.addTo(map) && this._circleMarkers.bringToFront());\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._data.length) {\n\t\t\tcontrol._start.setLatLng(control._data[0].latlng);\n\t\t\tcontrol._end.setLatLng(control._data[control._data.length -1].latlng);\n\t\t}\n\t\tif (map) {\n\t\t\tcontrol._circleMarkers.addTo(map);\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(ctx, layer) {\n\t\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\t\tlet options = layer.options;\n\n\t\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Partial fix for initial tooltip size\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\t */\n\t_fixTooltipSize: function() {\n\t\tthis.on('elechart_init', () =>\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(data);\n\t\t\t})\n\t\t);\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart (DOM element).\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LCHART)\n\t\t]).then((m) => {\n\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\td3\n\t\t\t\t.select(container)\n\t\t\t\t.call(chart.render())\n\t\n\t\t\tchart\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\n\t\t\t\t.on('dragged', this._onDragEnd, this)\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\n\t\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\n\t\n\t\n\t\t\tthis.fire(\"elechart_axis\");\n\t\n\t\t\tif (this.options.legend) this.fire(\"elechart_legend\");\n\t\n\t\t\tthis.fire(\"elechart_init\");\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker: function(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LMARKER)\n\t\t]).then((m) => {\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\n\t\t\tthis.fire(\"elechart_marker\");\n\t\t});\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\n\n\t\t\tthis.on('elechart_init', () => {\n\t\t\t\td3.select(container).call(this._summary.render());\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Retrieve data from a remote url (HTTP).\n\t */\n\t_loadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis._parseFromString(data)\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\n\t\t\t}).catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Dynamically import only required javascript modules (code splitting)\n\t */\n\t_loadModules: function(handlers) {\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof L.Control.Elevation[h] !== \"undefined\" ? L.Control.Elevation[h] : h);\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\n\t\tPromise.\n\t\t\tall(\n\t\t\t\thandlers\n\t\t\t\t\t.filter(h => typeof h === 'string' || h instanceof Promise)\n\t\t\t\t\t.map(file => file instanceof Promise ? file : this.import(this.__modulesFolder + file.toLowerCase() + '.js'))\n\t\t\t)\n\t\t\t.then((m) => {\n\t\t\t\t_.each(m, (exported) => {\n\t\t\t\t\tlet fn = Object.keys(exported)[0];\n\t\t\t\t\tif (fn && typeof L.Control.Elevation[fn] === \"undefined\" ) {\n\t\t\t\t\t\thandlers[fn] = L.Control.Elevation[fn] = exported[fn];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_.each(handlers, h => this._registerHandler(h));\n\t\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(geojson) {\n\t\tlet control = this;\n\n\t\tlet { wptIcons, wptLabels } = control.options;\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: control.options.distanceMarkers,\n\t\t\tstyle: (feature) => {\n\t\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\t\tif (control.options.theme) {\n\t\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t\t}\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (!control.options.waypoints) return;\n\n\t\t\t\tlet prop = feature.properties;\n\t\t\t\tlet desc = prop.desc ?? '';\n\t\t\t\tlet name = prop.name ?? '';\n\t\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\t\t\t\t\tcontrol._registerCheckPoint({\n\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\tlabel: ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\t\tlet content = decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''));\n\t\t\t\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\n\t\t\t\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\n\t\t\t\t\t}\n\t\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\t\treturn marker;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => {\n\t\t\t\tif (feature.geometry && feature.geometry.type != 'Point') {\n\t\t\t\t\tcontrol.addData(layer);\n\t\t\t\t\tcontrol.track_info = L.extend({}, control.track_info, { name: geojson.name });\n\t\t\t\t} \n\t\t\t},\n\t\t});\n\n\t\tcontrol.import(control.__D3).then(() => {\n\t\t\tcontrol._initMapIntegrations(control, layer);\n\t\t\tcontrol._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: control.track_info.name, track_info: control.track_info });\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_onDragEnd: function({ dragstart, dragend}) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\n\n\t\tthis.fire(\"elechart_dragged\");\n\t},\n\n\t_onKeyDown: function({key}) {\n\t\tif(!this.options.detached && key === \"Escape\"){\n\t\t\tthis._collapse()\n\t\t};\n\t},\n\n\t/**\n\t * Trigger mouseenter event.\n\t */\n\t_onMouseEnter: function() {\n\t\tthis.fire('elechart_enter');\n\t},\n\n\t/*\n\t * Handles the moueseover the chart and displays distance and altitude level.\n\t */\n\t_onMouseMove: function({xCoord}) {\n\t\tif (this._chartEnabled && this._data.length) {\n\t\t\tlet item = this._findItemForX(xCoord);\n\t\t\tif (item) {\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\t\tthis._updateMarker(item);\n\t\t\t\tthis._setMapView(item);\n\n\t\t\t\tif (this._map) {\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t\t}\n\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_onMouseMoveLayer: function({latlng}) {\n\t\tif (this._data.length) {\n\t\t\tlet item = this._findItemForLatLng(latlng);\n\t\t\tif (item) {\n\t\t\t\tlet xCoord = item.xDiagCoord;\n\t\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\t\n\t\t\t\tthis._updateMarker(item);\n\t\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_onMouseOut: function() {\n\t\tif (!this.options.detached) {\n\t\t\tthis._hideMarker();\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t}\n\n\t\tif (this._map) {\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\n\t\t}\n\n\t\tthis.fire(\"elechart_leave\");\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_onRulerFilter: function({coords}) {\n\t\tthis._updateMapSegments(coords);\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_onToggleChart: function({ name, enabled }) {\n\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\n\n\t\t// toggle layer visibility on empty chart\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\n\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\n\n\t\t// remove marker on empty chart\n\t\tif (!this._chartEnabled) {\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Simple GeoJSON Parser\n\t */\n\t_parseFromGeoJSONString: function(data) {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch (e) { }\n\t},\n\n\t/**\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\n\t */\n\t_parseFromString: function(data) {\n\t\treturn new Promise(resolve =>\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\n\t\t\t\tlet geojson;\n\t\t\t\ttry {\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\n\t\t\t\t}\n\t\t\t\tif (geojson) {\n\t\t\t\t\tgeojson = this._prepareMultiLineStrings(geojson);\n\t\t\t\t\tgeojson = this._prepareAdditionalProperties(geojson);\n\t\t\t\t}\n\t\t\t\tresolve(geojson);\n\t\t\t})\n\t\t);\n\t},\n\n\t/**\n\t * Simple XML Parser (GPX, KML, TCX)\n\t */\n\t_parseFromXMLString: function(data) {\n\t\tif (data.indexOf(\"<\") != 0) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\tlet name = xml.getElementsByTagName('name');\n\t\tif (xml.getElementsByTagName('parsererror').length) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tif (!(type in toGeoJSON)) {\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t}\n\t\tlet geojson = toGeoJSON[type](xml);\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Extend GeoJSON properties (name, time, ...)\n\t */\n\t _prepareAdditionalProperties: function(geojson) {\n\t\tif (!geojson.name && this._downloadURL) {\n\t\t\tgeojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0];\n\t\t}\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Just a temporary fix for MultiLineString data (trk > trkseg + trkseg),\n\t * just split them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/56\n\t */\n\t_prepareMultiLineStrings: function(geojson) {\n\t\tgeojson.features.forEach(feauture => {\n\t\t\tif (feauture.geometry.type == \"MultiLineString\") {\n\t\t\t\tfeauture.geometry.coordinates.forEach(coords => {\n\t\t\t\t\tgeojson.features.push({\n\t\t\t\t\t\tgeometry: { type: 'LineString', coordinates: coords },\n\t\t\t\t\t\tproperties: feauture.properties,\n\t\t\t\t\t\ttype: 'Feature'\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} \n\t\t});\n\t\treturn geojson.features.filter(feauture => feauture.geometry.type != \"MultiLineString\");\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath: function(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add a point of interest over the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute: function(props) {\n\n\t\t// parse of \"coordinateProperties\" for later usage\n\t\tif (props.coordPropsToMeta) {\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\n\t\t}\n\n\t\t// prevent excessive variabile instanstations\n\t\tlet i, curr, prev, attr;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \n\n\t\t// iteration\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\n\t\t\ti = index;\n\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\n\t\t\tcurr = this._data[i];\n\t\t\tattr = props.attr || props.name;\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (props.skipNull === false) {\n\t\t\t\tlet curr = this._data[i][attr];\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\n\t\t\t\t\tif (isNaN(prev)) {\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\n\t\t\t\t\t\t\tprev = lastValid;\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\n\t\t\t\t\t\t\tprev = curr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// update reference to last used point (ie. if it has data)\n\t\t\t\tif (!isNaN(curr)) {\n\t\t\t\t\tlastValid = curr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\n\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\n\t\t\tif (props.stats) {\n\t\t\t\tfor (const key in props.stats) {\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Limit \"crazy\" delta values.\n\t\t\tif (props.deltaMax) {\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\n\t\t\t}\n\t\t\t\n\t\t\t// Range of acceptable values.\n\t\t\tif (props.clampRange) {\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\n\t\t\t}\n\n\t\t\t// Limit floating point precision.\n\t\t\tif (!isNaN(props.decimals)) {\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\n\t\t\t}\n\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\n\t\t\tif(props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\n\t\t});\n\t},\n\n\t/**\n\t * Parse a module definition and attach related function listeners\n\t */\n\t_registerHandler: function(props) {\n\n\t\t// eg. L.Control.Altitude\n\t\tif (typeof props === \"function\") {\n\t\t\treturn this._registerHandler(props.call(this));\n\t\t}\n\n\t\t// eg. \"altitude\" == true\n\t\tif (this.options[props.name] || props.required) {\n\n\t\t\tthis._registerDataAttribute({\n\t\t\t\tname: props.name,\n\t\t\t\tattr: props.attr,\n\t\t\t\tskipNull: props.skipNull,\n\t\t\t\tdeltaMax: props.deltaMax,\n\t\t\t\tclampRange: props.clampRange,\n\t\t\t\tdecimals: props.decimals,\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(props.coordinateProperties, props.meta || props.name, props.coordPropsToMeta),\n\t\t\t\tpointToAttr: props.pointToAttr,\n\t\t\t\tonPointAdded: props.onPointAdded,\n\t\t\t\tstats: props.stats,\n\t\t\t\tstatsName: props.statsName,\n\t\t\t});\n\n\t\t\tif (props.grid) {\n\t\t\t\tprops.grid.name = props.grid.name || props.name;\n\t\t\t\tthis._registerAxisGrid(props.grid);\n\t\t\t}\n\n\t\t\tif (this.options[props.name] !== \"summary\") {\n\t\t\t\tif (props.scale) {\n\t\t\t\t\tprops.scale.name = props.scale.name || props.name;\n\t\t\t\t\tprops.scale.label = props.scale.label || props.unit;\n\t\t\t\t\tthis._registerAxisScale(props.scale);\n\t\t\t\t}\n\t\t\t\tif (props.path) {\n\t\t\t\t\tprops.path.name = props.path.name || props.name;\n\t\t\t\t\tthis._registerAreaPath(props.path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.tooltips) {\n\t\t\t\t_.each(props.tooltips, t => {\n\t\t\t\t\tif (t) {\n\t\t\t\t\t\tt.name = t.name || props.name;\n\t\t\t\t\t\tthis._registerTooltip(t)\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (props.tooltip) {\n\t\t\t\tprops.tooltip.name = props.tooltip.name || props.name;\n\t\t\t\tthis._registerTooltip(props.tooltip)\n\t\t\t}\n\n\t\t\tif (props.summary) {\n\t\t\t\tfor (const key in props.summary) {\n\t\t\t\t\tprops.summary[key].unit = props.summary[key].unit || props.unit;\n\t\t\t\t}\n\t\t\t\tthis._registerSummary(props.summary);\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerTooltip: function(props) {\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary: function(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView: function() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart: function() {\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\n\t\t\tlet opts = this.options;\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\n\t\t\tif (newWidth) {\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (this._chart && this._chart._chart) {\n\t\t\t\t\tthis._chart._chart._resize(opts);\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._updateMapSegments();\n\t\t}\n\t},\n\n\t/**\n\t * Collapse or Expand chart control.\n\t */\n\t_toggle: function() {\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\n\t},\n\n\t/**\n\t * Update map center and zoom (followMarker: true)\n\t */\n\t_setMapView: function(item) {\n\t\tif (this._map && this.options.followMarker) {\n\t\t\tlet zoom = this._map.getZoom();\n\t\t\tlet z = this.options.zFollow;\n\t\t\tif (typeof z === \"number\") {\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (this._chart && this._container) {\n\t\t\tthis.fire(\"elechart_axis\");\n\t\t\tthis.fire(\"elechart_area\");\n\t\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\tthis.fire('elechart_updated');\t\t\n\t\t}\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker: function(item) {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update({\n\t\t\t\tmap : this._map,\n\t\t\t\titem : item,\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\n\t\t\t\toptions : this.options\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker: function() {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update();\n\t\t}\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments: function(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary: function() {\n\t\tif (!this._summary) return;\n\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis.fire(\"elechart_summary\");\n\t\t\tthis._summary.update();\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = ({preventDefault}) => {\n\t\t\t\tpreventDefault();\n\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\tevent.confirm();\n\t\t\t\t}\n\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tconst { width, margins } = this.options;\n\t\treturn width - margins.left - margins.right;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tconst { height, margins } = this.options;\n\t\treturn height - margins.top - margins.bottom;\n\t},\n\n});","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Elevation } from './control';\n\nElevation.Utils = _;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","key","meta","parseInt","call","this","property","addClass","n","str","split","every","s","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","toString","substr","on","off","DomEvent","throttle","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","sum","Options","autofitBounds","autohide","Browser","mobile","autohideMarker","almostover","altitude","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","circleMarker","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","undefined","yAxisMin","margins","top","right","bottom","left","height","width","xTicks","yTicks","Elevation","Control","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","__modulesFolder","__LCHART","__LMARKER","__LSUMMARY","addData","layer","import","then","_addData","_addLayer","_fireEvt","track_info","addTo","map","eleDiv","_initElevationDiv","isConnected","_.insert","getContainer","_.append","onAdd","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","src","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","modules","filter","toLowerCase","_loadModules","_initButton","_initChart","_initSummary","_initMarker","_initLayer","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","geom","geometry","type","_addGeoJSONData","coordinates","_.each","coords","console","warn","features","feature","_latlngs","properties","ele","coordinateProperties","fire","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","bringToFront","_.select","_.randomId","_.replaceClass","_initMapIntegrations","control","setLatLng","once","_collapse","_expand","oldProto","Canvas","_fillStroke","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","_renderer","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","Summary","url","fetch","response","text","_downloadURL","catch","file","exported","Object","keys","_registerHandler","geoJson","pointToLayer","prop","desc","sym","_registerCheckPoint","label","hasOwnProperty","icon","content","decodeURI","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","element","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","_prepareMultiLineStrings","_prepareAdditionalProperties","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","parentElement","textContent","pop","feauture","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","_.coordPropsToMeta","grid","scale","unit","tooltips","_registerTooltip","tooltip","_registerSummary","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","innerHTML","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","proto","elevation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../node_modules/leaflet-i18n/Leaflet.i18n.js","../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["// Following https://github.com/Leaflet/Leaflet/blob/master/PLUGIN-GUIDE.md\n(function (factory, window) {\n\n // define an AMD module that relies on 'leaflet'\n if (typeof define === 'function' && define.amd) {\n define(['leaflet'], factory);\n\n // define a Common JS module that relies on 'leaflet'\n } else if (typeof exports === 'object') {\n module.exports = factory(require('leaflet'));\n }\n\n // attach your plugin to the global 'L' variable\n if (typeof window !== 'undefined' && window.L) {\n factory(window.L);\n\n }\n}(function (L) {\n L.locales = {};\n L.locale = null;\n L.registerLocale = function registerLocale(code, locale) {\n L.locales[code] = L.Util.extend({}, L.locales[code], locale);\n };\n L.setLocale = function setLocale(code) {\n L.locale = code;\n };\n return L.i18n = L._ = function translate(string, data) {\n if (L.locale && L.locales[L.locale] && L.locales[L.locale][string]) {\n string = L.locales[L.locale][string];\n }\n try {\n // Do not fail if some data is missing\n // a bad translation should not break the app\n string = L.Util.template(string, data);\n }\n catch (err) {/*pass*/\n }\n\n return string;\n };\n}, window));\n","/**\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\n **/\nexport const Colors = {\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\n\t'magenta' : { area: '#FF005E' },\n\t'yellow' : { area: '#FF0' },\n\t'purple' : { area: '#732C7B' },\n\t'steelblue': { area: '#4682B4' },\n\t'red' : { area: '#F00' },\n\t'lime' : { area: '#9CC222', line: '#566B13' }\n};\n\nconst SEC = 1000;\nconst MIN = SEC * 60;\nconst HOUR = MIN * 60;\nconst DAY = HOUR * 24;\n\n/**\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\n */\nexport function formatTime(t) {\n\tlet d = Math.floor(t / DAY);\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\n\tif ( s === 60 ) { m++; s = 0; }\n\tif ( m === 60 ) { h++; m = 0; }\n\tif ( h === 24 ) { d++; h = 0; }\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\n}\n\n/**\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\n */\n export function formatDate(format) {\n\tif (!format) {\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\n\t} else if (format == 'time') {\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\n\t} else if (format == 'date') {\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\n\t}\n\treturn (time) => format(time);\n}\n\n/**\n * Generate download data event.\n */\n export function saveFile(dataURI, fileName) {\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\n\tlet b = document.body;\n\tb.appendChild(a);\n\ta.click();\n\tb.removeChild(a);\n}\n\n\n/**\n * Convert SVG Path into Path2D and then update canvas\n */\n export function drawCanvas(ctx, path) {\n\tpath.classed('canvas-path', true);\n\n\tctx.beginPath();\n\tctx.moveTo(0, 0);\n\tlet p = new Path2D(path.attr('d'));\n\n\tctx.strokeStyle = path.attr('stroke');\n\tctx.fillStyle = path.attr('fill');\n\tctx.lineWidth = 1.25;\n\tctx.globalCompositeOperation = 'source-over';\n\n\t// stroke opacity\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\n\tctx.stroke(p);\n\n\t// fill opacity\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\n\tctx.fill(p);\n\n\tctx.globalAlpha = 1;\n\n\tctx.closePath();\n}\n\n/**\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\n */\nexport function coordPropsToMeta(coordProps, name, parser) {\n\treturn coordProps && (({props, point, id}) => {\n\t\tif (props) {\n\t\t\tfor (const key of coordProps) {\n\t\t\t\tif (key in props) {\n\t\t\t\t\tpoint.meta[name] = (parser || parseInt).call(this, props[key], id);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Extract numeric property (id) from GeoJSON object\n */\nexport const parseInt = (property, id) => window.parseInt((typeof property === 'object' ? property[id] : property));\n\n/**\n * Extract datetime property (id) from GeoJSON object\n */\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\n\n/**\n * A little bit shorter than L.DomUtil\n */\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\nexport const create = (tag, str, attrs, n) => { let elem = L.DomUtil.create(tag, str || \"\"); if (attrs) setAttributes(elem, attrs); if (n) append(n, elem); return elem; };\nexport const append = (n, c) => n.appendChild(c);\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\nexport const select = (str, n) => (n || document).querySelector(str);\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\n\n/**\n * TODO: use generators instead? (ie. \"yield\")\n */\nexport const iMax = (iVal, max) => (iVal > max ? iVal : max) || -Infinity; \nexport const iMin = (iVal, min) => (iVal < min ? iVal : min) || +Infinity;\nexport const iAvg = (iVal, avg) => (iVal + (avg || 0)) / 2.0;\nexport const iSum = (iVal, sum) => iVal + (sum || 0);\n\n/**\n * Alias for some leaflet core functions\n */\nexport const { on, off } = L.DomEvent;\nexport const { throttle } = L.Util;\nexport const { hasClass } = L.DomUtil;\n\n/**\n * Limit floating point precision\n */\nexport const round = L.Util.formatNum;\n\n/**\n * Limit a number between min / max values\n */\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\n\n/**\n * Limit a delta difference between two values\n */\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\n\nexport var Options = {\n\tautofitBounds: true,\n\tautohide: !L.Browser.mobile,\n\tautohideMarker: true,\n\talmostover: true,\n\taltitude: true,\n\tcollapsed: false,\n\tdetached: true,\n\tdistance: true,\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\n\tdragging: !L.Browser.mobile,\n\tdownloadLink: 'link',\n\televationDiv: \"#elevation-div\",\n\tfollowMarker: true,\n\timperial: false,\n\tlegend: true,\n\thandlers: [],\n\tmarker: 'elevation-line',\n\tmarkerIcon: L.divIcon({\n\t\tclassName: 'elevation-position-marker',\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\n\t\ticonSize: [32, 32],\n\t\ticonAnchor: [16, 16],\n\t}),\n\tposition: \"topright\",\n\tpolyline: {\n\t\tclassName: 'elevation-polyline',\n\t\tcolor: '#000',\n\t\topacity: 0.75,\n\t\tweight: 5,\n\t\tlineCap: 'round'\n\t},\n\tpolylineSegments: {\n\t\tclassName: 'elevation-polyline-segments',\n\t\tcolor: '#F00',\n\t\tinteractive: false,\n\t},\n\tpreferCanvas: false,\n\treverseCoords: false,\n\truler: true,\n\ttheme: \"lightblue-theme\",\n\tsummary: 'inline',\n\tslope: false,\n\tspeed: false,\n\ttime: false,\n\ttimeFactor: 3600,\n\ttimestamps: false,\n\ttrkStart: L.circleMarker([0,0], { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false }),\n\ttrkEnd: L.circleMarker([0,0], { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false }),\n\twaypoints: true,\n\twptIcons: {\n\t\t'': L.divIcon({\n\t\t\tclassName: 'elevation-waypoint-marker',\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\n\t\t\ticonSize: [30, 30],\n\t\t\ticonAnchor: [8, 30],\n\t\t}),\n\t},\n\twptLabels: true,\n\txAttr: \"dist\",\n\txLabel: \"km\",\n\tyAttr: \"z\",\n\tyLabel: \"m\",\n\tzFollow: false,\n\tzooming: !L.Browser.Mobile,\n\n\t// Quite uncommon and undocumented options (quite useless)\n\tdecimalsX: 2,\n\tdecimalsY: 0,\n\tforceAxisBounds: false,\n\tinterpolation: \"curveLinear\",\n\tskipNullZCoords: false,\n\tyAxisMax: undefined,\n\tyAxisMin: undefined,\n\n\t// Probably no longer functional as expected (internally overwritten)\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\n\theight: 200,\n\twidth: 600,\n\txTicks: undefined,\n\tyTicks: undefined,\n};\n","import 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Options } from './options';\n\nexport const Elevation = L.Control.Elevation = L.Control.extend({\n\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\n\n\toptions: Options,\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\n\t__LCHART: '../src/components/chart.js',\n\t__LMARKER: '../src/components/marker.js',\n\t__LSUMMARY: '../src/components/summary.js',\n\t__modulesFolder: '../src/handlers/',\n\n\t/*\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\n\t */\n\taddData: function(d, layer) {\n\t\tthis.import(this.__D3)\n\t\t\t.then(() => {\n\t\t\t\tif (typeof layer === \"undefined\" && d.on) {\n\t\t\t\t\tlayer = d;\n\t\t\t\t}\n\t\t\t\tthis._addData(d);\n\t\t\t\tthis._addLayer(layer);\n\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\n\t\t\t});\n\t},\n\n\t/**\n\t * Adds the control to the given map.\n\t */\n\taddTo: function(map) {\n\t\tif (this.options.detached) {\n\t\t\tlet eleDiv = this._initElevationDiv();\n\t\t\tif (!eleDiv.isConnected) _.insert(map.getContainer(), eleDiv, 'afterend');\n\t\t\t_.append(eleDiv, this.onAdd(map));\n\t\t} else {\n\t\t\tL.Control.prototype.addTo.call(this, map);\n\t\t}\n\t\treturn this;\n\t},\n\n\t/*\n\t * Reset data and display\n\t */\n\tclear: function() {\n\t\tif (this._marker) this._marker.remove();\n\t\tif (this._chart) this._clearChart();\n\t\tif (this._layers) this._clearLayers(this._layers);\n\t\tif (this._markers) this._clearLayers(this._markers);\n\t\tif (this._circleMarkers) this._clearLayers(this._circleMarkers);\n\n\t\tthis._data = [];\n\t\tthis.track_info = {};\n\n\t\tthis._fireEvt(\"eledata_clear\");\n\n\t\tthis._updateChart();\n\t},\n\n\t_clearChart: function() {\n\t\tif (this._events && this._events.elechart_updated) {\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\n\t\t}\n\t\tif (this._chart && this._chart._container) {\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\n\t\t\tthis._chart.clear();\n\t\t}\n\t},\n\n\t_clearLayers: function(l) {\n\t\tl = l || this._layers;\n\t\tif (l && l.eachLayer) {\n\t\t\tl.eachLayer(f => f.remove())\n\t\t\tl.clearLayers();\n\t\t}\n\t},\n\n\t/**\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\n\t * \n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\n\t */\n\t// addHandler: function (name, HandlerClass) {\n\t// \tif (HandlerClass) {\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\n\t// \t\tthis.handlers.push(handler);\n\t// \t\tif (this.options[name]) {\n\t// \t\t\thandler.enable();\n\t// \t\t}\n\t// \t}\n\t// \treturn this;\n\t// },\n\n\t/**\n\t * Disable chart brushing.\n\t */\n\tdisableBrush: function() {\n\t\tthis._chart._brushEnabled = false;\n\t\tthis._resetDrag();\n\t},\n\n\t/**\n\t * Enable chart brushing.\n\t */\n\tenableBrush: function() {\n\t\tthis._chart._brushEnabled = true;\n\t},\n\n\t/**\n\t * Disable chart zooming.\n\t */\n\tdisableZoom: function() {\n\t\tthis._chart._zoomEnabled = false;\n\t\tthis._chart._resetZoom();\n\t},\n\n\t/**\n\t * Enable chart zooming.\n\t */\n\tenableZoom: function() {\n\t\tthis._chart._zoomEnabled = true;\n\t},\n\n\t/**\n\t * Sets a map view that contains the given geographical bounds.\n\t */\n\tfitBounds: function(bounds) {\n\t\tbounds = bounds || this.getBounds();\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\n\t},\n\n\tgetBounds: function(data) {\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\n\t},\n\n\t/**\n\t * Get default zoom level (followMarker: true).\n\t */\n\tgetZFollow: function() {\n\t\treturn this.options.zFollow;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\thide: function() {\n\t\t_.style(this._container, \"display\", \"none\");\n\t},\n\n\t/**\n\t * Initialize chart control \"options\" and \"container\".\n\t */\n\tinitialize: function(opts) {\n\n\t\topts = L.setOptions(this, opts);\n\n\t\tthis._data = [];\n\t\tthis._layers = L.featureGroup();\n\t\tthis._markers = L.featureGroup();\n\t\tthis._circleMarkers = L.featureGroup();\n\t\tthis._markedSegments = L.polyline([]);\n\t\tthis._start = (opts.trkStart || Options.trkStart);\n\t\tthis._end = (opts.trkEnd || Options.trkEnd);\n\t\tthis._chartEnabled = true;\n\t\tthis._yCoordMax = -Infinity;\n\t\tthis.track_info = {};\n\t\t// this.handlers = [];\n\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\n\t\tif (opts.legend) opts.margins.bottom += 30;\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\n\n\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\n\n\t\t// Leaflet canvas renderer colors\n\t\tL.extend(_.Colors, opts.colors || {});\n\n\t\t// Various stuff\n\t\tthis._fixCanvasPaths();\n\t\tthis._fixTooltipSize();\n\n\t},\n\n\t/**\n\t * Javascript scripts downloader (lazy loader)\n\t */\n\timport: function(src, condition) {\n\t\tswitch(src) {\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\n\t\t}\n\t\treturn condition !== false ? import(src) : Promise.resolve();\n\t},\n\n\t/**\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\n\t */\n\tload: function(data) {\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\n\t},\n\n\t/**\n\t * Create container DOM element and related event listeners.\n\t * Called on control.addTo(map).\n\t */\n\tonAdd: function(map) {\n\t\tthis._map = map;\n\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control elevation \" + this.options.theme + \" \" + (this.options.detached ? '' : 'leaflet-control'));\n\n\t\tlet modules = [\n\t\t\t\"Distance\",\n\t\t\t\"Time\",\n\t\t\t\"Altitude\",\n\t\t\t\"Slope\",\n\t\t\t\"Speed\",\n\t\t\t\"Acceleration\",\n\t\t\t...this.options.handlers\n\t\t].filter(m => false !== this.options[typeof m == \"string\" && m.toLowerCase()]);\n\n\t\tthis._loadModules(modules);\t// Inject here required modules (data handlers)\n\t\tthis._initButton(container);\n\t\tthis._initChart(container);\n\t\tthis._initSummary(container);\n\t\tthis._initMarker(map);\n\t\tthis._initLayer(map);\n\n\t\treturn container;\n\t},\n\n\t/**\n\t * Clean up control code and related event listeners.\n\t * Called on control.remove().\n\t */\n\tonRemove: function(map) {\n\t\tthis._container = null;\n\n\t\tmap\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t.off('resize', this._resetView, this)\n\t\t\t.off('resize', this._resizeChart, this)\n\t\t\t.off('mousedown', this._resetDrag, this);\n\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\n\n\t\tthis\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\n\t},\n\n\t/**\n\t * Redraws the chart control. Sometimes useful after screen resize.\n\t */\n\tredraw: function() {\n\t\tthis._resizeChart();\n\t},\n\n\t/**\n\t * Set default zoom level (followMarker: true).\n\t */\n\tsetZFollow: function(zoom) {\n\t\tthis.options.zFollow = zoom;\n\t},\n\n\t/**\n\t * Hide current elevation chart profile.\n\t */\n\tshow: function() {\n\t\t_.style(this._container, \"display\", \"block\");\n\t},\n\n\t/*\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\n\t */\n\t_addData: function(d) {\n\t\tif (!d) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Standard GeoJSON --> doesn't handle \"time\", \"heart\", …\n\t\t */\n\t\tlet geom = d.geometry;\n\t\tif (geom) {\n\t\t\tswitch (geom.type) {\n\t\t\t\tcase 'LineString':\n\t\t\t\t\tthis._addGeoJSONData(geom.coordinates);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MultiLineString':\n\t\t\t\t\t_.each(geom.coordinates, coords => this._addGeoJSONData(coords));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\n\t\t\t}\n\t\t}\n\t\tif (d.type === \"FeatureCollection\") {\n\t\t\t_.each(d.features, feature => this._addData(feature));\n\t\t}\n\n\t\t/**\n\t\t * Extended GeoJSON --> rely on leaflet implementation\n\t\t */\n\t\tif (d._latlngs) {\n\t\t\tthis._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\n\t\t}\n\t},\n\n\t/*\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\n\t */\n\t_addGeoJSONData: function(coords, properties) {\n\t\tcoords.forEach((point, i) => {\n\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\n\t\t\t\n\t\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\n\t\t\tlet props = (properties && properties.coordinateProperties) || properties;\n\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\n\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i });\n\n\t\t\tthis._addPoint(\n\t\t\t\tpoint.lat ?? point[1], \n\t\t\t\tpoint.lng ?? point[0],\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\n\t\t\t);\n\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\n\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\n\t\t});\n\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\n\t},\n\n\t/*\n\t * Parse and push a single (x, y, z) point to current elevation profile.\n\t */\n\t_addPoint: function(x, y, z) {\n\t\tif (this.options.reverseCoords) {\n\t\t\t[x, y] = [y, x];\n\t\t}\n\n\t\tthis._data.push({\n\t\t\tx: x,\n\t\t\ty: y,\n\t\t\tz: z,\n\t\t\tlatlng: L.latLng(x, y, z)\n\t\t});\n\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\n\t},\n\n\t_addLayer: function(layer) {\n\t\tif (layer) this._layers.addLayer(layer)\n\t\t// Postpone adding the distance markers (lazy: true)\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\n\t\t}\n\t},\n\n\t_addMarker: function(marker) {\n\t\tif (marker) this._markers.addLayer(marker)\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" integration\n\t */\n\t_initAlmostOverHandler: function(map, layer) {\n\t\tif(!map || !this.options.almostOver) return;\n\t\tPromise.all([\n\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\tthis.import(this.__LALMOSTOVER)\n\t\t]).then(() => {\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\n\t\t\t\tmap.almostOver.addLayer(layer);\n\t\t\t\tmap\n\t\t\t\t\t.on('almost:move', (e) => this._onMouseMoveLayer(e))\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Initialize \"L.DistanceMarkers\" integration\n\t */\n\t_initDistanceMarkers: function(map, layer) {\n\t\tif (!map) return;\n\t\tif (this.options.distanceMarkers) {\n\t\t\tPromise.all([\n\t\t\t\tthis.import(this.__LGEOMUTIL),\n\t\t\t\tthis.import(this.__LDISTANCEM)\n\t\t\t]).then(() => this.options.polyline && layer.addTo(map) && this._circleMarkers.bringToFront());\n\t\t} else if (this.options.polyline) {\n\t\t\tlayer.addTo(map);\n\t\t}\n\t},\n\n\t/**\n\t * Adds the control to the given \"detached\" div.\n\t */\n\t_initElevationDiv: function() {\n\t\tlet eleDiv = _.select(this.options.elevationDiv);\n\t\tif (!eleDiv) {\n\t\t\tthis.options.elevationDiv = '#elevation-div_' + _.randomId();\n\t\t\teleDiv = _.create('div', 'leaflet-control elevation elevation-div', { id: this.options.elevationDiv.substr(1) });\n\t\t}\n\t\tif (this.options.detached) {\n\t\t\t_.replaceClass(eleDiv, 'leaflet-control', 'elevation-detached');\n\t\t}\n\t\treturn this.eleDiv = eleDiv;\n\t},\n\n\t/**\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\n\t */\n\t_initMapIntegrations: function(control, layer) {\n\t\tlet map = control._map;\n\t\tif (control._data.length) {\n\t\t\tcontrol._start.setLatLng(control._data[0].latlng);\n\t\t\tcontrol._end.setLatLng(control._data[control._data.length -1].latlng);\n\t\t}\n\t\tif (map) {\n\t\t\tcontrol._circleMarkers.addTo(map);\n\t\t\tmap.once('layeradd', (e) => control.options.autofitBounds && control.fitBounds(layer.getBounds()));\n\t\t\tif (!L.Browser.mobile) {\n\t\t\t\tcontrol._initAlmostOverHandler(map, layer);\n\t\t\t\tcontrol._initDistanceMarkers(map, layer);\n\t\t\t} else if (control.options.polyline) {\n\t\t\t\tlayer.addTo(map);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn(\"Undefined elevation map object\");;\n\t\t}\n\t},\n\n\t/*\n\t * Collapse current chart control.\n\t */\n\t_collapse: function() {\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\n\t},\n\n\t/*\n\t * Expand current chart control.\n\t */\n\t_expand: function() {\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\n\t},\n\n\t/**\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\n\t */\n\t_fixCanvasPaths: function() {\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\n\t\tlet control = this;\n\n\t\tlet theme = this.options.theme.replace('-theme', '');\n\t\tlet color = _.Colors[theme] || {};\n\n\t\tL.Canvas.include({\n\t\t\t_fillStroke: function(ctx, layer) {\n\t\t\t\tif (control._layers.hasLayer(layer)) {\n\n\t\t\t\t\tlet options = layer.options;\n\n\t\t\t\t\toptions.color = color.line || color.area || theme;\n\t\t\t\t\toptions.stroke = !!options.color;\n\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\toldProto.call(this, ctx, layer);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Partial fix for initial tooltip size\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\n\t */\n\t_fixTooltipSize: function() {\n\t\tthis.on('elechart_init', () =>\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\n\t\t\t\tif (this._chartEnabled) {\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\n\t\t\t\t}\n\t\t\t\tthis._updateMarker(data);\n\t\t\t})\n\t\t);\n\t},\n\n\t/*\n\t * Finds a data entry for the given LatLng\n\t */\n\t_findItemForLatLng: function(latlng) {\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\n\t},\n\n\t/*\n\t * Finds a data entry for the given xDiagCoord\n\t */\n\t_findItemForX: function(x) {\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\n\t},\n\n\t/**\n\t * Fires an event of the specified type.\n\t */\n\t_fireEvt: function(type, data, propagate) {\n\t\tif (this.fire) this.fire(type, data, propagate);\n\t\tif (this._map) this._map.fire(type, data, propagate);\n\t},\n\n\t/*\n\t * Hides the position/height indicator marker drawn onto the map\n\t */\n\t_hideMarker: function() {\n\t\tif (this.options.autohideMarker) {\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Generate \"svg\" chart (DOM element).\n\t */\n\t_initChart: function(container) {\n\t\tlet opts = this.options;\n\n\t\tif (opts.detached) {\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\n\t\t} else {\n\t\t\tlet { clientWidth } = this._map.getContainer();\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\n\t\t}\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LCHART)\n\t\t]).then((m) => {\n\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\td3\n\t\t\t\t.select(container)\n\t\t\t\t.call(chart.render())\n\t\n\t\t\tchart\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\n\t\t\t\t.on('dragged', this._onDragEnd, this)\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\n\t\t\t\t.on('zoom', this._updateChart, this)\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\n\t\n\t\n\t\t\tthis.fire(\"elechart_axis\");\n\t\n\t\t\tif (this.options.legend) this.fire(\"elechart_legend\");\n\t\n\t\t\tthis.fire(\"elechart_init\");\n\n\t\t\tmap\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\n\t\t\t\t.on('resize', this._resetView, this)\n\t\t\t\t.on('resize', this._resizeChart, this)\n\t\t\t\t.on('rotate', this._rotateMarker, this)\n\t\t\t\t.on('mousedown', this._resetDrag, this);\n\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\n\n\t\t\tthis\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\n\n\t\t\tthis._updateChart();\n\t\t\tthis._updateSummary();\n\t\t});\n\n\t},\n\n\t_initLayer: function() {\n\t\tthis._layers\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\n\t\t\t\tlet node = layer.getElement && layer.getElement();\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\n\t\t\t});\n\t},\n\n\t_initMarker: function(map) {\n\t\tlet pane = map.getPane('elevationPane');\n\t\tif (!pane) {\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\n\t\t\tpane.style.pointerEvents = 'none';\n\t\t}\n\n\t\tif (this._renderer) this._renderer.remove()\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\n\n\t\tPromise.all([\n\t\t\tthis.import(this.__D3),\n\t\t\tthis.import(this.__LMARKER)\n\t\t]).then((m) => {\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\n\t\t\tthis.fire(\"elechart_marker\");\n\t\t});\n\t},\n\n\t/**\n\t * Inspired by L.Control.Layers\n\t */\n\t_initButton: function(container) {\n\n\t\tif (L.Browser.mobile || !this.options.detached) {\n\t\t\tL.DomEvent\n\t\t\t\t.disableClickPropagation(container)\n\t\t\t\t.disableScrollPropagation(container);\n\t\t}\n\n\t\tif (!this.options.detached) {\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle elevation-toggle-icon\" + (this.options.autohide ? \"\" : \" close-button\"), { href: '#', title: L._('Elevation') }, container);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t\tif (this.options.autohide) {\n\t\t\t\t\t_.on(container, 'mouseover', this._expand, this);\n\t\t\t\t\t_.on(container, 'mouseout', this._collapse, this);\n\t\t\t\t} else {\n\t\t\t\t\t_.on(link, 'click', L.DomEvent.stop);\n\t\t\t\t\t_.on(link, 'click', this._toggle, this);\n\t\t\t\t}\n\n\t\t\t\t_.on(link, 'focus', this._toggle, this);\n\n\t\t\t\tthis._map.on('click', this._collapse, this);\n\t\t\t}\n\t\t}\n\t},\n\n\t_initSummary: function(container) {\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\n\n\t\t\tthis.on('elechart_init', () => {\n\t\t\t\td3.select(container).call(this._summary.render());\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Retrieve data from a remote url (HTTP).\n\t */\n\t_loadFile: function(url) {\n\t\tfetch(url)\n\t\t\t.then((response) => response.text())\n\t\t\t.then((data) => {\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\n\t\t\t\tthis._parseFromString(data)\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\n\t\t\t}).catch((err) => console.warn(err));\n\t},\n\n\t/**\n\t * Dynamically import only required javascript modules (code splitting)\n\t */\n\t_loadModules: function(handlers) {\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof L.Control.Elevation[h] !== \"undefined\" ? L.Control.Elevation[h] : h);\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\n\t\tPromise.\n\t\t\tall(\n\t\t\t\thandlers\n\t\t\t\t\t.filter(h => typeof h === 'string' || h instanceof Promise)\n\t\t\t\t\t.map(file => file instanceof Promise ? file : this.import(this.__modulesFolder + file.toLowerCase() + '.js'))\n\t\t\t)\n\t\t\t.then((m) => {\n\t\t\t\t_.each(m, (exported) => {\n\t\t\t\t\tlet fn = Object.keys(exported)[0];\n\t\t\t\t\tif (fn && typeof L.Control.Elevation[fn] === \"undefined\" ) {\n\t\t\t\t\t\thandlers[fn] = L.Control.Elevation[fn] = exported[fn];\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t_.each(handlers, h => this._registerHandler(h));\n\t\t\t});\n\t},\n\n\t/**\n\t * Simple GeoJSON data loader (L.GeoJSON).\n\t */\n\t_loadLayer: function(geojson) {\n\t\tlet control = this;\n\n\t\tlet { wptIcons, wptLabels } = control.options;\n\n\t\tlet layer = L.geoJson(geojson, {\n\t\t\tdistanceMarkers: control.options.distanceMarkers,\n\t\t\tstyle: (feature) => {\n\t\t\t\tlet style = L.extend({}, control.options.polyline);\n\t\t\t\tif (control.options.theme) {\n\t\t\t\t\tstyle.className += ' ' + control.options.theme;\n\t\t\t\t}\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tpointToLayer: (feature, latlng) => {\n\t\t\t\tif (!control.options.waypoints) return;\n\n\t\t\t\tlet prop = feature.properties;\n\t\t\t\tlet desc = prop.desc ?? '';\n\t\t\t\tlet name = prop.name ?? '';\n\t\t\t\tlet sym = (prop.sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase();\n\n\t\t\t\t// Handle chart waypoints (dots)\n\t\t\t\tif ([true, 'dots'].includes(control.options.waypoints)) {\n\t\t\t\t\tcontrol._registerCheckPoint({\n\t\t\t\t\t\tlatlng: latlng,\n\t\t\t\t\t\tlabel: ([true, 'dots'].includes(wptLabels) ? name : '')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle map waypoints (markers)\n\t\t\t\tif ([true, 'markers'].includes(control.options.waypoints) && wptIcons != false) {\n\t\t\t\t\t// generate and cache appropriate icon symbol\n\t\t\t\t\tif (!wptIcons.hasOwnProperty(sym)) {\n\t\t\t\t\t\twptIcons[sym] = L.divIcon(\n\t\t\t\t\t\t\tL.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\n\t\t\t\t\tif ([true, 'markers'].includes(wptLabels) && (name || desc)) {\n\t\t\t\t\t\tlet content = decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''));\n\t\t\t\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\n\t\t\t\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\n\t\t\t\t\t}\n\t\t\t\t\tcontrol._addMarker(marker);\n\t\t\t\t\tcontrol.fire('waypoint_added', { point: marker, element: latlng, properties: prop });\n\t\t\t\t\treturn marker;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonEachFeature: (feature, layer) => {\n\t\t\t\tif (feature.geometry && feature.geometry.type != 'Point') {\n\t\t\t\t\tcontrol.addData(layer);\n\t\t\t\t\tcontrol.track_info = L.extend({}, control.track_info, { name: geojson.name });\n\t\t\t\t} \n\t\t\t},\n\t\t});\n\n\t\tcontrol.import(control.__D3).then(() => {\n\t\t\tcontrol._initMapIntegrations(control, layer);\n\t\t\tcontrol._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: control.track_info.name, track_info: control.track_info });\n\t\t});\n\n\t\treturn layer;\n\t},\n\n\t_onDragEnd: function({ dragstart, dragend}) {\n\t\tthis._hideMarker();\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\n\n\t\tthis.fire(\"elechart_dragged\");\n\t},\n\n\t_onKeyDown: function({key}) {\n\t\tif(!this.options.detached && key === \"Escape\"){\n\t\t\tthis._collapse()\n\t\t};\n\t},\n\n\t/**\n\t * Trigger mouseenter event.\n\t */\n\t_onMouseEnter: function() {\n\t\tthis.fire('elechart_enter');\n\t},\n\n\t/*\n\t * Handles the moueseover the chart and displays distance and altitude level.\n\t */\n\t_onMouseMove: function({xCoord}) {\n\t\tif (this._chartEnabled && this._data.length) {\n\t\t\tlet item = this._findItemForX(xCoord);\n\t\t\tif (item) {\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\n\t\t\t\tthis._updateMarker(item);\n\t\t\t\tthis._setMapView(item);\n\n\t\t\t\tif (this._map) {\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\n\t\t\t\t}\n\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles mouseover events of the data layers on the map.\n\t */\n\t_onMouseMoveLayer: function({latlng}) {\n\t\tif (this._data.length) {\n\t\t\tlet item = this._findItemForLatLng(latlng);\n\t\t\tif (item) {\n\t\t\t\tlet xCoord = item.xDiagCoord;\n\t\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\n\t\n\t\t\t\tthis._updateMarker(item);\n\t\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\n\t\t\t}\n\t\t}\n\t},\n\n\t/*\n\t * Handles the moueseout over the chart.\n\t */\n\t_onMouseOut: function() {\n\t\tif (!this.options.detached) {\n\t\t\tthis._hideMarker();\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t}\n\n\t\tif (this._map) {\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\n\t\t}\n\n\t\tthis.fire(\"elechart_leave\");\n\t},\n\n\t/**\n\t * Handles the drag event over the ruler filter.\n\t */\n\t_onRulerFilter: function({coords}) {\n\t\tthis._updateMapSegments(coords);\n\t},\n\n\t/**\n\t * Toggle chart data on legend click\n\t */\n\t_onToggleChart: function({ name, enabled }) {\n\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\n\n\t\t// toggle layer visibility on empty chart\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\n\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\n\n\t\t// remove marker on empty chart\n\t\tif (!this._chartEnabled) {\n\t\t\tthis._chart._hideDiagramIndicator();\n\t\t\tthis._marker.remove();\n\t\t}\n\t},\n\n\t/**\n\t * Simple GeoJSON Parser\n\t */\n\t_parseFromGeoJSONString: function(data) {\n\t\ttry {\n\t\t\treturn JSON.parse(data);\n\t\t} catch (e) { }\n\t},\n\n\t/**\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\n\t */\n\t_parseFromString: function(data) {\n\t\treturn new Promise(resolve =>\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\n\t\t\t\tlet geojson;\n\t\t\t\ttry {\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\n\t\t\t\t}\n\t\t\t\tif (geojson) {\n\t\t\t\t\tgeojson = this._prepareMultiLineStrings(geojson);\n\t\t\t\t\tgeojson = this._prepareAdditionalProperties(geojson);\n\t\t\t\t}\n\t\t\t\tresolve(geojson);\n\t\t\t})\n\t\t);\n\t},\n\n\t/**\n\t * Simple XML Parser (GPX, KML, TCX)\n\t */\n\t_parseFromXMLString: function(data) {\n\t\tif (data.indexOf(\"<\") != 0) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\n\t\tlet name = xml.getElementsByTagName('name');\n\t\tif (xml.getElementsByTagName('parsererror').length) {\n\t\t\tthrow 'Invalid XML';\n\t\t}\n\t\tif (!(type in toGeoJSON)) {\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\n\t\t}\n\t\tlet geojson = toGeoJSON[type](xml);\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Extend GeoJSON properties (name, time, ...)\n\t */\n\t _prepareAdditionalProperties: function(geojson) {\n\t\tif (!geojson.name && this._downloadURL) {\n\t\t\tgeojson.name = this._downloadURL.split('/').pop().split('#')[0].split('?')[0];\n\t\t}\n\t\treturn geojson;\n\t},\n\n\t/**\n\t * Just a temporary fix for MultiLineString data (trk > trkseg + trkseg),\n\t * just split them into seperate LineStrings (trk > trkseg, trk > trkseg)\n\t * \n\t * @link https://github.com/Raruto/leaflet-elevation/issues/56\n\t */\n\t_prepareMultiLineStrings: function(geojson) {\n\t\tgeojson.features.forEach(feauture => {\n\t\t\tif (feauture.geometry.type == \"MultiLineString\") {\n\t\t\t\tfeauture.geometry.coordinates.forEach(coords => {\n\t\t\t\t\tgeojson.features.push({\n\t\t\t\t\t\tgeometry: { type: 'LineString', coordinates: coords },\n\t\t\t\t\t\tproperties: feauture.properties,\n\t\t\t\t\t\ttype: 'Feature'\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} \n\t\t});\n\t\treturn geojson.features.filter(feauture => feauture.geometry.type != \"MultiLineString\");\n\t},\n\n\t/**\n\t * Add chart profile to diagram\n\t */\n\t_registerAreaPath: function(props) {\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\n\t},\n\n\t/**\n\t * Add chart grid to diagram\n\t */\n\t_registerAxisGrid: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\n\t},\n\n\t/**\n\t * Add chart axis to diagram\n\t */\n\t_registerAxisScale: function(props) {\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\n\t},\n\n\t/**\n\t * Add a point of interest over the diagram\n\t */\n\t_registerCheckPoint: function(props) {\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\n\t},\n\n\n\t/**\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\n\t */\n\t _registerDataAttribute: function(props) {\n\n\t\t// parse of \"coordinateProperties\" for later usage\n\t\tif (props.coordPropsToMeta) {\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\n\t\t}\n\n\t\t// prevent excessive variabile instanstations\n\t\tlet i, curr, prev, attr;\n\n\t\t// save here a reference to last used point\n\t\tlet lastValid = null; \n\n\t\t// iteration\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\n\t\t\ti = index;\n\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\n\t\t\tcurr = this._data[i];\n\t\t\tattr = props.attr || props.name;\n\n\t\t\t// check and fix missing data on last added point\n\t\t\tif (props.skipNull === false) {\n\t\t\t\tlet curr = this._data[i][attr];\n\t\t\t\tif(i > 0) {\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\n\t\t\t\t\tif (isNaN(prev)) {\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\n\t\t\t\t\t\t\tprev = lastValid;\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\n\t\t\t\t\t\t\tprev = curr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// update reference to last used point (ie. if it has data)\n\t\t\t\tif (!isNaN(curr)) {\n\t\t\t\t\tlastValid = curr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// retrieve point value\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\n\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\n\t\t\tif (props.stats) {\n\t\t\t\tfor (const key in props.stats) {\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Limit \"crazy\" delta values.\n\t\t\tif (props.deltaMax) {\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\n\t\t\t}\n\t\t\t\n\t\t\t// Range of acceptable values.\n\t\t\tif (props.clampRange) {\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\n\t\t\t}\n\n\t\t\t// Limit floating point precision.\n\t\t\tif (!isNaN(props.decimals)) {\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\n\t\t\t}\n\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\n\t\t\tif(props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\n\t\t});\n\t},\n\n\t/**\n\t * Parse a module definition and attach related function listeners\n\t */\n\t_registerHandler: function(props) {\n\n\t\t// eg. L.Control.Altitude\n\t\tif (typeof props === \"function\") {\n\t\t\treturn this._registerHandler(props.call(this));\n\t\t}\n\n\t\t// eg. \"altitude\" == true\n\t\tif (this.options[props.name] || props.required) {\n\n\t\t\tthis._registerDataAttribute({\n\t\t\t\tname: props.name,\n\t\t\t\tattr: props.attr,\n\t\t\t\tskipNull: props.skipNull,\n\t\t\t\tdeltaMax: props.deltaMax,\n\t\t\t\tclampRange: props.clampRange,\n\t\t\t\tdecimals: props.decimals,\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(props.coordinateProperties, props.meta || props.name, props.coordPropsToMeta),\n\t\t\t\tpointToAttr: props.pointToAttr,\n\t\t\t\tonPointAdded: props.onPointAdded,\n\t\t\t\tstats: props.stats,\n\t\t\t\tstatsName: props.statsName,\n\t\t\t});\n\n\t\t\tif (props.grid) {\n\t\t\t\tprops.grid.name = props.grid.name || props.name;\n\t\t\t\tthis._registerAxisGrid(props.grid);\n\t\t\t}\n\n\t\t\tif (this.options[props.name] !== \"summary\") {\n\t\t\t\tif (props.scale) {\n\t\t\t\t\tprops.scale.name = props.scale.name || props.name;\n\t\t\t\t\tprops.scale.label = props.scale.label || props.unit;\n\t\t\t\t\tthis._registerAxisScale(props.scale);\n\t\t\t\t}\n\t\t\t\tif (props.path) {\n\t\t\t\t\tprops.path.name = props.path.name || props.name;\n\t\t\t\t\tthis._registerAreaPath(props.path);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (props.tooltips) {\n\t\t\t\t_.each(props.tooltips, t => {\n\t\t\t\t\tif (t) {\n\t\t\t\t\t\tt.name = t.name || props.name;\n\t\t\t\t\t\tthis._registerTooltip(t)\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (props.tooltip) {\n\t\t\t\tprops.tooltip.name = props.tooltip.name || props.name;\n\t\t\t\tthis._registerTooltip(props.tooltip)\n\t\t\t}\n\n\t\t\tif (props.summary) {\n\t\t\t\tfor (const key in props.summary) {\n\t\t\t\t\tprops.summary[key].unit = props.summary[key].unit || props.unit;\n\t\t\t\t}\n\t\t\t\tthis._registerSummary(props.summary);\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Add chart or marker tooltip info\n\t */\n\t_registerTooltip: function(props) {\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\n\t},\n\n\t/**\n\t * Add summary info to diagram\n\t */\n\t_registerSummary: function(props) {\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\n\t},\n\n\t/*\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\n\t */\n\t_resetDrag: function() {\n\t\tthis._chart._resetDrag();\n\t\tthis._hideMarker();\n\t},\n\n\t/**\n\t * Resets drag, marker and bounds.\n\t */\n\t_resetView: function() {\n\t\tif (this._map && this._map._isFullscreen) return;\n\t\tthis._resetDrag();\n\t\tthis._hideMarker();\n\t\tif (this.options.autofitBounds) {\n\t\t\tthis.fitBounds();\n\t\t}\n\t},\n\n\t/**\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\n\t */\n\t_resizeChart: function() {\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\n\t\t\tlet opts = this.options;\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\n\t\t\tif (newWidth) {\n\t\t\t\topts.width = newWidth;\n\t\t\t\tif (this._chart && this._chart._chart) {\n\t\t\t\t\tthis._chart._chart._resize(opts);\n\t\t\t\t\tthis._updateChart();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._updateMapSegments();\n\t\t}\n\t},\n\n\t/**\n\t * Collapse or Expand chart control.\n\t */\n\t_toggle: function() {\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\n\t},\n\n\t/**\n\t * Update map center and zoom (followMarker: true)\n\t */\n\t_setMapView: function(item) {\n\t\tif (this._map && this.options.followMarker) {\n\t\t\tlet zoom = this._map.getZoom();\n\t\t\tlet z = this.options.zFollow;\n\t\t\tif (typeof z === \"number\") {\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Calculates [x, y] domain and then update chart.\n\t */\n\t_updateChart: function() {\n\t\tif (this._chart && this._container) {\n\t\t\tthis.fire(\"elechart_axis\");\n\t\t\tthis.fire(\"elechart_area\");\n\t\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\n\t\n\t\t\tthis._x = this._chart._x;\n\t\t\tthis._y = this._chart._y;\n\t\n\t\t\tthis.fire('elechart_updated');\t\t\n\t\t}\n\t},\n\n\t/*\n\t * Update the position/height indicator marker drawn onto the map\n\t */\n\t_updateMarker: function(item) {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update({\n\t\t\t\tmap : this._map,\n\t\t\t\titem : item,\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\n\t\t\t\toptions : this.options\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Fix marker rotation on rotated maps\n\t */\n\t_rotateMarker: function() {\n\t\tif (this._marker) {\n\t\t\tthis._marker.update();\n\t\t}\n\t},\n\n\t/**\n\t * Highlight track segments on the map.\n\t */\n\t_updateMapSegments: function(coords) {\n\t\tthis._markedSegments.setLatLngs(coords || []);\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\n\t\t\tthis._markedSegments.addTo(this._map);\n\t\t}\n\t},\n\n\t/**\n\t * Update chart summary.\n\t */\n\t_updateSummary: function() {\n\t\tif (!this._summary) return;\n\n\t\tthis._summary.reset();\n\n\t\tif (this.options.summary) {\n\t\t\tthis.fire(\"elechart_summary\");\n\t\t\tthis._summary.update();\n\t\t}\n\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\n\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\n\t\t\t_.select('.download a', this._summary._container).onclick = ({preventDefault}) => {\n\t\t\t\tpreventDefault();\n\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\n\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\n\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\n\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\n\t\t\t\t\tevent.confirm();\n\t\t\t\t}\n\t\t\t\tthis.fire('eletrack_download', event);\n\t\t\t};\n\t\t};\n\t},\n\n\n\t/**\n\t * Calculates chart width.\n\t */\n\t_width: function() {\n\t\tif (this._chart) return this._chart._width();\n\t\tconst { width, margins } = this.options;\n\t\treturn width - margins.left - margins.right;\n\t},\n\n\t/**\n\t * Calculates chart height.\n\t */\n\t_height: function() {\n\t\tif (this._chart) return this._chart._height();\n\t\tconst { height, margins } = this.options;\n\t\treturn height - margins.top - margins.bottom;\n\t},\n\n});","/*\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\n *\n * This file is free software: you may copy, redistribute and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 2 of the License, or (at your\n * option) any later version.\n *\n * This file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n *\n * This file incorporates work covered by the following copyright and\n * permission notice:\n *\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\n *\n * Permission to use, copy, modify, and/or distribute this software\n * for any purpose with or without fee is hereby granted, provided\n * that the above copyright notice and this permission notice appear\n * in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport 'leaflet-i18n';\nimport * as _ from './utils';\nimport { Elevation } from './control';\n\nElevation.Utils = _;\n\n/* Temporary fix for empty values evaluated as false (leaflet-i18n v0.3.1) */\n(function(){\n\tlet proto = L.i18n.bind({});\n\tL.i18n = L._ = (string, data) => {\n\t\tif (L.locale && L.locales[L.locale] && L.locales[L.locale][string] == \"\") {\n\t\t\tL.locales[L.locale][string] = \"\\u200B\";\n\t\t}\n\t\treturn proto.call(null, string, data);\n\t};\n})();\n\nL.control.elevation = (options) => new Elevation(options);\n"],"names":["factory","window","define","amd","exports","module","require","L","locales","locale","registerLocale","code","Util","extend","setLocale","i18n","_","string","data","template","err","Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","key","meta","parseInt","call","this","property","addClass","n","str","split","every","s","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","toString","substr","on","off","DomEvent","throttle","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","sum","Options","autofitBounds","autohide","Browser","mobile","autohideMarker","almostover","altitude","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","circleMarker","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","undefined","yAxisMin","margins","top","right","bottom","left","height","width","xTicks","yTicks","Elevation","Control","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","addData","layer","import","then","_addData","_addLayer","_fireEvt","track_info","addTo","map","eleDiv","_initElevationDiv","isConnected","_.insert","getContainer","_.append","onAdd","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","src","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","modules","filter","toLowerCase","_loadModules","_initButton","_initChart","_initSummary","_initMarker","_initLayer","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","geom","geometry","type","_addGeoJSONData","coordinates","_.each","coords","console","warn","features","feature","_latlngs","properties","ele","coordinateProperties","fire","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","bringToFront","_.select","_.randomId","_.replaceClass","_initMapIntegrations","control","setLatLng","once","_collapse","_expand","oldProto","Canvas","_fillStroke","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","_renderer","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","_summary","Summary","url","fetch","response","text","_downloadURL","catch","file","exported","Object","keys","_registerHandler","geoJson","pointToLayer","prop","desc","sym","_registerCheckPoint","label","hasOwnProperty","icon","content","decodeURI","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","element","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","_prepareMultiLineStrings","_prepareAdditionalProperties","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","parentElement","textContent","pop","feauture","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","_.coordPropsToMeta","grid","scale","unit","tooltips","_registerTooltip","tooltip","_registerSummary","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","innerHTML","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","proto","elevation"],"mappings":"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"}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
package/src/control.js
CHANGED
|
@@ -14,10 +14,10 @@ export const Elevation = L.Control.Elevation = L.Control.extend({
|
|
|
14
14
|
__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',
|
|
15
15
|
__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',
|
|
16
16
|
__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',
|
|
17
|
+
__LCHART: '../src/components/chart.js',
|
|
18
|
+
__LMARKER: '../src/components/marker.js',
|
|
19
|
+
__LSUMMARY: '../src/components/summary.js',
|
|
17
20
|
__modulesFolder: '../src/handlers/',
|
|
18
|
-
__LCHART: '../src/chart.js',
|
|
19
|
-
__LMARKER: '../src/marker.js',
|
|
20
|
-
__LSUMMARY: '../src/summary.js',
|
|
21
21
|
|
|
22
22
|
/*
|
|
23
23
|
* Add data to the diagram either from GPX or GeoJSON and update the axis domain and data
|
package/src/index.css
CHANGED
|
@@ -246,7 +246,7 @@
|
|
|
246
246
|
.leaflet-elevation-pane .height-focus,
|
|
247
247
|
.leaflet-overlay-pane .height-focus {
|
|
248
248
|
stroke: #000;
|
|
249
|
-
fill: var(--ele-area, #FFF);
|
|
249
|
+
fill: var(--ele-circle, var(--ele-area, #FFF));
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
.leaflet-elevation-pane .height-focus.line,
|
|
@@ -334,6 +334,7 @@
|
|
|
334
334
|
--ele-area: #3366CC;
|
|
335
335
|
--ele-alpha: 0.45;
|
|
336
336
|
--ele-stroke: #4682B4;
|
|
337
|
+
--ele-circle: #fff;
|
|
337
338
|
}
|
|
338
339
|
|
|
339
340
|
.elevation-detached .lightblue-theme.elevation-control.elevation .area {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Acceleration(){const _=L.Control.Elevation.Utils;let opts=this.options,acceleration={};return acceleration.label=opts.accelerationLabel||L._(opts.imperial?"ft/s²":"m/s²"),opts.accelerationFactor=opts.accelerationFactor||1,{name:"acceleration",unit:acceleration.label,deltaMax:this.options.accelerationDeltaMax,clampRange:this.options.accelerationRange,decimals:2,pointToAttr:(_,i)=>{let dv=(this._data[i].speed-this._data[i>0?i-1:i].speed)*(1e3/opts.timeFactor),dt=(this._data[i].time-this._data[i>0?i-1:i].time)/1e3;return dt>0?Math.abs(dv/dt)*opts.accelerationFactor:0},stats:{max:_.iMax,min:_.iMin,avg:_.iAvg},scale:{axis:"y",position:"right",scale:{min:0,max:1},tickPadding:16,labelX:25,labelY:-8},path:{label:"Acceleration",yAttr:"acceleration",scaleX:"distance",scaleY:"acceleration",color:"#050402",strokeColor:"#000",strokeOpacity:"0.5",fillOpacity:"0.25"},tooltip:{chart:item=>L._("a: ")+item.acceleration+" "+acceleration.label,marker:item=>Math.round(item.acceleration)+" "+acceleration.label,order:60},summary:{minacceleration:{label:"Min Acceleration: ",value:(track,unit)=>Math.round(track.acceleration_min||0)+" "+unit,order:60},maxacceleration:{label:"Max Acceleration: ",value:(track,unit)=>Math.round(track.acceleration_max||0)+" "+unit,order:61},avgacceleration:{label:"Avg Acceleration: ",value:(track,unit)=>Math.round(track.acceleration_avg||0)+" "+unit,order:62}}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Altitude(){const _=L.Control.Elevation.Utils;let opts=this.options,altitude={},theme=opts.theme.replace("-theme",""),color=_.Colors[theme]||{};return opts.altitudeFactor=opts.imperial?this.__footFactor:opts.altitudeFactor||1,altitude.label=opts.imperial?"ft":opts.yLabel,{name:"altitude",required:this.options.slope,meta:"z",unit:altitude.label,statsName:"elevation",skipNull:this.options.skipNullZCoords,deltaMax:this.options.altitudeDeltaMax,clampRange:this.options.altitudeRange,pointToAttr:(_,i)=>this._data[i].z*opts.altitudeFactor,stats:{max:_.iMax,min:_.iMin,avg:_.iAvg},grid:{axis:"y",position:"left",scale:"y"},scale:{axis:"y",position:"left",scale:"y",labelX:-3,labelY:-8},path:{label:"Altitude",scaleX:"distance",scaleY:"altitude",className:"area",color:color.area||theme,strokeColor:opts.detached?color.stroke:"#000",strokeOpacity:"1",fillOpacity:opts.detached?color.alpha||"0.8":1,preferCanvas:opts.preferCanvas},tooltip:{name:"y",chart:item=>L._("y: ")+_.round(item[opts.yAttr],opts.decimalsY)+" "+altitude.label,marker:item=>_.round(item[opts.yAttr],opts.decimalsY)+" "+altitude.label,order:10},summary:{minele:{label:"Min Elevation: ",value:(track,unit)=>(track.elevation_min||0).toFixed(2)+" "+unit,order:30},maxele:{label:"Max Elevation: ",value:(track,unit)=>(track.elevation_max||0).toFixed(2)+" "+unit,order:31},avgele:{label:"Avg Elevation: ",value:(track,unit)=>(track.elevation_avg||0).toFixed(2)+" "+unit,order:32}}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Distance(){const _=L.Control.Elevation.Utils;let opts=this.options,distance={};return opts.distanceFactor=opts.imperial?this.__mileFactor:opts.distanceFactor||1,distance.label=opts.imperial?"mi":opts.xLabel,{name:"distance",attr:"dist",unit:distance.label,decimals:5,pointToAttr:(_,i)=>(i>0?this._data[i-1].dist:0)+this._data[i].latlng.distanceTo(this._data[i>0?i-1:i].latlng)*opts.distanceFactor/1e3,onPointAdded:(distance,i)=>this.track_info.distance=distance,scale:{axis:"x",position:"bottom",scale:"x",labelY:25,labelX:()=>this._width()+6,ticks:()=>_.clamp(this._chart._xTicks()/2,[4,1/0])},grid:{axis:"x",position:"bottom",scale:"x"},tooltip:{name:"x",chart:item=>L._("x: ")+_.round(item[opts.xAttr],opts.decimalsX)+" "+distance.label,order:20},summary:{totlen:{label:"Total Length: ",value:track=>(track.distance||0).toFixed(2)+" "+distance.label,order:10}}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Slope(){const _=L.Control.Elevation.Utils;let opts=this.options,slope={};return slope.label=opts.slopeLabel||"%",{name:"slope",meta:"slope",unit:slope.label,deltaMax:this.options.slopedDeltaMax,clampRange:this.options.slopeRange,decimals:2,pointToAttr:(_,i)=>{let dx=1e3*(this._data[i].dist-this._data[i>0?i-1:i].dist),dy=this._data[i][this.options.yAttr]-this._data[i>0?i-1:i][this.options.yAttr];return isNaN(dy)||0===dx?0:dy/dx*100},onPointAdded:(_,i)=>{let dz=this._data[i][this.options.yAttr]-this._data[i>0?i-1:i][this.options.yAttr];dz>0?this.track_info.ascent=(this.track_info.ascent||0)+dz:dz<0&&(this.track_info.descent=(this.track_info.descent||0)-dz)},stats:{max:_.iMax,min:_.iMin,avg:_.iAvg},scale:{axis:"y",position:"right",scale:{min:-1,max:1},tickPadding:16,labelX:25,labelY:-8},path:{label:"Slope",yAttr:"slope",scaleX:"distance",scaleY:"slope",color:"#F00",strokeColor:"#000",strokeOpacity:"0.5",fillOpacity:"0.25"},tooltip:{chart:item=>L._("m: ")+item.slope+slope.label,marker:item=>Math.round(item.slope)+slope.label,order:40},summary:{minslope:{label:"Min Slope: ",value:(track,unit)=>Math.round(track.slope_min||0)+" "+unit,order:40},maxslope:{label:"Max Slope: ",value:(track,unit)=>Math.round(track.slope_max||0)+" "+unit,order:41},avgslope:{label:"Avg Slope: ",value:(track,unit)=>Math.round(track.slope_avg||0)+" "+unit,order:42},ascent:{label:"Total Ascent: ",value:(track,unit)=>Math.round(track.ascent||0)+" "+(this.options.imperial?"ft":"m"),order:43},descent:{label:"Total Descent: ",value:(track,unit)=>Math.round(track.descent||0)+" "+(this.options.imperial?"ft":"m"),order:45}}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Speed(){const _=L.Control.Elevation.Utils;let opts=this.options,speed={};return speed.label=opts.speedLabel||L._(opts.imperial?"mph":"km/h"),opts.speedFactor=opts.speedFactor||1,{name:"speed",required:this.options.acceleration,unit:speed.label,deltaMax:this.options.speedDeltaMax,clampRange:this.options.speedRange,decimals:2,pointToAttr:(_,i)=>{let dx=1e3*(this._data[i].dist-this._data[i>0?i-1:i].dist),dt=this._data[i].time-this._data[i>0?i-1:i].time;return dt>0?Math.abs(dx/dt*opts.timeFactor)*opts.speedFactor:0},stats:{max:_.iMax,min:_.iMin,avg:_.iAvg},scale:this.options.speed&&"summary"!=this.options.speed&&{axis:"y",position:"right",scale:{min:0,max:1},tickPadding:16,labelX:25,labelY:-8},path:this.options.speed&&"summary"!=this.options.speed&&{label:"Speed",yAttr:"speed",scaleX:"distance",scaleY:"speed",color:"#03ffff",strokeColor:"#000",strokeOpacity:"0.5",fillOpacity:"0.25"},tooltip:this.options.speed&&{chart:item=>L._("v: ")+item.speed+" "+speed.label,marker:item=>Math.round(item.speed)+" "+speed.label,order:50},summary:this.options.speed&&{minspeed:{label:"Min Speed: ",value:(track,unit)=>Math.round(track.speed_min||0)+" "+unit,order:51},maxspeed:{label:"Max Speed: ",value:(track,unit)=>Math.round(track.speed_max||0)+" "+unit,order:51},avgspeed:{label:"Avg Speed: ",value:(track,unit)=>Math.round(track.speed_avg||0)+" "+unit,order:52}}}}
|
package/src/handlers/time.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function Time(){const _=L.Control.Elevation.Utils;let opts=this.options,time={};return time.label=opts.timeLabel||"t",opts.timeFactor=opts.timeFactor||3600,this._timeAVGSpeed=(opts.timeAVGSpeed||3.6)*(opts.speedFactor||1),opts.timeFormat?"time"==opts.timeFormat?opts.timeFormat=time=>new Date(time).toLocaleTimeString():"date"==opts.timeFormat&&(opts.timeFormat=time=>new Date(time).toLocaleDateString()):opts.timeFormat=time=>new Date(time).toLocaleString().replaceAll("/","-").replaceAll(","," "),opts.xTimeFormat=opts.xTimeFormat||(t=>_.formatTime(t).split("'")[0]),{name:"time",required:this.options.speed||this.options.acceleration||this.options.timestamps,coordinateProperties:["coordTimes","times","time"],coordPropsToMeta:_.parseDate,pointToAttr:function(point,i){if(!point.meta||!point.meta.time)if(point.meta=point.meta||{},i>0){let dx=this._data[i].dist-this._data[i-1].dist,t0=this._data[i-1].time.getTime();point.meta.time=new Date(t0+dx/this._timeAVGSpeed*this.options.timeFactor*1e3)}else point.meta.time=new Date(Date.now());let time=point.meta.time.getTime()-60*point.meta.time.getTimezoneOffset()*1e3!=0?point.meta.time:0;return this._data[i].duration=i>0?(this._data[i-1].duration||0)+Math.abs(time-this._data[i-1].time):0,time},onPointAdded:(_,i)=>this.track_info.time=this._data[i].duration,scale:opts.time&&"summary"!=opts.time&&!L.Browser.mobile&&{axis:"x",position:"top",scale:{attr:"duration",min:0},label:time.label,labelY:-10,labelX:()=>this._width(),name:"time",ticks:()=>_.clamp(this._chart._xTicks()/2,[4,1/0]),tickFormat:d=>0==d?"":opts.xTimeFormat(d),onAxisMount:axis=>{axis.select(".domain").remove(),axis.selectAll("text").attr("opacity",.65).style("font-family","Monospace").style("font-size","110%"),axis.selectAll(".tick line").attr("y2",this._height()).attr("stroke-dasharray",2).attr("opacity",.75)}},tooltips:[this.options.time&&{name:"time",chart:item=>L._("T: ")+_.formatTime(item.duration||0),order:20},this.options.timestamps&&{name:"date",chart:item=>L._("t: ")+this.options.timeFormat(item.time),order:21}],summary:this.options.time&&{tottime:{label:"Total Time: ",value:track=>_.formatTime(track.time||0),order:20}}}}
|