// 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);
}
};
// 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");
+ var errorBars = this.attr_("errorBars");
+ var customBars = this.attr_("customBars");
+ var bars = errorBars || customBars;
if (dateWindow) {
var low = dateWindow[0];
var high = dateWindow[1];
}
}
if (firstIdx === null) firstIdx = 0;
- if (firstIdx > 0) firstIdx--;
+ var correctedFirstIdx = firstIdx;
+
+ var isInvalidValue = true;
+ while(isInvalidValue && correctedFirstIdx > 0){
+ correctedFirstIdx--;
+
+ if(bars){
+ if(customBars){
+ isInvalidValue = series[correctedFirstIdx][1][1] === null;
+ } else if(errorBars){
+ isInvalidValue = series[correctedFirstIdx][1][0] === null;
+ }
+ } else{
+ isInvalidValue = series[correctedFirstIdx][1] === null;
+ }
+ }
+
if (lastIdx === null) lastIdx = series.length - 1;
- if (lastIdx < series.length - 1) lastIdx++;
- boundaryIds[i-1] = [firstIdx, lastIdx];
+ var correctedLastIdx = lastIdx;
+ isInvalidValue = true;
+ while(isInvalidValue && correctedLastIdx < series.length - 1){
+ correctedLastIdx++;
+
+ if(bars){
+ if(customBars){
+ isInvalidValue = series[correctedLastIdx][1][1] === null;
+ } else if(errorBars){
+ isInvalidValue = series[correctedLastIdx][1][0] === null;
+ }
+ } else{
+ isInvalidValue = series[correctedLastIdx][1] === null;
+ }
+ }
+
+ 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)
+ pruned.push(series[correctedLastIdx]);
+
series = pruned;
} else {
boundaryIds[i-1] = [0, series.length-1];
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];
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;
};