{"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","Math","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","addTicks","TIME_PER_HOUR","MINUTES","TIME_PER_MINUTE","getSeconds","setSeconds","SECONDS","TIME_PER_SECOND","getMilliseconds","setMilliseconds","day","getDay","daysToSubtract","TIME_PER_DAY","floorDate","ceilDate","dateDiff","a","b","diff","offsetDiff","getTimezoneOffset","absoluteDateDiff","ticks","tzOffsetBefore","tzOffsetDiff","duration","floor","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","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","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","CategoricalPlotArea","AxisGroupRangeTracker","XYPlotArea","PiePlotArea","DonutPlotArea","PieAnimation","BubbleAnimation","Highlight","BaseTooltip","Tooltip","SharedTooltip","Crosshair","CrosshairTooltip","Aggregates","Selection","Pannable","ZoomSelection","MousewheelZoom","SeriesAggregator","ChartAxis","isPlainObject","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_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","STEP","SMOOTH","STD_ERR","STD_DEV","SUMMARY_FIELD","TIME_PER_WEEK","TIME_PER_MONTH","TIME_PER_YEAR","years","months","weeks","days","minutes","seconds","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","pane","_model","_plotArea","findPane","getAxis","toggleHighlight","show","filter","seriesName","categoryName","_highlight","firstSeries","srcSeries","filterPoints","pointsBySeriesName","charts","togglePointHighlight","surface","_surfaceWrap","clear","resize","Surface","view","model","_getModel","_destroyView","renderVisual","traverse","animation","setup","visual","play","_tooltip","_createTooltip","_setupSelection","_createPannable","_createZoomSelection","_createMousewheelZoom","exportVisual","originalChartArea","_sharedTooltip","shared","_pannable","selection","_zoomSelection","mousewheel","_mousewheelZoom","_tooltipleave","hideCrosshairs","hide","_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","_startNavigation","currentAxis","_navState","pan","startLocation","location","translateRange","_endNavigation","prevented","totalDelta","origEvent","_mwTimeout","clearTimeout","setTimeout","scaleRange","chartEvent","coords","_eventCoordinates","findPointPane","slice","inAxis","containsPoint","backgroundBox","cancel","_suppressHover","_getChartElement","match","eventTarget","chartElement","parent","aliasFor","closest","isTouch","client","clientX","clientY","_toModelCoordinates","offset","paddingLeft","parseInt","paddingTop","win","left","scrollLeft","top","scrollTop","drawingElement","_activePoint","_propagateClick","_startHover","click","point","tooltipOptions","isHighlighted","hover","tooltipTracking","_mouseMoveTracking","seriesPoint","getNearestPoint","seriesIx","off","_trackCrosshairs","_trackSharedTooltip","crosshairs","showAt","pointArgs","hoverArgs","pointCategoryIndex","_tooltipCategoryIx","pointsByCategoryIndex","eventArgs","categoryPoints","relatedTarget","_sourceSeries","grouped","processedSeries","_isBindable","_deferRedraw","support","vml","_clearRedrawTimeout","_redrawTimeout","clearInterval","seriesData","axisIx","categoriesData","definitions","_bindCategoryAxis","categoryIx","dataItems","_bindCategoryAxisFromSeries","s","onAxis","dataIx","dataRow","getFn","dateAxis","uniqueCategories","categoryField","_legendItemClick","seriesIndex","pointIndex","transitionsState","originalSeries","_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","right","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","startValue","lineEnd","getCategory","categoryIndex","zoomRange","rate","totalMax","totalMin","labelsCount","labelsRange","skip","step","createAxisLabel","dataItem","axisLabelText","shouldRenderNote","limitRange","pointsRange","diffStart","diffEnd","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","rangeMax","rangeMin","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","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","seriesOptions","_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","anchor","alignTo","defaultColor","shadow","getElement","halfSize","Rect","showTooltip","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","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","shouldClip","_clipBox","axisValueField","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","slot","slotEdge","targetEdge","alignAxes","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","axisA","axisB","axesCount","bgBox","bg","_bgVisual","paneByPoint","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","_dispatchEvent","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","hCenter","categoryText","stickyMode","moveLine","getBox","dim","axisLineBox","getAnchor","halfWidth","halfHeight","bottomLeft","topLeft","sumOrNull","avg","aggregates","getValueAxis","selectorPrefix","_dateAxis","find","leftMask","rightMask","leftHandle","rightHandle","_index","cssText","userEvents","stopPropagation","add","removeClass","_state","_rangeEventArgs","_value","moveTarget","parents","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","_axis","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 if (id in cache) {\n return cache[id];\n }\n return 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 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 }\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_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', SELECT_START = 'selectStart', SELECT = 'select', SELECT_END = 'selectEnd', SERIES_CLICK = 'seriesClick', SERIES_HOVER = 'seriesHover', START_SCALE = 0.001, STEP = 'step', SMOOTH = 'smooth', STD_ERR = 'stderr', STD_DEV = 'stddev', STRING = 'string', SUMMARY_FIELD = 'summary', TIME_PER_SECOND = 1000, 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 }, 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 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 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 toggleHighlight: function (show, filter) {\n var plotArea = this._plotArea;\n var highlight = this._highlight;\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 for (var idx = 0; idx < points.length; idx++) {\n highlight.togglePointHighlight(points[idx], show);\n }\n }\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;\n if (defined(events[DRAG_START] || events[DRAG] || events[DRAG_END])) {\n chart._startNavigation(e, 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 this._endNavigation(e, DRAG_END);\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 if (this._pannable && this._pannable.end(e)) {\n this.surface.resumeTracking();\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;\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, 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, chartEvent) {\n var chart = this, coords = chart._eventCoordinates(e), plotArea = chart._model._plotArea, pane = plotArea.findPointPane(coords), axes = plotArea.axes.slice(0), i, currentAxis, inAxis = false, prevented;\n if (!pane) {\n return;\n }\n for (i = 0; i < axes.length; i++) {\n currentAxis = axes[i];\n if (currentAxis.box.containsPoint(coords)) {\n inAxis = true;\n break;\n }\n }\n if (!inAxis && plotArea.backgroundBox().containsPoint(coords)) {\n prevented = chart.trigger(chartEvent, {\n axisRanges: axisRanges(axes),\n originalEvent: e\n });\n if (prevented) {\n chart._userEvents.cancel();\n } else {\n chart._suppressHover = true;\n chart._unsetActivePoint();\n chart._navState = {\n pane: pane,\n axes: axes\n };\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;\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 this._plotArea.hover(this, e);\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 () {\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 } 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 _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], originalSeries = (chart._sourceSeries || [])[seriesIndex] || currentSeries, transitionsState, visible, point;\n if (inArray(currentSeries.type, [\n PIE,\n DONUT,\n FUNNEL\n ])) {\n point = originalSeries.data[pointIndex];\n if (!defined(point.visible)) {\n visible = false;\n } else {\n visible = !point.visible;\n }\n point.visible = visible;\n } else {\n visible = !originalSeries.visible;\n originalSeries.visible = visible;\n currentSeries.visible = visible;\n }\n if (chart.options.transitions) {\n chart.options.transitions = false;\n transitionsState = true;\n }\n chart.redraw();\n if (transitionsState) {\n chart.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], index, items;\n if (inArray(currentSeries.type, [\n PIE,\n DONUT,\n FUNNEL\n ])) {\n index = pointIndex;\n } else {\n index = seriesIndex;\n }\n items = plotArea.pointsBySeriesIndex(index);\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 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 }\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 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 return {\n min: math.min(min, max),\n max: math.max(min, max)\n };\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 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 !== SECONDS) {\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 (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 });\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 options = axis.applyDefaults(toDate(seriesMin), toDate(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 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 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 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 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 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 }\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, 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 if (label) {\n connectorLine = new draw.Path({\n stroke: {\n color: connectors.color,\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 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 var container = this, pane = container.pane, axes = pane.axes, length = axes.length, clipBox = pane.box.clone(), axisValueField, idx, lineBox, axis;\n for (idx = 0; idx < length; idx++) {\n axis = axes[idx];\n axisValueField = axis.options.vertical ? Y : X;\n lineBox = axis.lineBox();\n clipBox[axisValueField + 1] = lineBox[axisValueField + 1];\n clipBox[axisValueField + 2] = lineBox[axisValueField + 2];\n }\n return clipBox;\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;\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.label && point.label.options.visible) {\n if (point.overlapsBox(clipBox)) {\n if (point.label.alignToClipBox) {\n point.label.alignToClipBox(clipBox);\n }\n point.label.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), 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 plotArea.alignAxisTo(axis, xAnchor, yAnchorCrossings[i], xAnchorCrossings[i]);\n if (axis.options._overlap) {\n continue;\n }\n if (round(axis.lineBox().x1) === round(xAnchor.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(xAnchor.lineBox().x2)) {\n if (!axis._mirrored) {\n axis.options.labels.mirror = !axis.options.labels.mirror;\n axis._mirrored = true;\n }\n plotArea.alignAxisTo(axis, xAnchor, yAnchorCrossings[i], xAnchorCrossings[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 plotArea.alignAxisTo(axis, yAnchor, xAnchorCrossings[i], yAnchorCrossings[i]);\n if (axis.options._overlap) {\n continue;\n }\n if (round(axis.lineBox().y1) === round(yAnchor.lineBox().y1)) {\n if (!axis._mirrored) {\n axis.options.labels.mirror = !axis.options.labels.mirror;\n axis._mirrored = true;\n }\n plotArea.alignAxisTo(axis, yAnchor, xAnchorCrossings[i], yAnchorCrossings[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(yAnchor.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 createVisual: function () {\n ChartElement.fn.createVisual.call(this);\n var bgBox = this.backgroundBox();\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 = draw.Path.fromRect(bgBox.toRect(), {\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.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 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 && point.options.index === seriesIndex) {\n result.push(point);\n }\n }\n }\n return result;\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 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 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, isStacked100 = stack && stack.type === '100%', clip;\n if (defined(pane.options.clip)) {\n clip = pane.options.clip;\n } else if (isStacked100) {\n clip = false;\n }\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 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 _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 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 click: function (chart, e) {\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(PLOT_AREA_CLICK, {\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 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 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 var tooltip = this, options = tooltip.options, plotArea = tooltip.plotArea, axis = plotArea.categoryAxis, index = axis.pointCategoryIndex(coords), category = axis.getCategory(coords), slot = axis.getSlot(index), content;\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 content = tooltip._content(points, category);\n tooltip.element.html(content);\n tooltip.anchor = tooltip._slotAnchor(coords, slot);\n tooltip.setStyle(options, points[0]);\n BaseTooltip.fn.show.call(tooltip);\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 _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 that.wrapper.on(MOUSEWHEEL_NS, proxy(that._mousewheel, that));\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 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 that.wrapper.remove();\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 _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 that = this, range = that._state.range;\n delete that._state;\n that.set(range.from, range.to);\n that.trigger(SELECT_END, that._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 that = this, categoryAxis = that.categoryAxis, categories = categoryAxis.options.categories, index = value;\n if (value instanceof Date) {\n index = lteDateIndex(value, categories);\n if (!categoryAxis.options.justified && value > last(categories)) {\n index += 1;\n }\n }\n return index;\n },\n _value: function (index) {\n var that = this, categoryAxis = this.categoryAxis, categories = categoryAxis.options.categories, value = index;\n if (that._dateAxis) {\n if (index > categories.length - 1) {\n value = that.options.max;\n } else {\n value = categories[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 _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 },\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 axisRanges.push({\n axis: axis,\n range: range\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 });\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 ChartAxis = Class.extend({\n init: function (axis) {\n this._axis = axis;\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 });\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 result = addTicks(new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours()), 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 }\n if (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 var diff = a.getTime() - b, offsetDiff = a.getTimezoneOffset() - b.getTimezoneOffset();\n return diff - (offsetDiff * diff > 0 ? offsetDiff * TIME_PER_MINUTE : 0);\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 var tzOffsetBefore = date.getTimezoneOffset(), result = new Date(date.getTime() + ticks), tzOffsetDiff = result.getTimezoneOffset() - tzOffsetBefore;\n return new Date(result.getTime() + (ticks * tzOffsetDiff > 0 ? tzOffsetDiff * TIME_PER_MINUTE : 0));\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 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 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 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 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/"}