highcharts-rails 3.0.3 → 3.0.5

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.
@@ -1,704 +1,22 @@
1
- /**
2
- * @license Highcharts JS v3.0.3 (2013-07-31)
3
- * Exporting module
4
- *
5
- * (c) 2010-2013 Torstein Hønsi
6
- *
7
- * License: www.highcharts.com/license
8
- */
9
-
10
- // JSLint options:
11
- /*global Highcharts, document, window, Math, setTimeout */
12
-
13
- (function (Highcharts) { // encapsulate
14
-
15
- // create shortcuts
16
- var Chart = Highcharts.Chart,
17
- addEvent = Highcharts.addEvent,
18
- removeEvent = Highcharts.removeEvent,
19
- createElement = Highcharts.createElement,
20
- discardElement = Highcharts.discardElement,
21
- css = Highcharts.css,
22
- merge = Highcharts.merge,
23
- each = Highcharts.each,
24
- extend = Highcharts.extend,
25
- math = Math,
26
- mathMax = math.max,
27
- doc = document,
28
- win = window,
29
- isTouchDevice = Highcharts.isTouchDevice,
30
- M = 'M',
31
- L = 'L',
32
- DIV = 'div',
33
- HIDDEN = 'hidden',
34
- NONE = 'none',
35
- PREFIX = 'highcharts-',
36
- ABSOLUTE = 'absolute',
37
- PX = 'px',
38
- UNDEFINED,
39
- symbols = Highcharts.Renderer.prototype.symbols,
40
- defaultOptions = Highcharts.getOptions(),
41
- buttonOffset;
42
-
43
- // Add language
44
- extend(defaultOptions.lang, {
45
- printChart: 'Print chart',
46
- downloadPNG: 'Download PNG image',
47
- downloadJPEG: 'Download JPEG image',
48
- downloadPDF: 'Download PDF document',
49
- downloadSVG: 'Download SVG vector image',
50
- contextButtonTitle: 'Chart context menu'
51
- });
52
-
53
- // Buttons and menus are collected in a separate config option set called 'navigation'.
54
- // This can be extended later to add control buttons like zoom and pan right click menus.
55
- defaultOptions.navigation = {
56
- menuStyle: {
57
- border: '1px solid #A0A0A0',
58
- background: '#FFFFFF',
59
- padding: '5px 0'
60
- },
61
- menuItemStyle: {
62
- padding: '0 10px',
63
- background: NONE,
64
- color: '#303030',
65
- fontSize: isTouchDevice ? '14px' : '11px'
66
- },
67
- menuItemHoverStyle: {
68
- background: '#4572A5',
69
- color: '#FFFFFF'
70
- },
71
-
72
- buttonOptions: {
73
- symbolFill: '#E0E0E0',
74
- symbolSize: 14,
75
- symbolStroke: '#666',
76
- symbolStrokeWidth: 3,
77
- symbolX: 12.5,
78
- symbolY: 10.5,
79
- align: 'right',
80
- buttonSpacing: 3,
81
- height: 22,
82
- // text: null,
83
- theme: {
84
- fill: 'white', // capture hover
85
- stroke: 'none'
86
- },
87
- verticalAlign: 'top',
88
- width: 24
89
- }
90
- };
91
-
92
-
93
-
94
- // Add the export related options
95
- defaultOptions.exporting = {
96
- //enabled: true,
97
- //filename: 'chart',
98
- type: 'image/png',
99
- url: 'http://export.highcharts.com/',
100
- //width: undefined,
101
- //scale: 2
102
- buttons: {
103
- contextButton: {
104
- //x: -10,
105
- symbol: 'menu',
106
- _titleKey: 'contextButtonTitle',
107
- menuItems: [{
108
- textKey: 'printChart',
109
- onclick: function () {
110
- this.print();
111
- }
112
- }, {
113
- separator: true
114
- }, {
115
- textKey: 'downloadPNG',
116
- onclick: function () {
117
- this.exportChart();
118
- }
119
- }, {
120
- textKey: 'downloadJPEG',
121
- onclick: function () {
122
- this.exportChart({
123
- type: 'image/jpeg'
124
- });
125
- }
126
- }, {
127
- textKey: 'downloadPDF',
128
- onclick: function () {
129
- this.exportChart({
130
- type: 'application/pdf'
131
- });
132
- }
133
- }, {
134
- textKey: 'downloadSVG',
135
- onclick: function () {
136
- this.exportChart({
137
- type: 'image/svg+xml'
138
- });
139
- }
140
- }
141
- // Enable this block to add "View SVG" to the dropdown menu
142
- /*
143
- ,{
144
-
145
- text: 'View SVG',
146
- onclick: function () {
147
- var svg = this.getSVG()
148
- .replace(/</g, '\n&lt;')
149
- .replace(/>/g, '&gt;');
150
-
151
- doc.body.innerHTML = '<pre>' + svg + '</pre>';
152
- }
153
- } // */
154
- ]
155
- }
156
- }
157
- };
158
-
159
- // Add the Highcharts.post utility
160
- Highcharts.post = function (url, data) {
161
- var name,
162
- form;
163
-
164
- // create the form
165
- form = createElement('form', {
166
- method: 'post',
167
- action: url,
168
- enctype: 'multipart/form-data'
169
- }, {
170
- display: NONE
171
- }, doc.body);
172
-
173
- // add the data
174
- for (name in data) {
175
- createElement('input', {
176
- type: HIDDEN,
177
- name: name,
178
- value: data[name]
179
- }, null, form);
180
- }
181
-
182
- // submit
183
- form.submit();
184
-
185
- // clean up
186
- discardElement(form);
187
- };
188
-
189
- extend(Chart.prototype, {
190
-
191
- /**
192
- * Return an SVG representation of the chart
193
- *
194
- * @param additionalOptions {Object} Additional chart options for the generated SVG representation
195
- */
196
- getSVG: function (additionalOptions) {
197
- var chart = this,
198
- chartCopy,
199
- sandbox,
200
- svg,
201
- seriesOptions,
202
- sourceWidth,
203
- sourceHeight,
204
- cssWidth,
205
- cssHeight,
206
- options = merge(chart.options, additionalOptions); // copy the options and add extra options
207
-
208
- // IE compatibility hack for generating SVG content that it doesn't really understand
209
- if (!doc.createElementNS) {
210
- /*jslint unparam: true*//* allow unused parameter ns in function below */
211
- doc.createElementNS = function (ns, tagName) {
212
- return doc.createElement(tagName);
213
- };
214
- /*jslint unparam: false*/
215
- }
216
-
217
- // create a sandbox where a new chart will be generated
218
- sandbox = createElement(DIV, null, {
219
- position: ABSOLUTE,
220
- top: '-9999em',
221
- width: chart.chartWidth + PX,
222
- height: chart.chartHeight + PX
223
- }, doc.body);
224
-
225
- // get the source size
226
- cssWidth = chart.renderTo.style.width;
227
- cssHeight = chart.renderTo.style.height;
228
- sourceWidth = options.exporting.sourceWidth ||
229
- options.chart.width ||
230
- (/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
231
- 600;
232
- sourceHeight = options.exporting.sourceHeight ||
233
- options.chart.height ||
234
- (/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
235
- 400;
236
-
237
- // override some options
238
- extend(options.chart, {
239
- animation: false,
240
- renderTo: sandbox,
241
- forExport: true,
242
- width: sourceWidth,
243
- height: sourceHeight
244
- });
245
- options.exporting.enabled = false; // hide buttons in print
246
-
247
- // prepare for replicating the chart
248
- options.series = [];
249
- each(chart.series, function (serie) {
250
- seriesOptions = merge(serie.options, {
251
- animation: false, // turn off animation
252
- showCheckbox: false,
253
- visible: serie.visible
254
- });
255
-
256
- if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
257
- options.series.push(seriesOptions);
258
- }
259
- });
260
-
261
- // generate the chart copy
262
- chartCopy = new Highcharts.Chart(options, chart.callback);
263
-
264
- // reflect axis extremes in the export
265
- each(['xAxis', 'yAxis'], function (axisType) {
266
- each(chart[axisType], function (axis, i) {
267
- var axisCopy = chartCopy[axisType][i],
268
- extremes = axis.getExtremes(),
269
- userMin = extremes.userMin,
270
- userMax = extremes.userMax;
271
-
272
- if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {
273
- axisCopy.setExtremes(userMin, userMax, true, false);
274
- }
275
- });
276
- });
277
-
278
- // get the SVG from the container's innerHTML
279
- svg = chartCopy.container.innerHTML;
280
-
281
- // free up memory
282
- options = null;
283
- chartCopy.destroy();
284
- discardElement(sandbox);
285
-
286
- // sanitize
287
- svg = svg
288
- .replace(/zIndex="[^"]+"/g, '')
289
- .replace(/isShadow="[^"]+"/g, '')
290
- .replace(/symbolName="[^"]+"/g, '')
291
- .replace(/jQuery[0-9]+="[^"]+"/g, '')
292
- .replace(/url\([^#]+#/g, 'url(#')
293
- .replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
294
- .replace(/ href=/g, ' xlink:href=')
295
- .replace(/\n/, ' ')
296
- .replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
297
- /* This fails in IE < 8
298
- .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
299
- return s2 +'.'+ s3[0];
300
- })*/
301
-
302
- // Replace HTML entities, issue #347
303
- .replace(/&nbsp;/g, '\u00A0') // no-break space
304
- .replace(/&shy;/g, '\u00AD') // soft hyphen
305
-
306
- // IE specific
307
- .replace(/<IMG /g, '<image ')
308
- .replace(/height=([^" ]+)/g, 'height="$1"')
309
- .replace(/width=([^" ]+)/g, 'width="$1"')
310
- .replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>')
311
- .replace(/id=([^" >]+)/g, 'id="$1"')
312
- .replace(/class=([^" >]+)/g, 'class="$1"')
313
- .replace(/ transform /g, ' ')
314
- .replace(/:(path|rect)/g, '$1')
315
- .replace(/style="([^"]+)"/g, function (s) {
316
- return s.toLowerCase();
317
- });
318
-
319
- // IE9 beta bugs with innerHTML. Test again with final IE9.
320
- svg = svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g, '$1')
321
- .replace(/&quot;/g, "'");
322
-
323
- return svg;
324
- },
325
-
326
- /**
327
- * Submit the SVG representation of the chart to the server
328
- * @param {Object} options Exporting options. Possible members are url, type and width.
329
- * @param {Object} chartOptions Additional chart options for the SVG representation of the chart
330
- */
331
- exportChart: function (options, chartOptions) {
332
- options = options || {};
333
-
334
- var chart = this,
335
- chartExportingOptions = chart.options.exporting,
336
- svg = chart.getSVG(merge(
337
- { chart: { borderRadius: 0 } },
338
- chartExportingOptions.chartOptions,
339
- chartOptions,
340
- {
341
- exporting: {
342
- sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,
343
- sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight
344
- }
345
- }
346
- ));
347
-
348
- // merge the options
349
- options = merge(chart.options.exporting, options);
350
-
351
- // do the post
352
- Highcharts.post(options.url, {
353
- filename: options.filename || 'chart',
354
- type: options.type,
355
- width: options.width || 0, // IE8 fails to post undefined correctly, so use 0
356
- scale: options.scale || 2,
357
- svg: svg
358
- });
359
-
360
- },
361
-
362
- /**
363
- * Print the chart
364
- */
365
- print: function () {
366
-
367
- var chart = this,
368
- container = chart.container,
369
- origDisplay = [],
370
- origParent = container.parentNode,
371
- body = doc.body,
372
- childNodes = body.childNodes;
373
-
374
- if (chart.isPrinting) { // block the button while in printing mode
375
- return;
376
- }
377
-
378
- chart.isPrinting = true;
379
-
380
- // hide all body content
381
- each(childNodes, function (node, i) {
382
- if (node.nodeType === 1) {
383
- origDisplay[i] = node.style.display;
384
- node.style.display = NONE;
385
- }
386
- });
387
-
388
- // pull out the chart
389
- body.appendChild(container);
390
-
391
- // print
392
- win.focus(); // #1510
393
- win.print();
394
-
395
- // allow the browser to prepare before reverting
396
- setTimeout(function () {
397
-
398
- // put the chart back in
399
- origParent.appendChild(container);
400
-
401
- // restore all body content
402
- each(childNodes, function (node, i) {
403
- if (node.nodeType === 1) {
404
- node.style.display = origDisplay[i];
405
- }
406
- });
407
-
408
- chart.isPrinting = false;
409
-
410
- }, 1000);
411
-
412
- },
413
-
414
- /**
415
- * Display a popup menu for choosing the export type
416
- *
417
- * @param {String} name An identifier for the menu
418
- * @param {Array} items A collection with text and onclicks for the items
419
- * @param {Number} x The x position of the opener button
420
- * @param {Number} y The y position of the opener button
421
- * @param {Number} width The width of the opener button
422
- * @param {Number} height The height of the opener button
423
- */
424
- contextMenu: function (name, items, x, y, width, height, button) {
425
- var chart = this,
426
- navOptions = chart.options.navigation,
427
- menuItemStyle = navOptions.menuItemStyle,
428
- chartWidth = chart.chartWidth,
429
- chartHeight = chart.chartHeight,
430
- cacheName = 'cache-' + name,
431
- menu = chart[cacheName],
432
- menuPadding = mathMax(width, height), // for mouse leave detection
433
- boxShadow = '3px 3px 10px #888',
434
- innerMenu,
435
- hide,
436
- hideTimer,
437
- menuStyle;
438
-
439
- // create the menu only the first time
440
- if (!menu) {
441
-
442
- // create a HTML element above the SVG
443
- chart[cacheName] = menu = createElement(DIV, {
444
- className: PREFIX + name
445
- }, {
446
- position: ABSOLUTE,
447
- zIndex: 1000,
448
- padding: menuPadding + PX
449
- }, chart.container);
450
-
451
- innerMenu = createElement(DIV, null,
452
- extend({
453
- MozBoxShadow: boxShadow,
454
- WebkitBoxShadow: boxShadow,
455
- boxShadow: boxShadow
456
- }, navOptions.menuStyle), menu);
457
-
458
- // hide on mouse out
459
- hide = function () {
460
- css(menu, { display: NONE });
461
- if (button) {
462
- button.setState(0);
463
- }
464
- chart.openMenu = false;
465
- };
466
-
467
- // Hide the menu some time after mouse leave (#1357)
468
- addEvent(menu, 'mouseleave', function () {
469
- hideTimer = setTimeout(hide, 500);
470
- });
471
- addEvent(menu, 'mouseenter', function () {
472
- clearTimeout(hideTimer);
473
- });
474
-
475
-
476
- // create the items
477
- each(items, function (item) {
478
- if (item) {
479
- var element = item.separator ?
480
- createElement('hr', null, null, innerMenu) :
481
- createElement(DIV, {
482
- onmouseover: function () {
483
- css(this, navOptions.menuItemHoverStyle);
484
- },
485
- onmouseout: function () {
486
- css(this, menuItemStyle);
487
- },
488
- onclick: function () {
489
- hide();
490
- item.onclick.apply(chart, arguments);
491
- },
492
- innerHTML: item.text || chart.options.lang[item.textKey]
493
- }, extend({
494
- cursor: 'pointer'
495
- }, menuItemStyle), innerMenu);
496
-
497
-
498
- // Keep references to menu divs to be able to destroy them
499
- chart.exportDivElements.push(element);
500
- }
501
- });
502
-
503
- // Keep references to menu and innerMenu div to be able to destroy them
504
- chart.exportDivElements.push(innerMenu, menu);
505
-
506
- chart.exportMenuWidth = menu.offsetWidth;
507
- chart.exportMenuHeight = menu.offsetHeight;
508
- }
509
-
510
- menuStyle = { display: 'block' };
511
-
512
- // if outside right, right align it
513
- if (x + chart.exportMenuWidth > chartWidth) {
514
- menuStyle.right = (chartWidth - x - width - menuPadding) + PX;
515
- } else {
516
- menuStyle.left = (x - menuPadding) + PX;
517
- }
518
- // if outside bottom, bottom align it
519
- if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {
520
- menuStyle.bottom = (chartHeight - y - menuPadding) + PX;
521
- } else {
522
- menuStyle.top = (y + height - menuPadding) + PX;
523
- }
524
-
525
- css(menu, menuStyle);
526
- chart.openMenu = true;
527
- },
528
-
529
- /**
530
- * Add the export button to the chart
531
- */
532
- addButton: function (options) {
533
- var chart = this,
534
- renderer = chart.renderer,
535
- btnOptions = merge(chart.options.navigation.buttonOptions, options),
536
- onclick = btnOptions.onclick,
537
- menuItems = btnOptions.menuItems,
538
- symbol,
539
- button,
540
- symbolAttr = {
541
- stroke: btnOptions.symbolStroke,
542
- fill: btnOptions.symbolFill
543
- },
544
- symbolSize = btnOptions.symbolSize || 12,
545
- menuKey;
546
-
547
- if (!chart.btnCount) {
548
- chart.btnCount = 0;
549
- }
550
- menuKey = chart.btnCount++;
551
-
552
- // Keeps references to the button elements
553
- if (!chart.exportDivElements) {
554
- chart.exportDivElements = [];
555
- chart.exportSVGElements = [];
556
- }
557
-
558
- if (btnOptions.enabled === false) {
559
- return;
560
- }
561
-
562
-
563
- var attr = btnOptions.theme,
564
- states = attr.states,
565
- hover = states && states.hover,
566
- select = states && states.select,
567
- callback;
568
-
569
- delete attr.states;
570
-
571
- if (onclick) {
572
- callback = function () {
573
- onclick.apply(chart, arguments);
574
- };
575
-
576
- } else if (menuItems) {
577
- callback = function () {
578
- chart.contextMenu(
579
- 'contextmenu',
580
- menuItems,
581
- button.translateX,
582
- button.translateY,
583
- button.width,
584
- button.height,
585
- button
586
- );
587
- button.setState(2);
588
- };
589
- }
590
-
591
-
592
- if (btnOptions.text && btnOptions.symbol) {
593
- attr.paddingLeft = Highcharts.pick(attr.paddingLeft, 25);
594
-
595
- } else if (!btnOptions.text) {
596
- extend(attr, {
597
- width: btnOptions.width,
598
- height: btnOptions.height,
599
- padding: 0
600
- });
601
- }
602
-
603
- button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)
604
- .attr({
605
- title: chart.options.lang[btnOptions._titleKey],
606
- 'stroke-linecap': 'round'
607
- });
608
-
609
- if (btnOptions.symbol) {
610
- symbol = renderer.symbol(
611
- btnOptions.symbol,
612
- btnOptions.symbolX - (symbolSize / 2),
613
- btnOptions.symbolY - (symbolSize / 2),
614
- symbolSize,
615
- symbolSize
616
- )
617
- .attr(extend(symbolAttr, {
618
- 'stroke-width': btnOptions.symbolStrokeWidth || 1,
619
- zIndex: 1
620
- })).add(button);
621
- }
622
-
623
- button.add()
624
- .align(extend(btnOptions, {
625
- width: button.width,
626
- x: Highcharts.pick(btnOptions.x, buttonOffset) // #1654
627
- }), true, 'spacingBox');
628
-
629
- buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);
630
-
631
- chart.exportSVGElements.push(button, symbol);
632
-
633
- },
634
-
635
- /**
636
- * Destroy the buttons.
637
- */
638
- destroyExport: function (e) {
639
- var chart = e.target,
640
- i,
641
- elem;
642
-
643
- // Destroy the extra buttons added
644
- for (i = 0; i < chart.exportSVGElements.length; i++) {
645
- elem = chart.exportSVGElements[i];
646
-
647
- // Destroy and null the svg/vml elements
648
- if (elem) { // #1822
649
- elem.onclick = elem.ontouchstart = null;
650
- chart.exportSVGElements[i] = elem.destroy();
651
- }
652
- }
653
-
654
- // Destroy the divs for the menu
655
- for (i = 0; i < chart.exportDivElements.length; i++) {
656
- elem = chart.exportDivElements[i];
657
-
658
- // Remove the event handler
659
- removeEvent(elem, 'mouseleave');
660
-
661
- // Remove inline events
662
- chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;
663
-
664
- // Destroy the div by moving to garbage bin
665
- discardElement(elem);
666
- }
667
- }
668
- });
669
-
670
-
671
- symbols.menu = function (x, y, width, height) {
672
- var arr = [
673
- M, x, y + 2.5,
674
- L, x + width, y + 2.5,
675
- M, x, y + height / 2 + 0.5,
676
- L, x + width, y + height / 2 + 0.5,
677
- M, x, y + height - 1.5,
678
- L, x + width, y + height - 1.5
679
- ];
680
- return arr;
681
- };
682
-
683
- // Add the buttons on chart load
684
- Chart.prototype.callbacks.push(function (chart) {
685
- var n,
686
- exportingOptions = chart.options.exporting,
687
- buttons = exportingOptions.buttons;
688
-
689
- buttonOffset = 0;
690
-
691
- if (exportingOptions.enabled !== false) {
692
-
693
- for (n in buttons) {
694
- chart.addButton(buttons[n]);
695
- }
696
-
697
- // Destroy the export elements at chart destroy
698
- addEvent(chart, 'destroy', chart.destroyExport);
699
- }
700
-
701
- });
702
-
703
-
704
- }(Highcharts));
1
+ /*
2
+ Highcharts JS v3.0.5 (2013-08-23)
3
+ Exporting module
4
+
5
+ (c) 2010-2013 Torstein Hønsi
6
+
7
+ License: www.highcharts.com/license
8
+ */
9
+ (function(e){var y=e.Chart,v=e.addEvent,B=e.removeEvent,m=e.createElement,j=e.discardElement,t=e.css,k=e.merge,r=e.each,p=e.extend,C=Math.max,i=document,z=window,D=e.isTouchDevice,E=e.Renderer.prototype.symbols,s=e.getOptions(),w;p(s.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});s.navigation={menuStyle:{border:"1px solid #A0A0A0",
10
+ background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:D?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};s.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{symbol:"menu",
11
+ _titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};e.post=function(a,b){var c,d;d=m("form",{method:"post",action:a,enctype:"multipart/form-data"},
12
+ {display:"none"},i.body);for(c in b)m("input",{type:"hidden",name:c,value:b[c]},null,d);d.submit();j(d)};p(y.prototype,{getSVG:function(a){var b=this,c,d,x,g,f=k(b.options,a);if(!i.createElementNS)i.createElementNS=function(a,b){return i.createElement(b)};a=m("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},i.body);d=b.renderTo.style.width;g=b.renderTo.style.height;d=f.exporting.sourceWidth||f.chart.width||/px$/.test(d)&&parseInt(d,10)||600;g=f.exporting.sourceHeight||
13
+ f.chart.height||/px$/.test(g)&&parseInt(g,10)||400;p(f.chart,{animation:!1,renderTo:a,forExport:!0,width:d,height:g});f.exporting.enabled=!1;f.series=[];r(b.series,function(a){x=k(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});x.isInternal||f.series.push(x)});c=new e.Chart(f,b.callback);r(["xAxis","yAxis"],function(a){r(b[a],function(b,f){var d=c[a][f],e=b.getExtremes(),g=e.userMin,e=e.userMax;d&&(g!==void 0||e!==void 0)&&d.setExtremes(g,e,!0,!1)})});d=c.container.innerHTML;f=null;c.destroy();
14
+ j(a);d=d.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g," xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/&nbsp;/g," ").replace(/&shy;/g,"­").replace(/<IMG /g,"<image ").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,
15
+ 'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});return d=d.replace(/(url\(#highcharts-[0-9]+)&quot;/g,"$1").replace(/&quot;/g,"'")},exportChart:function(a,b){var a=a||{},c=this.options.exporting,c=this.getSVG(k({chart:{borderRadius:0}},c.chartOptions,b,{exporting:{sourceWidth:a.sourceWidth||c.sourceWidth,sourceHeight:a.sourceHeight||
16
+ c.sourceHeight}})),a=k(this.options.exporting,a);e.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale||2,svg:c})},print:function(){var a=this,b=a.container,c=[],d=b.parentNode,e=i.body,g=e.childNodes;if(!a.isPrinting)a.isPrinting=!0,r(g,function(a,b){if(a.nodeType===1)c[b]=a.style.display,a.style.display="none"}),e.appendChild(b),z.focus(),z.print(),setTimeout(function(){d.appendChild(b);r(g,function(a,b){if(a.nodeType===1)a.style.display=c[b]});a.isPrinting=!1},1E3)},
17
+ contextMenu:function(a,b,c,d,e,g,f){var h=this,q=h.options.navigation,n=q.menuItemStyle,o=h.chartWidth,i=h.chartHeight,A="cache-"+a,l=h[A],k=C(e,g),u,j,s;if(!l)h[A]=l=m("div",{className:"highcharts-"+a},{position:"absolute",zIndex:1E3,padding:k+"px"},h.container),u=m("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},q.menuStyle),l),j=function(){t(l,{display:"none"});f&&f.setState(0);h.openMenu=!1},v(l,"mouseleave",function(){s=setTimeout(j,
18
+ 500)}),v(l,"mouseenter",function(){clearTimeout(s)}),r(b,function(a){if(a){var b=a.separator?m("hr",null,null,u):m("div",{onmouseover:function(){t(this,q.menuItemHoverStyle)},onmouseout:function(){t(this,n)},onclick:function(){j();a.onclick.apply(h,arguments)},innerHTML:a.text||h.options.lang[a.textKey]},p({cursor:"pointer"},n),u);h.exportDivElements.push(b)}}),h.exportDivElements.push(u,l),h.exportMenuWidth=l.offsetWidth,h.exportMenuHeight=l.offsetHeight;a={display:"block"};c+h.exportMenuWidth>o?
19
+ a.right=o-c-e-k+"px":a.left=c-k+"px";d+g+h.exportMenuHeight>i&&f.alignOptions.verticalAlign!=="top"?a.bottom=i-d-k+"px":a.top=d+g-k+"px";t(l,a);h.openMenu=!0},addButton:function(a){var b=this,c=b.renderer,a=k(b.options.navigation.buttonOptions,a),d=a.onclick,i=a.menuItems,g,f,h={stroke:a.symbolStroke,fill:a.symbolFill},q=a.symbolSize||12;if(!b.btnCount)b.btnCount=0;b.btnCount++;if(!b.exportDivElements)b.exportDivElements=[],b.exportSVGElements=[];if(a.enabled!==!1){var n=a.theme,o=n.states,m=o&&o.hover,
20
+ o=o&&o.select,j;delete n.states;d?j=function(){d.apply(b,arguments)}:i&&(j=function(){b.contextMenu("contextmenu",i,f.translateX,f.translateY,f.width,f.height,f);f.setState(2)});a.text&&a.symbol?n.paddingLeft=e.pick(n.paddingLeft,25):a.text||p(n,{width:a.width,height:a.height,padding:0});f=c.button(a.text,0,0,j,n,m,o).attr({title:b.options.lang[a._titleKey],"stroke-linecap":"round"});a.symbol&&(g=c.symbol(a.symbol,a.symbolX-q/2,a.symbolY-q/2,q,q).attr(p(h,{"stroke-width":a.symbolStrokeWidth||1,zIndex:1})).add(f));
21
+ f.add().align(p(a,{width:f.width,x:e.pick(a.x,w)}),!0,"spacingBox");w+=(f.width+a.buttonSpacing)*(a.align==="right"?-1:1);b.exportSVGElements.push(f,g)}},destroyExport:function(a){var a=a.target,b,c;for(b=0;b<a.exportSVGElements.length;b++)if(c=a.exportSVGElements[b])c.onclick=c.ontouchstart=null,a.exportSVGElements[b]=c.destroy();for(b=0;b<a.exportDivElements.length;b++)c=a.exportDivElements[b],B(c,"mouseleave"),a.exportDivElements[b]=c.onmouseout=c.onmouseover=c.ontouchstart=c.onclick=null,j(c)}});
22
+ E.menu=function(a,b,c,d){return["M",a,b+2.5,"L",a+c,b+2.5,"M",a,b+d/2+0.5,"L",a+c,b+d/2+0.5,"M",a,b+d-1.5,"L",a+c,b+d-1.5]};y.prototype.callbacks.push(function(a){var b,c=a.options.exporting,d=c.buttons;w=0;if(c.enabled!==!1){for(b in d)a.addButton(d[b]);v(a,"destroy",a.destroyExport)}})})(Highcharts);