-
-
Save kennyjwilli/37d7856abdd56b4ee282a869fbe0abd0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Highcharts JS v8.0.0 (2019-12-10) | |
(c) 2009-2018 Torstein Honsi | |
License: www.highcharts.com/license | |
*/ | |
(function(S, M) { | |
"object" === typeof module && module.exports ? (M["default"] = M, module.exports = S.document ? M(S) : M) : "function" === typeof define && define.amd ? define("highcharts/highcharts", function() { | |
return M(S) | |
}) : (S.Highcharts && S.Highcharts.error(16, !0), S.Highcharts = M(S)) | |
})("undefined" !== typeof window ? window : this, function(S) { | |
function M(c, e, F, I) { | |
c.hasOwnProperty(e) || (c[e] = I.apply(null, F)) | |
} | |
var J = {}; | |
M(J, "parts/Globals.js", [], function() { | |
var c = "undefined" !== typeof S ? S : "undefined" !== typeof window ? window : {}, | |
e = c.document, | |
F = c.navigator && c.navigator.userAgent || "", | |
I = e && e.createElementNS && !!e.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect, | |
G = /(edge|msie|trident)/i.test(F) && !c.opera, | |
H = -1 !== F.indexOf("Firefox"), | |
v = -1 !== F.indexOf("Chrome"), | |
q = H && 4 > parseInt(F.split("Firefox/")[1], 10); | |
return { | |
product: "Highcharts", | |
version: "8.0.0", | |
deg2rad: 2 * Math.PI / 360, | |
doc: e, | |
hasBidiBug: q, | |
hasTouch: !!c.TouchEvent, | |
isMS: G, | |
isWebKit: -1 !== F.indexOf("AppleWebKit"), | |
isFirefox: H, | |
isChrome: v, | |
isSafari: !v && -1 !== F.indexOf("Safari"), | |
isTouchDevice: /(Mobile|Android|Windows Phone)/.test(F), | |
SVG_NS: "http://www.w3.org/2000/svg", | |
chartCount: 0, | |
seriesTypes: {}, | |
symbolSizes: {}, | |
svg: I, | |
win: c, | |
marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"], | |
noop: function() {}, | |
charts: [], | |
dateFormats: {} | |
} | |
}); | |
M(J, "parts/Utilities.js", [J["parts/Globals.js"]], function(c) { | |
function e(d, a) { | |
return parseInt(d, a || 10) | |
} | |
function F(d) { | |
return "string" === typeof d | |
} | |
function I(d) { | |
d = Object.prototype.toString.call(d); | |
return "[object Array]" === d || "[object Array Iterator]" === d | |
} | |
function G(d, a) { | |
return !!d && "object" === typeof d && (!a || | |
!I(d)) | |
} | |
function H(d) { | |
return G(d) && "number" === typeof d.nodeType | |
} | |
function v(d) { | |
var a = d && d.constructor; | |
return !(!G(d, !0) || H(d) || !a || !a.name || "Object" === a.name) | |
} | |
function q(d) { | |
return "number" === typeof d && !isNaN(d) && Infinity > d && -Infinity < d | |
} | |
function C(d) { | |
return "undefined" !== typeof d && null !== d | |
} | |
function B(d, a, b) { | |
var h; | |
F(a) ? C(b) ? d.setAttribute(a, b) : d && d.getAttribute && ((h = d.getAttribute(a)) || "class" !== a || (h = d.getAttribute(a + "Name"))) : A(a, function(a, h) { | |
d.setAttribute(h, a) | |
}); | |
return h | |
} | |
function u(d, a) { | |
var h; | |
d || (d = {}); | |
for (h in a) d[h] = a[h]; | |
return d | |
} | |
function w() { | |
for (var d = arguments, a = d.length, b = 0; b < a; b++) { | |
var l = d[b]; | |
if ("undefined" !== typeof l && null !== l) return l | |
} | |
} | |
function m(d, a) { | |
var h = function() {}; | |
h.prototype = new d; | |
u(h.prototype, a); | |
return h | |
} | |
function r(d, a) { | |
return parseFloat(d.toPrecision(a || 14)) | |
} | |
function D(d, a, b, l) { | |
d = +d || 0; | |
a = +a; | |
var h = c.defaultOptions.lang, | |
k = (d.toString().split(".")[1] || "").split("e")[0].length, | |
g = d.toString().split("e"); | |
if (-1 === a) a = Math.min(k, 20); | |
else if (!q(a)) a = 2; | |
else if (a && g[1] && 0 > g[1]) { | |
var t = | |
a + +g[1]; | |
0 <= t ? (g[0] = (+g[0]).toExponential(t).split("e")[0], a = t) : (g[0] = g[0].split(".")[0] || 0, d = 20 > a ? (g[0] * Math.pow(10, g[1])).toFixed(a) : 0, g[1] = 0) | |
} | |
var x = (Math.abs(g[1] ? g[0] : d) + Math.pow(10, -Math.max(a, k) - 1)).toFixed(a); | |
k = String(e(x)); | |
t = 3 < k.length ? k.length % 3 : 0; | |
b = w(b, h.decimalPoint); | |
l = w(l, h.thousandsSep); | |
d = (0 > d ? "-" : "") + (t ? k.substr(0, t) + l : ""); | |
d += k.substr(t).replace(/(\d{3})(?=\d)/g, "$1" + l); | |
a && (d += b + x.slice(-a)); | |
g[1] && 0 !== +d && (d += "e" + g[1]); | |
return d | |
} | |
function A(d, a, b) { | |
for (var h in d) Object.hasOwnProperty.call(d, | |
h) && a.call(b || d[h], d[h], h, d) | |
} | |
c.timers = []; | |
var f = c.charts, | |
b = c.doc, | |
a = c.win; | |
c.error = function(d, b, k, l) { | |
var h = q(d), | |
f = h ? "Highcharts error #" + d + ": www.highcharts.com/errors/" + d + "/" : d.toString(), | |
g = function() { | |
if (b) throw Error(f); | |
a.console && console.log(f) | |
}; | |
if ("undefined" !== typeof l) { | |
var t = ""; | |
h && (f += "?"); | |
c.objectEach(l, function(d, a) { | |
t += "\n" + a + ": " + d; | |
h && (f += encodeURI(a) + "=" + encodeURI(d)) | |
}); | |
f += t | |
} | |
k ? c.fireEvent(k, "displayError", { | |
code: d, | |
message: f, | |
params: l | |
}, g) : g() | |
}; | |
c.Fx = function(d, a, b) { | |
this.options = a; | |
this.elem = d; | |
this.prop = | |
b | |
}; | |
c.Fx.prototype = { | |
dSetter: function() { | |
var d = this.paths[0], | |
a = this.paths[1], | |
b = [], | |
l = this.now, | |
f = d.length; | |
if (1 === l) b = this.toD; | |
else if (f === a.length && 1 > l) | |
for (; f--;) { | |
var p = parseFloat(d[f]); | |
b[f] = isNaN(p) || "A" === a[f - 4] || "A" === a[f - 5] ? a[f] : l * parseFloat("" + (a[f] - p)) + p | |
} else b = a; | |
this.elem.attr("d", b, null, !0) | |
}, | |
update: function() { | |
var d = this.elem, | |
a = this.prop, | |
b = this.now, | |
l = this.options.step; | |
if (this[a + "Setter"]) this[a + "Setter"](); | |
else d.attr ? d.element && d.attr(a, b, null, !0) : d.style[a] = b + this.unit; | |
l && l.call(d, b, this) | |
}, | |
run: function(d, | |
b, k) { | |
var h = this, | |
f = h.options, | |
p = function(d) { | |
return p.stopped ? !1 : h.step(d) | |
}, | |
g = a.requestAnimationFrame || function(d) { | |
setTimeout(d, 13) | |
}, | |
t = function() { | |
for (var d = 0; d < c.timers.length; d++) c.timers[d]() || c.timers.splice(d--, 1); | |
c.timers.length && g(t) | |
}; | |
d !== b || this.elem["forceAnimate:" + this.prop] ? (this.startTime = +new Date, this.start = d, this.end = b, this.unit = k, this.now = this.start, this.pos = 0, p.elem = this.elem, p.prop = this.prop, p() && 1 === c.timers.push(p) && g(t)) : (delete f.curAnim[this.prop], f.complete && 0 === Object.keys(f.curAnim).length && | |
f.complete.call(this.elem)) | |
}, | |
step: function(d) { | |
var a = +new Date, | |
b = this.options, | |
l = this.elem, | |
f = b.complete, | |
p = b.duration, | |
g = b.curAnim; | |
if (l.attr && !l.element) d = !1; | |
else if (d || a >= p + this.startTime) { | |
this.now = this.end; | |
this.pos = 1; | |
this.update(); | |
var t = g[this.prop] = !0; | |
A(g, function(d) { | |
!0 !== d && (t = !1) | |
}); | |
t && f && f.call(l); | |
d = !1 | |
} else this.pos = b.easing((a - this.startTime) / p), this.now = this.start + (this.end - this.start) * this.pos, this.update(), d = !0; | |
return d | |
}, | |
initPath: function(d, a, b) { | |
function h(d) { | |
for (n = d.length; n--;) { | |
var a = "M" === | |
d[n] || "L" === d[n]; | |
var b = /[a-zA-Z]/.test(d[n + 3]); | |
a && b && d.splice(n + 1, 0, d[n + 1], d[n + 2], d[n + 1], d[n + 2]) | |
} | |
} | |
function f(d, a) { | |
for (; d.length < r;) { | |
d[0] = a[r - d.length]; | |
var b = d.slice(0, c); | |
[].splice.apply(d, [0, 0].concat(b)); | |
z && (b = d.slice(d.length - c), [].splice.apply(d, [d.length, 0].concat(b)), n--) | |
} | |
d[0] = "M" | |
} | |
function k(d, a) { | |
for (var b = (r - d.length) / c; 0 < b && b--;) E = d.slice().splice(d.length / N - c, c * N), E[0] = a[r - c - b * c], x && (E[c - 6] = E[c - 2], E[c - 5] = E[c - 1]), [].splice.apply(d, [d.length / N, 0].concat(E)), z && b-- | |
} | |
a = a || ""; | |
var g = d.startX, | |
t = d.endX, | |
x = -1 < a.indexOf("C"), | |
c = x ? 7 : 3, | |
E, n; | |
a = a.split(" "); | |
b = b.slice(); | |
var z = d.isArea, | |
N = z ? 2 : 1; | |
x && (h(a), h(b)); | |
if (g && t) { | |
for (n = 0; n < g.length; n++) | |
if (g[n] === t[0]) { | |
var O = n; | |
break | |
} else if (g[0] === t[t.length - g.length + n]) { | |
O = n; | |
var A = !0; | |
break | |
} else if (g[g.length - 1] === t[t.length - g.length + n]) { | |
O = g.length - n; | |
break | |
} | |
"undefined" === typeof O && (a = []) | |
} | |
if (a.length && q(O)) { | |
var r = b.length + O * N * c; | |
A ? (f(a, b), k(b, a)) : (f(b, a), k(a, b)) | |
} | |
return [a, b] | |
}, | |
fillSetter: function() { | |
c.Fx.prototype.strokeSetter.apply(this, arguments) | |
}, | |
strokeSetter: function() { | |
this.elem.attr(this.prop, | |
c.color(this.start).tweenTo(c.color(this.end), this.pos), null, !0) | |
} | |
}; | |
c.merge = function() { | |
var d, a = arguments, | |
b = {}, | |
l = function(d, a) { | |
"object" !== typeof d && (d = {}); | |
A(a, function(b, h) { | |
!G(b, !0) || v(b) || H(b) ? d[h] = a[h] : d[h] = l(d[h] || {}, b) | |
}); | |
return d | |
}; | |
!0 === a[0] && (b = a[1], a = Array.prototype.slice.call(a, 2)); | |
var f = a.length; | |
for (d = 0; d < f; d++) b = l(b, a[d]); | |
return b | |
}; | |
c.clearTimeout = function(d) { | |
C(d) && clearTimeout(d) | |
}; | |
c.css = function(d, a) { | |
c.isMS && !c.svg && a && "undefined" !== typeof a.opacity && (a.filter = "alpha(opacity=" + 100 * a.opacity + | |
")"); | |
u(d.style, a) | |
}; | |
c.createElement = function(d, a, f, l, y) { | |
d = b.createElement(d); | |
var h = c.css; | |
a && u(d, a); | |
y && h(d, { | |
padding: "0", | |
border: "none", | |
margin: "0" | |
}); | |
f && h(d, f); | |
l && l.appendChild(d); | |
return d | |
}; | |
c.datePropsToTimestamps = function(d) { | |
A(d, function(a, b) { | |
G(a) && "function" === typeof a.getTime ? d[b] = a.getTime() : (G(a) || I(a)) && c.datePropsToTimestamps(a) | |
}) | |
}; | |
c.formatSingle = function(d, a, b) { | |
var h = /\.([0-9])/, | |
f = c.defaultOptions.lang, | |
k = b && b.time || c.time; | |
b = b && b.numberFormatter || D; | |
/f$/.test(d) ? (h = (h = d.match(h)) ? h[1] : -1, null !== | |
a && (a = b(a, h, f.decimalPoint, -1 < d.indexOf(",") ? f.thousandsSep : ""))) : a = k.dateFormat(d, a); | |
return a | |
}; | |
c.format = function(d, a, b) { | |
for (var h = "{", f = !1, k, g, t, x, L = [], E; d;) { | |
h = d.indexOf(h); | |
if (-1 === h) break; | |
k = d.slice(0, h); | |
if (f) { | |
k = k.split(":"); | |
g = k.shift().split("."); | |
x = g.length; | |
E = a; | |
for (t = 0; t < x; t++) E && (E = E[g[t]]); | |
k.length && (E = c.formatSingle(k.join(":"), E, b)); | |
L.push(E) | |
} else L.push(k); | |
d = d.slice(h + 1); | |
h = (f = !f) ? "}" : "{" | |
} | |
L.push(d); | |
return L.join("") | |
}; | |
c.getMagnitude = function(d) { | |
return Math.pow(10, Math.floor(Math.log(d) / Math.LN10)) | |
}; | |
c.normalizeTickInterval = function(d, a, b, l, f) { | |
var h = d; | |
b = w(b, 1); | |
var g = d / b; | |
a || (a = f ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === l && (1 === b ? a = a.filter(function(d) { | |
return 0 === d % 1 | |
}) : .1 >= b && (a = [1 / b]))); | |
for (l = 0; l < a.length && !(h = a[l], f && h * b >= d || !f && g <= (a[l] + (a[l + 1] || a[l])) / 2); l++); | |
return h = r(h * b, -Math.round(Math.log(.001) / Math.LN10)) | |
}; | |
c.stableSort = function(d, a) { | |
var b = d.length, | |
h, f; | |
for (f = 0; f < b; f++) d[f].safeI = f; | |
d.sort(function(d, b) { | |
h = a(d, b); | |
return 0 === h ? d.safeI - b.safeI : h | |
}); | |
for (f = 0; f < b; f++) delete d[f].safeI | |
}; | |
c.timeUnits = { | |
millisecond: 1, | |
second: 1E3, | |
minute: 6E4, | |
hour: 36E5, | |
day: 864E5, | |
week: 6048E5, | |
month: 24192E5, | |
year: 314496E5 | |
}; | |
Math.easeInOutSine = function(d) { | |
return -.5 * (Math.cos(Math.PI * d) - 1) | |
}; | |
c.getStyle = function(d, b, f) { | |
if ("width" === b) return b = Math.min(d.offsetWidth, d.scrollWidth), f = d.getBoundingClientRect && d.getBoundingClientRect().width, f < b && f >= b - 1 && (b = Math.floor(f)), Math.max(0, b - c.getStyle(d, "padding-left") - c.getStyle(d, "padding-right")); | |
if ("height" === b) return Math.max(0, Math.min(d.offsetHeight, d.scrollHeight) - | |
c.getStyle(d, "padding-top") - c.getStyle(d, "padding-bottom")); | |
a.getComputedStyle || c.error(27, !0); | |
if (d = a.getComputedStyle(d, void 0)) d = d.getPropertyValue(b), w(f, "opacity" !== b) && (d = e(d)); | |
return d | |
}; | |
c.inArray = function(d, a, b) { | |
return a.indexOf(d, b) | |
}; | |
c.find = Array.prototype.find ? function(d, a) { | |
return d.find(a) | |
} : function(d, a) { | |
var b, h = d.length; | |
for (b = 0; b < h; b++) | |
if (a(d[b], b)) return d[b] | |
}; | |
c.keys = Object.keys; | |
c.stop = function(d, a) { | |
for (var b = c.timers.length; b--;) c.timers[b].elem !== d || a && a !== c.timers[b].prop || (c.timers[b].stopped = !0) | |
}; | |
A({ | |
map: "map", | |
each: "forEach", | |
grep: "filter", | |
reduce: "reduce", | |
some: "some" | |
}, function(d, a) { | |
c[a] = function(a) { | |
return Array.prototype[d].apply(a, [].slice.call(arguments, 1)) | |
} | |
}); | |
c.addEvent = function(d, a, b, f) { | |
void 0 === f && (f = {}); | |
var h = d.addEventListener || c.addEventListenerPolyfill; | |
var l = "function" === typeof d && d.prototype ? d.prototype.protoEvents = d.prototype.protoEvents || {} : d.hcEvents = d.hcEvents || {}; | |
c.Point && d instanceof c.Point && d.series && d.series.chart && (d.series.chart.runTrackerClick = !0); | |
h && h.call(d, a, b, !1); | |
l[a] || (l[a] = []); | |
l[a].push({ | |
fn: b, | |
order: "number" === typeof f.order ? f.order : Infinity | |
}); | |
l[a].sort(function(d, a) { | |
return d.order - a.order | |
}); | |
return function() { | |
c.removeEvent(d, a, b) | |
} | |
}; | |
c.removeEvent = function(d, a, b) { | |
function h(a, b) { | |
var g = d.removeEventListener || c.removeEventListenerPolyfill; | |
g && g.call(d, a, b, !1) | |
} | |
function f(b) { | |
var g; | |
if (d.nodeName) { | |
if (a) { | |
var f = {}; | |
f[a] = !0 | |
} else f = b; | |
A(f, function(d, a) { | |
if (b[a]) | |
for (g = b[a].length; g--;) h(a, b[a][g].fn) | |
}) | |
} | |
} | |
var k; | |
["protoEvents", "hcEvents"].forEach(function(g, t) { | |
var l = (t = | |
t ? d : d.prototype) && t[g]; | |
l && (a ? (k = l[a] || [], b ? (l[a] = k.filter(function(a) { | |
return b !== a.fn | |
}), h(a, b)) : (f(l), l[a] = [])) : (f(l), t[g] = {})) | |
}) | |
}; | |
c.fireEvent = function(a, h, f, l) { | |
var d; | |
f = f || {}; | |
if (b.createEvent && (a.dispatchEvent || a.fireEvent)) { | |
var k = b.createEvent("Events"); | |
k.initEvent(h, !0, !0); | |
u(k, f); | |
a.dispatchEvent ? a.dispatchEvent(k) : a.fireEvent(h, k) | |
} else f.target || u(f, { | |
preventDefault: function() { | |
f.defaultPrevented = !0 | |
}, | |
target: a, | |
type: h | |
}), | |
function(b, h) { | |
void 0 === b && (b = []); | |
void 0 === h && (h = []); | |
var g = 0, | |
t = 0, | |
l = b.length + h.length; | |
for (d = 0; d < l; d++) !1 === (b[g] ? h[t] ? b[g].order <= h[t].order ? b[g++] : h[t++] : b[g++] : h[t++]).fn.call(a, f) && f.preventDefault() | |
}(a.protoEvents && a.protoEvents[h], a.hcEvents && a.hcEvents[h]); | |
l && !f.defaultPrevented && l.call(a, f) | |
}; | |
c.animate = function(a, b, f) { | |
var d, h = "", | |
k, g; | |
if (!G(f)) { | |
var t = arguments; | |
f = { | |
duration: t[2], | |
easing: t[3], | |
complete: t[4] | |
} | |
} | |
q(f.duration) || (f.duration = 400); | |
f.easing = "function" === typeof f.easing ? f.easing : Math[f.easing] || Math.easeInOutSine; | |
f.curAnim = c.merge(b); | |
A(b, function(t, l) { | |
c.stop(a, l); | |
g = new c.Fx(a, | |
f, l); | |
k = null; | |
"d" === l ? (g.paths = g.initPath(a, a.d, b.d), g.toD = b.d, d = 0, k = 1) : a.attr ? d = a.attr(l) : (d = parseFloat(c.getStyle(a, l)) || 0, "opacity" !== l && (h = "px")); | |
k || (k = t); | |
k && k.match && k.match("px") && (k = k.replace(/px/g, "")); | |
g.run(d, k, h) | |
}) | |
}; | |
c.seriesType = function(a, b, f, l, y) { | |
var d = c.getOptions(), | |
g = c.seriesTypes; | |
d.plotOptions[a] = c.merge(d.plotOptions[b], f); | |
g[a] = m(g[b] || function() {}, l); | |
g[a].prototype.type = a; | |
y && (g[a].prototype.pointClass = m(c.Point, y)); | |
return g[a] | |
}; | |
c.uniqueKey = function() { | |
var a = Math.random().toString(36).substring(2, | |
9), | |
b = 0; | |
return function() { | |
return "highcharts-" + a + "-" + b++ | |
} | |
}(); | |
c.isFunction = function(a) { | |
return "function" === typeof a | |
}; | |
a.jQuery && (a.jQuery.fn.highcharts = function() { | |
var a = [].slice.call(arguments); | |
if (this[0]) return a[0] ? (new(c[F(a[0]) ? a.shift() : "Chart"])(this[0], a[0], a[1]), this) : f[B(this[0], "data-highcharts-chart")] | |
}); | |
return { | |
animObject: function(a) { | |
return G(a) ? c.merge(a) : { | |
duration: a ? 500 : 0 | |
} | |
}, | |
arrayMax: function(a) { | |
for (var d = a.length, b = a[0]; d--;) a[d] > b && (b = a[d]); | |
return b | |
}, | |
arrayMin: function(a) { | |
for (var d = a.length, | |
b = a[0]; d--;) a[d] < b && (b = a[d]); | |
return b | |
}, | |
attr: B, | |
clamp: function(a, b, f) { | |
return a > b ? a < f ? a : f : b | |
}, | |
correctFloat: r, | |
defined: C, | |
destroyObjectProperties: function(a, b) { | |
A(a, function(d, h) { | |
d && d !== b && d.destroy && d.destroy(); | |
delete a[h] | |
}) | |
}, | |
discardElement: function(a) { | |
var d = c.garbageBin; | |
d || (d = c.createElement("div")); | |
a && d.appendChild(a); | |
d.innerHTML = "" | |
}, | |
erase: function(a, b) { | |
for (var d = a.length; d--;) | |
if (a[d] === b) { | |
a.splice(d, 1); | |
break | |
} | |
}, | |
extend: u, | |
extendClass: m, | |
isArray: I, | |
isClass: v, | |
isDOMElement: H, | |
isNumber: q, | |
isObject: G, | |
isString: F, | |
numberFormat: D, | |
objectEach: A, | |
offset: function(d) { | |
var h = b.documentElement; | |
d = d.parentElement || d.parentNode ? d.getBoundingClientRect() : { | |
top: 0, | |
left: 0 | |
}; | |
return { | |
top: d.top + (a.pageYOffset || h.scrollTop) - (h.clientTop || 0), | |
left: d.left + (a.pageXOffset || h.scrollLeft) - (h.clientLeft || 0) | |
} | |
}, | |
pad: function(a, b, f) { | |
return Array((b || 2) + 1 - String(a).replace("-", "").length).join(f || "0") + a | |
}, | |
pick: w, | |
pInt: e, | |
relativeLength: function(a, b, f) { | |
return /%$/.test(a) ? b * parseFloat(a) / 100 + (f || 0) : parseFloat(a) | |
}, | |
setAnimation: function(a, b) { | |
b.renderer.globalAnimation = | |
w(a, b.options.chart.animation, !0) | |
}, | |
splat: function(a) { | |
return I(a) ? a : [a] | |
}, | |
syncTimeout: function(a, b, f) { | |
if (0 < b) return setTimeout(a, b, f); | |
a.call(0, f); | |
return -1 | |
}, | |
wrap: function(a, b, f) { | |
var d = a[b]; | |
a[b] = function() { | |
var a = Array.prototype.slice.call(arguments), | |
b = arguments, | |
g = this; | |
g.proceed = function() { | |
d.apply(g, arguments.length ? arguments : b) | |
}; | |
a.unshift(d); | |
a = f.apply(this, a); | |
g.proceed = null; | |
return a | |
} | |
} | |
} | |
}); | |
M(J, "parts/Color.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.isNumber, | |
I = e.pInt, | |
G = c.merge; | |
c.Color = function(e) { | |
if (!(this instanceof c.Color)) return new c.Color(e); | |
this.init(e) | |
}; | |
c.Color.prototype = { | |
parsers: [{ | |
regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, | |
parse: function(c) { | |
return [I(c[1]), I(c[2]), I(c[3]), parseFloat(c[4], 10)] | |
} | |
}, { | |
regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/, | |
parse: function(c) { | |
return [I(c[1]), I(c[2]), I(c[3]), 1] | |
} | |
}], | |
names: { | |
white: "#ffffff", | |
black: "#000000" | |
}, | |
init: function(e) { | |
var v, q; | |
if ((this.input = e = this.names[e && | |
e.toLowerCase ? e.toLowerCase() : ""] || e) && e.stops) this.stops = e.stops.map(function(e) { | |
return new c.Color(e[1]) | |
}); | |
else { | |
if (e && e.charAt && "#" === e.charAt()) { | |
var C = e.length; | |
e = parseInt(e.substr(1), 16); | |
7 === C ? v = [(e & 16711680) >> 16, (e & 65280) >> 8, e & 255, 1] : 4 === C && (v = [(e & 3840) >> 4 | (e & 3840) >> 8, (e & 240) >> 4 | e & 240, (e & 15) << 4 | e & 15, 1]) | |
} | |
if (!v) | |
for (q = this.parsers.length; q-- && !v;) { | |
var H = this.parsers[q]; | |
(C = H.regex.exec(e)) && (v = H.parse(C)) | |
} | |
} | |
this.rgba = v || [] | |
}, | |
get: function(c) { | |
var e = this.input, | |
q = this.rgba; | |
if (this.stops) { | |
var C = G(e); | |
C.stops = [].concat(C.stops); | |
this.stops.forEach(function(e, q) { | |
C.stops[q] = [C.stops[q][0], e.get(c)] | |
}) | |
} else C = q && F(q[0]) ? "rgb" === c || !c && 1 === q[3] ? "rgb(" + q[0] + "," + q[1] + "," + q[2] + ")" : "a" === c ? q[3] : "rgba(" + q.join(",") + ")" : e; | |
return C | |
}, | |
brighten: function(c) { | |
var e, q = this.rgba; | |
if (this.stops) this.stops.forEach(function(e) { | |
e.brighten(c) | |
}); | |
else if (F(c) && 0 !== c) | |
for (e = 0; 3 > e; e++) q[e] += I(255 * c), 0 > q[e] && (q[e] = 0), 255 < q[e] && (q[e] = 255); | |
return this | |
}, | |
setOpacity: function(c) { | |
this.rgba[3] = c; | |
return this | |
}, | |
tweenTo: function(c, e) { | |
var q = this.rgba, | |
v = c.rgba; | |
v.length && q && q.length ? (c = 1 !== v[3] || 1 !== q[3], e = (c ? "rgba(" : "rgb(") + Math.round(v[0] + (q[0] - v[0]) * (1 - e)) + "," + Math.round(v[1] + (q[1] - v[1]) * (1 - e)) + "," + Math.round(v[2] + (q[2] - v[2]) * (1 - e)) + (c ? "," + (v[3] + (q[3] - v[3]) * (1 - e)) : "") + ")") : e = c.input || "none"; | |
return e | |
} | |
}; | |
c.color = function(e) { | |
return new c.Color(e) | |
} | |
}); | |
M(J, "parts/SvgRenderer.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.animObject, | |
I = e.attr, | |
G = e.defined, | |
H = e.destroyObjectProperties, | |
v = e.erase, | |
q = e.extend, | |
C = e.isArray, | |
B = e.isNumber, | |
u = e.isObject, | |
w = e.isString, | |
m = e.objectEach, | |
r = e.pick, | |
D = e.pInt, | |
A = e.splat, | |
f = c.addEvent, | |
b = c.animate, | |
a = c.charts, | |
d = c.color, | |
h = c.css, | |
k = c.createElement, | |
l = c.deg2rad, | |
y = c.doc, | |
p = c.hasTouch, | |
g = c.isFirefox, | |
t = c.isMS, | |
x = c.isWebKit, | |
L = c.merge, | |
E = c.noop, | |
n = c.removeEvent, | |
z = c.stop, | |
N = c.svg, | |
O = c.SVG_NS, | |
V = c.symbolSizes, | |
T = c.win; | |
var P = c.SVGElement = function() { | |
return this | |
}; | |
q(P.prototype, { | |
opacity: 1, | |
SVG_NS: O, | |
textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline cursor".split(" "), | |
init: function(a, b) { | |
this.element = "span" === b ? k(b) : y.createElementNS(this.SVG_NS, b); | |
this.renderer = a; | |
c.fireEvent(this, "afterInit") | |
}, | |
animate: function(a, d, n) { | |
var K = F(r(d, this.renderer.globalAnimation, !0)); | |
r(y.hidden, y.msHidden, y.webkitHidden, !1) && (K.duration = 0); | |
0 !== K.duration ? (n && (K.complete = n), b(this, a, K)) : (this.attr(a, void 0, n), m(a, function(a, b) { | |
K.step && K.step.call(this, a, { | |
prop: b, | |
pos: 1 | |
}) | |
}, this)); | |
return this | |
}, | |
complexColor: function(a, b, d) { | |
var n = this.renderer, | |
K, Q, g, z, f, h, t, l, R, x, k, N = [], | |
p; | |
c.fireEvent(this.renderer, | |
"complexColor", { | |
args: arguments | |
}, | |
function() { | |
a.radialGradient ? Q = "radialGradient" : a.linearGradient && (Q = "linearGradient"); | |
Q && (g = a[Q], f = n.gradients, t = a.stops, x = d.radialReference, C(g) && (a[Q] = g = { | |
x1: g[0], | |
y1: g[1], | |
x2: g[2], | |
y2: g[3], | |
gradientUnits: "userSpaceOnUse" | |
}), "radialGradient" === Q && x && !G(g.gradientUnits) && (z = g, g = L(g, n.getRadialAttr(x, z), { | |
gradientUnits: "userSpaceOnUse" | |
})), m(g, function(a, b) { | |
"id" !== b && N.push(b, a) | |
}), m(t, function(a) { | |
N.push(a) | |
}), N = N.join(","), f[N] ? k = f[N].attr("id") : (g.id = k = c.uniqueKey(), f[N] = h = | |
n.createElement(Q).attr(g).add(n.defs), h.radAttr = z, h.stops = [], t.forEach(function(a) { | |
0 === a[1].indexOf("rgba") ? (K = c.color(a[1]), l = K.get("rgb"), R = K.get("a")) : (l = a[1], R = 1); | |
a = n.createElement("stop").attr({ | |
offset: a[0], | |
"stop-color": l, | |
"stop-opacity": R | |
}).add(h); | |
h.stops.push(a) | |
})), p = "url(" + n.url + "#" + k + ")", d.setAttribute(b, p), d.gradient = N, a.toString = function() { | |
return p | |
}) | |
}) | |
}, | |
applyTextOutline: function(a) { | |
var b = this.element, | |
d; - 1 !== a.indexOf("contrast") && (a = a.replace(/contrast/g, this.renderer.getContrast(b.style.fill))); | |
a = a.split(" "); | |
var n = a[a.length - 1]; | |
if ((d = a[0]) && "none" !== d && c.svg) { | |
this.fakeTS = !0; | |
a = [].slice.call(b.getElementsByTagName("tspan")); | |
this.ySetter = this.xSetter; | |
d = d.replace(/(^[\d\.]+)(.*?)$/g, function(a, b, d) { | |
return 2 * b + d | |
}); | |
this.removeTextOutline(a); | |
var g = b.firstChild; | |
a.forEach(function(a, K) { | |
0 === K && (a.setAttribute("x", b.getAttribute("x")), K = b.getAttribute("y"), a.setAttribute("y", K || 0), null === K && b.setAttribute("y", 0)); | |
a = a.cloneNode(1); | |
I(a, { | |
"class": "highcharts-text-outline", | |
fill: n, | |
stroke: n, | |
"stroke-width": d, | |
"stroke-linejoin": "round" | |
}); | |
b.insertBefore(a, g) | |
}) | |
} | |
}, | |
removeTextOutline: function(a) { | |
for (var b = a.length, d; b--;) d = a[b], "highcharts-text-outline" === d.getAttribute("class") && v(a, this.element.removeChild(d)) | |
}, | |
symbolCustomAttribs: "x y width height r start end innerR anchorX anchorY rounded".split(" "), | |
attr: function(a, b, d, n) { | |
var g = this.element, | |
K, Q = this, | |
f, h, t = this.symbolCustomAttribs; | |
if ("string" === typeof a && "undefined" !== typeof b) { | |
var l = a; | |
a = {}; | |
a[l] = b | |
} | |
"string" === typeof a ? Q = (this[a + "Getter"] || this._defaultGetter).call(this, | |
a, g) : (m(a, function(b, d) { | |
f = !1; | |
n || z(this, d); | |
this.symbolName && -1 !== c.inArray(d, t) && (K || (this.symbolAttr(a), K = !0), f = !0); | |
!this.rotation || "x" !== d && "y" !== d || (this.doTransform = !0); | |
f || (h = this[d + "Setter"] || this._defaultSetter, h.call(this, b, d, g), !this.styledMode && this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d) && this.updateShadows(d, b, h)) | |
}, this), this.afterSetters()); | |
d && d.call(this); | |
return Q | |
}, | |
afterSetters: function() { | |
this.doTransform && (this.updateTransform(), this.doTransform = !1) | |
}, | |
updateShadows: function(a, | |
b, d) { | |
for (var n = this.shadows, g = n.length; g--;) d.call(n[g], "height" === a ? Math.max(b - (n[g].cutHeight || 0), 0) : "d" === a ? this.d : b, a, n[g]) | |
}, | |
addClass: function(a, b) { | |
var d = b ? "" : this.attr("class") || ""; | |
a = (a || "").split(/ /g).reduce(function(a, b) { | |
-1 === d.indexOf(b) && a.push(b); | |
return a | |
}, d ? [d] : []).join(" "); | |
a !== d && this.attr("class", a); | |
return this | |
}, | |
hasClass: function(a) { | |
return -1 !== (this.attr("class") || "").split(" ").indexOf(a) | |
}, | |
removeClass: function(a) { | |
return this.attr("class", (this.attr("class") || "").replace(w(a) ? new RegExp(" ?" + | |
a + " ?") : a, "")) | |
}, | |
symbolAttr: function(a) { | |
var b = this; | |
"x y r start end width height innerR anchorX anchorY clockwise".split(" ").forEach(function(d) { | |
b[d] = r(a[d], b[d]) | |
}); | |
b.attr({ | |
d: b.renderer.symbols[b.symbolName](b.x, b.y, b.width, b.height, b) | |
}) | |
}, | |
clip: function(a) { | |
return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : "none") | |
}, | |
crisp: function(a, b) { | |
b = b || a.strokeWidth || 0; | |
var d = Math.round(b) % 2 / 2; | |
a.x = Math.floor(a.x || this.x || 0) + d; | |
a.y = Math.floor(a.y || this.y || 0) + d; | |
a.width = Math.floor((a.width || this.width || | |
0) - 2 * d); | |
a.height = Math.floor((a.height || this.height || 0) - 2 * d); | |
G(a.strokeWidth) && (a.strokeWidth = b); | |
return a | |
}, | |
css: function(a) { | |
var b = this.styles, | |
d = {}, | |
n = this.element, | |
g = "", | |
z = !b, | |
f = ["textOutline", "textOverflow", "width"]; | |
a && a.color && (a.fill = a.color); | |
b && m(a, function(a, n) { | |
a !== b[n] && (d[n] = a, z = !0) | |
}); | |
if (z) { | |
b && (a = q(b, d)); | |
if (a) | |
if (null === a.width || "auto" === a.width) delete this.textWidth; | |
else if ("text" === n.nodeName.toLowerCase() && a.width) var Q = this.textWidth = D(a.width); | |
this.styles = a; | |
Q && !N && this.renderer.forExport && delete a.width; | |
if (n.namespaceURI === this.SVG_NS) { | |
var t = function(a, b) { | |
return "-" + b.toLowerCase() | |
}; | |
m(a, function(a, b) { | |
-1 === f.indexOf(b) && (g += b.replace(/([A-Z])/g, t) + ":" + a + ";") | |
}); | |
g && I(n, "style", g) | |
} else h(n, a); | |
this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)) | |
} | |
return this | |
}, | |
getStyle: function(a) { | |
return T.getComputedStyle(this.element || this, "").getPropertyValue(a) | |
}, | |
strokeWidth: function() { | |
if (!this.renderer.styledMode) return this["stroke-width"] || | |
0; | |
var a = this.getStyle("stroke-width"), | |
b = 0; | |
if (a.indexOf("px") === a.length - 2) b = D(a); | |
else if ("" !== a) { | |
var d = y.createElementNS(O, "rect"); | |
I(d, { | |
width: a, | |
"stroke-width": 0 | |
}); | |
this.element.parentNode.appendChild(d); | |
b = d.getBBox().width; | |
d.parentNode.removeChild(d) | |
} | |
return b | |
}, | |
on: function(a, b) { | |
var d = this, | |
n = d.element; | |
p && "click" === a ? (n.ontouchstart = function(a) { | |
d.touchEventFired = Date.now(); | |
a.preventDefault(); | |
b.call(n, a) | |
}, n.onclick = function(a) { | |
(-1 === T.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (d.touchEventFired || | |
0)) && b.call(n, a) | |
}) : n["on" + a] = b; | |
return this | |
}, | |
setRadialReference: function(a) { | |
var b = this.renderer.gradients[this.element.gradient]; | |
this.element.radialReference = a; | |
b && b.radAttr && b.animate(this.renderer.getRadialAttr(a, b.radAttr)); | |
return this | |
}, | |
translate: function(a, b) { | |
return this.attr({ | |
translateX: a, | |
translateY: b | |
}) | |
}, | |
invert: function(a) { | |
this.inverted = a; | |
this.updateTransform(); | |
return this | |
}, | |
updateTransform: function() { | |
var a = this.translateX || 0, | |
b = this.translateY || 0, | |
d = this.scaleX, | |
n = this.scaleY, | |
g = this.inverted, | |
z = this.rotation, | |
f = this.matrix, | |
h = this.element; | |
g && (a += this.width, b += this.height); | |
a = ["translate(" + a + "," + b + ")"]; | |
G(f) && a.push("matrix(" + f.join(",") + ")"); | |
g ? a.push("rotate(90) scale(-1,1)") : z && a.push("rotate(" + z + " " + r(this.rotationOriginX, h.getAttribute("x"), 0) + " " + r(this.rotationOriginY, h.getAttribute("y") || 0) + ")"); | |
(G(d) || G(n)) && a.push("scale(" + r(d, 1) + " " + r(n, 1) + ")"); | |
a.length && h.setAttribute("transform", a.join(" ")) | |
}, | |
toFront: function() { | |
var a = this.element; | |
a.parentNode.appendChild(a); | |
return this | |
}, | |
align: function(a, b, d) { | |
var n, | |
g = {}; | |
var z = this.renderer; | |
var f = z.alignedObjects; | |
var K, h; | |
if (a) { | |
if (this.alignOptions = a, this.alignByTranslate = b, !d || w(d)) this.alignTo = n = d || "renderer", v(f, this), f.push(this), d = null | |
} else a = this.alignOptions, b = this.alignByTranslate, n = this.alignTo; | |
d = r(d, z[n], z); | |
n = a.align; | |
z = a.verticalAlign; | |
f = (d.x || 0) + (a.x || 0); | |
var t = (d.y || 0) + (a.y || 0); | |
"right" === n ? K = 1 : "center" === n && (K = 2); | |
K && (f += (d.width - (a.width || 0)) / K); | |
g[b ? "translateX" : "x"] = Math.round(f); | |
"bottom" === z ? h = 1 : "middle" === z && (h = 2); | |
h && (t += (d.height - (a.height || 0)) / | |
h); | |
g[b ? "translateY" : "y"] = Math.round(t); | |
this[this.placed ? "animate" : "attr"](g); | |
this.placed = !0; | |
this.alignAttr = g; | |
return this | |
}, | |
getBBox: function(a, b) { | |
var d, n = this.renderer, | |
g = this.element, | |
z = this.styles, | |
f = this.textStr, | |
K, h = n.cache, | |
t = n.cacheKeys, | |
Q = g.namespaceURI === this.SVG_NS; | |
b = r(b, this.rotation, 0); | |
var x = n.styledMode ? g && P.prototype.getStyle.call(g, "font-size") : z && z.fontSize; | |
if (G(f)) { | |
var c = f.toString(); - 1 === c.indexOf("<") && (c = c.replace(/[0-9]/g, "0")); | |
c += ["", b, x, this.textWidth, z && z.textOverflow].join() | |
} | |
c && !a && | |
(d = h[c]); | |
if (!d) { | |
if (Q || n.forExport) { | |
try { | |
(K = this.fakeTS && function(a) { | |
[].forEach.call(g.querySelectorAll(".highcharts-text-outline"), function(b) { | |
b.style.display = a | |
}) | |
}) && K("none"), d = g.getBBox ? q({}, g.getBBox()) : { | |
width: g.offsetWidth, | |
height: g.offsetHeight | |
}, K && K("") | |
} catch (ca) { | |
"" | |
} | |
if (!d || 0 > d.width) d = { | |
width: 0, | |
height: 0 | |
} | |
} else d = this.htmlGetBBox(); | |
n.isSVG && (a = d.width, n = d.height, Q && (d.height = n = { | |
"11px,17": 14, | |
"13px,20": 16 | |
}[z && z.fontSize + "," + Math.round(n)] || n), b && (z = b * l, d.width = Math.abs(n * Math.sin(z)) + Math.abs(a * Math.cos(z)), | |
d.height = Math.abs(n * Math.cos(z)) + Math.abs(a * Math.sin(z)))); | |
if (c && 0 < d.height) { | |
for (; 250 < t.length;) delete h[t.shift()]; | |
h[c] || t.push(c); | |
h[c] = d | |
} | |
} | |
return d | |
}, | |
show: function(a) { | |
return this.attr({ | |
visibility: a ? "inherit" : "visible" | |
}) | |
}, | |
hide: function(a) { | |
a ? this.attr({ | |
y: -9999 | |
}) : this.attr({ | |
visibility: "hidden" | |
}); | |
return this | |
}, | |
fadeOut: function(a) { | |
var b = this; | |
b.animate({ | |
opacity: 0 | |
}, { | |
duration: a || 150, | |
complete: function() { | |
b.attr({ | |
y: -9999 | |
}) | |
} | |
}) | |
}, | |
add: function(a) { | |
var b = this.renderer, | |
d = this.element; | |
a && (this.parentGroup = a); | |
this.parentInverted = | |
a && a.inverted; | |
"undefined" !== typeof this.textStr && b.buildText(this); | |
this.added = !0; | |
if (!a || a.handleZ || this.zIndex) var n = this.zIndexSetter(); | |
n || (a ? a.element : b.box).appendChild(d); | |
if (this.onAdd) this.onAdd(); | |
return this | |
}, | |
safeRemoveChild: function(a) { | |
var b = a.parentNode; | |
b && b.removeChild(a) | |
}, | |
destroy: function() { | |
var a = this, | |
b = a.element || {}, | |
d = a.renderer, | |
n = d.isSVG && "SPAN" === b.nodeName && a.parentGroup, | |
g = b.ownerSVGElement, | |
f = a.clipPath; | |
b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = b.point = null; | |
z(a); | |
f && g && ([].forEach.call(g.querySelectorAll("[clip-path],[CLIP-PATH]"), | |
function(a) { | |
-1 < a.getAttribute("clip-path").indexOf(f.element.id) && a.removeAttribute("clip-path") | |
}), a.clipPath = f.destroy()); | |
if (a.stops) { | |
for (g = 0; g < a.stops.length; g++) a.stops[g] = a.stops[g].destroy(); | |
a.stops = null | |
} | |
a.safeRemoveChild(b); | |
for (d.styledMode || a.destroyShadows(); n && n.div && 0 === n.div.childNodes.length;) b = n.parentGroup, a.safeRemoveChild(n.div), delete n.div, n = b; | |
a.alignTo && v(d.alignedObjects, a); | |
m(a, function(b, d) { | |
a[d] && a[d].parentGroup === a && a[d].destroy && a[d].destroy(); | |
delete a[d] | |
}) | |
}, | |
shadow: function(a, | |
b, d) { | |
var n = [], | |
g, z = this.element; | |
if (!a) this.destroyShadows(); | |
else if (!this.shadows) { | |
var f = r(a.width, 3); | |
var h = (a.opacity || .15) / f; | |
var K = this.parentInverted ? "(-1,-1)" : "(" + r(a.offsetX, 1) + ", " + r(a.offsetY, 1) + ")"; | |
for (g = 1; g <= f; g++) { | |
var t = z.cloneNode(0); | |
var l = 2 * f + 1 - 2 * g; | |
I(t, { | |
stroke: a.color || "#000000", | |
"stroke-opacity": h * g, | |
"stroke-width": l, | |
transform: "translate" + K, | |
fill: "none" | |
}); | |
t.setAttribute("class", (t.getAttribute("class") || "") + " highcharts-shadow"); | |
d && (I(t, "height", Math.max(I(t, "height") - l, 0)), t.cutHeight = l); | |
b ? b.element.appendChild(t) : z.parentNode && z.parentNode.insertBefore(t, z); | |
n.push(t) | |
} | |
this.shadows = n | |
} | |
return this | |
}, | |
destroyShadows: function() { | |
(this.shadows || []).forEach(function(a) { | |
this.safeRemoveChild(a) | |
}, this); | |
this.shadows = void 0 | |
}, | |
xGetter: function(a) { | |
"circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy")); | |
return this._defaultGetter(a) | |
}, | |
_defaultGetter: function(a) { | |
a = r(this[a + "Value"], this[a], this.element ? this.element.getAttribute(a) : null, 0); | |
/^[\-0-9\.]+$/.test(a) && (a = parseFloat(a)); | |
return a | |
}, | |
dSetter: function(a, b, d) { | |
a && a.join && (a = a.join(" ")); | |
/(NaN| {2}|^$)/.test(a) && (a = "M 0 0"); | |
this[b] !== a && (d.setAttribute(b, a), this[b] = a) | |
}, | |
dashstyleSetter: function(a) { | |
var b, d = this["stroke-width"]; | |
"inherit" === d && (d = 1); | |
if (a = a && a.toLowerCase()) { | |
a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(","); | |
for (b = a.length; b--;) a[b] = D(a[b]) * | |
d; | |
a = a.join(",").replace(/NaN/g, "none"); | |
this.element.setAttribute("stroke-dasharray", a) | |
} | |
}, | |
alignSetter: function(a) { | |
var b = { | |
left: "start", | |
center: "middle", | |
right: "end" | |
}; | |
b[a] && (this.alignValue = a, this.element.setAttribute("text-anchor", b[a])) | |
}, | |
opacitySetter: function(a, b, d) { | |
this[b] = a; | |
d.setAttribute(b, a) | |
}, | |
titleSetter: function(a) { | |
var b = this.element.getElementsByTagName("title")[0]; | |
b || (b = y.createElementNS(this.SVG_NS, "title"), this.element.appendChild(b)); | |
b.firstChild && b.removeChild(b.firstChild); | |
b.appendChild(y.createTextNode(String(r(a, | |
"")).replace(/<[^>]*>/g, "").replace(/</g, "<").replace(/>/g, ">"))) | |
}, | |
textSetter: function(a) { | |
a !== this.textStr && (delete this.bBox, delete this.textPxLength, this.textStr = a, this.added && this.renderer.buildText(this)) | |
}, | |
setTextPath: function(a, b) { | |
var d = this.element, | |
n = { | |
textAnchor: "text-anchor" | |
}, | |
g = !1, | |
z = this.textPathWrapper, | |
f = !z; | |
b = L(!0, { | |
enabled: !0, | |
attributes: { | |
dy: -5, | |
startOffset: "50%", | |
textAnchor: "middle" | |
} | |
}, b); | |
var h = b.attributes; | |
if (a && b && b.enabled) { | |
z && null === z.element.parentNode ? (f = !0, z = z.destroy()) : z && this.removeTextOutline.call(z.parentGroup, [].slice.call(d.getElementsByTagName("tspan"))); | |
this.options && this.options.padding && (h.dx = -this.options.padding); | |
z || (this.textPathWrapper = z = this.renderer.createElement("textPath"), g = !0); | |
var t = z.element; | |
(b = a.element.getAttribute("id")) || a.element.setAttribute("id", b = c.uniqueKey()); | |
if (f) | |
for (a = d.getElementsByTagName("tspan"); a.length;) a[0].setAttribute("y", 0), B(h.dx) && a[0].setAttribute("x", -h.dx), t.appendChild(a[0]); | |
g && z.add({ | |
element: this.text ? this.text.element : d | |
}); | |
t.setAttributeNS("http://www.w3.org/1999/xlink", | |
"href", this.renderer.url + "#" + b); | |
G(h.dy) && (t.parentNode.setAttribute("dy", h.dy), delete h.dy); | |
G(h.dx) && (t.parentNode.setAttribute("dx", h.dx), delete h.dx); | |
m(h, function(a, b) { | |
t.setAttribute(n[b] || b, a) | |
}); | |
d.removeAttribute("transform"); | |
this.removeTextOutline.call(z, [].slice.call(d.getElementsByTagName("tspan"))); | |
this.text && !this.renderer.styledMode && this.attr({ | |
fill: "none", | |
"stroke-width": 0 | |
}); | |
this.applyTextOutline = this.updateTransform = E | |
} else z && (delete this.updateTransform, delete this.applyTextOutline, this.destroyTextPath(d, | |
a), this.updateTransform(), this.options.rotation && this.applyTextOutline(this.options.style.textOutline)); | |
return this | |
}, | |
destroyTextPath: function(a, b) { | |
var d = a.getElementsByTagName("text")[0]; | |
if (d) { | |
if (d.removeAttribute("dx"), d.removeAttribute("dy"), b.element.setAttribute("id", ""), d.getElementsByTagName("textPath").length) { | |
for (a = this.textPathWrapper.element.childNodes; a.length;) d.appendChild(a[0]); | |
d.removeChild(this.textPathWrapper.element) | |
} | |
} else if (a.getAttribute("dx") || a.getAttribute("dy")) a.removeAttribute("dx"), | |
a.removeAttribute("dy"); | |
this.textPathWrapper = this.textPathWrapper.destroy() | |
}, | |
fillSetter: function(a, b, d) { | |
"string" === typeof a ? d.setAttribute(b, a) : a && this.complexColor(a, b, d) | |
}, | |
visibilitySetter: function(a, b, d) { | |
"inherit" === a ? d.removeAttribute(b) : this[b] !== a && d.setAttribute(b, a); | |
this[b] = a | |
}, | |
zIndexSetter: function(a, b) { | |
var d = this.renderer, | |
n = this.parentGroup, | |
g = (n || d).element || d.box, | |
z = this.element, | |
f = !1; | |
d = g === d.box; | |
var h = this.added; | |
var t; | |
G(a) ? (z.setAttribute("data-z-index", a), a = +a, this[b] === a && (h = !1)) : G(this[b]) && | |
z.removeAttribute("data-z-index"); | |
this[b] = a; | |
if (h) { | |
(a = this.zIndex) && n && (n.handleZ = !0); | |
b = g.childNodes; | |
for (t = b.length - 1; 0 <= t && !f; t--) { | |
n = b[t]; | |
h = n.getAttribute("data-z-index"); | |
var l = !G(h); | |
if (n !== z) | |
if (0 > a && l && !d && !t) g.insertBefore(z, b[t]), f = !0; | |
else if (D(h) <= a || l && (!G(a) || 0 <= a)) g.insertBefore(z, b[t + 1] || null), f = !0 | |
} | |
f || (g.insertBefore(z, b[d ? 3 : 0] || null), f = !0) | |
} | |
return f | |
}, | |
_defaultSetter: function(a, b, d) { | |
d.setAttribute(b, a) | |
} | |
}); | |
P.prototype.yGetter = P.prototype.xGetter; | |
P.prototype.translateXSetter = P.prototype.translateYSetter = | |
P.prototype.rotationSetter = P.prototype.verticalAlignSetter = P.prototype.rotationOriginXSetter = P.prototype.rotationOriginYSetter = P.prototype.scaleXSetter = P.prototype.scaleYSetter = P.prototype.matrixSetter = function(a, b) { | |
this[b] = a; | |
this.doTransform = !0 | |
}; | |
P.prototype["stroke-widthSetter"] = P.prototype.strokeSetter = function(a, b, d) { | |
this[b] = a; | |
this.stroke && this["stroke-width"] ? (P.prototype.fillSetter.call(this, this.stroke, "stroke", d), d.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === | |
b && 0 === a && this.hasStroke ? (d.removeAttribute("stroke"), this.hasStroke = !1) : this.renderer.styledMode && this["stroke-width"] && (d.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) | |
}; | |
e = c.SVGRenderer = function() { | |
this.init.apply(this, arguments) | |
}; | |
q(e.prototype, { | |
Element: P, | |
SVG_NS: O, | |
init: function(a, b, d, n, z, t, l) { | |
var K = this.createElement("svg").attr({ | |
version: "1.1", | |
"class": "highcharts-root" | |
}); | |
l || K.css(this.getStyle(n)); | |
n = K.element; | |
a.appendChild(n); | |
I(a, "dir", "ltr"); - 1 === a.innerHTML.indexOf("xmlns") && | |
I(n, "xmlns", this.SVG_NS); | |
this.isSVG = !0; | |
this.box = n; | |
this.boxWrapper = K; | |
this.alignedObjects = []; | |
this.url = (g || x) && y.getElementsByTagName("base").length ? T.location.href.split("#")[0].replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : ""; | |
this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 8.0.0")); | |
this.defs = this.createElement("defs").add(); | |
this.allowHTML = t; | |
this.forExport = z; | |
this.styledMode = l; | |
this.gradients = {}; | |
this.cache = {}; | |
this.cacheKeys = []; | |
this.imgCount = | |
0; | |
this.setSize(b, d, !1); | |
var c; | |
g && a.getBoundingClientRect && (b = function() { | |
h(a, { | |
left: 0, | |
top: 0 | |
}); | |
c = a.getBoundingClientRect(); | |
h(a, { | |
left: Math.ceil(c.left) - c.left + "px", | |
top: Math.ceil(c.top) - c.top + "px" | |
}) | |
}, b(), this.unSubPixelFix = f(T, "resize", b)) | |
}, | |
definition: function(a) { | |
function b(a, n) { | |
var g; | |
A(a).forEach(function(a) { | |
var z = d.createElement(a.tagName), | |
f = {}; | |
m(a, function(a, b) { | |
"tagName" !== b && "children" !== b && "textContent" !== b && (f[b] = a) | |
}); | |
z.attr(f); | |
z.add(n || d.defs); | |
a.textContent && z.element.appendChild(y.createTextNode(a.textContent)); | |
b(a.children || [], z); | |
g = z | |
}); | |
return g | |
} | |
var d = this; | |
return b(a) | |
}, | |
getStyle: function(a) { | |
return this.style = q({ | |
fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', | |
fontSize: "12px" | |
}, a) | |
}, | |
setStyle: function(a) { | |
this.boxWrapper.css(this.getStyle(a)) | |
}, | |
isHidden: function() { | |
return !this.boxWrapper.getBBox().width | |
}, | |
destroy: function() { | |
var a = this.defs; | |
this.box = null; | |
this.boxWrapper = this.boxWrapper.destroy(); | |
H(this.gradients || {}); | |
this.gradients = null; | |
a && (this.defs = a.destroy()); | |
this.unSubPixelFix && | |
this.unSubPixelFix(); | |
return this.alignedObjects = null | |
}, | |
createElement: function(a) { | |
var b = new this.Element; | |
b.init(this, a); | |
return b | |
}, | |
draw: E, | |
getRadialAttr: function(a, b) { | |
return { | |
cx: a[0] - a[2] / 2 + b.cx * a[2], | |
cy: a[1] - a[2] / 2 + b.cy * a[2], | |
r: b.r * a[2] | |
} | |
}, | |
truncate: function(a, b, d, n, g, z, f) { | |
var h = this, | |
t = a.rotation, | |
l, K = n ? 1 : 0, | |
x = (d || n).length, | |
c = x, | |
k = [], | |
N = function(a) { | |
b.firstChild && b.removeChild(b.firstChild); | |
a && b.appendChild(y.createTextNode(a)) | |
}, | |
p = function(z, t) { | |
t = t || z; | |
if ("undefined" === typeof k[t]) | |
if (b.getSubStringLength) try { | |
k[t] = | |
g + b.getSubStringLength(0, n ? t + 1 : t) | |
} catch (ea) { | |
"" | |
} else h.getSpanWidth && (N(f(d || n, z)), k[t] = g + h.getSpanWidth(a, b)); | |
return k[t] | |
}, | |
R; | |
a.rotation = 0; | |
var O = p(b.textContent.length); | |
if (R = g + O > z) { | |
for (; K <= x;) c = Math.ceil((K + x) / 2), n && (l = f(n, c)), O = p(c, l && l.length - 1), K === x ? K = x + 1 : O > z ? x = c - 1 : K = c; | |
0 === x ? N("") : d && x === d.length - 1 || N(l || f(d || n, c)) | |
} | |
n && n.splice(0, c); | |
a.actualWidth = O; | |
a.rotation = t; | |
return R | |
}, | |
escapes: { | |
"&": "&", | |
"<": "<", | |
">": ">", | |
"'": "'", | |
'"': """ | |
}, | |
buildText: function(a) { | |
var b = a.element, | |
d = this, | |
n = d.forExport, | |
g = r(a.textStr, "").toString(), | |
z = -1 !== g.indexOf("<"), | |
f = b.childNodes, | |
t, l = I(b, "x"), | |
x = a.styles, | |
c = a.textWidth, | |
k = x && x.lineHeight, | |
p = x && x.textOutline, | |
L = x && "ellipsis" === x.textOverflow, | |
E = x && "nowrap" === x.whiteSpace, | |
A = x && x.fontSize, | |
Q, e = f.length; | |
x = c && !a.added && this.box; | |
var V = function(a) { | |
var n; | |
d.styledMode || (n = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : A || d.style.fontSize || 12); | |
return k ? D(k) : d.fontMetrics(n, a.getAttribute("style") ? a : b).h | |
}, | |
q = function(a, b) { | |
m(d.escapes, function(d, n) { | |
b && -1 !== b.indexOf(d) || | |
(a = a.toString().replace(new RegExp(d, "g"), n)) | |
}); | |
return a | |
}, | |
P = function(a, b) { | |
var d = a.indexOf("<"); | |
a = a.substring(d, a.indexOf(">") - d); | |
d = a.indexOf(b + "="); | |
if (-1 !== d && (d = d + b.length + 1, b = a.charAt(d), '"' === b || "'" === b)) return a = a.substring(d + 1), a.substring(0, a.indexOf(b)) | |
}, | |
T = /<br.*?>/g; | |
var u = [g, L, E, k, p, A, c].join(); | |
if (u !== a.textCache) { | |
for (a.textCache = u; e--;) b.removeChild(f[e]); | |
z || p || L || c || -1 !== g.indexOf(" ") && (!E || T.test(g)) ? (x && x.appendChild(b), z ? (g = d.styledMode ? g.replace(/<(b|strong)>/g, '<span class="highcharts-strong">').replace(/<(i|em)>/g, | |
'<span class="highcharts-emphasized">') : g.replace(/<(b|strong)>/g, '<span style="font-weight:bold">').replace(/<(i|em)>/g, '<span style="font-style:italic">'), g = g.replace(/<a/g, "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(T)) : g = [g], g = g.filter(function(a) { | |
return "" !== a | |
}), g.forEach(function(g, z) { | |
var f = 0, | |
x = 0; | |
g = g.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||<span").replace(/<\/span>/g, "</span>|||"); | |
var K = g.split("|||"); | |
K.forEach(function(g) { | |
if ("" !== g || 1 === K.length) { | |
var k = {}, | |
p = y.createElementNS(d.SVG_NS, | |
"tspan"), | |
R, r; | |
(R = P(g, "class")) && I(p, "class", R); | |
if (R = P(g, "style")) R = R.replace(/(;| |^)color([ :])/, "$1fill$2"), I(p, "style", R); | |
(r = P(g, "href")) && !n && (I(p, "onclick", 'location.href="' + r + '"'), I(p, "class", "highcharts-anchor"), d.styledMode || h(p, { | |
cursor: "pointer" | |
})); | |
g = q(g.replace(/<[a-zA-Z\/](.|\n)*?>/g, "") || " "); | |
if (" " !== g) { | |
p.appendChild(y.createTextNode(g)); | |
f ? k.dx = 0 : z && null !== l && (k.x = l); | |
I(p, k); | |
b.appendChild(p); | |
!f && Q && (!N && n && h(p, { | |
display: "block" | |
}), I(p, "dy", V(p))); | |
if (c) { | |
var m = g.replace(/([^\^])-/g, "$1- ").split(" "); | |
k = !E && (1 < K.length || z || 1 < m.length); | |
r = 0; | |
var e = V(p); | |
if (L) t = d.truncate(a, p, g, void 0, 0, Math.max(0, c - parseInt(A || 12, 10)), function(a, b) { | |
return a.substring(0, b) + "\u2026" | |
}); | |
else if (k) | |
for (; m.length;) m.length && !E && 0 < r && (p = y.createElementNS(O, "tspan"), I(p, { | |
dy: e, | |
x: l | |
}), R && I(p, "style", R), p.appendChild(y.createTextNode(m.join(" ").replace(/- /g, "-"))), b.appendChild(p)), d.truncate(a, p, null, m, 0 === r ? x : 0, c, function(a, b) { | |
return m.slice(0, b).join(" ").replace(/- /g, "-") | |
}), x = a.actualWidth, r++ | |
} | |
f++ | |
} | |
} | |
}); | |
Q = Q || b.childNodes.length | |
}), | |
L && t && a.attr("title", q(a.textStr, ["<", ">"])), x && x.removeChild(b), p && a.applyTextOutline && a.applyTextOutline(p)) : b.appendChild(y.createTextNode(q(g))) | |
} | |
}, | |
getContrast: function(a) { | |
a = d(a).rgba; | |
a[0] *= 1; | |
a[1] *= 1.2; | |
a[2] *= .5; | |
return 459 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF" | |
}, | |
button: function(a, b, d, n, g, z, h, l, x, c) { | |
var K = this.label(a, b, d, x, null, null, c, null, "button"), | |
k = 0, | |
N = this.styledMode; | |
K.attr(L({ | |
padding: 8, | |
r: 2 | |
}, g)); | |
if (!N) { | |
g = L({ | |
fill: "#f7f7f7", | |
stroke: "#cccccc", | |
"stroke-width": 1, | |
style: { | |
color: "#333333", | |
cursor: "pointer", | |
fontWeight: "normal" | |
} | |
}, g); | |
var p = g.style; | |
delete g.style; | |
z = L(g, { | |
fill: "#e6e6e6" | |
}, z); | |
var O = z.style; | |
delete z.style; | |
h = L(g, { | |
fill: "#e6ebf5", | |
style: { | |
color: "#000000", | |
fontWeight: "bold" | |
} | |
}, h); | |
var R = h.style; | |
delete h.style; | |
l = L(g, { | |
style: { | |
color: "#cccccc" | |
} | |
}, l); | |
var E = l.style; | |
delete l.style | |
} | |
f(K.element, t ? "mouseover" : "mouseenter", function() { | |
3 !== k && K.setState(1) | |
}); | |
f(K.element, t ? "mouseout" : "mouseleave", function() { | |
3 !== k && K.setState(k) | |
}); | |
K.setState = function(a) { | |
1 !== a && (K.state = k = a); | |
K.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]); | |
N || K.attr([g, z, h, l][a || 0]).css([p, O, R, E][a || 0]) | |
}; | |
N || K.attr(g).css(q({ | |
cursor: "default" | |
}, p)); | |
return K.on("click", function(a) { | |
3 !== k && n.call(K, a) | |
}) | |
}, | |
crispLine: function(a, b) { | |
a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - b % 2 / 2); | |
a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + b % 2 / 2); | |
return a | |
}, | |
path: function(a) { | |
var b = this.styledMode ? {} : { | |
fill: "none" | |
}; | |
C(a) ? b.d = a : u(a) && q(b, a); | |
return this.createElement("path").attr(b) | |
}, | |
circle: function(a, b, d) { | |
a = u(a) ? a : "undefined" === typeof a ? {} : { | |
x: a, | |
y: b, | |
r: d | |
}; | |
b = this.createElement("circle"); | |
b.xSetter = b.ySetter = function(a, b, d) { | |
d.setAttribute("c" + b, a) | |
}; | |
return b.attr(a) | |
}, | |
arc: function(a, b, d, n, g, z) { | |
u(a) ? (n = a, b = n.y, d = n.r, a = n.x) : n = { | |
innerR: n, | |
start: g, | |
end: z | |
}; | |
a = this.symbol("arc", a, b, d, d, n); | |
a.r = d; | |
return a | |
}, | |
rect: function(a, b, d, n, g, z) { | |
g = u(a) ? a.r : g; | |
var f = this.createElement("rect"); | |
a = u(a) ? a : "undefined" === typeof a ? {} : { | |
x: a, | |
y: b, | |
width: Math.max(d, 0), | |
height: Math.max(n, 0) | |
}; | |
this.styledMode || ("undefined" !== typeof z && (a.strokeWidth = z, a = f.crisp(a)), a.fill = "none"); | |
g && | |
(a.r = g); | |
f.rSetter = function(a, b, d) { | |
f.r = a; | |
I(d, { | |
rx: a, | |
ry: a | |
}) | |
}; | |
f.rGetter = function() { | |
return f.r | |
}; | |
return f.attr(a) | |
}, | |
setSize: function(a, b, d) { | |
var n = this.alignedObjects, | |
g = n.length; | |
this.width = a; | |
this.height = b; | |
for (this.boxWrapper.animate({ | |
width: a, | |
height: b | |
}, { | |
step: function() { | |
this.attr({ | |
viewBox: "0 0 " + this.attr("width") + " " + this.attr("height") | |
}) | |
}, | |
duration: r(d, !0) ? void 0 : 0 | |
}); g--;) n[g].align() | |
}, | |
g: function(a) { | |
var b = this.createElement("g"); | |
return a ? b.attr({ | |
"class": "highcharts-" + a | |
}) : b | |
}, | |
image: function(a, b, d, n, g, z) { | |
var h = { | |
preserveAspectRatio: "none" | |
}, | |
t = function(a, b) { | |
a.setAttributeNS ? a.setAttributeNS("http://www.w3.org/1999/xlink", "href", b) : a.setAttribute("hc-svg-href", b) | |
}, | |
l = function(b) { | |
t(x.element, a); | |
z.call(x, b) | |
}; | |
1 < arguments.length && q(h, { | |
x: b, | |
y: d, | |
width: n, | |
height: g | |
}); | |
var x = this.createElement("image").attr(h); | |
z ? (t(x.element, "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="), h = new T.Image, f(h, "load", l), h.src = a, h.complete && l({})) : t(x.element, a); | |
return x | |
}, | |
symbol: function(b, d, n, g, z, f) { | |
var t = this, | |
l = /^url\((.*?)\)$/, | |
x = l.test(b), | |
c = !x && (this.symbols[b] ? b : "circle"), | |
K = c && this.symbols[c], | |
N = G(d) && K && K.call(this.symbols, Math.round(d), Math.round(n), g, z, f); | |
if (K) { | |
var p = this.path(N); | |
t.styledMode || p.attr("fill", "none"); | |
q(p, { | |
symbolName: c, | |
x: d, | |
y: n, | |
width: g, | |
height: z | |
}); | |
f && q(p, f) | |
} else if (x) { | |
var O = b.match(l)[1]; | |
p = this.image(O); | |
p.imgwidth = r(V[O] && V[O].width, f && f.width); | |
p.imgheight = r(V[O] && V[O].height, f && f.height); | |
var R = function() { | |
p.attr({ | |
width: p.width, | |
height: p.height | |
}) | |
}; | |
["width", "height"].forEach(function(a) { | |
p[a + | |
"Setter"] = function(a, b) { | |
var d = {}, | |
n = this["img" + b], | |
g = "width" === b ? "translateX" : "translateY"; | |
this[b] = a; | |
G(n) && (f && "within" === f.backgroundSize && this.width && this.height && (n = Math.round(n * Math.min(this.width / this.imgwidth, this.height / this.imgheight))), this.element && this.element.setAttribute(b, n), this.alignByTranslate || (d[g] = ((this[b] || 0) - n) / 2, this.attr(d))) | |
} | |
}); | |
G(d) && p.attr({ | |
x: d, | |
y: n | |
}); | |
p.isImg = !0; | |
G(p.imgwidth) && G(p.imgheight) ? R() : (p.attr({ | |
width: 0, | |
height: 0 | |
}), k("img", { | |
onload: function() { | |
var b = a[t.chartIndex]; | |
0 === | |
this.width && (h(this, { | |
position: "absolute", | |
top: "-999em" | |
}), y.body.appendChild(this)); | |
V[O] = { | |
width: this.width, | |
height: this.height | |
}; | |
p.imgwidth = this.width; | |
p.imgheight = this.height; | |
p.element && R(); | |
this.parentNode && this.parentNode.removeChild(this); | |
t.imgCount--; | |
if (!t.imgCount && b && b.onload) b.onload() | |
}, | |
src: O | |
}), this.imgCount++) | |
} | |
return p | |
}, | |
symbols: { | |
circle: function(a, b, d, n) { | |
return this.arc(a + d / 2, b + n / 2, d / 2, n / 2, { | |
start: .5 * Math.PI, | |
end: 2.5 * Math.PI, | |
open: !1 | |
}) | |
}, | |
square: function(a, b, d, n) { | |
return ["M", a, b, "L", a + d, b, a + d, b + n, a, b + | |
n, "Z" | |
] | |
}, | |
triangle: function(a, b, d, n) { | |
return ["M", a + d / 2, b, "L", a + d, b + n, a, b + n, "Z"] | |
}, | |
"triangle-down": function(a, b, d, n) { | |
return ["M", a, b, "L", a + d, b, a + d / 2, b + n, "Z"] | |
}, | |
diamond: function(a, b, d, n) { | |
return ["M", a + d / 2, b, "L", a + d, b + n / 2, a + d / 2, b + n, a, b + n / 2, "Z"] | |
}, | |
arc: function(a, b, d, n, g) { | |
var z = g.start, | |
f = g.r || d, | |
h = g.r || n || d, | |
t = g.end - .001; | |
d = g.innerR; | |
n = r(g.open, .001 > Math.abs(g.end - g.start - 2 * Math.PI)); | |
var l = Math.cos(z), | |
x = Math.sin(z), | |
c = Math.cos(t); | |
t = Math.sin(t); | |
z = r(g.longArc, .001 > g.end - z - Math.PI ? 0 : 1); | |
f = ["M", a + f * l, b + h * x, "A", f, h, 0, z, | |
r(g.clockwise, 1), a + f * c, b + h * t | |
]; | |
G(d) && f.push(n ? "M" : "L", a + d * c, b + d * t, "A", d, d, 0, z, G(g.clockwise) ? 1 - g.clockwise : 0, a + d * l, b + d * x); | |
f.push(n ? "" : "Z"); | |
return f | |
}, | |
callout: function(a, b, d, n, g) { | |
var z = Math.min(g && g.r || 0, d, n), | |
f = z + 6, | |
h = g && g.anchorX; | |
g = g && g.anchorY; | |
var t = ["M", a + z, b, "L", a + d - z, b, "C", a + d, b, a + d, b, a + d, b + z, "L", a + d, b + n - z, "C", a + d, b + n, a + d, b + n, a + d - z, b + n, "L", a + z, b + n, "C", a, b + n, a, b + n, a, b + n - z, "L", a, b + z, "C", a, b, a, b, a + z, b]; | |
h && h > d ? g > b + f && g < b + n - f ? t.splice(13, 3, "L", a + d, g - 6, a + d + 6, g, a + d, g + 6, a + d, b + n - z) : t.splice(13, 3, "L", a + d, | |
n / 2, h, g, a + d, n / 2, a + d, b + n - z) : h && 0 > h ? g > b + f && g < b + n - f ? t.splice(33, 3, "L", a, g + 6, a - 6, g, a, g - 6, a, b + z) : t.splice(33, 3, "L", a, n / 2, h, g, a, n / 2, a, b + z) : g && g > n && h > a + f && h < a + d - f ? t.splice(23, 3, "L", h + 6, b + n, h, b + n + 6, h - 6, b + n, a + z, b + n) : g && 0 > g && h > a + f && h < a + d - f && t.splice(3, 3, "L", h - 6, b, h, b - 6, h + 6, b, d - z, b); | |
return t | |
} | |
}, | |
clipRect: function(a, b, d, n) { | |
var g = c.uniqueKey() + "-", | |
z = this.createElement("clipPath").attr({ | |
id: g | |
}).add(this.defs); | |
a = this.rect(a, b, d, n, 0).add(z); | |
a.id = g; | |
a.clipPath = z; | |
a.count = 0; | |
return a | |
}, | |
text: function(a, b, d, n) { | |
var g = {}; | |
if (n && | |
(this.allowHTML || !this.forExport)) return this.html(a, b, d); | |
g.x = Math.round(b || 0); | |
d && (g.y = Math.round(d)); | |
G(a) && (g.text = a); | |
a = this.createElement("text").attr(g); | |
n || (a.xSetter = function(a, b, d) { | |
var n = d.getElementsByTagName("tspan"), | |
g = d.getAttribute(b), | |
z; | |
for (z = 0; z < n.length; z++) { | |
var f = n[z]; | |
f.getAttribute(b) === g && f.setAttribute(b, a) | |
} | |
d.setAttribute(b, a) | |
}); | |
return a | |
}, | |
fontMetrics: function(a, b) { | |
a = !this.styledMode && /px/.test(a) || !T.getComputedStyle ? a || b && b.style && b.style.fontSize || this.style && this.style.fontSize : | |
b && P.prototype.getStyle.call(b, "font-size"); | |
a = /px/.test(a) ? D(a) : 12; | |
b = 24 > a ? a + 3 : Math.round(1.2 * a); | |
return { | |
h: b, | |
b: Math.round(.8 * b), | |
f: a | |
} | |
}, | |
rotCorr: function(a, b, d) { | |
var n = a; | |
b && d && (n = Math.max(n * Math.cos(b * l), 4)); | |
return { | |
x: -a / 3 * Math.sin(b * l), | |
y: n | |
} | |
}, | |
label: function(a, b, d, g, z, f, h, t, l) { | |
var x = this, | |
c = x.styledMode, | |
k = x.g("button" !== l && "label"), | |
p = k.text = x.text("", 0, 0, h).attr({ | |
zIndex: 1 | |
}), | |
N, K, O = 0, | |
E = 3, | |
r = 0, | |
A, y, m, R, e, D = {}, | |
V, T, da = /^url\((.*?)\)$/.test(g), | |
u = c || da, | |
v = function() { | |
return c ? N.strokeWidth() % 2 / 2 : (V ? parseInt(V, 10) : 0) % | |
2 / 2 | |
}; | |
l && k.addClass("highcharts-" + l); | |
var w = function() { | |
var a = p.element.style, | |
b = {}; | |
K = ("undefined" === typeof A || "undefined" === typeof y || e) && G(p.textStr) && p.getBBox(); | |
k.width = (A || K.width || 0) + 2 * E + r; | |
k.height = (y || K.height || 0) + 2 * E; | |
T = E + Math.min(x.fontMetrics(a && a.fontSize, p).b, K ? K.height : Infinity); | |
u && (N || (k.box = N = x.symbols[g] || da ? x.symbol(g) : x.rect(), N.addClass(("button" === l ? "" : "highcharts-label-box") + (l ? " highcharts-" + l + "-box" : "")), N.add(k), a = v(), b.x = a, b.y = (t ? -T : 0) + a), b.width = Math.round(k.width), b.height = Math.round(k.height), | |
N.attr(q(b, D)), D = {}) | |
}; | |
var Q = function() { | |
var a = r + E; | |
var b = t ? 0 : T; | |
G(A) && K && ("center" === e || "right" === e) && (a += { | |
center: .5, | |
right: 1 | |
}[e] * (A - K.width)); | |
if (a !== p.x || b !== p.y) p.attr("x", a), p.hasBoxWidthChanged && (K = p.getBBox(!0), w()), "undefined" !== typeof b && p.attr("y", b); | |
p.x = a; | |
p.y = b | |
}; | |
var U = function(a, b) { | |
N ? N.attr(a, b) : D[a] = b | |
}; | |
k.onAdd = function() { | |
p.add(k); | |
k.attr({ | |
text: a || 0 === a ? a : "", | |
x: b, | |
y: d | |
}); | |
N && G(z) && k.attr({ | |
anchorX: z, | |
anchorY: f | |
}) | |
}; | |
k.widthSetter = function(a) { | |
A = B(a) ? a : null | |
}; | |
k.heightSetter = function(a) { | |
y = a | |
}; | |
k["text-alignSetter"] = | |
function(a) { | |
e = a | |
}; | |
k.paddingSetter = function(a) { | |
G(a) && a !== E && (E = k.padding = a, Q()) | |
}; | |
k.paddingLeftSetter = function(a) { | |
G(a) && a !== r && (r = a, Q()) | |
}; | |
k.alignSetter = function(a) { | |
a = { | |
left: 0, | |
center: .5, | |
right: 1 | |
}[a]; | |
a !== O && (O = a, K && k.attr({ | |
x: m | |
})) | |
}; | |
k.textSetter = function(a) { | |
"undefined" !== typeof a && p.attr({ | |
text: a | |
}); | |
w(); | |
Q() | |
}; | |
k["stroke-widthSetter"] = function(a, b) { | |
a && (u = !0); | |
V = this["stroke-width"] = a; | |
U(b, a) | |
}; | |
c ? k.rSetter = function(a, b) { | |
U(b, a) | |
} : k.strokeSetter = k.fillSetter = k.rSetter = function(a, b) { | |
"r" !== b && ("fill" === b && a && (u = !0), k[b] = | |
a); | |
U(b, a) | |
}; | |
k.anchorXSetter = function(a, b) { | |
z = k.anchorX = a; | |
U(b, Math.round(a) - v() - m) | |
}; | |
k.anchorYSetter = function(a, b) { | |
f = k.anchorY = a; | |
U(b, a - R) | |
}; | |
k.xSetter = function(a) { | |
k.x = a; | |
O && (a -= O * ((A || K.width) + 2 * E), k["forceAnimate:x"] = !0); | |
m = Math.round(a); | |
k.attr("translateX", m) | |
}; | |
k.ySetter = function(a) { | |
R = k.y = Math.round(a); | |
k.attr("translateY", R) | |
}; | |
var C = k.css; | |
h = { | |
css: function(a) { | |
if (a) { | |
var b = {}; | |
a = L(a); | |
k.textProps.forEach(function(d) { | |
"undefined" !== typeof a[d] && (b[d] = a[d], delete a[d]) | |
}); | |
p.css(b); | |
"width" in b && w(); | |
"fontSize" in b && | |
(w(), Q()) | |
} | |
return C.call(k, a) | |
}, | |
getBBox: function() { | |
return { | |
width: K.width + 2 * E, | |
height: K.height + 2 * E, | |
x: K.x - E, | |
y: K.y - E | |
} | |
}, | |
destroy: function() { | |
n(k.element, "mouseenter"); | |
n(k.element, "mouseleave"); | |
p && (p = p.destroy()); | |
N && (N = N.destroy()); | |
P.prototype.destroy.call(k); | |
k = x = w = Q = U = null | |
} | |
}; | |
c || (h.shadow = function(a) { | |
a && (w(), N && N.shadow(a)); | |
return k | |
}); | |
return q(k, h) | |
} | |
}); | |
c.Renderer = e | |
}); | |
M(J, "parts/Html.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.attr, | |
I = e.defined, | |
G = e.extend, | |
H = e.pick, | |
v = e.pInt, | |
q = c.createElement, | |
C = c.css, | |
B = c.isFirefox, | |
u = c.isMS, | |
w = c.isWebKit, | |
m = c.SVGElement; | |
e = c.SVGRenderer; | |
var r = c.win; | |
G(m.prototype, { | |
htmlCss: function(c) { | |
var r = "SPAN" === this.element.tagName && c && "width" in c, | |
f = H(r && c.width, void 0); | |
if (r) { | |
delete c.width; | |
this.textWidth = f; | |
var b = !0 | |
} | |
c && "ellipsis" === c.textOverflow && (c.whiteSpace = "nowrap", c.overflow = "hidden"); | |
this.styles = G(this.styles, c); | |
C(this.element, c); | |
b && this.htmlUpdateTransform(); | |
return this | |
}, | |
htmlGetBBox: function() { | |
var c = this.element; | |
return { | |
x: c.offsetLeft, | |
y: c.offsetTop, | |
width: c.offsetWidth, | |
height: c.offsetHeight | |
} | |
}, | |
htmlUpdateTransform: function() { | |
if (this.added) { | |
var c = this.renderer, | |
r = this.element, | |
f = this.translateX || 0, | |
b = this.translateY || 0, | |
a = this.x || 0, | |
d = this.y || 0, | |
h = this.textAlign || "left", | |
k = { | |
left: 0, | |
center: .5, | |
right: 1 | |
}[h], | |
l = this.styles, | |
y = l && l.whiteSpace; | |
C(r, { | |
marginLeft: f, | |
marginTop: b | |
}); | |
!c.styledMode && this.shadows && this.shadows.forEach(function(a) { | |
C(a, { | |
marginLeft: f + 1, | |
marginTop: b + 1 | |
}) | |
}); | |
this.inverted && [].forEach.call(r.childNodes, function(a) { | |
c.invertChild(a, r) | |
}); | |
if ("SPAN" === r.tagName) { | |
l = this.rotation; | |
var p = this.textWidth && v(this.textWidth), | |
g = [l, h, r.innerHTML, this.textWidth, this.textAlign].join(), | |
t; | |
(t = p !== this.oldTextWidth) && !(t = p > this.oldTextWidth) && ((t = this.textPxLength) || (C(r, { | |
width: "", | |
whiteSpace: y || "nowrap" | |
}), t = r.offsetWidth), t = t > p); | |
t && (/[ \-]/.test(r.textContent || r.innerText) || "ellipsis" === r.style.textOverflow) ? (C(r, { | |
width: p + "px", | |
display: "block", | |
whiteSpace: y || "normal" | |
}), this.oldTextWidth = p, this.hasBoxWidthChanged = !0) : this.hasBoxWidthChanged = !1; | |
g !== this.cTT && (y = c.fontMetrics(r.style.fontSize, | |
r).b, !I(l) || l === (this.oldRotation || 0) && h === this.oldAlign || this.setSpanRotation(l, k, y), this.getSpanCorrection(!I(l) && this.textPxLength || r.offsetWidth, y, k, l, h)); | |
C(r, { | |
left: a + (this.xCorr || 0) + "px", | |
top: d + (this.yCorr || 0) + "px" | |
}); | |
this.cTT = g; | |
this.oldRotation = l; | |
this.oldAlign = h | |
} | |
} else this.alignOnAdd = !0 | |
}, | |
setSpanRotation: function(c, r, f) { | |
var b = {}, | |
a = this.renderer.getTransformKey(); | |
b[a] = b.transform = "rotate(" + c + "deg)"; | |
b[a + (B ? "Origin" : "-origin")] = b.transformOrigin = 100 * r + "% " + f + "px"; | |
C(this.element, b) | |
}, | |
getSpanCorrection: function(c, | |
r, f) { | |
this.xCorr = -c * f; | |
this.yCorr = -r | |
} | |
}); | |
G(e.prototype, { | |
getTransformKey: function() { | |
return u && !/Edge/.test(r.navigator.userAgent) ? "-ms-transform" : w ? "-webkit-transform" : B ? "MozTransform" : r.opera ? "-o-transform" : "" | |
}, | |
html: function(c, r, f) { | |
var b = this.createElement("span"), | |
a = b.element, | |
d = b.renderer, | |
h = d.isSVG, | |
k = function(a, b) { | |
["opacity", "visibility"].forEach(function(d) { | |
a[d + "Setter"] = function(g, f, h) { | |
var t = a.div ? a.div.style : b; | |
m.prototype[d + "Setter"].call(this, g, f, h); | |
t && (t[f] = g) | |
} | |
}); | |
a.addedSetters = !0 | |
}; | |
b.textSetter = | |
function(d) { | |
d !== a.innerHTML && (delete this.bBox, delete this.oldTextWidth); | |
this.textStr = d; | |
a.innerHTML = H(d, ""); | |
b.doTransform = !0 | |
}; | |
h && k(b, b.element.style); | |
b.xSetter = b.ySetter = b.alignSetter = b.rotationSetter = function(a, d) { | |
"align" === d && (d = "textAlign"); | |
b[d] = a; | |
b.doTransform = !0 | |
}; | |
b.afterSetters = function() { | |
this.doTransform && (this.htmlUpdateTransform(), this.doTransform = !1) | |
}; | |
b.attr({ | |
text: c, | |
x: Math.round(r), | |
y: Math.round(f) | |
}).css({ | |
position: "absolute" | |
}); | |
d.styledMode || b.css({ | |
fontFamily: this.style.fontFamily, | |
fontSize: this.style.fontSize | |
}); | |
a.style.whiteSpace = "nowrap"; | |
b.css = b.htmlCss; | |
h && (b.add = function(f) { | |
var h = d.box.parentNode, | |
l = []; | |
if (this.parentGroup = f) { | |
var g = f.div; | |
if (!g) { | |
for (; f;) l.push(f), f = f.parentGroup; | |
l.reverse().forEach(function(a) { | |
function d(b, d) { | |
a[d] = b; | |
"translateX" === d ? t.left = b + "px" : t.top = b + "px"; | |
a.doTransform = !0 | |
} | |
var f = F(a.element, "class"); | |
g = a.div = a.div || q("div", f ? { | |
className: f | |
} : void 0, { | |
position: "absolute", | |
left: (a.translateX || 0) + "px", | |
top: (a.translateY || 0) + "px", | |
display: a.display, | |
opacity: a.opacity, | |
pointerEvents: a.styles && a.styles.pointerEvents | |
}, | |
g || h); | |
var t = g.style; | |
G(a, { | |
classSetter: function(a) { | |
return function(b) { | |
this.element.setAttribute("class", b); | |
a.className = b | |
} | |
}(g), | |
on: function() { | |
l[0].div && b.on.apply({ | |
element: l[0].div | |
}, arguments); | |
return a | |
}, | |
translateXSetter: d, | |
translateYSetter: d | |
}); | |
a.addedSetters || k(a) | |
}) | |
} | |
} else g = h; | |
g.appendChild(a); | |
b.added = !0; | |
b.alignOnAdd && b.htmlUpdateTransform(); | |
return b | |
}); | |
return b | |
} | |
}) | |
}); | |
M(J, "parts/Time.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.defined, | |
I = e.extend, | |
G = e.isObject, | |
H = e.objectEach, | |
v = | |
e.pad, | |
q = e.pick, | |
C = e.splat, | |
B = c.merge, | |
u = c.timeUnits, | |
w = c.win; | |
c.Time = function(c) { | |
this.update(c, !1) | |
}; | |
c.Time.prototype = { | |
defaultOptions: { | |
Date: void 0, | |
getTimezoneOffset: void 0, | |
timezone: void 0, | |
timezoneOffset: 0, | |
useUTC: !0 | |
}, | |
update: function(c) { | |
var r = q(c && c.useUTC, !0), | |
m = this; | |
this.options = c = B(!0, this.options || {}, c); | |
this.Date = c.Date || w.Date || Date; | |
this.timezoneOffset = (this.useUTC = r) && c.timezoneOffset; | |
this.getTimezoneOffset = this.timezoneOffsetFunction(); | |
(this.variableTimezone = !(r && !c.getTimezoneOffset && !c.timezone)) || | |
this.timezoneOffset ? (this.get = function(c, f) { | |
var b = f.getTime(), | |
a = b - m.getTimezoneOffset(f); | |
f.setTime(a); | |
c = f["getUTC" + c](); | |
f.setTime(b); | |
return c | |
}, this.set = function(c, f, b) { | |
if ("Milliseconds" === c || "Seconds" === c || "Minutes" === c && 0 === f.getTimezoneOffset() % 60) f["set" + c](b); | |
else { | |
var a = m.getTimezoneOffset(f); | |
a = f.getTime() - a; | |
f.setTime(a); | |
f["setUTC" + c](b); | |
c = m.getTimezoneOffset(f); | |
a = f.getTime() + c; | |
f.setTime(a) | |
} | |
}) : r ? (this.get = function(c, f) { | |
return f["getUTC" + c]() | |
}, this.set = function(c, f, b) { | |
return f["setUTC" + c](b) | |
}) : | |
(this.get = function(c, f) { | |
return f["get" + c]() | |
}, this.set = function(c, f, b) { | |
return f["set" + c](b) | |
}) | |
}, | |
makeTime: function(m, r, e, A, f, b) { | |
if (this.useUTC) { | |
var a = this.Date.UTC.apply(0, arguments); | |
var d = this.getTimezoneOffset(a); | |
a += d; | |
var h = this.getTimezoneOffset(a); | |
d !== h ? a += h - d : d - 36E5 !== this.getTimezoneOffset(a - 36E5) || c.isSafari || (a -= 36E5) | |
} else a = (new this.Date(m, r, q(e, 1), q(A, 0), q(f, 0), q(b, 0))).getTime(); | |
return a | |
}, | |
timezoneOffsetFunction: function() { | |
var m = this, | |
r = this.options, | |
e = w.moment; | |
if (!this.useUTC) return function(c) { | |
return 6E4 * | |
(new Date(c)).getTimezoneOffset() | |
}; | |
if (r.timezone) { | |
if (e) return function(c) { | |
return 6E4 * -e.tz(c, r.timezone).utcOffset() | |
}; | |
c.error(25) | |
} | |
return this.useUTC && r.getTimezoneOffset ? function(c) { | |
return 6E4 * r.getTimezoneOffset(c) | |
} : function() { | |
return 6E4 * (m.timezoneOffset || 0) | |
} | |
}, | |
dateFormat: function(m, r, e) { | |
if (!F(r) || isNaN(r)) return c.defaultOptions.lang.invalidDate || ""; | |
m = q(m, "%Y-%m-%d %H:%M:%S"); | |
var A = this, | |
f = new this.Date(r), | |
b = this.get("Hours", f), | |
a = this.get("Day", f), | |
d = this.get("Date", f), | |
h = this.get("Month", f), | |
k = this.get("FullYear", | |
f), | |
l = c.defaultOptions.lang, | |
y = l.weekdays, | |
p = l.shortWeekdays; | |
f = I({ | |
a: p ? p[a] : y[a].substr(0, 3), | |
A: y[a], | |
d: v(d), | |
e: v(d, 2, " "), | |
w: a, | |
b: l.shortMonths[h], | |
B: l.months[h], | |
m: v(h + 1), | |
o: h + 1, | |
y: k.toString().substr(2, 2), | |
Y: k, | |
H: v(b), | |
k: b, | |
I: v(b % 12 || 12), | |
l: b % 12 || 12, | |
M: v(A.get("Minutes", f)), | |
p: 12 > b ? "AM" : "PM", | |
P: 12 > b ? "am" : "pm", | |
S: v(f.getSeconds()), | |
L: v(Math.floor(r % 1E3), 3) | |
}, c.dateFormats); | |
H(f, function(a, b) { | |
for (; - 1 !== m.indexOf("%" + b);) m = m.replace("%" + b, "function" === typeof a ? a.call(A, r) : a) | |
}); | |
return e ? m.substr(0, 1).toUpperCase() + m.substr(1) : | |
m | |
}, | |
resolveDTLFormat: function(c) { | |
return G(c, !0) ? c : (c = C(c), { | |
main: c[0], | |
from: c[1], | |
to: c[2] | |
}) | |
}, | |
getTimeTicks: function(c, r, e, A) { | |
var f = this, | |
b = [], | |
a = {}; | |
var d = new f.Date(r); | |
var h = c.unitRange, | |
k = c.count || 1, | |
l; | |
A = q(A, 1); | |
if (F(r)) { | |
f.set("Milliseconds", d, h >= u.second ? 0 : k * Math.floor(f.get("Milliseconds", d) / k)); | |
h >= u.second && f.set("Seconds", d, h >= u.minute ? 0 : k * Math.floor(f.get("Seconds", d) / k)); | |
h >= u.minute && f.set("Minutes", d, h >= u.hour ? 0 : k * Math.floor(f.get("Minutes", d) / k)); | |
h >= u.hour && f.set("Hours", d, h >= u.day ? 0 : k * Math.floor(f.get("Hours", | |
d) / k)); | |
h >= u.day && f.set("Date", d, h >= u.month ? 1 : Math.max(1, k * Math.floor(f.get("Date", d) / k))); | |
if (h >= u.month) { | |
f.set("Month", d, h >= u.year ? 0 : k * Math.floor(f.get("Month", d) / k)); | |
var y = f.get("FullYear", d) | |
} | |
h >= u.year && f.set("FullYear", d, y - y % k); | |
h === u.week && (y = f.get("Day", d), f.set("Date", d, f.get("Date", d) - y + A + (y < A ? -7 : 0))); | |
y = f.get("FullYear", d); | |
A = f.get("Month", d); | |
var p = f.get("Date", d), | |
g = f.get("Hours", d); | |
r = d.getTime(); | |
f.variableTimezone && (l = e - r > 4 * u.month || f.getTimezoneOffset(r) !== f.getTimezoneOffset(e)); | |
r = d.getTime(); | |
for (d = 1; r < e;) b.push(r), r = h === u.year ? f.makeTime(y + d * k, 0) : h === u.month ? f.makeTime(y, A + d * k) : !l || h !== u.day && h !== u.week ? l && h === u.hour && 1 < k ? f.makeTime(y, A, p, g + d * k) : r + h * k : f.makeTime(y, A, p + d * k * (h === u.day ? 1 : 7)), d++; | |
b.push(r); | |
h <= u.hour && 1E4 > b.length && b.forEach(function(b) { | |
0 === b % 18E5 && "000000000" === f.dateFormat("%H%M%S%L", b) && (a[b] = "day") | |
}) | |
} | |
b.info = I(c, { | |
higherRanks: a, | |
totalRange: h * k | |
}); | |
return b | |
} | |
} | |
}); | |
M(J, "parts/Options.js", [J["parts/Globals.js"]], function(c) { | |
var e = c.color, | |
F = c.merge; | |
c.defaultOptions = { | |
colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "), | |
symbols: ["circle", "diamond", "square", "triangle", "triangle-down"], | |
lang: { | |
loading: "Loading...", | |
months: "January February March April May June July August September October November December".split(" "), | |
shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), | |
weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), | |
decimalPoint: ".", | |
numericSymbols: "kMGTPE".split(""), | |
resetZoom: "Reset zoom", | |
resetZoomTitle: "Reset zoom level 1:1", | |
thousandsSep: " " | |
}, | |
global: {}, | |
time: c.Time.prototype.defaultOptions, | |
chart: { | |
styledMode: !1, | |
borderRadius: 0, | |
colorCount: 10, | |
defaultSeriesType: "line", | |
ignoreHiddenSeries: !0, | |
spacing: [10, 10, 15, 10], | |
resetZoomButton: { | |
theme: { | |
zIndex: 6 | |
}, | |
position: { | |
align: "right", | |
x: -10, | |
y: 10 | |
} | |
}, | |
width: null, | |
height: null, | |
borderColor: "#335cad", | |
backgroundColor: "#ffffff", | |
plotBorderColor: "#cccccc" | |
}, | |
title: { | |
text: "Chart title", | |
align: "center", | |
margin: 15, | |
widthAdjust: -44 | |
}, | |
subtitle: { | |
text: "", | |
align: "center", | |
widthAdjust: -44 | |
}, | |
caption: { | |
margin: 15, | |
text: "", | |
align: "left", | |
verticalAlign: "bottom" | |
}, | |
plotOptions: {}, | |
labels: { | |
style: { | |
position: "absolute", | |
color: "#333333" | |
} | |
}, | |
legend: { | |
enabled: !0, | |
align: "center", | |
alignColumns: !0, | |
layout: "horizontal", | |
labelFormatter: function() { | |
return this.name | |
}, | |
borderColor: "#999999", | |
borderRadius: 0, | |
navigation: { | |
activeColor: "#003399", | |
inactiveColor: "#cccccc" | |
}, | |
itemStyle: { | |
color: "#333333", | |
cursor: "pointer", | |
fontSize: "12px", | |
fontWeight: "bold", | |
textOverflow: "ellipsis" | |
}, | |
itemHoverStyle: { | |
color: "#000000" | |
}, | |
itemHiddenStyle: { | |
color: "#cccccc" | |
}, | |
shadow: !1, | |
itemCheckboxStyle: { | |
position: "absolute", | |
width: "13px", | |
height: "13px" | |
}, | |
squareSymbol: !0, | |
symbolPadding: 5, | |
verticalAlign: "bottom", | |
x: 0, | |
y: 0, | |
title: { | |
style: { | |
fontWeight: "bold" | |
} | |
} | |
}, | |
loading: { | |
labelStyle: { | |
fontWeight: "bold", | |
position: "relative", | |
top: "45%" | |
}, | |
style: { | |
position: "absolute", | |
backgroundColor: "#ffffff", | |
opacity: .5, | |
textAlign: "center" | |
} | |
}, | |
tooltip: { | |
enabled: !0, | |
animation: c.svg, | |
borderRadius: 3, | |
dateTimeLabelFormats: { | |
millisecond: "%A, %b %e, %H:%M:%S.%L", | |
second: "%A, %b %e, %H:%M:%S", | |
minute: "%A, %b %e, %H:%M", | |
hour: "%A, %b %e, %H:%M", | |
day: "%A, %b %e, %Y", | |
week: "Week from %A, %b %e, %Y", | |
month: "%B %Y", | |
year: "%Y" | |
}, | |
footerFormat: "", | |
padding: 8, | |
snap: c.isTouchDevice ? 25 : 10, | |
headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>', | |
pointFormat: '<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>', | |
backgroundColor: e("#f7f7f7").setOpacity(.85).get(), | |
borderWidth: 1, | |
shadow: !0, | |
style: { | |
color: "#333333", | |
cursor: "default", | |
fontSize: "12px", | |
pointerEvents: "none", | |
whiteSpace: "nowrap" | |
} | |
}, | |
credits: { | |
enabled: !0, | |
href: "https://www.highcharts.com?credits", | |
position: { | |
align: "right", | |
x: -10, | |
verticalAlign: "bottom", | |
y: -5 | |
}, | |
style: { | |
cursor: "pointer", | |
color: "#999999", | |
fontSize: "9px" | |
}, | |
text: "Highcharts.com" | |
} | |
}; | |
c.setOptions = function(e) { | |
c.defaultOptions = F(!0, c.defaultOptions, e); | |
(e.time || e.global) && c.time.update(F(c.defaultOptions.global, c.defaultOptions.time, e.global, e.time)); | |
return c.defaultOptions | |
}; | |
c.getOptions = function() { | |
return c.defaultOptions | |
}; | |
c.defaultPlotOptions = c.defaultOptions.plotOptions; | |
c.time = new c.Time(F(c.defaultOptions.global, c.defaultOptions.time)); | |
c.dateFormat = function(e, G, H) { | |
return c.time.dateFormat(e, G, H) | |
}; | |
"" | |
}); | |
M(J, "parts/Tick.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.clamp, | |
I = e.correctFloat, | |
G = e.defined, | |
H = e.destroyObjectProperties, | |
v = e.extend, | |
q = e.isNumber, | |
C = e.objectEach, | |
B = e.pick, | |
u = c.fireEvent, | |
w = c.merge, | |
m = c.deg2rad; | |
c.Tick = function(c, e, m, f, b) { | |
this.axis = c; | |
this.pos = e; | |
this.type = m || ""; | |
this.isNewLabel = this.isNew = !0; | |
this.parameters = b || {}; | |
this.tickmarkOffset = this.parameters.tickmarkOffset; | |
this.options = this.parameters.options; | |
m || f || this.addLabel() | |
}; | |
c.Tick.prototype = { | |
addLabel: function() { | |
var c = this, | |
e = c.axis, | |
m = e.options, | |
f = e.chart, | |
b = e.categories, | |
a = e.names, | |
d = c.pos, | |
h = B(c.options && c.options.labels, m.labels), | |
k = e.tickPositions, | |
l = d === k[0], | |
y = d === k[k.length - 1]; | |
a = this.parameters.category || (b ? B(b[d], a[d], d) : d); | |
var p = c.label; | |
b = (!h.step || 1 === h.step) && 1 === e.tickInterval; | |
k = k.info; | |
var g, t; | |
if (e.isDatetimeAxis && k) { | |
var x = f.time.resolveDTLFormat(m.dateTimeLabelFormats[!m.grid && k.higherRanks[d] || k.unitName]); | |
var L = x.main | |
} | |
c.isFirst = l; | |
c.isLast = y; | |
c.formatCtx = { | |
axis: e, | |
chart: f, | |
isFirst: l, | |
isLast: y, | |
dateTimeLabelFormat: L, | |
tickPositionInfo: k, | |
value: e.isLog ? I(e.lin2log(a)) : a, | |
pos: d | |
}; | |
m = e.labelFormatter.call(c.formatCtx, this.formatCtx); | |
if (t = x && x.list) c.shortenLabel = function() { | |
for (g = 0; g < t.length; g++) | |
if (p.attr({ | |
text: e.labelFormatter.call(v(c.formatCtx, { | |
dateTimeLabelFormat: t[g] | |
})) | |
}), p.getBBox().width < e.getSlotWidth(c) - 2 * B(h.padding, 5)) return; | |
p.attr({ | |
text: "" | |
}) | |
}; | |
b && e._addedPlotLB && e.isXAxis && c.moveLabel(m, h); | |
G(p) || c.movedLabel ? p && p.textStr !== m && !b && (!p.textWidth || h.style && h.style.width || p.styles.width || p.css({ | |
width: null | |
}), p.attr({ | |
text: m | |
}), p.textPxLength = | |
p.getBBox().width) : (c.label = p = c.createLabel({ | |
x: 0, | |
y: 0 | |
}, m, h), c.rotation = 0) | |
}, | |
moveLabel: function(c, e) { | |
var r = this, | |
f = r.label, | |
b = !1, | |
a = r.axis, | |
d = a.reversed, | |
h = a.chart.inverted; | |
f && f.textStr === c ? (r.movedLabel = f, b = !0, delete r.label) : C(a.ticks, function(a) { | |
b || a.isNew || a === r || !a.label || a.label.textStr !== c || (r.movedLabel = a.label, b = !0, a.labelPos = r.movedLabel.xy, delete a.label) | |
}); | |
if (!b && (r.labelPos || f)) { | |
var k = r.labelPos || f.xy; | |
f = h ? k.x : d ? 0 : a.width + a.left; | |
a = h ? d ? a.width + a.left : 0 : k.y; | |
r.movedLabel = r.createLabel({ | |
x: f, | |
y: a | |
}, | |
c, e); | |
r.movedLabel && r.movedLabel.attr({ | |
opacity: 0 | |
}) | |
} | |
}, | |
createLabel: function(c, e, m) { | |
var f = this.axis, | |
b = f.chart; | |
if (c = G(e) && m.enabled ? b.renderer.text(e, c.x, c.y, m.useHTML).add(f.labelGroup) : null) b.styledMode || c.css(w(m.style)), c.textPxLength = c.getBBox().width; | |
return c | |
}, | |
replaceMovedLabel: function() { | |
var c = this.label, | |
e = this.axis, | |
m = e.reversed, | |
f = this.axis.chart.inverted; | |
if (c && !this.isNew) { | |
var b = f ? c.xy.x : m ? e.left : e.width + e.left; | |
m = f ? m ? e.width + e.top : e.top : c.xy.y; | |
c.animate({ | |
x: b, | |
y: m, | |
opacity: 0 | |
}, void 0, c.destroy); | |
delete this.label | |
} | |
e.isDirty = !0; | |
this.label = this.movedLabel; | |
delete this.movedLabel | |
}, | |
getLabelSize: function() { | |
return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0 | |
}, | |
handleOverflow: function(c) { | |
var e = this.axis, | |
r = e.options.labels, | |
f = c.x, | |
b = e.chart.chartWidth, | |
a = e.chart.spacing, | |
d = B(e.labelLeft, Math.min(e.pos, a[3])); | |
a = B(e.labelRight, Math.max(e.isRadial ? 0 : e.pos + e.len, b - a[1])); | |
var h = this.label, | |
k = this.rotation, | |
l = { | |
left: 0, | |
center: .5, | |
right: 1 | |
}[e.labelAlign || h.attr("align")], | |
y = h.getBBox().width, | |
p = e.getSlotWidth(this), | |
g = p, | |
t = | |
1, | |
x, L = {}; | |
if (k || "justify" !== B(r.overflow, "justify")) 0 > k && f - l * y < d ? x = Math.round(f / Math.cos(k * m) - d) : 0 < k && f + l * y > a && (x = Math.round((b - f) / Math.cos(k * m))); | |
else if (b = f + (1 - l) * y, f - l * y < d ? g = c.x + g * (1 - l) - d : b > a && (g = a - c.x + g * l, t = -1), g = Math.min(p, g), g < p && "center" === e.labelAlign && (c.x += t * (p - g - l * (p - Math.min(y, g)))), y > g || e.autoRotation && (h.styles || {}).width) x = g; | |
x && (this.shortenLabel ? this.shortenLabel() : (L.width = Math.floor(x), (r.style || {}).textOverflow || (L.textOverflow = "ellipsis"), h.css(L))) | |
}, | |
getPosition: function(c, e, m, | |
f) { | |
var b = this.axis, | |
a = b.chart, | |
d = f && a.oldChartHeight || a.chartHeight; | |
c = { | |
x: c ? I(b.translate(e + m, null, null, f) + b.transB) : b.left + b.offset + (b.opposite ? (f && a.oldChartWidth || a.chartWidth) - b.right - b.left : 0), | |
y: c ? d - b.bottom + b.offset - (b.opposite ? b.height : 0) : I(d - b.translate(e + m, null, null, f) - b.transB) | |
}; | |
c.y = F(c.y, -1E5, 1E5); | |
u(this, "afterGetPosition", { | |
pos: c | |
}); | |
return c | |
}, | |
getLabelPosition: function(c, e, A, f, b, a, d, h) { | |
var k = this.axis, | |
l = k.transA, | |
r = k.isLinked && k.linkedParent ? k.linkedParent.reversed : k.reversed, | |
p = k.staggerLines, | |
g = k.tickRotCorr || { | |
x: 0, | |
y: 0 | |
}, | |
t = b.y, | |
x = f || k.reserveSpaceDefault ? 0 : -k.labelOffset * ("center" === k.labelAlign ? .5 : 1), | |
L = {}; | |
G(t) || (t = 0 === k.side ? A.rotation ? -8 : -A.getBBox().height : 2 === k.side ? g.y + 8 : Math.cos(A.rotation * m) * (g.y - A.getBBox(!1, 0).height / 2)); | |
c = c + b.x + x + g.x - (a && f ? a * l * (r ? -1 : 1) : 0); | |
e = e + t - (a && !f ? a * l * (r ? 1 : -1) : 0); | |
p && (A = d / (h || 1) % p, k.opposite && (A = p - A - 1), e += k.labelOffset / p * A); | |
L.x = c; | |
L.y = Math.round(e); | |
u(this, "afterGetLabelPosition", { | |
pos: L, | |
tickmarkOffset: a, | |
index: d | |
}); | |
return L | |
}, | |
getMarkPath: function(c, e, m, f, b, a) { | |
return a.crispLine(["M", | |
c, e, "L", c + (b ? 0 : -m), e + (b ? m : 0) | |
], f) | |
}, | |
renderGridLine: function(c, e, m) { | |
var f = this.axis, | |
b = f.options, | |
a = this.gridLine, | |
d = {}, | |
h = this.pos, | |
k = this.type, | |
l = B(this.tickmarkOffset, f.tickmarkOffset), | |
r = f.chart.renderer, | |
p = k ? k + "Grid" : "grid", | |
g = b[p + "LineWidth"], | |
t = b[p + "LineColor"]; | |
b = b[p + "LineDashStyle"]; | |
a || (f.chart.styledMode || (d.stroke = t, d["stroke-width"] = g, b && (d.dashstyle = b)), k || (d.zIndex = 1), c && (e = 0), this.gridLine = a = r.path().attr(d).addClass("highcharts-" + (k ? k + "-" : "") + "grid-line").add(f.gridGroup)); | |
if (a && (m = f.getPlotLinePath({ | |
value: h + | |
l, | |
lineWidth: a.strokeWidth() * m, | |
force: "pass", | |
old: c | |
}))) a[c || this.isNew ? "attr" : "animate"]({ | |
d: m, | |
opacity: e | |
}) | |
}, | |
renderMark: function(c, e, m) { | |
var f = this.axis, | |
b = f.options, | |
a = f.chart.renderer, | |
d = this.type, | |
h = d ? d + "Tick" : "tick", | |
k = f.tickSize(h), | |
l = this.mark, | |
r = !l, | |
p = c.x; | |
c = c.y; | |
var g = B(b[h + "Width"], !d && f.isXAxis ? 1 : 0); | |
b = b[h + "Color"]; | |
k && (f.opposite && (k[0] = -k[0]), r && (this.mark = l = a.path().addClass("highcharts-" + (d ? d + "-" : "") + "tick").add(f.axisGroup), f.chart.styledMode || l.attr({ | |
stroke: b, | |
"stroke-width": g | |
})), l[r ? "attr" : "animate"]({ | |
d: this.getMarkPath(p, | |
c, k[0], l.strokeWidth() * m, f.horiz, a), | |
opacity: e | |
})) | |
}, | |
renderLabel: function(c, e, m, f) { | |
var b = this.axis, | |
a = b.horiz, | |
d = b.options, | |
h = this.label, | |
k = d.labels, | |
l = k.step; | |
b = B(this.tickmarkOffset, b.tickmarkOffset); | |
var y = !0, | |
p = c.x; | |
c = c.y; | |
h && q(p) && (h.xy = c = this.getLabelPosition(p, c, h, a, k, b, f, l), this.isFirst && !this.isLast && !B(d.showFirstLabel, 1) || this.isLast && !this.isFirst && !B(d.showLastLabel, 1) ? y = !1 : !a || k.step || k.rotation || e || 0 === m || this.handleOverflow(c), l && f % l && (y = !1), y && q(c.y) ? (c.opacity = m, h[this.isNewLabel ? "attr" : "animate"](c), | |
this.isNewLabel = !1) : (h.attr("y", -9999), this.isNewLabel = !0)) | |
}, | |
render: function(e, m, q) { | |
var f = this.axis, | |
b = f.horiz, | |
a = this.pos, | |
d = B(this.tickmarkOffset, f.tickmarkOffset); | |
a = this.getPosition(b, a, d, m); | |
d = a.x; | |
var h = a.y; | |
f = b && d === f.pos + f.len || !b && h === f.pos ? -1 : 1; | |
q = B(q, 1); | |
this.isActive = !0; | |
this.renderGridLine(m, q, f); | |
this.renderMark(a, q, f); | |
this.renderLabel(a, m, q, e); | |
this.isNew = !1; | |
c.fireEvent(this, "afterRender") | |
}, | |
destroy: function() { | |
H(this, this.axis) | |
} | |
} | |
}); | |
M(J, "parts/Axis.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], | |
function(c, e) { | |
var F = e.animObject, | |
I = e.arrayMax, | |
G = e.arrayMin, | |
H = e.clamp, | |
v = e.correctFloat, | |
q = e.defined, | |
C = e.destroyObjectProperties, | |
B = e.extend, | |
u = e.isArray, | |
w = e.isNumber, | |
m = e.isString, | |
r = e.objectEach, | |
D = e.pick, | |
A = e.relativeLength, | |
f = e.splat, | |
b = e.syncTimeout, | |
a = c.addEvent, | |
d = c.color, | |
h = c.defaultOptions, | |
k = c.deg2rad, | |
l = c.fireEvent, | |
y = c.format, | |
p = c.getMagnitude, | |
g = c.merge, | |
t = c.normalizeTickInterval, | |
x = c.removeEvent, | |
L = c.seriesTypes, | |
E = c.Tick; | |
e = function() { | |
this.init.apply(this, arguments) | |
}; | |
B(e.prototype, { | |
defaultOptions: { | |
dateTimeLabelFormats: { | |
millisecond: { | |
main: "%H:%M:%S.%L", | |
range: !1 | |
}, | |
second: { | |
main: "%H:%M:%S", | |
range: !1 | |
}, | |
minute: { | |
main: "%H:%M", | |
range: !1 | |
}, | |
hour: { | |
main: "%H:%M", | |
range: !1 | |
}, | |
day: { | |
main: "%e. %b" | |
}, | |
week: { | |
main: "%e. %b" | |
}, | |
month: { | |
main: "%b '%y" | |
}, | |
year: { | |
main: "%Y" | |
} | |
}, | |
endOnTick: !1, | |
labels: { | |
enabled: !0, | |
indentation: 10, | |
x: 0, | |
style: { | |
color: "#666666", | |
cursor: "default", | |
fontSize: "11px" | |
} | |
}, | |
maxPadding: .01, | |
minorTickLength: 2, | |
minorTickPosition: "outside", | |
minPadding: .01, | |
showEmpty: !0, | |
startOfWeek: 1, | |
startOnTick: !1, | |
tickLength: 10, | |
tickPixelInterval: 100, | |
tickmarkPlacement: "between", | |
tickPosition: "outside", | |
title: { | |
align: "middle", | |
style: { | |
color: "#666666" | |
} | |
}, | |
type: "linear", | |
minorGridLineColor: "#f2f2f2", | |
minorGridLineWidth: 1, | |
minorTickColor: "#999999", | |
lineColor: "#ccd6eb", | |
lineWidth: 1, | |
gridLineColor: "#e6e6e6", | |
tickColor: "#ccd6eb" | |
}, | |
defaultYAxisOptions: { | |
endOnTick: !0, | |
maxPadding: .05, | |
minPadding: .05, | |
tickPixelInterval: 72, | |
showLastLabel: !0, | |
labels: { | |
x: -8 | |
}, | |
startOnTick: !0, | |
title: { | |
rotation: 270, | |
text: "Values" | |
}, | |
stackLabels: { | |
allowOverlap: !1, | |
enabled: !1, | |
crop: !0, | |
overflow: "justify", | |
formatter: function() { | |
var a = this.axis.chart.numberFormatter; | |
return a(this.total, -1) | |
}, | |
style: { | |
color: "#000000", | |
fontSize: "11px", | |
fontWeight: "bold", | |
textOutline: "1px contrast" | |
} | |
}, | |
gridLineWidth: 1, | |
lineWidth: 0 | |
}, | |
defaultLeftAxisOptions: { | |
labels: { | |
x: -15 | |
}, | |
title: { | |
rotation: 270 | |
} | |
}, | |
defaultRightAxisOptions: { | |
labels: { | |
x: 15 | |
}, | |
title: { | |
rotation: 90 | |
} | |
}, | |
defaultBottomAxisOptions: { | |
labels: { | |
autoRotation: [-45], | |
x: 0 | |
}, | |
margin: 15, | |
title: { | |
rotation: 0 | |
} | |
}, | |
defaultTopAxisOptions: { | |
labels: { | |
autoRotation: [-45], | |
x: 0 | |
}, | |
margin: 15, | |
title: { | |
rotation: 0 | |
} | |
}, | |
init: function(b, d) { | |
var n = d.isX, | |
g = this; | |
g.chart = b; | |
g.horiz = b.inverted && !g.isZAxis ? !n : n; | |
g.isXAxis = | |
n; | |
g.coll = g.coll || (n ? "xAxis" : "yAxis"); | |
l(this, "init", { | |
userOptions: d | |
}); | |
g.opposite = d.opposite; | |
g.side = d.side || (g.horiz ? g.opposite ? 0 : 2 : g.opposite ? 1 : 3); | |
g.setOptions(d); | |
var z = this.options, | |
h = z.type; | |
g.labelFormatter = z.labels.formatter || g.defaultLabelFormatter; | |
g.userOptions = d; | |
g.minPixelPadding = 0; | |
g.reversed = z.reversed; | |
g.visible = !1 !== z.visible; | |
g.zoomEnabled = !1 !== z.zoomEnabled; | |
g.hasNames = "category" === h || !0 === z.categories; | |
g.categories = z.categories || g.hasNames; | |
g.names || (g.names = [], g.names.keys = {}); | |
g.plotLinesAndBandsGroups = {}; | |
g.isLog = "logarithmic" === h; | |
g.isDatetimeAxis = "datetime" === h; | |
g.positiveValuesOnly = g.isLog && !g.allowNegativeLog; | |
g.isLinked = q(z.linkedTo); | |
g.ticks = {}; | |
g.labelEdge = []; | |
g.minorTicks = {}; | |
g.plotLinesAndBands = []; | |
g.alternateBands = {}; | |
g.len = 0; | |
g.minRange = g.userMinRange = z.minRange || z.maxZoom; | |
g.range = z.range; | |
g.offset = z.offset || 0; | |
g.stacks = {}; | |
g.oldStacks = {}; | |
g.stacksTouched = 0; | |
g.max = null; | |
g.min = null; | |
g.crosshair = D(z.crosshair, f(b.options.tooltip.crosshairs)[n ? 0 : 1], !1); | |
d = g.options.events; - 1 === b.axes.indexOf(g) && (n ? b.axes.splice(b.xAxis.length, | |
0, g) : b.axes.push(g), b[g.coll].push(g)); | |
g.series = g.series || []; | |
b.inverted && !g.isZAxis && n && "undefined" === typeof g.reversed && (g.reversed = !0); | |
r(d, function(b, d) { | |
c.isFunction(b) && a(g, d, b) | |
}); | |
g.lin2log = z.linearToLogConverter || g.lin2log; | |
g.isLog && (g.val2lin = g.log2lin, g.lin2val = g.lin2log); | |
l(this, "afterInit") | |
}, | |
setOptions: function(a) { | |
this.options = g(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], | |
g(h[this.coll], a)); | |
l(this, "afterSetOptions", { | |
userOptions: a | |
}) | |
}, | |
defaultLabelFormatter: function() { | |
var a = this.axis, | |
b = this.value, | |
d = a.chart.time, | |
g = a.categories, | |
f = this.dateTimeLabelFormat, | |
c = h.lang, | |
t = c.numericSymbols; | |
c = c.numericSymbolMagnitude || 1E3; | |
var l = t && t.length, | |
x = a.options.labels.format; | |
a = a.isLog ? Math.abs(b) : a.tickInterval; | |
var k = this.chart, | |
p = k.numberFormatter; | |
if (x) var e = y(x, this, k); | |
else if (g) e = b; | |
else if (f) e = d.dateFormat(f, b); | |
else if (l && 1E3 <= a) | |
for (; l-- && "undefined" === typeof e;) d = Math.pow(c, l + 1), a >= d && | |
0 === 10 * b % d && null !== t[l] && 0 !== b && (e = p(b / d, -1) + t[l]); | |
"undefined" === typeof e && (e = 1E4 <= Math.abs(b) ? p(b, -1) : p(b, -1, void 0, "")); | |
return e | |
}, | |
getSeriesExtremes: function() { | |
var a = this, | |
b = a.chart, | |
d; | |
l(this, "getSeriesExtremes", null, function() { | |
a.hasVisibleSeries = !1; | |
a.dataMin = a.dataMax = a.threshold = null; | |
a.softThreshold = !a.isXAxis; | |
a.buildStacks && a.buildStacks(); | |
a.series.forEach(function(g) { | |
if (g.visible || !b.options.chart.ignoreHiddenSeries) { | |
var n = g.options, | |
z = n.threshold; | |
a.hasVisibleSeries = !0; | |
a.positiveValuesOnly && 0 >= | |
z && (z = null); | |
if (a.isXAxis) { | |
if (n = g.xData, n.length) { | |
d = g.getXExtremes(n); | |
var f = d.min; | |
var h = d.max; | |
w(f) || f instanceof Date || (n = n.filter(w), d = g.getXExtremes(n), f = d.min, h = d.max); | |
n.length && (a.dataMin = Math.min(D(a.dataMin, f), f), a.dataMax = Math.max(D(a.dataMax, h), h)) | |
} | |
} else if (g.getExtremes(), h = g.dataMax, f = g.dataMin, q(f) && q(h) && (a.dataMin = Math.min(D(a.dataMin, f), f), a.dataMax = Math.max(D(a.dataMax, h), h)), q(z) && (a.threshold = z), !n.softThreshold || a.positiveValuesOnly) a.softThreshold = !1 | |
} | |
}) | |
}); | |
l(this, "afterGetSeriesExtremes") | |
}, | |
translate: function(a, b, d, g, f, h) { | |
var n = this.linkedParent || this, | |
z = 1, | |
c = 0, | |
t = g ? n.oldTransA : n.transA; | |
g = g ? n.oldMin : n.min; | |
var l = n.minPixelPadding; | |
f = (n.isOrdinal || n.isBroken || n.isLog && f) && n.lin2val; | |
t || (t = n.transA); | |
d && (z *= -1, c = n.len); | |
n.reversed && (z *= -1, c -= z * (n.sector || n.len)); | |
b ? (a = (a * z + c - l) / t + g, f && (a = n.lin2val(a))) : (f && (a = n.val2lin(a)), a = w(g) ? z * (a - g) * t + c + z * l + (w(h) ? t * h : 0) : void 0); | |
return a | |
}, | |
toPixels: function(a, b) { | |
return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos) | |
}, | |
toValue: function(a, b) { | |
return this.translate(a - | |
(b ? 0 : this.pos), !0, !this.horiz, null, !0) | |
}, | |
getPlotLinePath: function(a) { | |
var b = this, | |
d = b.chart, | |
g = b.left, | |
n = b.top, | |
f = a.old, | |
h = a.value, | |
c = a.translatedValue, | |
t = a.lineWidth, | |
x = a.force, | |
k, p, e, E, m = f && d.oldChartHeight || d.chartHeight, | |
L = f && d.oldChartWidth || d.chartWidth, | |
y, r = b.transB, | |
q = function(a, b, d) { | |
if ("pass" !== x && a < b || a > d) x ? a = H(a, b, d) : y = !0; | |
return a | |
}; | |
a = { | |
value: h, | |
lineWidth: t, | |
old: f, | |
force: x, | |
acrossPanes: a.acrossPanes, | |
translatedValue: c | |
}; | |
l(this, "getPlotLinePath", a, function(a) { | |
c = D(c, b.translate(h, null, null, f)); | |
c = H(c, -1E5, 1E5); | |
k = e = Math.round(c + r); | |
p = E = Math.round(m - c - r); | |
w(c) ? b.horiz ? (p = n, E = m - b.bottom, k = e = q(k, g, g + b.width)) : (k = g, e = L - b.right, p = E = q(p, n, n + b.height)) : (y = !0, x = !1); | |
a.path = y && !x ? null : d.renderer.crispLine(["M", k, p, "L", e, E], t || 1) | |
}); | |
return a.path | |
}, | |
getLinearTickPositions: function(a, b, d) { | |
var g = v(Math.floor(b / a) * a); | |
d = v(Math.ceil(d / a) * a); | |
var n = [], | |
f; | |
v(g + a) === g && (f = 20); | |
if (this.single) return [b]; | |
for (b = g; b <= d;) { | |
n.push(b); | |
b = v(b + a, f); | |
if (b === z) break; | |
var z = b | |
} | |
return n | |
}, | |
getMinorTickInterval: function() { | |
var a = this.options; | |
return !0 === | |
a.minorTicks ? D(a.minorTickInterval, "auto") : !1 === a.minorTicks ? null : a.minorTickInterval | |
}, | |
getMinorTickPositions: function() { | |
var a = this, | |
b = a.options, | |
d = a.tickPositions, | |
g = a.minorTickInterval, | |
f = [], | |
h = a.pointRangePadding || 0, | |
c = a.min - h; | |
h = a.max + h; | |
var t = h - c; | |
if (t && t / g < a.len / 3) | |
if (a.isLog) this.paddedTicks.forEach(function(b, d, n) { | |
d && f.push.apply(f, a.getLogTickPositions(g, n[d - 1], n[d], !0)) | |
}); | |
else if (a.isDatetimeAxis && "auto" === this.getMinorTickInterval()) f = f.concat(a.getTimeTicks(a.normalizeTimeTickInterval(g), c, h, b.startOfWeek)); | |
else | |
for (b = c + (d[0] - c) % g; b <= h && b !== f[0]; b += g) f.push(b); | |
0 !== f.length && a.trimTicks(f); | |
return f | |
}, | |
adjustForMinRange: function() { | |
var a = this.options, | |
b = this.min, | |
d = this.max, | |
g, f, h, c, t; | |
this.isXAxis && "undefined" === typeof this.minRange && !this.isLog && (q(a.min) || q(a.max) ? this.minRange = null : (this.series.forEach(function(a) { | |
c = a.xData; | |
for (f = t = a.xIncrement ? 1 : c.length - 1; 0 < f; f--) | |
if (h = c[f] - c[f - 1], "undefined" === typeof g || h < g) g = h | |
}), this.minRange = Math.min(5 * g, this.dataMax - this.dataMin))); | |
if (d - b < this.minRange) { | |
var l = this.dataMax - | |
this.dataMin >= this.minRange; | |
var x = this.minRange; | |
var k = (x - d + b) / 2; | |
k = [b - k, D(a.min, b - k)]; | |
l && (k[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin); | |
b = I(k); | |
d = [b + x, D(a.max, b + x)]; | |
l && (d[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax); | |
d = G(d); | |
d - b < x && (k[0] = d - x, k[1] = D(a.min, d - x), b = I(k)) | |
} | |
this.min = b; | |
this.max = d | |
}, | |
getClosest: function() { | |
var a; | |
this.categories ? a = 1 : this.series.forEach(function(b) { | |
var d = b.closestPointRange, | |
g = b.visible || !b.chart.options.chart.ignoreHiddenSeries; | |
!b.noSharedTooltip && q(d) && g && (a = | |
q(a) ? Math.min(a, d) : d) | |
}); | |
return a | |
}, | |
nameToX: function(a) { | |
var b = u(this.categories), | |
d = b ? this.categories : this.names, | |
g = a.options.x; | |
a.series.requireSorting = !1; | |
q(g) || (g = !1 === this.options.uniqueNames ? a.series.autoIncrement() : b ? d.indexOf(a.name) : D(d.keys[a.name], -1)); | |
if (-1 === g) { | |
if (!b) var n = d.length | |
} else n = g; | |
"undefined" !== typeof n && (this.names[n] = a.name, this.names.keys[a.name] = n); | |
return n | |
}, | |
updateNames: function() { | |
var a = this, | |
b = this.names; | |
0 < b.length && (Object.keys(b.keys).forEach(function(a) { | |
delete b.keys[a] | |
}), b.length = | |
0, this.minRange = this.userMinRange, (this.series || []).forEach(function(b) { | |
b.xIncrement = null; | |
if (!b.points || b.isDirtyData) a.max = Math.max(a.max, b.xData.length - 1), b.processData(), b.generatePoints(); | |
b.data.forEach(function(d, g) { | |
if (d && d.options && "undefined" !== typeof d.name) { | |
var n = a.nameToX(d); | |
"undefined" !== typeof n && n !== d.x && (d.x = n, b.xData[g] = n) | |
} | |
}) | |
})) | |
}, | |
setAxisTranslation: function(a) { | |
var b = this, | |
d = b.max - b.min, | |
g = b.axisPointRange || 0, | |
n = 0, | |
f = 0, | |
h = b.linkedParent, | |
c = !!b.categories, | |
t = b.transA, | |
x = b.isXAxis; | |
if (x || c || g) { | |
var k = | |
b.getClosest(); | |
h ? (n = h.minPointOffset, f = h.pointRangePadding) : b.series.forEach(function(a) { | |
var d = c ? 1 : x ? D(a.options.pointRange, k, 0) : b.axisPointRange || 0, | |
h = a.options.pointPlacement; | |
g = Math.max(g, d); | |
if (!b.single || c) a = L.xrange && a instanceof L.xrange ? !x : x, n = Math.max(n, a && m(h) ? 0 : d / 2), f = Math.max(f, a && "on" === h ? 0 : d) | |
}); | |
h = b.ordinalSlope && k ? b.ordinalSlope / k : 1; | |
b.minPointOffset = n *= h; | |
b.pointRangePadding = f *= h; | |
b.pointRange = Math.min(g, b.single && c ? 1 : d); | |
x && (b.closestPointRange = k) | |
} | |
a && (b.oldTransA = t); | |
b.translationSlope = b.transA = | |
t = b.staticScale || b.len / (d + f || 1); | |
b.transB = b.horiz ? b.left : b.bottom; | |
b.minPixelPadding = t * n; | |
l(this, "afterSetAxisTranslation") | |
}, | |
minFromRange: function() { | |
return this.max - this.range | |
}, | |
setTickInterval: function(a) { | |
var b = this, | |
d = b.chart, | |
g = b.options, | |
n = b.isLog, | |
f = b.isDatetimeAxis, | |
h = b.isXAxis, | |
x = b.isLinked, | |
k = g.maxPadding, | |
e = g.minPadding, | |
E = g.tickInterval, | |
m = g.tickPixelInterval, | |
L = b.categories, | |
y = w(b.threshold) ? b.threshold : null, | |
r = b.softThreshold; | |
f || L || x || this.getTickAmount(); | |
var A = D(b.userMin, g.min); | |
var u = D(b.userMax, g.max); | |
if (x) { | |
b.linkedParent = d[b.coll][g.linkedTo]; | |
var C = b.linkedParent.getExtremes(); | |
b.min = D(C.min, C.dataMin); | |
b.max = D(C.max, C.dataMax); | |
g.type !== b.linkedParent.options.type && c.error(11, 1, d) | |
} else { | |
if (!r && q(y)) | |
if (b.dataMin >= y) C = y, e = 0; | |
else if (b.dataMax <= y) { | |
var B = y; | |
k = 0 | |
} | |
b.min = D(A, C, b.dataMin); | |
b.max = D(u, B, b.dataMax) | |
} | |
n && (b.positiveValuesOnly && !a && 0 >= Math.min(b.min, D(b.dataMin, b.min)) && c.error(10, 1, d), b.min = v(b.log2lin(b.min), 16), b.max = v(b.log2lin(b.max), 16)); | |
b.range && q(b.max) && (b.userMin = b.min = A = Math.max(b.dataMin, | |
b.minFromRange()), b.userMax = u = b.max, b.range = null); | |
l(b, "foundExtremes"); | |
b.beforePadding && b.beforePadding(); | |
b.adjustForMinRange(); | |
!(L || b.axisPointRange || b.usePercentage || x) && q(b.min) && q(b.max) && (d = b.max - b.min) && (!q(A) && e && (b.min -= d * e), !q(u) && k && (b.max += d * k)); | |
w(b.userMin) || (w(g.softMin) && g.softMin < b.min && (b.min = A = g.softMin), w(g.floor) && (b.min = Math.max(b.min, g.floor))); | |
w(b.userMax) || (w(g.softMax) && g.softMax > b.max && (b.max = u = g.softMax), w(g.ceiling) && (b.max = Math.min(b.max, g.ceiling))); | |
r && q(b.dataMin) && (y = | |
y || 0, !q(A) && b.min < y && b.dataMin >= y ? b.min = b.options.minRange ? Math.min(y, b.max - b.minRange) : y : !q(u) && b.max > y && b.dataMax <= y && (b.max = b.options.minRange ? Math.max(y, b.min + b.minRange) : y)); | |
b.tickInterval = b.min === b.max || "undefined" === typeof b.min || "undefined" === typeof b.max ? 1 : x && !E && m === b.linkedParent.options.tickPixelInterval ? E = b.linkedParent.tickInterval : D(E, this.tickAmount ? (b.max - b.min) / Math.max(this.tickAmount - 1, 1) : void 0, L ? 1 : (b.max - b.min) * m / Math.max(b.len, m)); | |
h && !a && b.series.forEach(function(a) { | |
a.processData(b.min !== | |
b.oldMin || b.max !== b.oldMax) | |
}); | |
b.setAxisTranslation(!0); | |
b.beforeSetTickPositions && b.beforeSetTickPositions(); | |
b.postProcessTickInterval && (b.tickInterval = b.postProcessTickInterval(b.tickInterval)); | |
b.pointRange && !E && (b.tickInterval = Math.max(b.pointRange, b.tickInterval)); | |
a = D(g.minTickInterval, b.isDatetimeAxis && b.closestPointRange); | |
!E && b.tickInterval < a && (b.tickInterval = a); | |
f || n || E || (b.tickInterval = t(b.tickInterval, null, p(b.tickInterval), D(g.allowDecimals, !(.5 < b.tickInterval && 5 > b.tickInterval && 1E3 < b.max && | |
9999 > b.max)), !!this.tickAmount)); | |
this.tickAmount || (b.tickInterval = b.unsquish()); | |
this.setTickPositions() | |
}, | |
setTickPositions: function() { | |
var a = this.options, | |
b = a.tickPositions; | |
var d = this.getMinorTickInterval(); | |
var g = a.tickPositioner, | |
f = a.startOnTick, | |
h = a.endOnTick; | |
this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0; | |
this.minorTickInterval = "auto" === d && this.tickInterval ? this.tickInterval / 5 : d; | |
this.single = this.min === this.max && q(this.min) && !this.tickAmount && (parseInt(this.min, | |
10) === this.min || !1 !== a.allowDecimals); | |
this.tickPositions = d = b && b.slice(); | |
!d && (!this.ordinalPositions && (this.max - this.min) / this.tickInterval > Math.max(2 * this.len, 200) ? (d = [this.min, this.max], c.error(19, !1, this.chart)) : d = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval, | |
this.min, this.max), d.length > this.len && (d = [d[0], d.pop()], d[0] === d[1] && (d.length = 1)), this.tickPositions = d, g && (g = g.apply(this, [this.min, this.max]))) && (this.tickPositions = d = g); | |
this.paddedTicks = d.slice(0); | |
this.trimTicks(d, f, h); | |
this.isLinked || (this.single && 2 > d.length && !this.categories && (this.min -= .5, this.max += .5), b || g || this.adjustTickAmount()); | |
l(this, "afterSetTickPositions") | |
}, | |
trimTicks: function(a, b, d) { | |
var g = a[0], | |
n = a[a.length - 1], | |
f = this.minPointOffset || 0; | |
l(this, "trimTicks"); | |
if (!this.isLinked) { | |
if (b && -Infinity !== | |
g) this.min = g; | |
else | |
for (; this.min - f > a[0];) a.shift(); | |
if (d) this.max = n; | |
else | |
for (; this.max + f < a[a.length - 1];) a.pop(); | |
0 === a.length && q(g) && !this.options.tickPositions && a.push((n + g) / 2) | |
} | |
}, | |
alignToOthers: function() { | |
var a = {}, | |
b, d = this.options; | |
!1 === this.chart.options.chart.alignTicks || !1 === d.alignTicks || !1 === d.startOnTick || !1 === d.endOnTick || this.isLog || this.chart[this.coll].forEach(function(d) { | |
var g = d.options; | |
g = [d.horiz ? g.left : g.top, g.width, g.height, g.pane].join(); | |
d.series.length && (a[g] ? b = !0 : a[g] = 1) | |
}); | |
return b | |
}, | |
getTickAmount: function() { | |
var a = this.options, | |
b = a.tickAmount, | |
d = a.tickPixelInterval; | |
!q(a.tickInterval) && this.len < d && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b = 2); | |
!b && this.alignToOthers() && (b = Math.ceil(this.len / d) + 1); | |
4 > b && (this.finalTickAmt = b, b = 5); | |
this.tickAmount = b | |
}, | |
adjustTickAmount: function() { | |
var a = this.options, | |
b = this.tickInterval, | |
d = this.tickPositions, | |
g = this.tickAmount, | |
f = this.finalTickAmt, | |
h = d && d.length, | |
c = D(this.threshold, this.softThreshold ? 0 : null), | |
t; | |
if (this.hasData()) { | |
if (h < g) { | |
for (t = | |
this.min; d.length < g;) d.length % 2 || t === c ? d.push(v(d[d.length - 1] + b)) : d.unshift(v(d[0] - b)); | |
this.transA *= (h - 1) / (g - 1); | |
this.min = a.startOnTick ? d[0] : Math.min(this.min, d[0]); | |
this.max = a.endOnTick ? d[d.length - 1] : Math.max(this.max, d[d.length - 1]) | |
} else h > g && (this.tickInterval *= 2, this.setTickPositions()); | |
if (q(f)) { | |
for (b = a = d.length; b--;)(3 === f && 1 === b % 2 || 2 >= f && 0 < b && b < a - 1) && d.splice(b, 1); | |
this.finalTickAmt = void 0 | |
} | |
} | |
}, | |
setScale: function() { | |
var a = this.series.some(function(a) { | |
return a.isDirtyData || a.isDirty || a.xAxis && a.xAxis.isDirty | |
}), | |
b; | |
this.oldMin = this.min; | |
this.oldMax = this.max; | |
this.oldAxisLength = this.len; | |
this.setAxisSize(); | |
(b = this.len !== this.oldAxisLength) || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty || (this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && | |
this.cleanStacks(); | |
l(this, "afterSetScale") | |
}, | |
setExtremes: function(a, b, d, g, f) { | |
var n = this, | |
h = n.chart; | |
d = D(d, !0); | |
n.series.forEach(function(a) { | |
delete a.kdTree | |
}); | |
f = B(f, { | |
min: a, | |
max: b | |
}); | |
l(n, "setExtremes", f, function() { | |
n.userMin = a; | |
n.userMax = b; | |
n.eventArgs = f; | |
d && h.redraw(g) | |
}) | |
}, | |
zoom: function(a, b) { | |
var d = this.dataMin, | |
g = this.dataMax, | |
n = this.options, | |
f = Math.min(d, D(n.min, d)), | |
h = Math.max(g, D(n.max, g)); | |
a = { | |
newMin: a, | |
newMax: b | |
}; | |
l(this, "zoom", a, function(a) { | |
var b = a.newMin, | |
n = a.newMax; | |
if (b !== this.min || n !== this.max) this.allowZoomOutside || | |
(q(d) && (b < f && (b = f), b > h && (b = h)), q(g) && (n < f && (n = f), n > h && (n = h))), this.displayBtn = "undefined" !== typeof b || "undefined" !== typeof n, this.setExtremes(b, n, !1, void 0, { | |
trigger: "zoom" | |
}); | |
a.zoomed = !0 | |
}); | |
return a.zoomed | |
}, | |
setAxisSize: function() { | |
var a = this.chart, | |
b = this.options, | |
d = b.offsets || [0, 0, 0, 0], | |
g = this.horiz, | |
f = this.width = Math.round(A(D(b.width, a.plotWidth - d[3] + d[1]), a.plotWidth)), | |
h = this.height = Math.round(A(D(b.height, a.plotHeight - d[0] + d[2]), a.plotHeight)), | |
c = this.top = Math.round(A(D(b.top, a.plotTop + d[0]), a.plotHeight, | |
a.plotTop)); | |
b = this.left = Math.round(A(D(b.left, a.plotLeft + d[3]), a.plotWidth, a.plotLeft)); | |
this.bottom = a.chartHeight - h - c; | |
this.right = a.chartWidth - f - b; | |
this.len = Math.max(g ? f : h, 0); | |
this.pos = g ? b : c | |
}, | |
getExtremes: function() { | |
var a = this.isLog; | |
return { | |
min: a ? v(this.lin2log(this.min)) : this.min, | |
max: a ? v(this.lin2log(this.max)) : this.max, | |
dataMin: this.dataMin, | |
dataMax: this.dataMax, | |
userMin: this.userMin, | |
userMax: this.userMax | |
} | |
}, | |
getThreshold: function(a) { | |
var b = this.isLog, | |
d = b ? this.lin2log(this.min) : this.min; | |
b = b ? this.lin2log(this.max) : | |
this.max; | |
null === a || -Infinity === a ? a = d : Infinity === a ? a = b : d > a ? a = d : b < a && (a = b); | |
return this.translate(a, 0, 1, 0, 1) | |
}, | |
autoLabelAlign: function(a) { | |
var b = (D(a, 0) - 90 * this.side + 720) % 360; | |
a = { | |
align: "center" | |
}; | |
l(this, "autoLabelAlign", a, function(a) { | |
15 < b && 165 > b ? a.align = "right" : 195 < b && 345 > b && (a.align = "left") | |
}); | |
return a.align | |
}, | |
tickSize: function(a) { | |
var b = this.options, | |
d = b[a + "Length"], | |
g = D(b[a + "Width"], "tick" === a && this.isXAxis && !this.categories ? 1 : 0); | |
if (g && d) { | |
"inside" === b[a + "Position"] && (d = -d); | |
var f = [d, g] | |
} | |
a = { | |
tickSize: f | |
}; | |
l(this, | |
"afterTickSize", a); | |
return a.tickSize | |
}, | |
labelMetrics: function() { | |
var a = this.tickPositions && this.tickPositions[0] || 0; | |
return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize, this.ticks[a] && this.ticks[a].label) | |
}, | |
unsquish: function() { | |
var a = this.options.labels, | |
b = this.horiz, | |
d = this.tickInterval, | |
g = d, | |
f = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / d), | |
h, c = a.rotation, | |
t = this.labelMetrics(), | |
l, x = Number.MAX_VALUE, | |
p, e = this.max - this.min, | |
E = function(a) { | |
var b = a / (f || 1); | |
b = | |
1 < b ? Math.ceil(b) : 1; | |
b * d > e && Infinity !== a && Infinity !== f && e && (b = Math.ceil(e / d)); | |
return v(b * d) | |
}; | |
b ? (p = !a.staggerLines && !a.step && (q(c) ? [c] : f < D(a.autoRotationLimit, 80) && a.autoRotation)) && p.forEach(function(a) { | |
if (a === c || a && -90 <= a && 90 >= a) { | |
l = E(Math.abs(t.h / Math.sin(k * a))); | |
var b = l + Math.abs(a / 360); | |
b < x && (x = b, h = a, g = l) | |
} | |
}) : a.step || (g = E(t.h)); | |
this.autoRotation = p; | |
this.labelRotation = D(h, c); | |
return g | |
}, | |
getSlotWidth: function(a) { | |
var b = this.chart, | |
d = this.horiz, | |
g = this.options.labels, | |
f = Math.max(this.tickPositions.length - (this.categories ? | |
0 : 1), 1), | |
n = b.margin[3]; | |
return a && a.slotWidth || d && 2 > (g.step || 0) && !g.rotation && (this.staggerLines || 1) * this.len / f || !d && (g.style && parseInt(g.style.width, 10) || n && n - b.spacing[3] || .33 * b.chartWidth) | |
}, | |
renderUnsquish: function() { | |
var a = this.chart, | |
b = a.renderer, | |
d = this.tickPositions, | |
g = this.ticks, | |
f = this.options.labels, | |
h = f && f.style || {}, | |
c = this.horiz, | |
t = this.getSlotWidth(), | |
l = Math.max(1, Math.round(t - 2 * (f.padding || 5))), | |
x = {}, | |
k = this.labelMetrics(), | |
p = f.style && f.style.textOverflow, | |
e = 0; | |
m(f.rotation) || (x.rotation = f.rotation || | |
0); | |
d.forEach(function(a) { | |
a = g[a]; | |
a.movedLabel && a.replaceMovedLabel(); | |
a && a.label && a.label.textPxLength > e && (e = a.label.textPxLength) | |
}); | |
this.maxLabelLength = e; | |
if (this.autoRotation) e > l && e > k.h ? x.rotation = this.labelRotation : this.labelRotation = 0; | |
else if (t) { | |
var E = l; | |
if (!p) { | |
var L = "clip"; | |
for (l = d.length; !c && l--;) { | |
var y = d[l]; | |
if (y = g[y].label) y.styles && "ellipsis" === y.styles.textOverflow ? y.css({ | |
textOverflow: "clip" | |
}) : y.textPxLength > t && y.css({ | |
width: t + "px" | |
}), y.getBBox().height > this.len / d.length - (k.h - k.f) && (y.specificTextOverflow = | |
"ellipsis") | |
} | |
} | |
} | |
x.rotation && (E = e > .5 * a.chartHeight ? .33 * a.chartHeight : e, p || (L = "ellipsis")); | |
if (this.labelAlign = f.align || this.autoLabelAlign(this.labelRotation)) x.align = this.labelAlign; | |
d.forEach(function(a) { | |
var b = (a = g[a]) && a.label, | |
d = h.width, | |
f = {}; | |
b && (b.attr(x), a.shortenLabel ? a.shortenLabel() : E && !d && "nowrap" !== h.whiteSpace && (E < b.textPxLength || "SPAN" === b.element.tagName) ? (f.width = E, p || (f.textOverflow = b.specificTextOverflow || L), b.css(f)) : b.styles && b.styles.width && !f.width && !d && b.css({ | |
width: null | |
}), delete b.specificTextOverflow, | |
a.rotation = x.rotation) | |
}, this); | |
this.tickRotCorr = b.rotCorr(k.b, this.labelRotation || 0, 0 !== this.side) | |
}, | |
hasData: function() { | |
return this.series.some(function(a) { | |
return a.hasData() | |
}) || this.options.showEmpty && q(this.min) && q(this.max) | |
}, | |
addTitle: function(a) { | |
var b = this.chart.renderer, | |
d = this.horiz, | |
f = this.opposite, | |
h = this.options.title, | |
n, c = this.chart.styledMode; | |
this.axisTitle || ((n = h.textAlign) || (n = (d ? { | |
low: "left", | |
middle: "center", | |
high: "right" | |
} : { | |
low: f ? "right" : "left", | |
middle: "center", | |
high: f ? "left" : "right" | |
})[h.align]), | |
this.axisTitle = b.text(h.text, 0, 0, h.useHTML).attr({ | |
zIndex: 7, | |
rotation: h.rotation || 0, | |
align: n | |
}).addClass("highcharts-axis-title"), c || this.axisTitle.css(g(h.style)), this.axisTitle.add(this.axisGroup), this.axisTitle.isNew = !0); | |
c || h.style.width || this.isRadial || this.axisTitle.css({ | |
width: this.len | |
}); | |
this.axisTitle[a ? "show" : "hide"](a) | |
}, | |
generateTick: function(a) { | |
var b = this.ticks; | |
b[a] ? b[a].addLabel() : b[a] = new E(this, a) | |
}, | |
getOffset: function() { | |
var a = this, | |
b = a.chart, | |
d = b.renderer, | |
g = a.options, | |
f = a.tickPositions, | |
h = a.ticks, | |
c = a.horiz, | |
t = a.side, | |
x = b.inverted && !a.isZAxis ? [1, 0, 3, 2][t] : t, | |
k, p = 0, | |
e = 0, | |
E = g.title, | |
m = g.labels, | |
L = 0, | |
y = b.axisOffset; | |
b = b.clipOffset; | |
var A = [-1, 1, 1, -1][t], | |
u = g.className, | |
v = a.axisParent; | |
var w = a.hasData(); | |
a.showAxis = k = w || D(g.showEmpty, !0); | |
a.staggerLines = a.horiz && m.staggerLines; | |
a.axisGroup || (a.gridGroup = d.g("grid").attr({ | |
zIndex: g.gridZIndex || 1 | |
}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (u || "")).add(v), a.axisGroup = d.g("axis").attr({ | |
zIndex: g.zIndex || 2 | |
}).addClass("highcharts-" + this.coll.toLowerCase() + | |
" " + (u || "")).add(v), a.labelGroup = d.g("axis-labels").attr({ | |
zIndex: m.zIndex || 7 | |
}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (u || "")).add(v)); | |
w || a.isLinked ? (f.forEach(function(b, d) { | |
a.generateTick(b, d) | |
}), a.renderUnsquish(), a.reserveSpaceDefault = 0 === t || 2 === t || { | |
1: "left", | |
3: "right" | |
}[t] === a.labelAlign, D(m.reserveSpace, "center" === a.labelAlign ? !0 : null, a.reserveSpaceDefault) && f.forEach(function(a) { | |
L = Math.max(h[a].getLabelSize(), L) | |
}), a.staggerLines && (L *= a.staggerLines), a.labelOffset = L * (a.opposite ? | |
-1 : 1)) : r(h, function(a, b) { | |
a.destroy(); | |
delete h[b] | |
}); | |
if (E && E.text && !1 !== E.enabled && (a.addTitle(k), k && !1 !== E.reserveSpace)) { | |
a.titleOffset = p = a.axisTitle.getBBox()[c ? "height" : "width"]; | |
var C = E.offset; | |
e = q(C) ? 0 : D(E.margin, c ? 5 : 10) | |
} | |
a.renderLine(); | |
a.offset = A * D(g.offset, y[t] ? y[t] + (g.margin || 0) : 0); | |
a.tickRotCorr = a.tickRotCorr || { | |
x: 0, | |
y: 0 | |
}; | |
d = 0 === t ? -a.labelMetrics().h : 2 === t ? a.tickRotCorr.y : 0; | |
e = Math.abs(L) + e; | |
L && (e = e - d + A * (c ? D(m.y, a.tickRotCorr.y + 8 * A) : m.x)); | |
a.axisTitleMargin = D(C, e); | |
a.getMaxLabelDimensions && (a.maxLabelDimensions = | |
a.getMaxLabelDimensions(h, f)); | |
c = this.tickSize("tick"); | |
y[t] = Math.max(y[t], a.axisTitleMargin + p + A * a.offset, e, f && f.length && c ? c[0] + A * a.offset : 0); | |
g = g.offset ? 0 : 2 * Math.floor(a.axisLine.strokeWidth() / 2); | |
b[x] = Math.max(b[x], g); | |
l(this, "afterGetOffset") | |
}, | |
getLinePath: function(a) { | |
var b = this.chart, | |
d = this.opposite, | |
g = this.offset, | |
f = this.horiz, | |
h = this.left + (d ? this.width : 0) + g; | |
g = b.chartHeight - this.bottom - (d ? this.height : 0) + g; | |
d && (a *= -1); | |
return b.renderer.crispLine(["M", f ? this.left : h, f ? g : this.top, "L", f ? b.chartWidth - this.right : | |
h, f ? g : b.chartHeight - this.bottom | |
], a) | |
}, | |
renderLine: function() { | |
this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.chart.styledMode || this.axisLine.attr({ | |
stroke: this.options.lineColor, | |
"stroke-width": this.options.lineWidth, | |
zIndex: 7 | |
})) | |
}, | |
getTitlePosition: function() { | |
var a = this.horiz, | |
b = this.left, | |
d = this.top, | |
g = this.len, | |
f = this.options.title, | |
h = a ? b : d, | |
c = this.opposite, | |
t = this.offset, | |
x = f.x || 0, | |
k = f.y || 0, | |
p = this.axisTitle, | |
e = this.chart.renderer.fontMetrics(f.style && | |
f.style.fontSize, p); | |
p = Math.max(p.getBBox(null, 0).height - e.h - 1, 0); | |
g = { | |
low: h + (a ? 0 : g), | |
middle: h + g / 2, | |
high: h + (a ? g : 0) | |
}[f.align]; | |
b = (a ? d + this.height : b) + (a ? 1 : -1) * (c ? -1 : 1) * this.axisTitleMargin + [-p, p, e.f, -p][this.side]; | |
a = { | |
x: a ? g + x : b + (c ? this.width : 0) + t + x, | |
y: a ? b + k - (c ? this.height : 0) + t : g + k | |
}; | |
l(this, "afterGetTitlePosition", { | |
titlePosition: a | |
}); | |
return a | |
}, | |
renderMinorTick: function(a) { | |
var b = this.chart.hasRendered && w(this.oldMin), | |
d = this.minorTicks; | |
d[a] || (d[a] = new E(this, a, "minor")); | |
b && d[a].isNew && d[a].render(null, !0); | |
d[a].render(null, !1, 1) | |
}, | |
renderTick: function(a, b) { | |
var d = this.isLinked, | |
g = this.ticks, | |
f = this.chart.hasRendered && w(this.oldMin); | |
if (!d || a >= this.min && a <= this.max) g[a] || (g[a] = new E(this, a)), f && g[a].isNew && g[a].render(b, !0, -1), g[a].render(b) | |
}, | |
render: function() { | |
var a = this, | |
d = a.chart, | |
g = a.options, | |
f = a.isLog, | |
h = a.isLinked, | |
t = a.tickPositions, | |
x = a.axisTitle, | |
k = a.ticks, | |
p = a.minorTicks, | |
e = a.alternateBands, | |
m = g.stackLabels, | |
L = g.alternateGridColor, | |
y = a.tickmarkOffset, | |
q = a.axisLine, | |
A = a.showAxis, | |
u = F(d.renderer.globalAnimation), | |
D, v; | |
a.labelEdge.length = | |
0; | |
a.overlap = !1; | |
[k, p, e].forEach(function(a) { | |
r(a, function(a) { | |
a.isActive = !1 | |
}) | |
}); | |
if (a.hasData() || h) a.minorTickInterval && !a.categories && a.getMinorTickPositions().forEach(function(b) { | |
a.renderMinorTick(b) | |
}), t.length && (t.forEach(function(b, d) { | |
a.renderTick(b, d) | |
}), y && (0 === a.min || a.single) && (k[-1] || (k[-1] = new E(a, -1, null, !0)), k[-1].render(-1))), L && t.forEach(function(b, g) { | |
v = "undefined" !== typeof t[g + 1] ? t[g + 1] + y : a.max - y; | |
0 === g % 2 && b < a.max && v <= a.max + (d.polar ? -y : y) && (e[b] || (e[b] = new c.PlotLineOrBand(a)), D = b + y, e[b].options = { | |
from: f ? a.lin2log(D) : D, | |
to: f ? a.lin2log(v) : v, | |
color: L | |
}, e[b].render(), e[b].isActive = !0) | |
}), a._addedPlotLB || ((g.plotLines || []).concat(g.plotBands || []).forEach(function(b) { | |
a.addPlotBandOrLine(b) | |
}), a._addedPlotLB = !0); | |
[k, p, e].forEach(function(a) { | |
var g, f = [], | |
h = u.duration; | |
r(a, function(a, b) { | |
a.isActive || (a.render(b, !1, 0), a.isActive = !1, f.push(b)) | |
}); | |
b(function() { | |
for (g = f.length; g--;) a[f[g]] && !a[f[g]].isActive && (a[f[g]].destroy(), delete a[f[g]]) | |
}, a !== e && d.hasRendered && h ? h : 0) | |
}); | |
q && (q[q.isPlaced ? "animate" : "attr"]({ | |
d: this.getLinePath(q.strokeWidth()) | |
}), | |
q.isPlaced = !0, q[A ? "show" : "hide"](A)); | |
x && A && (g = a.getTitlePosition(), w(g.y) ? (x[x.isNew ? "attr" : "animate"](g), x.isNew = !1) : (x.attr("y", -9999), x.isNew = !0)); | |
m && m.enabled && a.renderStackTotals(); | |
a.isDirty = !1; | |
l(this, "afterRender") | |
}, | |
redraw: function() { | |
this.visible && (this.render(), this.plotLinesAndBands.forEach(function(a) { | |
a.render() | |
})); | |
this.series.forEach(function(a) { | |
a.isDirty = !0 | |
}) | |
}, | |
keepProps: "extKey hcEvents names series userMax userMin".split(" "), | |
destroy: function(a) { | |
var b = this, | |
d = b.stacks, | |
g = b.plotLinesAndBands, | |
f; | |
l(this, "destroy", { | |
keepEvents: a | |
}); | |
a || x(b); | |
r(d, function(a, b) { | |
C(a); | |
d[b] = null | |
}); | |
[b.ticks, b.minorTicks, b.alternateBands].forEach(function(a) { | |
C(a) | |
}); | |
if (g) | |
for (a = g.length; a--;) g[a].destroy(); | |
"stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(a) { | |
b[a] && (b[a] = b[a].destroy()) | |
}); | |
for (f in b.plotLinesAndBandsGroups) b.plotLinesAndBandsGroups[f] = b.plotLinesAndBandsGroups[f].destroy(); | |
r(b, function(a, d) { | |
-1 === b.keepProps.indexOf(d) && delete b[d] | |
}) | |
}, | |
drawCrosshair: function(a, | |
b) { | |
var g = this.crosshair, | |
f = D(g.snap, !0), | |
h, c = this.cross; | |
l(this, "drawCrosshair", { | |
e: a, | |
point: b | |
}); | |
a || (a = this.cross && this.cross.e); | |
if (this.crosshair && !1 !== (q(b) || !f)) { | |
f ? q(b) && (h = D("colorAxis" !== this.coll ? b.crosshairPos : null, this.isXAxis ? b.plotX : this.len - b.plotY)) : h = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos); | |
if (q(h)) { | |
var t = { | |
value: b && (this.isXAxis ? b.x : D(b.stackY, b.y)), | |
translatedValue: h | |
}; | |
this.chart.polar && B(t, { | |
isCrosshair: !0, | |
chartX: a && a.chartX, | |
chartY: a && a.chartY, | |
point: b | |
}); | |
t = this.getPlotLinePath(t) || | |
null | |
} | |
if (!q(t)) { | |
this.hideCrosshair(); | |
return | |
} | |
f = this.categories && !this.isRadial; | |
c || (this.cross = c = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (f ? "category " : "thin ") + g.className).attr({ | |
zIndex: D(g.zIndex, 2) | |
}).add(), this.chart.styledMode || (c.attr({ | |
stroke: g.color || (f ? d("#ccd6eb").setOpacity(.25).get() : "#cccccc"), | |
"stroke-width": D(g.width, 1) | |
}).css({ | |
"pointer-events": "none" | |
}), g.dashStyle && c.attr({ | |
dashstyle: g.dashStyle | |
}))); | |
c.show().attr({ | |
d: t | |
}); | |
f && !g.width && c.attr({ | |
"stroke-width": this.transA | |
}); | |
this.cross.e = a | |
} else this.hideCrosshair(); | |
l(this, "afterDrawCrosshair", { | |
e: a, | |
point: b | |
}) | |
}, | |
hideCrosshair: function() { | |
this.cross && this.cross.hide(); | |
l(this, "afterHideCrosshair") | |
} | |
}); | |
return c.Axis = e | |
}); | |
M(J, "parts/DateTimeAxis.js", [J["parts/Globals.js"]], function(c) { | |
var e = c.Axis, | |
F = c.getMagnitude, | |
I = c.normalizeTickInterval, | |
G = c.timeUnits; | |
e.prototype.getTimeTicks = function() { | |
return this.chart.time.getTimeTicks.apply(this.chart.time, arguments) | |
}; | |
e.prototype.normalizeTimeTickInterval = function(c, e) { | |
var q = e || [ | |
["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]], | |
["second", [1, 2, 5, 10, 15, 30]], | |
["minute", [1, 2, 5, 10, 15, 30]], | |
["hour", [1, 2, 3, 4, 6, 8, 12]], | |
["day", [1, 2]], | |
["week", [1, 2]], | |
["month", [1, 2, 3, 4, 6]], | |
["year", null] | |
]; | |
e = q[q.length - 1]; | |
var v = G[e[0]], | |
B = e[1], | |
u; | |
for (u = 0; u < q.length && !(e = q[u], v = G[e[0]], B = e[1], q[u + 1] && c <= (v * B[B.length - 1] + G[q[u + 1][0]]) / 2); u++); | |
v === G.year && c < 5 * v && (B = [1, 2, 5]); | |
c = I(c / v, B, "year" === e[0] ? Math.max(F(c / v), 1) : 1); | |
return { | |
unitRange: v, | |
count: c, | |
unitName: e[0] | |
} | |
} | |
}); | |
M(J, "parts/LogarithmicAxis.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], | |
function(c, e) { | |
var F = e.pick; | |
e = c.Axis; | |
var I = c.getMagnitude, | |
G = c.normalizeTickInterval; | |
e.prototype.getLogTickPositions = function(c, e, q, C) { | |
var v = this.options, | |
u = this.len, | |
w = []; | |
C || (this._minorAutoInterval = null); | |
if (.5 <= c) c = Math.round(c), w = this.getLinearTickPositions(c, e, q); | |
else if (.08 <= c) { | |
u = Math.floor(e); | |
var m, r; | |
for (v = .3 < c ? [1, 2, 4] : .15 < c ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; u < q + 1 && !r; u++) { | |
var D = v.length; | |
for (m = 0; m < D && !r; m++) { | |
var A = this.log2lin(this.lin2log(u) * v[m]); | |
A > e && (!C || f <= q) && "undefined" !== typeof f && w.push(f); | |
f > q && (r = !0); | |
var f = A | |
} | |
} | |
} else e = this.lin2log(e), q = this.lin2log(q), c = C ? this.getMinorTickInterval() : v.tickInterval, c = F("auto" === c ? null : c, this._minorAutoInterval, v.tickPixelInterval / (C ? 5 : 1) * (q - e) / ((C ? u / this.tickPositions.length : u) || 1)), c = G(c, null, I(c)), w = this.getLinearTickPositions(c, e, q).map(this.log2lin), C || (this._minorAutoInterval = c / 5); | |
C || (this.tickInterval = c); | |
return w | |
}; | |
e.prototype.log2lin = function(c) { | |
return Math.log(c) / Math.LN10 | |
}; | |
e.prototype.lin2log = function(c) { | |
return Math.pow(10, c) | |
} | |
}); | |
M(J, "parts/PlotLineOrBand.js", [J["parts/Globals.js"], J["parts/Axis.js"], J["parts/Utilities.js"]], function(c, e, F) { | |
var I = F.arrayMax, | |
G = F.arrayMin, | |
H = F.defined, | |
v = F.destroyObjectProperties, | |
q = F.erase, | |
C = F.extend, | |
B = F.objectEach, | |
u = F.pick, | |
w = c.merge; | |
c.PlotLineOrBand = function(c, e) { | |
this.axis = c; | |
e && (this.options = e, this.id = e.id) | |
}; | |
c.PlotLineOrBand.prototype = { | |
render: function() { | |
c.fireEvent(this, "render"); | |
var e = this, | |
r = e.axis, | |
q = r.horiz, | |
A = e.options, | |
f = A.label, | |
b = e.label, | |
a = A.to, | |
d = A.from, | |
h = A.value, | |
k = H(d) && H(a), | |
l = H(h), | |
y = e.svgElem, | |
p = !y, | |
g = [], | |
t = A.color, | |
x = u(A.zIndex, | |
0), | |
L = A.events; | |
g = { | |
"class": "highcharts-plot-" + (k ? "band " : "line ") + (A.className || "") | |
}; | |
var E = {}, | |
n = r.chart.renderer, | |
z = k ? "bands" : "lines"; | |
r.isLog && (d = r.log2lin(d), a = r.log2lin(a), h = r.log2lin(h)); | |
r.chart.styledMode || (l ? (g.stroke = t || "#999999", g["stroke-width"] = u(A.width, 1), A.dashStyle && (g.dashstyle = A.dashStyle)) : k && (g.fill = t || "#e6ebf5", A.borderWidth && (g.stroke = A.borderColor, g["stroke-width"] = A.borderWidth))); | |
E.zIndex = x; | |
z += "-" + x; | |
(t = r.plotLinesAndBandsGroups[z]) || (r.plotLinesAndBandsGroups[z] = t = n.g("plot-" + z).attr(E).add()); | |
p && (e.svgElem = y = n.path().attr(g).add(t)); | |
if (l) g = r.getPlotLinePath({ | |
value: h, | |
lineWidth: y.strokeWidth(), | |
acrossPanes: A.acrossPanes | |
}); | |
else if (k) g = r.getPlotBandPath(d, a, A); | |
else return; | |
(p || !y.d) && g && g.length ? (y.attr({ | |
d: g | |
}), L && B(L, function(a, b) { | |
y.on(b, function(a) { | |
L[b].apply(e, [a]) | |
}) | |
})) : y && (g ? (y.show(!0), y.animate({ | |
d: g | |
})) : y.d && (y.hide(), b && (e.label = b = b.destroy()))); | |
f && (H(f.text) || H(f.formatter)) && g && g.length && 0 < r.width && 0 < r.height && !g.isFlat ? (f = w({ | |
align: q && k && "center", | |
x: q ? !k && 4 : 10, | |
verticalAlign: !q && k && "middle", | |
y: q ? k ? 16 : 10 : k ? 6 : -4, | |
rotation: q && !k && 90 | |
}, f), this.renderLabel(f, g, k, x)) : b && b.hide(); | |
return e | |
}, | |
renderLabel: function(c, e, q, A) { | |
var f = this.label, | |
b = this.axis.chart.renderer; | |
f || (f = { | |
align: c.textAlign || c.align, | |
rotation: c.rotation, | |
"class": "highcharts-plot-" + (q ? "band" : "line") + "-label " + (c.className || "") | |
}, f.zIndex = A, A = this.getLabelText(c), this.label = f = b.text(A, 0, 0, c.useHTML).attr(f).add(), this.axis.chart.styledMode || f.css(c.style)); | |
b = e.xBounds || [e[1], e[4], q ? e[6] : e[1]]; | |
e = e.yBounds || [e[2], e[5], q ? e[7] : e[2]]; | |
q = G(b); | |
A = G(e); | |
f.align(c, !1, { | |
x: q, | |
y: A, | |
width: I(b) - q, | |
height: I(e) - A | |
}); | |
f.show(!0) | |
}, | |
getLabelText: function(c) { | |
return H(c.formatter) ? c.formatter.call(this) : c.text | |
}, | |
destroy: function() { | |
q(this.axis.plotLinesAndBands, this); | |
delete this.axis; | |
v(this) | |
} | |
}; | |
C(e.prototype, { | |
getPlotBandPath: function(c, e) { | |
var m = this.getPlotLinePath({ | |
value: e, | |
force: !0, | |
acrossPanes: this.options.acrossPanes | |
}), | |
r = this.getPlotLinePath({ | |
value: c, | |
force: !0, | |
acrossPanes: this.options.acrossPanes | |
}), | |
f = [], | |
b = this.horiz, | |
a = 1; | |
c = c < this.min && e < this.min || c > this.max && e > | |
this.max; | |
if (r && m) { | |
if (c) { | |
var d = r.toString() === m.toString(); | |
a = 0 | |
} | |
for (c = 0; c < r.length; c += 6) b && m[c + 1] === r[c + 1] ? (m[c + 1] += a, m[c + 4] += a) : b || m[c + 2] !== r[c + 2] || (m[c + 2] += a, m[c + 5] += a), f.push("M", r[c + 1], r[c + 2], "L", r[c + 4], r[c + 5], m[c + 4], m[c + 5], m[c + 1], m[c + 2], "z"), f.isFlat = d | |
} | |
return f | |
}, | |
addPlotBand: function(c) { | |
return this.addPlotBandOrLine(c, "plotBands") | |
}, | |
addPlotLine: function(c) { | |
return this.addPlotBandOrLine(c, "plotLines") | |
}, | |
addPlotBandOrLine: function(e, r) { | |
var m = (new c.PlotLineOrBand(this, e)).render(), | |
q = this.userOptions; | |
if (m) { | |
if (r) { | |
var f = q[r] || []; | |
f.push(e); | |
q[r] = f | |
} | |
this.plotLinesAndBands.push(m) | |
} | |
return m | |
}, | |
removePlotBandOrLine: function(c) { | |
for (var e = this.plotLinesAndBands, m = this.options, A = this.userOptions, f = e.length; f--;) e[f].id === c && e[f].destroy(); | |
[m.plotLines || [], A.plotLines || [], m.plotBands || [], A.plotBands || []].forEach(function(b) { | |
for (f = b.length; f--;) b[f].id === c && q(b, b[f]) | |
}) | |
}, | |
removePlotBand: function(c) { | |
this.removePlotBandOrLine(c) | |
}, | |
removePlotLine: function(c) { | |
this.removePlotBandOrLine(c) | |
} | |
}) | |
}); | |
M(J, "parts/Tooltip.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.clamp, | |
I = e.defined, | |
G = e.discardElement, | |
H = e.extend, | |
v = e.isNumber, | |
q = e.isString, | |
C = e.pick, | |
B = e.splat, | |
u = e.syncTimeout; | |
""; | |
var w = c.doc, | |
m = c.format, | |
r = c.merge, | |
D = c.timeUnits; | |
c.Tooltip = function() { | |
this.init.apply(this, arguments) | |
}; | |
c.Tooltip.prototype = { | |
init: function(c, f) { | |
this.chart = c; | |
this.options = f; | |
this.crosshairs = []; | |
this.now = { | |
x: 0, | |
y: 0 | |
}; | |
this.isHidden = !0; | |
this.split = f.split && !c.inverted && !c.polar; | |
this.shared = f.shared || this.split; | |
this.outside = C(f.outside, !(!c.scrollablePixelsX && !c.scrollablePixelsY)) | |
}, | |
cleanSplit: function(c) { | |
this.chart.series.forEach(function(f) { | |
var b = f && f.tt; | |
b && (!b.isActive || c ? f.tt = b.destroy() : b.isActive = !1) | |
}) | |
}, | |
applyFilter: function() { | |
var c = this.chart; | |
c.renderer.definition({ | |
tagName: "filter", | |
id: "drop-shadow-" + c.index, | |
opacity: .5, | |
children: [{ | |
tagName: "feGaussianBlur", | |
"in": "SourceAlpha", | |
stdDeviation: 1 | |
}, { | |
tagName: "feOffset", | |
dx: 1, | |
dy: 1 | |
}, { | |
tagName: "feComponentTransfer", | |
children: [{ | |
tagName: "feFuncA", | |
type: "linear", | |
slope: .3 | |
}] | |
}, { | |
tagName: "feMerge", | |
children: [{ | |
tagName: "feMergeNode" | |
}, { | |
tagName: "feMergeNode", | |
"in": "SourceGraphic" | |
}] | |
}] | |
}); | |
c.renderer.definition({ | |
tagName: "style", | |
textContent: ".highcharts-tooltip-" + c.index + "{filter:url(#drop-shadow-" + c.index + ")}" | |
}) | |
}, | |
getLabel: function() { | |
var e = this, | |
f = this.chart.renderer, | |
b = this.chart.styledMode, | |
a = this.options, | |
d = "tooltip" + (I(a.className) ? " " + a.className : ""), | |
h; | |
if (!this.label) { | |
this.outside && (this.container = h = c.doc.createElement("div"), h.className = "highcharts-tooltip-container", c.css(h, { | |
position: "absolute", | |
top: "1px", | |
pointerEvents: a.style && a.style.pointerEvents, | |
zIndex: 3 | |
}), c.doc.body.appendChild(h), this.renderer = f = new c.Renderer(h, 0, 0, {}, void 0, void 0, f.styledMode)); | |
this.split ? this.label = f.g(d) : (this.label = f.label("", 0, 0, a.shape || "callout", null, null, a.useHTML, null, d).attr({ | |
padding: a.padding, | |
r: a.borderRadius | |
}), b || this.label.attr({ | |
fill: a.backgroundColor, | |
"stroke-width": a.borderWidth | |
}).css(a.style).shadow(a.shadow)); | |
b && (this.applyFilter(), this.label.addClass("highcharts-tooltip-" + this.chart.index)); | |
if (e.outside && !e.split) { | |
var k = { | |
x: this.label.xSetter, | |
y: this.label.ySetter | |
}; | |
this.label.xSetter = function(a, b) { | |
k[b].call(this.label, e.distance); | |
h.style.left = a + "px" | |
}; | |
this.label.ySetter = function(a, b) { | |
k[b].call(this.label, e.distance); | |
h.style.top = a + "px" | |
} | |
} | |
this.label.attr({ | |
zIndex: 8 | |
}).add() | |
} | |
return this.label | |
}, | |
update: function(c) { | |
this.destroy(); | |
r(!0, this.chart.options.tooltip.userOptions, c); | |
this.init(this.chart, r(!0, this.options, c)) | |
}, | |
destroy: function() { | |
this.label && (this.label = this.label.destroy()); | |
this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy()); | |
this.renderer && (this.renderer = this.renderer.destroy(), G(this.container)); | |
c.clearTimeout(this.hideTimer); | |
c.clearTimeout(this.tooltipTimeout) | |
}, | |
move: function(e, f, b, a) { | |
var d = this, | |
h = d.now, | |
k = !1 !== d.options.animation && !d.isHidden && (1 < Math.abs(e - h.x) || 1 < Math.abs(f - h.y)), | |
l = d.followPointer || 1 < d.len; | |
H(h, { | |
x: k ? (2 * h.x + e) / 3 : e, | |
y: k ? (h.y + f) / 2 : f, | |
anchorX: l ? void 0 : k ? (2 * h.anchorX + b) / 3 : b, | |
anchorY: l ? void 0 : k ? (h.anchorY + a) / 2 : a | |
}); | |
d.getLabel().attr(h); | |
k && (c.clearTimeout(this.tooltipTimeout), this.tooltipTimeout = | |
setTimeout(function() { | |
d && d.move(e, f, b, a) | |
}, 32)) | |
}, | |
hide: function(e) { | |
var f = this; | |
c.clearTimeout(this.hideTimer); | |
e = C(e, this.options.hideDelay, 500); | |
this.isHidden || (this.hideTimer = u(function() { | |
f.getLabel()[e ? "fadeOut" : "hide"](); | |
f.isHidden = !0 | |
}, e)) | |
}, | |
getAnchor: function(c, f) { | |
var b = this.chart, | |
a = b.pointer, | |
d = b.inverted, | |
h = b.plotTop, | |
k = b.plotLeft, | |
l = 0, | |
e = 0, | |
p, g; | |
c = B(c); | |
this.followPointer && f ? ("undefined" === typeof f.chartX && (f = a.normalize(f)), c = [f.chartX - b.plotLeft, f.chartY - h]) : c[0].tooltipPos ? c = c[0].tooltipPos : (c.forEach(function(a) { | |
p = | |
a.series.yAxis; | |
g = a.series.xAxis; | |
l += a.plotX + (!d && g ? g.left - k : 0); | |
e += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!d && p ? p.top - h : 0) | |
}), l /= c.length, e /= c.length, c = [d ? b.plotWidth - e : l, this.shared && !d && 1 < c.length && f ? f.chartY - h : d ? b.plotHeight - l : e]); | |
return c.map(Math.round) | |
}, | |
getPosition: function(c, f, b) { | |
var a = this.chart, | |
d = this.distance, | |
h = {}, | |
k = a.inverted && b.h || 0, | |
l, e = this.outside, | |
p = e ? w.documentElement.clientWidth - 2 * d : a.chartWidth, | |
g = e ? Math.max(w.body.scrollHeight, w.documentElement.scrollHeight, w.body.offsetHeight, | |
w.documentElement.offsetHeight, w.documentElement.clientHeight) : a.chartHeight, | |
t = a.pointer.getChartPosition(), | |
x = a.containerScaling, | |
L = function(a) { | |
return x ? a * x.scaleX : a | |
}, | |
E = function(a) { | |
return x ? a * x.scaleY : a | |
}, | |
n = function(h) { | |
var n = "x" === h; | |
return [h, n ? p : g, n ? c : f].concat(e ? [n ? L(c) : E(f), n ? t.left - d + L(b.plotX + a.plotLeft) : t.top - d + E(b.plotY + a.plotTop), 0, n ? p : g] : [n ? c : f, n ? b.plotX + a.plotLeft : b.plotY + a.plotTop, n ? a.plotLeft : a.plotTop, n ? a.plotLeft + a.plotWidth : a.plotTop + a.plotHeight]) | |
}, | |
z = n("y"), | |
m = n("x"), | |
r = !this.followPointer && | |
C(b.ttBelow, !a.inverted === !!b.negative), | |
q = function(a, b, g, f, c, t, n) { | |
var l = "y" === a ? E(d) : L(d), | |
x = (g - f) / 2, | |
e = f < c - d, | |
p = c + d + f < b, | |
z = c - l - g + x; | |
c = c + l - x; | |
if (r && p) h[a] = c; | |
else if (!r && e) h[a] = z; | |
else if (e) h[a] = Math.min(n - f, 0 > z - k ? z : z - k); | |
else if (p) h[a] = Math.max(t, c + k + g > b ? c : c + k); | |
else return !1 | |
}, | |
A = function(a, b, g, f, c) { | |
var t; | |
c < d || c > b - d ? t = !1 : h[a] = c < g / 2 ? 1 : c > b - f / 2 ? b - f - 2 : c - g / 2; | |
return t | |
}, | |
u = function(a) { | |
var b = z; | |
z = m; | |
m = b; | |
l = a | |
}, | |
v = function() { | |
!1 !== q.apply(0, z) ? !1 !== A.apply(0, m) || l || (u(!0), v()) : l ? h.x = h.y = 0 : (u(!0), v()) | |
}; | |
(a.inverted || 1 < this.len) && | |
u(); | |
v(); | |
return h | |
}, | |
defaultFormatter: function(c) { | |
var f = this.points || B(this); | |
var b = [c.tooltipFooterHeaderFormatter(f[0])]; | |
b = b.concat(c.bodyFormatter(f)); | |
b.push(c.tooltipFooterHeaderFormatter(f[0], !0)); | |
return b | |
}, | |
refresh: function(e, f) { | |
var b = this.chart, | |
a = this.options, | |
d = e, | |
h = {}, | |
k = [], | |
l = a.formatter || this.defaultFormatter; | |
h = this.shared; | |
var y = b.styledMode; | |
if (a.enabled) { | |
c.clearTimeout(this.hideTimer); | |
this.followPointer = B(d)[0].series.tooltipOptions.followPointer; | |
var p = this.getAnchor(d, f); | |
f = p[0]; | |
var g = p[1]; | |
!h || | |
d.series && d.series.noSharedTooltip ? h = d.getLabelConfig() : (b.pointer.applyInactiveState(d), d.forEach(function(a) { | |
a.setState("hover"); | |
k.push(a.getLabelConfig()) | |
}), h = { | |
x: d[0].category, | |
y: d[0].y | |
}, h.points = k, d = d[0]); | |
this.len = k.length; | |
b = l.call(h, this); | |
l = d.series; | |
this.distance = C(l.tooltipOptions.distance, 16); | |
!1 === b ? this.hide() : (this.split ? this.renderSplit(b, B(e)) : (e = this.getLabel(), a.style.width && !y || e.css({ | |
width: this.chart.spacingBox.width | |
}), e.attr({ | |
text: b && b.join ? b.join("") : b | |
}), e.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + | |
C(d.colorIndex, l.colorIndex)), y || e.attr({ | |
stroke: a.borderColor || d.color || l.color || "#666666" | |
}), this.updatePosition({ | |
plotX: f, | |
plotY: g, | |
negative: d.negative, | |
ttBelow: d.ttBelow, | |
h: p[2] || 0 | |
})), this.isHidden && this.label && this.label.attr({ | |
opacity: 1 | |
}).show(), this.isHidden = !1); | |
c.fireEvent(this, "refresh") | |
} | |
}, | |
renderSplit: function(e, f) { | |
function b(a, b, d, g, c) { | |
void 0 === c && (c = !0); | |
d ? (b = D ? 0 : I, a = F(a - g / 2, K.left, K.right - g)) : (b -= B, a = c ? a - g - v : a + v, a = F(a, c ? a : K.left, K.right)); | |
return { | |
x: a, | |
y: b | |
} | |
} | |
var a = this, | |
d = a.chart, | |
h = a.chart, | |
k = h.chartWidth, | |
l = h.chartHeight, | |
y = h.plotHeight, | |
p = h.plotLeft, | |
g = h.plotTop, | |
t = h.plotWidth, | |
x = h.pointer, | |
L = h.renderer, | |
E = h.scrollablePixelsX; | |
E = void 0 === E ? 0 : E; | |
var n = h.scrollablePixelsY, | |
z = void 0 === n ? 0 : n; | |
n = h.scrollingContainer; | |
n = void 0 === n ? { | |
scrollLeft: 0, | |
scrollTop: 0 | |
} : n; | |
var m = n.scrollLeft, | |
r = n.scrollTop, | |
u = h.styledMode, | |
v = a.distance, | |
w = a.options, | |
A = a.options.positioner, | |
K = { | |
left: E ? p : 0, | |
right: E ? p + t - E : k, | |
top: z ? g : 0, | |
bottom: z ? g + y - z : l | |
}, | |
R = a.getLabel(), | |
D = !(!d.xAxis[0] || !d.xAxis[0].opposite), | |
B = g, | |
G = 0, | |
I = y - z; | |
q(e) && (e = [!1, e]); | |
e = e.slice(0, f.length + | |
1).reduce(function(d, c, h) { | |
if (!1 !== c && "" !== c) { | |
h = f[h - 1] || { | |
isHeader: !0, | |
plotX: f[0].plotX, | |
plotY: y, | |
series: {} | |
}; | |
var t = h.isHeader, | |
n = t ? a : h.series, | |
l = n.tt, | |
x = h.isHeader; | |
var e = h.series; | |
var k = "highcharts-color-" + C(h.colorIndex, e.colorIndex, "none"); | |
l || (l = { | |
padding: w.padding, | |
r: w.borderRadius | |
}, u || (l.fill = w.backgroundColor, l["stroke-width"] = w.borderWidth), l = L.label(null, null, null, w[x ? "headerShape" : "shape"] || "callout", null, null, w.useHTML).addClass(x ? "highcharts-tooltip-header " : "highcharts-tooltip-box " + k).attr(l).add(R)); | |
l.isActive = !0; | |
l.attr({ | |
text: c | |
}); | |
u || l.css(w.style).shadow(w.shadow).attr({ | |
stroke: w.borderColor || h.color || e.color || "#333333" | |
}); | |
c = n.tt = l; | |
x = c.getBBox(); | |
n = x.width + c.strokeWidth(); | |
t && (G = x.height, I += G, D && (B -= G)); | |
e = h.plotX; | |
e = void 0 === e ? 0 : e; | |
k = h.plotY; | |
k = void 0 === k ? 0 : k; | |
var E = h.series; | |
h.isHeader ? (e = p + e - m, k = g + (y - z) / 2) : (l = E.xAxis, E = E.yAxis, e = l.pos + F(e, -v, l.len + v) - m, k = E.pos + F(k, 0, E.len) - r); | |
e = F(e, K.left - v, K.right + v); | |
k = F(k, K.top, K.bottom); | |
x = x.height + 1; | |
l = A ? A.call(a, n, x, h) : b(e, k, t, n); | |
d.push({ | |
align: A ? 0 : void 0, | |
anchorX: e, | |
anchorY: k, | |
boxWidth: n, | |
point: h, | |
rank: C(l.rank, t ? 1 : 0), | |
size: x, | |
target: l.y, | |
tt: c, | |
x: l.x | |
}) | |
} | |
return d | |
}, []); | |
!A && e.some(function(a) { | |
return 0 > a.x | |
}) && (e = e.map(function(a) { | |
var d = b(a.anchorX, a.anchorY, a.point.isHeader, a.boxWidth, !1); | |
return H(a, { | |
target: d.y, | |
x: d.x | |
}) | |
})); | |
a.cleanSplit(); | |
c.distribute(e, I, void 0); | |
e.forEach(function(a) { | |
var b = a.pos; | |
a.tt.attr({ | |
visibility: "undefined" === typeof b ? "hidden" : "inherit", | |
x: a.x, | |
y: b + B, | |
anchorX: a.anchorX, | |
anchorY: a.anchorY | |
}) | |
}); | |
e = a.container; | |
d = a.renderer; | |
a.outside && e && d && (h = R.getBBox(), d.setSize(h.width + | |
h.x, h.height + h.y, !1), x = x.getChartPosition(), e.style.left = x.left + "px", e.style.top = x.top + "px") | |
}, | |
updatePosition: function(e) { | |
var f = this.chart, | |
b = f.pointer, | |
a = this.getLabel(), | |
d = e.plotX + f.plotLeft, | |
h = e.plotY + f.plotTop; | |
b = b.getChartPosition(); | |
e = (this.options.positioner || this.getPosition).call(this, a.width, a.height, e); | |
if (this.outside) { | |
var k = (this.options.borderWidth || 0) + 2 * this.distance; | |
this.renderer.setSize(a.width + k, a.height + k, !1); | |
if (f = f.containerScaling) c.css(this.container, { | |
transform: "scale(" + f.scaleX + ", " + | |
f.scaleY + ")" | |
}), d *= f.scaleX, h *= f.scaleY; | |
d += b.left - e.x; | |
h += b.top - e.y | |
} | |
this.move(Math.round(e.x), Math.round(e.y || 0), d, h) | |
}, | |
getDateFormat: function(c, f, b, a) { | |
var d = this.chart.time, | |
h = d.dateFormat("%m-%d %H:%M:%S.%L", f), | |
e = { | |
millisecond: 15, | |
second: 12, | |
minute: 9, | |
hour: 6, | |
day: 3 | |
}, | |
l = "millisecond"; | |
for (y in D) { | |
if (c === D.week && +d.dateFormat("%w", f) === b && "00:00:00.000" === h.substr(6)) { | |
var y = "week"; | |
break | |
} | |
if (D[y] > c) { | |
y = l; | |
break | |
} | |
if (e[y] && h.substr(e[y]) !== "01-01 00:00:00.000".substr(e[y])) break; | |
"week" !== y && (l = y) | |
} | |
if (y) var p = d.resolveDTLFormat(a[y]).main; | |
return p | |
}, | |
getXDateFormat: function(c, f, b) { | |
f = f.dateTimeLabelFormats; | |
var a = b && b.closestPointRange; | |
return (a ? this.getDateFormat(a, c.x, b.options.startOfWeek, f) : f.day) || f.year | |
}, | |
tooltipFooterHeaderFormatter: function(e, f) { | |
var b = f ? "footer" : "header", | |
a = e.series, | |
d = a.tooltipOptions, | |
h = d.xDateFormat, | |
k = a.xAxis, | |
l = k && "datetime" === k.options.type && v(e.key), | |
y = d[b + "Format"]; | |
f = { | |
isFooter: f, | |
labelConfig: e | |
}; | |
c.fireEvent(this, "headerFormatter", f, function(b) { | |
l && !h && (h = this.getXDateFormat(e, d, k)); | |
l && h && (e.point && e.point.tooltipDateKeys || ["key"]).forEach(function(a) { | |
y = y.replace("{point." + a + "}", "{point." + a + ":" + h + "}") | |
}); | |
a.chart.styledMode && (y = this.styledModeFormat(y)); | |
b.text = m(y, { | |
point: e, | |
series: a | |
}, this.chart) | |
}); | |
return f.text | |
}, | |
bodyFormatter: function(c) { | |
return c.map(function(c) { | |
var b = c.series.tooltipOptions; | |
return (b[(c.point.formatPrefix || "point") + "Formatter"] || c.point.tooltipFormatter).call(c.point, b[(c.point.formatPrefix || "point") + "Format"] || "") | |
}) | |
}, | |
styledModeFormat: function(c) { | |
return c.replace('style="font-size: 10px"', 'class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g, | |
'class="highcharts-color-{$1.colorIndex}"') | |
} | |
} | |
}); | |
M(J, "parts/Pointer.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.attr, | |
I = e.defined, | |
G = e.extend, | |
H = e.isNumber, | |
v = e.isObject, | |
q = e.objectEach, | |
C = e.offset, | |
B = e.pick, | |
u = e.splat, | |
w = c.addEvent, | |
m = c.charts, | |
r = c.color, | |
D = c.css, | |
A = c.find, | |
f = c.fireEvent, | |
b = c.Tooltip; | |
c.Pointer = function(a, b) { | |
this.init(a, b) | |
}; | |
c.Pointer.prototype = { | |
init: function(a, d) { | |
this.options = d; | |
this.chart = a; | |
this.runChartClick = d.chart.events && !!d.chart.events.click; | |
this.pinchDown = []; | |
this.lastValidTouch = {}; | |
b && (a.tooltip = new b(a, d.tooltip), this.followTouchMove = B(d.tooltip.followTouchMove, !0)); | |
this.setDOMEvents() | |
}, | |
zoomOption: function(a) { | |
var b = this.chart, | |
c = b.options.chart, | |
f = c.zoomType || ""; | |
b = b.inverted; | |
/touch/.test(a.type) && (f = B(c.pinchType, f)); | |
this.zoomX = a = /x/.test(f); | |
this.zoomY = f = /y/.test(f); | |
this.zoomHor = a && !b || f && b; | |
this.zoomVert = f && !b || a && b; | |
this.hasZoom = a || f | |
}, | |
getChartPosition: function() { | |
var a = this.chart; | |
a = a.scrollingContainer || a.container; | |
return this.chartPosition || (this.chartPosition = | |
C(a)) | |
}, | |
normalize: function(a, b) { | |
var d = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a; | |
b || (b = this.getChartPosition()); | |
var c = d.pageX - b.left; | |
b = d.pageY - b.top; | |
if (d = this.chart.containerScaling) c /= d.scaleX, b /= d.scaleY; | |
return G(a, { | |
chartX: Math.round(c), | |
chartY: Math.round(b) | |
}) | |
}, | |
getCoordinates: function(a) { | |
var b = { | |
xAxis: [], | |
yAxis: [] | |
}; | |
this.chart.axes.forEach(function(d) { | |
b[d.isXAxis ? "xAxis" : "yAxis"].push({ | |
axis: d, | |
value: d.toValue(a[d.horiz ? "chartX" : "chartY"]) | |
}) | |
}); | |
return b | |
}, | |
findNearestKDPoint: function(a, | |
b, c) { | |
var d; | |
a.forEach(function(a) { | |
var f = !(a.noSharedTooltip && b) && 0 > a.options.findNearestPointBy.indexOf("y"); | |
a = a.searchPoint(c, f); | |
if ((f = v(a, !0)) && !(f = !v(d, !0))) { | |
f = d.distX - a.distX; | |
var h = d.dist - a.dist, | |
g = (a.series.group && a.series.group.zIndex) - (d.series.group && d.series.group.zIndex); | |
f = 0 < (0 !== f && b ? f : 0 !== h ? h : 0 !== g ? g : d.series.index > a.series.index ? -1 : 1) | |
} | |
f && (d = a) | |
}); | |
return d | |
}, | |
getPointFromEvent: function(a) { | |
a = a.target; | |
for (var b; a && !b;) b = a.point, a = a.parentNode; | |
return b | |
}, | |
getChartCoordinatesFromPoint: function(a, | |
b) { | |
var d = a.series, | |
c = d.xAxis; | |
d = d.yAxis; | |
var f = B(a.clientX, a.plotX), | |
e = a.shapeArgs; | |
if (c && d) return b ? { | |
chartX: c.len + c.pos - f, | |
chartY: d.len + d.pos - a.plotY | |
} : { | |
chartX: f + c.pos, | |
chartY: a.plotY + d.pos | |
}; | |
if (e && e.x && e.y) return { | |
chartX: e.x, | |
chartY: e.y | |
} | |
}, | |
getHoverData: function(a, b, c, f, e, y) { | |
var d, g = []; | |
f = !(!f || !a); | |
var h = b && !b.stickyTracking ? [b] : c.filter(function(a) { | |
return a.visible && !(!e && a.directTouch) && B(a.options.enableMouseTracking, !0) && a.stickyTracking | |
}); | |
b = (d = f || !y ? a : this.findNearestKDPoint(h, e, y)) && d.series; | |
d && (e && !b.noSharedTooltip ? | |
(h = c.filter(function(a) { | |
return a.visible && !(!e && a.directTouch) && B(a.options.enableMouseTracking, !0) && !a.noSharedTooltip | |
}), h.forEach(function(a) { | |
var b = A(a.points, function(a) { | |
return a.x === d.x && !a.isNull | |
}); | |
v(b) && (a.chart.isBoosting && (b = a.getPoint(b)), g.push(b)) | |
})) : g.push(d)); | |
return { | |
hoverPoint: d, | |
hoverSeries: b, | |
hoverPoints: g | |
} | |
}, | |
runPointActions: function(a, b) { | |
var d = this.chart, | |
f = d.tooltip && d.tooltip.options.enabled ? d.tooltip : void 0, | |
e = f ? f.shared : !1, | |
y = b || d.hoverPoint, | |
p = y && y.series || d.hoverSeries; | |
p = this.getHoverData(y, | |
p, d.series, (!a || "touchmove" !== a.type) && (!!b || p && p.directTouch && this.isDirectTouch), e, a); | |
y = p.hoverPoint; | |
var g = p.hoverPoints; | |
b = (p = p.hoverSeries) && p.tooltipOptions.followPointer; | |
e = e && p && !p.noSharedTooltip; | |
if (y && (y !== d.hoverPoint || f && f.isHidden)) { | |
(d.hoverPoints || []).forEach(function(a) { | |
-1 === g.indexOf(a) && a.setState() | |
}); | |
if (d.hoverSeries !== p) p.onMouseOver(); | |
this.applyInactiveState(g); | |
(g || []).forEach(function(a) { | |
a.setState("hover") | |
}); | |
d.hoverPoint && d.hoverPoint.firePointEvent("mouseOut"); | |
if (!y.series) return; | |
y.firePointEvent("mouseOver"); | |
d.hoverPoints = g; | |
d.hoverPoint = y; | |
f && f.refresh(e ? g : y, a) | |
} else b && f && !f.isHidden && (y = f.getAnchor([{}], a), f.updatePosition({ | |
plotX: y[0], | |
plotY: y[1] | |
})); | |
this.unDocMouseMove || (this.unDocMouseMove = w(d.container.ownerDocument, "mousemove", function(a) { | |
var b = m[c.hoverChartIndex]; | |
if (b) b.pointer.onDocumentMouseMove(a) | |
})); | |
d.axes.forEach(function(b) { | |
var d = B(b.crosshair.snap, !0), | |
f = d ? c.find(g, function(a) { | |
return a.series[b.coll] === b | |
}) : void 0; | |
f || !d ? b.drawCrosshair(a, f) : b.hideCrosshair() | |
}) | |
}, | |
applyInactiveState: function(a) { | |
var b = [], | |
c; | |
(a || []).forEach(function(a) { | |
c = a.series; | |
b.push(c); | |
c.linkedParent && b.push(c.linkedParent); | |
c.linkedSeries && (b = b.concat(c.linkedSeries)); | |
c.navigatorSeries && b.push(c.navigatorSeries) | |
}); | |
this.chart.series.forEach(function(a) { | |
-1 === b.indexOf(a) ? a.setState("inactive", !0) : a.options.inactiveOtherPoints && a.setAllPointsToState("inactive") | |
}) | |
}, | |
reset: function(a, b) { | |
var d = this.chart, | |
c = d.hoverSeries, | |
f = d.hoverPoint, | |
e = d.hoverPoints, | |
p = d.tooltip, | |
g = p && p.shared ? e : f; | |
a && g && u(g).forEach(function(b) { | |
b.series.isCartesian && | |
"undefined" === typeof b.plotX && (a = !1) | |
}); | |
if (a) p && g && u(g).length && (p.refresh(g), p.shared && e ? e.forEach(function(a) { | |
a.setState(a.state, !0); | |
a.series.isCartesian && (a.series.xAxis.crosshair && a.series.xAxis.drawCrosshair(null, a), a.series.yAxis.crosshair && a.series.yAxis.drawCrosshair(null, a)) | |
}) : f && (f.setState(f.state, !0), d.axes.forEach(function(a) { | |
a.crosshair && f.series[a.coll] === a && a.drawCrosshair(null, f) | |
}))); | |
else { | |
if (f) f.onMouseOut(); | |
e && e.forEach(function(a) { | |
a.setState() | |
}); | |
if (c) c.onMouseOut(); | |
p && p.hide(b); | |
this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove()); | |
d.axes.forEach(function(a) { | |
a.hideCrosshair() | |
}); | |
this.hoverX = d.hoverPoints = d.hoverPoint = null | |
} | |
}, | |
scaleGroups: function(a, b) { | |
var d = this.chart, | |
c; | |
d.series.forEach(function(f) { | |
c = a || f.getPlotBox(); | |
f.xAxis && f.xAxis.zoomEnabled && f.group && (f.group.attr(c), f.markerGroup && (f.markerGroup.attr(c), f.markerGroup.clip(b ? d.clipRect : null)), f.dataLabelsGroup && f.dataLabelsGroup.attr(c)) | |
}); | |
d.clipRect.attr(b || d.clipBox) | |
}, | |
dragStart: function(a) { | |
var b = this.chart; | |
b.mouseIsDown = a.type; | |
b.cancelClick = !1; | |
b.mouseDownX = this.mouseDownX = a.chartX; | |
b.mouseDownY = this.mouseDownY = a.chartY | |
}, | |
drag: function(a) { | |
var b = this.chart, | |
c = b.options.chart, | |
f = a.chartX, | |
e = a.chartY, | |
m = this.zoomHor, | |
p = this.zoomVert, | |
g = b.plotLeft, | |
t = b.plotTop, | |
x = b.plotWidth, | |
L = b.plotHeight, | |
E = this.selectionMarker, | |
n = this.mouseDownX, | |
z = this.mouseDownY, | |
q = v(c.panning) ? c.panning && c.panning.enabled : c.panning, | |
u = c.panKey && a[c.panKey + "Key"]; | |
if (!E || !E.touch) | |
if (f < g ? f = g : f > g + x && (f = g + x), e < t ? e = t : e > t + L && (e = t + L), this.hasDragged = Math.sqrt(Math.pow(n - | |
f, 2) + Math.pow(z - e, 2)), 10 < this.hasDragged) { | |
var w = b.isInsidePlot(n - g, z - t); | |
b.hasCartesianSeries && (this.zoomX || this.zoomY) && w && !u && !E && (this.selectionMarker = E = b.renderer.rect(g, t, m ? 1 : x, p ? 1 : L, 0).attr({ | |
"class": "highcharts-selection-marker", | |
zIndex: 7 | |
}).add(), b.styledMode || E.attr({ | |
fill: c.selectionMarkerFill || r("#335cad").setOpacity(.25).get() | |
})); | |
E && m && (f -= n, E.attr({ | |
width: Math.abs(f), | |
x: (0 < f ? 0 : f) + n | |
})); | |
E && p && (f = e - z, E.attr({ | |
height: Math.abs(f), | |
y: (0 < f ? 0 : f) + z | |
})); | |
w && !E && q && b.pan(a, c.panning) | |
} | |
}, | |
drop: function(a) { | |
var b = | |
this, | |
c = this.chart, | |
e = this.hasPinched; | |
if (this.selectionMarker) { | |
var l = { | |
originalEvent: a, | |
xAxis: [], | |
yAxis: [] | |
}, | |
m = this.selectionMarker, | |
p = m.attr ? m.attr("x") : m.x, | |
g = m.attr ? m.attr("y") : m.y, | |
t = m.attr ? m.attr("width") : m.width, | |
x = m.attr ? m.attr("height") : m.height, | |
L; | |
if (this.hasDragged || e) c.axes.forEach(function(d) { | |
if (d.zoomEnabled && I(d.min) && (e || b[{ | |
xAxis: "zoomX", | |
yAxis: "zoomY" | |
}[d.coll]])) { | |
var c = d.horiz, | |
f = "touchend" === a.type ? d.minPixelPadding : 0, | |
h = d.toValue((c ? p : g) + f); | |
c = d.toValue((c ? p + t : g + x) - f); | |
l[d.coll].push({ | |
axis: d, | |
min: Math.min(h, | |
c), | |
max: Math.max(h, c) | |
}); | |
L = !0 | |
} | |
}), L && f(c, "selection", l, function(a) { | |
c.zoom(G(a, e ? { | |
animation: !1 | |
} : null)) | |
}); | |
H(c.index) && (this.selectionMarker = this.selectionMarker.destroy()); | |
e && this.scaleGroups() | |
} | |
c && H(c.index) && (D(c.container, { | |
cursor: c._cursor | |
}), c.cancelClick = 10 < this.hasDragged, c.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = []) | |
}, | |
onContainerMouseDown: function(a) { | |
a = this.normalize(a); | |
2 !== a.button && (this.zoomOption(a), a.preventDefault && a.preventDefault(), this.dragStart(a)) | |
}, | |
onDocumentMouseUp: function(a) { | |
m[c.hoverChartIndex] && | |
m[c.hoverChartIndex].pointer.drop(a) | |
}, | |
onDocumentMouseMove: function(a) { | |
var b = this.chart, | |
c = this.chartPosition; | |
a = this.normalize(a, c); | |
!c || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset() | |
}, | |
onContainerMouseLeave: function(a) { | |
var b = m[c.hoverChartIndex]; | |
b && (a.relatedTarget || a.toElement) && (b.pointer.reset(), b.pointer.chartPosition = void 0) | |
}, | |
onContainerMouseMove: function(a) { | |
var b = this.chart; | |
I(c.hoverChartIndex) && m[c.hoverChartIndex] && m[c.hoverChartIndex].mouseIsDown || | |
(c.hoverChartIndex = b.index); | |
a = this.normalize(a); | |
a.preventDefault || (a.returnValue = !1); | |
"mousedown" === b.mouseIsDown && this.drag(a); | |
!this.inClass(a.target, "highcharts-tracker") && !b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || b.openMenu || this.runPointActions(a) | |
}, | |
inClass: function(a, b) { | |
for (var d; a;) { | |
if (d = F(a, "class")) { | |
if (-1 !== d.indexOf(b)) return !0; | |
if (-1 !== d.indexOf("highcharts-container")) return !1 | |
} | |
a = a.parentNode | |
} | |
}, | |
onTrackerMouseOut: function(a) { | |
var b = this.chart.hoverSeries; | |
a = a.relatedTarget || a.toElement; | |
this.isDirectTouch = !1; | |
if (!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut() | |
}, | |
onContainerClick: function(a) { | |
var b = this.chart, | |
c = b.hoverPoint, | |
e = b.plotLeft, | |
l = b.plotTop; | |
a = this.normalize(a); | |
b.cancelClick || (c && this.inClass(a.target, "highcharts-tracker") ? (f(c.series, "click", G(a, { | |
point: c | |
})), b.hoverPoint && c.firePointEvent("click", a)) : (G(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - e, a.chartY - | |
l) && f(b, "click", a))) | |
}, | |
setDOMEvents: function() { | |
var a = this, | |
b = a.chart.container, | |
f = b.ownerDocument; | |
b.onmousedown = function(b) { | |
a.onContainerMouseDown(b) | |
}; | |
b.onmousemove = function(b) { | |
a.onContainerMouseMove(b) | |
}; | |
b.onclick = function(b) { | |
a.onContainerClick(b) | |
}; | |
this.unbindContainerMouseLeave = w(b, "mouseleave", a.onContainerMouseLeave); | |
c.unbindDocumentMouseUp || (c.unbindDocumentMouseUp = w(f, "mouseup", a.onDocumentMouseUp)); | |
c.hasTouch && (w(b, "touchstart", function(b) { | |
a.onContainerTouchStart(b) | |
}), w(b, "touchmove", function(b) { | |
a.onContainerTouchMove(b) | |
}), | |
c.unbindDocumentTouchEnd || (c.unbindDocumentTouchEnd = w(f, "touchend", a.onDocumentTouchEnd))) | |
}, | |
destroy: function() { | |
var a = this; | |
a.unDocMouseMove && a.unDocMouseMove(); | |
this.unbindContainerMouseLeave(); | |
c.chartCount || (c.unbindDocumentMouseUp && (c.unbindDocumentMouseUp = c.unbindDocumentMouseUp()), c.unbindDocumentTouchEnd && (c.unbindDocumentTouchEnd = c.unbindDocumentTouchEnd())); | |
clearInterval(a.tooltipTimeout); | |
q(a, function(b, c) { | |
a[c] = null | |
}) | |
} | |
} | |
}); | |
M(J, "parts/TouchPointer.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], | |
function(c, e) { | |
var F = e.extend, | |
I = e.pick, | |
G = c.charts, | |
H = c.noop; | |
F(c.Pointer.prototype, { | |
pinchTranslate: function(c, e, C, B, u, w) { | |
this.zoomHor && this.pinchTranslateDirection(!0, c, e, C, B, u, w); | |
this.zoomVert && this.pinchTranslateDirection(!1, c, e, C, B, u, w) | |
}, | |
pinchTranslateDirection: function(c, e, C, B, u, w, m, r) { | |
var q = this.chart, | |
v = c ? "x" : "y", | |
f = c ? "X" : "Y", | |
b = "chart" + f, | |
a = c ? "width" : "height", | |
d = q["plot" + (c ? "Left" : "Top")], | |
h, k, l = r || 1, | |
y = q.inverted, | |
p = q.bounds[c ? "h" : "v"], | |
g = 1 === e.length, | |
t = e[0][b], | |
x = C[0][b], | |
L = !g && e[1][b], | |
E = !g && C[1][b]; | |
C = | |
function() { | |
!g && 20 < Math.abs(t - L) && (l = r || Math.abs(x - E) / Math.abs(t - L)); | |
k = (d - x) / l + t; | |
h = q["plot" + (c ? "Width" : "Height")] / l | |
}; | |
C(); | |
e = k; | |
if (e < p.min) { | |
e = p.min; | |
var n = !0 | |
} else e + h > p.max && (e = p.max - h, n = !0); | |
n ? (x -= .8 * (x - m[v][0]), g || (E -= .8 * (E - m[v][1])), C()) : m[v] = [x, E]; | |
y || (w[v] = k - d, w[a] = h); | |
w = y ? 1 / l : l; | |
u[a] = h; | |
u[v] = e; | |
B[y ? c ? "scaleY" : "scaleX" : "scale" + f] = l; | |
B["translate" + f] = w * d + (x - w * t) | |
}, | |
pinch: function(c) { | |
var e = this, | |
v = e.chart, | |
B = e.pinchDown, | |
u = c.touches, | |
w = u.length, | |
m = e.lastValidTouch, | |
r = e.hasZoom, | |
D = e.selectionMarker, | |
A = {}, | |
f = 1 === w && (e.inClass(c.target, | |
"highcharts-tracker") && v.runTrackerClick || e.runChartClick), | |
b = {}; | |
1 < w && (e.initiated = !0); | |
r && e.initiated && !f && c.preventDefault(); | |
[].map.call(u, function(a) { | |
return e.normalize(a) | |
}); | |
"touchstart" === c.type ? ([].forEach.call(u, function(a, b) { | |
B[b] = { | |
chartX: a.chartX, | |
chartY: a.chartY | |
} | |
}), m.x = [B[0].chartX, B[1] && B[1].chartX], m.y = [B[0].chartY, B[1] && B[1].chartY], v.axes.forEach(function(a) { | |
if (a.zoomEnabled) { | |
var b = v.bounds[a.horiz ? "h" : "v"], | |
c = a.minPixelPadding, | |
f = a.toPixels(Math.min(I(a.options.min, a.dataMin), a.dataMin)), | |
e = a.toPixels(Math.max(I(a.options.max, a.dataMax), a.dataMax)), | |
m = Math.max(f, e); | |
b.min = Math.min(a.pos, Math.min(f, e) - c); | |
b.max = Math.max(a.pos + a.len, m + c) | |
} | |
}), e.res = !0) : e.followTouchMove && 1 === w ? this.runPointActions(e.normalize(c)) : B.length && (D || (e.selectionMarker = D = F({ | |
destroy: H, | |
touch: !0 | |
}, v.plotBox)), e.pinchTranslate(B, u, A, D, b, m), e.hasPinched = r, e.scaleGroups(A, b), e.res && (e.res = !1, this.reset(!1, 0))) | |
}, | |
touch: function(e, q) { | |
var v = this.chart, | |
B; | |
if (v.index !== c.hoverChartIndex) this.onContainerMouseLeave({ | |
relatedTarget: !0 | |
}); | |
c.hoverChartIndex = v.index; | |
if (1 === e.touches.length) | |
if (e = this.normalize(e), (B = v.isInsidePlot(e.chartX - v.plotLeft, e.chartY - v.plotTop)) && !v.openMenu) { | |
q && this.runPointActions(e); | |
if ("touchmove" === e.type) { | |
q = this.pinchDown; | |
var u = q[0] ? 4 <= Math.sqrt(Math.pow(q[0].chartX - e.chartX, 2) + Math.pow(q[0].chartY - e.chartY, 2)) : !1 | |
} | |
I(u, !0) && this.pinch(e) | |
} else q && this.reset(); | |
else 2 === e.touches.length && this.pinch(e) | |
}, | |
onContainerTouchStart: function(c) { | |
this.zoomOption(c); | |
this.touch(c, !0) | |
}, | |
onContainerTouchMove: function(c) { | |
this.touch(c) | |
}, | |
onDocumentTouchEnd: function(e) { | |
G[c.hoverChartIndex] && G[c.hoverChartIndex].pointer.drop(e) | |
} | |
}) | |
}); | |
M(J, "parts/MSPointer.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.extend, | |
I = e.objectEach; | |
e = e.wrap; | |
var G = c.addEvent, | |
H = c.charts, | |
v = c.css, | |
q = c.doc, | |
C = c.noop, | |
B = c.Pointer, | |
u = c.removeEvent, | |
w = c.win; | |
if (!c.hasTouch && (w.PointerEvent || w.MSPointerEvent)) { | |
var m = {}, | |
r = !!w.PointerEvent, | |
D = function() { | |
var c = []; | |
c.item = function(b) { | |
return this[b] | |
}; | |
I(m, function(b) { | |
c.push({ | |
pageX: b.pageX, | |
pageY: b.pageY, | |
target: b.target | |
}) | |
}); | |
return c | |
}, | |
A = function(f, b, a, d) { | |
"touch" !== f.pointerType && f.pointerType !== f.MSPOINTER_TYPE_TOUCH || !H[c.hoverChartIndex] || (d(f), d = H[c.hoverChartIndex].pointer, d[b]({ | |
type: a, | |
target: f.currentTarget, | |
preventDefault: C, | |
touches: D() | |
})) | |
}; | |
F(B.prototype, { | |
onContainerPointerDown: function(c) { | |
A(c, "onContainerTouchStart", "touchstart", function(b) { | |
m[b.pointerId] = { | |
pageX: b.pageX, | |
pageY: b.pageY, | |
target: b.currentTarget | |
} | |
}) | |
}, | |
onContainerPointerMove: function(c) { | |
A(c, "onContainerTouchMove", "touchmove", function(b) { | |
m[b.pointerId] = { | |
pageX: b.pageX, | |
pageY: b.pageY | |
}; | |
m[b.pointerId].target || (m[b.pointerId].target = b.currentTarget) | |
}) | |
}, | |
onDocumentPointerUp: function(c) { | |
A(c, "onDocumentTouchEnd", "touchend", function(b) { | |
delete m[b.pointerId] | |
}) | |
}, | |
batchMSEvents: function(c) { | |
c(this.chart.container, r ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown); | |
c(this.chart.container, r ? "pointermove" : "MSPointerMove", this.onContainerPointerMove); | |
c(q, r ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp) | |
} | |
}); | |
e(B.prototype, "init", function(c, b, a) { | |
c.call(this, b, a); | |
this.hasZoom && | |
v(b.container, { | |
"-ms-touch-action": "none", | |
"touch-action": "none" | |
}) | |
}); | |
e(B.prototype, "setDOMEvents", function(c) { | |
c.apply(this); | |
(this.hasZoom || this.followTouchMove) && this.batchMSEvents(G) | |
}); | |
e(B.prototype, "destroy", function(c) { | |
this.batchMSEvents(u); | |
c.call(this) | |
}) | |
} | |
}); | |
M(J, "parts/Legend.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.defined, | |
I = e.discardElement, | |
G = e.isNumber, | |
H = e.pick, | |
v = e.relativeLength, | |
q = e.setAnimation, | |
C = e.syncTimeout; | |
e = e.wrap; | |
var B = c.addEvent, | |
u = c.css, | |
w = c.fireEvent, | |
m = c.isFirefox, | |
r = c.marginNames, | |
D = c.merge, | |
A = c.stableSort, | |
f = c.win; | |
c.Legend = function(b, a) { | |
this.init(b, a) | |
}; | |
c.Legend.prototype = { | |
init: function(b, a) { | |
this.chart = b; | |
this.setOptions(a); | |
a.enabled && (this.render(), B(this.chart, "endResize", function() { | |
this.legend.positionCheckboxes() | |
}), this.proximate ? this.unchartrender = B(this.chart, "render", function() { | |
this.legend.proximatePositions(); | |
this.legend.positionItems() | |
}) : this.unchartrender && this.unchartrender()) | |
}, | |
setOptions: function(b) { | |
var a = H(b.padding, 8); | |
this.options = b; | |
this.chart.styledMode || (this.itemStyle = b.itemStyle, this.itemHiddenStyle = D(this.itemStyle, b.itemHiddenStyle)); | |
this.itemMarginTop = b.itemMarginTop || 0; | |
this.itemMarginBottom = b.itemMarginBottom || 0; | |
this.padding = a; | |
this.initialItemY = a - 5; | |
this.symbolWidth = H(b.symbolWidth, 16); | |
this.pages = []; | |
this.proximate = "proximate" === b.layout && !this.chart.inverted | |
}, | |
update: function(b, a) { | |
var d = this.chart; | |
this.setOptions(D(!0, this.options, b)); | |
this.destroy(); | |
d.isDirtyLegend = d.isDirtyBox = !0; | |
H(a, !0) && d.redraw(); | |
w(this, "afterUpdate") | |
}, | |
colorizeItem: function(b, a) { | |
b.legendGroup[a ? "removeClass" : "addClass"]("highcharts-legend-item-hidden"); | |
if (!this.chart.styledMode) { | |
var d = this.options, | |
c = b.legendItem, | |
f = b.legendLine, | |
e = b.legendSymbol, | |
m = this.itemHiddenStyle.color; | |
d = a ? d.itemStyle.color : m; | |
var p = a ? b.color || m : m, | |
g = b.options && b.options.marker, | |
t = { | |
fill: p | |
}; | |
c && c.css({ | |
fill: d, | |
color: d | |
}); | |
f && f.attr({ | |
stroke: p | |
}); | |
e && (g && e.isMarker && (t = b.pointAttribs(), a || (t.stroke = t.fill = m)), e.attr(t)) | |
} | |
w(this, "afterColorizeItem", { | |
item: b, | |
visible: a | |
}) | |
}, | |
positionItems: function() { | |
this.allItems.forEach(this.positionItem, | |
this); | |
this.chart.isResizing || this.positionCheckboxes() | |
}, | |
positionItem: function(b) { | |
var a = this.options, | |
d = a.symbolPadding; | |
a = !a.rtl; | |
var c = b._legendItemPos, | |
f = c[0]; | |
c = c[1]; | |
var e = b.checkbox; | |
if ((b = b.legendGroup) && b.element) b[F(b.translateY) ? "animate" : "attr"]({ | |
translateX: a ? f : this.legendWidth - f - 2 * d - 4, | |
translateY: c | |
}); | |
e && (e.x = f, e.y = c) | |
}, | |
destroyItem: function(b) { | |
var a = b.checkbox; | |
["legendItem", "legendLine", "legendSymbol", "legendGroup"].forEach(function(a) { | |
b[a] && (b[a] = b[a].destroy()) | |
}); | |
a && I(b.checkbox) | |
}, | |
destroy: function() { | |
function b(a) { | |
this[a] && | |
(this[a] = this[a].destroy()) | |
} | |
this.getAllItems().forEach(function(a) { | |
["legendItem", "legendGroup"].forEach(b, a) | |
}); | |
"clipRect up down pager nav box title group".split(" ").forEach(b, this); | |
this.display = null | |
}, | |
positionCheckboxes: function() { | |
var b = this.group && this.group.alignAttr, | |
a = this.clipHeight || this.legendHeight, | |
d = this.titleHeight; | |
if (b) { | |
var c = b.translateY; | |
this.allItems.forEach(function(f) { | |
var e = f.checkbox; | |
if (e) { | |
var h = c + d + e.y + (this.scrollOffset || 0) + 3; | |
u(e, { | |
left: b.translateX + f.checkboxOffset + e.x - 20 + "px", | |
top: h + | |
"px", | |
display: this.proximate || h > c - 6 && h < c + a - 6 ? "" : "none" | |
}) | |
} | |
}, this) | |
} | |
}, | |
renderTitle: function() { | |
var b = this.options, | |
a = this.padding, | |
d = b.title, | |
c = 0; | |
d.text && (this.title || (this.title = this.chart.renderer.label(d.text, a - 3, a - 4, null, null, null, b.useHTML, null, "legend-title").attr({ | |
zIndex: 1 | |
}), this.chart.styledMode || this.title.css(d.style), this.title.add(this.group)), d.width || this.title.css({ | |
width: this.maxLegendWidth + "px" | |
}), b = this.title.getBBox(), c = b.height, this.offsetWidth = b.width, this.contentGroup.attr({ | |
translateY: c | |
})); | |
this.titleHeight = c | |
}, | |
setText: function(b) { | |
var a = this.options; | |
b.legendItem.attr({ | |
text: a.labelFormat ? c.format(a.labelFormat, b, this.chart) : a.labelFormatter.call(b) | |
}) | |
}, | |
renderItem: function(b) { | |
var a = this.chart, | |
d = a.renderer, | |
c = this.options, | |
f = this.symbolWidth, | |
e = c.symbolPadding, | |
m = this.itemStyle, | |
p = this.itemHiddenStyle, | |
g = "horizontal" === c.layout ? H(c.itemDistance, 20) : 0, | |
t = !c.rtl, | |
x = b.legendItem, | |
L = !b.series, | |
E = !L && b.series.drawLegendSymbol ? b.series : b, | |
n = E.options; | |
n = this.createCheckboxForItem && n && n.showCheckbox; | |
g = f + e + | |
g + (n ? 20 : 0); | |
var z = c.useHTML, | |
r = b.options.className; | |
x || (b.legendGroup = d.g("legend-item").addClass("highcharts-" + E.type + "-series highcharts-color-" + b.colorIndex + (r ? " " + r : "") + (L ? " highcharts-series-" + b.index : "")).attr({ | |
zIndex: 1 | |
}).add(this.scrollGroup), b.legendItem = x = d.text("", t ? f + e : -e, this.baseline || 0, z), a.styledMode || x.css(D(b.visible ? m : p)), x.attr({ | |
align: t ? "left" : "right", | |
zIndex: 2 | |
}).add(b.legendGroup), this.baseline || (this.fontMetrics = d.fontMetrics(a.styledMode ? 12 : m.fontSize, x), this.baseline = this.fontMetrics.f + | |
3 + this.itemMarginTop, x.attr("y", this.baseline)), this.symbolHeight = c.symbolHeight || this.fontMetrics.f, E.drawLegendSymbol(this, b), this.setItemEvents && this.setItemEvents(b, x, z)); | |
n && !b.checkbox && this.createCheckboxForItem(b); | |
this.colorizeItem(b, b.visible); | |
!a.styledMode && m.width || x.css({ | |
width: (c.itemWidth || this.widthOption || a.spacingBox.width) - g | |
}); | |
this.setText(b); | |
a = x.getBBox(); | |
b.itemWidth = b.checkboxOffset = c.itemWidth || b.legendItemWidth || a.width + g; | |
this.maxItemWidth = Math.max(this.maxItemWidth, b.itemWidth); | |
this.totalItemWidth += b.itemWidth; | |
this.itemHeight = b.itemHeight = Math.round(b.legendItemHeight || a.height || this.symbolHeight) | |
}, | |
layoutItem: function(b) { | |
var a = this.options, | |
d = this.padding, | |
c = "horizontal" === a.layout, | |
f = b.itemHeight, | |
e = this.itemMarginBottom, | |
m = this.itemMarginTop, | |
p = c ? H(a.itemDistance, 20) : 0, | |
g = this.maxLegendWidth; | |
a = a.alignColumns && this.totalItemWidth > g ? this.maxItemWidth : b.itemWidth; | |
c && this.itemX - d + a > g && (this.itemX = d, this.lastLineHeight && (this.itemY += m + this.lastLineHeight + e), this.lastLineHeight = 0); | |
this.lastItemY = m + this.itemY + e; | |
this.lastLineHeight = Math.max(f, this.lastLineHeight); | |
b._legendItemPos = [this.itemX, this.itemY]; | |
c ? this.itemX += a : (this.itemY += m + f + e, this.lastLineHeight = f); | |
this.offsetWidth = this.widthOption || Math.max((c ? this.itemX - d - (b.checkbox ? 0 : p) : a) + d, this.offsetWidth) | |
}, | |
getAllItems: function() { | |
var b = []; | |
this.chart.series.forEach(function(a) { | |
var d = a && a.options; | |
a && H(d.showInLegend, F(d.linkedTo) ? !1 : void 0, !0) && (b = b.concat(a.legendItems || ("point" === d.legendType ? a.data : a))) | |
}); | |
w(this, "afterGetAllItems", { | |
allItems: b | |
}); | |
return b | |
}, | |
getAlignment: function() { | |
var b = this.options; | |
return this.proximate ? b.align.charAt(0) + "tv" : b.floating ? "" : b.align.charAt(0) + b.verticalAlign.charAt(0) + b.layout.charAt(0) | |
}, | |
adjustMargins: function(b, a) { | |
var d = this.chart, | |
c = this.options, | |
f = this.getAlignment(); | |
f && [/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/].forEach(function(e, h) { | |
e.test(f) && !F(b[h]) && (d[r[h]] = Math.max(d[r[h]], d.legend[(h + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][h] * c[h % 2 ? "x" : "y"] + H(c.margin, 12) + a[h] + | |
(d.titleOffset[h] || 0))) | |
}) | |
}, | |
proximatePositions: function() { | |
var b = this.chart, | |
a = [], | |
d = "left" === this.options.align; | |
this.allItems.forEach(function(f) { | |
var e = d; | |
if (f.yAxis && f.points) { | |
f.xAxis.options.reversed && (e = !e); | |
var h = c.find(e ? f.points : f.points.slice(0).reverse(), function(a) { | |
return G(a.plotY) | |
}); | |
e = this.itemMarginTop + f.legendItem.getBBox().height + this.itemMarginBottom; | |
var m = f.yAxis.top - b.plotTop; | |
f.visible ? (h = h ? h.plotY : f.yAxis.height, h += m - .3 * e) : h = m + f.yAxis.height; | |
a.push({ | |
target: h, | |
size: e, | |
item: f | |
}) | |
} | |
}, this); | |
c.distribute(a, | |
b.plotHeight); | |
a.forEach(function(a) { | |
a.item._legendItemPos[1] = b.plotTop - b.spacing[0] + a.pos | |
}) | |
}, | |
render: function() { | |
var b = this.chart, | |
a = b.renderer, | |
d = this.group, | |
c, f = this.box, | |
e = this.options, | |
m = this.padding; | |
this.itemX = m; | |
this.itemY = this.initialItemY; | |
this.lastItemY = this.offsetWidth = 0; | |
this.widthOption = v(e.width, b.spacingBox.width - m); | |
var p = b.spacingBox.width - 2 * m - e.x; - 1 < ["rm", "lm"].indexOf(this.getAlignment().substring(0, 2)) && (p /= 2); | |
this.maxLegendWidth = this.widthOption || p; | |
d || (this.group = d = a.g("legend").attr({ | |
zIndex: 7 | |
}).add(), | |
this.contentGroup = a.g().attr({ | |
zIndex: 1 | |
}).add(d), this.scrollGroup = a.g().add(this.contentGroup)); | |
this.renderTitle(); | |
p = this.getAllItems(); | |
A(p, function(a, b) { | |
return (a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0) | |
}); | |
e.reversed && p.reverse(); | |
this.allItems = p; | |
this.display = c = !!p.length; | |
this.itemHeight = this.totalItemWidth = this.maxItemWidth = this.lastLineHeight = 0; | |
p.forEach(this.renderItem, this); | |
p.forEach(this.layoutItem, this); | |
p = (this.widthOption || this.offsetWidth) + m; | |
var g = this.lastItemY + | |
this.lastLineHeight + this.titleHeight; | |
g = this.handleOverflow(g); | |
g += m; | |
f || (this.box = f = a.rect().addClass("highcharts-legend-box").attr({ | |
r: e.borderRadius | |
}).add(d), f.isNew = !0); | |
b.styledMode || f.attr({ | |
stroke: e.borderColor, | |
"stroke-width": e.borderWidth || 0, | |
fill: e.backgroundColor || "none" | |
}).shadow(e.shadow); | |
0 < p && 0 < g && (f[f.isNew ? "attr" : "animate"](f.crisp.call({}, { | |
x: 0, | |
y: 0, | |
width: p, | |
height: g | |
}, f.strokeWidth())), f.isNew = !1); | |
f[c ? "show" : "hide"](); | |
b.styledMode && "none" === d.getStyle("display") && (p = g = 0); | |
this.legendWidth = p; | |
this.legendHeight = | |
g; | |
c && (a = b.spacingBox, f = a.y, /(lth|ct|rth)/.test(this.getAlignment()) && 0 < b.titleOffset[0] ? f += b.titleOffset[0] : /(lbh|cb|rbh)/.test(this.getAlignment()) && 0 < b.titleOffset[2] && (f -= b.titleOffset[2]), f !== a.y && (a = D(a, { | |
y: f | |
})), d.align(D(e, { | |
width: p, | |
height: g, | |
verticalAlign: this.proximate ? "top" : e.verticalAlign | |
}), !0, a)); | |
this.proximate || this.positionItems(); | |
w(this, "afterRender") | |
}, | |
handleOverflow: function(b) { | |
var a = this, | |
d = this.chart, | |
c = d.renderer, | |
f = this.options, | |
e = f.y, | |
m = this.padding; | |
e = d.spacingBox.height + ("top" === f.verticalAlign ? | |
-e : e) - m; | |
var p = f.maxHeight, | |
g, t = this.clipRect, | |
x = f.navigation, | |
L = H(x.animation, !0), | |
E = x.arrowSize || 12, | |
n = this.nav, | |
z = this.pages, | |
r, q = this.allItems, | |
u = function(b) { | |
"number" === typeof b ? t.attr({ | |
height: b | |
}) : t && (a.clipRect = t.destroy(), a.contentGroup.clip()); | |
a.contentGroup.div && (a.contentGroup.div.style.clip = b ? "rect(" + m + "px,9999px," + (m + b) + "px,0)" : "auto") | |
}, | |
w = function(b) { | |
a[b] = c.circle(0, 0, 1.3 * E).translate(E / 2, E / 2).add(n); | |
d.styledMode || a[b].attr("fill", "rgba(0,0,0,0.0001)"); | |
return a[b] | |
}; | |
"horizontal" !== f.layout || "middle" === | |
f.verticalAlign || f.floating || (e /= 2); | |
p && (e = Math.min(e, p)); | |
z.length = 0; | |
b > e && !1 !== x.enabled ? (this.clipHeight = g = Math.max(e - 20 - this.titleHeight - m, 0), this.currentPage = H(this.currentPage, 1), this.fullHeight = b, q.forEach(function(a, b) { | |
var d = a._legendItemPos[1], | |
c = Math.round(a.legendItem.getBBox().height), | |
f = z.length; | |
if (!f || d - z[f - 1] > g && (r || d) !== z[f - 1]) z.push(r || d), f++; | |
a.pageIx = f - 1; | |
r && (q[b - 1].pageIx = f - 1); | |
b === q.length - 1 && d + c - z[f - 1] > g && d !== r && (z.push(d), a.pageIx = f); | |
d !== r && (r = d) | |
}), t || (t = a.clipRect = c.clipRect(0, m, 9999, | |
0), a.contentGroup.clip(t)), u(g), n || (this.nav = n = c.g().attr({ | |
zIndex: 1 | |
}).add(this.group), this.up = c.symbol("triangle", 0, 0, E, E).add(n), w("upTracker").on("click", function() { | |
a.scroll(-1, L) | |
}), this.pager = c.text("", 15, 10).addClass("highcharts-legend-navigation"), d.styledMode || this.pager.css(x.style), this.pager.add(n), this.down = c.symbol("triangle-down", 0, 0, E, E).add(n), w("downTracker").on("click", function() { | |
a.scroll(1, L) | |
})), a.scroll(0), b = e) : n && (u(), this.nav = n.destroy(), this.scrollGroup.attr({ | |
translateY: 1 | |
}), this.clipHeight = | |
0); | |
return b | |
}, | |
scroll: function(b, a) { | |
var d = this, | |
f = this.chart, | |
e = this.pages, | |
l = e.length, | |
m = this.currentPage + b; | |
b = this.clipHeight; | |
var p = this.options.navigation, | |
g = this.pager, | |
t = this.padding; | |
m > l && (m = l); | |
0 < m && ("undefined" !== typeof a && q(a, f), this.nav.attr({ | |
translateX: t, | |
translateY: b + this.padding + 7 + this.titleHeight, | |
visibility: "visible" | |
}), [this.up, this.upTracker].forEach(function(a) { | |
a.attr({ | |
"class": 1 === m ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" | |
}) | |
}), g.attr({ | |
text: m + "/" + l | |
}), [this.down, this.downTracker].forEach(function(a) { | |
a.attr({ | |
x: 18 + | |
this.pager.getBBox().width, | |
"class": m === l ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active" | |
}) | |
}, this), f.styledMode || (this.up.attr({ | |
fill: 1 === m ? p.inactiveColor : p.activeColor | |
}), this.upTracker.css({ | |
cursor: 1 === m ? "default" : "pointer" | |
}), this.down.attr({ | |
fill: m === l ? p.inactiveColor : p.activeColor | |
}), this.downTracker.css({ | |
cursor: m === l ? "default" : "pointer" | |
})), this.scrollOffset = -e[m - 1] + this.initialItemY, this.scrollGroup.animate({ | |
translateY: this.scrollOffset | |
}), this.currentPage = m, this.positionCheckboxes(), | |
a = c.animObject(H(a, f.renderer.globalAnimation, !0)), C(function() { | |
w(d, "afterScroll", { | |
currentPage: m | |
}) | |
}, a.duration || 0)) | |
} | |
}; | |
c.LegendSymbolMixin = { | |
drawRectangle: function(b, a) { | |
var d = b.symbolHeight, | |
c = b.options.squareSymbol; | |
a.legendSymbol = this.chart.renderer.rect(c ? (b.symbolWidth - d) / 2 : 0, b.baseline - d + 1, c ? d : b.symbolWidth, d, H(b.options.symbolRadius, d / 2)).addClass("highcharts-point").attr({ | |
zIndex: 3 | |
}).add(a.legendGroup) | |
}, | |
drawLineMarker: function(b) { | |
var a = this.options, | |
d = a.marker, | |
c = b.symbolWidth, | |
f = b.symbolHeight, | |
e = | |
f / 2, | |
m = this.chart.renderer, | |
p = this.legendGroup; | |
b = b.baseline - Math.round(.3 * b.fontMetrics.b); | |
var g = {}; | |
this.chart.styledMode || (g = { | |
"stroke-width": a.lineWidth || 0 | |
}, a.dashStyle && (g.dashstyle = a.dashStyle)); | |
this.legendLine = m.path(["M", 0, b, "L", c, b]).addClass("highcharts-graph").attr(g).add(p); | |
d && !1 !== d.enabled && c && (a = Math.min(H(d.radius, e), e), 0 === this.symbol.indexOf("url") && (d = D(d, { | |
width: f, | |
height: f | |
}), a = 0), this.legendSymbol = d = m.symbol(this.symbol, c / 2 - a, b - a, 2 * a, 2 * a, d).addClass("highcharts-point").add(p), d.isMarker = !0) | |
} | |
}; | |
(/Trident\/7\.0/.test(f.navigator && f.navigator.userAgent) || m) && e(c.Legend.prototype, "positionItem", function(b, a) { | |
var d = this, | |
c = function() { | |
a._legendItemPos && b.call(d, a) | |
}; | |
c(); | |
d.bubbleLegend || setTimeout(c) | |
}) | |
}); | |
M(J, "parts/Chart.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.animObject, | |
I = e.attr, | |
G = e.defined, | |
H = e.discardElement, | |
v = e.erase, | |
q = e.extend, | |
C = e.isArray, | |
B = e.isNumber, | |
u = e.isObject, | |
w = e.isString, | |
m = e.numberFormat, | |
r = e.objectEach, | |
D = e.pick, | |
A = e.pInt, | |
f = e.relativeLength, | |
b = e.setAnimation, | |
a = e.splat, | |
d = e.syncTimeout, | |
h = c.addEvent, | |
k = c.animate, | |
l = c.doc, | |
y = c.Axis, | |
p = c.createElement, | |
g = c.defaultOptions, | |
t = c.charts, | |
x = c.css, | |
L = c.find, | |
E = c.fireEvent, | |
n = c.Legend, | |
z = c.marginNames, | |
N = c.merge, | |
O = c.Pointer, | |
V = c.removeEvent, | |
T = c.seriesTypes, | |
P = c.win, | |
Q = c.Chart = function() { | |
this.getArgs.apply(this, arguments) | |
}; | |
c.chart = function(a, b, d) { | |
return new Q(a, b, d) | |
}; | |
q(Q.prototype, { | |
callbacks: [], | |
getArgs: function() { | |
var a = [].slice.call(arguments); | |
if (w(a[0]) || a[0].nodeName) this.renderTo = a.shift(); | |
this.init(a[0], a[1]) | |
}, | |
init: function(a, | |
b) { | |
var d, f = a.series, | |
e = a.plotOptions || {}; | |
E(this, "init", { | |
args: arguments | |
}, function() { | |
a.series = null; | |
d = N(g, a); | |
r(d.plotOptions, function(a, b) { | |
u(a) && (a.tooltip = e[b] && N(e[b].tooltip) || void 0) | |
}); | |
d.tooltip.userOptions = a.chart && a.chart.forExport && a.tooltip.userOptions || a.tooltip; | |
d.series = a.series = f; | |
this.userOptions = a; | |
var n = d.chart, | |
x = n.events; | |
this.margin = []; | |
this.spacing = []; | |
this.bounds = { | |
h: {}, | |
v: {} | |
}; | |
this.labelCollectors = []; | |
this.callback = b; | |
this.isResizing = 0; | |
this.options = d; | |
this.axes = []; | |
this.series = []; | |
this.time = a.time && | |
Object.keys(a.time).length ? new c.Time(a.time) : c.time; | |
this.numberFormatter = n.numberFormatter || m; | |
this.styledMode = n.styledMode; | |
this.hasCartesianSeries = n.showAxes; | |
var l = this; | |
l.index = t.length; | |
t.push(l); | |
c.chartCount++; | |
x && r(x, function(a, b) { | |
c.isFunction(a) && h(l, b, a) | |
}); | |
l.xAxis = []; | |
l.yAxis = []; | |
l.pointCount = l.colorCounter = l.symbolCounter = 0; | |
E(l, "afterInit"); | |
l.firstRender() | |
}) | |
}, | |
initSeries: function(a) { | |
var b = this.options.chart; | |
b = a.type || b.type || b.defaultSeriesType; | |
var d = T[b]; | |
d || c.error(17, !0, this, { | |
missingModuleFor: b | |
}); | |
b = new d; | |
b.init(this, a); | |
return b | |
}, | |
setSeriesData: function() { | |
this.getSeriesOrderByLinks().forEach(function(a) { | |
a.points || a.data || !a.enabledDataSorting || a.setData(a.options.data, !1) | |
}) | |
}, | |
getSeriesOrderByLinks: function() { | |
return this.series.concat().sort(function(a, b) { | |
return a.linkedSeries.length || b.linkedSeries.length ? b.linkedSeries.length - a.linkedSeries.length : 0 | |
}) | |
}, | |
orderSeries: function(a) { | |
var b = this.series; | |
for (a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].getName()) | |
}, | |
isInsidePlot: function(a, b, | |
d) { | |
var g = d ? b : a; | |
a = d ? a : b; | |
return 0 <= g && g <= this.plotWidth && 0 <= a && a <= this.plotHeight | |
}, | |
redraw: function(a) { | |
E(this, "beforeRedraw"); | |
var d = this.axes, | |
g = this.series, | |
c = this.pointer, | |
f = this.legend, | |
e = this.userOptions.legend, | |
h = this.isDirtyLegend, | |
t = this.hasCartesianSeries, | |
n = this.isDirtyBox, | |
x = this.renderer, | |
l = x.isHidden(), | |
p = []; | |
this.setResponsive && this.setResponsive(!1); | |
b(a, this); | |
l && this.temporaryDisplay(); | |
this.layOutTitles(); | |
for (a = g.length; a--;) { | |
var k = g[a]; | |
if (k.options.stacking) { | |
var m = !0; | |
if (k.isDirty) { | |
var z = !0; | |
break | |
} | |
} | |
} | |
if (z) | |
for (a = | |
g.length; a--;) k = g[a], k.options.stacking && (k.isDirty = !0); | |
g.forEach(function(a) { | |
a.isDirty && ("point" === a.options.legendType ? (a.updateTotals && a.updateTotals(), h = !0) : e && (e.labelFormatter || e.labelFormat) && (h = !0)); | |
a.isDirtyData && E(a, "updatedData") | |
}); | |
h && f && f.options.enabled && (f.render(), this.isDirtyLegend = !1); | |
m && this.getStacks(); | |
t && d.forEach(function(a) { | |
a.updateNames(); | |
a.setScale() | |
}); | |
this.getMargins(); | |
t && (d.forEach(function(a) { | |
a.isDirty && (n = !0) | |
}), d.forEach(function(a) { | |
var b = a.min + "," + a.max; | |
a.extKey !== b && | |
(a.extKey = b, p.push(function() { | |
E(a, "afterSetExtremes", q(a.eventArgs, a.getExtremes())); | |
delete a.eventArgs | |
})); | |
(n || m) && a.redraw() | |
})); | |
n && this.drawChartBox(); | |
E(this, "predraw"); | |
g.forEach(function(a) { | |
(n || a.isDirty) && a.visible && a.redraw(); | |
a.isDirtyData = !1 | |
}); | |
c && c.reset(!0); | |
x.draw(); | |
E(this, "redraw"); | |
E(this, "render"); | |
l && this.temporaryDisplay(!0); | |
p.forEach(function(a) { | |
a.call() | |
}) | |
}, | |
get: function(a) { | |
function b(b) { | |
return b.id === a || b.options && b.options.id === a | |
} | |
var d = this.series, | |
g; | |
var c = L(this.axes, b) || L(this.series, | |
b); | |
for (g = 0; !c && g < d.length; g++) c = L(d[g].points || [], b); | |
return c | |
}, | |
getAxes: function() { | |
var b = this, | |
d = this.options, | |
g = d.xAxis = a(d.xAxis || {}); | |
d = d.yAxis = a(d.yAxis || {}); | |
E(this, "getAxes"); | |
g.forEach(function(a, b) { | |
a.index = b; | |
a.isX = !0 | |
}); | |
d.forEach(function(a, b) { | |
a.index = b | |
}); | |
g.concat(d).forEach(function(a) { | |
new y(b, a) | |
}); | |
E(this, "afterGetAxes") | |
}, | |
getSelectedPoints: function() { | |
var a = []; | |
this.series.forEach(function(b) { | |
a = a.concat((b[b.hasGroupedData ? "points" : "data"] || []).filter(function(a) { | |
return D(a.selectedStaging, a.selected) | |
})) | |
}); | |
return a | |
}, | |
getSelectedSeries: function() { | |
return this.series.filter(function(a) { | |
return a.selected | |
}) | |
}, | |
setTitle: function(a, b, d) { | |
this.applyDescription("title", a); | |
this.applyDescription("subtitle", b); | |
this.applyDescription("caption", void 0); | |
this.layOutTitles(d) | |
}, | |
applyDescription: function(a, b) { | |
var d = this, | |
g = "title" === a ? { | |
color: "#333333", | |
fontSize: this.options.isStock ? "16px" : "18px" | |
} : { | |
color: "#666666" | |
}; | |
g = this.options[a] = N(!this.styledMode && { | |
style: g | |
}, this.options[a], b); | |
var c = this[a]; | |
c && b && (this[a] = c = c.destroy()); | |
g && !c && (c = this.renderer.text(g.text, 0, 0, g.useHTML).attr({ | |
align: g.align, | |
"class": "highcharts-" + a, | |
zIndex: g.zIndex || 4 | |
}).add(), c.update = function(b) { | |
d[{ | |
title: "setTitle", | |
subtitle: "setSubtitle", | |
caption: "setCaption" | |
}[a]](b) | |
}, this.styledMode || c.css(g.style), this[a] = c) | |
}, | |
layOutTitles: function(a) { | |
var b = [0, 0, 0], | |
d = this.renderer, | |
g = this.spacingBox; | |
["title", "subtitle", "caption"].forEach(function(a) { | |
var c = this[a], | |
f = this.options[a], | |
e = f.verticalAlign || "top"; | |
a = "title" === a ? -3 : "top" === e ? b[0] + 2 : 0; | |
if (c) { | |
if (!this.styledMode) var h = | |
f.style.fontSize; | |
h = d.fontMetrics(h, c).b; | |
c.css({ | |
width: (f.width || g.width + (f.widthAdjust || 0)) + "px" | |
}); | |
var t = Math.round(c.getBBox(f.useHTML).height); | |
c.align(q({ | |
y: "bottom" === e ? h : a + h, | |
height: t | |
}, f), !1, "spacingBox"); | |
f.floating || ("top" === e ? b[0] = Math.ceil(b[0] + t) : "bottom" === e && (b[2] = Math.ceil(b[2] + t))) | |
} | |
}, this); | |
b[0] && "top" === (this.options.title.verticalAlign || "top") && (b[0] += this.options.title.margin); | |
b[2] && "bottom" === this.options.caption.verticalAlign && (b[2] += this.options.caption.margin); | |
var c = !this.titleOffset || | |
this.titleOffset.join(",") !== b.join(","); | |
this.titleOffset = b; | |
E(this, "afterLayOutTitles"); | |
!this.isDirtyBox && c && (this.isDirtyBox = this.isDirtyLegend = c, this.hasRendered && D(a, !0) && this.isDirtyBox && this.redraw()) | |
}, | |
getChartSize: function() { | |
var a = this.options.chart, | |
b = a.width; | |
a = a.height; | |
var d = this.renderTo; | |
G(b) || (this.containerWidth = c.getStyle(d, "width")); | |
G(a) || (this.containerHeight = c.getStyle(d, "height")); | |
this.chartWidth = Math.max(0, b || this.containerWidth || 600); | |
this.chartHeight = Math.max(0, f(a, this.chartWidth) || | |
(1 < this.containerHeight ? this.containerHeight : 400)) | |
}, | |
temporaryDisplay: function(a) { | |
var b = this.renderTo; | |
if (a) | |
for (; b && b.style;) b.hcOrigStyle && (c.css(b, b.hcOrigStyle), delete b.hcOrigStyle), b.hcOrigDetached && (l.body.removeChild(b), b.hcOrigDetached = !1), b = b.parentNode; | |
else | |
for (; b && b.style;) { | |
l.body.contains(b) || b.parentNode || (b.hcOrigDetached = !0, l.body.appendChild(b)); | |
if ("none" === c.getStyle(b, "display", !1) || b.hcOricDetached) b.hcOrigStyle = { | |
display: b.style.display, | |
height: b.style.height, | |
overflow: b.style.overflow | |
}, | |
a = { | |
display: "block", | |
overflow: "hidden" | |
}, b !== this.renderTo && (a.height = 0), c.css(b, a), b.offsetWidth || b.style.setProperty("display", "block", "important"); | |
b = b.parentNode; | |
if (b === l.body) break | |
} | |
}, | |
setClassName: function(a) { | |
this.container.className = "highcharts-container " + (a || "") | |
}, | |
getContainer: function() { | |
var a = this.options, | |
b = a.chart; | |
var d = this.renderTo; | |
var g = c.uniqueKey(), | |
f, e; | |
d || (this.renderTo = d = b.renderTo); | |
w(d) && (this.renderTo = d = l.getElementById(d)); | |
d || c.error(13, !0, this); | |
var h = A(I(d, "data-highcharts-chart")); | |
B(h) && t[h] && t[h].hasRendered && t[h].destroy(); | |
I(d, "data-highcharts-chart", this.index); | |
d.innerHTML = ""; | |
b.skipClone || d.offsetWidth || this.temporaryDisplay(); | |
this.getChartSize(); | |
h = this.chartWidth; | |
var n = this.chartHeight; | |
x(d, { | |
overflow: "hidden" | |
}); | |
this.styledMode || (f = q({ | |
position: "relative", | |
overflow: "hidden", | |
width: h + "px", | |
height: n + "px", | |
textAlign: "left", | |
lineHeight: "normal", | |
zIndex: 0, | |
"-webkit-tap-highlight-color": "rgba(0,0,0,0)" | |
}, b.style)); | |
this.container = d = p("div", { | |
id: g | |
}, f, d); | |
this._cursor = d.style.cursor; | |
this.renderer = | |
new(c[b.renderer] || c.Renderer)(d, h, n, null, b.forExport, a.exporting && a.exporting.allowHTML, this.styledMode); | |
this.setClassName(b.className); | |
if (this.styledMode) | |
for (e in a.defs) this.renderer.definition(a.defs[e]); | |
else this.renderer.setStyle(b.style); | |
this.renderer.chartIndex = this.index; | |
E(this, "afterGetContainer") | |
}, | |
getMargins: function(a) { | |
var b = this.spacing, | |
d = this.margin, | |
g = this.titleOffset; | |
this.resetMargins(); | |
g[0] && !G(d[0]) && (this.plotTop = Math.max(this.plotTop, g[0] + b[0])); | |
g[2] && !G(d[2]) && (this.marginBottom = | |
Math.max(this.marginBottom, g[2] + b[2])); | |
this.legend && this.legend.display && this.legend.adjustMargins(d, b); | |
E(this, "getMargins"); | |
a || this.getAxisMargins() | |
}, | |
getAxisMargins: function() { | |
var a = this, | |
b = a.axisOffset = [0, 0, 0, 0], | |
d = a.colorAxis, | |
g = a.margin, | |
c = function(a) { | |
a.forEach(function(a) { | |
a.visible && a.getOffset() | |
}) | |
}; | |
a.hasCartesianSeries ? c(a.axes) : d && d.length && c(d); | |
z.forEach(function(d, c) { | |
G(g[c]) || (a[d] += b[c]) | |
}); | |
a.setChartSize() | |
}, | |
reflow: function(a) { | |
var b = this, | |
g = b.options.chart, | |
f = b.renderTo, | |
e = G(g.width) && G(g.height), | |
h = g.width || c.getStyle(f, "width"); | |
g = g.height || c.getStyle(f, "height"); | |
f = a ? a.target : P; | |
if (!e && !b.isPrinting && h && g && (f === P || f === l)) { | |
if (h !== b.containerWidth || g !== b.containerHeight) c.clearTimeout(b.reflowTimeout), b.reflowTimeout = d(function() { | |
b.container && b.setSize(void 0, void 0, !1) | |
}, a ? 100 : 0); | |
b.containerWidth = h; | |
b.containerHeight = g | |
} | |
}, | |
setReflow: function(a) { | |
var b = this; | |
!1 === a || this.unbindReflow ? !1 === a && this.unbindReflow && (this.unbindReflow = this.unbindReflow()) : (this.unbindReflow = h(P, "resize", function(a) { | |
b.options && | |
b.reflow(a) | |
}), h(this, "destroy", this.unbindReflow)) | |
}, | |
setSize: function(a, g, c) { | |
var f = this, | |
e = f.renderer; | |
f.isResizing += 1; | |
b(c, f); | |
f.oldChartHeight = f.chartHeight; | |
f.oldChartWidth = f.chartWidth; | |
"undefined" !== typeof a && (f.options.chart.width = a); | |
"undefined" !== typeof g && (f.options.chart.height = g); | |
f.getChartSize(); | |
if (!f.styledMode) { | |
var h = e.globalAnimation; | |
(h ? k : x)(f.container, { | |
width: f.chartWidth + "px", | |
height: f.chartHeight + "px" | |
}, h) | |
} | |
f.setChartSize(!0); | |
e.setSize(f.chartWidth, f.chartHeight, c); | |
f.axes.forEach(function(a) { | |
a.isDirty = !0; | |
a.setScale() | |
}); | |
f.isDirtyLegend = !0; | |
f.isDirtyBox = !0; | |
f.layOutTitles(); | |
f.getMargins(); | |
f.redraw(c); | |
f.oldChartHeight = null; | |
E(f, "resize"); | |
d(function() { | |
f && E(f, "endResize", null, function() { | |
--f.isResizing | |
}) | |
}, F(h).duration || 0) | |
}, | |
setChartSize: function(a) { | |
var b = this.inverted, | |
d = this.renderer, | |
g = this.chartWidth, | |
c = this.chartHeight, | |
f = this.options.chart, | |
e = this.spacing, | |
h = this.clipOffset, | |
t, n, x, l; | |
this.plotLeft = t = Math.round(this.plotLeft); | |
this.plotTop = n = Math.round(this.plotTop); | |
this.plotWidth = x = Math.max(0, Math.round(g - | |
t - this.marginRight)); | |
this.plotHeight = l = Math.max(0, Math.round(c - n - this.marginBottom)); | |
this.plotSizeX = b ? l : x; | |
this.plotSizeY = b ? x : l; | |
this.plotBorderWidth = f.plotBorderWidth || 0; | |
this.spacingBox = d.spacingBox = { | |
x: e[3], | |
y: e[0], | |
width: g - e[3] - e[1], | |
height: c - e[0] - e[2] | |
}; | |
this.plotBox = d.plotBox = { | |
x: t, | |
y: n, | |
width: x, | |
height: l | |
}; | |
g = 2 * Math.floor(this.plotBorderWidth / 2); | |
b = Math.ceil(Math.max(g, h[3]) / 2); | |
d = Math.ceil(Math.max(g, h[0]) / 2); | |
this.clipBox = { | |
x: b, | |
y: d, | |
width: Math.floor(this.plotSizeX - Math.max(g, h[1]) / 2 - b), | |
height: Math.max(0, Math.floor(this.plotSizeY - | |
Math.max(g, h[2]) / 2 - d)) | |
}; | |
a || this.axes.forEach(function(a) { | |
a.setAxisSize(); | |
a.setAxisTranslation() | |
}); | |
E(this, "afterSetChartSize", { | |
skipAxes: a | |
}) | |
}, | |
resetMargins: function() { | |
E(this, "resetMargins"); | |
var a = this, | |
b = a.options.chart; | |
["margin", "spacing"].forEach(function(d) { | |
var g = b[d], | |
c = u(g) ? g : [g, g, g, g]; | |
["Top", "Right", "Bottom", "Left"].forEach(function(g, f) { | |
a[d][f] = D(b[d + g], c[f]) | |
}) | |
}); | |
z.forEach(function(b, d) { | |
a[b] = D(a.margin[d], a.spacing[d]) | |
}); | |
a.axisOffset = [0, 0, 0, 0]; | |
a.clipOffset = [0, 0, 0, 0] | |
}, | |
drawChartBox: function() { | |
var a = | |
this.options.chart, | |
b = this.renderer, | |
d = this.chartWidth, | |
g = this.chartHeight, | |
c = this.chartBackground, | |
f = this.plotBackground, | |
e = this.plotBorder, | |
h = this.styledMode, | |
t = this.plotBGImage, | |
n = a.backgroundColor, | |
x = a.plotBackgroundColor, | |
l = a.plotBackgroundImage, | |
p, k = this.plotLeft, | |
m = this.plotTop, | |
z = this.plotWidth, | |
L = this.plotHeight, | |
r = this.plotBox, | |
q = this.clipRect, | |
y = this.clipBox, | |
N = "animate"; | |
c || (this.chartBackground = c = b.rect().addClass("highcharts-background").add(), N = "attr"); | |
if (h) var u = p = c.strokeWidth(); | |
else { | |
u = a.borderWidth || | |
0; | |
p = u + (a.shadow ? 8 : 0); | |
n = { | |
fill: n || "none" | |
}; | |
if (u || c["stroke-width"]) n.stroke = a.borderColor, n["stroke-width"] = u; | |
c.attr(n).shadow(a.shadow) | |
} | |
c[N]({ | |
x: p / 2, | |
y: p / 2, | |
width: d - p - u % 2, | |
height: g - p - u % 2, | |
r: a.borderRadius | |
}); | |
N = "animate"; | |
f || (N = "attr", this.plotBackground = f = b.rect().addClass("highcharts-plot-background").add()); | |
f[N](r); | |
h || (f.attr({ | |
fill: x || "none" | |
}).shadow(a.plotShadow), l && (t ? (l !== t.attr("href") && t.attr("href", l), t.animate(r)) : this.plotBGImage = b.image(l, k, m, z, L).add())); | |
q ? q.animate({ | |
width: y.width, | |
height: y.height | |
}) : | |
this.clipRect = b.clipRect(y); | |
N = "animate"; | |
e || (N = "attr", this.plotBorder = e = b.rect().addClass("highcharts-plot-border").attr({ | |
zIndex: 1 | |
}).add()); | |
h || e.attr({ | |
stroke: a.plotBorderColor, | |
"stroke-width": a.plotBorderWidth || 0, | |
fill: "none" | |
}); | |
e[N](e.crisp({ | |
x: k, | |
y: m, | |
width: z, | |
height: L | |
}, -e.strokeWidth())); | |
this.isDirtyBox = !1; | |
E(this, "afterDrawChartBox") | |
}, | |
propFromSeries: function() { | |
var a = this, | |
b = a.options.chart, | |
d, g = a.options.series, | |
c, f; | |
["inverted", "angular", "polar"].forEach(function(e) { | |
d = T[b.type || b.defaultSeriesType]; | |
f = b[e] || | |
d && d.prototype[e]; | |
for (c = g && g.length; !f && c--;)(d = T[g[c].type]) && d.prototype[e] && (f = !0); | |
a[e] = f | |
}) | |
}, | |
linkSeries: function() { | |
var a = this, | |
b = a.series; | |
b.forEach(function(a) { | |
a.linkedSeries.length = 0 | |
}); | |
b.forEach(function(b) { | |
var d = b.options.linkedTo; | |
w(d) && (d = ":previous" === d ? a.series[b.index - 1] : a.get(d)) && d.linkedParent !== b && (d.linkedSeries.push(b), b.linkedParent = d, d.enabledDataSorting && b.setDataSortingOptions(), b.visible = D(b.options.visible, d.options.visible, b.visible)) | |
}); | |
E(this, "afterLinkSeries") | |
}, | |
renderSeries: function() { | |
this.series.forEach(function(a) { | |
a.translate(); | |
a.render() | |
}) | |
}, | |
renderLabels: function() { | |
var a = this, | |
b = a.options.labels; | |
b.items && b.items.forEach(function(d) { | |
var g = q(b.style, d.style), | |
c = A(g.left) + a.plotLeft, | |
f = A(g.top) + a.plotTop + 12; | |
delete g.left; | |
delete g.top; | |
a.renderer.text(d.html, c, f).attr({ | |
zIndex: 2 | |
}).css(g).add() | |
}) | |
}, | |
render: function() { | |
var a = this.axes, | |
b = this.colorAxis, | |
d = this.renderer, | |
g = this.options, | |
c = 0, | |
f = function(a) { | |
a.forEach(function(a) { | |
a.visible && a.render() | |
}) | |
}; | |
this.setTitle(); | |
this.legend = new n(this, g.legend); | |
this.getStacks && this.getStacks(); | |
this.getMargins(!0); | |
this.setChartSize(); | |
g = this.plotWidth; | |
a.some(function(a) { | |
if (a.horiz && a.visible && a.options.labels.enabled && a.series.length) return c = 21, !0 | |
}); | |
var e = this.plotHeight = Math.max(this.plotHeight - c, 0); | |
a.forEach(function(a) { | |
a.setScale() | |
}); | |
this.getAxisMargins(); | |
var h = 1.1 < g / this.plotWidth; | |
var t = 1.05 < e / this.plotHeight; | |
if (h || t) a.forEach(function(a) { | |
(a.horiz && h || !a.horiz && t) && a.setTickInterval(!0) | |
}), this.getMargins(); | |
this.drawChartBox(); | |
this.hasCartesianSeries ? f(a) : b && b.length && f(b); | |
this.seriesGroup || (this.seriesGroup = | |
d.g("series-group").attr({ | |
zIndex: 3 | |
}).add()); | |
this.renderSeries(); | |
this.renderLabels(); | |
this.addCredits(); | |
this.setResponsive && this.setResponsive(); | |
this.updateContainerScaling(); | |
this.hasRendered = !0 | |
}, | |
addCredits: function(a) { | |
var b = this; | |
a = N(!0, this.options.credits, a); | |
a.enabled && !this.credits && (this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() { | |
a.href && (P.location.href = a.href) | |
}).attr({ | |
align: a.position.align, | |
zIndex: 8 | |
}), b.styledMode || this.credits.css(a.style), | |
this.credits.add().align(a.position), this.credits.update = function(a) { | |
b.credits = b.credits.destroy(); | |
b.addCredits(a) | |
}) | |
}, | |
updateContainerScaling: function() { | |
var a = this.container; | |
if (a.offsetWidth && a.offsetHeight && a.getBoundingClientRect) { | |
var b = a.getBoundingClientRect(), | |
d = b.width / a.offsetWidth; | |
a = b.height / a.offsetHeight; | |
1 !== d || 1 !== a ? this.containerScaling = { | |
scaleX: d, | |
scaleY: a | |
} : delete this.containerScaling | |
} | |
}, | |
destroy: function() { | |
var a = this, | |
b = a.axes, | |
d = a.series, | |
g = a.container, | |
f, e = g && g.parentNode; | |
E(a, "destroy"); | |
a.renderer.forExport ? | |
v(t, a) : t[a.index] = void 0; | |
c.chartCount--; | |
a.renderTo.removeAttribute("data-highcharts-chart"); | |
V(a); | |
for (f = b.length; f--;) b[f] = b[f].destroy(); | |
this.scroller && this.scroller.destroy && this.scroller.destroy(); | |
for (f = d.length; f--;) d[f] = d[f].destroy(); | |
"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(b) { | |
var d = a[b]; | |
d && d.destroy && (a[b] = d.destroy()) | |
}); | |
g && (g.innerHTML = "", V(g), | |
e && H(g)); | |
r(a, function(b, d) { | |
delete a[d] | |
}) | |
}, | |
firstRender: function() { | |
var a = this, | |
b = a.options; | |
if (!a.isReadyToRender || a.isReadyToRender()) { | |
a.getContainer(); | |
a.resetMargins(); | |
a.setChartSize(); | |
a.propFromSeries(); | |
a.getAxes(); | |
(C(b.series) ? b.series : []).forEach(function(b) { | |
a.initSeries(b) | |
}); | |
a.linkSeries(); | |
a.setSeriesData(); | |
E(a, "beforeRender"); | |
O && (a.pointer = new O(a, b)); | |
a.render(); | |
if (!a.renderer.imgCount && a.onload) a.onload(); | |
a.temporaryDisplay(!0) | |
} | |
}, | |
onload: function() { | |
this.callbacks.concat([this.callback]).forEach(function(a) { | |
a && | |
"undefined" !== typeof this.index && a.apply(this, [this]) | |
}, this); | |
E(this, "load"); | |
E(this, "render"); | |
G(this.index) && this.setReflow(this.options.chart.reflow); | |
this.onload = null | |
} | |
}) | |
}); | |
M(J, "parts/ScrollablePlotArea.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.pick, | |
I = c.addEvent; | |
e = c.Chart; | |
""; | |
I(e, "afterSetChartSize", function(e) { | |
var G = this.options.chart.scrollablePlotArea, | |
v = G && G.minWidth; | |
G = G && G.minHeight; | |
if (!this.renderer.forExport) { | |
if (v) { | |
if (this.scrollablePixelsX = v = Math.max(0, v - this.chartWidth)) { | |
this.plotWidth += | |
v; | |
this.inverted ? (this.clipBox.height += v, this.plotBox.height += v) : (this.clipBox.width += v, this.plotBox.width += v); | |
var q = { | |
1: { | |
name: "right", | |
value: v | |
} | |
} | |
} | |
} else G && (this.scrollablePixelsY = v = Math.max(0, G - this.chartHeight)) && (this.plotHeight += v, this.inverted ? (this.clipBox.width += v, this.plotBox.width += v) : (this.clipBox.height += v, this.plotBox.height += v), q = { | |
2: { | |
name: "bottom", | |
value: v | |
} | |
}); | |
q && !e.skipAxes && this.axes.forEach(function(e) { | |
q[e.side] ? e.getPlotLinePath = function() { | |
var v = q[e.side].name, | |
u = this[v]; | |
this[v] = u - q[e.side].value; | |
var w = c.Axis.prototype.getPlotLinePath.apply(this, arguments); | |
this[v] = u; | |
return w | |
} : (e.setAxisSize(), e.setAxisTranslation()) | |
}) | |
} | |
}); | |
I(e, "render", function() { | |
this.scrollablePixelsX || this.scrollablePixelsY ? (this.setUpScrolling && this.setUpScrolling(), this.applyFixed()) : this.fixedDiv && this.applyFixed() | |
}); | |
e.prototype.setUpScrolling = function() { | |
var e = { | |
WebkitOverflowScrolling: "touch", | |
overflowX: "hidden", | |
overflowY: "hidden" | |
}; | |
this.scrollablePixelsX && (e.overflowX = "auto"); | |
this.scrollablePixelsY && (e.overflowY = "auto"); | |
this.scrollingContainer = c.createElement("div", { | |
className: "highcharts-scrolling" | |
}, e, this.renderTo); | |
this.innerContainer = c.createElement("div", { | |
className: "highcharts-inner-container" | |
}, null, this.scrollingContainer); | |
this.innerContainer.appendChild(this.container); | |
this.setUpScrolling = null | |
}; | |
e.prototype.moveFixedElements = function() { | |
var c = this.container, | |
e = this.fixedRenderer, | |
v = ".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-scrollbar .highcharts-subtitle .highcharts-title".split(" "), | |
q; | |
this.scrollablePixelsX && !this.inverted ? q = ".highcharts-yaxis" : this.scrollablePixelsX && this.inverted ? q = ".highcharts-xaxis" : this.scrollablePixelsY && !this.inverted ? q = ".highcharts-xaxis" : this.scrollablePixelsY && this.inverted && (q = ".highcharts-yaxis"); | |
v.push(q, q + "-labels"); | |
v.forEach(function(q) { | |
[].forEach.call(c.querySelectorAll(q), function(c) { | |
(c.namespaceURI === e.SVG_NS ? e.box : e.box.parentNode).appendChild(c); | |
c.style.pointerEvents = "auto" | |
}) | |
}) | |
}; | |
e.prototype.applyFixed = function() { | |
var e, H = !this.fixedDiv, | |
v = this.options.chart.scrollablePlotArea; | |
H ? (this.fixedDiv = c.createElement("div", { | |
className: "highcharts-fixed" | |
}, { | |
position: "absolute", | |
overflow: "hidden", | |
pointerEvents: "none", | |
zIndex: 2 | |
}, null, !0), this.renderTo.insertBefore(this.fixedDiv, this.renderTo.firstChild), this.renderTo.style.overflow = "visible", this.fixedRenderer = e = new c.Renderer(this.fixedDiv, this.chartWidth, this.chartHeight), this.scrollableMask = e.path().attr({ | |
fill: this.options.chart.backgroundColor || "#fff", | |
"fill-opacity": F(v.opacity, .85), | |
zIndex: -1 | |
}).addClass("highcharts-scrollable-mask").add(), | |
this.moveFixedElements(), I(this, "afterShowResetZoom", this.moveFixedElements), I(this, "afterLayOutTitles", this.moveFixedElements)) : this.fixedRenderer.setSize(this.chartWidth, this.chartHeight); | |
e = this.chartWidth + (this.scrollablePixelsX || 0); | |
var q = this.chartHeight + (this.scrollablePixelsY || 0); | |
c.stop(this.container); | |
this.container.style.width = e + "px"; | |
this.container.style.height = q + "px"; | |
this.renderer.boxWrapper.attr({ | |
width: e, | |
height: q, | |
viewBox: [0, 0, e, q].join(" ") | |
}); | |
this.chartBackground.attr({ | |
width: e, | |
height: q | |
}); | |
this.scrollablePixelsY && (this.scrollingContainer.style.height = this.chartHeight + "px"); | |
H && (v.scrollPositionX && (this.scrollingContainer.scrollLeft = this.scrollablePixelsX * v.scrollPositionX), v.scrollPositionY && (this.scrollingContainer.scrollTop = this.scrollablePixelsY * v.scrollPositionY)); | |
q = this.axisOffset; | |
H = this.plotTop - q[0] - 1; | |
v = this.plotLeft - q[3] - 1; | |
e = this.plotTop + this.plotHeight + q[2] + 1; | |
q = this.plotLeft + this.plotWidth + q[1] + 1; | |
var C = this.plotLeft + this.plotWidth - (this.scrollablePixelsX || 0), | |
B = this.plotTop + this.plotHeight - | |
(this.scrollablePixelsY || 0); | |
H = this.scrollablePixelsX ? ["M", 0, H, "L", this.plotLeft - 1, H, "L", this.plotLeft - 1, e, "L", 0, e, "Z", "M", C, H, "L", this.chartWidth, H, "L", this.chartWidth, e, "L", C, e, "Z"] : this.scrollablePixelsY ? ["M", v, 0, "L", v, this.plotTop - 1, "L", q, this.plotTop - 1, "L", q, 0, "Z", "M", v, B, "L", v, this.chartHeight, "L", q, this.chartHeight, "L", q, B, "Z"] : ["M", 0, 0]; | |
"adjustHeight" !== this.redrawTrigger && this.scrollableMask.attr({ | |
d: H | |
}) | |
} | |
}); | |
M(J, "parts/Point.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = | |
e.animObject, | |
I = e.defined, | |
G = e.erase, | |
H = e.extend, | |
v = e.isArray, | |
q = e.isNumber, | |
C = e.isObject, | |
B = e.syncTimeout, | |
u = e.pick, | |
w, m = c.fireEvent, | |
r = c.format, | |
D = c.uniqueKey, | |
A = c.removeEvent; | |
c.Point = w = function() {}; | |
c.Point.prototype = { | |
init: function(c, b, a) { | |
this.series = c; | |
this.applyOptions(b, a); | |
this.id = I(this.id) ? this.id : D(); | |
this.resolveColor(); | |
c.chart.pointCount++; | |
m(this, "afterInit"); | |
return this | |
}, | |
resolveColor: function() { | |
var c = this.series; | |
var b = c.chart.options.chart.colorCount; | |
var a = c.chart.styledMode; | |
a || this.options.color || (this.color = | |
c.color); | |
c.options.colorByPoint ? (a || (b = c.options.colors || c.chart.options.colors, this.color = this.color || b[c.colorCounter], b = b.length), a = c.colorCounter, c.colorCounter++, c.colorCounter === b && (c.colorCounter = 0)) : a = c.colorIndex; | |
this.colorIndex = u(this.colorIndex, a) | |
}, | |
applyOptions: function(c, b) { | |
var a = this.series, | |
d = a.options.pointValKey || a.pointValKey; | |
c = w.prototype.optionsToObject.call(this, c); | |
H(this, c); | |
this.options = this.options ? H(this.options, c) : c; | |
c.group && delete this.group; | |
c.dataLabels && delete this.dataLabels; | |
d && (this.y = this[d]); | |
this.formatPrefix = (this.isNull = u(this.isValid && !this.isValid(), null === this.x || !q(this.y))) ? "null" : "point"; | |
this.selected && (this.state = "select"); | |
"name" in this && "undefined" === typeof b && a.xAxis && a.xAxis.hasNames && (this.x = a.xAxis.nameToX(this)); | |
"undefined" === typeof this.x && a && (this.x = "undefined" === typeof b ? a.autoIncrement(this) : b); | |
return this | |
}, | |
setNestedProperty: function(c, b, a) { | |
a.split(".").reduce(function(a, c, f, e) { | |
a[c] = e.length - 1 === f ? b : C(a[c], !0) ? a[c] : {}; | |
return a[c] | |
}, c); | |
return c | |
}, | |
optionsToObject: function(f) { | |
var b = {}, | |
a = this.series, | |
d = a.options.keys, | |
e = d || a.pointArrayMap || ["y"], | |
k = e.length, | |
l = 0, | |
m = 0; | |
if (q(f) || null === f) b[e[0]] = f; | |
else if (v(f)) | |
for (!d && f.length > k && (a = typeof f[0], "string" === a ? b.name = f[0] : "number" === a && (b.x = f[0]), l++); m < k;) d && "undefined" === typeof f[l] || (0 < e[m].indexOf(".") ? c.Point.prototype.setNestedProperty(b, f[l], e[m]) : b[e[m]] = f[l]), l++, m++; | |
else "object" === typeof f && (b = f, f.dataLabels && (a._hasPointLabels = !0), f.marker && (a._hasPointMarkers = !0)); | |
return b | |
}, | |
getClassName: function() { | |
return "highcharts-point" + (this.selected ? | |
" highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + ("undefined" !== typeof this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ? " " + this.zone.className.replace("highcharts-negative", "") : "") | |
}, | |
getZone: function() { | |
var c = this.series, | |
b = c.zones; | |
c = c.zoneAxis || "y"; | |
var a = 0, | |
d; | |
for (d = b[a]; this[c] >= d.value;) d = b[++a]; | |
this.nonZonedColor || (this.nonZonedColor = this.color); | |
this.color = d && d.color && !this.options.color ? d.color : this.nonZonedColor; | |
return d | |
}, | |
hasNewShapeType: function() { | |
return (this.graphic && (this.graphic.symbolName || this.graphic.element.nodeName)) !== this.shapeType | |
}, | |
destroy: function() { | |
function c() { | |
e && (b.setState(), G(e, b), e.length || (d.hoverPoints = null)); | |
if (b === d.hoverPoint) b.onMouseOut(); | |
if (b.graphic || b.dataLabel || b.dataLabels) A(b), b.destroyElements(); | |
for (l in b) b[l] = null | |
} | |
var b = this, | |
a = b.series, | |
d = a.chart; | |
a = a.options.dataSorting; | |
var e = d.hoverPoints, | |
k = F(b.series.chart.renderer.globalAnimation), | |
l; | |
a && a.enabled ? (this.animateBeforeDestroy(), B(c, k.duration)) : c(); | |
d.pointCount--; | |
b.legendItem && d.legend.destroyItem(b) | |
}, | |
animateBeforeDestroy: function() { | |
var c = this, | |
b = { | |
x: c.startXPos, | |
opacity: 0 | |
}, | |
a, d = c.getGraphicalProps(); | |
d.singular.forEach(function(d) { | |
a = "dataLabel" === d; | |
c[d] = c[d].animate(a ? { | |
x: c[d].startXPos, | |
y: c[d].startYPos, | |
opacity: 0 | |
} : b) | |
}); | |
d.plural.forEach(function(a) { | |
c[a].forEach(function(a) { | |
a.element && a.animate(H({ | |
x: c.startXPos | |
}, a.startYPos ? { | |
x: a.startXPos, | |
y: a.startYPos | |
} : {})) | |
}) | |
}) | |
}, | |
destroyElements: function(c) { | |
var b = | |
this; | |
c = b.getGraphicalProps(c); | |
c.singular.forEach(function(a) { | |
b[a] = b[a].destroy() | |
}); | |
c.plural.forEach(function(a) { | |
b[a].forEach(function(a) { | |
a.element && a.destroy() | |
}); | |
delete b[a] | |
}) | |
}, | |
getGraphicalProps: function(c) { | |
var b = this, | |
a = [], | |
d, f = { | |
singular: [], | |
plural: [] | |
}; | |
c = c || { | |
graphic: 1, | |
dataLabel: 1 | |
}; | |
c.graphic && a.push("graphic", "shadowGroup"); | |
c.dataLabel && a.push("dataLabel", "dataLabelUpper", "connector"); | |
for (d = a.length; d--;) { | |
var e = a[d]; | |
b[e] && f.singular.push(e) | |
}["dataLabel", "connector"].forEach(function(a) { | |
var d = a + "s"; | |
c[a] && | |
b[d] && f.plural.push(d) | |
}); | |
return f | |
}, | |
getLabelConfig: function() { | |
return { | |
x: this.category, | |
y: this.y, | |
color: this.color, | |
colorIndex: this.colorIndex, | |
key: this.name || this.category, | |
series: this.series, | |
point: this, | |
percentage: this.percentage, | |
total: this.total || this.stackTotal | |
} | |
}, | |
tooltipFormatter: function(c) { | |
var b = this.series, | |
a = b.tooltipOptions, | |
d = u(a.valueDecimals, ""), | |
f = a.valuePrefix || "", | |
e = a.valueSuffix || ""; | |
b.chart.styledMode && (c = b.chart.tooltip.styledModeFormat(c)); | |
(b.pointArrayMap || ["y"]).forEach(function(a) { | |
a = "{point." + | |
a; | |
if (f || e) c = c.replace(RegExp(a + "}", "g"), f + a + "}" + e); | |
c = c.replace(RegExp(a + "}", "g"), a + ":,." + d + "f}") | |
}); | |
return r(c, { | |
point: this, | |
series: this.series | |
}, b.chart) | |
}, | |
firePointEvent: function(c, b, a) { | |
var d = this, | |
f = this.series.options; | |
(f.point.events[c] || d.options && d.options.events && d.options.events[c]) && this.importEvents(); | |
"click" === c && f.allowPointSelect && (a = function(a) { | |
d.select && d.select(null, a.ctrlKey || a.metaKey || a.shiftKey) | |
}); | |
m(this, c, b, a) | |
}, | |
visible: !0 | |
} | |
}); | |
M(J, "parts/Series.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], | |
function(c, e) { | |
var F = e.animObject, | |
I = e.arrayMax, | |
G = e.arrayMin, | |
H = e.clamp, | |
v = e.correctFloat, | |
q = e.defined, | |
C = e.erase, | |
B = e.extend, | |
u = e.isArray, | |
w = e.isNumber, | |
m = e.isString, | |
r = e.objectEach, | |
D = e.pick, | |
A = e.splat, | |
f = e.syncTimeout, | |
b = c.addEvent, | |
a = c.defaultOptions, | |
d = c.defaultPlotOptions, | |
h = c.fireEvent, | |
k = c.merge, | |
l = c.removeEvent, | |
y = c.SVGElement, | |
p = c.win; | |
c.Series = c.seriesType("line", null, { | |
lineWidth: 2, | |
allowPointSelect: !1, | |
showCheckbox: !1, | |
animation: { | |
duration: 1E3 | |
}, | |
events: {}, | |
marker: { | |
enabledThreshold: 2, | |
lineColor: "#ffffff", | |
lineWidth: 0, | |
radius: 4, | |
states: { | |
normal: { | |
animation: !0 | |
}, | |
hover: { | |
animation: { | |
duration: 50 | |
}, | |
enabled: !0, | |
radiusPlus: 2, | |
lineWidthPlus: 1 | |
}, | |
select: { | |
fillColor: "#cccccc", | |
lineColor: "#000000", | |
lineWidth: 2 | |
} | |
} | |
}, | |
point: { | |
events: {} | |
}, | |
dataLabels: { | |
align: "center", | |
formatter: function() { | |
var a = this.series.chart.numberFormatter; | |
return null === this.y ? "" : a(this.y, -1) | |
}, | |
padding: 5, | |
style: { | |
fontSize: "11px", | |
fontWeight: "bold", | |
color: "contrast", | |
textOutline: "1px contrast" | |
}, | |
verticalAlign: "bottom", | |
x: 0, | |
y: 0 | |
}, | |
cropThreshold: 300, | |
opacity: 1, | |
pointRange: 0, | |
softThreshold: !0, | |
states: { | |
normal: { | |
animation: !0 | |
}, | |
hover: { | |
animation: { | |
duration: 50 | |
}, | |
lineWidthPlus: 1, | |
marker: {}, | |
halo: { | |
size: 10, | |
opacity: .25 | |
} | |
}, | |
select: { | |
animation: { | |
duration: 0 | |
} | |
}, | |
inactive: { | |
animation: { | |
duration: 50 | |
}, | |
opacity: .2 | |
} | |
}, | |
stickyTracking: !0, | |
turboThreshold: 1E3, | |
findNearestPointBy: "x" | |
}, { | |
axisTypes: ["xAxis", "yAxis"], | |
coll: "series", | |
colorCounter: 0, | |
cropShoulder: 1, | |
directTouch: !1, | |
eventsToUnbind: [], | |
isCartesian: !0, | |
parallelArrays: ["x", "y"], | |
pointClass: c.Point, | |
requireSorting: !0, | |
sorted: !0, | |
init: function(a, d) { | |
h(this, "init", { | |
options: d | |
}); | |
var g = this, | |
f = a.series, | |
e; | |
this.eventOptions = this.eventOptions || {}; | |
g.chart = a; | |
g.options = d = g.setOptions(d); | |
g.linkedSeries = []; | |
g.bindAxes(); | |
B(g, { | |
name: d.name, | |
state: "", | |
visible: !1 !== d.visible, | |
selected: !0 === d.selected | |
}); | |
var t = d.events; | |
r(t, function(a, d) { | |
c.isFunction(a) && g.eventOptions[d] !== a && (c.isFunction(g.eventOptions[d]) && l(g, d, g.eventOptions[d]), g.eventOptions[d] = a, b(g, d, a)) | |
}); | |
if (t && t.click || d.point && d.point.events && d.point.events.click || d.allowPointSelect) a.runTrackerClick = !0; | |
g.getColor(); | |
g.getSymbol(); | |
g.parallelArrays.forEach(function(a) { | |
g[a + | |
"Data"] || (g[a + "Data"] = []) | |
}); | |
g.isCartesian && (a.hasCartesianSeries = !0); | |
f.length && (e = f[f.length - 1]); | |
g._i = D(e && e._i, -1) + 1; | |
a.orderSeries(this.insert(f)); | |
d.dataSorting && d.dataSorting.enabled ? g.setDataSortingOptions() : g.points || g.data || g.setData(d.data, !1); | |
h(this, "afterInit") | |
}, | |
insert: function(a) { | |
var b = this.options.index, | |
d; | |
if (w(b)) { | |
for (d = a.length; d--;) | |
if (b >= D(a[d].options.index, a[d]._i)) { | |
a.splice(d + 1, 0, this); | |
break | |
} - 1 === d && a.unshift(this); | |
d += 1 | |
} else a.push(this); | |
return D(d, a.length - 1) | |
}, | |
bindAxes: function() { | |
var a = | |
this, | |
b = a.options, | |
d = a.chart, | |
f; | |
h(this, "bindAxes", null, function() { | |
(a.axisTypes || []).forEach(function(g) { | |
d[g].forEach(function(d) { | |
f = d.options; | |
if (b[g] === f.index || "undefined" !== typeof b[g] && b[g] === f.id || "undefined" === typeof b[g] && 0 === f.index) a.insert(d.series), a[g] = d, d.isDirty = !0 | |
}); | |
a[g] || a.optionalAxis === g || c.error(18, !0, d) | |
}) | |
}) | |
}, | |
updateParallelArrays: function(a, b) { | |
var d = a.series, | |
c = arguments, | |
g = w(b) ? function(c) { | |
var g = "y" === c && d.toYData ? d.toYData(a) : a[c]; | |
d[c + "Data"][b] = g | |
} : function(a) { | |
Array.prototype[b].apply(d[a + | |
"Data"], Array.prototype.slice.call(c, 2)) | |
}; | |
d.parallelArrays.forEach(g) | |
}, | |
hasData: function() { | |
return this.visible && "undefined" !== typeof this.dataMax && "undefined" !== typeof this.dataMin || this.visible && this.yData && 0 < this.yData.length | |
}, | |
autoIncrement: function() { | |
var a = this.options, | |
b = this.xIncrement, | |
d, c = a.pointIntervalUnit, | |
f = this.chart.time; | |
b = D(b, a.pointStart, 0); | |
this.pointInterval = d = D(this.pointInterval, a.pointInterval, 1); | |
c && (a = new f.Date(b), "day" === c ? f.set("Date", a, f.get("Date", a) + d) : "month" === c ? f.set("Month", | |
a, f.get("Month", a) + d) : "year" === c && f.set("FullYear", a, f.get("FullYear", a) + d), d = a.getTime() - b); | |
this.xIncrement = b + d; | |
return b | |
}, | |
setDataSortingOptions: function() { | |
var a = this.options; | |
B(this, { | |
requireSorting: !1, | |
sorted: !1, | |
enabledDataSorting: !0, | |
allowDG: !1 | |
}); | |
q(a.pointRange) || (a.pointRange = 1) | |
}, | |
setOptions: function(b) { | |
var d = this.chart, | |
c = d.options, | |
g = c.plotOptions, | |
f = d.userOptions || {}; | |
b = k(b); | |
d = d.styledMode; | |
var e = { | |
plotOptions: g, | |
userOptions: b | |
}; | |
h(this, "setOptions", e); | |
var l = e.plotOptions[this.type], | |
p = f.plotOptions || {}; | |
this.userOptions = e.userOptions; | |
f = k(l, g.series, f.plotOptions && f.plotOptions[this.type], b); | |
this.tooltipOptions = k(a.tooltip, a.plotOptions.series && a.plotOptions.series.tooltip, a.plotOptions[this.type].tooltip, c.tooltip.userOptions, g.series && g.series.tooltip, g[this.type].tooltip, b.tooltip); | |
this.stickyTracking = D(b.stickyTracking, p[this.type] && p[this.type].stickyTracking, p.series && p.series.stickyTracking, this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : f.stickyTracking); | |
null === l.marker && delete f.marker; | |
this.zoneAxis = f.zoneAxis; | |
c = this.zones = (f.zones || []).slice(); | |
!f.negativeColor && !f.negativeFillColor || f.zones || (g = { | |
value: f[this.zoneAxis + "Threshold"] || f.threshold || 0, | |
className: "highcharts-negative" | |
}, d || (g.color = f.negativeColor, g.fillColor = f.negativeFillColor), c.push(g)); | |
c.length && q(c[c.length - 1].value) && c.push(d ? {} : { | |
color: this.color, | |
fillColor: this.fillColor | |
}); | |
h(this, "afterSetOptions", { | |
options: f | |
}); | |
return f | |
}, | |
getName: function() { | |
return D(this.options.name, "Series " + (this.index + 1)) | |
}, | |
getCyclic: function(a, | |
b, d) { | |
var c = this.chart, | |
g = this.userOptions, | |
f = a + "Index", | |
e = a + "Counter", | |
h = d ? d.length : D(c.options.chart[a + "Count"], c[a + "Count"]); | |
if (!b) { | |
var t = D(g[f], g["_" + f]); | |
q(t) || (c.series.length || (c[e] = 0), g["_" + f] = t = c[e] % h, c[e] += 1); | |
d && (b = d[t]) | |
} | |
"undefined" !== typeof t && (this[f] = t); | |
this[a] = b | |
}, | |
getColor: function() { | |
this.chart.styledMode ? this.getCyclic("color") : this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || d[this.type].color, this.chart.options.colors) | |
}, | |
getSymbol: function() { | |
this.getCyclic("symbol", | |
this.options.marker.symbol, this.chart.options.symbols) | |
}, | |
findPointIndex: function(a, b) { | |
var d = a.id, | |
g = a.x, | |
f = this.points, | |
e, h = this.options.dataSorting; | |
if (d) var t = this.chart.get(d); | |
else if (this.linkedParent || this.enabledDataSorting) { | |
var l = h && h.matchByName ? "name" : "index"; | |
t = c.find(f, function(b) { | |
return !b.touched && b[l] === a[l] | |
}); | |
if (!t) return | |
} | |
if (t) { | |
var p = t && t.index; | |
"undefined" !== typeof p && (e = !0) | |
} | |
"undefined" === typeof p && w(g) && (p = this.xData.indexOf(g, b)); - 1 !== p && "undefined" !== typeof p && this.cropped && (p = p >= this.cropStart ? | |
p - this.cropStart : p); | |
!e && f[p] && f[p].touched && (p = void 0); | |
return p | |
}, | |
drawLegendSymbol: c.LegendSymbolMixin.drawLineMarker, | |
updateData: function(a, b) { | |
var d = this.options, | |
c = d.dataSorting, | |
g = this.points, | |
f = [], | |
e, h, t, l = this.requireSorting, | |
p = a.length === g.length, | |
m = !0; | |
this.xIncrement = null; | |
a.forEach(function(a, b) { | |
var h = q(a) && this.pointClass.prototype.optionsToObject.call({ | |
series: this | |
}, a) || {}; | |
var n = h.x; | |
if (h.id || w(n)) { | |
if (n = this.findPointIndex(h, t), -1 === n || "undefined" === typeof n ? f.push(a) : g[n] && a !== d.data[n] ? (g[n].update(a, !1, null, !1), g[n].touched = !0, l && (t = n + 1)) : g[n] && (g[n].touched = !0), !p || b !== n || c && c.enabled || this.hasDerivedData) e = !0 | |
} else f.push(a) | |
}, this); | |
if (e) | |
for (a = g.length; a--;)(h = g[a]) && !h.touched && h.remove && h.remove(!1, b); | |
else !p || c && c.enabled ? m = !1 : (a.forEach(function(a, b) { | |
g[b].update && a !== g[b].y && g[b].update(a, !1, null, !1) | |
}), f.length = 0); | |
g.forEach(function(a) { | |
a && (a.touched = !1) | |
}); | |
if (!m) return !1; | |
f.forEach(function(a) { | |
this.addPoint(a, !1, null, null, !1) | |
}, this); | |
null === this.xIncrement && this.xData && this.xData.length && (this.xIncrement = | |
I(this.xData), this.autoIncrement()); | |
return !0 | |
}, | |
setData: function(a, b, d, f) { | |
var g = this, | |
e = g.points, | |
h = e && e.length || 0, | |
t, l = g.options, | |
p = g.chart, | |
x = l.dataSorting, | |
k = null, | |
r = g.xAxis; | |
k = l.turboThreshold; | |
var L = this.xData, | |
q = this.yData, | |
y = (t = g.pointArrayMap) && t.length, | |
v = l.keys, | |
A = 0, | |
B = 1, | |
C; | |
a = a || []; | |
t = a.length; | |
b = D(b, !0); | |
x && x.enabled && (a = this.sortData(a)); | |
!1 !== f && t && h && !g.cropped && !g.hasGroupedData && g.visible && !g.isSeriesBoosting && (C = this.updateData(a, d)); | |
if (!C) { | |
g.xIncrement = null; | |
g.colorCounter = 0; | |
this.parallelArrays.forEach(function(a) { | |
g[a + | |
"Data"].length = 0 | |
}); | |
if (k && t > k) | |
if (k = g.getFirstValidPoint(a), w(k)) | |
for (d = 0; d < t; d++) L[d] = this.autoIncrement(), q[d] = a[d]; | |
else if (u(k)) | |
if (y) | |
for (d = 0; d < t; d++) f = a[d], L[d] = f[0], q[d] = f.slice(1, y + 1); | |
else | |
for (v && (A = v.indexOf("x"), B = v.indexOf("y"), A = 0 <= A ? A : 0, B = 0 <= B ? B : 1), d = 0; d < t; d++) f = a[d], L[d] = f[A], q[d] = f[B]; | |
else c.error(12, !1, p); | |
else | |
for (d = 0; d < t; d++) "undefined" !== typeof a[d] && (f = { | |
series: g | |
}, g.pointClass.prototype.applyOptions.apply(f, [a[d]]), g.updateParallelArrays(f, d)); | |
q && m(q[0]) && c.error(14, !0, p); | |
g.data = []; | |
g.options.data = | |
g.userOptions.data = a; | |
for (d = h; d--;) e[d] && e[d].destroy && e[d].destroy(); | |
r && (r.minRange = r.userMinRange); | |
g.isDirty = p.isDirtyBox = !0; | |
g.isDirtyData = !!e; | |
d = !1 | |
} | |
"point" === l.legendType && (this.processData(), this.generatePoints()); | |
b && p.redraw(d) | |
}, | |
sortData: function(a) { | |
var b = this, | |
d = b.options.dataSorting.sortKey || "y", | |
c = function(a, b) { | |
return q(b) && a.pointClass.prototype.optionsToObject.call({ | |
series: a | |
}, b) || {} | |
}; | |
a.forEach(function(d, g) { | |
a[g] = c(b, d); | |
a[g].index = g | |
}, this); | |
a.concat().sort(function(a, b) { | |
return w(b[d]) ? b[d] - a[d] : | |
-1 | |
}).forEach(function(a, b) { | |
a.x = b | |
}, this); | |
b.linkedSeries && b.linkedSeries.forEach(function(b) { | |
var d = b.options, | |
g = d.data; | |
d.dataSorting && d.dataSorting.enabled || !g || (g.forEach(function(d, f) { | |
g[f] = c(b, d); | |
a[f] && (g[f].x = a[f].x, g[f].index = f) | |
}), b.setData(g, !1)) | |
}); | |
return a | |
}, | |
processData: function(a) { | |
var b = this.xData, | |
d = this.yData, | |
g = b.length; | |
var f = 0; | |
var e = this.xAxis, | |
h = this.options; | |
var l = h.cropThreshold; | |
var p = this.getExtremesFromAll || h.getExtremesFromAll, | |
m = this.isCartesian; | |
h = e && e.val2lin; | |
var k = e && e.isLog, | |
r = this.requireSorting; | |
if (m && !this.isDirty && !e.isDirty && !this.yAxis.isDirty && !a) return !1; | |
if (e) { | |
a = e.getExtremes(); | |
var q = a.min; | |
var y = a.max | |
} | |
if (m && this.sorted && !p && (!l || g > l || this.forceCrop)) | |
if (b[g - 1] < q || b[0] > y) b = [], d = []; | |
else if (this.yData && (b[0] < q || b[g - 1] > y)) { | |
f = this.cropData(this.xData, this.yData, q, y); | |
b = f.xData; | |
d = f.yData; | |
f = f.start; | |
var u = !0 | |
} | |
for (l = b.length || 1; --l;) | |
if (g = k ? h(b[l]) - h(b[l - 1]) : b[l] - b[l - 1], 0 < g && ("undefined" === typeof w || g < w)) var w = g; | |
else 0 > g && r && (c.error(15, !1, this.chart), r = !1); | |
this.cropped = u; | |
this.cropStart = f; | |
this.processedXData = | |
b; | |
this.processedYData = d; | |
this.closestPointRange = this.basePointRange = w | |
}, | |
cropData: function(a, b, d, c, f) { | |
var g = a.length, | |
e = 0, | |
h = g, | |
t; | |
f = D(f, this.cropShoulder); | |
for (t = 0; t < g; t++) | |
if (a[t] >= d) { | |
e = Math.max(0, t - f); | |
break | |
} | |
for (d = t; d < g; d++) | |
if (a[d] > c) { | |
h = d + f; | |
break | |
} | |
return { | |
xData: a.slice(e, h), | |
yData: b.slice(e, h), | |
start: e, | |
end: h | |
} | |
}, | |
generatePoints: function() { | |
var a = this.options, | |
b = a.data, | |
d = this.data, | |
c, f = this.processedXData, | |
e = this.processedYData, | |
l = this.pointClass, | |
p = f.length, | |
m = this.cropStart || 0, | |
k = this.hasGroupedData; | |
a = a.keys; | |
var r = [], | |
q; | |
d || k || (d = [], d.length = b.length, d = this.data = d); | |
a && k && (this.options.keys = !1); | |
for (q = 0; q < p; q++) { | |
var y = m + q; | |
if (k) { | |
var u = (new l).init(this, [f[q]].concat(A(e[q]))); | |
u.dataGroup = this.groupMap[q]; | |
u.dataGroup.options && (u.options = u.dataGroup.options, B(u, u.dataGroup.options), delete u.dataLabels) | |
} else(u = d[y]) || "undefined" === typeof b[y] || (d[y] = u = (new l).init(this, b[y], f[q])); | |
u && (u.index = y, r[q] = u) | |
} | |
this.options.keys = a; | |
if (d && (p !== (c = d.length) || k)) | |
for (q = 0; q < c; q++) q !== m || k || (q += p), d[q] && (d[q].destroyElements(), d[q].plotX = | |
void 0); | |
this.data = d; | |
this.points = r; | |
h(this, "afterGeneratePoints") | |
}, | |
getXExtremes: function(a) { | |
return { | |
min: G(a), | |
max: I(a) | |
} | |
}, | |
getExtremes: function(a) { | |
var b = this.xAxis, | |
d = this.yAxis, | |
c = this.processedXData || this.xData, | |
g = [], | |
f = 0, | |
e = 0; | |
var l = 0; | |
var p = this.requireSorting ? this.cropShoulder : 0, | |
m = d ? d.positiveValuesOnly : !1, | |
k; | |
a = a || this.stackedYData || this.processedYData || []; | |
d = a.length; | |
b && (l = b.getExtremes(), e = l.min, l = l.max); | |
for (k = 0; k < d; k++) { | |
var r = c[k]; | |
var q = a[k]; | |
var y = (w(q) || u(q)) && (q.length || 0 < q || !m); | |
r = this.getExtremesFromAll || | |
this.options.getExtremesFromAll || this.cropped || !b || (c[k + p] || r) >= e && (c[k - p] || r) <= l; | |
if (y && r) | |
if (y = q.length) | |
for (; y--;) w(q[y]) && (g[f++] = q[y]); | |
else g[f++] = q | |
} | |
this.dataMin = G(g); | |
this.dataMax = I(g); | |
h(this, "afterGetExtremes") | |
}, | |
getFirstValidPoint: function(a) { | |
for (var b = null, d = a.length, c = 0; null === b && c < d;) b = a[c], c++; | |
return b | |
}, | |
translate: function() { | |
this.processedXData || this.processData(); | |
this.generatePoints(); | |
var a = this.options, | |
b = a.stacking, | |
d = this.xAxis, | |
c = d.categories, | |
f = this.enabledDataSorting, | |
e = this.yAxis, | |
l = this.points, | |
p = l.length, | |
k = !!this.modifyValue, | |
m, r = this.pointPlacementToXValue(), | |
y = w(r), | |
A = a.threshold, | |
B = a.startFromThreshold ? A : 0, | |
C, G = this.zoneAxis || "y", | |
I = Number.MAX_VALUE; | |
for (m = 0; m < p; m++) { | |
var F = l[m], | |
J = F.x; | |
var W = F.y; | |
var M = F.low, | |
Z = b && e.stacks[(this.negStacks && W < (B ? 0 : A) ? "-" : "") + this.stackKey]; | |
e.positiveValuesOnly && null !== W && 0 >= W && (F.isNull = !0); | |
F.plotX = C = v(H(d.translate(J, 0, 0, 0, 1, r, "flags" === this.type), -1E5, 1E5)); | |
if (b && this.visible && Z && Z[J]) { | |
var S = this.getStackIndicator(S, J, this.index); | |
if (!F.isNull) { | |
var Y = Z[J]; | |
var ba = | |
Y.points[S.key] | |
} | |
} | |
u(ba) && (M = ba[0], W = ba[1], M === B && S.key === Z[J].base && (M = D(w(A) && A, e.min)), e.positiveValuesOnly && 0 >= M && (M = null), F.total = F.stackTotal = Y.total, F.percentage = Y.total && F.y / Y.total * 100, F.stackY = W, this.irregularWidths || Y.setOffset(this.pointXOffset || 0, this.barW || 0)); | |
F.yBottom = q(M) ? H(e.translate(M, 0, 1, 0, 1), -1E5, 1E5) : null; | |
k && (W = this.modifyValue(W, F)); | |
F.plotY = W = "number" === typeof W && Infinity !== W ? H(e.translate(W, 0, 1, 0, 1), -1E5, 1E5) : void 0; | |
F.isInside = "undefined" !== typeof W && 0 <= W && W <= e.len && 0 <= C && C <= | |
d.len; | |
F.clientX = y ? v(d.translate(J, 0, 0, 0, 1, r)) : C; | |
F.negative = F[G] < (a[G + "Threshold"] || A || 0); | |
F.category = c && "undefined" !== typeof c[F.x] ? c[F.x] : F.x; | |
if (!F.isNull && !1 !== F.visible) { | |
"undefined" !== typeof ca && (I = Math.min(I, Math.abs(C - ca))); | |
var ca = C | |
} | |
F.zone = this.zones.length && F.getZone(); | |
!F.graphic && this.group && f && (F.isNew = !0) | |
} | |
this.closestPointRangePx = I; | |
h(this, "afterTranslate") | |
}, | |
getValidPoints: function(a, b, d) { | |
var c = this.chart; | |
return (a || this.points || []).filter(function(a) { | |
return b && !c.isInsidePlot(a.plotX, a.plotY, | |
c.inverted) ? !1 : !1 !== a.visible && (d || !a.isNull) | |
}) | |
}, | |
getClipBox: function(a, b) { | |
var d = this.options, | |
c = this.chart, | |
g = c.inverted, | |
f = this.xAxis, | |
e = f && this.yAxis; | |
a && !1 === d.clip && e ? a = g ? { | |
y: -c.chartWidth + e.len + e.pos, | |
height: c.chartWidth, | |
width: c.chartHeight, | |
x: -c.chartHeight + f.len + f.pos | |
} : { | |
y: -e.pos, | |
height: c.chartHeight, | |
width: c.chartWidth, | |
x: -f.pos | |
} : (a = this.clipBox || c.clipBox, b && (a.width = c.plotSizeX, a.x = 0)); | |
return b ? { | |
width: a.width, | |
x: a.x | |
} : a | |
}, | |
setClip: function(a) { | |
var b = this.chart, | |
d = this.options, | |
c = b.renderer, | |
g = b.inverted, | |
f = | |
this.clipBox, | |
e = this.getClipBox(a), | |
h = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, e.height, d.xAxis, d.yAxis].join(), | |
l = b[h], | |
p = b[h + "m"]; | |
l || (a && (e.width = 0, g && (e.x = b.plotSizeX + (!1 !== d.clip ? 0 : b.plotTop)), b[h + "m"] = p = c.clipRect(g ? b.plotSizeX + 99 : -99, g ? -b.plotLeft : -b.plotTop, 99, g ? b.chartWidth : b.chartHeight)), b[h] = l = c.clipRect(e), l.count = { | |
length: 0 | |
}); | |
a && !l.count[this.index] && (l.count[this.index] = !0, l.count.length += 1); | |
if (!1 !== d.clip || a) this.group.clip(a || f ? l : b.clipRect), this.markerGroup.clip(p), | |
this.sharedClipKey = h; | |
a || (l.count[this.index] && (delete l.count[this.index], --l.count.length), 0 === l.count.length && h && b[h] && (f || (b[h] = b[h].destroy()), b[h + "m"] && (b[h + "m"] = b[h + "m"].destroy()))) | |
}, | |
animate: function(a) { | |
var b = this.chart, | |
d = F(this.options.animation); | |
if (a) this.setClip(d); | |
else { | |
var c = this.sharedClipKey; | |
a = b[c]; | |
var g = this.getClipBox(d, !0); | |
a && a.animate(g, d); | |
b[c + "m"] && b[c + "m"].animate({ | |
width: g.width + 99, | |
x: g.x - (b.inverted ? 0 : 99) | |
}, d); | |
this.animate = null | |
} | |
}, | |
afterAnimate: function() { | |
this.setClip(); | |
h(this, "afterAnimate"); | |
this.finishedAnimating = !0 | |
}, | |
drawPoints: function() { | |
var a = this.points, | |
b = this.chart, | |
d, c, f = this.options.marker, | |
e = this[this.specialGroup] || this.markerGroup, | |
h = this.xAxis, | |
l = D(f.enabled, !h || h.isRadial ? !0 : null, this.closestPointRangePx >= f.enabledThreshold * f.radius); | |
if (!1 !== f.enabled || this._hasPointMarkers) | |
for (d = 0; d < a.length; d++) { | |
var p = a[d]; | |
var m = (c = p.graphic) ? "animate" : "attr"; | |
var k = p.marker || {}; | |
var r = !!p.marker; | |
if ((l && "undefined" === typeof k.enabled || k.enabled) && !p.isNull && !1 !== p.visible) { | |
var q = D(k.symbol, this.symbol); | |
var y = this.markerAttribs(p, p.selected && "select"); | |
this.enabledDataSorting && (p.startXPos = h.reversed ? -y.width : h.width); | |
var u = !1 !== p.isInside; | |
c ? c[u ? "show" : "hide"](u).animate(y) : u && (0 < y.width || p.hasImage) && (p.graphic = c = b.renderer.symbol(q, y.x, y.y, y.width, y.height, r ? k : f).add(e), this.enabledDataSorting && b.hasRendered && (c.attr({ | |
x: p.startXPos | |
}), m = "animate")); | |
c && "animate" === m && c[u ? "show" : "hide"](u).animate(y); | |
if (c && !b.styledMode) c[m](this.pointAttribs(p, p.selected && "select")); | |
c && c.addClass(p.getClassName(), !0) | |
} else c && (p.graphic = c.destroy()) | |
} | |
}, | |
markerAttribs: function(a, b) { | |
var d = this.options.marker, | |
c = a.marker || {}, | |
g = c.symbol || d.symbol, | |
f = D(c.radius, d.radius); | |
b && (d = d.states[b], b = c.states && c.states[b], f = D(b && b.radius, d && d.radius, f + (d && d.radiusPlus || 0))); | |
a.hasImage = g && 0 === g.indexOf("url"); | |
a.hasImage && (f = 0); | |
a = { | |
x: Math.floor(a.plotX) - f, | |
y: a.plotY - f | |
}; | |
f && (a.width = a.height = 2 * f); | |
return a | |
}, | |
pointAttribs: function(a, b) { | |
var d = this.options.marker, | |
c = a && a.options, | |
g = c && c.marker || {}, | |
f = this.color, | |
e = c && c.color, | |
h = a && a.color; | |
c = | |
D(g.lineWidth, d.lineWidth); | |
var l = a && a.zone && a.zone.color; | |
a = 1; | |
f = e || l || h || f; | |
e = g.fillColor || d.fillColor || f; | |
f = g.lineColor || d.lineColor || f; | |
b = b || "normal"; | |
d = d.states[b]; | |
b = g.states && g.states[b] || {}; | |
c = D(b.lineWidth, d.lineWidth, c + D(b.lineWidthPlus, d.lineWidthPlus, 0)); | |
e = b.fillColor || d.fillColor || e; | |
f = b.lineColor || d.lineColor || f; | |
a = D(b.opacity, d.opacity, a); | |
return { | |
stroke: f, | |
"stroke-width": c, | |
fill: e, | |
opacity: a | |
} | |
}, | |
destroy: function(a) { | |
var b = this, | |
d = b.chart, | |
g = /AppleWebKit\/533/.test(p.navigator.userAgent), | |
f, e, l = b.data || [], | |
k, m; | |
h(b, "destroy"); | |
this.removeEvents(a); | |
(b.axisTypes || []).forEach(function(a) { | |
(m = b[a]) && m.series && (C(m.series, b), m.isDirty = m.forceRedraw = !0) | |
}); | |
b.legendItem && b.chart.legend.destroyItem(b); | |
for (e = l.length; e--;)(k = l[e]) && k.destroy && k.destroy(); | |
b.points = null; | |
c.clearTimeout(b.animationTimeout); | |
r(b, function(a, b) { | |
a instanceof y && !a.survive && (f = g && "group" === b ? "hide" : "destroy", a[f]()) | |
}); | |
d.hoverSeries === b && (d.hoverSeries = null); | |
C(d.series, b); | |
d.orderSeries(); | |
r(b, function(d, c) { | |
a && "hcEvents" === c || delete b[c] | |
}) | |
}, | |
getGraphPath: function(a, b, d) { | |
var c = this, | |
f = c.options, | |
g = f.step, | |
e, h = [], | |
l = [], | |
p; | |
a = a || c.points; | |
(e = a.reversed) && a.reverse(); | |
(g = { | |
right: 1, | |
center: 2 | |
}[g] || g && 3) && e && (g = 4 - g); | |
a = this.getValidPoints(a, !1, !(f.connectNulls && !b && !d)); | |
a.forEach(function(e, n) { | |
var t = e.plotX, | |
m = e.plotY, | |
k = a[n - 1]; | |
(e.leftCliff || k && k.rightCliff) && !d && (p = !0); | |
e.isNull && !q(b) && 0 < n ? p = !f.connectNulls : e.isNull && !b ? p = !0 : (0 === n || p ? n = ["M", e.plotX, e.plotY] : c.getPointSpline ? n = c.getPointSpline(a, e, n) : g ? (n = 1 === g ? ["L", k.plotX, m] : 2 === g ? ["L", (k.plotX + t) / 2, | |
k.plotY, "L", (k.plotX + t) / 2, m | |
] : ["L", t, k.plotY], n.push("L", t, m)) : n = ["L", t, m], l.push(e.x), g && (l.push(e.x), 2 === g && l.push(e.x)), h.push.apply(h, n), p = !1) | |
}); | |
h.xMap = l; | |
return c.graphPath = h | |
}, | |
drawGraph: function() { | |
var a = this, | |
b = this.options, | |
d = (this.gappedPath || this.getGraphPath).call(this), | |
c = this.chart.styledMode, | |
f = [ | |
["graph", "highcharts-graph"] | |
]; | |
c || f[0].push(b.lineColor || this.color || "#cccccc", b.dashStyle); | |
f = a.getZonesGraphs(f); | |
f.forEach(function(f, g) { | |
var e = f[0], | |
h = a[e], | |
l = h ? "animate" : "attr"; | |
h ? (h.endX = a.preventGraphAnimation ? | |
null : d.xMap, h.animate({ | |
d: d | |
})) : d.length && (a[e] = h = a.chart.renderer.path(d).addClass(f[1]).attr({ | |
zIndex: 1 | |
}).add(a.group)); | |
h && !c && (e = { | |
stroke: f[2], | |
"stroke-width": b.lineWidth, | |
fill: a.fillGraph && a.color || "none" | |
}, f[3] ? e.dashstyle = f[3] : "square" !== b.linecap && (e["stroke-linecap"] = e["stroke-linejoin"] = "round"), h[l](e).shadow(2 > g && b.shadow)); | |
h && (h.startX = d.xMap, h.isArea = d.isArea) | |
}) | |
}, | |
getZonesGraphs: function(a) { | |
this.zones.forEach(function(b, d) { | |
d = ["zone-graph-" + d, "highcharts-graph highcharts-zone-graph-" + d + " " + (b.className || | |
"")]; | |
this.chart.styledMode || d.push(b.color || this.color, b.dashStyle || this.options.dashStyle); | |
a.push(d) | |
}, this); | |
return a | |
}, | |
applyZones: function() { | |
var a = this, | |
b = this.chart, | |
d = b.renderer, | |
c = this.zones, | |
f, e, h = this.clips || [], | |
l, p = this.graph, | |
k = this.area, | |
m = Math.max(b.chartWidth, b.chartHeight), | |
r = this[(this.zoneAxis || "y") + "Axis"], | |
q = b.inverted, | |
y, u, w, v = !1; | |
if (c.length && (p || k) && r && "undefined" !== typeof r.min) { | |
var A = r.reversed; | |
var C = r.horiz; | |
p && !this.showLine && p.hide(); | |
k && k.hide(); | |
var B = r.getExtremes(); | |
c.forEach(function(c, | |
g) { | |
f = A ? C ? b.plotWidth : 0 : C ? 0 : r.toPixels(B.min) || 0; | |
f = H(D(e, f), 0, m); | |
e = H(Math.round(r.toPixels(D(c.value, B.max), !0) || 0), 0, m); | |
v && (f = e = r.toPixels(B.max)); | |
y = Math.abs(f - e); | |
u = Math.min(f, e); | |
w = Math.max(f, e); | |
r.isXAxis ? (l = { | |
x: q ? w : u, | |
y: 0, | |
width: y, | |
height: m | |
}, C || (l.x = b.plotHeight - l.x)) : (l = { | |
x: 0, | |
y: q ? w : u, | |
width: m, | |
height: y | |
}, C && (l.y = b.plotWidth - l.y)); | |
q && d.isVML && (l = r.isXAxis ? { | |
x: 0, | |
y: A ? u : w, | |
height: l.width, | |
width: b.chartWidth | |
} : { | |
x: l.y - b.plotLeft - b.spacingBox.x, | |
y: 0, | |
width: l.height, | |
height: b.chartHeight | |
}); | |
h[g] ? h[g].animate(l) : h[g] = d.clipRect(l); | |
p && a["zone-graph-" + g].clip(h[g]); | |
k && a["zone-area-" + g].clip(h[g]); | |
v = c.value > B.max; | |
a.resetZones && 0 === e && (e = void 0) | |
}); | |
this.clips = h | |
} else a.visible && (p && p.show(!0), k && k.show(!0)) | |
}, | |
invertGroups: function(a) { | |
function d() { | |
["group", "markerGroup"].forEach(function(b) { | |
c[b] && (f.renderer.isVML && c[b].attr({ | |
width: c.yAxis.len, | |
height: c.xAxis.len | |
}), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(c.isRadialSeries ? !1 : a)) | |
}) | |
} | |
var c = this, | |
f = c.chart; | |
c.xAxis && (c.eventsToUnbind.push(b(f, "resize", d)), d(), c.invertGroups = | |
d) | |
}, | |
plotGroup: function(a, b, d, c, f) { | |
var g = this[a], | |
e = !g; | |
e && (this[a] = g = this.chart.renderer.g().attr({ | |
zIndex: c || .1 | |
}).add(f)); | |
g.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series " + (q(this.colorIndex) ? "highcharts-color-" + this.colorIndex + " " : "") + (this.options.className || "") + (g.hasClass("highcharts-tracker") ? " highcharts-tracker" : ""), !0); | |
g.attr({ | |
visibility: d | |
})[e ? "attr" : "animate"](this.getPlotBox()); | |
return g | |
}, | |
getPlotBox: function() { | |
var a = this.chart, | |
b = this.xAxis, | |
d = this.yAxis; | |
a.inverted && (b = d, d = this.xAxis); | |
return { | |
translateX: b ? b.left : a.plotLeft, | |
translateY: d ? d.top : a.plotTop, | |
scaleX: 1, | |
scaleY: 1 | |
} | |
}, | |
removeEvents: function(a) { | |
a ? this.eventsToUnbind.length && (this.eventsToUnbind.forEach(function(a) { | |
a() | |
}), this.eventsToUnbind.length = 0) : l(this) | |
}, | |
render: function() { | |
var a = this, | |
b = a.chart, | |
d = a.options, | |
c = !!a.animate && b.renderer.isSVG && F(d.animation).duration, | |
e = a.visible ? "inherit" : "hidden", | |
l = d.zIndex, | |
p = a.hasRendered, | |
k = b.seriesGroup, | |
m = b.inverted; | |
h(this, "render"); | |
var r = a.plotGroup("group", "series", | |
e, l, k); | |
a.markerGroup = a.plotGroup("markerGroup", "markers", e, l, k); | |
c && a.animate(!0); | |
r.inverted = a.isCartesian || a.invertable ? m : !1; | |
a.drawGraph && (a.drawGraph(), a.applyZones()); | |
a.visible && a.drawPoints(); | |
a.drawDataLabels && a.drawDataLabels(); | |
a.redrawPoints && a.redrawPoints(); | |
a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker(); | |
a.invertGroups(m); | |
!1 === d.clip || a.sharedClipKey || p || r.clip(b.clipRect); | |
c && a.animate(); | |
p || (a.animationTimeout = f(function() { | |
a.afterAnimate() | |
}, c || 0)); | |
a.isDirty = !1; | |
a.hasRendered = !0; | |
h(a, "afterRender") | |
}, | |
redraw: function() { | |
var a = this.chart, | |
b = this.isDirty || this.isDirtyData, | |
d = this.group, | |
c = this.xAxis, | |
f = this.yAxis; | |
d && (a.inverted && d.attr({ | |
width: a.plotWidth, | |
height: a.plotHeight | |
}), d.animate({ | |
translateX: D(c && c.left, a.plotLeft), | |
translateY: D(f && f.top, a.plotTop) | |
})); | |
this.translate(); | |
this.render(); | |
b && delete this.kdTree | |
}, | |
kdAxisArray: ["clientX", "plotY"], | |
searchPoint: function(a, b) { | |
var d = this.xAxis, | |
c = this.yAxis, | |
f = this.chart.inverted; | |
return this.searchKDTree({ | |
clientX: f ? d.len - a.chartY + d.pos : a.chartX - | |
d.pos, | |
plotY: f ? c.len - a.chartX + c.pos : a.chartY - c.pos | |
}, b, a) | |
}, | |
buildKDTree: function(a) { | |
function b(a, c, f) { | |
var g; | |
if (g = a && a.length) { | |
var e = d.kdAxisArray[c % f]; | |
a.sort(function(a, b) { | |
return a[e] - b[e] | |
}); | |
g = Math.floor(g / 2); | |
return { | |
point: a[g], | |
left: b(a.slice(0, g), c + 1, f), | |
right: b(a.slice(g + 1), c + 1, f) | |
} | |
} | |
} | |
this.buildingKdTree = !0; | |
var d = this, | |
c = -1 < d.options.findNearestPointBy.indexOf("y") ? 2 : 1; | |
delete d.kdTree; | |
f(function() { | |
d.kdTree = b(d.getValidPoints(null, !d.directTouch), c, c); | |
d.buildingKdTree = !1 | |
}, d.options.kdNow || a && "touchstart" === | |
a.type ? 0 : 1) | |
}, | |
searchKDTree: function(a, b, d) { | |
function c(a, b, d, l) { | |
var p = b.point, | |
n = f.kdAxisArray[d % l], | |
t = p; | |
var k = q(a[g]) && q(p[g]) ? Math.pow(a[g] - p[g], 2) : null; | |
var m = q(a[e]) && q(p[e]) ? Math.pow(a[e] - p[e], 2) : null; | |
m = (k || 0) + (m || 0); | |
p.dist = q(m) ? Math.sqrt(m) : Number.MAX_VALUE; | |
p.distX = q(k) ? Math.sqrt(k) : Number.MAX_VALUE; | |
n = a[n] - p[n]; | |
m = 0 > n ? "left" : "right"; | |
k = 0 > n ? "right" : "left"; | |
b[m] && (m = c(a, b[m], d + 1, l), t = m[h] < t[h] ? m : p); | |
b[k] && Math.sqrt(n * n) < t[h] && (a = c(a, b[k], d + 1, l), t = a[h] < t[h] ? a : t); | |
return t | |
} | |
var f = this, | |
g = this.kdAxisArray[0], | |
e = this.kdAxisArray[1], | |
h = b ? "distX" : "dist"; | |
b = -1 < f.options.findNearestPointBy.indexOf("y") ? 2 : 1; | |
this.kdTree || this.buildingKdTree || this.buildKDTree(d); | |
if (this.kdTree) return c(a, this.kdTree, b, b) | |
}, | |
pointPlacementToXValue: function() { | |
var a = this.xAxis, | |
b = this.options.pointPlacement; | |
"between" === b && (b = a.reversed ? -.5 : .5); | |
w(b) && (b *= D(this.options.pointRange || a.pointRange)); | |
return b | |
} | |
}); | |
"" | |
}); | |
M(J, "parts/Stacking.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.correctFloat, | |
I = e.defined, | |
G = e.destroyObjectProperties, | |
H = e.objectEach, | |
v = e.pick; | |
e = c.Axis; | |
var q = c.Chart, | |
C = c.format, | |
B = c.Series; | |
c.StackItem = function(c, e, m, r, q) { | |
var u = c.chart.inverted; | |
this.axis = c; | |
this.isNegative = m; | |
this.options = e = e || {}; | |
this.x = r; | |
this.total = null; | |
this.points = {}; | |
this.stack = q; | |
this.rightCliff = this.leftCliff = 0; | |
this.alignOptions = { | |
align: e.align || (u ? m ? "left" : "right" : "center"), | |
verticalAlign: e.verticalAlign || (u ? "middle" : m ? "bottom" : "top"), | |
y: e.y, | |
x: e.x | |
}; | |
this.textAlign = e.textAlign || (u ? m ? "right" : "left" : "center") | |
}; | |
c.StackItem.prototype = { | |
destroy: function() { | |
G(this, | |
this.axis) | |
}, | |
render: function(c) { | |
var e = this.axis.chart, | |
m = this.options, | |
r = m.format; | |
r = r ? C(r, this, e) : m.formatter.call(this); | |
this.label ? this.label.attr({ | |
text: r, | |
visibility: "hidden" | |
}) : (this.label = e.renderer.label(r, null, null, m.shape, null, null, m.useHTML, !1, "stack-labels"), r = { | |
text: r, | |
align: this.textAlign, | |
rotation: m.rotation, | |
padding: v(m.padding, 0), | |
visibility: "hidden" | |
}, this.label.attr(r), e.styledMode || this.label.css(m.style), this.label.added || this.label.add(c)); | |
this.label.labelrank = e.plotHeight | |
}, | |
setOffset: function(c, | |
e, m, r, q) { | |
var u = this.axis, | |
f = u.chart; | |
r = u.translate(u.usePercentage ? 100 : r ? r : this.total, 0, 0, 0, 1); | |
m = u.translate(m ? m : 0); | |
m = I(r) && Math.abs(r - m); | |
c = v(q, f.xAxis[0].translate(this.x)) + c; | |
u = I(r) && this.getStackBox(f, this, c, r, e, m, u); | |
e = this.label; | |
c = this.isNegative; | |
q = "justify" === v(this.options.overflow, "justify"); | |
if (e && u) { | |
m = e.getBBox(); | |
var b = f.inverted ? c ? m.width : 0 : m.width / 2, | |
a = f.inverted ? m.height / 2 : c ? -4 : m.height + 4; | |
this.alignOptions.x = v(this.options.x, 0); | |
e.align(this.alignOptions, null, u); | |
r = e.alignAttr; | |
e.show(); | |
r.y -= | |
a; | |
q && (r.x -= b, B.prototype.justifyDataLabel.call(this.axis, e, this.alignOptions, r, m, u), r.x += b); | |
r.x = e.alignAttr.x; | |
e.attr({ | |
x: r.x, | |
y: r.y | |
}); | |
v(!q && this.options.crop, !0) && ((f = f.isInsidePlot(e.x + (f.inverted ? 0 : -m.width / 2), e.y) && f.isInsidePlot(e.x + (f.inverted ? c ? -m.width : m.width : m.width / 2), e.y + m.height)) || e.hide()) | |
} | |
}, | |
getStackBox: function(c, e, m, r, q, v, f) { | |
var b = e.axis.reversed, | |
a = c.inverted; | |
c = f.height + f.pos - (a ? c.plotLeft : c.plotTop); | |
e = e.isNegative && !b || !e.isNegative && b; | |
return { | |
x: a ? e ? r : r - v : m, | |
y: a ? c - m - q : e ? c - r - v : c - r, | |
width: a ? | |
v : q, | |
height: a ? q : v | |
} | |
} | |
}; | |
q.prototype.getStacks = function() { | |
var c = this, | |
e = c.inverted; | |
c.yAxis.forEach(function(c) { | |
c.stacks && c.hasVisibleSeries && (c.oldStacks = c.stacks) | |
}); | |
c.series.forEach(function(m) { | |
var r = m.xAxis && m.xAxis.options || {}; | |
!m.options.stacking || !0 !== m.visible && !1 !== c.options.chart.ignoreHiddenSeries || (m.stackKey = [m.type, v(m.options.stack, ""), e ? r.top : r.left, e ? r.height : r.width].join()) | |
}) | |
}; | |
e.prototype.buildStacks = function() { | |
var e = this.series, | |
q = v(this.options.reversedStacks, !0), | |
m = e.length, | |
r; | |
if (!this.isXAxis) { | |
this.usePercentage = !1; | |
for (r = m; r--;) { | |
var D = e[q ? r : m - r - 1]; | |
D.setStackedPoints() | |
} | |
for (r = 0; r < m; r++) e[r].modifyStacks(); | |
c.fireEvent(this, "afterBuildStacks") | |
} | |
}; | |
e.prototype.renderStackTotals = function() { | |
var c = this.chart, | |
e = c.renderer, | |
m = this.stacks, | |
r = this.stackTotalGroup; | |
r || (this.stackTotalGroup = r = e.g("stack-labels").attr({ | |
visibility: "visible", | |
zIndex: 6 | |
}).add()); | |
r.translate(c.plotLeft, c.plotTop); | |
H(m, function(c) { | |
H(c, function(c) { | |
c.render(r) | |
}) | |
}) | |
}; | |
e.prototype.resetStacks = function() { | |
var c = this, | |
e = c.stacks; | |
c.isXAxis || H(e, function(e) { | |
H(e, | |
function(m, q) { | |
m.touched < c.stacksTouched ? (m.destroy(), delete e[q]) : (m.total = null, m.cumulative = null) | |
}) | |
}) | |
}; | |
e.prototype.cleanStacks = function() { | |
if (!this.isXAxis) { | |
if (this.oldStacks) var c = this.stacks = this.oldStacks; | |
H(c, function(c) { | |
H(c, function(c) { | |
c.cumulative = c.total | |
}) | |
}) | |
} | |
}; | |
B.prototype.setStackedPoints = function() { | |
if (this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) { | |
var e = this.processedXData, | |
q = this.processedYData, | |
m = [], | |
r = q.length, | |
D = this.options, | |
A = D.threshold, | |
f = v(D.startFromThreshold && | |
A, 0), | |
b = D.stack; | |
D = D.stacking; | |
var a = this.stackKey, | |
d = "-" + a, | |
h = this.negStacks, | |
k = this.yAxis, | |
l = k.stacks, | |
y = k.oldStacks, | |
p, g; | |
k.stacksTouched += 1; | |
for (g = 0; g < r; g++) { | |
var t = e[g]; | |
var x = q[g]; | |
var L = this.getStackIndicator(L, t, this.index); | |
var E = L.key; | |
var n = (p = h && x < (f ? 0 : A)) ? d : a; | |
l[n] || (l[n] = {}); | |
l[n][t] || (y[n] && y[n][t] ? (l[n][t] = y[n][t], l[n][t].total = null) : l[n][t] = new c.StackItem(k, k.options.stackLabels, p, t, b)); | |
n = l[n][t]; | |
null !== x ? (n.points[E] = n.points[this.index] = [v(n.cumulative, f)], I(n.cumulative) || (n.base = E), n.touched = | |
k.stacksTouched, 0 < L.index && !1 === this.singleStacks && (n.points[E][0] = n.points[this.index + "," + t + ",0"][0])) : n.points[E] = n.points[this.index] = null; | |
"percent" === D ? (p = p ? a : d, h && l[p] && l[p][t] ? (p = l[p][t], n.total = p.total = Math.max(p.total, n.total) + Math.abs(x) || 0) : n.total = F(n.total + (Math.abs(x) || 0))) : n.total = F(n.total + (x || 0)); | |
n.cumulative = v(n.cumulative, f) + (x || 0); | |
null !== x && (n.points[E].push(n.cumulative), m[g] = n.cumulative) | |
} | |
"percent" === D && (k.usePercentage = !0); | |
this.stackedYData = m; | |
k.oldStacks = {} | |
} | |
}; | |
B.prototype.modifyStacks = | |
function() { | |
var c = this, | |
e = c.stackKey, | |
m = c.yAxis.stacks, | |
r = c.processedXData, | |
q, v = c.options.stacking; | |
c[v + "Stacker"] && [e, "-" + e].forEach(function(f) { | |
for (var b = r.length, a, d; b--;) | |
if (a = r[b], q = c.getStackIndicator(q, a, c.index, f), d = (a = m[f] && m[f][a]) && a.points[q.key]) c[v + "Stacker"](d, a, b) | |
}) | |
}; | |
B.prototype.percentStacker = function(c, e, m) { | |
e = e.total ? 100 / e.total : 0; | |
c[0] = F(c[0] * e); | |
c[1] = F(c[1] * e); | |
this.stackedYData[m] = c[1] | |
}; | |
B.prototype.getStackIndicator = function(c, e, m, r) { | |
!I(c) || c.x !== e || r && c.key !== r ? c = { | |
x: e, | |
index: 0, | |
key: r | |
} : c.index++; | |
c.key = [m, e, c.index].join(); | |
return c | |
} | |
}); | |
M(J, "parts/Dynamics.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.defined, | |
I = e.erase, | |
G = e.extend, | |
H = e.isArray, | |
v = e.isNumber, | |
q = e.isObject, | |
C = e.isString, | |
B = e.objectEach, | |
u = e.pick, | |
w = e.relativeLength, | |
m = e.setAnimation, | |
r = e.splat, | |
D = c.addEvent, | |
A = c.animate, | |
f = c.Axis; | |
e = c.Chart; | |
var b = c.createElement, | |
a = c.css, | |
d = c.fireEvent, | |
h = c.merge, | |
k = c.Point, | |
l = c.Series, | |
y = c.seriesTypes; | |
c.cleanRecursively = function(a, b) { | |
var d = {}; | |
B(a, function(f, g) { | |
if (q(a[g], !0) && !a.nodeType && | |
b[g]) f = c.cleanRecursively(a[g], b[g]), Object.keys(f).length && (d[g] = f); | |
else if (q(a[g]) || a[g] !== b[g]) d[g] = a[g] | |
}); | |
return d | |
}; | |
G(e.prototype, { | |
addSeries: function(a, b, c) { | |
var f, g = this; | |
a && (b = u(b, !0), d(g, "addSeries", { | |
options: a | |
}, function() { | |
f = g.initSeries(a); | |
g.isDirtyLegend = !0; | |
g.linkSeries(); | |
f.enabledDataSorting && f.setData(a.data, !1); | |
d(g, "afterAddSeries", { | |
series: f | |
}); | |
b && g.redraw(c) | |
})); | |
return f | |
}, | |
addAxis: function(a, b, d, c) { | |
return this.createAxis(b ? "xAxis" : "yAxis", { | |
axis: a, | |
redraw: d, | |
animation: c | |
}) | |
}, | |
addColorAxis: function(a, | |
b, d) { | |
return this.createAxis("colorAxis", { | |
axis: a, | |
redraw: b, | |
animation: d | |
}) | |
}, | |
createAxis: function(a, b) { | |
var d = this.options, | |
g = "colorAxis" === a, | |
e = b.redraw, | |
l = b.animation; | |
b = h(b.axis, { | |
index: this[a].length, | |
isX: "xAxis" === a | |
}); | |
var p = g ? new c.ColorAxis(this, b) : new f(this, b); | |
d[a] = r(d[a] || {}); | |
d[a].push(b); | |
g && (this.isDirtyLegend = !0, this.axes.forEach(function(a) { | |
a.series = [] | |
}), this.series.forEach(function(a) { | |
a.bindAxes(); | |
a.isDirtyData = !0 | |
})); | |
u(e, !0) && this.redraw(l); | |
return p | |
}, | |
showLoading: function(d) { | |
var c = this, | |
f = c.options, | |
e = c.loadingDiv, | |
h = f.loading, | |
l = function() { | |
e && a(e, { | |
left: c.plotLeft + "px", | |
top: c.plotTop + "px", | |
width: c.plotWidth + "px", | |
height: c.plotHeight + "px" | |
}) | |
}; | |
e || (c.loadingDiv = e = b("div", { | |
className: "highcharts-loading highcharts-loading-hidden" | |
}, null, c.container), c.loadingSpan = b("span", { | |
className: "highcharts-loading-inner" | |
}, null, e), D(c, "redraw", l)); | |
e.className = "highcharts-loading"; | |
c.loadingSpan.innerHTML = u(d, f.lang.loading, ""); | |
c.styledMode || (a(e, G(h.style, { | |
zIndex: 10 | |
})), a(c.loadingSpan, h.labelStyle), c.loadingShown || (a(e, { | |
opacity: 0, | |
display: "" | |
}), A(e, { | |
opacity: h.style.opacity || .5 | |
}, { | |
duration: h.showDuration || 0 | |
}))); | |
c.loadingShown = !0; | |
l() | |
}, | |
hideLoading: function() { | |
var b = this.options, | |
d = this.loadingDiv; | |
d && (d.className = "highcharts-loading highcharts-loading-hidden", this.styledMode || A(d, { | |
opacity: 0 | |
}, { | |
duration: b.loading.hideDuration || 100, | |
complete: function() { | |
a(d, { | |
display: "none" | |
}) | |
} | |
})); | |
this.loadingShown = !1 | |
}, | |
propsRequireDirtyBox: "backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "), | |
propsRequireReflow: "margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "), | |
propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" "), | |
collectionsWithUpdate: ["xAxis", "yAxis", "zAxis", "series"], | |
update: function(a, b, f, e) { | |
var g = this, | |
l = { | |
credits: "addCredits", | |
title: "setTitle", | |
subtitle: "setSubtitle", | |
caption: "setCaption" | |
}, | |
p, k, m, t = a.isResponsiveOptions, | |
q = []; | |
d(g, "update", { | |
options: a | |
}); | |
t || g.setResponsive(!1, !0); | |
a = c.cleanRecursively(a, g.options); | |
h(!0, g.userOptions, a); | |
if (p = a.chart) { | |
h(!0, g.options.chart, p); | |
"className" in p && g.setClassName(p.className); | |
"reflow" in p && g.setReflow(p.reflow); | |
if ("inverted" in p || "polar" in p || "type" in p) { | |
g.propFromSeries(); | |
var x = !0 | |
} | |
"alignTicks" in p && (x = !0); | |
B(p, function(a, b) { | |
-1 !== g.propsRequireUpdateSeries.indexOf("chart." + b) && (k = !0); - 1 !== g.propsRequireDirtyBox.indexOf(b) && (g.isDirtyBox = !0); | |
t || -1 === g.propsRequireReflow.indexOf(b) || (m = !0) | |
}); | |
!g.styledMode && | |
"style" in p && g.renderer.setStyle(p.style) | |
}!g.styledMode && a.colors && (this.options.colors = a.colors); | |
a.plotOptions && h(!0, this.options.plotOptions, a.plotOptions); | |
a.time && this.time === c.time && (this.time = new c.Time(a.time)); | |
B(a, function(a, b) { | |
if (g[b] && "function" === typeof g[b].update) g[b].update(a, !1); | |
else if ("function" === typeof g[l[b]]) g[l[b]](a); | |
"chart" !== b && -1 !== g.propsRequireUpdateSeries.indexOf(b) && (k = !0) | |
}); | |
this.collectionsWithUpdate.forEach(function(b) { | |
if (a[b]) { | |
if ("series" === b) { | |
var d = []; | |
g[b].forEach(function(a, | |
b) { | |
a.options.isInternal || d.push(u(a.options.index, b)) | |
}) | |
} | |
r(a[b]).forEach(function(a, c) { | |
(c = F(a.id) && g.get(a.id) || g[b][d ? d[c] : c]) && c.coll === b && (c.update(a, !1), f && (c.touched = !0)); | |
!c && f && g.collectionsWithInit[b] && (g.collectionsWithInit[b][0].apply(g, [a].concat(g.collectionsWithInit[b][1] || []).concat([!1])).touched = !0) | |
}); | |
f && g[b].forEach(function(a) { | |
a.touched || a.options.isInternal ? delete a.touched : q.push(a) | |
}) | |
} | |
}); | |
q.forEach(function(a) { | |
a.remove && a.remove(!1) | |
}); | |
x && g.axes.forEach(function(a) { | |
a.update({}, !1) | |
}); | |
k && g.getSeriesOrderByLinks().forEach(function(a) { | |
a.chart && a.update({}, !1) | |
}, this); | |
a.loading && h(!0, g.options.loading, a.loading); | |
x = p && p.width; | |
p = p && p.height; | |
C(p) && (p = w(p, x || g.chartWidth)); | |
m || v(x) && x !== g.chartWidth || v(p) && p !== g.chartHeight ? g.setSize(x, p, e) : u(b, !0) && g.redraw(e); | |
d(g, "afterUpdate", { | |
options: a, | |
redraw: b, | |
animation: e | |
}) | |
}, | |
setSubtitle: function(a, b) { | |
this.applyDescription("subtitle", a); | |
this.layOutTitles(b) | |
}, | |
setCaption: function(a, b) { | |
this.applyDescription("caption", a); | |
this.layOutTitles(b) | |
} | |
}); | |
e.prototype.collectionsWithInit = { | |
xAxis: [e.prototype.addAxis, [!0]], | |
yAxis: [e.prototype.addAxis, [!1]], | |
series: [e.prototype.addSeries] | |
}; | |
G(k.prototype, { | |
update: function(a, b, d, c) { | |
function f() { | |
g.applyOptions(a); | |
null === g.y && h && (g.graphic = h.destroy()); | |
q(a, !0) && (h && h.element && a && a.marker && "undefined" !== typeof a.marker.symbol && (g.graphic = h.destroy()), a && a.dataLabels && g.dataLabel && (g.dataLabel = g.dataLabel.destroy()), g.connector && (g.connector = g.connector.destroy())); | |
l = g.index; | |
e.updateParallelArrays(g, l); | |
k.data[l] = q(k.data[l], !0) || q(a, !0) ? g.options : | |
u(a, k.data[l]); | |
e.isDirty = e.isDirtyData = !0; | |
!e.fixedBox && e.hasCartesianSeries && (p.isDirtyBox = !0); | |
"point" === k.legendType && (p.isDirtyLegend = !0); | |
b && p.redraw(d) | |
} | |
var g = this, | |
e = g.series, | |
h = g.graphic, | |
l, p = e.chart, | |
k = e.options; | |
b = u(b, !0); | |
!1 === c ? f() : g.firePointEvent("update", { | |
options: a | |
}, f) | |
}, | |
remove: function(a, b) { | |
this.series.removePoint(this.series.data.indexOf(this), a, b) | |
} | |
}); | |
G(l.prototype, { | |
addPoint: function(a, b, c, f, e) { | |
var g = this.options, | |
h = this.data, | |
l = this.chart, | |
p = this.xAxis; | |
p = p && p.hasNames && p.names; | |
var k = g.data, | |
m = | |
this.xData, | |
t; | |
b = u(b, !0); | |
var r = { | |
series: this | |
}; | |
this.pointClass.prototype.applyOptions.apply(r, [a]); | |
var q = r.x; | |
var x = m.length; | |
if (this.requireSorting && q < m[x - 1]) | |
for (t = !0; x && m[x - 1] > q;) x--; | |
this.updateParallelArrays(r, "splice", x, 0, 0); | |
this.updateParallelArrays(r, x); | |
p && r.name && (p[q] = r.name); | |
k.splice(x, 0, a); | |
t && (this.data.splice(x, 0, null), this.processData()); | |
"point" === g.legendType && this.generatePoints(); | |
c && (h[0] && h[0].remove ? h[0].remove(!1) : (h.shift(), this.updateParallelArrays(r, "shift"), k.shift())); | |
!1 !== e && d(this, | |
"addPoint", { | |
point: r | |
}); | |
this.isDirtyData = this.isDirty = !0; | |
b && l.redraw(f) | |
}, | |
removePoint: function(a, b, d) { | |
var c = this, | |
f = c.data, | |
g = f[a], | |
e = c.points, | |
h = c.chart, | |
l = function() { | |
e && e.length === f.length && e.splice(a, 1); | |
f.splice(a, 1); | |
c.options.data.splice(a, 1); | |
c.updateParallelArrays(g || { | |
series: c | |
}, "splice", a, 1); | |
g && g.destroy(); | |
c.isDirty = !0; | |
c.isDirtyData = !0; | |
b && h.redraw() | |
}; | |
m(d, h); | |
b = u(b, !0); | |
g ? g.firePointEvent("remove", null, l) : l() | |
}, | |
remove: function(a, b, c, f) { | |
function g() { | |
e.destroy(f); | |
e.remove = null; | |
h.isDirtyLegend = h.isDirtyBox = !0; | |
h.linkSeries(); | |
u(a, !0) && h.redraw(b) | |
} | |
var e = this, | |
h = e.chart; | |
!1 !== c ? d(e, "remove", null, g) : g() | |
}, | |
update: function(a, b) { | |
a = c.cleanRecursively(a, this.userOptions); | |
d(this, "update", { | |
options: a | |
}); | |
var f = this, | |
g = f.chart, | |
e = f.userOptions, | |
l = f.initialType || f.type, | |
p = a.type || e.type || g.options.chart.type, | |
k = !(this.hasDerivedData || a.dataGrouping || p && p !== this.type || "undefined" !== typeof a.pointStart || a.pointInterval || a.pointIntervalUnit || a.keys), | |
m = y[l].prototype, | |
r, q = ["group", "markerGroup", "dataLabelsGroup", "transformGroup"], | |
v = ["eventOptions", "navigatorSeries", "baseSeries"], | |
w = f.finishedAnimating && { | |
animation: !1 | |
}, | |
A = {}; | |
k && (v.push("data", "isDirtyData", "points", "processedXData", "processedYData", "xIncrement", "_hasPointMarkers", "_hasPointLabels", "mapMap", "mapData", "minY", "maxY", "minX", "maxX"), !1 !== a.visible && v.push("area", "graph"), f.parallelArrays.forEach(function(a) { | |
v.push(a + "Data") | |
}), a.data && (a.dataSorting && G(f.options.dataSorting, a.dataSorting), this.setData(a.data, !1))); | |
a = h(e, w, { | |
index: "undefined" === typeof e.index ? f.index : e.index, | |
pointStart: u(e.pointStart, f.xData[0]) | |
}, !k && { | |
data: f.options.data | |
}, a); | |
k && a.data && (a.data = f.options.data); | |
v = q.concat(v); | |
v.forEach(function(a) { | |
v[a] = f[a]; | |
delete f[a] | |
}); | |
f.remove(!1, null, !1, !0); | |
for (r in m) f[r] = void 0; | |
y[p || l] ? G(f, y[p || l].prototype) : c.error(17, !0, g, { | |
missingModuleFor: p || l | |
}); | |
v.forEach(function(a) { | |
f[a] = v[a] | |
}); | |
f.init(g, a); | |
if (k && this.points) { | |
var D = f.options; | |
!1 === D.visible ? (A.graphic = 1, A.dataLabel = 1) : f._hasPointLabels || (p = D.marker, m = D.dataLabels, p && (!1 === p.enabled || "symbol" in p) && (A.graphic = | |
1), m && !1 === m.enabled && (A.dataLabel = 1)); | |
this.points.forEach(function(a) { | |
a && a.series && (a.resolveColor(), Object.keys(A).length && a.destroyElements(A), !1 === D.showInLegend && a.legendItem && g.legend.destroyItem(a)) | |
}, this) | |
} | |
a.zIndex !== e.zIndex && q.forEach(function(b) { | |
f[b] && f[b].attr({ | |
zIndex: a.zIndex | |
}) | |
}); | |
f.initialType = l; | |
g.linkSeries(); | |
d(this, "afterUpdate"); | |
u(b, !0) && g.redraw(k ? void 0 : !1) | |
}, | |
setName: function(a) { | |
this.name = this.options.name = this.userOptions.name = a; | |
this.chart.isDirtyLegend = !0 | |
} | |
}); | |
G(f.prototype, { | |
update: function(a, | |
b) { | |
var d = this.chart, | |
c = a && a.events || {}; | |
a = h(this.userOptions, a); | |
d.options[this.coll].indexOf && (d.options[this.coll][d.options[this.coll].indexOf(this.userOptions)] = a); | |
B(d.options[this.coll].events, function(a, b) { | |
"undefined" === typeof c[b] && (c[b] = void 0) | |
}); | |
this.destroy(!0); | |
this.init(d, G(a, { | |
events: c | |
})); | |
d.isDirtyBox = !0; | |
u(b, !0) && d.redraw() | |
}, | |
remove: function(a) { | |
for (var b = this.chart, d = this.coll, c = this.series, f = c.length; f--;) c[f] && c[f].remove(!1); | |
I(b.axes, this); | |
I(b[d], this); | |
H(b.options[d]) ? b.options[d].splice(this.options.index, | |
1) : delete b.options[d]; | |
b[d].forEach(function(a, b) { | |
a.options.index = a.userOptions.index = b | |
}); | |
this.destroy(); | |
b.isDirtyBox = !0; | |
u(a, !0) && b.redraw() | |
}, | |
setTitle: function(a, b) { | |
this.update({ | |
title: a | |
}, b) | |
}, | |
setCategories: function(a, b) { | |
this.update({ | |
categories: a | |
}, b) | |
} | |
}) | |
}); | |
M(J, "parts/AreaSeries.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.objectEach, | |
I = e.pick, | |
G = c.color, | |
H = c.Series; | |
e = c.seriesType; | |
e("area", "line", { | |
softThreshold: !1, | |
threshold: 0 | |
}, { | |
singleStacks: !1, | |
getStackPoints: function(c) { | |
var e = [], | |
v = [], | |
B = this.xAxis, | |
u = this.yAxis, | |
w = u.stacks[this.stackKey], | |
m = {}, | |
r = this.index, | |
D = u.series, | |
A = D.length, | |
f = I(u.options.reversedStacks, !0) ? 1 : -1, | |
b; | |
c = c || this.points; | |
if (this.options.stacking) { | |
for (b = 0; b < c.length; b++) c[b].leftNull = c[b].rightNull = void 0, m[c[b].x] = c[b]; | |
F(w, function(a, b) { | |
null !== a.total && v.push(b) | |
}); | |
v.sort(function(a, b) { | |
return a - b | |
}); | |
var a = D.map(function(a) { | |
return a.visible | |
}); | |
v.forEach(function(d, c) { | |
var h = 0, | |
l, q; | |
if (m[d] && !m[d].isNull) e.push(m[d]), [-1, 1].forEach(function(e) { | |
var g = 1 === e ? "rightNull" : | |
"leftNull", | |
h = 0, | |
p = w[v[c + e]]; | |
if (p) | |
for (b = r; 0 <= b && b < A;) l = p.points[b], l || (b === r ? m[d][g] = !0 : a[b] && (q = w[d].points[b]) && (h -= q[1] - q[0])), b += f; | |
m[d][1 === e ? "rightCliff" : "leftCliff"] = h | |
}); | |
else { | |
for (b = r; 0 <= b && b < A;) { | |
if (l = w[d].points[b]) { | |
h = l[1]; | |
break | |
} | |
b += f | |
} | |
h = u.translate(h, 0, 1, 0, 1); | |
e.push({ | |
isNull: !0, | |
plotX: B.translate(d, 0, 0, 0, 1), | |
x: d, | |
plotY: h, | |
yBottom: h | |
}) | |
} | |
}) | |
} | |
return e | |
}, | |
getGraphPath: function(c) { | |
var e = H.prototype.getGraphPath, | |
v = this.options, | |
B = v.stacking, | |
u = this.yAxis, | |
w, m = [], | |
r = [], | |
D = this.index, | |
A = u.stacks[this.stackKey], | |
f = v.threshold, | |
b = Math.round(u.getThreshold(v.threshold)); | |
v = I(v.connectNulls, "percent" === B); | |
var a = function(a, d, e) { | |
var g = c[a]; | |
a = B && A[g.x].points[D]; | |
var l = g[e + "Null"] || 0; | |
e = g[e + "Cliff"] || 0; | |
g = !0; | |
if (e || l) { | |
var p = (l ? a[0] : a[1]) + e; | |
var k = a[0] + e; | |
g = !!l | |
} else !B && c[d] && c[d].isNull && (p = k = f); | |
"undefined" !== typeof p && (r.push({ | |
plotX: h, | |
plotY: null === p ? b : u.getThreshold(p), | |
isNull: g, | |
isCliff: !0 | |
}), m.push({ | |
plotX: h, | |
plotY: null === k ? b : u.getThreshold(k), | |
doCurve: !1 | |
})) | |
}; | |
c = c || this.points; | |
B && (c = this.getStackPoints(c)); | |
for (w = 0; w < c.length; w++) { | |
B || (c[w].leftCliff = | |
c[w].rightCliff = c[w].leftNull = c[w].rightNull = void 0); | |
var d = c[w].isNull; | |
var h = I(c[w].rectPlotX, c[w].plotX); | |
var k = I(c[w].yBottom, b); | |
if (!d || v) v || a(w, w - 1, "left"), d && !B && v || (r.push(c[w]), m.push({ | |
x: w, | |
plotX: h, | |
plotY: k | |
})), v || a(w, w + 1, "right") | |
} | |
w = e.call(this, r, !0, !0); | |
m.reversed = !0; | |
d = e.call(this, m, !0, !0); | |
d.length && (d[0] = "L"); | |
d = w.concat(d); | |
e = e.call(this, r, !1, v); | |
d.xMap = w.xMap; | |
this.areaPath = d; | |
return e | |
}, | |
drawGraph: function() { | |
this.areaPath = []; | |
H.prototype.drawGraph.apply(this); | |
var c = this, | |
e = this.areaPath, | |
C = this.options, | |
B = [ | |
["area", "highcharts-area", this.color, C.fillColor] | |
]; | |
this.zones.forEach(function(e, q) { | |
B.push(["zone-area-" + q, "highcharts-area highcharts-zone-area-" + q + " " + e.className, e.color || c.color, e.fillColor || C.fillColor]) | |
}); | |
B.forEach(function(q) { | |
var v = q[0], | |
m = c[v], | |
r = m ? "animate" : "attr", | |
u = {}; | |
m ? (m.endX = c.preventGraphAnimation ? null : e.xMap, m.animate({ | |
d: e | |
})) : (u.zIndex = 0, m = c[v] = c.chart.renderer.path(e).addClass(q[1]).add(c.group), m.isArea = !0); | |
c.chart.styledMode || (u.fill = I(q[3], G(q[2]).setOpacity(I(C.fillOpacity, .75)).get())); | |
m[r](u); | |
m.startX = e.xMap; | |
m.shiftUnit = C.step ? 2 : 1 | |
}) | |
}, | |
drawLegendSymbol: c.LegendSymbolMixin.drawRectangle | |
}); | |
"" | |
}); | |
M(J, "parts/SplineSeries.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.pick; | |
c = c.seriesType; | |
c("spline", "line", {}, { | |
getPointSpline: function(c, e, H) { | |
var v = e.plotX, | |
q = e.plotY, | |
C = c[H - 1]; | |
H = c[H + 1]; | |
if (C && !C.isNull && !1 !== C.doCurve && !e.isCliff && H && !H.isNull && !1 !== H.doCurve && !e.isCliff) { | |
c = C.plotY; | |
var B = H.plotX; | |
H = H.plotY; | |
var u = 0; | |
var w = (1.5 * v + C.plotX) / 2.5; | |
var m = (1.5 * q + c) / 2.5; | |
B = (1.5 * | |
v + B) / 2.5; | |
var r = (1.5 * q + H) / 2.5; | |
B !== w && (u = (r - m) * (B - v) / (B - w) + q - r); | |
m += u; | |
r += u; | |
m > c && m > q ? (m = Math.max(c, q), r = 2 * q - m) : m < c && m < q && (m = Math.min(c, q), r = 2 * q - m); | |
r > H && r > q ? (r = Math.max(H, q), m = 2 * q - r) : r < H && r < q && (r = Math.min(H, q), m = 2 * q - r); | |
e.rightContX = B; | |
e.rightContY = r | |
} | |
e = ["C", F(C.rightContX, C.plotX), F(C.rightContY, C.plotY), F(w, v), F(m, q), v, q]; | |
C.rightContX = C.rightContY = null; | |
return e | |
} | |
}); | |
"" | |
}); | |
M(J, "parts/AreaSplineSeries.js", [J["parts/Globals.js"]], function(c) { | |
var e = c.seriesTypes.area.prototype, | |
F = c.seriesType; | |
F("areaspline", "spline", | |
c.defaultPlotOptions.area, { | |
getStackPoints: e.getStackPoints, | |
getGraphPath: e.getGraphPath, | |
drawGraph: e.drawGraph, | |
drawLegendSymbol: c.LegendSymbolMixin.drawRectangle | |
}); | |
"" | |
}); | |
M(J, "parts/ColumnSeries.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.animObject, | |
I = e.clamp, | |
G = e.defined, | |
H = e.extend, | |
v = e.isNumber, | |
q = e.pick, | |
C = c.color, | |
B = c.merge, | |
u = c.Series; | |
e = c.seriesType; | |
var w = c.svg; | |
e("column", "line", { | |
borderRadius: 0, | |
crisp: !0, | |
groupPadding: .2, | |
marker: null, | |
pointPadding: .1, | |
minPointLength: 0, | |
cropThreshold: 50, | |
pointRange: null, | |
states: { | |
hover: { | |
halo: !1, | |
brightness: .1 | |
}, | |
select: { | |
color: "#cccccc", | |
borderColor: "#000000" | |
} | |
}, | |
dataLabels: { | |
align: null, | |
verticalAlign: null, | |
y: null | |
}, | |
softThreshold: !1, | |
startFromThreshold: !0, | |
stickyTracking: !1, | |
tooltip: { | |
distance: 6 | |
}, | |
threshold: 0, | |
borderColor: "#ffffff" | |
}, { | |
cropShoulder: 0, | |
directTouch: !0, | |
trackerGroups: ["group", "dataLabelsGroup"], | |
negStacks: !0, | |
init: function() { | |
u.prototype.init.apply(this, arguments); | |
var c = this, | |
e = c.chart; | |
e.hasRendered && e.series.forEach(function(e) { | |
e.type === c.type && (e.isDirty = !0) | |
}) | |
}, | |
getColumnMetrics: function() { | |
var c = this, | |
e = c.options, | |
v = c.xAxis, | |
u = c.yAxis, | |
f = v.options.reversedStacks; | |
f = v.reversed && !f || !v.reversed && f; | |
var b, a = {}, | |
d = 0; | |
!1 === e.grouping ? d = 1 : c.chart.series.forEach(function(f) { | |
var e = f.yAxis, | |
g = f.options; | |
if (f.type === c.type && (f.visible || !c.chart.options.chart.ignoreHiddenSeries) && u.len === e.len && u.pos === e.pos) { | |
if (g.stacking) { | |
b = f.stackKey; | |
"undefined" === typeof a[b] && (a[b] = d++); | |
var h = a[b] | |
} else !1 !== g.grouping && (h = d++); | |
f.columnIndex = h | |
} | |
}); | |
var h = Math.min(Math.abs(v.transA) * (v.ordinalSlope || | |
e.pointRange || v.closestPointRange || v.tickInterval || 1), v.len), | |
k = h * e.groupPadding, | |
l = (h - 2 * k) / (d || 1); | |
e = Math.min(e.maxPointWidth || v.len, q(e.pointWidth, l * (1 - 2 * e.pointPadding))); | |
c.columnMetrics = { | |
width: e, | |
offset: (l - e) / 2 + (k + ((c.columnIndex || 0) + (f ? 1 : 0)) * l - h / 2) * (f ? -1 : 1) | |
}; | |
return c.columnMetrics | |
}, | |
crispCol: function(c, e, q, v) { | |
var f = this.chart, | |
b = this.borderWidth, | |
a = -(b % 2 ? .5 : 0); | |
b = b % 2 ? .5 : 1; | |
f.inverted && f.renderer.isVML && (b += 1); | |
this.options.crisp && (q = Math.round(c + q) + a, c = Math.round(c) + a, q -= c); | |
v = Math.round(e + v) + b; | |
a = .5 >= Math.abs(e) && | |
.5 < v; | |
e = Math.round(e) + b; | |
v -= e; | |
a && v && (--e, v += 1); | |
return { | |
x: c, | |
y: e, | |
width: q, | |
height: v | |
} | |
}, | |
translate: function() { | |
var c = this, | |
e = c.chart, | |
v = c.options, | |
w = c.dense = 2 > c.closestPointRange * c.xAxis.transA; | |
w = c.borderWidth = q(v.borderWidth, w ? 0 : 1); | |
var f = c.yAxis, | |
b = v.threshold, | |
a = c.translatedThreshold = f.getThreshold(b), | |
d = q(v.minPointLength, 5), | |
h = c.getColumnMetrics(), | |
k = h.width, | |
l = c.barW = Math.max(k, 1 + 2 * w), | |
y = c.pointXOffset = h.offset, | |
p = c.dataMin, | |
g = c.dataMax; | |
e.inverted && (a -= .5); | |
v.pointPadding && (l = Math.ceil(l)); | |
u.prototype.translate.apply(c); | |
c.points.forEach(function(h) { | |
var m = q(h.yBottom, a), | |
t = 999 + Math.abs(m), | |
r = k; | |
t = I(h.plotY, -t, f.len + t); | |
var n = h.plotX + y, | |
z = l, | |
v = Math.min(t, m), | |
u = Math.max(t, m) - v; | |
if (d && Math.abs(u) < d) { | |
u = d; | |
var w = !f.reversed && !h.negative || f.reversed && h.negative; | |
h.y === b && c.dataMax <= b && f.min < b && p !== g && (w = !w); | |
v = Math.abs(v - a) > d ? m - d : a - (w ? d : 0) | |
} | |
G(h.options.pointWidth) && (r = z = Math.ceil(h.options.pointWidth), n -= Math.round((r - k) / 2)); | |
h.barX = n; | |
h.pointWidth = r; | |
h.tooltipPos = e.inverted ? [f.len + f.pos - e.plotLeft - t, c.xAxis.len - n - z / 2, u] : [n + z / 2, t + f.pos - | |
e.plotTop, u | |
]; | |
h.shapeType = c.pointClass.prototype.shapeType || "rect"; | |
h.shapeArgs = c.crispCol.apply(c, h.isNull ? [n, a, z, 0] : [n, v, z, u]) | |
}) | |
}, | |
getSymbol: c.noop, | |
drawLegendSymbol: c.LegendSymbolMixin.drawRectangle, | |
drawGraph: function() { | |
this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data") | |
}, | |
pointAttribs: function(c, e) { | |
var m = this.options, | |
r = this.pointAttrToOptions || {}; | |
var f = r.stroke || "borderColor"; | |
var b = r["stroke-width"] || "borderWidth", | |
a = c && c.color || this.color, | |
d = c && c[f] || m[f] || this.color || a, | |
h = c && c[b] || | |
m[b] || this[b] || 0; | |
r = c && c.options.dashStyle || m.dashStyle; | |
var k = q(c && c.opacity, m.opacity, 1); | |
if (c && this.zones.length) { | |
var l = c.getZone(); | |
a = c.options.color || l && (l.color || c.nonZonedColor) || this.color; | |
l && (d = l.borderColor || d, r = l.dashStyle || r, h = l.borderWidth || h) | |
} | |
e && c && (c = B(m.states[e], c.options.states && c.options.states[e] || {}), e = c.brightness, a = c.color || "undefined" !== typeof e && C(a).brighten(c.brightness).get() || a, d = c[f] || d, h = c[b] || h, r = c.dashStyle || r, k = q(c.opacity, k)); | |
f = { | |
fill: a, | |
stroke: d, | |
"stroke-width": h, | |
opacity: k | |
}; | |
r && (f.dashstyle = r); | |
return f | |
}, | |
drawPoints: function() { | |
var c = this, | |
e = this.chart, | |
q = c.options, | |
u = e.renderer, | |
f = q.animationLimit || 250, | |
b; | |
c.points.forEach(function(a) { | |
var d = a.graphic, | |
h = !!d, | |
k = d && e.pointCount < f ? "animate" : "attr"; | |
if (v(a.plotY) && null !== a.y) { | |
b = a.shapeArgs; | |
d && a.hasNewShapeType() && (d = d.destroy()); | |
c.enabledDataSorting && (a.startXPos = c.xAxis.reversed ? -(b ? b.width : 0) : c.xAxis.width); | |
d || (a.graphic = d = u[a.shapeType](b).add(a.group || c.group)) && c.enabledDataSorting && e.hasRendered && e.pointCount < f && (d.attr({ | |
x: a.startXPos | |
}), | |
h = !0, k = "animate"); | |
if (d && h) d[k](B(b)); | |
if (q.borderRadius) d[k]({ | |
r: q.borderRadius | |
}); | |
e.styledMode || d[k](c.pointAttribs(a, a.selected && "select")).shadow(!1 !== a.allowShadow && q.shadow, null, q.stacking && !q.borderRadius); | |
d.addClass(a.getClassName(), !0) | |
} else d && (a.graphic = d.destroy()) | |
}) | |
}, | |
animate: function(c) { | |
var e = this, | |
m = this.yAxis, | |
q = e.options, | |
f = this.chart.inverted, | |
b = {}, | |
a = f ? "translateX" : "translateY"; | |
if (w) | |
if (c) b.scaleY = .001, c = I(m.toPixels(q.threshold), m.pos, m.pos + m.len), f ? b.translateX = c - m.len : b.translateY = c, e.clipBox && | |
e.setClip(), e.group.attr(b); | |
else { | |
var d = e.group.attr(a); | |
e.group.animate({ | |
scaleY: 1 | |
}, H(F(e.options.animation), { | |
step: function(c, f) { | |
b[a] = d + f.pos * (m.pos - d); | |
e.group.attr(b) | |
} | |
})); | |
e.animate = null | |
} | |
}, | |
remove: function() { | |
var c = this, | |
e = c.chart; | |
e.hasRendered && e.series.forEach(function(e) { | |
e.type === c.type && (e.isDirty = !0) | |
}); | |
u.prototype.remove.apply(c, arguments) | |
} | |
}); | |
"" | |
}); | |
M(J, "parts/BarSeries.js", [J["parts/Globals.js"]], function(c) { | |
c = c.seriesType; | |
c("bar", "column", null, { | |
inverted: !0 | |
}); | |
"" | |
}); | |
M(J, "parts/ScatterSeries.js", [J["parts/Globals.js"]], | |
function(c) { | |
var e = c.Series, | |
F = c.seriesType; | |
F("scatter", "line", { | |
lineWidth: 0, | |
findNearestPointBy: "xy", | |
jitter: { | |
x: 0, | |
y: 0 | |
}, | |
marker: { | |
enabled: !0 | |
}, | |
tooltip: { | |
headerFormat: '<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px"> {series.name}</span><br/>', | |
pointFormat: "x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>" | |
} | |
}, { | |
sorted: !1, | |
requireSorting: !1, | |
noSharedTooltip: !0, | |
trackerGroups: ["group", "markerGroup", "dataLabelsGroup"], | |
takeOrdinalPosition: !1, | |
drawGraph: function() { | |
this.options.lineWidth && | |
e.prototype.drawGraph.call(this) | |
}, | |
applyJitter: function() { | |
var c = this, | |
e = this.options.jitter, | |
F = this.points.length; | |
e && this.points.forEach(function(v, q) { | |
["x", "y"].forEach(function(C, B) { | |
var u = "plot" + C.toUpperCase(); | |
if (e[C] && !v.isNull) { | |
var w = c[C + "Axis"]; | |
var m = e[C] * w.transA; | |
if (w && !w.isLog) { | |
var r = Math.max(0, v[u] - m); | |
w = Math.min(w.len, v[u] + m); | |
B = 1E4 * Math.sin(q + B * F); | |
v[u] = r + (w - r) * (B - Math.floor(B)); | |
"x" === C && (v.clientX = v.plotX) | |
} | |
} | |
}) | |
}) | |
} | |
}); | |
c.addEvent(e, "afterTranslate", function() { | |
this.applyJitter && this.applyJitter() | |
}); | |
"" | |
}); | |
M(J, "mixins/centered-series.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.isNumber, | |
I = e.pick, | |
G = e.relativeLength, | |
H = c.deg2rad; | |
c.CenteredSeriesMixin = { | |
getCenter: function() { | |
var c = this.options, | |
e = this.chart, | |
C = 2 * (c.slicedOffset || 0), | |
B = e.plotWidth - 2 * C; | |
e = e.plotHeight - 2 * C; | |
var u = c.center; | |
u = [I(u[0], "50%"), I(u[1], "50%"), c.size || "100%", c.innerSize || 0]; | |
var w = Math.min(B, e), | |
m; | |
for (m = 0; 4 > m; ++m) { | |
var r = u[m]; | |
c = 2 > m || 2 === m && /%$/.test(r); | |
u[m] = G(r, [B, e, w, u[2]][m]) + (c ? C : 0) | |
} | |
u[3] > u[2] && (u[3] = u[2]); | |
return u | |
}, | |
getStartAndEndRadians: function(c, e) { | |
c = F(c) ? c : 0; | |
e = F(e) && e > c && 360 > e - c ? e : c + 360; | |
return { | |
start: H * (c + -90), | |
end: H * (e + -90) | |
} | |
} | |
} | |
}); | |
M(J, "parts/PieSeries.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.clamp, | |
I = e.defined, | |
G = e.isNumber, | |
H = e.pick, | |
v = e.relativeLength, | |
q = e.setAnimation, | |
C = c.addEvent; | |
e = c.CenteredSeriesMixin; | |
var B = e.getStartAndEndRadians, | |
u = c.merge, | |
w = c.noop, | |
m = c.Point, | |
r = c.Series, | |
D = c.seriesType, | |
A = c.fireEvent; | |
D("pie", "line", { | |
center: [null, null], | |
clip: !1, | |
colorByPoint: !0, | |
dataLabels: { | |
allowOverlap: !0, | |
connectorPadding: 5, | |
connectorShape: "fixedOffset", | |
crookDistance: "70%", | |
distance: 30, | |
enabled: !0, | |
formatter: function() { | |
return this.point.isNull ? void 0 : this.point.name | |
}, | |
softConnector: !0, | |
x: 0 | |
}, | |
fillColor: void 0, | |
ignoreHiddenPoint: !0, | |
inactiveOtherPoints: !0, | |
legendType: "point", | |
marker: null, | |
size: null, | |
showInLegend: !1, | |
slicedOffset: 10, | |
stickyTracking: !1, | |
tooltip: { | |
followPointer: !0 | |
}, | |
borderColor: "#ffffff", | |
borderWidth: 1, | |
lineWidth: void 0, | |
states: { | |
hover: { | |
brightness: .1 | |
} | |
} | |
}, { | |
isCartesian: !1, | |
requireSorting: !1, | |
directTouch: !0, | |
noSharedTooltip: !0, | |
trackerGroups: ["group", "dataLabelsGroup"], | |
axisTypes: [], | |
pointAttribs: c.seriesTypes.column.prototype.pointAttribs, | |
animate: function(c) { | |
var b = this, | |
a = b.points, | |
d = b.startAngleRad; | |
c || (a.forEach(function(a) { | |
var c = a.graphic, | |
f = a.shapeArgs; | |
c && f && (c.attr({ | |
r: H(a.startR, b.center && b.center[3] / 2), | |
start: d, | |
end: d | |
}), c.animate({ | |
r: f.r, | |
start: f.start, | |
end: f.end | |
}, b.options.animation)) | |
}), b.animate = null) | |
}, | |
hasData: function() { | |
return !!this.processedXData.length | |
}, | |
updateTotals: function() { | |
var c, b = 0, | |
a = this.points, | |
d = a.length, | |
e = this.options.ignoreHiddenPoint; | |
for (c = 0; c < d; c++) { | |
var k = a[c]; | |
b += e && !k.visible ? 0 : k.isNull ? 0 : k.y | |
} | |
this.total = b; | |
for (c = 0; c < d; c++) k = a[c], k.percentage = 0 < b && (k.visible || !e) ? k.y / b * 100 : 0, k.total = b | |
}, | |
generatePoints: function() { | |
r.prototype.generatePoints.call(this); | |
this.updateTotals() | |
}, | |
getX: function(c, b, a) { | |
var d = this.center, | |
f = this.radii ? this.radii[a.index] : d[2] / 2; | |
c = Math.asin(F((c - d[1]) / (f + a.labelDistance), -1, 1)); | |
return d[0] + (b ? -1 : 1) * Math.cos(c) * (f + a.labelDistance) + (0 < a.labelDistance ? (b ? -1 : 1) * this.options.dataLabels.padding : 0) | |
}, | |
translate: function(c) { | |
this.generatePoints(); | |
var b = 0, | |
a = this.options, | |
d = a.slicedOffset, | |
f = d + (a.borderWidth || 0), | |
e = B(a.startAngle, a.endAngle), | |
l = this.startAngleRad = e.start; | |
e = (this.endAngleRad = e.end) - l; | |
var m = this.points, | |
p = a.dataLabels.distance; | |
a = a.ignoreHiddenPoint; | |
var g, t = m.length; | |
c || (this.center = c = this.getCenter()); | |
for (g = 0; g < t; g++) { | |
var q = m[g]; | |
var r = l + b * e; | |
if (!a || q.visible) b += q.percentage / 100; | |
var u = l + b * e; | |
q.shapeType = "arc"; | |
q.shapeArgs = { | |
x: c[0], | |
y: c[1], | |
r: c[2] / 2, | |
innerR: c[3] / 2, | |
start: Math.round(1E3 * r) / 1E3, | |
end: Math.round(1E3 * u) / 1E3 | |
}; | |
q.labelDistance = H(q.options.dataLabels && | |
q.options.dataLabels.distance, p); | |
q.labelDistance = v(q.labelDistance, q.shapeArgs.r); | |
this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, q.labelDistance); | |
u = (u + r) / 2; | |
u > 1.5 * Math.PI ? u -= 2 * Math.PI : u < -Math.PI / 2 && (u += 2 * Math.PI); | |
q.slicedTranslation = { | |
translateX: Math.round(Math.cos(u) * d), | |
translateY: Math.round(Math.sin(u) * d) | |
}; | |
var n = Math.cos(u) * c[2] / 2; | |
var z = Math.sin(u) * c[2] / 2; | |
q.tooltipPos = [c[0] + .7 * n, c[1] + .7 * z]; | |
q.half = u < -Math.PI / 2 || u > Math.PI / 2 ? 1 : 0; | |
q.angle = u; | |
r = Math.min(f, q.labelDistance / 5); | |
q.labelPosition = { | |
natural: { | |
x: c[0] + | |
n + Math.cos(u) * q.labelDistance, | |
y: c[1] + z + Math.sin(u) * q.labelDistance | |
}, | |
"final": {}, | |
alignment: 0 > q.labelDistance ? "center" : q.half ? "right" : "left", | |
connectorPosition: { | |
breakAt: { | |
x: c[0] + n + Math.cos(u) * r, | |
y: c[1] + z + Math.sin(u) * r | |
}, | |
touchingSliceAt: { | |
x: c[0] + n, | |
y: c[1] + z | |
} | |
} | |
} | |
} | |
A(this, "afterTranslate") | |
}, | |
drawEmpty: function() { | |
var c = this.options; | |
if (0 === this.total) { | |
var b = this.center[0]; | |
var a = this.center[1]; | |
this.graph || (this.graph = this.chart.renderer.circle(b, a, 0).addClass("highcharts-graph").add(this.group)); | |
this.graph.animate({ | |
"stroke-width": c.borderWidth, | |
cx: b, | |
cy: a, | |
r: this.center[2] / 2, | |
fill: c.fillColor || "none", | |
stroke: c.color || "#cccccc" | |
}) | |
} else this.graph && (this.graph = this.graph.destroy()) | |
}, | |
redrawPoints: function() { | |
var c = this, | |
b = c.chart, | |
a = b.renderer, | |
d, e, k, l, m = c.options.shadow; | |
this.drawEmpty(); | |
!m || c.shadowGroup || b.styledMode || (c.shadowGroup = a.g("shadow").attr({ | |
zIndex: -1 | |
}).add(c.group)); | |
c.points.forEach(function(f) { | |
var g = {}; | |
e = f.graphic; | |
if (!f.isNull && e) { | |
l = f.shapeArgs; | |
d = f.getTranslate(); | |
if (!b.styledMode) { | |
var h = f.shadowGroup; | |
m && !h && (h = f.shadowGroup = a.g("shadow").add(c.shadowGroup)); | |
h && h.attr(d); | |
k = c.pointAttribs(f, f.selected && "select") | |
} | |
f.delayedRendering ? (e.setRadialReference(c.center).attr(l).attr(d), b.styledMode || e.attr(k).attr({ | |
"stroke-linejoin": "round" | |
}).shadow(m, h), f.delayedRendering = !1) : (e.setRadialReference(c.center), b.styledMode || u(!0, g, k), u(!0, g, l, d), e.animate(g)); | |
e.attr({ | |
visibility: f.visible ? "inherit" : "hidden" | |
}); | |
e.addClass(f.getClassName()) | |
} else e && (f.graphic = e.destroy()) | |
}) | |
}, | |
drawPoints: function() { | |
var c = this.chart.renderer; | |
this.points.forEach(function(b) { | |
b.graphic || | |
(b.graphic = c[b.shapeType](b.shapeArgs).add(b.series.group), b.delayedRendering = !0) | |
}) | |
}, | |
searchPoint: w, | |
sortByAngle: function(c, b) { | |
c.sort(function(a, d) { | |
return "undefined" !== typeof a.angle && (d.angle - a.angle) * b | |
}) | |
}, | |
drawLegendSymbol: c.LegendSymbolMixin.drawRectangle, | |
getCenter: e.getCenter, | |
getSymbol: w, | |
drawGraph: null | |
}, { | |
init: function() { | |
m.prototype.init.apply(this, arguments); | |
var c = this; | |
c.name = H(c.name, "Slice"); | |
var b = function(a) { | |
c.slice("select" === a.type) | |
}; | |
C(c, "select", b); | |
C(c, "unselect", b); | |
return c | |
}, | |
isValid: function() { | |
return G(this.y) && | |
0 <= this.y | |
}, | |
setVisible: function(c, b) { | |
var a = this, | |
d = a.series, | |
f = d.chart, | |
e = d.options.ignoreHiddenPoint; | |
b = H(b, e); | |
c !== a.visible && (a.visible = a.options.visible = c = "undefined" === typeof c ? !a.visible : c, d.options.data[d.data.indexOf(a)] = a.options, ["graphic", "dataLabel", "connector", "shadowGroup"].forEach(function(b) { | |
if (a[b]) a[b][c ? "show" : "hide"](!0) | |
}), a.legendItem && f.legend.colorizeItem(a, c), c || "hover" !== a.state || a.setState(""), e && (d.isDirty = !0), b && f.redraw()) | |
}, | |
slice: function(c, b, a) { | |
var d = this.series; | |
q(a, d.chart); | |
H(b, !0); | |
this.sliced = this.options.sliced = I(c) ? c : !this.sliced; | |
d.options.data[d.data.indexOf(this)] = this.options; | |
this.graphic.animate(this.getTranslate()); | |
this.shadowGroup && this.shadowGroup.animate(this.getTranslate()) | |
}, | |
getTranslate: function() { | |
return this.sliced ? this.slicedTranslation : { | |
translateX: 0, | |
translateY: 0 | |
} | |
}, | |
haloPath: function(c) { | |
var b = this.shapeArgs; | |
return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(b.x, b.y, b.r + c, b.r + c, { | |
innerR: b.r - 1, | |
start: b.start, | |
end: b.end | |
}) | |
}, | |
connectorShapes: { | |
fixedOffset: function(c, | |
b, a) { | |
var d = b.breakAt; | |
b = b.touchingSliceAt; | |
return ["M", c.x, c.y].concat(a.softConnector ? ["C", c.x + ("left" === c.alignment ? -5 : 5), c.y, 2 * d.x - b.x, 2 * d.y - b.y, d.x, d.y] : ["L", d.x, d.y]).concat(["L", b.x, b.y]) | |
}, | |
straight: function(c, b) { | |
b = b.touchingSliceAt; | |
return ["M", c.x, c.y, "L", b.x, b.y] | |
}, | |
crookedLine: function(c, b, a) { | |
b = b.touchingSliceAt; | |
var d = this.series, | |
e = d.center[0], | |
f = d.chart.plotWidth, | |
l = d.chart.plotLeft; | |
d = c.alignment; | |
var m = this.shapeArgs.r; | |
a = v(a.crookDistance, 1); | |
a = "left" === d ? e + m + (f + l - e - m) * (1 - a) : l + (e - m) * a; | |
e = ["L", a, c.y]; | |
if ("left" === d ? a > c.x || a < b.x : a < c.x || a > b.x) e = []; | |
return ["M", c.x, c.y].concat(e).concat(["L", b.x, b.y]) | |
} | |
}, | |
getConnectorPath: function() { | |
var c = this.labelPosition, | |
b = this.series.options.dataLabels, | |
a = b.connectorShape, | |
d = this.connectorShapes; | |
d[a] && (a = d[a]); | |
return a.call(this, { | |
x: c.final.x, | |
y: c.final.y, | |
alignment: c.alignment | |
}, c.connectorPosition, b) | |
} | |
}); | |
"" | |
}); | |
M(J, "parts/DataLabels.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.animObject, | |
I = e.arrayMax, | |
G = e.clamp, | |
H = e.defined, | |
v = e.extend, | |
q = e.isArray, | |
C = e.objectEach, | |
B = e.pick, | |
u = e.relativeLength, | |
w = e.splat, | |
m = c.format, | |
r = c.merge; | |
e = c.noop; | |
var D = c.Series, | |
A = c.seriesTypes, | |
f = c.stableSort; | |
c.distribute = function(b, a, d) { | |
function e(a, b) { | |
return a.target - b.target | |
} | |
var k, l = !0, | |
m = b, | |
p = []; | |
var g = 0; | |
var t = m.reducedLen || a; | |
for (k = b.length; k--;) g += b[k].size; | |
if (g > t) { | |
f(b, function(a, b) { | |
return (b.rank || 0) - (a.rank || 0) | |
}); | |
for (g = k = 0; g <= t;) g += b[k].size, k++; | |
p = b.splice(k - 1, b.length) | |
} | |
f(b, e); | |
for (b = b.map(function(a) { | |
return { | |
size: a.size, | |
targets: [a.target], | |
align: B(a.align, .5) | |
} | |
}); l;) { | |
for (k = b.length; k--;) l = | |
b[k], g = (Math.min.apply(0, l.targets) + Math.max.apply(0, l.targets)) / 2, l.pos = G(g - l.size * l.align, 0, a - l.size); | |
k = b.length; | |
for (l = !1; k--;) 0 < k && b[k - 1].pos + b[k - 1].size > b[k].pos && (b[k - 1].size += b[k].size, b[k - 1].targets = b[k - 1].targets.concat(b[k].targets), b[k - 1].align = .5, b[k - 1].pos + b[k - 1].size > a && (b[k - 1].pos = a - b[k - 1].size), b.splice(k, 1), l = !0) | |
} | |
m.push.apply(m, p); | |
k = 0; | |
b.some(function(b) { | |
var e = 0; | |
if (b.targets.some(function() { | |
m[k].pos = b.pos + e; | |
if (Math.abs(m[k].pos - m[k].target) > d) return m.slice(0, k + 1).forEach(function(a) { | |
delete a.pos | |
}), | |
m.reducedLen = (m.reducedLen || a) - .1 * a, m.reducedLen > .1 * a && c.distribute(m, a, d), !0; | |
e += m[k].size; | |
k++ | |
})) return !0 | |
}); | |
f(m, e) | |
}; | |
D.prototype.drawDataLabels = function() { | |
function b(a, b) { | |
var d = b.filter; | |
return d ? (b = d.operator, a = a[d.property], d = d.value, ">" === b && a > d || "<" === b && a < d || ">=" === b && a >= d || "<=" === b && a <= d || "==" === b && a == d || "===" === b && a === d ? !0 : !1) : !0 | |
} | |
function a(a, b) { | |
var d = [], | |
c; | |
if (q(a) && !q(b)) d = a.map(function(a) { | |
return r(a, b) | |
}); | |
else if (q(b) && !q(a)) d = b.map(function(b) { | |
return r(a, b) | |
}); | |
else if (q(a) || q(b)) | |
for (c = Math.max(a.length, | |
b.length); c--;) d[c] = r(a[c], b[c]); | |
else d = r(a, b); | |
return d | |
} | |
var d = this, | |
e = d.chart, | |
f = d.options, | |
l = f.dataLabels, | |
y = d.points, | |
p, g = d.hasRendered || 0, | |
t = F(f.animation).duration, | |
x = Math.min(t, 200), | |
u = !e.renderer.forExport && B(l.defer, 0 < x), | |
v = e.renderer; | |
l = a(a(e.options.plotOptions && e.options.plotOptions.series && e.options.plotOptions.series.dataLabels, e.options.plotOptions && e.options.plotOptions[d.type] && e.options.plotOptions[d.type].dataLabels), l); | |
c.fireEvent(this, "drawDataLabels"); | |
if (q(l) || l.enabled || d._hasPointLabels) { | |
var n = | |
d.plotGroup("dataLabelsGroup", "data-labels", u && !g ? "hidden" : "inherit", l.zIndex || 6); | |
u && (n.attr({ | |
opacity: +g | |
}), g || setTimeout(function() { | |
var a = d.dataLabelsGroup; | |
a && (d.visible && n.show(!0), a[f.animation ? "animate" : "attr"]({ | |
opacity: 1 | |
}, { | |
duration: x | |
})) | |
}, t - x)); | |
y.forEach(function(c) { | |
p = w(a(l, c.dlOptions || c.options && c.options.dataLabels)); | |
p.forEach(function(a, g) { | |
var h = a.enabled && (!c.isNull || c.dataLabelOnNull) && b(c, a), | |
l = c.dataLabels ? c.dataLabels[g] : c.dataLabel, | |
p = c.connectors ? c.connectors[g] : c.connector, | |
k = B(a.distance, | |
c.labelDistance), | |
t = !l; | |
if (h) { | |
var q = c.getLabelConfig(); | |
var r = B(a[c.formatPrefix + "Format"], a.format); | |
q = H(r) ? m(r, q, e) : (a[c.formatPrefix + "Formatter"] || a.formatter).call(q, a); | |
r = a.style; | |
var y = a.rotation; | |
e.styledMode || (r.color = B(a.color, r.color, d.color, "#000000"), "contrast" === r.color ? (c.contrastColor = v.getContrast(c.color || d.color), r.color = !H(k) && a.inside || 0 > k || f.stacking ? c.contrastColor : "#000000") : delete c.contrastColor, f.cursor && (r.cursor = f.cursor)); | |
var x = { | |
r: a.borderRadius || 0, | |
rotation: y, | |
padding: a.padding, | |
zIndex: 1 | |
}; | |
e.styledMode || (x.fill = a.backgroundColor, x.stroke = a.borderColor, x["stroke-width"] = a.borderWidth); | |
C(x, function(a, b) { | |
"undefined" === typeof a && delete x[b] | |
}) | |
}!l || h && H(q) ? h && H(q) && (l ? x.text = q : (c.dataLabels = c.dataLabels || [], l = c.dataLabels[g] = y ? v.text(q, 0, -9999).addClass("highcharts-data-label") : v.label(q, 0, -9999, a.shape, null, null, a.useHTML, null, "data-label"), g || (c.dataLabel = l), l.addClass(" highcharts-data-label-color-" + c.colorIndex + " " + (a.className || "") + (a.useHTML ? " highcharts-tracker" : ""))), l.options = | |
a, l.attr(x), e.styledMode || l.css(r).shadow(a.shadow), l.added || l.add(n), a.textPath && !a.useHTML && (l.setTextPath(c.getDataLabelPath && c.getDataLabelPath(l) || c.graphic, a.textPath), c.dataLabelPath && !a.textPath.enabled && (c.dataLabelPath = c.dataLabelPath.destroy())), d.alignDataLabel(c, l, a, null, t)) : (c.dataLabel = c.dataLabel && c.dataLabel.destroy(), c.dataLabels && (1 === c.dataLabels.length ? delete c.dataLabels : delete c.dataLabels[g]), g || delete c.dataLabel, p && (c.connector = c.connector.destroy(), c.connectors && (1 === c.connectors.length ? | |
delete c.connectors : delete c.connectors[g]))) | |
}) | |
}) | |
} | |
c.fireEvent(this, "afterDrawDataLabels") | |
}; | |
D.prototype.alignDataLabel = function(b, a, c, e, f) { | |
var d = this, | |
h = this.chart, | |
p = this.isCartesian && h.inverted, | |
g = this.enabledDataSorting, | |
k = B(b.dlBox && b.dlBox.centerX, b.plotX, -9999), | |
m = B(b.plotY, -9999), | |
q = a.getBBox(), | |
r = c.rotation, | |
n = c.align, | |
u = h.isInsidePlot(k, Math.round(m), p), | |
w = "justify" === B(c.overflow, g ? "none" : "justify"), | |
A = this.visible && (b.series.forceDL || g && !w || u || e && h.isInsidePlot(k, p ? e.x + 1 : e.y + e.height - 1, p)); | |
var C = function(c) { | |
g && | |
d.xAxis && !w && d.setDataLabelStartPos(b, a, f, u, c) | |
}; | |
if (A) { | |
var D = h.renderer.fontMetrics(h.styledMode ? void 0 : c.style.fontSize, a).b; | |
e = v({ | |
x: p ? this.yAxis.len - m : k, | |
y: Math.round(p ? this.xAxis.len - k : m), | |
width: 0, | |
height: 0 | |
}, e); | |
v(c, { | |
width: q.width, | |
height: q.height | |
}); | |
r ? (w = !1, k = h.renderer.rotCorr(D, r), k = { | |
x: e.x + c.x + e.width / 2 + k.x, | |
y: e.y + c.y + { | |
top: 0, | |
middle: .5, | |
bottom: 1 | |
}[c.verticalAlign] * e.height | |
}, C(k), a[f ? "attr" : "animate"](k).attr({ | |
align: n | |
}), C = (r + 720) % 360, C = 180 < C && 360 > C, "left" === n ? k.y -= C ? q.height : 0 : "center" === n ? (k.x -= q.width / | |
2, k.y -= q.height / 2) : "right" === n && (k.x -= q.width, k.y -= C ? 0 : q.height), a.placed = !0, a.alignAttr = k) : (C(e), a.align(c, null, e), k = a.alignAttr); | |
w && 0 <= e.height ? this.justifyDataLabel(a, c, k, q, e, f) : B(c.crop, !0) && (A = h.isInsidePlot(k.x, k.y) && h.isInsidePlot(k.x + q.width, k.y + q.height)); | |
if (c.shape && !r) a[f ? "attr" : "animate"]({ | |
anchorX: p ? h.plotWidth - b.plotY : b.plotX, | |
anchorY: p ? h.plotHeight - b.plotX : b.plotY | |
}) | |
} | |
f && g && (a.placed = !1); | |
A || g && !w || (a.hide(!0), a.placed = !1) | |
}; | |
D.prototype.setDataLabelStartPos = function(b, a, c, e, f) { | |
var d = this.chart, | |
h = d.inverted, | |
p = this.xAxis, | |
g = p.reversed, | |
k = h ? a.height / 2 : a.width / 2; | |
b = (b = b.pointWidth) ? b / 2 : 0; | |
p = h ? f.x : g ? -k - b : p.width - k + b; | |
f = h ? g ? this.yAxis.height - k + b : -k - b : f.y; | |
a.startXPos = p; | |
a.startYPos = f; | |
e ? "hidden" === a.visibility && (a.show(), a.attr({ | |
opacity: 0 | |
}).animate({ | |
opacity: 1 | |
})) : a.attr({ | |
opacity: 1 | |
}).animate({ | |
opacity: 0 | |
}, void 0, a.hide); | |
d.hasRendered && (c && a.attr({ | |
x: a.startXPos, | |
y: a.startYPos | |
}), a.placed = !0) | |
}; | |
D.prototype.justifyDataLabel = function(b, a, c, e, f, l) { | |
var d = this.chart, | |
h = a.align, | |
g = a.verticalAlign, | |
k = b.box ? 0 : b.padding || | |
0; | |
var m = c.x + k; | |
if (0 > m) { | |
"right" === h ? (a.align = "left", a.inside = !0) : a.x = -m; | |
var q = !0 | |
} | |
m = c.x + e.width - k; | |
m > d.plotWidth && ("left" === h ? (a.align = "right", a.inside = !0) : a.x = d.plotWidth - m, q = !0); | |
m = c.y + k; | |
0 > m && ("bottom" === g ? (a.verticalAlign = "top", a.inside = !0) : a.y = -m, q = !0); | |
m = c.y + e.height - k; | |
m > d.plotHeight && ("top" === g ? (a.verticalAlign = "bottom", a.inside = !0) : a.y = d.plotHeight - m, q = !0); | |
q && (b.placed = !l, b.align(a, null, f)); | |
return q | |
}; | |
A.pie && (A.pie.prototype.dataLabelPositioners = { | |
radialDistributionY: function(b) { | |
return b.top + b.distributeBox.pos | |
}, | |
radialDistributionX: function(b, a, c, e) { | |
return b.getX(c < a.top + 2 || c > a.bottom - 2 ? e : c, a.half, a) | |
}, | |
justify: function(b, a, c) { | |
return c[0] + (b.half ? -1 : 1) * (a + b.labelDistance) | |
}, | |
alignToPlotEdges: function(b, a, c, e) { | |
b = b.getBBox().width; | |
return a ? b + e : c - b - e | |
}, | |
alignToConnectors: function(b, a, c, e) { | |
var d = 0, | |
f; | |
b.forEach(function(a) { | |
f = a.dataLabel.getBBox().width; | |
f > d && (d = f) | |
}); | |
return a ? d + e : c - d - e | |
} | |
}, A.pie.prototype.drawDataLabels = function() { | |
var b = this, | |
a = b.data, | |
d, e = b.chart, | |
f = b.options.dataLabels, | |
l = f.connectorPadding, | |
m, p = e.plotWidth, | |
g = e.plotHeight, | |
q = e.plotLeft, | |
x = Math.round(e.chartWidth / 3), | |
u, v = b.center, | |
n = v[2] / 2, | |
z = v[1], | |
w, A, C, F, G = [ | |
[], | |
[] | |
], | |
J, K, M, S, U = [0, 0, 0, 0], | |
X = b.dataLabelPositioners, | |
aa; | |
b.visible && (f.enabled || b._hasPointLabels) && (a.forEach(function(a) { | |
a.dataLabel && a.visible && a.dataLabel.shortened && (a.dataLabel.attr({ | |
width: "auto" | |
}).css({ | |
width: "auto", | |
textOverflow: "clip" | |
}), a.dataLabel.shortened = !1) | |
}), D.prototype.drawDataLabels.apply(b), a.forEach(function(a) { | |
a.dataLabel && (a.visible ? (G[a.half].push(a), a.dataLabel._pos = null, !H(f.style.width) && | |
!H(a.options.dataLabels && a.options.dataLabels.style && a.options.dataLabels.style.width) && a.dataLabel.getBBox().width > x && (a.dataLabel.css({ | |
width: .7 * x | |
}), a.dataLabel.shortened = !0)) : (a.dataLabel = a.dataLabel.destroy(), a.dataLabels && 1 === a.dataLabels.length && delete a.dataLabels)) | |
}), G.forEach(function(a, h) { | |
var k = a.length, | |
m = [], | |
r; | |
if (k) { | |
b.sortByAngle(a, h - .5); | |
if (0 < b.maxLabelDistance) { | |
var t = Math.max(0, z - n - b.maxLabelDistance); | |
var x = Math.min(z + n + b.maxLabelDistance, e.plotHeight); | |
a.forEach(function(a) { | |
0 < a.labelDistance && | |
a.dataLabel && (a.top = Math.max(0, z - n - a.labelDistance), a.bottom = Math.min(z + n + a.labelDistance, e.plotHeight), r = a.dataLabel.getBBox().height || 21, a.distributeBox = { | |
target: a.labelPosition.natural.y - a.top + r / 2, | |
size: r, | |
rank: a.y | |
}, m.push(a.distributeBox)) | |
}); | |
t = x + r - t; | |
c.distribute(m, t, t / 5) | |
} | |
for (S = 0; S < k; S++) { | |
d = a[S]; | |
C = d.labelPosition; | |
w = d.dataLabel; | |
M = !1 === d.visible ? "hidden" : "inherit"; | |
K = t = C.natural.y; | |
m && H(d.distributeBox) && ("undefined" === typeof d.distributeBox.pos ? M = "hidden" : (F = d.distributeBox.size, K = X.radialDistributionY(d))); | |
delete d.positionIndex; | |
if (f.justify) J = X.justify(d, n, v); | |
else switch (f.alignTo) { | |
case "connectors": | |
J = X.alignToConnectors(a, h, p, q); | |
break; | |
case "plotEdges": | |
J = X.alignToPlotEdges(w, h, p, q); | |
break; | |
default: | |
J = X.radialDistributionX(b, d, K, t) | |
} | |
w._attr = { | |
visibility: M, | |
align: C.alignment | |
}; | |
w._pos = { | |
x: J + f.x + ({ | |
left: l, | |
right: -l | |
}[C.alignment] || 0), | |
y: K + f.y - 10 | |
}; | |
C.final.x = J; | |
C.final.y = K; | |
B(f.crop, !0) && (A = w.getBBox().width, t = null, J - A < l && 1 === h ? (t = Math.round(A - J + l), U[3] = Math.max(t, U[3])) : J + A > p - l && 0 === h && (t = Math.round(J + A - p + l), U[1] = Math.max(t, | |
U[1])), 0 > K - F / 2 ? U[0] = Math.max(Math.round(-K + F / 2), U[0]) : K + F / 2 > g && (U[2] = Math.max(Math.round(K + F / 2 - g), U[2])), w.sideOverflow = t) | |
} | |
} | |
}), 0 === I(U) || this.verifyDataLabelOverflow(U)) && (this.placeDataLabels(), this.points.forEach(function(a) { | |
aa = r(f, a.options.dataLabels); | |
if (m = B(aa.connectorWidth, 1)) { | |
var c; | |
u = a.connector; | |
if ((w = a.dataLabel) && w._pos && a.visible && 0 < a.labelDistance) { | |
M = w._attr.visibility; | |
if (c = !u) a.connector = u = e.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + a.colorIndex + (a.className ? | |
" " + a.className : "")).add(b.dataLabelsGroup), e.styledMode || u.attr({ | |
"stroke-width": m, | |
stroke: aa.connectorColor || a.color || "#666666" | |
}); | |
u[c ? "attr" : "animate"]({ | |
d: a.getConnectorPath() | |
}); | |
u.attr("visibility", M) | |
} else u && (a.connector = u.destroy()) | |
} | |
})) | |
}, A.pie.prototype.placeDataLabels = function() { | |
this.points.forEach(function(b) { | |
var a = b.dataLabel, | |
c; | |
a && b.visible && ((c = a._pos) ? (a.sideOverflow && (a._attr.width = Math.max(a.getBBox().width - a.sideOverflow, 0), a.css({ | |
width: a._attr.width + "px", | |
textOverflow: (this.options.dataLabels.style || {}).textOverflow || "ellipsis" | |
}), a.shortened = !0), a.attr(a._attr), a[a.moved ? "animate" : "attr"](c), a.moved = !0) : a && a.attr({ | |
y: -9999 | |
})); | |
delete b.distributeBox | |
}, this) | |
}, A.pie.prototype.alignDataLabel = e, A.pie.prototype.verifyDataLabelOverflow = function(b) { | |
var a = this.center, | |
c = this.options, | |
e = c.center, | |
f = c.minSize || 80, | |
l = null !== c.size; | |
if (!l) { | |
if (null !== e[0]) var m = Math.max(a[2] - Math.max(b[1], b[3]), f); | |
else m = Math.max(a[2] - b[1] - b[3], f), a[0] += (b[3] - b[1]) / 2; | |
null !== e[1] ? m = G(m, f, a[2] - Math.max(b[0], b[2])) : (m = G(m, f, a[2] - b[0] - | |
b[2]), a[1] += (b[0] - b[2]) / 2); | |
m < a[2] ? (a[2] = m, a[3] = Math.min(u(c.innerSize || 0, m), m), this.translate(a), this.drawDataLabels && this.drawDataLabels()) : l = !0 | |
} | |
return l | |
}); | |
A.column && (A.column.prototype.alignDataLabel = function(b, a, c, e, f) { | |
var d = this.chart.inverted, | |
h = b.series, | |
p = b.dlBox || b.shapeArgs, | |
g = B(b.below, b.plotY > B(this.translatedThreshold, h.yAxis.len)), | |
k = B(c.inside, !!this.options.stacking); | |
p && (e = r(p), 0 > e.y && (e.height += e.y, e.y = 0), p = e.y + e.height - h.yAxis.len, 0 < p && (e.height -= p), d && (e = { | |
x: h.yAxis.len - e.y - e.height, | |
y: h.xAxis.len - e.x - e.width, | |
width: e.height, | |
height: e.width | |
}), k || (d ? (e.x += g ? 0 : e.width, e.width = 0) : (e.y += g ? e.height : 0, e.height = 0))); | |
c.align = B(c.align, !d || k ? "center" : g ? "right" : "left"); | |
c.verticalAlign = B(c.verticalAlign, d || k ? "middle" : g ? "top" : "bottom"); | |
D.prototype.alignDataLabel.call(this, b, a, c, e, f); | |
e && (0 >= e.height && e.y === this.chart.plotHeight || 0 >= e.width && 0 === e.x) && (a.hide(!0), a.placed = !1); | |
c.inside && b.contrastColor && a.css({ | |
color: b.contrastColor | |
}) | |
}) | |
}); | |
M(J, "modules/overlapping-datalabels.src.js", [J["parts/Globals.js"], | |
J["parts/Utilities.js"] | |
], function(c, e) { | |
var F = e.isArray, | |
I = e.objectEach, | |
G = e.pick; | |
e = c.Chart; | |
var H = c.addEvent, | |
v = c.fireEvent; | |
H(e, "render", function() { | |
var c = []; | |
(this.labelCollectors || []).forEach(function(e) { | |
c = c.concat(e()) | |
}); | |
(this.yAxis || []).forEach(function(e) { | |
e.options.stackLabels && !e.options.stackLabels.allowOverlap && I(e.stacks, function(e) { | |
I(e, function(e) { | |
c.push(e.label) | |
}) | |
}) | |
}); | |
(this.series || []).forEach(function(e) { | |
var q = e.options.dataLabels; | |
e.visible && (!1 !== q.enabled || e._hasPointLabels) && e.points.forEach(function(e) { | |
e.visible && | |
(F(e.dataLabels) ? e.dataLabels : e.dataLabel ? [e.dataLabel] : []).forEach(function(q) { | |
var m = q.options; | |
q.labelrank = G(m.labelrank, e.labelrank, e.shapeArgs && e.shapeArgs.height); | |
m.allowOverlap || c.push(q) | |
}) | |
}) | |
}); | |
this.hideOverlappingLabels(c) | |
}); | |
e.prototype.hideOverlappingLabels = function(c) { | |
var e = this, | |
q = c.length, | |
u = e.renderer, | |
w, m, r, D = !1; | |
var A = function(a) { | |
var b = a.box ? 0 : a.padding || 0; | |
var c = 0; | |
if (a && (!a.alignAttr || a.placed)) { | |
var e = a.alignAttr || { | |
x: a.attr("x"), | |
y: a.attr("y") | |
}; | |
var f = a.parentGroup; | |
a.width || (c = a.getBBox(), | |
a.width = c.width, a.height = c.height, c = u.fontMetrics(null, a.element).h); | |
return { | |
x: e.x + (f.translateX || 0) + b, | |
y: e.y + (f.translateY || 0) + b - c, | |
width: a.width - 2 * b, | |
height: a.height - 2 * b | |
} | |
} | |
}; | |
for (m = 0; m < q; m++) | |
if (w = c[m]) w.oldOpacity = w.opacity, w.newOpacity = 1, w.absoluteBox = A(w); | |
c.sort(function(a, b) { | |
return (b.labelrank || 0) - (a.labelrank || 0) | |
}); | |
for (m = 0; m < q; m++) { | |
var f = (A = c[m]) && A.absoluteBox; | |
for (w = m + 1; w < q; ++w) { | |
var b = (r = c[w]) && r.absoluteBox; | |
!f || !b || A === r || 0 === A.newOpacity || 0 === r.newOpacity || b.x > f.x + f.width || b.x + b.width < f.x || b.y > | |
f.y + f.height || b.y + b.height < f.y || ((A.labelrank < r.labelrank ? A : r).newOpacity = 0) | |
} | |
} | |
c.forEach(function(a) { | |
var b; | |
if (a) { | |
var c = a.newOpacity; | |
a.oldOpacity !== c && (a.alignAttr && a.placed ? (c ? a.show(!0) : b = function() { | |
a.hide(!0); | |
a.placed = !1 | |
}, D = !0, a.alignAttr.opacity = c, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b), v(e, "afterHideOverlappingLabel")) : a.attr({ | |
opacity: c | |
})); | |
a.isOld = !0 | |
} | |
}); | |
D && v(e, "afterHideAllOverlappingLabels") | |
} | |
}); | |
M(J, "parts/Interaction.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = | |
e.defined, | |
I = e.extend, | |
G = e.isArray, | |
H = e.isObject, | |
v = e.objectEach, | |
q = e.pick, | |
C = c.addEvent; | |
e = c.Chart; | |
var B = c.createElement, | |
u = c.css, | |
w = c.defaultOptions, | |
m = c.defaultPlotOptions, | |
r = c.fireEvent, | |
D = c.hasTouch, | |
A = c.Legend, | |
f = c.merge, | |
b = c.Point, | |
a = c.Series, | |
d = c.seriesTypes, | |
h = c.svg; | |
var k = c.TrackerMixin = { | |
drawTrackerPoint: function() { | |
var a = this, | |
b = a.chart, | |
c = b.pointer, | |
d = function(a) { | |
var b = c.getPointFromEvent(a); | |
"undefined" !== typeof b && (c.isDirectTouch = !0, b.onMouseOver(a)) | |
}, | |
e; | |
a.points.forEach(function(a) { | |
e = G(a.dataLabels) ? a.dataLabels : | |
a.dataLabel ? [a.dataLabel] : []; | |
a.graphic && (a.graphic.element.point = a); | |
e.forEach(function(b) { | |
b.div ? b.div.point = a : b.element.point = a | |
}) | |
}); | |
a._hasTracking || (a.trackerGroups.forEach(function(e) { | |
if (a[e]) { | |
a[e].addClass("highcharts-tracker").on("mouseover", d).on("mouseout", function(a) { | |
c.onTrackerMouseOut(a) | |
}); | |
if (D) a[e].on("touchstart", d); | |
!b.styledMode && a.options.cursor && a[e].css(u).css({ | |
cursor: a.options.cursor | |
}) | |
} | |
}), a._hasTracking = !0); | |
r(this, "afterDrawTracker") | |
}, | |
drawTrackerGraph: function() { | |
var a = this, | |
b = a.options, | |
c = b.trackByArea, | |
d = [].concat(c ? a.areaPath : a.graphPath), | |
e = d.length, | |
f = a.chart, | |
k = f.pointer, | |
m = f.renderer, | |
n = f.options.tooltip.snap, | |
q = a.tracker, | |
u, v = function() { | |
if (f.hoverSeries !== a) a.onMouseOver() | |
}, | |
w = "rgba(192,192,192," + (h ? .0001 : .002) + ")"; | |
if (e && !c) | |
for (u = e + 1; u--;) "M" === d[u] && d.splice(u + 1, 0, d[u + 1] - n, d[u + 2], "L"), (u && "M" === d[u] || u === e) && d.splice(u, 0, "L", d[u - 2] + n, d[u - 1]); | |
q ? q.attr({ | |
d: d | |
}) : a.graph && (a.tracker = m.path(d).attr({ | |
visibility: a.visible ? "visible" : "hidden", | |
zIndex: 2 | |
}).addClass(c ? "highcharts-tracker-area" : | |
"highcharts-tracker-line").add(a.group), f.styledMode || a.tracker.attr({ | |
"stroke-linejoin": "round", | |
stroke: w, | |
fill: c ? w : "none", | |
"stroke-width": a.graph.strokeWidth() + (c ? 0 : 2 * n) | |
}), [a.tracker, a.markerGroup].forEach(function(a) { | |
a.addClass("highcharts-tracker").on("mouseover", v).on("mouseout", function(a) { | |
k.onTrackerMouseOut(a) | |
}); | |
b.cursor && !f.styledMode && a.css({ | |
cursor: b.cursor | |
}); | |
if (D) a.on("touchstart", v) | |
})); | |
r(this, "afterDrawTracker") | |
} | |
}; | |
d.column && (d.column.prototype.drawTracker = k.drawTrackerPoint); | |
d.pie && (d.pie.prototype.drawTracker = | |
k.drawTrackerPoint); | |
d.scatter && (d.scatter.prototype.drawTracker = k.drawTrackerPoint); | |
I(A.prototype, { | |
setItemEvents: function(a, c, d) { | |
var e = this, | |
h = e.chart.renderer.boxWrapper, | |
l = a instanceof b, | |
p = "highcharts-legend-" + (l ? "point" : "series") + "-active", | |
k = e.chart.styledMode; | |
(d ? c : a.legendGroup).on("mouseover", function() { | |
a.visible && e.allItems.forEach(function(b) { | |
a !== b && b.setState("inactive", !l) | |
}); | |
a.setState("hover"); | |
a.visible && h.addClass(p); | |
k || c.css(e.options.itemHoverStyle) | |
}).on("mouseout", function() { | |
e.chart.styledMode || | |
c.css(f(a.visible ? e.itemStyle : e.itemHiddenStyle)); | |
e.allItems.forEach(function(b) { | |
a !== b && b.setState("", !l) | |
}); | |
h.removeClass(p); | |
a.setState() | |
}).on("click", function(b) { | |
var c = function() { | |
a.setVisible && a.setVisible(); | |
e.allItems.forEach(function(b) { | |
a !== b && b.setState(a.visible ? "inactive" : "", !l) | |
}) | |
}; | |
h.removeClass(p); | |
b = { | |
browserEvent: b | |
}; | |
a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : r(a, "legendItemClick", b, c) | |
}) | |
}, | |
createCheckboxForItem: function(a) { | |
a.checkbox = B("input", { | |
type: "checkbox", | |
className: "highcharts-legend-checkbox", | |
checked: a.selected, | |
defaultChecked: a.selected | |
}, this.options.itemCheckboxStyle, this.chart.container); | |
C(a.checkbox, "click", function(b) { | |
r(a.series || a, "checkboxClick", { | |
checked: b.target.checked, | |
item: a | |
}, function() { | |
a.select() | |
}) | |
}) | |
} | |
}); | |
I(e.prototype, { | |
showResetZoom: function() { | |
function a() { | |
b.zoomOut() | |
} | |
var b = this, | |
c = w.lang, | |
d = b.options.chart.resetZoomButton, | |
e = d.theme, | |
f = e.states, | |
h = "chart" === d.relativeTo || "spaceBox" === d.relativeTo ? null : "plotBox"; | |
r(this, "beforeShowResetZoom", null, function() { | |
b.resetZoomButton = b.renderer.button(c.resetZoom, | |
null, null, a, e, f && f.hover).attr({ | |
align: d.position.align, | |
title: c.resetZoomTitle | |
}).addClass("highcharts-reset-zoom").add().align(d.position, !1, h) | |
}); | |
r(this, "afterShowResetZoom") | |
}, | |
zoomOut: function() { | |
r(this, "selection", { | |
resetSelection: !0 | |
}, this.zoom) | |
}, | |
zoom: function(a) { | |
var b = this, | |
c, d = b.pointer, | |
e = !1, | |
f = b.inverted ? d.mouseDownX : d.mouseDownY; | |
!a || a.resetSelection ? (b.axes.forEach(function(a) { | |
c = a.zoom() | |
}), d.initiated = !1) : a.xAxis.concat(a.yAxis).forEach(function(a) { | |
var g = a.axis, | |
h = b.inverted ? g.left : g.top, | |
l = b.inverted ? | |
h + g.width : h + g.height, | |
p = g.isXAxis, | |
k = !1; | |
if (!p && f >= h && f <= l || p || !F(f)) k = !0; | |
d[p ? "zoomX" : "zoomY"] && k && (c = g.zoom(a.min, a.max), g.displayBtn && (e = !0)) | |
}); | |
var h = b.resetZoomButton; | |
e && !h ? b.showResetZoom() : !e && H(h) && (b.resetZoomButton = h.destroy()); | |
c && b.redraw(q(b.options.chart.animation, a && a.animation, 100 > b.pointCount)) | |
}, | |
pan: function(a, b) { | |
var c = this, | |
d = c.hoverPoints, | |
e = c.options.chart, | |
f; | |
b = "object" === typeof b ? b : { | |
enabled: b, | |
type: "x" | |
}; | |
e && e.panning && (e.panning = b); | |
var h = b.type; | |
r(this, "pan", { | |
originalEvent: a | |
}, function() { | |
d && | |
d.forEach(function(a) { | |
a.setState() | |
}); | |
var b = [1]; | |
"xy" === h ? b = [1, 0] : "y" === h && (b = [0]); | |
b.forEach(function(b) { | |
var d = c[b ? "xAxis" : "yAxis"][0], | |
e = d.options, | |
g = d.horiz, | |
h = a[g ? "chartX" : "chartY"]; | |
g = g ? "mouseDownX" : "mouseDownY"; | |
var l = c[g], | |
k = (d.pointRange || 0) / 2, | |
p = d.reversed && !c.inverted || !d.reversed && c.inverted ? -1 : 1, | |
m = d.getExtremes(), | |
n = d.toValue(l - h, !0) + k * p; | |
p = d.toValue(l + d.len - h, !0) - k * p; | |
var q = p < n; | |
l = q ? p : n; | |
n = q ? n : p; | |
p = Math.min(m.dataMin, k ? m.min : d.toValue(d.toPixels(m.min) - d.minPixelPadding)); | |
k = Math.max(m.dataMax, k ? m.max : | |
d.toValue(d.toPixels(m.max) + d.minPixelPadding)); | |
if (!e.ordinal) { | |
b && (e = p - l, 0 < e && (n += e, l = p), e = n - k, 0 < e && (n = k, l -= e)); | |
if (d.series.length && l !== m.min && n !== m.max && b || d.panningState && l >= d.panningState.startMin && n <= d.panningState.startMax) d.setExtremes(l, n, !1, !1, { | |
trigger: "pan" | |
}), f = !0; | |
c[g] = h | |
} | |
}); | |
f && c.redraw(!1); | |
u(c.container, { | |
cursor: "move" | |
}) | |
}) | |
} | |
}); | |
I(b.prototype, { | |
select: function(a, b) { | |
var c = this, | |
d = c.series, | |
e = d.chart; | |
this.selectedStaging = a = q(a, !c.selected); | |
c.firePointEvent(a ? "select" : "unselect", { | |
accumulate: b | |
}, function() { | |
c.selected = | |
c.options.selected = a; | |
d.options.data[d.data.indexOf(c)] = c.options; | |
c.setState(a && "select"); | |
b || e.getSelectedPoints().forEach(function(a) { | |
var b = a.series; | |
a.selected && a !== c && (a.selected = a.options.selected = !1, b.options.data[b.data.indexOf(a)] = a.options, a.setState(e.hoverPoints && b.options.inactiveOtherPoints ? "inactive" : ""), a.firePointEvent("unselect")) | |
}) | |
}); | |
delete this.selectedStaging | |
}, | |
onMouseOver: function(a) { | |
var b = this.series.chart, | |
c = b.pointer; | |
a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted); | |
c.runPointActions(a, this) | |
}, | |
onMouseOut: function() { | |
var a = this.series.chart; | |
this.firePointEvent("mouseOut"); | |
this.series.options.inactiveOtherPoints || (a.hoverPoints || []).forEach(function(a) { | |
a.setState() | |
}); | |
a.hoverPoints = a.hoverPoint = null | |
}, | |
importEvents: function() { | |
if (!this.hasImportedEvents) { | |
var a = this, | |
b = f(a.series.options.point, a.options).events; | |
a.events = b; | |
v(b, function(b, d) { | |
c.isFunction(b) && C(a, d, b) | |
}); | |
this.hasImportedEvents = !0 | |
} | |
}, | |
setState: function(a, b) { | |
var c = this.series, | |
d = this.state, | |
e = c.options.states[a || | |
"normal"] || {}, | |
f = m[c.type].marker && c.options.marker, | |
h = f && !1 === f.enabled, | |
l = f && f.states && f.states[a || "normal"] || {}, | |
k = !1 === l.enabled, | |
u = c.stateMarkerGraphic, | |
v = this.marker || {}, | |
y = c.chart, | |
w = c.halo, | |
A, B = f && c.markerAttribs; | |
a = a || ""; | |
if (!(a === this.state && !b || this.selected && "select" !== a || !1 === e.enabled || a && (k || h && !1 === l.enabled) || a && v.states && v.states[a] && !1 === v.states[a].enabled)) { | |
this.state = a; | |
B && (A = c.markerAttribs(this, a)); | |
if (this.graphic) { | |
d && this.graphic.removeClass("highcharts-point-" + d); | |
a && this.graphic.addClass("highcharts-point-" + | |
a); | |
if (!y.styledMode) { | |
var C = c.pointAttribs(this, a); | |
var D = q(y.options.chart.animation, e.animation); | |
c.options.inactiveOtherPoints && ((this.dataLabels || []).forEach(function(a) { | |
a && a.animate({ | |
opacity: C.opacity | |
}, D) | |
}), this.connector && this.connector.animate({ | |
opacity: C.opacity | |
}, D)); | |
this.graphic.animate(C, D) | |
} | |
A && this.graphic.animate(A, q(y.options.chart.animation, l.animation, f.animation)); | |
u && u.hide() | |
} else { | |
if (a && l) { | |
d = v.symbol || c.symbol; | |
u && u.currentSymbol !== d && (u = u.destroy()); | |
if (A) | |
if (u) u[b ? "animate" : "attr"]({ | |
x: A.x, | |
y: A.y | |
}); | |
else d && (c.stateMarkerGraphic = u = y.renderer.symbol(d, A.x, A.y, A.width, A.height).add(c.markerGroup), u.currentSymbol = d); | |
!y.styledMode && u && u.attr(c.pointAttribs(this, a)) | |
} | |
u && (u[a && this.isInside ? "show" : "hide"](), u.element.point = this) | |
} | |
a = e.halo; | |
e = (u = this.graphic || u) && u.visibility || "inherit"; | |
a && a.size && u && "hidden" !== e && !this.isCluster ? (w || (c.halo = w = y.renderer.path().add(u.parentGroup)), w.show()[b ? "animate" : "attr"]({ | |
d: this.haloPath(a.size) | |
}), w.attr({ | |
"class": "highcharts-halo highcharts-color-" + q(this.colorIndex, | |
c.colorIndex) + (this.className ? " " + this.className : ""), | |
visibility: e, | |
zIndex: -1 | |
}), w.point = this, y.styledMode || w.attr(I({ | |
fill: this.color || c.color, | |
"fill-opacity": a.opacity | |
}, a.attributes))) : w && w.point && w.point.haloPath && w.animate({ | |
d: w.point.haloPath(0) | |
}, null, w.hide); | |
r(this, "afterSetState") | |
} | |
}, | |
haloPath: function(a) { | |
return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a) | |
} | |
}); | |
I(a.prototype, { | |
onMouseOver: function() { | |
var a = this.chart, | |
b = a.hoverSeries; | |
if (b && b !== this) b.onMouseOut(); | |
this.options.events.mouseOver && r(this, "mouseOver"); | |
this.setState("hover"); | |
a.hoverSeries = this | |
}, | |
onMouseOut: function() { | |
var a = this.options, | |
b = this.chart, | |
c = b.tooltip, | |
d = b.hoverPoint; | |
b.hoverSeries = null; | |
if (d) d.onMouseOut(); | |
this && a.events.mouseOut && r(this, "mouseOut"); | |
!c || this.stickyTracking || c.shared && !this.noSharedTooltip || c.hide(); | |
b.series.forEach(function(a) { | |
a.setState("", !0) | |
}) | |
}, | |
setState: function(a, b) { | |
var c = this, | |
d = c.options, | |
e = c.graph, | |
f = d.inactiveOtherPoints, | |
h = d.states, | |
l = d.lineWidth, | |
k = d.opacity, | |
m = q(h[a || | |
"normal"] && h[a || "normal"].animation, c.chart.options.chart.animation); | |
d = 0; | |
a = a || ""; | |
if (c.state !== a && ([c.group, c.markerGroup, c.dataLabelsGroup].forEach(function(b) { | |
b && (c.state && b.removeClass("highcharts-series-" + c.state), a && b.addClass("highcharts-series-" + a)) | |
}), c.state = a, !c.chart.styledMode)) { | |
if (h[a] && !1 === h[a].enabled) return; | |
a && (l = h[a].lineWidth || l + (h[a].lineWidthPlus || 0), k = q(h[a].opacity, k)); | |
if (e && !e.dashstyle) | |
for (h = { | |
"stroke-width": l | |
}, e.animate(h, m); c["zone-graph-" + d];) c["zone-graph-" + d].attr(h), d += | |
1; | |
f || [c.group, c.markerGroup, c.dataLabelsGroup, c.labelBySeries].forEach(function(a) { | |
a && a.animate({ | |
opacity: k | |
}, m) | |
}) | |
} | |
b && f && c.points && c.setAllPointsToState(a) | |
}, | |
setAllPointsToState: function(a) { | |
this.points.forEach(function(b) { | |
b.setState && b.setState(a) | |
}) | |
}, | |
setVisible: function(a, b) { | |
var c = this, | |
d = c.chart, | |
e = c.legendItem, | |
f = d.options.chart.ignoreHiddenSeries, | |
h = c.visible; | |
var k = (c.visible = a = c.options.visible = c.userOptions.visible = "undefined" === typeof a ? !h : a) ? "show" : "hide"; | |
["group", "dataLabelsGroup", "markerGroup", | |
"tracker", "tt" | |
].forEach(function(a) { | |
if (c[a]) c[a][k]() | |
}); | |
if (d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut(); | |
e && d.legend.colorizeItem(c, a); | |
c.isDirty = !0; | |
c.options.stacking && d.series.forEach(function(a) { | |
a.options.stacking && a.visible && (a.isDirty = !0) | |
}); | |
c.linkedSeries.forEach(function(b) { | |
b.setVisible(a, !1) | |
}); | |
f && (d.isDirtyBox = !0); | |
r(c, k); | |
!1 !== b && d.redraw() | |
}, | |
show: function() { | |
this.setVisible(!0) | |
}, | |
hide: function() { | |
this.setVisible(!1) | |
}, | |
select: function(a) { | |
this.selected = a = this.options.selected = | |
"undefined" === typeof a ? !this.selected : a; | |
this.checkbox && (this.checkbox.checked = a); | |
r(this, a ? "select" : "unselect") | |
}, | |
drawTracker: k.drawTrackerGraph | |
}) | |
}); | |
M(J, "parts/Responsive.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.isArray, | |
I = e.isObject, | |
G = e.objectEach, | |
H = e.pick, | |
v = e.splat; | |
e = c.Chart; | |
e.prototype.setResponsive = function(e, v) { | |
var q = this.options.responsive, | |
u = [], | |
w = this.currentResponsive; | |
!v && q && q.rules && q.rules.forEach(function(e) { | |
"undefined" === typeof e._id && (e._id = c.uniqueKey()); | |
this.matchResponsiveRule(e, u) | |
}, this); | |
v = c.merge.apply(0, u.map(function(e) { | |
return c.find(q.rules, function(c) { | |
return c._id === e | |
}).chartOptions | |
})); | |
v.isResponsiveOptions = !0; | |
u = u.toString() || void 0; | |
u !== (w && w.ruleIds) && (w && this.update(w.undoOptions, e, !0), u ? (w = this.currentOptions(v), w.isResponsiveOptions = !0, this.currentResponsive = { | |
ruleIds: u, | |
mergedOptions: v, | |
undoOptions: w | |
}, this.update(v, e, !0)) : this.currentResponsive = void 0) | |
}; | |
e.prototype.matchResponsiveRule = function(c, e) { | |
var q = c.condition; | |
(q.callback || function() { | |
return this.chartWidth <= | |
H(q.maxWidth, Number.MAX_VALUE) && this.chartHeight <= H(q.maxHeight, Number.MAX_VALUE) && this.chartWidth >= H(q.minWidth, 0) && this.chartHeight >= H(q.minHeight, 0) | |
}).call(this) && e.push(c._id) | |
}; | |
e.prototype.currentOptions = function(c) { | |
function e(c, m, r, u) { | |
var w; | |
G(c, function(c, b) { | |
if (!u && -1 < q.collectionsWithUpdate.indexOf(b)) | |
for (c = v(c), r[b] = [], w = 0; w < c.length; w++) m[b][w] && (r[b][w] = {}, e(c[w], m[b][w], r[b][w], u + 1)); | |
else I(c) ? (r[b] = F(c) ? [] : {}, e(c, m[b] || {}, r[b], u + 1)) : r[b] = "undefined" === typeof m[b] ? null : m[b] | |
}) | |
} | |
var q = this, | |
u = {}; | |
e(c, this.options, u, 0); | |
return u | |
} | |
}); | |
M(J, "masters/highcharts.src.js", [J["parts/Globals.js"], J["parts/Utilities.js"]], function(c, e) { | |
var F = e.extend; | |
F(c, { | |
animObject: e.animObject, | |
arrayMax: e.arrayMax, | |
arrayMin: e.arrayMin, | |
attr: e.attr, | |
correctFloat: e.correctFloat, | |
defined: e.defined, | |
destroyObjectProperties: e.destroyObjectProperties, | |
discardElement: e.discardElement, | |
erase: e.erase, | |
extend: e.extend, | |
extendClass: e.extendClass, | |
isArray: e.isArray, | |
isClass: e.isClass, | |
isDOMElement: e.isDOMElement, | |
isNumber: e.isNumber, | |
isObject: e.isObject, | |
isString: e.isString, | |
numberFormat: e.numberFormat, | |
objectEach: e.objectEach, | |
offset: e.offset, | |
pad: e.pad, | |
pick: e.pick, | |
pInt: e.pInt, | |
relativeLength: e.relativeLength, | |
setAnimation: e.setAnimation, | |
splat: e.splat, | |
syncTimeout: e.syncTimeout, | |
wrap: e.wrap | |
}); | |
return c | |
}); | |
J["masters/highcharts.src.js"]._modules = J; | |
return J["masters/highcharts.src.js"] | |
}); | |
//# sourceMappingURL=highcharts.js.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment