in kitsune/sumo/static/sumo/js/rickshaw_utils.js [952:1047]
update: function (e) {
e = e || this.lastEvent;
if (!e) { return; }
this.lastEvent = e;
if (!e.target.nodeName.match(/^(path|svg|rect)$/)) { return; }
var active = this.graph.series.active();
var graph = this.graph;
var barWidth = graph.renderer.barWidth() + graph.renderer.gapSize;
if (graph.renderer.unstack) {
barWidth = graph.renderer.barWidth() / active.length;
}
var eventX = e.offsetX || e.layerX;
var eventY = e.offsetY || e.layerY;
var i, j, k;
var points = [];
var nearestPoint;
// Iterate through each series, and find the point that most closely
// matches the mouse pointer.
var series, data, domainX, domainIndexScale, approximateIndex, dataIndex;
var value, barOffset, left, right, bottom, top, point;
for (i = 0; i < active.length; i += 1) {
series = active[i];
data = this.graph.stackedData[i];
domainX = graph.x.invert(eventX);
domainIndexScale = d3.scale.linear()
.domain([data[0].x, data.slice(-1)[0].x])
.range([0, data.length - 1]);
approximateIndex = Math.round(domainIndexScale(domainX));
dataIndex = Math.min(approximateIndex || 0, data.length - 1);
k = approximateIndex;
while (k < data.length - 1) {
if (!data[k] || !data[k + 1]) { break; }
if (data[k].x <= domainX && data[k + 1].x > domainX) {
dataIndex = k;
break;
}
if (data[k + 1].x <= domainX) { k += 1; } else { k -= 1; }
}
if (dataIndex < 0) { dataIndex = 0; }
value = data[dataIndex];
barOffset = graph.renderer.unstack ? i * barWidth : 0;
left = graph.x(value.x) + barOffset;
right = left + barWidth;
bottom = graph.y(value.y0);
top = graph.y(value.y + value.y0);
point = {
series: series,
value: value,
order: i,
name: series.name
};
if (left <= eventX && eventX < right &&
top <= eventY && eventY < bottom) {
nearestPoint = point;
}
points.push(point);
}
var renderArgs = {
points: points,
detail: points,
mouseX: eventX,
mouseY: eventY
};
if (nearestPoint) {
nearestPoint.active = true;
}
if (this.visible) {
this.render(renderArgs);
}
}