docs: function (e) {
              var pointer = this,
                chart = pointer.chart,
                series = chart.series,
                tooltip = chart.tooltip,
                followPointer,
                point,
                points,
                hoverPoint = chart.hoverPoint,
                hoverSeries = chart.hoverSeries,
                i,
                j,
                distance = chart.chartWidth,
                index = pointer.getIndex(e),
                anchor;
  
              // shared tooltip
              if (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
                  points = [];
  
                  // loop over all series and find the ones with points closest to the mouse
                  i = series.length;
                  for (j = 0; j < i; j++) {
                      if (series[j].visible &&
                        series[j].options.enableMouseTracking !== false &&
                        !series[j].noSharedTooltip && series[j].singularTooltips !== true && series[j].tooltipPoints.length) {
                          point = series[j].tooltipPoints[index];
                          if (point && point.series) { // not a dummy point, #1544
                              point._dist = mathAbs(index - point.clientX);
                              distance = mathMin(distance, point._dist);
                              points.push(point);
                          }
                      }
                  }
                  // remove furthest points
                  i = points.length;
                  while (i--) {
                      if (points[i]._dist > distance) {
                          points.splice(i, 1);
                      }
                  }
                  // refresh the tooltip if necessary
                  if (points.length && (points[0].clientX !== pointer.hoverX)) {
                      tooltip.refresh(points, e);
                      pointer.hoverX = points[0].clientX;
                  }
              }
  
              // Separate tooltip and general mouse events
              followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;
              if (hoverSeries && hoverSeries.tracker && !followPointer) { // #2584, #2830
  
                  // get the point
                  point = hoverSeries.tooltipPoints[index];
  
                  // a new point is hovered, refresh the tooltip
                  if (point && point !== hoverPoint) {
  
                      // trigger the events
                      point.onMouseOver(e);
  
                  }
  
              } else if (tooltip && followPointer && !tooltip.isHidden) {
                  anchor = tooltip.getAnchor([{}], e);
                  tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
              }
  
              // Start the event listener to pick up the tooltip
              if (tooltip && !pointer._onDocumentMouseMove) {
                  pointer._onDocumentMouseMove = function (e) {
                      if (charts[hoverChartIndex]) {
                          charts[hoverChartIndex].pointer.onDocumentMouseMove(e);
                      }
                  };
                  addEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
              }
  
              // Draw independent crosshairs
              each(chart.axes, function (axis) {
                  axis.drawCrosshair(e, pick(point, hoverPoint));
              });
          }