highcharts-rails 4.0.4.1 → 4.1.0

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.
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v4.0.4 (2014-09-02)
5
+ * @license Highcharts JS v4.1.0 (2015-02-16)
6
6
  *
7
7
  * (c) 2009-2014 Torstein Honsi
8
8
  *
@@ -72,13 +72,16 @@ extend(Pane.prototype, {
72
72
  // push them to the first axis' plot bands and borrow the existing logic there.
73
73
  if (backgroundOption) {
74
74
  each([].concat(splat(backgroundOption)).reverse(), function (config) {
75
- var backgroundColor = config.backgroundColor; // if defined, replace the old one (specific for gradients)
75
+ var backgroundColor = config.backgroundColor, // if defined, replace the old one (specific for gradients)
76
+ axisUserOptions = firstAxis.userOptions;
76
77
  config = merge(pane.defaultBackgroundOptions, config);
77
78
  if (backgroundColor) {
78
79
  config.backgroundColor = backgroundColor;
79
80
  }
80
81
  config.color = config.backgroundColor; // due to naming in plotBands
81
82
  firstAxis.options.plotBands.unshift(config);
83
+ axisUserOptions.plotBands = axisUserOptions.plotBands || []; // #3176
84
+ axisUserOptions.plotBands.unshift(config);
82
85
  });
83
86
  }
84
87
  },
@@ -371,6 +374,10 @@ var radialAxisMixin = {
371
374
 
372
375
  // Circular grid bands
373
376
  } else {
377
+
378
+ // Keep within bounds
379
+ from = Math.max(from, this.min);
380
+ to = Math.min(to, this.max);
374
381
 
375
382
  // Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from
376
383
  if (!isCircular) {
@@ -403,14 +410,14 @@ var radialAxisMixin = {
403
410
  radii[0],
404
411
  radii[0],
405
412
  {
406
- start: start,
407
- end: end,
413
+ start: Math.min(start, end), // Math is for reversed yAxis (#3606)
414
+ end: Math.max(start, end),
408
415
  innerR: pick(radii[1], radii[0] - radii[2]),
409
416
  open: open
410
417
  }
411
418
  );
412
419
  }
413
-
420
+
414
421
  return ret;
415
422
  },
416
423
 
@@ -575,6 +582,7 @@ wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, label
575
582
  var axis = this.axis,
576
583
  optionsY = labelOptions.y,
577
584
  ret,
585
+ centerSlot = 20, // 20 degrees to each side at the top and bottom
578
586
  align = labelOptions.align,
579
587
  angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
580
588
 
@@ -595,9 +603,12 @@ wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, label
595
603
  // Automatic alignment
596
604
  if (align === null) {
597
605
  if (axis.isCircular) {
598
- if (angle > 20 && angle < 160) {
606
+ if (this.label.getBBox().width > axis.len * axis.tickInterval / (axis.max - axis.min)) { // #3506
607
+ centerSlot = 0;
608
+ }
609
+ if (angle > centerSlot && angle < 180 - centerSlot) {
599
610
  align = 'left'; // right hemisphere
600
- } else if (angle > 200 && angle < 340) {
611
+ } else if (angle > 180 + centerSlot && angle < 360 - centerSlot) {
601
612
  align = 'right'; // left hemisphere
602
613
  } else {
603
614
  align = 'center'; // top or bottom
@@ -682,6 +693,20 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
682
693
  return [point.low, point.high];
683
694
  },
684
695
  pointValKey: 'low',
696
+ deferTranslatePolar: true,
697
+
698
+ /**
699
+ * Translate a point's plotHigh from the internal angle and radius measures to
700
+ * true plotHigh coordinates. This is an addition of the toXY method found in
701
+ * Polar.js, because it runs too early for arearanges to be considered (#3419).
702
+ */
703
+ highToXY: function (point) {
704
+ // Find the polar plotX and plotY
705
+ var chart = this.chart,
706
+ xy = this.xAxis.postTranslate(point.rectPlotX, this.yAxis.len - point.plotHigh);
707
+ point.plotHighX = xy.x - chart.plotLeft;
708
+ point.plotHigh = xy.y - chart.plotTop;
709
+ },
685
710
 
686
711
  /**
687
712
  * Extend getSegments to force null points if the higher value is null. #1703.
@@ -728,6 +753,13 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
728
753
  point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
729
754
  }
730
755
  });
756
+
757
+ // Postprocess plotHigh
758
+ if (this.chart.polar) {
759
+ each(this.points, function (point) {
760
+ series.highToXY(point);
761
+ });
762
+ }
731
763
  },
732
764
 
733
765
  /**
@@ -757,7 +789,7 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
757
789
  point = segment[i];
758
790
  if (point.plotHigh !== null) {
759
791
  highSegment.push({
760
- plotX: point.plotX,
792
+ plotX: point.plotHighX || point.plotX, // plotHighX is for polar charts
761
793
  plotY: point.plotHigh
762
794
  });
763
795
  }
@@ -778,7 +810,9 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
778
810
  linePath = [].concat(lowerPath, higherPath);
779
811
 
780
812
  // For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
781
- higherPath[0] = 'L'; // this probably doesn't work for spline
813
+ if (!this.chart.polar) {
814
+ higherPath[0] = 'L'; // this probably doesn't work for spline
815
+ }
782
816
  this.areaPath = this.areaPath.concat(lowerPath, higherPath);
783
817
 
784
818
  return linePath;
@@ -870,6 +904,8 @@ seriesTypes.arearange = extendClass(seriesTypes.area, {
870
904
  seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);
871
905
  },
872
906
 
907
+ setStackedPoints: noop,
908
+
873
909
  getSymbol: noop,
874
910
 
875
911
  drawPoints: noop
@@ -967,9 +1003,6 @@ defaultPlotOptions.gauge = merge(defaultPlotOptions.line, {
967
1003
  borderColor: 'silver',
968
1004
  borderRadius: 3,
969
1005
  crop: false,
970
- style: {
971
- fontWeight: 'bold'
972
- },
973
1006
  verticalAlign: 'top',
974
1007
  zIndex: 2
975
1008
  },
@@ -1213,7 +1246,7 @@ defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
1213
1246
  //stemWidth: null,
1214
1247
  threshold: null,
1215
1248
  tooltip: {
1216
- pointFormat: '<span style="color:{series.color}">\u25CF</span> <b> {series.name}</b><br/>' +
1249
+ pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' + // docs
1217
1250
  'Maximum: {point.high}<br/>' +
1218
1251
  'Upper quartile: {point.q3}<br/>' +
1219
1252
  'Median: {point.median}<br/>' +
@@ -1340,8 +1373,6 @@ seriesTypes.boxplot = extendClass(seriesTypes.column, {
1340
1373
  // Median attributes
1341
1374
  medianAttr.stroke = point.medianColor || options.medianColor || color;
1342
1375
  medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);
1343
- medianAttr['stroke-linecap'] = 'round'; // #1638
1344
-
1345
1376
 
1346
1377
  // The stem
1347
1378
  crispCorr = (stemAttr['stroke-width'] % 2) / 2;
@@ -1474,7 +1505,7 @@ defaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {
1474
1505
  grouping: false,
1475
1506
  linkedTo: ':previous',
1476
1507
  tooltip: {
1477
- pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
1508
+ pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>' // docs
1478
1509
  },
1479
1510
  whiskerWidth: null
1480
1511
  });
@@ -1513,6 +1544,9 @@ defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
1513
1544
  lineColor: '#333',
1514
1545
  dashStyle: 'dot',
1515
1546
  borderColor: '#333',
1547
+ dataLabels: {
1548
+ inside: true
1549
+ },
1516
1550
  states: {
1517
1551
  hover: {
1518
1552
  lineWidthPlus: 0 // #3126
@@ -1531,17 +1565,6 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1531
1565
 
1532
1566
  pointValKey: 'y',
1533
1567
 
1534
- /**
1535
- * Init waterfall series, force stacking
1536
- */
1537
- init: function (chart, options) {
1538
- // force stacking
1539
- options.stacking = true;
1540
-
1541
- seriesTypes.column.prototype.init.call(this, chart, options);
1542
- },
1543
-
1544
-
1545
1568
  /**
1546
1569
  * Translate data points from raw values
1547
1570
  */
@@ -1556,10 +1579,12 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1556
1579
  shapeArgs,
1557
1580
  stack,
1558
1581
  y,
1582
+ yValue,
1559
1583
  previousY,
1560
1584
  previousIntermediate,
1561
- stackPoint,
1585
+ range,
1562
1586
  threshold = options.threshold,
1587
+ stacking = options.stacking,
1563
1588
  tooltipY;
1564
1589
 
1565
1590
  // run column series translate
@@ -1571,35 +1596,38 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1571
1596
  for (i = 0, len = points.length; i < len; i++) {
1572
1597
  // cache current point object
1573
1598
  point = points[i];
1599
+ yValue = this.processedYData[i];
1574
1600
  shapeArgs = point.shapeArgs;
1575
1601
 
1576
1602
  // get current stack
1577
- stack = series.getStack(i);
1578
- stackPoint = stack.points[series.index + ',' + i];
1603
+ stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey];
1604
+ range = stack ?
1605
+ stack[point.x].points[series.index + ',' + i] :
1606
+ [0, yValue];
1579
1607
 
1580
1608
  // override point value for sums
1581
- if (isNaN(point.y)) {
1582
- point.y = series.yData[i];
1609
+ if (point.isSum || point.isIntermediateSum) { // #3710 Update point does not propagate to sum
1610
+ point.y = yValue;
1583
1611
  }
1584
1612
 
1585
1613
  // up points
1586
- y = mathMax(previousY, previousY + point.y) + stackPoint[0];
1614
+ y = mathMax(previousY, previousY + point.y) + range[0];
1587
1615
  shapeArgs.y = yAxis.translate(y, 0, 1);
1588
1616
 
1589
1617
 
1590
1618
  // sum points
1591
1619
  if (point.isSum) {
1592
- shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
1593
- shapeArgs.height = yAxis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
1620
+ shapeArgs.y = yAxis.translate(range[1], 0, 1);
1621
+ shapeArgs.height = yAxis.translate(range[0], 0, 1) - shapeArgs.y;
1594
1622
 
1595
1623
  } else if (point.isIntermediateSum) {
1596
- shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
1624
+ shapeArgs.y = yAxis.translate(range[1], 0, 1);
1597
1625
  shapeArgs.height = yAxis.translate(previousIntermediate, 0, 1) - shapeArgs.y;
1598
- previousIntermediate = stackPoint[1];
1626
+ previousIntermediate = range[1];
1599
1627
 
1600
1628
  // if it's not the sum point, update previous stack end position
1601
1629
  } else {
1602
- previousY += stack.total;
1630
+ previousY += yValue;
1603
1631
  }
1604
1632
 
1605
1633
  // negative points
@@ -1630,7 +1658,7 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1630
1658
  var series = this,
1631
1659
  options = series.options,
1632
1660
  yData = series.yData,
1633
- points = series.points,
1661
+ points = series.options.data, // #3710 Update point does not propagate to sum
1634
1662
  point,
1635
1663
  dataLength = yData.length,
1636
1664
  threshold = options.threshold || 0,
@@ -1697,9 +1725,16 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1697
1725
  seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
1698
1726
 
1699
1727
  each(series.points, function (point) {
1700
- if (point.y > 0 && !point.color) {
1701
- point.pointAttr = seriesDownPointAttr;
1702
- point.color = upColor;
1728
+ if (!point.options.color) {
1729
+ // Up color
1730
+ if (point.y > 0) {
1731
+ point.pointAttr = seriesDownPointAttr;
1732
+ point.color = upColor;
1733
+
1734
+ // Down color (#3710, update to negative)
1735
+ } else {
1736
+ point.pointAttr = series.pointAttr;
1737
+ }
1703
1738
  }
1704
1739
  });
1705
1740
  },
@@ -1748,27 +1783,34 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
1748
1783
  */
1749
1784
  getExtremes: noop,
1750
1785
 
1751
- /**
1752
- * Return stack for given index
1753
- */
1754
- getStack: function (i) {
1755
- var axis = this.yAxis,
1756
- stacks = axis.stacks,
1757
- key = this.stackKey;
1758
-
1759
- if (this.processedYData[i] < this.options.threshold) {
1760
- key = '-' + key;
1761
- }
1762
-
1763
- return stacks[key][i];
1764
- },
1765
-
1766
1786
  drawGraph: Series.prototype.drawGraph
1767
1787
  });
1768
1788
 
1769
1789
  /* ****************************************************************************
1770
1790
  * End Waterfall series code *
1771
1791
  *****************************************************************************/
1792
+ /**
1793
+ * Set the default options for polygon
1794
+ */
1795
+ defaultPlotOptions.polygon = merge(defaultPlotOptions.scatter, {
1796
+ marker: {
1797
+ enabled: false
1798
+ }
1799
+ });
1800
+
1801
+ /**
1802
+ * The polygon series class
1803
+ */
1804
+ seriesTypes.polygon = extendClass(seriesTypes.scatter, {
1805
+ type: 'polygon',
1806
+ fillGraph: true,
1807
+ // Close all segments
1808
+ getSegmentPath: function (segment) {
1809
+ return Series.prototype.getSegmentPath.call(this, segment).concat('z');
1810
+ },
1811
+ drawGraph: Series.prototype.drawGraph,
1812
+ drawLegendSymbol: Highcharts.LegendSymbolMixin.drawRectangle
1813
+ });
1772
1814
  /* ****************************************************************************
1773
1815
  * Start Bubble series code *
1774
1816
  *****************************************************************************/
@@ -1780,10 +1822,6 @@ defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
1780
1822
  return this.point.z;
1781
1823
  },
1782
1824
  inside: true,
1783
- style: {
1784
- color: 'white',
1785
- textShadow: '0px 0px 3px black'
1786
- },
1787
1825
  verticalAlign: 'middle'
1788
1826
  },
1789
1827
  // displayNegative: true,
@@ -1807,13 +1845,15 @@ defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
1807
1845
  pointFormat: '({point.x}, {point.y}), Size: {point.z}'
1808
1846
  },
