update: function()

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);
      }
    }