highcharts-rails 4.0.4.1 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  */