highcharts-rails 4.1.6 → 4.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20d000bd52b08e8dd4a7376d96a3a9f76e41276a
4
- data.tar.gz: ef3d6781527923bce73e358926c4befc2e85d4eb
3
+ metadata.gz: d4a6a629f316d30ec0202c1d30132ca75b330e5c
4
+ data.tar.gz: b4159b1bce4ad88d4338a7743b8d659747cddf70
5
5
  SHA512:
6
- metadata.gz: 2a94fc86214d938de0f8cab679f489978cc6ff272656dd7c2172f62dcf192b92ceea747f39e427519b11da95487807f6d3323ba3813b28107e15a9246846d4a3
7
- data.tar.gz: e9c7523d2c44dba8d99512eaabc532b8c977b5a3d1633ca05449fa57c75b19c52b361a65ea8cf90972ab2c81acba8c9e5d4b74db3ae53c3b8b3b9d7c5e8e9c9f
6
+ metadata.gz: 4ccdfb6d73da784b1e673e9a6ee7de7fa967cb6320a5926ea682f5d3a84dbd84f77cf764ac3c87886bb9a31ed44fd06d2a1b83f5b0b7b5b2a57c7ec41a9ef36c
7
+ data.tar.gz: 86f0408ebf477bcdbd8b921b51e18e53ebe8abbdba1da92aa1ac2dd425e7f2082c4909929aa3a5214f06392bff582cbebcf46480dd2c299d9e82a929d2a356a5
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,30 @@
1
+ # 4.1.7 / 2015-08-31
2
+
3
+ * Updated Highcharts to 4.1.7 (2015-06-26)
4
+ * Added new option, drilldown.allowPointDrilldown, that can be set to false to allow only drilling to categories. Closes #4295.
5
+ * Added support for useHTML in legend navigation.
6
+ * Added useHTML option to no-data-to-display module. Closes #4316.
7
+ * Fixed #2911, JS error when drilldown and allowPointSelect were enabled at the same time.
8
+ * Fixed #3318, gauge background altered background on polar charts in the same page.
9
+ * Fixed #3650, updating a point from zero in 3d pies.
10
+ * Fixed #3709, crash when showing/hiding linked series and setting data at the same time.
11
+ * Fixed #3941, added option to turn off axis label ellipsis through text-overflow style.
12
+ * Fixed #4130, errors when running Series.update from the series' own events.
13
+ * Fixed #4170, halo was still visible after hiding pie slice.
14
+ * Fixed #4233, columns and areas ascended from botton when threshold was null and all values negative. Closed #4282.
15
+ * Fixed #4275, when null points were present inside an axis break, connectNulls: false did not have an effect.
16
+ * Fixed #4280, 3D for inverted charts was disabled.
17
+ * Fixed #4284, a regression causing columns to disappear after Point.update with an object argument.
18
+ * Fixed #4291, number suffixes like k and M was applied to non-round tick labels.
19
+ * Fixed #4301, point update on solid gauge gave wrong animation.
20
+ * Fixed #4308, graphs were clipped to axis line even when it was offset.
21
+ * Fixed #4309, JS error in Firefox when rendering chart inside an iframe with display:none.
22
+ * Fixed #4310, point hovering was unstable when stickyTracking was false and point markers disabled in normal state.
23
+ * Fixed #4318, ignoreHiddenPoint didn't take effect for funnels.
24
+ * Fixed #4319, tooltip was broken on canvas heatmap demo.
25
+ * Fixed bad translation from broken axis pixels to values. Part of #4229.
26
+ * Fixed issue with Batik powered exporting and IE8. Invalid SVG tag.
27
+
1
28
  # 4.1.6 / 2015-08-31
2
29
 
3
30
  * Updated Highcharts to 4.1.6 (2015-06-12)
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v4.1.6 (2015-06-12)
5
+ * @license Highcharts JS v4.1.7 (2015-06-26)
6
6
  *
7
7
  * (c) 2009-2014 Torstein Honsi
8
8
  *
@@ -56,7 +56,7 @@ var UNDEFINED,
56
56
  charts = [],
57
57
  chartCount = 0,
58
58
  PRODUCT = 'Highcharts',
59
- VERSION = '4.1.6',
59
+ VERSION = '4.1.7',
60
60
 
61
61
  // some constants for frequently used strings
62
62
  DIV = 'div',
@@ -1268,8 +1268,8 @@ defaultOptions = {
1268
1268
  global: {
1269
1269
  useUTC: true,
1270
1270
  //timezoneOffset: 0,
1271
- canvasToolsURL: 'http://code.highcharts.com/4.1.6/modules/canvas-tools.js',
1272
- VMLRadialGradientURL: 'http://code.highcharts.com/4.1.6/gfx/vml-radial-gradient.png'
1271
+ canvasToolsURL: 'http://code.highcharts.com/4.1.7/modules/canvas-tools.js',
1272
+ VMLRadialGradientURL: 'http://code.highcharts.com/4.1.7/gfx/vml-radial-gradient.png'
1273
1273
  },
1274
1274
  chart: {
1275
1275
  //animation: true,
@@ -2843,7 +2843,11 @@ SVGElement.prototype = {
2843
2843
  titleNode = doc.createElementNS(SVG_NS, 'title');
2844
2844
  this.element.appendChild(titleNode);
2845
2845
  }
2846
- titleNode.textContent = (String(pick(value), '')).replace(/<[^>]*>/g, ''); // #3276 #3895
2846
+ titleNode.appendChild(
2847
+ doc.createTextNode(
2848
+ (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895
2849
+ )
2850
+ );
2847
2851
  },
2848
2852
  textSetter: function (value) {
2849
2853
  if (value !== this.textStr) {
@@ -4035,17 +4039,22 @@ SVGRenderer.prototype = {
4035
4039
  * Utility to return the baseline offset and total line height from the font size
4036
4040
  */
4037
4041
  fontMetrics: function (fontSize, elem) {
4042
+ var lineHeight,
4043
+ baseline,
4044
+ style;
4045
+
4038
4046
  fontSize = fontSize || this.style.fontSize;
4039
4047
  if (elem && win.getComputedStyle) {
4040
4048
  elem = elem.element || elem; // SVGElement
4041
- fontSize = win.getComputedStyle(elem, "").fontSize;
4049
+ style = win.getComputedStyle(elem, "");
4050
+ fontSize = style && style.fontSize; // #4309, the style doesn't exist inside a hidden iframe in Firefox
4042
4051
  }
4043
4052
  fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;
4044
4053
 
4045
4054
  // Empirical values found by comparing font size and bounding box height.
4046
4055
  // Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
4047
- var lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2),
4048
- baseline = mathRound(lineHeight * 0.8);
4056
+ lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2);
4057
+ baseline = mathRound(lineHeight * 0.8);
4049
4058
 
4050
4059
  return {
4051
4060
  h: lineHeight,
@@ -4599,13 +4608,16 @@ extend(SVGRenderer.prototype, {
4599
4608
 
4600
4609
  // Ensure dynamically updating position when any parent is translated
4601
4610
  each(parents.reverse(), function (parentGroup) {
4602
- var htmlGroupStyle;
4611
+ var htmlGroupStyle,
4612
+ cls = attr(parentGroup.element, 'class');
4613
+
4614
+ if (cls) {
4615
+ cls = { className: cls };
4616
+ } // else null
4603
4617
 
4604
4618
  // Create a HTML div and append it to the parent div to emulate
4605
4619
  // the SVG group structure
4606
- htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
4607
- className: attr(parentGroup.element, 'class')
4608
- }, {
4620
+ htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, cls, {
4609
4621
  position: ABSOLUTE,
4610
4622
  left: (parentGroup.translateX || 0) + PX,
4611
4623
  top: (parentGroup.translateY || 0) + PX
@@ -5892,8 +5904,8 @@ Tick.prototype = {
5892
5904
  pxPos = xy.x,
5893
5905
  chartWidth = axis.chart.chartWidth,
5894
5906
  spacing = axis.chart.spacing,
5895
- leftBound = pick(axis.labelLeft, spacing[3]),
5896
- rightBound = pick(axis.labelRight, chartWidth - spacing[1]),
5907
+ leftBound = pick(axis.labelLeft, mathMin(axis.pos, spacing[3])),
5908
+ rightBound = pick(axis.labelRight, mathMax(axis.pos + axis.len, chartWidth - spacing[1])),
5897
5909
  label = this.label,
5898
5910
  rotation = this.rotation,
5899
5911
  factor = { left: 0, center: 0.5, right: 1 }[axis.labelAlign],
@@ -5903,7 +5915,8 @@ Tick.prototype = {
5903
5915
  goRight = 1,
5904
5916
  leftPos,
5905
5917
  rightPos,
5906
- textWidth;
5918
+ textWidth,
5919
+ css = {};
5907
5920
 
5908
5921
  // Check if the label overshoots the chart spacing box. If it does, move it.
5909
5922
  // If it now overshoots the slotWidth, add ellipsis.
@@ -5937,10 +5950,11 @@ Tick.prototype = {
5937
5950
  }
5938
5951
 
5939
5952
  if (textWidth) {
5940
- label.css({
5941
- width: textWidth,
5942
- textOverflow: 'ellipsis'
5943
- });
5953
+ css.width = textWidth;
5954
+ if (!axis.options.labels.style.textOverflow) {
5955
+ css.textOverflow = 'ellipsis';
5956
+ }
5957
+ label.css(css);
5944
5958
  }
5945
5959
  },
5946
5960
 
@@ -6818,7 +6832,7 @@ Axis.prototype = {
6818
6832
  // logic to the numberFormatter and enable it by a parameter.
6819
6833
  while (i-- && ret === UNDEFINED) {
6820
6834
  multi = Math.pow(1000, i + 1);
6821
- if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
6835
+ if (numericSymbolDetector >= multi && (value * 10) % multi === 0 && numericSymbols[i] !== null) {
6822
6836
  ret = Highcharts.numberFormat(value / multi, -1) + numericSymbols[i];
6823
6837
  }
6824
6838
  }
@@ -6826,7 +6840,7 @@ Axis.prototype = {
6826
6840
 
6827
6841
  if (ret === UNDEFINED) {
6828
6842
  if (mathAbs(value) >= 10000) { // add thousands separators
6829
- ret = Highcharts.numberFormat(value, 0);
6843
+ ret = Highcharts.numberFormat(value, -1);
6830
6844
 
6831
6845
  } else { // small numbers
6832
6846
  ret = Highcharts.numberFormat(value, -1, UNDEFINED, ''); // #2466
@@ -7841,12 +7855,15 @@ Axis.prototype = {
7841
7855
  */
7842
7856
  getThreshold: function (threshold) {
7843
7857
  var axis = this,
7844
- isLog = axis.isLog;
7845
-
7846
- var realMin = isLog ? lin2log(axis.min) : axis.min,
7858
+ isLog = axis.isLog,
7859
+ realMin = isLog ? lin2log(axis.min) : axis.min,
7847
7860
  realMax = isLog ? lin2log(axis.max) : axis.max;
7848
7861
 
7849
- if (realMin > threshold || threshold === null) {
7862
+ // With a threshold of null, make the columns/areas rise from the top or bottom
7863
+ // depending on the value, assuming an actual threshold of 0 (#4233).
7864
+ if (threshold === null) {
7865
+ threshold = realMax < 0 ? realMax : realMin;
7866
+ } else if (realMin > threshold) {
7850
7867
  threshold = realMin;
7851
7868
  } else if (realMax < threshold) {
7852
7869
  threshold = realMax;
@@ -7951,6 +7968,7 @@ Axis.prototype = {
7951
7968
  innerWidth = mathMax(1, mathRound(slotWidth - 2 * (labelOptions.padding || 5))),
7952
7969
  attr = {},
7953
7970
  labelMetrics = renderer.fontMetrics(labelOptions.style.fontSize, ticks[0] && ticks[0].label),
7971
+ textOverflowOption = labelOptions.style.textOverflow,
7954
7972
  css,
7955
7973
  labelLength = 0,
7956
7974
  label,
@@ -7984,20 +8002,24 @@ Axis.prototype = {
7984
8002
  // Handle word-wrap or ellipsis on vertical axis
7985
8003
  } else if (slotWidth) {
7986
8004
  // For word-wrap or ellipsis
7987
- css = { width: innerWidth + PX, textOverflow: 'clip' };
7988
-
7989
- // On vertical axis, only allow word wrap if there is room for more lines.
7990
- i = tickPositions.length;
7991
- while (!horiz && i--) {
7992
- pos = tickPositions[i];
7993
- label = ticks[pos].label;
7994
- if (label) {
7995
- // Reset ellipsis in order to get the correct bounding box (#4070)
7996
- if (label.styles.textOverflow === 'ellipsis') {
7997
- label.css({ textOverflow: 'clip' });
7998
- }
7999
- if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {
8000
- label.specCss = { textOverflow: 'ellipsis' };
8005
+ css = { width: innerWidth + PX };
8006
+
8007
+ if (!textOverflowOption) {
8008
+ css.textOverflow = 'clip';
8009
+
8010
+ // On vertical axis, only allow word wrap if there is room for more lines.
8011
+ i = tickPositions.length;
8012
+ while (!horiz && i--) {
8013
+ pos = tickPositions[i];
8014
+ label = ticks[pos].label;
8015
+ if (label) {
8016
+ // Reset ellipsis in order to get the correct bounding box (#4070)
8017
+ if (label.styles.textOverflow === 'ellipsis') {
8018
+ label.css({ textOverflow: 'clip' });
8019
+ }
8020
+ if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {
8021
+ label.specCss = { textOverflow: 'ellipsis' };
8022
+ }
8001
8023
  }
8002
8024
  }
8003
8025
  }
@@ -8007,9 +8029,11 @@ Axis.prototype = {
8007
8029
  // Add ellipsis if the label length is significantly longer than ideal
8008
8030
  if (attr.rotation) {
8009
8031
  css = {
8010
- width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX,
8011
- textOverflow: 'ellipsis'
8032
+ width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX
8012
8033
  };
8034
+ if (!textOverflowOption) {
8035
+ css.textOverflow = 'ellipsis';
8036
+ }
8013
8037
  }
8014
8038
 
8015
8039
  // Set the explicit or automatic label alignment
@@ -8033,6 +8057,13 @@ Axis.prototype = {
8033
8057
  this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side === 2);
8034
8058
  },
8035
8059
 
8060
+ /**
8061
+ * Return true if the axis has associated data
8062
+ */
8063
+ hasData: function () {
8064
+ return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);
8065
+ },
8066
+
8036
8067
  /**
8037
8068
  * Render the tick labels to a preliminary position to get their sizes
8038
8069
  */
@@ -8057,12 +8088,13 @@ Axis.prototype = {
8057
8088
  labelOffsetPadded,
8058
8089
  axisOffset = chart.axisOffset,
8059
8090
  clipOffset = chart.clipOffset,
8091
+ clip,
8060
8092
  directionFactor = [-1, 1, 1, -1][side],
8061
8093
  n,
8062
8094
  lineHeightCorrection;
8063
8095
 
8064
8096
  // For reuse in Axis.render
8065
- axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
8097
+ hasData = axis.hasData();
8066
8098
  axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
8067
8099
 
8068
8100
  // Set/reset staggerLines
@@ -8165,7 +8197,13 @@ Axis.prototype = {
8165
8197
  axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,
8166
8198
  labelOffsetPadded // #3027
8167
8199
  );
8168
- clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
8200
+
8201
+ // Decide the clipping needed to keep the graph inside the plot area and axis lines
8202
+ clip = mathFloor(options.lineWidth / 2) * 2;
8203
+ if (options.offset) {
8204
+ clip = mathMax(0, clip - options.offset);
8205
+ }
8206
+ clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], clip);
8169
8207
  },
8170
8208
 
8171
8209
  /**
@@ -8264,7 +8302,6 @@ Axis.prototype = {
8264
8302
  linePath,
8265
8303
  hasRendered = chart.hasRendered,
8266
8304
  slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
8267
- hasData = axis.hasData,
8268
8305
  showAxis = axis.showAxis,
8269
8306
  from,
8270
8307
  to;
@@ -8283,7 +8320,7 @@ Axis.prototype = {
8283
8320
  });
8284
8321
 
8285
8322
  // If the series has data draw the ticks. Else only the line and title
8286
- if (hasData || isLinked) {
8323
+ if (axis.hasData() || isLinked) {
8287
8324
 
8288
8325
  // minor ticks
8289
8326
  if (axis.minorTickInterval && !axis.categories) {
@@ -10966,8 +11003,20 @@ Legend.prototype = {
10966
11003
  arrowSize = navOptions.arrowSize || 12,
10967
11004
  nav = this.nav,
10968
11005
  pages = this.pages,
11006
+ padding = this.padding,
10969
11007
  lastY,
10970
- allItems = this.allItems;
11008
+ allItems = this.allItems,
11009
+ clipToHeight = function (height) {
11010
+ clipRect.attr({
11011
+ height: height
11012
+ });
11013
+
11014
+ // useHTML
11015
+ if (legend.contentGroup.div) {
11016
+ legend.contentGroup.div.style.clip = 'rect(' + padding + 'px,9999px,' + (padding + height) + 'px,0)';
11017
+ }
11018
+ };
11019
+
10971
11020
 
10972
11021
  // Adjust the height
10973
11022
  if (options.layout === 'horizontal') {
@@ -10979,9 +11028,9 @@ Legend.prototype = {
10979
11028
 
10980
11029
  // Reset the legend height and adjust the clipping rectangle
10981
11030
  pages.length = 0;
10982
- if (legendHeight > spaceHeight && !options.useHTML) {
11031
+ if (legendHeight > spaceHeight) {
10983
11032
 
10984
- this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - this.padding, 0);
11033
+ this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - padding, 0);
10985
11034
  this.currentPage = pick(this.currentPage, 1);
10986
11035
  this.fullHeight = legendHeight;
10987
11036
 
@@ -11007,13 +11056,12 @@ Legend.prototype = {
11007
11056
 
11008
11057
  // Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
11009
11058
  if (!clipRect) {
11010
- clipRect = legend.clipRect = renderer.clipRect(0, this.padding, 9999, 0);
11059
+ clipRect = legend.clipRect = renderer.clipRect(0, padding, 9999, 0);
11011
11060
  legend.contentGroup.clip(clipRect);
11012
11061
  }
11013
- clipRect.attr({
11014
- height: clipHeight
11015
- });
11016
-
11062
+
11063
+ clipToHeight(clipHeight);
11064
+
11017
11065
  // Add navigation elements
11018
11066
  if (!nav) {
11019
11067
  this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
@@ -11038,9 +11086,7 @@ Legend.prototype = {
11038
11086
  legendHeight = spaceHeight;
11039
11087
 
11040
11088
  } else if (nav) {
11041
- clipRect.attr({
11042
- height: chart.chartHeight
11043
- });
11089
+ clipToHeight(chart.chartHeight);
11044
11090
  nav.hide();
11045
11091
  this.scrollGroup.attr({
11046
11092
  translateY: 1
@@ -12911,7 +12957,9 @@ Point.prototype = {
12911
12957
  if (eventType === 'click' && seriesOptions.allowPointSelect) {
12912
12958
  defaultFunction = function (event) {
12913
12959
  // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
12914
- point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
12960
+ if (point.select) { // Could be destroyed by prior event handlers (#2911)
12961
+ point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
12962
+ }
12915
12963
  };
12916
12964
  }
12917
12965
 
@@ -13299,7 +13347,9 @@ Series.prototype = {
13299
13347
  // cheaper, allows animation, and keeps references to points.
13300
13348
  if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData && series.visible) {
13301
13349
  each(data, function (point, i) {
13302
- oldData[i].update(point, false, null, false);
13350
+ if (oldData[i].update) { // Linked, previously hidden series (#3709)
13351
+ oldData[i].update(point, false, null, false);
13352
+ }
13303
13353
  });
13304
13354
 
13305
13355
  } else {
@@ -15260,7 +15310,7 @@ extend(Point.prototype, {
15260
15310
  if (options && options.marker && options.marker.symbol) {
15261
15311
  point.graphic = graphic.destroy();
15262
15312
  } else {
15263
- graphic.attr(point.pointAttr[point.state || ''])[point.visible ? 'show' : 'hide'](true); // #2430
15313
+ graphic.attr(point.pointAttr[point.state || ''])[point.visible === false ? 'hide' : 'show'](); // #2430
15264
15314
  }
15265
15315
  }
15266
15316
  if (options && options.dataLabels && point.dataLabel) { // #2468
@@ -15561,7 +15611,7 @@ extend(Axis.prototype, {
15561
15611
  newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);
15562
15612
 
15563
15613
  this.destroy(true);
15564
- this._addedPlotLB = UNDEFINED; // #1611, #2887
15614
+ this._addedPlotLB = this.chart._labelPanes = UNDEFINED; // #1611, #2887, #4314
15565
15615
 
15566
15616
  this.init(chart, extend(newOptions, { events: UNDEFINED }));
15567
15617
 
@@ -16491,6 +16541,11 @@ var PiePoint = extendClass(Point, {
16491
16541
  if (point.legendItem) {
16492
16542
  chart.legend.colorizeItem(point, vis);
16493
16543
  }
16544
+
16545
+ // #4170, hide halo after hiding point
16546
+ if (!vis && point.state === 'hover') {
16547
+ point.setState('');
16548
+ }
16494
16549
 
16495
16550
  // Handle ignore hidden slices
16496
16551
  if (ignoreHiddenPoint) {
@@ -17625,7 +17680,7 @@ if (seriesTypes.column) {
17625
17680
 
17626
17681
 
17627
17682
  /**
17628
- * Highcharts JS v4.1.6 (2015-06-12)
17683
+ * Highcharts JS v4.1.7 (2015-06-26)
17629
17684
  * Highcharts module to hide overlapping data labels. This module is included by default in Highmaps.
17630
17685
  *
17631
17686
  * (c) 2010-2014 Torstein Honsi
@@ -18149,17 +18204,20 @@ extend(Point.prototype, {
18149
18204
  hoverPoint.onMouseOut();
18150
18205
  }
18151
18206
 
18152
- // trigger the event
18153
- point.firePointEvent('mouseOver');
18207
+ if (point.series) { // It may have been destroyed, #4130
18154
18208
 
18155
- // update the tooltip
18156
- if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
18157
- tooltip.refresh(point, e);
18158
- }
18209
+ // trigger the event
18210
+ point.firePointEvent('mouseOver');
18159
18211
 
18160
- // hover this
18161
- point.setState(HOVER_STATE);
18162
- chart.hoverPoint = point;
18212
+ // update the tooltip
18213
+ if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
18214
+ tooltip.refresh(point, e);
18215
+ }
18216
+
18217
+ // hover this
18218
+ point.setState(HOVER_STATE);
18219
+ chart.hoverPoint = point;
18220
+ }
18163
18221
  },
18164
18222
 
18165
18223
  /**
@@ -18296,6 +18354,7 @@ extend(Point.prototype, {
18296
18354
 
18297
18355
  if (stateMarkerGraphic) {
18298
18356
  stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
18357
+ stateMarkerGraphic.element.point = point; // #4310
18299
18358
  }
18300
18359
  }
18301
18360