{"version":3,"sources":["kendo.dataviz.chart.js"],"names":["f","define","defined","value","UNDEFINED","round","precision","power","pow","math","p","limitValue","min","max","rad","degrees","DEG_TO_RAD","deg","radians","isNumber","val","isNaN","valueOrDefault","defaultValue","sqr","objectKey","object","key","parts","push","sort","join","hashKey","str","i","hash","length","charCodeAt","hashObject","arrayLimits","arr","MAX_NUM","MIN_NUM","arrayMin","arrayMax","sparseArrayMin","sparseArrayLimits","sparseArrayMax","n","isFinite","undefined","last","array","append","first","second","apply","renderTemplate","text","kendo","template","useWithBlock","paramName","renderAttr","name","renderAllAttr","attrs","output","renderStyle","renderSize","size","renderPos","pos","result","toHyphens","split","isTransparent","color","arabicToRoman","literals","1","10","100","2","20","200","3","30","300","4","40","400","5","50","500","6","60","600","7","70","700","8","80","800","9","90","900","1000","values","roman","shift","romanToArabic","r","digits","prev","v","toLowerCase","x","l","c","d","m","charAt","memoize","cache","Object","create","id","arguments","this","ucs2decode","string","extra","counter","ucs2encode","map","String","fromCharCode","mergeSort","a","cmp","merge","b","ai","bi","slice","left","right","Math","floor","window","deepExtend","PI","Number","MAX_VALUE","now","Date","getTime","util","drawing","dataviz","amd","a1","a2","a3","$","zeroSize","width","height","baseline","measureText","style","measureBox","TextMetrics","current","measure","loadFonts","fonts","callback","promises","document","font","load","e","logToConsole","Promise","all","then","doc","Class","LRUCache","extend","init","_size","_length","_map","put","lru","entry","_head","_tail","newer","older","get","defaultMeasureBox","options","_cache","_initOptions","baselineMarkerSize","box","styleKey","cacheKey","cachedResult","baselineMarker","_baselineMarker","cloneNode","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","jQuery","encodeBase64","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","encodeUTF8","KEY_STR","inArray","ObserversMixin","observers","_observers","addObserver","element","removeObserver","index","splice","trigger","methodName","event","observer","idx","_suspended","optionsChange","geometryChange","suspend","resume","_observerField","field","mixins","returnSelf","DefaultAggregates","_defaults","intersection","b1","b2","ua","ua_t","y","u_b","Point2D","applySeriesDefaults","themeOptions","seriesType","baseOptions","series","seriesLength","seriesDefaults","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","type","data","tooltip","bar","column","rangeColumn","line","verticalLine","pie","donut","area","verticalArea","scatter","scatterLine","bubble","candlestick","ohlc","boxPlot","bullet","verticalBullet","polarArea","polarLine","radarArea","radarLine","waterfall","applySeriesColors","currentSeries","seriesColor","defaults","colors","seriesColors","resolveAxisAliases","alias","each","CATEGORY","VALUE","X","Y","applyAxisDefaults","themeAxisDefaults","axisDefaults","axisName","axes","concat","axisOptions","axisColor","labels","title","categoriesCount","seriesCount","categories","getField","row","getter","getDateField","toDate","STRING","parseDate","isArray","toTime","addDuration","date","unit","weekStartDay","hours","getHours","YEARS","getFullYear","adjustDST","MONTHS","getMonth","WEEKS","startOfWeek","DAYS","getDate","HOURS","setUTCMinutes","addTicks","TIME_PER_HOUR","MINUTES","TIME_PER_MINUTE","getSeconds","setSeconds","SECONDS","TIME_PER_SECOND","MILLISECONDS","getMilliseconds","setMilliseconds","day","getDay","daysToSubtract","TIME_PER_DAY","floorDate","ceilDate","dateDiff","absoluteDateDiff","diff","offsetDiff","getTimezoneOffset","ticks","duration","TIME_PER_UNIT","dateIndex","start","baseUnit","baseUnitStep","startDate","timeIndex","singleItemOrArray","axisGroupBox","axisBox","contentBox","wrap","clone","Box2D","equalsIgnoreCase","dateEquals","appendIfNotNull","lteDateIndex","sortedDates","currentDate","low","high","countNumbers","num","count","areNumbers","axisRanges","axis","ranges","range","evalOptions","context","state","dryRun","property","propValue","excluded","depth","needsEval","MAX_EXPAND_DEPTH","hasOwnProperty","isFn","OBJECT","groupSeries","nameTemplate","groupIx","seriesClone","legacyTemplate","groupNameTemplate","dataLength","visibleInLegend","_slotCount","_groupIx","_groupValue","group","filterSeriesByType","types","indexOf","item","sortDates","dates","comparer","dateComparer","uniqueDates","srcDates","isDateAxis","sampleCategory","dateCategory","DATE","transpose","rows","rowIx","colIx","colCount","rowCount","ensureTree","fieldName","target","path","setter","seriesTotal","pointData","sum","SeriesBinder","bindPoint","valueFields","parseFloat","fields","visible","abs","hasGradientOverlay","overlay","gradient","anyHasZIndex","elements","zIndex","preventDefault","_defaultPrevented","pointByCategoryName","points","category","hasValue","toChartAxisRanges","axisRange","acceptKey","mouseKey","accept","ctrlKey","shiftKey","altKey","preloadFonts","fetchFonts","MAX_DEPTH","keys","forEach","clearMissingValues","originalOptions","fieldValue","originalValue","nullValue","isPlainObject","paneAnchor","pane","anchor","PlotAreaFactory","BarLabel","LegendItem","LegendLayout","Legend","CategoryAxis","DateCategoryAxis","DateValueAxis","ClusterLayout","StackWrap","PointEventsMixin","NoteMixin","Bar","BarChartAnimation","FadeInAnimation","ErrorRangeCalculator","CategoricalChart","BarChart","RangeBar","RangeBarChart","BulletChart","Bullet","Target","ErrorBarBase","CategoricalErrorBar","ScatterErrorBar","LinePoint","Bubble","LineSegment","LineChartMixin","ClipAnimationMixin","LineChart","ClipAnimation","StepLineSegment","SplineSegment","AreaSegmentMixin","AreaSegment","AreaChart","SplineAreaSegment","StepAreaSegment","ScatterChart","ScatterLineChart","BubbleChart","Candlestick","CandlestickChart","OHLCPoint","OHLCChart","BoxPlotChart","BoxPlot","VerticalBoxPlot","PieSegment","PieChartMixin","PieChart","DonutSegment","DonutChart","WaterfallChart","WaterfallSegment","Pane","ChartContainer","PlotAreaBase","PlotAreaEventsMixin","CategoricalPlotArea","AxisGroupRangeTracker","XYPlotArea","PiePlotArea","DonutPlotArea","PieAnimation","BubbleAnimation","Highlight","BaseTooltip","Tooltip","SharedTooltip","Crosshair","CrosshairTooltip","Aggregates","Selection","Pannable","ZoomSelection","MousewheelZoom","SeriesAggregator","ChartPlotArea","ChartPane","ChartAxis","ChartSeries","noop","proxy","Observable","DataSource","Widget","ui","isFunction","Axis","AxisLabel","BoxElement","ChartElement","Color","CurveProcessor","FloatElement","Note","LogarithmicAxis","NumericAxis","RootElement","Ring","ShapeElement","ShapeBuilder","TextBox","Title","alignPathToPixel","autoFormat","eventTargetElement","getSpacing","interpolate","interpolateValue","mwDelta","geom","geometry","draw","NS","ABOVE","AREA","AUTO","FIT","AXIS_LABEL_CLICK","BAR","BAR_ALIGN_MIN_WIDTH","BAR_BORDER_BRIGHTNESS","BELOW","BLACK","BOTH","BOTTOM","BOX_PLOT","BUBBLE","BULLET","CANDLESTICK","CENTER","CHANGE","CIRCLE","CONTEXTMENU_NS","CLIP","COLOR","COLUMN","COORD_PRECISION","CROSS","CSS_PREFIX","CUSTOM","DATABOUND","DEFAULT_FONT","DEFAULT_HEIGHT","DEFAULT_PRECISION","DEFAULT_WIDTH","DEFAULT_ERROR_BAR_WIDTH","DONUT","DONUT_SECTOR_ANIM_DELAY","DRAG","DRAG_END","DRAG_START","ERROR_LOW_FIELD","ERROR_HIGH_FIELD","X_ERROR_LOW_FIELD","X_ERROR_HIGH_FIELD","Y_ERROR_LOW_FIELD","Y_ERROR_HIGH_FIELD","FADEIN","FIRST","FROM","FUNNEL","GLASS","HORIZONTAL","HORIZONTAL_WATERFALL","INITIAL_ANIMATION_DURATION","INSIDE_BASE","INSIDE_END","INTERPOLATE","LEAVE","LEFT","LEGEND_ITEM_CLICK","LEGEND_ITEM_HOVER","LINE","LINE_MARKER_SIZE","LINEAR","LOGARITHMIC","MAX","MIN","MIN_CATEGORY_POINTS_RANGE","MIN_VALUE","MOUSELEAVE_NS","MOUSEMOVE_TRACKING","MOUSEMOVE_NS","MOUSEMOVE_DELAY","MOUSEWHEEL_DELAY","MOUSEWHEEL_NS","NOTE_CLICK","NOTE_HOVER","NOTE_TEXT","OHLC","OUTSIDE_END","PIE","PIE_SECTOR_ANIM_DELAY","PLOT_AREA_CLICK","PLOT_AREA_HOVER","POINTER","RANGE_BAR","RANGE_COLUMN","RENDER","RIGHT","ROUNDED_BEVEL","ROUNDED_GLASS","SCATTER","SCATTER_LINE","SELECT_START","SELECT","SELECT_END","SERIES_CLICK","SERIES_HOVER","START_SCALE","support","browser","msie","version","STEP","SMOOTH","STD_ERR","STD_DEV","SUMMARY_FIELD","TIME_PER_MILLISECOND","TIME_PER_WEEK","TIME_PER_MONTH","TIME_PER_YEAR","years","months","weeks","days","minutes","seconds","milliseconds","TO","TOP","TOOLTIP_ANIMATION_DURATION","TOOLTIP_OFFSET","TOOLTIP_SHOW_DELAY","TOOLTIP_HIDE_DELAY","TOOLTIP_INVERSE","VERTICAL_AREA","VERTICAL_BOX_PLOT","VERTICAL_BULLET","VERTICAL_LINE","WATERFALL","WHITE","ZERO","ZOOM_ACCELERATION","ZOOM_START","ZOOM","ZOOM_END","BASE_UNITS","EQUALLY_SPACED_SERIES","DateLabelFormats","Chart","userOptions","dataSource","chart","destroy","fn","call","addClass","css","_originalOptions","_initTheme","_initSurface","bind","events","wrapper","_initDataSource","notify","themes","themeName","theme","seriesCopies","_applyDefaults","_dataChangeHandler","_onDataChanged","_bindCategories","_hasDataSource","_redraw","_attachEvents","autoBind","fetch","setDataSource","unbind","_hasData","items","renderAs","chartArea","legend","categoryAxis","highlight","negativeValues","transitions","valueAxis","plotArea","xAxis","yAxis","panes","pannable","zoomable","refresh","_bindSeries","getSize","dimensions","_resize","t","redraw","paneName","_model","_plotArea","findPane","getAxis","findAxisByName","findPaneByName","findPaneByIndex","findSeries","srcSeries","findSeriesByName","_createSeries","findSeriesByIndex","seriesOptions","_seriesOptions","toggleHighlight","show","filter","seriesName","categoryName","firstSeries","filterPoints","pointsBySeriesName","charts","_togglePointsHighlight","_highlight","togglePointHighlight","showTooltip","point","categoryIndex","shared","_sharedTooltip","_tooltip","findPoint","categoryIx","pointsByCategoryIndex","showAt","hideTooltip","hide","surface","_surfaceWrap","clear","resize","Surface","view","model","_getModel","_destroyView","renderVisual","traverse","animation","setup","visual","play","_createTooltip","_setupSelection","_createPannable","_createZoomSelection","_createMousewheelZoom","exportVisual","originalChartArea","_pannable","selection","_zoomSelection","mousewheel","_mousewheelZoom","_tooltipleave","hideCrosshairs","_modelOptions","buildTitle","_createPlotArea","reflow","skipSeries","selections","_selections","_selectStartHandler","_selectStart","_selectHandler","_select","_selectEndHandler","_selectEnd","select","vertical","justified","_mouseover","_mouseout","on","_click","_mousewheel","_mouseleave","_mousemove","throttle","_shouldAttachMouseMove","UserEvents","_userEvents","global","multiTouch","fastTap","tap","_tap","_start","move","_move","end","_end","gesturestart","_gesturestart","gesturechange","_gesturechange","gestureend","_gestureend","_gestureDistance","distance","_unsetActivePoint","suspendTracking","_zooming","resumeTracking","previousGestureDistance","scaleDelta","args","mousewheelZoom","delta","originalEvent","updateRanges","zoom","_drawingChartElement","leave","_events","coords","_eventCoordinates","backgroundContainsPoint","_startNavigation","currentAxis","_navState","pan","startLocation","location","translateRange","_endNavigation","prevented","totalDelta","origEvent","_mwTimeout","clearTimeout","setTimeout","scaleRange","chartEvent","findPointPane","cancel","_suppressHover","_getChartElement","match","eventTarget","chartElement","parent","aliasFor","closest","isTouch","client","clientX","clientY","_toModelCoordinates","offset","paddingLeft","parseInt","paddingTop","win","scrollLeft","top","scrollTop","drawingElement","_activePoint","_propagateClick","_startHover","click","tooltipOptions","isHighlighted","hover","tooltipTracking","_mouseMoveTracking","seriesPoint","containsPoint","getNearestPoint","seriesIx","off","_trackCrosshairs","_trackSharedTooltip","crosshairs","pointArgs","hoverArgs","pointCategoryIndex","_tooltipCategoryIx","eventArgs","categoryPoints","relatedTarget","_sourceSeries","grouped","processedSeries","_isBindable","_applyGroupVisibleState","_deferRedraw","visibleState","action","_groupVisibleState","_saveGroupVisibleState","vml","_clearRedrawTimeout","_redrawTimeout","clearInterval","seriesData","axisIx","categoriesData","definitions","_bindCategoryAxis","dataItems","_bindCategoryAxisFromSeries","s","onAxis","dataIx","dataRow","getFn","dateAxis","uniqueCategories","categoryField","_legendItemClick","seriesIndex","pointIndex","_noTransitionsRedraw","transitionsState","_legendItemHover","pointsBySeriesIndex","setOptions","_setEvents","ExportMixin","PDFMixin","_registry","register","seriesTypes","registry","_valueFields","_otherFields","_nullValue","_undefinedValue","otherFields","binder","_makeValue","canonicalFields","pointIx","fieldData","srcValueFields","srcPointFields","_bindFromArray","sourceFields","_bindFromObject","initialValue","srcFields","srcFieldName","sourceFieldName","content","barLabel","textBox","position","margin","padding","background","border","aboveAxis","delay","createVisual","noclip","targetBox","children","align","vAlign","x1","y1","x2","y2","rotation","bottom","alignToClipBox","clipBox","parentBox","paddingBox","createContainer","createMarker","createLabel","container","markerOptions","markerColor","markers","labelOptions","renderComplete","cursor","eventSink","_itemOverlay","Path","fromRect","toRect","fill","opacity","stroke","appendVisual","widget","that","customVisual","active","renderChildren","defaultVisual","addVisual","render","legendItem","Layout","spacing","lineSpacing","orientation","rect","bbox","clippedBBox","rectToBox","createItems","offsetX","offsetY","userAlign","shrinkToFit","innerElement","isVertical","reverse","hasItems","containerCustomReflow","containerReflow","containerBox","alignTarget","translate","_initFields","_initCategories","_ticks","outOfRangeMin","outOfRangeMax","definedMin","definedMax","srcCategories","ceil","majorGridLines","rangeIndices","totalRange","totalRangeIndices","limit","_seriesMax","getScale","lineBox","scale","getTickPositions","stepSize","positions","getLabelsTickPositions","tickPositions","getMajorTickPositions","unshift","labelTickIndex","label","arrangeLabels","hideOutOfRangeLabels","firstLabel","lastLabel","getTicks","majorTicks","getMinorTickPositions","minorTicks","getHash","_hash","getSlot","from","to","p1","p2","lineStart","slotBox","singleSlot","slot","startValue","lineEnd","getCategory","zoomRange","rate","totalMax","totalMin","labelsCount","labelsRange","skip","step","createAxisLabel","dataItem","axisLabelText","shouldRenderNote","limitRange","pointsRange","diffStart","diffEnd","rangeMin","rangeMax","valueRange","useDefault","roundToBaseUnit","userSetBaseUnit","userSetBaseUnitStep","defaultBaseUnit","autoBaseUnit","_groupsStart","groupCategories","dateFormats","autoBaseUnitSteps","maxDateGroups","parseNoteValue","rounds","cat","lastCat","minDiff","_categoryRange","_range","categoryLimits","categoriesRange","minIdx","maxIdx","_roundToTotalStep","currentRange","datesRange","panRange","totalLimits","indicesRange","baseUnitIndex","autoBaseUnitStep","maxDiff","rangeDiff","stepIndex","autoUnit","stepOptions","unitSteps","nextStep","autoUnitIx","span","units","totalUnits","_timeScale","timeRange","maxCategory","lineSize","_collapse","nextDate","groups","upper","roundToNext","roundedStep","roundedDate","unitFormat","format","seriesMin","seriesMax","axisCrossingValue","axisCrossingValues","applyDefaults","timeUnits","baseUnitTime","autoMin","autoMax","userMajorUnit","majorUnit","autoMajorUnit","actualUnits","unitsToAdd","head","tail","minorUnit","getDivisions","stepValue","dir","startEdge","divisions","getValue","exact","limittedRange","endValue","gap","childBox","cluster","slots","slotSize","currentChild","positionAxis","childrenCount","snapTo","percentage","stackValue","runningTotal","total","createNote","notes","noteText","note","_rendered","errorBar","labelText","labelTemplate","formatValue","owner","formatPointValue","errorBars","rectVisual","sender","getChart","Group","createRect","strokeOpacity","getBorderColor","dashType","lineJoin","createGradientOverlay","baseColor","createHighlight","highlightVisual","highlightVisualArgs","borderColor","brightness","_brightness","toHex","tooltipAnchor","tooltipWidth","tooltipHeight","isStacked","overlapsBox","overlaps","Animation","fromScale","origin","Point","transform","abort","scaleX","scaleY","AnimationFactory","easing","fadeTo","errorValue","initGlobalRanges","prototype","percentRegex","standardDeviationRegex","RegExp","average","deviation","multiple","errorRange","standardError","deviationMatch","exec","valueGetter","createValueGetter","getAverage","getStandardDeviation","globalRange","getStandardError","getErrorRange","pointValue","percentValue","Error","sqrt","isSample","squareDifferenceSum","seriesCategoryAxis","valueAxisRanges","seriesPoints","_evalSeries","invertAxes","clip","traverseDataPoints","addValue","pointOptions","pointType","plotValue","categoryPts","categorySum","otherValues","other","stack","otherStack","isStacked100","plotRange","positive","prevValue","isStackedBar","otherValue","seriesValueAxis","categoryAxisCrossingValue","stackLimits","stackName","pIx","updateStackRange","limits","errorTotals","chartSeries","limitsCache","negative","addErrorBar","lowValue","highValue","seriesErrorRanges","addPointErrorBar","stackedErrorRange","updateRange","createPoint","evalPointOptions","doEval","namedValueAxes","categorySlots","chartPoints","categorySlot","valueSlot","pointSlot","reflowPoint","reflowCategories","crossingValues","axisIndex","slotX","slotY","currentCategory","_outOfRangeCallback","_bindPoint","outOfRangePoint","bindCache","_bindCache","clusterType","stackType","stackWrap","negativeColor","getStackWrap","stackGroup","wraps","_stackGroup","stackAxis","zeroSlot","childrenLength","createAnimation","_setAnimationOptions","_setChildrenAnimation","pointVisual","fromOptions","toOptions","labelFrom","_createLabel","labelTo","rangeBar","plotLimits","wrapData","seriesItem","bulletOptions","shape","targetSlot","targetValueSlot","targetSlotX","targetSlotY","set","bodyVisual","endCaps","linePoints","valueBox","centerBox","center","capsWidth","getCapsWidth","capValue","capStart","capEnd","boxSize","createDefaultVisual","lineOptions","moveTo","lineTo","seriesAxes","marker","markerBorder","markerBox","_childBox","noteTargetBox","reflowLabel","alignTo","defaultColor","shadow","getElement","halfSize","Rect","radius","Circle","segment","closed","visualPoints","fromPoints","close","renderSegments","sortedPoints","pointCount","lastSegment","_segments","sortPoints","seriesMissingValues","createSegment","_addSegment","missingValues","assumeZero","nearestPoint","pointBox","pointDistance","allPoints","nearestPointDistance","distanceTo","clipPath","root","getRoot","animationPoints","_setEnd","segments","topRight","bottomRight","setX","calculateStepPoints","prevPoint","prevMarkerBoxCenter","markerBoxCenter","isInterpolate","revDir","curveProcessor","curve","process","firstPoint","lastPoint","valueAxisLineBox","categoryAxisLineBox","stackPoints","_linePoints","createArea","createLine","lineCap","prevSegment","_gapStackPoints","stackPoint","_stackPoints","currentSeriesIx","gapStackPoint","startIdx","endIdx","_previousSegmentPoint","_createGapStackPoint","segmentIx","seriesIdx","strokeSegments","_strokeSegments","createFill","createStroke","prevStrokeSegments","prevAnchor","stackSegments","firstAnchor","fillSegments","Segment","controlOut","controlIn","closeFill","fillPath","xAxisRanges","yAxisRanges","valueErrorField","lowField","highField","createMissingValue","xAxisName","yAxisName","xAxisRange","yAxisRange","namedXAxes","axisX","namedYAxes","axisY","currentSeriesPoints","missingValue","_maxSize","updateBubblesSize","pointsCount","animationOptions","minSize","maxSize","minR","maxR","minArea","maxArea","areaRange","areaRatio","baseZIndex","mid","ocSlot","lhSlot","open","realBody","lines","reflowNote","_mainVisual","mainVisual","createOverlay","createBody","createLines","drawLines","lineStyle","normalColor","valueParts","splitValue","downColor","oSlot","cSlot","oPoints","cPoints","lhPoints","lower","q1","median","q3","filterOutliers","outliers","mean","extremes","whiskerSlot","boxSlot","medianSlot","meanSlot","reflowBoxSlot","reflowWhiskerSlot","meanPoints","calcMeanPoints","whiskerPoints","calcWhiskerPoints","medianPoints","calcMedianPoints","renderOutliers","markersBorder","outlierValue","outerFence","reflowOutliers","sector","animationDelay","lp","labelWidth","labelHeight","labelsOptions","labelsDistance","angle","middle","expand","startAngle","innerRadius","ir","endAngle","createSegmentVisual","borderOptions","fallbackFill","userSpace","singleSegment","createRing","adjacentBox","createLegendItem","itemLabelOptions","pointVisible","legendOptions","inactiveItems","inactiveItemsLabels","legendItems","connectors","anglePerValue","explode","currentAngle","colorsCount","evalSegmentOptions","segmentOptions","seriesConfig","space","minWidth","halfMinWidth","defaultPadding","newBox","newBoxCenter","seriesConfigs","boxCenter","leftSideLabels","rightSideLabels","labelComparator","leftLabelsReflow","rightLabelsReflow","distances","distanceBetweenLabels","distributeLabels","secondBox","firstBox","lr","remaining","_takeDistance","reflowLabels","amount","available","boxX","labelDistance","boxY","hAlignLabel","connectorLine","connectorsColor","centerPoint","sr","crossing","_connectorLines","seriesId","pointInCircle","originalX","direction","cx","cy","holeSize","totalSize","seriesWithoutSize","currentSize","createSegments","summary","totalCategories","fromBox","toBox","guid","createTitle","chartContainer","titleOptions","appendAxis","appendChart","empty","removeAxis","removeChart","pop","visualStyle","createGridLines","stackRoot","clipRoot","gridLines","j","altAxis","allAxes","vGridLines","hGridLines","createGradient","chartsBox","axisValueField","shouldClip","_clipBox","clipRect","unclipLabels","initSeries","createPanes","createCrosshairs","setTitle","currentPane","paneOptions","panesLength","paneIndex","currentCrosshair","crosshair","removeCrosshairs","matchingPane","axisToRemove","filteredAxes","chartToRemove","filteredCharts","addToLegend","seriesVisible","groupAxes","paneAxes","paneIx","xAxes","yAxes","any","groupSeriesByPane","seriesByPane","seriesPaneName","filterVisibleSeries","unpad","reflowPanes","reflowAxes","reflowCharts","crossingAxes","valuesToAdd","alignAxisTo","targetAxis","crossingValue","targetCrossingValue","slotEdge","targetEdge","alignAxes","anchorCrossings","paneId","xAnchor","yAnchor","xAnchorCrossings","yAnchorCrossings","leftAnchors","rightAnchors","topAnchors","bottomAnchors","_overlap","_mirrored","mirror","shrinkAxisWidth","overflowX","shrink","shrinkAxisHeight","overflowY","shrinked","fitAxes","paneBox","reflowPaneAxes","autoRotateAxisLabels","groupedAxes","rotated","autoRotateLabels","chartPane","percents","remainingHeight","remainingPanes","autoHeightPanes","backgroundBox","axisA","axisB","axesCount","chartsBoxes","boxes","addBackgroundPaths","multipath","paths","bg","_bgVisual","MultiPath","paneByPoint","_dispatchEvent","namedCategoryAxes","valueAxisRangeTracker","stack100","createCategoryAxes","aggregateCategories","createCategoryAxesLabels","createCharts","createValueAxes","reset","paneSeries","visibleSeries","groupSeriesByCategoryAxis","createChartGroup","createAreaChart","createBarChart","createRangeBarChart","createBulletChart","createCandlestickChart","createBoxPlotChart","createOHLCChart","createWaterfallChart","createLineChart","axisPane","aggregateSeries","filterSeries","minCategory","outOfRangePoints","_outOfRangeMinPoint","_outOfRangeMaxPoint","aggregator","outOfRangeMinCategory","outOfRangeMaxCategory","srcData","srcPoints","aggregatorSeries","outOfRangeMinIdx","outOfRangeMaxIdx","aggregatePoints","categoriesToAdd","update","grep","defaultPaneName","stackableChartOptions","axisSeries","unique","categoryAxes","barChart","rangeColumnChart","bulletChart","lineChart","areaChart","waterfallChart","axisRequiresRounding","categoryAxisName","categoryAxisIndex","seriesAxis","centeredSeries","aggregatedAxis","createLabels","primaryAxis","_deferLabels","isJustified","axisType","defaultAxisRange","tracker","defaultRange","query","roundToMajorUnit","eventType","pointPane","updateAxisOptions","axesOptions","chartAxisRanges","chartRange","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","xAxisOptions","yAxisOptions","createXYAxis","seriesAxisName","firstPointValue","inferredDate","namedAxes","isLog","typeSamples","xAxesOptions","yAxesOptions","currentValue","xValues","yValues","createPieChart","pieChart","createDonutChart","donutChart","_points","hasHighlight","toggleHandler","toggle","mobileScrollerSelector","padding-top","padding-right","padding-bottom","padding-left","attr","_mobileScroller","_clearShowTimeout","remove","_offset","_ensureElement","stop","animate","showTimeout","_padding","_chartPadding","_measure","chartPadding","chartOffset","zoomLevel","viewport","pageYOffset","documentElement","pageXOffset","movable","_fit","outerHeight","outerWidth","setStyle","pointColor","percBrightness","toggleClass","backgroundColor","borderWidth","_hideElement","appendTo","contains","fadeOut","always","_pointContent","tooltipTemplate","xLow","xHigh","yLow","yHigh","_pointAnchor","viewPortSize","html","sharedTemplate","categoryFormat","_content","_slotAnchor","_defaultAnchor","hCenter","slotCenter","categoryText","stickyMode","moveLine","getBox","dim","axisLineBox","getAnchor","halfWidth","halfHeight","bottomLeft","topLeft","sumOrNull","avg","aggregates","getValueAxis","selectorPrefix","_dateAxis","find","leftMask","rightMask","leftHandle","rightHandle","_index","cssText","stopPropagation","userEvents","press","_press","add","removeClass","_state","_rangeEventArgs","_value","moveTarget","parents","handle","oldRange","is","p0","touches","rightClick","which","_slot","leftMaskWidth","rightMaskWidth","zDir","lock","_active","_panAxes","updatedAxes","_marquee","zoomPane","elementOffset","_zoomPane","_elementOffset","_zoomPaneClipBox","selectionPosition","_selectionPosition","_updateAxisRanges","initialDelta","defaultAggregates","fieldAggregate","sa","seriesFields","_seriesFields","rootAggregate","aggregate","_series","_binder","canonicalName","srcValues","_bindPoints","firstDataItem","_bindField","backgroundVisual","_chart","_pane","chartsVisual","_axis","_options","_filterPoints","_clearFields","toggleVisibility","hasFilter","_filterData","easeOutElastic","asin","sin","plugin","errorLow","errorHigh"],"mappings":"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","file":"kendo.dataviz.chart.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('util/main', ['kendo.core'], f);\n}(function () {\n (function () {\n var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend;\n var DEG_TO_RAD = math.PI / 180, MAX_NUM = Number.MAX_VALUE, MIN_NUM = -Number.MAX_VALUE, UNDEFINED = 'undefined';\n function defined(value) {\n return typeof value !== UNDEFINED;\n }\n function round(value, precision) {\n var power = pow(precision);\n return math.round(value * power) / power;\n }\n function pow(p) {\n if (p) {\n return math.pow(10, p);\n } else {\n return 1;\n }\n }\n function limitValue(value, min, max) {\n return math.max(math.min(value, max), min);\n }\n function rad(degrees) {\n return degrees * DEG_TO_RAD;\n }\n function deg(radians) {\n return radians / DEG_TO_RAD;\n }\n function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function valueOrDefault(value, defaultValue) {\n return defined(value) ? value : defaultValue;\n }\n function sqr(value) {\n return value * value;\n }\n function objectKey(object) {\n var parts = [];\n for (var key in object) {\n parts.push(key + object[key]);\n }\n return parts.sort().join('');\n }\n function hashKey(str) {\n var hash = 2166136261;\n for (var i = 0; i < str.length; ++i) {\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n hash ^= str.charCodeAt(i);\n }\n return hash >>> 0;\n }\n function hashObject(object) {\n return hashKey(objectKey(object));\n }\n var now = Date.now;\n if (!now) {\n now = function () {\n return new Date().getTime();\n };\n }\n function arrayLimits(arr) {\n var length = arr.length, i, min = MAX_NUM, max = MIN_NUM;\n for (i = 0; i < length; i++) {\n max = math.max(max, arr[i]);\n min = math.min(min, arr[i]);\n }\n return {\n min: min,\n max: max\n };\n }\n function arrayMin(arr) {\n return arrayLimits(arr).min;\n }\n function arrayMax(arr) {\n return arrayLimits(arr).max;\n }\n function sparseArrayMin(arr) {\n return sparseArrayLimits(arr).min;\n }\n function sparseArrayMax(arr) {\n return sparseArrayLimits(arr).max;\n }\n function sparseArrayLimits(arr) {\n var min = MAX_NUM, max = MIN_NUM;\n for (var i = 0, length = arr.length; i < length; i++) {\n var n = arr[i];\n if (n !== null && isFinite(n)) {\n min = math.min(min, n);\n max = math.max(max, n);\n }\n }\n return {\n min: min === MAX_NUM ? undefined : min,\n max: max === MIN_NUM ? undefined : max\n };\n }\n function last(array) {\n if (array) {\n return array[array.length - 1];\n }\n }\n function append(first, second) {\n first.push.apply(first, second);\n return first;\n }\n function renderTemplate(text) {\n return kendo.template(text, {\n useWithBlock: false,\n paramName: 'd'\n });\n }\n function renderAttr(name, value) {\n return defined(value) && value !== null ? ' ' + name + '=\\'' + value + '\\' ' : '';\n }\n function renderAllAttr(attrs) {\n var output = '';\n for (var i = 0; i < attrs.length; i++) {\n output += renderAttr(attrs[i][0], attrs[i][1]);\n }\n return output;\n }\n function renderStyle(attrs) {\n var output = '';\n for (var i = 0; i < attrs.length; i++) {\n var value = attrs[i][1];\n if (defined(value)) {\n output += attrs[i][0] + ':' + value + ';';\n }\n }\n if (output !== '') {\n return output;\n }\n }\n function renderSize(size) {\n if (typeof size !== 'string') {\n size += 'px';\n }\n return size;\n }\n function renderPos(pos) {\n var result = [];\n if (pos) {\n var parts = kendo.toHyphens(pos).split('-');\n for (var i = 0; i < parts.length; i++) {\n result.push('k-pos-' + parts[i]);\n }\n }\n return result.join(' ');\n }\n function isTransparent(color) {\n return color === '' || color === null || color === 'none' || color === 'transparent' || !defined(color);\n }\n function arabicToRoman(n) {\n var literals = {\n 1: 'i',\n 10: 'x',\n 100: 'c',\n 2: 'ii',\n 20: 'xx',\n 200: 'cc',\n 3: 'iii',\n 30: 'xxx',\n 300: 'ccc',\n 4: 'iv',\n 40: 'xl',\n 400: 'cd',\n 5: 'v',\n 50: 'l',\n 500: 'd',\n 6: 'vi',\n 60: 'lx',\n 600: 'dc',\n 7: 'vii',\n 70: 'lxx',\n 700: 'dcc',\n 8: 'viii',\n 80: 'lxxx',\n 800: 'dccc',\n 9: 'ix',\n 90: 'xc',\n 900: 'cm',\n 1000: 'm'\n };\n var values = [\n 1000,\n 900,\n 800,\n 700,\n 600,\n 500,\n 400,\n 300,\n 200,\n 100,\n 90,\n 80,\n 70,\n 60,\n 50,\n 40,\n 30,\n 20,\n 10,\n 9,\n 8,\n 7,\n 6,\n 5,\n 4,\n 3,\n 2,\n 1\n ];\n var roman = '';\n while (n > 0) {\n if (n < values[0]) {\n values.shift();\n } else {\n roman += literals[values[0]];\n n -= values[0];\n }\n }\n return roman;\n }\n function romanToArabic(r) {\n r = r.toLowerCase();\n var digits = {\n i: 1,\n v: 5,\n x: 10,\n l: 50,\n c: 100,\n d: 500,\n m: 1000\n };\n var value = 0, prev = 0;\n for (var i = 0; i < r.length; ++i) {\n var v = digits[r.charAt(i)];\n if (!v) {\n return null;\n }\n value += v;\n if (v > prev) {\n value -= 2 * prev;\n }\n prev = v;\n }\n return value;\n }\n function memoize(f) {\n var cache = Object.create(null);\n return function () {\n var id = '';\n for (var i = arguments.length; --i >= 0;) {\n id += ':' + arguments[i];\n }\n return id in cache ? cache[id] : cache[id] = f.apply(this, arguments);\n };\n }\n function ucs2decode(string) {\n var output = [], counter = 0, length = string.length, value, extra;\n while (counter < length) {\n value = string.charCodeAt(counter++);\n if (value >= 55296 && value <= 56319 && counter < length) {\n extra = string.charCodeAt(counter++);\n if ((extra & 64512) == 56320) {\n output.push(((value & 1023) << 10) + (extra & 1023) + 65536);\n } else {\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n }\n function ucs2encode(array) {\n return array.map(function (value) {\n var output = '';\n if (value > 65535) {\n value -= 65536;\n output += String.fromCharCode(value >>> 10 & 1023 | 55296);\n value = 56320 | value & 1023;\n }\n output += String.fromCharCode(value);\n return output;\n }).join('');\n }\n function mergeSort(a, cmp) {\n if (a.length < 2) {\n return a.slice();\n }\n function merge(a, b) {\n var r = [], ai = 0, bi = 0, i = 0;\n while (ai < a.length && bi < b.length) {\n if (cmp(a[ai], b[bi]) <= 0) {\n r[i++] = a[ai++];\n } else {\n r[i++] = b[bi++];\n }\n }\n if (ai < a.length) {\n r.push.apply(r, a.slice(ai));\n }\n if (bi < b.length) {\n r.push.apply(r, b.slice(bi));\n }\n return r;\n }\n return function sort(a) {\n if (a.length <= 1) {\n return a;\n }\n var m = Math.floor(a.length / 2);\n var left = a.slice(0, m);\n var right = a.slice(m);\n left = sort(left);\n right = sort(right);\n return merge(left, right);\n }(a);\n }\n deepExtend(kendo, {\n util: {\n MAX_NUM: MAX_NUM,\n MIN_NUM: MIN_NUM,\n append: append,\n arrayLimits: arrayLimits,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n defined: defined,\n deg: deg,\n hashKey: hashKey,\n hashObject: hashObject,\n isNumber: isNumber,\n isTransparent: isTransparent,\n last: last,\n limitValue: limitValue,\n now: now,\n objectKey: objectKey,\n round: round,\n rad: rad,\n renderAttr: renderAttr,\n renderAllAttr: renderAllAttr,\n renderPos: renderPos,\n renderSize: renderSize,\n renderStyle: renderStyle,\n renderTemplate: renderTemplate,\n sparseArrayLimits: sparseArrayLimits,\n sparseArrayMin: sparseArrayMin,\n sparseArrayMax: sparseArrayMax,\n sqr: sqr,\n valueOrDefault: valueOrDefault,\n romanToArabic: romanToArabic,\n arabicToRoman: arabicToRoman,\n memoize: memoize,\n ucs2encode: ucs2encode,\n ucs2decode: ucs2decode,\n mergeSort: mergeSort\n }\n });\n kendo.drawing.util = kendo.util;\n kendo.dataviz.util = kendo.util;\n }());\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('util/text-metrics', [\n 'kendo.core',\n 'util/main'\n ], f);\n}(function () {\n (function ($) {\n var doc = document, kendo = window.kendo, Class = kendo.Class, util = kendo.util, defined = util.defined;\n var LRUCache = Class.extend({\n init: function (size) {\n this._size = size;\n this._length = 0;\n this._map = {};\n },\n put: function (key, value) {\n var lru = this, map = lru._map, entry = {\n key: key,\n value: value\n };\n map[key] = entry;\n if (!lru._head) {\n lru._head = lru._tail = entry;\n } else {\n lru._tail.newer = entry;\n entry.older = lru._tail;\n lru._tail = entry;\n }\n if (lru._length >= lru._size) {\n map[lru._head.key] = null;\n lru._head = lru._head.newer;\n lru._head.older = null;\n } else {\n lru._length++;\n }\n },\n get: function (key) {\n var lru = this, entry = lru._map[key];\n if (entry) {\n if (entry === lru._head && entry !== lru._tail) {\n lru._head = entry.newer;\n lru._head.older = null;\n }\n if (entry !== lru._tail) {\n if (entry.older) {\n entry.older.newer = entry.newer;\n entry.newer.older = entry.older;\n }\n entry.older = lru._tail;\n entry.newer = null;\n lru._tail.newer = entry;\n lru._tail = entry;\n }\n return entry.value;\n }\n }\n });\n var defaultMeasureBox = $('
')[0];\n function zeroSize() {\n return {\n width: 0,\n height: 0,\n baseline: 0\n };\n }\n var TextMetrics = Class.extend({\n init: function (options) {\n this._cache = new LRUCache(1000);\n this._initOptions(options);\n },\n options: { baselineMarkerSize: 1 },\n measure: function (text, style, box) {\n if (!text) {\n return zeroSize();\n }\n var styleKey = util.objectKey(style), cacheKey = util.hashKey(text + styleKey), cachedResult = this._cache.get(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n var size = zeroSize();\n var measureBox = box ? box : defaultMeasureBox;\n var baselineMarker = this._baselineMarker().cloneNode(false);\n for (var key in style) {\n var value = style[key];\n if (defined(value)) {\n measureBox.style[key] = value;\n }\n }\n $(measureBox).text(text);\n measureBox.appendChild(baselineMarker);\n doc.body.appendChild(measureBox);\n if ((text + '').length) {\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n size.height = measureBox.offsetHeight;\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n }\n if (size.width > 0 && size.height > 0) {\n this._cache.put(cacheKey, size);\n }\n measureBox.parentNode.removeChild(measureBox);\n return size;\n },\n _baselineMarker: function () {\n return $('')[0];\n }\n });\n TextMetrics.current = new TextMetrics();\n function measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n }\n function loadFonts(fonts, callback) {\n var promises = [];\n if (fonts.length > 0 && document.fonts) {\n try {\n promises = fonts.map(function (font) {\n return document.fonts.load(font);\n });\n } catch (e) {\n kendo.logToConsole(e);\n }\n Promise.all(promises).then(callback, callback);\n } else {\n callback();\n }\n }\n kendo.util.TextMetrics = TextMetrics;\n kendo.util.LRUCache = LRUCache;\n kendo.util.loadFonts = loadFonts;\n kendo.util.measureText = measureText;\n }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('util/base64', ['util/main'], f);\n}(function () {\n (function () {\n var kendo = window.kendo, deepExtend = kendo.deepExtend, fromCharCode = String.fromCharCode;\n var KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n function encodeBase64(input) {\n var output = '';\n var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n var i = 0;\n input = encodeUTF8(input);\n while (i < input.length) {\n chr1 = input.charCodeAt(i++);\n chr2 = input.charCodeAt(i++);\n chr3 = input.charCodeAt(i++);\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n output = output + KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) + KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n }\n return output;\n }\n function encodeUTF8(input) {\n var output = '';\n for (var i = 0; i < input.length; i++) {\n var c = input.charCodeAt(i);\n if (c < 128) {\n output += fromCharCode(c);\n } else if (c < 2048) {\n output += fromCharCode(192 | c >>> 6);\n output += fromCharCode(128 | c & 63);\n } else if (c < 65536) {\n output += fromCharCode(224 | c >>> 12);\n output += fromCharCode(128 | c >>> 6 & 63);\n output += fromCharCode(128 | c & 63);\n }\n }\n return output;\n }\n deepExtend(kendo.util, {\n encodeBase64: encodeBase64,\n encodeUTF8: encodeUTF8\n });\n }());\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('mixins/observers', ['kendo.core'], f);\n}(function () {\n (function ($) {\n var math = Math, kendo = window.kendo, deepExtend = kendo.deepExtend, inArray = $.inArray;\n var ObserversMixin = {\n observers: function () {\n this._observers = this._observers || [];\n return this._observers;\n },\n addObserver: function (element) {\n if (!this._observers) {\n this._observers = [element];\n } else {\n this._observers.push(element);\n }\n return this;\n },\n removeObserver: function (element) {\n var observers = this.observers();\n var index = inArray(element, observers);\n if (index != -1) {\n observers.splice(index, 1);\n }\n return this;\n },\n trigger: function (methodName, event) {\n var observers = this._observers;\n var observer;\n var idx;\n if (observers && !this._suspended) {\n for (idx = 0; idx < observers.length; idx++) {\n observer = observers[idx];\n if (observer[methodName]) {\n observer[methodName](event);\n }\n }\n }\n return this;\n },\n optionsChange: function (e) {\n e = e || {};\n e.element = this;\n this.trigger('optionsChange', e);\n },\n geometryChange: function () {\n this.trigger('geometryChange', { element: this });\n },\n suspend: function () {\n this._suspended = (this._suspended || 0) + 1;\n return this;\n },\n resume: function () {\n this._suspended = math.max((this._suspended || 0) - 1, 0);\n return this;\n },\n _observerField: function (field, value) {\n if (this[field]) {\n this[field].removeObserver(this);\n }\n this[field] = value;\n value.addObserver(this);\n }\n };\n deepExtend(kendo, { mixins: { ObserversMixin: ObserversMixin } });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));\n(function (f, define) {\n define('kendo.dataviz.chart', [\n 'kendo.color',\n 'kendo.data',\n 'kendo.dataviz.core',\n 'kendo.dataviz.themes',\n 'kendo.drawing',\n 'kendo.userevents'\n ], f);\n}(function () {\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: [\n 'data',\n 'userevents',\n 'drawing',\n 'dataviz.core',\n 'dataviz.themes'\n ],\n features: [\n {\n id: 'dataviz.chart-polar',\n name: 'Polar & Radar',\n description: 'Support for Polar and Radar charts.',\n depends: ['dataviz.chart.polar'],\n requireJS: false\n },\n {\n id: 'dataviz.chart-funnel',\n name: 'Funnel chart',\n description: 'Support for Funnel chart.',\n depends: ['dataviz.chart.funnel'],\n requireJS: false\n },\n {\n id: 'dataviz.chart-pdf-export',\n name: 'PDF export',\n description: 'Export Chart as PDF',\n depends: ['pdf']\n }\n ]\n };\n (function ($, undefined) {\n var each = $.each, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, math = Math, noop = $.noop, extend = $.extend, proxy = $.proxy, kendo = window.kendo, Class = kendo.Class, Observable = kendo.Observable, DataSource = kendo.data.DataSource, Widget = kendo.ui.Widget, deepExtend = kendo.deepExtend, getter = kendo.getter, isFn = kendo.isFunction, template = kendo.template, dataviz = kendo.dataviz, Axis = dataviz.Axis, AxisLabel = dataviz.AxisLabel, Box2D = dataviz.Box2D, BoxElement = dataviz.BoxElement, ChartElement = dataviz.ChartElement, Color = kendo.drawing.Color, CurveProcessor = dataviz.CurveProcessor, FloatElement = dataviz.FloatElement, Note = dataviz.Note, LogarithmicAxis = dataviz.LogarithmicAxis, NumericAxis = dataviz.NumericAxis, Point2D = dataviz.Point2D, RootElement = dataviz.RootElement, Ring = dataviz.Ring, ShapeElement = dataviz.ShapeElement, ShapeBuilder = dataviz.ShapeBuilder, TextBox = dataviz.TextBox, Title = dataviz.Title, alignPathToPixel = dataviz.alignPathToPixel, autoFormat = dataviz.autoFormat, dateComparer = dataviz.dateComparer, eventTargetElement = dataviz.eventTargetElement, getSpacing = dataviz.getSpacing, inArray = dataviz.inArray, interpolate = dataviz.interpolateValue, mwDelta = dataviz.mwDelta, round = dataviz.round, util = kendo.util, append = util.append, defined = util.defined, last = util.last, limitValue = util.limitValue, sparseArrayLimits = util.sparseArrayLimits, sparseArrayMin = util.sparseArrayMin, sparseArrayMax = util.sparseArrayMax, renderTemplate = util.renderTemplate, valueOrDefault = util.valueOrDefault, geom = dataviz.geometry, draw = dataviz.drawing;\n var NS = '.kendoChart', ABOVE = 'above', AREA = 'area', AUTO = 'auto', FIT = 'fit', AXIS_LABEL_CLICK = dataviz.AXIS_LABEL_CLICK, BAR = 'bar', BAR_ALIGN_MIN_WIDTH = 6, BAR_BORDER_BRIGHTNESS = 0.8, BELOW = 'below', BLACK = '#000', BOTH = 'both', BOTTOM = 'bottom', BOX_PLOT = 'boxPlot', BUBBLE = 'bubble', BULLET = 'bullet', CANDLESTICK = 'candlestick', CATEGORY = 'category', CENTER = 'center', CHANGE = 'change', CIRCLE = 'circle', CONTEXTMENU_NS = 'contextmenu' + NS, CLIP = dataviz.CLIP, COLOR = 'color', COLUMN = 'column', COORD_PRECISION = dataviz.COORD_PRECISION, CROSS = 'cross', CSS_PREFIX = 'k-', CUSTOM = 'custom', DATABOUND = 'dataBound', DATE = 'date', DAYS = 'days', DEFAULT_FONT = dataviz.DEFAULT_FONT, DEFAULT_HEIGHT = dataviz.DEFAULT_HEIGHT, DEFAULT_PRECISION = dataviz.DEFAULT_PRECISION, DEFAULT_WIDTH = dataviz.DEFAULT_WIDTH, DEFAULT_ERROR_BAR_WIDTH = 4, DONUT = 'donut', DONUT_SECTOR_ANIM_DELAY = 50, DRAG = 'drag', DRAG_END = 'dragEnd', DRAG_START = 'dragStart', ERROR_LOW_FIELD = 'errorLow', ERROR_HIGH_FIELD = 'errorHigh', X_ERROR_LOW_FIELD = 'xErrorLow', X_ERROR_HIGH_FIELD = 'xErrorHigh', Y_ERROR_LOW_FIELD = 'yErrorLow', Y_ERROR_HIGH_FIELD = 'yErrorHigh', FADEIN = 'fadeIn', FIRST = 'first', FROM = 'from', FUNNEL = 'funnel', GLASS = 'glass', HORIZONTAL = 'horizontal', HORIZONTAL_WATERFALL = 'horizontalWaterfall', HOURS = 'hours', INITIAL_ANIMATION_DURATION = dataviz.INITIAL_ANIMATION_DURATION, INSIDE_BASE = 'insideBase', INSIDE_END = 'insideEnd', INTERPOLATE = 'interpolate', LEAVE = 'leave', LEFT = 'left', LEGEND_ITEM_CLICK = 'legendItemClick', LEGEND_ITEM_HOVER = 'legendItemHover', LINE = 'line', LINE_MARKER_SIZE = 8, LINEAR = 'linear', LOGARITHMIC = 'log', MAX = 'max', MAX_EXPAND_DEPTH = 5, MAX_VALUE = Number.MAX_VALUE, MIN = 'min', MIN_CATEGORY_POINTS_RANGE = 0.01, MIN_VALUE = -Number.MAX_VALUE, MINUTES = 'minutes', MONTHS = 'months', MOUSELEAVE_NS = 'mouseleave' + NS, MOUSEMOVE_TRACKING = 'mousemove.tracking', MOUSEMOVE_NS = 'mousemove' + NS, MOUSEMOVE_DELAY = 20, MOUSEWHEEL_DELAY = 150, MOUSEWHEEL_NS = 'DOMMouseScroll' + NS + ' mousewheel' + NS, NOTE_CLICK = dataviz.NOTE_CLICK, NOTE_HOVER = dataviz.NOTE_HOVER, NOTE_TEXT = 'noteText', OBJECT = 'object', OHLC = 'ohlc', OUTSIDE_END = 'outsideEnd', PIE = 'pie', PIE_SECTOR_ANIM_DELAY = 70, PLOT_AREA_CLICK = 'plotAreaClick', PLOT_AREA_HOVER = 'plotAreaHover', POINTER = 'pointer', RANGE_BAR = 'rangeBar', RANGE_COLUMN = 'rangeColumn', RENDER = 'render', RIGHT = 'right', ROUNDED_BEVEL = 'roundedBevel', ROUNDED_GLASS = 'roundedGlass', SCATTER = 'scatter', SCATTER_LINE = 'scatterLine', SECONDS = 'seconds', MILLISECONDS = 'milliseconds', SELECT_START = 'selectStart', SELECT = 'select', SELECT_END = 'selectEnd', SERIES_CLICK = 'seriesClick', SERIES_HOVER = 'seriesHover', START_SCALE = kendo.support.browser.msie && kendo.support.browser.version === 10 ? 0.001 : 0, STEP = 'step', SMOOTH = 'smooth', STD_ERR = 'stderr', STD_DEV = 'stddev', STRING = 'string', SUMMARY_FIELD = 'summary', TIME_PER_MILLISECOND = 1, TIME_PER_SECOND = 1000 * TIME_PER_MILLISECOND, TIME_PER_MINUTE = 60 * TIME_PER_SECOND, TIME_PER_HOUR = 60 * TIME_PER_MINUTE, TIME_PER_DAY = 24 * TIME_PER_HOUR, TIME_PER_WEEK = 7 * TIME_PER_DAY, TIME_PER_MONTH = 31 * TIME_PER_DAY, TIME_PER_YEAR = 365 * TIME_PER_DAY, TIME_PER_UNIT = {\n 'years': TIME_PER_YEAR,\n 'months': TIME_PER_MONTH,\n 'weeks': TIME_PER_WEEK,\n 'days': TIME_PER_DAY,\n 'hours': TIME_PER_HOUR,\n 'minutes': TIME_PER_MINUTE,\n 'seconds': TIME_PER_SECOND,\n 'milliseconds': TIME_PER_MILLISECOND\n }, TO = 'to', TOP = 'top', TOOLTIP_ANIMATION_DURATION = 150, TOOLTIP_OFFSET = 5, TOOLTIP_SHOW_DELAY = 100, TOOLTIP_HIDE_DELAY = 100, TOOLTIP_INVERSE = 'chart-tooltip-inverse', VALUE = 'value', VERTICAL_AREA = 'verticalArea', VERTICAL_BOX_PLOT = 'verticalBoxPlot', VERTICAL_BULLET = 'verticalBullet', VERTICAL_LINE = 'verticalLine', WATERFALL = 'waterfall', WEEKS = 'weeks', WHITE = '#fff', X = 'x', Y = 'y', YEARS = 'years', ZERO = 'zero', ZOOM_ACCELERATION = 3, ZOOM_START = 'zoomStart', ZOOM = 'zoom', ZOOM_END = 'zoomEnd', BASE_UNITS = [\n MILLISECONDS,\n SECONDS,\n MINUTES,\n HOURS,\n DAYS,\n WEEKS,\n MONTHS,\n YEARS\n ], EQUALLY_SPACED_SERIES = [\n BAR,\n COLUMN,\n OHLC,\n CANDLESTICK,\n BOX_PLOT,\n VERTICAL_BOX_PLOT,\n BULLET,\n RANGE_COLUMN,\n RANGE_BAR,\n WATERFALL,\n HORIZONTAL_WATERFALL\n ];\n var DateLabelFormats = {\n milliseconds: 'HH:mm:ss.fff',\n seconds: 'HH:mm:ss',\n minutes: 'HH:mm',\n hours: 'HH:mm',\n days: 'M/d',\n weeks: 'M/d',\n months: 'MMM \\'yy',\n years: 'yyyy'\n };\n var Chart = Widget.extend({\n init: function (element, userOptions) {\n var chart = this, options, dataSource;\n kendo.destroy(element);\n Widget.fn.init.call(chart, element);\n chart.element.addClass(CSS_PREFIX + this.options.name.toLowerCase()).css('position', 'relative');\n if (userOptions) {\n dataSource = userOptions.dataSource;\n userOptions.dataSource = undefined;\n }\n options = deepExtend({}, chart.options, userOptions);\n chart._originalOptions = deepExtend({}, options);\n chart._initTheme(options);\n chart._initSurface();\n chart.bind(chart.events, chart.options);\n chart.wrapper = chart.element;\n if (userOptions) {\n userOptions.dataSource = dataSource;\n }\n chart._initDataSource(userOptions);\n kendo.notify(chart, dataviz.ui);\n },\n _initTheme: function (options) {\n var chart = this, themes = dataviz.ui.themes || {}, themeName = options.theme, theme = themes[themeName] || themes[themeName.toLowerCase()], themeOptions = themeName && theme ? theme.chart : {}, seriesCopies = [], series = options.series || [], i;\n for (i = 0; i < series.length; i++) {\n seriesCopies.push($.extend({}, series[i]));\n }\n options.series = seriesCopies;\n resolveAxisAliases(options);\n chart._applyDefaults(options, themeOptions);\n if (options.seriesColors === null) {\n options.seriesColors = undefined;\n }\n chart.options = deepExtend({}, themeOptions, options);\n applySeriesColors(chart.options);\n },\n _initDataSource: function (userOptions) {\n var chart = this, dataSource = (userOptions || {}).dataSource;\n chart._dataChangeHandler = proxy(chart._onDataChanged, chart);\n chart.dataSource = DataSource.create(dataSource).bind(CHANGE, chart._dataChangeHandler);\n chart._bindCategories();\n if (dataSource) {\n chart._hasDataSource = true;\n }\n preloadFonts(userOptions, function () {\n chart._redraw();\n chart._attachEvents();\n });\n if (dataSource) {\n if (chart.options.autoBind) {\n chart.dataSource.fetch();\n }\n }\n },\n setDataSource: function (dataSource) {\n var chart = this;\n chart.dataSource.unbind(CHANGE, chart._dataChangeHandler);\n chart.dataSource = dataSource = DataSource.create(dataSource);\n chart._hasDataSource = true;\n chart._hasData = false;\n dataSource.bind(CHANGE, chart._dataChangeHandler);\n if (chart.options.autoBind) {\n dataSource.fetch();\n }\n },\n events: [\n DATABOUND,\n SERIES_CLICK,\n SERIES_HOVER,\n AXIS_LABEL_CLICK,\n LEGEND_ITEM_CLICK,\n LEGEND_ITEM_HOVER,\n PLOT_AREA_CLICK,\n PLOT_AREA_HOVER,\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 RENDER\n ],\n items: function () {\n return $();\n },\n options: {\n name: 'Chart',\n renderAs: '',\n theme: 'default',\n chartArea: {},\n legend: {\n visible: true,\n labels: {}\n },\n categoryAxis: {},\n autoBind: true,\n seriesDefaults: {\n type: COLUMN,\n data: [],\n highlight: { visible: true },\n labels: {},\n negativeValues: { visible: false }\n },\n series: [],\n seriesColors: null,\n tooltip: { visible: false },\n transitions: true,\n valueAxis: {},\n plotArea: {},\n title: {},\n xAxis: {},\n yAxis: {},\n panes: [{}],\n pannable: false,\n zoomable: false\n },\n refresh: function () {\n var chart = this;\n chart._applyDefaults(chart.options);\n applySeriesColors(chart.options);\n chart._bindSeries();\n chart._bindCategories();\n chart.trigger(DATABOUND);\n chart._redraw();\n },\n getSize: function () {\n return kendo.dimensions(this.element);\n },\n _resize: function () {\n var t = this.options.transitions;\n this.options.transitions = false;\n this._redraw();\n this.options.transitions = t;\n },\n redraw: function (paneName) {\n var chart = this, pane, plotArea;\n chart._applyDefaults(chart.options);\n applySeriesColors(chart.options);\n if (paneName) {\n plotArea = chart._model._plotArea;\n pane = plotArea.findPane(paneName);\n plotArea.redraw(pane);\n } else {\n chart._redraw();\n }\n },\n getAxis: function (name) {\n var axes = this._plotArea.axes;\n for (var idx = 0; idx < axes.length; idx++) {\n if (axes[idx].options.name === name) {\n return new ChartAxis(axes[idx]);\n }\n }\n },\n findAxisByName: function (name) {\n return this.getAxis(name);\n },\n plotArea: function () {\n return new ChartPlotArea(this._plotArea);\n },\n findPaneByName: function (name) {\n var panes = this._plotArea.panes;\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 findPaneByIndex: function (idx) {\n var panes = this._plotArea.panes;\n if (panes[idx]) {\n return new ChartPane(this, panes[idx]);\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 findSeriesByName: function (name) {\n return this._createSeries({ name: name });\n },\n findSeriesByIndex: function (index) {\n return this._createSeries({ index: index });\n },\n _createSeries: function (options) {\n var seriesOptions = this._seriesOptions(options);\n if (seriesOptions) {\n return new ChartSeries(this, seriesOptions);\n }\n },\n _seriesOptions: function (options) {\n var plotArea = this._plotArea;\n var series = plotArea.srcSeries || plotArea.series;\n var seriesOptions;\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 return seriesOptions;\n },\n toggleHighlight: function (show, filter) {\n var plotArea = this._plotArea;\n var firstSeries = (plotArea.srcSeries || plotArea.series || [])[0];\n var seriesName, categoryName, points;\n if (kendo.isFunction(filter)) {\n points = plotArea.filterPoints(filter);\n } else {\n if (isPlainObject(filter)) {\n seriesName = filter.series;\n categoryName = filter.category;\n } else {\n seriesName = categoryName = filter;\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 if (points) {\n this._togglePointsHighlight(show, points);\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 showTooltip: function (filter) {\n var shared = this._sharedTooltip();\n var tooltip = this._tooltip;\n var plotArea = this._plotArea;\n var point, categoryIndex;\n if (kendo.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 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 hideTooltip: function () {\n this._tooltip.hide();\n },\n _initSurface: function () {\n var surface = this.surface;\n var wrap = this._surfaceWrap();\n var chartArea = this.options.chartArea;\n if (chartArea.width) {\n wrap.css('width', chartArea.width);\n }\n if (chartArea.height) {\n wrap.css('height', chartArea.height);\n }\n if (!surface || surface.options.type !== this.options.renderAs) {\n if (surface) {\n surface.destroy();\n }\n this.surface = draw.Surface.create(wrap, { type: this.options.renderAs });\n } else {\n this.surface.clear();\n this.surface.resize();\n }\n },\n _surfaceWrap: function () {\n return this.element;\n },\n _redraw: function () {\n var chart = this, model = chart._getModel(), view;\n chart._destroyView();\n chart._model = model;\n chart._plotArea = model._plotArea;\n model.renderVisual();\n if (this.options.transitions !== false) {\n model.traverse(function (element) {\n if (element.animation) {\n element.animation.setup();\n }\n });\n }\n chart._initSurface();\n chart.surface.draw(model.visual);\n if (this.options.transitions !== false) {\n model.traverse(function (element) {\n if (element.animation) {\n element.animation.play();\n }\n });\n }\n chart._tooltip = chart._createTooltip();\n chart._highlight = new Highlight(view);\n chart._setupSelection();\n chart._createPannable();\n chart._createZoomSelection();\n chart._createMousewheelZoom();\n if (!chart._hasDataSource || chart._hasData || !chart.options.autoBind) {\n chart.trigger(RENDER);\n }\n },\n exportVisual: function (options) {\n var visual;\n if (options && (options.width || options.height)) {\n var chartArea = this.options.chartArea;\n var originalChartArea = this._originalOptions.chartArea;\n deepExtend(chartArea, options);\n var model = this._getModel();\n chartArea.width = originalChartArea.width;\n chartArea.height = originalChartArea.height;\n model.renderVisual();\n visual = model.visual;\n } else {\n visual = this.surface.exportVisual();\n }\n return visual;\n },\n _sharedTooltip: function () {\n var chart = this, options = chart.options;\n return chart._plotArea instanceof CategoricalPlotArea && options.tooltip.shared;\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 _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 _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 _createTooltip: function () {\n var chart = this, options = chart.options, element = chart.element, tooltip;\n if (chart._sharedTooltip()) {\n tooltip = new SharedTooltip(element, chart._plotArea, options.tooltip);\n } else {\n tooltip = new Tooltip(element, options.tooltip);\n }\n tooltip.bind(LEAVE, proxy(chart._tooltipleave, chart));\n return tooltip;\n },\n _tooltipleave: function () {\n var chart = this, plotArea = chart._plotArea, highlight = chart._highlight;\n plotArea.hideCrosshairs();\n highlight.hide();\n },\n _applyDefaults: function (options, themeOptions) {\n applyAxisDefaults(options, themeOptions);\n applySeriesDefaults(options, themeOptions);\n },\n _getModel: function () {\n var chart = this, options = chart.options, model = new RootElement(chart._modelOptions()), plotArea;\n model.chart = chart;\n Title.buildTitle(options.title, model);\n plotArea = model._plotArea = chart._createPlotArea();\n if (options.legend.visible) {\n model.append(new Legend(plotArea.options.legend));\n }\n model.append(plotArea);\n model.reflow();\n return model;\n },\n _modelOptions: function () {\n var chart = this, options = chart.options, element = chart.element, height = math.floor(element.height()), width = math.floor(element.width());\n chart._size = null;\n return deepExtend({\n width: width || DEFAULT_WIDTH,\n height: height || DEFAULT_HEIGHT,\n transitions: options.transitions\n }, options.chartArea);\n },\n _createPlotArea: function (skipSeries) {\n var chart = this, options = chart.options;\n return PlotAreaFactory.current.create(skipSeries ? [] : options.series, options);\n },\n _setupSelection: function () {\n var chart = this, plotArea = chart._plotArea, axes = plotArea.axes, selections = chart._selections = [], selection, i, axis, min, max, options;\n if (!chart._selectStartHandler) {\n chart._selectStartHandler = proxy(chart._selectStart, chart);\n chart._selectHandler = proxy(chart._select, chart);\n chart._selectEndHandler = proxy(chart._selectEnd, chart);\n }\n for (i = 0; i < axes.length; i++) {\n axis = axes[i];\n options = axis.options;\n if (axis instanceof CategoryAxis && options.select && !options.vertical) {\n min = 0;\n max = options.categories.length - 1;\n if (axis instanceof DateCategoryAxis) {\n min = options.categories[min];\n max = options.categories[max];\n }\n if (!options.justified) {\n if (axis instanceof DateCategoryAxis) {\n max = addDuration(max, 1, options.baseUnit, options.weekStartDay);\n } else {\n max++;\n }\n }\n selection = new Selection(chart, axis, deepExtend({\n min: min,\n max: max\n }, options.select));\n selection.bind(SELECT_START, chart._selectStartHandler);\n selection.bind(SELECT, chart._selectHandler);\n selection.bind(SELECT_END, chart._selectEndHandler);\n selections.push(selection);\n }\n }\n },\n _selectStart: function (e) {\n return this.trigger(SELECT_START, e);\n },\n _select: function (e) {\n return this.trigger(SELECT, e);\n },\n _selectEnd: function (e) {\n return this.trigger(SELECT_END, e);\n },\n _attachEvents: function () {\n var chart = this, element = chart.element, surface = chart.surface;\n surface.bind('mouseenter', proxy(chart._mouseover, chart));\n surface.bind('mouseleave', proxy(chart._mouseout, chart));\n element.on(CONTEXTMENU_NS, proxy(chart._click, chart));\n element.on(MOUSEWHEEL_NS, proxy(chart._mousewheel, chart));\n element.on(MOUSELEAVE_NS, proxy(chart._mouseleave, chart));\n chart._mousemove = kendo.throttle(proxy(chart._mousemove, chart), MOUSEMOVE_DELAY);\n if (chart._shouldAttachMouseMove()) {\n element.on(MOUSEMOVE_NS, chart._mousemove);\n }\n if (kendo.UserEvents) {\n chart._userEvents = new kendo.UserEvents(element, {\n global: true,\n multiTouch: true,\n fastTap: true,\n tap: proxy(chart._tap, chart),\n start: proxy(chart._start, chart),\n move: proxy(chart._move, chart),\n end: proxy(chart._end, chart),\n gesturestart: proxy(chart._gesturestart, chart),\n gesturechange: proxy(chart._gesturechange, chart),\n gestureend: proxy(chart._gestureend, chart)\n });\n }\n },\n _gesturestart: function (e) {\n if (this._mousewheelZoom) {\n this._gestureDistance = e.distance;\n this._unsetActivePoint();\n this.surface.suspendTracking();\n }\n },\n _gestureend: function () {\n if (this._zooming) {\n if (this.surface) {\n this.surface.resumeTracking();\n }\n this._zooming = false;\n this.trigger(ZOOM_END, {});\n }\n },\n _gesturechange: function (e) {\n var chart = this;\n var mousewheelZoom = chart._mousewheelZoom;\n if (mousewheelZoom) {\n e.preventDefault();\n var previousGestureDistance = chart._gestureDistance;\n var scaleDelta = -e.distance / previousGestureDistance + 1;\n if (math.abs(scaleDelta) >= 0.1) {\n scaleDelta = math.round(scaleDelta * 10);\n chart._gestureDistance = e.distance;\n var args = {\n delta: scaleDelta,\n axisRanges: axisRanges(chart._plotArea.axes),\n originalEvent: e\n };\n if (chart._zooming || !chart.trigger(ZOOM_START, args)) {\n if (!chart._zooming) {\n chart._zooming = true;\n }\n var ranges = args.axisRanges = mousewheelZoom.updateRanges(scaleDelta);\n if (ranges && !chart.trigger(ZOOM, args)) {\n mousewheelZoom.zoom();\n }\n }\n }\n }\n },\n _mouseout: function (e) {\n if (e.element) {\n var element = this._drawingChartElement(e.element, e);\n if (element && element.leave) {\n element.leave(this, e.originalEvent);\n }\n }\n },\n _start: function (e) {\n var chart = this, events = chart._events, coords = chart._eventCoordinates(e);\n if (!chart._plotArea.backgroundContainsPoint(coords)) {\n return;\n }\n if (defined(events[DRAG_START] || events[DRAG] || events[DRAG_END])) {\n chart._startNavigation(e, coords, DRAG_START);\n }\n if (chart._pannable && chart._pannable.start(e)) {\n this.surface.suspendTracking();\n this._unsetActivePoint();\n }\n if (chart._zoomSelection) {\n if (chart._zoomSelection.start(e)) {\n this.trigger(ZOOM_START, {\n axisRanges: axisRanges(this._plotArea.axes),\n originalEvent: e\n });\n }\n }\n },\n _move: function (e) {\n var chart = this, state = chart._navState, pannable = chart._pannable, axes, ranges = {}, i, currentAxis, axisName, axis, delta;\n if (pannable) {\n e.preventDefault();\n ranges = pannable.move(e);\n if (ranges && !chart.trigger(DRAG, {\n axisRanges: ranges,\n originalEvent: e\n })) {\n pannable.pan();\n }\n } else if (state) {\n e.preventDefault();\n axes = state.axes;\n for (i = 0; i < axes.length; i++) {\n currentAxis = axes[i];\n axisName = currentAxis.options.name;\n if (axisName) {\n axis = currentAxis.options.vertical ? e.y : e.x;\n delta = axis.startLocation - axis.location;\n if (delta !== 0) {\n ranges[currentAxis.options.name] = currentAxis.translateRange(delta);\n }\n }\n }\n state.axisRanges = ranges;\n chart.trigger(DRAG, {\n axisRanges: ranges,\n originalEvent: e\n });\n }\n if (chart._zoomSelection) {\n chart._zoomSelection.move(e);\n }\n },\n _end: function (e) {\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 } else {\n this._endNavigation(e, DRAG_END);\n }\n if (this._zoomSelection) {\n var ranges = this._zoomSelection.end(e);\n if (ranges && !this.trigger(ZOOM, {\n axisRanges: ranges,\n originalEvent: e\n })) {\n this._zoomSelection.zoom();\n this.trigger(ZOOM_END, {\n axisRanges: ranges,\n originalEvent: e\n });\n }\n }\n },\n _mousewheel: function (e) {\n var chart = this, origEvent = e.originalEvent, prevented, delta = mwDelta(e), totalDelta, state = chart._navState, axes, i, currentAxis, axisName, ranges = {}, mousewheelZoom = chart._mousewheelZoom, coords = chart._eventCoordinates(origEvent);\n if (!chart._plotArea.backgroundContainsPoint(coords)) {\n return;\n }\n if (mousewheelZoom) {\n var args = {\n delta: delta,\n axisRanges: axisRanges(this._plotArea.axes),\n originalEvent: e\n };\n if (chart._zooming || !chart.trigger(ZOOM_START, args)) {\n e.preventDefault();\n if (!chart._zooming) {\n chart._unsetActivePoint();\n chart.surface.suspendTracking();\n chart._zooming = true;\n }\n if (chart._mwTimeout) {\n clearTimeout(chart._mwTimeout);\n }\n args.axisRanges = ranges = mousewheelZoom.updateRanges(delta);\n if (ranges && !chart.trigger(ZOOM, args)) {\n mousewheelZoom.zoom();\n }\n chart._mwTimeout = setTimeout(function () {\n chart.trigger(ZOOM_END, args);\n chart._zooming = false;\n if (chart.surface) {\n chart.surface.resumeTracking();\n }\n }, MOUSEWHEEL_DELAY);\n }\n } else {\n if (!state) {\n prevented = chart._startNavigation(origEvent, coords, ZOOM_START);\n if (!prevented) {\n state = chart._navState;\n }\n }\n if (state) {\n totalDelta = state.totalDelta || delta;\n state.totalDelta = totalDelta + delta;\n axes = chart._navState.axes;\n for (i = 0; i < axes.length; i++) {\n currentAxis = axes[i];\n axisName = currentAxis.options.name;\n if (axisName) {\n ranges[axisName] = currentAxis.scaleRange(-totalDelta);\n }\n }\n chart.trigger(ZOOM, {\n delta: delta,\n axisRanges: ranges,\n originalEvent: e\n });\n if (chart._mwTimeout) {\n clearTimeout(chart._mwTimeout);\n }\n chart._mwTimeout = setTimeout(function () {\n chart._endNavigation(e, ZOOM_END);\n }, MOUSEWHEEL_DELAY);\n }\n }\n },\n _startNavigation: function (e, coords, chartEvent) {\n var chart = this, plotArea = chart._model._plotArea, pane = plotArea.findPointPane(coords), axes = plotArea.axes.slice(0), prevented;\n if (!pane) {\n return;\n }\n var ranges = axisRanges(axes);\n prevented = chart.trigger(chartEvent, {\n axisRanges: ranges,\n originalEvent: e\n });\n if (prevented) {\n chart._userEvents.cancel();\n } else {\n chart._suppressHover = true;\n chart._unsetActivePoint();\n chart._navState = {\n axisRanges: ranges,\n pane: pane,\n axes: axes\n };\n }\n },\n _endNavigation: function (e, chartEvent) {\n var chart = this;\n if (chart._navState) {\n chart.trigger(chartEvent, {\n axisRanges: chart._navState.axisRanges,\n originalEvent: e\n });\n chart._suppressHover = false;\n chart._navState = null;\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 _drawingChartElement: function (element, e, match) {\n var chartElement;\n while (element && !chartElement) {\n chartElement = element.chartElement;\n element = element.parent;\n }\n if (chartElement) {\n if (chartElement.aliasFor) {\n chartElement = chartElement.aliasFor(e, this._eventCoordinates(e));\n }\n if (match) {\n chartElement = chartElement.closest(match);\n }\n return chartElement;\n }\n },\n _eventCoordinates: function (e) {\n var chart = this, isTouch = defined((e.x || {}).client), clientX = isTouch ? e.x.client : e.clientX, clientY = isTouch ? e.y.client : e.clientY;\n return chart._toModelCoordinates(clientX, clientY);\n },\n _toModelCoordinates: function (clientX, clientY) {\n var element = this.element, offset = element.offset(), paddingLeft = parseInt(element.css('paddingLeft'), 10), paddingTop = parseInt(element.css('paddingTop'), 10), win = $(window);\n return new Point2D(clientX - offset.left - paddingLeft + win.scrollLeft(), clientY - offset.top - paddingTop + win.scrollTop());\n },\n _tap: function (e) {\n var chart = this, drawingElement = chart.surface.eventTarget(e), element = chart._drawingChartElement(drawingElement, e);\n if (chart._activePoint === element) {\n chart._propagateClick(element, e);\n } else {\n if (!chart._startHover(drawingElement, e)) {\n chart._unsetActivePoint();\n }\n chart._propagateClick(element, e);\n }\n },\n _click: function (e) {\n var chart = this, element = chart._getChartElement(e);\n chart._propagateClick(element, e);\n },\n _propagateClick: function (element, e) {\n while (element) {\n if (element.click) {\n element.click(this, e);\n }\n element = element.parent;\n }\n },\n _startHover: function (element, e) {\n var chart = this, chartElement = chart._drawingChartElement(element, e), tooltip = chart._tooltip, highlight = chart._highlight, tooltipOptions = chart.options.tooltip, point;\n if (chart._suppressHover || !highlight || highlight.isHighlighted(chartElement) || chart._sharedTooltip()) {\n return;\n }\n point = chart._drawingChartElement(element, e, function (element) {\n return element.hover && !(element instanceof PlotAreaBase);\n });\n if (point && !point.hover(chart, e)) {\n chart._activePoint = point;\n tooltipOptions = deepExtend({}, tooltipOptions, point.options.tooltip);\n if (tooltipOptions.visible) {\n tooltip.show(point);\n }\n highlight.show(point);\n return point.tooltipTracking;\n }\n },\n _mouseover: function (e) {\n var chart = this;\n if (chart._startHover(e.element, e.originalEvent)) {\n $(document).on(MOUSEMOVE_TRACKING, proxy(chart._mouseMoveTracking, chart));\n }\n },\n _mouseMoveTracking: function (e) {\n var chart = this, options = chart.options, tooltip = chart._tooltip, highlight = chart._highlight, coords = chart._eventCoordinates(e), point = chart._activePoint, tooltipOptions, seriesPoint;\n if (chart._plotArea.box.containsPoint(coords)) {\n if (point && point.tooltipTracking && point.series && point.parent.getNearestPoint) {\n seriesPoint = point.parent.getNearestPoint(coords.x, coords.y, point.seriesIx);\n if (seriesPoint && seriesPoint != point) {\n seriesPoint.hover(chart, e);\n chart._activePoint = seriesPoint;\n tooltipOptions = deepExtend({}, options.tooltip, point.options.tooltip);\n if (tooltipOptions.visible) {\n tooltip.show(seriesPoint);\n }\n highlight.show(seriesPoint);\n }\n }\n } else {\n $(document).off(MOUSEMOVE_TRACKING);\n chart._unsetActivePoint();\n }\n },\n _mousemove: function (e) {\n var coords = this._eventCoordinates(e);\n this._trackCrosshairs(coords);\n if (this._plotArea.hover) {\n this._plotArea.hover(this, e);\n }\n if (this._sharedTooltip()) {\n this._trackSharedTooltip(coords, e);\n }\n },\n _trackCrosshairs: function (coords) {\n var crosshairs = this._plotArea.crosshairs, i, current;\n for (i = 0; i < crosshairs.length; i++) {\n current = crosshairs[i];\n if (current.box.containsPoint(coords)) {\n current.showAt(coords);\n } else {\n current.hide();\n }\n }\n },\n _trackSharedTooltip: function (coords, e) {\n var chart = this, options = chart.options, plotArea = chart._plotArea, categoryAxis = plotArea.categoryAxis, tooltip = chart._tooltip, tooltipOptions = options.tooltip, highlight = chart._highlight, index, points;\n if (plotArea.box.containsPoint(coords)) {\n index = categoryAxis.pointCategoryIndex(coords);\n if (index !== chart._tooltipCategoryIx) {\n points = plotArea.pointsByCategoryIndex(index);\n var pointArgs = $.map(points, function (point) {\n return point.eventArgs(e);\n });\n var hoverArgs = pointArgs[0] || {};\n hoverArgs.categoryPoints = pointArgs;\n if (points.length > 0 && !this.trigger(SERIES_HOVER, hoverArgs)) {\n if (tooltipOptions.visible) {\n tooltip.showAt(points, coords);\n }\n highlight.show(points);\n } else {\n tooltip.hide();\n }\n chart._tooltipCategoryIx = index;\n }\n }\n },\n _mouseleave: function (e) {\n var chart = this, plotArea = chart._plotArea, tooltip = chart._tooltip, highlight = chart._highlight, target = e.relatedTarget;\n if (!(target && $(target).closest(tooltip.element).length)) {\n chart._mousemove.cancel();\n plotArea.hideCrosshairs();\n highlight.hide();\n setTimeout(proxy(tooltip.hide, tooltip), TOOLTIP_HIDE_DELAY);\n chart._tooltipCategoryIx = null;\n }\n },\n _unsetActivePoint: function () {\n var chart = this, tooltip = chart._tooltip, highlight = chart._highlight;\n chart._activePoint = null;\n if (tooltip) {\n tooltip.hide();\n }\n if (highlight) {\n highlight.hide();\n }\n },\n _onDataChanged: function (e) {\n var chart = this, options = chart.options, series = chart._sourceSeries || options.series, seriesIx, seriesLength = series.length, data = chart.dataSource.view(), grouped = (chart.dataSource.group() || []).length > 0, processedSeries = [], currentSeries;\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n if (chart._isBindable(currentSeries) && grouped) {\n append(processedSeries, groupSeries(currentSeries, data));\n this._applyGroupVisibleState(processedSeries, e);\n } else {\n processedSeries.push(currentSeries || []);\n }\n }\n chart._sourceSeries = series;\n options.series = processedSeries;\n applySeriesColors(chart.options);\n chart._bindSeries();\n chart._bindCategories();\n chart._hasData = true;\n chart._deferRedraw();\n },\n _applyGroupVisibleState: function (processedSeries, e) {\n if (e && e.action) {\n var visibleState = this._groupVisibleState = this._groupVisibleState || {};\n for (var idx = 0; idx < processedSeries.length; idx++) {\n if (visibleState[processedSeries[idx]._groupValue] === false) {\n processedSeries[idx].visible = false;\n }\n }\n } else {\n delete this._groupVisibleState;\n }\n },\n _saveGroupVisibleState: function (series) {\n if (defined(series._groupValue)) {\n if (!this._groupVisibleState) {\n this._groupVisibleState = {};\n }\n this._groupVisibleState[series._groupValue] = series.visible;\n }\n },\n _deferRedraw: function () {\n var chart = this;\n if (kendo.support.vml) {\n chart._clearRedrawTimeout();\n chart._redrawTimeout = setTimeout(function () {\n if (!chart.surface) {\n return;\n }\n chart.trigger(DATABOUND);\n chart._redraw();\n }, 0);\n } else {\n chart.trigger(DATABOUND);\n chart._redraw();\n }\n },\n _clearRedrawTimeout: function () {\n if (this._redrawTimeout) {\n clearInterval(this._redrawTimeout);\n this._redrawTimeout = null;\n }\n },\n _bindSeries: function () {\n var chart = this, data = chart.dataSource.view(), series = chart.options.series, seriesIx, seriesLength = series.length, currentSeries, groupIx, seriesData;\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n currentSeries = series[seriesIx];\n if (chart._isBindable(currentSeries)) {\n groupIx = currentSeries._groupIx;\n seriesData = defined(groupIx) ? (data[groupIx] || {}).items : data;\n if (currentSeries.autoBind !== false) {\n currentSeries.data = seriesData;\n }\n }\n }\n },\n _bindCategories: function () {\n var chart = this, data = chart.dataSource.view() || [], grouped = (chart.dataSource.group() || []).length > 0, categoriesData = data, options = chart.options, definitions = [].concat(options.categoryAxis), axisIx, axis;\n if (grouped) {\n if (data.length) {\n categoriesData = data[0].items;\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 _bindCategoryAxis: function (axis, data, axisIx) {\n var count = (data || []).length, categoryIx, category, row;\n if (axis.field) {\n axis.categories = [];\n for (categoryIx = 0; categoryIx < count; categoryIx++) {\n row = data[categoryIx];\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 {\n this._bindCategoryAxisFromSeries(axis, axisIx);\n }\n },\n _bindCategoryAxisFromSeries: function (axis, axisIx) {\n var chart = this, items = [], result, series = chart.options.series, seriesLength = series.length, seriesIx, s, onAxis, data, dataIx, dataLength, dataRow, category, uniqueCategories = {}, getFn, dateAxis;\n for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n s = series[seriesIx];\n onAxis = s.categoryAxis === axis.name || !s.categoryAxis && axisIx === 0;\n data = s.data;\n dataLength = data.length;\n if (s.categoryField && onAxis && dataLength > 0) {\n dateAxis = isDateAxis(axis, getField(s.categoryField, data[0]));\n getFn = dateAxis ? getDateField : getField;\n for (dataIx = 0; dataIx < dataLength; dataIx++) {\n dataRow = data[dataIx];\n category = getFn(s.categoryField, dataRow);\n if (dateAxis || !uniqueCategories[category]) {\n items.push([\n category,\n dataRow\n ]);\n if (!dateAxis) {\n uniqueCategories[category] = true;\n }\n }\n }\n }\n }\n if (items.length > 0) {\n if (dateAxis) {\n items = uniqueDates(items, function (a, b) {\n return dateComparer(a[0], b[0]);\n });\n }\n result = transpose(items);\n axis.categories = result[0];\n axis.dataItems = result[1];\n }\n },\n _isBindable: function (series) {\n var valueFields = SeriesBinder.current.valueFields(series), result = true, field, i;\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 if (!defined(series[field])) {\n result = false;\n break;\n }\n }\n return result;\n },\n _legendItemClick: function (seriesIndex, pointIndex) {\n var chart = this, plotArea = chart._plotArea, currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex], visible, point;\n if (inArray(currentSeries.type, [\n PIE,\n DONUT,\n FUNNEL\n ])) {\n point = currentSeries.data[pointIndex];\n if (!defined(point.visible)) {\n visible = false;\n } else {\n visible = !point.visible;\n }\n point.visible = visible;\n } else {\n currentSeries.visible = !currentSeries.visible;\n this._saveGroupVisibleState(currentSeries);\n }\n this._noTransitionsRedraw();\n },\n _noTransitionsRedraw: function () {\n var options = this.options;\n var transitionsState;\n if (options.transitions) {\n options.transitions = false;\n transitionsState = true;\n }\n this.redraw();\n if (transitionsState) {\n options.transitions = true;\n }\n },\n _legendItemHover: function (seriesIndex, pointIndex) {\n var chart = this, plotArea = chart._plotArea, highlight = chart._highlight, currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex], items;\n if (inArray(currentSeries.type, [\n PIE,\n DONUT,\n FUNNEL\n ])) {\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 highlight.show(items);\n },\n _shouldAttachMouseMove: function () {\n var chart = this;\n var events = chart._events;\n return chart._plotArea.crosshairs.length || chart._tooltip && chart._sharedTooltip() || defined(events[PLOT_AREA_HOVER]);\n },\n setOptions: function (options) {\n var chart = this, dataSource = options.dataSource;\n options.dataSource = undefined;\n clearMissingValues(chart._originalOptions, options);\n chart._originalOptions = deepExtend(chart._originalOptions, options);\n chart.options = deepExtend({}, chart._originalOptions);\n chart._sourceSeries = null;\n $(document).off(MOUSEMOVE_NS);\n Widget.fn._setEvents.call(chart, options);\n chart._initTheme(chart.options);\n if (dataSource) {\n chart.setDataSource(dataSource);\n }\n if (chart._hasDataSource) {\n chart._onDataChanged();\n } else {\n chart._bindCategories();\n chart.redraw();\n }\n if (chart._shouldAttachMouseMove()) {\n chart.element.on(MOUSEMOVE_NS, chart._mousemove);\n }\n },\n destroy: function () {\n var chart = this, dataSource = chart.dataSource;\n chart.element.off(NS);\n if (dataSource) {\n dataSource.unbind(CHANGE, chart._dataChangeHandler);\n }\n $(document).off(MOUSEMOVE_TRACKING);\n if (chart._userEvents) {\n chart._userEvents.destroy();\n }\n chart._destroyView();\n chart.surface.destroy();\n chart.surface = null;\n chart._clearRedrawTimeout();\n Widget.fn.destroy.call(chart);\n },\n _destroyView: function () {\n var chart = this, model = chart._model, selections = chart._selections;\n if (model) {\n model.destroy();\n chart._model = null;\n }\n if (selections) {\n while (selections.length > 0) {\n selections.shift().destroy();\n }\n }\n chart._unsetActivePoint();\n if (chart._tooltip) {\n chart._tooltip.destroy();\n }\n if (chart._highlight) {\n chart._highlight.destroy();\n }\n if (chart._zoomSelection) {\n chart._zoomSelection.destroy();\n delete chart._zoomSelection;\n }\n if (chart._pannable) {\n chart._pannable.destroy();\n delete chart._pannable;\n }\n if (chart._mousewheelZoom) {\n chart._mousewheelZoom.destroy();\n delete chart._mousewheelZoom;\n }\n }\n });\n dataviz.ExportMixin.extend(Chart.fn);\n if (kendo.PDFMixin) {\n kendo.PDFMixin.extend(Chart.fn);\n }\n var PlotAreaFactory = Class.extend({\n init: function () {\n this._registry = [];\n },\n register: function (type, seriesTypes) {\n this._registry.push({\n type: type,\n seriesTypes: seriesTypes\n });\n },\n create: function (srcSeries, options) {\n var registry = this._registry, match = registry[0], i, entry, series;\n for (i = 0; i < registry.length; i++) {\n entry = registry[i];\n series = filterSeriesByType(srcSeries, entry.seriesTypes);\n if (series.length > 0) {\n match = entry;\n break;\n }\n }\n return new match.type(series, options);\n }\n });\n PlotAreaFactory.current = new PlotAreaFactory();\n var SeriesBinder = Class.extend({\n init: function () {\n this._valueFields = {};\n this._otherFields = {};\n this._nullValue = {};\n this._undefinedValue = {};\n },\n register: function (seriesTypes, valueFields, otherFields) {\n var binder = this, i, type;\n valueFields = valueFields || [VALUE];\n for (i = 0; i < seriesTypes.length; i++) {\n type = seriesTypes[i];\n binder._valueFields[type] = valueFields;\n binder._otherFields[type] = otherFields;\n binder._nullValue[type] = binder._makeValue(valueFields, null);\n binder._undefinedValue[type] = binder._makeValue(valueFields, undefined);\n }\n },\n canonicalFields: function (series) {\n return this.valueFields(series).concat(this.otherFields(series));\n },\n valueFields: function (series) {\n return this._valueFields[series.type] || [VALUE];\n },\n otherFields: function (series) {\n return this._otherFields[series.type] || [VALUE];\n },\n bindPoint: function (series, pointIx, item) {\n var binder = this, data = series.data, pointData = defined(item) ? item : data[pointIx], result = { valueFields: { value: pointData } }, fields, fieldData, srcValueFields, srcPointFields, valueFields = binder.valueFields(series), otherFields = binder._otherFields[series.type], value;\n if (pointData === null) {\n value = binder._nullValue[series.type];\n } else if (!defined(pointData)) {\n value = binder._undefinedValue[series.type];\n } else if (isArray(pointData)) {\n fieldData = pointData.slice(valueFields.length);\n value = binder._bindFromArray(pointData, valueFields);\n fields = binder._bindFromArray(fieldData, otherFields);\n } else if (typeof pointData === OBJECT) {\n srcValueFields = binder.sourceFields(series, valueFields);\n srcPointFields = binder.sourceFields(series, otherFields);\n value = binder._bindFromObject(pointData, valueFields, srcValueFields);\n fields = binder._bindFromObject(pointData, otherFields, srcPointFields);\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 result.fields = fields || {};\n return result;\n },\n _makeValue: function (fields, initialValue) {\n var value = {}, i, length = fields.length, fieldName;\n for (i = 0; i < length; i++) {\n fieldName = fields[i];\n value[fieldName] = initialValue;\n }\n return value;\n },\n _bindFromArray: function (array, fields) {\n var value = {}, i, length;\n if (fields) {\n length = math.min(fields.length, array.length);\n for (i = 0; i < length; i++) {\n value[fields[i]] = array[i];\n }\n }\n return value;\n },\n _bindFromObject: function (object, fields, srcFields) {\n var value = {}, i, length, fieldName, srcFieldName;\n if (fields) {\n length = fields.length;\n srcFields = srcFields || fields;\n for (i = 0; i < length; i++) {\n fieldName = fields[i];\n srcFieldName = srcFields[i];\n value[fieldName] = getField(srcFieldName, object);\n }\n }\n return value;\n },\n sourceFields: function (series, canonicalFields) {\n var i, length, fieldName, sourceFields, sourceFieldName;\n if (canonicalFields) {\n length = canonicalFields.length;\n sourceFields = [];\n for (i = 0; i < length; i++) {\n fieldName = canonicalFields[i];\n sourceFieldName = fieldName === VALUE ? 'field' : fieldName + 'Field';\n sourceFields.push(series[sourceFieldName] || fieldName);\n }\n }\n return sourceFields;\n }\n });\n SeriesBinder.current = new SeriesBinder();\n var BarLabel = ChartElement.extend({\n init: function (content, options) {\n var barLabel = this;\n ChartElement.fn.init.call(barLabel, options);\n this.textBox = new TextBox(content, barLabel.options);\n barLabel.append(this.textBox);\n },\n options: {\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 createVisual: function () {\n this.textBox.options.noclip = this.options.noclip;\n },\n reflow: function (targetBox) {\n var barLabel = this, options = barLabel.options, vertical = options.vertical, aboveAxis = options.aboveAxis, text = barLabel.children[0], box = text.box, padding = text.options.padding;\n text.options.align = vertical ? CENTER : LEFT;\n text.options.vAlign = vertical ? TOP : CENTER;\n if (options.position == INSIDE_END) {\n if (vertical) {\n text.options.vAlign = TOP;\n if (!aboveAxis && box.height() < targetBox.height()) {\n text.options.vAlign = BOTTOM;\n }\n } else {\n text.options.align = aboveAxis ? RIGHT : LEFT;\n }\n } else if (options.position == CENTER) {\n text.options.vAlign = CENTER;\n text.options.align = CENTER;\n } else if (options.position == INSIDE_BASE) {\n if (vertical) {\n text.options.vAlign = aboveAxis ? BOTTOM : TOP;\n } else {\n text.options.align = aboveAxis ? LEFT : RIGHT;\n }\n } else if (options.position == OUTSIDE_END) {\n if (vertical) {\n if (aboveAxis) {\n targetBox = new Box2D(targetBox.x1, targetBox.y1 - box.height(), targetBox.x2, targetBox.y1);\n } else {\n targetBox = new Box2D(targetBox.x1, targetBox.y2, targetBox.x2, targetBox.y2 + box.height());\n }\n } else {\n text.options.align = CENTER;\n if (aboveAxis) {\n targetBox = new Box2D(targetBox.x2, targetBox.y1, targetBox.x2 + box.width(), targetBox.y2);\n } else {\n targetBox = new Box2D(targetBox.x1 - box.width(), targetBox.y1, targetBox.x1, targetBox.y2);\n }\n }\n }\n if (!options.rotation) {\n if (vertical) {\n padding.left = padding.right = (targetBox.width() - text.contentBox.width()) / 2;\n } else {\n padding.top = padding.bottom = (targetBox.height() - text.contentBox.height()) / 2;\n }\n }\n text.reflow(targetBox);\n },\n alignToClipBox: function (clipBox) {\n var barLabel = this, vertical = barLabel.options.vertical, field = vertical ? Y : X, start = field + '1', end = field + '2', text = barLabel.children[0], parentBox = barLabel.parent.box, targetBox;\n if (parentBox[start] < clipBox[start] || clipBox[end] < parentBox[end]) {\n targetBox = text.paddingBox.clone();\n targetBox[start] = math.max(parentBox[start], clipBox[start]);\n targetBox[end] = math.min(parentBox[end], clipBox[end]);\n this.reflow(targetBox);\n }\n }\n });\n var LegendItem = BoxElement.extend({\n init: function (options) {\n var item = this;\n BoxElement.fn.init.call(item, options);\n item.createContainer();\n item.createMarker();\n item.createLabel();\n },\n createContainer: function () {\n var item = this;\n item.container = new FloatElement({\n vertical: false,\n wrap: false,\n align: CENTER\n });\n item.append(item.container);\n },\n createMarker: function () {\n this.container.append(new ShapeElement(this.markerOptions()));\n },\n markerOptions: function () {\n var options = this.options;\n var markerColor = options.markerColor;\n return deepExtend({}, options.markers, {\n background: markerColor,\n border: { color: markerColor }\n });\n },\n createLabel: function () {\n var item = this, options = item.options, labelOptions = deepExtend({}, options.labels);\n item.container.append(new TextBox(options.text, labelOptions));\n },\n renderComplete: function () {\n ChartElement.fn.renderComplete.call(this);\n var cursor = this.options.cursor || {};\n var eventSink = this._itemOverlay = draw.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 this.appendVisual(eventSink);\n },\n click: function (widget, e) {\n var args = this.eventArgs(e);\n if (!widget.trigger(LEGEND_ITEM_CLICK, args)) {\n e.preventDefault();\n widget._legendItemClick(args.seriesIndex, args.pointIndex);\n }\n },\n hover: function (widget, e) {\n var args = this.eventArgs(e);\n if (!widget.trigger(LEGEND_ITEM_HOVER, args)) {\n e.preventDefault();\n widget._legendItemHover(args.seriesIndex, args.pointIndex);\n }\n return true;\n },\n leave: function (widget) {\n widget._unsetActivePoint();\n },\n eventArgs: function (e) {\n var options = this.options;\n return {\n element: eventTargetElement(e),\n text: options.text,\n series: options.series,\n seriesIndex: options.series.index,\n pointIndex: options.pointIndex\n };\n },\n renderVisual: function () {\n var that = this;\n var options = that.options;\n var customVisual = options.visual;\n if (customVisual) {\n that.visual = customVisual({\n active: options.active,\n series: options.series,\n pointIndex: options.pointIndex,\n options: {\n markers: that.markerOptions(),\n labels: options.labels\n },\n createVisual: function () {\n that.createVisual();\n that.renderChildren();\n that.renderComplete();\n var defaultVisual = that.visual;\n delete that.visual;\n return defaultVisual;\n }\n });\n this.addVisual();\n } else {\n ChartElement.fn.renderVisual.call(that);\n }\n }\n });\n var LegendLayout = ChartElement.extend({\n render: function () {\n var legendItem, items = this.children;\n var options = this.options;\n var vertical = options.vertical;\n this.visual = new draw.Layout(null, {\n spacing: vertical ? 0 : options.spacing,\n lineSpacing: vertical ? options.spacing : 0,\n orientation: vertical ? 'vertical' : 'horizontal'\n });\n for (var idx = 0; idx < items.length; idx++) {\n legendItem = items[idx];\n legendItem.reflow(new Box2D());\n legendItem.renderVisual();\n }\n },\n reflow: function (box) {\n this.visual.rect(box.toRect());\n this.visual.reflow();\n var bbox = this.visual.clippedBBox();\n if (bbox) {\n this.box = dataviz.rectToBox(bbox);\n } else {\n this.box = new Box2D();\n }\n },\n renderVisual: function () {\n this.addVisual();\n },\n createVisual: noop\n });\n var Legend = ChartElement.extend({\n init: function (options) {\n var legend = this;\n ChartElement.fn.init.call(legend, options);\n if (!inArray(legend.options.position, [\n TOP,\n RIGHT,\n BOTTOM,\n LEFT,\n CUSTOM\n ])) {\n legend.options.position = RIGHT;\n }\n legend.createContainer();\n legend.createItems();\n },\n options: {\n position: RIGHT,\n items: [],\n labels: { margin: { left: 6 } },\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: { cursor: POINTER },\n spacing: 6,\n background: '',\n zIndex: 1,\n markers: {\n border: { width: 1 },\n width: 7,\n height: 7,\n type: 'rect',\n align: LEFT,\n vAlign: CENTER\n }\n },\n createContainer: function () {\n var legend = this, options = legend.options, userAlign = options.align, position = options.position, align = position, vAlign = CENTER;\n if (position == CUSTOM) {\n align = LEFT;\n } else if (inArray(position, [\n TOP,\n BOTTOM\n ])) {\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 legend.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 legend.append(legend.container);\n },\n createItems: function () {\n var legend = this, options = legend.options, items = options.items, count = items.length, vertical = legend.isVertical(), innerElement, i, item;\n innerElement = new LegendLayout({\n vertical: vertical,\n spacing: options.spacing\n });\n if (options.reverse) {\n items = items.slice(0).reverse();\n }\n for (i = 0; i < count; i++) {\n item = items[i];\n innerElement.append(new LegendItem(deepExtend({}, {\n markers: options.markers,\n labels: options.labels\n }, options.item, item)));\n }\n innerElement.render();\n legend.container.append(innerElement);\n },\n isVertical: function () {\n var legend = this, options = legend.options, orientation = options.orientation, position = options.position, vertical = position == CUSTOM && orientation != HORIZONTAL || (defined(orientation) ? orientation != HORIZONTAL : inArray(position, [\n LEFT,\n RIGHT\n ]));\n return vertical;\n },\n hasItems: function () {\n return this.container.children[0].children.length > 0;\n },\n reflow: function (targetBox) {\n var legend = this, options = legend.options;\n targetBox = targetBox.clone();\n if (!legend.hasItems()) {\n legend.box = targetBox;\n return;\n }\n if (options.position === CUSTOM) {\n legend.containerCustomReflow(targetBox);\n legend.box = targetBox;\n } else {\n legend.containerReflow(targetBox);\n }\n },\n containerReflow: function (targetBox) {\n var legend = this, options = legend.options, position = options.position, pos = position == TOP || position == BOTTOM ? X : Y, containerBox = targetBox.clone(), container = legend.container, width = options.width, height = options.height, vertical = legend.isVertical(), alignTarget = targetBox.clone(), box;\n if (position == LEFT || position == RIGHT) {\n containerBox.y1 = alignTarget.y1 = 0;\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 container.reflow(containerBox);\n containerBox = container.box;\n box = containerBox.clone();\n if (options.offsetX || options.offsetY) {\n containerBox.translate(options.offsetX, options.offsetY);\n legend.container.reflow(containerBox);\n }\n box[pos + 1] = targetBox[pos + 1];\n box[pos + 2] = targetBox[pos + 2];\n legend.box = box;\n },\n containerCustomReflow: function (targetBox) {\n var legend = this, options = legend.options, offsetX = options.offsetX, offsetY = options.offsetY, container = legend.container, width = options.width, height = options.height, vertical = legend.isVertical(), containerBox = targetBox.clone();\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 container.reflow(Box2D(offsetX, offsetY, offsetX + containerBox.width(), offsetY + containerBox.height()));\n },\n renderVisual: function () {\n if (this.hasItems()) {\n ChartElement.fn.renderVisual.call(this);\n }\n }\n });\n var CategoryAxis = Axis.extend({\n init: function (options) {\n var axis = this;\n options = options || {};\n this._initFields();\n this._initCategories(options);\n Axis.fn.init.call(axis, options);\n },\n _initFields: function () {\n this._ticks = {};\n this.outOfRangeMin = 0;\n this.outOfRangeMax = 0;\n },\n _initCategories: function (options) {\n var categories = (options.categories || []).slice(0);\n var definedMin = defined(options.min);\n var definedMax = defined(options.max);\n options.categories = categories;\n if ((definedMin || definedMax) && categories.length) {\n options.srcCategories = options.categories;\n var min = definedMin ? math.floor(options.min) : 0;\n var max = definedMax ? options.justified ? math.floor(options.max) + 1 : math.ceil(options.max) : categories.length;\n options.categories = options.categories.slice(min, max);\n }\n },\n options: {\n type: CATEGORY,\n categories: [],\n vertical: false,\n majorGridLines: {\n visible: false,\n width: 1,\n color: BLACK\n },\n labels: { zIndex: 1 },\n justified: false\n },\n rangeIndices: function () {\n var options = this.options;\n var length = options.categories.length || 1;\n var min = isNumber(options.min) ? options.min % 1 : 0;\n var max;\n if (isNumber(options.max) && options.max % 1 !== 0 && options.max < this.totalRange().max) {\n max = length - (1 - options.max % 1);\n } else {\n max = length - (options.justified ? 1 : 0);\n }\n return {\n min: min,\n max: max\n };\n },\n totalRangeIndices: function (limit) {\n var options = this.options;\n var min = isNumber(options.min) ? options.min : 0;\n var max;\n if (isNumber(options.max)) {\n max = options.max;\n } else if (isNumber(options.min)) {\n max = min + options.categories.length;\n } else {\n max = (options.srcCategories || options.categories).length - (options.justified ? 1 : 0) || 1;\n }\n if (limit) {\n var totalRange = this.totalRange();\n min = limitValue(min, 0, totalRange.max);\n max = limitValue(max, 0, totalRange.max);\n }\n return {\n min: min,\n max: max\n };\n },\n range: function () {\n var options = this.options;\n return {\n min: isNumber(options.min) ? options.min : 0,\n max: isNumber(options.max) ? options.max : options.categories.length\n };\n },\n totalRange: function () {\n var options = this.options;\n return {\n min: 0,\n max: math.max(this._seriesMax || 0, (options.srcCategories || options.categories).length) - (options.justified ? 1 : 0)\n };\n },\n getScale: function () {\n var range = this.rangeIndices();\n var min = range.min;\n var max = range.max;\n var lineBox = this.lineBox();\n var size = this.options.vertical ? lineBox.height() : lineBox.width();\n var scale = size / (max - min || 1);\n return scale * (this.options.reverse ? -1 : 1);\n },\n getTickPositions: function (stepSize) {\n var axis = this, options = axis.options, vertical = options.vertical, lineBox = axis.lineBox(), reverse = options.reverse, scale = axis.getScale(), range = axis.rangeIndices(), min = range.min, max = range.max, current = min % 1 !== 0 ? math.floor(min / 1) + stepSize : min, pos = lineBox[(vertical ? Y : X) + (reverse ? 2 : 1)], positions = [];\n while (current <= max) {\n positions.push(pos + round(scale * (current - min), COORD_PRECISION));\n current += stepSize;\n }\n return positions;\n },\n getLabelsTickPositions: function () {\n var tickPositions = this.getMajorTickPositions().slice(0);\n var range = this.rangeIndices();\n var scale = this.getScale();\n var box = this.lineBox();\n var options = this.options;\n var axis = options.vertical ? Y : X;\n var start = options.reverse ? 2 : 1;\n var end = options.reverse ? 1 : 2;\n if (range.min % 1 !== 0) {\n tickPositions.unshift(box[axis + start] - scale * (range.min % 1));\n }\n if (range.max % 1 !== 0) {\n tickPositions.push(box[axis + end] + scale * (1 - range.max % 1));\n }\n return tickPositions;\n },\n labelTickIndex: function (label) {\n var index = label.index;\n var range = this.rangeIndices();\n if (range.min > 0) {\n index = index - math.floor(range.min);\n }\n return index;\n },\n arrangeLabels: function () {\n Axis.fn.arrangeLabels.call(this);\n this.hideOutOfRangeLabels();\n },\n hideOutOfRangeLabels: function () {\n var box = this.box, labels = this.labels, valueAxis = this.options.vertical ? Y : X, start = box[valueAxis + 1], end = box[valueAxis + 2], firstLabel = labels[0], lastLabel = last(labels);\n if (labels.length) {\n if (firstLabel.box[valueAxis + 1] > end || firstLabel.box[valueAxis + 2] < start) {\n firstLabel.options.visible = false;\n }\n if (lastLabel.box[valueAxis + 1] > end || lastLabel.box[valueAxis + 2] < start) {\n lastLabel.options.visible = false;\n }\n }\n },\n getMajorTickPositions: function () {\n return this.getTicks().majorTicks;\n },\n getMinorTickPositions: function () {\n return this.getTicks().minorTicks;\n },\n getTicks: function () {\n var axis = this, cache = axis._ticks, options = axis.options, range = axis.rangeIndices(), reverse = options.reverse, justified = options.justified, lineBox = axis.lineBox(), hash;\n hash = lineBox.getHash() + range.min + ',' + range.max + reverse + justified;\n if (cache._hash !== hash) {\n cache._hash = hash;\n cache.majorTicks = axis.getTickPositions(1);\n cache.minorTicks = axis.getTickPositions(0.5);\n }\n return cache;\n },\n getSlot: function (from, to, limit) {\n var axis = this, options = axis.options, reverse = options.reverse, justified = options.justified, valueAxis = options.vertical ? Y : X, lineBox = axis.lineBox(), range = axis.rangeIndices(), min = range.min, scale = this.getScale(), lineStart = lineBox[valueAxis + (reverse ? 2 : 1)], slotBox = lineBox.clone(), p1, p2;\n var singleSlot = !defined(to);\n from = valueOrDefault(from, 0);\n to = valueOrDefault(to, from);\n to = math.max(to - 1, from);\n to = math.max(from, to);\n p1 = lineStart + (from - min) * scale;\n p2 = lineStart + (to + 1 - min) * scale;\n if (singleSlot && justified) {\n p2 = p1;\n }\n if (limit) {\n p1 = limitValue(p1, lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n p2 = limitValue(p2, lineBox[valueAxis + 1], lineBox[valueAxis + 2]);\n }\n slotBox[valueAxis + 1] = reverse ? p2 : p1;\n slotBox[valueAxis + 2] = reverse ? p1 : p2;\n return slotBox;\n },\n slot: function (from, to, limit) {\n if (typeof from === 'string') {\n from = this.categoryIndex(from);\n }\n if (typeof to === 'string') {\n to = this.categoryIndex(to);\n }\n return Axis.fn.slot.call(this, from, to, limit);\n },\n pointCategoryIndex: function (point) {\n var axis = this, options = axis.options, reverse = options.reverse, justified = options.justified, valueAxis = options.vertical ? Y : X, lineBox = axis.lineBox(), range = axis.rangeIndices(), startValue = reverse ? range.max : range.min, scale = this.getScale(), lineStart = lineBox[valueAxis + 1], lineEnd = lineBox[valueAxis + 2], pos = point[valueAxis];\n if (pos < lineStart || pos > lineEnd) {\n return null;\n }\n var size = pos - lineStart;\n var value = size / scale;\n value = startValue + value;\n var diff = value % 1;\n if (justified) {\n value = math.round(value);\n } else if (diff === 0 && value > 0) {\n value--;\n }\n return math.floor(value);\n },\n getCategory: function (point) {\n var index = this.pointCategoryIndex(point);\n if (index === null) {\n return null;\n }\n return this.options.categories[index];\n },\n categoryIndex: function (value) {\n var options = this.options;\n var index = indexOf(value, options.srcCategories || options.categories);\n return index - math.floor(options.min || 0);\n },\n translateRange: function (delta) {\n var axis = this, options = axis.options, lineBox = axis.lineBox(), size = options.vertical ? lineBox.height() : lineBox.width(), range = options.categories.length, scale = size / range, offset = round(delta / scale, DEFAULT_PRECISION);\n return {\n min: offset,\n max: range + offset\n };\n },\n zoomRange: function (rate) {\n var rangeIndices = this.totalRangeIndices();\n var totalRange = this.totalRange();\n var totalMax = totalRange.max;\n var totalMin = totalRange.min;\n var min = limitValue(rangeIndices.min + rate, totalMin, totalMax);\n var max = limitValue(rangeIndices.max - rate, totalMin, totalMax);\n if (max - min > 0) {\n return {\n min: min,\n max: max\n };\n }\n },\n scaleRange: function (scale) {\n var axis = this, options = axis.options, range = options.categories.length, delta = scale * range;\n return {\n min: -delta,\n max: range + delta\n };\n },\n labelsCount: function () {\n var labelsRange = this.labelsRange();\n return labelsRange.max - labelsRange.min;\n },\n labelsRange: function () {\n var options = this.options;\n var labelOptions = options.labels;\n var justified = options.justified;\n var range = this.totalRangeIndices(true);\n var min = range.min;\n var max = range.max;\n var start = math.floor(min);\n var skip;\n if (!justified) {\n min = math.floor(min);\n max = math.ceil(max);\n } else {\n min = math.ceil(min);\n max = math.floor(max);\n }\n if (min > labelOptions.skip) {\n skip = labelOptions.skip + labelOptions.step * math.ceil((min - labelOptions.skip) / labelOptions.step);\n } else {\n skip = labelOptions.skip;\n }\n return {\n min: skip - start,\n max: (options.categories.length ? max + (justified ? 1 : 0) : 0) - start\n };\n },\n createAxisLabel: function (index, labelOptions) {\n var axis = this, options = axis.options, dataItem = options.dataItems ? options.dataItems[index] : null, category = valueOrDefault(options.categories[index], ''), text = axis.axisLabelText(category, dataItem, labelOptions);\n return new AxisLabel(category, text, index, dataItem, labelOptions);\n },\n shouldRenderNote: function (value) {\n var categories = this.options.categories;\n return categories.length && (categories.length > value && value >= 0);\n },\n pan: function (delta) {\n var range = this.totalRangeIndices(true), scale = this.getScale(), offset = round(delta / scale, DEFAULT_PRECISION), totalRange = this.totalRange(), min = range.min + offset, max = range.max + offset;\n return this.limitRange(min, max, 0, totalRange.max, offset);\n },\n pointsRange: function (start, end) {\n var axis = this, options = axis.options, reverse = options.reverse, valueAxis = options.vertical ? Y : X, lineBox = axis.lineBox(), range = axis.totalRangeIndices(true), scale = this.getScale(), lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n var diffStart = start[valueAxis] - lineStart;\n var diffEnd = end[valueAxis] - lineStart;\n var min = range.min + diffStart / scale;\n var max = range.min + diffEnd / scale;\n var rangeMin = math.min(min, max);\n var rangeMax = math.max(min, max);\n if (rangeMax - rangeMin >= MIN_CATEGORY_POINTS_RANGE) {\n return {\n min: rangeMin,\n max: rangeMax\n };\n }\n },\n valueRange: function () {\n return this.range();\n }\n });\n var DateCategoryAxis = CategoryAxis.extend({\n init: function (options) {\n var axis = this, baseUnit, useDefault;\n options = options || {};\n options = deepExtend({ roundToBaseUnit: true }, options, {\n categories: toDate(options.categories),\n min: toDate(options.min),\n max: toDate(options.max)\n });\n options.userSetBaseUnit = options.userSetBaseUnit || options.baseUnit;\n options.userSetBaseUnitStep = options.userSetBaseUnitStep || options.baseUnitStep;\n if (options.categories && options.categories.length > 0) {\n baseUnit = (options.baseUnit || '').toLowerCase();\n useDefault = baseUnit !== FIT && !inArray(baseUnit, BASE_UNITS);\n if (useDefault) {\n options.baseUnit = axis.defaultBaseUnit(options);\n }\n if (baseUnit === FIT || options.baseUnitStep === AUTO) {\n axis.autoBaseUnit(options);\n }\n this._groupsStart = addDuration(options.categories[0], 0, options.baseUnit, options.weekStartDay);\n axis.groupCategories(options);\n } else {\n options.baseUnit = options.baseUnit || DAYS;\n }\n this._initFields();\n Axis.fn.init.call(axis, options);\n },\n options: {\n type: DATE,\n labels: { dateFormats: DateLabelFormats },\n autoBaseUnitSteps: {\n milliseconds: [\n 1,\n 10,\n 100\n ],\n seconds: [\n 1,\n 2,\n 5,\n 15,\n 30\n ],\n minutes: [\n 1,\n 2,\n 5,\n 15,\n 30\n ],\n hours: [\n 1,\n 2,\n 3\n ],\n days: [\n 1,\n 2,\n 3\n ],\n weeks: [\n 1,\n 2\n ],\n months: [\n 1,\n 2,\n 3,\n 6\n ],\n years: [\n 1,\n 2,\n 3,\n 5,\n 10,\n 25,\n 50\n ]\n },\n maxDateGroups: 10\n },\n shouldRenderNote: function (value) {\n var axis = this, range = axis.range(), categories = axis.options.categories || [];\n return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0 && categories.length;\n },\n parseNoteValue: function (value) {\n return toDate(value);\n },\n translateRange: function (delta) {\n var axis = this, options = axis.options, baseUnit = options.baseUnit, weekStartDay = options.weekStartDay, lineBox = axis.lineBox(), size = options.vertical ? lineBox.height() : lineBox.width(), range = axis.range(), scale = size / (range.max - range.min), offset = round(delta / scale, DEFAULT_PRECISION), from, to;\n if (range.min && range.max) {\n from = addTicks(options.min || range.min, offset);\n to = addTicks(options.max || range.max, offset);\n range = {\n min: addDuration(from, 0, baseUnit, weekStartDay),\n max: addDuration(to, 0, baseUnit, weekStartDay)\n };\n }\n return range;\n },\n scaleRange: function (delta) {\n var axis = this, rounds = math.abs(delta), range = axis.range(), from = range.min, to = range.max, step;\n if (range.min && range.max) {\n while (rounds--) {\n range = dateDiff(from, to);\n step = math.round(range * 0.1);\n if (delta < 0) {\n from = addTicks(from, step);\n to = addTicks(to, -step);\n } else {\n from = addTicks(from, -step);\n to = addTicks(to, step);\n }\n }\n range = {\n min: from,\n max: to\n };\n }\n return range;\n },\n defaultBaseUnit: function (options) {\n var categories = options.categories, count = defined(categories) ? categories.length : 0, categoryIx, cat, diff, minDiff = MAX_VALUE, lastCat, unit;\n for (categoryIx = 0; categoryIx < count; categoryIx++) {\n cat = categories[categoryIx];\n if (cat && lastCat) {\n diff = absoluteDateDiff(cat, lastCat);\n if (diff > 0) {\n minDiff = math.min(minDiff, diff);\n if (minDiff >= TIME_PER_YEAR) {\n unit = YEARS;\n } else if (minDiff >= TIME_PER_MONTH - TIME_PER_DAY * 3) {\n unit = MONTHS;\n } else if (minDiff >= TIME_PER_WEEK) {\n unit = WEEKS;\n } else if (minDiff >= TIME_PER_DAY) {\n unit = DAYS;\n } else if (minDiff >= TIME_PER_HOUR) {\n unit = HOURS;\n } else if (minDiff >= TIME_PER_MINUTE) {\n unit = MINUTES;\n } else {\n unit = SECONDS;\n }\n }\n }\n lastCat = cat;\n }\n return unit || DAYS;\n },\n _categoryRange: function (categories) {\n var range = categories._range;\n if (!range) {\n range = categories._range = sparseArrayLimits(categories);\n }\n return range;\n },\n totalRange: function () {\n return {\n min: 0,\n max: this.options.categories.length\n };\n },\n rangeIndices: function () {\n var options = this.options;\n var baseUnit = options.baseUnit;\n var baseUnitStep = options.baseUnitStep || 1;\n var categories = options.categories;\n var categoryLimits = this.categoriesRange();\n var min = toDate(options.min || categoryLimits.min);\n var max = toDate(options.max || categoryLimits.max);\n var minIdx = 0, maxIdx = 0;\n if (categories.length) {\n minIdx = dateIndex(min, categories[0], baseUnit, baseUnitStep);\n maxIdx = dateIndex(max, categories[0], baseUnit, baseUnitStep);\n if (options.roundToBaseUnit) {\n minIdx = math.floor(minIdx);\n maxIdx = options.justified ? math.floor(maxIdx) : math.ceil(maxIdx);\n }\n }\n return {\n min: minIdx,\n max: maxIdx\n };\n },\n labelsRange: function () {\n var options = this.options;\n var labelOptions = options.labels;\n var range = this.rangeIndices();\n var min = math.floor(range.min);\n var max = math.ceil(range.max);\n return {\n min: min + labelOptions.skip,\n max: options.categories.length ? max + (options.justified ? 1 : 0) : 0\n };\n },\n categoriesRange: function () {\n var options = this.options;\n var range = this._categoryRange(options.srcCategories || options.categories);\n var max = toDate(range.max);\n if (!options.justified && dateEquals(max, this._roundToTotalStep(max, options, false))) {\n max = this._roundToTotalStep(max, options, true, true);\n }\n return {\n min: toDate(range.min),\n max: max\n };\n },\n currentRange: function () {\n var options = this.options;\n var round = options.roundToBaseUnit !== false;\n var totalRange = this.categoriesRange();\n var min = options.min;\n var max = options.max;\n if (!min) {\n min = round ? this._roundToTotalStep(totalRange.min, options, false) : totalRange.min;\n }\n if (!max) {\n max = round ? this._roundToTotalStep(totalRange.max, options, !options.justified) : totalRange.max;\n }\n return {\n min: min,\n max: max\n };\n },\n datesRange: function () {\n var range = this._categoryRange(this.options.srcCategories || this.options.categories);\n return {\n min: toDate(range.min),\n max: toDate(range.max)\n };\n },\n pan: function (delta) {\n var axis = this, options = axis.options, baseUnit = options.baseUnit, lineBox = axis.lineBox(), size = options.vertical ? lineBox.height() : lineBox.width(), range = this.currentRange(), totalLimits = this.totalLimits(), min = range.min, max = range.max, scale = size / (max - min), offset = round(delta / scale, DEFAULT_PRECISION), panRange, from, to;\n from = addTicks(min, offset);\n to = addTicks(max, offset);\n panRange = this.limitRange(toTime(from), toTime(to), toTime(totalLimits.min), toTime(totalLimits.max), offset);\n if (panRange) {\n panRange.min = toDate(panRange.min);\n panRange.max = toDate(panRange.max);\n panRange.baseUnit = baseUnit;\n panRange.baseUnitStep = options.baseUnitStep || 1;\n panRange.userSetBaseUnit = options.userSetBaseUnit;\n panRange.userSetBaseUnitStep = options.userSetBaseUnitStep;\n return panRange;\n }\n },\n pointsRange: function (start, end) {\n var pointsRange = CategoryAxis.fn.pointsRange.call(this, start, end);\n var datesRange = this.currentRange();\n var indicesRange = this.rangeIndices();\n var scale = dateDiff(datesRange.max, datesRange.min) / (indicesRange.max - indicesRange.min);\n var options = this.options;\n var min = addTicks(datesRange.min, pointsRange.min * scale);\n var max = addTicks(datesRange.min, pointsRange.max * scale);\n return {\n min: min,\n max: max,\n baseUnit: options.userSetBaseUnit,\n baseUnitStep: options.userSetBaseUnitStep\n };\n },\n zoomRange: function (delta) {\n var options = this.options;\n var totalLimits = this.totalLimits();\n var currentRange = this.currentRange();\n var baseUnit = options.baseUnit;\n var baseUnitStep = options.baseUnitStep || 1;\n var weekStartDay = options.weekStartDay;\n var rangeMax = currentRange.max;\n var rangeMin = currentRange.min;\n var min = addDuration(rangeMin, delta * baseUnitStep, baseUnit, weekStartDay);\n var max = addDuration(rangeMax, -delta * baseUnitStep, baseUnit, weekStartDay);\n if (options.userSetBaseUnit == FIT) {\n var autoBaseUnitSteps = options.autoBaseUnitSteps;\n var maxDateGroups = options.maxDateGroups;\n var baseUnitIndex = indexOf(baseUnit, BASE_UNITS);\n var autoBaseUnitStep;\n var diff = dateDiff(max, min);\n var maxDiff = last(autoBaseUnitSteps[baseUnit]) * maxDateGroups * TIME_PER_UNIT[baseUnit];\n var rangeDiff = dateDiff(rangeMax, rangeMin);\n var ticks;\n if (diff < TIME_PER_UNIT[baseUnit] && baseUnit !== MILLISECONDS) {\n baseUnit = BASE_UNITS[baseUnitIndex - 1];\n autoBaseUnitStep = last(autoBaseUnitSteps[baseUnit]);\n ticks = (rangeDiff - (maxDateGroups - 1) * autoBaseUnitStep * TIME_PER_UNIT[baseUnit]) / 2;\n min = addTicks(rangeMin, ticks);\n max = addTicks(rangeMax, -ticks);\n } else if (diff > maxDiff && baseUnit !== YEARS) {\n var stepIndex = 0;\n do {\n baseUnitIndex++;\n baseUnit = BASE_UNITS[baseUnitIndex];\n stepIndex = 0;\n ticks = 2 * TIME_PER_UNIT[baseUnit];\n do {\n autoBaseUnitStep = autoBaseUnitSteps[baseUnit][stepIndex];\n stepIndex++;\n } while (stepIndex < autoBaseUnitSteps[baseUnit].length && ticks * autoBaseUnitStep < rangeDiff);\n } while (baseUnit !== YEARS && ticks * autoBaseUnitStep < rangeDiff);\n ticks = (ticks * autoBaseUnitStep - rangeDiff) / 2;\n if (ticks > 0) {\n min = addTicks(rangeMin, -ticks);\n max = addTicks(rangeMax, ticks);\n min = addTicks(min, limitValue(max, totalLimits.min, totalLimits.max) - max);\n max = addTicks(max, limitValue(min, totalLimits.min, totalLimits.max) - min);\n }\n }\n }\n min = toDate(limitValue(min, totalLimits.min, totalLimits.max));\n max = toDate(limitValue(max, totalLimits.min, totalLimits.max));\n if (min && max && dateDiff(max, min) > 0) {\n return {\n min: min,\n max: max,\n baseUnit: options.userSetBaseUnit,\n baseUnitStep: options.userSetBaseUnitStep\n };\n }\n },\n totalLimits: function () {\n var options = this.options;\n var datesRange = this.datesRange();\n var min = this._roundToTotalStep(toDate(datesRange.min), options, false);\n var max = datesRange.max;\n if (!options.justified) {\n max = this._roundToTotalStep(max, options, true, dateEquals(max, this._roundToTotalStep(max, options, false)));\n }\n return {\n min: min,\n max: max\n };\n },\n range: function (options) {\n options = options || this.options;\n var categories = options.categories, autoUnit = options.baseUnit === FIT, baseUnit = autoUnit ? BASE_UNITS[0] : options.baseUnit, baseUnitStep = options.baseUnitStep || 1, stepOptions = {\n baseUnit: baseUnit,\n baseUnitStep: baseUnitStep,\n weekStartDay: options.weekStartDay\n }, categoryLimits = this._categoryRange(categories), min = toDate(options.min || categoryLimits.min), max = toDate(options.max || categoryLimits.max);\n return {\n min: this._roundToTotalStep(min, stepOptions, false),\n max: this._roundToTotalStep(max, stepOptions, true, true)\n };\n },\n autoBaseUnit: function (options) {\n var axis = this, categoryLimits = this._categoryRange(options.categories), min = toDate(options.min || categoryLimits.min), max = toDate(options.max || categoryLimits.max), autoUnit = options.baseUnit === FIT, autoUnitIx = 0, baseUnit = autoUnit ? BASE_UNITS[autoUnitIx++] : options.baseUnit, span = max - min, units = span / TIME_PER_UNIT[baseUnit], totalUnits = units, maxDateGroups = options.maxDateGroups || axis.options.maxDateGroups, autoBaseUnitSteps = deepExtend({}, axis.options.autoBaseUnitSteps, options.autoBaseUnitSteps), unitSteps, step, nextStep;\n while (!step || units >= maxDateGroups) {\n unitSteps = unitSteps || autoBaseUnitSteps[baseUnit].slice(0);\n nextStep = unitSteps.shift();\n if (nextStep) {\n step = nextStep;\n units = totalUnits / step;\n } else if (baseUnit === last(BASE_UNITS)) {\n step = math.ceil(totalUnits / maxDateGroups);\n break;\n } else if (autoUnit) {\n baseUnit = BASE_UNITS[autoUnitIx++] || last(BASE_UNITS);\n totalUnits = span / TIME_PER_UNIT[baseUnit];\n unitSteps = null;\n } else {\n if (units > maxDateGroups) {\n step = math.ceil(totalUnits / maxDateGroups);\n }\n break;\n }\n }\n options.baseUnitStep = step;\n options.baseUnit = baseUnit;\n },\n _timeScale: function () {\n var axis = this, range = axis.range(), options = axis.options, lineBox = axis.lineBox(), vertical = options.vertical, lineSize = vertical ? lineBox.height() : lineBox.width(), timeRange;\n if (options.justified && options._collapse !== false) {\n var categoryLimits = this._categoryRange(options.categories);\n var maxCategory = toTime(categoryLimits.max);\n timeRange = toDate(maxCategory) - range.min;\n } else {\n timeRange = range.max - range.min;\n }\n return lineSize / timeRange;\n },\n groupCategories: function (options) {\n var axis = this, categories = options.categories, maxCategory = toDate(sparseArrayMax(categories)), baseUnit = options.baseUnit, baseUnitStep = options.baseUnitStep || 1, range = axis.range(options), max = range.max, date, nextDate, groups = [];\n for (date = range.min; date < max; date = nextDate) {\n groups.push(date);\n nextDate = addDuration(date, baseUnitStep, baseUnit, options.weekStartDay);\n if (nextDate > maxCategory && !options.max) {\n break;\n }\n }\n options.srcCategories = categories;\n options.categories = groups;\n },\n _roundToTotalStep: function (value, options, upper, roundToNext) {\n options = options || this.options;\n var baseUnit = options.baseUnit;\n var baseUnitStep = options.baseUnitStep || 1;\n var start = this._groupsStart;\n if (start) {\n var step = dateIndex(value, start, baseUnit, baseUnitStep);\n var roundedStep = upper ? math.ceil(step) : math.floor(step);\n if (roundToNext) {\n roundedStep++;\n }\n return addDuration(start, roundedStep * baseUnitStep, baseUnit, options.weekStartDay);\n } else {\n return addDuration(value, upper ? baseUnitStep : 0, baseUnit, options.weekStartDay);\n }\n },\n createAxisLabel: function (index, labelOptions) {\n var options = this.options, dataItem = options.dataItems ? options.dataItems[index] : null, date = options.categories[index], baseUnit = options.baseUnit, visible = true, unitFormat = labelOptions.dateFormats[baseUnit];\n if (options.justified) {\n var roundedDate = floorDate(date, baseUnit, options.weekStartDay);\n visible = dateEquals(roundedDate, date);\n } else if (!options.roundToBaseUnit) {\n visible = !dateEquals(this.range().max, date);\n }\n if (visible) {\n labelOptions.format = labelOptions.format || unitFormat;\n var text = this.axisLabelText(date, dataItem, labelOptions);\n if (text) {\n return new AxisLabel(date, text, index, dataItem, labelOptions);\n }\n }\n },\n categoryIndex: function (value) {\n var axis = this;\n var options = axis.options;\n var categories = options.categories;\n var index = -1;\n if (categories.length) {\n index = math.floor(dateIndex(toDate(value), categories[0], options.baseUnit, options.baseUnitStep || 1));\n }\n return index;\n },\n getSlot: function (a, b, limit) {\n var axis = this;\n if (typeof a === OBJECT) {\n a = axis.categoryIndex(a);\n }\n if (typeof b === OBJECT) {\n b = axis.categoryIndex(b);\n }\n return CategoryAxis.fn.getSlot.call(axis, a, b, limit);\n },\n valueRange: function () {\n var options = this.options;\n var range = this._categoryRange(options.srcCategories || options.categories);\n return {\n min: toDate(range.min),\n max: toDate(range.max)\n };\n }\n });\n var DateValueAxis = Axis.extend({\n init: function (seriesMin, seriesMax, options) {\n var axis = this;\n options = options || {};\n deepExtend(options, {\n min: toDate(options.min),\n max: toDate(options.max),\n axisCrossingValue: toDate(options.axisCrossingValues || options.axisCrossingValue)\n });\n this.seriesMin = toDate(seriesMin);\n this.seriesMax = toDate(seriesMax);\n options = axis.applyDefaults(this.seriesMin, this.seriesMax, options);\n Axis.fn.init.call(axis, options);\n },\n options: {\n type: DATE,\n majorGridLines: {\n visible: true,\n width: 1,\n color: BLACK\n },\n labels: { dateFormats: DateLabelFormats }\n },\n applyDefaults: function (seriesMin, seriesMax, options) {\n var axis = this, min = options.min || seriesMin, max = options.max || seriesMax, baseUnit = options.baseUnit || (max && min ? axis.timeUnits(absoluteDateDiff(max, min)) : HOURS), baseUnitTime = TIME_PER_UNIT[baseUnit], autoMin = floorDate(toTime(min) - 1, baseUnit) || toDate(max), autoMax = ceilDate(toTime(max) + 1, baseUnit), userMajorUnit = options.majorUnit ? options.majorUnit : undefined, majorUnit = userMajorUnit || dataviz.ceil(dataviz.autoMajorUnit(autoMin.getTime(), autoMax.getTime()), baseUnitTime) / baseUnitTime, actualUnits = duration(autoMin, autoMax, baseUnit), totalUnits = dataviz.ceil(actualUnits, majorUnit), unitsToAdd = totalUnits - actualUnits, head = math.floor(unitsToAdd / 2), tail = unitsToAdd - head;\n if (!options.baseUnit) {\n delete options.baseUnit;\n }\n options.baseUnit = options.baseUnit || baseUnit;\n options.min = options.min || addDuration(autoMin, -head, baseUnit);\n options.max = options.max || addDuration(autoMax, tail, baseUnit);\n options.minorUnit = options.minorUnit || majorUnit / 5;\n options.majorUnit = majorUnit;\n this.totalMin = toTime(floorDate(toTime(seriesMin) - 1, baseUnit));\n this.totalMax = toTime(ceilDate(toTime(seriesMax) + 1, baseUnit));\n return options;\n },\n range: function () {\n var options = this.options;\n return {\n min: options.min,\n max: options.max\n };\n },\n getDivisions: function (stepValue) {\n var options = this.options;\n return math.floor(duration(options.min, options.max, options.baseUnit) / stepValue + 1);\n },\n getTickPositions: function (step) {\n var options = this.options;\n var vertical = options.vertical;\n var reverse = options.reverse;\n var lineBox = this.lineBox();\n var dir = (vertical ? -1 : 1) * (reverse ? -1 : 1);\n var startEdge = dir === 1 ? 1 : 2;\n var start = lineBox[(vertical ? Y : X) + startEdge];\n var divisions = this.getDivisions(step);\n var timeRange = dateDiff(options.max, options.min);\n var lineSize = vertical ? lineBox.height() : lineBox.width();\n var scale = lineSize / timeRange;\n var positions = [start];\n for (var i = 1; i < divisions; i++) {\n var date = addDuration(options.min, i * step, options.baseUnit);\n var pos = start + dateDiff(date, options.min) * scale * dir;\n positions.push(round(pos, COORD_PRECISION));\n }\n return positions;\n },\n getMajorTickPositions: function () {\n var axis = this;\n return axis.getTickPositions(axis.options.majorUnit);\n },\n getMinorTickPositions: function () {\n var axis = this;\n return axis.getTickPositions(axis.options.minorUnit);\n },\n getSlot: function (a, b, limit) {\n return NumericAxis.fn.getSlot.call(this, toDate(a), toDate(b), limit);\n },\n getValue: function (point) {\n var value = NumericAxis.fn.getValue.call(this, point);\n return value !== null ? toDate(value) : null;\n },\n labelsCount: function () {\n return this.getDivisions(this.options.majorUnit);\n },\n createAxisLabel: function (index, labelOptions) {\n var options = this.options;\n var offset = index * options.majorUnit;\n var date = options.min;\n if (offset > 0) {\n date = addDuration(date, offset, options.baseUnit);\n }\n var unitFormat = labelOptions.dateFormats[options.baseUnit];\n labelOptions.format = labelOptions.format || unitFormat;\n var text = this.axisLabelText(date, null, labelOptions);\n return new AxisLabel(date, text, index, null, labelOptions);\n },\n timeUnits: function (delta) {\n var unit = HOURS;\n if (delta >= TIME_PER_YEAR) {\n unit = YEARS;\n } else if (delta >= TIME_PER_MONTH) {\n unit = MONTHS;\n } else if (delta >= TIME_PER_WEEK) {\n unit = WEEKS;\n } else if (delta >= TIME_PER_DAY) {\n unit = DAYS;\n }\n return unit;\n },\n translateRange: function (delta, exact) {\n var axis = this, options = axis.options, baseUnit = options.baseUnit, weekStartDay = options.weekStartDay, lineBox = axis.lineBox(), size = options.vertical ? lineBox.height() : lineBox.width(), range = axis.range(), scale = size / dateDiff(range.max, range.min), offset = round(delta / scale, DEFAULT_PRECISION), from = addTicks(options.min, offset), to = addTicks(options.max, offset);\n if (!exact) {\n from = addDuration(from, 0, baseUnit, weekStartDay);\n to = addDuration(to, 0, baseUnit, weekStartDay);\n }\n return {\n min: from,\n max: to\n };\n },\n scaleRange: function (delta) {\n var axis = this, options = axis.options, rounds = math.abs(delta), from = options.min, to = options.max, range, step;\n while (rounds--) {\n range = dateDiff(from, to);\n step = math.round(range * 0.1);\n if (delta < 0) {\n from = addTicks(from, step);\n to = addTicks(to, -step);\n } else {\n from = addTicks(from, -step);\n to = addTicks(to, step);\n }\n }\n return {\n min: from,\n max: to\n };\n },\n shouldRenderNote: function (value) {\n var range = this.range();\n return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0;\n },\n pan: function (delta) {\n var range = this.translateRange(delta, true);\n var limittedRange = this.limitRange(toTime(range.min), toTime(range.max), this.totalMin, this.totalMax);\n if (limittedRange) {\n return {\n min: toDate(limittedRange.min),\n max: toDate(limittedRange.max)\n };\n }\n },\n pointsRange: function (start, end) {\n var startValue = this.getValue(start);\n var endValue = this.getValue(end);\n var min = math.min(startValue, endValue);\n var max = math.max(startValue, endValue);\n return {\n min: toDate(min),\n max: toDate(max)\n };\n },\n zoomRange: function (delta) {\n var range = this.scaleRange(delta);\n var min = toDate(limitValue(toTime(range.min), this.totalMin, this.totalMax));\n var max = toDate(limitValue(toTime(range.max), this.totalMin, this.totalMax));\n return {\n min: min,\n max: max\n };\n }\n });\n var ClusterLayout = ChartElement.extend({\n options: {\n vertical: false,\n gap: 0,\n spacing: 0\n },\n reflow: function (box) {\n var cluster = this, options = cluster.options, vertical = options.vertical, axis = vertical ? Y : X, children = cluster.children, gap = options.gap, spacing = options.spacing, count = children.length, slots = count + gap + spacing * (count - 1), slotSize = (vertical ? box.height() : box.width()) / slots, position = box[axis + 1] + slotSize * (gap / 2), childBox, i;\n for (i = 0; i < count; i++) {\n childBox = (children[i].box || box).clone();\n childBox[axis + 1] = position;\n childBox[axis + 2] = position + slotSize;\n children[i].reflow(childBox);\n if (i < count - 1) {\n position += slotSize * spacing;\n }\n position += slotSize;\n }\n }\n });\n var StackWrap = ChartElement.extend({\n options: { vertical: true },\n reflow: function (targetBox) {\n var options = this.options, vertical = options.vertical, positionAxis = vertical ? X : Y, children = this.children, box = this.box = new Box2D(), childrenCount = children.length, i;\n for (i = 0; i < childrenCount; i++) {\n var currentChild = children[i], childBox;\n if (currentChild.visible !== false) {\n childBox = currentChild.box.clone();\n childBox.snapTo(targetBox, positionAxis);\n if (i === 0) {\n box = this.box = childBox.clone();\n }\n currentChild.reflow(childBox);\n box.wrap(childBox);\n }\n }\n }\n });\n var PointEventsMixin = {\n click: function (chart, e) {\n return chart.trigger(SERIES_CLICK, this.eventArgs(e));\n },\n hover: function (chart, e) {\n return chart.trigger(SERIES_HOVER, this.eventArgs(e));\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: eventTargetElement(e),\n originalEvent: e,\n point: this\n };\n }\n };\n var NoteMixin = {\n createNote: function () {\n var element = this, options = element.options.notes, text = element.noteText || options.label.text;\n if (options.visible !== false && defined(text) && text !== null) {\n element.note = new Note(element.value, text, element.dataItem, element.category, element.series, element.options.notes);\n element.append(element.note);\n }\n }\n };\n var Bar = ChartElement.extend({\n init: function (value, options) {\n var bar = this;\n ChartElement.fn.init.call(bar);\n bar.options = options;\n bar.color = options.color || WHITE;\n bar.aboveAxis = valueOrDefault(bar.options.aboveAxis, true);\n bar.value = value;\n },\n defaults: {\n border: { width: 1 },\n vertical: true,\n overlay: { gradient: GLASS },\n labels: {\n visible: false,\n format: '{0}'\n },\n opacity: 1,\n notes: { label: {} }\n },\n render: function () {\n if (this._rendered) {\n return;\n } else {\n this._rendered = true;\n }\n this.createLabel();\n this.createNote();\n if (this.errorBar) {\n this.append(this.errorBar);\n }\n },\n createLabel: function () {\n var options = this.options;\n var labels = options.labels;\n var labelText;\n if (labels.visible) {\n if (labels.template) {\n var labelTemplate = template(labels.template);\n labelText = labelTemplate({\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 } else {\n labelText = this.formatValue(labels.format);\n }\n this.label = new BarLabel(labelText, deepExtend({ vertical: options.vertical }, options.labels));\n this.append(this.label);\n }\n },\n formatValue: function (format) {\n return this.owner.formatPointValue(this, format);\n },\n reflow: function (targetBox) {\n this.render();\n var bar = this, label = bar.label;\n bar.box = targetBox;\n if (label) {\n label.options.aboveAxis = bar.aboveAxis;\n label.reflow(targetBox);\n }\n if (bar.note) {\n bar.note.reflow(targetBox);\n }\n if (bar.errorBars) {\n for (var i = 0; i < bar.errorBars.length; i++) {\n bar.errorBars[i].reflow(targetBox);\n }\n }\n },\n createVisual: function () {\n var bar = this;\n var box = bar.box;\n var options = bar.options;\n var customVisual = options.visual;\n if (bar.visible !== false) {\n ChartElement.fn.createVisual.call(bar);\n if (customVisual) {\n var visual = this.rectVisual = customVisual({\n category: bar.category,\n dataItem: bar.dataItem,\n value: bar.value,\n sender: bar.getChart(),\n series: bar.series,\n percentage: bar.percentage,\n stackValue: this.stackValue,\n runningTotal: bar.runningTotal,\n total: bar.total,\n rect: box.toRect(),\n createVisual: function () {\n var group = new draw.Group();\n bar.createRect(group);\n return group;\n },\n options: options\n });\n if (visual) {\n bar.visual.append(visual);\n }\n } else if (box.width() > 0 && box.height() > 0) {\n bar.createRect(bar.visual);\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 rect.size.width = Math.round(rect.size.width);\n var path = this.rectVisual = draw.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 var width = this.box.width();\n var height = this.box.height();\n var size = options.vertical ? width : height;\n if (size > BAR_ALIGN_MIN_WIDTH) {\n alignPathToPixel(path);\n if (width < 1 || height < 1) {\n path.options.stroke.lineJoin = 'round';\n }\n }\n visual.append(path);\n if (hasGradientOverlay(options)) {\n visual.append(this.createGradientOverlay(path, { baseColor: this.color }, deepExtend({\n end: !options.vertical ? [\n 0,\n 1\n ] : undefined\n }, options.overlay)));\n }\n },\n createHighlight: function (style) {\n var highlight = draw.Path.fromRect(this.box.toRect(), style);\n return alignPathToPixel(highlight);\n },\n highlightVisual: function () {\n return this.rectVisual;\n },\n highlightVisualArgs: function () {\n return {\n options: this.options,\n rect: this.box.toRect(),\n visual: this.rectVisual\n };\n },\n getBorderColor: function () {\n var bar = this, options = bar.options, color = bar.color, border = options.border, borderColor = border.color, brightness = border._brightness || BAR_BORDER_BRIGHTNESS;\n if (!defined(borderColor)) {\n borderColor = new Color(color).brightness(brightness).toHex();\n }\n return borderColor;\n },\n tooltipAnchor: function (tooltipWidth, tooltipHeight) {\n var bar = this, options = bar.options, box = bar.box, vertical = options.vertical, aboveAxis = bar.aboveAxis, clipBox = bar.owner.pane.clipBox() || box, x, y;\n if (vertical) {\n x = math.min(box.x2, clipBox.x2) + TOOLTIP_OFFSET;\n y = aboveAxis ? math.max(box.y1, clipBox.y1) : math.min(box.y2, clipBox.y2) - tooltipHeight;\n } else {\n var x1 = math.max(box.x1, clipBox.x1), x2 = math.min(box.x2, clipBox.x2);\n if (options.isStacked) {\n x = aboveAxis ? x2 - tooltipWidth : x1;\n y = math.max(box.y1, clipBox.y1) - tooltipHeight - TOOLTIP_OFFSET;\n } else {\n x = aboveAxis ? x2 + TOOLTIP_OFFSET : x1 - tooltipWidth - TOOLTIP_OFFSET;\n y = math.max(box.y1, clipBox.y1);\n }\n }\n return new Point2D(x, y);\n },\n overlapsBox: function (box) {\n return this.box.overlaps(box);\n }\n });\n deepExtend(Bar.fn, PointEventsMixin);\n deepExtend(Bar.fn, NoteMixin);\n var BarChartAnimation = draw.Animation.extend({\n options: { duration: INITIAL_ANIMATION_DURATION },\n setup: function () {\n var element = this.element;\n var options = this.options;\n var bbox = element.bbox();\n if (bbox) {\n this.origin = options.origin;\n var axis = options.vertical ? Y : X;\n var fromScale = this.fromScale = new geom.Point(1, 1);\n fromScale[axis] = START_SCALE;\n element.transform(geom.transform().scale(fromScale.x, fromScale.y));\n } else {\n this.abort();\n }\n },\n step: function (pos) {\n var scaleX = interpolate(this.fromScale.x, 1, pos);\n var scaleY = interpolate(this.fromScale.y, 1, pos);\n this.element.transform(geom.transform().scale(scaleX, scaleY, this.origin));\n },\n abort: function () {\n draw.Animation.fn.abort.call(this);\n this.element.transform(null);\n }\n });\n draw.AnimationFactory.current.register(BAR, BarChartAnimation);\n var FadeInAnimation = draw.Animation.extend({\n options: {\n duration: 200,\n easing: LINEAR\n },\n setup: function () {\n this.fadeTo = this.element.opacity();\n this.element.opacity(0);\n },\n step: function (pos) {\n this.element.opacity(pos * this.fadeTo);\n }\n });\n draw.AnimationFactory.current.register(FADEIN, FadeInAnimation);\n var ErrorRangeCalculator = function (errorValue, series, field) {\n var that = this;\n that.initGlobalRanges(errorValue, series, field);\n };\n ErrorRangeCalculator.prototype = ErrorRangeCalculator.fn = {\n percentRegex: /percent(?:\\w*)\\((\\d+)\\)/,\n standardDeviationRegex: new RegExp('^' + STD_DEV + '(?:\\\\((\\\\d+(?:\\\\.\\\\d+)?)\\\\))?$'),\n initGlobalRanges: function (errorValue, series, field) {\n var that = this, data = series.data, deviationMatch = that.standardDeviationRegex.exec(errorValue);\n if (deviationMatch) {\n that.valueGetter = that.createValueGetter(series, field);\n var average = that.getAverage(data), deviation = that.getStandardDeviation(data, average, false), multiple = deviationMatch[1] ? parseFloat(deviationMatch[1]) : 1, errorRange = {\n low: average.value - deviation * multiple,\n high: average.value + deviation * multiple\n };\n that.globalRange = function () {\n return errorRange;\n };\n } else if (errorValue.indexOf && errorValue.indexOf(STD_ERR) >= 0) {\n that.valueGetter = that.createValueGetter(series, field);\n var standardError = that.getStandardError(data, that.getAverage(data));\n that.globalRange = function (value) {\n return {\n low: value - standardError,\n high: value + standardError\n };\n };\n }\n },\n createValueGetter: function (series, field) {\n var data = series.data, binder = SeriesBinder.current, valueFields = binder.valueFields(series), item = defined(data[0]) ? data[0] : {}, idx, srcValueFields, valueGetter;\n if (isArray(item)) {\n idx = field ? indexOf(field, valueFields) : 0;\n valueGetter = getter('[' + idx + ']');\n } else if (isNumber(item)) {\n valueGetter = getter();\n } else if (typeof item === OBJECT) {\n srcValueFields = binder.sourceFields(series, valueFields);\n valueGetter = getter(srcValueFields[indexOf(field, valueFields)]);\n }\n return valueGetter;\n },\n getErrorRange: function (pointValue, errorValue) {\n var that = this, low, high, value;\n if (!defined(errorValue)) {\n return;\n }\n if (that.globalRange) {\n return that.globalRange(pointValue);\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 = that.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 return {\n low: low,\n high: high\n };\n },\n getStandardError: function (data, average) {\n return this.getStandardDeviation(data, average, true) / math.sqrt(average.count);\n },\n getStandardDeviation: function (data, average, isSample) {\n var squareDifferenceSum = 0, length = data.length, total = isSample ? average.count - 1 : average.count, value;\n for (var i = 0; i < length; i++) {\n value = this.valueGetter(data[i]);\n if (isNumber(value)) {\n squareDifferenceSum += math.pow(value - average.value, 2);\n }\n }\n return math.sqrt(squareDifferenceSum / total);\n },\n getAverage: function (data) {\n var sum = 0, count = 0, length = data.length, value;\n for (var i = 0; i < length; i++) {\n value = this.valueGetter(data[i]);\n if (isNumber(value)) {\n sum += value;\n count++;\n }\n }\n return {\n value: sum / count,\n count: count\n };\n }\n };\n var CategoricalChart = ChartElement.extend({\n init: function (plotArea, options) {\n var chart = this;\n ChartElement.fn.init.call(chart, options);\n chart.plotArea = plotArea;\n chart.categoryAxis = plotArea.seriesCategoryAxis(options.series[0]);\n chart.valueAxisRanges = {};\n chart.points = [];\n chart.categoryPoints = [];\n chart.seriesPoints = [];\n chart.seriesOptions = [];\n chart._evalSeries = [];\n chart.render();\n },\n options: {\n series: [],\n invertAxes: false,\n isStacked: false,\n clip: true\n },\n render: function () {\n var chart = this;\n chart.traverseDataPoints(proxy(chart.addValue, chart));\n },\n pointOptions: function (series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().fn.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, { vertical: !this.options.invertAxes }, series);\n }\n return options;\n },\n plotValue: function (point) {\n if (!point) {\n return 0;\n }\n if (this.options.isStacked100 && isNumber(point.value)) {\n var categoryIx = point.categoryIx;\n var categoryPts = this.categoryPoints[categoryIx];\n var categorySum = 0;\n var otherValues = [];\n for (var i = 0; i < categoryPts.length; i++) {\n var other = categoryPts[i];\n if (other) {\n var stack = point.series.stack;\n var otherStack = other.series.stack;\n if (stack && otherStack && stack.group !== otherStack.group) {\n continue;\n }\n if (isNumber(other.value)) {\n categorySum += math.abs(other.value);\n otherValues.push(math.abs(other.value));\n }\n }\n }\n if (categorySum > 0) {\n return point.value / categorySum;\n }\n }\n return point.value;\n },\n plotRange: function (point, startValue) {\n var categoryIx = point.categoryIx;\n var categoryPts = this.categoryPoints[categoryIx];\n if (this.options.isStacked) {\n startValue = startValue || 0;\n var plotValue = this.plotValue(point);\n var positive = plotValue >= 0;\n var prevValue = startValue;\n var isStackedBar = false;\n for (var i = 0; i < categoryPts.length; i++) {\n var other = categoryPts[i];\n if (point === other) {\n break;\n }\n var stack = point.series.stack;\n var otherStack = other.series.stack;\n if (stack && otherStack) {\n if (typeof stack === STRING && stack !== otherStack) {\n continue;\n }\n if (stack.group && stack.group !== otherStack.group) {\n continue;\n }\n }\n var otherValue = this.plotValue(other);\n if (otherValue >= 0 && positive || otherValue < 0 && !positive) {\n prevValue += otherValue;\n plotValue += otherValue;\n isStackedBar = true;\n if (this.options.isStacked100) {\n plotValue = math.min(plotValue, 1);\n }\n }\n }\n if (isStackedBar) {\n prevValue -= startValue;\n }\n return [\n prevValue,\n plotValue\n ];\n }\n var series = point.series;\n var valueAxis = this.seriesValueAxis(series);\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n return [\n axisCrossingValue,\n point.value || axisCrossingValue\n ];\n },\n stackLimits: function (axisName, stackName) {\n var min = MAX_VALUE;\n var max = MIN_VALUE;\n for (var i = 0; i < this.categoryPoints.length; i++) {\n var categoryPts = this.categoryPoints[i];\n if (!categoryPts) {\n continue;\n }\n for (var pIx = 0; pIx < categoryPts.length; pIx++) {\n var point = categoryPts[pIx];\n if (point) {\n if (point.series.stack === stackName || point.series.axis === axisName) {\n var to = this.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 return {\n min: min,\n max: max\n };\n },\n updateStackRange: function () {\n var chart = this;\n var chartSeries = chart.options.series;\n var isStacked = chart.options.isStacked;\n var limits;\n var limitsCache = {};\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 limits = limitsCache[key];\n if (!limits) {\n limits = chart.stackLimits(axisName, series.stack);\n var errorTotals = chart.errorTotals;\n if (errorTotals) {\n if (errorTotals.negative.length) {\n limits.min = math.min(limits.min, sparseArrayMin(errorTotals.negative));\n }\n if (errorTotals.positive.length) {\n limits.max = math.max(limits.max, sparseArrayMax(errorTotals.positive));\n }\n }\n if (limits.min !== MAX_VALUE || limits.max !== MIN_VALUE) {\n limitsCache[key] = limits;\n } else {\n limits = null;\n }\n }\n if (limits) {\n chart.valueAxisRanges[axisName] = limits;\n }\n }\n }\n },\n addErrorBar: function (point, data, categoryIx) {\n var chart = this, value = point.value, series = point.series, seriesIx = point.seriesIx, errorBars = point.options.errorBars, errorRange, lowValue = data.fields[ERROR_LOW_FIELD], highValue = data.fields[ERROR_HIGH_FIELD];\n if (isNumber(lowValue) && isNumber(highValue)) {\n errorRange = {\n low: lowValue,\n high: highValue\n };\n } else if (errorBars && defined(errorBars.value)) {\n chart.seriesErrorRanges = chart.seriesErrorRanges || [];\n chart.seriesErrorRanges[seriesIx] = chart.seriesErrorRanges[seriesIx] || new ErrorRangeCalculator(errorBars.value, series, VALUE);\n errorRange = chart.seriesErrorRanges[seriesIx].getErrorRange(value, errorBars.value);\n }\n if (errorRange) {\n point.low = errorRange.low;\n point.high = errorRange.high;\n chart.addPointErrorBar(point, categoryIx);\n }\n },\n addPointErrorBar: function (point, categoryIx) {\n var chart = this, series = point.series, low = point.low, high = point.high, isVertical = !chart.options.invertAxes, options = point.options.errorBars, errorBar, stackedErrorRange;\n if (chart.options.isStacked) {\n stackedErrorRange = chart.stackedErrorRange(point, categoryIx);\n low = stackedErrorRange.low;\n high = stackedErrorRange.high;\n } else {\n var fields = {\n categoryIx: categoryIx,\n series: series\n };\n chart.updateRange({ value: low }, fields);\n chart.updateRange({ value: high }, fields);\n }\n errorBar = new CategoricalErrorBar(low, high, isVertical, chart, series, options);\n point.errorBars = [errorBar];\n point.append(errorBar);\n },\n stackedErrorRange: function (point, categoryIx) {\n var chart = this, plotValue = chart.plotRange(point, 0)[1] - point.value, low = point.low + plotValue, high = point.high + plotValue;\n chart.errorTotals = chart.errorTotals || {\n positive: [],\n negative: []\n };\n if (low < 0) {\n chart.errorTotals.negative[categoryIx] = math.min(chart.errorTotals.negative[categoryIx] || 0, low);\n }\n if (high > 0) {\n chart.errorTotals.positive[categoryIx] = math.max(chart.errorTotals.positive[categoryIx] || 0, high);\n }\n return {\n low: low,\n high: high\n };\n },\n addValue: function (data, fields) {\n var chart = this;\n var categoryIx = fields.categoryIx;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var categoryPoints = chart.categoryPoints[categoryIx];\n if (!categoryPoints) {\n chart.categoryPoints[categoryIx] = categoryPoints = [];\n }\n var seriesPoints = chart.seriesPoints[seriesIx];\n if (!seriesPoints) {\n chart.seriesPoints[seriesIx] = seriesPoints = [];\n }\n var point = chart.createPoint(data, fields);\n if (point) {\n $.extend(point, fields);\n point.owner = chart;\n point.dataItem = series.data[categoryIx];\n point.noteText = data.fields.noteText;\n chart.addErrorBar(point, data, categoryIx);\n }\n chart.points.push(point);\n seriesPoints.push(point);\n categoryPoints.push(point);\n chart.updateRange(data.valueFields, fields);\n },\n evalPointOptions: function (options, value, category, categoryIx, series, seriesIx) {\n var state = {\n defaults: series._defaults,\n excluded: [\n 'data',\n 'aggregate',\n '_events',\n 'tooltip',\n 'template',\n 'visual',\n 'toggle',\n '_outOfRangeMinPoint',\n '_outOfRangeMaxPoint'\n ]\n };\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n if (doEval) {\n options = deepExtend({}, options);\n evalOptions(options, {\n value: value,\n category: category,\n index: categoryIx,\n series: series,\n dataItem: series.data[categoryIx]\n }, state);\n }\n return options;\n },\n updateRange: function (data, fields) {\n var chart = this, axisName = fields.series.axis, value = data.value, axisRange = chart.valueAxisRanges[axisName];\n if (isFinite(value) && value !== null) {\n axisRange = chart.valueAxisRanges[axisName] = axisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n axisRange.min = math.min(axisRange.min, value);\n axisRange.max = math.max(axisRange.max, value);\n }\n },\n seriesValueAxis: function (series) {\n var plotArea = this.plotArea, axisName = series.axis, axis = axisName ? plotArea.namedValueAxes[axisName] : plotArea.valueAxis;\n if (!axis) {\n throw new Error('Unable to locate value axis with name ' + axisName);\n }\n return axis;\n },\n reflow: function (targetBox) {\n var chart = this, pointIx = 0, categorySlots = chart.categorySlots = [], chartPoints = chart.points, categoryAxis = chart.categoryAxis, value, valueAxis, point;\n chart.traverseDataPoints(function (data, fields) {\n var categoryIx = fields.categoryIx;\n var currentSeries = fields.series;\n value = chart.pointValue(data);\n valueAxis = chart.seriesValueAxis(currentSeries);\n point = chartPoints[pointIx++];\n var categorySlot = categorySlots[categoryIx];\n if (!categorySlot) {\n categorySlots[categoryIx] = categorySlot = chart.categorySlot(categoryAxis, categoryIx, valueAxis);\n }\n if (point) {\n var plotRange = chart.plotRange(point, valueAxis.startValue());\n var valueSlot = valueAxis.getSlot(plotRange[0], plotRange[1], !chart.options.clip);\n if (valueSlot) {\n var pointSlot = chart.pointSlot(categorySlot, valueSlot);\n point.aboveAxis = chart.aboveAxis(point, valueAxis);\n point.stackValue = plotRange[1];\n if (chart.options.isStacked100) {\n point.percentage = chart.plotValue(point);\n }\n chart.reflowPoint(point, pointSlot);\n } else {\n point.visible = false;\n }\n }\n });\n chart.reflowCategories(categorySlots);\n chart.box = targetBox;\n },\n aboveAxis: function (point, valueAxis) {\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n var value = point.value;\n return valueAxis.options.reverse ? value < axisCrossingValue : value >= axisCrossingValue;\n },\n categoryAxisCrossingValue: function (valueAxis) {\n var categoryAxis = this.categoryAxis, options = valueAxis.options, crossingValues = [].concat(options.axisCrossingValues || options.axisCrossingValue);\n return crossingValues[categoryAxis.axisIndex || 0] || 0;\n },\n reflowPoint: function (point, pointSlot) {\n point.reflow(pointSlot);\n },\n reflowCategories: function () {\n },\n pointSlot: function (categorySlot, valueSlot) {\n var chart = this, options = chart.options, invertAxes = options.invertAxes, slotX = invertAxes ? valueSlot : categorySlot, slotY = invertAxes ? categorySlot : valueSlot;\n return new Box2D(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n },\n categorySlot: function (categoryAxis, categoryIx) {\n return categoryAxis.getSlot(categoryIx);\n },\n traverseDataPoints: function (callback) {\n var chart = this, options = chart.options, series = options.series, categories = chart.categoryAxis.options.categories || [], count = categoriesCount(series), categoryIx, seriesIx, pointData, currentCategory, currentSeries, seriesCount = series.length;\n for (seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n this._outOfRangeCallback(series[seriesIx], '_outOfRangeMinPoint', seriesIx, callback);\n }\n for (categoryIx = 0; categoryIx < count; categoryIx++) {\n for (seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n currentSeries = series[seriesIx];\n currentCategory = categories[categoryIx];\n pointData = this._bindPoint(currentSeries, seriesIx, categoryIx);\n callback(pointData, {\n category: currentCategory,\n categoryIx: categoryIx,\n series: currentSeries,\n seriesIx: seriesIx\n });\n }\n }\n for (seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n this._outOfRangeCallback(series[seriesIx], '_outOfRangeMaxPoint', seriesIx, callback);\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 callback(pointData, {\n category: outOfRangePoint.category,\n categoryIx: categoryIx,\n series: series,\n seriesIx: seriesIx\n });\n }\n },\n _bindPoint: function (series, seriesIx, categoryIx, item) {\n if (!this._bindCache) {\n this._bindCache = [];\n }\n var bindCache = this._bindCache[seriesIx];\n if (!bindCache) {\n bindCache = this._bindCache[seriesIx] = [];\n }\n var data = bindCache[categoryIx];\n if (!data) {\n data = bindCache[categoryIx] = SeriesBinder.current.bindPoint(series, categoryIx, item);\n }\n return data;\n },\n formatPointValue: function (point, format) {\n if (point.value === null) {\n return '';\n }\n return autoFormat(format, point.value);\n },\n pointValue: function (data) {\n return data.valueFields.value;\n }\n });\n var BarChart = CategoricalChart.extend({\n options: { animation: { type: BAR } },\n render: function () {\n var chart = this;\n CategoricalChart.fn.render.apply(chart);\n chart.updateStackRange();\n },\n pointType: function () {\n return Bar;\n },\n clusterType: function () {\n return ClusterLayout;\n },\n stackType: function () {\n return StackWrap;\n },\n stackLimits: function (axisName, stackName) {\n var limits = CategoricalChart.fn.stackLimits.call(this, axisName, stackName);\n return limits;\n },\n createPoint: function (data, fields) {\n var chart = this;\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var value = chart.pointValue(data);\n var options = chart.options;\n var children = chart.children;\n var isStacked = chart.options.isStacked;\n var point;\n var pointType = chart.pointType();\n var pointOptions;\n var cluster;\n var clusterType = chart.clusterType();\n pointOptions = this.pointOptions(series, seriesIx);\n var labelOptions = pointOptions.labels;\n if (isStacked) {\n if (labelOptions.position == OUTSIDE_END) {\n labelOptions.position = INSIDE_END;\n }\n }\n pointOptions.isStacked = isStacked;\n var color = data.fields.color || series.color;\n if (value < 0 && pointOptions.negativeColor) {\n color = pointOptions.negativeColor;\n }\n pointOptions = chart.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n if (kendo.isFunction(series.color)) {\n color = pointOptions.color;\n }\n point = new pointType(value, pointOptions);\n point.color = color;\n cluster = children[categoryIx];\n if (!cluster) {\n cluster = new clusterType({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing\n });\n chart.append(cluster);\n }\n if (isStacked) {\n var stackWrap = chart.getStackWrap(series, cluster);\n stackWrap.append(point);\n } else {\n cluster.append(point);\n }\n return point;\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 if (typeof stackGroup === 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 if (!stackWrap) {\n var stackType = this.stackType();\n stackWrap = new stackType({ vertical: !this.options.invertAxes });\n stackWrap._stackGroup = stackGroup;\n cluster.append(stackWrap);\n }\n return stackWrap;\n },\n categorySlot: function (categoryAxis, categoryIx, valueAxis) {\n var chart = this, options = chart.options, categorySlot = categoryAxis.getSlot(categoryIx), startValue = valueAxis.startValue(), stackAxis, zeroSlot;\n if (options.isStacked) {\n zeroSlot = valueAxis.getSlot(startValue, startValue, true);\n stackAxis = options.invertAxes ? X : Y;\n categorySlot[stackAxis + 1] = categorySlot[stackAxis + 2] = zeroSlot[stackAxis + 1];\n }\n return categorySlot;\n },\n reflowCategories: function (categorySlots) {\n var chart = this, children = chart.children, childrenLength = children.length, i;\n for (i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n createAnimation: function () {\n this._setAnimationOptions();\n ChartElement.fn.createAnimation.call(this);\n if (anyHasZIndex(this.options.series)) {\n this._setChildrenAnimation();\n }\n },\n _setChildrenAnimation: function () {\n var points = this.points;\n var point, pointVisual;\n for (var idx = 0; idx < points.length; idx++) {\n point = points[idx];\n pointVisual = point.visual;\n if (pointVisual && defined(pointVisual.options.zIndex)) {\n point.options.animation = this.options.animation;\n point.createAnimation();\n }\n }\n },\n _setAnimationOptions: function () {\n var options = this.options;\n var animation = options.animation || {};\n var origin;\n if (this.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 animation.origin = new geom.Point(origin.x1, origin.y1);\n animation.vertical = !options.invertAxes;\n }\n });\n var RangeBar = Bar.extend({\n defaults: {\n labels: { format: '{0} - {1}' },\n tooltip: { format: '{1}' }\n },\n createLabel: function () {\n var labels = this.options.labels;\n var fromOptions = deepExtend({}, labels, labels.from);\n var toOptions = deepExtend({}, labels, labels.to);\n if (fromOptions.visible) {\n this.labelFrom = this._createLabel(fromOptions);\n this.append(this.labelFrom);\n }\n if (toOptions.visible) {\n this.labelTo = this._createLabel(toOptions);\n this.append(this.labelTo);\n }\n },\n _createLabel: function (options) {\n var labelText;\n if (options.template) {\n var labelTemplate = template(options.template);\n labelText = labelTemplate({\n dataItem: this.dataItem,\n category: this.category,\n value: this.value,\n percentage: this.percentage,\n runningTotal: this.runningTotal,\n total: this.total,\n series: this.series\n });\n } else {\n labelText = this.formatValue(options.format);\n }\n return new BarLabel(labelText, deepExtend({ vertical: this.options.vertical }, options));\n },\n reflow: function (targetBox) {\n this.render();\n var rangeBar = this, labelFrom = rangeBar.labelFrom, labelTo = rangeBar.labelTo;\n rangeBar.box = targetBox;\n if (labelFrom) {\n labelFrom.options.aboveAxis = rangeBar.value.from > rangeBar.value.to;\n labelFrom.reflow(targetBox);\n }\n if (labelTo) {\n labelTo.options.aboveAxis = rangeBar.value.to > rangeBar.value.from;\n labelTo.reflow(targetBox);\n }\n if (rangeBar.note) {\n rangeBar.note.reflow(targetBox);\n }\n }\n });\n var RangeBarChart = BarChart.extend({\n pointType: function () {\n return RangeBar;\n },\n pointValue: function (data) {\n return data.valueFields;\n },\n formatPointValue: function (point, format) {\n if (point.value.from === null && point.value.to === null) {\n return '';\n }\n return autoFormat(format, point.value.from, point.value.to);\n },\n plotLimits: CategoricalChart.fn.plotLimits,\n plotRange: function (point) {\n if (!point) {\n return 0;\n }\n return [\n point.value.from,\n point.value.to\n ];\n },\n updateRange: function (value, fields) {\n var chart = this, axisName = fields.series.axis, from = value.from, to = value.to, axisRange = chart.valueAxisRanges[axisName];\n if (value !== null && isNumber(from) && isNumber(to)) {\n axisRange = chart.valueAxisRanges[axisName] = axisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n axisRange.min = math.min(axisRange.min, from);\n axisRange.max = math.max(axisRange.max, from);\n axisRange.min = math.min(axisRange.min, to);\n axisRange.max = math.max(axisRange.max, to);\n }\n },\n aboveAxis: function (point) {\n var value = point.value;\n return value.from < value.to;\n }\n });\n var BulletChart = CategoricalChart.extend({\n init: function (plotArea, options) {\n var chart = this;\n chart.wrapData(options);\n CategoricalChart.fn.init.call(chart, plotArea, options);\n },\n options: { animation: { type: BAR } },\n wrapData: function (options) {\n var series = options.series, i, data, seriesItem;\n for (i = 0; i < series.length; i++) {\n seriesItem = series[i];\n data = seriesItem.data;\n if (data && !isArray(data[0]) && typeof data[0] != OBJECT) {\n seriesItem.data = [data];\n }\n }\n },\n reflowCategories: function (categorySlots) {\n var chart = this, children = chart.children, childrenLength = children.length, i;\n for (i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n plotRange: function (point) {\n var series = point.series;\n var valueAxis = this.seriesValueAxis(series);\n var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n return [\n axisCrossingValue,\n point.value.current || axisCrossingValue\n ];\n },\n createPoint: function (data, fields) {\n var chart = this;\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 var options = chart.options;\n var children = chart.children;\n var bullet;\n var bulletOptions;\n var cluster;\n bulletOptions = deepExtend({\n vertical: !options.invertAxes,\n overlay: series.overlay,\n categoryIx: categoryIx,\n invertAxes: options.invertAxes\n }, series);\n var color = data.fields.color || series.color;\n bulletOptions = chart.evalPointOptions(bulletOptions, value, category, categoryIx, series, seriesIx);\n if (kendo.isFunction(series.color)) {\n color = bulletOptions.color;\n }\n bullet = new Bullet(value, bulletOptions);\n bullet.color = color;\n cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing\n });\n chart.append(cluster);\n }\n cluster.append(bullet);\n return bullet;\n },\n updateRange: function (value, fields) {\n var chart = this, axisName = fields.series.axis, current = value.current, target = value.target, axisRange = chart.valueAxisRanges[axisName];\n if (defined(current) && !isNaN(current) && defined(target && !isNaN(target))) {\n axisRange = chart.valueAxisRanges[axisName] = axisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n axisRange.min = math.min.apply(math, [\n axisRange.min,\n current,\n target\n ]);\n axisRange.max = math.max.apply(math, [\n axisRange.max,\n current,\n target\n ]);\n }\n },\n formatPointValue: function (point, format) {\n return autoFormat(format, point.value.current, point.value.target);\n },\n pointValue: function (data) {\n return data.valueFields.current;\n },\n aboveAxis: function (point) {\n var value = point.value.current;\n return value > 0;\n },\n createAnimation: function () {\n var points = this.points;\n var point;\n this._setAnimationOptions();\n for (var idx = 0; idx < points.length; idx++) {\n point = points[idx];\n point.options.animation = this.options.animation;\n point.createAnimation();\n }\n },\n _setAnimationOptions: BarChart.fn._setAnimationOptions\n });\n var Bullet = ChartElement.extend({\n init: function (value, options) {\n var bullet = this;\n ChartElement.fn.init.call(bullet, options);\n bullet.aboveAxis = bullet.options.aboveAxis;\n bullet.color = options.color || WHITE;\n bullet.value = value;\n },\n options: {\n border: { width: 1 },\n vertical: false,\n opacity: 1,\n target: {\n shape: '',\n border: {\n width: 0,\n color: 'green'\n },\n line: { width: 2 }\n },\n tooltip: { format: 'Current: {0}Target: {1}' }\n },\n render: function () {\n var bullet = this, options = bullet.options;\n if (!bullet._rendered) {\n bullet._rendered = true;\n if (defined(bullet.value.target)) {\n bullet.target = new Target({\n type: options.target.shape,\n background: options.target.color || bullet.color,\n opacity: options.opacity,\n zIndex: options.zIndex,\n border: options.target.border,\n vAlign: TOP,\n align: RIGHT\n });\n bullet.target.value = this.value;\n bullet.target.dataItem = this.dataItem;\n bullet.target.series = this.series;\n bullet.append(bullet.target);\n }\n bullet.createNote();\n }\n },\n reflow: function (box) {\n this.render();\n var bullet = this, options = bullet.options, chart = bullet.owner, target = bullet.target, invertAxes = options.invertAxes, valueAxis = chart.seriesValueAxis(bullet.options), categorySlot = chart.categorySlot(chart.categoryAxis, options.categoryIx, valueAxis), targetValueSlot = valueAxis.getSlot(bullet.value.target), targetSlotX = invertAxes ? targetValueSlot : categorySlot, targetSlotY = invertAxes ? categorySlot : targetValueSlot, targetSlot;\n if (target) {\n targetSlot = new Box2D(targetSlotX.x1, targetSlotY.y1, targetSlotX.x2, targetSlotY.y2);\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 if (bullet.note) {\n bullet.note.reflow(box);\n }\n bullet.box = box;\n },\n createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n var options = this.options;\n var body = draw.Path.fromRect(this.box.toRect(), {\n fill: {\n color: this.color,\n opacity: options.opacity\n },\n stroke: null\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 this.bodyVisual = body;\n alignPathToPixel(body);\n this.visual.append(body);\n },\n createAnimation: function () {\n if (this.bodyVisual) {\n this.animation = draw.Animation.create(this.bodyVisual, this.options.animation);\n }\n },\n tooltipAnchor: Bar.fn.tooltipAnchor,\n createHighlight: function (style) {\n return draw.Path.fromRect(this.box.toRect(), style);\n },\n highlightVisual: function () {\n return this.bodyVisual;\n },\n highlightVisualArgs: function () {\n return {\n rect: this.box.toRect(),\n visual: this.bodyVisual,\n options: this.options\n };\n },\n formatValue: function (format) {\n var bullet = this;\n return bullet.owner.formatPointValue(bullet, format);\n }\n });\n deepExtend(Bullet.fn, PointEventsMixin);\n deepExtend(Bullet.fn, NoteMixin);\n var Target = ShapeElement.extend();\n deepExtend(Target.fn, PointEventsMixin);\n var ErrorBarBase = ChartElement.extend({\n init: function (low, high, isVertical, chart, series, options) {\n var errorBar = this;\n errorBar.low = low;\n errorBar.high = high;\n errorBar.isVertical = isVertical;\n errorBar.chart = chart;\n errorBar.series = series;\n ChartElement.fn.init.call(errorBar, options);\n },\n options: {\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n },\n endCaps: true,\n line: { width: 1 },\n zIndex: 1\n },\n getAxis: function () {\n },\n reflow: function (targetBox) {\n var linePoints, errorBar = this, endCaps = errorBar.options.endCaps, isVertical = errorBar.isVertical, axis = errorBar.getAxis(), valueBox = axis.getSlot(errorBar.low, errorBar.high), centerBox = targetBox.center(), capsWidth = errorBar.getCapsWidth(targetBox, isVertical), capValue = isVertical ? centerBox.x : centerBox.y, capStart = capValue - capsWidth, capEnd = capValue + capsWidth;\n if (isVertical) {\n linePoints = [\n Point2D(centerBox.x, valueBox.y1),\n Point2D(centerBox.x, valueBox.y2)\n ];\n if (endCaps) {\n linePoints.push(Point2D(capStart, valueBox.y1), Point2D(capEnd, valueBox.y1), Point2D(capStart, valueBox.y2), Point2D(capEnd, valueBox.y2));\n }\n errorBar.box = Box2D(capStart, valueBox.y1, capEnd, valueBox.y2);\n } else {\n linePoints = [\n Point2D(valueBox.x1, centerBox.y),\n Point2D(valueBox.x2, centerBox.y)\n ];\n if (endCaps) {\n linePoints.push(Point2D(valueBox.x1, capStart), Point2D(valueBox.x1, capEnd), Point2D(valueBox.x2, capStart), Point2D(valueBox.x2, capEnd));\n }\n errorBar.box = Box2D(valueBox.x1, capStart, valueBox.x2, capEnd);\n }\n errorBar.linePoints = linePoints;\n },\n getCapsWidth: function (box, isVertical) {\n var boxSize = isVertical ? box.width() : box.height(), capsWidth = math.min(math.floor(boxSize / 2), DEFAULT_ERROR_BAR_WIDTH) || DEFAULT_ERROR_BAR_WIDTH;\n return capsWidth;\n },\n createVisual: function () {\n var that = this;\n var options = that.options;\n var visual = options.visual;\n if (visual) {\n that.visual = visual({\n low: that.low,\n high: that.high,\n rect: that.box.toRect(),\n sender: that.getChart(),\n options: {\n endCaps: options.endCaps,\n color: options.color,\n line: options.line\n },\n createVisual: function () {\n that.createDefaultVisual();\n var defaultVisual = that.visual;\n delete that.visual;\n return defaultVisual;\n }\n });\n } else {\n that.createDefaultVisual();\n }\n },\n createDefaultVisual: function () {\n var errorBar = this, options = errorBar.options, lineOptions = {\n stroke: {\n color: options.color,\n width: options.line.width,\n dashType: options.line.dashType\n }\n }, linePoints = errorBar.linePoints;\n ChartElement.fn.createVisual.call(this);\n for (var idx = 0; idx < linePoints.length; idx += 2) {\n var line = new draw.Path(lineOptions).moveTo(linePoints[idx].x, linePoints[idx].y).lineTo(linePoints[idx + 1].x, linePoints[idx + 1].y);\n this.visual.append(line);\n }\n }\n });\n var CategoricalErrorBar = ErrorBarBase.extend({\n getAxis: function () {\n var errorBar = this, chart = errorBar.chart, series = errorBar.series, axis = chart.seriesValueAxis(series);\n return axis;\n }\n });\n var ScatterErrorBar = ErrorBarBase.extend({\n getAxis: function () {\n var errorBar = this, chart = errorBar.chart, series = errorBar.series, axes = chart.seriesAxes(series), axis = errorBar.isVertical ? axes.y : axes.x;\n return axis;\n }\n });\n var LinePoint = ChartElement.extend({\n init: function (value, options) {\n var point = this;\n ChartElement.fn.init.call(point);\n point.value = value;\n point.options = options;\n point.aboveAxis = valueOrDefault(point.options.aboveAxis, true);\n point.tooltipTracking = true;\n },\n defaults: {\n vertical: true,\n markers: {\n visible: true,\n background: WHITE,\n size: LINE_MARKER_SIZE,\n type: CIRCLE,\n border: { width: 2 },\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: { label: {} },\n highlight: { markers: { border: {} } }\n },\n render: function () {\n var point = this, options = point.options, markers = options.markers, labels = options.labels, labelText = point.value;\n if (point._rendered) {\n return;\n } else {\n point._rendered = true;\n }\n if (markers.visible && markers.size) {\n point.marker = point.createMarker();\n point.append(point.marker);\n }\n if (labels.visible) {\n if (labels.template) {\n var labelTemplate = template(labels.template);\n labelText = labelTemplate({\n dataItem: point.dataItem,\n category: point.category,\n value: point.value,\n percentage: point.percentage,\n stackValue: this.stackValue,\n series: point.series\n });\n } else if (labels.format) {\n labelText = point.formatValue(labels.format);\n }\n point.label = new TextBox(labelText, 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 point.append(point.label);\n }\n point.createNote();\n if (point.errorBar) {\n point.append(point.errorBar);\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 if (!defined(border.color)) {\n border.color = new Color(background).brightness(BAR_BORDER_BRIGHTNESS).toHex();\n }\n return border;\n },\n createVisual: noop,\n createMarker: function () {\n var options = this.options.markers;\n var marker = new ShapeElement({\n type: options.type,\n width: options.size,\n height: options.size,\n rotation: options.rotation,\n background: options.background,\n border: this.markerBorder(),\n opacity: options.opacity,\n zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n animation: options.animation,\n visual: options.visual\n }, {\n dataItem: this.dataItem,\n value: this.value,\n series: this.series,\n category: this.category\n });\n return marker;\n },\n markerBox: function () {\n if (!this.marker) {\n this.marker = this.createMarker();\n this.marker.reflow(this._childBox);\n }\n return this.marker.box;\n },\n reflow: function (targetBox) {\n var point = this, options = point.options, vertical = options.vertical, aboveAxis = point.aboveAxis, childBox, center;\n point.render();\n point.box = targetBox;\n childBox = targetBox.clone();\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 point._childBox = childBox;\n if (point.marker) {\n point.marker.reflow(childBox);\n }\n point.reflowLabel(childBox);\n if (point.errorBars) {\n for (var i = 0; i < point.errorBars.length; i++) {\n point.errorBars[i].reflow(childBox);\n }\n }\n if (point.note) {\n var noteTargetBox = point.markerBox();\n if (!(options.markers.visible && options.markers.size)) {\n center = noteTargetBox.center();\n noteTargetBox = Box2D(center.x, center.y, center.x, center.y);\n }\n point.note.reflow(noteTargetBox);\n }\n },\n reflowLabel: function (box) {\n var point = this, options = point.options, label = point.label, anchor = options.labels.position;\n if (label) {\n anchor = anchor === ABOVE ? TOP : anchor;\n anchor = anchor === BELOW ? BOTTOM : anchor;\n label.reflow(box);\n label.box.alignTo(point.markerBox(), anchor);\n label.reflow(label.box);\n }\n },\n createHighlight: function () {\n var highlight = this.options.highlight;\n var markers = highlight.markers;\n var defaultColor = this.markerBorder().color;\n var options = this.options.markers;\n var shadow = new ShapeElement({\n type: options.type,\n width: options.size,\n height: options.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 return shadow.getElement();\n },\n highlightVisual: function () {\n return (this.marker || {}).visual;\n },\n highlightVisualArgs: function () {\n var marker = this.marker;\n var visual;\n var rect;\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 geom.Rect([\n center.x - halfSize,\n center.y - halfSize\n ], [\n size,\n size\n ]);\n }\n return {\n options: this.options,\n rect: rect,\n visual: visual\n };\n },\n tooltipAnchor: function (tooltipWidth, tooltipHeight) {\n var point = this, markerBox = point.markerBox(), aboveAxis = point.aboveAxis, x = markerBox.x2 + TOOLTIP_OFFSET, y = aboveAxis ? markerBox.y1 - tooltipHeight : markerBox.y2, clipBox = point.owner.pane.clipBox(), showTooltip = !clipBox || clipBox.overlaps(markerBox);\n if (showTooltip) {\n return Point2D(x, y);\n }\n },\n formatValue: function (format) {\n var point = this;\n return point.owner.formatPointValue(point, format);\n },\n overlapsBox: function (box) {\n var markerBox = this.markerBox();\n return markerBox.overlaps(box);\n }\n });\n deepExtend(LinePoint.fn, PointEventsMixin);\n deepExtend(LinePoint.fn, NoteMixin);\n var Bubble = LinePoint.extend({\n init: function (value, options) {\n var point = this;\n LinePoint.fn.init.call(point, value, options);\n point.category = value.category;\n },\n defaults: {\n labels: { position: CENTER },\n highlight: {\n opacity: 1,\n border: {\n width: 1,\n opacity: 1\n }\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 / 2 - border.width / 2;\n var overlay = new draw.Circle(new geom.Circle([\n center.x,\n center.y\n ], radius), {\n stroke: {\n color: border.color || new Color(markers.background).brightness(BAR_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 return overlay;\n }\n });\n var LineSegment = ChartElement.extend({\n init: function (linePoints, series, seriesIx) {\n var segment = this;\n ChartElement.fn.init.call(segment);\n segment.linePoints = linePoints;\n segment.series = series;\n segment.seriesIx = seriesIx;\n },\n options: { closed: false },\n points: function (visualPoints) {\n var segment = this, linePoints = segment.linePoints.concat(visualPoints || []), points = [];\n for (var i = 0, length = linePoints.length; i < length; i++) {\n if (linePoints[i].visible !== false) {\n points.push(linePoints[i]._childBox.toRect().center());\n }\n }\n return points;\n },\n createVisual: function () {\n var options = this.options;\n var series = this.series;\n var defaults = series._defaults;\n var color = series.color;\n if (isFn(color) && defaults) {\n color = defaults.color;\n }\n var line = draw.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 if (options.closed) {\n line.close();\n }\n this.visual = line;\n },\n aliasFor: function (e, coords) {\n var segment = this, seriesIx = segment.seriesIx;\n return segment.parent.getNearestPoint(coords.x, coords.y, seriesIx);\n }\n });\n var LineChartMixin = {\n renderSegments: function () {\n var chart = this, options = chart.options, series = options.series, seriesPoints = chart.seriesPoints, currentSeries, seriesIx, seriesCount = seriesPoints.length, sortedPoints, linePoints, point, pointIx, pointCount, lastSegment;\n this._segments = [];\n for (seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n currentSeries = series[seriesIx];\n sortedPoints = chart.sortPoints(seriesPoints[seriesIx]);\n pointCount = sortedPoints.length;\n linePoints = [];\n for (pointIx = 0; pointIx < pointCount; pointIx++) {\n point = sortedPoints[pointIx];\n if (point) {\n linePoints.push(point);\n } else if (chart.seriesMissingValues(currentSeries) !== INTERPOLATE) {\n if (linePoints.length > 1) {\n lastSegment = chart.createSegment(linePoints, currentSeries, seriesIx, lastSegment);\n this._addSegment(lastSegment);\n }\n linePoints = [];\n }\n }\n if (linePoints.length > 1) {\n lastSegment = chart.createSegment(linePoints, currentSeries, seriesIx, lastSegment);\n this._addSegment(lastSegment);\n }\n }\n this.children.unshift.apply(this.children, this._segments);\n },\n _addSegment: function (segment) {\n this._segments.push(segment);\n segment.parent = this;\n },\n sortPoints: function (points) {\n return points;\n },\n seriesMissingValues: function (series) {\n var missingValues = series.missingValues, assumeZero = !missingValues && this.options.isStacked;\n return assumeZero ? ZERO : missingValues || INTERPOLATE;\n },\n getNearestPoint: function (x, y, seriesIx) {\n var target = new Point2D(x, y);\n var allPoints = this.seriesPoints[seriesIx];\n var nearestPointDistance = MAX_VALUE;\n var nearestPoint;\n for (var i = 0; i < allPoints.length; i++) {\n var point = allPoints[i];\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 if (pointDistance < nearestPointDistance) {\n nearestPoint = point;\n nearestPointDistance = pointDistance;\n }\n }\n }\n return nearestPoint;\n }\n };\n var ClipAnimationMixin = {\n createAnimation: function () {\n var root = this.getRoot();\n if (root && (root.options || {}).transitions !== false) {\n var box = root.box;\n var clipPath = draw.Path.fromRect(box.toRect());\n this.visual.clip(clipPath);\n this.animation = new ClipAnimation(clipPath, { box: box });\n if (anyHasZIndex(this.options.series)) {\n this._setChildrenAnimation(clipPath);\n }\n }\n },\n _setChildrenAnimation: function (clipPath) {\n var points = this.animationPoints();\n var point;\n for (var idx = 0; idx < points.length; idx++) {\n point = points[idx];\n if (point && point.visual && defined(point.visual.options.zIndex)) {\n point.visual.clip(clipPath);\n }\n }\n }\n };\n var LineChart = CategoricalChart.extend({\n render: function () {\n var chart = this;\n CategoricalChart.fn.render.apply(chart);\n chart.updateStackRange();\n chart.renderSegments();\n },\n pointType: function () {\n return LinePoint;\n },\n createPoint: function (data, fields) {\n var chart = this;\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.value;\n var missingValues = chart.seriesMissingValues(series);\n var point;\n var pointOptions;\n if (!defined(value) || value === null) {\n if (missingValues === ZERO) {\n value = 0;\n } else {\n return null;\n }\n }\n pointOptions = this.pointOptions(series, seriesIx);\n pointOptions = chart.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n var color = data.fields.color || series.color;\n if (kendo.isFunction(series.color)) {\n color = pointOptions.color;\n }\n point = new LinePoint(value, pointOptions);\n point.color = color;\n chart.append(point);\n return point;\n },\n plotRange: function (point) {\n var plotValue = this.plotValue(point);\n if (this.options.isStacked) {\n var categoryIx = point.categoryIx;\n var categoryPts = this.categoryPoints[categoryIx];\n for (var i = 0; i < categoryPts.length; i++) {\n var other = categoryPts[i];\n if (point === other) {\n break;\n }\n plotValue += this.plotValue(other);\n if (this.options.isStacked100) {\n plotValue = math.min(plotValue, 1);\n }\n }\n }\n return [\n plotValue,\n plotValue\n ];\n },\n createSegment: function (linePoints, currentSeries, seriesIx) {\n var pointType, style = currentSeries.style;\n if (style === STEP) {\n pointType = StepLineSegment;\n } else if (style === SMOOTH) {\n pointType = SplineSegment;\n } else {\n pointType = LineSegment;\n }\n return new pointType(linePoints, currentSeries, seriesIx);\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 deepExtend(LineChart.fn, LineChartMixin, ClipAnimationMixin);\n var ClipAnimation = draw.Animation.extend({\n options: { duration: INITIAL_ANIMATION_DURATION },\n setup: function () {\n this._setEnd(this.options.box.x1);\n },\n step: function (pos) {\n var box = this.options.box;\n this._setEnd(interpolate(box.x1, box.x2, pos));\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 element.suspend();\n topRight.setX(x);\n element.resume();\n bottomRight.setX(x);\n }\n });\n draw.AnimationFactory.current.register(CLIP, ClipAnimation);\n var StepLineSegment = LineSegment.extend({\n points: function (visualPoints) {\n var segment = this, points;\n points = segment.calculateStepPoints(segment.linePoints);\n if (visualPoints && visualPoints.length) {\n points = points.concat(segment.calculateStepPoints(visualPoints).reverse());\n }\n return points;\n },\n calculateStepPoints: function (points) {\n var segment = this, chart = segment.parent, plotArea = chart.plotArea, categoryAxis = plotArea.seriesCategoryAxis(segment.series), isInterpolate = chart.seriesMissingValues(segment.series) === INTERPOLATE, length = points.length, reverse = categoryAxis.options.reverse, vertical = categoryAxis.options.vertical, dir = reverse ? 2 : 1, revDir = reverse ? 1 : 2, prevPoint, point, i, prevMarkerBoxCenter, markerBoxCenter, result = [];\n for (i = 1; i < length; i++) {\n prevPoint = points[i - 1];\n point = points[i];\n prevMarkerBoxCenter = prevPoint.markerBox().center();\n markerBoxCenter = point.markerBox().center();\n if (categoryAxis.options.justified) {\n result.push(new geom.Point(prevMarkerBoxCenter.x, prevMarkerBoxCenter.y));\n if (vertical) {\n result.push(new geom.Point(prevMarkerBoxCenter.x, markerBoxCenter.y));\n } else {\n result.push(new geom.Point(markerBoxCenter.x, prevMarkerBoxCenter.y));\n }\n result.push(new geom.Point(markerBoxCenter.x, markerBoxCenter.y));\n } else {\n if (vertical) {\n result.push(new geom.Point(prevMarkerBoxCenter.x, prevPoint.box[Y + dir]));\n result.push(new geom.Point(prevMarkerBoxCenter.x, prevPoint.box[Y + revDir]));\n if (isInterpolate) {\n result.push(new geom.Point(prevMarkerBoxCenter.x, point.box[Y + dir]));\n }\n result.push(new geom.Point(markerBoxCenter.x, point.box[Y + dir]));\n result.push(new geom.Point(markerBoxCenter.x, point.box[Y + revDir]));\n } else {\n result.push(new geom.Point(prevPoint.box[X + dir], prevMarkerBoxCenter.y));\n result.push(new geom.Point(prevPoint.box[X + revDir], prevMarkerBoxCenter.y));\n if (isInterpolate) {\n result.push(new geom.Point(point.box[X + dir], prevMarkerBoxCenter.y));\n }\n result.push(new geom.Point(point.box[X + dir], markerBoxCenter.y));\n result.push(new geom.Point(point.box[X + revDir], markerBoxCenter.y));\n }\n }\n }\n return result || [];\n }\n });\n var SplineSegment = LineSegment.extend({\n createVisual: function () {\n var series = this.series;\n var defaults = series._defaults;\n var color = series.color;\n if (isFn(color) && defaults) {\n color = defaults.color;\n }\n var curveProcessor = new CurveProcessor(this.options.closed);\n var segments = curveProcessor.process(this.points());\n var curve = new draw.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 curve.segments.push.apply(curve.segments, segments);\n this.visual = curve;\n }\n });\n var AreaSegmentMixin = {\n points: function () {\n var segment = this, chart = segment.parent, plotArea = chart.plotArea, invertAxes = chart.options.invertAxes, valueAxis = chart.seriesValueAxis(segment.series), valueAxisLineBox = valueAxis.lineBox(), categoryAxis = plotArea.seriesCategoryAxis(segment.series), categoryAxisLineBox = categoryAxis.lineBox(), end = invertAxes ? categoryAxisLineBox.x1 : categoryAxisLineBox.y1, stackPoints = segment.stackPoints, points = segment._linePoints(stackPoints), pos = invertAxes ? X : Y, firstPoint, lastPoint;\n end = limitValue(end, valueAxisLineBox[pos + 1], valueAxisLineBox[pos + 2]);\n if (!segment.stackPoints && points.length > 1) {\n firstPoint = points[0];\n lastPoint = last(points);\n if (invertAxes) {\n points.unshift(new geom.Point(end, firstPoint.y));\n points.push(new geom.Point(end, lastPoint.y));\n } else {\n points.unshift(new geom.Point(firstPoint.x, end));\n points.push(new geom.Point(lastPoint.x, end));\n }\n }\n return points;\n },\n createVisual: function () {\n var series = this.series;\n var defaults = series._defaults;\n var color = series.color;\n if (isFn(color) && defaults) {\n color = defaults.color;\n }\n this.visual = new draw.Group({ zIndex: series.zIndex });\n this.createArea(color);\n this.createLine(color);\n },\n createLine: function (color) {\n var series = this.series;\n var lineOptions = deepExtend({\n color: color,\n opacity: series.opacity\n }, series.line);\n if (lineOptions.visible !== false && lineOptions.width > 0) {\n var line = draw.Path.fromPoints(this._linePoints(), {\n stroke: {\n color: lineOptions.color,\n width: lineOptions.width,\n opacity: lineOptions.opacity,\n dashType: lineOptions.dashType,\n lineCap: 'butt'\n }\n });\n this.visual.append(line);\n }\n },\n createArea: function (color) {\n var series = this.series;\n var area = draw.Path.fromPoints(this.points(), {\n fill: {\n color: color,\n opacity: series.opacity\n },\n stroke: null\n });\n this.visual.append(area);\n }\n };\n var AreaSegment = LineSegment.extend({\n init: function (linePoints, stackPoints, currentSeries, seriesIx) {\n var segment = this;\n segment.stackPoints = stackPoints;\n LineSegment.fn.init.call(segment, linePoints, currentSeries, seriesIx);\n },\n _linePoints: LineSegment.fn.points\n });\n deepExtend(AreaSegment.fn, AreaSegmentMixin);\n var AreaChart = LineChart.extend({\n createSegment: function (linePoints, currentSeries, seriesIx, prevSegment) {\n var chart = this, options = chart.options, isStacked = options.isStacked, stackPoints, pointType, style = (currentSeries.line || {}).style;\n if (isStacked && seriesIx > 0 && prevSegment) {\n var missingValues = this.seriesMissingValues(currentSeries);\n if (missingValues != 'gap') {\n stackPoints = prevSegment.linePoints;\n } else {\n stackPoints = this._gapStackPoints(linePoints, seriesIx, style);\n }\n if (style !== STEP) {\n stackPoints = stackPoints.slice(0).reverse();\n }\n }\n if (style === SMOOTH) {\n return new SplineAreaSegment(linePoints, prevSegment, isStacked, currentSeries, seriesIx);\n }\n if (style === STEP) {\n pointType = StepAreaSegment;\n } else {\n pointType = AreaSegment;\n }\n return new pointType(linePoints, stackPoints, currentSeries, seriesIx);\n },\n reflow: function (targetBox) {\n LineChart.fn.reflow.call(this, targetBox);\n var stackPoints = this._stackPoints;\n if (stackPoints) {\n var stackPoint, pointSlot;\n for (var idx = 0; idx < stackPoints.length; idx++) {\n stackPoint = stackPoints[idx];\n pointSlot = this.categoryAxis.getSlot(stackPoint.categoryIx);\n stackPoint.reflow(pointSlot);\n }\n }\n },\n _gapStackPoints: function (linePoints, seriesIx, style) {\n var seriesPoints = this.seriesPoints;\n var startIdx = linePoints[0].categoryIx;\n var endIdx = startIdx + linePoints.length;\n var stackPoints = [];\n var currentSeriesIx;\n var point, gapStackPoint;\n this._stackPoints = this._stackPoints || [];\n for (var idx = startIdx; idx < endIdx; idx++) {\n currentSeriesIx = seriesIx;\n do {\n currentSeriesIx--;\n point = seriesPoints[currentSeriesIx][idx];\n } while (currentSeriesIx > 0 && !point);\n if (point) {\n if (style !== STEP && idx > startIdx && !seriesPoints[currentSeriesIx][idx - 1]) {\n stackPoints.push(this._previousSegmentPoint(idx, idx - 1, currentSeriesIx));\n }\n stackPoints.push(point);\n if (style !== STEP && idx + 1 < endIdx && !seriesPoints[currentSeriesIx][idx + 1]) {\n stackPoints.push(this._previousSegmentPoint(idx, idx + 1, currentSeriesIx));\n }\n } else {\n gapStackPoint = this._createGapStackPoint(idx);\n this._stackPoints.push(gapStackPoint);\n stackPoints.push(gapStackPoint);\n }\n }\n return stackPoints;\n },\n _previousSegmentPoint: function (categoryIx, segmentIx, seriesIdx) {\n var seriesPoints = this.seriesPoints;\n var point;\n while (seriesIdx > 0 && !point) {\n seriesIdx--;\n point = seriesPoints[seriesIdx][segmentIx];\n }\n if (!point) {\n point = this._createGapStackPoint(categoryIx);\n this._stackPoints.push(point);\n } else {\n point = seriesPoints[seriesIdx][categoryIx];\n }\n return point;\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 return point;\n },\n seriesMissingValues: function (series) {\n return series.missingValues || ZERO;\n }\n });\n var SplineAreaSegment = AreaSegment.extend({\n init: function (linePoints, prevSegment, isStacked, currentSeries, seriesIx) {\n var segment = this;\n segment.prevSegment = prevSegment;\n segment.isStacked = isStacked;\n LineSegment.fn.init.call(segment, linePoints, currentSeries, seriesIx);\n },\n strokeSegments: function () {\n var segments = this._strokeSegments;\n if (!segments) {\n var curveProcessor = new CurveProcessor(this.options.closed);\n var linePoints = LineSegment.fn.points.call(this);\n segments = this._strokeSegments = curveProcessor.process(linePoints);\n }\n return segments;\n },\n createVisual: function () {\n var series = this.series;\n var defaults = series._defaults;\n var color = series.color;\n if (isFn(color) && defaults) {\n color = defaults.color;\n }\n this.visual = new draw.Group({ zIndex: series.zIndex });\n this.createFill({\n fill: {\n color: color,\n opacity: series.opacity\n },\n stroke: null\n });\n this.createStroke({\n stroke: deepExtend({\n color: color,\n opacity: series.opacity,\n lineCap: 'butt'\n }, series.line)\n });\n },\n createFill: function (style) {\n var strokeSegments = this.strokeSegments();\n var fillSegments = strokeSegments.slice(0);\n var prevSegment = this.prevSegment;\n if (this.isStacked && prevSegment) {\n var prevStrokeSegments = prevSegment.strokeSegments();\n var prevAnchor = last(prevStrokeSegments).anchor();\n fillSegments.push(new draw.Segment(prevAnchor, prevAnchor, last(strokeSegments).anchor()));\n var stackSegments = $.map(prevStrokeSegments, function (segment) {\n return new draw.Segment(segment.anchor(), segment.controlOut(), segment.controlIn());\n }).reverse();\n append(fillSegments, stackSegments);\n var firstAnchor = fillSegments[0].anchor();\n fillSegments.push(new draw.Segment(firstAnchor, firstAnchor, last(stackSegments).anchor()));\n }\n var fill = new draw.Path(style);\n fill.segments.push.apply(fill.segments, fillSegments);\n this.closeFill(fill);\n this.visual.append(fill);\n },\n closeFill: function (fillPath) {\n var segment = this, chart = segment.parent, prevSegment = segment.prevSegment, plotArea = chart.plotArea, invertAxes = chart.options.invertAxes, valueAxis = chart.seriesValueAxis(segment.series), valueAxisLineBox = valueAxis.lineBox(), categoryAxis = plotArea.seriesCategoryAxis(segment.series), categoryAxisLineBox = categoryAxis.lineBox(), end = invertAxes ? categoryAxisLineBox.x1 : categoryAxisLineBox.y1, pos = invertAxes ? X : Y, segments = segment.strokeSegments(), firstPoint = segments[0].anchor(), lastPoint = last(segments).anchor();\n end = limitValue(end, valueAxisLineBox[pos + 1], valueAxisLineBox[pos + 2]);\n if (!(chart.options.isStacked && prevSegment) && segments.length > 1) {\n if (invertAxes) {\n fillPath.lineTo(end, lastPoint.y).lineTo(end, firstPoint.y);\n } else {\n fillPath.lineTo(lastPoint.x, end).lineTo(firstPoint.x, end);\n }\n }\n },\n createStroke: function (style) {\n if (style.stroke.width > 0) {\n var stroke = new draw.Path(style);\n stroke.segments.push.apply(stroke.segments, this.strokeSegments());\n this.visual.append(stroke);\n }\n }\n });\n var StepAreaSegment = StepLineSegment.extend({\n init: function (linePoints, stackPoints, currentSeries, seriesIx) {\n var segment = this;\n segment.stackPoints = stackPoints;\n StepLineSegment.fn.init.call(segment, linePoints, currentSeries, seriesIx);\n },\n _linePoints: StepLineSegment.fn.points\n });\n deepExtend(StepAreaSegment.fn, AreaSegmentMixin);\n var ScatterChart = ChartElement.extend({\n init: function (plotArea, options) {\n var chart = this;\n ChartElement.fn.init.call(chart, options);\n chart.plotArea = plotArea;\n chart.xAxisRanges = {};\n chart.yAxisRanges = {};\n chart.points = [];\n chart.seriesPoints = [];\n chart.seriesOptions = [];\n chart._evalSeries = [];\n chart.render();\n },\n options: {\n series: [],\n tooltip: { format: '{0}, {1}' },\n labels: { format: '{0}, {1}' },\n clip: true\n },\n render: function () {\n var chart = this;\n chart.traverseDataPoints(proxy(chart.addValue, chart));\n },\n addErrorBar: function (point, field, fields) {\n var errorRange, chart = this, value = point.value[field], valueErrorField = field + 'Value', lowField = field + 'ErrorLow', highField = field + 'ErrorHigh', seriesIx = fields.seriesIx, series = fields.series, errorBars = point.options.errorBars, lowValue = fields[lowField], highValue = fields[highField];\n if (isNumber(value)) {\n if (isNumber(lowValue) && isNumber(highValue)) {\n errorRange = {\n low: lowValue,\n high: highValue\n };\n }\n if (errorBars && defined(errorBars[valueErrorField])) {\n chart.seriesErrorRanges = chart.seriesErrorRanges || {\n x: [],\n y: []\n };\n chart.seriesErrorRanges[field][seriesIx] = chart.seriesErrorRanges[field][seriesIx] || new ErrorRangeCalculator(errorBars[valueErrorField], series, field);\n errorRange = chart.seriesErrorRanges[field][seriesIx].getErrorRange(value, errorBars[valueErrorField]);\n }\n if (errorRange) {\n chart.addPointErrorBar(errorRange, point, field);\n }\n }\n },\n addPointErrorBar: function (errorRange, point, field) {\n var chart = this, low = errorRange.low, high = errorRange.high, series = point.series, isVertical = field === Y, options = point.options.errorBars, item = {}, errorBar;\n point[field + 'Low'] = low;\n point[field + 'High'] = high;\n point.errorBars = point.errorBars || [];\n errorBar = new ScatterErrorBar(low, high, isVertical, chart, series, options);\n point.errorBars.push(errorBar);\n point.append(errorBar);\n item[field] = low;\n chart.updateRange(item, series);\n item[field] = high;\n chart.updateRange(item, series);\n },\n addValue: function (value, fields) {\n var chart = this, point, x = value.x, y = value.y, seriesIx = fields.seriesIx, series = this.options.series[seriesIx], missingValues = this.seriesMissingValues(series), seriesPoints = chart.seriesPoints[seriesIx];\n if (!(hasValue(x) && hasValue(y))) {\n value = this.createMissingValue(value, missingValues);\n }\n if (value) {\n point = chart.createPoint(value, fields);\n if (point) {\n extend(point, fields);\n chart.addErrorBar(point, X, fields);\n chart.addErrorBar(point, Y, fields);\n }\n chart.updateRange(value, fields.series);\n }\n chart.points.push(point);\n seriesPoints.push(point);\n },\n seriesMissingValues: function (series) {\n return series.missingValues;\n },\n createMissingValue: noop,\n updateRange: function (value, series) {\n var chart = this, x = value.x, y = value.y, xAxisName = series.xAxis, yAxisName = series.yAxis, xAxisRange = chart.xAxisRanges[xAxisName], yAxisRange = chart.yAxisRanges[yAxisName];\n if (hasValue(x)) {\n xAxisRange = chart.xAxisRanges[xAxisName] = xAxisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n if (typeof x === STRING) {\n x = toDate(x);\n }\n xAxisRange.min = math.min(xAxisRange.min, x);\n xAxisRange.max = math.max(xAxisRange.max, x);\n }\n if (hasValue(y)) {\n yAxisRange = chart.yAxisRanges[yAxisName] = yAxisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n if (typeof y === STRING) {\n y = toDate(y);\n }\n yAxisRange.min = math.min(yAxisRange.min, y);\n yAxisRange.max = math.max(yAxisRange.max, y);\n }\n },\n evalPointOptions: function (options, value, fields) {\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var state = {\n defaults: series._defaults,\n excluded: [\n 'data',\n 'tooltip',\n 'tempate',\n 'visual',\n 'toggle',\n '_outOfRangeMinPoint',\n '_outOfRangeMaxPoint'\n ]\n };\n var doEval = this._evalSeries[seriesIx];\n if (!defined(doEval)) {\n this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n }\n if (doEval) {\n options = deepExtend({}, options);\n evalOptions(options, {\n value: value,\n series: series,\n dataItem: fields.dataItem\n }, state);\n }\n return options;\n },\n pointType: function () {\n return LinePoint;\n },\n pointOptions: function (series, seriesIx) {\n var options = this.seriesOptions[seriesIx];\n if (!options) {\n var defaults = this.pointType().fn.defaults;\n this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n markers: { opacity: series.opacity },\n tooltip: { format: this.options.tooltip.format },\n labels: { format: this.options.labels.format }\n }, series);\n }\n return options;\n },\n createPoint: function (value, fields) {\n var chart = this, series = fields.series, point;\n var pointOptions = this.pointOptions(series, fields.seriesIx);\n var color = fields.color || series.color;\n pointOptions = chart.evalPointOptions(pointOptions, value, fields);\n if (kendo.isFunction(series.color)) {\n color = pointOptions.color;\n }\n point = new LinePoint(value, pointOptions);\n point.color = color;\n chart.append(point);\n return point;\n },\n seriesAxes: function (series) {\n var plotArea = this.plotArea, xAxisName = series.xAxis, xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX, yAxisName = series.yAxis, yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n if (!xAxis) {\n throw new Error('Unable to locate X axis with name ' + xAxisName);\n }\n if (!yAxis) {\n throw new Error('Unable to locate Y axis with name ' + yAxisName);\n }\n return {\n x: xAxis,\n y: yAxis\n };\n },\n reflow: function (targetBox) {\n var chart = this, chartPoints = chart.points, pointIx = 0, point, seriesAxes, limit = !chart.options.clip;\n chart.traverseDataPoints(function (value, fields) {\n point = chartPoints[pointIx++];\n seriesAxes = chart.seriesAxes(fields.series);\n var slotX = seriesAxes.x.getSlot(value.x, value.x, limit), slotY = seriesAxes.y.getSlot(value.y, value.y, limit), pointSlot;\n if (point) {\n if (slotX && slotY) {\n pointSlot = chart.pointSlot(slotX, slotY);\n point.reflow(pointSlot);\n } else {\n point.visible = false;\n }\n }\n });\n chart.box = targetBox;\n },\n pointSlot: function (slotX, slotY) {\n return new Box2D(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n },\n traverseDataPoints: function (callback) {\n var chart = this, options = chart.options, series = options.series, seriesPoints = chart.seriesPoints, pointIx, seriesIx, currentSeries, currentSeriesPoints, pointData, value, fields;\n for (seriesIx = 0; seriesIx < series.length; seriesIx++) {\n currentSeries = series[seriesIx];\n currentSeriesPoints = seriesPoints[seriesIx];\n if (!currentSeriesPoints) {\n seriesPoints[seriesIx] = [];\n }\n for (pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n pointData = this._bindPoint(currentSeries, seriesIx, pointIx);\n value = pointData.valueFields;\n fields = pointData.fields;\n callback(value, deepExtend({\n pointIx: pointIx,\n series: currentSeries,\n seriesIx: seriesIx,\n dataItem: currentSeries.data[pointIx],\n owner: chart\n }, fields));\n }\n }\n },\n _bindPoint: CategoricalChart.fn._bindPoint,\n formatPointValue: function (point, format) {\n var value = point.value;\n return autoFormat(format, value.x, value.y);\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 deepExtend(ScatterChart.fn, ClipAnimationMixin);\n var ScatterLineChart = ScatterChart.extend({\n render: function () {\n var chart = this;\n ScatterChart.fn.render.call(chart);\n chart.renderSegments();\n },\n createSegment: function (linePoints, currentSeries, seriesIx) {\n var pointType, style = currentSeries.style;\n if (style === SMOOTH) {\n pointType = SplineSegment;\n } else {\n pointType = LineSegment;\n }\n return new pointType(linePoints, currentSeries, seriesIx);\n },\n animationPoints: function () {\n var points = ScatterChart.fn.animationPoints.call(this);\n return points.concat(this._segments);\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 deepExtend(ScatterLineChart.fn, LineChartMixin);\n var BubbleChart = ScatterChart.extend({\n init: function (plotArea, options) {\n this._maxSize = MIN_VALUE;\n ScatterChart.fn.init.call(this, plotArea, options);\n },\n options: {\n tooltip: { format: '{3}' },\n labels: { format: '{3}' }\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 reflow: function (box) {\n var chart = this;\n chart.updateBubblesSize(box);\n ScatterChart.fn.reflow.call(chart, box);\n },\n pointType: function () {\n return Bubble;\n },\n createPoint: function (value, fields) {\n var chart = this, series = fields.series, pointsCount = series.data.length, delay = fields.pointIx * (INITIAL_ANIMATION_DURATION / pointsCount), animationOptions = {\n delay: delay,\n duration: INITIAL_ANIMATION_DURATION - delay,\n type: BUBBLE\n }, point, pointOptions;\n var color = fields.color || series.color;\n if (value.size < 0 && series.negativeValues.visible) {\n color = valueOrDefault(series.negativeValues.color, color);\n }\n 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 pointOptions = chart.evalPointOptions(pointOptions, value, fields);\n if (kendo.isFunction(series.color)) {\n color = pointOptions.color;\n }\n pointOptions.markers.background = color;\n point = new Bubble(value, pointOptions);\n point.color = color;\n chart.append(point);\n return point;\n },\n updateBubblesSize: function (box) {\n var chart = this, options = chart.options, series = options.series, boxSize = math.min(box.width(), box.height()), seriesIx, pointIx;\n for (seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx], seriesPoints = chart.seriesPoints[seriesIx], minSize = currentSeries.minSize || math.max(boxSize * 0.02, 10), maxSize = currentSeries.maxSize || boxSize * 0.2, minR = minSize / 2, maxR = maxSize / 2, minArea = math.PI * minR * minR, maxArea = math.PI * maxR * maxR, areaRange = maxArea - minArea, areaRatio = areaRange / chart._maxSize;\n for (pointIx = 0; pointIx < seriesPoints.length; pointIx++) {\n var point = seriesPoints[pointIx];\n if (point) {\n var area = math.abs(point.value.size) * areaRatio, r = math.sqrt((minArea + area) / math.PI), baseZIndex = valueOrDefault(point.options.zIndex, 0), zIndex = baseZIndex + (1 - r / maxR);\n deepExtend(point.options, {\n zIndex: zIndex,\n markers: {\n size: r * 2,\n zIndex: zIndex\n },\n labels: { zIndex: zIndex + 1 }\n });\n }\n }\n }\n },\n formatPointValue: function (point, format) {\n var value = point.value;\n return autoFormat(format, value.x, value.y, value.size, point.category);\n },\n createAnimation: noop,\n createVisual: noop\n });\n var Candlestick = ChartElement.extend({\n init: function (value, options) {\n ChartElement.fn.init.call(this, options);\n this.value = value;\n },\n options: {\n vertical: true,\n border: { _brightness: 0.8 },\n line: { width: 2 },\n overlay: { gradient: GLASS },\n tooltip: { format: '' + '{4:d} | ' + 'Open: | {0:C} |
' + 'High: | {1:C} |
' + 'Low: | {2:C} |
' + 'Close: | {3:C} |
' + '
' },\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 reflow: function (box) {\n var point = this, options = point.options, chart = point.owner, value = point.value, valueAxis = chart.seriesValueAxis(options), points = [], mid, ocSlot, lhSlot;\n ocSlot = valueAxis.getSlot(value.open, value.close);\n lhSlot = valueAxis.getSlot(value.low, value.high);\n ocSlot.x1 = lhSlot.x1 = box.x1;\n ocSlot.x2 = lhSlot.x2 = box.x2;\n point.realBody = ocSlot;\n mid = lhSlot.center().x;\n points.push([\n [\n mid,\n lhSlot.y1\n ],\n [\n mid,\n ocSlot.y1\n ]\n ]);\n points.push([\n [\n mid,\n ocSlot.y2\n ],\n [\n mid,\n lhSlot.y2\n ]\n ]);\n point.lines = points;\n point.box = lhSlot.clone().wrap(ocSlot);\n if (!point._rendered) {\n point._rendered = true;\n point.createNote();\n }\n point.reflowNote();\n },\n reflowNote: function () {\n var point = this;\n if (point.note) {\n point.note.reflow(point.box);\n }\n },\n createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n this._mainVisual = this.mainVisual(this.options);\n this.visual.append(this._mainVisual);\n this.createOverlay();\n },\n mainVisual: function (options) {\n var group = new draw.Group();\n this.createBody(group, options);\n this.createLines(group, options);\n return group;\n },\n createBody: function (container, options) {\n var body = draw.Path.fromRect(this.realBody.toRect(), {\n fill: {\n color: this.color,\n opacity: options.opacity\n },\n stroke: null\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 alignPathToPixel(body);\n container.append(body);\n if (hasGradientOverlay(options)) {\n container.append(this.createGradientOverlay(body, { baseColor: this.color }, deepExtend({\n end: !options.vertical ? [\n 0,\n 1\n ] : undefined\n }, options.overlay)));\n }\n },\n createLines: function (container, options) {\n this.drawLines(container, options, this.lines, options.line);\n },\n drawLines: function (container, options, lines, lineOptions) {\n if (!lines) {\n return;\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 for (var i = 0; i < lines.length; i++) {\n var line = draw.Path.fromPoints(lines[i], lineStyle);\n alignPathToPixel(line);\n container.append(line);\n }\n },\n getBorderColor: function () {\n var point = this, options = point.options, border = options.border, borderColor = border.color;\n if (!defined(borderColor)) {\n borderColor = new Color(point.color).brightness(border._brightness).toHex();\n }\n return borderColor;\n },\n createOverlay: function () {\n var overlay = draw.Path.fromRect(this.box.toRect(), {\n fill: {\n color: WHITE,\n opacity: 0\n },\n stroke: null\n });\n this.visual.append(overlay);\n },\n createHighlight: function () {\n var highlight = this.options.highlight;\n var normalColor = this.color;\n this.color = highlight.color || this.color;\n var overlay = this.mainVisual(deepExtend({}, this.options, { line: { color: this.getBorderColor() } }, highlight));\n this.color = normalColor;\n return overlay;\n },\n highlightVisual: function () {\n return this._mainVisual;\n },\n highlightVisualArgs: function () {\n return {\n options: this.options,\n rect: this.box.toRect(),\n visual: this._mainVisual\n };\n },\n tooltipAnchor: function () {\n var point = this, box = point.box, clipBox = point.owner.pane.clipBox() || box;\n return new Point2D(box.x2 + TOOLTIP_OFFSET, math.max(box.y1, clipBox.y1) + TOOLTIP_OFFSET);\n },\n formatValue: function (format) {\n var point = this;\n return point.owner.formatPointValue(point, format);\n },\n overlapsBox: function (box) {\n return this.box.overlaps(box);\n }\n });\n deepExtend(Candlestick.fn, PointEventsMixin);\n deepExtend(Candlestick.fn, NoteMixin);\n var CandlestickChart = CategoricalChart.extend({\n options: {},\n reflowCategories: function (categorySlots) {\n var chart = this, children = chart.children, childrenLength = children.length, i;\n for (i = 0; i < childrenLength; i++) {\n children[i].reflow(categorySlots[i]);\n }\n },\n addValue: function (data, fields) {\n var chart = this;\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var options = chart.options;\n var value = data.valueFields;\n var children = chart.children;\n var valueParts = chart.splitValue(value);\n var hasValue = areNumbers(valueParts);\n var categoryPoints = chart.categoryPoints[categoryIx];\n var dataItem = series.data[categoryIx];\n var point, cluster;\n if (!categoryPoints) {\n chart.categoryPoints[categoryIx] = categoryPoints = [];\n }\n if (hasValue) {\n point = chart.createPoint(data, fields);\n }\n cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing\n });\n chart.append(cluster);\n }\n if (point) {\n chart.updateRange(value, fields);\n cluster.append(point);\n point.categoryIx = categoryIx;\n point.category = category;\n point.series = series;\n point.seriesIx = seriesIx;\n point.owner = chart;\n point.dataItem = dataItem;\n point.noteText = data.fields.noteText;\n }\n chart.points.push(point);\n categoryPoints.push(point);\n },\n pointType: function () {\n return Candlestick;\n },\n createPoint: function (data, fields) {\n var chart = this;\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 var pointOptions = deepExtend({}, series);\n var pointType = chart.pointType();\n var color = data.fields.color || series.color;\n pointOptions = chart.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n if (series.type == CANDLESTICK) {\n if (value.open > value.close) {\n color = data.fields.downColor || series.downColor || series.color;\n }\n }\n if (kendo.isFunction(series.color)) {\n color = pointOptions.color;\n }\n pointOptions.vertical = !chart.options.invertAxes;\n var point = new pointType(value, pointOptions);\n point.color = color;\n return point;\n },\n splitValue: function (value) {\n return [\n value.low,\n value.open,\n value.close,\n value.high\n ];\n },\n updateRange: function (value, fields) {\n var chart = this, axisName = fields.series.axis, axisRange = chart.valueAxisRanges[axisName], parts = chart.splitValue(value);\n axisRange = chart.valueAxisRanges[axisName] = axisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n axisRange = chart.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 formatPointValue: function (point, format) {\n var value = point.value;\n return autoFormat(format, value.open, value.high, value.low, value.close, point.category);\n },\n animationPoints: function () {\n return this.points;\n }\n });\n deepExtend(CandlestickChart.fn, ClipAnimationMixin);\n var OHLCPoint = Candlestick.extend({\n reflow: function (box) {\n var point = this, options = point.options, chart = point.owner, value = point.value, valueAxis = chart.seriesValueAxis(options), oPoints = [], cPoints = [], lhPoints = [], mid, oSlot, cSlot, lhSlot;\n lhSlot = valueAxis.getSlot(value.low, value.high);\n oSlot = valueAxis.getSlot(value.open, value.open);\n cSlot = valueAxis.getSlot(value.close, value.close);\n oSlot.x1 = cSlot.x1 = lhSlot.x1 = box.x1;\n oSlot.x2 = cSlot.x2 = lhSlot.x2 = box.x2;\n mid = lhSlot.center().x;\n oPoints.push([\n oSlot.x1,\n oSlot.y1\n ]);\n oPoints.push([\n mid,\n oSlot.y1\n ]);\n cPoints.push([\n mid,\n cSlot.y1\n ]);\n cPoints.push([\n cSlot.x2,\n cSlot.y1\n ]);\n lhPoints.push([\n mid,\n lhSlot.y1\n ]);\n lhPoints.push([\n mid,\n lhSlot.y2\n ]);\n point.lines = [\n oPoints,\n cPoints,\n lhPoints\n ];\n point.box = lhSlot.clone().wrap(oSlot.clone().wrap(cSlot));\n point.reflowNote();\n },\n createBody: $.noop\n });\n var OHLCChart = CandlestickChart.extend({\n pointType: function () {\n return OHLCPoint;\n }\n });\n var BoxPlotChart = CandlestickChart.extend({\n addValue: function (data, fields) {\n var chart = this;\n var categoryIx = fields.categoryIx;\n var category = fields.category;\n var series = fields.series;\n var seriesIx = fields.seriesIx;\n var options = chart.options;\n var children = chart.children;\n var value = data.valueFields;\n var valueParts = chart.splitValue(value);\n var hasValue = areNumbers(valueParts);\n var categoryPoints = chart.categoryPoints[categoryIx];\n var dataItem = series.data[categoryIx];\n var point, cluster;\n if (!categoryPoints) {\n chart.categoryPoints[categoryIx] = categoryPoints = [];\n }\n if (hasValue) {\n point = chart.createPoint(data, fields);\n }\n cluster = children[categoryIx];\n if (!cluster) {\n cluster = new ClusterLayout({\n vertical: options.invertAxes,\n gap: options.gap,\n spacing: options.spacing\n });\n chart.append(cluster);\n }\n if (point) {\n chart.updateRange(value, fields);\n cluster.append(point);\n point.categoryIx = categoryIx;\n point.category = category;\n point.series = series;\n point.seriesIx = seriesIx;\n point.owner = chart;\n point.dataItem = dataItem;\n }\n chart.points.push(point);\n categoryPoints.push(point);\n },\n pointType: function () {\n if (this.options.invertAxes) {\n return VerticalBoxPlot;\n }\n return BoxPlot;\n },\n splitValue: function (value) {\n return [\n value.lower,\n value.q1,\n value.median,\n value.q3,\n value.upper\n ];\n },\n updateRange: function (value, fields) {\n var chart = this, axisName = fields.series.axis, axisRange = chart.valueAxisRanges[axisName], parts = chart.splitValue(value).concat(chart.filterOutliers(value.outliers));\n if (defined(value.mean)) {\n parts = parts.concat(value.mean);\n }\n axisRange = chart.valueAxisRanges[axisName] = axisRange || {\n min: MAX_VALUE,\n max: MIN_VALUE\n };\n axisRange = chart.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 formatPointValue: function (point, format) {\n var value = point.value;\n return autoFormat(format, value.lower, value.q1, value.median, value.q3, value.upper, value.mean, point.category);\n },\n filterOutliers: function (items) {\n var length = (items || []).length, result = [], i, item;\n for (i = 0; i < length; i++) {\n item = items[i];\n if (defined(item)) {\n appendIfNotNull(result, item);\n }\n }\n return result;\n }\n });\n var BoxPlot = Candlestick.extend({\n init: function (value, options) {\n var point = this;\n ChartElement.fn.init.call(point, options);\n point.value = value;\n point.createNote();\n },\n options: {\n border: { _brightness: 0.8 },\n line: { width: 2 },\n mean: {\n width: 2,\n dashType: 'dash'\n },\n overlay: { gradient: GLASS },\n tooltip: { format: '' + '{6:d} | ' + 'Lower: | {0:C} |
' + 'Q1: | {1:C} |
' + 'Median: | {2:C} |
' + 'Mean: | {5:C} |
' + 'Q3: | {3:C} |
' + 'Upper: | {4:C} |
' + '
' },\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: 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 reflow: function (box) {\n var point = this, options = point.options, chart = point.owner, value = point.value, valueAxis = chart.seriesValueAxis(options), whiskerSlot, boxSlot, medianSlot, meanSlot;\n point.boxSlot = boxSlot = valueAxis.getSlot(value.q1, value.q3);\n point.realBody = boxSlot;\n point.reflowBoxSlot(box);\n point.whiskerSlot = whiskerSlot = valueAxis.getSlot(value.lower, value.upper);\n point.reflowWhiskerSlot(box);\n medianSlot = valueAxis.getSlot(value.median);\n if (value.mean) {\n meanSlot = valueAxis.getSlot(value.mean);\n point.meanPoints = point.calcMeanPoints(box, meanSlot);\n }\n point.whiskerPoints = point.calcWhiskerPoints(boxSlot, whiskerSlot);\n point.medianPoints = point.calcMedianPoints(box, medianSlot);\n point.box = whiskerSlot.clone().wrap(boxSlot);\n point.reflowNote();\n },\n reflowBoxSlot: function (box) {\n this.boxSlot.x1 = box.x1;\n this.boxSlot.x2 = box.x2;\n },\n reflowWhiskerSlot: function (box) {\n this.whiskerSlot.x1 = box.x1;\n this.whiskerSlot.x2 = box.x2;\n },\n calcMeanPoints: function (box, meanSlot) {\n return [[\n [\n box.x1,\n meanSlot.y1\n ],\n [\n box.x2,\n meanSlot.y1\n ]\n ]];\n },\n calcWhiskerPoints: function (boxSlot, whiskerSlot) {\n var mid = whiskerSlot.center().x;\n return [\n [\n [\n mid - 5,\n whiskerSlot.y1\n ],\n [\n mid + 5,\n whiskerSlot.y1\n ],\n [\n mid,\n whiskerSlot.y1\n ],\n [\n mid,\n boxSlot.y1\n ]\n ],\n [\n [\n mid - 5,\n whiskerSlot.y2\n ],\n [\n mid + 5,\n whiskerSlot.y2\n ],\n [\n mid,\n whiskerSlot.y2\n ],\n [\n mid,\n boxSlot.y2\n ]\n ]\n ];\n },\n calcMedianPoints: function (box, medianSlot) {\n return [[\n [\n box.x1,\n medianSlot.y1\n ],\n [\n box.x2,\n medianSlot.y1\n ]\n ]];\n },\n renderOutliers: function (options) {\n var point = this, markers = options.markers || {}, value = point.value, outliers = value.outliers || [], outerFence = math.abs(value.q3 - value.q1) * 3, markersBorder, shape, outlierValue, i;\n var elements = [];\n for (i = 0; i < outliers.length; i++) {\n 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 markersBorder = deepExtend({}, markers.border);\n if (!defined(markersBorder.color)) {\n if (defined(point.color)) {\n markersBorder.color = point.color;\n } else {\n markersBorder.color = new Color(markers.background).brightness(BAR_BORDER_BRIGHTNESS).toHex();\n }\n }\n 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 shape.value = outlierValue;\n elements.push(shape);\n }\n this.reflowOutliers(elements);\n return elements;\n },\n reflowOutliers: function (outliers) {\n var valueAxis = this.owner.seriesValueAxis(this.options);\n var center = this.box.center();\n for (var i = 0; i < outliers.length; i++) {\n var outlierValue = outliers[i].value;\n var markerBox = valueAxis.getSlot(outlierValue);\n if (this.options.vertical) {\n markerBox.move(center.x);\n } else {\n markerBox.move(undefined, center.y);\n }\n this.box = this.box.wrap(markerBox);\n outliers[i].reflow(markerBox);\n }\n },\n mainVisual: function (options) {\n var group = Candlestick.fn.mainVisual.call(this, options);\n var outliers = this.renderOutliers(options);\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 return group;\n },\n createLines: function (container, options) {\n this.drawLines(container, options, this.whiskerPoints, options.line);\n this.drawLines(container, options, this.medianPoints, options.median);\n this.drawLines(container, options, this.meanPoints, options.mean);\n },\n getBorderColor: function () {\n if (this.color) {\n return this.color;\n }\n return Candlestick.getBorderColor.call(this);\n }\n });\n deepExtend(BoxPlot.fn, PointEventsMixin);\n var VerticalBoxPlot = BoxPlot.extend({\n reflowBoxSlot: function (box) {\n this.boxSlot.y1 = box.y1;\n this.boxSlot.y2 = box.y2;\n },\n reflowWhiskerSlot: function (box) {\n this.whiskerSlot.y1 = box.y1;\n this.whiskerSlot.y2 = box.y2;\n },\n calcMeanPoints: function (box, meanSlot) {\n return [[\n [\n meanSlot.x1,\n box.y1\n ],\n [\n meanSlot.x1,\n box.y2\n ]\n ]];\n },\n calcWhiskerPoints: function (boxSlot, whiskerSlot) {\n var mid = whiskerSlot.center().y;\n return [\n [\n [\n whiskerSlot.x1,\n mid - 5\n ],\n [\n whiskerSlot.x1,\n mid + 5\n ],\n [\n whiskerSlot.x1,\n mid\n ],\n [\n boxSlot.x1,\n mid\n ]\n ],\n [\n [\n whiskerSlot.x2,\n mid - 5\n ],\n [\n whiskerSlot.x2,\n mid + 5\n ],\n [\n whiskerSlot.x2,\n mid\n ],\n [\n boxSlot.x2,\n mid\n ]\n ]\n ];\n },\n calcMedianPoints: function (box, medianSlot) {\n return [[\n [\n medianSlot.x1,\n box.y1\n ],\n [\n medianSlot.x1,\n box.y2\n ]\n ]];\n }\n });\n var PieSegment = ChartElement.extend({\n init: function (value, sector, options) {\n var segment = this;\n segment.value = value;\n segment.sector = sector;\n ChartElement.fn.init.call(segment, options);\n },\n options: {\n color: WHITE,\n overlay: { gradient: ROUNDED_BEVEL },\n border: { width: 0.5 },\n labels: {\n visible: false,\n distance: 35,\n font: DEFAULT_FONT,\n margin: getSpacing(0.5),\n align: CIRCLE,\n zIndex: 1,\n position: OUTSIDE_END\n },\n animation: { type: PIE },\n highlight: {\n visible: true,\n border: { width: 1 }\n },\n visible: true\n },\n render: function () {\n var segment = this, options = segment.options, labels = options.labels, labelText = segment.value, labelTemplate;\n if (segment._rendered || segment.visible === false) {\n return;\n } else {\n segment._rendered = true;\n }\n if (labels.template) {\n labelTemplate = template(labels.template);\n labelText = labelTemplate({\n dataItem: segment.dataItem,\n category: segment.category,\n value: segment.value,\n series: segment.series,\n percentage: segment.percentage\n });\n } else if (labels.format) {\n labelText = autoFormat(labels.format, labelText);\n }\n if (labels.visible && labelText) {\n segment.label = new TextBox(labelText, deepExtend({}, labels, {\n align: CENTER,\n vAlign: '',\n animation: {\n type: FADEIN,\n delay: segment.animationDelay\n }\n }));\n segment.append(segment.label);\n }\n },\n reflow: function (targetBox) {\n var segment = this;\n segment.render();\n segment.box = targetBox;\n segment.reflowLabel();\n },\n reflowLabel: function () {\n var segment = this, sector = segment.sector.clone(), options = segment.options, label = segment.label, labelsOptions = options.labels, labelsDistance = labelsOptions.distance, angle = sector.middle(), lp, x1, labelWidth, labelHeight;\n if (label) {\n labelHeight = label.box.height();\n labelWidth = label.box.width();\n if (labelsOptions.position == CENTER) {\n sector.r = math.abs((sector.r - labelHeight) / 2) + labelHeight;\n lp = sector.point(angle);\n label.reflow(Box2D(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else if (labelsOptions.position == INSIDE_END) {\n sector.r = sector.r - labelHeight / 2;\n lp = sector.point(angle);\n label.reflow(Box2D(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else {\n lp = sector.clone().expand(labelsDistance).point(angle);\n if (lp.x >= sector.c.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(Box2D(x1, lp.y - labelHeight, lp.x, lp.y));\n }\n }\n },\n createVisual: function () {\n var segment = this, sector = segment.sector, options = segment.options;\n ChartElement.fn.createVisual.call(this);\n if (segment.value) {\n if (options.visual) {\n var startAngle = (sector.startAngle + 180) % 360;\n var visual = options.visual({\n category: segment.category,\n dataItem: segment.dataItem,\n value: segment.value,\n series: segment.series,\n percentage: segment.percentage,\n center: new geom.Point(sector.c.x, sector.c.y),\n radius: sector.r,\n innerRadius: sector.ir,\n startAngle: startAngle,\n endAngle: startAngle + sector.angle,\n options: options,\n createVisual: function () {\n var group = new draw.Group();\n segment.createSegmentVisual(group);\n return group;\n }\n });\n if (visual) {\n segment.visual.append(visual);\n }\n } else {\n segment.createSegmentVisual(segment.visual);\n }\n }\n },\n createSegmentVisual: function (group) {\n var segment = this, sector = segment.sector, options = segment.options, borderOptions = options.border || {}, border = borderOptions.width > 0 ? {\n stroke: {\n color: borderOptions.color,\n width: borderOptions.width,\n opacity: borderOptions.opacity,\n dashType: borderOptions.dashType\n }\n } : {}, color = options.color, fill = {\n color: color,\n opacity: options.opacity\n }, visual;\n visual = segment.createSegment(sector, deepExtend({\n fill: fill,\n stroke: { opacity: options.opacity },\n zIndex: options.zIndex\n }, border));\n group.append(visual);\n if (hasGradientOverlay(options)) {\n group.append(this.createGradientOverlay(visual, {\n baseColor: color,\n fallbackFill: fill\n }, deepExtend({\n center: [\n sector.c.x,\n sector.c.y\n ],\n innerRadius: sector.ir,\n radius: sector.r,\n userSpace: true\n }, options.overlay)));\n }\n },\n createSegment: function (sector, options) {\n if (options.singleSegment) {\n return new draw.Circle(new geom.Circle(new geom.Point(sector.c.x, sector.c.y), sector.r), options);\n } else {\n return ShapeBuilder.current.createRing(sector, options);\n }\n },\n createAnimation: function () {\n var options = this.options;\n var center = this.sector.c;\n deepExtend(options, {\n animation: {\n center: [\n center.x,\n center.y\n ],\n delay: this.animationDelay\n }\n });\n ChartElement.fn.createAnimation.call(this);\n },\n createHighlight: function (options) {\n var segment = this, highlight = segment.options.highlight || {}, border = highlight.border || {};\n return segment.createSegment(segment.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 highlightVisual: function () {\n return this.visual.children[0];\n },\n highlightVisualArgs: function () {\n var sector = this.sector;\n return {\n options: this.options,\n radius: sector.r,\n innerRadius: sector.ir,\n center: new geom.Point(sector.c.x, sector.c.y),\n startAngle: sector.startAngle,\n endAngle: sector.angle + sector.startAngle,\n visual: this.visual\n };\n },\n tooltipAnchor: function (width, height) {\n var point = this, box = point.sector.adjacentBox(TOOLTIP_OFFSET, width, height);\n return new Point2D(box.x1, box.y1);\n },\n formatValue: function (format) {\n var point = this;\n return point.owner.formatPointValue(point, format);\n }\n });\n deepExtend(PieSegment.fn, PointEventsMixin);\n var PieChartMixin = {\n createLegendItem: function (value, point, options) {\n var chart = this, legendOptions = chart.options.legend || {}, labelsOptions = legendOptions.labels || {}, inactiveItems = legendOptions.inactiveItems || {}, inactiveItemsLabels = inactiveItems.labels || {}, text, labelTemplate, markerColor, itemLabelOptions, pointVisible;\n if (options && options.visibleInLegend !== false) {\n pointVisible = options.visible !== false;\n text = options.category || '';\n labelTemplate = pointVisible ? labelsOptions.template : inactiveItemsLabels.template || labelsOptions.template;\n if (labelTemplate) {\n text = template(labelTemplate)({\n text: text,\n series: options.series,\n dataItem: options.dataItem,\n percentage: options.percentage,\n value: value\n });\n }\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 if (text) {\n chart.legendItems.push({\n pointIndex: options.index,\n text: text,\n series: options.series,\n markerColor: markerColor,\n labels: itemLabelOptions\n });\n }\n }\n }\n };\n var PieChart = ChartElement.extend({\n init: function (plotArea, options) {\n var chart = this;\n ChartElement.fn.init.call(chart, options);\n chart.plotArea = plotArea;\n chart.points = [];\n chart.legendItems = [];\n chart.render();\n },\n options: {\n startAngle: 90,\n connectors: {\n width: 1,\n color: '#939393',\n padding: 4\n },\n inactiveItems: {\n markers: {},\n labels: {}\n }\n },\n render: function () {\n var chart = this;\n chart.traverseDataPoints(proxy(chart.addValue, chart));\n },\n traverseDataPoints: function (callback) {\n var chart = this, options = chart.options, colors = chart.plotArea.options.seriesColors || [], colorsCount = colors.length, series = options.series, seriesCount = series.length, currentSeries, pointData, fields, seriesIx, angle, data, anglePerValue, value, plotValue, explode, total, currentAngle, i, pointIx = 0;\n for (seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n currentSeries = series[seriesIx];\n data = currentSeries.data;\n total = seriesTotal(currentSeries);\n anglePerValue = 360 / total;\n if (defined(currentSeries.startAngle)) {\n currentAngle = currentSeries.startAngle;\n } else {\n currentAngle = options.startAngle;\n }\n if (seriesIx != seriesCount - 1) {\n if (currentSeries.labels.position == OUTSIDE_END) {\n currentSeries.labels.position = CENTER;\n }\n }\n for (i = 0; i < data.length; i++) {\n pointData = SeriesBinder.current.bindPoint(currentSeries, i);\n value = pointData.valueFields.value;\n plotValue = math.abs(value);\n fields = pointData.fields;\n angle = plotValue * anglePerValue;\n explode = data.length != 1 && !!fields.explode;\n if (!isFn(currentSeries.color)) {\n currentSeries.color = fields.color || colors[i % colorsCount];\n }\n callback(value, new Ring(null, 0, 0, currentAngle, angle), {\n owner: chart,\n category: fields.category || '',\n index: pointIx,\n series: currentSeries,\n seriesIx: seriesIx,\n dataItem: data[i],\n percentage: total !== 0 ? plotValue / total : 0,\n explode: explode,\n visibleInLegend: fields.visibleInLegend,\n visible: fields.visible,\n zIndex: seriesCount - seriesIx,\n animationDelay: chart.animationDelay(i, seriesIx, seriesCount)\n });\n if (pointData.fields.visible !== false) {\n currentAngle += angle;\n }\n pointIx++;\n }\n pointIx = 0;\n }\n },\n evalSegmentOptions: function (options, value, fields) {\n var series = fields.series;\n evalOptions(options, {\n value: value,\n series: series,\n dataItem: fields.dataItem,\n category: fields.category,\n percentage: fields.percentage\n }, {\n defaults: series._defaults,\n excluded: [\n 'data',\n 'template',\n 'visual',\n 'toggle'\n ]\n });\n },\n addValue: function (value, sector, fields) {\n var chart = this, segment;\n var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n chart.evalSegmentOptions(segmentOptions, value, fields);\n chart.createLegendItem(value, segmentOptions, fields);\n if (fields.visible === false) {\n return;\n }\n segment = new PieSegment(value, sector, segmentOptions);\n extend(segment, fields);\n chart.append(segment);\n chart.points.push(segment);\n },\n reflow: function (targetBox) {\n var chart = this, options = chart.options, box = targetBox.clone(), space = 5, minWidth = math.min(box.width(), box.height()), halfMinWidth = minWidth / 2, defaultPadding = minWidth - minWidth * 0.85, padding = valueOrDefault(options.padding, defaultPadding), newBox = Box2D(box.x1, box.y1, box.x1 + minWidth, box.y1 + minWidth), newBoxCenter = newBox.center(), seriesConfigs = chart.seriesConfigs || [], boxCenter = box.center(), points = chart.points, count = points.length, seriesCount = options.series.length, leftSideLabels = [], rightSideLabels = [], seriesConfig, seriesIndex, label, segment, sector, r, i, c;\n padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n newBox.translate(boxCenter.x - newBoxCenter.x, boxCenter.y - newBoxCenter.y);\n r = halfMinWidth - padding;\n c = Point2D(r + newBox.x1 + padding, r + newBox.y1 + padding);\n for (i = 0; i < count; i++) {\n segment = points[i];\n sector = segment.sector;\n sector.r = r;\n sector.c = c;\n seriesIndex = segment.seriesIx;\n if (seriesConfigs.length) {\n seriesConfig = seriesConfigs[seriesIndex];\n sector.ir = seriesConfig.ir;\n sector.r = seriesConfig.r;\n }\n if (seriesIndex == seriesCount - 1 && segment.explode) {\n sector.c = sector.clone().radius(sector.r * 0.15).point(sector.middle());\n }\n segment.reflow(newBox);\n 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 if (leftSideLabels.length > 0) {\n leftSideLabels.sort(chart.labelComparator(true));\n chart.leftLabelsReflow(leftSideLabels);\n }\n if (rightSideLabels.length > 0) {\n rightSideLabels.sort(chart.labelComparator(false));\n chart.rightLabelsReflow(rightSideLabels);\n }\n chart.box = newBox;\n },\n leftLabelsReflow: function (labels) {\n var chart = this, distances = chart.distanceBetweenLabels(labels);\n chart.distributeLabels(distances, labels);\n },\n rightLabelsReflow: function (labels) {\n var chart = this, distances = chart.distanceBetweenLabels(labels);\n chart.distributeLabels(distances, labels);\n },\n distanceBetweenLabels: function (labels) {\n var chart = this, points = chart.points, segment = points[points.length - 1], sector = segment.sector, firstBox = labels[0].box, count = labels.length - 1, lr = sector.r + segment.options.labels.distance, distances = [], secondBox, distance, i;\n distance = round(firstBox.y1 - (sector.c.y - lr - firstBox.height() - firstBox.height() / 2));\n distances.push(distance);\n for (i = 0; i < count; i++) {\n firstBox = labels[i].box;\n secondBox = labels[i + 1].box;\n distance = round(secondBox.y1 - firstBox.y2);\n distances.push(distance);\n }\n distance = round(sector.c.y + lr - labels[count].box.y2 - labels[count].box.height() / 2);\n distances.push(distance);\n return distances;\n },\n distributeLabels: function (distances, labels) {\n var chart = this, count = distances.length, remaining, left, right, i;\n for (i = 0; i < count; i++) {\n left = right = i;\n remaining = -distances[i];\n while (remaining > 0 && (left >= 0 || right < count)) {\n remaining = chart._takeDistance(distances, i, --left, remaining);\n remaining = chart._takeDistance(distances, i, ++right, remaining);\n }\n }\n chart.reflowLabels(distances, labels);\n },\n _takeDistance: function (distances, anchor, position, amount) {\n if (distances[position] > 0) {\n var available = math.min(distances[position], amount);\n amount -= available;\n distances[position] -= available;\n distances[anchor] += available;\n }\n return amount;\n },\n reflowLabels: function (distances, labels) {\n var chart = this, points = chart.points, segment = points[points.length - 1], sector = segment.sector, labelsCount = labels.length, labelOptions = segment.options.labels, labelDistance = labelOptions.distance, boxY = sector.c.y - (sector.r + labelDistance) - labels[0].box.height(), label, boxX, box, i;\n distances[0] += 2;\n for (i = 0; i < labelsCount; i++) {\n label = labels[i];\n boxY += distances[i];\n box = label.box;\n boxX = chart.hAlignLabel(box.x2, sector.clone().expand(labelDistance), boxY, boxY + box.height(), label.orientation == RIGHT);\n if (label.orientation == RIGHT) {\n if (labelOptions.align !== CIRCLE) {\n boxX = sector.r + sector.c.x + labelDistance;\n }\n label.reflow(Box2D(boxX + box.width(), boxY, boxX, boxY));\n } else {\n if (labelOptions.align !== CIRCLE) {\n boxX = sector.c.x - sector.r - labelDistance;\n }\n label.reflow(Box2D(boxX - box.width(), boxY, boxX, boxY));\n }\n boxY += box.height();\n }\n },\n createVisual: function () {\n var chart = this, options = chart.options, connectors = options.connectors, points = chart.points, connectorLine, count = points.length, space = 4, connectorsColor, sector, angle, segment, seriesIx, label, i;\n ChartElement.fn.createVisual.call(this);\n this._connectorLines = [];\n for (i = 0; i < count; i++) {\n segment = points[i];\n sector = segment.sector;\n angle = sector.middle();\n label = segment.label;\n seriesIx = { seriesId: segment.seriesIx };\n connectorsColor = (segment.options.connectors || {}).color || connectors.color;\n if (label) {\n connectorLine = new draw.Path({\n stroke: {\n color: connectorsColor,\n width: connectors.width\n },\n animation: {\n type: FADEIN,\n delay: segment.animationDelay\n }\n });\n if (label.options.position === OUTSIDE_END && segment.value !== 0) {\n var box = label.box, centerPoint = sector.c, start = sector.point(angle), middle = Point2D(box.x1, box.center().y), sr, end, crossing;\n start = sector.clone().expand(connectors.padding).point(angle);\n connectorLine.moveTo(start.x, start.y);\n if (label.orientation == RIGHT) {\n end = Point2D(box.x1 - connectors.padding, box.center().y);\n crossing = intersection(centerPoint, start, middle, end);\n middle = Point2D(end.x - space, end.y);\n crossing = crossing || middle;\n crossing.x = math.min(crossing.x, middle.x);\n if (chart.pointInCircle(crossing, sector.c, sector.r + space) || crossing.x < sector.c.x) {\n sr = sector.c.x + sector.r + 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 = Point2D(box.x2 + connectors.padding, box.center().y);\n crossing = intersection(centerPoint, start, middle, end);\n middle = Point2D(end.x + space, end.y);\n crossing = crossing || middle;\n crossing.x = math.max(crossing.x, middle.x);\n if (chart.pointInCircle(crossing, sector.c, sector.r + space) || crossing.x > sector.c.x) {\n sr = sector.c.x - sector.r - 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 connectorLine.lineTo(end.x, end.y);\n this._connectorLines.push(connectorLine);\n this.visual.append(connectorLine);\n }\n }\n }\n },\n labelComparator: function (reverse) {\n reverse = reverse ? -1 : 1;\n return function (a, b) {\n a = (a.parent.sector.middle() + 270) % 360;\n b = (b.parent.sector.middle() + 270) % 360;\n return (a - b) * reverse;\n };\n },\n hAlignLabel: function (originalX, sector, y1, y2, direction) {\n var cx = sector.c.x, cy = sector.c.y, r = sector.r, t = math.min(math.abs(cy - y1), math.abs(cy - y2));\n if (t > r) {\n return originalX;\n } else {\n return cx + math.sqrt(r * r - t * t) * (direction ? 1 : -1);\n }\n },\n pointInCircle: function (point, c, r) {\n return sqr(c.x - point.x) + sqr(c.y - point.y) < sqr(r);\n },\n formatPointValue: function (point, format) {\n return autoFormat(format, point.value);\n },\n animationDelay: function (categoryIndex) {\n return categoryIndex * PIE_SECTOR_ANIM_DELAY;\n }\n });\n deepExtend(PieChart.fn, PieChartMixin);\n var DonutSegment = PieSegment.extend({\n options: {\n overlay: { gradient: ROUNDED_GLASS },\n labels: { position: CENTER },\n animation: { type: PIE }\n },\n reflowLabel: function () {\n var segment = this, sector = segment.sector.clone(), options = segment.options, label = segment.label, labelsOptions = options.labels, lp, angle = sector.middle(), labelHeight;\n if (label) {\n labelHeight = label.box.height();\n if (labelsOptions.position == CENTER) {\n sector.r -= (sector.r - sector.ir) / 2;\n lp = sector.point(angle);\n label.reflow(new Box2D(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n } else {\n PieSegment.fn.reflowLabel.call(segment);\n }\n }\n },\n createSegment: function (sector, options) {\n return ShapeBuilder.current.createRing(sector, options);\n }\n });\n deepExtend(DonutSegment.fn, PointEventsMixin);\n var DonutChart = PieChart.extend({\n options: {\n startAngle: 90,\n connectors: {\n width: 1,\n color: '#939393',\n padding: 4\n }\n },\n addValue: function (value, sector, fields) {\n var chart = this, segment;\n var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n chart.evalSegmentOptions(segmentOptions, value, fields);\n chart.createLegendItem(value, segmentOptions, fields);\n if (!value || fields.visible === false) {\n return;\n }\n segment = new DonutSegment(value, sector, segmentOptions);\n extend(segment, fields);\n chart.append(segment);\n chart.points.push(segment);\n },\n reflow: function (targetBox) {\n var chart = this, options = chart.options, box = targetBox.clone(), space = 5, minWidth = math.min(box.width(), box.height()), halfMinWidth = minWidth / 2, defaultPadding = minWidth - minWidth * 0.85, padding = valueOrDefault(options.padding, defaultPadding), series = options.series, currentSeries, seriesCount = series.length, seriesWithoutSize = 0, holeSize, totalSize, size, margin = 0, i, r, ir = 0, currentSize = 0;\n chart.seriesConfigs = [];\n padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n totalSize = halfMinWidth - padding;\n for (i = 0; i < seriesCount; i++) {\n currentSeries = series[i];\n if (i === 0) {\n if (defined(currentSeries.holeSize)) {\n holeSize = currentSeries.holeSize;\n totalSize -= currentSeries.holeSize;\n }\n }\n if (defined(currentSeries.size)) {\n totalSize -= currentSeries.size;\n } else {\n seriesWithoutSize++;\n }\n if (defined(currentSeries.margin) && i != seriesCount - 1) {\n totalSize -= currentSeries.margin;\n }\n }\n if (!defined(holeSize)) {\n currentSize = (halfMinWidth - padding) / (seriesCount + 0.75);\n holeSize = currentSize * 0.75;\n totalSize -= holeSize;\n }\n ir = holeSize;\n for (i = 0; i < seriesCount; i++) {\n currentSeries = series[i];\n size = valueOrDefault(currentSeries.size, totalSize / seriesWithoutSize);\n ir += margin;\n r = ir + size;\n chart.seriesConfigs.push({\n ir: ir,\n r: r\n });\n margin = currentSeries.margin || 0;\n ir = r;\n }\n PieChart.fn.reflow.call(chart, targetBox);\n },\n animationDelay: function (categoryIndex, seriesIndex, seriesCount) {\n return categoryIndex * DONUT_SECTOR_ANIM_DELAY + INITIAL_ANIMATION_DURATION * (seriesIndex + 1) / (seriesCount + 1);\n }\n });\n var WaterfallChart = BarChart.extend({\n render: function () {\n BarChart.fn.render.call(this);\n this.createSegments();\n },\n traverseDataPoints: function (callback) {\n var series = this.options.series;\n var categories = this.categoryAxis.options.categories || [];\n var totalCategories = categoriesCount(series);\n var isVertical = !this.options.invertAxes;\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var total = 0;\n var runningTotal = 0;\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;\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 callback(data, {\n category: categories[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 updateRange: function (value, fields) {\n BarChart.fn.updateRange.call(this, { value: fields.to }, fields);\n },\n aboveAxis: function (point) {\n return point.value >= 0;\n },\n plotRange: function (point) {\n return [\n point.from,\n point.to\n ];\n },\n createSegments: function () {\n var series = this.options.series;\n var seriesPoints = this.seriesPoints;\n var segments = this.segments = [];\n for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n var currentSeries = series[seriesIx];\n var points = seriesPoints[seriesIx];\n if (points) {\n var prevPoint;\n for (var pointIx = 0; pointIx < points.length; pointIx++) {\n var point = points[pointIx];\n if (point && prevPoint) {\n var segment = new WaterfallSegment(prevPoint, point, currentSeries);\n segments.push(segment);\n this.append(segment);\n }\n prevPoint = point;\n }\n }\n }\n }\n });\n var WaterfallSegment = ChartElement.extend({\n init: function (from, to, series) {\n var segment = this;\n ChartElement.fn.init.call(segment);\n segment.from = from;\n segment.to = to;\n segment.series = series;\n },\n options: {\n animation: {\n type: FADEIN,\n delay: INITIAL_ANIMATION_DURATION\n }\n },\n linePoints: function () {\n var points = [];\n var from = this.from;\n var fromBox = from.box;\n var toBox = this.to.box;\n if (from.isVertical) {\n var y = from.aboveAxis ? fromBox.y1 : fromBox.y2;\n points.push([\n fromBox.x1,\n y\n ], [\n toBox.x2,\n y\n ]);\n } else {\n var x = from.aboveAxis ? fromBox.x2 : fromBox.x1;\n points.push([\n x,\n fromBox.y1\n ], [\n x,\n toBox.y2\n ]);\n }\n return points;\n },\n createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n var line = this.series.line || {};\n var path = draw.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 alignPathToPixel(path);\n this.visual.append(path);\n }\n });\n function returnSelf() {\n return this;\n }\n var Pane = BoxElement.extend({\n init: function (options) {\n var pane = this;\n BoxElement.fn.init.call(pane, options);\n options = pane.options;\n pane.id = kendo.guid();\n pane.createTitle();\n pane.content = new ChartElement();\n pane.chartContainer = new ChartContainer({}, pane);\n pane.append(pane.content);\n pane.axes = [];\n pane.charts = [];\n },\n options: {\n zIndex: -1,\n shrinkToFit: true,\n title: { align: LEFT },\n visible: true\n },\n createTitle: function () {\n var pane = this;\n var titleOptions = pane.options.title;\n if (typeof titleOptions === OBJECT) {\n titleOptions = deepExtend({}, titleOptions, {\n align: titleOptions.position,\n position: TOP\n });\n }\n pane.title = Title.buildTitle(titleOptions, pane, Pane.fn.options.title);\n },\n appendAxis: function (axis) {\n var pane = this;\n pane.content.append(axis);\n pane.axes.push(axis);\n axis.pane = pane;\n },\n appendChart: function (chart) {\n var pane = this;\n if (pane.chartContainer.parent !== pane.content) {\n pane.content.append(pane.chartContainer);\n }\n pane.charts.push(chart);\n pane.chartContainer.append(chart);\n chart.pane = pane;\n },\n empty: function () {\n var pane = this, plotArea = pane.parent, i;\n if (plotArea) {\n for (i = 0; i < pane.axes.length; i++) {\n plotArea.removeAxis(pane.axes[i]);\n }\n for (i = 0; i < pane.charts.length; i++) {\n plotArea.removeChart(pane.charts[i]);\n }\n }\n pane.axes = [];\n pane.charts = [];\n pane.content.destroy();\n pane.content.children = [];\n pane.chartContainer.children = [];\n },\n reflow: function (targetBox) {\n var pane = this;\n var content;\n if (last(pane.children) === pane.content) {\n content = pane.children.pop();\n }\n BoxElement.fn.reflow.call(pane, targetBox);\n if (content) {\n pane.children.push(content);\n }\n if (pane.title) {\n pane.contentBox.y1 += pane.title.box.height();\n }\n },\n visualStyle: function () {\n var style = BoxElement.fn.visualStyle.call(this);\n style.zIndex = -10;\n return style;\n },\n renderComplete: function () {\n if (this.options.visible) {\n this.createGridLines();\n }\n },\n stackRoot: returnSelf,\n clipRoot: returnSelf,\n createGridLines: function () {\n var pane = this, axes = pane.axes, allAxes = axes.concat(pane.parent.axes), vGridLines = [], hGridLines = [], gridLines, i, j, axis, vertical, altAxis;\n for (i = 0; i < axes.length; i++) {\n axis = axes[i];\n vertical = axis.options.vertical;\n gridLines = vertical ? vGridLines : hGridLines;\n for (j = 0; j < allAxes.length; j++) {\n if (gridLines.length === 0) {\n altAxis = allAxes[j];\n if (vertical !== altAxis.options.vertical) {\n append(gridLines, axis.createGridLines(altAxis));\n }\n }\n }\n }\n },\n refresh: function () {\n this.visual.clear();\n this.content.parent = null;\n this.content.createGradient = $.proxy(this.createGradient, this);\n this.content.renderVisual();\n this.content.parent = this;\n if (this.title) {\n this.visual.append(this.title.visual);\n }\n this.visual.append(this.content.visual);\n this.renderComplete();\n },\n chartsBox: function () {\n var axes = this.axes, length = axes.length, chartsBox = new Box2D(), axisValueField, lineBox, axis, idx;\n for (idx = 0; idx < length; idx++) {\n axis = axes[idx];\n axisValueField = axis.options.vertical ? Y : X;\n lineBox = axis.lineBox();\n chartsBox[axisValueField + 1] = lineBox[axisValueField + 1];\n chartsBox[axisValueField + 2] = lineBox[axisValueField + 2];\n }\n if (chartsBox.x2 === 0) {\n var allAxes = this.parent.axes;\n length = allAxes.length;\n for (idx = 0; idx < length; idx++) {\n axis = allAxes[idx];\n if (!axis.options.vertical) {\n lineBox = axis.lineBox();\n chartsBox.x1 = lineBox.x1;\n chartsBox.x2 = lineBox.x2;\n }\n }\n }\n return chartsBox;\n },\n clipBox: function () {\n return this.chartContainer.clipBox;\n }\n });\n var ChartContainer = ChartElement.extend({\n init: function (options, pane) {\n var container = this;\n ChartElement.fn.init.call(container, options);\n container.pane = pane;\n },\n shouldClip: function () {\n var container = this, children = container.children, length = children.length, i;\n for (i = 0; i < length; i++) {\n if (children[i].options.clip === true) {\n return true;\n }\n }\n return false;\n },\n _clipBox: function () {\n return this.pane.chartsBox();\n },\n createVisual: function () {\n this.visual = new draw.Group({ zIndex: 0 });\n if (this.shouldClip()) {\n var clipBox = this.clipBox = this._clipBox();\n var clipRect = clipBox.toRect();\n var clipPath = draw.Path.fromRect(clipRect);\n this.visual.clip(clipPath);\n this.unclipLabels();\n }\n },\n stackRoot: returnSelf,\n unclipLabels: function () {\n var container = this, charts = container.children, clipBox = container.clipBox, points, point, i, j, length, label, note;\n for (i = 0; i < charts.length; i++) {\n points = charts[i].points || {};\n length = points.length;\n for (j = 0; j < length; j++) {\n point = points[j];\n if (point && point.overlapsBox && point.overlapsBox(clipBox)) {\n label = point.label;\n note = point.note;\n if (label && label.options.visible) {\n if (label.alignToClipBox) {\n label.alignToClipBox(clipBox);\n }\n label.options.noclip = true;\n }\n if (note && note.options.visible) {\n note.options.noclip = true;\n }\n }\n }\n }\n },\n destroy: function () {\n ChartElement.fn.destroy.call(this);\n delete this.parent;\n }\n });\n var PlotAreaBase = ChartElement.extend({\n init: function (series, options) {\n var plotArea = this;\n ChartElement.fn.init.call(plotArea, options);\n plotArea.series = series;\n plotArea.initSeries();\n plotArea.charts = [];\n plotArea.options.legend.items = [];\n plotArea.axes = [];\n plotArea.crosshairs = [];\n plotArea.createPanes();\n plotArea.render();\n plotArea.createCrosshairs();\n },\n options: {\n series: [],\n plotArea: { margin: {} },\n background: '',\n border: {\n color: BLACK,\n width: 0\n },\n legend: {\n inactiveItems: {\n labels: { color: '#919191' },\n markers: { color: '#919191' }\n }\n }\n },\n initSeries: function () {\n var series = this.series, i, currentSeries;\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n currentSeries.index = i;\n }\n },\n createPanes: function () {\n var plotArea = this, defaults = { title: { color: (plotArea.options.title || {}).color } }, panes = [], paneOptions = plotArea.options.panes || [], i, panesLength = math.max(paneOptions.length, 1), currentPane;\n function setTitle(options, defaults) {\n if (typeof options.title === 'string') {\n options.title = { text: options.title };\n }\n options.title = deepExtend({}, defaults.title, options.title);\n }\n for (i = 0; i < panesLength; i++) {\n var options = paneOptions[i] || {};\n setTitle(options, defaults);\n currentPane = new Pane(options);\n currentPane.paneIndex = i;\n panes.push(currentPane);\n plotArea.append(currentPane);\n }\n plotArea.panes = panes;\n },\n createCrosshairs: function (panes) {\n var plotArea = this, i, j, pane, axis, currentCrosshair;\n panes = panes || plotArea.panes;\n for (i = 0; i < panes.length; i++) {\n pane = panes[i];\n for (j = 0; j < pane.axes.length; j++) {\n axis = pane.axes[j];\n if (axis.options.crosshair && axis.options.crosshair.visible) {\n currentCrosshair = new Crosshair(axis, axis.options.crosshair);\n plotArea.crosshairs.push(currentCrosshair);\n pane.content.append(currentCrosshair);\n }\n }\n }\n },\n removeCrosshairs: function (pane) {\n var plotArea = this, crosshairs = plotArea.crosshairs, axes = pane.axes, i, j;\n for (i = crosshairs.length - 1; i >= 0; i--) {\n for (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 hideCrosshairs: function () {\n var crosshairs = this.crosshairs;\n for (var idx = 0; idx < crosshairs.length; idx++) {\n crosshairs[idx].hide();\n }\n },\n findPane: function (name) {\n var plotArea = this, panes = plotArea.panes, i, matchingPane;\n for (i = 0; i < panes.length; i++) {\n if (panes[i].options.name === name) {\n matchingPane = panes[i];\n break;\n }\n }\n return matchingPane || panes[0];\n },\n findPointPane: function (point) {\n var plotArea = this, panes = plotArea.panes, i, matchingPane;\n for (i = 0; i < panes.length; i++) {\n if (panes[i].box.containsPoint(point)) {\n matchingPane = panes[i];\n break;\n }\n }\n return matchingPane;\n },\n appendAxis: function (axis) {\n var plotArea = this, pane = plotArea.findPane(axis.options.pane);\n pane.appendAxis(axis);\n plotArea.axes.push(axis);\n axis.plotArea = plotArea;\n },\n removeAxis: function (axisToRemove) {\n var plotArea = this, i, axis, filteredAxes = [];\n for (i = 0; i < plotArea.axes.length; i++) {\n axis = plotArea.axes[i];\n if (axisToRemove !== axis) {\n filteredAxes.push(axis);\n } else {\n axis.destroy();\n }\n }\n plotArea.axes = filteredAxes;\n },\n appendChart: function (chart, pane) {\n var plotArea = this;\n plotArea.charts.push(chart);\n if (pane) {\n pane.appendChart(chart);\n } else {\n plotArea.append(chart);\n }\n },\n removeChart: function (chartToRemove) {\n var plotArea = this, i, chart, filteredCharts = [];\n for (i = 0; i < plotArea.charts.length; i++) {\n chart = plotArea.charts[i];\n if (chart !== chartToRemove) {\n filteredCharts.push(chart);\n } else {\n chart.destroy();\n }\n }\n plotArea.charts = filteredCharts;\n },\n addToLegend: function (series) {\n var count = series.length, data = [], i, currentSeries, text, legend = this.options.legend, labels = legend.labels || {}, inactiveItems = legend.inactiveItems || {}, inactiveItemsLabels = inactiveItems.labels || {}, color, itemLabelOptions, markerColor, defaults, seriesVisible, labelTemplate;\n for (i = 0; i < count; i++) {\n currentSeries = series[i];\n seriesVisible = currentSeries.visible !== false;\n if (currentSeries.visibleInLegend === false) {\n continue;\n }\n text = currentSeries.name || '';\n labelTemplate = seriesVisible ? labels.template : inactiveItemsLabels.template || labels.template;\n if (labelTemplate) {\n text = template(labelTemplate)({\n text: text,\n series: currentSeries\n });\n }\n color = currentSeries.color;\n defaults = currentSeries._defaults;\n if (isFn(color) && defaults) {\n color = defaults.color;\n }\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 if (text) {\n data.push({\n text: text,\n labels: itemLabelOptions,\n markerColor: markerColor,\n series: currentSeries,\n active: seriesVisible\n });\n }\n }\n append(legend.items, data);\n },\n groupAxes: function (panes) {\n var xAxes = [], yAxes = [], paneAxes, axis, paneIx, axisIx;\n for (paneIx = 0; paneIx < panes.length; paneIx++) {\n paneAxes = panes[paneIx].axes;\n for (axisIx = 0; axisIx < paneAxes.length; axisIx++) {\n axis = paneAxes[axisIx];\n if (axis.options.vertical) {\n yAxes.push(axis);\n } else {\n xAxes.push(axis);\n }\n }\n }\n return {\n x: xAxes,\n y: yAxes,\n any: xAxes.concat(yAxes)\n };\n },\n groupSeriesByPane: function () {\n var plotArea = this, series = plotArea.series, seriesByPane = {}, i, pane, currentSeries;\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n pane = plotArea.seriesPaneName(currentSeries);\n if (seriesByPane[pane]) {\n seriesByPane[pane].push(currentSeries);\n } else {\n seriesByPane[pane] = [currentSeries];\n }\n }\n return seriesByPane;\n },\n filterVisibleSeries: function (series) {\n var i, currentSeries, result = [];\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n if (currentSeries.visible !== false) {\n result.push(currentSeries);\n }\n }\n return result;\n },\n reflow: function (targetBox) {\n var plotArea = this, options = plotArea.options.plotArea, panes = plotArea.panes, margin = getSpacing(options.margin);\n plotArea.box = targetBox.clone().unpad(margin);\n plotArea.reflowPanes();\n plotArea.reflowAxes(panes);\n plotArea.reflowCharts(panes);\n },\n redraw: function (panes) {\n var plotArea = this, i;\n panes = [].concat(panes);\n this.initSeries();\n for (i = 0; i < panes.length; i++) {\n plotArea.removeCrosshairs(panes[i]);\n panes[i].empty();\n }\n plotArea.render(panes);\n plotArea.reflowAxes(plotArea.panes);\n plotArea.reflowCharts(panes);\n plotArea.createCrosshairs(panes);\n for (i = 0; i < panes.length; i++) {\n panes[i].refresh();\n }\n },\n axisCrossingValues: function (axis, crossingAxes) {\n var options = axis.options, crossingValues = [].concat(options.axisCrossingValues || options.axisCrossingValue), valuesToAdd = crossingAxes.length - crossingValues.length, defaultValue = crossingValues[0] || 0, i;\n for (i = 0; i < valuesToAdd; i++) {\n crossingValues.push(defaultValue);\n }\n return crossingValues;\n },\n alignAxisTo: function (axis, targetAxis, crossingValue, targetCrossingValue) {\n var slot = axis.getSlot(crossingValue, crossingValue, true), slotEdge = axis.options.reverse ? 2 : 1, targetSlot = targetAxis.getSlot(targetCrossingValue, targetCrossingValue, true), targetEdge = targetAxis.options.reverse ? 2 : 1, axisBox = axis.box.translate(targetSlot[X + targetEdge] - slot[X + slotEdge], targetSlot[Y + targetEdge] - slot[Y + slotEdge]);\n if (axis.pane !== targetAxis.pane) {\n axisBox.translate(0, axis.pane.box.y1 - targetAxis.pane.box.y1);\n }\n axis.reflow(axisBox);\n },\n alignAxes: function (xAxes, yAxes) {\n var plotArea = this, xAnchor = xAxes[0], yAnchor = yAxes[0], xAnchorCrossings = plotArea.axisCrossingValues(xAnchor, yAxes), yAnchorCrossings = plotArea.axisCrossingValues(yAnchor, xAxes), anchor, anchorCrossings, leftAnchors = {}, rightAnchors = {}, topAnchors = {}, bottomAnchors = {}, pane, paneId, axis, i;\n for (i = 0; i < yAxes.length; i++) {\n axis = yAxes[i];\n pane = axis.pane;\n paneId = pane.id;\n anchor = paneAnchor(xAxes, pane) || xAnchor;\n anchorCrossings = xAnchorCrossings;\n if (anchor !== xAnchor) {\n anchorCrossings = plotArea.axisCrossingValues(anchor, yAxes);\n }\n plotArea.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n if (axis.options._overlap) {\n continue;\n }\n if (round(axis.lineBox().x1) === round(anchor.lineBox().x1)) {\n if (leftAnchors[paneId]) {\n axis.reflow(axis.box.alignTo(leftAnchors[paneId].box, LEFT).translate(-axis.options.margin, 0));\n }\n leftAnchors[paneId] = axis;\n }\n if (round(axis.lineBox().x2) === round(anchor.lineBox().x2)) {\n if (!axis._mirrored) {\n axis.options.labels.mirror = !axis.options.labels.mirror;\n axis._mirrored = true;\n }\n plotArea.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n if (rightAnchors[paneId]) {\n axis.reflow(axis.box.alignTo(rightAnchors[paneId].box, RIGHT).translate(axis.options.margin, 0));\n }\n rightAnchors[paneId] = axis;\n }\n if (i !== 0 && yAnchor.pane === axis.pane) {\n axis.alignTo(yAnchor);\n axis.reflow(axis.box);\n }\n }\n for (i = 0; i < xAxes.length; i++) {\n axis = xAxes[i];\n pane = axis.pane;\n paneId = pane.id;\n anchor = paneAnchor(yAxes, pane) || yAnchor;\n anchorCrossings = yAnchorCrossings;\n if (anchor !== yAnchor) {\n anchorCrossings = plotArea.axisCrossingValues(anchor, xAxes);\n }\n plotArea.alignAxisTo(axis, anchor, xAnchorCrossings[i], anchorCrossings[i]);\n if (axis.options._overlap) {\n continue;\n }\n if (round(axis.lineBox().y1) === round(anchor.lineBox().y1)) {\n if (!axis._mirrored) {\n axis.options.labels.mirror = !axis.options.labels.mirror;\n axis._mirrored = true;\n }\n plotArea.alignAxisTo(axis, anchor, xAnchorCrossings[i], anchorCrossings[i]);\n if (topAnchors[paneId]) {\n axis.reflow(axis.box.alignTo(topAnchors[paneId].box, TOP).translate(0, -axis.options.margin));\n }\n topAnchors[paneId] = axis;\n }\n if (round(axis.lineBox().y2, COORD_PRECISION) === round(anchor.lineBox().y2, COORD_PRECISION)) {\n if (bottomAnchors[paneId]) {\n axis.reflow(axis.box.alignTo(bottomAnchors[paneId].box, BOTTOM).translate(0, axis.options.margin));\n }\n bottomAnchors[paneId] = axis;\n }\n if (i !== 0) {\n axis.alignTo(xAnchor);\n axis.reflow(axis.box);\n }\n }\n },\n shrinkAxisWidth: function (panes) {\n var plotArea = this, axes = plotArea.groupAxes(panes).any, axisBox = axisGroupBox(axes), overflowX = 0, i, currentPane, currentAxis;\n for (i = 0; i < panes.length; i++) {\n currentPane = panes[i];\n if (currentPane.axes.length > 0) {\n overflowX = math.max(overflowX, axisBox.width() - currentPane.contentBox.width());\n }\n }\n if (overflowX !== 0) {\n for (i = 0; i < axes.length; i++) {\n currentAxis = axes[i];\n if (!currentAxis.options.vertical) {\n currentAxis.reflow(currentAxis.box.shrink(overflowX, 0));\n }\n }\n }\n },\n shrinkAxisHeight: function (panes) {\n var i, currentPane, axes, overflowY, j, currentAxis, shrinked;\n for (i = 0; i < panes.length; i++) {\n currentPane = panes[i];\n axes = currentPane.axes;\n overflowY = math.max(0, axisGroupBox(axes).height() - currentPane.contentBox.height());\n if (overflowY !== 0) {\n for (j = 0; j < axes.length; j++) {\n currentAxis = axes[j];\n if (currentAxis.options.vertical) {\n currentAxis.reflow(currentAxis.box.shrink(0, overflowY));\n }\n }\n shrinked = true;\n }\n }\n return shrinked;\n },\n fitAxes: function (panes) {\n var plotArea = this, axes = plotArea.groupAxes(panes).any, offsetX = 0, paneAxes, paneBox, axisBox, offsetY, currentPane, currentAxis, i, j;\n for (i = 0; i < panes.length; i++) {\n currentPane = panes[i];\n paneAxes = currentPane.axes;\n paneBox = currentPane.contentBox;\n if (paneAxes.length > 0) {\n axisBox = axisGroupBox(paneAxes);\n offsetX = math.max(offsetX, paneBox.x1 - axisBox.x1);\n offsetY = math.max(paneBox.y1 - axisBox.y1, paneBox.y2 - axisBox.y2);\n for (j = 0; j < paneAxes.length; j++) {\n currentAxis = paneAxes[j];\n currentAxis.reflow(currentAxis.box.translate(0, offsetY));\n }\n }\n }\n for (i = 0; i < axes.length; i++) {\n currentAxis = axes[i];\n currentAxis.reflow(currentAxis.box.translate(offsetX, 0));\n }\n },\n reflowAxes: function (panes) {\n var plotArea = this, i, axes = plotArea.groupAxes(panes);\n for (i = 0; i < panes.length; i++) {\n plotArea.reflowPaneAxes(panes[i]);\n }\n if (axes.x.length > 0 && axes.y.length > 0) {\n plotArea.alignAxes(axes.x, axes.y);\n plotArea.shrinkAxisWidth(panes);\n plotArea.autoRotateAxisLabels(axes);\n plotArea.alignAxes(axes.x, axes.y);\n if (plotArea.shrinkAxisWidth(panes)) {\n plotArea.alignAxes(axes.x, axes.y);\n }\n plotArea.shrinkAxisHeight(panes);\n plotArea.alignAxes(axes.x, axes.y);\n if (plotArea.shrinkAxisHeight(panes)) {\n plotArea.alignAxes(axes.x, axes.y);\n }\n plotArea.fitAxes(panes);\n }\n },\n autoRotateAxisLabels: function (groupedAxes) {\n var axes = this.axes;\n var panes = this.panes;\n var axis, idx, rotated;\n for (idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n if (axis.autoRotateLabels()) {\n rotated = true;\n }\n }\n if (rotated) {\n for (idx = 0; idx < panes.length; idx++) {\n this.reflowPaneAxes(panes[idx]);\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 reflowPaneAxes: function (pane) {\n var axes = pane.axes, i, length = axes.length;\n if (length > 0) {\n for (i = 0; i < length; i++) {\n axes[i].reflow(pane.contentBox);\n }\n }\n },\n reflowCharts: function (panes) {\n var plotArea = this, charts = plotArea.charts, count = charts.length, box = plotArea.box, chartPane, i;\n for (i = 0; i < count; i++) {\n chartPane = charts[i].pane;\n if (!chartPane || inArray(chartPane, panes)) {\n charts[i].reflow(box);\n }\n }\n },\n reflowPanes: function () {\n var plotArea = this, box = plotArea.box, panes = plotArea.panes, panesLength = panes.length, i, currentPane, paneBox, remainingHeight = box.height(), remainingPanes = panesLength, autoHeightPanes = 0, top = box.y1, height, percents;\n for (i = 0; i < panesLength; i++) {\n currentPane = panes[i];\n height = currentPane.options.height;\n currentPane.options.width = box.width();\n if (!currentPane.options.height) {\n autoHeightPanes++;\n } else {\n if (height.indexOf && height.indexOf('%')) {\n percents = parseInt(height, 10) / 100;\n currentPane.options.height = percents * box.height();\n }\n currentPane.reflow(box.clone());\n remainingHeight -= currentPane.options.height;\n }\n }\n for (i = 0; i < panesLength; i++) {\n currentPane = panes[i];\n if (!currentPane.options.height) {\n currentPane.options.height = remainingHeight / autoHeightPanes;\n }\n }\n for (i = 0; i < panesLength; i++) {\n currentPane = panes[i];\n paneBox = box.clone().move(box.x1, top);\n currentPane.reflow(paneBox);\n remainingPanes--;\n top += currentPane.options.height;\n }\n },\n backgroundBox: function () {\n var plotArea = this, axes = plotArea.axes, axesCount = axes.length, lineBox, box, i, j, axisA, axisB;\n for (i = 0; i < axesCount; i++) {\n axisA = axes[i];\n for (j = 0; j < axesCount; j++) {\n axisB = axes[j];\n if (axisA.options.vertical !== axisB.options.vertical) {\n lineBox = axisA.lineBox().clone().wrap(axisB.lineBox());\n if (!box) {\n box = lineBox;\n } else {\n box = box.wrap(lineBox);\n }\n }\n }\n }\n return box || plotArea.box;\n },\n chartsBoxes: function () {\n var panes = this.panes;\n var boxes = [];\n for (var idx = 0; idx < panes.length; idx++) {\n boxes.push(panes[idx].chartsBox());\n }\n return boxes;\n },\n addBackgroundPaths: function (multipath) {\n var boxes = this.chartsBoxes();\n for (var idx = 0; idx < boxes.length; idx++) {\n multipath.paths.push(draw.Path.fromRect(boxes[idx].toRect()));\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 createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n var options = this.options.plotArea;\n var border = options.border || {};\n var background = options.background;\n var opacity = options.opacity;\n if (util.isTransparent(background)) {\n background = WHITE;\n opacity = 0;\n }\n var bg = this._bgVisual = new draw.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 this.addBackgroundPaths(bg);\n this.appendVisual(bg);\n },\n pointsByCategoryIndex: function (categoryIndex) {\n var charts = this.charts, result = [], i, j, points, point, chart;\n if (categoryIndex !== null) {\n for (i = 0; i < charts.length; i++) {\n chart = charts[i];\n if (chart.pane.options.name === '_navigator') {\n continue;\n }\n points = charts[i].categoryPoints[categoryIndex];\n if (points && points.length) {\n for (j = 0; j < points.length; j++) {\n point = points[j];\n if (point && defined(point.value) && point.value !== null) {\n result.push(point);\n }\n }\n }\n }\n }\n return result;\n },\n pointsBySeriesIndex: function (seriesIndex) {\n return this.filterPoints(function (point) {\n return point.series.index === seriesIndex;\n });\n },\n pointsBySeriesName: function (name) {\n return this.filterPoints(function (point) {\n return point.series.name === name;\n });\n },\n filterPoints: function (callback) {\n var charts = this.charts, result = [], points, point, i, j, chart;\n for (i = 0; i < charts.length; i++) {\n chart = charts[i];\n points = chart.points;\n for (j = 0; j < points.length; j++) {\n point = points[j];\n if (point && callback(point)) {\n result.push(point);\n }\n }\n }\n return result;\n },\n findPoint: function (callback) {\n var charts = this.charts, points, point, i, j, chart;\n for (i = 0; i < charts.length; i++) {\n chart = charts[i];\n points = chart.points;\n for (j = 0; j < points.length; j++) {\n point = points[j];\n if (point && callback(point)) {\n return point;\n }\n }\n }\n },\n paneByPoint: function (point) {\n var plotArea = this, panes = plotArea.panes, pane, i;\n for (i = 0; i < panes.length; i++) {\n pane = panes[i];\n if (pane.box.containsPoint(point)) {\n return pane;\n }\n }\n }\n });\n var PlotAreaEventsMixin = {\n hover: function (chart, e) {\n this._dispatchEvent(chart, e, PLOT_AREA_HOVER);\n },\n click: function (chart, e) {\n this._dispatchEvent(chart, e, PLOT_AREA_CLICK);\n }\n };\n var CategoricalPlotArea = PlotAreaBase.extend({\n init: function (series, options) {\n var plotArea = this;\n plotArea.namedCategoryAxes = {};\n plotArea.namedValueAxes = {};\n plotArea.valueAxisRangeTracker = new AxisGroupRangeTracker();\n if (series.length > 0) {\n plotArea.invertAxes = inArray(series[0].type, [\n BAR,\n BULLET,\n VERTICAL_LINE,\n VERTICAL_AREA,\n RANGE_BAR,\n HORIZONTAL_WATERFALL,\n VERTICAL_BOX_PLOT\n ]);\n for (var i = 0; i < series.length; i++) {\n var stack = series[i].stack;\n if (stack && stack.type === '100%') {\n plotArea.stack100 = true;\n break;\n }\n }\n }\n PlotAreaBase.fn.init.call(plotArea, series, options);\n },\n options: {\n categoryAxis: { categories: [] },\n valueAxis: {}\n },\n render: function (panes) {\n var plotArea = this;\n panes = panes || plotArea.panes;\n plotArea.createCategoryAxes(panes);\n plotArea.aggregateCategories(panes);\n plotArea.createCategoryAxesLabels(panes);\n plotArea.createCharts(panes);\n plotArea.createValueAxes(panes);\n },\n removeAxis: function (axis) {\n var plotArea = this, axisName = axis.options.name;\n PlotAreaBase.fn.removeAxis.call(plotArea, axis);\n if (axis instanceof CategoryAxis) {\n delete plotArea.namedCategoryAxes[axisName];\n } else {\n plotArea.valueAxisRangeTracker.reset(axisName);\n delete plotArea.namedValueAxes[axisName];\n }\n if (axis === plotArea.categoryAxis) {\n delete plotArea.categoryAxis;\n }\n if (axis === plotArea.valueAxis) {\n delete plotArea.valueAxis;\n }\n },\n createCharts: function (panes) {\n var seriesByPane = this.groupSeriesByPane();\n for (var i = 0; i < panes.length; i++) {\n var pane = panes[i];\n var paneSeries = seriesByPane[pane.options.name || 'default'] || [];\n this.addToLegend(paneSeries);\n var visibleSeries = this.filterVisibleSeries(paneSeries);\n if (!visibleSeries) {\n continue;\n }\n var groups = this.groupSeriesByCategoryAxis(visibleSeries);\n for (var groupIx = 0; groupIx < groups.length; groupIx++) {\n this.createChartGroup(groups[groupIx], pane);\n }\n }\n },\n createChartGroup: function (series, pane) {\n this.createAreaChart(filterSeriesByType(series, [\n AREA,\n VERTICAL_AREA\n ]), pane);\n this.createBarChart(filterSeriesByType(series, [\n COLUMN,\n BAR\n ]), pane);\n this.createRangeBarChart(filterSeriesByType(series, [\n RANGE_COLUMN,\n RANGE_BAR\n ]), pane);\n this.createBulletChart(filterSeriesByType(series, [\n BULLET,\n VERTICAL_BULLET\n ]), pane);\n this.createCandlestickChart(filterSeriesByType(series, CANDLESTICK), pane);\n this.createBoxPlotChart(filterSeriesByType(series, [\n BOX_PLOT,\n VERTICAL_BOX_PLOT\n ]), pane);\n this.createOHLCChart(filterSeriesByType(series, OHLC), pane);\n this.createWaterfallChart(filterSeriesByType(series, [\n WATERFALL,\n HORIZONTAL_WATERFALL\n ]), pane);\n this.createLineChart(filterSeriesByType(series, [\n LINE,\n VERTICAL_LINE\n ]), pane);\n },\n aggregateCategories: function (panes) {\n var plotArea = this, series = plotArea.srcSeries || plotArea.series, processedSeries = [], i, currentSeries, categoryAxis, axisPane, dateAxis;\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n categoryAxis = plotArea.seriesCategoryAxis(currentSeries);\n axisPane = plotArea.findPane(categoryAxis.options.pane);\n dateAxis = equalsIgnoreCase(categoryAxis.options.type, DATE);\n if ((dateAxis || currentSeries.categoryField) && inArray(axisPane, panes)) {\n currentSeries = plotArea.aggregateSeries(currentSeries, categoryAxis);\n } else if (isNumber(categoryAxis.options.min) || isNumber(categoryAxis.options.max)) {\n currentSeries = plotArea.filterSeries(currentSeries, categoryAxis);\n }\n processedSeries.push(currentSeries);\n }\n plotArea.srcSeries = series;\n plotArea.series = processedSeries;\n },\n filterSeries: function (currentSeries, categoryAxis) {\n var range = categoryAxis.totalRangeIndices();\n var justified = categoryAxis.options.justified;\n var outOfRangePoints = inArray(currentSeries.type, [\n LINE,\n VERTICAL_LINE,\n AREA,\n VERTICAL_AREA\n ]);\n var categoryIx;\n range.min = isNumber(categoryAxis.options.min) ? math.floor(range.min) : 0;\n range.max = isNumber(categoryAxis.options.max) ? justified ? math.floor(range.max) + 1 : math.ceil(range.max) : currentSeries.data.length;\n currentSeries = deepExtend({}, currentSeries);\n if (outOfRangePoints) {\n var minCategory = range.min - 1;\n var srcCategories = categoryAxis.options.srcCategories || [];\n if (minCategory >= 0 && minCategory < currentSeries.data.length) {\n categoryIx = minCategory;\n currentSeries._outOfRangeMinPoint = {\n item: currentSeries.data[categoryIx],\n category: srcCategories[categoryIx],\n categoryIx: -1\n };\n }\n if (range.max < currentSeries.data.length) {\n categoryIx = range.max;\n currentSeries._outOfRangeMaxPoint = {\n item: currentSeries.data[categoryIx],\n category: srcCategories[categoryIx],\n categoryIx: range.max - range.min\n };\n }\n }\n categoryAxis._seriesMax = math.max(categoryAxis._seriesMax || 0, currentSeries.data.length);\n currentSeries.data = (currentSeries.data || []).slice(range.min, range.max);\n return currentSeries;\n },\n aggregateSeries: function (series, categoryAxis) {\n var axisOptions = categoryAxis.options, dateAxis = equalsIgnoreCase(categoryAxis.options.type, DATE), categories = axisOptions.categories, srcCategories = axisOptions.srcCategories || categories, srcData = series.data, srcPoints = [], result = deepExtend({}, series), aggregatorSeries = deepExtend({}, series), dataItems = axisOptions.dataItems || [], i, category, categoryIx, data, aggregator, getFn = getField, outOfRangeMinIdx = util.MIN_NUM, outOfRangeMinCategory, outOfRangeMaxCategory, outOfRangeMaxIdx = util.MAX_NUM, outOfRangePoints = inArray(series.type, [\n LINE,\n VERTICAL_LINE,\n AREA,\n VERTICAL_AREA\n ]);\n result.data = data = [];\n if (dateAxis) {\n getFn = getDateField;\n }\n for (i = 0; i < srcData.length; i++) {\n if (series.categoryField) {\n category = getFn(series.categoryField, srcData[i]);\n } else {\n category = srcCategories[i];\n }\n if (defined(category)) {\n categoryIx = categoryAxis.categoryIndex(category);\n if (0 <= categoryIx && categoryIx < categories.length) {\n srcPoints[categoryIx] = srcPoints[categoryIx] || [];\n srcPoints[categoryIx].push(i);\n } else if (outOfRangePoints) {\n if (categoryIx < 0) {\n if (categoryIx == outOfRangeMinIdx) {\n outOfRangeMinCategory.points.push(i);\n } else if (categoryIx > outOfRangeMinIdx) {\n outOfRangeMinIdx = categoryIx;\n outOfRangeMinCategory = {\n category: category,\n points: [i]\n };\n }\n } else if (categoryIx >= categories.length) {\n if (categoryIx == outOfRangeMaxIdx) {\n outOfRangeMaxCategory.points.push(i);\n } else if (categoryIx < outOfRangeMaxIdx) {\n outOfRangeMaxIdx = categoryIx;\n outOfRangeMaxCategory = {\n category: category,\n points: [i]\n };\n }\n }\n }\n }\n }\n aggregator = new SeriesAggregator(aggregatorSeries, SeriesBinder.current, DefaultAggregates.current);\n for (i = 0; i < categories.length; i++) {\n data[i] = aggregator.aggregatePoints(srcPoints[i], categories[i]);\n if (srcPoints[i]) {\n dataItems[i] = data[i];\n }\n }\n if (outOfRangeMinCategory && data.length) {\n result._outOfRangeMinPoint = {\n item: aggregator.aggregatePoints(outOfRangeMinCategory.points, outOfRangeMinCategory.category),\n categoryIx: outOfRangeMinIdx,\n category: outOfRangeMinCategory.category\n };\n }\n if (outOfRangeMaxCategory && data.length) {\n result._outOfRangeMaxPoint = {\n item: aggregator.aggregatePoints(outOfRangeMaxCategory.points, outOfRangeMaxCategory.category),\n categoryIx: outOfRangeMaxIdx,\n category: outOfRangeMaxCategory.category\n };\n }\n categoryAxis.options.dataItems = dataItems;\n return result;\n },\n appendChart: function (chart, pane) {\n var plotArea = this, series = chart.options.series, categoryAxis = plotArea.seriesCategoryAxis(series[0]), categories = categoryAxis.options.categories, categoriesToAdd = math.max(0, categoriesCount(series) - categories.length);\n while (categoriesToAdd--) {\n categories.push('');\n }\n plotArea.valueAxisRangeTracker.update(chart.valueAxisRanges);\n PlotAreaBase.fn.appendChart.call(plotArea, chart, pane);\n },\n seriesPaneName: function (series) {\n var plotArea = this, options = plotArea.options, axisName = series.axis, axisOptions = [].concat(options.valueAxis), axis = $.grep(axisOptions, function (a) {\n return a.name === axisName;\n })[0], panes = options.panes || [{}], defaultPaneName = (panes[0] || {}).name || 'default', paneName = (axis || {}).pane || defaultPaneName;\n return paneName;\n },\n seriesCategoryAxis: function (series) {\n var plotArea = this, axisName = series.categoryAxis, axis = axisName ? plotArea.namedCategoryAxes[axisName] : plotArea.categoryAxis;\n if (!axis) {\n throw new Error('Unable to locate category axis with name ' + axisName);\n }\n return axis;\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 return {\n isStacked: stack,\n isStacked100: isStacked100,\n clip: clip\n };\n },\n groupSeriesByCategoryAxis: function (series) {\n var unique = {};\n var categoryAxes = $.map(series, function (s) {\n var name = s.categoryAxis || '$$default$$';\n if (!unique.hasOwnProperty(name)) {\n unique[name] = true;\n return name;\n }\n });\n function groupSeries(axis, axisIx) {\n return $.grep(series, function (s) {\n return axisIx === 0 && !s.categoryAxis || s.categoryAxis == axis;\n });\n }\n var groups = [];\n for (var axisIx = 0; axisIx < categoryAxes.length; axisIx++) {\n var axis = categoryAxes[axisIx];\n var axisSeries = groupSeries(axis, axisIx);\n if (axisSeries.length === 0) {\n continue;\n }\n groups.push(axisSeries);\n }\n return groups;\n },\n createBarChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], barChart = new BarChart(plotArea, extend({\n series: series,\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n }, plotArea.stackableChartOptions(firstSeries, pane)));\n plotArea.appendChart(barChart, pane);\n },\n createRangeBarChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], rangeColumnChart = new RangeBarChart(plotArea, {\n series: series,\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n });\n plotArea.appendChart(rangeColumnChart, pane);\n },\n createBulletChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], bulletChart = new BulletChart(plotArea, {\n series: series,\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n plotArea.appendChart(bulletChart, pane);\n },\n createLineChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], lineChart = new LineChart(plotArea, extend({\n invertAxes: plotArea.invertAxes,\n series: series\n }, plotArea.stackableChartOptions(firstSeries, pane)));\n plotArea.appendChart(lineChart, pane);\n },\n createAreaChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], areaChart = new AreaChart(plotArea, extend({\n invertAxes: plotArea.invertAxes,\n series: series\n }, plotArea.stackableChartOptions(firstSeries, pane)));\n plotArea.appendChart(areaChart, pane);\n },\n createOHLCChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], chart = new OHLCChart(plotArea, {\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n plotArea.appendChart(chart, pane);\n },\n createCandlestickChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], chart = new CandlestickChart(plotArea, {\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n plotArea.appendChart(chart, pane);\n },\n createBoxPlotChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], chart = new BoxPlotChart(plotArea, {\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n series: series,\n spacing: firstSeries.spacing,\n clip: pane.options.clip\n });\n plotArea.appendChart(chart, pane);\n },\n createWaterfallChart: function (series, pane) {\n if (series.length === 0) {\n return;\n }\n var plotArea = this, firstSeries = series[0], waterfallChart = new WaterfallChart(plotArea, {\n series: series,\n invertAxes: plotArea.invertAxes,\n gap: firstSeries.gap,\n spacing: firstSeries.spacing\n });\n plotArea.appendChart(waterfallChart, pane);\n },\n axisRequiresRounding: function (categoryAxisName, categoryAxisIndex) {\n var plotArea = this, centeredSeries = filterSeriesByType(plotArea.series, EQUALLY_SPACED_SERIES), seriesIx, seriesAxis;\n for (seriesIx = 0; seriesIx < plotArea.series.length; seriesIx++) {\n var currentSeries = plotArea.series[seriesIx];\n if (currentSeries.type === LINE || currentSeries.type === AREA) {\n var line = currentSeries.line;\n if (line && line.style === STEP) {\n centeredSeries.push(currentSeries);\n }\n }\n }\n for (seriesIx = 0; seriesIx < centeredSeries.length; seriesIx++) {\n seriesAxis = centeredSeries[seriesIx].categoryAxis || '';\n if (seriesAxis === categoryAxisName || !seriesAxis && categoryAxisIndex === 0) {\n return true;\n }\n }\n },\n aggregatedAxis: function (categoryAxisName, categoryAxisIndex) {\n var plotArea = this, series = plotArea.series, seriesIx, seriesAxis;\n for (seriesIx = 0; seriesIx < series.length; seriesIx++) {\n seriesAxis = series[seriesIx].categoryAxis || '';\n if ((seriesAxis === categoryAxisName || !seriesAxis && categoryAxisIndex === 0) && series[seriesIx].categoryField) {\n return true;\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 createCategoryAxes: function (panes) {\n var plotArea = this, invertAxes = plotArea.invertAxes, definitions = [].concat(plotArea.options.categoryAxis), i, axisOptions, axisPane, categories, type, name, categoryAxis, axes = [], primaryAxis;\n for (i = 0; i < definitions.length; i++) {\n axisOptions = definitions[i];\n axisPane = plotArea.findPane(axisOptions.pane);\n if (inArray(axisPane, panes)) {\n name = axisOptions.name;\n categories = axisOptions.categories || [];\n type = axisOptions.type || '';\n axisOptions = deepExtend({\n vertical: invertAxes,\n axisCrossingValue: invertAxes ? MAX_VALUE : 0,\n _deferLabels: true\n }, axisOptions);\n if (!defined(axisOptions.justified)) {\n axisOptions.justified = plotArea.isJustified();\n }\n if (plotArea.axisRequiresRounding(name, i)) {\n axisOptions.justified = false;\n }\n if (isDateAxis(axisOptions, categories[0])) {\n categoryAxis = new DateCategoryAxis(axisOptions);\n } else {\n categoryAxis = new CategoryAxis(axisOptions);\n }\n if (name) {\n if (plotArea.namedCategoryAxes[name]) {\n throw new Error('Category axis with name ' + name + ' is already defined');\n }\n plotArea.namedCategoryAxes[name] = categoryAxis;\n }\n categoryAxis.axisIndex = i;\n axes.push(categoryAxis);\n plotArea.appendAxis(categoryAxis);\n }\n }\n primaryAxis = plotArea.categoryAxis || axes[0];\n plotArea.categoryAxis = primaryAxis;\n if (invertAxes) {\n plotArea.axisY = primaryAxis;\n } else {\n plotArea.axisX = primaryAxis;\n }\n },\n isJustified: function () {\n var plotArea = this, series = plotArea.series, i, currentSeries;\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n if (!inArray(currentSeries.type, [\n AREA,\n VERTICAL_AREA\n ])) {\n return false;\n }\n }\n return true;\n },\n createValueAxes: function (panes) {\n var plotArea = this, tracker = plotArea.valueAxisRangeTracker, defaultRange = tracker.query(), definitions = [].concat(plotArea.options.valueAxis), invertAxes = plotArea.invertAxes, baseOptions = { vertical: !invertAxes }, axisOptions, axisPane, valueAxis, primaryAxis, axes = [], range, axisType, defaultAxisRange, name, i;\n if (plotArea.stack100) {\n baseOptions.roundToMajorUnit = false;\n baseOptions.labels = { format: 'P0' };\n }\n for (i = 0; i < definitions.length; i++) {\n axisOptions = definitions[i];\n axisPane = plotArea.findPane(axisOptions.pane);\n if (inArray(axisPane, panes)) {\n name = axisOptions.name;\n defaultAxisRange = equalsIgnoreCase(axisOptions.type, LOGARITHMIC) ? {\n min: 0.1,\n max: 1\n } : {\n min: 0,\n max: 1\n };\n range = tracker.query(name) || defaultRange || defaultAxisRange;\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 if (equalsIgnoreCase(axisOptions.type, LOGARITHMIC)) {\n axisType = LogarithmicAxis;\n } else {\n axisType = NumericAxis;\n }\n valueAxis = new axisType(range.min, range.max, deepExtend({}, baseOptions, axisOptions));\n if (name) {\n if (plotArea.namedValueAxes[name]) {\n throw new Error('Value axis with name ' + name + ' is already defined');\n }\n plotArea.namedValueAxes[name] = valueAxis;\n }\n valueAxis.axisIndex = i;\n axes.push(valueAxis);\n plotArea.appendAxis(valueAxis);\n }\n }\n primaryAxis = plotArea.valueAxis || axes[0];\n plotArea.valueAxis = primaryAxis;\n if (invertAxes) {\n plotArea.axisX = primaryAxis;\n } else {\n plotArea.axisY = primaryAxis;\n }\n },\n _dispatchEvent: function (chart, e, eventType) {\n var plotArea = this, coords = chart._eventCoordinates(e), point = new Point2D(coords.x, coords.y), pane = plotArea.pointPane(point), allAxes, i, axis, categories = [], values = [];\n if (!pane) {\n return;\n }\n allAxes = pane.axes;\n for (i = 0; i < allAxes.length; i++) {\n axis = allAxes[i];\n if (axis.getValue) {\n appendIfNotNull(values, axis.getValue(point));\n } else {\n appendIfNotNull(categories, axis.getCategory(point));\n }\n }\n if (categories.length === 0) {\n appendIfNotNull(categories, plotArea.categoryAxis.getCategory(point));\n }\n if (categories.length > 0 && values.length > 0) {\n chart.trigger(eventType, {\n element: eventTargetElement(e),\n originalEvent: e,\n category: singleItemOrArray(categories),\n value: singleItemOrArray(values)\n });\n }\n },\n pointPane: function (point) {\n var plotArea = this, panes = plotArea.panes, currentPane, i;\n for (i = 0; i < panes.length; i++) {\n currentPane = panes[i];\n if (currentPane.contentBox.containsPoint(point)) {\n return currentPane;\n }\n }\n },\n updateAxisOptions: function (axis, options) {\n var axesOptions = axis instanceof CategoryAxis ? [].concat(this.options.categoryAxis) : [].concat(this.options.valueAxis);\n deepExtend(axesOptions[axis.axisIndex], options);\n }\n });\n deepExtend(CategoricalPlotArea.fn, PlotAreaEventsMixin);\n var AxisGroupRangeTracker = Class.extend({\n init: function () {\n var tracker = this;\n tracker.axisRanges = {};\n },\n update: function (chartAxisRanges) {\n var tracker = this, axisRanges = tracker.axisRanges, range, chartRange, axisName;\n for (axisName in chartAxisRanges) {\n range = axisRanges[axisName];\n chartRange = chartAxisRanges[axisName];\n axisRanges[axisName] = range = range || {\n min: MAX_VALUE,\n 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 reset: function (axisName) {\n this.axisRanges[axisName] = undefined;\n },\n query: function (axisName) {\n return this.axisRanges[axisName];\n }\n });\n var XYPlotArea = PlotAreaBase.extend({\n init: function (series, options) {\n var plotArea = this;\n plotArea.namedXAxes = {};\n plotArea.namedYAxes = {};\n plotArea.xAxisRangeTracker = new AxisGroupRangeTracker();\n plotArea.yAxisRangeTracker = new AxisGroupRangeTracker();\n PlotAreaBase.fn.init.call(plotArea, series, options);\n },\n options: {\n xAxis: {},\n yAxis: {}\n },\n render: function (panes) {\n var plotArea = this, seriesByPane = plotArea.groupSeriesByPane(), i, pane, paneSeries, filteredSeries;\n panes = panes || plotArea.panes;\n for (i = 0; i < panes.length; i++) {\n pane = panes[i];\n paneSeries = seriesByPane[pane.options.name || 'default'] || [];\n plotArea.addToLegend(paneSeries);\n filteredSeries = plotArea.filterVisibleSeries(paneSeries);\n if (!filteredSeries) {\n continue;\n }\n plotArea.createScatterChart(filterSeriesByType(filteredSeries, SCATTER), pane);\n plotArea.createScatterLineChart(filterSeriesByType(filteredSeries, SCATTER_LINE), pane);\n plotArea.createBubbleChart(filterSeriesByType(filteredSeries, BUBBLE), pane);\n }\n plotArea.createAxes(panes);\n },\n appendChart: function (chart, pane) {\n var plotArea = this;\n plotArea.xAxisRangeTracker.update(chart.xAxisRanges);\n plotArea.yAxisRangeTracker.update(chart.yAxisRanges);\n PlotAreaBase.fn.appendChart.call(plotArea, chart, pane);\n },\n removeAxis: function (axis) {\n var plotArea = this, axisName = axis.options.name;\n PlotAreaBase.fn.removeAxis.call(plotArea, axis);\n if (axis.options.vertical) {\n plotArea.yAxisRangeTracker.reset(axisName);\n delete plotArea.namedYAxes[axisName];\n } else {\n plotArea.xAxisRangeTracker.reset(axisName);\n delete plotArea.namedXAxes[axisName];\n }\n if (axis === plotArea.axisX) {\n delete plotArea.axisX;\n }\n if (axis === plotArea.axisY) {\n delete plotArea.axisY;\n }\n },\n seriesPaneName: function (series) {\n var plotArea = this, options = plotArea.options, xAxisName = series.xAxis, xAxisOptions = [].concat(options.xAxis), xAxis = $.grep(xAxisOptions, function (a) {\n return a.name === xAxisName;\n })[0], yAxisName = series.yAxis, yAxisOptions = [].concat(options.yAxis), yAxis = $.grep(yAxisOptions, function (a) {\n return a.name === yAxisName;\n })[0], panes = options.panes || [{}], defaultPaneName = panes[0].name || 'default', paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n return paneName;\n },\n createScatterChart: function (series, pane) {\n var plotArea = this;\n if (series.length > 0) {\n plotArea.appendChart(new ScatterChart(plotArea, {\n series: series,\n clip: pane.options.clip\n }), pane);\n }\n },\n createScatterLineChart: function (series, pane) {\n var plotArea = this;\n if (series.length > 0) {\n plotArea.appendChart(new ScatterLineChart(plotArea, {\n series: series,\n clip: pane.options.clip\n }), pane);\n }\n },\n createBubbleChart: function (series, pane) {\n var plotArea = this;\n if (series.length > 0) {\n plotArea.appendChart(new BubbleChart(plotArea, {\n series: series,\n clip: pane.options.clip\n }), pane);\n }\n },\n createXYAxis: function (options, vertical, axisIndex) {\n var plotArea = this, axisName = options.name, namedAxes = vertical ? plotArea.namedYAxes : plotArea.namedXAxes, tracker = vertical ? plotArea.yAxisRangeTracker : plotArea.xAxisRangeTracker, axisOptions = deepExtend({}, options, { vertical: vertical }), isLog = equalsIgnoreCase(axisOptions.type, LOGARITHMIC), defaultRange = tracker.query(), defaultAxisRange = isLog ? {\n min: 0.1,\n max: 1\n } : {\n min: 0,\n max: 1\n }, range = tracker.query(axisName) || defaultRange || defaultAxisRange, axis, axisType, seriesIx, series = plotArea.series, currentSeries, seriesAxisName, firstPointValue, typeSamples = [\n axisOptions.min,\n axisOptions.max\n ], inferredDate, i;\n for (seriesIx = 0; seriesIx < series.length; seriesIx++) {\n currentSeries = series[seriesIx];\n seriesAxisName = currentSeries[vertical ? 'yAxis' : 'xAxis'];\n if (seriesAxisName == axisOptions.name || axisIndex === 0 && !seriesAxisName) {\n firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n typeSamples.push(firstPointValue[vertical ? 'y' : 'x']);\n break;\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 for (i = 0; i < typeSamples.length; i++) {\n if (typeSamples[i] instanceof Date) {\n inferredDate = true;\n break;\n }\n }\n if (equalsIgnoreCase(axisOptions.type, DATE) || !axisOptions.type && inferredDate) {\n axisType = DateValueAxis;\n } else if (isLog) {\n axisType = LogarithmicAxis;\n } else {\n axisType = NumericAxis;\n }\n axis = new axisType(range.min, range.max, axisOptions);\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 plotArea.appendAxis(axis);\n return axis;\n },\n createAxes: function (panes) {\n var plotArea = this, options = plotArea.options, axisPane, xAxesOptions = [].concat(options.xAxis), xAxes = [], yAxesOptions = [].concat(options.yAxis), yAxes = [];\n each(xAxesOptions, function (i) {\n axisPane = plotArea.findPane(this.pane);\n if (inArray(axisPane, panes)) {\n xAxes.push(plotArea.createXYAxis(this, false, i));\n }\n });\n each(yAxesOptions, function (i) {\n axisPane = plotArea.findPane(this.pane);\n if (inArray(axisPane, panes)) {\n yAxes.push(plotArea.createXYAxis(this, true, i));\n }\n });\n plotArea.axisX = plotArea.axisX || xAxes[0];\n plotArea.axisY = plotArea.axisY || yAxes[0];\n },\n _dispatchEvent: function (chart, e, eventType) {\n var plotArea = this, coords = chart._eventCoordinates(e), point = new Point2D(coords.x, coords.y), allAxes = plotArea.axes, i, length = allAxes.length, axis, xValues = [], yValues = [], currentValue, values;\n for (i = 0; i < length; i++) {\n axis = allAxes[i];\n values = axis.options.vertical ? yValues : xValues;\n currentValue = axis.getValue(point);\n if (currentValue !== null) {\n values.push(currentValue);\n }\n }\n if (xValues.length > 0 && yValues.length > 0) {\n chart.trigger(eventType, {\n element: eventTargetElement(e),\n originalEvent: e,\n x: singleItemOrArray(xValues),\n y: singleItemOrArray(yValues)\n });\n }\n },\n updateAxisOptions: function (axis, options) {\n var vertical = axis.options.vertical;\n var axes = this.groupAxes(this.panes);\n var index = indexOf(axis, vertical ? axes.y : axes.x);\n var axisOptions = [].concat(vertical ? this.options.yAxis : this.options.xAxis)[index];\n deepExtend(axisOptions, options);\n }\n });\n deepExtend(XYPlotArea.fn, PlotAreaEventsMixin);\n var PiePlotArea = PlotAreaBase.extend({\n render: function () {\n var plotArea = this, series = plotArea.series;\n plotArea.createPieChart(series);\n },\n createPieChart: function (series) {\n var plotArea = this, firstSeries = series[0], pieChart = new PieChart(plotArea, {\n series: series,\n padding: firstSeries.padding,\n startAngle: firstSeries.startAngle,\n connectors: firstSeries.connectors,\n legend: plotArea.options.legend\n });\n plotArea.appendChart(pieChart);\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 var DonutPlotArea = PiePlotArea.extend({\n render: function () {\n var plotArea = this, series = plotArea.series;\n plotArea.createDonutChart(series);\n },\n createDonutChart: function (series) {\n var plotArea = this, firstSeries = series[0], donutChart = new DonutChart(plotArea, {\n series: series,\n padding: firstSeries.padding,\n connectors: firstSeries.connectors,\n legend: plotArea.options.legend\n });\n plotArea.appendChart(donutChart);\n }\n });\n var PieAnimation = draw.Animation.extend({\n options: {\n easing: 'easeOutElastic',\n duration: INITIAL_ANIMATION_DURATION\n },\n setup: function () {\n this.element.transform(geom.transform().scale(START_SCALE, START_SCALE, this.options.center));\n },\n step: function (pos) {\n this.element.transform(geom.transform().scale(pos, pos, this.options.center));\n }\n });\n draw.AnimationFactory.current.register(PIE, PieAnimation);\n var BubbleAnimation = draw.Animation.extend({\n options: { easing: 'easeOutElastic' },\n setup: function () {\n var center = this.center = this.element.bbox().center();\n this.element.transform(geom.transform().scale(START_SCALE, START_SCALE, center));\n },\n step: function (pos) {\n this.element.transform(geom.transform().scale(pos, pos, this.center));\n }\n });\n draw.AnimationFactory.current.register(BUBBLE, BubbleAnimation);\n var Highlight = Class.extend({\n init: function () {\n this._points = [];\n },\n destroy: function () {\n this._points = [];\n },\n show: function (points) {\n points = [].concat(points);\n this.hide();\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n if (point && point.toggleHighlight && point.hasHighlight()) {\n this.togglePointHighlight(point, true);\n this._points.push(point);\n }\n }\n },\n togglePointHighlight: function (point, show) {\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);\n }\n } else {\n point.toggleHighlight(show);\n }\n },\n hide: function () {\n var points = this._points;\n while (points.length) {\n this.togglePointHighlight(points.pop(), false);\n }\n },\n isHighlighted: function (element) {\n var points = this._points;\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n if (element == point) {\n return true;\n }\n }\n return false;\n }\n });\n var BaseTooltip = Observable.extend({\n init: function (chartElement, options) {\n var tooltip = this;\n Observable.fn.init.call(tooltip);\n tooltip.options = deepExtend({}, tooltip.options, options);\n tooltip.chartElement = chartElement;\n tooltip.template = BaseTooltip.template;\n if (!tooltip.template) {\n tooltip.template = BaseTooltip.template = renderTemplate('' + '
');\n }\n var padding = getSpacing(tooltip.options.padding || {}, 'auto');\n tooltip.element = $(tooltip.template(tooltip.options)).css({\n 'padding-top': padding.top,\n 'padding-right': padding.right,\n 'padding-bottom': padding.bottom,\n 'padding-left': padding.left\n });\n tooltip.move = proxy(tooltip.move, tooltip);\n tooltip._mouseleave = proxy(tooltip._mouseleave, tooltip);\n var mobileScrollerSelector = kendo.format('[{0}=\\'content\\'],[{0}=\\'scroller\\']', kendo.attr('role'));\n tooltip._mobileScroller = chartElement.closest(mobileScrollerSelector).data('kendoMobileScroller');\n },\n destroy: function () {\n this._clearShowTimeout();\n if (this.element) {\n this.element.off(MOUSELEAVE_NS).remove();\n this.element = null;\n }\n },\n options: {\n border: { width: 1 },\n opacity: 1,\n animation: { duration: TOOLTIP_ANIMATION_DURATION }\n },\n move: function () {\n var tooltip = this, options = tooltip.options, element = tooltip.element, offset;\n if (!tooltip.anchor || !tooltip.element) {\n return;\n }\n offset = tooltip._offset();\n if (!tooltip.visible) {\n element.css({\n top: offset.top,\n left: offset.left\n });\n }\n tooltip.visible = true;\n tooltip._ensureElement(document.body);\n element.stop(true, true).show().animate({\n left: offset.left,\n top: offset.top\n }, options.animation.duration);\n },\n _clearShowTimeout: function () {\n if (this.showTimeout) {\n clearTimeout(this.showTimeout);\n this.showTimeout = null;\n }\n },\n _padding: function () {\n if (!this._chartPadding) {\n var chartElement = this.chartElement;\n this._chartPadding = {\n top: parseInt(chartElement.css('paddingTop'), 10),\n left: parseInt(chartElement.css('paddingLeft'), 10)\n };\n }\n return this._chartPadding;\n },\n _offset: function () {\n var tooltip = this, size = tooltip._measure(), anchor = tooltip.anchor, chartPadding = tooltip._padding(), chartOffset = tooltip.chartElement.offset(), top = round(anchor.y + chartPadding.top + chartOffset.top), left = round(anchor.x + chartPadding.left + chartOffset.left), zoomLevel = kendo.support.zoomLevel(), viewport = $(window), scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0, scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0, movable = (this._mobileScroller || {}).movable;\n if (!movable || movable.scale === 1) {\n top += tooltip._fit(top - scrollTop, size.height, viewport.outerHeight() / zoomLevel);\n left += tooltip._fit(left - scrollLeft, size.width, viewport.outerWidth() / zoomLevel);\n } else {\n var transform = geom.transform().scale(movable.scale, movable.scale, [\n movable.x,\n movable.y\n ]);\n var point = new geom.Point(left, top).transform(transform);\n left = point.x;\n top = point.y;\n }\n return {\n top: top,\n left: left\n };\n },\n setStyle: function (options, point) {\n var background = options.background;\n var border = options.border.color;\n if (point) {\n var pointColor = point.color || point.options.color;\n background = valueOrDefault(background, pointColor);\n border = valueOrDefault(border, pointColor);\n }\n if (!defined(options.color)) {\n var brightness = new Color(background).percBrightness();\n this.element.toggleClass(CSS_PREFIX + TOOLTIP_INVERSE, brightness > 180);\n }\n this.element.css({\n backgroundColor: background,\n borderColor: border,\n font: options.font,\n color: options.color,\n opacity: options.opacity,\n borderWidth: options.border.width\n });\n },\n show: function () {\n this._clearShowTimeout();\n this.showTimeout = setTimeout(this.move, TOOLTIP_SHOW_DELAY);\n },\n hide: function () {\n var tooltip = this;\n clearTimeout(tooltip.showTimeout);\n tooltip._hideElement();\n if (tooltip.visible) {\n tooltip.point = null;\n tooltip.visible = false;\n tooltip.index = null;\n }\n },\n _measure: function () {\n this._ensureElement();\n var size = {\n width: this.element.outerWidth(),\n height: this.element.outerHeight()\n };\n return size;\n },\n _ensureElement: function () {\n if (this.element) {\n this.element.appendTo(document.body).on(MOUSELEAVE_NS, this._mouseleave);\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 this.hide();\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 _pointContent: function (point) {\n var tooltip = this, options = deepExtend({}, tooltip.options, point.options.tooltip), content, tooltipTemplate;\n if (defined(point.value)) {\n content = point.value.toString();\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 return content;\n },\n _pointAnchor: function (point) {\n var size = this._measure();\n return point.tooltipAnchor(size.width, size.height);\n },\n _fit: function (offset, size, viewPortSize) {\n var output = 0;\n if (offset + size > viewPortSize) {\n output = viewPortSize - (offset + size);\n }\n if (offset < 0) {\n output = -offset;\n }\n return output;\n }\n });\n var Tooltip = BaseTooltip.extend({\n show: function (point) {\n var tooltip = this, options = deepExtend({}, tooltip.options, point.options.tooltip);\n if (!point || !point.tooltipAnchor || !tooltip.element) {\n return;\n }\n tooltip.element.html(tooltip._pointContent(point));\n tooltip.anchor = tooltip._pointAnchor(point);\n if (tooltip.anchor) {\n tooltip.setStyle(options, point);\n BaseTooltip.fn.show.call(tooltip, point);\n } else {\n tooltip.hide();\n }\n }\n });\n var SharedTooltip = BaseTooltip.extend({\n init: function (element, plotArea, options) {\n var tooltip = this;\n BaseTooltip.fn.init.call(tooltip, element, options);\n tooltip.plotArea = plotArea;\n },\n options: {\n sharedTemplate: '' + '#= categoryText # | ' + '# for(var i = 0; i < points.length; i++) { #' + '# var point = points[i]; #' + '' + '# if(point.series.name) { # ' + ' #= point.series.name #: | ' + '# } #' + '#= content(point) # | ' + '
' + '# } #' + '
',\n categoryFormat: '{0:d}'\n },\n showAt: function (points, coords) {\n points = $.grep(points, function (p) {\n var tooltip = p.series.tooltip, excluded = tooltip && tooltip.visible === false;\n return !excluded;\n });\n if (points.length > 0) {\n var point = points[0];\n var slot = this.plotArea.categoryAxis.getSlot(point.categoryIx);\n var content = this._content(points, point.category);\n this.element.html(content);\n this.anchor = coords ? this._slotAnchor(coords, slot) : this._defaultAnchor(point, slot);\n this.setStyle(this.options, point);\n BaseTooltip.fn.show.call(this);\n }\n },\n _slotAnchor: function (point, slot) {\n var tooltip = this, plotArea = tooltip.plotArea, axis = plotArea.categoryAxis, anchor, size = this._measure(), hCenter = point.y - size.height / 2;\n if (axis.options.vertical) {\n anchor = Point2D(point.x, hCenter);\n } else {\n anchor = Point2D(slot.center().x, hCenter);\n }\n return anchor;\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 size = this._measure();\n var anchor;\n if (vertical) {\n anchor = new Point2D(center.x, slotCenter.y);\n } else {\n anchor = new Point2D(slotCenter.x, center.y);\n }\n anchor.x -= size.width / 2;\n anchor.y -= size.height / 2;\n return anchor;\n },\n _content: function (points, category) {\n var tooltip = this, template, content;\n template = kendo.template(tooltip.options.sharedTemplate);\n content = template({\n points: points,\n category: category,\n categoryText: autoFormat(tooltip.options.categoryFormat, category),\n content: tooltip._pointContent\n });\n return content;\n }\n });\n var Crosshair = ChartElement.extend({\n init: function (axis, options) {\n ChartElement.fn.init.call(this, options);\n this.axis = axis;\n this.stickyMode = axis instanceof CategoryAxis;\n },\n options: {\n color: BLACK,\n width: 1,\n zIndex: -1,\n tooltip: { visible: false }\n },\n showAt: function (point) {\n this.point = point;\n this.moveLine();\n this.line.visible(true);\n var tooltipOptions = this.options.tooltip;\n if (tooltipOptions.visible) {\n if (!this.tooltip) {\n this.tooltip = new CrosshairTooltip(this, deepExtend({}, tooltipOptions, { stickyMode: this.stickyMode }));\n }\n this.tooltip.showAt(point);\n }\n },\n hide: function () {\n this.line.visible(false);\n if (this.tooltip) {\n this.tooltip.hide();\n }\n },\n moveLine: function () {\n var crosshair = this, axis = crosshair.axis, vertical = axis.options.vertical, box = crosshair.getBox(), point = crosshair.point, dim = vertical ? Y : X, slot, lineStart, lineEnd;\n lineStart = new geom.Point(box.x1, box.y1);\n if (vertical) {\n lineEnd = new geom.Point(box.x2, box.y1);\n } else {\n lineEnd = new geom.Point(box.x1, box.y2);\n }\n if (point) {\n if (crosshair.stickyMode) {\n 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 crosshair.box = box;\n this.line.moveTo(lineStart).lineTo(lineEnd);\n },\n getBox: function () {\n var crosshair = this, axis = crosshair.axis, axes = axis.pane.axes, length = axes.length, vertical = axis.options.vertical, box = axis.lineBox().clone(), dim = vertical ? X : Y, axisLineBox, currentAxis, i;\n for (i = 0; i < length; i++) {\n 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 box[dim + 1] = axisLineBox[dim + 1];\n box[dim + 2] = axisLineBox[dim + 2];\n return box;\n },\n createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n var options = this.options;\n this.line = new draw.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 this.moveLine();\n this.visual.append(this.line);\n },\n destroy: function () {\n var crosshair = this;\n if (crosshair.tooltip) {\n crosshair.tooltip.destroy();\n }\n ChartElement.fn.destroy.call(crosshair);\n }\n });\n var CrosshairTooltip = BaseTooltip.extend({\n init: function (crosshair, options) {\n var tooltip = this, chartElement = crosshair.axis.getRoot().chart.element;\n tooltip.crosshair = crosshair;\n BaseTooltip.fn.init.call(tooltip, chartElement, deepExtend({}, tooltip.options, { background: crosshair.axis.plotArea.options.seriesColors[0] }, options));\n tooltip.setStyle(tooltip.options);\n },\n options: { padding: 10 },\n showAt: function (point) {\n var tooltip = this, element = tooltip.element;\n if (element) {\n tooltip.point = point;\n tooltip.element.html(tooltip.content(point));\n tooltip.anchor = tooltip.getAnchor();\n tooltip.move();\n }\n },\n move: function () {\n var tooltip = this, element = tooltip.element, offset = tooltip._offset();\n tooltip._ensureElement();\n element.css({\n top: offset.top,\n left: offset.left\n }).show();\n },\n content: function (point) {\n var tooltip = this, options = tooltip.options, axis = tooltip.crosshair.axis, axisOptions = axis.options, content, value, tooltipTemplate;\n value = content = axis[options.stickyMode ? 'getCategory' : 'getValue'](point);\n if (options.template) {\n tooltipTemplate = template(options.template);\n content = tooltipTemplate({ value: value });\n } else if (options.format) {\n content = autoFormat(options.format, value);\n } else {\n if (axisOptions.type === DATE) {\n content = autoFormat(axisOptions.labels.dateFormats[axisOptions.baseUnit], value);\n }\n }\n return content;\n },\n getAnchor: function () {\n var tooltip = this, options = tooltip.options, position = options.position, crosshair = this.crosshair, vertical = !crosshair.axis.options.vertical, lineBox = crosshair.line.bbox(), size = this._measure(), halfWidth = size.width / 2, halfHeight = size.height / 2, padding = options.padding, anchor;\n if (vertical) {\n if (position === BOTTOM) {\n anchor = lineBox.bottomLeft().translate(-halfWidth, padding);\n } else {\n anchor = lineBox.topLeft().translate(-halfWidth, -size.height - padding);\n }\n } else {\n if (position === LEFT) {\n anchor = lineBox.topLeft().translate(-size.width - padding, -halfHeight);\n } else {\n anchor = lineBox.topRight().translate(padding, -halfHeight);\n }\n }\n return anchor;\n },\n hide: function () {\n this.element.hide();\n this.point = null;\n },\n destroy: function () {\n BaseTooltip.fn.destroy.call(this);\n this.point = null;\n }\n });\n var Aggregates = {\n min: function (values) {\n var min = MAX_VALUE, length = values.length, i, n;\n for (i = 0; i < length; i++) {\n n = values[i];\n if (isNumber(n)) {\n min = math.min(min, n);\n }\n }\n return min === MAX_VALUE ? values[0] : min;\n },\n max: function (values) {\n var max = MIN_VALUE, length = values.length, i, n;\n for (i = 0; i < length; i++) {\n n = values[i];\n if (isNumber(n)) {\n max = math.max(max, n);\n }\n }\n return max === MIN_VALUE ? values[0] : max;\n },\n sum: function (values) {\n var length = values.length, sum = 0, i, n;\n for (i = 0; i < length; i++) {\n n = values[i];\n if (isNumber(n)) {\n sum += n;\n }\n }\n return sum;\n },\n sumOrNull: function (values) {\n var result = null;\n if (countNumbers(values)) {\n result = Aggregates.sum(values);\n }\n return result;\n },\n count: function (values) {\n var length = values.length, count = 0, i, val;\n for (i = 0; i < length; i++) {\n val = values[i];\n if (val !== null && defined(val)) {\n count++;\n }\n }\n return count;\n },\n avg: function (values) {\n var result = values[0], count = countNumbers(values);\n if (count > 0) {\n result = Aggregates.sum(values) / count;\n }\n return result;\n },\n first: function (values) {\n var length = values.length, i, val;\n for (i = 0; i < length; i++) {\n val = values[i];\n if (val !== null && defined(val)) {\n return val;\n }\n }\n return values[0];\n }\n };\n function DefaultAggregates() {\n this._defaults = {};\n }\n DefaultAggregates.prototype = {\n register: function (seriesTypes, aggregates) {\n for (var i = 0; i < seriesTypes.length; i++) {\n this._defaults[seriesTypes[i]] = aggregates;\n }\n },\n query: function (seriesType) {\n return this._defaults[seriesType];\n }\n };\n DefaultAggregates.current = new DefaultAggregates();\n var Selection = Observable.extend({\n init: function (chart, categoryAxis, options) {\n var that = this, chartElement = chart.element, categoryAxisLineBox = categoryAxis.lineBox(), valueAxis = that.getValueAxis(categoryAxis), valueAxisLineBox = valueAxis.lineBox(), selectorPrefix = '.' + CSS_PREFIX, wrapper, padding;\n Observable.fn.init.call(that);\n that.options = deepExtend({}, that.options, options);\n options = that.options;\n that.chart = chart;\n that.chartElement = chartElement;\n that.categoryAxis = categoryAxis;\n that._dateAxis = that.categoryAxis instanceof DateCategoryAxis;\n that.valueAxis = valueAxis;\n if (that._dateAxis) {\n deepExtend(options, {\n min: toDate(options.min),\n max: toDate(options.max),\n from: toDate(options.from),\n to: toDate(options.to)\n });\n }\n that.template = Selection.template;\n if (!that.template) {\n that.template = Selection.template = renderTemplate('');\n }\n padding = {\n left: parseInt(chartElement.css('paddingLeft'), 10),\n right: parseInt(chartElement.css('paddingTop'), 10)\n };\n that.options = deepExtend({}, {\n width: categoryAxisLineBox.width(),\n height: valueAxisLineBox.height(),\n padding: padding,\n offset: {\n left: valueAxisLineBox.x2 + padding.left,\n top: valueAxisLineBox.y1 + padding.right\n },\n from: options.min,\n to: options.max\n }, options);\n if (that.options.visible) {\n that.wrapper = wrapper = $(that.template(that.options)).appendTo(chartElement);\n that.selection = wrapper.find(selectorPrefix + 'selection');\n that.leftMask = wrapper.find(selectorPrefix + 'mask').first();\n that.rightMask = wrapper.find(selectorPrefix + 'mask').last();\n that.leftHandle = wrapper.find(selectorPrefix + 'leftHandle');\n that.rightHandle = wrapper.find(selectorPrefix + 'rightHandle');\n that.options.selection = {\n border: {\n left: parseFloat(that.selection.css('border-left-width'), 10),\n right: parseFloat(that.selection.css('border-right-width'), 10)\n }\n };\n that.leftHandle.css('top', (that.selection.height() - that.leftHandle.height()) / 2);\n that.rightHandle.css('top', (that.selection.height() - that.rightHandle.height()) / 2);\n that.set(that._index(options.from), that._index(options.to));\n that.bind(that.events, that.options);\n that.wrapper[0].style.cssText = that.wrapper[0].style.cssText;\n if (that.options.mousewheel !== false) {\n that.wrapper.on(MOUSEWHEEL_NS, proxy(that._mousewheel, that));\n } else {\n that.wrapper.on(MOUSEWHEEL_NS, function (e) {\n e.stopPropagation();\n });\n }\n if (kendo.UserEvents) {\n that.userEvents = new kendo.UserEvents(that.wrapper, {\n global: true,\n stopPropagation: true,\n multiTouch: true,\n fastTap: true,\n press: proxy(that._press, that),\n start: proxy(that._start, that),\n move: proxy(that._move, that),\n end: proxy(that._end, that),\n tap: proxy(that._tap, that),\n gesturestart: proxy(that._gesturechange, that),\n gesturechange: proxy(that._gesturechange, that)\n });\n } else {\n that.leftHandle.add(that.rightHandle).removeClass(CSS_PREFIX + 'handle');\n }\n }\n },\n events: [\n SELECT_START,\n SELECT,\n SELECT_END\n ],\n options: {\n visible: true,\n mousewheel: { zoom: BOTH },\n min: MIN_VALUE,\n max: MAX_VALUE\n },\n destroy: function () {\n var that = this, userEvents = that.userEvents;\n if (userEvents) {\n userEvents.destroy();\n }\n clearTimeout(that._mwTimeout);\n that._state = null;\n if (that.wrapper) {\n that.wrapper.remove();\n }\n },\n _rangeEventArgs: function (range) {\n var that = this;\n return {\n axis: that.categoryAxis.options,\n from: that._value(range.from),\n to: that._value(range.to)\n };\n },\n _start: function (e) {\n var that = this, options = that.options, target = $(e.event.target), args;\n if (that._state || !target) {\n return;\n }\n that.chart._unsetActivePoint();\n that._state = {\n moveTarget: target.parents('.k-handle').add(target).first(),\n startLocation: e.x ? e.x.location : 0,\n range: {\n from: that._index(options.from),\n to: that._index(options.to)\n }\n };\n args = that._rangeEventArgs({\n from: that._index(options.from),\n to: that._index(options.to)\n });\n if (that.trigger(SELECT_START, args)) {\n that.userEvents.cancel();\n that._state = null;\n }\n },\n _press: function (e) {\n var handle;\n if (this._state) {\n handle = this._state.moveTarget;\n } else {\n var target = $(e.event.target);\n handle = target.parents('.k-handle').add(target).first();\n }\n handle.addClass('k-handle-active');\n },\n _move: function (e) {\n if (!this._state) {\n return;\n }\n var that = this, state = that._state, options = that.options, categories = that.categoryAxis.options.categories, from = that._index(options.from), to = that._index(options.to), min = that._index(options.min), max = that._index(options.max), delta = state.startLocation - e.x.location, range = state.range, oldRange = {\n from: range.from,\n to: range.to\n }, span = range.to - range.from, target = state.moveTarget, scale = that.wrapper.width() / (categories.length - 1), offset = math.round(delta / scale);\n if (!target) {\n return;\n }\n e.preventDefault();\n if (target.is('.k-selection, .k-selection-bg')) {\n range.from = math.min(math.max(min, from - offset), max - span);\n range.to = math.min(range.from + span, max);\n } else if (target.is('.k-leftHandle')) {\n range.from = math.min(math.max(min, from - offset), max - 1);\n range.to = math.max(range.from + 1, range.to);\n } else if (target.is('.k-rightHandle')) {\n range.to = math.min(math.max(min + 1, to - offset), max);\n range.from = math.min(range.to - 1, range.from);\n }\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n that.move(range.from, range.to);\n that.trigger(SELECT, that._rangeEventArgs(range));\n }\n },\n _end: function () {\n var range = this._state.range;\n if (this._state) {\n var moveTarget = this._state.moveTarget;\n if (moveTarget) {\n moveTarget.removeClass('k-handle-active');\n }\n delete this._state;\n }\n this.set(range.from, range.to);\n this.trigger(SELECT_END, this._rangeEventArgs(range));\n },\n _gesturechange: function (e) {\n if (!this._state) {\n return;\n }\n var that = this, chart = that.chart, state = that._state, options = that.options, categoryAxis = that.categoryAxis, range = state.range, p0 = chart._toModelCoordinates(e.touches[0].x.location).x, p1 = chart._toModelCoordinates(e.touches[1].x.location).x, left = math.min(p0, p1), right = math.max(p0, p1);\n e.preventDefault();\n state.moveTarget = null;\n range.from = categoryAxis.pointCategoryIndex(new dataviz.Point2D(left)) || options.min;\n range.to = categoryAxis.pointCategoryIndex(new dataviz.Point2D(right)) || options.max;\n that.move(range.from, range.to);\n },\n _tap: function (e) {\n var that = this, options = that.options, coords = that.chart._eventCoordinates(e), categoryAxis = that.categoryAxis, categoryIx = categoryAxis.pointCategoryIndex(new dataviz.Point2D(coords.x, categoryAxis.box.y1)), from = that._index(options.from), to = that._index(options.to), min = that._index(options.min), max = that._index(options.max), span = to - from, mid = from + span / 2, offset = math.round(mid - categoryIx), range = {}, rightClick = e.event.which === 3;\n if (that._state || rightClick) {\n return;\n }\n e.preventDefault();\n that.chart._unsetActivePoint();\n if (!categoryAxis.options.justified) {\n offset--;\n }\n range.from = math.min(math.max(min, from - offset), max - span);\n range.to = math.min(range.from + span, max);\n that._start(e);\n if (that._state) {\n that._state.range = range;\n that.trigger(SELECT, that._rangeEventArgs(range));\n that._end();\n }\n },\n _mousewheel: function (e) {\n var that = this, options = that.options, delta = mwDelta(e);\n that._start({ event: { target: that.selection } });\n if (that._state) {\n var range = that._state.range;\n e.preventDefault();\n e.stopPropagation();\n if (math.abs(delta) > 1) {\n delta *= ZOOM_ACCELERATION;\n }\n if (options.mousewheel.reverse) {\n delta *= -1;\n }\n if (that.expand(delta)) {\n that.trigger(SELECT, {\n axis: that.categoryAxis.options,\n delta: delta,\n originalEvent: e,\n from: that._value(range.from),\n to: that._value(range.to)\n });\n }\n if (that._mwTimeout) {\n clearTimeout(that._mwTimeout);\n }\n that._mwTimeout = setTimeout(function () {\n that._end();\n }, MOUSEWHEEL_DELAY);\n }\n },\n _index: function (value) {\n var index = value;\n if (value instanceof Date) {\n index = this.categoryAxis.categoryIndex(value);\n }\n return index;\n },\n _value: function (index) {\n var categories = this.categoryAxis.options.categories;\n var value = index;\n if (this._dateAxis) {\n if (index > categories.length - 1) {\n value = this.options.max;\n } else {\n value = categories[math.ceil(index)];\n }\n }\n return value;\n },\n _slot: function (value) {\n var categoryAxis = this.categoryAxis;\n var index = this._index(value);\n return categoryAxis.getSlot(index, index, true);\n },\n move: function (from, to) {\n var that = this, options = that.options, offset = options.offset, padding = options.padding, border = options.selection.border, leftMaskWidth, rightMaskWidth, box, distance;\n box = that._slot(from);\n leftMaskWidth = round(box.x1 - offset.left + padding.left);\n that.leftMask.width(leftMaskWidth);\n that.selection.css('left', leftMaskWidth);\n box = that._slot(to);\n rightMaskWidth = round(options.width - (box.x1 - offset.left + padding.left));\n that.rightMask.width(rightMaskWidth);\n distance = options.width - rightMaskWidth;\n if (distance != options.width) {\n distance += border.right;\n }\n that.rightMask.css('left', distance);\n that.selection.width(math.max(options.width - (leftMaskWidth + rightMaskWidth) - border.right, 0));\n },\n set: function (from, to) {\n var that = this, options = that.options, min = that._index(options.min), max = that._index(options.max);\n from = limitValue(that._index(from), min, max);\n to = limitValue(that._index(to), from + 1, max);\n if (options.visible) {\n that.move(from, to);\n }\n options.from = that._value(from);\n options.to = that._value(to);\n },\n expand: function (delta) {\n var that = this, options = that.options, min = that._index(options.min), max = that._index(options.max), zDir = options.mousewheel.zoom, from = that._index(options.from), to = that._index(options.to), range = {\n from: from,\n to: to\n }, oldRange = deepExtend({}, range);\n if (that._state) {\n range = that._state.range;\n }\n if (zDir !== RIGHT) {\n range.from = limitValue(limitValue(from - delta, 0, to - 1), min, max);\n }\n if (zDir !== LEFT) {\n range.to = limitValue(limitValue(to + delta, range.from + 1, max), min, max);\n }\n if (range.from !== oldRange.from || range.to !== oldRange.to) {\n that.set(range.from, range.to);\n return true;\n }\n },\n getValueAxis: function (categoryAxis) {\n var axes = categoryAxis.pane.axes, axesCount = axes.length, i, axis;\n for (i = 0; i < axesCount; i++) {\n axis = axes[i];\n if (axis.options.vertical !== categoryAxis.options.vertical) {\n return axis;\n }\n }\n }\n });\n var Pannable = Class.extend({\n init: function (plotArea, options) {\n this.plotArea = plotArea;\n this.options = deepExtend({}, this.options, options);\n },\n options: {\n key: 'none',\n lock: 'none'\n },\n start: function (e) {\n this._active = acceptKey(e.event, this.options.key);\n return this._active;\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 end: function () {\n var active = this._active;\n this._active = false;\n return active;\n },\n pan: function () {\n var plotArea = this.plotArea;\n var axisRanges = this.axisRanges;\n var range;\n if (axisRanges.length) {\n for (var idx = 0; idx < axisRanges.length; idx++) {\n range = axisRanges[idx];\n plotArea.updateAxisOptions(range.axis, range.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n destroy: function () {\n delete this.plotArea;\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 if (delta !== 0 && (lock || '').toLowerCase() != position) {\n var axes = plotArea.axes;\n var axis;\n var range;\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n if (position == X && !axis.options.vertical || position == Y && axis.options.vertical) {\n range = axis.pan(delta);\n if (range) {\n range.limitRange = true;\n updatedAxes.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n }\n return updatedAxes;\n }\n });\n var ZoomSelection = Class.extend({\n init: function (chart, options) {\n this.chart = chart;\n this.options = deepExtend({}, this.options, options);\n this._marquee = $('');\n },\n options: {\n key: 'shift',\n lock: 'none'\n },\n start: function (e) {\n if (acceptKey(e.event, this.options.key)) {\n var chart = this.chart;\n var point = chart._toModelCoordinates(e.x.client, e.y.client);\n var zoomPane = this._zoomPane = chart._plotArea.paneByPoint(point);\n if (zoomPane && zoomPane.clipBox()) {\n var clipBox = zoomPane.clipBox().clone();\n var elementOffset = this._elementOffset();\n clipBox.translate(elementOffset.left, elementOffset.top);\n this._zoomPaneClipBox = clipBox;\n this._marquee.appendTo(document.body).css({\n left: e.x.client + 1,\n top: e.y.client + 1,\n width: 0,\n height: 0\n });\n return true;\n }\n }\n return false;\n },\n _elementOffset: function () {\n var chartElement = this.chart.element;\n var chartOffset = chartElement.offset();\n return {\n left: parseInt(chartElement.css('paddingTop'), 10) + chartOffset.left,\n top: parseInt(chartElement.css('paddingLeft'), 10) + chartOffset.top\n };\n },\n move: function (e) {\n var zoomPane = this._zoomPane;\n if (zoomPane) {\n var selectionPosition = this._selectionPosition(e);\n this._marquee.css(selectionPosition);\n }\n },\n end: function (e) {\n var zoomPane = this._zoomPane;\n if (zoomPane) {\n var elementOffset = this._elementOffset();\n var selectionPosition = this._selectionPosition(e);\n selectionPosition.left -= elementOffset.left;\n selectionPosition.top -= elementOffset.top;\n var start = {\n x: selectionPosition.left,\n y: selectionPosition.top\n };\n var end = {\n x: selectionPosition.left + selectionPosition.width,\n y: selectionPosition.top + selectionPosition.height\n };\n this._updateAxisRanges(start, end);\n this._marquee.remove();\n delete this._zoomPane;\n return toChartAxisRanges(this.axisRanges);\n }\n },\n zoom: function () {\n var axisRanges = this.axisRanges;\n if (axisRanges && axisRanges.length) {\n var plotArea = this.chart._plotArea;\n var axisRange;\n for (var idx = 0; idx < axisRanges.length; idx++) {\n axisRange = axisRanges[idx];\n plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n destroy: function () {\n this._marquee.remove();\n delete this._marquee;\n delete this.chart;\n },\n _updateAxisRanges: function (start, end) {\n var lock = (this.options.lock || '').toLowerCase();\n var axisRanges = [];\n var axes = this._zoomPane.axes;\n var axis, vertical;\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n vertical = axis.options.vertical;\n if (!(lock == X && !vertical) && !(lock === Y && vertical)) {\n var range = axis.pointsRange(start, end);\n if (range) {\n axisRanges.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n this.axisRanges = axisRanges;\n },\n _selectionPosition: function (e) {\n var lock = (this.options.lock || '').toLowerCase();\n var left = math.min(e.x.startLocation, e.x.location);\n var top = math.min(e.y.startLocation, e.y.location);\n var width = math.abs(e.x.initialDelta);\n var height = math.abs(e.y.initialDelta);\n var clipBox = this._zoomPaneClipBox;\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 if (e.x.location > clipBox.x2) {\n width = clipBox.x2 - e.x.startLocation;\n }\n if (e.x.location < clipBox.x1) {\n width = e.x.startLocation - clipBox.x1;\n }\n if (e.y.location > clipBox.y2) {\n height = clipBox.y2 - e.y.startLocation;\n }\n if (e.y.location < clipBox.y1) {\n height = e.y.startLocation - clipBox.y1;\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 var MousewheelZoom = Class.extend({\n init: function (chart, options) {\n this.chart = chart;\n this.options = deepExtend({}, this.options, options);\n },\n updateRanges: function (delta) {\n var lock = (this.options.lock || '').toLowerCase();\n var axisRanges = [];\n var axes = this.chart._plotArea.axes;\n var axis, vertical;\n for (var idx = 0; idx < axes.length; idx++) {\n axis = axes[idx];\n vertical = axis.options.vertical;\n if (!(lock == X && !vertical) && !(lock === Y && vertical)) {\n var range = axis.zoomRange(-delta);\n if (range) {\n axisRanges.push({\n axis: axis,\n range: range\n });\n }\n }\n }\n this.axisRanges = axisRanges;\n return toChartAxisRanges(axisRanges);\n },\n zoom: function () {\n var axisRanges = this.axisRanges;\n if (axisRanges && axisRanges.length) {\n var plotArea = this.chart._plotArea;\n var axisRange;\n for (var idx = 0; idx < axisRanges.length; idx++) {\n axisRange = axisRanges[idx];\n plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n }\n plotArea.redraw(plotArea.panes);\n }\n },\n destroy: function () {\n delete this.chart;\n }\n });\n var SeriesAggregator = function (series, binder, defaultAggregates) {\n var sa = this, canonicalFields = binder.canonicalFields(series), valueFields = binder.valueFields(series), sourceFields = binder.sourceFields(series, canonicalFields), seriesFields = sa._seriesFields = [], defaults = defaultAggregates.query(series.type), rootAggregate = series.aggregate || defaults, i;\n sa._series = series;\n sa._binder = binder;\n for (i = 0; i < canonicalFields.length; i++) {\n var field = canonicalFields[i], fieldAggregate;\n if (typeof rootAggregate === OBJECT) {\n fieldAggregate = rootAggregate[field];\n } else if (i === 0 || inArray(field, valueFields)) {\n fieldAggregate = rootAggregate;\n } else {\n break;\n }\n if (fieldAggregate) {\n seriesFields.push({\n canonicalName: field,\n name: sourceFields[i],\n transform: isFn(fieldAggregate) ? fieldAggregate : Aggregates[fieldAggregate]\n });\n }\n }\n };\n SeriesAggregator.prototype = {\n aggregatePoints: function (srcPoints, group) {\n var sa = this, data = sa._bindPoints(srcPoints || []), series = sa._series, seriesFields = sa._seriesFields, i, field, srcValues, value, firstDataItem = data.dataItems[0], result = {};\n if (firstDataItem && !isNumber(firstDataItem) && !isArray(firstDataItem)) {\n var fn = function () {\n };\n fn.prototype = firstDataItem;\n result = new fn();\n }\n for (i = 0; i < seriesFields.length; i++) {\n field = seriesFields[i];\n srcValues = sa._bindField(data.values, field.canonicalName);\n value = field.transform(srcValues, series, data.dataItems, group);\n if (value !== null && typeof value === OBJECT && !defined(value.length) && !(value instanceof Date)) {\n result = value;\n break;\n } else {\n if (defined(value)) {\n ensureTree(field.name, result);\n kendo.setter(field.name)(result, value);\n }\n }\n }\n return result;\n },\n _bindPoints: function (points) {\n var sa = this, binder = sa._binder, series = sa._series, values = [], dataItems = [], i, pointIx;\n for (i = 0; i < points.length; i++) {\n pointIx = points[i];\n values.push(binder.bindPoint(series, pointIx));\n dataItems.push(series.data[pointIx]);\n }\n return {\n values: values,\n dataItems: dataItems\n };\n },\n _bindField: function (data, field) {\n var values = [], count = data.length, i, item, value, valueFields;\n for (i = 0; i < count; i++) {\n item = data[i];\n valueFields = item.valueFields;\n if (defined(valueFields[field])) {\n value = valueFields[field];\n } else {\n value = item.fields[field];\n }\n values.push(value);\n }\n return values;\n }\n };\n var ChartPlotArea = Class.extend({\n init: function (plotArea) {\n this._plotArea = plotArea;\n this.visual = plotArea.visual;\n this.backgroundVisual = plotArea._bgVisual;\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 series: function () {\n var chart = this._chart;\n var seriesByPane = chart._plotArea.groupSeriesByPane();\n var series = seriesByPane[this.name || 'default'];\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 return result;\n }\n });\n var ChartAxis = Class.extend({\n init: function (axis) {\n this._axis = axis;\n this.options = axis.options;\n },\n value: function (point) {\n var axis = this._axis;\n var value = axis.getCategory ? axis.getCategory(point) : axis.getValue(point);\n return value;\n },\n slot: function (from, to, limit) {\n if (!defined(limit)) {\n limit = true;\n }\n return this._axis.slot(from, to, limit);\n },\n range: function () {\n return this._axis.range();\n },\n valueRange: function () {\n return this._axis.valueRange();\n }\n });\n var ChartSeries = Class.extend({\n init: function (chart, options) {\n this._chart = chart;\n this._options = options;\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 return points;\n },\n data: function (data) {\n var series = this._seriesOptions();\n if (data) {\n var chart = this._chart;\n var plotArea = chart._plotArea;\n series.data = data;\n if (series.categoryField) {\n var axis = plotArea.seriesCategoryAxis(series);\n var options = [].concat(chart.options.categoryAxis);\n chart._bindCategoryAxisFromSeries(options[axis.axisIndex], axis.axisIndex);\n }\n chart._noTransitionsRedraw();\n this._clearFields();\n }\n return series.data;\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 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 this._chart._togglePointsHighlight(show, elements);\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._saveGroupVisibleState(seriesOptions);\n } else {\n if (inArray(seriesOptions.type, [\n PIE,\n DONUT,\n FUNNEL\n ])) {\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 chart._noTransitionsRedraw();\n this._clearFields();\n },\n _filterData: function (filter) {\n var data = this._seriesOptions().data;\n var length = data.length;\n var result = [];\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 _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 _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 _clearFields: function () {\n delete this._points;\n delete this._series;\n }\n });\n function intersection(a1, a2, b1, b2) {\n var result, ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y), ua;\n if (u_b !== 0) {\n ua = ua_t / u_b;\n result = new Point2D(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y));\n }\n return result;\n }\n function applySeriesDefaults(options, themeOptions) {\n var series = options.series, i, seriesLength = series.length, seriesType, seriesDefaults = options.seriesDefaults, commonDefaults = deepExtend({}, options.seriesDefaults), themeSeriesDefaults = themeOptions ? deepExtend({}, themeOptions.seriesDefaults) : {}, commonThemeDefaults = deepExtend({}, themeSeriesDefaults);\n cleanupNestedSeriesDefaults(commonDefaults);\n cleanupNestedSeriesDefaults(commonThemeDefaults);\n for (i = 0; i < seriesLength; i++) {\n seriesType = series[i].type || options.seriesDefaults.type;\n var baseOptions = deepExtend({ data: [] }, commonThemeDefaults, themeSeriesDefaults[seriesType], { tooltip: options.tooltip }, commonDefaults, seriesDefaults[seriesType]);\n series[i]._defaults = baseOptions;\n series[i] = deepExtend({}, baseOptions, series[i]);\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 function applySeriesColors(options) {\n var series = options.series, colors = options.seriesColors || [], i, currentSeries, seriesColor, defaults;\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n seriesColor = colors[i % colors.length];\n currentSeries.color = currentSeries.color || seriesColor;\n defaults = currentSeries._defaults;\n if (defaults) {\n defaults.color = defaults.color || seriesColor;\n }\n }\n }\n function resolveAxisAliases(options) {\n var alias;\n each([\n CATEGORY,\n VALUE,\n X,\n Y\n ], function () {\n alias = this + 'Axes';\n if (options[alias]) {\n options[this + 'Axis'] = options[alias];\n delete options[alias];\n }\n });\n }\n function applyAxisDefaults(options, themeOptions) {\n var themeAxisDefaults = (themeOptions || {}).axisDefaults || {};\n each([\n CATEGORY,\n VALUE,\n X,\n Y\n ], function () {\n var axisName = this + 'Axis', axes = [].concat(options[axisName]), axisDefaults = options.axisDefaults || {};\n axes = $.map(axes, function (axisOptions) {\n var axisColor = (axisOptions || {}).color;\n var result = deepExtend({}, themeAxisDefaults, themeAxisDefaults[axisName], axisDefaults, axisDefaults[axisName], {\n line: { color: axisColor },\n labels: { color: axisColor },\n title: { color: axisColor }\n }, axisOptions);\n delete result[axisName];\n return result;\n });\n options[axisName] = axes.length > 1 ? axes : axes[0];\n });\n }\n function categoriesCount(series) {\n var seriesCount = series.length, categories = 0, i;\n for (i = 0; i < seriesCount; i++) {\n categories = math.max(categories, series[i].data.length);\n }\n return categories;\n }\n function sqr(value) {\n return value * value;\n }\n extend($.easing, {\n easeOutElastic: function (n, d, first, diff) {\n var s = 1.70158, p = 0, a = diff;\n if (n === 0) {\n return first;\n }\n if (n === 1) {\n return first + diff;\n }\n if (!p) {\n p = 0.5;\n }\n if (a < math.abs(diff)) {\n a = diff;\n s = p / 4;\n } else {\n s = p / (2 * math.PI) * math.asin(diff / a);\n }\n return a * math.pow(2, -10 * n) * math.sin((n * 1 - s) * (1.1 * math.PI) / p) + diff + first;\n }\n });\n function getField(field, row) {\n if (row === null) {\n return row;\n }\n var get = getter(field, true);\n return get(row);\n }\n function getDateField(field, row) {\n if (row === null) {\n return row;\n }\n var key = '_date_' + field, value = row[key];\n if (!value) {\n value = toDate(getter(field, true)(row));\n row[key] = value;\n }\n return value;\n }\n function toDate(value) {\n var result, i;\n if (value instanceof Date) {\n result = value;\n } else if (typeof value === STRING) {\n result = kendo.parseDate(value) || new Date(value);\n } else if (value) {\n if (isArray(value)) {\n result = [];\n for (i = 0; i < value.length; i++) {\n result.push(toDate(value[i]));\n }\n } else {\n result = new Date(value);\n }\n }\n return result;\n }\n function toTime(value) {\n if (isArray(value)) {\n return map(value, toTime);\n } else if (value) {\n return toDate(value).getTime();\n }\n }\n function addDuration(date, value, unit, weekStartDay) {\n var result = date, hours;\n if (date) {\n date = toDate(date);\n hours = date.getHours();\n if (unit === YEARS) {\n result = new Date(date.getFullYear() + value, 0, 1);\n kendo.date.adjustDST(result, 0);\n } else if (unit === MONTHS) {\n result = new Date(date.getFullYear(), date.getMonth() + value, 1);\n kendo.date.adjustDST(result, hours);\n } else if (unit === WEEKS) {\n result = addDuration(startOfWeek(date, weekStartDay), value * 7, DAYS);\n kendo.date.adjustDST(result, hours);\n } else if (unit === DAYS) {\n result = new Date(date.getFullYear(), date.getMonth(), date.getDate() + value);\n kendo.date.adjustDST(result, hours);\n } else if (unit === HOURS) {\n date = new Date(date);\n date.setUTCMinutes(0, 0, 0);\n result = addTicks(date, value * TIME_PER_HOUR);\n } else if (unit === MINUTES) {\n result = addTicks(date, value * TIME_PER_MINUTE);\n if (result.getSeconds() > 0) {\n result.setSeconds(0);\n }\n } else if (unit === SECONDS) {\n result = addTicks(date, value * TIME_PER_SECOND);\n } else if (unit === MILLISECONDS) {\n result = addTicks(date, value);\n }\n if (unit !== MILLISECONDS && result.getMilliseconds() > 0) {\n result.setMilliseconds(0);\n }\n }\n return result;\n }\n function startOfWeek(date, weekStartDay) {\n var day = date.getDay(), daysToSubtract = 0;\n if (!isNaN(day)) {\n weekStartDay = weekStartDay || 0;\n while (day !== weekStartDay) {\n if (day === 0) {\n day = 6;\n } else {\n day--;\n }\n daysToSubtract++;\n }\n }\n return addTicks(date, -daysToSubtract * TIME_PER_DAY);\n }\n function floorDate(date, unit, weekStartDay) {\n date = toDate(date);\n return addDuration(date, 0, unit, weekStartDay);\n }\n function ceilDate(date, unit, weekStartDay) {\n date = toDate(date);\n if (date && floorDate(date, unit, weekStartDay).getTime() === date.getTime()) {\n return date;\n }\n return addDuration(date, 1, unit, weekStartDay);\n }\n function dateDiff(a, b) {\n return a.getTime() - b;\n }\n function absoluteDateDiff(a, b) {\n var diff = a.getTime() - b, offsetDiff = a.getTimezoneOffset() - b.getTimezoneOffset();\n return diff - offsetDiff * TIME_PER_MINUTE;\n }\n function addTicks(date, ticks) {\n return new Date(date.getTime() + ticks);\n }\n function duration(a, b, unit) {\n var diff;\n if (unit === YEARS) {\n diff = b.getFullYear() - a.getFullYear();\n } else if (unit === MONTHS) {\n diff = duration(a, b, YEARS) * 12 + b.getMonth() - a.getMonth();\n } else if (unit === DAYS) {\n diff = math.floor(dateDiff(b, a) / TIME_PER_DAY);\n } else {\n diff = math.floor(dateDiff(b, a) / TIME_PER_UNIT[unit]);\n }\n return diff;\n }\n function dateIndex(value, start, baseUnit, baseUnitStep) {\n var index;\n var date = toDate(value);\n var startDate = toDate(start);\n if (baseUnit == MONTHS) {\n index = date.getMonth() - startDate.getMonth() + (date.getFullYear() - startDate.getFullYear()) * 12 + timeIndex(date, new Date(date.getFullYear(), date.getMonth()), DAYS) / new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n } else if (baseUnit == YEARS) {\n index = date.getFullYear() - startDate.getFullYear() + dateIndex(date, new Date(date.getFullYear(), 0), MONTHS, 1) / 12;\n } else if (baseUnit == DAYS || baseUnit == WEEKS) {\n index = timeIndex(date, startDate, baseUnit);\n } else {\n index = dateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n }\n return index / baseUnitStep;\n }\n function timeIndex(date, start, baseUnit) {\n return absoluteDateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n }\n function singleItemOrArray(array) {\n return array.length === 1 ? array[0] : array;\n }\n function axisGroupBox(axes) {\n var length = axes.length, box, i, axisBox;\n if (length > 0) {\n for (i = 0; i < length; i++) {\n axisBox = axes[i].contentBox();\n if (!box) {\n box = axisBox.clone();\n } else {\n box.wrap(axisBox);\n }\n }\n }\n return box || Box2D();\n }\n function equalsIgnoreCase(a, b) {\n if (a && b) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n }\n function dateEquals(a, b) {\n if (a && b) {\n return toTime(a) === toTime(b);\n }\n return a === b;\n }\n function appendIfNotNull(array, element) {\n if (element !== null) {\n array.push(element);\n }\n }\n function lteDateIndex(date, sortedDates) {\n var low = 0, high = sortedDates.length - 1, i, currentDate;\n while (low <= high) {\n i = math.floor((low + high) / 2);\n currentDate = sortedDates[i];\n if (currentDate < date) {\n low = i + 1;\n continue;\n }\n if (currentDate > date) {\n high = i - 1;\n continue;\n }\n while (dateEquals(sortedDates[i - 1], date)) {\n i--;\n }\n return i;\n }\n if (sortedDates[i] <= date) {\n return i;\n } else {\n return i - 1;\n }\n }\n function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function countNumbers(values) {\n var length = values.length, count = 0, i, num;\n for (i = 0; i < length; i++) {\n num = values[i];\n if (isNumber(num)) {\n count++;\n }\n }\n return count;\n }\n function areNumbers(values) {\n return countNumbers(values) === values.length;\n }\n function axisRanges(axes) {\n var i, axis, axisName, ranges = {};\n for (i = 0; i < axes.length; i++) {\n axis = axes[i];\n axisName = axis.options.name;\n if (axisName) {\n ranges[axisName] = axis.range();\n }\n }\n return ranges;\n }\n function evalOptions(options, context, state, dryRun) {\n var property, propValue, excluded, defaults, depth, needsEval = false;\n state = state || {};\n excluded = state.excluded = state.excluded || [];\n defaults = state.defaults = state.defaults || {};\n depth = state.depth = state.depth || 0;\n if (depth > MAX_EXPAND_DEPTH) {\n return;\n }\n for (property in options) {\n if (!inArray(property, state.excluded) && options.hasOwnProperty(property)) {\n propValue = options[property];\n if (isFn(propValue)) {\n needsEval = true;\n if (!dryRun) {\n options[property] = valueOrDefault(propValue(context), defaults[property]);\n }\n } else if (typeof propValue === OBJECT) {\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 return needsEval;\n }\n function groupSeries(series, data) {\n var result = [], nameTemplate, legacyTemplate = series.groupNameTemplate, groupIx, dataLength = data.length, seriesClone;\n if (dataLength === 0) {\n seriesClone = deepExtend({}, series);\n seriesClone.visibleInLegend = false;\n return [seriesClone];\n }\n if (defined(legacyTemplate)) {\n kendo.logToConsole('\\'groupNameTemplate\\' is obsolete and will be removed in future versions. ' + 'Specify the group name template as \\'series.name\\'');\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) ? '#= group.value #: #= series.name #' : '#= group.value #');\n }\n }\n for (groupIx = 0; groupIx < dataLength; groupIx++) {\n seriesClone = deepExtend({}, series);\n if (!isFn(seriesClone.color)) {\n seriesClone.color = undefined;\n }\n seriesClone._groupIx = groupIx;\n seriesClone._groupValue = data[groupIx].value;\n result.push(seriesClone);\n if (nameTemplate) {\n seriesClone.name = nameTemplate({\n series: seriesClone,\n group: data[groupIx]\n });\n }\n }\n return result;\n }\n function filterSeriesByType(series, types) {\n var i, currentSeries, result = [];\n types = [].concat(types);\n for (i = 0; i < series.length; i++) {\n currentSeries = series[i];\n if (inArray(currentSeries.type, types)) {\n result.push(currentSeries);\n }\n }\n return result;\n }\n function indexOf(item, arr) {\n if (item instanceof Date) {\n for (var i = 0, length = arr.length; i < length; i++) {\n if (dateEquals(arr[i], item)) {\n return i;\n }\n }\n return -1;\n } else {\n return $.inArray(item, arr);\n }\n }\n function sortDates(dates, comparer) {\n comparer = comparer || dateComparer;\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 return dates;\n }\n function uniqueDates(srcDates, comparer) {\n var i, dates = sortDates(srcDates, comparer), length = dates.length, result = length > 0 ? [dates[0]] : [];\n comparer = comparer || dateComparer;\n for (i = 1; i < length; i++) {\n if (comparer(dates[i], last(result)) !== 0) {\n result.push(dates[i]);\n }\n }\n return result;\n }\n function isDateAxis(axisOptions, sampleCategory) {\n var type = axisOptions.type, dateCategory = sampleCategory instanceof Date;\n return !type && dateCategory || equalsIgnoreCase(type, DATE);\n }\n function transpose(rows) {\n var result = [], rowCount = rows.length, rowIx, row, colIx, colCount;\n for (rowIx = 0; rowIx < rowCount; rowIx++) {\n row = rows[rowIx];\n colCount = row.length;\n for (colIx = 0; colIx < colCount; colIx++) {\n result[colIx] = result[colIx] || [];\n result[colIx].push(row[colIx]);\n }\n }\n return result;\n }\n function ensureTree(fieldName, target) {\n if (fieldName.indexOf('.') > -1) {\n var parts = fieldName.split('.'), path = '', val;\n while (parts.length > 1) {\n path += parts.shift();\n val = kendo.getter(path)(target) || {};\n kendo.setter(path)(target, val);\n path += '.';\n }\n }\n }\n function seriesTotal(series) {\n var data = series.data;\n var sum = 0;\n for (var i = 0; i < data.length; i++) {\n var pointData = SeriesBinder.current.bindPoint(series, i);\n var value = pointData.valueFields.value;\n if (typeof value === STRING) {\n value = parseFloat(value);\n }\n if (isNumber(value) && pointData.fields.visible !== false) {\n sum += math.abs(value);\n }\n }\n return sum;\n }\n function hasGradientOverlay(options) {\n var overlay = options.overlay;\n return overlay && overlay.gradient && overlay.gradient != 'none';\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 function preventDefault() {\n this._defaultPrevented = true;\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 function hasValue(value) {\n return defined(value) && value !== null;\n }\n function toChartAxisRanges(axisRanges) {\n var ranges = {};\n var axisRange;\n for (var idx = 0; idx < axisRanges.length; idx++) {\n 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 function acceptKey(e, mouseKey) {\n var key = (mouseKey || '').toLowerCase();\n var accept = key == 'none' && !(e.ctrlKey || e.shiftKey || e.altKey) || e[key + 'Key'];\n return accept;\n }\n function preloadFonts(options, callback) {\n var fonts = [];\n fetchFonts(options, fonts);\n kendo.util.loadFonts(fonts, callback);\n }\n function fetchFonts(options, fonts, state) {\n var MAX_DEPTH = 5;\n state = state || { depth: 0 };\n if (!options || state.depth > MAX_DEPTH || !document.fonts) {\n return;\n }\n Object.keys(options).forEach(function (key) {\n var value = options[key];\n if (key === 'dataSource' || key[0] === '$' || !value) {\n return;\n }\n if (key === 'font') {\n fonts.push(value);\n } else if (typeof value === 'object') {\n state.depth++;\n fetchFonts(value, fonts, state);\n state.depth--;\n }\n });\n }\n function clearMissingValues(originalOptions, options) {\n var fieldValue, originalValue, field, nullValue;\n for (field in options) {\n fieldValue = options[field];\n originalValue = originalOptions[field];\n if (defined(originalValue)) {\n nullValue = fieldValue === null;\n if (nullValue || !defined(fieldValue)) {\n delete originalOptions[field];\n if (nullValue) {\n delete options[field];\n }\n } else if (originalValue && isPlainObject(fieldValue)) {\n if (isPlainObject(fieldValue)) {\n clearMissingValues(originalValue, fieldValue);\n }\n }\n }\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 dataviz.ui.plugin(Chart);\n PlotAreaFactory.current.register(CategoricalPlotArea, [\n BAR,\n COLUMN,\n LINE,\n VERTICAL_LINE,\n AREA,\n VERTICAL_AREA,\n CANDLESTICK,\n OHLC,\n BULLET,\n VERTICAL_BULLET,\n BOX_PLOT,\n VERTICAL_BOX_PLOT,\n RANGE_COLUMN,\n RANGE_BAR,\n WATERFALL,\n HORIZONTAL_WATERFALL\n ]);\n PlotAreaFactory.current.register(XYPlotArea, [\n SCATTER,\n SCATTER_LINE,\n BUBBLE\n ]);\n PlotAreaFactory.current.register(PiePlotArea, [PIE]);\n PlotAreaFactory.current.register(DonutPlotArea, [DONUT]);\n SeriesBinder.current.register([\n BAR,\n COLUMN,\n LINE,\n VERTICAL_LINE,\n AREA,\n VERTICAL_AREA\n ], [VALUE], [\n CATEGORY,\n COLOR,\n NOTE_TEXT,\n ERROR_LOW_FIELD,\n ERROR_HIGH_FIELD\n ]);\n SeriesBinder.current.register([\n RANGE_COLUMN,\n RANGE_BAR\n ], [\n FROM,\n TO\n ], [\n CATEGORY,\n COLOR,\n NOTE_TEXT\n ]);\n SeriesBinder.current.register([\n WATERFALL,\n HORIZONTAL_WATERFALL\n ], [VALUE], [\n CATEGORY,\n COLOR,\n NOTE_TEXT,\n SUMMARY_FIELD\n ]);\n DefaultAggregates.current.register([\n BAR,\n COLUMN,\n LINE,\n VERTICAL_LINE,\n AREA,\n VERTICAL_AREA,\n WATERFALL,\n HORIZONTAL_WATERFALL\n ], {\n value: MAX,\n color: FIRST,\n noteText: FIRST,\n errorLow: MIN,\n errorHigh: MAX\n });\n DefaultAggregates.current.register([\n RANGE_COLUMN,\n RANGE_BAR\n ], {\n from: MIN,\n to: MAX,\n color: FIRST,\n noteText: FIRST\n });\n SeriesBinder.current.register([\n SCATTER,\n SCATTER_LINE,\n BUBBLE\n ], [\n X,\n Y\n ], [\n COLOR,\n NOTE_TEXT,\n X_ERROR_LOW_FIELD,\n X_ERROR_HIGH_FIELD,\n Y_ERROR_LOW_FIELD,\n Y_ERROR_HIGH_FIELD\n ]);\n SeriesBinder.current.register([BUBBLE], [\n X,\n Y,\n 'size'\n ], [\n COLOR,\n CATEGORY,\n NOTE_TEXT\n ]);\n SeriesBinder.current.register([\n CANDLESTICK,\n OHLC\n ], [\n 'open',\n 'high',\n 'low',\n 'close'\n ], [\n CATEGORY,\n COLOR,\n 'downColor',\n NOTE_TEXT\n ]);\n DefaultAggregates.current.register([\n CANDLESTICK,\n OHLC\n ], {\n open: MAX,\n high: MAX,\n low: MIN,\n close: MAX,\n color: FIRST,\n downColor: FIRST,\n noteText: FIRST\n });\n SeriesBinder.current.register([\n BOX_PLOT,\n VERTICAL_BOX_PLOT\n ], [\n 'lower',\n 'q1',\n 'median',\n 'q3',\n 'upper',\n 'mean',\n 'outliers'\n ], [\n CATEGORY,\n COLOR,\n NOTE_TEXT\n ]);\n DefaultAggregates.current.register([\n BOX_PLOT,\n VERTICAL_BOX_PLOT\n ], {\n lower: MAX,\n q1: MAX,\n median: MAX,\n q3: MAX,\n upper: MAX,\n mean: MAX,\n outliers: FIRST,\n color: FIRST,\n noteText: FIRST\n });\n SeriesBinder.current.register([\n BULLET,\n VERTICAL_BULLET\n ], [\n 'current',\n 'target'\n ], [\n CATEGORY,\n COLOR,\n 'visibleInLegend',\n NOTE_TEXT\n ]);\n DefaultAggregates.current.register([\n BULLET,\n VERTICAL_BULLET\n ], {\n current: MAX,\n target: MAX,\n color: FIRST,\n noteText: FIRST\n });\n SeriesBinder.current.register([\n PIE,\n DONUT\n ], [VALUE], [\n CATEGORY,\n COLOR,\n 'explode',\n 'visibleInLegend',\n 'visible'\n ]);\n deepExtend(dataviz, {\n EQUALLY_SPACED_SERIES: EQUALLY_SPACED_SERIES,\n Aggregates: Aggregates,\n AreaChart: AreaChart,\n AreaSegment: AreaSegment,\n AxisGroupRangeTracker: AxisGroupRangeTracker,\n Bar: Bar,\n BarChart: BarChart,\n BarLabel: BarLabel,\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 CategoryAxis: CategoryAxis,\n ChartAxis: ChartAxis,\n ChartContainer: ChartContainer,\n ChartPane: ChartPane,\n ChartPlotArea: ChartPlotArea,\n ChartSeries: ChartSeries,\n ClipAnimation: ClipAnimation,\n ClusterLayout: ClusterLayout,\n Crosshair: Crosshair,\n CrosshairTooltip: CrosshairTooltip,\n DateCategoryAxis: DateCategoryAxis,\n DateValueAxis: DateValueAxis,\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 ScatterChart: ScatterChart,\n ScatterErrorBar: ScatterErrorBar,\n ScatterLineChart: ScatterLineChart,\n Selection: Selection,\n SeriesAggregator: SeriesAggregator,\n SeriesBinder: SeriesBinder,\n ShapeElement: ShapeElement,\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 addDuration: addDuration,\n areNumbers: areNumbers,\n axisGroupBox: axisGroupBox,\n categoriesCount: categoriesCount,\n ceilDate: ceilDate,\n countNumbers: countNumbers,\n duration: duration,\n ensureTree: ensureTree,\n indexOf: indexOf,\n isNumber: isNumber,\n floorDate: floorDate,\n filterSeriesByType: filterSeriesByType,\n hasValue: hasValue,\n lteDateIndex: lteDateIndex,\n evalOptions: evalOptions,\n seriesTotal: seriesTotal,\n singleItemOrArray: singleItemOrArray,\n sortDates: sortDates,\n startOfWeek: startOfWeek,\n transpose: transpose,\n toDate: toDate,\n toTime: toTime,\n uniqueDates: uniqueDates\n });\n }(window.kendo.jQuery));\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"],"sourceRoot":"/source/"}