@raruto/leaflet-elevation 2.2.7 → 2.2.8
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.js +31 -34
- package/dist/leaflet-elevation.js.map +1 -1
- package/dist/leaflet-elevation.min.js +1 -1
- package/dist/leaflet-elevation.min.js.map +1 -1
- package/libs/leaflet-distance-marker.js +1 -1
- package/libs/leaflet-distance-marker.min.js +1 -1
- package/package.json +1 -1
- package/src/components/d3.js +1 -1
- package/src/control.js +31 -33
- package/src/handlers/acceleration.js +1 -1
- package/src/handlers/altitude.js +0 -1
- package/src/handlers/pace.js +1 -1
- package/src/handlers/slope.js +1 -1
- package/src/handlers/speed.js +1 -1
- package/src/options.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["/**\r\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\r\n **/\r\nexport const Colors = {\r\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\r\n\t'magenta' : { area: '#FF005E' },\r\n\t'yellow' : { area: '#FF0' },\r\n\t'purple' : { area: '#732C7B' },\r\n\t'steelblue': { area: '#4682B4' },\r\n\t'red' : { area: '#F00' },\r\n\t'lime' : { area: '#9CC222', line: '#566B13' }\r\n};\r\n\r\nconst SEC = 1000;\r\nconst MIN = SEC * 60;\r\nconst HOUR = MIN * 60;\r\nconst DAY = HOUR * 24;\r\n\r\n/**\r\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\r\n */\r\nexport function formatTime(t) {\r\n\tlet d = Math.floor(t / DAY);\r\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\r\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\r\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\r\n\tif ( s === 60 ) { m++; s = 0; }\r\n\tif ( m === 60 ) { h++; m = 0; }\r\n\tif ( h === 24 ) { d++; h = 0; }\r\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\r\n}\r\n\r\n/**\r\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\r\n */\r\n export function formatDate(format) {\r\n\tif (!format) {\r\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\r\n\t} else if (format == 'time') {\r\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\r\n\t} else if (format == 'date') {\r\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\r\n\t}\r\n\treturn (time) => format(time);\r\n}\r\n\r\n/**\r\n * Generate download data event.\r\n */\r\n export function saveFile(dataURI, fileName) {\r\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\r\n\tlet b = document.body;\r\n\tb.appendChild(a);\r\n\ta.click();\r\n\tb.removeChild(a);\r\n}\r\n\r\n\r\n/**\r\n * Convert SVG Path into Path2D and then update canvas\r\n */\r\n export function drawCanvas(ctx, path) {\r\n\tpath.classed('canvas-path', true);\r\n\r\n\tctx.beginPath();\r\n\tctx.moveTo(0, 0);\r\n\tlet p = new Path2D(path.attr('d'));\r\n\r\n\tctx.strokeStyle = path.attr('stroke');\r\n\tctx.fillStyle = path.attr('fill');\r\n\tctx.lineWidth = 1.25;\r\n\tctx.globalCompositeOperation = 'source-over';\r\n\r\n\t// stroke opacity\r\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\r\n\tctx.stroke(p);\r\n\r\n\t// fill opacity\r\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\r\n\tctx.fill(p);\r\n\r\n\tctx.globalAlpha = 1;\r\n\r\n\tctx.closePath();\r\n}\r\n\r\n/**\r\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\r\n */\r\nexport function coordPropsToMeta(coordProps, name, parser) {\r\n\treturn coordProps && (({props, point, id, isMulti }) => {\r\n\t\tif (props) {\r\n\t\t\tfor (const key of coordProps) {\r\n\t\t\t\tif (key in props) {\r\n\t\t\t\t\tpoint.meta[name] = (parser || parseNumeric).call(this, (isMulti ? props[key][isMulti] : props[key]), id);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Extract numeric property (id) from GeoJSON object\r\n */\r\nexport const parseNumeric = (property, id) => parseInt((typeof property === 'object' ? property[id] : property));\r\n\r\n/**\r\n * Extract datetime property (id) from GeoJSON object\r\n */\r\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\r\n\r\n/**\r\n * A little bit shorter than L.DomUtil\r\n */\r\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\r\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\r\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\r\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\r\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\r\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\r\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\r\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\r\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; };\r\nexport const append = (n, c) => n.appendChild(c);\r\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\r\nexport const select = (str, n) => (n || document).querySelector(str);\r\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\r\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\r\n\r\n/**\r\n * TODO: use generators instead? (ie. \"yield\")\r\n */\r\nexport const iMax = (iVal, max = -Infinity) => (iVal > max ? iVal : max); \r\nexport const iMin = (iVal, min = +Infinity) => (iVal < min ? iVal : min);\r\nexport const iAvg = (iVal, avg = 0, idx = 1) => (iVal + avg * (idx - 1)) / idx;\r\nexport const iSum = (iVal, sum = 0) => iVal + sum;\r\n\r\n/**\r\n * Alias for some leaflet core functions\r\n */\r\nexport const { on, off } = L.DomEvent;\r\nexport const { throttle, wrapNum } = L.Util;\r\nexport const { hasClass } = L.DomUtil;\r\n\r\n/**\r\n * Limit floating point precision\r\n */\r\nexport const round = L.Util.formatNum;\r\n\r\n/**\r\n * Limit a number between min / max values\r\n */\r\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\r\n\r\n/**\r\n * Limit a delta difference between two values\r\n */\r\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\r\n\r\nexport var Options = {\r\n\tautofitBounds: true,\r\n\tautohide: false,\r\n\tautohideMarker: true,\r\n\talmostover: true,\r\n\taltitude: true,\r\n\tcloseBtn: true,\r\n\tcollapsed: false,\r\n\tdetached: true,\r\n\tdistance: true,\r\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\r\n\tdragging: !L.Browser.mobile,\r\n\tdownloadLink: 'link',\r\n\televationDiv: \"#elevation-div\",\r\n\tfollowMarker: true,\r\n\timperial: false,\r\n\tlegend: true,\r\n\thandlers: [\"Distance\", \"Time\", \"Altitude\", \"Slope\", \"Speed\", \"Acceleration\"],\r\n\thotline: 'elevation',\r\n\tmarker: 'elevation-line',\r\n\tmarkerIcon: L.divIcon({\r\n\t\tclassName: 'elevation-position-marker',\r\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\r\n\t\ticonSize: [32, 32],\r\n\t\ticonAnchor: [16, 16],\r\n\t}),\r\n\tposition: \"topright\",\r\n\tpolyline: {\r\n\t\tclassName: 'elevation-polyline',\r\n\t\tcolor: '#000',\r\n\t\topacity: 0.75,\r\n\t\tweight: 5,\r\n\t\tlineCap: 'round'\r\n\t},\r\n\tpolylineSegments: {\r\n\t\tclassName: 'elevation-polyline-segments',\r\n\t\tcolor: '#F00',\r\n\t\tinteractive: false,\r\n\t},\r\n\tpreferCanvas: false,\r\n\treverseCoords: false,\r\n\truler: true,\r\n\ttheme: \"lightblue-theme\",\r\n\tsummary: 'inline',\r\n\tslope: false,\r\n\tspeed: false,\r\n\ttime: true,\r\n\ttimeFactor: 3600,\r\n\ttimestamps: false,\r\n\ttrkStart: { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false },\r\n\ttrkEnd: { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false },\r\n\twaypoints: true,\r\n\twptIcons: {\r\n\t\t'': L.divIcon({\r\n\t\t\tclassName: 'elevation-waypoint-marker',\r\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\r\n\t\t\ticonSize: [30, 30],\r\n\t\t\ticonAnchor: [8, 30],\r\n\t\t}),\r\n\t},\r\n\twptLabels: true,\r\n\txAttr: \"dist\",\r\n\txLabel: \"km\",\r\n\tyAttr: \"z\",\r\n\tyLabel: \"m\",\r\n\tzFollow: false,\r\n\tzooming: !L.Browser.Mobile,\r\n\r\n\t// Quite uncommon and undocumented options\r\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\r\n\theight: (screen.height * 0.3) || 200,\r\n\twidth: (screen.width * 0.6) || 600,\r\n\txTicks: undefined,\r\n\tyTicks: undefined,\r\n\r\n\tdecimalsX: 2,\r\n\tdecimalsY: 0,\r\n\tforceAxisBounds: false,\r\n\tinterpolation: \"curveLinear\",\r\n\tskipNullZCoords: false,\r\n\tyAxisMax: undefined,\r\n\tyAxisMin: undefined,\r\n};\r\n","import * as _ from './utils';\r\nimport { Options } from './options';\r\n\r\n// \"leaflet-i18n\" fallback\r\nif (!L._ || !L.i18n) {\r\n\tL._ = L.i18n = (string, data) => string;\r\n}\r\n\r\n// Prevent CORS issues for relative locations (dynamic import)\r\nconst baseURL = ((document.currentScript && document.currentScript.src) || (import.meta && import.meta.url)).split(\"/\").slice(0,-1).join(\"/\") + '/';\r\n\r\nexport const Elevation = L.Control.Elevation = L.Control.extend({\r\n\r\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\r\n\r\n\toptions: Options,\r\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\r\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\r\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\r\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\r\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\r\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\r\n\t__LHOTLINE: '../libs/leaflet-hotline.min.js',\r\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\r\n\t__LCHART: '../src/components/chart.js',\r\n\t__LMARKER: '../src/components/marker.js',\r\n\t__LSUMMARY: '../src/components/summary.js',\r\n\t__modulesFolder: '../src/handlers/',\r\n\t__btnIcon: baseURL + '../images/elevation.svg',\r\n\r\n\t/*\r\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\r\n\t */\r\n\taddData: function(d, layer) {\r\n\t\tthis.import(this.__D3)\r\n\t\t\t.then(() => {\r\n\t\t\t\tif (this._modulesLoaded) {\r\n\t\t\t\t\tlayer = layer ?? (d.on && d);\r\n\t\t\t\t\tthis._addData(d);\r\n\t\t\t\t\tthis._addLayer(layer);\r\n\t\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.once('modules_loaded', () => this.addData(d,layer));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Adds the control to the given map.\r\n\t */\r\n\taddTo: function(map) {\r\n\t\tif (this.options.detached) {\r\n\t\t\tlet parent = _.select(this.options.elevationDiv);\r\n\t\t\tlet eleDiv = this.onAdd(map);\r\n\t\t\tparent ? _.append(parent, eleDiv) : _.insert(map.getContainer(), eleDiv, 'afterend');\r\n\t\t} else {\r\n\t\t\tL.Control.prototype.addTo.call(this, map);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/*\r\n\t * Reset data and display\r\n\t */\r\n\tclear: function() {\r\n\t\tif (this._marker) this._marker.remove();\r\n\t\tif (this._chart) this._clearChart();\r\n\t\tif (this._layers) this._clearLayers(this._layers);\r\n\t\tif (this._markers) this._clearLayers(this._markers);\r\n\t\tif (this._circleMarkers) this._circleMarkers.remove();\r\n\t\tif (this._hotline) this._clearLayers(this._hotline);\r\n\r\n\t\tthis._data = [];\r\n\t\tthis.track_info = {};\r\n\r\n\t\tthis._fireEvt(\"eledata_clear\");\r\n\r\n\t\tthis._updateChart();\r\n\t},\r\n\r\n\t_clearChart: function() {\r\n\t\tif (this._events && this._events.elechart_updated) {\r\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\r\n\t\t}\r\n\t\tif (this._chart && this._chart._container) {\r\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\r\n\t\t\tthis._chart.clear();\r\n\t\t}\r\n\t},\r\n\r\n\t_clearLayers: function(l) {\r\n\t\tl = l || this._layers;\r\n\t\tif (l && l.eachLayer) {\r\n\t\t\tl.eachLayer(f => f.remove())\r\n\t\t\tl.clearLayers();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\r\n\t * \r\n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\r\n\t */\r\n\t// addHandler: function (name, HandlerClass) {\r\n\t// \tif (HandlerClass) {\r\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\r\n\t// \t\tthis.handlers.push(handler);\r\n\t// \t\tif (this.options[name]) {\r\n\t// \t\t\thandler.enable();\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \treturn this;\r\n\t// },\r\n\r\n\t/**\r\n\t * Disable chart brushing.\r\n\t */\r\n\tdisableBrush: function() {\r\n\t\tthis._chart._brushEnabled = false;\r\n\t\tthis._resetDrag();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart brushing.\r\n\t */\r\n\tenableBrush: function() {\r\n\t\tthis._chart._brushEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Disable chart zooming.\r\n\t */\r\n\tdisableZoom: function() {\r\n\t\tthis._chart._zoomEnabled = false;\r\n\t\tthis._chart._resetZoom();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart zooming.\r\n\t */\r\n\tenableZoom: function() {\r\n\t\tthis._chart._zoomEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Sets a map view that contains the given geographical bounds.\r\n\t */\r\n\tfitBounds: function(bounds) {\r\n\t\tbounds = bounds || this.getBounds();\r\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\r\n\t},\r\n\r\n\tgetBounds: function(data) {\r\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\r\n\t},\r\n\r\n\t/**\r\n\t * Get default zoom level (followMarker: true).\r\n\t */\r\n\tgetZFollow: function() {\r\n\t\treturn this.options.zFollow;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\thide: function() {\r\n\t\t_.style(this._container, \"display\", \"none\");\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize chart control \"options\" and \"container\".\r\n\t */\r\n\tinitialize: function(opts) {\r\n\r\n\t\topts = L.setOptions(this, opts);\r\n\r\n\t\tthis._data = [];\r\n\t\tthis._layers = L.featureGroup();\r\n\t\tthis._markers = L.featureGroup();\r\n\t\tthis._hotline = L.featureGroup();\r\n\t\tthis._circleMarkers = L.featureGroup();\r\n\t\tthis._markedSegments = L.polyline([]);\r\n\t\tthis._start = L.circleMarker([0,0], (opts.trkStart || Options.trkStart));\r\n\t\tthis._end = L.circleMarker([0,0], (opts.trkEnd || Options.trkEnd));\r\n\t\tthis._chartEnabled = true;\r\n\t\tthis._yCoordMax = -Infinity;\r\n\t\tthis.track_info = {};\r\n\t\t// this.handlers = [];\r\n\r\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\r\n\t\tif (opts.legend) opts.margins.bottom += 30;\r\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\r\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\r\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\r\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\r\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\r\n\r\n\r\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\r\n\r\n\t\t// Leaflet canvas renderer colors\r\n\t\tL.extend(_.Colors, opts.colors || {});\r\n\r\n\t\t// Various stuff\r\n\t\tthis._fixCanvasPaths();\r\n\t\tthis._fixTooltipSize();\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Javascript scripts downloader (lazy loader)\r\n\t */\r\n\timport: function(src, condition) {\r\n\t\tswitch(src) {\r\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\r\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\r\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\r\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\r\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\r\n\t\t\tcase this.__LHOTLINE: condition = typeof L.Hotline !== 'function'; break;\r\n\t\t}\r\n\t\tsrc = (src.startsWith('../') || src.startsWith('./') ? baseURL : '') + src;\r\n\t\treturn condition !== false ? import(src) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\r\n\t */\r\n\tload: function(data) {\r\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\r\n\t},\r\n\r\n\t/**\r\n\t * Create container DOM element and related event listeners.\r\n\t * Called on control.addTo(map).\r\n\t */\r\n\tonAdd: function(map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control \" + this.options.theme + \" \" + (this.options.detached ? 'elevation-detached' : 'leaflet-control'), this.options.detached ? { id: 'elevation-' + _.randomId() } : {});\r\n\r\n\t\tif (!this.eleDiv) this.eleDiv = container;\r\n\r\n\t\tthis._loadModules(this.options.handlers).then(() => { // Inject here required modules (data handlers)\r\n\t\t\tthis._initChart(container);\r\n\t\t\tthis._initButton(container);\r\n\t\t\tthis._initSummary(container);\r\n\t\t\tthis._initMarker(map);\r\n\t\t\tthis._initLayer(map);\r\n\t\t\tthis._modulesLoaded = true;\r\n\t\t\tthis.fire('modules_loaded');\r\n\t\t});\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\t/**\r\n\t * Clean up control code and related event listeners.\r\n\t * Called on control.remove().\r\n\t */\r\n\tonRemove: function(map) {\r\n\t\tthis._container = null;\r\n\r\n\t\tmap\r\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t.off('resize', this._resetView, this)\r\n\t\t\t.off('resize', this._resizeChart, this)\r\n\t\t\t.off('mousedown', this._resetDrag, this);\r\n\r\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\tthis\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\tthis.fire('remove');\r\n\t},\r\n\r\n\t/**\r\n\t * Redraws the chart control. Sometimes useful after screen resize.\r\n\t */\r\n\tredraw: function() {\r\n\t\tthis._resizeChart();\r\n\t},\r\n\r\n\t/**\r\n\t * Set default zoom level (followMarker: true).\r\n\t */\r\n\tsetZFollow: function(zoom) {\r\n\t\tthis.options.zFollow = zoom;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\tshow: function() {\r\n\t\t_.style(this._container, \"display\", \"block\");\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\r\n\t */\r\n\t_addData: function(d) {\r\n\t\tif (!d) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Standard GeoJSON\r\n\t\tif (d.type === \"FeatureCollection\" ) {\r\n\t\t\treturn _.each(d.features, feature => this._addData(feature));\r\n\t\t} else if (d.type === \"Feature\") {\r\n\t\t\tlet geom = d.geometry;\r\n\t\t\tif (geom) {\r\n\t\t\t\tswitch (geom.type) {\r\n\t\t\t\t\tcase 'LineString':\t\treturn this._addGeoJSONData(geom.coordinates, d.properties);\r\n\t\t\t\t\tcase 'MultiLineString':\treturn _.each(geom.coordinates, (coords, i) => this._addGeoJSONData(coords, d.properties, i));\r\n\t\t\t\t\tcase 'Point':\r\n\t\t\t\t\tdefault:\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fallback for leaflet layers (eg. L.Gpx)\r\n\t\tif (d._latlngs) {\r\n\t\t\treturn this._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\r\n\t */\r\n\t_addGeoJSONData: function(coords, properties, nestingLevel) {\r\n\r\n\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\r\n\t\tlet props = (properties && properties.coordinateProperties) || properties;\r\n\r\n\t\tcoords.forEach((point, i) => {\r\n\r\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\r\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\r\n\t\t\t\r\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\r\n\r\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i, isMulti: nestingLevel });\r\n\r\n\t\t\tthis._addPoint(\r\n\t\t\t\tpoint.lat ?? point[1], \r\n\t\t\t\tpoint.lng ?? point[0],\r\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\r\n\t\t\t);\r\n\r\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\r\n\r\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\r\n\t},\r\n\r\n\t/*\r\n\t * Parse and push a single (x, y, z) point to current elevation profile.\r\n\t */\r\n\t_addPoint: function(x, y, z) {\r\n\t\tif (this.options.reverseCoords) {\r\n\t\t\t[x, y] = [y, x];\r\n\t\t}\r\n\r\n\t\tthis._data.push({\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z,\r\n\t\t\tlatlng: L.latLng(x, y, z)\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\r\n\t},\r\n\r\n\t_addLayer: function(layer) {\r\n\t\tif (layer) this._layers.addLayer(layer)\r\n\t\t// Postpone adding the distance markers (lazy: true)\r\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\r\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\r\n\t\t}\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_addMarker: function(marker) {\r\n\t\tif (marker) this._markers.addLayer(marker)\r\n\t\treturn marker;\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" integration\r\n\t */\r\n\t_initAlmostOverHandler: function(map, layer) {\r\n\t\treturn (map && this.options.almostOver && !L.Browser.mobile) ? Promise.all([\r\n\t\t\tthis.import(this.__LGEOMUTIL),\r\n\t\t\tthis.import(this.__LALMOSTOVER)\r\n\t\t]).then(() => {\r\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\r\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\r\n\t\t\t\tmap.almostOver.addLayer(layer);\r\n\t\t\t\tmap\r\n\t\t\t\t\t.on('almost:move', (e) => this._onMouseMoveLayer(e))\r\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\r\n\t\t\t}\r\n\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.DistanceMarkers\" integration\r\n\t */\r\n\t_initDistanceMarkers: function() {\r\n\t\treturn this.options.distanceMarkers ? Promise.all([this.import(this.__LGEOMUTIL), this.import(this.__LDISTANCEM)]) : Promise.resolve();\r\n\t},\r\n\r\n\t_initHotLine: function(layer) {\r\n\t\tlet prop = typeof this.options.hotline == 'string' ? this.options.hotline : 'elevation';\r\n\t\treturn this.options.hotline ? this.import(this.__LHOTLINE)\r\n\t\t\t.then(() => {\r\n\t\t\t\tlayer.eachLayer((trkseg) => {\r\n\t\t\t\t\tif(trkseg.feature.geometry.type != \"Point\") {\r\n\t\t\t\t\t\tlet geo = L.geoJson(trkseg.toGeoJSON(), { coordsToLatLng: (coords) => L.latLng(coords[0], coords[1], coords[2] * (this.options.altitudeFactor || 1))});\r\n\t\t\t\t\t\tlet line = L.hotline(geo.toGeoJSON().features[0].geometry.coordinates, {\r\n\t\t\t\t\t\t\trenderer: L.Hotline.renderer(),\r\n\t\t\t\t\t\t\tmin: isFinite(this.track_info[prop + '_min']) ? this.track_info[prop + '_min'] : 0,\r\n\t\t\t\t\t\t\tmax: isFinite(this.track_info[prop + '_max']) ? this.track_info[prop + '_max'] : 1,\r\n\t\t\t\t\t\t\tpalette: {\r\n\t\t\t\t\t\t\t\t0.0: '#008800',\r\n\t\t\t\t\t\t\t\t0.5: '#ffff00',\r\n\t\t\t\t\t\t\t\t1.0: '#ff0000'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tweight: 5,\r\n\t\t\t\t\t\t\toutlineColor: '#000000',\r\n\t\t\t\t\t\t\toutlineWidth: 1\r\n\t\t\t\t\t\t}).addTo(this._hotline);\r\n\t\t\t\t\t\tlet alpha = trkseg.options.style && trkseg.options.style.opacity || 1;\r\n\t\t\t\t\t\ttrkseg.on('add remove', ({type}) => {\r\n\t\t\t\t\t\t\ttrkseg.setStyle({opacity: (type == 'add' ? 0 : alpha)});\r\n\t\t\t\t\t\t\tline[(type == 'add' ? 'addTo' : 'removeFrom')](trkseg._map);\r\n\t\t\t\t\t\t\tif (line._renderer) line._renderer._container.parentElement.insertBefore(line._renderer._container, line._renderer._container.parentElement.firstChild);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\r\n\t */\r\n\t_initMapIntegrations: function(layer) {\r\n\t\tlet map = this._map;\r\n\t\tif (map) {\r\n\t\t\tif (this._data.length) {\r\n\t\t\t\tthis._start.setLatLng(this._data[0].latlng);\r\n\t\t\t\tthis._end.setLatLng(this._data[this._data.length -1].latlng);\r\n\t\t\t}\r\n\t\t\tPromise.all([\r\n\t\t\t\tthis._initHotLine(layer),\r\n\t\t\t\tthis._initAlmostOverHandler(map, layer),\r\n\t\t\t\tthis._initDistanceMarkers(),\r\n\t\t\t]).then(() => {\r\n\t\t\t\tif\t(this.options.polyline) {\r\n\t\t\t\t\tlayer.addTo(map);\r\n\t\t\t\t\tthis._circleMarkers.addTo(map);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.options.autofitBounds) {\r\n\t\t\t\t\tthis.fitBounds(layer.getBounds());\r\n\t\t\t\t}\r\n\t\t\t\tmap.invalidateSize();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.once('add', () => this._initMapIntegrations(layer));\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Collapse current chart control.\r\n\t */\r\n\t_collapse: function() {\r\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/*\r\n\t * Expand current chart control.\r\n\t */\r\n\t_expand: function() {\r\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/**\r\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\r\n\t */\r\n\t_fixCanvasPaths: function() {\r\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\r\n\t\tlet control = this;\r\n\r\n\t\tlet theme = this.options.theme.split(' ')[0].replace('-theme', '');\r\n\t\tlet color = _.Colors[theme] || {};\r\n\r\n\t\tL.Canvas.include({\r\n\t\t\t_fillStroke: function(ctx, layer) {\r\n\t\t\t\tif (control._layers.hasLayer(layer)) {\r\n\r\n\t\t\t\t\tlet options = layer.options;\r\n\r\n\t\t\t\t\toptions.color = color.line || color.area || theme;\r\n\t\t\t\t\toptions.stroke = !!options.color;\r\n\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\r\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\r\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\r\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\r\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\r\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\r\n\t\t\t\t\t\tctx.stroke();\r\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Partial fix for initial tooltip size\r\n\t * \r\n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\r\n\t */\r\n\t_fixTooltipSize: function() {\r\n\t\tthis.on('elechart_init', () =>\r\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\r\n\t\t\t\tif (this._chartEnabled) {\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t}\r\n\t\t\t\tthis._updateMarker(data);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given LatLng\r\n\t */\r\n\t_findItemForLatLng: function(latlng) {\r\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given xDiagCoord\r\n\t */\r\n\t_findItemForX: function(x) {\r\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\r\n\t},\r\n\r\n\t/**\r\n\t * Fires an event of the specified type.\r\n\t */\r\n\t_fireEvt: function(type, data, propagate) {\r\n\t\tif (this.fire) this.fire(type, data, propagate);\r\n\t\tif (this._map) this._map.fire(type, data, propagate);\r\n\t},\r\n\r\n\t/*\r\n\t * Hides the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_hideMarker: function() {\r\n\t\tif (this.options.autohideMarker) {\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Generate \"svg\" chart (DOM element).\r\n\t */\r\n\t_initChart: function(container) {\r\n\t\tlet opts = this.options;\r\n\t\tlet map = this._map;\r\n\r\n\t\tif (opts.detached) {\r\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\r\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\r\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\r\n\t\t} else {\r\n\t\t\tlet { clientWidth } = map.getContainer();\r\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\r\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\r\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\r\n\t\t}\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LCHART)\r\n\t\t]).then((m) => {\r\n\r\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\td3\r\n\t\t\t\t.select(container)\r\n\t\t\t\t.call(chart.render())\r\n\t\r\n\t\t\tchart\r\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\r\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\r\n\t\t\t\t.on('dragged', this._onDragEnd, this)\r\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\r\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\r\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\r\n\t\t\t\t.on('zoom', this._updateChart, this)\r\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\r\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\r\n\t\r\n\t\r\n\t\t\tthis.fire(\"elechart_init\");\r\n\r\n\t\t\tmap\r\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t\t.on('resize', this._resetView, this)\r\n\t\t\t\t.on('resize', this._resizeChart, this)\r\n\t\t\t\t.on('rotate', this._rotateMarker, this)\r\n\t\t\t\t.on('mousedown', this._resetDrag, this);\r\n\r\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\t\tthis\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\t\tthis._updateChart();\r\n\t\t\tthis._updateSummary();\r\n\t\t});\r\n\r\n\r\n\t},\r\n\r\n\t_initLayer: function() {\r\n\t\tthis._layers\r\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\r\n\t\t\t\tlet node = layer.getElement && layer.getElement();\r\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\r\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\r\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\r\n\t\t\t});\r\n\t},\r\n\r\n\t_initMarker: function(map) {\r\n\t\tlet pane = map.getPane('elevationPane');\r\n\t\tif (!pane) {\r\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\r\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\r\n\t\t\tpane.style.pointerEvents = 'none';\r\n\t\t}\r\n\r\n\t\tif (this._renderer) this._renderer.remove()\r\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LMARKER)\r\n\t\t]).then((m) => {\r\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\r\n\t\t\tthis.fire(\"elechart_marker\");\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Inspired by L.Control.Layers\r\n\t */\r\n\t_initButton: function(container) {\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(container)\r\n\t\t\t.disableScrollPropagation(container);\r\n\r\n\t\tthis.options.collapsed ? this._collapse() : this._expand();\r\n\r\n\t\tif (this.options.autohide) {\r\n\t\t\t_.on(container, 'mouseover', this._expand, this);\r\n\t\t\t_.on(container, 'mouseout', this._collapse, this);\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.closeBtn) {\r\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle-icon\", { href: '#', title: L._('Elevation'), }, container);\r\n\t\t\t_.on(link, 'click', L.DomEvent.stop);\r\n\t\t\t_.on(link, 'click', this._toggle, this);\r\n\t\t\t_.on(link, 'focus', this._toggle, this);\r\n\t\t\tfetch(this.__btnIcon).then(r => r.ok && r.text().then(img => link.innerHTML = img));\r\n\t\t}\r\n\t},\r\n\r\n\t_initSummary: function(container) {\r\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\r\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\r\n\r\n\t\t\tthis.on('elechart_init', () => {\r\n\t\t\t\td3.select(container).call(this._summary.render());\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Retrieve data from a remote url (HTTP).\r\n\t */\r\n\t_loadFile: function(url) {\r\n\t\tfetch(url)\r\n\t\t\t.then((response) => response.text())\r\n\t\t\t.then((data) => {\r\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\r\n\t\t\t\tthis._parseFromString(data)\r\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\r\n\t\t\t}).catch((err) => console.warn(err));\r\n\t},\r\n\r\n\t/**\r\n\t * Dynamically import only required javascript modules (code splitting)\r\n\t */\r\n\t_loadModules: function(handlers) {\r\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\r\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof Elevation[h] !== \"undefined\" ? Elevation[h] : h);\r\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\r\n\t\tlet modules = handlers.map(file => (typeof file === 'string' && this.import(this.__modulesFolder + file.toLowerCase() + '.js')) || (file instanceof Promise && file) || Promise.resolve());\r\n\t\treturn Promise.all(modules).then((m) => {\r\n\t\t\t_.each(m, (exported, i) => {\r\n\t\t\t\tlet fn = exported && Object.keys(exported)[0];\r\n\t\t\t\tif (fn) {\r\n\t\t\t\t\thandlers[i] = Elevation[fn] = (Elevation[fn] ?? exported[fn]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_.each(handlers, h => [\"function\", \"object\"].includes(typeof h) && this._registerHandler(h));\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON data loader (L.GeoJSON).\r\n\t */\r\n\t_loadLayer: function(geojson) {\r\n\t\tlet { polyline, theme, waypoints, wptIcons, wptLabels, distanceMarkers } = this.options;\r\n\t\tlet style = L.extend({}, polyline);\r\n\r\n\t\tif (theme) {\r\n\t\t\tstyle.className += ' ' + theme;\r\n\t\t}\r\n\r\n\t\tif (geojson.name) {\r\n\t\t\tthis.track_info.name = geojson.name;\r\n\t\t}\r\n\r\n\t\tlet layer = L.geoJson(geojson, {\r\n\t\t\tdistanceMarkers: distanceMarkers,\r\n\t\t\tstyle: style,\r\n\t\t\tpointToLayer: (feature, latlng) => {\r\n\t\t\t\tif (waypoints) {\r\n\t\t\t\t\tlet { desc, name, sym } = feature.properties;\r\n\t\t\t\t\tdesc = desc || '';\r\n\t\t\t\t\tname = name || '';\r\n\t\t\t\t\t// Handle chart waypoints (dots)\r\n\t\t\t\t\tif ([true, 'dots'].includes(waypoints)) {\r\n\t\t\t\t\t\tthis._registerCheckPoint({\r\n\t\t\t\t\t\t\tlatlng: latlng,\r\n\t\t\t\t\t\t\tlabel : ([true, 'dots'].includes(wptLabels) ? name : '')\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Handle map waypoints (markers)\r\n\t\t\t\t\tif ([true, 'markers'].includes(waypoints) && wptIcons != false) {\r\n\t\t\t\t\t\treturn this._registerMarker({\r\n\t\t\t\t\t\t\tlatlng : latlng,\r\n\t\t\t\t\t\t\tsym : (sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase(),\r\n\t\t\t\t\t\t\tcontent: [true, 'markers'].includes(wptLabels) && (name || desc) && decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''))\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonEachFeature: (feature, layer) => feature.geometry && feature.geometry.type != 'Point' && this.addData(feature, layer),\r\n\t\t});\r\n\r\n\t\tthis.import(this.__D3).then(() => {\r\n\t\t\tthis._initMapIntegrations(layer);\r\n\t\t\tthis._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info });\r\n\t\t});\r\n\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_onDragEnd: function({ dragstart, dragend}) {\r\n\t\tthis._hideMarker();\r\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\r\n\r\n\t\tthis.fire(\"elechart_dragged\");\r\n\t},\r\n\r\n\t_onKeyDown: function({key}) {\r\n\t\tif(!this.options.detached && key === \"Escape\"){\r\n\t\t\tthis._collapse()\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Trigger mouseenter event.\r\n\t */\r\n\t_onMouseEnter: function() {\r\n\t\tthis.fire('elechart_enter');\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseover the chart and displays distance and altitude level.\r\n\t */\r\n\t_onMouseMove: function({xCoord}) {\r\n\t\tif (this._chartEnabled && this._data.length) {\r\n\t\t\tlet item = this._findItemForX(xCoord);\r\n\t\t\tif (item) {\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\t\t\tthis._setMapView(item);\r\n\r\n\t\t\t\tif (this._map) {\r\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles mouseover events of the data layers on the map.\r\n\t */\r\n\t_onMouseMoveLayer: function({latlng}) {\r\n\t\tif (this._data.length) {\r\n\t\t\tlet item = this._findItemForLatLng(latlng);\r\n\t\t\tif (item) {\r\n\t\t\t\tlet xCoord = item.xDiagCoord;\r\n\t\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\t\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseout over the chart.\r\n\t */\r\n\t_onMouseOut: function() {\r\n\t\tif (!this.options.detached) {\r\n\t\t\tthis._hideMarker();\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t}\r\n\r\n\t\tif (this._map) {\r\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t}\r\n\r\n\t\tthis.fire(\"elechart_leave\");\r\n\t},\r\n\r\n\t/**\r\n\t * Handles the drag event over the ruler filter.\r\n\t */\r\n\t_onRulerFilter: function({coords}) {\r\n\t\tthis._updateMapSegments(coords);\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle chart data on legend click\r\n\t */\r\n\t_onToggleChart: function({ name, enabled }) {\r\n\r\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\r\n\r\n\t\t// toggle layer visibility on empty chart\r\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\r\n\r\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\r\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\r\n\r\n\t\t// remove marker on empty chart\r\n\t\tif (!this._chartEnabled) {\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON Parser\r\n\t */\r\n\t_parseFromGeoJSONString: function(data) {\r\n\t\ttry {\r\n\t\t\treturn JSON.parse(data);\r\n\t\t} catch (e) { }\r\n\t},\r\n\r\n\t/**\r\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\r\n\t */\r\n\t_parseFromString: function(data) {\r\n\t\treturn new Promise(resolve =>\r\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\r\n\t\t\t\tlet geojson;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\r\n\t\t\t\t}\r\n\t\t\t\tif (geojson) {\r\n\t\t\t\t\tgeojson.name = geojson.name || (this._downloadURL || '').split('/').pop().split('#')[0].split('?')[0];\r\n\t\t\t\t}\r\n\t\t\t\tresolve(geojson);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Simple XML Parser (GPX, KML, TCX)\r\n\t */\r\n\t_parseFromXMLString: function(data) {\r\n\t\tif (data.indexOf(\"<\") != 0) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\r\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\r\n\t\tlet name = xml.getElementsByTagName('name');\r\n\t\tif (xml.getElementsByTagName('parsererror').length) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tif (!(type in toGeoJSON)) {\r\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\r\n\t\t}\r\n\t\tlet geojson = toGeoJSON[type](xml);\r\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\r\n\t\treturn geojson;\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart profile to diagram\r\n\t */\r\n\t_registerAreaPath: function(props) {\r\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart grid to diagram\r\n\t */\r\n\t_registerAxisGrid: function(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart axis to diagram\r\n\t */\r\n\t_registerAxisScale: function(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add a point of interest over the diagram\r\n\t */\r\n\t_registerCheckPoint: function(props) {\r\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\r\n\t */\r\n\t _registerDataAttribute: function(props) {\r\n\r\n\t\t// parse of \"coordinateProperties\" for later usage\r\n\t\tif (props.coordPropsToMeta) {\r\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\r\n\t\t}\r\n\r\n\t\t// prevent excessive variabile instanstations\r\n\t\tlet i, curr, prev, attr;\r\n\r\n\t\t// save here a reference to last used point\r\n\t\tlet lastValid = null; \r\n\r\n\t\t// iteration\r\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\r\n\t\t\ti = index;\r\n\r\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\r\n\t\t\tcurr = this._data[i];\r\n\t\t\tattr = props.attr || props.name;\r\n\r\n\t\t\t// check and fix missing data on last added point\r\n\t\t\tif (props.skipNull === false) {\r\n\t\t\t\tlet curr = this._data[i][attr];\r\n\t\t\t\tif(i > 0) {\r\n\t\t\t\t\tlet prev = this._data[i - 1][attr];\r\n\t\t\t\t\tif (isNaN(prev)) {\r\n\t\t\t\t\t\tif (!isNaN(lastValid) && !isNaN(curr)) {\r\n\t\t\t\t\t\t\tprev = (lastValid + curr) / 2;\r\n\t\t\t\t\t\t} else if (!isNaN(lastValid)) {\r\n\t\t\t\t\t\t\tprev = lastValid;\r\n\t\t\t\t\t\t} else if (!isNaN(curr)) {\r\n\t\t\t\t\t\t\tprev = curr;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!isNaN(prev)) return this._data.splice(i - 1, 1);\r\n\t\t\t\t\t\tthis._data[i - 1][attr] = prev;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// update reference to last used point (ie. if it has data)\r\n\t\t\t\tif (!isNaN(curr)) {\r\n\t\t\t\t\tlastValid = curr;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// retrieve point value\r\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\r\n\r\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\r\n\t\t\tif (props.stats) {\r\n\t\t\t\tfor (const key in props.stats) {\r\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\r\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key], this._data.length);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Limit \"crazy\" delta values.\r\n\t\t\tif (props.deltaMax) {\r\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Range of acceptable values.\r\n\t\t\tif (props.clampRange) {\r\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\r\n\t\t\t}\r\n\r\n\t\t\t// Limit floating point precision.\r\n\t\t\tif (!isNaN(props.decimals)) {\r\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\r\n\t\t\t}\r\n\r\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\r\n\t\t\tif(props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Parse a module definition and attach related function listeners\r\n\t */\r\n\t_registerHandler: function(props) {\r\n\r\n\t\t// eg. L.Control.Altitude\r\n\t\tif (typeof props === \"function\") {\r\n\t\t\treturn this._registerHandler(props.call(this));\r\n\t\t}\r\n\r\n\t\tlet {\r\n\t\t\tname,\r\n\t\t\tattr,\r\n\t\t\trequired,\r\n\t\t\tskipNull,\r\n\t\t\tdeltaMax,\r\n\t\t\tclampRange,\r\n\t\t\tdecimals,\r\n\t\t\tmeta,\r\n\t\t\tunit,\r\n\t\t\tcoordinateProperties,\r\n\t\t\tcoordPropsToMeta,\r\n\t\t\tpointToAttr,\r\n\t\t\tonPointAdded,\r\n\t\t\tstats,\r\n\t\t\tstatsName,\r\n\t\t\tgrid,\r\n\t\t\tscale,\r\n\t\t\tpath,\r\n\t\t\ttooltip,\r\n\t\t\tsummary\r\n\t\t} = props;\r\n\r\n\t\t// eg. \"altitude\" == true\r\n\t\tif (this.options[name] || required) {\r\n\r\n\t\t\tthis._registerDataAttribute({\r\n\t\t\t\tname,\r\n\t\t\t\tattr,\r\n\t\t\t\tskipNull,\r\n\t\t\t\tdeltaMax,\r\n\t\t\t\tclampRange,\r\n\t\t\t\tdecimals,\r\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(coordinateProperties, meta || name, coordPropsToMeta),\r\n\t\t\t\tpointToAttr,\r\n\t\t\t\tonPointAdded,\r\n\t\t\t\tstats,\r\n\t\t\t\tstatsName,\r\n\t\t\t});\r\n\r\n\t\t\tif (grid) {\r\n\t\t\t\tthis._registerAxisGrid(L.extend({ name }, grid));\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options[name] !== \"summary\") {\r\n\t\t\t\tif (scale) this._registerAxisScale(L.extend({ name, label: unit }, scale));\r\n\t\t\t\tif (path) this._registerAreaPath(L.extend({ name }, path));\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltip || props.tooltips) {\r\n\t\t\t\t_.each([tooltip, ...(props.tooltips || [])], t => t && this._registerTooltip(L.extend({ name }, t)));\r\n\t\t\t}\r\n\r\n\t\t\tif (summary) {\r\n\t\t\t\t_.each(summary, (s, k) => summary[k] = L.extend({ unit }, s));\r\n\t\t\t\tthis._registerSummary(summary);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_registerMarker({latlng, sym, content}) {\r\n\t\tlet { wptIcons } = this.options;\r\n\t\t// generate and cache appropriate icon symbol\r\n\t\tif (!wptIcons.hasOwnProperty(sym)) {\r\n\t\t\twptIcons[sym] = L.divIcon(L.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } ));\r\n\t\t}\r\n\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\r\n\t\tif (content) {\r\n\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\r\n\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\r\n\t\t}\r\n\t\treturn this._addMarker(marker)\r\n\t},\r\n\t\r\n\t/**\r\n\t * Add chart or marker tooltip info\r\n\t */\r\n\t_registerTooltip: function(props) {\r\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\r\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\r\n\t},\r\n\r\n\t/**\r\n\t * Add summary info to diagram\r\n\t */\r\n\t_registerSummary: function(props) {\r\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\r\n\t},\r\n\r\n\t/*\r\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\r\n\t */\r\n\t_resetDrag: function() {\r\n\t\tthis._chart._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t},\r\n\r\n\t/**\r\n\t * Resets drag, marker and bounds.\r\n\t */\r\n\t_resetView: function() {\r\n\t\tif (this._map && this._map._isFullscreen) return;\r\n\t\tthis._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t\tif (this.options.autofitBounds) {\r\n\t\t\tthis.fitBounds();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\r\n\t */\r\n\t_resizeChart: function() {\r\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\r\n\t\t\tlet opts = this.options;\r\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\r\n\t\t\tif (newWidth) {\r\n\t\t\t\topts.width = newWidth;\r\n\t\t\t\tif (this._chart && this._chart._chart) {\r\n\t\t\t\t\tthis._chart._chart._resize(opts);\r\n\t\t\t\t\tthis._updateChart();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis._updateMapSegments();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Collapse or Expand chart control.\r\n\t */\r\n\t_toggle: function() {\r\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\r\n\t},\r\n\r\n\t/**\r\n\t * Update map center and zoom (followMarker: true)\r\n\t */\r\n\t_setMapView: function(item) {\r\n\t\tif (this._map && this.options.followMarker) {\r\n\t\t\tlet zoom = this._map.getZoom();\r\n\t\t\tlet z = this.options.zFollow;\r\n\t\t\tif (typeof z === \"number\") {\r\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\r\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\r\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates [x, y] domain and then update chart.\r\n\t */\r\n\t_updateChart: function() {\r\n\t\tif (this._chart && this._container) {\r\n\t\t\tthis.fire(\"elechart_axis\");\r\n\t\r\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\tthis.fire('elechart_updated');\t\t\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Update the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_updateMarker: function(item) {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update({\r\n\t\t\t\tmap : this._map,\r\n\t\t\t\titem : item,\r\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\r\n\t\t\t\toptions : this.options\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fix marker rotation on rotated maps\r\n\t */\r\n\t_rotateMarker: function() {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Highlight track segments on the map.\r\n\t */\r\n\t_updateMapSegments: function(coords) {\r\n\t\tthis._markedSegments.setLatLngs(coords || []);\r\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\r\n\t\t\tthis._markedSegments.addTo(this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Update chart summary.\r\n\t */\r\n\t_updateSummary: function() {\r\n\t\tif (this._summary) {\r\n\t\t\tthis._summary.reset();\r\n\t\t\tif (this.options.summary) {\r\n\t\t\t\tthis.fire(\"elechart_summary\");\r\n\t\t\t\tthis._summary.update();\r\n\t\t\t}\r\n\t\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\r\n\t\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\r\n\t\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\r\n\t\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\r\n\t\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\r\n\t\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\r\n\t\t\t\t\t\tevent.confirm();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.fire('eletrack_download', event);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Calculates chart width.\r\n\t */\r\n\t_width: function() {\r\n\t\tif (this._chart) return this._chart._width();\r\n\t\tconst { width, margins } = this.options;\r\n\t\treturn width - margins.left - margins.right;\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates chart height.\r\n\t */\r\n\t_height: function() {\r\n\t\tif (this._chart) return this._chart._height();\r\n\t\tconst { height, margins } = this.options;\r\n\t\treturn height - margins.top - margins.bottom;\r\n\t},\r\n\r\n});\r\n","/*\r\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\r\n *\r\n * This file is free software: you may copy, redistribute and/or modify it\r\n * under the terms of the GNU General Public License as published by the\r\n * Free Software Foundation, either version 2 of the License, or (at your\r\n * option) any later version.\r\n *\r\n * This file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n * This file incorporates work covered by the following copyright and\r\n * permission notice:\r\n *\r\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\r\n *\r\n * Permission to use, copy, modify, and/or distribute this software\r\n * for any purpose with or without fee is hereby granted, provided\r\n * that the above copyright notice and this permission notice appear\r\n * in all copies.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\r\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\r\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\r\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\r\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\r\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\r\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n */\r\n\r\nimport * as _ from './utils';\r\nimport { Elevation } from './control';\r\n\r\nElevation.Utils = _;\r\n\r\nL.control.elevation = (options) => new Elevation(options);\r\n"],"names":["Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","isMulti","key","meta","parseNumeric","call","this","property","parseInt","addClass","n","str","split","every","s","L","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","toString","substr","on","off","DomEvent","throttle","wrapNum","Util","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","idx","sum","Options","autofitBounds","autohide","autohideMarker","almostover","altitude","closeBtn","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","Browser","mobile","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","hotline","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","margins","top","right","bottom","left","height","screen","width","xTicks","undefined","yTicks","decimalsX","decimalsY","forceAxisBounds","interpolation","skipNullZCoords","yAxisMax","yAxisMin","_","i18n","string","data","baseURL","currentScript","src","url","location","require","__filename","URL","baseURI","slice","join","Elevation","Control","extend","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LHOTLINE","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","__btnIcon","addData","layer","import","then","_modulesLoaded","_addData","_addLayer","_fireEvt","track_info","once","addTo","map","parent","_.select","eleDiv","onAdd","_.append","_.insert","getContainer","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_hotline","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","circleMarker","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Hotline","startsWith","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","_.randomId","_loadModules","_initChart","_initButton","_initSummary","_initMarker","_initLayer","fire","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","coords","console","warn","_latlngs","nestingLevel","coordinateProperties","ele","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","_initHotLine","prop","trkseg","geo","geoJson","coordsToLatLng","altitudeFactor","renderer","isFinite","palette","outlineColor","outlineWidth","_renderer","parentElement","insertBefore","firstChild","_initMapIntegrations","setLatLng","invalidateSize","_collapse","_.replaceClass","_expand","oldProto","Canvas","_fillStroke","control","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","fetch","r","ok","text","img","innerHTML","_summary","Summary","response","_downloadURL","catch","err","modules","file","toLowerCase","exported","Object","keys","_registerHandler","pointToLayer","desc","sym","_registerCheckPoint","label","_registerMarker","content","decodeURI","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","pop","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","skipNull","isNaN","splice","pointToAttr","stats","sname","statsName","_.wrapDelta","clampRange","_.clamp","decimals","_.round","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","hasOwnProperty","icon","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","elevation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leaflet-elevation.min.js","sources":["../src/utils.js","../src/options.js","../src/control.js","../src/index.js"],"sourcesContent":["/**\r\n * TODO: exget computed styles of theese values from actual \"CSS vars\"\r\n **/\r\nexport const Colors = {\r\n\t'lightblue': { area: '#3366CC', alpha: 0.45, stroke: '#3366CC' },\r\n\t'magenta' : { area: '#FF005E' },\r\n\t'yellow' : { area: '#FF0' },\r\n\t'purple' : { area: '#732C7B' },\r\n\t'steelblue': { area: '#4682B4' },\r\n\t'red' : { area: '#F00' },\r\n\t'lime' : { area: '#9CC222', line: '#566B13' }\r\n};\r\n\r\nconst SEC = 1000;\r\nconst MIN = SEC * 60;\r\nconst HOUR = MIN * 60;\r\nconst DAY = HOUR * 24;\r\n\r\n/**\r\n * Convert a time (millis) to a human readable duration string (%Dd %H:%M'%S\")\r\n */\r\nexport function formatTime(t) {\r\n\tlet d = Math.floor(t / DAY);\r\n\tlet h = Math.floor( (t - d * DAY) / HOUR);\r\n\tlet m = Math.floor( (t - d * DAY - h * HOUR) / MIN);\r\n\tlet s = Math.round( (t - d * DAY - h * HOUR - m * MIN) / SEC);\r\n\tif ( s === 60 ) { m++; s = 0; }\r\n\tif ( m === 60 ) { h++; m = 0; }\r\n\tif ( h === 24 ) { d++; h = 0; }\r\n\treturn (d ? d + \"d \" : '') + h.toString().padStart(2, 0) + ':' + m.toString().padStart(2, 0) + \"'\" + s.toString().padStart(2, 0) + '\"';\r\n}\r\n\r\n/**\r\n * Convert a time (millis) to human readable date string (dd-mm-yyyy hh:mm:ss)\r\n */\r\n export function formatDate(format) {\r\n\tif (!format) {\r\n\t\treturn (time) => (new Date(time)).toLocaleString().replaceAll('/', '-').replaceAll(',', ' ');\r\n\t} else if (format == 'time') {\r\n\t\treturn (time) => (new Date(time)).toLocaleTimeString();\r\n\t} else if (format == 'date') {\r\n\t\treturn (time) => (new Date(time)).toLocaleDateString();\r\n\t}\r\n\treturn (time) => format(time);\r\n}\r\n\r\n/**\r\n * Generate download data event.\r\n */\r\n export function saveFile(dataURI, fileName) {\r\n\tlet a = create('a', '', { href: dataURI, target: '_new', download: fileName || \"\", style: \"display:none;\" });\r\n\tlet b = document.body;\r\n\tb.appendChild(a);\r\n\ta.click();\r\n\tb.removeChild(a);\r\n}\r\n\r\n\r\n/**\r\n * Convert SVG Path into Path2D and then update canvas\r\n */\r\n export function drawCanvas(ctx, path) {\r\n\tpath.classed('canvas-path', true);\r\n\r\n\tctx.beginPath();\r\n\tctx.moveTo(0, 0);\r\n\tlet p = new Path2D(path.attr('d'));\r\n\r\n\tctx.strokeStyle = path.attr('stroke');\r\n\tctx.fillStyle = path.attr('fill');\r\n\tctx.lineWidth = 1.25;\r\n\tctx.globalCompositeOperation = 'source-over';\r\n\r\n\t// stroke opacity\r\n\tctx.globalAlpha = path.attr('stroke-opacity') || 0.3;\r\n\tctx.stroke(p);\r\n\r\n\t// fill opacity\r\n\tctx.globalAlpha = path.attr('fill-opacity') || 0.45;\r\n\tctx.fill(p);\r\n\r\n\tctx.globalAlpha = 1;\r\n\r\n\tctx.closePath();\r\n}\r\n\r\n/**\r\n * Loop and extract GPX Extensions handled by \"@tmcw/toGeoJSON\" (eg. \"coordinateProperties\" > \"times\")\r\n */\r\nexport function coordPropsToMeta(coordProps, name, parser) {\r\n\treturn coordProps && (({props, point, id, isMulti }) => {\r\n\t\tif (props) {\r\n\t\t\tfor (const key of coordProps) {\r\n\t\t\t\tif (key in props) {\r\n\t\t\t\t\tpoint.meta[name] = (parser || parseNumeric).call(this, (isMulti ? props[key][isMulti] : props[key]), id);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Extract numeric property (id) from GeoJSON object\r\n */\r\nexport const parseNumeric = (property, id) => parseInt((typeof property === 'object' ? property[id] : property));\r\n\r\n/**\r\n * Extract datetime property (id) from GeoJSON object\r\n */\r\nexport const parseDate = (property, id) => new Date(Date.parse((typeof property === 'object' ? property[id] : property)));\r\n\r\n/**\r\n * A little bit shorter than L.DomUtil\r\n */\r\nexport const addClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.addClass(n, s));\r\nexport const removeClass = (n, str) => n && str.split(\" \").every(s => s && L.DomUtil.removeClass(n, s));\r\nexport const toggleClass = (n, str, cond) => (cond ? addClass : removeClass)(n, str);\r\nexport const replaceClass = (n, rem, add) => (rem && removeClass(n, rem)) || (add && addClass(n, add));\r\nexport const style = (n, k, v) => (typeof v === \"undefined\" && L.DomUtil.getStyle(n, k)) || n.style.setProperty(k, v);\r\nexport const toggleStyle = (n, k, v, cond) => style(n, k, cond ? v : '');\r\nexport const setAttributes = (n, attrs) => { for (let k in attrs) { n.setAttribute(k, attrs[k]); } };\r\nexport const toggleEvent = (el, e, fn, cond) => el[cond ? 'on' : 'off'](e, fn);\r\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; };\r\nexport const append = (n, c) => n.appendChild(c);\r\nexport const insert = (n, c, pos) => n.insertAdjacentElement(pos, c);\r\nexport const select = (str, n) => (n || document).querySelector(str);\r\nexport const each = (obj, fn) => { for (let i in obj) fn(obj[i], i); };\r\nexport const randomId = () => Math.random().toString(36).substr(2, 9);\r\n\r\n/**\r\n * TODO: use generators instead? (ie. \"yield\")\r\n */\r\nexport const iMax = (iVal, max = -Infinity) => (iVal > max ? iVal : max); \r\nexport const iMin = (iVal, min = +Infinity) => (iVal < min ? iVal : min);\r\nexport const iAvg = (iVal, avg = 0, idx = 1) => (iVal + avg * (idx - 1)) / idx;\r\nexport const iSum = (iVal, sum = 0) => iVal + sum;\r\n\r\n/**\r\n * Alias for some leaflet core functions\r\n */\r\nexport const { on, off } = L.DomEvent;\r\nexport const { throttle, wrapNum } = L.Util;\r\nexport const { hasClass } = L.DomUtil;\r\n\r\n/**\r\n * Limit floating point precision\r\n */\r\nexport const round = L.Util.formatNum;\r\n\r\n/**\r\n * Limit a number between min / max values\r\n */\r\nexport const clamp = (val, range) => range ? (val < range[0] ? range[0] : val > range[1] ? range[1] : val) : val;\r\n\r\n/**\r\n * Limit a delta difference between two values\r\n */\r\nexport const wrapDelta = (curr, prev, deltaMax) => Math.abs(curr - prev) > deltaMax ? prev + deltaMax * Math.sign(curr - prev) : curr;","import * as _ from './utils';\r\n\r\nexport var Options = {\r\n\tautofitBounds: true,\r\n\tautohide: false,\r\n\tautohideMarker: true,\r\n\talmostover: true,\r\n\taltitude: true,\r\n\tcloseBtn: true,\r\n\tcollapsed: false,\r\n\tdetached: true,\r\n\tdistance: true,\r\n\tdistanceMarkers: { lazy: true, distance: true, direction: true },\r\n\tdragging: !L.Browser.mobile,\r\n\tdownloadLink: 'link',\r\n\televationDiv: \"#elevation-div\",\r\n\tfollowMarker: true,\r\n\timperial: false,\r\n\tlegend: true,\r\n\thandlers: [\"Distance\", \"Time\", \"Altitude\", \"Slope\", \"Speed\", \"Acceleration\"],\r\n\thotline: 'elevation',\r\n\tmarker: 'elevation-line',\r\n\tmarkerIcon: L.divIcon({\r\n\t\tclassName: 'elevation-position-marker',\r\n\t\thtml: '<i class=\"elevation-position-icon\"></i>',\r\n\t\ticonSize: [32, 32],\r\n\t\ticonAnchor: [16, 16],\r\n\t}),\r\n\tposition: \"topright\",\r\n\tpolyline: {\r\n\t\tclassName: 'elevation-polyline',\r\n\t\tcolor: '#000',\r\n\t\topacity: 0.75,\r\n\t\tweight: 5,\r\n\t\tlineCap: 'round'\r\n\t},\r\n\tpolylineSegments: {\r\n\t\tclassName: 'elevation-polyline-segments',\r\n\t\tcolor: '#F00',\r\n\t\tinteractive: false,\r\n\t},\r\n\tpreferCanvas: false,\r\n\treverseCoords: false,\r\n\truler: true,\r\n\ttheme: \"lightblue-theme\",\r\n\tsummary: 'inline',\r\n\tslope: false,\r\n\tspeed: false,\r\n\ttime: true,\r\n\ttimeFactor: 3600,\r\n\ttimestamps: false,\r\n\ttrkStart: { className: 'start-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#00d800', fillOpacity: 1, interactive: false },\r\n\ttrkEnd: { className: 'end-marker', radius: 6, weight: 2, color: '#fff', fillColor: '#ff0606', fillOpacity: 1, interactive: false },\r\n\twaypoints: true,\r\n\twptIcons: {\r\n\t\t'': L.divIcon({\r\n\t\t\tclassName: 'elevation-waypoint-marker',\r\n\t\t\thtml: '<i class=\"elevation-waypoint-icon default\"></i>',\r\n\t\t\ticonSize: [30, 30],\r\n\t\t\ticonAnchor: [8, 30],\r\n\t\t}),\r\n\t},\r\n\twptLabels: true,\r\n\txAttr: \"dist\",\r\n\txLabel: \"km\",\r\n\tyAttr: \"z\",\r\n\tyLabel: \"m\",\r\n\tzFollow: false,\r\n\tzooming: !L.Browser.Mobile,\r\n\r\n\t// Quite uncommon and undocumented options\r\n\tmargins: { top: 30, right: 30, bottom: 30, left: 40 },\r\n\theight: (screen.height * 0.3) || 200,\r\n\twidth: (screen.width * 0.6) || 600,\r\n\txTicks: undefined,\r\n\tyTicks: undefined,\r\n\r\n\tdecimalsX: 2,\r\n\tdecimalsY: 0,\r\n\tforceAxisBounds: false,\r\n\tinterpolation: \"curveLinear\",\r\n\tyAxisMax: undefined,\r\n\tyAxisMin: undefined,\r\n};\r\n","import * as _ from './utils';\r\nimport { Options } from './options';\r\n\r\n// \"leaflet-i18n\" fallback\r\nif (!L._ || !L.i18n) {\r\n\tL._ = L.i18n = (string, data) => string;\r\n}\r\n\r\n// Prevent CORS issues for relative locations (dynamic import)\r\nconst baseURL = ((document.currentScript && document.currentScript.src) || (import.meta && import.meta.url)).split(\"/\").slice(0,-1).join(\"/\") + '/';\r\n\r\nexport const Elevation = L.Control.Elevation = L.Control.extend({\r\n\r\n\tincludes: L.Evented ? L.Evented.prototype : L.Mixin.Events,\r\n\r\n\toptions: Options,\r\n\t__mileFactor: 0.621371, // 1 km = (0.621371 mi)\r\n\t__footFactor: 3.28084, // 1 m = (3.28084 ft)\r\n\t__D3: 'https://unpkg.com/d3@6.5.0/dist/d3.min.js',\r\n\t__TOGEOJSON: 'https://unpkg.com/@tmcw/togeojson@4.6.0/dist/togeojson.umd.js',\r\n\t__LGEOMUTIL: 'https://unpkg.com/leaflet-geometryutil@0.9.3/src/leaflet.geometryutil.js',\r\n\t__LALMOSTOVER: 'https://unpkg.com/leaflet-almostover@1.0.1/src/leaflet.almostover.js',\r\n\t__LHOTLINE: '../libs/leaflet-hotline.min.js',\r\n\t__LDISTANCEM: '../libs/leaflet-distance-marker.min.js',\r\n\t__LCHART: '../src/components/chart.js',\r\n\t__LMARKER: '../src/components/marker.js',\r\n\t__LSUMMARY: '../src/components/summary.js',\r\n\t__modulesFolder: '../src/handlers/',\r\n\t__btnIcon: baseURL + '../images/elevation.svg',\r\n\r\n\t/*\r\n\t * Add data to the diagram either from GPX or GeoJSON and update the axis domain and data\r\n\t */\r\n\taddData: function(d, layer) {\r\n\t\tthis.import(this.__D3)\r\n\t\t\t.then(() => {\r\n\t\t\t\tif (this._modulesLoaded) {\r\n\t\t\t\t\tlayer = layer ?? (d.on && d);\r\n\t\t\t\t\tthis._addData(d);\r\n\t\t\t\t\tthis._addLayer(layer);\r\n\t\t\t\t\tthis._fireEvt(\"eledata_added\", { data: d, layer: layer, track_info: this.track_info });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.once('modules_loaded', () => this.addData(d,layer));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Adds the control to the given map.\r\n\t */\r\n\taddTo: function(map) {\r\n\t\tif (this.options.detached) {\r\n\t\t\tlet parent = _.select(this.options.elevationDiv);\r\n\t\t\tlet eleDiv = this.onAdd(map);\r\n\t\t\tparent ? _.append(parent, eleDiv) : _.insert(map.getContainer(), eleDiv, 'afterend');\r\n\t\t} else {\r\n\t\t\tL.Control.prototype.addTo.call(this, map);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/*\r\n\t * Reset data and display\r\n\t */\r\n\tclear: function() {\r\n\t\tif (this._marker) this._marker.remove();\r\n\t\tif (this._chart) this._clearChart();\r\n\t\tif (this._layers) this._clearLayers(this._layers);\r\n\t\tif (this._markers) this._clearLayers(this._markers);\r\n\t\tif (this._circleMarkers) this._circleMarkers.remove();\r\n\t\tif (this._hotline) this._clearLayers(this._hotline);\r\n\r\n\t\tthis._data = [];\r\n\t\tthis.track_info = {};\r\n\r\n\t\tthis._fireEvt(\"eledata_clear\");\r\n\r\n\t\tthis._updateChart();\r\n\t},\r\n\r\n\t_clearChart: function() {\r\n\t\tif (this._events && this._events.elechart_updated) {\r\n\t\t\tthis._events.elechart_updated.forEach(({fn, ctx}) => this.off('elechart_updated', fn, ctx));\r\n\t\t}\r\n\t\tif (this._chart && this._chart._container) {\r\n\t\t\tthis._chart._container.selectAll('g.point .point').remove();\r\n\t\t\tthis._chart.clear();\r\n\t\t}\r\n\t},\r\n\r\n\t_clearLayers: function(l) {\r\n\t\tl = l || this._layers;\r\n\t\tif (l && l.eachLayer) {\r\n\t\t\tl.eachLayer(f => f.remove())\r\n\t\t\tl.clearLayers();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * TODO: Create a base class to handle custom data attributes (heart rate, cadence, temperature, ...)\r\n\t * \r\n\t * @link https://leafletjs.com/examples/extending/extending-3-controls.html#handlers\r\n\t */\r\n\t// addHandler: function (name, HandlerClass) {\r\n\t// \tif (HandlerClass) {\r\n\t// \t\tlet handler = this[name] = new HandlerClass(this);\r\n\t// \t\tthis.handlers.push(handler);\r\n\t// \t\tif (this.options[name]) {\r\n\t// \t\t\thandler.enable();\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \treturn this;\r\n\t// },\r\n\r\n\t/**\r\n\t * Disable chart brushing.\r\n\t */\r\n\tdisableBrush: function() {\r\n\t\tthis._chart._brushEnabled = false;\r\n\t\tthis._resetDrag();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart brushing.\r\n\t */\r\n\tenableBrush: function() {\r\n\t\tthis._chart._brushEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Disable chart zooming.\r\n\t */\r\n\tdisableZoom: function() {\r\n\t\tthis._chart._zoomEnabled = false;\r\n\t\tthis._chart._resetZoom();\r\n\t},\r\n\r\n\t/**\r\n\t * Enable chart zooming.\r\n\t */\r\n\tenableZoom: function() {\r\n\t\tthis._chart._zoomEnabled = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Sets a map view that contains the given geographical bounds.\r\n\t */\r\n\tfitBounds: function(bounds) {\r\n\t\tbounds = bounds || this.getBounds();\r\n\t\tif (this._map && bounds.isValid()) this._map.fitBounds(bounds);\r\n\t},\r\n\r\n\tgetBounds: function(data) {\r\n\t\treturn L.latLngBounds((data || this._data).map((d) => d.latlng));\r\n\t},\r\n\r\n\t/**\r\n\t * Get default zoom level (followMarker: true).\r\n\t */\r\n\tgetZFollow: function() {\r\n\t\treturn this.options.zFollow;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\thide: function() {\r\n\t\t_.style(this._container, \"display\", \"none\");\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize chart control \"options\" and \"container\".\r\n\t */\r\n\tinitialize: function(opts) {\r\n\r\n\t\topts = L.setOptions(this, opts);\r\n\r\n\t\tthis._data = [];\r\n\t\tthis._layers = L.featureGroup();\r\n\t\tthis._markers = L.featureGroup();\r\n\t\tthis._hotline = L.featureGroup();\r\n\t\tthis._circleMarkers = L.featureGroup();\r\n\t\tthis._markedSegments = L.polyline([]);\r\n\t\tthis._start = L.circleMarker([0,0], (opts.trkStart || Options.trkStart));\r\n\t\tthis._end = L.circleMarker([0,0], (opts.trkEnd || Options.trkEnd));\r\n\t\tthis._chartEnabled = true;\r\n\t\tthis._yCoordMax = -Infinity;\r\n\t\tthis.track_info = {};\r\n\t\t// this.handlers = [];\r\n\r\n\t\tif (opts.followMarker) this._setMapView = _.throttle(this._setMapView, 300, this);\r\n\t\tif (opts.legend) opts.margins.bottom += 30;\r\n\t\tif (opts.theme) opts.polylineSegments.className += ' ' + opts.theme;\r\n\t\tif (opts.wptIcons === true) opts.wptIcons = Options.wptIcons;\r\n\t\tif (opts.distanceMarkers === true) opts.distanceMarkers = Options.distanceMarkers;\r\n\t\tif (opts.trkStart) this._start.addTo(this._circleMarkers);\r\n\t\tif (opts.trkEnd) this._end.addTo(this._circleMarkers);\r\n\r\n\r\n\t\tthis._markedSegments.setStyle(opts.polylineSegments);\r\n\r\n\t\t// Leaflet canvas renderer colors\r\n\t\tL.extend(_.Colors, opts.colors || {});\r\n\r\n\t\t// Various stuff\r\n\t\tthis._fixCanvasPaths();\r\n\t\tthis._fixTooltipSize();\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Javascript scripts downloader (lazy loader)\r\n\t */\r\n\timport: function(src, condition) {\r\n\t\tswitch(src) {\r\n\t\t\tcase this.__D3: condition = typeof d3 !== 'object'; break;\r\n\t\t\tcase this.__TOGEOJSON: condition = typeof toGeoJSON !== 'object'; break;\r\n\t\t\tcase this.__LGEOMUTIL: condition = typeof L.GeometryUtil !== 'object'; break;\r\n\t\t\tcase this.__LALMOSTOVER: condition = typeof L.Handler.AlmostOver !== 'function'; break;\r\n\t\t\tcase this.__LDISTANCEM: condition = typeof L.DistanceMarkers !== 'function'; break;\r\n\t\t\tcase this.__LHOTLINE: condition = typeof L.Hotline !== 'function'; break;\r\n\t\t}\r\n\t\tsrc = (src.startsWith('../') || src.startsWith('./') ? baseURL : '') + src;\r\n\t\treturn condition !== false ? import(src) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Load elevation data (GPX, GeoJSON, KML or TCX).\r\n\t */\r\n\tload: function(data) {\r\n\t\tthis._parseFromString(data).then( geojson => geojson ? this._loadLayer(geojson) : this._loadFile(data));\r\n\t},\r\n\r\n\t/**\r\n\t * Create container DOM element and related event listeners.\r\n\t * Called on control.addTo(map).\r\n\t */\r\n\tonAdd: function(map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tlet container = this._container = _.create(\"div\", \"elevation-control \" + this.options.theme + \" \" + (this.options.detached ? 'elevation-detached' : 'leaflet-control'), this.options.detached ? { id: 'elevation-' + _.randomId() } : {});\r\n\r\n\t\tif (!this.eleDiv) this.eleDiv = container;\r\n\r\n\t\tthis._loadModules(this.options.handlers).then(() => { // Inject here required modules (data handlers)\r\n\t\t\tthis._initChart(container);\r\n\t\t\tthis._initButton(container);\r\n\t\t\tthis._initSummary(container);\r\n\t\t\tthis._initMarker(map);\r\n\t\t\tthis._initLayer(map);\r\n\t\t\tthis._modulesLoaded = true;\r\n\t\t\tthis.fire('modules_loaded');\r\n\t\t});\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\t/**\r\n\t * Clean up control code and related event listeners.\r\n\t * Called on control.remove().\r\n\t */\r\n\tonRemove: function(map) {\r\n\t\tthis._container = null;\r\n\r\n\t\tmap\r\n\t\t\t.off('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t.off('resize', this._resetView, this)\r\n\t\t\t.off('resize', this._resizeChart, this)\r\n\t\t\t.off('mousedown', this._resetDrag, this);\r\n\r\n\t\t_.off(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t_.off(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t_.off(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\tthis\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t.off('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\tthis.fire('remove');\r\n\t},\r\n\r\n\t/**\r\n\t * Redraws the chart control. Sometimes useful after screen resize.\r\n\t */\r\n\tredraw: function() {\r\n\t\tthis._resizeChart();\r\n\t},\r\n\r\n\t/**\r\n\t * Set default zoom level (followMarker: true).\r\n\t */\r\n\tsetZFollow: function(zoom) {\r\n\t\tthis.options.zFollow = zoom;\r\n\t},\r\n\r\n\t/**\r\n\t * Hide current elevation chart profile.\r\n\t */\r\n\tshow: function() {\r\n\t\t_.style(this._container, \"display\", \"block\");\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing data either from GPX or GeoJSON and update the diagram data\r\n\t */\r\n\t_addData: function(d) {\r\n\t\tif (!d) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Standard GeoJSON\r\n\t\tif (d.type === \"FeatureCollection\" ) {\r\n\t\t\treturn _.each(d.features, feature => this._addData(feature));\r\n\t\t} else if (d.type === \"Feature\") {\r\n\t\t\tlet geom = d.geometry;\r\n\t\t\tif (geom) {\r\n\t\t\t\tswitch (geom.type) {\r\n\t\t\t\t\tcase 'LineString':\t\treturn this._addGeoJSONData(geom.coordinates, d.properties);\r\n\t\t\t\t\tcase 'MultiLineString':\treturn _.each(geom.coordinates, (coords, i) => this._addGeoJSONData(coords, d.properties, i));\r\n\t\t\t\t\tcase 'Point':\r\n\t\t\t\t\tdefault:\t\t\t\treturn console.warn('Unsopperted GeoJSON feature geometry type:' + geom.type);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fallback for leaflet layers (eg. L.Gpx)\r\n\t\tif (d._latlngs) {\r\n\t\t\treturn this._addGeoJSONData(d._latlngs, d.feature && d.feature.properties);\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t/*\r\n\t * Parsing of GeoJSON data lines and their elevation in z-coordinate\r\n\t */\r\n\t_addGeoJSONData: function(coords, properties, nestingLevel) {\r\n\r\n\t\t// \"coordinateProperties\" property is generated inside \"@tmcw/toGeoJSON\"\r\n\t\tlet props = (properties && properties.coordinateProperties) || properties;\r\n\r\n\t\tcoords.forEach((point, i) => {\r\n\r\n\t\t\t// GARMIN_EXTENSIONS = [\"hr\", \"cad\", \"atemp\", \"wtemp\", \"depth\", \"course\", \"bearing\"];\r\n\t\t\tpoint.meta = point.meta ?? { time: null, ele: null };\r\n\t\t\t\r\n\t\t\tpoint.prev = (attr) => (attr ? this._data[i > 0 ? i - 1 : 0][attr] : this._data[i > 0 ? i - 1 : 0]);\r\n\r\n\t\t\tthis.fire(\"elepoint_init\", { point: point, props: props, id: i, isMulti: nestingLevel });\r\n\r\n\t\t\tthis._addPoint(\r\n\t\t\t\tpoint.lat ?? point[1], \r\n\t\t\t\tpoint.lng ?? point[0],\r\n\t\t\t\tpoint.alt ?? point.meta.ele ?? point[2]\r\n\t\t\t);\r\n\r\n\t\t\tthis.fire(\"elepoint_added\", { point: point, index: this._data.length - 1 });\r\n\r\n\t\t\tif (this._yCoordMax < this._data[this._data.length - 1][this.options.yAttr]) this._yCoordMax = this._data[this._data.length - 1][this.options.yAttr];\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eletrack_added\", { coords: coords, index: this._data.length - 1 });\r\n\t},\r\n\r\n\t/*\r\n\t * Parse and push a single (x, y, z) point to current elevation profile.\r\n\t */\r\n\t_addPoint: function(x, y, z) {\r\n\t\tif (this.options.reverseCoords) {\r\n\t\t\t[x, y] = [y, x];\r\n\t\t}\r\n\r\n\t\tthis._data.push({\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z,\r\n\t\t\tlatlng: L.latLng(x, y, z)\r\n\t\t});\r\n\r\n\t\tthis.fire(\"eledata_updated\", { index: this._data.length - 1 });\r\n\t},\r\n\r\n\t_addLayer: function(layer) {\r\n\t\tif (layer) this._layers.addLayer(layer)\r\n\t\t// Postpone adding the distance markers (lazy: true)\r\n\t\tif (layer && this.options.distanceMarkers && this.options.distanceMarkers.lazy) {\r\n\t\t\tlayer.on('add remove', ({target, type}) => L.DistanceMarkers && target instanceof L.Polyline && target[type + 'DistanceMarkers']());\r\n\t\t}\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_addMarker: function(marker) {\r\n\t\tif (marker) this._markers.addLayer(marker)\r\n\t\treturn marker;\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" integration\r\n\t */\r\n\t_initAlmostOverHandler: function(map, layer) {\r\n\t\treturn (map && this.options.almostOver && !L.Browser.mobile) ? Promise.all([\r\n\t\t\tthis.import(this.__LGEOMUTIL),\r\n\t\t\tthis.import(this.__LALMOSTOVER)\r\n\t\t]).then(() => {\r\n\t\t\tmap.addHandler('almostOver', L.Handler.AlmostOver)\r\n\t\t\tif (L.GeometryUtil && map.almostOver && map.almostOver.enabled()) {\r\n\t\t\t\tmap.almostOver.addLayer(layer);\r\n\t\t\t\tmap\r\n\t\t\t\t\t.on('almost:move', (e) => this._onMouseMoveLayer(e))\r\n\t\t\t\t\t.on('almost:out', (e) => this._onMouseOut(e));\r\n\t\t\t}\r\n\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.DistanceMarkers\" integration\r\n\t */\r\n\t_initDistanceMarkers: function() {\r\n\t\treturn this.options.distanceMarkers ? Promise.all([this.import(this.__LGEOMUTIL), this.import(this.__LDISTANCEM)]) : Promise.resolve();\r\n\t},\r\n\r\n\t_initHotLine: function(layer) {\r\n\t\tlet prop = typeof this.options.hotline == 'string' ? this.options.hotline : 'elevation';\r\n\t\treturn this.options.hotline ? this.import(this.__LHOTLINE)\r\n\t\t\t.then(() => {\r\n\t\t\t\tlayer.eachLayer((trkseg) => {\r\n\t\t\t\t\tif(trkseg.feature.geometry.type != \"Point\") {\r\n\t\t\t\t\t\tlet geo = L.geoJson(trkseg.toGeoJSON(), { coordsToLatLng: (coords) => L.latLng(coords[0], coords[1], coords[2] * (this.options.altitudeFactor || 1))});\r\n\t\t\t\t\t\tlet line = L.hotline(geo.toGeoJSON().features[0].geometry.coordinates, {\r\n\t\t\t\t\t\t\trenderer: L.Hotline.renderer(),\r\n\t\t\t\t\t\t\tmin: isFinite(this.track_info[prop + '_min']) ? this.track_info[prop + '_min'] : 0,\r\n\t\t\t\t\t\t\tmax: isFinite(this.track_info[prop + '_max']) ? this.track_info[prop + '_max'] : 1,\r\n\t\t\t\t\t\t\tpalette: {\r\n\t\t\t\t\t\t\t\t0.0: '#008800',\r\n\t\t\t\t\t\t\t\t0.5: '#ffff00',\r\n\t\t\t\t\t\t\t\t1.0: '#ff0000'\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tweight: 5,\r\n\t\t\t\t\t\t\toutlineColor: '#000000',\r\n\t\t\t\t\t\t\toutlineWidth: 1\r\n\t\t\t\t\t\t}).addTo(this._hotline);\r\n\t\t\t\t\t\tlet alpha = trkseg.options.style && trkseg.options.style.opacity || 1;\r\n\t\t\t\t\t\ttrkseg.on('add remove', ({type}) => {\r\n\t\t\t\t\t\t\ttrkseg.setStyle({opacity: (type == 'add' ? 0 : alpha)});\r\n\t\t\t\t\t\t\tline[(type == 'add' ? 'addTo' : 'removeFrom')](trkseg._map);\r\n\t\t\t\t\t\t\tif (line._renderer) line._renderer._container.parentElement.insertBefore(line._renderer._container, line._renderer._container.parentElement.firstChild);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}) : Promise.resolve();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize \"L.AlmostOver\" and \"L.DistanceMarkers\"\r\n\t */\r\n\t_initMapIntegrations: function(layer) {\r\n\t\tlet map = this._map;\r\n\t\tif (map) {\r\n\t\t\tif (this._data.length) {\r\n\t\t\t\tthis._start.setLatLng(this._data[0].latlng);\r\n\t\t\t\tthis._end.setLatLng(this._data[this._data.length -1].latlng);\r\n\t\t\t}\r\n\t\t\tPromise.all([\r\n\t\t\t\tthis._initHotLine(layer),\r\n\t\t\t\tthis._initAlmostOverHandler(map, layer),\r\n\t\t\t\tthis._initDistanceMarkers(),\r\n\t\t\t]).then(() => {\r\n\t\t\t\tif\t(this.options.polyline) {\r\n\t\t\t\t\tlayer.addTo(map);\r\n\t\t\t\t\tthis._circleMarkers.addTo(map);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.options.autofitBounds) {\r\n\t\t\t\t\tthis.fitBounds(layer.getBounds());\r\n\t\t\t\t}\r\n\t\t\t\tmap.invalidateSize();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.once('add', () => this._initMapIntegrations(layer));\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Collapse current chart control.\r\n\t */\r\n\t_collapse: function() {\r\n\t\t_.replaceClass(this._container, 'elevation-expanded', 'elevation-collapsed');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/*\r\n\t * Expand current chart control.\r\n\t */\r\n\t_expand: function() {\r\n\t\t_.replaceClass(this._container, 'elevation-collapsed', 'elevation-expanded');\r\n\t\tif (this._map) this._map.invalidateSize();\r\n\t},\r\n\r\n\t/**\r\n\t * Add some basic colors to leaflet canvas renderer (preferCanvas: true).\r\n\t */\r\n\t_fixCanvasPaths: function() {\r\n\t\tlet oldProto = L.Canvas.prototype._fillStroke;\r\n\t\tlet control = this;\r\n\r\n\t\tlet theme = this.options.theme.split(' ')[0].replace('-theme', '');\r\n\t\tlet color = _.Colors[theme] || {};\r\n\r\n\t\tL.Canvas.include({\r\n\t\t\t_fillStroke: function(ctx, layer) {\r\n\t\t\t\tif (control._layers.hasLayer(layer)) {\r\n\r\n\t\t\t\t\tlet options = layer.options;\r\n\r\n\t\t\t\t\toptions.color = color.line || color.area || theme;\r\n\t\t\t\t\toptions.stroke = !!options.color;\r\n\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\r\n\t\t\t\t\tif (options.stroke && options.weight !== 0) {\r\n\t\t\t\t\t\tlet oldVal = ctx.globalCompositeOperation || 'source-over';\r\n\t\t\t\t\t\tctx.globalCompositeOperation = 'destination-over'\r\n\t\t\t\t\t\tctx.strokeStyle = color.outline || '#FFF';\r\n\t\t\t\t\t\tctx.lineWidth = options.weight * 1.75;\r\n\t\t\t\t\t\tctx.stroke();\r\n\t\t\t\t\t\tctx.globalCompositeOperation = oldVal;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\toldProto.call(this, ctx, layer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Partial fix for initial tooltip size\r\n\t * \r\n\t * @link https://github.com/Raruto/leaflet-elevation/issues/81#issuecomment-713477050\r\n\t */\r\n\t_fixTooltipSize: function() {\r\n\t\tthis.on('elechart_init', () =>\r\n\t\t\tthis.once('elechart_change elechart_hover', ({data, xCoord}) => {\r\n\t\t\t\tif (this._chartEnabled) {\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t\tthis._chart._showDiagramIndicator(data, xCoord);\r\n\t\t\t\t}\r\n\t\t\t\tthis._updateMarker(data);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given LatLng\r\n\t */\r\n\t_findItemForLatLng: function(latlng) {\r\n\t\treturn this._data[this._chart._findIndexForLatLng(latlng)];\r\n\t},\r\n\r\n\t/*\r\n\t * Finds a data entry for the given xDiagCoord\r\n\t */\r\n\t_findItemForX: function(x) {\r\n\t\treturn this._data[this._chart._findIndexForXCoord(x)];\r\n\t},\r\n\r\n\t/**\r\n\t * Fires an event of the specified type.\r\n\t */\r\n\t_fireEvt: function(type, data, propagate) {\r\n\t\tif (this.fire) this.fire(type, data, propagate);\r\n\t\tif (this._map) this._map.fire(type, data, propagate);\r\n\t},\r\n\r\n\t/*\r\n\t * Hides the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_hideMarker: function() {\r\n\t\tif (this.options.autohideMarker) {\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Generate \"svg\" chart (DOM element).\r\n\t */\r\n\t_initChart: function(container) {\r\n\t\tlet opts = this.options;\r\n\t\tlet map = this._map;\r\n\r\n\t\tif (opts.detached) {\r\n\t\t\tlet { offsetWidth, offsetHeight} = this.eleDiv;\r\n\t\t\tif (offsetWidth > 0) opts.width = offsetWidth;\r\n\t\t\tif (offsetHeight > 20) opts.height = offsetHeight - 20; // 20 = horizontal scrollbar size.\r\n\t\t} else {\r\n\t\t\tlet { clientWidth } = map.getContainer();\r\n\t\t\topts._maxWidth = opts._maxWidth > opts.width ? opts._maxWidth : opts.width;\r\n\t\t\tthis._container.style.maxWidth = opts._maxWidth + 'px';\r\n\t\t\tif (opts._maxWidth > clientWidth) opts.width = clientWidth - 30;\r\n\t\t}\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LCHART)\r\n\t\t]).then((m) => {\r\n\r\n\t\t\tlet chart = this._chart = new (m[1] || Elevation).Chart(opts, this);\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\td3\r\n\t\t\t\t.select(container)\r\n\t\t\t\t.call(chart.render())\r\n\t\r\n\t\t\tchart\r\n\t\t\t\t.on('reset_drag', this._hideMarker, this)\r\n\t\t\t\t.on('mouse_enter', this._onMouseEnter, this)\r\n\t\t\t\t.on('dragged', this._onDragEnd, this)\r\n\t\t\t\t.on('mouse_move', this._onMouseMove, this)\r\n\t\t\t\t.on('mouse_out', this._onMouseOut, this)\r\n\t\t\t\t.on('ruler_filter', this._onRulerFilter, this)\r\n\t\t\t\t.on('zoom', this._updateChart, this)\r\n\t\t\t\t.on('elepath_toggle', this._onToggleChart, this)\r\n\t\t\t\t.on('margins_updated', this._resizeChart, this);\r\n\t\r\n\t\r\n\t\t\tthis.fire(\"elechart_init\");\r\n\r\n\t\t\tmap\r\n\t\t\t\t.on('zoom viewreset zoomanim', this._hideMarker, this)\r\n\t\t\t\t.on('resize', this._resetView, this)\r\n\t\t\t\t.on('resize', this._resizeChart, this)\r\n\t\t\t\t.on('rotate', this._rotateMarker, this)\r\n\t\t\t\t.on('mousedown', this._resetDrag, this);\r\n\r\n\t\t\t_.on(map.getContainer(), 'mousewheel', this._resetDrag, this);\r\n\t\t\t_.on(map.getContainer(), 'touchstart', this._resetDrag, this);\r\n\t\t\t_.on(document, 'keydown', this._onKeyDown, this);\r\n\r\n\t\t\tthis\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateChart, this)\r\n\t\t\t\t.on('eledata_added eledata_loaded', this._updateSummary, this);\r\n\r\n\t\t\tthis._updateChart();\r\n\t\t\tthis._updateSummary();\r\n\t\t});\r\n\r\n\r\n\t},\r\n\r\n\t_initLayer: function() {\r\n\t\tthis._layers\r\n\t\t\t.on('layeradd layerremove', ({layer, type}) => {\r\n\t\t\t\tlet node = layer.getElement && layer.getElement();\r\n\t\t\t\t_.toggleClass(node, this.options.polyline.className + ' ' + this.options.theme, type == 'layeradd');\r\n\t\t\t\t_.toggleEvent(layer, \"mousemove\", this._onMouseMoveLayer.bind(this), type == 'layeradd')\r\n\t\t\t\t_.toggleEvent(layer, \"mouseout\", this._onMouseOut.bind(this), type == 'layeradd');\r\n\t\t\t});\r\n\t},\r\n\r\n\t_initMarker: function(map) {\r\n\t\tlet pane = map.getPane('elevationPane');\r\n\t\tif (!pane) {\r\n\t\t\tpane = this._pane = map.createPane('elevationPane', map.getPane('norotatePane') || map.getPane('mapPane'));\r\n\t\t\tpane.style.zIndex = 625; // This pane is above markers but below popups.\r\n\t\t\tpane.style.pointerEvents = 'none';\r\n\t\t}\r\n\r\n\t\tif (this._renderer) this._renderer.remove()\r\n\t\tthis._renderer = L.svg({ pane: \"elevationPane\" }).addTo(this._map); // default leaflet svg renderer\r\n\r\n\t\tPromise.all([\r\n\t\t\tthis.import(this.__D3),\r\n\t\t\tthis.import(this.__LMARKER)\r\n\t\t]).then((m) => {\r\n\t\t\tthis._marker = new (m[1] || Elevation).Marker(this.options, this);\r\n\t\t\tthis.fire(\"elechart_marker\");\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Inspired by L.Control.Layers\r\n\t */\r\n\t_initButton: function(container) {\r\n\t\tL.DomEvent\r\n\t\t\t.disableClickPropagation(container)\r\n\t\t\t.disableScrollPropagation(container);\r\n\r\n\t\tthis.options.collapsed ? this._collapse() : this._expand();\r\n\r\n\t\tif (this.options.autohide) {\r\n\t\t\t_.on(container, 'mouseover', this._expand, this);\r\n\t\t\t_.on(container, 'mouseout', this._collapse, this);\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.closeBtn) {\r\n\t\t\tlet link = this._button = _.create('a', \"elevation-toggle-icon\", { href: '#', title: L._('Elevation'), }, container);\r\n\t\t\t_.on(link, 'click', L.DomEvent.stop);\r\n\t\t\t_.on(link, 'click', this._toggle, this);\r\n\t\t\t_.on(link, 'focus', this._toggle, this);\r\n\t\t\tfetch(this.__btnIcon).then(r => r.ok && r.text().then(img => link.innerHTML = img));\r\n\t\t}\r\n\t},\r\n\r\n\t_initSummary: function(container) {\r\n\t\tthis.import(this.__LSUMMARY).then((m)=>{\r\n\t\t\tthis._summary = new (m || Elevation).Summary({ summary: this.options.summary }, this);\r\n\r\n\t\t\tthis.on('elechart_init', () => {\r\n\t\t\t\td3.select(container).call(this._summary.render());\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Retrieve data from a remote url (HTTP).\r\n\t */\r\n\t_loadFile: function(url) {\r\n\t\tfetch(url)\r\n\t\t\t.then((response) => response.text())\r\n\t\t\t.then((data) => {\r\n\t\t\t\tthis._downloadURL = url; // TODO: handle multiple urls?\r\n\t\t\t\tthis._parseFromString(data)\r\n\t\t\t\t\t.then( geojson => geojson && this._loadLayer(geojson));\r\n\t\t\t}).catch((err) => console.warn(err));\r\n\t},\r\n\r\n\t/**\r\n\t * Dynamically import only required javascript modules (code splitting)\r\n\t */\r\n\t_loadModules: function(handlers) {\r\n\t\t// First map known classnames (eg. \"Altitude\" --> L.Control.Elevation.Altitude)\r\n\t\thandlers = handlers.map((h) => typeof h === 'string' && typeof Elevation[h] !== \"undefined\" ? Elevation[h] : h);\r\n\t\t// Then load optional classes and custom imports (eg. \"Cadence\" --> import('../src/handlers/cadence.js'))\r\n\t\tlet modules = handlers.map(file => (typeof file === 'string' && this.import(this.__modulesFolder + file.toLowerCase() + '.js')) || (file instanceof Promise && file) || Promise.resolve());\r\n\t\treturn Promise.all(modules).then((m) => {\r\n\t\t\t_.each(m, (exported, i) => {\r\n\t\t\t\tlet fn = exported && Object.keys(exported)[0];\r\n\t\t\t\tif (fn) {\r\n\t\t\t\t\thandlers[i] = Elevation[fn] = (Elevation[fn] ?? exported[fn]);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_.each(handlers, h => [\"function\", \"object\"].includes(typeof h) && this._registerHandler(h));\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON data loader (L.GeoJSON).\r\n\t */\r\n\t_loadLayer: function(geojson) {\r\n\t\tlet { polyline, theme, waypoints, wptIcons, wptLabels, distanceMarkers } = this.options;\r\n\t\tlet style = L.extend({}, polyline);\r\n\r\n\t\tif (theme) {\r\n\t\t\tstyle.className += ' ' + theme;\r\n\t\t}\r\n\r\n\t\tif (geojson.name) {\r\n\t\t\tthis.track_info.name = geojson.name;\r\n\t\t}\r\n\r\n\t\tlet layer = L.geoJson(geojson, {\r\n\t\t\tdistanceMarkers: distanceMarkers,\r\n\t\t\tstyle: style,\r\n\t\t\tpointToLayer: (feature, latlng) => {\r\n\t\t\t\tif (waypoints) {\r\n\t\t\t\t\tlet { desc, name, sym } = feature.properties;\r\n\t\t\t\t\tdesc = desc || '';\r\n\t\t\t\t\tname = name || '';\r\n\t\t\t\t\t// Handle chart waypoints (dots)\r\n\t\t\t\t\tif ([true, 'dots'].includes(waypoints)) {\r\n\t\t\t\t\t\tthis._registerCheckPoint({\r\n\t\t\t\t\t\t\tlatlng: latlng,\r\n\t\t\t\t\t\t\tlabel : ([true, 'dots'].includes(wptLabels) ? name : '')\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Handle map waypoints (markers)\r\n\t\t\t\t\tif ([true, 'markers'].includes(waypoints) && wptIcons != false) {\r\n\t\t\t\t\t\treturn this._registerMarker({\r\n\t\t\t\t\t\t\tlatlng : latlng,\r\n\t\t\t\t\t\t\tsym : (sym ?? name).replace(' ', '-').replace('\"', '').replace(\"'\", '').toLowerCase(),\r\n\t\t\t\t\t\t\tcontent: [true, 'markers'].includes(wptLabels) && (name || desc) && decodeURI(\"<b>\" + name + \"</b>\" + (desc.length > 0 ? '<br>' + desc : ''))\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonEachFeature: (feature, layer) => feature.geometry && feature.geometry.type != 'Point' && this.addData(feature, layer),\r\n\t\t});\r\n\r\n\t\tthis.import(this.__D3).then(() => {\r\n\t\t\tthis._initMapIntegrations(layer);\r\n\t\t\tthis._fireEvt(\"eledata_loaded\", { data: geojson, layer: layer, name: this.track_info.name, track_info: this.track_info });\r\n\t\t});\r\n\r\n\t\treturn layer;\r\n\t},\r\n\r\n\t_onDragEnd: function({ dragstart, dragend}) {\r\n\t\tthis._hideMarker();\r\n\t\tthis.fitBounds(L.latLngBounds([dragstart.latlng, dragend.latlng]));\r\n\r\n\t\tthis.fire(\"elechart_dragged\");\r\n\t},\r\n\r\n\t_onKeyDown: function({key}) {\r\n\t\tif(!this.options.detached && key === \"Escape\"){\r\n\t\t\tthis._collapse()\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Trigger mouseenter event.\r\n\t */\r\n\t_onMouseEnter: function() {\r\n\t\tthis.fire('elechart_enter');\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseover the chart and displays distance and altitude level.\r\n\t */\r\n\t_onMouseMove: function({xCoord}) {\r\n\t\tif (this._chartEnabled && this._data.length) {\r\n\t\t\tlet item = this._findItemForX(xCoord);\r\n\t\t\tif (item) {\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\t\t\tthis._setMapView(item);\r\n\r\n\t\t\t\tif (this._map) {\r\n\t\t\t\t\t_.addClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t\tthis.fire(\"elechart_hover\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles mouseover events of the data layers on the map.\r\n\t */\r\n\t_onMouseMoveLayer: function({latlng}) {\r\n\t\tif (this._data.length) {\r\n\t\t\tlet item = this._findItemForLatLng(latlng);\r\n\t\t\tif (item) {\r\n\t\t\t\tlet xCoord = item.xDiagCoord;\r\n\t\r\n\t\t\t\tif (this._chartEnabled) this._chart._showDiagramIndicator(item, xCoord);\r\n\t\r\n\t\t\t\tthis._updateMarker(item);\r\n\t\r\n\t\t\t\tthis.fire(\"elechart_change\", { data: item, xCoord: xCoord });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Handles the moueseout over the chart.\r\n\t */\r\n\t_onMouseOut: function() {\r\n\t\tif (!this.options.detached) {\r\n\t\t\tthis._hideMarker();\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t}\r\n\r\n\t\tif (this._map) {\r\n\t\t\t_.removeClass(this._map.getContainer(), 'elechart-hover');\r\n\t\t}\r\n\r\n\t\tthis.fire(\"elechart_leave\");\r\n\t},\r\n\r\n\t/**\r\n\t * Handles the drag event over the ruler filter.\r\n\t */\r\n\t_onRulerFilter: function({coords}) {\r\n\t\tthis._updateMapSegments(coords);\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle chart data on legend click\r\n\t */\r\n\t_onToggleChart: function({ name, enabled }) {\r\n\r\n\t\tthis._chartEnabled = this._chart._hasActiveLayers();\r\n\r\n\t\t// toggle layer visibility on empty chart\r\n\t\tthis._layers.eachLayer(layer => _.toggleClass(layer.getElement && layer.getElement(), this.options.polyline.className + ' ' + this.options.theme, this._chartEnabled));\r\n\r\n\t\t// toggle option value (eg. altitude = { 'disabled' || 'enabled' })\r\n\t\tthis.options[name] = !enabled && this.options[name] == 'disabled' ? 'enabled' : 'disabled';\r\n\r\n\t\t// remove marker on empty chart\r\n\t\tif (!this._chartEnabled) {\r\n\t\t\tthis._chart._hideDiagramIndicator();\r\n\t\t\tthis._marker.remove();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Simple GeoJSON Parser\r\n\t */\r\n\t_parseFromGeoJSONString: function(data) {\r\n\t\ttry {\r\n\t\t\treturn JSON.parse(data);\r\n\t\t} catch (e) { }\r\n\t},\r\n\r\n\t/**\r\n\t * Attempt to parse raw response data (GeoJSON or XML > GeoJSON)\r\n\t */\r\n\t_parseFromString: function(data) {\r\n\t\treturn new Promise(resolve =>\r\n\t\t\tthis.import(this.__TOGEOJSON).then(() => {\r\n\t\t\t\tlet geojson;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tgeojson = this._parseFromXMLString(data.trim());\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tgeojson = this._parseFromGeoJSONString(data.toString());\r\n\t\t\t\t}\r\n\t\t\t\tif (geojson) {\r\n\t\t\t\t\tgeojson.name = geojson.name || (this._downloadURL || '').split('/').pop().split('#')[0].split('?')[0];\r\n\t\t\t\t}\r\n\t\t\t\tresolve(geojson);\r\n\t\t\t})\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Simple XML Parser (GPX, KML, TCX)\r\n\t */\r\n\t_parseFromXMLString: function(data) {\r\n\t\tif (data.indexOf(\"<\") != 0) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tlet xml = (new DOMParser()).parseFromString(data, \"text/xml\");\r\n\t\tlet type = xml.documentElement.tagName.toLowerCase(); // \"kml\" or \"gpx\"\r\n\t\tlet name = xml.getElementsByTagName('name');\r\n\t\tif (xml.getElementsByTagName('parsererror').length) {\r\n\t\t\tthrow 'Invalid XML';\r\n\t\t}\r\n\t\tif (!(type in toGeoJSON)) {\r\n\t\t\ttype = xml.documentElement.tagName == \"TrainingCenterDatabase\" ? 'tcx' : 'gpx';\r\n\t\t}\r\n\t\tlet geojson = toGeoJSON[type](xml);\r\n\t\tgeojson.name = name.length > 0 ? (Array.from(name).find(tag => tag.parentElement.tagName == \"trk\") ?? name[0]).textContent : '';\r\n\t\treturn geojson;\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart profile to diagram\r\n\t */\r\n\t_registerAreaPath: function(props) {\r\n\t\tthis.on(\"elechart_init\", () => this._chart._registerAreaPath(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart grid to diagram\r\n\t */\r\n\t_registerAxisGrid: function(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisGrid(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add chart axis to diagram\r\n\t */\r\n\t_registerAxisScale: function(props) {\r\n\t\tthis.on(\"elechart_axis\", () => this._chart._registerAxisScale(props));\r\n\t},\r\n\r\n\t/**\r\n\t * Add a point of interest over the diagram\r\n\t */\r\n\t_registerCheckPoint: function(props) {\r\n\t\tthis.on(\"elechart_updated\", () => this._chart._registerCheckPoint(props));\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Base handler for iterative track statistics (dist, time, z, slope, speed, acceleration, ...)\r\n\t */\r\n\t _registerDataAttribute: function(props) {\r\n\r\n\t\t// parse of \"coordinateProperties\" for later usage\r\n\t\tif (props.coordPropsToMeta) {\r\n\t\t\tthis.on(\"elepoint_init\", (e) => props.coordPropsToMeta.call(this, e));\r\n\t\t}\r\n\r\n\t\t// prevent excessive variabile instanstations\r\n\t\tlet i, curr, prev, attr = props.attr || props.name;\r\n\r\n\t\t// save here a reference to last used point\r\n\t\tlet lastValid = {};\r\n\r\n\t\t// iteration\r\n\t\tthis.on(\"elepoint_added\", ({index, point}) => {\r\n\t\t\ti = index;\r\n\r\n\t\t\tprev = curr ?? this._data[i]; // same as: this._data[i > 0 ? i - 1 : i]\r\n\t\t\tcurr = this._data[i];\r\n\r\n\t\t\t// retrieve point value\r\n\t\t\tcurr[attr] = props.pointToAttr.call(this, point, i);\r\n\r\n\t\t\t// check and fix missing data on last added point\r\n\t\t\tif (i > 0 && isNaN(prev[attr])) {\r\n\t\t\t\tif (!isNaN(lastValid[attr]) && !isNaN(curr[attr])) {\r\n\t\t\t\t\tprev[attr] = (lastValid[attr] + curr[attr]) / 2;\r\n\t\t\t\t} else if (!isNaN(lastValid[attr])) {\r\n\t\t\t\t\tprev[attr] = lastValid[attr];\r\n\t\t\t\t} else if (!isNaN(curr[attr])) {\r\n\t\t\t\t\tprev[attr] = curr[attr];\r\n\t\t\t\t}\r\n\t\t\t\t// update \"yAttr\" and \"xAttr\"\r\n\t\t\t\tif (props.meta) {\r\n\t\t\t\t\tprev[props.meta] = prev[attr];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// skip to next iteration for invalid or missing data (eg. i == 0)\r\n\t\t\tif (isNaN(curr[attr])) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// update reference to last used point\r\n\t\t\tlastValid[attr] = curr[attr];\r\n\r\n\t\t\t// Limit \"crazy\" delta values.\r\n\t\t\tif (props.deltaMax) {\r\n\t\t\t\tcurr[attr] =_.wrapDelta(curr[attr], prev[attr], props.deltaMax);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Range of acceptable values.\r\n\t\t\tif (props.clampRange) {\r\n\t\t\t\tcurr[attr] = _.clamp(curr[attr], props.clampRange);\r\n\t\t\t}\r\n\r\n\t\t\t// Limit floating point precision.\r\n\t\t\tif (!isNaN(props.decimals)) {\r\n\t\t\t\tcurr[attr] = _.round(curr[attr], props.decimals);\r\n\t\t\t}\r\n\r\n\t\t\t// update \"track_info\" stats (min, max, avg, ...)\r\n\t\t\tif (props.stats) {\r\n\t\t\t\tfor (const key in props.stats) {\r\n\t\t\t\t\tlet sname = (props.statsName || attr) + (key != '' ? '_' : '');\r\n\t\t\t\t\tthis.track_info[sname + key] = props.stats[key].call(this, curr[attr], this.track_info[sname + key], this._data.length);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// update here some mixins (eg. complex \"track_info\" stuff)\r\n\t\t\tif (props.onPointAdded) props.onPointAdded.call(this, curr[attr], i, point);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Parse a module definition and attach related function listeners\r\n\t */\r\n\t_registerHandler: function(props) {\r\n\r\n\t\t// eg. L.Control.Altitude\r\n\t\tif (typeof props === \"function\") {\r\n\t\t\treturn this._registerHandler(props.call(this));\r\n\t\t}\r\n\r\n\t\tlet {\r\n\t\t\tname,\r\n\t\t\tattr,\r\n\t\t\trequired,\r\n\t\t\tdeltaMax,\r\n\t\t\tclampRange,\r\n\t\t\tdecimals,\r\n\t\t\tmeta,\r\n\t\t\tunit,\r\n\t\t\tcoordinateProperties,\r\n\t\t\tcoordPropsToMeta,\r\n\t\t\tpointToAttr,\r\n\t\t\tonPointAdded,\r\n\t\t\tstats,\r\n\t\t\tstatsName,\r\n\t\t\tgrid,\r\n\t\t\tscale,\r\n\t\t\tpath,\r\n\t\t\ttooltip,\r\n\t\t\tsummary\r\n\t\t} = props;\r\n\r\n\t\t// eg. \"altitude\" == true\r\n\t\tif (this.options[name] || required) {\r\n\r\n\t\t\tthis._registerDataAttribute({\r\n\t\t\t\tname,\r\n\t\t\t\tattr,\r\n\t\t\t\tmeta,\r\n\t\t\t\tdeltaMax,\r\n\t\t\t\tclampRange,\r\n\t\t\t\tdecimals,\r\n\t\t\t\tcoordPropsToMeta: _.coordPropsToMeta(coordinateProperties, meta || name, coordPropsToMeta),\r\n\t\t\t\tpointToAttr,\r\n\t\t\t\tonPointAdded,\r\n\t\t\t\tstats,\r\n\t\t\t\tstatsName,\r\n\t\t\t});\r\n\r\n\t\t\tif (grid) {\r\n\t\t\t\tthis._registerAxisGrid(L.extend({ name }, grid));\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options[name] !== \"summary\") {\r\n\t\t\t\tif (scale) this._registerAxisScale(L.extend({ name, label: unit }, scale));\r\n\t\t\t\tif (path) this._registerAreaPath(L.extend({ name }, path));\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltip || props.tooltips) {\r\n\t\t\t\t_.each([tooltip, ...(props.tooltips || [])], t => t && this._registerTooltip(L.extend({ name }, t)));\r\n\t\t\t}\r\n\r\n\t\t\tif (summary) {\r\n\t\t\t\t_.each(summary, (s, k) => summary[k] = L.extend({ unit }, s));\r\n\t\t\t\tthis._registerSummary(summary);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_registerMarker({latlng, sym, content}) {\r\n\t\tlet { wptIcons } = this.options;\r\n\t\t// generate and cache appropriate icon symbol\r\n\t\tif (!wptIcons.hasOwnProperty(sym)) {\r\n\t\t\twptIcons[sym] = L.divIcon(L.extend({}, wptIcons[\"\"].options, { html: '<i class=\"elevation-waypoint-icon ' + sym + '\"></i>' } ));\r\n\t\t}\r\n\t\tlet marker = L.marker(latlng, { icon: wptIcons[sym] });\r\n\t\tif (content) {\r\n\t\t\tmarker.bindPopup(content, { className: 'elevation-popup', keepInView: true }).openPopup();\r\n\t\t\tmarker.bindTooltip(content, { className: 'elevation-tooltip', direction: 'auto', sticky: true, opacity: 1 }).openTooltip();\r\n\t\t}\r\n\t\treturn this._addMarker(marker)\r\n\t},\r\n\t\r\n\t/**\r\n\t * Add chart or marker tooltip info\r\n\t */\r\n\t_registerTooltip: function(props) {\r\n\t\tprops.chart && this.on(\"elechart_init\", () => this._chart._registerTooltip(L.extend({}, props, { value: props.chart })));\r\n\t\tprops.marker && this.on(\"elechart_marker\", () => this._marker._registerTooltip(L.extend({}, props, { value: props.marker })));\r\n\t},\r\n\r\n\t/**\r\n\t * Add summary info to diagram\r\n\t */\r\n\t_registerSummary: function(props) {\r\n\t\tthis.on('elechart_summary', () => this._summary._registerSummary(props));\r\n\t},\r\n\r\n\t/*\r\n\t * Removes the drag rectangle and zoms back to the total extent of the data.\r\n\t */\r\n\t_resetDrag: function() {\r\n\t\tthis._chart._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t},\r\n\r\n\t/**\r\n\t * Resets drag, marker and bounds.\r\n\t */\r\n\t_resetView: function() {\r\n\t\tif (this._map && this._map._isFullscreen) return;\r\n\t\tthis._resetDrag();\r\n\t\tthis._hideMarker();\r\n\t\tif (this.options.autofitBounds) {\r\n\t\t\tthis.fitBounds();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hacky way for handling chart resize. Deletes it and redraw chart.\r\n\t */\r\n\t_resizeChart: function() {\r\n\t\tif (this._container && _.style(this._container, \"display\") != \"none\") {\r\n\t\t\tlet opts = this.options;\r\n\t\t\tlet newWidth = opts.detached ? (this.eleDiv || this._container).offsetWidth : _.clamp(opts._maxWidth, [0, this._map.getContainer().clientWidth - 30]);\r\n\t\t\tif (newWidth) {\r\n\t\t\t\topts.width = newWidth;\r\n\t\t\t\tif (this._chart && this._chart._chart) {\r\n\t\t\t\t\tthis._chart._chart._resize(opts);\r\n\t\t\t\t\tthis._updateChart();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis._updateMapSegments();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Collapse or Expand chart control.\r\n\t */\r\n\t_toggle: function() {\r\n\t\t_.hasClass(this._container, \"elevation-expanded\") ? this._collapse() : this._expand();\r\n\t},\r\n\r\n\t/**\r\n\t * Update map center and zoom (followMarker: true)\r\n\t */\r\n\t_setMapView: function(item) {\r\n\t\tif (this._map && this.options.followMarker) {\r\n\t\t\tlet zoom = this._map.getZoom();\r\n\t\t\tlet z = this.options.zFollow;\r\n\t\t\tif (typeof z === \"number\") {\r\n\t\t\t\tthis._map.setView(item.latlng, (zoom < z ? z : zoom), { animate: true, duration: 0.25 });\r\n\t\t\t} else if (!this._map.getBounds().contains(item.latlng)) {\r\n\t\t\t\tthis._map.setView(item.latlng, zoom, { animate: true, duration: 0.25 });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates [x, y] domain and then update chart.\r\n\t */\r\n\t_updateChart: function() {\r\n\t\tif (this._chart && this._container) {\r\n\t\t\tthis.fire(\"elechart_axis\");\r\n\t\r\n\t\t\tthis._chart.update({ data: this._data, options: this.options });\r\n\t\r\n\t\t\tthis._x = this._chart._x;\r\n\t\t\tthis._y = this._chart._y;\r\n\t\r\n\t\t\tthis.fire('elechart_updated');\t\t\r\n\t\t}\r\n\t},\r\n\r\n\t/*\r\n\t * Update the position/height indicator marker drawn onto the map\r\n\t */\r\n\t_updateMarker: function(item) {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update({\r\n\t\t\t\tmap : this._map,\r\n\t\t\t\titem : item,\r\n\t\t\t\tyCoordMax : this._yCoordMax || 0,\r\n\t\t\t\toptions : this.options\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fix marker rotation on rotated maps\r\n\t */\r\n\t_rotateMarker: function() {\r\n\t\tif (this._marker) {\r\n\t\t\tthis._marker.update();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Highlight track segments on the map.\r\n\t */\r\n\t_updateMapSegments: function(coords) {\r\n\t\tthis._markedSegments.setLatLngs(coords || []);\r\n\t\tif (coords && this._map && !this._map.hasLayer(this._markedSegments)) {\r\n\t\t\tthis._markedSegments.addTo(this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Update chart summary.\r\n\t */\r\n\t_updateSummary: function() {\r\n\t\tif (this._summary) {\r\n\t\t\tthis._summary.reset();\r\n\t\t\tif (this.options.summary) {\r\n\t\t\t\tthis.fire(\"elechart_summary\");\r\n\t\t\t\tthis._summary.update();\r\n\t\t\t}\r\n\t\t\tif (this.options.downloadLink && this._downloadURL) { // TODO: generate dynamically file content instead of using static file urls.\r\n\t\t\t\tthis._summary._container.innerHTML += '<span class=\"download\"><a href=\"#\">' + L._('Download') + '</a></span>'\r\n\t\t\t\t_.select('.download a', this._summary._container).onclick = (e) => {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tlet event = { downloadLink: this.options.downloadLink, confirm: _.saveFile.bind(this, this._downloadURL) };\r\n\t\t\t\t\tif (this.options.downloadLink == 'modal' && typeof CustomEvent === \"function\") {\r\n\t\t\t\t\t\tdocument.dispatchEvent(new CustomEvent(\"eletrack_download\", { detail: event }));\r\n\t\t\t\t\t} else if (this.options.downloadLink == 'link' || this.options.downloadLink === true) {\r\n\t\t\t\t\t\tevent.confirm();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.fire('eletrack_download', event);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Calculates chart width.\r\n\t */\r\n\t_width: function() {\r\n\t\tif (this._chart) return this._chart._width();\r\n\t\tconst { width, margins } = this.options;\r\n\t\treturn width - margins.left - margins.right;\r\n\t},\r\n\r\n\t/**\r\n\t * Calculates chart height.\r\n\t */\r\n\t_height: function() {\r\n\t\tif (this._chart) return this._chart._height();\r\n\t\tconst { height, margins } = this.options;\r\n\t\treturn height - margins.top - margins.bottom;\r\n\t},\r\n\r\n});\r\n","/*\r\n * Copyright (c) 2019, GPL-3.0+ Project, Raruto\r\n *\r\n * This file is free software: you may copy, redistribute and/or modify it\r\n * under the terms of the GNU General Public License as published by the\r\n * Free Software Foundation, either version 2 of the License, or (at your\r\n * option) any later version.\r\n *\r\n * This file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n * General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with this program. If not, see .\r\n *\r\n * This file incorporates work covered by the following copyright and\r\n * permission notice:\r\n *\r\n * Copyright (c) 2013-2016, MIT License, Felix “MrMufflon” Bache\r\n *\r\n * Permission to use, copy, modify, and/or distribute this software\r\n * for any purpose with or without fee is hereby granted, provided\r\n * that the above copyright notice and this permission notice appear\r\n * in all copies.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL\r\n * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE\r\n * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR\r\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\r\n * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,\r\n * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\r\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n */\r\n\r\nimport * as _ from './utils';\r\nimport { Elevation } from './control';\r\n\r\nElevation.Utils = _;\r\n\r\nL.control.elevation = (options) => new Elevation(options);\r\n"],"names":["Colors","lightblue","area","alpha","stroke","magenta","yellow","purple","steelblue","red","lime","line","MIN","SEC","HOUR","DAY","saveFile","dataURI","fileName","a","create","href","target","download","style","b","document","body","appendChild","click","removeChild","coordPropsToMeta","coordProps","name","parser","props","point","id","isMulti","key","meta","parseNumeric","call","this","property","parseInt","addClass","n","str","split","every","s","L","DomUtil","removeClass","toggleClass","cond","replaceClass","rem","add","k","v","getStyle","setProperty","setAttributes","attrs","setAttribute","toggleEvent","el","e","fn","tag","elem","append","c","insert","pos","insertAdjacentElement","select","querySelector","each","obj","i","randomId","Math","random","toString","substr","on","off","DomEvent","throttle","wrapNum","Util","hasClass","round","formatNum","clamp","val","range","wrapDelta","curr","prev","deltaMax","abs","sign","t","d","floor","h","m","padStart","format","time","Date","toLocaleTimeString","toLocaleDateString","toLocaleString","replaceAll","ctx","path","classed","beginPath","moveTo","p","Path2D","attr","strokeStyle","fillStyle","lineWidth","globalCompositeOperation","globalAlpha","fill","closePath","parse","iVal","max","Infinity","min","avg","idx","sum","Options","autofitBounds","autohide","autohideMarker","almostover","altitude","closeBtn","collapsed","detached","distance","distanceMarkers","lazy","direction","dragging","Browser","mobile","downloadLink","elevationDiv","followMarker","imperial","legend","handlers","hotline","marker","markerIcon","divIcon","className","html","iconSize","iconAnchor","position","polyline","color","opacity","weight","lineCap","polylineSegments","interactive","preferCanvas","reverseCoords","ruler","theme","summary","slope","speed","timeFactor","timestamps","trkStart","radius","fillColor","fillOpacity","trkEnd","waypoints","wptIcons","wptLabels","xAttr","xLabel","yAttr","yLabel","zFollow","zooming","Mobile","margins","top","right","bottom","left","height","screen","width","xTicks","undefined","yTicks","decimalsX","decimalsY","forceAxisBounds","interpolation","yAxisMax","yAxisMin","_","i18n","string","data","baseURL","currentScript","src","url","location","require","__filename","URL","baseURI","slice","join","Elevation","Control","extend","includes","Evented","prototype","Mixin","Events","options","__mileFactor","__footFactor","__D3","__TOGEOJSON","__LGEOMUTIL","__LALMOSTOVER","__LHOTLINE","__LDISTANCEM","__LCHART","__LMARKER","__LSUMMARY","__modulesFolder","__btnIcon","addData","layer","import","then","_modulesLoaded","_addData","_addLayer","_fireEvt","track_info","once","addTo","map","parent","_.select","eleDiv","onAdd","_.append","_.insert","getContainer","clear","_marker","remove","_chart","_clearChart","_layers","_clearLayers","_markers","_circleMarkers","_hotline","_data","_updateChart","_events","elechart_updated","forEach","_container","selectAll","l","eachLayer","f","clearLayers","disableBrush","_brushEnabled","_resetDrag","enableBrush","disableZoom","_zoomEnabled","_resetZoom","enableZoom","fitBounds","bounds","getBounds","_map","isValid","latLngBounds","latlng","getZFollow","hide","_.style","initialize","opts","setOptions","featureGroup","_markedSegments","_start","circleMarker","_end","_chartEnabled","_yCoordMax","_setMapView","_.throttle","setStyle","_.Colors","colors","_fixCanvasPaths","_fixTooltipSize","condition","d3","toGeoJSON","GeometryUtil","Handler","AlmostOver","DistanceMarkers","Hotline","startsWith","Promise","resolve","load","_parseFromString","geojson","_loadLayer","_loadFile","container","_.create","_.randomId","_loadModules","_initChart","_initButton","_initSummary","_initMarker","_initLayer","fire","onRemove","_hideMarker","_resetView","_resizeChart","_.off","_onKeyDown","_updateSummary","redraw","setZFollow","zoom","show","type","_.each","features","feature","geom","geometry","_addGeoJSONData","coordinates","properties","coords","console","warn","_latlngs","nestingLevel","coordinateProperties","ele","_addPoint","lat","lng","alt","index","length","x","y","z","push","latLng","addLayer","Polyline","_addMarker","_initAlmostOverHandler","almostOver","all","addHandler","enabled","_onMouseMoveLayer","_onMouseOut","_initDistanceMarkers","_initHotLine","prop","trkseg","geo","geoJson","coordsToLatLng","altitudeFactor","renderer","isFinite","palette","outlineColor","outlineWidth","_renderer","parentElement","insertBefore","firstChild","_initMapIntegrations","setLatLng","invalidateSize","_collapse","_.replaceClass","_expand","oldProto","Canvas","_fillStroke","control","replace","include","hasLayer","oldVal","outline","xCoord","_showDiagramIndicator","_updateMarker","_findItemForLatLng","_findIndexForLatLng","_findItemForX","_findIndexForXCoord","propagate","offsetWidth","offsetHeight","clientWidth","_maxWidth","maxWidth","chart","Chart","_x","_y","render","_onMouseEnter","_onDragEnd","_onMouseMove","_onRulerFilter","_onToggleChart","_rotateMarker","_.on","node","getElement","_.toggleClass","_.toggleEvent","bind","pane","getPane","_pane","createPane","zIndex","pointerEvents","svg","Marker","disableClickPropagation","disableScrollPropagation","link","_button","title","stop","_toggle","fetch","r","ok","text","img","innerHTML","_summary","Summary","response","_downloadURL","catch","err","modules","file","toLowerCase","exported","Object","keys","_registerHandler","pointToLayer","desc","sym","_registerCheckPoint","label","_registerMarker","content","decodeURI","onEachFeature","dragstart","dragend","item","_.addClass","xDiagCoord","_hideDiagramIndicator","_.removeClass","_updateMapSegments","_hasActiveLayers","_parseFromGeoJSONString","JSON","_parseFromXMLString","trim","pop","indexOf","xml","DOMParser","parseFromString","documentElement","tagName","getElementsByTagName","Array","from","find","textContent","_registerAreaPath","_registerAxisGrid","_registerAxisScale","_registerDataAttribute","lastValid","pointToAttr","isNaN","_.wrapDelta","clampRange","_.clamp","decimals","_.round","stats","sname","statsName","onPointAdded","required","unit","grid","scale","tooltip","_.coordPropsToMeta","tooltips","_registerTooltip","_registerSummary","hasOwnProperty","icon","bindPopup","keepInView","openPopup","bindTooltip","sticky","openTooltip","value","_isFullscreen","newWidth","_resize","_.hasClass","getZoom","setView","animate","duration","contains","update","yCoordMax","setLatLngs","reset","onclick","preventDefault","event","confirm","_.saveFile","CustomEvent","dispatchEvent","detail","_width","_height","Utils","elevation"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
L.DistanceMarker=L.CircleMarker.extend({_updatePath:function(){let ctx=this._renderer._ctx,p=this._point;if(this.options.rotation=this.options.rotation||0,this.options.radius&&this._renderer._updateCircle&&this._renderer._updateCircle(this),this.options.icon&&this.options.icon.url)if(this.options.icon.element){const icon=this.options.icon;let cx=p.x+icon.offset.x,cy=p.y+icon.offset.y;ctx.save(),icon.rotate&&(ctx.translate(p.x,p.y),ctx.rotate(icon.rotate),cx=0,cy=0),ctx.drawImage(icon.element,cx-icon.size[0]/2,cy-icon.size[1]/2,icon.size[0],icon.size[1]),ctx.restore()}else{const icon=document.createElement("img");this.options.icon=L.extend({rotate:0,size:[40,40],offset:{x:0,y:0}},this.options.icon),this.options.icon.rotate+=this.options.rotation,this.options.icon.element=icon,icon.src=this.options.icon.url,icon.onload=()=>this.redraw(),icon.onerror=()=>this.options.icon=null}if(this.options.label){let cx=p.x,cy=p.y;ctx.save(),ctx.font=this.options.font||'normal 7pt "Helvetica Neue", Arial, Helvetica, sans-serif',ctx.textAlign="center",ctx.textBaseline="middle",ctx.fillStyle=this.options.fillStyle||"black",this.options.rotation&&(ctx.translate(p.x,p.y),ctx.rotate(this.options.rotation),cx=0,cy=0),this._map.getZoom()>17&&(ctx.fillStyle=this.options.strokeStyle||"black"),ctx.fillText(this.options.label,cx,cy),this.options.strokeStyle&&this._map.getZoom()<=17&&(ctx.strokeStyle=this.options.strokeStyle,ctx.strokeText(this.options.label,cx,cy)),ctx.restore()}}}),L.DistanceMarkers=L.LayerGroup.extend({options:{cssClass:"dist-marker",iconSize:[12,12],arrowSize:[10,10],arrowUrl:"data:image/svg+xml,%3Csvg transform='rotate(90)' xmlns='http://www.w3.org/2000/svg' width='560px' height='560px' viewBox='0 0 560 560'%3E%3Cpath stroke-width='35' fill='%23000' stroke='%23FFF' d='M280,40L522,525L280,420L38,525z'/%3E%3C/svg%3E",offset:1e3,showAll:12,textFunction:(distance,i,offset)=>i,distance:!0,direction:!0},initialize:function(line,map,options){this._layers={},this._zoomLayers={},options=L.setOptions(this,options);let preferCanvas=map.options.preferCanvas,showAll=Math.min(map.getMaxZoom(),options.showAll);preferCanvas||map.options.rotate||console.warn('Missing dependency: "leaflet-rotate"');let coords="function"==typeof line.getLatLngs?line.getLatLngs():line;coords=L.LineUtil.isFlat(coords)?[coords]:coords,coords.forEach(latlngs=>{let accumulated=L.GeometryUtil.accumulatedLengths(latlngs),length=accumulated.length>0?accumulated[accumulated.length-1]:0;for(let i=1,count=Math.floor(length/options.offset),j=0;i<=count;++i){let distance=options.offset*i;for(;j<accumulated.length-1&&accumulated[j]<distance;)++j;let p1=latlngs[j-1],p2=latlngs[j],m_line=L.polyline([p1,p2]),ratio=(distance-accumulated[j-1])/(accumulated[j]-accumulated[j-1]),position=L.GeometryUtil.interpolateOnLine(map,m_line,ratio),delta=map.project(p2).subtract(map.project(p1)),angle=Math.atan2(delta.y,delta.x),text=options.textFunction.call(this,distance,i,options.offset),zoom=this._minimumZoomLevelForItem(i,showAll),markers=this._zoomLayers[zoom]=this._zoomLayers[zoom]||L.layerGroup();options.direction&&(options.distance&&i%2==1||!options.distance)&&(preferCanvas?markers.addLayer(new L.DistanceMarker(p1,{radius:0,icon:{url:options.arrowUrl,size:options.arrowSize,rotate:0,offset:{x:0,y:0}},rotation:angle,interactive:!1})):markers.addLayer(L.marker(position.latLng,{icon:L.icon({iconUrl:options.arrowUrl,iconSize:options.arrowSize}),rotation:angle
|
|
1
|
+
L.DistanceMarker=L.CircleMarker.extend({_updatePath:function(){let ctx=this._renderer._ctx,p=this._point;if(this.options.rotation=this.options.rotation||0,this.options.radius&&this._renderer._updateCircle&&this._renderer._updateCircle(this),this.options.icon&&this.options.icon.url)if(this.options.icon.element){const icon=this.options.icon;let cx=p.x+icon.offset.x,cy=p.y+icon.offset.y;ctx.save(),icon.rotate&&(ctx.translate(p.x,p.y),ctx.rotate(icon.rotate),cx=0,cy=0),ctx.drawImage(icon.element,cx-icon.size[0]/2,cy-icon.size[1]/2,icon.size[0],icon.size[1]),ctx.restore()}else{const icon=document.createElement("img");this.options.icon=L.extend({rotate:0,size:[40,40],offset:{x:0,y:0}},this.options.icon),this.options.icon.rotate+=this.options.rotation,this.options.icon.element=icon,icon.src=this.options.icon.url,icon.onload=()=>this.redraw(),icon.onerror=()=>this.options.icon=null}if(this.options.label){let cx=p.x,cy=p.y;ctx.save(),ctx.font=this.options.font||'normal 7pt "Helvetica Neue", Arial, Helvetica, sans-serif',ctx.textAlign="center",ctx.textBaseline="middle",ctx.fillStyle=this.options.fillStyle||"black",this.options.rotation&&(ctx.translate(p.x,p.y),ctx.rotate(this.options.rotation),cx=0,cy=0),this._map.getZoom()>17&&(ctx.fillStyle=this.options.strokeStyle||"black"),ctx.fillText(this.options.label,cx,cy),this.options.strokeStyle&&this._map.getZoom()<=17&&(ctx.strokeStyle=this.options.strokeStyle,ctx.strokeText(this.options.label,cx,cy)),ctx.restore()}}}),L.DistanceMarkers=L.LayerGroup.extend({options:{cssClass:"dist-marker",iconSize:[12,12],arrowSize:[10,10],arrowUrl:"data:image/svg+xml,%3Csvg transform='rotate(90)' xmlns='http://www.w3.org/2000/svg' width='560px' height='560px' viewBox='0 0 560 560'%3E%3Cpath stroke-width='35' fill='%23000' stroke='%23FFF' d='M280,40L522,525L280,420L38,525z'/%3E%3C/svg%3E",offset:1e3,showAll:12,textFunction:(distance,i,offset)=>i,distance:!0,direction:!0},initialize:function(line,map,options){this._layers={},this._zoomLayers={},options=L.setOptions(this,options);let preferCanvas=map.options.preferCanvas,showAll=Math.min(map.getMaxZoom(),options.showAll);preferCanvas||map.options.rotate||console.warn('Missing dependency: "leaflet-rotate"');let coords="function"==typeof line.getLatLngs?line.getLatLngs():line;coords=L.LineUtil.isFlat(coords)?[coords]:coords,coords.forEach(latlngs=>{let accumulated=L.GeometryUtil.accumulatedLengths(latlngs),length=accumulated.length>0?accumulated[accumulated.length-1]:0;for(let i=1,count=Math.floor(length/options.offset),j=0;i<=count;++i){let distance=options.offset*i;for(;j<accumulated.length-1&&accumulated[j]<distance;)++j;let p1=latlngs[j-1],p2=latlngs[j],m_line=L.polyline([p1,p2]),ratio=(distance-accumulated[j-1])/(accumulated[j]-accumulated[j-1]),position=L.GeometryUtil.interpolateOnLine(map,m_line,ratio),delta=map.project(p2).subtract(map.project(p1)),angle=Math.atan2(delta.y,delta.x),text=options.textFunction.call(this,distance,i,options.offset),zoom=this._minimumZoomLevelForItem(i,showAll),markers=this._zoomLayers[zoom]=this._zoomLayers[zoom]||L.layerGroup();options.direction&&(options.distance&&i%2==1||!options.distance)&&(preferCanvas?markers.addLayer(new L.DistanceMarker(p1,{radius:0,icon:{url:options.arrowUrl,size:options.arrowSize,rotate:0,offset:{x:0,y:0}},rotation:angle,interactive:!1})):markers.addLayer(L.marker(position.latLng,{icon:L.icon({iconUrl:options.arrowUrl,iconSize:options.arrowSize}),rotation:angle,interactive:!1}))),options.distance&&i%2==0&&(preferCanvas?markers.addLayer(new L.DistanceMarker(position.latLng,{label:text,radius:7,fillColor:"#fff",fillOpacity:1,fillStyle:"black",color:"#777",weight:1,interactive:!1})):markers.addLayer(L.marker(position.latLng,{title:text,icon:L.divIcon({className:options.cssClass,html:text,iconSize:options.iconSize}),interactive:!1})))}});const updateMarkerVisibility=()=>{let oldZoom=this._lastZoomLevel||0,newZoom=map.getZoom();if(newZoom>oldZoom)for(let i=oldZoom+1;i<=newZoom;++i)void 0!==this._zoomLayers[i]&&this.addLayer(this._zoomLayers[i]);else if(newZoom<oldZoom)for(let i=oldZoom;i>newZoom;--i)void 0!==this._zoomLayers[i]&&this.removeLayer(this._zoomLayers[i]);this._lastZoomLevel=newZoom};map.on("zoomend",updateMarkerVisibility),updateMarkerVisibility()},_minimumZoomLevelForItem:function(i,zoom){for(;i>0&&i%2==0;)--zoom,i=Math.floor(i/2);return zoom}}),L.Polyline.include({_originalOnAdd:L.Polyline.prototype.onAdd,_originalOnRemove:L.Polyline.prototype.onRemove,addDistanceMarkers:function(){this._map&&this._distanceMarkers&&this._map.addLayer(this._distanceMarkers)},removeDistanceMarkers:function(){this._map&&this._distanceMarkers&&this._map.removeLayer(this._distanceMarkers)},onAdd:function(map){this._originalOnAdd(map);let opts=this.options.distanceMarkers||{};this.options.distanceMarkers&&(this._distanceMarkers=this._distanceMarkers||new L.DistanceMarkers(this,map,opts)),void 0!==opts.lazy&&!1!==opts.lazy||this.addDistanceMarkers()},onRemove:function(map){this.removeDistanceMarkers(),this._originalOnRemove(map)}});
|
package/package.json
CHANGED
package/src/components/d3.js
CHANGED
|
@@ -268,7 +268,7 @@ export const LegendSmall = ({
|
|
|
268
268
|
// .merge(label.data([{ idx: id }]))
|
|
269
269
|
// .text(d => items.length ? (items[idx][0].toUpperCase() + items[idx].slice(1)) : '')
|
|
270
270
|
// .on("mousedown", (e, d) => setIdx(L.Util.wrapNum((idx + 1), [0, items.length])));
|
|
271
|
-
label.text(items.length ? (items[idx][0].toUpperCase() + items[idx].slice(1)) : '');
|
|
271
|
+
label.text(items.length ? L._((items[idx][0].toUpperCase() + items[idx].slice(1))) : '');
|
|
272
272
|
onClick(items[idx]);
|
|
273
273
|
};
|
|
274
274
|
setIdx(0);
|