highcharts-rails 2.2.1 → 2.2.2

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.
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ ## 2.2.2 (2012-04-26)
2
+
3
+ * Updated Highcharts to 2.2.2
4
+ * Relaxed development dependency on Bundler from ~> 1.0.0 to ~> 1.0
5
+
1
6
  ## 2.2.1 (2012-04-15)
2
7
 
3
8
  * Updated Highcharts to 2.2.1
@@ -17,6 +17,6 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ["lib"]
18
18
 
19
19
  s.add_dependency "railties", "~> 3.1"
20
- s.add_development_dependency "bundler", "~> 1.0.0"
20
+ s.add_development_dependency "bundler", "~> 1.0"
21
21
  s.add_development_dependency "rails", "~> 3.1"
22
22
  end
@@ -1,3 +1,3 @@
1
1
  module Highcharts
2
- VERSION = "2.2.1"
2
+ VERSION = "2.2.2"
3
3
  end
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v2.2.1 (2012-03-15)
5
+ * @license Highcharts JS v2.2.2 (2012-04-26)
6
6
  *
7
7
  * (c) 2009-2011 Torstein Hønsi
8
8
  *
@@ -124,6 +124,7 @@ var UNDEFINED,
124
124
  addEvent = adapter.addEvent,
125
125
  removeEvent = adapter.removeEvent,
126
126
  fireEvent = adapter.fireEvent,
127
+ washMouseEvent = adapter.washMouseEvent,
127
128
  animate = adapter.animate,
128
129
  stop = adapter.stop,
129
130
 
@@ -749,10 +750,15 @@ function placeBox(boxWidth, boxHeight, outerLeft, outerTop, outerWidth, outerHei
749
750
  if (alignedRight && pointY >= y && pointY <= (y + boxHeight)) {
750
751
  y = pointY + outerTop + distance; // below
751
752
  }
752
- } else if (y + boxHeight > outerTop + outerHeight) {
753
+ }
754
+
755
+ // Now if the tooltip is below the chart, move it up. It's better to cover the
756
+ // point than to disappear outside the chart. #834.
757
+ if (y + boxHeight > outerTop + outerHeight) {
753
758
  y = outerTop + outerHeight - boxHeight - distance; // below
754
759
  }
755
760
 
761
+
756
762
  return {x: x, y: y};
757
763
  }
758
764
 
@@ -929,9 +935,10 @@ pathAnim = {
929
935
  }
930
936
 
931
937
  // if shifting points, prepend a dummy point to the end path
932
- if (shift === 1) {
933
-
934
- end = [].concat(end).splice(0, numParams).concat(end);
938
+ if (shift <= end.length / numParams) {
939
+ while (shift--) {
940
+ end = [].concat(end).splice(0, numParams).concat(end);
941
+ }
935
942
  }
936
943
  elem.shift = 0; // reset for following animations
937
944
 
@@ -1145,6 +1152,13 @@ if (!globalAdapter && win.jQuery) {
1145
1152
  }
1146
1153
  };
1147
1154
 
