You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
12 KiB
409 lines
12 KiB
/*
|
|
Highcharts JS v3.0.6 (2013-10-04)
|
|
Exporting module
|
|
|
|
(c) 2010-2013 Torstein Hønsi
|
|
|
|
License: www.highcharts.com/license
|
|
*/
|
|
(function (f) {
|
|
var A = f.Chart,
|
|
t = f.addEvent,
|
|
C = f.removeEvent,
|
|
k = f.createElement,
|
|
n = f.discardElement,
|
|
u = f.css,
|
|
o = f.merge,
|
|
r = f.each,
|
|
p = f.extend,
|
|
D = Math.max,
|
|
j = document,
|
|
B = window,
|
|
E = f.isTouchDevice,
|
|
F = f.Renderer.prototype.symbols,
|
|
x = f.getOptions(),
|
|
y;
|
|
p(x.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',
|
|
});
|
|
x.navigation = {
|
|
menuStyle: { border: '1px solid #A0A0A0', background: '#FFFFFF', padding: '5px 0' },
|
|
menuItemStyle: {
|
|
padding: '0 10px',
|
|
background: 'none',
|
|
color: '#303030',
|
|
fontSize: E ? '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,
|
|
},
|
|
};
|
|
x.exporting = {
|
|
type: 'image/png',
|
|
url: 'http://export.highcharts.com/',
|
|
buttons: {
|
|
contextButton: {
|
|
menuClassName: 'highcharts-contextmenu',
|
|
symbol: 'menu',
|
|
_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' });
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
f.post = function (c, a) {
|
|
var d, b;
|
|
b = k(
|
|
'form',
|
|
{ method: 'post', action: c, enctype: 'multipart/form-data' },
|
|
{ display: 'none' },
|
|
j.body,
|
|
);
|
|
for (d in a) k('input', { type: 'hidden', name: d, value: a[d] }, null, b);
|
|
b.submit();
|
|
n(b);
|
|
};
|
|
p(A.prototype, {
|
|
getSVG: function (c) {
|
|
var a = this,
|
|
d,
|
|
b,
|
|
z,
|
|
h,
|
|
g = o(a.options, c);
|
|
if (!j.createElementNS)
|
|
j.createElementNS = function (a, b) {
|
|
return j.createElement(b);
|
|
};
|
|
c = k(
|
|
'div',
|
|
null,
|
|
{
|
|
position: 'absolute',
|
|
top: '-9999em',
|
|
width: a.chartWidth + 'px',
|
|
height: a.chartHeight + 'px',
|
|
},
|
|
j.body,
|
|
);
|
|
b = a.renderTo.style.width;
|
|
h = a.renderTo.style.height;
|
|
b = g.exporting.sourceWidth || g.chart.width || (/px$/.test(b) && parseInt(b, 10)) || 600;
|
|
h = g.exporting.sourceHeight || g.chart.height || (/px$/.test(h) && parseInt(h, 10)) || 400;
|
|
p(g.chart, { animation: !1, renderTo: c, forExport: !0, width: b, height: h });
|
|
g.exporting.enabled = !1;
|
|
g.series = [];
|
|
r(a.series, function (a) {
|
|
z = o(a.options, { animation: !1, showCheckbox: !1, visible: a.visible });
|
|
z.isInternal || g.series.push(z);
|
|
});
|
|
d = new f.Chart(g, a.callback);
|
|
r(['xAxis', 'yAxis'], function (b) {
|
|
r(a[b], function (a, c) {
|
|
var g = d[b][c],
|
|
f = a.getExtremes(),
|
|
h = f.userMin,
|
|
f = f.userMax;
|
|
g && (h !== void 0 || f !== void 0) && g.setExtremes(h, f, !0, !1);
|
|
});
|
|
});
|
|
b = d.container.innerHTML;
|
|
g = null;
|
|
d.destroy();
|
|
n(c);
|
|
b = b
|
|
.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(/ /g, ' ')
|
|
.replace(/­/g, '')
|
|
.replace(/<IMG /g, '<image ')
|
|
.replace(/height=([^" ]+)/g, 'height="$1"')
|
|
.replace(/width=([^" ]+)/g, 'width="$1"')
|
|
.replace(/hc-svg-href="([^"]+)">/g, '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 (b = b.replace(/(url\(#highcharts-[0-9]+)"/g, '$1').replace(/"/g, "'"));
|
|
},
|
|
exportChart: function (c, a) {
|
|
var c = c || {},
|
|
d = this.options.exporting,
|
|
d = this.getSVG(
|
|
o({ chart: { borderRadius: 0 } }, d.chartOptions, a, {
|
|
exporting: {
|
|
sourceWidth: c.sourceWidth || d.sourceWidth,
|
|
sourceHeight: c.sourceHeight || d.sourceHeight,
|
|
},
|
|
}),
|
|
),
|
|
c = o(this.options.exporting, c);
|
|
f.post(c.url, {
|
|
filename: c.filename || 'chart',
|
|
type: c.type,
|
|
width: c.width || 0,
|
|
scale: c.scale || 2,
|
|
svg: d,
|
|
});
|
|
},
|
|
print: function () {
|
|
var c = this,
|
|
a = c.container,
|
|
d = [],
|
|
b = a.parentNode,
|
|
f = j.body,
|
|
h = f.childNodes;
|
|
if (!c.isPrinting)
|
|
(c.isPrinting = !0),
|
|
r(h, function (a, b) {
|
|
if (a.nodeType === 1) (d[b] = a.style.display), (a.style.display = 'none');
|
|
}),
|
|
f.appendChild(a),
|
|
B.focus(),
|
|
B.print(),
|
|
setTimeout(function () {
|
|
b.appendChild(a);
|
|
r(h, function (a, b) {
|
|
if (a.nodeType === 1) a.style.display = d[b];
|
|
});
|
|
c.isPrinting = !1;
|
|
}, 1e3);
|
|
},
|
|
contextMenu: function (c, a, d, b, f, h, g) {
|
|
var e = this,
|
|
j = e.options.navigation,
|
|
q = j.menuItemStyle,
|
|
l = e.chartWidth,
|
|
m = e.chartHeight,
|
|
o = 'cache-' + c,
|
|
i = e[o],
|
|
s = D(f, h),
|
|
v,
|
|
w,
|
|
n;
|
|
if (!i)
|
|
(e[o] = i =
|
|
k(
|
|
'div',
|
|
{ className: c },
|
|
{ position: 'absolute', zIndex: 1e3, padding: s + 'px' },
|
|
e.container,
|
|
)),
|
|
(v = k(
|
|
'div',
|
|
null,
|
|
p(
|
|
{
|
|
MozBoxShadow: '3px 3px 10px #888',
|
|
WebkitBoxShadow: '3px 3px 10px #888',
|
|
boxShadow: '3px 3px 10px #888',
|
|
},
|
|
j.menuStyle,
|
|
),
|
|
i,
|
|
)),
|
|
(w = function () {
|
|
u(i, { display: 'none' });
|
|
g && g.setState(0);
|
|
e.openMenu = !1;
|
|
}),
|
|
t(i, 'mouseleave', function () {
|
|
n = setTimeout(w, 500);
|
|
}),
|
|
t(i, 'mouseenter', function () {
|
|
clearTimeout(n);
|
|
}),
|
|
t(document, 'mousedown', function (a) {
|
|
e.pointer.inClass(a.target, c) || w();
|
|
}),
|
|
r(a, function (a) {
|
|
if (a) {
|
|
var b = a.separator
|
|
? k('hr', null, null, v)
|
|
: k(
|
|
'div',
|
|
{
|
|
onmouseover: function () {
|
|
u(this, j.menuItemHoverStyle);
|
|
},
|
|
onmouseout: function () {
|
|
u(this, q);
|
|
},
|
|
onclick: function () {
|
|
w();
|
|
a.onclick.apply(e, arguments);
|
|
},
|
|
innerHTML: a.text || e.options.lang[a.textKey],
|
|
},
|
|
p({ cursor: 'pointer' }, q),
|
|
v,
|
|
);
|
|
e.exportDivElements.push(b);
|
|
}
|
|
}),
|
|
e.exportDivElements.push(v, i),
|
|
(e.exportMenuWidth = i.offsetWidth),
|
|
(e.exportMenuHeight = i.offsetHeight);
|
|
a = { display: 'block' };
|
|
d + e.exportMenuWidth > l ? (a.right = l - d - f - s + 'px') : (a.left = d - s + 'px');
|
|
b + h + e.exportMenuHeight > m && g.alignOptions.verticalAlign !== 'top'
|
|
? (a.bottom = m - b - s + 'px')
|
|
: (a.top = b + h - s + 'px');
|
|
u(i, a);
|
|
e.openMenu = !0;
|
|
},
|
|
addButton: function (c) {
|
|
var a = this,
|
|
d = a.renderer,
|
|
b = o(a.options.navigation.buttonOptions, c),
|
|
j = b.onclick,
|
|
h = b.menuItems,
|
|
g,
|
|
e,
|
|
k = { stroke: b.symbolStroke, fill: b.symbolFill },
|
|
q = b.symbolSize || 12;
|
|
if (!a.btnCount) a.btnCount = 0;
|
|
if (!a.exportDivElements) (a.exportDivElements = []), (a.exportSVGElements = []);
|
|
if (b.enabled !== !1) {
|
|
var l = b.theme,
|
|
m = l.states,
|
|
n = m && m.hover,
|
|
m = m && m.select,
|
|
i;
|
|
delete l.states;
|
|
j
|
|
? (i = function () {
|
|
j.apply(a, arguments);
|
|
})
|
|
: h &&
|
|
(i = function () {
|
|
a.contextMenu(e.menuClassName, h, e.translateX, e.translateY, e.width, e.height, e);
|
|
e.setState(2);
|
|
});
|
|
b.text && b.symbol
|
|
? (l.paddingLeft = f.pick(l.paddingLeft, 25))
|
|
: b.text || p(l, { width: b.width, height: b.height, padding: 0 });
|
|
e = d
|
|
.button(b.text, 0, 0, i, l, n, m)
|
|
.attr({ title: a.options.lang[b._titleKey], 'stroke-linecap': 'round' });
|
|
e.menuClassName = c.menuClassName || 'highcharts-menu-' + a.btnCount++;
|
|
b.symbol &&
|
|
(g = d
|
|
.symbol(b.symbol, b.symbolX - q / 2, b.symbolY - q / 2, q, q)
|
|
.attr(p(k, { 'stroke-width': b.symbolStrokeWidth || 1, zIndex: 1 }))
|
|
.add(e));
|
|
e.add().align(p(b, { width: e.width, x: f.pick(b.x, y) }), !0, 'spacingBox');
|
|
y += (e.width + b.buttonSpacing) * (b.align === 'right' ? -1 : 1);
|
|
a.exportSVGElements.push(e, g);
|
|
}
|
|
},
|
|
destroyExport: function (c) {
|
|
var c = c.target,
|
|
a,
|
|
d;
|
|
for (a = 0; a < c.exportSVGElements.length; a++)
|
|
if ((d = c.exportSVGElements[a]))
|
|
(d.onclick = d.ontouchstart = null), (c.exportSVGElements[a] = d.destroy());
|
|
for (a = 0; a < c.exportDivElements.length; a++)
|
|
(d = c.exportDivElements[a]),
|
|
C(d, 'mouseleave'),
|
|
(c.exportDivElements[a] =
|
|
d.onmouseout =
|
|
d.onmouseover =
|
|
d.ontouchstart =
|
|
d.onclick =
|
|
null),
|
|
n(d);
|
|
},
|
|
});
|
|
F.menu = function (c, a, d, b) {
|
|
return [
|
|
'M',
|
|
c,
|
|
a + 2.5,
|
|
'L',
|
|
c + d,
|
|
a + 2.5,
|
|
'M',
|
|
c,
|
|
a + b / 2 + 0.5,
|
|
'L',
|
|
c + d,
|
|
a + b / 2 + 0.5,
|
|
'M',
|
|
c,
|
|
a + b - 1.5,
|
|
'L',
|
|
c + d,
|
|
a + b - 1.5,
|
|
];
|
|
};
|
|
A.prototype.callbacks.push(function (c) {
|
|
var a,
|
|
d = c.options.exporting,
|
|
b = d.buttons;
|
|
y = 0;
|
|
if (d.enabled !== !1) {
|
|
for (a in b) c.addButton(b[a]);
|
|
t(c, 'destroy', c.destroyExport);
|
|
}
|
|
});
|
|
})(Highcharts);
|
|
|