1809
1847
  turboThreshold: 0,
1810
- zThreshold: 0
1848
+ zThreshold: 0,
1849
+ zoneAxis: 'z'
1811
1850
  });
1812
1851
 
1813
1852
  var BubblePoint = extendClass(Point, {
1814
1853
  haloPath: function () {
1815
1854
  return Point.prototype.haloPath.call(this, this.shapeArgs.r + this.series.options.states.hover.halo.size);
1816
- }
1855
+ },
1856
+ ttBelow: false
1817
1857
  });
1818
1858
 
1819
1859
  // 2 - Create the series object
@@ -1824,6 +1864,7 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
1824
1864
  parallelArrays: ['x', 'y', 'z'],
1825
1865
  trackerGroups: ['group', 'dataLabelsGroup'],
1826
1866
  bubblePadding: true,
1867
+ zoneAxis: 'z',
1827
1868
 
1828
1869
  /**
1829
1870
  * Mapping between SVG attributes and the corresponding options
@@ -1936,9 +1977,6 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
1936
1977
  while (i--) {
1937
1978
  point = data[i];
1938
1979
  radius = radii ? radii[i] : 0; // #1737
1939
-
1940
- // Flag for negativeColor to be applied in Series.js
1941
- point.negative = point.z < (this.options.zThreshold || 0);
1942
1980
 
1943
1981
  if (radius >= this.minPxSize / 2) {
1944
1982
  // Shape arguments
@@ -1981,9 +2019,11 @@ seriesTypes.bubble = extendClass(seriesTypes.scatter, {
1981
2019
  item.legendSymbol.isMarker = true;
1982
2020
 
1983
2021
  },
1984
-
2022
+
1985
2023
  drawPoints: seriesTypes.column.prototype.drawPoints,
1986
- alignDataLabel: seriesTypes.column.prototype.alignDataLabel
2024
+ alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
2025
+ buildKDTree: noop,
2026
+ applyZones: noop
1987
2027
  });
1988
2028
 
1989
2029
  /**
@@ -2008,78 +2048,76 @@ Axis.prototype.beforePadding = function () {
2008
2048
  activeSeries = [];
2009
2049
 
2010
2050
  // Handle padding on the second pass, or on redraw
2011
- if (this.tickPositions) {
2012
- each(this.series, function (series) {
2051
+ each(this.series, function (series) {
2013
2052
 
2014
- var seriesOptions = series.options,
2015
- zData;
2053
+ var seriesOptions = series.options,
2054
+ zData;
2016
2055
 
2017
- if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
2056
+ if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
2018
2057
 
2019
- // Correction for #1673
2020
- axis.allowZoomOutside = true;
2058
+ // Correction for #1673
2059
+ axis.allowZoomOutside = true;
2021
2060
 
2022
- // Cache it
2023
- activeSeries.push(series);
2061
+ // Cache it
2062
+ activeSeries.push(series);
2024
2063
 
2025
- if (isXAxis) { // because X axis is evaluated first
2026
-
2027
- // For each series, translate the size extremes to pixel values
2028
- each(['minSize', 'maxSize'], function (prop) {
2029
- var length = seriesOptions[prop],
2030
- isPercent = /%$/.test(length);
2031
-
2032
- length = pInt(length);
2033
- extremes[prop] = isPercent ?
2034
- smallestSize * length / 100 :
2035
- length;
2036
-
2037
- });
2038
- series.minPxSize = extremes.minSize;
2064
+ if (isXAxis) { // because X axis is evaluated first
2065
+
2066
+ // For each series, translate the size extremes to pixel values
2067
+ each(['minSize', 'maxSize'], function (prop) {
2068
+ var length = seriesOptions[prop],
2069
+ isPercent = /%$/.test(length);
2039
2070
 
2040
- // Find the min and max Z
2041
- zData = series.zData;
2042
- if (zData.length) { // #1735
2043
- zMin = pick(seriesOptions.zMin, math.min(
2044
- zMin,
2045
- math.max(
2046
- arrayMin(zData),
2047
- seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
2048
- )
2049
- ));
2050
- zMax = pick(seriesOptions.zMax, math.max(zMax, arrayMax(zData)));
2051
- }
2071
+ length = pInt(length);
2072
+ extremes[prop] = isPercent ?
2073
+ smallestSize * length / 100 :
2074
+ length;
2075
+
2076
+ });
2077
+ series.minPxSize = extremes.minSize;
2078
+
2079
+ // Find the min and max Z
2080
+ zData = series.zData;
2081
+ if (zData.length) { // #1735
2082
+ zMin = pick(seriesOptions.zMin, math.min(
2083
+ zMin,
2084
+ math.max(
2085
+ arrayMin(zData),
2086
+ seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
2087
+ )
2088
+ ));
2089
+ zMax = pick(seriesOptions.zMax, math.max(zMax, arrayMax(zData)));
2052
2090
  }
2053
2091
  }
2054
- });
2092
+ }
2093
+ });
2055
2094
 
2056
- each(activeSeries, function (series) {
2095
+ each(activeSeries, function (series) {
2057
2096
 
2058
- var data = series[dataKey],
2059
- i = data.length,
2060
- radius;
2097
+ var data = series[dataKey],
2098
+ i = data.length,
2099
+ radius;
2061
2100
 
2062
- if (isXAxis) {
2063
- series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
2064
- }
2065
-
2066
- if (range > 0) {
2067
- while (i--) {
2068
- if (typeof data[i] === 'number') {
2069
- radius = series.radii[i];
2070
- pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
2071
- pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
2072
- }
2101
+ if (isXAxis) {
2102
+ series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
2103
+ }
2104
+
2105
+ if (range > 0) {
2106
+ while (i--) {
2107
+ if (typeof data[i] === 'number') {
2108
+ radius = series.radii[i];
2109
+ pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
2110
+ pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
2073
2111
  }
2074
2112
  }
2075
- });
2076
-
2077
- if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
2078
- pxMax -= axisLength;
2079
- transA *= (axisLength + pxMin - pxMax) / axisLength;
2080
- this.min += pxMin / transA;
2081
- this.max += pxMax / transA;
2082
2113
  }
2114
+ });
2115
+
2116
+ if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
2117
+ pxMax -= axisLength;
2118
+ transA *= (axisLength + pxMin - pxMax) / axisLength;
2119
+ this.min += pxMin / transA;
2120
+ this.max += pxMax / transA;
2083
2121
  }
2084
2122
  };
2085
2123
 
@@ -2099,6 +2137,36 @@ Axis.prototype.beforePadding = function () {
2099
2137
  pointerProto = Pointer.prototype,
2100
2138
  colProto;
2101
2139
 
2140
+ seriesProto.searchPolarPoint = function (e) {
2141
+ var series = this,
2142
+ chart = series.chart,
2143
+ xAxis = series.xAxis,
2144
+ center = xAxis.pane.center,
2145
+ plotX = e.chartX - center[0] - chart.plotLeft,
2146
+ plotY = e.chartY - center[1] - chart.plotTop;
2147
+
2148
+ this.kdAxisArray = ['clientX'];
2149
+ e = {
2150
+ clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))
2151
+ };
2152
+ return this.searchKDTree(e);
2153
+
2154
+ };
2155
+
2156
+ wrap(seriesProto, 'buildKDTree', function (proceed) {
2157
+ if (this.chart.polar) {
2158
+ this.kdAxisArray = ['clientX'];
2159
+ }
2160
+ proceed.apply(this);
2161
+ });
2162
+
2163
+ wrap(seriesProto, 'searchPoint', function (proceed, e) {
2164
+ if (this.chart.polar) {
2165
+ return this.searchPolarPoint(e);
2166
+ } else {
2167
+ return proceed.call(this, e);
2168
+ }
2169
+ });
2102
2170
  /**
2103
2171
  * Translate a point's plotX and plotY from the internal angle and radius measures to
2104
2172
  * true plotX, plotY coordinates
@@ -2128,25 +2196,6 @@ Axis.prototype.beforePadding = function () {
2128
2196
  point.plotY = point.polarPlotY = xy.y - chart.plotTop;
2129
2197
  };
2130
2198
 
2131
- /**
2132
- * Order the tooltip points to get the mouse capture ranges correct. #1915.
2133
- */
2134
- seriesProto.orderTooltipPoints = function (points) {
2135
- if (this.chart.polar) {
2136
- points.sort(function (a, b) {
2137
- return a.clientX - b.clientX;
2138
- });
2139
-
2140
- // Wrap mouse tracking around to capture movement on the segment to the left
2141
- // of the north point (#1469, #2093).
2142
- if (points[0]) {
2143
- points[0].wrappedClientX = points[0].clientX + 360;
2144
- points.push(points[0]);
2145
- }
2146
- }
2147
- };
2148
-
2149
-
2150
2199
  /**
2151
2200
  * Add some special init logic to areas and areasplines
2152
2201
  */