1155
+ /**
1156
+ * Extension method needed for MooTools
1157
+ */
1158
+ washMouseEvent = function (e) {
1159
+ return e;
1160
+ };
1161
+
1148
1162
  /**
1149
1163
  * Animate a HTML element or SVG element wrapper
1150
1164
  * @param {Object} el
@@ -1270,7 +1284,7 @@ defaultOptions = {
1270
1284
  },
1271
1285
  global: {
1272
1286
  useUTC: true,
1273
- canvasToolsURL: 'http://code.highcharts.com/2.2.1/modules/canvas-tools.js'
1287
+ canvasToolsURL: 'http://code.highcharts.com/2.2.2/modules/canvas-tools.js'
1274
1288
  },
1275
1289
  chart: {
1276
1290
  //animation: true,
@@ -1673,8 +1687,8 @@ defaultBottomAxisOptions = { // horizontal axis
1673
1687
  labels: {
1674
1688
  align: 'center',
1675
1689
  x: 0,
1676
- y: 14,
1677
- overflow: 'justify' // docs
1690
+ y: 14
1691
+ // overflow: undefined // docs - can be 'justify'
1678
1692
  // staggerLines: null
1679
1693
  },
1680
1694
  title: {
@@ -2008,6 +2022,7 @@ SVGElement.prototype = {
2008
2022
  nodeName = element.nodeName,
2009
2023
  renderer = wrapper.renderer,
2010
2024
  skipAttr,
2025
+ titleNode,
2011
2026
  attrSetters = wrapper.attrSetters,
2012
2027
  shadows = wrapper.shadows,
2013
2028
  hasSetSymbolSize,
@@ -2143,9 +2158,12 @@ SVGElement.prototype = {
2143
2158
 
2144
2159
  // Title requires a subnode, #431
2145
2160
  } else if (key === 'title') {
2146
- var title = doc.createElementNS(SVG_NS, 'title');
2147
- title.appendChild(doc.createTextNode(value));
2148
- element.appendChild(title);
2161
+ titleNode = element.getElementsByTagName('title')[0];
2162
+ if (!titleNode) {
2163
+ titleNode = doc.createElementNS(SVG_NS, 'title');
2164
+ element.appendChild(titleNode);
2165
+ }
2166
+ titleNode.textContent = value;
2149
2167
  }
2150
2168
 
2151
2169
  // jQuery animate changes case
@@ -2159,7 +2177,7 @@ SVGElement.prototype = {
2159
2177
  }
2160
2178
 
2161
2179
  // symbols
2162
- if (wrapper.symbolName && /^(x|y|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
2180
+ if (wrapper.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
2163
2181
 
2164
2182
 
2165
2183
  if (!hasSetSymbolSize) {
@@ -2951,6 +2969,32 @@ SVGRenderer.prototype = {
2951
2969
  renderer.gradients = {}; // Object where gradient SvgElements are stored
2952
2970
 
2953
2971
  renderer.setSize(width, height, false);
2972
+
2973
+
2974
+
2975
+ // Issue 110 workaround:
2976
+ // In Firefox, if a div is positioned by percentage, its pixel position may land
2977
+ // between pixels. The container itself doesn't display this, but an SVG element
2978
+ // inside this container will be drawn at subpixel precision. In order to draw
2979
+ // sharp lines, this must be compensated for. This doesn't seem to work inside
2980
+ // iframes though (like in jsFiddle).
2981
+ var subPixelFix, rect;
2982
+ if (isFirefox && container.getBoundingClientRect) {
2983
+ renderer.subPixelFix = subPixelFix = function () {
2984
+ css(container, { left: 0, top: 0 });
2985
+ rect = container.getBoundingClientRect();
2986
+ css(container, {
2987
+ left: (-(rect.left - pInt(rect.left))) + PX,
2988
+ top: (-(rect.top - pInt(rect.top))) + PX
2989
+ });
2990
+ };
2991
+
2992
+ // run the fix now
2993
+ subPixelFix();
2994
+
2995
+ // run it on resize
2996
+ addEvent(win, 'resize', subPixelFix);
2997
+ }
2954
2998
  },
2955
2999
 
2956
3000
  /**
@@ -2972,6 +3016,9 @@ SVGRenderer.prototype = {
2972
3016
  renderer.defs = rendererDefs.destroy();
2973
3017
  }
2974
3018
 
3019
+ // Remove sub pixel fix handler
3020
+ removeEvent(win, 'resize', renderer.subPixelFix);
3021
+
2975
3022
  renderer.alignedObjects = null;
2976
3023
 
2977
3024
  return null;
@@ -3014,7 +3061,14 @@ SVGRenderer.prototype = {
3014
3061
  textLineHeight = textStyles && textStyles.lineHeight,
3015
3062
  lastLine,
3016
3063
  GET_COMPUTED_STYLE = 'getComputedStyle',
3017
- i = childNodes.length;
3064
+ i = childNodes.length,
3065
+ linePositions = [];
3066
+
3067
+ // Needed in IE9 because it doesn't report tspan's offsetHeight (#893)
3068
+ function getLineHeightByBBox(lineNo) {
3069
+ linePositions[lineNo] = textNode.getBBox().height;
3070
+ return mathRound(linePositions[lineNo] - (linePositions[lineNo - 1] || 0));
3071
+ }
3018
3072
 
3019
3073
  // remove old text
3020
3074
  while (i--) {
@@ -3092,7 +3146,7 @@ SVGRenderer.prototype = {
3092
3146
  pInt(win[GET_COMPUTED_STYLE](lastLine, null).getPropertyValue('line-height'));
3093
3147
 
3094
3148
  if (!lineHeight || isNaN(lineHeight)) {
3095
- lineHeight = textLineHeight || lastLine.offsetHeight || 18;
3149
+ lineHeight = textLineHeight || lastLine.offsetHeight || getLineHeightByBBox(lineNo) || 18;
3096
3150
  }
3097
3151
  attr(tspan, 'dy', lineHeight);
3098
3152
  }
@@ -3453,7 +3507,8 @@ SVGRenderer.prototype = {
3453
3507
 
3454
3508
  imageRegex = /^url\((.*?)\)$/,
3455
3509
  imageSrc,
3456
- imageSize;
3510
+ imageSize,
3511
+ centerImage;
3457
3512
 
3458
3513
  if (path) {
3459
3514
 
@@ -3474,14 +3529,19 @@ SVGRenderer.prototype = {
3474
3529
  // image symbols
3475
3530
  } else if (imageRegex.test(symbol)) {
3476
3531
 
3477
- var centerImage = function (img, size) {
3532
+ // On image load, set the size and position
3533
+ centerImage = function (img, size) {
3478
3534
  img.attr({
3479
3535
  width: size[0],
3480
3536
  height: size[1]
3481
- }).translate(
3482
- -mathRound(size[0] / 2),
3483
- -mathRound(size[1] / 2)
3484
- );
3537
+ });
3538
+
3539
+ if (!img.alignByTranslate) { // #185
3540
+ img.translate(
3541
+ -mathRound(size[0] / 2),
3542
+ -mathRound(size[1] / 2)
3543
+ );
3544
+ }
3485
3545
  };
3486
3546
 
3487
3547
  imageSrc = symbol.match(imageRegex)[1];
@@ -3889,11 +3949,12 @@ SVGRenderer.prototype = {
3889
3949
  * @param {Number} anchorY
3890
3950
  * @param {Boolean} baseline Whether to position the label relative to the text baseline,
3891
3951
  * like renderer.text, or to the upper border of the rectangle.
3952
+ * @param {String} className Class name for the group
3892
3953
  */
