*/
-/*jshint globalstrict: true */
+// For "production" code, this gets set to false by uglifyjs.
+if (typeof(DEBUG) === 'undefined') DEBUG=true;
+
+var Dygraph = (function() {
/*global DygraphLayout:false, DygraphCanvasRenderer:false, DygraphOptions:false, G_vmlCanvasManager:false,ActiveXObject:false */
"use strict";
// 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.
- Dygraph.warn("Using deprecated four-argument dygraph constructor");
+ console.warn("Using deprecated four-argument dygraph constructor");
this.__old_init__(div, data, opts, opt_fourth_param);
} else {
this.__init__(div, data, opts);
* and maxNumberWidth options.
* @param {number} x The number to be formatted
* @param {Dygraph} opts An options view
- * @param {string} name The name of the point's data series
- * @param {Dygraph} g The dygraph object
*/
-Dygraph.numberValueFormatter = function(x, opts, pt, g) {
+Dygraph.numberValueFormatter = function(x, opts) {
var sigFigs = opts('sigFigs');
if (sigFigs !== null) {
k_labels = Dygraph.KMB_LABELS;
}
if (kmg2) {
- if (kmb) Dygraph.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
+ if (kmb) console.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
k = 1024;
k_labels = Dygraph.KMG2_BIG_LABELS;
m_labels = Dygraph.KMG2_SMALL_LABELS;
* variant for use as an axisLabelFormatter.
* @private
*/
-Dygraph.numberAxisLabelFormatter = function(x, granularity, opts, g) {
- return Dygraph.numberValueFormatter(x, opts, g);
+Dygraph.numberAxisLabelFormatter = function(x, granularity, opts) {
+ return Dygraph.numberValueFormatter(x, opts);
};
/**
/**
* Convert a JS date to a string appropriate to display on an axis that
* is displaying values at the stated granularity. This respects the
- * labelsDateUTC option.
+ * labelsUTC option.
* @param {Date} date The date to format
* @param {number} granularity One of the Dygraph granularity constants
* @param {Dygraph} opts An options view
* @private
*/
Dygraph.dateAxisLabelFormatter = function(date, granularity, opts) {
- var utc = opts('labelsDateUTC');
- var year, month, day, hours, mins, secs, millis;
- if (utc) {
- year = date.getUTCFullYear();
- month = date.getUTCMonth();
- day = date.getUTCDate();
- hours = date.getUTCHours();
- mins = date.getUTCMinutes();
- secs = date.getUTCSeconds();
- millis = date.getUTCMilliseconds();
- } else {
- year = date.getFullYear();
- month = date.getMonth();
- day = date.getDate();
- hours = date.getHours();
- mins = date.getMinutes();
- secs = date.getSeconds();
- millis = date.getMilliseconds();
- }
+ var utc = opts('labelsUTC');
+ var accessors = utc ? Dygraph.DateAccessorsUTC : Dygraph.DateAccessorsLocal;
+
+ var year = accessors.getFullYear(date),
+ month = accessors.getMonth(date),
+ day = accessors.getDate(date),
+ hours = accessors.getHours(date),
+ mins = accessors.getMinutes(date),
+ secs = accessors.getSeconds(date),
+ millis = accessors.getSeconds(date);
+
if (granularity >= Dygraph.DECADAL) {
return '' + year;
} else if (granularity >= Dygraph.MONTHLY) {
- return Dygraph.SHORT_MONTH_NAMES_[month] + ' ' + Dygraph.zeropad(year);
+ return Dygraph.SHORT_MONTH_NAMES_[month] + ' ' + year;
} else {
var frac = hours * 3600 + mins * 60 + secs + 1e-3 * millis;
if (frac === 0 || granularity >= Dygraph.DAILY) {
- // e.g. '21Jan' (%d%b)
- return Dygraph.zeropad(day) + Dygraph.SHORT_MONTH_NAMES_[month];
+ // e.g. '21 Jan' (%d%b)
+ return Dygraph.zeropad(day) + ' ' + Dygraph.SHORT_MONTH_NAMES_[month];
} else {
return Dygraph.hmsString_(hours, mins, secs);
}
}
};
+// alias in case anyone is referencing the old method.
+Dygraph.dateAxisFormatter = Dygraph.dateAxisLabelFormatter;
/**
* Return a string version of a JS date for a value label. This respects the
- * labelsDateUTC option.
+ * labelsUTC option.
* @param {Date} date The date to be formatted
* @param {Dygraph} opts An options view
* @private
*/
Dygraph.dateValueFormatter = function(d, opts) {
- return Dygraph.dateString_(d, opts('labelsDateUTC'));
+ return Dygraph.dateString_(d, opts('labelsUTC'));
};
/**
axisTickSize: 3,
axisLabelFontSize: 14,
- xAxisLabelWidth: 50,
- yAxisLabelWidth: 50,
rightGap: 5,
showRoller: false,
axisLineWidth: 0.3,
gridLineWidth: 0.3,
axisLabelColor: "black",
- axisLabelFont: "Arial", // TODO(danvk): is this implemented?
axisLabelWidth: 50,
drawYGrid: true,
drawXGrid: true,
rangeSelectorHeight: 40,
rangeSelectorPlotStrokeColor: "#808FAB",
rangeSelectorPlotFillColor: "#A7B1C4",
+ showInRangeSelector: null,
// The ordering here ensures that central lines always appear above any
// fill bars/error bars.
// per-axis options
axes: {
x: {
- pixelsPerLabel: 60,
+ pixelsPerLabel: 70,
+ axisLabelWidth: 60,
axisLabelFormatter: Dygraph.dateAxisLabelFormatter,
valueFormatter: Dygraph.dateValueFormatter,
drawGrid: true,
ticker: null // will be set in dygraph-tickers.js
},
y: {
+ axisLabelWidth: 50,
pixelsPerLabel: 30,
valueFormatter: Dygraph.numberValueFormatter,
axisLabelFormatter: Dygraph.numberAxisLabelFormatter,
ticker: null // will be set in dygraph-tickers.js
},
y2: {
+ axisLabelWidth: 50,
pixelsPerLabel: 30,
valueFormatter: Dygraph.numberValueFormatter,
axisLabelFormatter: Dygraph.numberAxisLabelFormatter,
- drawAxis: false,
+ drawAxis: true, // only applies when there are two axes of data.
drawGrid: false,
independentTicks: false,
ticker: null // will be set in dygraph-tickers.js
}
if (!div) {
- Dygraph.error("Constructing dygraph with a non-existent div!");
+ console.error("Constructing dygraph with a non-existent div!");
return;
}
this.plugins_ = [];
var plugins = Dygraph.PLUGINS.concat(this.getOption('plugins'));
for (var i = 0; i < plugins.length; i++) {
- var Plugin = plugins[i];
- var pluginInstance = new Plugin();
+ // the plugins option may contain either plugin classes or instances.
+ // Plugin instances contain an activate method.
+ var Plugin = plugins[i]; // either a constructor or an instance.
+ var pluginInstance;
+ if (typeof(Plugin.activate) !== 'undefined') {
+ pluginInstance = Plugin;
+ } else {
+ pluginInstance = new Plugin();
+ }
+
var pluginDict = {
plugin: pluginInstance,
events: {},
var handlers = pluginInstance.activate(this);
for (var eventName in handlers) {
+ if (!handlers.hasOwnProperty(eventName)) continue;
// TODO(danvk): validate eventName.
pluginDict.events[eventName] = handlers[eventName];
}
/**
* Triggers a cascade of events to the various plugins which are interested in them.
- * Returns true if the "default behavior" should be performed, i.e. if none of
- * the event listeners called event.preventDefault().
+ * Returns true if the "default behavior" should be prevented, i.e. if one
+ * of the event listeners called event.preventDefault().
* @private
*/
Dygraph.prototype.cascadeEvents_ = function(name, extra_props) {
- if (!(name in this.eventListeners_)) return true;
+ if (!(name in this.eventListeners_)) return false;
// QUESTION: can we use objects & prototypes to speed this up?
var e = {
* @return { ... } The value of the option.
*/
Dygraph.prototype.attr_ = function(name, seriesName) {
-// <REMOVE_FOR_COMBINED>
- if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') {
- Dygraph.error('Must include options reference JS for testing');
- } else if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(name)) {
- 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;
- }
-// </REMOVE_FOR_COMBINED>
+ if (DEBUG) {
+ if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') {
+ console.error('Must include options reference JS for testing');
+ } else if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(name)) {
+ console.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 seriesName ? this.attributes_.getForSeries(name, seriesName) : this.attributes_.get(name);
};
var xRange = this.xAxisRange();
var pct;
var logscale = this.attributes_.getForAxis("logscale", 'x') ;
- if (logscale == true) { // logscale can be null so we test for true explicitly.
+ if (logscale === true) { // logscale can be null so we test for true explicitly.
var logr0 = Dygraph.log10(xRange[0]);
var logr1 = Dygraph.log10(xRange[1]);
pct = (Dygraph.log10(x) - logr0) / (logr1 - logr0);
this.canvas_ctx_.restore();
this.hidden_ctx_.restore();
+ // Destroy any plugins, in the reverse order that they were registered.
+ for (var i = this.plugins_.length - 1; i >= 0; i--) {
+ var p = this.plugins_.pop();
+ if (p.plugin.destroy) p.plugin.destroy();
+ }
+
var removeRecursive = function(node) {
while (node.hasChildNodes()) {
removeRecursive(node.firstChild);
Dygraph.removeEvent(this.mouseEventElement_, 'mousemove', this.mouseMoveHandler_);
// remove window handlers
- Dygraph.removeEvent(window,'resize',this.resizeHandler_);
+ Dygraph.removeEvent(window,'resize', this.resizeHandler_);
this.resizeHandler_ = null;
removeRecursive(this.maindiv_);
contextB.dragStartY = Dygraph.dragGetY_(event, contextB);
contextB.cancelNextDblclick = false;
contextB.tarp.cover();
+ },
+ destroy: function() {
+ var context = this;
+ if (context.isZooming || context.isPanning) {
+ context.isZooming = false;
+ context.dragStartX = null;
+ context.dragStartY = null;
+ }
+
+ if (context.isPanning) {
+ context.isPanning = false;
+ context.draggingDate = null;
+ context.dateRange = null;
+ for (var i = 0; i < self.axes_.length; i++) {
+ delete self.axes_[i].draggingValue;
+ delete self.axes_[i].dragValueRange;
+ }
+ }
+
+ context.tarp.uncover();
}
};
// If the user releases the mouse button during a drag, but not over the
// canvas, then it doesn't count as a zooming action.
- var mouseUpHandler = function(event) {
- if (context.isZooming || context.isPanning) {
- context.isZooming = false;
- context.dragStartX = null;
- context.dragStartY = null;
- }
-
- if (context.isPanning) {
- context.isPanning = false;
- context.draggingDate = null;
- context.dateRange = null;
- for (var i = 0; i < self.axes_.length; i++) {
- delete self.axes_[i].draggingValue;
- delete self.axes_[i].dragValueRange;
- }
- }
-
- context.tarp.uncover();
- };
+ if (!interactionModel.willDestroyContextMyself) {
+ var mouseUpHandler = function(event) {
+ context.destroy();
+ };
- this.addAndTrackEvent(document, 'mouseup', mouseUpHandler);
+ this.addAndTrackEvent(document, 'mouseup', mouseUpHandler);
+ }
};
/**
*/
Dygraph.prototype.clearZoomRect_ = function() {
this.currentZoomRectArgs_ = null;
- this.canvas_ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height);
+ this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_);
};
/**
var that = this;
this.doAnimatedZoom(old_window, new_window, null, null, function() {
if (that.getFunctionOption("zoomCallback")) {
- that.getFunctionOption("zoomCallback")(
+ that.getFunctionOption("zoomCallback").call(that,
minDate, maxDate, that.yAxisRanges());
}
});
this.doAnimatedZoom(null, null, oldValueRanges, newValueRanges, function() {
if (that.getFunctionOption("zoomCallback")) {
var xRange = that.xAxisRange();
- that.getFunctionOption("zoomCallback")(
+ that.getFunctionOption("zoomCallback").call(that,
xRange[0], xRange[1], that.yAxisRanges());
}
});
}
this.drawGraph_();
if (this.getFunctionOption("zoomCallback")) {
- this.getFunctionOption("zoomCallback")(
+ this.getFunctionOption("zoomCallback").call(this,
minDate, maxDate, this.yAxisRanges());
}
return;
}
}
if (that.getFunctionOption("zoomCallback")) {
- that.getFunctionOption("zoomCallback")(
+ that.getFunctionOption("zoomCallback").call(that,
minDate, maxDate, that.yAxisRanges());
}
});
var callback = this.getFunctionOption("highlightCallback");
if (callback && selectionChanged) {
- callback(event,
+ callback.call(this, event,
this.lastx_,
this.selPoints_,
this.lastRow_,
ctx.lineWidth = this.getNumericOption('strokeWidth', pt.name);
ctx.strokeStyle = color;
ctx.fillStyle = color;
- callback(this, pt.name, ctx, canvasx, pt.canvasy,
+ callback.call(this, this, pt.name, ctx, canvasx, pt.canvasy,
color, circleSize, pt.idx);
}
ctx.restore();
*/
Dygraph.prototype.mouseOut_ = function(event) {
if (this.getFunctionOption("unhighlightCallback")) {
- this.getFunctionOption("unhighlightCallback")(event);
+ this.getFunctionOption("unhighlightCallback").call(this, event);
}
- if (this.getFunctionOption("hideOverlayOnMouseOut") && !this.lockedSet_) {
+ if (this.getBooleanOption("hideOverlayOnMouseOut") && !this.lockedSet_) {
this.clearSelection();
}
};
*/
Dygraph.prototype.loadedEvent_ = function(data) {
this.rawData_ = this.parseCSV_(data);
+ this.cascadeDataDidUpdateEvent_();
this.predraw_();
};
var xTicks = xAxisOptionsView('ticker')(
range[0],
range[1],
- this.width_, // TODO(danvk): should be area.width
+ this.plotter_.area.w, // TODO(danvk): should be area.width
xAxisOptionsView,
this);
// var msg = 'ticker(' + range[0] + ', ' + range[1] + ', ' + this.width_ + ', ' + this.attr_('pixelsPerXLabel') + ') -> ' + JSON.stringify(xTicks);
// TODO(danvk): move more computations out of drawGraph_ and into here.
this.computeYAxes_();
- // Create a new plotter.
- if (this.plotter_) {
- this.cascadeEvents_('clearChart');
- this.plotter_.clear();
- }
-
if (!this.is_initial_draw_) {
this.canvas_ctx_.restore();
this.hidden_ctx_.restore();
this.canvas_ctx_.save();
this.hidden_ctx_.save();
+ // Create a new plotter.
this.plotter_ = new DygraphCanvasRenderer(this,
this.hidden_,
this.hidden_ctx_,
var extremes = {}; // series name -> [low, high]
var seriesIdx, sampleIdx;
var firstIdx, lastIdx;
+ var axisIdx;
// Loop over the fields (series). Go from the last to the first,
// because if they're stacked that's how we accumulate the values.
seriesName, boundaryIds[seriesIdx-1][0]);
if (this.getBooleanOption("stackedGraph")) {
- Dygraph.stackPoints_(seriesPoints, cumulativeYval, seriesExtremes,
+ axisIdx = this.attributes_.axisForSeries(seriesName);
+ if (cumulativeYval[axisIdx] === undefined) {
+ cumulativeYval[axisIdx] = [];
+ }
+ Dygraph.stackPoints_(seriesPoints, cumulativeYval[axisIdx], seriesExtremes,
this.getBooleanOption("stackedGraphNaNFill"));
}
if (this.getStringOption("timingName")) {
var end = new Date();
- Dygraph.info(this.getStringOption("timingName") + " - drawGraph: " + (end - start) + "ms");
+ console.log(this.getStringOption("timingName") + " - drawGraph: " + (end - start) + "ms");
}
};
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.getFunctionOption('underlayCallback')(
+ this.getFunctionOption('underlayCallback').call(this,
this.hidden_ctx_, this.layout_.getPlotArea(), this, this);
}
// TODO(danvk): is this a performance bottleneck when panning?
// The interaction canvas should already be empty in that situation.
- this.canvas_.getContext('2d').clearRect(0, 0, this.canvas_.width,
- this.canvas_.height);
+ this.canvas_.getContext('2d').clearRect(0, 0, this.width_, this.height_);
if (this.getFunctionOption("drawCallback") !== null) {
this.getFunctionOption("drawCallback")(this, is_initial_draw);
var ticker = opts('ticker');
axis.ticks = ticker(axis.computedValueRange[0],
axis.computedValueRange[1],
- this.height_, // TODO(danvk): should be area.height
+ this.plotter_.area.h,
opts,
this);
// Define the first independent axis as primary axis.
axis.ticks = ticker(axis.computedValueRange[0],
axis.computedValueRange[1],
- this.height_, // TODO(danvk): should be area.height
+ this.plotter_.area.h,
opts,
this,
tick_values);
// TODO(danvk): figure out an appropriate way to flag parse errors.
vals = inFields[j].split("/");
if (vals.length != 2) {
- Dygraph.error('Expected fractional "num/den" values in CSV data ' +
+ console.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 if (this.getBooleanOption("errorBars")) {
// If there are error bars, values are (value, stddev) pairs
if (inFields.length % 2 != 1) {
- Dygraph.error('Expected alternating (value, stdev.) pairs in CSV data ' +
+ console.error('Expected alternating (value, stdev.) pairs in CSV data ' +
'but line ' + (1 + i) + ' has an odd number of values (' +
(inFields.length - 1) + "): '" + line + "'");
}
Dygraph.parseFloat_(vals[1], i, line),
Dygraph.parseFloat_(vals[2], i, line) ];
} else {
- Dygraph.warn('When using customBars, values must be either blank ' +
+ console.warn('When using customBars, values must be either blank ' +
'or "low;center;high" tuples (got "' + val +
'" on line ' + (1+i));
}
}
if (fields.length != expectedCols) {
- Dygraph.error("Number of columns in line " + i + " (" + fields.length +
+ console.error("Number of columns in line " + i + " (" + fields.length +
") does not agree with number of labels (" + expectedCols +
") " + line);
}
if (fields[j]) all_null = false;
}
if (all_null) {
- Dygraph.warn("The dygraphs 'labels' option is set, but the first row " +
+ console.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.");
}
if (outOfOrder) {
- Dygraph.warn("CSV is out of order; order it correctly to speed loading.");
+ console.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) {
- Dygraph.error("Can't plot empty data set");
+ console.error("Can't plot empty data set");
return null;
}
if (data[0].length === 0) {
- Dygraph.error("Data set cannot contain an empty row");
+ console.error("Data set cannot contain an empty row");
return null;
}
var i;
if (this.attr_("labels") === null) {
- Dygraph.warn("Using default labels. Set labels explicitly via 'labels' " +
+ console.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++) {
} else {
var num_labels = this.attr_("labels");
if (num_labels.length != data[0].length) {
- Dygraph.error("Mismatch between number of labels (" + num_labels + ")" +
+ console.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) {
- Dygraph.error("Row " + (1 + i) + " of data is empty");
+ console.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())) {
- Dygraph.error("x value in row " + (1 + i) + " is not a Date");
+ console.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.numericTicks;
this.attrs_.axes.x.axisLabelFormatter = this.attrs_.axes.x.valueFormatter;
} else {
- Dygraph.error("only 'date', 'datetime' and 'number' types are supported " +
+ console.error("only 'date', 'datetime' and 'number' types are supported " +
"for column 1 of DataTable input (Got '" + indepType + "')");
return null;
}
}
hasAnnotations = true;
} else {
- Dygraph.error("Only 'number' is supported as a dependent type with Gviz." +
+ console.error("Only 'number' is supported as a dependent type with Gviz." +
" 'string' is only supported if displayAnnotations is true");
}
}
var row = [];
if (typeof(data.getValue(i, 0)) === 'undefined' ||
data.getValue(i, 0) === null) {
- Dygraph.warn("Ignoring row " + i +
+ console.warn("Ignoring row " + i +
" of DataTable because of undefined or null first column.");
continue;
}
}
if (outOfOrder) {
- Dygraph.warn("DataTable is out of order; order it correctly to speed loading.");
+ console.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;
};
/**
+ * Signals to plugins that the chart data has updated.
+ * This happens after the data has updated but before the chart has redrawn.
+ */
+Dygraph.prototype.cascadeDataDidUpdateEvent_ = function() {
+ // TODO(danvk): there are some issues checking xAxisRange() and using
+ // toDomCoords from handlers of this event. The visible range should be set
+ // when the chart is drawn, not derived from the data.
+ this.cascadeEvents_('dataDidUpdate', {});
+};
+
+/**
* Get the CSV data. If it's in a function, call that function. If it's in a
* file, do an XMLHttpRequest to get it.
* @private
if (Dygraph.isArrayLike(data)) {
this.rawData_ = this.parseArray_(data);
+ this.cascadeDataDidUpdateEvent_();
this.predraw_();
} else if (typeof data == 'object' &&
typeof data.getColumnRange == 'function') {
// must be a DataTable from gviz.
this.parseDataTable_(data);
+ this.cascadeDataDidUpdateEvent_();
this.predraw_();
} else if (typeof data == 'string') {
// Heuristic: a newline means it's CSV data. Otherwise it's an URL.
req.send(null);
}
} else {
- Dygraph.error("Unknown data format: " + (typeof data));
+ console.error("Unknown data format: " + (typeof data));
}
};
this.attributes_.reparseSeries();
if (file) {
+ // This event indicates that the data is about to change, but hasn't yet.
+ // TODO(danvk): support cancelation of the update via this event.
+ this.cascadeEvents_('dataWillUpdate', {});
+
this.file_ = file;
if (!block_redraw) this.start_();
} else {
Dygraph.mapLegacyOptions_ = function(attrs) {
var my_attrs = {};
for (var k in attrs) {
+ if (!attrs.hasOwnProperty(k)) continue;
if (k == 'file') continue;
if (attrs.hasOwnProperty(k)) my_attrs[k] = attrs[k];
}
};
var map = function(opt, axis, new_opt) {
if (typeof(attrs[opt]) != 'undefined') {
- Dygraph.warn("Option " + opt + " is deprecated. Use the " +
+ console.warn("Option " + opt + " is deprecated. Use the " +
new_opt + " option for the " + axis + " axis instead. " +
"(e.g. { axes : { " + axis + " : { " + new_opt + " : ... } } } " +
"(see http://dygraphs.com/per-axis.html for more information.");
map('drawXAxis', 'x', 'drawAxis');
map('drawYGrid', 'y', 'drawGrid');
map('drawYAxis', 'y', 'drawAxis');
+ map('xAxisLabelWidth', 'x', 'axisLabelWidth');
+ map('yAxisLabelWidth', 'y', 'axisLabelWidth');
return my_attrs;
};
this.resize_lock = true;
if ((width === null) != (height === null)) {
- Dygraph.warn("Dygraph.resize() should be called with zero parameters or " +
+ console.warn("Dygraph.resize() should be called with zero parameters or " +
"two non-NULL parameters. Pretending it was zero.");
width = height = null;
}
Dygraph.prototype.setVisibility = function(num, value) {
var x = this.visibility();
if (num < 0 || num >= x.length) {
- Dygraph.warn("invalid series number in setVisibility: " + num);
+ console.warn("invalid series number in setVisibility: " + num);
} else {
x[num] = value;
this.predraw_();
Dygraph.addAnnotationRule();
this.annotations_ = ann;
if (!this.layout_) {
- Dygraph.warn("Tried to setAnnotations before dygraph was ready. " +
+ console.warn("Tried to setAnnotations before dygraph was ready. " +
"Try setting them in a ready() block. See " +
"dygraphs.com/tests/annotation.html");
return;
if (this.is_initial_draw_) {
this.readyFns_.push(callback);
} else {
- callback(this);
+ callback.call(this, this);
}
};
}
}
- Dygraph.warn("Unable to add default annotation CSS rule; display may be off.");
+ console.warn("Unable to add default annotation CSS rule; display may be off.");
};
+
+return Dygraph;
+
+})();