{"version":3,"file":"kendo.dataviz.chart.min.js","sources":["kendo.dataviz.chart.js"],"sourcesContent":["/***********************************************************************\n * WARNING: this file is auto-generated. If you change it directly,\n * your modifications will eventually be lost. The source code is in\n * `kendo-charts` repository, you should make your changes there and\n * run `src-modules/sync.sh` in this repository.\n */\n(function(f, define) {\n define('dataviz/chart/kendo-chart',[\n \"kendo.core\",\n \"kendo.color\",\n \"kendo.drawing\",\n \"kendo.dataviz.core\"\n ], f);\n})(function() {\n\n(function($) {\n/* eslint-disable space-before-blocks, space-before-function-paren, curly */\n\nwindow.kendo.dataviz = window.kendo.dataviz || {};\nvar dataviz = kendo.dataviz;\nvar Class = dataviz.Class;\nvar isNumber = dataviz.isNumber;\nvar datavizConstants = dataviz.constants;\nvar MAX_VALUE = datavizConstants.MAX_VALUE;\nvar MIN_VALUE = datavizConstants.MIN_VALUE;\nvar VALUE = datavizConstants.VALUE;\nvar CENTER = datavizConstants.CENTER;\nvar TOP = datavizConstants.TOP;\nvar BOTTOM = datavizConstants.BOTTOM;\nvar LEFT = datavizConstants.LEFT;\nvar WHITE = datavizConstants.WHITE;\nvar CIRCLE = datavizConstants.CIRCLE;\nvar X = datavizConstants.X;\nvar Y = datavizConstants.Y;\nvar RIGHT = datavizConstants.RIGHT;\nvar BLACK = datavizConstants.BLACK;\nvar DATE = datavizConstants.DATE;\nvar DEFAULT_PRECISION = datavizConstants.DEFAULT_PRECISION;\nvar ARC = datavizConstants.ARC;\nvar defined = dataviz.defined;\nvar getter = dataviz.getter;\nvar isArray = dataviz.isArray;\nvar ChartElement = dataviz.ChartElement;\nvar Point = dataviz.Point;\nvar Box = dataviz.Box;\nvar alignPathToPixel = dataviz.alignPathToPixel;\nvar setDefaultOptions = dataviz.setDefaultOptions;\nvar inArray = dataviz.inArray;\nvar isFunction = dataviz.isFunction;\nvar valueOrDefault = dataviz.valueOrDefault;\nvar isObject = dataviz.isObject;\nvar deepExtend = dataviz.deepExtend;\nvar last = dataviz.last;\nvar eventElement = dataviz.eventElement;\nvar getTemplate = dataviz.getTemplate;\nvar TextBox = dataviz.TextBox;\nvar ShapeElement = dataviz.ShapeElement;\nvar getSpacing = dataviz.getSpacing;\nvar CurveProcessor = dataviz.CurveProcessor;\nvar append = dataviz.append;\nvar isString = dataviz.isString;\nvar parseDate = dataviz.parseDate;\nvar styleValue = dataviz.styleValue;\nvar CategoryAxis = dataviz.CategoryAxis;\nvar BoxElement = dataviz.BoxElement;\nvar round = dataviz.round;\nvar limitValue = dataviz.limitValue;\nvar grep = dataviz.grep;\nvar elementStyles = dataviz.elementStyles;\nvar hasClasses = dataviz.hasClasses;\nvar bindEvents = dataviz.bindEvents;\nvar services = dataviz.services;\nvar unbindEvents = dataviz.unbindEvents;\nvar support = kendo.support;\nvar drawing = kendo.drawing;\nvar Path = drawing.Path;\nvar Animation = drawing.Animation;\nvar AnimationFactory = drawing.AnimationFactory;\nvar Group = drawing.Group;\nvar Color = kendo.Color;\nvar geometry = kendo.geometry;\nvar GeometryPoint = geometry.Point;\nvar transform = geometry.transform;\n\nvar ChartAxis = Class.extend({\n init: function(axis) {\n\n this._axis = axis;\n this.options = axis.options;\n },\n\n value: function(point) {\n var axis = this._axis;\n var value = axis.getCategory ? axis.getCategory(point) : axis.getValue(point);\n\n return value;\n },\n\n slot: function(from, to, limit) {\n if (limit === void 0) { limit = true; }\n\n return this._axis.slot(from, to, limit);\n },\n\n range: function() {\n return this._axis.range();\n },\n\n valueRange: function() {\n return this._axis.valueRange();\n }\n});\n\nfunction findAxisByName(name, axes) {\n for (var idx = 0; idx < axes.length; idx++) {\n if (axes[idx].options.name === name) {\n axes[idx].prepareUserOptions();\n return new ChartAxis(axes[idx]);\n }\n }\n}\n\nvar ChartPane = kendo.Class.extend({\n init: function(pane) {\n this.visual = pane.visual;\n this.chartsVisual = pane.chartContainer.visual;\n this._pane = pane;\n },\n\n findAxisByName: function(name) {\n return findAxisByName(name, this._pane.axes);\n }\n});\n\nvar ChartPlotArea = Class.extend({\n init: function(plotArea) {\n\n this._plotArea = plotArea;\n this.visual = plotArea.visual;\n this.backgroundVisual = plotArea._bgVisual;\n }\n});\n\nfunction countNumbers(values) {\n var length = values.length;\n var count = 0;\n\n for (var i = 0; i < length; i++) {\n var num = values[i];\n if (isNumber(num)) {\n count++;\n }\n }\n\n return count;\n}\n\nvar Aggregates = {\n min: function(values) {\n var length = values.length;\n var min = MAX_VALUE;\n\n for (var i = 0; i < length; i++) {\n var value = values[i];\n if (isNumber(value)) {\n min = Math.min(min, value);\n }\n }\n\n return min === MAX_VALUE ? values[0] : min;\n },\n\n max: function(values) {\n var length = values.length;\n var max = MIN_VALUE;\n\n for (var i = 0; i < length; i++) {\n var value = values[i];\n if (isNumber(value)) {\n max = Math.max(max, value);\n }\n }\n\n return max === MIN_VALUE ? values[0] : max;\n },\n\n sum: function(values) {\n var length = values.length;\n var sum = 0;\n\n for (var i = 0; i < length; i++) {\n var value = values[i];\n if (isNumber(value)) {\n sum += value;\n }\n }\n\n return sum;\n },\n\n sumOrNull: function(values) {\n var result = null;\n\n if (countNumbers(values)) {\n result = Aggregates.sum(values);\n }\n\n return result;\n },\n\n count: function(values) {\n var length = values.length;\n var count = 0;\n\n for (var i = 0; i < length; i++) {\n var value = values[i];\n if (value !== null && defined(value)) {\n count++;\n }\n }\n\n return count;\n },\n\n avg: function(values) {\n var count = countNumbers(values);\n var result = values[0];\n\n if (count > 0) {\n result = Aggregates.sum(values) / count;\n }\n\n return result;\n },\n\n first: function(values) {\n var length = values.length;\n\n for (var i = 0; i < length; i++) {\n var value = values[i];\n if (value !== null && defined(value)) {\n return value;\n }\n }\n\n return values[0];\n }\n};\n\nfunction getField(field, row) {\n if (row === null) {\n return row;\n }\n\n var get = getter(field, true);\n return get(row);\n}\n\nvar SeriesBinder = Class.extend({\n init: function() {\n\n this._valueFields = {};\n this._otherFields = {};\n this._nullValue = {};\n this._undefinedValue = {};\n },\n\n register: function(seriesTypes, valueFields, otherFields) {\n var this$1 = this;\n if (valueFields === void 0) { valueFields = [ VALUE ]; }\n if (otherFields === void 0) { otherFields = {}; }\n\n for (var i = 0; i < seriesTypes.length; i++) {\n var type = seriesTypes[i];\n\n this$1._valueFields[type] = valueFields;\n this$1._otherFields[type] = otherFields;\n this$1._nullValue[type] = this$1._makeValue(valueFields, null);\n this$1._undefinedValue[type] = this$1._makeValue(valueFields, undefined);\n }\n },\n\n canonicalFields: function(series) {\n return this.valueFields(series).concat(this.otherFields(series));\n },\n\n valueFields: function(series) {\n return this._valueFields[series.type] || [ VALUE ];\n },\n\n otherFields: function(series) {\n return this._otherFields[series.type] || [ VALUE ];\n },\n\n bindPoint: function(series, pointIx, item) {\n var data = series.data;\n var pointData = defined(item) ? item : data[pointIx];\n var result = { valueFields: { value: pointData } };\n var valueFields = this.valueFields(series);\n var otherFields = this._otherFields[series.type];\n var fields, value;\n\n if (pointData === null) {\n value = this._nullValue[series.type];\n } else if (!defined(pointData)) {\n value = this._undefinedValue[series.type];\n } else if (Array.isArray(pointData)) {\n var fieldData = pointData.slice(valueFields.length);\n value = this._bindFromArray(pointData, valueFields);\n fields = this._bindFromArray(fieldData, otherFields);\n } else if (typeof pointData === \"object\") {\n var srcValueFields = this.sourceFields(series, valueFields);\n var srcPointFields = this.sourceFields(series, otherFields);\n\n value = this._bindFromObject(pointData, valueFields, srcValueFields);\n fields = this._bindFromObject(pointData, otherFields, srcPointFields);\n }\n\n if (defined(value)) {\n if (valueFields.length === 1) {\n result.valueFields.value = value[valueFields[0]];\n } else {\n result.valueFields = value;\n }\n }\n\n result.fields = fields || {};\n\n return result;\n },\n\n _makeValue: function(fields, initialValue) {\n var value = {};\n var length = fields.length;\n\n for (var i = 0; i < length; i++) {\n var fieldName = fields[i];\n value[fieldName] = initialValue;\n }\n\n return value;\n },\n\n _bindFromArray: function(array, fields) {\n var value = {};\n\n if (fields) {\n var length = Math.min(fields.length, array.length);\n\n for (var i = 0; i < length; i++) {\n value[fields[i]] = array[i];\n }\n }\n\n return value;\n },\n\n _bindFromObject: function(object, fields, srcFields) {\n if (srcFields === void 0) { srcFields = fields; }\n\n var value = {};\n\n if (fields) {\n var length = fields.length;\n\n for (var i = 0; i < length; i++) {\n var fieldName = fields[i];\n var srcFieldName = srcFields[i];\n if (srcFieldName !== null) {\n value[fieldName] = getField(srcFieldName, object);\n }\n }\n }\n\n return value;\n },\n\n sourceFields: function(series, canonicalFields) {\n var sourceFields = [];\n\n if (canonicalFields) {\n var length = canonicalFields.length;\n\n for (var i = 0; i < length; i++) {\n var fieldName = canonicalFields[i];\n var sourceFieldName = fieldName === VALUE ? \"field\" : fieldName + \"Field\";\n\n sourceFields.push(series[sourceFieldName] !== null ? (series[sourceFieldName] || fieldName) : null);\n }\n }\n\n return sourceFields;\n }\n});\n\nSeriesBinder.current = new SeriesBinder();\n\nvar STD_ERR = \"stderr\";\nvar STD_DEV = \"stddev\";\nvar percentRegex = /percent(?:\\w*)\\((\\d+)\\)/;\nvar standardDeviationRegex = new RegExp(\"^\" + STD_DEV + \"(?:\\\\((\\\\d+(?:\\\\.\\\\d+)?)\\\\))?$\");\n\nvar ErrorRangeCalculator = Class.extend({\n init: function(errorValue, series, field) {\n\n this.initGlobalRanges(errorValue, series, field);\n },\n\n initGlobalRanges: function(errorValue, series, field) {\n var data = series.data;\n var deviationMatch = standardDeviationRegex.exec(errorValue);\n\n if (deviationMatch) {\n this.valueGetter = this.createValueGetter(series, field);\n\n var average = this.getAverage(data);\n var deviation = this.getStandardDeviation(data, average, false);\n var multiple = deviationMatch[1] ? parseFloat(deviationMatch[1]) : 1;\n var errorRange = { low: average.value - deviation * multiple, high: average.value + deviation * multiple };\n\n this.globalRange = function() {\n return errorRange;\n };\n } else if (errorValue.indexOf && errorValue.indexOf(STD_ERR) >= 0) {\n this.valueGetter = this.createValueGetter(series, field);\n var standardError = this.getStandardError(data, this.getAverage(data));\n\n this.globalRange = function(value) {\n return { low: value - standardError, high: value + standardError };\n };\n }\n },\n\n createValueGetter: function(series, field) {\n var data = series.data;\n var binder = SeriesBinder.current;\n var valueFields = binder.valueFields(series);\n var item = defined(data[0]) ? data[0] : {};\n var valueGetter;\n\n if (isArray(item)) {\n var index = field ? valueFields.indexOf(field) : 0;\n valueGetter = getter(\"[\" + index + \"]\");\n } else if (isNumber(item)) {\n valueGetter = getter();\n } else if (typeof item === datavizConstants.OBJECT) {\n var srcValueFields = binder.sourceFields(series, valueFields);\n valueGetter = getter(srcValueFields[valueFields.indexOf(field)]);\n }\n\n return valueGetter;\n },\n\n getErrorRange: function(pointValue, errorValue) {\n var low, high, value;\n\n if (!defined(errorValue)) {\n return null;\n }\n\n if (this.globalRange) {\n return this.globalRange(pointValue);\n }\n\n if (isArray(errorValue)) {\n low = pointValue - errorValue[0];\n high = pointValue + errorValue[1];\n } else if (isNumber(value = parseFloat(errorValue))) {\n low = pointValue - value;\n high = pointValue + value;\n } else if ((value = percentRegex.exec(errorValue))) {\n var percentValue = pointValue * (parseFloat(value[1]) / 100);\n low = pointValue - Math.abs(percentValue);\n high = pointValue + Math.abs(percentValue);\n } else {\n throw new Error(\"Invalid ErrorBar value: \" + errorValue);\n }\n\n return { low: low, high: high };\n },\n\n getStandardError: function(data, average) {\n return this.getStandardDeviation(data, average, true) / Math.sqrt(average.count);\n },\n\n getStandardDeviation: function(data, average, isSample) {\n var this$1 = this;\n\n var length = data.length;\n var total = isSample ? average.count - 1 : average.count;\n var squareDifferenceSum = 0;\n\n for (var idx = 0; idx < length; idx++) {\n var value = this$1.valueGetter(data[idx]);\n if (isNumber(value)) {\n squareDifferenceSum += Math.pow(value - average.value, 2);\n }\n }\n\n return Math.sqrt(squareDifferenceSum / total);\n },\n\n getAverage: function(data) {\n var this$1 = this;\n\n var length = data.length;\n var sum = 0;\n var count = 0;\n\n for (var idx = 0; idx < length; idx++) {\n var value = this$1.valueGetter(data[idx]);\n if (isNumber(value)) {\n sum += value;\n count++;\n }\n }\n\n return {\n value: sum / count,\n count: count\n };\n }\n});\n\nvar browser = support.browser || {};\n\nvar INITIAL_ANIMATION_DURATION = 600;\nvar FADEIN = \"fadeIn\";\n\nvar GLASS = \"glass\";\nvar BORDER_BRIGHTNESS = 0.8;\nvar TOOLTIP_OFFSET = 5;\nvar START_SCALE = browser.msie ? 0.001 : 0;\nvar ERROR_LOW_FIELD = \"errorLow\";\nvar ERROR_HIGH_FIELD = \"errorHigh\";\nvar X_ERROR_LOW_FIELD = \"xErrorLow\";\nvar X_ERROR_HIGH_FIELD = \"xErrorHigh\";\nvar Y_ERROR_LOW_FIELD = \"yErrorLow\";\nvar Y_ERROR_HIGH_FIELD = \"yErrorHigh\";\nvar LINE_MARKER_SIZE = 8;\nvar ZERO = \"zero\";\nvar INTERPOLATE = \"interpolate\";\nvar GAP = \"gap\";\nvar ABOVE = \"above\";\nvar BELOW = \"below\";\n\nvar SMOOTH = \"smooth\";\nvar STEP = \"step\";\n\nvar AREA = \"area\";\nvar BAR = \"bar\";\nvar BOX_PLOT = \"boxPlot\";\nvar BUBBLE = \"bubble\";\nvar BULLET = \"bullet\";\nvar CANDLESTICK = \"candlestick\";\nvar COLUMN = \"column\";\nvar DONUT = \"donut\";\nvar FUNNEL = \"funnel\";\nvar HEATMAP = \"heatmap\";\nvar HORIZONTAL_WATERFALL = \"horizontalWaterfall\";\nvar LINE = \"line\";\nvar OHLC = \"ohlc\";\nvar PIE = \"pie\";\nvar POLAR_AREA = \"polarArea\";\nvar POLAR_LINE = \"polarLine\";\nvar POLAR_SCATTER = \"polarScatter\";\nvar RADAR_AREA = \"radarArea\";\nvar RADAR_COLUMN = \"radarColumn\";\nvar RADAR_LINE = \"radarLine\";\nvar RANGE_AREA = \"rangeArea\";\nvar RANGE_BAR = \"rangeBar\";\nvar RANGE_COLUMN = \"rangeColumn\";\nvar SCATTER = \"scatter\";\nvar SCATTER_LINE = \"scatterLine\";\nvar VERTICAL_AREA = \"verticalArea\";\nvar VERTICAL_BOX_PLOT = \"verticalBoxPlot\";\nvar VERTICAL_BULLET = \"verticalBullet\";\nvar VERTICAL_LINE = \"verticalLine\";\nvar VERTICAL_RANGE_AREA = \"verticalRangeArea\";\nvar WATERFALL = \"waterfall\";\nvar EQUALLY_SPACED_SERIES = [\n BAR, COLUMN, OHLC, CANDLESTICK, BOX_PLOT, VERTICAL_BOX_PLOT,\n BULLET, RANGE_COLUMN, RANGE_BAR, WATERFALL, HORIZONTAL_WATERFALL\n];\n\nvar LEGEND_ITEM_CLICK = \"legendItemClick\";\nvar LEGEND_ITEM_HOVER = \"legendItemHover\";\nvar LEGEND_ITEM_LEAVE = \"legendItemLeave\";\nvar SERIES_CLICK = \"seriesClick\";\nvar SERIES_HOVER = \"seriesHover\";\nvar SERIES_OVER = \"seriesOver\";\nvar SERIES_LEAVE = \"seriesLeave\";\nvar PLOT_AREA_CLICK = \"plotAreaClick\";\nvar PLOT_AREA_HOVER = \"plotAreaHover\";\nvar PLOT_AREA_LEAVE = \"plotAreaLeave\";\nvar DRAG = \"drag\";\nvar DRAG_END = \"dragEnd\";\nvar DRAG_START = \"dragStart\";\nvar ZOOM_START = \"zoomStart\";\nvar ZOOM = \"zoom\";\nvar ZOOM_END = \"zoomEnd\";\nvar SELECT_START = \"selectStart\";\nvar SELECT = \"select\";\nvar SELECT_END = \"selectEnd\";\nvar RENDER = \"render\";\nvar SHOW_TOOLTIP = \"showTooltip\";\nvar HIDE_TOOLTIP = \"hideTooltip\";\nvar PANE_RENDER = \"paneRender\";\n\nvar LOGARITHMIC = \"log\";\nvar CATEGORY = \"category\";\n\nvar INSIDE_END = \"insideEnd\";\nvar INSIDE_BASE = \"insideBase\";\nvar OUTSIDE_END = \"outsideEnd\";\n\nvar MOUSEWHEEL = \"DOMMouseScroll mousewheel\";\nvar MOUSEWHEEL_DELAY = 150;\nvar MOUSEWHEEL_ZOOM_RATE = 0.3;\n\nvar constants = {\n\tINITIAL_ANIMATION_DURATION: INITIAL_ANIMATION_DURATION,\n\tFADEIN: FADEIN,\n\tLEGEND_ITEM_CLICK: LEGEND_ITEM_CLICK,\n\tLEGEND_ITEM_HOVER: LEGEND_ITEM_HOVER,\n\tLEGEND_ITEM_LEAVE: LEGEND_ITEM_LEAVE,\n\tSERIES_CLICK: SERIES_CLICK,\n\tSERIES_HOVER: SERIES_HOVER,\n\tSERIES_OVER: SERIES_OVER,\n\tSERIES_LEAVE: SERIES_LEAVE,\n\tGLASS: GLASS,\n\tBORDER_BRIGHTNESS: BORDER_BRIGHTNESS,\n\tTOOLTIP_OFFSET: TOOLTIP_OFFSET,\n\tSTART_SCALE: START_SCALE,\n\tERROR_LOW_FIELD: ERROR_LOW_FIELD,\n\tERROR_HIGH_FIELD: ERROR_HIGH_FIELD,\n\tX_ERROR_LOW_FIELD: X_ERROR_LOW_FIELD,\n\tX_ERROR_HIGH_FIELD: X_ERROR_HIGH_FIELD,\n\tY_ERROR_LOW_FIELD: Y_ERROR_LOW_FIELD,\n\tY_ERROR_HIGH_FIELD: Y_ERROR_HIGH_FIELD,\n\tLINE_MARKER_SIZE: LINE_MARKER_SIZE,\n\tINTERPOLATE: INTERPOLATE,\n\tZERO: ZERO,\n\tSMOOTH: SMOOTH,\n\tSTEP: STEP,\n\tCATEGORY: CATEGORY,\n\tFUNNEL: FUNNEL,\n\tBAR: BAR,\n\tCANDLESTICK: CANDLESTICK,\n\tPIE: PIE,\n\tCOLUMN: COLUMN,\n\tAREA: AREA,\n\tVERTICAL_BULLET: VERTICAL_BULLET,\n\tBOX_PLOT: BOX_PLOT,\n\tOHLC: OHLC,\n\tWATERFALL: WATERFALL,\n\tLINE: LINE,\n\tBULLET: BULLET,\n\tVERTICAL_LINE: VERTICAL_LINE,\n\tVERTICAL_AREA: VERTICAL_AREA,\n\tRANGE_AREA: RANGE_AREA,\n\tVERTICAL_RANGE_AREA: VERTICAL_RANGE_AREA,\n\tRANGE_COLUMN: RANGE_COLUMN,\n\tVERTICAL_BOX_PLOT: VERTICAL_BOX_PLOT,\n\tRANGE_BAR: RANGE_BAR,\n\tHORIZONTAL_WATERFALL: HORIZONTAL_WATERFALL,\n\tSCATTER: SCATTER,\n\tSCATTER_LINE: SCATTER_LINE,\n\tBUBBLE: BUBBLE,\n\tRADAR_AREA: RADAR_AREA,\n\tRADAR_LINE: RADAR_LINE,\n\tRADAR_COLUMN: RADAR_COLUMN,\n\tPOLAR_LINE: POLAR_LINE,\n\tPOLAR_AREA: POLAR_AREA,\n\tPOLAR_SCATTER: POLAR_SCATTER,\n\tRENDER: RENDER,\n\tPLOT_AREA_CLICK: PLOT_AREA_CLICK,\n\tPLOT_AREA_HOVER: PLOT_AREA_HOVER,\n\tPLOT_AREA_LEAVE: PLOT_AREA_LEAVE,\n\tLOGARITHMIC: LOGARITHMIC,\n\tDRAG: DRAG,\n\tDRAG_START: DRAG_START,\n\tDRAG_END: DRAG_END,\n\tZOOM_START: ZOOM_START,\n\tZOOM: ZOOM,\n\tZOOM_END: ZOOM_END,\n\tSELECT_START: SELECT_START,\n\tSELECT: SELECT,\n\tSELECT_END: SELECT_END,\n\tPANE_RENDER: PANE_RENDER,\n\tGAP: GAP,\n\tDONUT: DONUT,\n\tINSIDE_END: INSIDE_END,\n\tINSIDE_BASE: INSIDE_BASE,\n\tOUTSIDE_END: OUTSIDE_END,\n\tMOUSEWHEEL: MOUSEWHEEL,\n\tMOUSEWHEEL_DELAY: MOUSEWHEEL_DELAY,\n\tMOUSEWHEEL_ZOOM_RATE: MOUSEWHEEL_ZOOM_RATE,\n\tSHOW_TOOLTIP: SHOW_TOOLTIP,\n\tHIDE_TOOLTIP: HIDE_TOOLTIP,\n\tEQUALLY_SPACED_SERIES: EQUALLY_SPACED_SERIES,\n\tABOVE: ABOVE,\n\tBELOW: BELOW,\n\tHEATMAP: HEATMAP\n};\n\nvar DEFAULT_ERROR_BAR_WIDTH = 4;\n\nvar ErrorBarBase = ChartElement.extend({\n init: function(low, high, isVertical, chart, series, options) {\n ChartElement.fn.init.call(this, options);\n\n this.low = low;\n this.high = high;\n this.isVertical = isVertical;\n this.chart = chart;\n this.series = series;\n },\n\n reflow: function(targetBox) {\n var endCaps = this.options.endCaps;\n var isVertical = this.isVertical;\n var axis = this.getAxis();\n var valueBox = axis.getSlot(this.low, this.high);\n var centerBox = targetBox.center();\n var capsWidth = this.getCapsWidth(targetBox, isVertical);\n var capValue = isVertical ? centerBox.x : centerBox.y;\n var capStart = capValue - capsWidth;\n var capEnd = capValue + capsWidth;\n var linePoints;\n\n if (isVertical) {\n linePoints = [\n new Point(centerBox.x, valueBox.y1),\n new Point(centerBox.x, valueBox.y2)\n ];\n if (endCaps) {\n linePoints.push(new Point(capStart, valueBox.y1),\n new Point(capEnd, valueBox.y1),\n new Point(capStart, valueBox.y2),\n new Point(capEnd, valueBox.y2));\n }\n this.box = new Box(capStart, valueBox.y1, capEnd, valueBox.y2);\n } else {\n linePoints = [\n new Point(valueBox.x1, centerBox.y),\n new Point(valueBox.x2, centerBox.y)\n ];\n if (endCaps) {\n linePoints.push(new Point(valueBox.x1, capStart),\n new Point(valueBox.x1, capEnd),\n new Point(valueBox.x2, capStart),\n new Point(valueBox.x2, capEnd));\n }\n this.box = new Box(valueBox.x1, capStart, valueBox.x2, capEnd);\n }\n\n this.linePoints = linePoints;\n },\n\n getCapsWidth: function(box, isVertical) {\n var boxSize = isVertical ? box.width() : box.height();\n var capsWidth = Math.min(Math.floor(boxSize / 2), DEFAULT_ERROR_BAR_WIDTH) || DEFAULT_ERROR_BAR_WIDTH;\n\n return capsWidth;\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var options = this.options;\n var visual = options.visual;\n\n if (visual) {\n this.visual = visual({\n low: this.low,\n high: this.high,\n rect: this.box.toRect(),\n sender: this.getSender(),\n options: {\n endCaps: options.endCaps,\n color: options.color,\n line: options.line\n },\n createVisual: function () {\n this$1.createDefaultVisual();\n var defaultVisual = this$1.visual;\n delete this$1.visual;\n return defaultVisual;\n }\n });\n } else {\n this.createDefaultVisual();\n }\n },\n\n createDefaultVisual: function() {\n var this$1 = this;\n\n var ref = this;\n var options = ref.options;\n var linePoints = ref.linePoints;\n var lineOptions = {\n stroke: {\n color: options.color,\n width: options.line.width,\n dashType: options.line.dashType\n }\n };\n\n ChartElement.fn.createVisual.call(this);\n\n for (var idx = 0; idx < linePoints.length; idx += 2) {\n var line = new Path(lineOptions)\n .moveTo(linePoints[idx].x, linePoints[idx].y)\n .lineTo(linePoints[idx + 1].x, linePoints[idx + 1].y);\n\n alignPathToPixel(line);\n this$1.visual.append(line);\n }\n }\n});\n\nsetDefaultOptions(ErrorBarBase, {\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n },\n endCaps: true,\n line: {\n width: 2\n },\n zIndex: 1\n});\n\nvar CategoricalErrorBar = ErrorBarBase.extend({\n getAxis: function() {\n var axis = this.chart.seriesValueAxis(this.series);\n\n return axis;\n }\n});\n\nvar MAX_EXPAND_DEPTH = 5;\n\nfunction evalOptions(options, context, state, dryRun) {\n if (state === void 0) { state = {}; }\n if (dryRun === void 0) { dryRun = false; }\n\n var defaults = state.defaults = state.defaults || {};\n var depth = state.depth = state.depth || 0;\n var needsEval = false;\n\n state.excluded = state.excluded || [];\n\n if (depth > MAX_EXPAND_DEPTH) {\n return null;\n }\n\n for (var property in options) {\n if (!inArray(property, state.excluded) && options.hasOwnProperty(property)) {\n var propValue = options[property];\n if (isFunction(propValue)) {\n needsEval = true;\n if (!dryRun) {\n options[property] = valueOrDefault(propValue(context), defaults[property]);\n }\n } else if (isObject(propValue)) {\n if (!dryRun) {\n state.defaults = defaults[property];\n }\n state.depth++;\n needsEval = evalOptions(propValue, context, state, dryRun) || needsEval;\n state.depth--;\n }\n }\n }\n\n return needsEval;\n}\n\nfunction categoriesCount(series) {\n var seriesCount = series.length;\n var categories = 0;\n\n for (var i = 0; i < seriesCount; i++) {\n categories = Math.max(categories, series[i].data.length);\n }\n\n return categories;\n}\n\nvar CategoricalChart = ChartElement.extend({\n init: function(plotArea, options) {\n ChartElement.fn.init.call(this, options);\n\n this.plotArea = plotArea;\n this.chartService = plotArea.chartService;\n this.categoryAxis = plotArea.seriesCategoryAxis(options.series[0]);\n\n // Value axis ranges grouped by axis name, e.g.:\n // primary: { min: 0, max: 1 }\n this.valueAxisRanges = {};\n\n this.points = [];\n this.categoryPoints = [];\n this.seriesPoints = [];\n this.seriesOptions = [];\n this._evalSeries = [];\n\n this.render();\n },\n\n render: function() {\n this.traverseDataPoints(this.addValue.bind(this));\n },\n\n pointOptions: function(series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().prototype.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({ }, defaults, {\n vertical: !this.options.invertAxes\n }, series);\n }\n\n return options;\n },\n\n plotValue: function(point) {\n if (!point) {\n return 0;\n }\n\n if (this.options.isStacked100 && isNumber(point.value)) {\n var categoryIx = point.categoryIx;\n var categoryPoints = this.categoryPoints[categoryIx];\n var otherValues = [];\n var categorySum = 0;\n\n for (var i = 0; i < categoryPoints.length; i++) {\n var other = categoryPoints[i];\n if (other) {\n var stack = point.series.stack;\n var otherStack = other.series.stack;\n\n if ((stack && otherStack) && stack.group !== otherStack.group) {\n continue;\n }\n\n if (isNumber(other.value)) {\n categorySum += Math.abs(other.value);\n otherValues.push(Math.abs(other.value));\n }\n }\n }\n\n if (categorySum > 0) {\n return point.value / categorySum;\n }\n }\n\n return point.value;\n },\n\n plotRange: function(point, startValue) {\n var this$1 = this;\n if (startValue === void 0) { startValue = 0; }\n\n var categoryPoints = this.categoryPoints[point.categoryIx];\n\n if (this.options.isStacked) {\n var plotValue = this.plotValue(point);\n var positive = plotValue >= 0;\n var prevValue = startValue;\n var isStackedBar = false;\n\n for (var i = 0; i < categoryPoints.length; i++) {\n var other = categoryPoints[i];\n\n if (point === other) {\n break;\n }\n\n var stack = point.series.stack;\n var otherStack = other.series.stack;\n if (stack && otherStack) {\n if (typeof stack === datavizConstants.STRING && stack !== otherStack) {\n continue;\n }\n\n if (stack.group && stack.group !== otherStack.group) {\n continue;\n }\n }\n\n var otherValue = this$1.plotValue(other);\n if ((otherValue >= 0 && positive) ||\n (otherValue < 0 && !positive)) {\n prevValue += otherValue;\n plotValue += otherValue;\n isStackedBar = true;\n\n if (this$1.options.isStacked100) {\n plotValue = Math.min(plotValue, 1);\n }\n }\n }\n\n if (isStackedBar) {\n prevValue -= startValue;\n }\n\n return [ prevValue, plotValue ];\n }\n\n var series = point.series;\n var valueAxis = this.seriesValueAxis(series);\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n\n return [ axisCrossingValue, dataviz.convertableToNumber(point.value) ? point.value : axisCrossingValue ];\n },\n\n stackLimits: function(axisName, stackName) {\n var this$1 = this;\n\n var min = MAX_VALUE;\n var max = MIN_VALUE;\n\n for (var i = 0; i < this.categoryPoints.length; i++) {\n var categoryPoints = this$1.categoryPoints[i];\n if (!categoryPoints) {\n continue;\n }\n\n for (var pIx = 0; pIx < categoryPoints.length; pIx++) {\n var point = categoryPoints[pIx];\n if (point) {\n if (point.series.stack === stackName || point.series.axis === axisName) {\n var to = this$1.plotRange(point, 0)[1];\n if (defined(to) && isFinite(to)) {\n max = Math.max(max, to);\n min = Math.min(min, to);\n }\n }\n }\n }\n }\n\n return { min: min, max: max };\n },\n\n updateStackRange: function() {\n var this$1 = this;\n\n var ref = this.options;\n var isStacked = ref.isStacked;\n var chartSeries = ref.series;\n var limitsCache = {};\n\n if (isStacked) {\n for (var i = 0; i < chartSeries.length; i++) {\n var series = chartSeries[i];\n var axisName = series.axis;\n var key = axisName + series.stack;\n\n var limits = limitsCache[key];\n if (!limits) {\n limits = this$1.stackLimits(axisName, series.stack);\n\n var errorTotals = this$1.errorTotals;\n if (errorTotals) {\n if (errorTotals.negative.length) {\n limits.min = Math.min(limits.min, dataviz.sparseArrayLimits(errorTotals.negative).min);\n }\n if (errorTotals.positive.length) {\n limits.max = Math.max(limits.max, dataviz.sparseArrayLimits(errorTotals.positive).max);\n }\n }\n\n if (limits.min !== MAX_VALUE || limits.max !== MIN_VALUE) {\n limitsCache[key] = limits;\n } else {\n limits = null;\n }\n }\n\n if (limits) {\n this$1.valueAxisRanges[axisName] = limits;\n }\n }\n }\n },\n\n addErrorBar: function(point, data, categoryIx) {\n var value = point.value;\n var series = point.series;\n var seriesIx = point.seriesIx;\n var errorBars = point.options.errorBars;\n var lowValue = data.fields[ERROR_LOW_FIELD];\n var highValue = data.fields[ERROR_HIGH_FIELD];\n var errorRange;\n\n if (isNumber(lowValue) && isNumber(highValue)) {\n errorRange = { low: lowValue, high: highValue };\n } else if (errorBars && defined(errorBars.value)) {\n this.seriesErrorRanges = this.seriesErrorRanges || [];\n this.seriesErrorRanges[seriesIx] = this.seriesErrorRanges[seriesIx] ||\n new ErrorRangeCalculator(errorBars.value, series, VALUE);\n\n errorRange = this.seriesErrorRanges[seriesIx].getErrorRange(value, errorBars.value);\n }\n\n if (errorRange) {\n point.low = errorRange.low;\n point.high = errorRange.high;\n this.addPointErrorBar(point, categoryIx);\n }\n },\n\n addPointErrorBar: function(point, categoryIx) {\n var isVertical = !this.options.invertAxes;\n var options = point.options.errorBars;\n var series = point.series;\n var low = point.low;\n var high = point.high;\n\n if (this.options.isStacked) {\n var stackedErrorRange = this.stackedErrorRange(point, categoryIx);\n low = stackedErrorRange.low;\n high = stackedErrorRange.high;\n } else {\n var fields = { categoryIx: categoryIx, series: series };\n this.updateRange({ value: low }, fields);\n this.updateRange({ value: high }, fields);\n }\n\n var errorBar = new CategoricalErrorBar(low, high, isVertical, this, series, options);\n point.errorBars = [ errorBar ];\n point.append(errorBar);\n },\n\n stackedErrorRange: function(point, categoryIx) {\n var plotValue = this.plotRange(point, 0)[1] - point.value;\n var low = point.low + plotValue;\n var high = point.high + plotValue;\n\n this.errorTotals = this.errorTotals || { positive: [], negative: [] };\n\n if (low < 0) {\n this.errorTotals.negative[categoryIx] = Math.min(this.errorTotals.negative[categoryIx] || 0, low);\n }\n\n if (high > 0) {\n this.errorTotals.positive[categoryIx] = Math.max(this.errorTotals.positive[categoryIx] || 0, high);\n }\n\n return { low: low, high: high };\n },\n\n addValue: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n\n var categoryPoints = this.categoryPoints[categoryIx];\n if (!categoryPoints) {\n this.categoryPoints[categoryIx] = categoryPoints = [];\n }\n\n var seriesPoints = this.seriesPoints[seriesIx];\n if (!seriesPoints) {\n this.seriesPoints[seriesIx] = seriesPoints = [];\n }\n\n var point = this.createPoint(data, fields);\n if (point) {\n $.extend(point, fields);\n\n point.owner = this;\n point.noteText = data.fields.noteText;\n if (!defined(point.dataItem)) {\n point.dataItem = series.data[categoryIx];\n }\n this.addErrorBar(point, data, categoryIx);\n }\n\n this.points.push(point);\n seriesPoints.push(point);\n categoryPoints.push(point);\n\n this.updateRange(data.valueFields, fields);\n },\n\n evalPointOptions: function(options, value, category, categoryIx, series, seriesIx) {\n var state = { defaults: series._defaults, excluded: [ \"data\", \"aggregate\", \"_events\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, pointOptions);\n evalOptions(pointOptions, {\n value: value,\n category: category,\n index: categoryIx,\n series: series,\n dataItem: series.data[categoryIx]\n }, state);\n }\n\n return pointOptions;\n },\n\n updateRange: function(data, fields) {\n var axisName = fields.series.axis;\n var value = data.value;\n var axisRange = this.valueAxisRanges[axisName];\n\n if (isFinite(value) && value !== null) {\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange.min = Math.min(axisRange.min, value);\n axisRange.max = Math.max(axisRange.max, value);\n }\n },\n\n seriesValueAxis: function(series) {\n var plotArea = this.plotArea;\n var axisName = series.axis;\n var axis = axisName ? plotArea.namedValueAxes[axisName] : plotArea.valueAxis;\n\n if (!axis) {\n throw new Error(\"Unable to locate value axis with name \" + axisName);\n }\n\n return axis;\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n var categorySlots = this.categorySlots = [];\n var chartPoints = this.points;\n var categoryAxis = this.categoryAxis;\n var pointIx = 0;\n\n this.traverseDataPoints(function (data, fields) {\n var categoryIx = fields.categoryIx;\n var currentSeries = fields.series;\n\n var valueAxis = this$1.seriesValueAxis(currentSeries);\n var point = chartPoints[pointIx++];\n\n var categorySlot = categorySlots[categoryIx];\n if (!categorySlot) {\n categorySlots[categoryIx] = categorySlot =\n this$1.categorySlot(categoryAxis, categoryIx, valueAxis);\n }\n\n if (point) {\n var plotRange = this$1.plotRange(point, valueAxis.startValue());\n var valueSlot = this$1.valueSlot(valueAxis, plotRange);\n if (valueSlot) {\n var pointSlot = this$1.pointSlot(categorySlot, valueSlot);\n\n point.aboveAxis = this$1.aboveAxis(point, valueAxis);\n point.stackValue = plotRange[1];\n\n if (this$1.options.isStacked100) {\n point.percentage = this$1.plotValue(point);\n }\n\n this$1.reflowPoint(point, pointSlot);\n } else {\n point.visible = false;\n }\n }\n });\n\n this.reflowCategories(categorySlots);\n if (!this.options.clip && this.options.limitPoints && this.points.length) {\n this.limitPoints();\n }\n\n this.box = targetBox;\n },\n\n valueSlot: function(valueAxis, plotRange) {\n return valueAxis.getSlot(plotRange[0], plotRange[1], !this.options.clip);\n },\n\n limitPoints: function() {\n var this$1 = this;\n\n var categoryPoints = this.categoryPoints;\n var points = categoryPoints[0].concat(last(categoryPoints));\n for (var idx = 0; idx < points.length; idx++) {\n if (points[idx]) {\n this$1.limitPoint(points[idx]);\n }\n }\n },\n\n limitPoint: function(point) {\n var limittedSlot = this.categoryAxis.limitSlot(point.box);\n if (!limittedSlot.equals(point.box)) {\n point.reflow(limittedSlot);\n }\n },\n\n aboveAxis: function(point, valueAxis) {\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n var value = point.value;\n\n return valueAxis.options.reverse ?\n value < axisCrossingValue : value >= axisCrossingValue;\n },\n\n categoryAxisCrossingValue: function(valueAxis) {\n var categoryAxis = this.categoryAxis;\n var options = valueAxis.options;\n var crossingValues = [].concat(\n options.axisCrossingValues || options.axisCrossingValue\n );\n\n return crossingValues[categoryAxis.axisIndex || 0] || 0;\n },\n\n reflowPoint: function(point, pointSlot) {\n point.reflow(pointSlot);\n },\n\n reflowCategories: function() { },\n\n pointSlot: function(categorySlot, valueSlot) {\n var options = this.options;\n var invertAxes = options.invertAxes;\n var slotX = invertAxes ? valueSlot : categorySlot;\n var slotY = invertAxes ? categorySlot : valueSlot;\n\n return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n },\n\n categorySlot: function(categoryAxis, categoryIx) {\n return categoryAxis.getSlot(categoryIx);\n },\n\n traverseDataPoints: function(callback) {\n var this$1 = this;\n\n var series = this.options.series;\n var count = categoriesCount(series);\n var seriesCount = series.length;\n\n for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n this$1._outOfRangeCallback(series[seriesIx], \"_outOfRangeMinPoint\", seriesIx, callback);\n }\n\n for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n for (var seriesIx$1 = 0; seriesIx$1 < seriesCount; seriesIx$1++) {\n var currentSeries = series[seriesIx$1];\n var currentCategory = this$1.categoryAxis.categoryAt(categoryIx);\n var pointData = this$1._bindPoint(currentSeries, seriesIx$1, categoryIx);\n\n callback(pointData, {\n category: currentCategory,\n categoryIx: categoryIx,\n categoriesCount: count,\n series: currentSeries,\n seriesIx: seriesIx$1\n });\n }\n }\n\n for (var seriesIx$2 = 0; seriesIx$2 < seriesCount; seriesIx$2++) {\n this$1._outOfRangeCallback(series[seriesIx$2], \"_outOfRangeMaxPoint\", seriesIx$2, callback);\n }\n },\n\n _outOfRangeCallback: function(series, field, seriesIx, callback) {\n var outOfRangePoint = series[field];\n if (outOfRangePoint) {\n var categoryIx = outOfRangePoint.categoryIx;\n var pointData = this._bindPoint(series, seriesIx, categoryIx, outOfRangePoint.item);\n\n callback(pointData, {\n category: outOfRangePoint.category,\n categoryIx: categoryIx,\n series: series,\n seriesIx: seriesIx,\n dataItem: outOfRangePoint.item\n });\n }\n },\n\n _bindPoint: function(series, seriesIx, categoryIx, item) {\n if (!this._bindCache) {\n this._bindCache = [];\n }\n\n var bindCache = this._bindCache[seriesIx];\n if (!bindCache) {\n bindCache = this._bindCache[seriesIx] = [];\n }\n\n var data = bindCache[categoryIx];\n if (!data) {\n data = bindCache[categoryIx] = SeriesBinder.current.bindPoint(series, categoryIx, item);\n }\n\n return data;\n },\n\n formatPointValue: function(point, format) {\n if (point.value === null) {\n return \"\";\n }\n\n return this.chartService.format.auto(format, point.value);\n },\n\n pointValue: function(data) {\n return data.valueFields.value;\n }\n});\n\nsetDefaultOptions(CategoricalChart, {\n series: [],\n invertAxes: false,\n isStacked: false,\n clip: true,\n limitPoints: true\n});\n\nvar PointEventsMixin = {\n click: function(chart, e) {\n return chart.trigger(\n SERIES_CLICK,\n this.eventArgs(e)\n );\n },\n\n hover: function(chart, e) {\n return chart.trigger(\n SERIES_HOVER,\n this.eventArgs(e)\n );\n },\n\n over: function(chart, e) {\n return chart.trigger(\n SERIES_OVER,\n this.eventArgs(e)\n );\n },\n\n out: function(chart, e) {\n return chart.trigger(\n SERIES_LEAVE,\n this.eventArgs(e)\n );\n },\n\n eventArgs: function(e) {\n return {\n value: this.value,\n percentage: this.percentage,\n stackValue: this.stackValue,\n category: this.category,\n series: this.series,\n dataItem: this.dataItem,\n runningTotal: this.runningTotal,\n total: this.total,\n element: eventElement(e),\n originalEvent: e,\n point: this\n };\n }\n};\n\nvar NoteMixin = {\n createNote: function() {\n var options = this.options.notes;\n var text = this.noteText || options.label.text;\n\n if (options.visible !== false && defined(text) && text !== null) {\n this.note = new dataviz.Note({\n value: this.value,\n text: text,\n dataItem: this.dataItem,\n category: this.category,\n series: this.series\n }, this.options.notes, this.owner.chartService);\n\n this.append(this.note);\n }\n }\n};\n\nvar LinePoint = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this);\n\n this.value = value;\n this.options = options;\n this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n this.tooltipTracking = true;\n },\n\n render: function() {\n var ref = this.options;\n var markers = ref.markers;\n var labels = ref.labels;\n\n if (this._rendered) {\n return;\n }\n\n this._rendered = true;\n\n if (markers.visible && markers.size) {\n this.marker = this.createMarker();\n this.append(this.marker);\n }\n\n if (labels.visible) {\n var labelTemplate = getTemplate(labels);\n var pointData = this.pointData();\n var labelText = this.value;\n if (labelTemplate) {\n labelText = labelTemplate(pointData);\n } else if (labels.format) {\n labelText = this.formatValue(labels.format);\n }\n this.label = new TextBox(labelText,\n deepExtend({\n align: CENTER,\n vAlign: CENTER,\n margin: {\n left: 5,\n right: 5\n },\n zIndex: valueOrDefault(labels.zIndex, this.series.zIndex)\n }, labels),\n pointData\n );\n this.append(this.label);\n }\n\n this.createNote();\n\n if (this.errorBar) {\n this.append(this.errorBar);\n }\n },\n\n markerBorder: function() {\n var options = this.options.markers;\n var background = options.background;\n var border = deepExtend({ color: this.color }, options.border);\n\n if (!defined(border.color)) {\n border.color = new Color(background).brightness(BORDER_BRIGHTNESS).toHex();\n }\n\n return border;\n },\n\n createVisual: function() {},\n\n createMarker: function() {\n var options = this.options.markers;\n var marker = new ShapeElement({\n type: options.type,\n width: options.size,\n height: options.size,\n rotation: options.rotation,\n background: options.background,\n border: this.markerBorder(),\n opacity: this.series.opacity || options.opacity,\n zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n animation: options.animation,\n visual: options.visual\n }, {\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n category: this.category\n });\n\n return marker;\n },\n\n markerBox: function() {\n if (!this.marker) {\n this.marker = this.createMarker();\n this.marker.reflow(this._childBox);\n }\n\n return this.marker.box;\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n var ref = this;\n var options = ref.options;\n var aboveAxis = ref.aboveAxis;\n var vertical = options.vertical;\n\n this.render();\n\n this.box = targetBox;\n var childBox = targetBox.clone();\n\n if (vertical) {\n if (aboveAxis) {\n childBox.y1 -= childBox.height();\n } else {\n childBox.y2 += childBox.height();\n }\n } else {\n if (aboveAxis) {\n childBox.x1 += childBox.width();\n } else {\n childBox.x2 -= childBox.width();\n }\n }\n\n this._childBox = childBox;\n if (this.marker) {\n this.marker.reflow(childBox);\n }\n\n this.reflowLabel(childBox);\n\n if (this.errorBars) {\n for (var i = 0; i < this.errorBars.length; i++) {\n this$1.errorBars[i].reflow(childBox);\n }\n }\n\n if (this.note) {\n var noteTargetBox = this.markerBox();\n\n if (!(options.markers.visible && options.markers.size)) {\n var center = noteTargetBox.center();\n noteTargetBox = new Box(center.x, center.y, center.x, center.y);\n }\n\n this.note.reflow(noteTargetBox);\n }\n },\n\n reflowLabel: function(box) {\n var ref = this;\n var options = ref.options;\n var label = ref.label;\n var anchor = options.labels.position;\n\n if (label) {\n anchor = anchor === ABOVE ? TOP : anchor;\n anchor = anchor === BELOW ? BOTTOM : anchor;\n\n label.reflow(box);\n label.box.alignTo(this.markerBox(), anchor);\n label.reflow(label.box);\n }\n },\n\n createHighlight: function() {\n var markers = this.options.highlight.markers;\n var defaultColor = this.markerBorder().color;\n var options = this.options.markers;\n var size = options.size + (options.border.width || 0) + (markers.border.width || 0);\n\n var shadow = new ShapeElement({\n type: options.type,\n width: size,\n height: size,\n rotation: options.rotation,\n background: markers.color || defaultColor,\n border: {\n color: markers.border.color,\n width: markers.border.width,\n opacity: valueOrDefault(markers.border.opacity, 1)\n },\n opacity: valueOrDefault(markers.opacity, 1)\n });\n shadow.reflow(this._childBox);\n\n return shadow.getElement();\n },\n\n highlightVisual: function() {\n return (this.marker || {}).visual;\n },\n\n highlightVisualArgs: function() {\n var marker = this.marker;\n var visual, rect;\n\n if (marker) {\n rect = marker.paddingBox.toRect();\n visual = marker.visual;\n } else {\n var size = this.options.markers.size;\n var halfSize = size / 2;\n var center = this.box.center();\n rect = new geometry.Rect([ center.x - halfSize, center.y - halfSize ], [ size, size ]);\n }\n\n return {\n options: this.options,\n rect: rect,\n visual: visual\n };\n },\n\n tooltipAnchor: function() {\n var markerBox = this.markerBox();\n var clipBox = this.owner.pane.clipBox();\n var showTooltip = !clipBox || clipBox.overlaps(markerBox);\n\n if (showTooltip) {\n var x = markerBox.x2 + TOOLTIP_OFFSET;\n var horizontalAlign = LEFT;\n var y, verticalAlign;\n\n if (this.aboveAxis) {\n y = markerBox.y1;\n verticalAlign = BOTTOM;\n } else {\n y = markerBox.y2;\n verticalAlign = TOP;\n }\n\n return {\n point: new Point(x, y),\n align: {\n horizontal: horizontalAlign,\n vertical: verticalAlign\n }\n };\n }\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n overlapsBox: function(box) {\n var markerBox = this.markerBox();\n return markerBox.overlaps(box);\n },\n\n unclipElements: function() {\n if (this.label) {\n this.label.options.noclip = true;\n }\n\n if (this.note) {\n this.note.options.noclip = true;\n }\n },\n\n pointData: function() {\n return {\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n percentage: this.percentage,\n stackValue: this.stackValue,\n series: this.series\n };\n }\n});\n\nLinePoint.prototype.defaults = {\n vertical: true,\n markers: {\n visible: true,\n background: WHITE,\n size: LINE_MARKER_SIZE,\n type: CIRCLE,\n border: {\n width: 2\n },\n opacity: 1\n },\n labels: {\n visible: false,\n position: ABOVE,\n margin: getSpacing(3),\n padding: getSpacing(4),\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n }\n },\n notes: {\n label: {}\n },\n highlight: {\n markers: {\n border: {\n color: \"#fff\",\n width: 2\n }\n },\n zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n },\n errorBars: {\n line: {\n width: 1\n }\n }\n};\n\ndeepExtend(LinePoint.prototype, PointEventsMixin);\ndeepExtend(LinePoint.prototype, NoteMixin);\n\nvar LineSegment = ChartElement.extend({\n init: function(linePoints, series, seriesIx) {\n ChartElement.fn.init.call(this);\n\n this.linePoints = linePoints;\n this.series = series;\n this.seriesIx = seriesIx;\n },\n\n points: function() {\n return this.toGeometryPoints(this.linePoints);\n },\n\n toGeometryPoints: function(points) {\n var result = [];\n for (var i = 0, length = points.length; i < length; i++) {\n if (points[i] && points[i].visible !== false) {\n result.push(points[i]._childBox.toRect().center());\n }\n }\n\n return result;\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var customVisual = this.series.visual;\n if (customVisual) {\n this.visual = customVisual({\n points: this.toGeometryPoints(this.linePoints),\n series: this.series,\n sender: this.getSender(),\n createVisual: function () {\n this$1.segmentVisual();\n\n return this$1.visual;\n }\n });\n if (this.visual && !defined(this.visual.options.zIndex)) {\n this.visual.options.zIndex = this.series.zIndex;\n }\n } else {\n this.segmentVisual();\n }\n },\n\n segmentVisual: function() {\n var ref = this;\n var options = ref.options;\n var series = ref.series;\n var color = series.color;\n var defaults = series._defaults;\n\n if (isFunction(color) && defaults) {\n color = defaults.color;\n }\n\n var line = Path.fromPoints(this.points(), {\n stroke: {\n color: color,\n width: series.width,\n opacity: series.opacity,\n dashType: series.dashType\n },\n zIndex: series.zIndex\n });\n\n if (options.closed) {\n line.close();\n }\n\n this.visual = line;\n },\n\n aliasFor: function(e, coords) {\n return this.parent.getNearestPoint(coords.x, coords.y, this.seriesIx);\n }\n});\n\nsetDefaultOptions(LineSegment, {\n closed: false\n});\n\nvar StepLineMixin = {\n calculateStepPoints: function(points) {\n var categoryAxis = this.parent.plotArea.seriesCategoryAxis(this.series);\n var ref = categoryAxis.options;\n var justified = ref.justified;\n var vertical = ref.vertical;\n var reverse = ref.reverse;\n\n var stepAxis = vertical ? X : Y;\n var axis = vertical ? Y : X;\n var stepDir = reverse ? 2 : 1;\n var dir = stepDir;\n\n var previousPoint = toGeometryPoint(points[0], stepAxis, stepDir, axis, dir);\n var result = [ previousPoint ];\n\n for (var idx = 1; idx < points.length; idx++) {\n var point = toGeometryPoint(points[idx], stepAxis, stepDir, axis, dir);\n\n if (previousPoint[stepAxis] !== point[stepAxis]) {\n var stepPoint = new GeometryPoint();\n stepPoint[stepAxis] = previousPoint[stepAxis];\n stepPoint[axis] = point[axis];\n\n result.push(stepPoint, point);\n }\n\n previousPoint = point;\n }\n\n if (!justified) {\n result.push(toGeometryPoint(last(points), stepAxis, stepDir, axis, reverse ? 1 : 2));\n } else if (previousPoint !== last(result)) {\n result.push(previousPoint);\n }\n\n return result;\n\n }\n};\n\nfunction toGeometryPoint(lintPoint, stepAxis, stepDir, axis, dir) {\n var box = lintPoint.box;\n var result = new GeometryPoint();\n\n result[stepAxis] = box[stepAxis + stepDir];\n result[axis] = box[axis + dir];\n\n return result;\n}\n\nvar StepLineSegment = LineSegment.extend({\n points: function() {\n return this.calculateStepPoints(this.linePoints);\n }\n});\n\ndeepExtend(StepLineSegment.prototype, StepLineMixin);\n\nvar SplineSegment = LineSegment.extend({\n segmentVisual: function() {\n var series = this.series;\n var defaults = series._defaults;\n var color = series.color;\n\n if (isFunction(color) && defaults) {\n color = defaults.color;\n }\n\n var curveProcessor = new CurveProcessor(this.options.closed);\n var segments = curveProcessor.process(this.points());\n var curve = new Path({\n stroke: {\n color: color,\n width: series.width,\n opacity: series.opacity,\n dashType: series.dashType\n },\n zIndex: series.zIndex\n });\n\n curve.segments.push.apply(curve.segments, segments);\n\n this.visual = curve;\n }\n});\n\nvar LineChartMixin = {\n renderSegments: function() {\n var this$1 = this;\n\n var ref = this;\n var options = ref.options;\n var seriesPoints = ref.seriesPoints;\n var series = options.series;\n var seriesCount = seriesPoints.length;\n var lastSegment;\n\n this._segments = [];\n\n for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n var currentSeries = series[seriesIx];\n var sortedPoints = this$1.sortPoints(seriesPoints[seriesIx]);\n var pointCount = sortedPoints.length;\n var linePoints = [];\n\n for (var pointIx = 0; pointIx < pointCount; pointIx++) {\n var point = sortedPoints[pointIx];\n if (point) {\n linePoints.push(point);\n } else if (this$1.seriesMissingValues(currentSeries) !== INTERPOLATE) {\n if (linePoints.length > 1) {\n lastSegment = this$1.createSegment(\n linePoints, currentSeries, seriesIx, lastSegment\n );\n this$1._addSegment(lastSegment);\n }\n linePoints = [];\n }\n }\n\n if (linePoints.length > 1) {\n lastSegment = this$1.createSegment(\n linePoints, currentSeries, seriesIx, lastSegment\n );\n this$1._addSegment(lastSegment);\n }\n }\n\n this.children.unshift.apply(this.children, this._segments);\n },\n\n _addSegment: function(segment) {\n this._segments.push(segment);\n segment.parent = this;\n },\n\n sortPoints: function(points) {\n return points;\n },\n\n seriesMissingValues: function(series) {\n var missingValues = series.missingValues;\n var assumeZero = !missingValues && this.options.isStacked;\n\n return assumeZero ? ZERO : missingValues || INTERPOLATE;\n },\n\n getNearestPoint: function(x, y, seriesIx) {\n var target = new Point(x, y);\n var allPoints = this.seriesPoints[seriesIx];\n var nearestPointDistance = MAX_VALUE;\n var nearestPoint;\n\n for (var i = 0; i < allPoints.length; i++) {\n var point = allPoints[i];\n\n if (point && defined(point.value) && point.value !== null && point.visible !== false) {\n var pointBox = point.box;\n var pointDistance = pointBox.center().distanceTo(target);\n\n if (pointDistance < nearestPointDistance) {\n nearestPoint = point;\n nearestPointDistance = pointDistance;\n }\n }\n }\n\n return nearestPoint;\n }\n};\n\nvar ClipAnimation = Animation.extend({\n setup: function() {\n this._setEnd(this.options.box.x1);\n },\n\n step: function(pos) {\n var box = this.options.box;\n this._setEnd(dataviz.interpolateValue(box.x1, box.x2, pos));\n },\n\n _setEnd: function(x) {\n var element = this.element;\n var segments = element.segments;\n var topRight = segments[1].anchor();\n var bottomRight = segments[2].anchor();\n\n element.suspend();\n topRight.setX(x);\n element.resume();\n bottomRight.setX(x);\n }\n});\n\nsetDefaultOptions(ClipAnimation, {\n duration: INITIAL_ANIMATION_DURATION\n});\n\nAnimationFactory.current.register(\"clip\", ClipAnimation);\n\nfunction anyHasZIndex(elements) {\n for (var idx = 0; idx < elements.length; idx++) {\n if (defined(elements[idx].zIndex)) {\n return true;\n }\n }\n}\n\nvar ClipAnimationMixin = {\n createAnimation: function() {\n var root = this.getRoot();\n if (root && (root.options || {}).transitions !== false) {\n var box = root.size();\n var clipPath = Path.fromRect(box.toRect());\n this.visual.clip(clipPath);\n this.animation = new ClipAnimation(clipPath, {\n box: box\n });\n if (anyHasZIndex(this.options.series)) {\n this._setChildrenAnimation(clipPath);\n }\n }\n },\n\n _setChildrenAnimation: function(clipPath) {\n var points = this.animationPoints();\n\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n if (point && point.visual && defined(point.visual.options.zIndex)) {\n point.visual.clip(clipPath);\n }\n }\n }\n};\n\nvar LineChart = CategoricalChart.extend({\n render: function() {\n\n CategoricalChart.fn.render.call(this);\n\n this.updateStackRange();\n this.renderSegments();\n },\n\n pointType: function() {\n return LinePoint;\n },\n\n createPoint: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var missingValues = this.seriesMissingValues(series);\n var value = data.valueFields.value;\n\n if (!defined(value) || value === null) {\n if (missingValues === ZERO) {\n value = 0;\n } else {\n return null;\n }\n }\n\n var pointOptions = this.pointOptions(series, seriesIx);\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n var color = data.fields.color || series.color;\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new LinePoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n plotRange: function(point) {\n var this$1 = this;\n\n var plotValue = this.plotValue(point);\n\n if (this.options.isStacked) {\n var categoryIx = point.categoryIx;\n var categoryPoints = this.categoryPoints[categoryIx];\n\n for (var i = 0; i < categoryPoints.length; i++) {\n var other = categoryPoints[i];\n\n if (point === other) {\n break;\n }\n\n plotValue += this$1.plotValue(other);\n\n if (this$1.options.isStacked100) {\n plotValue = Math.min(plotValue, 1);\n }\n }\n\n }\n\n return [ plotValue, plotValue ];\n },\n\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = currentSeries.style;\n var pointType;\n\n if (style === STEP) {\n pointType = StepLineSegment;\n } else if (style === SMOOTH) {\n pointType = SplineSegment;\n } else {\n pointType = LineSegment;\n }\n\n return new pointType(linePoints, currentSeries, seriesIx);\n },\n\n animationPoints: function() {\n var points = this.points;\n var result = [];\n for (var idx = 0; idx < points.length; idx++) {\n result.push((points[idx] || {}).marker);\n }\n return result.concat(this._segments);\n },\n\n supportsPointInactiveOpacity: function() {\n return false;\n }\n});\n\ndeepExtend(LineChart.prototype, LineChartMixin, ClipAnimationMixin);\n\nvar AreaSegment = LineSegment.extend({\n init: function(linePoints, currentSeries, seriesIx, prevSegment, stackPoints) {\n LineSegment.fn.init.call(this, linePoints, currentSeries, seriesIx);\n\n this.prevSegment = prevSegment;\n this.stackPoints = stackPoints;\n },\n\n createVisual: function() {\n var series = this.series;\n var defaults = series._defaults;\n var lineOptions = series.line || {};\n var color = series.color;\n\n if (isFunction(color) && defaults) {\n color = defaults.color;\n }\n\n this.visual = new Group({\n zIndex: series.zIndex\n });\n\n this.createFill({\n fill: {\n color: color,\n opacity: series.opacity\n },\n stroke: null\n });\n\n if (lineOptions.width > 0 && lineOptions.visible !== false) {\n this.createStroke({\n stroke: deepExtend({\n color: color,\n opacity: series.opacity,\n lineCap: \"butt\"\n }, lineOptions)\n });\n }\n },\n\n strokeSegments: function() {\n var segments = this._strokeSegments;\n\n if (!segments) {\n segments = this._strokeSegments = this.createStrokeSegments();\n }\n\n return segments;\n },\n\n createStrokeSegments: function() {\n return this.segmentsFromPoints(this.points());\n },\n\n stackSegments: function() {\n if (this.prevSegment) {\n return this.prevSegment.createStackSegments(this.stackPoints);\n }\n\n return this.createStackSegments(this.stackPoints);\n },\n\n createStackSegments: function(stackPoints) {\n return this.segmentsFromPoints(this.toGeometryPoints(stackPoints)).reverse();\n },\n\n segmentsFromPoints: function(points) {\n return points.map(function (point) { return new geometry.Segment(point); });\n },\n\n createStroke: function(style) {\n var stroke = new Path(style);\n stroke.segments.push.apply(stroke.segments, this.strokeSegments());\n\n this.visual.append(stroke);\n },\n\n hasStackSegment: function() {\n return this.prevSegment || (this.stackPoints && this.stackPoints.length);\n },\n\n createFill: function(style) {\n var strokeSegments = this.strokeSegments();\n var fillSegments = strokeSegments.slice(0);\n var hasStackSegments = this.hasStackSegment();\n\n if (hasStackSegments) {\n var stackSegments = this.stackSegments();\n\n append(fillSegments, stackSegments);\n }\n\n var fill = new Path(style);\n fill.segments.push.apply(fill.segments, fillSegments);\n\n if (!hasStackSegments && strokeSegments.length > 1) {\n this.fillToAxes(fill);\n }\n\n this.visual.append(fill);\n },\n\n fillToAxes: function(fillPath) {\n var chart = this.parent;\n var invertAxes = chart.options.invertAxes;\n var valueAxis = chart.seriesValueAxis(this.series);\n var crossingValue = chart.categoryAxisCrossingValue(valueAxis);\n var endSlot = valueAxis.getSlot(crossingValue, crossingValue, true);\n var segments = this.strokeSegments();\n var firstPoint = segments[0].anchor();\n var lastPoint = last(segments).anchor();\n var end = invertAxes ? endSlot.x1 : endSlot.y1;\n\n if (invertAxes) {\n fillPath.lineTo(end, lastPoint.y)\n .lineTo(end, firstPoint.y);\n } else {\n fillPath.lineTo(lastPoint.x, end)\n .lineTo(firstPoint.x, end);\n }\n }\n});\n\nvar StepAreaSegment = AreaSegment.extend({\n createStrokeSegments: function() {\n return this.segmentsFromPoints(this.calculateStepPoints(this.linePoints));\n },\n\n createStackSegments: function(stackPoints) {\n return this.segmentsFromPoints(this.calculateStepPoints(stackPoints)).reverse();\n }\n});\n\ndeepExtend(StepAreaSegment.prototype, StepLineMixin);\n\nvar SplineAreaSegment = AreaSegment.extend({\n createStrokeSegments: function() {\n var curveProcessor = new CurveProcessor(this.options.closed);\n var linePoints = this.points();\n\n return curveProcessor.process(linePoints);\n },\n\n createStackSegments: function() {\n var strokeSegments = this.strokeSegments();\n var stackSegments = [];\n for (var idx = strokeSegments.length - 1; idx >= 0; idx--) {\n var segment = strokeSegments[idx];\n stackSegments.push(new geometry.Segment(\n segment.anchor(),\n segment.controlOut(),\n segment.controlIn()\n ));\n }\n\n return stackSegments;\n }\n});\n\nvar AreaChart = LineChart.extend({\n createSegment: function(linePoints, currentSeries, seriesIx, prevSegment) {\n var isStacked = this.options.isStacked;\n var style = (currentSeries.line || {}).style;\n var previousSegment;\n\n var stackPoints;\n if (isStacked && seriesIx > 0 && prevSegment) {\n var missingValues = this.seriesMissingValues(currentSeries);\n if (missingValues !== \"gap\") {\n stackPoints = prevSegment.linePoints;\n previousSegment = prevSegment;\n } else {\n stackPoints = this._gapStackPoints(linePoints, seriesIx, style);\n }\n }\n\n var pointType;\n if (style === STEP) {\n pointType = StepAreaSegment;\n } else if (style === SMOOTH) {\n pointType = SplineAreaSegment;\n } else {\n pointType = AreaSegment;\n }\n\n return new pointType(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n LineChart.fn.reflow.call(this, targetBox);\n\n var stackPoints = this._stackPoints;\n if (stackPoints) {\n for (var idx = 0; idx < stackPoints.length; idx++) {\n var stackPoint = stackPoints[idx];\n var pointSlot = this$1.categoryAxis.getSlot(stackPoint.categoryIx);\n stackPoint.reflow(pointSlot);\n }\n }\n },\n\n _gapStackPoints: function(linePoints, seriesIx, style) {\n var this$1 = this;\n\n var seriesPoints = this.seriesPoints;\n var startIdx = linePoints[0].categoryIx;\n var length = linePoints.length;\n if (startIdx < 0) {\n startIdx = 0;\n length--;\n }\n\n var endIdx = startIdx + length;\n var pointOffset = this.seriesOptions[0]._outOfRangeMinPoint ? 1 : 0;\n var stackPoints = [];\n\n this._stackPoints = this._stackPoints || [];\n for (var categoryIx = startIdx; categoryIx < endIdx; categoryIx++) {\n var pointIx = categoryIx + pointOffset;\n var currentSeriesIx = seriesIx;\n var point = (void 0);\n\n do {\n currentSeriesIx--;\n point = seriesPoints[currentSeriesIx][pointIx];\n } while (currentSeriesIx > 0 && !point);\n\n if (point) {\n if (style !== STEP && categoryIx > startIdx && !seriesPoints[currentSeriesIx][pointIx - 1]) {\n stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx - 1, currentSeriesIx));\n }\n\n stackPoints.push(point);\n\n if (style !== STEP && categoryIx + 1 < endIdx && !seriesPoints[currentSeriesIx][pointIx + 1]) {\n stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx + 1, currentSeriesIx));\n }\n } else {\n var gapStackPoint = this$1._createGapStackPoint(categoryIx);\n this$1._stackPoints.push(gapStackPoint);\n stackPoints.push(gapStackPoint);\n }\n }\n\n return stackPoints;\n },\n\n _previousSegmentPoint: function(categoryIx, pointIx, segmentIx, seriesIdx) {\n var seriesPoints = this.seriesPoints;\n var index = seriesIdx;\n var point;\n\n while (index > 0 && !point) {\n index--;\n point = seriesPoints[index][segmentIx];\n }\n\n if (!point) {\n point = this._createGapStackPoint(categoryIx);\n this._stackPoints.push(point);\n } else {\n point = seriesPoints[index][pointIx];\n }\n\n return point;\n },\n\n _createGapStackPoint: function(categoryIx) {\n var options = this.pointOptions({}, 0);\n var point = new LinePoint(0, options);\n point.categoryIx = categoryIx;\n point.series = {};\n\n return point;\n },\n\n seriesMissingValues: function(series) {\n return series.missingValues || ZERO;\n },\n\n supportsPointInactiveOpacity: function() {\n return false;\n }\n});\n\nvar AxisGroupRangeTracker = Class.extend({\n init: function() {\n\n this.axisRanges = {};\n },\n\n update: function(chartAxisRanges) {\n var axisRanges = this.axisRanges;\n\n for (var axisName in chartAxisRanges) {\n var chartRange = chartAxisRanges[axisName];\n var range = axisRanges[axisName];\n axisRanges[axisName] = range = range || { min: MAX_VALUE, max: MIN_VALUE };\n\n range.min = Math.min(range.min, chartRange.min);\n range.max = Math.max(range.max, chartRange.max);\n }\n },\n\n reset: function(axisName) {\n this.axisRanges[axisName] = undefined;\n },\n\n query: function(axisName) {\n return this.axisRanges[axisName];\n }\n});\n\nvar BarLabel = ChartElement.extend({\n init: function(content, options, pointData) {\n ChartElement.fn.init.call(this, options);\n\n this.textBox = new TextBox(content, this.options, pointData);\n this.append(this.textBox);\n },\n\n createVisual: function() {\n this.textBox.options.noclip = this.options.noclip;\n },\n\n reflow: function(targetBox) {\n var options = this.options;\n var vertical = options.vertical;\n var aboveAxis = options.aboveAxis;\n var text = this.children[0];\n var textOptions = text.options;\n var box = text.box;\n var padding = text.options.padding;\n var labelBox = targetBox;\n\n textOptions.align = vertical ? CENTER : LEFT;\n textOptions.vAlign = vertical ? TOP : CENTER;\n\n if (options.position === INSIDE_END) {\n if (vertical) {\n textOptions.vAlign = TOP;\n\n if (!aboveAxis && box.height() < targetBox.height()) {\n textOptions.vAlign = BOTTOM;\n }\n } else {\n textOptions.align = aboveAxis ? RIGHT : LEFT;\n }\n } else if (options.position === CENTER) {\n textOptions.vAlign = CENTER;\n textOptions.align = CENTER;\n } else if (options.position === INSIDE_BASE) {\n if (vertical) {\n textOptions.vAlign = aboveAxis ? BOTTOM : TOP;\n } else {\n textOptions.align = aboveAxis ? LEFT : RIGHT;\n }\n } else if (options.position === OUTSIDE_END) {\n if (vertical) {\n if (aboveAxis) {\n labelBox = new Box(\n targetBox.x1, targetBox.y1 - box.height(),\n targetBox.x2, targetBox.y1\n );\n } else {\n labelBox = new Box(\n targetBox.x1, targetBox.y2,\n targetBox.x2, targetBox.y2 + box.height()\n );\n }\n } else {\n textOptions.align = CENTER;\n if (aboveAxis) {\n labelBox = new Box(\n targetBox.x2, targetBox.y1,\n targetBox.x2 + box.width(), targetBox.y2\n );\n } else {\n labelBox = new Box(\n targetBox.x1 - box.width(), targetBox.y1,\n targetBox.x1, targetBox.y2\n );\n }\n }\n }\n\n if (!options.rotation) {\n if (vertical) {\n padding.left = padding.right =\n (labelBox.width() - text.contentBox.width()) / 2;\n } else {\n padding.top = padding.bottom =\n (labelBox.height() - text.contentBox.height()) / 2;\n }\n }\n\n text.reflow(labelBox);\n },\n\n alignToClipBox: function(clipBox) {\n var vertical = this.options.vertical;\n var field = vertical ? Y : X;\n var start = field + \"1\";\n var end = field + \"2\";\n var text = this.children[0];\n var parentBox = this.parent.box;\n\n if (parentBox[start] < clipBox[start] || clipBox[end] < parentBox[end]) {\n var targetBox = text.paddingBox.clone();\n targetBox[start] = Math.max(parentBox[start], clipBox[start]);\n targetBox[end] = Math.min(parentBox[end], clipBox[end]);\n\n this.reflow(targetBox);\n }\n }\n});\n\nsetDefaultOptions(BarLabel, {\n position: OUTSIDE_END,\n margin: getSpacing(3),\n padding: getSpacing(4),\n color: BLACK,\n background: \"\",\n border: {\n width: 1,\n color: \"\"\n },\n aboveAxis: true,\n vertical: false,\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n },\n zIndex: 2\n});\n\nfunction hasGradientOverlay(options) {\n var overlay = options.overlay;\n\n return overlay && overlay.gradient && overlay.gradient !== \"none\";\n}\n\nvar BAR_ALIGN_MIN_WIDTH = 6;\n\nvar Bar = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this);\n\n this.options = options;\n this.color = options.color || WHITE;\n this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n this.value = value;\n },\n\n render: function() {\n if (this._rendered) {\n return;\n }\n\n this._rendered = true;\n\n this.createLabel();\n this.createNote();\n\n if (this.errorBar) {\n this.append(this.errorBar);\n }\n },\n\n createLabel: function() {\n var options = this.options;\n var labels = options.labels;\n\n if (labels.visible) {\n var pointData = this.pointData();\n var labelTemplate = getTemplate(labels);\n var labelText;\n\n if (labelTemplate) {\n labelText = labelTemplate(pointData);\n } else {\n labelText = this.formatValue(labels.format);\n }\n\n this.label = new BarLabel(labelText,\n deepExtend({\n vertical: options.vertical\n },\n labels\n ), pointData);\n this.append(this.label);\n }\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n this.render();\n\n var label = this.label;\n\n this.box = targetBox;\n\n if (label) {\n label.options.aboveAxis = this.aboveAxis;\n label.reflow(targetBox);\n }\n\n if (this.note) {\n this.note.reflow(targetBox);\n }\n\n if (this.errorBars) {\n for (var i = 0; i < this.errorBars.length; i++) {\n this$1.errorBars[i].reflow(targetBox);\n }\n }\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var ref = this;\n var box = ref.box;\n var options = ref.options;\n var customVisual = options.visual;\n\n if (this.visible !== false) {\n ChartElement.fn.createVisual.call(this);\n\n if (customVisual) {\n var visual = this.rectVisual = customVisual({\n category: this.category,\n dataItem: this.dataItem,\n value: this.value,\n sender: this.getSender(),\n series: this.series,\n percentage: this.percentage,\n stackValue: this.stackValue,\n runningTotal: this.runningTotal,\n total: this.total,\n rect: box.toRect(),\n createVisual: function () {\n var group = new Group();\n this$1.createRect(group);\n return group;\n },\n options: options\n });\n\n if (visual) {\n this.visual.append(visual);\n }\n } else if (box.width() > 0 && box.height() > 0) {\n this.createRect(this.visual);\n }\n }\n },\n\n createRect: function(visual) {\n var options = this.options;\n var border = options.border;\n var strokeOpacity = defined(border.opacity) ? border.opacity : options.opacity;\n var rect = this.box.toRect();\n\n rect.size.width = Math.round(rect.size.width);\n\n var path = this.rectVisual = Path.fromRect(rect, {\n fill: {\n color: this.color,\n opacity: options.opacity\n },\n stroke: {\n color: this.getBorderColor(),\n width: border.width,\n opacity: strokeOpacity,\n dashType: border.dashType\n }\n });\n\n var width = this.box.width();\n var height = this.box.height();\n\n var size = options.vertical ? width : height;\n\n if (size > BAR_ALIGN_MIN_WIDTH) {\n alignPathToPixel(path);\n\n // Fixes lineJoin issue in firefox when the joined lines are parallel\n if (width < 1 || height < 1) {\n path.options.stroke.lineJoin = \"round\";\n }\n }\n\n visual.append(path);\n\n if (hasGradientOverlay(options)) {\n var overlay = this.createGradientOverlay(path, { baseColor: this.color }, deepExtend({\n end: !options.vertical ? [ 0, 1 ] : undefined\n }, options.overlay));\n\n visual.append(overlay);\n }\n },\n\n createHighlight: function(style) {\n var highlight = Path.fromRect(this.box.toRect(), style);\n\n return alignPathToPixel(highlight);\n },\n\n highlightVisual: function() {\n return this.rectVisual;\n },\n\n highlightVisualArgs: function() {\n return {\n options: this.options,\n rect: this.box.toRect(),\n visual: this.rectVisual\n };\n },\n\n getBorderColor: function() {\n var color = this.color;\n var border = this.options.border;\n var brightness = border._brightness || BORDER_BRIGHTNESS;\n var borderColor = border.color;\n\n if (!defined(borderColor)) {\n borderColor = new Color(color).brightness(brightness).toHex();\n }\n\n return borderColor;\n },\n\n tooltipAnchor: function() {\n var ref = this;\n var options = ref.options;\n var box = ref.box;\n var aboveAxis = ref.aboveAxis;\n var clipBox = this.owner.pane.clipBox() || box;\n var horizontalAlign = LEFT;\n var verticalAlign = TOP;\n var x, y;\n\n if (options.vertical) {\n x = Math.min(box.x2, clipBox.x2) + TOOLTIP_OFFSET;\n if (aboveAxis) {\n y = Math.max(box.y1, clipBox.y1);\n } else {\n y = Math.min(box.y2, clipBox.y2);\n verticalAlign = BOTTOM;\n }\n } else {\n var x1 = Math.max(box.x1, clipBox.x1);\n var x2 = Math.min(box.x2, clipBox.x2);\n\n if (options.isStacked) {\n verticalAlign = BOTTOM;\n if (aboveAxis) {\n horizontalAlign = RIGHT;\n x = x2;\n } else {\n x = x1;\n }\n y = Math.max(box.y1, clipBox.y1) - TOOLTIP_OFFSET;\n } else {\n if (aboveAxis) {\n x = x2 + TOOLTIP_OFFSET;\n } else {\n x = x1 - TOOLTIP_OFFSET;\n horizontalAlign = RIGHT;\n }\n y = Math.max(box.y1, clipBox.y1);\n }\n }\n\n return {\n point: new Point(x, y),\n align: {\n horizontal: horizontalAlign,\n vertical: verticalAlign\n }\n };\n },\n\n overlapsBox: function(box) {\n return this.box.overlaps(box);\n },\n\n pointData: function() {\n return {\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n percentage: this.percentage,\n stackValue: this.stackValue,\n runningTotal: this.runningTotal,\n total: this.total,\n series: this.series\n };\n }\n});\n\ndeepExtend(Bar.prototype, PointEventsMixin);\ndeepExtend(Bar.prototype, NoteMixin);\n\nBar.prototype.defaults = {\n border: {\n width: 1\n },\n vertical: true,\n overlay: {\n gradient: \"glass\"\n },\n labels: {\n visible: false,\n format: \"{0}\"\n },\n opacity: 1,\n notes: {\n label: {}\n }\n};\n\nfunction forEach(elements, callback) {\n elements.forEach(callback);\n}\n\nfunction forEachReverse(elements, callback) {\n var length = elements.length;\n\n for (var idx = length - 1; idx >= 0; idx--) {\n callback(elements[idx], idx - length - 1);\n }\n}\n\nvar ClusterLayout = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n\n this.forEach = options.rtl ? forEachReverse : forEach;\n },\n\n reflow: function(box) {\n var ref = this.options;\n var vertical = ref.vertical;\n var gap = ref.gap;\n var spacing = ref.spacing;\n var children = this.children;\n var count = children.length;\n var axis = vertical ? Y : X;\n var slots = count + gap + (spacing * (count - 1));\n var slotSize = (vertical ? box.height() : box.width()) / slots;\n var position = box[axis + 1] + slotSize * (gap / 2);\n\n this.forEach(children, function (child, idx) {\n var childBox = (child.box || box).clone();\n\n childBox[axis + 1] = position;\n childBox[axis + 2] = position + slotSize;\n\n child.reflow(childBox);\n if (idx < count - 1) {\n position += (slotSize * spacing);\n }\n\n position += slotSize;\n });\n }\n});\n\nsetDefaultOptions(ClusterLayout, {\n vertical: false,\n gap: 0,\n spacing: 0\n});\n\nvar StackWrap = ChartElement.extend({\n reflow: function(targetBox) {\n var this$1 = this;\n\n var positionAxis = this.options.vertical ? X : Y;\n var children = this.children;\n var childrenCount = children.length;\n var box = this.box = new Box();\n\n for (var i = 0; i < childrenCount; i++) {\n var currentChild = children[i];\n\n if (currentChild.visible !== false) {\n var childBox = currentChild.box.clone();\n childBox.snapTo(targetBox, positionAxis);\n\n if (i === 0) {\n box = this$1.box = childBox.clone();\n }\n\n currentChild.reflow(childBox);\n box.wrap(childBox);\n }\n }\n }\n});\n\nsetDefaultOptions(StackWrap, {\n vertical: true\n});\n\nvar BarChart = CategoricalChart.extend({\n render: function() {\n CategoricalChart.fn.render.call(this);\n this.updateStackRange();\n },\n\n pointType: function() {\n return Bar;\n },\n\n clusterType: function() {\n return ClusterLayout;\n },\n\n stackType: function() {\n return StackWrap;\n },\n\n stackLimits: function(axisName, stackName) {\n var limits = CategoricalChart.fn.stackLimits.call(this, axisName, stackName);\n\n return limits;\n },\n\n createPoint: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var isStacked = options.isStacked;\n var value = this.pointValue(data);\n var pointOptions = this.pointOptions(series, seriesIx);\n\n var labelOptions = pointOptions.labels;\n if (isStacked) {\n if (labelOptions.position === OUTSIDE_END) {\n labelOptions.position = INSIDE_END;\n }\n }\n\n pointOptions.isStacked = isStacked;\n\n var color = data.fields.color || series.color;\n if (value < 0 && pointOptions.negativeColor) {\n color = pointOptions.negativeColor;\n }\n\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var pointType = this.pointType();\n var point = new pointType(value, pointOptions);\n point.color = color;\n\n var cluster = children[categoryIx];\n if (!cluster) {\n var clusterType = this.clusterType();\n cluster = new clusterType({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n if (isStacked) {\n var stackWrap = this.getStackWrap(series, cluster);\n stackWrap.append(point);\n } else {\n cluster.append(point);\n }\n\n return point;\n },\n\n getStackWrap: function(series, cluster) {\n var stack = series.stack;\n var stackGroup = stack ? stack.group || stack : stack;\n var wraps = cluster.children;\n var stackWrap;\n\n if (typeof stackGroup === datavizConstants.STRING) {\n for (var i = 0; i < wraps.length; i++) {\n if (wraps[i]._stackGroup === stackGroup) {\n stackWrap = wraps[i];\n break;\n }\n }\n } else {\n stackWrap = wraps[0];\n }\n\n if (!stackWrap) {\n var stackType = this.stackType();\n stackWrap = new stackType({\n vertical: !this.options.invertAxes\n });\n stackWrap._stackGroup = stackGroup;\n cluster.append(stackWrap);\n }\n\n return stackWrap;\n },\n\n categorySlot: function(categoryAxis, categoryIx, valueAxis) {\n var options = this.options;\n var categorySlot = categoryAxis.getSlot(categoryIx);\n var startValue = valueAxis.startValue();\n\n if (options.isStacked) {\n var zeroSlot = valueAxis.getSlot(startValue, startValue, true);\n var stackAxis = options.invertAxes ? X : Y;\n categorySlot[stackAxis + 1] = categorySlot[stackAxis + 2] = zeroSlot[stackAxis + 1];\n }\n\n return categorySlot;\n },\n\n reflowCategories: function(categorySlots) {\n var children = this.children;\n var childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n\n createAnimation: function() {\n this._setAnimationOptions();\n CategoricalChart.fn.createAnimation.call(this);\n\n if (anyHasZIndex(this.options.series)) {\n this._setChildrenAnimation();\n }\n },\n\n _setChildrenAnimation: function() {\n var this$1 = this;\n\n var points = this.points;\n\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n var pointVisual = point.visual;\n if (pointVisual && defined(pointVisual.options.zIndex)) {\n point.options.animation = this$1.options.animation;\n point.createAnimation();\n }\n }\n },\n\n _setAnimationOptions: function() {\n var options = this.options;\n var animation = options.animation || {};\n var origin;\n\n if (options.isStacked) {\n var valueAxis = this.seriesValueAxis(options.series[0]);\n origin = valueAxis.getSlot(valueAxis.startValue());\n } else {\n origin = this.categoryAxis.getSlot(0);\n }\n\n animation.origin = new GeometryPoint(origin.x1, origin.y1);\n animation.vertical = !options.invertAxes;\n }\n});\n\nsetDefaultOptions(BarChart, {\n animation: {\n type: BAR\n }\n});\n\nvar Candlestick = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this, options);\n this.value = value;\n },\n\n reflow: function(box) {\n var ref = this;\n var options = ref.options;\n var value = ref.value;\n var chart = ref.owner;\n var valueAxis = chart.seriesValueAxis(options);\n var ocSlot = valueAxis.getSlot(value.open, value.close);\n var lhSlot = valueAxis.getSlot(value.low, value.high);\n\n ocSlot.x1 = lhSlot.x1 = box.x1;\n ocSlot.x2 = lhSlot.x2 = box.x2;\n\n this.realBody = ocSlot;\n\n var mid = lhSlot.center().x;\n var points = [];\n\n points.push([ [ mid, lhSlot.y1 ], [ mid, ocSlot.y1 ] ]);\n points.push([ [ mid, ocSlot.y2 ], [ mid, lhSlot.y2 ] ]);\n\n this.lines = points;\n\n this.box = lhSlot.clone().wrap(ocSlot);\n\n if (!this._rendered) {\n this._rendered = true;\n this.createNote();\n }\n\n this.reflowNote();\n },\n\n reflowNote: function() {\n if (this.note) {\n this.note.reflow(this.box);\n }\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n this._mainVisual = this.mainVisual(this.options);\n this.visual.append(\n this._mainVisual\n );\n\n this.createOverlay();\n },\n\n mainVisual: function(options) {\n var group = new Group();\n\n this.createBody(group, options);\n this.createLines(group, options);\n\n return group;\n },\n\n createBody: function(container, options) {\n var body = Path.fromRect(this.realBody.toRect(), {\n fill: {\n color: this.color,\n opacity: options.opacity\n },\n stroke: null\n });\n\n if (options.border.width > 0) {\n body.options.set(\"stroke\", {\n color: this.getBorderColor(),\n width: options.border.width,\n dashType: options.border.dashType,\n opacity: valueOrDefault(options.border.opacity, options.opacity)\n });\n }\n\n alignPathToPixel(body);\n container.append(body);\n\n if (hasGradientOverlay(options)) {\n container.append(this.createGradientOverlay(body, { baseColor: this.color }, deepExtend({\n end: !options.vertical ? [ 0, 1 ] : undefined\n }, options.overlay)));\n }\n },\n\n createLines: function(container, options) {\n this.drawLines(container, options, this.lines, options.line);\n },\n\n drawLines: function(container, options, lines, lineOptions) {\n if (!lines) {\n return;\n }\n\n var lineStyle = {\n stroke: {\n color: lineOptions.color || this.color,\n opacity: valueOrDefault(lineOptions.opacity, options.opacity),\n width: lineOptions.width,\n dashType: lineOptions.dashType,\n lineCap: \"butt\"\n }\n };\n\n for (var i = 0; i < lines.length; i++) {\n var line = Path.fromPoints(lines[i], lineStyle);\n alignPathToPixel(line);\n container.append(line);\n }\n },\n\n getBorderColor: function() {\n var border = this.options.border;\n var borderColor = border.color;\n\n if (!defined(borderColor)) {\n borderColor = new Color(this.color).brightness(border._brightness).toHex();\n }\n\n return borderColor;\n },\n\n createOverlay: function() {\n var overlay = Path.fromRect(this.box.toRect(), {\n fill: {\n color: WHITE,\n opacity: 0\n },\n stroke: null\n });\n\n this.visual.append(overlay);\n },\n\n createHighlight: function() {\n var highlight = this.options.highlight;\n var normalColor = this.color;\n\n this.color = highlight.color || this.color;\n var overlay = this.mainVisual(\n deepExtend({}, this.options, {\n line: {\n color: this.getBorderColor()\n }\n }, highlight)\n );\n this.color = normalColor;\n\n return overlay;\n },\n\n highlightVisual: function() {\n return this._mainVisual;\n },\n\n highlightVisualArgs: function() {\n return {\n options: this.options,\n rect: this.box.toRect(),\n visual: this._mainVisual\n };\n },\n\n tooltipAnchor: function() {\n var box = this.box;\n var clipBox = this.owner.pane.clipBox() || box;\n\n return {\n point: new Point(box.x2 + TOOLTIP_OFFSET, Math.max(box.y1, clipBox.y1) + TOOLTIP_OFFSET),\n align: {\n horizontal: LEFT,\n vertical: TOP\n }\n };\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n overlapsBox: function(box) {\n return this.box.overlaps(box);\n }\n});\n\nsetDefaultOptions(Candlestick, {\n vertical: true,\n border: {\n _brightness: 0.8\n },\n line: {\n width: 2\n },\n overlay: {\n gradient: \"glass\"\n },\n tooltip: {\n format: \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"
{4:d}
Open:{0:C}
High:{1:C}
Low:{2:C}
Close:{3:C}
\"\n },\n highlight: {\n opacity: 1,\n border: {\n width: 1,\n opacity: 1\n },\n line: {\n width: 1,\n opacity: 1\n }\n },\n notes: {\n visible: true,\n label: {}\n }\n});\n\ndeepExtend(Candlestick.prototype, PointEventsMixin);\ndeepExtend(Candlestick.prototype, NoteMixin);\n\nfunction areNumbers(values) {\n return countNumbers(values) === values.length;\n}\n\nvar CandlestickChart = CategoricalChart.extend({\n reflowCategories: function(categorySlots) {\n var children = this.children;\n var childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n\n addValue: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var children = ref.children;\n var options = ref.options;\n var value = data.valueFields;\n var valueParts = this.splitValue(value);\n var hasValue = areNumbers(valueParts);\n var dataItem = series.data[categoryIx];\n var categoryPoints = this.categoryPoints[categoryIx];\n var point;\n\n if (!categoryPoints) {\n this.categoryPoints[categoryIx] = categoryPoints = [];\n }\n\n if (hasValue) {\n point = this.createPoint(data, fields);\n }\n\n var cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n if (point) {\n this.updateRange(value, fields);\n\n cluster.append(point);\n\n point.categoryIx = categoryIx;\n point.category = category;\n point.series = series;\n point.seriesIx = seriesIx;\n point.owner = this;\n point.dataItem = dataItem;\n point.noteText = data.fields.noteText;\n }\n\n this.points.push(point);\n categoryPoints.push(point);\n },\n\n pointType: function() {\n return Candlestick;\n },\n\n createPoint: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var pointType = this.pointType();\n var value = data.valueFields;\n var pointOptions = deepExtend({}, series);\n var color = data.fields.color || series.color;\n\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (series.type === CANDLESTICK) {\n if (value.open > value.close) {\n color = data.fields.downColor || series.downColor || series.color;\n }\n }\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n pointOptions.vertical = !this.options.invertAxes;\n\n var point = new pointType(value, pointOptions);\n point.color = color;\n\n return point;\n },\n\n splitValue: function(value) {\n return [ value.low, value.open, value.close, value.high ];\n },\n\n updateRange: function(value, fields) {\n var axisName = fields.series.axis;\n var parts = this.splitValue(value);\n var axisRange = this.valueAxisRanges[axisName];\n\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange = this.valueAxisRanges[axisName] = {\n min: Math.min.apply(Math, parts.concat([ axisRange.min ])),\n max: Math.max.apply(Math, parts.concat([ axisRange.max ]))\n };\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n\n return this.chartService.format.auto(format,\n value.open, value.high,\n value.low, value.close, point.category\n );\n },\n\n animationPoints: function() {\n return this.points;\n }\n});\n\ndeepExtend(CandlestickChart.prototype, ClipAnimationMixin);\n\nvar BoxPlot = Candlestick.extend({\n init: function(value, options) {\n Candlestick.fn.init.call(this, value, options);\n\n this.createNote();\n },\n\n reflow: function(box) {\n var ref = this;\n var options = ref.options;\n var value = ref.value;\n var chart = ref.owner;\n var valueAxis = chart.seriesValueAxis(options);\n var whiskerSlot, boxSlot;\n\n this.boxSlot = boxSlot = valueAxis.getSlot(value.q1, value.q3);\n this.realBody = boxSlot;\n this.reflowBoxSlot(box);\n\n this.whiskerSlot = whiskerSlot = valueAxis.getSlot(value.lower, value.upper);\n this.reflowWhiskerSlot(box);\n\n var medianSlot = valueAxis.getSlot(value.median);\n\n if (value.mean) {\n var meanSlot = valueAxis.getSlot(value.mean);\n this.meanPoints = this.calcMeanPoints(box, meanSlot);\n }\n\n this.whiskerPoints = this.calcWhiskerPoints(boxSlot, whiskerSlot);\n this.medianPoints = this.calcMedianPoints(box, medianSlot);\n\n this.box = whiskerSlot.clone().wrap(boxSlot);\n this.reflowNote();\n },\n\n reflowBoxSlot: function(box) {\n this.boxSlot.x1 = box.x1;\n this.boxSlot.x2 = box.x2;\n },\n\n reflowWhiskerSlot: function(box) {\n this.whiskerSlot.x1 = box.x1;\n this.whiskerSlot.x2 = box.x2;\n },\n\n calcMeanPoints: function(box, meanSlot) {\n return [\n [ [ box.x1, meanSlot.y1 ], [ box.x2, meanSlot.y1 ] ]\n ];\n },\n\n calcWhiskerPoints: function(boxSlot, whiskerSlot) {\n var mid = whiskerSlot.center().x;\n return [ [\n [ mid - 5, whiskerSlot.y1 ], [ mid + 5, whiskerSlot.y1 ],\n [ mid, whiskerSlot.y1 ], [ mid, boxSlot.y1 ]\n ], [\n [ mid - 5, whiskerSlot.y2 ], [ mid + 5, whiskerSlot.y2 ],\n [ mid, whiskerSlot.y2 ], [ mid, boxSlot.y2 ]\n ] ];\n },\n\n calcMedianPoints: function(box, medianSlot) {\n return [\n [ [ box.x1, medianSlot.y1 ], [ box.x2, medianSlot.y1 ] ]\n ];\n },\n\n renderOutliers: function(options) {\n var this$1 = this;\n\n var value = this.value;\n var outliers = value.outliers || [];\n var outerFence = Math.abs(value.q3 - value.q1) * 3;\n var elements = [];\n var markers = options.markers || {};\n\n for (var i = 0; i < outliers.length; i++) {\n var outlierValue = outliers[i];\n if (outlierValue < value.q3 + outerFence && outlierValue > value.q1 - outerFence) {\n markers = options.outliers;\n } else {\n markers = options.extremes;\n }\n var markersBorder = deepExtend({}, markers.border);\n\n if (!defined(markersBorder.color)) {\n if (defined(this$1.color)) {\n markersBorder.color = this$1.color;\n } else {\n markersBorder.color =\n new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex();\n }\n }\n\n var shape = new ShapeElement({\n type: markers.type,\n width: markers.size,\n height: markers.size,\n rotation: markers.rotation,\n background: markers.background,\n border: markersBorder,\n opacity: markers.opacity\n });\n\n shape.value = outlierValue;\n\n elements.push(shape);\n }\n\n this.reflowOutliers(elements);\n return elements;\n },\n\n reflowOutliers: function(outliers) {\n var this$1 = this;\n\n var valueAxis = this.owner.seriesValueAxis(this.options);\n var center = this.box.center();\n\n for (var i = 0; i < outliers.length; i++) {\n var outlierValue = outliers[i].value;\n var markerBox = valueAxis.getSlot(outlierValue);\n\n if (this$1.options.vertical) {\n markerBox.move(center.x);\n } else {\n markerBox.move(undefined, center.y);\n }\n\n this$1.box = this$1.box.wrap(markerBox);\n outliers[i].reflow(markerBox);\n }\n },\n\n mainVisual: function(options) {\n var group = Candlestick.fn.mainVisual.call(this, options);\n var outliers = this.renderOutliers(options);\n\n for (var i = 0; i < outliers.length; i++) {\n var element = outliers[i].getElement();\n if (element) {\n group.append(element);\n }\n }\n\n return group;\n },\n\n createLines: function(container, options) {\n this.drawLines(container, options, this.whiskerPoints, options.whiskers);\n this.drawLines(container, options, this.medianPoints, options.median);\n this.drawLines(container, options, this.meanPoints, options.mean);\n },\n\n getBorderColor: function() {\n if ((this.options.border || {}).color) {\n return this.options.border.color;\n }\n\n if (this.color) {\n return this.color;\n }\n\n return Candlestick.fn.getBorderColor.call(this);\n }\n});\n\nsetDefaultOptions(BoxPlot, {\n border: {\n _brightness: 0.8\n },\n line: {\n width: 2\n },\n median: {\n color: \"#f6f6f6\"\n },\n mean: {\n width: 2,\n dashType: \"dash\",\n color: \"#f6f6f6\"\n },\n overlay: {\n gradient: \"glass\"\n },\n tooltip: {\n format: \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"\" +\n \"
{6:d}
Lower:{0:C}
Q1:{1:C}
Median:{2:C}
Mean:{5:C}
Q3:{3:C}
Upper:{4:C}
\"\n },\n highlight: {\n opacity: 1,\n border: {\n width: 1,\n opacity: 1\n },\n line: {\n width: 1,\n opacity: 1\n }\n },\n notes: {\n visible: true,\n label: {}\n },\n outliers: {\n visible: true,\n size: LINE_MARKER_SIZE,\n type: datavizConstants.CROSS,\n background: WHITE,\n border: {\n width: 2,\n opacity: 1\n },\n opacity: 0\n },\n extremes: {\n visible: true,\n size: LINE_MARKER_SIZE,\n type: CIRCLE,\n background: WHITE,\n border: {\n width: 2,\n opacity: 1\n },\n opacity: 0\n }\n});\n\ndeepExtend(BoxPlot.prototype, PointEventsMixin);\n\nvar VerticalBoxPlot = BoxPlot.extend({\n reflowBoxSlot: function(box) {\n this.boxSlot.y1 = box.y1;\n this.boxSlot.y2 = box.y2;\n },\n\n reflowWhiskerSlot: function(box) {\n this.whiskerSlot.y1 = box.y1;\n this.whiskerSlot.y2 = box.y2;\n },\n\n calcMeanPoints: function(box, meanSlot) {\n return [\n [ [ meanSlot.x1, box.y1 ], [ meanSlot.x1, box.y2 ] ]\n ];\n },\n\n calcWhiskerPoints: function(boxSlot, whiskerSlot) {\n var mid = whiskerSlot.center().y;\n return [ [\n [ whiskerSlot.x1, mid - 5 ], [ whiskerSlot.x1, mid + 5 ],\n [ whiskerSlot.x1, mid ], [ boxSlot.x1, mid ]\n ], [\n [ whiskerSlot.x2, mid - 5 ], [ whiskerSlot.x2, mid + 5 ],\n [ whiskerSlot.x2, mid ], [ boxSlot.x2, mid ]\n ] ];\n },\n\n calcMedianPoints: function(box, medianSlot) {\n return [\n [ [ medianSlot.x1, box.y1 ], [ medianSlot.x1, box.y2 ] ]\n ];\n }\n});\n\nvar BoxPlotChart = CandlestickChart.extend({\n addValue: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var children = ref.children;\n var options = ref.options;\n var value = data.valueFields;\n var valueParts = this.splitValue(value);\n var hasValue = areNumbers(valueParts);\n var dataItem = series.data[categoryIx];\n var categoryPoints = this.categoryPoints[categoryIx];\n var point;\n\n if (!categoryPoints) {\n this.categoryPoints[categoryIx] = categoryPoints = [];\n }\n\n if (hasValue) {\n point = this.createPoint(data, fields);\n }\n\n var cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n if (point) {\n this.updateRange(value, fields);\n\n cluster.append(point);\n\n point.categoryIx = categoryIx;\n point.category = category;\n point.series = series;\n point.seriesIx = seriesIx;\n point.owner = this;\n point.dataItem = dataItem;\n }\n\n this.points.push(point);\n categoryPoints.push(point);\n },\n\n pointType: function() {\n if (this.options.invertAxes) {\n return VerticalBoxPlot;\n }\n\n return BoxPlot;\n },\n\n splitValue: function(value) {\n return [\n value.lower, value.q1, value.median,\n value.q3, value.upper\n ];\n },\n\n updateRange: function(value, fields) {\n var axisName = fields.series.axis;\n var axisRange = this.valueAxisRanges[axisName];\n var parts = this.splitValue(value).concat(this.filterOutliers(value.outliers));\n\n if (defined(value.mean)) {\n parts = parts.concat(value.mean);\n }\n\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange = this.valueAxisRanges[axisName] = {\n min: Math.min.apply(Math, parts.concat([ axisRange.min ])),\n max: Math.max.apply(Math, parts.concat([ axisRange.max ]))\n };\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n\n return this.chartService.format.auto(format,\n value.lower, value.q1, value.median,\n value.q3, value.upper, value.mean, point.category\n );\n },\n\n filterOutliers: function(items) {\n var length = (items || []).length;\n var result = [];\n\n for (var i = 0; i < length; i++) {\n var item = items[i];\n if (defined(item) && item !== null) {\n result.push(item);\n }\n }\n\n return result;\n },\n\n supportsPointInactiveOpacity: function() {\n return false;\n }\n});\n\nvar ScatterErrorBar = ErrorBarBase.extend({\n getAxis: function() {\n var axes = this.chart.seriesAxes(this.series);\n var axis = this.isVertical ? axes.y : axes.x;\n\n return axis;\n }\n});\n\nfunction hasValue(value) {\n return defined(value) && value !== null;\n}\n\nvar ScatterChart = ChartElement.extend({\n init: function(plotArea, options) {\n\n ChartElement.fn.init.call(this, options);\n\n this.plotArea = plotArea;\n this.chartService = plotArea.chartService;\n this._initFields();\n\n this.render();\n },\n\n _initFields: function() {\n // X and Y axis ranges grouped by name, e.g.:\n // primary: { min: 0, max: 1 }\n this.xAxisRanges = {};\n this.yAxisRanges = {};\n\n this.points = [];\n this.seriesPoints = [];\n this.seriesOptions = [];\n this._evalSeries = [];\n },\n\n render: function() {\n this.traverseDataPoints(this.addValue.bind(this));\n },\n\n addErrorBar: function(point, field, fields) {\n var value = point.value[field];\n var valueErrorField = field + \"Value\";\n var lowField = field + \"ErrorLow\";\n var highField = field + \"ErrorHigh\";\n var seriesIx = fields.seriesIx;\n var series = fields.series;\n var errorBars = point.options.errorBars;\n var lowValue = fields[lowField];\n var highValue = fields[highField];\n\n if (isNumber(value)) {\n var errorRange;\n if (isNumber(lowValue) && isNumber(highValue)) {\n errorRange = { low: lowValue, high: highValue };\n }\n\n if (errorBars && defined(errorBars[valueErrorField])) {\n this.seriesErrorRanges = this.seriesErrorRanges || { x: [], y: [] };\n this.seriesErrorRanges[field][seriesIx] = this.seriesErrorRanges[field][seriesIx] ||\n new ErrorRangeCalculator(errorBars[valueErrorField], series, field);\n\n errorRange = this.seriesErrorRanges[field][seriesIx].getErrorRange(value, errorBars[valueErrorField]);\n }\n\n if (errorRange) {\n this.addPointErrorBar(errorRange, point, field);\n }\n }\n },\n\n addPointErrorBar: function(errorRange, point, field) {\n var low = errorRange.low;\n var high = errorRange.high;\n var series = point.series;\n var options = point.options.errorBars;\n var isVertical = field === Y;\n var item = {};\n\n point[field + \"Low\"] = low;\n point[field + \"High\"] = high;\n\n point.errorBars = point.errorBars || [];\n var errorBar = new ScatterErrorBar(low, high, isVertical, this, series, options);\n point.errorBars.push(errorBar);\n point.append(errorBar);\n\n item[field] = low;\n this.updateRange(item, series);\n item[field] = high;\n this.updateRange(item, series);\n },\n\n addValue: function(value, fields) {\n var x = value.x;\n var y = value.y;\n var seriesIx = fields.seriesIx;\n var series = this.options.series[seriesIx];\n var missingValues = this.seriesMissingValues(series);\n var seriesPoints = this.seriesPoints[seriesIx];\n\n var pointValue = value;\n if (!(hasValue(x) && hasValue(y))) {\n pointValue = this.createMissingValue(pointValue, missingValues);\n }\n\n var point;\n if (pointValue) {\n point = this.createPoint(pointValue, fields);\n if (point) {\n $.extend(point, fields);\n this.addErrorBar(point, X, fields);\n this.addErrorBar(point, Y, fields);\n }\n this.updateRange(pointValue, fields.series);\n }\n\n this.points.push(point);\n seriesPoints.push(point);\n },\n\n seriesMissingValues: function(series) {\n return series.missingValues;\n },\n\n createMissingValue: function() {},\n\n updateRange: function(value, series) {\n var intlService = this.chartService.intl;\n var xAxisName = series.xAxis;\n var yAxisName = series.yAxis;\n var x = value.x;\n var y = value.y;\n var xAxisRange = this.xAxisRanges[xAxisName];\n var yAxisRange = this.yAxisRanges[yAxisName];\n\n if (hasValue(x)) {\n xAxisRange = this.xAxisRanges[xAxisName] =\n xAxisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n if (isString(x)) {\n x = parseDate(intlService, x);\n }\n\n xAxisRange.min = Math.min(xAxisRange.min, x);\n xAxisRange.max = Math.max(xAxisRange.max, x);\n }\n\n if (hasValue(y)) {\n yAxisRange = this.yAxisRanges[yAxisName] =\n yAxisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n if (isString(y)) {\n y = parseDate(intlService, y);\n }\n\n yAxisRange.min = Math.min(yAxisRange.min, y);\n yAxisRange.max = Math.max(yAxisRange.max, y);\n }\n },\n\n evalPointOptions: function(options, value, fields) {\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var state = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, options);\n evalOptions(pointOptions, {\n value: value,\n series: series,\n dataItem: fields.dataItem\n }, state);\n }\n\n return pointOptions;\n },\n\n pointType: function() {\n return LinePoint;\n },\n\n pointOptions: function(series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().prototype.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n markers: {\n opacity: series.opacity\n },\n tooltip: {\n format: this.options.tooltip.format\n },\n labels: {\n format: this.options.labels.format\n }\n }, series);\n }\n\n return options;\n },\n\n createPoint: function(value, fields) {\n var series = fields.series;\n var pointOptions = this.pointOptions(series, fields.seriesIx);\n var color = fields.color || series.color;\n\n pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new LinePoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n seriesAxes: function(series) {\n var xAxisName = series.xAxis;\n var yAxisName = series.yAxis;\n var plotArea = this.plotArea;\n var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n if (!xAxis) {\n throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n }\n\n if (!yAxis) {\n throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n }\n\n return {\n x: xAxis,\n y: yAxis\n };\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n var chartPoints = this.points;\n var limit = !this.options.clip;\n var pointIx = 0;\n\n this.traverseDataPoints(function (value, fields) {\n var point = chartPoints[pointIx++];\n var seriesAxes = this$1.seriesAxes(fields.series);\n var slotX = seriesAxes.x.getSlot(value.x, value.x, limit);\n var slotY = seriesAxes.y.getSlot(value.y, value.y, limit);\n\n if (point) {\n if (slotX && slotY) {\n var pointSlot = this$1.pointSlot(slotX, slotY);\n point.reflow(pointSlot);\n } else {\n point.visible = false;\n }\n }\n });\n\n this.box = targetBox;\n },\n\n pointSlot: function(slotX, slotY) {\n return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n },\n\n traverseDataPoints: function(callback) {\n var this$1 = this;\n\n var ref = this;\n var series = ref.options.series;\n var seriesPoints = ref.seriesPoints;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var currentSeriesPoints = seriesPoints[seriesIx];\n if (!currentSeriesPoints) {\n seriesPoints[seriesIx] = [];\n }\n\n for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n var ref$1 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n var value = ref$1.valueFields;\n var fields = ref$1.fields;\n\n callback(value, deepExtend({\n pointIx: pointIx,\n series: currentSeries,\n seriesIx: seriesIx,\n dataItem: currentSeries.data[pointIx],\n owner: this$1\n }, fields));\n }\n }\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n return this.chartService.format.auto(format, value.x, value.y);\n },\n\n animationPoints: function() {\n var points = this.points;\n var result = [];\n for (var idx = 0; idx < points.length; idx++) {\n result.push((points[idx] || {}).marker);\n }\n return result;\n }\n});\nsetDefaultOptions(ScatterChart, {\n series: [],\n tooltip: {\n format: \"{0}, {1}\"\n },\n labels: {\n format: \"{0}, {1}\"\n },\n clip: true\n});\ndeepExtend(ScatterChart.prototype, ClipAnimationMixin, {\n _bindPoint: CategoricalChart.prototype._bindPoint\n});\n\nvar Bubble = LinePoint.extend({\n init: function(value, options) {\n LinePoint.fn.init.call(this, value, options);\n\n this.category = value.category;\n },\n\n createHighlight: function() {\n var highlight = this.options.highlight;\n var border = highlight.border;\n var markers = this.options.markers;\n var center = this.box.center();\n var radius = (markers.size + markers.border.width + border.width) / 2;\n var highlightGroup = new Group();\n var shadow = new drawing.Circle(new geometry.Circle([ center.x, center.y + radius / 5 + border.width / 2 ], radius + border.width / 2), {\n stroke: {\n color: 'none'\n },\n fill: this.createGradient({\n gradient: 'bubbleShadow',\n color: markers.background,\n stops: [ {\n offset: 0,\n color: markers.background,\n opacity: 0.3\n }, {\n offset: 1,\n color: markers.background,\n opacity: 0\n } ]\n })\n });\n var overlay = new drawing.Circle(new geometry.Circle([ center.x, center.y ], radius), {\n stroke: {\n color: border.color ||\n new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex(),\n width: border.width,\n opacity: border.opacity\n },\n fill: {\n color: markers.background,\n opacity: highlight.opacity\n }\n });\n\n highlightGroup.append(shadow, overlay);\n\n return highlightGroup;\n }\n});\n\nBubble.prototype.defaults = deepExtend({}, Bubble.prototype.defaults, {\n labels: {\n position: CENTER\n },\n highlight: {\n opacity: 1,\n border: {\n color: \"#fff\",\n width: 2,\n opacity: 1\n }\n }\n});\n\nBubble.prototype.defaults.highlight.zIndex = undefined;\n\nvar BubbleChart = ScatterChart.extend({\n _initFields: function() {\n this._maxSize = MIN_VALUE;\n ScatterChart.fn._initFields.call(this);\n },\n\n addValue: function(value, fields) {\n if (value.size !== null && (value.size > 0 || (value.size < 0 && fields.series.negativeValues.visible))) {\n this._maxSize = Math.max(this._maxSize, Math.abs(value.size));\n ScatterChart.fn.addValue.call(this, value, fields);\n } else {\n this.points.push(null);\n this.seriesPoints[fields.seriesIx].push(null);\n }\n },\n\n reflow: function(box) {\n this.updateBubblesSize(box);\n ScatterChart.fn.reflow.call(this, box);\n },\n\n pointType: function() {\n return Bubble;\n },\n\n createPoint: function(value, fields) {\n var series = fields.series;\n var pointsCount = series.data.length;\n var delay = fields.pointIx * (INITIAL_ANIMATION_DURATION / pointsCount);\n var animationOptions = {\n delay: delay,\n duration: INITIAL_ANIMATION_DURATION - delay,\n type: BUBBLE\n };\n\n var color = fields.color || series.color;\n if (value.size < 0 && series.negativeValues.visible) {\n color = valueOrDefault(\n series.negativeValues.color, color\n );\n }\n\n var pointOptions = deepExtend({\n labels: {\n animation: {\n delay: delay,\n duration: INITIAL_ANIMATION_DURATION - delay\n }\n }\n }, this.pointOptions(series, fields.seriesIx), {\n markers: {\n type: CIRCLE,\n border: series.border,\n opacity: series.opacity,\n animation: animationOptions\n }\n });\n\n pointOptions = this.evalPointOptions(pointOptions, value, fields);\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n pointOptions.markers.background = color;\n\n var point = new Bubble(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n updateBubblesSize: function(box) {\n var this$1 = this;\n\n var ref = this;\n var series = ref.options.series;\n var boxSize = Math.min(box.width(), box.height());\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var seriesPoints = this$1.seriesPoints[seriesIx];\n var minSize = currentSeries.minSize || Math.max(boxSize * 0.02, 10);\n var maxSize = currentSeries.maxSize || boxSize * 0.2;\n var minR = minSize / 2;\n var maxR = maxSize / 2;\n var minArea = Math.PI * minR * minR;\n var maxArea = Math.PI * maxR * maxR;\n var areaRange = maxArea - minArea;\n var areaRatio = areaRange / this$1._maxSize;\n\n for (var pointIx = 0; pointIx < seriesPoints.length; pointIx++) {\n var point = seriesPoints[pointIx];\n if (point) {\n var area = Math.abs(point.value.size) * areaRatio;\n var radius = Math.sqrt((minArea + area) / Math.PI);\n var baseZIndex = valueOrDefault(point.options.zIndex, 0);\n var zIndex = baseZIndex + (1 - radius / maxR);\n\n deepExtend(point.options, {\n zIndex: zIndex,\n markers: {\n size: radius * 2,\n zIndex: zIndex\n },\n labels: {\n zIndex: zIndex + 1\n }\n });\n }\n }\n }\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n return this.chartService.format.auto(format, value.x, value.y, value.size, point.category);\n },\n\n createAnimation: function() {},\n\n createVisual: function() {}\n});\n\nsetDefaultOptions(BubbleChart, {\n tooltip: {\n format: \"{3}\"\n },\n labels: {\n format: \"{3}\"\n }\n});\n\nvar Target = ShapeElement.extend({\n\n});\n\ndeepExtend(Target.prototype, PointEventsMixin);\n\nvar Bullet = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this, options);\n\n this.aboveAxis = this.options.aboveAxis;\n this.color = options.color || WHITE;\n this.value = value;\n },\n\n render: function() {\n var options = this.options;\n\n if (!this._rendered) {\n this._rendered = true;\n\n if (defined(this.value.target)) {\n this.target = new Target({\n type: options.target.shape,\n background: options.target.color || this.color,\n opacity: options.opacity,\n zIndex: options.zIndex,\n border: options.target.border,\n vAlign: TOP,\n align: RIGHT\n });\n\n this.target.value = this.value;\n this.target.dataItem = this.dataItem;\n this.target.series = this.series;\n\n this.append(this.target);\n }\n\n this.createNote();\n }\n },\n\n reflow: function(box) {\n this.render();\n\n var ref = this;\n var options = ref.options;\n var target = ref.target;\n var chart = ref.owner;\n var invertAxes = options.invertAxes;\n var valueAxis = chart.seriesValueAxis(this.options);\n var categorySlot = chart.categorySlot(chart.categoryAxis, options.categoryIx, valueAxis);\n var targetValueSlot = valueAxis.getSlot(this.value.target);\n var targetSlotX = invertAxes ? targetValueSlot : categorySlot;\n var targetSlotY = invertAxes ? categorySlot : targetValueSlot;\n\n if (target) {\n var targetSlot = new Box(\n targetSlotX.x1, targetSlotY.y1,\n targetSlotX.x2, targetSlotY.y2\n );\n target.options.height = invertAxes ? targetSlot.height() : options.target.line.width;\n target.options.width = invertAxes ? options.target.line.width : targetSlot.width();\n target.reflow(targetSlot);\n }\n\n if (this.note) {\n this.note.reflow(box);\n }\n\n this.box = box;\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n var options = this.options;\n var body = Path.fromRect(this.box.toRect(), {\n fill: {\n color: this.color,\n opacity: options.opacity\n },\n stroke: null\n });\n\n if (options.border.width > 0) {\n body.options.set(\"stroke\", {\n color: options.border.color || this.color,\n width: options.border.width,\n dashType: options.border.dashType,\n opacity: valueOrDefault(options.border.opacity, options.opacity)\n });\n }\n\n this.bodyVisual = body;\n\n alignPathToPixel(body);\n this.visual.append(body);\n },\n\n createAnimation: function() {\n if (this.bodyVisual) {\n this.animation = Animation.create(\n this.bodyVisual, this.options.animation\n );\n }\n },\n\n createHighlight: function(style) {\n return Path.fromRect(this.box.toRect(), style);\n },\n\n highlightVisual: function() {\n return this.bodyVisual;\n },\n\n highlightVisualArgs: function() {\n return {\n rect: this.box.toRect(),\n visual: this.bodyVisual,\n options: this.options\n };\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n }\n});\n\nBullet.prototype.tooltipAnchor = Bar.prototype.tooltipAnchor;\n\nsetDefaultOptions(Bullet, {\n border: {\n width: 1\n },\n vertical: false,\n opacity: 1,\n target: {\n shape: \"\",\n border: {\n width: 0,\n color: \"green\"\n },\n line: {\n width: 2\n }\n },\n tooltip: {\n format: \"Current: {0}
Target: {1}\"\n }\n});\n\ndeepExtend(Bullet.prototype, PointEventsMixin);\ndeepExtend(Bullet.prototype, NoteMixin);\n\nvar BulletChart = CategoricalChart.extend({\n init: function(plotArea, options) {\n\n wrapData(options);\n\n CategoricalChart.fn.init.call(this, plotArea, options);\n },\n\n reflowCategories: function(categorySlots) {\n var children = this.children;\n var childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n\n plotRange: function(point) {\n var series = point.series;\n var valueAxis = this.seriesValueAxis(series);\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n\n return [ axisCrossingValue, point.value.current || axisCrossingValue ];\n },\n\n createPoint: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var value = data.valueFields;\n\n var bulletOptions = deepExtend({\n vertical: !options.invertAxes,\n overlay: series.overlay,\n categoryIx: categoryIx,\n invertAxes: options.invertAxes\n }, series);\n\n var color = data.fields.color || series.color;\n bulletOptions = this.evalPointOptions(\n bulletOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (isFunction(series.color)) {\n color = bulletOptions.color;\n }\n\n var bullet = new Bullet(value, bulletOptions);\n bullet.color = color;\n\n var cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n cluster.append(bullet);\n\n return bullet;\n },\n\n updateRange: function(value, fields) {\n var current = value.current;\n var target = value.target;\n var axisName = fields.series.axis;\n var axisRange = this.valueAxisRanges[axisName];\n\n if (defined(current) && !isNaN(current) && defined(target && !isNaN(target))) {\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange.min = Math.min(axisRange.min, current, target);\n axisRange.max = Math.max(axisRange.max, current, target);\n }\n },\n\n formatPointValue: function(point, format) {\n return this.chartService.format.auto(format, point.value.current, point.value.target);\n },\n\n pointValue: function(data) {\n return data.valueFields.current;\n },\n\n aboveAxis: function(point) {\n var value = point.value.current;\n\n return value > 0;\n },\n\n createAnimation: function() {\n var this$1 = this;\n\n var points = this.points;\n\n this._setAnimationOptions();\n\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n point.options.animation = this$1.options.animation;\n point.createAnimation();\n }\n }\n});\n\nBulletChart.prototype._setAnimationOptions = BarChart.prototype._setAnimationOptions;\n\nsetDefaultOptions(BulletChart, {\n animation: {\n type: BAR\n }\n});\n\nfunction wrapData(options) {\n var series = options.series;\n\n for (var i = 0; i < series.length; i++) {\n var seriesItem = series[i];\n var data = seriesItem.data;\n if (data && !isArray(data[0]) && !isObject(data[0])) {\n seriesItem.data = [ data ];\n }\n }\n}\n\nvar BaseTooltip = Class.extend({\n init: function(chartService, options) {\n\n this.chartService = chartService;\n this.options = deepExtend({}, this.options, options);\n },\n\n getStyle: function(options, point) {\n var background = options.background;\n var border = options.border.color;\n\n if (point) {\n var pointColor = point.color || point.options.color;\n background = valueOrDefault(background, pointColor);\n border = valueOrDefault(border, pointColor);\n }\n\n var padding = getSpacing(options.padding || {}, \"auto\");\n\n return {\n backgroundColor: background,\n borderColor: border,\n font: options.font,\n color: options.color,\n opacity: options.opacity,\n borderWidth: styleValue(options.border.width),\n paddingTop: styleValue(padding.top),\n paddingBottom: styleValue(padding.bottom),\n paddingLeft: styleValue(padding.left),\n paddingRight: styleValue(padding.right)\n };\n },\n\n show: function(options, tooltipOptions, point) {\n options.format = tooltipOptions.format;\n\n var style = this.getStyle(tooltipOptions, point);\n options.style = style;\n\n var background = new Color(style.backgroundColor);\n if (!defined(tooltipOptions.color) && !background.isDark()) {\n options.className = \"k-chart-tooltip-inverse\";\n }\n\n this.chartService.notify(SHOW_TOOLTIP, options);\n\n this.visible = true;\n },\n\n hide: function() {\n if (this.chartService) {\n this.chartService.notify(HIDE_TOOLTIP);\n }\n\n this.visible = false;\n },\n\n destroy: function() {\n delete this.chartService;\n }\n});\n\nsetDefaultOptions(BaseTooltip, {\n border: {\n width: 1\n },\n opacity: 1\n});\n\nvar CrosshairTooltip = BaseTooltip.extend({\n init: function(chartService, crosshair, options) {\n BaseTooltip.fn.init.call(this, chartService, options);\n\n this.crosshair = crosshair;\n this.formatService = chartService.format;\n this.initAxisName();\n },\n\n initAxisName: function() {\n var axis = this.crosshair.axis;\n var plotArea = axis.plotArea;\n var name;\n if (plotArea.categoryAxis) {\n name = axis.getCategory ? \"categoryAxis\" : \"valueAxis\";\n } else {\n name = axis.options.vertical ? \"yAxis\" : \"xAxis\";\n }\n this.axisName = name;\n },\n\n showAt: function(point) {\n var ref = this;\n var axis = ref.crosshair.axis;\n var options = ref.options;\n var value = axis[options.stickyMode ? \"getCategory\" : \"getValue\"](point);\n var formattedValue = value;\n\n if (options.format) {\n formattedValue = this.formatService.auto(options.format, value);\n } else if (axis.options.type === DATE) {\n formattedValue = this.formatService.auto(axis.options.labels.dateFormats[axis.options.baseUnit], value);\n }\n\n this.show({\n point: point,\n anchor: this.getAnchor(),\n crosshair: this.crosshair,\n value: formattedValue,\n axisName: this.axisName,\n axisIndex: this.crosshair.axis.axisIndex\n }, this.options);\n },\n\n hide: function() {\n this.chartService.notify(HIDE_TOOLTIP, {\n crosshair: this.crosshair,\n axisName: this.axisName,\n axisIndex: this.crosshair.axis.axisIndex\n });\n },\n\n getAnchor: function() {\n var ref = this;\n var crosshair = ref.crosshair;\n var ref_options = ref.options;\n var position = ref_options.position;\n var padding = ref_options.padding;\n var vertical = !crosshair.axis.options.vertical;\n var lineBox = crosshair.line.bbox();\n var horizontalAlign, verticalAlign, point;\n\n if (vertical) {\n horizontalAlign = CENTER;\n if (position === BOTTOM) {\n verticalAlign = TOP;\n point = lineBox.bottomLeft().translate(0, padding);\n } else {\n verticalAlign = BOTTOM;\n point = lineBox.topLeft().translate(0, -padding);\n }\n } else {\n verticalAlign = CENTER;\n if (position === LEFT) {\n horizontalAlign = RIGHT;\n point = lineBox.topLeft().translate(-padding, 0);\n } else {\n horizontalAlign = LEFT;\n point = lineBox.topRight().translate(padding, 0);\n }\n }\n\n return {\n point: point,\n align: {\n horizontal: horizontalAlign,\n vertical: verticalAlign\n }\n };\n }\n});\n\nsetDefaultOptions(CrosshairTooltip, {\n padding: 10\n});\n\nvar Crosshair = ChartElement.extend({\n init: function(chartService, axis, options) {\n ChartElement.fn.init.call(this, options);\n\n this.axis = axis;\n this.stickyMode = axis instanceof CategoryAxis;\n\n var tooltipOptions = this.options.tooltip;\n\n if (tooltipOptions.visible) {\n this.tooltip = new CrosshairTooltip(chartService, this,\n deepExtend({}, tooltipOptions, { stickyMode: this.stickyMode })\n );\n }\n },\n\n showAt: function(point) {\n this.point = point;\n this.moveLine();\n this.line.visible(true);\n\n if (this.tooltip) {\n this.tooltip.showAt(point);\n }\n },\n\n hide: function() {\n this.line.visible(false);\n\n if (this.tooltip) {\n this.tooltip.hide();\n }\n },\n\n moveLine: function() {\n var ref = this;\n var axis = ref.axis;\n var point = ref.point;\n var vertical = axis.options.vertical;\n var box = this.getBox();\n var dim = vertical ? Y : X;\n var lineStart = new GeometryPoint(box.x1, box.y1);\n var lineEnd;\n\n if (vertical) {\n lineEnd = new GeometryPoint(box.x2, box.y1);\n } else {\n lineEnd = new GeometryPoint(box.x1, box.y2);\n }\n\n if (point) {\n if (this.stickyMode) {\n var slot = axis.getSlot(axis.pointCategoryIndex(point));\n lineStart[dim] = lineEnd[dim] = slot.center()[dim];\n } else {\n lineStart[dim] = lineEnd[dim] = point[dim];\n }\n }\n\n this.box = box;\n\n this.line.moveTo(lineStart).lineTo(lineEnd);\n },\n\n getBox: function() {\n var axis = this.axis;\n var axes = axis.pane.axes;\n var length = axes.length;\n var vertical = axis.options.vertical;\n var box = axis.lineBox().clone();\n var dim = vertical ? X : Y;\n var axisLineBox;\n\n for (var i = 0; i < length; i++) {\n var currentAxis = axes[i];\n if (currentAxis.options.vertical !== vertical) {\n if (!axisLineBox) {\n axisLineBox = currentAxis.lineBox().clone();\n } else {\n axisLineBox.wrap(currentAxis.lineBox());\n }\n }\n }\n\n box[dim + 1] = axisLineBox[dim + 1];\n box[dim + 2] = axisLineBox[dim + 2];\n\n return box;\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n var options = this.options;\n this.line = new Path({\n stroke: {\n color: options.color,\n width: options.width,\n opacity: options.opacity,\n dashType: options.dashType\n },\n visible: false\n });\n\n this.moveLine();\n this.visual.append(this.line);\n },\n\n destroy: function() {\n if (this.tooltip) {\n this.tooltip.destroy();\n }\n\n ChartElement.fn.destroy.call(this);\n }\n});\n\nsetDefaultOptions(Crosshair, {\n color: BLACK,\n width: 2,\n zIndex: -1,\n tooltip: {\n visible: false\n }\n});\n\nvar ChartContainer = ChartElement.extend({\n init: function(options, pane) {\n ChartElement.fn.init.call(this, options);\n this.pane = pane;\n },\n\n shouldClip: function() {\n var children = this.children;\n var length = children.length;\n\n for (var i = 0; i < length; i++) {\n if (children[i].options.clip === true) {\n return true;\n }\n }\n return false;\n },\n\n _clipBox: function() {\n return this.pane.chartsBox();\n },\n\n createVisual: function() {\n this.visual = new Group({\n zIndex: 0\n });\n\n if (this.shouldClip()) {\n var clipBox = this.clipBox = this._clipBox();\n var clipRect = clipBox.toRect();\n var clipPath = Path.fromRect(clipRect);\n alignPathToPixel(clipPath);\n\n this.visual.clip(clipPath);\n this.unclipLabels();\n }\n },\n\n stackRoot: function() {\n return this;\n },\n\n unclipLabels: function() {\n var ref = this;\n var charts = ref.children;\n var clipBox = ref.clipBox;\n\n for (var i = 0; i < charts.length; i++) {\n var points = charts[i].points || {};\n var length = points.length;\n\n for (var j = 0; j < length; j++) {\n var point = points[j];\n if (point && point.visible !== false && point.overlapsBox && point.overlapsBox(clipBox)) {\n if (point.unclipElements) {\n point.unclipElements();\n } else {\n var label = point.label;\n var note = point.note;\n\n if (label && label.options.visible) {\n if (label.alignToClipBox) {\n label.alignToClipBox(clipBox);\n }\n label.options.noclip = true;\n }\n\n if (note && note.options.visible) {\n note.options.noclip = true;\n }\n }\n }\n }\n }\n },\n\n destroy: function() {\n ChartElement.fn.destroy.call(this);\n\n delete this.parent;\n }\n});\n\nChartContainer.prototype.isStackRoot = true;\n\nvar Pane = BoxElement.extend({\n init: function(options) {\n BoxElement.fn.init.call(this, options);\n\n this.id = paneID();\n\n this.createTitle();\n\n this.content = new ChartElement();\n\n this.chartContainer = new ChartContainer({}, this);\n this.append(this.content);\n\n this.axes = [];\n this.charts = [];\n },\n\n createTitle: function() {\n var titleOptions = this.options.title;\n if (isObject(titleOptions)) {\n titleOptions = deepExtend({}, titleOptions, {\n align: titleOptions.position,\n position: TOP\n });\n }\n\n this.title = dataviz.Title.buildTitle(titleOptions, this, Pane.prototype.options.title);\n },\n\n appendAxis: function(axis) {\n this.content.append(axis);\n this.axes.push(axis);\n axis.pane = this;\n },\n\n appendAxisAt: function(axis, pos) {\n this.content.append(axis);\n this.axes.splice(pos, 0, axis);\n axis.pane = this;\n },\n\n appendChart: function(chart) {\n if (this.chartContainer.parent !== this.content) {\n this.content.append(this.chartContainer);\n }\n\n this.charts.push(chart);\n this.chartContainer.append(chart);\n chart.pane = this;\n },\n\n empty: function() {\n var this$1 = this;\n\n var plotArea = this.parent;\n\n if (plotArea) {\n for (var i = 0; i < this.axes.length; i++) {\n plotArea.removeAxis(this$1.axes[i]);\n }\n\n for (var i$1 = 0; i$1 < this.charts.length; i$1++) {\n plotArea.removeChart(this$1.charts[i$1]);\n }\n }\n\n this.axes = [];\n this.charts = [];\n\n this.content.destroy();\n this.content.children = [];\n this.chartContainer.children = [];\n },\n\n reflow: function(targetBox) {\n // Content (such as charts) is rendered, but excluded from reflows\n var content;\n if (last(this.children) === this.content) {\n content = this.children.pop();\n }\n\n BoxElement.fn.reflow.call(this, targetBox);\n\n if (content) {\n this.children.push(content);\n }\n\n if (this.title) {\n this.contentBox.y1 += this.title.box.height();\n }\n },\n\n visualStyle: function() {\n var style = BoxElement.fn.visualStyle.call(this);\n style.zIndex = -10;\n\n return style;\n },\n\n renderComplete: function() {\n if (this.options.visible) {\n this.createGridLines();\n }\n },\n\n stackRoot: function() {\n return this;\n },\n\n clipRoot: function() {\n return this;\n },\n\n createGridLines: function() {\n var axes = this.axes;\n var allAxes = axes.concat(this.parent.axes);\n var vGridLines = [];\n var hGridLines = [];\n\n // TODO\n // Is full combination really necessary?\n for (var i = 0; i < axes.length; i++) {\n var axis = axes[i];\n var vertical = axis.options.vertical;\n var gridLines = vertical ? vGridLines : hGridLines;\n for (var j = 0; j < allAxes.length; j++) {\n if (gridLines.length === 0) {\n var altAxis = allAxes[j];\n if (vertical !== altAxis.options.vertical) {\n append(gridLines, axis.createGridLines(altAxis));\n }\n }\n }\n }\n },\n\n refresh: function() {\n this.visual.clear();\n\n this.content.parent = null;\n this.content.createGradient = this.createGradient.bind(this);\n this.content.renderVisual();\n this.content.parent = this;\n\n if (this.title) {\n this.visual.append(this.title.visual);\n }\n\n this.visual.append(this.content.visual);\n\n this.renderComplete();\n this.notifyRender();\n },\n\n chartsBox: function() {\n var axes = this.axes;\n var length = axes.length;\n var chartsBox = new Box();\n\n for (var idx = 0; idx < length; idx++) {\n var axis = axes[idx];\n var axisValueField = axis.options.vertical ? Y : X;\n var lineBox = axis.lineBox();\n chartsBox[axisValueField + 1] = lineBox[axisValueField + 1];\n chartsBox[axisValueField + 2] = lineBox[axisValueField + 2];\n }\n\n if (chartsBox.x2 === 0) {\n var allAxes = this.parent.axes;\n var length$1 = allAxes.length;\n\n for (var idx$1 = 0; idx$1 < length$1; idx$1++) {\n var axis$1 = allAxes[idx$1];\n if (!axis$1.options.vertical) {\n var lineBox$1 = axis$1.lineBox();\n chartsBox.x1 = lineBox$1.x1;\n chartsBox.x2 = lineBox$1.x2;\n }\n }\n }\n return chartsBox;\n },\n\n clipBox: function() {\n return this.chartContainer.clipBox;\n },\n\n notifyRender: function() {\n var service = this.getService();\n if (service) {\n service.notify(PANE_RENDER, {\n pane: new ChartPane(this),\n index: this.paneIndex,\n name: this.options.name\n });\n }\n }\n});\n\nvar ID = 1;\n\nfunction paneID() {\n return \"pane\" + ID++;\n}\n\nPane.prototype.isStackRoot = true;\n\nsetDefaultOptions(Pane, {\n zIndex: -1,\n shrinkToFit: true,\n title: {\n align: LEFT\n },\n visible: true\n});\n\nfunction appendIfNotNull(array, element) {\n if (element !== null) {\n array.push(element);\n }\n}\n\nfunction segmentVisible(series, fields, index) {\n var visible = fields.visible;\n if (defined(visible)) {\n return visible;\n }\n\n var pointVisibility = series.pointVisibility;\n if (pointVisibility) {\n return pointVisibility[index];\n }\n}\n\nfunction bindSegments(series) {\n var data = series.data;\n var points = [];\n var sum = 0;\n var count = 0;\n\n for (var idx = 0; idx < data.length; idx++) {\n var pointData = SeriesBinder.current.bindPoint(series, idx);\n var value = pointData.valueFields.value;\n\n if (isString(value)) {\n value = parseFloat(value);\n }\n\n if (isNumber(value)) {\n pointData.visible = segmentVisible(series, pointData.fields, idx) !== false;\n\n pointData.value = Math.abs(value);\n points.push(pointData);\n\n if (pointData.visible) {\n sum += pointData.value;\n }\n\n if (value !== 0) {\n count++;\n }\n } else {\n points.push(null);\n }\n }\n\n return {\n total: sum,\n points: points,\n count: count\n };\n}\n\nfunction equalsIgnoreCase(a, b) {\n if (a && b) {\n return a.toLowerCase() === b.toLowerCase();\n }\n\n return a === b;\n}\n\nfunction filterSeriesByType(series, types) {\n var result = [];\n\n var seriesTypes = [].concat(types);\n for (var idx = 0; idx < series.length; idx++) {\n var currentSeries = series[idx];\n if (inArray(currentSeries.type, seriesTypes)) {\n result.push(currentSeries);\n }\n }\n\n return result;\n}\n\nfunction getDateField(field, row, intlService) {\n if (row === null) {\n return row;\n }\n\n var key = \"_date_\" + field;\n var value = row[key];\n\n if (!value) {\n value = parseDate(intlService, getter(field, true)(row));\n row[key] = value;\n }\n\n return value;\n}\n\nfunction isDateAxis(axisOptions, sampleCategory) {\n var type = axisOptions.type;\n var dateCategory = sampleCategory instanceof Date;\n\n return (!type && dateCategory) || equalsIgnoreCase(type, DATE);\n}\n\nfunction singleItemOrArray(array) {\n return array.length === 1 ? array[0] : array;\n}\n\nvar AREA_REGEX = /area/i;\n\nfunction seriesMissingValues(series) {\n if (series.missingValues) {\n return series.missingValues;\n }\n\n return AREA_REGEX.test(series.type) || series.stack ? ZERO : INTERPOLATE;\n}\n\nfunction hasValue$1(series, item) {\n var fields = SeriesBinder.current.bindPoint(series, null, item);\n var valueFields = fields.valueFields;\n\n for (var field in valueFields) {\n if (dataviz.convertableToNumber(valueFields[field])) {\n return true;\n }\n }\n}\n\nfunction findNext(ref) {\n var start = ref.start;\n var dir = ref.dir;\n var min = ref.min;\n var max = ref.max;\n var getter$$1 = ref.getter;\n var hasItem = ref.hasItem;\n var series = ref.series;\n\n var pointHasValue, outPoint;\n var idx = start;\n do {\n idx += dir;\n //aggregating and binding the item takes too much time for large number of categories\n //will assume that if the aggregation does not create value for a missing item for one it will not create for others\n if (hasItem(idx)) {\n outPoint = getter$$1(idx);\n pointHasValue = hasValue$1(series, outPoint.item);\n }\n } while (min <= idx && idx <= max && !pointHasValue);\n\n if (pointHasValue) {\n return outPoint;\n }\n}\n\nfunction createOutOfRangePoints(series, range, count, getter$$1, hasItem) {\n var min = range.min;\n var max = range.max;\n var hasMinPoint = min > 0 && min < count;\n var hasMaxPoint = max + 1 < count;\n\n if (hasMinPoint || hasMaxPoint) {\n var missingValues = seriesMissingValues(series);\n var minPoint, maxPoint;\n if (missingValues !== INTERPOLATE) {\n if (hasMinPoint) {\n minPoint = getter$$1(min - 1);\n }\n\n if (hasMaxPoint) {\n maxPoint = getter$$1(max + 1);\n }\n } else {\n var outPoint, pointHasValue;\n if (hasMinPoint) {\n outPoint = getter$$1(min - 1);\n pointHasValue = hasValue$1(series, outPoint.item);\n if (!pointHasValue) {\n minPoint = findNext({\n start: min,\n dir: -1,\n min: 0,\n max: count - 1,\n getter: getter$$1,\n hasItem: hasItem,\n series: series\n });\n } else {\n minPoint = outPoint;\n }\n }\n\n if (hasMaxPoint) {\n outPoint = getter$$1(max + 1);\n pointHasValue = hasValue$1(series, outPoint.item);\n if (!pointHasValue) {\n maxPoint = findNext({\n start: max,\n dir: 1,\n min: 0,\n max: count - 1,\n getter: getter$$1,\n hasItem: hasItem,\n series: series\n });\n } else {\n maxPoint = outPoint;\n }\n }\n }\n\n if (minPoint) {\n series._outOfRangeMinPoint = minPoint;\n }\n\n if (maxPoint) {\n series._outOfRangeMaxPoint = maxPoint;\n }\n }\n}\n\nvar PlotAreaBase = ChartElement.extend({\n init: function(series, options, chartService) {\n ChartElement.fn.init.call(this, options);\n\n this.initFields(series, options);\n this.series = series;\n this.initSeries();\n this.charts = [];\n this.options.legend = this.options.legend || {};\n this.options.legend.items = [];\n this.axes = [];\n this.crosshairs = [];\n this.chartService = chartService;\n this.originalOptions = options;\n\n this.createPanes();\n this.render();\n this.createCrosshairs();\n },\n\n initFields: function() { },\n\n initSeries: function() {\n var series = this.series;\n\n for (var i = 0; i < series.length; i++) {\n series[i].index = i;\n }\n },\n\n createPanes: function() {\n var this$1 = this;\n\n var titleOptions = this.options.title || {};\n var paneDefaults = this.options.paneDefaults;\n var paneOptions = this.options.panes || [];\n var panesLength = Math.max(paneOptions.length, 1);\n var panes = [];\n\n var defaults = deepExtend({\n title: {\n color: titleOptions.color\n }\n }, paneDefaults);\n\n for (var i = 0; i < panesLength; i++) {\n var options = deepExtend({}, defaults, paneOptions[i]);\n if (isString(options.title)) {\n options.title = deepExtend({ text: options.title }, defaults.title);\n }\n\n var currentPane = new Pane(options);\n currentPane.paneIndex = i;\n\n panes.push(currentPane);\n this$1.append(currentPane);\n }\n\n this.panes = panes;\n },\n\n crosshairOptions: function(axis) {\n return axis.options.crosshair;\n },\n\n createCrosshairs: function(panes) {\n var this$1 = this;\n if (panes === void 0) { panes = this.panes; }\n\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n for (var j = 0; j < pane.axes.length; j++) {\n var axis = pane.axes[j];\n var options = this$1.crosshairOptions(axis);\n if (options && options.visible) {\n var currentCrosshair = new Crosshair(this$1.chartService, axis, options);\n\n this$1.crosshairs.push(currentCrosshair);\n pane.content.append(currentCrosshair);\n }\n }\n }\n },\n\n removeCrosshairs: function(pane) {\n var crosshairs = this.crosshairs;\n var axes = pane.axes;\n\n for (var i = crosshairs.length - 1; i >= 0; i--) {\n for (var j = 0; j < axes.length; j++) {\n if (crosshairs[i].axis === axes[j]) {\n crosshairs.splice(i, 1);\n break;\n }\n }\n }\n },\n\n hideCrosshairs: function() {\n var crosshairs = this.crosshairs;\n for (var idx = 0; idx < crosshairs.length; idx++) {\n crosshairs[idx].hide();\n }\n },\n\n findPane: function(name) {\n var panes = this.panes;\n var matchingPane;\n\n for (var i = 0; i < panes.length; i++) {\n if (panes[i].options.name === name) {\n matchingPane = panes[i];\n break;\n }\n }\n\n return matchingPane || panes[0];\n },\n\n findPointPane: function(point) {\n var panes = this.panes;\n var matchingPane;\n\n for (var i = 0; i < panes.length; i++) {\n if (panes[i].box.containsPoint(point)) {\n matchingPane = panes[i];\n break;\n }\n }\n\n return matchingPane;\n },\n\n appendAxis: function(axis) {\n var pane = this.findPane(axis.options.pane);\n\n pane.appendAxis(axis);\n this.axes.push(axis);\n axis.plotArea = this;\n },\n\n removeAxis: function(axisToRemove) {\n var this$1 = this;\n\n var filteredAxes = [];\n\n for (var i = 0; i < this.axes.length; i++) {\n var axis = this$1.axes[i];\n if (axisToRemove !== axis) {\n filteredAxes.push(axis);\n } else {\n axis.destroy();\n }\n }\n\n this.axes = filteredAxes;\n },\n\n appendChart: function(chart, pane) {\n this.charts.push(chart);\n if (pane) {\n pane.appendChart(chart);\n } else {\n this.append(chart);\n }\n },\n\n removeChart: function(chartToRemove) {\n var this$1 = this;\n\n var filteredCharts = [];\n\n for (var i = 0; i < this.charts.length; i++) {\n var chart = this$1.charts[i];\n if (chart !== chartToRemove) {\n filteredCharts.push(chart);\n } else {\n chart.destroy();\n }\n }\n\n this.charts = filteredCharts;\n },\n\n addToLegend: function(series) {\n var count = series.length;\n var legend = this.options.legend;\n var labels = legend.labels || {};\n var inactiveItems = legend.inactiveItems || {};\n var inactiveItemsLabels = inactiveItems.labels || {};\n var data = [];\n\n for (var i = 0; i < count; i++) {\n var currentSeries = series[i];\n var seriesVisible = currentSeries.visible !== false;\n if (currentSeries.visibleInLegend === false) {\n continue;\n }\n\n var text = currentSeries.name;\n var labelTemplate = seriesVisible ? getTemplate(labels) : getTemplate(inactiveItemsLabels) || getTemplate(labels);\n if (labelTemplate) {\n text = labelTemplate({\n text: hasValue(text) ? text : \"\",\n series: currentSeries\n });\n }\n\n var defaults = currentSeries._defaults;\n var color = currentSeries.color;\n if (isFunction(color) && defaults) {\n color = defaults.color;\n }\n\n var itemLabelOptions = (void 0), markerColor = (void 0);\n if (seriesVisible) {\n itemLabelOptions = {};\n markerColor = color;\n } else {\n itemLabelOptions = {\n color: inactiveItemsLabels.color,\n font: inactiveItemsLabels.font\n };\n markerColor = inactiveItems.markers.color;\n }\n\n if (hasValue(text) && text !== \"\") {\n data.push({\n text: text,\n labels: itemLabelOptions,\n markerColor: markerColor,\n series: currentSeries,\n active: seriesVisible\n });\n }\n }\n\n append(legend.items, data);\n },\n\n groupAxes: function(panes) {\n var xAxes = [];\n var yAxes = [];\n\n for (var paneIx = 0; paneIx < panes.length; paneIx++) {\n var paneAxes = panes[paneIx].axes;\n for (var axisIx = 0; axisIx < paneAxes.length; axisIx++) {\n var axis = paneAxes[axisIx];\n if (axis.options.vertical) {\n yAxes.push(axis);\n } else {\n xAxes.push(axis);\n }\n }\n }\n\n return { x: xAxes, y: yAxes, any: xAxes.concat(yAxes) };\n },\n\n groupSeriesByPane: function() {\n var this$1 = this;\n\n var series = this.series;\n var seriesByPane = {};\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n var pane = this$1.seriesPaneName(currentSeries);\n\n if (seriesByPane[pane]) {\n seriesByPane[pane].push(currentSeries);\n } else {\n seriesByPane[pane] = [ currentSeries ];\n }\n }\n\n return seriesByPane;\n },\n\n filterVisibleSeries: function(series) {\n var result = [];\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n if (currentSeries.visible !== false) {\n result.push(currentSeries);\n }\n }\n\n return result;\n },\n\n reflow: function(targetBox) {\n var options = this.options.plotArea;\n var panes = this.panes;\n var margin = getSpacing(options.margin);\n\n this.box = targetBox.clone().unpad(margin);\n this.reflowPanes();\n\n this.detachLabels();\n this.reflowAxes(panes);\n this.reflowCharts(panes);\n },\n\n redraw: function(panes) {\n var this$1 = this;\n\n var panesArray = [].concat(panes);\n this.initSeries();\n\n //prevents leak during partial redraws. the cached gradients observers retain reference to the destroyed elements.\n var root = this.getRoot();\n if (root) {\n root.cleanGradients();\n }\n\n for (var i = 0; i < panesArray.length; i++) {\n this$1.removeCrosshairs(panesArray[i]);\n panesArray[i].empty();\n }\n\n this.render(panesArray);\n this.detachLabels();\n this.reflowAxes(this.panes);\n this.reflowCharts(panesArray);\n\n this.createCrosshairs(panesArray);\n\n for (var i$1 = 0; i$1 < panesArray.length; i$1++) {\n panesArray[i$1].refresh();\n }\n },\n\n axisCrossingValues: function(axis, crossingAxes) {\n var options = axis.options;\n var crossingValues = [].concat(\n options.axisCrossingValues || options.axisCrossingValue\n );\n var valuesToAdd = crossingAxes.length - crossingValues.length;\n var defaultValue = crossingValues[0] || 0;\n\n for (var i = 0; i < valuesToAdd; i++) {\n crossingValues.push(defaultValue);\n }\n\n return crossingValues;\n },\n\n alignAxisTo: function(axis, targetAxis, crossingValue, targetCrossingValue) {\n var slot = axis.getSlot(crossingValue, crossingValue, true);\n var slotEdge = axis.options.reverse ? 2 : 1;\n var targetSlot = targetAxis.getSlot(targetCrossingValue, targetCrossingValue, true);\n var targetEdge = targetAxis.options.reverse ? 2 : 1;\n var axisBox = axis.box.translate(\n targetSlot[X + targetEdge] - slot[X + slotEdge],\n targetSlot[Y + targetEdge] - slot[Y + slotEdge]\n );\n\n if (axis.pane !== targetAxis.pane) {\n axisBox.translate(0, axis.pane.box.y1 - targetAxis.pane.box.y1);\n }\n\n axis.reflow(axisBox);\n },\n\n alignAxes: function(xAxes, yAxes) {\n var this$1 = this;\n\n var xAnchor = xAxes[0];\n var yAnchor = yAxes[0];\n var xAnchorCrossings = this.axisCrossingValues(xAnchor, yAxes);\n var yAnchorCrossings = this.axisCrossingValues(yAnchor, xAxes);\n var leftAnchors = {};\n var rightAnchors = {};\n var topAnchors = {};\n var bottomAnchors = {};\n\n for (var i = 0; i < yAxes.length; i++) {\n var axis = yAxes[i];\n var pane = axis.pane;\n var paneId = pane.id;\n var visible = axis.options.visible !== false;\n\n // Locate pane anchor, if any, and use its axisCrossingValues\n var anchor = paneAnchor(xAxes, pane) || xAnchor;\n var anchorCrossings = xAnchorCrossings;\n\n if (anchor !== xAnchor) {\n anchorCrossings = this$1.axisCrossingValues(anchor, yAxes);\n }\n\n this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n\n if (axis.options._overlap) {\n continue;\n }\n\n if (round(axis.lineBox().x1) === round(anchor.lineBox().x1)) {\n // Push the axis to the left the previous y-axis so they don't overlap\n if (leftAnchors[paneId]) {\n axis.reflow(axis.box\n .alignTo(leftAnchors[paneId].box, LEFT)\n .translate(-axis.options.margin, 0)\n );\n }\n\n if (visible) {\n leftAnchors[paneId] = axis;\n }\n }\n\n if (round(axis.lineBox().x2) === round(anchor.lineBox().x2)) {\n // Flip the labels on the right if we're at the right end of the pane\n if (!axis._mirrored) {\n axis.options.labels.mirror = !axis.options.labels.mirror;\n axis._mirrored = true;\n }\n\n this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n\n // Push the axis to the right the previous y-axis so they don't overlap\n if (rightAnchors[paneId]) {\n axis.reflow(axis.box\n .alignTo(rightAnchors[paneId].box, RIGHT)\n .translate(axis.options.margin, 0)\n );\n }\n\n if (visible) {\n rightAnchors[paneId] = axis;\n }\n }\n\n if (i !== 0 && yAnchor.pane === axis.pane) {\n axis.alignTo(yAnchor);\n axis.reflow(axis.box);\n }\n }\n\n for (var i$1 = 0; i$1 < xAxes.length; i$1++) {\n var axis$1 = xAxes[i$1];\n var pane$1 = axis$1.pane;\n var paneId$1 = pane$1.id;\n var visible$1 = axis$1.options.visible !== false;\n\n // Locate pane anchor and use its axisCrossingValues\n var anchor$1 = paneAnchor(yAxes, pane$1) || yAnchor;\n var anchorCrossings$1 = yAnchorCrossings;\n if (anchor$1 !== yAnchor) {\n anchorCrossings$1 = this$1.axisCrossingValues(anchor$1, xAxes);\n }\n\n this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n\n if (axis$1.options._overlap) {\n continue;\n }\n\n if (round(axis$1.lineBox().y1) === round(anchor$1.lineBox().y1)) {\n // Flip the labels on top if we're at the top of the pane\n if (!axis$1._mirrored) {\n axis$1.options.labels.mirror = !axis$1.options.labels.mirror;\n axis$1._mirrored = true;\n }\n this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n\n // Push the axis above the previous x-axis so they don't overlap\n if (topAnchors[paneId$1]) {\n axis$1.reflow(axis$1.box\n .alignTo(topAnchors[paneId$1].box, TOP)\n .translate(0, -axis$1.options.margin)\n );\n }\n\n if (visible$1) {\n topAnchors[paneId$1] = axis$1;\n }\n }\n\n if (round(axis$1.lineBox().y2, datavizConstants.COORD_PRECISION) === round(anchor$1.lineBox().y2, datavizConstants.COORD_PRECISION)) {\n // Push the axis below the previous x-axis so they don't overlap\n if (bottomAnchors[paneId$1]) {\n axis$1.reflow(axis$1.box\n .alignTo(bottomAnchors[paneId$1].box, BOTTOM)\n .translate(0, axis$1.options.margin)\n );\n }\n\n if (visible$1) {\n bottomAnchors[paneId$1] = axis$1;\n }\n }\n\n if (i$1 !== 0) {\n axis$1.alignTo(xAnchor);\n axis$1.reflow(axis$1.box);\n }\n }\n },\n\n shrinkAxisWidth: function(panes) {\n var axes = this.groupAxes(panes).any;\n var axisBox = axisGroupBox(axes);\n var overflowX = 0;\n\n for (var i = 0; i < panes.length; i++) {\n var currentPane = panes[i];\n\n if (currentPane.axes.length > 0) {\n overflowX = Math.max(\n overflowX,\n axisBox.width() - currentPane.contentBox.width()\n );\n }\n }\n\n if (overflowX !== 0) {\n for (var i$1 = 0; i$1 < axes.length; i$1++) {\n var currentAxis = axes[i$1];\n\n if (!currentAxis.options.vertical) {\n currentAxis.reflow(currentAxis.box.shrink(overflowX, 0));\n }\n }\n }\n },\n\n shrinkAxisHeight: function(panes) {\n var shrinked;\n\n for (var i = 0; i < panes.length; i++) {\n var currentPane = panes[i];\n var axes = currentPane.axes;\n var overflowY = Math.max(0, axisGroupBox(axes).height() - currentPane.contentBox.height());\n\n if (overflowY !== 0) {\n for (var j = 0; j < axes.length; j++) {\n var currentAxis = axes[j];\n\n if (currentAxis.options.vertical) {\n currentAxis.reflow(\n currentAxis.box.shrink(0, overflowY)\n );\n }\n }\n shrinked = true;\n }\n }\n\n return shrinked;\n },\n\n fitAxes: function(panes) {\n var axes = this.groupAxes(panes).any;\n var offsetX = 0;\n\n for (var i = 0; i < panes.length; i++) {\n var currentPane = panes[i];\n var paneAxes = currentPane.axes;\n var paneBox = currentPane.contentBox;\n\n if (paneAxes.length > 0) {\n var axisBox = axisGroupBox(paneAxes);\n // OffsetY is calculated and applied per pane\n var offsetY = Math.max(paneBox.y1 - axisBox.y1, paneBox.y2 - axisBox.y2);\n\n // OffsetX is calculated and applied globally\n offsetX = Math.max(offsetX, paneBox.x1 - axisBox.x1);\n\n for (var j = 0; j < paneAxes.length; j++) {\n var currentAxis = paneAxes[j];\n\n currentAxis.reflow(\n currentAxis.box.translate(0, offsetY)\n );\n }\n }\n }\n\n for (var i$1 = 0; i$1 < axes.length; i$1++) {\n var currentAxis$1 = axes[i$1];\n\n currentAxis$1.reflow(\n currentAxis$1.box.translate(offsetX, 0)\n );\n }\n },\n\n reflowAxes: function(panes) {\n var this$1 = this;\n\n var axes = this.groupAxes(panes);\n\n for (var i = 0; i < panes.length; i++) {\n this$1.reflowPaneAxes(panes[i]);\n }\n\n if (axes.x.length > 0 && axes.y.length > 0) {\n this.alignAxes(axes.x, axes.y);\n this.shrinkAxisWidth(panes);\n\n this.autoRotateAxisLabels(axes);\n\n this.alignAxes(axes.x, axes.y);\n if (this.shrinkAxisWidth(panes)) {\n this.alignAxes(axes.x, axes.y);\n }\n\n this.shrinkAxisHeight(panes);\n this.alignAxes(axes.x, axes.y);\n\n if (this.shrinkAxisHeight(panes)) {\n this.alignAxes(axes.x, axes.y);\n }\n\n this.fitAxes(panes);\n }\n },\n\n autoRotateAxisLabels: function(groupedAxes) {\n var this$1 = this;\n\n var ref = this;\n var panes = ref.panes;\n var axes = allPaneAxes(panes);\n var rotated;\n\n for (var idx = 0; idx < axes.length; idx++) {\n var axis = axes[idx];\n if (axis.autoRotateLabels()) {\n rotated = true;\n }\n }\n\n if (rotated) {\n for (var idx$1 = 0; idx$1 < panes.length; idx$1++) {\n this$1.reflowPaneAxes(panes[idx$1]);\n }\n\n if (groupedAxes.x.length > 0 && groupedAxes.y.length > 0) {\n this.alignAxes(groupedAxes.x, groupedAxes.y);\n this.shrinkAxisWidth(panes);\n }\n }\n },\n\n reflowPaneAxes: function(pane) {\n var axes = pane.axes;\n var length = axes.length;\n\n if (length > 0) {\n for (var i = 0; i < length; i++) {\n axes[i].reflow(pane.contentBox);\n }\n }\n },\n\n reflowCharts: function(panes) {\n var charts = this.charts;\n var count = charts.length;\n var box = this.box;\n\n for (var i = 0; i < count; i++) {\n var chartPane = charts[i].pane;\n if (!chartPane || inArray(chartPane, panes)) {\n charts[i].reflow(box);\n }\n }\n },\n\n reflowPanes: function() {\n var ref = this;\n var box = ref.box;\n var panes = ref.panes;\n var panesLength = panes.length;\n var remainingHeight = box.height();\n var remainingPanes = panesLength;\n var autoHeightPanes = 0;\n var top = box.y1;\n\n for (var i = 0; i < panesLength; i++) {\n var currentPane = panes[i];\n var height = currentPane.options.height;\n\n currentPane.options.width = box.width();\n\n if (!currentPane.options.height) {\n autoHeightPanes++;\n } else {\n if (height.indexOf && height.indexOf(\"%\")) {\n var percents = parseInt(height, 10) / 100;\n currentPane.options.height = percents * box.height();\n }\n\n currentPane.reflow(box.clone());\n\n remainingHeight -= currentPane.options.height;\n }\n }\n\n for (var i$1 = 0; i$1 < panesLength; i$1++) {\n var currentPane$1 = panes[i$1];\n\n if (!currentPane$1.options.height) {\n currentPane$1.options.height = remainingHeight / autoHeightPanes;\n }\n }\n\n for (var i$2 = 0; i$2 < panesLength; i$2++) {\n var currentPane$2 = panes[i$2];\n var paneBox = box\n .clone()\n .move(box.x1, top);\n\n currentPane$2.reflow(paneBox);\n\n remainingPanes--;\n top += currentPane$2.options.height;\n }\n },\n\n backgroundBox: function() {\n var axes = this.axes;\n var axesCount = axes.length;\n var box;\n\n for (var i = 0; i < axesCount; i++) {\n var axisA = axes[i];\n\n for (var j = 0; j < axesCount; j++) {\n var axisB = axes[j];\n\n if (axisA.options.vertical !== axisB.options.vertical) {\n var lineBox = axisA.lineBox().clone().wrap(axisB.lineBox());\n\n if (!box) {\n box = lineBox;\n } else {\n box = box.wrap(lineBox);\n }\n }\n }\n }\n\n return box || this.box;\n },\n\n chartsBoxes: function() {\n var panes = this.panes;\n var boxes = [];\n\n for (var idx = 0; idx < panes.length; idx++) {\n boxes.push(panes[idx].chartsBox());\n }\n\n return boxes;\n },\n\n addBackgroundPaths: function(multipath) {\n var boxes = this.chartsBoxes();\n for (var idx = 0; idx < boxes.length; idx++) {\n multipath.paths.push(Path.fromRect(boxes[idx].toRect()));\n }\n },\n\n backgroundContainsPoint: function(point) {\n var boxes = this.chartsBoxes();\n for (var idx = 0; idx < boxes.length; idx++) {\n if (boxes[idx].containsPoint(point)) {\n return true;\n }\n }\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n var options = this.options.plotArea;\n var opacity = options.opacity;\n var background = options.background;\n var border = options.border; if (border === void 0) { border = {}; }\n if (isTransparent(background)) {\n background = WHITE;\n opacity = 0;\n }\n\n var bg = this._bgVisual = new drawing.MultiPath({\n fill: {\n color: background,\n opacity: opacity\n },\n stroke: {\n color: border.width ? border.color : \"\",\n width: border.width,\n dashType: border.dashType\n },\n zIndex: -1\n });\n\n this.addBackgroundPaths(bg);\n\n this.appendVisual(bg);\n },\n\n pointsByCategoryIndex: function(categoryIndex) {\n var charts = this.charts;\n var result = [];\n\n if (categoryIndex !== null) {\n for (var i = 0; i < charts.length; i++) {\n var chart = charts[i];\n if (chart.pane.options.name === \"_navigator\") {\n continue;\n }\n\n var points = charts[i].categoryPoints[categoryIndex];\n if (points && points.length) {\n for (var j = 0; j < points.length; j++) {\n var point = points[j];\n if (point && defined(point.value) && point.value !== null) {\n result.push(point);\n }\n }\n }\n }\n }\n\n return result;\n },\n\n pointsBySeriesIndex: function(seriesIndex) {\n return this.filterPoints(function(point) {\n return point.series.index === seriesIndex;\n });\n },\n\n pointsBySeriesName: function(name) {\n return this.filterPoints(function(point) {\n return point.series.name === name;\n });\n },\n\n filterPoints: function(callback) {\n var charts = this.charts;\n var result = [];\n\n for (var i = 0; i < charts.length; i++) {\n var chart = charts[i];\n var points = chart.points;\n for (var j = 0; j < points.length; j++) {\n var point = points[j];\n if (point && point.visible !== false && callback(point)) {\n result.push(point);\n }\n }\n }\n\n return result;\n },\n\n findPoint: function(callback) {\n var charts = this.charts;\n\n for (var i = 0; i < charts.length; i++) {\n var chart = charts[i];\n var points = chart.points;\n for (var j = 0; j < points.length; j++) {\n var point = points[j];\n if (point && point.visible !== false && callback(point)) {\n return point;\n }\n }\n }\n },\n\n paneByPoint: function(point) {\n var panes = this.panes;\n\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n if (pane.box.containsPoint(point)) {\n return pane;\n }\n }\n },\n\n detachLabels: function() {\n var axes = this.groupAxes(this.panes);\n var xAxes = axes.x;\n var yAxes = axes.y;\n\n this.detachAxisGroupLabels(yAxes, xAxes);\n this.detachAxisGroupLabels(xAxes, yAxes);\n },\n\n detachAxisGroupLabels: function(axes, crossingAxes) {\n var this$1 = this;\n\n var labelAxisCount = 0;\n\n for (var i = 0; i < axes.length; i++) {\n var axis = axes[i];\n var pane = axis.pane;\n var anchor = paneAnchor(crossingAxes, pane) || crossingAxes[0];\n var axisIndex = i + labelAxisCount;\n var labelAxis = this$1.createLabelAxis(axis, axisIndex, anchor);\n\n if (labelAxis) {\n labelAxisCount++;\n\n var pos = pane.axes.indexOf(axis) + labelAxisCount;\n pane.appendAxisAt(labelAxis, pos);\n }\n }\n },\n\n createLabelAxis: function(axis, axisIndex, anchor) {\n var labelOptions = axis.options.labels;\n var position = labelOptions.position;\n var onAxis = position !== datavizConstants.END && position !== datavizConstants.START;\n var visible = labelOptions.visible;\n\n if (onAxis || visible === false) {\n return null;\n }\n\n var allAxes = this.groupAxes(this.panes);\n var crossingAxes = anchor.options.vertical ? allAxes.x : allAxes.y;\n var anchorCrossings = this.axisCrossingValues(anchor, crossingAxes);\n var end = position === datavizConstants.END;\n var range = anchor.range();\n var edge = end ? range.max : range.min;\n var crossingValue = limitValue(anchorCrossings[axisIndex], range.min, range.max);\n\n if (crossingValue - edge === 0) {\n return null;\n }\n\n anchorCrossings.splice(axisIndex + 1, 0, edge);\n anchor.options.axisCrossingValues = anchorCrossings;\n\n var labelAxis = axis.clone();\n axis.clear();\n\n labelAxis.options.name = undefined;\n labelAxis.options.line.visible = false;\n\n labelAxis.options.crosshair = undefined;\n labelAxis.options.notes = undefined;\n labelAxis.options.plotBands = undefined;\n\n return labelAxis;\n }\n});\n\nfunction isSingleAxis(axis) {\n return !axis.pane.axes.some(function (a) { return a.options.vertical === axis.options.vertical && a !== axis && a.options.visible !== false; }\n );\n}\n\nfunction axisGroupBox(axes) {\n var length = axes.length;\n var box;\n\n for (var i = 0; i < length; i++) {\n var axis = axes[i];\n var visible = axis.options.visible !== false;\n if (visible || isSingleAxis(axis)) {\n var axisBox = visible ? axis.contentBox() : axis.lineBox();\n\n if (!box) {\n box = axisBox.clone();\n } else {\n box.wrap(axisBox);\n }\n }\n }\n\n return box || new Box();\n}\n\nfunction paneAnchor(axes, pane) {\n for (var i = 0; i < axes.length; i++) {\n var anchor = axes[i];\n if (anchor && anchor.pane === pane) {\n return anchor;\n }\n }\n}\n\nfunction isTransparent(color) {\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n}\n\nvar allPaneAxes = function (panes) { return panes.reduce(function (acc, pane) { return acc.concat(pane.axes); }, []); };\n\nsetDefaultOptions(PlotAreaBase, {\n series: [],\n plotArea: {\n margin: {}\n },\n background: \"\",\n border: {\n color: BLACK,\n width: 0\n },\n paneDefaults: {\n title: {}\n },\n legend: {\n inactiveItems: {\n labels: {\n color: \"#919191\"\n },\n markers: {\n color: \"#919191\"\n }\n }\n }\n});\n\nvar PlotAreaEventsMixin = {\n hover: function(chart, e) {\n this._dispatchEvent(chart, e, PLOT_AREA_HOVER);\n },\n\n click: function(chart, e) {\n this._dispatchEvent(chart, e, PLOT_AREA_CLICK);\n }\n};\n\nvar SeriesAggregator = Class.extend({\n init: function(series, binder, defaultAggregates) {\n\n var canonicalFields = binder.canonicalFields(series);\n var valueFields = binder.valueFields(series);\n var sourceFields = binder.sourceFields(series, canonicalFields);\n var seriesFields = this._seriesFields = [];\n var defaults = defaultAggregates.query(series.type);\n var rootAggregate = series.aggregate || defaults;\n\n this._series = series;\n this._binder = binder;\n\n for (var i = 0; i < canonicalFields.length; i++) {\n var field = canonicalFields[i];\n var fieldAggregate = (void 0);\n\n if (isObject(rootAggregate)) {\n fieldAggregate = rootAggregate[field];\n } else if (i === 0 || inArray(field, valueFields)) {\n fieldAggregate = rootAggregate;\n } else {\n break;\n }\n\n if (fieldAggregate) {\n seriesFields.push({\n canonicalName: field,\n name: sourceFields[i],\n transform: isFunction(fieldAggregate) ? fieldAggregate : Aggregates[fieldAggregate]\n });\n }\n }\n },\n\n aggregatePoints: function(srcPoints, group) {\n var this$1 = this;\n\n var ref = this;\n var series = ref._series;\n var seriesFields = ref._seriesFields;\n var data = this._bindPoints(srcPoints || []);\n var firstDataItem = data.dataItems[0];\n var result = {};\n\n if (firstDataItem && !isNumber(firstDataItem) && !isArray(firstDataItem)) {\n var fn = function() {};\n fn.prototype = firstDataItem;\n result = new fn();\n }\n\n for (var i = 0; i < seriesFields.length; i++) {\n var field = seriesFields[i];\n var srcValues = this$1._bindField(data.values, field.canonicalName);\n var value = field.transform(srcValues, series, data.dataItems, group);\n\n if (value !== null && isObject(value) && !defined(value.length) && !(value instanceof Date)) {\n result = value;\n break;\n } else {\n if (defined(value)) {\n setValue(field.name, result, value);\n }\n }\n }\n\n return result;\n },\n\n _bindPoints: function(points) {\n var ref = this;\n var binder = ref._binder;\n var series = ref._series;\n var values = [];\n var dataItems = [];\n\n for (var i = 0; i < points.length; i++) {\n var pointIx = points[i];\n\n values.push(binder.bindPoint(series, pointIx));\n dataItems.push(series.data[pointIx]);\n }\n\n return {\n values: values,\n dataItems: dataItems\n };\n },\n\n _bindField: function(data, field) {\n var values = [];\n var count = data.length;\n\n for (var i = 0; i < count; i++) {\n var item = data[i];\n var valueFields = item.valueFields;\n var value = (void 0);\n\n if (defined(valueFields[field])) {\n value = valueFields[field];\n } else {\n value = item.fields[field];\n }\n\n values.push(value);\n }\n\n return values;\n }\n});\n\nfunction setValue(fieldName, target, value) {\n var parentObj = target;\n var field = fieldName;\n\n if (fieldName.indexOf(\".\") > -1) {\n var parts = fieldName.split(\".\");\n\n while (parts.length > 1) {\n field = parts.shift();\n if (!defined(parentObj[field])) {\n parentObj[field] = {};\n }\n parentObj = parentObj[field];\n }\n field = parts.shift();\n }\n\n parentObj[field] = value;\n}\n\nvar DefaultAggregates = Class.extend({\n init: function() {\n\n this._defaults = {};\n },\n\n register: function(seriesTypes, aggregates) {\n var this$1 = this;\n\n for (var i = 0; i < seriesTypes.length; i++) {\n this$1._defaults[seriesTypes[i]] = aggregates;\n }\n },\n\n query: function(seriesType) {\n return this._defaults[seriesType];\n }\n});\n\nDefaultAggregates.current = new DefaultAggregates();\n\nvar RangeBar = Bar.extend({\n createLabel: function() {\n var labels = this.options.labels;\n var fromOptions = deepExtend({}, labels, labels.from);\n var toOptions = deepExtend({}, labels, labels.to);\n\n if (fromOptions.visible) {\n this.labelFrom = this._createLabel(fromOptions);\n this.append(this.labelFrom);\n }\n\n if (toOptions.visible) {\n this.labelTo = this._createLabel(toOptions);\n this.append(this.labelTo);\n }\n },\n\n _createLabel: function(options) {\n var labelTemplate = getTemplate(options);\n var pointData = this.pointData();\n\n var labelText;\n\n if (labelTemplate) {\n labelText = labelTemplate(pointData);\n } else {\n labelText = this.formatValue(options.format);\n }\n\n return new BarLabel(labelText,\n deepExtend({\n vertical: this.options.vertical\n },\n options\n ), pointData);\n },\n\n reflow: function(targetBox) {\n this.render();\n\n var ref = this;\n var labelFrom = ref.labelFrom;\n var labelTo = ref.labelTo;\n var value = ref.value;\n\n this.box = targetBox;\n\n if (labelFrom) {\n labelFrom.options.aboveAxis = value.from > value.to;\n labelFrom.reflow(targetBox);\n }\n\n if (labelTo) {\n labelTo.options.aboveAxis = value.to > value.from;\n labelTo.reflow(targetBox);\n }\n\n if (this.note) {\n this.note.reflow(targetBox);\n }\n }\n});\n\nRangeBar.prototype.defaults = deepExtend({}, RangeBar.prototype.defaults, {\n labels: {\n format: \"{0} - {1}\"\n },\n tooltip: {\n format: \"{1}\"\n }\n});\n\nvar RangeBarChart = BarChart.extend({\n pointType: function() {\n return RangeBar;\n },\n\n pointValue: function(data) {\n return data.valueFields;\n },\n\n formatPointValue: function(point, format) {\n if (point.value.from === null && point.value.to === null) {\n return \"\";\n }\n\n return this.chartService.format.auto(format, point.value.from, point.value.to);\n },\n\n plotRange: function(point) {\n if (!point) {\n return 0;\n }\n\n return [ point.value.from, point.value.to ];\n },\n\n updateRange: function(value, fields) {\n var axisName = fields.series.axis;\n var from = value.from;\n var to = value.to;\n var axisRange = this.valueAxisRanges[axisName];\n\n if (value !== null && isNumber(from) && isNumber(to)) {\n axisRange = this.valueAxisRanges[axisName] = axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange.min = Math.min(axisRange.min, from);\n axisRange.max = Math.max(axisRange.max, from);\n\n axisRange.min = Math.min(axisRange.min, to);\n axisRange.max = Math.max(axisRange.max, to);\n }\n },\n\n aboveAxis: function(point) {\n var value = point.value;\n return value.from < value.to;\n }\n});\n\nRangeBarChart.prototype.plotLimits = CategoricalChart.prototype.plotLimits;\n\nvar RangeLinePoint = LinePoint.extend({\n aliasFor: function() {\n return this.parent;\n }\n});\n\nvar AUTO = 'auto';\nvar DEFAULT_FROM_FORMAT = '{0}';\nvar DEFAULT_TO_FORMAT = '{1}';\n\nvar RangeAreaPoint = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this);\n\n this.value = value;\n this.options = options;\n this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n this.tooltipTracking = true;\n this.initLabelsFormat();\n },\n\n render: function() {\n if (this._rendered) {\n return;\n }\n\n this._rendered = true;\n\n var ref = this.options;\n var markers = ref.markers;\n var labels = ref.labels;\n var value = this.value;\n\n var fromPoint = this.fromPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n labels: labels.from,\n markers: markers.from\n }));\n\n var toPoint = this.toPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n labels: labels.to,\n markers: markers.to\n }));\n\n this.copyFields(fromPoint);\n this.copyFields(toPoint);\n\n this.append(fromPoint);\n this.append(toPoint);\n },\n\n reflow: function(targetBox) {\n this.render();\n\n var fromBox = targetBox.from;\n var toBox = targetBox.to;\n\n this.positionLabels(fromBox, toBox);\n\n this.fromPoint.reflow(fromBox);\n this.toPoint.reflow(toBox);\n\n this.box = this.fromPoint.markerBox().clone().wrap(this.toPoint.markerBox());\n },\n\n createHighlight: function() {\n var group = new Group();\n group.append(this.fromPoint.createHighlight());\n group.append(this.toPoint.createHighlight());\n\n return group;\n },\n\n highlightVisual: function() {\n return this.visual;\n },\n\n highlightVisualArgs: function() {\n return {\n options: this.options,\n from: this.fromPoint.highlightVisualArgs(),\n to: this.toPoint.highlightVisualArgs()\n };\n },\n\n tooltipAnchor: function() {\n var clipBox = this.owner.pane.clipBox();\n var showTooltip = !clipBox || clipBox.overlaps(this.box);\n\n if (showTooltip) {\n var box = this.box;\n var center = box.center();\n var horizontalAlign = LEFT;\n var x, y, verticalAlign;\n\n if (this.options.vertical) {\n x = center.x;\n y = box.y1 - TOOLTIP_OFFSET;\n verticalAlign = BOTTOM;\n } else {\n x = box.x2 + TOOLTIP_OFFSET;\n y = center.y;\n verticalAlign = CENTER;\n }\n\n return {\n point: new Point(x, y),\n align: {\n horizontal: horizontalAlign,\n vertical: verticalAlign\n }\n };\n }\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n overlapsBox: function(box) {\n return this.box.overlaps(box);\n },\n\n unclipElements: function() {\n this.fromPoint.unclipElements();\n this.toPoint.unclipElements();\n },\n\n initLabelsFormat: function() {\n var labels = this.options.labels;\n if (!labels.format) {\n if (!labels.from || !labels.from.format) {\n labels.from = $.extend({}, labels.from, {\n format: DEFAULT_FROM_FORMAT\n });\n }\n\n if (!labels.to || !labels.to.format) {\n labels.to = $.extend({}, labels.to, {\n format: DEFAULT_TO_FORMAT\n });\n }\n }\n },\n\n positionLabels: function(fromBox, toBox) {\n var ref = this.options;\n var labels = ref.labels;\n var vertical = ref.vertical;\n\n if (labels.position === AUTO) {\n var fromLabelPosition, toLabelPosition;\n if (vertical) {\n if (toBox.y1 <= fromBox.y1) {\n toLabelPosition = ABOVE;\n fromLabelPosition = BELOW;\n } else {\n toLabelPosition = BELOW;\n fromLabelPosition = ABOVE;\n }\n } else {\n if (toBox.x1 <= fromBox.x1) {\n toLabelPosition = LEFT;\n fromLabelPosition = RIGHT;\n } else {\n toLabelPosition = RIGHT;\n fromLabelPosition = LEFT;\n }\n }\n\n if (!labels.from || !labels.from.position) {\n this.fromPoint.options.labels.position = fromLabelPosition;\n }\n\n if (!labels.to || !labels.to.position) {\n this.toPoint.options.labels.position = toLabelPosition;\n }\n }\n },\n\n copyFields: function(point) {\n point.dataItem = this.dataItem;\n point.category = this.category;\n point.series = this.series;\n point.color = this.color;\n point.owner = this.owner;\n }\n});\n\ndeepExtend(RangeAreaPoint.prototype, PointEventsMixin);\ndeepExtend(RangeAreaPoint.prototype, NoteMixin);\n\nRangeAreaPoint.prototype.defaults = {\n markers: {\n visible: false,\n background: WHITE,\n size: LINE_MARKER_SIZE,\n type: CIRCLE,\n border: {\n width: 2\n },\n opacity: 1\n },\n labels: {\n visible: false,\n margin: getSpacing(3),\n padding: getSpacing(4),\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n },\n position: AUTO\n },\n notes: {\n label: {}\n },\n highlight: {\n markers: {\n border: {\n color: WHITE,\n width: 2\n }\n },\n zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n },\n tooltip: {\n format: '{0} - {1}'\n }\n};\n\nvar RangeAreaSegment = AreaSegment.extend({\n createStrokeSegments: function() {\n return this.segmentsFromPoints(this.toGeometryPoints(this.toPoints()));\n },\n\n stackSegments: function() {\n var fromSegments = this.fromSegments;\n if (!this.fromSegments) {\n fromSegments = this.fromSegments = this.segmentsFromPoints(this.toGeometryPoints(this.fromPoints().reverse()));\n }\n\n return fromSegments;\n },\n\n createStroke: function(style) {\n var toPath = new Path(style);\n var fromPath = new Path(style);\n\n toPath.segments.push.apply(toPath.segments, this.strokeSegments());\n fromPath.segments.push.apply(fromPath.segments, this.stackSegments());\n\n this.visual.append(toPath);\n this.visual.append(fromPath);\n },\n\n hasStackSegment: function() {\n return true;\n },\n\n fromPoints: function() {\n return this.linePoints.map(function (point) { return point.fromPoint; });\n },\n\n toPoints: function() {\n return this.linePoints.map(function (point) { return point.toPoint; });\n }\n});\n\nvar SplineRangeAreaSegment = RangeAreaSegment.extend({\n createStrokeSegments: function() {\n return this.createCurveSegments(this.toPoints());\n },\n\n stackSegments: function() {\n var fromSegments = this.fromSegments;\n if (!this.fromSegments) {\n fromSegments = this.fromSegments = this.createCurveSegments(this.fromPoints().reverse());\n }\n\n return fromSegments;\n },\n\n createCurveSegments: function(points) {\n var curveProcessor = new CurveProcessor();\n\n return curveProcessor.process(this.toGeometryPoints(points));\n }\n});\n\nvar StepRangeAreaSegment = RangeAreaSegment.extend({\n createStrokeSegments: function() {\n return this.segmentsFromPoints(this.calculateStepPoints(this.toPoints()));\n },\n\n stackSegments: function() {\n var fromSegments = this.fromSegments;\n if (!this.fromSegments) {\n fromSegments = this.fromSegments = this.segmentsFromPoints(this.calculateStepPoints(this.fromPoints()));\n fromSegments.reverse();\n }\n\n return fromSegments;\n }\n});\n\ndeepExtend(StepRangeAreaSegment.prototype, StepLineMixin);\n\nvar RangeAreaChart = CategoricalChart.extend({\n render: function() {\n CategoricalChart.fn.render.call(this);\n\n this.renderSegments();\n },\n\n pointType: function() {\n return RangeAreaPoint;\n },\n\n createPoint: function(data, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var value = data.valueFields;\n\n if (!hasValue(value.from) && !hasValue(value.to)) {\n if (this.seriesMissingValues(series) === ZERO) {\n value = {\n from: 0,\n to: 0\n };\n } else {\n return null;\n }\n }\n\n var pointOptions = this.pointOptions(series, seriesIx);\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n var color = data.fields.color || series.color;\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new RangeAreaPoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = (currentSeries.line || {}).style;\n var segmentType;\n if (style === \"smooth\") {\n segmentType = SplineRangeAreaSegment;\n } else if (style === \"step\") {\n segmentType = StepRangeAreaSegment;\n } else {\n segmentType = RangeAreaSegment;\n }\n\n return new segmentType(linePoints, currentSeries, seriesIx);\n },\n\n plotRange: function(point, startValue) {\n if (!point) {\n return [ startValue, startValue ];\n }\n\n return [ point.value.from, point.value.to ];\n },\n\n valueSlot: function(valueAxis, plotRange) {\n var fromSlot = valueAxis.getSlot(plotRange[0], plotRange[0], !this.options.clip);\n var toSlot = valueAxis.getSlot(plotRange[1], plotRange[1], !this.options.clip);\n if (fromSlot && toSlot) {\n return {\n from: fromSlot,\n to: toSlot\n };\n }\n },\n\n pointSlot: function(categorySlot, valueSlot) {\n var from = valueSlot.from;\n var to = valueSlot.to;\n var fromSlot, toSlot;\n\n if (this.options.invertAxes) {\n fromSlot = new Box(from.x1, categorySlot.y1, from.x2, categorySlot.y2);\n toSlot = new Box(to.x1, categorySlot.y1, to.x2, categorySlot.y2);\n } else {\n fromSlot = new Box(categorySlot.x1, from.y1, categorySlot.x2, from.y2);\n toSlot = new Box(categorySlot.x1, to.y1, categorySlot.x2, to.y2);\n }\n\n return {\n from: fromSlot,\n to: toSlot\n };\n },\n\n addValue: function(data, fields) {\n var valueFields = data.valueFields;\n if (!isNumber(valueFields.from)) {\n valueFields.from = valueFields.to;\n }\n\n if (!isNumber(valueFields.to)) {\n valueFields.to = valueFields.from;\n }\n\n CategoricalChart.fn.addValue.call(this, data, fields);\n },\n\n updateRange: function(value, fields) {\n if (value !== null && isNumber(value.from) && isNumber(value.to)) {\n var axisName = fields.series.axis;\n var axisRange = this.valueAxisRanges[axisName] = this.valueAxisRanges[axisName] || { min: MAX_VALUE, max: MIN_VALUE };\n var from = value.from;\n var to = value.to;\n\n axisRange.min = Math.min(axisRange.min, from, to);\n axisRange.max = Math.max(axisRange.max, from, to);\n }\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n\n return this.chartService.format.auto(format, value.from, value.to);\n },\n\n animationPoints: function() {\n var points = this.points;\n var result = [];\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n if (point) {\n result.push((point.fromPoint || {}).marker);\n result.push((point.toPoint || {}).marker);\n }\n }\n\n return result.concat(this._segments);\n }\n});\n\ndeepExtend(RangeAreaChart.prototype, LineChartMixin, ClipAnimationMixin);\n\nvar OHLCPoint = Candlestick.extend({\n reflow: function(box) {\n var ref = this;\n var options = ref.options;\n var value = ref.value;\n var chart = ref.owner;\n var valueAxis = chart.seriesValueAxis(options);\n var oPoints = [];\n var cPoints = [];\n var lhPoints = [];\n\n var lhSlot = valueAxis.getSlot(value.low, value.high);\n var oSlot = valueAxis.getSlot(value.open, value.open);\n var cSlot = valueAxis.getSlot(value.close, value.close);\n\n oSlot.x1 = cSlot.x1 = lhSlot.x1 = box.x1;\n oSlot.x2 = cSlot.x2 = lhSlot.x2 = box.x2;\n\n var mid = lhSlot.center().x;\n\n oPoints.push([ oSlot.x1, oSlot.y1 ]);\n oPoints.push([ mid, oSlot.y1 ]);\n cPoints.push([ mid, cSlot.y1 ]);\n cPoints.push([ cSlot.x2, cSlot.y1 ]);\n lhPoints.push([ mid, lhSlot.y1 ]);\n lhPoints.push([ mid, lhSlot.y2 ]);\n\n this.lines = [\n oPoints, cPoints, lhPoints\n ];\n\n this.box = lhSlot.clone().wrap(oSlot.clone().wrap(cSlot));\n\n this.reflowNote();\n },\n\n createBody: function() {}\n});\n\nvar OHLCChart = CandlestickChart.extend({\n pointType: function() {\n return OHLCPoint;\n }\n});\n\nvar WaterfallSegment = ChartElement.extend({\n init: function(from, to, series) {\n ChartElement.fn.init.call(this);\n\n this.from = from;\n this.to = to;\n this.series = series;\n },\n\n linePoints: function() {\n var from = this.from;\n var ref = this;\n var fromBox = ref.from.box;\n var toBox = ref.to.box;\n var points = [];\n\n if (from.isVertical) {\n var y = from.aboveAxis ? fromBox.y1 : fromBox.y2;\n points.push(\n [ fromBox.x1, y ],\n [ toBox.x2, y ]\n );\n } else {\n var x = from.aboveAxis ? fromBox.x2 : fromBox.x1;\n points.push(\n [ x, fromBox.y1 ],\n [ x, toBox.y2 ]\n );\n }\n\n return points;\n },\n\n createVisual: function() {\n ChartElement.fn.createVisual.call(this);\n\n var line = this.series.line || {};\n\n var path = Path.fromPoints(this.linePoints(), {\n stroke: {\n color: line.color,\n width: line.width,\n opacity: line.opacity,\n dashType: line.dashType\n }\n });\n\n alignPathToPixel(path);\n this.visual.append(path);\n }\n});\n\nsetDefaultOptions(WaterfallSegment, {\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n }\n});\n\nvar WaterfallChart = BarChart.extend({\n render: function() {\n BarChart.fn.render.call(this);\n this.createSegments();\n },\n\n traverseDataPoints: function(callback) {\n var this$1 = this;\n\n var series = this.options.series;\n var totalCategories = categoriesCount(series);\n var isVertical = !this.options.invertAxes;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var total = 0;\n var runningTotal = 0;\n\n for (var categoryIx = 0; categoryIx < totalCategories; categoryIx++) {\n var data = SeriesBinder.current.bindPoint(currentSeries, categoryIx);\n var value = data.valueFields.value;\n var summary = data.fields.summary;\n var from = total;\n var to = (void 0);\n\n if (summary) {\n if (summary.toLowerCase() === \"total\") {\n data.valueFields.value = total;\n from = 0;\n to = total;\n } else {\n data.valueFields.value = runningTotal;\n to = from - runningTotal;\n runningTotal = 0;\n }\n } else if (isNumber(value)) {\n runningTotal += value;\n total += value;\n to = total;\n }\n\n callback(data, {\n category: this$1.categoryAxis.categoryAt(categoryIx),\n categoryIx: categoryIx,\n series: currentSeries,\n seriesIx: seriesIx,\n total: total,\n runningTotal: runningTotal,\n from: from,\n to: to,\n isVertical: isVertical\n });\n }\n }\n },\n\n updateRange: function(value, fields) {\n BarChart.fn.updateRange.call(this, { value: fields.to }, fields);\n },\n\n aboveAxis: function(point) {\n return point.value >= 0;\n },\n\n plotRange: function(point) {\n return [ point.from, point.to ];\n },\n\n createSegments: function() {\n var this$1 = this;\n\n var series = this.options.series;\n var seriesPoints = this.seriesPoints;\n var segments = this.segments = [];\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var points = seriesPoints[seriesIx];\n\n if (points) {\n var prevPoint = (void 0);\n for (var pointIx = 0; pointIx < points.length; pointIx++) {\n var point = points[pointIx];\n\n if (point && prevPoint) {\n var segment = new WaterfallSegment(prevPoint, point, currentSeries);\n segments.push(segment);\n this$1.append(segment);\n }\n\n prevPoint = point;\n }\n }\n }\n }\n});\n\nvar AREA_SERIES = [ AREA, VERTICAL_AREA, RANGE_AREA, VERTICAL_RANGE_AREA ];\nvar OUT_OF_RANGE_SERIES = [ LINE, VERTICAL_LINE ].concat(AREA_SERIES);\n\nvar CategoricalPlotArea = PlotAreaBase.extend({\n initFields: function(series) {\n var this$1 = this;\n\n this.namedCategoryAxes = {};\n this.namedValueAxes = {};\n this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n\n if (series.length > 0) {\n this.invertAxes = inArray(\n series[0].type, [ BAR, BULLET, VERTICAL_LINE, VERTICAL_AREA, VERTICAL_RANGE_AREA,\n RANGE_BAR, HORIZONTAL_WATERFALL, VERTICAL_BOX_PLOT ]\n );\n\n for (var i = 0; i < series.length; i++) {\n var stack = series[i].stack;\n if (stack && stack.type === \"100%\") {\n this$1.stack100 = true;\n break;\n }\n }\n }\n\n },\n\n render: function(panes) {\n if (panes === void 0) { panes = this.panes; }\n\n this.createCategoryAxes(panes);\n this.aggregateCategories(panes);\n this.createCategoryAxesLabels(panes);\n this.createCharts(panes);\n this.createValueAxes(panes);\n },\n\n removeAxis: function(axis) {\n var axisName = axis.options.name;\n\n PlotAreaBase.fn.removeAxis.call(this, axis);\n\n if (axis instanceof CategoryAxis) {\n delete this.namedCategoryAxes[axisName];\n } else {\n this.valueAxisRangeTracker.reset(axisName);\n delete this.namedValueAxes[axisName];\n }\n\n if (axis === this.categoryAxis) {\n delete this.categoryAxis;\n }\n\n if (axis === this.valueAxis) {\n delete this.valueAxis;\n }\n },\n\n createCharts: function(panes) {\n var this$1 = this;\n\n var seriesByPane = this.groupSeriesByPane();\n\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n this$1.addToLegend(paneSeries);\n\n var visibleSeries = this$1.filterVisibleSeries(paneSeries);\n if (!visibleSeries) {\n continue;\n }\n\n var groups = this$1.groupSeriesByCategoryAxis(visibleSeries);\n for (var groupIx = 0; groupIx < groups.length; groupIx++) {\n this$1.createChartGroup(groups[groupIx], pane);\n }\n }\n },\n\n createChartGroup: function(series, pane) {\n this.createAreaChart(\n filterSeriesByType(series, [ AREA, VERTICAL_AREA ]), pane\n );\n\n this.createRangeAreaChart(\n filterSeriesByType(series, [ RANGE_AREA, VERTICAL_RANGE_AREA ]), pane\n );\n\n this.createBarChart(\n filterSeriesByType(series, [ COLUMN, BAR ]), pane\n );\n\n this.createRangeBarChart(\n filterSeriesByType(series, [ RANGE_COLUMN, RANGE_BAR ]), pane\n );\n\n this.createBulletChart(\n filterSeriesByType(series, [ BULLET, VERTICAL_BULLET ]), pane\n );\n\n this.createCandlestickChart(\n filterSeriesByType(series, CANDLESTICK), pane\n );\n\n this.createBoxPlotChart(\n filterSeriesByType(series, [ BOX_PLOT, VERTICAL_BOX_PLOT ]), pane\n );\n\n this.createOHLCChart(\n filterSeriesByType(series, OHLC), pane\n );\n\n this.createWaterfallChart(\n filterSeriesByType(series, [ WATERFALL, HORIZONTAL_WATERFALL ]), pane\n );\n\n this.createLineChart(\n filterSeriesByType(series, [ LINE, VERTICAL_LINE ]), pane\n );\n },\n\n aggregateCategories: function(panes) {\n var this$1 = this;\n\n var series = this.srcSeries || this.series;\n var processedSeries = [];\n this._currentPointsCache = {};\n this._seriesPointsCache = this._seriesPointsCache || {};\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n var categoryAxis = this$1.seriesCategoryAxis(currentSeries);\n var axisPane = this$1.findPane(categoryAxis.options.pane);\n var dateAxis = equalsIgnoreCase(categoryAxis.options.type, DATE);\n\n if ((dateAxis || currentSeries.categoryField) && inArray(axisPane, panes)) {\n currentSeries = this$1.aggregateSeries(currentSeries, categoryAxis);\n } else {\n currentSeries = this$1.filterSeries(currentSeries, categoryAxis);\n }\n\n processedSeries.push(currentSeries);\n }\n\n this._seriesPointsCache = this._currentPointsCache;\n this._currentPointsCache = null;\n\n this.srcSeries = series;\n this.series = processedSeries;\n },\n\n filterSeries: function(series, categoryAxis) {\n var dataLength = (series.data || {}).length;\n categoryAxis._seriesMax = Math.max(categoryAxis._seriesMax || 0, dataLength);\n\n if (!(isNumber(categoryAxis.options.min) || isNumber(categoryAxis.options.max))) {\n return series;\n }\n\n var range = categoryAxis.currentRangeIndices();\n var outOfRangePoints = inArray(series.type, OUT_OF_RANGE_SERIES);\n var currentSeries = deepExtend({}, series);\n\n currentSeries.data = (currentSeries.data || []).slice(range.min, range.max + 1);\n\n if (outOfRangePoints) {\n createOutOfRangePoints(currentSeries, range, dataLength, function (idx) { return ({\n item: series.data[idx],\n category: categoryAxis.categoryAt(idx, true),\n categoryIx: idx - range.min\n }); }, function (idx) { return defined(series.data[idx]); });\n }\n\n return currentSeries;\n },\n\n clearSeriesPointsCache: function() {\n this._seriesPointsCache = {};\n },\n\n seriesSourcePoints: function(series, categoryAxis) {\n var this$1 = this;\n\n var key = (series.index) + \";\" + (categoryAxis.categoriesHash());\n if (this._seriesPointsCache[key]) {\n this._currentPointsCache[key] = this._seriesPointsCache[key];\n return this._seriesPointsCache[key];\n }\n\n var axisOptions = categoryAxis.options;\n var srcCategories = axisOptions.srcCategories;\n var dateAxis = equalsIgnoreCase(axisOptions.type, DATE);\n var srcData = series.data;\n var getFn = dateAxis ? getDateField : getField;\n var result = [];\n if (!dateAxis) {\n categoryAxis.mapCategories();//fixes major performance issue caused by searching for the index for large data\n }\n\n for (var idx = 0; idx < srcData.length; idx++) {\n var category = (void 0);\n if (series.categoryField) {\n category = getFn(series.categoryField, srcData[idx], this$1.chartService.intl);\n } else {\n category = srcCategories[idx];\n }\n\n if (defined(category) && category !== null) {\n var categoryIx = categoryAxis.totalIndex(category);\n result[categoryIx] = result[categoryIx] || { items: [], category: category };\n result[categoryIx].items.push(idx);\n }\n }\n\n this._currentPointsCache[key] = result;\n\n return result;\n },\n\n aggregateSeries: function(series, categoryAxis) {\n var srcData = series.data;\n if (!srcData.length) {\n return series;\n }\n\n var srcPoints = this.seriesSourcePoints(series, categoryAxis);\n var result = deepExtend({}, series);\n var aggregator = new SeriesAggregator(deepExtend({}, series), SeriesBinder.current, DefaultAggregates.current);\n var data = result.data = [];\n var dataItems = categoryAxis.options.dataItems || [];\n\n var range = categoryAxis.currentRangeIndices();\n var categoryItem = function (idx) {\n var categoryIdx = idx - range.min;\n var point = srcPoints[idx];\n if (!point) {\n point = srcPoints[idx] = {};\n }\n\n point.categoryIx = categoryIdx;\n\n if (!point.item) {\n var category = categoryAxis.categoryAt(idx, true);\n point.category = category;\n point.item = aggregator.aggregatePoints(point.items, category);\n }\n\n return point;\n };\n\n for (var idx = range.min; idx <= range.max; idx++) {\n var point = categoryItem(idx);\n data[point.categoryIx] = point.item;\n\n if (point.items && point.items.length) {\n dataItems[point.categoryIx] = point.item;\n }\n }\n\n if (inArray(result.type, OUT_OF_RANGE_SERIES)) {\n createOutOfRangePoints(result, range, categoryAxis.totalCount(), categoryItem, function (idx) { return srcPoints[idx]; });\n }\n\n categoryAxis.options.dataItems = dataItems;\n\n return result;\n },\n\n appendChart: function(chart, pane) {\n var series = chart.options.series;\n var categoryAxis = this.seriesCategoryAxis(series[0]);\n var categories = categoryAxis.options.categories;\n var categoriesToAdd = Math.max(0, categoriesCount(series) - categories.length);\n\n if (categoriesToAdd > 0) {//consider setting an option to axis instead of adding fake categories\n categories = categoryAxis.options.categories = categoryAxis.options.categories.slice(0);\n while (categoriesToAdd--) {\n categories.push(\"\");\n }\n }\n\n this.valueAxisRangeTracker.update(chart.valueAxisRanges);\n\n PlotAreaBase.fn.appendChart.call(this, chart, pane);\n },\n\n seriesPaneName: function(series) {\n var options = this.options;\n var axisName = series.axis;\n var axisOptions = [].concat(options.valueAxis);\n var axis = grep(axisOptions, function(a) { return a.name === axisName; })[0];\n var panes = options.panes || [ {} ];\n var defaultPaneName = (panes[0] || {}).name || \"default\";\n var paneName = (axis || {}).pane || defaultPaneName;\n\n return paneName;\n },\n\n seriesCategoryAxis: function(series) {\n var axisName = series.categoryAxis;\n var axis = axisName ? this.namedCategoryAxes[axisName] : this.categoryAxis;\n\n if (!axis) {\n throw new Error(\"Unable to locate category axis with name \" + axisName);\n }\n\n return axis;\n },\n\n stackableChartOptions: function(firstSeries, pane) {\n var stack = firstSeries.stack;\n var isStacked100 = stack && stack.type === \"100%\";\n var clip = pane.options.clip;\n\n return {\n isStacked: stack,\n isStacked100: isStacked100,\n clip: clip\n };\n },\n\n groupSeriesByCategoryAxis: function(series) {\n var categoryAxes = [];\n var unique = {};\n for (var idx = 0; idx < series.length; idx++) {\n var name = series[idx].categoryAxis || \"$$default$$\";\n if (!unique.hasOwnProperty(name)) {\n unique[name] = true;\n categoryAxes.push(name);\n }\n }\n\n var groups = [];\n for (var axisIx = 0; axisIx < categoryAxes.length; axisIx++) {\n var axis = categoryAxes[axisIx];\n var axisSeries = groupSeries(series, axis, axisIx);\n if (axisSeries.length === 0) {\n continue;\n }\n\n groups.push(axisSeries);\n }\n\n return groups;\n },\n\n createBarChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var barChart = new BarChart(this, $.extend({\n series: series,\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n }, this.stackableChartOptions(firstSeries, pane)));\n\n this.appendChart(barChart, pane);\n },\n\n createRangeBarChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var rangeColumnChart = new RangeBarChart(this, {\n series: series,\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n });\n\n this.appendChart(rangeColumnChart, pane);\n },\n\n createBulletChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var bulletChart = new BulletChart(this, {\n series: series,\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n\n this.appendChart(bulletChart, pane);\n },\n\n createLineChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var lineChart = new LineChart(this, $.extend({\n invertAxes: this.invertAxes,\n series: series\n }, this.stackableChartOptions(firstSeries, pane)));\n\n this.appendChart(lineChart, pane);\n },\n\n createAreaChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var areaChart = new AreaChart(this, $.extend({\n invertAxes: this.invertAxes,\n series: series\n }, this.stackableChartOptions(firstSeries, pane)));\n\n this.appendChart(areaChart, pane);\n },\n\n createRangeAreaChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var rangeAreaChart = new RangeAreaChart(this, {\n invertAxes: this.invertAxes,\n series: series,\n clip: pane.options.clip\n });\n\n this.appendChart(rangeAreaChart, pane);\n },\n\n createOHLCChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var chart = new OHLCChart(this, {\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n\n this.appendChart(chart, pane);\n },\n\n createCandlestickChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var chart = new CandlestickChart(this, {\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n\n this.appendChart(chart, pane);\n },\n\n createBoxPlotChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var chart = new BoxPlotChart(this, {\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n\n this.appendChart(chart, pane);\n },\n\n createWaterfallChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var waterfallChart = new WaterfallChart(this, {\n series: series,\n invertAxes: this.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n });\n\n this.appendChart(waterfallChart, pane);\n },\n\n axisRequiresRounding: function(categoryAxisName, categoryAxisIndex) {\n var this$1 = this;\n\n var centeredSeries = filterSeriesByType(this.series, EQUALLY_SPACED_SERIES);\n\n for (var seriesIx = 0; seriesIx < this.series.length; seriesIx++) {\n var currentSeries = this$1.series[seriesIx];\n if (inArray(currentSeries.type, AREA_SERIES)) {\n var line = currentSeries.line;\n if (line && line.style === STEP) {\n centeredSeries.push(currentSeries);\n }\n }\n }\n\n for (var seriesIx$1 = 0; seriesIx$1 < centeredSeries.length; seriesIx$1++) {\n var seriesAxis = centeredSeries[seriesIx$1].categoryAxis || \"\";\n if (seriesAxis === categoryAxisName || (!seriesAxis && categoryAxisIndex === 0)) {\n return true;\n }\n }\n },\n\n aggregatedAxis: function(categoryAxisName, categoryAxisIndex) {\n var series = this.series;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var seriesAxis = series[seriesIx].categoryAxis || \"\";\n if ((seriesAxis === categoryAxisName || (!seriesAxis && categoryAxisIndex === 0)) && series[seriesIx].categoryField) {\n return true;\n }\n }\n },\n\n createCategoryAxesLabels: function() {\n var axes = this.axes;\n for (var i = 0; i < axes.length; i++) {\n if (axes[i] instanceof CategoryAxis) {\n axes[i].createLabels();\n }\n }\n },\n\n createCategoryAxes: function(panes) {\n var this$1 = this;\n\n var invertAxes = this.invertAxes;\n var definitions = [].concat(this.options.categoryAxis);\n var axes = [];\n\n for (var i = 0; i < definitions.length; i++) {\n var axisOptions = definitions[i];\n var axisPane = this$1.findPane(axisOptions.pane);\n\n if (inArray(axisPane, panes)) {\n var name = axisOptions.name;\n var categories = axisOptions.categories; if (categories === void 0) { categories = []; }\n axisOptions = deepExtend({\n vertical: invertAxes,\n reverse: !invertAxes && this$1.chartService.rtl,\n axisCrossingValue: invertAxes ? MAX_VALUE : 0\n }, axisOptions);\n\n if (!defined(axisOptions.justified)) {\n axisOptions.justified = this$1.isJustified();\n }\n\n if (this$1.axisRequiresRounding(name, i)) {\n axisOptions.justified = false;\n }\n\n var categoryAxis = (void 0);\n\n if (isDateAxis(axisOptions, categories[0])) {\n categoryAxis = new dataviz.DateCategoryAxis(axisOptions, this$1.chartService);\n } else {\n categoryAxis = new CategoryAxis(axisOptions, this$1.chartService);\n }\n\n definitions[i].categories = categoryAxis.options.srcCategories;\n\n if (name) {\n if (this$1.namedCategoryAxes[name]) {\n throw new Error((\"Category axis with name \" + name + \" is already defined\"));\n }\n this$1.namedCategoryAxes[name] = categoryAxis;\n }\n\n categoryAxis.axisIndex = i;\n axes.push(categoryAxis);\n this$1.appendAxis(categoryAxis);\n }\n }\n\n var primaryAxis = this.categoryAxis || axes[0];\n this.categoryAxis = primaryAxis;\n\n if (invertAxes) {\n this.axisY = primaryAxis;\n } else {\n this.axisX = primaryAxis;\n }\n },\n\n isJustified: function() {\n var series = this.series;\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n if (!inArray(currentSeries.type, AREA_SERIES)) {\n return false;\n }\n }\n\n return true;\n },\n\n createValueAxes: function(panes) {\n var this$1 = this;\n\n var tracker = this.valueAxisRangeTracker;\n var defaultRange = tracker.query();\n var definitions = [].concat(this.options.valueAxis);\n var invertAxes = this.invertAxes;\n var baseOptions = { vertical: !invertAxes, reverse: invertAxes && this.chartService.rtl };\n var axes = [];\n\n if (this.stack100) {\n baseOptions.roundToMajorUnit = false;\n baseOptions.labels = { format: \"P0\" };\n }\n\n for (var i = 0; i < definitions.length; i++) {\n var axisOptions = definitions[i];\n var axisPane = this$1.findPane(axisOptions.pane);\n\n if (inArray(axisPane, panes)) {\n var name = axisOptions.name;\n var defaultAxisRange = equalsIgnoreCase(axisOptions.type, LOGARITHMIC) ? { min: 0.1, max: 1 } : { min: 0, max: 1 };\n var range = tracker.query(name) || defaultRange || defaultAxisRange;\n\n if (i === 0 && range && defaultRange) {\n range.min = Math.min(range.min, defaultRange.min);\n range.max = Math.max(range.max, defaultRange.max);\n }\n\n var axisType = (void 0);\n if (equalsIgnoreCase(axisOptions.type, LOGARITHMIC)) {\n axisType = dataviz.LogarithmicAxis;\n } else {\n axisType = dataviz.NumericAxis;\n }\n\n var valueAxis = new axisType(range.min, range.max,\n deepExtend({}, baseOptions, axisOptions),\n this$1.chartService\n );\n\n if (name) {\n if (this$1.namedValueAxes[name]) {\n throw new Error((\"Value axis with name \" + name + \" is already defined\"));\n }\n this$1.namedValueAxes[name] = valueAxis;\n }\n valueAxis.axisIndex = i;\n\n axes.push(valueAxis);\n this$1.appendAxis(valueAxis);\n }\n }\n\n var primaryAxis = this.valueAxis || axes[0];\n this.valueAxis = primaryAxis;\n\n if (invertAxes) {\n this.axisX = primaryAxis;\n } else {\n this.axisY = primaryAxis;\n }\n },\n\n _dispatchEvent: function(chart, e, eventType) {\n var coords = chart._eventCoordinates(e);\n var point = new Point(coords.x, coords.y);\n var pane = this.pointPane(point);\n var categories = [];\n var values = [];\n\n if (!pane) {\n return;\n }\n\n var allAxes = pane.axes;\n for (var i = 0; i < allAxes.length; i++) {\n var axis = allAxes[i];\n if (axis.getValue) {\n appendIfNotNull(values, axis.getValue(point));\n } else {\n appendIfNotNull(categories, axis.getCategory(point));\n }\n }\n\n if (categories.length === 0) {\n appendIfNotNull(categories, this.categoryAxis.getCategory(point));\n }\n\n if (categories.length > 0 && values.length > 0) {\n chart.trigger(eventType, {\n element: eventElement(e),\n originalEvent: e,\n category: singleItemOrArray(categories),\n value: singleItemOrArray(values)\n });\n }\n },\n\n pointPane: function(point) {\n var panes = this.panes;\n\n for (var i = 0; i < panes.length; i++) {\n var currentPane = panes[i];\n if (currentPane.contentBox.containsPoint(point)) {\n return currentPane;\n }\n }\n },\n\n updateAxisOptions: function(axis, options) {\n updateAxisOptions(this.options, axis, options);\n updateAxisOptions(this.originalOptions, axis, options);\n }\n});\n\nfunction updateAxisOptions(targetOptions, axis, options) {\n var axesOptions = axis instanceof CategoryAxis ? [].concat(targetOptions.categoryAxis) : [].concat(targetOptions.valueAxis);\n deepExtend(axesOptions[axis.axisIndex], options);\n}\n\nfunction groupSeries(series, axis, axisIx) {\n return grep(series, function(s) {\n return (axisIx === 0 && !s.categoryAxis) || (s.categoryAxis === axis);\n });\n}\n\nsetDefaultOptions(CategoricalPlotArea, {\n categoryAxis: {},\n valueAxis: {}\n});\n\ndeepExtend(CategoricalPlotArea.prototype, PlotAreaEventsMixin);\n\nvar Highlight = Class.extend({\n init: function() {\n\n this._points = [];\n },\n\n destroy: function() {\n this._points = [];\n },\n\n show: function(points, opacity) {\n var this$1 = this;\n\n var arrayPoints = [].concat(points);\n this.hide();\n\n for (var i = 0; i < arrayPoints.length; i++) {\n var point = arrayPoints[i];\n if (point && point.toggleHighlight && point.hasHighlight()) {\n this$1.togglePointHighlight(point, true, opacity);\n this$1._points.push(point);\n }\n }\n },\n\n togglePointHighlight: function(point, show, opacity) {\n var toggleHandler = (point.options.highlight || {}).toggle;\n if (toggleHandler) {\n var eventArgs = {\n category: point.category,\n series: point.series,\n dataItem: point.dataItem,\n value: point.value,\n stackValue: point.stackValue,\n preventDefault: preventDefault,\n visual: point.highlightVisual(),\n show: show\n };\n toggleHandler(eventArgs);\n if (!eventArgs._defaultPrevented) {\n point.toggleHighlight(show, opacity);\n }\n } else {\n point.toggleHighlight(show, opacity);\n }\n },\n\n hide: function() {\n var this$1 = this;\n\n var points = this._points;\n while (points.length) {\n this$1.togglePointHighlight(points.pop(), false);\n }\n },\n\n isHighlighted: function(element) {\n var points = this._points;\n\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n if (element === point) {\n return true;\n }\n }\n\n return false;\n }\n});\n\nfunction preventDefault() {\n this._defaultPrevented = true;\n}\n\nfunction acceptKey(e, mouseKey) {\n var key = (mouseKey || \"\").toLowerCase();\n var event = e.event;\n var accept = (key === \"none\" && !(event.ctrlKey || event.shiftKey || event.altKey)) || event[key + \"Key\"];\n\n return accept;\n}\n\nfunction toChartAxisRanges(axisRanges) {\n var ranges = {};\n for (var idx = 0; idx < axisRanges.length; idx++) {\n var axisRange = axisRanges[idx];\n if (axisRange.axis.options.name) {\n ranges[axisRange.axis.options.name] = {\n min: axisRange.range.min,\n max: axisRange.range.max\n };\n }\n }\n return ranges;\n}\n\nvar Pannable = Class.extend({\n init: function(plotArea, options) {\n\n this.plotArea = plotArea;\n this.options = deepExtend({}, this.options, options);\n },\n\n start: function(e) {\n this._active = acceptKey(e, this.options.key);\n return this._active;\n },\n\n move: function(e) {\n if (this._active) {\n var axisRanges = this.axisRanges = this._panAxes(e, X).concat(this._panAxes(e, Y));\n if (axisRanges.length) {\n this.axisRanges = axisRanges;\n return toChartAxisRanges(axisRanges);\n }\n }\n },\n\n end: function() {\n var active = this._active;\n this._active = false;\n\n return active;\n },\n\n pan: function() {\n var ref = this;\n var plotArea = ref.plotArea;\n var axisRanges = ref.axisRanges;\n if (axisRanges.length) {\n for (var idx = 0; idx < axisRanges.length; idx++) {\n var range = axisRanges[idx];\n plotArea.updateAxisOptions(range.axis, range.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n\n destroy: function() {\n delete this.plotArea;\n },\n\n _panAxes: function(e, position) {\n var plotArea = this.plotArea;\n var delta = -e[position].delta;\n var lock = (this.options.lock || \"\").toLowerCase();\n var updatedAxes = [];\n\n if (delta !== 0 && (lock || \"\").toLowerCase() !== position) {\n var axes = plotArea.axes;\n for (var idx = 0; idx < axes.length; idx++) {\n var axis = axes[idx];\n\n if (position === X && !axis.options.vertical || position === Y && axis.options.vertical) {\n var range = axis.pan(delta);\n\n if (range) {\n range.limitRange = true;\n updatedAxes.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n }\n\n return updatedAxes;\n }\n});\n\nPannable.prototype.options = {\n key: \"none\",\n lock: \"none\"\n};\n\nvar ZoomSelection = Class.extend({\n init: function(chart, options) {\n\n this.chart = chart;\n this.options = deepExtend({}, this.options, options);\n this.createElement();\n },\n\n createElement: function() {\n var marquee = this._marquee = document.createElement(\"div\");\n marquee.className = \"k-marquee\";\n var marqueeColor = document.createElement(\"div\");\n marqueeColor.className = \"k-marquee-color\";\n marquee.appendChild(marqueeColor);\n },\n\n removeElement: function() {\n if (this._marquee.parentNode) {\n this._marquee.parentNode.removeChild(this._marquee);\n }\n },\n\n setStyles: function(styles) {\n elementStyles(this._marquee, styles);\n },\n\n start: function(e) {\n if (acceptKey(e, this.options.key)) {\n var chart = this.chart;\n var point = chart._eventCoordinates(e);\n var zoomPane = this._zoomPane = chart._plotArea.paneByPoint(point);\n var clipBox = zoomPane ? zoomPane.chartsBox().clone() : null;\n\n if (zoomPane && clipBox) {\n var offset = this._elementOffset();\n\n clipBox.translate(offset.left, offset.top);\n this._zoomPaneClipBox = clipBox;\n\n document.body.appendChild(this._marquee);\n this.setStyles({\n left: e.pageX + 1,\n top: e.pageY + 1,\n width: 0,\n height: 0\n });\n\n return true;\n }\n }\n return false;\n },\n\n _elementOffset: function() {\n var chartElement = this.chart.element;\n var ref = elementStyles(chartElement, [ \"paddingLeft\", \"paddingTop\" ]);\n var paddingLeft = ref.paddingLeft;\n var paddingTop = ref.paddingTop;\n var offset = dataviz.elementOffset(chartElement);\n\n return {\n left: paddingLeft + offset.left,\n top: paddingTop + offset.top\n };\n },\n\n move: function(e) {\n var zoomPane = this._zoomPane;\n if (zoomPane) {\n this.setStyles(this._selectionPosition(e));\n }\n },\n\n end: function(e) {\n var zoomPane = this._zoomPane;\n if (zoomPane) {\n var elementOffset$$1 = this._elementOffset();\n var selectionPosition = this._selectionPosition(e);\n selectionPosition.left -= elementOffset$$1.left;\n selectionPosition.top -= elementOffset$$1.top;\n\n var start = { x: selectionPosition.left, y: selectionPosition.top };\n var end = { x: selectionPosition.left + selectionPosition.width, y: selectionPosition.top + selectionPosition.height };\n this._updateAxisRanges(start, end);\n\n this.removeElement();\n delete this._zoomPane;\n\n return toChartAxisRanges(this.axisRanges);\n }\n },\n\n zoom: function() {\n var axisRanges = this.axisRanges;\n if (axisRanges && axisRanges.length) {\n var plotArea = this.chart._plotArea;\n for (var idx = 0; idx < axisRanges.length; idx++) {\n var axisRange = axisRanges[idx];\n plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n\n destroy: function() {\n this.removeElement();\n delete this._marquee;\n delete this.chart;\n },\n\n _updateAxisRanges: function(start, end) {\n var lock = (this.options.lock || \"\").toLowerCase();\n var axisRanges = [];\n\n var axes = this._zoomPane.axes;\n for (var idx = 0; idx < axes.length; idx++) {\n var axis = axes[idx];\n var vertical = axis.options.vertical;\n if (!(lock === X && !vertical) && !(lock === Y && vertical) && defined(axis.axisIndex)) {\n var range = axis.pointsRange(start, end);\n if (range) {\n axisRanges.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n\n this.axisRanges = axisRanges;\n },\n\n _selectionPosition: function(e) {\n var clipBox = this._zoomPaneClipBox;\n var startLocation = {\n x: e.x.startLocation,\n y: e.y.startLocation\n };\n var pageX = e.x.location;\n var pageY = e.y.location;\n var lock = (this.options.lock || \"\").toLowerCase();\n var left = Math.min(startLocation.x, pageX);\n var top = Math.min(startLocation.y, pageY);\n var width = Math.abs(startLocation.x - pageX);\n var height = Math.abs(startLocation.y - pageY);\n\n if (lock === X) {\n left = clipBox.x1;\n width = clipBox.width();\n }\n if (lock === Y) {\n top = clipBox.y1;\n height = clipBox.height();\n }\n\n if (pageX > clipBox.x2) {\n width = clipBox.x2 - startLocation.x;\n }\n\n if (pageX < clipBox.x1) {\n width = startLocation.x - clipBox.x1;\n }\n\n if (pageY > clipBox.y2) {\n height = clipBox.y2 - startLocation.y;\n }\n\n if (pageY < clipBox.y1) {\n height = startLocation.y - clipBox.y1;\n }\n\n return {\n left: Math.max(left, clipBox.x1),\n top: Math.max(top, clipBox.y1),\n width: width,\n height: height\n };\n }\n});\n\nZoomSelection.prototype.options = {\n key: \"shift\",\n lock: \"none\"\n};\n\nvar ref = drawing.util;\nvar limitValue$1 = ref.limitValue;\n\n// Limit the zoom rate between 1% and 90% per mousewheel event.\n// At zoom rates close to 100% the axis range quickly becomes 0.\nvar MIN_RATE = 0.01;\nvar MAX_RATE = 0.9;\nvar DEFAULT_RATE = 0.3;\n\nvar MousewheelZoom = Class.extend({\n init: function(chart, options) {\n\n this.chart = chart;\n this.options = deepExtend({\n rate: DEFAULT_RATE\n }, this.options, options);\n },\n\n updateRanges: function(delta, coords) {\n var this$1 = this;\n\n var lock = (this.options.lock || \"\").toLowerCase();\n var axisRanges = [];\n var axes = this.chart._plotArea.axes;\n\n for (var idx = 0; idx < axes.length; idx++) {\n var axis = axes[idx];\n var vertical = axis.options.vertical;\n\n if (!(lock === X && !vertical) && !(lock === Y && vertical) && axis.zoomRange) {\n var rate = limitValue$1(this$1.options.rate, MIN_RATE, MAX_RATE);\n var range = axis.zoomRange(-delta * rate, coords);\n\n if (range) {\n axisRanges.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n\n this.axisRanges = axisRanges;\n return toChartAxisRanges(axisRanges);\n },\n\n zoom: function() {\n var axisRanges = this.axisRanges;\n var plotArea = this.chart._plotArea;\n\n if (axisRanges && axisRanges.length && plotArea.updateAxisOptions) {\n for (var idx = 0; idx < axisRanges.length; idx++) {\n var axisRange = axisRanges[idx];\n plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n\n destroy: function() {\n delete this.chart;\n }\n});\n\nvar LegendLayout = ChartElement.extend({\n init: function(options, chartService) {\n ChartElement.fn.init.call(this, options);\n\n this.chartService = chartService;\n },\n\n render: function() {\n var ref = this;\n var children = ref.children;\n var options = ref.options;\n var vertical = options.vertical;\n\n this.visual = new drawing.Layout(null, {\n spacing: vertical ? 0 : options.spacing,\n lineSpacing: vertical ? options.spacing : 0,\n orientation: vertical ? \"vertical\" : \"horizontal\",\n reverse: options.rtl,\n alignItems: vertical ? \"start\" : \"center\"\n });\n\n for (var idx = 0; idx < children.length; idx++) {\n var legendItem = children[idx];\n legendItem.reflow(new Box());\n legendItem.renderVisual();\n }\n },\n\n reflow: function(box) {\n this.visual.rect(box.toRect());\n this.visual.reflow();\n var bbox = this.visual.clippedBBox();\n\n if (bbox) {\n this.box = dataviz.rectToBox(bbox);\n } else {\n this.box = new Box();\n }\n },\n\n renderVisual: function() {\n this.addVisual();\n },\n\n createVisual: function() {}\n});\n\nvar LegendItem = BoxElement.extend({\n init: function(options) {\n BoxElement.fn.init.call(this, options);\n\n this.createContainer();\n if (!options.rtl) {\n this.createMarker();\n this.createLabel();\n } else {\n this.createLabel();\n this.createMarker();\n }\n },\n\n createContainer: function() {\n this.container = new dataviz.FloatElement({ vertical: false, wrap: false, align: CENTER, spacing: this.options.spacing });\n this.append(this.container);\n },\n\n createMarker: function() {\n this.container.append(new ShapeElement(this.markerOptions()));\n },\n\n markerOptions: function() {\n var options = this.options;\n var markerColor = options.markerColor;\n return deepExtend({}, options.markers, {\n background: markerColor,\n border: {\n color: markerColor\n }\n });\n },\n\n createLabel: function() {\n var options = this.options;\n var labelOptions = deepExtend({}, options.labels);\n\n this.container.append(new TextBox(options.text, labelOptions));\n },\n\n renderComplete: function() {\n BoxElement.fn.renderComplete.call(this);\n\n var cursor = this.options.cursor || {};\n var eventSink = this._itemOverlay = Path.fromRect(this.container.box.toRect(), {\n fill: {\n color: WHITE,\n opacity: 0\n },\n stroke: null,\n cursor: cursor.style || cursor\n });\n\n this.appendVisual(eventSink);\n },\n\n click: function(widget, e) {\n var args = this.eventArgs(e);\n\n if (!widget.trigger(LEGEND_ITEM_CLICK, args) && e && e.type === 'contextmenu') {\n e.preventDefault();\n }\n },\n\n over: function(widget, e) {\n var args = this.eventArgs(e);\n\n if (!widget.trigger(LEGEND_ITEM_HOVER, args)) {\n widget._legendItemHover(args.seriesIndex, args.pointIndex);\n }\n\n // Don't trigger point hover for legend items\n return true;\n },\n\n out: function(widget, e) {\n widget._unsetActivePoint();\n\n widget.trigger(LEGEND_ITEM_LEAVE, this.eventArgs(e));\n },\n\n eventArgs: function(e) {\n var options = this.options;\n\n return {\n element: eventElement(e),\n text: options.text,\n series: options.series,\n seriesIndex: options.series.index,\n pointIndex: options.pointIndex\n };\n },\n\n renderVisual: function() {\n var this$1 = this;\n\n var options = this.options;\n var customVisual = options.visual;\n\n if (customVisual) {\n this.visual = customVisual({\n active: options.active,\n series: options.series,\n sender: this.getSender(),\n pointIndex: options.pointIndex,\n options: {\n markers: this.markerOptions(),\n labels: options.labels\n },\n createVisual: function () {\n this$1.createVisual();\n this$1.renderChildren();\n this$1.renderComplete();\n\n var defaultVisual = this$1.visual;\n\n delete this$1.visual;\n\n return defaultVisual;\n }\n });\n this.addVisual();\n } else {\n BoxElement.fn.renderVisual.call(this);\n }\n }\n});\n\nvar HORIZONTAL = \"horizontal\";\nvar POINTER = \"pointer\";\nvar CUSTOM = \"custom\";\n\nvar Legend = ChartElement.extend({\n init: function(options, chartService) {\n if (chartService === void 0) { chartService = {}; }\n\n ChartElement.fn.init.call(this, options);\n\n this.chartService = chartService;\n\n if (!inArray(this.options.position, [ TOP, RIGHT, BOTTOM, LEFT, CUSTOM ])) {\n this.options.position = RIGHT;\n }\n\n this.createContainers();\n\n this.createLegendTitle(options.title);\n\n this.createItems();\n },\n\n createContainers: function() {\n var options = this.options;\n var position = options.position;\n var userAlign = options.align;\n var align = position;\n var vAlign = CENTER;\n\n if (position === CUSTOM) {\n align = LEFT;\n } else if (inArray(position, [ TOP, BOTTOM ])) {\n if (userAlign === \"start\") {\n align = LEFT;\n } else if (userAlign === \"end\") {\n align = RIGHT;\n } else {\n align = CENTER;\n }\n vAlign = position;\n } else if (userAlign) {\n if (userAlign === \"start\") {\n vAlign = TOP;\n } else if (userAlign === \"end\") {\n vAlign = BOTTOM;\n }\n }\n\n this.container = new BoxElement({\n margin: options.margin,\n padding: options.padding,\n background: options.background,\n border: options.border,\n vAlign: vAlign,\n align: align,\n zIndex: options.zIndex,\n shrinkToFit: true\n });\n\n if (this.hasTitle()) {\n this.itemsContainer = new BoxElement({\n vAlign: vAlign,\n align: align,\n zIndex: options.zIndex,\n shrinkToFit: true\n });\n } else {\n this.itemsContainer = this.container;\n }\n\n this.append(this.container);\n },\n\n createItems: function() {\n var chartService = this.getService();\n var options = this.options;\n var vertical = this.isVertical();\n var innerElement = new LegendLayout({\n vertical: vertical,\n spacing: options.spacing,\n rtl: chartService.rtl\n }, chartService);\n var items = options.items;\n\n if (options.reverse) {\n items = items.slice(0).reverse();\n }\n\n var count = items.length;\n\n for (var i = 0; i < count; i++) {\n var item = items[i];\n\n innerElement.append(new LegendItem(deepExtend({}, {\n markers: options.markers,\n labels: options.labels,\n rtl: chartService.rtl\n }, options.item, item)));\n }\n\n innerElement.render();\n this.itemsContainer.append(innerElement);\n },\n\n isVertical: function() {\n var ref = this.options;\n var orientation = ref.orientation;\n var position = ref.position;\n var vertical = (position === CUSTOM && orientation !== HORIZONTAL) ||\n (defined(orientation) ? orientation !== HORIZONTAL : inArray(position, [ LEFT, RIGHT ]));\n\n return vertical;\n },\n\n hasItems: function() {\n return this.container.children[0].children.length > 0;\n },\n\n reflow: function(targetBox) {\n var options = this.options;\n var legendBox = targetBox.clone();\n\n if (!this.hasItems()) {\n this.box = legendBox;\n return;\n }\n\n if (options.position === CUSTOM) {\n this.containerCustomReflow(legendBox);\n this.box = legendBox;\n } else {\n this.containerReflow(legendBox);\n }\n\n if (this.hasTitle()) {\n this.title.reflow(new Box(this.container.box.x1, this.title.box.y1, this.container.box.x2, this.title.box.y2));\n }\n },\n\n containerReflow: function(targetBox) {\n var ref = this;\n var options = ref.options;\n var container = ref.container;\n var position = options.position;\n var width = options.width;\n var height = options.height;\n var pos = position === TOP || position === BOTTOM ? X : Y;\n var vertical = this.isVertical();\n var alignTarget = targetBox.clone();\n var containerBox = targetBox.clone();\n\n if (position === LEFT || position === RIGHT) {\n containerBox.y1 = alignTarget.y1 = 0;\n }\n\n if (vertical && height) {\n containerBox.y2 = containerBox.y1 + height;\n containerBox.align(alignTarget, Y, container.options.vAlign);\n } else if (!vertical && width) {\n containerBox.x2 = containerBox.x1 + width;\n containerBox.align(alignTarget, X, container.options.align);\n }\n\n container.reflow(containerBox);\n containerBox = container.box;\n\n var box = containerBox.clone();\n\n if (options.offsetX || options.offsetY) {\n containerBox.translate(options.offsetX, options.offsetY);\n container.reflow(containerBox);\n }\n\n box[pos + 1] = targetBox[pos + 1];\n box[pos + 2] = targetBox[pos + 2];\n\n this.box = box;\n },\n\n containerCustomReflow: function(targetBox) {\n var ref = this;\n var options = ref.options;\n var container = ref.container;\n var offsetX = options.offsetX;\n var offsetY = options.offsetY;\n var width = options.width;\n var height = options.height;\n var vertical = this.isVertical();\n var containerBox = targetBox.clone();\n\n if (vertical && height) {\n containerBox.y2 = containerBox.y1 + height;\n } else if (!vertical && width) {\n containerBox.x2 = containerBox.x1 + width;\n }\n container.reflow(containerBox);\n containerBox = container.box;\n\n container.reflow(new Box(\n offsetX, offsetY,\n offsetX + containerBox.width(), offsetY + containerBox.height()\n ));\n },\n\n renderVisual: function() {\n if (this.hasItems()) {\n ChartElement.fn.renderVisual.call(this);\n }\n },\n\n createLegendTitle: function(title) {\n var titleOptions = deepExtend({}, {\n color: BLACK,\n position: TOP,\n align: CENTER\n }, title);\n var text = titleOptions.text;\n\n if (!title || title.visible === false) {\n return;\n }\n\n if (defined(titleOptions) && titleOptions.visible) {\n var labelTemplate = getTemplate(titleOptions);\n if (labelTemplate) {\n text = labelTemplate({ text: text });\n } else if (titleOptions.format) {\n text = this.chartService.format.auto(titleOptions.format, text);\n }\n }\n\n this.title = new TextBox(text, titleOptions);\n\n this.createTitleLayout();\n\n this.appendTitleLayoutContent();\n },\n\n createTitleLayout: function() {\n this.layout = new dataviz.FloatElement({\n vertical: true,\n wrap: false\n });\n\n this.container.append(this.layout);\n },\n\n hasTitle: function() {\n return Boolean(this.options.title && this.options.title.visible !== false);\n },\n\n appendTitleLayoutContent: function() {\n var options = this.options;\n\n if (options.title.position === BOTTOM) {\n this.layout.append(this.itemsContainer);\n this.layout.append(this.title);\n } else {\n this.layout.append(this.title);\n this.layout.append(this.itemsContainer);\n }\n }\n});\n\nsetDefaultOptions(Legend, {\n position: RIGHT,\n items: [],\n offsetX: 0,\n offsetY: 0,\n margin: getSpacing(5),\n padding: getSpacing(5),\n border: {\n color: BLACK,\n width: 0\n },\n item: {\n cursor: POINTER,\n spacing: 6\n },\n spacing: 6,\n background: \"\",\n zIndex: 1,\n markers: {\n border: {\n width: 0\n },\n width: 15,\n height: 3,\n type: \"rect\",\n align: LEFT,\n vAlign: CENTER\n }\n});\n\nvar PlotAreaFactory = Class.extend({\n init: function() {\n\n this._registry = [];\n },\n\n register: function(type, seriesTypes) {\n this._registry.push({\n type: type,\n seriesTypes: seriesTypes\n });\n },\n\n create: function(srcSeries, options, chartService) {\n var registry = this._registry;\n var match = registry[0];\n var series;\n\n for (var idx = 0; idx < registry.length; idx++) {\n var entry = registry[idx];\n series = filterSeriesByType(srcSeries, entry.seriesTypes);\n\n if (series.length > 0) {\n match = entry;\n break;\n }\n }\n\n return new match.type(series, options, chartService);\n }\n});\n\nPlotAreaFactory.current = new PlotAreaFactory();\n\nvar ZOOM_ACCELERATION = 3;\nvar SELECTOR_HEIGHT_ADJUST = 0.1;\n\nfunction createDiv(className) {\n var element = document.createElement(\"div\");\n if (className) {\n element.className = className;\n }\n\n return element;\n}\n\nfunction closestHandle(element) {\n var current = element;\n while (current && !hasClasses(current, \"k-handle\")) {\n current = current.parentNode;\n }\n\n return current;\n}\n\nvar Selection = Class.extend({\n init: function(chart, categoryAxis, options, observer) {\n\n var chartElement = chart.element;\n\n this.options = deepExtend({}, this.options, options);\n this.chart = chart;\n this.observer = observer;\n this.chartElement = chartElement;\n this.categoryAxis = categoryAxis;\n this._dateAxis = this.categoryAxis instanceof dataviz.DateCategoryAxis;\n\n this.initOptions();\n\n this.visible = this.options.visible && chartElement.offsetHeight;\n\n if (this.visible) {\n this.createElements();\n\n this.set(this._index(this.options.from), this._index(this.options.to));\n\n this.bindEvents();\n }\n },\n\n onPane: function(pane) {\n return this.categoryAxis.pane === pane;\n },\n\n createElements: function() {\n var options = this.options;\n var wrapper = this.wrapper = createDiv(\"k-selector\");\n elementStyles(wrapper, {\n top: options.offset.top,\n left: options.offset.left,\n width: options.width,\n height: options.height,\n direction: 'ltr'\n });\n var selection = this.selection = createDiv(\"k-selection\");\n this.leftMask = createDiv(\"k-mask\");\n this.rightMask = createDiv(\"k-mask\");\n\n wrapper.appendChild(this.leftMask);\n wrapper.appendChild(this.rightMask);\n wrapper.appendChild(selection);\n\n selection.appendChild(createDiv(\"k-selection-bg\"));\n\n var leftHandle = this.leftHandle = createDiv(\"k-handle k-left-handle\");\n var rightHandle = this.rightHandle = createDiv(\"k-handle k-right-handle\");\n leftHandle.appendChild(createDiv());\n rightHandle.appendChild(createDiv());\n\n selection.appendChild(leftHandle);\n selection.appendChild(rightHandle);\n\n this.chartElement.appendChild(wrapper);\n var selectionStyles = elementStyles(selection, [ \"borderLeftWidth\", \"borderRightWidth\", \"height\" ]);\n var leftHandleHeight = elementStyles(leftHandle, \"height\").height;\n var rightHandleHeight = elementStyles(rightHandle, \"height\").height;\n\n options.selection = {\n border: {\n left: selectionStyles.borderLeftWidth,\n right: selectionStyles.borderRightWidth\n }\n };\n\n elementStyles(leftHandle, {\n top: (selectionStyles.height - leftHandleHeight) / 2\n });\n\n elementStyles(rightHandle, {\n top: (selectionStyles.height - rightHandleHeight) / 2\n });\n\n wrapper.style.cssText = wrapper.style.cssText;\n },\n\n bindEvents: function() {\n if (this.options.mousewheel !== false) {\n this._mousewheelHandler = this._mousewheel.bind(this);\n var obj;\n bindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n }\n\n this._domEvents = services.DomEventsBuilder.create(this.wrapper, {\n stopPropagation: true, // applicable for the jQuery UserEvents\n start: this._start.bind(this),\n move: this._move.bind(this),\n end: this._end.bind(this),\n tap: this._tap.bind(this),\n press: this._press.bind(this),\n gesturestart: this._gesturestart.bind(this),\n gesturechange: this._gesturechange.bind(this),\n gestureend: this._gestureend.bind(this)\n });\n },\n\n initOptions: function() {\n var ref = this;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var box = categoryAxis.pane.chartsBox();\n var intlService = this.chart.chartService.intl;\n\n if (this._dateAxis) {\n deepExtend(options, {\n min: parseDate(intlService, options.min),\n max: parseDate(intlService, options.max),\n from: parseDate(intlService, options.from),\n to: parseDate(intlService, options.to)\n });\n }\n\n var ref$1 = elementStyles(this.chartElement, [ \"paddingLeft\", \"paddingTop\" ]);\n var paddingLeft = ref$1.paddingLeft;\n var paddingTop = ref$1.paddingTop;\n\n this.options = deepExtend({}, {\n width: box.width(),\n height: box.height() + SELECTOR_HEIGHT_ADJUST, //workaround for sub-pixel hover on the paths in chrome\n padding: {\n left: paddingLeft,\n top: paddingTop\n },\n offset: {\n left: box.x1 + paddingLeft,\n top: box.y1 + paddingTop\n },\n from: options.min,\n to: options.max\n }, options);\n },\n\n destroy: function() {\n if (this._domEvents) {\n this._domEvents.destroy();\n delete this._domEvents;\n }\n\n clearTimeout(this._mwTimeout);\n this._state = null;\n\n if (this.wrapper) {\n if (this._mousewheelHandler) {\n var obj;\n unbindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n this._mousewheelHandler = null;\n }\n this.chartElement.removeChild(this.wrapper);\n this.wrapper = null;\n }\n },\n\n _rangeEventArgs: function(range) {\n\n return {\n axis: this.categoryAxis.options,\n from: this._value(range.from),\n to: this._value(range.to)\n };\n },\n\n _start: function(e) {\n var options = this.options;\n var target = eventElement(e);\n\n if (this._state || !target) {\n return;\n }\n\n this.chart._unsetActivePoint();\n this._state = {\n moveTarget: closestHandle(target) || target,\n startLocation: e.x ? e.x.location : 0,\n range: {\n from: this._index(options.from),\n to: this._index(options.to)\n }\n };\n\n var args = this._rangeEventArgs({\n from: this._index(options.from),\n to: this._index(options.to)\n });\n\n if (this.trigger(SELECT_START, args)) {\n this._state = null;\n }\n },\n\n _press: function(e) {\n var handle;\n if (this._state) {\n handle = this._state.moveTarget;\n } else {\n handle = closestHandle(eventElement(e));\n }\n if (handle) {\n dataviz.addClass(handle, \"k-handle-active\");\n }\n },\n\n _move: function(e) {\n if (!this._state) {\n return;\n }\n\n var ref = this;\n var state = ref._state;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var range = state.range;\n var target = state.moveTarget;\n var reverse = categoryAxis.options.reverse;\n var from = this._index(options.from);\n var to = this._index(options.to);\n var min = this._index(options.min);\n var max = this._index(options.max);\n var delta = state.startLocation - e.x.location;\n var oldRange = { from: range.from, to: range.to };\n var span = range.to - range.from;\n var scale = elementStyles(this.wrapper, \"width\").width / (categoryAxis.categoriesCount() - 1);\n var offset = Math.round(delta / scale) * (reverse ? -1 : 1);\n\n if (!target) {\n return;\n }\n\n var leftHandle = hasClasses(target, \"k-left-handle\");\n var rightHandle = hasClasses(target, \"k-right-handle\");\n\n if (hasClasses(target, \"k-selection k-selection-bg\")) {\n range.from = Math.min(\n Math.max(min, from - offset),\n max - span\n );\n range.to = Math.min(\n range.from + span,\n max\n );\n } else if ((leftHandle && !reverse) || (rightHandle && reverse)) {\n range.from = Math.min(\n Math.max(min, from - offset),\n max - 1\n );\n range.to = Math.max(range.from + 1, range.to);\n } else if ((leftHandle && reverse) || (rightHandle && !reverse)) {\n range.to = Math.min(\n Math.max(min + 1, to - offset),\n max\n );\n range.from = Math.min(range.to - 1, range.from);\n }\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.move(range.from, range.to);\n this.trigger(SELECT, this._rangeEventArgs(range));\n }\n },\n\n _end: function() {\n if (this._state) {\n var moveTarget = this._state.moveTarget;\n if (moveTarget) {\n dataviz.removeClass(moveTarget, \"k-handle-active\");\n }\n\n var range = this._state.range;\n this.set(range.from, range.to);\n this.trigger(SELECT_END, this._rangeEventArgs(range));\n\n delete this._state;\n }\n },\n\n _tap: function(e) {\n var ref = this;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var coords = this.chart._eventCoordinates(e);\n var categoryIx = categoryAxis.pointCategoryIndex(new Point(coords.x, categoryAxis.box.y1));\n var from = this._index(options.from);\n var to = this._index(options.to);\n var min = this._index(options.min);\n var max = this._index(options.max);\n var span = to - from;\n var mid = from + span / 2;\n var range = {};\n var rightClick = e.event.which === 3;\n var offset = Math.round(mid - categoryIx);\n\n if (this._state || rightClick) {\n return;\n }\n\n this.chart._unsetActivePoint();\n\n if (!categoryAxis.options.justified) {\n offset--;\n }\n\n range.from = Math.min(\n Math.max(min, from - offset),\n max - span\n );\n\n range.to = Math.min(range.from + span, max);\n\n this._start(e);\n if (this._state) {\n this._state.range = range;\n this.trigger(SELECT, this._rangeEventArgs(range));\n this._end();\n }\n },\n\n _mousewheel: function(e) {\n var this$1 = this;\n\n var delta = dataviz.mousewheelDelta(e);\n\n this._start({ target: this.selection });\n\n if (this._state) {\n var range = this._state.range;\n\n e.preventDefault();\n e.stopPropagation();\n\n if (Math.abs(delta) > 1) {\n delta *= ZOOM_ACCELERATION;\n }\n\n if (this.options.mousewheel.reverse) {\n delta *= -1;\n }\n\n if (this.expand(delta)) {\n this.trigger(SELECT, {\n axis: this.categoryAxis.options,\n delta: delta,\n originalEvent: e,\n from: this._value(range.from),\n to: this._value(range.to)\n });\n }\n\n if (this._mwTimeout) {\n clearTimeout(this._mwTimeout);\n }\n\n this._mwTimeout = setTimeout(function () {\n this$1._end();\n }, MOUSEWHEEL_DELAY);\n }\n },\n\n _gesturestart: function(e) {\n var options = this.options;\n\n this._state = {\n range: {\n from: this._index(options.from),\n to: this._index(options.to)\n }\n };\n var args = this._rangeEventArgs(this._state.range);\n\n if (this.trigger(SELECT_START, args)) {\n this._state = null;\n } else {\n e.preventDefault();\n }\n },\n\n _gestureend: function() {\n if (this._state) {\n this.trigger(SELECT_END, this._rangeEventArgs(this._state.range));\n delete this._state;\n }\n },\n\n _gesturechange: function(e) {\n var ref = this;\n var chart = ref.chart;\n var state = ref._state;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var range = state.range;\n var p0 = chart._toModelCoordinates(e.touches[0].x.location).x;\n var p1 = chart._toModelCoordinates(e.touches[1].x.location).x;\n var left = Math.min(p0, p1);\n var right = Math.max(p0, p1);\n\n e.preventDefault();\n\n range.from = categoryAxis.pointCategoryIndex(new Point(left)) || options.min;\n\n range.to = categoryAxis.pointCategoryIndex(new Point(right)) || options.max;\n\n this.move(range.from, range.to);\n\n this.trigger(SELECT, this._rangeEventArgs(range));\n },\n\n _index: function(value) {\n var index = value;\n\n if (value instanceof Date) {\n index = this.categoryAxis.categoryIndex(value);\n }\n\n return index;\n },\n\n _value: function(index) {\n var value = index;\n if (this._dateAxis) {\n value = this.categoryAxis.categoryAt(index);\n if (value > this.options.max) {\n value = this.options.max;\n }\n }\n\n return value;\n },\n\n _slot: function(value) {\n var categoryAxis = this.categoryAxis;\n var index = this._index(value);\n\n return categoryAxis.getSlot(index, index, true);\n },\n\n move: function(from, to) {\n var options = this.options;\n var reverse = this.categoryAxis.options.reverse;\n var offset = options.offset;\n var padding = options.padding;\n var border = options.selection.border;\n var left = reverse ? to : from;\n var right = reverse ? from : to;\n var edge = 'x' + (reverse ? 2 : 1);\n\n var box = this._slot(left);\n var leftMaskWidth = round(box[edge] - offset.left + padding.left);\n\n elementStyles(this.leftMask, {\n width: leftMaskWidth\n });\n elementStyles(this.selection, {\n left: leftMaskWidth\n });\n\n box = this._slot(right);\n\n var rightMaskWidth = round(options.width - (box[edge] - offset.left + padding.left));\n elementStyles(this.rightMask, {\n width: rightMaskWidth\n });\n\n var distance = options.width - rightMaskWidth;\n if (distance !== options.width) {\n distance += border.right;\n }\n\n elementStyles(this.rightMask, {\n left: distance\n });\n elementStyles(this.selection, {\n width: Math.max(options.width - (leftMaskWidth + rightMaskWidth) - border.right, 0)\n });\n },\n\n set: function(from, to) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var fromValue = limitValue(this._index(from), min, max);\n var toValue = limitValue(this._index(to), fromValue + 1, max);\n\n if (options.visible) {\n this.move(fromValue, toValue);\n }\n\n options.from = this._value(fromValue);\n options.to = this._value(toValue);\n },\n\n expand: function(delta) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var zDir = options.mousewheel.zoom;\n var from = this._index(options.from);\n var to = this._index(options.to);\n var range = { from: from, to: to };\n var oldRange = deepExtend({}, range);\n\n if (this._state) {\n range = this._state.range;\n }\n\n if (zDir !== RIGHT) {\n range.from = limitValue(\n limitValue(from - delta, 0, to - 1),\n min, max\n );\n }\n\n if (zDir !== LEFT) {\n range.to = limitValue(\n limitValue(to + delta, range.from + 1, max),\n min,\n max\n );\n }\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.set(range.from, range.to);\n return true;\n }\n },\n\n zoom: function(delta, coords) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var from = this._index(options.from);\n var to = this._index(options.to);\n var range = { from: from, to: to };\n var oldRange = deepExtend({}, range);\n\n var ref = this.categoryAxis.options;\n var reverse = ref.reverse;\n var origin = X + (reverse ? '2' : '1');\n var lineBox = this.categoryAxis.lineBox();\n var relative = Math.abs(lineBox[origin] - coords[X]);\n var size = lineBox.width();\n var position = round(relative / size, 2);\n var minDelta = round(position * delta);\n var maxDelta = round((1 - position) * delta);\n\n if (this._state) {\n range = this._state.range;\n }\n\n range.from = limitValue(\n limitValue(from - minDelta, 0, to - 1),\n min, max\n );\n\n range.to = limitValue(\n limitValue(to + maxDelta, range.from + 1, max),\n min,\n max\n );\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.set(range.from, range.to);\n return true;\n }\n },\n\n trigger: function(name, args) {\n return (this.observer || this.chart).trigger(name, args);\n }\n});\n\nsetDefaultOptions(Selection, {\n visible: true,\n mousewheel: {\n zoom: \"both\"\n },\n min: MIN_VALUE,\n max: MAX_VALUE\n});\n\nvar Tooltip = BaseTooltip.extend({\n show: function(point) {\n if (!point || !point.tooltipAnchor || (this._current && this._current === point)) {\n return;\n }\n\n var options = deepExtend({}, this.options, point.options.tooltip);\n var anchor = point.tooltipAnchor();\n\n if (anchor) {\n this._current = point;\n BaseTooltip.fn.show.call(this, {\n point: point,\n anchor: anchor\n }, options, point);\n } else {\n this.hide();\n }\n },\n\n hide: function() {\n delete this._current;\n BaseTooltip.fn.hide.call(this);\n }\n});\n\nvar SharedTooltip = BaseTooltip.extend({\n init: function(plotArea, options) {\n BaseTooltip.fn.init.call(this, plotArea.chartService, options);\n\n this.plotArea = plotArea;\n this.formatService = plotArea.chartService.format;\n },\n\n showAt: function(points, coords) {\n var tooltipPoints = grep(points, function(point) {\n var tooltip = point.series.tooltip;\n var excluded = tooltip && tooltip.visible === false;\n\n return !excluded;\n });\n\n if (tooltipPoints.length > 0) {\n var point = tooltipPoints[0];\n var slot = this.plotArea.categoryAxis.getSlot(point.categoryIx);\n\n var anchor = coords ? this._slotAnchor(coords, slot) : this._defaultAnchor(point, slot);\n\n this.show({\n anchor: anchor,\n shared: true,\n points: points,\n category: point.category,\n categoryText: this.formatService.auto(this.options.categoryFormat, point.category),\n series: this.plotArea.series\n }, this.options);\n }\n },\n\n _slotAnchor: function(point, slot) {\n var axis = this.plotArea.categoryAxis;\n var align = {\n horizontal: \"left\",\n vertical: \"center\"\n };\n\n if (!axis.options.vertical) {\n point.x = slot.center().x;\n }\n\n return {\n point: point,\n align: align\n };\n },\n\n _defaultAnchor: function(point, slot) {\n var box = point.owner.pane.chartsBox();\n var vertical = this.plotArea.categoryAxis.options.vertical;\n var center = box.center();\n var slotCenter = slot.center();\n var align = {\n horizontal: \"center\",\n vertical: \"center\"\n };\n\n var centerPoint;\n if (vertical) {\n centerPoint = new Point(center.x, slotCenter.y);\n } else {\n centerPoint = new Point(slotCenter.x, center.y);\n }\n\n return {\n point: centerPoint,\n align: align\n };\n }\n});\n\nsetDefaultOptions(SharedTooltip, {\n categoryFormat: '{0:d}'\n});\n\nvar BarChartAnimation = Animation.extend({\n setup: function() {\n var ref = this;\n var element = ref.element;\n var options = ref.options;\n var bbox = element.bbox();\n\n if (bbox) {\n this.origin = options.origin;\n var axis = options.vertical ? Y : X;\n\n var fromScale = this.fromScale = new GeometryPoint(1, 1);\n fromScale[axis] = START_SCALE;\n\n element.transform(transform()\n .scale(fromScale.x, fromScale.y)\n );\n } else {\n this.abort();\n }\n },\n\n step: function(pos) {\n var scaleX = dataviz.interpolateValue(this.fromScale.x, 1, pos);\n var scaleY = dataviz.interpolateValue(this.fromScale.y, 1, pos);\n\n this.element.transform(transform()\n .scale(scaleX, scaleY, this.origin)\n );\n },\n\n abort: function() {\n Animation.fn.abort.call(this);\n this.element.transform(null);\n }\n});\n\nsetDefaultOptions(BarChartAnimation, {\n duration: INITIAL_ANIMATION_DURATION\n});\n\nAnimationFactory.current.register(BAR, BarChartAnimation);\n\nvar BubbleAnimation = Animation.extend({\n setup: function() {\n var center = this.center = this.element.bbox().center();\n this.element.transform(transform()\n .scale(START_SCALE, START_SCALE, center)\n );\n },\n\n step: function(pos) {\n this.element.transform(transform()\n .scale(pos, pos, this.center)\n );\n }\n});\n\nsetDefaultOptions(BubbleAnimation, {\n easing: \"easeOutElastic\"\n});\n\nAnimationFactory.current.register(BUBBLE, BubbleAnimation);\n\nvar FadeInAnimation = Animation.extend({\n setup: function() {\n this.fadeTo = this.element.opacity();\n this.element.opacity(0);\n },\n\n step: function(pos) {\n this.element.opacity(pos * this.fadeTo);\n }\n});\n\nsetDefaultOptions(FadeInAnimation, {\n duration: 200,\n easing: \"linear\"\n});\n\nAnimationFactory.current.register(FADEIN, FadeInAnimation);\n\nvar PieAnimation = Animation.extend({\n setup: function() {\n this.element.transform(transform()\n .scale(START_SCALE, START_SCALE, this.options.center)\n );\n },\n\n step: function(pos) {\n this.element.transform(transform()\n .scale(pos, pos, this.options.center)\n );\n }\n});\n\nsetDefaultOptions(PieAnimation, {\n easing: \"easeOutElastic\",\n duration: INITIAL_ANIMATION_DURATION\n});\n\nAnimationFactory.current.register(PIE, PieAnimation);\n\nvar ScatterLineChart = ScatterChart.extend({\n render: function() {\n ScatterChart.fn.render.call(this);\n\n this.renderSegments();\n },\n\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = currentSeries.style;\n var pointType;\n\n if (style === SMOOTH) {\n pointType = SplineSegment;\n } else {\n pointType = LineSegment;\n }\n\n return new pointType(linePoints, currentSeries, seriesIx);\n },\n\n animationPoints: function() {\n var points = ScatterChart.fn.animationPoints.call(this);\n return points.concat(this._segments);\n },\n\n createMissingValue: function(value, missingValues) {\n if (missingValues === ZERO) {\n var missingValue = {\n x: value.x,\n y: value.y\n };\n if (!hasValue(missingValue.x)) {\n missingValue.x = 0;\n }\n if (!hasValue(missingValue.y)) {\n missingValue.y = 0;\n }\n return missingValue;\n }\n }\n});\n\ndeepExtend(ScatterLineChart.prototype, LineChartMixin);\n\nvar XYPlotArea = PlotAreaBase.extend({\n initFields: function() {\n this.namedXAxes = {};\n this.namedYAxes = {};\n\n this.xAxisRangeTracker = new AxisGroupRangeTracker();\n this.yAxisRangeTracker = new AxisGroupRangeTracker();\n },\n\n render: function(panes) {\n var this$1 = this;\n if (panes === void 0) { panes = this.panes; }\n\n var seriesByPane = this.groupSeriesByPane();\n\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n this$1.addToLegend(paneSeries);\n var filteredSeries = this$1.filterVisibleSeries(paneSeries);\n\n if (!filteredSeries) {\n continue;\n }\n\n this$1.createScatterChart(\n filterSeriesByType(filteredSeries, SCATTER),\n pane\n );\n\n this$1.createScatterLineChart(\n filterSeriesByType(filteredSeries, SCATTER_LINE),\n pane\n );\n\n this$1.createBubbleChart(\n filterSeriesByType(filteredSeries, BUBBLE),\n pane\n );\n }\n\n this.createAxes(panes);\n },\n\n appendChart: function(chart, pane) {\n this.xAxisRangeTracker.update(chart.xAxisRanges);\n this.yAxisRangeTracker.update(chart.yAxisRanges);\n\n PlotAreaBase.fn.appendChart.call(this, chart, pane);\n },\n\n removeAxis: function(axis) {\n var axisName = axis.options.name;\n\n PlotAreaBase.fn.removeAxis.call(this, axis);\n\n if (axis.options.vertical) {\n this.yAxisRangeTracker.reset(axisName);\n delete this.namedYAxes[axisName];\n } else {\n this.xAxisRangeTracker.reset(axisName);\n delete this.namedXAxes[axisName];\n }\n\n if (axis === this.axisX) {\n delete this.axisX;\n }\n\n if (axis === this.axisY) {\n delete this.axisY;\n }\n },\n\n seriesPaneName: function(series) {\n var options = this.options;\n var xAxisName = series.xAxis;\n var xAxisOptions = [].concat(options.xAxis);\n var xAxis = grep(xAxisOptions, function(a) { return a.name === xAxisName; })[0];\n var yAxisName = series.yAxis;\n var yAxisOptions = [].concat(options.yAxis);\n var yAxis = grep(yAxisOptions, function(a) { return a.name === yAxisName; })[0];\n var panes = options.panes || [ {} ];\n var defaultPaneName = panes[0].name || \"default\";\n var paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n\n return paneName;\n },\n\n createScatterChart: function(series, pane) {\n if (series.length > 0) {\n this.appendChart(\n new ScatterChart(this, { series: series, clip: pane.options.clip }),\n pane\n );\n }\n },\n\n createScatterLineChart: function(series, pane) {\n if (series.length > 0) {\n this.appendChart(\n new ScatterLineChart(this, { series: series, clip: pane.options.clip }),\n pane\n );\n }\n },\n\n createBubbleChart: function(series, pane) {\n if (series.length > 0) {\n this.appendChart(\n new BubbleChart(this, { series: series, clip: pane.options.clip }),\n pane\n );\n }\n },\n\n createXYAxis: function(options, vertical, axisIndex) {\n var axisName = options.name;\n var namedAxes = vertical ? this.namedYAxes : this.namedXAxes;\n var tracker = vertical ? this.yAxisRangeTracker : this.xAxisRangeTracker;\n var axisOptions = deepExtend({ reverse: !vertical && this.chartService.rtl }, options, { vertical: vertical });\n var isLog = equalsIgnoreCase(axisOptions.type, LOGARITHMIC);\n var defaultRange = tracker.query();\n var defaultAxisRange = isLog ? { min: 0.1, max: 1 } : { min: 0, max: 1 };\n var range = tracker.query(axisName) || defaultRange || defaultAxisRange;\n var typeSamples = [ axisOptions.min, axisOptions.max ];\n var series = this.series;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var seriesAxisName = currentSeries[vertical ? \"yAxis\" : \"xAxis\"];\n if ((seriesAxisName === axisOptions.name) || (axisIndex === 0 && !seriesAxisName)) {\n var firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n typeSamples.push(firstPointValue[vertical ? \"y\" : \"x\"]);\n\n break;\n }\n }\n\n if (axisIndex === 0 && defaultRange) {\n range.min = Math.min(range.min, defaultRange.min);\n range.max = Math.max(range.max, defaultRange.max);\n }\n\n var inferredDate;\n\n for (var i = 0; i < typeSamples.length; i++) {\n if (typeSamples[i] instanceof Date) {\n inferredDate = true;\n break;\n }\n }\n\n var axisType;\n if (equalsIgnoreCase(axisOptions.type, DATE) || (!axisOptions.type && inferredDate)) {\n axisType = dataviz.DateValueAxis;\n } else if (isLog) {\n axisType = dataviz.LogarithmicAxis;\n } else {\n axisType = dataviz.NumericAxis;\n }\n\n var axis = new axisType(range.min, range.max, axisOptions, this.chartService);\n axis.axisIndex = axisIndex;\n\n if (axisName) {\n if (namedAxes[axisName]) {\n throw new Error(((vertical ? \"Y\" : \"X\") + \" axis with name \" + axisName + \" is already defined\"));\n }\n namedAxes[axisName] = axis;\n }\n\n this.appendAxis(axis);\n\n return axis;\n },\n\n createAxes: function(panes) {\n var this$1 = this;\n\n var options = this.options;\n var xAxesOptions = [].concat(options.xAxis);\n var xAxes = [];\n var yAxesOptions = [].concat(options.yAxis);\n var yAxes = [];\n\n for (var idx = 0; idx < xAxesOptions.length; idx++) {\n var axisPane = this$1.findPane(xAxesOptions[idx].pane);\n if (inArray(axisPane, panes)) {\n xAxes.push(this$1.createXYAxis(xAxesOptions[idx], false, idx));\n }\n }\n\n for (var idx$1 = 0; idx$1 < yAxesOptions.length; idx$1++) {\n var axisPane$1 = this$1.findPane(yAxesOptions[idx$1].pane);\n if (inArray(axisPane$1, panes)) {\n yAxes.push(this$1.createXYAxis(yAxesOptions[idx$1], true, idx$1));\n }\n }\n\n this.axisX = this.axisX || xAxes[0];\n this.axisY = this.axisY || yAxes[0];\n },\n\n _dispatchEvent: function(chart, e, eventType) {\n var coords = chart._eventCoordinates(e);\n var point = new Point(coords.x, coords.y);\n var allAxes = this.axes;\n var length = allAxes.length;\n var xValues = [];\n var yValues = [];\n\n for (var i = 0; i < length; i++) {\n var axis = allAxes[i];\n var values = axis.options.vertical ? yValues : xValues;\n var currentValue = axis.getValue(point);\n if (currentValue !== null) {\n values.push(currentValue);\n }\n }\n\n if (xValues.length > 0 && yValues.length > 0) {\n chart.trigger(eventType, {\n element: eventElement(e),\n originalEvent: e,\n x: singleItemOrArray(xValues),\n y: singleItemOrArray(yValues)\n });\n }\n },\n\n updateAxisOptions: function(axis, options) {\n var vertical = axis.options.vertical;\n var axes = this.groupAxes(this.panes);\n var index = (vertical ? axes.y : axes.x).indexOf(axis);\n\n updateAxisOptions$1(this.options, index, vertical, options);\n updateAxisOptions$1(this.originalOptions, index, vertical, options);\n }\n});\n\nfunction updateAxisOptions$1(targetOptions, axisIndex, vertical, options) {\n var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n deepExtend(axisOptions, options);\n}\n\nsetDefaultOptions(XYPlotArea, {\n xAxis: {},\n yAxis: {}\n});\n\ndeepExtend(XYPlotArea.prototype, PlotAreaEventsMixin);\n\nvar PieSegment = ChartElement.extend({\n init: function(value, sector, options) {\n ChartElement.fn.init.call(this, options);\n\n this.value = value;\n this.sector = sector;\n },\n\n render: function() {\n var labels = this.options.labels;\n var chartService = this.owner.chartService;\n var labelText = this.value;\n\n if (this._rendered || this.visible === false) {\n return;\n }\n this._rendered = true;\n\n var labelTemplate = getTemplate(labels);\n var pointData = this.pointData();\n\n if (labelTemplate) {\n labelText = labelTemplate(pointData);\n } else if (labels.format) {\n labelText = chartService.format.auto(labels.format, labelText);\n }\n\n if (labels.visible && (labelText || labelText === 0)) {\n if (labels.position === CENTER || labels.position === INSIDE_END) {\n if (!labels.color) {\n labels.color = dataviz.autoTextColor(this.options.color);\n }\n if (!labels.background) {\n labels.background = this.options.color;\n }\n } else {\n var themeLabels = chartService.theme.seriesDefaults.labels;\n labels.color = labels.color || themeLabels.color;\n labels.background = labels.background || themeLabels.background;\n }\n\n this.label = new TextBox(labelText, deepExtend({}, labels, {\n align: CENTER,\n vAlign: \"\",\n animation: {\n type: FADEIN,\n delay: this.animationDelay\n }\n }), pointData);\n\n this.append(this.label);\n }\n },\n\n reflow: function(targetBox) {\n this.render();\n this.box = targetBox;\n this.reflowLabel();\n },\n\n reflowLabel: function() {\n var ref = this;\n var labelsOptions = ref.options.labels;\n var label = ref.label;\n var sector = this.sector.clone();\n var labelsDistance = labelsOptions.distance;\n var angle = sector.middle();\n\n if (label) {\n var labelHeight = label.box.height();\n var labelWidth = label.box.width();\n var lp;\n\n if (labelsOptions.position === CENTER) {\n sector.radius = Math.abs((sector.radius - labelHeight) / 2) + labelHeight;\n lp = sector.point(angle);\n label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else if (labelsOptions.position === INSIDE_END) {\n sector.radius = sector.radius - labelHeight / 2;\n lp = sector.point(angle);\n label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else {\n var x1;\n lp = sector.clone().expand(labelsDistance).point(angle);\n if (lp.x >= sector.center.x) {\n x1 = lp.x + labelWidth;\n label.orientation = RIGHT;\n } else {\n x1 = lp.x - labelWidth;\n label.orientation = LEFT;\n }\n label.reflow(new Box(x1, lp.y - labelHeight, lp.x, lp.y));\n }\n }\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var ref = this;\n var sector = ref.sector;\n var options = ref.options;\n\n ChartElement.fn.createVisual.call(this);\n\n if (this.value) {\n if (options.visual) {\n var startAngle = (sector.startAngle + 180) % 360;\n var visual = options.visual({\n category: this.category,\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n percentage: this.percentage,\n center: new GeometryPoint(sector.center.x, sector.center.y),\n radius: sector.radius,\n innerRadius: sector.innerRadius,\n startAngle: startAngle,\n endAngle: startAngle + sector.angle,\n options: options,\n sender: this.getSender(),\n createVisual: function () {\n var group = new Group();\n this$1.createSegmentVisual(group);\n\n return group;\n }\n });\n\n if (visual) {\n this.visual.append(visual);\n }\n } else {\n this.createSegmentVisual(this.visual);\n }\n }\n },\n\n createSegmentVisual: function(group) {\n var ref = this;\n var sector = ref.sector;\n var options = ref.options;\n var borderOptions = options.border || {};\n var border = borderOptions.width > 0 ? {\n stroke: {\n color: borderOptions.color,\n width: borderOptions.width,\n opacity: borderOptions.opacity,\n dashType: borderOptions.dashType\n }\n } : {};\n var color = options.color;\n var fill = {\n color: color,\n opacity: options.opacity\n };\n var visual = this.createSegment(sector, deepExtend({\n fill: fill,\n stroke: {\n opacity: options.opacity\n },\n zIndex: options.zIndex\n }, border));\n\n group.append(visual);\n\n if (hasGradientOverlay(options)) {\n group.append(this.createGradientOverlay(visual, {\n baseColor: color,\n fallbackFill: fill\n }, deepExtend({\n center: [ sector.center.x, sector.center.y ],\n innerRadius: sector.innerRadius,\n radius: sector.radius,\n userSpace: true\n }, options.overlay)));\n }\n },\n\n createSegment: function(sector, options) {\n if (options.singleSegment) {\n return new drawing.Circle(new geometry.Circle(new GeometryPoint(sector.center.x, sector.center.y), sector.radius), options);\n }\n\n return dataviz.ShapeBuilder.current.createRing(sector, options);\n },\n\n createAnimation: function() {\n var ref = this;\n var options = ref.options;\n var center = ref.sector.center;\n\n deepExtend(options, {\n animation: {\n center: [ center.x, center.y ],\n delay: this.animationDelay\n }\n });\n\n ChartElement.fn.createAnimation.call(this);\n },\n\n createHighlight: function(options) {\n var highlight = this.options.highlight || {};\n var border = highlight.border || {};\n\n return this.createSegment(this.sector, deepExtend({}, options, {\n fill: {\n color: highlight.color,\n opacity: highlight.opacity\n },\n stroke: {\n opacity: border.opacity,\n width: border.width,\n color: border.color\n }\n }));\n },\n\n highlightVisual: function() {\n return this.visual.children[0];\n },\n\n highlightVisualArgs: function() {\n var sector = this.sector;\n\n return {\n options: this.options,\n radius: sector.radius,\n innerRadius: sector.innerRadius,\n center: new GeometryPoint(sector.center.x, sector.center.y),\n startAngle: sector.startAngle,\n endAngle: sector.angle + sector.startAngle,\n visual: this.visual\n };\n },\n\n tooltipAnchor: function() {\n var sector = this.sector.clone().expand(TOOLTIP_OFFSET);\n var midAndle = sector.middle();\n var midPoint = sector.point(midAndle);\n\n return {\n point: midPoint,\n align: tooltipAlignment(midAndle + 180)\n };\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n pointData: function() {\n return {\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n series: this.series,\n percentage: this.percentage\n };\n }\n});\n\nvar RAD_30 = round(dataviz.rad(30), DEFAULT_PRECISION);\nvar RAD_60 = round(dataviz.rad(60), DEFAULT_PRECISION);\n\nfunction tooltipAlignment(angle) {\n var radians = dataviz.rad(angle);\n var sine = round(Math.sin(radians), DEFAULT_PRECISION);\n var cosine = round(Math.cos(radians), DEFAULT_PRECISION);\n\n var horizontal;\n if (Math.abs(sine) > RAD_60) {\n horizontal = CENTER;\n } else if (cosine < 0) {\n horizontal = RIGHT;\n } else {\n horizontal = LEFT;\n }\n\n var vertical;\n if (Math.abs(sine) < RAD_30) {\n vertical = CENTER;\n } else if (sine < 0) {\n vertical = BOTTOM;\n } else {\n vertical = TOP;\n }\n\n return {\n horizontal: horizontal,\n vertical: vertical\n };\n}\n\nsetDefaultOptions(PieSegment, {\n color: WHITE,\n overlay: {\n gradient: \"roundedBevel\"\n },\n border: {\n width: 0.5\n },\n labels: {\n visible: false,\n distance: 35,\n font: datavizConstants.DEFAULT_FONT,\n margin: getSpacing(0.5),\n align: CIRCLE,\n zIndex: 1,\n position: OUTSIDE_END\n },\n animation: {\n type: PIE\n },\n highlight: {\n visible: true,\n border: {\n width: 1\n }\n },\n visible: true\n});\n\ndeepExtend(PieSegment.prototype, PointEventsMixin);\n\nvar PieChartMixin = {\n createLegendItem: function(value, point, options) {\n var legendOptions = this.options.legend || {};\n var labelsOptions = legendOptions.labels || {};\n var inactiveItems = legendOptions.inactiveItems || {};\n var inactiveItemsLabels = inactiveItems.labels || {};\n\n if (options && options.visibleInLegend !== false) {\n var pointVisible = options.visible !== false;\n var labelTemplate = pointVisible ? getTemplate(labelsOptions) :\n getTemplate(inactiveItemsLabels) || getTemplate(labelsOptions);\n var text = options.category;\n\n if (labelTemplate) {\n text = labelTemplate({\n text: text,\n series: options.series,\n dataItem: options.dataItem,\n percentage: options.percentage,\n value: value\n });\n }\n\n var itemLabelOptions, markerColor;\n if (pointVisible) {\n itemLabelOptions = {};\n markerColor = point.color;\n } else {\n itemLabelOptions = {\n color: inactiveItemsLabels.color,\n font: inactiveItemsLabels.font\n };\n markerColor = (inactiveItems.markers || {}).color;\n }\n\n if (hasValue(text) && text !== \"\") {\n this.legendItems.push({\n active: pointVisible,\n pointIndex: options.index,\n text: text,\n series: options.series,\n markerColor: markerColor,\n labels: itemLabelOptions\n });\n }\n }\n }\n};\n\nvar PIE_SECTOR_ANIM_DELAY = 70;\n\nvar PieChart = ChartElement.extend({\n init: function(plotArea, options) {\n ChartElement.fn.init.call(this, options);\n\n this.plotArea = plotArea;\n this.chartService = plotArea.chartService;\n this.points = [];\n this.legendItems = [];\n this.render();\n },\n\n render: function() {\n this.traverseDataPoints(this.addValue.bind(this));\n },\n\n traverseDataPoints: function(callback) {\n var this$1 = this;\n\n var ref = this;\n var options = ref.options;\n var seriesColors = ref.plotArea.options.seriesColors; if (seriesColors === void 0) { seriesColors = []; }\n var colorsCount = seriesColors.length;\n var series = options.series;\n var seriesCount = series.length;\n\n for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n var currentSeries = series[seriesIx];\n var data = currentSeries.data;\n var ref$1 = bindSegments(currentSeries);\n var total = ref$1.total;\n var points = ref$1.points;\n var count = ref$1.count;\n var anglePerValue = 360 / total;\n var constantAngle = (void 0);\n if (!isFinite(anglePerValue)) {\n constantAngle = 360 / count;\n }\n var currentAngle = (void 0);\n\n if (defined(currentSeries.startAngle)) {\n currentAngle = currentSeries.startAngle;\n } else {\n currentAngle = options.startAngle;\n }\n\n if (seriesIx !== seriesCount - 1) {\n if (currentSeries.labels.position === OUTSIDE_END) {\n currentSeries.labels.position = CENTER;\n }\n }\n\n for (var i = 0; i < points.length; i++) {\n var pointData = points[i];\n if (!pointData) {\n continue;\n }\n\n var fields = pointData.fields;\n var value = pointData.value;\n var visible = pointData.visible;\n var angle = value !== 0 ? (constantAngle || (value * anglePerValue)) : 0;\n var explode = data.length !== 1 && Boolean(fields.explode);\n\n if (!isFunction(currentSeries.color)) {\n currentSeries.color = fields.color || seriesColors[i % colorsCount];\n }\n\n callback(value, new dataviz.Ring(null, 0, 0, currentAngle, angle), {\n owner: this$1,\n category: defined(fields.category) ? fields.category : \"\",\n index: i,\n series: currentSeries,\n seriesIx: seriesIx,\n dataItem: data[i],\n percentage: total !== 0 ? value / total : 0,\n explode: explode,\n visibleInLegend: fields.visibleInLegend,\n visible: visible,\n zIndex: seriesCount - seriesIx,\n animationDelay: this$1.animationDelay(i, seriesIx, seriesCount)\n });\n\n if (visible !== false) {\n currentAngle += angle;\n }\n }\n }\n },\n\n evalSegmentOptions: function(options, value, fields) {\n var series = fields.series;\n\n evalOptions(options, {\n value: value,\n series: series,\n dataItem: fields.dataItem,\n category: fields.category,\n percentage: fields.percentage\n }, { defaults: series._defaults, excluded: [ \"data\", \"content\", \"template\", \"visual\", \"toggle\" ] });\n },\n\n addValue: function(value, sector, fields) {\n var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n this.evalSegmentOptions(segmentOptions, value, fields);\n\n this.createLegendItem(value, segmentOptions, fields);\n\n if (fields.visible === false) {\n return;\n }\n\n var segment = new PieSegment(value, sector, segmentOptions);\n $.extend(segment, fields);\n this.append(segment);\n this.points.push(segment);\n },\n\n reflow: function(targetBox) {\n var ref = this;\n var options = ref.options;\n var points = ref.points;\n var seriesConfigs = ref.seriesConfigs; if (seriesConfigs === void 0) { seriesConfigs = []; }\n var count = points.length;\n var box = targetBox.clone();\n var space = 5;\n var minWidth = Math.min(box.width(), box.height());\n var halfMinWidth = minWidth / 2;\n var defaultPadding = minWidth - minWidth * 0.85;\n var newBox = new Box(box.x1, box.y1, box.x1 + minWidth, box.y1 + minWidth);\n var newBoxCenter = newBox.center();\n var boxCenter = box.center();\n var seriesCount = options.series.length;\n var leftSideLabels = [];\n var rightSideLabels = [];\n var padding = valueOrDefault(options.padding, defaultPadding);\n\n this.targetBox = targetBox;\n\n padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n newBox.translate(boxCenter.x - newBoxCenter.x, boxCenter.y - newBoxCenter.y);\n\n var radius = halfMinWidth - padding;\n var center = new Point(\n radius + newBox.x1 + padding,\n radius + newBox.y1 + padding\n );\n\n for (var i = 0; i < count; i++) {\n var segment = points[i];\n var sector = segment.sector;\n var seriesIndex = segment.seriesIx;\n sector.radius = radius;\n sector.center = center;\n\n if (seriesConfigs.length) {\n var seriesConfig = seriesConfigs[seriesIndex];\n sector.innerRadius = seriesConfig.innerRadius;\n sector.radius = seriesConfig.radius;\n }\n\n if (seriesIndex === seriesCount - 1 && segment.explode) {\n sector.center = sector.clone().setRadius(sector.radius * 0.15).point(sector.middle());\n }\n\n segment.reflow(newBox);\n\n var label = segment.label;\n if (label) {\n if (label.options.position === OUTSIDE_END) {\n if (seriesIndex === seriesCount - 1) {\n if (label.orientation === RIGHT) {\n rightSideLabels.push(label);\n } else {\n leftSideLabels.push(label);\n }\n }\n }\n }\n }\n\n if (leftSideLabels.length > 0) {\n leftSideLabels.sort(this.labelComparator(true));\n this.leftLabelsReflow(leftSideLabels);\n }\n\n if (rightSideLabels.length > 0) {\n rightSideLabels.sort(this.labelComparator(false));\n this.rightLabelsReflow(rightSideLabels);\n }\n\n this.box = newBox;\n },\n\n leftLabelsReflow: function(labels) {\n var distances = this.distanceBetweenLabels(labels);\n\n this.distributeLabels(distances, labels);\n },\n\n rightLabelsReflow: function(labels) {\n var distances = this.distanceBetweenLabels(labels);\n\n this.distributeLabels(distances, labels);\n },\n\n distanceBetweenLabels: function(labels) {\n var segment = last(this.points);\n var sector = segment.sector;\n var count = labels.length - 1;\n var lr = sector.radius + segment.options.labels.distance;\n var distances = [];\n var firstBox = labels[0].box;\n var distance = round(firstBox.y1 - (sector.center.y - lr - firstBox.height() - firstBox.height() / 2));\n\n distances.push(distance);\n\n for (var i = 0; i < count; i++) {\n var secondBox = labels[i + 1].box;\n\n firstBox = labels[i].box;\n distance = round(secondBox.y1 - firstBox.y2);\n distances.push(distance);\n }\n distance = round(sector.center.y + lr - labels[count].box.y2 - labels[count].box.height() / 2);\n distances.push(distance);\n\n return distances;\n },\n\n distributeLabels: function(distances, labels) {\n var this$1 = this;\n\n var count = distances.length;\n var left, right, remaining;\n\n for (var i = 0; i < count; i++) {\n remaining = -distances[i];\n left = right = i;\n\n while (remaining > 0 && (left >= 0 || right < count)) {\n remaining = this$1._takeDistance(distances, i, --left, remaining);\n remaining = this$1._takeDistance(distances, i, ++right, remaining);\n }\n }\n\n this.reflowLabels(distances, labels);\n },\n\n _takeDistance: function(distances, anchor, position, amount) {\n var result = amount;\n if (distances[position] > 0) {\n var available = Math.min(distances[position], result);\n result -= available;\n distances[position] -= available;\n distances[anchor] += available;\n }\n\n return result;\n },\n\n reflowLabels: function(distances, labels) {\n var this$1 = this;\n\n var segment = last(this.points);\n var sector = segment.sector;\n var labelOptions = segment.options.labels;\n var labelsCount = labels.length;\n var labelDistance = labelOptions.distance;\n var boxY = sector.center.y - (sector.radius + labelDistance) - labels[0].box.height();\n var boxX;\n\n distances[0] += 2;\n for (var i = 0; i < labelsCount; i++) {\n var label = labels[i];\n var box = label.box;\n\n boxY += distances[i];\n boxX = this$1.hAlignLabel(\n box.x2,\n sector.clone().expand(labelDistance),\n boxY,\n boxY + box.height(),\n label.orientation === RIGHT);\n\n if (label.orientation === RIGHT) {\n if (labelOptions.align !== CIRCLE) {\n boxX = sector.radius + sector.center.x + labelDistance;\n }\n label.reflow(new Box(boxX + box.width(), boxY, boxX, boxY));\n } else {\n if (labelOptions.align !== CIRCLE) {\n boxX = sector.center.x - sector.radius - labelDistance;\n }\n label.reflow(new Box(boxX - box.width(), boxY, boxX, boxY));\n }\n\n boxY += box.height();\n }\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var ref = this;\n var connectors = ref.options.connectors;\n var points = ref.points;\n var count = points.length;\n var space = 4;\n\n ChartElement.fn.createVisual.call(this);\n\n this._connectorLines = [];\n\n for (var i = 0; i < count; i++) {\n var segment = points[i];\n var sector = segment.sector;\n var label = segment.label;\n var angle = sector.middle();\n var connectorsColor = (segment.options.connectors || {}).color || connectors.color;\n\n if (label) {\n var connectorLine = new Path({\n stroke: {\n color: connectorsColor,\n width: connectors.width\n },\n animation: {\n type: FADEIN,\n delay: segment.animationDelay\n }\n });\n\n if (label.options.position === OUTSIDE_END) {\n var box = label.box;\n var centerPoint = sector.center;\n var start = sector.point(angle);\n var middle = new Point(box.x1, box.center().y);\n var sr = (void 0), end = (void 0), crossing = (void 0);\n\n start = sector.clone().expand(connectors.padding).point(angle);\n connectorLine.moveTo(start.x, start.y);\n // TODO: Extract into a method to remove duplication\n if (label.orientation === RIGHT) {\n end = new Point(box.x1 - connectors.padding, box.center().y);\n crossing = intersection(centerPoint, start, middle, end);\n middle = new Point(end.x - space, end.y);\n crossing = crossing || middle;\n crossing.x = Math.min(crossing.x, middle.x);\n\n if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) ||\n crossing.x < sector.center.x) {\n sr = sector.center.x + sector.radius + space;\n if (segment.options.labels.align !== COLUMN) {\n if (sr < middle.x) {\n connectorLine.lineTo(sr, start.y);\n } else {\n connectorLine.lineTo(start.x + space * 2, start.y);\n }\n } else {\n connectorLine.lineTo(sr, start.y);\n }\n connectorLine.lineTo(middle.x, end.y);\n } else {\n crossing.y = end.y;\n connectorLine.lineTo(crossing.x, crossing.y);\n }\n } else {\n end = new Point(box.x2 + connectors.padding, box.center().y);\n crossing = intersection(centerPoint, start, middle, end);\n middle = new Point(end.x + space, end.y);\n crossing = crossing || middle;\n crossing.x = Math.max(crossing.x, middle.x);\n\n if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) ||\n crossing.x > sector.center.x) {\n sr = sector.center.x - sector.radius - space;\n if (segment.options.labels.align !== COLUMN) {\n if (sr > middle.x) {\n connectorLine.lineTo(sr, start.y);\n } else {\n connectorLine.lineTo(start.x - space * 2, start.y);\n }\n } else {\n connectorLine.lineTo(sr, start.y);\n }\n connectorLine.lineTo(middle.x, end.y);\n } else {\n crossing.y = end.y;\n connectorLine.lineTo(crossing.x, crossing.y);\n }\n }\n\n connectorLine.lineTo(end.x, end.y);\n\n this$1._connectorLines.push(connectorLine);\n this$1.visual.append(connectorLine);\n }\n }\n }\n },\n\n renderVisual: function() {\n ChartElement.fn.renderVisual.call(this);\n\n if (dataviz.find(this.options.series, function (options) { return options.autoFit; })) {\n var targetBox = this.targetBox;\n var pieCenter = this.box.center();\n var bbox = this.visual.bbox();\n if (!bbox) {\n return;\n }\n\n var bboxBottom = bbox.bottomRight();\n\n var scale = Math.min(\n (pieCenter.y - targetBox.y1) / (pieCenter.y - bbox.origin.y),\n (targetBox.y2 - pieCenter.y) / (bboxBottom.y - pieCenter.y),\n (pieCenter.x - targetBox.x1) / (pieCenter.x - bbox.origin.x),\n (targetBox.x2 - pieCenter.x) / (bboxBottom.x - pieCenter.x)\n );\n\n if (scale < 1) {\n this.visual.transform(transform().scale(scale, scale, [ pieCenter.x, pieCenter.y ]));\n }\n }\n },\n\n labelComparator: function(reverse) {\n var reverseValue = reverse ? -1 : 1;\n\n return function(a, b) {\n var first = (a.parent.sector.middle() + 270) % 360;\n var second = (b.parent.sector.middle() + 270) % 360;\n return (first - second) * reverseValue;\n };\n },\n\n hAlignLabel: function(originalX, sector, y1, y2, direction) {\n var radius = sector.radius;\n var sector_center = sector.center;\n var cx = sector_center.x;\n var cy = sector_center.y;\n var t = Math.min(Math.abs(cy - y1), Math.abs(cy - y2));\n\n if (t > radius) {\n return originalX;\n }\n\n return cx + Math.sqrt((radius * radius) - (t * t)) * (direction ? 1 : -1);\n },\n\n pointInCircle: function(point, center, radius) {\n return Math.pow(center.x - point.x, 2) + Math.pow(center.y - point.y, 2) < Math.pow(radius, 2);\n },\n\n formatPointValue: function(point, format) {\n return this.chartService.format.auto(format, point.value);\n },\n\n animationDelay: function(categoryIndex) {\n return categoryIndex * PIE_SECTOR_ANIM_DELAY;\n },\n\n stackRoot: function() {\n return this;\n }\n});\n\nfunction intersection(a1, a2, b1, b2) {\n var uat = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n var ub = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n var result;\n if (ub !== 0) {\n var ua = (uat / ub);\n\n result = new Point(\n a1.x + ua * (a2.x - a1.x),\n a1.y + ua * (a2.y - a1.y)\n );\n }\n\n return result;\n}\n\nsetDefaultOptions(PieChart, {\n startAngle: 90,\n connectors: {\n width: 2,\n color: \"#939393\",\n padding: 8\n },\n inactiveItems: {\n markers: {},\n labels: {}\n }\n});\n\ndeepExtend(PieChart.prototype, PieChartMixin);\n\nPieChart.prototype.isStackRoot = true;\n\nvar PiePlotArea = PlotAreaBase.extend({\n render: function() {\n this.createPieChart(this.series);\n },\n\n createPieChart: function(series) {\n var firstSeries = series[0];\n var pieChart = new PieChart(this, {\n series: series,\n padding: firstSeries.padding,\n startAngle: firstSeries.startAngle,\n connectors: firstSeries.connectors,\n legend: this.options.legend\n });\n\n this.appendChart(pieChart);\n },\n\n appendChart: function(chart, pane) {\n PlotAreaBase.fn.appendChart.call(this, chart, pane);\n append(this.options.legend.items, chart.legendItems);\n }\n});\n\nvar DonutSegment = PieSegment.extend({\n reflowLabel: function() {\n var ref = this;\n var labelsOptions = ref.options.labels;\n var label = ref.label;\n var sector = this.sector.clone();\n var angle = sector.middle();\n\n if (label) {\n var labelHeight = label.box.height();\n if (labelsOptions.position === CENTER) {\n sector.radius -= (sector.radius - sector.innerRadius) / 2;\n\n var lp = sector.point(angle);\n\n label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else {\n PieSegment.fn.reflowLabel.call(this);\n }\n }\n },\n\n createSegment: function(sector, options) {\n return dataviz.ShapeBuilder.current.createRing(sector, options);\n }\n});\n\nsetDefaultOptions(DonutSegment, {\n overlay: {\n gradient: \"roundedGlass\"\n },\n labels: {\n position: CENTER\n },\n animation: {\n type: PIE\n }\n});\n\ndeepExtend(DonutSegment.prototype, PointEventsMixin);\n\nvar DONUT_SECTOR_ANIM_DELAY = 50;\n\nvar DonutChart = PieChart.extend({\n addValue: function(value, sector, fields) {\n var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n this.evalSegmentOptions(segmentOptions, value, fields);\n\n this.createLegendItem(value, segmentOptions, fields);\n\n if (fields.visible === false) {\n return;\n }\n\n var segment = new DonutSegment(value, sector, segmentOptions);\n\n $.extend(segment, fields);\n this.append(segment);\n this.points.push(segment);\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n var options = this.options;\n var box = targetBox.clone();\n var space = 5;\n var minWidth = Math.min(box.width(), box.height());\n var halfMinWidth = minWidth / 2;\n var defaultPadding = minWidth - minWidth * 0.85;\n var series = options.series;\n var seriesCount = series.length;\n\n var padding = valueOrDefault(options.padding, defaultPadding);\n padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n\n var totalSize = halfMinWidth - padding;\n var seriesWithoutSize = 0;\n var holeSize;\n\n for (var i = 0; i < seriesCount; i++) {\n var currentSeries = series[i];\n if (i === 0) {\n if (defined(currentSeries.holeSize)) {\n holeSize = currentSeries.holeSize;\n totalSize -= currentSeries.holeSize;\n }\n }\n\n if (defined(currentSeries.size)) {\n totalSize -= currentSeries.size;\n } else {\n seriesWithoutSize++;\n }\n\n if (defined(currentSeries.margin) && i !== seriesCount - 1) {\n totalSize -= currentSeries.margin;\n }\n }\n\n if (!defined(holeSize)) {\n var currentSize = (halfMinWidth - padding) / (seriesCount + 0.75);\n holeSize = currentSize * 0.75;\n totalSize -= holeSize;\n }\n\n var innerRadius = holeSize;\n var margin = 0;\n var size, radius;\n\n this.seriesConfigs = [];\n\n for (var i$1 = 0; i$1 < seriesCount; i$1++) {\n var currentSeries$1 = series[i$1];\n size = valueOrDefault(currentSeries$1.size, totalSize / seriesWithoutSize);\n innerRadius += margin;\n radius = innerRadius + size;\n this$1.seriesConfigs.push({ innerRadius: innerRadius, radius: radius });\n margin = currentSeries$1.margin || 0;\n innerRadius = radius;\n }\n\n PieChart.fn.reflow.call(this, targetBox);\n },\n\n animationDelay: function(categoryIndex, seriesIndex, seriesCount) {\n return categoryIndex * DONUT_SECTOR_ANIM_DELAY +\n (INITIAL_ANIMATION_DURATION * (seriesIndex + 1) / (seriesCount + 1));\n }\n});\n\nsetDefaultOptions(DonutChart, {\n startAngle: 90,\n connectors: {\n width: 2,\n color: \"#939393\",\n padding: 8\n }\n});\n\nvar DonutPlotArea = PiePlotArea.extend({\n render: function() {\n this.createDonutChart(this.series);\n },\n\n createDonutChart: function(series) {\n var firstSeries = series[0];\n var donutChart = new DonutChart(this, {\n series: series,\n padding: firstSeries.padding,\n connectors: firstSeries.connectors,\n legend: this.options.legend\n });\n\n this.appendChart(donutChart);\n }\n});\n\nvar DEFAULT_PADDING = 0.15;\n\nvar PolarPlotAreaBase = PlotAreaBase.extend({\n initFields: function() {\n this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n },\n\n render: function() {\n this.addToLegend(this.series);\n this.createPolarAxis();\n this.createCharts();\n this.createValueAxis();\n },\n\n alignAxes: function() {\n var axis = this.valueAxis;\n var range = axis.range();\n var crossingValue = axis.options.reverse ? range.max : range.min;\n var slot = axis.getSlot(crossingValue);\n var center = this.polarAxis.getSlot(0).center;\n var axisBox = axis.box.translate(\n center.x - slot.x1,\n center.y - slot.y1\n );\n\n axis.reflow(axisBox);\n },\n\n createValueAxis: function() {\n var tracker = this.valueAxisRangeTracker;\n var defaultRange = tracker.query();\n var axisOptions = this.valueAxisOptions({\n roundToMajorUnit: false,\n zIndex: -1\n });\n var axisType, axisDefaultRange;\n\n if (axisOptions.type === LOGARITHMIC) {\n axisType = dataviz.RadarLogarithmicAxis;\n axisDefaultRange = { min: 0.1, max: 1 };\n } else {\n axisType = dataviz.RadarNumericAxis;\n axisDefaultRange = { min: 0, max: 1 };\n }\n\n var range = tracker.query(name) || defaultRange || axisDefaultRange;\n\n if (range && defaultRange) {\n range.min = Math.min(range.min, defaultRange.min);\n range.max = Math.max(range.max, defaultRange.max);\n }\n\n var valueAxis = new axisType(\n range.min, range.max,\n axisOptions,\n this.chartService\n );\n\n this.valueAxis = valueAxis;\n this.appendAxis(valueAxis);\n },\n\n reflowAxes: function() {\n var ref = this;\n var options = ref.options.plotArea;\n var valueAxis = ref.valueAxis;\n var polarAxis = ref.polarAxis;\n var box = ref.box;\n var defaultPadding = Math.min(box.width(), box.height()) * DEFAULT_PADDING;\n var padding = getSpacing(options.padding || {}, defaultPadding);\n var paddingBox = box.clone().unpad(padding);\n var axisBox = paddingBox.clone();\n\n axisBox.y2 = axisBox.y1 + Math.min(axisBox.width(), axisBox.height());\n axisBox.align(paddingBox, Y, CENTER);\n\n var valueAxisBox = axisBox.clone().shrink(0, axisBox.height() / 2);\n\n polarAxis.reflow(axisBox);\n valueAxis.reflow(valueAxisBox);\n var heightDiff = valueAxis.lineBox().height() - valueAxis.box.height();\n valueAxis.reflow(valueAxis.box.unpad({ top: heightDiff }));\n\n this.axisBox = axisBox;\n this.alignAxes(axisBox);\n },\n\n backgroundBox: function() {\n return this.box;\n },\n\n detachLabels: function() {}\n});\n\nvar PolarScatterChart = ScatterChart.extend({\n pointSlot: function(slotX, slotY) {\n var valueRadius = slotX.center.y - slotY.y1;\n var slot = Point.onCircle(slotX.center, slotX.startAngle, valueRadius);\n\n return new Box(slot.x, slot.y, slot.x, slot.y);\n }\n});\n\nsetDefaultOptions(PolarScatterChart, {\n clip: false\n});\n\nvar PolarLineChart = ScatterLineChart.extend({\n\n});\n\nPolarLineChart.prototype.pointSlot = PolarScatterChart.prototype.pointSlot;\n\nsetDefaultOptions(PolarLineChart, {\n clip: false\n});\n\nvar SplinePolarAreaSegment = SplineAreaSegment.extend({\n fillToAxes: function(fillPath) {\n var center = this._polarAxisCenter();\n fillPath.lineTo(center.x, center.y);\n },\n\n _polarAxisCenter: function() {\n var polarAxis = this.parent.plotArea.polarAxis;\n var center = polarAxis.box.center();\n return center;\n },\n\n strokeSegments: function() {\n var segments = this._strokeSegments;\n\n if (!segments) {\n var center = this._polarAxisCenter();\n var curveProcessor = new CurveProcessor(false);\n var linePoints = this.points();\n\n linePoints.push(center);\n segments = this._strokeSegments = curveProcessor.process(linePoints);\n segments.pop();\n }\n\n return segments;\n }\n});\n\nvar PolarAreaSegment = AreaSegment.extend({\n fillToAxes: function(fillPath) {\n var polarAxis = this.parent.plotArea.polarAxis;\n var center = polarAxis.box.center();\n var centerSegment = new geometry.Segment([ center.x, center.y ]);\n\n fillPath.segments.unshift(centerSegment);\n fillPath.segments.push(centerSegment);\n }\n});\n\nvar PolarAreaChart = PolarLineChart.extend({\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = (currentSeries.line || {}).style;\n var segment;\n\n if (style === SMOOTH) {\n segment = new SplinePolarAreaSegment(linePoints, currentSeries, seriesIx);\n } else {\n segment = new PolarAreaSegment(linePoints, currentSeries, seriesIx);\n }\n return segment;\n },\n\n createMissingValue: function(value, missingValues) {\n var missingValue;\n\n if (hasValue(value.x) && missingValues !== INTERPOLATE) {\n missingValue = {\n x: value.x,\n y: value.y\n };\n if (missingValues === ZERO) {\n missingValue.y = 0;\n }\n }\n\n return missingValue;\n },\n\n seriesMissingValues: function(series) {\n return series.missingValues || ZERO;\n },\n\n _hasMissingValuesGap: function() {\n var this$1 = this;\n\n var series = this.options.series;\n\n for (var idx = 0; idx < series.length; idx++) {\n if (this$1.seriesMissingValues(series[idx]) === GAP) {\n return true;\n }\n }\n },\n\n sortPoints: function(points) {\n var this$1 = this;\n\n points.sort(xComparer);\n\n if (this._hasMissingValuesGap()) {\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n if (point) {\n var value = point.value;\n if (!hasValue(value.y) && this$1.seriesMissingValues(point.series) === GAP) {\n delete points[idx];\n }\n }\n }\n }\n\n return points;\n }\n});\n\nfunction xComparer(a, b) {\n return a.value.x - b.value.x;\n}\n\nvar PolarPlotArea = PolarPlotAreaBase.extend({\n createPolarAxis: function() {\n var polarAxis = new dataviz.PolarAxis(this.options.xAxis, this.chartService);\n\n this.polarAxis = polarAxis;\n this.axisX = polarAxis;\n this.appendAxis(polarAxis);\n },\n\n valueAxisOptions: function(defaults) {\n return deepExtend(defaults, {\n majorGridLines: { type: ARC },\n minorGridLines: { type: ARC }\n }, this.options.yAxis);\n },\n\n createValueAxis: function() {\n PolarPlotAreaBase.fn.createValueAxis.call(this);\n this.axisY = this.valueAxis;\n },\n\n appendChart: function(chart, pane) {\n this.valueAxisRangeTracker.update(chart.yAxisRanges);\n\n PlotAreaBase.prototype.appendChart.call(this, chart, pane);\n },\n\n createCharts: function() {\n var series = this.filterVisibleSeries(this.series);\n var pane = this.panes[0];\n\n this.createLineChart(\n filterSeriesByType(series, [ POLAR_LINE ]),\n pane\n );\n\n this.createScatterChart(\n filterSeriesByType(series, [ POLAR_SCATTER ]),\n pane\n );\n\n this.createAreaChart(\n filterSeriesByType(series, [ POLAR_AREA ]),\n pane\n );\n },\n\n createLineChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var lineChart = new PolarLineChart(this, { series: series });\n\n this.appendChart(lineChart, pane);\n },\n\n createScatterChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var scatterChart = new PolarScatterChart(this, { series: series });\n\n this.appendChart(scatterChart, pane);\n },\n\n createAreaChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var areaChart = new PolarAreaChart(this, { series: series });\n\n this.appendChart(areaChart, pane);\n },\n\n _dispatchEvent: function(chart, e, eventType) {\n var coords = chart._eventCoordinates(e);\n var point = new Point(coords.x, coords.y);\n var xValue = this.axisX.getValue(point);\n var yValue = this.axisY.getValue(point);\n\n if (xValue !== null && yValue !== null) {\n chart.trigger(eventType, {\n element: eventElement(e),\n x: xValue,\n y: yValue\n });\n }\n },\n\n createCrosshairs: function() {}\n});\n\nsetDefaultOptions(PolarPlotArea, {\n xAxis: {},\n yAxis: {}\n});\n\ndeepExtend(PolarPlotArea.prototype, PlotAreaEventsMixin);\n\nfunction groupBySeriesIx(segments) {\n var seriesSegments = [];\n for (var idx = 0; idx < segments.length; idx++) {\n var segment = segments[idx];\n seriesSegments[segment.seriesIx] = seriesSegments[segment.seriesIx] || [];\n seriesSegments[segment.seriesIx].push(segment);\n }\n\n return seriesSegments;\n}\n\nvar RadarLineChart = LineChart.extend({\n pointSlot: function(categorySlot, valueSlot) {\n var valueRadius = categorySlot.center.y - valueSlot.y1;\n var slot = Point.onCircle(categorySlot.center, categorySlot.middle(), valueRadius);\n\n return new Box(slot.x, slot.y, slot.x, slot.y);\n },\n\n renderSegments: function() {\n LineChart.fn.renderSegments.call(this);\n\n if (this._segments && this._segments.length > 1) {\n var seriesSegments = groupBySeriesIx(this._segments);\n\n for (var idx = 0; idx < seriesSegments.length; idx++) {\n var segments = seriesSegments[idx];\n if (segments && segments.length > 1) {\n var firstPoint = segments[0].linePoints[0];\n var lastSegment = last(segments);\n var lastPoint = last(lastSegment.linePoints);\n var isFirstDataPoint = firstPoint.categoryIx === 0;\n var isLastDataPoint = lastPoint.categoryIx === lastPoint.categoriesCount - 1;\n if (isFirstDataPoint && isLastDataPoint) {\n last(segments).linePoints.push(firstPoint);\n }\n }\n }\n }\n },\n\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = currentSeries.style;\n var pointType;\n\n if (style === SMOOTH) {\n pointType = SplineSegment;\n } else {\n pointType = LineSegment;\n }\n\n var segment = new pointType(linePoints, currentSeries, seriesIx);\n var missingValues = this.seriesMissingValues(currentSeries);\n\n if (linePoints.length === currentSeries.data.length || missingValues === INTERPOLATE) {\n segment.options.closed = true;\n }\n\n return segment;\n }\n});\n\nsetDefaultOptions(RadarLineChart, {\n clip: false,\n limitPoints: false\n});\n\nvar SplineRadarAreaSegment = SplineAreaSegment.extend({\n fillToAxes: function() {}\n});\n\nvar RadarAreaSegment = AreaSegment.extend({\n fillToAxes: function() {}\n});\n\nvar RadarAreaChart = RadarLineChart.extend({\n createSegment: function(linePoints, currentSeries, seriesIx, prevSegment) {\n var isStacked = this.options.isStacked;\n var style = (currentSeries.line || {}).style;\n var previousSegment;\n var stackPoints;\n var segment;\n\n if (isStacked && seriesIx > 0 && prevSegment) {\n stackPoints = prevSegment.linePoints.slice(0);\n previousSegment = prevSegment;\n }\n\n if (style === SMOOTH) {\n segment = new SplineRadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n segment.options.closed = true;\n } else {\n linePoints.push(linePoints[0]);\n segment = new RadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n }\n\n return segment;\n },\n\n seriesMissingValues: function(series) {\n return series.missingValues || ZERO;\n }\n});\n\nvar RadarSegment = DonutSegment.extend({\n init: function(value, options) {\n DonutSegment.fn.init.call(this, value, null, options);\n }\n});\n\nsetDefaultOptions(RadarSegment, {\n overlay: {\n gradient: \"none\"\n },\n labels: {\n distance: 10\n }\n});\n\nvar RadarClusterLayout = ChartElement.extend({\n init: function(options) {\n ChartElement.fn.init.call(this, options);\n\n this.forEach = options.rtl ? forEachReverse : forEach;\n },\n\n reflow: function(sector) {\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var gap = options.gap;\n var spacing = options.spacing;\n var count = children.length;\n var slots = count + gap + (spacing * (count - 1));\n var slotAngle = sector.angle / slots;\n var angle = sector.startAngle + slotAngle * (gap / 2);\n\n this.forEach(children, function (child) {\n var slotSector = sector.clone();\n slotSector.startAngle = angle;\n slotSector.angle = slotAngle;\n\n if (child.sector) {\n slotSector.radius = child.sector.radius;\n }\n\n child.reflow(slotSector);\n child.sector = slotSector;\n\n angle += slotAngle + (slotAngle * spacing);\n });\n }\n});\n\nsetDefaultOptions(RadarClusterLayout, {\n gap: 1,\n spacing: 0\n});\n\nvar RadarStackLayout = ChartElement.extend({\n reflow: function(sector) {\n var ref = this;\n var reverse = ref.options.reverse;\n var children = ref.children;\n var childrenCount = children.length;\n var first = reverse ? childrenCount - 1 : 0;\n var step = reverse ? -1 : 1;\n\n this.box = new Box();\n\n for (var i = first; i >= 0 && i < childrenCount; i += step) {\n var childSector = children[i].sector;\n childSector.startAngle = sector.startAngle;\n childSector.angle = sector.angle;\n }\n }\n});\n\nvar RadarBarChart = BarChart.extend({\n pointType: function() {\n return RadarSegment;\n },\n\n clusterType: function() {\n return RadarClusterLayout;\n },\n\n stackType: function() {\n return RadarStackLayout;\n },\n\n categorySlot: function(categoryAxis, categoryIx) {\n return categoryAxis.getSlot(categoryIx);\n },\n\n pointSlot: function(categorySlot, valueSlot) {\n var slot = categorySlot.clone();\n var y = categorySlot.center.y;\n\n slot.radius = y - valueSlot.y1;\n slot.innerRadius = y - valueSlot.y2;\n\n return slot;\n },\n\n reflowPoint: function(point, pointSlot) {\n point.sector = pointSlot;\n point.reflow();\n },\n\n createAnimation: function() {\n this.options.animation.center = this.box.toRect().center();\n BarChart.fn.createAnimation.call(this);\n }\n});\n\nRadarBarChart.prototype.reflow = CategoricalChart.prototype.reflow;\n\nsetDefaultOptions(RadarBarChart, {\n clip: false,\n limitPoints: false,\n animation: {\n type: \"pie\"\n }\n});\n\nvar RadarPlotArea = PolarPlotAreaBase.extend({\n createPolarAxis: function() {\n var categoryAxis = new dataviz.RadarCategoryAxis(this.options.categoryAxis, this.chartService);\n\n this.polarAxis = categoryAxis;\n this.categoryAxis = categoryAxis;\n this.appendAxis(categoryAxis);\n this.aggregateCategories();\n this.createCategoryAxesLabels();\n },\n\n valueAxisOptions: function(defaults) {\n if (this._hasBarCharts) {\n deepExtend(defaults, {\n majorGridLines: { type: ARC },\n minorGridLines: { type: ARC }\n });\n }\n\n if (this._isStacked100) {\n deepExtend(defaults, {\n roundToMajorUnit: false,\n labels: { format: \"P0\" }\n });\n }\n\n return deepExtend(defaults, this.options.valueAxis);\n },\n\n aggregateCategories: function() {\n // No separate panes in radar charts\n CategoricalPlotArea.prototype.aggregateCategories.call(this, this.panes);\n },\n\n createCategoryAxesLabels: function() {\n CategoricalPlotArea.prototype.createCategoryAxesLabels.call(this, this.panes);\n },\n\n filterSeries: function(currentSeries) {\n // Not supported for radar charts\n return currentSeries;\n },\n\n createCharts: function() {\n var series = this.filterVisibleSeries(this.series);\n var pane = this.panes[0];\n\n this.createAreaChart(\n filterSeriesByType(series, [ RADAR_AREA ]),\n pane\n );\n\n this.createLineChart(\n filterSeriesByType(series, [ RADAR_LINE ]),\n pane\n );\n\n this.createBarChart(\n filterSeriesByType(series, [ RADAR_COLUMN ]),\n pane\n );\n },\n\n chartOptions: function(series) {\n var options = { series: series };\n var firstSeries = series[0];\n if (firstSeries) {\n var filteredSeries = this.filterVisibleSeries(series);\n var stack = firstSeries.stack;\n options.isStacked = stack && filteredSeries.length > 1;\n options.isStacked100 = stack && stack.type === \"100%\" && filteredSeries.length > 1;\n\n if (options.isStacked100) {\n this._isStacked100 = true;\n }\n }\n\n return options;\n },\n\n createAreaChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var areaChart = new RadarAreaChart(this, this.chartOptions(series));\n this.appendChart(areaChart, pane);\n },\n\n createLineChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var lineChart = new RadarLineChart(this, this.chartOptions(series));\n this.appendChart(lineChart, pane);\n },\n\n createBarChart: function(series, pane) {\n if (series.length === 0) {\n return;\n }\n\n var firstSeries = series[0];\n var options = this.chartOptions(series);\n options.gap = firstSeries.gap;\n options.spacing = firstSeries.spacing;\n\n var barChart = new RadarBarChart(this, options);\n this.appendChart(barChart, pane);\n\n this._hasBarCharts = true;\n },\n\n seriesCategoryAxis: function() {\n return this.categoryAxis;\n },\n\n _dispatchEvent: function(chart, e, eventType) {\n var coords = chart._eventCoordinates(e);\n var point = new Point(coords.x, coords.y);\n var category = this.categoryAxis.getCategory(point);\n var value = this.valueAxis.getValue(point);\n\n if (category !== null && value !== null) {\n chart.trigger(eventType, {\n element: eventElement(e),\n category: category,\n value: value\n });\n }\n },\n\n createCrosshairs: function() {}\n});\n\ndeepExtend(RadarPlotArea.prototype, PlotAreaEventsMixin, {\n appendChart: CategoricalPlotArea.prototype.appendChart,\n aggregateSeries: CategoricalPlotArea.prototype.aggregateSeries,\n seriesSourcePoints: CategoricalPlotArea.prototype.seriesSourcePoints\n});\n\nsetDefaultOptions(RadarPlotArea, {\n categoryAxis: {\n categories: []\n },\n valueAxis: {}\n});\n\nvar FunnelSegment = ChartElement.extend({\n init: function(value, options, segmentOptions) {\n ChartElement.fn.init.call(this, options);\n\n this.value = value;\n this.options.index = segmentOptions.index;\n },\n\n reflow: function(chartBox) {\n var points = this.points;\n var label = this.children[0];\n\n this.box = new Box(points[0].x, points[0].y, points[1].x, points[2].y);\n\n if (label) {\n label.reflow(new Box(chartBox.x1, points[0].y, chartBox.x2, points[2].y));\n }\n },\n\n createVisual: function() {\n var this$1 = this;\n\n var options = this.options;\n var visual;\n\n ChartElement.fn.createVisual.call(this);\n\n if (options.visual) {\n visual = options.visual({\n category: this.category,\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n percentage: this.percentage,\n points: this.points,\n options: options,\n sender: this.getSender(),\n createVisual: function () { return this$1.createPath(); }\n });\n } else {\n visual = this.createPath();\n }\n\n if (visual) {\n this.visual.append(visual);\n }\n },\n\n createPath: function() {\n var options = this.options;\n var border = options.border;\n var path = Path.fromPoints(this.points, {\n fill: {\n color: options.color,\n opacity: options.opacity\n },\n stroke: {\n color: border.color,\n opacity: border.opacity,\n width: border.width\n }\n }).close();\n\n return path;\n },\n\n createHighlight: function(style) {\n return Path.fromPoints(this.points, style);\n },\n\n highlightVisual: function() {\n return this.visual.children[0];\n },\n\n highlightVisualArgs: function() {\n var path = Path.fromPoints(this.points).close();\n\n return {\n options: this.options,\n path: path\n };\n },\n\n tooltipAnchor: function() {\n var box = this.box;\n return {\n point: new Point(box.center().x, box.y1),\n align: {\n horizontal: \"center\",\n vertical: \"top\"\n }\n };\n },\n\n formatValue: function(format) {\n var point = this;\n return point.owner.formatPointValue(point, format);\n }\n});\n\nsetDefaultOptions(FunnelSegment, {\n color: WHITE,\n border: {\n width: 1\n }\n});\n\ndeepExtend(FunnelSegment.prototype, PointEventsMixin);\n\nvar FunnelChart = ChartElement.extend({\n init: function(plotArea, options) {\n ChartElement.fn.init.call(this, options);\n\n this.plotArea = plotArea;\n this.points = [];\n this.labels = [];\n this.legendItems = [];\n this.render();\n },\n\n formatPointValue: function(point, format) {\n return this.chartService.format.auto(format,point.value);\n },\n\n render: function() {\n var this$1 = this;\n\n var ref = this;\n var options = ref.options;\n var seriesColors = ref.plotArea.options.seriesColors; if (seriesColors === void 0) { seriesColors = []; }\n var series = options.series[0];\n var data = series.data;\n\n if (!data) {\n return;\n }\n\n var ref$1 = bindSegments(series);\n var total = ref$1.total;\n var points = ref$1.points;\n\n for (var i = 0; i < points.length; i++) {\n var pointData = points[i];\n\n if (!pointData) {\n continue;\n }\n\n var fields = pointData.fields;\n\n if (!isFunction(series.color)) {\n series.color = fields.color || seriesColors[i % seriesColors.length];\n }\n\n fields = deepExtend({\n index: i,\n owner: this$1,\n series: series,\n dataItem: data[i],\n percentage: pointData.value / total\n }, fields, { visible: pointData.visible });\n\n var value = pointData.valueFields.value;\n var segment = this$1.createSegment(value, fields);\n var label = this$1.createLabel(value, fields);\n\n if (segment && label) {\n segment.append(label);\n }\n }\n },\n\n evalSegmentOptions: function(options, value, fields) {\n var series = fields.series;\n\n evalOptions(options, {\n value: value,\n series: series,\n dataItem: fields.dataItem,\n index: fields.index\n }, { defaults: series._defaults, excluded: [ \"data\", \"content\", \"template\", \"toggle\", \"visual\" ] });\n },\n\n createSegment: function(value, fields) {\n var seriesOptions = deepExtend({}, fields.series);\n this.evalSegmentOptions(seriesOptions, value, fields);\n\n this.createLegendItem(value, seriesOptions, fields);\n\n if (fields.visible !== false) {\n\n var segment = new FunnelSegment(value, seriesOptions, fields);\n $.extend(segment, fields);\n\n this.append(segment);\n this.points.push(segment);\n\n return segment;\n }\n },\n\n createLabel: function(value, fields) {\n var series = fields.series;\n var dataItem = fields.dataItem;\n var labels = deepExtend({}, this.options.labels, series.labels);\n var text = value;\n\n if (labels.visible) {\n var labelTemplate = getTemplate(labels);\n var data = {\n dataItem: dataItem,\n value: value,\n percentage: fields.percentage,\n category: fields.category,\n series: series\n };\n if (labelTemplate) {\n text = labelTemplate(data);\n } else if (labels.format) {\n text = this.plotArea.chartService.format.auto(labels.format, text);\n }\n\n if (!labels.color) {\n labels.color = dataviz.autoTextColor(series.color);\n if (!labels.background) {\n labels.background = series.color;\n }\n }\n\n this.evalSegmentOptions(labels, value, fields);\n var textBox = new TextBox(text, deepExtend({\n vAlign: labels.position\n }, labels), data);\n\n this.labels.push(textBox);\n\n return textBox;\n }\n },\n\n labelPadding: function() {\n var labels = this.labels;\n var padding = { left: 0, right: 0 };\n\n for (var i = 0; i < labels.length; i++) {\n var label = labels[i];\n var align = label.options.align;\n if (align !== CENTER) {\n var width = labels[i].box.width();\n\n if (align === LEFT) {\n padding.left = Math.max(padding.left, width);\n } else {\n padding.right = Math.max(padding.right, width);\n }\n }\n }\n\n return padding;\n },\n\n dynamicSlopeReflow: function(box, width, totalHeight) {\n var ref = this;\n var options = ref.options;\n var segments = ref.points;\n var count = segments.length;\n var firstSegment = segments[0];\n var maxSegment = firstSegment;\n\n for (var idx = 0; idx < segments.length; idx++) {\n if (segments[idx].percentage > maxSegment.percentage) {\n maxSegment = segments[idx];\n }\n }\n\n var lastUpperSide = (firstSegment.percentage / maxSegment.percentage) * width;\n var previousOffset = (width - lastUpperSide) / 2;\n var previousHeight = 0;\n\n for (var idx$1 = 0; idx$1 < count; idx$1++) {\n var percentage = segments[idx$1].percentage;\n var nextSegment = segments[idx$1 + 1];\n var nextPercentage = (nextSegment ? nextSegment.percentage : percentage);\n var points = segments[idx$1].points = [];\n var height = (options.dynamicHeight) ? (totalHeight * percentage) : (totalHeight / count);\n var offset = (void 0);\n\n if (!percentage) {\n offset = nextPercentage ? 0 : width / 2;\n } else {\n offset = (width - lastUpperSide * (nextPercentage / percentage)) / 2;\n }\n\n offset = limitValue(offset, 0, width);\n\n points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n points.push(new GeometryPoint(box.x1 + width - offset, box.y1 + height + previousHeight));\n points.push(new GeometryPoint(box.x1 + offset, box.y1 + height + previousHeight));\n\n previousOffset = offset;\n previousHeight += height + options.segmentSpacing;\n lastUpperSide = limitValue(width - 2 * offset, 0, width);\n }\n },\n\n constantSlopeReflow: function(box, width, totalHeight) {\n var ref = this;\n var options = ref.options;\n var segments = ref.points;\n var count = segments.length;\n var decreasingWidth = options.neckRatio <= 1;\n var neckRatio = decreasingWidth ? options.neckRatio * width : width;\n var previousOffset = decreasingWidth ? 0 : (width - width / options.neckRatio) / 2;\n var topMostWidth = decreasingWidth ? width : width - previousOffset * 2;\n var finalNarrow = (topMostWidth - neckRatio) / 2;\n var previousHeight = 0;\n\n for (var idx = 0; idx < count; idx++) {\n var points = segments[idx].points = [];\n var percentage = segments[idx].percentage;\n var offset = (options.dynamicHeight) ? (finalNarrow * percentage) : (finalNarrow / count);\n var height = (options.dynamicHeight) ? (totalHeight * percentage) : (totalHeight / count);\n\n points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n points.push(new GeometryPoint(box.x1 + width - previousOffset - offset, box.y1 + height + previousHeight));\n points.push(new GeometryPoint(box.x1 + previousOffset + offset,box.y1 + height + previousHeight));\n previousOffset += offset;\n previousHeight += height + options.segmentSpacing;\n }\n },\n\n reflow: function(chartBox) {\n var points = this.points;\n var count = points.length;\n\n if (!count) {\n return;\n }\n\n var options = this.options;\n var box = chartBox.clone().unpad(this.labelPadding());\n var totalHeight = box.height() - options.segmentSpacing * (count - 1);\n var width = box.width();\n\n if (options.dynamicSlope) {\n this.dynamicSlopeReflow(box, width, totalHeight);\n } else {\n this.constantSlopeReflow(box, width, totalHeight);\n }\n\n for (var idx = 0; idx < count; idx++) {\n points[idx].reflow(chartBox);\n }\n }\n});\n\nsetDefaultOptions(FunnelChart, {\n neckRatio: 0.3,\n width: 300,\n dynamicSlope: false,\n dynamicHeight: true,\n segmentSpacing: 0,\n labels: {\n visible: false,\n align: CENTER,\n position: CENTER,\n zIndex: 1\n }\n});\n\ndeepExtend(FunnelChart.prototype, PieChartMixin);\n\nvar FunnelPlotArea = PlotAreaBase.extend({\n render: function() {\n this.createFunnelChart(this.series);\n },\n\n createFunnelChart: function(series) {\n var firstSeries = series[0];\n var funnelChart = new FunnelChart(this, {\n series: series,\n legend: this.options.legend,\n neckRatio: firstSeries.neckRatio,\n dynamicHeight: firstSeries.dynamicHeight,\n dynamicSlope: firstSeries.dynamicSlope,\n segmentSpacing: firstSeries.segmentSpacing,\n highlight: firstSeries.highlight\n });\n\n this.appendChart(funnelChart);\n },\n\n appendChart: function(chart, pane) {\n PlotAreaBase.fn.appendChart.call(this, chart, pane);\n append(this.options.legend.items, chart.legendItems);\n }\n});\n\n// Linear color scale from the given color to white minus minimum lightness offset.\nvar colorScale = function (color, minLightnessOffset) {\n if (minLightnessOffset === void 0) { minLightnessOffset = 0.05; }\n\n var baseColor = kendo.parseColor(color);\n var offset = 1 - minLightnessOffset;\n\n return function (value) {\n var hsl = baseColor.toHSL();\n var range = 100 - hsl.l;\n var point = offset - value;\n hsl.l += Math.min(point * range, range);\n\n return hsl.toCss();\n };\n};\n\nvar HeatmapPoint = ChartElement.extend({\n init: function(value, options) {\n ChartElement.fn.init.call(this);\n\n this.options = options;\n this.color = options.color || WHITE;\n this.value = value;\n },\n\n render: function() {\n if (this._rendered) {\n return;\n }\n\n this._rendered = true;\n\n this.createMarker();\n this.createLabel();\n this.createNote();\n },\n\n createLabel: function() {\n var options = this.options;\n var labels = options.labels;\n\n if (labels.visible) {\n var pointData = this.pointData();\n var labelTemplate = getTemplate(labels);\n var labelText;\n var labelColor = labels.color;\n\n if (labelTemplate) {\n labelText = labelTemplate(pointData);\n } else {\n labelText = this.formatValue(labels.format);\n }\n\n if (!labelColor) {\n labelColor = dataviz.autoTextColor(this.color);\n }\n\n this.label = new TextBox(labelText,\n deepExtend({\n align: CENTER,\n vAlign: CENTER,\n margin: {\n left: 5,\n right: 5\n },\n zIndex: valueOrDefault(labels.zIndex, this.series.zIndex)\n },\n labels, {\n color: labelColor\n }),\n pointData\n );\n this.append(this.label);\n }\n },\n\n formatValue: function(format) {\n return this.owner.formatPointValue(this, format);\n },\n\n reflow: function(targetBox) {\n this.render();\n\n var label = this.label;\n\n this.box = targetBox;\n\n if (label) {\n label.reflow(this.markerBox());\n }\n\n if (this.note) {\n this.note.reflow(targetBox);\n }\n\n this.marker.reflow(this.markerBox());\n },\n\n markerBox: function() {\n var options = this.options;\n var markers = options.markers;\n var border = markers.border;\n var rect = this.box.toRect();\n var type = valueOrDefault(markers.type, 'rect');\n var isRoundRect = type === datavizConstants.ROUNDED_RECT;\n var borderWidth = valueOrDefault(border.width, isRoundRect ? 1 : 0);\n var halfBorderWidth = Math.round(borderWidth / 2);\n\n if (markers.size) {\n var center = rect.center();\n rect.size.width = rect.size.height = markers.size;\n rect.origin.x = Math.round(center.x - rect.size.width / 2);\n rect.origin.y = Math.round(center.y - rect.size.height / 2);\n }\n\n rect.size.width -= borderWidth;\n rect.size.height -= borderWidth;\n rect.origin.y += halfBorderWidth + 0.5;\n rect.origin.x += halfBorderWidth + 0.5;\n\n return dataviz.rectToBox(rect);\n },\n\n markerBorder: function() {\n var options = this.options;\n var markers = options.markers;\n var border = markers.border;\n var opacity = valueOrDefault(border.opacity, options.opacity);\n\n return {\n color: border.color || this.color,\n width: border.width,\n opacity: opacity,\n dashType: border.dashType\n };\n },\n\n createMarker: function() {\n var options = this.options;\n var markerOptions = options.markers;\n var marker = new ShapeElement({\n type: valueOrDefault(markerOptions.type, 'rect'),\n width: markerOptions.size,\n height: markerOptions.size,\n rotation: markerOptions.rotation,\n background: this.color,\n border: this.markerBorder(),\n borderRadius: markerOptions.borderRadius,\n opacity: this.series.opacity || options.opacity,\n zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n animation: options.animation,\n visual: options.visual\n }, {\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n category: this.category\n });\n\n this.marker = marker;\n this.append(marker);\n },\n\n createHighlight: function(style) {\n var options = this.options;\n var markerOptions = this.options.highlight.markers || this.options.markers;\n\n var highlight = new ShapeElement({\n type: valueOrDefault(markerOptions.type, 'rect'),\n width: markerOptions.size,\n height: markerOptions.size,\n rotation: markerOptions.rotation,\n background: markerOptions.color || this.color,\n border: this.markerBorder(),\n borderRadius: markerOptions.borderRadius,\n opacity: this.series.opacity || options.opacity,\n zIndex: valueOrDefault(options.zIndex, this.series.zIndex)\n });\n\n highlight.reflow(this.markerBox());\n var visual = highlight.getElement();\n\n visual.options.fill = style.fill;\n visual.options.stroke = style.stroke;\n\n return visual;\n },\n\n highlightVisual: function() {\n return this.rectVisual;\n },\n\n highlightVisualArgs: function() {\n return {\n options: this.options,\n rect: this.box.toRect(),\n visual: this.rectVisual\n };\n },\n\n tooltipAnchor: function() {\n var left = this.box.center().x;\n var top = this.box.y1 - TOOLTIP_OFFSET;\n\n return {\n point: new Point(left, top),\n align: {\n horizontal: CENTER,\n vertical: BOTTOM\n }\n };\n },\n\n overlapsBox: function(box) {\n return this.box.overlaps(box);\n },\n\n unclipElements: function() {\n /* noop, clip labels */\n },\n\n pointData: function() {\n return {\n x: this.value.x,\n y: this.value.y,\n value: this.value.value,\n dataItem: this.dataItem,\n series: this.series\n };\n }\n});\n\ndeepExtend(HeatmapPoint.prototype, PointEventsMixin);\ndeepExtend(HeatmapPoint.prototype, NoteMixin);\n\nHeatmapPoint.prototype.defaults = {\n markers: {\n type: 'rect',\n borderRadius: 4,\n border: {\n color: 'transparent'\n }\n },\n padding: { top: 1 },\n labels: {\n visible: false,\n padding: 3\n },\n opacity: 1,\n notes: {\n label: {}\n }\n};\n\nvar HeatmapChart = ChartElement.extend({\n init: function(plotArea, options) {\n ChartElement.fn.init.call(this, options);\n\n this.plotArea = plotArea;\n this.chartService = plotArea.chartService;\n this._initFields();\n\n this.render();\n },\n\n _initFields: function() {\n this.points = [];\n this.seriesOptions = [];\n this.valueRange = { min: MAX_VALUE, max: MIN_VALUE };\n this._evalSeries = [];\n },\n\n render: function() {\n this.setRange();\n this.traverseDataPoints(this.addValue.bind(this));\n },\n\n setRange: function() {\n var this$1 = this;\n\n var ref = this;\n var series = ref.options.series;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n\n for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n var ref$1 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n var valueFields = ref$1.valueFields;\n if (defined(valueFields.value) && valueFields.value !== null) {\n this$1.valueRange.min = Math.min(this$1.valueRange.min, valueFields.value);\n this$1.valueRange.max = Math.max(this$1.valueRange.max, valueFields.value);\n }\n }\n }\n },\n\n addValue: function(value, fields) {\n var point;\n if (value && defined(value.value) && value.value !== null) {\n point = this.createPoint(value, fields);\n if (point) {\n $.extend(point, fields);\n }\n }\n\n this.points.push(point);\n },\n\n evalPointOptions: function(options, value, fields) {\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var state = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, options);\n evalOptions(pointOptions, {\n value: value,\n series: series,\n dataItem: fields.dataItem,\n min: this.valueRange.min,\n max: this.valueRange.max\n }, state);\n }\n\n return pointOptions;\n },\n\n pointType: function() {\n return HeatmapPoint;\n },\n\n pointOptions: function(series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().prototype.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n markers: {\n opacity: series.opacity\n },\n tooltip: {\n format: this.options.tooltip.format\n },\n labels: {\n format: this.options.labels.format\n }\n }, series);\n }\n\n return options;\n },\n\n createPoint: function(value, fields) {\n var series = fields.series;\n var pointOptions = this.pointOptions(series, fields.seriesIx);\n var color = fields.color || series.color;\n\n pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n } else if (this.valueRange.max !== 0) {\n var scale = colorScale(color);\n color = scale(value.value / this.valueRange.max);\n }\n\n var point = new HeatmapPoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n seriesAxes: function(series) {\n var xAxisName = series.xAxis;\n var yAxisName = series.yAxis;\n var plotArea = this.plotArea;\n var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n if (!xAxis) {\n throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n }\n\n if (!yAxis) {\n throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n }\n\n return { xAxis: xAxis, yAxis: yAxis };\n },\n\n reflow: function(targetBox) {\n var this$1 = this;\n\n var chartPoints = this.points;\n var limit = !this.options.clip;\n var pointIx = 0;\n\n this.traverseDataPoints(function (value, fields) {\n var point = chartPoints[pointIx++];\n var ref = this$1.seriesAxes(fields.series);\n var xAxis = ref.xAxis;\n var yAxis = ref.yAxis;\n var indexX = xAxis.categoryIndex(value.x);\n var indexY = yAxis.categoryIndex(value.y);\n var slotX = xAxis.getSlot(indexX, indexX, limit);\n var slotY = yAxis.getSlot(indexY, indexY, limit);\n\n if (point) {\n if (slotX && slotY) {\n var pointSlot = this$1.pointSlot(slotX, slotY);\n point.reflow(pointSlot);\n } else {\n point.visible = false;\n }\n }\n });\n\n this.box = targetBox;\n },\n\n pointSlot: function(slotX, slotY) {\n return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n },\n\n traverseDataPoints: function(callback) {\n var this$1 = this;\n\n var ref = this;\n var series = ref.options.series;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var ref$1 = this$1.seriesAxes(currentSeries);\n var xAxis = ref$1.xAxis;\n var yAxis = ref$1.yAxis;\n var xRange = xAxis.currentRangeIndices();\n var yRange = yAxis.currentRangeIndices();\n\n for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n var ref$2 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n var value = ref$2.valueFields;\n var fields = ref$2.fields;\n var xIndex = xAxis.totalIndex(value.x);\n var yIndex = yAxis.totalIndex(value.y);\n var xIn = xRange.min <= xIndex && xIndex <= xRange.max;\n var yIn = yRange.min <= yIndex && yIndex <= yRange.max;\n\n if (xIn && yIn) {\n callback(value, deepExtend({\n pointIx: pointIx,\n series: currentSeries,\n seriesIx: seriesIx,\n dataItem: currentSeries.data[pointIx],\n owner: this$1\n }, fields));\n }\n }\n }\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n return this.chartService.format.auto(format, value.x, value.y, value.value);\n },\n\n animationPoints: function() {\n var points = this.points;\n var result = [];\n for (var idx = 0; idx < points.length; idx++) {\n result.push((points[idx] || {}).marker);\n }\n return result;\n }\n});\nsetDefaultOptions(HeatmapChart, {\n series: [],\n tooltip: {\n format: \"{0}, {1}: {2}\"\n },\n labels: {\n format: \"{2}\"\n },\n clip: true\n});\ndeepExtend(HeatmapChart.prototype, {\n _bindPoint: CategoricalChart.prototype._bindPoint\n});\n\nvar HeatmapPlotArea = PlotAreaBase.extend({\n initFields: function() {\n this.namedXAxes = {};\n this.namedYAxes = {};\n },\n\n render: function(panes) {\n if (panes === void 0) { panes = this.panes; }\n\n this.bindCategories();\n this.createAxes(panes);\n this.createCharts(panes);\n this.createAxisLabels();\n },\n\n bindCategories: function() {\n var this$1 = this;\n\n var series = this.srcSeries || this.series;\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n var data = currentSeries.data || [];\n var ref = this$1.seriesAxes(currentSeries);\n var xAxis = ref.xAxis;\n var yAxis = ref.yAxis;\n\n var xCategories = dataviz.createHashSet(xAxis.categories || []);\n var yCategories = dataviz.createHashSet(yAxis.categories || []);\n\n for (var pointIndex = 0; pointIndex < data.length; pointIndex++) {\n var ref$1 = SeriesBinder.current.bindPoint(currentSeries, pointIndex).valueFields;\n var x = ref$1.x;\n var y = ref$1.y;\n\n if (!xCategories.has(x)) {\n xCategories.add(x);\n }\n\n if (!yCategories.has(y)) {\n yCategories.add(y);\n }\n }\n\n xAxis.categories = xCategories.values();\n yAxis.categories = yCategories.values();\n }\n },\n\n createCharts: function(panes) {\n var this$1 = this;\n\n var seriesByPane = this.groupSeriesByPane();\n\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n this$1.addToLegend(paneSeries);\n var filteredSeries = this$1.filterVisibleSeries(paneSeries);\n\n if (!filteredSeries) {\n continue;\n }\n\n this$1.createHeatmapChart(\n filterSeriesByType(filteredSeries, [ HEATMAP ]),\n pane\n );\n }\n },\n\n createHeatmapChart: function(series, pane) {\n var chart = new HeatmapChart(this, {\n series: series\n });\n\n this.appendChart(chart, pane);\n },\n\n seriesPaneName: function(series) {\n var options = this.options;\n var xAxisName = series.xAxis;\n var xAxisOptions = [].concat(options.xAxis);\n var xAxis = grep(xAxisOptions, function(a) { return a.name === xAxisName; })[0];\n var yAxisName = series.yAxis;\n var yAxisOptions = [].concat(options.yAxis);\n var yAxis = grep(yAxisOptions, function(a) { return a.name === yAxisName; })[0];\n var panes = options.panes || [ {} ];\n var defaultPaneName = panes[0].name || \"default\";\n var paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n\n return paneName;\n },\n\n seriesAxes: function(series) {\n var xAxis;\n var yAxis;\n\n var options = this.options;\n\n var xAxisOptions = [].concat(options.xAxis);\n var xAxisName = series.xAxis;\n if (xAxisName) {\n xAxis = xAxisOptions.find(function (axis) { return axis.name === xAxisName; });\n } else {\n xAxis = xAxisOptions[0];\n }\n\n var yAxisOptions = [].concat(options.yAxis);\n var yAxisName = series.yAxis;\n if (yAxisName) {\n yAxis = yAxisOptions.find(function (axis) { return axis.name === yAxisName; });\n } else {\n yAxis = yAxisOptions[0];\n }\n\n if (!xAxis) {\n throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n }\n\n if (!yAxis) {\n throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n }\n\n return { xAxis: xAxis, yAxis: yAxis };\n },\n\n createAxisLabels: function() {\n var axes = this.axes;\n for (var i = 0; i < axes.length; i++) {\n axes[i].createLabels();\n }\n },\n\n createXYAxis: function(options, vertical, axisIndex) {\n var axisName = options.name;\n var namedAxes = vertical ? this.namedYAxes : this.namedXAxes;\n var axisOptions = $.extend({\n axisCrossingValue: 0\n }, options, {\n vertical: vertical,\n reverse: (vertical || this.chartService.rtl) ? !options.reverse : options.reverse,\n justified: false\n });\n var firstCategory = axisOptions.categories ? axisOptions.categories[0] : null;\n var typeSamples = [ axisOptions.min, axisOptions.max, firstCategory ];\n var series = this.series;\n\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var seriesAxisName = currentSeries[vertical ? \"yAxis\" : \"xAxis\"];\n if ((seriesAxisName === axisOptions.name) || (axisIndex === 0 && !seriesAxisName)) {\n var firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n typeSamples.push(firstPointValue[vertical ? \"y\" : \"x\"]);\n\n break;\n }\n }\n\n var inferredDate;\n\n for (var i = 0; i < typeSamples.length; i++) {\n if (typeSamples[i] instanceof Date) {\n inferredDate = true;\n break;\n }\n }\n\n var axisType;\n if (equalsIgnoreCase(axisOptions.type, DATE) || (!axisOptions.type && inferredDate)) {\n axisType = dataviz.DateCategoryAxis;\n } else {\n axisType = CategoryAxis;\n }\n\n var axis = new axisType(axisOptions, this.chartService);\n axis.axisIndex = axisIndex;\n\n if (axisName) {\n if (namedAxes[axisName]) {\n throw new Error(((vertical ? \"Y\" : \"X\") + \" axis with name \" + axisName + \" is already defined\"));\n }\n namedAxes[axisName] = axis;\n }\n\n this.appendAxis(axis);\n axis.mapCategories();\n\n return axis;\n },\n\n createAxes: function(panes) {\n var this$1 = this;\n\n var options = this.options;\n var xAxesOptions = [].concat(options.xAxis);\n var xAxes = [];\n var yAxesOptions = [].concat(options.yAxis);\n var yAxes = [];\n\n for (var idx = 0; idx < xAxesOptions.length; idx++) {\n var axisPane = this$1.findPane(xAxesOptions[idx].pane);\n if (inArray(axisPane, panes)) {\n xAxes.push(this$1.createXYAxis(xAxesOptions[idx], false, idx));\n }\n }\n\n for (var idx$1 = 0; idx$1 < yAxesOptions.length; idx$1++) {\n var axisPane$1 = this$1.findPane(yAxesOptions[idx$1].pane);\n if (inArray(axisPane$1, panes)) {\n yAxes.push(this$1.createXYAxis(yAxesOptions[idx$1], true, idx$1));\n }\n }\n\n this.axisX = this.axisX || xAxes[0];\n this.axisY = this.axisY || yAxes[0];\n },\n\n removeAxis: function(axis) {\n var axisName = axis.options.name;\n\n PlotAreaBase.fn.removeAxis.call(this, axis);\n\n if (axis.options.vertical) {\n delete this.namedYAxes[axisName];\n } else {\n delete this.namedXAxes[axisName];\n }\n\n if (axis === this.axisX) {\n delete this.axisX;\n }\n\n if (axis === this.axisY) {\n delete this.axisY;\n }\n },\n\n _dispatchEvent: function(chart, e, eventType) {\n var coords = chart._eventCoordinates(e);\n var point = new Point(coords.x, coords.y);\n var allAxes = this.axes;\n var length = allAxes.length;\n var xValues = [];\n var yValues = [];\n\n for (var i = 0; i < length; i++) {\n var axis = allAxes[i];\n var values = axis.options.vertical ? yValues : xValues;\n appendIfNotNull(values, axis.getCategory(point));\n }\n\n if (xValues.length > 0 && yValues.length > 0) {\n chart.trigger(eventType, {\n element: eventElement(e),\n originalEvent: e,\n x: singleItemOrArray(xValues),\n y: singleItemOrArray(yValues)\n });\n }\n },\n\n updateAxisOptions: function(axis, options) {\n var vertical = axis.options.vertical;\n var axes = this.groupAxes(this.panes);\n var index = (vertical ? axes.y : axes.x).indexOf(axis);\n\n updateAxisOptions$2(this.options, index, vertical, options);\n updateAxisOptions$2(this.originalOptions, index, vertical, options);\n },\n\n crosshairOptions: function(axis) {\n // Stack the crosshair above the series points.\n return $.extend({}, axis.options.crosshair, { zIndex: 0 });\n }\n});\n\nfunction updateAxisOptions$2(targetOptions, axisIndex, vertical, options) {\n var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n deepExtend(axisOptions, options);\n}\n\nsetDefaultOptions(HeatmapPlotArea, {\n xAxis: {},\n yAxis: {}\n});\n\ndeepExtend(HeatmapPlotArea.prototype, PlotAreaEventsMixin);\n\nvar COLOR = \"color\";\nvar FIRST = \"first\";\nvar FROM = \"from\";\nvar MAX = \"max\";\nvar MIN = \"min\";\nvar NOTE_TEXT = \"noteText\";\nvar SUMMARY_FIELD = \"summary\";\nvar TO = \"to\";\n\nPlotAreaFactory.current.register(CategoricalPlotArea, [\n BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA,\n CANDLESTICK, OHLC, BULLET, VERTICAL_BULLET, BOX_PLOT, VERTICAL_BOX_PLOT,\n RANGE_COLUMN, RANGE_BAR, WATERFALL, HORIZONTAL_WATERFALL, RANGE_AREA, VERTICAL_RANGE_AREA\n]);\n\nPlotAreaFactory.current.register(XYPlotArea, [\n SCATTER, SCATTER_LINE, BUBBLE\n]);\n\nPlotAreaFactory.current.register(PiePlotArea, [ PIE ]);\nPlotAreaFactory.current.register(DonutPlotArea, [ DONUT ]);\nPlotAreaFactory.current.register(FunnelPlotArea, [ FUNNEL ]);\n\nPlotAreaFactory.current.register(PolarPlotArea, [ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ]);\nPlotAreaFactory.current.register(RadarPlotArea, [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ]);\n\nPlotAreaFactory.current.register(HeatmapPlotArea, [ HEATMAP ]);\n\nSeriesBinder.current.register(\n [ BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA ],\n [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, ERROR_LOW_FIELD, ERROR_HIGH_FIELD ]\n);\n\nSeriesBinder.current.register(\n [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n [ FROM, TO ], [ CATEGORY, COLOR, NOTE_TEXT ]\n);\n\nSeriesBinder.current.register(\n [ WATERFALL, HORIZONTAL_WATERFALL ],\n [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, SUMMARY_FIELD ]\n);\n\nSeriesBinder.current.register([ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ], [ X, Y ], [ COLOR ]);\nSeriesBinder.current.register([ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ], [ VALUE ], [ COLOR ]);\n\nSeriesBinder.current.register(\n [ FUNNEL ],\n [ VALUE ], [ CATEGORY, COLOR, \"visibleInLegend\", \"visible\" ]\n);\n\nDefaultAggregates.current.register(\n [ BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA, WATERFALL, HORIZONTAL_WATERFALL ],\n { value: MAX, color: FIRST, noteText: FIRST, errorLow: MIN, errorHigh: MAX }\n);\n\nDefaultAggregates.current.register(\n [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n { from: MIN, to: MAX, color: FIRST, noteText: FIRST }\n);\n\nDefaultAggregates.current.register(\n [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ],\n { value: MAX, color: FIRST }\n);\n\nSeriesBinder.current.register(\n [ SCATTER, SCATTER_LINE, BUBBLE ],\n [ X, Y ], [ COLOR, NOTE_TEXT, X_ERROR_LOW_FIELD, X_ERROR_HIGH_FIELD, Y_ERROR_LOW_FIELD, Y_ERROR_HIGH_FIELD ]\n);\n\nSeriesBinder.current.register(\n [ BUBBLE ], [ X, Y, \"size\" ], [ COLOR, CATEGORY, NOTE_TEXT ]\n);\n\nSeriesBinder.current.register(\n [ HEATMAP ],\n [ X, Y, VALUE ], [ COLOR, NOTE_TEXT ]\n);\n\nSeriesBinder.current.register(\n [ CANDLESTICK, OHLC ],\n [ \"open\", \"high\", \"low\", \"close\" ], [ CATEGORY, COLOR, \"downColor\", NOTE_TEXT ]\n);\n\nDefaultAggregates.current.register(\n [ CANDLESTICK, OHLC ],\n { open: MAX, high: MAX, low: MIN, close: MAX,\n color: FIRST, downColor: FIRST, noteText: FIRST }\n);\n\nSeriesBinder.current.register(\n [ BOX_PLOT, VERTICAL_BOX_PLOT ],\n [ \"lower\", \"q1\", \"median\", \"q3\", \"upper\", \"mean\", \"outliers\" ], [ CATEGORY, COLOR, NOTE_TEXT ]\n);\n\nDefaultAggregates.current.register(\n [ BOX_PLOT, VERTICAL_BOX_PLOT ],\n { lower: MAX, q1: MAX, median: MAX, q3: MAX, upper: MAX, mean: MAX, outliers: FIRST,\n color: FIRST, noteText: FIRST }\n);\n\nSeriesBinder.current.register(\n [ BULLET, VERTICAL_BULLET ],\n [ \"current\", \"target\" ], [ CATEGORY, COLOR, \"visibleInLegend\", NOTE_TEXT ]\n);\n\nDefaultAggregates.current.register(\n [ BULLET, VERTICAL_BULLET ],\n { current: MAX, target: MAX, color: FIRST, noteText: FIRST }\n);\n\nSeriesBinder.current.register(\n [ PIE, DONUT ],\n [ VALUE ], [ CATEGORY, COLOR, \"explode\", \"visibleInLegend\", \"visible\" ]\n);\n\nvar AXIS_NAMES = [ CATEGORY, VALUE, X, Y ];\n\nvar MOUSEMOVE = \"mousemove\";\nvar CONTEXTMENU = \"contextmenu\";\nvar MOUSELEAVE = \"mouseleave\";\nvar MOUSEMOVE_DELAY = 20;\n\nvar Chart = Class.extend({\n init: function(element, userOptions, themeOptions, context) {\n var this$1 = this;\n if (context === void 0) { context = {}; }\n\n this.observers = [];\n this.addObserver(context.observer);\n this.chartService = new services.ChartService(this, context);\n this.chartService.theme = themeOptions;\n\n this._initElement(element);\n\n var options = deepExtend({}, this.options, userOptions);\n this._originalOptions = deepExtend({}, options);\n this._theme = themeOptions;\n this._initTheme(options, themeOptions);\n\n this._initHandlers();\n this._initSurface();\n\n this.bindCategories();\n dataviz.FontLoader.preloadFonts(userOptions, function () {\n this$1.fontLoaded = true;\n if (!this$1._destroyed) {\n this$1.trigger('init');\n this$1._redraw();\n this$1._attachEvents();\n }\n });\n },\n\n _initElement: function(element) {\n this._setElementClass(element);\n element.style.position = \"relative\";\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n this.element = element;\n },\n\n _setElementClass: function(element) {\n dataviz.addClass(element, \"k-chart\");\n },\n\n _initTheme: function(options, themeOptions) {\n var seriesCopies = [];\n var series = options.series || [];\n\n for (var i = 0; i < series.length; i++) {\n seriesCopies.push($.extend({}, series[i]));\n }\n options.series = seriesCopies;\n\n resolveAxisAliases(options);\n this.applyDefaults(options, themeOptions);\n\n // Clean up default if not overriden by data attributes\n if (options.seriesColors === null) {\n delete options.seriesColors;\n }\n\n this.options = deepExtend({}, themeOptions, options);\n this.applySeriesColors();\n },\n\n getSize: function() {\n var chartArea = this.options.chartArea || {};\n var width = chartArea.width ? parseInt(chartArea.width, 10) : Math.floor(this.element.offsetWidth);\n var height = chartArea.height ? parseInt(chartArea.height, 10) : Math.floor(this.element.offsetHeight);\n\n return {\n width: width,\n height: height\n };\n },\n\n resize: function(force) {\n var size = this.getSize();\n var currentSize = this._size;\n var hasSize = size.width > 0 || size.height > 0;\n\n if (force || hasSize && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this._size = size;\n this._resize(size, force);\n this.trigger(\"resize\", size);\n } else if (hasSize && this._selections && dataviz.find(this._selections, function (s) { return !s.visible; })) {\n this._destroySelections();\n this._setupSelection();\n }\n },\n\n _resize: function() {\n this._noTransitionsRedraw();\n },\n\n redraw: function(paneName) {\n this.applyDefaults(this.options);\n this.applySeriesColors();\n\n if (paneName) {\n var plotArea = this._model._plotArea;\n var pane = plotArea.findPane(paneName);\n plotArea.redraw(pane);\n } else {\n this._redraw();\n }\n },\n\n getAxis: function(name) {\n return findAxisByName(name, this._plotArea.axes);\n },\n\n findAxisByName: function(name) {\n return this.getAxis(name);\n },\n\n findPaneByName: function(name) {\n var panes = this._plotArea.panes;\n\n for (var idx = 0; idx < panes.length; idx++) {\n if (panes[idx].options.name === name) {\n return new ChartPane(panes[idx]);\n }\n }\n },\n\n findPaneByIndex: function(idx) {\n var panes = this._plotArea.panes;\n if (panes[idx]) {\n return new ChartPane(panes[idx]);\n }\n },\n\n plotArea: function() {\n return new ChartPlotArea(this._plotArea);\n },\n\n toggleHighlight: function(show, filter) {\n var plotArea = this._plotArea;\n var firstSeries = (plotArea.srcSeries || plotArea.series || [])[0];\n var points;\n\n if (isFunction(filter)) {\n points = plotArea.filterPoints(filter);\n } else {\n var seriesName, categoryName;\n if (isObject(filter)) {\n seriesName = filter.series;\n categoryName = filter.category;\n } else {\n seriesName = categoryName = filter;\n }\n\n if (firstSeries.type === DONUT) {\n points = pointByCategoryName(plotArea.pointsBySeriesName(seriesName), categoryName);\n } else if (firstSeries.type === PIE || firstSeries.type === FUNNEL) {\n points = pointByCategoryName((plotArea.charts[0] || {}).points, categoryName);\n } else {\n points = plotArea.pointsBySeriesName(seriesName);\n }\n }\n\n if (points) {\n this.togglePointsHighlight(show, points);\n }\n },\n\n togglePointsHighlight: function(show, points) {\n var highlight = this._highlight;\n for (var idx = 0; idx < points.length; idx++) {\n highlight.togglePointHighlight(points[idx], show);\n }\n },\n\n showTooltip: function(filter) {\n var shared = this._sharedTooltip();\n var ref = this;\n var tooltip = ref._tooltip;\n var plotArea = ref._plotArea;\n var point, categoryIndex;\n\n if (isFunction(filter)) {\n point = plotArea.findPoint(filter);\n if (point && shared) {\n categoryIndex = point.categoryIx;\n }\n } else if (shared && defined(filter)) {\n categoryIndex = plotArea.categoryAxis.categoryIndex(filter);\n }\n\n if (shared) {\n if (categoryIndex >= 0) {\n var points = this._plotArea.pointsByCategoryIndex(categoryIndex);\n tooltip.showAt(points);\n }\n } else if (point) {\n tooltip.show(point);\n }\n },\n\n hideTooltip: function() {\n this._tooltip.hide();\n },\n\n _initSurface: function() {\n var surface = this.surface;\n var wrap = this._surfaceWrap();\n\n var chartArea = this.options.chartArea || {};\n if (chartArea.width) {\n dataviz.elementSize(wrap, { width: chartArea.width });\n }\n if (chartArea.height) {\n dataviz.elementSize(wrap, { height: chartArea.height });\n }\n\n if (!surface || surface.options.type !== this.options.renderAs) {\n this._destroySurface();\n\n this.surface = drawing.Surface.create(wrap, {\n type: this.options.renderAs\n });\n\n this.surface.bind(\"mouseenter\", this._surfaceMouseenterHandler);\n this.surface.bind(\"mouseleave\", this._surfaceMouseleaveHandler);\n\n } else {\n this.surface.clear();\n this.surface.resize();\n }\n },\n\n _surfaceWrap: function() {\n return this.element;\n },\n\n _redraw: function() {\n var model = this._getModel();\n this._size = {\n width: model.options.width,\n height: model.options.height\n };\n\n this._destroyView();\n\n this._model = model;\n this._plotArea = model._plotArea;\n\n model.renderVisual();\n\n if (this.options.transitions !== false) {\n model.traverse(function(element) {\n if (element.animation) {\n element.animation.setup();\n }\n });\n }\n\n this._initSurface();\n this.surface.draw(model.visual);\n\n if (this.options.transitions !== false) {\n model.traverse(function(element) {\n if (element.animation) {\n element.animation.play();\n }\n });\n }\n\n this._tooltip = this._createTooltip();\n this._highlight = new Highlight();\n this._setupSelection();\n this._createPannable();\n this._createZoomSelection();\n this._createMousewheelZoom();\n\n this.trigger(RENDER);\n triggerPaneRender(this._plotArea.panes);\n\n if (!this._navState) {\n this._cancelDomEvents();\n }\n },\n\n exportVisual: function(exportOptions) {\n var visual;\n if (exportOptions && (exportOptions.width || exportOptions.height || exportOptions.options)) {\n var currentOptions = this.options;\n var options = deepExtend({}, exportOptions.options, {\n chartArea: {\n width: exportOptions.width,\n height: exportOptions.height\n }\n });\n\n clearMissingValues(this._originalOptions, options);\n this.options = deepExtend({}, this._originalOptions, options);\n this._initTheme(this.options, this._theme);\n this.bindCategories();\n\n var model = this._getModel();\n\n model.renderVisual();\n triggerPaneRender(model._plotArea.panes);\n\n visual = model.visual;\n\n this.options = currentOptions;\n } else {\n visual = this.surface.exportVisual();\n }\n\n return visual;\n },\n\n _sharedTooltip: function() {\n return this._plotArea instanceof CategoricalPlotArea && this.options.tooltip && this.options.tooltip.shared;\n },\n\n _createPannable: function() {\n var options = this.options;\n if (options.pannable !== false) {\n this._pannable = new Pannable(this._plotArea, options.pannable);\n }\n },\n\n _createZoomSelection: function() {\n var zoomable = this.options.zoomable;\n var selection = (zoomable || {}).selection;\n if (zoomable !== false && selection !== false) {\n this._zoomSelection = new ZoomSelection(this, selection);\n }\n },\n\n _createMousewheelZoom: function() {\n var zoomable = this.options.zoomable;\n var mousewheel = (zoomable || {}).mousewheel;\n if (zoomable !== false && mousewheel !== false) {\n this._mousewheelZoom = new MousewheelZoom(this, mousewheel);\n }\n },\n\n _toggleDragZoomEvents: function() {\n var pannable = this.options.pannable;\n var zoomable = this.options.zoomable;\n var selection = (zoomable || {}).selection;\n var mousewheel = (zoomable || {}).mousewheel;\n var allowDrag = !pannable && (zoomable === false || selection === false) && !this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ]);\n var allowZoom = (zoomable === false || mousewheel === false) && !this.requiresHandlers([ ZOOM_START, ZOOM, ZOOM_END ]);\n var element = this.element;\n\n if (this._dragZoomEnabled && allowDrag && allowZoom) {\n element.style.touchAction = this._touchAction || '';\n this._dragZoomEnabled = false;\n } else if (!this._dragZoomEnabled && !(allowDrag && allowZoom)) {\n element.style.touchAction = \"none\";\n\n this._dragZoomEnabled = true;\n }\n\n this._toggleDomEvents(!allowDrag, !allowZoom);\n },\n\n _toggleDomEvents: function(drag, zoom) {\n var domEvents = this.domEvents;\n if (!domEvents) {\n return;\n }\n\n if (domEvents.toggleDrag) {\n domEvents.toggleDrag(drag);\n }\n\n if (domEvents.toggleZoom) {\n domEvents.toggleZoom(zoom);\n }\n },\n\n _createTooltip: function() {\n var ref = this;\n var tooltipOptions = ref.options.tooltip;\n var tooltip;\n\n if (this._sharedTooltip()) {\n tooltip = this._createSharedTooltip(tooltipOptions);\n } else {\n tooltip = new Tooltip(this.chartService, tooltipOptions);\n }\n\n return tooltip;\n },\n\n _createSharedTooltip: function(options) {\n return new SharedTooltip(this._plotArea, options);\n },\n\n applyDefaults: function(options, themeOptions) {\n applyAxisDefaults(options, themeOptions);\n applySeriesDefaults(options, themeOptions);\n },\n\n applySeriesColors: function() {\n var options = this.options;\n var series = options.series;\n var colors = options.seriesColors || [];\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n var seriesColor = colors[i % colors.length];\n var defaults = currentSeries._defaults;\n\n currentSeries.color = currentSeries.color || seriesColor;\n if (defaults) {\n defaults.color = defaults.color || seriesColor;\n }\n }\n },\n\n _getModel: function() {\n var options = this.options;\n var plotArea = this._createPlotArea();\n var model = new dataviz.RootElement(this._modelOptions());\n model.chart = this;\n model._plotArea = plotArea;\n\n dataviz.Title.buildTitle(options.title, model);\n\n if (options.legend && options.legend.visible) {\n model.append(new Legend(plotArea.options.legend, this.chartService));\n }\n model.append(plotArea);\n model.reflow();\n\n return model;\n },\n\n _modelOptions: function() {\n var options = this.options;\n var size = this.getSize();\n\n return deepExtend({\n transitions: options.transitions,\n width: size.width || datavizConstants.DEFAULT_WIDTH,\n height: size.height || datavizConstants.DEFAULT_HEIGHT\n }, options.chartArea);\n },\n\n _createPlotArea: function(skipSeries) {\n var options = this.options;\n\n var plotArea = PlotAreaFactory.current.create(skipSeries ? [] : options.series, options, this.chartService);\n\n return plotArea;\n },\n\n _setupSelection: function() {\n var this$1 = this;\n\n var ref = this;\n var axes = ref._plotArea.axes;\n var selections = this._selections = [];\n\n for (var i = 0; i < axes.length; i++) {\n var axis = axes[i];\n var options = axis.options;\n if (axis instanceof CategoryAxis && options.select && !options.vertical) {\n var range = axis.range();\n\n var selection = new Selection(this$1, axis,\n deepExtend({ min: range.min, max: range.max }, options.select)\n );\n\n selections.push(selection);\n }\n }\n },\n\n _selectStart: function(e) {\n return this.trigger(SELECT_START, e);\n },\n\n _select: function(e) {\n return this.trigger(SELECT, e);\n },\n\n _selectEnd: function(e) {\n return this.trigger(SELECT_END, e);\n },\n\n _initHandlers: function() {\n this._clickHandler = this._click.bind(this);\n this._mousewheelHandler = this._mousewheel.bind(this);\n this._mouseleaveHandler = this._mouseleave.bind(this);\n this._surfaceMouseenterHandler = this._mouseover.bind(this);\n this._surfaceMouseleaveHandler = this._mouseout.bind(this);\n\n this._mousemove = kendo.throttle(\n this._mousemove.bind(this),\n MOUSEMOVE_DELAY\n );\n },\n\n addObserver: function(observer) {\n if (observer) {\n this.observers.push(observer);\n }\n },\n\n removeObserver: function(observer) {\n var index = this.observers.indexOf(observer);\n if (index >= 0) {\n this.observers.splice(index, 1);\n }\n },\n\n requiresHandlers: function(eventNames) {\n var observers = this.observers;\n for (var idx = 0; idx < observers.length; idx++) {\n if (observers[idx].requiresHandlers(eventNames)) {\n return true;\n }\n }\n },\n\n trigger: function(name, args) {\n if (args === void 0) { args = {}; }\n\n if (name === SHOW_TOOLTIP) {\n args.anchor.point = this._toDocumentCoordinates(args.anchor.point);\n }\n args.sender = this;\n\n var observers = this.observers;\n var isDefaultPrevented = false;\n for (var idx = 0; idx < observers.length; idx++) {\n if (observers[idx].trigger(name, args)) {\n isDefaultPrevented = true;\n }\n }\n\n return isDefaultPrevented;\n },\n\n _attachEvents: function() {\n var element = this.element;\n\n this._touchAction = element.style.touchAction;\n\n var obj;\n bindEvents(element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n if (this._shouldAttachMouseMove()) {\n var obj$1;\n bindEvents(element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n }\n\n this.domEvents = services.DomEventsBuilder.create(this.element, {\n start: this._start.bind(this),\n move: this._move.bind(this),\n end: this._end.bind(this),\n tap: this._tap.bind(this),\n gesturestart: this._gesturestart.bind(this),\n gesturechange: this._gesturechange.bind(this),\n gestureend: this._gestureend.bind(this)\n });\n\n this._toggleDragZoomEvents();\n },\n\n _mouseleave: function(e) {\n if (this._hoveredPoint) {\n this._hoveredPoint.out(this, e);\n this._hoveredPoint = null;\n }\n\n if (this._plotArea.hovered) {\n this.trigger(PLOT_AREA_LEAVE);\n this._plotArea.hovered = false;\n }\n },\n\n _cancelDomEvents: function() {\n if (this.domEvents && this.domEvents.cancel) {\n this.domEvents.cancel();\n }\n },\n\n _gesturestart: function(e) {\n if (this._mousewheelZoom && !this._stopChartHandlers(e)) {\n this._gestureDistance = e.distance;\n this._unsetActivePoint();\n this.surface.suspendTracking();\n }\n },\n\n _gestureend: function(e) {\n if (this._zooming && !this._stopChartHandlers(e)) {\n if (this.surface) {\n this.surface.resumeTracking();\n }\n this._zooming = false;\n this.trigger(ZOOM_END, {});\n }\n },\n\n _gesturechange: function(e) {\n var mousewheelZoom = this._mousewheelZoom;\n\n if (mousewheelZoom && !this._stopChartHandlers(e)) {\n e.preventDefault();\n var previousGestureDistance = this._gestureDistance;\n var scaleDelta = -e.distance / previousGestureDistance + 1;\n\n if (Math.abs(scaleDelta) >= 0.1) {\n scaleDelta = Math.round(scaleDelta * 10);\n\n this._gestureDistance = e.distance;\n var args = { delta: scaleDelta, axisRanges: axisRanges(this._plotArea.axes), originalEvent: e };\n if (this._zooming || !this.trigger(ZOOM_START, args)) {\n var coords = this._eventCoordinates(e);\n\n if (!this._zooming) {\n this._zooming = true;\n }\n\n var ranges = args.axisRanges = mousewheelZoom.updateRanges(scaleDelta, coords);\n if (ranges && !this.trigger(ZOOM, args)) {\n mousewheelZoom.zoom();\n }\n }\n }\n }\n },\n\n _mouseout: function(e) {\n if (e.element) {\n var element = this._drawingChartElement(e.element, e);\n\n if (element && element.leave) {\n element.leave(this, e.originalEvent);\n }\n }\n },\n\n _start: function(e) {\n var coords = this._eventCoordinates(e);\n\n if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n return;\n }\n\n if (this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ])) {\n this._startNavigation(e, coords, DRAG_START);\n }\n\n if (this._pannable && this._pannable.start(e)) {\n this.surface.suspendTracking();\n this._unsetActivePoint();\n this._suppressHover = true;\n this.chartService.panning = true;\n }\n\n if (this._zoomSelection) {\n if (this._zoomSelection.start(e)) {\n this.trigger(ZOOM_START, { axisRanges: axisRanges(this._plotArea.axes), originalEvent: e });\n }\n }\n },\n\n _move: function(e) {\n var ref = this;\n var state = ref._navState;\n var pannable = ref._pannable;\n\n if (this._stopChartHandlers(e)) {\n return;\n }\n\n if (pannable) {\n var ranges = pannable.move(e);\n\n if (ranges && !this.trigger(DRAG, { axisRanges: ranges, originalEvent: e })) {\n pannable.pan();\n }\n } else if (state) {\n var ranges$1 = {};\n var axes = state.axes;\n\n for (var i = 0; i < axes.length; i++) {\n var currentAxis = axes[i];\n var axisName = currentAxis.options.name;\n if (axisName) {\n var axis = currentAxis.options.vertical ? e.y : e.x;\n var delta = axis.startLocation - axis.location;\n\n if (delta !== 0) {\n ranges$1[currentAxis.options.name] = currentAxis.translateRange(delta);\n }\n }\n }\n\n state.axisRanges = ranges$1;\n this.trigger(DRAG, {\n axisRanges: ranges$1,\n originalEvent: e\n });\n }\n\n if (this._zoomSelection) {\n this._zoomSelection.move(e);\n }\n },\n\n _end: function(e) {\n if (this._stopChartHandlers(e)) {\n return;\n }\n\n var pannable = this._pannable;\n if (pannable && pannable.end(e)) {\n this.surface.resumeTracking();\n this.trigger(DRAG_END, {\n axisRanges: axisRanges(this._plotArea.axes),\n originalEvent: e\n });\n this._suppressHover = false;\n this.chartService.panning = false;\n } else {\n this._endNavigation(e, DRAG_END);\n }\n\n if (this._zoomSelection) {\n var ranges = this._zoomSelection.end(e);\n if (ranges && !this.trigger(ZOOM, { axisRanges: ranges, originalEvent: e })) {\n this._zoomSelection.zoom();\n this.trigger(ZOOM_END, { axisRanges: ranges, originalEvent: e });\n }\n }\n },\n\n _stopChartHandlers: function(e) {\n var selections = this._selections || [];\n if (!selections.length) {\n return false;\n }\n\n var coords = this._eventCoordinates(e);\n var pane = this._plotArea.paneByPoint(coords);\n if (pane) {\n for (var idx = 0; idx < selections.length; idx++) {\n if (selections[idx].onPane(pane)) {\n return true;\n }\n }\n }\n },\n\n _mousewheelZoomRate: function() {\n var zoomable = this.options.zoomable;\n var mousewheel = (zoomable || {}).mousewheel || {};\n return valueOrDefault(mousewheel.rate, MOUSEWHEEL_ZOOM_RATE);\n },\n\n _mousewheel: function(e) {\n var this$1 = this;\n\n var delta = dataviz.mousewheelDelta(e);\n var mousewheelZoom = this._mousewheelZoom;\n var coords = this._eventCoordinates(e);\n\n if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n return;\n }\n\n if (mousewheelZoom) {\n var args = { delta: delta, axisRanges: axisRanges(this._plotArea.axes), originalEvent: e };\n if (this._zooming || !this.trigger(ZOOM_START, args)) {\n e.preventDefault();\n\n if (!this._zooming) {\n this._unsetActivePoint();\n this.surface.suspendTracking();\n this._zooming = true;\n }\n\n if (this._mwTimeout) {\n clearTimeout(this._mwTimeout);\n }\n\n args.axisRanges = mousewheelZoom.updateRanges(delta, coords);\n if (args.axisRanges && !this.trigger(ZOOM, args)) {\n mousewheelZoom.zoom();\n }\n\n this._mwTimeout = setTimeout(function () {\n this$1.trigger(ZOOM_END, args);\n this$1._zooming = false;\n if (this$1.surface) {\n this$1.surface.resumeTracking();\n }\n }, MOUSEWHEEL_DELAY);\n }\n } else {\n var state = this._navState;\n if (!state) {\n var prevented = this._startNavigation(e, coords, ZOOM_START);\n if (!prevented) {\n state = this._navState;\n }\n }\n\n if (state) {\n var totalDelta = state.totalDelta || delta;\n state.totalDelta = totalDelta + delta;\n\n var axes = this._navState.axes;\n var ranges = {};\n\n for (var i = 0; i < axes.length; i++) {\n var currentAxis = axes[i];\n var axisName = currentAxis.options.name;\n if (axisName) {\n ranges[axisName] = currentAxis.scaleRange(-totalDelta * this$1._mousewheelZoomRate(), coords);\n }\n }\n\n this.trigger(ZOOM, {\n delta: delta,\n axisRanges: ranges,\n originalEvent: e\n });\n\n if (this._mwTimeout) {\n clearTimeout(this._mwTimeout);\n }\n\n this._mwTimeout = setTimeout(function () {\n this$1._endNavigation(e, ZOOM_END);\n }, MOUSEWHEEL_DELAY);\n }\n }\n },\n\n _startNavigation: function(e, coords, chartEvent) {\n var plotArea = this._model._plotArea;\n var pane = plotArea.findPointPane(coords);\n var axes = plotArea.axes.slice(0);\n\n if (!pane) {\n return;\n }\n\n var ranges = axisRanges(axes);\n\n var prevented = this.trigger(chartEvent, {\n axisRanges: ranges,\n originalEvent: e\n });\n\n if (prevented) {\n this._cancelDomEvents();\n } else {\n this._suppressHover = true;\n this._unsetActivePoint();\n this._navState = {\n axisRanges: ranges,\n pane: pane,\n axes: axes\n };\n }\n },\n\n _endNavigation: function(e, chartEvent) {\n if (this._navState) {\n this.trigger(chartEvent, {\n axisRanges: this._navState.axisRanges,\n originalEvent: e\n });\n this._suppressHover = false;\n this._navState = null;\n }\n },\n\n _getChartElement: function(e, match) {\n var element = this.surface.eventTarget(e);\n if (element) {\n return this._drawingChartElement(element, e, match);\n }\n },\n\n _drawingChartElement: function(element, e, match) {\n var current = element;\n var chartElement;\n while (current && !chartElement) {\n chartElement = current.chartElement;\n current = current.parent;\n }\n\n if (chartElement) {\n if (chartElement.aliasFor) {\n chartElement = chartElement.aliasFor(e, this._eventCoordinates(e));\n }\n\n if (match) {\n chartElement = chartElement.closest(match);\n if (chartElement && chartElement.aliasFor) {\n chartElement = chartElement.aliasFor();\n }\n }\n\n return chartElement;\n }\n },\n\n _eventCoordinates: function(e) {\n var coordinates = dataviz.eventCoordinates(e);\n return this._toModelCoordinates(coordinates.x, coordinates.y);\n },\n\n _elementPadding: function() {\n if (!this._padding) {\n var ref = elementStyles(this.element, [ \"paddingLeft\", \"paddingTop\" ]);\n var paddingLeft = ref.paddingLeft;\n var paddingTop = ref.paddingTop;\n this._padding = {\n top: paddingTop,\n left: paddingLeft\n };\n }\n\n return this._padding;\n },\n\n _toDocumentCoordinates: function(point) {\n var padding = this._elementPadding();\n var offset = dataviz.elementOffset(this.element);\n\n return {\n left: round(point.x + padding.left + offset.left),\n top: round(point.y + padding.top + offset.top)\n };\n },\n\n _toModelCoordinates: function(clientX, clientY) {\n var element = this.element;\n var offset = dataviz.elementOffset(element);\n var padding = this._elementPadding();\n var inverseTransform = dataviz.elementScale(element).invert();\n var point = new GeometryPoint(\n clientX - offset.left - padding.left,\n clientY - offset.top - padding.top\n ).transform(inverseTransform);\n\n return new Point(point.x, point.y);\n },\n\n _tap: function(e) {\n var this$1 = this;\n\n var drawingElement = this.surface.eventTarget(e);\n var element = this._drawingChartElement(drawingElement, e);\n var sharedTooltip = this._sharedTooltip();\n\n if (!this._startHover(drawingElement, e) && !sharedTooltip) {\n this._unsetActivePoint();\n }\n\n if (sharedTooltip) {\n this._trackSharedTooltip(this._eventCoordinates(e), e, true);\n }\n\n this._propagateClick(element, e);\n\n //part of fix for hover issue on windows touch\n this.handlingTap = true;\n setTimeout(function () {\n this$1.handlingTap = false;\n }, 0);\n },\n\n _click: function(e) {\n var element = this._getChartElement(e);\n this._propagateClick(element, e);\n },\n\n _propagateClick: function(element, e) {\n var this$1 = this;\n\n var current = element;\n while (current) {\n if (current.click) {\n current.click(this$1, e);\n }\n\n current = current.parent;\n }\n },\n\n _startHover: function(element, e) {\n if (this._suppressHover) {\n return false;\n }\n\n var point = this._drawingChartElement(element, e, function(element) {\n return (element.hover || element.over) && !(element instanceof PlotAreaBase);\n });\n\n var activePoint = this._activePoint;\n var multipleSeries = this._plotArea.series.length > 1;\n var hasInactiveOpacity = this._hasInactiveOpacity();\n\n this._updateHoveredPoint(point, e);\n\n if (point && activePoint !== point && point.hover) {\n this._activePoint = point;\n\n if (!this._sharedTooltip() && !point.hover(this, e)) {\n this._displayTooltip(point);\n\n if (hasInactiveOpacity) {\n this._displayInactiveOpacity(point, multipleSeries);\n } else {\n this._highlight.show(point);\n }\n }\n } else if (!point && hasInactiveOpacity) {\n if (multipleSeries && this._activeChartInstance) {\n this._updateSeriesOpacity(point, true);\n this._applySeriesOpacity(this._activeChartInstance.children, null, true);\n this._activeChartInstance = null;\n }\n this._highlight && this._highlight.hide();\n this._activePoint = null;\n }\n\n return point;\n },\n\n _displayTooltip: function(point) {\n var tooltipOptions = deepExtend({}, this.options.tooltip, point.options.tooltip);\n if (tooltipOptions.visible) {\n this._tooltip.show(point);\n }\n },\n\n _displayInactiveOpacity: function(activePoint, multipleSeries, highlightPoints) {\n var chartInstance = this._activeChartInstance = this._chartInstanceFromPoint(activePoint);\n if (!chartInstance) {\n return;\n }\n\n if (multipleSeries) {\n this._updateSeriesOpacity(activePoint);\n this._applySeriesOpacity(chartInstance.children, null, true);\n this._applySeriesOpacity(chartInstance.children, activePoint.series);\n this._highlight.show(highlightPoints || activePoint);\n } else {\n var inactivePoints;\n\n if (!chartInstance.supportsPointInactiveOpacity()) {\n this._highlight.show(activePoint);\n return;\n }\n\n inactivePoints = this._getInactivePoints(activePoint, chartInstance);\n\n if (inactivePoints && inactivePoints.length) {\n this._highlight.show(inactivePoints, 1 - this._getInactiveOpacityForSeries(activePoint.series));\n }\n }\n },\n\n _getInactivePoints: function(activePoint, chartInstance) {\n var allPoints = this._getAllPointsOfType(chartInstance, activePoint.constructor);\n\n return allPoints.filter(function (point) { return point !== activePoint; });\n },\n\n _getAllPointsOfType: function(container, type) {\n var this$1 = this;\n\n var points = [];\n\n for (var i = 0; i < container.children.length; i++) {\n var element = container.children[i];\n\n if (element.constructor === type) {\n points.push(element);\n } else if (element.children && element.children.length) {\n points = points.concat(this$1._getAllPointsOfType(element, type));\n }\n }\n\n return points;\n },\n\n _updateHoveredPoint: function(point, e) {\n var hoveredPoint = this._hoveredPoint;\n\n if (hoveredPoint && hoveredPoint !== point) {\n hoveredPoint.out(this, e);\n this._hoveredPoint = null;\n }\n\n if (point && hoveredPoint !== point && point.over) {\n this._hoveredPoint = point;\n point.over(this, e);\n }\n },\n\n _updateSeriesOpacity: function(point, resetOpacity) {\n var this$1 = this;\n\n var plotArea = this._plotArea;\n var length = plotArea.series.length;\n\n for (var i = 0; i < length; i++) {\n var currSeries = plotArea.series[i];\n var defaultOpacity = this$1._getDefaultOpacityForSeries(currSeries);\n var inactiveOpacity = this$1._getInactiveOpacityForSeries(currSeries);\n\n if (!resetOpacity && currSeries !== point.series) {\n currSeries.defaultOpacity = defaultOpacity;\n currSeries.opacity = inactiveOpacity;\n\n if (currSeries.line) {\n currSeries.line.opacity = inactiveOpacity;\n }\n } else {\n currSeries.opacity = defaultOpacity;\n\n if (currSeries.line) {\n currSeries.line.opacity = defaultOpacity;\n }\n }\n }\n },\n\n _applySeriesOpacity: function(elements, activeSeries, reset, series) {\n var this$1 = this;\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i];\n var currSeries = element.series || series;\n var shouldHighlight = currSeries && (currSeries.highlight || {}).visible;\n\n if (shouldHighlight && element.visual) {\n var opacity = series ? series.opacity : element.series.opacity;\n if (currSeries !== activeSeries || reset) {\n element.visual.opacity(reset ? 1 : opacity);\n }\n }\n\n if (element.children && element.children.length) {\n this$1._applySeriesOpacity(element.children, activeSeries, reset, element.series);\n }\n }\n },\n\n _chartInstanceFromPoint: function(point) {\n var chartInstance = point.parent;\n\n while (chartInstance && !chartInstance.plotArea) {\n chartInstance = chartInstance.parent;\n }\n\n return chartInstance;\n },\n\n _hasInactiveOpacity: function() {\n var hasDefaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity !== undefined;\n var hasInactiveOpacity = this.options.series.filter(function (s) { return s.highlight.inactiveOpacity !== undefined; } ).length > 0;\n return hasDefaultInactiveOpacity || hasInactiveOpacity;\n },\n\n _getInactiveOpacityForSeries: function(series) {\n var defaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity;\n var seriesInactiveOpacity = series.highlight.inactiveOpacity;\n return seriesInactiveOpacity || defaultInactiveOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n },\n\n _getDefaultOpacityForSeries: function(series) {\n return series.defaultOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n },\n\n _mouseover: function(e) {\n var point = this._startHover(e.element, e.originalEvent);\n\n if (point && point.tooltipTracking && !this._mouseMoveTrackHandler && !this._sharedTooltip()) {\n this._mouseMoveTrackHandler = this._mouseMoveTracking.bind(this);\n var obj;\n bindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n }\n },\n\n _mouseMoveTracking: function(e) {\n var ref = this;\n var options = ref.options;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n var point = ref._activePoint;\n var coords = this._eventCoordinates(e);\n\n if (this._plotArea.box.containsPoint(coords)) {\n if (point && point.tooltipTracking && point.series && point.parent.getNearestPoint) {\n var seriesPoint = point.parent.getNearestPoint(coords.x, coords.y, point.seriesIx);\n if (seriesPoint && seriesPoint !== point) {\n this._activePoint = seriesPoint;\n\n if (!seriesPoint.hover(this, e)) {\n var tooltipOptions = deepExtend({}, options.tooltip, seriesPoint.options.tooltip);\n if (tooltipOptions.visible) {\n tooltip.show(seriesPoint);\n }\n\n highlight.show(seriesPoint);\n }\n }\n }\n } else {\n var obj;\n unbindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n this._unsetActivePoint();\n this._mouseMoveTrackHandler = null;\n }\n },\n\n _mousemove: function(e) {\n var coords = this._eventCoordinates(e);\n var plotArea = this._plotArea;\n\n this._trackCrosshairs(coords);\n\n if (plotArea.hover) {\n var overPlotArea = plotArea.backgroundContainsPoint(coords);\n if (overPlotArea) {\n plotArea.hovered = true;\n this._plotArea.hover(this, e);\n } else if (plotArea.hovered && !overPlotArea) {\n this.trigger(PLOT_AREA_LEAVE);\n plotArea.hovered = false;\n }\n }\n\n if (this._sharedTooltip()) {\n this._trackSharedTooltip(coords, e);\n }\n },\n\n _trackCrosshairs: function(coords) {\n var crosshairs = this._plotArea.crosshairs;\n\n for (var i = 0; i < crosshairs.length; i++) {\n var current = crosshairs[i];\n\n if (current.box.containsPoint(coords)) {\n current.showAt(coords);\n } else {\n current.hide();\n }\n }\n },\n\n _trackSharedTooltip: function(coords, e, toggle) {\n if (this._suppressHover) {\n return;\n }\n\n var ref = this;\n var tooltipOptions = ref.options.tooltip;\n var plotArea = ref._plotArea;\n var categoryAxis = ref._plotArea.categoryAxis;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n\n if (plotArea.backgroundContainsPoint(coords)) {\n var index = categoryAxis.pointCategoryIndex(coords);\n if (index !== this._tooltipCategoryIx || (!this._sharedHighlight && toggle)) {\n var points = plotArea.pointsByCategoryIndex(index);\n var pointArgs = points.map(function(point) {\n return point.eventArgs(e);\n });\n var hoverArgs = pointArgs[0] || {};\n hoverArgs.categoryPoints = pointArgs;\n\n if (points.length > 0 && !this.trigger(SERIES_HOVER, hoverArgs)) {\n if (tooltipOptions.visible) {\n tooltip.showAt(points, coords);\n }\n\n highlight.show(points);\n\n this._sharedHighlight = true;\n } else {\n tooltip.hide();\n }\n\n this._tooltipCategoryIx = index;\n } else if (toggle && this._sharedHighlight) {\n highlight.hide();\n tooltip.hide();\n this._sharedHighlight = false;\n }\n } else if (this._sharedHighlight) {\n highlight.hide();\n tooltip.hide();\n this._tooltipCategoryIx = null;\n this._sharedHighlight = false;\n }\n },\n\n hideElements: function(options) {\n var plotArea = this._plotArea;\n this._mousemove.cancel();\n\n plotArea.hideCrosshairs();\n\n this._unsetActivePoint(options);\n },\n\n _unsetActivePoint: function(options) {\n var ref = this;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n\n this._activePoint = null;\n this._hoveredPoint = null;\n\n if (tooltip && !(options && options.keepTooltipOpen)) {\n tooltip.hide();\n }\n\n this._tooltipCategoryIx = null;\n this._sharedHighlight = false;\n\n if (highlight) {\n highlight.hide();\n }\n },\n\n _deferRedraw: function() {\n this._redraw();\n },\n\n _clearRedrawTimeout: function() {\n if (this._redrawTimeout) {\n clearInterval(this._redrawTimeout);\n this._redrawTimeout = null;\n }\n },\n\n bindCategories: function() {\n var this$1 = this;\n\n var options = this.options;\n var definitions = [].concat(options.categoryAxis);\n\n for (var axisIx = 0; axisIx < definitions.length; axisIx++) {\n var axis = definitions[axisIx];\n if (axis.autoBind !== false) {\n this$1.bindCategoryAxisFromSeries(axis, axisIx);\n }\n }\n },\n\n bindCategoryAxisFromSeries: function(axis, axisIx) {\n var this$1 = this;\n\n var series = this.options.series;\n var seriesLength = series.length;\n var uniqueCategories = new dataviz.HashMap();//perf improvement in case type category with dates\n var items = [];\n var bindable = false;\n var dateAxis;\n\n for (var seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n var s = series[seriesIx];\n var onAxis = s.categoryAxis === axis.name || (!s.categoryAxis && axisIx === 0);\n var data = s.data;\n var dataLength = data.length;\n var bind = s.categoryField && onAxis;\n bindable = bind || bindable;\n\n if (bind && dataLength > 0) {\n dateAxis = isDateAxis(axis, getField(s.categoryField, data[0]));\n\n var getFn = dateAxis ? getDateField : getField;\n\n for (var dataIx = 0; dataIx < dataLength; dataIx++) {\n var dataRow = data[dataIx];\n var category = getFn(s.categoryField, dataRow, this$1.chartService.intl);\n\n if (dateAxis || !uniqueCategories.get(category)) {\n items.push([ category, dataRow ]);\n\n if (!dateAxis) {\n uniqueCategories.set(category, true);\n }\n }\n }\n }\n }\n\n if (items.length > 0) {\n if (dateAxis) {\n items = uniqueDates(items, function(a, b) {\n return dataviz.dateComparer(a[0], b[0]);\n });\n }\n\n var result = transpose(items);\n axis.categories = result[0];\n } else if (bindable) {\n axis.categories = [];\n }\n },\n\n _isBindable: function(series) {\n var valueFields = SeriesBinder.current.valueFields(series);\n var result = true;\n\n for (var i = 0; i < valueFields.length; i++) {\n var field = valueFields[i];\n if (field === VALUE) {\n field = \"field\";\n } else {\n field = field + \"Field\";\n }\n\n if (!defined(series[field])) {\n result = false;\n break;\n }\n }\n\n return result;\n },\n\n _noTransitionsRedraw: function() {\n var options = this.options;\n var transitionsState;\n\n if (options.transitions !== false) {\n options.transitions = false;\n transitionsState = true;\n }\n\n this._redraw();\n\n if (transitionsState) {\n options.transitions = true;\n }\n },\n\n _legendItemHover: function(seriesIndex, pointIndex) {\n var ref = this;\n var plotArea = ref._plotArea;\n var highlight = ref._highlight;\n var currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n var items;\n\n if (inArray(currentSeries.type, [ PIE, DONUT, FUNNEL ])) {\n items = plotArea.findPoint(function(point) {\n return point.series.index === seriesIndex && point.index === pointIndex;\n });\n } else {\n items = plotArea.pointsBySeriesIndex(seriesIndex);\n }\n\n if (this._hasInactiveOpacity() && currentSeries.visible && items) {\n var multipleSeries = plotArea.series.length > 1;\n var point = items.length ? items[0] : items;\n\n this._displayInactiveOpacity(point, multipleSeries, items);\n } else {\n highlight.show(items);\n }\n },\n\n _shouldAttachMouseMove: function() {\n return this._plotArea.crosshairs.length || (this._tooltip && this._sharedTooltip()) || this.requiresHandlers([ PLOT_AREA_HOVER, PLOT_AREA_LEAVE ]);\n },\n\n updateMouseMoveHandler: function() {\n var obj;\n unbindEvents(this.element, ( obj = {}, obj[ MOUSEMOVE ] = this._mousemove, obj ));\n\n if (this._shouldAttachMouseMove()) {\n var obj$1;\n bindEvents(this.element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n }\n },\n\n applyOptions: function(options, theme) {\n clearMissingValues(this._originalOptions, options);\n this._originalOptions = deepExtend(this._originalOptions, options);\n this.options = deepExtend({}, this._originalOptions);\n\n if (theme) {\n this._theme = theme;\n this.chartService.theme = theme;\n }\n this._initTheme(this.options, this._theme);\n\n this._toggleDragZoomEvents();\n },\n\n setOptions: function(options, theme) {\n this.applyOptions(options, theme);\n this.bindCategories();\n this.redraw();\n this.updateMouseMoveHandler();\n },\n\n setDirection: function(rtl) {\n this.chartService.rtl = Boolean(rtl);\n if (this.surface && this.surface.type === 'svg') {\n this._destroySurface();\n }\n },\n\n setIntlService: function(intl) {\n this.chartService.intl = intl;\n },\n\n noTransitionsRedraw: function() {\n this._noTransitionsRedraw();\n },\n\n destroy: function() {\n this._destroyed = true;\n\n var obj;\n unbindEvents(this.element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSEMOVE ] = this._mousemove, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n if (this.domEvents) {\n this.domEvents.destroy();\n delete this.domEvents;\n }\n\n if (this._mouseMoveTrackHandler) {\n var obj$1;\n unbindEvents(document, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj$1 ));\n }\n\n this._destroyView();\n\n this._destroySurface();\n\n this._clearRedrawTimeout();\n },\n\n _destroySurface: function() {\n var surface = this.surface;\n if (surface) {\n surface.unbind(\"mouseenter\", this._surfaceMouseenterHandler);\n surface.unbind(\"mouseleave\", this._surfaceMouseleaveHandler);\n surface.destroy();\n\n this.surface = null;\n }\n },\n\n _destroySelections: function() {\n var selections = this._selections;\n\n if (selections) {\n while (selections.length > 0) {\n selections.shift().destroy();\n }\n }\n },\n\n _destroyView: function() {\n var model = this._model;\n\n if (model) {\n model.destroy();\n this._model = null;\n }\n\n this._unsetActivePoint();\n\n this._destroySelections();\n\n if (this._tooltip) {\n this._tooltip.destroy();\n }\n\n if (this._highlight) {\n this._highlight.destroy();\n }\n\n if (this._zoomSelection) {\n this._zoomSelection.destroy();\n delete this._zoomSelection;\n }\n\n if (this._pannable) {\n this._pannable.destroy();\n delete this._pannable;\n }\n\n if (this._mousewheelZoom) {\n this._mousewheelZoom.destroy();\n delete this._mousewheelZoom;\n }\n }\n});\n\nfunction resolveAxisAliases(options) {\n var aliases = AXIS_NAMES;\n\n for (var idx = 0; idx < aliases.length; idx++) {\n var alias = aliases[idx] + \"Axes\";\n if (options[alias]) {\n options[aliases[idx] + \"Axis\"] = options[alias];\n delete options[alias];\n }\n }\n}\n\nfunction pointByCategoryName(points, name) {\n if (points) {\n for (var idx = 0; idx < points.length; idx++) {\n if (points[idx].category === name) {\n return [ points[idx] ];\n }\n }\n }\n}\n\nfunction applyAxisDefaults(options, themeOptions) {\n var themeAxisDefaults = ((themeOptions || {}).axisDefaults) || {};\n var axisName, axisDefaults, axes;\n\n function mapAxisOptions(axisOptions) {\n var axisColor = (axisOptions || {}).color || axisDefaults.color;\n var result = deepExtend({},\n themeAxisDefaults,\n themeAxisDefaults[axisName],\n axisDefaults,\n axisDefaults[axisName], {\n line: { color: axisColor },\n labels: { color: axisColor },\n title: { color: axisColor }\n },\n axisOptions\n );\n\n delete result[axisName];\n\n return result;\n }\n\n for (var idx = 0; idx < AXIS_NAMES.length; idx++) {\n axisName = AXIS_NAMES[idx] + \"Axis\";\n axisDefaults = options.axisDefaults || {};\n axes = [].concat(options[axisName]);\n\n axes = axes.map(mapAxisOptions);\n\n options[axisName] = axes.length > 1 ? axes : axes[0];\n }\n}\n\nfunction applySeriesDefaults(options, themeOptions) {\n var series = options.series;\n var seriesLength = series.length;\n var seriesDefaults = options.seriesDefaults;\n var commonDefaults = deepExtend({}, options.seriesDefaults);\n var themeSeriesDefaults = themeOptions ? deepExtend({}, themeOptions.seriesDefaults) : {};\n var commonThemeDefaults = deepExtend({}, themeSeriesDefaults);\n\n cleanupNestedSeriesDefaults(commonDefaults);\n cleanupNestedSeriesDefaults(commonThemeDefaults);\n\n for (var i = 0; i < seriesLength; i++) {\n var seriesType = series[i].type || options.seriesDefaults.type;\n\n var baseOptions = deepExtend(\n { data: [] },\n commonThemeDefaults,\n themeSeriesDefaults[seriesType],\n { tooltip: options.tooltip },\n commonDefaults,\n seriesDefaults[seriesType]\n );\n\n series[i]._defaults = baseOptions;\n series[i] = deepExtend({}, baseOptions, series[i]);\n series[i].data = series[i].data || [];\n }\n}\n\nfunction cleanupNestedSeriesDefaults(seriesDefaults) {\n delete seriesDefaults.bar;\n delete seriesDefaults.column;\n delete seriesDefaults.rangeColumn;\n delete seriesDefaults.line;\n delete seriesDefaults.verticalLine;\n delete seriesDefaults.pie;\n delete seriesDefaults.donut;\n delete seriesDefaults.area;\n delete seriesDefaults.verticalArea;\n delete seriesDefaults.scatter;\n delete seriesDefaults.scatterLine;\n delete seriesDefaults.bubble;\n delete seriesDefaults.candlestick;\n delete seriesDefaults.ohlc;\n delete seriesDefaults.boxPlot;\n delete seriesDefaults.bullet;\n delete seriesDefaults.verticalBullet;\n delete seriesDefaults.polarArea;\n delete seriesDefaults.polarLine;\n delete seriesDefaults.radarArea;\n delete seriesDefaults.radarLine;\n delete seriesDefaults.waterfall;\n}\n\nfunction axisRanges(axes) {\n var ranges = {};\n\n for (var i = 0; i < axes.length; i++) {\n var axis = axes[i];\n var axisName = axis.options.name;\n if (axisName) {\n ranges[axisName] = axis.range();\n }\n }\n\n return ranges;\n}\n\nfunction sortDates(dates, comparer) {\n if (comparer === void 0) { comparer = dataviz.dateComparer; }\n\n for (var i = 1, length = dates.length; i < length; i++) {\n if (comparer(dates[i], dates[i - 1]) < 0) {\n dates.sort(comparer);\n break;\n }\n }\n\n return dates;\n}\n\nfunction uniqueDates(srcDates, comparer) {\n if (comparer === void 0) { comparer = dataviz.dateComparer; }\n\n var dates = sortDates(srcDates, comparer);\n var length = dates.length;\n var result = length > 0 ? [ dates[0] ] : [];\n\n for (var i = 1; i < length; i++) {\n if (comparer(dates[i], last(result)) !== 0) {\n result.push(dates[i]);\n }\n }\n\n return result;\n}\n\nfunction transpose(rows) {\n var rowCount = rows.length;\n var result = [];\n\n for (var rowIx = 0; rowIx < rowCount; rowIx++) {\n var row = rows[rowIx];\n var colCount = row.length;\n\n for (var colIx = 0; colIx < colCount; colIx++) {\n result[colIx] = result[colIx] || [];\n result[colIx].push(row[colIx]);\n }\n }\n\n return result;\n}\n\nvar DATA_FIELDS = [ 'data', 'categories' ];\n\nfunction clearMissingValues(originalOptions, options) {\n for (var field in options) {\n if (!inArray(field, DATA_FIELDS) && options.hasOwnProperty(field)) {\n var fieldValue = options[field];\n var originalValue = originalOptions[field];\n if (defined(originalValue)) {\n var nullValue = fieldValue === null;\n if ((nullValue || !defined(fieldValue))) {\n delete originalOptions[field];\n if (nullValue) {\n delete options[field];\n }\n } else if (originalValue && isObject(fieldValue)) {\n if (isObject(originalValue)) {\n clearMissingValues(originalValue, fieldValue);\n }\n }\n }\n }\n }\n}\n\nfunction triggerPaneRender(panes) {\n for (var idx = 0; idx < panes.length; idx++) {\n panes[idx].notifyRender();\n }\n}\n\nsetDefaultOptions(Chart, {\n renderAs: \"\",\n chartArea: {},\n legend: {\n visible: true,\n labels: {}\n },\n categoryAxis: {},\n seriesDefaults: {\n type: COLUMN,\n data: [],\n highlight: {\n visible: true\n },\n labels: {},\n negativeValues: {\n visible: false\n }\n },\n series: [],\n seriesColors: null,\n tooltip: {\n visible: false\n },\n transitions: true,\n valueAxis: {},\n plotArea: {},\n title: {},\n xAxis: {},\n yAxis: {},\n panes: [ {} ],\n pannable: false,\n zoomable: false\n});\n\nkendo.deepExtend(kendo.dataviz, {\n constants: constants,\n Aggregates: Aggregates,\n AreaChart: AreaChart,\n AreaSegment: AreaSegment,\n AxisGroupRangeTracker: AxisGroupRangeTracker,\n Bar: Bar,\n BarChart: BarChart,\n BarLabel: BarLabel,\n BoxPlotChart: BoxPlotChart,\n BoxPlot: BoxPlot,\n BubbleChart: BubbleChart,\n Bullet: Bullet,\n BulletChart: BulletChart,\n CandlestickChart: CandlestickChart,\n Candlestick: Candlestick,\n CategoricalChart: CategoricalChart,\n CategoricalErrorBar: CategoricalErrorBar,\n CategoricalPlotArea: CategoricalPlotArea,\n Chart: Chart,\n ChartContainer: ChartContainer,\n ClipAnimation: ClipAnimation,\n ClusterLayout: ClusterLayout,\n Crosshair: Crosshair,\n CrosshairTooltip: CrosshairTooltip,\n DefaultAggregates: DefaultAggregates,\n DonutChart: DonutChart,\n DonutPlotArea: DonutPlotArea,\n DonutSegment: DonutSegment,\n ErrorBarBase: ErrorBarBase,\n ErrorRangeCalculator: ErrorRangeCalculator,\n Highlight: Highlight,\n SharedTooltip: SharedTooltip,\n Legend: Legend,\n LegendItem: LegendItem,\n LegendLayout: LegendLayout,\n LineChart: LineChart,\n LinePoint: LinePoint,\n LineSegment: LineSegment,\n Pane: Pane,\n PieAnimation: PieAnimation,\n PieChart: PieChart,\n PieChartMixin: PieChartMixin,\n PiePlotArea: PiePlotArea,\n PieSegment: PieSegment,\n PlotAreaBase: PlotAreaBase,\n PlotAreaEventsMixin: PlotAreaEventsMixin,\n PlotAreaFactory: PlotAreaFactory,\n PointEventsMixin: PointEventsMixin,\n RangeBar: RangeBar,\n RangeBarChart: RangeBarChart,\n RangeAreaPoint: RangeAreaPoint,\n RangeAreaChart: RangeAreaChart,\n ScatterChart: ScatterChart,\n ScatterErrorBar: ScatterErrorBar,\n ScatterLineChart: ScatterLineChart,\n Selection: Selection,\n SeriesAggregator: SeriesAggregator,\n SeriesBinder: SeriesBinder,\n SplineSegment: SplineSegment,\n SplineAreaSegment: SplineAreaSegment,\n StackWrap: StackWrap,\n Tooltip: Tooltip,\n OHLCChart: OHLCChart,\n OHLCPoint: OHLCPoint,\n WaterfallChart: WaterfallChart,\n WaterfallSegment: WaterfallSegment,\n XYPlotArea: XYPlotArea,\n MousewheelZoom: MousewheelZoom,\n ZoomSelection: ZoomSelection,\n Pannable: Pannable,\n ChartAxis: ChartAxis,\n ChartPane: ChartPane,\n ChartPlotArea: ChartPlotArea,\n findAxisByName: findAxisByName,\n anyHasZIndex: anyHasZIndex,\n appendIfNotNull: appendIfNotNull,\n areNumbers: areNumbers,\n bindSegments: bindSegments,\n categoriesCount: categoriesCount,\n countNumbers: countNumbers,\n equalsIgnoreCase: equalsIgnoreCase,\n evalOptions: evalOptions,\n filterSeriesByType: filterSeriesByType,\n getDateField: getDateField,\n getField: getField,\n hasGradientOverlay: hasGradientOverlay,\n hasValue: hasValue,\n isDateAxis: isDateAxis,\n segmentVisible: segmentVisible,\n singleItemOrArray: singleItemOrArray,\n createOutOfRangePoints: createOutOfRangePoints\n});\n\n})(window.kendo.jQuery);\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3){ (a3 || a2)(); });\n(function(f, define) {\n define('dataviz/chart/chart',[\n \"./kendo-chart\",\n \"kendo.data\",\n \"kendo.dataviz.core\",\n \"kendo.dataviz.themes\",\n \"kendo.drawing\",\n \"kendo.userevents\"\n ], f);\n})(function() {\n\n(function($, undefined) {\n\n var NS = \".kendoChart\";\n var kendo = window.kendo;\n var Class = kendo.Class;\n var outerWidth = kendo._outerWidth;\n var outerHeight = kendo._outerHeight;\n var dataviz = kendo.dataviz;\n var constants = dataviz.constants;\n var KendoChart = dataviz.Chart;\n var SeriesBinder = dataviz.SeriesBinder;\n var Widget = kendo.ui.Widget;\n var DataSource = kendo.data.DataSource;\n var deepExtend = kendo.deepExtend;\n var defined = dataviz.defined;\n var getField = dataviz.getField;\n var InstanceObserver = dataviz.InstanceObserver;\n var inArray = dataviz.inArray;\n var services = dataviz.services;\n var isArray = Array.isArray;\n var extend = $.extend;\n var template = kendo.template;\n\n var MOUSELEAVE_NS = \"mouseleave\" + NS;\n var AXIS_LABEL_CLICK = constants.AXIS_LABEL_CLICK;\n var LEGEND_ITEM_CLICK = constants.LEGEND_ITEM_CLICK;\n var LEGEND_ITEM_HOVER = constants.LEGEND_ITEM_HOVER;\n var LEGEND_ITEM_LEAVE = constants.LEGEND_ITEM_LEAVE;\n var SERIES_CLICK = constants.SERIES_CLICK;\n var SERIES_HOVER = constants.SERIES_HOVER;\n var SERIES_OVER = constants.SERIES_OVER;\n var SERIES_LEAVE = constants.SERIES_LEAVE;\n var PANE_RENDER = constants.PANE_RENDER;\n var PLOT_AREA_CLICK = constants.PLOT_AREA_CLICK;\n var PLOT_AREA_HOVER = constants.PLOT_AREA_HOVER;\n var PLOT_AREA_LEAVE = constants.PLOT_AREA_LEAVE;\n var DRAG = constants.DRAG;\n var DRAG_END = constants.DRAG_END;\n var DRAG_START = constants.DRAG_START;\n var ZOOM_START = constants.ZOOM_START;\n var ZOOM = constants.ZOOM;\n var ZOOM_END = constants.ZOOM_END;\n var SELECT_START = constants.SELECT_START;\n var SELECT = constants.SELECT;\n var SELECT_END = constants.SELECT_END;\n var RENDER = constants.RENDER;\n var NOTE_CLICK = constants.NOTE_CLICK;\n var NOTE_HOVER = constants.NOTE_HOVER;\n var NOTE_LEAVE = constants.NOTE_LEAVE;\n var DOCUMENT_ELEMENT = $(document.documentElement);\n\n var CHANGE = \"change\";\n var DATABOUND = \"dataBound\";\n var LEAVE = \"leave\";\n var MOUSEDOWN = \"down\";\n\n var VALUE = constants.VALUE;\n var PIE = constants.PIE;\n var DONUT = constants.DONUT;\n var FUNNEL = constants.FUNNEL;\n\n var Observable = kendo.Observable;\n var TOOLTIP_ANIMATION_DURATION = 150;\n var TOOLTIP_SHOW_DELAY = 100;\n var TOOLTIP_INVERSE = \"k-chart-tooltip-inverse\";\n var SHARED_TOOLTIP_CLASS = \"k-chart-shared-tooltip\";\n var RTL = \"rtl\";\n\n services.DomEventsBuilder.register({\n create: function(element, events) {\n return new kendo.UserEvents(element, deepExtend({\n global: true,\n multiTouch: true,\n fastTap: true\n }, events));\n }\n });\n\n var ChartInstanceObserver = InstanceObserver.extend({\n handlerMap: {\n showTooltip: '_showTooltip',\n hideTooltip: '_hideTooltip',\n legendItemClick: '_onLegendItemClick',\n render: '_onRender',\n init: '_onInit'\n }\n });\n\n var Chart = Widget.extend({\n init: function(element, userOptions) {\n var dataSource;\n\n kendo.destroy(element);\n\n Widget.fn.init.call(this, element);\n\n if (userOptions) {\n dataSource = userOptions.dataSource;\n delete userOptions.dataSource;\n }\n\n this.options = deepExtend({}, this.options, userOptions);\n\n this.wrapper = this.element;\n this._attachEvents();\n\n if (userOptions) {\n userOptions.dataSource = dataSource;\n }\n\n this._seriesVisibility = new SeriesVisibilityState();\n\n this.bind(this.events, this.options);\n this._initDataSource(userOptions);\n\n kendo.notify(this, dataviz.ui);\n },\n\n events: [\n DATABOUND,\n SERIES_CLICK,\n SERIES_HOVER,\n SERIES_OVER,\n SERIES_LEAVE,\n AXIS_LABEL_CLICK,\n LEGEND_ITEM_CLICK,\n LEGEND_ITEM_HOVER,\n LEGEND_ITEM_LEAVE,\n PANE_RENDER,\n PLOT_AREA_CLICK,\n PLOT_AREA_HOVER,\n PLOT_AREA_LEAVE,\n DRAG_START,\n DRAG,\n DRAG_END,\n ZOOM_START,\n ZOOM,\n ZOOM_END,\n SELECT_START,\n SELECT,\n SELECT_END,\n NOTE_CLICK,\n NOTE_HOVER,\n NOTE_LEAVE,\n RENDER\n ],\n\n options: {\n name: \"Chart\",\n renderAs: \"\",\n theme: \"default\",\n axisDefaults: {},\n chartArea: {},\n legend: {},\n categoryAxis: {},\n autoBind: true,\n seriesDefaults: {},\n series: [],\n seriesColors: null,\n tooltip: {},\n transitions: true,\n valueAxis: {},\n plotArea: {},\n title: {},\n xAxis: {},\n yAxis: {},\n panes: [{}],\n pannable: false,\n zoomable: false\n },\n\n items: function() {\n return $();\n },\n\n refresh: function() {\n var chart = this;\n var instance = chart._instance;\n instance.applyDefaults(chart.options);\n instance.applySeriesColors();\n\n chart._bindSeries();\n chart._bindCategories();\n\n chart.trigger(DATABOUND);\n chart._redraw();\n },\n\n getSize: function() {\n return kendo.dimensions(this.element);\n },\n\n redraw: function(paneName) {\n this._size = null;\n this._instance.redraw(paneName);\n },\n\n setOptions: function(options) {\n var chart = this,\n dataSource = options.dataSource;\n\n delete options.dataSource;\n\n Widget.fn._setEvents.call(chart, options);\n\n this._instance.applyOptions(options, this._getThemeOptions(options));\n this.options = this._instance.options;\n this._tooltip.setOptions(this.options.tooltip);\n this._seriesVisibility.setOptions(this.options);\n this._sourceSeries = null;\n\n if (dataSource) {\n chart.setDataSource(dataSource);\n }\n\n if (chart._hasDataSource) {\n chart._onDataChanged();\n } else {\n chart._bindCategories();\n chart.redraw();\n }\n\n chart._instance.updateMouseMoveHandler();\n\n },\n\n setDataSource: function(dataSource) {\n var chart = this;\n\n chart.dataSource.unbind(CHANGE, chart._dataChangeHandler);\n chart.dataSource = dataSource = DataSource.create(dataSource);\n chart._hasDataSource = true;\n chart._hasData = false;\n\n dataSource.bind(CHANGE, chart._dataChangeHandler);\n\n if (chart.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n destroy: function() {\n var chart = this,\n dataSource = chart.dataSource;\n\n chart.element.off(NS);\n\n if (dataSource) {\n dataSource.unbind(CHANGE, chart._dataChangeHandler);\n }\n\n if (chart._instance) {\n chart._instance.destroy();\n delete this._instance;\n }\n\n if (this._tooltip) {\n this._tooltip.destroy();\n delete this._tooltip;\n }\n\n this._destroyCrosshairTooltips();\n\n Widget.fn.destroy.call(chart);\n },\n\n findPaneByName: function(name) {\n var panes = this._plotArea.panes;\n\n for (var idx = 0; idx < panes.length; idx++) {\n if (panes[idx].options.name === name) {\n return new ChartPane(this, panes[idx]);\n }\n }\n },\n\n findPaneByIndex: function(idx) {\n var panes = this._plotArea.panes;\n if (panes[idx]) {\n return new ChartPane(this, panes[idx]);\n }\n },\n\n findSeries: function(callback) {\n var plotArea = this._plotArea;\n var series = plotArea.srcSeries || plotArea.series;\n for (var idx = 0; idx < series.length; idx++) {\n if (callback(series[idx])) {\n return new ChartSeries(this, series[idx]);\n }\n }\n },\n\n findSeriesByName: function(name) {\n return this._createSeries({ name: name });\n },\n\n findSeriesByIndex: function(index) {\n return this._createSeries({ index: index });\n },\n\n exportVisual: function(options) {\n var instance = this._instance;\n if (!instance) {\n return;\n }\n\n var visual;\n\n //TO DO: support for setting any options. already available in kendo-charts\n if (options && (options.width || options.height)) {\n var chartArea = instance.options.chartArea;\n var originalChartArea = instance._originalOptions.chartArea;\n\n deepExtend(chartArea, options);\n\n var model = instance._getModel();\n\n chartArea.width = originalChartArea.width;\n chartArea.height = originalChartArea.height;\n\n model.renderVisual();\n\n triggerPaneRender(model._plotArea.panes);\n\n visual = model.visual;\n } else {\n visual = instance.exportVisual();\n }\n\n return visual;\n },\n\n _createSeries: function(options) {\n var seriesOptions = this._seriesOptions(options);\n if (seriesOptions) {\n return new ChartSeries(this, seriesOptions);\n }\n },\n\n _seriesOptions: function(options) {\n var plotArea = this._plotArea;\n var series = plotArea.srcSeries || plotArea.series;\n var seriesOptions;\n\n if (defined(options.index)) {\n seriesOptions = series[options.index];\n } else if (defined(options.name)) {\n for (var idx = 0; idx < series.length; idx++) {\n if (series[idx].name === options.name) {\n seriesOptions = series[idx];\n break;\n }\n }\n }\n\n return seriesOptions;\n },\n\n _attachEvents: function() {\n this.element.on(MOUSELEAVE_NS, this._mouseleave.bind(this));\n },\n\n _mouseleave: function(e) {\n var instance = this._instance;\n var tooltip = this._tooltip;\n var target = e.relatedTarget;\n\n if (!(target && $(target).closest(tooltip.element).length) && instance && !instance.handlingTap) {\n instance.hideElements({\n keepTooltipOpen: !tooltip.options.autoHide\n });\n }\n },\n\n _getThemeOptions: function(userOptions) {\n var themeName = (userOptions || {}).theme;\n\n if (themeName && dataviz.SASS_THEMES.indexOf(themeName.toLowerCase()) !== -1) {\n return dataviz.autoTheme().chart;\n }\n\n if (defined(themeName)) {\n var themes = dataviz.ui.themes || {};\n var theme = themes[themeName] || themes[themeName.toLowerCase()] || {};\n return theme.chart || {};\n }\n },\n\n _initChart: function() {\n this._createChart(this.options, this._getThemeOptions(this.options));\n this.options = this._instance.options;\n this._seriesVisibility.setOptions(this.options);\n },\n\n _createChart: function(options, themeOptions) {\n this._instance = new KendoChart(this.element[0], options, themeOptions, {\n observer: new ChartInstanceObserver(this),\n sender: this,\n rtl: this._isRtl()\n });\n },\n\n _onInit: function(e) {\n this._instance = e.sender;\n },\n\n _initDataSource: function(userOptions) {\n var chart = this,\n dataSource = (userOptions || {}).dataSource;\n\n chart._dataChangeHandler = chart._onDataChanged.bind(chart);\n\n chart.dataSource = DataSource\n .create(dataSource)\n .bind(\"change\", chart._dataChangeHandler);\n\n chart._bindCategories();\n\n if (dataSource) {\n chart._hasDataSource = true;\n }\n\n this._initChart();\n this._initTooltip();\n\n if (dataSource) {\n if (chart.options.autoBind) {\n chart.dataSource.fetch();\n }\n }\n },\n\n _destroyCrosshairTooltips: function() {\n var tooltips = this._crosshairTooltips;\n if (tooltips) {\n for (var key in tooltips) {\n tooltips[key].destroy();\n }\n }\n this._crosshairTooltips = {};\n },\n\n _getCrosshairTooltip: function(name, index) {\n var tooltips = this._crosshairTooltips = this._crosshairTooltips || {};\n var key = name + index;\n var tooltip = tooltips[key];\n if (!tooltip) {\n tooltip = tooltips[key] = new CrosshairTooltip(this.element);\n }\n return tooltip;\n },\n\n _showTooltip: function(e) {\n if (e.crosshair) {\n var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n tooltip.show(e);\n } else if (this._tooltip) {\n this._tooltip.show(e);\n }\n },\n\n _hideTooltip: function(e) {\n if (e.crosshair) {\n var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n tooltip.hide();\n } else if (this._tooltip) {\n this._tooltip.hide();\n }\n },\n\n _onRender: function(e) {\n this._destroyCrosshairTooltips();\n this._copyMembers(e.sender);\n if (!this._hasDataSource || this._hasData || !this.options.autoBind) {\n this.trigger(RENDER);\n }\n },\n\n _copyMembers: function(instance) {\n this.options = instance.options;\n this._originalOptions = instance._originalOptions;\n this.surface = instance.surface;\n this._plotArea = instance._plotArea;\n this._model = instance._model;\n this._highlight = instance._highlight;\n this._selections = instance._selections;\n this._pannable = instance._pannable;\n this._zoomSelection = instance._zoomSelection;\n this._mousewheelZoom = instance._mousewheelZoom;\n },\n\n requiresHandlers: function(names) {\n var events = this._events;\n for (var idx = 0; idx < names.length; idx++) {\n if (defined(events[names[idx]])) {\n return true;\n }\n }\n },\n\n _initTooltip: function() {\n this._tooltip = this._createTooltip();\n\n this._tooltip.bind(LEAVE, this._tooltipleave.bind(this));\n },\n\n _onLegendItemClick: function(e) {\n if (!this.trigger(LEGEND_ITEM_CLICK, e)) {\n this._legendItemClick(e.seriesIndex, e.pointIndex);\n }\n },\n\n _legendItemClick: function(seriesIndex, pointIndex) {\n var chart = this._instance,\n plotArea = chart._plotArea,\n currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n\n if (chart._hasInactiveOpacity() && chart._activeChartInstance) {\n chart._updateSeriesOpacity(null, true);\n chart._applySeriesOpacity(chart._activeChartInstance.children, null, true);\n chart._activeChartInstance = null;\n }\n\n if ($.inArray(currentSeries.type, [PIE, DONUT, FUNNEL]) >= 0) {\n var point = currentSeries.data[pointIndex];\n if (point && defined(point.visible)) {\n point.visible = !point.visible;\n } else {\n var pointVisibility = currentSeries.pointVisibility = currentSeries.pointVisibility || {};\n var visible = pointVisibility[pointIndex];\n pointVisibility[pointIndex] = defined(visible) ? !visible : false;\n }\n } else {\n currentSeries.visible = !currentSeries.visible;\n this._seriesVisibility.save(currentSeries);\n }\n\n chart._noTransitionsRedraw();\n },\n\n _createTooltip: function() {\n return new Tooltip(this.element, extend({}, this.options.tooltip, {\n rtl: this._isRtl()\n }));\n },\n\n _tooltipleave: function() {\n if (this._instance) {\n this._instance.hideElements();\n }\n },\n\n _bindData: function(e) {\n var chart = this,\n options = chart.options,\n series = chart._sourceSeries || options.series,\n seriesIx,\n seriesLength = series.length,\n data = chart.dataSource.view(),\n grouped = (chart.dataSource.group() || []).length > 0,\n processedSeries = [],\n seriesVisibility = this._seriesVisibility,\n currentSeries,\n groupedSeries;\n\n seriesVisibility.read();\n\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n\n if (chart._isBindable(currentSeries) && grouped) {\n groupedSeries = groupSeries(currentSeries, data);\n processedSeries = processedSeries.concat(groupedSeries);\n\n seriesVisibility.applyByGroup(groupedSeries, e);\n } else {\n currentSeries = extend({}, currentSeries);\n processedSeries.push(currentSeries);\n\n seriesVisibility.applyByIndex(currentSeries, e);\n }\n }\n\n chart._sourceSeries = series;\n options.series = processedSeries;\n this._instance.applySeriesColors();\n\n chart._bindSeries();\n chart._bindCategories();\n\n this._hasData = true;\n },\n\n _onDataChanged: function(e) {\n this._bindData(e);\n\n this.trigger(DATABOUND);\n if (this._instance && this._instance.fontLoaded) {\n this._redraw();\n }\n },\n\n _bindSeries: function() {\n var chart = this,\n data = chart.dataSource.view(),\n series = chart.options.series,\n seriesIx,\n seriesLength = series.length,\n currentSeries,\n groupIx,\n seriesData;\n\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n\n if (chart._isBindable(currentSeries)) {\n groupIx = currentSeries._groupIx;\n seriesData = defined(groupIx) ? (data[groupIx] || {}).items : data;\n\n if (currentSeries.autoBind !== false) {\n currentSeries.data = seriesData;\n }\n }\n }\n },\n\n _bindCategories: function() {\n var chart = this,\n data = chart.dataSource.view() || [],\n grouped = (chart.dataSource.group() || []).length > 0,\n categoriesData = data,\n options = chart.options,\n definitions = [].concat(options.categoryAxis),\n axisIx,\n axis;\n\n if (grouped) {\n if (data.length) {\n categoriesData = data[0].items;\n }\n }\n\n for (axisIx = 0; axisIx < definitions.length; axisIx++) {\n axis = definitions[axisIx];\n if (axis.autoBind !== false) {\n chart._bindCategoryAxis(axis, categoriesData, axisIx);\n }\n }\n },\n\n _bindCategoryAxis: function(axis, data, axisIx) {\n var count = (data || []).length,\n categoryIx,\n category,\n row;\n\n if (axis.field) {\n axis.categories = [];\n for (categoryIx = 0; categoryIx < count; categoryIx++) {\n row = data[categoryIx];\n\n category = getField(axis.field, row);\n if (categoryIx === 0) {\n axis.categories = [category];\n axis.dataItems = [row];\n } else {\n axis.categories.push(category);\n axis.dataItems.push(row);\n }\n }\n } else if (this._instance) {\n this._instance.bindCategoryAxisFromSeries(axis, axisIx);\n }\n },\n\n _isBindable: function(series) {\n var valueFields = SeriesBinder.current.valueFields(series),\n result = true,\n field, i;\n\n for (i = 0; i < valueFields.length; i++) {\n field = valueFields[i];\n if (field === VALUE) {\n field = \"field\";\n } else {\n field = field + \"Field\";\n }\n\n if (!defined(series[field])) {\n result = false;\n break;\n }\n }\n\n return result;\n },\n\n _isRtl: function() {\n return kendo.support.isRtl(this.element) && this.element.css(\"direction\") === RTL;\n }\n });\n\n var proxyMembers = [\"getAxis\", \"findAxisByName\", \"plotArea\", \"toggleHighlight\", \"showTooltip\",\n \"hideTooltip\", \"_resize\", \"_redraw\", \"_noTransitionsRedraw\", \"_legendItemHover\", \"_eventCoordinates\"];\n\n function createProxyMember(name) {\n Chart.fn[name] = function() {\n var instance = this._instance;\n if (instance) {\n return instance[name].apply(instance, arguments);\n }\n };\n }\n\n for (var idx = 0; idx < proxyMembers.length; idx++) {\n createProxyMember(proxyMembers[idx]);\n }\n\n function groupSeries(series, data) {\n var result = [],\n nameTemplate,\n legacyTemplate = series.groupNameTemplate,\n groupIx,\n dataLength = data.length,\n seriesClone;\n\n if (dataLength === 0) {\n seriesClone = deepExtend({}, series);\n seriesClone.visibleInLegend = false;\n return [seriesClone];\n }\n\n if (defined(legacyTemplate)) {\n kendo.logToConsole(\n \"'groupNameTemplate' is obsolete and will be removed in future versions. \" +\n \"Specify the group name template as 'series.name'\"\n );\n\n if (legacyTemplate) {\n nameTemplate = template(legacyTemplate);\n }\n } else {\n nameTemplate = template(series.name || \"\");\n if (nameTemplate._slotCount === 0) {\n nameTemplate = template(defined(series.name) ?\n \"#= group.value #: #= series.name #\" :\n \"#= group.value #\"\n );\n }\n }\n\n for (groupIx = 0; groupIx < dataLength; groupIx++) {\n seriesClone = deepExtend({}, series);\n\n if (!kendo.isFunction(seriesClone.color)) {\n seriesClone.color = undefined;\n }\n\n seriesClone._groupIx = groupIx;\n seriesClone._groupValue = data[groupIx].value;\n result.push(seriesClone);\n\n if (nameTemplate) {\n seriesClone.name = nameTemplate({\n series: seriesClone, group: data[groupIx]\n });\n }\n }\n\n return result;\n }\n\n dataviz.ExportMixin.extend(Chart.fn);\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(Chart.fn);\n }\n\n dataviz.ui.plugin(Chart);\n\n var SeriesVisibilityState = Class.extend({\n init: function() {\n this.groups = {};\n this.index = {};\n this.options = {};\n },\n\n applyByGroup: function(series, e) {\n if ((e && e.action) || this.options.persistSeriesVisibility) {\n for (var idx = 0; idx < series.length; idx++) {\n if (this.groups[series[idx]._groupValue] === false) {\n series[idx].visible = false;\n }\n }\n } else {\n this.groups = {};\n }\n },\n\n applyByIndex: function(series, e) {\n if ((e && e.action) || this.options.persistSeriesVisibility) {\n if (this.index[series.index] === false) {\n series.visible = false;\n }\n } else {\n this.index = {};\n }\n },\n\n save: function(series) {\n if (!series) {\n return;\n }\n\n if (this.options.persistSeriesVisibility) {\n this.options.series[series.index].visible = series.visible;\n } else {\n this.saveState(series);\n }\n },\n\n setOptions: function(options) {\n this.options = options;\n this.groups = {};\n this.index = {};\n },\n\n read: function() {\n var options = this.options;\n if (options.persistSeriesVisibility) {\n var series = options.series;\n for (var idx = 0; idx < series.length; idx++) {\n this.saveState(series[idx]);\n }\n }\n },\n\n saveState: function(series) {\n if (defined(series._groupValue)) {\n this.groups[series._groupValue] = series.visible;\n } else {\n this.index[series.index] = series.visible;\n }\n }\n });\n\n var geom = kendo.geometry;\n\n function normalizeStyle(style) {\n for (var field in style) {\n if (style[field] === undefined) {\n style[field] = '';\n }\n }\n\n return style;\n }\n\n var Tooltip = Observable.extend({\n init: function(chartElement, options) {\n var tooltip = this;\n\n Observable.fn.init.call(tooltip);\n\n this.setOptions(options);\n\n tooltip.chartElement = chartElement;\n\n tooltip.template = Tooltip.template;\n if (!tooltip.template) {\n tooltip.template = Tooltip.template = kendo.template(\n \"
\" +\n '
' +\n '#if (!d.autoHide) {#
#}#' +\n \"
\", { useWithBlock: false, paramName: \"d\" });\n }\n\n tooltip.element = $(tooltip.template(tooltip.options));\n\n tooltip.move = tooltip.move.bind(tooltip);\n tooltip._mouseleave = tooltip._mouseleave.bind(tooltip);\n\n var mobileScrollerSelector = kendo.format(\"[{0}='content'],[{0}='scroller']\", kendo.attr(\"role\"));\n tooltip._mobileScroller = chartElement.closest(mobileScrollerSelector).data(\"kendoMobileScroller\");\n tooltip.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n tooltip._closeTooltipHandler = tooltip._closeTooltip.bind(tooltip);\n },\n\n destroy: function() {\n var tooltip = this;\n\n this._clearShowTimeout();\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler);\n if (this.element) {\n this.element.off(MOUSELEAVE_NS).remove();\n this.element = null;\n }\n },\n\n setOptions: function(options) {\n this.options = deepExtend({}, this.options, options);\n },\n\n options: {\n opacity: 1,\n animation: {\n duration: TOOLTIP_ANIMATION_DURATION\n },\n sharedTemplate:\n \"\" +\n \"\" +\n \"# for(var i = 0; i < points.length; i++) { #\" +\n \"# var point = points[i]; #\" +\n \"\" +\n \"# if(colorMarker) { # \" +\n \"\" +\n \"# } #\" +\n \"# if(nameColumn) { # \" +\n \"\" +\n \"# } #\" +\n \"\" +\n \"\" +\n \"# } #\" +\n \"
#= categoryText #
#if (point.series.name) {# #: point.series.name #: #} else {#   #}##= content(point) #
\",\n categoryFormat: \"{0:d}\",\n autoHide: true\n },\n\n move: function() {\n var tooltip = this,\n options = tooltip.options,\n element = tooltip.element,\n offset;\n\n if (!tooltip.anchor || !tooltip.element) {\n return;\n }\n\n offset = tooltip._offset();\n if (!tooltip.visible) {\n element.css({ top: offset.top, left: offset.left });\n }\n\n tooltip.visible = true;\n tooltip._ensureElement(document.body);\n element\n .stop(true, true)\n .show()\n .animate({\n left: offset.left,\n top: offset.top\n }, options.animation.duration);\n },\n\n _clearShowTimeout: function() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n },\n\n getAnchor: function(size) {\n var anchor = this.anchor;\n var point = anchor.point;\n var align = anchor.align;\n var x = point.left;\n var y = point.top;\n if (align.horizontal === \"center\") {\n x -= size.width / 2;\n } else if (align.horizontal === \"right\") {\n x -= size.width;\n }\n\n if (align.vertical === \"center\") {\n y -= size.height / 2;\n } else if (align.vertical === \"bottom\") {\n y -= size.height;\n }\n\n return {\n x: x,\n y: y\n };\n },\n\n _offset: function() {\n var tooltip = this,\n size = tooltip._measure(),\n anchor = tooltip.getAnchor(size),\n top = anchor.y,\n left = anchor.x,\n zoomLevel = kendo.support.zoomLevel(),\n viewport = $(window),\n scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0,\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0,\n movable = (this._mobileScroller || {}).movable;\n\n if (!movable || movable.scale === 1) {\n top += tooltip._fit(top - scrollTop, size.height, outerHeight(viewport) / zoomLevel);\n left += tooltip._fit(left - scrollLeft, size.width, outerWidth(viewport) / zoomLevel);\n } else {\n var transform = geom.transform().scale(movable.scale, movable.scale, [movable.x, movable.y]);\n var point = new geom.Point(left, top).transform(transform);\n left = point.x;\n top = point.y;\n }\n\n return {\n top: top,\n left: left\n };\n },\n\n show: function(e) {\n var tooltip = this;\n\n this.anchor = e.anchor;\n this.element.css(normalizeStyle(e.style));\n this.element.toggleClass(TOOLTIP_INVERSE, !!e.className);\n this.element.toggleClass(SHARED_TOOLTIP_CLASS, !!e.shared);\n\n var content = e.shared ? this._sharedContent(e) : this._pointContent(e.point);\n this.element.find('.k-tooltip-content').html(content);\n\n if (!tooltip.options.autoHide) {\n tooltip.element.off(\"click\" + NS).on(\"click\" + NS, \".k-tooltip-button\", tooltip._closeTooltipHandler);\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler)\n .on(tooltip.downEvent, tooltip._closeTooltipHandler);\n }\n\n this._clearShowTimeout();\n this.showTimeout = setTimeout(this.move, TOOLTIP_SHOW_DELAY);\n },\n\n hide: function(forceHide) {\n var tooltip = this;\n\n if (!tooltip.options.autoHide && !forceHide) {\n return;\n }\n\n clearTimeout(tooltip.showTimeout);\n tooltip._hideElement();\n\n if (tooltip.visible) {\n tooltip.point = null;\n tooltip.visible = false;\n tooltip.index = null;\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler);\n }\n },\n\n _closeTooltip: function(e) {\n var target = $(e.target);\n\n if (!target.is(\".k-chart-tooltip, .k-tooltip-content\")) {\n e.preventDefault();\n this.chartElement.data(\"kendoChart\")._instance.hideElements();\n this.hide(true);\n }\n },\n\n _sharedContent: function(e) {\n var points = e.points;\n var nameColumn = dataviz.grep(points, function(point) {\n return defined(point.series.name);\n }).length;\n\n var colorMarker = e.series.length > 1;\n var colspan = 1;\n if (nameColumn) {\n colspan++;\n }\n if (colorMarker) {\n colspan++;\n }\n\n var template = kendo.template(this.options.sharedTemplate);\n var content = template({\n points: points,\n category: e.category,\n categoryText: e.categoryText,\n content: this._pointContent,\n colorMarker: colorMarker,\n nameColumn: nameColumn,\n colspan: colspan\n });\n\n return content;\n },\n\n _measure: function() {\n this._ensureElement();\n\n var size = {\n width: outerWidth(this.element),\n height: outerHeight(this.element)\n };\n\n return size;\n },\n\n _ensureElement: function() {\n if (this.element) {\n this.element\n .appendTo(document.body)\n .on(MOUSELEAVE_NS, this._mouseleave);\n }\n },\n\n _mouseleave: function(e) {\n var target = e.relatedTarget;\n var chart = this.chartElement[0];\n if (target && target !== chart && !$.contains(chart, target)) {\n this.trigger(LEAVE);\n }\n },\n\n _hideElement: function() {\n var tooltip = this;\n var element = this.element;\n if (element) {\n element.fadeOut({\n always: function() {\n if (!tooltip.visible) {\n element.off(MOUSELEAVE_NS).remove();\n }\n }\n });\n }\n },\n\n _pointContent: function(point) {\n var tooltip = this,\n options = deepExtend({}, tooltip.options, point.options.tooltip),\n content, tooltipTemplate;\n\n if (defined(point.value)) {\n content = point.value.toString();\n }\n\n if (options.template) {\n tooltipTemplate = template(options.template);\n content = tooltipTemplate({\n value: point.value,\n category: point.category,\n series: point.series,\n dataItem: point.dataItem,\n percentage: point.percentage,\n runningTotal: point.runningTotal,\n total: point.total,\n low: point.low,\n high: point.high,\n xLow: point.xLow,\n xHigh: point.xHigh,\n yLow: point.yLow,\n yHigh: point.yHigh\n });\n } else if (options.format) {\n content = point.formatValue(options.format);\n }\n\n return content;\n },\n\n _fit: function(offset, size, viewPortSize) {\n var output = 0;\n\n if (offset + size > viewPortSize) {\n output = viewPortSize - (offset + size);\n }\n\n if (offset < 0) {\n output = -offset;\n }\n\n return output;\n }\n });\n\n var CrosshairTooltip = Tooltip.extend({\n init: function(chartElement, options) {\n Tooltip.fn.init.call(this, chartElement, options);\n this.element.addClass(\"k-chart-crosshair-tooltip\");\n },\n\n show: function(e) {\n var element = this.element;\n\n if (element) {\n this.anchor = e.anchor;\n this.element.css(e.style);\n this.element.html(this.content(e));\n\n this.move();\n }\n },\n\n move: function() {\n var tooltip = this,\n element = tooltip.element,\n offset = tooltip._offset();\n\n tooltip._ensureElement();\n element.css({ top: offset.top, left: offset.left }).show();\n },\n\n content: function(e) {\n var content = e.value,\n options = e.crosshair.options.tooltip;\n\n if (options.template) {\n content = template(options.template)({\n value: content\n });\n }\n\n return content;\n },\n\n hide: function() {\n this.element.hide();\n }\n });\n\n var ChartPane = Class.extend({\n init: function(chart, pane) {\n this._chart = chart;\n this._pane = pane;\n this.visual = pane.visual;\n this.chartsVisual = pane.chartContainer.visual;\n this.name = pane.options.name;\n },\n\n series: function() {\n var chart = this._chart;\n var seriesByPane = chart._plotArea.groupSeriesByPane();\n var series = seriesByPane[this.name || \"default\"];\n\n var result = [];\n if (series) {\n for (var idx = 0; idx < series.length; idx++) {\n result.push(new ChartSeries(chart, series[idx]));\n }\n }\n\n return result;\n }\n });\n\n var ChartSeries = Class.extend({\n init: function(chart, options) {\n this._chart = chart;\n this._options = options;\n },\n\n points: function(filter) {\n var points = this._points;\n if (!points) {\n var series = this._seriesOptions();\n var plotArea = this._chart._plotArea;\n this._points = points = plotArea.pointsBySeriesIndex(series.index);\n }\n if (kendo.isFunction(filter)) {\n points = this._filterPoints(points, filter);\n }\n\n\n return points;\n },\n\n data: function(data) {\n var series = this._seriesOptions();\n if (data) {\n var chart = this._chart;\n var plotArea = chart._plotArea;\n\n series.data = data;\n\n if (series.categoryField) {\n var axis = plotArea.seriesCategoryAxis(series);\n var options = [].concat(chart.options.categoryAxis);\n\n chart._instance.bindCategoryAxisFromSeries(options[axis.axisIndex], axis.axisIndex);\n }\n\n chart._noTransitionsRedraw();\n this._clearFields();\n }\n\n return series.data;\n },\n\n findPoint: function(filter) {\n var points = this.points();\n for (var idx = 0; idx < points.length; idx++) {\n if (filter(points[idx])) {\n return points[idx];\n }\n }\n },\n\n toggleHighlight: function(show, elements) {\n if (!elements) {\n elements = this.points();\n } else if (kendo.isFunction(elements)) {\n elements = this.points(elements);\n } else {\n elements = isArray(elements) ? elements : [elements];\n }\n\n this._chart._instance.togglePointsHighlight(show, elements);\n },\n\n toggleVisibility: function(visible, filter) {\n var chart = this._chart;\n var seriesOptions = this._seriesOptions();\n var hasFilter = kendo.isFunction(filter);\n if (!hasFilter) {\n seriesOptions.visible = visible;\n chart._seriesVisibility.save(seriesOptions);\n } else {\n if (inArray(seriesOptions.type, [PIE, DONUT, FUNNEL])) {\n var data = this._filterData(filter);\n for (var idx = 0; idx < data.length; idx++) {\n data[idx].visible = visible;\n }\n } else {\n seriesOptions.visible = function(data) {\n return filter(data.dataItem) ? visible : true;\n };\n }\n }\n\n chart._noTransitionsRedraw();\n\n this._clearFields();\n },\n\n _filterData: function(filter) {\n var data = this._seriesOptions().data;\n var length = data.length;\n var result = [];\n\n for (var idx = 0; idx < length; idx++) {\n if (filter(data[idx])) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n _filterPoints: function(points, filter) {\n var result = [];\n var length = points.length;\n for (var idx = 0; idx < length; idx++) {\n if (filter(points[idx])) {\n result.push(points[idx]);\n }\n }\n return result;\n },\n\n _seriesOptions: function() {\n var series = this._series;\n if (!series) {\n series = this._series = this._chart._seriesOptions(this._options);\n }\n return series;\n },\n\n _clearFields: function() {\n delete this._points;\n delete this._series;\n }\n });\n\n function triggerPaneRender(panes) {\n for (var idx = 0; idx < panes.length; idx++) {\n panes[idx].notifyRender();\n }\n }\n\n dataviz.Tooltip = Tooltip;\n dataviz.CrosshairTooltip = CrosshairTooltip;\n dataviz.ChartInstanceObserver = ChartInstanceObserver;\n dataviz.ChartPane = ChartPane;\n dataviz.ChartSeries = ChartSeries;\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.dataviz.chart',[\n \"./dataviz/chart/kendo-chart\",\n \"./dataviz/chart/chart\"\n ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"dataviz.chart\",\n name: \"Chart\",\n category: \"dataviz\",\n description: \"The Chart widget uses modern browser technologies to render high-quality data visualizations in the browser.\",\n depends: [ \"data\", \"userevents\", \"drawing\", \"dataviz.core\", \"dataviz.themes\" ],\n features: [{\n id: \"dataviz.chart-pdf-export\",\n name: \"PDF export\",\n description: \"Export Chart as PDF\",\n depends: [ \"pdf\" ]\n }]\n};\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","$","window","kendo","jQuery","dataviz","Class","isNumber","datavizConstants","constants","MAX_VALUE","MIN_VALUE","VALUE","CENTER","TOP","BOTTOM","LEFT","WHITE","CIRCLE","X","Y","RIGHT","BLACK","DATE","DEFAULT_PRECISION","ARC","defined","getter","isArray","ChartElement","Point","Box","alignPathToPixel","setDefaultOptions","inArray","isFunction","valueOrDefault","isObject","deepExtend","last","eventElement","getTemplate","TextBox","ShapeElement","getSpacing","CurveProcessor","append","isString","parseDate","styleValue","CategoryAxis","BoxElement","round","limitValue","grep","elementStyles","hasClasses","bindEvents","services","unbindEvents","support","drawing","Path","Animation","AnimationFactory","Group","Color","geometry","GeometryPoint","transform","ChartAxis","extend","init","axis","this","_axis","options","value","point","getCategory","getValue","slot","from","to","limit","range","valueRange","findAxisByName","name","axes","idx","length","prepareUserOptions","ChartPane","pane","visual","chartsVisual","chartContainer","_pane","ChartPlotArea","plotArea","_plotArea","backgroundVisual","_bgVisual","countNumbers","values","count","i","num","Aggregates","min","Math","max","sum","sumOrNull","result","avg","first","getField","field","row","get","SeriesBinder","_valueFields","_otherFields","_nullValue","_undefinedValue","register","seriesTypes","valueFields","otherFields","this$1","type","_makeValue","undefined","canonicalFields","series","concat","bindPoint","pointIx","item","data","pointData","fields","Array","fieldData","slice","_bindFromArray","srcValueFields","sourceFields","srcPointFields","_bindFromObject","initialValue","fieldName","array","object","srcFields","srcFieldName","sourceFieldName","push","STD_ERR","current","STD_DEV","percentRegex","standardDeviationRegex","RegExp","ErrorRangeCalculator","errorValue","initGlobalRanges","deviationMatch","exec","valueGetter","createValueGetter","average","getAverage","deviation","getStandardDeviation","multiple","parseFloat","errorRange","low","high","globalRange","indexOf","standardError","getStandardError","binder","index","OBJECT","getErrorRange","pointValue","percentValue","abs","Error","sqrt","isSample","total","squareDifferenceSum","pow","browser","INITIAL_ANIMATION_DURATION","FADEIN","GLASS","BORDER_BRIGHTNESS","TOOLTIP_OFFSET","START_SCALE","msie","ERROR_LOW_FIELD","ERROR_HIGH_FIELD","X_ERROR_LOW_FIELD","X_ERROR_HIGH_FIELD","Y_ERROR_LOW_FIELD","Y_ERROR_HIGH_FIELD","LINE_MARKER_SIZE","ZERO","INTERPOLATE","GAP","ABOVE","BELOW","SMOOTH","STEP","AREA","BAR","BOX_PLOT","BUBBLE","BULLET","CANDLESTICK","COLUMN","DONUT","FUNNEL","HEATMAP","HORIZONTAL_WATERFALL","LINE","OHLC","PIE","POLAR_AREA","POLAR_LINE","POLAR_SCATTER","RADAR_AREA","RADAR_COLUMN","RADAR_LINE","RANGE_AREA","RANGE_BAR","RANGE_COLUMN","SCATTER","SCATTER_LINE","VERTICAL_AREA","VERTICAL_BOX_PLOT","VERTICAL_BULLET","VERTICAL_LINE","VERTICAL_RANGE_AREA","WATERFALL","EQUALLY_SPACED_SERIES","LEGEND_ITEM_CLICK","LEGEND_ITEM_HOVER","LEGEND_ITEM_LEAVE","SERIES_CLICK","SERIES_HOVER","SERIES_OVER","SERIES_LEAVE","PLOT_AREA_CLICK","PLOT_AREA_HOVER","PLOT_AREA_LEAVE","DRAG","DRAG_END","DRAG_START","ZOOM_START","ZOOM","ZOOM_END","SELECT_START","SELECT","SELECT_END","RENDER","SHOW_TOOLTIP","HIDE_TOOLTIP","PANE_RENDER","LOGARITHMIC","CATEGORY","INSIDE_END","INSIDE_BASE","OUTSIDE_END","MOUSEWHEEL","MOUSEWHEEL_DELAY","MOUSEWHEEL_ZOOM_RATE","DEFAULT_ERROR_BAR_WIDTH","ErrorBarBase","isVertical","chart","fn","call","reflow","targetBox","endCaps","getAxis","valueBox","getSlot","centerBox","center","capsWidth","getCapsWidth","capValue","x","y","capStart","capEnd","linePoints","y1","y2","box","x1","x2","boxSize","width","height","floor","createVisual","rect","toRect","sender","getSender","color","line","createDefaultVisual","defaultVisual","ref","lineOptions","stroke","dashType","moveTo","lineTo","CategoricalErrorBar","animation","delay","zIndex","seriesValueAxis","MAX_EXPAND_DEPTH","evalOptions","context","state","dryRun","defaults","depth","needsEval","excluded","property","hasOwnProperty","propValue","categoriesCount","seriesCount","categories","CategoricalChart","chartService","categoryAxis","seriesCategoryAxis","valueAxisRanges","points","categoryPoints","seriesPoints","seriesOptions","_evalSeries","render","traverseDataPoints","addValue","bind","pointOptions","seriesIx","pointType","prototype","vertical","invertAxes","plotValue","isStacked100","categoryIx","otherValues","categorySum","other","stack","otherStack","group","plotRange","startValue","isStacked","positive","prevValue","isStackedBar","STRING","otherValue","valueAxis","axisCrossingValue","categoryAxisCrossingValue","convertableToNumber","stackLimits","axisName","stackName","pIx","isFinite","updateStackRange","chartSeries","limitsCache","key","limits","errorTotals","negative","sparseArrayLimits","addErrorBar","errorBars","lowValue","highValue","seriesErrorRanges","addPointErrorBar","stackedErrorRange","updateRange","errorBar","createPoint","owner","noteText","dataItem","evalPointOptions","category","_defaults","doEval","axisRange","namedValueAxes","categorySlots","chartPoints","currentSeries","categorySlot","valueSlot","pointSlot","aboveAxis","stackValue","percentage","reflowPoint","visible","reflowCategories","clip","limitPoints","limitPoint","limittedSlot","limitSlot","equals","reverse","crossingValues","axisCrossingValues","axisIndex","slotX","slotY","callback","_outOfRangeCallback","seriesIx$1","currentCategory","categoryAt","_bindPoint","seriesIx$2","outOfRangePoint","_bindCache","bindCache","formatPointValue","format","auto","PointEventsMixin","click","e","trigger","eventArgs","hover","over","out","runningTotal","element","originalEvent","NoteMixin","createNote","notes","text","label","note","Note","LinePoint","tooltipTracking","markers","labels","_rendered","size","marker","createMarker","labelTemplate","labelText","formatValue","align","vAlign","margin","left","right","markerBorder","background","border","brightness","toHex","rotation","opacity","markerBox","_childBox","childBox","clone","reflowLabel","noteTargetBox","anchor","position","alignTo","createHighlight","highlight","defaultColor","shadow","getElement","highlightVisual","highlightVisualArgs","paddingBox","halfSize","Rect","tooltipAnchor","clipBox","showTooltip","overlaps","horizontalAlign","verticalAlign","horizontal","overlapsBox","unclipElements","noclip","LineSegment","padding","HIGHLIGHT_ZINDEX","toGeometryPoints","customVisual","segmentVisual","fromPoints","closed","close","aliasFor","coords","parent","getNearestPoint","StepLineMixin","calculateStepPoints","justified","stepAxis","stepDir","dir","previousPoint","toGeometryPoint","stepPoint","lintPoint","StepLineSegment","SplineSegment","curveProcessor","segments","process","curve","apply","LineChartMixin","renderSegments","lastSegment","_segments","sortedPoints","sortPoints","pointCount","seriesMissingValues","createSegment","_addSegment","children","unshift","segment","missingValues","assumeZero","target","allPoints","nearestPointDistance","nearestPoint","pointBox","pointDistance","distanceTo","ClipAnimation","setup","_setEnd","step","pos","interpolateValue","topRight","bottomRight","suspend","setX","resume","anyHasZIndex","elements","duration","ClipAnimationMixin","createAnimation","root","getRoot","transitions","clipPath","fromRect","_setChildrenAnimation","animationPoints","LineChart","style","supportsPointInactiveOpacity","AreaSegment","prevSegment","stackPoints","createFill","fill","createStroke","lineCap","strokeSegments","_strokeSegments","createStrokeSegments","segmentsFromPoints","stackSegments","createStackSegments","map","Segment","hasStackSegment","fillSegments","hasStackSegments","fillToAxes","fillPath","crossingValue","endSlot","firstPoint","lastPoint","end","StepAreaSegment","SplineAreaSegment","controlOut","controlIn","AreaChart","previousSegment","_gapStackPoints","_stackPoints","stackPoint","startIdx","endIdx","pointOffset","_outOfRangeMinPoint","currentSeriesIx","_previousSegmentPoint","gapStackPoint","_createGapStackPoint","segmentIx","seriesIdx","AxisGroupRangeTracker","axisRanges","update","chartAxisRanges","chartRange","reset","query","BarLabel","content","textBox","textOptions","labelBox","contentBox","top","bottom","alignToClipBox","start","parentBox","hasGradientOverlay","overlay","gradient","BAR_ALIGN_MIN_WIDTH","Bar","createLabel","rectVisual","createRect","strokeOpacity","path","getBorderColor","lineJoin","createGradientOverlay","baseColor","_brightness","borderColor","forEach","forEachReverse","ClusterLayout","rtl","gap","spacing","slots","slotSize","child","StackWrap","positionAxis","childrenCount","currentChild","snapTo","wrap","BarChart","clusterType","stackType","labelOptions","negativeColor","cluster","stackWrap","getStackWrap","stackGroup","wraps","_stackGroup","zeroSlot","stackAxis","childrenLength","_setAnimationOptions","pointVisual","origin","Candlestick","ocSlot","open","lhSlot","realBody","mid","lines","reflowNote","_mainVisual","mainVisual","createOverlay","createBody","createLines","container","body","set","drawLines","lineStyle","normalColor","areNumbers","tooltip","CandlestickChart","valueParts","splitValue","hasValue","downColor","parts","BoxPlot","whiskerSlot","boxSlot","q1","q3","reflowBoxSlot","lower","upper","reflowWhiskerSlot","medianSlot","median","mean","meanSlot","meanPoints","calcMeanPoints","whiskerPoints","calcWhiskerPoints","medianPoints","calcMedianPoints","renderOutliers","outliers","outerFence","outlierValue","extremes","markersBorder","shape","reflowOutliers","move","whiskers","VerticalBoxPlot","CROSS","BoxPlotChart","filterOutliers","items","ScatterErrorBar","seriesAxes","ScatterChart","_initFields","xAxisRanges","yAxisRanges","valueErrorField","lowField","highField","createMissingValue","intlService","intl","xAxisName","xAxis","yAxisName","yAxis","xAxisRange","yAxisRange","namedXAxes","axisX","namedYAxes","axisY","currentSeriesPoints","ref$1","Bubble","radius","highlightGroup","Circle","createGradient","stops","offset","BubbleChart","_maxSize","negativeValues","updateBubblesSize","pointsCount","animationOptions","minSize","maxSize","minR","maxR","minArea","PI","maxArea","areaRange","areaRatio","area","baseZIndex","Target","Bullet","targetValueSlot","targetSlotX","targetSlotY","targetSlot","bodyVisual","create","BulletChart","wrapData","bulletOptions","bullet","isNaN","seriesItem","BaseTooltip","getStyle","pointColor","backgroundColor","font","borderWidth","paddingTop","paddingBottom","paddingLeft","paddingRight","show","tooltipOptions","isDark","className","notify","hide","destroy","CrosshairTooltip","crosshair","formatService","initAxisName","showAt","stickyMode","formattedValue","dateFormats","baseUnit","getAnchor","ref_options","lineBox","bbox","bottomLeft","translate","topLeft","Crosshair","moveLine","getBox","dim","lineStart","lineEnd","pointCategoryIndex","axisLineBox","currentAxis","ChartContainer","shouldClip","_clipBox","chartsBox","clipRect","unclipLabels","stackRoot","charts","j","Pane","isStackRoot","id","paneID","createTitle","titleOptions","title","Title","buildTitle","appendAxis","appendAxisAt","splice","appendChart","empty","removeAxis","i$1","removeChart","pop","visualStyle","renderComplete","createGridLines","clipRoot","allAxes","vGridLines","hGridLines","gridLines","altAxis","refresh","clear","renderVisual","notifyRender","axisValueField","length$1","idx$1","axis$1","lineBox$1","service","getService","paneIndex","ID","appendIfNotNull","segmentVisible","pointVisibility","bindSegments","equalsIgnoreCase","a","b","toLowerCase","filterSeriesByType","types","getDateField","isDateAxis","axisOptions","sampleCategory","dateCategory","Date","singleItemOrArray","shrinkToFit","AREA_REGEX","test","hasValue$1","findNext","getter$$1","hasItem","pointHasValue","outPoint","createOutOfRangePoints","hasMinPoint","hasMaxPoint","minPoint","maxPoint","_outOfRangeMaxPoint","PlotAreaBase","initFields","initSeries","legend","crosshairs","originalOptions","createPanes","createCrosshairs","paneDefaults","paneOptions","panes","panesLength","currentPane","crosshairOptions","currentCrosshair","removeCrosshairs","hideCrosshairs","findPane","matchingPane","findPointPane","containsPoint","axisToRemove","filteredAxes","chartToRemove","filteredCharts","addToLegend","inactiveItems","inactiveItemsLabels","seriesVisible","visibleInLegend","itemLabelOptions","markerColor","active","groupAxes","xAxes","yAxes","paneIx","paneAxes","axisIx","any","groupSeriesByPane","seriesByPane","seriesPaneName","filterVisibleSeries","unpad","reflowPanes","detachLabels","reflowAxes","reflowCharts","redraw","panesArray","cleanGradients","crossingAxes","valuesToAdd","defaultValue","alignAxisTo","targetAxis","targetCrossingValue","slotEdge","targetEdge","axisBox","alignAxes","xAnchor","yAnchor","xAnchorCrossings","yAnchorCrossings","leftAnchors","rightAnchors","topAnchors","bottomAnchors","paneId","paneAnchor","anchorCrossings","_overlap","_mirrored","mirror","pane$1","paneId$1","visible$1","anchor$1","anchorCrossings$1","COORD_PRECISION","shrinkAxisWidth","axisGroupBox","overflowX","shrink","shrinkAxisHeight","shrinked","overflowY","fitAxes","offsetX","paneBox","offsetY","currentAxis$1","reflowPaneAxes","autoRotateAxisLabels","groupedAxes","allPaneAxes","rotated","autoRotateLabels","chartPane","remainingHeight","remainingPanes","autoHeightPanes","percents","parseInt","currentPane$1","i$2","currentPane$2","backgroundBox","axesCount","axisA","axisB","chartsBoxes","boxes","addBackgroundPaths","multipath","paths","backgroundContainsPoint","isTransparent","bg","MultiPath","appendVisual","pointsByCategoryIndex","categoryIndex","pointsBySeriesIndex","seriesIndex","filterPoints","pointsBySeriesName","findPoint","paneByPoint","detachAxisGroupLabels","labelAxisCount","labelAxis","createLabelAxis","onAxis","END","START","edge","plotBands","isSingleAxis","some","reduce","acc","PlotAreaEventsMixin","_dispatchEvent","SeriesAggregator","defaultAggregates","seriesFields","_seriesFields","rootAggregate","aggregate","_series","_binder","fieldAggregate","canonicalName","aggregatePoints","srcPoints","_bindPoints","firstDataItem","dataItems","srcValues","_bindField","setValue","parentObj","split","shift","DefaultAggregates","aggregates","seriesType","RangeBar","fromOptions","toOptions","labelFrom","_createLabel","labelTo","RangeBarChart","RangeLinePoint","plotLimits","AUTO","DEFAULT_FROM_FORMAT","DEFAULT_TO_FORMAT","RangeAreaPoint","initLabelsFormat","fromPoint","toPoint","copyFields","fromBox","toBox","positionLabels","fromLabelPosition","toLabelPosition","RangeAreaSegment","toPoints","fromSegments","toPath","fromPath","SplineRangeAreaSegment","createCurveSegments","StepRangeAreaSegment","RangeAreaChart","segmentType","fromSlot","toSlot","OHLCPoint","oPoints","cPoints","lhPoints","oSlot","cSlot","OHLCChart","WaterfallSegment","WaterfallChart","createSegments","totalCategories","summary","prevPoint","AREA_SERIES","OUT_OF_RANGE_SERIES","CategoricalPlotArea","namedCategoryAxes","valueAxisRangeTracker","stack100","createCategoryAxes","aggregateCategories","createCategoryAxesLabels","createCharts","createValueAxes","paneSeries","visibleSeries","groups","groupSeriesByCategoryAxis","groupIx","createChartGroup","createAreaChart","createRangeAreaChart","createBarChart","createRangeBarChart","createBulletChart","createCandlestickChart","createBoxPlotChart","createOHLCChart","createWaterfallChart","createLineChart","srcSeries","processedSeries","_currentPointsCache","_seriesPointsCache","axisPane","dateAxis","categoryField","aggregateSeries","filterSeries","dataLength","_seriesMax","currentRangeIndices","outOfRangePoints","clearSeriesPointsCache","seriesSourcePoints","categoriesHash","srcCategories","srcData","getFn","mapCategories","totalIndex","aggregator","categoryItem","categoryIdx","totalCount","categoriesToAdd","defaultPaneName","paneName","stackableChartOptions","firstSeries","categoryAxes","unique","axisSeries","groupSeries","barChart","rangeColumnChart","bulletChart","lineChart","areaChart","rangeAreaChart","waterfallChart","axisRequiresRounding","categoryAxisName","categoryAxisIndex","centeredSeries","seriesAxis","aggregatedAxis","createLabels","definitions","isJustified","DateCategoryAxis","primaryAxis","tracker","defaultRange","baseOptions","roundToMajorUnit","defaultAxisRange","axisType","LogarithmicAxis","NumericAxis","eventType","_eventCoordinates","pointPane","updateAxisOptions","targetOptions","axesOptions","s","Highlight","_points","arrayPoints","toggleHighlight","hasHighlight","togglePointHighlight","toggleHandler","toggle","preventDefault","_defaultPrevented","isHighlighted","acceptKey","mouseKey","event","accept","ctrlKey","shiftKey","altKey","toChartAxisRanges","ranges","Pannable","_active","_panAxes","pan","delta","lock","updatedAxes","limitRange","ZoomSelection","createElement","marquee","_marquee","document","marqueeColor","appendChild","removeElement","parentNode","removeChild","setStyles","styles","zoomPane","_zoomPane","_elementOffset","_zoomPaneClipBox","pageX","pageY","chartElement","elementOffset","_selectionPosition","elementOffset$$1","selectionPosition","_updateAxisRanges","zoom","pointsRange","startLocation","location","limitValue$1","util","MIN_RATE","MAX_RATE","DEFAULT_RATE","MousewheelZoom","rate","updateRanges","zoomRange","LegendLayout","Layout","lineSpacing","orientation","alignItems","legendItem","clippedBBox","rectToBox","addVisual","LegendItem","createContainer","FloatElement","markerOptions","cursor","eventSink","_itemOverlay","widget","args","_legendItemHover","pointIndex","_unsetActivePoint","renderChildren","HORIZONTAL","POINTER","CUSTOM","Legend","createContainers","createLegendTitle","createItems","userAlign","hasTitle","itemsContainer","innerElement","hasItems","legendBox","containerCustomReflow","containerReflow","alignTarget","containerBox","createTitleLayout","appendTitleLayoutContent","layout","Boolean","PlotAreaFactory","_registry","registry","match","entry","ZOOM_ACCELERATION","SELECTOR_HEIGHT_ADJUST","createDiv","closestHandle","Selection","observer","_dateAxis","initOptions","offsetHeight","createElements","_index","onPane","wrapper","direction","selection","leftMask","rightMask","leftHandle","rightHandle","selectionStyles","leftHandleHeight","rightHandleHeight","borderLeftWidth","borderRightWidth","cssText","mousewheel","_mousewheelHandler","_mousewheel","obj","_domEvents","DomEventsBuilder","stopPropagation","_start","_move","_end","tap","_tap","press","_press","gesturestart","_gesturestart","gesturechange","_gesturechange","gestureend","_gestureend","clearTimeout","_mwTimeout","_state","_rangeEventArgs","_value","moveTarget","handle","addClass","oldRange","span","scale","removeClass","rightClick","which","mousewheelDelta","expand","setTimeout","p0","_toModelCoordinates","touches","p1","_slot","leftMaskWidth","rightMaskWidth","distance","fromValue","toValue","zDir","relative","minDelta","maxDelta","Tooltip","_current","SharedTooltip","tooltipPoints","_slotAnchor","_defaultAnchor","shared","categoryText","categoryFormat","slotCenter","centerPoint","BarChartAnimation","fromScale","abort","scaleX","scaleY","BubbleAnimation","FadeInAnimation","easing","fadeTo","PieAnimation","ScatterLineChart","missingValue","XYPlotArea","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","xAxisOptions","yAxisOptions","createXYAxis","namedAxes","isLog","typeSamples","seriesAxisName","firstPointValue","inferredDate","DateValueAxis","xAxesOptions","yAxesOptions","axisPane$1","xValues","yValues","currentValue","updateAxisOptions$1","PieSegment","sector","autoTextColor","themeLabels","theme","seriesDefaults","animationDelay","labelsOptions","labelsDistance","angle","middle","labelHeight","labelWidth","lp","startAngle","innerRadius","endAngle","createSegmentVisual","borderOptions","fallbackFill","userSpace","singleSegment","ShapeBuilder","createRing","midAndle","midPoint","tooltipAlignment","RAD_30","rad","RAD_60","radians","sine","sin","cosine","cos","DEFAULT_FONT","PieChartMixin","createLegendItem","legendOptions","pointVisible","legendItems","PIE_SECTOR_ANIM_DELAY","PieChart","seriesColors","colorsCount","anglePerValue","constantAngle","currentAngle","explode","Ring","evalSegmentOptions","segmentOptions","seriesConfigs","space","minWidth","halfMinWidth","defaultPadding","newBox","newBoxCenter","boxCenter","leftSideLabels","rightSideLabels","seriesConfig","setRadius","sort","labelComparator","leftLabelsReflow","rightLabelsReflow","distances","distanceBetweenLabels","distributeLabels","lr","firstBox","secondBox","remaining","_takeDistance","reflowLabels","amount","available","labelsCount","labelDistance","boxY","boxX","hAlignLabel","connectors","_connectorLines","connectorsColor","connectorLine","sr","crossing","intersection","pointInCircle","find","autoFit","pieCenter","bboxBottom","reverseValue","second","originalX","sector_center","cx","cy","t","a1","a2","b1","b2","uat","ub","ua","PiePlotArea","createPieChart","pieChart","DonutSegment","DONUT_SECTOR_ANIM_DELAY","DonutChart","totalSize","seriesWithoutSize","holeSize","currentSize","currentSeries$1","DonutPlotArea","createDonutChart","donutChart","DEFAULT_PADDING","PolarPlotAreaBase","createPolarAxis","createValueAxis","polarAxis","valueAxisOptions","axisDefaultRange","RadarLogarithmicAxis","RadarNumericAxis","valueAxisBox","heightDiff","PolarScatterChart","valueRadius","onCircle","PolarLineChart","SplinePolarAreaSegment","_polarAxisCenter","PolarAreaSegment","centerSegment","PolarAreaChart","_hasMissingValuesGap","xComparer","PolarPlotArea","PolarAxis","majorGridLines","minorGridLines","scatterChart","xValue","yValue","groupBySeriesIx","seriesSegments","RadarLineChart","isFirstDataPoint","isLastDataPoint","SplineRadarAreaSegment","RadarAreaSegment","RadarAreaChart","RadarSegment","RadarClusterLayout","slotAngle","slotSector","RadarStackLayout","childSector","RadarBarChart","RadarPlotArea","RadarCategoryAxis","_hasBarCharts","_isStacked100","chartOptions","FunnelSegment","chartBox","createPath","FunnelChart","labelPadding","dynamicSlopeReflow","totalHeight","firstSegment","maxSegment","lastUpperSide","previousOffset","previousHeight","nextSegment","nextPercentage","segmentSpacing","constantSlopeReflow","decreasingWidth","neckRatio","topMostWidth","finalNarrow","dynamicSlope","FunnelPlotArea","dynamicHeight","createFunnelChart","funnelChart","colorScale","minLightnessOffset","parseColor","hsl","toHSL","l","toCss","HeatmapPoint","labelColor","isRoundRect","ROUNDED_RECT","halfBorderWidth","borderRadius","HeatmapChart","setRange","indexX","indexY","xRange","yRange","ref$2","xIndex","yIndex","xIn","yIn","HeatmapPlotArea","bindCategories","createAxisLabels","xCategories","createHashSet","yCategories","has","add","createHeatmapChart","firstCategory","updateAxisOptions$2","COLOR","FIRST","FROM","MAX","MIN","NOTE_TEXT","SUMMARY_FIELD","TO","AXIS_NAMES","errorLow","errorHigh","MOUSEMOVE","CONTEXTMENU","MOUSELEAVE","MOUSEMOVE_DELAY","Chart","userOptions","themeOptions","observers","addObserver","ChartService","_initElement","_originalOptions","_theme","_initTheme","_initHandlers","_initSurface","FontLoader","preloadFonts","fontLoaded","_destroyed","_redraw","_attachEvents","_setElementClass","firstChild","seriesCopies","resolveAxisAliases","applyDefaults","applySeriesColors","getSize","chartArea","offsetWidth","resize","force","_size","hasSize","_resize","_selections","_destroySelections","_setupSelection","_noTransitionsRedraw","_model","findPaneByName","findPaneByIndex","filter","seriesName","categoryName","pointByCategoryName","togglePointsHighlight","_highlight","_sharedTooltip","_tooltip","hideTooltip","surface","_surfaceWrap","elementSize","renderAs","_destroySurface","Surface","_surfaceMouseenterHandler","_surfaceMouseleaveHandler","model","_getModel","_destroyView","traverse","draw","play","_createTooltip","_createPannable","_createZoomSelection","_createMousewheelZoom","triggerPaneRender","_navState","_cancelDomEvents","exportVisual","exportOptions","currentOptions","clearMissingValues","pannable","_pannable","zoomable","_zoomSelection","_mousewheelZoom","_toggleDragZoomEvents","allowDrag","requiresHandlers","allowZoom","_dragZoomEnabled","touchAction","_touchAction","_toggleDomEvents","drag","domEvents","toggleDrag","toggleZoom","_createSharedTooltip","applyAxisDefaults","applySeriesDefaults","colors","seriesColor","_createPlotArea","RootElement","_modelOptions","DEFAULT_WIDTH","DEFAULT_HEIGHT","skipSeries","selections","select","_selectStart","_select","_selectEnd","_clickHandler","_click","_mouseleaveHandler","_mouseleave","_mouseover","_mouseout","_mousemove","throttle","removeObserver","eventNames","_toDocumentCoordinates","isDefaultPrevented","_shouldAttachMouseMove","obj$1","_hoveredPoint","hovered","cancel","_stopChartHandlers","_gestureDistance","suspendTracking","_zooming","resumeTracking","mousewheelZoom","previousGestureDistance","scaleDelta","_drawingChartElement","leave","_startNavigation","_suppressHover","panning","ranges$1","translateRange","_endNavigation","_mousewheelZoomRate","prevented","totalDelta","scaleRange","chartEvent","_getChartElement","eventTarget","closest","coordinates","eventCoordinates","_elementPadding","_padding","clientX","clientY","inverseTransform","elementScale","invert","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","activePoint","_activePoint","multipleSeries","hasInactiveOpacity","_hasInactiveOpacity","_updateHoveredPoint","_displayTooltip","_displayInactiveOpacity","_activeChartInstance","_updateSeriesOpacity","_applySeriesOpacity","highlightPoints","chartInstance","_chartInstanceFromPoint","inactivePoints","_getInactivePoints","_getInactiveOpacityForSeries","_getAllPointsOfType","constructor","hoveredPoint","resetOpacity","currSeries","defaultOpacity","_getDefaultOpacityForSeries","inactiveOpacity","activeSeries","shouldHighlight","hasDefaultInactiveOpacity","defaultInactiveOpacity","seriesInactiveOpacity","DEFAULT_SERIES_OPACITY","_mouseMoveTrackHandler","_mouseMoveTracking","seriesPoint","_trackCrosshairs","overPlotArea","_tooltipCategoryIx","_sharedHighlight","pointArgs","hoverArgs","hideElements","keepTooltipOpen","_deferRedraw","_clearRedrawTimeout","_redrawTimeout","clearInterval","autoBind","bindCategoryAxisFromSeries","seriesLength","uniqueCategories","HashMap","bindable","dataIx","dataRow","uniqueDates","dateComparer","transpose","_isBindable","transitionsState","updateMouseMoveHandler","applyOptions","setOptions","setDirection","setIntlService","noTransitionsRedraw","unbind","aliases","alias","themeAxisDefaults","axisDefaults","mapAxisOptions","axisColor","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","bar","column","rangeColumn","verticalLine","pie","donut","verticalArea","scatter","scatterLine","bubble","candlestick","ohlc","boxPlot","verticalBullet","polarArea","polarLine","radarArea","radarLine","waterfall","sortDates","dates","comparer","srcDates","rows","rowCount","rowIx","colCount","colIx","DATA_FIELDS","fieldValue","originalValue","nullValue","amd","a3","NS","outerWidth","_outerWidth","outerHeight","_outerHeight","KendoChart","Widget","ui","DataSource","InstanceObserver","template","MOUSELEAVE_NS","AXIS_LABEL_CLICK","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","DOCUMENT_ELEMENT","documentElement","CHANGE","DATABOUND","LEAVE","MOUSEDOWN","Observable","TOOLTIP_ANIMATION_DURATION","TOOLTIP_SHOW_DELAY","TOOLTIP_INVERSE","SHARED_TOOLTIP_CLASS","RTL","ChartInstanceObserver","events","UserEvents","global","multiTouch","fastTap","handlerMap","legendItemClick","dataSource","_seriesVisibility","SeriesVisibilityState","_initDataSource","instance","_instance","_bindSeries","_bindCategories","dimensions","_setEvents","_getThemeOptions","_sourceSeries","setDataSource","_hasDataSource","_onDataChanged","_dataChangeHandler","_hasData","fetch","off","_destroyCrosshairTooltips","findSeries","ChartSeries","findSeriesByName","_createSeries","findSeriesByIndex","originalChartArea","_seriesOptions","on","relatedTarget","autoHide","themeName","SASS_THEMES","autoTheme","themes","_initChart","_createChart","_isRtl","_onInit","_initTooltip","tooltips","_crosshairTooltips","_getCrosshairTooltip","_showTooltip","_hideTooltip","_onRender","_copyMembers","names","_events","_tooltipleave","_onLegendItemClick","_legendItemClick","save","_bindData","view","grouped","seriesVisibility","groupedSeries","read","applyByGroup","applyByIndex","seriesData","_groupIx","categoriesData","_bindCategoryAxis","isRtl","css","proxyMembers","createProxyMember","arguments","nameTemplate","legacyTemplate","groupNameTemplate","seriesClone","logToConsole","_slotCount","_groupValue","ExportMixin","PDFMixin","plugin","action","persistSeriesVisibility","saveState","geom","normalizeStyle","useWithBlock","paramName","mobileScrollerSelector","attr","_mobileScroller","downEvent","applyEventMap","guid","_closeTooltipHandler","_closeTooltip","_clearShowTimeout","remove","sharedTemplate","_offset","_ensureElement","stop","animate","showTimeout","_measure","zoomLevel","viewport","scrollTop","pageYOffset","scrollLeft","pageXOffset","movable","_fit","toggleClass","_sharedContent","_pointContent","html","forceHide","_hideElement","is","nameColumn","colorMarker","colspan","appendTo","contains","fadeOut","always","tooltipTemplate","toString","xLow","xHigh","yLow","yHigh","viewPortSize","output","_chart","_options","_filterPoints","_clearFields","toggleVisibility","hasFilter","_filterData","__meta__","description","depends","features"],"mappings":"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"}