{"version":3,"file":"kendo.dataviz.chart.min.js","names":["factory","define","amd","$","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","hasClasses","bindEvents","services","unbindEvents","support","drawing","Path","Animation","AnimationFactory","Group","Color","geometry","GeometryPoint","transform","ChartAxis","extend","init","axis","this","_axis","options","value","point","getCategory","getValue","slot","from","to","limit","range","valueRange","findAxisByName","name","axes","idx","length","prepareUserOptions","ChartPane","pane","visual","chartsVisual","chartContainer","_pane","ChartPlotArea","plotArea","_plotArea","backgroundVisual","_bgVisual","countNumbers","values","count","i","num","Aggregates","min","Math","max","sum","sumOrNull","result","avg","first","getField","field","row","get","SeriesBinder","_valueFields","_otherFields","_nullValue","_undefinedValue","register","seriesTypes","valueFields","otherFields","this$1$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","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","GLASS","TOOLTIP_OFFSET","LINE_MARKER_SIZE","MOUSEWHEEL_ZOOM_RATE","ErrorBarBase","isVertical","chart","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","closestHandle","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","moveTarget","handle","addClass","oldRange","span","scale","removeClass","rightClick","which","mousewheelDelta","expand","setTimeout","p0","_toModelCoordinates","touches","p1","_slot","leftMaskWidth","rightMaskWidth","distance","fromValue","toValue","zDir","relative","minDelta","maxDelta","Tooltip","_current","SharedTooltip","tooltipPoints","_slotAnchor","_defaultAnchor","shared","categoryText","categoryFormat","slotCenter","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","FunnelPlotArea","createFunnelChart","funnelChart","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","isDefaultPrevented","obj$1","_shouldAttachMouseMove","_hoveredPoint","hovered","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","eventCoordinates","_elementPadding","_padding","clientX","clientY","inverseTransform","elementScale","invert","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","activePoint","_activePoint","multipleSeries","hasInactiveOpacity","_hasInactiveOpacity","_updateHoveredPoint","_displayTooltip","_displayInactiveOpacity","_activeChartInstance","_updateSeriesOpacity","_applySeriesOpacity","highlightPoints","chartInstance","_chartInstanceFromPoint","inactivePoints","_getInactivePoints","_getInactiveOpacityForSeries","_getAllPointsOfType","constructor","hoveredPoint","resetOpacity","currSeries","defaultOpacity","_getDefaultOpacityForSeries","inactiveOpacity","activeSeries","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","NS","outerWidth","_outerWidth","outerHeight","_outerHeight","KendoChart","Widget","ui","DataSource","InstanceObserver","template","MOUSELEAVE_NS","AXIS_LABEL_CLICK","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","DOCUMENT_ELEMENT","documentElement","CHANGE","DATABOUND","LEAVE","Observable","events","UserEvents","global","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","_bindData","groupedSeries","view","grouped","seriesVisibility","read","applyByGroup","applyByIndex","seriesData","_groupIx","categoriesData","_bindCategoryAxis","isRtl","css","proxyMembers","createProxyMember","arguments","nameTemplate","seriesClone","legacyTemplate","groupNameTemplate","logToConsole","_slotCount","_groupValue","ExportMixin","PDFMixin","plugin","action","persistSeriesVisibility","saveState","geom","useWithBlock","paramName","mobileScrollerSelector","attr","_mobileScroller","downEvent","applyEventMap","guid","_closeTooltipHandler","_closeTooltip","_clearShowTimeout","remove","sharedTemplate","_offset","_ensureElement","stop","animate","showTimeout","_measure","zoomLevel","viewport","scrollTop","pageYOffset","scrollLeft","pageXOffset","movable","_fit","normalizeStyle","toggleClass","_sharedContent","_pointContent","html","forceHide","_hideElement","is","nameColumn","colorMarker","colspan","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 (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.color', 'kendo.drawing', 'kendo.dataviz.core', 'kendo.data', 'kendo.dataviz.themes', 'kendo.userevents'], factory) :\n factory();\n})((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 hasClasses = dataviz.hasClasses;\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 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 = \"DOMMouseScroll mousewheel\";\n var MOUSEWHEEL_DELAY = 150;\n var MOUSEWHEEL_ZOOM_RATE = 0.3;\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 \tBAR: BAR,\n \tCANDLESTICK: CANDLESTICK,\n \tPIE: PIE,\n \tCOLUMN: COLUMN,\n \tAREA: AREA,\n \tVERTICAL_BULLET: VERTICAL_BULLET,\n \tBOX_PLOT: BOX_PLOT,\n \tOHLC: OHLC,\n \tWATERFALL: WATERFALL,\n \tLINE: LINE,\n \tBULLET: BULLET,\n \tVERTICAL_LINE: VERTICAL_LINE,\n \tVERTICAL_AREA: VERTICAL_AREA,\n \tRANGE_AREA: RANGE_AREA,\n \tVERTICAL_RANGE_AREA: VERTICAL_RANGE_AREA,\n \tRANGE_COLUMN: RANGE_COLUMN,\n \tVERTICAL_BOX_PLOT: VERTICAL_BOX_PLOT,\n \tRANGE_BAR: RANGE_BAR,\n \tHORIZONTAL_WATERFALL: HORIZONTAL_WATERFALL,\n \tSCATTER: SCATTER,\n \tSCATTER_LINE: SCATTER_LINE,\n \tBUBBLE: BUBBLE,\n \tRADAR_AREA: RADAR_AREA,\n \tRADAR_LINE: RADAR_LINE,\n \tRADAR_COLUMN: RADAR_COLUMN,\n \tPOLAR_LINE: POLAR_LINE,\n \tPOLAR_AREA: POLAR_AREA,\n \tPOLAR_SCATTER: POLAR_SCATTER,\n \tRENDER: RENDER,\n \tPLOT_AREA_CLICK: PLOT_AREA_CLICK,\n \tPLOT_AREA_HOVER: PLOT_AREA_HOVER,\n \tPLOT_AREA_LEAVE: PLOT_AREA_LEAVE,\n \tLOGARITHMIC: LOGARITHMIC,\n \tDRAG: DRAG,\n \tDRAG_START: DRAG_START,\n \tDRAG_END: DRAG_END,\n \tZOOM_START: ZOOM_START,\n \tZOOM: ZOOM,\n \tZOOM_END: ZOOM_END,\n \tSELECT_START: SELECT_START,\n \tSELECT: SELECT,\n \tSELECT_END: SELECT_END,\n \tPANE_RENDER: PANE_RENDER,\n \tGAP: GAP,\n \tDONUT: DONUT,\n \tINSIDE_END: INSIDE_END,\n \tINSIDE_BASE: INSIDE_BASE,\n \tOUTSIDE_END: OUTSIDE_END,\n \tMOUSEWHEEL: MOUSEWHEEL,\n \tMOUSEWHEEL_DELAY: MOUSEWHEEL_DELAY,\n \tMOUSEWHEEL_ZOOM_RATE: MOUSEWHEEL_ZOOM_RATE,\n \tSHOW_TOOLTIP: SHOW_TOOLTIP,\n \tHIDE_TOOLTIP: HIDE_TOOLTIP,\n \tEQUALLY_SPACED_SERIES: EQUALLY_SPACED_SERIES,\n \tABOVE: ABOVE,\n \tBELOW: BELOW,\n \tHEATMAP: HEATMAP\n };\n\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, category, categoryIx, series, seriesIx) {\n var state = { defaults: series._defaults, excluded: [ \"data\", \"aggregate\", \"_events\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, pointOptions);\n evalOptions(pointOptions, {\n value: value,\n category: category,\n index: categoryIx,\n series: series,\n dataItem: series.data[categoryIx]\n }, state);\n }\n\n return pointOptions;\n },\n\n updateRange: function(data, fields) {\n var axisName = fields.series.axis;\n var value = data.value;\n var axisRange = this.valueAxisRanges[axisName];\n\n if (isFinite(value) && value !== null) {\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange.min = Math.min(axisRange.min, value);\n axisRange.max = Math.max(axisRange.max, value);\n }\n },\n\n seriesValueAxis: function(series) {\n var plotArea = this.plotArea;\n var axisName = series.axis;\n var axis = axisName ? plotArea.namedValueAxes[axisName] : plotArea.valueAxis;\n\n if (!axis) {\n throw new Error(\"Unable to locate value axis with name \" + axisName);\n }\n\n return axis;\n },\n\n reflow: function(targetBox) {\n var this$1$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: this.series.opacity || options.opacity,\n zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n animation: options.animation,\n visual: options.visual\n }, {\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n category: this.category\n });\n\n return marker;\n },\n\n markerBox: function() {\n if (!this.marker) {\n this.marker = this.createMarker();\n this.marker.reflow(this._childBox);\n }\n\n return this.marker.box;\n },\n\n reflow: function(targetBox) {\n var this$1$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 categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var missingValues = this.seriesMissingValues(series);\n var value = data.valueFields.value;\n\n if (!defined(value) || value === null) {\n if (missingValues === ZERO) {\n value = 0;\n } else {\n return null;\n }\n }\n\n var pointOptions = this.pointOptions(series, seriesIx);\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n var color = data.fields.color || series.color;\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new LinePoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n plotRange: function(point) {\n var this$1$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 category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var isStacked = options.isStacked;\n var value = this.pointValue(data);\n var pointOptions = this.pointOptions(series, seriesIx);\n\n var labelOptions = pointOptions.labels;\n if (isStacked) {\n if (labelOptions.position === OUTSIDE_END) {\n labelOptions.position = INSIDE_END;\n }\n }\n\n pointOptions.isStacked = isStacked;\n\n var color = data.fields.color || series.color;\n if (value < 0 && pointOptions.negativeColor) {\n color = pointOptions.negativeColor;\n }\n\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var pointType = this.pointType();\n var point = new pointType(value, pointOptions);\n point.color = color;\n\n var cluster = children[categoryIx];\n if (!cluster) {\n var clusterType = this.clusterType();\n cluster = new clusterType({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n if (isStacked) {\n var stackWrap = this.getStackWrap(series, cluster);\n stackWrap.append(point);\n } else {\n cluster.append(point);\n }\n\n return point;\n },\n\n getStackWrap: function(series, cluster) {\n var stack = series.stack;\n var stackGroup = stack ? stack.group || stack : stack;\n var wraps = cluster.children;\n var stackWrap;\n\n if (typeof stackGroup === datavizConstants.STRING) {\n for (var i = 0; i < wraps.length; i++) {\n if (wraps[i]._stackGroup === stackGroup) {\n stackWrap = wraps[i];\n break;\n }\n }\n } else {\n stackWrap = wraps[0];\n }\n\n if (!stackWrap) {\n var stackType = this.stackType();\n stackWrap = new stackType({\n vertical: !this.options.invertAxes\n });\n stackWrap._stackGroup = stackGroup;\n cluster.append(stackWrap);\n }\n\n return stackWrap;\n },\n\n categorySlot: function(categoryAxis, categoryIx, valueAxis) {\n var options = this.options;\n var categorySlot = categoryAxis.getSlot(categoryIx);\n var startValue = valueAxis.startValue();\n\n if (options.isStacked) {\n var zeroSlot = valueAxis.getSlot(startValue, startValue, true);\n var stackAxis = options.invertAxes ? X : Y;\n categorySlot[stackAxis + 1] = categorySlot[stackAxis + 2] = zeroSlot[stackAxis + 1];\n }\n\n return categorySlot;\n },\n\n reflowCategories: function(categorySlots) {\n var children = this.children;\n var childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n\n createAnimation: function() {\n this._setAnimationOptions();\n CategoricalChart.fn.createAnimation.call(this);\n\n if (anyHasZIndex(this.options.series)) {\n this._setChildrenAnimation();\n }\n },\n\n _setChildrenAnimation: function() {\n var this$1$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 categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var pointType = this.pointType();\n var value = data.valueFields;\n var pointOptions = deepExtend({}, series);\n var color = data.fields.color || series.color;\n\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (series.type === CANDLESTICK) {\n if (value.open > value.close) {\n color = data.fields.downColor || series.downColor || series.color;\n }\n }\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n pointOptions.vertical = !this.options.invertAxes;\n\n var point = new pointType(value, pointOptions);\n point.color = color;\n\n return point;\n },\n\n splitValue: function(value) {\n return [ value.low, value.open, value.close, value.high ];\n },\n\n updateRange: function(value, fields) {\n var axisName = fields.series.axis;\n var parts = this.splitValue(value);\n var axisRange = this.valueAxisRanges[axisName];\n\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange = this.valueAxisRanges[axisName] = {\n min: Math.min.apply(Math, parts.concat([ axisRange.min ])),\n max: Math.max.apply(Math, parts.concat([ axisRange.max ]))\n };\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n\n return this.chartService.format.auto(format,\n value.open, value.high,\n value.low, value.close, point.category\n );\n },\n\n animationPoints: function() {\n return this.points;\n }\n });\n\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 = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, options);\n evalOptions(pointOptions, {\n value: value,\n series: series,\n dataItem: fields.dataItem\n }, state);\n }\n\n return pointOptions;\n },\n\n pointType: function() {\n return LinePoint;\n },\n\n pointOptions: function(series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().prototype.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n markers: {\n opacity: series.opacity\n },\n tooltip: {\n format: this.options.tooltip.format\n },\n labels: {\n format: this.options.labels.format\n }\n }, series);\n }\n\n return options;\n },\n\n createPoint: function(value, fields) {\n var series = fields.series;\n var pointOptions = this.pointOptions(series, fields.seriesIx);\n var color = fields.color || series.color;\n\n pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new LinePoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n seriesAxes: function(series) {\n var xAxisName = series.xAxis;\n var yAxisName = series.yAxis;\n var plotArea = this.plotArea;\n var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n if (!xAxis) {\n throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n }\n\n if (!yAxis) {\n throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n }\n\n return {\n x: xAxis,\n y: yAxis\n };\n },\n\n reflow: function(targetBox) {\n var this$1$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 category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var ref = this;\n var options = ref.options;\n var children = ref.children;\n var value = data.valueFields;\n\n var bulletOptions = deepExtend({\n vertical: !options.invertAxes,\n overlay: series.overlay,\n categoryIx: categoryIx,\n invertAxes: options.invertAxes\n }, series);\n\n var color = data.fields.color || series.color;\n bulletOptions = this.evalPointOptions(\n bulletOptions, value, category, categoryIx, series, seriesIx\n );\n\n if (isFunction(series.color)) {\n color = bulletOptions.color;\n }\n\n var bullet = new Bullet(value, bulletOptions);\n bullet.color = color;\n\n var cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing,\n rtl: !options.invertAxes && (this.chartService || {}).rtl\n });\n this.append(cluster);\n }\n\n cluster.append(bullet);\n\n return bullet;\n },\n\n updateRange: function(value, fields) {\n var current = value.current;\n var target = value.target;\n var axisName = fields.series.axis;\n var axisRange = this.valueAxisRanges[axisName];\n\n if (defined(current) && !isNaN(current) && defined(target && !isNaN(target))) {\n axisRange = this.valueAxisRanges[axisName] =\n axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n axisRange.min = Math.min(axisRange.min, current, target);\n axisRange.max = Math.max(axisRange.max, current, target);\n }\n },\n\n formatPointValue: function(point, format) {\n return this.chartService.format.auto(format, point.value.current, point.value.target);\n },\n\n pointValue: function(data) {\n return data.valueFields.current;\n },\n\n aboveAxis: function(point) {\n var value = point.value.current;\n\n return value > 0;\n },\n\n createAnimation: function() {\n var this$1$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 categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var value = data.valueFields;\n\n if (!hasValue(value.from) && !hasValue(value.to)) {\n if (this.seriesMissingValues(series) === ZERO) {\n value = {\n from: 0,\n to: 0\n };\n } else {\n return null;\n }\n }\n\n var pointOptions = this.pointOptions(series, seriesIx);\n pointOptions = this.evalPointOptions(\n pointOptions, value, category, categoryIx, series, seriesIx\n );\n\n var color = data.fields.color || series.color;\n if (isFunction(series.color)) {\n color = pointOptions.color;\n }\n\n var point = new RangeAreaPoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n createSegment: function(linePoints, currentSeries, seriesIx) {\n var style = (currentSeries.line || {}).style;\n var segmentType;\n if (style === \"smooth\") {\n segmentType = SplineRangeAreaSegment;\n } else if (style === \"step\") {\n segmentType = StepRangeAreaSegment;\n } else {\n segmentType = RangeAreaSegment;\n }\n\n return new segmentType(linePoints, currentSeries, seriesIx);\n },\n\n plotRange: function(point, startValue) {\n if (!point) {\n return [ startValue, startValue ];\n }\n\n return [ point.value.from, point.value.to ];\n },\n\n valueSlot: function(valueAxis, plotRange) {\n var fromSlot = valueAxis.getSlot(plotRange[0], plotRange[0], !this.options.clip);\n var toSlot = valueAxis.getSlot(plotRange[1], plotRange[1], !this.options.clip);\n if (fromSlot && toSlot) {\n return {\n from: fromSlot,\n to: toSlot\n };\n }\n },\n\n pointSlot: function(categorySlot, valueSlot) {\n var from = valueSlot.from;\n var to = valueSlot.to;\n var fromSlot, toSlot;\n\n if (this.options.invertAxes) {\n fromSlot = new Box(from.x1, categorySlot.y1, from.x2, categorySlot.y2);\n toSlot = new Box(to.x1, categorySlot.y1, to.x2, categorySlot.y2);\n } else {\n fromSlot = new Box(categorySlot.x1, from.y1, categorySlot.x2, from.y2);\n toSlot = new Box(categorySlot.x1, to.y1, categorySlot.x2, to.y2);\n }\n\n return {\n from: fromSlot,\n to: toSlot\n };\n },\n\n addValue: function(data, fields) {\n var valueFields = data.valueFields;\n if (!isNumber(valueFields.from)) {\n valueFields.from = valueFields.to;\n }\n\n if (!isNumber(valueFields.to)) {\n valueFields.to = valueFields.from;\n }\n\n CategoricalChart.fn.addValue.call(this, data, fields);\n },\n\n updateRange: function(value, fields) {\n if (value !== null && isNumber(value.from) && isNumber(value.to)) {\n var axisName = fields.series.axis;\n var axisRange = this.valueAxisRanges[axisName] = this.valueAxisRanges[axisName] || { min: MAX_VALUE, max: MIN_VALUE };\n var from = value.from;\n var to = value.to;\n\n axisRange.min = Math.min(axisRange.min, from, to);\n axisRange.max = Math.max(axisRange.max, from, to);\n }\n },\n\n formatPointValue: function(point, format) {\n var value = point.value;\n\n return this.chartService.format.auto(format, value.from, value.to);\n },\n\n animationPoints: function() {\n var points = this.points;\n var result = [];\n for (var idx = 0; idx < points.length; idx++) {\n var point = points[idx];\n if (point) {\n result.push((point.fromPoint || {}).marker);\n result.push((point.toPoint || {}).marker);\n }\n }\n\n return result.concat(this._segments);\n }\n });\n\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(className) {\n var element = document.createElement(\"div\");\n if (className) {\n element.className = className;\n }\n\n return element;\n }\n\n function closestHandle(element) {\n var current = element;\n while (current && !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\");\n elementStyles(wrapper, {\n top: options.offset.top,\n left: options.offset.left,\n width: options.width,\n height: options.height,\n direction: 'ltr'\n });\n var selection = this.selection = createDiv(\"k-selection\");\n this.leftMask = createDiv(\"k-mask\");\n this.rightMask = createDiv(\"k-mask\");\n\n wrapper.appendChild(this.leftMask);\n wrapper.appendChild(this.rightMask);\n wrapper.appendChild(selection);\n\n selection.appendChild(createDiv(\"k-selection-bg\"));\n\n var leftHandle = this.leftHandle = createDiv(\"k-handle k-left-handle\");\n var rightHandle = this.rightHandle = createDiv(\"k-handle k-right-handle\");\n leftHandle.appendChild(createDiv());\n rightHandle.appendChild(createDiv());\n\n selection.appendChild(leftHandle);\n selection.appendChild(rightHandle);\n\n this.chartElement.appendChild(wrapper);\n var selectionStyles = elementStyles(selection, [ \"borderLeftWidth\", \"borderRightWidth\", \"height\" ]);\n var leftHandleHeight = elementStyles(leftHandle, \"height\").height;\n var rightHandleHeight = elementStyles(rightHandle, \"height\").height;\n\n options.selection = {\n border: {\n left: selectionStyles.borderLeftWidth,\n right: selectionStyles.borderRightWidth\n }\n };\n\n elementStyles(leftHandle, {\n top: (selectionStyles.height - leftHandleHeight) / 2\n });\n\n elementStyles(rightHandle, {\n top: (selectionStyles.height - rightHandleHeight) / 2\n });\n\n wrapper.style.cssText = wrapper.style.cssText;\n },\n\n bindEvents: function() {\n if (this.options.mousewheel !== false) {\n this._mousewheelHandler = this._mousewheel.bind(this);\n var obj;\n bindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n }\n\n this._domEvents = services.DomEventsBuilder.create(this.wrapper, {\n stopPropagation: true, // applicable for the jQuery UserEvents\n start: this._start.bind(this),\n move: this._move.bind(this),\n end: this._end.bind(this),\n tap: this._tap.bind(this),\n press: this._press.bind(this),\n gesturestart: this._gesturestart.bind(this),\n gesturechange: this._gesturechange.bind(this),\n gestureend: this._gestureend.bind(this)\n });\n },\n\n initOptions: function() {\n var ref = this;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var box = categoryAxis.pane.chartsBox();\n var intlService = this.chart.chartService.intl;\n\n if (this._dateAxis) {\n deepExtend(options, {\n min: parseDate(intlService, options.min),\n max: parseDate(intlService, options.max),\n from: parseDate(intlService, options.from),\n to: parseDate(intlService, options.to)\n });\n }\n\n var ref$1 = elementStyles(this.chartElement, [ \"paddingLeft\", \"paddingTop\" ]);\n var paddingLeft = ref$1.paddingLeft;\n var paddingTop = ref$1.paddingTop;\n\n this.options = deepExtend({}, {\n width: box.width(),\n height: box.height() + SELECTOR_HEIGHT_ADJUST, //workaround for sub-pixel hover on the paths in chrome\n padding: {\n left: paddingLeft,\n top: paddingTop\n },\n offset: {\n left: box.x1 + paddingLeft,\n top: box.y1 + paddingTop\n },\n from: options.min,\n to: options.max\n }, options);\n },\n\n destroy: function() {\n if (this._domEvents) {\n this._domEvents.destroy();\n delete this._domEvents;\n }\n\n clearTimeout(this._mwTimeout);\n this._state = null;\n\n if (this.wrapper) {\n if (this._mousewheelHandler) {\n var obj;\n unbindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n this._mousewheelHandler = null;\n }\n this.chartElement.removeChild(this.wrapper);\n this.wrapper = null;\n }\n },\n\n _rangeEventArgs: function(range) {\n\n return {\n axis: this.categoryAxis.options,\n from: this._value(range.from),\n to: this._value(range.to)\n };\n },\n\n _start: function(e) {\n var options = this.options;\n var target = eventElement(e);\n\n if (this._state || !target) {\n return;\n }\n\n this.chart._unsetActivePoint();\n this._state = {\n moveTarget: closestHandle(target) || target,\n startLocation: e.x ? e.x.location : 0,\n range: {\n from: this._index(options.from),\n to: this._index(options.to)\n }\n };\n\n var args = this._rangeEventArgs({\n from: this._index(options.from),\n to: this._index(options.to)\n });\n\n if (this.trigger(SELECT_START, args)) {\n this._state = null;\n }\n },\n\n _press: function(e) {\n var handle;\n if (this._state) {\n handle = this._state.moveTarget;\n } else {\n handle = closestHandle(eventElement(e));\n }\n if (handle) {\n dataviz.addClass(handle, \"k-handle-active\");\n }\n },\n\n _move: function(e) {\n if (!this._state) {\n return;\n }\n\n var ref = this;\n var state = ref._state;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var range = state.range;\n var target = state.moveTarget;\n var reverse = categoryAxis.options.reverse;\n var from = this._index(options.from);\n var to = this._index(options.to);\n var min = this._index(options.min);\n var max = this._index(options.max);\n var delta = state.startLocation - e.x.location;\n var oldRange = { from: range.from, to: range.to };\n var span = range.to - range.from;\n var scale = elementStyles(this.wrapper, \"width\").width / (categoryAxis.categoriesCount() - 1);\n var offset = Math.round(delta / scale) * (reverse ? -1 : 1);\n\n if (!target) {\n return;\n }\n\n var leftHandle = hasClasses(target, \"k-left-handle\");\n var rightHandle = hasClasses(target, \"k-right-handle\");\n\n if (hasClasses(target, \"k-selection k-selection-bg\")) {\n range.from = Math.min(\n Math.max(min, from - offset),\n max - span\n );\n range.to = Math.min(\n range.from + span,\n max\n );\n } else if ((leftHandle && !reverse) || (rightHandle && reverse)) {\n range.from = Math.min(\n Math.max(min, from - offset),\n max - 1\n );\n range.to = Math.max(range.from + 1, range.to);\n } else if ((leftHandle && reverse) || (rightHandle && !reverse)) {\n range.to = Math.min(\n Math.max(min + 1, to - offset),\n max\n );\n range.from = Math.min(range.to - 1, range.from);\n }\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.move(range.from, range.to);\n this.trigger(SELECT, this._rangeEventArgs(range));\n }\n },\n\n _end: function() {\n if (this._state) {\n var moveTarget = this._state.moveTarget;\n if (moveTarget) {\n dataviz.removeClass(moveTarget, \"k-handle-active\");\n }\n\n var range = this._state.range;\n this.set(range.from, range.to);\n this.trigger(SELECT_END, this._rangeEventArgs(range));\n\n delete this._state;\n }\n },\n\n _tap: function(e) {\n var ref = this;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var coords = this.chart._eventCoordinates(e);\n var categoryIx = categoryAxis.pointCategoryIndex(new Point(coords.x, categoryAxis.box.y1));\n var from = this._index(options.from);\n var to = this._index(options.to);\n var min = this._index(options.min);\n var max = this._index(options.max);\n var span = to - from;\n var mid = from + span / 2;\n var range = {};\n var rightClick = e.event.which === 3;\n var offset = Math.round(mid - categoryIx);\n\n if (this._state || rightClick) {\n return;\n }\n\n this.chart._unsetActivePoint();\n\n if (!categoryAxis.options.justified) {\n offset--;\n }\n\n range.from = Math.min(\n Math.max(min, from - offset),\n max - span\n );\n\n range.to = Math.min(range.from + span, max);\n\n this._start(e);\n if (this._state) {\n this._state.range = range;\n this.trigger(SELECT, this._rangeEventArgs(range));\n this._end();\n }\n },\n\n _mousewheel: function(e) {\n var this$1$1 = this;\n\n var delta = dataviz.mousewheelDelta(e);\n\n this._start({ target: this.selection });\n\n if (this._state) {\n var range = this._state.range;\n\n e.preventDefault();\n e.stopPropagation();\n\n if (Math.abs(delta) > 1) {\n delta *= ZOOM_ACCELERATION;\n }\n\n if (this.options.mousewheel.reverse) {\n delta *= -1;\n }\n\n if (this.expand(delta)) {\n this.trigger(SELECT, {\n axis: this.categoryAxis.options,\n delta: delta,\n originalEvent: e,\n from: this._value(range.from),\n to: this._value(range.to)\n });\n }\n\n if (this._mwTimeout) {\n clearTimeout(this._mwTimeout);\n }\n\n this._mwTimeout = setTimeout(function () {\n this$1$1._end();\n }, MOUSEWHEEL_DELAY);\n }\n },\n\n _gesturestart: function(e) {\n var options = this.options;\n\n this._state = {\n range: {\n from: this._index(options.from),\n to: this._index(options.to)\n }\n };\n var args = this._rangeEventArgs(this._state.range);\n\n if (this.trigger(SELECT_START, args)) {\n this._state = null;\n } else {\n e.preventDefault();\n }\n },\n\n _gestureend: function() {\n if (this._state) {\n this.trigger(SELECT_END, this._rangeEventArgs(this._state.range));\n delete this._state;\n }\n },\n\n _gesturechange: function(e) {\n var ref = this;\n var chart = ref.chart;\n var state = ref._state;\n var options = ref.options;\n var categoryAxis = ref.categoryAxis;\n var range = state.range;\n var p0 = chart._toModelCoordinates(e.touches[0].x.location).x;\n var p1 = chart._toModelCoordinates(e.touches[1].x.location).x;\n var left = Math.min(p0, p1);\n var right = Math.max(p0, p1);\n\n e.preventDefault();\n\n range.from = categoryAxis.pointCategoryIndex(new Point(left)) || options.min;\n\n range.to = categoryAxis.pointCategoryIndex(new Point(right)) || options.max;\n\n this.move(range.from, range.to);\n\n this.trigger(SELECT, this._rangeEventArgs(range));\n },\n\n _index: function(value) {\n var index = value;\n\n if (value instanceof Date) {\n index = this.categoryAxis.categoryIndex(value);\n }\n\n return index;\n },\n\n _value: function(index) {\n var value = index;\n if (this._dateAxis) {\n value = this.categoryAxis.categoryAt(index);\n if (value > this.options.max) {\n value = this.options.max;\n }\n }\n\n return value;\n },\n\n _slot: function(value) {\n var categoryAxis = this.categoryAxis;\n var index = this._index(value);\n\n return categoryAxis.getSlot(index, index, true);\n },\n\n move: function(from, to) {\n var options = this.options;\n var reverse = this.categoryAxis.options.reverse;\n var offset = options.offset;\n var padding = options.padding;\n var border = options.selection.border;\n var left = reverse ? to : from;\n var right = reverse ? from : to;\n var edge = 'x' + (reverse ? 2 : 1);\n\n var box = this._slot(left);\n var leftMaskWidth = round(box[edge] - offset.left + padding.left);\n\n elementStyles(this.leftMask, {\n width: leftMaskWidth\n });\n elementStyles(this.selection, {\n left: leftMaskWidth\n });\n\n box = this._slot(right);\n\n var rightMaskWidth = round(options.width - (box[edge] - offset.left + padding.left));\n elementStyles(this.rightMask, {\n width: rightMaskWidth\n });\n\n var distance = options.width - rightMaskWidth;\n if (distance !== options.width) {\n distance += border.right;\n }\n\n elementStyles(this.rightMask, {\n left: distance\n });\n elementStyles(this.selection, {\n width: Math.max(options.width - (leftMaskWidth + rightMaskWidth) - border.right, 0)\n });\n },\n\n set: function(from, to) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var fromValue = limitValue(this._index(from), min, max);\n var toValue = limitValue(this._index(to), fromValue + 1, max);\n\n if (options.visible) {\n this.move(fromValue, toValue);\n }\n\n options.from = this._value(fromValue);\n options.to = this._value(toValue);\n },\n\n expand: function(delta) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var zDir = options.mousewheel.zoom;\n var from = this._index(options.from);\n var to = this._index(options.to);\n var range = { from: from, to: to };\n var oldRange = deepExtend({}, range);\n\n if (this._state) {\n range = this._state.range;\n }\n\n if (zDir !== RIGHT) {\n range.from = limitValue(\n limitValue(from - delta, 0, to - 1),\n min, max\n );\n }\n\n if (zDir !== LEFT) {\n range.to = limitValue(\n limitValue(to + delta, range.from + 1, max),\n min,\n max\n );\n }\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.set(range.from, range.to);\n return true;\n }\n },\n\n zoom: function(delta, coords) {\n var options = this.options;\n var min = this._index(options.min);\n var max = this._index(options.max);\n var from = this._index(options.from);\n var to = this._index(options.to);\n var range = { from: from, to: to };\n var oldRange = deepExtend({}, range);\n\n var ref = this.categoryAxis.options;\n var reverse = ref.reverse;\n var origin = X + (reverse ? '2' : '1');\n var lineBox = this.categoryAxis.lineBox();\n var relative = Math.abs(lineBox[origin] - coords[X]);\n var size = lineBox.width();\n var position = round(relative / size, 2);\n var minDelta = round(position * delta);\n var maxDelta = round((1 - position) * delta);\n\n if (this._state) {\n range = this._state.range;\n }\n\n range.from = limitValue(\n limitValue(from - minDelta, 0, to - 1),\n min, max\n );\n\n range.to = limitValue(\n limitValue(to + maxDelta, range.from + 1, max),\n min,\n max\n );\n\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n this.set(range.from, range.to);\n return true;\n }\n },\n\n trigger: function(name, args) {\n return (this.observer || this.chart).trigger(name, args);\n }\n });\n\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 FunnelPlotArea = PlotAreaBase.extend({\n render: function() {\n this.createFunnelChart(this.series);\n },\n\n createFunnelChart: function(series) {\n var firstSeries = series[0];\n var funnelChart = new FunnelChart(this, {\n series: series,\n legend: this.options.legend,\n neckRatio: firstSeries.neckRatio,\n dynamicHeight: firstSeries.dynamicHeight,\n dynamicSlope: firstSeries.dynamicSlope,\n segmentSpacing: firstSeries.segmentSpacing,\n highlight: firstSeries.highlight\n });\n\n this.appendChart(funnelChart);\n },\n\n appendChart: function(chart, pane) {\n PlotAreaBase.fn.appendChart.call(this, chart, pane);\n append(this.options.legend.items, chart.legendItems);\n }\n });\n\n // Linear color scale from the given color to white minus minimum lightness offset.\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 = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\" ] };\n\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n\n var pointOptions = options;\n if (doEval) {\n pointOptions = deepExtend({}, options);\n evalOptions(pointOptions, {\n value: value,\n series: series,\n dataItem: fields.dataItem,\n min: this.valueRange.min,\n max: this.valueRange.max\n }, state);\n }\n\n return pointOptions;\n },\n\n pointType: function() {\n return HeatmapPoint;\n },\n\n pointOptions: function(series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().prototype.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n markers: {\n opacity: series.opacity\n },\n tooltip: {\n format: this.options.tooltip.format\n },\n labels: {\n format: this.options.labels.format\n }\n }, series);\n }\n\n return options;\n },\n\n createPoint: function(value, fields) {\n var series = fields.series;\n var pointOptions = this.pointOptions(series, fields.seriesIx);\n var color = fields.color || series.color;\n\n pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n if (isFunction(series.color)) {\n color = pointOptions.color;\n } else if (this.valueRange.max !== 0) {\n var scale = colorScale(color);\n color = scale(value.value / this.valueRange.max);\n }\n\n var point = new HeatmapPoint(value, pointOptions);\n point.color = color;\n\n this.append(point);\n\n return point;\n },\n\n seriesAxes: function(series) {\n var xAxisName = series.xAxis;\n var yAxisName = series.yAxis;\n var plotArea = this.plotArea;\n var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n if (!xAxis) {\n throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n }\n\n if (!yAxis) {\n throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n }\n\n return { xAxis: xAxis, yAxis: yAxis };\n },\n\n reflow: function(targetBox) {\n var this$1$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 ]);\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 ]\n );\n\n SeriesBinder.current.register(\n [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n [ FROM, TO ], [ CATEGORY, COLOR, NOTE_TEXT ]\n );\n\n SeriesBinder.current.register(\n [ WATERFALL, HORIZONTAL_WATERFALL ],\n [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, SUMMARY_FIELD ]\n );\n\n SeriesBinder.current.register([ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ], [ X, Y ], [ COLOR ]);\n SeriesBinder.current.register([ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ], [ VALUE ], [ COLOR ]);\n\n SeriesBinder.current.register(\n [ FUNNEL ],\n [ VALUE ], [ CATEGORY, COLOR, \"visibleInLegend\", \"visible\" ]\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 ]\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 ]\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\" ]\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 (firstSeries.type === PIE || firstSeries.type === FUNNEL) {\n points = pointByCategoryName((plotArea.charts[0] || {}).points, categoryName);\n } else {\n points = plotArea.pointsBySeriesName(seriesName);\n }\n }\n\n if (points) {\n this.togglePointsHighlight(show, points);\n }\n },\n\n togglePointsHighlight: function(show, points) {\n var highlight = this._highlight;\n for (var idx = 0; idx < points.length; idx++) {\n highlight.togglePointHighlight(points[idx], show);\n }\n },\n\n showTooltip: function(filter) {\n var shared = this._sharedTooltip();\n var ref = this;\n var tooltip = ref._tooltip;\n var plotArea = ref._plotArea;\n var point, categoryIndex;\n\n if (isFunction(filter)) {\n point = plotArea.findPoint(filter);\n if (point && shared) {\n categoryIndex = point.categoryIx;\n }\n } else if (shared && defined(filter)) {\n categoryIndex = plotArea.categoryAxis.categoryIndex(filter);\n }\n\n if (shared) {\n if (categoryIndex >= 0) {\n var points = this._plotArea.pointsByCategoryIndex(categoryIndex);\n tooltip.showAt(points);\n }\n } else if (point) {\n tooltip.show(point);\n }\n },\n\n hideTooltip: function() {\n this._tooltip.hide();\n },\n\n _initSurface: function() {\n var surface = this.surface;\n var wrap = this._surfaceWrap();\n\n var chartArea = this.options.chartArea || {};\n if (chartArea.width) {\n dataviz.elementSize(wrap, { width: chartArea.width });\n }\n if (chartArea.height) {\n dataviz.elementSize(wrap, { height: chartArea.height });\n }\n\n if (!surface || surface.options.type !== this.options.renderAs) {\n this._destroySurface();\n\n this.surface = drawing.Surface.create(wrap, {\n type: this.options.renderAs\n });\n\n this.surface.bind(\"mouseenter\", this._surfaceMouseenterHandler);\n this.surface.bind(\"mouseleave\", this._surfaceMouseleaveHandler);\n\n } else {\n this.surface.clear();\n this.surface.resize();\n }\n },\n\n _surfaceWrap: function() {\n return this.element;\n },\n\n _redraw: function() {\n var model = this._getModel();\n this._size = {\n width: model.options.width,\n height: model.options.height\n };\n\n this._destroyView();\n\n this._model = model;\n this._plotArea = model._plotArea;\n\n model.renderVisual();\n\n if (this.options.transitions !== false) {\n model.traverse(function(element) {\n if (element.animation) {\n element.animation.setup();\n }\n });\n }\n\n this._initSurface();\n this.surface.draw(model.visual);\n\n if (this.options.transitions !== false) {\n model.traverse(function(element) {\n if (element.animation) {\n element.animation.play();\n }\n });\n }\n\n this._tooltip = this._createTooltip();\n this._highlight = new Highlight();\n this._setupSelection();\n this._createPannable();\n this._createZoomSelection();\n this._createMousewheelZoom();\n\n this.trigger(RENDER);\n triggerPaneRender(this._plotArea.panes);\n\n if (!this._navState) {\n this._cancelDomEvents();\n }\n },\n\n exportVisual: function(exportOptions) {\n var visual;\n if (exportOptions && (exportOptions.width || exportOptions.height || exportOptions.options)) {\n var currentOptions = this.options;\n var options = deepExtend({}, exportOptions.options, {\n chartArea: {\n width: exportOptions.width,\n height: exportOptions.height\n }\n });\n\n clearMissingValues(this._originalOptions, options);\n this.options = deepExtend({}, this._originalOptions, options);\n this._initTheme(this.options, this._theme);\n this.bindCategories();\n\n var model = this._getModel();\n\n model.renderVisual();\n triggerPaneRender(model._plotArea.panes);\n\n visual = model.visual;\n\n this.options = currentOptions;\n } else {\n visual = this.surface.exportVisual();\n }\n\n return visual;\n },\n\n _sharedTooltip: function() {\n return this._plotArea instanceof CategoricalPlotArea && this.options.tooltip && this.options.tooltip.shared;\n },\n\n _createPannable: function() {\n var options = this.options;\n if (options.pannable !== false) {\n this._pannable = new Pannable(this._plotArea, options.pannable);\n }\n },\n\n _createZoomSelection: function() {\n var zoomable = this.options.zoomable;\n var selection = (zoomable || {}).selection;\n if (zoomable !== false && selection !== false) {\n this._zoomSelection = new ZoomSelection(this, selection);\n }\n },\n\n _createMousewheelZoom: function() {\n var zoomable = this.options.zoomable;\n var mousewheel = (zoomable || {}).mousewheel;\n if (zoomable !== false && mousewheel !== false) {\n this._mousewheelZoom = new MousewheelZoom(this, mousewheel);\n }\n },\n\n _toggleDragZoomEvents: function() {\n var pannable = this.options.pannable;\n var zoomable = this.options.zoomable;\n var selection = (zoomable || {}).selection;\n var mousewheel = (zoomable || {}).mousewheel;\n var allowDrag = !pannable && (zoomable === false || selection === false) && !this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ]);\n var allowZoom = (zoomable === false || mousewheel === false) && !this.requiresHandlers([ ZOOM_START, ZOOM, ZOOM_END ]);\n var element = this.element;\n\n if (this._dragZoomEnabled && allowDrag && allowZoom) {\n element.style.touchAction = this._touchAction || '';\n this._dragZoomEnabled = false;\n } else if (!this._dragZoomEnabled && !(allowDrag && allowZoom)) {\n element.style.touchAction = \"none\";\n\n this._dragZoomEnabled = true;\n }\n\n this._toggleDomEvents(!allowDrag, !allowZoom);\n },\n\n _toggleDomEvents: function(drag, zoom) {\n var domEvents = this.domEvents;\n if (!domEvents) {\n return;\n }\n\n if (domEvents.toggleDrag) {\n domEvents.toggleDrag(drag);\n }\n\n if (domEvents.toggleZoom) {\n domEvents.toggleZoom(zoom);\n }\n },\n\n _createTooltip: function() {\n var ref = this;\n var tooltipOptions = ref.options.tooltip;\n var tooltip;\n\n if (this._sharedTooltip()) {\n tooltip = this._createSharedTooltip(tooltipOptions);\n } else {\n tooltip = new Tooltip(this.chartService, tooltipOptions);\n }\n\n return tooltip;\n },\n\n _createSharedTooltip: function(options) {\n return new SharedTooltip(this._plotArea, options);\n },\n\n applyDefaults: function(options, themeOptions) {\n applyAxisDefaults(options, themeOptions);\n applySeriesDefaults(options, themeOptions);\n },\n\n applySeriesColors: function() {\n var options = this.options;\n var series = options.series;\n var colors = options.seriesColors || [];\n\n for (var i = 0; i < series.length; i++) {\n var currentSeries = series[i];\n var seriesColor = colors[i % colors.length];\n var defaults = currentSeries._defaults;\n\n currentSeries.color = currentSeries.color || seriesColor;\n if (defaults) {\n defaults.color = defaults.color || seriesColor;\n }\n }\n },\n\n _getModel: function() {\n var options = this.options;\n var plotArea = this._createPlotArea();\n var model = new dataviz.RootElement(this._modelOptions());\n model.chart = this;\n model._plotArea = plotArea;\n\n 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 if (name === SHOW_TOOLTIP) {\n args.anchor.point = this._toDocumentCoordinates(args.anchor.point);\n }\n args.sender = this;\n\n var observers = this.observers;\n var isDefaultPrevented = false;\n for (var idx = 0; idx < observers.length; idx++) {\n if (observers[idx].trigger(name, args)) {\n isDefaultPrevented = true;\n }\n }\n\n return isDefaultPrevented;\n },\n\n _attachEvents: function() {\n var element = this.element;\n\n this._touchAction = element.style.touchAction;\n\n var obj;\n bindEvents(element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n if (this._shouldAttachMouseMove()) {\n var obj$1;\n bindEvents(element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n }\n\n this.domEvents = services.DomEventsBuilder.create(this.element, {\n start: this._start.bind(this),\n move: this._move.bind(this),\n end: this._end.bind(this),\n tap: this._tap.bind(this),\n gesturestart: this._gesturestart.bind(this),\n gesturechange: this._gesturechange.bind(this),\n gestureend: this._gestureend.bind(this)\n });\n\n this._toggleDragZoomEvents();\n },\n\n _mouseleave: function(e) {\n if (this._hoveredPoint) {\n this._hoveredPoint.out(this, e);\n this._hoveredPoint = null;\n }\n\n if (this._plotArea.hovered) {\n this.trigger(PLOT_AREA_LEAVE);\n this._plotArea.hovered = false;\n }\n },\n\n _cancelDomEvents: function() {\n if (this.domEvents && this.domEvents.cancel) {\n this.domEvents.cancel();\n }\n },\n\n _gesturestart: function(e) {\n if (this._mousewheelZoom && !this._stopChartHandlers(e)) {\n this._gestureDistance = e.distance;\n this._unsetActivePoint();\n this.surface.suspendTracking();\n }\n },\n\n _gestureend: function(e) {\n if (this._zooming && !this._stopChartHandlers(e)) {\n if (this.surface) {\n this.surface.resumeTracking();\n }\n this._zooming = false;\n this.trigger(ZOOM_END, {});\n }\n },\n\n _gesturechange: function(e) {\n var mousewheelZoom = this._mousewheelZoom;\n\n if (mousewheelZoom && !this._stopChartHandlers(e)) {\n e.preventDefault();\n var previousGestureDistance = this._gestureDistance;\n var scaleDelta = -e.distance / previousGestureDistance + 1;\n\n if (Math.abs(scaleDelta) >= 0.1) {\n scaleDelta = Math.round(scaleDelta * 10);\n\n this._gestureDistance = e.distance;\n var args = { delta: scaleDelta, axisRanges: axisRanges(this._plotArea.axes), originalEvent: e };\n if (this._zooming || !this.trigger(ZOOM_START, args)) {\n var coords = this._eventCoordinates(e);\n\n if (!this._zooming) {\n this._zooming = true;\n }\n\n var ranges = args.axisRanges = mousewheelZoom.updateRanges(scaleDelta, coords);\n if (ranges && !this.trigger(ZOOM, args)) {\n mousewheelZoom.zoom();\n }\n }\n }\n }\n },\n\n _mouseout: function(e) {\n if (e.element) {\n var element = this._drawingChartElement(e.element, e);\n\n if (element && element.leave) {\n element.leave(this, e.originalEvent);\n }\n }\n },\n\n _start: function(e) {\n var coords = this._eventCoordinates(e);\n\n if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n return;\n }\n\n if (this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ])) {\n this._startNavigation(e, coords, DRAG_START);\n }\n\n if (this._pannable && this._pannable.start(e)) {\n this.surface.suspendTracking();\n this._unsetActivePoint();\n this._suppressHover = true;\n this.chartService.panning = true;\n }\n\n if (this._zoomSelection) {\n if (this._zoomSelection.start(e)) {\n this.trigger(ZOOM_START, { axisRanges: axisRanges(this._plotArea.axes), originalEvent: e });\n }\n }\n },\n\n _move: function(e) {\n var ref = this;\n var state = ref._navState;\n var pannable = ref._pannable;\n\n if (this._stopChartHandlers(e)) {\n return;\n }\n\n if (pannable) {\n var ranges = pannable.move(e);\n\n if (ranges && !this.trigger(DRAG, { axisRanges: ranges, originalEvent: e })) {\n pannable.pan();\n }\n } else if (state) {\n var ranges$1 = {};\n var axes = state.axes;\n\n for (var i = 0; i < axes.length; i++) {\n var currentAxis = axes[i];\n var axisName = currentAxis.options.name;\n if (axisName) {\n var axis = currentAxis.options.vertical ? e.y : e.x;\n var delta = axis.startLocation - axis.location;\n\n if (delta !== 0) {\n ranges$1[currentAxis.options.name] = currentAxis.translateRange(delta);\n }\n }\n }\n\n state.axisRanges = ranges$1;\n this.trigger(DRAG, {\n axisRanges: ranges$1,\n originalEvent: e\n });\n }\n\n if (this._zoomSelection) {\n this._zoomSelection.move(e);\n }\n },\n\n _end: function(e) {\n if (this._stopChartHandlers(e)) {\n return;\n }\n\n var pannable = this._pannable;\n if (pannable && pannable.end(e)) {\n this.surface.resumeTracking();\n this.trigger(DRAG_END, {\n axisRanges: axisRanges(this._plotArea.axes),\n originalEvent: e\n });\n this._suppressHover = false;\n this.chartService.panning = false;\n } else {\n this._endNavigation(e, DRAG_END);\n }\n\n if (this._zoomSelection) {\n var ranges = this._zoomSelection.end(e);\n if (ranges && !this.trigger(ZOOM, { axisRanges: ranges, originalEvent: e })) {\n this._zoomSelection.zoom();\n this.trigger(ZOOM_END, { axisRanges: ranges, originalEvent: e });\n }\n }\n },\n\n _stopChartHandlers: function(e) {\n var selections = this._selections || [];\n if (!selections.length) {\n return false;\n }\n\n var coords = this._eventCoordinates(e);\n var pane = this._plotArea.paneByPoint(coords);\n if (pane) {\n for (var idx = 0; idx < selections.length; idx++) {\n if (selections[idx].onPane(pane)) {\n return true;\n }\n }\n }\n },\n\n _mousewheelZoomRate: function() {\n var zoomable = this.options.zoomable;\n var mousewheel = (zoomable || {}).mousewheel || {};\n return valueOrDefault(mousewheel.rate, MOUSEWHEEL_ZOOM_RATE);\n },\n\n _mousewheel: function(e) {\n var this$1$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 var activePoint = this._activePoint;\n var multipleSeries = this._plotArea.series.length > 1;\n var hasInactiveOpacity = this._hasInactiveOpacity();\n\n this._updateHoveredPoint(point, e);\n\n if (point && activePoint !== point && point.hover) {\n this._activePoint = point;\n\n if (!this._sharedTooltip() && !point.hover(this, e)) {\n this._displayTooltip(point);\n\n if (hasInactiveOpacity) {\n this._displayInactiveOpacity(point, multipleSeries);\n } else {\n this._highlight.show(point);\n }\n }\n } else if (!point && hasInactiveOpacity) {\n if (multipleSeries && this._activeChartInstance) {\n this._updateSeriesOpacity(point, true);\n this._applySeriesOpacity(this._activeChartInstance.children, null, true);\n this._activeChartInstance = null;\n }\n this._highlight && this._highlight.hide();\n this._activePoint = null;\n }\n\n return point;\n },\n\n _displayTooltip: function(point) {\n var tooltipOptions = deepExtend({}, this.options.tooltip, point.options.tooltip);\n if (tooltipOptions.visible) {\n this._tooltip.show(point);\n }\n },\n\n _displayInactiveOpacity: function(activePoint, multipleSeries, highlightPoints) {\n var chartInstance = this._activeChartInstance = this._chartInstanceFromPoint(activePoint);\n if (!chartInstance) {\n return;\n }\n\n if (multipleSeries) {\n this._updateSeriesOpacity(activePoint);\n this._applySeriesOpacity(chartInstance.children, null, true);\n this._applySeriesOpacity(chartInstance.children, activePoint.series);\n this._highlight.show(highlightPoints || activePoint);\n } else {\n var inactivePoints;\n\n if (!chartInstance.supportsPointInactiveOpacity()) {\n this._highlight.show(activePoint);\n return;\n }\n\n inactivePoints = this._getInactivePoints(activePoint, chartInstance);\n\n if (inactivePoints && inactivePoints.length) {\n this._highlight.show(inactivePoints, 1 - this._getInactiveOpacityForSeries(activePoint.series));\n }\n }\n },\n\n _getInactivePoints: function(activePoint, chartInstance) {\n var allPoints = this._getAllPointsOfType(chartInstance, activePoint.constructor);\n\n return allPoints.filter(function (point) { return point !== activePoint; });\n },\n\n _getAllPointsOfType: function(container, type) {\n var this$1$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 _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 _hasInactiveOpacity: function() {\n var hasDefaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity !== undefined;\n var hasInactiveOpacity = this.options.series.filter(function (s) { return s.highlight.inactiveOpacity !== undefined; } ).length > 0;\n return hasDefaultInactiveOpacity || hasInactiveOpacity;\n },\n\n _getInactiveOpacityForSeries: function(series) {\n var defaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity;\n var seriesInactiveOpacity = series.highlight.inactiveOpacity;\n return seriesInactiveOpacity || defaultInactiveOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n },\n\n _getDefaultOpacityForSeries: function(series) {\n return series.defaultOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n },\n\n _mouseover: function(e) {\n var point = this._startHover(e.element, e.originalEvent);\n\n if (point && point.tooltipTracking && !this._mouseMoveTrackHandler && !this._sharedTooltip()) {\n this._mouseMoveTrackHandler = this._mouseMoveTracking.bind(this);\n var obj;\n bindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n }\n },\n\n _mouseMoveTracking: function(e) {\n var ref = this;\n var options = ref.options;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n var point = ref._activePoint;\n var coords = this._eventCoordinates(e);\n\n if (this._plotArea.box.containsPoint(coords)) {\n if (point && point.tooltipTracking && point.series && point.parent.getNearestPoint) {\n var seriesPoint = point.parent.getNearestPoint(coords.x, coords.y, point.seriesIx);\n if (seriesPoint && seriesPoint !== point) {\n this._activePoint = seriesPoint;\n\n if (!seriesPoint.hover(this, e)) {\n var tooltipOptions = deepExtend({}, options.tooltip, seriesPoint.options.tooltip);\n if (tooltipOptions.visible) {\n tooltip.show(seriesPoint);\n }\n\n highlight.show(seriesPoint);\n }\n }\n }\n } else {\n var obj;\n unbindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n this._unsetActivePoint();\n this._mouseMoveTrackHandler = null;\n }\n },\n\n _mousemove: function(e) {\n var coords = this._eventCoordinates(e);\n var plotArea = this._plotArea;\n\n this._trackCrosshairs(coords);\n\n if (plotArea.hover) {\n var overPlotArea = plotArea.backgroundContainsPoint(coords);\n if (overPlotArea) {\n plotArea.hovered = true;\n this._plotArea.hover(this, e);\n } else if (plotArea.hovered && !overPlotArea) {\n this.trigger(PLOT_AREA_LEAVE);\n plotArea.hovered = false;\n }\n }\n\n if (this._sharedTooltip()) {\n this._trackSharedTooltip(coords, e);\n }\n },\n\n _trackCrosshairs: function(coords) {\n var crosshairs = this._plotArea.crosshairs;\n\n for (var i = 0; i < crosshairs.length; i++) {\n var current = crosshairs[i];\n\n if (current.box.containsPoint(coords)) {\n current.showAt(coords);\n } else {\n current.hide();\n }\n }\n },\n\n _trackSharedTooltip: function(coords, e, toggle) {\n if (this._suppressHover) {\n return;\n }\n\n var ref = this;\n var tooltipOptions = ref.options.tooltip;\n var plotArea = ref._plotArea;\n var categoryAxis = ref._plotArea.categoryAxis;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n\n if (plotArea.backgroundContainsPoint(coords)) {\n var index = categoryAxis.pointCategoryIndex(coords);\n if (index !== this._tooltipCategoryIx || (!this._sharedHighlight && toggle)) {\n var points = plotArea.pointsByCategoryIndex(index);\n var pointArgs = points.map(function(point) {\n return point.eventArgs(e);\n });\n var hoverArgs = pointArgs[0] || {};\n hoverArgs.categoryPoints = pointArgs;\n\n if (points.length > 0 && !this.trigger(SERIES_HOVER, hoverArgs)) {\n if (tooltipOptions.visible) {\n tooltip.showAt(points, coords);\n }\n\n highlight.show(points);\n\n this._sharedHighlight = true;\n } else {\n tooltip.hide();\n }\n\n this._tooltipCategoryIx = index;\n } else if (toggle && this._sharedHighlight) {\n highlight.hide();\n tooltip.hide();\n this._sharedHighlight = false;\n }\n } else if (this._sharedHighlight) {\n highlight.hide();\n tooltip.hide();\n this._tooltipCategoryIx = null;\n this._sharedHighlight = false;\n }\n },\n\n hideElements: function(options) {\n var plotArea = this._plotArea;\n this._mousemove.cancel();\n\n plotArea.hideCrosshairs();\n\n this._unsetActivePoint(options);\n },\n\n _unsetActivePoint: function(options) {\n var ref = this;\n var tooltip = ref._tooltip;\n var highlight = ref._highlight;\n\n this._activePoint = null;\n this._hoveredPoint = null;\n\n if (tooltip && !(options && options.keepTooltipOpen)) {\n tooltip.hide();\n }\n\n this._tooltipCategoryIx = null;\n this._sharedHighlight = false;\n\n if (highlight) {\n highlight.hide();\n }\n },\n\n _deferRedraw: function() {\n this._redraw();\n },\n\n _clearRedrawTimeout: function() {\n if (this._redrawTimeout) {\n clearInterval(this._redrawTimeout);\n this._redrawTimeout = null;\n }\n },\n\n bindCategories: function() {\n var this$1$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 ])) {\n items = plotArea.findPoint(function(point) {\n return point.series.index === seriesIndex && point.index === pointIndex;\n });\n } else {\n items = plotArea.pointsBySeriesIndex(seriesIndex);\n }\n\n if (this._hasInactiveOpacity() && currentSeries.visible && items) {\n var multipleSeries = plotArea.series.length > 1;\n var point = items.length ? items[0] : items;\n\n this._displayInactiveOpacity(point, multipleSeries, items);\n } else {\n highlight.show(items);\n }\n },\n\n _shouldAttachMouseMove: function() {\n return this._plotArea.crosshairs.length || (this._tooltip && this._sharedTooltip()) || this.requiresHandlers([ PLOT_AREA_HOVER, PLOT_AREA_LEAVE ]);\n },\n\n updateMouseMoveHandler: function() {\n var obj;\n unbindEvents(this.element, ( obj = {}, obj[ MOUSEMOVE ] = this._mousemove, obj ));\n\n if (this._shouldAttachMouseMove()) {\n var obj$1;\n bindEvents(this.element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n }\n },\n\n applyOptions: function(options, theme) {\n clearMissingValues(this._originalOptions, options);\n this._originalOptions = deepExtend(this._originalOptions, options);\n this.options = deepExtend({}, this._originalOptions);\n\n if (theme) {\n this._theme = theme;\n this.chartService.theme = theme;\n }\n this._initTheme(this.options, this._theme);\n\n this._toggleDragZoomEvents();\n },\n\n setOptions: function(options, theme) {\n this.applyOptions(options, theme);\n this.bindCategories();\n this.redraw();\n this.updateMouseMoveHandler();\n },\n\n setDirection: function(rtl) {\n this.chartService.rtl = Boolean(rtl);\n if (this.surface && this.surface.type === 'svg') {\n this._destroySurface();\n }\n },\n\n setIntlService: function(intl) {\n this.chartService.intl = intl;\n },\n\n noTransitionsRedraw: function() {\n this._noTransitionsRedraw();\n },\n\n destroy: function() {\n this._destroyed = true;\n\n var obj;\n unbindEvents(this.element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSEMOVE ] = this._mousemove, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n if (this.domEvents) {\n this.domEvents.destroy();\n delete this.domEvents;\n }\n\n if (this._mouseMoveTrackHandler) {\n var obj$1;\n unbindEvents(document, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj$1 ));\n }\n\n this._destroyView();\n\n this._destroySurface();\n\n this._clearRedrawTimeout();\n },\n\n _destroySurface: function() {\n var surface = this.surface;\n if (surface) {\n surface.unbind(\"mouseenter\", this._surfaceMouseenterHandler);\n surface.unbind(\"mouseleave\", this._surfaceMouseleaveHandler);\n surface.destroy();\n\n this.surface = null;\n }\n },\n\n _destroySelections: function() {\n var selections = this._selections;\n\n if (selections) {\n while (selections.length > 0) {\n selections.shift().destroy();\n }\n }\n },\n\n _destroyView: function() {\n var model = this._model;\n\n if (model) {\n model.destroy();\n this._model = null;\n }\n\n this._unsetActivePoint();\n\n this._destroySelections();\n\n if (this._tooltip) {\n this._tooltip.destroy();\n }\n\n if (this._highlight) {\n this._highlight.destroy();\n }\n\n if (this._zoomSelection) {\n this._zoomSelection.destroy();\n delete this._zoomSelection;\n }\n\n if (this._pannable) {\n this._pannable.destroy();\n delete this._pannable;\n }\n\n if (this._mousewheelZoom) {\n this._mousewheelZoom.destroy();\n delete this._mousewheelZoom;\n }\n }\n });\n\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 NS = \".kendoChart\";\n var kendo = window.kendo;\n var Class = kendo.Class;\n var outerWidth = kendo._outerWidth;\n var outerHeight = kendo._outerHeight;\n var dataviz = kendo.dataviz;\n var constants = dataviz.constants;\n var KendoChart = dataviz.Chart;\n var SeriesBinder = dataviz.SeriesBinder;\n var Widget = kendo.ui.Widget;\n var DataSource = kendo.data.DataSource;\n var deepExtend = kendo.deepExtend;\n var defined = dataviz.defined;\n var getField = dataviz.getField;\n var InstanceObserver = dataviz.InstanceObserver;\n var inArray = dataviz.inArray;\n var services = dataviz.services;\n var isArray = Array.isArray;\n var extend = $.extend;\n var template = kendo.template;\n\n var MOUSELEAVE_NS = \"mouseleave\" + NS;\n var AXIS_LABEL_CLICK = constants.AXIS_LABEL_CLICK;\n var LEGEND_ITEM_CLICK = constants.LEGEND_ITEM_CLICK;\n var LEGEND_ITEM_HOVER = constants.LEGEND_ITEM_HOVER;\n var LEGEND_ITEM_LEAVE = constants.LEGEND_ITEM_LEAVE;\n var SERIES_CLICK = constants.SERIES_CLICK;\n var SERIES_HOVER = constants.SERIES_HOVER;\n var SERIES_OVER = constants.SERIES_OVER;\n var SERIES_LEAVE = constants.SERIES_LEAVE;\n var PANE_RENDER = constants.PANE_RENDER;\n var PLOT_AREA_CLICK = constants.PLOT_AREA_CLICK;\n var PLOT_AREA_HOVER = constants.PLOT_AREA_HOVER;\n var PLOT_AREA_LEAVE = constants.PLOT_AREA_LEAVE;\n var DRAG = constants.DRAG;\n var DRAG_END = constants.DRAG_END;\n var DRAG_START = constants.DRAG_START;\n var ZOOM_START = constants.ZOOM_START;\n var ZOOM = constants.ZOOM;\n var ZOOM_END = constants.ZOOM_END;\n var SELECT_START = constants.SELECT_START;\n var SELECT = constants.SELECT;\n var SELECT_END = constants.SELECT_END;\n var RENDER = constants.RENDER;\n var NOTE_CLICK = constants.NOTE_CLICK;\n var NOTE_HOVER = constants.NOTE_HOVER;\n var NOTE_LEAVE = constants.NOTE_LEAVE;\n var DOCUMENT_ELEMENT = $(document.documentElement);\n\n var CHANGE = \"change\";\n var DATABOUND = \"dataBound\";\n var LEAVE = \"leave\";\n var MOUSEDOWN = \"down\";\n\n var VALUE = constants.VALUE;\n var PIE = constants.PIE;\n var DONUT = constants.DONUT;\n var FUNNEL = constants.FUNNEL;\n\n var Observable = kendo.Observable;\n var TOOLTIP_ANIMATION_DURATION = 150;\n var TOOLTIP_SHOW_DELAY = 100;\n var TOOLTIP_INVERSE = \"k-chart-tooltip-inverse\";\n var SHARED_TOOLTIP_CLASS = \"k-chart-shared-tooltip\";\n var RTL = \"rtl\";\n\n services.DomEventsBuilder.register({\n create: function(element, events) {\n return new kendo.UserEvents(element, deepExtend({\n global: true,\n multiTouch: true,\n fastTap: true\n }, events));\n }\n });\n\n var ChartInstanceObserver = InstanceObserver.extend({\n handlerMap: {\n showTooltip: '_showTooltip',\n hideTooltip: '_hideTooltip',\n legendItemClick: '_onLegendItemClick',\n render: '_onRender',\n init: '_onInit'\n }\n });\n\n var Chart = Widget.extend({\n init: function(element, userOptions) {\n var dataSource;\n\n kendo.destroy(element);\n\n Widget.fn.init.call(this, element);\n\n if (userOptions) {\n dataSource = userOptions.dataSource;\n delete userOptions.dataSource;\n }\n\n this.options = deepExtend({}, this.options, userOptions);\n\n this.wrapper = this.element;\n this._attachEvents();\n\n if (userOptions) {\n userOptions.dataSource = dataSource;\n }\n\n this._seriesVisibility = new SeriesVisibilityState();\n\n this.bind(this.events, this.options);\n this._initDataSource(userOptions);\n\n kendo.notify(this, dataviz.ui);\n },\n\n events: [\n DATABOUND,\n SERIES_CLICK,\n SERIES_HOVER,\n SERIES_OVER,\n SERIES_LEAVE,\n AXIS_LABEL_CLICK,\n LEGEND_ITEM_CLICK,\n LEGEND_ITEM_HOVER,\n LEGEND_ITEM_LEAVE,\n PANE_RENDER,\n PLOT_AREA_CLICK,\n PLOT_AREA_HOVER,\n PLOT_AREA_LEAVE,\n DRAG_START,\n DRAG,\n DRAG_END,\n ZOOM_START,\n ZOOM,\n ZOOM_END,\n SELECT_START,\n SELECT,\n SELECT_END,\n NOTE_CLICK,\n NOTE_HOVER,\n NOTE_LEAVE,\n RENDER\n ],\n\n options: {\n name: \"Chart\",\n renderAs: \"\",\n theme: \"default\",\n axisDefaults: {},\n chartArea: {},\n legend: {},\n categoryAxis: {},\n autoBind: true,\n seriesDefaults: {},\n series: [],\n seriesColors: null,\n tooltip: {},\n transitions: true,\n valueAxis: {},\n plotArea: {},\n title: {},\n xAxis: {},\n yAxis: {},\n panes: [{}],\n pannable: false,\n zoomable: false\n },\n\n items: function() {\n return $();\n },\n\n refresh: function() {\n var chart = this;\n var instance = chart._instance;\n instance.applyDefaults(chart.options);\n instance.applySeriesColors();\n\n chart._bindSeries();\n chart._bindCategories();\n\n chart.trigger(DATABOUND);\n chart._redraw();\n },\n\n getSize: function() {\n return kendo.dimensions(this.element);\n },\n\n redraw: function(paneName) {\n this._size = null;\n this._instance.redraw(paneName);\n },\n\n setOptions: function(options) {\n var chart = this,\n dataSource = options.dataSource;\n\n delete options.dataSource;\n\n Widget.fn._setEvents.call(chart, options);\n\n this._instance.applyOptions(options, this._getThemeOptions(options));\n this.options = this._instance.options;\n this._tooltip.setOptions(this.options.tooltip);\n this._seriesVisibility.setOptions(this.options);\n this._sourceSeries = null;\n\n if (dataSource) {\n chart.setDataSource(dataSource);\n }\n\n if (chart._hasDataSource) {\n chart._onDataChanged();\n } else {\n chart._bindCategories();\n chart.redraw();\n }\n\n chart._instance.updateMouseMoveHandler();\n\n },\n\n setDataSource: function(dataSource) {\n var chart = this;\n\n chart.dataSource.unbind(CHANGE, chart._dataChangeHandler);\n chart.dataSource = dataSource = DataSource.create(dataSource);\n chart._hasDataSource = true;\n chart._hasData = false;\n\n dataSource.bind(CHANGE, chart._dataChangeHandler);\n\n if (chart.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n destroy: function() {\n var chart = this,\n dataSource = chart.dataSource;\n\n chart.element.off(NS);\n\n if (dataSource) {\n dataSource.unbind(CHANGE, chart._dataChangeHandler);\n }\n\n if (chart._instance) {\n chart._instance.destroy();\n delete this._instance;\n }\n\n if (this._tooltip) {\n this._tooltip.destroy();\n delete this._tooltip;\n }\n\n this._destroyCrosshairTooltips();\n\n Widget.fn.destroy.call(chart);\n },\n\n findPaneByName: function(name) {\n var panes = this._plotArea.panes;\n\n for (var idx = 0; idx < panes.length; idx++) {\n if (panes[idx].options.name === name) {\n return new ChartPane(this, panes[idx]);\n }\n }\n },\n\n findPaneByIndex: function(idx) {\n var panes = this._plotArea.panes;\n if (panes[idx]) {\n return new ChartPane(this, panes[idx]);\n }\n },\n\n findSeries: function(callback) {\n var plotArea = this._plotArea;\n var series = plotArea.srcSeries || plotArea.series;\n for (var idx = 0; idx < series.length; idx++) {\n if (callback(series[idx])) {\n return new ChartSeries(this, series[idx]);\n }\n }\n },\n\n findSeriesByName: function(name) {\n return this._createSeries({ name: name });\n },\n\n findSeriesByIndex: function(index) {\n return this._createSeries({ index: index });\n },\n\n exportVisual: function(options) {\n var instance = this._instance;\n if (!instance) {\n return;\n }\n\n var visual;\n\n //TO DO: support for setting any options. already available in kendo-charts\n if (options && (options.width || options.height)) {\n var chartArea = instance.options.chartArea;\n var originalChartArea = instance._originalOptions.chartArea;\n\n deepExtend(chartArea, options);\n\n var model = instance._getModel();\n\n chartArea.width = originalChartArea.width;\n chartArea.height = originalChartArea.height;\n\n model.renderVisual();\n\n triggerPaneRender(model._plotArea.panes);\n\n visual = model.visual;\n } else {\n visual = instance.exportVisual();\n }\n\n return visual;\n },\n\n _createSeries: function(options) {\n var seriesOptions = this._seriesOptions(options);\n if (seriesOptions) {\n return new ChartSeries(this, seriesOptions);\n }\n },\n\n _seriesOptions: function(options) {\n var plotArea = this._plotArea;\n var series = plotArea.srcSeries || plotArea.series;\n var seriesOptions;\n\n if (defined(options.index)) {\n seriesOptions = series[options.index];\n } else if (defined(options.name)) {\n for (var idx = 0; idx < series.length; idx++) {\n if (series[idx].name === options.name) {\n seriesOptions = series[idx];\n break;\n }\n }\n }\n\n return seriesOptions;\n },\n\n _attachEvents: function() {\n this.element.on(MOUSELEAVE_NS, this._mouseleave.bind(this));\n },\n\n _mouseleave: function(e) {\n var instance = this._instance;\n var tooltip = this._tooltip;\n var target = e.relatedTarget;\n\n if (!(target && $(target).closest(tooltip.element).length) && instance && !instance.handlingTap) {\n instance.hideElements({\n keepTooltipOpen: !tooltip.options.autoHide\n });\n }\n },\n\n _getThemeOptions: function(userOptions) {\n var themeName = (userOptions || {}).theme;\n\n if (themeName && dataviz.SASS_THEMES.indexOf(themeName.toLowerCase()) !== -1) {\n return dataviz.autoTheme().chart;\n }\n\n if (defined(themeName)) {\n var themes = dataviz.ui.themes || {};\n var theme = themes[themeName] || themes[themeName.toLowerCase()] || {};\n return theme.chart || {};\n }\n },\n\n _initChart: function() {\n this._createChart(this.options, this._getThemeOptions(this.options));\n this.options = this._instance.options;\n this._seriesVisibility.setOptions(this.options);\n },\n\n _createChart: function(options, themeOptions) {\n this._instance = new KendoChart(this.element[0], options, themeOptions, {\n observer: new ChartInstanceObserver(this),\n sender: this,\n rtl: this._isRtl()\n });\n },\n\n _onInit: function(e) {\n this._instance = e.sender;\n },\n\n _initDataSource: function(userOptions) {\n var chart = this,\n dataSource = (userOptions || {}).dataSource;\n\n chart._dataChangeHandler = chart._onDataChanged.bind(chart);\n\n chart.dataSource = DataSource\n .create(dataSource)\n .bind(\"change\", chart._dataChangeHandler);\n\n chart._bindCategories();\n\n if (dataSource) {\n chart._hasDataSource = true;\n }\n\n this._initChart();\n this._initTooltip();\n\n if (dataSource) {\n if (chart.options.autoBind) {\n chart.dataSource.fetch();\n }\n }\n },\n\n _destroyCrosshairTooltips: function() {\n var tooltips = this._crosshairTooltips;\n if (tooltips) {\n for (var key in tooltips) {\n tooltips[key].destroy();\n }\n }\n this._crosshairTooltips = {};\n },\n\n _getCrosshairTooltip: function(name, index) {\n var tooltips = this._crosshairTooltips = this._crosshairTooltips || {};\n var key = name + index;\n var tooltip = tooltips[key];\n if (!tooltip) {\n tooltip = tooltips[key] = new CrosshairTooltip(this.element);\n }\n return tooltip;\n },\n\n _showTooltip: function(e) {\n if (e.crosshair) {\n var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n tooltip.show(e);\n } else if (this._tooltip) {\n this._tooltip.show(e);\n }\n },\n\n _hideTooltip: function(e) {\n if (e.crosshair) {\n var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n tooltip.hide();\n } else if (this._tooltip) {\n this._tooltip.hide();\n }\n },\n\n _onRender: function(e) {\n this._destroyCrosshairTooltips();\n this._copyMembers(e.sender);\n if (!this._hasDataSource || this._hasData || !this.options.autoBind) {\n this.trigger(RENDER);\n }\n },\n\n _copyMembers: function(instance) {\n this.options = instance.options;\n this._originalOptions = instance._originalOptions;\n this.surface = instance.surface;\n this._plotArea = instance._plotArea;\n this._model = instance._model;\n this._highlight = instance._highlight;\n this._selections = instance._selections;\n this._pannable = instance._pannable;\n this._zoomSelection = instance._zoomSelection;\n this._mousewheelZoom = instance._mousewheelZoom;\n },\n\n requiresHandlers: function(names) {\n var events = this._events;\n for (var idx = 0; idx < names.length; idx++) {\n if (defined(events[names[idx]])) {\n return true;\n }\n }\n },\n\n _initTooltip: function() {\n this._tooltip = this._createTooltip();\n\n this._tooltip.bind(LEAVE, this._tooltipleave.bind(this));\n },\n\n _onLegendItemClick: function(e) {\n if (!this.trigger(LEGEND_ITEM_CLICK, e)) {\n this._legendItemClick(e.seriesIndex, e.pointIndex);\n }\n },\n\n _legendItemClick: function(seriesIndex, pointIndex) {\n var chart = this._instance,\n plotArea = chart._plotArea,\n currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n\n if (chart._hasInactiveOpacity() && chart._activeChartInstance) {\n chart._updateSeriesOpacity(null, true);\n chart._applySeriesOpacity(chart._activeChartInstance.children, null, true);\n chart._activeChartInstance = null;\n }\n\n if ($.inArray(currentSeries.type, [PIE, DONUT, FUNNEL]) >= 0) {\n var point = currentSeries.data[pointIndex];\n if (point && defined(point.visible)) {\n point.visible = !point.visible;\n } else {\n var pointVisibility = currentSeries.pointVisibility = currentSeries.pointVisibility || {};\n var visible = pointVisibility[pointIndex];\n pointVisibility[pointIndex] = defined(visible) ? !visible : false;\n }\n } else {\n currentSeries.visible = !currentSeries.visible;\n this._seriesVisibility.save(currentSeries);\n }\n\n chart._noTransitionsRedraw();\n },\n\n _createTooltip: function() {\n return new Tooltip(this.element, extend({}, this.options.tooltip, {\n rtl: this._isRtl()\n }));\n },\n\n _tooltipleave: function() {\n if (this._instance) {\n this._instance.hideElements();\n }\n },\n\n _bindData: function(e) {\n var chart = this,\n options = chart.options,\n series = chart._sourceSeries || options.series,\n seriesIx,\n seriesLength = series.length,\n data = chart.dataSource.view(),\n grouped = (chart.dataSource.group() || []).length > 0,\n processedSeries = [],\n seriesVisibility = this._seriesVisibility,\n currentSeries,\n groupedSeries;\n\n seriesVisibility.read();\n\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n\n if (chart._isBindable(currentSeries) && grouped) {\n groupedSeries = groupSeries(currentSeries, data);\n processedSeries = processedSeries.concat(groupedSeries);\n\n seriesVisibility.applyByGroup(groupedSeries, e);\n } else {\n currentSeries = extend({}, currentSeries);\n processedSeries.push(currentSeries);\n\n seriesVisibility.applyByIndex(currentSeries, e);\n }\n }\n\n chart._sourceSeries = series;\n options.series = processedSeries;\n this._instance.applySeriesColors();\n\n chart._bindSeries();\n chart._bindCategories();\n\n this._hasData = true;\n },\n\n _onDataChanged: function(e) {\n this._bindData(e);\n\n this.trigger(DATABOUND);\n if (this._instance && this._instance.fontLoaded) {\n this._redraw();\n }\n },\n\n _bindSeries: function() {\n var chart = this,\n data = chart.dataSource.view(),\n series = chart.options.series,\n seriesIx,\n seriesLength = series.length,\n currentSeries,\n groupIx,\n seriesData;\n\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n\n if (chart._isBindable(currentSeries)) {\n groupIx = currentSeries._groupIx;\n seriesData = defined(groupIx) ? (data[groupIx] || {}).items : data;\n\n if (currentSeries.autoBind !== false) {\n currentSeries.data = seriesData;\n }\n }\n }\n },\n\n _bindCategories: function() {\n var chart = this,\n data = chart.dataSource.view() || [],\n grouped = (chart.dataSource.group() || []).length > 0,\n categoriesData = data,\n options = chart.options,\n definitions = [].concat(options.categoryAxis),\n axisIx,\n axis;\n\n if (grouped) {\n if (data.length) {\n categoriesData = data[0].items;\n }\n }\n\n for (axisIx = 0; axisIx < definitions.length; axisIx++) {\n axis = definitions[axisIx];\n if (axis.autoBind !== false) {\n chart._bindCategoryAxis(axis, categoriesData, axisIx);\n }\n }\n },\n\n _bindCategoryAxis: function(axis, data, axisIx) {\n var count = (data || []).length,\n categoryIx,\n category,\n row;\n\n if (axis.field) {\n axis.categories = [];\n for (categoryIx = 0; categoryIx < count; categoryIx++) {\n row = data[categoryIx];\n\n category = getField(axis.field, row);\n if (categoryIx === 0) {\n axis.categories = [category];\n axis.dataItems = [row];\n } else {\n axis.categories.push(category);\n axis.dataItems.push(row);\n }\n }\n } else if (this._instance) {\n this._instance.bindCategoryAxisFromSeries(axis, axisIx);\n }\n },\n\n _isBindable: function(series) {\n var valueFields = SeriesBinder.current.valueFields(series),\n result = true,\n field, i;\n\n for (i = 0; i < valueFields.length; i++) {\n field = valueFields[i];\n if (field === VALUE) {\n field = \"field\";\n } else {\n field = field + \"Field\";\n }\n\n if (!defined(series[field])) {\n result = false;\n break;\n }\n }\n\n return result;\n },\n\n _isRtl: function() {\n return kendo.support.isRtl(this.element) && this.element.css(\"direction\") === RTL;\n }\n });\n\n var proxyMembers = [\"getAxis\", \"findAxisByName\", \"plotArea\", \"toggleHighlight\", \"showTooltip\",\n \"hideTooltip\", \"_resize\", \"_redraw\", \"_noTransitionsRedraw\", \"_legendItemHover\", \"_eventCoordinates\"];\n\n function createProxyMember(name) {\n Chart.fn[name] = function() {\n var instance = this._instance;\n if (instance) {\n return instance[name].apply(instance, arguments);\n }\n };\n }\n\n for (var idx = 0; idx < proxyMembers.length; idx++) {\n createProxyMember(proxyMembers[idx]);\n }\n\n function groupSeries(series, data) {\n var result = [],\n nameTemplate,\n legacyTemplate = series.groupNameTemplate,\n groupIx,\n dataLength = data.length,\n seriesClone;\n\n if (dataLength === 0) {\n seriesClone = deepExtend({}, series);\n seriesClone.visibleInLegend = false;\n return [seriesClone];\n }\n\n if (defined(legacyTemplate)) {\n kendo.logToConsole(\n \"'groupNameTemplate' is obsolete and will be removed in future versions. \" +\n \"Specify the group name template as 'series.name'\"\n );\n\n if (legacyTemplate) {\n nameTemplate = template(legacyTemplate);\n }\n } else {\n nameTemplate = template(series.name || \"\");\n if (nameTemplate._slotCount === 0) {\n nameTemplate = template(defined(series.name) ?\n \"#= group.value #: #= series.name #\" :\n \"#= group.value #\"\n );\n }\n }\n\n for (groupIx = 0; groupIx < dataLength; groupIx++) {\n seriesClone = deepExtend({}, series);\n\n if (!kendo.isFunction(seriesClone.color)) {\n seriesClone.color = undefined$1;\n }\n\n seriesClone._groupIx = groupIx;\n seriesClone._groupValue = data[groupIx].value;\n result.push(seriesClone);\n\n if (nameTemplate) {\n seriesClone.name = nameTemplate({\n series: seriesClone, group: data[groupIx]\n });\n }\n }\n\n return result;\n }\n\n dataviz.ExportMixin.extend(Chart.fn);\n\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(Chart.fn);\n }\n\n dataviz.ui.plugin(Chart);\n\n var SeriesVisibilityState = Class.extend({\n init: function() {\n this.groups = {};\n this.index = {};\n this.options = {};\n },\n\n applyByGroup: function(series, e) {\n if ((e && e.action) || this.options.persistSeriesVisibility) {\n for (var idx = 0; idx < series.length; idx++) {\n if (this.groups[series[idx]._groupValue] === false) {\n series[idx].visible = false;\n }\n }\n } else {\n this.groups = {};\n }\n },\n\n applyByIndex: function(series, e) {\n if ((e && e.action) || this.options.persistSeriesVisibility) {\n if (this.index[series.index] === false) {\n series.visible = false;\n }\n } else {\n this.index = {};\n }\n },\n\n save: function(series) {\n if (!series) {\n return;\n }\n\n if (this.options.persistSeriesVisibility) {\n this.options.series[series.index].visible = series.visible;\n } else {\n this.saveState(series);\n }\n },\n\n setOptions: function(options) {\n this.options = options;\n this.groups = {};\n this.index = {};\n },\n\n read: function() {\n var options = this.options;\n if (options.persistSeriesVisibility) {\n var series = options.series;\n for (var idx = 0; idx < series.length; idx++) {\n this.saveState(series[idx]);\n }\n }\n },\n\n saveState: function(series) {\n if (defined(series._groupValue)) {\n this.groups[series._groupValue] = series.visible;\n } else {\n this.index[series.index] = series.visible;\n }\n }\n });\n\n var geom = kendo.geometry;\n\n function normalizeStyle(style) {\n for (var field in style) {\n if (style[field] === undefined$1) {\n style[field] = '';\n }\n }\n\n return style;\n }\n\n var Tooltip = Observable.extend({\n init: function(chartElement, options) {\n var tooltip = this;\n\n Observable.fn.init.call(tooltip);\n\n this.setOptions(options);\n\n tooltip.chartElement = chartElement;\n\n tooltip.template = Tooltip.template;\n if (!tooltip.template) {\n tooltip.template = Tooltip.template = kendo.template(\n \"
\" +\n '
' +\n '#if (!d.autoHide) {#
#}#' +\n \"
\", { useWithBlock: false, paramName: \"d\" });\n }\n\n tooltip.element = $(tooltip.template(tooltip.options));\n\n tooltip.move = tooltip.move.bind(tooltip);\n tooltip._mouseleave = tooltip._mouseleave.bind(tooltip);\n\n var mobileScrollerSelector = kendo.format(\"[{0}='content'],[{0}='scroller']\", kendo.attr(\"role\"));\n tooltip._mobileScroller = chartElement.closest(mobileScrollerSelector).data(\"kendoMobileScroller\");\n tooltip.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n tooltip._closeTooltipHandler = tooltip._closeTooltip.bind(tooltip);\n },\n\n destroy: function() {\n var tooltip = this;\n\n this._clearShowTimeout();\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler);\n if (this.element) {\n this.element.off(MOUSELEAVE_NS).remove();\n this.element = null;\n }\n },\n\n setOptions: function(options) {\n this.options = deepExtend({}, this.options, options);\n },\n\n options: {\n opacity: 1,\n animation: {\n duration: TOOLTIP_ANIMATION_DURATION\n },\n sharedTemplate:\n \"\" +\n \"\" +\n \"# for(var i = 0; i < points.length; i++) { #\" +\n \"# var point = points[i]; #\" +\n \"\" +\n \"# if(colorMarker) { # \" +\n \"\" +\n \"# } #\" +\n \"# if(nameColumn) { # \" +\n \"\" +\n \"# } #\" +\n \"\" +\n \"\" +\n \"# } #\" +\n \"
#= categoryText #
#if (point.series.name) {# #: point.series.name #: #} else {#   #}##= content(point) #
\",\n categoryFormat: \"{0:d}\",\n autoHide: true\n },\n\n move: function() {\n var tooltip = this,\n options = tooltip.options,\n element = tooltip.element,\n offset;\n\n if (!tooltip.anchor || !tooltip.element) {\n return;\n }\n\n offset = tooltip._offset();\n if (!tooltip.visible) {\n element.css({ top: offset.top, left: offset.left });\n }\n\n tooltip.visible = true;\n tooltip._ensureElement(document.body);\n element\n .stop(true, true)\n .show()\n .animate({\n left: offset.left,\n top: offset.top\n }, options.animation.duration);\n },\n\n _clearShowTimeout: function() {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n },\n\n getAnchor: function(size) {\n var anchor = this.anchor;\n var point = anchor.point;\n var align = anchor.align;\n var x = point.left;\n var y = point.top;\n if (align.horizontal === \"center\") {\n x -= size.width / 2;\n } else if (align.horizontal === \"right\") {\n x -= size.width;\n }\n\n if (align.vertical === \"center\") {\n y -= size.height / 2;\n } else if (align.vertical === \"bottom\") {\n y -= size.height;\n }\n\n return {\n x: x,\n y: y\n };\n },\n\n _offset: function() {\n var tooltip = this,\n size = tooltip._measure(),\n anchor = tooltip.getAnchor(size),\n top = anchor.y,\n left = anchor.x,\n zoomLevel = kendo.support.zoomLevel(),\n viewport = $(window),\n scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0,\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0,\n movable = (this._mobileScroller || {}).movable;\n\n if (!movable || movable.scale === 1) {\n top += tooltip._fit(top - scrollTop, size.height, outerHeight(viewport) / zoomLevel);\n left += tooltip._fit(left - scrollLeft, size.width, outerWidth(viewport) / zoomLevel);\n } else {\n var transform = geom.transform().scale(movable.scale, movable.scale, [movable.x, movable.y]);\n var point = new geom.Point(left, top).transform(transform);\n left = point.x;\n top = point.y;\n }\n\n return {\n top: top,\n left: left\n };\n },\n\n show: function(e) {\n var tooltip = this;\n\n this.anchor = e.anchor;\n this.element.css(normalizeStyle(e.style));\n this.element.toggleClass(TOOLTIP_INVERSE, !!e.className);\n this.element.toggleClass(SHARED_TOOLTIP_CLASS, !!e.shared);\n\n var content = e.shared ? this._sharedContent(e) : this._pointContent(e.point);\n this.element.find('.k-tooltip-content').html(content);\n\n if (!tooltip.options.autoHide) {\n tooltip.element.off(\"click\" + NS).on(\"click\" + NS, \".k-tooltip-button\", tooltip._closeTooltipHandler);\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler)\n .on(tooltip.downEvent, tooltip._closeTooltipHandler);\n }\n\n this._clearShowTimeout();\n this.showTimeout = setTimeout(this.move, TOOLTIP_SHOW_DELAY);\n },\n\n hide: function(forceHide) {\n var tooltip = this;\n\n if (!tooltip.options.autoHide && !forceHide) {\n return;\n }\n\n clearTimeout(tooltip.showTimeout);\n tooltip._hideElement();\n\n if (tooltip.visible) {\n tooltip.point = null;\n tooltip.visible = false;\n tooltip.index = null;\n DOCUMENT_ELEMENT.off(tooltip.downEvent, tooltip._closeTooltipHandler);\n }\n },\n\n _closeTooltip: function(e) {\n var target = $(e.target);\n\n if (!target.is(\".k-chart-tooltip, .k-tooltip-content\")) {\n e.preventDefault();\n this.chartElement.data(\"kendoChart\")._instance.hideElements();\n this.hide(true);\n }\n },\n\n _sharedContent: function(e) {\n var points = e.points;\n var nameColumn = dataviz.grep(points, function(point) {\n return defined(point.series.name);\n }).length;\n\n var colorMarker = e.series.length > 1;\n var colspan = 1;\n if (nameColumn) {\n colspan++;\n }\n if (colorMarker) {\n colspan++;\n }\n\n var template = kendo.template(this.options.sharedTemplate);\n var content = template({\n points: points,\n category: e.category,\n categoryText: e.categoryText,\n content: this._pointContent,\n colorMarker: colorMarker,\n nameColumn: nameColumn,\n colspan: colspan\n });\n\n return content;\n },\n\n _measure: function() {\n this._ensureElement();\n\n var size = {\n width: outerWidth(this.element),\n height: outerHeight(this.element)\n };\n\n return size;\n },\n\n _ensureElement: function() {\n if (this.element) {\n this.element\n .appendTo(document.body)\n .on(MOUSELEAVE_NS, this._mouseleave);\n }\n },\n\n _mouseleave: function(e) {\n var target = e.relatedTarget;\n var chart = this.chartElement[0];\n if (target && target !== chart && !$.contains(chart, target)) {\n this.trigger(LEAVE);\n }\n },\n\n _hideElement: function() {\n var tooltip = this;\n var element = this.element;\n if (element) {\n element.fadeOut({\n always: function() {\n if (!tooltip.visible) {\n element.off(MOUSELEAVE_NS).remove();\n }\n }\n });\n }\n },\n\n _pointContent: function(point) {\n var tooltip = this,\n options = deepExtend({}, tooltip.options, point.options.tooltip),\n content, tooltipTemplate;\n\n if (defined(point.value)) {\n content = point.value.toString();\n }\n\n if (options.template) {\n tooltipTemplate = template(options.template);\n content = tooltipTemplate({\n value: point.value,\n category: point.category,\n series: point.series,\n dataItem: point.dataItem,\n percentage: point.percentage,\n runningTotal: point.runningTotal,\n total: point.total,\n low: point.low,\n high: point.high,\n xLow: point.xLow,\n xHigh: point.xHigh,\n yLow: point.yLow,\n yHigh: point.yHigh\n });\n } else if (options.format) {\n content = point.formatValue(options.format);\n }\n\n return content;\n },\n\n _fit: function(offset, size, viewPortSize) {\n var output = 0;\n\n if (offset + size > viewPortSize) {\n output = viewPortSize - (offset + size);\n }\n\n if (offset < 0) {\n output = -offset;\n }\n\n return output;\n }\n });\n\n var CrosshairTooltip = Tooltip.extend({\n init: function(chartElement, options) {\n Tooltip.fn.init.call(this, chartElement, options);\n this.element.addClass(\"k-chart-crosshair-tooltip\");\n },\n\n show: function(e) {\n var element = this.element;\n\n if (element) {\n this.anchor = e.anchor;\n this.element.css(e.style);\n this.element.html(this.content(e));\n\n this.move();\n }\n },\n\n move: function() {\n var tooltip = this,\n element = tooltip.element,\n offset = tooltip._offset();\n\n tooltip._ensureElement();\n element.css({ top: offset.top, left: offset.left }).show();\n },\n\n content: function(e) {\n var content = e.value,\n options = e.crosshair.options.tooltip;\n\n if (options.template) {\n content = template(options.template)({\n value: content\n });\n }\n\n return content;\n },\n\n hide: function() {\n this.element.hide();\n }\n });\n\n var ChartPane = Class.extend({\n init: function(chart, pane) {\n this._chart = chart;\n this._pane = pane;\n this.visual = pane.visual;\n this.chartsVisual = pane.chartContainer.visual;\n this.name = pane.options.name;\n },\n\n series: function() {\n var chart = this._chart;\n var seriesByPane = chart._plotArea.groupSeriesByPane();\n var series = seriesByPane[this.name || \"default\"];\n\n var result = [];\n if (series) {\n for (var idx = 0; idx < series.length; idx++) {\n result.push(new ChartSeries(chart, series[idx]));\n }\n }\n\n return result;\n }\n });\n\n var ChartSeries = Class.extend({\n init: function(chart, options) {\n this._chart = chart;\n this._options = options;\n },\n\n points: function(filter) {\n var points = this._points;\n if (!points) {\n var series = this._seriesOptions();\n var plotArea = this._chart._plotArea;\n this._points = points = plotArea.pointsBySeriesIndex(series.index);\n }\n if (kendo.isFunction(filter)) {\n points = this._filterPoints(points, filter);\n }\n\n\n return points;\n },\n\n data: function(data) {\n var series = this._seriesOptions();\n if (data) {\n var chart = this._chart;\n var plotArea = chart._plotArea;\n\n series.data = data;\n\n if (series.categoryField) {\n var axis = plotArea.seriesCategoryAxis(series);\n var options = [].concat(chart.options.categoryAxis);\n\n chart._instance.bindCategoryAxisFromSeries(options[axis.axisIndex], axis.axisIndex);\n }\n\n chart._noTransitionsRedraw();\n this._clearFields();\n }\n\n return series.data;\n },\n\n findPoint: function(filter) {\n var points = this.points();\n for (var idx = 0; idx < points.length; idx++) {\n if (filter(points[idx])) {\n return points[idx];\n }\n }\n },\n\n toggleHighlight: function(show, elements) {\n if (!elements) {\n elements = this.points();\n } else if (kendo.isFunction(elements)) {\n elements = this.points(elements);\n } else {\n elements = isArray(elements) ? elements : [elements];\n }\n\n this._chart._instance.togglePointsHighlight(show, elements);\n },\n\n toggleVisibility: function(visible, filter) {\n var chart = this._chart;\n var seriesOptions = this._seriesOptions();\n var hasFilter = kendo.isFunction(filter);\n if (!hasFilter) {\n seriesOptions.visible = visible;\n chart._seriesVisibility.save(seriesOptions);\n } else {\n if (inArray(seriesOptions.type, [PIE, DONUT, FUNNEL])) {\n var data = this._filterData(filter);\n for (var idx = 0; idx < data.length; idx++) {\n data[idx].visible = visible;\n }\n } else {\n seriesOptions.visible = function(data) {\n return filter(data.dataItem) ? visible : true;\n };\n }\n }\n\n chart._noTransitionsRedraw();\n\n this._clearFields();\n },\n\n _filterData: function(filter) {\n var data = this._seriesOptions().data;\n var length = data.length;\n var result = [];\n\n for (var idx = 0; idx < length; idx++) {\n if (filter(data[idx])) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n _filterPoints: function(points, filter) {\n var result = [];\n var length = points.length;\n for (var idx = 0; idx < length; idx++) {\n if (filter(points[idx])) {\n result.push(points[idx]);\n }\n }\n return result;\n },\n\n _seriesOptions: function() {\n var series = this._series;\n if (!series) {\n series = this._series = this._chart._seriesOptions(this._options);\n }\n return series;\n },\n\n _clearFields: function() {\n delete this._points;\n delete this._series;\n }\n });\n\n function triggerPaneRender(panes) {\n for (var idx = 0; idx < panes.length; idx++) {\n panes[idx].notifyRender();\n }\n }\n\n dataviz.Tooltip = Tooltip;\n dataviz.CrosshairTooltip = CrosshairTooltip;\n dataviz.ChartInstanceObserver = ChartInstanceObserver;\n dataviz.ChartPane = ChartPane;\n dataviz.ChartSeries = ChartSeries;\n\n })(window.kendo.jQuery);\n\n var __meta__ = {\n id: \"dataviz.chart\",\n name: \"Chart\",\n category: \"dataviz\",\n description: \"The Chart widget uses modern browser technologies to render high-quality data visualizations in the browser.\",\n depends: [ \"data\", \"userevents\", \"drawing\", \"dataviz.core\", \"dataviz.themes\" ],\n features: [{\n id: \"dataviz.chart-pdf-export\",\n name: \"PDF export\",\n description: \"Export Chart as PDF\",\n depends: [ \"pdf\" ]\n }]\n };\n\n}));\n"]}