// Old versions of dygraphs took in the series labels as a constructor
// parameter. This doesn't make sense anymore, but it's easy to continue
// to support this usage.
- this.warn("Using deprecated four-argument dygraph constructor");
+ Dygraph.warn("Using deprecated four-argument dygraph constructor");
this.__old_init__(div, data, opts, opt_fourth_param);
} else {
this.__init__(div, data, opts);
};
/**
- * Convert a JS date (millis since epoch) to YYYY/MM/DD
- * @param {Number} date The JavaScript date (ms since epoch)
- * @return {String} A date of the form "YYYY/MM/DD"
+ * @type {!Array.<string>}
* @private
+ * @constant
*/
-Dygraph.dateString_ = function(date) {
- var zeropad = Dygraph.zeropad;
- var d = new Date(date);
+Dygraph.SHORT_MONTH_NAMES_ = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
- // Get the year:
- var year = "" + d.getFullYear();
- // Get a 0 padded month string
- var month = zeropad(d.getMonth() + 1); //months are 0-offset, sigh
- // Get a 0 padded day string
- var day = zeropad(d.getDate());
-
- var ret = "";
- var frac = d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds();
- if (frac) ret = " " + Dygraph.hmsString_(date);
-
- return year + "/" + month + "/" + day + ret;
-};
/**
* Convert a JS date to a string appropriate to display on an axis that
*/
Dygraph.dateAxisFormatter = function(date, granularity) {
if (granularity >= Dygraph.DECADAL) {
- return date.strftime('%Y');
+ return '' + date.getFullYear();
} else if (granularity >= Dygraph.MONTHLY) {
- return date.strftime('%b %y');
+ return Dygraph.SHORT_MONTH_NAMES_[date.getMonth()] + ' ' + date.getFullYear();
} else {
var frac = date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds() + date.getMilliseconds();
if (frac === 0 || granularity >= Dygraph.DAILY) {
- return new Date(date.getTime() + 3600*1000).strftime('%d%b');
+ // e.g. '21Jan' (%d%b)
+ var nd = new Date(date.getTime() + 3600*1000);
+ return Dygraph.zeropad(nd.getDate()) + Dygraph.SHORT_MONTH_NAMES_[nd.getMonth()];
} else {
return Dygraph.hmsString_(date.getTime());
}
Dygraph.prototype.attr_ = function(name, seriesName) {
// <REMOVE_FOR_COMBINED>
if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') {
- this.error('Must include options reference JS for testing');
+ Dygraph.error('Must include options reference JS for testing');
} else if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(name)) {
- this.error('Dygraphs is using property ' + name + ', which has no entry ' +
- 'in the Dygraphs.OPTIONS_REFERENCE listing.');
+ Dygraph.error('Dygraphs is using property ' + name + ', which has no ' +
+ 'entry in the Dygraphs.OPTIONS_REFERENCE listing.');
// Only log this error once.
Dygraph.OPTIONS_REFERENCE[name] = true;
}
return this.attr_(name, opt_seriesName);
};
+/**
+ * Like getOption(), but specifically returns a number.
+ * This is a convenience function for working with the Closure Compiler.
+ * @param {string} name The name of the option (e.g. 'strokeWidth')
+ * @param {string=} opt_seriesName Series name to get per-series values.
+ * @return {number} The value of the option.
+ * @private
+ */
+Dygraph.prototype.getNumericOption = function(name, opt_seriesName) {
+ return /** @type{number} */(this.getOption(name, opt_seriesName));
+};
+
+/**
+ * Like getOption(), but specifically returns a string.
+ * This is a convenience function for working with the Closure Compiler.
+ * @param {string} name The name of the option (e.g. 'strokeWidth')
+ * @param {string=} opt_seriesName Series name to get per-series values.
+ * @return {string} The value of the option.
+ * @private
+ */
+Dygraph.prototype.getStringOption = function(name, opt_seriesName) {
+ return /** @type{string} */(this.getOption(name, opt_seriesName));
+};
+
+/**
+ * Like getOption(), but specifically returns a boolean.
+ * This is a convenience function for working with the Closure Compiler.
+ * @param {string} name The name of the option (e.g. 'strokeWidth')
+ * @param {string=} opt_seriesName Series name to get per-series values.
+ * @return {boolean} The value of the option.
+ * @private
+ */
+Dygraph.prototype.getBooleanOption = function(name, opt_seriesName) {
+ return /** @type{boolean} */(this.getOption(name, opt_seriesName));
+};
+
+/**
+ * Like getOption(), but specifically returns a function.
+ * This is a convenience function for working with the Closure Compiler.
+ * @param {string} name The name of the option (e.g. 'strokeWidth')
+ * @param {string=} opt_seriesName Series name to get per-series values.
+ * @return {function(...)} The value of the option.
+ * @private
+ */
+Dygraph.prototype.getFunctionOption = function(name, opt_seriesName) {
+ return /** @type{function(...)} */(this.getOption(name, opt_seriesName));
+};
+
Dygraph.prototype.getOptionForAxis = function(name, axis) {
return this.attributes_.getForAxis(name, axis);
};
/**
* @private
- * @param String} axis The name of the axis (i.e. 'x', 'y' or 'y2')
+ * @param {string} axis The name of the axis (i.e. 'x', 'y' or 'y2')
* @return { ... } A function mapping string -> option value
*/
Dygraph.prototype.optionsViewForAxis_ = function(axis) {
* data set.
*/
Dygraph.prototype.xAxisExtremes = function() {
- var pad = this.attr_('xRangePad') / this.plotter_.area.w;
+ var pad = this.getNumericOption('xRangePad') / this.plotter_.area.w;
if (this.numRows() === 0) {
return [0 - pad, 1 + pad];
}
this.colorsMap_ = {};
// These are used for when no custom colors are specified.
- var sat = this.attr_('colorSaturation') || 1.0;
- var val = this.attr_('colorValue') || 0.5;
+ var sat = this.getNumericOption('colorSaturation') || 1.0;
+ var val = this.getNumericOption('colorValue') || 0.5;
var half = Math.ceil(num / 2);
- var colors = this.attr_('colors');
+ var colors = this.getOption('colors');
var visibility = this.visibility();
for (var i = 0; i < num; i++) {
if (!visibility[i]) {
this.graphDiv.appendChild(this.roller_);
}
- var display = this.attr_('showRoller') ? 'block' : 'none';
+ var display = this.getBooleanOption('showRoller') ? 'block' : 'none';
var area = this.plotter_.area;
var textAttr = { "position": "absolute",
};
/**
- * @private
- * Converts page the x-coordinate of the event to pixel x-coordinates on the
- * canvas (i.e. DOM Coords).
- */
-Dygraph.prototype.dragGetX_ = function(e, context) {
- return Dygraph.pageX(e) - context.px;
-};
-
-/**
- * @private
- * Converts page the y-coordinate of the event to pixel y-coordinates on the
- * canvas (i.e. DOM Coords).
- */
-Dygraph.prototype.dragGetY_ = function(e, context) {
- return Dygraph.pageY(e) - context.py;
-};
-
-/**
* Set up all the mouse handlers needed to capture dragging behavior for zoom
* events.
* @private
event.cancelBubble = true;
}
- contextB.px = Dygraph.findPosX(g.canvas_);
- contextB.py = Dygraph.findPosY(g.canvas_);
- contextB.dragStartX = g.dragGetX_(event, contextB);
- contextB.dragStartY = g.dragGetY_(event, contextB);
+ var canvasPos = Dygraph.findPos(g.canvas_);
+ contextB.px = canvasPos.x;
+ contextB.py = canvasPos.y;
+ contextB.dragStartX = Dygraph.dragGetX_(event, contextB);
+ contextB.dragStartY = Dygraph.dragGetY_(event, contextB);
contextB.cancelNextDblclick = false;
contextB.tarp.cover();
}
};
- var interactionModel = this.attr_("interactionModel");
+ var interactionModel = this.getOption("interactionModel");
// Self is the graph.
var self = this;
this.zoomed_x_ = true;
var that = this;
this.doAnimatedZoom(old_window, new_window, null, null, function() {
- if (that.attr_("zoomCallback")) {
- that.attr_("zoomCallback")(minDate, maxDate, that.yAxisRanges());
+ if (that.getFunctionOption("zoomCallback")) {
+ that.getFunctionOption("zoomCallback")(
+ minDate, maxDate, that.yAxisRanges());
}
});
};
this.zoomed_y_ = true;
var that = this;
this.doAnimatedZoom(null, null, oldValueRanges, newValueRanges, function() {
- if (that.attr_("zoomCallback")) {
+ if (that.getFunctionOption("zoomCallback")) {
var xRange = that.xAxisRange();
- that.attr_("zoomCallback")(xRange[0], xRange[1], that.yAxisRanges());
+ that.getFunctionOption("zoomCallback")(
+ xRange[0], xRange[1], that.yAxisRanges());
}
});
};
// With only one frame, don't bother calculating extreme ranges.
// TODO(danvk): merge this block w/ the code below.
- if (!this.attr_("animatedZooms")) {
+ if (!this.getBooleanOption("animatedZooms")) {
this.dateWindow_ = null;
for (i = 0; i < this.axes_.length; i++) {
if (this.axes_[i].valueWindow !== null) {
}
}
this.drawGraph_();
- if (this.attr_("zoomCallback")) {
- this.attr_("zoomCallback")(minDate, maxDate, this.yAxisRanges());
+ if (this.getFunctionOption("zoomCallback")) {
+ this.getFunctionOption("zoomCallback")(
+ minDate, maxDate, this.yAxisRanges());
}
return;
}
delete that.axes_[i].valueWindow;
}
}
- if (that.attr_("zoomCallback")) {
- that.attr_("zoomCallback")(minDate, maxDate, that.yAxisRanges());
+ if (that.getFunctionOption("zoomCallback")) {
+ that.getFunctionOption("zoomCallback")(
+ minDate, maxDate, that.yAxisRanges());
}
});
}
* @private
*/
Dygraph.prototype.doAnimatedZoom = function(oldXRange, newXRange, oldYRanges, newYRanges, callback) {
- var steps = this.attr_("animatedZooms") ? Dygraph.ANIMATION_STEPS : 1;
+ var steps = this.getBooleanOption("animatedZooms") ?
+ Dygraph.ANIMATION_STEPS : 1;
var windows = [];
var valueRanges = [];
if (event.offsetX && event.offsetY) {
return [ event.offsetX, event.offsetY ];
} else {
- var canvasx = Dygraph.pageX(event) - Dygraph.findPosX(this.mouseEventElement_);
- var canvasy = Dygraph.pageY(event) - Dygraph.findPosY(this.mouseEventElement_);
+ var eventElementPos = Dygraph.findPos(this.mouseEventElement_);
+ var canvasx = Dygraph.pageX(event) - eventElementPos.x;
+ var canvasy = Dygraph.pageY(event) - eventElementPos.y;
return [canvasx, canvasy];
}
};
var canvasx = canvasCoords[0];
var canvasy = canvasCoords[1];
- var highlightSeriesOpts = this.attr_("highlightSeriesOpts");
+ var highlightSeriesOpts = this.getOption("highlightSeriesOpts");
var selectionChanged = false;
if (highlightSeriesOpts && !this.isSeriesLocked()) {
var closest;
- if (this.attr_("stackedGraph")) {
+ if (this.getBooleanOption("stackedGraph")) {
closest = this.findStackedPoint(canvasx, canvasy);
} else {
closest = this.findClosestPoint(canvasx, canvasy);
selectionChanged = this.setSelection(idx);
}
- var callback = this.attr_("highlightCallback");
+ var callback = this.getFunctionOption("highlightCallback");
if (callback && selectionChanged) {
callback(event,
this.lastx_,
// Clear the previously drawn vertical, if there is one
var i;
var ctx = this.canvas_ctx_;
- if (this.attr_('highlightSeriesOpts')) {
+ if (this.getOption('highlightSeriesOpts')) {
ctx.clearRect(0, 0, this.width_, this.height_);
- var alpha = 1.0 - this.attr_('highlightSeriesBackgroundAlpha');
+ var alpha = 1.0 - this.getNumericOption('highlightSeriesBackgroundAlpha');
if (alpha) {
// Activating background fade includes an animation effect for a gradual
// fade. TODO(klausw): make this independently configurable if it causes
var maxCircleSize = 0;
var labels = this.attr_('labels');
for (i = 1; i < labels.length; i++) {
- var r = this.attr_('highlightCircleSize', labels[i]);
+ var r = this.getNumericOption('highlightCircleSize', labels[i]);
if (r > maxCircleSize) maxCircleSize = r;
}
var px = this.previousVerticalX_;
var pt = this.selPoints_[i];
if (!Dygraph.isOK(pt.canvasy)) continue;
- var circleSize = this.attr_('highlightCircleSize', pt.name);
- var callback = this.attr_("drawHighlightPointCallback", pt.name);
+ var circleSize = this.getNumericOption('highlightCircleSize', pt.name);
+ var callback = this.getFunctionOption("drawHighlightPointCallback", pt.name);
var color = this.plotter_.colors[pt.name];
if (!callback) {
callback = Dygraph.Circles.DEFAULT;
}
- ctx.lineWidth = this.attr_('strokeWidth', pt.name);
+ ctx.lineWidth = this.getNumericOption('strokeWidth', pt.name);
ctx.strokeStyle = color;
ctx.fillStyle = color;
callback(this.g, pt.name, ctx, canvasx, pt.canvasy,
* @private
*/
Dygraph.prototype.mouseOut_ = function(event) {
- if (this.attr_("unhighlightCallback")) {
- this.attr_("unhighlightCallback")(event);
+ if (this.getFunctionOption("unhighlightCallback")) {
+ this.getFunctionOption("unhighlightCallback")(event);
}
- if (this.attr_("hideOverlayOnMouseOut") && !this.lockedSet_) {
+ if (this.getFunctionOption("hideOverlayOnMouseOut") && !this.lockedSet_) {
this.clearSelection();
}
};
if (this.attr_('dataHandler')) {
handlerClass = this.attr_('dataHandler');
} else if (this.fractions_) {
- if (this.attr_('errorBars')) {
+ if (this.getBooleanOption('errorBars')) {
handlerClass = Dygraph.DataHandlers.FractionsBarsHandler;
} else {
handlerClass = Dygraph.DataHandlers.DefaultFractionHandler;
}
- } else if (this.attr_('customBars')) {
+ } else if (this.getBooleanOption('customBars')) {
handlerClass = Dygraph.DataHandlers.CustomBarsHandler;
- } else if (this.attr_('errorBars')) {
+ } else if (this.getBooleanOption('errorBars')) {
handlerClass = Dygraph.DataHandlers.ErrorBarsHandler;
} else {
handlerClass = Dygraph.DataHandlers.DefaultHandler;
var seriesName = this.attr_("labels")[seriesIdx];
var seriesExtremes = this.dataHandler_.getExtremeYValues(series,
- dateWindow, this.attr_("stepPlot",seriesName));
+ dateWindow, this.getBooleanOption("stepPlot",seriesName));
var seriesPoints = this.dataHandler_.seriesToPoints(series,
seriesName, boundaryIds[seriesIdx-1][0]);
- if (this.attr_("stackedGraph")) {
+ if (this.getBooleanOption("stackedGraph")) {
Dygraph.stackPoints_(seriesPoints, cumulativeYval, seriesExtremes,
- this.attr_("stackedGraphNaNFill"));
+ this.getBooleanOption("stackedGraphNaNFill"));
}
extremes[seriesName] = seriesExtremes;
this.layout_.removeAllDatasets();
this.setColors_();
- this.attrs_.pointSize = 0.5 * this.attr_('highlightCircleSize');
+ this.attrs_.pointSize = 0.5 * this.getNumericOption('highlightCircleSize');
var packed = this.gatherDatasets_(this.rolledSeries_, this.dateWindow_);
var points = packed.points;
this.layout_.evaluate();
this.renderGraph_(is_initial_draw);
- if (this.attr_("timingName")) {
+ if (this.getStringOption("timingName")) {
var end = new Date();
- Dygraph.info(this.attr_("timingName") + " - drawGraph: " + (end - start) + "ms");
+ Dygraph.info(this.getStringOption("timingName") + " - drawGraph: " + (end - start) + "ms");
}
};
this.cascadeEvents_('clearChart');
this.plotter_.clear();
- if (this.attr_('underlayCallback')) {
+ if (this.getFunctionOption('underlayCallback')) {
// NOTE: we pass the dygraph object to this callback twice to avoid breaking
// users who expect a deprecated form of this callback.
- this.attr_('underlayCallback')(
+ this.getFunctionOption('underlayCallback')(
this.hidden_ctx_, this.layout_.getPlotArea(), this, this);
}
this.canvas_.getContext('2d').clearRect(0, 0, this.canvas_.width,
this.canvas_.height);
- if (this.attr_("drawCallback") !== null) {
- this.attr_("drawCallback")(this, is_initial_draw);
+ if (this.getFunctionOption("drawCallback") !== null) {
+ this.getFunctionOption("drawCallback")(this, is_initial_draw);
}
if (is_initial_draw) {
this.readyFired_ = true;
//
ypadCompat = true;
ypad = 0.1; // add 10%
- if (this.attr_('yRangePad') !== null) {
+ if (this.getNumericOption('yRangePad') !== null) {
ypadCompat = false;
// Convert pixel padding to ratio
- ypad = this.attr_('yRangePad') / this.plotter_.area.h;
+ ypad = this.getNumericOption('yRangePad') / this.plotter_.area.h;
}
if (series.length === 0) {
// Backwards-compatible behavior: Move the span to start or end at zero if it's
// close to zero, but not if avoidMinZero is set.
- if (ypadCompat && !this.attr_("avoidMinZero")) {
+ if (ypadCompat && !this.getBooleanOption("avoidMinZero")) {
if (minAxisY < 0 && minY >= 0) minAxisY = 0;
if (maxAxisY > 0 && maxY <= 0) maxAxisY = 0;
}
};
/**
- * Parses the value as a floating point number. This is like the parseFloat()
- * built-in, but with a few differences:
- * - the empty string is parsed as null, rather than NaN.
- * - if the string cannot be parsed at all, an error is logged.
- * If the string can't be parsed, this method returns null.
- * @param {String} x The string to be parsed
- * @param {Number} opt_line_no The line number from which the string comes.
- * @param {String} opt_line The text of the line from which the string comes.
- * @private
- */
-
-// Parse the x as a float or return null if it's not a number.
-Dygraph.prototype.parseFloat_ = function(x, opt_line_no, opt_line) {
- var val = parseFloat(x);
- if (!isNaN(val)) return val;
-
- // Try to figure out what happeend.
- // If the value is the empty string, parse it as null.
- if (/^ *$/.test(x)) return null;
-
- // If it was actually "NaN", return it as NaN.
- if (/^ *nan *$/i.test(x)) return NaN;
-
- // Looks like a parsing error.
- var msg = "Unable to parse '" + x + "' as a number";
- if (opt_line !== null && opt_line_no !== null) {
- msg += " on line " + (1+opt_line_no) + " ('" + opt_line + "') of CSV.";
- }
- this.error(msg);
-
- return null;
-};
-
-/**
* @private
* Parses a string in a special csv format. We expect a csv file where each
* line is a date point, and the first field in each line is the date string.
var vals, j;
// Use the default delimiter or fall back to a tab if that makes sense.
- var delim = this.attr_('delimiter');
+ var delim = this.getStringOption('delimiter');
if (lines[0].indexOf(delim) == -1 && lines[0].indexOf('\t') >= 0) {
delim = '\t';
}
var fields = [];
if (!defaultParserSet) {
this.detectTypeFromString_(inFields[0]);
- xParser = this.attr_("xValueParser");
+ xParser = this.getFunctionOption("xValueParser");
defaultParserSet = true;
}
fields[0] = xParser(inFields[0], this);
// TODO(danvk): figure out an appropriate way to flag parse errors.
vals = inFields[j].split("/");
if (vals.length != 2) {
- this.error('Expected fractional "num/den" values in CSV data ' +
- "but found a value '" + inFields[j] + "' on line " +
- (1 + i) + " ('" + line + "') which is not of this form.");
+ Dygraph.error('Expected fractional "num/den" values in CSV data ' +
+ "but found a value '" + inFields[j] + "' on line " +
+ (1 + i) + " ('" + line + "') which is not of this form.");
fields[j] = [0, 0];
} else {
- fields[j] = [this.parseFloat_(vals[0], i, line),
- this.parseFloat_(vals[1], i, line)];
+ fields[j] = [Dygraph.parseFloat_(vals[0], i, line),
+ Dygraph.parseFloat_(vals[1], i, line)];
}
}
- } else if (this.attr_("errorBars")) {
+ } else if (this.getBooleanOption("errorBars")) {
// If there are error bars, values are (value, stddev) pairs
if (inFields.length % 2 != 1) {
- this.error('Expected alternating (value, stdev.) pairs in CSV data ' +
- 'but line ' + (1 + i) + ' has an odd number of values (' +
- (inFields.length - 1) + "): '" + line + "'");
+ Dygraph.error('Expected alternating (value, stdev.) pairs in CSV data ' +
+ 'but line ' + (1 + i) + ' has an odd number of values (' +
+ (inFields.length - 1) + "): '" + line + "'");
}
for (j = 1; j < inFields.length; j += 2) {
- fields[(j + 1) / 2] = [this.parseFloat_(inFields[j], i, line),
- this.parseFloat_(inFields[j + 1], i, line)];
+ fields[(j + 1) / 2] = [Dygraph.parseFloat_(inFields[j], i, line),
+ Dygraph.parseFloat_(inFields[j + 1], i, line)];
}
- } else if (this.attr_("customBars")) {
+ } else if (this.getBooleanOption("customBars")) {
// Bars are a low;center;high tuple
for (j = 1; j < inFields.length; j++) {
var val = inFields[j];
} else {
vals = val.split(";");
if (vals.length == 3) {
- fields[j] = [ this.parseFloat_(vals[0], i, line),
- this.parseFloat_(vals[1], i, line),
- this.parseFloat_(vals[2], i, line) ];
+ fields[j] = [ Dygraph.parseFloat_(vals[0], i, line),
+ Dygraph.parseFloat_(vals[1], i, line),
+ Dygraph.parseFloat_(vals[2], i, line) ];
} else {
- this.warn('When using customBars, values must be either blank ' +
- 'or "low;center;high" tuples (got "' + val +
- '" on line ' + (1+i));
+ Dygraph.warn('When using customBars, values must be either blank ' +
+ 'or "low;center;high" tuples (got "' + val +
+ '" on line ' + (1+i));
}
}
}
} else {
// Values are just numbers
for (j = 1; j < inFields.length; j++) {
- fields[j] = this.parseFloat_(inFields[j], i, line);
+ fields[j] = Dygraph.parseFloat_(inFields[j], i, line);
}
}
if (ret.length > 0 && fields[0] < ret[ret.length - 1][0]) {
}
if (fields.length != expectedCols) {
- this.error("Number of columns in line " + i + " (" + fields.length +
- ") does not agree with number of labels (" + expectedCols +
- ") " + line);
+ Dygraph.error("Number of columns in line " + i + " (" + fields.length +
+ ") does not agree with number of labels (" + expectedCols +
+ ") " + line);
}
// If the user specified the 'labels' option and none of the cells of the
if (fields[j]) all_null = false;
}
if (all_null) {
- this.warn("The dygraphs 'labels' option is set, but the first row of " +
- "CSV data ('" + line + "') appears to also contain labels. " +
- "Will drop the CSV labels and use the option labels.");
+ Dygraph.warn("The dygraphs 'labels' option is set, but the first row " +
+ "of CSV data ('" + line + "') appears to also contain " +
+ "labels. Will drop the CSV labels and use the option " +
+ "labels.");
continue;
}
}
}
if (outOfOrder) {
- this.warn("CSV is out of order; order it correctly to speed loading.");
+ Dygraph.warn("CSV is out of order; order it correctly to speed loading.");
ret.sort(function(a,b) { return a[0] - b[0]; });
}
Dygraph.prototype.parseArray_ = function(data) {
// Peek at the first x value to see if it's numeric.
if (data.length === 0) {
- this.error("Can't plot empty data set");
+ Dygraph.error("Can't plot empty data set");
return null;
}
if (data[0].length === 0) {
- this.error("Data set cannot contain an empty row");
+ Dygraph.error("Data set cannot contain an empty row");
return null;
}
var i;
if (this.attr_("labels") === null) {
- this.warn("Using default labels. Set labels explicitly via 'labels' " +
- "in the options parameter");
+ Dygraph.warn("Using default labels. Set labels explicitly via 'labels' " +
+ "in the options parameter");
this.attrs_.labels = [ "X" ];
for (i = 1; i < data[0].length; i++) {
this.attrs_.labels.push("Y" + i); // Not user_attrs_.
} else {
var num_labels = this.attr_("labels");
if (num_labels.length != data[0].length) {
- this.error("Mismatch between number of labels (" + num_labels +
- ") and number of columns in array (" + data[0].length + ")");
+ Dygraph.error("Mismatch between number of labels (" + num_labels + ")" +
+ " and number of columns in array (" + data[0].length + ")");
return null;
}
}
var parsedData = Dygraph.clone(data);
for (i = 0; i < data.length; i++) {
if (parsedData[i].length === 0) {
- this.error("Row " + (1 + i) + " of data is empty");
+ Dygraph.error("Row " + (1 + i) + " of data is empty");
return null;
}
if (parsedData[i][0] === null ||
typeof(parsedData[i][0].getTime) != 'function' ||
isNaN(parsedData[i][0].getTime())) {
- this.error("x value in row " + (1 + i) + " is not a Date");
+ Dygraph.error("x value in row " + (1 + i) + " is not a Date");
return null;
}
parsedData[i][0] = parsedData[i][0].getTime();
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 " +
- "column 1 of DataTable input (Got '" + indepType + "')");
+ Dygraph.error("only 'date', 'datetime' and 'number' types are supported " +
+ "for column 1 of DataTable input (Got '" + indepType + "')");
return null;
}
var type = data.getColumnType(i);
if (type == 'number') {
colIdx.push(i);
- } else if (type == 'string' && this.attr_('displayAnnotations')) {
+ } else if (type == 'string' && this.getBooleanOption('displayAnnotations')) {
// This is OK -- it's an annotation column.
var dataIdx = colIdx[colIdx.length - 1];
if (!annotationCols.hasOwnProperty(dataIdx)) {
}
hasAnnotations = true;
} else {
- this.error("Only 'number' is supported as a dependent type with Gviz." +
- " 'string' is only supported if displayAnnotations is true");
+ Dygraph.error("Only 'number' is supported as a dependent type with Gviz." +
+ " 'string' is only supported if displayAnnotations is true");
}
}
var labels = [data.getColumnLabel(0)];
for (i = 0; i < colIdx.length; i++) {
labels.push(data.getColumnLabel(colIdx[i]));
- if (this.attr_("errorBars")) i += 1;
+ if (this.getBooleanOption("errorBars")) i += 1;
}
this.attrs_.labels = labels;
cols = labels.length;
var row = [];
if (typeof(data.getValue(i, 0)) === 'undefined' ||
data.getValue(i, 0) === null) {
- this.warn("Ignoring row " + i +
- " of DataTable because of undefined or null first column.");
+ Dygraph.warn("Ignoring row " + i +
+ " of DataTable because of undefined or null first column.");
continue;
}
} else {
row.push(data.getValue(i, 0));
}
- if (!this.attr_("errorBars")) {
+ if (!this.getBooleanOption("errorBars")) {
for (j = 0; j < colIdx.length; j++) {
var col = colIdx[j];
row.push(data.getValue(i, col));
}
if (outOfOrder) {
- this.warn("DataTable is out of order; order it correctly to speed loading.");
+ Dygraph.warn("DataTable is out of order; order it correctly to speed loading.");
ret.sort(function(a,b) { return a[0] - b[0]; });
}
this.rawData_ = ret;
req.send(null);
}
} else {
- this.error("Unknown data format: " + (typeof data));
+ Dygraph.error("Unknown data format: " + (typeof data));
}
};
this.resize_lock = true;
if ((width === null) != (height === null)) {
- this.warn("Dygraph.resize() should be called with zero parameters or " +
- "two non-NULL parameters. Pretending it was zero.");
+ Dygraph.warn("Dygraph.resize() should be called with zero parameters or " +
+ "two non-NULL parameters. Pretending it was zero.");
width = height = null;
}
Dygraph.prototype.visibility = function() {
// Do lazy-initialization, so that this happens after we know the number of
// data series.
- if (!this.attr_("visibility")) {
+ if (!this.getOption("visibility")) {
this.attrs_.visibility = [];
}
// TODO(danvk): it looks like this could go into an infinite loop w/ user_attrs.
- while (this.attr_("visibility").length < this.numColumns() - 1) {
+ while (this.getOption("visibility").length < this.numColumns() - 1) {
this.attrs_.visibility.push(true);
}
- return this.attr_("visibility");
+ return this.getOption("visibility");
};
/**
* Changes the visiblity of a series.
+ *
+ * @param {number} num the series index
+ * @param {boolean} value true or false, identifying the visibility.
*/
Dygraph.prototype.setVisibility = function(num, value) {
var x = this.visibility();
if (num < 0 || num >= x.length) {
- this.warn("invalid series number in setVisibility: " + num);
+ Dygraph.warn("invalid series number in setVisibility: " + num);
} else {
x[num] = value;
this.predraw_();
Dygraph.addAnnotationRule();
this.annotations_ = ann;
if (!this.layout_) {
- this.warn("Tried to setAnnotations before dygraph was ready. " +
- "Try setting them in a ready() block. See " +
- "dygraphs.com/tests/annotation.html");
+ Dygraph.warn("Tried to setAnnotations before dygraph was ready. " +
+ "Try setting them in a ready() block. See " +
+ "dygraphs.com/tests/annotation.html");
return;
}
}
}
- this.warn("Unable to add default annotation CSS rule; display may be off.");
+ Dygraph.warn("Unable to add default annotation CSS rule; display may be off.");
};