this.setPointsLengths = [];
this.setPointsOffsets = [];
+ var connectSeparated = this.attr_('connectSeparatedPoints');
for (var setIdx = 0; setIdx < this.datasets.length; ++setIdx) {
var dataset = this.datasets[setIdx];
var setName = this.setNames[setIdx];
yval: yValue,
name: setName
};
+ if (connectSeparated && item[1] === null) {
+ point.yval = null;
+ }
this.points.push(point);
setPointsLength += 1;
}
ctx.closePath();
ctx.stroke();
}
+ ctx.restore();
}
if (this.attr_('drawXGrid')) {
ctx.closePath();
ctx.stroke();
}
+ ctx.restore();
}
// Do the ordinary rendering, as before
var points = this.layout.annotated_points;
for (var i = 0; i < points.length; i++) {
var p = points[i];
- if (p.canvasx < this.area.x || p.canvasx > this.area.x + this.area.w) {
+ if (p.canvasx < this.area.x || p.canvasx > this.area.x + this.area.w ||
+ p.canvasy < this.area.y || p.canvasy > this.area.y + this.area.h) {
continue;
}
}
};
+DygraphCanvasRenderer.makeNextPointStep_ = function(connect, points, end) {
+ if (connect) {
+ return function(j) {
+ while (++j < end) {
+ if (!(points[j].yval === null)) break;
+ }
+ return j;
+ }
+ } else {
+ return function(j) { return j + 1 };
+ }
+};
+
+DygraphCanvasRenderer.prototype._drawStyledLine = function(
+ ctx, i, setName, color, strokeWidth, strokePattern, drawPoints,
+ drawPointCallback, pointSize) {
+ var isNullOrNaN = function(x) {
+ return (x === null || isNaN(x));
+ };
+
+ var stepPlot = this.attr_("stepPlot");
+ var firstIndexInSet = this.layout.setPointsOffsets[i];
+ var setLength = this.layout.setPointsLengths[i];
+ var afterLastIndexInSet = firstIndexInSet + setLength;
+ var points = this.layout.points;
+ var prevX = null;
+ var prevY = null;
+ var pointsOnLine = []; // Array of [canvasx, canvasy] pairs.
+ if (!Dygraph.isArrayLike(strokePattern)) {
+ strokePattern = null;
+ }
+
+ var point;
+ var next = DygraphCanvasRenderer.makeNextPointStep_(
+ this.attr_('connectSeparatedPoints'), points, afterLastIndexInSet);
+ ctx.save();
+ for (var j = firstIndexInSet; j < afterLastIndexInSet; j = next(j)) {
+ point = points[j];
+ if (isNullOrNaN(point.canvasy)) {
+ if (stepPlot && prevX !== null) {
+ // Draw a horizontal line to the start of the missing data
+ ctx.beginPath();
+ ctx.strokeStyle = color;
+ ctx.lineWidth = this.attr_('strokeWidth');
+ this._dashedLine(ctx, prevX, prevY, point.canvasx, prevY, strokePattern);
+ ctx.stroke();
+ }
+ // this will make us move to the next point, not draw a line to it.
+ prevX = prevY = null;
+ } else {
+ // A point is "isolated" if it is non-null but both the previous
+ // and next points are null.
+ var isIsolated = (!prevX && (j == points.length - 1 ||
+ isNullOrNaN(points[j+1].canvasy)));
+ if (prevX === null) {
+ prevX = point.canvasx;
+ prevY = point.canvasy;
+ } else {
+ // Skip over points that will be drawn in the same pixel.
+ if (Math.round(prevX) == Math.round(point.canvasx) &&
+ Math.round(prevY) == Math.round(point.canvasy)) {
+ continue;
+ }
+ // TODO(antrob): skip over points that lie on a line that is already
+ // going to be drawn. There is no need to have more than 2
+ // consecutive points that are collinear.
+ if (strokeWidth) {
+ ctx.beginPath();
+ ctx.strokeStyle = color;
+ ctx.lineWidth = strokeWidth;
+ if (stepPlot) {
+ this._dashedLine(ctx, prevX, prevY, point.canvasx, prevY, strokePattern);
+ prevX = point.canvasx;
+ }
+ this._dashedLine(ctx, prevX, prevY, point.canvasx, point.canvasy, strokePattern);
+ prevX = point.canvasx;
+ prevY = point.canvasy;
+ ctx.stroke();
+ }
+ }
+
+ if (drawPoints || isIsolated) {
+ pointsOnLine.push([point.canvasx, point.canvasy]);
+ }
+ }
+ }
+ for (var idx = 0; idx < pointsOnLine.length; idx++) {
+ var cb = pointsOnLine[idx];
+ ctx.save();
+ drawPointCallback(
+ this.dygraph_, setName, ctx, cb[0], cb[1], color, pointSize);
+ ctx.restore();
+ }
+ ctx.restore();
+};
+
+DygraphCanvasRenderer.prototype._drawLine = function(ctx, i) {
+ var setNames = this.layout.setNames;
+ var setName = setNames[i];
+
+ var strokeWidth = this.dygraph_.attr_("strokeWidth", setName);
+ var borderWidth = this.dygraph_.attr_("strokeBorderWidth", setName);
+ var drawPointCallback = this.dygraph_.attr_("drawPointCallback", setName) ||
+ Dygraph.Circles.DEFAULT;
+ if (borderWidth && strokeWidth) {
+ this._drawStyledLine(ctx, i, setName,
+ this.dygraph_.attr_("strokeBorderColor", setName),
+ strokeWidth + 2 * borderWidth,
+ this.dygraph_.attr_("strokePattern", setName),
+ this.dygraph_.attr_("drawPoints", setName),
+ drawPointCallback,
+ this.dygraph_.attr_("pointSize", setName));
+ }
+
+ this._drawStyledLine(ctx, i, setName,
+ this.colors[setName],
+ strokeWidth,
+ this.dygraph_.attr_("strokePattern", setName),
+ this.dygraph_.attr_("drawPoints", setName),
+ drawPointCallback,
+ this.dygraph_.attr_("pointSize", setName));
+};
/**
* Actually draw the lines chart, including error bars.
* @private
*/
DygraphCanvasRenderer.prototype._renderLineChart = function() {
- var isNullOrNaN = function(x) {
- return (x === null || isNaN(x));
- };
-
// TODO(danvk): use this.attr_ for many of these.
- var context = this.elementContext;
+ var ctx = this.elementContext;
var fillAlpha = this.attr_('fillAlpha');
var errorBars = this.attr_("errorBars") || this.attr_("customBars");
var fillGraph = this.attr_("fillGraph");
}
// create paths
- var ctx = context;
if (errorBars) {
+ ctx.save();
if (fillGraph) {
this.dygraph_.warn("Can't use fillGraph option with error bars");
}
axis = this.dygraph_.axisPropertiesForSeries(setName);
color = this.colors[setName];
+ var firstIndexInSet = this.layout.setPointsOffsets[i];
+ var setLength = this.layout.setPointsLengths[i];
+ var afterLastIndexInSet = firstIndexInSet + setLength;
+
+ var next = DygraphCanvasRenderer.makeNextPointStep_(
+ this.attr_('connectSeparatedPoints'), points,
+ afterLastIndexInSet);
+
// setup graphics context
- ctx.save();
prevX = NaN;
prevY = NaN;
prevYs = [-1, -1];
fillAlpha + ')';
ctx.fillStyle = err_color;
ctx.beginPath();
- for (j = 0; j < pointsLength; j++) {
+ for (j = firstIndexInSet; j < afterLastIndexInSet; j = next(j)) {
point = points[j];
- if (point.name == setName) {
+ if (point.name == setName) { // TODO(klausw): this is always true
if (!Dygraph.isOK(point.y)) {
prevX = NaN;
continue;
}
ctx.fill();
}
+ ctx.restore();
} else if (fillGraph) {
+ ctx.save();
var baseline = []; // for stacked graphs: baseline for filling
// process sets in reverse order (needed for stacked graphs)
if (axisY < 0.0) axisY = 0.0;
else if (axisY > 1.0) axisY = 1.0;
axisY = this.area.h * axisY + this.area.y;
+ var firstIndexInSet = this.layout.setPointsOffsets[i];
+ var setLength = this.layout.setPointsLengths[i];
+ var afterLastIndexInSet = firstIndexInSet + setLength;
+
+ var next = DygraphCanvasRenderer.makeNextPointStep_(
+ this.attr_('connectSeparatedPoints'), points,
+ afterLastIndexInSet);
// setup graphics context
- ctx.save();
prevX = NaN;
prevYs = [-1, -1];
yscale = axis.yscale;
fillAlpha + ')';
ctx.fillStyle = err_color;
ctx.beginPath();
- for (j = 0; j < pointsLength; j++) {
+ for (j = firstIndexInSet; j < afterLastIndexInSet; j = next(j)) {
point = points[j];
- if (point.name == setName) {
+ if (point.name == setName) { // TODO(klausw): this is always true
if (!Dygraph.isOK(point.y)) {
prevX = NaN;
continue;
}
ctx.fill();
}
+ ctx.restore();
}
// Drawing the lines.
- var firstIndexInSet = 0;
- var afterLastIndexInSet = 0;
- var setLength = 0;
for (i = 0; i < setCount; i += 1) {
- firstIndexInSet = this.layout.setPointsOffsets[i];
- setLength = this.layout.setPointsLengths[i];
- afterLastIndexInSet = firstIndexInSet + setLength;
- setName = setNames[i];
- color = this.colors[setName];
- var strokeWidth = this.dygraph_.attr_("strokeWidth", setName);
-
- // setup graphics context
- context.save();
- var pointSize = this.dygraph_.attr_("pointSize", setName);
- prevX = null;
- prevY = null;
- var drawPoints = this.dygraph_.attr_("drawPoints", setName);
- var strokePattern = this.dygraph_.attr_("strokePattern", setName);
- if (!Dygraph.isArrayLike(strokePattern)) {
- strokePattern = null;
- }
- for (j = firstIndexInSet; j < afterLastIndexInSet; j++) {
- point = points[j];
- if (isNullOrNaN(point.canvasy)) {
- if (stepPlot && prevX !== null) {
- // Draw a horizontal line to the start of the missing data
- ctx.beginPath();
- ctx.strokeStyle = color;
- ctx.lineWidth = this.attr_('strokeWidth');
- this._dashedLine(ctx, prevX, prevY, point.canvasx, prevY, strokePattern);
- ctx.stroke();
- }
- // this will make us move to the next point, not draw a line to it.
- prevX = prevY = null;
- } else {
- // A point is "isolated" if it is non-null but both the previous
- // and next points are null.
- var isIsolated = (!prevX && (j == points.length - 1 ||
- isNullOrNaN(points[j+1].canvasy)));
- if (prevX === null) {
- prevX = point.canvasx;
- prevY = point.canvasy;
- } else {
- // Skip over points that will be drawn in the same pixel.
- if (Math.round(prevX) == Math.round(point.canvasx) &&
- Math.round(prevY) == Math.round(point.canvasy)) {
- continue;
- }
- // TODO(antrob): skip over points that lie on a line that is already
- // going to be drawn. There is no need to have more than 2
- // consecutive points that are collinear.
- if (strokeWidth) {
- ctx.beginPath();
- ctx.strokeStyle = color;
- ctx.lineWidth = strokeWidth;
- if (stepPlot) {
- this._dashedLine(ctx, prevX, prevY, point.canvasx, prevY, strokePattern);
- prevX = point.canvasx;
- }
- this._dashedLine(ctx, prevX, prevY, point.canvasx, point.canvasy, strokePattern);
- prevX = point.canvasx;
- prevY = point.canvasy;
- ctx.stroke();
- }
- }
-
- if (drawPoints || isIsolated) {
- ctx.beginPath();
- ctx.fillStyle = color;
- ctx.arc(point.canvasx, point.canvasy, pointSize,
- 0, 2 * Math.PI, false);
- ctx.fill();
- }
- }
- }
+ this._drawLine(ctx, i);
}
-
- context.restore();
};
/**
};
Dygraph.NAME = "Dygraph";
-Dygraph.VERSION = "1.2dev";
+Dygraph.VERSION = "1.2";
Dygraph.__repr__ = function() {
return "[" + this.NAME + " " + this.VERSION + "]";
};
// Default attribute values.
Dygraph.DEFAULT_ATTRS = {
highlightCircleSize: 3,
+ highlightSeriesOpts: null,
+ highlightSeriesBackgroundAlpha: 0.5,
labelsDivWidth: 250,
labelsDivStyles: {
sigFigs: null,
strokeWidth: 1.0,
+ strokeBorderWidth: 0,
+ strokeBorderColor: "white",
axisTickSize: 3,
axisLabelFontSize: 14,
this.boundaryIds_ = [];
this.setIndexByName_ = {};
+ this.datasetIndex_ = [];
// Create the containing DIV and other interactive elements
this.createInterface_();
* @return { ... } The value of the option.
*/
Dygraph.prototype.attr_ = function(name, seriesName) {
- if (this.user_attrs_ !== null && seriesName &&
- typeof(this.user_attrs_[seriesName]) != 'undefined' &&
- this.user_attrs_[seriesName] !== null &&
- typeof(this.user_attrs_[seriesName][name]) != 'undefined') {
- return this.user_attrs_[seriesName][name];
- } else if (this.user_attrs_ !== null && typeof(this.user_attrs_[name]) != 'undefined') {
- return this.user_attrs_[name];
- } else if (this.attrs_ !== null && typeof(this.attrs_[name]) != 'undefined') {
- return this.attrs_[name];
- } else {
- return null;
+
+ var sources = [];
+ sources.push(this.attrs_);
+ if (this.user_attrs_) {
+ sources.push(this.user_attrs_);
+ if (seriesName) {
+ if (this.user_attrs_.hasOwnProperty(seriesName)) {
+ sources.push(this.user_attrs_[seriesName]);
+ }
+ if (seriesName === this.highlightSet_ &&
+ this.user_attrs_.hasOwnProperty('highlightSeriesOpts')) {
+ sources.push(this.user_attrs_['highlightSeriesOpts']);
+ }
+ }
}
+
+ var ret = null;
+ for (var i = sources.length - 1; i >= 0; --i) {
+ var source = sources[i];
+ if (source.hasOwnProperty(name)) {
+ ret = source[name];
+ break;
+ }
+ }
+ return ret;
};
/**
var dygraph = this;
this.mouseMoveHandler = function(e) {
- dygraph.mouseMove_(e);
+ dygraph.mouseMove_(e);
};
Dygraph.addEvent(this.mouseEventElement_, 'mousemove', this.mouseMoveHandler);
this.mouseOutHandler = function(e) {
- dygraph.mouseOut_(e);
+ dygraph.mouseOut_(e);
};
Dygraph.addEvent(this.mouseEventElement_, 'mouseout', this.mouseOutHandler);
// remove mouse event handlers
Dygraph.removeEvent(this.mouseEventElement_, 'mouseout', this.mouseOutHandler);
Dygraph.removeEvent(this.mouseEventElement_, 'mousemove', this.mouseMoveHandler);
+ Dygraph.removeEvent(this.mouseEventElement_, 'mousemove', this.mouseUpHandler_);
removeRecursive(this.maindiv_);
var nullOut = function(obj) {
"top": "0px",
"left": (this.width_ - divWidth - 2) + "px",
"background": "white",
+ "lineHeight": "normal",
"textAlign": "left",
"overflow": "hidden"};
Dygraph.update(messagestyle, this.attr_('labelsDivStyles'));
div.className = "dygraph-legend";
for (var name in messagestyle) {
if (messagestyle.hasOwnProperty(name)) {
- div.style[name] = messagestyle[name];
+ try {
+ div.style[name] = messagestyle[name];
+ } catch (e) {
+ this.warn("You are using unsupported css properties for your browser in labelsDivStyles");
+ }
}
}
this.graphDiv.appendChild(div);
prevEndX: null, // pixel coordinates
prevEndY: null, // pixel coordinates
prevDragDirection: null,
+ cancelNextDblclick: false, // see comment in dygraph-interaction-model.js
// The value on the left side of the graph when a pan operation starts.
initialLeftmostDate: null,
context.py = Dygraph.findPosY(g.canvas_);
context.dragStartX = g.dragGetX_(event, context);
context.dragStartY = g.dragGetY_(event, context);
+ context.cancelNextDblclick = false;
}
};
// If the user releases the mouse button during a drag, but not over the
// canvas, then it doesn't count as a zooming action.
- Dygraph.addEvent(document, 'mouseup', function(event) {
+ this.mouseUpHandler_ = function(event) {
if (context.isZooming || context.isPanning) {
context.isZooming = false;
context.dragStartX = null;
delete self.axes_[i].dragValueRange;
}
}
- });
+ };
+
+ Dygraph.addEvent(document, 'mouseup', this.mouseUpHandler_);
};
/**
};
/**
- * When the mouse moves in the canvas, display information about a nearby data
- * point and draw dots over those points in the data series. This function
- * takes care of cleanup of previously-drawn dots.
- * @param {Object} event The mousemove event from the browser.
- * @private
+ * Get the current graph's area object.
+ *
+ * Returns: {x, y, w, h}
*/
-Dygraph.prototype.mouseMove_ = function(event) {
- // This prevents JS errors when mousing over the canvas before data loads.
- var points = this.layout_.points;
- if (points === undefined) return;
+Dygraph.prototype.getArea = function() {
+ return this.plotter_.area;
+};
+/**
+ * Convert a mouse event to DOM coordinates relative to the graph origin.
+ *
+ * Returns a two-element array: [X, Y].
+ */
+Dygraph.prototype.eventToDomCoords = function(event) {
var canvasx = Dygraph.pageX(event) - Dygraph.findPosX(this.mouseEventElement_);
+ var canvasy = Dygraph.pageY(event) - Dygraph.findPosY(this.mouseEventElement_);
+ return [canvasx, canvasy];
+};
- var lastx = -1;
- var i;
-
- // Loop through all the points and find the date nearest to our current
- // location.
- var minDist = 1e+100;
+/**
+ * Given a canvas X coordinate, find the closest row.
+ * @param {Number} domX graph-relative DOM X coordinate
+ * Returns: row number, integer
+ * @private
+ */
+Dygraph.prototype.findClosestRow = function(domX) {
+ var minDistX = Infinity;
var idx = -1;
- for (i = 0; i < points.length; i++) {
+ var points = this.layout_.points;
+ var l = points.length;
+ for (var i = 0; i < l; i++) {
var point = points[i];
- if (point === null) continue;
- var dist = Math.abs(point.canvasx - canvasx);
- if (dist > minDist) continue;
- minDist = dist;
- idx = i;
+ if (!Dygraph.isValidPoint(point, true)) continue;
+ var dist = Math.abs(point.canvasx - domX);
+ if (dist < minDistX) {
+ minDistX = dist;
+ idx = i;
+ }
}
- if (idx >= 0) lastx = points[idx].xval;
+ return this.idxToRow_(idx);
+};
- // Extract the points we've selected
- this.selPoints_ = [];
- var l = points.length;
- if (!this.attr_("stackedGraph")) {
- for (i = 0; i < l; i++) {
- if (points[i].xval == lastx) {
- this.selPoints_.push(points[i]);
+/**
+ * Given canvas X,Y coordinates, find the closest point.
+ *
+ * This finds the individual data point across all visible series
+ * that's closest to the supplied DOM coordinates using the standard
+ * Euclidean X,Y distance.
+ *
+ * @param {Number} domX graph-relative DOM X coordinate
+ * @param {Number} domY graph-relative DOM Y coordinate
+ * Returns: {row, seriesName, point}
+ * @private
+ */
+Dygraph.prototype.findClosestPoint = function(domX, domY) {
+ var minDist = Infinity;
+ var idx = -1;
+ var points = this.layout_.points;
+ var dist, dx, dy, point, closestPoint, closestSeries;
+ for (var setIdx = 0; setIdx < this.layout_.datasets.length; ++setIdx) {
+ var first = this.layout_.setPointsOffsets[setIdx];
+ var len = this.layout_.setPointsLengths[setIdx];
+ for (var i = 0; i < len; ++i) {
+ var point = points[first + i];
+ if (!Dygraph.isValidPoint(point)) continue;
+ dx = point.canvasx - domX;
+ dy = point.canvasy - domY;
+ dist = dx * dx + dy * dy;
+ if (dist < minDist) {
+ minDist = dist;
+ closestPoint = point;
+ closestSeries = setIdx;
+ idx = i;
}
}
- } else {
- // Need to 'unstack' points starting from the bottom
- var cumulative_sum = 0;
- for (i = l - 1; i >= 0; i--) {
- if (points[i].xval == lastx) {
- var p = {}; // Clone the point since we modify it
- for (var k in points[i]) {
- p[k] = points[i][k];
+ }
+ var name = this.layout_.setNames[closestSeries];
+ return {
+ row: idx + this.getLeftBoundary_(),
+ seriesName: name,
+ point: closestPoint
+ };
+};
+
+/**
+ * Given canvas X,Y coordinates, find the touched area in a stacked graph.
+ *
+ * This first finds the X data point closest to the supplied DOM X coordinate,
+ * then finds the series which puts the Y coordinate on top of its filled area,
+ * using linear interpolation between adjacent point pairs.
+ *
+ * @param {Number} domX graph-relative DOM X coordinate
+ * @param {Number} domY graph-relative DOM Y coordinate
+ * Returns: {row, seriesName, point}
+ * @private
+ */
+Dygraph.prototype.findStackedPoint = function(domX, domY) {
+ var row = this.findClosestRow(domX);
+ var boundary = this.getLeftBoundary_();
+ var rowIdx = row - boundary;
+ var points = this.layout_.points;
+ var closestPoint, closestSeries;
+ for (var setIdx = 0; setIdx < this.layout_.datasets.length; ++setIdx) {
+ var first = this.layout_.setPointsOffsets[setIdx];
+ var len = this.layout_.setPointsLengths[setIdx];
+ if (rowIdx >= len) continue;
+ var p1 = points[first + rowIdx];
+ if (!Dygraph.isValidPoint(p1)) continue;
+ var py = p1.canvasy;
+ if (domX > p1.canvasx && rowIdx + 1 < len) {
+ // interpolate series Y value using next point
+ var p2 = points[first + rowIdx + 1];
+ if (Dygraph.isValidPoint(p2)) {
+ var dx = p2.canvasx - p1.canvasx;
+ if (dx > 0) {
+ var r = (domX - p1.canvasx) / dx;
+ py += r * (p2.canvasy - p1.canvasy);
+ }
+ }
+ } else if (domX < p1.canvasx && rowIdx > 0) {
+ // interpolate series Y value using previous point
+ var p0 = points[first + rowIdx - 1];
+ if (Dygraph.isValidPoint(p0)) {
+ var dx = p1.canvasx - p0.canvasx;
+ if (dx > 0) {
+ var r = (p1.canvasx - domX) / dx;
+ py += r * (p0.canvasy - p1.canvasy);
}
- p.yval -= cumulative_sum;
- cumulative_sum += p.yval;
- this.selPoints_.push(p);
}
}
- this.selPoints_.reverse();
+ // Stop if the point (domX, py) is above this series' upper edge
+ if (setIdx == 0 || py < domY) {
+ closestPoint = p1;
+ closestSeries = setIdx;
+ }
}
+ var name = this.layout_.setNames[closestSeries];
+ return {
+ row: row,
+ seriesName: name,
+ point: closestPoint
+ };
+};
- if (this.attr_("highlightCallback")) {
- var px = this.lastx_;
- if (px !== null && lastx != px) {
- // only fire if the selected point has changed.
- this.attr_("highlightCallback")(event, lastx, this.selPoints_, this.idxToRow_(idx));
+/**
+ * When the mouse moves in the canvas, display information about a nearby data
+ * point and draw dots over those points in the data series. This function
+ * takes care of cleanup of previously-drawn dots.
+ * @param {Object} event The mousemove event from the browser.
+ * @private
+ */
+Dygraph.prototype.mouseMove_ = function(event) {
+ // This prevents JS errors when mousing over the canvas before data loads.
+ var points = this.layout_.points;
+ if (points === undefined) return;
+
+ var canvasCoords = this.eventToDomCoords(event);
+ var canvasx = canvasCoords[0];
+ var canvasy = canvasCoords[1];
+
+ var highlightSeriesOpts = this.attr_("highlightSeriesOpts");
+ var selectionChanged = false;
+ if (highlightSeriesOpts) {
+ var closest;
+ if (this.attr_("stackedGraph")) {
+ closest = this.findStackedPoint(canvasx, canvasy);
+ } else {
+ closest = this.findClosestPoint(canvasx, canvasy);
}
+ selectionChanged = this.setSelection(closest.row, closest.seriesName);
+ } else {
+ var idx = this.findClosestRow(canvasx);
+ selectionChanged = this.setSelection(idx);
}
- // Save last x position for callbacks.
- this.lastx_ = lastx;
+ var callback = this.attr_("highlightCallback");
+ if (callback && selectionChanged) {
+ callback(event, this.lastx_, this.selPoints_, this.lastRow_, this.highlightSet_);
+ }
+};
- this.updateSelection_();
+/**
+ * Fetch left offset from first defined boundaryIds record (see bug #236).
+ */
+Dygraph.prototype.getLeftBoundary_ = function() {
+ for (var i = 0; i < this.boundaryIds_.length; i++) {
+ if (this.boundaryIds_[i] !== undefined) {
+ return this.boundaryIds_[i][0];
+ }
+ }
+ return 0;
};
/**
Dygraph.prototype.idxToRow_ = function(idx) {
if (idx < 0) return -1;
- // make sure that you get the boundaryIds record which is also defined (see bug #236)
- var boundaryIdx = -1;
- for (var i = 0; i < this.boundaryIds_.length; i++) {
- if (this.boundaryIds_[i] !== undefined) {
- boundaryIdx = i;
- break;
- }
- }
- if (boundaryIdx < 0) return -1;
+ var boundary = this.getLeftBoundary_();
for (var setIdx = 0; setIdx < this.layout_.datasets.length; ++setIdx) {
var set = this.layout_.datasets[setIdx];
if (idx < set.length) {
- return this.boundaryIds_[boundaryIdx][0] + idx;
+ return boundary + idx;
}
idx -= set.length;
}
if (html !== '') html += (sepLines ? '<br/>' : ' ');
strokePattern = this.attr_("strokePattern", labels[i]);
dash = this.generateLegendDashHTML_(strokePattern, c, oneEmWidth);
- html += "<span style='font-weight: bold; color: " + c + ";'>" + dash +
+ html += "<span style='font-weight: bold; color: " + c + ";'>" + dash +
" " + labels[i] + "</span>";
}
return html;
c = this.plotter_.colors[pt.name];
var yval = fmtFunc(pt.yval, yOptView, pt.name, this);
+ var cls = (pt.name == this.highlightSet_) ? " class='highlight'" : "";
// TODO(danvk): use a template string here and make it an attribute.
- html += " <b><span style='color: " + c + ";'>" + pt.name +
- "</span></b>:" + yval;
+ html += "<span" + cls + ">" + " <b><span style='color: " + c + ";'>" + pt.name +
+ ":</span></b>" + yval + "</span>";
}
return html;
};
*/
Dygraph.prototype.setLegendHTML_ = function(x, sel_points) {
var labelsDiv = this.attr_("labelsDiv");
+ if (!labelsDiv) return;
+
var sizeSpan = document.createElement('span');
// Calculates the width of 1em in pixels for the legend.
sizeSpan.setAttribute('style', 'margin: 0; padding: 0 0 0 1em; border: 0;');
}
};
+Dygraph.prototype.animateSelection_ = function(direction) {
+ var totalSteps = 10;
+ var millis = 30;
+ if (this.fadeLevel === undefined) this.fadeLevel = 0;
+ if (this.animateId === undefined) this.animateId = 0;
+ var start = this.fadeLevel;
+ var steps = direction < 0 ? start : totalSteps - start;
+ if (steps <= 0) {
+ if (this.fadeLevel) {
+ this.updateSelection_(1.0);
+ }
+ return;
+ }
+
+ var thisId = ++this.animateId;
+ var that = this;
+ Dygraph.repeatAndCleanup(
+ function(n) {
+ // ignore simultaneous animations
+ if (that.animateId != thisId) return;
+
+ that.fadeLevel += direction;
+ if (that.fadeLevel === 0) {
+ that.clearSelection();
+ } else {
+ that.updateSelection_(that.fadeLevel / totalSteps);
+ }
+ },
+ steps, millis, function() {});
+};
+
/**
* Draw dots over the selectied points in the data series. This function
* takes care of cleanup of previously-drawn dots.
* @private
*/
-Dygraph.prototype.updateSelection_ = function() {
+Dygraph.prototype.updateSelection_ = function(opt_animFraction) {
// Clear the previously drawn vertical, if there is one
var i;
var ctx = this.canvas_ctx_;
- if (this.previousVerticalX_ >= 0) {
+ if (this.attr_('highlightSeriesOpts')) {
+ ctx.clearRect(0, 0, this.width_, this.height_);
+ var alpha = 1.0 - this.attr_('highlightSeriesBackgroundAlpha');
+ if (alpha) {
+ // Activating background fade includes an animation effect for a gradual
+ // fade. TODO(klausw): make this independently configurable if it causes
+ // issues? Use a shared preference to control animations?
+ var animateBackgroundFade = true;
+ if (animateBackgroundFade) {
+ if (opt_animFraction === undefined) {
+ // start a new animation
+ this.animateSelection_(1);
+ return;
+ }
+ alpha *= opt_animFraction;
+ }
+ ctx.fillStyle = 'rgba(255,255,255,' + alpha + ')';
+ ctx.fillRect(0, 0, this.width_, this.height_);
+ }
+ var setIdx = this.datasetIndexFromSetName_(this.highlightSet_);
+ this.plotter_._drawLine(ctx, setIdx);
+ } else if (this.previousVerticalX_ >= 0) {
// Determine the maximum highlight circle size.
var maxCircleSize = 0;
var labels = this.attr_('labels');
if (!Dygraph.isOK(pt.canvasy)) continue;
var circleSize = this.attr_('highlightCircleSize', pt.name);
- ctx.beginPath();
- ctx.fillStyle = this.plotter_.colors[pt.name];
- ctx.arc(canvasx, pt.canvasy, circleSize, 0, 2 * Math.PI, false);
- ctx.fill();
+ var callback = this.attr_("drawHighlightPointCallback", pt.name);
+ var color = this.plotter_.colors[pt.name];
+ if (!callback) {
+ callback = Dygraph.Circles.DEFAULT;
+ }
+ ctx.lineWidth = this.attr_('strokeWidth', pt.name);
+ ctx.strokeStyle = color;
+ ctx.fillStyle = color;
+ callback(this.g, pt.name, ctx, canvasx, pt.canvasy,
+ color, circleSize);
}
ctx.restore();
* using getSelection().
* @param { Integer } row number that should be highlighted (i.e. appear with
* hover dots on the chart). Set to false to clear any selection.
+ * @param { seriesName } optional series name to highlight that series with the
+ * the highlightSeriesOpts setting.
*/
-Dygraph.prototype.setSelection = function(row) {
+Dygraph.prototype.setSelection = function(row, opt_seriesName) {
// Extract the points we've selected
this.selPoints_ = [];
var pos = 0;
if (row !== false) {
- row = row - this.boundaryIds_[0][0];
+ row -= this.getLeftBoundary_();
}
+ var changed = false;
if (row !== false && row >= 0) {
+ if (row != this.lastRow_) changed = true;
+ this.lastRow_ = row;
for (var setIdx = 0; setIdx < this.layout_.datasets.length; ++setIdx) {
var set = this.layout_.datasets[setIdx];
if (row < set.length) {
point = this.layout_.unstackPointAtIndex(pos+row);
}
- this.selPoints_.push(point);
+ if (!(point.yval === null)) this.selPoints_.push(point);
}
pos += set.length;
}
+ } else {
+ if (this.lastRow_ >= 0) changed = true;
+ this.lastRow_ = -1;
}
if (this.selPoints_.length) {
this.lastx_ = this.selPoints_[0].xval;
- this.updateSelection_();
} else {
- this.clearSelection();
+ this.lastx_ = -1;
}
+ if (opt_seriesName !== undefined) {
+ if (this.highlightSet_ !== opt_seriesName) changed = true;
+ this.highlightSet_ = opt_seriesName;
+ }
+
+ if (changed) {
+ this.updateSelection_(undefined);
+ }
+ return changed;
};
/**
*/
Dygraph.prototype.clearSelection = function() {
// Get rid of the overlay data
+ if (this.fadeLevel) {
+ this.animateSelection_(-1);
+ return;
+ }
this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_);
+ this.fadeLevel = 0;
this.setLegendHTML_();
this.selPoints_ = [];
this.lastx_ = -1;
+ this.lastRow_ = -1;
+ this.highlightSet_ = null;
};
/**
for (var row=0; row<this.layout_.points.length; row++ ) {
if (this.layout_.points[row].x == this.selPoints_[0].x) {
- return row + this.boundaryIds_[0][0];
+ return row + this.getLeftBoundary_();
}
}
return -1;
};
+Dygraph.prototype.getHighlightSeries = function() {
+ return this.highlightSet_;
+};
+
/**
* Fires when there's data available to be graphed.
* @param {String} data Raw CSV data to be plotted
// rolling averages.
this.rolledSeries_ = [null]; // x-axis is the first series and it's special
for (var i = 1; i < this.numColumns(); i++) {
- var connectSeparatedPoints = this.attr_('connectSeparatedPoints', i);
- var logScale = this.attr_('logscale', i);
- var series = this.extractSeries_(this.rawData_, i, logScale, connectSeparatedPoints);
+ var logScale = this.attr_('logscale', i); // TODO(klausw): this looks wrong
+ var series = this.extractSeries_(this.rawData_, i, logScale);
series = this.rollingAverage(series, this.rollPeriod_);
this.rolledSeries_.push(series);
}
}
actual_y = series[j][1];
+ if (actual_y === null) {
+ series[j] = [x, null];
+ continue;
+ }
+
cumulative_y[x] += actual_y;
series[j] = [x, cumulative_y[x]];
datasets[i] = series;
}
+ // For stacked graphs, a NaN value for any point in the sum should create a
+ // clean gap in the graph. Back-propagate NaNs to all points at this X value.
+ if (this.attr_("stackedGraph")) {
+ for (k = datasets.length - 1; k >= 0; --k) {
+ // Use the first nonempty dataset to get X values.
+ if (!datasets[k]) continue;
+ for (j = 0; j < datasets[k].length; j++) {
+ var x = datasets[k][j][0];
+ if (isNaN(cumulative_y[x])) {
+ // Set all Y values to NaN at that X value.
+ for (i = datasets.length - 1; i >= 0; i--) {
+ if (!datasets[i]) continue;
+ datasets[i][j][1] = NaN;
+ }
+ }
+ }
+ break;
+ }
+ }
+
return [ datasets, extremes, boundaryIds ];
};
if (labels.length > 0) {
this.setIndexByName_[labels[0]] = 0;
}
+ var dataIdx = 0;
for (var i = 1; i < datasets.length; i++) {
this.setIndexByName_[labels[i]] = i;
if (!this.visibility()[i - 1]) continue;
this.layout_.addDataset(labels[i], datasets[i]);
+ this.datasetIndex_[i] = dataIdx++;
}
this.computeYAxisRanges_(extremes);
*
* @private
*/
-Dygraph.prototype.extractSeries_ = function(rawData, i, logScale, connectSeparatedPoints) {
+Dygraph.prototype.extractSeries_ = function(rawData, i, logScale) {
var series = [];
for (var j = 0; j < rawData.length; j++) {
var x = rawData[j][0];
var point = rawData[j][i];
if (logScale) {
// On the log scale, points less than zero do not exist.
- // This will create a gap in the chart. Note that this ignores
- // connectSeparatedPoints.
+ // This will create a gap in the chart.
if (point <= 0) {
point = null;
}
- series.push([x, point]);
- } else {
- if (point !== null || !connectSeparatedPoints) {
- series.push([x, point]);
- }
}
+ series.push([x, point]);
}
return series;
};
// TODO(danvk): use Dygraph.numberValueFormatter here?
/** @private (shut up, jsdoc!) */
this.attrs_.axes.x.valueFormatter = function(x) { return x; };
- this.attrs_.axes.x.ticker = Dygraph.numericTicks;
+ this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter;
}
};
/** @private (shut up, jsdoc!) */
this.attrs_.axes.x.valueFormatter = function(x) { return x; };
this.attrs_.axes.x.axisLabelFormatter = Dygraph.numberAxisLabelFormatter;
- this.attrs_.axes.x.ticker = Dygraph.numericTicks;
+ this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
return data;
}
};
} else if (indepType == 'number') {
this.attrs_.xValueParser = function(x) { return parseFloat(x); };
this.attrs_.axes.x.valueFormatter = function(x) { return x; };
- this.attrs_.axes.x.ticker = Dygraph.numericTicks;
+ this.attrs_.axes.x.ticker = Dygraph.numericLinearTicks;
this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter;
} else {
this.error("only 'date', 'datetime' and 'number' types are supported for " +
};
/**
+ * Get the internal dataset index given its name. These are numbered starting from 0,
+ * and only count visible sets.
+ * @private
+ */
+Dygraph.prototype.datasetIndexFromSetName_ = function(name) {
+ return this.datasetIndex_[this.indexFromSetName(name)];
+};
+
+/**
* @private
* Adds a default style for the annotation CSS classes to the document. This is
* only executed when annotations are actually used. It is designed to only be
};
/**
+ * @private
+ * @param { Object } p The point to consider, valid points are {x, y} objects
+ * @param { Boolean } allowNaNY Treat point with y=NaN as valid
+ * @return { Boolean } Whether the point has numeric x and y.
+ */
+Dygraph.isValidPoint = function(p, allowNaNY) {
+ if (!p) return false; // null or undefined object
+ if (p.yval === null) return false; // missing point
+ if (p.x === null || p.x === undefined) return false;
+ if (p.y === null || p.y === undefined) return false;
+ if (isNaN(p.x) || (!allowNaNY && isNaN(p.y))) return false;
+ return true;
+};
+
+/**
* Number formatting function which mimicks the behavior of %g in printf, i.e.
* either exponential or fixed format (without trailing 0s) is used depending on
* the length of the generated string. The advantage of this format is that
var dateStrSlashed;
var d;
- // Let the system try the format first.
- d = Dygraph.dateStrToMillis(dateStr);
- if (d && !isNaN(d)) return d;
+ // Let the system try the format first, with one caveat:
+ // YYYY-MM-DD[ HH:MM:SS] is interpreted as UTC by a variety of browsers.
+ // dygraphs displays dates in local time, so this will result in surprising
+ // inconsistencies. But if you specify "T" or "Z" (i.e. YYYY-MM-DDTHH:MM:SS),
+ // then you probably know what you're doing, so we'll let you go ahead.
+ // Issue: http://code.google.com/p/dygraphs/issues/detail?id=255
+ if (dateStr.search("-") == -1 ||
+ dateStr.search("T") != -1 || dateStr.search("Z") != -1) {
+ d = Dygraph.dateStrToMillis(dateStr);
+ if (d && !isNaN(d)) return d;
+ }
if (dateStr.search("-") != -1) { // e.g. '2009-7-12' or '2009-07-12'
dateStrSlashed = dateStr.replace("-", "/", "g");
'clickCallback': true,
'digitsAfterDecimal': true,
'drawCallback': true,
+ 'drawHighlightPointCallback': true,
'drawPoints': true,
+ 'drawPointCallback': true,
'drawXGrid': true,
'drawYGrid': true,
'fillAlpha': true,
}
return true;
};
+
+/**
+ * ctx: the canvas context
+ * sides: the number of sides in the shape.
+ * radius: the radius of the image.
+ * cx: center x coordate
+ * cy: center y coordinate
+ * rotationRadians: the shift of the initial angle, in radians.
+ * delta: the angle shift for each line. If missing, creates a regular
+ * polygon.
+ */
+Dygraph.regularShape_ = function(
+ ctx, sides, radius, cx, cy, rotationRadians, delta) {
+ rotationRadians = rotationRadians ? rotationRadians : 0;
+ delta = delta ? delta : Math.PI * 2 / sides;
+
+ ctx.beginPath();
+ var first = true;
+ var initialAngle = rotationRadians;
+ var angle = initialAngle;
+
+ var computeCoordinates = function() {
+ var x = cx + (Math.sin(angle) * radius);
+ var y = cy + (-Math.cos(angle) * radius);
+ return [x, y];
+ };
+
+ var initialCoordinates = computeCoordinates();
+ var x = initialCoordinates[0];
+ var y = initialCoordinates[1];
+ ctx.moveTo(x, y);
+
+ for (var idx = 0; idx < sides; idx++) {
+ angle = (idx == sides - 1) ? initialAngle : (angle + delta);
+ var coords = computeCoordinates();
+ ctx.lineTo(coords[0], coords[1]);
+ }
+ ctx.fill();
+ ctx.stroke();
+}
+
+Dygraph.shapeFunction_ = function(sides, rotationRadians, delta) {
+ return function(g, name, ctx, cx, cy, color, radius) {
+ ctx.strokeStyle = color;
+ ctx.fillStyle = "white";
+ Dygraph.regularShape_(ctx, sides, radius, cx, cy, rotationRadians, delta);
+ };
+};
+
+Dygraph.DrawPolygon_ = function(sides, rotationRadians, ctx, cx, cy, color, radius, delta) {
+ new Dygraph.RegularShape_(sides, rotationRadians, delta).draw(ctx, cx, cy, radius);
+}
+
+Dygraph.Circles = {
+ DEFAULT : function(g, name, ctx, canvasx, canvasy, color, radius) {
+ ctx.beginPath();
+ ctx.fillStyle = color;
+ ctx.arc(canvasx, canvasy, radius, 0, 2 * Math.PI, false);
+ ctx.fill();
+ },
+ TRIANGLE : Dygraph.shapeFunction_(3),
+ SQUARE : Dygraph.shapeFunction_(4, Math.PI / 4),
+ DIAMOND : Dygraph.shapeFunction_(4),
+ PENTAGON : Dygraph.shapeFunction_(5),
+ HEXAGON : Dygraph.shapeFunction_(6),
+ CIRCLE : function(g, name, ctx, cx, cy, color, radius) {
+ ctx.beginPath();
+ ctx.strokeStyle = color;
+ ctx.fillStyle = "white";
+ ctx.arc(cx, cy, radius, 0, 2 * Math.PI, false);
+ ctx.fill();
+ ctx.stroke();
+ },
+ STAR : Dygraph.shapeFunction_(5, 0, 4 * Math.PI / 5),
+ PLUS : function(g, name, ctx, cx, cy, color, radius) {
+ ctx.strokeStyle = color;
+
+ ctx.beginPath();
+ ctx.moveTo(cx + radius, cy);
+ ctx.lineTo(cx - radius, cy);
+ ctx.closePath();
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.moveTo(cx, cy + radius);
+ ctx.lineTo(cx, cy - radius);
+ ctx.closePath();
+ ctx.stroke();
+ },
+ EX : function(g, name, ctx, cx, cy, color, radius) {
+ ctx.strokeStyle = color;
+
+ ctx.beginPath();
+ ctx.moveTo(cx + radius, cy + radius);
+ ctx.lineTo(cx - radius, cy - radius);
+ ctx.closePath();
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.moveTo(cx + radius, cy - radius);
+ ctx.lineTo(cx - radius, cy + radius);
+ ctx.closePath();
+ ctx.stroke();
+ }
+};
/**
* @license
* Copyright 2011 Dan Vanderkam (danvdk@gmail.com)
// Record the range of each y-axis at the start of the drag.
// If any axis has a valueRange or valueWindow, then we want a 2D pan.
+ // We can't store data directly in g.axes_, because it does not belong to us
+ // and could change out from under us during a pan (say if there's a data
+ // update).
context.is2DPan = false;
+ context.axes = [];
for (i = 0; i < g.axes_.length; i++) {
axis = g.axes_[i];
+ var axis_data = {};
var yRange = g.yAxisRange(i);
// TODO(konigsberg): These values should be in |context|.
// In log scale, initialTopValue, dragValueRange and unitsPerPixel are log scale.
if (axis.logscale) {
- axis.initialTopValue = Dygraph.log10(yRange[1]);
- axis.dragValueRange = Dygraph.log10(yRange[1]) - Dygraph.log10(yRange[0]);
+ axis_data.initialTopValue = Dygraph.log10(yRange[1]);
+ axis_data.dragValueRange = Dygraph.log10(yRange[1]) - Dygraph.log10(yRange[0]);
} else {
- axis.initialTopValue = yRange[1];
- axis.dragValueRange = yRange[1] - yRange[0];
+ axis_data.initialTopValue = yRange[1];
+ axis_data.dragValueRange = yRange[1] - yRange[0];
}
- axis.unitsPerPixel = axis.dragValueRange / (g.plotter_.area.h - 1);
+ axis_data.unitsPerPixel = axis_data.dragValueRange / (g.plotter_.area.h - 1);
+ context.axes.push(axis_data);
// While calculating axes, set 2dpan.
if (axis.valueWindow || axis.valueRange) context.is2DPan = true;
// Adjust each axis appropriately.
for (var i = 0; i < g.axes_.length; i++) {
var axis = g.axes_[i];
+ var axis_data = context.axes[i];
var pixelsDragged = context.dragEndY - context.dragStartY;
- var unitsDragged = pixelsDragged * axis.unitsPerPixel;
+ var unitsDragged = pixelsDragged * axis_data.unitsPerPixel;
var boundedValue = context.boundedValues ? context.boundedValues[i] : null;
// In log scale, maxValue and minValue are the logs of those values.
- var maxValue = axis.initialTopValue + unitsDragged;
+ var maxValue = axis_data.initialTopValue + unitsDragged;
if (boundedValue) {
maxValue = Math.min(maxValue, boundedValue[1]);
}
- var minValue = maxValue - axis.dragValueRange;
+ var minValue = maxValue - axis_data.dragValueRange;
if (boundedValue) {
if (minValue < boundedValue[0]) {
// Adjust maxValue, and recompute minValue.
maxValue = maxValue - (minValue - boundedValue[0]);
- minValue = maxValue - axis.dragValueRange;
+ minValue = maxValue - axis_data.dragValueRange;
}
}
if (axis.logscale) {
* Custom interaction model builders can use it to provide the default
* panning behavior.
*
- * @param { Event } event the event object which led to the startZoom call.
+ * @param { Event } event the event object which led to the endPan call.
* @param { Dygraph} g The dygraph on which to act.
* @param { Object} context The dragging context object (with
* dragStartX/dragStartY/etc. properties). This function modifies the context.
Dygraph.Interaction.treatMouseOpAsClick(g, event, context);
}
- // TODO(konigsberg): Clear the context data from the axis.
- // (replace with "context = {}" ?)
// TODO(konigsberg): mouseup should just delete the
// context object, and mousedown should create a new one.
context.isPanning = false;
context.valueRange = null;
context.boundedDates = null;
context.boundedValues = null;
+ context.axes = null;
};
/**
if (regionWidth >= 10 && context.dragDirection == Dygraph.HORIZONTAL) {
g.doZoomX_(Math.min(context.dragStartX, context.dragEndX),
Math.max(context.dragStartX, context.dragEndX));
+ context.cancelNextDblclick = true;
} else if (regionHeight >= 10 && context.dragDirection == Dygraph.VERTICAL) {
g.doZoomY_(Math.min(context.dragStartY, context.dragEndY),
Math.max(context.dragStartY, context.dragEndY));
+ context.cancelNextDblclick = true;
} else {
g.clearZoomRect_();
}
};
/**
+ * @private
+ */
+Dygraph.Interaction.startTouch = function(event, g, context) {
+ event.preventDefault(); // touch browsers are all nice.
+ var touches = [];
+ for (var i = 0; i < event.touches.length; i++) {
+ var t = event.touches[i];
+ // we dispense with 'dragGetX_' because all touchBrowsers support pageX
+ touches.push({
+ pageX: t.pageX,
+ pageY: t.pageY,
+ dataX: g.toDataXCoord(t.pageX),
+ dataY: g.toDataYCoord(t.pageY)
+ // identifier: t.identifier
+ });
+ }
+ context.initialTouches = touches;
+
+ if (touches.length == 1) {
+ // This is just a swipe.
+ context.initialPinchCenter = touches[0];
+ context.touchDirections = { x: true, y: true };
+ } else if (touches.length == 2) {
+ // It's become a pinch!
+
+ // only screen coordinates can be averaged (data coords could be log scale).
+ context.initialPinchCenter = {
+ pageX: 0.5 * (touches[0].pageX + touches[1].pageX),
+ pageY: 0.5 * (touches[0].pageY + touches[1].pageY),
+
+ // TODO(danvk): remove
+ dataX: 0.5 * (touches[0].dataX + touches[1].dataX),
+ dataY: 0.5 * (touches[0].dataY + touches[1].dataY)
+ };
+
+ // Make pinches in a 45-degree swath around either axis 1-dimensional zooms.
+ var initialAngle = 180 / Math.PI * Math.atan2(
+ context.initialPinchCenter.pageY - touches[0].pageY,
+ touches[0].pageX - context.initialPinchCenter.pageX);
+
+ // use symmetry to get it into the first quadrant.
+ initialAngle = Math.abs(initialAngle);
+ if (initialAngle > 90) initialAngle = 90 - initialAngle;
+
+ context.touchDirections = {
+ x: (initialAngle < (90 - 45/2)),
+ y: (initialAngle > 45/2)
+ };
+ }
+
+ // save the full x & y ranges.
+ context.initialRange = {
+ x: g.xAxisRange(),
+ y: g.yAxisRange()
+ };
+};
+
+/**
+ * @private
+ */
+Dygraph.Interaction.moveTouch = function(event, g, context) {
+ var i, touches = [];
+ for (i = 0; i < event.touches.length; i++) {
+ var t = event.touches[i];
+ touches.push({
+ pageX: t.pageX,
+ pageY: t.pageY
+ });
+ }
+ var initialTouches = context.initialTouches;
+
+ var c_now;
+
+ // old and new centers.
+ var c_init = context.initialPinchCenter;
+ if (touches.length == 1) {
+ c_now = touches[0];
+ } else {
+ c_now = {
+ pageX: 0.5 * (touches[0].pageX + touches[1].pageX),
+ pageY: 0.5 * (touches[0].pageY + touches[1].pageY)
+ };
+ }
+
+ // this is the "swipe" component
+ // we toss it out for now, but could use it in the future.
+ var swipe = {
+ pageX: c_now.pageX - c_init.pageX,
+ pageY: c_now.pageY - c_init.pageY
+ };
+ var dataWidth = context.initialRange.x[1] - context.initialRange.x[0];
+ var dataHeight = context.initialRange.y[0] - context.initialRange.y[1];
+ swipe.dataX = (swipe.pageX / g.plotter_.area.w) * dataWidth;
+ swipe.dataY = (swipe.pageY / g.plotter_.area.h) * dataHeight;
+ var xScale, yScale;
+
+ // The residual bits are usually split into scale & rotate bits, but we split
+ // them into x-scale and y-scale bits.
+ if (touches.length == 1) {
+ xScale = 1.0;
+ yScale = 1.0;
+ } else if (touches.length == 2) {
+ var initHalfWidth = (initialTouches[1].pageX - c_init.pageX);
+ xScale = (touches[1].pageX - c_now.pageX) / initHalfWidth;
+
+ var initHalfHeight = (initialTouches[1].pageY - c_init.pageY);
+ yScale = (touches[1].pageY - c_now.pageY) / initHalfHeight;
+ }
+
+ // Clip scaling to [1/8, 8] to prevent too much blowup.
+ xScale = Math.min(8, Math.max(0.125, xScale));
+ yScale = Math.min(8, Math.max(0.125, yScale));
+
+ if (context.touchDirections.x) {
+ g.dateWindow_ = [
+ c_init.dataX - swipe.dataX + (context.initialRange.x[0] - c_init.dataX) / xScale,
+ c_init.dataX - swipe.dataX + (context.initialRange.x[1] - c_init.dataX) / xScale
+ ];
+ }
+
+ if (context.touchDirections.y) {
+ for (i = 0; i < 1 /*g.axes_.length*/; i++) {
+ var axis = g.axes_[i];
+ if (axis.logscale) {
+ // TODO(danvk): implement
+ } else {
+ axis.valueWindow = [
+ c_init.dataY - swipe.dataY + (context.initialRange.y[0] - c_init.dataY) / yScale,
+ c_init.dataY - swipe.dataY + (context.initialRange.y[1] - c_init.dataY) / yScale
+ ];
+ }
+ }
+ }
+
+ g.drawGraph_(false);
+};
+
+/**
+ * @private
+ */
+Dygraph.Interaction.endTouch = function(event, g, context) {
+ if (event.touches.length != 0) {
+ // this is effectively a "reset"
+ Dygraph.Interaction.startTouch(event, g, context);
+ }
+};
+
+/**
* Default interation model for dygraphs. You can refer to specific elements of
* this when constructing your own interaction model, e.g.:
* g.updateOptions( {
Dygraph.Interaction.defaultModel = {
// Track the beginning of drag events
mousedown: function(event, g, context) {
+ // Right-click should not initiate a zoom.
+ if (event.button && event.button == 2) return;
+
context.initializeMouseDown(event, g, context);
if (event.altKey || event.shiftKey) {
}
},
+ touchstart: function(event, g, context) {
+ Dygraph.Interaction.startTouch(event, g, context);
+ },
+ touchmove: function(event, g, context) {
+ Dygraph.Interaction.moveTouch(event, g, context);
+ },
+ touchend: function(event, g, context) {
+ Dygraph.Interaction.endTouch(event, g, context);
+ },
+
// Temporarily cancel the dragging event when the mouse leaves the graph
mouseout: function(event, g, context) {
if (context.isZooming) {
// Disable zooming out if panning.
dblclick: function(event, g, context) {
+ if (context.cancelNextDblclick) {
+ context.cancelNextDblclick = false;
+ return;
+ }
if (event.altKey || event.shiftKey) {
return;
}
/*global Dygraph:false */
"use strict";
+Dygraph.numericLinearTicks = function(a, b, pixels, opts, dygraph, vals) {
+ var nonLogscaleOpts = function(opt) {
+ if (opt === 'logscale') return false;
+ return opts(opt);
+ };
+ return Dygraph.numericTicks(a, b, pixels, nonLogscaleOpts, dygraph, vals);
+};
+
Dygraph.numericTicks = function(a, b, pixels, opts, dygraph, vals) {
var pixels_per_tick = opts('pixelsPerLabel');
var ticks = [];
var k_labels = [];
if (opts("labelsKMB")) {
k = 1000;
- k_labels = [ "K", "M", "B", "T" ];
+ k_labels = [ "K", "M", "B", "T", "Q" ];
}
if (opts("labelsKMG2")) {
if (k) Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
k = 1024;
- k_labels = [ "k", "M", "G", "T" ];
+ k_labels = [ "k", "M", "G", "T", "P", "E" ];
}
var formatter = opts('axisLabelFormatter');
if (k_labels.length > 0) {
// TODO(danvk): should this be integrated into the axisLabelFormatter?
// Round up to an appropriate unit.
- var n = k*k*k*k;
- for (j = 3; j >= 0; j--, n /= k) {
+ var n = Math.pow(k, k_labels.length);
+ for (j = k_labels.length - 1; j >= 0; j--, n /= k) {
if (absTickV >= n) {
label = Dygraph.round_(tickV / n, opts('digitsAfterDecimal')) +
k_labels[j];
-"use strict";var DygraphLayout=function(a){this.dygraph_=a;this.datasets=[];this.setNames=[];this.annotations=[];this.yAxes_=null;this.xTicks_=null;this.yTicks_=null};DygraphLayout.prototype.attr_=function(a){return this.dygraph_.attr_(a)};DygraphLayout.prototype.addDataset=function(a,b){this.datasets.push(b);this.setNames.push(a)};DygraphLayout.prototype.getPlotArea=function(){return this.computePlotArea_()};DygraphLayout.prototype.computePlotArea_=function(){var a={x:0,y:0};if(this.attr_("drawYAxis")){a.x=this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize")}a.w=this.dygraph_.width_-a.x-this.attr_("rightGap");a.h=this.dygraph_.height_;if(this.attr_("drawXAxis")){if(this.attr_("xAxisHeight")){a.h-=this.attr_("xAxisHeight")}else{a.h-=this.attr_("axisLabelFontSize")+2*this.attr_("axisTickSize")}}if(this.dygraph_.numAxes()==2){a.w-=(this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize"))}else{if(this.dygraph_.numAxes()>2){this.dygraph_.error("Only two y-axes are supported at this time. (Trying to use "+this.dygraph_.numAxes()+")")}}if(this.attr_("title")){a.h-=this.attr_("titleHeight");a.y+=this.attr_("titleHeight")}if(this.attr_("xlabel")){a.h-=this.attr_("xLabelHeight")}if(this.attr_("ylabel")){}if(this.attr_("y2label")){}if(this.attr_("showRangeSelector")){a.h-=this.attr_("rangeSelectorHeight")+4}return a};DygraphLayout.prototype.setAnnotations=function(d){this.annotations=[];var e=this.attr_("xValueParser")||function(a){return a};for(var c=0;c<d.length;c++){var b={};if(!d[c].xval&&!d[c].x){this.dygraph_.error("Annotations must have an 'x' property");return}if(d[c].icon&&!(d[c].hasOwnProperty("width")&&d[c].hasOwnProperty("height"))){this.dygraph_.error("Must set width and height when setting annotation.icon property");return}Dygraph.update(b,d[c]);if(!b.xval){b.xval=e(b.x)}this.annotations.push(b)}};DygraphLayout.prototype.setXTicks=function(a){this.xTicks_=a};DygraphLayout.prototype.setYAxes=function(a){this.yAxes_=a};DygraphLayout.prototype.setDateWindow=function(a){this.dateWindow_=a};DygraphLayout.prototype.evaluate=function(){this._evaluateLimits();this._evaluateLineCharts();this._evaluateLineTicks();this._evaluateAnnotations()};DygraphLayout.prototype._evaluateLimits=function(){this.minxval=this.maxxval=null;if(this.dateWindow_){this.minxval=this.dateWindow_[0];this.maxxval=this.dateWindow_[1]}else{for(var f=0;f<this.datasets.length;++f){var d=this.datasets[f];if(d.length>1){var b=d[0][0];if(!this.minxval||b<this.minxval){this.minxval=b}var a=d[d.length-1][0];if(!this.maxxval||a>this.maxxval){this.maxxval=a}}}}this.xrange=this.maxxval-this.minxval;this.xscale=(this.xrange!==0?1/this.xrange:1);for(var c=0;c<this.yAxes_.length;c++){var e=this.yAxes_[c];e.minyval=e.computedValueRange[0];e.maxyval=e.computedValueRange[1];e.yrange=e.maxyval-e.minyval;e.yscale=(e.yrange!==0?1/e.yrange:1);if(e.g.attr_("logscale")){e.ylogrange=Dygraph.log10(e.maxyval)-Dygraph.log10(e.minyval);e.ylogscale=(e.ylogrange!==0?1/e.ylogrange:1);if(!isFinite(e.ylogrange)||isNaN(e.ylogrange)){e.g.error("axis "+c+" of graph at "+e.g+" can't be displayed in log scale for range ["+e.minyval+" - "+e.maxyval+"]")}}}};DygraphLayout._calcYNormal=function(a,b){if(a.logscale){return 1-((Dygraph.log10(b)-Dygraph.log10(a.minyval))*a.ylogscale)}else{return 1-((b-a.minyval)*a.yscale)}};DygraphLayout.prototype._evaluateLineCharts=function(){this.points=[];this.setPointsLengths=[];this.setPointsOffsets=[];for(var a=0;a<this.datasets.length;++a){var c=this.datasets[a];var g=this.setNames[a];var b=this.dygraph_.axisPropertiesForSeries(g);this.setPointsOffsets.push(this.points.length);var h=0;for(var e=0;e<c.length;e++){var m=c[e];var d=parseFloat(m[0]);var i=parseFloat(m[1]);var l=(d-this.minxval)*this.xscale;var f=DygraphLayout._calcYNormal(b,i);var k={x:l,y:f,xval:d,yval:i,name:g};this.points.push(k);h+=1}this.setPointsLengths.push(h)}};DygraphLayout.prototype._evaluateLineTicks=function(){var d,c,b,f;this.xticks=[];for(d=0;d<this.xTicks_.length;d++){c=this.xTicks_[d];b=c.label;f=this.xscale*(c.v-this.minxval);if((f>=0)&&(f<=1)){this.xticks.push([f,b])}}this.yticks=[];for(d=0;d<this.yAxes_.length;d++){var e=this.yAxes_[d];for(var a=0;a<e.ticks.length;a++){c=e.ticks[a];b=c.label;f=this.dygraph_.toPercentYCoord(c.v,d);if((f>=0)&&(f<=1)){this.yticks.push([d,f,b])}}}};DygraphLayout.prototype.evaluateWithError=function(){this.evaluate();if(!(this.attr_("errorBars")||this.attr_("customBars"))){return}var h=0;for(var a=0;a<this.datasets.length;++a){var g=0;var f=this.datasets[a];var l=this.setNames[a];var e=this.dygraph_.axisPropertiesForSeries(l);for(g=0;g<f.length;g++,h++){var o=f[g];var c=parseFloat(o[0]);var m=parseFloat(o[1]);if(c==this.points[h].xval&&m==this.points[h].yval){var k=parseFloat(o[2]);var d=parseFloat(o[3]);var n=m-k;var b=m+d;this.points[h].y_top=DygraphLayout._calcYNormal(e,n);this.points[h].y_bottom=DygraphLayout._calcYNormal(e,b)}}}};DygraphLayout.prototype._evaluateAnnotations=function(){var d;var f={};for(d=0;d<this.annotations.length;d++){var b=this.annotations[d];f[b.xval+","+b.series]=b}this.annotated_points=[];if(!this.annotations||!this.annotations.length){return}for(d=0;d<this.points.length;d++){var e=this.points[d];var c=e.xval+","+e.name;if(c in f){e.annotation=f[c];this.annotated_points.push(e)}}};DygraphLayout.prototype.removeAllDatasets=function(){delete this.datasets;delete this.setNames;delete this.setPointsLengths;delete this.setPointsOffsets;this.datasets=[];this.setNames=[];this.setPointsLengths=[];this.setPointsOffsets=[]};DygraphLayout.prototype.unstackPointAtIndex=function(b){var a=this.points[b];var d={};for(var e in a){d[e]=a[e]}if(!this.attr_("stackedGraph")){return d}for(var c=b+1;c<this.points.length;c++){if(this.points[c].xval==a.xval){d.yval-=this.points[c].yval;break}}return d};"use strict";var DygraphCanvasRenderer=function(d,c,b,e){this.dygraph_=d;this.layout=e;this.element=c;this.elementContext=b;this.container=this.element.parentNode;this.height=this.element.height;this.width=this.element.width;if(!this.isIE&&!(DygraphCanvasRenderer.isSupported(this.element))){throw"Canvas is not supported."}this.xlabels=[];this.ylabels=[];this.annotations=[];this.chartLabels={};this.area=e.getPlotArea();this.container.style.position="relative";this.container.style.width=this.width+"px";if(this.dygraph_.isUsingExcanvas_){this._createIEClipArea()}else{if(!Dygraph.isAndroid()){var a=this.dygraph_.canvas_ctx_;a.beginPath();a.rect(this.area.x,this.area.y,this.area.w,this.area.h);a.clip();a=this.dygraph_.hidden_ctx_;a.beginPath();a.rect(this.area.x,this.area.y,this.area.w,this.area.h);a.clip()}}};DygraphCanvasRenderer.prototype.attr_=function(a){return this.dygraph_.attr_(a)};DygraphCanvasRenderer.prototype.clear=function(){var c;if(this.isIE){try{if(this.clearDelay){this.clearDelay.cancel();this.clearDelay=null}c=this.elementContext}catch(f){return}}c=this.elementContext;c.clearRect(0,0,this.width,this.height);function a(g){for(var e=0;e<g.length;e++){var h=g[e];if(h.parentNode){h.parentNode.removeChild(h)}}}a(this.xlabels);a(this.ylabels);a(this.annotations);for(var b in this.chartLabels){if(!this.chartLabels.hasOwnProperty(b)){continue}var d=this.chartLabels[b];if(d.parentNode){d.parentNode.removeChild(d)}}this.xlabels=[];this.ylabels=[];this.annotations=[];this.chartLabels={}};DygraphCanvasRenderer.isSupported=function(f){var b=null;try{if(typeof(f)=="undefined"||f===null){b=document.createElement("canvas")}else{b=f}b.getContext("2d")}catch(c){var d=navigator.appVersion.match(/MSIE (\d\.\d)/);var a=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);if((!d)||(d[1]<6)||(a)){return false}return true}return true};DygraphCanvasRenderer.prototype.setColors=function(a){this.colorScheme_=a};DygraphCanvasRenderer.prototype.render=function(){var b=this.elementContext;function c(h){return Math.round(h)+0.5}function g(h){return Math.round(h)-0.5}if(this.attr_("underlayCallback")){this.attr_("underlayCallback")(b,this.area,this.dygraph_,this.dygraph_)}var a,f,d,e;if(this.attr_("drawYGrid")){e=this.layout.yticks;b.save();b.strokeStyle=this.attr_("gridLineColor");b.lineWidth=this.attr_("gridLineWidth");for(d=0;d<e.length;d++){if(e[d][0]!==0){continue}a=c(this.area.x);f=g(this.area.y+e[d][1]*this.area.h);b.beginPath();b.moveTo(a,f);b.lineTo(a+this.area.w,f);b.closePath();b.stroke()}}if(this.attr_("drawXGrid")){e=this.layout.xticks;b.save();b.strokeStyle=this.attr_("gridLineColor");b.lineWidth=this.attr_("gridLineWidth");for(d=0;d<e.length;d++){a=c(this.area.x+e[d][0]*this.area.w);f=g(this.area.y+this.area.h);b.beginPath();b.moveTo(a,f);b.lineTo(a,this.area.y);b.closePath();b.stroke()}}this._renderLineChart();this._renderAxis();this._renderChartLabels();this._renderAnnotations()};DygraphCanvasRenderer.prototype._createIEClipArea=function(){var g="dygraph-clip-div";var f=this.dygraph_.graphDiv;for(var e=f.childNodes.length-1;e>=0;e--){if(f.childNodes[e].className==g){f.removeChild(f.childNodes[e])}}var c=document.bgColor;var d=this.dygraph_.graphDiv;while(d!=document){var a=d.currentStyle.backgroundColor;if(a&&a!="transparent"){c=a;break}d=d.parentNode}function b(j){if(j.w===0||j.h===0){return}var i=document.createElement("div");i.className=g;i.style.backgroundColor=c;i.style.position="absolute";i.style.left=j.x+"px";i.style.top=j.y+"px";i.style.width=j.w+"px";i.style.height=j.h+"px";f.appendChild(i)}var h=this.area;b({x:0,y:0,w:h.x,h:this.height});b({x:h.x,y:0,w:this.width-h.x,h:h.y});b({x:h.x+h.w,y:0,w:this.width-h.x-h.w,h:this.height});b({x:h.x,y:h.y+h.h,w:this.width-h.x,h:this.height-h.h-h.y})};DygraphCanvasRenderer.prototype._renderAxis=function(){if(!this.attr_("drawXAxis")&&!this.attr_("drawYAxis")){return}function q(i){return Math.round(i)+0.5}function p(i){return Math.round(i)-0.5}var d=this.elementContext;var l,n,m,s,r;var a={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,color:this.attr_("axisLabelColor"),width:this.attr_("axisLabelWidth")+"px",lineHeight:"normal",overflow:"hidden"};var g=function(i,v,w){var x=document.createElement("div");for(var u in a){if(a.hasOwnProperty(u)){x.style[u]=a[u]}}var t=document.createElement("div");t.className="dygraph-axis-label dygraph-axis-label-"+v+(w?" dygraph-axis-label-"+w:"");t.innerHTML=i;x.appendChild(t);return x};d.save();d.strokeStyle=this.attr_("axisLineColor");d.lineWidth=this.attr_("axisLineWidth");if(this.attr_("drawYAxis")){if(this.layout.yticks&&this.layout.yticks.length>0){var b=this.dygraph_.numAxes();for(r=0;r<this.layout.yticks.length;r++){s=this.layout.yticks[r];if(typeof(s)=="function"){return}n=this.area.x;var j=1;var c="y1";if(s[0]==1){n=this.area.x+this.area.w;j=-1;c="y2"}m=this.area.y+s[1]*this.area.h;l=g(s[2],"y",b==2?c:null);var o=(m-this.attr_("axisLabelFontSize")/2);if(o<0){o=0}if(o+this.attr_("axisLabelFontSize")+3>this.height){l.style.bottom="0px"}else{l.style.top=o+"px"}if(s[0]===0){l.style.left=(this.area.x-this.attr_("yAxisLabelWidth")-this.attr_("axisTickSize"))+"px";l.style.textAlign="right"}else{if(s[0]==1){l.style.left=(this.area.x+this.area.w+this.attr_("axisTickSize"))+"px";l.style.textAlign="left"}}l.style.width=this.attr_("yAxisLabelWidth")+"px";this.container.appendChild(l);this.ylabels.push(l)}var h=this.ylabels[0];var e=this.attr_("axisLabelFontSize");var k=parseInt(h.style.top,10)+e;if(k>this.height-e){h.style.top=(parseInt(h.style.top,10)-e/2)+"px"}}d.beginPath();d.moveTo(q(this.area.x),p(this.area.y));d.lineTo(q(this.area.x),p(this.area.y+this.area.h));d.closePath();d.stroke();if(this.dygraph_.numAxes()==2){d.beginPath();d.moveTo(p(this.area.x+this.area.w),p(this.area.y));d.lineTo(p(this.area.x+this.area.w),p(this.area.y+this.area.h));d.closePath();d.stroke()}}if(this.attr_("drawXAxis")){if(this.layout.xticks){for(r=0;r<this.layout.xticks.length;r++){s=this.layout.xticks[r];n=this.area.x+s[0]*this.area.w;m=this.area.y+this.area.h;l=g(s[1],"x");l.style.textAlign="center";l.style.top=(m+this.attr_("axisTickSize"))+"px";var f=(n-this.attr_("axisLabelWidth")/2);if(f+this.attr_("axisLabelWidth")>this.width){f=this.width-this.attr_("xAxisLabelWidth");l.style.textAlign="right"}if(f<0){f=0;l.style.textAlign="left"}l.style.left=f+"px";l.style.width=this.attr_("xAxisLabelWidth")+"px";this.container.appendChild(l);this.xlabels.push(l)}}d.beginPath();d.moveTo(q(this.area.x),p(this.area.y+this.area.h));d.lineTo(q(this.area.x+this.area.w),p(this.area.y+this.area.h));d.closePath();d.stroke()}d.restore()};DygraphCanvasRenderer.prototype._renderChartLabels=function(){var d,a;if(this.attr_("title")){d=document.createElement("div");d.style.position="absolute";d.style.top="0px";d.style.left=this.area.x+"px";d.style.width=this.area.w+"px";d.style.height=this.attr_("titleHeight")+"px";d.style.textAlign="center";d.style.fontSize=(this.attr_("titleHeight")-8)+"px";d.style.fontWeight="bold";a=document.createElement("div");a.className="dygraph-label dygraph-title";a.innerHTML=this.attr_("title");d.appendChild(a);this.container.appendChild(d);this.chartLabels.title=d}if(this.attr_("xlabel")){d=document.createElement("div");d.style.position="absolute";d.style.bottom=0;d.style.left=this.area.x+"px";d.style.width=this.area.w+"px";d.style.height=this.attr_("xLabelHeight")+"px";d.style.textAlign="center";d.style.fontSize=(this.attr_("xLabelHeight")-2)+"px";a=document.createElement("div");a.className="dygraph-label dygraph-xlabel";a.innerHTML=this.attr_("xlabel");d.appendChild(a);this.container.appendChild(d);this.chartLabels.xlabel=d}var c=this;function b(h,g,f){var i={left:0,top:c.area.y,width:c.attr_("yLabelWidth"),height:c.area.h};d=document.createElement("div");d.style.position="absolute";if(h==1){d.style.left=i.left}else{d.style.right=i.left}d.style.top=i.top+"px";d.style.width=i.width+"px";d.style.height=i.height+"px";d.style.fontSize=(c.attr_("yLabelWidth")-2)+"px";var e=document.createElement("div");e.style.position="absolute";e.style.width=i.height+"px";e.style.height=i.width+"px";e.style.top=(i.height/2-i.width/2)+"px";e.style.left=(i.width/2-i.height/2)+"px";e.style.textAlign="center";var j="rotate("+(h==1?"-":"")+"90deg)";e.style.transform=j;e.style.WebkitTransform=j;e.style.MozTransform=j;e.style.OTransform=j;e.style.msTransform=j;if(typeof(document.documentMode)!=="undefined"&&document.documentMode<9){e.style.filter="progid:DXImageTransform.Microsoft.BasicImage(rotation="+(h==1?"3":"1")+")";e.style.left="0px";e.style.top="0px"}a=document.createElement("div");a.className=g;a.innerHTML=f;e.appendChild(a);d.appendChild(e);return d}var d;if(this.attr_("ylabel")){d=b(1,"dygraph-label dygraph-ylabel",this.attr_("ylabel"));this.container.appendChild(d);this.chartLabels.ylabel=d}if(this.attr_("y2label")&&this.dygraph_.numAxes()==2){d=b(2,"dygraph-label dygraph-y2label",this.attr_("y2label"));this.container.appendChild(d);this.chartLabels.y2label=d}};DygraphCanvasRenderer.prototype._renderAnnotations=function(){var h={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,overflow:"hidden"};var j=function(i,q,r,a){return function(s){var p=r.annotation;if(p.hasOwnProperty(i)){p[i](p,r,a.dygraph_,s)}else{if(a.dygraph_.attr_(q)){a.dygraph_.attr_(q)(p,r,a.dygraph_,s)}}}};var m=this.layout.annotated_points;for(var g=0;g<m.length;g++){var e=m[g];if(e.canvasx<this.area.x||e.canvasx>this.area.x+this.area.w){continue}var k=e.annotation;var l=6;if(k.hasOwnProperty("tickHeight")){l=k.tickHeight}var c=document.createElement("div");for(var b in h){if(h.hasOwnProperty(b)){c.style[b]=h[b]}}if(!k.hasOwnProperty("icon")){c.className="dygraphDefaultAnnotation"}if(k.hasOwnProperty("cssClass")){c.className+=" "+k.cssClass}var d=k.hasOwnProperty("width")?k.width:16;var n=k.hasOwnProperty("height")?k.height:16;if(k.hasOwnProperty("icon")){var f=document.createElement("img");f.src=k.icon;f.width=d;f.height=n;c.appendChild(f)}else{if(e.annotation.hasOwnProperty("shortText")){c.appendChild(document.createTextNode(e.annotation.shortText))}}c.style.left=(e.canvasx-d/2)+"px";if(k.attachAtBottom){c.style.top=(this.area.h-n-l)+"px"}else{c.style.top=(e.canvasy-n-l)+"px"}c.style.width=d+"px";c.style.height=n+"px";c.title=e.annotation.text;c.style.color=this.colors[e.name];c.style.borderColor=this.colors[e.name];k.div=c;Dygraph.addEvent(c,"click",j("clickHandler","annotationClickHandler",e,this));Dygraph.addEvent(c,"mouseover",j("mouseOverHandler","annotationMouseOverHandler",e,this));Dygraph.addEvent(c,"mouseout",j("mouseOutHandler","annotationMouseOutHandler",e,this));Dygraph.addEvent(c,"dblclick",j("dblClickHandler","annotationDblClickHandler",e,this));this.container.appendChild(c);this.annotations.push(c);var o=this.elementContext;o.strokeStyle=this.colors[e.name];o.beginPath();if(!k.attachAtBottom){o.moveTo(e.canvasx,e.canvasy);o.lineTo(e.canvasx,e.canvasy-2-l)}else{o.moveTo(e.canvasx,this.area.h);o.lineTo(e.canvasx,this.area.h-2-l)}o.closePath();o.stroke()}};DygraphCanvasRenderer.prototype._renderLineChart=function(){var F=function(i){return(i===null||isNaN(i))};var L=this.elementContext;var l=this.attr_("fillAlpha");var B=this.attr_("errorBars")||this.attr_("customBars");var k=this.attr_("fillGraph");var v=this.attr_("stackedGraph");var u=this.attr_("stepPlot");var z=this.layout.points;var y=z.length;var t,J,H,b,a,f,s,E,m,C,h,d,q;var D=this.layout.setNames;var w=D.length;this.colors={};for(J=0;J<w;J++){this.colors[D[J]]=this.colorScheme_[J%this.colorScheme_.length]}for(J=y;J--;){t=z[J];t.canvasx=this.area.w*t.x+this.area.x;t.canvasy=this.area.h*t.y+this.area.y}var p=L;if(B){if(k){this.dygraph_.warn("Can't use fillGraph option with error bars")}for(J=0;J<w;J++){E=D[J];q=this.dygraph_.axisPropertiesForSeries(E);s=this.colors[E];p.save();b=NaN;a=NaN;f=[-1,-1];d=q.yscale;h=new RGBColor(s);C="rgba("+h.r+","+h.g+","+h.b+","+l+")";p.fillStyle=C;p.beginPath();for(H=0;H<y;H++){t=z[H];if(t.name==E){if(!Dygraph.isOK(t.y)){b=NaN;continue}if(u){m=[t.y_bottom,t.y_top];a=t.y}else{m=[t.y_bottom,t.y_top]}m[0]=this.area.h*m[0]+this.area.y;m[1]=this.area.h*m[1]+this.area.y;if(!isNaN(b)){if(u){p.moveTo(b,m[0])}else{p.moveTo(b,f[0])}p.lineTo(t.canvasx,m[0]);p.lineTo(t.canvasx,m[1]);if(u){p.lineTo(b,m[1])}else{p.lineTo(b,f[1])}p.closePath()}f=m;b=t.canvasx}}p.fill()}}else{if(k){var G=[];for(J=w-1;J>=0;J--){E=D[J];s=this.colors[E];q=this.dygraph_.axisPropertiesForSeries(E);var e=1+q.minyval*q.yscale;if(e<0){e=0}else{if(e>1){e=1}}e=this.area.h*e+this.area.y;p.save();b=NaN;f=[-1,-1];d=q.yscale;h=new RGBColor(s);C="rgba("+h.r+","+h.g+","+h.b+","+l+")";p.fillStyle=C;p.beginPath();for(H=0;H<y;H++){t=z[H];if(t.name==E){if(!Dygraph.isOK(t.y)){b=NaN;continue}if(v){var g=G[t.canvasx];if(g===undefined){g=e}G[t.canvasx]=t.canvasy;m=[t.canvasy,g]}else{m=[t.canvasy,e]}if(!isNaN(b)){p.moveTo(b,f[0]);if(u){p.lineTo(t.canvasx,f[0])}else{p.lineTo(t.canvasx,m[0])}p.lineTo(t.canvasx,m[1]);p.lineTo(b,f[1]);p.closePath()}f=m;b=t.canvasx}}p.fill()}}}var K=0;var n=0;var c=0;for(J=0;J<w;J+=1){K=this.layout.setPointsOffsets[J];c=this.layout.setPointsLengths[J];n=K+c;E=D[J];s=this.colors[E];var x=this.dygraph_.attr_("strokeWidth",E);L.save();var A=this.dygraph_.attr_("pointSize",E);b=null;a=null;var o=this.dygraph_.attr_("drawPoints",E);var r=this.dygraph_.attr_("strokePattern",E);if(!Dygraph.isArrayLike(r)){r=null}for(H=K;H<n;H++){t=z[H];if(F(t.canvasy)){if(u&&b!==null){p.beginPath();p.strokeStyle=s;p.lineWidth=this.attr_("strokeWidth");this._dashedLine(p,b,a,t.canvasx,a,r);p.stroke()}b=a=null}else{var I=(!b&&(H==z.length-1||F(z[H+1].canvasy)));if(b===null){b=t.canvasx;a=t.canvasy}else{if(Math.round(b)==Math.round(t.canvasx)&&Math.round(a)==Math.round(t.canvasy)){continue}if(x){p.beginPath();p.strokeStyle=s;p.lineWidth=x;if(u){this._dashedLine(p,b,a,t.canvasx,a,r);b=t.canvasx}this._dashedLine(p,b,a,t.canvasx,t.canvasy,r);b=t.canvasx;a=t.canvasy;p.stroke()}}if(o||I){p.beginPath();p.fillStyle=s;p.arc(t.canvasx,t.canvasy,A,0,2*Math.PI,false);p.fill()}}}}L.restore()};DygraphCanvasRenderer.prototype._dashedLine=function(j,i,g,a,h,f){var l,k,e,b,c,d;if(!f||f.length<=1){j.moveTo(i,g);j.lineTo(a,h);return}if(!Dygraph.compareArrays(f,this._dashedLineToHistoryPattern)){this._dashedLineToHistoryPattern=f;this._dashedLineToHistory=[0,0]}j.save();l=(a-i);k=(h-g);e=Math.sqrt(l*l+k*k);b=Math.atan2(k,l);j.translate(i,g);j.moveTo(0,0);j.rotate(b);c=this._dashedLineToHistory[0];i=0;while(e>i){d=f[c];if(this._dashedLineToHistory[1]){i+=this._dashedLineToHistory[1]}else{i+=d}if(i>e){this._dashedLineToHistory=[c,i-e];i=e}else{this._dashedLineToHistory=[(c+1)%f.length,0]}if(c%2===0){j.lineTo(i,0)}else{j.moveTo(i,0)}c=(c+1)%f.length}j.restore()};"use strict";var Dygraph=function(c,b,a){if(arguments.length>0){if(arguments.length==4){this.warn("Using deprecated four-argument dygraph constructor");this.__old_init__(c,b,arguments[2],arguments[3])}else{this.__init__(c,b,a)}}};Dygraph.NAME="Dygraph";Dygraph.VERSION="1.2dev";Dygraph.__repr__=function(){return"["+this.NAME+" "+this.VERSION+"]"};Dygraph.toString=function(){return this.__repr__()};Dygraph.DEFAULT_ROLL_PERIOD=1;Dygraph.DEFAULT_WIDTH=480;Dygraph.DEFAULT_HEIGHT=320;Dygraph.ANIMATION_STEPS=10;Dygraph.ANIMATION_DURATION=200;Dygraph.numberValueFormatter=function(a,e,h,d){var b=e("sigFigs");if(b!==null){return Dygraph.floatFormat(a,b)}var f=e("digitsAfterDecimal");var c=e("maxNumberWidth");if(a!==0&&(Math.abs(a)>=Math.pow(10,c)||Math.abs(a)<Math.pow(10,-f))){return a.toExponential(f)}else{return""+Dygraph.round_(a,f)}};Dygraph.numberAxisLabelFormatter=function(a,d,c,b){return Dygraph.numberValueFormatter(a,c,b)};Dygraph.dateString_=function(e){var i=Dygraph.zeropad;var h=new Date(e);var f=""+h.getFullYear();var g=i(h.getMonth()+1);var a=i(h.getDate());var c="";var b=h.getHours()*3600+h.getMinutes()*60+h.getSeconds();if(b){c=" "+Dygraph.hmsString_(e)}return f+"/"+g+"/"+a+c};Dygraph.dateAxisFormatter=function(b,c){if(c>=Dygraph.DECADAL){return b.strftime("%Y")}else{if(c>=Dygraph.MONTHLY){return b.strftime("%b %y")}else{var a=b.getHours()*3600+b.getMinutes()*60+b.getSeconds()+b.getMilliseconds();if(a===0||c>=Dygraph.DAILY){return new Date(b.getTime()+3600*1000).strftime("%d%b")}else{return Dygraph.hmsString_(b.getTime())}}}};Dygraph.DEFAULT_ATTRS={highlightCircleSize:3,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:false,labelsShowZeroValues:true,labelsKMB:false,labelsKMG2:false,showLabelsOnHighlight:true,digitsAfterDecimal:2,maxNumberWidth:6,sigFigs:null,strokeWidth:1,axisTickSize:3,axisLabelFontSize:14,xAxisLabelWidth:50,yAxisLabelWidth:50,rightGap:5,showRoller:false,xValueParser:Dygraph.dateParser,delimiter:",",sigma:2,errorBars:false,fractions:false,wilsonInterval:true,customBars:false,fillGraph:false,fillAlpha:0.15,connectSeparatedPoints:false,stackedGraph:false,hideOverlayOnMouseOut:true,legend:"onmouseover",stepPlot:false,avoidMinZero:false,titleHeight:28,xLabelHeight:18,yLabelWidth:18,drawXAxis:true,drawYAxis:true,axisLineColor:"black",axisLineWidth:0.3,gridLineWidth:0.3,axisLabelColor:"black",axisLabelFont:"Arial",axisLabelWidth:50,drawYGrid:true,drawXGrid:true,gridLineColor:"rgb(128,128,128)",interactionModel:null,animatedZooms:false,showRangeSelector:false,rangeSelectorHeight:40,rangeSelectorPlotStrokeColor:"#808FAB",rangeSelectorPlotFillColor:"#A7B1C4",axes:{x:{pixelsPerLabel:60,axisLabelFormatter:Dygraph.dateAxisFormatter,valueFormatter:Dygraph.dateString_,ticker:null},y:{pixelsPerLabel:30,valueFormatter:Dygraph.numberValueFormatter,axisLabelFormatter:Dygraph.numberAxisLabelFormatter,ticker:null},y2:{pixelsPerLabel:30,valueFormatter:Dygraph.numberValueFormatter,axisLabelFormatter:Dygraph.numberAxisLabelFormatter,ticker:null}}};Dygraph.HORIZONTAL=1;Dygraph.VERTICAL=2;Dygraph.addedAnnotationCSS=false;Dygraph.prototype.__old_init__=function(f,d,e,b){if(e!==null){var a=["Date"];for(var c=0;c<e.length;c++){a.push(e[c])}Dygraph.update(b,{labels:a})}this.__init__(f,d,b)};Dygraph.prototype.__init__=function(d,c,b){if(/MSIE/.test(navigator.userAgent)&&!window.opera&&typeof(G_vmlCanvasManager)!="undefined"&&document.readyState!="complete"){var a=this;setTimeout(function(){a.__init__(d,c,b)},100);return}if(b===null||b===undefined){b={}}b=Dygraph.mapLegacyOptions_(b);if(!d){Dygraph.error("Constructing dygraph with a non-existent div!");return}this.isUsingExcanvas_=typeof(G_vmlCanvasManager)!="undefined";this.maindiv_=d;this.file_=c;this.rollPeriod_=b.rollPeriod||Dygraph.DEFAULT_ROLL_PERIOD;this.previousVerticalX_=-1;this.fractions_=b.fractions||false;this.dateWindow_=b.dateWindow||null;this.is_initial_draw_=true;this.annotations_=[];this.zoomed_x_=false;this.zoomed_y_=false;d.innerHTML="";if(d.style.width===""&&b.width){d.style.width=b.width+"px"}if(d.style.height===""&&b.height){d.style.height=b.height+"px"}if(d.style.height===""&&d.clientHeight===0){d.style.height=Dygraph.DEFAULT_HEIGHT+"px";if(d.style.width===""){d.style.width=Dygraph.DEFAULT_WIDTH+"px"}}this.width_=d.clientWidth;this.height_=d.clientHeight;if(b.stackedGraph){b.fillGraph=true}this.user_attrs_={};Dygraph.update(this.user_attrs_,b);this.attrs_={};Dygraph.updateDeep(this.attrs_,Dygraph.DEFAULT_ATTRS);this.boundaryIds_=[];this.setIndexByName_={};this.createInterface_();this.start_()};Dygraph.prototype.isZoomed=function(a){if(a==null){return this.zoomed_x_||this.zoomed_y_}if(a==="x"){return this.zoomed_x_}if(a==="y"){return this.zoomed_y_}throw"axis parameter is ["+a+"] must be null, 'x' or 'y'."};Dygraph.prototype.toString=function(){var a=this.maindiv_;var b=(a&&a.id)?a.id:a;return"[Dygraph "+b+"]"};Dygraph.prototype.attr_=function(b,a){if(this.user_attrs_!==null&&a&&typeof(this.user_attrs_[a])!="undefined"&&this.user_attrs_[a]!==null&&typeof(this.user_attrs_[a][b])!="undefined"){return this.user_attrs_[a][b]}else{if(this.user_attrs_!==null&&typeof(this.user_attrs_[b])!="undefined"){return this.user_attrs_[b]}else{if(this.attrs_!==null&&typeof(this.attrs_[b])!="undefined"){return this.attrs_[b]}else{return null}}}};Dygraph.prototype.optionsViewForAxis_=function(b){var a=this;return function(c){var d=a.user_attrs_.axes;if(d&&d[b]&&d[b][c]){return d[b][c]}if(typeof(a.user_attrs_[c])!="undefined"){return a.user_attrs_[c]}d=a.attrs_.axes;if(d&&d[b]&&d[b][c]){return d[b][c]}if(b=="y"&&a.axes_[0].hasOwnProperty(c)){return a.axes_[0][c]}else{if(b=="y2"&&a.axes_[1].hasOwnProperty(c)){return a.axes_[1][c]}}return a.attr_(c)}};Dygraph.prototype.rollPeriod=function(){return this.rollPeriod_};Dygraph.prototype.xAxisRange=function(){return this.dateWindow_?this.dateWindow_:this.xAxisExtremes()};Dygraph.prototype.xAxisExtremes=function(){var b=this.rawData_[0][0];var a=this.rawData_[this.rawData_.length-1][0];return[b,a]};Dygraph.prototype.yAxisRange=function(a){if(typeof(a)=="undefined"){a=0}if(a<0||a>=this.axes_.length){return null}var b=this.axes_[a];return[b.computedValueRange[0],b.computedValueRange[1]]};Dygraph.prototype.yAxisRanges=function(){var a=[];for(var b=0;b<this.axes_.length;b++){a.push(this.yAxisRange(b))}return a};Dygraph.prototype.toDomCoords=function(a,c,b){return[this.toDomXCoord(a),this.toDomYCoord(c,b)]};Dygraph.prototype.toDomXCoord=function(b){if(b===null){return null}var c=this.plotter_.area;var a=this.xAxisRange();return c.x+(b-a[0])/(a[1]-a[0])*c.w};Dygraph.prototype.toDomYCoord=function(d,a){var c=this.toPercentYCoord(d,a);if(c===null){return null}var b=this.plotter_.area;return b.y+c*b.h};Dygraph.prototype.toDataCoords=function(a,c,b){return[this.toDataXCoord(a),this.toDataYCoord(c,b)]};Dygraph.prototype.toDataXCoord=function(b){if(b===null){return null}var c=this.plotter_.area;var a=this.xAxisRange();return a[0]+(b-c.x)/c.w*(a[1]-a[0])};Dygraph.prototype.toDataYCoord=function(h,b){if(h===null){return null}var c=this.plotter_.area;var g=this.yAxisRange(b);if(typeof(b)=="undefined"){b=0}if(!this.axes_[b].logscale){return g[0]+(c.y+c.h-h)/c.h*(g[1]-g[0])}else{var f=(h-c.y)/c.h;var a=Dygraph.log10(g[1]);var e=a-(f*(a-Dygraph.log10(g[0])));var d=Math.pow(Dygraph.LOG_SCALE,e);return d}};Dygraph.prototype.toPercentYCoord=function(e,b){if(e===null){return null}if(typeof(b)=="undefined"){b=0}var d=this.yAxisRange(b);var c;if(!this.axes_[b].logscale){c=(d[1]-e)/(d[1]-d[0])}else{var a=Dygraph.log10(d[1]);c=(a-Dygraph.log10(e))/(a-Dygraph.log10(d[0]))}return c};Dygraph.prototype.toPercentXCoord=function(b){if(b===null){return null}var a=this.xAxisRange();return(b-a[0])/(a[1]-a[0])};Dygraph.prototype.numColumns=function(){return this.rawData_[0]?this.rawData_[0].length:this.attr_("labels").length};Dygraph.prototype.numRows=function(){return this.rawData_.length};Dygraph.prototype.fullXRange_=function(){if(this.numRows()>0){return[this.rawData_[0][0],this.rawData_[this.numRows()-1][0]]}else{return[0,1]}};Dygraph.prototype.getValue=function(b,a){if(b<0||b>this.rawData_.length){return null}if(a<0||a>this.rawData_[b].length){return null}return this.rawData_[b][a]};Dygraph.prototype.createInterface_=function(){var a=this.maindiv_;this.graphDiv=document.createElement("div");this.graphDiv.style.width=this.width_+"px";this.graphDiv.style.height=this.height_+"px";a.appendChild(this.graphDiv);this.canvas_=Dygraph.createCanvas();this.canvas_.style.position="absolute";this.canvas_.width=this.width_;this.canvas_.height=this.height_;this.canvas_.style.width=this.width_+"px";this.canvas_.style.height=this.height_+"px";this.canvas_ctx_=Dygraph.getContext(this.canvas_);this.hidden_=this.createPlotKitCanvas_(this.canvas_);this.hidden_ctx_=Dygraph.getContext(this.hidden_);if(this.attr_("showRangeSelector")){this.rangeSelector_=new DygraphRangeSelector(this)}this.graphDiv.appendChild(this.hidden_);this.graphDiv.appendChild(this.canvas_);this.mouseEventElement_=this.createMouseEventElement_();this.layout_=new DygraphLayout(this);if(this.rangeSelector_){this.rangeSelector_.addToGraph(this.graphDiv,this.layout_)}var b=this;this.mouseMoveHandler=function(c){b.mouseMove_(c)};Dygraph.addEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler);this.mouseOutHandler=function(c){b.mouseOut_(c)};Dygraph.addEvent(this.mouseEventElement_,"mouseout",this.mouseOutHandler);this.createStatusMessage_();this.createDragInterface_();this.resizeHandler=function(c){b.resize()};Dygraph.addEvent(window,"resize",this.resizeHandler)};Dygraph.prototype.destroy=function(){var a=function(c){while(c.hasChildNodes()){a(c.firstChild);c.removeChild(c.firstChild)}};Dygraph.removeEvent(this.mouseEventElement_,"mouseout",this.mouseOutHandler);Dygraph.removeEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler);a(this.maindiv_);var b=function(c){for(var d in c){if(typeof(c[d])==="object"){c[d]=null}}};Dygraph.removeEvent(window,"resize",this.resizeHandler);this.resizeHandler=null;b(this.layout_);b(this.plotter_);b(this)};Dygraph.prototype.createPlotKitCanvas_=function(a){var b=Dygraph.createCanvas();b.style.position="absolute";b.style.top=a.style.top;b.style.left=a.style.left;b.width=this.width_;b.height=this.height_;b.style.width=this.width_+"px";b.style.height=this.height_+"px";return b};Dygraph.prototype.createMouseEventElement_=function(){if(this.isUsingExcanvas_){var a=document.createElement("div");a.style.position="absolute";a.style.backgroundColor="white";a.style.filter="alpha(opacity=0)";a.style.width=this.width_+"px";a.style.height=this.height_+"px";this.graphDiv.appendChild(a);return a}else{return this.canvas_}};Dygraph.prototype.setColors_=function(){var e=this.attr_("labels").length-1;this.colors_=[];var a=this.attr_("colors");var d;if(!a){var c=this.attr_("colorSaturation")||1;var b=this.attr_("colorValue")||0.5;var j=Math.ceil(e/2);for(d=1;d<=e;d++){if(!this.visibility()[d-1]){continue}var g=d%2?Math.ceil(d/2):(j+d/2);var f=(1*g/(1+e));this.colors_.push(Dygraph.hsvToRGB(f,c,b))}}else{for(d=0;d<e;d++){if(!this.visibility()[d]){continue}var h=a[d%a.length];this.colors_.push(h)}}this.plotter_.setColors(this.colors_)};Dygraph.prototype.getColors=function(){return this.colors_};Dygraph.prototype.createStatusMessage_=function(){var d=this.user_attrs_.labelsDiv;if(d&&null!==d&&(typeof(d)=="string"||d instanceof String)){this.user_attrs_.labelsDiv=document.getElementById(d)}if(!this.attr_("labelsDiv")){var a=this.attr_("labelsDivWidth");var c={position:"absolute",fontSize:"14px",zIndex:10,width:a+"px",top:"0px",left:(this.width_-a-2)+"px",background:"white",textAlign:"left",overflow:"hidden"};Dygraph.update(c,this.attr_("labelsDivStyles"));var e=document.createElement("div");e.className="dygraph-legend";for(var b in c){if(c.hasOwnProperty(b)){e.style[b]=c[b]}}this.graphDiv.appendChild(e);this.attrs_.labelsDiv=e}};Dygraph.prototype.positionLabelsDiv_=function(){if(this.user_attrs_.hasOwnProperty("labelsDiv")){return}var a=this.plotter_.area;var b=this.attr_("labelsDiv");b.style.left=a.x+a.w-this.attr_("labelsDivWidth")-1+"px";b.style.top=a.y+"px"};Dygraph.prototype.createRollInterface_=function(){if(!this.roller_){this.roller_=document.createElement("input");this.roller_.type="text";this.roller_.style.display="none";this.graphDiv.appendChild(this.roller_)}var e=this.attr_("showRoller")?"block":"none";var d=this.plotter_.area;var b={position:"absolute",zIndex:10,top:(d.y+d.h-25)+"px",left:(d.x+1)+"px",display:e};this.roller_.size="2";this.roller_.value=this.rollPeriod_;for(var a in b){if(b.hasOwnProperty(a)){this.roller_.style[a]=b[a]}}var c=this;this.roller_.onchange=function(){c.adjustRoll(c.roller_.value)}};Dygraph.prototype.dragGetX_=function(b,a){return Dygraph.pageX(b)-a.px};Dygraph.prototype.dragGetY_=function(b,a){return Dygraph.pageY(b)-a.py};Dygraph.prototype.createDragInterface_=function(){var c={isZooming:false,isPanning:false,is2DPan:false,dragStartX:null,dragStartY:null,dragEndX:null,dragEndY:null,dragDirection:null,prevEndX:null,prevEndY:null,prevDragDirection:null,initialLeftmostDate:null,xUnitsPerPixel:null,dateRange:null,px:0,py:0,boundedDates:null,boundedValues:null,initializeMouseDown:function(i,h,f){if(i.preventDefault){i.preventDefault()}else{i.returnValue=false;i.cancelBubble=true}f.px=Dygraph.findPosX(h.canvas_);f.py=Dygraph.findPosY(h.canvas_);f.dragStartX=h.dragGetX_(i,f);f.dragStartY=h.dragGetY_(i,f)}};var e=this.attr_("interactionModel");var b=this;var d=function(f){return function(g){f(g,b,c)}};for(var a in e){if(!e.hasOwnProperty(a)){continue}Dygraph.addEvent(this.mouseEventElement_,a,d(e[a]))}Dygraph.addEvent(document,"mouseup",function(g){if(c.isZooming||c.isPanning){c.isZooming=false;c.dragStartX=null;c.dragStartY=null}if(c.isPanning){c.isPanning=false;c.draggingDate=null;c.dateRange=null;for(var f=0;f<b.axes_.length;f++){delete b.axes_[f].draggingValue;delete b.axes_[f].dragValueRange}}})};Dygraph.prototype.drawZoomRect_=function(e,c,i,b,g,a,f,d){var h=this.canvas_ctx_;if(a==Dygraph.HORIZONTAL){h.clearRect(Math.min(c,f),this.layout_.getPlotArea().y,Math.abs(c-f),this.layout_.getPlotArea().h)}else{if(a==Dygraph.VERTICAL){h.clearRect(this.layout_.getPlotArea().x,Math.min(b,d),this.layout_.getPlotArea().w,Math.abs(b-d))}}if(e==Dygraph.HORIZONTAL){if(i&&c){h.fillStyle="rgba(128,128,128,0.33)";h.fillRect(Math.min(c,i),this.layout_.getPlotArea().y,Math.abs(i-c),this.layout_.getPlotArea().h)}}else{if(e==Dygraph.VERTICAL){if(g&&b){h.fillStyle="rgba(128,128,128,0.33)";h.fillRect(this.layout_.getPlotArea().x,Math.min(b,g),this.layout_.getPlotArea().w,Math.abs(g-b))}}}if(this.isUsingExcanvas_){this.currentZoomRectArgs_=[e,c,i,b,g,0,0,0]}};Dygraph.prototype.clearZoomRect_=function(){this.currentZoomRectArgs_=null;this.canvas_ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height)};Dygraph.prototype.doZoomX_=function(c,a){this.currentZoomRectArgs_=null;var b=this.toDataXCoord(c);var d=this.toDataXCoord(a);this.doZoomXDates_(b,d)};Dygraph.zoomAnimationFunction=function(c,b){var a=1.5;return(1-Math.pow(a,-c))/(1-Math.pow(a,-b))};Dygraph.prototype.doZoomXDates_=function(c,e){var a=this.xAxisRange();var d=[c,e];this.zoomed_x_=true;var b=this;this.doAnimatedZoom(a,d,null,null,function(){if(b.attr_("zoomCallback")){b.attr_("zoomCallback")(c,e,b.yAxisRanges())}})};Dygraph.prototype.doZoomY_=function(h,f){this.currentZoomRectArgs_=null;var c=this.yAxisRanges();var b=[];for(var e=0;e<this.axes_.length;e++){var d=this.toDataYCoord(h,e);var a=this.toDataYCoord(f,e);b.push([a,d])}this.zoomed_y_=true;var g=this;this.doAnimatedZoom(null,null,c,b,function(){if(g.attr_("zoomCallback")){var i=g.xAxisRange();g.attr_("zoomCallback")(i[0],i[1],g.yAxisRanges())}})};Dygraph.prototype.doUnzoom_=function(){var c=false,d=false,a=false;if(this.dateWindow_!==null){c=true;d=true}for(var g=0;g<this.axes_.length;g++){if(typeof(this.axes_[g].valueWindow)!=="undefined"&&this.axes_[g].valueWindow!==null){c=true;a=true}}this.clearSelection();if(c){this.zoomed_x_=false;this.zoomed_y_=false;var f=this.rawData_[0][0];var b=this.rawData_[this.rawData_.length-1][0];if(!this.attr_("animatedZooms")){this.dateWindow_=null;for(g=0;g<this.axes_.length;g++){if(this.axes_[g].valueWindow!==null){delete this.axes_[g].valueWindow}}this.drawGraph_();if(this.attr_("zoomCallback")){this.attr_("zoomCallback")(f,b,this.yAxisRanges())}return}var l=null,m=null,k=null,h=null;if(d){l=this.xAxisRange();m=[f,b]}if(a){k=this.yAxisRanges();var n=this.gatherDatasets_(this.rolledSeries_,null);var o=n[1];this.computeYAxisRanges_(o);h=[];for(g=0;g<this.axes_.length;g++){var e=this.axes_[g];h.push(e.valueRange!=null?e.valueRange:e.extremeRange)}}var j=this;this.doAnimatedZoom(l,m,k,h,function(){j.dateWindow_=null;for(var p=0;p<j.axes_.length;p++){if(j.axes_[p].valueWindow!==null){delete j.axes_[p].valueWindow}}if(j.attr_("zoomCallback")){j.attr_("zoomCallback")(f,b,j.yAxisRanges())}})}};Dygraph.prototype.doAnimatedZoom=function(a,e,b,c,m){var i=this.attr_("animatedZooms")?Dygraph.ANIMATION_STEPS:1;var l=[];var k=[];var f,d;if(a!==null&&e!==null){for(f=1;f<=i;f++){d=Dygraph.zoomAnimationFunction(f,i);l[f-1]=[a[0]*(1-d)+d*e[0],a[1]*(1-d)+d*e[1]]}}if(b!==null&&c!==null){for(f=1;f<=i;f++){d=Dygraph.zoomAnimationFunction(f,i);var n=[];for(var g=0;g<this.axes_.length;g++){n.push([b[g][0]*(1-d)+d*c[g][0],b[g][1]*(1-d)+d*c[g][1]])}k[f-1]=n}}var h=this;Dygraph.repeatAndCleanup(function(p){if(k.length){for(var o=0;o<h.axes_.length;o++){var j=k[p][o];h.axes_[o].valueWindow=[j[0],j[1]]}}if(l.length){h.dateWindow_=l[p]}h.drawGraph_()},i,Dygraph.ANIMATION_DURATION/i,m)};Dygraph.prototype.mouseMove_=function(b){var r=this.layout_.points;if(r===undefined){return}var a=Dygraph.pageX(b)-Dygraph.findPosX(this.mouseEventElement_);var j=-1;var f;var n=1e+100;var o=-1;for(f=0;f<r.length;f++){var q=r[f];if(q===null){continue}var h=Math.abs(q.canvasx-a);if(h>n){continue}n=h;o=f}if(o>=0){j=r[o].xval}this.selPoints_=[];var d=r.length;if(!this.attr_("stackedGraph")){for(f=0;f<d;f++){if(r[f].xval==j){this.selPoints_.push(r[f])}}}else{var g=0;for(f=d-1;f>=0;f--){if(r[f].xval==j){var c={};for(var e in r[f]){c[e]=r[f][e]}c.yval-=g;g+=c.yval;this.selPoints_.push(c)}}this.selPoints_.reverse()}if(this.attr_("highlightCallback")){var m=this.lastx_;if(m!==null&&j!=m){this.attr_("highlightCallback")(b,j,this.selPoints_,this.idxToRow_(o))}}this.lastx_=j;this.updateSelection_()};Dygraph.prototype.idxToRow_=function(a){if(a<0){return -1}var c=-1;for(var b=0;b<this.boundaryIds_.length;b++){if(this.boundaryIds_[b]!==undefined){c=b;break}}if(c<0){return -1}for(var d=0;d<this.layout_.datasets.length;++d){var e=this.layout_.datasets[d];if(a<e.length){return this.boundaryIds_[c][0]+a}a-=e.length}return -1};Dygraph.prototype.generateLegendDashHTML_=function(o,d,n){var h="";var f,e,b,k;var c=0,m=0;var l=[];var g;var a=(/MSIE/.test(navigator.userAgent)&&!window.opera);if(a){return"—"}if(!o||o.length<=1){h='<div style="display: inline-block; position: relative; bottom: .5ex; padding-left: 1em; height: 1px; border-bottom: 2px solid '+d+';"></div>'}else{for(f=0;f<=o.length;f++){c+=o[f%o.length]}g=Math.floor(n/(c-o[0]));if(g>1){for(f=0;f<o.length;f++){l[f]=o[f]/n}m=l.length}else{g=1;for(f=0;f<o.length;f++){l[f]=o[f]/c}m=l.length+1}for(e=0;e<g;e++){for(f=0;f<m;f+=2){b=l[f%l.length];if(f<o.length){k=l[(f+1)%l.length]}else{k=0}h+='<div style="display: inline-block; position: relative; bottom: .5ex; margin-right: '+k+"em; padding-left: "+b+"em; height: 1px; border-bottom: 2px solid "+d+';"></div>'}}}return h};Dygraph.prototype.generateLegendHTML_=function(k,f,b){var l,u,o,s,m,g;if(typeof(k)==="undefined"){if(this.attr_("legend")!="always"){return""}u=this.attr_("labelsSeparateLines");var r=this.attr_("labels");l="";for(o=1;o<r.length;o++){if(!this.visibility()[o-1]){continue}s=this.plotter_.colors[r[o]];if(l!==""){l+=(u?"<br/>":" ")}g=this.attr_("strokePattern",r[o]);m=this.generateLegendDashHTML_(g,s,b);l+="<span style='font-weight: bold; color: "+s+";'>"+m+" "+r[o]+"</span>"}return l}var t=this.optionsViewForAxis_("x");var h=t("valueFormatter");l=h(k,t,this.attr_("labels")[0],this)+":";var p=[];var d=this.numAxes();for(o=0;o<d;o++){p[o]=this.optionsViewForAxis_("y"+(o?1+o:""))}var e=this.attr_("labelsShowZeroValues");u=this.attr_("labelsSeparateLines");for(o=0;o<this.selPoints_.length;o++){var n=this.selPoints_[o];if(n.yval===0&&!e){continue}if(!Dygraph.isOK(n.canvasy)){continue}if(u){l+="<br/>"}var j=p[this.seriesToAxisMap_[n.name]];var q=j("valueFormatter");s=this.plotter_.colors[n.name];var a=q(n.yval,j,n.name,this);l+=" <b><span style='color: "+s+";'>"+n.name+"</span></b>:"+a}return l};Dygraph.prototype.setLegendHTML_=function(b,e){var c=this.attr_("labelsDiv");var f=document.createElement("span");f.setAttribute("style","margin: 0; padding: 0 0 0 1em; border: 0;");c.appendChild(f);var a=f.offsetWidth;var d=this.generateLegendHTML_(b,e,a);if(c!==null){c.innerHTML=d}else{if(typeof(this.shown_legend_error_)=="undefined"){this.error("labelsDiv is set to something nonexistent; legend will not be shown.");this.shown_legend_error_=true}}};Dygraph.prototype.updateSelection_=function(){var d;var h=this.canvas_ctx_;if(this.previousVerticalX_>=0){var e=0;var f=this.attr_("labels");for(d=1;d<f.length;d++){var b=this.attr_("highlightCircleSize",f[d]);if(b>e){e=b}}var g=this.previousVerticalX_;h.clearRect(g-e-1,0,2*e+2,this.height_)}if(this.isUsingExcanvas_&&this.currentZoomRectArgs_){Dygraph.prototype.drawZoomRect_.apply(this,this.currentZoomRectArgs_)}if(this.selPoints_.length>0){if(this.attr_("showLabelsOnHighlight")){this.setLegendHTML_(this.lastx_,this.selPoints_)}var c=this.selPoints_[0].canvasx;h.save();for(d=0;d<this.selPoints_.length;d++){var j=this.selPoints_[d];if(!Dygraph.isOK(j.canvasy)){continue}var a=this.attr_("highlightCircleSize",j.name);h.beginPath();h.fillStyle=this.plotter_.colors[j.name];h.arc(c,j.canvasy,a,0,2*Math.PI,false);h.fill()}h.restore();this.previousVerticalX_=c}};Dygraph.prototype.setSelection=function(c){this.selPoints_=[];var e=0;if(c!==false){c=c-this.boundaryIds_[0][0]}if(c!==false&&c>=0){for(var b=0;b<this.layout_.datasets.length;++b){var d=this.layout_.datasets[b];if(c<d.length){var a=this.layout_.points[e+c];if(this.attr_("stackedGraph")){a=this.layout_.unstackPointAtIndex(e+c)}this.selPoints_.push(a)}e+=d.length}}if(this.selPoints_.length){this.lastx_=this.selPoints_[0].xval;this.updateSelection_()}else{this.clearSelection()}};Dygraph.prototype.mouseOut_=function(a){if(this.attr_("unhighlightCallback")){this.attr_("unhighlightCallback")(a)}if(this.attr_("hideOverlayOnMouseOut")){this.clearSelection()}};Dygraph.prototype.clearSelection=function(){this.canvas_ctx_.clearRect(0,0,this.width_,this.height_);this.setLegendHTML_();this.selPoints_=[];this.lastx_=-1};Dygraph.prototype.getSelection=function(){if(!this.selPoints_||this.selPoints_.length<1){return -1}for(var a=0;a<this.layout_.points.length;a++){if(this.layout_.points[a].x==this.selPoints_[0].x){return a+this.boundaryIds_[0][0]}}return -1};Dygraph.prototype.loadedEvent_=function(a){this.rawData_=this.parseCSV_(a);this.predraw_()};Dygraph.prototype.addXTicks_=function(){var a;if(this.dateWindow_){a=[this.dateWindow_[0],this.dateWindow_[1]]}else{a=this.fullXRange_()}var c=this.optionsViewForAxis_("x");var b=c("ticker")(a[0],a[1],this.width_,c,this);this.layout_.setXTicks(b)};Dygraph.prototype.extremeValues_=function(d){var h=null,f=null,c,g;var b=this.attr_("errorBars")||this.attr_("customBars");if(b){for(c=0;c<d.length;c++){g=d[c][1][0];if(!g){continue}var a=g-d[c][1][1];var e=g+d[c][1][2];if(a>g){a=g}if(e<g){e=g}if(f===null||e>f){f=e}if(h===null||a<h){h=a}}}else{for(c=0;c<d.length;c++){g=d[c][1];if(g===null||isNaN(g)){continue}if(f===null||g>f){f=g}if(h===null||g<h){h=g}}}return[h,f]};Dygraph.prototype.predraw_=function(){var f=new Date();this.computeYAxes_();if(this.plotter_){this.plotter_.clear()}this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.hidden_ctx_,this.layout_);this.createRollInterface_();this.positionLabelsDiv_();if(this.rangeSelector_){this.rangeSelector_.renderStaticLayer()}this.rolledSeries_=[null];for(var c=1;c<this.numColumns();c++){var e=this.attr_("connectSeparatedPoints",c);var d=this.attr_("logscale",c);var b=this.extractSeries_(this.rawData_,c,d,e);b=this.rollingAverage(b,this.rollPeriod_);this.rolledSeries_.push(b)}this.drawGraph_();var a=new Date();this.drawingTimeMs_=(a-f)};Dygraph.prototype.gatherDatasets_=function(w,c){var s=[];var b=[];var e=[];var a={};var u,t,r;var m=w.length-1;for(u=m;u>=1;u--){if(!this.visibility()[u-1]){continue}var h=[];for(t=0;t<w[u].length;t++){h.push(w[u][t])}var o=this.attr_("errorBars")||this.attr_("customBars");if(c){var A=c[0];var f=c[1];var p=[];var d=null,z=null;for(r=0;r<h.length;r++){if(h[r][0]>=A&&d===null){d=r}if(h[r][0]<=f){z=r}}if(d===null){d=0}if(d>0){d--}if(z===null){z=h.length-1}if(z<h.length-1){z++}s[u-1]=[d,z];for(r=d;r<=z;r++){p.push(h[r])}h=p}else{s[u-1]=[0,h.length-1]}var n=this.extremeValues_(h);if(o){for(t=0;t<h.length;t++){h[t]=[h[t][0],h[t][1][0],h[t][1][1],h[t][1][2]]}}else{if(this.attr_("stackedGraph")){var q=h.length;var y;for(t=0;t<q;t++){var g=h[t][0];if(b[g]===undefined){b[g]=0}y=h[t][1];b[g]+=y;h[t]=[g,b[g]];if(b[g]>n[1]){n[1]=b[g]}if(b[g]<n[0]){n[0]=b[g]}}}}var v=this.attr_("labels")[u];a[v]=n;e[u]=h}return[e,a,s]};Dygraph.prototype.drawGraph_=function(k){var a=new Date();if(typeof(k)==="undefined"){k=true}var e=this.is_initial_draw_;this.is_initial_draw_=false;this.layout_.removeAllDatasets();this.setColors_();this.attrs_.pointSize=0.5*this.attr_("highlightCircleSize");var h=this.gatherDatasets_(this.rolledSeries_,this.dateWindow_);var d=h[0];var j=h[1];this.boundaryIds_=h[2];this.setIndexByName_={};var g=this.attr_("labels");if(g.length>0){this.setIndexByName_[g[0]]=0}for(var f=1;f<d.length;f++){this.setIndexByName_[g[f]]=f;if(!this.visibility()[f-1]){continue}this.layout_.addDataset(g[f],d[f])}this.computeYAxisRanges_(j);this.layout_.setYAxes(this.axes_);this.addXTicks_();var b=this.zoomed_x_;this.layout_.setDateWindow(this.dateWindow_);this.zoomed_x_=b;this.layout_.evaluateWithError();this.renderGraph_(e,false);if(this.attr_("timingName")){var c=new Date();if(console){console.log(this.attr_("timingName")+" - drawGraph: "+(c-a)+"ms")}}};Dygraph.prototype.renderGraph_=function(a,b){this.plotter_.clear();this.plotter_.render();this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height);this.setLegendHTML_();if(!a){if(b){if(typeof(this.selPoints_)!=="undefined"&&this.selPoints_.length){this.clearSelection()}else{this.clearSelection()}}}if(this.rangeSelector_){this.rangeSelector_.renderInteractiveLayer()}if(this.attr_("drawCallback")!==null){this.attr_("drawCallback")(this,a)}};Dygraph.prototype.computeYAxes_=function(){var g,c,m,b,j,a,p;if(this.axes_!==undefined&&this.user_attrs_.hasOwnProperty("valueRange")===false){c=[];for(j=0;j<this.axes_.length;j++){c.push(this.axes_[j].valueWindow)}}this.axes_=[{yAxisId:0,g:this}];this.seriesToAxisMap_={};var h=this.attr_("labels");var f={};for(g=1;g<h.length;g++){f[h[g]]=(g-1)}var e=["includeZero","valueRange","labelsKMB","labelsKMG2","pixelsPerYLabel","yAxisLabelWidth","axisLabelFontSize","axisTickSize","logscale"];for(g=0;g<e.length;g++){var d=e[g];p=this.attr_(d);if(p){this.axes_[0][d]=p}}for(m in f){if(!f.hasOwnProperty(m)){continue}b=this.attr_("axis",m);if(b===null){this.seriesToAxisMap_[m]=0;continue}if(typeof(b)=="object"){a={};Dygraph.update(a,this.axes_[0]);Dygraph.update(a,{valueRange:null});var o=this.axes_.length;a.yAxisId=o;a.g=this;Dygraph.update(a,b);this.axes_.push(a);this.seriesToAxisMap_[m]=o}}for(m in f){if(!f.hasOwnProperty(m)){continue}b=this.attr_("axis",m);if(typeof(b)=="string"){if(!this.seriesToAxisMap_.hasOwnProperty(b)){this.error("Series "+m+" wants to share a y-axis with series "+b+", which does not define its own axis.");return null}var n=this.seriesToAxisMap_[b];this.seriesToAxisMap_[m]=n}}if(c!==undefined){for(j=0;j<c.length;j++){this.axes_[j].valueWindow=c[j]}}for(b=0;b<this.axes_.length;b++){if(b===0){a=this.optionsViewForAxis_("y"+(b?"2":""));p=a("valueRange");if(p){this.axes_[b].valueRange=p}}else{var l=this.user_attrs_.axes;if(l&&l.y2){p=l.y2.valueRange;if(p){this.axes_[b].valueRange=p}}}}};Dygraph.prototype.numAxes=function(){var c=0;for(var b in this.seriesToAxisMap_){if(!this.seriesToAxisMap_.hasOwnProperty(b)){continue}var a=this.seriesToAxisMap_[b];if(a>c){c=a}}return 1+c};Dygraph.prototype.axisPropertiesForSeries=function(a){return this.axes_[this.seriesToAxisMap_[a]]};Dygraph.prototype.computeYAxisRanges_=function(a){var g=[],h;for(h in this.seriesToAxisMap_){if(!this.seriesToAxisMap_.hasOwnProperty(h)){continue}var p=this.seriesToAxisMap_[h];while(g.length<=p){g.push([])}g[p].push(h)}for(var u=0;u<this.axes_.length;u++){var b=this.axes_[u];if(!g[u]){b.extremeRange=[0,1]}else{h=g[u];var x=Infinity;var w=-Infinity;var o,m;for(var s=0;s<h.length;s++){if(!a.hasOwnProperty(h[s])){continue}o=a[h[s]][0];if(o!==null){x=Math.min(o,x)}m=a[h[s]][1];if(m!==null){w=Math.max(m,w)}}if(b.includeZero&&x>0){x=0}if(x==Infinity){x=0}if(w==-Infinity){w=1}var t=w-x;if(t===0){t=w}var d,z;if(b.logscale){d=w+0.1*t;z=x}else{d=w+0.1*t;z=x-0.1*t;if(!this.attr_("avoidMinZero")){if(z<0&&x>=0){z=0}if(d>0&&w<=0){d=0}}if(this.attr_("includeZero")){if(w<0){d=0}if(x>0){z=0}}}b.extremeRange=[z,d]}if(b.valueWindow){b.computedValueRange=[b.valueWindow[0],b.valueWindow[1]]}else{if(b.valueRange){b.computedValueRange=[b.valueRange[0],b.valueRange[1]]}else{b.computedValueRange=b.extremeRange}}var n=this.optionsViewForAxis_("y"+(u?"2":""));var y=n("ticker");if(u===0||b.independentTicks){b.ticks=y(b.computedValueRange[0],b.computedValueRange[1],this.height_,n,this)}else{var l=this.axes_[0];var e=l.ticks;var f=l.computedValueRange[1]-l.computedValueRange[0];var A=b.computedValueRange[1]-b.computedValueRange[0];var c=[];for(var r=0;r<e.length;r++){var q=(e[r].v-l.computedValueRange[0])/f;var v=b.computedValueRange[0]+q*A;c.push(v)}b.ticks=y(b.computedValueRange[0],b.computedValueRange[1],this.height_,n,this,c)}}};Dygraph.prototype.extractSeries_=function(h,e,g,f){var d=[];for(var c=0;c<h.length;c++){var b=h[c][0];var a=h[c][e];if(g){if(a<=0){a=null}d.push([b,a])}else{if(a!==null||!f){d.push([b,a])}}}return d};Dygraph.prototype.rollingAverage=function(l,d){if(l.length<2){return l}d=Math.min(d,l.length);var b=[];var s=this.attr_("sigma");var E,o,w,v,m,c,D,x;if(this.fractions_){var k=0;var h=0;var e=100;for(w=0;w<l.length;w++){k+=l[w][1][0];h+=l[w][1][1];if(w-d>=0){k-=l[w-d][1][0];h-=l[w-d][1][1]}var A=l[w][0];var u=h?k/h:0;if(this.attr_("errorBars")){if(this.attr_("wilsonInterval")){if(h){var r=u<0?0:u,t=h;var z=s*Math.sqrt(r*(1-r)/t+s*s/(4*t*t));var a=1+s*s/h;E=(r+s*s/(2*h)-z)/a;o=(r+s*s/(2*h)+z)/a;b[w]=[A,[r*e,(r-E)*e,(o-r)*e]]}else{b[w]=[A,[0,0,0]]}}else{x=h?s*Math.sqrt(u*(1-u)/h):1;b[w]=[A,[e*u,e*x,e*x]]}}else{b[w]=[A,e*u]}}}else{if(this.attr_("customBars")){E=0;var B=0;o=0;var g=0;for(w=0;w<l.length;w++){var C=l[w][1];m=C[1];b[w]=[l[w][0],[m,m-C[0],C[2]-m]];if(m!==null&&!isNaN(m)){E+=C[0];B+=m;o+=C[2];g+=1}if(w-d>=0){var q=l[w-d];if(q[1][1]!==null&&!isNaN(q[1][1])){E-=q[1][0];B-=q[1][1];o-=q[1][2];g-=1}}if(g){b[w]=[l[w][0],[1*B/g,1*(B-E)/g,1*(o-B)/g]]}else{b[w]=[l[w][0],[null,null,null]]}}}else{if(!this.attr_("errorBars")){if(d==1){return l}for(w=0;w<l.length;w++){c=0;D=0;for(v=Math.max(0,w-d+1);v<w+1;v++){m=l[v][1];if(m===null||isNaN(m)){continue}D++;c+=l[v][1]}if(D){b[w]=[l[w][0],c/D]}else{b[w]=[l[w][0],null]}}}else{for(w=0;w<l.length;w++){c=0;var f=0;D=0;for(v=Math.max(0,w-d+1);v<w+1;v++){m=l[v][1][0];if(m===null||isNaN(m)){continue}D++;c+=l[v][1][0];f+=Math.pow(l[v][1][1],2)}if(D){x=Math.sqrt(f)/D;b[w]=[l[w][0],[c/D,s*x,s*x]]}else{b[w]=[l[w][0],[null,null,null]]}}}}}return b};Dygraph.prototype.detectTypeFromString_=function(b){var a=false;var c=b.indexOf("-");if((c>0&&(b[c-1]!="e"&&b[c-1]!="E"))||b.indexOf("/")>=0||isNaN(parseFloat(b))){a=true}else{if(b.length==8&&b>"19700101"&&b<"20371231"){a=true}}if(a){this.attrs_.xValueParser=Dygraph.dateParser;this.attrs_.axes.x.valueFormatter=Dygraph.dateString_;this.attrs_.axes.x.ticker=Dygraph.dateTicker;this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter}else{this.attrs_.xValueParser=function(d){return parseFloat(d)};this.attrs_.axes.x.valueFormatter=function(d){return d};this.attrs_.axes.x.ticker=Dygraph.numericTicks;this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter}};Dygraph.prototype.parseFloat_=function(a,c,b){var e=parseFloat(a);if(!isNaN(e)){return e}if(/^ *$/.test(a)){return null}if(/^ *nan *$/i.test(a)){return NaN}var d="Unable to parse '"+a+"' as a number";if(b!==null&&c!==null){d+=" on line "+(1+c)+" ('"+b+"') of CSV."}this.error(d);return null};Dygraph.prototype.parseCSV_=function(s){var r=[];var a=s.split("\n");var g,k;var p=this.attr_("delimiter");if(a[0].indexOf(p)==-1&&a[0].indexOf("\t")>=0){p="\t"}var b=0;if(!("labels" in this.user_attrs_)){b=1;this.attrs_.labels=a[0].split(p)}var o=0;var m;var q=false;var c=this.attr_("labels").length;var f=false;for(var l=b;l<a.length;l++){var e=a[l];o=l;if(e.length===0){continue}if(e[0]=="#"){continue}var d=e.split(p);if(d.length<2){continue}var h=[];if(!q){this.detectTypeFromString_(d[0]);m=this.attr_("xValueParser");q=true}h[0]=m(d[0],this);if(this.fractions_){for(k=1;k<d.length;k++){g=d[k].split("/");if(g.length!=2){this.error('Expected fractional "num/den" values in CSV data but found a value \''+d[k]+"' on line "+(1+l)+" ('"+e+"') which is not of this form.");h[k]=[0,0]}else{h[k]=[this.parseFloat_(g[0],l,e),this.parseFloat_(g[1],l,e)]}}}else{if(this.attr_("errorBars")){if(d.length%2!=1){this.error("Expected alternating (value, stdev.) pairs in CSV data but line "+(1+l)+" has an odd number of values ("+(d.length-1)+"): '"+e+"'")}for(k=1;k<d.length;k+=2){h[(k+1)/2]=[this.parseFloat_(d[k],l,e),this.parseFloat_(d[k+1],l,e)]}}else{if(this.attr_("customBars")){for(k=1;k<d.length;k++){var t=d[k];if(/^ *$/.test(t)){h[k]=[null,null,null]}else{g=t.split(";");if(g.length==3){h[k]=[this.parseFloat_(g[0],l,e),this.parseFloat_(g[1],l,e),this.parseFloat_(g[2],l,e)]}else{this.warn('When using customBars, values must be either blank or "low;center;high" tuples (got "'+t+'" on line '+(1+l))}}}}else{for(k=1;k<d.length;k++){h[k]=this.parseFloat_(d[k],l,e)}}}}if(r.length>0&&h[0]<r[r.length-1][0]){f=true}if(h.length!=c){this.error("Number of columns in line "+l+" ("+h.length+") does not agree with number of labels ("+c+") "+e)}if(l===0&&this.attr_("labels")){var n=true;for(k=0;n&&k<h.length;k++){if(h[k]){n=false}}if(n){this.warn("The dygraphs 'labels' option is set, but the first row of CSV data ('"+e+"') appears to also contain labels. Will drop the CSV labels and use the option labels.");continue}}r.push(h)}if(f){this.warn("CSV is out of order; order it correctly to speed loading.");r.sort(function(j,i){return j[0]-i[0]})}return r};Dygraph.prototype.parseArray_=function(b){if(b.length===0){this.error("Can't plot empty data set");return null}if(b[0].length===0){this.error("Data set cannot contain an empty row");return null}var a;if(this.attr_("labels")===null){this.warn("Using default labels. Set labels explicitly via 'labels' in the options parameter");this.attrs_.labels=["X"];for(a=1;a<b[0].length;a++){this.attrs_.labels.push("Y"+a)}}if(Dygraph.isDateLike(b[0][0])){this.attrs_.axes.x.valueFormatter=Dygraph.dateString_;this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter;this.attrs_.axes.x.ticker=Dygraph.dateTicker;var c=Dygraph.clone(b);for(a=0;a<b.length;a++){if(c[a].length===0){this.error("Row "+(1+a)+" of data is empty");return null}if(c[a][0]===null||typeof(c[a][0].getTime)!="function"||isNaN(c[a][0].getTime())){this.error("x value in row "+(1+a)+" is not a Date");return null}c[a][0]=c[a][0].getTime()}return c}else{this.attrs_.axes.x.valueFormatter=function(d){return d};this.attrs_.axes.x.axisLabelFormatter=Dygraph.numberAxisLabelFormatter;this.attrs_.axes.x.ticker=Dygraph.numericTicks;return b}};Dygraph.prototype.parseDataTable_=function(w){var d=function(i){var j=String.fromCharCode(65+i%26);i=Math.floor(i/26);while(i>0){j=String.fromCharCode(65+(i-1)%26)+j.toLowerCase();i=Math.floor((i-1)/26)}return j};var h=w.getNumberOfColumns();var g=w.getNumberOfRows();var f=w.getColumnType(0);if(f=="date"||f=="datetime"){this.attrs_.xValueParser=Dygraph.dateParser;this.attrs_.axes.x.valueFormatter=Dygraph.dateString_;this.attrs_.axes.x.ticker=Dygraph.dateTicker;this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter}else{if(f=="number"){this.attrs_.xValueParser=function(i){return parseFloat(i)};this.attrs_.axes.x.valueFormatter=function(i){return i};this.attrs_.axes.x.ticker=Dygraph.numericTicks;this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter}else{this.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '"+f+"')");return null}}var m=[];var t={};var s=false;var q,o;for(q=1;q<h;q++){var b=w.getColumnType(q);if(b=="number"){m.push(q)}else{if(b=="string"&&this.attr_("displayAnnotations")){var r=m[m.length-1];if(!t.hasOwnProperty(r)){t[r]=[q]}else{t[r].push(q)}s=true}else{this.error("Only 'number' is supported as a dependent type with Gviz. 'string' is only supported if displayAnnotations is true")}}}var u=[w.getColumnLabel(0)];for(q=0;q<m.length;q++){u.push(w.getColumnLabel(m[q]));if(this.attr_("errorBars")){q+=1}}this.attrs_.labels=u;h=u.length;var v=[];var l=false;var a=[];for(q=0;q<g;q++){var e=[];if(typeof(w.getValue(q,0))==="undefined"||w.getValue(q,0)===null){this.warn("Ignoring row "+q+" of DataTable because of undefined or null first column.");continue}if(f=="date"||f=="datetime"){e.push(w.getValue(q,0).getTime())}else{e.push(w.getValue(q,0))}if(!this.attr_("errorBars")){for(o=0;o<m.length;o++){var c=m[o];e.push(w.getValue(q,c));if(s&&t.hasOwnProperty(c)&&w.getValue(q,t[c][0])!==null){var p={};p.series=w.getColumnLabel(c);p.xval=e[0];p.shortText=d(a.length);p.text="";for(var n=0;n<t[c].length;n++){if(n){p.text+="\n"}p.text+=w.getValue(q,t[c][n])}a.push(p)}}for(o=0;o<e.length;o++){if(!isFinite(e[o])){e[o]=null}}}else{for(o=0;o<h-1;o++){e.push([w.getValue(q,1+2*o),w.getValue(q,2+2*o)])}}if(v.length>0&&e[0]<v[v.length-1][0]){l=true}v.push(e)}if(l){this.warn("DataTable is out of order; order it correctly to speed loading.");v.sort(function(j,i){return j[0]-i[0]})}this.rawData_=v;if(a.length>0){this.setAnnotations(a,true)}};Dygraph.prototype.start_=function(){var c=this.file_;if(typeof c=="function"){c=c()}if(Dygraph.isArrayLike(c)){this.rawData_=this.parseArray_(c);this.predraw_()}else{if(typeof c=="object"&&typeof c.getColumnRange=="function"){this.parseDataTable_(c);this.predraw_()}else{if(typeof c=="string"){if(c.indexOf("\n")>=0){this.loadedEvent_(c)}else{var b=new XMLHttpRequest();var a=this;b.onreadystatechange=function(){if(b.readyState==4){if(b.status===200||b.status===0){a.loadedEvent_(b.responseText)}}};b.open("GET",c,true);b.send(null)}}else{this.error("Unknown data format: "+(typeof c))}}}};Dygraph.prototype.updateOptions=function(e,b){if(typeof(b)=="undefined"){b=false}var d=e.file;var c=Dygraph.mapLegacyOptions_(e);if("rollPeriod" in c){this.rollPeriod_=c.rollPeriod}if("dateWindow" in c){this.dateWindow_=c.dateWindow;if(!("isZoomedIgnoreProgrammaticZoom" in c)){this.zoomed_x_=(c.dateWindow!==null)}}if("valueRange" in c&&!("isZoomedIgnoreProgrammaticZoom" in c)){this.zoomed_y_=(c.valueRange!==null)}var a=Dygraph.isPixelChangingOptionList(this.attr_("labels"),c);Dygraph.updateDeep(this.user_attrs_,c);if(d){this.file_=d;if(!b){this.start_()}}else{if(!b){if(a){this.predraw_()}else{this.renderGraph_(false,false)}}}};Dygraph.mapLegacyOptions_=function(c){var a={};for(var b in c){if(b=="file"){continue}if(c.hasOwnProperty(b)){a[b]=c[b]}}var e=function(g,f,h){if(!a.axes){a.axes={}}if(!a.axes[g]){a.axes[g]={}}a.axes[g][f]=h};var d=function(f,g,h){if(typeof(c[f])!="undefined"){e(g,h,c[f]);delete a[f]}};d("xValueFormatter","x","valueFormatter");d("pixelsPerXLabel","x","pixelsPerLabel");d("xAxisLabelFormatter","x","axisLabelFormatter");d("xTicker","x","ticker");d("yValueFormatter","y","valueFormatter");d("pixelsPerYLabel","y","pixelsPerLabel");d("yAxisLabelFormatter","y","axisLabelFormatter");d("yTicker","y","ticker");return a};Dygraph.prototype.resize=function(d,b){if(this.resize_lock){return}this.resize_lock=true;if((d===null)!=(b===null)){this.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero.");d=b=null}var a=this.width_;var c=this.height_;if(d){this.maindiv_.style.width=d+"px";this.maindiv_.style.height=b+"px";this.width_=d;this.height_=b}else{this.width_=this.maindiv_.clientWidth;this.height_=this.maindiv_.clientHeight}if(a!=this.width_||c!=this.height_){this.maindiv_.innerHTML="";this.roller_=null;this.attrs_.labelsDiv=null;this.createInterface_();if(this.annotations_.length){this.layout_.setAnnotations(this.annotations_)}this.predraw_()}this.resize_lock=false};Dygraph.prototype.adjustRoll=function(a){this.rollPeriod_=a;this.predraw_()};Dygraph.prototype.visibility=function(){if(!this.attr_("visibility")){this.attrs_.visibility=[]}while(this.attr_("visibility").length<this.numColumns()-1){this.attrs_.visibility.push(true)}return this.attr_("visibility")};Dygraph.prototype.setVisibility=function(b,c){var a=this.visibility();if(b<0||b>=a.length){this.warn("invalid series number in setVisibility: "+b)}else{a[b]=c;this.predraw_()}};Dygraph.prototype.size=function(){return{width:this.width_,height:this.height_}};Dygraph.prototype.setAnnotations=function(b,a){Dygraph.addAnnotationRule();this.annotations_=b;this.layout_.setAnnotations(this.annotations_);if(!a){this.predraw_()}};Dygraph.prototype.annotations=function(){return this.annotations_};Dygraph.prototype.getLabels=function(a){return this.attr_("labels").slice()};Dygraph.prototype.indexFromSetName=function(a){return this.setIndexByName_[a]};Dygraph.addAnnotationRule=function(){if(Dygraph.addedAnnotationCSS){return}var f="border: 1px solid black; background-color: white; text-align: center;";var e=document.createElement("style");e.type="text/css";document.getElementsByTagName("head")[0].appendChild(e);for(var b=0;b<document.styleSheets.length;b++){if(document.styleSheets[b].disabled){continue}var d=document.styleSheets[b];try{if(d.insertRule){var a=d.cssRules?d.cssRules.length:0;d.insertRule(".dygraphDefaultAnnotation { "+f+" }",a)}else{if(d.addRule){d.addRule(".dygraphDefaultAnnotation",f)}}Dygraph.addedAnnotationCSS=true;return}catch(c){}}this.warn("Unable to add default annotation CSS rule; display may be off.")};var DateGraph=Dygraph;"use strict";Dygraph.LOG_SCALE=10;Dygraph.LN_TEN=Math.log(Dygraph.LOG_SCALE);Dygraph.log10=function(a){return Math.log(a)/Dygraph.LN_TEN};Dygraph.DEBUG=1;Dygraph.INFO=2;Dygraph.WARNING=3;Dygraph.ERROR=3;Dygraph.LOG_STACK_TRACES=false;Dygraph.DOTTED_LINE=[2,2];Dygraph.DASHED_LINE=[7,3];Dygraph.DOT_DASH_LINE=[7,2,2,2];Dygraph.log=function(b,d){var a;if(typeof(printStackTrace)!="undefined"){a=printStackTrace({guess:false});while(a[0].indexOf("stacktrace")!=-1){a.splice(0,1)}a.splice(0,2);for(var c=0;c<a.length;c++){a[c]=a[c].replace(/\([^)]*\/(.*)\)/,"@$1").replace(/\@.*\/([^\/]*)/,"@$1").replace("[object Object].","")}var e=a.splice(0,1)[0];d+=" ("+e.replace(/^.*@ ?/,"")+")"}if(typeof(console)!="undefined"){switch(b){case Dygraph.DEBUG:console.debug("dygraphs: "+d);break;case Dygraph.INFO:console.info("dygraphs: "+d);break;case Dygraph.WARNING:console.warn("dygraphs: "+d);break;case Dygraph.ERROR:console.error("dygraphs: "+d);break}}if(Dygraph.LOG_STACK_TRACES){console.log(a.join("\n"))}};Dygraph.info=function(a){Dygraph.log(Dygraph.INFO,a)};Dygraph.prototype.info=Dygraph.info;Dygraph.warn=function(a){Dygraph.log(Dygraph.WARNING,a)};Dygraph.prototype.warn=Dygraph.warn;Dygraph.error=function(a){Dygraph.log(Dygraph.ERROR,a)};Dygraph.prototype.error=Dygraph.error;Dygraph.getContext=function(a){return a.getContext("2d")};Dygraph.addEvent=function addEvent(c,b,a){if(c.addEventListener){c.addEventListener(b,a,false)}else{c[b+a]=function(){a(window.event)};c.attachEvent("on"+b,c[b+a])}};Dygraph.removeEvent=function addEvent(c,b,a){if(c.removeEventListener){c.removeEventListener(b,a,false)}else{c.detachEvent("on"+b,c[b+a]);c[b+a]=null}};Dygraph.cancelEvent=function(a){a=a?a:window.event;if(a.stopPropagation){a.stopPropagation()}if(a.preventDefault){a.preventDefault()}a.cancelBubble=true;a.cancel=true;a.returnValue=false;return false};Dygraph.hsvToRGB=function(h,g,k){var c;var d;var l;if(g===0){c=k;d=k;l=k}else{var e=Math.floor(h*6);var j=(h*6)-e;var b=k*(1-g);var a=k*(1-(g*j));var m=k*(1-(g*(1-j)));switch(e){case 1:c=a;d=k;l=b;break;case 2:c=b;d=k;l=m;break;case 3:c=b;d=a;l=k;break;case 4:c=m;d=b;l=k;break;case 5:c=k;d=b;l=a;break;case 6:case 0:c=k;d=m;l=b;break}}c=Math.floor(255*c+0.5);d=Math.floor(255*d+0.5);l=Math.floor(255*l+0.5);return"rgb("+c+","+d+","+l+")"};Dygraph.findPosX=function(b){var c=0;if(b.offsetParent){var a=b;while(1){c+=a.offsetLeft;if(!a.offsetParent){break}a=a.offsetParent}}else{if(b.x){c+=b.x}}while(b&&b!=document.body){c-=b.scrollLeft;b=b.parentNode}return c};Dygraph.findPosY=function(c){var b=0;if(c.offsetParent){var a=c;while(1){b+=a.offsetTop;if(!a.offsetParent){break}a=a.offsetParent}}else{if(c.y){b+=c.y}}while(c&&c!=document.body){b-=c.scrollTop;c=c.parentNode}return b};Dygraph.pageX=function(c){if(c.pageX){return(!c.pageX||c.pageX<0)?0:c.pageX}else{var d=document;var a=document.body;return c.clientX+(d.scrollLeft||a.scrollLeft)-(d.clientLeft||0)}};Dygraph.pageY=function(c){if(c.pageY){return(!c.pageY||c.pageY<0)?0:c.pageY}else{var d=document;var a=document.body;return c.clientY+(d.scrollTop||a.scrollTop)-(d.clientTop||0)}};Dygraph.isOK=function(a){return a&&!isNaN(a)};Dygraph.floatFormat=function(a,b){var c=Math.min(Math.max(1,b||2),21);return(Math.abs(a)<0.001&&a!==0)?a.toExponential(c-1):a.toPrecision(c)};Dygraph.zeropad=function(a){if(a<10){return"0"+a}else{return""+a}};Dygraph.hmsString_=function(a){var c=Dygraph.zeropad;var b=new Date(a);if(b.getSeconds()){return c(b.getHours())+":"+c(b.getMinutes())+":"+c(b.getSeconds())}else{return c(b.getHours())+":"+c(b.getMinutes())}};Dygraph.round_=function(c,b){var a=Math.pow(10,b);return Math.round(c*a)/a};Dygraph.binarySearch=function(a,d,i,e,b){if(e===null||e===undefined||b===null||b===undefined){e=0;b=d.length-1}if(e>b){return -1}if(i===null||i===undefined){i=0}var h=function(j){return j>=0&&j<d.length};var g=parseInt((e+b)/2,10);var c=d[g];if(c==a){return g}var f;if(c>a){if(i>0){f=g-1;if(h(f)&&d[f]<a){return g}}return Dygraph.binarySearch(a,d,i,e,g-1)}if(c<a){if(i<0){f=g+1;if(h(f)&&d[f]>a){return g}}return Dygraph.binarySearch(a,d,i,g+1,b)}};Dygraph.dateParser=function(a){var b;var c;c=Dygraph.dateStrToMillis(a);if(c&&!isNaN(c)){return c}if(a.search("-")!=-1){b=a.replace("-","/","g");while(b.search("-")!=-1){b=b.replace("-","/")}c=Dygraph.dateStrToMillis(b)}else{if(a.length==8){b=a.substr(0,4)+"/"+a.substr(4,2)+"/"+a.substr(6,2);c=Dygraph.dateStrToMillis(b)}else{c=Dygraph.dateStrToMillis(a)}}if(!c||isNaN(c)){Dygraph.error("Couldn't parse "+a+" as a date")}return c};Dygraph.dateStrToMillis=function(a){return new Date(a).getTime()};Dygraph.update=function(b,c){if(typeof(c)!="undefined"&&c!==null){for(var a in c){if(c.hasOwnProperty(a)){b[a]=c[a]}}}return b};Dygraph.updateDeep=function(b,d){function c(e){return(typeof Node==="object"?e instanceof Node:typeof e==="object"&&typeof e.nodeType==="number"&&typeof e.nodeName==="string")}if(typeof(d)!="undefined"&&d!==null){for(var a in d){if(d.hasOwnProperty(a)){if(d[a]===null){b[a]=null}else{if(Dygraph.isArrayLike(d[a])){b[a]=d[a].slice()}else{if(c(d[a])){b[a]=d[a]}else{if(typeof(d[a])=="object"){if(typeof(b[a])!="object"){b[a]={}}Dygraph.updateDeep(b[a],d[a])}else{b[a]=d[a]}}}}}}}return b};Dygraph.isArrayLike=function(b){var a=typeof(b);if((a!="object"&&!(a=="function"&&typeof(b.item)=="function"))||b===null||typeof(b.length)!="number"||b.nodeType===3){return false}return true};Dygraph.isDateLike=function(a){if(typeof(a)!="object"||a===null||typeof(a.getTime)!="function"){return false}return true};Dygraph.clone=function(c){var b=[];for(var a=0;a<c.length;a++){if(Dygraph.isArrayLike(c[a])){b.push(Dygraph.clone(c[a]))}else{b.push(c[a])}}return b};Dygraph.createCanvas=function(){var a=document.createElement("canvas");var b=(/MSIE/.test(navigator.userAgent)&&!window.opera);if(b&&(typeof(G_vmlCanvasManager)!="undefined")){a=G_vmlCanvasManager.initElement(a)}return a};Dygraph.isAndroid=function(){return(/Android/).test(navigator.userAgent)};Dygraph.repeatAndCleanup=function(b,g,f,c){var e=0;var d=new Date().getTime();b(e);if(g==1){c();return}(function a(){if(e>=g){return}var h=d+(1+e)*f;setTimeout(function(){e++;b(e);if(e>=g-1){c()}else{a()}},h-new Date().getTime())})()};Dygraph.isPixelChangingOptionList=function(h,e){var d={annotationClickHandler:true,annotationDblClickHandler:true,annotationMouseOutHandler:true,annotationMouseOverHandler:true,axisLabelColor:true,axisLineColor:true,axisLineWidth:true,clickCallback:true,digitsAfterDecimal:true,drawCallback:true,drawPoints:true,drawXGrid:true,drawYGrid:true,fillAlpha:true,gridLineColor:true,gridLineWidth:true,hideOverlayOnMouseOut:true,highlightCallback:true,highlightCircleSize:true,interactionModel:true,isZoomedIgnoreProgrammaticZoom:true,labelsDiv:true,labelsDivStyles:true,labelsDivWidth:true,labelsKMB:true,labelsKMG2:true,labelsSeparateLines:true,labelsShowZeroValues:true,legend:true,maxNumberWidth:true,panEdgeFraction:true,pixelsPerYLabel:true,pointClickCallback:true,pointSize:true,rangeSelectorPlotFillColor:true,rangeSelectorPlotStrokeColor:true,showLabelsOnHighlight:true,showRoller:true,sigFigs:true,strokeWidth:true,underlayCallback:true,unhighlightCallback:true,xAxisLabelFormatter:true,xTicker:true,xValueFormatter:true,yAxisLabelFormatter:true,yValueFormatter:true,zoomCallback:true};var a=false;var b={};if(h){for(var f=1;f<h.length;f++){b[h[f]]=true}}for(var g in e){if(a){break}if(e.hasOwnProperty(g)){if(b[g]){for(var c in e[g]){if(a){break}if(e[g].hasOwnProperty(c)&&!d[c]){a=true}}}else{if(!d[g]){a=true}}}}return a};Dygraph.compareArrays=function(c,b){if(!Dygraph.isArrayLike(c)||!Dygraph.isArrayLike(b)){return false}if(c.length!==b.length){return false}for(var a=0;a<c.length;a++){if(c[a]!==b[a]){return false}}return true};"use strict";Dygraph.GVizChart=function(a){this.container=a};Dygraph.GVizChart.prototype.draw=function(b,a){this.container.innerHTML="";if(typeof(this.date_graph)!="undefined"){this.date_graph.destroy()}this.date_graph=new Dygraph(this.container,b,a)};Dygraph.GVizChart.prototype.setSelection=function(b){var a=false;if(b.length){a=b[0].row}this.date_graph.setSelection(a)};Dygraph.GVizChart.prototype.getSelection=function(){var b=[];var d=this.date_graph.getSelection();if(d<0){return b}var a=this.date_graph.layout_.datasets;for(var c=0;c<a.length;++c){b.push({row:d,column:c+1})}return b};"use strict";Dygraph.Interaction={};Dygraph.Interaction.startPan=function(n,s,c){var q,b;c.isPanning=true;var j=s.xAxisRange();c.dateRange=j[1]-j[0];c.initialLeftmostDate=j[0];c.xUnitsPerPixel=c.dateRange/(s.plotter_.area.w-1);if(s.attr_("panEdgeFraction")){var v=s.width_*s.attr_("panEdgeFraction");var d=s.xAxisExtremes();var h=s.toDomXCoord(d[0])-v;var k=s.toDomXCoord(d[1])+v;var t=s.toDataXCoord(h);var u=s.toDataXCoord(k);c.boundedDates=[t,u];var f=[];var a=s.height_*s.attr_("panEdgeFraction");for(q=0;q<s.axes_.length;q++){b=s.axes_[q];var o=b.extremeRange;var p=s.toDomYCoord(o[0],q)+a;var r=s.toDomYCoord(o[1],q)-a;var m=s.toDataYCoord(p);var e=s.toDataYCoord(r);f[q]=[m,e]}c.boundedValues=f}c.is2DPan=false;for(q=0;q<s.axes_.length;q++){b=s.axes_[q];var l=s.yAxisRange(q);if(b.logscale){b.initialTopValue=Dygraph.log10(l[1]);b.dragValueRange=Dygraph.log10(l[1])-Dygraph.log10(l[0])}else{b.initialTopValue=l[1];b.dragValueRange=l[1]-l[0]}b.unitsPerPixel=b.dragValueRange/(s.plotter_.area.h-1);if(b.valueWindow||b.valueRange){c.is2DPan=true}}};Dygraph.Interaction.movePan=function(b,k,c){c.dragEndX=k.dragGetX_(b,c);c.dragEndY=k.dragGetY_(b,c);var h=c.initialLeftmostDate-(c.dragEndX-c.dragStartX)*c.xUnitsPerPixel;if(c.boundedDates){h=Math.max(h,c.boundedDates[0])}var a=h+c.dateRange;if(c.boundedDates){if(a>c.boundedDates[1]){h=h-(a-c.boundedDates[1]);a=h+c.dateRange}}k.dateWindow_=[h,a];if(c.is2DPan){for(var j=0;j<k.axes_.length;j++){var e=k.axes_[j];var d=c.dragEndY-c.dragStartY;var n=d*e.unitsPerPixel;var f=c.boundedValues?c.boundedValues[j]:null;var l=e.initialTopValue+n;if(f){l=Math.min(l,f[1])}var m=l-e.dragValueRange;if(f){if(m<f[0]){l=l-(m-f[0]);m=l-e.dragValueRange}}if(e.logscale){e.valueWindow=[Math.pow(Dygraph.LOG_SCALE,m),Math.pow(Dygraph.LOG_SCALE,l)]}else{e.valueWindow=[m,l]}}}k.drawGraph_(false)};Dygraph.Interaction.endPan=function(c,b,a){a.dragEndX=b.dragGetX_(c,a);a.dragEndY=b.dragGetY_(c,a);var e=Math.abs(a.dragEndX-a.dragStartX);var d=Math.abs(a.dragEndY-a.dragStartY);if(e<2&&d<2&&b.lastx_!==undefined&&b.lastx_!=-1){Dygraph.Interaction.treatMouseOpAsClick(b,c,a)}a.isPanning=false;a.is2DPan=false;a.initialLeftmostDate=null;a.dateRange=null;a.valueRange=null;a.boundedDates=null;a.boundedValues=null};Dygraph.Interaction.startZoom=function(c,b,a){a.isZooming=true};Dygraph.Interaction.moveZoom=function(c,b,a){a.dragEndX=b.dragGetX_(c,a);a.dragEndY=b.dragGetY_(c,a);var e=Math.abs(a.dragStartX-a.dragEndX);var d=Math.abs(a.dragStartY-a.dragEndY);a.dragDirection=(e<d/2)?Dygraph.VERTICAL:Dygraph.HORIZONTAL;b.drawZoomRect_(a.dragDirection,a.dragStartX,a.dragEndX,a.dragStartY,a.dragEndY,a.prevDragDirection,a.prevEndX,a.prevEndY);a.prevEndX=a.dragEndX;a.prevEndY=a.dragEndY;a.prevDragDirection=a.dragDirection};Dygraph.Interaction.treatMouseOpAsClick=function(f,b,d){var k=f.attr_("clickCallback");var n=f.attr_("pointClickCallback");var j=null;if(n){var l=-1;var m=Number.MAX_VALUE;for(var e=0;e<f.selPoints_.length;e++){var c=f.selPoints_[e];var a=Math.pow(c.canvasx-d.dragEndX,2)+Math.pow(c.canvasy-d.dragEndY,2);if(!isNaN(a)&&(l==-1||a<m)){m=a;l=e}}var h=f.attr_("highlightCircleSize")+2;if(m<=h*h){j=f.selPoints_[l]}}if(j){n(b,j)}if(k){k(b,f.lastx_,f.selPoints_)}};Dygraph.Interaction.endZoom=function(c,b,a){a.isZooming=false;a.dragEndX=b.dragGetX_(c,a);a.dragEndY=b.dragGetY_(c,a);var e=Math.abs(a.dragEndX-a.dragStartX);var d=Math.abs(a.dragEndY-a.dragStartY);if(e<2&&d<2&&b.lastx_!==undefined&&b.lastx_!=-1){Dygraph.Interaction.treatMouseOpAsClick(b,c,a)}if(e>=10&&a.dragDirection==Dygraph.HORIZONTAL){b.doZoomX_(Math.min(a.dragStartX,a.dragEndX),Math.max(a.dragStartX,a.dragEndX))}else{if(d>=10&&a.dragDirection==Dygraph.VERTICAL){b.doZoomY_(Math.min(a.dragStartY,a.dragEndY),Math.max(a.dragStartY,a.dragEndY))}else{b.clearZoomRect_()}}a.dragStartX=null;a.dragStartY=null};Dygraph.Interaction.defaultModel={mousedown:function(c,b,a){a.initializeMouseDown(c,b,a);if(c.altKey||c.shiftKey){Dygraph.startPan(c,b,a)}else{Dygraph.startZoom(c,b,a)}},mousemove:function(c,b,a){if(a.isZooming){Dygraph.moveZoom(c,b,a)}else{if(a.isPanning){Dygraph.movePan(c,b,a)}}},mouseup:function(c,b,a){if(a.isZooming){Dygraph.endZoom(c,b,a)}else{if(a.isPanning){Dygraph.endPan(c,b,a)}}},mouseout:function(c,b,a){if(a.isZooming){a.dragEndX=null;a.dragEndY=null}},dblclick:function(c,b,a){if(c.altKey||c.shiftKey){return}b.doUnzoom_()}};Dygraph.DEFAULT_ATTRS.interactionModel=Dygraph.Interaction.defaultModel;Dygraph.defaultInteractionModel=Dygraph.Interaction.defaultModel;Dygraph.endZoom=Dygraph.Interaction.endZoom;Dygraph.moveZoom=Dygraph.Interaction.moveZoom;Dygraph.startZoom=Dygraph.Interaction.startZoom;Dygraph.endPan=Dygraph.Interaction.endPan;Dygraph.movePan=Dygraph.Interaction.movePan;Dygraph.startPan=Dygraph.Interaction.startPan;Dygraph.Interaction.nonInteractiveModel_={mousedown:function(c,b,a){a.initializeMouseDown(c,b,a)},mouseup:function(c,b,a){a.dragEndX=b.dragGetX_(c,a);a.dragEndY=b.dragGetY_(c,a);var e=Math.abs(a.dragEndX-a.dragStartX);var d=Math.abs(a.dragEndY-a.dragStartY);if(e<2&&d<2&&b.lastx_!==undefined&&b.lastx_!=-1){Dygraph.Interaction.treatMouseOpAsClick(b,c,a)}}};Dygraph.Interaction.dragIsPanInteractionModel={mousedown:function(c,b,a){a.initializeMouseDown(c,b,a);Dygraph.startPan(c,b,a)},mousemove:function(c,b,a){if(a.isPanning){Dygraph.movePan(c,b,a)}},mouseup:function(c,b,a){if(a.isPanning){Dygraph.endPan(c,b,a)}}};"use strict";var DygraphRangeSelector=function(a){this.isIE_=/MSIE/.test(navigator.userAgent)&&!window.opera;this.isUsingExcanvas_=a.isUsingExcanvas_;this.dygraph_=a;this.createCanvases_();if(this.isUsingExcanvas_){this.createIEPanOverlay_()}this.createZoomHandles_();this.initInteraction_()};DygraphRangeSelector.prototype.addToGraph=function(a,b){this.layout_=b;this.resize_();a.appendChild(this.bgcanvas_);a.appendChild(this.fgcanvas_);a.appendChild(this.leftZoomHandle_);a.appendChild(this.rightZoomHandle_)};DygraphRangeSelector.prototype.renderStaticLayer=function(){this.resize_();this.drawStaticLayer_()};DygraphRangeSelector.prototype.renderInteractiveLayer=function(){if(this.isChangingRange_){return}this.placeZoomHandles_();this.drawInteractiveLayer_()};DygraphRangeSelector.prototype.resize_=function(){function c(d,e){d.style.top=e.y+"px";d.style.left=e.x+"px";d.width=e.w;d.height=e.h;d.style.width=d.width+"px";d.style.height=d.height+"px"}var b=this.layout_.getPlotArea();var a=this.attr_("axisLabelFontSize")+2*this.attr_("axisTickSize");this.canvasRect_={x:b.x,y:b.y+b.h+a+4,w:b.w,h:this.attr_("rangeSelectorHeight")};c(this.bgcanvas_,this.canvasRect_);c(this.fgcanvas_,this.canvasRect_)};DygraphRangeSelector.prototype.attr_=function(a){return this.dygraph_.attr_(a)};DygraphRangeSelector.prototype.createCanvases_=function(){this.bgcanvas_=Dygraph.createCanvas();this.bgcanvas_.className="dygraph-rangesel-bgcanvas";this.bgcanvas_.style.position="absolute";this.bgcanvas_.style.zIndex=9;this.bgcanvas_ctx_=Dygraph.getContext(this.bgcanvas_);this.fgcanvas_=Dygraph.createCanvas();this.fgcanvas_.className="dygraph-rangesel-fgcanvas";this.fgcanvas_.style.position="absolute";this.fgcanvas_.style.zIndex=9;this.fgcanvas_.style.cursor="default";this.fgcanvas_ctx_=Dygraph.getContext(this.fgcanvas_)};DygraphRangeSelector.prototype.createIEPanOverlay_=function(){this.iePanOverlay_=document.createElement("div");this.iePanOverlay_.style.position="absolute";this.iePanOverlay_.style.backgroundColor="white";this.iePanOverlay_.style.filter="alpha(opacity=0)";this.iePanOverlay_.style.display="none";this.iePanOverlay_.style.cursor="move";this.fgcanvas_.appendChild(this.iePanOverlay_)};DygraphRangeSelector.prototype.createZoomHandles_=function(){var a=new Image();a.className="dygraph-rangesel-zoomhandle";a.style.position="absolute";a.style.zIndex=10;a.style.visibility="hidden";a.style.cursor="col-resize";if(/MSIE 7/.test(navigator.userAgent)){a.width=7;a.height=14;a.style.backgroundColor="white";a.style.border="1px solid #333333"}else{a.width=9;a.height=16;a.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="}this.leftZoomHandle_=a;this.rightZoomHandle_=a.cloneNode(false)};DygraphRangeSelector.prototype.initInteraction_=function(){var i=this;var f=this.isIE_?document:window;var k=0;var p=null;var n=false;var c=false;var j,d,m,g,q,e,r,o,l,b,h;j=function(w){var v=i.dygraph_.xAxisExtremes();var t=(v[1]-v[0])/i.canvasRect_.w;var u=v[0]+(w.leftHandlePos-i.canvasRect_.x)*t;var s=v[0]+(w.rightHandlePos-i.canvasRect_.x)*t;return[u,s]};d=function(s){Dygraph.cancelEvent(s);n=true;k=s.screenX;p=s.target?s.target:s.srcElement;Dygraph.addEvent(f,"mousemove",m);Dygraph.addEvent(f,"mouseup",g);i.fgcanvas_.style.cursor="col-resize"};m=function(w){if(!n){return}var t=w.screenX-k;if(Math.abs(t)<4){return}k=w.screenX;var v=i.getZoomHandleStatus_();var s;if(p==i.leftZoomHandle_){s=v.leftHandlePos+t;s=Math.min(s,v.rightHandlePos-p.width-3);s=Math.max(s,i.canvasRect_.x)}else{s=v.rightHandlePos+t;s=Math.min(s,i.canvasRect_.x+i.canvasRect_.w);s=Math.max(s,v.leftHandlePos+p.width+3)}var u=p.width/2;p.style.left=(s-u)+"px";i.drawInteractiveLayer_();if(!i.isUsingExcanvas_){q()}};g=function(s){if(!n){return}n=false;Dygraph.removeEvent(f,"mousemove",m);Dygraph.removeEvent(f,"mouseup",g);i.fgcanvas_.style.cursor="default";if(i.isUsingExcanvas_){q()}};q=function(){try{var t=i.getZoomHandleStatus_();i.isChangingRange_=true;if(!t.isZoomed){i.dygraph_.doUnzoom_()}else{var s=j(t);i.dygraph_.doZoomXDates_(s[0],s[1])}}finally{i.isChangingRange_=false}};e=function(u){if(i.isUsingExcanvas_){return u.srcElement==i.iePanOverlay_}else{var s;if(u.offsetX!=undefined){s=i.canvasRect_.x+u.offsetX}else{s=u.clientX}var t=i.getZoomHandleStatus_();return(s>t.leftHandlePos&&s<t.rightHandlePos)}};r=function(s){if(!c&&e(s)&&i.getZoomHandleStatus_().isZoomed){Dygraph.cancelEvent(s);c=true;k=s.screenX;Dygraph.addEvent(f,"mousemove",o);Dygraph.addEvent(f,"mouseup",l)}};o=function(w){if(!c){return}Dygraph.cancelEvent(w);var t=w.screenX-k;if(Math.abs(t)<4){return}k=w.screenX;var v=i.getZoomHandleStatus_();var y=v.leftHandlePos;var s=v.rightHandlePos;var x=s-y;if(y+t<=i.canvasRect_.x){y=i.canvasRect_.x;s=y+x}else{if(s+t>=i.canvasRect_.x+i.canvasRect_.w){s=i.canvasRect_.x+i.canvasRect_.w;y=s-x}else{y+=t;s+=t}}var u=i.leftZoomHandle_.width/2;i.leftZoomHandle_.style.left=(y-u)+"px";i.rightZoomHandle_.style.left=(s-u)+"px";i.drawInteractiveLayer_();if(!i.isUsingExcanvas_){b()}};l=function(s){if(!c){return}c=false;Dygraph.removeEvent(f,"mousemove",o);Dygraph.removeEvent(f,"mouseup",l);if(i.isUsingExcanvas_){b()}};b=function(){try{i.isChangingRange_=true;i.dygraph_.dateWindow_=j(i.getZoomHandleStatus_());i.dygraph_.drawGraph_(false)}finally{i.isChangingRange_=false}};h=function(s){if(n||c){return}var t=e(s)?"move":"default";if(t!=i.fgcanvas_.style.cursor){i.fgcanvas_.style.cursor=t}};this.dygraph_.attrs_.interactionModel=Dygraph.Interaction.dragIsPanInteractionModel;this.dygraph_.attrs_.panEdgeFraction=0.0001;var a=window.opera?"mousedown":"dragstart";Dygraph.addEvent(this.leftZoomHandle_,a,d);Dygraph.addEvent(this.rightZoomHandle_,a,d);if(this.isUsingExcanvas_){Dygraph.addEvent(this.iePanOverlay_,"mousedown",r)}else{Dygraph.addEvent(this.fgcanvas_,"mousedown",r);Dygraph.addEvent(this.fgcanvas_,"mousemove",h)}};DygraphRangeSelector.prototype.drawStaticLayer_=function(){var a=this.bgcanvas_ctx_;a.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);try{this.drawMiniPlot_()}catch(b){Dygraph.warn(b)}var c=0.5;this.bgcanvas_ctx_.lineWidth=1;a.strokeStyle="gray";a.beginPath();a.moveTo(c,c);a.lineTo(c,this.canvasRect_.h-c);a.lineTo(this.canvasRect_.w-c,this.canvasRect_.h-c);a.lineTo(this.canvasRect_.w-c,c);a.stroke()};DygraphRangeSelector.prototype.drawMiniPlot_=function(){var p=this.attr_("rangeSelectorPlotFillColor");var l=this.attr_("rangeSelectorPlotStrokeColor");if(!p&&!l){return}var m=this.computeCombinedSeriesAndLimits_();var e=m.yMax-m.yMin;var r=this.bgcanvas_ctx_;var f=0.5;var j=this.dygraph_.xAxisExtremes();var b=Math.max(j[1]-j[0],1e-30);var q=(this.canvasRect_.w-f)/b;var o=(this.canvasRect_.h-f)/e;var d=this.canvasRect_.w-f;var h=this.canvasRect_.h-f;r.beginPath();r.moveTo(f,h);for(var g=0;g<m.data.length;g++){var a=m.data[g];var n=(a[0]-j[0])*q;var k=h-(a[1]-m.yMin)*o;if(isFinite(n)&&isFinite(k)){r.lineTo(n,k)}}r.lineTo(d,h);r.closePath();if(p){var c=this.bgcanvas_ctx_.createLinearGradient(0,0,0,h);c.addColorStop(0,"white");c.addColorStop(1,p);this.bgcanvas_ctx_.fillStyle=c;r.fill()}if(l){this.bgcanvas_ctx_.strokeStyle=l;this.bgcanvas_ctx_.lineWidth=1.5;r.stroke()}};DygraphRangeSelector.prototype.computeCombinedSeriesAndLimits_=function(){var u=this.dygraph_.rawData_;var t=this.attr_("logscale");var p=[];var c;var g;var f,m;var l;var s,r,q;for(s=0;s<u.length;s++){if(u[s].length>1&&u[s][1]!=null){l=typeof u[s][1]!="number";if(l){c=[];g=[];for(q=0;q<u[s][1].length;q++){c.push(0);g.push(0)}}break}}for(s=0;s<u.length;s++){var h=u[s];var d=h[0];if(l){for(q=0;q<c.length;q++){c[q]=g[q]=0}}else{c=g=0}for(r=1;r<h.length;r++){if(this.dygraph_.visibility()[r-1]){if(l){for(q=0;q<c.length;q++){m=h[r][q];if(m===null||isNaN(m)){continue}c[q]+=m;g[q]++}}else{m=h[r];if(m===null||isNaN(m)){continue}c+=m;g++}}}if(l){for(q=0;q<c.length;q++){c[q]/=g[q]}f=c.slice(0)}else{f=c/g}p.push([d,f])}p=this.dygraph_.rollingAverage(p,this.dygraph_.rollPeriod_);if(typeof p[0][1]!="number"){for(s=0;s<p.length;s++){f=p[s][1];p[s][1]=f[0]}}var a=Number.MAX_VALUE;var b=-Number.MAX_VALUE;for(s=0;s<p.length;s++){f=p[s][1];if(f!==null&&isFinite(f)&&(!t||f>0)){a=Math.min(a,f);b=Math.max(b,f)}}var n=0.25;if(t){b=Dygraph.log10(b);b+=b*n;a=Dygraph.log10(a);for(s=0;s<p.length;s++){p[s][1]=Dygraph.log10(p[s][1])}}else{var e;var o=b-a;if(o<=Number.MIN_VALUE){e=b*n}else{e=o*n}b+=e;a-=e}return{data:p,yMin:a,yMax:b}};DygraphRangeSelector.prototype.placeZoomHandles_=function(){var g=this.dygraph_.xAxisExtremes();var a=this.dygraph_.xAxisRange();var b=g[1]-g[0];var i=Math.max(0,(a[0]-g[0])/b);var e=Math.max(0,(g[1]-a[1])/b);var h=this.canvasRect_.x+this.canvasRect_.w*i;var d=this.canvasRect_.x+this.canvasRect_.w*(1-e);var c=Math.max(this.canvasRect_.y,this.canvasRect_.y+(this.canvasRect_.h-this.leftZoomHandle_.height)/2);var f=this.leftZoomHandle_.width/2;this.leftZoomHandle_.style.left=(h-f)+"px";this.leftZoomHandle_.style.top=c+"px";this.rightZoomHandle_.style.left=(d-f)+"px";this.rightZoomHandle_.style.top=this.leftZoomHandle_.style.top;this.leftZoomHandle_.style.visibility="visible";this.rightZoomHandle_.style.visibility="visible"};DygraphRangeSelector.prototype.drawInteractiveLayer_=function(){var b=this.fgcanvas_ctx_;b.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);var e=1;var d=this.canvasRect_.w-e;var a=this.canvasRect_.h-e;var g=this.getZoomHandleStatus_();b.strokeStyle="black";if(!g.isZoomed){b.beginPath();b.moveTo(e,e);b.lineTo(e,a);b.lineTo(d,a);b.lineTo(d,e);b.stroke();if(this.iePanOverlay_){this.iePanOverlay_.style.display="none"}}else{var f=Math.max(e,g.leftHandlePos-this.canvasRect_.x);var c=Math.min(d,g.rightHandlePos-this.canvasRect_.x);b.fillStyle="rgba(240, 240, 240, 0.6)";b.fillRect(0,0,f,this.canvasRect_.h);b.fillRect(c,0,this.canvasRect_.w-c,this.canvasRect_.h);b.beginPath();b.moveTo(e,e);b.lineTo(f,e);b.lineTo(f,a);b.lineTo(c,a);b.lineTo(c,e);b.lineTo(d,e);b.stroke();if(this.isUsingExcanvas_){this.iePanOverlay_.style.width=(c-f)+"px";this.iePanOverlay_.style.left=f+"px";this.iePanOverlay_.style.height=a+"px";this.iePanOverlay_.style.display="inline"}}};DygraphRangeSelector.prototype.getZoomHandleStatus_=function(){var b=this.leftZoomHandle_.width/2;var c=parseInt(this.leftZoomHandle_.style.left,10)+b;var a=parseInt(this.rightZoomHandle_.style.left,10)+b;return{leftHandlePos:c,rightHandlePos:a,isZoomed:(c-1>this.canvasRect_.x||a+1<this.canvasRect_.x+this.canvasRect_.w)}};"use strict";Dygraph.numericTicks=function(I,H,w,r,d,s){var C=r("pixelsPerLabel");var J=[];var F,D,v,A;if(s){for(F=0;F<s.length;F++){J.push({v:s[F]})}}else{if(r("logscale")){A=Math.floor(w/C);var o=Dygraph.binarySearch(I,Dygraph.PREFERRED_LOG_TICK_VALUES,1);var K=Dygraph.binarySearch(H,Dygraph.PREFERRED_LOG_TICK_VALUES,-1);if(o==-1){o=0}if(K==-1){K=Dygraph.PREFERRED_LOG_TICK_VALUES.length-1}var u=null;if(K-o>=A/4){for(var t=K;t>=o;t--){var p=Dygraph.PREFERRED_LOG_TICK_VALUES[t];var m=Math.log(p/I)/Math.log(H/I)*w;var G={v:p};if(u===null){u={tickValue:p,pixel_coord:m}}else{if(Math.abs(m-u.pixel_coord)>=C){u={tickValue:p,pixel_coord:m}}else{G.label=""}}J.push(G)}J.reverse()}}if(J.length===0){var h=r("labelsKMG2");var q;if(h){q=[1,2,4,8]}else{q=[1,2,5]}var L,z,c;for(F=-10;F<50;F++){var g;if(h){g=Math.pow(16,F)}else{g=Math.pow(10,F)}var f=0;for(D=0;D<q.length;D++){L=g*q[D];z=Math.floor(I/L)*L;c=Math.ceil(H/L)*L;A=Math.abs(c-z)/L;f=w/A;if(f>C){break}}if(f>C){break}}if(z>c){L*=-1}for(F=0;F<A;F++){v=z+F*L;J.push({v:v})}}}var B;var y=[];if(r("labelsKMB")){B=1000;y=["K","M","B","T"]}if(r("labelsKMG2")){if(B){Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!")}B=1024;y=["k","M","G","T"]}var E=r("axisLabelFormatter");for(F=0;F<J.length;F++){if(J[F].label!==undefined){continue}v=J[F].v;var e=Math.abs(v);var l=E(v,0,r,d);if(y.length>0){var x=B*B*B*B;for(D=3;D>=0;D--,x/=B){if(e>=x){l=Dygraph.round_(v/x,r("digitsAfterDecimal"))+y[D];break}}}J[F].label=l}return J};Dygraph.dateTicker=function(e,c,i,g,f,h){var d=Dygraph.pickDateTickGranularity(e,c,i,g);if(d>=0){return Dygraph.getDateAxis(e,c,d,g,f)}else{return[]}};Dygraph.SECONDLY=0;Dygraph.TWO_SECONDLY=1;Dygraph.FIVE_SECONDLY=2;Dygraph.TEN_SECONDLY=3;Dygraph.THIRTY_SECONDLY=4;Dygraph.MINUTELY=5;Dygraph.TWO_MINUTELY=6;Dygraph.FIVE_MINUTELY=7;Dygraph.TEN_MINUTELY=8;Dygraph.THIRTY_MINUTELY=9;Dygraph.HOURLY=10;Dygraph.TWO_HOURLY=11;Dygraph.SIX_HOURLY=12;Dygraph.DAILY=13;Dygraph.WEEKLY=14;Dygraph.MONTHLY=15;Dygraph.QUARTERLY=16;Dygraph.BIANNUAL=17;Dygraph.ANNUAL=18;Dygraph.DECADAL=19;Dygraph.CENTENNIAL=20;Dygraph.NUM_GRANULARITIES=21;Dygraph.SHORT_SPACINGS=[];Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1000*1;Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY]=1000*2;Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY]=1000*5;Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1000*10;Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=1000*30;Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=1000*60;Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY]=1000*60*2;Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY]=1000*60*5;Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=1000*60*10;Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=1000*60*30;Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600;Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]=1000*3600*2;Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]=1000*3600*6;Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=1000*86400;Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=1000*604800;Dygraph.PREFERRED_LOG_TICK_VALUES=function(){var c=[];for(var b=-39;b<=39;b++){var a=Math.pow(10,b);for(var d=1;d<=9;d++){var e=a*d;c.push(e)}}return c}();Dygraph.pickDateTickGranularity=function(d,c,j,h){var g=h("pixelsPerLabel");for(var f=0;f<Dygraph.NUM_GRANULARITIES;f++){var e=Dygraph.numDateTicks(d,c,f);if(j/e>=g){return f}}return -1};Dygraph.numDateTicks=function(e,b,g){if(g<Dygraph.MONTHLY){var h=Dygraph.SHORT_SPACINGS[g];return Math.floor(0.5+1*(b-e)/h)}else{var f=1;var d=12;if(g==Dygraph.QUARTERLY){d=3}if(g==Dygraph.BIANNUAL){d=2}if(g==Dygraph.ANNUAL){d=1}if(g==Dygraph.DECADAL){d=1;f=10}if(g==Dygraph.CENTENNIAL){d=1;f=100}var c=365.2524*24*3600*1000;var a=1*(b-e)/c;return Math.floor(0.5+1*a*d/f)}};Dygraph.getDateAxis=function(n,h,a,l,w){var u=l("axisLabelFormatter");var z=[];var k;if(a<Dygraph.MONTHLY){var c=Dygraph.SHORT_SPACINGS[a];var v=c/1000;var y=new Date(n);var f;if(v<=60){f=y.getSeconds();y.setSeconds(f-f%v)}else{y.setSeconds(0);v/=60;if(v<=60){f=y.getMinutes();y.setMinutes(f-f%v)}else{y.setMinutes(0);v/=60;if(v<=24){f=y.getHours();y.setHours(f-f%v)}else{y.setHours(0);v/=24;if(v==7){y.setDate(y.getDate()-y.getDay())}}}}n=y.getTime();for(k=n;k<=h;k+=c){z.push({v:k,label:u(new Date(k),a,l,w)})}}else{var e;var o=1;if(a==Dygraph.MONTHLY){e=[0,1,2,3,4,5,6,7,8,9,10,11]}else{if(a==Dygraph.QUARTERLY){e=[0,3,6,9]}else{if(a==Dygraph.BIANNUAL){e=[0,6]}else{if(a==Dygraph.ANNUAL){e=[0]}else{if(a==Dygraph.DECADAL){e=[0];o=10}else{if(a==Dygraph.CENTENNIAL){e=[0];o=100}else{Dygraph.warn("Span of dates is too long")}}}}}}var s=new Date(n).getFullYear();var p=new Date(h).getFullYear();var b=Dygraph.zeropad;for(var r=s;r<=p;r++){if(r%o!==0){continue}for(var q=0;q<e.length;q++){var m=r+"/"+b(1+e[q])+"/01";k=Dygraph.dateStrToMillis(m);if(k<n||k>h){continue}z.push({v:k,label:u(new Date(k),a,l,w)})}}}return z};Dygraph.DEFAULT_ATTRS.axes.x.ticker=Dygraph.dateTicker;Dygraph.DEFAULT_ATTRS.axes.y.ticker=Dygraph.numericTicks;Dygraph.DEFAULT_ATTRS.axes.y2.ticker=Dygraph.numericTicks;"use strict";function RGBColor(f){this.ok=false;if(f.charAt(0)=="#"){f=f.substr(1,6)}f=f.replace(/ /g,"");f=f.toLowerCase();var b={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};for(var g in b){if(f==g){f=b[g]}}var e=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(i){return[parseInt(i[1]),parseInt(i[2]),parseInt(i[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(i){return[parseInt(i[1],16),parseInt(i[2],16),parseInt(i[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(i){return[parseInt(i[1]+i[1],16),parseInt(i[2]+i[2],16),parseInt(i[3]+i[3],16)]}}];for(var c=0;c<e.length;c++){var j=e[c].re;var a=e[c].process;var h=j.exec(f);if(h){var d=a(h);this.r=d[0];this.g=d[1];this.b=d[2];this.ok=true}}this.r=(this.r<0||isNaN(this.r))?0:((this.r>255)?255:this.r);this.g=(this.g<0||isNaN(this.g))?0:((this.g>255)?255:this.g);this.b=(this.b<0||isNaN(this.b))?0:((this.b>255)?255:this.b);this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toHex=function(){var l=this.r.toString(16);var k=this.g.toString(16);var i=this.b.toString(16);if(l.length==1){l="0"+l}if(k.length==1){k="0"+k}if(i.length==1){i="0"+i}return"#"+l+k+i}}Date.ext={};Date.ext.util={};Date.ext.util.xPad=function(a,c,b){if(typeof(b)=="undefined"){b=10}for(;parseInt(a,10)<b&&b>1;b/=10){a=c.toString()+a}return a.toString()};Date.prototype.locale="en-GB";if(document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang){Date.prototype.locale=document.getElementsByTagName("html")[0].lang}Date.ext.locales={};Date.ext.locales.en={a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],B:["January","February","March","April","May","June","July","August","September","October","November","December"],c:"%a %d %b %Y %T %Z",p:["AM","PM"],P:["am","pm"],x:"%d/%m/%y",X:"%T"};Date.ext.locales["en-US"]=Date.ext.locales.en;Date.ext.locales["en-US"].c="%a %d %b %Y %r %Z";Date.ext.locales["en-US"].x="%D";Date.ext.locales["en-US"].X="%r";Date.ext.locales["en-GB"]=Date.ext.locales.en;Date.ext.locales["en-AU"]=Date.ext.locales["en-GB"];Date.ext.formats={a:function(a){return Date.ext.locales[a.locale].a[a.getDay()]},A:function(a){return Date.ext.locales[a.locale].A[a.getDay()]},b:function(a){return Date.ext.locales[a.locale].b[a.getMonth()]},B:function(a){return Date.ext.locales[a.locale].B[a.getMonth()]},c:"toLocaleString",C:function(a){return Date.ext.util.xPad(parseInt(a.getFullYear()/100,10),0)},d:["getDate","0"],e:["getDate"," "],g:function(a){return Date.ext.util.xPad(parseInt(Date.ext.util.G(a)/100,10),0)},G:function(c){var e=c.getFullYear();var b=parseInt(Date.ext.formats.V(c),10);var a=parseInt(Date.ext.formats.W(c),10);if(a>b){e++}else{if(a===0&&b>=52){e--}}return e},H:["getHours","0"],I:function(b){var a=b.getHours()%12;return Date.ext.util.xPad(a===0?12:a,0)},j:function(c){var a=c-new Date(""+c.getFullYear()+"/1/1 GMT");a+=c.getTimezoneOffset()*60000;var b=parseInt(a/60000/60/24,10)+1;return Date.ext.util.xPad(b,0,100)},m:function(a){return Date.ext.util.xPad(a.getMonth()+1,0)},M:["getMinutes","0"],p:function(a){return Date.ext.locales[a.locale].p[a.getHours()>=12?1:0]},P:function(a){return Date.ext.locales[a.locale].P[a.getHours()>=12?1:0]},S:["getSeconds","0"],u:function(a){var b=a.getDay();return b===0?7:b},U:function(e){var a=parseInt(Date.ext.formats.j(e),10);var c=6-e.getDay();var b=parseInt((a+c)/7,10);return Date.ext.util.xPad(b,0)},V:function(e){var c=parseInt(Date.ext.formats.W(e),10);var a=(new Date(""+e.getFullYear()+"/1/1")).getDay();var b=c+(a>4||a<=1?0:1);if(b==53&&(new Date(""+e.getFullYear()+"/12/31")).getDay()<4){b=1}else{if(b===0){b=Date.ext.formats.V(new Date(""+(e.getFullYear()-1)+"/12/31"))}}return Date.ext.util.xPad(b,0)},w:"getDay",W:function(e){var a=parseInt(Date.ext.formats.j(e),10);var c=7-Date.ext.formats.u(e);var b=parseInt((a+c)/7,10);return Date.ext.util.xPad(b,0,10)},y:function(a){return Date.ext.util.xPad(a.getFullYear()%100,0)},Y:"getFullYear",z:function(c){var b=c.getTimezoneOffset();var a=Date.ext.util.xPad(parseInt(Math.abs(b/60),10),0);var e=Date.ext.util.xPad(b%60,0);return(b>0?"-":"+")+a+e},Z:function(a){return a.toString().replace(/^.*\(([^)]+)\)$/,"$1")},"%":function(a){return"%"}};Date.ext.aggregates={c:"locale",D:"%m/%d/%y",h:"%b",n:"\n",r:"%I:%M:%S %p",R:"%H:%M",t:"\t",T:"%H:%M:%S",x:"locale",X:"locale"};Date.ext.aggregates.z=Date.ext.formats.z(new Date());Date.ext.aggregates.Z=Date.ext.formats.Z(new Date());Date.ext.unsupported={};Date.prototype.strftime=function(a){if(!(this.locale in Date.ext.locales)){if(this.locale.replace(/-[a-zA-Z]+$/,"") in Date.ext.locales){this.locale=this.locale.replace(/-[a-zA-Z]+$/,"")}else{this.locale="en-GB"}}var c=this;while(a.match(/%[cDhnrRtTxXzZ]/)){a=a.replace(/%([cDhnrRtTxXzZ])/g,function(e,d){var g=Date.ext.aggregates[d];return(g=="locale"?Date.ext.locales[c.locale][d]:g)})}var b=a.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g,function(e,d){var g=Date.ext.formats[d];if(typeof(g)=="string"){return c[g]()}else{if(typeof(g)=="function"){return g.call(c,c)}else{if(typeof(g)=="object"&&typeof(g[0])=="string"){return Date.ext.util.xPad(c[g[0]](),g[1])}else{return d}}}});c=null;return b};
\ No newline at end of file
+/**
+ * @license
+ * Copyright 2011 Dan Vanderkam (danvdk@gmail.com)
+ * MIT-licensed (http://opensource.org/licenses/MIT)
+ *//**
+ * @fileoverview Based on PlotKitLayout, but modified to meet the needs of
+ * dygraphs.
+ *//*jshint globalstrict: true *//*global Dygraph:false */function RGBColor(a){this.ok=!1,a.charAt(0)=="#"&&(a=a.substr(1,6)),a=a.replace(/ /g,""),a=a.toLowerCase();var b={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};for(var c in b)a==c&&(a=b[c]);var d=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(a){return[parseInt(a[1]),parseInt(a[2]),parseInt(a[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}}];for(var e=0;e<d.length;e++){var f=d[e].re,g=d[e].process,h=f.exec(a);if(h){var i=g(h);this.r=i[0],this.g=i[1],this.b=i[2],this.ok=!0}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var a=this.r.toString(16),b=this.g.toString(16),c=this.b.toString(16);return a.length==1&&(a="0"+a),b.length==1&&(b="0"+b),c.length==1&&(c="0"+c),"#"+a+b+c}}"use strict";var DygraphLayout=function(a){this.dygraph_=a,this.datasets=[],this.setNames=[],this.annotations=[],this.yAxes_=null,this.xTicks_=null,this.yTicks_=null};DygraphLayout.prototype.attr_=function(a){return this.dygraph_.attr_(a)},DygraphLayout.prototype.addDataset=function(a,b){this.datasets.push(b),this.setNames.push(a)},DygraphLayout.prototype.getPlotArea=function(){return this.computePlotArea_()},DygraphLayout.prototype.computePlotArea_=function(){var a={x:0,y:0};return this.attr_("drawYAxis")&&(a.x=this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize")),a.w=this.dygraph_.width_-a.x-this.attr_("rightGap"),a.h=this.dygraph_.height_,this.attr_("drawXAxis")&&(this.attr_("xAxisHeight")?a.h-=this.attr_("xAxisHeight"):a.h-=this.attr_("axisLabelFontSize")+2*this.attr_("axisTickSize")),this.dygraph_.numAxes()==2?a.w-=this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize"):this.dygraph_.numAxes()>2&&this.dygraph_.error("Only two y-axes are supported at this time. (Trying to use "+this.dygraph_.numAxes()+")"),this.attr_("title")&&(a.h-=this.attr_("titleHeight"),a.y+=this.attr_("titleHeight")),this.attr_("xlabel")&&(a.h-=this.attr_("xLabelHeight")),!this.attr_("ylabel"),!this.attr_("y2label"),this.attr_("showRangeSelector")&&(a.h-=this.attr_("rangeSelectorHeight")+4),a},DygraphLayout.prototype.setAnnotations=function(a){this.annotations=[];var b=this.attr_("xValueParser")||function(a){return a};for(var c=0;c<a.length;c++){var d={};if(!a[c].xval&&!a[c].x){this.dygraph_.error("Annotations must have an 'x' property");return}if(a[c].icon&&(!a[c].hasOwnProperty("width")||!a[c].hasOwnProperty("height"))){this.dygraph_.error("Must set width and height when setting annotation.icon property");return}Dygraph.update(d,a[c]),d.xval||(d.xval=b(d.x)),this.annotations.push(d)}},DygraphLayout.prototype.setXTicks=function(a){this.xTicks_=a},DygraphLayout.prototype.setYAxes=function(a){this.yAxes_=a},DygraphLayout.prototype.setDateWindow=function(a){this.dateWindow_=a},DygraphLayout.prototype.evaluate=function(){this._evaluateLimits(),this._evaluateLineCharts(),this._evaluateLineTicks(),this._evaluateAnnotations()},DygraphLayout.prototype._evaluateLimits=function(){this.minxval=this.maxxval=null;if(this.dateWindow_)this.minxval=this.dateWindow_[0],this.maxxval=this.dateWindow_[1];else for(var a=0;a<this.datasets.length;++a){var b=this.datasets[a];if(b.length>1){var c=b[0][0];if(!this.minxval||c<this.minxval)this.minxval=c;var d=b[b.length-1][0];if(!this.maxxval||d>this.maxxval)this.maxxval=d}}this.xrange=this.maxxval-this.minxval,this.xscale=this.xrange!==0?1/this.xrange:1;for(var e=0;e<this.yAxes_.length;e++){var f=this.yAxes_[e];f.minyval=f.computedValueRange[0],f.maxyval=f.computedValueRange[1],f.yrange=f.maxyval-f.minyval,f.yscale=f.yrange!==0?1/f.yrange:1,f.g.attr_("logscale")&&(f.ylogrange=Dygraph.log10(f.maxyval)-Dygraph.log10(f.minyval),f.ylogscale=f.ylogrange!==0?1/f.ylogrange:1,(!isFinite(f.ylogrange)||isNaN(f.ylogrange))&&f.g.error("axis "+e+" of graph at "+f.g+" can't be displayed in log scale for range ["+f.minyval+" - "+f.maxyval+"]"))}},DygraphLayout._calcYNormal=function(a,b){return a.logscale?1-(Dygraph.log10(b)-Dygraph.log10(a.minyval))*a.ylogscale:1-(b-a.minyval)*a.yscale},DygraphLayout.prototype._evaluateLineCharts=function(){this.points=[],this.setPointsLengths=[],this.setPointsOffsets=[];var a=this.attr_("connectSeparatedPoints");for(var b=0;b<this.datasets.length;++b){var c=this.datasets[b],d=this.setNames[b],e=this.dygraph_.axisPropertiesForSeries(d);this.setPointsOffsets.push(this.points.length);var f=0;for(var g=0;g<c.length;g++){var h=c[g],i=parseFloat(h[0]),j=parseFloat(h[1]),k=(i-this.minxval)*this.xscale,l=DygraphLayout._calcYNormal(e,j),m={x:k,y:l,xval:i,yval:j,name:d};a&&h[1]===null&&(m.yval=null),this.points.push(m),f+=1}this.setPointsLengths.push(f)}},DygraphLayout.prototype._evaluateLineTicks=function(){var a,b,c,d;this.xticks=[];for(a=0;a<this.xTicks_.length;a++)b=this.xTicks_[a],c=b.label,d=this.xscale*(b.v-this.minxval),d>=0&&d<=1&&this.xticks.push([d,c]);this.yticks=[];for(a=0;a<this.yAxes_.length;a++){var e=this.yAxes_[a];for(var f=0;f<e.ticks.length;f++)b=e.ticks[f],c=b.label,d=this.dygraph_.toPercentYCoord(b.v,a),d>=0&&d<=1&&this.yticks.push([a,d,c])}},DygraphLayout.prototype.evaluateWithError=function(){this.evaluate();if(!this.attr_("errorBars")&&!this.attr_("customBars"))return;var a=0;for(var b=0;b<this.datasets.length;++b){var c=0,d=this.datasets[b],e=this.setNames[b],f=this.dygraph_.axisPropertiesForSeries(e);for(c=0;c<d.length;c++,a++){var g=d[c],h=parseFloat(g[0]),i=parseFloat(g[1]);if(h==this.points[a].xval&&i==this.points[a].yval){var j=parseFloat(g[2]),k=parseFloat(g[3]),l=i-j,m=i+k;this.points[a].y_top=DygraphLayout._calcYNormal(f,l),this.points[a].y_bottom=DygraphLayout._calcYNormal(f,m)}}}},DygraphLayout.prototype._evaluateAnnotations=function(){var a,b={};for(a=0;a<this.annotations.length;a++){var c=this.annotations[a];b[c.xval+","+c.series]=c}this.annotated_points=[];if(!this.annotations||!this.annotations.length)return;for(a=0;a<this.points.length;a++){var d=this.points[a],e=d.xval+","+d.name;e in b&&(d.annotation=b[e],this.annotated_points.push(d))}},DygraphLayout.prototype.removeAllDatasets=function(){delete this.datasets,delete this.setNames,delete this.setPointsLengths,delete this.setPointsOffsets,this.datasets=[],this.setNames=[],this.setPointsLengths=[],this.setPointsOffsets=[]},DygraphLayout.prototype.unstackPointAtIndex=function(a){var b=this.points[a],c={};for(var d in b)c[d]=b[d];if(!this.attr_("stackedGraph"))return c;for(var e=a+1;e<this.points.length;e++)if(this.points[e].xval==b.xval){c.yval-=this.points[e].yval;break}return c},"use strict";var DygraphCanvasRenderer=function(a,b,c,d){this.dygraph_=a,this.layout=d,this.element=b,this.elementContext=c,this.container=this.element.parentNode,this.height=this.element.height,this.width=this.element.width;if(!this.isIE&&!DygraphCanvasRenderer.isSupported(this.element))throw"Canvas is not supported.";this.xlabels=[],this.ylabels=[],this.annotations=[],this.chartLabels={},this.area=d.getPlotArea(),this.container.style.position="relative",this.container.style.width=this.width+"px";if(this.dygraph_.isUsingExcanvas_)this._createIEClipArea();else if(!Dygraph.isAndroid()){var e=this.dygraph_.canvas_ctx_;e.beginPath(),e.rect(this.area.x,this.area.y,this.area.w,this.area.h),e.clip(),e=this.dygraph_.hidden_ctx_,e.beginPath(),e.rect(this.area.x,this.area.y,this.area.w,this.area.h),e.clip()}};DygraphCanvasRenderer.prototype.attr_=function(a){return this.dygraph_.attr_(a)},DygraphCanvasRenderer.prototype.clear=function(){function c(a){for(var b=0;b<a.length;b++){var c=a[b];c.parentNode&&c.parentNode.removeChild(c)}}var a;if(this.isIE)try{this.clearDelay&&(this.clearDelay.cancel(),this.clearDelay=null),a=this.elementContext}catch(b){return}a=this.elementContext,a.clearRect(0,0,this.width,this.height),c(this.xlabels),c(this.ylabels),c(this.annotations);for(var d in this.chartLabels){if(!this.chartLabels.hasOwnProperty(d))continue;var e=this.chartLabels[d];e.parentNode&&e.parentNode.removeChild(e)}this.xlabels=[],this.ylabels=[],this.annotations=[],this.chartLabels={}},DygraphCanvasRenderer.isSupported=function(a){var b=null;try{typeof a=="undefined"||a===null?b=document.createElement("canvas"):b=a,b.getContext("2d")}catch(c){var d=navigator.appVersion.match(/MSIE (\d\.\d)/),e=navigator.userAgent.toLowerCase().indexOf("opera")!=-1;return!d||d[1]<6||e?!1:!0}return!0},DygraphCanvasRenderer.prototype.setColors=function(a){this.colorScheme_=a},DygraphCanvasRenderer.prototype.render=function(){function b(a){return Math.round(a)+.5}function c(a){return Math.round(a)-.5}var a=this.elementContext;this.attr_("underlayCallback")&&this.attr_("underlayCallback")(a,this.area,this.dygraph_,this.dygraph_);var d,e,f,g;if(this.attr_("drawYGrid")){g=this.layout.yticks,a.save(),a.strokeStyle=this.attr_("gridLineColor"),a.lineWidth=this.attr_("gridLineWidth");for(f=0;f<g.length;f++){if(g[f][0]!==0)continue;d=b(this.area.x),e=c(this.area.y+g[f][1]*this.area.h),a.beginPath(),a.moveTo(d,e),a.lineTo(d+this.area.w,e),a.closePath(),a.stroke()}a.restore()}if(this.attr_("drawXGrid")){g=this.layout.xticks,a.save(),a.strokeStyle=this.attr_("gridLineColor"),a.lineWidth=this.attr_("gridLineWidth");for(f=0;f<g.length;f++)d=b(this.area.x+g[f][0]*this.area.w),e=c(this.area.y+this.area.h),a.beginPath(),a.moveTo(d,e),a.lineTo(d,this.area.y),a.closePath(),a.stroke();a.restore()}this._renderLineChart(),this._renderAxis(),this._renderChartLabels(),this._renderAnnotations()},DygraphCanvasRenderer.prototype._createIEClipArea=function(){function g(c){if(c.w===0||c.h===0)return;var e=document.createElement("div");e.className=a,e.style.backgroundColor=d,e.style.position="absolute",e.style.left=c.x+"px",e.style.top=c.y+"px",e.style.width=c.w+"px",e.style.height=c.h+"px",b.appendChild(e)}var a="dygraph-clip-div",b=this.dygraph_.graphDiv;for(var c=b.childNodes.length-1;c>=0;c--)b.childNodes[c].className==a&&b.removeChild(b.childNodes[c]);var d=document.bgColor,e=this.dygraph_.graphDiv;while(e!=document){var f=e.currentStyle.backgroundColor;if(f&&f!="transparent"){d=f;break}e=e.parentNode}var h=this.area;g({x:0,y:0,w:h.x,h:this.height}),g({x:h.x,y:0,w:this.width-h.x,h:h.y}),g({x:h.x+h.w,y:0,w:this.width-h.x-h.w,h:this.height}),g({x:h.x,y:h.y+h.h,w:this.width-h.x,h:this.height-h.h-h.y})},DygraphCanvasRenderer.prototype._renderAxis=function(){function a(a){return Math.round(a)+.5}function b(a){return Math.round(a)-.5}if(!this.attr_("drawXAxis")&&!this.attr_("drawYAxis"))return;var c=this.elementContext,d,e,f,g,h,i={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,color:this.attr_("axisLabelColor"),width:this.attr_("axisLabelWidth")+"px",lineHeight:"normal",overflow:"hidden"},j=function(a,b,c){var d=document.createElement("div");for(var e in i)i.hasOwnProperty(e)&&(d.style[e]=i[e]);var f=document.createElement("div");return f.className="dygraph-axis-label dygraph-axis-label-"+b+(c?" dygraph-axis-label-"+c:""),f.innerHTML=a,d.appendChild(f),d};c.save(),c.strokeStyle=this.attr_("axisLineColor"),c.lineWidth=this.attr_("axisLineWidth");if(this.attr_("drawYAxis")){if(this.layout.yticks&&this.layout.yticks.length>0){var k=this.dygraph_.numAxes();for(h=0;h<this.layout.yticks.length;h++){g=this.layout.yticks[h];if(typeof g=="function")return;e=this.area.x;var l=1,m="y1";g[0]==1&&(e=this.area.x+this.area.w,l=-1,m="y2"),f=this.area.y+g[1]*this.area.h,d=j(g[2],"y",k==2?m:null);var n=f-this.attr_("axisLabelFontSize")/2;n<0&&(n=0),n+this.attr_("axisLabelFontSize")+3>this.height?d.style.bottom="0px":d.style.top=n+"px",g[0]===0?(d.style.left=this.area.x-this.attr_("yAxisLabelWidth")-this.attr_("axisTickSize")+"px",d.style.textAlign="right"):g[0]==1&&(d.style.left=this.area.x+this.area.w+this.attr_("axisTickSize")+"px",d.style.textAlign="left"),d.style.width=this.attr_("yAxisLabelWidth")+"px",this.container.appendChild(d),this.ylabels.push(d)}var o=this.ylabels[0],p=this.attr_("axisLabelFontSize"),q=parseInt(o.style.top,10)+p;q>this.height-p&&(o.style.top=parseInt(o.style.top,10)-p/2+"px")}c.beginPath(),c.moveTo(a(this.area.x),b(this.area.y)),c.lineTo(a(this.area.x),b(this.area.y+this.area.h)),c.closePath(),c.stroke(),this.dygraph_.numAxes()==2&&(c.beginPath(),c.moveTo(b(this.area.x+this.area.w),b(this.area.y)),c.lineTo(b(this.area.x+this.area.w),b(this.area.y+this.area.h)),c.closePath(),c.stroke())}if(this.attr_("drawXAxis")){if(this.layout.xticks)for(h=0;h<this.layout.xticks.length;h++){g=this.layout.xticks[h],e=this.area.x+g[0]*this.area.w,f=this.area.y+this.area.h,d=j(g[1],"x"),d.style.textAlign="center",d.style.top=f+this.attr_("axisTickSize")+"px";var r=e-this.attr_("axisLabelWidth")/2;r+this.attr_("axisLabelWidth")>this.width&&(r=this.width-this.attr_("xAxisLabelWidth"),d.style.textAlign="right"),r<0&&(r=0,d.style.textAlign="left"),d.style.left=r+"px",d.style.width=this.attr_("xAxisLabelWidth")+"px",this.container.appendChild(d),this.xlabels.push(d)}c.beginPath(),c.moveTo(a(this.area.x),b(this.area.y+this.area.h)),c.lineTo(a(this.area.x+this.area.w),b(this.area.y+this.area.h)),c.closePath(),c.stroke()}c.restore()},DygraphCanvasRenderer.prototype._renderChartLabels=function(){function d(d,e,f){var g={left:0,top:c.area.y,width:c.attr_("yLabelWidth"),height:c.area.h};a=document.createElement("div"),a.style.position="absolute",d==1?a.style.left=g.left:a.style.right=g.left,a.style.top=g.top+"px",a.style.width=g.width+"px",a.style.height=g.height+"px",a.style.fontSize=c.attr_("yLabelWidth")-2+"px";var h=document.createElement("div");h.style.position="absolute",h.style.width=g.height+"px",h.style.height=g.width+"px",h.style.top=g.height/2-g.width/2+"px",h.style.left=g.width/2-g.height/2+"px",h.style.textAlign="center";var i="rotate("+(d==1?"-":"")+"90deg)";return h.style.transform=i,h.style.WebkitTransform=i,h.style.MozTransform=i,h.style.OTransform=i,h.style.msTransform=i,typeof document.documentMode!="undefined"&&document.documentMode<9&&(h.style.filter="progid:DXImageTransform.Microsoft.BasicImage(rotation="+(d==1?"3":"1")+")",h.style.left="0px",h.style.top="0px"),b=document.createElement("div"),b.className=e,b.innerHTML=f,h.appendChild(b),a.appendChild(h),a}var a,b;this.attr_("title")&&(a=document.createElement("div"),a.style.position="absolute",a.style.top="0px",a.style.left=this.area.x+"px",a.style.width=this.area.w+"px",a.style.height=this.attr_("titleHeight")+"px",a.style.textAlign="center",a.style.fontSize=this.attr_("titleHeight")-8+"px",a.style.fontWeight="bold",b=document.createElement("div"),b.className="dygraph-label dygraph-title",b.innerHTML=this.attr_("title"),a.appendChild(b),this.container.appendChild(a),this.chartLabels.title=a),this.attr_("xlabel")&&(a=document.createElement("div"),a.style.position="absolute",a.style.bottom=0,a.style.left=this.area.x+"px",a.style.width=this.area.w+"px",a.style.height=this.attr_("xLabelHeight")+"px",a.style.textAlign="center",a.style.fontSize=this.attr_("xLabelHeight")-2+"px",b=document.createElement("div"),b.className="dygraph-label dygraph-xlabel",b.innerHTML=this.attr_("xlabel"),a.appendChild(b),this.container.appendChild(a),this.chartLabels.xlabel=a);var c=this,a;this.attr_("ylabel")&&(a=d(1,"dygraph-label dygraph-ylabel",this.attr_("ylabel")),this.container.appendChild(a),this.chartLabels.ylabel=a),this.attr_("y2label")&&this.dygraph_.numAxes()==2&&(a=d(2,"dygraph-label dygraph-y2label",this.attr_("y2label")),this.container.appendChild(a),this.chartLabels.y2label=a)},DygraphCanvasRenderer.prototype._renderAnnotations=function(){var a={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,overflow:"hidden"},b=function(a,b,c,d){return function(e){var f=c.annotation;f.hasOwnProperty(a)?f[a](f,c,d.dygraph_,e):d.dygraph_.attr_(b)&&d.dygraph_.attr_(b)(f,c,d.dygraph_,e)}},c=this.layout.annotated_points;for(var d=0;d<c.length;d++){var e=c[d];if(e.canvasx<this.area.x||e.canvasx>this.area.x+this.area.w||e.canvasy<this.area.y||e.canvasy>this.area.y+this.area.h)continue;var f=e.annotation,g=6;f.hasOwnProperty("tickHeight")&&(g=f.tickHeight);var h=document.createElement("div");for(var i in a)a.hasOwnProperty(i)&&(h.style[i]=a[i]);f.hasOwnProperty("icon")||(h.className="dygraphDefaultAnnotation"),f.hasOwnProperty("cssClass")&&(h.className+=" "+f.cssClass);var j=f.hasOwnProperty("width")?f.width:16,k=f.hasOwnProperty("height")?f.height:16;if(f.hasOwnProperty("icon")){var l=document.createElement("img");l.src=f.icon,l.width=j,l.height=k,h.appendChild(l)}else e.annotation.hasOwnProperty("shortText")&&h.appendChild(document.createTextNode(e.annotation.shortText));h.style.left=e.canvasx-j/2+"px",f.attachAtBottom?h.style.top=this.area.h-k-g+"px":h.style.top=e.canvasy-k-g+"px",h.style.width=j+"px",h.style.height=k+"px",h.title=e.annotation.text,h.style.color=this.colors[e.name],h.style.borderColor=this.colors[e.name],f.div=h,Dygraph.addEvent(h,"click",b("clickHandler","annotationClickHandler",e,this)),Dygraph.addEvent(h,"mouseover",b("mouseOverHandler","annotationMouseOverHandler",e,this)),Dygraph.addEvent(h,"mouseout",b("mouseOutHandler","annotationMouseOutHandler",e,this)),Dygraph.addEvent(h,"dblclick",b("dblClickHandler","annotationDblClickHandler",e,this)),this.container.appendChild(h),this.annotations.push(h);var m=this.elementContext;m.strokeStyle=this.colors[e.name],m.beginPath(),f.attachAtBottom?(m.moveTo(e.canvasx,this.area.h),m.lineTo(e.canvasx,this.area.h-2-g)):(m.moveTo(e.canvasx,e.canvasy),m.lineTo(e.canvasx,e.canvasy-2-g)),m.closePath(),m.stroke()}},DygraphCanvasRenderer.makeNextPointStep_=function(a,b,c){return a?function(a){while(++a<c)if(b[a].yval!==null)break;return a}:function(a){return a+1}},DygraphCanvasRenderer.prototype._drawStyledLine=function(a,b,c,d,e,f,g,h,i){var j=function(a){return a===null||isNaN(a)},k=this.attr_("stepPlot"),l=this.layout.setPointsOffsets[b],m=this.layout.setPointsLengths[b],n=l+m,o=this.layout.points,p=null,q=null,r=[];Dygraph.isArrayLike(f)||(f=null);var s,t=DygraphCanvasRenderer.makeNextPointStep_(this.attr_("connectSeparatedPoints"),o,n);a.save();for(var u=l;u<n;u=t(u)){s=o[u];if(j(s.canvasy))k&&p!==null&&(a.beginPath(),a.strokeStyle=d,a.lineWidth=this.attr_("strokeWidth"),this._dashedLine(a,p,q,s.canvasx,q,f),a.stroke()),p=q=null;else{var v=!p&&(u==o.length-1||j(o[u+1].canvasy));if(p===null)p=s.canvasx,q=s.canvasy;else{if(Math.round(p)==Math.round(s.canvasx)&&Math.round(q)==Math.round(s.canvasy))continue;e&&(a.beginPath(),a.strokeStyle=d,a.lineWidth=e,k&&(this._dashedLine(a,p,q,s.canvasx,q,f),p=s.canvasx),this._dashedLine(a,p,q,s.canvasx,s.canvasy,f),p=s.canvasx,q=s.canvasy,a.stroke())}(g||v)&&r.push([s.canvasx,s.canvasy])}}for(var w=0;w<r.length;w++){var x=r[w];a.save(),h(this.dygraph_,c,a,x[0],x[1],d,i),a.restore()}a.restore()},DygraphCanvasRenderer.prototype._drawLine=function(a,b){var c=this.layout.setNames,d=c[b],e=this.dygraph_.attr_("strokeWidth",d),f=this.dygraph_.attr_("strokeBorderWidth",d),g=this.dygraph_.attr_("drawPointCallback",d)||Dygraph.Circles.DEFAULT;f&&e&&this._drawStyledLine(a,b,d,this.dygraph_.attr_("strokeBorderColor",d),e+2*f,this.dygraph_.attr_("strokePattern",d),this.dygraph_.attr_("drawPoints",d),g,this.dygraph_.attr_("pointSize",d)),this._drawStyledLine(a,b,d,this.colors[d],e,this.dygraph_.attr_("strokePattern",d),this.dygraph_.attr_("drawPoints",d),g,this.dygraph_.attr_("pointSize",d))},DygraphCanvasRenderer.prototype._renderLineChart=function(){var a=this.elementContext,b=this.attr_("fillAlpha"),c=this.attr_("errorBars")||this.attr_("customBars"),d=this.attr_("fillGraph"),e=this.attr_("stackedGraph"),f=this.attr_("stepPlot"),g=this.layout.points,h=g.length,i,j,k,l,m,n,o,p,q,r,s,t,u,v=this.layout.setNames,w=v.length;this.colors={};for(j=0;j<w;j++)this.colors[v[j]]=this.colorScheme_[j%this.colorScheme_.length];for(j=h;j--;)i=g[j],i.canvasx=this.area.w*i.x+this.area.x,i.canvasy=this.area.h*i.y+this.area.y;if(c){a.save(),d&&this.dygraph_.warn("Can't use fillGraph option with error bars");for(j=0;j<w;j++){p=v[j],u=this.dygraph_.axisPropertiesForSeries(p),o=this.colors[p];var x=this.layout.setPointsOffsets[j],y=this.layout.setPointsLengths[j],z=x+y,A=DygraphCanvasRenderer.makeNextPointStep_(this.attr_("connectSeparatedPoints"),g,z);l=NaN,m=NaN,n=[-1,-1],t=u.yscale,s=new RGBColor(o),r="rgba("+s.r+","+s.g+","+s.b+","+b+")",a.fillStyle=r,a.beginPath();for(k=x;k<z;k=A(k)){i=g[k];if(i.name==p){if(!Dygraph.isOK(i.y)){l=NaN;continue}f?(q=[i.y_bottom,i.y_top],m=i.y):q=[i.y_bottom,i.y_top],q[0]=this.area.h*q[0]+this.area.y,q[1]=this.area.h*q[1]+this.area.y,isNaN(l)||(f?a.moveTo(l,q[0]):a.moveTo(l,n[0]),a.lineTo(i.canvasx,q[0]),a.lineTo(i.canvasx,q[1]),f?a.lineTo(l,q[1]):a.lineTo(l,n[1]),a.closePath()),n=q,l=i.canvasx}}a.fill()}a.restore()}else if(d){a.save();var B=[];for(j=w-1;j>=0;j--){p=v[j],o=this.colors[p],u=this.dygraph_.axisPropertiesForSeries(p);var C=1+u.minyval*u.yscale;C<0?C=0:C>1&&(C=1),C=this.area.h*C+this.area.y;var x=this.layout.setPointsOffsets[j],y=this.layout.setPointsLengths[j],z=x+y,A=DygraphCanvasRenderer.makeNextPointStep_(this.attr_("connectSeparatedPoints"),g,z);l=NaN,n=[-1,-1],t=u.yscale,s=new RGBColor(o),r="rgba("+s.r+","+s.g+","+s.b+","+b+")",a.fillStyle=r,a.beginPath();for(k=x;k<z;k=A(k)){i=g[k];if(i.name==p){if(!Dygraph.isOK(i.y)){l=NaN;continue}if(e){var D=B[i.canvasx];D===undefined&&(D=C),B[i.canvasx]=i.canvasy,q=[i.canvasy,D]}else q=[i.canvasy,C];isNaN(l)||(a.moveTo(l,n[0]),f?a.lineTo(i.canvasx,n[0]):a.lineTo(i.canvasx,q[0]),a.lineTo(i.canvasx,q[1]),a.lineTo(l,n[1]),a.closePath()),n=q,l=i.canvasx}}a.fill()}a.restore()}for(j=0;j<w;j+=1)this._drawLine(a,j)},DygraphCanvasRenderer.prototype._dashedLine=function(a,b,c,d,e,f){var g,h,i,j,k,l;if(!f||f.length<=1){a.moveTo(b,c),a.lineTo(d,e);return}Dygraph.compareArrays(f,this._dashedLineToHistoryPattern)||(this._dashedLineToHistoryPattern=f,this._dashedLineToHistory=[0,0]),a.save(),g=d-b,h=e-c,i=Math.sqrt(g*g+h*h),j=Math.atan2(h,g),a.translate(b,c),a.moveTo(0,0),a.rotate(j),k=this._dashedLineToHistory[0],b=0;while(i>b)l=f[k],this._dashedLineToHistory[1]?b+=this._dashedLineToHistory[1]:b+=l,b>i?(this._dashedLineToHistory=[k,b-i],b=i):this._dashedLineToHistory=[(k+1)%f.length,0],k%2===0?a.lineTo(b,0):a.moveTo(b,0),k=(k+1)%f.length;a.restore()},"use strict";var Dygraph=function(a,b,c){arguments.length>0&&(arguments.length==4?(this.warn("Using deprecated four-argument dygraph constructor"),this.__old_init__(a,b,arguments[2],arguments[3])):this.__init__(a,b,c))};Dygraph.NAME="Dygraph",Dygraph.VERSION="1.2",Dygraph.__repr__=function(){return"["+this.NAME+" "+this.VERSION+"]"},Dygraph.toString=function(){return this.__repr__()},Dygraph.DEFAULT_ROLL_PERIOD=1,Dygraph.DEFAULT_WIDTH=480,Dygraph.DEFAULT_HEIGHT=320,Dygraph.ANIMATION_STEPS=10,Dygraph.ANIMATION_DURATION=200,Dygraph.numberValueFormatter=function(a,b,c,d){var e=b("sigFigs");if(e!==null)return Dygraph.floatFormat(a,e);var f=b("digitsAfterDecimal"),g=b("maxNumberWidth");return a!==0&&(Math.abs(a)>=Math.pow(10,g)||Math.abs(a)<Math.pow(10,-f))?a.toExponential(f):""+Dygraph.round_(a,f)},Dygraph.numberAxisLabelFormatter=function(a,b,c,d){return Dygraph.numberValueFormatter(a,c,d)},Dygraph.dateString_=function(a){var b=Dygraph.zeropad,c=new Date(a),d=""+c.getFullYear(),e=b(c.getMonth()+1),f=b(c.getDate()),g="",h=c.getHours()*3600+c.getMinutes()*60+c.getSeconds();return h&&(g=" "+Dygraph.hmsString_(a)),d+"/"+e+"/"+f+g},Dygraph.dateAxisFormatter=function(a,b){if(b>=Dygraph.DECADAL)return a.strftime("%Y");if(b>=Dygraph.MONTHLY)return a.strftime("%b %y");var c=a.getHours()*3600+a.getMinutes()*60+a.getSeconds()+a.getMilliseconds();return c===0||b>=Dygraph.DAILY?(new Date(a.getTime()+36e5)).strftime("%d%b"):Dygraph.hmsString_(a.getTime())},Dygraph.DEFAULT_ATTRS={highlightCircleSize:3,highlightSeriesOpts:null,highlightSeriesBackgroundAlpha:.5,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:!1,labelsShowZeroValues:!0,labelsKMB:!1,labelsKMG2:!1,showLabelsOnHighlight:!0,digitsAfterDecimal:2,maxNumberWidth:6,sigFigs:null,strokeWidth:1,strokeBorderWidth:0,strokeBorderColor:"white",axisTickSize:3,axisLabelFontSize:14,xAxisLabelWidth:50,yAxisLabelWidth:50,rightGap:5,showRoller:!1,xValueParser:Dygraph.dateParser,delimiter:",",sigma:2,errorBars:!1,fractions:!1,wilsonInterval:!0,customBars:!1,fillGraph:!1,fillAlpha:.15,connectSeparatedPoints:!1,stackedGraph:!1,hideOverlayOnMouseOut:!0,legend:"onmouseover",stepPlot:!1,avoidMinZero:!1,titleHeight:28,xLabelHeight:18,yLabelWidth:18,drawXAxis:!0,drawYAxis:!0,axisLineColor:"black",axisLineWidth:.3,gridLineWidth:.3,axisLabelColor:"black",axisLabelFont:"Arial",axisLabelWidth:50,drawYGrid:!0,drawXGrid:!0,gridLineColor:"rgb(128,128,128)",interactionModel:null,animatedZooms:!1,showRangeSelector:!1,rangeSelectorHeight:40,rangeSelectorPlotStrokeColor:"#808FAB",rangeSelectorPlotFillColor:"#A7B1C4",axes:{x:{pixelsPerLabel:60,axisLabelFormatter:Dygraph.dateAxisFormatter,valueFormatter:Dygraph.dateString_,ticker:null},y:{pixelsPerLabel:30,valueFormatter:Dygraph.numberValueFormatter,axisLabelFormatter:Dygraph.numberAxisLabelFormatter,ticker:null},y2:{pixelsPerLabel:30,valueFormatter:Dygraph.numberValueFormatter,axisLabelFormatter:Dygraph.numberAxisLabelFormatter,ticker:null}}},Dygraph.HORIZONTAL=1,Dygraph.VERTICAL=2,Dygraph.addedAnnotationCSS=!1,Dygraph.prototype.__old_init__=function(a,b,c,d){if(c!==null){var e=["Date"];for(var f=0;f<c.length;f++)e.push(c[f]);Dygraph.update(d,{labels:e})}this.__init__(a,b,d)},Dygraph.prototype.__init__=function(a,b,c){if(/MSIE/.test(navigator.userAgent)&&!window.opera&&typeof G_vmlCanvasManager!="undefined"&&document.readyState!="complete"){var d=this;setTimeout(function(){d.__init__(a,b,c)},100);return}if(c===null||c===undefined)c={};c=Dygraph.mapLegacyOptions_(c);if(!a){Dygraph.error("Constructing dygraph with a non-existent div!");return}this.isUsingExcanvas_=typeof G_vmlCanvasManager!="undefined",this.maindiv_=a,this.file_=b,this.rollPeriod_=c.rollPeriod||Dygraph.DEFAULT_ROLL_PERIOD,this.previousVerticalX_=-1,this.fractions_=c.fractions||!1,this.dateWindow_=c.dateWindow||null,this.is_initial_draw_=!0,this.annotations_=[],this.zoomed_x_=!1,this.zoomed_y_=!1,a.innerHTML="",a.style.width===""&&c.width&&(a.style.width=c.width+"px"),a.style.height===""&&c.height&&(a.style.height=c.height+"px"),a.style.height===""&&a.clientHeight===0&&(a.style.height=Dygraph.DEFAULT_HEIGHT+"px",a.style.width===""&&(a.style.width=Dygraph.DEFAULT_WIDTH+"px")),this.width_=a.clientWidth,this.height_=a.clientHeight,c.stackedGraph&&(c.fillGraph=!0),this.user_attrs_={},Dygraph.update(this.user_attrs_,c),this.attrs_={},Dygraph.updateDeep(this.attrs_,Dygraph.DEFAULT_ATTRS),this.boundaryIds_=[],this.setIndexByName_={},this.datasetIndex_=[],this.createInterface_(),this.start_()},Dygraph.prototype.isZoomed=function(a){if(a==null)return this.zoomed_x_||this.zoomed_y_;if(a==="x")return this.zoomed_x_;if(a==="y")return this.zoomed_y_;throw"axis parameter is ["+a+"] must be null, 'x' or 'y'."},Dygraph.prototype.toString=function(){var a=this.maindiv_,b=a&&a.id?a.id:a;return"[Dygraph "+b+"]"},Dygraph.prototype.attr_=function(a,b){var c=[];c.push(this.attrs_),this.user_attrs_&&(c.push(this.user_attrs_),b&&(this.user_attrs_.hasOwnProperty(b)&&c.push(this.user_attrs_[b]),b===this.highlightSet_&&this.user_attrs_.hasOwnProperty("highlightSeriesOpts")&&c.push(this.user_attrs_.highlightSeriesOpts)));var d=null;for(var e=c.length-1;e>=0;--e){var f=c[e];if(f.hasOwnProperty(a)){d=f[a];break}}return d},Dygraph.prototype.optionsViewForAxis_=function(a){var b=this;return function(c){var d=b.user_attrs_.axes;return d&&d[a]&&d[a][c]?d[a][c]:typeof b.user_attrs_[c]!="undefined"?b.user_attrs_[c]:(d=b.attrs_.axes,d&&d[a]&&d[a][c]?d[a][c]:a=="y"&&b.axes_[0].hasOwnProperty(c)?b.axes_[0][c]:a=="y2"&&b.axes_[1].hasOwnProperty(c)?b.axes_[1][c]:b.attr_(c))}},Dygraph.prototype.rollPeriod=function(){return this.rollPeriod_},Dygraph.prototype.xAxisRange=function(){return this.dateWindow_?this.dateWindow_:this.xAxisExtremes()},Dygraph.prototype.xAxisExtremes=function(){var a=this.rawData_[0][0],b=this.rawData_[this.rawData_.length-1][0];return[a,b]},Dygraph.prototype.yAxisRange=function(a){typeof a=="undefined"&&(a=0);if(a<0||a>=this.axes_.length)return null;var b=this.axes_[a];return[b.computedValueRange[0],b.computedValueRange[1]]},Dygraph.prototype.yAxisRanges=function(){var a=[];for(var b=0;b<this.axes_.length;b++)a.push(this.yAxisRange(b));return a},Dygraph.prototype.toDomCoords=function(a,b,c){return[this.toDomXCoord(a),this.toDomYCoord(b,c)]},Dygraph.prototype.toDomXCoord=function(a){if(a===null)return null;var b=this.plotter_.area,c=this.xAxisRange();return b.x+(a-c[0])/(c[1]-c[0])*b.w},Dygraph.prototype.toDomYCoord=function(a,b){var c=this.toPercentYCoord(a,b);if(c===null)return null;var d=this.plotter_.area;return d.y+c*d.h},Dygraph.prototype.toDataCoords=function(a,b,c){return[this.toDataXCoord(a),this.toDataYCoord(b,c)]},Dygraph.prototype.toDataXCoord=function(a){if(a===null)return null;var b=this.plotter_.area,c=this.xAxisRange();return c[0]+(a-b.x)/b.w*(c[1]-c[0])},Dygraph.prototype.toDataYCoord=function(a,b){if(a===null)return null;var c=this.plotter_.area,d=this.yAxisRange(b);typeof b=="undefined"&&(b=0);if(!this.axes_[b].logscale)return d[0]+(c.y+c.h-a)/c.h*(d[1]-d[0]);var e=(a-c.y)/c.h,f=Dygraph.log10(d[1]),g=f-e*(f-Dygraph.log10(d[0])),h=Math.pow(Dygraph.LOG_SCALE,g);return h},Dygraph.prototype.toPercentYCoord=function(a,b){if(a===null)return null;typeof b=="undefined"&&(b=0);var c=this.yAxisRange(b),d;if(!this.axes_[b].logscale)d=(c[1]-a)/(c[1]-c[0]);else{
+var e=Dygraph.log10(c[1]);d=(e-Dygraph.log10(a))/(e-Dygraph.log10(c[0]))}return d},Dygraph.prototype.toPercentXCoord=function(a){if(a===null)return null;var b=this.xAxisRange();return(a-b[0])/(b[1]-b[0])},Dygraph.prototype.numColumns=function(){return this.rawData_[0]?this.rawData_[0].length:this.attr_("labels").length},Dygraph.prototype.numRows=function(){return this.rawData_.length},Dygraph.prototype.fullXRange_=function(){return this.numRows()>0?[this.rawData_[0][0],this.rawData_[this.numRows()-1][0]]:[0,1]},Dygraph.prototype.getValue=function(a,b){return a<0||a>this.rawData_.length?null:b<0||b>this.rawData_[a].length?null:this.rawData_[a][b]},Dygraph.prototype.createInterface_=function(){var a=this.maindiv_;this.graphDiv=document.createElement("div"),this.graphDiv.style.width=this.width_+"px",this.graphDiv.style.height=this.height_+"px",a.appendChild(this.graphDiv),this.canvas_=Dygraph.createCanvas(),this.canvas_.style.position="absolute",this.canvas_.width=this.width_,this.canvas_.height=this.height_,this.canvas_.style.width=this.width_+"px",this.canvas_.style.height=this.height_+"px",this.canvas_ctx_=Dygraph.getContext(this.canvas_),this.hidden_=this.createPlotKitCanvas_(this.canvas_),this.hidden_ctx_=Dygraph.getContext(this.hidden_),this.attr_("showRangeSelector")&&(this.rangeSelector_=new DygraphRangeSelector(this)),this.graphDiv.appendChild(this.hidden_),this.graphDiv.appendChild(this.canvas_),this.mouseEventElement_=this.createMouseEventElement_(),this.layout_=new DygraphLayout(this),this.rangeSelector_&&this.rangeSelector_.addToGraph(this.graphDiv,this.layout_);var b=this;this.mouseMoveHandler=function(a){b.mouseMove_(a)},Dygraph.addEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler),this.mouseOutHandler=function(a){b.mouseOut_(a)},Dygraph.addEvent(this.mouseEventElement_,"mouseout",this.mouseOutHandler),this.createStatusMessage_(),this.createDragInterface_(),this.resizeHandler=function(a){b.resize()},Dygraph.addEvent(window,"resize",this.resizeHandler)},Dygraph.prototype.destroy=function(){var a=function(b){while(b.hasChildNodes())a(b.firstChild),b.removeChild(b.firstChild)};Dygraph.removeEvent(this.mouseEventElement_,"mouseout",this.mouseOutHandler),Dygraph.removeEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler),Dygraph.removeEvent(this.mouseEventElement_,"mousemove",this.mouseUpHandler_),a(this.maindiv_);var b=function(a){for(var b in a)typeof a[b]=="object"&&(a[b]=null)};Dygraph.removeEvent(window,"resize",this.resizeHandler),this.resizeHandler=null,b(this.layout_),b(this.plotter_),b(this)},Dygraph.prototype.createPlotKitCanvas_=function(a){var b=Dygraph.createCanvas();return b.style.position="absolute",b.style.top=a.style.top,b.style.left=a.style.left,b.width=this.width_,b.height=this.height_,b.style.width=this.width_+"px",b.style.height=this.height_+"px",b},Dygraph.prototype.createMouseEventElement_=function(){if(this.isUsingExcanvas_){var a=document.createElement("div");return a.style.position="absolute",a.style.backgroundColor="white",a.style.filter="alpha(opacity=0)",a.style.width=this.width_+"px",a.style.height=this.height_+"px",this.graphDiv.appendChild(a),a}return this.canvas_},Dygraph.prototype.setColors_=function(){var a=this.attr_("labels").length-1;this.colors_=[];var b=this.attr_("colors"),c;if(!b){var d=this.attr_("colorSaturation")||1,e=this.attr_("colorValue")||.5,f=Math.ceil(a/2);for(c=1;c<=a;c++){if(!this.visibility()[c-1])continue;var g=c%2?Math.ceil(c/2):f+c/2,h=1*g/(1+a);this.colors_.push(Dygraph.hsvToRGB(h,d,e))}}else for(c=0;c<a;c++){if(!this.visibility()[c])continue;var i=b[c%b.length];this.colors_.push(i)}this.plotter_.setColors(this.colors_)},Dygraph.prototype.getColors=function(){return this.colors_},Dygraph.prototype.createStatusMessage_=function(){var a=this.user_attrs_.labelsDiv;a&&null!==a&&(typeof a=="string"||a instanceof String)&&(this.user_attrs_.labelsDiv=document.getElementById(a));if(!this.attr_("labelsDiv")){var b=this.attr_("labelsDivWidth"),c={position:"absolute",fontSize:"14px",zIndex:10,width:b+"px",top:"0px",left:this.width_-b-2+"px",background:"white",lineHeight:"normal",textAlign:"left",overflow:"hidden"};Dygraph.update(c,this.attr_("labelsDivStyles"));var d=document.createElement("div");d.className="dygraph-legend";for(var e in c)if(c.hasOwnProperty(e))try{d.style[e]=c[e]}catch(f){this.warn("You are using unsupported css properties for your browser in labelsDivStyles")}this.graphDiv.appendChild(d),this.attrs_.labelsDiv=d}},Dygraph.prototype.positionLabelsDiv_=function(){if(this.user_attrs_.hasOwnProperty("labelsDiv"))return;var a=this.plotter_.area,b=this.attr_("labelsDiv");b.style.left=a.x+a.w-this.attr_("labelsDivWidth")-1+"px",b.style.top=a.y+"px"},Dygraph.prototype.createRollInterface_=function(){this.roller_||(this.roller_=document.createElement("input"),this.roller_.type="text",this.roller_.style.display="none",this.graphDiv.appendChild(this.roller_));var a=this.attr_("showRoller")?"block":"none",b=this.plotter_.area,c={position:"absolute",zIndex:10,top:b.y+b.h-25+"px",left:b.x+1+"px",display:a};this.roller_.size="2",this.roller_.value=this.rollPeriod_;for(var d in c)c.hasOwnProperty(d)&&(this.roller_.style[d]=c[d]);var e=this;this.roller_.onchange=function(){e.adjustRoll(e.roller_.value)}},Dygraph.prototype.dragGetX_=function(a,b){return Dygraph.pageX(a)-b.px},Dygraph.prototype.dragGetY_=function(a,b){return Dygraph.pageY(a)-b.py},Dygraph.prototype.createDragInterface_=function(){var a={isZooming:!1,isPanning:!1,is2DPan:!1,dragStartX:null,dragStartY:null,dragEndX:null,dragEndY:null,dragDirection:null,prevEndX:null,prevEndY:null,prevDragDirection:null,cancelNextDblclick:!1,initialLeftmostDate:null,xUnitsPerPixel:null,dateRange:null,px:0,py:0,boundedDates:null,boundedValues:null,initializeMouseDown:function(a,b,c){a.preventDefault?a.preventDefault():(a.returnValue=!1,a.cancelBubble=!0),c.px=Dygraph.findPosX(b.canvas_),c.py=Dygraph.findPosY(b.canvas_),c.dragStartX=b.dragGetX_(a,c),c.dragStartY=b.dragGetY_(a,c),c.cancelNextDblclick=!1}},b=this.attr_("interactionModel"),c=this,d=function(b){return function(d){b(d,c,a)}};for(var e in b){if(!b.hasOwnProperty(e))continue;Dygraph.addEvent(this.mouseEventElement_,e,d(b[e]))}this.mouseUpHandler_=function(b){if(a.isZooming||a.isPanning)a.isZooming=!1,a.dragStartX=null,a.dragStartY=null;if(a.isPanning){a.isPanning=!1,a.draggingDate=null,a.dateRange=null;for(var d=0;d<c.axes_.length;d++)delete c.axes_[d].draggingValue,delete c.axes_[d].dragValueRange}},Dygraph.addEvent(document,"mouseup",this.mouseUpHandler_)},Dygraph.prototype.drawZoomRect_=function(a,b,c,d,e,f,g,h){var i=this.canvas_ctx_;f==Dygraph.HORIZONTAL?i.clearRect(Math.min(b,g),this.layout_.getPlotArea().y,Math.abs(b-g),this.layout_.getPlotArea().h):f==Dygraph.VERTICAL&&i.clearRect(this.layout_.getPlotArea().x,Math.min(d,h),this.layout_.getPlotArea().w,Math.abs(d-h)),a==Dygraph.HORIZONTAL?c&&b&&(i.fillStyle="rgba(128,128,128,0.33)",i.fillRect(Math.min(b,c),this.layout_.getPlotArea().y,Math.abs(c-b),this.layout_.getPlotArea().h)):a==Dygraph.VERTICAL&&e&&d&&(i.fillStyle="rgba(128,128,128,0.33)",i.fillRect(this.layout_.getPlotArea().x,Math.min(d,e),this.layout_.getPlotArea().w,Math.abs(e-d))),this.isUsingExcanvas_&&(this.currentZoomRectArgs_=[a,b,c,d,e,0,0,0])},Dygraph.prototype.clearZoomRect_=function(){this.currentZoomRectArgs_=null,this.canvas_ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height)},Dygraph.prototype.doZoomX_=function(a,b){this.currentZoomRectArgs_=null;var c=this.toDataXCoord(a),d=this.toDataXCoord(b);this.doZoomXDates_(c,d)},Dygraph.zoomAnimationFunction=function(a,b){var c=1.5;return(1-Math.pow(c,-a))/(1-Math.pow(c,-b))},Dygraph.prototype.doZoomXDates_=function(a,b){var c=this.xAxisRange(),d=[a,b];this.zoomed_x_=!0;var e=this;this.doAnimatedZoom(c,d,null,null,function(){e.attr_("zoomCallback")&&e.attr_("zoomCallback")(a,b,e.yAxisRanges())})},Dygraph.prototype.doZoomY_=function(a,b){this.currentZoomRectArgs_=null;var c=this.yAxisRanges(),d=[];for(var e=0;e<this.axes_.length;e++){var f=this.toDataYCoord(a,e),g=this.toDataYCoord(b,e);d.push([g,f])}this.zoomed_y_=!0;var h=this;this.doAnimatedZoom(null,null,c,d,function(){if(h.attr_("zoomCallback")){var a=h.xAxisRange();h.attr_("zoomCallback")(a[0],a[1],h.yAxisRanges())}})},Dygraph.prototype.doUnzoom_=function(){var a=!1,b=!1,c=!1;this.dateWindow_!==null&&(a=!0,b=!0);for(var d=0;d<this.axes_.length;d++)typeof this.axes_[d].valueWindow!="undefined"&&this.axes_[d].valueWindow!==null&&(a=!0,c=!0);this.clearSelection();if(a){this.zoomed_x_=!1,this.zoomed_y_=!1;var e=this.rawData_[0][0],f=this.rawData_[this.rawData_.length-1][0];if(!this.attr_("animatedZooms")){this.dateWindow_=null;for(d=0;d<this.axes_.length;d++)this.axes_[d].valueWindow!==null&&delete this.axes_[d].valueWindow;this.drawGraph_(),this.attr_("zoomCallback")&&this.attr_("zoomCallback")(e,f,this.yAxisRanges());return}var g=null,h=null,i=null,j=null;b&&(g=this.xAxisRange(),h=[e,f]);if(c){i=this.yAxisRanges();var k=this.gatherDatasets_(this.rolledSeries_,null),l=k[1];this.computeYAxisRanges_(l),j=[];for(d=0;d<this.axes_.length;d++){var m=this.axes_[d];j.push(m.valueRange!=null?m.valueRange:m.extremeRange)}}var n=this;this.doAnimatedZoom(g,h,i,j,function(){n.dateWindow_=null;for(var a=0;a<n.axes_.length;a++)n.axes_[a].valueWindow!==null&&delete n.axes_[a].valueWindow;n.attr_("zoomCallback")&&n.attr_("zoomCallback")(e,f,n.yAxisRanges())})}},Dygraph.prototype.doAnimatedZoom=function(a,b,c,d,e){var f=this.attr_("animatedZooms")?Dygraph.ANIMATION_STEPS:1,g=[],h=[],i,j;if(a!==null&&b!==null)for(i=1;i<=f;i++)j=Dygraph.zoomAnimationFunction(i,f),g[i-1]=[a[0]*(1-j)+j*b[0],a[1]*(1-j)+j*b[1]];if(c!==null&&d!==null)for(i=1;i<=f;i++){j=Dygraph.zoomAnimationFunction(i,f);var k=[];for(var l=0;l<this.axes_.length;l++)k.push([c[l][0]*(1-j)+j*d[l][0],c[l][1]*(1-j)+j*d[l][1]]);h[i-1]=k}var m=this;Dygraph.repeatAndCleanup(function(a){if(h.length)for(var b=0;b<m.axes_.length;b++){var c=h[a][b];m.axes_[b].valueWindow=[c[0],c[1]]}g.length&&(m.dateWindow_=g[a]),m.drawGraph_()},f,Dygraph.ANIMATION_DURATION/f,e)},Dygraph.prototype.getArea=function(){return this.plotter_.area},Dygraph.prototype.eventToDomCoords=function(a){var b=Dygraph.pageX(a)-Dygraph.findPosX(this.mouseEventElement_),c=Dygraph.pageY(a)-Dygraph.findPosY(this.mouseEventElement_);return[b,c]},Dygraph.prototype.findClosestRow=function(a){var b=Infinity,c=-1,d=this.layout_.points,e=d.length;for(var f=0;f<e;f++){var g=d[f];if(!Dygraph.isValidPoint(g,!0))continue;var h=Math.abs(g.canvasx-a);h<b&&(b=h,c=f)}return this.idxToRow_(c)},Dygraph.prototype.findClosestPoint=function(a,b){var c=Infinity,d=-1,e=this.layout_.points,f,g,h,i,j,k;for(var l=0;l<this.layout_.datasets.length;++l){var m=this.layout_.setPointsOffsets[l],n=this.layout_.setPointsLengths[l];for(var o=0;o<n;++o){var i=e[m+o];if(!Dygraph.isValidPoint(i))continue;g=i.canvasx-a,h=i.canvasy-b,f=g*g+h*h,f<c&&(c=f,j=i,k=l,d=o)}}var p=this.layout_.setNames[k];return{row:d+this.getLeftBoundary_(),seriesName:p,point:j}},Dygraph.prototype.findStackedPoint=function(a,b){var c=this.findClosestRow(a),d=this.getLeftBoundary_(),e=c-d,f=this.layout_.points,g,h;for(var i=0;i<this.layout_.datasets.length;++i){var j=this.layout_.setPointsOffsets[i],k=this.layout_.setPointsLengths[i];if(e>=k)continue;var l=f[j+e];if(!Dygraph.isValidPoint(l))continue;var m=l.canvasy;if(a>l.canvasx&&e+1<k){var n=f[j+e+1];if(Dygraph.isValidPoint(n)){var o=n.canvasx-l.canvasx;if(o>0){var p=(a-l.canvasx)/o;m+=p*(n.canvasy-l.canvasy)}}}else if(a<l.canvasx&&e>0){var q=f[j+e-1];if(Dygraph.isValidPoint(q)){var o=l.canvasx-q.canvasx;if(o>0){var p=(l.canvasx-a)/o;m+=p*(q.canvasy-l.canvasy)}}}if(i==0||m<b)g=l,h=i}var r=this.layout_.setNames[h];return{row:c,seriesName:r,point:g}},Dygraph.prototype.mouseMove_=function(a){var b=this.layout_.points;if(b===undefined)return;var c=this.eventToDomCoords(a),d=c[0],e=c[1],f=this.attr_("highlightSeriesOpts"),g=!1;if(f){var h;this.attr_("stackedGraph")?h=this.findStackedPoint(d,e):h=this.findClosestPoint(d,e),g=this.setSelection(h.row,h.seriesName)}else{var i=this.findClosestRow(d);g=this.setSelection(i)}var j=this.attr_("highlightCallback");j&&g&&j(a,this.lastx_,this.selPoints_,this.lastRow_,this.highlightSet_)},Dygraph.prototype.getLeftBoundary_=function(){for(var a=0;a<this.boundaryIds_.length;a++)if(this.boundaryIds_[a]!==undefined)return this.boundaryIds_[a][0];return 0},Dygraph.prototype.idxToRow_=function(a){if(a<0)return-1;var b=this.getLeftBoundary_();for(var c=0;c<this.layout_.datasets.length;++c){var d=this.layout_.datasets[c];if(a<d.length)return b+a;a-=d.length}return-1},Dygraph.prototype.generateLegendDashHTML_=function(a,b,c){var d="",e,f,g,h,i=0,j=0,k=[],l,m=/MSIE/.test(navigator.userAgent)&&!window.opera;if(m)return"—";if(!a||a.length<=1)d='<div style="display: inline-block; position: relative; bottom: .5ex; padding-left: 1em; height: 1px; border-bottom: 2px solid '+b+';"></div>';else{for(e=0;e<=a.length;e++)i+=a[e%a.length];l=Math.floor(c/(i-a[0]));if(l>1){for(e=0;e<a.length;e++)k[e]=a[e]/c;j=k.length}else{l=1;for(e=0;e<a.length;e++)k[e]=a[e]/i;j=k.length+1}for(f=0;f<l;f++)for(e=0;e<j;e+=2)g=k[e%k.length],e<a.length?h=k[(e+1)%k.length]:h=0,d+='<div style="display: inline-block; position: relative; bottom: .5ex; margin-right: '+h+"em; padding-left: "+g+"em; height: 1px; border-bottom: 2px solid "+b+';"></div>'}return d},Dygraph.prototype.generateLegendHTML_=function(a,b,c){var d,e,f,g,h,i;if(typeof a=="undefined"){if(this.attr_("legend")!="always")return"";e=this.attr_("labelsSeparateLines");var j=this.attr_("labels");d="";for(f=1;f<j.length;f++){if(!this.visibility()[f-1])continue;g=this.plotter_.colors[j[f]],d!==""&&(d+=e?"<br/>":" "),i=this.attr_("strokePattern",j[f]),h=this.generateLegendDashHTML_(i,g,c),d+="<span style='font-weight: bold; color: "+g+";'>"+h+" "+j[f]+"</span>"}return d}var k=this.optionsViewForAxis_("x"),l=k("valueFormatter");d=l(a,k,this.attr_("labels")[0],this)+":";var m=[],n=this.numAxes();for(f=0;f<n;f++)m[f]=this.optionsViewForAxis_("y"+(f?1+f:""));var o=this.attr_("labelsShowZeroValues");e=this.attr_("labelsSeparateLines");for(f=0;f<this.selPoints_.length;f++){var p=this.selPoints_[f];if(p.yval===0&&!o)continue;if(!Dygraph.isOK(p.canvasy))continue;e&&(d+="<br/>");var q=m[this.seriesToAxisMap_[p.name]],r=q("valueFormatter");g=this.plotter_.colors[p.name];var s=r(p.yval,q,p.name,this),t=p.name==this.highlightSet_?" class='highlight'":"";d+="<span"+t+">"+" <b><span style='color: "+g+";'>"+p.name+":</span></b>"+s+"</span>"}return d},Dygraph.prototype.setLegendHTML_=function(a,b){var c=this.attr_("labelsDiv");if(!c)return;var d=document.createElement("span");d.setAttribute("style","margin: 0; padding: 0 0 0 1em; border: 0;"),c.appendChild(d);var e=d.offsetWidth,f=this.generateLegendHTML_(a,b,e);c!==null?c.innerHTML=f:typeof this.shown_legend_error_=="undefined"&&(this.error("labelsDiv is set to something nonexistent; legend will not be shown."),this.shown_legend_error_=!0)},Dygraph.prototype.animateSelection_=function(a){var b=10,c=30;this.fadeLevel===undefined&&(this.fadeLevel=0),this.animateId===undefined&&(this.animateId=0);var d=this.fadeLevel,e=a<0?d:b-d;if(e<=0){this.fadeLevel&&this.updateSelection_(1);return}var f=++this.animateId,g=this;Dygraph.repeatAndCleanup(function(c){if(g.animateId!=f)return;g.fadeLevel+=a,g.fadeLevel===0?g.clearSelection():g.updateSelection_(g.fadeLevel/b)},e,c,function(){})},Dygraph.prototype.updateSelection_=function(a){var b,c=this.canvas_ctx_;if(this.attr_("highlightSeriesOpts")){c.clearRect(0,0,this.width_,this.height_);var d=1-this.attr_("highlightSeriesBackgroundAlpha");if(d){var e=!0;if(e){if(a===undefined){this.animateSelection_(1);return}d*=a}c.fillStyle="rgba(255,255,255,"+d+")",c.fillRect(0,0,this.width_,this.height_)}var f=this.datasetIndexFromSetName_(this.highlightSet_);this.plotter_._drawLine(c,f)}else if(this.previousVerticalX_>=0){var g=0,h=this.attr_("labels");for(b=1;b<h.length;b++){var i=this.attr_("highlightCircleSize",h[b]);i>g&&(g=i)}var j=this.previousVerticalX_;c.clearRect(j-g-1,0,2*g+2,this.height_)}this.isUsingExcanvas_&&this.currentZoomRectArgs_&&Dygraph.prototype.drawZoomRect_.apply(this,this.currentZoomRectArgs_);if(this.selPoints_.length>0){this.attr_("showLabelsOnHighlight")&&this.setLegendHTML_(this.lastx_,this.selPoints_);var k=this.selPoints_[0].canvasx;c.save();for(b=0;b<this.selPoints_.length;b++){var l=this.selPoints_[b];if(!Dygraph.isOK(l.canvasy))continue;var m=this.attr_("highlightCircleSize",l.name),n=this.attr_("drawHighlightPointCallback",l.name),o=this.plotter_.colors[l.name];n||(n=Dygraph.Circles.DEFAULT),c.lineWidth=this.attr_("strokeWidth",l.name),c.strokeStyle=o,c.fillStyle=o,n(this.g,l.name,c,k,l.canvasy,o,m)}c.restore(),this.previousVerticalX_=k}},Dygraph.prototype.setSelection=function(a,b){this.selPoints_=[];var c=0;a!==!1&&(a-=this.getLeftBoundary_());var d=!1;if(a!==!1&&a>=0){a!=this.lastRow_&&(d=!0),this.lastRow_=a;for(var e=0;e<this.layout_.datasets.length;++e){var f=this.layout_.datasets[e];if(a<f.length){var g=this.layout_.points[c+a];this.attr_("stackedGraph")&&(g=this.layout_.unstackPointAtIndex(c+a)),g.yval!==null&&this.selPoints_.push(g)}c+=f.length}}else this.lastRow_>=0&&(d=!0),this.lastRow_=-1;return this.selPoints_.length?this.lastx_=this.selPoints_[0].xval:this.lastx_=-1,b!==undefined&&(this.highlightSet_!==b&&(d=!0),this.highlightSet_=b),d&&this.updateSelection_(undefined),d},Dygraph.prototype.mouseOut_=function(a){this.attr_("unhighlightCallback")&&this.attr_("unhighlightCallback")(a),this.attr_("hideOverlayOnMouseOut")&&this.clearSelection()},Dygraph.prototype.clearSelection=function(){if(this.fadeLevel){this.animateSelection_(-1);return}this.canvas_ctx_.clearRect(0,0,this.width_,this.height_),this.fadeLevel=0,this.setLegendHTML_(),this.selPoints_=[],this.lastx_=-1,this.lastRow_=-1,this.highlightSet_=null},Dygraph.prototype.getSelection=function(){if(!this.selPoints_||this.selPoints_.length<1)return-1;for(var a=0;a<this.layout_.points.length;a++)if(this.layout_.points[a].x==this.selPoints_[0].x)return a+this.getLeftBoundary_();return-1},Dygraph.prototype.getHighlightSeries=function(){return this.highlightSet_},Dygraph.prototype.loadedEvent_=function(a){this.rawData_=this.parseCSV_(a),this.predraw_()},Dygraph.prototype.addXTicks_=function(){var a;this.dateWindow_?a=[this.dateWindow_[0],this.dateWindow_[1]]:a=this.fullXRange_();var b=this.optionsViewForAxis_("x"),c=b("ticker")(a[0],a[1],this.width_,b,this);this.layout_.setXTicks(c)},Dygraph.prototype.extremeValues_=function(a){var b=null,c=null,d,e,f=this.attr_("errorBars")||this.attr_("customBars");if(f)for(d=0;d<a.length;d++){e=a[d][1][0];if(!e)continue;var g=e-a[d][1][1],h=e+a[d][1][2];g>e&&(g=e),h<e&&(h=e);if(c===null||h>c)c=h;if(b===null||g<b)b=g}else for(d=0;d<a.length;d++){e=a[d][1];if(e===null||isNaN(e))continue;if(c===null||e>c)c=e;if(b===null||e<b)b=e}return[b,c]},Dygraph.prototype.predraw_=function(){var a=new Date;this.computeYAxes_(),this.plotter_&&this.plotter_.clear(),this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.hidden_ctx_,this.layout_),this.createRollInterface_(),this.positionLabelsDiv_(),this.rangeSelector_&&this.rangeSelector_.renderStaticLayer(),this.rolledSeries_=[null];for(var b=1;b<this.numColumns();b++){var c=this.attr_("logscale",b),d=this.extractSeries_(this.rawData_,b,c);d=this.rollingAverage(d,this.rollPeriod_),this.rolledSeries_.push(d)}this.drawGraph_();var e=new Date;this.drawingTimeMs_=e-a},Dygraph.prototype.gatherDatasets_=function(a,b){var c=[],d=[],e=[],f={},g,h,i,j=a.length-1;for(g=j;g>=1;g--){if(!this.visibility()[g-1])continue;var k=[];for(h=0;h<a[g].length;h++)k.push(a[g][h]);var l=this.attr_("errorBars")||this.attr_("customBars");if(b){var m=b[0],n=b[1],o=[],p=null,q=null;for(i=0;i<k.length;i++)k[i][0]>=m&&p===null&&(p=i),k[i][0]<=n&&(q=i);p===null&&(p=0),p>0&&p--,q===null&&(q=k.length-1),q<k.length-1&&q++,c[g-1]=[p,q];for(i=p;i<=q;i++)o.push(k[i]);k=o}else c[g-1]=[0,k.length-1];var r=this.extremeValues_(k);if(l)for(h=0;h<k.length;h++)k[h]=[k[h][0],k[h][1][0],k[h][1][1],k[h][1][2]];else if(this.attr_("stackedGraph")){var s=k.length,t;for(h=0;h<s;h++){var u=k[h][0];d[u]===undefined&&(d[u]=0),t=k[h][1];if(t===null){k[h]=[u,null];continue}d[u]+=t,k[h]=[u,d[u]],d[u]>r[1]&&(r[1]=d[u]),d[u]<r[0]&&(r[0]=d[u])}}var v=this.attr_("labels")[g];f[v]=r,e[g]=k}if(this.attr_("stackedGraph"))for(i=e.length-1;i>=0;--i){if(!e[i])continue;for(h=0;h<e[i].length;h++){var u=e[i][h][0];if(isNaN(d[u]))for(g=e.length-1;g>=0;g--){if(!e[g])continue;e[g][h][1]=NaN}}break}return[e,f,c]},Dygraph.prototype.drawGraph_=function(a){var b=new Date;typeof a=="undefined"&&(a=!0);var c=this.is_initial_draw_;this.is_initial_draw_=!1,this.layout_.removeAllDatasets(),this.setColors_(),this.attrs_.pointSize=.5*this.attr_("highlightCircleSize");var d=this.gatherDatasets_(this.rolledSeries_,this.dateWindow_),e=d[0],f=d[1];this.boundaryIds_=d[2],this.setIndexByName_={};var g=this.attr_("labels");g.length>0&&(this.setIndexByName_[g[0]]=0);var h=0;for(var i=1;i<e.length;i++){this.setIndexByName_[g[i]]=i;if(!this.visibility()[i-1])continue;this.layout_.addDataset(g[i],e[i]),this.datasetIndex_[i]=h++}this.computeYAxisRanges_(f),this.layout_.setYAxes(this.axes_),this.addXTicks_();var j=this.zoomed_x_;this.layout_.setDateWindow(this.dateWindow_),this.zoomed_x_=j,this.layout_.evaluateWithError(),this.renderGraph_(c,!1);if(this.attr_("timingName")){var k=new Date;console&&console.log(this.attr_("timingName")+" - drawGraph: "+(k-b)+"ms")}},Dygraph.prototype.renderGraph_=function(a,b){this.plotter_.clear(),this.plotter_.render(),this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height),this.setLegendHTML_(),a||b&&(typeof this.selPoints_!="undefined"&&this.selPoints_.length?this.clearSelection():this.clearSelection()),this.rangeSelector_&&this.rangeSelector_.renderInteractiveLayer(),this.attr_("drawCallback")!==null&&this.attr_("drawCallback")(this,a)},Dygraph.prototype.computeYAxes_=function(){var a,b,c,d,e,f,g;if(this.axes_!==undefined&&this.user_attrs_.hasOwnProperty("valueRange")===!1){b=[];for(e=0;e<this.axes_.length;e++)b.push(this.axes_[e].valueWindow)}this.axes_=[{yAxisId:0,g:this}],this.seriesToAxisMap_={};var h=this.attr_("labels"),i={};for(a=1;a<h.length;a++)i[h[a]]=a-1;var j=["includeZero","valueRange","labelsKMB","labelsKMG2","pixelsPerYLabel","yAxisLabelWidth","axisLabelFontSize","axisTickSize","logscale"];for(a=0;a<j.length;a++){var k=j[a];g=this.attr_(k),g&&(this.axes_[0][k]=g)}for(c in i){if(!i.hasOwnProperty(c))continue;d=this.attr_("axis",c);if(d===null){this.seriesToAxisMap_[c]=0;continue}if(typeof d=="object"){f={},Dygraph.update(f,this.axes_[0]),Dygraph.update(f,{valueRange:null});var l=this.axes_.length;f.yAxisId=l,f.g=this,Dygraph.update(f,d),this.axes_.push(f),this.seriesToAxisMap_[c]=l}}for(c in i){if(!i.hasOwnProperty(c))continue;d=this.attr_("axis",c);if(typeof d=="string"){if(!this.seriesToAxisMap_.hasOwnProperty(d))return this.error("Series "+c+" wants to share a y-axis with "+"series "+d+", which does not define its own axis."),null;var m=this.seriesToAxisMap_[d];this.seriesToAxisMap_[c]=m}}if(b!==undefined)for(e=0;e<b.length;e++)this.axes_[e].valueWindow=b[e];for(d=0;d<this.axes_.length;d++)if(d===0)f=this.optionsViewForAxis_("y"+(d?"2":"")),g=f("valueRange"),g&&(this.axes_[d].valueRange=g);else{var n=this.user_attrs_.axes;n&&n.y2&&(g=n.y2.valueRange,g&&(this.axes_[d].valueRange=g))}},Dygraph.prototype.numAxes=function(){var a=0;for(var b in this.seriesToAxisMap_){if(!this.seriesToAxisMap_.hasOwnProperty(b))continue;var c=this.seriesToAxisMap_[b];c>a&&(a=c)}return 1+a},Dygraph.prototype.axisPropertiesForSeries=function(a){return this.axes_[this.seriesToAxisMap_[a]]},Dygraph.prototype.computeYAxisRanges_=function(a){var b=[],c;for(c in this.seriesToAxisMap_){if(!this.seriesToAxisMap_.hasOwnProperty(c))continue;var d=this.seriesToAxisMap_[c];while(b.length<=d)b.push([]);b[d].push(c)}for(var e=0;e<this.axes_.length;e++){var f=this.axes_[e];if(!b[e])f.extremeRange=[0,1];else{c=b[e];var g=Infinity,h=-Infinity,i,j;for(var k=0;k<c.length;k++){if(!a.hasOwnProperty(c[k]))continue;i=a[c[k]][0],i!==null&&(g=Math.min(i,g)),j=a[c[k]][1],j!==null&&(h=Math.max(j,h))}f.includeZero&&g>0&&(g=0),g==Infinity&&(g=0),h==-Infinity&&(h=1);var l=h-g;l===0&&(l=h);var m,n;f.logscale?(m=h+.1*l,n=g):(m=h+.1*l,n=g-.1*l,this.attr_("avoidMinZero")||(n<0&&g>=0&&(n=0),m>0&&h<=0&&(m=0)),this.attr_("includeZero")&&(h<0&&(m=0),g>0&&(n=0))),f.extremeRange=[n,m]}f.valueWindow?f.computedValueRange=[f.valueWindow[0],f.valueWindow[1]]:f.valueRange?f.computedValueRange=[f.valueRange[0],f.valueRange[1]]:f.computedValueRange=f.extremeRange;var o=this.optionsViewForAxis_("y"+(e?"2":"")),p=o("ticker");if(e===0||f.independentTicks)f.ticks=p(f.computedValueRange[0],f.computedValueRange[1],this.height_,o,this);else{var q=this.axes_[0],r=q.ticks,s=q.computedValueRange[1]-q.computedValueRange[0],t=f.computedValueRange[1]-f.computedValueRange[0],u=[];for(var v=0;v<r.length;v++){var w=(r[v].v-q.computedValueRange[0])/s,x=f.computedValueRange[0]+w*t;u.push(x)}f.ticks=p(f.computedValueRange[0],f.computedValueRange[1],this.height_,o,this,u)}}},Dygraph.prototype.extractSeries_=function(a,b,c){var d=[];for(var e=0;e<a.length;e++){var f=a[e][0],g=a[e][b];c&&g<=0&&(g=null),d.push([f,g])}return d},Dygraph.prototype.rollingAverage=function(a,b){if(a.length<2)return a;b=Math.min(b,a.length);var c=[],d=this.attr_("sigma"),e,f,g,h,i,j,k,l;if(this.fractions_){var m=0,n=0,o=100;for(g=0;g<a.length;g++){m+=a[g][1][0],n+=a[g][1][1],g-b>=0&&(m-=a[g-b][1][0],n-=a[g-b][1][1]);var p=a[g][0],q=n?m/n:0;if(this.attr_("errorBars"))if(this.attr_("wilsonInterval"))if(n){var r=q<0?0:q,s=n,t=d*Math.sqrt(r*(1-r)/s+d*d/(4*s*s)),u=1+d*d/n;e=(r+d*d/(2*n)-t)/u,f=(r+d*d/(2*n)+t)/u,c[g]=[p,[r*o,(r-e)*o,(f-r)*o]]}else c[g]=[p,[0,0,0]];else l=n?d*Math.sqrt(q*(1-q)/n):1,c[g]=[p,[o*q,o*l,o*l]];else c[g]=[p,o*q]}}else if(this.attr_("customBars")){e=0;var v=0;f=0;var w=0;for(g=0;g<a.length;g++){var x=a[g][1];i=x[1],c[g]=[a[g][0],[i,i-x[0],x[2]-i]],i!==null&&!isNaN(i)&&(e+=x[0],v+=i,f+=x[2],w+=1);if(g-b>=0){var y=a[g-b];y[1][1]!==null&&!isNaN(y[1][1])&&(e-=y[1][0],v-=y[1][1],f-=y[1][2],w-=1)}w?c[g]=[a[g][0],[1*v/w,1*(v-e)/w,1*(f-v)/w]]:c[g]=[a[g][0],[null,null,null]]}}else if(!this.attr_("errorBars")){if(b==1)return a;for(g=0;g<a.length;g++){j=0,k=0;for(h=Math.max(0,g-b+1);h<g+1;h++){i=a[h][1];if(i===null||isNaN(i))continue;k++,j+=a[h][1]}k?c[g]=[a[g][0],j/k]:c[g]=[a[g][0],null]}}else for(g=0;g<a.length;g++){j=0;var z=0;k=0;for(h=Math.max(0,g-b+1);h<g+1;h++){i=a[h][1][0];if(i===null||isNaN(i))continue;k++,j+=a[h][1][0],z+=Math.pow(a[h][1][1],2)}k?(l=Math.sqrt(z)/k,c[g]=[a[g][0],[j/k,d*l,d*l]]):c[g]=[a[g][0],[null,null,null]]}return c},Dygraph.prototype.detectTypeFromString_=function(a){var b=!1,c=a.indexOf("-");c>0&&a[c-1]!="e"&&a[c-1]!="E"||a.indexOf("/")>=0||isNaN(parseFloat(a))?b=!0:a.length==8&&a>"19700101"&&a<"20371231"&&(b=!0),b?(this.attrs_.xValueParser=Dygraph.dateParser,this.attrs_.axes.x.valueFormatter=Dygraph.dateString_,this.attrs_.axes.x.ticker=Dygraph.dateTicker,this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter):(this.attrs_.xValueParser=function(a){return parseFloat(a)},this.attrs_.axes.x.valueFormatter=function(a){return a},this.attrs_.axes.x.ticker=Dygraph.numericLinearTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter)},Dygraph.prototype.parseFloat_=function(a,b,c){var d=parseFloat(a);if(!isNaN(d))return d;if(/^ *$/.test(a))return null;if(/^ *nan *$/i.test(a))return NaN;var e="Unable to parse '"+a+"' as a number";return c!==null&&b!==null&&(e+=" on line "+(1+b)+" ('"+c+"') of CSV."),this.error(e),null},Dygraph.prototype.parseCSV_=function(a){var b=[],c=a.split("\n"),d,e,f=this.attr_("delimiter");c[0].indexOf(f)==-1&&c[0].indexOf(" ")>=0&&(f=" ");var g=0;"labels"in this.user_attrs_||(g=1,this.attrs_.labels=c[0].split(f));var h=0,i,j=!1,k=this.attr_("labels").length,l=!1;for(var m=g;m<c.length;m++){var n=c[m];h=m;if(n.length===0)continue;if(n[0]=="#")continue;var o=n.split(f);if(o.length<2)continue;var p=[];j||(this.detectTypeFromString_(o[0]),i=this.attr_("xValueParser"),j=!0),p[0]=i(o[0],this);if(this.fractions_)for(e=1;e<o.length;e++)d=o[e].split("/"),d.length!=2?(this.error('Expected fractional "num/den" values in CSV data but found a value \''+o[e]+"' on line "+(1+m)+" ('"+n+"') which is not of this form."),p[e]=[0,0]):p[e]=[this.parseFloat_(d[0],m,n),this.parseFloat_(d[1],m,n)];else if(this.attr_("errorBars")){o.length%2!=1&&this.error("Expected alternating (value, stdev.) pairs in CSV data but line "+(1+m)+" has an odd number of values ("+(o.length-1)+"): '"+n+"'");for(e=1;e<o.length;e+=2)p[(e+1)/2]=[this.parseFloat_(o[e],m,n),this.parseFloat_(o[e+1],m,n)]}else if(this.attr_("customBars"))for(e=1;e<o.length;e++){var q=o[e];/^ *$/.test(q)?p[e]=[null,null,null]:(d=q.split(";"),d.length==3?p[e]=[this.parseFloat_(d[0],m,n),this.parseFloat_(d[1],m,n),this.parseFloat_(d[2],m,n)]:this.warn('When using customBars, values must be either blank or "low;center;high" tuples (got "'+q+'" on line '+(1+m)))}else for(e=1;e<o.length;e++)p[e]=this.parseFloat_(o[e],m,n);b.length>0&&p[0]<b[b.length-1][0]&&(l=!0),p.length!=k&&this.error("Number of columns in line "+m+" ("+p.length+") does not agree with number of labels ("+k+") "+n);if(m===0&&this.attr_("labels")){var r=!0;for(e=0;r&&e<p.length;e++)p[e]&&(r=!1);if(r){this.warn("The dygraphs 'labels' option is set, but the first row of CSV data ('"+n+"') appears to also contain labels. "+"Will drop the CSV labels and use the option labels.");continue}}b.push(p)}return l&&(this.warn("CSV is out of order; order it correctly to speed loading."),b.sort(function(a,b){return a[0]-b[0]})),b},Dygraph.prototype.parseArray_=function(a){if(a.length===0)return this.error("Can't plot empty data set"),null;if(a[0].length===0)return this.error("Data set cannot contain an empty row"),null;var b;if(this.attr_("labels")===null){this.warn("Using default labels. Set labels explicitly via 'labels' in the options parameter"),this.attrs_.labels=["X"];for(b=1;b<a[0].length;b++)this.attrs_.labels.push("Y"+b)}if(Dygraph.isDateLike(a[0][0])){this.attrs_.axes.x.valueFormatter=Dygraph.dateString_,this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter,this.attrs_.axes.x.ticker=Dygraph.dateTicker;var c=Dygraph.clone(a);for(b=0;b<a.length;b++){if(c[b].length===0)return this.error("Row "+(1+b)+" of data is empty"),null;if(c[b][0]===null||typeof c[b][0].getTime!="function"||isNaN(c[b][0].getTime()))return this.error("x value in row "+(1+b)+" is not a Date"),null;c[b][0]=c[b][0].getTime()}return c}return this.attrs_.axes.x.valueFormatter=function(a){return a},this.attrs_.axes.x.axisLabelFormatter=Dygraph.numberAxisLabelFormatter,this.attrs_.axes.x.ticker=Dygraph.numericLinearTicks,a},Dygraph.prototype.parseDataTable_=function(a){var b=function(a){var b=String.fromCharCode(65+a%26);a=Math.floor(a/26);while(a>0)b=String.fromCharCode(65+(a-1)%26)+b.toLowerCase(),a=Math.floor((a-1)/26);return b},c=a.getNumberOfColumns(),d=a.getNumberOfRows(),e=a.getColumnType(0);if(e=="date"||e=="datetime")this.attrs_.xValueParser=Dygraph.dateParser,this.attrs_.axes.x.valueFormatter=Dygraph.dateString_,this.attrs_.axes.x.ticker=Dygraph.dateTicker,this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter;else{if(e!="number")return this.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '"+e+"')"),null;this.attrs_.xValueParser=function(a){return parseFloat(a)},this.attrs_.axes.x.valueFormatter=function(a){return a},this.attrs_.axes.x.ticker=Dygraph.numericLinearTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter}var f=[],g={},h=!1,i,j;for(i=1;i<c;i++){var k=a.getColumnType(i);if(k=="number")f.push(i);else if(k=="string"&&this.attr_("displayAnnotations")){var l=f[f.length-1];g.hasOwnProperty(l)?g[l].push(i):g[l]=[i],h=!0}else this.error("Only 'number' is supported as a dependent type with Gviz. 'string' is only supported if displayAnnotations is true")}var m=[a.getColumnLabel(0)];for(i=0;i<f.length;i++)m.push(a.getColumnLabel(f[i])),this.attr_("errorBars")&&(i+=1);this.attrs_.labels=m,c=m.length;var n=[],o=!1,p=[];for(i=0;i<d;i++){var q=[];if(typeof a.getValue(i,0)=="undefined"||a.getValue(i,0)===null){this.warn("Ignoring row "+i+" of DataTable because of undefined or null first column.");continue}e=="date"||e=="datetime"?q.push(a.getValue(i,0).getTime()):q.push(a.getValue(i,0));if(!this.attr_("errorBars")){for(j=0;j<f.length;j++){var r=f[j];q.push(a.getValue(i,r));if(h&&g.hasOwnProperty(r)&&a.getValue(i,g[r][0])!==null){var s={};s.series=a.getColumnLabel
+(r),s.xval=q[0],s.shortText=b(p.length),s.text="";for(var t=0;t<g[r].length;t++)t&&(s.text+="\n"),s.text+=a.getValue(i,g[r][t]);p.push(s)}}for(j=0;j<q.length;j++)isFinite(q[j])||(q[j]=null)}else for(j=0;j<c-1;j++)q.push([a.getValue(i,1+2*j),a.getValue(i,2+2*j)]);n.length>0&&q[0]<n[n.length-1][0]&&(o=!0),n.push(q)}o&&(this.warn("DataTable is out of order; order it correctly to speed loading."),n.sort(function(a,b){return a[0]-b[0]})),this.rawData_=n,p.length>0&&this.setAnnotations(p,!0)},Dygraph.prototype.start_=function(){var a=this.file_;typeof a=="function"&&(a=a());if(Dygraph.isArrayLike(a))this.rawData_=this.parseArray_(a),this.predraw_();else if(typeof a=="object"&&typeof a.getColumnRange=="function")this.parseDataTable_(a),this.predraw_();else if(typeof a=="string")if(a.indexOf("\n")>=0)this.loadedEvent_(a);else{var b=new XMLHttpRequest,c=this;b.onreadystatechange=function(){b.readyState==4&&(b.status===200||b.status===0)&&c.loadedEvent_(b.responseText)},b.open("GET",a,!0),b.send(null)}else this.error("Unknown data format: "+typeof a)},Dygraph.prototype.updateOptions=function(a,b){typeof b=="undefined"&&(b=!1);var c=a.file,d=Dygraph.mapLegacyOptions_(a);"rollPeriod"in d&&(this.rollPeriod_=d.rollPeriod),"dateWindow"in d&&(this.dateWindow_=d.dateWindow,"isZoomedIgnoreProgrammaticZoom"in d||(this.zoomed_x_=d.dateWindow!==null)),"valueRange"in d&&!("isZoomedIgnoreProgrammaticZoom"in d)&&(this.zoomed_y_=d.valueRange!==null);var e=Dygraph.isPixelChangingOptionList(this.attr_("labels"),d);Dygraph.updateDeep(this.user_attrs_,d),c?(this.file_=c,b||this.start_()):b||(e?this.predraw_():this.renderGraph_(!1,!1))},Dygraph.mapLegacyOptions_=function(a){var b={};for(var c in a){if(c=="file")continue;a.hasOwnProperty(c)&&(b[c]=a[c])}var d=function(a,c,d){b.axes||(b.axes={}),b.axes[a]||(b.axes[a]={}),b.axes[a][c]=d},e=function(c,e,f){typeof a[c]!="undefined"&&(d(e,f,a[c]),delete b[c])};return e("xValueFormatter","x","valueFormatter"),e("pixelsPerXLabel","x","pixelsPerLabel"),e("xAxisLabelFormatter","x","axisLabelFormatter"),e("xTicker","x","ticker"),e("yValueFormatter","y","valueFormatter"),e("pixelsPerYLabel","y","pixelsPerLabel"),e("yAxisLabelFormatter","y","axisLabelFormatter"),e("yTicker","y","ticker"),b},Dygraph.prototype.resize=function(a,b){if(this.resize_lock)return;this.resize_lock=!0,a===null!=(b===null)&&(this.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero."),a=b=null);var c=this.width_,d=this.height_;a?(this.maindiv_.style.width=a+"px",this.maindiv_.style.height=b+"px",this.width_=a,this.height_=b):(this.width_=this.maindiv_.clientWidth,this.height_=this.maindiv_.clientHeight);if(c!=this.width_||d!=this.height_)this.maindiv_.innerHTML="",this.roller_=null,this.attrs_.labelsDiv=null,this.createInterface_(),this.annotations_.length&&this.layout_.setAnnotations(this.annotations_),this.predraw_();this.resize_lock=!1},Dygraph.prototype.adjustRoll=function(a){this.rollPeriod_=a,this.predraw_()},Dygraph.prototype.visibility=function(){this.attr_("visibility")||(this.attrs_.visibility=[]);while(this.attr_("visibility").length<this.numColumns()-1)this.attrs_.visibility.push(!0);return this.attr_("visibility")},Dygraph.prototype.setVisibility=function(a,b){var c=this.visibility();a<0||a>=c.length?this.warn("invalid series number in setVisibility: "+a):(c[a]=b,this.predraw_())},Dygraph.prototype.size=function(){return{width:this.width_,height:this.height_}},Dygraph.prototype.setAnnotations=function(a,b){Dygraph.addAnnotationRule(),this.annotations_=a,this.layout_.setAnnotations(this.annotations_),b||this.predraw_()},Dygraph.prototype.annotations=function(){return this.annotations_},Dygraph.prototype.getLabels=function(a){return this.attr_("labels").slice()},Dygraph.prototype.indexFromSetName=function(a){return this.setIndexByName_[a]},Dygraph.prototype.datasetIndexFromSetName_=function(a){return this.datasetIndex_[this.indexFromSetName(a)]},Dygraph.addAnnotationRule=function(){if(Dygraph.addedAnnotationCSS)return;var a="border: 1px solid black; background-color: white; text-align: center;",b=document.createElement("style");b.type="text/css",document.getElementsByTagName("head")[0].appendChild(b);for(var c=0;c<document.styleSheets.length;c++){if(document.styleSheets[c].disabled)continue;var d=document.styleSheets[c];try{if(d.insertRule){var e=d.cssRules?d.cssRules.length:0;d.insertRule(".dygraphDefaultAnnotation { "+a+" }",e)}else d.addRule&&d.addRule(".dygraphDefaultAnnotation",a);Dygraph.addedAnnotationCSS=!0;return}catch(f){}}this.warn("Unable to add default annotation CSS rule; display may be off.")};var DateGraph=Dygraph;"use strict",Dygraph.LOG_SCALE=10,Dygraph.LN_TEN=Math.log(Dygraph.LOG_SCALE),Dygraph.log10=function(a){return Math.log(a)/Dygraph.LN_TEN},Dygraph.DEBUG=1,Dygraph.INFO=2,Dygraph.WARNING=3,Dygraph.ERROR=3,Dygraph.LOG_STACK_TRACES=!1,Dygraph.DOTTED_LINE=[2,2],Dygraph.DASHED_LINE=[7,3],Dygraph.DOT_DASH_LINE=[7,2,2,2],Dygraph.log=function(a,b){var c;if(typeof printStackTrace!="undefined"){c=printStackTrace({guess:!1});while(c[0].indexOf("stacktrace")!=-1)c.splice(0,1);c.splice(0,2);for(var d=0;d<c.length;d++)c[d]=c[d].replace(/\([^)]*\/(.*)\)/,"@$1").replace(/\@.*\/([^\/]*)/,"@$1").replace("[object Object].","");var e=c.splice(0,1)[0];b+=" ("+e.replace(/^.*@ ?/,"")+")"}if(typeof console!="undefined")switch(a){case Dygraph.DEBUG:console.debug("dygraphs: "+b);break;case Dygraph.INFO:console.info("dygraphs: "+b);break;case Dygraph.WARNING:console.warn("dygraphs: "+b);break;case Dygraph.ERROR:console.error("dygraphs: "+b)}Dygraph.LOG_STACK_TRACES&&console.log(c.join("\n"))},Dygraph.info=function(a){Dygraph.log(Dygraph.INFO,a)},Dygraph.prototype.info=Dygraph.info,Dygraph.warn=function(a){Dygraph.log(Dygraph.WARNING,a)},Dygraph.prototype.warn=Dygraph.warn,Dygraph.error=function(a){Dygraph.log(Dygraph.ERROR,a)},Dygraph.prototype.error=Dygraph.error,Dygraph.getContext=function(a){return a.getContext("2d")},Dygraph.addEvent=function(b,c,d){b.addEventListener?b.addEventListener(c,d,!1):(b[c+d]=function(){d(window.event)},b.attachEvent("on"+c,b[c+d]))},Dygraph.removeEvent=function(b,c,d){b.removeEventListener?b.removeEventListener(c,d,!1):(b.detachEvent("on"+c,b[c+d]),b[c+d]=null)},Dygraph.cancelEvent=function(a){return a=a?a:window.event,a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a.cancelBubble=!0,a.cancel=!0,a.returnValue=!1,!1},Dygraph.hsvToRGB=function(a,b,c){var d,e,f;if(b===0)d=c,e=c,f=c;else{var g=Math.floor(a*6),h=a*6-g,i=c*(1-b),j=c*(1-b*h),k=c*(1-b*(1-h));switch(g){case 1:d=j,e=c,f=i;break;case 2:d=i,e=c,f=k;break;case 3:d=i,e=j,f=c;break;case 4:d=k,e=i,f=c;break;case 5:d=c,e=i,f=j;break;case 6:case 0:d=c,e=k,f=i}}return d=Math.floor(255*d+.5),e=Math.floor(255*e+.5),f=Math.floor(255*f+.5),"rgb("+d+","+e+","+f+")"},Dygraph.findPosX=function(a){var b=0;if(a.offsetParent){var c=a;for(;;){b+=c.offsetLeft;if(!c.offsetParent)break;c=c.offsetParent}}else a.x&&(b+=a.x);while(a&&a!=document.body)b-=a.scrollLeft,a=a.parentNode;return b},Dygraph.findPosY=function(a){var b=0;if(a.offsetParent){var c=a;for(;;){b+=c.offsetTop;if(!c.offsetParent)break;c=c.offsetParent}}else a.y&&(b+=a.y);while(a&&a!=document.body)b-=a.scrollTop,a=a.parentNode;return b},Dygraph.pageX=function(a){if(a.pageX)return!a.pageX||a.pageX<0?0:a.pageX;var b=document,c=document.body;return a.clientX+(b.scrollLeft||c.scrollLeft)-(b.clientLeft||0)},Dygraph.pageY=function(a){if(a.pageY)return!a.pageY||a.pageY<0?0:a.pageY;var b=document,c=document.body;return a.clientY+(b.scrollTop||c.scrollTop)-(b.clientTop||0)},Dygraph.isOK=function(a){return a&&!isNaN(a)},Dygraph.isValidPoint=function(a,b){return a?a.yval===null?!1:a.x===null||a.x===undefined?!1:a.y===null||a.y===undefined?!1:isNaN(a.x)||!b&&isNaN(a.y)?!1:!0:!1},Dygraph.floatFormat=function(a,b){var c=Math.min(Math.max(1,b||2),21);return Math.abs(a)<.001&&a!==0?a.toExponential(c-1):a.toPrecision(c)},Dygraph.zeropad=function(a){return a<10?"0"+a:""+a},Dygraph.hmsString_=function(a){var b=Dygraph.zeropad,c=new Date(a);return c.getSeconds()?b(c.getHours())+":"+b(c.getMinutes())+":"+b(c.getSeconds()):b(c.getHours())+":"+b(c.getMinutes())},Dygraph.round_=function(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c},Dygraph.binarySearch=function(a,b,c,d,e){if(d===null||d===undefined||e===null||e===undefined)d=0,e=b.length-1;if(d>e)return-1;if(c===null||c===undefined)c=0;var f=function(a){return a>=0&&a<b.length},g=parseInt((d+e)/2,10),h=b[g];if(h==a)return g;var i;if(h>a){if(c>0){i=g-1;if(f(i)&&b[i]<a)return g}return Dygraph.binarySearch(a,b,c,d,g-1)}if(h<a){if(c<0){i=g+1;if(f(i)&&b[i]>a)return g}return Dygraph.binarySearch(a,b,c,g+1,e)}},Dygraph.dateParser=function(a){var b,c;if(a.search("-")==-1||a.search("T")!=-1||a.search("Z")!=-1){c=Dygraph.dateStrToMillis(a);if(c&&!isNaN(c))return c}if(a.search("-")!=-1){b=a.replace("-","/","g");while(b.search("-")!=-1)b=b.replace("-","/");c=Dygraph.dateStrToMillis(b)}else a.length==8?(b=a.substr(0,4)+"/"+a.substr(4,2)+"/"+a.substr(6,2),c=Dygraph.dateStrToMillis(b)):c=Dygraph.dateStrToMillis(a);return(!c||isNaN(c))&&Dygraph.error("Couldn't parse "+a+" as a date"),c},Dygraph.dateStrToMillis=function(a){return(new Date(a)).getTime()},Dygraph.update=function(a,b){if(typeof b!="undefined"&&b!==null)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},Dygraph.updateDeep=function(a,b){function c(a){return typeof Node=="object"?a instanceof Node:typeof a=="object"&&typeof a.nodeType=="number"&&typeof a.nodeName=="string"}if(typeof b!="undefined"&&b!==null)for(var d in b)b.hasOwnProperty(d)&&(b[d]===null?a[d]=null:Dygraph.isArrayLike(b[d])?a[d]=b[d].slice():c(b[d])?a[d]=b[d]:typeof b[d]=="object"?(typeof a[d]!="object"&&(a[d]={}),Dygraph.updateDeep(a[d],b[d])):a[d]=b[d]);return a},Dygraph.isArrayLike=function(a){var b=typeof a;return b!="object"&&(b!="function"||typeof a.item!="function")||a===null||typeof a.length!="number"||a.nodeType===3?!1:!0},Dygraph.isDateLike=function(a){return typeof a!="object"||a===null||typeof a.getTime!="function"?!1:!0},Dygraph.clone=function(a){var b=[];for(var c=0;c<a.length;c++)Dygraph.isArrayLike(a[c])?b.push(Dygraph.clone(a[c])):b.push(a[c]);return b},Dygraph.createCanvas=function(){var a=document.createElement("canvas"),b=/MSIE/.test(navigator.userAgent)&&!window.opera;return b&&typeof G_vmlCanvasManager!="undefined"&&(a=G_vmlCanvasManager.initElement(a)),a},Dygraph.isAndroid=function(){return/Android/.test(navigator.userAgent)},Dygraph.repeatAndCleanup=function(a,b,c,d){var e=0,f=(new Date).getTime();a(e);if(b==1){d();return}(function g(){if(e>=b)return;var h=f+(1+e)*c;setTimeout(function(){e++,a(e),e>=b-1?d():g()},h-(new Date).getTime())})()},Dygraph.isPixelChangingOptionList=function(a,b){var c={annotationClickHandler:!0,annotationDblClickHandler:!0,annotationMouseOutHandler:!0,annotationMouseOverHandler:!0,axisLabelColor:!0,axisLineColor:!0,axisLineWidth:!0,clickCallback:!0,digitsAfterDecimal:!0,drawCallback:!0,drawHighlightPointCallback:!0,drawPoints:!0,drawPointCallback:!0,drawXGrid:!0,drawYGrid:!0,fillAlpha:!0,gridLineColor:!0,gridLineWidth:!0,hideOverlayOnMouseOut:!0,highlightCallback:!0,highlightCircleSize:!0,interactionModel:!0,isZoomedIgnoreProgrammaticZoom:!0,labelsDiv:!0,labelsDivStyles:!0,labelsDivWidth:!0,labelsKMB:!0,labelsKMG2:!0,labelsSeparateLines:!0,labelsShowZeroValues:!0,legend:!0,maxNumberWidth:!0,panEdgeFraction:!0,pixelsPerYLabel:!0,pointClickCallback:!0,pointSize:!0,rangeSelectorPlotFillColor:!0,rangeSelectorPlotStrokeColor:!0,showLabelsOnHighlight:!0,showRoller:!0,sigFigs:!0,strokeWidth:!0,underlayCallback:!0,unhighlightCallback:!0,xAxisLabelFormatter:!0,xTicker:!0,xValueFormatter:!0,yAxisLabelFormatter:!0,yValueFormatter:!0,zoomCallback:!0},d=!1,e={};if(a)for(var f=1;f<a.length;f++)e[a[f]]=!0;for(var g in b){if(d)break;if(b.hasOwnProperty(g))if(e[g])for(var h in b[g]){if(d)break;b[g].hasOwnProperty(h)&&!c[h]&&(d=!0)}else c[g]||(d=!0)}return d},Dygraph.compareArrays=function(a,b){if(!Dygraph.isArrayLike(a)||!Dygraph.isArrayLike(b))return!1;if(a.length!==b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!==b[c])return!1;return!0},Dygraph.regularShape_=function(a,b,c,d,e,f,g){f=f?f:0,g=g?g:Math.PI*2/b,a.beginPath();var h=!0,i=f,j=i,k=function(){var a=d+Math.sin(j)*c,b=e+ -Math.cos(j)*c;return[a,b]},l=k(),m=l[0],n=l[1];a.moveTo(m,n);for(var o=0;o<b;o++){j=o==b-1?i:j+g;var p=k();a.lineTo(p[0],p[1])}a.fill(),a.stroke()},Dygraph.shapeFunction_=function(a,b,c){return function(d,e,f,g,h,i,j){f.strokeStyle=i,f.fillStyle="white",Dygraph.regularShape_(f,a,j,g,h,b,c)}},Dygraph.DrawPolygon_=function(a,b,c,d,e,f,g,h){(new Dygraph.RegularShape_(a,b,h)).draw(c,d,e,g)},Dygraph.Circles={DEFAULT:function(a,b,c,d,e,f,g){c.beginPath(),c.fillStyle=f,c.arc(d,e,g,0,2*Math.PI,!1),c.fill()},TRIANGLE:Dygraph.shapeFunction_(3),SQUARE:Dygraph.shapeFunction_(4,Math.PI/4),DIAMOND:Dygraph.shapeFunction_(4),PENTAGON:Dygraph.shapeFunction_(5),HEXAGON:Dygraph.shapeFunction_(6),CIRCLE:function(a,b,c,d,e,f,g){c.beginPath(),c.strokeStyle=f,c.fillStyle="white",c.arc(d,e,g,0,2*Math.PI,!1),c.fill(),c.stroke()},STAR:Dygraph.shapeFunction_(5,0,4*Math.PI/5),PLUS:function(a,b,c,d,e,f,g){c.strokeStyle=f,c.beginPath(),c.moveTo(d+g,e),c.lineTo(d-g,e),c.closePath(),c.stroke(),c.beginPath(),c.moveTo(d,e+g),c.lineTo(d,e-g),c.closePath(),c.stroke()},EX:function(a,b,c,d,e,f,g){c.strokeStyle=f,c.beginPath(),c.moveTo(d+g,e+g),c.lineTo(d-g,e-g),c.closePath(),c.stroke(),c.beginPath(),c.moveTo(d+g,e-g),c.lineTo(d-g,e+g),c.closePath(),c.stroke()}},"use strict",Dygraph.GVizChart=function(a){this.container=a},Dygraph.GVizChart.prototype.draw=function(a,b){this.container.innerHTML="",typeof this.date_graph!="undefined"&&this.date_graph.destroy(),this.date_graph=new Dygraph(this.container,a,b)},Dygraph.GVizChart.prototype.setSelection=function(a){var b=!1;a.length&&(b=a[0].row),this.date_graph.setSelection(b)},Dygraph.GVizChart.prototype.getSelection=function(){var a=[],b=this.date_graph.getSelection();if(b<0)return a;var c=this.date_graph.layout_.datasets;for(var d=0;d<c.length;++d)a.push({row:b,column:d+1});return a},"use strict",Dygraph.Interaction={},Dygraph.Interaction.startPan=function(a,b,c){var d,e;c.isPanning=!0;var f=b.xAxisRange();c.dateRange=f[1]-f[0],c.initialLeftmostDate=f[0],c.xUnitsPerPixel=c.dateRange/(b.plotter_.area.w-1);if(b.attr_("panEdgeFraction")){var g=b.width_*b.attr_("panEdgeFraction"),h=b.xAxisExtremes(),i=b.toDomXCoord(h[0])-g,j=b.toDomXCoord(h[1])+g,k=b.toDataXCoord(i),l=b.toDataXCoord(j);c.boundedDates=[k,l];var m=[],n=b.height_*b.attr_("panEdgeFraction");for(d=0;d<b.axes_.length;d++){e=b.axes_[d];var o=e.extremeRange,p=b.toDomYCoord(o[0],d)+n,q=b.toDomYCoord(o[1],d)-n,r=b.toDataYCoord(p),s=b.toDataYCoord(q);m[d]=[r,s]}c.boundedValues=m}c.is2DPan=!1,c.axes=[];for(d=0;d<b.axes_.length;d++){e=b.axes_[d];var t={},u=b.yAxisRange(d);e.logscale?(t.initialTopValue=Dygraph.log10(u[1]),t.dragValueRange=Dygraph.log10(u[1])-Dygraph.log10(u[0])):(t.initialTopValue=u[1],t.dragValueRange=u[1]-u[0]),t.unitsPerPixel=t.dragValueRange/(b.plotter_.area.h-1),c.axes.push(t);if(e.valueWindow||e.valueRange)c.is2DPan=!0}},Dygraph.Interaction.movePan=function(a,b,c){c.dragEndX=b.dragGetX_(a,c),c.dragEndY=b.dragGetY_(a,c);var d=c.initialLeftmostDate-(c.dragEndX-c.dragStartX)*c.xUnitsPerPixel;c.boundedDates&&(d=Math.max(d,c.boundedDates[0]));var e=d+c.dateRange;c.boundedDates&&e>c.boundedDates[1]&&(d-=e-c.boundedDates[1],e=d+c.dateRange),b.dateWindow_=[d,e];if(c.is2DPan)for(var f=0;f<b.axes_.length;f++){var g=b.axes_[f],h=c.axes[f],i=c.dragEndY-c.dragStartY,j=i*h.unitsPerPixel,k=c.boundedValues?c.boundedValues[f]:null,l=h.initialTopValue+j;k&&(l=Math.min(l,k[1]));var m=l-h.dragValueRange;k&&m<k[0]&&(l-=m-k[0],m=l-h.dragValueRange),g.logscale?g.valueWindow=[Math.pow(Dygraph.LOG_SCALE,m),Math.pow(Dygraph.LOG_SCALE,l)]:g.valueWindow=[m,l]}b.drawGraph_(!1)},Dygraph.Interaction.endPan=function(a,b,c){c.dragEndX=b.dragGetX_(a,c),c.dragEndY=b.dragGetY_(a,c);var d=Math.abs(c.dragEndX-c.dragStartX),e=Math.abs(c.dragEndY-c.dragStartY);d<2&&e<2&&b.lastx_!==undefined&&b.lastx_!=-1&&Dygraph.Interaction.treatMouseOpAsClick(b,a,c),c.isPanning=!1,c.is2DPan=!1,c.initialLeftmostDate=null,c.dateRange=null,c.valueRange=null,c.boundedDates=null,c.boundedValues=null,c.axes=null},Dygraph.Interaction.startZoom=function(a,b,c){c.isZooming=!0},Dygraph.Interaction.moveZoom=function(a,b,c){c.dragEndX=b.dragGetX_(a,c),c.dragEndY=b.dragGetY_(a,c);var d=Math.abs(c.dragStartX-c.dragEndX),e=Math.abs(c.dragStartY-c.dragEndY);c.dragDirection=d<e/2?Dygraph.VERTICAL:Dygraph.HORIZONTAL,b.drawZoomRect_(c.dragDirection,c.dragStartX,c.dragEndX,c.dragStartY,c.dragEndY,c.prevDragDirection,c.prevEndX,c.prevEndY),c.prevEndX=c.dragEndX,c.prevEndY=c.dragEndY,c.prevDragDirection=c.dragDirection},Dygraph.Interaction.treatMouseOpAsClick=function(a,b,c){var d=a.attr_("clickCallback"),e=a.attr_("pointClickCallback"),f=null;if(e){var g=-1,h=Number.MAX_VALUE;for(var i=0;i<a.selPoints_.length;i++){var j=a.selPoints_[i],k=Math.pow(j.canvasx-c.dragEndX,2)+Math.pow(j.canvasy-c.dragEndY,2);!isNaN(k)&&(g==-1||k<h)&&(h=k,g=i)}var l=a.attr_("highlightCircleSize")+2;h<=l*l&&(f=a.selPoints_[g])}f&&e(b,f),d&&d(b,a.lastx_,a.selPoints_)},Dygraph.Interaction.endZoom=function(a,b,c){c.isZooming=!1,c.dragEndX=b.dragGetX_(a,c),c.dragEndY=b.dragGetY_(a,c);var d=Math.abs(c.dragEndX-c.dragStartX),e=Math.abs(c.dragEndY-c.dragStartY);d<2&&e<2&&b.lastx_!==undefined&&b.lastx_!=-1&&Dygraph.Interaction.treatMouseOpAsClick(b,a,c),d>=10&&c.dragDirection==Dygraph.HORIZONTAL?(b.doZoomX_(Math.min(c.dragStartX,c.dragEndX),Math.max(c.dragStartX,c.dragEndX)),c.cancelNextDblclick=!0):e>=10&&c.dragDirection==Dygraph.VERTICAL?(b.doZoomY_(Math.min(c.dragStartY,c.dragEndY),Math.max(c.dragStartY,c.dragEndY)),c.cancelNextDblclick=!0):b.clearZoomRect_(),c.dragStartX=null,c.dragStartY=null},Dygraph.Interaction.startTouch=function(a,b,c){a.preventDefault();var d=[];for(var e=0;e<a.touches.length;e++){var f=a.touches[e];d.push({pageX:f.pageX,pageY:f.pageY,dataX:b.toDataXCoord(f.pageX),dataY:b.toDataYCoord(f.pageY)})}c.initialTouches=d;if(d.length==1)c.initialPinchCenter=d[0],c.touchDirections={x:!0,y:!0};else if(d.length==2){c.initialPinchCenter={pageX:.5*(d[0].pageX+d[1].pageX),pageY:.5*(d[0].pageY+d[1].pageY),dataX:.5*(d[0].dataX+d[1].dataX),dataY:.5*(d[0].dataY+d[1].dataY)};var g=180/Math.PI*Math.atan2(c.initialPinchCenter.pageY-d[0].pageY,d[0].pageX-c.initialPinchCenter.pageX);g=Math.abs(g),g>90&&(g=90-g),c.touchDirections={x:g<67.5,y:g>22.5}}c.initialRange={x:b.xAxisRange(),y:b.yAxisRange()}},Dygraph.Interaction.moveTouch=function(a,b,c){var d,e=[];for(d=0;d<a.touches.length;d++){var f=a.touches[d];e.push({pageX:f.pageX,pageY:f.pageY})}var g=c.initialTouches,h,i=c.initialPinchCenter;e.length==1?h=e[0]:h={pageX:.5*(e[0].pageX+e[1].pageX),pageY:.5*(e[0].pageY+e[1].pageY)};var j={pageX:h.pageX-i.pageX,pageY:h.pageY-i.pageY},k=c.initialRange.x[1]-c.initialRange.x[0],l=c.initialRange.y[0]-c.initialRange.y[1];j.dataX=j.pageX/b.plotter_.area.w*k,j.dataY=j.pageY/b.plotter_.area.h*l;var m,n;if(e.length==1)m=1,n=1;else if(e.length==2){var o=g[1].pageX-i.pageX;m=(e[1].pageX-h.pageX)/o;var p=g[1].pageY-i.pageY;n=(e[1].pageY-h.pageY)/p}m=Math.min(8,Math.max(.125,m)),n=Math.min(8,Math.max(.125,n)),c.touchDirections.x&&(b.dateWindow_=[i.dataX-j.dataX+(c.initialRange.x[0]-i.dataX)/m,i.dataX-j.dataX+(c.initialRange.x[1]-i.dataX)/m]);if(c.touchDirections.y)for(d=0;d<1;d++){var q=b.axes_[d];q.logscale||(q.valueWindow=[i.dataY-j.dataY+(c.initialRange.y[0]-i.dataY)/n,i.dataY-j.dataY+(c.initialRange.y[1]-i.dataY)/n])}b.drawGraph_(!1)},Dygraph.Interaction.endTouch=function(a,b,c){a.touches.length!=0&&Dygraph.Interaction.startTouch(a,b,c)},Dygraph.Interaction.defaultModel={mousedown:function(a,b,c){if(a.button&&a.button==2)return;c.initializeMouseDown(a,b,c),a.altKey||a.shiftKey?Dygraph.startPan(a,b,c):Dygraph.startZoom(a,b,c)},mousemove:function(a,b,c){c.isZooming?Dygraph.moveZoom(a,b,c):c.isPanning&&Dygraph.movePan(a,b,c)},mouseup:function(a,b,c){c.isZooming?Dygraph.endZoom(a,b,c):c.isPanning&&Dygraph.endPan(a,b,c)},touchstart:function(a,b,c){Dygraph.Interaction.startTouch(a,b,c)},touchmove:function(a,b,c){Dygraph.Interaction.moveTouch(a,b,c)},touchend:function(a,b,c){Dygraph.Interaction.endTouch(a,b,c)},mouseout:function(a,b,c){c.isZooming&&(c.dragEndX=null,c.dragEndY=null)},dblclick:function(a,b,c){if(c.cancelNextDblclick){c.cancelNextDblclick=!1;return}if(a.altKey||a.shiftKey)return;b.doUnzoom_()}},Dygraph.DEFAULT_ATTRS.interactionModel=Dygraph.Interaction.defaultModel,Dygraph.defaultInteractionModel=Dygraph.Interaction.defaultModel,Dygraph.endZoom=Dygraph.Interaction.endZoom,Dygraph.moveZoom=Dygraph.Interaction.moveZoom,Dygraph.startZoom=Dygraph.Interaction.startZoom,Dygraph.endPan=Dygraph.Interaction.endPan,Dygraph.movePan=Dygraph.Interaction.movePan,Dygraph.startPan=Dygraph.Interaction.startPan,Dygraph.Interaction.nonInteractiveModel_={mousedown:function(a,b,c){c.initializeMouseDown(a,b,c)},mouseup:function(a,b,c){c.dragEndX=b.dragGetX_(a,c),c.dragEndY=b.dragGetY_(a,c);var d=Math.abs(c.dragEndX-c.dragStartX),e=Math.abs(c.dragEndY-c.dragStartY);d<2&&e<2&&b.lastx_!==undefined&&b.lastx_!=-1&&Dygraph.Interaction.treatMouseOpAsClick(b,a,c)}},Dygraph.Interaction.dragIsPanInteractionModel={mousedown:function(a,b,c){c.initializeMouseDown(a,b,c),Dygraph.startPan(a,b,c)},mousemove:function(a,b,c){c.isPanning&&Dygraph.movePan(a,b,c)},mouseup:function(a,b,c){c.isPanning&&Dygraph.endPan(a,b,c)}},"use strict";var DygraphRangeSelector=function(a){this.isIE_=/MSIE/.test(navigator.userAgent)&&!window.opera,this.isUsingExcanvas_=a.isUsingExcanvas_,this.dygraph_=a,this.createCanvases_(),this.isUsingExcanvas_&&this.createIEPanOverlay_(),this.createZoomHandles_(),this.initInteraction_()};DygraphRangeSelector.prototype.addToGraph=function(a,b){this.layout_=b,this.resize_(),a.appendChild(this.bgcanvas_),a.appendChild(this.fgcanvas_),a.appendChild(this.leftZoomHandle_),a.appendChild(this.rightZoomHandle_)},DygraphRangeSelector.prototype.renderStaticLayer=function(){this.resize_(),this.drawStaticLayer_()},DygraphRangeSelector.prototype.renderInteractiveLayer=function(){if(this.isChangingRange_)return;this.placeZoomHandles_(),this.drawInteractiveLayer_()},DygraphRangeSelector.prototype.resize_=function(){function a(a,b){a.style.top=b.y+"px",a.style.left=b.x+"px",a.width=b.w,a.height=b.h,a.style.width=a.width+"px",a.style.height=a.height+"px"}var b=this.layout_.getPlotArea(),c=this.attr_("axisLabelFontSize")+2*this.attr_("axisTickSize");this.canvasRect_={x:b.x,y:b.y+b.h+c+4,w:b.w,h:this.attr_("rangeSelectorHeight")},a(this.bgcanvas_,this.canvasRect_),a(this.fgcanvas_,this.canvasRect_)},DygraphRangeSelector.prototype.attr_=function(a){return this.dygraph_.attr_(a)},DygraphRangeSelector.prototype.createCanvases_=function(){this.bgcanvas_=Dygraph.createCanvas(),this.bgcanvas_.className="dygraph-rangesel-bgcanvas",this.bgcanvas_.style.position="absolute",this.bgcanvas_.style.zIndex=9,this.bgcanvas_ctx_=Dygraph.getContext(this.bgcanvas_),this.fgcanvas_=Dygraph.createCanvas(),this.fgcanvas_.className="dygraph-rangesel-fgcanvas",this.fgcanvas_.style.position="absolute",this.fgcanvas_.style.zIndex=9,this.fgcanvas_.style.cursor="default",this.fgcanvas_ctx_=Dygraph.getContext(this.fgcanvas_)},DygraphRangeSelector.prototype.createIEPanOverlay_=function(){this.iePanOverlay_=document.createElement("div"),this.iePanOverlay_.style.position="absolute",this.iePanOverlay_.style.backgroundColor="white",this.iePanOverlay_.style.filter="alpha(opacity=0)",this.iePanOverlay_.style.display="none",this.iePanOverlay_.style.cursor="move",this.fgcanvas_.appendChild(this.iePanOverlay_)},DygraphRangeSelector.prototype.createZoomHandles_=function(){var a=new Image;a.className="dygraph-rangesel-zoomhandle",a.style.position="absolute",a.style.zIndex=10,a.style.visibility="hidden",a.style.cursor="col-resize",/MSIE 7/.test(navigator.userAgent)?(a.width=7,a.height=14,a.style.backgroundColor="white",a.style.border="1px solid #333333"):(a.width=9,a.height=16,a.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="),this.leftZoomHandle_=a,this.rightZoomHandle_=a.cloneNode(!1)},DygraphRangeSelector.prototype.initInteraction_=function(){var a=this,b=this.isIE_?document:window,c=0,d=null,e=!1,f=!1,g,h,i,j,k,l,m,n,o,p,q;g=function(b){var c=a.dygraph_.xAxisExtremes(),d=(c[1]-c[0])/a.canvasRect_.w,e=c[0]+(b.leftHandlePos-a.canvasRect_.x)*d,f=c[0]+(b.rightHandlePos-a.canvasRect_.x)*d;return[e,f]},h=function(f){Dygraph.cancelEvent(f),e=!0,c=f.screenX,d=f.target?f.target:f.srcElement,Dygraph.addEvent(b,"mousemove",i),Dygraph.addEvent(b,"mouseup",j),a.fgcanvas_.style.cursor="col-resize"},i=function(b){if(!e)return;var f=b.screenX-c;if(Math.abs(f)<4)return;c=b.screenX;var g=a.getZoomHandleStatus_(),h;d==a.leftZoomHandle_?(h=g.leftHandlePos+f,h=Math.min(h,g.rightHandlePos-d.width-3),h=Math.max(h,a.canvasRect_.x)):(h=g.rightHandlePos+f,h=Math.min(h,a.canvasRect_.x+a.canvasRect_.w),h=Math.max(h,g.leftHandlePos+d.width+3));var i=d.width/2;d.style.left=h-i+"px",a.drawInteractiveLayer_(),a.isUsingExcanvas_||k()},j=function(c){if(!e)return;e=!1,Dygraph.removeEvent(b,"mousemove",i),Dygraph.removeEvent(b,"mouseup",j),a.fgcanvas_.style.cursor="default",a.isUsingExcanvas_&&k()},k=function(){try{var b=a.getZoomHandleStatus_();a.isChangingRange_=!0;if(!b.isZoomed)a.dygraph_.doUnzoom_();else{var c=g(b);a.dygraph_.doZoomXDates_(c[0],c[1])}}finally{a.isChangingRange_=!1}},l=function(b){if(a.isUsingExcanvas_)return b.srcElement==a.iePanOverlay_;var c;b.offsetX!=undefined?c=a.canvasRect_.x+b.offsetX:c=b.clientX;var d=a.getZoomHandleStatus_();return c>d.leftHandlePos&&c<d.rightHandlePos},m=function(d){!f&&l(d)&&a.getZoomHandleStatus_().isZoomed&&(Dygraph.cancelEvent(d),f=!0,c=d.screenX,Dygraph.addEvent(b,"mousemove",n),Dygraph.addEvent(b,"mouseup",o))},n=function(b){if(!f)return;Dygraph.cancelEvent(b);var d=b.screenX-c;if(Math.abs(d)<4)return;c=b.screenX;var e=a.getZoomHandleStatus_(),g=e.leftHandlePos,h=e.rightHandlePos,i=h-g;g+d<=a.canvasRect_.x?(g=a.canvasRect_.x,h=g+i):h+d>=a.canvasRect_.x+a.canvasRect_.w?(h=a.canvasRect_.x+a.canvasRect_.w,g=h-i):(g+=d,h+=d);var j=a.leftZoomHandle_.width/2;a.leftZoomHandle_.style.left=g-j+"px",a.rightZoomHandle_.style.left=h-j+"px",a.drawInteractiveLayer_(),a.isUsingExcanvas_||p()},o=function(c){if(!f)return;f=!1,Dygraph.removeEvent(b,"mousemove",n),Dygraph.removeEvent(b,"mouseup",o),a.isUsingExcanvas_&&p()},p=function(){try{a.isChangingRange_=!0,a.dygraph_.dateWindow_=g(a.getZoomHandleStatus_()),a.dygraph_.drawGraph_(!1)}finally{a.isChangingRange_=!1}},q=function(b){if(e||f)return;var c=l(b)?"move":"default";c!=a.fgcanvas_.style.cursor&&(a.fgcanvas_.style.cursor=c)},this.dygraph_.attrs_.interactionModel=Dygraph.Interaction.dragIsPanInteractionModel,this.dygraph_.attrs_.panEdgeFraction=1e-4;var r=window.opera?"mousedown":"dragstart";Dygraph.addEvent(this.leftZoomHandle_,r,h),Dygraph.addEvent(this.rightZoomHandle_,r,h),this.isUsingExcanvas_?Dygraph.addEvent(this.iePanOverlay_,"mousedown",m):(Dygraph.addEvent(this.fgcanvas_,"mousedown",m),Dygraph.addEvent(this.fgcanvas_,"mousemove",q))},DygraphRangeSelector.prototype.drawStaticLayer_=function(){var a=this.bgcanvas_ctx_;a.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);try{this.drawMiniPlot_()}catch(b){Dygraph.warn(b)}var c=.5;this.bgcanvas_ctx_.lineWidth=1,a.strokeStyle="gray",a.beginPath(),a.moveTo(c,c),a.lineTo(c,this.canvasRect_.h-c),a.lineTo(this.canvasRect_.w-c,this.canvasRect_.h-c),a.lineTo(this.canvasRect_.w-c,c),a.stroke()},DygraphRangeSelector.prototype.drawMiniPlot_=function(){var a=this.attr_("rangeSelectorPlotFillColor"),b=this.attr_("rangeSelectorPlotStrokeColor");if(!a&&!b)return;var c=this.computeCombinedSeriesAndLimits_(),d=c.yMax-c.yMin,e=this.bgcanvas_ctx_,f=.5,g=this.dygraph_.xAxisExtremes(),h=Math.max(g[1]-g[0],1e-30),i=(this.canvasRect_.w-f)/h,j=(this.canvasRect_.h-f)/d,k=this.canvasRect_.w-f,l=this.canvasRect_.h-f;e.beginPath(),e.moveTo(f,l);for(var m=0;m<c.data.length;m++){var n=c.data[m],o=(n[0]-g[0])*i,p=l-(n[1]-c.yMin)*j;isFinite(o)&&isFinite(p)&&e.lineTo(o,p)}e.lineTo(k,l),e.closePath();if(a){var q=this.bgcanvas_ctx_.createLinearGradient(0,0,0,l);q.addColorStop(0,"white"),q.addColorStop(1,a),this.bgcanvas_ctx_.fillStyle=q,e.fill()}b&&(this.bgcanvas_ctx_.strokeStyle=b,this.bgcanvas_ctx_.lineWidth=1.5,e.stroke())},DygraphRangeSelector.prototype.computeCombinedSeriesAndLimits_=function(){var a=this.dygraph_.rawData_,b=this.attr_("logscale"),c=[],d,e,f,g,h,i,j,k;for(i=0;i<a.length;i++)if(a[i].length>1&&a[i][1]!=null){h=typeof a[i][1]!="number";if(h){d=[],e=[];for(k=0;k<a[i][1].length;k++)d.push(0),e.push(0)}break}for(i=0;i<a.length;i++){var l=a[i],m=l[0];if(h)for(k=0;k<d.length;k++)d[k]=e[k]=0;else d=e=0;for(j=1;j<l.length;j++)if(this.dygraph_.visibility()[j-1])if(h)for(k=0;k<d.length;k++){g=l[j][k];if(g===null||isNaN(g))continue;d[k]+=g,e[k]++}else{g=l[j];if(g===null||isNaN(g))continue;d+=g,e++}if(h){for(k=0;k<d.length;k++)d[k]/=e[k];f=d.slice(0)}else f=d/e;c.push([m,f])}c=this.dygraph_.rollingAverage(c,this.dygraph_.rollPeriod_);if(typeof c[0][1]!="number")for(i=0;i<c.length;i++)f=c[i][1],c[i][1]=f[0];var n=Number.MAX_VALUE,o=-Number.MAX_VALUE;for(i=0;i<c.length;i++)f=c[i][1],f!==null&&isFinite(f)&&(!b||f>0)&&(n=Math.min(n,f),o=Math.max(o,f));var p=.25;if(b){o=Dygraph.log10(o),o+=o*p,n=Dygraph.log10(n);for(i=0;i<c.length;i++)c[i][1]=Dygraph.log10(c[i][1])}else{var q,r=o-n;r<=Number.MIN_VALUE?q=o*p:q=r*p,o+=q,n-=q}return{data:c,yMin:n,yMax:o}},DygraphRangeSelector.prototype.placeZoomHandles_=function(){var a=this.dygraph_.xAxisExtremes(),b=this.dygraph_.xAxisRange(),c=a[1]-a[0],d=Math.max(0,(b[0]-a[0])/c),e=Math.max(0,(a[1]-b[1])/c),f=this.canvasRect_.x+this.canvasRect_.w*d,g=this.canvasRect_.x+this.canvasRect_.w*(1-e),h=Math.max(this.canvasRect_.y,this.canvasRect_.y+(this.canvasRect_.h-this.leftZoomHandle_.height)/2),i=this.leftZoomHandle_.width/2;this.leftZoomHandle_.style.left=f-i+"px",this.leftZoomHandle_.style.top=h+"px",this.rightZoomHandle_.style.left=g-i+"px",this.rightZoomHandle_.style.top=this.leftZoomHandle_.style.top,this.leftZoomHandle_.style.visibility="visible",this.rightZoomHandle_.style.visibility="visible"},DygraphRangeSelector.prototype.drawInteractiveLayer_=function(){var a=this.fgcanvas_ctx_;a.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);var b=1,c=this.canvasRect_.w-b,d=this.canvasRect_.h-b,e=this.getZoomHandleStatus_();a.strokeStyle="black";if(!e.isZoomed)a.beginPath(),a.moveTo(b,b),a.lineTo(b,d),a.lineTo(c,d),a.lineTo(c,b),a.stroke(),this.iePanOverlay_&&(this.iePanOverlay_.style.display="none");else{var f=Math.max(b,e.leftHandlePos-this.canvasRect_.x),g=Math.min(c,e.rightHandlePos-this.canvasRect_.x);a.fillStyle="rgba(240, 240, 240, 0.6)",a.fillRect(0,0,f,this.canvasRect_.h),a.fillRect(g,0,this.canvasRect_.w-g,this.canvasRect_.h),a.beginPath(),a.moveTo(b,b),a.lineTo(f,b),a.lineTo(f,d),a.lineTo(g,d),a.lineTo(g,b),a.lineTo(c,b),a.stroke(),this.isUsingExcanvas_&&(this.iePanOverlay_.style.width=g-f+"px",this.iePanOverlay_.style.left=f+"px",this.iePanOverlay_.style.height=d+"px",this.iePanOverlay_.style.display="inline")}},DygraphRangeSelector.prototype.getZoomHandleStatus_=function(){var a=this.leftZoomHandle_.width/2,b=parseInt(this.leftZoomHandle_.style.left,10)+a,c=parseInt(this.rightZoomHandle_.style.left,10)+a;return{leftHandlePos:b,rightHandlePos:c,isZoomed:b-1>this.canvasRect_.x||c+1<this.canvasRect_.x+this.canvasRect_.w}},"use strict",Dygraph.numericLinearTicks=function(a,b,c,d,e,f){var g=function(a){return a==="logscale"?!1:d(a)};return Dygraph.numericTicks(a,b,c,g,e,f)},Dygraph.numericTicks=function(a,b,c,d,e,f){var g=d("pixelsPerLabel"),h=[],i,j,k,l;if(f)for(i=0;i<f.length;i++)h.push({v:f[i]});else{if(d("logscale")){l=Math.floor(c/g);var m=Dygraph.binarySearch(a,Dygraph.PREFERRED_LOG_TICK_VALUES,1),n=Dygraph.binarySearch(b,Dygraph.PREFERRED_LOG_TICK_VALUES,-1);m==-1&&(m=0),n==-1&&(n=Dygraph.PREFERRED_LOG_TICK_VALUES.length-1);var o=null;if(n-m>=l/4){for(var p=n;p>=m;p--){var q=Dygraph.PREFERRED_LOG_TICK_VALUES[p],r=Math.log(q/a)/Math.log(b/a)*c,s={v:q};o===null?o={tickValue:q,pixel_coord:r}:Math.abs(r-o.pixel_coord)>=g?o={tickValue:q,pixel_coord:r}:s.label="",h.push(s)}h.reverse()}}if(h.length===0){var t=d("labelsKMG2"),u;t?u=[1,2,4,8]:u=[1,2,5];var v,w,x;for(i=-10;i<50;i++){var y;t?y=Math.pow(16,i):y=Math.pow(10,
+i);var z=0;for(j=0;j<u.length;j++){v=y*u[j],w=Math.floor(a/v)*v,x=Math.ceil(b/v)*v,l=Math.abs(x-w)/v,z=c/l;if(z>g)break}if(z>g)break}w>x&&(v*=-1);for(i=0;i<l;i++)k=w+i*v,h.push({v:k})}}var A,B=[];d("labelsKMB")&&(A=1e3,B=["K","M","B","T","Q"]),d("labelsKMG2")&&(A&&Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!"),A=1024,B=["k","M","G","T","P","E"]);var C=d("axisLabelFormatter");for(i=0;i<h.length;i++){if(h[i].label!==undefined)continue;k=h[i].v;var D=Math.abs(k),E=C(k,0,d,e);if(B.length>0){var F=Math.pow(A,B.length);for(j=B.length-1;j>=0;j--,F/=A)if(D>=F){E=Dygraph.round_(k/F,d("digitsAfterDecimal"))+B[j];break}}h[i].label=E}return h},Dygraph.dateTicker=function(a,b,c,d,e,f){var g=Dygraph.pickDateTickGranularity(a,b,c,d);return g>=0?Dygraph.getDateAxis(a,b,g,d,e):[]},Dygraph.SECONDLY=0,Dygraph.TWO_SECONDLY=1,Dygraph.FIVE_SECONDLY=2,Dygraph.TEN_SECONDLY=3,Dygraph.THIRTY_SECONDLY=4,Dygraph.MINUTELY=5,Dygraph.TWO_MINUTELY=6,Dygraph.FIVE_MINUTELY=7,Dygraph.TEN_MINUTELY=8,Dygraph.THIRTY_MINUTELY=9,Dygraph.HOURLY=10,Dygraph.TWO_HOURLY=11,Dygraph.SIX_HOURLY=12,Dygraph.DAILY=13,Dygraph.WEEKLY=14,Dygraph.MONTHLY=15,Dygraph.QUARTERLY=16,Dygraph.BIANNUAL=17,Dygraph.ANNUAL=18,Dygraph.DECADAL=19,Dygraph.CENTENNIAL=20,Dygraph.NUM_GRANULARITIES=21,Dygraph.SHORT_SPACINGS=[],Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1e3,Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY]=2e3,Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY]=5e3,Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1e4,Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=3e4,Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=6e4,Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY]=12e4,Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY]=3e5,Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=6e5,Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=18e5,Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=36e5,Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]=72e5,Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]=216e5,Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=864e5,Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=6048e5,Dygraph.PREFERRED_LOG_TICK_VALUES=function(){var a=[];for(var b=-39;b<=39;b++){var c=Math.pow(10,b);for(var d=1;d<=9;d++){var e=c*d;a.push(e)}}return a}(),Dygraph.pickDateTickGranularity=function(a,b,c,d){var e=d("pixelsPerLabel");for(var f=0;f<Dygraph.NUM_GRANULARITIES;f++){var g=Dygraph.numDateTicks(a,b,f);if(c/g>=e)return f}return-1},Dygraph.numDateTicks=function(a,b,c){if(c<Dygraph.MONTHLY){var d=Dygraph.SHORT_SPACINGS[c];return Math.floor(.5+1*(b-a)/d)}var e=1,f=12;c==Dygraph.QUARTERLY&&(f=3),c==Dygraph.BIANNUAL&&(f=2),c==Dygraph.ANNUAL&&(f=1),c==Dygraph.DECADAL&&(f=1,e=10),c==Dygraph.CENTENNIAL&&(f=1,e=100);var g=31557807360,h=1*(b-a)/g;return Math.floor(.5+1*h*f/e)},Dygraph.getDateAxis=function(a,b,c,d,e){var f=d("axisLabelFormatter"),g=[],h;if(c<Dygraph.MONTHLY){var i=Dygraph.SHORT_SPACINGS[c],j=i/1e3,k=new Date(a),l;j<=60?(l=k.getSeconds(),k.setSeconds(l-l%j)):(k.setSeconds(0),j/=60,j<=60?(l=k.getMinutes(),k.setMinutes(l-l%j)):(k.setMinutes(0),j/=60,j<=24?(l=k.getHours(),k.setHours(l-l%j)):(k.setHours(0),j/=24,j==7&&k.setDate(k.getDate()-k.getDay())))),a=k.getTime();for(h=a;h<=b;h+=i)g.push({v:h,label:f(new Date(h),c,d,e)})}else{var m,n=1;c==Dygraph.MONTHLY?m=[0,1,2,3,4,5,6,7,8,9,10,11]:c==Dygraph.QUARTERLY?m=[0,3,6,9]:c==Dygraph.BIANNUAL?m=[0,6]:c==Dygraph.ANNUAL?m=[0]:c==Dygraph.DECADAL?(m=[0],n=10):c==Dygraph.CENTENNIAL?(m=[0],n=100):Dygraph.warn("Span of dates is too long");var o=(new Date(a)).getFullYear(),p=(new Date(b)).getFullYear(),q=Dygraph.zeropad;for(var r=o;r<=p;r++){if(r%n!==0)continue;for(var s=0;s<m.length;s++){var t=r+"/"+q(1+m[s])+"/01";h=Dygraph.dateStrToMillis(t);if(h<a||h>b)continue;g.push({v:h,label:f(new Date(h),c,d,e)})}}}return g},Dygraph.DEFAULT_ATTRS.axes.x.ticker=Dygraph.dateTicker,Dygraph.DEFAULT_ATTRS.axes.y.ticker=Dygraph.numericTicks,Dygraph.DEFAULT_ATTRS.axes.y2.ticker=Dygraph.numericTicks,"use strict",Date.ext={},Date.ext.util={},Date.ext.util.xPad=function(a,b,c){typeof c=="undefined"&&(c=10);for(;parseInt(a,10)<c&&c>1;c/=10)a=b.toString()+a;return a.toString()},Date.prototype.locale="en-GB",document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang&&(Date.prototype.locale=document.getElementsByTagName("html")[0].lang),Date.ext.locales={},Date.ext.locales.en={a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],B:["January","February","March","April","May","June","July","August","September","October","November","December"],c:"%a %d %b %Y %T %Z",p:["AM","PM"],P:["am","pm"],x:"%d/%m/%y",X:"%T"},Date.ext.locales["en-US"]=Date.ext.locales.en,Date.ext.locales["en-US"].c="%a %d %b %Y %r %Z",Date.ext.locales["en-US"].x="%D",Date.ext.locales["en-US"].X="%r",Date.ext.locales["en-GB"]=Date.ext.locales.en,Date.ext.locales["en-AU"]=Date.ext.locales["en-GB"],Date.ext.formats={a:function(a){return Date.ext.locales[a.locale].a[a.getDay()]},A:function(a){return Date.ext.locales[a.locale].A[a.getDay()]},b:function(a){return Date.ext.locales[a.locale].b[a.getMonth()]},B:function(a){return Date.ext.locales[a.locale].B[a.getMonth()]},c:"toLocaleString",C:function(a){return Date.ext.util.xPad(parseInt(a.getFullYear()/100,10),0)},d:["getDate","0"],e:["getDate"," "],g:function(a){return Date.ext.util.xPad(parseInt(Date.ext.util.G(a)/100,10),0)},G:function(a){var b=a.getFullYear(),c=parseInt(Date.ext.formats.V(a),10),d=parseInt(Date.ext.formats.W(a),10);return d>c?b++:d===0&&c>=52&&b--,b},H:["getHours","0"],I:function(a){var b=a.getHours()%12;return Date.ext.util.xPad(b===0?12:b,0)},j:function(a){var b=a-new Date(""+a.getFullYear()+"/1/1 GMT");b+=a.getTimezoneOffset()*6e4;var c=parseInt(b/6e4/60/24,10)+1;return Date.ext.util.xPad(c,0,100)},m:function(a){return Date.ext.util.xPad(a.getMonth()+1,0)},M:["getMinutes","0"],p:function(a){return Date.ext.locales[a.locale].p[a.getHours()>=12?1:0]},P:function(a){return Date.ext.locales[a.locale].P[a.getHours()>=12?1:0]},S:["getSeconds","0"],u:function(a){var b=a.getDay();return b===0?7:b},U:function(a){var b=parseInt(Date.ext.formats.j(a),10),c=6-a.getDay(),d=parseInt((b+c)/7,10);return Date.ext.util.xPad(d,0)},V:function(a){var b=parseInt(Date.ext.formats.W(a),10),c=(new Date(""+a.getFullYear()+"/1/1")).getDay(),d=b+(c>4||c<=1?0:1);return d==53&&(new Date(""+a.getFullYear()+"/12/31")).getDay()<4?d=1:d===0&&(d=Date.ext.formats.V(new Date(""+(a.getFullYear()-1)+"/12/31"))),Date.ext.util.xPad(d,0)},w:"getDay",W:function(a){var b=parseInt(Date.ext.formats.j(a),10),c=7-Date.ext.formats.u(a),d=parseInt((b+c)/7,10);return Date.ext.util.xPad(d,0,10)},y:function(a){return Date.ext.util.xPad(a.getFullYear()%100,0)},Y:"getFullYear",z:function(a){var b=a.getTimezoneOffset(),c=Date.ext.util.xPad(parseInt(Math.abs(b/60),10),0),d=Date.ext.util.xPad(b%60,0);return(b>0?"-":"+")+c+d},Z:function(a){return a.toString().replace(/^.*\(([^)]+)\)$/,"$1")},"%":function(a){return"%"}},Date.ext.aggregates={c:"locale",D:"%m/%d/%y",h:"%b",n:"\n",r:"%I:%M:%S %p",R:"%H:%M",t:" ",T:"%H:%M:%S",x:"locale",X:"locale"},Date.ext.aggregates.z=Date.ext.formats.z(new Date),Date.ext.aggregates.Z=Date.ext.formats.Z(new Date),Date.ext.unsupported={},Date.prototype.strftime=function(a){this.locale in Date.ext.locales||(this.locale.replace(/-[a-zA-Z]+$/,"")in Date.ext.locales?this.locale=this.locale.replace(/-[a-zA-Z]+$/,""):this.locale="en-GB");var b=this;while(a.match(/%[cDhnrRtTxXzZ]/))a=a.replace(/%([cDhnrRtTxXzZ])/g,function(a,c){var e=Date.ext.aggregates[c];return e=="locale"?Date.ext.locales[b.locale][c]:e});var c=a.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g,function(a,c){var e=Date.ext.formats[c];return typeof e=="string"?b[e]():typeof e=="function"?e.call(b,b):typeof e=="object"&&typeof e[0]=="string"?Date.ext.util.xPad(b[e[0]](),e[1]):c});return b=null,c};
\ No newline at end of file