Merge pull request #674 from danvk/module
[dygraphs.git] / src / datahandler / bars.js
CommitLineData
a49c164a
DE
1/**
2 * @license
3 * Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
4 * MIT-licensed (http://opensource.org/licenses/MIT)
5 */
6
7/**
8 * @fileoverview DataHandler base implementation for the "bar"
9 * data formats. This implementation must be extended and the
10 * extractSeries and rollingAverage must be implemented.
11 * @author David Eberlein (david.eberlein@ch.sauter-bc.com)
12 */
13
3ea41d86
DV
14/*global Dygraph:false */
15/*global DygraphLayout:false */
16"use strict";
17
e8c70e4e
DV
18import DygraphDataHandler from './datahandler';
19import DygraphLayout from '../dygraph-layout';
20
749281f8
DV
21/**
22 * @constructor
23 * @extends {Dygraph.DataHandler}
24 */
e8c70e4e
DV
25var BarsHandler = function() {
26 DygraphDataHandler.call(this);
749281f8 27};
e8c70e4e 28BarsHandler.prototype = new DygraphDataHandler();
3ea41d86 29
749281f8
DV
30// TODO(danvk): figure out why the jsdoc has to be copy/pasted from superclass.
31// (I get closure compiler errors if this isn't here.)
32/**
33 * @override
34 * @param {!Array.<Array>} rawData The raw data passed into dygraphs where
35 * rawData[i] = [x,ySeries1,...,ySeriesN].
36 * @param {!number} seriesIndex Index of the series to extract. All other
37 * series should be ignored.
38 * @param {!DygraphOptions} options Dygraph options.
39 * @return {Array.<[!number,?number,?]>} The series in the unified data format
40 * where series[i] = [x,y,{extras}].
41 */
42BarsHandler.prototype.extractSeries = function(rawData, seriesIndex, options) {
3ea41d86
DV
43 // Not implemented here must be extended
44};
45
749281f8
DV
46/**
47 * @override
48 * @param {!Array.<[!number,?number,?]>} series The series in the unified
49 * data format where series[i] = [x,y,{extras}].
50 * @param {!number} rollPeriod The number of points over which to average the data
51 * @param {!DygraphOptions} options The dygraph options.
52 * TODO(danvk): be more specific than "Array" here.
53 * @return {!Array.<[!number,?number,?]>} the rolled series.
54 */
3ea41d86 55BarsHandler.prototype.rollingAverage =
749281f8 56 function(series, rollPeriod, options) {
3ea41d86
DV
57 // Not implemented here, must be extended.
58};
59
749281f8 60/** @inheritDoc */
3ea41d86
DV
61BarsHandler.prototype.onPointsCreated_ = function(series, points) {
62 for (var i = 0; i < series.length; ++i) {
63 var item = series[i];
64 var point = points[i];
65 point.y_top = NaN;
66 point.y_bottom = NaN;
e8c70e4e
DV
67 point.yval_minus = DygraphDataHandler.parseFloat(item[2][0]);
68 point.yval_plus = DygraphDataHandler.parseFloat(item[2][1]);
3ea41d86
DV
69 }
70};
71
749281f8 72/** @inheritDoc */
3ea41d86
DV
73BarsHandler.prototype.getExtremeYValues = function(series, dateWindow, options) {
74 var minY = null, maxY = null, y;
75
76 var firstIdx = 0;
77 var lastIdx = series.length - 1;
78
79 for ( var j = firstIdx; j <= lastIdx; j++) {
80 y = series[j][1];
81 if (y === null || isNaN(y)) continue;
82
83 var low = series[j][2][0];
84 var high = series[j][2][1];
85
86 if (low > y) low = y; // this can happen with custom bars,
87 if (high < y) high = y; // e.g. in tests/custom-bars.html
88
89 if (maxY === null || high > maxY) maxY = high;
90 if (minY === null || low < minY) minY = low;
91 }
92
93 return [ minY, maxY ];
94};
95
749281f8 96/** @inheritDoc */
3ea41d86
DV
97BarsHandler.prototype.onLineEvaluated = function(points, axis, logscale) {
98 var point;
99 for (var j = 0; j < points.length; j++) {
100 // Copy over the error terms
101 point = points[j];
749281f8
DV
102 point.y_top = DygraphLayout.calcYNormal_(axis, point.yval_minus, logscale);
103 point.y_bottom = DygraphLayout.calcYNormal_(axis, point.yval_plus, logscale);
3ea41d86
DV
104 }
105};
106
e8c70e4e 107export default BarsHandler;