{"version":3,"file":"js/chunk-vendors-07e78ab3.0c77a22a.js","mappings":"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","sources":["webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/CategoryAxis.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/CategoryAxisBreak.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/DateAxis.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/DateAxisBreak.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/DurationAxis.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/Grid.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/GridCircular.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/ValueAxis.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/axes/ValueAxisBreak.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/cursors/Cursor.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/cursors/RadarCursor.js","webpack://rokk3rfuel/./node_modules/@amcharts/amcharts4/.internal/charts/cursors/XYCursor.js"],"sourcesContent":["/**\r\n * Category axis module\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Axis, AxisDataItem } from \"./Axis\";\r\nimport { AxisRendererX } from \"./AxisRendererX\";\r\nimport { AxisRendererY } from \"./AxisRendererY\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { CategoryAxisBreak } from \"./CategoryAxisBreak\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Defines a [[DataItem]] for [[CategoryAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nvar CategoryAxisDataItem = /** @class */ (function (_super) {\r\n __extends(CategoryAxisDataItem, _super);\r\n /**\r\n * Constructor\r\n */\r\n function CategoryAxisDataItem() {\r\n var _this = _super.call(this) || this;\r\n _this.seriesDataItems = {};\r\n _this.className = \"CategoryAxisDataItem\";\r\n _this.text = \"{category}\";\r\n _this.locations.category = 0;\r\n _this.locations.endCategory = 1;\r\n _this.deltaPosition = 0;\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(CategoryAxisDataItem.prototype, \"category\", {\r\n /**\r\n * @return Category\r\n */\r\n get: function () {\r\n if (this._adapterO) {\r\n if (this._adapterO.isEnabled(\"category\")) {\r\n return this._adapterO.apply(\"category\", this.properties.category);\r\n }\r\n }\r\n return this.properties.category;\r\n },\r\n /**\r\n * Category.\r\n *\r\n * @param value Category\r\n */\r\n set: function (value) {\r\n var oldCategory = this.properties.category;\r\n this.setProperty(\"category\", value);\r\n if ($type.hasValue(oldCategory) && oldCategory != value) {\r\n if (this.component) {\r\n this.component.validateDataElement(this);\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisDataItem.prototype, \"endCategory\", {\r\n /**\r\n * @return End category\r\n */\r\n get: function () {\r\n return this.properties.endCategory;\r\n },\r\n /**\r\n * End category.\r\n *\r\n * Used for items that span several categories, like [[CategoryAxisBreak]].\r\n *\r\n * @param value End category\r\n */\r\n set: function (value) {\r\n this.setProperty(\"endCategory\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisDataItem.prototype, \"deltaPosition\", {\r\n get: function () {\r\n return this.properties.deltaCoordinate;\r\n },\r\n set: function (value) {\r\n if (value != this.properties.deltaCoordinate) {\r\n this.setProperty(\"deltaCoordinate\", value);\r\n if (this.component) {\r\n this.component.invalidateDataItems();\r\n this.component.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return CategoryAxisDataItem;\r\n}(AxisDataItem));\r\nexport { CategoryAxisDataItem };\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Used to create a category-based axis for the chart.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Clients\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Clients\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"CategoryAxis\",\r\n * \"title\": {\r\n * \"text\": \"Clients\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link ICategoryAxisEvents} for a list of available Events\r\n * @see {@link ICategoryAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nvar CategoryAxis = /** @class */ (function (_super) {\r\n __extends(CategoryAxis, _super);\r\n /**\r\n * Constructor\r\n */\r\n function CategoryAxis() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n /**\r\n * A collection that holds Axis' data items sorted by each category.\r\n */\r\n _this.dataItemsByCategory = new Dictionary();\r\n _this.className = \"CategoryAxis\";\r\n // Set field name\r\n _this.axisFieldName = \"category\";\r\n _this._lastDataItem = _this.createDataItem();\r\n _this._lastDataItem.component = _this;\r\n _this._disposers.push(_this._lastDataItem);\r\n // Apply theme\r\n _this.applyTheme();\r\n var dataItemsByCategory = _this.dataItemsByCategory;\r\n _this.addDisposer(_this.mainDataSet.events.on(\"removed\", function (event) {\r\n dataItemsByCategory.removeKey(event.oldValue.category);\r\n }));\r\n return _this;\r\n }\r\n /**\r\n * Returns a new/empty [[DataItem]] of the type appropriate for this object.\r\n *\r\n * @see {@link DataItem}\r\n * @return Data Item\r\n */\r\n CategoryAxis.prototype.createDataItem = function () {\r\n return new CategoryAxisDataItem();\r\n };\r\n /**\r\n * Returns a new/empty [[AxisBreak]] of the appropriate type.\r\n *\r\n * @return Axis break\r\n */\r\n CategoryAxis.prototype.createAxisBreak = function () {\r\n return new CategoryAxisBreak();\r\n };\r\n /**\r\n * Processes a related series' data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem Data item\r\n */\r\n CategoryAxis.prototype.processSeriesDataItem = function (dataItem, axisLetter) {\r\n _super.prototype.processSeriesDataItem.call(this, dataItem, axisLetter);\r\n var category = dataItem[\"category\" + this.axisLetter];\r\n if ($type.hasValue(category)) {\r\n var categoryAxisDataItem = this.dataItemsByCategory.getKey(category);\r\n if (categoryAxisDataItem) {\r\n var seriesId = dataItem.component.uid;\r\n var seriesDataItems = categoryAxisDataItem.seriesDataItems[seriesId];\r\n if (!seriesDataItems) {\r\n seriesDataItems = [];\r\n categoryAxisDataItem.seriesDataItems[seriesId] = seriesDataItems;\r\n }\r\n seriesDataItems.push(dataItem);\r\n }\r\n }\r\n else {\r\n dataItem.component.dataItems.remove(dataItem);\r\n }\r\n };\r\n /**\r\n * Validates the data range.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n */\r\n CategoryAxis.prototype.validateDataRange = function () {\r\n var _this = this;\r\n _super.prototype.validateDataRange.call(this);\r\n $iter.each(this._series.iterator(), function (series) {\r\n if ((series.xAxis instanceof CategoryAxis) && (series.yAxis instanceof CategoryAxis)) {\r\n series.invalidateDataRange();\r\n }\r\n else {\r\n var startIndex = _this.positionToIndex(_this.start);\r\n var endIndex = _this.positionToIndex(_this.end);\r\n if (endIndex >= _this.dataItems.length) {\r\n endIndex--;\r\n }\r\n var seriesId = series.uid;\r\n var minIndex = void 0;\r\n var maxIndex = void 0;\r\n for (var i = startIndex; i <= endIndex; i++) {\r\n var axisDataItem = _this.dataItems.getIndex(i);\r\n if (axisDataItem) {\r\n var seriesDataItems = axisDataItem.seriesDataItems[seriesId];\r\n if (seriesDataItems) {\r\n for (var i_1 = 0; i_1 < seriesDataItems.length; i_1++) {\r\n var seriesDataItem = seriesDataItems[i_1];\r\n if (seriesDataItem) {\r\n var index = seriesDataItem.index;\r\n if (!$type.isNumber(minIndex) || index < minIndex) {\r\n minIndex = index;\r\n }\r\n if (!$type.isNumber(maxIndex) || index > maxIndex) {\r\n maxIndex = index;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if ($type.isNumber(minIndex)) {\r\n series.startIndex = minIndex;\r\n }\r\n else {\r\n series.start = _this.start;\r\n }\r\n if ($type.isNumber(maxIndex)) {\r\n series.endIndex = maxIndex + 1;\r\n }\r\n else {\r\n series.end = _this.end;\r\n }\r\n // range might not change, but axis breaks might.\r\n if (_this._axisBreaks && _this._axisBreaks.length > 0) {\r\n series.invalidateDataRange();\r\n }\r\n }\r\n });\r\n };\r\n /**\r\n * Validates the whole axis. Causes it to redraw.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n */\r\n CategoryAxis.prototype.validate = function () {\r\n var _this = this;\r\n _super.prototype.validate.call(this);\r\n var dataCount = this.dataItems.length;\r\n var startIndex = $math.fitToRange(Math.floor(this.start * dataCount - 1), 0, dataCount);\r\n var endIndex = $math.fitToRange(Math.ceil(this.end * dataCount), 0, dataCount);\r\n if (this.renderer.invalid) {\r\n this.renderer.validate();\r\n }\r\n // find frequency at which we'll show items\r\n var maxCount = this.renderer.axisLength / Math.max(this.renderer.minGridDistance, 1 / Number.MAX_SAFE_INTEGER);\r\n var frequency = Math.min(this.dataItems.length, Math.ceil((endIndex - startIndex) / maxCount));\r\n this._startIndex = Math.floor(startIndex / frequency) * frequency;\r\n this._endIndex = Math.ceil(this.end * dataCount);\r\n this.fixAxisBreaks();\r\n if (this._startIndex == this._endIndex) {\r\n this._endIndex++;\r\n }\r\n this._frequency = frequency;\r\n if (this.axisLength <= 0) {\r\n return;\r\n }\r\n this.maxZoomFactor = this.dataItems.length;\r\n if (this.dataItems.length <= 0) {\r\n this.maxZoomFactor = 1;\r\n }\r\n this.resetIterators();\r\n // it's important to use protected variables here, as getters will return 0 - length\r\n // TODO use iterator instead\r\n // @ todo: not solved cat axis item fading\r\n startIndex = $math.max(0, this._startIndex - this._frequency);\r\n endIndex = $math.min(this.dataItems.length, this._endIndex + this._frequency);\r\n var itemIndex = 0;\r\n for (var i = 0; i < startIndex; i++) {\r\n var dataItem = this.dataItems.getIndex(i);\r\n dataItem.__disabled = true;\r\n }\r\n for (var i = endIndex, len = this.dataItems.length; i < len; i++) {\r\n var dataItem = this.dataItems.getIndex(i);\r\n dataItem.__disabled = true;\r\n }\r\n for (var i = startIndex; i < endIndex; i++) {\r\n if (i < this.dataItems.length) {\r\n var dataItem = this.dataItems.getIndex(i);\r\n if (i / this._frequency == Math.round(i / this._frequency)) {\r\n var axisBreak = this.isInBreak(i);\r\n if (!axisBreak) {\r\n this.appendDataItem(dataItem);\r\n this.validateDataElement(dataItem, itemIndex);\r\n }\r\n itemIndex++;\r\n }\r\n else {\r\n //previously we disabled all before, but this is better for cpu\r\n //this.validateDataElement(dataItem, itemIndex); // helps to solve shrinking // not good - creates all items\r\n dataItem.__disabled = true;\r\n }\r\n }\r\n }\r\n this.appendDataItem(this._lastDataItem);\r\n this.validateDataElement(this._lastDataItem, itemIndex + 1, this.dataItems.length);\r\n if (this._axisBreaks) {\r\n var axisBreaks = this._axisBreaks;\r\n axisBreaks.each(function (axisBreak) {\r\n var adjustedStartValue = axisBreak.adjustedStartValue;\r\n var adjustedEndValue = axisBreak.adjustedEndValue;\r\n if ($math.intersect({ start: adjustedStartValue, end: adjustedEndValue }, { start: _this._startIndex, end: _this._endIndex })) {\r\n for (var b = adjustedStartValue; b <= adjustedEndValue; b++) {\r\n var dataItem = _this.dataItems.getIndex(b);\r\n dataItem.__disabled = true;\r\n }\r\n var frequency_1 = $math.fitToRange(Math.ceil(_this._frequency / axisBreak.breakSize), 1, adjustedEndValue - adjustedStartValue);\r\n var itemIndex_1 = 0;\r\n if (axisBreak.breakSize > 0) {\r\n // TODO use iterator instead\r\n for (var b = adjustedStartValue; b <= adjustedEndValue; b = b + frequency_1) {\r\n var dataItem = _this.dataItems.getIndex(b);\r\n dataItem.__disabled = false;\r\n _this.appendDataItem(dataItem);\r\n _this.validateDataElement(dataItem, itemIndex_1);\r\n itemIndex_1++;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n this.validateBreaks();\r\n this.validateAxisRanges();\r\n this.ghostLabel.invalidate(); // solves font issue\r\n this.renderer.invalidateLayout();\r\n };\r\n /**\r\n * [validateDataElement description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem [description]\r\n * @param itemIndex [description]\r\n */\r\n CategoryAxis.prototype.validateDataElement = function (dataItem, itemIndex, index) {\r\n _super.prototype.validateDataElement.call(this, dataItem);\r\n dataItem.itemIndex = this._axisItemCount;\r\n this._axisItemCount++;\r\n //dataItem.__disabled = false;\r\n var renderer = this.renderer;\r\n if (!$type.isNumber(index)) {\r\n index = this.categoryToIndex(dataItem.category);\r\n }\r\n var endIndex = this.categoryToIndex(dataItem.endCategory);\r\n if (!$type.isNumber(endIndex)) {\r\n endIndex = index;\r\n }\r\n var position = this.indexToPosition(index, dataItem.locations.category);\r\n var endPosition = this.indexToPosition(endIndex, dataItem.locations.endCategory);\r\n dataItem.position = position;\r\n var fillEndIndex;\r\n var fillPosition;\r\n var fillEndPosition;\r\n if (dataItem.isRange) {\r\n fillEndIndex = endIndex;\r\n fillPosition = this.indexToPosition(index, dataItem.locations.category);\r\n fillEndPosition = this.indexToPosition(fillEndIndex, dataItem.locations.endCategory);\r\n }\r\n dataItem.point = renderer.positionToPoint(position);\r\n var tick = dataItem.tick;\r\n if (tick && !tick.disabled) {\r\n renderer.updateTickElement(tick, position, endPosition);\r\n }\r\n var grid = dataItem.grid;\r\n if (grid && !grid.disabled) {\r\n renderer.updateGridElement(grid, position, endPosition);\r\n }\r\n var label = dataItem.label;\r\n if (label && !label.disabled) {\r\n // theorethically this might result problems if category text changes, the range text won't change. But otherwise range.label.text = \"custom text\" won't work, which is not intuitive.\r\n if (!dataItem.isRange || label.text == undefined) {\r\n dataItem.text = dataItem.text;\r\n }\r\n renderer.updateLabelElement(label, position, endPosition);\r\n if ((renderer instanceof AxisRendererY && dataItem.label.measuredWidth > this.ghostLabel.measuredWidth) || (renderer instanceof AxisRendererX && dataItem.label.measuredHeight > this.ghostLabel.measuredHeight)) {\r\n if (dataItem.label.html) {\r\n this.ghostLabel.html = dataItem.label.currentText;\r\n }\r\n else {\r\n this.ghostLabel.text = dataItem.label.currentText;\r\n }\r\n }\r\n }\r\n var fill = dataItem.axisFill;\r\n if (fill && !fill.disabled) {\r\n if (!dataItem.isRange) {\r\n fillEndIndex = index + this._frequency;\r\n fillPosition = this.indexToPosition(index, fill.location);\r\n fillEndPosition = this.indexToPosition(fillEndIndex, fill.location);\r\n }\r\n renderer.updateFillElement(fill, fillPosition, fillEndPosition);\r\n if (!dataItem.isRange) {\r\n this.fillRule(dataItem, itemIndex);\r\n }\r\n }\r\n if (dataItem.bullet) {\r\n renderer.updateBullet(dataItem.bullet, position, endPosition);\r\n }\r\n var mask = dataItem.mask;\r\n if (mask) {\r\n renderer.updateFillElement(mask, fillPosition, fillEndPosition);\r\n }\r\n };\r\n /**\r\n * @ignore\r\n */\r\n CategoryAxis.prototype.disposeData = function () {\r\n this.dataItemsByCategory.clear();\r\n _super.prototype.disposeData.call(this);\r\n };\r\n /**\r\n * Processes the axis data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @param dataItem Data item\r\n * @param dataContext The raw data that corresponds to this data item\r\n */\r\n CategoryAxis.prototype.processDataItem = function (dataItem, dataContext) {\r\n if (dataItem) {\r\n // creat a collection for fast access\r\n _super.prototype.processDataItem.call(this, dataItem, dataContext);\r\n // check if such category already exists\r\n //let existingDataItem: CategoryAxisDataItem = this.dataItemsByCategory.getKey(dataItem.category);\r\n //if (existingDataItem && existingDataItem != dataItem) {\r\n //\tthis.dataItems.remove(existingDataItem);\r\n //}\r\n if ($type.hasValue(dataItem.category)) {\r\n this.dataItemsByCategory.setKey(dataItem.category, dataItem);\r\n }\r\n }\r\n };\r\n CategoryAxis.prototype.getDataItem = function (dataContext) {\r\n var category = (dataContext[this.dataFields.category]);\r\n if ($type.hasValue(category)) {\r\n var dataItem = this.dataItemsByCategory.getKey(category);\r\n if (dataItem) {\r\n return dataItem;\r\n }\r\n else {\r\n return this.dataItems.create();\r\n }\r\n }\r\n };\r\n /**\r\n * Converts a category index to an actual screen coordinate on the axis.\r\n *\r\n * `location` identifies relative location within category. 0 - beginning,\r\n * 0.5 - middle, 1 - end, and anything inbetween.\r\n *\r\n * @param index Index\r\n * @param location Location (0-1)\r\n * @return Position (px)\r\n */\r\n CategoryAxis.prototype.indexToPosition = function (index, location) {\r\n if (!$type.isNumber(location)) {\r\n location = 0.5;\r\n }\r\n var startIndex = this.startIndex;\r\n var endIndex = this.endIndex;\r\n var difference = this.adjustDifference(startIndex, endIndex);\r\n var startLocation = this.startLocation;\r\n var endLocation = this.endLocation;\r\n difference -= startLocation;\r\n difference -= (1 - endLocation);\r\n if (this._axisBreaks) {\r\n var axisBreaks = this._axisBreaks;\r\n $iter.eachContinue(axisBreaks.iterator(), function (axisBreak) {\r\n var breakStartIndex = axisBreak.adjustedStartValue;\r\n var breakEndIndex = axisBreak.adjustedEndValue;\r\n if (index < startIndex || !$type.isNumber(breakStartIndex) || !$type.isNumber(breakEndIndex)) {\r\n return false;\r\n }\r\n if ($math.intersect({ start: breakStartIndex, end: breakEndIndex }, { start: startIndex, end: endIndex })) {\r\n breakStartIndex = Math.max(startIndex, breakStartIndex);\r\n breakEndIndex = Math.min(endIndex, breakEndIndex);\r\n var breakSize = axisBreak.breakSize;\r\n // value to the right of break end\r\n if (index > breakEndIndex) {\r\n startIndex += (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n }\r\n // value to the left of break start\r\n else if (index < breakStartIndex) {\r\n }\r\n // value within break\r\n else {\r\n index = breakStartIndex + (index - breakStartIndex) * breakSize;\r\n }\r\n }\r\n return true;\r\n });\r\n }\r\n var deltaPosition = 0;\r\n var dataItem = this.dataItems.getIndex(index);\r\n if (dataItem) {\r\n deltaPosition = dataItem.deltaPosition;\r\n }\r\n return $math.round(deltaPosition + (index + location - startLocation - startIndex) / difference, 5);\r\n };\r\n /**\r\n * Converts a string category name to relative position on axis.\r\n *\r\n * `location` identifies relative location within category. 0 - beginning,\r\n * 0.5 - middle, 1 - end, and anything inbetween.\r\n *\r\n * @param category Category name\r\n * @param location Location (0-1)\r\n * @return Position\r\n */\r\n CategoryAxis.prototype.categoryToPosition = function (category, location) {\r\n var index = this.categoryToIndex(category);\r\n return this.indexToPosition(index, location);\r\n };\r\n /**\r\n * Converts a string category name to a orientation point (x, y, angle) on axis\r\n *\r\n * `location` identifies relative location within category. 0 - beginning,\r\n * 0.5 - middle, 1 - end, and anything inbetween.\r\n * @param category Category name\r\n * @param location Location (0-1)\r\n * @return Orientation point\r\n */\r\n CategoryAxis.prototype.categoryToPoint = function (category, location) {\r\n var position = this.categoryToPosition(category, location);\r\n var point = this.renderer.positionToPoint(position);\r\n var angle = this.renderer.positionToAngle(position);\r\n return { x: point.x, y: point.y, angle: angle };\r\n };\r\n /**\r\n * Converts a string category name to a orientation point (x, y, angle) on axis\r\n *\r\n * `location` identifies relative location within category. 0 - beginning,\r\n * 0.5 - middle, 1 - end, and anything inbetween.\r\n * @param category Category name\r\n * @param location Location (0-1)\r\n * @return Orientation point\r\n */\r\n CategoryAxis.prototype.anyToPoint = function (category, location) {\r\n return this.categoryToPoint(category, location);\r\n };\r\n /**\r\n * Converts a string category name to relative position on axis.\r\n *\r\n * An alias to `categoryToPosition()`.\r\n *\r\n * @param category Category name\r\n * @param location Location (0-1)\r\n * @return Relative position\r\n */\r\n CategoryAxis.prototype.anyToPosition = function (category, location) {\r\n return this.categoryToPosition(category, location);\r\n };\r\n /**\r\n * Converts named category to an index of data item it corresponds to.\r\n *\r\n * @param category Category\r\n * @return Data item index\r\n */\r\n CategoryAxis.prototype.categoryToIndex = function (category) {\r\n if ($type.hasValue(category)) {\r\n var dataItem = this.dataItemsByCategory.getKey(category);\r\n if (dataItem) {\r\n return dataItem.index;\r\n }\r\n }\r\n };\r\n /**\r\n * Zooms the axis to specific named ctaegories.\r\n *\r\n * @param startCategory Start category\r\n * @param endCategory End category\r\n */\r\n CategoryAxis.prototype.zoomToCategories = function (startCategory, endCategory) {\r\n this.zoomToIndexes(this.categoryToIndex(startCategory), this.categoryToIndex(endCategory) + 1);\r\n };\r\n /**\r\n * [getAnyRangePath description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param start [description]\r\n * @param end [description]\r\n * @param startLocation [description]\r\n * @param endLocation [description]\r\n * @return [description]\r\n */\r\n CategoryAxis.prototype.getAnyRangePath = function (start, end, startLocation, endLocation) {\r\n var startPos = this.categoryToPosition(start, startLocation);\r\n var endPos = this.categoryToPosition(end, endLocation);\r\n return this.getPositionRangePath(startPos, endPos); // Base class (Axis) gets range shape from AxisRenderer\r\n };\r\n /**\r\n * Takes an absolute position (px) within axis and adjust it to a specific\r\n * `location` within category it corresponds to.\r\n *\r\n * @param position Source position (px)\r\n * @param location Location within category (0-1)\r\n * @return Adjusted position (px)\r\n */\r\n CategoryAxis.prototype.roundPosition = function (position, location) {\r\n var index = this.positionToIndex(position);\r\n return this.indexToPosition(index, location);\r\n };\r\n /**\r\n * Finds and returns first series data item with specific category\r\n * @param series Target series\r\n * @param category Category\r\n * @return XYSeriesDataItem data item\r\n */\r\n CategoryAxis.prototype.getFirstSeriesDataItem = function (series, category) {\r\n for (var i = 0; i < series.dataItems.length; i++) {\r\n var dataItem = series.dataItems.getIndex(i);\r\n if (series.xAxis == this) {\r\n if (dataItem.categoryX == category) {\r\n return dataItem;\r\n }\r\n }\r\n if (series.yAxis == this) {\r\n if (dataItem.categoryY == category) {\r\n return dataItem;\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Finds and returns last series data item with specific category.\r\n * @param series Target series\r\n * @param category Category\r\n * @return XYSeriesDataItem data item\r\n */\r\n CategoryAxis.prototype.getLastSeriesDataItem = function (series, category) {\r\n for (var i = series.dataItems.length - 1; i >= 0; i--) {\r\n var dataItem = series.dataItems.getIndex(i);\r\n if (series.xAxis == this) {\r\n if (dataItem.categoryX == category) {\r\n return dataItem;\r\n }\r\n }\r\n if (series.yAxis == this) {\r\n if (dataItem.categoryY == category) {\r\n return dataItem;\r\n }\r\n }\r\n }\r\n };\r\n // todo: optimize\r\n CategoryAxis.prototype.getSeriesDataItemByCategory = function (category, series) {\r\n var _this = this;\r\n var seriesDataItem;\r\n series.dataItems.each(function (dataItem) {\r\n if (series.xAxis == _this) {\r\n if (dataItem.categoryX == category) {\r\n seriesDataItem = dataItem;\r\n }\r\n }\r\n else if (series.yAxis == _this) {\r\n if (dataItem.categoryY == category) {\r\n seriesDataItem = dataItem;\r\n }\r\n }\r\n });\r\n return seriesDataItem;\r\n };\r\n /**\r\n * Returns a data item from Series that corresponds to a specific absolute\r\n * position on the Axis.\r\n *\r\n * @param series Target series\r\n * @param position Position (px)\r\n * @return XYSeriesDataItem data item\r\n */\r\n CategoryAxis.prototype.getSeriesDataItem = function (series, position, findNearest) {\r\n var _this = this;\r\n if ($type.isNumber(position)) {\r\n var index_1 = this.positionToIndex(position);\r\n if (index_1 >= this.dataItems.length) {\r\n index_1--;\r\n }\r\n var dataItem = this.dataItems.getIndex(index_1);\r\n if (dataItem) {\r\n var category_1 = dataItem.category;\r\n var sdi_1;\r\n var seriesDataItem = series.dataItems.getIndex(index_1);\r\n if (seriesDataItem) {\r\n if (series.xAxis == this) {\r\n if (seriesDataItem.categoryX == category_1) {\r\n return seriesDataItem;\r\n }\r\n }\r\n if (series.yAxis == this) {\r\n if (seriesDataItem.categoryY == category_1) {\r\n return seriesDataItem;\r\n }\r\n }\r\n }\r\n series.dataItems.each(function (dataItem) {\r\n if (series.xAxis == _this) {\r\n if (dataItem.categoryX == category_1) {\r\n if (!sdi_1) {\r\n sdi_1 = dataItem;\r\n }\r\n if (Math.abs(index_1 - sdi_1.index) > Math.abs(index_1 - dataItem.index)) {\r\n sdi_1 = dataItem;\r\n }\r\n }\r\n }\r\n if (series.yAxis == _this) {\r\n if (dataItem.categoryY == category_1) {\r\n if (!sdi_1) {\r\n sdi_1 = dataItem;\r\n }\r\n if (Math.abs(index_1 - sdi_1.index) > Math.abs(index_1 - dataItem.index)) {\r\n sdi_1 = dataItem;\r\n }\r\n }\r\n }\r\n });\r\n //@todo\r\n if (findNearest) {\r\n }\r\n return sdi_1;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns the X coordinate for series' data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Category\r\n * @param location Location (0-1)\r\n * @return X coordinate (px)\r\n */\r\n CategoryAxis.prototype.getX = function (dataItem, key, location, stackKey, range) {\r\n var position = this.getPositionX(dataItem, key, location, stackKey, range);\r\n if ($type.isNaN(position)) {\r\n return this.basePoint.x;\r\n }\r\n else {\r\n return this.renderer.positionToPoint(position).x;\r\n }\r\n };\r\n /**\r\n * Returns relative position on axis for series' data item.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Category\r\n * @param location Location (0-1)\r\n * @return Relative position\r\n */\r\n CategoryAxis.prototype.getPositionX = function (dataItem, key, location, stackKey, range) {\r\n var position;\r\n if ($type.hasValue(key)) {\r\n position = this.categoryToPosition(dataItem.categories[key], location);\r\n }\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns the Y coordinate for series' data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Category\r\n * @param location Location (0-1)\r\n * @return Y coordinate (px)\r\n */\r\n CategoryAxis.prototype.getY = function (dataItem, key, location, stackKey, range) {\r\n var position = this.getPositionY(dataItem, key, location, stackKey, range);\r\n if ($type.isNaN(position)) {\r\n return this.basePoint.y;\r\n }\r\n else {\r\n return this.renderer.positionToPoint(position).y;\r\n }\r\n };\r\n /**\r\n * Returns relative position on axis for series' data item.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Category\r\n * @param location Location (0-1)\r\n * @return Relative position\r\n */\r\n CategoryAxis.prototype.getPositionY = function (dataItem, key, location, stackKey, range) {\r\n var position;\r\n if ($type.hasValue(key)) {\r\n position = this.categoryToPosition(dataItem.categories[key], location);\r\n }\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns an angle for series data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Category\r\n * @param location Location (0-1)\r\n * @param stackKey Stack key (?)\r\n * @param range Range to fit in\r\n * @return Angle\r\n */\r\n CategoryAxis.prototype.getAngle = function (dataItem, key, location, stackKey, range) {\r\n var position = this.categoryToPosition(dataItem.categories[key], location);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return this.positionToAngle(position);\r\n };\r\n /**\r\n * Returns an absolute pixel coordinate of the start of the cell (category),\r\n * that specific position value falls into.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param position Position (px)\r\n * @return Cell start position (px)\r\n */\r\n CategoryAxis.prototype.getCellStartPosition = function (position) {\r\n return this.roundPosition(position, 0);\r\n };\r\n /**\r\n * Returns an absolute pixel coordinate of the end of the cell (category),\r\n * that specific position value falls into.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param position Position (px)\r\n * @return Cell end position (px)\r\n */\r\n CategoryAxis.prototype.getCellEndPosition = function (position) {\r\n return this.roundPosition(position, 1);\r\n };\r\n /**\r\n * Returns text to show in a category tooltip, based on specific position\r\n * within axis.\r\n *\r\n * @ignore Exclude from docs\r\n * @param position Position (px)\r\n * @return Label (category)\r\n */\r\n CategoryAxis.prototype.getTooltipText = function (position) {\r\n var dataItem = this.dataItems.getIndex(this.positionToIndex(position));\r\n if (dataItem) {\r\n this.tooltipDataItem = dataItem;\r\n this.tooltip.dataItem = dataItem;\r\n if (this.tooltipText) {\r\n return this.tooltipText;\r\n }\r\n if (!this._adapterO) {\r\n return dataItem.category;\r\n }\r\n else {\r\n return this._adapterO.apply(\"getTooltipText\", dataItem.category);\r\n }\r\n }\r\n };\r\n /**\r\n * Returns an index of the category that corresponds to specific pixel\r\n * position within axis.\r\n *\r\n * @param position Position (px)\r\n * @return Category index\r\n */\r\n CategoryAxis.prototype.positionToIndex = function (position) {\r\n position = $math.round(position, 10);\r\n if (position < 0) {\r\n position = 0;\r\n }\r\n if (position > 1) {\r\n position = 1;\r\n }\r\n var startIndex = this.startIndex;\r\n var endIndex = this.endIndex;\r\n var difference = endIndex - startIndex - this.startLocation - (1 - this.endLocation);\r\n position += 1 / difference * this.startLocation;\r\n var index = null;\r\n if (this._axisBreaks) {\r\n var axisBreaks = this._axisBreaks;\r\n // in case we have some axis breaks\r\n $iter.eachContinue(axisBreaks.iterator(), function (axisBreak) {\r\n var breakStartPosition = axisBreak.startPosition;\r\n var breakEndPosition = axisBreak.endPosition;\r\n var breakStartIndex = axisBreak.adjustedStartValue;\r\n var breakEndIndex = axisBreak.adjustedEndValue;\r\n breakStartIndex = $math.max(breakStartIndex, startIndex);\r\n breakEndIndex = $math.min(breakEndIndex, endIndex);\r\n var breakSize = axisBreak.breakSize;\r\n difference -= (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n // position to the right of break end\r\n if (position > breakEndPosition) {\r\n startIndex += (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n }\r\n // position to the left of break start\r\n else if (position < breakStartPosition) {\r\n }\r\n // value within break\r\n else {\r\n var breakPosition = (position - breakStartPosition) / (breakEndPosition - breakStartPosition);\r\n index = breakStartIndex + Math.round(breakPosition * (breakEndIndex - breakStartIndex));\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n if (!$type.isNumber(index)) {\r\n index = Math.floor(position * difference + startIndex);\r\n }\r\n if (index >= this.dataItems.length) {\r\n index = this.dataItems.length - 1;\r\n }\r\n // not good, when panning out of bounds, each time one less item gets selected\r\n //if (index >= endIndex) {\r\n //\tindex--;\r\n //}\r\n return index;\r\n };\r\n /**\r\n * Returns category based on position.\r\n *\r\n * Please note that `position` represents position within axis which may be\r\n * zoomed and not correspond to Cursor's `position`.\r\n *\r\n * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n *\r\n * This is a synonim of `getPositionLabel()` implemented here for consistentcy.\r\n *\r\n * @since 4.3.8\r\n * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n * @param position Relative position on axis (0-1)\r\n * @return Position label\r\n */\r\n CategoryAxis.prototype.positionToCategory = function (position) {\r\n return this.getPositionLabel(position);\r\n };\r\n /**\r\n * Returns category based on position.\r\n *\r\n * Please note that `position` represents position within axis which may be\r\n * zoomed and not correspond to Cursor's `position`.\r\n *\r\n * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n * @param position Relative position on axis (0-1)\r\n * @return Position label\r\n */\r\n CategoryAxis.prototype.getPositionLabel = function (position) {\r\n var dataItem = this.dataItems.getIndex(this.positionToIndex(position));\r\n if (dataItem) {\r\n return dataItem.category;\r\n }\r\n };\r\n Object.defineProperty(CategoryAxis.prototype, \"basePoint\", {\r\n /**\r\n * Coordinates of the actual axis start.\r\n *\r\n * @ignore Exclude from docs\r\n * @return Base point\r\n */\r\n get: function () {\r\n // This makes base grid to be drawn at the end of the axis and adds extra\r\n // grid which we need to nicely close the chart.\r\n return this.renderer.positionToPoint(1);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Initializes Axis' renderer.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n CategoryAxis.prototype.initRenderer = function () {\r\n _super.prototype.initRenderer.call(this);\r\n var renderer = this.renderer;\r\n renderer.baseGrid.disabled = true;\r\n };\r\n Object.defineProperty(CategoryAxis.prototype, \"frequency\", {\r\n /**\r\n * Current frequency of labels of the axis.\r\n *\r\n * Normally it would be 1, but when labels start to be hidden due\r\n * to `minGridDistance` this read-only property will increase.\r\n *\r\n * @readonly\r\n * @since 4.2.0\r\n * @return Label frequency\r\n */\r\n get: function () {\r\n return this._frequency;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxis.prototype, \"sortBySeries\", {\r\n /**\r\n * @return Sort categories?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"sortBySeries\");\r\n },\r\n /**\r\n * If set to a reference of [[ColumnSeries]] the categories will be sorted\r\n * by actual values.\r\n *\r\n * The categories are ordered in descending order (from highest values to\r\n * lowest). To reverse the order, use axis renderer's `inversed` setting.\r\n * E.g.:\r\n *\r\n * ```TypeScript\r\n * categoryAxis.sortBySeries = series;\r\n * categoryAxis.renderer.inversed = true;\r\n * ```\r\n * ```JavaScript\r\n * categoryAxis.sortBySeries = series;\r\n * categoryAxis.renderer.inversed = true;\r\n * ```\r\n * ```JSON\r\n * {\r\n * // ...\r\n * \"xAxes\": [{\r\n * // ...\r\n * \"sortBySeries\": \"s1\",\r\n * \"renderer\": {\r\n * // ...\r\n * \"inversed\": true\r\n * }\r\n * }]\r\n * }\r\n * ```\r\n *\r\n * @since 4.8.7\r\n * @param value Sort categories?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"sortBySeries\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Processes JSON-based config before it is applied to the object.\r\n *\r\n * @ignore Exclude from docs\r\n * @param config Config\r\n */\r\n CategoryAxis.prototype.processConfig = function (config) {\r\n if (config) {\r\n if ($type.hasValue(config.sortBySeries) && $type.isString(config.sortBySeries)) {\r\n if (this.map.hasKey(config.sortBySeries)) {\r\n config.sortBySeries = this.map.getKey(config.sortBySeries);\r\n }\r\n else {\r\n this.addDelayedMap(\"sortBySeries\", config.sortBySeries);\r\n delete config.sortBySeries;\r\n }\r\n }\r\n }\r\n _super.prototype.processConfig.call(this, config);\r\n };\r\n return CategoryAxis;\r\n}(Axis));\r\nexport { CategoryAxis };\r\n/**\r\n * Register class, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CategoryAxis\"] = CategoryAxis;\r\nregistry.registeredClasses[\"CategoryAxisDataItem\"] = CategoryAxisDataItem;\r\n//# sourceMappingURL=CategoryAxis.js.map","/**\r\n * A module which defines functionality related to Category Axis Break.\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisBreak } from \"./AxisBreak\";\r\nimport { registry } from \"../../core/Registry\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Base class to define \"breaks\" in axes\r\n * @see {@link ICategoryAxisBreakEvents} for a list of available events\r\n * @see {@link ICategoryAxisBreakAdapters} for a list of available Adapters\r\n */\r\nvar CategoryAxisBreak = /** @class */ (function (_super) {\r\n __extends(CategoryAxisBreak, _super);\r\n /**\r\n * Constructor\r\n */\r\n function CategoryAxisBreak() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"CategoryAxisBreak\";\r\n _this.properties.startLocation = 0.5;\r\n _this.properties.endLocation = 0.5;\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"startPosition\", {\r\n /**\r\n * Pixel position of the break's start.\r\n *\r\n * @return Position (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n if (this.axis) {\r\n return this.axis.indexToPosition(this.adjustedStartValue, this.startLocation);\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"endPosition\", {\r\n /**\r\n * Pixel position of the break's end.\r\n *\r\n * @return Position (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n if (this.axis) {\r\n return this.axis.indexToPosition(this.adjustedEndValue, this.endLocation);\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"startCategory\", {\r\n /**\r\n * @return Start category\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"startCategory\");\r\n },\r\n /**\r\n * A category break starts on.\r\n *\r\n * @param value Start category\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"startCategory\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"endCategory\", {\r\n /**\r\n * @return End category\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"endCategory\");\r\n },\r\n /**\r\n * A category break ends on.\r\n *\r\n * @param value End category\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"endCategory\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"startValue\", {\r\n /**\r\n * @return Value\r\n */\r\n get: function () {\r\n var category = this.getPropertyValue(\"startCategory\");\r\n if (category) {\r\n return this.axis.categoryToIndex(category);\r\n }\r\n else {\r\n return this.getPropertyValue(\"startValue\");\r\n }\r\n },\r\n /**\r\n * An index of start category.\r\n *\r\n * @param value Value\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"startValue\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"endValue\", {\r\n /**\r\n * @return Value\r\n */\r\n get: function () {\r\n var category = this.getPropertyValue(\"endCategory\");\r\n if (category) {\r\n return this.axis.categoryToIndex(category);\r\n }\r\n else {\r\n return this.getPropertyValue(\"endValue\");\r\n }\r\n },\r\n /**\r\n * An index of end category or a end value.\r\n *\r\n * @param value Value\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"endValue\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"startLocation\", {\r\n /**\r\n * @return Break start location\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"startLocation\");\r\n },\r\n /**\r\n * Indicates where within starting category break should begin.\r\n *\r\n * Values range from `0` (start) to `1` (end), with default being `0.5` (middle).\r\n *\r\n * E.g. if you want to a break to fully encompass start and end categories,\r\n * you should set `startLocation = 0` and `endLocation = 1`.\r\n *\r\n * @since 4.9.17\r\n * @default 0.5\r\n * @param value Break start location\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"startLocation\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(CategoryAxisBreak.prototype, \"endLocation\", {\r\n /**\r\n * @return Break end location\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"endLocation\");\r\n },\r\n /**\r\n * Indicates where within ending category break should end.\r\n *\r\n * Values range from `0` (start) to `1` (end), with default being `0.5` (middle).\r\n *\r\n * E.g. if you want to a break to fully encompass start and end categories,\r\n * you should set `startLocation = 0` and `endLocation = 1`.\r\n *\r\n * @since 4.9.17\r\n * @default 0.5\r\n * @param value Break end location\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"endLocation\", value)) {\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return CategoryAxisBreak;\r\n}(AxisBreak));\r\nexport { CategoryAxisBreak };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CategoryAxisBreak\"] = CategoryAxisBreak;\r\n//# sourceMappingURL=CategoryAxisBreak.js.map","/**\r\n * DateAxis module\r\n */\r\nimport { __assign, __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ValueAxis, ValueAxisDataItem } from \"./ValueAxis\";\r\nimport { List } from \"../../core/utils/List\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { DateAxisBreak } from \"./DateAxisBreak\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $time from \"../../core/utils/Time\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $array from \"../../core/utils/Array\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport { OrderedListTemplate } from \"../../core/utils/SortedList\";\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Defines data item for [[DateAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nvar DateAxisDataItem = /** @class */ (function (_super) {\r\n __extends(DateAxisDataItem, _super);\r\n /**\r\n * Constructor\r\n */\r\n function DateAxisDataItem() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"DateAxisDataItem\";\r\n _this.applyTheme();\r\n _this.values.date = {};\r\n _this.values.endDate = {};\r\n return _this;\r\n }\r\n Object.defineProperty(DateAxisDataItem.prototype, \"date\", {\r\n /**\r\n * @return Date\r\n */\r\n get: function () {\r\n return this.dates[\"date\"];\r\n },\r\n /**\r\n * Date position of the data item.\r\n *\r\n * @param date Date\r\n */\r\n set: function (date) {\r\n this.setDate(\"date\", date);\r\n this.value = date.getTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxisDataItem.prototype, \"endDate\", {\r\n /**\r\n * @return End date\r\n */\r\n get: function () {\r\n return this.dates[\"endDate\"];\r\n },\r\n /**\r\n * End date for data item.\r\n *\r\n * @param date End date\r\n */\r\n set: function (date) {\r\n this.setDate(\"endDate\", date);\r\n this.endValue = date.getTime();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return DateAxisDataItem;\r\n}(ValueAxisDataItem));\r\nexport { DateAxisDataItem };\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Used to create a date/time-based axis for the chart.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Time\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Time\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"DateAxis\",\r\n * \"title\": {\r\n * \"text\": \"Time\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link IDateAxisEvents} for a list of available Events\r\n * @see {@link IDateAxisAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/axes/date-axis/} got `DateAxis` documention\r\n * @important\r\n */\r\nvar DateAxis = /** @class */ (function (_super) {\r\n __extends(DateAxis, _super);\r\n /**\r\n * Constructor\r\n */\r\n function DateAxis() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n _this._gapBreaks = false;\r\n /**\r\n * A list of date/time intervals for Date axis.\r\n *\r\n * This define various granularities available for the axis. For example\r\n * if you have an axis spanning an hour, and space for 6 grid lines / labels\r\n * the axis will choose the granularity of 10 minutes, displaying a label\r\n * every 10 minutes.\r\n *\r\n * Default intervals:\r\n *\r\n * ```JSON\r\n * [\r\n * { timeUnit: \"millisecond\", count: 1 },\r\n * { timeUnit: \"millisecond\", count: 5 },\r\n * { timeUnit: \"millisecond\", count: 10 },\r\n * { timeUnit: \"millisecond\", count: 50 },\r\n * { timeUnit: \"millisecond\", count: 100 },\r\n * { timeUnit: \"millisecond\", count: 500 },\r\n * { timeUnit: \"second\", count: 1 },\r\n * { timeUnit: \"second\", count: 5 },\r\n * { timeUnit: \"second\", count: 10 },\r\n * { timeUnit: \"second\", count: 30 },\r\n * { timeUnit: \"minute\", count: 1 },\r\n * { timeUnit: \"minute\", count: 5 },\r\n * { timeUnit: \"minute\", count: 10 },\r\n * { timeUnit: \"minute\", count: 30 },\r\n * { timeUnit: \"hour\", count: 1 },\r\n * { timeUnit: \"hour\", count: 3 },\r\n * { timeUnit: \"hour\", count: 6 },\r\n * { timeUnit: \"hour\", count: 12 },\r\n * { timeUnit: \"day\", count: 1 },\r\n * { timeUnit: \"day\", count: 2 },\r\n * { timeUnit: \"day\", count: 3 },\r\n * { timeUnit: \"day\", count: 4 },\r\n * { timeUnit: \"day\", count: 5 },\r\n * { timeUnit: \"week\", count: 1 },\r\n * { timeUnit: \"month\", count: 1 },\r\n * { timeUnit: \"month\", count: 2 },\r\n * { timeUnit: \"month\", count: 3 },\r\n * { timeUnit: \"month\", count: 6 },\r\n * { timeUnit: \"year\", count: 1 },\r\n * { timeUnit: \"year\", count: 2 },\r\n * { timeUnit: \"year\", count: 5 },\r\n * { timeUnit: \"year\", count: 10 },\r\n * { timeUnit: \"year\", count: 50 },\r\n * { timeUnit: \"year\", count: 100 }\r\n * ]\r\n * ```\r\n */\r\n _this.gridIntervals = new List();\r\n /**\r\n * If data aggregation is enabled by setting Axis' `groupData = true`, the\r\n * chart will try to aggregate data items into grouped data items.\r\n *\r\n * If there are more data items in selected period than `groupCount`, it will\r\n * group data items into bigger period.\r\n *\r\n * For example seconds might be grouped into 10-second aggregate data items.\r\n *\r\n * This setting indicates what group intervals can the chart group to.\r\n *\r\n * Default intervals:\r\n *\r\n * ```JSON\r\n * [\r\n * { timeUnit: \"millisecond\", count: 1},\r\n * { timeUnit: \"millisecond\", count: 10 },\r\n * { timeUnit: \"millisecond\", count: 100 },\r\n * { timeUnit: \"second\", count: 1 },\r\n * { timeUnit: \"second\", count: 10 },\r\n * { timeUnit: \"minute\", count: 1 },\r\n * { timeUnit: \"minute\", count: 10 },\r\n * { timeUnit: \"hour\", count: 1 },\r\n * { timeUnit: \"day\", count: 1 },\r\n * { timeUnit: \"week\", count: 1 },\r\n * { timeUnit: \"month\", count: 1 },\r\n * { timeUnit: \"year\", count: 1 }\r\n * ]\r\n * ```\r\n * `groupData = true` does not work in combination with `skipEmptyPeriods = true`.\r\n *\r\n * @since 4.7.0\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/axes/date-axis/#Dynamic_data_item_grouping} for more information about dynamic data item grouping.\r\n */\r\n _this.groupIntervals = new List();\r\n /**\r\n * A collection of date formats to use when formatting different time units\r\n * on Date/time axis.\r\n *\r\n * Actual defaults will depend on the language locale set for the chart.\r\n *\r\n * To override format for a specific time unit, say days, you need to set\r\n * the appropriate key to a format string. E.g.:\r\n *\r\n * ```TypeScript\r\n * axis.dateFormats.setKey(\"day\", \"MMMM d, yyyy\");\r\n * ```\r\n * ```JavaScript\r\n * axis.dateFormats.setKey(\"day\", \"MMMM d, yyyy\");\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"DateAxis\",\r\n * \"dateFormats\": {\r\n * \"day\": \"MMMM d, yyyy\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link DateFormatter}\r\n */\r\n _this.dateFormats = new Dictionary();\r\n /**\r\n * These formats are applied to labels that are first in a larger unit.\r\n *\r\n * For example, if we have a DateAxis with days on it, the first day of month\r\n * indicates a break in month - a start of the bigger period.\r\n *\r\n * For those labels, `periodChangeDateFormats` are applied instead of\r\n * `dateFormats`.\r\n *\r\n * This allows us implement convenient structures, like instead of:\r\n *\r\n * `Jan 1 - Jan 2 - Jan 3 - ...`\r\n *\r\n * We can have:\r\n *\r\n * `Jan - 1 - 2 - 3 - ...`\r\n *\r\n * This can be disabled by setting `markUnitChange = false`.\r\n */\r\n _this.periodChangeDateFormats = new Dictionary();\r\n /**\r\n * Actual interval (granularity) derived from the actual data.\r\n */\r\n _this._baseIntervalReal = { timeUnit: \"day\", count: 1 };\r\n /**\r\n */\r\n _this._prevSeriesTime = {};\r\n /**\r\n * [_minDifference description]\r\n *\r\n * @todo Description\r\n */\r\n _this._minDifference = {};\r\n /**\r\n * @ignore\r\n */\r\n _this._firstWeekDay = 1;\r\n /**\r\n * A collection of start timestamps to use as axis' min timestamp for\r\n * particular data item item periods.\r\n *\r\n * @since 4.7.0\r\n * @readonly\r\n */\r\n _this.groupMin = {};\r\n /**\r\n * A collection of start timestamps to use as axis' max timestamp for\r\n * particular data item item periods.\r\n *\r\n * @since 4.7.0\r\n * @readonly\r\n */\r\n _this.groupMax = {};\r\n _this._intervalMax = {};\r\n _this._intervalMin = {};\r\n _this.className = \"DateAxis\";\r\n _this.setPropertyValue(\"markUnitChange\", true);\r\n _this.snapTooltip = true;\r\n _this.tooltipPosition = \"pointer\";\r\n _this.setPropertyValue(\"groupData\", false);\r\n _this.groupCount = 200;\r\n _this.events.on(\"parentset\", _this.getDFFormatter, _this, false);\r\n // Translatable defaults are applied in `applyInternalDefaults()`\r\n // ...\r\n // Define default intervals\r\n _this.gridIntervals.pushAll([\r\n { timeUnit: \"millisecond\", count: 1 },\r\n { timeUnit: \"millisecond\", count: 5 },\r\n { timeUnit: \"millisecond\", count: 10 },\r\n { timeUnit: \"millisecond\", count: 50 },\r\n { timeUnit: \"millisecond\", count: 100 },\r\n { timeUnit: \"millisecond\", count: 500 },\r\n { timeUnit: \"second\", count: 1 },\r\n { timeUnit: \"second\", count: 5 },\r\n { timeUnit: \"second\", count: 10 },\r\n { timeUnit: \"second\", count: 30 },\r\n { timeUnit: \"minute\", count: 1 },\r\n { timeUnit: \"minute\", count: 5 },\r\n { timeUnit: \"minute\", count: 10 },\r\n { timeUnit: \"minute\", count: 15 },\r\n { timeUnit: \"minute\", count: 30 },\r\n { timeUnit: \"hour\", count: 1 },\r\n { timeUnit: \"hour\", count: 3 },\r\n { timeUnit: \"hour\", count: 6 },\r\n { timeUnit: \"hour\", count: 12 },\r\n { timeUnit: \"day\", count: 1 },\r\n { timeUnit: \"day\", count: 2 },\r\n { timeUnit: \"day\", count: 3 },\r\n { timeUnit: \"day\", count: 4 },\r\n { timeUnit: \"day\", count: 5 },\r\n { timeUnit: \"week\", count: 1 },\r\n { timeUnit: \"month\", count: 1 },\r\n { timeUnit: \"month\", count: 2 },\r\n { timeUnit: \"month\", count: 3 },\r\n { timeUnit: \"month\", count: 6 },\r\n { timeUnit: \"year\", count: 1 },\r\n { timeUnit: \"year\", count: 2 },\r\n { timeUnit: \"year\", count: 5 },\r\n { timeUnit: \"year\", count: 10 },\r\n { timeUnit: \"year\", count: 50 },\r\n { timeUnit: \"year\", count: 100 },\r\n { timeUnit: \"year\", count: 200 },\r\n { timeUnit: \"year\", count: 500 },\r\n { timeUnit: \"year\", count: 1000 },\r\n { timeUnit: \"year\", count: 2000 },\r\n { timeUnit: \"year\", count: 5000 },\r\n { timeUnit: \"year\", count: 10000 },\r\n { timeUnit: \"year\", count: 100000 }\r\n ]);\r\n _this.groupIntervals.pushAll([\r\n { timeUnit: \"millisecond\", count: 1 },\r\n { timeUnit: \"millisecond\", count: 10 },\r\n { timeUnit: \"millisecond\", count: 100 },\r\n { timeUnit: \"second\", count: 1 },\r\n { timeUnit: \"second\", count: 10 },\r\n { timeUnit: \"minute\", count: 1 },\r\n { timeUnit: \"minute\", count: 10 },\r\n { timeUnit: \"hour\", count: 1 },\r\n { timeUnit: \"day\", count: 1 },\r\n { timeUnit: \"week\", count: 1 },\r\n { timeUnit: \"month\", count: 1 },\r\n { timeUnit: \"year\", count: 1 }\r\n ]);\r\n // Set field name\r\n _this.axisFieldName = \"date\";\r\n // Apply theme\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n /**\r\n * A function which applies fills to axis cells.\r\n *\r\n * Default function fills every second fill. You can set this to a function\r\n * that follows some other logic.\r\n *\r\n * Function should accept a [[DateAxisDataItem]] and modify its `axisFill`\r\n * property accordingly.\r\n */\r\n DateAxis.prototype.fillRule = function (dataItem) {\r\n var value = dataItem.value;\r\n var axis = dataItem.component;\r\n var gridInterval = axis._gridInterval;\r\n var gridDuration = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n if (Math.round((value - axis.min) / gridDuration) / 2 == Math.round(Math.round((value - axis.min) / gridDuration) / 2)) {\r\n dataItem.axisFill.__disabled = true;\r\n }\r\n else {\r\n dataItem.axisFill.__disabled = false;\r\n }\r\n };\r\n /**\r\n * Sets defaults that instantiate some objects that rely on parent, so they\r\n * cannot be set in constructor.\r\n */\r\n DateAxis.prototype.applyInternalDefaults = function () {\r\n _super.prototype.applyInternalDefaults.call(this);\r\n // Set default date formats\r\n if (!this.dateFormats.hasKey(\"millisecond\")) {\r\n this.dateFormats.setKey(\"millisecond\", this.language.translate(\"_date_millisecond\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"second\")) {\r\n this.dateFormats.setKey(\"second\", this.language.translate(\"_date_second\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"minute\")) {\r\n this.dateFormats.setKey(\"minute\", this.language.translate(\"_date_minute\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"hour\")) {\r\n this.dateFormats.setKey(\"hour\", this.language.translate(\"_date_hour\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"day\")) {\r\n this.dateFormats.setKey(\"day\", this.language.translate(\"_date_day\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"week\")) {\r\n this.dateFormats.setKey(\"week\", this.language.translate(\"_date_day\")); // not a mistake\r\n }\r\n if (!this.dateFormats.hasKey(\"month\")) {\r\n this.dateFormats.setKey(\"month\", this.language.translate(\"_date_month\"));\r\n }\r\n if (!this.dateFormats.hasKey(\"year\")) {\r\n this.dateFormats.setKey(\"year\", this.language.translate(\"_date_year\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"millisecond\")) {\r\n this.periodChangeDateFormats.setKey(\"millisecond\", this.language.translate(\"_date_millisecond\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"second\")) {\r\n this.periodChangeDateFormats.setKey(\"second\", this.language.translate(\"_date_second\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"minute\")) {\r\n this.periodChangeDateFormats.setKey(\"minute\", this.language.translate(\"_date_minute\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"hour\")) {\r\n this.periodChangeDateFormats.setKey(\"hour\", this.language.translate(\"_date_day\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"day\")) {\r\n this.periodChangeDateFormats.setKey(\"day\", this.language.translate(\"_date_day\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"week\")) {\r\n this.periodChangeDateFormats.setKey(\"week\", this.language.translate(\"_date_day\"));\r\n }\r\n if (!this.periodChangeDateFormats.hasKey(\"month\")) {\r\n this.periodChangeDateFormats.setKey(\"month\", this.language.translate(\"_date_month\") + \" \" + this.language.translate(\"_date_year\"));\r\n }\r\n };\r\n /**\r\n * Returns a new/empty [[DataItem]] of the type appropriate for this object.\r\n *\r\n * @see {@link DataItem}\r\n * @return Data Item\r\n */\r\n DateAxis.prototype.createDataItem = function () {\r\n return new DateAxisDataItem();\r\n };\r\n /**\r\n * Returns a new/empty [[AxisBreak]] of the appropriate type.\r\n *\r\n * @return Axis break\r\n */\r\n DateAxis.prototype.createAxisBreak = function () {\r\n return new DateAxisBreak();\r\n };\r\n /**\r\n * Validates Axis' data items.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.validateDataItems = function () {\r\n // allows to keep selection of the same size\r\n var start = this.start;\r\n var end = this.end;\r\n var baseDuration = this.baseDuration;\r\n var periodCount = (this.max - this.min) / baseDuration;\r\n this._firstWeekDay = this.getFirstWeekDay();\r\n this.getDFFormatter();\r\n _super.prototype.validateDataItems.call(this);\r\n var mainBaseDuration = $time.getDuration(this.mainBaseInterval.timeUnit, this.mainBaseInterval.count);\r\n this.maxZoomFactor = Math.max(1, (this.max - this.min) / mainBaseDuration);\r\n this._deltaMinMax = this.baseDuration / 2;\r\n // allows to keep selection of the same size\r\n var newPeriodCount = (this.max - this.min) / baseDuration;\r\n start = start + (end - start) * (1 - periodCount / newPeriodCount);\r\n this.zoom({ start: start, end: end }, false, true); // added instantlyto solve zoomout problem when we have axes gaps. @todo: check how this affects maxZoomFactor\r\n };\r\n /**\r\n * Handles process after zoom.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Does nothing?\r\n */\r\n DateAxis.prototype.handleSelectionExtremesChange = function () {\r\n };\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.getIntervalMax = function (interval) {\r\n return this._intervalMax[interval.timeUnit + interval.count];\r\n };\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.getIntervalMin = function (interval) {\r\n return this._intervalMin[interval.timeUnit + interval.count];\r\n };\r\n /**\r\n * Calculates all positions, related to axis as per current zoom.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.calculateZoom = function () {\r\n var _this = this;\r\n _super.prototype.calculateZoom.call(this);\r\n var difference = this.adjustDifference(this._minZoomed, this._maxZoomed);\r\n var dataSetChanged = false;\r\n // if data has to be grouped, choose interval and set dataset\r\n if (this.groupData && $type.hasValue(difference)) {\r\n var mainBaseInterval = this.mainBaseInterval;\r\n var min = this.getIntervalMin(mainBaseInterval);\r\n var max = this.getIntervalMax(mainBaseInterval);\r\n var selectionMin = min + (max - min) * this.start;\r\n var selectionMax = min + (max - min) * this.end;\r\n var diff = this.adjustDifference(selectionMin, selectionMax);\r\n var modifiedDifference = diff + (this.startLocation + (1 - this.endLocation)) * this.baseDuration;\r\n var groupInterval = void 0;\r\n if (this.groupInterval) {\r\n groupInterval = __assign({}, this.groupInterval);\r\n }\r\n else {\r\n groupInterval = this.chooseInterval(0, modifiedDifference, this.groupCount, this.groupIntervals);\r\n if ($time.getDuration(groupInterval.timeUnit, groupInterval.count) < $time.getDuration(mainBaseInterval.timeUnit, mainBaseInterval.count)) {\r\n groupInterval = __assign({}, mainBaseInterval);\r\n }\r\n }\r\n this._groupInterval = groupInterval;\r\n var newId = groupInterval.timeUnit + groupInterval.count;\r\n if (this._currentDataSetId != newId) {\r\n this._currentDataSetId = newId;\r\n this.dispatch(\"groupperiodchanged\");\r\n }\r\n this.series.each(function (series) {\r\n if (series.baseAxis == _this) {\r\n if (series.setDataSet(_this._currentDataSetId)) {\r\n dataSetChanged = true;\r\n }\r\n }\r\n });\r\n }\r\n var gridInterval = this.chooseInterval(0, difference, this._gridCount);\r\n if ($time.getDuration(gridInterval.timeUnit, gridInterval.count) < this.baseDuration) {\r\n gridInterval = __assign({}, this.baseInterval);\r\n }\r\n this._gridInterval = gridInterval;\r\n this._nextGridUnit = $time.getNextUnit(gridInterval.timeUnit);\r\n // the following is needed to avoid grid flickering while scrolling\r\n this._intervalDuration = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n this._gridDate = $time.round(new Date(this.minZoomed - $time.getDuration(gridInterval.timeUnit, gridInterval.count)), gridInterval.timeUnit, gridInterval.count, this._firstWeekDay, this._df.utc, new Date(this.min), this._df.timezoneMinutes, this._df.timezone);\r\n // tell series start/end\r\n $iter.each(this.series.iterator(), function (series) {\r\n if (series.baseAxis == _this) {\r\n var field_1 = series.getAxisField(_this);\r\n var minZoomed = $time.round(new Date(_this._minZoomed + _this.baseDuration * 0.05), _this.baseInterval.timeUnit, _this.baseInterval.count, _this._firstWeekDay, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone).getTime();\r\n var minZoomedStr = minZoomed.toString();\r\n var startDataItem = series.dataItemsByAxis.getKey(_this.uid).getKey(minZoomedStr + series.currentDataSetId);\r\n var startIndex = 0;\r\n if (_this.start != 0) {\r\n if (startDataItem) {\r\n startDataItem = _this.findFirst(startDataItem, minZoomed, field_1);\r\n startIndex = startDataItem.index;\r\n }\r\n else {\r\n startIndex = series.dataItems.findClosestIndex(_this._minZoomed, function (x) { return x[field_1]; }, \"left\");\r\n }\r\n }\r\n // 1 millisecond is removed so that if only first item is selected, it would not count in the second.\r\n var baseInterval = _this.baseInterval;\r\n var maxZoomed = $time.add($time.round(new Date(_this._maxZoomed), baseInterval.timeUnit, baseInterval.count, _this._firstWeekDay, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone), baseInterval.timeUnit, baseInterval.count, _this._df.utc).getTime();\r\n var maxZoomedStr = maxZoomed.toString();\r\n var endDataItem = series.dataItemsByAxis.getKey(_this.uid).getKey(maxZoomedStr + series.currentDataSetId);\r\n var endIndex = series.dataItems.length;\r\n if (_this.end != 1) {\r\n if (endDataItem) {\r\n endIndex = endDataItem.index;\r\n }\r\n else {\r\n maxZoomed -= 1;\r\n endIndex = series.dataItems.findClosestIndex(maxZoomed, function (x) { return x[field_1]; }, \"right\");\r\n // not good - if end is in the gap, indexes go like 5,4,3,4,2,1\r\n //if (endIndex < series.dataItems.length) {\r\n endIndex++;\r\n //}\r\n }\r\n }\r\n if (series.max(_this) < minZoomed) {\r\n series.startIndex = series.dataItems.length;\r\n series.endIndex = series.dataItems.length;\r\n series.outOfRange = true;\r\n }\r\n else if (series.min(_this) > maxZoomed) {\r\n series.startIndex = 0;\r\n series.endIndex = 0;\r\n series.outOfRange = true;\r\n }\r\n else {\r\n series.outOfRange = false;\r\n series.startIndex = startIndex;\r\n series.endIndex = endIndex;\r\n }\r\n //\tconsole.log(series.name, startIndex, endIndex);\r\n if (!dataSetChanged && series.dataRangeInvalid) {\r\n series.validateDataRange();\r\n }\r\n }\r\n });\r\n };\r\n DateAxis.prototype.findFirst = function (dataItem, time, key) {\r\n var index = dataItem.index;\r\n if (index > 0) {\r\n var series = dataItem.component;\r\n var previousDataItem = series.dataItems.getIndex(index - 1);\r\n var previousDate = previousDataItem[key];\r\n if (!previousDate || previousDate.getTime() < time) {\r\n return dataItem;\r\n }\r\n else {\r\n return this.findFirst(previousDataItem, time, key);\r\n }\r\n }\r\n else {\r\n return dataItem;\r\n }\r\n };\r\n /**\r\n * (Re)validates data.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.validateData = function () {\r\n _super.prototype.validateData.call(this);\r\n if (!$type.isNumber(this.baseInterval.count)) {\r\n this.baseInterval.count = 1;\r\n }\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"minDifference\", {\r\n /**\r\n * @ignore\r\n */\r\n get: function () {\r\n var _this = this;\r\n var minDifference = Number.MAX_VALUE;\r\n this.series.each(function (series) {\r\n if (minDifference > _this._minDifference[series.uid]) {\r\n minDifference = _this._minDifference[series.uid];\r\n }\r\n });\r\n if (minDifference == Number.MAX_VALUE || minDifference == 0) {\r\n minDifference = $time.getDuration(\"day\");\r\n }\r\n return minDifference;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * [dataChangeUpdate description]\r\n *\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n */\r\n DateAxis.prototype.seriesDataChangeUpdate = function (series) {\r\n this._minDifference[series.uid] = Number.MAX_VALUE;\r\n };\r\n /**\r\n * [postProcessSeriesDataItems description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n */\r\n DateAxis.prototype.postProcessSeriesDataItems = function (series) {\r\n var _this = this;\r\n this._firstWeekDay = this.getFirstWeekDay();\r\n if (series) {\r\n this.seriesGroupUpdate(series);\r\n }\r\n else {\r\n this.series.each(function (series) {\r\n _this.seriesGroupUpdate(series);\r\n });\r\n }\r\n this.addEmptyUnitsBreaks();\r\n };\r\n DateAxis.prototype.seriesGroupUpdate = function (series) {\r\n var _this = this;\r\n if (JSON.stringify(series._baseInterval[this.uid]) != JSON.stringify(this.mainBaseInterval)) {\r\n series._baseInterval[this.uid] = this.mainBaseInterval;\r\n series.mainDataSet.each(function (dataItem) {\r\n _this.postProcessSeriesDataItem(dataItem);\r\n });\r\n if (this.groupData) {\r\n this.groupSeriesData(series);\r\n }\r\n }\r\n };\r\n /**\r\n * Calculates series group data.\r\n *\r\n * @param series Series\r\n * @ignore\r\n */\r\n DateAxis.prototype.groupSeriesData = function (series) {\r\n var _this = this;\r\n if (series.baseAxis == this && series.dataItems.length > 0 && !series.dataGrouped) {\r\n series.bulletsContainer.removeChildren();\r\n // make array of intervals which will be used;\r\n var intervals_1 = [];\r\n var mainBaseInterval = this.mainBaseInterval;\r\n var mainIntervalDuration_1 = $time.getDuration(mainBaseInterval.timeUnit, mainBaseInterval.count);\r\n this.groupIntervals.each(function (interval) {\r\n var intervalDuration = $time.getDuration(interval.timeUnit, interval.count);\r\n if ((intervalDuration > mainIntervalDuration_1 && intervalDuration < (_this.max - _this.min)) || _this.groupInterval) {\r\n intervals_1.push(interval);\r\n }\r\n });\r\n if (series._dataSets) {\r\n series._dataSets.each(function (key, dataItems) {\r\n dataItems.each(function (dataItem) {\r\n dataItem.dispose();\r\n });\r\n dataItems.clear();\r\n });\r\n series._dataSets.clear();\r\n }\r\n series.dataGrouped = true;\r\n $array.each(intervals_1, function (interval) {\r\n //let mainBaseInterval = this._mainBaseInterval;\r\n var key = \"date\" + _this.axisLetter;\r\n // create data set\r\n var dataSetId = interval.timeUnit + interval.count;\r\n // todo: check where this clone goes\r\n var dataSet = new OrderedListTemplate(series.mainDataSet.template.clone());\r\n series.dataSets.setKey(dataSetId, dataSet);\r\n var dataItems = series.mainDataSet;\r\n var previousTime = Number.NEGATIVE_INFINITY;\r\n var i = 0;\r\n var newDataItem;\r\n var dataFields = [];\r\n $object.each(series.dataFields, function (dfkey, df) {\r\n var dfk = dfkey;\r\n if (dfk != key && dfk.indexOf(\"Show\") == -1) {\r\n dataFields.push(dfk);\r\n }\r\n });\r\n var roundedDate;\r\n dataItems.each(function (dataItem) {\r\n var date = dataItem.getDate(key);\r\n if (date) {\r\n var time = date.getTime();\r\n roundedDate = $time.round(new Date(time), interval.timeUnit, interval.count, _this._df.firstDayOfWeek, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone);\r\n var currentTime = roundedDate.getTime();\r\n // changed period\t\t\t\t\t\t\t\t\r\n if (previousTime < currentTime) {\r\n if (newDataItem && series._adapterO) {\r\n $array.each(dataFields, function (vkey) {\r\n newDataItem.values[vkey].value = series._adapterO.apply(\"groupDataItem\", {\r\n dataItem: newDataItem,\r\n interval: interval,\r\n dataField: vkey,\r\n date: roundedDate,\r\n value: newDataItem.values[vkey].value\r\n }).value;\r\n newDataItem.values[vkey].workingValue = newDataItem.values[vkey].value;\r\n });\r\n }\r\n newDataItem = dataSet.create();\r\n newDataItem.dataContext = {};\r\n newDataItem.setWorkingLocation(\"dateX\", series.dataItems.template.locations.dateX, 0);\r\n newDataItem.setWorkingLocation(\"openDateX\", series.dataItems.template.locations.openDateX, 0);\r\n newDataItem.setWorkingLocation(\"dateY\", series.dataItems.template.locations.dateY, 0);\r\n newDataItem.setWorkingLocation(\"openDateY\", series.dataItems.template.locations.openDateY, 0);\r\n newDataItem.component = series;\r\n // other Dates?\r\n newDataItem.setDate(key, roundedDate);\r\n newDataItem._index = i;\r\n i++;\r\n $array.each(dataFields, function (vkey) {\r\n //let groupFieldName = vkey + \"Group\";\r\n var dvalues = dataItem.values[vkey];\r\n if (dvalues) {\r\n var value = dvalues.value;\r\n if (series._adapterO) {\r\n value = series._adapterO.apply(\"groupValue\", {\r\n dataItem: dataItem,\r\n interval: interval,\r\n dataField: vkey,\r\n date: roundedDate,\r\n value: value\r\n }).value;\r\n }\r\n var values = newDataItem.values[vkey];\r\n if ($type.isNumber(value)) {\r\n values.value = value;\r\n values.workingValue = value;\r\n values.open = value;\r\n values.close = value;\r\n values.low = value;\r\n values.high = value;\r\n values.sum = value;\r\n values.average = value;\r\n values.count = 1;\r\n }\r\n else {\r\n values.count = 0;\r\n }\r\n }\r\n });\r\n _this.postProcessSeriesDataItem(newDataItem, interval);\r\n $object.each(series.propertyFields, function (key, fieldValue) {\r\n var f = key;\r\n var value = dataItem.properties[key];\r\n if ($type.hasValue(value)) {\r\n newDataItem.hasProperties = true;\r\n newDataItem.setProperty(f, value);\r\n }\r\n });\r\n newDataItem.groupDataItems = [dataItem];\r\n previousTime = currentTime;\r\n }\r\n else {\r\n if (newDataItem) {\r\n $array.each(dataFields, function (vkey) {\r\n var groupFieldName = series.groupFields[vkey];\r\n var dvalues = dataItem.values[vkey];\r\n if (dvalues) {\r\n var value = dvalues.value;\r\n if (series._adapterO) {\r\n value = series._adapterO.apply(\"groupValue\", {\r\n dataItem: dataItem,\r\n interval: interval,\r\n dataField: vkey,\r\n date: roundedDate,\r\n value: value\r\n }).value;\r\n }\r\n if ($type.isNumber(value)) {\r\n var values = newDataItem.values[vkey];\r\n if (!$type.isNumber(values.open)) {\r\n values.open = value;\r\n }\r\n values.close = value;\r\n if (values.low > value || !$type.isNumber(values.low)) {\r\n values.low = value;\r\n }\r\n if (values.high < value || !$type.isNumber(values.high)) {\r\n values.high = value;\r\n }\r\n if ($type.isNumber(values.sum)) {\r\n values.sum += value;\r\n }\r\n else {\r\n values.sum = value;\r\n }\r\n values.count++;\r\n values.average = values.sum / values.count;\r\n if ($type.isNumber(values[groupFieldName])) {\r\n values.value = values[groupFieldName];\r\n values.workingValue = values.value;\r\n }\r\n }\r\n }\r\n });\r\n $utils.copyProperties(dataItem.properties, newDataItem.properties);\r\n $object.each(series.propertyFields, function (key, fieldValue) {\r\n var f = key;\r\n var value = dataItem.properties[key];\r\n if ($type.hasValue(value)) {\r\n newDataItem.hasProperties = true;\r\n newDataItem.setProperty(f, value);\r\n }\r\n });\r\n newDataItem.groupDataItems.push(dataItem);\r\n }\r\n }\r\n }\r\n if (newDataItem) {\r\n $utils.copyProperties(dataItem.dataContext, newDataItem.dataContext);\r\n }\r\n });\r\n if (newDataItem && series._adapterO) {\r\n $array.each(dataFields, function (vkey) {\r\n newDataItem.values[vkey].value = series._adapterO.apply(\"groupDataItem\", {\r\n dataItem: newDataItem,\r\n interval: interval,\r\n dataField: vkey,\r\n date: roundedDate,\r\n value: newDataItem.values[vkey].value\r\n }).value;\r\n newDataItem.values[vkey].workingValue = newDataItem.values[vkey].value;\r\n });\r\n }\r\n });\r\n this.calculateZoom();\r\n }\r\n };\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.getDFFormatter = function () {\r\n this._df = this.dateFormatter;\r\n };\r\n /**\r\n * [postProcessSeriesDataItem description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem Data item\r\n */\r\n DateAxis.prototype.postProcessSeriesDataItem = function (dataItem, interval) {\r\n var _this = this;\r\n // we need to do this for all series data items not only added recently, as baseInterval might change\r\n var intervalID = \"\";\r\n if (interval) {\r\n intervalID = interval.timeUnit + interval.count;\r\n }\r\n else {\r\n interval = this.mainBaseInterval;\r\n }\r\n var series = dataItem.component;\r\n var dataItemsByAxis = series.dataItemsByAxis.getKey(this.uid);\r\n $object.each(dataItem.dates, function (key) {\r\n var date = dataItem.getDate(key);\r\n var time = date.getTime();\r\n var startDate = $time.round(new Date(time), interval.timeUnit, interval.count, _this._firstWeekDay, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone);\r\n var startTime = startDate.getTime();\r\n var endDate = $time.add(new Date(startTime), interval.timeUnit, interval.count, _this._df.utc);\r\n dataItem.setCalculatedValue(key, startTime, \"open\");\r\n dataItem.setCalculatedValue(key, endDate.getTime(), \"close\");\r\n dataItemsByAxis.setKey(startTime + intervalID, dataItem);\r\n });\r\n };\r\n /**\r\n * Collapses empty stretches of date/time scale by creating [[AxisBreak]]\r\n * elements for them.\r\n *\r\n * Can be used to automatically remove strethes without data, like weekends.\r\n *\r\n * No, need to call this manually. It will automatically be done if\r\n * `skipEmptyPeriods = true`.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.addEmptyUnitsBreaks = function () {\r\n var _this = this;\r\n if (this.skipEmptyPeriods && $type.isNumber(this.min) && $type.isNumber(this.max)) {\r\n var timeUnit = this.baseInterval.timeUnit;\r\n var count = this.baseInterval.count;\r\n if (this._axisBreaks) {\r\n this._axisBreaks.clear(); // TODO: what about breaks added by user?\r\n }\r\n var date = $time.round(new Date(this.min), timeUnit, count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n var axisBreak = void 0;\r\n var _loop_1 = function () {\r\n $time.add(date, timeUnit, count, this_1._df.utc);\r\n var startTime = date.getTime();\r\n var startTimeStr = startTime.toString();\r\n var hasData = $iter.contains(this_1.series.iterator(), function (series) {\r\n return !!series.dataItemsByAxis.getKey(_this.uid).getKey(startTimeStr + series.currentDataSetId);\r\n });\r\n // open break if not yet opened\r\n if (!hasData) {\r\n if (!axisBreak) {\r\n axisBreak = this_1.axisBreaks.create();\r\n axisBreak.startDate = new Date(startTime);\r\n this_1._gapBreaks = true;\r\n }\r\n }\r\n else {\r\n // close if already opened\r\n if (axisBreak) {\r\n // close at end time minus one millisecond\r\n axisBreak.endDate = new Date(startTime - 1);\r\n axisBreak = undefined;\r\n }\r\n }\r\n };\r\n var this_1 = this;\r\n while (date.getTime() < this.max - this.baseDuration) {\r\n _loop_1();\r\n }\r\n }\r\n };\r\n /**\r\n * Updates positioning of Axis breaks after something changes.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.fixAxisBreaks = function () {\r\n var _this = this;\r\n _super.prototype.fixAxisBreaks.call(this);\r\n var axisBreaks = this._axisBreaks;\r\n if (axisBreaks) {\r\n if (axisBreaks.length > 0) {\r\n // process breaks\r\n axisBreaks.each(function (axisBreak) {\r\n var breakGridCount = Math.ceil(_this._gridCount * (Math.min(_this.end, axisBreak.endPosition) - Math.max(_this.start, axisBreak.startPosition)) / (_this.end - _this.start));\r\n axisBreak.gridInterval = _this.chooseInterval(0, axisBreak.adjustedEndValue - axisBreak.adjustedStartValue, breakGridCount);\r\n var gridDate = $time.round(new Date(axisBreak.adjustedStartValue), axisBreak.gridInterval.timeUnit, axisBreak.gridInterval.count, _this._firstWeekDay, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone);\r\n if (gridDate.getTime() > axisBreak.startDate.getTime()) {\r\n $time.add(gridDate, axisBreak.gridInterval.timeUnit, axisBreak.gridInterval.count, _this._df.utc);\r\n }\r\n axisBreak.gridDate = gridDate;\r\n });\r\n }\r\n }\r\n };\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.getFirstWeekDay = function () {\r\n if (this._df) {\r\n return this._df.firstDayOfWeek;\r\n }\r\n return 1;\r\n };\r\n /**\r\n * [getGridDate description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param date [description]\r\n * @param intervalCount [description]\r\n * @return [description]\r\n */\r\n DateAxis.prototype.getGridDate = function (date, intervalCount) {\r\n var timeUnit = this._gridInterval.timeUnit;\r\n var realIntervalCount = this._gridInterval.count;\r\n // round date\r\n $time.round(date, timeUnit, 1, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n var prevTimestamp = date.getTime();\r\n var newDate = $time.copy(date);\r\n // modify date by adding intervalcount\r\n var timestamp = $time.add(newDate, timeUnit, intervalCount, this._df.utc).getTime();\r\n // if it's axis break, get first rounded date which is not in a break\r\n var axisBreak = this.isInBreak(timestamp);\r\n if (axisBreak && axisBreak.endDate) {\r\n newDate = new Date(axisBreak.endDate.getTime());\r\n $time.round(newDate, timeUnit, realIntervalCount, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n if (newDate.getTime() < axisBreak.endDate.getTime()) {\r\n $time.add(newDate, timeUnit, realIntervalCount, this._df.utc);\r\n }\r\n timestamp = newDate.getTime();\r\n }\r\n // get duration between grid lines with break duration removed\r\n var durationBreaksRemoved = this.adjustDifference(prevTimestamp, timestamp);\r\n // calculate how many time units fit to this duration\r\n var countBreaksRemoved = Math.round(durationBreaksRemoved / $time.getDuration(timeUnit));\r\n // if less units fit, add one and repeat\r\n if (countBreaksRemoved < realIntervalCount) {\r\n return this.getGridDate(date, intervalCount + realIntervalCount);\r\n }\r\n return newDate;\r\n };\r\n /**\r\n * [getBreaklessDate description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param axisBreak [description]\r\n * @param timeUnit [description]\r\n * @param count [description]\r\n * @return [description]\r\n */\r\n DateAxis.prototype.getBreaklessDate = function (axisBreak, timeUnit, count) {\r\n var date = new Date(axisBreak.endValue);\r\n $time.round(date, timeUnit, count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n $time.add(date, timeUnit, count, this._df.utc);\r\n var timestamp = date.getTime();\r\n axisBreak = this.isInBreak(timestamp);\r\n if (axisBreak) {\r\n return this.getBreaklessDate(axisBreak, timeUnit, count);\r\n }\r\n return date;\r\n };\r\n /**\r\n * (Re)validates all Axis elements.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n */\r\n DateAxis.prototype.validateAxisElements = function () {\r\n var _this = this;\r\n if ($type.isNumber(this.max) && $type.isNumber(this.min)) {\r\n this.calculateZoom();\r\n // first regular items\r\n var timestamp = this._gridDate.getTime();\r\n var timeUnit = this._gridInterval.timeUnit;\r\n var intervalCount = this._gridInterval.count;\r\n var prevGridDate = $time.copy(this._gridDate);\r\n var dataItemsIterator_1 = this._dataItemsIterator;\r\n this.resetIterators();\r\n var _loop_2 = function () {\r\n var date = this_2.getGridDate($time.copy(prevGridDate), intervalCount);\r\n timestamp = date.getTime();\r\n var endDate = $time.copy(date); // you might think it's easier to add intervalduration to timestamp, however it won't work for months or years which are not of the same length\r\n endDate = $time.add(endDate, timeUnit, intervalCount, this_2._df.utc);\r\n var format = this_2.dateFormats.getKey(timeUnit);\r\n if (this_2.markUnitChange && prevGridDate) {\r\n if ($time.checkChange(date, prevGridDate, this_2._nextGridUnit, this_2._df.utc)) {\r\n if (timeUnit !== \"year\") {\r\n format = this_2.periodChangeDateFormats.getKey(timeUnit);\r\n }\r\n }\r\n }\r\n var text = this_2._df.format(date, format);\r\n var dataItem = dataItemsIterator_1.find(function (x) { return x.text === text; });\r\n if (dataItem.__disabled) {\r\n dataItem.__disabled = false;\r\n }\r\n this_2.appendDataItem(dataItem);\r\n dataItem.axisBreak = undefined;\r\n dataItem.date = date;\r\n dataItem.endDate = endDate;\r\n dataItem.text = text;\r\n this_2.validateDataElement(dataItem);\r\n prevGridDate = date;\r\n };\r\n var this_2 = this;\r\n while (timestamp <= this._maxZoomed) {\r\n _loop_2();\r\n }\r\n // breaks later\r\n var renderer_1 = this.renderer;\r\n if (this._axisBreaks) {\r\n $iter.each(this._axisBreaks.iterator(), function (axisBreak) {\r\n if (axisBreak.breakSize > 0) {\r\n var timeUnit_1 = axisBreak.gridInterval.timeUnit;\r\n var intervalCount_1 = axisBreak.gridInterval.count;\r\n // only add grid if gap is bigger then minGridDistance\r\n if ($math.getDistance(axisBreak.startPoint, axisBreak.endPoint) > renderer_1.minGridDistance * 4) {\r\n var timestamp_1 = axisBreak.gridDate.getTime();\r\n var prevGridDate_1;\r\n var count = 0;\r\n var _loop_3 = function () {\r\n var date = $time.copy(axisBreak.gridDate);\r\n timestamp_1 = $time.add(date, timeUnit_1, intervalCount_1 * count, _this._df.utc).getTime();\r\n count++;\r\n if (timestamp_1 > axisBreak.adjustedStartValue && timestamp_1 < axisBreak.adjustedEndValue) {\r\n var endDate = $time.copy(date); // you might think it's easier to add intervalduration to timestamp, however it won't work for months or years which are not of the same length\r\n endDate = $time.add(endDate, timeUnit_1, intervalCount_1, _this._df.utc);\r\n var format = _this.dateFormats.getKey(timeUnit_1);\r\n if (_this.markUnitChange && prevGridDate_1) {\r\n if ($time.checkChange(date, prevGridDate_1, _this._nextGridUnit, _this._df.utc)) {\r\n if (timeUnit_1 !== \"year\") {\r\n format = _this.periodChangeDateFormats.getKey(timeUnit_1);\r\n }\r\n }\r\n }\r\n var text_1 = _this._df.format(date, format);\r\n var dataItem = dataItemsIterator_1.find(function (x) { return x.text === text_1; });\r\n if (dataItem.__disabled) {\r\n dataItem.__disabled = false;\r\n }\r\n //this.processDataItem(dataItem);\r\n _this.appendDataItem(dataItem);\r\n dataItem.axisBreak = axisBreak;\r\n axisBreak.dataItems.moveValue(dataItem);\r\n dataItem.date = date;\r\n dataItem.endDate = endDate;\r\n dataItem.text = text_1;\r\n prevGridDate_1 = date;\r\n _this.validateDataElement(dataItem);\r\n }\r\n };\r\n while (timestamp_1 <= axisBreak.adjustedMax) {\r\n _loop_3();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n };\r\n /**\r\n * Validates Axis data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @param dataItem Data item\r\n */\r\n DateAxis.prototype.validateDataElement = function (dataItem) {\r\n dataItem.itemIndex = this._axisItemCount;\r\n this._axisItemCount++;\r\n if ($type.isNumber(this.max) && $type.isNumber(this.min)) {\r\n var renderer = this.renderer;\r\n var timestamp = dataItem.value;\r\n var endTimestamp = dataItem.endValue;\r\n if (!$type.isNumber(endTimestamp)) {\r\n endTimestamp = timestamp;\r\n }\r\n var position = this.valueToPosition(timestamp);\r\n var endPosition = this.valueToPosition(endTimestamp);\r\n var fillEndPosition = endPosition;\r\n if (!dataItem.isRange && this._gridInterval.count > this.baseInterval.count) {\r\n endPosition = position + (endPosition - position) / (this._gridInterval.count / this.baseInterval.count);\r\n }\r\n dataItem.position = position;\r\n var tick = dataItem.tick;\r\n if (tick && !tick.disabled) {\r\n renderer.updateTickElement(tick, position, endPosition);\r\n }\r\n var grid = dataItem.grid;\r\n if (grid && !grid.disabled) {\r\n renderer.updateGridElement(grid, position, endPosition);\r\n }\r\n var fill = dataItem.axisFill;\r\n if (fill && !fill.disabled) {\r\n renderer.updateFillElement(fill, position, fillEndPosition);\r\n if (!dataItem.isRange) {\r\n this.fillRule(dataItem);\r\n }\r\n }\r\n var mask = dataItem.mask;\r\n if (mask) {\r\n renderer.updateFillElement(mask, position, endPosition);\r\n }\r\n if (dataItem.bullet) {\r\n renderer.updateBullet(dataItem.bullet, position, endPosition);\r\n }\r\n var label = dataItem.label;\r\n if (label && !label.disabled) {\r\n var location_1 = label.location;\r\n if (location_1 == 0) {\r\n if (this._gridInterval.count == 1 && this._gridInterval.timeUnit != \"week\" && !dataItem.isRange) {\r\n location_1 = 0.5;\r\n }\r\n else {\r\n location_1 = 0;\r\n }\r\n }\r\n renderer.updateLabelElement(label, position, endPosition, location_1);\r\n }\r\n }\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"baseDuration\", {\r\n /**\r\n * A duration in milliseconds of the `baseInterval`.\r\n *\r\n * @return Duration (ms)\r\n */\r\n get: function () {\r\n return $time.getDuration(this.baseInterval.timeUnit, this.baseInterval.count);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Adjusts min/max values.\r\n *\r\n * @ignore Exclude from docs.\r\n * @todo Description (review)\r\n * @param min Min timestamp\r\n * @param max Max timestamp\r\n * @return Adjusted min/max step\r\n */\r\n DateAxis.prototype.adjustMinMax = function (min, max) {\r\n return { min: min, max: max, step: this.baseDuration };\r\n };\r\n /**\r\n * Adjusts the minimum timestamp as per cell start location.\r\n *\r\n * @param value Value\r\n * @return Adjusted value\r\n */\r\n DateAxis.prototype.fixMin = function (value) {\r\n // like this because months are not equal\r\n var interval = this.baseInterval;\r\n var startTime = $time.round(new Date(value), interval.timeUnit, interval.count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone).getTime();\r\n var endTime = $time.add(new Date(startTime), interval.timeUnit, interval.count, this._df.utc).getTime();\r\n return startTime + (endTime - startTime) * this.startLocation;\r\n };\r\n /**\r\n * Adjusts the maximum timestamp as per cell start location.\r\n *\r\n * @param value Value\r\n * @return Adjusted value\r\n */\r\n DateAxis.prototype.fixMax = function (value) {\r\n // like this because months are not equal\r\n var interval = this.baseInterval;\r\n var startTime = $time.round(new Date(value), interval.timeUnit, interval.count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone).getTime();\r\n var endTime = $time.add(new Date(startTime), interval.timeUnit, interval.count, this._df.utc).getTime();\r\n return startTime + (endTime - startTime) * this.endLocation;\r\n };\r\n /**\r\n * [chooseInterval description]\r\n *\r\n * @ignore Exclude from docs.\r\n * @todo Description\r\n * @param index [description]\r\n * @param duration [description]\r\n * @param gridCount [description]\r\n * @return [description]\r\n */\r\n DateAxis.prototype.chooseInterval = function (index, duration, gridCount, intervals) {\r\n if (!intervals) {\r\n intervals = this.gridIntervals;\r\n }\r\n var gridInterval = intervals.getIndex(index);\r\n var intervalDuration = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n var lastIndex = intervals.length - 1;\r\n if (index >= lastIndex) {\r\n return __assign({}, intervals.getIndex(lastIndex));\r\n }\r\n var count = Math.ceil(duration / intervalDuration);\r\n if (duration < intervalDuration && index > 0) {\r\n return __assign({}, intervals.getIndex(index - 1));\r\n }\r\n if (count <= gridCount) {\r\n return __assign({}, intervals.getIndex(index));\r\n }\r\n else {\r\n if (index + 1 < intervals.length) {\r\n return this.chooseInterval(index + 1, duration, gridCount, intervals);\r\n }\r\n else {\r\n return __assign({}, intervals.getIndex(index));\r\n }\r\n }\r\n };\r\n /**\r\n * Formats the value according to axis' own [[DateFormatter]].\r\n *\r\n * @param value Source value\r\n * @return Formatted value\r\n */\r\n DateAxis.prototype.formatLabel = function (value) {\r\n return this._df.format(value);\r\n };\r\n /**\r\n * Converts a Date to an asbolute pixel position within Axis.\r\n *\r\n * @param date Date\r\n * @return Position (px)\r\n */\r\n DateAxis.prototype.dateToPosition = function (date) {\r\n return this.valueToPosition(date.getTime());\r\n };\r\n /**\r\n * Converts a numeric timestamp or a `Date` to a relative position on axis.\r\n *\r\n * @param date Date or a timestamp\r\n * @return Relative position\r\n */\r\n DateAxis.prototype.anyToPosition = function (date) {\r\n if (date instanceof Date) {\r\n return this.dateToPosition(date);\r\n }\r\n else {\r\n return this.valueToPosition(date);\r\n }\r\n };\r\n /**\r\n * Converts date to orientation point (x, y, angle) on axis\r\n *\r\n * @param date Date\r\n * @return IOrientationPoint\r\n */\r\n DateAxis.prototype.dateToPoint = function (date) {\r\n var position = this.dateToPosition(date);\r\n var point = this.renderer.positionToPoint(position);\r\n var angle = this.renderer.positionToAngle(position);\r\n return { x: point.x, y: point.y, angle: angle };\r\n };\r\n /**\r\n * Converts a numeric value to orientation (x, y, angle) point on axis\r\n *\r\n * @param value Value\r\n * @return Orientation point\r\n */\r\n DateAxis.prototype.anyToPoint = function (date) {\r\n if (date instanceof Date) {\r\n return this.dateToPoint(date);\r\n }\r\n else {\r\n return this.valueToPoint(date);\r\n }\r\n };\r\n /**\r\n * Converts pixel position within Axis to a corresponding Date.\r\n *\r\n * @param position Position (px)\r\n * @return Date\r\n */\r\n DateAxis.prototype.positionToDate = function (position) {\r\n return new Date(this.positionToValue(position));\r\n };\r\n /**\r\n * Returns the relative position on axis for series' data item's value.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @return Relative position\r\n */\r\n DateAxis.prototype.getPositionX = function (dataItem, key, location, stackKey, range) {\r\n var value = this.getTimeByLocation(dataItem, key, location);\r\n //let stack: number = dataItem.getValue(\"valueX\", \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n }\r\n var position = this.valueToPosition(value);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns relative position on axis for series' data item's value.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @return Relative position\r\n */\r\n DateAxis.prototype.getPositionY = function (dataItem, key, location, stackKey, range) {\r\n var value = this.getTimeByLocation(dataItem, key, location);\r\n var stack = dataItem.getValue(\"valueX\", \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n }\r\n var position = this.valueToPosition(value + stack);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns an angle for series data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey Stack ID\r\n * @param range Range to fit in\r\n * @return Angle\r\n */\r\n DateAxis.prototype.getAngle = function (dataItem, key, location, stackKey, range) {\r\n var value = this.getTimeByLocation(dataItem, key, location);\r\n var stack = dataItem.getValue(stackKey, \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n }\r\n var position = this.valueToPosition(value + stack);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return this.positionToAngle(position);\r\n };\r\n /**\r\n * [getTimeByLocation description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem [description]\r\n * @param key [description]\r\n * @param location [description]\r\n * @return [description]\r\n */\r\n DateAxis.prototype.getTimeByLocation = function (dataItem, key, location) {\r\n if (!$type.hasValue(key)) {\r\n return;\r\n }\r\n if (!$type.isNumber(location)) {\r\n location = dataItem.workingLocations[key];\r\n if (!$type.isNumber(location)) {\r\n location = 0;\r\n }\r\n }\r\n var startTime = dataItem.values[key][\"open\"];\r\n var endTime = dataItem.values[key][\"close\"];\r\n var workingValue = dataItem.values[key].workingValue;\r\n var value = dataItem.values[key].value;\r\n var difference = value - workingValue;\r\n startTime -= difference;\r\n endTime -= difference;\r\n if ($type.isNumber(startTime) && $type.isNumber(endTime)) {\r\n return startTime + (endTime - startTime) * location;\r\n }\r\n };\r\n /**\r\n * Processes a related series' data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem Data item\r\n */\r\n DateAxis.prototype.processSeriesDataItem = function (dataItem, axisLetter) {\r\n var series = dataItem.component;\r\n var time;\r\n var date = dataItem[\"date\" + axisLetter];\r\n if ($type.isNumber(this.timezoneOffset)) {\r\n date.setTime(date.getTime() + (date.getTimezoneOffset() - this.timezoneOffset) * 60000);\r\n dataItem.setValue(\"date\" + axisLetter, date.getTime(), 0);\r\n }\r\n else if ($type.hasValue(this.timezone)) {\r\n date = $time.setTimezone(date, this.timezone);\r\n dataItem.setValue(\"date\" + axisLetter, date.getTime(), 0);\r\n dataItem[\"date\" + axisLetter] = date;\r\n }\r\n if (date) {\r\n time = date.getTime();\r\n }\r\n else {\r\n return;\r\n }\r\n var openDate = dataItem[\"openDate\" + axisLetter];\r\n var prevSeriesTime = this._prevSeriesTime[series.uid];\r\n var openTime;\r\n if (openDate) {\r\n openTime = openDate.getTime();\r\n }\r\n if ($type.isNumber(openTime)) {\r\n var difference = Math.abs(time - openTime);\r\n if (this._minDifference[series.uid] > difference) {\r\n this._minDifference[series.uid] = difference;\r\n }\r\n }\r\n var differece = time - prevSeriesTime;\r\n if (differece > 0) {\r\n if (this._minDifference[series.uid] > differece) {\r\n this._minDifference[series.uid] = differece;\r\n }\r\n }\r\n this._prevSeriesTime[series.uid] = time;\r\n if (series._baseInterval[this.uid]) {\r\n this.postProcessSeriesDataItem(dataItem);\r\n }\r\n };\r\n /**\r\n * [updateAxisBySeries description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n */\r\n DateAxis.prototype.updateAxisBySeries = function () {\r\n _super.prototype.updateAxisBySeries.call(this);\r\n var baseInterval = this.chooseInterval(0, this.minDifference, 1);\r\n // handle short months\r\n if (this.minDifference >= $time.getDuration(\"day\", 27) && baseInterval.timeUnit == \"week\") {\r\n baseInterval.timeUnit = \"month\";\r\n baseInterval.count = 1;\r\n }\r\n if (baseInterval.timeUnit == \"month\") {\r\n if (this.minDifference >= $time.getDuration(\"day\", 29 * 2) && baseInterval.count == 1) {\r\n baseInterval.count = 2;\r\n }\r\n if (this.minDifference >= $time.getDuration(\"day\", 29 * 3) && baseInterval.count == 2) {\r\n baseInterval.count = 3;\r\n }\r\n if (this.minDifference >= $time.getDuration(\"day\", 29 * 6) && baseInterval.count == 5) {\r\n baseInterval.count = 6;\r\n }\r\n }\r\n // handle daylight saving\r\n if (this.minDifference >= $time.getDuration(\"hour\", 23) && baseInterval.timeUnit == \"hour\") {\r\n baseInterval.timeUnit = \"day\";\r\n baseInterval.count = 1;\r\n }\r\n if (this.minDifference >= $time.getDuration(\"week\", 1) - $time.getDuration(\"hour\", 1) && baseInterval.timeUnit == \"day\") {\r\n baseInterval.timeUnit = \"week\";\r\n baseInterval.count = 1;\r\n }\r\n if (this.minDifference >= $time.getDuration(\"year\", 1) - $time.getDuration(\"day\", 1.01) && baseInterval.timeUnit == \"month\") {\r\n baseInterval.timeUnit = \"year\";\r\n baseInterval.count = 1;\r\n }\r\n this._baseIntervalReal = baseInterval;\r\n this._mainBaseInterval = baseInterval;\r\n // no need to invalidate\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"baseInterval\", {\r\n /**\r\n * @return Base interval\r\n */\r\n get: function () {\r\n if (this._groupInterval) {\r\n return this._groupInterval;\r\n }\r\n else if (this._baseInterval) {\r\n return this._baseInterval;\r\n }\r\n else {\r\n return this._baseIntervalReal;\r\n }\r\n },\r\n /**\r\n * A base interval (granularity) of data.\r\n *\r\n * Used to indicate what are the base units of your data.\r\n *\r\n * For example, if you have a data set that has a data point every 5 minutes,\r\n * you may want to set this to `{ timeUnit: \"minute\", count: 5 }`.\r\n *\r\n * If not set, the Axis will try to determine the setting by its own, looking\r\n * at actual data.\r\n *\r\n * For best results, try to follow these values for `count`:\r\n *\r\n * When unit is \"month\", use 12 / count = round number\r\n * When unit is \"hour\", use 24 / count = round number\r\n * When unit is \"second\" and \"minute\", use 60 / count = round number\r\n *\r\n * @param timeInterval base interval\r\n */\r\n set: function (timeInterval) {\r\n if (JSON.stringify(this._baseInterval) != JSON.stringify(timeInterval)) {\r\n this._baseInterval = timeInterval;\r\n this._mainBaseInterval = timeInterval;\r\n if (!$type.isNumber(timeInterval.count)) {\r\n timeInterval.count = 1;\r\n }\r\n this.invalidate();\r\n this.postProcessSeriesDataItems();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"mainBaseInterval\", {\r\n /**\r\n * Indicates granularity of the data of source (unaggregated) data.\r\n *\r\n * @since 4.7.0\r\n * @return Granularity of the main data set\r\n */\r\n get: function () {\r\n if (this._baseInterval) {\r\n return this._baseInterval;\r\n }\r\n else if (this._mainBaseInterval) {\r\n return this._mainBaseInterval;\r\n }\r\n else {\r\n return this._baseIntervalReal;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"skipEmptyPeriods\", {\r\n /**\r\n * @return Remove empty stretches of time?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"skipEmptyPeriods\");\r\n },\r\n /**\r\n * If enabled, axis will automatically collapse empty (without data points)\r\n * periods of time, i.e. weekends.\r\n *\r\n * An \"empty\" period is considered a stretch of time in the length of current\r\n * `baseInterval` without a single data point in it.\r\n *\r\n * For each such empty period, axis will automatically create an\r\n * [[AxisBreak]]. By default they will be invisible. You can still configure\r\n * them by accessing `axis.breaks.template`.\r\n *\r\n * [More info about breaks](https://www.amcharts.com/docs/v4/concepts/axes/#Breaks).\r\n *\r\n * Important notes:\r\n * * If you set this property to `true`, you can not add your custom axis breaks to this axis anymore.\r\n * * Using this feature affects performance. Use only if you need it.\r\n * * Setting this to `true` will reset appearance of breaks. If you want to modify appearance, do it *after* you set `skipEmptyPeriods`.\r\n * * Some axis label overlapping might happen.\r\n * * This setting is not compatible with `groupData = true`.\r\n *\r\n * @default false\r\n * @param value Remove empty stretches of time?\r\n */\r\n set: function (value) {\r\n if (value) {\r\n var breakTemplate = this.axisBreaks.template;\r\n breakTemplate.startLine.disabled = true;\r\n breakTemplate.endLine.disabled = true;\r\n breakTemplate.fillShape.disabled = true;\r\n breakTemplate.breakSize = 0;\r\n }\r\n else {\r\n if (this._gapBreaks) {\r\n this.axisBreaks.clear();\r\n this._gapBreaks = false;\r\n }\r\n }\r\n if (this.setPropertyValue(\"skipEmptyPeriods\", value)) {\r\n this.invalidate();\r\n this.postProcessSeriesDataItems();\r\n this.invalidateSeries();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"tooltipDateFormat\", {\r\n /**\r\n * @return Date format\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"tooltipDateFormat\");\r\n },\r\n /**\r\n * A special date format to apply axis tooltips.\r\n *\r\n * Will use same format as for labels, if not set.\r\n *\r\n * @param value Date format\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"tooltipDateFormat\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"markUnitChange\", {\r\n /**\r\n * @return Use different format for period beginning?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"markUnitChange\");\r\n },\r\n /**\r\n * Use `periodChangeDateFormats` to apply different formats to the first\r\n * label in bigger time unit.\r\n *\r\n * @default true\r\n * @param value Use different format for period beginning?\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"markUnitChange\", value)) {\r\n this.invalidateData();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Returns text to show in a tooltip, based on specific relative position\r\n * within axis.\r\n *\r\n * The label will be formatted as per [[DateFormatter]] set for the whole\r\n * chart, or explicitly for this Axis.\r\n *\r\n * @ignore Exclude from docs\r\n * @param position Position\r\n * @return Label (formatted date)\r\n */\r\n DateAxis.prototype.getTooltipText = function (position) {\r\n var text;\r\n var date = this.positionToDate(position);\r\n date = $time.round(date, this.baseInterval.timeUnit, this.baseInterval.count, this._firstWeekDay, this._df.utc, new Date(this.min), this._df.timezoneMinutes, this._df.timezone);\r\n this.tooltipDate = date;\r\n if ($type.hasValue(this.tooltipDateFormat)) {\r\n text = this._df.format(date, this.tooltipDateFormat, [\"day\", \"month\", \"week\", \"year\"].indexOf(this.baseInterval.timeUnit) == -1);\r\n }\r\n else {\r\n var dateFormat = this.dateFormats.getKey(this.baseInterval.timeUnit);\r\n if (dateFormat) {\r\n text = this._df.format(date, dateFormat);\r\n }\r\n else {\r\n text = this.getPositionLabel(position);\r\n }\r\n }\r\n if (!this._adapterO) {\r\n return text;\r\n }\r\n else {\r\n return this._adapterO.apply(\"getTooltipText\", text);\r\n }\r\n };\r\n /**\r\n * Takes an absolute position within axis and adjust it to a specific position within base interval. (cell)\r\n *\r\n * @ignore Exclude from docs\r\n * @param position Source position\r\n * @param location Location in the cell\r\n * @return Adjusted position\r\n */\r\n DateAxis.prototype.roundPosition = function (position, location, axisLocation) {\r\n var baseInterval = this.baseInterval;\r\n var timeUnit = baseInterval.timeUnit;\r\n var count = baseInterval.count;\r\n var date = this.positionToDate(position);\r\n $time.round(date, timeUnit, count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n if (location > 0) {\r\n $time.add(date, timeUnit, location * count, this._df.utc);\r\n }\r\n if (axisLocation > 0 && axisLocation < 1) {\r\n date.setTime(date.getTime() + this.baseDuration * axisLocation);\r\n }\r\n if (this.isInBreak(date.getTime())) {\r\n while (date.getTime() < this.max) {\r\n $time.add(date, timeUnit, count, this._df.utc);\r\n if (!this.isInBreak(date.getTime())) {\r\n break;\r\n }\r\n }\r\n }\r\n return this.dateToPosition(date);\r\n };\r\n /**\r\n * Returns an relative position of the start of the cell (period), that specific position value falls into.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param position Relative position\r\n * @return Cell start relative position\r\n */\r\n DateAxis.prototype.getCellStartPosition = function (position) {\r\n return this.roundPosition(position, 0);\r\n };\r\n /**\r\n * Returns an relative position of the end of the cell (period), that specific position value falls into.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param position Relative position\r\n * @return Cell end relative position\r\n */\r\n DateAxis.prototype.getCellEndPosition = function (position) {\r\n return this.roundPosition(position, 1);\r\n //return this.dateToPosition($time.add(this.positionToDate(this.roundPosition(position, 1)), this.baseInterval.timeUnit, this.baseInterval.count));\r\n };\r\n /**\r\n * Returns a Series data item that corresponds to the specific pixel position\r\n * of the Axis.\r\n *\r\n * If `findNearest` (third parameter) is set to `true`, the method will try\r\n * to locate nearest available data item if none is found directly under\r\n * `position`.\r\n *\r\n * @param series Series\r\n * @param position Position (px)\r\n * @param findNearest Should axis try to find nearest tooltip if there is no data item at exact position\r\n * @return Data item\r\n */\r\n DateAxis.prototype.getSeriesDataItem = function (series, position, findNearest) {\r\n var value = this.positionToValue(position);\r\n var location = 0.5;\r\n if (this.axisLetter == \"Y\") {\r\n location = series.dataItems.template.locations.dateY;\r\n }\r\n else {\r\n location = series.dataItems.template.locations.dateX;\r\n }\r\n var deltaValue = value - location * this.baseDuration;\r\n var date = $time.round(new Date(value), this.baseInterval.timeUnit, this.baseInterval.count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n var nextDate = $time.round(new Date(value + this.baseDuration), this.baseInterval.timeUnit, this.baseInterval.count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n if (nextDate.getTime() > date.getTime()) {\r\n if (Math.abs(nextDate.getTime() - deltaValue) < Math.abs(deltaValue - date.getTime())) {\r\n date = nextDate;\r\n }\r\n }\r\n var dataItemsByAxis = series.dataItemsByAxis.getKey(this.uid);\r\n var dataItem = dataItemsByAxis.getKey(date.getTime() + series.currentDataSetId);\r\n // todo: alternatively we can find closiest here\r\n if (!dataItem && findNearest) {\r\n var key_1;\r\n if (this.axisLetter == \"Y\") {\r\n key_1 = \"dateY\";\r\n }\r\n else {\r\n key_1 = \"dateX\";\r\n }\r\n dataItem = series.dataItems.getIndex(series.dataItems.findClosestIndex(date.getTime(), function (x) {\r\n if (x[key_1]) {\r\n return x[key_1].getTime();\r\n }\r\n else {\r\n return -Infinity;\r\n }\r\n }, \"any\"));\r\n }\r\n return dataItem;\r\n };\r\n /**\r\n * Returns a formatted date based on position in axis scale.\r\n *\r\n * Please note that `position` represents position within axis which may be\r\n * zoomed and not correspond to Cursor's `position`.\r\n *\r\n * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n * @param position Relative position on axis (0-1)\r\n * @return Position label\r\n */\r\n DateAxis.prototype.getPositionLabel = function (position) {\r\n // @todo Better format recognition\r\n var date = this.positionToDate(position);\r\n return this._df.format(date, this.getCurrentLabelFormat());\r\n };\r\n /**\r\n * Returns label date format based on currently used time units\r\n *\r\n * @return Format\r\n */\r\n DateAxis.prototype.getCurrentLabelFormat = function () {\r\n return this.dateFormats.getKey(this._gridInterval ? this._gridInterval.timeUnit : \"day\");\r\n };\r\n /**\r\n * Initializes an Axis renderer.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n DateAxis.prototype.initRenderer = function () {\r\n _super.prototype.initRenderer.call(this);\r\n var renderer = this.renderer;\r\n if (renderer) {\r\n // Set defaults\r\n renderer.ticks.template.location = 0;\r\n renderer.grid.template.location = 0;\r\n renderer.labels.template.location = 0;\r\n renderer.baseGrid.disabled = true;\r\n }\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"basePoint\", {\r\n /**\r\n * Coordinates of the actual axis start.\r\n *\r\n * @ignore Exclude from docs\r\n * @return Base point\r\n */\r\n get: function () {\r\n return { x: 0, y: 0 };\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.animateMinMax = function (min, max) {\r\n var _this = this;\r\n var animation = this.animate([{ property: \"_minAdjusted\", from: this._minAdjusted, to: min }, { property: \"_maxAdjusted\", from: this._maxAdjusted, to: max }], this.rangeChangeDuration, this.rangeChangeEasing);\r\n animation.events.on(\"animationprogress\", function () {\r\n _this.dispatch(\"extremeschanged\");\r\n });\r\n return animation;\r\n };\r\n /**\r\n * Invalidates axis data items when series extremes change\r\n */\r\n DateAxis.prototype.handleExtremesChange = function () {\r\n _super.prototype.handleExtremesChange.call(this);\r\n if (this.groupData) {\r\n var id = this.baseInterval.timeUnit + this.baseInterval.count;\r\n this.groupMin[id] = this._finalMin;\r\n this.groupMax[id] = this._finalMax;\r\n }\r\n };\r\n /**\r\n * Zooms axis to specific Dates.\r\n *\r\n * @param startDate Start date\r\n * @param endValue End date\r\n * @param skipRangeEvent Do not invoke events\r\n * @param instantly Do not play zoom animations\r\n */\r\n DateAxis.prototype.zoomToDates = function (startDate, endDate, skipRangeEvent, instantly, adjust) {\r\n startDate = this._df.parse(startDate);\r\n endDate = this._df.parse(endDate);\r\n this.zoomToValues(startDate.getTime(), endDate.getTime(), skipRangeEvent, instantly, adjust);\r\n };\r\n /**\r\n * Zooms axis to specific values.\r\n *\r\n * @param startValue Start value\r\n * @param endValue End value\r\n * @param skipRangeEvent Do not invoke events\r\n * @param instantly Do not play zoom animations\r\n */\r\n DateAxis.prototype.zoomToValues = function (startValue, endValue, skipRangeEvent, instantly, adjust) {\r\n var _this = this;\r\n if (!this.groupData) {\r\n //let start: number = (startValue - this.min) / (this.max - this.min);\r\n //let end: number = (endValue - this.min) / (this.max - this.min);\r\n var start = this.valueToPosition(startValue);\r\n var end = this.valueToPosition(endValue);\r\n this.zoom({ start: start, end: end }, skipRangeEvent, instantly);\r\n }\r\n else {\r\n var difference = this.adjustDifference(startValue, endValue);\r\n var isEnd = false;\r\n if (endValue == this.max) {\r\n isEnd = true;\r\n }\r\n var isStart = false;\r\n if (startValue == this.min) {\r\n isStart = true;\r\n }\r\n if ($type.hasValue(difference)) {\r\n var mainBaseInterval = this.mainBaseInterval;\r\n var groupInterval_1 = this.chooseInterval(0, difference, this.groupCount, this.groupIntervals);\r\n if ((groupInterval_1.timeUnit == mainBaseInterval.timeUnit && groupInterval_1.count < mainBaseInterval.count) || $time.getDuration(groupInterval_1.timeUnit, 1) < $time.getDuration(mainBaseInterval.timeUnit, 1)) {\r\n groupInterval_1 = __assign({}, mainBaseInterval);\r\n }\r\n var id = groupInterval_1.timeUnit + groupInterval_1.count;\r\n var min_1 = this.groupMin[id];\r\n var max_1 = this.groupMax[id];\r\n if (!$type.isNumber(min_1) || !$type.isNumber(max_1)) {\r\n min_1 = Number.POSITIVE_INFINITY;\r\n max_1 = Number.NEGATIVE_INFINITY;\r\n this.series.each(function (series) {\r\n var seriesMin = series.min(_this);\r\n var seriesMax = series.max(_this);\r\n if (series._dataSets) {\r\n var ds = series._dataSets.getKey(groupInterval_1.timeUnit + groupInterval_1.count);\r\n if (ds) {\r\n var mindi = ds.getIndex(0);\r\n var maxdi = ds.getIndex(ds.length - 1);\r\n if (mindi) {\r\n if (series.xAxis == _this) {\r\n seriesMin = mindi.dateX.getTime();\r\n }\r\n else if (series.yAxis == _this) {\r\n seriesMin = mindi.dateY.getTime();\r\n }\r\n }\r\n if (maxdi) {\r\n if (series.xAxis == _this) {\r\n seriesMax = maxdi.dateX.getTime();\r\n }\r\n else if (series.yAxis == _this) {\r\n seriesMax = maxdi.dateY.getTime();\r\n }\r\n }\r\n }\r\n }\r\n seriesMax = $time.round($time.add(new Date(seriesMax), groupInterval_1.timeUnit, 1, _this._df.utc), groupInterval_1.timeUnit, 1, _this._df.firstDayOfWeek, _this._df.utc, undefined, _this._df.timezoneMinutes, _this._df.timezone).getTime();\r\n if (seriesMin < min_1) {\r\n min_1 = seriesMin;\r\n }\r\n if (seriesMax > max_1) {\r\n max_1 = seriesMax;\r\n }\r\n });\r\n this.groupMin[id] = min_1;\r\n this.groupMax[id] = max_1;\r\n }\r\n startValue = $math.fitToRange(startValue, min_1, max_1);\r\n endValue = $math.fitToRange(endValue, min_1, max_1);\r\n if (adjust) {\r\n if (isEnd) {\r\n startValue = endValue - difference;\r\n startValue = $math.fitToRange(startValue, min_1, max_1);\r\n }\r\n if (isStart) {\r\n endValue = startValue + difference;\r\n endValue = $math.fitToRange(endValue, min_1, max_1);\r\n }\r\n }\r\n var start = (startValue - min_1) / (max_1 - min_1);\r\n var end = (endValue - min_1) / (max_1 - min_1);\r\n this.zoom({ start: start, end: end }, skipRangeEvent, instantly);\r\n }\r\n }\r\n };\r\n /**\r\n * Adds `baseInterval` to \"as is\" fields.\r\n *\r\n * @param field Field name\r\n * @return Assign as is?\r\n */\r\n DateAxis.prototype.asIs = function (field) {\r\n return field == \"baseInterval\" || _super.prototype.asIs.call(this, field);\r\n };\r\n /**\r\n * Copies all properties and related data from a different instance of Axis.\r\n *\r\n * @param source Source Axis\r\n */\r\n DateAxis.prototype.copyFrom = function (source) {\r\n var _this = this;\r\n _super.prototype.copyFrom.call(this, source);\r\n this.dateFormats = source.dateFormats;\r\n this.periodChangeDateFormats = source.periodChangeDateFormats;\r\n this.groupIntervals.clear();\r\n source.groupIntervals.each(function (interval) {\r\n _this.groupIntervals.push(__assign({}, interval));\r\n });\r\n this.gridIntervals.clear();\r\n source.gridIntervals.each(function (interval) {\r\n _this.gridIntervals.push(__assign({}, interval));\r\n });\r\n if (source._baseInterval) {\r\n this.baseInterval = source._baseInterval;\r\n }\r\n };\r\n /**\r\n * Shows Axis tooltip at specific relative position within Axis. (0-1)\r\n *\r\n * @param position Position (0-1)\r\n * @param local or global position\r\n */\r\n DateAxis.prototype.showTooltipAtPosition = function (position, local) {\r\n var _this = this;\r\n if (!local) {\r\n position = this.toAxisPosition(position);\r\n }\r\n if (this.snapTooltip) {\r\n // rounding is not good, pen/aac4e7f66f019d36b2447f050c600c13 (no last tootltip shown)\r\n var actualDate = this.positionToDate(position); //$time.round(this.positionToDate(position), this.baseInterval.timeUnit, 1, this.getFirstWeekDay(), this.dateFormatter.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n var actualTime_1 = actualDate.getTime();\r\n var closestDate_1;\r\n this.series.each(function (series) {\r\n if (series.baseAxis == _this) {\r\n var dataItem = _this.getSeriesDataItem(series, position, true);\r\n if (dataItem) {\r\n var date = void 0;\r\n if (series.xAxis == _this) {\r\n date = dataItem.dateX;\r\n }\r\n if (series.yAxis == _this) {\r\n date = dataItem.dateY;\r\n }\r\n if (!closestDate_1) {\r\n closestDate_1 = date;\r\n }\r\n else {\r\n if (Math.abs(closestDate_1.getTime() - actualTime_1) > Math.abs(date.getTime() - actualTime_1)) {\r\n closestDate_1 = date;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n if (closestDate_1) {\r\n var closestTime_1 = closestDate_1.getTime();\r\n closestDate_1 = $time.round(new Date(closestTime_1), this.baseInterval.timeUnit, this.baseInterval.count, this._firstWeekDay, this._df.utc, undefined, this._df.timezoneMinutes, this._df.timezone);\r\n closestTime_1 = closestDate_1.getTime();\r\n var tooltipLocation = this.renderer.tooltipLocation;\r\n if (tooltipLocation == 0) {\r\n tooltipLocation = 0.0001;\r\n }\r\n closestDate_1 = new Date(closestDate_1.getTime() + this.baseDuration * tooltipLocation);\r\n position = this.dateToPosition(closestDate_1);\r\n if (this.chart.cursor && this.chart.cursor.snapToSeries) {\r\n //void\r\n }\r\n else {\r\n this.series.each(function (series) {\r\n var dataItem = series.dataItemsByAxis.getKey(_this.uid).getKey(closestTime_1 + series.currentDataSetId);\r\n var point = series.showTooltipAtDataItem(dataItem);\r\n if (point) {\r\n _this.chart._seriesPoints.push({ series: series, point: point });\r\n }\r\n else {\r\n // check, otherwise column tooltip will be hidden\r\n if (series.tooltipText || series.tooltipHTML) {\r\n series.hideTooltip();\r\n }\r\n }\r\n });\r\n }\r\n //this.chart.sortSeriesTooltips(seriesPoints);\r\n }\r\n }\r\n _super.prototype.showTooltipAtPosition.call(this, position, true);\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"snapTooltip\", {\r\n /**\r\n * @return Should snap?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"snapTooltip\");\r\n },\r\n /**\r\n * Should the nearest tooltip be shown if no data item is found on the\r\n * current cursor position.\r\n *\r\n * @default true\r\n * @param value Should snap?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"snapTooltip\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"groupData\", {\r\n /**\r\n * @return Group data points?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"groupData\");\r\n },\r\n /**\r\n * Indicates if data should be aggregated to composide data items if there\r\n * are more data items in selected range than `groupCount`.\r\n *\r\n * Grouping will occur automatically, based on current selection range, and\r\n * will change dynamically when user zooms in/out the chart.\r\n *\r\n * NOTE: This works only if [[DateAxis]] is base axis of an [[XYSeries]].\r\n *\r\n * The related [[XYSeries]] also needs to be set up to take advantage of, by\r\n * setting its [`groupFields`](https://www.amcharts.com/docs/v4/reference/xyseries/#groupFields_property).\r\n *\r\n * The group intervals to aggregate data to is defined by `groupIntervals`\r\n * property.\r\n *\r\n * ```TypeScript\r\n * let dateAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n * dateAxis.groupData = true;\r\n *\r\n * let valueAxis = chart.xAxes.push(new am4charts.valueAxis());\r\n *\r\n * let series = chart.series.push(new am4charts.LineSeries());\r\n * series.dataFields.dateX = \"date\";\r\n * series.dataFields.valueY = \"value\";\r\n * series.groupFields.valueY = \"average\";\r\n * ```\r\n * ```JavaScript\r\n * var dateAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n * dateAxis.groupData = true;\r\n *\r\n * var valueAxis = chart.xAxes.push(new am4charts.valueAxis());\r\n *\r\n * var series = chart.series.push(new am4charts.LineSeries());\r\n * series.dataFields.dateX = \"date\";\r\n * series.dataFields.valueY = \"value\";\r\n * series.groupFields.valueY = \"average\";\r\n * ```\r\n * ```JSON\r\n * {\r\n * // ...\r\n * \"xAxes\": [{\r\n * \"type\": \"DateAxis\",\r\n * \"groupData\": true\r\n * }],\r\n * \"yAxes\": [{\r\n * \"type\": \"ValueAxis\"\r\n * }],\r\n * \"series\": [{\r\n * \"type\": \"LineSeries\",\r\n * \"dataFields\": {\r\n * \"dateX\": \"date\",\r\n * \"valueY\": \"value\"\r\n * },\r\n * \"groupFields\": {\r\n * \"valueY\": \"average\"\r\n * }\r\n * }]\r\n * }\r\n * ```\r\n *\r\n * @default false\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/axes/date-axis/#Dynamic_data_item_grouping} for more information about dynamic data item grouping.\r\n * @since 4.7.0\r\n * @param value Group data points?\r\n */\r\n set: function (value) {\r\n var _this = this;\r\n if (this.setPropertyValue(\"groupData\", value)) {\r\n this.series.each(function (series) {\r\n series.setDataSet(\"\");\r\n if (value && !series.dataGrouped && series.inited) {\r\n series._baseInterval[_this.uid] = _this.mainBaseInterval;\r\n _this.groupSeriesData(series);\r\n }\r\n });\r\n this._currentDataSetId = \"\";\r\n this._groupInterval = undefined;\r\n this.invalidate();\r\n this.invalidateSeries();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"groupInterval\", {\r\n /**\r\n * @return Interval\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"groupInterval\");\r\n },\r\n /**\r\n * Disables automatic selection of data grouping intervals and always uses\r\n * `groupInterval` if set. Works only if `groupData = true`.\r\n *\r\n * @since 4.9.24\r\n * @param value Interval\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"groupInterval\", value)) {\r\n this.invalidate();\r\n this.invalidateSeries();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"groupCount\", {\r\n /**\r\n * @return Number of data items\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"groupCount\");\r\n },\r\n /**\r\n * Indicates threshold of data items in selected range at which to start\r\n * aggregating data items if `groupData = true`.\r\n *\r\n * @default 200\r\n * @since 4.7.0\r\n * @param value Number of data items\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"groupCount\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"timezoneOffset\", {\r\n /**\r\n * @todo Timezone offset in minutes\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"timezoneOffset\");\r\n },\r\n /**\r\n * If set will recalculate all timestamps in data by applying specific offset\r\n * in minutes.\r\n *\r\n * IMPORTANT: do not set `timezoneOffset` on both `DateAxis` and `dateFormatter`. It\r\n * will skew your results by applying offset twice.\r\n *\r\n * @since 4.8.5\r\n * @param value Time zone offset in minutes\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"timezoneOffset\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"timezone\", {\r\n /**\r\n * @return Timezone\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"timezone\");\r\n },\r\n /**\r\n * If set will recalculate all timestamps in data to specific named timezone,\r\n * e.g. `\"America/Vancouver\"`, `\"Australia/Sydney\"`, `\"UTC\"`, etc.\r\n *\r\n * IMPORTANT: it is no longer recommended to use this setting. Please\r\n * set`timezone` on `dateFormatter`.\r\n *\r\n * @deprecated\r\n * @since 4.10.1\r\n * @param value Time zone\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"timezone\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxis.prototype, \"gridInterval\", {\r\n /**\r\n * Current grid interval.\r\n *\r\n * @return Grid interval\r\n */\r\n get: function () {\r\n return this._gridInterval;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @ignore\r\n */\r\n DateAxis.prototype.makeGap = function (dataItem, previous) {\r\n var series = dataItem.component;\r\n if (dataItem && previous) {\r\n if (!series.connect && $type.isNumber(series.autoGapCount)) {\r\n if (series.baseAxis == this) {\r\n var date = dataItem.dates[\"date\" + this.axisLetter];\r\n var prevDate = previous.dates[\"date\" + this.axisLetter];\r\n if (date && prevDate) {\r\n var time = date.getTime();\r\n var prevTime = prevDate.getTime();\r\n if (time - prevTime > series.autoGapCount * this.baseDuration) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n Object.defineProperty(DateAxis.prototype, \"baseValue\", {\r\n /**\r\n * @return base value\r\n */\r\n get: function () {\r\n return this.min;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n DateAxis.prototype._saveMinMax = function (min, max) {\r\n var groupInterval = this.groupInterval;\r\n if (!groupInterval) {\r\n groupInterval = this._mainBaseInterval;\r\n }\r\n var id = groupInterval.timeUnit + groupInterval.count;\r\n this._intervalMin[id] = min;\r\n this._intervalMax[id] = max;\r\n };\r\n return DateAxis;\r\n}(ValueAxis));\r\nexport { DateAxis };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DateAxis\"] = DateAxis;\r\nregistry.registeredClasses[\"DateAxisDataItem\"] = DateAxisDataItem;\r\n//# sourceMappingURL=DateAxis.js.map","/**\r\n * DateAxisBreak includes functionality to add breaks on a [[DateAxis]].\r\n *\r\n * A \"break\" can be used to \"cut out\" specific ranges of the axis scale, e.g.\r\n * weekends and holidays out of the Date-based axis.\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ValueAxisBreak } from \"./ValueAxisBreak\";\r\nimport { registry } from \"../../core/Registry\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Class used to define breaks for [[DateAxis]].\r\n *\r\n * A \"break\" can be used to \"cut out\" specific ranges of the axis scale, e.g.\r\n * weekends and holidays out of the Date-based axis.\r\n *\r\n * @see {@link IDateAxisBreakEvents} for a list of available events\r\n * @see {@link IDateAxisBreakAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nvar DateAxisBreak = /** @class */ (function (_super) {\r\n __extends(DateAxisBreak, _super);\r\n /**\r\n * Constructor\r\n */\r\n function DateAxisBreak() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"DateAxisBreak\";\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(DateAxisBreak.prototype, \"startDate\", {\r\n /**\r\n * @return Start date\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"startDate\");\r\n },\r\n /**\r\n * Starting date for the break.\r\n *\r\n * @param value Start date\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"startDate\", value)) {\r\n this.startValue = value.getTime();\r\n if (this.axis) {\r\n this.axis.invalidate();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DateAxisBreak.prototype, \"endDate\", {\r\n /**\r\n * @return End date\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"endDate\");\r\n },\r\n /**\r\n * Ending date for the break.\r\n *\r\n * @param value End date\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"endDate\", value)) {\r\n this.endValue = value.getTime();\r\n if (this.axis) {\r\n this.axis.invalidate();\r\n this.axis.invalidateSeries();\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return DateAxisBreak;\r\n}(ValueAxisBreak));\r\nexport { DateAxisBreak };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DateAxisBreak\"] = DateAxisBreak;\r\n//# sourceMappingURL=DateAxisBreak.js.map","/**\r\n * DurationAxis module\r\n */\r\nimport { __extends, __values } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ValueAxis, ValueAxisDataItem } from \"./ValueAxis\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Defines data item for [[DurationAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nvar DurationAxisDataItem = /** @class */ (function (_super) {\r\n __extends(DurationAxisDataItem, _super);\r\n /**\r\n * Constructor\r\n */\r\n function DurationAxisDataItem() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"DurationAxisDataItem\";\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n return DurationAxisDataItem;\r\n}(ValueAxisDataItem));\r\nexport { DurationAxisDataItem };\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Used to create an axis that shows time durations.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.DurationAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Time\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.DurationAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Time\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"DurationAxis\",\r\n * \"title\": {\r\n * \"text\": \"Time\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/formatters/formatting-duration/} for mor information about duration formatters.\r\n * @see {@link IDurationAxisEvents} for a list of available Events\r\n * @see {@link IDurationAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nvar DurationAxis = /** @class */ (function (_super) {\r\n __extends(DurationAxis, _super);\r\n /**\r\n * Constructor\r\n */\r\n function DurationAxis() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n /**\r\n * A base unit (granularity) of data.\r\n *\r\n * Used to indicate what are the base units of your data.\r\n */\r\n _this._baseUnit = \"second\";\r\n _this.className = \"DurationAxis\";\r\n _this.setPropertyValue(\"maxZoomFactor\", 1000000);\r\n // Apply theme\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n /**\r\n * Formats the value according to axis' own [[DurationFormatter]].\r\n *\r\n * @param value Source value\r\n * @return Formatted value\r\n */\r\n DurationAxis.prototype.formatLabel = function (value, format) {\r\n return this.durationFormatter.format(value, format || this.axisDurationFormat);\r\n };\r\n /**\r\n * Adjusts actual min and max scale values so that the axis starts and ends\r\n * at \"nice\" values, unless `strictMinMax` is set.\r\n *\r\n * The `difference` can be something else than `max - min`, because of the\r\n * axis breaks.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param min [description]\r\n * @param max [description]\r\n * @param difference [description]\r\n * @param gridCount [description]\r\n * @param strictMode [description]\r\n * @return [description]\r\n */\r\n DurationAxis.prototype.adjustMinMax = function (min, max, difference, gridCount, strictMode) {\r\n var e_1, _a;\r\n var minMaxStep;\r\n var timeUnit = this.baseUnit;\r\n // we don't allow to go to smaller units, setting so to avoid invalidation\r\n this.setPropertyValue(\"maxPrecision\", 0);\r\n if (timeUnit == \"millisecond\" || timeUnit == \"second\" || timeUnit == \"minute\" || timeUnit == \"hour\") {\r\n // will fail if 0\r\n if (gridCount <= 1) {\r\n gridCount = 1;\r\n }\r\n gridCount = Math.round(gridCount);\r\n var initialMin = min;\r\n var initialMax = max;\r\n // in case min and max is the same, use max\r\n if (difference === 0) {\r\n difference = Math.abs(max);\r\n }\r\n var step = difference / gridCount;\r\n var divisors = [60, 30, 20, 15, 10, 2, 1];\r\n var realDivisor = 1;\r\n if (timeUnit == \"hour\") {\r\n divisors = [24, 12, 6, 4, 2, 1];\r\n }\r\n try {\r\n for (var divisors_1 = __values(divisors), divisors_1_1 = divisors_1.next(); !divisors_1_1.done; divisors_1_1 = divisors_1.next()) {\r\n var divisor = divisors_1_1.value;\r\n if (difference / divisor > gridCount) {\r\n realDivisor = divisor;\r\n break;\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (divisors_1_1 && !divisors_1_1.done && (_a = divisors_1.return)) _a.call(divisors_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n var count = Math.ceil(((max - min) / realDivisor) / gridCount);\r\n var exponent = Math.log(Math.abs(count)) * Math.LOG10E;\r\n var power = Math.pow(10, Math.floor(exponent)) / 10;\r\n var reducedCount = count / power;\r\n // find closest to divisor\r\n var closest = $math.closest(divisors, reducedCount);\r\n count = closest * power;\r\n step = realDivisor * count;\r\n // TODO can this be removed ?\r\n this.durationFormatter.getValueUnit(step, this.baseUnit);\r\n min = Math.floor(min / step) * step;\r\n max = Math.ceil(max / step) * step;\r\n if (strictMode) {\r\n min -= step;\r\n if (min < 0 && initialMin >= 0) {\r\n min = 0;\r\n }\r\n max += step;\r\n if (max > 0 && initialMax <= 0) {\r\n max = 0;\r\n }\r\n }\r\n minMaxStep = { min: min, max: max, step: step };\r\n }\r\n else {\r\n minMaxStep = _super.prototype.adjustMinMax.call(this, min, max, difference, gridCount, strictMode);\r\n }\r\n // choose duration formatter based on step\r\n this.axisDurationFormat = this.durationFormatter.getFormat(minMaxStep.step, minMaxStep.max, this.baseUnit);\r\n return minMaxStep;\r\n };\r\n Object.defineProperty(DurationAxis.prototype, \"tooltipDurationFormat\", {\r\n /**\r\n * @return Duration format for axis labels\r\n */\r\n get: function () {\r\n return this._tooltipDurationFormat;\r\n },\r\n /**\r\n * A special duration format to apply axis tooltips.\r\n *\r\n * Will use same format as for labels, if not set.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/formatters/formatting-duration/} for mor information.\r\n * @param value Duration format for axis labels\r\n */\r\n set: function (value) {\r\n this._tooltipDurationFormat = value;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Returns text to show in a axis tooltip, based on specific position within\r\n * axis.\r\n *\r\n * The label will be formatted as per [[NumberFormatter]] set for the whole\r\n * chart, or explicitly for this Axis.\r\n *\r\n * @ignore Exclude from docs\r\n * @param position Position (px)\r\n * @return Label (numeric value)\r\n */\r\n DurationAxis.prototype.getTooltipText = function (position) {\r\n var value = $math.round(this.positionToValue(position), this._stepDecimalPlaces);\r\n var valueStr = this.formatLabel(value, this.tooltipDurationFormat);\r\n if (!this._adapterO) {\r\n return valueStr;\r\n }\r\n else {\r\n return this._adapterO.apply(\"getTooltipText\", valueStr);\r\n }\r\n };\r\n Object.defineProperty(DurationAxis.prototype, \"baseUnit\", {\r\n /**\r\n * @return Base unit\r\n */\r\n get: function () {\r\n return this._baseUnit;\r\n },\r\n /**\r\n * A base unit (granularity) of data.\r\n *\r\n * Used to indicate what are the base units of your data.\r\n *\r\n * Available options: \"millisecond\", \"second\" (default), \"minute\", \"hour\",\r\n * \"day\", \"week\", \"month\", \"year\".\r\n *\r\n * @default \"second\"\r\n * @param timeUnit\r\n */\r\n set: function (timeUnit) {\r\n if (this._baseUnit != timeUnit) {\r\n this._baseUnit = timeUnit;\r\n this.durationFormatter.baseUnit = timeUnit;\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Copies all properties and related data from a different instance of Axis.\r\n *\r\n * @param source Source Axis\r\n */\r\n DurationAxis.prototype.copyFrom = function (source) {\r\n _super.prototype.copyFrom.call(this, source);\r\n this.baseUnit = source.baseUnit;\r\n };\r\n return DurationAxis;\r\n}(ValueAxis));\r\nexport { DurationAxis };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DurationAxis\"] = DurationAxis;\r\nregistry.registeredClasses[\"DurationAxisDataItem\"] = DurationAxisDataItem;\r\n//# sourceMappingURL=DurationAxis.js.map","/**\r\n * A module defining functionality for axis grid elements.\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { color } from \"../../core/utils/Color\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport { defaultRules, ResponsiveBreakpoints } from \"../../core/utils/Responsive\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Displays an axis grid line.\r\n *\r\n * @see {@link IGridEvents} for a list of available events\r\n * @see {@link IGridAdapters} for a list of available Adapters\r\n * @todo Review: container is better, as we'll be able to attach something to the grid, also with 3d charts we might need some additional elements\r\n * @important\r\n */\r\nvar Grid = /** @class */ (function (_super) {\r\n __extends(Grid, _super);\r\n /**\r\n * Constructor\r\n */\r\n function Grid() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"Grid\";\r\n _this.element = _this.paper.add(\"path\");\r\n _this.location = 0.5;\r\n _this.isMeasured = false;\r\n _this.above = false;\r\n var interfaceColors = new InterfaceColorSet();\r\n _this.stroke = interfaceColors.getFor(\"grid\");\r\n _this.pixelPerfect = true;\r\n _this.strokeOpacity = 0.15;\r\n _this.fill = color(); // \"none\";\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(Grid.prototype, \"location\", {\r\n /**\r\n * @return Location (0-1)\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"location\");\r\n },\r\n /**\r\n * Location within axis cell to place grid line on.\r\n *\r\n * * 0 - start\r\n * * 0.5 - middle\r\n * * 1 - end\r\n *\r\n * @param value Location (0-1)\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"location\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Grid.prototype, \"above\", {\r\n /**\r\n * @return Draw above series?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"above\");\r\n },\r\n /**\r\n * Normally fill goes below series. Set this to `true` to go above.\r\n *\r\n * @default false\r\n * @since 4.5.9\r\n * @param value Draw above series?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"above\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @ignore\r\n */\r\n Grid.prototype.setDisabled = function (value) {\r\n var changed = _super.prototype.setDisabled.call(this, value);\r\n if (this.axis) {\r\n this.axis.invalidateDataItems();\r\n }\r\n return changed;\r\n };\r\n return Grid;\r\n}(Sprite));\r\nexport { Grid };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"Grid\"] = Grid;\r\n/**\r\n * Add default responsive rules\r\n */\r\n/**\r\n * Disable grid on smaller charts\r\n */\r\ndefaultRules.push({\r\n relevant: ResponsiveBreakpoints.maybeXS,\r\n state: function (target, stateId) {\r\n if (target instanceof Grid) {\r\n var state = target.states.create(stateId);\r\n state.properties.disabled = true;\r\n return state;\r\n }\r\n return null;\r\n }\r\n});\r\n//# sourceMappingURL=Grid.js.map","/**\r\n * A module defining functionality for circular axis grid elements.\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Grid } from \"./Grid\";\r\nimport { registry } from \"../../core/Registry\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Creates a circular grid element for circular-type axis.\r\n *\r\n * @see {@link IGridCircularEvents} for a list of available events\r\n * @see {@link IGridCircularAdapters} for a list of available Adapters\r\n * @todo Review: container is better, as we'll be able to attach something to the GridCircular, also with 3d charts we might need some additional elements\r\n */\r\nvar GridCircular = /** @class */ (function (_super) {\r\n __extends(GridCircular, _super);\r\n /**\r\n * Constructor\r\n */\r\n function GridCircular() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"GridCircular\";\r\n _this.pixelPerfect = false;\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(GridCircular.prototype, \"innerRadius\", {\r\n /**\r\n * @return Inner radius\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"innerRadius\");\r\n },\r\n /**\r\n * Inner radius of the circular grid. (absolute or relative)\r\n *\r\n * @param value Inner radius\r\n */\r\n set: function (value) {\r\n this.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(GridCircular.prototype, \"radius\", {\r\n /**\r\n * @return Outer radius\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"radius\");\r\n },\r\n /**\r\n * Outer radius of the circular grid. (absolute or relative)\r\n *\r\n * @param value Outer radius\r\n */\r\n set: function (value) {\r\n this.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return GridCircular;\r\n}(Grid));\r\nexport { GridCircular };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"GridCircular\"] = GridCircular;\r\n//# sourceMappingURL=GridCircular.js.map","/**\r\n * Value Axis module\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Axis, AxisDataItem } from \"./Axis\";\r\nimport { AxisRendererY } from \"./AxisRendererY\";\r\nimport { MultiDisposer } from \"../../core/utils/Disposer\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { ValueAxisBreak } from \"./ValueAxisBreak\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Defines a [[DataItem]] for [[ValueAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nvar ValueAxisDataItem = /** @class */ (function (_super) {\r\n __extends(ValueAxisDataItem, _super);\r\n /**\r\n * Constructor\r\n */\r\n function ValueAxisDataItem() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"ValueAxisDataItem\";\r\n _this.values.value = {};\r\n _this.values.endValue = {};\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(ValueAxisDataItem.prototype, \"value\", {\r\n /**\r\n * @return Value\r\n */\r\n get: function () {\r\n return this.values[\"value\"].value;\r\n },\r\n /**\r\n * A data point's numeric value.\r\n *\r\n * @param value Value\r\n */\r\n set: function (value) {\r\n this.setValue(\"value\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxisDataItem.prototype, \"endValue\", {\r\n /**\r\n * @return Value\r\n */\r\n get: function () {\r\n return this.values[\"endValue\"].value;\r\n },\r\n /**\r\n * Data point's numeric end value.\r\n *\r\n * @param value End value\r\n */\r\n set: function (value) {\r\n this.setValue(\"endValue\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return ValueAxisDataItem;\r\n}(AxisDataItem));\r\nexport { ValueAxisDataItem };\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Used to create a value axis for the chart.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let valueAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Monthly Sales\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Monthly Sales\";\r\n * ```\r\n * ```JSON\r\n * \"yAxes\": [{\r\n * \"type\": \"ValueAxis\",\r\n * \"title\": {\r\n * \"text\": \"Monthly Sales\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link IValueAxisEvents} for a list of available Events\r\n * @see {@link IValueAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nvar ValueAxis = /** @class */ (function (_super) {\r\n __extends(ValueAxis, _super);\r\n /**\r\n * Constructor\r\n */\r\n function ValueAxis() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n /**\r\n * [_stepDecimalPlaces description]\r\n *\r\n * @todo Description\r\n */\r\n _this._stepDecimalPlaces = 0;\r\n _this._prevStepDecimalPlaces = 0;\r\n _this._adjustLabelPrecision = true;\r\n /**\r\n * Base value for the axis.\r\n */\r\n _this._baseValue = 0;\r\n /**\r\n * Adjusted start in case we have breaks.\r\n *\r\n * @todo Description\r\n */\r\n _this._adjustedStart = 0;\r\n /**\r\n * Adjusted end in case we have breaks.\r\n *\r\n * @todo Description\r\n */\r\n _this._adjustedEnd = 1;\r\n _this._extremesChanged = false;\r\n _this._deltaMinMax = 1;\r\n _this._dsc = false;\r\n /**\r\n * As calculating totals is expensive operation and not often needed, we\r\n * don't do it by default.\r\n *\r\n * In case you use `totalPercent` or `total` in your charts, this must be set\r\n * to `true`.\r\n *\r\n * @default false\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/xy-chart/#100_stacks} For using `calculateTotals` for 100% stacked series.\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/formatters/formatting-strings/#Placeholders_for_numeric_values} For using `calculateTotals` in labels.\r\n */\r\n _this.calculateTotals = false;\r\n _this.className = \"ValueAxis\";\r\n // Set field name\r\n _this.axisFieldName = \"value\";\r\n // Set defaults\r\n _this.setPropertyValue(\"maxZoomFactor\", 1000);\r\n _this.setPropertyValue(\"extraMin\", 0);\r\n _this.setPropertyValue(\"extraMax\", 0);\r\n _this.setPropertyValue(\"strictMinMax\", false);\r\n _this.setPropertyValue(\"maxPrecision\", Number.MAX_VALUE);\r\n _this.setPropertyValue(\"adjustLabelPrecision\", true);\r\n _this.setPropertyValue(\"extraTooltipPrecision\", 0);\r\n _this.keepSelection = false;\r\n _this.includeRangesInMinMax = false;\r\n // Apply theme\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n /**\r\n * Holds reference to a function that accepts a DataItem as parameter.\r\n *\r\n * It can either return a fill opacity for a fill, or manipulate data item\r\n * directly, to create various highlighting scenarios.\r\n */\r\n ValueAxis.prototype.fillRule = function (dataItem) {\r\n var value = dataItem.value;\r\n var axis = dataItem.component;\r\n if (!dataItem.axisFill.disabled) {\r\n // rounding in left to solve floating point number\r\n if ($math.round(value / axis.step / 2, 5) == Math.round(value / axis.step / 2)) {\r\n dataItem.axisFill.__disabled = true;\r\n }\r\n else {\r\n dataItem.axisFill.__disabled = false;\r\n }\r\n }\r\n };\r\n /**\r\n * Returns a new/empty [[DataItem]] of the type appropriate for this object.\r\n *\r\n * @see {@link DataItem}\r\n * @return Data Item\r\n */\r\n ValueAxis.prototype.createDataItem = function () {\r\n return new ValueAxisDataItem();\r\n };\r\n /**\r\n * Returns a new/empty [[AxisBreak]] of the appropriate type.\r\n *\r\n * @return Axis break\r\n */\r\n ValueAxis.prototype.createAxisBreak = function () {\r\n return new ValueAxisBreak();\r\n };\r\n /**\r\n * [dataChangeUpdate description]\r\n *\r\n * This is a placeholder to override for extending classes.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n */\r\n ValueAxis.prototype.dataChangeUpdate = function () {\r\n this.clearCache();\r\n if (!this.keepSelection) {\r\n if (this._start != 0 || this._end != 1) {\r\n this._start = 0;\r\n this._end = 1;\r\n this.dispatchImmediately(\"startendchanged\");\r\n }\r\n }\r\n else {\r\n if (this._start != 0) {\r\n this.dispatchImmediately(\"startchanged\");\r\n }\r\n if (this._end != 1) {\r\n this.dispatchImmediately(\"endchanged\");\r\n }\r\n if (this._start != 0 || this._end != 1) {\r\n this.dispatchImmediately(\"startendchanged\");\r\n }\r\n }\r\n this._maxZoomed = this._maxDefined;\r\n this._minZoomed = this._minDefined;\r\n this._maxAdjusted = this._maxDefined;\r\n this._minAdjusted = this._minDefined;\r\n };\r\n /**\r\n * Processes data items of the related Series.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n ValueAxis.prototype.processSeriesDataItems = function () {\r\n // @todo: add some boolean (maybe autodedect) if we need these calculations or not. this place uses a lot of cpu\r\n if (this.calculateTotals) {\r\n var series = this.series.getIndex(0);\r\n var startIndex = series.startIndex;\r\n if (series.dataItems.length > 0) {\r\n if (startIndex > 0) {\r\n startIndex--;\r\n }\r\n var endIndex = series.endIndex;\r\n if (endIndex < series.dataItems.length) {\r\n endIndex++;\r\n }\r\n var _loop_1 = function (i) {\r\n // This has to be `var` in order to avoid garbage collection\r\n var total = {};\r\n var sum = {};\r\n this_1.series.each(function (series) {\r\n if (!series.excludeFromTotal) {\r\n var dataItem_1 = series.dataItems.getIndex(i);\r\n if (dataItem_1) {\r\n $object.each(dataItem_1.values, function (key) {\r\n var value = dataItem_1.values[key].workingValue; // can not use getWorkingValue here!\r\n if ($type.isNumber(value)) {\r\n if (!$type.isNumber(total[key])) {\r\n total[key] = Math.abs(value);\r\n }\r\n else {\r\n total[key] += Math.abs(value);\r\n }\r\n if (!$type.isNumber(sum[key])) {\r\n sum[key] = value;\r\n }\r\n else {\r\n sum[key] += value;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n });\r\n this_1.series.each(function (series) {\r\n if (!series.excludeFromTotal) {\r\n var dataItem_2 = series.dataItems.getIndex(i);\r\n if (dataItem_2) {\r\n $object.each(dataItem_2.values, function (key) {\r\n var value = dataItem_2.values[key].workingValue; // can not use getWorkingValue here!\r\n if ($type.isNumber(value)) {\r\n dataItem_2.setCalculatedValue(key, total[key], \"total\");\r\n dataItem_2.setCalculatedValue(key, 100 * value / total[key], \"totalPercent\");\r\n dataItem_2.setCalculatedValue(key, sum[key], \"sum\");\r\n }\r\n });\r\n }\r\n }\r\n });\r\n };\r\n var this_1 = this;\r\n // This has to be `var` in order to avoid garbage collection\r\n for (var i = startIndex; i < endIndex; ++i) {\r\n _loop_1(i);\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Validates the whole axis. Causes it to redraw.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n */\r\n ValueAxis.prototype.validate = function () {\r\n if (this.axisLength <= 0) {\r\n return;\r\n }\r\n _super.prototype.validate.call(this);\r\n this.getMinMax();\r\n if (!$type.isNumber(this._minAdjusted)) {\r\n this.dataItems.each(function (dataItem) {\r\n dataItem.value = null;\r\n });\r\n }\r\n this.fixAxisBreaks();\r\n this.calculateZoom();\r\n this.validateAxisElements();\r\n this.validateAxisRanges();\r\n this.validateBreaks();\r\n this.hideUnusedDataItems();\r\n this.renderer.invalidateLayout();\r\n // hide too close\r\n //this.hideTooCloseDataItems();\r\n };\r\n /**\r\n * Calculates all positions, related to axis as per current zoom.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n ValueAxis.prototype.calculateZoom = function () {\r\n if ($type.isNumber(this.min) && $type.isNumber(this.max)) {\r\n var min = this.positionToValue(this.start);\r\n var max = this.positionToValue(this.end);\r\n var differece = this.adjustDifference(min, max);\r\n var minMaxStep = this.adjustMinMax(min, max, differece, this._gridCount, true);\r\n var stepDecimalPlaces = $utils.decimalPlaces(minMaxStep.step);\r\n this._stepDecimalPlaces = stepDecimalPlaces;\r\n min = $math.round(min, stepDecimalPlaces);\r\n max = $math.round(max, stepDecimalPlaces);\r\n minMaxStep = this.adjustMinMax(min, max, differece, this._gridCount, true);\r\n var step = minMaxStep.step;\r\n if (this.syncWithAxis) {\r\n var calculated = this.getCache(min + \"-\" + max);\r\n if ($type.isNumber(calculated)) {\r\n step = calculated;\r\n }\r\n }\r\n else {\r\n min = minMaxStep.min;\r\n max = minMaxStep.max;\r\n }\r\n if (this._minZoomed != min || this._maxZoomed != max || this._step != step || this._dsc) {\r\n this._dsc = false;\r\n this._minZoomed = min;\r\n this._maxZoomed = max;\r\n this._step = step;\r\n this.dispatchImmediately(\"selectionextremeschanged\");\r\n }\r\n }\r\n };\r\n ValueAxis.prototype.fixSmallStep = function (step) {\r\n if (1 + step == 1) {\r\n step *= 2;\r\n return this.fixSmallStep(step);\r\n }\r\n return step;\r\n };\r\n /**\r\n * Validates Axis elements.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n */\r\n ValueAxis.prototype.validateAxisElements = function () {\r\n var _this = this;\r\n if ($type.isNumber(this.max) && $type.isNumber(this.min)) {\r\n // first regular items\r\n var value_1 = this.minZoomed - this._step * 2;\r\n if (!this.logarithmic) {\r\n value_1 = Math.floor(value_1 / this._step) * this._step;\r\n }\r\n else {\r\n var differencePower = Math.log(this.max) * Math.LOG10E - Math.log(this.min) * Math.LOG10E;\r\n if (differencePower > 1) {\r\n value_1 = Math.pow(10, Math.log(this.min) * Math.LOG10E);\r\n }\r\n else {\r\n value_1 = Math.floor(this.minZoomed / this._step) * this._step;\r\n if (value_1 == 0) {\r\n value_1 = this.minZoomed;\r\n }\r\n }\r\n }\r\n var maxZoomed = this._maxZoomed + this._step;\r\n this.resetIterators();\r\n var dataItemsIterator_1 = this._dataItemsIterator;\r\n if (this._step == 0) {\r\n return;\r\n }\r\n this._step = this.fixSmallStep(this._step);\r\n var i = 0;\r\n var precisionChanged = this._prevStepDecimalPlaces != this._stepDecimalPlaces;\r\n this._prevStepDecimalPlaces = this._stepDecimalPlaces;\r\n while (value_1 <= maxZoomed) {\r\n var axisBreak = this.isInBreak(value_1);\r\n if (!axisBreak) {\r\n var dataItem = dataItemsIterator_1.find(function (x) { return x.value === value_1; });\r\n if (dataItem.__disabled) {\r\n dataItem.__disabled = false;\r\n }\r\n //this.processDataItem(dataItem);\r\n this.appendDataItem(dataItem);\r\n dataItem.axisBreak = undefined;\r\n if (dataItem.value != value_1 || precisionChanged) {\r\n dataItem.value = value_1;\r\n dataItem.text = this.formatLabel(value_1);\r\n if (dataItem.label && dataItem.label.invalid) {\r\n dataItem.label.validate();\r\n }\r\n if (dataItem.value >= this.min && dataItem.value <= this.max) {\r\n if (dataItem.label) {\r\n if ((this.axisLetter == \"Y\" && dataItem.label.measuredWidth > this.ghostLabel.measuredWidth) || (this.axisLetter == \"X\" && dataItem.label.measuredHeight > this.ghostLabel.measuredHeight)) {\r\n this.ghostLabel.text = dataItem.label.currentText;\r\n this.ghostLabel.validate();\r\n }\r\n }\r\n }\r\n }\r\n this.validateDataElement(dataItem);\r\n }\r\n i++;\r\n var oldValue = value_1;\r\n if (!this.logarithmic) {\r\n value_1 += this._step;\r\n }\r\n else {\r\n var differencePower = Math.log(this.max) * Math.LOG10E - Math.log(this.min) * Math.LOG10E;\r\n if (differencePower > 1) {\r\n value_1 = Math.pow(10, Math.log(this.min) * Math.LOG10E + i);\r\n }\r\n else {\r\n value_1 += this._step;\r\n }\r\n }\r\n var stepPower = Math.pow(10, Math.floor(Math.log(Math.abs(this._step)) * Math.LOG10E));\r\n if (stepPower < 1) {\r\n // exponent is less then 1 too. Count decimals of exponent\r\n var decCount = Math.round(Math.abs(Math.log(Math.abs(stepPower)) * Math.LOG10E)) + 2;\r\n decCount = Math.min(13, decCount);\r\n // round value to avoid floating point issues\r\n value_1 = $math.round(value_1, decCount);\r\n // ceil causes problems: https://codepen.io/team/amcharts/pen/XWMjZwy?editors=1010\r\n if (oldValue == value_1) {\r\n value_1 = maxZoomed;\r\n break;\r\n }\r\n }\r\n }\r\n var axisBreaks = this._axisBreaks;\r\n if (axisBreaks) {\r\n // breaks later\r\n var renderer_1 = this.renderer;\r\n $iter.each(axisBreaks.iterator(), function (axisBreak) {\r\n if (axisBreak.breakSize > 0) {\r\n // only add grid if gap is bigger then minGridDistance\r\n if ($math.getDistance(axisBreak.startPoint, axisBreak.endPoint) > renderer_1.minGridDistance) {\r\n var breakValue_1 = axisBreak.adjustedMin;\r\n while (breakValue_1 <= axisBreak.adjustedMax) {\r\n if (breakValue_1 >= axisBreak.adjustedStartValue && breakValue_1 <= axisBreak.adjustedEndValue) {\r\n var dataItem = dataItemsIterator_1.find(function (x) { return x.value === breakValue_1; });\r\n if (dataItem.__disabled) {\r\n dataItem.__disabled = false;\r\n }\r\n //this.processDataItem(dataItem);\r\n _this.appendDataItem(dataItem);\r\n dataItem.axisBreak = axisBreak;\r\n if (dataItem.value != breakValue_1) {\r\n dataItem.value = breakValue_1;\r\n dataItem.text = _this.formatLabel(breakValue_1);\r\n if (dataItem.label && dataItem.label.invalid) {\r\n dataItem.label.validate();\r\n }\r\n }\r\n _this.validateDataElement(dataItem);\r\n }\r\n breakValue_1 += axisBreak.adjustedStep;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n };\r\n /**\r\n * Validates axis data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param dataItem Data item\r\n */\r\n ValueAxis.prototype.validateDataElement = function (dataItem) {\r\n _super.prototype.validateDataElement.call(this, dataItem);\r\n //dataItem.__disabled = false;\r\n dataItem.itemIndex = this._axisItemCount;\r\n this._axisItemCount++;\r\n var renderer = this.renderer;\r\n var value = dataItem.value;\r\n var endValue = dataItem.endValue;\r\n var position = this.valueToPosition(value);\r\n dataItem.position = position;\r\n var endPosition = position;\r\n var fillEndPosition = this.valueToPosition(value + this._step);\r\n if ($type.isNumber(endValue)) {\r\n endPosition = this.valueToPosition(endValue);\r\n fillEndPosition = endPosition;\r\n }\r\n // this point is needed to calculate distance to satisfy minGridDistance\r\n dataItem.point = renderer.positionToPoint(position);\r\n var tick = dataItem.tick;\r\n if (tick && !tick.disabled) {\r\n renderer.updateTickElement(tick, position, endPosition);\r\n }\r\n var grid = dataItem.grid;\r\n if (grid && !grid.disabled) {\r\n renderer.updateGridElement(grid, position, endPosition);\r\n }\r\n var label = dataItem.label;\r\n if (label && !label.disabled) {\r\n renderer.updateLabelElement(label, position, endPosition);\r\n }\r\n var fill = dataItem.axisFill;\r\n if (fill && !fill.disabled) {\r\n renderer.updateFillElement(fill, position, fillEndPosition);\r\n if (!dataItem.isRange) {\r\n this.fillRule(dataItem);\r\n }\r\n }\r\n if (dataItem.bullet) {\r\n renderer.updateBullet(dataItem.bullet, position, endPosition);\r\n }\r\n var mask = dataItem.mask;\r\n if (mask) {\r\n renderer.updateFillElement(mask, position, fillEndPosition);\r\n }\r\n };\r\n /**\r\n * Formats the value according to axis' own [[NumberFormatter]].\r\n *\r\n * @param value Source value\r\n * @return Formatted value\r\n */\r\n ValueAxis.prototype.formatLabel = function (value) {\r\n if (this.adjustLabelPrecision && value != 0) {\r\n return this.numberFormatter.format(value, undefined, this._stepDecimalPlaces);\r\n }\r\n else {\r\n return this.numberFormatter.format(value);\r\n }\r\n };\r\n Object.defineProperty(ValueAxis.prototype, \"basePoint\", {\r\n /**\r\n * Coordinates of the actual axis start.\r\n *\r\n * @ignore Exclude from docs\r\n * @return Base point\r\n */\r\n get: function () {\r\n var baseValue = this.baseValue;\r\n var position = this.valueToPosition(baseValue);\r\n var basePoint = this.renderer.positionToPoint(position);\r\n return basePoint;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"baseValue\", {\r\n /**\r\n * @return base value\r\n */\r\n get: function () {\r\n var baseValue = this._baseValue;\r\n if (this.logarithmic) {\r\n baseValue = this.min;\r\n }\r\n if (!this._adapterO) {\r\n return baseValue;\r\n }\r\n else {\r\n return this._adapterO.apply(\"baseValue\", baseValue);\r\n }\r\n },\r\n /**\r\n * A base value.\r\n *\r\n * This is a threshold value that will divide \"positive\" and \"negative\"\r\n * value ranges.\r\n *\r\n * Other scale-related functionality also depend on base value. E.g. stacks,\r\n * value-dependent coloring, etc.\r\n *\r\n * @param value Base value\r\n */\r\n set: function (value) {\r\n this._baseValue = value;\r\n this.invalidateLayout();\r\n this.invalidateSeries();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Converts a numeric value to relative position on axis\r\n *\r\n * An alias to `valueToPosition()`.\r\n *\r\n * @param value Value\r\n * @return Position\r\n */\r\n ValueAxis.prototype.anyToPosition = function (value) {\r\n return this.valueToPosition(value);\r\n };\r\n /**\r\n * Converts a numeric value to orientation point (x, y, angle) on axis\r\n *\r\n * @param value Value\r\n * @return Orientation point\r\n */\r\n ValueAxis.prototype.valueToPoint = function (value) {\r\n var position = this.valueToPosition(value);\r\n var point = this.renderer.positionToPoint(position);\r\n var angle = this.renderer.positionToAngle(position);\r\n return { x: point.x, y: point.y, angle: angle };\r\n };\r\n /**\r\n * Converts a numeric value to orientation (x, y, angle) point on axis\r\n *\r\n * @param value Value\r\n * @return Orientation point\r\n */\r\n ValueAxis.prototype.anyToPoint = function (value) {\r\n return this.valueToPoint(value);\r\n };\r\n /**\r\n * Converts a numeric value to relative position on axis.\r\n *\r\n * @param value Value\r\n * @return relative position\r\n */\r\n ValueAxis.prototype.valueToPosition = function (value) {\r\n if ($type.isNumber(value)) {\r\n // todo: think if possible to take previous value and do not go through all previous breaks\r\n var min_1 = this.min;\r\n var max_1 = this.max;\r\n if ($type.isNumber(min_1) && $type.isNumber(max_1)) {\r\n var difference = this._difference;\r\n var axisBreaks = this._axisBreaks;\r\n if (axisBreaks && axisBreaks.length > 0) {\r\n $iter.eachContinue(axisBreaks.iterator(), function (axisBreak) {\r\n var startValue = axisBreak.adjustedStartValue;\r\n var endValue = axisBreak.adjustedEndValue;\r\n if ($type.isNumber(startValue) && $type.isNumber(endValue)) {\r\n if (value < startValue) {\r\n return false;\r\n }\r\n if ($math.intersect({ start: startValue, end: endValue }, { start: min_1, end: max_1 })) { // todo: check this once and set some flag in axisBreak\r\n startValue = Math.max(startValue, min_1);\r\n endValue = Math.min(endValue, max_1);\r\n var breakSize = axisBreak.breakSize;\r\n // value to the right of break end\r\n if (value > endValue) {\r\n min_1 += (endValue - startValue) * (1 - breakSize); // todo: maybe this can be done differently?\r\n }\r\n // value to the left of break start\r\n else if (value < startValue) {\r\n }\r\n // value within break\r\n else {\r\n value = startValue + (value - startValue) * breakSize;\r\n }\r\n }\r\n }\r\n return true;\r\n });\r\n }\r\n var position = void 0;\r\n if (!this.logarithmic) {\r\n position = (value - min_1) / difference;\r\n }\r\n else {\r\n var treatZeroAs = this.treatZeroAs;\r\n if ($type.isNumber(treatZeroAs)) {\r\n if (value <= treatZeroAs) {\r\n value = treatZeroAs;\r\n }\r\n }\r\n position = (Math.log(value) * Math.LOG10E - Math.log(this.min) * Math.LOG10E) / ((Math.log(this.max) * Math.LOG10E - Math.log(this.min) * Math.LOG10E));\r\n }\r\n //position = $math.round(position, 10);\r\n return position;\r\n }\r\n }\r\n return 0;\r\n };\r\n /**\r\n * When fontSize of fontFamily changes we need to hard-invalidate all Labels of this container to position them properly.\r\n */\r\n ValueAxis.prototype.invalidateLabels = function () {\r\n _super.prototype.invalidateLabels.call(this);\r\n if (this.dataItems) {\r\n this.dataItems.each(function (dataItem) {\r\n dataItem.value = undefined;\r\n });\r\n this.invalidate();\r\n }\r\n };\r\n /**\r\n * Converts an relative position to a corresponding value within\r\n * axis' scale.\r\n *\r\n * @param position Position (px)\r\n * @return Value\r\n */\r\n ValueAxis.prototype.positionToValue = function (position) {\r\n var min = this.min;\r\n var max = this.max;\r\n if ($type.isNumber(min) && $type.isNumber(max)) {\r\n var difference_1 = max - min; //no need to adjust!\r\n var value_2 = null;\r\n var axisBreaks = this._axisBreaks;\r\n if (axisBreaks) {\r\n // in case we have some axis breaks\r\n if (axisBreaks.length > 0) {\r\n $iter.eachContinue(axisBreaks.iterator(), function (axisBreak) {\r\n var breakStartPosition = axisBreak.startPosition;\r\n var breakEndPosition = axisBreak.endPosition;\r\n var breakStartValue = axisBreak.adjustedStartValue;\r\n var breakEndValue = axisBreak.adjustedEndValue;\r\n if ($type.isNumber(breakStartValue) && $type.isNumber(breakEndValue)) {\r\n if (breakStartValue > max) {\r\n return false;\r\n }\r\n if ($math.intersect({ start: breakStartValue, end: breakEndValue }, { start: min, end: max })) {\r\n breakStartValue = $math.max(breakStartValue, min);\r\n breakEndValue = $math.min(breakEndValue, max);\r\n var breakSize = axisBreak.breakSize;\r\n difference_1 -= (breakEndValue - breakStartValue) * (1 - breakSize);\r\n // position to the right of break end\r\n if (position > breakEndPosition) {\r\n min += (breakEndValue - breakStartValue) * (1 - breakSize);\r\n }\r\n // position to the left of break start\r\n else if (position < breakStartPosition) {\r\n }\r\n // value within break\r\n else {\r\n var breakPosition = (position - breakStartPosition) / (breakEndPosition - breakStartPosition);\r\n value_2 = breakStartValue + breakPosition * (breakEndValue - breakStartValue);\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n });\r\n }\r\n }\r\n if (!$type.isNumber(value_2)) {\r\n if (this.logarithmic) {\r\n value_2 = Math.pow(Math.E, (position * ((Math.log(this.max) * Math.LOG10E - Math.log(this.min) * Math.LOG10E)) + Math.log(this.min) * Math.LOG10E) / Math.LOG10E);\r\n }\r\n else {\r\n value_2 = position * difference_1 + min;\r\n }\r\n }\r\n return value_2;\r\n }\r\n //}\r\n };\r\n /**\r\n * Converts an X coordinate to a relative value in axis' scale.\r\n *\r\n * @param x X (px)\r\n * @return Value\r\n */\r\n ValueAxis.prototype.xToValue = function (x) {\r\n return this.positionToValue(this.pointToPosition({ x: x, y: 0 }));\r\n };\r\n /**\r\n * Converts an Y coordinate to a relative value in axis' scale.\r\n *\r\n * @param y Y (px)\r\n * @return Value\r\n */\r\n ValueAxis.prototype.yToValue = function (y) {\r\n return this.positionToValue(this.pointToPosition({ x: 0, y: y }));\r\n };\r\n /**\r\n * Converts pixel coordinates to a relative position. (0-1)\r\n *\r\n * @param point Coorinates (px)\r\n * @return Position (0-1)\r\n */\r\n ValueAxis.prototype.pointToPosition = function (point) {\r\n if (this.renderer instanceof AxisRendererY) {\r\n return 1 - this.renderer.pointToPosition(point);\r\n }\r\n else {\r\n return this.renderer.pointToPosition(point);\r\n }\r\n };\r\n /**\r\n * @ignore\r\n */\r\n ValueAxis.prototype.animateMinMax = function (min, max) {\r\n return this.animate([{ property: \"_minAdjusted\", from: this._minAdjusted, to: min }, { property: \"_maxAdjusted\", from: this._maxAdjusted, to: max }], this.rangeChangeDuration, this.rangeChangeEasing);\r\n };\r\n /**\r\n * Calculates smallest and biggest value for the axis scale.\r\n * @ignore\r\n * @todo Description (review)\r\n */\r\n ValueAxis.prototype.getMinMax = function () {\r\n var _this = this;\r\n this.updateGridCount();\r\n var min = Number.POSITIVE_INFINITY;\r\n var max = Number.NEGATIVE_INFINITY;\r\n // only if min and max are not set from outside, we go through min and max influencers\r\n if (!$type.isNumber(this._minDefined) || !$type.isNumber(this._maxDefined)) {\r\n this.series.each(function (series) {\r\n if (!series.ignoreMinMax) {\r\n // check min\r\n var seriesMin = series.min(_this);\r\n if ($type.isNumber(seriesMin) && (seriesMin < min)) {\r\n min = seriesMin;\r\n }\r\n // check max\r\n var seriesMax = series.max(_this);\r\n if ($type.isNumber(seriesMax) && (seriesMax > max)) {\r\n max = seriesMax;\r\n }\r\n }\r\n });\r\n if (this.includeRangesInMinMax) {\r\n this.axisRanges.each(function (range) {\r\n if (!range.ignoreMinMax) {\r\n var minValue = $math.min(range.value, range.endValue);\r\n var maxValue = $math.max(range.value, range.endValue);\r\n if (minValue < min || !$type.isNumber(min)) {\r\n min = minValue;\r\n }\r\n if (maxValue > max || !$type.isNumber(max)) {\r\n max = maxValue;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (this.logarithmic) {\r\n var treatZeroAs = this.treatZeroAs;\r\n if ($type.isNumber(treatZeroAs)) {\r\n if (min <= 0) {\r\n min = treatZeroAs;\r\n }\r\n }\r\n if (min <= 0) {\r\n this.raiseCriticalError(new Error(\"Logarithmic value axis can not have values <= 0.\"), true);\r\n }\r\n }\r\n if (min == 0 && max == 0) {\r\n max = 0.9;\r\n min = -0.9;\r\n }\r\n // if defined from outside\r\n if ($type.isNumber(this._minDefined)) {\r\n min = this._minDefined;\r\n }\r\n if ($type.isNumber(this._maxDefined)) {\r\n max = this._maxDefined;\r\n }\r\n if (this._adapterO) {\r\n min = this._adapterO.apply(\"min\", min);\r\n }\r\n if (this._adapterO) {\r\n max = this._adapterO.apply(\"max\", max);\r\n }\r\n if (!$type.isNumber(min) || !$type.isNumber(max)) {\r\n return;\r\n }\r\n this._minReal = min;\r\n this._maxReal = max;\r\n if (min == Number.POSITIVE_INFINITY) {\r\n min = undefined;\r\n }\r\n if (max == Number.NEGATIVE_INFINITY) {\r\n max = undefined;\r\n }\r\n var dif = this.adjustDifference(min, max); // previously it was max-min, but not worked well\r\n min = this.fixMin(min);\r\n max = this.fixMax(max);\r\n // this happens if starLocation and endLocation are 0.5 and DateAxis has only one date\r\n if (max - min <= 1 / Math.pow(10, 15)) {\r\n if (max - min != 0) {\r\n this._deltaMinMax = (max - min) / 2;\r\n }\r\n else {\r\n // the number by which we need to raise 10 to get difference\r\n var exponent = Math.log(Math.abs(max)) * Math.LOG10E;\r\n // here we find a number which is power of 10 and has the same count of numbers as difference has\r\n var power = Math.pow(10, Math.floor(exponent));\r\n // reduce this number by 10 times\r\n power = power / 10;\r\n this._deltaMinMax = power;\r\n }\r\n min -= this._deltaMinMax;\r\n max += this._deltaMinMax;\r\n }\r\n min -= (max - min) * this.extraMin;\r\n max += (max - min) * this.extraMax;\r\n var strict = this.strictMinMax;\r\n if ($type.isNumber(this._maxDefined)) {\r\n strict = true;\r\n }\r\n var minMaxStep = this.adjustMinMax(min, max, dif, this._gridCount, strict);\r\n min = minMaxStep.min;\r\n max = minMaxStep.max;\r\n dif = max - min; //new\r\n // do it for the second time (importat!)\r\n minMaxStep = this.adjustMinMax(min, max, max - min, this._gridCount, true);\r\n min = minMaxStep.min;\r\n max = minMaxStep.max;\r\n // return min max if strict\r\n if (this.strictMinMax) {\r\n if ($type.isNumber(this._minDefined)) {\r\n min = this._minDefined;\r\n }\r\n else {\r\n min = this._minReal;\r\n }\r\n if ($type.isNumber(this._maxDefined)) {\r\n max = this._maxDefined;\r\n }\r\n else {\r\n max = this._maxReal;\r\n }\r\n if (max - min <= 0.00000001) {\r\n min -= this._deltaMinMax;\r\n max += this._deltaMinMax;\r\n }\r\n min -= (max - min) * this.extraMin;\r\n max += (max - min) * this.extraMax;\r\n }\r\n if (this._adapterO) {\r\n min = this._adapterO.apply(\"min\", min);\r\n }\r\n if (this._adapterO) {\r\n max = this._adapterO.apply(\"max\", max);\r\n }\r\n this._step = minMaxStep.step;\r\n if (!$type.isNumber(min) && !$type.isNumber(max)) {\r\n this.start = 0;\r\n this.end = 1;\r\n this.renderer.labels.each(function (label) {\r\n label.dataItem.text = \"\";\r\n });\r\n }\r\n // checking isNumber is good when all series are hidden\r\n if ((this._minAdjusted != min || this._maxAdjusted != max) && $type.isNumber(min) && $type.isNumber(max)) {\r\n var animation = this._minMaxAnimation;\r\n if (this._extremesChanged && $type.isNumber(this._minAdjusted) && $type.isNumber(this._maxAdjusted) && this.inited) {\r\n if ((animation && !animation.isFinished()) && this._finalMax == max && this._finalMin == min) {\r\n return;\r\n }\r\n else {\r\n this._finalMin = min;\r\n this._finalMax = max;\r\n animation = this.animateMinMax(min, max);\r\n if (animation && !animation.isFinished()) {\r\n animation.events.on(\"animationprogress\", this.validateDataItems, this);\r\n animation.events.on(\"animationended\", function () {\r\n //this.validateDataItems();\r\n _this.series.each(function (series) {\r\n series.validate();\r\n });\r\n _this.validateDataItems();\r\n _this.handleSelectionExtremesChange();\r\n });\r\n this._minMaxAnimation = animation;\r\n }\r\n else {\r\n this.series.each(function (series) {\r\n series.invalidate();\r\n });\r\n }\r\n this.validateDataItems();\r\n this.dispatchImmediately(\"extremeschanged\");\r\n this.handleSelectionExtremesChange();\r\n }\r\n }\r\n else {\r\n if ((animation && !animation.isFinished()) && this._finalMax == max && this._finalMin == min) {\r\n return;\r\n }\r\n else {\r\n this._minAdjusted = min;\r\n this._maxAdjusted = max;\r\n this._finalMin = min;\r\n this._finalMax = max;\r\n this.invalidateDataItems();\r\n this.dispatchImmediately(\"extremeschanged\");\r\n this._saveMinMax(min, max);\r\n }\r\n }\r\n }\r\n this._extremesChanged = false;\r\n this._difference = this.adjustDifference(min, max);\r\n };\r\n /**\r\n * Adjusts the minimum value.\r\n *\r\n * This is a placeholder method for extending classes to override.\r\n *\r\n * For numeric values this does nothing, however for more complex types, like\r\n * dates, it may be necessary to adjust.\r\n *\r\n * @param value Value\r\n * @return Adjusted value\r\n */\r\n ValueAxis.prototype.fixMin = function (value) {\r\n return value;\r\n };\r\n /**\r\n * Adjusts the maximum value.\r\n *\r\n * This is a placeholder method for extending classes to override.\r\n *\r\n * For numeric values this does nothing, however for more complex types, like\r\n * dates, it may be necessary to adjust.\r\n *\r\n * @param value Value\r\n * @return Adjusted value\r\n */\r\n ValueAxis.prototype.fixMax = function (value) {\r\n return value;\r\n };\r\n /**\r\n * Adjusts actual min and max scale values so that the axis starts and ends\r\n * at \"nice\" values, unless `strictMinMax` is set.\r\n *\r\n * The `difference` can be something else than `max - min`, because of the\r\n * axis breaks.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param min [description]\r\n * @param max [description]\r\n * @param difference [description]\r\n * @param gridCount [description]\r\n * @param strictMode [description]\r\n * @return [description]\r\n */\r\n ValueAxis.prototype.adjustMinMax = function (min, max, difference, gridCount, strictMode) {\r\n // will fail if 0\r\n if (gridCount <= 1) {\r\n gridCount = 1;\r\n }\r\n gridCount = Math.round(gridCount);\r\n var initialMin = min;\r\n var initialMax = max;\r\n // in case min and max is the same, use max\r\n if (difference === 0) {\r\n difference = Math.abs(max);\r\n }\r\n // the number by which we need to raise 10 to get difference\r\n var exponent = Math.log(Math.abs(difference)) * Math.LOG10E;\r\n // here we find a number which is power of 10 and has the same count of numbers as difference has\r\n var power = Math.pow(10, Math.floor(exponent));\r\n // reduce this number by 10 times\r\n power = power / 10;\r\n var extra = power;\r\n if (strictMode) {\r\n extra = 0;\r\n }\r\n if (!this.logarithmic) {\r\n // round down min\r\n if (strictMode) {\r\n min = Math.floor(min / power) * power;\r\n // round up max\r\n max = Math.ceil(max / power) * power;\r\n }\r\n else {\r\n min = Math.ceil(min / power) * power - extra;\r\n // round up max\r\n max = Math.floor(max / power) * power + extra;\r\n }\r\n // don't let min go below 0 if real min is >= 0\r\n if (min < 0 && initialMin >= 0) {\r\n min = 0;\r\n }\r\n // don't let max go above 0 if real max is <= 0\r\n if (max > 0 && initialMax <= 0) {\r\n max = 0;\r\n }\r\n }\r\n else {\r\n if (min <= 0) {\r\n //throw Error(\"Logarithmic value axis can not have values <= 0.\");\r\n min = this.baseValue;\r\n }\r\n // @todo: think of a better way or to restrict zooming when no series are selected\r\n if (min == Infinity) {\r\n min = 1;\r\n }\r\n if (max == -Infinity) {\r\n max = 10;\r\n }\r\n if (this.strictMinMax) {\r\n if (this._minDefined > 0) {\r\n min = this._minDefined;\r\n }\r\n else {\r\n min = min;\r\n }\r\n if (this._maxDefined > 0) {\r\n max = max;\r\n }\r\n }\r\n else {\r\n min = Math.pow(10, Math.floor(Math.log(Math.abs(min)) * Math.LOG10E));\r\n max = Math.pow(10, Math.ceil(Math.log(Math.abs(max)) * Math.LOG10E));\r\n }\r\n }\r\n // repeat diff, exponent and power again with rounded values\r\n //difference = this.adjustDifference(min, max);\r\n /*\r\n\r\n if(min > initialMin){\r\n min = initialMin;\r\n }\r\n\r\n if(max < initialMax){\r\n max = initialMax;\r\n }\r\n */\r\n exponent = Math.log(Math.abs(difference)) * Math.LOG10E;\r\n power = Math.pow(10, Math.floor(exponent));\r\n power = power / 10;\r\n // approximate difference between two grid lines\r\n var step = Math.ceil((difference / gridCount) / power) * power;\r\n var stepPower = Math.pow(10, Math.floor(Math.log(Math.abs(step)) * Math.LOG10E));\r\n // TODO: in v3 I had fixStepE here, ommiting it for a while, need to think about other solution\r\n // the step should divide by 2, 5, and 10.\r\n var stepDivisor = Math.ceil(step / stepPower); // number 0 - 10\r\n if (stepDivisor > 5) {\r\n stepDivisor = 10;\r\n }\r\n else if (stepDivisor <= 5 && stepDivisor > 2) {\r\n stepDivisor = 5;\r\n }\r\n // now get real step\r\n step = Math.ceil(step / (stepPower * stepDivisor)) * stepPower * stepDivisor;\r\n if (this.maxPrecision < Number.MAX_VALUE && step != $math.ceil(step, this.maxPrecision)) {\r\n step = $math.ceil(step, this.maxPrecision);\r\n }\r\n var decCount = 0;\r\n // in case numbers are smaller than 1\r\n if (stepPower < 1) {\r\n // exponent is less then 1 too. Count decimals of exponent\r\n decCount = Math.round(Math.abs(Math.log(Math.abs(stepPower)) * Math.LOG10E)) + 1;\r\n // round step\r\n step = $math.round(step, decCount);\r\n }\r\n if (!this.logarithmic) {\r\n // final min and max\r\n var minCount = Math.floor(min / step);\r\n min = $math.round(step * minCount, decCount);\r\n var maxCount = void 0;\r\n if (!strictMode) {\r\n maxCount = Math.ceil(max / step);\r\n }\r\n else {\r\n maxCount = Math.floor(max / step);\r\n }\r\n if (maxCount == minCount) {\r\n maxCount++;\r\n }\r\n max = $math.round(step * maxCount, decCount);\r\n if (max < initialMax) {\r\n max = max + step;\r\n }\r\n if (min > initialMin) {\r\n min = min - step;\r\n }\r\n }\r\n return { min: min, max: max, step: step };\r\n };\r\n Object.defineProperty(ValueAxis.prototype, \"min\", {\r\n /**\r\n * @return Min value\r\n */\r\n get: function () {\r\n var min = this._minAdjusted;\r\n if (!$type.isNumber(min)) {\r\n min = this._minDefined;\r\n }\r\n return min;\r\n },\r\n /**\r\n * A minimum value for the axis scale.\r\n *\r\n * This value might be auto-adjusted by the Axis in order to accomodate the\r\n * grid nicely, i.e. plot area is divided by grid in nice equal cells.\r\n *\r\n * The above might be overridden by `strictMinMax` which will force exact\r\n * user-defined min and max values to be used for scale.\r\n *\r\n * @param value Min value\r\n */\r\n set: function (value) {\r\n if (this._minDefined != value) {\r\n this._minDefined = value;\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"minDefined\", {\r\n /**\r\n * Min value as defined by user's code, not auto-calculated.\r\n *\r\n * @readonly\r\n * @return Min value\r\n */\r\n get: function () {\r\n return this._minDefined;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"maxDefined\", {\r\n /**\r\n * Max value as defined by user's code, not auto-calculated.\r\n *\r\n * @readonly\r\n * @return Man value\r\n */\r\n get: function () {\r\n return this._maxDefined;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"extraMin\", {\r\n /**\r\n * @return {number}\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"extraMin\");\r\n },\r\n /**\r\n * Allows relatively adjusting minimum value of the axis' scale.\r\n *\r\n * The value is relative to the actual range of values currently displayed\r\n * on the axis.\r\n *\r\n * E.g.: 0.5 will mean half of the current range. If we have axis displaying\r\n * from 100 to 200, we will now have axis displaying from 50 to 200 because\r\n * we asked to expand minimum value by 50% (0.5).\r\n *\r\n * NOTE: this setting is not compatible with `strictMinMax`.\r\n *\r\n * @param {number}\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"extraMin\", value)) {\r\n this.invalidateDataItems();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"extraMax\", {\r\n /**\r\n * @return Min multiplier\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"extraMax\");\r\n },\r\n /**\r\n * Allows relatively adjusting maximum value of the axis' scale.\r\n *\r\n * The value is relative to the actual range of values currently displayed\r\n * on the axis.\r\n *\r\n * E.g.: 0.5 will mean half of the current range. If we have axis displaying\r\n * from 100 to 200, we will now have axis displaying from 100 to 250 because\r\n * we asked to expand maximum value by 50% (0.5).\r\n *\r\n * NOTE: this setting is not compatible with `strictMinMax`.\r\n *\r\n * @param {number}\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"extraMax\", value)) {\r\n this.invalidateDataItems();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"step\", {\r\n /**\r\n * Current calculated delta in values between two adjacent grid lines (step).\r\n *\r\n * This is a read-only value and cannot be used to set actual step.\r\n *\r\n * @readonly\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/axes/positioning-axis-elements/#Setting_the_density_of_the_the_grid_labels} For more information about modifying density of labels\r\n * @return [description]\r\n */\r\n get: function () {\r\n return this._step;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"max\", {\r\n /**\r\n * @return Max value\r\n */\r\n get: function () {\r\n var max = this._maxAdjusted;\r\n if (!$type.isNumber(max)) {\r\n max = this._maxDefined;\r\n }\r\n return max;\r\n },\r\n /**\r\n * A maximum value for the axis scale.\r\n *\r\n * This value might be auto-adjusted by the Axis in order to accomodate the\r\n * grid nicely, i.e. plot area is divided by grid in nice equal cells.\r\n *\r\n * The above might be overridden by `strictMinMax` which will force exact\r\n * user-defined min and max values to be used for scale.\r\n *\r\n * @param value Max value\r\n */\r\n set: function (value) {\r\n if (this._maxDefined != value) {\r\n this._maxDefined = value;\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"adjustLabelPrecision\", {\r\n /**\r\n * @return Adjust precision\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"adjustLabelPrecision\");\r\n },\r\n /**\r\n * By default the axis will adjust precision of all numbers to match number\r\n * of decimals in all its labels, e.g.: `1.0`, `1.5`, `2.0`.\r\n *\r\n * To disable set `adjustLabelPrecision` to `false`, to use whatever other\r\n * precision or number format settings are set.\r\n *\r\n * IMPORTANT: This setting will be ignored if your number format uses\r\n * modifiers, e.g. `\"#a\"`.\r\n *\r\n * @default true\r\n * @since 4.9.14\r\n * @param value Adjust precision\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"adjustLabelPrecision\", value)) {\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Used for the Series to register itself as the user of this Axis.\r\n *\r\n * This will also decorate both the Series and Axis with event handlers, used\r\n * to redraw on Axis position/zoom change.\r\n *\r\n * A disposer for those events is returned, so that they can be disposed\r\n * together with Series.\r\n *\r\n * @ignore Exclude from docs\r\n * @param series Series\r\n * @return Disposer for events\r\n */\r\n ValueAxis.prototype.registerSeries = function (series) {\r\n return new MultiDisposer([\r\n _super.prototype.registerSeries.call(this, series),\r\n series.events.on(\"extremeschanged\", this.handleExtremesChange, this, false),\r\n series.events.on(\"selectionextremeschanged\", this.handleSelectionExtremesChange, this, false),\r\n this.events.on(\"extremeschanged\", series.invalidate, series, false)\r\n ]);\r\n };\r\n /**\r\n * Perform tasks after Axis zoom.\r\n */\r\n ValueAxis.prototype.handleSelectionExtremesChange = function () {\r\n var _this = this;\r\n var selectionMin;\r\n var selectionMax;\r\n var allHidden = true;\r\n $iter.each(this.series.iterator(), function (series) {\r\n if (!series.ignoreMinMax && !series.isHidden && !series.outOfRange) {\r\n if (series.visible && !series.isHiding) {\r\n allHidden = false;\r\n }\r\n var seriesSelectionMin = series.selectionMin(_this);\r\n var seriesSelectionMax = series.selectionMax(_this);\r\n if ($type.isNumber(seriesSelectionMin)) {\r\n if (!$type.isNumber(selectionMin) || (seriesSelectionMin < selectionMin)) {\r\n selectionMin = seriesSelectionMin;\r\n }\r\n }\r\n // check max\r\n if ($type.isNumber(seriesSelectionMax)) {\r\n if (!$type.isNumber(selectionMax) || (seriesSelectionMax > selectionMax)) {\r\n selectionMax = seriesSelectionMax;\r\n }\r\n }\r\n }\r\n });\r\n if (this.includeRangesInMinMax) {\r\n this.axisRanges.each(function (range) {\r\n if (!range.ignoreMinMax) {\r\n var minValue = $math.min(range.value, range.endValue);\r\n var maxValue = $math.max(range.value, range.endValue);\r\n if (minValue < selectionMin) {\r\n selectionMin = minValue;\r\n }\r\n if (maxValue > selectionMax) {\r\n selectionMax = maxValue;\r\n }\r\n }\r\n });\r\n }\r\n // this is not good, as if date axis is initially zoomed, selection of y axis is reset to 0, 1 at the end of this method\r\n //$iter.each(this.series.iterator(), (series) => {\r\n //\tif (!series.appeared) {\r\n //\t\tallHidden = true;\r\n //\t}\r\n //})\r\n if ($type.isNumber(this._minDefined)) {\r\n if (this.strictMinMax) {\r\n selectionMin = this._minDefined;\r\n }\r\n else {\r\n selectionMin = this.min;\r\n }\r\n }\r\n else if (this.strictMinMax) {\r\n selectionMin = this._minReal;\r\n }\r\n if ($type.isNumber(this._maxDefined)) {\r\n if (this.strictMinMax) {\r\n selectionMax = this._maxDefined;\r\n }\r\n else {\r\n selectionMax = this.max;\r\n }\r\n }\r\n else if (this.strictMinMax) {\r\n selectionMax = this._maxReal;\r\n }\r\n if (selectionMin == selectionMax) {\r\n selectionMin -= this._deltaMinMax;\r\n selectionMax += this._deltaMinMax;\r\n var minMaxStep2 = this.adjustMinMax(selectionMin, selectionMax, 0, this._gridCount, this.strictMinMax);\r\n selectionMin = minMaxStep2.min;\r\n selectionMax = minMaxStep2.max;\r\n }\r\n var dif = this.adjustDifference(selectionMin, selectionMax);\r\n var minMaxStep = this.adjustMinMax(selectionMin, selectionMax, dif, this._gridCount);\r\n selectionMin = minMaxStep.min;\r\n selectionMax = minMaxStep.max;\r\n selectionMin -= (selectionMax - selectionMin) * this.extraMin;\r\n selectionMax += (selectionMax - selectionMin) * this.extraMax;\r\n selectionMin = $math.fitToRange(selectionMin, this.min, this.max);\r\n selectionMax = $math.fitToRange(selectionMax, this.min, this.max);\r\n // do it for the second time !important\r\n dif = this.adjustDifference(selectionMin, selectionMax);\r\n minMaxStep = this.adjustMinMax(selectionMin, selectionMax, dif, this._gridCount, true);\r\n selectionMin = minMaxStep.min;\r\n selectionMax = minMaxStep.max;\r\n if (this.strictMinMax) {\r\n selectionMin = $math.max(selectionMin, this._minDefined);\r\n selectionMax = $math.min(selectionMax, this._maxDefined);\r\n }\r\n var step = minMaxStep.step;\r\n if (this.syncWithAxis) {\r\n minMaxStep = this.syncAxes(selectionMin, selectionMax, step);\r\n selectionMin = minMaxStep.min;\r\n selectionMax = minMaxStep.max;\r\n this.invalidate();\r\n }\r\n step = minMaxStep.step;\r\n // needed because of grouping\r\n this._difference = this.adjustDifference(this.min, this.max);\r\n var start = this.valueToPosition(selectionMin);\r\n var end = this.valueToPosition(selectionMax);\r\n // in case all series are hidden or hiding, full zoomout\r\n if (allHidden && !this.syncWithAxis) {\r\n start = 0;\r\n end = 1;\r\n }\r\n var declination = 0;\r\n if (this.syncWithAxis) {\r\n declination = 5;\r\n this.setCache(selectionMin + \"-\" + selectionMax, step);\r\n }\r\n else {\r\n if (this._step != step || this._minZoomed != selectionMin || this._maxZoomed != selectionMax) {\r\n this._dsc = true;\r\n }\r\n this._step = step;\r\n this._minZoomed = selectionMin;\r\n this._maxZoomed = selectionMax;\r\n }\r\n if (!this.keepSelection) {\r\n this.zoom({ start: start, end: end }, false, false, declination);\r\n }\r\n };\r\n Object.defineProperty(ValueAxis.prototype, \"strictMinMax\", {\r\n /**\r\n * @return Use exact values?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"strictMinMax\");\r\n },\r\n /**\r\n * Indicates whether to blindly use exact `min` and `max` values set by user\r\n * when generating Axis scale.\r\n *\r\n * If not set, the Axis might slightly adjust those values to accomodate a\r\n * better looking grid.\r\n *\r\n * NOTE: if `min` and `max` are not set, setting `strictMinMax` to `true`\r\n * will result in fixing the scale of the axis to actual lowest and highest\r\n * values in the series within currently selected scope.\r\n *\r\n * @default false\r\n * @param value Use exact values?\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"strictMinMax\", value)) {\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"logarithmic\", {\r\n /**\r\n * @return Logarithmic scale?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"logarithmic\");\r\n },\r\n /**\r\n * Indicates if this axis should use a logarithmic scale.\r\n *\r\n * Please note that logarithmic axis can **only** accommodate values bigger\r\n * than zero.\r\n *\r\n * Having zero or negative values will result in error and failure of the\r\n * whole chart.\r\n *\r\n * @param value Logarithmic scale?\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"logarithmic\", value)) {\r\n this.invalidate();\r\n this.series.each(function (series) {\r\n series.invalidateDataItems();\r\n });\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"keepSelection\", {\r\n /**\r\n * @return Preseve zoom after data update?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"keepSelection\");\r\n },\r\n /**\r\n * Indicates if a current selection (zoom) should be kept across data updates.\r\n *\r\n * If your axis is zoomed while chart's data is updated, the axis will try\r\n * to retain the same start and end values.\r\n *\r\n * You can also use this to initially pre-zoom axis:\r\n *\r\n * ```TypeScript\r\n * axis.keepSelection = true;\r\n * axis.start = 0.5;\r\n * axis.end = 0.7;\r\n * ```\r\n * ```JavaScript\r\n * axis.keepSelection = true;\r\n * axis.start = 0.5;\r\n * axis.end = 0.7;\r\n * ```\r\n * ```JSON\r\n * {\r\n * \"xAxes\": [{\r\n * // ...\r\n * \"keepSelection\": true,\r\n * \"start\": 0.5,\r\n * \"end\": 0.7\r\n * }]\r\n * }\r\n * ```\r\n *\r\n * The above will start the chart zoomed from the middle of the actual scope\r\n * to 70%.\r\n *\r\n * @since 4.1.1\r\n * @default false\r\n * @param value Preseve zoom after data update?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"keepSelection\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"includeRangesInMinMax\", {\r\n /**\r\n * @return Include ranges?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"includeRangesInMinMax\");\r\n },\r\n /**\r\n * If set to `true`, values of axis ranges will be included when calculating\r\n * range of values / scale of the [[ValueAxis]].\r\n *\r\n * @default false\r\n * @since 4.4.9\r\n * @param value Include ranges?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"includeRangesInMinMax\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"maxPrecision\", {\r\n /**\r\n * @return max precision\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"maxPrecision\");\r\n },\r\n /**\r\n * Maximum number of decimals to allow when placing grid lines and labels\r\n * on axis.\r\n *\r\n * Set it to `0` (zero) to force integer-only axis labels.\r\n *\r\n * @param {number}\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"maxPrecision\", value)) {\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"extraTooltipPrecision\", {\r\n /**\r\n * @return Extra decimals\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"extraTooltipPrecision\");\r\n },\r\n /**\r\n * This setting allows using bigger precision for numbers displayed in axis\r\n * tooltip.\r\n *\r\n * Please note that this setting indicates additional decimal places to\r\n * automatically-calculated axis number precision.\r\n *\r\n * So if your axis displays numbers like 0.1, 0.2, etc. (one decimal place),\r\n * and you set `extraTooltipPrecision = 1`, tooltips will display numbers\r\n * like 0.12, 0.25, etc. (two decimal places).\r\n *\r\n * @default 0\r\n * @since 4.8.3\r\n * @param value Extra decimals\r\n */\r\n set: function (value) {\r\n if (this.setPropertyValue(\"extraTooltipPrecision\", value)) {\r\n this.invalidate();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Invalidates axis data items when series extremes change\r\n */\r\n ValueAxis.prototype.handleExtremesChange = function () {\r\n var _this = this;\r\n this._extremesChanged = true;\r\n this.getMinMax();\r\n if (this.ghostLabel) {\r\n var mw_1 = 0;\r\n this.dataItems.each(function (dataItem) {\r\n if (dataItem.label && dataItem.label.pixelWidth > mw_1) {\r\n _this.ghostLabel.text = dataItem.label.currentText;\r\n }\r\n });\r\n }\r\n };\r\n /**\r\n * Returns relative position on axis for series' data item's value.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey ?\r\n * @return X coordinate (px)\r\n */\r\n ValueAxis.prototype.getX = function (dataItem, key, location, stackKey, range) {\r\n return this.renderer.positionToPoint(this.getPositionX(dataItem, key, location, stackKey, range)).x;\r\n };\r\n /**\r\n * Returns the X coordinate for series' data item's value.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey ?\r\n * @return Relative position\r\n */\r\n ValueAxis.prototype.getPositionX = function (dataItem, key, location, stackKey, range) {\r\n var value = dataItem.getWorkingValue(key);\r\n if (!$type.hasValue(stackKey)) {\r\n stackKey = \"valueX\";\r\n }\r\n var stack = dataItem.getValue(stackKey, \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n if (this.logarithmic) {\r\n if (stack > 0) {\r\n value = 0;\r\n }\r\n }\r\n }\r\n var position = this.valueToPosition(value + stack);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns the Y coordinate for series' data item's value.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey Stack ID\r\n * @return Y coordinate (px)\r\n */\r\n ValueAxis.prototype.getY = function (dataItem, key, location, stackKey, range) {\r\n return this.renderer.positionToPoint(this.getPositionY(dataItem, key, location, stackKey, range)).y;\r\n };\r\n /**\r\n * Returns relative position on axis for series' data item's value.\r\n *\r\n * @since 4.5.14\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey Stack ID\r\n * @return Relative position\r\n */\r\n ValueAxis.prototype.getPositionY = function (dataItem, key, location, stackKey, range) {\r\n var value = dataItem.getWorkingValue(key);\r\n if (!$type.hasValue(stackKey)) {\r\n stackKey = \"valueY\";\r\n }\r\n var stack = dataItem.getValue(stackKey, \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n if (this.logarithmic) {\r\n if (stack > 0) {\r\n value = 0;\r\n }\r\n }\r\n }\r\n var position = this.valueToPosition(value + stack);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return position;\r\n };\r\n /**\r\n * Returns an angle for series data item.\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description (review)\r\n * @param dataItem Data item\r\n * @param key Data field to get value from\r\n * @param location Location (0-1)\r\n * @param stackKey Stack ID\r\n * @param range Range to fit in\r\n * @return Angle\r\n */\r\n ValueAxis.prototype.getAngle = function (dataItem, key, location, stackKey, range) {\r\n var value = dataItem.getWorkingValue(key);\r\n var stack = dataItem.getValue(stackKey, \"stack\");\r\n if (!$type.isNumber(value)) {\r\n value = this.baseValue;\r\n }\r\n var position = this.valueToPosition(value + stack);\r\n if (range) {\r\n position = $math.fitToRange(position, range.start, range.end);\r\n }\r\n return this.positionToAngle(position);\r\n };\r\n /**\r\n * [getAnyRangePath description]\r\n *\r\n * @ignore Exclude from docs\r\n * @todo Description\r\n * @param start [description]\r\n * @param end [description]\r\n * @param location [description]\r\n * @return [description]\r\n */\r\n ValueAxis.prototype.getAnyRangePath = function (start, end, location) {\r\n var startPosition = this.valueToPosition(start);\r\n var endPosition = this.valueToPosition(end);\r\n return this.getPositionRangePath(startPosition, endPosition); // Base class (Axis) gets range shape from AxisRenderer\r\n };\r\n /**\r\n * Returns text to show in a axis tooltip, based on specific position within\r\n * axis.\r\n *\r\n * The label will be formatted as per [[NumberFormatter]] set for the whole\r\n * chart, or explicitly for this Axis.\r\n *\r\n * @ignore Exclude from docs\r\n * @param position Position (px)\r\n * @return Label (numeric value)\r\n */\r\n ValueAxis.prototype.getTooltipText = function (position) {\r\n var value = $math.round(this.positionToValue(position), this._stepDecimalPlaces + this.extraTooltipPrecision);\r\n var valueStr = this.tooltip.numberFormatter.format(value);\r\n if (!this._adapterO) {\r\n return valueStr;\r\n }\r\n else {\r\n return this._adapterO.apply(\"getTooltipText\", valueStr);\r\n }\r\n };\r\n /**\r\n * Zooms axis to specific values.\r\n *\r\n * @param startValue Start value\r\n * @param endValue End value\r\n * @param skipRangeEvent Do not invoke events\r\n * @param instantly Do not play zoom animations\r\n */\r\n ValueAxis.prototype.zoomToValues = function (startValue, endValue, skipRangeEvent, instantly) {\r\n var start = (startValue - this.min) / (this.max - this.min);\r\n var end = (endValue - this.min) / (this.max - this.min);\r\n this.zoom({ start: start, end: end }, skipRangeEvent, instantly);\r\n };\r\n Object.defineProperty(ValueAxis.prototype, \"minZoomed\", {\r\n /**\r\n * A smallest value in axis scale within current zoom.\r\n *\r\n * @return Min zoom value\r\n */\r\n get: function () {\r\n if (!this.syncWithAxis) {\r\n return $math.max(this.min, this._minZoomed);\r\n }\r\n else {\r\n return this._minZoomed;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"maxZoomed\", {\r\n /**\r\n * A biggest value in axis scale within current zoom.\r\n * @return [description]\r\n */\r\n get: function () {\r\n if (!this.syncWithAxis) {\r\n return $math.min(this.max, this._maxZoomed);\r\n }\r\n else {\r\n return this._maxZoomed;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Updates positioning of Axis breaks after something changes.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n ValueAxis.prototype.fixAxisBreaks = function () {\r\n var _this = this;\r\n _super.prototype.fixAxisBreaks.call(this);\r\n var axisBreaks = this._axisBreaks;\r\n if (axisBreaks && axisBreaks.length > 0) {\r\n // process breaks\r\n axisBreaks.each(function (axisBreak) {\r\n var startValue = axisBreak.adjustedStartValue;\r\n var endValue = axisBreak.adjustedEndValue;\r\n // break difference\r\n var axisBreakDif = endValue - startValue;\r\n var axisBreakGridCount = Math.ceil(axisBreakDif * axisBreak.breakSize) * _this._gridCount / (_this.max - _this.min);\r\n // calculate min, max and step for axis break\r\n var breakMinMaxStep = _this.adjustMinMax(startValue, endValue, axisBreakDif, axisBreakGridCount, true);\r\n axisBreak.adjustedStep = breakMinMaxStep.step;\r\n axisBreak.adjustedMin = breakMinMaxStep.min;\r\n axisBreak.adjustedMax = breakMinMaxStep.max;\r\n });\r\n }\r\n this._difference = this.adjustDifference(this.min, this.max);\r\n };\r\n /**\r\n * Returns value based on position.\r\n *\r\n * Please note that `position` represents position within axis which may be\r\n * zoomed and not correspond to Cursor's `position`.\r\n *\r\n * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n * @param position Relative position on axis (0-1)\r\n * @return Position label\r\n */\r\n ValueAxis.prototype.getPositionLabel = function (position) {\r\n var value = this.positionToValue(position);\r\n return this.numberFormatter.format(value);\r\n };\r\n /**\r\n * Shows Axis tooltip at specific value\r\n *\r\n * @param value Value\r\n */\r\n ValueAxis.prototype.showTooltipAt = function (value) {\r\n this.showTooltipAtPosition(this.valueToPosition(value));\r\n };\r\n /**\r\n * Copies all properties and related data from a different instance of Axis.\r\n *\r\n * @param source Source Axis\r\n */\r\n ValueAxis.prototype.copyFrom = function (source) {\r\n _super.prototype.copyFrom.call(this, source);\r\n this.min = source.min;\r\n this.max = source.max;\r\n this.calculateTotals = source.calculateTotals;\r\n this._baseValue = source.baseValue;\r\n };\r\n Object.defineProperty(ValueAxis.prototype, \"syncWithAxis\", {\r\n /**\r\n * @return Target axis\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"syncWithAxis\");\r\n },\r\n /**\r\n * Enables syncing of grid with another axis.\r\n *\r\n * To enable, set to a reference of the other `ValueAxis`. This axis will try\r\n * to maintain its scale in such way that its grid matches target axis grid.\r\n *\r\n * IMPORTANT #1: At this stage it's an experimental feature. Use it at your\r\n * own risk, as it may not work in 100% of the scenarios.\r\n *\r\n * IMPORTANT #2: `syncWithAxis` is not compatible with `strictMinMax` and\r\n * `sequencedInterpolation` settings.\r\n *\r\n * IMPORTANT #3: `syncWithAxis` is not compatible with scrollbars. Make sure\r\n * you do not add a scrollbar in the same direction as synced axes. For\r\n * example, if you have vertical synced axes, do not add `scrollbarY` on\r\n * your chart. It will create anomalies when used.\r\n *\r\n * IMPORTANT #4: `syncWithAxis` is not compatible with `XYCursor` if it has\r\n * its `behavior` set to either `zoomY` or `zoomXY`.\r\n *\r\n * @since 4.8.1\r\n * @param axis Target axis\r\n */\r\n set: function (axis) {\r\n var _this = this;\r\n if (this.setPropertyValue(\"syncWithAxis\", axis, true)) {\r\n if (axis) {\r\n this._disposers.push(axis.events.on(\"extremeschanged\", this.handleSelectionExtremesChange, this, false));\r\n this._disposers.push(axis.events.on(\"selectionextremeschanged\", this.handleSelectionExtremesChange, this, false));\r\n this._disposers.push(axis.events.on(\"startendchanged\", this.handleSelectionExtremesChange, this, false));\r\n this.events.on(\"shown\", this.handleSelectionExtremesChange, this, false);\r\n this.events.on(\"maxsizechanged\", function () {\r\n _this.clearCache();\r\n _this._disposers.push(registry.events.once(\"exitframe\", function () {\r\n _this.handleSelectionExtremesChange();\r\n }));\r\n }, this, false);\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxis.prototype, \"treatZeroAs\", {\r\n /**\r\n * @return Zero replacement value\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"treatZeroAs\");\r\n },\r\n /**\r\n * If set, zero values will be treated as this value.\r\n *\r\n * It is useful if you need to use data with zero-values on a logarithmic\r\n * axis scale.\r\n *\r\n * @since 4.9.34\r\n * @param value Zero replacement value\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"treatZeroAs\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Syncs with a target axis.\r\n *\r\n * @param min Min\r\n * @param max Max\r\n * @param step Step\r\n */\r\n ValueAxis.prototype.syncAxes = function (min, max, step) {\r\n var axis = this.syncWithAxis;\r\n if (axis) {\r\n if (!$type.isNumber(min)) {\r\n min = this.min;\r\n }\r\n if (!$type.isNumber(max)) {\r\n max = this.max;\r\n }\r\n if (!$type.isNumber(step)) {\r\n step = this._step;\r\n }\r\n var count = Math.round((axis.maxZoomed - axis.minZoomed) / axis.step);\r\n var currentCount = Math.round((max - min) / step);\r\n if ($type.isNumber(count) && $type.isNumber(currentCount)) {\r\n var synced = false;\r\n var c = 0;\r\n var diff = (max - min) * 0.01;\r\n var omin = min;\r\n var omax = max;\r\n var ostep = step;\r\n while (synced != true) {\r\n synced = this.checkSync(omin, omax, ostep, count);\r\n c++;\r\n if (c > 1000) {\r\n synced = true;\r\n }\r\n if (!synced) {\r\n //omin = min - diff * c;\r\n if (c / 3 == Math.round(c / 3)) {\r\n omin = min - diff * c;\r\n if (min >= 0 && omin < 0) {\r\n omin = 0;\r\n }\r\n }\r\n else {\r\n omax = max + diff * c;\r\n if (omax <= 0 && omax > 0) {\r\n omax = 0;\r\n }\r\n }\r\n var minMaxStep = this.adjustMinMax(omin, omax, omax - omin, this._gridCount, true);\r\n omin = minMaxStep.min;\r\n omax = minMaxStep.max;\r\n ostep = minMaxStep.step;\r\n }\r\n else {\r\n min = omin;\r\n max = omax;\r\n step = ostep;\r\n }\r\n }\r\n }\r\n }\r\n return { min: min, max: max, step: step };\r\n };\r\n /**\r\n * Returns `true` if axis needs to be resunced with some other axis.\r\n */\r\n ValueAxis.prototype.checkSync = function (min, max, step, count) {\r\n var currentCount = (max - min) / step;\r\n for (var i = 1; i < count; i++) {\r\n if ($math.round(currentCount / i, 1) == count || currentCount * i == count) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n /**\r\n * Processes JSON-based config before it is applied to the object.\r\n *\r\n * @ignore Exclude from docs\r\n * @param config Config\r\n */\r\n ValueAxis.prototype.processConfig = function (config) {\r\n if (config) {\r\n // Set up axes\r\n if ($type.hasValue(config.syncWithAxis) && $type.isString(config.syncWithAxis)) {\r\n if (this.map.hasKey(config.syncWithAxis)) {\r\n config.syncWithAxis = this.map.getKey(config.syncWithAxis);\r\n }\r\n else {\r\n this.processingErrors.push(\"[ValueAxis] No axis with id \\\"\" + config.syncWithAxis + \"\\\" found for `syncWithAxis`\");\r\n delete config.xAxis;\r\n }\r\n }\r\n }\r\n _super.prototype.processConfig.call(this, config);\r\n };\r\n ValueAxis.prototype._saveMinMax = function (_min, _max) {\r\n };\r\n return ValueAxis;\r\n}(Axis));\r\nexport { ValueAxis };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ValueAxis\"] = ValueAxis;\r\nregistry.registeredClasses[\"ValueAxisDataItem\"] = ValueAxisDataItem;\r\n//# sourceMappingURL=ValueAxis.js.map","/**\r\n * A module which defines functionality related to Value Axis Break.\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisBreak } from \"./AxisBreak\";\r\nimport { registry } from \"../../core/Registry\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Base class to define \"breaks\" on value axis.\r\n *\r\n * A \"break\" can be used to \"cut out\" specific ranges of the axis scale, e.g.\r\n * when comparing columns with relatively similar values, it would make sense\r\n * to cut out their mid section, so that their tip differences are more\r\n * prominent.\r\n *\r\n * @see {@link IValueAxisBreakEvents} for a list of available events\r\n * @see {@link IValueAxisBreakAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nvar ValueAxisBreak = /** @class */ (function (_super) {\r\n __extends(ValueAxisBreak, _super);\r\n /**\r\n * Constructor\r\n */\r\n function ValueAxisBreak() {\r\n var _this = _super.call(this) || this;\r\n _this.className = \"ValueAxisBreak\";\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n Object.defineProperty(ValueAxisBreak.prototype, \"startPosition\", {\r\n /**\r\n * Pixel position of the break's start.\r\n *\r\n * @return Position (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n if (this.axis) {\r\n return this.axis.valueToPosition(this.adjustedStartValue);\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(ValueAxisBreak.prototype, \"endPosition\", {\r\n /**\r\n * Pixel position of the break's end.\r\n *\r\n * @return Position (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n if (this.axis) {\r\n return this.axis.valueToPosition(this.adjustedEndValue);\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return ValueAxisBreak;\r\n}(AxisBreak));\r\nexport { ValueAxisBreak };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ValueAxisBreak\"] = ValueAxisBreak;\r\n//# sourceMappingURL=ValueAxisBreak.js.map","/**\r\n * Cursor module\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Container } from \"../../core/Container\";\r\nimport { getInteraction } from \"../../core/interaction/Interaction\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\nimport { MouseCursorStyle } from \"../../core/interaction/Mouse\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $dom from \"../../core/utils/DOM\";\r\nimport { system } from \"../../core/System\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Main Cursor class with common cursor functionality.\r\n *\r\n * Chart-specific cursors must extend this class.\r\n *\r\n * @see {@link ICursorEvents} for a list of available events\r\n * @see {@link ICursorAdapters} for a list of available Adapters\r\n * @todo Add description, examples\r\n * @todo Should we allow changing `_generalBehavior`?\r\n */\r\nvar Cursor = /** @class */ (function (_super) {\r\n __extends(Cursor, _super);\r\n /**\r\n * Constructor\r\n */\r\n function Cursor() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n /**\r\n * Current cursor position during selection.\r\n *\r\n * @todo Better description\r\n */\r\n _this.point = { x: 0, y: 0 };\r\n /**\r\n * Specifies the rules when cursor needs to be moved or hidden.\r\n */\r\n _this._stick = \"none\";\r\n _this.className = \"Cursor\";\r\n // Set defaults\r\n _this.width = percent(100);\r\n _this.height = percent(100);\r\n _this.shouldClone = false;\r\n _this.hide(0);\r\n _this.trackable = true;\r\n _this.clickable = true;\r\n _this.isMeasured = false;\r\n // Add events on body to trigger down and up events (to start zooming or\r\n // selection)\r\n var interaction = getInteraction();\r\n _this._disposers.push(interaction.body.events.on(\"down\", _this.handleCursorDown, _this));\r\n _this._disposers.push(interaction.body.events.on(\"up\", _this.handleCursorUp, _this));\r\n _this._disposers.push(interaction.body.events.on(\"track\", _this.handleCursorMove, _this));\r\n // Apply theme\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n /**\r\n * Handle pointer movement in document and update cursor position as needed.\r\n *\r\n * @ignore Exclude from docs\r\n * @param event Event\r\n */\r\n Cursor.prototype.handleCursorMove = function (event) {\r\n if (!this.interactionsEnabled || (this.interactions.isTouchProtected && event.touch)) {\r\n return;\r\n }\r\n if (((this._generalBehavior != \"zoom\" && this._generalBehavior != \"pan\") || !this.downPoint) && !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n // We want to let zoom/pan continue even if cursor is outside chart area\r\n if (!this.isHidden || !this.isHiding) {\r\n this.hide();\r\n }\r\n return;\r\n }\r\n var local = $utils.documentPointToSprite(event.pointer.point, this);\r\n if (this._stick == \"hard\" && this._stickPoint) {\r\n local = this._stickPoint;\r\n }\r\n if (this._stick == \"soft\" && this._stickPoint) {\r\n if (!this.fitsToBounds(local)) {\r\n local = this._stickPoint;\r\n }\r\n }\r\n if (this._adapterO) {\r\n this._adapterO.apply(\"cursorPoint\", local);\r\n }\r\n this.triggerMove(local);\r\n return local;\r\n };\r\n /**\r\n * Hides actual SVG elements and handles hiding animations.\r\n *\r\n * @param duration Fade out duration (ms)\r\n * @return Fade out duration (ms)\r\n * @ignore\r\n */\r\n Cursor.prototype.hideReal = function (duration) {\r\n if ((this._stick == \"hard\" || this._stick == \"soft\") && this._stickPoint) {\r\n return;\r\n }\r\n return _super.prototype.hideReal.call(this, duration);\r\n };\r\n /**\r\n * Places the cursor at specific point.\r\n *\r\n * The second parameter has following options:\r\n *\r\n * `\"none\"` - placed cursor will only be there until mouse/touch moves, then\r\n * it either moves to a new place (if pointer over plot area) or is hidden.\r\n *\r\n * `\"soft\"` - cursor will stay in the place if mouse/touch is happening\r\n * outside chart, but will move to a new place whe plot area is hovered or\r\n * touched.\r\n *\r\n * `\"hard\"` - cursor will stay in place no matter what, until it is moved by\r\n * another `triggerMove()` call.\r\n *\r\n * The third parameter - `force` (since `4.9.5`) - if set to `true` will\r\n * make cursor execute all of the actions associated with cursor move,\r\n * including line redraws, tooltip updates, etc. Useful when underlying\r\n * chart data is dynamically being updated.\r\n *\r\n * @param point Point to place cursor at\r\n * @param stick Level of cursor stickiness to the place\r\n * @param force Force cursor move\r\n */\r\n Cursor.prototype.triggerMove = function (point, stick, force) {\r\n point.x = $math.round(point.x, 1);\r\n point.y = $math.round(point.y, 1);\r\n if (stick) {\r\n this._stick = stick;\r\n }\r\n if (stick == \"hard\" || stick == \"soft\") {\r\n this._stickPoint = point;\r\n }\r\n this.triggerMoveReal(point, force);\r\n };\r\n /**\r\n * Places the cursor at specific point.\r\n *\r\n * @param point Point to place cursor at\r\n */\r\n Cursor.prototype.triggerMoveReal = function (point, force) {\r\n if (this.point.x != point.x || this.point.y != point.y || force) {\r\n this.point = point;\r\n this.invalidatePosition();\r\n // hide cursor if it's out of bounds\r\n if (this.fitsToBounds(point)) {\r\n this.show(0);\r\n }\r\n else {\r\n // unless we are selecting (mouse is down)\r\n if (!this.downPoint) {\r\n this.hide(0);\r\n }\r\n }\r\n if (this.visible) {\r\n this.getPositions();\r\n this.dispatch(\"cursorpositionchanged\"); // not good to dispatch later (check step count example)\r\n }\r\n }\r\n };\r\n /**\r\n * Simulates pressing down (click/touch) action by a cursor.\r\n *\r\n * @param point Point of action\r\n */\r\n Cursor.prototype.triggerDown = function (point) {\r\n this.triggerDownReal(point);\r\n };\r\n /**\r\n * Simulates pressing down (click/touch) action by a cursor.\r\n *\r\n * @param point Point of action\r\n */\r\n Cursor.prototype.triggerDownReal = function (point) {\r\n switch (this._generalBehavior) {\r\n case \"zoom\":\r\n this.dispatchImmediately(\"zoomstarted\");\r\n break;\r\n case \"select\":\r\n this.dispatchImmediately(\"selectstarted\");\r\n break;\r\n case \"pan\":\r\n this.dispatchImmediately(\"panstarted\");\r\n getInteraction().setGlobalStyle(MouseCursorStyle.grabbing);\r\n break;\r\n }\r\n };\r\n /**\r\n * Simulates the action of release of the mouse down / touch.\r\n *\r\n * @param point Point of action\r\n */\r\n Cursor.prototype.triggerUp = function (point) {\r\n this.triggerUpReal(point);\r\n };\r\n /**\r\n * Simulates the action of release of the mouse down / touch.\r\n *\r\n * @param point Point of action\r\n */\r\n Cursor.prototype.triggerUpReal = function (point) {\r\n system.requestFrame();\r\n this.updatePoint(this.upPoint);\r\n var interaction = getInteraction();\r\n if ($math.getDistance(this._upPointOrig, this._downPointOrig) > interaction.getHitOption(this.interactions, \"hitTolerance\")) {\r\n switch (this._generalBehavior) {\r\n case \"zoom\":\r\n this.dispatch(\"zoomended\");\r\n break;\r\n case \"select\":\r\n this.dispatch(\"selectended\");\r\n break;\r\n case \"pan\":\r\n this.dispatch(\"panended\");\r\n interaction.setGlobalStyle(MouseCursorStyle.default);\r\n break;\r\n }\r\n this.downPoint = undefined;\r\n this.updateSelection();\r\n }\r\n /*\r\n else {\r\n \r\n if(this._generalBehavior == \"select\"){\r\n this.dispatchImmediately(\"selectended\");\r\n }\r\n this.dispatchImmediately(\"behaviorcanceled\");\r\n interaction.setGlobalStyle(MouseCursorStyle.default);\r\n this.downPoint = undefined;\r\n }*/\r\n };\r\n /**\r\n * Updates selection dimensions on size change.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n Cursor.prototype.updateSelection = function () {\r\n };\r\n /**\r\n * Updates cursors current positions.\r\n */\r\n Cursor.prototype.getPositions = function () {\r\n // positions are used by axes or series\r\n this.xPosition = this.point.x / this.innerWidth;\r\n this.yPosition = 1 - this.point.y / this.innerHeight;\r\n };\r\n /**\r\n * Handles pointer down event so we can start zoom or selection.\r\n *\r\n * @ignore Exclude from docs\r\n * @param event Original event\r\n */\r\n Cursor.prototype.handleCursorDown = function (event) {\r\n if (!this.interactionsEnabled || (this.interactions.isTouchProtected && event.touch) || !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n return;\r\n }\r\n // Initiate blur so that whatever focused element on the page is unselected\r\n $dom.blur();\r\n // Get local point\r\n var local = $utils.documentPointToSprite(event.pointer.point, this);\r\n if (this._stick == \"hard\" && this._stickPoint) {\r\n local = this._stickPoint;\r\n }\r\n if (this._adapterO) {\r\n this._adapterO.apply(\"cursorPoint\", local);\r\n }\r\n if (!this.fitsToBounds(local)) {\r\n return;\r\n }\r\n this._downPointOrig = { x: local.x, y: local.y };\r\n // We need to cancel the event to prevent gestures on touch devices\r\n if (event.event.cancelable && this.shouldPreventGestures(event.touch) && this.fitsToBounds(local)) {\r\n event.event.preventDefault();\r\n }\r\n // Make this happen\r\n this.triggerMove(local);\r\n this.triggerDown(local);\r\n };\r\n /**\r\n * Determines whether Cursor should prevent default action on move.\r\n *\r\n * Child classes should override this as necessary.\r\n *\r\n * @return Prevent default?\r\n */\r\n Cursor.prototype.shouldPreventGestures = function (touch) {\r\n return true;\r\n };\r\n /**\r\n * Updates the coordinates of where pointer down event occurred\r\n * (was pressed).\r\n */\r\n Cursor.prototype.updatePoint = function (point) {\r\n };\r\n /**\r\n * Handles pointer up event - finishes zoom or selection action.\r\n *\r\n * @ignore Exclude from docs\r\n * @param event Original event\r\n */\r\n Cursor.prototype.handleCursorUp = function (event) {\r\n if (!this.interactionsEnabled) {\r\n return;\r\n }\r\n if (!this.downPoint && !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n return;\r\n }\r\n var local = $utils.documentPointToSprite(event.pointer.point, this);\r\n if (this._adapterO) {\r\n this._adapterO.apply(\"cursorPoint\", local);\r\n }\r\n if (!this.downPoint || !this.fitsToBounds(this.downPoint)) {\r\n return;\r\n }\r\n if (this._stick == \"hard\" && this._stickPoint) {\r\n local = this._stickPoint;\r\n }\r\n this._upPointOrig = { x: local.x, y: local.y };\r\n this.triggerMove(local);\r\n this.triggerUp(local);\r\n };\r\n Object.defineProperty(Cursor.prototype, \"chart\", {\r\n /**\r\n * @return Chart\r\n */\r\n get: function () {\r\n return this._chart;\r\n },\r\n /**\r\n * A reference to a [[Chart]] the cursor belongs to.\r\n *\r\n * @param value Chart\r\n */\r\n set: function (value) {\r\n this._chart = value;\r\n if ($type.hasValue(this._chart.plotContainer)) {\r\n getInteraction().lockElement(this._chart.plotContainer.interactions);\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Cursor;\r\n}(Container));\r\nexport { Cursor };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"Cursor\"] = Cursor;\r\n//# sourceMappingURL=Cursor.js.map","import { __extends } from \"tslib\";\r\nimport { XYCursor } from \"./XYCursor\";\r\nimport { Percent, percent } from \"../../core/utils/Percent\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * Cursor for [[RadarChart]].\r\n *\r\n * @see {@link IRadarCursorEvents} for a list of available events\r\n * @see {@link IRadarCursorAdapters} for a list of available Adapters\r\n */\r\nvar RadarCursor = /** @class */ (function (_super) {\r\n __extends(RadarCursor, _super);\r\n /**\r\n * Constructor\r\n */\r\n function RadarCursor() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n _this.className = \"RadarCursor\";\r\n _this.radius = percent(100);\r\n _this.innerRadius = percent(0);\r\n // Apply theme\r\n _this.applyTheme();\r\n _this.mask = undefined;\r\n return _this;\r\n }\r\n /**\r\n * Checks if point is within bounds of a container.\r\n *\r\n * @ignore Exclude from docs\r\n * @param point Point to check\r\n * @return Fits within container?\r\n */\r\n RadarCursor.prototype.fitsToBounds = function (point) {\r\n var radius = $math.getDistance(point);\r\n //if(!$math.isAngleInRange(angle, this.startAngle, this.endAngle)){\r\n //return false;\r\n //}\r\n if (radius < this.truePixelRadius + 1 && radius > this.pixelInnerRadius - 1) { // ok to add/remove some\r\n return true;\r\n }\r\n return false;\r\n };\r\n Object.defineProperty(RadarCursor.prototype, \"startAngle\", {\r\n /**\r\n * @return Start angle\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"startAngle\");\r\n },\r\n /**\r\n * Starting angle of the cursor's radial line.\r\n *\r\n * @param value Start angle\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"startAngle\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(RadarCursor.prototype, \"endAngle\", {\r\n /**\r\n * @return End angle\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"endAngle\");\r\n },\r\n /**\r\n * End angle of the cursor's radial line.\r\n *\r\n * @param value End angle\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"endAngle\", value, true);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n RadarCursor.prototype.triggerMoveReal = function (point, force) {\r\n if (!this.xAxis || (this.xAxis && (!this.xAxis.cursorTooltipEnabled || this.xAxis.tooltip.disabled))) {\r\n this.updateLineX(this.point);\r\n }\r\n if (!this.yAxis || (this.yAxis && (!this.yAxis.cursorTooltipEnabled || this.yAxis.tooltip.disabled))) {\r\n this.updateLineY(this.point);\r\n }\r\n this.updateSelection();\r\n _super.prototype.triggerMoveReal.call(this, point, force);\r\n };\r\n /**\r\n * (Re)draws the horizontal (circular) cursor's line.\r\n *\r\n * @param point New target point\r\n */\r\n RadarCursor.prototype.updateLineX = function (point) {\r\n var radius = this.pixelRadius;\r\n var startAngle = this.startAngle;\r\n var endAngle = this.endAngle;\r\n var innerRadius = this.pixelInnerRadius;\r\n if (radius > 0 && $type.isNumber(startAngle) && $type.isNumber(endAngle) && $type.isNumber(innerRadius)) {\r\n var angle = $math.fitAngleToRange($math.getAngle(point), startAngle, endAngle);\r\n var path = void 0;\r\n if (this.lineX && this.lineX.visible) {\r\n this.lineX.moveTo({ x: 0, y: 0 });\r\n // fill\r\n if (this.xAxis && this.fullWidthLineX) {\r\n var startPoint = this.xAxis.currentItemStartPoint;\r\n var endPoint = this.xAxis.currentItemEndPoint;\r\n if (startPoint && endPoint) {\r\n var fillStartAngle = $math.fitAngleToRange($math.getAngle(startPoint), startAngle, endAngle);\r\n var fillEndAngle = $math.fitAngleToRange($math.getAngle(endPoint), startAngle, endAngle);\r\n var arc = fillEndAngle - fillStartAngle;\r\n // clockwise\r\n // this is needed, normalizeAngle doesn't solve it\r\n if (startAngle < endAngle) {\r\n if (arc < 0) {\r\n arc += 360;\r\n }\r\n }\r\n // ccw\r\n else {\r\n if (arc > 0) {\r\n arc -= 360;\r\n }\r\n }\r\n angle -= arc / 2;\r\n path = $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) })\r\n + $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) })\r\n + $path.arcTo(angle, arc, radius)\r\n + $path.lineTo({ x: innerRadius * $math.cos(angle + arc), y: innerRadius * $math.sin(angle + arc) })\r\n + $path.arcTo(angle + arc, -arc, innerRadius);\r\n }\r\n }\r\n // line\r\n if (!path) {\r\n path = $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) }) + $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n }\r\n this.lineX.path = path;\r\n }\r\n }\r\n };\r\n /**\r\n * (Re)draws the vertical (radial) cursor's line.\r\n *\r\n * @param point New target point\r\n */\r\n RadarCursor.prototype.updateLineY = function (point) {\r\n if (this.lineY && this.lineY.visible) {\r\n var startAngle = this.startAngle;\r\n var endAngle = this.endAngle;\r\n var truePixelRadius = this.truePixelRadius;\r\n var radius = $math.fitToRange($math.getDistance(point), 0, this.truePixelRadius);\r\n if ($type.isNumber(radius) && $type.isNumber(startAngle)) {\r\n this.lineY.moveTo({ x: 0, y: 0 });\r\n var path = void 0;\r\n var arc = endAngle - startAngle;\r\n if (this.yAxis && this.fullWidthLineY) {\r\n // fill\r\n var startPoint = this.yAxis.currentItemStartPoint;\r\n var endPoint = this.yAxis.currentItemEndPoint;\r\n if (startPoint && endPoint) {\r\n var innerRadius = $math.fitToRange($math.getDistance(startPoint), 0, truePixelRadius);\r\n radius = $math.fitToRange($math.getDistance(endPoint), 0, truePixelRadius);\r\n path = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, arc, radius);\r\n path += $path.moveTo({ x: innerRadius * $math.cos(endAngle), y: innerRadius * $math.sin(endAngle) }) + $path.arcTo(endAngle, -arc, innerRadius);\r\n }\r\n }\r\n if (!path) {\r\n path = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, endAngle - startAngle, radius);\r\n }\r\n this.lineY.path = path;\r\n }\r\n }\r\n };\r\n /**\r\n * Updates selection dimensions on size change.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n RadarCursor.prototype.updateSelection = function () {\r\n if (this._usesSelection) {\r\n var downPoint = this.downPoint;\r\n if (downPoint) {\r\n var point = this.point;\r\n var radius = this.pixelRadius;\r\n var truePixelRadius = this.truePixelRadius;\r\n var innerRadius = this.pixelInnerRadius;\r\n var startAngle = Math.min(this.startAngle, this.endAngle);\r\n var endAngle = Math.max(this.startAngle, this.endAngle);\r\n var downAngle = $math.fitAngleToRange($math.getAngle(downPoint), startAngle, endAngle);\r\n var angle = $math.fitAngleToRange($math.getAngle(point), startAngle, endAngle);\r\n var downRadius = $math.getDistance(downPoint);\r\n if (downRadius < truePixelRadius) {\r\n var currentRadius = $math.fitToRange($math.getDistance(point), 0, truePixelRadius);\r\n this._prevAngle = angle;\r\n var path = $path.moveTo({ x: 0, y: 0 });\r\n var downSin = $math.sin(downAngle);\r\n var downCos = $math.cos(downAngle);\r\n var sin = $math.sin(angle);\r\n var cos = $math.cos(angle);\r\n var behavior = this.behavior;\r\n if (behavior == \"zoomX\" || behavior == \"selectX\") {\r\n path += $path.lineTo({ x: radius * downCos, y: radius * downSin }) + $path.arcTo(downAngle, angle - downAngle, radius) + $path.lineTo({ x: innerRadius * cos, y: innerRadius * sin }) + $path.arcTo(angle, downAngle - angle, innerRadius);\r\n }\r\n else if (behavior == \"zoomY\" || behavior == \"selectY\") {\r\n path = $path.moveTo({ x: currentRadius * $math.cos(startAngle), y: currentRadius * $math.sin(startAngle) }) + $path.arcTo(startAngle, endAngle - startAngle, currentRadius) + $path.lineTo({ x: downRadius * $math.cos(endAngle), y: downRadius * $math.sin(endAngle) }) + $path.arcTo(endAngle, startAngle - endAngle, downRadius) + $path.closePath();\r\n }\r\n else if (behavior == \"zoomXY\") {\r\n path = $path.moveTo({ x: currentRadius * $math.cos(downAngle), y: currentRadius * $math.sin(downAngle) }) + $path.arcTo(downAngle, angle - downAngle, currentRadius) + $path.lineTo({ x: downRadius * $math.cos(angle), y: downRadius * $math.sin(angle) }) + $path.arcTo(angle, downAngle - angle, downRadius) + $path.closePath();\r\n }\r\n this.selection.path = path;\r\n }\r\n this.selection.moveTo({ x: 0, y: 0 });\r\n }\r\n }\r\n };\r\n /**\r\n * Updates cursors current positions.\r\n */\r\n RadarCursor.prototype.getPositions = function () {\r\n // positions are used by axes or series\r\n var chart = this.chart;\r\n if (chart) {\r\n var innerRadius = this.pixelInnerRadius;\r\n var radius = this.truePixelRadius - innerRadius;\r\n var startAngle = this.startAngle;\r\n var endAngle = this.endAngle;\r\n var angle = $math.fitAngleToRange($math.getAngle(this.point), startAngle, endAngle);\r\n var xPosition = ((angle - startAngle) / (endAngle - startAngle));\r\n this.xPosition = xPosition;\r\n this.yPosition = $math.fitToRange(($math.getDistance(this.point) - innerRadius) / radius, 0, 1);\r\n }\r\n };\r\n /**\r\n * Overriding inherited method, so that nothing happens when it's triggered.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n RadarCursor.prototype.updatePoint = function (point) {\r\n };\r\n /**\r\n * Updates Cursor's position when axis tooltip changes horizontal position.\r\n *\r\n * @param event Axis event\r\n */\r\n RadarCursor.prototype.handleXTooltipPosition = function (event) {\r\n if (this.xAxis.cursorTooltipEnabled) {\r\n var tooltip = this.xAxis.tooltip;\r\n this.updateLineX($utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this));\r\n }\r\n };\r\n /**\r\n * Updates Cursor's position when axis tooltip changes vertical position.\r\n *\r\n * @todo Description\r\n * @param event Axis event\r\n */\r\n RadarCursor.prototype.handleYTooltipPosition = function (event) {\r\n if (this.yAxis.cursorTooltipEnabled) {\r\n var tooltip = this.yAxis.tooltip;\r\n this.updateLineY($utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this));\r\n }\r\n };\r\n /**\r\n * needs to be overriden\r\n * @ignore\r\n */\r\n RadarCursor.prototype.updateLinePositions = function (point) {\r\n };\r\n /**\r\n * [getRanges description]\r\n *\r\n * @todo Description\r\n */\r\n RadarCursor.prototype.getRanges = function () {\r\n var downPoint = this.downPoint;\r\n if (downPoint) {\r\n var upPoint = this.upPoint;\r\n var chart = this.chart;\r\n if (chart) {\r\n var radius = this.pixelRadius;\r\n var startAngle = this.startAngle;\r\n var endAngle = this.endAngle;\r\n var downAngle = $math.fitAngleToRange($math.getAngle(downPoint), this.startAngle, this.endAngle);\r\n var upAngle = $math.fitAngleToRange($math.getAngle(upPoint), this.startAngle, this.endAngle);\r\n var downRadius = $math.fitToRange($math.getDistance(downPoint), 0, radius);\r\n var upRadius = $math.fitToRange($math.getDistance(upPoint), 0, radius);\r\n var startX = 0;\r\n var endX = 1;\r\n var startY = 0;\r\n var endY = 1;\r\n var behavior = this.behavior;\r\n if (behavior == \"zoomX\" || behavior == \"selectX\" || behavior == \"zoomXY\" || behavior == \"selectXY\") {\r\n var arc = endAngle - startAngle;\r\n startX = $math.round((downAngle - startAngle) / arc, 5);\r\n endX = $math.round((upAngle - startAngle) / arc, 5);\r\n }\r\n if (behavior == \"zoomY\" || behavior == \"selectY\" || behavior == \"zoomXY\" || behavior == \"selectXY\") {\r\n startY = $math.round(downRadius / radius, 5);\r\n endY = $math.round(upRadius / radius, 5);\r\n }\r\n this.xRange = { start: Math.min(startX, endX), end: Math.max(startX, endX) };\r\n this.yRange = { start: Math.min(startY, endY), end: Math.max(startY, endY) };\r\n if (this.behavior == \"selectX\" || this.behavior == \"selectY\" || this.behavior == \"selectXY\") {\r\n // void\r\n }\r\n else {\r\n this.selection.hide();\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n * Overriding inherited method, so that nothing happens when `updateSize`\r\n * is triggered.\r\n *\r\n * RadarCursor is quite complicated and needs own sizing logic.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n RadarCursor.prototype.updateSize = function () { };\r\n Object.defineProperty(RadarCursor.prototype, \"radius\", {\r\n /**\r\n * @return Outer radius\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"radius\");\r\n },\r\n /**\r\n * Outer radius of the cursor's circular line.\r\n * Absolute (px) or relative ([[Percent]]).\r\n *\r\n * @param value Outer radius\r\n */\r\n set: function (value) {\r\n this.setPercentProperty(\"radius\", value, false, false, 10, false);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(RadarCursor.prototype, \"pixelRadius\", {\r\n /**\r\n * Outer radius of the circular line in pixels.\r\n *\r\n * @return Outer radius (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n return $utils.relativeRadiusToValue(this.radius, this.truePixelRadius);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(RadarCursor.prototype, \"truePixelRadius\", {\r\n /**\r\n * [truePixelRadius description]\r\n *\r\n * @todo Description\r\n * @return Outer radius (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n return $utils.relativeToValue(percent(100), $math.min(this.innerWidth / 2, this.innerHeight / 2));\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(RadarCursor.prototype, \"innerRadius\", {\r\n /**\r\n * @return Inner radius\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"innerRadius\");\r\n },\r\n /**\r\n * Inner radius of the cursor's circular line.\r\n * Absolute (px) or relative ([[Percent]]).\r\n *\r\n * @param value Inner radius\r\n */\r\n set: function (value) {\r\n this.setPercentProperty(\"innerRadius\", value, false, false, 10, false);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(RadarCursor.prototype, \"pixelInnerRadius\", {\r\n /**\r\n * Inner radius of the circular line in pixels.\r\n *\r\n * @return Inner radius (px)\r\n * @readonly\r\n */\r\n get: function () {\r\n var innerRadius = this.innerRadius;\r\n if (innerRadius instanceof Percent) {\r\n innerRadius = percent(100 * innerRadius.value * this.chart.innerRadiusModifyer);\r\n }\r\n return $utils.relativeRadiusToValue(innerRadius, this.truePixelRadius) || 0;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n RadarCursor.prototype.fixPoint = function (point) {\r\n // overriding xy method\r\n return point;\r\n };\r\n return RadarCursor;\r\n}(XYCursor));\r\nexport { RadarCursor };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarCursor\"] = RadarCursor;\r\n//# sourceMappingURL=RadarCursor.js.map","/**\r\n * Cursor for XY chart\r\n */\r\nimport { __extends } from \"tslib\";\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Cursor } from \"./Cursor\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { MutableValueDisposer, MultiDisposer } from \"../../core/utils/Disposer\";\r\nimport { ValueAxis } from \"../axes/ValueAxis\";\r\nimport { DateAxis } from \"../axes/DateAxis\";\r\nimport { XYSeries } from \"../series/XYSeries\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { color } from \"../../core/utils/Color\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport { getInteraction } from \"../../core/interaction/Interaction\";\r\nimport { MouseCursorStyle } from \"../../core/interaction/Mouse\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $array from \"../../core/utils/Array\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n/**\r\n * A cursor used on [[XYChart]].\r\n *\r\n * @see {@link IXYCursorEvents} for a list of available events\r\n * @see {@link IXYCursorAdapters} for a list of available Adapters\r\n * @todo Add description, examples\r\n */\r\nvar XYCursor = /** @class */ (function (_super) {\r\n __extends(XYCursor, _super);\r\n /**\r\n * Constructor\r\n */\r\n function XYCursor() {\r\n var _this = \r\n // Init\r\n _super.call(this) || this;\r\n /**\r\n * Vertical cursor line element.\r\n */\r\n _this._lineX = new MutableValueDisposer();\r\n /**\r\n * Horizontal cursor line element.\r\n */\r\n _this._lineY = new MutableValueDisposer();\r\n /**\r\n * Horizontal [[Axis]].\r\n */\r\n _this._xAxis = new MutableValueDisposer();\r\n /**\r\n * Vertical [[Axis]].\r\n */\r\n _this._yAxis = new MutableValueDisposer();\r\n _this._snapToDisposers = [];\r\n _this.className = \"XYCursor\";\r\n // Defaults\r\n _this.behavior = \"zoomX\";\r\n _this.maxPanOut = 0.1;\r\n var interfaceColors = new InterfaceColorSet();\r\n _this.snapOnPan = true;\r\n // Create selection element\r\n var selection = _this.createChild(Sprite);\r\n selection.shouldClone = false;\r\n selection.fillOpacity = 0.2;\r\n selection.fill = interfaceColors.getFor(\"alternativeBackground\");\r\n selection.isMeasured = false;\r\n selection.visible = false;\r\n selection.interactionsEnabled = false;\r\n _this.selection = selection;\r\n _this._disposers.push(_this.selection);\r\n // Create cursor's vertical line\r\n var lineX = _this.createChild(Sprite);\r\n lineX.shouldClone = false;\r\n lineX.stroke = interfaceColors.getFor(\"grid\");\r\n lineX.fill = color();\r\n lineX.strokeDasharray = \"3,3\";\r\n lineX.isMeasured = false;\r\n lineX.strokeOpacity = 0.4;\r\n lineX.interactionsEnabled = false;\r\n lineX.y = 0; // important\r\n _this.lineX = lineX;\r\n _this._disposers.push(_this.lineX);\r\n // Create cursor's horizontal line\r\n var lineY = _this.createChild(Sprite);\r\n lineY.shouldClone = false;\r\n lineY.stroke = interfaceColors.getFor(\"grid\");\r\n lineY.fill = color();\r\n lineY.strokeDasharray = \"3,3\";\r\n lineY.isMeasured = false;\r\n lineY.strokeOpacity = 0.4;\r\n lineY.interactionsEnabled = false;\r\n lineY.x = 0; // important\r\n _this.lineY = lineY;\r\n _this._disposers.push(_this.lineY);\r\n // Add handler for size changes\r\n _this.events.on(\"sizechanged\", _this.updateSize, _this, false);\r\n _this._disposers.push(_this._lineX);\r\n _this._disposers.push(_this._lineY);\r\n _this._disposers.push(_this._xAxis);\r\n _this._disposers.push(_this._yAxis);\r\n _this.mask = _this;\r\n _this.hideSeriesTooltipsOnSelection = true;\r\n // Apply theme\r\n _this.applyTheme();\r\n return _this;\r\n }\r\n /**\r\n * Updates cursor element dimensions on size change.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n XYCursor.prototype.updateSize = function () {\r\n if (this.lineX) {\r\n this.lineX.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: 0, y: this.innerHeight });\r\n }\r\n if (this.lineY) {\r\n this.lineY.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: this.innerWidth, y: 0 });\r\n }\r\n };\r\n /**\r\n * Updates selection dimensions on size change.\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n XYCursor.prototype.updateSelection = function () {\r\n if (this._usesSelection) {\r\n var downPoint = this.downPoint;\r\n var behavior = this.behavior;\r\n if (downPoint) {\r\n var point = this.point;\r\n if (this.lineX) {\r\n point.x = this.lineX.pixelX;\r\n }\r\n if (this.lineY) {\r\n point.y = this.lineY.pixelY;\r\n }\r\n var selection = this.selection;\r\n var x = Math.min(point.x, downPoint.x);\r\n var y = Math.min(point.y, downPoint.y);\r\n var w = $math.round(Math.abs(downPoint.x - point.x), this._positionPrecision);\r\n var h = $math.round(Math.abs(downPoint.y - point.y), this._positionPrecision);\r\n switch (behavior) {\r\n case \"zoomX\":\r\n y = 0;\r\n h = this.pixelHeight;\r\n break;\r\n case \"zoomY\":\r\n x = 0;\r\n w = this.pixelWidth;\r\n break;\r\n case \"selectX\":\r\n y = 0;\r\n h = this.pixelHeight;\r\n break;\r\n case \"selectY\":\r\n x = 0;\r\n w = this.pixelWidth;\r\n break;\r\n }\r\n selection.x = x;\r\n selection.y = y;\r\n selection.path = $path.rectangle(w, h);\r\n selection.validatePosition(); // otherwise Edge shoes some incorrect size rectangle\r\n }\r\n else {\r\n if (this._generalBehavior != \"select\") {\r\n this.selection.hide();\r\n }\r\n }\r\n }\r\n };\r\n /**\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n XYCursor.prototype.fixPoint = function (point) {\r\n point.x = Math.max(0, point.x);\r\n point.y = Math.max(0, point.y);\r\n point.x = Math.min(this.pixelWidth, point.x);\r\n point.y = Math.min(this.pixelHeight, point.y);\r\n return point;\r\n };\r\n /**\r\n * Places the cursor at specific point.\r\n *\r\n * @param point Point to place cursor at\r\n */\r\n XYCursor.prototype.triggerMoveReal = function (point, force) {\r\n _super.prototype.triggerMoveReal.call(this, point, force);\r\n var snapToSeries = this.snapToSeries;\r\n if ((snapToSeries && !this.downPoint)) {\r\n if (snapToSeries instanceof XYSeries) {\r\n if (snapToSeries.isHidden) {\r\n this.updateLinePositions(point);\r\n }\r\n }\r\n else {\r\n var allHidden_1 = true;\r\n $array.each(snapToSeries, function (s) {\r\n if (!s.isHidden) {\r\n allHidden_1 = false;\r\n }\r\n });\r\n if (allHidden_1) {\r\n this.updateLinePositions(point);\r\n }\r\n }\r\n }\r\n else {\r\n this.updateLinePositions(point);\r\n }\r\n if (this.downPoint && $math.getDistance(this.downPoint, point) > 3) {\r\n if (this._generalBehavior == \"pan\") {\r\n this.getPanningRanges();\r\n this.dispatch(\"panning\");\r\n }\r\n }\r\n };\r\n /**\r\n *\r\n * @ignore Exclude from docs\r\n */\r\n XYCursor.prototype.updateLinePositions = function (point) {\r\n point = this.fixPoint(this.point);\r\n if (this.lineX && this.lineX.visible && !this.xAxis) {\r\n this.lineX.x = point.x;\r\n }\r\n if (this.lineY && this.lineY.visible && !this.yAxis) {\r\n this.lineY.y = point.y;\r\n }\r\n this.updateSelection();\r\n };\r\n XYCursor.prototype.triggerDownReal = function (point) {\r\n if (this.visible && !this.isHiding) {\r\n if (this._generalBehavior == \"select\") {\r\n this.selection.parent = this.parent;\r\n }\r\n if (this.fitsToBounds(point)) {\r\n this.downPoint = { x: point.x, y: point.y };\r\n this.updatePoint(point);\r\n //this.updateLinePositions(point); // otherwise lines won't be in correct position and touch won't work fine\r\n this.point.x = this.downPoint.x;\r\n this.point.y = this.downPoint.y;\r\n var selection = this.selection;\r\n var selectionX = this.downPoint.x;\r\n var selectionY = this.downPoint.y;\r\n if (this._usesSelection) {\r\n selection.x = selectionX;\r\n selection.y = selectionY;\r\n selection.path = \"\";\r\n selection.show();\r\n }\r\n _super.prototype.triggerDownReal.call(this, point);\r\n }\r\n else {\r\n this.downPoint = undefined;\r\n }\r\n }\r\n else {\r\n this.downPoint = undefined;\r\n }\r\n };\r\n /**\r\n * Updates the coordinates of where pointer down event occurred\r\n * (was pressed).\r\n */\r\n XYCursor.prototype.updatePoint = function (point) {\r\n if (this.lineX) {\r\n point.x = this.lineX.pixelX;\r\n }\r\n if (this.lineY) {\r\n point.y = this.lineY.pixelY;\r\n }\r\n };\r\n /**\r\n * Handle action when cursor is released, which should perform an operation\r\n * based on its `behavior`, like zoom.\r\n *\r\n * @param point Release point\r\n */\r\n XYCursor.prototype.triggerUpReal = function (point) {\r\n if (this.hasMoved()) {\r\n if (this.downPoint) {\r\n this.upPoint = point;\r\n this.updatePoint(this.upPoint);\r\n if (this._generalBehavior != \"pan\") {\r\n this.getRanges();\r\n }\r\n if (this._generalBehavior != \"select\") {\r\n this.selection.hide();\r\n }\r\n _super.prototype.triggerUpReal.call(this, point);\r\n }\r\n }\r\n else {\r\n if (this._generalBehavior != \"select\") {\r\n this.selection.hide(0);\r\n }\r\n else {\r\n this.xRange = undefined;\r\n this.yRange = undefined;\r\n this.dispatchImmediately(\"selectended\");\r\n }\r\n // reset cursor style, just in case\r\n if (this._generalBehavior == \"pan\") {\r\n var interaction = getInteraction();\r\n interaction.setGlobalStyle(MouseCursorStyle.default);\r\n }\r\n this.dispatchImmediately(\"behaviorcanceled\");\r\n }\r\n this.downPoint = undefined;\r\n this.dispatch(\"cursorpositionchanged\");\r\n };\r\n /**\r\n * Calculates if the cursor has moved enough based on its `behavior`.\r\n *\r\n * @return Moved?\r\n */\r\n XYCursor.prototype.hasMoved = function () {\r\n var distance;\r\n if (this.behavior == \"zoomX\" || this.behavior == \"panX\") {\r\n distance = $math.getHorizontalDistance(this._upPointOrig, this._downPointOrig);\r\n }\r\n else if (this.behavior == \"zoomY\" || this.behavior == \"panY\") {\r\n distance = $math.getVerticalDistance(this._upPointOrig, this._downPointOrig);\r\n }\r\n else {\r\n distance = $math.getDistance(this._upPointOrig, this._downPointOrig);\r\n }\r\n return distance > getInteraction().getHitOption(this.interactions, \"hitTolerance\");\r\n };\r\n /**\r\n * [getRanges description]\r\n *\r\n * @todo Description\r\n */\r\n XYCursor.prototype.getPanningRanges = function () {\r\n var startX = $math.round(this.downPoint.x / this.innerWidth, 5);\r\n var startY = 1 - $math.round(this.downPoint.y / this.innerHeight, 5);\r\n var currentX = $math.round(this.point.x / this.innerWidth, 5);\r\n var currentY = 1 - $math.round(this.point.y / this.innerHeight, 5);\r\n var deltaX = startX - currentX;\r\n var deltaY = startY - currentY;\r\n this.xRange = { start: deltaX, end: 1 + deltaX };\r\n this.yRange = { start: deltaY, end: 1 + deltaY };\r\n if (this.behavior == \"panX\") {\r\n this.yRange.start = 0;\r\n this.yRange.end = 1;\r\n }\r\n if (this.behavior == \"panY\") {\r\n this.xRange.start = 0;\r\n this.xRange.end = 1;\r\n }\r\n };\r\n /**\r\n * [getRanges description]\r\n *\r\n * @todo Description\r\n */\r\n XYCursor.prototype.getRanges = function () {\r\n if (this.lineX) {\r\n this.upPoint.x = this.lineX.pixelX;\r\n }\r\n if (this.lineY) {\r\n this.upPoint.y = this.lineY.pixelY;\r\n }\r\n // @todo Is this needed?\r\n $utils.used(this.selection);\r\n var startX = $math.round(this.downPoint.x / this.innerWidth, 5);\r\n var endX = $math.round((this.upPoint.x) / this.innerWidth, 5);\r\n var startY = 1 - $math.round(this.downPoint.y / this.innerHeight, 5);\r\n var endY = 1 - $math.round((this.upPoint.y) / this.innerHeight, 5);\r\n this.xRange = { start: $math.min(startX, endX), end: $math.max(startX, endX) };\r\n this.yRange = { start: $math.min(startY, endY), end: $math.max(startY, endY) };\r\n };\r\n Object.defineProperty(XYCursor.prototype, \"behavior\", {\r\n /**\r\n * Behavior\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"behavior\");\r\n },\r\n /**\r\n * Cursor's behavior when it's moved with pointer down:\r\n *\r\n * * `\"zoomX\"` - zooms horizontally.\r\n * * `\"zoomY\"` - zooms vertically.\r\n * * `\"zoomXY\"` - zooms both horizontally and vertically.\r\n * * `\"selectX\"` - selects a range horizontally.\r\n * * `\"selectY\"` - selects a range vertically.\r\n * * `\"selectXY\"` - selects a range both horizontally and vertically.\r\n * * `\"panX\"` - moves (pans) current selection horizontally.\r\n * * `\"panY\"` - moves (pans) current selection vertically.\r\n * * `\"panXY\"` - moves (pans) current selection both horizontally and vertically.\r\n * * `\"none\"` - does nothing with pointer down.\r\n *\r\n * E.g. \"zoomXY\" will mean that pressing a mouse (or touching) over plot area\r\n * and dragging it will start zooming the chart.\r\n *\r\n * NOTE: `\"zoomXY\"` acts differently when used on a `DateAxis`.\r\n * See [this note](https://www.amcharts.com/docs/v4/concepts/chart-cursor/#zoomXY_behavior_and_DateAxis).\r\n *\r\n * @param value Bheavior\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"behavior\", value, true);\r\n this._usesSelection = false;\r\n if (value.indexOf(\"zoom\") != -1) {\r\n this._generalBehavior = \"zoom\";\r\n this._usesSelection = true;\r\n }\r\n if (value.indexOf(\"select\") != -1) {\r\n this._generalBehavior = \"select\";\r\n this._usesSelection = true;\r\n }\r\n if (value.indexOf(\"pan\") != -1) {\r\n this._generalBehavior = \"pan\";\r\n this._usesSelection = false;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Determines whether Cursor should prevent default action on move.\r\n *\r\n * If cursor's behavior is \"none\", it should not obstruct the page scrolling.\r\n *\r\n * @return Prevent default?\r\n */\r\n XYCursor.prototype.shouldPreventGestures = function (touch) {\r\n return (!this.interactions.isTouchProtected || !touch) && this.behavior != \"none\";\r\n };\r\n Object.defineProperty(XYCursor.prototype, \"fullWidthLineX\", {\r\n /**\r\n * @return Full width?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"fullWidthLineX\");\r\n },\r\n /**\r\n * Cursor's horizontal line is expanded to take full width of the related\r\n * Axis' cell/category.\r\n *\r\n * NOTE: this setting will work properly if `xAxis` is set and only in case\r\n * `xAxis` is [[CategoryAxis]] or [[DateAxis]].\r\n *\r\n * @param value Full width?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"fullWidthLineX\", value);\r\n if (!value) {\r\n this.updateSize();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"fullWidthLineY\", {\r\n /**\r\n * @return Full width?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"fullWidthLineY\");\r\n },\r\n /**\r\n * Cursor's vertical line is expanded to take full width of the related\r\n * Axis' cell/category.\r\n *\r\n * NOTE: this setting will work properly if `yAxis` is set and only in case\r\n * `yAxis` is [[CategoryAxis]] or [[DateAxis]].\r\n *\r\n * @param value Full width?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"fullWidthLineY\", value);\r\n if (!value) {\r\n this.updateSize();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"hideSeriesTooltipsOnSelection\", {\r\n /**\r\n * @return hide tooltip?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"hideSeriesTooltipsOnSelection\");\r\n },\r\n /**\r\n * If set to `true` this will hide series tooltips when selecting with cursor.\r\n *\r\n * @since 4.5.15\r\n * @param value hide tooltips?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"hideSeriesTooltipsOnSelection\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"maxTooltipDistance\", {\r\n /**\r\n * @return Distance\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"maxTooltipDistance\");\r\n },\r\n /**\r\n * If set to a numeric value, cursor will display closest series' tooltips\r\n * plus tooltips from series that are closer to than `maxTooltipDistance` to\r\n * it.\r\n *\r\n * Set it to `-1` to always force one tooltip, even if there are multiple\r\n * data items in exactly same place.\r\n *\r\n * @since 4.7.18\r\n * @param value Distance\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"maxTooltipDistance\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"maxPanOut\", {\r\n /**\r\n * @return Full width?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"maxPanOut\");\r\n },\r\n /**\r\n * If cursor behavior is panX or panY, we allow to pan plot out of it's max bounds for a better user experience.\r\n * This setting specifies relative value by how much we can pan out the plot\r\n *\r\n * @param value\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"maxPanOut\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"xAxis\", {\r\n /**\r\n * @return X axis\r\n */\r\n get: function () {\r\n return this._xAxis.get();\r\n },\r\n /**\r\n * A reference to X [[Axis]].\r\n *\r\n * An XY cursor can live without `xAxis` set. You set xAxis for cursor when\r\n * you have axis tooltip enabled and you want cursor line to be at the same\r\n * position as tooltip.\r\n *\r\n * This works with [[CategoryAxis]] and [[DateAxis]] but not with\r\n * [[ValueAxis]].\r\n *\r\n * @todo Description (review)\r\n * @param axis X axis\r\n */\r\n set: function (axis) {\r\n var _this = this;\r\n if (this._xAxis.get() != axis) {\r\n this._xAxis.set(axis, new MultiDisposer([\r\n axis.tooltip.events.on(\"positionchanged\", this.handleXTooltipPosition, this, false),\r\n axis.events.on(\"rangechangestarted\", function (event) {\r\n _this.hide(0);\r\n _this.preventShow = true;\r\n }, undefined, false),\r\n axis.events.on(\"rangechangeended\", function (event) {\r\n _this.preventShow = false;\r\n _this.hide(0);\r\n _this.dispatch(\"cursorpositionchanged\");\r\n }, undefined, false)\r\n ]));\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"yAxis\", {\r\n /**\r\n * @return Y Axis\r\n */\r\n get: function () {\r\n return this._yAxis.get();\r\n },\r\n /**\r\n * A reference to Y [[Axis]].\r\n *\r\n * An XY cursor can live without `yAxis` set. You set xAxis for cursor when\r\n * you have axis tooltip enabled and you want cursor line to be at the same\r\n * position as tooltip.\r\n *\r\n * This works with [[CategoryAxis]] and [[DateAxis]] but not with\r\n * [[ValueAxis]].\r\n *\r\n * @todo Description (review)\r\n * @param axis Y axis\r\n */\r\n set: function (axis) {\r\n var _this = this;\r\n if (this._yAxis.get() != axis) {\r\n this._yAxis.set(axis, new MultiDisposer([\r\n axis.tooltip.events.on(\"positionchanged\", this.handleYTooltipPosition, this, false),\r\n axis.events.on(\"rangechangestarted\", function (event) {\r\n _this.hide(0);\r\n _this.__disabled = true;\r\n }, undefined, false),\r\n axis.events.on(\"rangechangeended\", function (event) {\r\n _this.__disabled = false;\r\n _this.hide(0);\r\n _this.dispatch(\"cursorpositionchanged\");\r\n }, undefined, false)\r\n ]));\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Updates Cursor's position when axis tooltip changes position.\r\n *\r\n * @ignore Exclude from docs\r\n * @param event Original Axis event\r\n */\r\n XYCursor.prototype.handleXTooltipPosition = function (event) {\r\n var tooltip = this.xAxis.tooltip;\r\n var point = $utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this);\r\n var x = point.x;\r\n point.y = 1;\r\n if (this.lineX) {\r\n this.lineX.x = x;\r\n if (!this.fitsToBounds(point)) {\r\n this.hide();\r\n }\r\n }\r\n if (this.xAxis && this.fullWidthLineX) {\r\n var startPoint = this.xAxis.currentItemStartPoint;\r\n var endPoint = this.xAxis.currentItemEndPoint;\r\n if (startPoint && endPoint) {\r\n this.lineX.x = x;\r\n var width = endPoint.x - startPoint.x;\r\n this.lineX.path = $path.rectangle(width, this.innerHeight, -width / 2);\r\n }\r\n }\r\n };\r\n /**\r\n * Updates Cursor's position when Y axis changes position or scale.\r\n *\r\n * @ignore Exclude from docs\r\n * @param event Original Axis event\r\n */\r\n XYCursor.prototype.handleYTooltipPosition = function (event) {\r\n var tooltip = this.yAxis.tooltip;\r\n var point = $utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this);\r\n var y = point.y;\r\n point.x = 1;\r\n if (this.lineY) {\r\n this.lineY.y = y;\r\n if (!this.fitsToBounds(point)) {\r\n this.hide();\r\n }\r\n }\r\n if (this.yAxis && this.fullWidthLineY) {\r\n var startPoint = this.yAxis.currentItemStartPoint;\r\n var endPoint = this.yAxis.currentItemEndPoint;\r\n if (startPoint && endPoint) {\r\n this.lineY.y = y;\r\n var height = endPoint.y - startPoint.y;\r\n this.lineY.path = $path.rectangle(this.innerWidth, height, 0, -height / 2);\r\n }\r\n }\r\n };\r\n Object.defineProperty(XYCursor.prototype, \"lineX\", {\r\n /**\r\n * @return Line element\r\n */\r\n get: function () {\r\n return this._lineX.get();\r\n },\r\n /**\r\n * A Line element to use for X axis.\r\n *\r\n * @param lineX Line\r\n */\r\n set: function (lineX) {\r\n if (lineX) {\r\n lineX.setElement(this.paper.add(\"path\"));\r\n this._lineX.set(lineX, lineX.events.on(\"positionchanged\", this.updateSelection, this, false));\r\n lineX.interactionsEnabled = false;\r\n lineX.parent = this;\r\n }\r\n else {\r\n this._lineX.reset();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"lineY\", {\r\n /**\r\n * @return Line element\r\n */\r\n get: function () {\r\n return this._lineY.get();\r\n },\r\n /**\r\n * A Line element to use Y axis.\r\n *\r\n * @param lineY Line\r\n */\r\n set: function (lineY) {\r\n if (lineY) {\r\n lineY.setElement(this.paper.add(\"path\"));\r\n this._lineY.set(lineY, lineY.events.on(\"positionchanged\", this.updateSelection, this, false));\r\n lineY.parent = this;\r\n lineY.interactionsEnabled = false;\r\n }\r\n else {\r\n this._lineY.reset();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"selection\", {\r\n /**\r\n * @return Selection rectangle\r\n */\r\n get: function () {\r\n return this._selection;\r\n },\r\n /**\r\n * A selection element ([[Sprite]]).\r\n *\r\n * @param selection Selection rectangle\r\n */\r\n set: function (selection) {\r\n this._selection = selection;\r\n if (selection) {\r\n selection.element = this.paper.add(\"path\");\r\n selection.parent = this;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Processes JSON-based config before it is applied to the object.\r\n *\r\n * Looks if `xAxis` and `yAxis` is set via ID in JSON config, and replaces\r\n * with real references.\r\n *\r\n * @ignore Exclude from docs\r\n * @param config Config\r\n */\r\n XYCursor.prototype.processConfig = function (config) {\r\n var _this = this;\r\n if (config) {\r\n // Set up axes\r\n if ($type.hasValue(config.xAxis) && $type.isString(config.xAxis)) {\r\n if (this.map.hasKey(config.xAxis)) {\r\n config.xAxis = this.map.getKey(config.xAxis);\r\n }\r\n else {\r\n this.processingErrors.push(\"[XYCursor] No axis with id \\\"\" + config.xAxis + \"\\\" found for `xAxis`\");\r\n delete config.xAxis;\r\n }\r\n }\r\n if ($type.hasValue(config.yAxis) && $type.isString(config.yAxis)) {\r\n if (this.map.hasKey(config.yAxis)) {\r\n config.yAxis = this.map.getKey(config.yAxis);\r\n }\r\n else {\r\n this.processingErrors.push(\"[XYCursor] No axis with id \\\"\" + config.yAxis + \"\\\" found for `yAxis`\");\r\n delete config.yAxis;\r\n }\r\n }\r\n if ($type.hasValue(config.snapToSeries)) {\r\n var snapTo_1 = $type.isArray(config.snapToSeries) ? config.snapToSeries : [config.snapToSeries];\r\n var snapError_1 = false;\r\n $array.each(snapTo_1, function (snap, index) {\r\n if ($type.isString(snap)) {\r\n if (_this.map.hasKey(snap)) {\r\n snapTo_1[index] = _this.map.getKey(snap);\r\n }\r\n else {\r\n _this.processingErrors.push(\"[XYCursor] No series with id \\\"\" + snap + \"\\\" found for `series`\");\r\n snapError_1 = true;\r\n }\r\n }\r\n });\r\n if (snapError_1) {\r\n delete config.snapToSeries;\r\n }\r\n else {\r\n config.snapToSeries = snapTo_1;\r\n }\r\n }\r\n }\r\n _super.prototype.processConfig.call(this, config);\r\n };\r\n Object.defineProperty(XYCursor.prototype, \"snapToSeries\", {\r\n /**\r\n * @return {XYSeries | XYSeries[]}\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"snapToSeries\");\r\n },\r\n /**\r\n * Specifies to which series cursor lines should be snapped.\r\n *\r\n * Can be a single series instance or an array of series.\r\n *\r\n * @param {XYSeries | XYSeries[]}\r\n */\r\n set: function (series) {\r\n var _this = this;\r\n if (this.setPropertyValue(\"snapToSeries\", series)) {\r\n if (series instanceof XYSeries) {\r\n series = [series];\r\n }\r\n if (this._snapToDisposers) {\r\n $array.each(this._snapToDisposers, function (disposer) {\r\n disposer.dispose();\r\n });\r\n }\r\n this._snapToDisposers = [];\r\n if (series) {\r\n $array.each(series, function (s) {\r\n _this._snapToDisposers.push(s.events.on(\"tooltipshownat\", function () { _this.handleSnap(s); }, undefined, false));\r\n });\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(XYCursor.prototype, \"snapOnPan\", {\r\n /**\r\n * Should zoom selection \"snap\" into equal categories/intervals after panning\r\n * the chart? (when `behavior == \"panX\"`)\r\n *\r\n * @default true\r\n * @since 4.10.17\r\n * @return Snap on pan?\r\n */\r\n get: function () {\r\n return this.getPropertyValue(\"snapOnPan\");\r\n },\r\n /**\r\n * @param value Snap on pan?\r\n */\r\n set: function (value) {\r\n this.setPropertyValue(\"snapOnPan\", value);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Snaps the zoom selection after chart is panned.\r\n *\r\n * @ignore\r\n */\r\n XYCursor.prototype.handleSnap = function (series) {\r\n if (!this.downPoint) {\r\n var x = series.getTooltipX() + series.xAxis.pixelX;\r\n var y = series.getTooltipY() + series.yAxis.pixelY;\r\n var xAxis = series.xAxis;\r\n var yAxis = series.yAxis;\r\n if (xAxis) {\r\n if (xAxis.renderer.opposite) {\r\n y -= this.pixelHeight;\r\n }\r\n }\r\n this.point = { x: x, y: y };\r\n this.getPositions();\r\n var xx = x;\r\n var yy = y;\r\n x -= this.pixelWidth;\r\n if (yAxis) {\r\n if (yAxis.renderer.opposite) {\r\n x += this.pixelWidth;\r\n }\r\n }\r\n var tooltip = series.tooltip;\r\n var duration = tooltip.animationDuration;\r\n var easing = tooltip.animationEasing;\r\n if (xAxis instanceof ValueAxis && !(xAxis instanceof DateAxis) && yAxis instanceof ValueAxis && !(yAxis instanceof DateAxis)) {\r\n series.yAxis.showTooltipAtPosition(this.yPosition);\r\n series.xAxis.showTooltipAtPosition(this.xPosition);\r\n }\r\n else {\r\n if (series.baseAxis == series.xAxis) {\r\n series.yAxis.showTooltipAtPosition(this.yPosition);\r\n }\r\n if (series.baseAxis == series.yAxis) {\r\n series.xAxis.showTooltipAtPosition(this.xPosition);\r\n }\r\n }\r\n //\tthis.lineX.animate([{ property: \"y\", to: y }], duration, easing);\r\n //\tthis.lineY.animate([{ property: \"x\", to: x }], duration, easing);\r\n this.lineY.x = x;\r\n this.lineX.y = y;\r\n if (!this.xAxis) {\r\n this.lineX.animate([{ property: \"x\", to: xx }], duration, easing);\r\n }\r\n if (!this.yAxis) {\r\n this.lineY.animate([{ property: \"y\", to: yy }], duration, easing);\r\n }\r\n }\r\n };\r\n /**\r\n * Destroys this object and all related data.\r\n */\r\n XYCursor.prototype.dispose = function () {\r\n this.hide(0);\r\n _super.prototype.dispose.call(this);\r\n };\r\n return XYCursor;\r\n}(Cursor));\r\nexport { XYCursor };\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYCursor\"] = XYCursor;\r\n//# sourceMappingURL=XYCursor.js.map"],"names":["CategoryAxisDataItem","_super","_this","call","this","seriesDataItems","className","text","locations","category","endCategory","deltaPosition","applyTheme","Object","defineProperty","prototype","get","_adapterO","isEnabled","apply","properties","set","value","oldCategory","setProperty","component","validateDataElement","enumerable","configurable","deltaCoordinate","invalidateDataItems","invalidateSeries","CategoryAxis","dataItemsByCategory","axisFieldName","_lastDataItem","createDataItem","_disposers","push","addDisposer","mainDataSet","events","on","event","removeKey","oldValue","createAxisBreak","processSeriesDataItem","dataItem","axisLetter","categoryAxisDataItem","getKey","seriesId","uid","dataItems","remove","validateDataRange","_series","iterator","series","xAxis","yAxis","invalidateDataRange","startIndex","positionToIndex","start","endIndex","end","length","minIndex","maxIndex","i","axisDataItem","getIndex","i_1","seriesDataItem","index","_axisBreaks","validate","dataCount","Math","floor","ceil","renderer","invalid","maxCount","axisLength","max","minGridDistance","Number","MAX_SAFE_INTEGER","frequency","min","_startIndex","_endIndex","fixAxisBreaks","_frequency","maxZoomFactor","resetIterators","itemIndex","__disabled","len","round","axisBreak","isInBreak","appendDataItem","axisBreaks","each","adjustedStartValue","adjustedEndValue","b","frequency_1","breakSize","itemIndex_1","validateBreaks","validateAxisRanges","ghostLabel","invalidate","invalidateLayout","_axisItemCount","categoryToIndex","fillEndIndex","fillPosition","fillEndPosition","position","indexToPosition","endPosition","isRange","point","positionToPoint","tick","disabled","updateTickElement","grid","updateGridElement","label","undefined","updateLabelElement","measuredWidth","measuredHeight","html","currentText","fill","axisFill","location","updateFillElement","fillRule","bullet","updateBullet","mask","disposeData","clear","processDataItem","dataContext","setKey","getDataItem","dataFields","create","difference","adjustDifference","startLocation","endLocation","breakStartIndex","breakEndIndex","categoryToPosition","categoryToPoint","angle","positionToAngle","x","y","anyToPoint","anyToPosition","zoomToCategories","startCategory","zoomToIndexes","getAnyRangePath","startPos","endPos","getPositionRangePath","roundPosition","getFirstSeriesDataItem","categoryX","categoryY","getLastSeriesDataItem","getSeriesDataItemByCategory","getSeriesDataItem","findNearest","index_1","sdi_1","category_1","abs","getX","key","stackKey","range","getPositionX","basePoint","categories","getY","getPositionY","getAngle","getCellStartPosition","getCellEndPosition","getTooltipText","tooltipDataItem","tooltip","tooltipText","breakStartPosition","startPosition","breakEndPosition","breakPosition","positionToCategory","getPositionLabel","initRenderer","baseGrid","getPropertyValue","setPropertyValue","processConfig","config","sortBySeries","map","hasKey","addDelayedMap","CategoryAxisBreak","axis","DateAxisDataItem","values","date","endDate","dates","setDate","getTime","endValue","DateAxis","_gapBreaks","gridIntervals","groupIntervals","dateFormats","periodChangeDateFormats","_baseIntervalReal","timeUnit","count","_prevSeriesTime","_minDifference","_firstWeekDay","groupMin","groupMax","_intervalMax","_intervalMin","snapTooltip","tooltipPosition","groupCount","getDFFormatter","pushAll","gridInterval","_gridInterval","gridDuration","applyInternalDefaults","language","translate","validateDataItems","baseDuration","periodCount","getFirstWeekDay","mainBaseDuration","mainBaseInterval","_deltaMinMax","newPeriodCount","zoom","handleSelectionExtremesChange","getIntervalMax","interval","getIntervalMin","calculateZoom","_minZoomed","_maxZoomed","dataSetChanged","groupData","selectionMin","selectionMax","diff","modifiedDifference","groupInterval","chooseInterval","_groupInterval","newId","_currentDataSetId","dispatch","baseAxis","setDataSet","_gridCount","baseInterval","_nextGridUnit","_intervalDuration","_gridDate","Date","minZoomed","_df","utc","timezoneMinutes","timezone","field_1","getAxisField","minZoomedStr","toString","startDataItem","dataItemsByAxis","currentDataSetId","findFirst","findClosestIndex","maxZoomed","maxZoomedStr","endDataItem","outOfRange","dataRangeInvalid","time","previousDataItem","previousDate","validateData","minDifference","MAX_VALUE","seriesDataChangeUpdate","postProcessSeriesDataItems","seriesGroupUpdate","addEmptyUnitsBreaks","JSON","stringify","_baseInterval","postProcessSeriesDataItem","groupSeriesData","dataGrouped","bulletsContainer","removeChildren","intervals_1","mainIntervalDuration_1","intervalDuration","_dataSets","dispose","dataSetId","dataSet","template","clone","dataSets","newDataItem","roundedDate","previousTime","NEGATIVE_INFINITY","dfkey","df","dfk","indexOf","getDate","firstDayOfWeek","currentTime","vkey","dataField","workingValue","setWorkingLocation","dateX","openDateX","dateY","openDateY","_index","dvalues","open","close","low","high","sum","average","propertyFields","fieldValue","f","hasProperties","groupDataItems","groupFieldName","groupFields","dateFormatter","intervalID","startDate","startTime","setCalculatedValue","skipEmptyPeriods","_loop_1","this_1","startTimeStr","hasData","breakGridCount","gridDate","getGridDate","intervalCount","realIntervalCount","prevTimestamp","newDate","timestamp","durationBreaksRemoved","countBreaksRemoved","getBreaklessDate","validateAxisElements","prevGridDate","dataItemsIterator_1","_dataItemsIterator","_loop_2","this_2","format","markUnitChange","find","renderer_1","timeUnit_1","intervalCount_1","startPoint","endPoint","prevGridDate_1","timestamp_1","_loop_3","text_1","moveValue","adjustedMax","endTimestamp","valueToPosition","location_1","adjustMinMax","step","fixMin","endTime","fixMax","duration","gridCount","intervals","lastIndex","formatLabel","dateToPosition","dateToPoint","valueToPoint","positionToDate","positionToValue","getTimeByLocation","baseValue","stack","getValue","workingLocations","timezoneOffset","setTime","getTimezoneOffset","setValue","openTime","openDate","prevSeriesTime","differece","updateAxisBySeries","_mainBaseInterval","timeInterval","breakTemplate","startLine","endLine","fillShape","invalidateData","tooltipDate","tooltipDateFormat","dateFormat","axisLocation","deltaValue","nextDate","key_1","Infinity","getCurrentLabelFormat","ticks","labels","animateMinMax","animation","animate","property","from","_minAdjusted","to","_maxAdjusted","rangeChangeDuration","rangeChangeEasing","handleExtremesChange","id","_finalMin","_finalMax","zoomToDates","skipRangeEvent","instantly","adjust","parse","zoomToValues","startValue","isEnd","isStart","groupInterval_1","min_1","max_1","POSITIVE_INFINITY","seriesMin","seriesMax","ds","mindi","maxdi","asIs","field","copyFrom","source","showTooltipAtPosition","local","toAxisPosition","closestDate_1","actualDate","actualTime_1","closestTime_1","tooltipLocation","chart","cursor","snapToSeries","showTooltipAtDataItem","_seriesPoints","tooltipHTML","hideTooltip","inited","makeGap","previous","connect","autoGapCount","prevDate","prevTime","_saveMinMax","DateAxisBreak","DurationAxisDataItem","DurationAxis","_baseUnit","durationFormatter","axisDurationFormat","strictMode","e_1","_a","minMaxStep","baseUnit","initialMin","initialMax","divisors","realDivisor","divisors_1","divisors_1_1","next","done","divisor","e_1_1","error","return","exponent","log","LOG10E","power","pow","reducedCount","closest","getValueUnit","getFormat","_tooltipDurationFormat","_stepDecimalPlaces","valueStr","tooltipDurationFormat","Grid","element","paper","add","isMeasured","above","interfaceColors","stroke","getFor","pixelPerfect","strokeOpacity","setDisabled","changed","relevant","state","target","stateId","states","GridCircular","setPercentProperty","ValueAxisDataItem","ValueAxis","_prevStepDecimalPlaces","_adjustLabelPrecision","_baseValue","_adjustedStart","_adjustedEnd","_extremesChanged","_dsc","calculateTotals","keepSelection","includeRangesInMinMax","dataChangeUpdate","clearCache","_start","dispatchImmediately","_end","_maxDefined","_minDefined","processSeriesDataItems","total","excludeFromTotal","dataItem_1","dataItem_2","getMinMax","hideUnusedDataItems","stepDecimalPlaces","syncWithAxis","calculated","getCache","_step","fixSmallStep","value_1","logarithmic","differencePower","precisionChanged","stepPower","decCount","breakValue_1","adjustedMin","adjustedStep","adjustLabelPrecision","numberFormatter","_difference","treatZeroAs","invalidateLabels","difference_1","value_2","breakStartValue","breakEndValue","E","xToValue","pointToPosition","yToValue","updateGridCount","ignoreMinMax","axisRanges","minValue","maxValue","raiseCriticalError","Error","_minReal","_maxReal","dif","extraMin","extraMax","strict","strictMinMax","_minMaxAnimation","isFinished","extra","stepDivisor","maxPrecision","minCount","registerSeries","allHidden","isHidden","visible","isHiding","seriesSelectionMin","seriesSelectionMax","minMaxStep2","syncAxes","declination","setCache","mw_1","pixelWidth","getWorkingValue","extraTooltipPrecision","axisBreakDif","axisBreakGridCount","breakMinMaxStep","showTooltipAt","currentCount","synced","c","omin","omax","ostep","checkSync","processingErrors","_min","_max","ValueAxisBreak","Cursor","_stick","width","height","shouldClone","hide","trackable","clickable","interaction","body","handleCursorDown","handleCursorUp","handleCursorMove","interactionsEnabled","interactions","isTouchProtected","touch","_generalBehavior","downPoint","isLocalElement","pointer","svg","_stickPoint","fitsToBounds","triggerMove","hideReal","stick","force","triggerMoveReal","invalidatePosition","show","getPositions","triggerDown","triggerDownReal","setGlobalStyle","triggerUp","triggerUpReal","updatePoint","upPoint","_upPointOrig","_downPointOrig","getHitOption","updateSelection","xPosition","innerWidth","yPosition","innerHeight","cancelable","shouldPreventGestures","preventDefault","_chart","plotContainer","lockElement","RadarCursor","radius","innerRadius","truePixelRadius","pixelInnerRadius","cursorTooltipEnabled","updateLineX","updateLineY","pixelRadius","startAngle","endAngle","path","lineX","moveTo","fullWidthLineX","currentItemStartPoint","currentItemEndPoint","fillStartAngle","fillEndAngle","arc","lineY","fullWidthLineY","_usesSelection","downAngle","downRadius","currentRadius","_prevAngle","downSin","downCos","sin","cos","behavior","selection","handleXTooltipPosition","pixelX","pixelY","handleYTooltipPosition","updateLinePositions","getRanges","upAngle","upRadius","startX","endX","startY","endY","xRange","yRange","updateSize","innerRadiusModifyer","fixPoint","XYCursor","_lineX","_lineY","_xAxis","_yAxis","_snapToDisposers","maxPanOut","snapOnPan","createChild","fillOpacity","strokeDasharray","hideSeriesTooltipsOnSelection","w","_positionPrecision","h","pixelHeight","validatePosition","allHidden_1","s","getPanningRanges","parent","selectionX","selectionY","hasMoved","distance","currentX","currentY","deltaX","deltaY","preventShow","setElement","reset","_selection","snapTo_1","snapError_1","snap","disposer","handleSnap","getTooltipX","getTooltipY","opposite","xx","yy","animationDuration","easing","animationEasing","C"],"sourceRoot":""}