UNPKG

rickshaw

Version:

Rickshaw is a JavaScript toolkit for creating interactive time series graphs, developed at [Shutterstock](http://www.shutterstock.com)

161 lines (118 loc) 3.19 kB
Rickshaw.namespace('Rickshaw.Series'); Rickshaw.Series = Rickshaw.Class.create( Array, { initialize: function (data, palette, options) { options = options || {} this.palette = new Rickshaw.Color.Palette(palette); this.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase; var timeInterval = typeof(options.timeInterval) == 'undefined' ? 1000 : options.timeInterval; this.setTimeInterval(timeInterval); if (data && (typeof(data) == "object") && (data instanceof Array)) { data.forEach( function(item) { this.addItem(item) }, this ); } }, addItem: function(item) { if (typeof(item.name) === 'undefined') { throw('addItem() needs a name'); } item.color = (item.color || this.palette.color(item.name)); item.data = (item.data || []); // backfill, if necessary if ((item.data.length == 0) && this.length && (this.getIndex() > 0)) { this[0].data.forEach( function(plot) { item.data.push({ x: plot.x, y: 0 }); } ); } else if (item.data.length == 0) { item.data.push({ x: this.timeBase - (this.timeInterval || 0), y: 0 }); } this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, addData: function(data) { var index = this.getIndex(); Rickshaw.keys(data).forEach( function(name) { if (! this.itemByName(name)) { this.addItem({ name: name }); } }, this ); this.forEach( function(item) { item.data.push({ x: (index * this.timeInterval || 1) + this.timeBase, y: (data[item.name] || 0) }); }, this ); }, getIndex: function () { return (this[0] && this[0].data && this[0].data.length) ? this[0].data.length : 0; }, itemByName: function(name) { for (var i = 0; i < this.length; i++) { if (this[i].name == name) return this[i]; } }, setTimeInterval: function(iv) { this.timeInterval = iv / 1000; }, setTimeBase: function (t) { this.timeBase = t; }, dump: function() { var data = { timeBase: this.timeBase, timeInterval: this.timeInterval, items: [] }; this.forEach( function(item) { var newItem = { color: item.color, name: item.name, data: [] }; item.data.forEach( function(plot) { newItem.data.push({ x: plot.x, y: plot.y }); } ); data.items.push(newItem); } ); return data; }, load: function(data) { if (data.timeInterval) { this.timeInterval = data.timeInterval; } if (data.timeBase) { this.timeBase = data.timeBase; } if (data.items) { data.items.forEach( function(item) { this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, this ); } } } ); Rickshaw.Series.zeroFill = function(series) { var x; var i = 0; var data = series.map( function(s) { return s.data } ); while ( i < Math.max.apply(null, data.map( function(d) { return d.length } )) ) { x = Math.min.apply( null, data .filter(function(d) { return d[i] }) .map(function(d) { return d[i].x }) ); data.forEach( function(d) { if (!d[i] || d[i].x != x) { d.splice(i, 0, { x: x, y: 0 }); } } ); i++; } };