{"version":3,"file":"kendo.dataviz.chart.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendodataviz","chart","js","this","$","window","kendo","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","Title","round","limitValue","grep","elementStyles","bindEvents","services","unbindEvents","support","drawing","Path","Animation","AnimationFactory","Group","Color","geometry","GeometryPoint","transform","ChartAxis","extend","init","axis","_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$1","type","_makeValue","undefined","canonicalFields","series","concat","bindPoint","pointIx","item","fields","data","pointData","Array","fieldData","slice","_bindFromArray","srcValueFields","sourceFields","srcPointFields","_bindFromObject","initialValue","array","object","srcFields","fieldName","srcFieldName","sourceFieldName","push","current","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","Error","percentValue","abs","sqrt","isSample","total","squareDifferenceSum","pow","browser","INITIAL_ANIMATION_DURATION","FADEIN","BORDER_BRIGHTNESS","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","ZERO","INTERPOLATE","GAP","ABOVE","BELOW","SMOOTH","STEP","AREA","BAR","BOX_PLOT","BUBBLE","BULLET","CANDLESTICK","COLUMN","DONUT","FUNNEL","PYRAMID","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","DRILLDOWN","DRILLDOWN_FIELD","GLASS","TOOLTIP_OFFSET","LINE_MARKER_SIZE","MOUSEWHEEL_ZOOM_RATE","ErrorBarBase","isVertical","fn","call","reflow","targetBox","linePoints","endCaps","valueBox","getAxis","getSlot","centerBox","center","capsWidth","getCapsWidth","capValue","x","y","capStart","capEnd","y1","y2","box","x1","x2","boxSize","width","height","floor","createVisual","rect","toRect","sender","getSender","color","line","createDefaultVisual","defaultVisual","lineOptions","stroke","dashType","moveTo","lineTo","animation","delay","zIndex","CategoricalErrorBar","seriesValueAxis","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","ref","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","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","overlaps","verticalAlign","horizontalAlign","horizontal","overlapsBox","unclipElements","noclip","padding","HIGHLIGHT_ZINDEX","LineSegment","toGeometryPoints","customVisual","segmentVisual","fromPoints","closed","close","aliasFor","coords","parent","getNearestPoint","StepLineMixin","calculateStepPoints","justified","stepAxis","stepDir","dir","previousPoint","toGeometryPoint","stepPoint","lintPoint","StepLineSegment","SplineSegment","segments","process","curve","apply","LineChartMixin","renderSegments","lastSegment","_segments","sortedPoints","sortPoints","pointCount","seriesMissingValues","createSegment","_addSegment","children","unshift","segment","missingValues","nearestPoint","target","allPoints","nearestPointDistance","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","curveProcessor","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","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","getStackWrap","stackWrap","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","hasValue","splitValue","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","CROSS","VerticalBoxPlot","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","ref$1","Bubble","radius","highlightGroup","Circle","createGradient","stops","offset","BubbleChart","_maxSize","negativeValues","updateBubblesSize","pointsCount","animationOptions","minR","minSize","maxR","maxSize","minArea","PI","areaRatio","area","Target","Bullet","targetValueSlot","targetSlotX","targetSlotY","targetSlot","bodyVisual","create","BulletChart","seriesItem","wrapData","bulletOptions","bullet","isNaN","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","lineEnd","getBox","dim","lineStart","pointCategoryIndex","axisLineBox","currentAxis","ChartContainer","shouldClip","_clipBox","chartsBox","clipRect","unclipLabels","stackRoot","charts","j","isStackRoot","Pane","id","ID","createTitle","titleOptions","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","appendIfNotNull","segmentVisible","pointVisibility","bindSegments","equalsIgnoreCase","a","b","toLowerCase","filterSeriesByType","types","getDateField","isDateAxis","axisOptions","sampleCategory","dateCategory","Date","singleItemOrArray","shrinkToFit","AREA_REGEX","hasValue$1","findNext","pointHasValue","outPoint","getter$$1","hasItem","createOutOfRangePoints","hasMinPoint","hasMaxPoint","minPoint","maxPoint","test","_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","crossingValues","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","rotated","allPaneAxes","autoRotateLabels","chartPane","remainingHeight","autoHeightPanes","percents","parseInt","currentPane$1","i$2","currentPane$2","backgroundBox","axesCount","axisA","axisB","chartsBoxes","boxes","addBackgroundPaths","multipath","paths","backgroundContainsPoint","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","plotLimits","RangeLinePoint","AUTO","RangeAreaPoint","initLabelsFormat","fromPoint","toPoint","copyFields","fromBox","toBox","positionLabels","fromLabelPosition","toLabelPosition","RangeAreaSegment","toPoints","fromSegments","toPath","fromPath","SplineRangeAreaSegment","createCurveSegments","StepRangeAreaSegment","RangeAreaChart","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","categoryField","aggregateSeries","filterSeries","dataLength","_seriesMax","currentRangeIndices","outOfRangePoints","clearSeriesPointsCache","seriesSourcePoints","categoriesHash","srcCategories","dateAxis","srcData","getFn","mapCategories","totalIndex","aggregator","categoryItem","categoryIdx","totalCount","categoriesToAdd","defaultPaneName","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","LogarithmicAxis","NumericAxis","eventType","_eventCoordinates","pointPane","updateAxisOptions","targetOptions","axesOptions","s","Highlight","_points","arrayPoints","toggleHighlight","hasHighlight","togglePointHighlight","toggleHandler","toggle","preventDefault","_defaultPrevented","isHighlighted","acceptKey","mouseKey","event","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","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","CUSTOM","Legend","createContainers","createLegendTitle","createItems","userAlign","hasTitle","itemsContainer","innerElement","hasItems","legendBox","containerCustomReflow","containerReflow","alignTarget","containerBox","createTitleLayout","appendTitleLayoutContent","layout","Boolean","PlotAreaFactory","_registry","registry","match","entry","createDiv","classNames","closestHandle","hasClasses","Selection","observer","_dateAxis","initOptions","offsetHeight","createElements","_index","onPane","wrapper","direction","selection","leftMask","rightMask","leftHandle","rightHandle","selectionStyles","leftHandleHeight","rightHandleHeight","borderLeftWidth","borderRightWidth","cssText","obj","mousewheel","_mousewheelHandler","_mousewheel","_domEvents","DomEventsBuilder","stopPropagation","_start","_move","_end","tap","_tap","press","_press","gesturestart","_gesturestart","gesturechange","_gesturechange","gestureend","_gestureend","clearTimeout","_mwTimeout","_state","_rangeEventArgs","_value","_pointInPane","modelCoords","_toModelCoordinates","eventCoordinates","handle","bodyRect","getBoundingClientRect","inBody","moveTarget","addClass","oldRange","span","scale","removeClass","rightClick","which","mousewheelDelta","expand","setTimeout","touch","touches","p0","p1","_slot","leftMaskWidth","rightMaskWidth","distance","fromValue","toValue","zDir","relative","minDelta","maxDelta","Tooltip","_current","SharedTooltip","tooltipPoints","_slotAnchor","_defaultAnchor","shared","categoryText","categoryFormat","slotCenter","BarChartAnimation","fromScale","abort","scaleX","scaleY","BubbleAnimation","easing","FadeInAnimation","fadeTo","PieAnimation","ScatterLineChart","missingValue","XYPlotArea","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","xAxisOptions","yAxisOptions","createXYAxis","inferredDate","namedAxes","isLog","typeSamples","seriesAxisName","firstPointValue","DateValueAxis","xAxesOptions","yAxesOptions","axisPane$1","xValues","yValues","currentValue","updateAxisOptions$1","PieSegment","sector","autoTextColor","themeLabels","theme","seriesDefaults","animationDelay","labelsOptions","labelsDistance","angle","middle","lp","labelHeight","labelWidth","startAngle","innerRadius","endAngle","createSegmentVisual","borderOptions","fallbackFill","userSpace","singleSegment","ShapeBuilder","createRing","midAndle","tooltipAlignment","RAD_30","rad","RAD_60","radians","sine","sin","cosine","cos","DEFAULT_FONT","PieChartMixin","createLegendItem","legendOptions","pointVisible","legendItems","PieChart","seriesColors","colorsCount","anglePerValue","constantAngle","currentAngle","explode","Ring","evalSegmentOptions","segmentOptions","seriesConfigs","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","boxX","labelsCount","labelDistance","boxY","hAlignLabel","connectors","_connectorLines","connectorsColor","connectorLine","centerPoint","sr","crossing","intersection","pointInCircle","space","find","autoFit","pieCenter","bboxBottom","reverseValue","originalX","sector_center","cx","cy","t","a1","a2","b1","b2","uat","ub","ua","PiePlotArea","createPieChart","pieChart","DonutSegment","DonutChart","holeSize","totalSize","seriesWithoutSize","currentSeries$1","DonutPlotArea","createDonutChart","donutChart","PolarPlotAreaBase","createPolarAxis","createValueAxis","polarAxis","axisType","axisDefaultRange","valueAxisOptions","RadarLogarithmicAxis","RadarNumericAxis","valueAxisBox","heightDiff","PolarScatterChart","valueRadius","onCircle","PolarLineChart","SplinePolarAreaSegment","_polarAxisCenter","PolarAreaSegment","centerSegment","PolarAreaChart","_hasMissingValuesGap","xComparer","PolarPlotArea","PolarAxis","majorGridLines","minorGridLines","scatterChart","xValue","yValue","RadarLineChart","seriesSegments","groupBySeriesIx","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","finalNarrow","dynamicSlope","dynamicHeight","PyramidChart","FunnelPlotArea","createChart","chartType","HeatmapPoint","labelColor","isRoundRect","ROUNDED_RECT","halfBorderWidth","borderRadius","HeatmapChart","setRange","minLightnessOffset","parseColor","hsl","toHSL","l","toCss","colorScale","indexX","indexY","xRange","yRange","ref$2","xIndex","yIndex","xIn","yIn","HeatmapPlotArea","bindCategories","createAxisLabels","xCategories","createHashSet","yCategories","has","add","createHeatmapChart","firstCategory","updateAxisOptions$2","COLOR","FIRST","MAX","MIN","NOTE_TEXT","errorLow","errorHigh","AXIS_NAMES","Chart","userOptions","themeOptions","observers","addObserver","ChartService","_initElement","_originalOptions","_theme","_initTheme","_initHandlers","_initSurface","FontLoader","preloadFonts","fontLoaded","_destroyed","_redraw","_attachEvents","_setElementClass","firstChild","seriesCopies","aliases","alias","resolveAxisAliases","applyDefaults","applySeriesColors","getSize","chartArea","offsetWidth","resize","force","currentSize","_size","hasSize","_resize","_selections","_destroySelections","_setupSelection","_noTransitionsRedraw","paneName","_model","findPaneByName","findPaneByIndex","filter","seriesName","categoryName","pointByCategoryName","togglePointsHighlight","_highlight","showTooltip","_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","axisDefaults","themeAxisDefaults","mapAxisOptions","axisColor","applyAxisDefaults","seriesLength","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","applySeriesDefaults","colors","seriesColor","_createPlotArea","RootElement","_modelOptions","subtitle","orderTitles","DEFAULT_WIDTH","DEFAULT_HEIGHT","skipSeries","selections","select","_selectStart","_select","_selectEnd","_clickHandler","_click","_mouseleaveHandler","_mouseleave","_mouseover","_mouseout","_mousemove","throttle","removeObserver","eventNames","_toDocumentCoordinates","_updateDrilldownPoint","_resetDrilldownPoint","_startDrilldown","isDefaultPrevented","obj$1","_shouldAttachMouseMove","_hoveredPoint","_plotAreaHovered","cancel","_stopChartHandlers","_gestureDistance","suspendTracking","_zooming","resumeTracking","mousewheelZoom","previousGestureDistance","scaleDelta","_drawingChartElement","leave","_startNavigation","_suppressHover","panning","ranges$1","translateRange","_endNavigation","_mousewheelZoomRate","totalDelta","scaleRange","chartEvent","_getChartElement","eventTarget","closest","coordinates","_elementPadding","_padding","clientX","clientY","inverseTransform","elementScale","invert","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","_showInactiveOpacity","_displayTooltip","_displayInactiveOpacity","activePoint","multipleSeries","highlightPoints","chartInstance","_activeChartInstance","_chartInstanceFromPoint","_updateSeriesOpacity","_applySeriesOpacity","inactivePoints","_getInactivePoints","_getInactiveOpacityForSeries","_getAllPointsOfType","constructor","_updateHoveredPoint","hoveredPoint","drilldown","_drilldownState","resetOpacity","currSeries","defaultOpacity","_getDefaultOpacityForSeries","inactiveOpacity","activeSeries","_activePoint","hasInactiveOpacity","_hasInactiveOpacity","_hideInactiveOpacity","hasDefaultInactiveOpacity","defaultInactiveOpacity","DEFAULT_SERIES_OPACITY","_mouseMoveTrackHandler","_mouseMoveTracking","seriesPoint","_trackCrosshairs","overPlotArea","_tooltipCategoryIx","_sharedHighlight","pointArgs","hoverArgs","hideElements","keepTooltipOpen","_deferRedraw","_clearRedrawTimeout","_redrawTimeout","clearInterval","autoBind","bindCategoryAxisFromSeries","uniqueCategories","HashMap","bindable","dataIx","dataRow","srcDates","comparer","dateComparer","dates","sortDates","uniqueDates","rows","rowCount","rowIx","colCount","colIx","transpose","_isBindable","transitionsState","updateMouseMoveHandler","applyOptions","setOptions","setDirection","setIntlService","noTransitionsRedraw","unbind","bar","column","rangeColumn","verticalLine","pie","donut","verticalArea","scatter","scatterLine","bubble","candlestick","ohlc","boxPlot","verticalBullet","polarArea","polarLine","radarArea","radarLine","waterfall","DATA_FIELDS","fieldValue","originalValue","nullValue","jQuery","undefined$1","Widget","ui","ChartBreadcrumb","_attachChartEvents","_renderBreadcrumb","events","rootItem","icon","showIcon","breadcrumb","_onChartDrilldown","_onChartDrilldownLevelChange","deferred","resetDrilldownLevel","getKendoChart","breadcrumbElement","Breadcrumb","_onBreadcrumbClick","level","findIndex","plugin","NS","outerWidth","_outerWidth","outerHeight","_outerHeight","KendoChart","DataSource","InstanceObserver","template","encode","htmlEncode","MOUSELEAVE_NS","AXIS_LABEL_CLICK","DRILLDOWN_LEVEL_CHANGE","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","DOCUMENT_ELEMENT","documentElement","CHANGE","DATABOUND","LEAVE","Observable","UserEvents","multiTouch","fastTap","ChartInstanceObserver","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","_onDrilldown","drilldownSeriesFactory","Promise","then","resolved","_onDrilldownData","drilldownSeries","Object","assign","_bindData","groupedSeries","view","grouped","seriesVisibility","read","applyByGroup","applyByIndex","seriesData","_groupIx","categoriesData","_bindCategoryAxis","isRtl","css","proxyMembers","createProxyMember","arguments","nameTemplate","seriesClone","legacyTemplate","groupNameTemplate","logToConsole","_groupValue","ExportMixin","PDFMixin","action","persistSeriesVisibility","saveState","geom","attr","applyStylesFromKendoAttributes","mobileScrollerSelector","_mobileScroller","downEvent","applyEventMap","guid","_closeTooltipHandler","_closeTooltip","_clearShowTimeout","remove","sharedTemplate","colspan","colorMarker","nameColumn","sharedTemplateIterator","_offset","_ensureElement","stop","animate","showTimeout","_measure","zoomLevel","viewport","scrollTop","pageYOffset","scrollLeft","pageXOffset","movable","_fit","fakeContainer","normalizeStyle","toggleClass","_sharedContent","_pointContent","html","forceHide","_hideElement","is","appendTo","contains","fadeOut","always","toString","tooltipTemplate","xLow","xHigh","yLow","yHigh","viewPortSize","output","_chart","_options","_filterPoints","_clearFields","toggleVisibility","_filterData"],"sources":["kendo.dataviz.chart.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.core.js'), require('kendo.color.js'), require('kendo.drawing.js'), require('kendo.dataviz.core.js'), require('kendo.breadcrumb.js'), require('kendo.data.js'), require('kendo.dataviz.themes.js'), require('kendo.userevents.js'), require('kendo.icons.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.color', 'kendo.drawing', 'kendo.dataviz.core', 'kendo.breadcrumb', 'kendo.data', 'kendo.dataviz.themes', 'kendo.userevents', 'kendo.icons'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendodataviz = global.kendodataviz || {}, global.kendodataviz.chart = global.kendodataviz.chart || {}, global.kendodataviz.chart.js = factory()));\n})(this, (function () {\n /***********************************************************************\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\n (function($) {\n /* eslint-disable space-before-blocks, space-before-function-paren, curly */\n\n window.kendo.dataviz = window.kendo.dataviz || {};\n var dataviz = kendo.dataviz;\n var Class = dataviz.Class;\n var isNumber = dataviz.isNumber;\n var datavizConstants = dataviz.constants;\n var MAX_VALUE = datavizConstants.MAX_VALUE;\n var MIN_VALUE = datavizConstants.MIN_VALUE;\n var VALUE = datavizConstants.VALUE;\n var CENTER = datavizConstants.CENTER;\n var TOP = datavizConstants.TOP;\n var BOTTOM = datavizConstants.BOTTOM;\n var LEFT = datavizConstants.LEFT;\n var WHITE = datavizConstants.WHITE;\n var CIRCLE = datavizConstants.CIRCLE;\n var X = datavizConstants.X;\n var Y = datavizConstants.Y;\n var RIGHT = datavizConstants.RIGHT;\n var BLACK = datavizConstants.BLACK;\n var DATE = datavizConstants.DATE;\n var DEFAULT_PRECISION = datavizConstants.DEFAULT_PRECISION;\n var ARC = datavizConstants.ARC;\n var defined = dataviz.defined;\n var getter = dataviz.getter;\n var isArray = dataviz.isArray;\n var ChartElement = dataviz.ChartElement;\n var Point = dataviz.Point;\n var Box = dataviz.Box;\n var alignPathToPixel = dataviz.alignPathToPixel;\n var setDefaultOptions = dataviz.setDefaultOptions;\n var inArray = dataviz.inArray;\n var isFunction = dataviz.isFunction;\n var valueOrDefault = dataviz.valueOrDefault;\n var isObject = dataviz.isObject;\n var deepExtend = dataviz.deepExtend;\n var last = dataviz.last;\n var eventElement = dataviz.eventElement;\n var getTemplate = dataviz.getTemplate;\n var TextBox = dataviz.TextBox;\n var ShapeElement = dataviz.ShapeElement;\n var getSpacing = dataviz.getSpacing;\n var CurveProcessor = dataviz.CurveProcessor;\n var append = dataviz.append;\n var isString = dataviz.isString;\n var parseDate = dataviz.parseDate;\n var styleValue = dataviz.styleValue;\n var CategoryAxis = dataviz.CategoryAxis;\n var BoxElement = dataviz.BoxElement;\n var Title = dataviz.Title;\n var round = dataviz.round;\n var limitValue = dataviz.limitValue;\n var grep = dataviz.grep;\n var elementStyles = dataviz.elementStyles;\n var bindEvents = dataviz.bindEvents;\n var services = dataviz.services;\n var unbindEvents = dataviz.unbindEvents;\n var support = kendo.support;\n var drawing = kendo.drawing;\n var Path = drawing.Path;\n var Animation = drawing.Animation;\n var AnimationFactory = drawing.AnimationFactory;\n var Group = drawing.Group;\n var Color = kendo.Color;\n var geometry = kendo.geometry;\n var GeometryPoint = geometry.Point;\n var transform = geometry.transform;\n\n var 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\n function 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\n var 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\n var 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\n function 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\n var 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\n function getField(field, row) {\n if (row === null) {\n return row;\n }\n\n var get = getter(field, true);\n return get(row);\n }\n\n var 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$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$1._valueFields[type] = valueFields;\n this$1$1._otherFields[type] = otherFields;\n this$1$1._nullValue[type] = this$1$1._makeValue(valueFields, null);\n this$1$1._undefinedValue[type] = this$1$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\n SeriesBinder.current = new SeriesBinder();\n\n var STD_ERR = \"stderr\";\n var STD_DEV = \"stddev\";\n var percentRegex = /percent(?:\\w*)\\((\\d+)\\)/;\n var standardDeviationRegex = new RegExp(\"^\" + STD_DEV + \"(?:\\\\((\\\\d+(?:\\\\.\\\\d+)?)\\\\))?$\");\n\n var 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$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$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$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$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\n var browser = support.browser || {};\n\n var INITIAL_ANIMATION_DURATION = 600;\n var FADEIN = \"fadeIn\";\n\n var GLASS = \"glass\";\n var BORDER_BRIGHTNESS = 0.8;\n var TOOLTIP_OFFSET = 5;\n var START_SCALE = browser.msie ? 0.001 : 0;\n var ERROR_LOW_FIELD = \"errorLow\";\n var ERROR_HIGH_FIELD = \"errorHigh\";\n var X_ERROR_LOW_FIELD = \"xErrorLow\";\n var X_ERROR_HIGH_FIELD = \"xErrorHigh\";\n var Y_ERROR_LOW_FIELD = \"yErrorLow\";\n var Y_ERROR_HIGH_FIELD = \"yErrorHigh\";\n var LINE_MARKER_SIZE = 8;\n var ZERO = \"zero\";\n var INTERPOLATE = \"interpolate\";\n var GAP = \"gap\";\n var ABOVE = \"above\";\n var BELOW = \"below\";\n\n var SMOOTH = \"smooth\";\n var STEP = \"step\";\n\n var AREA = \"area\";\n var BAR = \"bar\";\n var BOX_PLOT = \"boxPlot\";\n var BUBBLE = \"bubble\";\n var BULLET = \"bullet\";\n var CANDLESTICK = \"candlestick\";\n var COLUMN = \"column\";\n var DONUT = \"donut\";\n var FUNNEL = \"funnel\";\n var PYRAMID = \"pyramid\";\n var HEATMAP = \"heatmap\";\n var HORIZONTAL_WATERFALL = \"horizontalWaterfall\";\n var LINE = \"line\";\n var OHLC = \"ohlc\";\n var PIE = \"pie\";\n var POLAR_AREA = \"polarArea\";\n var POLAR_LINE = \"polarLine\";\n var POLAR_SCATTER = \"polarScatter\";\n var RADAR_AREA = \"radarArea\";\n var RADAR_COLUMN = \"radarColumn\";\n var RADAR_LINE = \"radarLine\";\n var RANGE_AREA = \"rangeArea\";\n var RANGE_BAR = \"rangeBar\";\n var RANGE_COLUMN = \"rangeColumn\";\n var SCATTER = \"scatter\";\n var SCATTER_LINE = \"scatterLine\";\n var VERTICAL_AREA = \"verticalArea\";\n var VERTICAL_BOX_PLOT = \"verticalBoxPlot\";\n var VERTICAL_BULLET = \"verticalBullet\";\n var VERTICAL_LINE = \"verticalLine\";\n var VERTICAL_RANGE_AREA = \"verticalRangeArea\";\n var WATERFALL = \"waterfall\";\n var EQUALLY_SPACED_SERIES = [\n BAR, COLUMN, OHLC, CANDLESTICK, BOX_PLOT, VERTICAL_BOX_PLOT,\n BULLET, RANGE_COLUMN, RANGE_BAR, WATERFALL, HORIZONTAL_WATERFALL\n ];\n\n var LEGEND_ITEM_CLICK = \"legendItemClick\";\n var LEGEND_ITEM_HOVER = \"legendItemHover\";\n var LEGEND_ITEM_LEAVE = \"legendItemLeave\";\n var SERIES_CLICK = \"seriesClick\";\n var SERIES_HOVER = \"seriesHover\";\n var SERIES_OVER = \"seriesOver\";\n var SERIES_LEAVE = \"seriesLeave\";\n var PLOT_AREA_CLICK = \"plotAreaClick\";\n var PLOT_AREA_HOVER = \"plotAreaHover\";\n var PLOT_AREA_LEAVE = \"plotAreaLeave\";\n var DRAG = \"drag\";\n var DRAG_END = \"dragEnd\";\n var DRAG_START = \"dragStart\";\n var ZOOM_START = \"zoomStart\";\n var ZOOM = \"zoom\";\n var ZOOM_END = \"zoomEnd\";\n var SELECT_START = \"selectStart\";\n var SELECT = \"select\";\n var SELECT_END = \"selectEnd\";\n var RENDER = \"render\";\n var SHOW_TOOLTIP = \"showTooltip\";\n var HIDE_TOOLTIP = \"hideTooltip\";\n var PANE_RENDER = \"paneRender\";\n\n var LOGARITHMIC = \"log\";\n var CATEGORY = \"category\";\n\n var INSIDE_END = \"insideEnd\";\n var INSIDE_BASE = \"insideBase\";\n var OUTSIDE_END = \"outsideEnd\";\n\n var MOUSEWHEEL = \"wheel\";\n var MOUSEWHEEL_DELAY = 150;\n var MOUSEWHEEL_ZOOM_RATE = 0.3;\n\n var DRILLDOWN = \"drilldown\";\n var DRILLDOWN_FIELD = \"drilldown\";\n\n var 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 \tPYRAMID: PYRAMID,\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 \tDRILLDOWN: DRILLDOWN,\n \tDRILLDOWN_FIELD: DRILLDOWN_FIELD\n };\n\n var DEFAULT_ERROR_BAR_WIDTH = 4;\n\n var 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$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$1.createDefaultVisual();\n var defaultVisual = this$1$1.visual;\n delete this$1$1.visual;\n return defaultVisual;\n }\n });\n } else {\n this.createDefaultVisual();\n }\n },\n\n createDefaultVisual: function() {\n var this$1$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$1.visual.append(line);\n }\n }\n });\n\n setDefaultOptions(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\n var CategoricalErrorBar = ErrorBarBase.extend({\n getAxis: function() {\n var axis = this.chart.seriesValueAxis(this.series);\n\n return axis;\n }\n });\n\n var MAX_EXPAND_DEPTH = 5;\n\n function 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\n function 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\n var 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$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$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$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$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$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$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$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$1.stackLimits(axisName, series.stack);\n\n var errorTotals = this$1$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$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, fields) {\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var state = {\n defaults: series._defaults,\n excluded: [\n \"data\", \"aggregate\", \"_events\", \"tooltip\", \"content\", \"template\",\n \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\",\n \"drilldownSeriesFactory\"\n ]\n };\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$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$1.seriesValueAxis(currentSeries);\n var point = chartPoints[pointIx++];\n\n var categorySlot = categorySlots[categoryIx];\n if (!categorySlot) {\n categorySlots[categoryIx] = categorySlot =\n this$1$1.categorySlot(categoryAxis, categoryIx, valueAxis);\n }\n\n if (point) {\n var plotRange = this$1$1.plotRange(point, valueAxis.startValue());\n var valueSlot = this$1$1.valueSlot(valueAxis, plotRange);\n if (valueSlot) {\n var pointSlot = this$1$1.pointSlot(categorySlot, valueSlot);\n\n point.aboveAxis = this$1$1.aboveAxis(point, valueAxis);\n point.stackValue = plotRange[1];\n\n if (this$1$1.options.isStacked100) {\n point.percentage = this$1$1.plotValue(point);\n }\n\n this$1$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$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$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$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$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$1.categoryAxis.categoryAt(categoryIx);\n var pointData = this$1$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$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\n setDefaultOptions(CategoricalChart, {\n series: [],\n invertAxes: false,\n isStacked: false,\n clip: true,\n limitPoints: true\n });\n\n var 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\n var 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\n var 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: 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$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$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\n LinePoint.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\n deepExtend(LinePoint.prototype, PointEventsMixin);\n deepExtend(LinePoint.prototype, NoteMixin);\n\n var 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$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$1.segmentVisual();\n\n return this$1$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\n setDefaultOptions(LineSegment, {\n closed: false\n });\n\n var 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\n function 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\n var StepLineSegment = LineSegment.extend({\n points: function() {\n return this.calculateStepPoints(this.linePoints);\n }\n });\n\n deepExtend(StepLineSegment.prototype, StepLineMixin);\n\n var 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\n var LineChartMixin = {\n renderSegments: function() {\n var this$1$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$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$1.seriesMissingValues(currentSeries) !== INTERPOLATE) {\n if (linePoints.length > 1) {\n lastSegment = this$1$1.createSegment(\n linePoints, currentSeries, seriesIx, lastSegment\n );\n this$1$1._addSegment(lastSegment);\n }\n linePoints = [];\n }\n }\n\n if (linePoints.length > 1) {\n lastSegment = this$1$1.createSegment(\n linePoints, currentSeries, seriesIx, lastSegment\n );\n this$1$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\n var 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\n setDefaultOptions(ClipAnimation, {\n duration: INITIAL_ANIMATION_DURATION\n });\n\n AnimationFactory.current.register(\"clip\", ClipAnimation);\n\n function anyHasZIndex(elements) {\n for (var idx = 0; idx < elements.length; idx++) {\n if (defined(elements[idx].zIndex)) {\n return true;\n }\n }\n }\n\n var 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\n var 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 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(pointOptions, value, fields);\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$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$1.plotValue(other);\n\n if (this$1$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\n deepExtend(LineChart.prototype, LineChartMixin, ClipAnimationMixin);\n\n var 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\n var 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\n deepExtend(StepAreaSegment.prototype, StepLineMixin);\n\n var 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\n var 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$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$1.categoryAxis.getSlot(stackPoint.categoryIx);\n stackPoint.reflow(pointSlot);\n }\n }\n },\n\n _gapStackPoints: function(linePoints, seriesIx, style) {\n var this$1$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$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$1._previousSegmentPoint(categoryIx, pointIx, pointIx + 1, currentSeriesIx));\n }\n } else {\n var gapStackPoint = this$1$1._createGapStackPoint(categoryIx);\n this$1$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\n var 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\n var 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\n setDefaultOptions(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\n function hasGradientOverlay(options) {\n var overlay = options.overlay;\n\n return overlay && overlay.gradient && overlay.gradient !== \"none\";\n }\n\n var BAR_ALIGN_MIN_WIDTH = 6;\n\n var 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$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$1.errorBars[i].reflow(targetBox);\n }\n }\n },\n\n createVisual: function() {\n var this$1$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$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\n deepExtend(Bar.prototype, PointEventsMixin);\n deepExtend(Bar.prototype, NoteMixin);\n\n Bar.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\n function forEach(elements, callback) {\n elements.forEach(callback);\n }\n\n function 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\n var 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\n setDefaultOptions(ClusterLayout, {\n vertical: false,\n gap: 0,\n spacing: 0\n });\n\n var StackWrap = ChartElement.extend({\n reflow: function(targetBox) {\n var this$1$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$1.box = childBox.clone();\n }\n\n currentChild.reflow(childBox);\n box.wrap(childBox);\n }\n }\n }\n });\n\n setDefaultOptions(StackWrap, {\n vertical: true\n });\n\n var 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 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(pointOptions, value, fields);\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$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$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\n setDefaultOptions(BarChart, {\n animation: {\n type: BAR\n }\n });\n\n var 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\n setDefaultOptions(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\n deepExtend(Candlestick.prototype, PointEventsMixin);\n deepExtend(Candlestick.prototype, NoteMixin);\n\n function areNumbers(values) {\n return countNumbers(values) === values.length;\n }\n\n var 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 series = fields.series;\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(pointOptions, value, fields);\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\n deepExtend(CandlestickChart.prototype, ClipAnimationMixin);\n\n var 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$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$1.color)) {\n markersBorder.color = this$1$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$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$1.options.vertical) {\n markerBox.move(center.x);\n } else {\n markerBox.move(undefined, center.y);\n }\n\n this$1$1.box = this$1$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\n setDefaultOptions(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\n deepExtend(BoxPlot.prototype, PointEventsMixin);\n\n var 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\n var 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\n var 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\n function hasValue(value) {\n return defined(value) && value !== null;\n }\n\n var 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 = {\n defaults: series._defaults,\n excluded: [\n \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\",\n \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\",\n \"drilldownSeriesFactory\"\n ]\n };\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$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$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$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$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$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$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 });\n setDefaultOptions(ScatterChart, {\n series: [],\n tooltip: {\n format: \"{0}, {1}\"\n },\n labels: {\n format: \"{0}, {1}\"\n },\n clip: true\n });\n deepExtend(ScatterChart.prototype, ClipAnimationMixin, {\n _bindPoint: CategoricalChart.prototype._bindPoint\n });\n\n var 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\n Bubble.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\n Bubble.prototype.defaults.highlight.zIndex = undefined;\n\n var 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$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$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$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\n setDefaultOptions(BubbleChart, {\n tooltip: {\n format: \"{3}\"\n },\n labels: {\n format: \"{3}\"\n }\n });\n\n var Target = ShapeElement.extend({\n\n });\n\n deepExtend(Target.prototype, PointEventsMixin);\n\n var 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.createLabel();\n this.createNote();\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, labels, pointData);\n this.append(this.label);\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 var label = this.label;\n if (label) {\n label.options.aboveAxis = this.aboveAxis;\n label.reflow(box);\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 pointData: function() {\n return {\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n series: this.series\n };\n },\n\n overlapsBox: function(box) {\n return this.box.overlaps(box);\n }\n });\n\n Bullet.prototype.tooltipAnchor = Bar.prototype.tooltipAnchor;\n\n setDefaultOptions(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 labels: {\n visible: false\n },\n tooltip: {\n format: \"Current: {0}
Target: {1}\"\n },\n notes: {\n label: {}\n }\n });\n\n deepExtend(Bullet.prototype, PointEventsMixin);\n deepExtend(Bullet.prototype, NoteMixin);\n\n var 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 series = fields.series;\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(bulletOptions, value, fields);\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$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$1.options.animation;\n point.createAnimation();\n }\n }\n });\n\n BulletChart.prototype._setAnimationOptions = BarChart.prototype._setAnimationOptions;\n\n setDefaultOptions(BulletChart, {\n animation: {\n type: BAR\n }\n });\n\n function 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\n var 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\n setDefaultOptions(BaseTooltip, {\n border: {\n width: 1\n },\n opacity: 1\n });\n\n var 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\n setDefaultOptions(CrosshairTooltip, {\n padding: 10\n });\n\n var 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\n setDefaultOptions(Crosshair, {\n color: BLACK,\n width: 2,\n zIndex: -1,\n tooltip: {\n visible: false\n }\n });\n\n var 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\n ChartContainer.prototype.isStackRoot = true;\n\n var 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 = Title.buildTitle(titleOptions, Pane.prototype.options.title);\n if (this.title) {\n this.append(this.title);\n }\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$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$1.axes[i]);\n }\n\n for (var i$1 = 0; i$1 < this.charts.length; i$1++) {\n plotArea.removeChart(this$1$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\n var ID = 1;\n\n function paneID() {\n return \"pane\" + ID++;\n }\n\n Pane.prototype.isStackRoot = true;\n\n setDefaultOptions(Pane, {\n zIndex: -1,\n shrinkToFit: true,\n title: {\n align: LEFT\n },\n visible: true\n });\n\n function appendIfNotNull(array, element) {\n if (element !== null) {\n array.push(element);\n }\n }\n\n function 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\n function 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\n function equalsIgnoreCase(a, b) {\n if (a && b) {\n return a.toLowerCase() === b.toLowerCase();\n }\n\n return a === b;\n }\n\n function 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\n function 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\n function isDateAxis(axisOptions, sampleCategory) {\n var type = axisOptions.type;\n var dateCategory = sampleCategory instanceof Date;\n\n return (!type && dateCategory) || equalsIgnoreCase(type, DATE);\n }\n\n function singleItemOrArray(array) {\n return array.length === 1 ? array[0] : array;\n }\n\n var AREA_REGEX = /area/i;\n\n function 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\n function 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\n function 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\n function 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\n var 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$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$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$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$1.crosshairOptions(axis);\n if (options && options.visible) {\n var currentCrosshair = new Crosshair(this$1$1.chartService, axis, options);\n\n this$1$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$1 = this;\n\n var filteredAxes = [];\n\n for (var i = 0; i < this.axes.length; i++) {\n var axis = this$1$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$1 = this;\n\n var filteredCharts = [];\n\n for (var i = 0; i < this.charts.length; i++) {\n var chart = this$1$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$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$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$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$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$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$1.axisCrossingValues(anchor, yAxes);\n }\n\n this$1$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$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$1.axisCrossingValues(anchor$1, xAxes);\n }\n\n this$1$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$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$1 = this;\n\n var axes = this.groupAxes(panes);\n\n for (var i = 0; i < panes.length; i++) {\n this$1$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$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$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$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$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\n function 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\n function 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\n function 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\n function isTransparent(color) {\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n }\n\n var allPaneAxes = function (panes) { return panes.reduce(function (acc, pane) { return acc.concat(pane.axes); }, []); };\n\n setDefaultOptions(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\n var 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\n var 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$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$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\n function 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\n var DefaultAggregates = Class.extend({\n init: function() {\n\n this._defaults = {};\n },\n\n register: function(seriesTypes, aggregates) {\n var this$1$1 = this;\n\n for (var i = 0; i < seriesTypes.length; i++) {\n this$1$1._defaults[seriesTypes[i]] = aggregates;\n }\n },\n\n query: function(seriesType) {\n return this._defaults[seriesType];\n }\n });\n\n DefaultAggregates.current = new DefaultAggregates();\n\n var 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\n RangeBar.prototype.defaults = deepExtend({}, RangeBar.prototype.defaults, {\n labels: {\n format: \"{0} - {1}\"\n },\n tooltip: {\n format: \"{1}\"\n }\n });\n\n var 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\n RangeBarChart.prototype.plotLimits = CategoricalChart.prototype.plotLimits;\n\n var RangeLinePoint = LinePoint.extend({\n aliasFor: function() {\n return this.parent;\n }\n });\n\n var AUTO = 'auto';\n var DEFAULT_FROM_FORMAT = '{0}';\n var DEFAULT_TO_FORMAT = '{1}';\n\n var 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\n deepExtend(RangeAreaPoint.prototype, PointEventsMixin);\n deepExtend(RangeAreaPoint.prototype, NoteMixin);\n\n RangeAreaPoint.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\n var 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\n var 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\n var 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\n deepExtend(StepRangeAreaSegment.prototype, StepLineMixin);\n\n var 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 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(pointOptions, value, fields);\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\n deepExtend(RangeAreaChart.prototype, LineChartMixin, ClipAnimationMixin);\n\n var 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\n var OHLCChart = CandlestickChart.extend({\n pointType: function() {\n return OHLCPoint;\n }\n });\n\n var 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\n setDefaultOptions(WaterfallSegment, {\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n }\n });\n\n var 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$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$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$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$1.append(segment);\n }\n\n prevPoint = point;\n }\n }\n }\n }\n });\n\n var AREA_SERIES = [ AREA, VERTICAL_AREA, RANGE_AREA, VERTICAL_RANGE_AREA ];\n var OUT_OF_RANGE_SERIES = [ LINE, VERTICAL_LINE ].concat(AREA_SERIES);\n\n var CategoricalPlotArea = PlotAreaBase.extend({\n initFields: function(series) {\n var this$1$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$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$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$1.addToLegend(paneSeries);\n\n var visibleSeries = this$1$1.filterVisibleSeries(paneSeries);\n if (!visibleSeries) {\n continue;\n }\n\n var groups = this$1$1.groupSeriesByCategoryAxis(visibleSeries);\n for (var groupIx = 0; groupIx < groups.length; groupIx++) {\n this$1$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$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$1.seriesCategoryAxis(currentSeries);\n var axisPane = this$1$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$1.aggregateSeries(currentSeries, categoryAxis);\n } else {\n currentSeries = this$1$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$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$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$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$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$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$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$1.chartService.rtl,\n axisCrossingValue: invertAxes ? MAX_VALUE : 0\n }, axisOptions);\n\n if (!defined(axisOptions.justified)) {\n axisOptions.justified = this$1$1.isJustified();\n }\n\n if (this$1$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$1.chartService);\n } else {\n categoryAxis = new CategoryAxis(axisOptions, this$1$1.chartService);\n }\n\n definitions[i].categories = categoryAxis.options.srcCategories;\n\n if (name) {\n if (this$1$1.namedCategoryAxes[name]) {\n throw new Error((\"Category axis with name \" + name + \" is already defined\"));\n }\n this$1$1.namedCategoryAxes[name] = categoryAxis;\n }\n\n categoryAxis.axisIndex = i;\n axes.push(categoryAxis);\n this$1$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$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$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$1.chartService\n );\n\n if (name) {\n if (this$1$1.namedValueAxes[name]) {\n throw new Error((\"Value axis with name \" + name + \" is already defined\"));\n }\n this$1$1.namedValueAxes[name] = valueAxis;\n }\n valueAxis.axisIndex = i;\n\n axes.push(valueAxis);\n this$1$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\n function updateAxisOptions(targetOptions, axis, options) {\n var axesOptions = axis instanceof CategoryAxis ? [].concat(targetOptions.categoryAxis) : [].concat(targetOptions.valueAxis);\n deepExtend(axesOptions[axis.axisIndex], options);\n }\n\n function groupSeries(series, axis, axisIx) {\n return grep(series, function(s) {\n return (axisIx === 0 && !s.categoryAxis) || (s.categoryAxis === axis);\n });\n }\n\n setDefaultOptions(CategoricalPlotArea, {\n categoryAxis: {},\n valueAxis: {}\n });\n\n deepExtend(CategoricalPlotArea.prototype, PlotAreaEventsMixin);\n\n var 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$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$1.togglePointHighlight(point, true, opacity);\n this$1$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$1 = this;\n\n var points = this._points;\n while (points.length) {\n this$1$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\n function preventDefault() {\n this._defaultPrevented = true;\n }\n\n function 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\n function 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\n var 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\n Pannable.prototype.options = {\n key: \"none\",\n lock: \"none\"\n };\n\n var 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\n ZoomSelection.prototype.options = {\n key: \"shift\",\n lock: \"none\"\n };\n\n var ref = drawing.util;\n var 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.\n var MIN_RATE = 0.01;\n var MAX_RATE = 0.9;\n var DEFAULT_RATE = 0.3;\n\n var 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$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$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\n var 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\n var 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$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$1.createVisual();\n this$1$1.renderChildren();\n this$1$1.renderComplete();\n\n var defaultVisual = this$1$1.visual;\n\n delete this$1$1.visual;\n\n return defaultVisual;\n }\n });\n this.addVisual();\n } else {\n BoxElement.fn.renderVisual.call(this);\n }\n }\n });\n\n var HORIZONTAL = \"horizontal\";\n var POINTER = \"pointer\";\n var CUSTOM = \"custom\";\n\n var 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\n setDefaultOptions(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\n var 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\n PlotAreaFactory.current = new PlotAreaFactory();\n\n var ZOOM_ACCELERATION = 3;\n var SELECTOR_HEIGHT_ADJUST = 0.1;\n\n function createDiv(classNames) {\n var element = document.createElement(\"div\");\n if (classNames) {\n element.className = classNames;\n }\n\n return element;\n }\n\n function closestHandle(element) {\n var current = element;\n while (current && !dataviz.hasClasses(current, \"k-handle\")) {\n current = current.parentNode;\n }\n\n return current;\n }\n\n var 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 k-pointer-events-none\");\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\n var selection = this.selection = createDiv(\"k-selection k-pointer-events-none\");\n\n this.leftMask = createDiv(\"k-mask k-pointer-events-none\");\n this.rightMask = createDiv(\"k-mask k-pointer-events-none\");\n\n wrapper.appendChild(this.leftMask);\n wrapper.appendChild(this.rightMask);\n wrapper.appendChild(selection);\n\n var body = this.body = createDiv(\"k-selection-bg k-pointer-events-none\");\n selection.appendChild(body);\n\n var leftHandle = this.leftHandle = createDiv(\"k-handle k-left-handle k-pointer-events-auto\");\n var rightHandle = this.rightHandle = createDiv(\"k-handle k-right-handle k-pointer-events-auto\");\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.chartElement, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n }\n\n this._domEvents = services.DomEventsBuilder.create(this.chartElement, {\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.chartElement, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n this._mousewheelHandler = null;\n }\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 _pointInPane: function(x, y) {\n var paneBox = this.categoryAxis.pane.box;\n var modelCoords = this.chart._toModelCoordinates(x, y);\n return paneBox.containsPoint(modelCoords);\n },\n\n _start: function(e) {\n var options = this.options;\n var target = eventElement(e);\n if (this._state || !target) {\n return;\n }\n\n var coords = dataviz.eventCoordinates(e);\n var inPane = this._pointInPane(coords.x, coords.y);\n if (!inPane) {\n return;\n }\n\n var handle = closestHandle(target);\n var bodyRect = this.body.getBoundingClientRect();\n var inBody = !handle && coords.x >= bodyRect.x && coords.x <= bodyRect.x + bodyRect.width &&\n coords.y >= bodyRect.y && coords.y <= bodyRect.y + bodyRect.height;\n\n this.chart._unsetActivePoint();\n this._state = {\n moveTarget: handle,\n startLocation: e.x ? e.x.location : 0,\n inBody: inBody,\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 && !state.inBody) {\n return;\n }\n\n var leftHandle = target && dataviz.hasClasses(target, \"k-left-handle\");\n var rightHandle = target && dataviz.hasClasses(target, \"k-right-handle\");\n\n if (state.inBody) {\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\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$1 = this;\n\n var delta = dataviz.mousewheelDelta(e);\n\n this._start(e);\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$1._end();\n }, MOUSEWHEEL_DELAY);\n }\n },\n\n _gesturestart: function(e) {\n var options = this.options;\n var touch = e.touches[0];\n var inPane = this._pointInPane(touch.pageX, touch.pageY);\n\n if (!inPane) {\n return;\n }\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 if (!this._state) {\n return;\n }\n\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\n setDefaultOptions(Selection, {\n visible: true,\n mousewheel: {\n zoom: \"both\"\n },\n min: MIN_VALUE,\n max: MAX_VALUE\n });\n\n var 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\n var 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\n setDefaultOptions(SharedTooltip, {\n categoryFormat: '{0:d}'\n });\n\n var 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\n setDefaultOptions(BarChartAnimation, {\n duration: INITIAL_ANIMATION_DURATION\n });\n\n AnimationFactory.current.register(BAR, BarChartAnimation);\n\n var 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\n setDefaultOptions(BubbleAnimation, {\n easing: \"easeOutElastic\"\n });\n\n AnimationFactory.current.register(BUBBLE, BubbleAnimation);\n\n var 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\n setDefaultOptions(FadeInAnimation, {\n duration: 200,\n easing: \"linear\"\n });\n\n AnimationFactory.current.register(FADEIN, FadeInAnimation);\n\n var 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\n setDefaultOptions(PieAnimation, {\n easing: \"easeOutElastic\",\n duration: INITIAL_ANIMATION_DURATION\n });\n\n AnimationFactory.current.register(PIE, PieAnimation);\n\n var 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\n deepExtend(ScatterLineChart.prototype, LineChartMixin);\n\n var 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$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$1.addToLegend(paneSeries);\n var filteredSeries = this$1$1.filterVisibleSeries(paneSeries);\n\n if (!filteredSeries) {\n continue;\n }\n\n this$1$1.createScatterChart(\n filterSeriesByType(filteredSeries, SCATTER),\n pane\n );\n\n this$1$1.createScatterLineChart(\n filterSeriesByType(filteredSeries, SCATTER_LINE),\n pane\n );\n\n this$1$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$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$1.findPane(xAxesOptions[idx].pane);\n if (inArray(axisPane, panes)) {\n xAxes.push(this$1$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$1.findPane(yAxesOptions[idx$1].pane);\n if (inArray(axisPane$1, panes)) {\n yAxes.push(this$1$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\n function updateAxisOptions$1(targetOptions, axisIndex, vertical, options) {\n var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n deepExtend(axisOptions, options);\n }\n\n setDefaultOptions(XYPlotArea, {\n xAxis: {},\n yAxis: {}\n });\n\n deepExtend(XYPlotArea.prototype, PlotAreaEventsMixin);\n\n var 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$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$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\n var RAD_30 = round(dataviz.rad(30), DEFAULT_PRECISION);\n var RAD_60 = round(dataviz.rad(60), DEFAULT_PRECISION);\n\n function 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\n setDefaultOptions(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\n deepExtend(PieSegment.prototype, PointEventsMixin);\n\n var 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\n var PIE_SECTOR_ANIM_DELAY = 70;\n\n var 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$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$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$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$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$1._takeDistance(distances, i, --left, remaining);\n remaining = this$1$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$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$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$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$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$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$1._connectorLines.push(connectorLine);\n this$1$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\n function 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\n setDefaultOptions(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\n deepExtend(PieChart.prototype, PieChartMixin);\n\n PieChart.prototype.isStackRoot = true;\n\n var 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\n var 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\n setDefaultOptions(DonutSegment, {\n overlay: {\n gradient: \"roundedGlass\"\n },\n labels: {\n position: CENTER\n },\n animation: {\n type: PIE\n }\n });\n\n deepExtend(DonutSegment.prototype, PointEventsMixin);\n\n var DONUT_SECTOR_ANIM_DELAY = 50;\n\n var 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$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$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\n setDefaultOptions(DonutChart, {\n startAngle: 90,\n connectors: {\n width: 2,\n color: \"#939393\",\n padding: 8\n }\n });\n\n var 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\n var DEFAULT_PADDING = 0.15;\n\n var 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\n var 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\n setDefaultOptions(PolarScatterChart, {\n clip: false\n });\n\n var PolarLineChart = ScatterLineChart.extend({\n\n });\n\n PolarLineChart.prototype.pointSlot = PolarScatterChart.prototype.pointSlot;\n\n setDefaultOptions(PolarLineChart, {\n clip: false\n });\n\n var 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\n var 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\n var 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$1 = this;\n\n var series = this.options.series;\n\n for (var idx = 0; idx < series.length; idx++) {\n if (this$1$1.seriesMissingValues(series[idx]) === GAP) {\n return true;\n }\n }\n },\n\n sortPoints: function(points) {\n var this$1$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$1.seriesMissingValues(point.series) === GAP) {\n delete points[idx];\n }\n }\n }\n }\n\n return points;\n }\n });\n\n function xComparer(a, b) {\n return a.value.x - b.value.x;\n }\n\n var 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\n setDefaultOptions(PolarPlotArea, {\n xAxis: {},\n yAxis: {}\n });\n\n deepExtend(PolarPlotArea.prototype, PlotAreaEventsMixin);\n\n function 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\n var 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\n setDefaultOptions(RadarLineChart, {\n clip: false,\n limitPoints: false\n });\n\n var SplineRadarAreaSegment = SplineAreaSegment.extend({\n fillToAxes: function() {}\n });\n\n var RadarAreaSegment = AreaSegment.extend({\n fillToAxes: function() {}\n });\n\n var 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\n var RadarSegment = DonutSegment.extend({\n init: function(value, options) {\n DonutSegment.fn.init.call(this, value, null, options);\n }\n });\n\n setDefaultOptions(RadarSegment, {\n overlay: {\n gradient: \"none\"\n },\n labels: {\n distance: 10\n }\n });\n\n var 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\n setDefaultOptions(RadarClusterLayout, {\n gap: 1,\n spacing: 0\n });\n\n var 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\n var 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\n RadarBarChart.prototype.reflow = CategoricalChart.prototype.reflow;\n\n setDefaultOptions(RadarBarChart, {\n clip: false,\n limitPoints: false,\n animation: {\n type: \"pie\"\n }\n });\n\n var 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\n deepExtend(RadarPlotArea.prototype, PlotAreaEventsMixin, {\n appendChart: CategoricalPlotArea.prototype.appendChart,\n aggregateSeries: CategoricalPlotArea.prototype.aggregateSeries,\n seriesSourcePoints: CategoricalPlotArea.prototype.seriesSourcePoints\n });\n\n setDefaultOptions(RadarPlotArea, {\n categoryAxis: {\n categories: []\n },\n valueAxis: {}\n });\n\n var 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$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$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\n setDefaultOptions(FunnelSegment, {\n color: WHITE,\n border: {\n width: 1\n }\n });\n\n deepExtend(FunnelSegment.prototype, PointEventsMixin);\n\n var 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$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$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$1.createSegment(value, fields);\n var label = this$1$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\n setDefaultOptions(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\n deepExtend(FunnelChart.prototype, PieChartMixin);\n\n var MAX_NECK_RATIO = 1e6;\n\n var PyramidChart = FunnelChart.extend({\n init: function(plotArea, options) {\n options.dynamicSlope = false;\n options.neckRatio = MAX_NECK_RATIO;\n\n FunnelChart.fn.init.call(this, plotArea, options);\n }\n });\n\n var FunnelPlotArea = PlotAreaBase.extend({\n render: function() {\n this.createChart(FunnelChart, filterSeriesByType(this.series, [ FUNNEL ]));\n this.createChart(PyramidChart, filterSeriesByType(this.series, [ PYRAMID ]));\n },\n\n createChart: function(chartType, series) {\n var firstSeries = series[0];\n if (!firstSeries) {\n return;\n }\n\n var chart = new chartType(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(chart);\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.\n var 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\n var 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\n deepExtend(HeatmapPoint.prototype, PointEventsMixin);\n deepExtend(HeatmapPoint.prototype, NoteMixin);\n\n HeatmapPoint.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\n var 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$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$1._bindPoint(currentSeries, seriesIx, pointIx);\n var valueFields = ref$1.valueFields;\n if (defined(valueFields.value) && valueFields.value !== null) {\n this$1$1.valueRange.min = Math.min(this$1$1.valueRange.min, valueFields.value);\n this$1$1.valueRange.max = Math.max(this$1$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 = {\n defaults: series._defaults,\n excluded: [\n \"data\", \"tooltip\", \"content\", \"template\",\n \"visual\", \"toggle\", \"drilldownSeriesFactory\"\n ]\n };\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$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$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$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$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$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$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$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 });\n setDefaultOptions(HeatmapChart, {\n series: [],\n tooltip: {\n format: \"{0}, {1}: {2}\"\n },\n labels: {\n format: \"{2}\"\n },\n clip: true\n });\n deepExtend(HeatmapChart.prototype, {\n _bindPoint: CategoricalChart.prototype._bindPoint\n });\n\n var 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$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$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$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$1.addToLegend(paneSeries);\n var filteredSeries = this$1$1.filterVisibleSeries(paneSeries);\n\n if (!filteredSeries) {\n continue;\n }\n\n this$1$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$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$1.findPane(xAxesOptions[idx].pane);\n if (inArray(axisPane, panes)) {\n xAxes.push(this$1$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$1.findPane(yAxesOptions[idx$1].pane);\n if (inArray(axisPane$1, panes)) {\n yAxes.push(this$1$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\n function updateAxisOptions$2(targetOptions, axisIndex, vertical, options) {\n var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n deepExtend(axisOptions, options);\n }\n\n setDefaultOptions(HeatmapPlotArea, {\n xAxis: {},\n yAxis: {}\n });\n\n deepExtend(HeatmapPlotArea.prototype, PlotAreaEventsMixin);\n\n var COLOR = \"color\";\n var FIRST = \"first\";\n var FROM = \"from\";\n var MAX = \"max\";\n var MIN = \"min\";\n var NOTE_TEXT = \"noteText\";\n var SUMMARY_FIELD = \"summary\";\n var TO = \"to\";\n\n PlotAreaFactory.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\n PlotAreaFactory.current.register(XYPlotArea, [\n SCATTER, SCATTER_LINE, BUBBLE\n ]);\n\n PlotAreaFactory.current.register(PiePlotArea, [ PIE ]);\n PlotAreaFactory.current.register(DonutPlotArea, [ DONUT ]);\n PlotAreaFactory.current.register(FunnelPlotArea, [ FUNNEL, PYRAMID ]);\n\n PlotAreaFactory.current.register(PolarPlotArea, [ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ]);\n PlotAreaFactory.current.register(RadarPlotArea, [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ]);\n\n PlotAreaFactory.current.register(HeatmapPlotArea, [ HEATMAP ]);\n\n SeriesBinder.current.register(\n [ BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA ],\n [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, ERROR_LOW_FIELD, ERROR_HIGH_FIELD, DRILLDOWN_FIELD ]\n );\n\n SeriesBinder.current.register(\n [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n [ FROM, TO ], [ CATEGORY, COLOR, NOTE_TEXT, DRILLDOWN_FIELD ]\n );\n\n SeriesBinder.current.register(\n [ WATERFALL, HORIZONTAL_WATERFALL ],\n [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, SUMMARY_FIELD, DRILLDOWN_FIELD ]\n );\n\n SeriesBinder.current.register([ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ], [ X, Y ], [ COLOR, DRILLDOWN_FIELD ]);\n SeriesBinder.current.register([ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ], [ VALUE ], [ COLOR, DRILLDOWN_FIELD ]);\n\n SeriesBinder.current.register(\n [ FUNNEL, PYRAMID ],\n [ VALUE ], [ CATEGORY, COLOR, \"visibleInLegend\", \"visible\", DRILLDOWN_FIELD ]\n );\n\n DefaultAggregates.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\n DefaultAggregates.current.register(\n [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n { from: MIN, to: MAX, color: FIRST, noteText: FIRST }\n );\n\n DefaultAggregates.current.register(\n [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ],\n { value: MAX, color: FIRST }\n );\n\n SeriesBinder.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\n SeriesBinder.current.register(\n [ BUBBLE ], [ X, Y, \"size\" ], [ COLOR, CATEGORY, NOTE_TEXT ]\n );\n\n SeriesBinder.current.register(\n [ HEATMAP ],\n [ X, Y, VALUE ], [ COLOR, NOTE_TEXT ]\n );\n\n SeriesBinder.current.register(\n [ CANDLESTICK, OHLC ],\n [ \"open\", \"high\", \"low\", \"close\" ], [ CATEGORY, COLOR, \"downColor\", NOTE_TEXT ]\n );\n\n DefaultAggregates.current.register(\n [ CANDLESTICK, OHLC ],\n { open: MAX, high: MAX, low: MIN, close: MAX,\n color: FIRST, downColor: FIRST, noteText: FIRST }\n );\n\n SeriesBinder.current.register(\n [ BOX_PLOT, VERTICAL_BOX_PLOT ],\n [ \"lower\", \"q1\", \"median\", \"q3\", \"upper\", \"mean\", \"outliers\" ], [ CATEGORY, COLOR, NOTE_TEXT, DRILLDOWN_FIELD ]\n );\n\n DefaultAggregates.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\n SeriesBinder.current.register(\n [ BULLET, VERTICAL_BULLET ],\n [ \"current\", \"target\" ], [ CATEGORY, COLOR, \"visibleInLegend\", NOTE_TEXT, DRILLDOWN_FIELD ]\n );\n\n DefaultAggregates.current.register(\n [ BULLET, VERTICAL_BULLET ],\n { current: MAX, target: MAX, color: FIRST, noteText: FIRST }\n );\n\n SeriesBinder.current.register(\n [ PIE, DONUT ],\n [ VALUE ], [ CATEGORY, COLOR, \"explode\", \"visibleInLegend\", \"visible\", DRILLDOWN_FIELD ]\n );\n\n var AXIS_NAMES = [ CATEGORY, VALUE, X, Y ];\n\n var MOUSEMOVE = \"mousemove\";\n var CONTEXTMENU = \"contextmenu\";\n var MOUSELEAVE = \"mouseleave\";\n var MOUSEMOVE_DELAY = 20;\n\n var Chart = Class.extend({\n init: function(element, userOptions, themeOptions, context) {\n var this$1$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$1.fontLoaded = true;\n if (!this$1$1._destroyed) {\n this$1$1.trigger('init');\n this$1$1._redraw();\n this$1$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 (inArray(firstSeries.type, [ PIE, FUNNEL, PYRAMID ])) {\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 var title = Title.buildTitle(options.title);\n var subtitle = Title.buildTitle(options.subtitle, {\n align: options.title.align,\n position: options.title.position\n });\n model.append.apply(model, Title.orderTitles([title, subtitle]));\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$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$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 args.sender = this;\n\n if (name === SHOW_TOOLTIP) {\n args.anchor.point = this._toDocumentCoordinates(args.anchor.point);\n } else if (name === SERIES_OVER) {\n this._updateDrilldownPoint(args.point);\n } else if (name === SERIES_LEAVE) {\n this._resetDrilldownPoint();\n } else if (name === SERIES_CLICK) {\n this._startDrilldown(args.point);\n }\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._plotAreaHovered) {\n this._plotAreaHovered = false;\n this.trigger(PLOT_AREA_LEAVE);\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$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$1.trigger(ZOOM_END, args);\n this$1$1._zooming = false;\n if (this$1$1.surface) {\n this$1$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$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$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$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$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$1 = this;\n\n var current = element;\n while (current) {\n if (current.click) {\n current.click(this$1$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 this._showInactiveOpacity(point, e);\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$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$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 _updateDrilldownPoint: function(point) {\n if (!point || !point.series) {\n return;\n }\n\n var ref = SeriesBinder.current.bindPoint(point.series, null, point.dataItem);\n var fields = ref.fields;\n if (fields.drilldown) {\n this._drilldownState = { cursor: this.element.style.cursor };\n this.element.style.cursor = 'pointer';\n }\n },\n\n _resetDrilldownPoint: function() {\n if (this._drilldownState) {\n this.element.style.cursor = this._drilldownState.cursor;\n this._drilldownState = null;\n }\n },\n\n _startDrilldown: function(point) {\n if (!point || !point.series) {\n return;\n }\n\n var series = point.series;\n var ref = SeriesBinder.current.bindPoint(series, null, point.dataItem);\n var fields = ref.fields;\n var value = fields.drilldown;\n if (value) {\n var args = { series: series, point: point, value: value, sender: this };\n this.trigger(DRILLDOWN, args);\n }\n },\n\n _updateSeriesOpacity: function(point, resetOpacity) {\n var this$1$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$1._getDefaultOpacityForSeries(currSeries);\n var inactiveOpacity = this$1$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$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$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 _showInactiveOpacity: function(point, e) {\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 }\n\n return point;\n },\n\n _hideInactiveOpacity: function(point) {\n var multipleSeries = this._plotArea.series.length > 1;\n var hasInactiveOpacity = this._hasInactiveOpacity();\n if (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\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 this._hideInactiveOpacity(point);\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 this._plotAreaHovered = true;\n this._plotArea.hover(this, e);\n } else if (this._plotAreaHovered && !overPlotArea) {\n this._plotAreaHovered = false;\n this.trigger(PLOT_AREA_LEAVE);\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$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$1.bindCategoryAxisFromSeries(axis, axisIx);\n }\n }\n },\n\n bindCategoryAxisFromSeries: function(axis, axisIx) {\n var this$1$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$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, PYRAMID ])) {\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 this._resetDrilldownPoint();\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\n function 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\n function 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\n function 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\n function 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\n function 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\n function 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\n function 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\n function 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\n function 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\n var DATA_FIELDS = [ 'data', 'categories' ];\n\n function 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\n function triggerPaneRender(panes) {\n for (var idx = 0; idx < panes.length; idx++) {\n panes[idx].notifyRender();\n }\n }\n\n setDefaultOptions(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\n kendo.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 (function($, undefined$1) {\n\n var kendo = window.kendo;\n var dataviz = kendo.dataviz;\n var Widget = kendo.ui.Widget;\n\n var ChartBreadcrumb = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n\n if (!options.chart) {\n throw new Error('ChartBreadcrumb: No Chart instance supplied as `options.chart`');\n }\n\n this._attachChartEvents();\n this._renderBreadcrumb();\n\n kendo.notify(this, dataviz.ui);\n },\n\n events: [],\n\n options: {\n name: \"ChartBreadcrumb\",\n rootItem: {\n type: 'rootitem',\n icon: 'home',\n text: 'Home',\n showIcon: true\n }\n },\n\n destroy: function() {\n if (this.breadcrumb) {\n this.breadcrumb.destroy();\n this.breadcrumb = null;\n }\n\n if (this.chart) {\n this.chart.unbind('drilldown', this._onChartDrilldown);\n this.chart.unbind('drilldownLevelChange', this._onChartDrilldownLevelChange);\n this.chart = null;\n }\n\n Widget.fn.destroy.call(this);\n },\n\n _attachChartEvents: function _attachChartEvents(deferred) {\n var this$1$1 = this;\n\n var options = this.options;\n\n if (typeof options.chart.resetDrilldownLevel === 'function') {\n this.chart = options.chart;\n } else if (typeof options.chart === 'string') {\n this.chart = $(options.chart).getKendoChart() || $('#' + options.chart).getKendoChart();\n\n if (!this.chart && !deferred) {\n setTimeout(function () { return this$1$1._attachChartEvents(true); });\n return;\n }\n } else {\n throw new Error('ChartBreadcrumb: `options.chart` must be a Chart instance, element ID or a selector');\n }\n\n this._onChartDrilldown = this._onChartDrilldown.bind(this);\n this.chart.bind('drilldown', this._onChartDrilldown);\n\n this._onChartDrilldownLevelChange = this._onChartDrilldownLevelChange.bind(this);\n this.chart.bind('drilldownLevelChange', this._onChartDrilldownLevelChange);\n },\n\n _renderBreadcrumb: function() {\n var this$1$1 = this;\n\n var breadcrumbElement = $('