REFACTORING: fixed code style and lint warnings. Readded jsdoc lost in merge.
[dygraphs.git] / dygraph.js
index afa3fd0..44214ad 100644 (file)
@@ -1019,8 +1019,8 @@ Dygraph.prototype.createInterface_ = function() {
     // 2. e.relatedTarget is outside the chart
     var target = e.target || e.fromElement;
     var relatedTarget = e.relatedTarget || e.toElement;
-    if (Dygraph.isElementContainedBy(target, dygraph.graphDiv) &&
-        !Dygraph.isElementContainedBy(relatedTarget, dygraph.graphDiv)) {
+    if (Dygraph.isNodeContainedBy(target, dygraph.graphDiv) &&
+        !Dygraph.isNodeContainedBy(relatedTarget, dygraph.graphDiv)) {
       dygraph.mouseOut_(e);
     }
   };
@@ -2278,6 +2278,17 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) {
   var datasets = [];
   var extremes = {};  // series name -> [low, high]
   var i, j, k;
+  var errorBars = this.attr_("errorBars");
+  var customBars = this.attr_("customBars");
+  var bars = errorBars || customBars;
+  var isValueNull = function(sample) {
+    if (!bars) {
+      return sample[1] === null;
+    } else {
+      return customBars ? sample[1][1] === null : 
+        errorBars ? sample[1][0] === null : false;
+    }
+  };
 
   // Loop over the fields (series).  Go from the last to the first,
   // because if they're stacked that's how we accumulate the values.
@@ -2296,11 +2307,11 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) {
     // Prune down to the desired range, if necessary (for zooming)
     // Because there can be lines going to points outside of the visible area,
     // we actually prune to visible points, plus one on either side.
-    var bars = this.attr_("errorBars") || this.attr_("customBars");
     if (dateWindow) {
       var low = dateWindow[0];
       var high = dateWindow[1];
       var pruned = [];
+
       // TODO(danvk): do binary search instead of linear search.
       // TODO(danvk): pass firstIdx and lastIdx directly to the renderer.
       var firstIdx = null, lastIdx = null;
@@ -2312,31 +2323,36 @@ Dygraph.prototype.gatherDatasets_ = function(rolledSeries, dateWindow) {
           lastIdx = k;
         }
       }
+
       if (firstIdx === null) firstIdx = 0;
       var correctedFirstIdx = firstIdx;
-      if (correctedFirstIdx > 0) correctedFirstIdx--;
-      while(series[correctedFirstIdx][1] === null && correctedFirstIdx > 0){
+      var isInvalidValue = true;
+      while (isInvalidValue && correctedFirstIdx > 0) {
         correctedFirstIdx--;
+        isInvalidValue = isValueNull(series[correctedFirstIdx]);
       }
-      
-      
+
       if (lastIdx === null) lastIdx = series.length - 1;
       var correctedLastIdx = lastIdx;
-      if (correctedLastIdx < series.length - 1) correctedLastIdx++;
-      while(series[correctedLastIdx][1] === null && correctedLastIdx < series.length - 1){
+      isInvalidValue = true;
+      while (isInvalidValue && correctedLastIdx < series.length - 1) {
         correctedLastIdx++;
+        isInvalidValue = isValueNull(series[correctedLastIdx]);
       }
-      
-      boundaryIds[i-1] = [(firstIdx > 0) ? firstIdx - 1 : firstIdx, (lastIdx < series.length - 1) ? lastIdx + 1 : lastIdx];
-      
-      if(correctedFirstIdx!==firstIdx)
+
+      boundaryIds[i-1] = [(firstIdx > 0) ? firstIdx - 1 : firstIdx, 
+          (lastIdx < series.length - 1) ? lastIdx + 1 : lastIdx];
+
+      if (correctedFirstIdx!==firstIdx) {
         pruned.push(series[correctedFirstIdx]);
+      }
       for (k = firstIdx; k <= lastIdx; k++) {
-          pruned.push(series[k]);
+        pruned.push(series[k]);
       }
-      if(correctedLastIdx !== lastIdx)
+      if (correctedLastIdx !== lastIdx) {
         pruned.push(series[correctedLastIdx]);
-      
+      }
+
       series = pruned;
     } else {
       boundaryIds[i-1] = [0, series.length-1];
@@ -2775,6 +2791,8 @@ Dygraph.prototype.computeYAxisRanges_ = function(extremes) {
 Dygraph.prototype.extractSeries_ = function(rawData, i, logScale) {
   // TODO(danvk): pre-allocate series here.
   var series = [];
+  var errorBars = this.attr_("errorBars");
+  var customBars =  this.attr_("customBars");
   for (var j = 0; j < rawData.length; j++) {
     var x = rawData[j][0];
     var point = rawData[j][i];
@@ -2785,7 +2803,12 @@ Dygraph.prototype.extractSeries_ = function(rawData, i, logScale) {
         point = null;
       }
     }
-    series.push([x, point]);
+    // Fix null points to fit the display type standard.
+    if(point !== null) {
+      series.push([x, point]);
+    } else {
+      series.push([x, errorBars ? [null, null] : customBars ? [null, null, null] : point]);
+    }
   }
   return series;
 };