{"version":3,"sources":["webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/chart.js/Chart.js","webpack:///(webpack)/buildin/amd-options.js"],"names":["__WEBPACK_AMD_DEFINE_RESULT__","root","this","previous","Chart","context","canvas","ctx","computeDimension","element","dimension","document","defaultView","getComputedStyle","getPropertyValue","width","height","aspectRatio","helpers","retinaScale","defaults","global","animation","animationSteps","animationEasing","showScale","scaleOverride","scaleSteps","scaleStepWidth","scaleStartValue","scaleLineColor","scaleLineWidth","scaleShowLabels","scaleLabel","scaleIntegersOnly","scaleBeginAtZero","scaleFontFamily","scaleFontSize","scaleFontStyle","scaleFontColor","responsive","maintainAspectRatio","showTooltips","customTooltips","tooltipEvents","tooltipFillColor","tooltipFontFamily","tooltipFontSize","tooltipFontStyle","tooltipFontColor","tooltipTitleFontFamily","tooltipTitleFontSize","tooltipTitleFontStyle","tooltipTitleFontColor","tooltipYPadding","tooltipXPadding","tooltipCaretSize","tooltipCornerRadius","tooltipXOffset","tooltipTemplate","multiTooltipTemplate","multiTooltipKeyBackground","onAnimationProgress","onAnimationComplete","types","id","timeout","each","loopable","callback","self","i","additionalArgs","Array","prototype","slice","call","arguments","length","apply","concat","item","clone","obj","objClone","value","key","hasOwnProperty","extend","base","extensionObject","merge","master","args","unshift","indexOf","arrayToSearch","inherits","where","collection","filterCallback","filtered","push","findNextWhere","startIndex","currentItem","findPreviousWhere","extensions","parent","ChartElement","constructor","Surrogate","__super__","noop","uid","warn","str","window","console","amd","__webpack_require__","isNumber","n","isNaN","parseFloat","isFinite","max","array","Math","min","getDecimalPlaces","cap","valueToCap","maxValue","minValue","num","toString","split","toRadians","radians","degrees","PI","aliasPixel","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","x","distanceFromYCenter","y","radialDistanceFromCenter","sqrt","angle","atan2","distance","pixelWidth","calculateOrderOfMagnitude","splineCurve","FirstPoint","MiddlePoint","AfterPoint","t","d01","pow","d12","fa","fb","inner","outer","val","floor","log","LN10","template","calculateScaleRange","valuesArray","drawingSize","textSize","startFromZero","integersOnly","maxSteps","skipFitting","valueRange","abs","rangeOrderOfMagnitude","graphMax","ceil","graphMin","graphRange","stepValue","numberOfSteps","round","steps","templateString","valuesObject","Function","data","fn","cache","test","replace","join","easingEffects","generateLabels","labelsArray","labelTemplateString","index","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","sin","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","s","p","a","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","cancelAnimFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","oCancelAnimationFrame","msCancelAnimationFrame","clearTimeout","addEvent","animationLoop","totalSteps","easingString","onProgress","onComplete","chartInstance","currentStep","easingFunction","animationFrame","stepDecimal","easeDecimal","getRelativePosition","evt","mouseX","mouseY","e","originalEvent","boundingRect","currentTarget","srcElement","getBoundingClientRect","touches","clientX","left","clientY","top","node","eventType","method","addEventListener","attachEvent","removeEvent","handler","removeEventListener","detachEvent","unbindEvents","bindEvents","arrayOfEvents","events","eventName","chart","getMaximumWidth","domNode","parentNode","clientWidth","getMaximumHeight","clientHeight","getMaximumSize","devicePixelRatio","style","scale","clear","clearRect","fontString","pixelSize","fontStyle","fontFamily","longestText","font","arrayOfStrings","longest","string","textWidth","measureText","drawRoundedRectangle","radius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","instances","Type","options","resize","initialize","stop","newWidth","newHeight","reflow","render","draw","generateLegend","legendTemplate","destroy","removeProperty","removeAttribute","showTooltip","ChartElements","forceRedraw","activeElements","Elements","changed","datasets","dataArray","dataIndex","points","bars","segments","tooltipLabels","tooltipColors","medianPosition","dataCollection","xMax","yMax","xMin","yMin","xPositions","yPositions","dataset","hasValue","fill","_saved","fillColor","stroke","strokeColor","MultiTooltip","xPadding","yPadding","xOffset","textColor","fontSize","titleTextColor","titleFontFamily","titleFontStyle","titleFontSize","cornerRadius","labels","legendColors","legendColorBackground","title","label","custom","Element","tooltipPosition","Tooltip","caretHeight","text","toBase64Image","toDataURL","ChartType","name","chartName","baseDefaults","config","configuration","save","restore","props","update","newProps","transition","ease","Point","display","inRange","chartX","chartY","hitDetectionRange","hitDetectionRadius","arc","strokeStyle","lineWidth","strokeWidth","fillStyle","Arc","pointRelativePosition","betweenAngles","startAngle","endAngle","withinRadius","innerRadius","outerRadius","centreAngle","rangeFromCentre","animationPercent","lineJoin","showStroke","Rectangle","halfWidth","leftX","rightX","halfStroke","xAlign","yAlign","caretPadding","tooltipWidth","tooltipRectHeight","tooltipHeight","tooltipX","tooltipY","textAlign","textBaseline","fillText","titleFont","titleWidth","labelWidth","longestTextWidth","halfHeight","getLineHeight","baseLineHeight","afterTitleIndex","fillRect","Scale","fit","buildYLabels","yLabels","stepDecimalPlaces","toFixed","yLabelWidth","showLabels","addXLabel","xLabels","valuesCount","removeXLabel","shift","startPoint","endPoint","padding","cachedYLabelWidth","cachedHeight","calculateYRange","calculateXLabelRotation","firstRotated","firstWidth","lastWidth","xScalePaddingRight","xScalePaddingLeft","xLabelRotation","cosRotation","originalLabelWidth","xLabelWidth","xGridWidth","calculateX","drawingArea","calculateY","scalingFactor","valueWidth","valueOffset","offsetGridLines","yLabelGap","xStart","labelString","yLabelCenter","linePositionY","drawHorizontalLine","showHorizontalLines","gridLineWidth","gridLineColor","lineColor","xPos","linePos","isRotated","drawVerticalLine","showVerticalLines","translate","rotate","RadialScale","size","backdropPaddingY","calculateCenterOffset","lineArc","setScaleSize","getCircumference","pointPosition","halfTextWidth","furthestRightIndex","furthestRightAngle","furthestLeftIndex","furthestLeftAngle","xProtrusionLeft","xProtrusionRight","radiusReductionRight","radiusReductionLeft","largestPossibleRadius","pointLabelFontSize","furthestRight","furthestLeft","pointLabelFontStyle","pointLabelFontFamily","getPointPosition","getIndexAngle","setCenterPoint","leftMovement","rightMovement","maxRight","maxLeft","xCenter","yCenter","distanceFromCenter","thisAngle","yCenterOffset","yHeight","showLabelBackdrop","backdropColor","backdropPaddingX","fontColor","angleLineWidth","angleLineColor","outerPosition","pointLabelPosition","pointLabelFontColor","labelsCount","halfLabelsCount","quarterLabelsCount","upperHalf","exactQuarter","instance","undefined","exports","module","noConflict","scaleShowGridLines","scaleGridLineColor","scaleGridLineWidth","scaleShowHorizontalLines","scaleShowVerticalLines","barShowStroke","barStrokeWidth","barValueSpacing","barDatasetSpacing","ScaleClass","calculateBarX","datasetCount","datasetIndex","barIndex","xWidth","calculateBaseWidth","xAbsolute","barWidth","calculateBarWidth","activeBars","type","getBarsAtEvent","eachBars","bar","activeBar","highlightFill","highlightStroke","BarClass","datasetObject","dataPoint","datasetLabel","buildScale","activeElement","barsArray","eventPosition","datasetIterator","scaleOptions","beginAtZero","currentHeight","values","updatedRanges","addData","removeData","newScaleProps","easingDecimal","defaultConfig","segmentShowStroke","segmentStrokeColor","segmentStrokeWidth","percentageInnerCutout","animateRotate","animateScale","SegmentArc","activeSegments","getSegmentsAtEvent","segment","activeSegment","highlightColor","calculateTotal","datapoint","segmentsArray","location","atIndex","silent","splice","color","highlight","circumference","calculateCircumference","total","indexToDelete","animDecimal","Doughnut","bezierCurve","bezierCurveTension","pointDot","pointDotRadius","pointDotStrokeWidth","pointHitDetectionRadius","datasetStroke","datasetStrokeWidth","datasetFill","PointClass","activePoints","getPointsAtEvent","eachPoints","point","activePoint","pointColor","pointStrokeColor","pointHighlightFill","pointHighlightStroke","pointsArray","previousPoint","pointsWithValues","tension","controlPoints","nextPoint","bezierCurveTo","scaleShowLabelBackdrop","scaleBackdropColor","scaleBackdropPaddingY","scaleBackdropPaddingX","scaleShowLine","updateScaleRange","datapoints","scaleSizes","angleShowLineOut","activePointsCollection","mousePosition","fromCenter","anglePerIndex","pointIndex","totalDataArray","__webpack_amd_options__"],"mappings":"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","file":"commons~pages.projects.graphs.charts~pages.projects.pipelines.charts.79a5db49.chunk.js","sourcesContent":["/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 1.0.2\n *\n * Copyright 2015 Nick Downie\n * Released under the MIT license\n * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md\n */\n\n\n(function(){\n\n\t\"use strict\";\n\n\t//Declare root variable - window in the browser, global on the server\n\tvar root = this,\n\t\tprevious = root.Chart;\n\n\t//Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(context){\n\t\tvar chart = this;\n\t\tthis.canvas = context.canvas;\n\n\t\tthis.ctx = context;\n\n\t\t//Variables global to the chart\n\t\tvar computeDimension = function(element,dimension)\n\t\t{\n\t\t\tif (element['offset'+dimension])\n\t\t\t{\n\t\t\t\treturn element['offset'+dimension];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn document.defaultView.getComputedStyle(element).getPropertyValue(dimension);\n\t\t\t}\n\t\t}\n\n\t\tvar width = this.width = computeDimension(context.canvas,'Width');\n\t\tvar height = this.height = computeDimension(context.canvas,'Height');\n\n\t\t// Firefox requires this to work correctly\n\t\tcontext.canvas.width = width;\n\t\tcontext.canvas.height = height;\n\n\t\tvar width = this.width = context.canvas.width;\n\t\tvar height = this.height = context.canvas.height;\n\t\tthis.aspectRatio = this.width / this.height;\n\t\t//High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.\n\t\thelpers.retinaScale(this);\n\n\t\treturn this;\n\t};\n\t//Globally expose the defaults to allow for user updating/changing\n\tChart.defaults = {\n\t\tglobal: {\n\t\t\t// Boolean - Whether to animate the chart\n\t\t\tanimation: true,\n\n\t\t\t// Number - Number of animation steps\n\t\t\tanimationSteps: 60,\n\n\t\t\t// String - Animation easing effect\n\t\t\tanimationEasing: \"easeOutQuart\",\n\n\t\t\t// Boolean - If we should show the scale at all\n\t\t\tshowScale: true,\n\n\t\t\t// Boolean - If we want to override with a hard coded scale\n\t\t\tscaleOverride: false,\n\n\t\t\t// ** Required if scaleOverride is true **\n\t\t\t// Number - The number of steps in a hard coded scale\n\t\t\tscaleSteps: null,\n\t\t\t// Number - The value jump in the hard coded scale\n\t\t\tscaleStepWidth: null,\n\t\t\t// Number - The scale starting value\n\t\t\tscaleStartValue: null,\n\n\t\t\t// String - Colour of the scale line\n\t\t\tscaleLineColor: \"rgba(0,0,0,.1)\",\n\n\t\t\t// Number - Pixel width of the scale line\n\t\t\tscaleLineWidth: 1,\n\n\t\t\t// Boolean - Whether to show labels on the scale\n\t\t\tscaleShowLabels: true,\n\n\t\t\t// Interpolated JS string - can access value\n\t\t\tscaleLabel: \"<%=value%>\",\n\n\t\t\t// Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there\n\t\t\tscaleIntegersOnly: true,\n\n\t\t\t// Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value\n\t\t\tscaleBeginAtZero: false,\n\n\t\t\t// String - Scale label font declaration for the scale label\n\t\t\tscaleFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\n\t\t\t// Number - Scale label font size in pixels\n\t\t\tscaleFontSize: 12,\n\n\t\t\t// String - Scale label font weight style\n\t\t\tscaleFontStyle: \"normal\",\n\n\t\t\t// String - Scale label font colour\n\t\t\tscaleFontColor: \"#666\",\n\n\t\t\t// Boolean - whether or not the chart should be responsive and resize when the browser does.\n\t\t\tresponsive: false,\n\n\t\t\t// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container\n\t\t\tmaintainAspectRatio: true,\n\n\t\t\t// Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove\n\t\t\tshowTooltips: true,\n\n\t\t\t// Boolean - Determines whether to draw built-in tooltip or call custom tooltip function\n\t\t\tcustomTooltips: false,\n\n\t\t\t// Array - Array of string names to attach tooltip events\n\t\t\ttooltipEvents: [\"mousemove\", \"touchstart\", \"touchmove\", \"mouseout\"],\n\n\t\t\t// String - Tooltip background colour\n\t\t\ttooltipFillColor: \"rgba(0,0,0,0.8)\",\n\n\t\t\t// String - Tooltip label font declaration for the scale label\n\t\t\ttooltipFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\n\t\t\t// Number - Tooltip label font size in pixels\n\t\t\ttooltipFontSize: 14,\n\n\t\t\t// String - Tooltip font weight style\n\t\t\ttooltipFontStyle: \"normal\",\n\n\t\t\t// String - Tooltip label font colour\n\t\t\ttooltipFontColor: \"#fff\",\n\n\t\t\t// String - Tooltip title font declaration for the scale label\n\t\t\ttooltipTitleFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\n\t\t\t// Number - Tooltip title font size in pixels\n\t\t\ttooltipTitleFontSize: 14,\n\n\t\t\t// String - Tooltip title font weight style\n\t\t\ttooltipTitleFontStyle: \"bold\",\n\n\t\t\t// String - Tooltip title font colour\n\t\t\ttooltipTitleFontColor: \"#fff\",\n\n\t\t\t// Number - pixel width of padding around tooltip text\n\t\t\ttooltipYPadding: 6,\n\n\t\t\t// Number - pixel width of padding around tooltip text\n\t\t\ttooltipXPadding: 6,\n\n\t\t\t// Number - Size of the caret on the tooltip\n\t\t\ttooltipCaretSize: 8,\n\n\t\t\t// Number - Pixel radius of the tooltip border\n\t\t\ttooltipCornerRadius: 6,\n\n\t\t\t// Number - Pixel offset from point x to tooltip edge\n\t\t\ttooltipXOffset: 10,\n\n\t\t\t// String - Template string for single tooltips\n\t\t\ttooltipTemplate: \"<%if (label){%><%=label%>: <%}%><%= value %>\",\n\n\t\t\t// String - Template string for single tooltips\n\t\t\tmultiTooltipTemplate: \"<%= value %>\",\n\n\t\t\t// String - Colour behind the legend colour block\n\t\t\tmultiTooltipKeyBackground: '#fff',\n\n\t\t\t// Function - Will fire on animation progression.\n\t\t\tonAnimationProgress: function(){},\n\n\t\t\t// Function - Will fire on animation completion.\n\t\t\tonAnimationComplete: function(){}\n\n\t\t}\n\t};\n\n\t//Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t//Global Chart helpers object for utility methods and classes\n\tvar helpers = Chart.helpers = {};\n\n\t\t//-- Basic js utility methods\n\tvar each = helpers.each = function(loopable,callback,self){\n\t\t\tvar additionalArgs = Array.prototype.slice.call(arguments, 3);\n\t\t\t// Check to see if null or undefined firstly.\n\t\t\tif (loopable){\n\t\t\t\tif (loopable.length === +loopable.length){\n\t\t\t\t\tvar i;\n\t\t\t\t\tfor (i=0; i= 0; i--) {\n\t\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\t\tif (filterCallback(currentItem)){\n\t\t\t\t\treturn currentItem;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinherits = helpers.inherits = function(extensions){\n\t\t\t//Basic javascript inheritance based on the model created in Backbone.js\n\t\t\tvar parent = this;\n\t\t\tvar ChartElement = (extensions && extensions.hasOwnProperty(\"constructor\")) ? extensions.constructor : function(){ return parent.apply(this, arguments); };\n\n\t\t\tvar Surrogate = function(){ this.constructor = ChartElement;};\n\t\t\tSurrogate.prototype = parent.prototype;\n\t\t\tChartElement.prototype = new Surrogate();\n\n\t\t\tChartElement.extend = inherits;\n\n\t\t\tif (extensions) extend(ChartElement.prototype, extensions);\n\n\t\t\tChartElement.__super__ = parent.prototype;\n\n\t\t\treturn ChartElement;\n\t\t},\n\t\tnoop = helpers.noop = function(){},\n\t\tuid = helpers.uid = (function(){\n\t\t\tvar id=0;\n\t\t\treturn function(){\n\t\t\t\treturn \"chart-\" + id++;\n\t\t\t};\n\t\t})(),\n\t\twarn = helpers.warn = function(str){\n\t\t\t//Method for warning of errors\n\t\t\tif (window.console && typeof window.console.warn == \"function\") console.warn(str);\n\t\t},\n\t\tamd = helpers.amd = (typeof define == 'function' && define.amd),\n\t\t//-- Math methods\n\t\tisNumber = helpers.isNumber = function(n){\n\t\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t\t},\n\t\tmax = helpers.max = function(array){\n\t\t\treturn Math.max.apply( Math, array );\n\t\t},\n\t\tmin = helpers.min = function(array){\n\t\t\treturn Math.min.apply( Math, array );\n\t\t},\n\t\tcap = helpers.cap = function(valueToCap,maxValue,minValue){\n\t\t\tif(isNumber(maxValue)) {\n\t\t\t\tif( valueToCap > maxValue ) {\n\t\t\t\t\treturn maxValue;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(isNumber(minValue)){\n\t\t\t\tif ( valueToCap < minValue ){\n\t\t\t\t\treturn minValue;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn valueToCap;\n\t\t},\n\t\tgetDecimalPlaces = helpers.getDecimalPlaces = function(num){\n\t\t\tif (num%1!==0 && isNumber(num)){\n\t\t\t\treturn num.toString().split(\".\")[1].length;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttoRadians = helpers.radians = function(degrees){\n\t\t\treturn degrees * (Math.PI/180);\n\t\t},\n\t\t// Gets the angle from vertical upright to the point about a centre.\n\t\tgetAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){\n\t\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x,\n\t\t\t\tdistanceFromYCenter = anglePoint.y - centrePoint.y,\n\t\t\t\tradialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\n\t\t\tvar angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\t\t//If the segment is in the top left quadrant, we need to add another rotation to the angle\n\t\t\tif (distanceFromXCenter < 0 && distanceFromYCenter < 0){\n\t\t\t\tangle += Math.PI*2;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tangle: angle,\n\t\t\t\tdistance: radialDistanceFromCenter\n\t\t\t};\n\t\t},\n\t\taliasPixel = helpers.aliasPixel = function(pixelWidth){\n\t\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t\t},\n\t\tsplineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){\n\t\t\t//Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t\t//http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\t\t\tvar d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)),\n\t\t\t\td12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)),\n\t\t\t\tfa=t*d01/(d01+d12),// scaling factor for triangle Ta\n\t\t\t\tfb=t*d12/(d01+d12);\n\t\t\treturn {\n\t\t\t\tinner : {\n\t\t\t\t\tx : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x),\n\t\t\t\t\ty : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y)\n\t\t\t\t},\n\t\t\t\touter : {\n\t\t\t\t\tx: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x),\n\t\t\t\t\ty : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y)\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tcalculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){\n\t\t\treturn Math.floor(Math.log(val) / Math.LN10);\n\t\t},\n\t\tcalculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){\n\n\t\t\t//Set a minimum step of two - a point at the top of the graph, and a point at the base\n\t\t\tvar minSteps = 2,\n\t\t\t\tmaxSteps = Math.floor(drawingSize/(textSize * 1.5)),\n\t\t\t\tskipFitting = (minSteps >= maxSteps);\n\n\t\t\tvar maxValue = max(valuesArray),\n\t\t\t\tminValue = min(valuesArray);\n\n\t\t\t// We need some degree of seperation here to calculate the scales if all the values are the same\n\t\t\t// Adding/minusing 0.5 will give us a range of 1.\n\t\t\tif (maxValue === minValue){\n\t\t\t\tmaxValue += 0.5;\n\t\t\t\t// So we don't end up with a graph with a negative start value if we've said always start from zero\n\t\t\t\tif (minValue >= 0.5 && !startFromZero){\n\t\t\t\t\tminValue -= 0.5;\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t// Make up a whole number above the values\n\t\t\t\t\tmaxValue += 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar\tvalueRange = Math.abs(maxValue - minValue),\n\t\t\t\trangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange),\n\t\t\t\tgraphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),\n\t\t\t\tgraphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),\n\t\t\t\tgraphRange = graphMax - graphMin,\n\t\t\t\tstepValue = Math.pow(10, rangeOrderOfMagnitude),\n\t\t\t\tnumberOfSteps = Math.round(graphRange / stepValue);\n\n\t\t\t//If we have more space on the graph we'll use it to give more definition to the data\n\t\t\twhile((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) {\n\t\t\t\tif(numberOfSteps > maxSteps){\n\t\t\t\t\tstepValue *=2;\n\t\t\t\t\tnumberOfSteps = Math.round(graphRange/stepValue);\n\t\t\t\t\t// Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps.\n\t\t\t\t\tif (numberOfSteps % 1 !== 0){\n\t\t\t\t\t\tskipFitting = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//We can fit in double the amount of scale points on the scale\n\t\t\t\telse{\n\t\t\t\t\t//If user has declared ints only, and the step value isn't a decimal\n\t\t\t\t\tif (integersOnly && rangeOrderOfMagnitude >= 0){\n\t\t\t\t\t\t//If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float\n\t\t\t\t\t\tif(stepValue/2 % 1 === 0){\n\t\t\t\t\t\t\tstepValue /=2;\n\t\t\t\t\t\t\tnumberOfSteps = Math.round(graphRange/stepValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//If it would make it a float break out of the loop\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//If the scale doesn't have to be an int, make the scale more granular anyway.\n\t\t\t\t\telse{\n\t\t\t\t\t\tstepValue /=2;\n\t\t\t\t\t\tnumberOfSteps = Math.round(graphRange/stepValue);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (skipFitting){\n\t\t\t\tnumberOfSteps = minSteps;\n\t\t\t\tstepValue = graphRange / numberOfSteps;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsteps : numberOfSteps,\n\t\t\t\tstepValue : stepValue,\n\t\t\t\tmin : graphMin,\n\t\t\t\tmax\t: graphMin + (numberOfSteps * stepValue)\n\t\t\t};\n\n\t\t},\n\t\t/* jshint ignore:start */\n\t\t// Blows up jshint errors based on the new Function constructor\n\t\t//Templating methods\n\t\t//Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/\n\t\ttemplate = helpers.template = function(templateString, valuesObject){\n\n\t\t\t// If templateString is function rather than string-template - call the function for valuesObject\n\n\t\t\tif(templateString instanceof Function){\n\t\t\t \treturn templateString(valuesObject);\n\t\t \t}\n\n\t\t\tvar cache = {};\n\t\t\tfunction tmpl(str, data){\n\t\t\t\t// Figure out if we're getting a template, or if we need to\n\t\t\t\t// load the template - and be sure to cache the result.\n\t\t\t\tvar fn = !/\\W/.test(str) ?\n\t\t\t\tcache[str] = cache[str] :\n\n\t\t\t\t// Generate a reusable function that will serve as a template\n\t\t\t\t// generator (and which will be cached).\n\t\t\t\tnew Function(\"obj\",\n\t\t\t\t\t\"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n\n\t\t\t\t\t// Introduce the data as local variables using with(){}\n\t\t\t\t\t\"with(obj){p.push('\" +\n\n\t\t\t\t\t// Convert the template into pure JavaScript\n\t\t\t\t\tstr\n\t\t\t\t\t\t.replace(/[\\r\\t\\n]/g, \" \")\n\t\t\t\t\t\t.split(\"<%\").join(\"\\t\")\n\t\t\t\t\t\t.replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n\t\t\t\t\t\t.replace(/\\t=(.*?)%>/g, \"',$1,'\")\n\t\t\t\t\t\t.split(\"\\t\").join(\"');\")\n\t\t\t\t\t\t.split(\"%>\").join(\"p.push('\")\n\t\t\t\t\t\t.split(\"\\r\").join(\"\\\\'\") +\n\t\t\t\t\t\"');}return p.join('');\"\n\t\t\t\t);\n\n\t\t\t\t// Provide some basic currying to the user\n\t\t\t\treturn data ? fn( data ) : fn;\n\t\t\t}\n\t\t\treturn tmpl(templateString,valuesObject);\n\t\t},\n\t\t/* jshint ignore:end */\n\t\tgenerateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){\n\t\t\tvar labelsArray = new Array(numberOfSteps);\n\t\t\tif (labelTemplateString){\n\t\t\t\teach(labelsArray,function(val,index){\n\t\t\t\t\tlabelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))});\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn labelsArray;\n\t\t},\n\t\t//--Animation methods\n\t\t//Easing functions adapted from Robert Penner's easing equations\n\t\t//http://www.robertpenner.com/easing/\n\t\teasingEffects = helpers.easingEffects = {\n\t\t\tlinear: function (t) {\n\t\t\t\treturn t;\n\t\t\t},\n\t\t\teaseInQuad: function (t) {\n\t\t\t\treturn t * t;\n\t\t\t},\n\t\t\teaseOutQuad: function (t) {\n\t\t\t\treturn -1 * t * (t - 2);\n\t\t\t},\n\t\t\teaseInOutQuad: function (t) {\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * t * t;\n\t\t\t\treturn -1 / 2 * ((--t) * (t - 2) - 1);\n\t\t\t},\n\t\t\teaseInCubic: function (t) {\n\t\t\t\treturn t * t * t;\n\t\t\t},\n\t\t\teaseOutCubic: function (t) {\n\t\t\t\treturn 1 * ((t = t / 1 - 1) * t * t + 1);\n\t\t\t},\n\t\t\teaseInOutCubic: function (t) {\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t;\n\t\t\t\treturn 1 / 2 * ((t -= 2) * t * t + 2);\n\t\t\t},\n\t\t\teaseInQuart: function (t) {\n\t\t\t\treturn t * t * t * t;\n\t\t\t},\n\t\t\teaseOutQuart: function (t) {\n\t\t\t\treturn -1 * ((t = t / 1 - 1) * t * t * t - 1);\n\t\t\t},\n\t\t\teaseInOutQuart: function (t) {\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t;\n\t\t\t\treturn -1 / 2 * ((t -= 2) * t * t * t - 2);\n\t\t\t},\n\t\t\teaseInQuint: function (t) {\n\t\t\t\treturn 1 * (t /= 1) * t * t * t * t;\n\t\t\t},\n\t\t\teaseOutQuint: function (t) {\n\t\t\t\treturn 1 * ((t = t / 1 - 1) * t * t * t * t + 1);\n\t\t\t},\n\t\t\teaseInOutQuint: function (t) {\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t;\n\t\t\t\treturn 1 / 2 * ((t -= 2) * t * t * t * t + 2);\n\t\t\t},\n\t\t\teaseInSine: function (t) {\n\t\t\t\treturn -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;\n\t\t\t},\n\t\t\teaseOutSine: function (t) {\n\t\t\t\treturn 1 * Math.sin(t / 1 * (Math.PI / 2));\n\t\t\t},\n\t\t\teaseInOutSine: function (t) {\n\t\t\t\treturn -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);\n\t\t\t},\n\t\t\teaseInExpo: function (t) {\n\t\t\t\treturn (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));\n\t\t\t},\n\t\t\teaseOutExpo: function (t) {\n\t\t\t\treturn (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);\n\t\t\t},\n\t\t\teaseInOutExpo: function (t) {\n\t\t\t\tif (t === 0) return 0;\n\t\t\t\tif (t === 1) return 1;\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1));\n\t\t\t\treturn 1 / 2 * (-Math.pow(2, -10 * --t) + 2);\n\t\t\t},\n\t\t\teaseInCirc: function (t) {\n\t\t\t\tif (t >= 1) return t;\n\t\t\t\treturn -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);\n\t\t\t},\n\t\t\teaseOutCirc: function (t) {\n\t\t\t\treturn 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);\n\t\t\t},\n\t\t\teaseInOutCirc: function (t) {\n\t\t\t\tif ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t\treturn 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t\t},\n\t\t\teaseInElastic: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\tvar p = 0;\n\t\t\t\tvar a = 1;\n\t\t\t\tif (t === 0) return 0;\n\t\t\t\tif ((t /= 1) == 1) return 1;\n\t\t\t\tif (!p) p = 1 * 0.3;\n\t\t\t\tif (a < Math.abs(1)) {\n\t\t\t\t\ta = 1;\n\t\t\t\t\ts = p / 4;\n\t\t\t\t} else s = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t\t},\n\t\t\teaseOutElastic: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\tvar p = 0;\n\t\t\t\tvar a = 1;\n\t\t\t\tif (t === 0) return 0;\n\t\t\t\tif ((t /= 1) == 1) return 1;\n\t\t\t\tif (!p) p = 1 * 0.3;\n\t\t\t\tif (a < Math.abs(1)) {\n\t\t\t\t\ta = 1;\n\t\t\t\t\ts = p / 4;\n\t\t\t\t} else s = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;\n\t\t\t},\n\t\t\teaseInOutElastic: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\tvar p = 0;\n\t\t\t\tvar a = 1;\n\t\t\t\tif (t === 0) return 0;\n\t\t\t\tif ((t /= 1 / 2) == 2) return 1;\n\t\t\t\tif (!p) p = 1 * (0.3 * 1.5);\n\t\t\t\tif (a < Math.abs(1)) {\n\t\t\t\t\ta = 1;\n\t\t\t\t\ts = p / 4;\n\t\t\t\t} else s = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\tif (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t\t},\n\t\t\teaseInBack: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\treturn 1 * (t /= 1) * t * ((s + 1) * t - s);\n\t\t\t},\n\t\t\teaseOutBack: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\treturn 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);\n\t\t\t},\n\t\t\teaseInOutBack: function (t) {\n\t\t\t\tvar s = 1.70158;\n\t\t\t\tif ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t\t\treturn 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t\t\t},\n\t\t\teaseInBounce: function (t) {\n\t\t\t\treturn 1 - easingEffects.easeOutBounce(1 - t);\n\t\t\t},\n\t\t\teaseOutBounce: function (t) {\n\t\t\t\tif ((t /= 1) < (1 / 2.75)) {\n\t\t\t\t\treturn 1 * (7.5625 * t * t);\n\t\t\t\t} else if (t < (2 / 2.75)) {\n\t\t\t\t\treturn 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);\n\t\t\t\t} else if (t < (2.5 / 2.75)) {\n\t\t\t\t\treturn 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);\n\t\t\t\t} else {\n\t\t\t\t\treturn 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);\n\t\t\t\t}\n\t\t\t},\n\t\t\teaseInOutBounce: function (t) {\n\t\t\t\tif (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5;\n\t\t\t\treturn easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;\n\t\t\t}\n\t\t},\n\t\t//Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\t\trequestAnimFrame = helpers.requestAnimFrame = (function(){\n\t\t\treturn window.requestAnimationFrame ||\n\t\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\t\twindow.oRequestAnimationFrame ||\n\t\t\t\twindow.msRequestAnimationFrame ||\n\t\t\t\tfunction(callback) {\n\t\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t\t};\n\t\t})(),\n\t\tcancelAnimFrame = helpers.cancelAnimFrame = (function(){\n\t\t\treturn window.cancelAnimationFrame ||\n\t\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\t\twindow.oCancelAnimationFrame ||\n\t\t\t\twindow.msCancelAnimationFrame ||\n\t\t\t\tfunction(callback) {\n\t\t\t\t\treturn window.clearTimeout(callback, 1000 / 60);\n\t\t\t\t};\n\t\t})(),\n\t\tanimationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){\n\n\t\t\tvar currentStep = 0,\n\t\t\t\teasingFunction = easingEffects[easingString] || easingEffects.linear;\n\n\t\t\tvar animationFrame = function(){\n\t\t\t\tcurrentStep++;\n\t\t\t\tvar stepDecimal = currentStep/totalSteps;\n\t\t\t\tvar easeDecimal = easingFunction(stepDecimal);\n\n\t\t\t\tcallback.call(chartInstance,easeDecimal,stepDecimal, currentStep);\n\t\t\t\tonProgress.call(chartInstance,easeDecimal,stepDecimal);\n\t\t\t\tif (currentStep < totalSteps){\n\t\t\t\t\tchartInstance.animationFrame = requestAnimFrame(animationFrame);\n\t\t\t\t} else{\n\t\t\t\t\tonComplete.apply(chartInstance);\n\t\t\t\t}\n\t\t\t};\n\t\t\trequestAnimFrame(animationFrame);\n\t\t},\n\t\t//-- DOM methods\n\t\tgetRelativePosition = helpers.getRelativePosition = function(evt){\n\t\t\tvar mouseX, mouseY;\n\t\t\tvar e = evt.originalEvent || evt,\n\t\t\t\tcanvas = evt.currentTarget || evt.srcElement,\n\t\t\t\tboundingRect = canvas.getBoundingClientRect();\n\n\t\t\tif (e.touches){\n\t\t\t\tmouseX = e.touches[0].clientX - boundingRect.left;\n\t\t\t\tmouseY = e.touches[0].clientY - boundingRect.top;\n\n\t\t\t}\n\t\t\telse{\n\t\t\t\tmouseX = e.clientX - boundingRect.left;\n\t\t\t\tmouseY = e.clientY - boundingRect.top;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx : mouseX,\n\t\t\t\ty : mouseY\n\t\t\t};\n\n\t\t},\n\t\taddEvent = helpers.addEvent = function(node,eventType,method){\n\t\t\tif (node.addEventListener){\n\t\t\t\tnode.addEventListener(eventType,method);\n\t\t\t} else if (node.attachEvent){\n\t\t\t\tnode.attachEvent(\"on\"+eventType, method);\n\t\t\t} else {\n\t\t\t\tnode[\"on\"+eventType] = method;\n\t\t\t}\n\t\t},\n\t\tremoveEvent = helpers.removeEvent = function(node, eventType, handler){\n\t\t\tif (node.removeEventListener){\n\t\t\t\tnode.removeEventListener(eventType, handler, false);\n\t\t\t} else if (node.detachEvent){\n\t\t\t\tnode.detachEvent(\"on\"+eventType,handler);\n\t\t\t} else{\n\t\t\t\tnode[\"on\" + eventType] = noop;\n\t\t\t}\n\t\t},\n\t\tbindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){\n\t\t\t// Create the events object if it's not already present\n\t\t\tif (!chartInstance.events) chartInstance.events = {};\n\n\t\t\teach(arrayOfEvents,function(eventName){\n\t\t\t\tchartInstance.events[eventName] = function(){\n\t\t\t\t\thandler.apply(chartInstance, arguments);\n\t\t\t\t};\n\t\t\t\taddEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]);\n\t\t\t});\n\t\t},\n\t\tunbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) {\n\t\t\teach(arrayOfEvents, function(handler,eventName){\n\t\t\t\tremoveEvent(chartInstance.chart.canvas, eventName, handler);\n\t\t\t});\n\t\t},\n\t\tgetMaximumWidth = helpers.getMaximumWidth = function(domNode){\n\t\t\tvar container = domNode.parentNode;\n\t\t\t// TODO = check cross browser stuff with this.\n\t\t\treturn container.clientWidth;\n\t\t},\n\t\tgetMaximumHeight = helpers.getMaximumHeight = function(domNode){\n\t\t\tvar container = domNode.parentNode;\n\t\t\t// TODO = check cross browser stuff with this.\n\t\t\treturn container.clientHeight;\n\t\t},\n\t\tgetMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support\n\t\tretinaScale = helpers.retinaScale = function(chart){\n\t\t\tvar ctx = chart.ctx,\n\t\t\t\twidth = chart.canvas.width,\n\t\t\t\theight = chart.canvas.height;\n\n\t\t\tif (window.devicePixelRatio) {\n\t\t\t\tctx.canvas.style.width = width + \"px\";\n\t\t\t\tctx.canvas.style.height = height + \"px\";\n\t\t\t\tctx.canvas.height = height * window.devicePixelRatio;\n\t\t\t\tctx.canvas.width = width * window.devicePixelRatio;\n\t\t\t\tctx.scale(window.devicePixelRatio, window.devicePixelRatio);\n\t\t\t}\n\t\t},\n\t\t//-- Canvas methods\n\t\tclear = helpers.clear = function(chart){\n\t\t\tchart.ctx.clearRect(0,0,chart.width,chart.height);\n\t\t},\n\t\tfontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){\n\t\t\treturn fontStyle + \" \" + pixelSize+\"px \" + fontFamily;\n\t\t},\n\t\tlongestText = helpers.longestText = function(ctx,font,arrayOfStrings){\n\t\t\tctx.font = font;\n\t\t\tvar longest = 0;\n\t\t\teach(arrayOfStrings,function(string){\n\t\t\t\tvar textWidth = ctx.measureText(string).width;\n\t\t\t\tlongest = (textWidth > longest) ? textWidth : longest;\n\t\t\t});\n\t\t\treturn longest;\n\t\t},\n\t\tdrawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\t\t};\n\n\n\t//Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t//Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\tChart.Type = function(data,options,chart){\n\t\tthis.options = options;\n\t\tthis.chart = chart;\n\t\tthis.id = uid();\n\t\t//Add the chart instance to the global namespace\n\t\tChart.instances[this.id] = this;\n\n\t\t// Initialize is always called when a chart type is created\n\t\t// By default it is a no op, but it should be extended\n\t\tif (options.responsive){\n\t\t\tthis.resize();\n\t\t}\n\t\tthis.initialize.call(this,data);\n\t};\n\n\t//Core methods that'll be a part of every chart type\n\textend(Chart.Type.prototype,{\n\t\tinitialize : function(){return this;},\n\t\tclear : function(){\n\t\t\tclear(this.chart);\n\t\t\treturn this;\n\t\t},\n\t\tstop : function(){\n\t\t\t// Stops any current animation loop occuring\n\t\t\tcancelAnimFrame(this.animationFrame);\n\t\t\treturn this;\n\t\t},\n\t\tresize : function(callback){\n\t\t\tthis.stop();\n\t\t\tvar canvas = this.chart.canvas,\n\t\t\t\tnewWidth = getMaximumWidth(this.chart.canvas),\n\t\t\t\tnewHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas);\n\n\t\t\tcanvas.width = this.chart.width = newWidth;\n\t\t\tcanvas.height = this.chart.height = newHeight;\n\n\t\t\tretinaScale(this.chart);\n\n\t\t\tif (typeof callback === \"function\"){\n\t\t\t\tcallback.apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\treflow : noop,\n\t\trender : function(reflow){\n\t\t\tif (reflow){\n\t\t\t\tthis.reflow();\n\t\t\t}\n\t\t\tif (this.options.animation && !reflow){\n\t\t\t\thelpers.animationLoop(\n\t\t\t\t\tthis.draw,\n\t\t\t\t\tthis.options.animationSteps,\n\t\t\t\t\tthis.options.animationEasing,\n\t\t\t\t\tthis.options.onAnimationProgress,\n\t\t\t\t\tthis.options.onAnimationComplete,\n\t\t\t\t\tthis\n\t\t\t\t);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.draw();\n\t\t\t\tthis.options.onAnimationComplete.call(this);\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\tgenerateLegend : function(){\n\t\t\treturn template(this.options.legendTemplate,this);\n\t\t},\n\t\tdestroy : function(){\n\t\t\tthis.clear();\n\t\t\tunbindEvents(this, this.events);\n\t\t\tvar canvas = this.chart.canvas;\n\n\t\t\t// Reset canvas height/width attributes starts a fresh with the canvas context\n\t\t\tcanvas.width = this.chart.width;\n\t\t\tcanvas.height = this.chart.height;\n\n\t\t\t// < IE9 doesn't support removeProperty\n\t\t\tif (canvas.style.removeProperty) {\n\t\t\t\tcanvas.style.removeProperty('width');\n\t\t\t\tcanvas.style.removeProperty('height');\n\t\t\t} else {\n\t\t\t\tcanvas.style.removeAttribute('width');\n\t\t\t\tcanvas.style.removeAttribute('height');\n\t\t\t}\n\n\t\t\tdelete Chart.instances[this.id];\n\t\t},\n\t\tshowTooltip : function(ChartElements, forceRedraw){\n\t\t\t// Only redraw the chart if we've actually changed what we're hovering on.\n\t\t\tif (typeof this.activeElements === 'undefined') this.activeElements = [];\n\n\t\t\tvar isChanged = (function(Elements){\n\t\t\t\tvar changed = false;\n\n\t\t\t\tif (Elements.length !== this.activeElements.length){\n\t\t\t\t\tchanged = true;\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\n\t\t\t\teach(Elements, function(element, index){\n\t\t\t\t\tif (element !== this.activeElements[index]){\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\t\t\t\treturn changed;\n\t\t\t}).call(this, ChartElements);\n\n\t\t\tif (!isChanged && !forceRedraw){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.activeElements = ChartElements;\n\t\t\t}\n\t\t\tthis.draw();\n\t\t\tif(this.options.customTooltips){\n\t\t\t\tthis.options.customTooltips(false);\n\t\t\t}\n\t\t\tif (ChartElements.length > 0){\n\t\t\t\t// If we have multiple datasets, show a MultiTooltip for all of the data points at that index\n\t\t\t\tif (this.datasets && this.datasets.length > 1) {\n\t\t\t\t\tvar dataArray,\n\t\t\t\t\t\tdataIndex;\n\n\t\t\t\t\tfor (var i = this.datasets.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tdataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments;\n\t\t\t\t\t\tdataIndex = indexOf(dataArray, ChartElements[0]);\n\t\t\t\t\t\tif (dataIndex !== -1){\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar tooltipLabels = [],\n\t\t\t\t\t\ttooltipColors = [],\n\t\t\t\t\t\tmedianPosition = (function(index) {\n\n\t\t\t\t\t\t\t// Get all the points at that particular index\n\t\t\t\t\t\t\tvar Elements = [],\n\t\t\t\t\t\t\t\tdataCollection,\n\t\t\t\t\t\t\t\txPositions = [],\n\t\t\t\t\t\t\t\tyPositions = [],\n\t\t\t\t\t\t\t\txMax,\n\t\t\t\t\t\t\t\tyMax,\n\t\t\t\t\t\t\t\txMin,\n\t\t\t\t\t\t\t\tyMin;\n\t\t\t\t\t\t\thelpers.each(this.datasets, function(dataset){\n\t\t\t\t\t\t\t\tdataCollection = dataset.points || dataset.bars || dataset.segments;\n\t\t\t\t\t\t\t\tif (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){\n\t\t\t\t\t\t\t\t\tElements.push(dataCollection[dataIndex]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thelpers.each(Elements, function(element) {\n\t\t\t\t\t\t\t\txPositions.push(element.x);\n\t\t\t\t\t\t\t\tyPositions.push(element.y);\n\n\n\t\t\t\t\t\t\t\t//Include any colour information about the element\n\t\t\t\t\t\t\t\ttooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element));\n\t\t\t\t\t\t\t\ttooltipColors.push({\n\t\t\t\t\t\t\t\t\tfill: element._saved.fillColor || element.fillColor,\n\t\t\t\t\t\t\t\t\tstroke: element._saved.strokeColor || element.strokeColor\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t}, this);\n\n\t\t\t\t\t\t\tyMin = min(yPositions);\n\t\t\t\t\t\t\tyMax = max(yPositions);\n\n\t\t\t\t\t\t\txMin = min(xPositions);\n\t\t\t\t\t\t\txMax = max(xPositions);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tx: (xMin > this.chart.width/2) ? xMin : xMax,\n\t\t\t\t\t\t\t\ty: (yMin + yMax)/2\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}).call(this, dataIndex);\n\n\t\t\t\t\tnew Chart.MultiTooltip({\n\t\t\t\t\t\tx: medianPosition.x,\n\t\t\t\t\t\ty: medianPosition.y,\n\t\t\t\t\t\txPadding: this.options.tooltipXPadding,\n\t\t\t\t\t\tyPadding: this.options.tooltipYPadding,\n\t\t\t\t\t\txOffset: this.options.tooltipXOffset,\n\t\t\t\t\t\tfillColor: this.options.tooltipFillColor,\n\t\t\t\t\t\ttextColor: this.options.tooltipFontColor,\n\t\t\t\t\t\tfontFamily: this.options.tooltipFontFamily,\n\t\t\t\t\t\tfontStyle: this.options.tooltipFontStyle,\n\t\t\t\t\t\tfontSize: this.options.tooltipFontSize,\n\t\t\t\t\t\ttitleTextColor: this.options.tooltipTitleFontColor,\n\t\t\t\t\t\ttitleFontFamily: this.options.tooltipTitleFontFamily,\n\t\t\t\t\t\ttitleFontStyle: this.options.tooltipTitleFontStyle,\n\t\t\t\t\t\ttitleFontSize: this.options.tooltipTitleFontSize,\n\t\t\t\t\t\tcornerRadius: this.options.tooltipCornerRadius,\n\t\t\t\t\t\tlabels: tooltipLabels,\n\t\t\t\t\t\tlegendColors: tooltipColors,\n\t\t\t\t\t\tlegendColorBackground : this.options.multiTooltipKeyBackground,\n\t\t\t\t\t\ttitle: ChartElements[0].label,\n\t\t\t\t\t\tchart: this.chart,\n\t\t\t\t\t\tctx: this.chart.ctx,\n\t\t\t\t\t\tcustom: this.options.customTooltips\n\t\t\t\t\t}).draw();\n\n\t\t\t\t} else {\n\t\t\t\t\teach(ChartElements, function(Element) {\n\t\t\t\t\t\tvar tooltipPosition = Element.tooltipPosition();\n\t\t\t\t\t\tnew Chart.Tooltip({\n\t\t\t\t\t\t\tx: Math.round(tooltipPosition.x),\n\t\t\t\t\t\t\ty: Math.round(tooltipPosition.y),\n\t\t\t\t\t\t\txPadding: this.options.tooltipXPadding,\n\t\t\t\t\t\t\tyPadding: this.options.tooltipYPadding,\n\t\t\t\t\t\t\tfillColor: this.options.tooltipFillColor,\n\t\t\t\t\t\t\ttextColor: this.options.tooltipFontColor,\n\t\t\t\t\t\t\tfontFamily: this.options.tooltipFontFamily,\n\t\t\t\t\t\t\tfontStyle: this.options.tooltipFontStyle,\n\t\t\t\t\t\t\tfontSize: this.options.tooltipFontSize,\n\t\t\t\t\t\t\tcaretHeight: this.options.tooltipCaretSize,\n\t\t\t\t\t\t\tcornerRadius: this.options.tooltipCornerRadius,\n\t\t\t\t\t\t\ttext: template(this.options.tooltipTemplate, Element),\n\t\t\t\t\t\t\tchart: this.chart,\n\t\t\t\t\t\t\tcustom: this.options.customTooltips\n\t\t\t\t\t\t}).draw();\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\ttoBase64Image : function(){\n\t\t\treturn this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);\n\t\t}\n\t});\n\n\tChart.Type.extend = function(extensions){\n\n\t\tvar parent = this;\n\n\t\tvar ChartType = function(){\n\t\t\treturn parent.apply(this,arguments);\n\t\t};\n\n\t\t//Copy the prototype object of the this class\n\t\tChartType.prototype = clone(parent.prototype);\n\t\t//Now overwrite some of the properties in the base class with the new extensions\n\t\textend(ChartType.prototype, extensions);\n\n\t\tChartType.extend = Chart.Type.extend;\n\n\t\tif (extensions.name || parent.prototype.name){\n\n\t\t\tvar chartName = extensions.name || parent.prototype.name;\n\t\t\t//Assign any potential default values of the new chart type\n\n\t\t\t//If none are defined, we'll use a clone of the chart type this is being extended from.\n\t\t\t//I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart\n\t\t\t//doesn't define some defaults of their own.\n\n\t\t\tvar baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {};\n\n\t\t\tChart.defaults[chartName] = extend(baseDefaults,extensions.defaults);\n\n\t\t\tChart.types[chartName] = ChartType;\n\n\t\t\t//Register this new chart type in the Chart prototype\n\t\t\tChart.prototype[chartName] = function(data,options){\n\t\t\t\tvar config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {});\n\t\t\t\treturn new ChartType(data,config,this);\n\t\t\t};\n\t\t} else{\n\t\t\twarn(\"Name not provided for this chart, so it hasn't been registered\");\n\t\t}\n\t\treturn parent;\n\t};\n\n\tChart.Element = function(configuration){\n\t\textend(this,configuration);\n\t\tthis.initialize.apply(this,arguments);\n\t\tthis.save();\n\t};\n\textend(Chart.Element.prototype,{\n\t\tinitialize : function(){},\n\t\trestore : function(props){\n\t\t\tif (!props){\n\t\t\t\textend(this,this._saved);\n\t\t\t} else {\n\t\t\t\teach(props,function(key){\n\t\t\t\t\tthis[key] = this._saved[key];\n\t\t\t\t},this);\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\t\tsave : function(){\n\t\t\tthis._saved = clone(this);\n\t\t\tdelete this._saved._saved;\n\t\t\treturn this;\n\t\t},\n\t\tupdate : function(newProps){\n\t\t\teach(newProps,function(value,key){\n\t\t\t\tthis._saved[key] = this[key];\n\t\t\t\tthis[key] = value;\n\t\t\t},this);\n\t\t\treturn this;\n\t\t},\n\t\ttransition : function(props,ease){\n\t\t\teach(props,function(value,key){\n\t\t\t\tthis[key] = ((value - this._saved[key]) * ease) + this._saved[key];\n\t\t\t},this);\n\t\t\treturn this;\n\t\t},\n\t\ttooltipPosition : function(){\n\t\t\treturn {\n\t\t\t\tx : this.x,\n\t\t\t\ty : this.y\n\t\t\t};\n\t\t},\n\t\thasValue: function(){\n\t\t\treturn isNumber(this.value);\n\t\t}\n\t});\n\n\tChart.Element.extend = inherits;\n\n\n\tChart.Point = Chart.Element.extend({\n\t\tdisplay: true,\n\t\tinRange: function(chartX,chartY){\n\t\t\tvar hitDetectionRange = this.hitDetectionRadius + this.radius;\n\t\t\treturn ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2));\n\t\t},\n\t\tdraw : function(){\n\t\t\tif (this.display){\n\t\t\t\tvar ctx = this.ctx;\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tctx.arc(this.x, this.y, this.radius, 0, Math.PI*2);\n\t\t\t\tctx.closePath();\n\n\t\t\t\tctx.strokeStyle = this.strokeColor;\n\t\t\t\tctx.lineWidth = this.strokeWidth;\n\n\t\t\t\tctx.fillStyle = this.fillColor;\n\n\t\t\t\tctx.fill();\n\t\t\t\tctx.stroke();\n\t\t\t}\n\n\n\t\t\t//Quick debug for bezier curve splining\n\t\t\t//Highlights control points and the line between them.\n\t\t\t//Handy for dev - stripped in the min version.\n\n\t\t\t// ctx.save();\n\t\t\t// ctx.fillStyle = \"black\";\n\t\t\t// ctx.strokeStyle = \"black\"\n\t\t\t// ctx.beginPath();\n\t\t\t// ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2);\n\t\t\t// ctx.fill();\n\n\t\t\t// ctx.beginPath();\n\t\t\t// ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2);\n\t\t\t// ctx.fill();\n\n\t\t\t// ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y);\n\t\t\t// ctx.lineTo(this.x, this.y);\n\t\t\t// ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y);\n\t\t\t// ctx.stroke();\n\n\t\t\t// ctx.restore();\n\n\n\n\t\t}\n\t});\n\n\tChart.Arc = Chart.Element.extend({\n\t\tinRange : function(chartX,chartY){\n\n\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(this, {\n\t\t\t\tx: chartX,\n\t\t\t\ty: chartY\n\t\t\t});\n\n\t\t\t//Check if within the range of the open/close angle\n\t\t\tvar betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle),\n\t\t\t\twithinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);\n\n\t\t\treturn (betweenAngles && withinRadius);\n\t\t\t//Ensure within the outside of the arc centre, but inside arc outer\n\t\t},\n\t\ttooltipPosition : function(){\n\t\t\tvar centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2),\n\t\t\t\trangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius;\n\t\t\treturn {\n\t\t\t\tx : this.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\t\ty : this.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t\t};\n\t\t},\n\t\tdraw : function(animationPercent){\n\n\t\t\tvar easingDecimal = animationPercent || 1;\n\n\t\t\tvar ctx = this.ctx;\n\n\t\t\tctx.beginPath();\n\n\t\t\tctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle);\n\n\t\t\tctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true);\n\n\t\t\tctx.closePath();\n\t\t\tctx.strokeStyle = this.strokeColor;\n\t\t\tctx.lineWidth = this.strokeWidth;\n\n\t\t\tctx.fillStyle = this.fillColor;\n\n\t\t\tctx.fill();\n\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\tif (this.showStroke){\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t}\n\t});\n\n\tChart.Rectangle = Chart.Element.extend({\n\t\tdraw : function(){\n\t\t\tvar ctx = this.ctx,\n\t\t\t\thalfWidth = this.width/2,\n\t\t\t\tleftX = this.x - halfWidth,\n\t\t\t\trightX = this.x + halfWidth,\n\t\t\t\ttop = this.base - (this.base - this.y),\n\t\t\t\thalfStroke = this.strokeWidth / 2;\n\n\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\tif (this.showStroke){\n\t\t\t\tleftX += halfStroke;\n\t\t\t\trightX -= halfStroke;\n\t\t\t\ttop += halfStroke;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\n\t\t\tctx.fillStyle = this.fillColor;\n\t\t\tctx.strokeStyle = this.strokeColor;\n\t\t\tctx.lineWidth = this.strokeWidth;\n\n\t\t\t// It'd be nice to keep this class totally generic to any rectangle\n\t\t\t// and simply specify which border to miss out.\n\t\t\tctx.moveTo(leftX, this.base);\n\t\t\tctx.lineTo(leftX, top);\n\t\t\tctx.lineTo(rightX, top);\n\t\t\tctx.lineTo(rightX, this.base);\n\t\t\tctx.fill();\n\t\t\tif (this.showStroke){\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\theight : function(){\n\t\t\treturn this.base - this.y;\n\t\t},\n\t\tinRange : function(chartX,chartY){\n\t\t\treturn (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base);\n\t\t}\n\t});\n\n\tChart.Tooltip = Chart.Element.extend({\n\t\tdraw : function(){\n\n\t\t\tvar ctx = this.chart.ctx;\n\n\t\t\tctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);\n\n\t\t\tthis.xAlign = \"center\";\n\t\t\tthis.yAlign = \"above\";\n\n\t\t\t//Distance between the actual element.y position and the start of the tooltip caret\n\t\t\tvar caretPadding = this.caretPadding = 2;\n\n\t\t\tvar tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding,\n\t\t\t\ttooltipRectHeight = this.fontSize + 2*this.yPadding,\n\t\t\t\ttooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding;\n\n\t\t\tif (this.x + tooltipWidth/2 >this.chart.width){\n\t\t\t\tthis.xAlign = \"left\";\n\t\t\t} else if (this.x - tooltipWidth/2 < 0){\n\t\t\t\tthis.xAlign = \"right\";\n\t\t\t}\n\n\t\t\tif (this.y - tooltipHeight < 0){\n\t\t\t\tthis.yAlign = \"below\";\n\t\t\t}\n\n\n\t\t\tvar tooltipX = this.x - tooltipWidth/2,\n\t\t\t\ttooltipY = this.y - tooltipHeight;\n\n\t\t\tctx.fillStyle = this.fillColor;\n\n\t\t\t// Custom Tooltips\n\t\t\tif(this.custom){\n\t\t\t\tthis.custom(this);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tswitch(this.yAlign)\n\t\t\t\t{\n\t\t\t\tcase \"above\":\n\t\t\t\t\t//Draw a caret above the x/y\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(this.x,this.y - caretPadding);\n\t\t\t\t\tctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight));\n\t\t\t\t\tctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight));\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"below\":\n\t\t\t\t\ttooltipY = this.y + caretPadding + this.caretHeight;\n\t\t\t\t\t//Draw a caret below the x/y\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(this.x, this.y + caretPadding);\n\t\t\t\t\tctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight);\n\t\t\t\t\tctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tswitch(this.xAlign)\n\t\t\t\t{\n\t\t\t\tcase \"left\":\n\t\t\t\t\ttooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"right\":\n\t\t\t\t\ttooltipX = this.x - (this.cornerRadius + this.caretHeight);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdrawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);\n\n\t\t\t\tctx.fill();\n\n\t\t\t\tctx.fillStyle = this.textColor;\n\t\t\t\tctx.textAlign = \"center\";\n\t\t\t\tctx.textBaseline = \"middle\";\n\t\t\t\tctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2);\n\t\t\t}\n\t\t}\n\t});\n\n\tChart.MultiTooltip = Chart.Element.extend({\n\t\tinitialize : function(){\n\t\t\tthis.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);\n\n\t\t\tthis.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);\n\n\t\t\tthis.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5;\n\n\t\t\tthis.ctx.font = this.titleFont;\n\n\t\t\tvar titleWidth = this.ctx.measureText(this.title).width,\n\t\t\t\t//Label has a legend square as well so account for this.\n\t\t\t\tlabelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3,\n\t\t\t\tlongestTextWidth = max([labelWidth,titleWidth]);\n\n\t\t\tthis.width = longestTextWidth + (this.xPadding*2);\n\n\n\t\t\tvar halfHeight = this.height/2;\n\n\t\t\t//Check to ensure the height will fit on the canvas\n\t\t\tif (this.y - halfHeight < 0 ){\n\t\t\t\tthis.y = halfHeight;\n\t\t\t} else if (this.y + halfHeight > this.chart.height){\n\t\t\t\tthis.y = this.chart.height - halfHeight;\n\t\t\t}\n\n\t\t\t//Decide whether to align left or right based on position on canvas\n\t\t\tif (this.x > this.chart.width/2){\n\t\t\t\tthis.x -= this.xOffset + this.width;\n\t\t\t} else {\n\t\t\t\tthis.x += this.xOffset;\n\t\t\t}\n\n\n\t\t},\n\t\tgetLineHeight : function(index){\n\t\t\tvar baseLineHeight = this.y - (this.height/2) + this.yPadding,\n\t\t\t\tafterTitleIndex = index-1;\n\n\t\t\t//If the index is zero, we're getting the title\n\t\t\tif (index === 0){\n\t\t\t\treturn baseLineHeight + this.titleFontSize/2;\n\t\t\t} else{\n\t\t\t\treturn baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5;\n\t\t\t}\n\n\t\t},\n\t\tdraw : function(){\n\t\t\t// Custom Tooltips\n\t\t\tif(this.custom){\n\t\t\t\tthis.custom(this);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tdrawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius);\n\t\t\t\tvar ctx = this.ctx;\n\t\t\t\tctx.fillStyle = this.fillColor;\n\t\t\t\tctx.fill();\n\t\t\t\tctx.closePath();\n\n\t\t\t\tctx.textAlign = \"left\";\n\t\t\t\tctx.textBaseline = \"middle\";\n\t\t\t\tctx.fillStyle = this.titleTextColor;\n\t\t\t\tctx.font = this.titleFont;\n\n\t\t\t\tctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));\n\n\t\t\t\tctx.font = this.font;\n\t\t\t\thelpers.each(this.labels,function(label,index){\n\t\t\t\t\tctx.fillStyle = this.textColor;\n\t\t\t\t\tctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1));\n\n\t\t\t\t\t//A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas)\n\t\t\t\t\t//ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);\n\t\t\t\t\t//Instead we'll make a white filled block to put the legendColour palette over.\n\n\t\t\t\t\tctx.fillStyle = this.legendColorBackground;\n\t\t\t\t\tctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);\n\n\t\t\t\t\tctx.fillStyle = this.legendColors[index].fill;\n\t\t\t\t\tctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);\n\n\n\t\t\t\t},this);\n\t\t\t}\n\t\t}\n\t});\n\n\tChart.Scale = Chart.Element.extend({\n\t\tinitialize : function(){\n\t\t\tthis.fit();\n\t\t},\n\t\tbuildYLabels : function(){\n\t\t\tthis.yLabels = [];\n\n\t\t\tvar stepDecimalPlaces = getDecimalPlaces(this.stepValue);\n\n\t\t\tfor (var i=0; i<=this.steps; i++){\n\t\t\t\tthis.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));\n\t\t\t}\n\t\t\tthis.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0;\n\t\t},\n\t\taddXLabel : function(label){\n\t\t\tthis.xLabels.push(label);\n\t\t\tthis.valuesCount++;\n\t\t\tthis.fit();\n\t\t},\n\t\tremoveXLabel : function(){\n\t\t\tthis.xLabels.shift();\n\t\t\tthis.valuesCount--;\n\t\t\tthis.fit();\n\t\t},\n\t\t// Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use\n\t\tfit: function(){\n\t\t\t// First we need the width of the yLabels, assuming the xLabels aren't rotated\n\n\t\t\t// To do that we need the base line at the top and base of the chart, assuming there is no x label rotation\n\t\t\tthis.startPoint = (this.display) ? this.fontSize : 0;\n\t\t\tthis.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels\n\n\t\t\t// Apply padding settings to the start and end point.\n\t\t\tthis.startPoint += this.padding;\n\t\t\tthis.endPoint -= this.padding;\n\n\t\t\t// Cache the starting height, so can determine if we need to recalculate the scale yAxis\n\t\t\tvar cachedHeight = this.endPoint - this.startPoint,\n\t\t\t\tcachedYLabelWidth;\n\n\t\t\t// Build the current yLabels so we have an idea of what size they'll be to start\n\t\t\t/*\n\t\t\t *\tThis sets what is returned from calculateScaleRange as static properties of this class:\n\t\t\t *\n\t\t\t\tthis.steps;\n\t\t\t\tthis.stepValue;\n\t\t\t\tthis.min;\n\t\t\t\tthis.max;\n\t\t\t *\n\t\t\t */\n\t\t\tthis.calculateYRange(cachedHeight);\n\n\t\t\t// With these properties set we can now build the array of yLabels\n\t\t\t// and also the width of the largest yLabel\n\t\t\tthis.buildYLabels();\n\n\t\t\tthis.calculateXLabelRotation();\n\n\t\t\twhile((cachedHeight > this.endPoint - this.startPoint)){\n\t\t\t\tcachedHeight = this.endPoint - this.startPoint;\n\t\t\t\tcachedYLabelWidth = this.yLabelWidth;\n\n\t\t\t\tthis.calculateYRange(cachedHeight);\n\t\t\t\tthis.buildYLabels();\n\n\t\t\t\t// Only go through the xLabel loop again if the yLabel width has changed\n\t\t\t\tif (cachedYLabelWidth < this.yLabelWidth){\n\t\t\t\t\tthis.calculateXLabelRotation();\n\t\t\t\t}\n\t\t\t}\n\n\t\t},\n\t\tcalculateXLabelRotation : function(){\n\t\t\t//Get the width of each grid by calculating the difference\n\t\t\t//between x offsets between 0 and 1.\n\n\t\t\tthis.ctx.font = this.font;\n\n\t\t\tvar firstWidth = this.ctx.measureText(this.xLabels[0]).width,\n\t\t\t\tlastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width,\n\t\t\t\tfirstRotated,\n\t\t\t\tlastRotated;\n\n\n\t\t\tthis.xScalePaddingRight = lastWidth/2 + 3;\n\t\t\tthis.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10;\n\n\t\t\tthis.xLabelRotation = 0;\n\t\t\tif (this.display){\n\t\t\t\tvar originalLabelWidth = longestText(this.ctx,this.font,this.xLabels),\n\t\t\t\t\tcosRotation,\n\t\t\t\t\tfirstRotatedWidth;\n\t\t\t\tthis.xLabelWidth = originalLabelWidth;\n\t\t\t\t//Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6;\n\n\t\t\t\t//Max label rotate should be 90 - also act as a loop counter\n\t\t\t\twhile ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){\n\t\t\t\t\tcosRotation = Math.cos(toRadians(this.xLabelRotation));\n\n\t\t\t\t\tfirstRotated = cosRotation * firstWidth;\n\t\t\t\t\tlastRotated = cosRotation * lastWidth;\n\n\t\t\t\t\t// We're right aligning the text now.\n\t\t\t\t\tif (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){\n\t\t\t\t\t\tthis.xScalePaddingLeft = firstRotated + this.fontSize / 2;\n\t\t\t\t\t}\n\t\t\t\t\tthis.xScalePaddingRight = this.fontSize/2;\n\n\n\t\t\t\t\tthis.xLabelRotation++;\n\t\t\t\t\tthis.xLabelWidth = cosRotation * originalLabelWidth;\n\n\t\t\t\t}\n\t\t\t\tif (this.xLabelRotation > 0){\n\t\t\t\t\tthis.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.xLabelWidth = 0;\n\t\t\t\tthis.xScalePaddingRight = this.padding;\n\t\t\t\tthis.xScalePaddingLeft = this.padding;\n\t\t\t}\n\n\t\t},\n\t\t// Needs to be overidden in each Chart type\n\t\t// Otherwise we need to pass all the data into the scale class\n\t\tcalculateYRange: noop,\n\t\tdrawingArea: function(){\n\t\t\treturn this.startPoint - this.endPoint;\n\t\t},\n\t\tcalculateY : function(value){\n\t\t\tvar scalingFactor = this.drawingArea() / (this.min - this.max);\n\t\t\treturn this.endPoint - (scalingFactor * (value - this.min));\n\t\t},\n\t\tcalculateX : function(index){\n\t\t\tvar isRotated = (this.xLabelRotation > 0),\n\t\t\t\t// innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding,\n\t\t\t\tinnerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),\n\t\t\t\tvalueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1),\n\t\t\t\tvalueOffset = (valueWidth * index) + this.xScalePaddingLeft;\n\n\t\t\tif (this.offsetGridLines){\n\t\t\t\tvalueOffset += (valueWidth/2);\n\t\t\t}\n\n\t\t\treturn Math.round(valueOffset);\n\t\t},\n\t\tupdate : function(newProps){\n\t\t\thelpers.extend(this, newProps);\n\t\t\tthis.fit();\n\t\t},\n\t\tdraw : function(){\n\t\t\tvar ctx = this.ctx,\n\t\t\t\tyLabelGap = (this.endPoint - this.startPoint) / this.steps,\n\t\t\t\txStart = Math.round(this.xScalePaddingLeft);\n\t\t\tif (this.display){\n\t\t\t\tctx.fillStyle = this.textColor;\n\t\t\t\tctx.font = this.font;\n\t\t\t\teach(this.yLabels,function(labelString,index){\n\t\t\t\t\tvar yLabelCenter = this.endPoint - (yLabelGap * index),\n\t\t\t\t\t\tlinePositionY = Math.round(yLabelCenter),\n\t\t\t\t\t\tdrawHorizontalLine = this.showHorizontalLines;\n\n\t\t\t\t\tctx.textAlign = \"right\";\n\t\t\t\t\tctx.textBaseline = \"middle\";\n\t\t\t\t\tif (this.showLabels){\n\t\t\t\t\t\tctx.fillText(labelString,xStart - 10,yLabelCenter);\n\t\t\t\t\t}\n\n\t\t\t\t\t// This is X axis, so draw it\n\t\t\t\t\tif (index === 0 && !drawHorizontalLine){\n\t\t\t\t\t\tdrawHorizontalLine = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (drawHorizontalLine){\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (index > 0){\n\t\t\t\t\t\t// This is a grid line in the centre, so drop that\n\t\t\t\t\t\tctx.lineWidth = this.gridLineWidth;\n\t\t\t\t\t\tctx.strokeStyle = this.gridLineColor;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is the first line on the scale\n\t\t\t\t\t\tctx.lineWidth = this.lineWidth;\n\t\t\t\t\t\tctx.strokeStyle = this.lineColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tlinePositionY += helpers.aliasPixel(ctx.lineWidth);\n\n\t\t\t\t\tif(drawHorizontalLine){\n\t\t\t\t\t\tctx.moveTo(xStart, linePositionY);\n\t\t\t\t\t\tctx.lineTo(this.width, linePositionY);\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.lineWidth = this.lineWidth;\n\t\t\t\t\tctx.strokeStyle = this.lineColor;\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(xStart - 5, linePositionY);\n\t\t\t\t\tctx.lineTo(xStart, linePositionY);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.closePath();\n\n\t\t\t\t},this);\n\n\t\t\t\teach(this.xLabels,function(label,index){\n\t\t\t\t\tvar xPos = this.calculateX(index) + aliasPixel(this.lineWidth),\n\t\t\t\t\t\t// Check to see if line/bar here and decide where to place the line\n\t\t\t\t\t\tlinePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth),\n\t\t\t\t\t\tisRotated = (this.xLabelRotation > 0),\n\t\t\t\t\t\tdrawVerticalLine = this.showVerticalLines;\n\n\t\t\t\t\t// This is Y axis, so draw it\n\t\t\t\t\tif (index === 0 && !drawVerticalLine){\n\t\t\t\t\t\tdrawVerticalLine = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (drawVerticalLine){\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (index > 0){\n\t\t\t\t\t\t// This is a grid line in the centre, so drop that\n\t\t\t\t\t\tctx.lineWidth = this.gridLineWidth;\n\t\t\t\t\t\tctx.strokeStyle = this.gridLineColor;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This is the first line on the scale\n\t\t\t\t\t\tctx.lineWidth = this.lineWidth;\n\t\t\t\t\t\tctx.strokeStyle = this.lineColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (drawVerticalLine){\n\t\t\t\t\t\tctx.moveTo(linePos,this.endPoint);\n\t\t\t\t\t\tctx.lineTo(linePos,this.startPoint - 3);\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t}\n\n\n\t\t\t\t\tctx.lineWidth = this.lineWidth;\n\t\t\t\t\tctx.strokeStyle = this.lineColor;\n\n\n\t\t\t\t\t// Small lines at the bottom of the base grid line\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(linePos,this.endPoint);\n\t\t\t\t\tctx.lineTo(linePos,this.endPoint + 5);\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.closePath();\n\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8);\n\t\t\t\t\tctx.rotate(toRadians(this.xLabelRotation)*-1);\n\t\t\t\t\tctx.font = this.font;\n\t\t\t\t\tctx.textAlign = (isRotated) ? \"right\" : \"center\";\n\t\t\t\t\tctx.textBaseline = (isRotated) ? \"middle\" : \"top\";\n\t\t\t\t\tctx.fillText(label, 0, 0);\n\t\t\t\t\tctx.restore();\n\t\t\t\t},this);\n\n\t\t\t}\n\t\t}\n\n\t});\n\n\tChart.RadialScale = Chart.Element.extend({\n\t\tinitialize: function(){\n\t\t\tthis.size = min([this.height, this.width]);\n\t\t\tthis.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);\n\t\t},\n\t\tcalculateCenterOffset: function(value){\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = this.drawingArea / (this.max - this.min);\n\n\t\t\treturn (value - this.min) * scalingFactor;\n\t\t},\n\t\tupdate : function(){\n\t\t\tif (!this.lineArc){\n\t\t\t\tthis.setScaleSize();\n\t\t\t} else {\n\t\t\t\tthis.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);\n\t\t\t}\n\t\t\tthis.buildYLabels();\n\t\t},\n\t\tbuildYLabels: function(){\n\t\t\tthis.yLabels = [];\n\n\t\t\tvar stepDecimalPlaces = getDecimalPlaces(this.stepValue);\n\n\t\t\tfor (var i=0; i<=this.steps; i++){\n\t\t\t\tthis.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));\n\t\t\t}\n\t\t},\n\t\tgetCircumference : function(){\n\t\t\treturn ((Math.PI*2) / this.valuesCount);\n\t\t},\n\t\tsetScaleSize: function(){\n\t\t\t/*\n\t\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t\t *\n\t\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t\t *\n\t\t\t * Solution:\n\t\t\t *\n\t\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t\t * at each index we check if the text overlaps.\n\t\t\t *\n\t\t\t * Where it does, we store that angle and that index.\n\t\t\t *\n\t\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t\t * from the shape radius to move the point inwards by that x.\n\t\t\t *\n\t\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t\t * along with labels.\n\t\t\t *\n\t\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t\t *\n\t\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t\t * and position it in the most space efficient manner\n\t\t\t *\n\t\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t\t */\n\n\n\t\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\t\tvar largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]),\n\t\t\t\tpointPosition,\n\t\t\t\ti,\n\t\t\t\ttextWidth,\n\t\t\t\thalfTextWidth,\n\t\t\t\tfurthestRight = this.width,\n\t\t\t\tfurthestRightIndex,\n\t\t\t\tfurthestRightAngle,\n\t\t\t\tfurthestLeft = 0,\n\t\t\t\tfurthestLeftIndex,\n\t\t\t\tfurthestLeftAngle,\n\t\t\t\txProtrusionLeft,\n\t\t\t\txProtrusionRight,\n\t\t\t\tradiusReductionRight,\n\t\t\t\tradiusReductionLeft,\n\t\t\t\tmaxWidthRadius;\n\t\t\tthis.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);\n\t\t\tfor (i=0;i furthestRight) {\n\t\t\t\t\t\tfurthestRight = pointPosition.x + halfTextWidth;\n\t\t\t\t\t\tfurthestRightIndex = i;\n\t\t\t\t\t}\n\t\t\t\t\tif (pointPosition.x - halfTextWidth < furthestLeft) {\n\t\t\t\t\t\tfurthestLeft = pointPosition.x - halfTextWidth;\n\t\t\t\t\t\tfurthestLeftIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (i < this.valuesCount/2) {\n\t\t\t\t\t// Less than half the values means we'll left align the text\n\t\t\t\t\tif (pointPosition.x + textWidth > furthestRight) {\n\t\t\t\t\t\tfurthestRight = pointPosition.x + textWidth;\n\t\t\t\t\t\tfurthestRightIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (i > this.valuesCount/2){\n\t\t\t\t\t// More than half the values means we'll right align the text\n\t\t\t\t\tif (pointPosition.x - textWidth < furthestLeft) {\n\t\t\t\t\t\tfurthestLeft = pointPosition.x - textWidth;\n\t\t\t\t\t\tfurthestLeftIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\txProtrusionLeft = furthestLeft;\n\n\t\t\txProtrusionRight = Math.ceil(furthestRight - this.width);\n\n\t\t\tfurthestRightAngle = this.getIndexAngle(furthestRightIndex);\n\n\t\t\tfurthestLeftAngle = this.getIndexAngle(furthestLeftIndex);\n\n\t\t\tradiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2);\n\n\t\t\tradiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2);\n\n\t\t\t// Ensure we actually need to reduce the size of the chart\n\t\t\tradiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0;\n\t\t\tradiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0;\n\n\t\t\tthis.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2;\n\n\t\t\t//this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2])\n\t\t\tthis.setCenterPoint(radiusReductionLeft, radiusReductionRight);\n\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement){\n\n\t\t\tvar maxRight = this.width - rightMovement - this.drawingArea,\n\t\t\t\tmaxLeft = leftMovement + this.drawingArea;\n\n\t\t\tthis.xCenter = (maxLeft + maxRight)/2;\n\t\t\t// Always vertically in the centre as the text height doesn't change\n\t\t\tthis.yCenter = (this.height/2);\n\t\t},\n\n\t\tgetIndexAngle : function(index){\n\t\t\tvar angleMultiplier = (Math.PI * 2) / this.valuesCount;\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\n\t\t\treturn index * angleMultiplier - (Math.PI/2);\n\t\t},\n\t\tgetPointPosition : function(index, distanceFromCenter){\n\t\t\tvar thisAngle = this.getIndexAngle(index);\n\t\t\treturn {\n\t\t\t\tx : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,\n\t\t\t\ty : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter\n\t\t\t};\n\t\t},\n\t\tdraw: function(){\n\t\t\tif (this.display){\n\t\t\t\tvar ctx = this.ctx;\n\t\t\t\teach(this.yLabels, function(label, index){\n\t\t\t\t\t// Don't draw a centre value\n\t\t\t\t\tif (index > 0){\n\t\t\t\t\t\tvar yCenterOffset = index * (this.drawingArea/this.steps),\n\t\t\t\t\t\t\tyHeight = this.yCenter - yCenterOffset,\n\t\t\t\t\t\t\tpointPosition;\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (this.lineWidth > 0){\n\t\t\t\t\t\t\tctx.strokeStyle = this.lineColor;\n\t\t\t\t\t\t\tctx.lineWidth = this.lineWidth;\n\n\t\t\t\t\t\t\tif(this.lineArc){\n\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\tctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2);\n\t\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\t} else{\n\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\tfor (var i=0;i= 0; i--) {\n\t\t\t\t\t\tif (this.angleLineWidth > 0){\n\t\t\t\t\t\t\tvar outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max));\n\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\tctx.moveTo(this.xCenter, this.yCenter);\n\t\t\t\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\t\t\tvar pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5);\n\t\t\t\t\t\tctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);\n\t\t\t\t\t\tctx.fillStyle = this.pointLabelFontColor;\n\n\t\t\t\t\t\tvar labelsCount = this.labels.length,\n\t\t\t\t\t\t\thalfLabelsCount = this.labels.length/2,\n\t\t\t\t\t\t\tquarterLabelsCount = halfLabelsCount/2,\n\t\t\t\t\t\t\tupperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),\n\t\t\t\t\t\t\texactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);\n\t\t\t\t\t\tif (i === 0){\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t} else if(i === halfLabelsCount){\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t} else if (i < halfLabelsCount){\n\t\t\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.textAlign = 'right';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Set the correct text baseline based on outer positioning\n\t\t\t\t\t\tif (exactQuarter){\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t} else if (upperHalf){\n\t\t\t\t\t\t\tctx.textBaseline = 'bottom';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Attach global event to resize each chart instance when the browser resizes\n\thelpers.addEvent(window, \"resize\", (function(){\n\t\t// Basic debounce of resize function so it doesn't hurt performance when resizing browser.\n\t\tvar timeout;\n\t\treturn function(){\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(function(){\n\t\t\t\teach(Chart.instances,function(instance){\n\t\t\t\t\t// If the responsive flag is set in the chart instance config\n\t\t\t\t\t// Cascade the resize event down to the chart.\n\t\t\t\t\tif (instance.options.responsive){\n\t\t\t\t\t\tinstance.resize(instance.render, true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 50);\n\t\t};\n\t})());\n\n\n\tif (amd) {\n\t\tdefine(function(){\n\t\t\treturn Chart;\n\t\t});\n\t} else if (typeof module === 'object' && module.exports) {\n\t\tmodule.exports = Chart;\n\t}\n\n\troot.Chart = Chart;\n\n\tChart.noConflict = function(){\n\t\troot.Chart = previous;\n\t\treturn Chart;\n\t};\n\n}).call(this);\n\n(function(){\n\t\"use strict\";\n\n\tvar root = this,\n\t\tChart = root.Chart,\n\t\thelpers = Chart.helpers;\n\n\n\tvar defaultConfig = {\n\t\t//Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value\n\t\tscaleBeginAtZero : true,\n\n\t\t//Boolean - Whether grid lines are shown across the chart\n\t\tscaleShowGridLines : true,\n\n\t\t//String - Colour of the grid lines\n\t\tscaleGridLineColor : \"rgba(0,0,0,.05)\",\n\n\t\t//Number - Width of the grid lines\n\t\tscaleGridLineWidth : 1,\n\n\t\t//Boolean - Whether to show horizontal lines (except X axis)\n\t\tscaleShowHorizontalLines: true,\n\n\t\t//Boolean - Whether to show vertical lines (except Y axis)\n\t\tscaleShowVerticalLines: true,\n\n\t\t//Boolean - If there is a stroke on each bar\n\t\tbarShowStroke : true,\n\n\t\t//Number - Pixel width of the bar stroke\n\t\tbarStrokeWidth : 2,\n\n\t\t//Number - Spacing between each of the X value sets\n\t\tbarValueSpacing : 5,\n\n\t\t//Number - Spacing between data sets within X values\n\t\tbarDatasetSpacing : 1,\n\n\t\t//String - A legend template\n\t\tlegendTemplate : \"
    -legend\\\"><% for (var i=0; i
  • \\\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
\"\n\n\t};\n\n\n\tChart.Type.extend({\n\t\tname: \"Bar\",\n\t\tdefaults : defaultConfig,\n\t\tinitialize: function(data){\n\n\t\t\t//Expose options as a scope variable here so we can access it in the ScaleClass\n\t\t\tvar options = this.options;\n\n\t\t\tthis.ScaleClass = Chart.Scale.extend({\n\t\t\t\toffsetGridLines : true,\n\t\t\t\tcalculateBarX : function(datasetCount, datasetIndex, barIndex){\n\t\t\t\t\t//Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar\n\t\t\t\t\tvar xWidth = this.calculateBaseWidth(),\n\t\t\t\t\t\txAbsolute = this.calculateX(barIndex) - (xWidth/2),\n\t\t\t\t\t\tbarWidth = this.calculateBarWidth(datasetCount);\n\n\t\t\t\t\treturn xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2;\n\t\t\t\t},\n\t\t\t\tcalculateBaseWidth : function(){\n\t\t\t\t\treturn (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing);\n\t\t\t\t},\n\t\t\t\tcalculateBarWidth : function(datasetCount){\n\t\t\t\t\t//The padding between datasets is to the right of each bar, providing that there are more than 1 dataset\n\t\t\t\t\tvar baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing);\n\n\t\t\t\t\treturn (baseWidth / datasetCount);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.datasets = [];\n\n\t\t\t//Set up tooltip events on the chart\n\t\t\tif (this.options.showTooltips){\n\t\t\t\thelpers.bindEvents(this, this.options.tooltipEvents, function(evt){\n\t\t\t\t\tvar activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : [];\n\n\t\t\t\t\tthis.eachBars(function(bar){\n\t\t\t\t\t\tbar.restore(['fillColor', 'strokeColor']);\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(activeBars, function(activeBar){\n\t\t\t\t\t\tactiveBar.fillColor = activeBar.highlightFill;\n\t\t\t\t\t\tactiveBar.strokeColor = activeBar.highlightStroke;\n\t\t\t\t\t});\n\t\t\t\t\tthis.showTooltip(activeBars);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//Declare the extension of the default point, to cater for the options passed in to the constructor\n\t\t\tthis.BarClass = Chart.Rectangle.extend({\n\t\t\t\tstrokeWidth : this.options.barStrokeWidth,\n\t\t\t\tshowStroke : this.options.barShowStroke,\n\t\t\t\tctx : this.chart.ctx\n\t\t\t});\n\n\t\t\t//Iterate through each of the datasets, and build this into a property of the chart\n\t\t\thelpers.each(data.datasets,function(dataset,datasetIndex){\n\n\t\t\t\tvar datasetObject = {\n\t\t\t\t\tlabel : dataset.label || null,\n\t\t\t\t\tfillColor : dataset.fillColor,\n\t\t\t\t\tstrokeColor : dataset.strokeColor,\n\t\t\t\t\tbars : []\n\t\t\t\t};\n\n\t\t\t\tthis.datasets.push(datasetObject);\n\n\t\t\t\thelpers.each(dataset.data,function(dataPoint,index){\n\t\t\t\t\t//Add a new point for each piece of data, passing any required data to draw.\n\t\t\t\t\tdatasetObject.bars.push(new this.BarClass({\n\t\t\t\t\t\tvalue : dataPoint,\n\t\t\t\t\t\tlabel : data.labels[index],\n\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\tstrokeColor : dataset.strokeColor,\n\t\t\t\t\t\tfillColor : dataset.fillColor,\n\t\t\t\t\t\thighlightFill : dataset.highlightFill || dataset.fillColor,\n\t\t\t\t\t\thighlightStroke : dataset.highlightStroke || dataset.strokeColor\n\t\t\t\t\t}));\n\t\t\t\t},this);\n\n\t\t\t},this);\n\n\t\t\tthis.buildScale(data.labels);\n\n\t\t\tthis.BarClass.prototype.base = this.scale.endPoint;\n\n\t\t\tthis.eachBars(function(bar, index, datasetIndex){\n\t\t\t\thelpers.extend(bar, {\n\t\t\t\t\twidth : this.scale.calculateBarWidth(this.datasets.length),\n\t\t\t\t\tx: this.scale.calculateBarX(this.datasets.length, datasetIndex, index),\n\t\t\t\t\ty: this.scale.endPoint\n\t\t\t\t});\n\t\t\t\tbar.save();\n\t\t\t}, this);\n\n\t\t\tthis.render();\n\t\t},\n\t\tupdate : function(){\n\t\t\tthis.scale.update();\n\t\t\t// Reset any highlight colours before updating.\n\t\t\thelpers.each(this.activeElements, function(activeElement){\n\t\t\t\tactiveElement.restore(['fillColor', 'strokeColor']);\n\t\t\t});\n\n\t\t\tthis.eachBars(function(bar){\n\t\t\t\tbar.save();\n\t\t\t});\n\t\t\tthis.render();\n\t\t},\n\t\teachBars : function(callback){\n\t\t\thelpers.each(this.datasets,function(dataset, datasetIndex){\n\t\t\t\thelpers.each(dataset.bars, callback, this, datasetIndex);\n\t\t\t},this);\n\t\t},\n\t\tgetBarsAtEvent : function(e){\n\t\t\tvar barsArray = [],\n\t\t\t\teventPosition = helpers.getRelativePosition(e),\n\t\t\t\tdatasetIterator = function(dataset){\n\t\t\t\t\tbarsArray.push(dataset.bars[barIndex]);\n\t\t\t\t},\n\t\t\t\tbarIndex;\n\n\t\t\tfor (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) {\n\t\t\t\tfor (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) {\n\t\t\t\t\tif (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){\n\t\t\t\t\t\thelpers.each(this.datasets, datasetIterator);\n\t\t\t\t\t\treturn barsArray;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn barsArray;\n\t\t},\n\t\tbuildScale : function(labels){\n\t\t\tvar self = this;\n\n\t\t\tvar dataTotal = function(){\n\t\t\t\tvar values = [];\n\t\t\t\tself.eachBars(function(bar){\n\t\t\t\t\tvalues.push(bar.value);\n\t\t\t\t});\n\t\t\t\treturn values;\n\t\t\t};\n\n\t\t\tvar scaleOptions = {\n\t\t\t\ttemplateString : this.options.scaleLabel,\n\t\t\t\theight : this.chart.height,\n\t\t\t\twidth : this.chart.width,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\ttextColor : this.options.scaleFontColor,\n\t\t\t\tfontSize : this.options.scaleFontSize,\n\t\t\t\tfontStyle : this.options.scaleFontStyle,\n\t\t\t\tfontFamily : this.options.scaleFontFamily,\n\t\t\t\tvaluesCount : labels.length,\n\t\t\t\tbeginAtZero : this.options.scaleBeginAtZero,\n\t\t\t\tintegersOnly : this.options.scaleIntegersOnly,\n\t\t\t\tcalculateYRange: function(currentHeight){\n\t\t\t\t\tvar updatedRanges = helpers.calculateScaleRange(\n\t\t\t\t\t\tdataTotal(),\n\t\t\t\t\t\tcurrentHeight,\n\t\t\t\t\t\tthis.fontSize,\n\t\t\t\t\t\tthis.beginAtZero,\n\t\t\t\t\t\tthis.integersOnly\n\t\t\t\t\t);\n\t\t\t\t\thelpers.extend(this, updatedRanges);\n\t\t\t\t},\n\t\t\t\txLabels : labels,\n\t\t\t\tfont : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),\n\t\t\t\tlineWidth : this.options.scaleLineWidth,\n\t\t\t\tlineColor : this.options.scaleLineColor,\n\t\t\t\tshowHorizontalLines : this.options.scaleShowHorizontalLines,\n\t\t\t\tshowVerticalLines : this.options.scaleShowVerticalLines,\n\t\t\t\tgridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,\n\t\t\t\tgridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : \"rgba(0,0,0,0)\",\n\t\t\t\tpadding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0,\n\t\t\t\tshowLabels : this.options.scaleShowLabels,\n\t\t\t\tdisplay : this.options.showScale\n\t\t\t};\n\n\t\t\tif (this.options.scaleOverride){\n\t\t\t\thelpers.extend(scaleOptions, {\n\t\t\t\t\tcalculateYRange: helpers.noop,\n\t\t\t\t\tsteps: this.options.scaleSteps,\n\t\t\t\t\tstepValue: this.options.scaleStepWidth,\n\t\t\t\t\tmin: this.options.scaleStartValue,\n\t\t\t\t\tmax: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.scale = new this.ScaleClass(scaleOptions);\n\t\t},\n\t\taddData : function(valuesArray,label){\n\t\t\t//Map the values array for each of the datasets\n\t\t\thelpers.each(valuesArray,function(value,datasetIndex){\n\t\t\t\t//Add a new point for each piece of data, passing any required data to draw.\n\t\t\t\tthis.datasets[datasetIndex].bars.push(new this.BarClass({\n\t\t\t\t\tvalue : value,\n\t\t\t\t\tlabel : label,\n\t\t\t\t\tx: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),\n\t\t\t\t\ty: this.scale.endPoint,\n\t\t\t\t\twidth : this.scale.calculateBarWidth(this.datasets.length),\n\t\t\t\t\tbase : this.scale.endPoint,\n\t\t\t\t\tstrokeColor : this.datasets[datasetIndex].strokeColor,\n\t\t\t\t\tfillColor : this.datasets[datasetIndex].fillColor\n\t\t\t\t}));\n\t\t\t},this);\n\n\t\t\tthis.scale.addXLabel(label);\n\t\t\t//Then re-render the chart.\n\t\t\tthis.update();\n\t\t},\n\t\tremoveData : function(){\n\t\t\tthis.scale.removeXLabel();\n\t\t\t//Then re-render the chart.\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\tdataset.bars.shift();\n\t\t\t},this);\n\t\t\tthis.update();\n\t\t},\n\t\treflow : function(){\n\t\t\thelpers.extend(this.BarClass.prototype,{\n\t\t\t\ty: this.scale.endPoint,\n\t\t\t\tbase : this.scale.endPoint\n\t\t\t});\n\t\t\tvar newScaleProps = helpers.extend({\n\t\t\t\theight : this.chart.height,\n\t\t\t\twidth : this.chart.width\n\t\t\t});\n\t\t\tthis.scale.update(newScaleProps);\n\t\t},\n\t\tdraw : function(ease){\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tthis.clear();\n\n\t\t\tvar ctx = this.chart.ctx;\n\n\t\t\tthis.scale.draw(easingDecimal);\n\n\t\t\t//Draw all the bars for each dataset\n\t\t\thelpers.each(this.datasets,function(dataset,datasetIndex){\n\t\t\t\thelpers.each(dataset.bars,function(bar,index){\n\t\t\t\t\tif (bar.hasValue()){\n\t\t\t\t\t\tbar.base = this.scale.endPoint;\n\t\t\t\t\t\t//Transition then draw\n\t\t\t\t\t\tbar.transition({\n\t\t\t\t\t\t\tx : this.scale.calculateBarX(this.datasets.length, datasetIndex, index),\n\t\t\t\t\t\t\ty : this.scale.calculateY(bar.value),\n\t\t\t\t\t\t\twidth : this.scale.calculateBarWidth(this.datasets.length)\n\t\t\t\t\t\t}, easingDecimal).draw();\n\t\t\t\t\t}\n\t\t\t\t},this);\n\n\t\t\t},this);\n\t\t}\n\t});\n\n\n}).call(this);\n\n(function(){\n\t\"use strict\";\n\n\tvar root = this,\n\t\tChart = root.Chart,\n\t\t//Cache a local reference to Chart.helpers\n\t\thelpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\t//Boolean - Whether we should show a stroke on each segment\n\t\tsegmentShowStroke : true,\n\n\t\t//String - The colour of each segment stroke\n\t\tsegmentStrokeColor : \"#fff\",\n\n\t\t//Number - The width of each segment stroke\n\t\tsegmentStrokeWidth : 2,\n\n\t\t//The percentage of the chart that we cut out of the middle.\n\t\tpercentageInnerCutout : 50,\n\n\t\t//Number - Amount of animation steps\n\t\tanimationSteps : 100,\n\n\t\t//String - Animation easing effect\n\t\tanimationEasing : \"easeOutBounce\",\n\n\t\t//Boolean - Whether we animate the rotation of the Doughnut\n\t\tanimateRotate : true,\n\n\t\t//Boolean - Whether we animate scaling the Doughnut from the centre\n\t\tanimateScale : false,\n\n\t\t//String - A legend template\n\t\tlegendTemplate : \"
    -legend\\\"><% for (var i=0; i
  • \\\"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
\"\n\n\t};\n\n\n\tChart.Type.extend({\n\t\t//Passing in a name registers this chart in the Chart namespace\n\t\tname: \"Doughnut\",\n\t\t//Providing a defaults will also register the deafults in the chart namespace\n\t\tdefaults : defaultConfig,\n\t\t//Initialize is fired when the chart is initialized - Data is passed in as a parameter\n\t\t//Config is automatically merged by the core of Chart.js, and is available at this.options\n\t\tinitialize: function(data){\n\n\t\t\t//Declare segments as a static property to prevent inheriting across the Chart type prototype\n\t\t\tthis.segments = [];\n\t\t\tthis.outerRadius = (helpers.min([this.chart.width,this.chart.height]) -\tthis.options.segmentStrokeWidth/2)/2;\n\n\t\t\tthis.SegmentArc = Chart.Arc.extend({\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\tx : this.chart.width/2,\n\t\t\t\ty : this.chart.height/2\n\t\t\t});\n\n\t\t\t//Set up tooltip events on the chart\n\t\t\tif (this.options.showTooltips){\n\t\t\t\thelpers.bindEvents(this, this.options.tooltipEvents, function(evt){\n\t\t\t\t\tvar activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];\n\n\t\t\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\t\t\tsegment.restore([\"fillColor\"]);\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(activeSegments,function(activeSegment){\n\t\t\t\t\t\tactiveSegment.fillColor = activeSegment.highlightColor;\n\t\t\t\t\t});\n\t\t\t\t\tthis.showTooltip(activeSegments);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.calculateTotal(data);\n\n\t\t\thelpers.each(data,function(datapoint, index){\n\t\t\t\tthis.addData(datapoint, index, true);\n\t\t\t},this);\n\n\t\t\tthis.render();\n\t\t},\n\t\tgetSegmentsAtEvent : function(e){\n\t\t\tvar segmentsArray = [];\n\n\t\t\tvar location = helpers.getRelativePosition(e);\n\n\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\tif (segment.inRange(location.x,location.y)) segmentsArray.push(segment);\n\t\t\t},this);\n\t\t\treturn segmentsArray;\n\t\t},\n\t\taddData : function(segment, atIndex, silent){\n\t\t\tvar index = atIndex || this.segments.length;\n\t\t\tthis.segments.splice(index, 0, new this.SegmentArc({\n\t\t\t\tvalue : segment.value,\n\t\t\t\touterRadius : (this.options.animateScale) ? 0 : this.outerRadius,\n\t\t\t\tinnerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout,\n\t\t\t\tfillColor : segment.color,\n\t\t\t\thighlightColor : segment.highlight || segment.color,\n\t\t\t\tshowStroke : this.options.segmentShowStroke,\n\t\t\t\tstrokeWidth : this.options.segmentStrokeWidth,\n\t\t\t\tstrokeColor : this.options.segmentStrokeColor,\n\t\t\t\tstartAngle : Math.PI * 1.5,\n\t\t\t\tcircumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value),\n\t\t\t\tlabel : segment.label\n\t\t\t}));\n\t\t\tif (!silent){\n\t\t\t\tthis.reflow();\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t},\n\t\tcalculateCircumference : function(value){\n\t\t\treturn (Math.PI*2)*(Math.abs(value) / this.total);\n\t\t},\n\t\tcalculateTotal : function(data){\n\t\t\tthis.total = 0;\n\t\t\thelpers.each(data,function(segment){\n\t\t\t\tthis.total += Math.abs(segment.value);\n\t\t\t},this);\n\t\t},\n\t\tupdate : function(){\n\t\t\tthis.calculateTotal(this.segments);\n\n\t\t\t// Reset any highlight colours before updating.\n\t\t\thelpers.each(this.activeElements, function(activeElement){\n\t\t\t\tactiveElement.restore(['fillColor']);\n\t\t\t});\n\n\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\tsegment.save();\n\t\t\t});\n\t\t\tthis.render();\n\t\t},\n\n\t\tremoveData: function(atIndex){\n\t\t\tvar indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;\n\t\t\tthis.segments.splice(indexToDelete, 1);\n\t\t\tthis.reflow();\n\t\t\tthis.update();\n\t\t},\n\n\t\treflow : function(){\n\t\t\thelpers.extend(this.SegmentArc.prototype,{\n\t\t\t\tx : this.chart.width/2,\n\t\t\t\ty : this.chart.height/2\n\t\t\t});\n\t\t\tthis.outerRadius = (helpers.min([this.chart.width,this.chart.height]) -\tthis.options.segmentStrokeWidth/2)/2;\n\t\t\thelpers.each(this.segments, function(segment){\n\t\t\t\tsegment.update({\n\t\t\t\t\touterRadius : this.outerRadius,\n\t\t\t\t\tinnerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout\n\t\t\t\t});\n\t\t\t}, this);\n\t\t},\n\t\tdraw : function(easeDecimal){\n\t\t\tvar animDecimal = (easeDecimal) ? easeDecimal : 1;\n\t\t\tthis.clear();\n\t\t\thelpers.each(this.segments,function(segment,index){\n\t\t\t\tsegment.transition({\n\t\t\t\t\tcircumference : this.calculateCircumference(segment.value),\n\t\t\t\t\touterRadius : this.outerRadius,\n\t\t\t\t\tinnerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout\n\t\t\t\t},animDecimal);\n\n\t\t\t\tsegment.endAngle = segment.startAngle + segment.circumference;\n\n\t\t\t\tsegment.draw();\n\t\t\t\tif (index === 0){\n\t\t\t\t\tsegment.startAngle = Math.PI * 1.5;\n\t\t\t\t}\n\t\t\t\t//Check to see if it's the last segment, if not get the next and update the start angle\n\t\t\t\tif (index < this.segments.length-1){\n\t\t\t\t\tthis.segments[index+1].startAngle = segment.endAngle;\n\t\t\t\t}\n\t\t\t},this);\n\n\t\t}\n\t});\n\n\tChart.types.Doughnut.extend({\n\t\tname : \"Pie\",\n\t\tdefaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0})\n\t});\n\n}).call(this);\n(function(){\n\t\"use strict\";\n\n\tvar root = this,\n\t\tChart = root.Chart,\n\t\thelpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\n\t\t///Boolean - Whether grid lines are shown across the chart\n\t\tscaleShowGridLines : true,\n\n\t\t//String - Colour of the grid lines\n\t\tscaleGridLineColor : \"rgba(0,0,0,.05)\",\n\n\t\t//Number - Width of the grid lines\n\t\tscaleGridLineWidth : 1,\n\n\t\t//Boolean - Whether to show horizontal lines (except X axis)\n\t\tscaleShowHorizontalLines: true,\n\n\t\t//Boolean - Whether to show vertical lines (except Y axis)\n\t\tscaleShowVerticalLines: true,\n\n\t\t//Boolean - Whether the line is curved between points\n\t\tbezierCurve : true,\n\n\t\t//Number - Tension of the bezier curve between points\n\t\tbezierCurveTension : 0.4,\n\n\t\t//Boolean - Whether to show a dot for each point\n\t\tpointDot : true,\n\n\t\t//Number - Radius of each point dot in pixels\n\t\tpointDotRadius : 4,\n\n\t\t//Number - Pixel width of point dot stroke\n\t\tpointDotStrokeWidth : 1,\n\n\t\t//Number - amount extra to add to the radius to cater for hit detection outside the drawn point\n\t\tpointHitDetectionRadius : 20,\n\n\t\t//Boolean - Whether to show a stroke for datasets\n\t\tdatasetStroke : true,\n\n\t\t//Number - Pixel width of dataset stroke\n\t\tdatasetStrokeWidth : 2,\n\n\t\t//Boolean - Whether to fill the dataset with a colour\n\t\tdatasetFill : true,\n\n\t\t//String - A legend template\n\t\tlegendTemplate : \"
    -legend\\\"><% for (var i=0; i
  • \\\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
\"\n\n\t};\n\n\n\tChart.Type.extend({\n\t\tname: \"Line\",\n\t\tdefaults : defaultConfig,\n\t\tinitialize: function(data){\n\t\t\t//Declare the extension of the default point, to cater for the options passed in to the constructor\n\t\t\tthis.PointClass = Chart.Point.extend({\n\t\t\t\tstrokeWidth : this.options.pointDotStrokeWidth,\n\t\t\t\tradius : this.options.pointDotRadius,\n\t\t\t\tdisplay: this.options.pointDot,\n\t\t\t\thitDetectionRadius : this.options.pointHitDetectionRadius,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\tinRange : function(mouseX){\n\t\t\t\t\treturn (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.datasets = [];\n\n\t\t\t//Set up tooltip events on the chart\n\t\t\tif (this.options.showTooltips){\n\t\t\t\thelpers.bindEvents(this, this.options.tooltipEvents, function(evt){\n\t\t\t\t\tvar activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];\n\t\t\t\t\tthis.eachPoints(function(point){\n\t\t\t\t\t\tpoint.restore(['fillColor', 'strokeColor']);\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(activePoints, function(activePoint){\n\t\t\t\t\t\tactivePoint.fillColor = activePoint.highlightFill;\n\t\t\t\t\t\tactivePoint.strokeColor = activePoint.highlightStroke;\n\t\t\t\t\t});\n\t\t\t\t\tthis.showTooltip(activePoints);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//Iterate through each of the datasets, and build this into a property of the chart\n\t\t\thelpers.each(data.datasets,function(dataset){\n\n\t\t\t\tvar datasetObject = {\n\t\t\t\t\tlabel : dataset.label || null,\n\t\t\t\t\tfillColor : dataset.fillColor,\n\t\t\t\t\tstrokeColor : dataset.strokeColor,\n\t\t\t\t\tpointColor : dataset.pointColor,\n\t\t\t\t\tpointStrokeColor : dataset.pointStrokeColor,\n\t\t\t\t\tpoints : []\n\t\t\t\t};\n\n\t\t\t\tthis.datasets.push(datasetObject);\n\n\n\t\t\t\thelpers.each(dataset.data,function(dataPoint,index){\n\t\t\t\t\t//Add a new point for each piece of data, passing any required data to draw.\n\t\t\t\t\tdatasetObject.points.push(new this.PointClass({\n\t\t\t\t\t\tvalue : dataPoint,\n\t\t\t\t\t\tlabel : data.labels[index],\n\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\tstrokeColor : dataset.pointStrokeColor,\n\t\t\t\t\t\tfillColor : dataset.pointColor,\n\t\t\t\t\t\thighlightFill : dataset.pointHighlightFill || dataset.pointColor,\n\t\t\t\t\t\thighlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor\n\t\t\t\t\t}));\n\t\t\t\t},this);\n\n\t\t\t\tthis.buildScale(data.labels);\n\n\n\t\t\t\tthis.eachPoints(function(point, index){\n\t\t\t\t\thelpers.extend(point, {\n\t\t\t\t\t\tx: this.scale.calculateX(index),\n\t\t\t\t\t\ty: this.scale.endPoint\n\t\t\t\t\t});\n\t\t\t\t\tpoint.save();\n\t\t\t\t}, this);\n\n\t\t\t},this);\n\n\n\t\t\tthis.render();\n\t\t},\n\t\tupdate : function(){\n\t\t\tthis.scale.update();\n\t\t\t// Reset any highlight colours before updating.\n\t\t\thelpers.each(this.activeElements, function(activeElement){\n\t\t\t\tactiveElement.restore(['fillColor', 'strokeColor']);\n\t\t\t});\n\t\t\tthis.eachPoints(function(point){\n\t\t\t\tpoint.save();\n\t\t\t});\n\t\t\tthis.render();\n\t\t},\n\t\teachPoints : function(callback){\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\thelpers.each(dataset.points,callback,this);\n\t\t\t},this);\n\t\t},\n\t\tgetPointsAtEvent : function(e){\n\t\t\tvar pointsArray = [],\n\t\t\t\teventPosition = helpers.getRelativePosition(e);\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\thelpers.each(dataset.points,function(point){\n\t\t\t\t\tif (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point);\n\t\t\t\t});\n\t\t\t},this);\n\t\t\treturn pointsArray;\n\t\t},\n\t\tbuildScale : function(labels){\n\t\t\tvar self = this;\n\n\t\t\tvar dataTotal = function(){\n\t\t\t\tvar values = [];\n\t\t\t\tself.eachPoints(function(point){\n\t\t\t\t\tvalues.push(point.value);\n\t\t\t\t});\n\n\t\t\t\treturn values;\n\t\t\t};\n\n\t\t\tvar scaleOptions = {\n\t\t\t\ttemplateString : this.options.scaleLabel,\n\t\t\t\theight : this.chart.height,\n\t\t\t\twidth : this.chart.width,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\ttextColor : this.options.scaleFontColor,\n\t\t\t\tfontSize : this.options.scaleFontSize,\n\t\t\t\tfontStyle : this.options.scaleFontStyle,\n\t\t\t\tfontFamily : this.options.scaleFontFamily,\n\t\t\t\tvaluesCount : labels.length,\n\t\t\t\tbeginAtZero : this.options.scaleBeginAtZero,\n\t\t\t\tintegersOnly : this.options.scaleIntegersOnly,\n\t\t\t\tcalculateYRange : function(currentHeight){\n\t\t\t\t\tvar updatedRanges = helpers.calculateScaleRange(\n\t\t\t\t\t\tdataTotal(),\n\t\t\t\t\t\tcurrentHeight,\n\t\t\t\t\t\tthis.fontSize,\n\t\t\t\t\t\tthis.beginAtZero,\n\t\t\t\t\t\tthis.integersOnly\n\t\t\t\t\t);\n\t\t\t\t\thelpers.extend(this, updatedRanges);\n\t\t\t\t},\n\t\t\t\txLabels : labels,\n\t\t\t\tfont : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),\n\t\t\t\tlineWidth : this.options.scaleLineWidth,\n\t\t\t\tlineColor : this.options.scaleLineColor,\n\t\t\t\tshowHorizontalLines : this.options.scaleShowHorizontalLines,\n\t\t\t\tshowVerticalLines : this.options.scaleShowVerticalLines,\n\t\t\t\tgridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,\n\t\t\t\tgridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : \"rgba(0,0,0,0)\",\n\t\t\t\tpadding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth,\n\t\t\t\tshowLabels : this.options.scaleShowLabels,\n\t\t\t\tdisplay : this.options.showScale\n\t\t\t};\n\n\t\t\tif (this.options.scaleOverride){\n\t\t\t\thelpers.extend(scaleOptions, {\n\t\t\t\t\tcalculateYRange: helpers.noop,\n\t\t\t\t\tsteps: this.options.scaleSteps,\n\t\t\t\t\tstepValue: this.options.scaleStepWidth,\n\t\t\t\t\tmin: this.options.scaleStartValue,\n\t\t\t\t\tmax: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)\n\t\t\t\t});\n\t\t\t}\n\n\n\t\t\tthis.scale = new Chart.Scale(scaleOptions);\n\t\t},\n\t\taddData : function(valuesArray,label){\n\t\t\t//Map the values array for each of the datasets\n\n\t\t\thelpers.each(valuesArray,function(value,datasetIndex){\n\t\t\t\t//Add a new point for each piece of data, passing any required data to draw.\n\t\t\t\tthis.datasets[datasetIndex].points.push(new this.PointClass({\n\t\t\t\t\tvalue : value,\n\t\t\t\t\tlabel : label,\n\t\t\t\t\tx: this.scale.calculateX(this.scale.valuesCount+1),\n\t\t\t\t\ty: this.scale.endPoint,\n\t\t\t\t\tstrokeColor : this.datasets[datasetIndex].pointStrokeColor,\n\t\t\t\t\tfillColor : this.datasets[datasetIndex].pointColor\n\t\t\t\t}));\n\t\t\t},this);\n\n\t\t\tthis.scale.addXLabel(label);\n\t\t\t//Then re-render the chart.\n\t\t\tthis.update();\n\t\t},\n\t\tremoveData : function(){\n\t\t\tthis.scale.removeXLabel();\n\t\t\t//Then re-render the chart.\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\tdataset.points.shift();\n\t\t\t},this);\n\t\t\tthis.update();\n\t\t},\n\t\treflow : function(){\n\t\t\tvar newScaleProps = helpers.extend({\n\t\t\t\theight : this.chart.height,\n\t\t\t\twidth : this.chart.width\n\t\t\t});\n\t\t\tthis.scale.update(newScaleProps);\n\t\t},\n\t\tdraw : function(ease){\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\tthis.clear();\n\n\t\t\tvar ctx = this.chart.ctx;\n\n\t\t\t// Some helper methods for getting the next/prev points\n\t\t\tvar hasValue = function(item){\n\t\t\t\treturn item.value !== null;\n\t\t\t},\n\t\t\tnextPoint = function(point, collection, index){\n\t\t\t\treturn helpers.findNextWhere(collection, hasValue, index) || point;\n\t\t\t},\n\t\t\tpreviousPoint = function(point, collection, index){\n\t\t\t\treturn helpers.findPreviousWhere(collection, hasValue, index) || point;\n\t\t\t};\n\n\t\t\tthis.scale.draw(easingDecimal);\n\n\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\tvar pointsWithValues = helpers.where(dataset.points, hasValue);\n\n\t\t\t\t//Transition each point first so that the line and point drawing isn't out of sync\n\t\t\t\t//We can use this extra loop to calculate the control points of this dataset also in this loop\n\n\t\t\t\thelpers.each(dataset.points, function(point, index){\n\t\t\t\t\tif (point.hasValue()){\n\t\t\t\t\t\tpoint.transition({\n\t\t\t\t\t\t\ty : this.scale.calculateY(point.value),\n\t\t\t\t\t\t\tx : this.scale.calculateX(index)\n\t\t\t\t\t\t}, easingDecimal);\n\t\t\t\t\t}\n\t\t\t\t},this);\n\n\n\t\t\t\t// Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point\n\t\t\t\t// This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed\n\t\t\t\tif (this.options.bezierCurve){\n\t\t\t\t\thelpers.each(pointsWithValues, function(point, index){\n\t\t\t\t\t\tvar tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0;\n\t\t\t\t\t\tpoint.controlPoints = helpers.splineCurve(\n\t\t\t\t\t\t\tpreviousPoint(point, pointsWithValues, index),\n\t\t\t\t\t\t\tpoint,\n\t\t\t\t\t\t\tnextPoint(point, pointsWithValues, index),\n\t\t\t\t\t\t\ttension\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\n\t\t\t\t\t\t// Cap puter bezier handles to the upper/lower scale bounds\n\t\t\t\t\t\tif (point.controlPoints.outer.y > this.scale.endPoint){\n\t\t\t\t\t\t\tpoint.controlPoints.outer.y = this.scale.endPoint;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (point.controlPoints.outer.y < this.scale.startPoint){\n\t\t\t\t\t\t\tpoint.controlPoints.outer.y = this.scale.startPoint;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Cap inner bezier handles to the upper/lower scale bounds\n\t\t\t\t\t\tif (point.controlPoints.inner.y > this.scale.endPoint){\n\t\t\t\t\t\t\tpoint.controlPoints.inner.y = this.scale.endPoint;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (point.controlPoints.inner.y < this.scale.startPoint){\n\t\t\t\t\t\t\tpoint.controlPoints.inner.y = this.scale.startPoint;\n\t\t\t\t\t\t}\n\t\t\t\t\t},this);\n\t\t\t\t}\n\n\n\t\t\t\t//Draw the line between all the points\n\t\t\t\tctx.lineWidth = this.options.datasetStrokeWidth;\n\t\t\t\tctx.strokeStyle = dataset.strokeColor;\n\t\t\t\tctx.beginPath();\n\n\t\t\t\thelpers.each(pointsWithValues, function(point, index){\n\t\t\t\t\tif (index === 0){\n\t\t\t\t\t\tctx.moveTo(point.x, point.y);\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tif(this.options.bezierCurve){\n\t\t\t\t\t\t\tvar previous = previousPoint(point, pointsWithValues, index);\n\n\t\t\t\t\t\t\tctx.bezierCurveTo(\n\t\t\t\t\t\t\t\tprevious.controlPoints.outer.x,\n\t\t\t\t\t\t\t\tprevious.controlPoints.outer.y,\n\t\t\t\t\t\t\t\tpoint.controlPoints.inner.x,\n\t\t\t\t\t\t\t\tpoint.controlPoints.inner.y,\n\t\t\t\t\t\t\t\tpoint.x,\n\t\t\t\t\t\t\t\tpoint.y\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tctx.lineTo(point.x,point.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\n\t\t\t\tctx.stroke();\n\n\t\t\t\tif (this.options.datasetFill && pointsWithValues.length > 0){\n\t\t\t\t\t//Round off the line by going to the base of the chart, back to the start, then fill.\n\t\t\t\t\tctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint);\n\t\t\t\t\tctx.lineTo(pointsWithValues[0].x, this.scale.endPoint);\n\t\t\t\t\tctx.fillStyle = dataset.fillColor;\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.fill();\n\t\t\t\t}\n\n\t\t\t\t//Now draw the points over the line\n\t\t\t\t//A little inefficient double looping, but better than the line\n\t\t\t\t//lagging behind the point positions\n\t\t\t\thelpers.each(pointsWithValues,function(point){\n\t\t\t\t\tpoint.draw();\n\t\t\t\t});\n\t\t\t},this);\n\t\t}\n\t});\n\n\n}).call(this);\n\n(function(){\n\t\"use strict\";\n\n\tvar root = this,\n\t\tChart = root.Chart,\n\t\t//Cache a local reference to Chart.helpers\n\t\thelpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\t//Boolean - Show a backdrop to the scale label\n\t\tscaleShowLabelBackdrop : true,\n\n\t\t//String - The colour of the label backdrop\n\t\tscaleBackdropColor : \"rgba(255,255,255,0.75)\",\n\n\t\t// Boolean - Whether the scale should begin at zero\n\t\tscaleBeginAtZero : true,\n\n\t\t//Number - The backdrop padding above & below the label in pixels\n\t\tscaleBackdropPaddingY : 2,\n\n\t\t//Number - The backdrop padding to the side of the label in pixels\n\t\tscaleBackdropPaddingX : 2,\n\n\t\t//Boolean - Show line for each value in the scale\n\t\tscaleShowLine : true,\n\n\t\t//Boolean - Stroke a line around each segment in the chart\n\t\tsegmentShowStroke : true,\n\n\t\t//String - The colour of the stroke on each segement.\n\t\tsegmentStrokeColor : \"#fff\",\n\n\t\t//Number - The width of the stroke value in pixels\n\t\tsegmentStrokeWidth : 2,\n\n\t\t//Number - Amount of animation steps\n\t\tanimationSteps : 100,\n\n\t\t//String - Animation easing effect.\n\t\tanimationEasing : \"easeOutBounce\",\n\n\t\t//Boolean - Whether to animate the rotation of the chart\n\t\tanimateRotate : true,\n\n\t\t//Boolean - Whether to animate scaling the chart from the centre\n\t\tanimateScale : false,\n\n\t\t//String - A legend template\n\t\tlegendTemplate : \"
    -legend\\\"><% for (var i=0; i
  • \\\"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
\"\n\t};\n\n\n\tChart.Type.extend({\n\t\t//Passing in a name registers this chart in the Chart namespace\n\t\tname: \"PolarArea\",\n\t\t//Providing a defaults will also register the deafults in the chart namespace\n\t\tdefaults : defaultConfig,\n\t\t//Initialize is fired when the chart is initialized - Data is passed in as a parameter\n\t\t//Config is automatically merged by the core of Chart.js, and is available at this.options\n\t\tinitialize: function(data){\n\t\t\tthis.segments = [];\n\t\t\t//Declare segment class as a chart instance specific class, so it can share props for this instance\n\t\t\tthis.SegmentArc = Chart.Arc.extend({\n\t\t\t\tshowStroke : this.options.segmentShowStroke,\n\t\t\t\tstrokeWidth : this.options.segmentStrokeWidth,\n\t\t\t\tstrokeColor : this.options.segmentStrokeColor,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\tinnerRadius : 0,\n\t\t\t\tx : this.chart.width/2,\n\t\t\t\ty : this.chart.height/2\n\t\t\t});\n\t\t\tthis.scale = new Chart.RadialScale({\n\t\t\t\tdisplay: this.options.showScale,\n\t\t\t\tfontStyle: this.options.scaleFontStyle,\n\t\t\t\tfontSize: this.options.scaleFontSize,\n\t\t\t\tfontFamily: this.options.scaleFontFamily,\n\t\t\t\tfontColor: this.options.scaleFontColor,\n\t\t\t\tshowLabels: this.options.scaleShowLabels,\n\t\t\t\tshowLabelBackdrop: this.options.scaleShowLabelBackdrop,\n\t\t\t\tbackdropColor: this.options.scaleBackdropColor,\n\t\t\t\tbackdropPaddingY : this.options.scaleBackdropPaddingY,\n\t\t\t\tbackdropPaddingX: this.options.scaleBackdropPaddingX,\n\t\t\t\tlineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,\n\t\t\t\tlineColor: this.options.scaleLineColor,\n\t\t\t\tlineArc: true,\n\t\t\t\twidth: this.chart.width,\n\t\t\t\theight: this.chart.height,\n\t\t\t\txCenter: this.chart.width/2,\n\t\t\t\tyCenter: this.chart.height/2,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\ttemplateString: this.options.scaleLabel,\n\t\t\t\tvaluesCount: data.length\n\t\t\t});\n\n\t\t\tthis.updateScaleRange(data);\n\n\t\t\tthis.scale.update();\n\n\t\t\thelpers.each(data,function(segment,index){\n\t\t\t\tthis.addData(segment,index,true);\n\t\t\t},this);\n\n\t\t\t//Set up tooltip events on the chart\n\t\t\tif (this.options.showTooltips){\n\t\t\t\thelpers.bindEvents(this, this.options.tooltipEvents, function(evt){\n\t\t\t\t\tvar activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];\n\t\t\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\t\t\tsegment.restore([\"fillColor\"]);\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(activeSegments,function(activeSegment){\n\t\t\t\t\t\tactiveSegment.fillColor = activeSegment.highlightColor;\n\t\t\t\t\t});\n\t\t\t\t\tthis.showTooltip(activeSegments);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.render();\n\t\t},\n\t\tgetSegmentsAtEvent : function(e){\n\t\t\tvar segmentsArray = [];\n\n\t\t\tvar location = helpers.getRelativePosition(e);\n\n\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\tif (segment.inRange(location.x,location.y)) segmentsArray.push(segment);\n\t\t\t},this);\n\t\t\treturn segmentsArray;\n\t\t},\n\t\taddData : function(segment, atIndex, silent){\n\t\t\tvar index = atIndex || this.segments.length;\n\n\t\t\tthis.segments.splice(index, 0, new this.SegmentArc({\n\t\t\t\tfillColor: segment.color,\n\t\t\t\thighlightColor: segment.highlight || segment.color,\n\t\t\t\tlabel: segment.label,\n\t\t\t\tvalue: segment.value,\n\t\t\t\touterRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value),\n\t\t\t\tcircumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(),\n\t\t\t\tstartAngle: Math.PI * 1.5\n\t\t\t}));\n\t\t\tif (!silent){\n\t\t\t\tthis.reflow();\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t},\n\t\tremoveData: function(atIndex){\n\t\t\tvar indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;\n\t\t\tthis.segments.splice(indexToDelete, 1);\n\t\t\tthis.reflow();\n\t\t\tthis.update();\n\t\t},\n\t\tcalculateTotal: function(data){\n\t\t\tthis.total = 0;\n\t\t\thelpers.each(data,function(segment){\n\t\t\t\tthis.total += segment.value;\n\t\t\t},this);\n\t\t\tthis.scale.valuesCount = this.segments.length;\n\t\t},\n\t\tupdateScaleRange: function(datapoints){\n\t\t\tvar valuesArray = [];\n\t\t\thelpers.each(datapoints,function(segment){\n\t\t\t\tvaluesArray.push(segment.value);\n\t\t\t});\n\n\t\t\tvar scaleSizes = (this.options.scaleOverride) ?\n\t\t\t\t{\n\t\t\t\t\tsteps: this.options.scaleSteps,\n\t\t\t\t\tstepValue: this.options.scaleStepWidth,\n\t\t\t\t\tmin: this.options.scaleStartValue,\n\t\t\t\t\tmax: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)\n\t\t\t\t} :\n\t\t\t\thelpers.calculateScaleRange(\n\t\t\t\t\tvaluesArray,\n\t\t\t\t\thelpers.min([this.chart.width, this.chart.height])/2,\n\t\t\t\t\tthis.options.scaleFontSize,\n\t\t\t\t\tthis.options.scaleBeginAtZero,\n\t\t\t\t\tthis.options.scaleIntegersOnly\n\t\t\t\t);\n\n\t\t\thelpers.extend(\n\t\t\t\tthis.scale,\n\t\t\t\tscaleSizes,\n\t\t\t\t{\n\t\t\t\t\tsize: helpers.min([this.chart.width, this.chart.height]),\n\t\t\t\t\txCenter: this.chart.width/2,\n\t\t\t\t\tyCenter: this.chart.height/2\n\t\t\t\t}\n\t\t\t);\n\n\t\t},\n\t\tupdate : function(){\n\t\t\tthis.calculateTotal(this.segments);\n\n\t\t\thelpers.each(this.segments,function(segment){\n\t\t\t\tsegment.save();\n\t\t\t});\n\t\t\t\n\t\t\tthis.reflow();\n\t\t\tthis.render();\n\t\t},\n\t\treflow : function(){\n\t\t\thelpers.extend(this.SegmentArc.prototype,{\n\t\t\t\tx : this.chart.width/2,\n\t\t\t\ty : this.chart.height/2\n\t\t\t});\n\t\t\tthis.updateScaleRange(this.segments);\n\t\t\tthis.scale.update();\n\n\t\t\thelpers.extend(this.scale,{\n\t\t\t\txCenter: this.chart.width/2,\n\t\t\t\tyCenter: this.chart.height/2\n\t\t\t});\n\n\t\t\thelpers.each(this.segments, function(segment){\n\t\t\t\tsegment.update({\n\t\t\t\t\touterRadius : this.scale.calculateCenterOffset(segment.value)\n\t\t\t\t});\n\t\t\t}, this);\n\n\t\t},\n\t\tdraw : function(ease){\n\t\t\tvar easingDecimal = ease || 1;\n\t\t\t//Clear & draw the canvas\n\t\t\tthis.clear();\n\t\t\thelpers.each(this.segments,function(segment, index){\n\t\t\t\tsegment.transition({\n\t\t\t\t\tcircumference : this.scale.getCircumference(),\n\t\t\t\t\touterRadius : this.scale.calculateCenterOffset(segment.value)\n\t\t\t\t},easingDecimal);\n\n\t\t\t\tsegment.endAngle = segment.startAngle + segment.circumference;\n\n\t\t\t\t// If we've removed the first segment we need to set the first one to\n\t\t\t\t// start at the top.\n\t\t\t\tif (index === 0){\n\t\t\t\t\tsegment.startAngle = Math.PI * 1.5;\n\t\t\t\t}\n\n\t\t\t\t//Check to see if it's the last segment, if not get the next and update the start angle\n\t\t\t\tif (index < this.segments.length - 1){\n\t\t\t\t\tthis.segments[index+1].startAngle = segment.endAngle;\n\t\t\t\t}\n\t\t\t\tsegment.draw();\n\t\t\t}, this);\n\t\t\tthis.scale.draw();\n\t\t}\n\t});\n\n}).call(this);\n(function(){\n\t\"use strict\";\n\n\tvar root = this,\n\t\tChart = root.Chart,\n\t\thelpers = Chart.helpers;\n\n\n\n\tChart.Type.extend({\n\t\tname: \"Radar\",\n\t\tdefaults:{\n\t\t\t//Boolean - Whether to show lines for each scale point\n\t\t\tscaleShowLine : true,\n\n\t\t\t//Boolean - Whether we show the angle lines out of the radar\n\t\t\tangleShowLineOut : true,\n\n\t\t\t//Boolean - Whether to show labels on the scale\n\t\t\tscaleShowLabels : false,\n\n\t\t\t// Boolean - Whether the scale should begin at zero\n\t\t\tscaleBeginAtZero : true,\n\n\t\t\t//String - Colour of the angle line\n\t\t\tangleLineColor : \"rgba(0,0,0,.1)\",\n\n\t\t\t//Number - Pixel width of the angle line\n\t\t\tangleLineWidth : 1,\n\n\t\t\t//String - Point label font declaration\n\t\t\tpointLabelFontFamily : \"'Arial'\",\n\n\t\t\t//String - Point label font weight\n\t\t\tpointLabelFontStyle : \"normal\",\n\n\t\t\t//Number - Point label font size in pixels\n\t\t\tpointLabelFontSize : 10,\n\n\t\t\t//String - Point label font colour\n\t\t\tpointLabelFontColor : \"#666\",\n\n\t\t\t//Boolean - Whether to show a dot for each point\n\t\t\tpointDot : true,\n\n\t\t\t//Number - Radius of each point dot in pixels\n\t\t\tpointDotRadius : 3,\n\n\t\t\t//Number - Pixel width of point dot stroke\n\t\t\tpointDotStrokeWidth : 1,\n\n\t\t\t//Number - amount extra to add to the radius to cater for hit detection outside the drawn point\n\t\t\tpointHitDetectionRadius : 20,\n\n\t\t\t//Boolean - Whether to show a stroke for datasets\n\t\t\tdatasetStroke : true,\n\n\t\t\t//Number - Pixel width of dataset stroke\n\t\t\tdatasetStrokeWidth : 2,\n\n\t\t\t//Boolean - Whether to fill the dataset with a colour\n\t\t\tdatasetFill : true,\n\n\t\t\t//String - A legend template\n\t\t\tlegendTemplate : \"
    -legend\\\"><% for (var i=0; i
  • \\\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
\"\n\n\t\t},\n\n\t\tinitialize: function(data){\n\t\t\tthis.PointClass = Chart.Point.extend({\n\t\t\t\tstrokeWidth : this.options.pointDotStrokeWidth,\n\t\t\t\tradius : this.options.pointDotRadius,\n\t\t\t\tdisplay: this.options.pointDot,\n\t\t\t\thitDetectionRadius : this.options.pointHitDetectionRadius,\n\t\t\t\tctx : this.chart.ctx\n\t\t\t});\n\n\t\t\tthis.datasets = [];\n\n\t\t\tthis.buildScale(data);\n\n\t\t\t//Set up tooltip events on the chart\n\t\t\tif (this.options.showTooltips){\n\t\t\t\thelpers.bindEvents(this, this.options.tooltipEvents, function(evt){\n\t\t\t\t\tvar activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];\n\n\t\t\t\t\tthis.eachPoints(function(point){\n\t\t\t\t\t\tpoint.restore(['fillColor', 'strokeColor']);\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(activePointsCollection, function(activePoint){\n\t\t\t\t\t\tactivePoint.fillColor = activePoint.highlightFill;\n\t\t\t\t\t\tactivePoint.strokeColor = activePoint.highlightStroke;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.showTooltip(activePointsCollection);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t//Iterate through each of the datasets, and build this into a property of the chart\n\t\t\thelpers.each(data.datasets,function(dataset){\n\n\t\t\t\tvar datasetObject = {\n\t\t\t\t\tlabel: dataset.label || null,\n\t\t\t\t\tfillColor : dataset.fillColor,\n\t\t\t\t\tstrokeColor : dataset.strokeColor,\n\t\t\t\t\tpointColor : dataset.pointColor,\n\t\t\t\t\tpointStrokeColor : dataset.pointStrokeColor,\n\t\t\t\t\tpoints : []\n\t\t\t\t};\n\n\t\t\t\tthis.datasets.push(datasetObject);\n\n\t\t\t\thelpers.each(dataset.data,function(dataPoint,index){\n\t\t\t\t\t//Add a new point for each piece of data, passing any required data to draw.\n\t\t\t\t\tvar pointPosition;\n\t\t\t\t\tif (!this.scale.animation){\n\t\t\t\t\t\tpointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint));\n\t\t\t\t\t}\n\t\t\t\t\tdatasetObject.points.push(new this.PointClass({\n\t\t\t\t\t\tvalue : dataPoint,\n\t\t\t\t\t\tlabel : data.labels[index],\n\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\tx: (this.options.animation) ? this.scale.xCenter : pointPosition.x,\n\t\t\t\t\t\ty: (this.options.animation) ? this.scale.yCenter : pointPosition.y,\n\t\t\t\t\t\tstrokeColor : dataset.pointStrokeColor,\n\t\t\t\t\t\tfillColor : dataset.pointColor,\n\t\t\t\t\t\thighlightFill : dataset.pointHighlightFill || dataset.pointColor,\n\t\t\t\t\t\thighlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor\n\t\t\t\t\t}));\n\t\t\t\t},this);\n\n\t\t\t},this);\n\n\t\t\tthis.render();\n\t\t},\n\t\teachPoints : function(callback){\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\thelpers.each(dataset.points,callback,this);\n\t\t\t},this);\n\t\t},\n\n\t\tgetPointsAtEvent : function(evt){\n\t\t\tvar mousePosition = helpers.getRelativePosition(evt),\n\t\t\t\tfromCenter = helpers.getAngleFromPoint({\n\t\t\t\t\tx: this.scale.xCenter,\n\t\t\t\t\ty: this.scale.yCenter\n\t\t\t\t}, mousePosition);\n\n\t\t\tvar anglePerIndex = (Math.PI * 2) /this.scale.valuesCount,\n\t\t\t\tpointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex),\n\t\t\t\tactivePointsCollection = [];\n\n\t\t\t// If we're at the top, make the pointIndex 0 to get the first of the array.\n\t\t\tif (pointIndex >= this.scale.valuesCount || pointIndex < 0){\n\t\t\t\tpointIndex = 0;\n\t\t\t}\n\n\t\t\tif (fromCenter.distance <= this.scale.drawingArea){\n\t\t\t\thelpers.each(this.datasets, function(dataset){\n\t\t\t\t\tactivePointsCollection.push(dataset.points[pointIndex]);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn activePointsCollection;\n\t\t},\n\n\t\tbuildScale : function(data){\n\t\t\tthis.scale = new Chart.RadialScale({\n\t\t\t\tdisplay: this.options.showScale,\n\t\t\t\tfontStyle: this.options.scaleFontStyle,\n\t\t\t\tfontSize: this.options.scaleFontSize,\n\t\t\t\tfontFamily: this.options.scaleFontFamily,\n\t\t\t\tfontColor: this.options.scaleFontColor,\n\t\t\t\tshowLabels: this.options.scaleShowLabels,\n\t\t\t\tshowLabelBackdrop: this.options.scaleShowLabelBackdrop,\n\t\t\t\tbackdropColor: this.options.scaleBackdropColor,\n\t\t\t\tbackdropPaddingY : this.options.scaleBackdropPaddingY,\n\t\t\t\tbackdropPaddingX: this.options.scaleBackdropPaddingX,\n\t\t\t\tlineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,\n\t\t\t\tlineColor: this.options.scaleLineColor,\n\t\t\t\tangleLineColor : this.options.angleLineColor,\n\t\t\t\tangleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0,\n\t\t\t\t// Point labels at the edge of each line\n\t\t\t\tpointLabelFontColor : this.options.pointLabelFontColor,\n\t\t\t\tpointLabelFontSize : this.options.pointLabelFontSize,\n\t\t\t\tpointLabelFontFamily : this.options.pointLabelFontFamily,\n\t\t\t\tpointLabelFontStyle : this.options.pointLabelFontStyle,\n\t\t\t\theight : this.chart.height,\n\t\t\t\twidth: this.chart.width,\n\t\t\t\txCenter: this.chart.width/2,\n\t\t\t\tyCenter: this.chart.height/2,\n\t\t\t\tctx : this.chart.ctx,\n\t\t\t\ttemplateString: this.options.scaleLabel,\n\t\t\t\tlabels: data.labels,\n\t\t\t\tvaluesCount: data.datasets[0].data.length\n\t\t\t});\n\n\t\t\tthis.scale.setScaleSize();\n\t\t\tthis.updateScaleRange(data.datasets);\n\t\t\tthis.scale.buildYLabels();\n\t\t},\n\t\tupdateScaleRange: function(datasets){\n\t\t\tvar valuesArray = (function(){\n\t\t\t\tvar totalDataArray = [];\n\t\t\t\thelpers.each(datasets,function(dataset){\n\t\t\t\t\tif (dataset.data){\n\t\t\t\t\t\ttotalDataArray = totalDataArray.concat(dataset.data);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\thelpers.each(dataset.points, function(point){\n\t\t\t\t\t\t\ttotalDataArray.push(point.value);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn totalDataArray;\n\t\t\t})();\n\n\n\t\t\tvar scaleSizes = (this.options.scaleOverride) ?\n\t\t\t\t{\n\t\t\t\t\tsteps: this.options.scaleSteps,\n\t\t\t\t\tstepValue: this.options.scaleStepWidth,\n\t\t\t\t\tmin: this.options.scaleStartValue,\n\t\t\t\t\tmax: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)\n\t\t\t\t} :\n\t\t\t\thelpers.calculateScaleRange(\n\t\t\t\t\tvaluesArray,\n\t\t\t\t\thelpers.min([this.chart.width, this.chart.height])/2,\n\t\t\t\t\tthis.options.scaleFontSize,\n\t\t\t\t\tthis.options.scaleBeginAtZero,\n\t\t\t\t\tthis.options.scaleIntegersOnly\n\t\t\t\t);\n\n\t\t\thelpers.extend(\n\t\t\t\tthis.scale,\n\t\t\t\tscaleSizes\n\t\t\t);\n\n\t\t},\n\t\taddData : function(valuesArray,label){\n\t\t\t//Map the values array for each of the datasets\n\t\t\tthis.scale.valuesCount++;\n\t\t\thelpers.each(valuesArray,function(value,datasetIndex){\n\t\t\t\tvar pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value));\n\t\t\t\tthis.datasets[datasetIndex].points.push(new this.PointClass({\n\t\t\t\t\tvalue : value,\n\t\t\t\t\tlabel : label,\n\t\t\t\t\tx: pointPosition.x,\n\t\t\t\t\ty: pointPosition.y,\n\t\t\t\t\tstrokeColor : this.datasets[datasetIndex].pointStrokeColor,\n\t\t\t\t\tfillColor : this.datasets[datasetIndex].pointColor\n\t\t\t\t}));\n\t\t\t},this);\n\n\t\t\tthis.scale.labels.push(label);\n\n\t\t\tthis.reflow();\n\n\t\t\tthis.update();\n\t\t},\n\t\tremoveData : function(){\n\t\t\tthis.scale.valuesCount--;\n\t\t\tthis.scale.labels.shift();\n\t\t\thelpers.each(this.datasets,function(dataset){\n\t\t\t\tdataset.points.shift();\n\t\t\t},this);\n\t\t\tthis.reflow();\n\t\t\tthis.update();\n\t\t},\n\t\tupdate : function(){\n\t\t\tthis.eachPoints(function(point){\n\t\t\t\tpoint.save();\n\t\t\t});\n\t\t\tthis.reflow();\n\t\t\tthis.render();\n\t\t},\n\t\treflow: function(){\n\t\t\thelpers.extend(this.scale, {\n\t\t\t\twidth : this.chart.width,\n\t\t\t\theight: this.chart.height,\n\t\t\t\tsize : helpers.min([this.chart.width, this.chart.height]),\n\t\t\t\txCenter: this.chart.width/2,\n\t\t\t\tyCenter: this.chart.height/2\n\t\t\t});\n\t\t\tthis.updateScaleRange(this.datasets);\n\t\t\tthis.scale.setScaleSize();\n\t\t\tthis.scale.buildYLabels();\n\t\t},\n\t\tdraw : function(ease){\n\t\t\tvar easeDecimal = ease || 1,\n\t\t\t\tctx = this.chart.ctx;\n\t\t\tthis.clear();\n\t\t\tthis.scale.draw();\n\n\t\t\thelpers.each(this.datasets,function(dataset){\n\n\t\t\t\t//Transition each point first so that the line and point drawing isn't out of sync\n\t\t\t\thelpers.each(dataset.points,function(point,index){\n\t\t\t\t\tif (point.hasValue()){\n\t\t\t\t\t\tpoint.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal);\n\t\t\t\t\t}\n\t\t\t\t},this);\n\n\n\n\t\t\t\t//Draw the line between all the points\n\t\t\t\tctx.lineWidth = this.options.datasetStrokeWidth;\n\t\t\t\tctx.strokeStyle = dataset.strokeColor;\n\t\t\t\tctx.beginPath();\n\t\t\t\thelpers.each(dataset.points,function(point,index){\n\t\t\t\t\tif (index === 0){\n\t\t\t\t\t\tctx.moveTo(point.x,point.y);\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tctx.lineTo(point.x,point.y);\n\t\t\t\t\t}\n\t\t\t\t},this);\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.stroke();\n\n\t\t\t\tctx.fillStyle = dataset.fillColor;\n\t\t\t\tctx.fill();\n\n\t\t\t\t//Now draw the points over the line\n\t\t\t\t//A little inefficient double looping, but better than the line\n\t\t\t\t//lagging behind the point positions\n\t\t\t\thelpers.each(dataset.points,function(point){\n\t\t\t\t\tif (point.hasValue()){\n\t\t\t\t\t\tpoint.draw();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t},this);\n\n\t\t}\n\n\t});\n\n\n\n\n\n}).call(this);","/* globals __webpack_amd_options__ */\r\nmodule.exports = __webpack_amd_options__;\r\n"],"sourceRoot":""}