@@ -2173,6 +2222,7 @@ Axis.prototype.beforePadding = function () {
2173
2222
  }
2174
2223
  }
2175
2224
 
2225
+
2176
2226
  if (seriesTypes.area) {
2177
2227
  wrap(seriesTypes.area.prototype, 'init', initArea);
2178
2228
  }
@@ -2392,21 +2442,6 @@ Axis.prototype.beforePadding = function () {
2392
2442
  // Define the animate method for regular series
2393
2443
  wrap(seriesProto, 'animate', polarAnimate);
2394
2444
 
2395
- /**
2396
- * Throw in a couple of properties to let setTooltipPoints know we're indexing the points
2397
- * in degrees (0-360), not plot pixel width.
2398
- */
2399
- wrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {
2400
-
2401
- if (this.chart.polar) {
2402
- extend(this.xAxis, {
2403
- tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
2404
- });
2405
- }
2406
- // Run uber method
2407
- return proceed.call(this, renew);
2408
- });
2409
-
2410
2445
 
2411
2446
  if (seriesTypes.column) {
2412
2447
 
@@ -2507,33 +2542,6 @@ Axis.prototype.beforePadding = function () {
2507
2542
  });
2508
2543
  }
2509
2544
 
2510
-
2511
- /**
2512
- * Extend the mouse tracker to return the tooltip position index in terms of
2513
- * degrees rather than pixels
2514
- */
2515
- wrap(pointerProto, 'getIndex', function (proceed, e) {
2516
- var ret,
2517
- chart = this.chart,
2518
- center,
2519
- x,
2520
- y;
2521
-
2522
- if (chart.polar) {
2523
- center = chart.xAxis[0].center;
2524
- x = e.chartX - center[0] - chart.plotLeft;
2525
- y = e.chartY - center[1] - chart.plotTop;
2526
-
2527
- ret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);
2528
-
2529
- } else {
2530
-
2531
- // Run uber method
2532
- ret = proceed.call(this, e);
2533
- }
2534
- return ret;
2535
- });
2536
-
2537
2545
  /**
2538
2546
  * Extend getCoordinates to prepare for polar axis values
2539
2547
  */