3893
- label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline) {
3954
+ label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
3894
3955
 
3895
3956
  var renderer = this,
3896
- wrapper = renderer.g(),
3957
+ wrapper = renderer.g(className),
3897
3958
  text = renderer.text('', 0, 0, useHTML)
3898
3959
  .attr({
3899
3960
  zIndex: 1
@@ -3901,7 +3962,7 @@ SVGRenderer.prototype = {
3901
3962
  .add(wrapper),
3902
3963
  box,
3903
3964
  bBox,
3904
- align = 'left',
3965
+ alignFactor = 0,
3905
3966
  padding = 3,
3906
3967
  width,
3907
3968
  height,
@@ -3923,8 +3984,8 @@ SVGRenderer.prototype = {
3923
3984
 
3924
3985
  bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) &&
3925
3986
  text.getBBox(true);
3926
- wrapper.width = (width || bBox.width) + 2 * padding;
3927
- wrapper.height = (height || bBox.height) + 2 * padding;
3987
+ wrapper.width = (width || bBox.width || 0) + 2 * padding;
3988
+ wrapper.height = (height || bBox.height || 0) + 2 * padding;
3928
3989
 
3929
3990
  // update the label-scoped y offset
3930
3991
  baselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;
@@ -3935,8 +3996,8 @@ SVGRenderer.prototype = {
3935
3996
  boxY = baseline ? -baselineOffset : 0;
3936
3997
 
3937
3998
  wrapper.box = box = shape ?
3938
- renderer.symbol(shape, 0, boxY, wrapper.width, wrapper.height) :
3939
- renderer.rect(0, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
3999
+ renderer.symbol(shape, -alignFactor * padding, boxY, wrapper.width, wrapper.height) :
4000
+ renderer.rect(-alignFactor * padding, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
3940
4001
  box.add(wrapper);
3941
4002
  }
3942
4003
 
@@ -3954,7 +4015,7 @@ SVGRenderer.prototype = {
3954
4015
  function updateTextPadding() {
3955
4016
  var styles = wrapper.styles,
3956
4017
  textAlign = styles && styles.textAlign,
3957
- x = padding,
4018
+ x = padding * (1 - alignFactor),
3958
4019
  y;
3959
4020
 
3960
4021
  // determin y based on the baseline
@@ -4031,7 +4092,7 @@ SVGRenderer.prototype = {
4031
4092
 
4032
4093
  // change local variable and set attribue as well
4033
4094
  attrSetters.align = function (value) {
4034
- align = value;
4095
+ alignFactor = { left: 0, center: 0.5, right: 1 }[value];
4035
4096
  return false; // prevent setting text-anchor on the group
4036
4097
  };
4037
4098
 
@@ -4066,8 +4127,9 @@ SVGRenderer.prototype = {
4066
4127
 
4067
4128
  // rename attributes
4068
4129
  attrSetters.x = function (value) {
4069
- value -= { left: 0, center: 0.5, right: 1 }[align] * ((width || bBox.width) + padding);
4070
- wrapperX = wrapper.x = mathRound(value); // wrapper.x is for animation getter
4130
+ wrapper.x = value; // for animation getter
4131
+ value -= alignFactor * ((width || bBox.width) + padding);
4132
+ wrapperX = mathRound(value);
4071
4133
 
4072
4134
  wrapper.attr('translateX', wrapperX);
4073
4135
  return false;
@@ -4487,12 +4549,19 @@ var VMLElement = {
4487
4549
  */
4488
4550
  clip: function (clipRect) {
4489
4551
  var wrapper = this,
4490
- clipMembers = clipRect.members;
4552
+ clipMembers = clipRect.members,
4553
+ element = wrapper.element;
4491
4554
 
4492
4555
  clipMembers.push(wrapper);
4493
4556
  wrapper.destroyClip = function () {
4494
4557
  erase(clipMembers, wrapper);
4495
4558
  };
4559
+
4560
+ // Issue #863 workaround - related to #140, #61, #74
4561
+ if (element.parentNode.className === 'highcharts-tracker' && !docMode8) {
4562
+ css(element, { visibility: HIDDEN });
4563
+ }
4564
+
4496
4565
  return wrapper.css(clipRect.getCSS(wrapper.inverted));
4497
4566
  },
4498
4567
 
@@ -4706,6 +4775,7 @@ var VMLRendererExtension = { // inherit SVGRenderer
4706
4775
  height: bottom + PX
4707
4776
  });
4708
4777
  }
4778
+
4709
4779
  return ret;
4710
4780
  },
4711
4781
 
@@ -5451,7 +5521,7 @@ function Chart(userOptions, callback) {
5451
5521
  getLabelSize: function () {
5452
5522
  var label = this.label;
5453
5523
  return label ?
5454
- ((this.labelBBox = label.getBBox()))[horiz ? 'height' : 'width'] :
5524
+ ((this.labelBBox = label.getBBox(true)))[horiz ? 'height' : 'width'] :
5455
5525
  0;
5456
5526
  },
5457
5527
 
@@ -5589,7 +5659,7 @@ function Chart(userOptions, callback) {
5589
5659
  // If the parameter 'old' is set, the current call will be followed
5590
5660
  // by another call, therefore do not do any animations this time
5591
5661
  if (!old && gridLine && gridLinePath) {
5592
- gridLine.animate({
5662
+ gridLine[tick.isNew ? 'attr' : 'animate']({
5593
5663
  d: gridLinePath
5594
5664
  });
5595
5665
  }
@@ -6426,6 +6496,12 @@ function Chart(userOptions, callback) {
6426
6496
  });
6427
6497
  minRange = mathMin(closestDataRange * 5, dataMax - dataMin);
6428
6498
  }
6499
+
6500
+ // A hook for resetting the minRange in series.setData (#878)
6501
+ // TODO: remove this in protofy, where xAxis.minRange can be set directly
6502
+ axis.setMinRange = function (newMinRange) {
6503
+ minRange = newMinRange;
6504
+ };
6429
6505
  }
6430
6506
 
6431
6507
  // if minRange is exceeded, adjust
@@ -6620,7 +6696,6 @@ function Chart(userOptions, callback) {
6620
6696
  * number of ticks in that group
6621
6697
  */
6622
6698
  function adjustTickAmount() {
6623
-
6624
6699
  if (maxTicks && maxTicks[xOrY] && !isDatetimeAxis && !categories && !isLinked && options.alignTicks !== false) { // only apply to linear scale
6625
6700
  var oldTickAmount = tickAmount,
6626
6701
  calculatedTickAmount = tickPositions.length;
@@ -6661,7 +6736,8 @@ function Chart(userOptions, callback) {
6661
6736
  oldAxisLength = axisLength;
6662
6737
 
6663
6738
  // set the new axisLength
6664
- axisLength = horiz ? axisWidth : axisHeight;
6739
+ axis.setAxisSize();
6740
+ //axisLength = horiz ? axisWidth : axisHeight;
6665
6741
  isDirtyAxisLength = axisLength !== oldAxisLength;
6666
6742
 
6667
6743
  // is there new data?
@@ -6794,7 +6870,7 @@ function Chart(userOptions, callback) {
6794
6870
  axisHeight = pick(options.height, plotHeight);
6795
6871
  axisBottom = chartHeight - axisHeight - axisTop;
6796
6872
  axisRight = chartWidth - axisWidth - axisLeft;
6797
- axisLength = horiz ? axisWidth : axisHeight;
6873
+ axisLength = mathMax(horiz ? axisWidth : axisHeight, 0); // mathMax fixes #905
6798
6874
 
6799
6875
  // expose to use in Series object and navigator
6800
6876
  axis.left = axisLeft;
@@ -7149,10 +7225,13 @@ function Chart(userOptions, callback) {
7149
7225
  visibility: VISIBLE,
7150
7226
  zIndex: 6
7151
7227
  })
7152
- .translate(plotLeft, plotTop)
7153
7228
  .add();
7154
7229
  }
7155
7230
 
7231
+ // plotLeft/Top will change when y axis gets wider so we need to translate the
7232
+ // stackTotalGroup at every render call. See bug #506 and #516
7233
+ stackTotalGroup.translate(plotLeft, plotTop);
7234
+
7156
7235
  // Render each stack total
7157
7236
  for (stackKey in stacks) {
7158
7237
  oneStack = stacks[stackKey];
@@ -7200,7 +7279,7 @@ function Chart(userOptions, callback) {
7200
7279
 
7201
7280
  // hide tooltip and hover states
7202
7281
  if (tracker.resetTracker) {
7203
- tracker.resetTracker();
7282
+ tracker.resetTracker(true);
7204
7283
  }
7205
7284
 
7206
7285
  // render the axis
@@ -7355,7 +7434,7 @@ function Chart(userOptions, callback) {
7355
7434
  style.padding = 0;
7356
7435
 
7357
7436
  // create the label
7358
- var label = renderer.label('', 0, 0, null, null, null, options.useHTML)
7437
+ var label = renderer.label('', 0, 0, null, null, null, options.useHTML, null, 'tooltip')
7359
7438
  .attr({
7360
7439
  padding: padding,
7361
7440
  fill: options.backgroundColor,
@@ -7658,8 +7737,6 @@ function Chart(userOptions, callback) {
7658
7737
  */
7659
7738
  function normalizeMouseEvent(e) {
7660
7739
  var ePos,
7661
- chartPosLeft,
7662
- chartPosTop,
7663
7740
  chartX,
7664
7741
  chartY;
7665
7742
 
@@ -7684,16 +7761,14 @@ function Chart(userOptions, callback) {
7684
7761
 
7685
7762
  // get mouse position
7686
7763
  chartPosition = offset(container);
7687
- chartPosLeft = chartPosition.left;
7688
- chartPosTop = chartPosition.top;
7689
7764
 
7690
7765
  // chartX and chartY
7691
- if (isIE) { // IE including IE9 that has pageX but in a different meaning
7766
+ if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
7692
7767
  chartX = e.x;
7693
7768
  chartY = e.y;
7694
7769
  } else {
7695
- chartX = ePos.pageX - chartPosLeft;
7696
- chartY = ePos.pageY - chartPosTop;
7770
+ chartX = ePos.pageX - chartPosition.left;
7771
+ chartY = ePos.pageY - chartPosition.top;
7697
7772
  }
7698
7773
 
7699
7774
  return extend(e, {
@@ -7741,7 +7816,8 @@ function Chart(userOptions, callback) {
7741
7816
  i,
7742
7817
  j,
7743
7818
  distance = chartWidth,
7744
- index = inverted ? e.chartY : e.chartX - plotLeft; // wtf?
7819
+ // the index in the tooltipPoints array, corresponding to pixel position in plot area
7820
+ index = inverted ? plotHeight + plotTop - e.chartY : e.chartX - plotLeft;
7745
7821
 
7746
7822
  // shared tooltip
7747
7823
  if (tooltip && options.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
@@ -7794,24 +7870,34 @@ function Chart(userOptions, callback) {
7794
7870
  /**
7795
7871
  * Reset the tracking by hiding the tooltip, the hover series state and the hover point
7796
7872
  */
7797
- function resetTracker() {
7873
+ function resetTracker(allowMove) {
7798
7874
  var hoverSeries = chart.hoverSeries,
7799
- hoverPoint = chart.hoverPoint;
7875
+ hoverPoint = chart.hoverPoint,
7876
+ tooltipPoints = chart.hoverPoints || hoverPoint;
7800
7877
 
7801
- if (hoverPoint) {
7802
- hoverPoint.onMouseOut();
7803
- }
7878
+ // Just move the tooltip, #349
7879
+ if (allowMove && tooltip && tooltipPoints) {
7880
+ tooltip.refresh(tooltipPoints);
7804
7881
 
7805
- if (hoverSeries) {
7806
- hoverSeries.onMouseOut();
7807
- }
7882
+ // Full reset
7883
+ } else {
7808
7884
 
7809
- if (tooltip) {
7810
- tooltip.hide();
7811
- tooltip.hideCrosshairs();
7812
- }
7885
+ if (hoverPoint) {
7886
+ hoverPoint.onMouseOut();
7887
+ }
7813
7888
 
7814
- hoverX = null;
7889
+ if (hoverSeries) {
7890
+ hoverSeries.onMouseOut();
7891
+ }
7892
+
7893
+ if (tooltip) {
7894
+ tooltip.hide();
7895
+ tooltip.hideCrosshairs();
7896
+ }
7897
+
7898
+ hoverX = null;
7899
+
7900
+ }
7815
7901
  }
7816
7902
 
7817
7903
  /**
@@ -7825,7 +7911,8 @@ function Chart(userOptions, callback) {
7825
7911
  },
7826
7912
  selectionBox = selectionMarker.getBBox(),
7827
7913
  selectionLeft = selectionBox.x - plotLeft,
7828
- selectionTop = selectionBox.y - plotTop;
7914
+ selectionTop = selectionBox.y - plotTop,
7915
+ runZoom;
7829
7916
 
7830
7917
 
7831
7918
  // a selection has been made
@@ -7855,23 +7942,30 @@ function Chart(userOptions, callback) {
7855
7942
  0,
7856
7943
  1
7857
7944
  );
7858
-
7859
- selectionData[isXAxis ? 'xAxis' : 'yAxis'].push({
7860
- axis: axis,
7861
- min: mathMin(selectionMin, selectionMax), // for reversed axes,
7862
- max: mathMax(selectionMin, selectionMax)
7863
- });
7945
+ if (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859
7946
+ selectionData[isXAxis ? 'xAxis' : 'yAxis'].push({
7947
+ axis: axis,
7948
+ min: mathMin(selectionMin, selectionMax), // for reversed axes,
7949
+ max: mathMax(selectionMin, selectionMax)
7950
+ });
7951
+ runZoom = true;
7952
+ }
7864
7953
  }
7865
7954
  });
7866
- fireEvent(chart, 'selection', selectionData, zoom);
7955
+ if (runZoom) {
7956
+ fireEvent(chart, 'selection', selectionData, zoom);
7957
+ }
7867
7958
 
7868
7959
  }
7869
7960
  selectionMarker = selectionMarker.destroy();
7870
7961
  }
7871
7962
 
7872
- css(container, { cursor: 'auto' });
7963
+ if (chart) { // it may be destroyed on mouse up - #877
7964
+ css(container, { cursor: 'auto' });
7965
+ chart.cancelClick = hasDragged; // #370
7966
+ chart.mouseIsDown = mouseIsDown = hasDragged = false;
7967
+ }
7873
7968
 
7874
- chart.mouseIsDown = mouseIsDown = hasDragged = false;
7875
7969
  removeEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop);
7876
7970
 
7877
7971
  }
@@ -7880,12 +7974,14 @@ function Chart(userOptions, callback) {
7880
7974
  * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
7881
7975
  */
7882
7976
  function hideTooltipOnMouseMove(e) {
7883
- var pageX = defined(e.pageX) ? e.pageX : e.page.x, // In mootools the event is wrapped and the page x/y position is named e.page.x
7884
- pageY = defined(e.pageX) ? e.pageY : e.page.y; // Ref: http://mootools.net/docs/core/Types/DOMEvent
7885
7977
 
7978
+ // Get e.pageX and e.pageY back in MooTools
7979
+ washMouseEvent(e);
7980
+
7981
+ // If we're outside, hide the tooltip
7886
7982
  if (chartPosition &&
7887
- !isInsidePlot(pageX - chartPosition.left - plotLeft,
7888
- pageY - chartPosition.top - plotTop)) {
7983
+ !isInsidePlot(e.pageX - chartPosition.left - plotLeft,
7984
+ e.pageY - chartPosition.top - plotTop)) {
7889
7985
  resetTracker();
7890
7986
  }
7891
7987
  }
@@ -7916,6 +8012,7 @@ function Chart(userOptions, callback) {
7916
8012
 
7917
8013
  // record the start position
7918
8014
  chart.mouseIsDown = mouseIsDown = true;
8015
+ chart.cancelClick = false;
7919
8016
  chart.mouseDownX = mouseDownX = e.chartX;
7920
8017
  mouseDownY = e.chartY;
7921
8018
 
@@ -8087,7 +8184,7 @@ function Chart(userOptions, callback) {
8087
8184
  e.cancelBubble = true; // IE specific
8088
8185
 
8089
8186
 
8090
- if (!hasDragged) {
8187
+ if (!chart.cancelClick) {
8091
8188
 
8092
8189
  // Detect clicks on trackers or tracker groups, #783
8093
8190
  if (hoverPoint && (attr(e.target, 'isTracker') || attr(e.target.parentNode, 'isTracker'))) {
@@ -8121,8 +8218,6 @@ function Chart(userOptions, callback) {
8121
8218
 
8122
8219
 
8123
8220
  }
8124
- // reset mouseIsDown and hasDragged
8125
- hasDragged = false;
8126
8221
  };
8127
8222
 
8128
8223
  }
@@ -8832,7 +8927,7 @@ function Chart(userOptions, callback) {
8832
8927
  fireEvent(axis, 'afterSetExtremes', axis.getExtremes()); // #747, #751
8833
8928
  }
8834
8929
 
8835
- if (axis.isDirty || isDirtyBox) {
8930
+ if (axis.isDirty || isDirtyBox || hasStackedSeries) {
8836
8931
  axis.redraw();
8837
8932
  isDirtyBox = true; // #792
8838
8933
  }
@@ -8866,9 +8961,9 @@ function Chart(userOptions, callback) {
8866
8961
  });
8867
8962
 
8868
8963
 
8869
- // hide tooltip and hover states
8964
+ // move tooltip or reset
8870
8965
  if (tracker && tracker.resetTracker) {
8871
- tracker.resetTracker();
8966
+ tracker.resetTracker(true);
8872
8967
  }
8873
8968
 
8874
8969
  // redraw if canvas
@@ -9213,7 +9308,7 @@ function Chart(userOptions, callback) {
9213
9308
  // remove previous chart
9214
9309
  renderTo.innerHTML = '';
9215
9310
 
9216
- // If the container doesn't have an offsetWidth, it has or is a child of a node
9311
+ // If the container doesn't have an offsetWidth, it ha s or is a child of a node
9217
9312
  // that has display:none. We need to temporarily move it out to a visible
9218
9313
  // state to determine the size, else the legend and tooltips won't render
9219
9314
  // properly
@@ -9222,7 +9317,7 @@ function Chart(userOptions, callback) {
9222
9317
  css(renderToClone, {
9223
9318
  position: ABSOLUTE,
9224
9319
  top: '-9999px',
9225
- display: ''
9320
+ display: 'block'
9226
9321
  });
9227
9322
  doc.body.appendChild(renderToClone);
9228
9323
  }
@@ -9257,35 +9352,6 @@ function Chart(userOptions, callback) {
9257
9352
  // to get the tracker for translating mouse events
9258
9353
  renderer.create(chart, container, chartWidth, chartHeight);
9259
9354
  }
9260
-
9261
- // Issue 110 workaround:
9262
- // In Firefox, if a div is positioned by percentage, its pixel position may land
9263
- // between pixels. The container itself doesn't display this, but an SVG element
9264
- // inside this container will be drawn at subpixel precision. In order to draw
9265
- // sharp lines, this must be compensated for. This doesn't seem to work inside
9266
- // iframes though (like in jsFiddle).
9267
- var subPixelFix, rect;
9268
- if (isFirefox && container.getBoundingClientRect) {
9269
- subPixelFix = function () {
9270
- css(container, { left: 0, top: 0 });
9271
- rect = container.getBoundingClientRect();
9272
- css(container, {
9273
- left: (-(rect.left - pInt(rect.left))) + PX,
9274
- top: (-(rect.top - pInt(rect.top))) + PX
9275
- });
9276
- };
9277
-
9278
- // run the fix now
9279
- subPixelFix();
9280
-
9281
- // run it on resize
9282
- addEvent(win, 'resize', subPixelFix);
9283
-
9284
- // remove it on chart destroy
9285
- addEvent(chart, 'destroy', function () {
9286
- removeEvent(win, 'resize', subPixelFix);
9287
- });
9288
- }
9289
9355
  }
9290
9356
 
9291
9357
  /**
@@ -9663,6 +9729,8 @@ function Chart(userOptions, callback) {
9663
9729
  axis.setScale();
9664
9730
  });
9665
9731
  getMargins();
9732
+
9733
+ maxTicks = null; // reset for second pass
9666
9734
  each(axes, function (axis) {
9667
9735
  axis.setTickPositions(true); // update to reflect the new margins
9668
9736
  });
@@ -10080,19 +10148,23 @@ Point.prototype = {
10080
10148
  destroy: function () {
10081
10149
  var point = this,
10082
10150
  series = point.series,
10083
- hoverPoints = series.chart.hoverPoints,
10151
+ chart = series.chart,
10152
+ hoverPoints = chart.hoverPoints,
10084
10153
  prop;
10085
10154
 
10086
- series.chart.pointCount--;
10155
+ chart.pointCount--;
10087
10156
 
10088
10157
  if (hoverPoints) {
10089
10158
  point.setState();
10090
10159
  erase(hoverPoints, point);
10160
+ if (!hoverPoints.length) {
10161
+ chart.hoverPoints = null;
10162
+ }
10163
+
10091
10164
  }
10092
- if (point === series.chart.hoverPoint) {
10165
+ if (point === chart.hoverPoint) {
10093
10166
  point.onMouseOut();
10094
10167
  }
10095
- series.chart.hoverPoints = null;
10096
10168
 
10097
10169
  // remove all events
10098
10170
  if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
@@ -10101,7 +10173,7 @@ Point.prototype = {
10101
10173
  }
10102
10174
 
10103
10175
  if (point.legendItem) { // pies have legend items
10104
- point.series.chart.legend.destroyItem(point);
10176
+ chart.legend.destroyItem(point);
10105
10177
  }
10106
10178
 
10107
10179
  for (prop in point) {
@@ -10772,7 +10844,7 @@ Series.prototype = {
10772
10844
  // Shift the first point off the parallel arrays
10773
10845
  // todo: consider series.removePoint(i) method
10774
10846
  if (shift) {
10775
- if (data[0]) {
10847
+ if (data[0] && data[0].remove) {
10776
10848
  data[0].remove(false);
10777
10849
  } else {
10778
10850
  data.shift();
@@ -10803,11 +10875,12 @@ Series.prototype = {
10803
10875
  initialColor = series.initialColor,
10804
10876
  chart = series.chart,
10805
10877
  firstPoint = null,
10878
+ xAxis = series.xAxis,
10806
10879
  i;
10807
10880
 
10808
10881
  // reset properties
10809
10882
  series.xIncrement = null;
10810
- series.pointRange = (series.xAxis && series.xAxis.categories && 1) || options.pointRange;
10883
+ series.pointRange = (xAxis && xAxis.categories && 1) || options.pointRange;
10811
10884
 
10812
10885
  if (defined(initialColor)) { // reset colors for pie
10813
10886
  chart.counters.color = initialColor;
@@ -10884,6 +10957,13 @@ Series.prototype = {
10884
10957
  }
10885
10958
  }
10886
10959
 
10960
+ // reset minRange (#878)
10961
+ // TODO: In protofy, run this code instead:
10962
+ // if (xAxis) xAxis.minRange = UNDEFINED;
10963
+ if (xAxis && xAxis.setMinRange) {
10964
+ xAxis.setMinRange(); // to undefined
10965
+ }
10966
+
10887
10967
  // redraw
10888
10968
  series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
10889
10969
  if (pick(redraw, true)) {
@@ -11172,10 +11252,9 @@ Series.prototype = {
11172
11252
  setTooltipPoints: function (renew) {
11173
11253
  var series = this,
11174
11254
  chart = series.chart,
11175
- inverted = chart.inverted,
11176
11255
  points = [],
11177
11256
  pointsLength,
11178
- plotSize = mathRound((inverted ? chart.plotTop : chart.plotLeft) + chart.plotSizeX),
11257
+ plotSize = chart.plotSizeX,
11179
11258
  low,
11180
11259
  high,
11181
11260
  xAxis = series.xAxis,
@@ -11201,10 +11280,10 @@ Series.prototype = {
11201
11280
  // loop the concatenated points and apply each point to all the closest
11202
11281
  // pixel positions
11203
11282
  if (xAxis && xAxis.reversed) {
11204
- points = points.reverse();//reverseArray(points);
11283
+ points = points.reverse();
11205
11284
  }
11206
11285
 
11207
- //each(points, function (point, i) {
11286
+ // Assign each pixel position to the nearest point
11208
11287
  pointsLength = points.length;
11209
11288
  for (i = 0; i < pointsLength; i++) {
11210
11289
  point = points[i];
@@ -11214,7 +11293,7 @@ Series.prototype = {
11214
11293
  plotSize;
11215
11294
 
11216
11295
  while (low <= high) {
11217
- tooltipPoints[inverted ? plotSize - low++ : low++] = point;
11296
+ tooltipPoints[low++] = point;
11218
11297
  }
11219
11298
  }
11220
11299
  series.tooltipPoints = tooltipPoints;
@@ -11777,7 +11856,7 @@ Series.prototype = {
11777
11856
  fill: options.backgroundColor,
11778
11857
  stroke: options.borderColor,
11779
11858
  'stroke-width': options.borderWidth,
11780
- r: options.borderRadius,
11859
+ r: options.borderRadius || 0,
11781
11860
  rotation: options.rotation,
11782
11861
  padding: options.padding,
11783
11862
  zIndex: 1
@@ -12691,13 +12770,17 @@ var ColumnSeries = extendClass(Series, {
12691
12770
  cursor = options.cursor,
12692
12771
  css = cursor && { cursor: cursor },
12693
12772
  trackerGroup = series.drawTrackerGroup(),
12694
- rel;
12773
+ rel,
12774
+ plotY,
12775
+ validPlotY;
12695
12776
 
12696
12777
  each(series.points, function (point) {
12697
12778
  tracker = point.tracker;
12698
12779
  shapeArgs = point.trackerArgs || point.shapeArgs;
12780
+ plotY = point.plotY;
12781
+ validPlotY = !series.isCartesian || (plotY !== UNDEFINED && !isNaN(plotY));
12699
12782
  delete shapeArgs.strokeWidth;
12700
- if (point.y !== null) {
12783
+ if (point.y !== null && validPlotY) {
12701
12784
  if (tracker) {// update
12702
12785
  tracker.attr(shapeArgs);
12703
12786
 
@@ -13040,10 +13123,13 @@ var PieSeries = extendClass(Series, {
13040
13123
  * Extend the basic setData method by running processData and generatePoints immediately,
13041
13124
  * in order to access the points from the legend.
13042
13125
  */
13043
- setData: function () {
13044
- Series.prototype.setData.apply(this, arguments);
13126
+ setData: function (data, redraw) {
13127
+ Series.prototype.setData.call(this, data, false);
13045
13128
  this.processData();
13046
13129
  this.generatePoints();
13130
+ if (pick(redraw, true)) {
13131
+ this.chart.redraw();
13132
+ }
13047
13133
  },
13048
13134
  /**
13049
13135
  * Do translation for pie slices
@@ -13315,7 +13401,7 @@ var PieSeries = extendClass(Series, {
13315
13401
  // assume equal label heights
13316
13402
  labelHeight = halves[0][0] && halves[0][0].dataLabel && halves[0][0].dataLabel.getBBox().height;
13317
13403
 
13318
- /* Loop over the points in each quartile, starting from the top and bottom
13404
+ /* Loop over the points in each half, starting from the top and bottom
13319
13405
  * of the pie to detect overlapping labels.
13320
13406
  */
13321
13407
  while (i--) {
@@ -13328,115 +13414,126 @@ var PieSeries = extendClass(Series, {
13328
13414
  length = points.length,
13329
13415
  slotIndex;
13330
13416
 
13331
-
13332
- // build the slots
13333
- for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
13334
- slots.push(pos);
13335
- // visualize the slot
13336
- /*
13337
- var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
13338
- slotY = pos + chart.plotTop;
13339
- if (!isNaN(slotX)) {
13340
- chart.renderer.rect(slotX, slotY - 7, 100, labelHeight)
13341
- .attr({
13342
- 'stroke-width': 1,
13343
- stroke: 'silver'
13344
- })
13345
- .add();
13346
- chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)
13347
- .attr({
13348
- fill: 'silver'
13349
- }).add();
13350
- }
13351
- // */
13352
- }
13353
- slotsLength = slots.length;
13354
-
13355
- // if there are more values than available slots, remove lowest values
13356
- if (length > slotsLength) {
13357
- // create an array for sorting and ranking the points within each quarter
13358
- rankArr = [].concat(points);
13359
- rankArr.sort(sort);
13360
- j = length;
13361
- while (j--) {
13362
- rankArr[j].rank = j;
13363
- }
13364
- j = length;
13365
- while (j--) {
13366
- if (points[j].rank >= slotsLength) {
13367
- points.splice(j, 1);
13417
+ // Only do anti-collision when we are outside the pie and have connectors (#856)
13418
+ if (distanceOption > 0) {
13419
+
13420
+ // build the slots
13421
+ for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
13422
+ slots.push(pos);
13423
+ // visualize the slot
13424
+ /*
13425
+ var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
13426
+ slotY = pos + chart.plotTop;
13427
+ if (!isNaN(slotX)) {
13428
+ chart.renderer.rect(slotX, slotY - 7, 100, labelHeight)
13429
+ .attr({
13430
+ 'stroke-width': 1,
13431
+ stroke: 'silver'
13432
+ })
13433
+ .add();
13434
+ chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)
13435
+ .attr({
13436
+ fill: 'silver'
13437
+ }).add();
13368
13438
  }
13439
+ // */
13440
+ }
13441
+ slotsLength = slots.length;
13442
+
13443
+ // if there are more values than available slots, remove lowest values
13444
+ if (length > slotsLength) {
13445
+ // create an array for sorting and ranking the points within each quarter
13446
+ rankArr = [].concat(points);
13447
+ rankArr.sort(sort);
13448
+ j = length;
13449
+ while (j--) {
13450
+ rankArr[j].rank = j;
13451
+ }
13452
+ j = length;
13453
+ while (j--) {
13454
+ if (points[j].rank >= slotsLength) {
13455
+ points.splice(j, 1);
13456
+ }
13457
+ }
13458
+ length = points.length;
13369
13459
  }
13370
- length = points.length;
13371
- }
13372
13460
 
13373
- // The label goes to the nearest open slot, but not closer to the edge than
13374
- // the label's index.
13375
- for (j = 0; j < length; j++) {
13461
+ // The label goes to the nearest open slot, but not closer to the edge than
13462
+ // the label's index.
13463
+ for (j = 0; j < length; j++) {
13376
13464
 
13377
- point = points[j];
13378
- labelPos = point.labelPos;
13465
+ point = points[j];
13466
+ labelPos = point.labelPos;
13379
13467
 
13380
- var closest = 9999,
13381
- distance,
13382
- slotI;
13468
+ var closest = 9999,
13469
+ distance,
13470
+ slotI;
13383
13471
 
13384
- // find the closest slot index
13385
- for (slotI = 0; slotI < slotsLength; slotI++) {
13386
- distance = mathAbs(slots[slotI] - labelPos[1]);
13387
- if (distance < closest) {
13388
- closest = distance;
13389
- slotIndex = slotI;
13472
+ // find the closest slot index
13473
+ for (slotI = 0; slotI < slotsLength; slotI++) {
13474
+ distance = mathAbs(slots[slotI] - labelPos[1]);
13475
+ if (distance < closest) {
13476
+ closest = distance;
13477
+ slotIndex = slotI;
13478
+ }
13390
13479
  }
13391
- }
13392
13480
 
13393
- // if that slot index is closer to the edges of the slots, move it
13394
- // to the closest appropriate slot
13395
- if (slotIndex < j && slots[j] !== null) { // cluster at the top
13396
- slotIndex = j;
13397
- } else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
13398
- slotIndex = slotsLength - length + j;
13399
- while (slots[slotIndex] === null) { // make sure it is not taken
13400
- slotIndex++;
13401
- }
13402
- } else {
13403
- // Slot is taken, find next free slot below. In the next run, the next slice will find the
13404
- // slot above these, because it is the closest one
13405
- while (slots[slotIndex] === null) { // make sure it is not taken
13406
- slotIndex++;
13481
+ // if that slot index is closer to the edges of the slots, move it
13482
+ // to the closest appropriate slot
13483
+ if (slotIndex < j && slots[j] !== null) { // cluster at the top
13484
+ slotIndex = j;
13485
+ } else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
13486
+ slotIndex = slotsLength - length + j;
13487
+ while (slots[slotIndex] === null) { // make sure it is not taken
13488
+ slotIndex++;
13489
+ }
13490
+ } else {
13491
+ // Slot is taken, find next free slot below. In the next run, the next slice will find the
13492
+ // slot above these, because it is the closest one
13493
+ while (slots[slotIndex] === null) { // make sure it is not taken
13494
+ slotIndex++;
13495
+ }
13407
13496
  }
13408
- }
13409
13497
 
13410
- usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
13411
- slots[slotIndex] = null; // mark as taken
13498
+ usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
13499
+ slots[slotIndex] = null; // mark as taken
13500
+ }
13501
+ // sort them in order to fill in from the top
13502
+ usedSlots.sort(sort);
13412
13503
  }
13413
- // sort them in order to fill in from the top
13414
- usedSlots.sort(sort);
13415
-
13416
13504
 
13417
13505
  // now the used slots are sorted, fill them up sequentially
13418
13506
  for (j = 0; j < length; j++) {
13419
13507
 
13508
+ var slot, naturalY;
13509
+
13420
13510
  point = points[j];
13421
13511
  labelPos = point.labelPos;
13422
13512
  dataLabel = point.dataLabel;
13423
- var slot = usedSlots.pop(),
13424
- naturalY = labelPos[1];
13425
-
13426
13513
  visibility = point.visible === false ? HIDDEN : VISIBLE;
13427
- slotIndex = slot.i;
13514
+ naturalY = labelPos[1];
13515
+
13516
+ if (distanceOption > 0) {
13517
+ slot = usedSlots.pop();
13518
+ slotIndex = slot.i;
13519
+
13520
+ // if the slot next to currrent slot is free, the y value is allowed
13521
+ // to fall back to the natural position
13522
+ y = slot.y;
13523
+ if ((naturalY > y && slots[slotIndex + 1] !== null) ||
13524
+ (naturalY < y && slots[slotIndex - 1] !== null)) {
13525
+ y = naturalY;
13526
+ }
13428
13527
 
13429
- // if the slot next to currrent slot is free, the y value is allowed
13430
- // to fall back to the natural position
13431
- y = slot.y;
13432
- if ((naturalY > y && slots[slotIndex + 1] !== null) ||
13433
- (naturalY < y && slots[slotIndex - 1] !== null)) {
13528
+ } else {
13434
13529
  y = naturalY;
13435
13530
  }
13436
13531
 
13437
13532
  // get the x - use the natural x position for first and last slot, to prevent the top
13438
13533
  // and botton slice connectors from touching each other on either side
13439
- x = series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);
13534
+ x = options.justify ?
13535
+ seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
13536
+ series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);
13440
13537
 
13441
13538
  // move or place the data label
13442
13539
  dataLabel
@@ -13538,6 +13635,6 @@ extend(Highcharts, {
13538
13635
  extendClass: extendClass,
13539
13636
  placeBox: placeBox,
13540
13637
  product: 'Highcharts',
13541
- version: '2.2.1'
13638
+ version: '2.2.2'
13542
13639
  });
13543
- }());
13640
+ }());
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v2.2.1 (2012-03-15)
2
+ * @license Highcharts JS v2.2.2 (2012-04-26)
3
3
  * MooTools adapter
4
4
  *
5
5
  * (c) 2010-2011 Torstein Hønsi
@@ -285,6 +285,15 @@ win.HighchartsAdapter = {
285
285
  }
286
286
  },
287
287
 
288
+ /**
289
+ * Set back e.pageX and e.pageY that MooTools has abstracted away
290
+ */
291
+ washMouseEvent: function (e) {
292
+ e.pageX = e.page.x;
293
+ e.pageY = e.page.y;
294
+ return e;
295
+ },
296
+
288
297
  /**
289
298
  * Stop running animations on the object
290
299
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v2.2.1 (2012-03-15)
2
+ * @license Highcharts JS v2.2.2 (2012-04-26)
3
3
  * Prototype adapter
4
4
  *
5
5
  * @author Michael Nelson, Torstein Hønsi.
@@ -230,6 +230,10 @@ return {
230
230
  }
231
231
  },
232
232
 
233
+ washMouseEvent: function (e) {
234
+ return e;
235
+ },
236
+
233
237
  // um, grep
234
238
  grep: function (arr, fn) {
235
239
  return arr.findAll(fn);
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
2908
2908
  });
2909
2909
  }
2910
2910
  }/**
2911
- * @license Highcharts JS v2.2.1 (2012-03-15)
2911
+ * @license Highcharts JS v2.2.2 (2012-04-26)
2912
2912
  * CanVGRenderer Extension module
2913
2913
  *
2914
2914
  * (c) 2011-2012 Torstein Hønsi, Erik Olsson
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Highcharts JS v2.2.1 (2012-03-15)
2
+ * @license Highcharts JS v2.2.2 (2012-04-26)
3
3
  * Exporting module
4
4
  *
5
5
  * (c) 2010-2011 Torstein Hønsi
@@ -272,6 +272,8 @@ extend(Chart.prototype, {
272
272
  .replace(/url\([^#]+#/g, 'url(#')
273
273
  .replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
274
274
  .replace(/ href=/g, ' xlink:href=')
275
+ .replace(/\n/, ' ')
276
+ .replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
275
277
  /* This fails in IE < 8
276
278
  .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
277
279
  return s2 +'.'+ s3[0];
@@ -320,7 +322,8 @@ extend(Chart.prototype, {
320
322
  // create the form
321
323
  form = createElement('form', {
322
324
  method: 'post',
323
- action: options.url
325
+ action: options.url,
326
+ enctype: 'multipart/form-data'
324
327
  }, {
325
328
  display: NONE
326
329
  }, doc.body);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: highcharts-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-15 00:00:00.000000000 +02:00
12
+ date: 2012-04-26 00:00:00.000000000 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: railties
17
- requirement: &70208443559820 !ruby/object:Gem::Requirement
17
+ requirement: &70185090385860 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,21 +22,21 @@ dependencies:
22
22
  version: '3.1'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70208443559820
25
+ version_requirements: *70185090385860
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &70208443559320 !ruby/object:Gem::Requirement
28
+ requirement: &70185090385360 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: '1.0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70208443559320
36
+ version_requirements: *70185090385360
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rails
39
- requirement: &70208443558860 !ruby/object:Gem::Requirement
39
+ requirement: &70185090384900 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '3.1'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70208443558860
47
+ version_requirements: *70185090384900
48
48
  description: Gem that includes Highcharts (Interactive JavaScript charts for your
49
49
  web projects), in the Rails Asset Pipeline introduced in Rails 3.1
50
50
  email:
@@ -64,6 +64,8 @@ files:
64
64
  - lib/highcharts/rails.rb
65
65
  - lib/highcharts/version.rb
66
66
  - vendor/assets/images/highcharts/skies.jpg
67
+ - vendor/assets/images/highcharts/snow.png
68
+ - vendor/assets/images/highcharts/sun.png
67
69
  - vendor/assets/javascripts/highcharts.js
68
70
  - vendor/assets/javascripts/highcharts/adapters/mootools.js
69
71
  - vendor/assets/javascripts/highcharts/adapters/prototype.js