Ext.define("Ext.draw.ContainerBase", { extend: "Ext.panel.Panel", requires: ["Ext.window.Window"], previewTitleText: "Chart Preview", previewAltText: "Chart preview", layout: "container", addElementListener: function() { var b = this, a = arguments; if (b.rendered) { b.el.on.apply(b.el, a) } else { b.on("render", function() { b.el.on.apply(b.el, a) }) } }, removeElementListener: function() { var b = this, a = arguments; if (b.rendered) { b.el.un.apply(b.el, a) } }, afterRender: function() { this.callParent(arguments); this.initAnimator() }, getItems: function() { var b = this, a = b.items; if (!a || !a.isMixedCollection) { b.initItems() } return b.items }, onRender: function() { this.callParent(arguments); this.element = this.el; this.innerElement = this.body }, setItems: function(a) { this.items = a; return a }, setSurfaceSize: function(b, a) { this.resizeHandler({ width: b, height: a }); this.renderFrame() }, onResize: function(c, a, b, e) { var d = this; d.callParent([c, a, b, e]); d.setBodySize({ width: c, height: a }) }, preview: function() { var a = this.getImage(); new Ext.window.Window({ title: this.previewTitleText, closeable: true, renderTo: Ext.getBody(), autoShow: true, maximizeable: true, maximized: true, border: true, layout: { type: "hbox", pack: "center", align: "middle" }, items: { xtype: "container", items: { xtype: "image", mode: "img", cls: Ext.baseCSSPrefix + "chart-image", alt: this.previewAltText, src: a.data, listeners: { afterrender: function() { var e = this, b = e.imgEl.dom, d = a.type === "svg" ? 1 : (window.devicePixelRatio || 1), c; if (!b.naturalWidth || !b.naturalHeight) { b.onload = function() { var g = b.naturalWidth, f = b.naturalHeight; e.setWidth(Math.floor(g / d)); e.setHeight(Math.floor(f / d)) } } else { c = e.getSize(); e.setWidth(Math.floor(c.width / d)); e.setHeight(Math.floor(c.height / d)) } } } } } }) }, privates: { getTargetEl: function() { return this.innerElement }, reattachToBody: function() { var a = this; if (a.pendingDetachSize) { a.onBodyResize() } a.pendingDetachSize = false; a.callParent() } } }); Ext.define("Ext.draw.SurfaceBase", { extend: "Ext.Widget", getOwnerBody: function() { return this.ownerCt.body }, destroy: function() { var a = this; if (a.hasListeners.destroy) { a.fireEvent("destroy", a) } a.callParent() } }); Ext.define("Ext.draw.Color", { statics: { colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/, rgbToHexRe: /\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/, rgbaToHexRe: /\s*rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\.\d]+)\)/, hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/, NONE: "none", RGBA_NONE: "rgba(0, 0, 0, 0)" }, isColor: true, lightnessFactor: 0.2, constructor: function(d, b, a, c) { this.setRGB(d, b, a, c) }, setRGB: function(e, c, a, d) { var b = this; b.r = Math.min(255, Math.max(0, e)); b.g = Math.min(255, Math.max(0, c)); b.b = Math.min(255, Math.max(0, a)); if (d === undefined) { b.a = 1 } else { b.a = Math.min(1, Math.max(0, d)) } }, getGrayscale: function() { return this.r * 0.3 + this.g * 0.59 + this.b * 0.11 }, getHSL: function() { var i = this, a = i.r / 255, f = i.g / 255, j = i.b / 255, k = Math.max(a, f, j), d = Math.min(a, f, j), m = k - d, e, n = 0, c = 0.5 * (k + d); if (d !== k) { n = (c <= 0.5) ? m / (k + d) : m / (2 - k - d); if (a === k) { e = 60 * (f - j) / m } else { if (f === k) { e = 120 + 60 * (j - a) / m } else { e = 240 + 60 * (a - f) / m } } if (e < 0) { e += 360 } if (e >= 360) { e -= 360 } } return [e, n, c] }, getHSV: function() { var i = this, a = i.r / 255, f = i.g / 255, j = i.b / 255, k = Math.max(a, f, j), d = Math.min(a, f, j), c = k - d, e, m = 0, l = k; if (d != k) { m = l ? c / l : 0; if (a === k) { e = 60 * (f - j) / c } else { if (f === k) { e = 60 * (j - a) / c + 120 } else { e = 60 * (a - f) / c + 240 } } if (e < 0) { e += 360 } if (e >= 360) { e -= 360 } } return [e, m, l] }, setHSL: function(g, f, e) { var i = this, d = Math.abs, j, b, a; g = (g % 360 + 360) % 360; f = f > 1 ? 1 : f < 0 ? 0 : f; e = e > 1 ? 1 : e < 0 ? 0 : e; if (f === 0 || g === null) { e *= 255; i.setRGB(e, e, e) } else { g /= 60; j = f * (1 - d(2 * e - 1)); b = j * (1 - d(g % 2 - 1)); a = e - j / 2; a *= 255; j *= 255; b *= 255; switch (Math.floor(g)) { case 0: i.setRGB(j + a, b + a, a); break; case 1: i.setRGB(b + a, j + a, a); break; case 2: i.setRGB(a, j + a, b + a); break; case 3: i.setRGB(a, b + a, j + a); break; case 4: i.setRGB(b + a, a, j + a); break; case 5: i.setRGB(j + a, a, b + a); break } } return i }, setHSV: function(f, e, d) { var g = this, i, b, a; f = (f % 360 + 360) % 360; e = e > 1 ? 1 : e < 0 ? 0 : e; d = d > 1 ? 1 : d < 0 ? 0 : d; if (e === 0 || f === null) { d *= 255; g.setRGB(d, d, d) } else { f /= 60; i = d * e; b = i * (1 - Math.abs(f % 2 - 1)); a = d - i; a *= 255; i *= 255; b *= 255; switch (Math.floor(f)) { case 0: g.setRGB(i + a, b + a, a); break; case 1: g.setRGB(b + a, i + a, a); break; case 2: g.setRGB(a, i + a, b + a); break; case 3: g.setRGB(a, b + a, i + a); break; case 4: g.setRGB(b + a, a, i + a); break; case 5: g.setRGB(i + a, a, b + a); break } } return g }, createLighter: function(b) { if (!b && b !== 0) { b = this.lightnessFactor } var a = this.getHSL(); a[2] = Ext.Number.constrain(a[2] + b, 0, 1); return Ext.draw.Color.fromHSL(a[0], a[1], a[2]) }, createDarker: function(a) { if (!a && a !== 0) { a = this.lightnessFactor } return this.createLighter(-a) }, toString: function() { var f = this, c = Math.round; if (f.a === 1) { var e = c(f.r).toString(16), d = c(f.g).toString(16), a = c(f.b).toString(16); e = (e.length === 1) ? "0" + e : e; d = (d.length === 1) ? "0" + d : d; a = (a.length === 1) ? "0" + a : a; return ["#", e, d, a].join("") } else { return "rgba(" + [c(f.r), c(f.g), c(f.b), f.a === 0 ? 0 : f.a.toFixed(15)].join(", ") + ")" } }, toHex: function(b) { if (Ext.isArray(b)) { b = b[0] } if (!Ext.isString(b)) { return "" } if (b.substr(0, 1) === "#") { return b } var e = Ext.draw.Color.colorToHexRe.exec(b); if (Ext.isArray(e)) { var f = parseInt(e[2], 10), d = parseInt(e[3], 10), a = parseInt(e[4], 10), c = a | (d << 8) | (f << 16); return e[1] + "#" + ("000000" + c.toString(16)).slice(-6) } else { return "" } }, setFromString: function(j) { var e, h, f, c, d = 1, i = parseInt; if (j === Ext.draw.Color.NONE) { this.r = this.g = this.b = this.a = 0; return this } if ((j.length === 4 || j.length === 7) && j.substr(0, 1) === "#") { e = j.match(Ext.draw.Color.hexRe); if (e) { h = i(e[1], 16) >> 0; f = i(e[2], 16) >> 0; c = i(e[3], 16) >> 0; if (j.length === 4) { h += (h * 16); f += (f * 16); c += (c * 16) } } } else { if ((e = j.match(Ext.draw.Color.rgbToHexRe))) { h = +e[1]; f = +e[2]; c = +e[3] } else { if ((e = j.match(Ext.draw.Color.rgbaToHexRe))) { h = +e[1]; f = +e[2]; c = +e[3]; d = +e[4] } else { if (Ext.draw.Color.ColorList.hasOwnProperty(j.toLowerCase())) { return this.setFromString(Ext.draw.Color.ColorList[j.toLowerCase()]) } } } } if (typeof h === "undefined") { return this } this.r = h; this.g = f; this.b = c; this.a = d; return this } }, function() { var a = new this(); this.addStatics({ fly: function(f, e, c, d) { switch (arguments.length) { case 1: a.setFromString(f); break; case 3: case 4: a.setRGB(f, e, c, d); break; default: return null } return a }, ColorList: { aliceblue: "#f0f8ff", antiquewhite: "#faebd7", aqua: "#00ffff", aquamarine: "#7fffd4", azure: "#f0ffff", beige: "#f5f5dc", bisque: "#ffe4c4", black: "#000000", blanchedalmond: "#ffebcd", blue: "#0000ff", blueviolet: "#8a2be2", brown: "#a52a2a", burlywood: "#deb887", cadetblue: "#5f9ea0", chartreuse: "#7fff00", chocolate: "#d2691e", coral: "#ff7f50", cornflowerblue: "#6495ed", cornsilk: "#fff8dc", crimson: "#dc143c", cyan: "#00ffff", darkblue: "#00008b", darkcyan: "#008b8b", darkgoldenrod: "#b8860b", darkgray: "#a9a9a9", darkgreen: "#006400", darkkhaki: "#bdb76b", darkmagenta: "#8b008b", darkolivegreen: "#556b2f", darkorange: "#ff8c00", darkorchid: "#9932cc", darkred: "#8b0000", darksalmon: "#e9967a", darkseagreen: "#8fbc8f", darkslateblue: "#483d8b", darkslategray: "#2f4f4f", darkturquoise: "#00ced1", darkviolet: "#9400d3", deeppink: "#ff1493", deepskyblue: "#00bfff", dimgray: "#696969", dodgerblue: "#1e90ff", firebrick: "#b22222", floralwhite: "#fffaf0", forestgreen: "#228b22", fuchsia: "#ff00ff", gainsboro: "#dcdcdc", ghostwhite: "#f8f8ff", gold: "#ffd700", goldenrod: "#daa520", gray: "#808080", green: "#008000", greenyellow: "#adff2f", honeydew: "#f0fff0", hotpink: "#ff69b4", indianred: "#cd5c5c", indigo: "#4b0082", ivory: "#fffff0", khaki: "#f0e68c", lavender: "#e6e6fa", lavenderblush: "#fff0f5", lawngreen: "#7cfc00", lemonchiffon: "#fffacd", lightblue: "#add8e6", lightcoral: "#f08080", lightcyan: "#e0ffff", lightgoldenrodyellow: "#fafad2", lightgray: "#d3d3d3", lightgrey: "#d3d3d3", lightgreen: "#90ee90", lightpink: "#ffb6c1", lightsalmon: "#ffa07a", lightseagreen: "#20b2aa", lightskyblue: "#87cefa", lightslategray: "#778899", lightsteelblue: "#b0c4de", lightyellow: "#ffffe0", lime: "#00ff00", limegreen: "#32cd32", linen: "#faf0e6", magenta: "#ff00ff", maroon: "#800000", mediumaquamarine: "#66cdaa", mediumblue: "#0000cd", mediumorchid: "#ba55d3", mediumpurple: "#9370d8", mediumseagreen: "#3cb371", mediumslateblue: "#7b68ee", mediumspringgreen: "#00fa9a", mediumturquoise: "#48d1cc", mediumvioletred: "#c71585", midnightblue: "#191970", mintcream: "#f5fffa", mistyrose: "#ffe4e1", moccasin: "#ffe4b5", navajowhite: "#ffdead", navy: "#000080", oldlace: "#fdf5e6", olive: "#808000", olivedrab: "#6b8e23", orange: "#ffa500", orangered: "#ff4500", orchid: "#da70d6", palegoldenrod: "#eee8aa", palegreen: "#98fb98", paleturquoise: "#afeeee", palevioletred: "#d87093", papayawhip: "#ffefd5", peachpuff: "#ffdab9", peru: "#cd853f", pink: "#ffc0cb", plum: "#dda0dd", powderblue: "#b0e0e6", purple: "#800080", red: "#ff0000", rosybrown: "#bc8f8f", royalblue: "#4169e1", saddlebrown: "#8b4513", salmon: "#fa8072", sandybrown: "#f4a460", seagreen: "#2e8b57", seashell: "#fff5ee", sienna: "#a0522d", silver: "#c0c0c0", skyblue: "#87ceeb", slateblue: "#6a5acd", slategray: "#708090", snow: "#fffafa", springgreen: "#00ff7f", steelblue: "#4682b4", tan: "#d2b48c", teal: "#008080", thistle: "#d8bfd8", tomato: "#ff6347", turquoise: "#40e0d0", violet: "#ee82ee", wheat: "#f5deb3", white: "#ffffff", whitesmoke: "#f5f5f5", yellow: "#ffff00", yellowgreen: "#9acd32" }, fromHSL: function(d, c, b) { return (new this(0, 0, 0, 0)).setHSL(d, c, b) }, fromHSV: function(d, c, b) { return (new this(0, 0, 0, 0)).setHSL(d, c, b) }, fromString: function(b) { return (new this(0, 0, 0, 0)).setFromString(b) }, create: function(b) { if (b instanceof this) { return b } else { if (Ext.isArray(b)) { return new Ext.draw.Color(b[0], b[1], b[2], b[3]) } else { if (Ext.isString(b)) { return Ext.draw.Color.fromString(b) } else { if (arguments.length > 2) { return new Ext.draw.Color(arguments[0], arguments[1], arguments[2], arguments[3]) } else { return new Ext.draw.Color(0, 0, 0, 0) } } } } } }) }); Ext.define("Ext.draw.sprite.AnimationParser", function() { function a(d, c, b) { return d + (c - d) * b } return { singleton: true, attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, requires: ["Ext.draw.Color"], color: { parseInitial: function(c, b) { if (Ext.isString(c)) { c = Ext.draw.Color.create(c) } if (Ext.isString(b)) { b = Ext.draw.Color.create(b) } if ((c instanceof Ext.draw.Color) && (b instanceof Ext.draw.Color)) { return [ [c.r, c.g, c.b, c.a], [b.r, b.g, b.b, b.a] ] } else { return [c || b, b || c] } }, compute: function(d, c, b) { if (!Ext.isArray(d) || !Ext.isArray(c)) { return c || d } else { return [a(d[0], c[0], b), a(d[1], c[1], b), a(d[2], c[2], b), a(d[3], c[3], b)] } }, serve: function(c) { var b = Ext.draw.Color.fly(c[0], c[1], c[2], c[3]); return b.toString() } }, number: { parse: function(b) { return b === null ? null : +b }, compute: function(d, c, b) { if (!Ext.isNumber(d) || !Ext.isNumber(c)) { return c || d } else { return a(d, c, b) } } }, angle: { parseInitial: function(c, b) { if (b - c > Math.PI) { b -= Math.PI * 2 } else { if (b - c < -Math.PI) { b += Math.PI * 2 } } return [c, b] }, compute: function(d, c, b) { if (!Ext.isNumber(d) || !Ext.isNumber(c)) { return c || d } else { return a(d, c, b) } } }, path: { parseInitial: function(m, n) { var c = m.toStripes(), o = n.toStripes(), e, d, k = c.length, p = o.length, h, f, b, g = o[p - 1], l = [g[g.length - 2], g[g.length - 1]]; for (e = k; e < p; e++) { c.push(c[k - 1].slice(0)) } for (e = p; e < k; e++) { o.push(l.slice(0)) } b = c.length; o.path = n; o.temp = new Ext.draw.Path(); for (e = 0; e < b; e++) { h = c[e]; f = o[e]; k = h.length; p = f.length; o.temp.commands.push("M"); for (d = p; d < k; d += 6) { f.push(l[0], l[1], l[0], l[1], l[0], l[1]) } g = o[o.length - 1]; l = [g[g.length - 2], g[g.length - 1]]; for (d = k; d < p; d += 6) { h.push(l[0], l[1], l[0], l[1], l[0], l[1]) } for (e = 0; e < f.length; e++) { f[e] -= h[e] } for (e = 2; e < f.length; e += 6) { o.temp.commands.push("C") } } return [c, o] }, compute: function(c, l, m) { if (m >= 1) { return l.path } var e = 0, f = c.length, d = 0, b, k, h, n = l.temp.params, g = 0; for (; e < f; e++) { k = c[e]; h = l[e]; b = k.length; for (d = 0; d < b; d++) { n[g++] = h[d] * m + k[d] } } return l.temp } }, data: { compute: function(h, j, k, g) { var m = h.length - 1, b = j.length - 1, e = Math.max(m, b), d, l, c; if (!g || g === h) { g = [] } g.length = e + 1; for (c = 0; c <= e; c++) { d = h[Math.min(c, m)]; l = j[Math.min(c, b)]; if (Ext.isNumber(d)) { if (!Ext.isNumber(l)) { l = 0 } g[c] = (l - d) * k + d } else { g[c] = l } } return g } }, text: { compute: function(d, c, b) { return d.substr(0, Math.round(d.length * (1 - b))) + c.substr(Math.round(c.length * (1 - b))) } }, limited: "number", limited01: "number" } }); (function() { if (!Ext.global.Float32Array) { var a = function(d) { if (typeof d === "number") { this.length = d } else { if ("length" in d) { this.length = d.length; for (var c = 0, b = d.length; c < b; c++) { this[c] = +d[c] } } } }; a.prototype = []; Ext.global.Float32Array = a } })(); Ext.define("Ext.draw.Draw", { singleton: true, radian: Math.PI / 180, pi2: Math.PI * 2, reflectFn: function(b) { return b }, rad: function(a) { return (a % 360) * this.radian }, degrees: function(a) { return (a / this.radian) % 360 }, isBBoxIntersect: function(b, a, c) { c = c || 0; return (Math.max(b.x, a.x) - c > Math.min(b.x + b.width, a.x + a.width)) || (Math.max(b.y, a.y) - c > Math.min(b.y + b.height, a.y + a.height)) }, isPointInBBox: function(a, c, b) { return !!b && a >= b.x && a <= (b.x + b.width) && c >= b.y && c <= (b.y + b.height) }, spline: function(m) { var e, c, k = m.length, b, h, l, f, a = 0, g = new Float32Array(m.length), n = new Float32Array(m.length * 3 - 2); g[0] = 0; g[k - 1] = 0; for (e = 1; e < k - 1; e++) { g[e] = (m[e + 1] + m[e - 1] - 2 * m[e]) - g[e - 1]; a = 1 / (4 - a); g[e] *= a } for (e = k - 2; e > 0; e--) { a = 3.732050807568877 + 48.248711305964385 / (-13.928203230275537 + Math.pow(0.07179676972449123, e)); g[e] -= g[e + 1] * a } f = m[0]; b = f - g[0]; for (e = 0, c = 0; e < k - 1; c += 3) { l = f; h = b; e++; f = m[e]; b = f - g[e]; n[c] = l; n[c + 1] = (b + 2 * h) / 3; n[c + 2] = (b * 2 + h) / 3 } n[c] = f; return n }, getAnchors: function(e, d, i, h, t, s, o) { o = o || 4; var n = Math.PI, p = n / 2, k = Math.abs, a = Math.sin, b = Math.cos, f = Math.atan, r, q, g, j, m, l, v, u, c; r = (i - e) / o; q = (t - i) / o; if ((h >= d && h >= s) || (h <= d && h <= s)) { g = j = p } else { g = f((i - e) / k(h - d)); if (d < h) { g = n - g } j = f((t - i) / k(h - s)); if (s < h) { j = n - j } } c = p - ((g + j) % (n * 2)) / 2; if (c > p) { c -= n } g += c; j += c; m = i - r * a(g); l = h + r * b(g); v = i + q * a(j); u = h + q * b(j); if ((h > d && l < d) || (h < d && l > d)) { m += k(d - l) * (m - i) / (l - h); l = d } if ((h > s && u < s) || (h < s && u > s)) { v -= k(s - u) * (v - i) / (u - h); u = s } return { x1: m, y1: l, x2: v, y2: u } }, smooth: function(l, j, o) { var k = l.length, h, g, c, b, q, p, n, m, f = [], e = [], d, a; for (d = 0; d < k - 1; d++) { h = l[d]; g = j[d]; if (d === 0) { n = h; m = g; f.push(n); e.push(m); if (k === 1) { break } } c = l[d + 1]; b = j[d + 1]; q = l[d + 2]; p = j[d + 2]; if (!Ext.isNumber(q + p)) { f.push(n, c, c); e.push(m, b, b); break } a = this.getAnchors(h, g, c, b, q, p, o); f.push(n, a.x1, c); e.push(m, a.y1, b); n = a.x2; m = a.y2 } return { smoothX: f, smoothY: e } }, beginUpdateIOS: Ext.os.is.iOS ? function() { this.iosUpdateEl = Ext.getBody().createChild({ style: "position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; background: rgba(0,0,0,0.001); z-index: 100000" }) } : Ext.emptyFn, endUpdateIOS: function() { this.iosUpdateEl = Ext.destroy(this.iosUpdateEl) } }); Ext.define("Ext.draw.gradient.Gradient", { requires: ["Ext.draw.Color"], isGradient: true, config: { stops: [] }, applyStops: function(f) { var e = [], d = f.length, c, b, a; for (c = 0; c < d; c++) { b = f[c]; a = b.color; if (!(a && a.isColor)) { a = Ext.draw.Color.fly(a || Ext.draw.Color.NONE) } e.push({ offset: Math.min(1, Math.max(0, "offset" in b ? b.offset : b.position || 0)), color: a.toString() }) } e.sort(function(h, g) { return h.offset - g.offset }); return e }, onClassExtended: function(a, b) { if (!b.alias && b.type) { b.alias = "gradient." + b.type } }, constructor: function(a) { this.initConfig(a) }, generateGradient: Ext.emptyFn }); Ext.define("Ext.draw.gradient.GradientDefinition", { singleton: true, urlStringRe: /^url\(#([\w\-]+)\)$/, gradients: {}, add: function(a) { var b = this.gradients, c, e, d; for (c = 0, e = a.length; c < e; c++) { d = a[c]; if (Ext.isString(d.id)) { b[d.id] = d } } }, get: function(d) { var a = this.gradients, b = d.match(this.urlStringRe), c; if (b && b[1] && (c = a[b[1]])) { return c || d } return d } }); Ext.define("Ext.draw.sprite.AttributeParser", { singleton: true, attributeRe: /^url\(#([a-zA-Z\-]+)\)$/, requires: ["Ext.draw.Color", "Ext.draw.gradient.GradientDefinition"], "default": Ext.identityFn, string: function(a) { return String(a) }, number: function(a) { if (Ext.isNumber(+a)) { return a } }, angle: function(a) { if (Ext.isNumber(a)) { a %= Math.PI * 2; if (a < -Math.PI) { a += Math.PI * 2 } else { if (a >= Math.PI) { a -= Math.PI * 2 } } return a } }, data: function(a) { if (Ext.isArray(a)) { return a.slice() } else { if (a instanceof Float32Array) { return new Float32Array(a) } } }, bool: function(a) { return !!a }, color: function(a) { if (a instanceof Ext.draw.Color) { return a.toString() } else { if (a instanceof Ext.draw.gradient.Gradient) { return a } else { if (!a) { return Ext.draw.Color.NONE } else { if (Ext.isString(a)) { if (a.substr(0, 3) === "url") { a = Ext.draw.gradient.GradientDefinition.get(a); if (Ext.isString(a)) { return a } } else { return Ext.draw.Color.fly(a).toString() } } } } } if (a.type === "linear") { return Ext.create("Ext.draw.gradient.Linear", a) } else { if (a.type === "radial") { return Ext.create("Ext.draw.gradient.Radial", a) } else { if (a.type === "pattern") { return Ext.create("Ext.draw.gradient.Pattern", a) } else { return Ext.draw.Color.NONE } } } }, limited: function(a, b) { return function(c) { c = +c; return Ext.isNumber(c) ? Math.min(Math.max(c, a), b) : undefined } }, limited01: function(a) { a = +a; return Ext.isNumber(a) ? Math.min(Math.max(a, 0), 1) : undefined }, enums: function() { var d = {}, a = Array.prototype.slice.call(arguments, 0), b, c; for (b = 0, c = a.length; b < c; b++) { d[a[b]] = true } return function(e) { return e in d ? e : undefined } } }); Ext.define("Ext.draw.sprite.AttributeDefinition", { requires: ["Ext.draw.sprite.AttributeParser", "Ext.draw.sprite.AnimationParser"], config: { defaults: { $value: {}, lazy: true }, aliases: {}, animationProcessors: {}, processors: { $value: {}, lazy: true }, dirtyTriggers: {}, triggers: {}, updaters: {} }, inheritableStatics: { processorFactoryRe: /^(\w+)\(([\w\-,]*)\)$/ }, spriteClass: null, constructor: function(a) { var b = this; b.initConfig(a) }, applyDefaults: function(b, a) { a = Ext.apply(a || {}, this.normalize(b)); return a }, applyAliases: function(b, a) { return Ext.apply(a || {}, b) }, applyProcessors: function(e, i) { this.getAnimationProcessors(); var j = i || {}, h = Ext.draw.sprite.AttributeParser, a = this.self.processorFactoryRe, g = {}, d, b, c, f; for (b in e) { f = e[b]; if (typeof f === "string") { c = f.match(a); if (c) { f = h[c[1]].apply(h, c[2].split(",")) } else { if (h[f]) { g[b] = f; d = true; f = h[f] } } } j[b] = f } if (d) { this.setAnimationProcessors(g) } return j }, applyAnimationProcessors: function(c, a) { var e = Ext.draw.sprite.AnimationParser, b, d; if (!a) { a = {} } for (b in c) { d = c[b]; if (d === "none") { a[b] = null } else { if (Ext.isString(d) && !(b in a)) { if (d in e) { while (Ext.isString(e[d])) { d = e[d] } a[b] = e[d] } } else { if (Ext.isObject(d)) { a[b] = d } } } } return a }, updateDirtyTriggers: function(a) { this.setTriggers(a) }, applyTriggers: function(b, c) { if (!c) { c = {} } for (var a in b) { c[a] = b[a].split(",") } return c }, applyUpdaters: function(b, a) { return Ext.apply(a || {}, b) }, batchedNormalize: function(f, n) { if (!f) { return {} } var j = this.getProcessors(), d = this.getAliases(), a = f.translation || f.translate, o = {}, g, h, b, e, p, c, m, l, k; if ("rotation" in f) { p = f.rotation } else { p = ("rotate" in f) ? f.rotate : undefined } if ("scaling" in f) { c = f.scaling } else { c = ("scale" in f) ? f.scale : undefined } if (typeof c !== "undefined") { if (Ext.isNumber(c)) { o.scalingX = c; o.scalingY = c } else { if ("x" in c) { o.scalingX = c.x } if ("y" in c) { o.scalingY = c.y } if ("centerX" in c) { o.scalingCenterX = c.centerX } if ("centerY" in c) { o.scalingCenterY = c.centerY } } } if (typeof p !== "undefined") { if (Ext.isNumber(p)) { p = Ext.draw.Draw.rad(p); o.rotationRads = p } else { if ("rads" in p) { o.rotationRads = p.rads } else { if ("degrees" in p) { if (Ext.isArray(p.degrees)) { o.rotationRads = Ext.Array.map(p.degrees, function(i) { return Ext.draw.Draw.rad(i) }) } else { o.rotationRads = Ext.draw.Draw.rad(p.degrees) } } } if ("centerX" in p) { o.rotationCenterX = p.centerX } if ("centerY" in p) { o.rotationCenterY = p.centerY } } } if (typeof a !== "undefined") { if ("x" in a) { o.translationX = a.x } if ("y" in a) { o.translationY = a.y } } if ("matrix" in f) { m = Ext.draw.Matrix.create(f.matrix); k = m.split(); o.matrix = m; o.rotationRads = k.rotation; o.rotationCenterX = 0; o.rotationCenterY = 0; o.scalingX = k.scaleX; o.scalingY = k.scaleY; o.scalingCenterX = 0; o.scalingCenterY = 0; o.translationX = k.translateX; o.translationY = k.translateY } for (b in f) { e = f[b]; if (typeof e === "undefined") { continue } else { if (Ext.isArray(e)) { if (b in d) { b = d[b] } if (b in j) { o[b] = []; for (g = 0, h = e.length; g < h; g++) { l = j[b].call(this, e[g]); if (typeof l !== "undefined") { o[b][g] = l } } } else { if (n) { o[b] = e } } } else { if (b in d) { b = d[b] } if (b in j) { e = j[b].call(this, e); if (typeof e !== "undefined") { o[b] = e } } else { if (n) { o[b] = e } } } } } return o }, normalize: function(i, j) { if (!i) { return {} } var f = this.getProcessors(), d = this.getAliases(), a = i.translation || i.translate, k = {}, b, e, l, c, h, g; if ("rotation" in i) { l = i.rotation } else { l = ("rotate" in i) ? i.rotate : undefined } if ("scaling" in i) { c = i.scaling } else { c = ("scale" in i) ? i.scale : undefined } if (a) { if ("x" in a) { k.translationX = a.x } if ("y" in a) { k.translationY = a.y } } if (typeof c !== "undefined") { if (Ext.isNumber(c)) { k.scalingX = c; k.scalingY = c } else { if ("x" in c) { k.scalingX = c.x } if ("y" in c) { k.scalingY = c.y } if ("centerX" in c) { k.scalingCenterX = c.centerX } if ("centerY" in c) { k.scalingCenterY = c.centerY } } } if (typeof l !== "undefined") { if (Ext.isNumber(l)) { l = Ext.draw.Draw.rad(l); k.rotationRads = l } else { if ("rads" in l) { k.rotationRads = l.rads } else { if ("degrees" in l) { k.rotationRads = Ext.draw.Draw.rad(l.degrees) } } if ("centerX" in l) { k.rotationCenterX = l.centerX } if ("centerY" in l) { k.rotationCenterY = l.centerY } } } if ("matrix" in i) { h = Ext.draw.Matrix.create(i.matrix); g = h.split(); k.matrix = h; k.rotationRads = g.rotation; k.rotationCenterX = 0; k.rotationCenterY = 0; k.scalingX = g.scaleX; k.scalingY = g.scaleY; k.scalingCenterX = 0; k.scalingCenterY = 0; k.translationX = g.translateX; k.translationY = g.translateY } for (b in i) { e = i[b]; if (typeof e === "undefined") { continue } if (b in d) { b = d[b] } if (b in f) { e = f[b].call(this, e); if (typeof e !== "undefined") { k[b] = e } } else { if (j) { k[b] = e } } } return k }, setBypassingNormalization: function(a, c, b) { return c.pushDown(a, b) }, set: function(a, c, b) { b = this.normalize(b); return this.setBypassingNormalization(a, c, b) } }); Ext.define("Ext.draw.Matrix", { isMatrix: true, statics: { createAffineMatrixFromTwoPair: function(h, t, g, s, k, o, i, j) { var v = g - h, u = s - t, e = i - k, q = j - o, d = 1 / (v * v + u * u), p = v * e + u * q, n = e * u - v * q, m = -p * h - n * t, l = n * h - p * t; return new this(p * d, -n * d, n * d, p * d, m * d + k, l * d + o) }, createPanZoomFromTwoPair: function(q, e, p, c, h, s, n, g) { if (arguments.length === 2) { return this.createPanZoomFromTwoPair.apply(this, q.concat(e)) } var k = p - q, j = c - e, d = (q + p) * 0.5, b = (e + c) * 0.5, o = n - h, a = g - s, f = (h + n) * 0.5, l = (s + g) * 0.5, m = k * k + j * j, i = o * o + a * a, t = Math.sqrt(i / m); return new this(t, 0, 0, t, f - t * d, l - t * b) }, fly: (function() { var a = null, b = function(c) { a.elements = c; return a }; return function(c) { if (!a) { a = new Ext.draw.Matrix() } a.elements = c; Ext.draw.Matrix.fly = b; return a } })(), create: function(a) { if (a instanceof this) { return a } return new this(a) } }, constructor: function(e, d, a, f, c, b) { if (e && e.length === 6) { this.elements = e.slice() } else { if (e !== undefined) { this.elements = [e, d, a, f, c, b] } else { this.elements = [1, 0, 0, 1, 0, 0] } } }, prepend: function(a, l, h, g, m, k) { var b = this.elements, d = b[0], j = b[1], e = b[2], c = b[3], i = b[4], f = b[5]; b[0] = a * d + h * j; b[1] = l * d + g * j; b[2] = a * e + h * c; b[3] = l * e + g * c; b[4] = a * i + h * f + m; b[5] = l * i + g * f + k; return this }, prependMatrix: function(a) { return this.prepend.apply(this, a.elements) }, append: function(a, l, h, g, m, k) { var b = this.elements, d = b[0], j = b[1], e = b[2], c = b[3], i = b[4], f = b[5]; b[0] = a * d + l * e; b[1] = a * j + l * c; b[2] = h * d + g * e; b[3] = h * j + g * c; b[4] = m * d + k * e + i; b[5] = m * j + k * c + f; return this }, appendMatrix: function(a) { return this.append.apply(this, a.elements) }, set: function(f, e, a, g, c, b) { var d = this.elements; d[0] = f; d[1] = e; d[2] = a; d[3] = g; d[4] = c; d[5] = b; return this }, inverse: function(i) { var g = this.elements, o = g[0], m = g[1], l = g[2], k = g[3], j = g[4], h = g[5], n = 1 / (o * k - m * l); o *= n; m *= n; l *= n; k *= n; if (i) { i.set(k, -m, -l, o, l * h - k * j, m * j - o * h); return i } else { return new Ext.draw.Matrix(k, -m, -l, o, l * h - k * j, m * j - o * h) } }, translate: function(a, c, b) { if (b) { return this.prepend(1, 0, 0, 1, a, c) } else { return this.append(1, 0, 0, 1, a, c) } }, scale: function(f, e, c, a, b) { var d = this; if (e == null) { e = f } if (c === undefined) { c = 0 } if (a === undefined) { a = 0 } if (b) { return d.prepend(f, 0, 0, e, c - c * f, a - a * e) } else { return d.append(f, 0, 0, e, c - c * f, a - a * e) } }, rotate: function(g, e, c, b) { var d = this, f = Math.cos(g), a = Math.sin(g); e = e || 0; c = c || 0; if (b) { return d.prepend(f, a, -a, f, e - f * e + c * a, c - f * c - e * a) } else { return d.append(f, a, -a, f, e - f * e + c * a, c - f * c - e * a) } }, rotateFromVector: function(a, h, c) { var e = this, g = Math.sqrt(a * a + h * h), f = a / g, b = h / g; if (c) { return e.prepend(f, b, -b, f, 0, 0) } else { return e.append(f, b, -b, f, 0, 0) } }, clone: function() { return new Ext.draw.Matrix(this.elements) }, flipX: function() { return this.append(-1, 0, 0, 1, 0, 0) }, flipY: function() { return this.append(1, 0, 0, -1, 0, 0) }, skewX: function(a) { return this.append(1, 0, Math.tan(a), 1, 0, 0) }, skewY: function(a) { return this.append(1, Math.tan(a), 0, 1, 0, 0) }, shearX: function(a) { return this.append(1, 0, a, 1, 0, 0) }, shearY: function(a) { return this.append(1, a, 0, 1, 0, 0) }, reset: function() { return this.set(1, 0, 0, 1, 0, 0) }, precisionCompensate: function(j, g) { var c = this.elements, f = c[0], e = c[1], i = c[2], h = c[3], d = c[4], b = c[5], a = e * i - f * h; g.b = j * e / f; g.c = j * i / h; g.d = j; g.xx = f / j; g.yy = h / j; g.dx = (b * f * i - d * f * h) / a / j; g.dy = (d * e * h - b * f * h) / a / j }, precisionCompensateRect: function(j, g) { var b = this.elements, f = b[0], e = b[1], i = b[2], h = b[3], c = b[4], a = b[5], d = i / f; g.b = j * e / f; g.c = j * d; g.d = j * h / f; g.xx = f / j; g.yy = f / j; g.dx = (a * i - c * h) / (e * d - h) / j; g.dy = -(a * f - c * e) / (e * d - h) / j }, x: function(a, c) { var b = this.elements; return a * b[0] + c * b[2] + b[4] }, y: function(a, c) { var b = this.elements; return a * b[1] + c * b[3] + b[5] }, get: function(b, a) { return +this.elements[b + a * 2].toFixed(4) }, transformPoint: function(b) { var c = this.elements, a, d; if (b.isPoint) { a = b.x; d = b.y } else { a = b[0]; d = b[1] } return [a * c[0] + d * c[2] + c[4], a * c[1] + d * c[3] + c[5]] }, transformBBox: function(q, i, j) { var b = this.elements, d = q.x, r = q.y, g = q.width * 0.5, o = q.height * 0.5, a = b[0], s = b[1], n = b[2], k = b[3], e = d + g, c = r + o, p, f, m; if (i) { g -= i; o -= i; m = [Math.sqrt(b[0] * b[0] + b[2] * b[2]), Math.sqrt(b[1] * b[1] + b[3] * b[3])]; p = Math.abs(g * a) + Math.abs(o * n) + Math.abs(m[0] * i); f = Math.abs(g * s) + Math.abs(o * k) + Math.abs(m[1] * i) } else { p = Math.abs(g * a) + Math.abs(o * n); f = Math.abs(g * s) + Math.abs(o * k) } if (!j) { j = {} } j.x = e * a + c * n + b[4] - p; j.y = e * s + c * k + b[5] - f; j.width = p + p; j.height = f + f; return j }, transformList: function(e) { var b = this.elements, a = b[0], h = b[2], l = b[4], k = b[1], g = b[3], j = b[5], f = e.length, c, d; for (d = 0; d < f; d++) { c = e[d]; e[d] = [c[0] * a + c[1] * h + l, c[0] * k + c[1] * g + j] } return e }, isIdentity: function() { var a = this.elements; return a[0] === 1 && a[1] === 0 && a[2] === 0 && a[3] === 1 && a[4] === 0 && a[5] === 0 }, isEqual: function(a) { var c = a && a.isMatrix ? a.elements : a, b = this.elements; return b[0] === c[0] && b[1] === c[1] && b[2] === c[2] && b[3] === c[3] && b[4] === c[4] && b[5] === c[5] }, equals: function(a) { return this.isEqual(a) }, toArray: function() { var a = this.elements; return [a[0], a[2], a[4], a[1], a[3], a[5]] }, toVerticalArray: function() { return this.elements.slice() }, toString: function() { var a = this; return [a.get(0, 0), a.get(0, 1), a.get(1, 0), a.get(1, 1), a.get(2, 0), a.get(2, 1)].join(",") }, toContext: function(a) { a.transform.apply(a, this.elements); return this }, toSvg: function() { var a = this.elements; return "matrix(" + a[0].toFixed(9) + "," + a[1].toFixed(9) + "," + a[2].toFixed(9) + "," + a[3].toFixed(9) + "," + a[4].toFixed(9) + "," + a[5].toFixed(9) + ")" }, getScaleX: function() { var a = this.elements; return Math.sqrt(a[0] * a[0] + a[2] * a[2]) }, getScaleY: function() { var a = this.elements; return Math.sqrt(a[1] * a[1] + a[3] * a[3]) }, getXX: function() { return this.elements[0] }, getXY: function() { return this.elements[1] }, getYX: function() { return this.elements[2] }, getYY: function() { return this.elements[3] }, getDX: function() { return this.elements[4] }, getDY: function() { return this.elements[5] }, split: function() { var b = this.elements, d = b[0], c = b[1], e = b[3], a = { translateX: b[4], translateY: b[5] }; a.rotate = a.rotation = Math.atan2(c, d); a.scaleX = d / Math.cos(a.rotate); a.scaleY = e / d * a.scaleX; return a } }, function() { function b(e, c, d) { e[c] = { get: function() { return this.elements[d] }, set: function(f) { this.elements[d] = f } } } if (Object.defineProperties) { var a = {}; b(a, "a", 0); b(a, "b", 1); b(a, "c", 2); b(a, "d", 3); b(a, "e", 4); b(a, "f", 5); Object.defineProperties(this.prototype, a) } this.prototype.multiply = this.prototype.appendMatrix }); Ext.define("Ext.draw.modifier.Modifier", { mixins: { observable: "Ext.mixin.Observable" }, config: { previous: null, next: null, sprite: null }, constructor: function(a) { this.mixins.observable.constructor.call(this, a) }, updateNext: function(a) { if (a) { a.setPrevious(this) } }, updatePrevious: function(a) { if (a) { a.setNext(this) } }, prepareAttributes: function(a) { if (this._previous) { this._previous.prepareAttributes(a) } }, popUp: function(a, b) { if (this._next) { this._next.popUp(a, b) } else { Ext.apply(a, b) } }, pushDown: function(a, c) { if (this._previous) { return this._previous.pushDown(a, c) } else { for (var b in c) { if (c[b] === a[b]) { delete c[b] } } return c } } }); Ext.define("Ext.draw.modifier.Target", { requires: ["Ext.draw.Matrix"], extend: "Ext.draw.modifier.Modifier", alias: "modifier.target", statics: { uniqueId: 0 }, prepareAttributes: function(a) { var b = this.getPrevious(); if (b) { b.prepareAttributes(a) } a.attributeId = "attribute-" + Ext.draw.modifier.Target.uniqueId++; if (!a.hasOwnProperty("canvasAttributes")) { a.bbox = { plain: { dirty: true }, transform: { dirty: true } }; a.dirty = true; a.pendingUpdaters = {}; a.canvasAttributes = {}; a.matrix = new Ext.draw.Matrix(); a.inverseMatrix = new Ext.draw.Matrix() } }, applyChanges: function(f, k) { Ext.apply(f, k); var l = this.getSprite(), o = f.pendingUpdaters, h = l.self.def.getTriggers(), p, a, m, b, e, n, d, c, g; for (b in k) { e = true; if ((p = h[b])) { l.scheduleUpdaters(f, p, [b]) } if (f.template && k.removeFromInstance && k.removeFromInstance[b]) { delete f[b] } } if (!e) { return } if (o.canvas) { n = o.canvas; delete o.canvas; for (d = 0, g = n.length; d < g; d++) { b = n[d]; f.canvasAttributes[b] = f[b] } } if (f.hasOwnProperty("children")) { a = f.children; for (d = 0, g = a.length; d < g; d++) { m = a[d]; Ext.apply(m.pendingUpdaters, o); if (n) { for (c = 0; c < n.length; c++) { b = n[c]; m.canvasAttributes[b] = m[b] } } l.callUpdaters(m) } } l.setDirty(true); l.callUpdaters(f) }, popUp: function(a, b) { this.applyChanges(a, b) }, pushDown: function(a, b) { var c = this.getPrevious(); if (c) { b = c.pushDown(a, b) } this.applyChanges(a, b); return b } }); Ext.define("Ext.draw.TimingFunctions", function() { var g = Math.pow, j = Math.sin, m = Math.cos, l = Math.sqrt, e = Math.PI, b = ["quad", "cube", "quart", "quint"], c = { pow: function(o, i) { return g(o, i || 6) }, expo: function(i) { return g(2, 8 * (i - 1)) }, circ: function(i) { return 1 - l(1 - i * i) }, sine: function(i) { return 1 - j((1 - i) * e / 2) }, back: function(i, o) { o = o || 1.616; return i * i * ((o + 1) * i - o) }, bounce: function(q) { for (var o = 0, i = 1; 1; o += i, i /= 2) { if (q >= (7 - 4 * o) / 11) { return i * i - g((11 - 6 * o - 11 * q) / 4, 2) } } }, elastic: function(o, i) { return g(2, 10 * --o) * m(20 * o * e * (i || 1) / 3) } }, k = {}, a, f, d; function h(i) { return function(o) { return g(o, i) } } function n(i, o) { k[i + "In"] = function(p) { return o(p) }; k[i + "Out"] = function(p) { return 1 - o(1 - p) }; k[i + "InOut"] = function(p) { return (p <= 0.5) ? o(2 * p) / 2 : (2 - o(2 * (1 - p))) / 2 } } for (d = 0, f = b.length; d < f; ++d) { c[b[d]] = h(d + 2) } for (a in c) { n(a, c[a]) } k.linear = Ext.identityFn; k.easeIn = k.quadIn; k.easeOut = k.quadOut; k.easeInOut = k.quadInOut; return { singleton: true, easingMap: k } }, function(a) { Ext.apply(a, a.easingMap) }); Ext.define("Ext.draw.Animator", { uses: ["Ext.draw.Draw"], singleton: true, frameCallbacks: {}, frameCallbackId: 0, scheduled: 0, frameStartTimeOffset: Ext.now(), animations: [], running: false, animationTime: function() { return Ext.AnimationQueue.frameStartTime - this.frameStartTimeOffset }, add: function(b) { var a = this; if (!a.contains(b)) { a.animations.push(b); a.ignite(); if ("fireEvent" in b) { b.fireEvent("animationstart", b) } } }, remove: function(d) { var c = this, e = c.animations, b = 0, a = e.length; for (; b < a; ++b) { if (e[b] === d) { e.splice(b, 1); if ("fireEvent" in d) { d.fireEvent("animationend", d) } return } } }, contains: function(a) { return Ext.Array.indexOf(this.animations, a) > -1 }, empty: function() { return this.animations.length === 0 }, step: function(d) { var c = this, f = c.animations, e, a = 0, b = f.length; for (; a < b; a++) { e = f[a]; e.step(d); if (!e.animating) { f.splice(a, 1); a--; b--; if (e.fireEvent) { e.fireEvent("animationend", e) } } } }, schedule: function(c, a) { a = a || this; var b = "frameCallback" + (this.frameCallbackId++); if (Ext.isString(c)) { c = a[c] } Ext.draw.Animator.frameCallbacks[b] = { fn: c, scope: a, once: true }; this.scheduled++; Ext.draw.Animator.ignite(); return b }, scheduleIf: function(e, b) { b = b || this; var c = Ext.draw.Animator.frameCallbacks, a, d; if (Ext.isString(e)) { e = b[e] } for (d in c) { a = c[d]; if (a.once && a.fn === e && a.scope === b) { return null } } return this.schedule(e, b) }, cancel: function(a) { if (Ext.draw.Animator.frameCallbacks[a] && Ext.draw.Animator.frameCallbacks[a].once) { this.scheduled--; delete Ext.draw.Animator.frameCallbacks[a] } }, addFrameCallback: function(c, a) { a = a || this; if (Ext.isString(c)) { c = a[c] } var b = "frameCallback" + (this.frameCallbackId++); Ext.draw.Animator.frameCallbacks[b] = { fn: c, scope: a }; return b }, removeFrameCallback: function(a) { delete Ext.draw.Animator.frameCallbacks[a] }, fireFrameCallbacks: function() { var c = this.frameCallbacks, d, b, a; for (d in c) { a = c[d]; b = a.fn; if (Ext.isString(b)) { b = a.scope[b] } b.call(a.scope); if (c[d] && a.once) { this.scheduled--; delete c[d] } } }, handleFrame: function() { this.step(this.animationTime()); this.fireFrameCallbacks(); if (!this.scheduled && this.empty()) { Ext.AnimationQueue.stop(this.handleFrame, this); this.running = false; Ext.draw.Draw.endUpdateIOS() } }, ignite: function() { if (!this.running) { this.running = true; Ext.AnimationQueue.start(this.handleFrame, this); Ext.draw.Draw.beginUpdateIOS() } } }); Ext.define("Ext.draw.modifier.Animation", { requires: ["Ext.draw.TimingFunctions", "Ext.draw.Animator"], extend: "Ext.draw.modifier.Modifier", alias: "modifier.animation", config: { easing: Ext.identityFn, duration: 0, customEasings: {}, customDurations: {}, customDuration: null }, constructor: function(a) { var b = this; b.anyAnimation = b.anySpecialAnimations = false; b.animating = 0; b.animatingPool = []; b.callParent([a]) }, prepareAttributes: function(a) { if (!a.hasOwnProperty("timers")) { a.animating = false; a.timers = {}; a.animationOriginal = Ext.Object.chain(a); a.animationOriginal.prototype = a } if (this._previous) { this._previous.prepareAttributes(a.animationOriginal) } }, updateSprite: function(a) { this.setConfig(a.config.fx) }, updateDuration: function(a) { this.anyAnimation = a > 0 }, applyEasing: function(a) { if (typeof a === "string") { a = Ext.draw.TimingFunctions.easingMap[a] } return a }, applyCustomEasings: function(a, e) { e = e || {}; var g, d, b, h, c, f; for (d in a) { g = true; h = a[d]; b = d.split(","); if (typeof h === "string") { h = Ext.draw.TimingFunctions.easingMap[h] } for (c = 0, f = b.length; c < f; c++) { e[b[c]] = h } } if (g) { this.anySpecialAnimations = g } return e }, setEasingOn: function(a, e) { a = Ext.Array.from(a).slice(); var c = {}, d = a.length, b = 0; for (; b < d; b++) { c[a[b]] = e } this.setCustomEasings(c) }, clearEasingOn: function(a) { a = Ext.Array.from(a, true); var b = 0, c = a.length; for (; b < c; b++) { delete this._customEasings[a[b]] } }, applyCustomDurations: function(g, h) { h = h || {}; var e, c, f, a, b, d; for (c in g) { e = true; f = g[c]; a = c.split(","); for (b = 0, d = a.length; b < d; b++) { h[a[b]] = f } } if (e) { this.anySpecialAnimations = e } return h }, applyCustomDuration: function(a, b) { if (a) { this.getCustomDurations(); this.setCustomDurations(a) } }, setDurationOn: function(b, e) { b = Ext.Array.from(b).slice(); var a = {}, c = 0, d = b.length; for (; c < d; c++) { a[b[c]] = e } this.setCustomDurations(a) }, clearDurationOn: function(a) { a = Ext.Array.from(a, true); var b = 0, c = a.length; for (; b < c; b++) { delete this._customDurations[a[b]] } }, setAnimating: function(a, b) { var e = this, d = e.animatingPool; if (a.animating !== b) { a.animating = b; if (b) { d.push(a); if (e.animating === 0) { Ext.draw.Animator.add(e) } e.animating++ } else { for (var c = d.length; c--;) { if (d[c] === a) { d.splice(c, 1) } } e.animating = d.length } } }, setAttrs: function(r, t) { var s = this, m = r.timers, h = s._sprite.self.def._animationProcessors, f = s._easing, e = s._duration, j = s._customDurations, i = s._customEasings, g = s.anySpecialAnimations, n = s.anyAnimation || g, o = r.animationOriginal, d = false, k, u, l, p, c, q, a; if (!n) { for (u in t) { if (r[u] === t[u]) { delete t[u] } else { r[u] = t[u] } delete o[u]; delete m[u] } return t } else { for (u in t) { l = t[u]; p = r[u]; if (l !== p && p !== undefined && p !== null && (c = h[u])) { q = f; a = e; if (g) { if (u in i) { q = i[u] } if (u in j) { a = j[u] } } if (p && p.isGradient || l && l.isGradient) { a = 0 } if (a) { if (!m[u]) { m[u] = {} } k = m[u]; k.start = 0; k.easing = q; k.duration = a; k.compute = c.compute; k.serve = c.serve || Ext.identityFn; k.remove = t.removeFromInstance && t.removeFromInstance[u]; if (c.parseInitial) { var b = c.parseInitial(p, l); k.source = b[0]; k.target = b[1] } else { if (c.parse) { k.source = c.parse(p); k.target = c.parse(l) } else { k.source = p; k.target = l } } o[u] = l; delete t[u]; d = true; continue } else { delete o[u] } } else { delete o[u] } delete m[u] } } if (d && !r.animating) { s.setAnimating(r, true) } return t }, updateAttributes: function(g) { if (!g.animating) { return {} } var h = {}, e = false, d = g.timers, f = g.animationOriginal, c = Ext.draw.Animator.animationTime(), a, b, i; if (g.lastUpdate === c) { return null } for (a in d) { b = d[a]; if (!b.start) { b.start = c; i = 0 } else { i = (c - b.start) / b.duration } if (i >= 1) { h[a] = f[a]; delete f[a]; if (d[a].remove) { h.removeFromInstance = h.removeFromInstance || {}; h.removeFromInstance[a] = true } delete d[a] } else { h[a] = b.serve(b.compute(b.source, b.target, b.easing(i), g[a])); e = true } } g.lastUpdate = c; this.setAnimating(g, e); return h }, pushDown: function(a, b) { b = this.callParent([a.animationOriginal, b]); return this.setAttrs(a, b) }, popUp: function(a, b) { a = a.prototype; b = this.setAttrs(a, b); if (this._next) { return this._next.popUp(a, b) } else { return Ext.apply(a, b) } }, step: function(g) { var f = this, c = f.animatingPool.slice(), e = c.length, b = 0, a, d; for (; b < e; b++) { a = c[b]; d = f.updateAttributes(a); if (d && f._next) { f._next.popUp(a, d) } } }, stop: function() { this.step(); var d = this, b = d.animatingPool, a, c; for (a = 0, c = b.length; a < c; a++) { b[a].animating = false } d.animatingPool.length = 0; d.animating = 0; Ext.draw.Animator.remove(d) }, destroy: function() { this.animatingPool.length = 0; this.animating = 0; this.callParent() } }); Ext.define("Ext.draw.modifier.Highlight", { extend: "Ext.draw.modifier.Modifier", alias: "modifier.highlight", config: { enabled: false, highlightStyle: null }, preFx: true, applyHighlightStyle: function(b, a) { a = a || {}; if (this.getSprite()) { Ext.apply(a, this.getSprite().self.def.normalize(b)) } else { Ext.apply(a, b) } return a }, prepareAttributes: function(a) { if (!a.hasOwnProperty("highlightOriginal")) { a.highlighted = false; a.highlightOriginal = Ext.Object.chain(a); a.highlightOriginal.prototype = a; a.highlightOriginal.removeFromInstance = {} } if (this._previous) { this._previous.prepareAttributes(a.highlightOriginal) } }, updateSprite: function(b, a) { if (b) { if (this.getHighlightStyle()) { this._highlightStyle = b.self.def.normalize(this.getHighlightStyle()) } this.setHighlightStyle(b.config.highlight) } b.self.def.setConfig({ defaults: { highlighted: false }, processors: { highlighted: "bool" } }); this.setSprite(b) }, filterChanges: function(a, d) { var e = this, f = a.highlightOriginal, c = e.getHighlightStyle(), b; if (a.highlighted) { for (b in d) { if (c.hasOwnProperty(b)) { f[b] = d[b]; delete d[b] } } } for (b in d) { if (b !== "highlighted" && f[b] === d[b]) { delete d[b] } } return d }, pushDown: function(e, g) { var f = this.getHighlightStyle(), c = e.highlightOriginal, i = c.removeFromInstance, d, a, h, b; if (g.hasOwnProperty("highlighted")) { d = g.highlighted; delete g.highlighted; if (this._previous) { g = this._previous.pushDown(c, g) } g = this.filterChanges(e, g); if (d !== e.highlighted) { if (d) { for (a in f) { if (a in g) { c[a] = g[a] } else { h = e.template && e.template.ownAttr; if (h && !e.prototype.hasOwnProperty(a)) { i[a] = true; c[a] = h.animationOriginal[a] } else { b = c.timers[a]; if (b && b.remove) { i[a] = true } c[a] = e[a] } } if (c[a] !== f[a]) { g[a] = f[a] } } } else { for (a in f) { if (!(a in g)) { g[a] = c[a] } delete c[a] } g.removeFromInstance = g.removeFromInstance || {}; Ext.apply(g.removeFromInstance, i); c.removeFromInstance = {} } g.highlighted = d } } else { if (this._previous) { g = this._previous.pushDown(c, g) } g = this.filterChanges(e, g) } return g }, popUp: function(a, b) { b = this.filterChanges(a, b); Ext.draw.modifier.Modifier.prototype.popUp.call(this, a, b) } }); Ext.define("Ext.draw.sprite.Sprite", { alias: "sprite.sprite", mixins: { observable: "Ext.mixin.Observable" }, requires: ["Ext.draw.Draw", "Ext.draw.gradient.Gradient", "Ext.draw.sprite.AttributeDefinition", "Ext.draw.modifier.Target", "Ext.draw.modifier.Animation", "Ext.draw.modifier.Highlight"], isSprite: true, statics: { defaultHitTestOptions: { fill: true, stroke: true } }, inheritableStatics: { def: { processors: { strokeStyle: "color", fillStyle: "color", strokeOpacity: "limited01", fillOpacity: "limited01", lineWidth: "number", lineCap: "enums(butt,round,square)", lineJoin: "enums(round,bevel,miter)", lineDash: "data", lineDashOffset: "number", miterLimit: "number", shadowColor: "color", shadowOffsetX: "number", shadowOffsetY: "number", shadowBlur: "number", globalAlpha: "limited01", globalCompositeOperation: "enums(source-over,destination-over,source-in,destination-in,source-out,destination-out,source-atop,destination-atop,lighter,xor,copy)", hidden: "bool", transformFillStroke: "bool", zIndex: "number", translationX: "number", translationY: "number", rotationRads: "number", rotationCenterX: "number", rotationCenterY: "number", scalingX: "number", scalingY: "number", scalingCenterX: "number", scalingCenterY: "number", constrainGradients: "bool" }, aliases: { stroke: "strokeStyle", fill: "fillStyle", color: "fillStyle", "stroke-width": "lineWidth", "stroke-linecap": "lineCap", "stroke-linejoin": "lineJoin", "stroke-miterlimit": "miterLimit", "text-anchor": "textAlign", opacity: "globalAlpha", translateX: "translationX", translateY: "translationY", rotateRads: "rotationRads", rotateCenterX: "rotationCenterX", rotateCenterY: "rotationCenterY", scaleX: "scalingX", scaleY: "scalingY", scaleCenterX: "scalingCenterX", scaleCenterY: "scalingCenterY" }, defaults: { hidden: false, zIndex: 0, strokeStyle: "none", fillStyle: "none", lineWidth: 1, lineDash: [], lineDashOffset: 0, lineCap: "butt", lineJoin: "miter", miterLimit: 10, shadowColor: "none", shadowOffsetX: 0, shadowOffsetY: 0, shadowBlur: 0, globalAlpha: 1, strokeOpacity: 1, fillOpacity: 1, transformFillStroke: false, translationX: 0, translationY: 0, rotationRads: 0, rotationCenterX: null, rotationCenterY: null, scalingX: 1, scalingY: 1, scalingCenterX: null, scalingCenterY: null, constrainGradients: false }, triggers: { zIndex: "zIndex", globalAlpha: "canvas", globalCompositeOperation: "canvas", transformFillStroke: "canvas", strokeStyle: "canvas", fillStyle: "canvas", strokeOpacity: "canvas", fillOpacity: "canvas", lineWidth: "canvas", lineCap: "canvas", lineJoin: "canvas", lineDash: "canvas", lineDashOffset: "canvas", miterLimit: "canvas", shadowColor: "canvas", shadowOffsetX: "canvas", shadowOffsetY: "canvas", shadowBlur: "canvas", translationX: "transform", translationY: "transform", rotationRads: "transform", rotationCenterX: "transform", rotationCenterY: "transform", scalingX: "transform", scalingY: "transform", scalingCenterX: "transform", scalingCenterY: "transform", constrainGradients: "canvas" }, updaters: { bbox: "bboxUpdater", zIndex: function(a) { a.dirtyZIndex = true }, transform: function(a) { a.dirtyTransform = true; a.bbox.transform.dirty = true } } } }, config: { parent: null, surface: null }, onClassExtended: function(d, c) { var b = d.superclass.self.def.initialConfig, e = c.inheritableStatics && c.inheritableStatics.def, a; if (e) { a = Ext.Object.merge({}, b, e); d.def = new Ext.draw.sprite.AttributeDefinition(a); delete c.inheritableStatics.def } else { d.def = new Ext.draw.sprite.AttributeDefinition(b) } d.def.spriteClass = d }, constructor: function(b) { var d = this, c = d.self.def, e = c.getDefaults(), a; b = Ext.isObject(b) ? b : {}; d.id = b.id || Ext.id(null, "ext-sprite-"); d.attr = {}; d.mixins.observable.constructor.apply(d, arguments); a = Ext.Array.from(b.modifiers, true); d.prepareModifiers(a); d.initializeAttributes(); d.setAttributes(e, true); d.setAttributes(b) }, getDirty: function() { return this.attr.dirty }, setDirty: function(b) { this.attr.dirty = b; if (b) { var a = this.getParent(); if (a) { a.setDirty(true) } } }, addModifier: function(a, b) { var c = this; if (!(a instanceof Ext.draw.modifier.Modifier)) { a = Ext.factory(a, null, null, "modifier") } a.setSprite(c); if (a.preFx || a.config && a.config.preFx) { if (c.fx.getPrevious()) { c.fx.getPrevious().setNext(a) } a.setNext(c.fx) } else { c.topModifier.getPrevious().setNext(a); a.setNext(c.topModifier) } if (b) { c.initializeAttributes() } return a }, prepareModifiers: function(d) { var c = this, a, b; c.topModifier = new Ext.draw.modifier.Target({ sprite: c }); c.fx = new Ext.draw.modifier.Animation({ sprite: c }); c.fx.setNext(c.topModifier); for (a = 0, b = d.length; a < b; a++) { c.addModifier(d[a], false) } }, getAnimation: function() { return this.fx }, setAnimation: function(a) { this.fx.setConfig(a) }, initializeAttributes: function() { this.topModifier.prepareAttributes(this.attr) }, callUpdaters: function(d) { var e = this, h = d.pendingUpdaters, i = e.self.def.getUpdaters(), c = false, a = false, b, g, f; e.callUpdaters = Ext.emptyFn; do { c = false; for (g in h) { c = true; b = h[g]; delete h[g]; f = i[g]; if (typeof f === "string") { f = e[f] } if (f) { f.call(e, d, b) } } a = a || c } while (c); delete e.callUpdaters; if (a) { e.setDirty(true) } }, scheduleUpdaters: function(a, e, c) { var f; if (c) { for (var b = 0, d = e.length; b < d; b++) { f = e[b]; this.scheduleUpdater(a, f, c) } } else { for (f in e) { c = e[f]; this.scheduleUpdater(a, f, c) } } }, scheduleUpdater: function(a, c, b) { b = b || []; var d = a.pendingUpdaters; if (c in d) { if (b.length) { d[c] = Ext.Array.merge(d[c], b) } } else { d[c] = b } }, setAttributes: function(d, g, c) { var a = this.attr, b, e, f; if (g) { if (c) { this.topModifier.pushDown(a, d) } else { f = {}; for (b in d) { e = d[b]; if (e !== a[b]) { f[b] = e } } this.topModifier.pushDown(a, f) } } else { this.topModifier.pushDown(a, this.self.def.normalize(d)) } }, setAttributesBypassingNormalization: function(b, a) { return this.setAttributes(b, true, a) }, bboxUpdater: function(b) { var c = b.rotationRads !== 0, a = b.scalingX !== 1 || b.scalingY !== 1, d = b.rotationCenterX === null || b.rotationCenterY === null, e = b.scalingCenterX === null || b.scalingCenterY === null; b.bbox.plain.dirty = true; b.bbox.transform.dirty = true; if (c && d || a && e) { this.scheduleUpdater(b, "transform") } }, getBBox: function(d) { var e = this, a = e.attr, f = a.bbox, c = f.plain, b = f.transform; if (c.dirty) { e.updatePlainBBox(c); c.dirty = false } if (!d) { e.applyTransformations(); if (b.dirty) { e.updateTransformedBBox(b, c); b.dirty = false } return b } return c }, updatePlainBBox: Ext.emptyFn, updateTransformedBBox: function(a, b) { this.attr.matrix.transformBBox(b, 0, a) }, getBBoxCenter: function(a) { var b = this.getBBox(a); if (b) { return [b.x + b.width * 0.5, b.y + b.height * 0.5] } else { return [0, 0] } }, hide: function() { this.attr.hidden = true; this.setDirty(true); return this }, show: function() { this.attr.hidden = false; this.setDirty(true); return this }, useAttributes: function(i, f) { this.applyTransformations(); var d = this.attr, h = d.canvasAttributes, e = h.strokeStyle, g = h.fillStyle, b = h.lineDash, c = h.lineDashOffset, a; if (e) { if (e.isGradient) { i.strokeStyle = "black"; i.strokeGradient = e } else { i.strokeGradient = false } } if (g) { if (g.isGradient) { i.fillStyle = "black"; i.fillGradient = g } else { i.fillGradient = false } } if (b) { i.setLineDash(b) } if (Ext.isNumber(c + i.lineDashOffset)) { i.lineDashOffset = c } for (a in h) { if (h[a] !== undefined && h[a] !== i[a]) { i[a] = h[a] } } this.setGradientBBox(i, f) }, setGradientBBox: function(b, c) { var a = this.attr; if (a.constrainGradients) { b.setGradientBBox({ x: c[0], y: c[1], width: c[2], height: c[3] }) } else { b.setGradientBBox(this.getBBox(a.transformFillStroke)) } }, applyTransformations: function(b) { if (!b && !this.attr.dirtyTransform) { return } var r = this, k = r.attr, p = r.getBBoxCenter(true), g = p[0], f = p[1], q = k.translationX, o = k.translationY, j = k.scalingX, i = k.scalingY === null ? k.scalingX : k.scalingY, m = k.scalingCenterX === null ? g : k.scalingCenterX, l = k.scalingCenterY === null ? f : k.scalingCenterY, s = k.rotationRads, e = k.rotationCenterX === null ? g : k.rotationCenterX, d = k.rotationCenterY === null ? f : k.rotationCenterY, c = Math.cos(s), a = Math.sin(s), n, h; if (j === 1 && i === 1) { m = 0; l = 0 } if (s === 0) { e = 0; d = 0 } n = m * (1 - j) - e; h = l * (1 - i) - d; k.matrix.elements = [c * j, a * j, -a * i, c * i, c * n - a * h + e + q, a * n + c * h + d + o]; k.matrix.inverse(k.inverseMatrix); k.dirtyTransform = false; k.bbox.transform.dirty = true }, transform: function(b, c) { var a = this.attr, e = a.matrix, d; if (b && b.isMatrix) { d = b.elements } else { d = b } e.prepend.apply(e, d.slice()); e.inverse(a.inverseMatrix); if (c) { this.updateTransformAttributes() } a.dirtyTransform = false; a.bbox.transform.dirty = true; this.setDirty(true); return this }, updateTransformAttributes: function() { var a = this.attr, b = a.matrix.split(); a.rotationRads = b.rotate; a.rotationCenterX = 0; a.rotationCenterY = 0; a.scalingX = b.scaleX; a.scalingY = b.scaleY; a.scalingCenterX = 0; a.scalingCenterY = 0; a.translationX = b.translateX; a.translationY = b.translateY }, resetTransform: function(b) { var a = this.attr; a.matrix.reset(); a.inverseMatrix.reset(); if (!b) { this.updateTransformAttributes() } a.dirtyTransform = false; a.bbox.transform.dirty = true; this.setDirty(true); return this }, setTransform: function(a, b) { this.resetTransform(true); this.transform.call(this, a, b); return this }, preRender: Ext.emptyFn, render: Ext.emptyFn, hitTest: function(b, c) { if (this.isVisible()) { var a = b[0], f = b[1], e = this.getBBox(), d = e && a >= e.x && a <= (e.x + e.width) && f >= e.y && f <= (e.y + e.height); if (d) { return { sprite: this } } } return null }, isVisible: function() { var e = this.attr, f = this.getParent(), g = f && (f.isSurface || f.isVisible()), d = g && !e.hidden && e.globalAlpha, b = Ext.draw.Color.NONE, a = Ext.draw.Color.RGBA_NONE, c = e.fillOpacity && e.fillStyle !== b && e.fillStyle !== a, i = e.strokeOpacity && e.strokeStyle !== b && e.strokeStyle !== a, h = d && (c || i); return !!h }, repaint: function() { var a = this.getSurface(); if (a) { a.renderFrame() } }, remove: function() { var a = this.getSurface(); if (a && a.isSurface) { return a.remove(this) } return null }, destroy: function() { var b = this, a = b.topModifier, c; while (a) { c = a; a = a.getPrevious(); c.destroy() } delete b.attr; b.remove(); if (b.fireEvent("beforedestroy", b) !== false) { b.fireEvent("destroy", b) } b.callParent() } }, function() { this.def = new Ext.draw.sprite.AttributeDefinition(this.def); this.def.spriteClass = this }); Ext.define("Ext.draw.Path", { requires: ["Ext.draw.Draw"], statics: { pathRe: /,?([achlmqrstvxz]),?/gi, pathRe2: /-/gi, pathSplitRe: /\s|,/g }, svgString: "", constructor: function(a) { var b = this; b.commands = []; b.params = []; b.cursor = null; b.startX = 0; b.startY = 0; if (a) { b.fromSvgString(a) } }, clear: function() { var a = this; a.params.length = 0; a.commands.length = 0; a.cursor = null; a.startX = 0; a.startY = 0; a.dirt() }, dirt: function() { this.svgString = "" }, moveTo: function(a, c) { var b = this; if (!b.cursor) { b.cursor = [a, c] } b.params.push(a, c); b.commands.push("M"); b.startX = a; b.startY = c; b.cursor[0] = a; b.cursor[1] = c; b.dirt() }, lineTo: function(a, c) { var b = this; if (!b.cursor) { b.cursor = [a, c]; b.params.push(a, c); b.commands.push("M") } else { b.params.push(a, c); b.commands.push("L") } b.cursor[0] = a; b.cursor[1] = c; b.dirt() }, bezierCurveTo: function(c, e, b, d, a, g) { var f = this; if (!f.cursor) { f.moveTo(c, e) } f.params.push(c, e, b, d, a, g); f.commands.push("C"); f.cursor[0] = a; f.cursor[1] = g; f.dirt() }, quadraticCurveTo: function(b, e, a, d) { var c = this; if (!c.cursor) { c.moveTo(b, e) } c.bezierCurveTo((2 * b + c.cursor[0]) / 3, (2 * e + c.cursor[1]) / 3, (2 * b + a) / 3, (2 * e + d) / 3, a, d) }, closePath: function() { var a = this; if (a.cursor) { a.cursor = null; a.commands.push("Z"); a.dirt() } }, arcTo: function(A, f, z, d, j, i, v) { var E = this; if (i === undefined) { i = j } if (v === undefined) { v = 0 } if (!E.cursor) { E.moveTo(A, f); return } if (j === 0 || i === 0) { E.lineTo(A, f); return } z -= A; d -= f; var B = E.cursor[0] - A, g = E.cursor[1] - f, C = z * g - d * B, b, a, l, r, k, q, x = Math.sqrt(B * B + g * g), u = Math.sqrt(z * z + d * d), t, e, c; if (C === 0) { E.lineTo(A, f); return } if (i !== j) { b = Math.cos(v); a = Math.sin(v); l = b / j; r = a / i; k = -a / j; q = b / i; var D = l * B + r * g; g = k * B + q * g; B = D; D = l * z + r * d; d = k * z + q * d; z = D } else { B /= j; g /= i; z /= j; d /= i } e = B * u + z * x; c = g * u + d * x; t = 1 / (Math.sin(Math.asin(Math.abs(C) / (x * u)) * 0.5) * Math.sqrt(e * e + c * c)); e *= t; c *= t; var o = (e * B + c * g) / (B * B + g * g), m = (e * z + c * d) / (z * z + d * d); var n = B * o - e, p = g * o - c, h = z * m - e, y = d * m - c, w = Math.atan2(p, n), s = Math.atan2(y, h); if (C > 0) { if (s < w) { s += Math.PI * 2 } } else { if (w < s) { w += Math.PI * 2 } } if (i !== j) { e = b * e * j - a * c * i + A; c = a * c * i + b * c * i + f; E.lineTo(b * j * n - a * i * p + e, a * j * n + b * i * p + c); E.ellipse(e, c, j, i, v, w, s, C < 0) } else { e = e * j + A; c = c * i + f; E.lineTo(j * n + e, i * p + c); E.ellipse(e, c, j, i, v, w, s, C < 0) } }, ellipse: function(h, f, c, a, q, n, d, e) { var o = this, g = o.params, b = g.length, m, l, k; if (d - n >= Math.PI * 2) { o.ellipse(h, f, c, a, q, n, n + Math.PI, e); o.ellipse(h, f, c, a, q, n + Math.PI, d, e); return } if (!e) { if (d < n) { d += Math.PI * 2 } m = o.approximateArc(g, h, f, c, a, q, n, d) } else { if (n < d) { n += Math.PI * 2 } m = o.approximateArc(g, h, f, c, a, q, d, n); for (l = b, k = g.length - 2; l < k; l += 2, k -= 2) { var p = g[l]; g[l] = g[k]; g[k] = p; p = g[l + 1]; g[l + 1] = g[k + 1]; g[k + 1] = p } } if (!o.cursor) { o.cursor = [g[g.length - 2], g[g.length - 1]]; o.commands.push("M") } else { o.cursor[0] = g[g.length - 2]; o.cursor[1] = g[g.length - 1]; o.commands.push("L") } for (l = 2; l < m; l += 6) { o.commands.push("C") } o.dirt() }, arc: function(b, f, a, d, c, e) { this.ellipse(b, f, a, a, 0, d, c, e) }, rect: function(b, e, c, a) { if (c == 0 || a == 0) { return } var d = this; d.moveTo(b, e); d.lineTo(b + c, e); d.lineTo(b + c, e + a); d.lineTo(b, e + a); d.closePath() }, approximateArc: function(s, i, f, o, n, d, x, v) { var e = Math.cos(d), z = Math.sin(d), k = Math.cos(x), l = Math.sin(x), q = e * k * o - z * l * n, y = -e * l * o - z * k * n, p = z * k * o + e * l * n, w = -z * l * o + e * k * n, m = Math.PI / 2, r = 2, j = q, u = y, h = p, t = w, b = 0.547443256150549, C, g, A, a, B, c; v -= x; if (v < 0) { v += Math.PI * 2 } s.push(q + i, p + f); while (v >= m) { s.push(j + u * b + i, h + t * b + f, j * b + u + i, h * b + t + f, u + i, t + f); r += 6; v -= m; C = j; j = u; u = -C; C = h; h = t; t = -C } if (v) { g = (0.3294738052815987 + 0.012120855841304373 * v) * v; A = Math.cos(v); a = Math.sin(v); B = A + g * a; c = a - g * A; s.push(j + u * g + i, h + t * g + f, j * B + u * c + i, h * B + t * c + f, j * A + u * a + i, h * A + t * a + f); r += 6 } return r }, arcSvg: function(j, h, r, m, w, t, c) { if (j < 0) { j = -j } if (h < 0) { h = -h } var x = this, u = x.cursor[0], f = x.cursor[1], a = (u - t) / 2, y = (f - c) / 2, d = Math.cos(r), s = Math.sin(r), o = a * d + y * s, v = -a * s + y * d, i = o / j, g = v / h, p = i * i + g * g, e = (u + t) * 0.5, b = (f + c) * 0.5, l = 0, k = 0; if (p >= 1) { p = Math.sqrt(p); j *= p; h *= p } else { p = Math.sqrt(1 / p - 1); if (m === w) { p = -p } l = p * j * g; k = -p * h * i; e += d * l - s * k; b += s * l + d * k } var q = Math.atan2((v - k) / h, (o - l) / j), n = Math.atan2((-v - k) / h, (-o - l) / j) - q; if (w) { if (n <= 0) { n += Math.PI * 2 } } else { if (n >= 0) { n -= Math.PI * 2 } } x.ellipse(e, b, j, h, r, q, q + n, 1 - w) }, fromSvgString: function(e) { if (!e) { return } var m = this, h, l = { a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0, A: 7, C: 6, H: 1, L: 2, M: 2, Q: 4, S: 4, T: 2, V: 1, Z: 0 }, k = "", g, f, c = 0, b = 0, d = false, j, n, a; if (Ext.isString(e)) { h = e.replace(Ext.draw.Path.pathRe, " $1 ").replace(Ext.draw.Path.pathRe2, " -").split(Ext.draw.Path.pathSplitRe) } else { if (Ext.isArray(e)) { h = e.join(",").split(Ext.draw.Path.pathSplitRe) } } for (j = 0, n = 0; j < h.length; j++) { if (h[j] !== "") { h[n++] = h[j] } } h.length = n; m.clear(); for (j = 0; j < h.length;) { k = d; d = h[j]; a = (d.toUpperCase() !== d); j++; switch (d) { case "M": m.moveTo(c = +h[j], b = +h[j + 1]); j += 2; while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c = +h[j], b = +h[j + 1]); j += 2 } break; case "L": m.lineTo(c = +h[j], b = +h[j + 1]); j += 2; while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c = +h[j], b = +h[j + 1]); j += 2 } break; case "A": while (j < n && !l.hasOwnProperty(h[j])) { m.arcSvg(+h[j], +h[j + 1], +h[j + 2] * Math.PI / 180, +h[j + 3], +h[j + 4], c = +h[j + 5], b = +h[j + 6]); j += 7 } break; case "C": while (j < n && !l.hasOwnProperty(h[j])) { m.bezierCurveTo(+h[j], +h[j + 1], g = +h[j + 2], f = +h[j + 3], c = +h[j + 4], b = +h[j + 5]); j += 6 } break; case "Z": m.closePath(); break; case "m": m.moveTo(c += +h[j], b += +h[j + 1]); j += 2; while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c += +h[j], b += +h[j + 1]); j += 2 } break; case "l": m.lineTo(c += +h[j], b += +h[j + 1]); j += 2; while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c += +h[j], b += +h[j + 1]); j += 2 } break; case "a": while (j < n && !l.hasOwnProperty(h[j])) { m.arcSvg(+h[j], +h[j + 1], +h[j + 2] * Math.PI / 180, +h[j + 3], +h[j + 4], c += +h[j + 5], b += +h[j + 6]); j += 7 } break; case "c": while (j < n && !l.hasOwnProperty(h[j])) { m.bezierCurveTo(c + (+h[j]), b + (+h[j + 1]), g = c + (+h[j + 2]), f = b + (+h[j + 3]), c += +h[j + 4], b += +h[j + 5]); j += 6 } break; case "z": m.closePath(); break; case "s": if (!(k === "c" || k === "C" || k === "s" || k === "S")) { g = c; f = b } while (j < n && !l.hasOwnProperty(h[j])) { m.bezierCurveTo(c + c - g, b + b - f, g = c + (+h[j]), f = b + (+h[j + 1]), c += +h[j + 2], b += +h[j + 3]); j += 4 } break; case "S": if (!(k === "c" || k === "C" || k === "s" || k === "S")) { g = c; f = b } while (j < n && !l.hasOwnProperty(h[j])) { m.bezierCurveTo(c + c - g, b + b - f, g = +h[j], f = +h[j + 1], c = (+h[j + 2]), b = (+h[j + 3])); j += 4 } break; case "q": while (j < n && !l.hasOwnProperty(h[j])) { m.quadraticCurveTo(g = c + (+h[j]), f = b + (+h[j + 1]), c += +h[j + 2], b += +h[j + 3]); j += 4 } break; case "Q": while (j < n && !l.hasOwnProperty(h[j])) { m.quadraticCurveTo(g = +h[j], f = +h[j + 1], c = +h[j + 2], b = +h[j + 3]); j += 4 } break; case "t": if (!(k === "q" || k === "Q" || k === "t" || k === "T")) { g = c; f = b } while (j < n && !l.hasOwnProperty(h[j])) { m.quadraticCurveTo(g = c + c - g, f = b + b - f, c += +h[j + 1], b += +h[j + 2]); j += 2 } break; case "T": if (!(k === "q" || k === "Q" || k === "t" || k === "T")) { g = c; f = b } while (j < n && !l.hasOwnProperty(h[j])) { m.quadraticCurveTo(g = c + c - g, f = b + b - f, c = (+h[j + 1]), b = (+h[j + 2])); j += 2 } break; case "h": while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c += +h[j], b); j++ } break; case "H": while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c = +h[j], b); j++ } break; case "v": while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c, b += +h[j]); j++ } break; case "V": while (j < n && !l.hasOwnProperty(h[j])) { m.lineTo(c, b = +h[j]); j++ } break } } }, clone: function() { var a = this, b = new Ext.draw.Path(); b.params = a.params.slice(0); b.commands = a.commands.slice(0); b.cursor = a.cursor ? a.cursor.slice(0) : null; b.startX = a.startX; b.startY = a.startY; b.svgString = a.svgString; return b }, transform: function(j) { if (j.isIdentity()) { return } var a = j.getXX(), f = j.getYX(), m = j.getDX(), l = j.getXY(), e = j.getYY(), k = j.getDY(), b = this.params, c = 0, d = b.length, h, g; for (; c < d; c += 2) { h = b[c]; g = b[c + 1]; b[c] = h * a + g * f + m; b[c + 1] = h * l + g * e + k } this.dirt() }, getDimension: function(f) { if (!f) { f = {} } if (!this.commands || !this.commands.length) { f.x = 0; f.y = 0; f.width = 0; f.height = 0; return f } f.left = Infinity; f.top = Infinity; f.right = -Infinity; f.bottom = -Infinity; var d = 0, c = 0, b = this.commands, g = this.params, e = b.length, a, h; for (; d < e; d++) { switch (b[d]) { case "M": case "L": a = g[c]; h = g[c + 1]; f.left = Math.min(a, f.left); f.top = Math.min(h, f.top); f.right = Math.max(a, f.right); f.bottom = Math.max(h, f.bottom); c += 2; break; case "C": this.expandDimension(f, a, h, g[c], g[c + 1], g[c + 2], g[c + 3], a = g[c + 4], h = g[c + 5]); c += 6; break } } f.x = f.left; f.y = f.top; f.width = f.right - f.left; f.height = f.bottom - f.top; return f }, getDimensionWithTransform: function(n, f) { if (!this.commands || !this.commands.length) { if (!f) { f = {} } f.x = 0; f.y = 0; f.width = 0; f.height = 0; return f } f.left = Infinity; f.top = Infinity; f.right = -Infinity; f.bottom = -Infinity; var a = n.getXX(), k = n.getYX(), q = n.getDX(), p = n.getXY(), h = n.getYY(), o = n.getDY(), e = 0, d = 0, b = this.commands, c = this.params, g = b.length, m, l; for (; e < g; e++) { switch (b[e]) { case "M": case "L": m = c[d] * a + c[d + 1] * k + q; l = c[d] * p + c[d + 1] * h + o; f.left = Math.min(m, f.left); f.top = Math.min(l, f.top); f.right = Math.max(m, f.right); f.bottom = Math.max(l, f.bottom); d += 2; break; case "C": this.expandDimension(f, m, l, c[d] * a + c[d + 1] * k + q, c[d] * p + c[d + 1] * h + o, c[d + 2] * a + c[d + 3] * k + q, c[d + 2] * p + c[d + 3] * h + o, m = c[d + 4] * a + c[d + 5] * k + q, l = c[d + 4] * p + c[d + 5] * h + o); d += 6; break } } if (!f) { f = {} } f.x = f.left; f.y = f.top; f.width = f.right - f.left; f.height = f.bottom - f.top; return f }, expandDimension: function(i, d, p, k, g, j, e, c, o) { var m = this, f = i.left, a = i.right, q = i.top, n = i.bottom, h = m.dim || (m.dim = []); m.curveDimension(d, k, j, c, h); f = Math.min(f, h[0]); a = Math.max(a, h[1]); m.curveDimension(p, g, e, o, h); q = Math.min(q, h[0]); n = Math.max(n, h[1]); i.left = f; i.right = a; i.top = q; i.bottom = n }, curveDimension: function(p, n, k, j, h) { var i = 3 * (-p + 3 * (n - k) + j), g = 6 * (p - 2 * n + k), f = -3 * (p - n), o, m, e = Math.min(p, j), l = Math.max(p, j), q; if (i === 0) { if (g === 0) { h[0] = e; h[1] = l; return } else { o = -f / g; if (0 < o && o < 1) { m = this.interpolate(p, n, k, j, o); e = Math.min(e, m); l = Math.max(l, m) } } } else { q = g * g - 4 * i * f; if (q >= 0) { q = Math.sqrt(q); o = (q - g) / 2 / i; if (0 < o && o < 1) { m = this.interpolate(p, n, k, j, o); e = Math.min(e, m); l = Math.max(l, m) } if (q > 0) { o -= q / i; if (0 < o && o < 1) { m = this.interpolate(p, n, k, j, o); e = Math.min(e, m); l = Math.max(l, m) } } } } h[0] = e; h[1] = l }, interpolate: function(f, e, j, i, g) { if (g === 0) { return f } if (g === 1) { return i } var h = (1 - g) / g; return g * g * g * (i + h * (3 * j + h * (3 * e + h * f))) }, fromStripes: function(g) { var e = this, c = 0, d = g.length, b, a, f; e.clear(); for (; c < d; c++) { f = g[c]; e.params.push.apply(e.params, f); e.commands.push("M"); for (b = 2, a = f.length; b < a; b += 6) { e.commands.push("C") } } if (!e.cursor) { e.cursor = [] } e.cursor[0] = e.params[e.params.length - 2]; e.cursor[1] = e.params[e.params.length - 1]; e.dirt() }, toStripes: function(k) { var o = k || [], p, n, m, b, a, h, g, f, e, c = this.commands, d = this.params, l = c.length; for (f = 0, e = 0; f < l; f++) { switch (c[f]) { case "M": p = [h = b = d[e++], g = a = d[e++]]; o.push(p); break; case "L": n = d[e++]; m = d[e++]; p.push((b + b + n) / 3, (a + a + m) / 3, (b + n + n) / 3, (a + m + m) / 3, b = n, a = m); break; case "C": p.push(d[e++], d[e++], d[e++], d[e++], b = d[e++], a = d[e++]); break; case "Z": n = h; m = g; p.push((b + b + n) / 3, (a + a + m) / 3, (b + n + n) / 3, (a + m + m) / 3, b = n, a = m); break } } return o }, updateSvgString: function() { var b = [], a = this.commands, f = this.params, e = a.length, d = 0, c = 0; for (; d < e; d++) { switch (a[d]) { case "M": b.push("M" + f[c] + "," + f[c + 1]); c += 2; break; case "L": b.push("L" + f[c] + "," + f[c + 1]); c += 2; break; case "C": b.push("C" + f[c] + "," + f[c + 1] + " " + f[c + 2] + "," + f[c + 3] + " " + f[c + 4] + "," + f[c + 5]); c += 6; break; case "Z": b.push("Z"); break } } this.svgString = b.join("") }, toString: function() { if (!this.svgString) { this.updateSvgString() } return this.svgString } }); Ext.define("Ext.draw.overrides.Path", { override: "Ext.draw.Path", rayOrigin: { x: -10000, y: -10000 }, isPointInPath: function(o, n) { var m = this, c = m.commands, q = Ext.draw.PathUtil, p = m.rayOrigin, f = m.params, l = c.length, e = null, d = null, b = 0, a = 0, k = 0, h, g; for (h = 0, g = 0; h < l; h++) { switch (c[h]) { case "M": if (e !== null) { if (q.linesIntersection(e, d, b, a, p.x, p.y, o, n)) { k += 1 } } e = b = f[g]; d = a = f[g + 1]; g += 2; break; case "L": if (q.linesIntersection(b, a, f[g], f[g + 1], p.x, p.y, o, n)) { k += 1 } b = f[g]; a = f[g + 1]; g += 2; break; case "C": k += q.cubicLineIntersections(b, f[g], f[g + 2], f[g + 4], a, f[g + 1], f[g + 3], f[g + 5], p.x, p.y, o, n).length; b = f[g + 4]; a = f[g + 5]; g += 6; break; case "Z": if (e !== null) { if (q.linesIntersection(e, d, b, a, p.x, p.y, o, n)) { k += 1 } } break } } return k % 2 === 1 }, isPointOnPath: function(n, m) { var l = this, c = l.commands, o = Ext.draw.PathUtil, f = l.params, k = c.length, e = null, d = null, b = 0, a = 0, h, g; for (h = 0, g = 0; h < k; h++) { switch (c[h]) { case "M": if (e !== null) { if (o.pointOnLine(e, d, b, a, n, m)) { return true } } e = b = f[g]; d = a = f[g + 1]; g += 2; break; case "L": if (o.pointOnLine(b, a, f[g], f[g + 1], n, m)) { return true } b = f[g]; a = f[g + 1]; g += 2; break; case "C": if (o.pointOnCubic(b, f[g], f[g + 2], f[g + 4], a, f[g + 1], f[g + 3], f[g + 5], n, m)) { return true } b = f[g + 4]; a = f[g + 5]; g += 6; break; case "Z": if (e !== null) { if (o.pointOnLine(e, d, b, a, n, m)) { return true } } break } } return false }, getSegmentIntersections: function(t, d, s, c, r, b, o, a) { var w = this, g = arguments.length, v = Ext.draw.PathUtil, f = w.commands, u = w.params, k = f.length, m = null, l = null, h = 0, e = 0, x = [], q, n, p; for (q = 0, n = 0; q < k; q++) { switch (f[q]) { case "M": if (m !== null) { switch (g) { case 4: p = v.linesIntersection(m, l, h, e, t, d, s, c); if (p) { x.push(p) } break; case 8: p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, m, l, h, e); x.push.apply(x, p); break } } m = h = u[n]; l = e = u[n + 1]; n += 2; break; case "L": switch (g) { case 4: p = v.linesIntersection(h, e, u[n], u[n + 1], t, d, s, c); if (p) { x.push(p) } break; case 8: p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, h, e, u[n], u[n + 1]); x.push.apply(x, p); break } h = u[n]; e = u[n + 1]; n += 2; break; case "C": switch (g) { case 4: p = v.cubicLineIntersections(h, u[n], u[n + 2], u[n + 4], e, u[n + 1], u[n + 3], u[n + 5], t, d, s, c); x.push.apply(x, p); break; case 8: p = v.cubicsIntersections(h, u[n], u[n + 2], u[n + 4], e, u[n + 1], u[n + 3], u[n + 5], t, s, r, o, d, c, b, a); x.push.apply(x, p); break } h = u[n + 4]; e = u[n + 5]; n += 6; break; case "Z": if (m !== null) { switch (g) { case 4: p = v.linesIntersection(m, l, h, e, t, d, s, c); if (p) { x.push(p) } break; case 8: p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, m, l, h, e); x.push.apply(x, p); break } } break } } return x }, getIntersections: function(o) { var m = this, c = m.commands, g = m.params, l = c.length, f = null, e = null, b = 0, a = 0, d = [], k, h, n; for (k = 0, h = 0; k < l; k++) { switch (c[k]) { case "M": if (f !== null) { n = o.getSegmentIntersections.call(o, f, e, b, a); d.push.apply(d, n) } f = b = g[h]; e = a = g[h + 1]; h += 2; break; case "L": n = o.getSegmentIntersections.call(o, b, a, g[h], g[h + 1]); d.push.apply(d, n); b = g[h]; a = g[h + 1]; h += 2; break; case "C": n = o.getSegmentIntersections.call(o, b, a, g[h], g[h + 1], g[h + 2], g[h + 3], g[h + 4], g[h + 5]); d.push.apply(d, n); b = g[h + 4]; a = g[h + 5]; h += 6; break; case "Z": if (f !== null) { n = o.getSegmentIntersections.call(o, f, e, b, a); d.push.apply(d, n) } break } } return d } }); Ext.define("Ext.draw.sprite.Path", { extend: "Ext.draw.sprite.Sprite", requires: ["Ext.draw.Draw", "Ext.draw.Path"], alias: ["sprite.path", "Ext.draw.Sprite"], type: "path", isPath: true, inheritableStatics: { def: { processors: { path: function(b, a) { if (!(b instanceof Ext.draw.Path)) { b = new Ext.draw.Path(b) } return b } }, aliases: { d: "path" }, triggers: { path: "bbox" }, updaters: { path: function(a) { var b = a.path; if (!b || b.bindAttr !== a) { b = new Ext.draw.Path(); b.bindAttr = a; a.path = b } b.clear(); this.updatePath(b, a); this.scheduleUpdater(a, "bbox", ["path"]) } } } }, updatePlainBBox: function(a) { if (this.attr.path) { this.attr.path.getDimension(a) } }, updateTransformedBBox: function(a) { if (this.attr.path) { this.attr.path.getDimensionWithTransform(this.attr.matrix, a) } }, render: function(b, c) { var d = this.attr.matrix, a = this.attr; if (!a.path || a.path.params.length === 0) { return } d.toContext(c); c.appendPath(a.path); c.fillStroke(a) }, updatePath: function(b, a) {} }); Ext.define("Ext.draw.overrides.sprite.Path", { override: "Ext.draw.sprite.Path", requires: ["Ext.draw.Color"], isPointInPath: function(c, g) { var b = this.attr; if (b.fillStyle === Ext.draw.Color.RGBA_NONE) { return this.isPointOnPath(c, g) } var e = b.path, d = b.matrix, f, a; if (!d.isIdentity()) { f = e.params.slice(0); e.transform(b.matrix) } a = e.isPointInPath(c, g); if (f) { e.params = f } return a }, isPointOnPath: function(c, g) { var b = this.attr, e = b.path, d = b.matrix, f, a; if (!d.isIdentity()) { f = e.params.slice(0); e.transform(b.matrix) } a = e.isPointOnPath(c, g); if (f) { e.params = f } return a }, hitTest: function(i, l) { var e = this, c = e.attr, k = c.path, g = c.matrix, h = i[0], f = i[1], d = e.callParent([i, l]), j = null, a, b; if (!d) { return j } l = l || Ext.draw.sprite.Sprite.defaultHitTestOptions; if (!g.isIdentity()) { a = k.params.slice(0); k.transform(c.matrix) } if (l.fill && l.stroke) { b = c.fillStyle !== Ext.draw.Color.NONE && c.fillStyle !== Ext.draw.Color.RGBA_NONE; if (b) { if (k.isPointInPath(h, f)) { j = { sprite: e } } } else { if (k.isPointInPath(h, f) || k.isPointOnPath(h, f)) { j = { sprite: e } } } } else { if (l.stroke && !l.fill) { if (k.isPointOnPath(h, f)) { j = { sprite: e } } } else { if (l.fill && !l.stroke) { if (k.isPointInPath(h, f)) { j = { sprite: e } } } } } if (a) { k.params = a } return j }, getIntersections: function(j) { if (!(j.isSprite && j.isPath)) { return [] } var e = this.attr, d = j.attr, i = e.path, h = d.path, g = e.matrix, a = d.matrix, c, f, b; if (!g.isIdentity()) { c = i.params.slice(0); i.transform(e.matrix) } if (!a.isIdentity()) { f = h.params.slice(0); h.transform(d.matrix) } b = i.getIntersections(h); if (c) { i.params = c } if (f) { h.params = f } return b } }); Ext.define("Ext.draw.sprite.Circle", { extend: "Ext.draw.sprite.Path", alias: "sprite.circle", type: "circle", inheritableStatics: { def: { processors: { cx: "number", cy: "number", r: "number" }, aliases: { radius: "r", x: "cx", y: "cy", centerX: "cx", centerY: "cy" }, defaults: { cx: 0, cy: 0, r: 4 }, triggers: { cx: "path", cy: "path", r: "path" } } }, updatePlainBBox: function(c) { var b = this.attr, a = b.cx, e = b.cy, d = b.r; c.x = a - d; c.y = e - d; c.width = d + d; c.height = d + d }, updateTransformedBBox: function(d) { var g = this.attr, f = g.cx, e = g.cy, a = g.r, h = g.matrix, j = h.getScaleX(), i = h.getScaleY(), c, b; c = j * a; b = i * a; d.x = h.x(f, e) - c; d.y = h.y(f, e) - b; d.width = c + c; d.height = b + b }, updatePath: function(b, a) { b.arc(a.cx, a.cy, a.r, 0, Math.PI * 2, false) } }); Ext.define("Ext.draw.sprite.Arc", { extend: "Ext.draw.sprite.Circle", alias: "sprite.arc", type: "arc", inheritableStatics: { def: { processors: { startAngle: "number", endAngle: "number", anticlockwise: "bool" }, aliases: { from: "startAngle", to: "endAngle", start: "startAngle", end: "endAngle" }, defaults: { startAngle: 0, endAngle: Math.PI * 2, anticlockwise: false }, triggers: { startAngle: "path", endAngle: "path", anticlockwise: "path" } } }, updatePath: function(b, a) { b.arc(a.cx, a.cy, a.r, a.startAngle, a.endAngle, a.anticlockwise) } }); Ext.define("Ext.draw.sprite.Arrow", { extend: "Ext.draw.sprite.Path", alias: "sprite.arrow", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "path", y: "path", size: "path" } } }, updatePath: function(d, b) { var c = b.size * 1.5, a = b.x - b.lineWidth / 2, e = b.y; d.fromSvgString("M".concat(a - c * 0.7, ",", e - c * 0.4, "l", [c * 0.6, 0, 0, -c * 0.4, c, c * 0.8, -c, c * 0.8, 0, -c * 0.4, -c * 0.6, 0], "z")) } }); Ext.define("Ext.draw.sprite.Composite", { extend: "Ext.draw.sprite.Sprite", alias: "sprite.composite", type: "composite", isComposite: true, config: { sprites: [] }, constructor: function() { this.sprites = []; this.sprites.map = {}; this.callParent(arguments) }, add: function(c) { if (!c) { return null } if (!c.isSprite) { c = Ext.create("sprite." + c.type, c); c.setParent(this); c.setSurface(this.getSurface()) } var d = this, a = d.attr, b = c.applyTransformations; c.applyTransformations = function() { if (c.attr.dirtyTransform) { a.dirtyTransform = true; a.bbox.plain.dirty = true; a.bbox.transform.dirty = true } b.call(c) }; d.sprites.push(c); d.sprites.map[c.id] = c.getId(); a.bbox.plain.dirty = true; a.bbox.transform.dirty = true; return c }, updateSurface: function(a) { for (var b = 0, c = this.sprites.length; b < c; b++) { this.sprites[b].setSurface(a) } }, addAll: function(b) { if (b.isSprite || b.type) { this.add(b) } else { if (Ext.isArray(b)) { var a = 0; while (a < b.length) { this.add(b[a++]) } } } }, updatePlainBBox: function(g) { var e = this, b = Infinity, h = -Infinity, f = Infinity, a = -Infinity, j, k, c, d; for (c = 0, d = e.sprites.length; c < d; c++) { j = e.sprites[c]; j.applyTransformations(); k = j.getBBox(); if (b > k.x) { b = k.x } if (h < k.x + k.width) { h = k.x + k.width } if (f > k.y) { f = k.y } if (a < k.y + k.height) { a = k.y + k.height } } g.x = b; g.y = f; g.width = h - b; g.height = a - f }, render: function(a, b, f) { var d = this.attr.matrix, c, e; d.toContext(b); for (c = 0, e = this.sprites.length; c < e; c++) { a.renderSprite(this.sprites[c], f) } }, destroy: function() { var c = this, d = c.sprites, b = d.length, a; c.callParent(); for (a = 0; a < b; a++) { d[a].destroy() } d.length = 0 } }); Ext.define("Ext.draw.sprite.Cross", { extend: "Ext.draw.sprite.Path", alias: "sprite.cross", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "path", y: "path", size: "path" } } }, updatePath: function(d, b) { var c = b.size / 1.7, a = b.x - b.lineWidth / 2, e = b.y; d.fromSvgString("M".concat(a - c, ",", e, "l", [-c, -c, c, -c, c, c, c, -c, c, c, -c, c, c, c, -c, c, -c, -c, -c, c, -c, -c, "z"])) } }); Ext.define("Ext.draw.sprite.Diamond", { extend: "Ext.draw.sprite.Path", alias: "sprite.diamond", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "path", y: "path", size: "path" } } }, updatePath: function(d, b) { var c = b.size * 1.25, a = b.x - b.lineWidth / 2, e = b.y; d.fromSvgString(["M", a, e - c, "l", c, c, -c, c, -c, -c, c, -c, "z"]) } }); Ext.define("Ext.draw.sprite.Ellipse", { extend: "Ext.draw.sprite.Path", alias: "sprite.ellipse", type: "ellipse", inheritableStatics: { def: { processors: { cx: "number", cy: "number", rx: "number", ry: "number", axisRotation: "number" }, aliases: { radius: "r", x: "cx", y: "cy", centerX: "cx", centerY: "cy", radiusX: "rx", radiusY: "ry" }, defaults: { cx: 0, cy: 0, rx: 1, ry: 1, axisRotation: 0 }, triggers: { cx: "path", cy: "path", rx: "path", ry: "path", axisRotation: "path" } } }, updatePlainBBox: function(c) { var b = this.attr, a = b.cx, f = b.cy, e = b.rx, d = b.ry; c.x = a - e; c.y = f - d; c.width = e + e; c.height = d + d }, updateTransformedBBox: function(d) { var i = this.attr, f = i.cx, e = i.cy, c = i.rx, b = i.ry, l = b / c, m = i.matrix.clone(), a, q, k, j, p, o, n, g; m.append(1, 0, 0, l, 0, e * (1 - l)); a = m.getXX(); k = m.getYX(); p = m.getDX(); q = m.getXY(); j = m.getYY(); o = m.getDY(); n = Math.sqrt(a * a + k * k) * c; g = Math.sqrt(q * q + j * j) * c; d.x = f * a + e * k + p - n; d.y = f * q + e * j + o - g; d.width = n + n; d.height = g + g }, updatePath: function(b, a) { b.ellipse(a.cx, a.cy, a.rx, a.ry, a.axisRotation, 0, Math.PI * 2, false) } }); Ext.define("Ext.draw.sprite.EllipticalArc", { extend: "Ext.draw.sprite.Ellipse", alias: "sprite.ellipticalArc", type: "ellipticalArc", inheritableStatics: { def: { processors: { startAngle: "number", endAngle: "number", anticlockwise: "bool" }, aliases: { from: "startAngle", to: "endAngle", start: "startAngle", end: "endAngle" }, defaults: { startAngle: 0, endAngle: Math.PI * 2, anticlockwise: false }, triggers: { startAngle: "path", endAngle: "path", anticlockwise: "path" } } }, updatePath: function(b, a) { b.ellipse(a.cx, a.cy, a.rx, a.ry, a.axisRotation, a.startAngle, a.endAngle, a.anticlockwise) } }); Ext.define("Ext.draw.sprite.Rect", { extend: "Ext.draw.sprite.Path", alias: "sprite.rect", type: "rect", inheritableStatics: { def: { processors: { x: "number", y: "number", width: "number", height: "number", radius: "number" }, aliases: {}, triggers: { x: "path", y: "path", width: "path", height: "path", radius: "path" }, defaults: { x: 0, y: 0, width: 8, height: 8, radius: 0 } } }, updatePlainBBox: function(b) { var a = this.attr; b.x = a.x; b.y = a.y; b.width = a.width; b.height = a.height }, updateTransformedBBox: function(a, b) { this.attr.matrix.transformBBox(b, this.attr.radius, a) }, updatePath: function(f, d) { var c = d.x, g = d.y, e = d.width, b = d.height, a = Math.min(d.radius, Math.abs(d.height) * 0.5, Math.abs(d.width) * 0.5); if (a === 0) { f.rect(c, g, e, b) } else { f.moveTo(c + a, g); f.arcTo(c + e, g, c + e, g + b, a); f.arcTo(c + e, g + b, c, g + b, a); f.arcTo(c, g + b, c, g, a); f.arcTo(c, g, c + a, g, a) } } }); Ext.define("Ext.draw.sprite.Image", { extend: "Ext.draw.sprite.Rect", alias: "sprite.image", type: "image", statics: { imageLoaders: {} }, inheritableStatics: { def: { processors: { src: "string" }, defaults: { src: "", width: null, height: null } } }, render: function(c, o) { var j = this, h = j.attr, n = h.matrix, a = h.src, l = h.x, k = h.y, b = h.width, m = h.height, g = Ext.draw.sprite.Image.imageLoaders[a], f, d, e; if (g && g.done) { n.toContext(o); d = g.image; o.drawImage(d, l, k, b || (d.naturalWidth || d.width) / c.devicePixelRatio, m || (d.naturalHeight || d.height) / c.devicePixelRatio) } else { if (!g) { f = new Image(); g = Ext.draw.sprite.Image.imageLoaders[a] = { image: f, done: false, pendingSprites: [j], pendingSurfaces: [c] }; f.width = b; f.height = m; f.onload = function() { if (!g.done) { g.done = true; for (e = 0; e < g.pendingSprites.length; e++) { g.pendingSprites[e].setDirty(true) } for (e in g.pendingSurfaces) { g.pendingSurfaces[e].renderFrame() } } }; f.src = a } else { Ext.Array.include(g.pendingSprites, j); Ext.Array.include(g.pendingSurfaces, c) } } } }); Ext.define("Ext.draw.sprite.Instancing", { extend: "Ext.draw.sprite.Sprite", alias: "sprite.instancing", type: "instancing", isInstancing: true, config: { template: null }, instances: null, applyTemplate: function(a) { if (!a.isSprite) { if (!a.xclass && !a.type) { a.type = "circle" } a = Ext.create(a.xclass || "sprite." + a.type, a) } a.setParent(this); return a }, updateTemplate: function(a, b) { if (b) { delete b.ownAttr } a.setSurface(this.getSurface()); a.ownAttr = a.attr; this.clearAll() }, updateSurface: function(a) { var b = this.getTemplate(); if (b) { b.setSurface(a) } }, get: function(a) { return this.instances[a] }, getCount: function() { return this.instances.length }, clearAll: function() { var a = this.getTemplate(); a.attr.children = this.instances = []; this.position = 0 }, createInstance: function(d, f, c) { var e = this.getTemplate(), b = e.attr, a = Ext.Object.chain(b); e.topModifier.prepareAttributes(a); e.attr = a; e.setAttributes(d, f, c); a.template = e; this.instances.push(a); e.attr = b; this.position++; return a }, getBBox: function() { return null }, getBBoxFor: function(b, d) { var c = this.getTemplate(), a = c.attr, e; c.attr = this.instances[b]; e = c.getBBox(d); c.attr = a; return e }, isVisible: function() { var b = this.attr, c = this.getParent(), a; a = c && c.isSurface && !b.hidden && b.globalAlpha; return !!a }, isInstanceVisible: function(c) { var e = this, d = e.getTemplate(), b = d.attr, f = e.instances, a = false; if (!Ext.isNumber(c) || c < 0 || c >= f.length || !e.isVisible()) { return a } d.attr = f[c]; a = d.isVisible(point, options); d.attr = b; return a }, render: function(b, l, d, h) { var g = this, j = g.getTemplate(), k = g.attr.matrix, c = j.attr, a = g.instances, e, f = g.position; k.toContext(l); j.preRender(b, l, d, h); j.useAttributes(l, h); for (e = 0; e < f; e++) { if (a[e].dirtyZIndex) { break } } for (e = 0; e < f; e++) { if (a[e].hidden) { continue } l.save(); j.attr = a[e]; j.useAttributes(l, h); j.render(b, l, d, h); l.restore() } j.attr = c }, setAttributesFor: function(c, e, f) { var d = this.getTemplate(), b = d.attr, a = this.instances[c]; if (!a) { return } d.attr = a; if (f) { e = Ext.apply({}, e) } else { e = d.self.def.normalize(e) } d.topModifier.pushDown(a, e); d.attr = b }, destroy: function() { var b = this, a = b.getTemplate(); b.instances = null; if (a) { a.destroy() } b.callParent() } }); Ext.define("Ext.draw.overrides.sprite.Instancing", { override: "Ext.draw.sprite.Instancing", hitTest: function(f, j) { var e = this, g = e.getTemplate(), b = g.attr, a = e.instances, d = a.length, c = 0, h = null; if (!e.isVisible()) { return h } for (; c < d; c++) { g.attr = a[c]; h = g.hitTest(f, j); if (h) { h.isInstance = true; h.template = h.sprite; h.sprite = this; h.instance = a[c]; h.index = c; return h } } g.attr = b; return h } }); Ext.define("Ext.draw.sprite.Line", { extend: "Ext.draw.sprite.Sprite", alias: "sprite.line", type: "line", inheritableStatics: { def: { processors: { fromX: "number", fromY: "number", toX: "number", toY: "number" }, defaults: { fromX: 0, fromY: 0, toX: 1, toY: 1, strokeStyle: "black" }, aliases: { x1: "fromX", y1: "fromY", x2: "toX", y2: "toY" } } }, updateLineBBox: function(b, i, s, g, r, f) { var o = this.attr, q = o.matrix, h = o.lineWidth / 2, m, l, d, c, k, j, n; if (i) { n = q.transformPoint([s, g]); s = n[0]; g = n[1]; n = q.transformPoint([r, f]); r = n[0]; f = n[1] } m = Math.min(s, r); d = Math.max(s, r); l = Math.min(g, f); c = Math.max(g, f); var t = Math.atan2(d - m, c - l), a = Math.sin(t), e = Math.cos(t), k = h * e, j = h * a; m -= k; l -= j; d += k; c += j; b.x = m; b.y = l; b.width = d - m; b.height = c - l }, updatePlainBBox: function(b) { var a = this.attr; this.updateLineBBox(b, false, a.fromX, a.fromY, a.toX, a.toY) }, updateTransformedBBox: function(b, c) { var a = this.attr; this.updateLineBBox(b, true, a.fromX, a.fromY, a.toX, a.toY) }, render: function(b, c) { var a = this.attr, d = this.attr.matrix; d.toContext(c); c.beginPath(); c.moveTo(a.fromX, a.fromY); c.lineTo(a.toX, a.toY); c.stroke() } }); Ext.define("Ext.draw.sprite.Plus", { extend: "Ext.draw.sprite.Path", alias: "sprite.plus", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "path", y: "path", size: "path" } } }, updatePath: function(d, b) { var c = b.size / 1.3, a = b.x - b.lineWidth / 2, e = b.y; d.fromSvgString("M".concat(a - c / 2, ",", e - c / 2, "l", [0, -c, c, 0, 0, c, c, 0, 0, c, -c, 0, 0, c, -c, 0, 0, -c, -c, 0, 0, -c, "z"])) } }); Ext.define("Ext.draw.sprite.Sector", { extend: "Ext.draw.sprite.Path", alias: "sprite.sector", type: "sector", inheritableStatics: { def: { processors: { centerX: "number", centerY: "number", startAngle: "number", endAngle: "number", startRho: "number", endRho: "number", margin: "number" }, aliases: { rho: "endRho" }, triggers: { centerX: "path,bbox", centerY: "path,bbox", startAngle: "path,bbox", endAngle: "path,bbox", startRho: "path,bbox", endRho: "path,bbox", margin: "path,bbox" }, defaults: { centerX: 0, centerY: 0, startAngle: 0, endAngle: 0, startRho: 0, endRho: 150, margin: 0, path: "M 0,0" } } }, getMidAngle: function() { return this.midAngle || 0 }, updatePath: function(j, h) { var g = Math.min(h.startAngle, h.endAngle), c = Math.max(h.startAngle, h.endAngle), b = this.midAngle = (g + c) * 0.5, d = h.margin, f = h.centerX, e = h.centerY, i = Math.min(h.startRho, h.endRho), a = Math.max(h.startRho, h.endRho); if (d) { f += d * Math.cos(b); e += d * Math.sin(b) } j.moveTo(f + i * Math.cos(g), e + i * Math.sin(g)); j.lineTo(f + a * Math.cos(g), e + a * Math.sin(g)); j.arc(f, e, a, g, c, false); j.lineTo(f + i * Math.cos(c), e + i * Math.sin(c)); j.arc(f, e, i, c, g, true) } }); Ext.define("Ext.draw.sprite.Square", { extend: "Ext.draw.sprite.Rect", alias: "sprite.square", inheritableStatics: { def: { processors: { size: "number" }, defaults: { size: 4 }, triggers: { size: "size" }, updaters: { size: function(a) { var c = a.size, b = a.lineWidth / 2; this.setAttributes({ x: a.x - c - b, y: a.y - c, height: 2 * c, width: 2 * c }) } } } } }); Ext.define("Ext.draw.TextMeasurer", { singleton: true, requires: ["Ext.util.TextMetrics"], measureDiv: null, measureCache: {}, precise: Ext.isIE8, measureDivTpl: { tag: "div", style: { overflow: "hidden", position: "relative", "float": "left", width: 0, height: 0 }, children: { tag: "div", style: { display: "block", position: "absolute", x: -100000, y: -100000, padding: 0, margin: 0, "z-index": -100000, "white-space": "nowrap" } } }, actualMeasureText: function(g, b) { var e = Ext.draw.TextMeasurer, f = e.measureDiv, a = 100000, c; if (!f) { var d = Ext.Element.create({ style: { overflow: "hidden", position: "relative", "float": "left", width: 0, height: 0 } }); e.measureDiv = f = Ext.Element.create({ style: { position: "absolute", x: a, y: a, "z-index": -a, "white-space": "nowrap", display: "block", padding: 0, margin: 0 } }); Ext.getBody().appendChild(d); d.appendChild(f) } if (b) { f.setStyle({ font: b, lineHeight: "normal" }) } f.setText("(" + g + ")"); c = f.getSize(); f.setText("()"); c.width -= f.getSize().width; return c }, measureTextSingleLine: function(h, d) { if (this.precise) { return this.preciseMeasureTextSingleLine(h, d) } h = h.toString(); var a = this.measureCache, g = h.split(""), c = 0, j = 0, l, b, e, f, k; if (!a[d]) { a[d] = {} } a = a[d]; if (a[h]) { return a[h] } for (e = 0, f = g.length; e < f; e++) { b = g[e]; if (!(l = a[b])) { k = this.actualMeasureText(b, d); l = a[b] = k } c += l.width; j = Math.max(j, l.height) } return a[h] = { width: c, height: j } }, preciseMeasureTextSingleLine: function(c, a) { c = c.toString(); var b = this.measureDiv || (this.measureDiv = Ext.getBody().createChild(this.measureDivTpl).down("div")); b.setStyle({ font: a || "" }); return Ext.util.TextMetrics.measure(b, c) }, measureText: function(e, b) { var h = e.split("\n"), d = h.length, f = 0, a = 0, j, c, g; if (d === 1) { return this.measureTextSingleLine(e, b) } g = []; for (c = 0; c < d; c++) { j = this.measureTextSingleLine(h[c], b); g.push(j); f += j.height; a = Math.max(a, j.width) } return { width: a, height: f, sizes: g } } }); Ext.define("Ext.draw.sprite.Text", function() { var d = { "xx-small": true, "x-small": true, small: true, medium: true, large: true, "x-large": true, "xx-large": true }; var b = { normal: true, bold: true, bolder: true, lighter: true, 100: true, 200: true, 300: true, 400: true, 500: true, 600: true, 700: true, 800: true, 900: true }; var a = { start: "start", left: "start", center: "center", middle: "center", end: "end", right: "end" }; var c = { top: "top", hanging: "hanging", middle: "middle", center: "middle", alphabetic: "alphabetic", ideographic: "ideographic", bottom: "bottom" }; return { extend: "Ext.draw.sprite.Sprite", requires: ["Ext.draw.TextMeasurer", "Ext.draw.Color"], alias: "sprite.text", type: "text", lineBreakRe: /\r?\n/g, inheritableStatics: { def: { animationProcessors: { text: "text" }, processors: { x: "number", y: "number", text: "string", fontSize: function(e) { if (Ext.isNumber(+e)) { return e + "px" } else { if (e.match(Ext.dom.Element.unitRe)) { return e } else { if (e in d) { return e } } } }, fontStyle: "enums(,italic,oblique)", fontVariant: "enums(,small-caps)", fontWeight: function(e) { if (e in b) { return String(e) } else { return "" } }, fontFamily: "string", textAlign: function(e) { return a[e] || "center" }, textBaseline: function(e) { return c[e] || "alphabetic" }, font: "string" }, aliases: { "font-size": "fontSize", "font-family": "fontFamily", "font-weight": "fontWeight", "font-variant": "fontVariant", "text-anchor": "textAlign" }, defaults: { fontStyle: "", fontVariant: "", fontWeight: "", fontSize: "10px", fontFamily: "sans-serif", font: "10px sans-serif", textBaseline: "alphabetic", textAlign: "start", strokeStyle: "rgba(0, 0, 0, 0)", fillStyle: "#000", x: 0, y: 0, text: "" }, triggers: { fontStyle: "fontX,bbox", fontVariant: "fontX,bbox", fontWeight: "fontX,bbox", fontSize: "fontX,bbox", fontFamily: "fontX,bbox", font: "font,bbox,canvas", textBaseline: "bbox", textAlign: "bbox", x: "bbox", y: "bbox", text: "bbox" }, updaters: { fontX: "makeFontShorthand", font: "parseFontShorthand" } } }, constructor: function(e) { if (e && e.font) { e = Ext.clone(e); for (var f in e) { if (f !== "font" && f.indexOf("font") === 0) { delete e[f] } } } Ext.draw.sprite.Sprite.prototype.constructor.call(this, e) }, fontValuesMap: { italic: "fontStyle", oblique: "fontStyle", "small-caps": "fontVariant", bold: "fontWeight", bolder: "fontWeight", lighter: "fontWeight", "100": "fontWeight", "200": "fontWeight", "300": "fontWeight", "400": "fontWeight", "500": "fontWeight", "600": "fontWeight", "700": "fontWeight", "800": "fontWeight", "900": "fontWeight", "xx-small": "fontSize", "x-small": "fontSize", small: "fontSize", medium: "fontSize", large: "fontSize", "x-large": "fontSize", "xx-large": "fontSize" }, makeFontShorthand: function(e) { var f = []; if (e.fontStyle) { f.push(e.fontStyle) } if (e.fontVariant) { f.push(e.fontVariant) } if (e.fontWeight) { f.push(e.fontWeight) } if (e.fontSize) { f.push(e.fontSize) } if (e.fontFamily) { f.push(e.fontFamily) } this.setAttributes({ font: f.join(" ") }, true) }, parseFontShorthand: function(j) { var m = j.font, k = m.length, l = {}, n = this.fontValuesMap, e = 0, i, g, f, h; while (e < k && i !== -1) { i = m.indexOf(" ", e); if (i < 0) { f = m.substr(e) } else { if (i > e) { f = m.substr(e, i - e) } else { continue } } g = f.indexOf("/"); if (g > 0) { f = f.substr(0, g) } else { if (g === 0) { continue } } if (f !== "normal" && f !== "inherit") { h = n[f]; if (h) { l[h] = f } else { if (f.match(Ext.dom.Element.unitRe)) { l.fontSize = f } else { l.fontFamily = m.substr(e); break } } } e = i + 1 } if (!l.fontStyle) { l.fontStyle = "" } if (!l.fontVariant) { l.fontVariant = "" } if (!l.fontWeight) { l.fontWeight = "" } this.setAttributes(l, true) }, fontProperties: { fontStyle: true, fontVariant: true, fontWeight: true, fontSize: true, fontFamily: true }, setAttributes: function(g, i, e) { var f, h; if (g && g.font) { h = {}; for (f in g) { if (!(f in this.fontProperties)) { h[f] = g[f] } } g = h } this.callParent([g, i, e]) }, getBBox: function(g) { var h = this, f = h.attr.bbox.plain, e = h.getSurface(); if (f.dirty) { h.updatePlainBBox(f); f.dirty = false } if (e.getInherited().rtl && e.getFlipRtlText()) { h.updatePlainBBox(f, true) } return h.callParent([g]) }, rtlAlignments: { start: "end", center: "center", end: "start" }, updatePlainBBox: function(k, B) { var C = this, w = C.attr, o = w.x, n = w.y, q = [], t = w.font, r = w.text, s = w.textBaseline, l = w.textAlign, u = (B && C.oldSize) ? C.oldSize : (C.oldSize = Ext.draw.TextMeasurer.measureText(r, t)), z = C.getSurface(), p = z.getInherited().rtl, v = p && z.getFlipRtlText(), h = z.getRect(), f = u.sizes, g = u.height, j = u.width, m = f ? f.length : 0, e, A = 0; switch (s) { case "hanging": case "top": break; case "ideographic": case "bottom": n -= g; break; case "alphabetic": n -= g * 0.8; break; case "middle": n -= g * 0.5; break } if (v) { o = h[2] - h[0] - o; l = C.rtlAlignments[l] } switch (l) { case "start": if (p) { for (; A < m; A++) { e = f[A].width; q.push(-(j - e)) } } break; case "end": o -= j; if (p) { break } for (; A < m; A++) { e = f[A].width; q.push(j - e) } break; case "center": o -= j * 0.5; for (; A < m; A++) { e = f[A].width; q.push((p ? -1 : 1) * (j - e) * 0.5) } break } w.textAlignOffsets = q; k.x = o; k.y = n; k.width = j; k.height = g }, setText: function(e) { this.setAttributes({ text: e }, true) }, render: function(e, q, k) { var h = this, g = h.attr, p = Ext.draw.Matrix.fly(g.matrix.elements.slice(0)), o = h.getBBox(true), s = g.textAlignOffsets, m = Ext.draw.Color.RGBA_NONE, l, j, f, r, n; if (g.text.length === 0) { return } r = g.text.split(h.lineBreakRe); n = o.height / r.length; l = g.bbox.plain.x; j = g.bbox.plain.y + n * 0.78; p.toContext(q); if (e.getInherited().rtl) { l += g.bbox.plain.width } for (f = 0; f < r.length; f++) { if (q.fillStyle !== m) { q.fillText(r[f], l + (s[f] || 0), j + n * f) } if (q.strokeStyle !== m) { q.strokeText(r[f], l + (s[f] || 0), j + n * f) } } } } }); Ext.define("Ext.draw.sprite.Tick", { extend: "Ext.draw.sprite.Line", alias: "sprite.tick", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "tick", y: "tick", size: "tick" }, updaters: { tick: function(b) { var d = b.size * 1.5, c = b.lineWidth / 2, a = b.x, e = b.y; this.setAttributes({ fromX: a - c, fromY: e - d, toX: a - c, toY: e + d }) } } } } }); Ext.define("Ext.draw.sprite.Triangle", { extend: "Ext.draw.sprite.Path", alias: "sprite.triangle", inheritableStatics: { def: { processors: { x: "number", y: "number", size: "number" }, defaults: { x: 0, y: 0, size: 4 }, triggers: { x: "path", y: "path", size: "path" } } }, updatePath: function(d, b) { var c = b.size * 2.2, a = b.x, e = b.y; d.fromSvgString("M".concat(a, ",", e, "m0-", c * 0.58, "l", c * 0.5, ",", c * 0.87, "-", c, ",0z")) } }); Ext.define("Ext.draw.gradient.Linear", { extend: "Ext.draw.gradient.Gradient", requires: ["Ext.draw.Color"], type: "linear", config: { degrees: 0, radians: 0 }, applyRadians: function(b, a) { if (Ext.isNumber(b)) { return b } return a }, applyDegrees: function(b, a) { if (Ext.isNumber(b)) { return b } return a }, updateRadians: function(a) { this.setDegrees(Ext.draw.Draw.degrees(a)) }, updateDegrees: function(a) { this.setRadians(Ext.draw.Draw.rad(a)) }, generateGradient: function(q, o) { var c = this.getRadians(), p = Math.cos(c), j = Math.sin(c), m = o.width, f = o.height, d = o.x + m * 0.5, b = o.y + f * 0.5, n = this.getStops(), g = n.length, k, a, e; if (Ext.isNumber(d + b) && f > 0 && m > 0) { a = (Math.sqrt(f * f + m * m) * Math.abs(Math.cos(c - Math.atan(f / m)))) / 2; k = q.createLinearGradient(d + p * a, b + j * a, d - p * a, b - j * a); for (e = 0; e < g; e++) { k.addColorStop(n[e].offset, n[e].color) } return k } return Ext.draw.Color.NONE } }); Ext.define("Ext.draw.gradient.Radial", { extend: "Ext.draw.gradient.Gradient", type: "radial", config: { start: { x: 0, y: 0, r: 0 }, end: { x: 0, y: 0, r: 1 } }, applyStart: function(a, b) { if (!b) { return a } var c = { x: b.x, y: b.y, r: b.r }; if ("x" in a) { c.x = a.x } else { if ("centerX" in a) { c.x = a.centerX } } if ("y" in a) { c.y = a.y } else { if ("centerY" in a) { c.y = a.centerY } } if ("r" in a) { c.r = a.r } else { if ("radius" in a) { c.r = a.radius } } return c }, applyEnd: function(b, a) { if (!a) { return b } var c = { x: a.x, y: a.y, r: a.r }; if ("x" in b) { c.x = b.x } else { if ("centerX" in b) { c.x = b.centerX } } if ("y" in b) { c.y = b.y } else { if ("centerY" in b) { c.y = b.centerY } } if ("r" in b) { c.r = b.r } else { if ("radius" in b) { c.r = b.radius } } return c }, generateGradient: function(n, m) { var a = this.getStart(), b = this.getEnd(), k = m.width * 0.5, d = m.height * 0.5, j = m.x + k, f = m.y + d, g = n.createRadialGradient(j + a.x * k, f + a.y * d, a.r * Math.max(k, d), j + b.x * k, f + b.y * d, b.r * Math.max(k, d)), l = this.getStops(), e = l.length, c; for (c = 0; c < e; c++) { g.addColorStop(l[c].offset, l[c].color) } return g } }); Ext.define("Ext.draw.Surface", { extend: "Ext.draw.SurfaceBase", xtype: "surface", requires: ["Ext.draw.sprite.*", "Ext.draw.gradient.*", "Ext.draw.sprite.AttributeDefinition", "Ext.draw.Matrix", "Ext.draw.Draw"], uses: ["Ext.draw.engine.Canvas"], devicePixelRatio: window.devicePixelRatio || window.screen.deviceXDPI / window.screen.logicalXDPI, deprecated: { "5.1.0": { statics: { methods: { stableSort: function(a) { return Ext.Array.sort(a, function(d, c) { return d.attr.zIndex - c.attr.zIndex }) } } } } }, config: { cls: Ext.baseCSSPrefix + "surface", rect: null, background: null, items: [], dirty: false, flipRtlText: false }, isSurface: true, isPendingRenderFrame: false, dirtyPredecessorCount: 0, constructor: function(a) { var b = this; b.predecessors = []; b.successors = []; b.map = {}; b.callParent([a]); b.matrix = new Ext.draw.Matrix(); b.inverseMatrix = b.matrix.inverse() }, roundPixel: function(a) { return Math.round(this.devicePixelRatio * a) / this.devicePixelRatio }, waitFor: function(a) { var b = this, c = b.predecessors; if (!Ext.Array.contains(c, a)) { c.push(a); a.successors.push(b); if (a.getDirty()) { b.dirtyPredecessorCount++ } } }, updateDirty: function(d) { var c = this.successors, e = c.length, b = 0, a; for (; b < e; b++) { a = c[b]; if (d) { a.dirtyPredecessorCount++; a.setDirty(true) } else { a.dirtyPredecessorCount--; if (a.dirtyPredecessorCount === 0 && a.isPendingRenderFrame) { a.renderFrame() } } } }, applyBackground: function(a, b) { this.setDirty(true); if (Ext.isString(a)) { a = { fillStyle: a } } return Ext.factory(a, Ext.draw.sprite.Rect, b) }, applyRect: function(a, b) { if (b && a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]) { return } if (Ext.isArray(a)) { return [a[0], a[1], a[2], a[3]] } else { if (Ext.isObject(a)) { return [a.x || a.left, a.y || a.top, a.width || (a.right - a.left), a.height || (a.bottom - a.top)] } } }, updateRect: function(i) { var h = this, c = i[0], f = i[1], g = c + i[2], a = f + i[3], e = h.getBackground(), d = h.element; d.setLocalXY(Math.floor(c), Math.floor(f)); d.setSize(Math.ceil(g - Math.floor(c)), Math.ceil(a - Math.floor(f))); if (e) { e.setAttributes({ x: 0, y: 0, width: Math.ceil(g - Math.floor(c)), height: Math.ceil(a - Math.floor(f)) }) } h.setDirty(true) }, resetTransform: function() { this.matrix.set(1, 0, 0, 1, 0, 0); this.inverseMatrix.set(1, 0, 0, 1, 0, 0); this.setDirty(true) }, get: function(a) { return this.map[a] || this.getItems()[a] }, add: function() { var g = this, e = Array.prototype.slice.call(arguments), j = Ext.isArray(e[0]), a = g.map, c = [], f, k, h, b, d; f = Ext.Array.clean(j ? e[0] : e); if (!f.length) { return c } for (b = 0, d = f.length; b < d; b++) { k = f[b]; h = null; if (k.isSprite && !a[k.getId()]) { h = k } else { if (!a[k.id]) { h = this.createItem(k) } } if (h) { a[h.getId()] = h; c.push(h); h.setParent(g); h.setSurface(g); g.onAdd(h) } } f = g.getItems(); if (f) { f.push.apply(f, c) } g.dirtyZIndex = true; g.setDirty(true); if (!j && c.length === 1) { return c[0] } else { return c } }, onAdd: Ext.emptyFn, remove: function(a, c) { var b = this, e, d; if (a) { if (a.charAt) { a = b.map[a] } if (!a || !a.isSprite) { return null } if (a.isDestroyed || a.isDestroying) { return a } e = a.getId(); d = b.map[e]; delete b.map[e]; if (c) { a.destroy() } if (!d) { return a } a.setParent(null); a.setSurface(null); Ext.Array.remove(b.getItems(), a); b.dirtyZIndex = true; b.setDirty(true) } return a || null }, removeAll: function(d) { var a = this.getItems(), b = a.length - 1, c; if (d) { for (; b >= 0; b--) { a[b].destroy() } } else { for (; b >= 0; b--) { c = a[b]; c.setParent(null); c.setSurface(null) } } a.length = 0; this.map = {}; this.dirtyZIndex = true }, applyItems: function(a) { if (this.getItems()) { this.removeAll(true) } return Ext.Array.from(this.add(a)) }, createItem: function(a) { return Ext.create(a.xclass || "sprite." + a.type, a) }, getBBox: function(f, b) { var f = Ext.Array.from(f), c = Infinity, h = -Infinity, g = Infinity, a = -Infinity, j, k, d, e; for (d = 0, e = f.length; d < e; d++) { j = f[d]; k = j.getBBox(b); if (c > k.x) { c = k.x } if (h < k.x + k.width) { h = k.x + k.width } if (g > k.y) { g = k.y } if (a < k.y + k.height) { a = k.y + k.height } } return { x: c, y: g, width: h - c, height: a - g } }, emptyRect: [0, 0, 0, 0], getEventXY: function(d) { var g = this, f = g.getInherited().rtl, c = d.getXY(), a = g.getOwnerBody(), i = a.getXY(), h = g.getRect() || g.emptyRect, j = [], b; if (f) { b = a.getWidth(); j[0] = i[0] - c[0] - h[0] + b } else { j[0] = c[0] - i[0] - h[0] } j[1] = c[1] - i[1] - h[1]; return j }, clear: Ext.emptyFn, orderByZIndex: function() { var d = this, a = d.getItems(), e = false, b, c; if (d.getDirty()) { for (b = 0, c = a.length; b < c; b++) { if (a[b].attr.dirtyZIndex) { e = true; break } } if (e) { Ext.Array.sort(a, function(g, f) { return g.attr.zIndex - f.attr.zIndex }); this.setDirty(true) } for (b = 0, c = a.length; b < c; b++) { a[b].attr.dirtyZIndex = false } } }, repaint: function() { var a = this; a.repaint = Ext.emptyFn; Ext.defer(function() { delete a.repaint; a.element.repaint() }, 1) }, renderFrame: function() { var g = this; if (!g.element) { return } if (g.dirtyPredecessorCount > 0) { g.isPendingRenderFrame = true; return } var f = g.getRect(), c = g.getBackground(), a = g.getItems(), e, b, d; if (!f) { return } g.orderByZIndex(); if (g.getDirty()) { g.clear(); g.clearTransform(); if (c) { g.renderSprite(c) } for (b = 0, d = a.length; b < d; b++) { e = a[b]; if (g.renderSprite(e) === false) { return } e.attr.textPositionCount = g.textPosition } g.setDirty(false) } }, renderSprite: Ext.emptyFn, clearTransform: Ext.emptyFn, destroy: function() { var a = this; a.removeAll(true); a.predecessors = null; a.successors = null; a.callParent() } }); Ext.define("Ext.draw.overrides.Surface", { override: "Ext.draw.Surface", hitTest: function(b, c) { var f = this, g = f.getItems(), e, d, a; c = c || Ext.draw.sprite.Sprite.defaultHitTestOptions; for (e = g.length - 1; e >= 0; e--) { d = g[e]; if (d.hitTest) { a = d.hitTest(b, c); if (a) { return a } } } return null }, hitTestEvent: function(b, a) { var c = this.getEventXY(b); return this.hitTest(c, a) } }); Ext.define("Ext.draw.engine.SvgContext", { requires: ["Ext.draw.Color"], toSave: ["strokeOpacity", "strokeStyle", "fillOpacity", "fillStyle", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "lineDash", "lineDashOffset", "miterLimit", "shadowOffsetX", "shadowOffsetY", "shadowBlur", "shadowColor", "globalCompositeOperation", "position", "fillGradient", "strokeGradient"], strokeOpacity: 1, strokeStyle: "none", fillOpacity: 1, fillStyle: "none", lineDash: [], lineDashOffset: 0, globalAlpha: 1, lineWidth: 1, lineCap: "butt", lineJoin: "miter", miterLimit: 10, shadowOffsetX: 0, shadowOffsetY: 0, shadowBlur: 0, shadowColor: "none", globalCompositeOperation: "src", urlStringRe: /^url\(#([\w\-]+)\)$/, constructor: function(a) { this.surface = a; this.state = []; this.matrix = new Ext.draw.Matrix(); this.path = null; this.clear() }, clear: function() { this.group = this.surface.mainGroup; this.position = 0; this.path = null }, getElement: function(a) { return this.surface.getSvgElement(this.group, a, this.position++) }, removeElement: function(d) { var d = Ext.fly(d), h, g, b, f, a, e, c; if (!d) { return } if (d.dom.tagName === "g") { a = d.dom.gradients; for (c in a) { a[c].destroy() } } else { h = d.getAttribute("fill"); g = d.getAttribute("stroke"); b = h && h.match(this.urlStringRe); f = g && g.match(this.urlStringRe); if (b && b[1]) { e = Ext.fly(b[1]); if (e) { e.destroy() } } if (f && f[1]) { e = Ext.fly(f[1]); if (e) { e.destroy() } } } d.destroy() }, save: function() { var c = this.toSave, e = {}, d = this.getElement("g"), b, a; for (a = 0; a < c.length; a++) { b = c[a]; if (b in this) { e[b] = this[b] } } this.position = 0; e.matrix = this.matrix.clone(); this.state.push(e); this.group = d; return d }, restore: function() { var d = this.toSave, e = this.state.pop(), c = this.group.dom.childNodes, b, a; while (c.length > this.position) { this.removeElement(c[c.length - 1]) } for (a = 0; a < d.length; a++) { b = d[a]; if (b in e) { this[b] = e[b] } else { delete this[b] } } this.setTransform.apply(this, e.matrix.elements); this.group = this.group.getParent() }, transform: function(f, b, e, g, d, c) { if (this.path) { var a = Ext.draw.Matrix.fly([f, b, e, g, d, c]).inverse(); this.path.transform(a) } this.matrix.append(f, b, e, g, d, c) }, setTransform: function(e, a, d, f, c, b) { if (this.path) { this.path.transform(this.matrix) } this.matrix.reset(); this.transform(e, a, d, f, c, b) }, scale: function(a, b) { this.transform(a, 0, 0, b, 0, 0) }, rotate: function(d) { var c = Math.cos(d), a = Math.sin(d), b = -Math.sin(d), e = Math.cos(d); this.transform(c, a, b, e, 0, 0) }, translate: function(a, b) { this.transform(1, 0, 0, 1, a, b) }, setGradientBBox: function(a) { this.bbox = a }, beginPath: function() { this.path = new Ext.draw.Path() }, moveTo: function(a, b) { if (!this.path) { this.beginPath() } this.path.moveTo(a, b); this.path.element = null }, lineTo: function(a, b) { if (!this.path) { this.beginPath() } this.path.lineTo(a, b); this.path.element = null }, rect: function(b, d, c, a) { this.moveTo(b, d); this.lineTo(b + c, d); this.lineTo(b + c, d + a); this.lineTo(b, d + a); this.closePath() }, strokeRect: function(b, d, c, a) { this.beginPath(); this.rect(b, d, c, a); this.stroke() }, fillRect: function(b, d, c, a) { this.beginPath(); this.rect(b, d, c, a); this.fill() }, closePath: function() { if (!this.path) { this.beginPath() } this.path.closePath(); this.path.element = null }, arcSvg: function(d, a, f, g, c, b, e) { if (!this.path) { this.beginPath() } this.path.arcSvg(d, a, f, g, c, b, e); this.path.element = null }, arc: function(b, f, a, d, c, e) { if (!this.path) { this.beginPath() } this.path.arc(b, f, a, d, c, e); this.path.element = null }, ellipse: function(a, h, g, f, d, c, b, e) { if (!this.path) { this.beginPath() } this.path.ellipse(a, h, g, f, d, c, b, e); this.path.element = null }, arcTo: function(b, e, a, d, g, f, c) { if (!this.path) { this.beginPath() } this.path.arcTo(b, e, a, d, g, f, c); this.path.element = null }, bezierCurveTo: function(d, f, b, e, a, c) { if (!this.path) { this.beginPath() } this.path.bezierCurveTo(d, f, b, e, a, c); this.path.element = null }, strokeText: function(d, a, e) { d = String(d); if (this.strokeStyle) { var b = this.getElement("text"), c = this.surface.getSvgElement(b, "tspan", 0); this.surface.setElementAttributes(b, { x: a, y: e, transform: this.matrix.toSvg(), stroke: this.strokeStyle, fill: "none", opacity: this.globalAlpha, "stroke-opacity": this.strokeOpacity, style: "font: " + this.font, "stroke-dasharray": this.lineDash.join(","), "stroke-dashoffset": this.lineDashOffset }); if (this.lineDash.length) { this.surface.setElementAttributes(b, { "stroke-dasharray": this.lineDash.join(","), "stroke-dashoffset": this.lineDashOffset }) } if (c.dom.firstChild) { c.dom.removeChild(c.dom.firstChild) } this.surface.setElementAttributes(c, { "alignment-baseline": "alphabetic" }); c.dom.appendChild(document.createTextNode(Ext.String.htmlDecode(d))) } }, fillText: function(d, a, e) { d = String(d); if (this.fillStyle) { var b = this.getElement("text"), c = this.surface.getSvgElement(b, "tspan", 0); this.surface.setElementAttributes(b, { x: a, y: e, transform: this.matrix.toSvg(), fill: this.fillStyle, opacity: this.globalAlpha, "fill-opacity": this.fillOpacity, style: "font: " + this.font }); if (c.dom.firstChild) { c.dom.removeChild(c.dom.firstChild) } this.surface.setElementAttributes(c, { "alignment-baseline": "alphabetic" }); c.dom.appendChild(document.createTextNode(Ext.String.htmlDecode(d))) } }, drawImage: function(c, k, i, l, e, p, n, a, g) { var f = this, d = f.getElement("image"), j = k, h = i, b = typeof l === "undefined" ? c.width : l, m = typeof e === "undefined" ? c.height : e, o = null; if (typeof g !== "undefined") { o = k + " " + i + " " + l + " " + e; j = p; h = n; b = a; m = g } d.dom.setAttributeNS("http://www.w3.org/1999/xlink", "href", c.src); f.surface.setElementAttributes(d, { viewBox: o, x: j, y: h, width: b, height: m, opacity: f.globalAlpha, transform: f.matrix.toSvg() }) }, fill: function() { if (!this.path) { return } if (this.fillStyle) { var c, a = this.fillGradient, d = this.bbox, b = this.path.element; if (!b) { c = this.path.toString(); b = this.path.element = this.getElement("path"); this.surface.setElementAttributes(b, { d: c, transform: this.matrix.toSvg() }) } this.surface.setElementAttributes(b, { fill: a && d ? a.generateGradient(this, d) : this.fillStyle, "fill-opacity": this.fillOpacity * this.globalAlpha }) } }, stroke: function() { if (!this.path) { return } if (this.strokeStyle) { var c, b = this.strokeGradient, d = this.bbox, a = this.path.element; if (!a || !this.path.svgString) { c = this.path.toString(); if (!c) { return } a = this.path.element = this.getElement("path"); this.surface.setElementAttributes(a, { fill: "none", d: c, transform: this.matrix.toSvg() }) } this.surface.setElementAttributes(a, { stroke: b && d ? b.generateGradient(this, d) : this.strokeStyle, "stroke-linecap": this.lineCap, "stroke-linejoin": this.lineJoin, "stroke-width": this.lineWidth, "stroke-opacity": this.strokeOpacity * this.globalAlpha, "stroke-dasharray": this.lineDash.join(","), "stroke-dashoffset": this.lineDashOffset }); if (this.lineDash.length) { this.surface.setElementAttributes(a, { "stroke-dasharray": this.lineDash.join(","), "stroke-dashoffset": this.lineDashOffset }) } } }, fillStroke: function(a, e) { var b = this, d = b.fillStyle, g = b.strokeStyle, c = b.fillOpacity, f = b.strokeOpacity; if (e === undefined) { e = a.transformFillStroke } if (!e) { a.inverseMatrix.toContext(b) } if (d && c !== 0) { b.fill() } if (g && f !== 0) { b.stroke() } }, appendPath: function(a) { this.path = a.clone() }, setLineDash: function(a) { this.lineDash = a }, getLineDash: function() { return this.lineDash }, createLinearGradient: function(d, g, b, e) { var f = this, c = f.surface.getNextDef("linearGradient"), a = f.group.dom.gradients || (f.group.dom.gradients = {}), h; f.surface.setElementAttributes(c, { x1: d, y1: g, x2: b, y2: e, gradientUnits: "userSpaceOnUse" }); h = new Ext.draw.engine.SvgContext.Gradient(f, f.surface, c); a[c.dom.id] = h; return h }, createRadialGradient: function(b, j, d, a, i, c) { var g = this, e = g.surface.getNextDef("radialGradient"), f = g.group.dom.gradients || (g.group.dom.gradients = {}), h; g.surface.setElementAttributes(e, { fx: b, fy: j, cx: a, cy: i, r: c, gradientUnits: "userSpaceOnUse" }); h = new Ext.draw.engine.SvgContext.Gradient(g, g.surface, e, d / c); f[e.dom.id] = h; return h } }); Ext.define("Ext.draw.engine.SvgContext.Gradient", { statics: { map: {} }, constructor: function(c, a, d, b) { var f = this.statics().map, e; e = f[d.dom.id]; if (e) { e.element = null } f[d.dom.id] = this; this.ctx = c; this.surface = a; this.element = d; this.position = 0; this.compression = b || 0 }, addColorStop: function(d, b) { var c = this.surface.getSvgElement(this.element, "stop", this.position++), a = this.compression; this.surface.setElementAttributes(c, { offset: (((1 - a) * d + a) * 100).toFixed(2) + "%", "stop-color": b, "stop-opacity": Ext.draw.Color.fly(b).a.toFixed(15) }) }, toString: function() { var a = this.element.dom.childNodes; while (a.length > this.position) { Ext.fly(a[a.length - 1]).destroy() } return "url(#" + this.element.getId() + ")" }, destroy: function() { var b = this.statics().map, a = this.element; if (a && a.dom) { delete b[a.dom.id]; a.destroy() } this.callParent() } }); Ext.define("Ext.draw.engine.Svg", { extend: "Ext.draw.Surface", requires: ["Ext.draw.engine.SvgContext"], statics: { BBoxTextCache: {} }, config: { highPrecision: false }, getElementConfig: function() { return { reference: "element", style: { position: "absolute" }, children: [{ reference: "innerElement", style: { width: "100%", height: "100%", position: "relative" }, children: [{ tag: "svg", reference: "svgElement", namespace: "http://www.w3.org/2000/svg", width: "100%", height: "100%", version: 1.1 }] }] } }, constructor: function(a) { var b = this; b.callParent([a]); b.mainGroup = b.createSvgNode("g"); b.defElement = b.createSvgNode("defs"); b.svgElement.appendChild(b.mainGroup); b.svgElement.appendChild(b.defElement); b.ctx = new Ext.draw.engine.SvgContext(b) }, createSvgNode: function(a) { var b = document.createElementNS("http://www.w3.org/2000/svg", a); return Ext.get(b) }, getSvgElement: function(d, b, a) { var c; if (d.dom.childNodes.length > a) { c = d.dom.childNodes[a]; if (c.tagName === b) { return Ext.get(c) } else { Ext.destroy(c) } } c = Ext.get(this.createSvgNode(b)); if (a === 0) { d.insertFirst(c) } else { c.insertAfter(Ext.fly(d.dom.childNodes[a - 1])) } c.cache = {}; return c }, setElementAttributes: function(d, b) { var f = d.dom, a = d.cache, c, e; for (c in b) { e = b[c]; if (a[c] !== e) { a[c] = e; f.setAttribute(c, e) } } }, getNextDef: function(a) { return this.getSvgElement(this.defElement, a, this.defPosition++) }, clearTransform: function() { var a = this; a.mainGroup.set({ transform: a.matrix.toSvg() }) }, clear: function() { this.ctx.clear(); this.defPosition = 0 }, renderSprite: function(b) { var d = this, c = d.getRect(), a = d.ctx; if (b.attr.hidden || b.attr.globalAlpha === 0) { a.save(); a.restore(); return } b.element = a.save(); b.preRender(this); b.useAttributes(a, c); if (false === b.render(this, a, [0, 0, c[2], c[3]])) { return false } b.setDirty(false); a.restore() }, flatten: function(e, b) { var c = '', f = Ext.getClassName(this), a, g, d; c += ''; for (d = 0; d < b.length; d++) { a = b[d]; if (Ext.getClassName(a) !== f) { continue } g = a.getRect(); c += ''; c += this.serializeNode(a.svgElement.dom); c += "" } c += ""; return { data: "data:image/svg+xml;utf8," + encodeURIComponent(c), type: "svg" } }, serializeNode: function(d) { var b = "", c, f, a, e; if (d.nodeType === document.TEXT_NODE) { return d.nodeValue } b += "<" + d.nodeName; if (d.attributes.length) { for (c = 0, f = d.attributes.length; c < f; c++) { a = d.attributes[c]; b += " " + a.name + '="' + a.value + '"' } } b += ">"; if (d.childNodes && d.childNodes.length) { for (c = 0, f = d.childNodes.length; c < f; c++) { e = d.childNodes[c]; b += this.serializeNode(e) } } b += ""; return b }, destroy: function() { var a = this; a.ctx.destroy(); a.mainGroup.destroy(); delete a.mainGroup; delete a.ctx; a.callParent() }, remove: function(a, b) { if (a && a.element) { if (this.ctx) { this.ctx.removeElement(a.element) } else { a.element.destroy() } a.element = null } this.callParent(arguments) } }); Ext.draw || (Ext.draw = {}); Ext.draw.engine || (Ext.draw.engine = {}); Ext.draw.engine.excanvas = true; if (!document.createElement("canvas").getContext) { (function() { var ab = Math; var n = ab.round; var l = ab.sin; var A = ab.cos; var H = ab.abs; var N = ab.sqrt; var d = 10; var f = d / 2; var z = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; function y() { return this.context_ || (this.context_ = new D(this)) } var t = Array.prototype.slice; function g(j, m, p) { var i = t.call(arguments, 2); return function() { return j.apply(m, i.concat(t.call(arguments))) } } function af(i) { return String(i).replace(/&/g, "&").replace(/"/g, """) } function Y(m, j, i) { Ext.onReady(function() { if (!m.namespaces[j]) { m.namespaces.add(j, i, "#default#VML") } }) } function R(j) { Y(j, "g_vml_", "urn:schemas-microsoft-com:vml"); Y(j, "g_o_", "urn:schemas-microsoft-com:office:office"); if (!j.styleSheets.ex_canvas_) { var i = j.createStyleSheet(); i.owningElement.id = "ex_canvas_"; i.cssText = "canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}" } } R(document); var e = { init: function(i) { var j = i || document; j.createElement("canvas"); j.attachEvent("onreadystatechange", g(this.init_, this, j)) }, init_: function(p) { var m = p.getElementsByTagName("canvas"); for (var j = 0; j < m.length; j++) { this.initElement(m[j]) } }, initElement: function(j) { if (!j.getContext) { j.getContext = y; R(j.ownerDocument); j.innerHTML = ""; j.attachEvent("onpropertychange", x); j.attachEvent("onresize", W); var i = j.attributes; if (i.width && i.width.specified) { j.style.width = i.width.nodeValue + "px" } else { j.width = j.clientWidth } if (i.height && i.height.specified) { j.style.height = i.height.nodeValue + "px" } else { j.height = j.clientHeight } } return j } }; function x(j) { var i = j.srcElement; switch (j.propertyName) { case "width": i.getContext().clearRect(); i.style.width = i.attributes.width.nodeValue + "px"; i.firstChild.style.width = i.clientWidth + "px"; break; case "height": i.getContext().clearRect(); i.style.height = i.attributes.height.nodeValue + "px"; i.firstChild.style.height = i.clientHeight + "px"; break } } function W(j) { var i = j.srcElement; if (i.firstChild) { i.firstChild.style.width = i.clientWidth + "px"; i.firstChild.style.height = i.clientHeight + "px" } } e.init(); var k = []; for (var ae = 0; ae < 16; ae++) { for (var ad = 0; ad < 16; ad++) { k[ae * 16 + ad] = ae.toString(16) + ad.toString(16) } } function B() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ] } function J(p, m) { var j = B(); for (var i = 0; i < 3; i++) { for (var ah = 0; ah < 3; ah++) { var Z = 0; for (var ag = 0; ag < 3; ag++) { Z += p[i][ag] * m[ag][ah] } j[i][ah] = Z } } return j } function v(j, i) { i.fillStyle = j.fillStyle; i.lineCap = j.lineCap; i.lineJoin = j.lineJoin; i.lineDash = j.lineDash; i.lineWidth = j.lineWidth; i.miterLimit = j.miterLimit; i.shadowBlur = j.shadowBlur; i.shadowColor = j.shadowColor; i.shadowOffsetX = j.shadowOffsetX; i.shadowOffsetY = j.shadowOffsetY; i.strokeStyle = j.strokeStyle; i.globalAlpha = j.globalAlpha; i.font = j.font; i.textAlign = j.textAlign; i.textBaseline = j.textBaseline; i.arcScaleX_ = j.arcScaleX_; i.arcScaleY_ = j.arcScaleY_; i.lineScale_ = j.lineScale_ } var b = { aliceblue: "#F0F8FF", antiquewhite: "#FAEBD7", aquamarine: "#7FFFD4", azure: "#F0FFFF", beige: "#F5F5DC", bisque: "#FFE4C4", black: "#000000", blanchedalmond: "#FFEBCD", blueviolet: "#8A2BE2", brown: "#A52A2A", burlywood: "#DEB887", cadetblue: "#5F9EA0", chartreuse: "#7FFF00", chocolate: "#D2691E", coral: "#FF7F50", cornflowerblue: "#6495ED", cornsilk: "#FFF8DC", crimson: "#DC143C", cyan: "#00FFFF", darkblue: "#00008B", darkcyan: "#008B8B", darkgoldenrod: "#B8860B", darkgray: "#A9A9A9", darkgreen: "#006400", darkgrey: "#A9A9A9", darkkhaki: "#BDB76B", darkmagenta: "#8B008B", darkolivegreen: "#556B2F", darkorange: "#FF8C00", darkorchid: "#9932CC", darkred: "#8B0000", darksalmon: "#E9967A", darkseagreen: "#8FBC8F", darkslateblue: "#483D8B", darkslategray: "#2F4F4F", darkslategrey: "#2F4F4F", darkturquoise: "#00CED1", darkviolet: "#9400D3", deeppink: "#FF1493", deepskyblue: "#00BFFF", dimgray: "#696969", dimgrey: "#696969", dodgerblue: "#1E90FF", firebrick: "#B22222", floralwhite: "#FFFAF0", forestgreen: "#228B22", gainsboro: "#DCDCDC", ghostwhite: "#F8F8FF", gold: "#FFD700", goldenrod: "#DAA520", grey: "#808080", greenyellow: "#ADFF2F", honeydew: "#F0FFF0", hotpink: "#FF69B4", indianred: "#CD5C5C", indigo: "#4B0082", ivory: "#FFFFF0", khaki: "#F0E68C", lavender: "#E6E6FA", lavenderblush: "#FFF0F5", lawngreen: "#7CFC00", lemonchiffon: "#FFFACD", lightblue: "#ADD8E6", lightcoral: "#F08080", lightcyan: "#E0FFFF", lightgoldenrodyellow: "#FAFAD2", lightgreen: "#90EE90", lightgrey: "#D3D3D3", lightpink: "#FFB6C1", lightsalmon: "#FFA07A", lightseagreen: "#20B2AA", lightskyblue: "#87CEFA", lightslategray: "#778899", lightslategrey: "#778899", lightsteelblue: "#B0C4DE", lightyellow: "#FFFFE0", limegreen: "#32CD32", linen: "#FAF0E6", magenta: "#FF00FF", mediumaquamarine: "#66CDAA", mediumblue: "#0000CD", mediumorchid: "#BA55D3", mediumpurple: "#9370DB", mediumseagreen: "#3CB371", mediumslateblue: "#7B68EE", mediumspringgreen: "#00FA9A", mediumturquoise: "#48D1CC", mediumvioletred: "#C71585", midnightblue: "#191970", mintcream: "#F5FFFA", mistyrose: "#FFE4E1", moccasin: "#FFE4B5", navajowhite: "#FFDEAD", oldlace: "#FDF5E6", olivedrab: "#6B8E23", orange: "#FFA500", orangered: "#FF4500", orchid: "#DA70D6", palegoldenrod: "#EEE8AA", palegreen: "#98FB98", paleturquoise: "#AFEEEE", palevioletred: "#DB7093", papayawhip: "#FFEFD5", peachpuff: "#FFDAB9", peru: "#CD853F", pink: "#FFC0CB", plum: "#DDA0DD", powderblue: "#B0E0E6", rosybrown: "#BC8F8F", royalblue: "#4169E1", saddlebrown: "#8B4513", salmon: "#FA8072", sandybrown: "#F4A460", seagreen: "#2E8B57", seashell: "#FFF5EE", sienna: "#A0522D", skyblue: "#87CEEB", slateblue: "#6A5ACD", slategray: "#708090", slategrey: "#708090", snow: "#FFFAFA", springgreen: "#00FF7F", steelblue: "#4682B4", tan: "#D2B48C", thistle: "#D8BFD8", tomato: "#FF6347", turquoise: "#40E0D0", violet: "#EE82EE", wheat: "#F5DEB3", whitesmoke: "#F5F5F5", yellowgreen: "#9ACD32" }; function M(j) { var p = j.indexOf("(", 3); var i = j.indexOf(")", p + 1); var m = j.substring(p + 1, i).split(","); if (m.length != 4 || j.charAt(3) != "a") { m[3] = 1 } return m } function c(i) { return parseFloat(i) / 100 } function r(j, m, i) { return Math.min(i, Math.max(m, j)) } function I(ag) { var i, ai, aj, ah, ak, Z; ah = parseFloat(ag[0]) / 360 % 360; if (ah < 0) { ah++ } ak = r(c(ag[1]), 0, 1); Z = r(c(ag[2]), 0, 1); if (ak == 0) { i = ai = aj = Z } else { var j = Z < 0.5 ? Z * (1 + ak) : Z + ak - Z * ak; var m = 2 * Z - j; i = a(m, j, ah + 1 / 3); ai = a(m, j, ah); aj = a(m, j, ah - 1 / 3) } return "#" + k[Math.floor(i * 255)] + k[Math.floor(ai * 255)] + k[Math.floor(aj * 255)] } function a(j, i, m) { if (m < 0) { m++ } if (m > 1) { m-- } if (6 * m < 1) { return j + (i - j) * 6 * m } else { if (2 * m < 1) { return i } else { if (3 * m < 2) { return j + (i - j) * (2 / 3 - m) * 6 } else { return j } } } } var C = {}; function F(j) { if (j in C) { return C[j] } var ag, Z = 1; j = String(j); if (j.charAt(0) == "#") { ag = j } else { if (/^rgb/.test(j)) { var p = M(j); var ag = "#", ah; for (var m = 0; m < 3; m++) { if (p[m].indexOf("%") != -1) { ah = Math.floor(c(p[m]) * 255) } else { ah = +p[m] } ag += k[r(ah, 0, 255)] } Z = +p[3] } else { if (/^hsl/.test(j)) { var p = M(j); ag = I(p); Z = p[3] } else { ag = b[j] || j } } } return C[j] = { color: ag, alpha: Z } } var o = { style: "normal", variant: "normal", weight: "normal", size: 10, family: "sans-serif" }; var L = {}; function E(i) { if (L[i]) { return L[i] } var p = document.createElement("div"); var m = p.style; try { m.font = i } catch (j) {} return L[i] = { style: m.fontStyle || o.style, variant: m.fontVariant || o.variant, weight: m.fontWeight || o.weight, size: m.fontSize || o.size, family: m.fontFamily || o.family } } function u(m, j) { var i = {}; for (var ah in m) { i[ah] = m[ah] } var ag = parseFloat(j.currentStyle.fontSize), Z = parseFloat(m.size); if (typeof m.size == "number") { i.size = m.size } else { if (m.size.indexOf("px") != -1) { i.size = Z } else { if (m.size.indexOf("em") != -1) { i.size = ag * Z } else { if (m.size.indexOf("%") != -1) { i.size = (ag / 100) * Z } else { if (m.size.indexOf("pt") != -1) { i.size = Z / 0.75 } else { i.size = ag } } } } } i.size *= 0.981; return i } function ac(i) { return i.style + " " + i.variant + " " + i.weight + " " + i.size + "px " + i.family } var s = { butt: "flat", round: "round" }; function S(i) { return s[i] || "square" } function D(i) { this.m_ = B(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; this.strokeStyle = "#000"; this.fillStyle = "#000"; this.lineWidth = 1; this.lineJoin = "miter"; this.lineDash = []; this.lineCap = "butt"; this.miterLimit = d * 1; this.globalAlpha = 1; this.font = "10px sans-serif"; this.textAlign = "left"; this.textBaseline = "alphabetic"; this.canvas = i; var m = "width:" + i.clientWidth + "px;height:" + i.clientHeight + "px;overflow:hidden;position:absolute"; var j = i.ownerDocument.createElement("div"); j.style.cssText = m; i.appendChild(j); var p = j.cloneNode(false); p.style.backgroundColor = "red"; p.style.filter = "alpha(opacity=0)"; i.appendChild(p); this.element_ = j; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1 } var q = D.prototype; q.clearRect = function() { if (this.textMeasureEl_) { this.textMeasureEl_.removeNode(true); this.textMeasureEl_ = null } this.element_.innerHTML = "" }; q.beginPath = function() { this.currentPath_ = [] }; q.moveTo = function(j, i) { var m = V(this, j, i); this.currentPath_.push({ type: "moveTo", x: m.x, y: m.y }); this.currentX_ = m.x; this.currentY_ = m.y }; q.lineTo = function(j, i) { var m = V(this, j, i); this.currentPath_.push({ type: "lineTo", x: m.x, y: m.y }); this.currentX_ = m.x; this.currentY_ = m.y }; q.bezierCurveTo = function(m, j, ak, aj, ai, ag) { var i = V(this, ai, ag); var ah = V(this, m, j); var Z = V(this, ak, aj); K(this, ah, Z, i) }; function K(i, Z, m, j) { i.currentPath_.push({ type: "bezierCurveTo", cp1x: Z.x, cp1y: Z.y, cp2x: m.x, cp2y: m.y, x: j.x, y: j.y }); i.currentX_ = j.x; i.currentY_ = j.y } q.quadraticCurveTo = function(ai, m, j, i) { var ah = V(this, ai, m); var ag = V(this, j, i); var aj = { x: this.currentX_ + 2 / 3 * (ah.x - this.currentX_), y: this.currentY_ + 2 / 3 * (ah.y - this.currentY_) }; var Z = { x: aj.x + (ag.x - this.currentX_) / 3, y: aj.y + (ag.y - this.currentY_) / 3 }; K(this, aj, Z, ag) }; q.arc = function(al, aj, ak, ag, j, m) { ak *= d; var ap = m ? "at" : "wa"; var am = al + A(ag) * ak - f; var ao = aj + l(ag) * ak - f; var i = al + A(j) * ak - f; var an = aj + l(j) * ak - f; if (am == i && !m) { am += 0.125 } var Z = V(this, al, aj); var ai = V(this, am, ao); var ah = V(this, i, an); this.currentPath_.push({ type: ap, x: Z.x, y: Z.y, radius: ak, xStart: ai.x, yStart: ai.y, xEnd: ah.x, yEnd: ah.y }) }; q.rect = function(m, j, i, p) { this.moveTo(m, j); this.lineTo(m + i, j); this.lineTo(m + i, j + p); this.lineTo(m, j + p); this.closePath() }; q.strokeRect = function(m, j, i, p) { var Z = this.currentPath_; this.beginPath(); this.moveTo(m, j); this.lineTo(m + i, j); this.lineTo(m + i, j + p); this.lineTo(m, j + p); this.closePath(); this.stroke(); this.currentPath_ = Z }; q.fillRect = function(m, j, i, p) { var Z = this.currentPath_; this.beginPath(); this.moveTo(m, j); this.lineTo(m + i, j); this.lineTo(m + i, j + p); this.lineTo(m, j + p); this.closePath(); this.fill(); this.currentPath_ = Z }; q.createLinearGradient = function(j, p, i, m) { var Z = new U("gradient"); Z.x0_ = j; Z.y0_ = p; Z.x1_ = i; Z.y1_ = m; return Z }; q.createRadialGradient = function(p, ag, m, j, Z, i) { var ah = new U("gradientradial"); ah.x0_ = p; ah.y0_ = ag; ah.r0_ = m; ah.x1_ = j; ah.y1_ = Z; ah.r1_ = i; return ah }; q.drawImage = function(an, j) { var ah, Z, aj, ar, al, ak, ao, av; var ai = an.runtimeStyle.width; var am = an.runtimeStyle.height; an.runtimeStyle.width = "auto"; an.runtimeStyle.height = "auto"; var ag = an.width; var aq = an.height; an.runtimeStyle.width = ai; an.runtimeStyle.height = am; if (arguments.length == 3) { ah = arguments[1]; Z = arguments[2]; al = ak = 0; ao = aj = ag; av = ar = aq } else { if (arguments.length == 5) { ah = arguments[1]; Z = arguments[2]; aj = arguments[3]; ar = arguments[4]; al = ak = 0; ao = ag; av = aq } else { if (arguments.length == 9) { al = arguments[1]; ak = arguments[2]; ao = arguments[3]; av = arguments[4]; ah = arguments[5]; Z = arguments[6]; aj = arguments[7]; ar = arguments[8] } else { throw Error("Invalid number of arguments") } } } var au = V(this, ah, Z); var at = []; var i = 10; var p = 10; var ap = this.m_; at.push(" ', '", ""); this.element_.insertAdjacentHTML("BeforeEnd", at.join("")) }; q.setLineDash = function(i) { if (i.length === 1) { i = i.slice(); i[1] = i[0] } this.lineDash = i }; q.getLineDash = function() { return this.lineDash }; q.stroke = function(ak) { var ai = []; var m = 10; var al = 10; ai.push(" aj.x) { aj.x = j.x } if (Z.y == null || j.y < Z.y) { Z.y = j.y } if (aj.y == null || j.y > aj.y) { aj.y = j.y } } } ai.push(' ">'); if (!ak) { w(this, ai) } else { G(this, ai, Z, aj) } ai.push(""); this.element_.insertAdjacentHTML("beforeEnd", ai.join("")) }; function w(m, ag) { var j = F(m.strokeStyle); var p = j.color; var Z = j.alpha * m.globalAlpha; var i = m.lineScale_ * m.lineWidth; if (i < 1) { Z *= i } ag.push("') } function G(aq, ai, aK, ar) { var aj = aq.fillStyle; var aB = aq.arcScaleX_; var aA = aq.arcScaleY_; var j = ar.x - aK.x; var p = ar.y - aK.y; if (aj instanceof U) { var an = 0; var aF = { x: 0, y: 0 }; var ax = 0; var am = 1; if (aj.type_ == "gradient") { var al = aj.x0_ / aB; var m = aj.y0_ / aA; var ak = aj.x1_ / aB; var aM = aj.y1_ / aA; var aJ = V(aq, al, m); var aI = V(aq, ak, aM); var ag = aI.x - aJ.x; var Z = aI.y - aJ.y; an = Math.atan2(ag, Z) * 180 / Math.PI; if (an < 0) { an += 360 } if (an < 0.000001) { an = 0 } } else { var aJ = V(aq, aj.x0_, aj.y0_); aF = { x: (aJ.x - aK.x) / j, y: (aJ.y - aK.y) / p }; j /= aB * d; p /= aA * d; var aD = ab.max(j, p); ax = 2 * aj.r0_ / aD; am = 2 * aj.r1_ / aD - ax } var av = aj.colors_; av.sort(function(aN, i) { return aN.offset - i.offset }); var ap = av.length; var au = av[0].color; var at = av[ap - 1].color; var az = av[0].alpha * aq.globalAlpha; var ay = av[ap - 1].alpha * aq.globalAlpha; var aE = []; for (var aH = 0; aH < ap; aH++) { var ao = av[aH]; aE.push(ao.offset * am + ax + " " + ao.color) } ai.push('') } else { if (aj instanceof T) { if (j && p) { var ah = -aK.x; var aC = -aK.y; ai.push("') } } else { var aL = F(aq.fillStyle); var aw = aL.color; var aG = aL.alpha * aq.globalAlpha; ai.push('') } } } q.fill = function() { this.$stroke(true) }; q.closePath = function() { this.currentPath_.push({ type: "close" }) }; function V(j, Z, p) { var i = j.m_; return { x: d * (Z * i[0][0] + p * i[1][0] + i[2][0]) - f, y: d * (Z * i[0][1] + p * i[1][1] + i[2][1]) - f } } q.save = function() { var i = {}; v(this, i); this.aStack_.push(i); this.mStack_.push(this.m_); this.m_ = J(B(), this.m_) }; q.restore = function() { if (this.aStack_.length) { v(this.aStack_.pop(), this); this.m_ = this.mStack_.pop() } }; function h(i) { return isFinite(i[0][0]) && isFinite(i[0][1]) && isFinite(i[1][0]) && isFinite(i[1][1]) && isFinite(i[2][0]) && isFinite(i[2][1]) } function aa(j, i, p) { if (!h(i)) { return } j.m_ = i; if (p) { var Z = i[0][0] * i[1][1] - i[0][1] * i[1][0]; j.lineScale_ = N(H(Z)) } } q.translate = function(m, j) { var i = [ [1, 0, 0], [0, 1, 0], [m, j, 1] ]; aa(this, J(i, this.m_), false) }; q.rotate = function(j) { var p = A(j); var m = l(j); var i = [ [p, m, 0], [-m, p, 0], [0, 0, 1] ]; aa(this, J(i, this.m_), false) }; q.scale = function(m, j) { this.arcScaleX_ *= m; this.arcScaleY_ *= j; var i = [ [m, 0, 0], [0, j, 0], [0, 0, 1] ]; aa(this, J(i, this.m_), true) }; q.transform = function(Z, p, ah, ag, j, i) { var m = [ [Z, p, 0], [ah, ag, 0], [j, i, 1] ]; aa(this, J(m, this.m_), true) }; q.setTransform = function(ag, Z, ai, ah, p, j) { var i = [ [ag, Z, 0], [ai, ah, 0], [p, j, 1] ]; aa(this, i, true) }; q.drawText_ = function(am, ak, aj, ap, ai) { var ao = this.m_, at = 1000, j = 0, ar = at, ah = { x: 0, y: 0 }, ag = []; var i = u(E(this.font), this.element_); var p = ac(i); var au = this.element_.currentStyle; var Z = this.textAlign.toLowerCase(); switch (Z) { case "left": case "center": case "right": break; case "end": Z = au.direction == "ltr" ? "right" : "left"; break; case "start": Z = au.direction == "rtl" ? "right" : "left"; break; default: Z = "left" } switch (this.textBaseline) { case "hanging": case "top": ah.y = i.size / 1.75; break; case "middle": break; default: case null: case "alphabetic": case "ideographic": case "bottom": ah.y = -i.size / 3; break } switch (Z) { case "right": j = at; ar = 0.05; break; case "center": j = ar = at / 2; break } var aq = V(this, ak + ah.x, aj + ah.y); ag.push(''); if (ai) { w(this, ag) } else { G(this, ag, { x: -j, y: 0 }, { x: ar, y: i.size }) } var an = ao[0][0].toFixed(3) + "," + ao[1][0].toFixed(3) + "," + ao[0][1].toFixed(3) + "," + ao[1][1].toFixed(3) + ",0,0"; var al = n(aq.x / d) + "," + n(aq.y / d); ag.push('', '', ''); this.element_.insertAdjacentHTML("beforeEnd", ag.join("")) }; q.fillText = function(m, i, p, j) { this.drawText_(m, i, p, j, false) }; q.strokeText = function(m, i, p, j) { this.drawText_(m, i, p, j, true) }; q.measureText = function(m) { if (!this.textMeasureEl_) { var i = ''; this.element_.insertAdjacentHTML("beforeEnd", i); this.textMeasureEl_ = this.element_.lastChild } var j = this.element_.ownerDocument; this.textMeasureEl_.innerHTML = ""; this.textMeasureEl_.style.font = this.font; this.textMeasureEl_.appendChild(j.createTextNode(m)); return { width: this.textMeasureEl_.offsetWidth } }; q.clip = function() {}; q.arcTo = function() {}; q.createPattern = function(j, i) { return new T(j, i) }; function U(i) { this.type_ = i; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = [] } U.prototype.addColorStop = function(j, i) { i = F(i); this.colors_.push({ offset: j, color: i.color, alpha: i.alpha }) }; function T(j, i) { Q(j); switch (i) { case "repeat": case null: case "": this.repetition_ = "repeat"; break; case "repeat-x": case "repeat-y": case "no-repeat": this.repetition_ = i; break; default: O("SYNTAX_ERR") } this.src_ = j.src; this.width_ = j.width; this.height_ = j.height } function O(i) { throw new P(i) } function Q(i) { if (!i || i.nodeType != 1 || i.tagName != "IMG") { O("TYPE_MISMATCH_ERR") } if (i.readyState != "complete") { O("INVALID_STATE_ERR") } } function P(i) { this.code = this[i]; this.message = i + ": DOM Exception " + this.code } var X = P.prototype = new Error(); X.INDEX_SIZE_ERR = 1; X.DOMSTRING_SIZE_ERR = 2; X.HIERARCHY_REQUEST_ERR = 3; X.WRONG_DOCUMENT_ERR = 4; X.INVALID_CHARACTER_ERR = 5; X.NO_DATA_ALLOWED_ERR = 6; X.NO_MODIFICATION_ALLOWED_ERR = 7; X.NOT_FOUND_ERR = 8; X.NOT_SUPPORTED_ERR = 9; X.INUSE_ATTRIBUTE_ERR = 10; X.INVALID_STATE_ERR = 11; X.SYNTAX_ERR = 12; X.INVALID_MODIFICATION_ERR = 13; X.NAMESPACE_ERR = 14; X.INVALID_ACCESS_ERR = 15; X.VALIDATION_ERR = 16; X.TYPE_MISMATCH_ERR = 17; G_vmlCanvasManager = e; CanvasRenderingContext2D = D; CanvasGradient = U; CanvasPattern = T; DOMException = P })() } Ext.define("Ext.draw.engine.Canvas", { extend: "Ext.draw.Surface", requires: ["Ext.draw.engine.excanvas", "Ext.draw.Animator", "Ext.draw.Color"], config: { highPrecision: false }, statics: { contextOverrides: { setGradientBBox: function(a) { this.bbox = a }, fill: function() { var c = this.fillStyle, a = this.fillGradient, b = this.fillOpacity, d = this.globalAlpha, e = this.bbox; if (c !== Ext.draw.Color.RGBA_NONE && b !== 0) { if (a && e) { this.fillStyle = a.generateGradient(this, e) } if (b !== 1) { this.globalAlpha = d * b } this.$fill(); if (b !== 1) { this.globalAlpha = d } if (a && e) { this.fillStyle = c } } }, stroke: function() { var e = this.strokeStyle, c = this.strokeGradient, a = this.strokeOpacity, b = this.globalAlpha, d = this.bbox; if (e !== Ext.draw.Color.RGBA_NONE && a !== 0) { if (c && d) { this.strokeStyle = c.generateGradient(this, d) } if (a !== 1) { this.globalAlpha = b * a } this.$stroke(); if (a !== 1) { this.globalAlpha = b } if (c && d) { this.strokeStyle = e } } }, fillStroke: function(d, e) { var j = this, i = this.fillStyle, h = this.fillOpacity, f = this.strokeStyle, c = this.strokeOpacity, b = j.shadowColor, a = j.shadowBlur, g = Ext.draw.Color.RGBA_NONE; if (e === undefined) { e = d.transformFillStroke } if (!e) { d.inverseMatrix.toContext(j) } if (i !== g && h !== 0) { j.fill(); j.shadowColor = g; j.shadowBlur = 0 } if (f !== g && c !== 0) { j.stroke() } j.shadowColor = b; j.shadowBlur = a }, setLineDash: function(a) { if (this.$setLineDash) { this.$setLineDash(a) } }, getLineDash: function() { if (this.$getLineDash) { return this.$getLineDash() } }, ellipse: function(g, e, c, a, j, b, f, d) { var i = Math.cos(j), h = Math.sin(j); this.transform(i * c, h * c, -h * a, i * a, g, e); this.arc(0, 0, 1, b, f, d); this.transform(i / c, -h / a, h / c, i / a, -(i * g + h * e) / c, (h * g - i * e) / a) }, appendPath: function(f) { var e = this, c = 0, b = 0, a = f.commands, g = f.params, d = a.length; e.beginPath(); for (; c < d; c++) { switch (a[c]) { case "M": e.moveTo(g[b], g[b + 1]); b += 2; break; case "L": e.lineTo(g[b], g[b + 1]); b += 2; break; case "C": e.bezierCurveTo(g[b], g[b + 1], g[b + 2], g[b + 3], g[b + 4], g[b + 5]); b += 6; break; case "Z": e.closePath(); break } } }, save: function() { var c = this.toSave, d = c.length, e = d && {}, b = 0, a; for (; b < d; b++) { a = c[b]; if (a in this) { e[a] = this[a] } } this.state.push(e); this.$save() }, restore: function() { var b = this.state.pop(), a; if (b) { for (a in b) { this[a] = b[a] } } this.$restore() } } }, splitThreshold: 3000, toSave: ["fillGradient", "strokeGradient"], element: { reference: "element", style: { position: "absolute" }, children: [{ reference: "innerElement", style: { width: "100%", height: "100%", position: "relative" } }] }, createCanvas: function() { var c = Ext.Element.create({ tag: "canvas", cls: Ext.baseCSSPrefix + "surface-canvas" }); window.G_vmlCanvasManager && G_vmlCanvasManager.initElement(c.dom); var d = Ext.draw.engine.Canvas.contextOverrides, a = c.dom.getContext("2d"), b; if (a.ellipse) { delete d.ellipse } a.state = []; a.toSave = this.toSave; for (b in d) { a["$" + b] = a[b] } Ext.apply(a, d); if (this.getHighPrecision()) { this.enablePrecisionCompensation(a) } else { this.disablePrecisionCompensation(a) } this.innerElement.appendChild(c); this.canvases.push(c); this.contexts.push(a) }, updateHighPrecision: function(d) { var e = this.contexts, c = e.length, b, a; for (b = 0; b < c; b++) { a = e[b]; if (d) { this.enablePrecisionCompensation(a) } else { this.disablePrecisionCompensation(a) } } }, precisionNames: ["rect", "fillRect", "strokeRect", "clearRect", "moveTo", "lineTo", "arc", "arcTo", "save", "restore", "updatePrecisionCompensate", "setTransform", "transform", "scale", "translate", "rotate", "quadraticCurveTo", "bezierCurveTo", "createLinearGradient", "createRadialGradient", "fillText", "strokeText", "drawImage"], disablePrecisionCompensation: function(b) { var a = Ext.draw.engine.Canvas.contextOverrides, f = this.precisionNames, e = f.length, d, c; for (d = 0; d < e; d++) { c = f[d]; if (!(c in a)) { delete b[c] } } this.setDirty(true) }, enablePrecisionCompensation: function(j) { var c = this, a = 1, g = 1, l = 0, k = 0, i = new Ext.draw.Matrix(), b = [], e = {}, d = Ext.draw.engine.Canvas.contextOverrides, h = j.constructor.prototype; var f = { toSave: c.toSave, rect: function(m, p, n, o) { return h.rect.call(this, m * a + l, p * g + k, n * a, o * g) }, fillRect: function(m, p, n, o) { this.updatePrecisionCompensateRect(); h.fillRect.call(this, m * a + l, p * g + k, n * a, o * g); this.updatePrecisionCompensate() }, strokeRect: function(m, p, n, o) { this.updatePrecisionCompensateRect(); h.strokeRect.call(this, m * a + l, p * g + k, n * a, o * g); this.updatePrecisionCompensate() }, clearRect: function(m, p, n, o) { return h.clearRect.call(this, m * a + l, p * g + k, n * a, o * g) }, moveTo: function(m, n) { return h.moveTo.call(this, m * a + l, n * g + k) }, lineTo: function(m, n) { return h.lineTo.call(this, m * a + l, n * g + k) }, arc: function(n, r, m, p, o, q) { this.updatePrecisionCompensateRect(); h.arc.call(this, n * a + l, r * a + k, m * a, p, o, q); this.updatePrecisionCompensate() }, arcTo: function(o, q, n, p, m) { this.updatePrecisionCompensateRect(); h.arcTo.call(this, o * a + l, q * g + k, n * a + l, p * g + k, m * a); this.updatePrecisionCompensate() }, save: function() { b.push(i); i = i.clone(); d.save.call(this); h.save.call(this) }, restore: function() { i = b.pop(); d.restore.call(this); h.restore.call(this); this.updatePrecisionCompensate() }, updatePrecisionCompensate: function() { i.precisionCompensate(c.devicePixelRatio, e); a = e.xx; g = e.yy; l = e.dx; k = e.dy; h.setTransform.call(this, c.devicePixelRatio, e.b, e.c, e.d, 0, 0) }, updatePrecisionCompensateRect: function() { i.precisionCompensateRect(c.devicePixelRatio, e); a = e.xx; g = e.yy; l = e.dx; k = e.dy; h.setTransform.call(this, c.devicePixelRatio, e.b, e.c, e.d, 0, 0) }, setTransform: function(q, o, n, m, r, p) { i.set(q, o, n, m, r, p); this.updatePrecisionCompensate() }, transform: function(q, o, n, m, r, p) { i.append(q, o, n, m, r, p); this.updatePrecisionCompensate() }, scale: function(n, m) { this.transform(n, 0, 0, m, 0, 0) }, translate: function(n, m) { this.transform(1, 0, 0, 1, n, m) }, rotate: function(o) { var n = Math.cos(o), m = Math.sin(o); this.transform(n, m, -m, n, 0, 0) }, quadraticCurveTo: function(n, p, m, o) { h.quadraticCurveTo.call(this, n * a + l, p * g + k, m * a + l, o * g + k) }, bezierCurveTo: function(r, p, o, n, m, q) { h.bezierCurveTo.call(this, r * a + l, p * g + k, o * a + l, n * g + k, m * a + l, q * g + k) }, createLinearGradient: function(n, p, m, o) { this.updatePrecisionCompensateRect(); var q = h.createLinearGradient.call(this, n * a + l, p * g + k, m * a + l, o * g + k); this.updatePrecisionCompensate(); return q }, createRadialGradient: function(p, r, o, n, q, m) { this.updatePrecisionCompensateRect(); var s = h.createLinearGradient.call(this, p * a + l, r * a + k, o * a, n * a + l, q * a + k, m * a); this.updatePrecisionCompensate(); return s }, fillText: function(o, m, p, n) { h.setTransform.apply(this, i.elements); if (typeof n === "undefined") { h.fillText.call(this, o, m, p) } else { h.fillText.call(this, o, m, p, n) } this.updatePrecisionCompensate() }, strokeText: function(o, m, p, n) { h.setTransform.apply(this, i.elements); if (typeof n === "undefined") { h.strokeText.call(this, o, m, p) } else { h.strokeText.call(this, o, m, p, n) } this.updatePrecisionCompensate() }, fill: function() { var m = this.fillGradient, n = this.bbox; this.updatePrecisionCompensateRect(); if (m && n) { this.fillStyle = m.generateGradient(this, n) } h.fill.call(this); this.updatePrecisionCompensate() }, stroke: function() { var m = this.strokeGradient, n = this.bbox; this.updatePrecisionCompensateRect(); if (m && n) { this.strokeStyle = m.generateGradient(this, n) } h.stroke.call(this); this.updatePrecisionCompensate() }, drawImage: function(u, s, r, q, p, o, n, m, t) { switch (arguments.length) { case 3: return h.drawImage.call(this, u, s * a + l, r * g + k); case 5: return h.drawImage.call(this, u, s * a + l, r * g + k, q * a, p * g); case 9: return h.drawImage.call(this, u, s, r, q, p, o * a + l, n * g * k, m * a, t * g) } } }; Ext.apply(j, f); this.setDirty(true) }, updateRect: function(a) { this.callParent([a]); var C = this, p = Math.floor(a[0]), e = Math.floor(a[1]), g = Math.ceil(a[0] + a[2]), B = Math.ceil(a[1] + a[3]), u = C.devicePixelRatio, D = C.canvases, d = g - p, y = B - e, n = Math.round(C.splitThreshold / u), c = C.xSplits = Math.ceil(d / n), f = C.ySplits = Math.ceil(y / n), v, s, q, A, z, x, o, m; for (s = 0, z = 0; s < f; s++, z += n) { for (v = 0, A = 0; v < c; v++, A += n) { q = s * c + v; if (q >= D.length) { C.createCanvas() } x = D[q].dom; x.style.left = A + "px"; x.style.top = z + "px"; m = Math.min(n, y - z); if (m * u !== x.height) { x.height = m * u; x.style.height = m + "px" } o = Math.min(n, d - A); if (o * u !== x.width) { x.width = o * u; x.style.width = o + "px" } C.applyDefaults(C.contexts[q]) } } for (q += 1; q < D.length; q++) { D[q].destroy() } C.activeCanvases = c * f; D.length = C.activeCanvases; C.clear() }, clearTransform: function() { var f = this, a = f.xSplits, g = f.ySplits, d = f.contexts, h = f.splitThreshold, l = f.devicePixelRatio, e, c, b, m; for (e = 0; e < a; e++) { for (c = 0; c < g; c++) { b = c * a + e; m = d[b]; m.translate(-h * e, -h * c); m.scale(l, l); f.matrix.toContext(m) } } }, renderSprite: function(q) { var C = this, b = C.getRect(), e = C.matrix, g = q.getParent(), v = Ext.draw.Matrix.fly([1, 0, 0, 1, 0, 0]), p = C.splitThreshold / C.devicePixelRatio, c = C.xSplits, m = C.ySplits, A, z, s, a, r, o, d = 0, B, n = 0, f, l = b[2], y = b[3], x, u, t; while (g && (g !== C)) { v.prependMatrix(g.matrix || g.attr && g.attr.matrix); g = g.getParent() } v.prependMatrix(e); a = q.getBBox(); if (a) { a = v.transformBBox(a) } q.preRender(C); if (q.attr.hidden || q.attr.globalAlpha === 0) { q.setDirty(false); return } for (u = 0, z = 0; u < m; u++, z += p) { for (x = 0, A = 0; x < c; x++, A += p) { t = u * c + x; s = C.contexts[t]; r = Math.min(p, l - A); o = Math.min(p, y - z); d = A; B = d + r; n = z; f = n + o; if (a) { if (a.x > B || a.x + a.width < d || a.y > f || a.y + a.height < n) { continue } } s.save(); q.useAttributes(s, b); if (false === q.render(C, s, [d, n, r, o], b)) { return false } s.restore() } } q.setDirty(false) }, flatten: function(n, a) { var k = document.createElement("canvas"), f = Ext.getClassName(this), g = this.devicePixelRatio, l = k.getContext("2d"), b, c, h, e, d, m; k.width = Math.ceil(n.width * g); k.height = Math.ceil(n.height * g); for (e = 0; e < a.length; e++) { b = a[e]; if (Ext.getClassName(b) !== f) { continue } h = b.getRect(); for (d = 0; d < b.canvases.length; d++) { c = b.canvases[d]; m = c.getOffsetsTo(c.getParent()); l.drawImage(c.dom, (h[0] + m[0]) * g, (h[1] + m[1]) * g) } } return { data: k.toDataURL(), type: "png" } }, applyDefaults: function(a) { var b = Ext.draw.Color.RGBA_NONE; a.strokeStyle = b; a.fillStyle = b; a.textAlign = "start"; a.textBaseline = "alphabetic"; a.miterLimit = 1 }, clear: function() { var d = this, e = d.activeCanvases, c, b, a; for (c = 0; c < e; c++) { b = d.canvases[c].dom; a = d.contexts[c]; a.setTransform(1, 0, 0, 1, 0, 0); a.clearRect(0, 0, b.width, b.height) } d.setDirty(true) }, destroy: function() { var c = this, a, b = c.canvases.length; for (a = 0; a < b; a++) { c.contexts[a] = null; c.canvases[a].destroy(); c.canvases[a] = null } delete c.contexts; delete c.canvases; c.callParent() }, privates: { initElement: function() { var a = this; a.callParent(); a.canvases = []; a.contexts = []; a.activeCanvases = (a.xSplits = 0) * (a.ySplits = 0) } } }, function() { var c = this, b = c.prototype, a = 10000000000; if (Ext.os.is.Android4 && Ext.browser.is.Chrome) { a = 3000 } else { if (Ext.is.iOS) { a = 2200 } } b.splitThreshold = a }); Ext.define("Ext.draw.Container", { extend: "Ext.draw.ContainerBase", alternateClassName: "Ext.draw.Component", xtype: "draw", defaultType: "surface", isDrawContainer: true, requires: ["Ext.draw.Surface", "Ext.draw.engine.Svg", "Ext.draw.engine.Canvas", "Ext.draw.gradient.GradientDefinition"], engine: "Ext.draw.engine.Canvas", config: { cls: Ext.baseCSSPrefix + "draw-container", resizeHandler: null, sprites: null, gradients: [] }, defaultDownloadServerUrl: "http://svg.sencha.io", supportedFormats: ["png", "pdf", "jpeg", "gif"], supportedOptions: { version: Ext.isNumber, data: Ext.isString, format: function(a) { return Ext.Array.indexOf(this.supportedFormats, a) >= 0 }, filename: Ext.isString, width: Ext.isNumber, height: Ext.isNumber, scale: Ext.isNumber, pdf: Ext.isObject, jpeg: Ext.isObject }, initAnimator: function() { this.frameCallbackId = Ext.draw.Animator.addFrameCallback("renderFrame", this) }, applyGradients: function(b) { var a = [], c, f, d, e; if (!Ext.isArray(b)) { return a } for (c = 0, f = b.length; c < f; c++) { d = b[c]; if (!Ext.isObject(d)) { continue } if (typeof d.type !== "string") { d.type = "linear" } if (d.angle) { d.degrees = d.angle; delete d.angle } if (Ext.isObject(d.stops)) { d.stops = (function(i) { var g = [], h; for (e in i) { h = i[e]; h.offset = e / 100; g.push(h) } return g })(d.stops) } a.push(d) } Ext.draw.gradient.GradientDefinition.add(a); return a }, applySprites: function(f) { if (!f) { return } f = Ext.Array.from(f); var e = f.length, b = [], d, a, c; for (d = 0; d < e; d++) { c = f[d]; a = c.surface; if (!(a && a.isSurface)) { if (Ext.isString(a)) { a = this.getSurface(a) } else { a = this.getSurface("main") } } c = a.add(c); b.push(c) } return b }, onBodyResize: function() { var b = this.element, a; if (!b) { return } a = b.getSize(); if (a.width && a.height) { this.setBodySize(a) } }, setBodySize: function(c) { var d = this, b = d.getResizeHandler() || d.defaultResizeHandler, a; d.fireEvent("bodyresize", d, c); a = b.call(d, c); if (a !== false) { d.renderFrame() } }, defaultResizeHandler: function(a) { this.getItems().each(function(b) { b.setRect([0, 0, a.width, a.height]) }) }, getSurface: function(d) { d = this.getId() + "-" + (d || "main"); var c = this, b = c.getItems(), a = b.get(d); if (!a) { a = c.add({ xclass: c.engine, id: d }); c.onBodyResize() } return a }, renderFrame: function() { var e = this, a = e.getItems(), b, d, c; for (b = 0, d = a.length; b < d; b++) { c = a.items[b]; if (c.isSurface) { c.renderFrame() } } }, getImage: function(k) { var l = this.innerElement.getSize(), a = Array.prototype.slice.call(this.items.items), d, g, c = this.surfaceZIndexes, f, e, b, h; for (e = 1; e < a.length; e++) { b = a[e]; h = c[b.type]; f = e - 1; while (f >= 0 && c[a[f].type] > h) { a[f + 1] = a[f]; f-- } a[f + 1] = b } d = a[0].flatten(l, a); if (k === "image") { g = new Image(); g.src = d.data; d.data = g; return d } if (k === "stream") { d.data = d.data.replace(/^data:image\/[^;]+/, "data:application/octet-stream"); return d } return d }, download: function(d) { var e = this, a = [], b, c, f; d = Ext.apply({ version: 2, data: e.getImage().data }, d); for (c in d) { if (d.hasOwnProperty(c)) { f = d[c]; if (c in e.supportedOptions) { if (e.supportedOptions[c].call(e, f)) { a.push({ tag: "input", type: "hidden", name: c, value: Ext.String.htmlEncode(Ext.isObject(f) ? Ext.JSON.encode(f) : f) }) } } } } b = Ext.dom.Helper.markup({ tag: "html", children: [{ tag: "head" }, { tag: "body", children: [{ tag: "form", method: "POST", action: d.url || e.defaultDownloadServerUrl, children: a }, { tag: "script", type: "text/javascript", children: 'document.getElementsByTagName("form")[0].submit();' }] }] }); window.open("", "ImageDownload_" + Date.now()).document.write(b) }, destroy: function() { var a = this.frameCallbackId; if (a) { Ext.draw.Animator.removeFrameCallback(a) } this.callParent() } }, function() { if (location.search.match("svg")) { Ext.draw.Container.prototype.engine = "Ext.draw.engine.Svg" } else { if ((Ext.os.is.BlackBerry && Ext.os.version.getMajor() === 10) || (Ext.browser.is.AndroidStock4 && (Ext.os.version.getMinor() === 1 || Ext.os.version.getMinor() === 2 || Ext.os.version.getMinor() === 3))) { Ext.draw.Container.prototype.engine = "Ext.draw.engine.Svg" } } }); Ext.define("Ext.chart.theme.Base", { mixins: { factoryable: "Ext.mixin.Factoryable" }, requires: ["Ext.draw.Color"], factoryConfig: { type: "chart.theme" }, isTheme: true, config: { baseColor: null, colors: undefined, gradients: null, chart: { defaults: { background: "white" } }, axis: { defaults: { label: { x: 0, y: 0, textBaseline: "middle", textAlign: "center", fontSize: "default", fontFamily: "default", fontWeight: "default", fillStyle: "black" }, title: { fillStyle: "black", fontSize: "default*1.23", fontFamily: "default", fontWeight: "default" }, style: { strokeStyle: "black" }, grid: { strokeStyle: "rgb(221, 221, 221)" } }, top: { style: { textPadding: 5 } }, bottom: { style: { textPadding: 5 } } }, series: { defaults: { label: { fillStyle: "black", strokeStyle: "none", fontFamily: "default", fontWeight: "default", fontSize: "default*1.077", textBaseline: "middle", textAlign: "center" }, labelOverflowPadding: 5 } }, sprites: { text: { fontSize: "default", fontWeight: "default", fontFamily: "default", fillStyle: "black" } }, seriesThemes: undefined, markerThemes: { type: ["circle", "cross", "plus", "square", "triangle", "diamond"] }, useGradients: false, background: null }, colorDefaults: ["#94ae0a", "#115fa6", "#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"], constructor: function(a) { this.initConfig(a); this.resolveDefaults() }, defaultRegEx: /^default([+\-/\*]\d+(?:\.\d+)?)?$/, defaultOperators: { "*": function(b, a) { return b * a }, "+": function(b, a) { return b + a }, "-": function(b, a) { return b - a } }, resolveDefaults: function() { var a = this; Ext.onReady(function() { var f = Ext.clone(a.getSprites()), e = Ext.clone(a.getAxis()), d = Ext.clone(a.getSeries()), g, c, b; if (!a.superclass.defaults) { g = Ext.getBody().createChild({ tag: "div", cls: "x-component" }); a.superclass.defaults = { fontFamily: g.getStyle("fontFamily"), fontWeight: g.getStyle("fontWeight"), fontSize: parseFloat(g.getStyle("fontSize")), fontVariant: g.getStyle("fontVariant"), fontStyle: g.getStyle("fontStyle") }; g.destroy() } a.replaceDefaults(f.text); a.setSprites(f); for (c in e) { b = e[c]; a.replaceDefaults(b.label); a.replaceDefaults(b.title) } a.setAxis(e); for (c in d) { b = d[c]; a.replaceDefaults(b.label) } a.setSeries(d) }) }, replaceDefaults: function(h) { var e = this, g = e.superclass.defaults, a = e.defaultRegEx, d, f, c, b; if (Ext.isObject(h)) { for (d in g) { c = a.exec(h[d]); if (c) { f = g[d]; c = c[1]; if (c) { b = e.defaultOperators[c.charAt(0)]; f = Math.round(b(f, parseFloat(c.substr(1)))) } h[d] = f } } } }, applyBaseColor: function(c) { var a, b; if (c) { a = c.isColor ? c : Ext.draw.Color.fromString(c); b = a.getHSL()[2]; if (b < 0.15) { a = a.createLighter(0.3) } else { if (b < 0.3) { a = a.createLighter(0.15) } else { if (b > 0.85) { a = a.createDarker(0.3) } else { if (b > 0.7) { a = a.createDarker(0.15) } } } } this.setColors([a.createDarker(0.3).toString(), a.createDarker(0.15).toString(), a.toString(), a.createLighter(0.12).toString(), a.createLighter(0.24).toString(), a.createLighter(0.31).toString()]) } return c }, applyColors: function(a) { return a || this.colorDefaults }, updateUseGradients: function(a) { if (a) { this.updateGradients({ type: "linear", degrees: 90 }) } }, updateBackground: function(a) { if (a) { var b = this.getChart(); b.defaults.background = a; this.setChart(b) } }, updateGradients: function(a) { var c = this.getColors(), e = [], h, b, d, f, g; if (Ext.isObject(a)) { for (f = 0, g = c && c.length || 0; f < g; f++) { b = Ext.draw.Color.fromString(c[f]); if (b) { d = b.createLighter(0.15).toString(); h = Ext.apply(Ext.Object.chain(a), { stops: [{ offset: 1, color: b.toString() }, { offset: 0, color: d.toString() }] }); e.push(h) } } this.setColors(e) } }, applySeriesThemes: function(a) { this.getBaseColor(); this.getUseGradients(); this.getGradients(); var b = this.getColors(); if (!a) { a = { fillStyle: Ext.Array.clone(b), strokeStyle: Ext.Array.map(b, function(d) { var c = Ext.draw.Color.fromString(d.stops ? d.stops[0].color : d); return c.createDarker(0.15).toString() }) } } return a } }); Ext.define("Ext.chart.theme.Default", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.default", "chart.theme.Base"] }); Ext.define("Ext.chart.Markers", { extend: "Ext.draw.sprite.Instancing", isMarkers: true, defaultCategory: "default", constructor: function() { this.callParent(arguments); this.categories = {}; this.revisions = {} }, destroy: function() { this.categories = null; this.revisions = null; this.callParent() }, getMarkerFor: function(b, a) { if (b in this.categories) { var c = this.categories[b]; if (a in c) { return this.get(c[a]) } } }, clear: function(a) { a = a || this.defaultCategory; if (!(a in this.revisions)) { this.revisions[a] = 1 } else { this.revisions[a]++ } }, putMarkerFor: function(e, b, c, h, f) { e = e || this.defaultCategory; var d = this, g = d.categories[e] || (d.categories[e] = {}), a; if (c in g) { d.setAttributesFor(g[c], b, h) } else { g[c] = d.getCount(); d.createInstance(b, h) } a = d.get(g[c]); if (a) { a.category = e; if (!f) { a.revision = d.revisions[e] || (d.revisions[e] = 1) } } }, getMarkerBBoxFor: function(c, a, b) { if (c in this.categories) { var d = this.categories[c]; if (a in d) { return this.getBBoxFor(d[a], b) } } }, getBBox: function() { return null }, render: function(a, l, b) { var f = this, k = f.revisions, j = f.attr.matrix, h = f.getTemplate(), d = h.attr, g, c, e; j.toContext(l); h.preRender(a, l, b); h.useAttributes(l, b); for (c = 0, e = f.instances.length; c < e; c++) { g = f.get(c); if (g.hidden || g.revision !== k[g.category]) { continue } l.save(); h.attr = g; h.useAttributes(l, b); h.render(a, l, b); l.restore() } h.attr = d } }); Ext.define("Ext.chart.label.Callout", { extend: "Ext.draw.modifier.Modifier", prepareAttributes: function(a) { if (!a.hasOwnProperty("calloutOriginal")) { a.calloutOriginal = Ext.Object.chain(a); a.calloutOriginal.prototype = a } if (this._previous) { this._previous.prepareAttributes(a.calloutOriginal) } }, setAttrs: function(e, h) { var d = e.callout, i = e.calloutOriginal, l = e.bbox.plain, c = (l.width || 0) + e.labelOverflowPadding, m = (l.height || 0) + e.labelOverflowPadding, p, o; if ("callout" in h) { d = h.callout } if ("callout" in h || "calloutPlaceX" in h || "calloutPlaceY" in h || "x" in h || "y" in h) { var n = "rotationRads" in h ? i.rotationRads = h.rotationRads : i.rotationRads, g = "x" in h ? (i.x = h.x) : i.x, f = "y" in h ? (i.y = h.y) : i.y, b = "calloutPlaceX" in h ? h.calloutPlaceX : e.calloutPlaceX, a = "calloutPlaceY" in h ? h.calloutPlaceY : e.calloutPlaceY, k = "calloutVertical" in h ? h.calloutVertical : e.calloutVertical, j; n %= Math.PI * 2; if (Math.cos(n) < 0) { n = (n + Math.PI) % (Math.PI * 2) } if (n > Math.PI) { n -= Math.PI * 2 } if (k) { n = n * (1 - d) - Math.PI / 2 * d; j = c; c = m; m = j } else { n = n * (1 - d) } h.rotationRads = n; h.x = g * (1 - d) + b * d; h.y = f * (1 - d) + a * d; p = b - g; o = a - f; if (Math.abs(o * c) > Math.abs(p * m)) { if (o > 0) { h.calloutEndX = h.x - (m / 2) * (p / o) * d; h.calloutEndY = h.y - (m / 2) * d } else { h.calloutEndX = h.x + (m / 2) * (p / o) * d; h.calloutEndY = h.y + (m / 2) * d } } else { if (p > 0) { h.calloutEndX = h.x - c / 2; h.calloutEndY = h.y - (c / 2) * (o / p) * d } else { h.calloutEndX = h.x + c / 2; h.calloutEndY = h.y + (c / 2) * (o / p) * d } } if (h.calloutStartX && h.calloutStartY) { h.calloutHasLine = (p > 0 && h.calloutStartX < h.calloutEndX) || (p <= 0 && h.calloutStartX > h.calloutEndX) || (o > 0 && h.calloutStartY < h.calloutEndY) || (o <= 0 && h.calloutStartY > h.calloutEndY) } else { h.calloutHasLine = true } } return h }, pushDown: function(a, b) { b = this.callParent([a.calloutOriginal, b]); return this.setAttrs(a, b) }, popUp: function(a, b) { a = a.prototype; b = this.setAttrs(a, b); if (this._next) { return this._next.popUp(a, b) } else { return Ext.apply(a, b) } } }); Ext.define("Ext.chart.label.Label", { extend: "Ext.draw.sprite.Text", requires: ["Ext.chart.label.Callout"], inheritableStatics: { def: { processors: { callout: "limited01", calloutHasLine: "bool", calloutPlaceX: "number", calloutPlaceY: "number", calloutStartX: "number", calloutStartY: "number", calloutEndX: "number", calloutEndY: "number", calloutColor: "color", calloutWidth: "number", calloutVertical: "bool", labelOverflowPadding: "number", display: "enums(none,under,over,rotate,insideStart,insideEnd,inside,outside)", orientation: "enums(horizontal,vertical)", renderer: "default" }, defaults: { callout: 0, calloutHasLine: true, calloutPlaceX: 0, calloutPlaceY: 0, calloutStartX: 0, calloutStartY: 0, calloutEndX: 0, calloutEndY: 0, calloutWidth: 1, calloutVertical: false, calloutColor: "black", labelOverflowPadding: 5, display: "none", orientation: "", renderer: null }, triggers: { callout: "transform", calloutPlaceX: "transform", calloutPlaceY: "transform", labelOverflowPadding: "transform", calloutRotation: "transform", display: "hidden" }, updaters: { hidden: function(a) { a.hidden = a.display === "none" } } } }, config: { fx: { customDurations: { callout: 200 } }, field: null, calloutLine: true }, applyCalloutLine: function(a) { if (a) { return Ext.apply({}, a) } }, prepareModifiers: function() { this.callParent(arguments); this.calloutModifier = new Ext.chart.label.Callout({ sprite: this }); this.fx.setNext(this.calloutModifier); this.calloutModifier.setNext(this.topModifier) }, render: function(b, c) { var e = this, a = e.attr, d = a.calloutColor; c.save(); c.globalAlpha *= a.callout; if (c.globalAlpha > 0 && a.calloutHasLine) { if (d && d.isGradient) { d = d.getStops()[0].color } c.strokeStyle = d; c.fillStyle = d; c.lineWidth = a.calloutWidth; c.beginPath(); c.moveTo(e.attr.calloutStartX, e.attr.calloutStartY); c.lineTo(e.attr.calloutEndX, e.attr.calloutEndY); c.stroke(); c.beginPath(); c.arc(e.attr.calloutStartX, e.attr.calloutStartY, 1 * a.calloutWidth, 0, 2 * Math.PI, true); c.fill(); c.beginPath(); c.arc(e.attr.calloutEndX, e.attr.calloutEndY, 1 * a.calloutWidth, 0, 2 * Math.PI, true); c.fill() } c.restore(); Ext.draw.sprite.Text.prototype.render.apply(e, arguments) } }); Ext.define("Ext.chart.series.Series", { requires: ["Ext.chart.Markers", "Ext.chart.label.Label", "Ext.tip.ToolTip"], mixins: ["Ext.mixin.Observable", "Ext.mixin.Bindable"], isSeries: true, defaultBindProperty: "store", type: null, seriesType: "sprite", identifiablePrefix: "ext-line-", observableType: "series", darkerStrokeRatio: 0.15, config: { chart: null, title: null, renderer: null, showInLegend: true, triggerAfterDraw: false, style: {}, subStyle: {}, themeStyle: {}, colors: null, useDarkerStrokeColor: true, store: null, label: {}, labelOverflowPadding: null, showMarkers: true, marker: null, markerSubStyle: null, itemInstancing: null, background: null, highlightItem: null, surface: null, overlaySurface: null, hidden: false, highlight: false, highlightCfg: { merge: function(a) { return a }, $value: { fillStyle: "yellow", strokeStyle: "red" } }, animation: null, tooltip: null }, directions: [], sprites: null, themeColorCount: function() { return 1 }, isStoreDependantColorCount: false, themeMarkerCount: function() { return 0 }, getFields: function(f) { var e = this, a = [], c, b, d; for (b = 0, d = f.length; b < d; b++) { c = e["get" + f[b] + "Field"](); if (Ext.isArray(c)) { a.push.apply(a, c) } else { a.push(c) } } return a }, applyAnimation: function(a, b) { if (!a) { a = { duration: 0 } } else { if (a === true) { a = { easing: "easeInOut", duration: 500 } } } return b ? Ext.apply({}, a, b) : a }, getAnimation: function() { var a = this.getChart(); if (a && a.animationSuspendCount) { return { duration: 0 } } else { return this.callParent() } }, updateTitle: function(a) { var j = this, g = j.getChart(); if (!g || g.isInitializing) { return } a = Ext.Array.from(a); var c = g.getSeries(), b = Ext.Array.indexOf(c, j), e = g.getLegendStore(), h = j.getYField(), d, l, k, f; if (e.getCount() && b !== -1) { f = h ? Math.min(a.length, h.length) : a.length; for (d = 0; d < f; d++) { k = a[d]; l = e.getAt(b + d); if (k && l) { l.set("name", k) } } } }, applyHighlight: function(a, b) { if (Ext.isObject(a)) { a = Ext.merge({}, this.config.highlightCfg, a) } else { if (a === true) { a = this.config.highlightCfg } } return Ext.apply(b || {}, a) }, updateHighlight: function(a) { this.getStyle(); if (!Ext.Object.isEmpty(a)) { this.addItemHighlight() } }, updateHighlightCfg: function(a) { if (!Ext.Object.equals(a, this.defaultConfig.highlightCfg)) { this.addItemHighlight() } }, applyItemInstancing: function(a, b) { return Ext.merge(b || {}, a) }, setAttributesForItem: function(c, d) { var b = c && c.sprite, a; if (b) { if (b.itemsMarker && c.category === "items") { b.putMarker(c.category, d, c.index, false, true) } if (b.isMarkerHolder && c.category === "markers") { b.putMarker(c.category, d, c.index, false, true) } else { if (b.isInstancing) { b.setAttributesFor(c.index, d) } else { if (Ext.isArray(b)) { for (a = 0; a < b.length; a++) { b[a].setAttributes(d) } } else { b.setAttributes(d) } } } } }, getBBoxForItem: function(a) { if (a && a.sprite) { if (a.sprite.itemsMarker && a.category === "items") { return a.sprite.getMarkerBBox(a.category, a.index) } else { if (a.sprite instanceof Ext.draw.sprite.Instancing) { return a.sprite.getBBoxFor(a.index) } else { return a.sprite.getBBox() } } } return null }, applyHighlightItem: function(d, a) { if (d === a) { return } if (Ext.isObject(d) && Ext.isObject(a)) { var c = d.sprite === a.sprite, b = d.index === a.index; if (c && b) { return } } return d }, updateHighlightItem: function(b, a) { this.setAttributesForItem(a, { highlighted: false }); this.setAttributesForItem(b, { highlighted: true }) }, constructor: function(a) { var b = this, c; a = a || {}; if (a.tips) { a = Ext.apply({ tooltip: a.tips }, a) } if (a.highlightCfg) { a = Ext.apply({ highlight: a.highlightCfg }, a) } if ("id" in a) { c = a.id } else { if ("id" in b.config) { c = b.config.id } else { c = b.getId() } } b.setId(c); b.sprites = []; b.dataRange = []; b.mixins.observable.constructor.call(b, a); b.initBindable() }, lookupViewModel: function(a) { var b = this.getChart(); return b ? b.lookupViewModel(a) : null }, applyTooltip: function(c, b) { var a = Ext.apply({ xtype: "tooltip", renderer: Ext.emptyFn, constrainPosition: true, shrinkWrapDock: true, autoHide: true, offsetX: 10, offsetY: 10 }, c); return Ext.create(a) }, updateTooltip: function() { this.addItemHighlight() }, addItemHighlight: function() { var d = this.getChart(); if (!d) { return } var e = d.getInteractions(), c, a, b; for (c = 0; c < e.length; c++) { a = e[c]; if (a.isItemHighlight || a.isItemEdit) { b = true; break } } if (!b) { e.push("itemhighlight"); d.setInteractions(e) } }, showTooltip: function(l, m) { var d = this, n = d.getTooltip(), j, a, i, f, h, k, g, e, b, c; if (!n) { return } clearTimeout(d.tooltipTimeout); b = n.config; if (n.trackMouse) { m[0] += b.offsetX; m[1] += b.offsetY } else { j = l.sprite; a = j.getSurface(); i = Ext.get(a.getId()); if (i) { k = l.series.getBBoxForItem(l); g = k.x + k.width / 2; e = k.y + k.height / 2; h = a.matrix.transformPoint([g, e]); f = i.getXY(); c = a.getInherited().rtl; g = c ? f[0] + i.getWidth() - h[0] : f[0] + h[0]; e = f[1] + h[1]; m = [g, e] } } Ext.callback(n.renderer, n.scope, [n, l.record, l], 0, d); n.show(m) }, hideTooltip: function(b) { var a = this, c = a.getTooltip(); if (!c) { return } clearTimeout(a.tooltipTimeout); a.tooltipTimeout = Ext.defer(function() { c.hide() }, 1) }, applyStore: function(a) { return a && Ext.StoreManager.lookup(a) }, getStore: function() { return this._store || this.getChart() && this.getChart().getStore() }, updateStore: function(b, a) { var h = this, g = h.getChart(), c = g && g.getStore(), f, j, e, d; a = a || c; if (a && a !== b) { a.un({ datachanged: "onDataChanged", update: "onDataChanged", scope: h }) } if (b) { b.on({ datachanged: "onDataChanged", update: "onDataChanged", scope: h }); f = h.getSprites(); for (d = 0, e = f.length; d < e; d++) { j = f[d]; if (j.setStore) { j.setStore(b) } } h.onDataChanged() } h.fireEvent("storechange", h, b, a) }, onStoreChange: function(b, a, c) { if (!this._store) { this.updateStore(a, c) } }, coordinate: function(o, m, e) { var l = this, p = l.getStore(), h = l.getHidden(), k = p.getData().items, b = l["get" + o + "Axis"](), f = { min: Infinity, max: -Infinity }, q = l["fieldCategory" + o] || [o], g = l.getFields(q), d, n, c, a = {}, j = l.getSprites(); if (j.length > 0) { if (!Ext.isBoolean(h) || !h) { for (d = 0; d < q.length; d++) { n = g[d]; c = l.coordinateData(k, n, b); l.getRangeOfData(c, f); a["data" + q[d]] = c } } l.dataRange[m] = f.min; l.dataRange[m + e] = f.max; a["dataMin" + o] = f.min; a["dataMax" + o] = f.max; if (b) { b.range = null; a["range" + o] = b.getRange() } for (d = 0; d < j.length; d++) { j[d].setAttributes(a) } } }, coordinateData: function(b, h, d) { var g = [], f = b.length, e = d && d.getLayout(), c, a; for (c = 0; c < f; c++) { a = b[c].data[h]; if (!Ext.isEmpty(a, true)) { if (e) { g[c] = e.getCoordFor(a, h, c, b) } else { g[c] = +a } } else { g[c] = a } } return g }, getRangeOfData: function(g, b) { var e = g.length, d = b.min, a = b.max, c, f; for (c = 0; c < e; c++) { f = g[c]; if (f < d) { d = f } if (f > a) { a = f } } b.min = d; b.max = a }, updateLabelData: function() { var h = this, l = h.getStore(), g = l.getData().items, f = h.getSprites(), a = h.getLabel().getTemplate(), n = Ext.Array.from(a.getField()), c, b, e, d, m, k; if (!f.length || !n.length) { return } for (c = 0; c < f.length; c++) { d = []; m = f[c]; k = m.getField(); if (Ext.Array.indexOf(n, k) < 0) { k = n[c] } for (b = 0, e = g.length; b < e; b++) { d.push(g[b].get(k)) } m.setAttributes({ labels: d }) } }, processData: function() { if (!this.getStore()) { return } var d = this, f = this.directions, a, c = f.length, e, b; for (a = 0; a < c; a++) { e = f[a]; b = d["get" + e + "Axis"](); if (b) { b.processData(d); continue } if (d["coordinate" + e]) { d["coordinate" + e]() } } d.updateLabelData() }, applyBackground: function(a) { if (this.getChart()) { this.getSurface().setBackground(a); return this.getSurface().getBackground() } else { return a } }, updateChart: function(d, a) { var c = this, b = c._store; if (a) { a.un("axeschange", "onAxesChange", c); c.clearSprites(); c.setSurface(null); c.setOverlaySurface(null); a.unregister(c); c.onChartDetached(a); if (!b) { c.updateStore(null) } } if (d) { c.setSurface(d.getSurface("series")); c.setOverlaySurface(d.getSurface("overlay")); d.on("axeschange", "onAxesChange", c); if (d.getAxes()) { c.onAxesChange(d) } c.onChartAttached(d); d.register(c); if (!b) { c.updateStore(d.getStore()) } } }, onAxesChange: function(h) { var k = this, g = h.getAxes(), c, a = {}, b = {}, e = false, j = this.directions, l, d, f; for (d = 0, f = j.length; d < f; d++) { l = j[d]; b[l] = k.getFields(k["fieldCategory" + l]) } for (d = 0, f = g.length; d < f; d++) { c = g[d]; if (!a[c.getDirection()]) { a[c.getDirection()] = [c] } else { a[c.getDirection()].push(c) } } for (d = 0, f = j.length; d < f; d++) { l = j[d]; if (k["get" + l + "Axis"]()) { continue } if (a[l]) { c = k.findMatchingAxis(a[l], b[l]); if (c) { k["set" + l + "Axis"](c); if (c.getNeedHighPrecision()) { e = true } } } } this.getSurface().setHighPrecision(e) }, findMatchingAxis: function(f, e) { var d, c, b, a; for (b = 0; b < f.length; b++) { d = f[b]; c = d.getFields(); if (!c.length) { return d } else { if (e) { for (a = 0; a < e.length; a++) { if (Ext.Array.indexOf(c, e[a]) >= 0) { return d } } } } } }, onChartDetached: function(a) { var b = this; b.fireEvent("chartdetached", a, b); a.un("storechange", "onStoreChange", b) }, onChartAttached: function(a) { var b = this; b.setBackground(b.getBackground()); b.fireEvent("chartattached", a, b); a.on("storechange", "onStoreChange", b); b.processData() }, updateOverlaySurface: function(a) { var b = this; if (a) { if (b.getLabel()) { b.getOverlaySurface().add(b.getLabel()) } } }, applyLabel: function(a, b) { if (!b) { b = new Ext.chart.Markers({ zIndex: 10 }); b.setTemplate(new Ext.chart.label.Label(a)) } else { b.getTemplate().setAttributes(a) } return b }, createItemInstancingSprite: function(c, b) { var e = this, f = new Ext.chart.Markers(), a, d; f.setAttributes({ zIndex: Number.MAX_VALUE }); a = Ext.apply({}, b); if (e.getHighlight()) { a.highlight = e.getHighlight(); a.modifiers = ["highlight"] } f.setTemplate(a); d = f.getTemplate(); d.setAttributes(e.getStyle()); d.fx.on("animationstart", "onSpriteAnimationStart", this); d.fx.on("animationend", "onSpriteAnimationEnd", this); c.bindMarker("items", f); e.getSurface().add(f); return f }, getDefaultSpriteConfig: function() { return { type: this.seriesType, renderer: this.getRenderer() } }, updateRenderer: function(c) { var b = this, a = b.getChart(), d; if (a && a.isInitializing) { return } d = b.getSprites(); if (d.length) { d[0].setAttributes({ renderer: c || null }); if (a && !a.isInitializing) { a.redraw() } } }, updateShowMarkers: function(a) { var d = this.getSprites(), b = d && d[0], c = b && b.getMarker("markers"); if (c) { c.getTemplate().setAttributes({ hidden: !a }) } }, createSprite: function() { var f = this, a = f.getSurface(), e = f.getItemInstancing(), d = a.add(f.getDefaultSpriteConfig()), b = f.getMarker(), g, c; d.setAttributes(f.getStyle()); d.setSeries(f); if (e) { d.itemsMarker = f.createItemInstancingSprite(d, e) } if (d.bindMarker) { if (b) { g = new Ext.chart.Markers(); c = Ext.Object.merge({}, b); if (f.getHighlight()) { c.highlight = f.getHighlight(); c.modifiers = ["highlight"] } g.setTemplate(c); g.getTemplate().fx.setCustomDurations({ translationX: 0, translationY: 0 }); d.dataMarker = g; d.bindMarker("markers", g); f.getOverlaySurface().add(g) } if (f.getLabel().getTemplate().getField()) { d.bindMarker("labels", f.getLabel()) } } if (d.setStore) { d.setStore(f.getStore()) } d.fx.on("animationstart", "onSpriteAnimationStart", f); d.fx.on("animationend", "onSpriteAnimationEnd", f); f.sprites.push(d); return d }, getSprites: Ext.emptyFn, onDataChanged: function() { var d = this, c = d.getChart(), b = c && c.getStore(), a = d.getStore(); if (a !== b) { d.processData() } }, isXType: function(a) { return a === "series" }, getItemId: function() { return this.getId() }, applyThemeStyle: function(e, a) { var b = this, d, c; d = e && e.subStyle && e.subStyle.fillStyle; c = d && e.subStyle.strokeStyle; if (d && !c) { e.subStyle.strokeStyle = b.getStrokeColorsFromFillColors(d) } d = e && e.markerSubStyle && e.markerSubStyle.fillStyle; c = d && e.markerSubStyle.strokeStyle; if (d && !c) { e.markerSubStyle.strokeStyle = b.getStrokeColorsFromFillColors(d) } return Ext.apply(a || {}, e) }, applyStyle: function(c, b) { var a = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + this.seriesType)); if (a && a.def) { c = a.def.normalize(c) } return Ext.apply({}, c, b) }, applySubStyle: function(b, c) { var a = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + this.seriesType)); if (a && a.def) { b = a.def.batchedNormalize(b, true) } return Ext.merge({}, c, b) }, applyMarker: function(c, a) { var d = (c && c.type) || (a && a.type) || "circle", b = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + d)); if (b && b.def) { c = b.def.normalize(Ext.isObject(c) ? c : {}, true); c.type = d } return Ext.merge(a || {}, c) }, applyMarkerSubStyle: function(c, a) { var d = (c && c.type) || (a && a.type) || "circle", b = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + d)); if (b && b.def) { c = b.def.batchedNormalize(c, true) } return Ext.merge(a || {}, c) }, updateHidden: function(b) { var a = this; a.getColors(); a.getSubStyle(); a.setSubStyle({ hidden: b }); a.processData(); a.doUpdateStyles(); if (!Ext.isArray(b)) { a.updateLegendStore(b) } }, updateLegendStore: function(f, b) { var e = this, d = e.getChart(), c = d.getLegendStore(), g = e.getId(), a; if (c) { if (arguments.length > 1) { a = c.findBy(function(h) { return h.get("series") === g && h.get("index") === b }); if (a !== -1) { a = c.getAt(a) } } else { a = c.findRecord("series", g) } if (a && a.get("disabled") !== f) { a.set("disabled", f) } } }, setHiddenByIndex: function(a, c) { var b = this; if (Ext.isArray(b.getHidden())) { b.getHidden()[a] = c; b.updateHidden(b.getHidden()); b.updateLegendStore(c, a) } else { b.setHidden(c) } }, getStrokeColorsFromFillColors: function(a) { var c = this, e = c.getUseDarkerStrokeColor(), b = (Ext.isNumber(e) ? e : c.darkerStrokeRatio), d; if (e) { d = Ext.Array.map(a, function(f) { f = Ext.isString(f) ? f : f.stops[0].color; f = Ext.draw.Color.fromString(f); return f.createDarker(b).toString() }) } else { d = Ext.Array.clone(a) } return d }, updateThemeColors: function(b) { var c = this, d = c.getThemeStyle(), a = Ext.Array.clone(b), f = c.getStrokeColorsFromFillColors(b), e = { fillStyle: a, strokeStyle: f }; d.subStyle = Ext.apply(d.subStyle || {}, e); d.markerSubStyle = Ext.apply(d.markerSubStyle || {}, e); c.doUpdateStyles() }, themeOnlyIfConfigured: {}, updateTheme: function(d) { var h = this, a = d.getSeries(), n = h.getInitialConfig(), c = h.defaultConfig, f = h.getConfigurator().configs, j = a.defaults, k = a[h.type], g = h.themeOnlyIfConfigured, l, i, o, b, m, e; a = Ext.merge({}, j, k); for (l in a) { i = a[l]; e = f[l]; if (i !== null && i !== undefined && e) { m = n[l]; o = Ext.isObject(i); b = m === c[l]; if (o) { if (b && g[l]) { continue } i = Ext.merge({}, i, m) } if (b || o) { h[e.names.set](i) } } } }, updateChartColors: function(a) { var b = this; if (!b.getColors()) { b.updateThemeColors(a) } }, updateColors: function(a) { this.updateThemeColors(a) }, updateStyle: function() { this.doUpdateStyles() }, updateSubStyle: function() { this.doUpdateStyles() }, updateThemeStyle: function() { this.doUpdateStyles() }, doUpdateStyles: function() { var g = this, h = g.sprites, d = g.getItemInstancing(), c = 0, f = h && h.length, a = g.getConfig("showMarkers", true), b = g.getMarker(), e; for (; c < f; c++) { e = g.getStyleByIndex(c); if (d) { h[c].itemsMarker.getTemplate().setAttributes(e) } h[c].setAttributes(e); if (b && h[c].dataMarker) { h[c].dataMarker.getTemplate().setAttributes(g.getMarkerStyleByIndex(c)) } } }, getStyleWithTheme: function() { var b = this, c = b.getThemeStyle(), d = (c && c.style) || {}, a = Ext.applyIf(Ext.apply({}, b.getStyle()), d); return a }, getSubStyleWithTheme: function() { var c = this, d = c.getThemeStyle(), a = (d && d.subStyle) || {}, b = Ext.applyIf(Ext.apply({}, c.getSubStyle()), a); return b }, getStyleByIndex: function(b) { var e = this, h = e.getThemeStyle(), d, g, c, f, a = {}; d = e.getStyle(); g = (h && h.style) || {}; c = e.styleDataForIndex(e.getSubStyle(), b); f = e.styleDataForIndex((h && h.subStyle), b); Ext.apply(a, g); Ext.apply(a, f); Ext.apply(a, d); Ext.apply(a, c); return a }, getMarkerStyleByIndex: function(d) { var g = this, c = g.getThemeStyle(), a, e, k, j, b, l, h, f, m = {}; a = g.getStyle(); e = (c && c.style) || {}; k = g.styleDataForIndex(g.getSubStyle(), d); if (k.hasOwnProperty("hidden")) { k.hidden = k.hidden || !this.getConfig("showMarkers", true) } j = g.styleDataForIndex((c && c.subStyle), d); b = g.getMarker(); l = (c && c.marker) || {}; h = g.getMarkerSubStyle(); f = g.styleDataForIndex((c && c.markerSubStyle), d); Ext.apply(m, e); Ext.apply(m, j); Ext.apply(m, l); Ext.apply(m, f); Ext.apply(m, a); Ext.apply(m, k); Ext.apply(m, b); Ext.apply(m, h); return m }, styleDataForIndex: function(d, c) { var e, b, a = {}; if (d) { for (b in d) { e = d[b]; if (Ext.isArray(e)) { a[b] = e[c % e.length] } else { a[b] = e } } } return a }, getItemForPoint: Ext.emptyFn, getItemByIndex: function(a, e) { var d = this, f = d.getSprites(), b = f && f[0], c; if (!b) { return } if (e === undefined && b.isMarkerHolder) { e = d.getItemInstancing() ? "items" : "markers" } else { if (!e || e === "" || e === "sprites") { b = f[a] } } if (b) { c = { series: d, category: e, index: a, record: d.getStore().getData().items[a], field: d.getYField(), sprite: b }; return c } }, onSpriteAnimationStart: function(a) { this.fireEvent("animationstart", this, a) }, onSpriteAnimationEnd: function(a) { this.fireEvent("animationend", this, a) }, resolveListenerScope: function(e) { var d = this, a = Ext._namedScopes[e], c = d.getChart(), b; if (!a) { b = c ? c.resolveListenerScope(e, false) : (e || d) } else { if (a.isThis) { b = d } else { if (a.isController) { b = c ? c.resolveListenerScope(e, false) : d } else { if (a.isSelf) { b = c ? c.resolveListenerScope(e, false) : d; if (b === c && !c.getInheritedConfig("defaultListenerScope")) { b = d } } } } } return b }, provideLegendInfo: function(a) { a.push({ name: this.getTitle() || this.getId(), mark: "black", disabled: this.getHidden(), series: this.getId(), index: 0 }) }, clearSprites: function() { var d = this.sprites, b, a, c; for (a = 0, c = d.length; a < c; a++) { b = d[a]; if (b && b.isSprite) { b.destroy() } } this.sprites = [] }, destroy: function() { var b = this, a = b._store, c = b.getConfig("tooltip", true); if (a && a.getAutoDestroy()) { Ext.destroy(a) } b.setChart(null); b.clearListeners(); if (c) { Ext.destroy(c); clearTimeout(b.tooltipTimeout) } b.callParent() } }); Ext.define("Ext.chart.interactions.Abstract", { xtype: "interaction", mixins: { observable: "Ext.mixin.Observable" }, config: { gestures: { tap: "onGesture" }, chart: null, enabled: true }, throttleGap: 0, stopAnimationBeforeSync: false, constructor: function(a) { var b = this, c; a = a || {}; if ("id" in a) { c = a.id } else { if ("id" in b.config) { c = b.config.id } else { c = b.getId() } } b.setId(c); b.mixins.observable.constructor.call(b, a) }, initialize: Ext.emptyFn, updateChart: function(c, a) { var b = this; if (a === c) { return } if (a) { a.unregister(b); b.removeChartListener(a) } if (c) { c.register(b); b.addChartListener() } }, updateEnabled: function(a) { var c = this, b = c.getChart(); if (b) { if (a) { c.addChartListener() } else { c.removeChartListener(b) } } }, onGesture: Ext.emptyFn, getItemForEvent: function(d) { var b = this, a = b.getChart(), c = a.getEventXY(d); return a.getItemForPoint(c[0], c[1]) }, getItemsForEvent: function(d) { var b = this, a = b.getChart(), c = a.getEventXY(d); return a.getItemsForPoint(c[0], c[1]) }, addChartListener: function() { var c = this, b = c.getChart(), e = c.getGestures(), a; if (!c.getEnabled()) { return } function d(f, g) { b.addElementListener(f, c.listeners[f] = function(j) { var i = c.getLocks(), h; if (c.getEnabled() && (!(f in i) || i[f] === c)) { h = (Ext.isFunction(g) ? g : c[g]).apply(this, arguments); if (h === false && j && j.stopPropagation) { j.stopPropagation() } return h } }, c) } c.listeners = c.listeners || {}; for (a in e) { d(a, e[a]) } }, removeChartListener: function(c) { var d = this, e = d.getGestures(), b; function a(f) { var g = d.listeners[f]; if (g) { c.removeElementListener(f, g); delete d.listeners[f] } } if (d.listeners) { for (b in e) { a(b) } } }, lockEvents: function() { var d = this, c = d.getLocks(), a = Array.prototype.slice.call(arguments), b = a.length; while (b--) { c[a[b]] = d } }, unlockEvents: function() { var c = this.getLocks(), a = Array.prototype.slice.call(arguments), b = a.length; while (b--) { delete c[a[b]] } }, getLocks: function() { var a = this.getChart(); return a.lockedEvents || (a.lockedEvents = {}) }, isMultiTouch: function() { if (Ext.browser.is.IE10) { return true } return !Ext.os.is.Desktop }, initializeDefaults: Ext.emptyFn, doSync: function() { var b = this, a = b.getChart(); if (b.syncTimer) { clearTimeout(b.syncTimer); b.syncTimer = null } if (b.stopAnimationBeforeSync) { a.animationSuspendCount++ } a.redraw(); if (b.stopAnimationBeforeSync) { a.animationSuspendCount-- } b.syncThrottle = Date.now() + b.throttleGap }, sync: function() { var a = this; if (a.throttleGap && Ext.frameStartTime < a.syncThrottle) { if (a.syncTimer) { return } a.syncTimer = Ext.defer(function() { a.doSync() }, a.throttleGap) } else { a.doSync() } }, getItemId: function() { return this.getId() }, isXType: function(a) { return a === "interaction" }, destroy: function() { var a = this; a.setChart(null); delete a.listeners; a.callParent() } }, function() { if (Ext.os.is.Android4) { this.prototype.throttleGap = 40 } }); Ext.define("Ext.chart.MarkerHolder", { extend: "Ext.Mixin", mixinConfig: { id: "markerHolder", after: { constructor: "constructor", preRender: "preRender" }, before: { destroy: "destroy" } }, isMarkerHolder: true, surfaceMatrix: null, inverseSurfaceMatrix: null, deprecated: { 6: { methods: { getBoundMarker: { message: "Please use the 'getMarker' method instead.", fn: function(b) { var a = this.boundMarkers[b]; return a ? [a] : a } } } } }, constructor: function() { this.boundMarkers = {}; this.cleanRedraw = false }, bindMarker: function(b, a) { var c = this, d = c.boundMarkers; if (a && a.isMarkers) { c.releaseMarker(b); d[b] = a; a.on("destroy", c.onMarkerDestroy, c) } }, onMarkerDestroy: function(a) { this.releaseMarker(a) }, releaseMarker: function(a) { var c = this.boundMarkers, b; if (a && a.isMarkers) { for (b in c) { if (c[b] === a) { delete c[b]; break } } } else { b = a; a = c[b]; delete c[b] } return a || null }, getMarker: function(a) { return this.boundMarkers[a] || null }, preRender: function() { var f = this, g = f.getId(), d = f.boundMarkers, e = f.getParent(), c, a, b; if (f.surfaceMatrix) { b = f.surfaceMatrix.set(1, 0, 0, 1, 0, 0) } else { b = f.surfaceMatrix = new Ext.draw.Matrix() } f.cleanRedraw = !f.attr.dirty; if (!f.cleanRedraw) { for (c in d) { a = d[c]; if (a) { a.clear(g) } } } while (e && e.attr && e.attr.matrix) { b.prependMatrix(e.attr.matrix); e = e.getParent() } b.prependMatrix(e.matrix); f.surfaceMatrix = b; f.inverseSurfaceMatrix = b.inverse(f.inverseSurfaceMatrix) }, putMarker: function(d, a, c, g, e) { var b = this.boundMarkers[d], f = this.getId(); if (b) { b.putMarkerFor(f, a, c, g, e) } }, getMarkerBBox: function(c, b, d) { var a = this.boundMarkers[c], e = this.getId(); if (a) { return a.getMarkerBBoxFor(e, b, d) } }, destroy: function() { var c = this.boundMarkers, b, a; for (b in c) { a = c[b]; a.destroy() } } }); Ext.define("Ext.chart.axis.sprite.Axis", { extend: "Ext.draw.sprite.Sprite", alias: "sprite.axis", type: "axis", mixins: { markerHolder: "Ext.chart.MarkerHolder" }, requires: ["Ext.draw.sprite.Text"], inheritableStatics: { def: { processors: { grid: "bool", axisLine: "bool", minorTicks: "bool", minorTickSize: "number", majorTicks: "bool", majorTickSize: "number", length: "number", startGap: "number", endGap: "number", dataMin: "number", dataMax: "number", visibleMin: "number", visibleMax: "number", position: "enums(left,right,top,bottom,angular,radial,gauge)", minStepSize: "number", estStepSize: "number", titleOffset: "number", textPadding: "number", min: "number", max: "number", centerX: "number", centerY: "number", radius: "number", totalAngle: "number", baseRotation: "number", data: "default", enlargeEstStepSizeByText: "bool" }, defaults: { grid: false, axisLine: true, minorTicks: false, minorTickSize: 3, majorTicks: true, majorTickSize: 5, length: 0, startGap: 0, endGap: 0, visibleMin: 0, visibleMax: 1, dataMin: 0, dataMax: 1, position: "", minStepSize: 0, estStepSize: 20, min: 0, max: 1, centerX: 0, centerY: 0, radius: 1, baseRotation: 0, data: null, titleOffset: 0, textPadding: 0, scalingCenterY: 0, scalingCenterX: 0, strokeStyle: "black", enlargeEstStepSizeByText: false }, triggers: { minorTickSize: "bbox", majorTickSize: "bbox", position: "bbox,layout", axisLine: "bbox,layout", min: "layout", max: "layout", length: "layout", minStepSize: "layout", estStepSize: "layout", data: "layout", dataMin: "layout", dataMax: "layout", visibleMin: "layout", visibleMax: "layout", enlargeEstStepSizeByText: "layout" }, updaters: { layout: "layoutUpdater" } } }, config: { label: null, layout: null, segmenter: null, renderer: null, layoutContext: null, axis: null }, thickness: 0, stepSize: 0, getBBox: function() { return null }, defaultRenderer: function(a) { return this.segmenter.renderer(a, this) }, layoutUpdater: function() { var h = this, f = h.getAxis().getChart(); if (f.isInitializing) { return } var e = h.attr, d = h.getLayout(), g = f.getInherited().rtl, b = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMin, i = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMax, c = e.position, a = { attr: e, segmenter: h.getSegmenter(), renderer: h.defaultRenderer }; if (c === "left" || c === "right") { e.translationX = 0; e.translationY = i * e.length / (i - b); e.scalingX = 1; e.scalingY = -e.length / (i - b); e.scalingCenterY = 0; e.scalingCenterX = 0; h.applyTransformations(true) } else { if (c === "top" || c === "bottom") { if (g) { e.translationX = e.length + b * e.length / (i - b) + 1 } else { e.translationX = -b * e.length / (i - b) } e.translationY = 0; e.scalingX = (g ? -1 : 1) * e.length / (i - b); e.scalingY = 1; e.scalingCenterY = 0; e.scalingCenterX = 0; h.applyTransformations(true) } } if (d) { d.calculateLayout(a); h.setLayoutContext(a) } }, iterate: function(e, j) { var c, g, a, b, h, d, k = Ext.Array.some, m = Math.abs, f; if (e.getLabel) { if (e.min < e.from) { j.call(this, e.min, e.getLabel(e.min), -1, e) } for (c = 0; c <= e.steps; c++) { j.call(this, e.get(c), e.getLabel(c), c, e) } if (e.max > e.to) { j.call(this, e.max, e.getLabel(e.max), e.steps + 1, e) } } else { b = this.getAxis(); h = b.floatingAxes; d = []; f = (e.to - e.from) / (e.steps + 1); if (b.getFloating()) { for (a in h) { d.push(h[a]) } } function l(i) { return !d.length || k(d, function(n) { return m(n - i) > f }) } if (e.min < e.from && l(e.min)) { j.call(this, e.min, e.min, -1, e) } for (c = 0; c <= e.steps; c++) { g = e.get(c); if (l(g)) { j.call(this, g, g, c, e) } } if (e.max > e.to && l(e.max)) { j.call(this, e.max, e.max, e.steps + 1, e) } } }, renderTicks: function(l, m, s, p) { var v = this, k = v.attr, u = k.position, n = k.matrix, e = 0.5 * k.lineWidth, f = n.getXX(), i = n.getDX(), j = n.getYY(), h = n.getDY(), o = s.majorTicks, d = k.majorTickSize, a = s.minorTicks, r = k.minorTickSize; if (o) { switch (u) { case "right": function q(w) { return function(x, z, y) { x = l.roundPixel(x * j + h) + e; m.moveTo(0, x); m.lineTo(w, x) } } v.iterate(o, q(d)); a && v.iterate(a, q(r)); break; case "left": function t(w) { return function(x, z, y) { x = l.roundPixel(x * j + h) + e; m.moveTo(p[2] - w, x); m.lineTo(p[2], x) } } v.iterate(o, t(d)); a && v.iterate(a, t(r)); break; case "bottom": function c(w) { return function(x, z, y) { x = l.roundPixel(x * f + i) - e; m.moveTo(x, 0); m.lineTo(x, w) } } v.iterate(o, c(d)); a && v.iterate(a, c(r)); break; case "top": function b(w) { return function(x, z, y) { x = l.roundPixel(x * f + i) - e; m.moveTo(x, p[3]); m.lineTo(x, p[3] - w) } } v.iterate(o, b(d)); a && v.iterate(a, b(r)); break; case "angular": v.iterate(o, function(w, y, x) { w = w / (k.max + 1) * Math.PI * 2 + k.baseRotation; m.moveTo(k.centerX + (k.length) * Math.cos(w), k.centerY + (k.length) * Math.sin(w)); m.lineTo(k.centerX + (k.length + d) * Math.cos(w), k.centerY + (k.length + d) * Math.sin(w)) }); break; case "gauge": var g = v.getGaugeAngles(); v.iterate(o, function(w, y, x) { w = (w - k.min) / (k.max - k.min + 1) * k.totalAngle - k.totalAngle + g.start; m.moveTo(k.centerX + (k.length) * Math.cos(w), k.centerY + (k.length) * Math.sin(w)); m.lineTo(k.centerX + (k.length + d) * Math.cos(w), k.centerY + (k.length + d) * Math.sin(w)) }); break } } }, renderLabels: function(E, q, D, K) { var o = this, k = o.attr, i = 0.5 * k.lineWidth, u = k.position, y = k.matrix, A = k.textPadding, x = y.getXX(), d = y.getDX(), g = y.getYY(), c = y.getDY(), n = 0, I = D.majorTicks, G = Math.max(k.majorTickSize, k.minorTickSize) + k.lineWidth, f = Ext.draw.Draw.isBBoxIntersect, F = o.getLabel(), J, s, r = null, w = 0, b = 0, m = D.segmenter, B = o.getRenderer(), t = o.getAxis(), z = t.getTitle(), a = z && z.attr.text !== "" && z.getBBox(), l, h = null, p, C, v, e, H; if (I && F && !F.attr.hidden) { J = F.attr.font; if (q.font !== J) { q.font = J } F.setAttributes({ translationX: 0, translationY: 0 }, true); F.applyTransformations(); l = F.attr.inverseMatrix.elements.slice(0); switch (u) { case "left": e = a ? a.x + a.width : 0; switch (F.attr.textAlign) { case "start": H = E.roundPixel(e + d) - i; break; case "end": H = E.roundPixel(K[2] - G + d) - i; break; default: H = E.roundPixel(e + (K[2] - e - G) / 2 + d) - i } F.setAttributes({ translationX: H }, true); break; case "right": e = a ? K[2] - a.x : 0; switch (F.attr.textAlign) { case "start": H = E.roundPixel(G + d) + i; break; case "end": H = E.roundPixel(K[2] - e + d) + i; break; default: H = E.roundPixel(G + (K[2] - G - e) / 2 + d) + i } F.setAttributes({ translationX: H }, true); break; case "top": e = a ? a.y + a.height : 0; F.setAttributes({ translationY: E.roundPixel(e + (K[3] - e - G) / 2) - i }, true); break; case "bottom": e = a ? K[3] - a.y : 0; F.setAttributes({ translationY: E.roundPixel(G + (K[3] - G - e) / 2) + i }, true); break; case "radial": F.setAttributes({ translationX: k.centerX }, true); break; case "angular": F.setAttributes({ translationY: k.centerY }, true); break; case "gauge": F.setAttributes({ translationY: k.centerY }, true); break } if (u === "left" || u === "right") { o.iterate(I, function(L, N, M) { if (N === undefined) { return } if (B) { v = Ext.callback(B, null, [t, N, D, r], 0, t) } else { v = m.renderer(N, D, r) } r = N; F.setAttributes({ text: String(v), translationY: E.roundPixel(L * g + c) }, true); F.applyTransformations(); n = Math.max(n, F.getBBox().width + G); if (n <= o.thickness) { C = Ext.draw.Matrix.fly(F.attr.matrix.elements.slice(0)); p = C.prepend.apply(C, l).transformBBox(F.getBBox(true)); if (h && !f(p, h, A)) { return } E.renderSprite(F); h = p; w += p.height; b++ } }) } else { if (u === "top" || u === "bottom") { o.iterate(I, function(L, N, M) { if (N === undefined) { return } if (B) { v = Ext.callback(B, null, [t, N, D, r], 0, t) } else { v = m.renderer(N, D, r) } r = N; F.setAttributes({ text: String(v), translationX: E.roundPixel(L * x + d) }, true); F.applyTransformations(); n = Math.max(n, F.getBBox().height + G); if (n <= o.thickness) { C = Ext.draw.Matrix.fly(F.attr.matrix.elements.slice(0)); p = C.prepend.apply(C, l).transformBBox(F.getBBox(true)); if (h && !f(p, h, A)) { return } E.renderSprite(F); h = p; w += p.width; b++ } }) } else { if (u === "radial") { o.iterate(I, function(L, N, M) { if (N === undefined) { return } if (B) { v = Ext.callback(B, null, [t, N, D, r], 0, t) } else { v = m.renderer(N, D, r) } r = N; if (typeof v !== "undefined") { F.setAttributes({ text: String(v), translationX: k.centerX - E.roundPixel(L) / k.max * k.length * Math.cos(k.baseRotation + Math.PI / 2), translationY: k.centerY - E.roundPixel(L) / k.max * k.length * Math.sin(k.baseRotation + Math.PI / 2) }, true); F.applyTransformations(); p = F.attr.matrix.transformBBox(F.getBBox(true)); if (h && !f(p, h)) { return } E.renderSprite(F); h = p; w += p.width; b++ } }) } else { if (u === "angular") { s = k.majorTickSize + k.lineWidth * 0.5 + (parseInt(F.attr.fontSize, 10) || 10) / 2; o.iterate(I, function(L, N, M) { if (N === undefined) { return } if (B) { v = Ext.callback(B, null, [t, N, D, r], 0, t) } else { v = m.renderer(N, D, r) } r = N; n = Math.max(n, Math.max(k.majorTickSize, k.minorTickSize) + (k.lineCap !== "butt" ? k.lineWidth * 0.5 : 0)); if (typeof v !== "undefined") { var O = L / (k.max + 1) * Math.PI * 2 + k.baseRotation; F.setAttributes({ text: String(v), translationX: k.centerX + (k.length + s) * Math.cos(O), translationY: k.centerY + (k.length + s) * Math.sin(O) }, true); F.applyTransformations(); p = F.attr.matrix.transformBBox(F.getBBox(true)); if (h && !f(p, h)) { return } E.renderSprite(F); h = p; w += p.width; b++ } }) } else { if (u === "gauge") { var j = o.getGaugeAngles(); o.iterate(I, function(L, N, M) { if (N === undefined) { return } if (B) { v = Ext.callback(B, null, [t, N, D, r], 0, t) } else { v = m.renderer(N, D, r) } r = N; if (typeof v !== "undefined") { var O = (L - k.min) / (k.max - k.min + 1) * k.totalAngle - k.totalAngle + j.start; F.setAttributes({ text: String(v), translationX: k.centerX + (k.length + 10) * Math.cos(O), translationY: k.centerY + (k.length + 10) * Math.sin(O) }, true); F.applyTransformations(); p = F.attr.matrix.transformBBox(F.getBBox(true)); if (h && !f(p, h)) { return } E.renderSprite(F); h = p; w += p.width; b++ } }) } } } } } if (k.enlargeEstStepSizeByText && b) { w /= b; w += G; w *= 2; if (k.estStepSize < w) { k.estStepSize = w } } if (Math.abs(o.thickness - (n)) > 1) { o.thickness = n; k.bbox.plain.dirty = true; k.bbox.transform.dirty = true; o.doThicknessChanged(); return false } } }, renderAxisLine: function(a, i, e, c) { var h = this, g = h.attr, b = g.lineWidth * 0.5, j = g.position, d, f; if (g.axisLine && g.length) { switch (j) { case "left": d = a.roundPixel(c[2]) - b; i.moveTo(d, -g.endGap); i.lineTo(d, g.length + g.startGap + 1); break; case "right": i.moveTo(b, -g.endGap); i.lineTo(b, g.length + g.startGap + 1); break; case "bottom": i.moveTo(-g.startGap, b); i.lineTo(g.length + g.endGap, b); break; case "top": d = a.roundPixel(c[3]) - b; i.moveTo(-g.startGap, d); i.lineTo(g.length + g.endGap, d); break; case "angular": i.moveTo(g.centerX + g.length, g.centerY); i.arc(g.centerX, g.centerY, g.length, 0, Math.PI * 2, true); break; case "gauge": f = h.getGaugeAngles(); i.moveTo(g.centerX + Math.cos(f.start) * g.length, g.centerY + Math.sin(f.start) * g.length); i.arc(g.centerX, g.centerY, g.length, f.start, f.end, true); break } } }, getGaugeAngles: function() { var a = this, c = a.attr.totalAngle, b; if (c <= Math.PI) { b = (Math.PI - c) * 0.5 } else { b = -(Math.PI * 2 - c) * 0.5 } b = Math.PI * 2 - b; return { start: b, end: b - c } }, renderGridLines: function(m, n, s, r) { var t = this, b = t.getAxis(), l = t.attr, p = l.matrix, d = l.startGap, a = l.endGap, c = p.getXX(), k = p.getYY(), h = p.getDX(), g = p.getDY(), u = l.position, f = b.getGridAlignment(), q = s.majorTicks, e, o, i; if (l.grid) { if (q) { if (u === "left" || u === "right") { i = l.min * k + g + a + d; t.iterate(q, function(j, w, v) { e = j * k + g + a; t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), { y: e, height: i - e }, o = v, true); i = e }); o++; e = 0; t.putMarker(f + "-" + (o % 2 ? "odd" : "even"), { y: e, height: i - e }, o, true) } else { if (u === "top" || u === "bottom") { i = l.min * c + h + d; if (d) { t.putMarker(f + "-even", { x: 0, width: i }, -1, true) } t.iterate(q, function(j, w, v) { e = j * c + h + d; t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), { x: e, width: i - e }, o = v, true); i = e }); o++; e = l.length + l.startGap + l.endGap; t.putMarker(f + "-" + (o % 2 ? "odd" : "even"), { x: e, width: i - e }, o, true) } else { if (u === "radial") { t.iterate(q, function(j, w, v) { if (!j) { return } e = j / l.max * l.length; t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), { scalingX: e, scalingY: e }, v, true); i = e }) } else { if (u === "angular") { t.iterate(q, function(j, w, v) { if (!l.length) { return } e = j / (l.max + 1) * Math.PI * 2 + l.baseRotation; t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), { rotationRads: e, rotationCenterX: 0, rotationCenterY: 0, scalingX: l.length, scalingY: l.length }, v, true); i = e }) } } } } } } }, renderLimits: function(o) { var t = this, a = t.getAxis(), h = a.getChart(), p = h.getInnerPadding(), d = Ext.Array.from(a.getLimits()); if (!d.length) { return } var r = a.limits.surface.getRect(), m = t.attr, n = m.matrix, u = m.position, k = Ext.Object.chain, v = a.limits.titles, c, j, b, s, l, q, f, g, e; v.instances = []; v.position = 0; if (u === "left" || u === "right") { for (q = 0, f = d.length; q < f; q++) { s = k(d[q]); !s.line && (s.line = {}); l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value; l = l * n.getYY() + n.getDY(); s.line.y = l + p.top; s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle; t.putMarker("horizontal-limit-lines", s.line, q, true); if (s.line.title) { v.createInstance(s.line.title); c = v.getBBoxFor(v.position - 1); j = s.line.title.position || (u === "left" ? "start" : "end"); switch (j) { case "start": g = 10; break; case "end": g = r[2] - 10; break; case "middle": g = r[2] / 2; break } v.setAttributesFor(v.position - 1, { x: g, y: s.line.y - c.height / 2, textAlign: j, fillStyle: s.line.title.fillStyle || s.line.strokeStyle }) } } } else { if (u === "top" || u === "bottom") { for (q = 0, f = d.length; q < f; q++) { s = k(d[q]); !s.line && (s.line = {}); l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value; l = l * n.getXX() + n.getDX(); s.line.x = l + p.left; s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle; t.putMarker("vertical-limit-lines", s.line, q, true); if (s.line.title) { v.createInstance(s.line.title); c = v.getBBoxFor(v.position - 1); j = s.line.title.position || (u === "top" ? "end" : "start"); switch (j) { case "start": e = r[3] - c.width / 2 - 10; break; case "end": e = c.width / 2 + 10; break; case "middle": e = r[3] / 2; break } v.setAttributesFor(v.position - 1, { x: s.line.x + c.height / 2, y: e, fillStyle: s.line.title.fillStyle || s.line.strokeStyle, rotationRads: Math.PI / 2 }) } } } else { if (u === "radial") { for (q = 0, f = d.length; q < f; q++) { s = k(d[q]); !s.line && (s.line = {}); l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value; if (l > m.max) { continue } l = l / m.max * m.length; s.line.cx = m.centerX; s.line.cy = m.centerY; s.line.scalingX = l; s.line.scalingY = l; s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle; t.putMarker("circular-limit-lines", s.line, q, true); if (s.line.title) { v.createInstance(s.line.title); c = v.getBBoxFor(v.position - 1); v.setAttributesFor(v.position - 1, { x: m.centerX, y: m.centerY - l - c.height / 2, fillStyle: s.line.title.fillStyle || s.line.strokeStyle }) } } } else { if (u === "angular") { for (q = 0, f = d.length; q < f; q++) { s = k(d[q]); !s.line && (s.line = {}); l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value; l = l / (m.max + 1) * Math.PI * 2 + m.baseRotation; s.line.translationX = m.centerX; s.line.translationY = m.centerY; s.line.rotationRads = l; s.line.rotationCenterX = 0; s.line.rotationCenterY = 0; s.line.scalingX = m.length; s.line.scalingY = m.length; s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle; t.putMarker("radial-limit-lines", s.line, q, true); if (s.line.title) { v.createInstance(s.line.title); c = v.getBBoxFor(v.position - 1); b = ((l > -0.5 * Math.PI && l < 0.5 * Math.PI) || (l > 1.5 * Math.PI && l < 2 * Math.PI)) ? 1 : -1; v.setAttributesFor(v.position - 1, { x: m.centerX + 0.5 * m.length * Math.cos(l) + b * c.height / 2 * Math.sin(l), y: m.centerY + 0.5 * m.length * Math.sin(l) - b * c.height / 2 * Math.cos(l), rotationRads: b === 1 ? l : l - Math.PI, fillStyle: s.line.title.fillStyle || s.line.strokeStyle }) } } } else { if (u === "gauge") {} } } } } }, doThicknessChanged: function() { var a = this.getAxis(); if (a) { a.onThicknessChanged() } }, render: function(a, c, d) { var e = this, b = e.getLayoutContext(); if (b) { if (false === e.renderLabels(a, c, b, d)) { return false } c.beginPath(); e.renderTicks(a, c, b, d); e.renderAxisLine(a, c, b, d); e.renderGridLines(a, c, b, d); e.renderLimits(d); c.stroke() } } }); Ext.define("Ext.chart.axis.segmenter.Segmenter", { config: { axis: null }, constructor: function(a) { this.initConfig(a) }, renderer: function(b, a) { return String(b) }, from: function(a) { return a }, diff: Ext.emptyFn, align: Ext.emptyFn, add: Ext.emptyFn, preferredStep: Ext.emptyFn }); Ext.define("Ext.chart.axis.segmenter.Names", { extend: "Ext.chart.axis.segmenter.Segmenter", alias: "segmenter.names", renderer: function(b, a) { return b }, diff: function(b, a, c) { return Math.floor(a - b) }, align: function(c, b, a) { return Math.floor(c) }, add: function(c, b, a) { return c + b }, preferredStep: function(c, a, b, d) { return { unit: 1, step: 1 } } }); Ext.define("Ext.chart.axis.segmenter.Numeric", { extend: "Ext.chart.axis.segmenter.Segmenter", alias: "segmenter.numeric", isNumeric: true, renderer: function(b, a) { return b.toFixed(Math.max(0, a.majorTicks.unit.fixes)) }, diff: function(b, a, c) { return Math.floor((a - b) / c.scale) }, align: function(c, b, a) { return Math.floor(c / (a.scale * b)) * a.scale * b }, add: function(c, b, a) { return c + b * a.scale }, preferredStep: function(c, b) { var a = Math.floor(Math.log(b) * Math.LOG10E), d = Math.pow(10, a); b /= d; if (b < 2) { b = 2 } else { if (b < 5) { b = 5 } else { if (b < 10) { b = 10; a++ } } } return { unit: { fixes: -a, scale: d }, step: b } }, exactStep: function(c, b) { var a = Math.floor(Math.log(b) * Math.LOG10E), d = Math.pow(10, a); return { unit: { fixes: -a + (b % d === 0 ? 0 : 1), scale: 1 }, step: b } }, adjustByMajorUnit: function(e, g, c) { var d = c[0], b = c[1], a = e * g, f = d % a; if (f !== 0) { c[0] = d - f + (d < 0 ? -a : 0) } f = b % a; if (f !== 0) { c[1] = b - f + (b > 0 ? a : 0) } } }); Ext.define("Ext.chart.axis.segmenter.Time", { extend: "Ext.chart.axis.segmenter.Segmenter", alias: "segmenter.time", config: { step: null }, renderer: function(c, b) { var a = Ext.Date; switch (b.majorTicks.unit) { case "y": return a.format(c, "Y"); case "mo": return a.format(c, "Y-m"); case "d": return a.format(c, "Y-m-d") } return a.format(c, "Y-m-d\nH:i:s") }, from: function(a) { return new Date(a) }, diff: function(b, a, c) { if (isFinite(b)) { b = new Date(b) } if (isFinite(a)) { a = new Date(a) } return Ext.Date.diff(b, a, c) }, align: function(a, c, b) { if (b === "d" && c >= 7) { a = Ext.Date.align(a, "d", c); a.setDate(a.getDate() - a.getDay() + 1); return a } else { return Ext.Date.align(a, b, c) } }, add: function(c, b, a) { return Ext.Date.add(new Date(c), a, b) }, stepUnits: [ [Ext.Date.YEAR, 1, 2, 5, 10, 20, 50, 100, 200, 500], [Ext.Date.MONTH, 1, 3, 6], [Ext.Date.DAY, 1, 7, 14], [Ext.Date.HOUR, 1, 6, 12], [Ext.Date.MINUTE, 1, 5, 15, 30], [Ext.Date.SECOND, 1, 5, 15, 30], [Ext.Date.MILLI, 1, 2, 5, 10, 20, 50, 100, 200, 500] ], preferredStep: function(b, e) { if (this.getStep()) { return this.getStep() } var f = new Date(+b), g = new Date(+b + Math.ceil(e)), d = this.stepUnits, l, k, h, c, a; for (c = 0; c < d.length; c++) { k = d[c][0]; h = this.diff(f, g, k); if (h > 0) { for (a = 1; a < d[c].length; a++) { if (h <= d[c][a]) { l = { unit: k, step: d[c][a] }; break } } if (!l) { c--; l = { unit: d[c][0], step: 1 } } break } } if (!l) { l = { unit: Ext.Date.DAY, step: 1 } } return l } }); Ext.define("Ext.chart.axis.layout.Layout", { mixins: { observable: "Ext.mixin.Observable" }, config: { axis: null }, constructor: function(a) { this.mixins.observable.constructor.call(this, a) }, processData: function(b) { var e = this, c = e.getAxis(), f = c.getDirection(), g = c.boundSeries, a, d; if (b) { b["coordinate" + f]() } else { for (a = 0, d = g.length; a < d; a++) { g[a]["coordinate" + f]() } } }, calculateMajorTicks: function(a) { var f = this, e = a.attr, d = e.max - e.min, i = d / Math.max(1, e.length) * (e.visibleMax - e.visibleMin), h = e.min + d * e.visibleMin, b = e.min + d * e.visibleMax, g = e.estStepSize * i, c = f.snapEnds(a, e.min, e.max, g); if (c) { f.trimByRange(a, c, h, b); a.majorTicks = c } }, calculateMinorTicks: function(a) { if (this.snapMinorEnds) { a.minorTicks = this.snapMinorEnds(a) } }, calculateLayout: function(b) { var c = this, a = b.attr; if (a.length === 0) { return null } if (a.majorTicks) { c.calculateMajorTicks(b); if (a.minorTicks) { c.calculateMinorTicks(b) } } }, snapEnds: Ext.emptyFn, trimByRange: function(b, f, i, a) { var g = b.segmenter, j = f.unit, h = g.diff(f.from, i, j), d = g.diff(f.from, a, j), c = Math.max(0, Math.ceil(h / f.step)), e = Math.min(f.steps, Math.floor(d / f.step)); if (e < f.steps) { f.to = g.add(f.from, e * f.step, j) } if (f.max > a) { f.max = f.to } if (f.from < i) { f.from = g.add(f.from, c * f.step, j); while (f.from < i) { c++; f.from = g.add(f.from, f.step, j) } } if (f.min < i) { f.min = f.from } f.steps = e - c } }); Ext.define("Ext.chart.axis.layout.Discrete", { extend: "Ext.chart.axis.layout.Layout", alias: "axisLayout.discrete", isDiscrete: true, processData: function() { var f = this, d = f.getAxis(), c = d.boundSeries, g = d.getDirection(), b, e, a; f.labels = []; f.labelMap = {}; for (b = 0, e = c.length; b < e; b++) { a = c[b]; if (a["get" + g + "Axis"]() === d) { a["coordinate" + g]() } } d.getSprites()[0].setAttributes({ data: f.labels }); f.fireEvent("datachange", f.labels) }, calculateLayout: function(a) { a.data = this.labels; this.callParent([a]) }, calculateMajorTicks: function(a) { var g = this, f = a.attr, d = a.data, e = f.max - f.min, j = e / Math.max(1, f.length) * (f.visibleMax - f.visibleMin), i = f.min + e * f.visibleMin, b = f.min + e * f.visibleMax, h = f.estStepSize * j; var c = g.snapEnds(a, Math.max(0, f.min), Math.min(f.max, d.length - 1), h); if (c) { g.trimByRange(a, c, i, b); a.majorTicks = c } }, snapEnds: function(e, d, a, b) { b = Math.ceil(b); var c = Math.floor((a - d) / b), f = e.data; return { min: d, max: a, from: d, to: c * b + d, step: b, steps: c, unit: 1, getLabel: function(g) { return f[this.from + this.step * g] }, get: function(g) { return this.from + this.step * g } } }, trimByRange: function(b, f, h, a) { var i = f.unit, g = Math.ceil((h - f.from) / i) * i, d = Math.floor((a - f.from) / i) * i, c = Math.max(0, Math.ceil(g / f.step)), e = Math.min(f.steps, Math.floor(d / f.step)); if (e < f.steps) { f.to = e } if (f.max > a) { f.max = f.to } if (f.from < h && f.step > 0) { f.from = f.from + c * f.step * i; while (f.from < h) { c++; f.from += f.step * i } } if (f.min < h) { f.min = f.from } f.steps = e - c }, getCoordFor: function(c, d, a, b) { this.labels.push(c); return this.labels.length - 1 } }); Ext.define("Ext.chart.axis.layout.CombineDuplicate", { extend: "Ext.chart.axis.layout.Discrete", alias: "axisLayout.combineDuplicate", getCoordFor: function(d, e, b, c) { if (!(d in this.labelMap)) { var a = this.labelMap[d] = this.labels.length; this.labels.push(d); return a } return this.labelMap[d] } }); Ext.define("Ext.chart.axis.layout.Continuous", { extend: "Ext.chart.axis.layout.Layout", alias: "axisLayout.continuous", isContinuous: true, config: { adjustMinimumByMajorUnit: false, adjustMaximumByMajorUnit: false }, getCoordFor: function(c, d, a, b) { return +c }, snapEnds: function(a, d, i, h) { var f = a.segmenter, c = this.getAxis(), l = c.getMajorTickSteps(), e = l && f.exactStep ? f.exactStep(d, (i - d) / l) : f.preferredStep(d, h), k = e.unit, b = e.step, j = f.align(d, b, k), g = (l || f.diff(d, i, k)) + 1; return { min: f.from(d), max: f.from(i), from: j, to: f.add(j, g * b, k), step: b, steps: g, unit: k, get: function(m) { return f.add(this.from, this.step * m, k) } } }, snapMinorEnds: function(a) { var e = a.majorTicks, m = this.getAxis().getMinorTickSteps(), f = a.segmenter, d = e.min, i = e.max, k = e.from, l = e.unit, b = e.step / m, n = b * l.scale, j = k - d, c = Math.floor(j / n), h = c + Math.floor((i - e.to) / n) + 1, g = e.steps * m + h; return { min: d, max: i, from: d + j % n, to: f.add(k, g * b, l), step: b, steps: g, unit: l, get: function(o) { return (o % m + c + 1 !== 0) ? f.add(this.from, this.step * o, l) : null } } } }); Ext.define("Ext.chart.axis.Axis", { xtype: "axis", mixins: { observable: "Ext.mixin.Observable" }, requires: ["Ext.chart.axis.sprite.Axis", "Ext.chart.axis.segmenter.*", "Ext.chart.axis.layout.*"], isAxis: true, config: { position: "bottom", fields: [], label: undefined, grid: false, limits: null, renderer: null, chart: null, style: null, margin: 0, titleMargin: 4, background: null, minimum: NaN, maximum: NaN, reconcileRange: false, minZoom: 1, maxZoom: 10000, layout: "continuous", segmenter: "numeric", hidden: false, majorTickSteps: 0, minorTickSteps: 0, adjustByMajorUnit: true, title: null, increment: 0.5, length: 0, center: null, radius: null, totalAngle: Math.PI, rotation: null, labelInSpan: null, visibleRange: [0, 1], needHighPrecision: false, linkedTo: null, floating: null }, titleOffset: 0, spriteAnimationCount: 0, prevMin: 0, prevMax: 1, boundSeries: [], sprites: null, surface: null, range: null, xValues: [], yValues: [], masterAxis: null, applyRotation: function(b) { var a = Math.PI * 2; return (b % a + Math.PI) % a - Math.PI }, updateRotation: function(b) { var c = this.getSprites(), a = this.getPosition(); if (!this.getHidden() && a === "angular" && c[0]) { c[0].setAttributes({ baseRotation: b }) } }, applyTitle: function(c, b) { var a; if (Ext.isString(c)) { c = { text: c } } if (!b) { b = Ext.create("sprite.text", c); if ((a = this.getSurface())) { a.add(b) } } else { b.setAttributes(c) } return b }, applyFloating: function(b, a) { if (b === null) { b = { value: null, alongAxis: null } } else { if (Ext.isNumber(b)) { b = { value: b, alongAxis: null } } } if (Ext.isObject(b)) { if (a && a.alongAxis) { delete this.getChart().getAxis(a.alongAxis).floatingAxes[this.getId()] } return b } return a }, constructor: function(a) { var b = this, c; b.sprites = []; b.labels = []; b.floatingAxes = {}; a = a || {}; if (a.position === "angular") { a.style = a.style || {}; a.style.estStepSize = 1 } if ("id" in a) { c = a.id } else { if ("id" in b.config) { c = b.config.id } else { c = b.getId() } } b.setId(c); b.mixins.observable.constructor.apply(b, arguments) }, getAlignment: function() { switch (this.getPosition()) { case "left": case "right": return "vertical"; case "top": case "bottom": return "horizontal"; case "radial": return "radial"; case "angular": return "angular" } }, getGridAlignment: function() { switch (this.getPosition()) { case "left": case "right": return "horizontal"; case "top": case "bottom": return "vertical"; case "radial": return "circular"; case "angular": return "radial" } }, getSurface: function() { var e = this, d = e.getChart(); if (d && !e.surface) { var b = e.surface = d.getSurface(e.getId(), "axis"), c = e.gridSurface = d.getSurface("main"), a = e.getSprites()[0], f = e.getGridAlignment(); c.waitFor(b); e.getGrid(); if (e.getLimits() && f) { f = f.replace("3d", ""); e.limits = { surface: d.getSurface("overlay"), lines: new Ext.chart.Markers(), titles: new Ext.draw.sprite.Instancing() }; e.limits.lines.setTemplate({ xclass: "grid." + f }); e.limits.lines.getTemplate().setAttributes({ strokeStyle: "black" }, true); e.limits.surface.add(e.limits.lines); a.bindMarker(f + "-limit-lines", e.limits.lines); e.limitTitleTpl = new Ext.draw.sprite.Text(); e.limits.titles.setTemplate(e.limitTitleTpl); e.limits.surface.add(e.limits.titles); d.on("redraw", e.renderLimits, e) } } return e.surface }, applyGrid: function(a) { if (a === true) { return {} } return a }, updateGrid: function(b) { var e = this, d = e.getChart(); if (!d) { e.on({ chartattached: Ext.bind(e.updateGrid, e, [b]), single: true }); return } var c = e.gridSurface, a = e.getSprites()[0], f = e.getGridAlignment(), g; if (b) { g = e.gridSpriteEven; if (!g) { g = e.gridSpriteEven = new Ext.chart.Markers(); g.setTemplate({ xclass: "grid." + f }); c.add(g); a.bindMarker(f + "-even", g) } if (Ext.isObject(b)) { g.getTemplate().setAttributes(b); if (Ext.isObject(b.even)) { g.getTemplate().setAttributes(b.even) } } g = e.gridSpriteOdd; if (!g) { g = e.gridSpriteOdd = new Ext.chart.Markers(); g.setTemplate({ xclass: "grid." + f }); c.add(g); a.bindMarker(f + "-odd", g) } if (Ext.isObject(b)) { g.getTemplate().setAttributes(b); if (Ext.isObject(b.odd)) { g.getTemplate().setAttributes(b.odd) } } } }, renderLimits: function() { this.getSprites()[0].renderLimits() }, getCoordFor: function(c, d, a, b) { return this.getLayout().getCoordFor(c, d, a, b) }, applyPosition: function(a) { return a.toLowerCase() }, applyLength: function(b, a) { return b > 0 ? b : a }, applyLabel: function(b, a) { if (!a) { a = new Ext.draw.sprite.Text({}) } if (this.limitTitleTpl) { this.limitTitleTpl.setAttributes(b) } a.setAttributes(b); return a }, applyLayout: function(b, a) { b = Ext.factory(b, null, a, "axisLayout"); b.setAxis(this); return b }, applySegmenter: function(a, b) { a = Ext.factory(a, null, b, "segmenter"); a.setAxis(this); return a }, updateMinimum: function() { this.range = null }, updateMaximum: function() { this.range = null }, hideLabels: function() { this.getSprites()[0].setDirty(true); this.setLabel({ hidden: true }) }, showLabels: function() { this.getSprites()[0].setDirty(true); this.setLabel({ hidden: false }) }, renderFrame: function() { this.getSurface().renderFrame() }, updateChart: function(d, b) { var c = this, a; if (b) { b.unregister(c); b.un("serieschange", c.onSeriesChange, c); b.un("redraw", c.renderLimits, c); c.linkAxis(); c.fireEvent("chartdetached", b, c) } if (d) { d.on("serieschange", c.onSeriesChange, c); c.surface = null; a = c.getSurface(); c.getLabel().setSurface(a); a.add(c.getSprites()); a.add(c.getTitle()); d.register(c); c.fireEvent("chartattached", d, c) } }, applyBackground: function(a) { var b = Ext.ClassManager.getByAlias("sprite.rect"); return b.def.normalize(a) }, processData: function() { this.getLayout().processData(); this.range = null }, getDirection: function() { return this.getChart().getDirectionForAxis(this.getPosition()) }, isSide: function() { var a = this.getPosition(); return a === "left" || a === "right" }, applyFields: function(a) { return Ext.Array.from(a) }, applyVisibleRange: function(a, c) { this.getChart(); if (a[0] > a[1]) { var b = a[0]; a[0] = a[1]; a[0] = b } if (a[1] === a[0]) { a[1] += 1 / this.getMaxZoom() } if (a[1] > a[0] + 1) { a[0] = 0; a[1] = 1 } else { if (a[0] < 0) { a[1] -= a[0]; a[0] = 0 } else { if (a[1] > 1) { a[0] -= a[1] - 1; a[1] = 1 } } } if (c && a[0] === c[0] && a[1] === c[1]) { return undefined } return a }, updateVisibleRange: function(a) { this.fireEvent("visiblerangechange", this, a) }, onSeriesChange: function(e) { var f = this, b = e.getSeries(), j = "get" + f.getDirection() + "Axis", g = [], c, d = b.length, a, h; for (c = 0; c < d; c++) { if (this === b[c][j]()) { g.push(b[c]) } } f.boundSeries = g; a = f.getLinkedTo(); h = !Ext.isEmpty(a) && e.getAxis(a); if (h) { f.linkAxis(h) } else { f.getLayout().processData() } }, linkAxis: function(a) { var c = this; function b(f, d, e) { e.getLayout()[f]("datachange", "onDataChange", d); e[f]("rangechange", "onMasterAxisRangeChange", d) } if (c.masterAxis) { b("un", c, c.masterAxis); c.masterAxis = null } if (a) { if (a.type !== this.type) { Ext.Error.raise("Linked axes must be of the same type.") } b("on", c, a); c.onDataChange(a.getLayout().labels); c.onMasterAxisRangeChange(a, a.range); c.setStyle(Ext.apply({}, c.config.style, a.config.style)); c.setTitle(Ext.apply({}, c.config.title, a.config.title)); c.setLabel(Ext.apply({}, c.config.label, a.config.label)); c.masterAxis = a } }, onDataChange: function(a) { this.getLayout().labels = a }, onMasterAxisRangeChange: function(b, a) { this.range = a }, applyRange: function(a) { if (!a) { return this.dataRange.slice(0) } else { return [a[0] === null ? this.dataRange[0] : a[0], a[1] === null ? this.dataRange[1] : a[1]] } }, getRange: function() { var m = this; if (m.range) { return m.range } else { if (m.masterAxis) { return m.masterAxis.range } } if (Ext.isNumber(m.getMinimum() + m.getMaximum())) { return m.range = [m.getMinimum(), m.getMaximum()] } var d = Infinity, n = -Infinity, o = m.boundSeries, h = m.getLayout(), l = m.getSegmenter(), p = m.getVisibleRange(), b = "get" + m.getDirection() + "Range", a, j, g, f, e, k; for (e = 0, k = o.length; e < k; e++) { f = o[e]; var c = f[b](); if (c) { if (c[0] < d) { d = c[0] } if (c[1] > n) { n = c[1] } } } if (!isFinite(n)) { n = m.prevMax } if (!isFinite(d)) { d = m.prevMin } if (m.getLabelInSpan() || d === n) { n += m.getIncrement(); d -= m.getIncrement() } if (Ext.isNumber(m.getMinimum())) { d = m.getMinimum() } else { m.prevMin = d } if (Ext.isNumber(m.getMaximum())) { n = m.getMaximum() } else { m.prevMax = n } m.range = [Ext.Number.correctFloat(d), Ext.Number.correctFloat(n)]; if (m.getReconcileRange()) { m.reconcileRange() } if (m.getAdjustByMajorUnit() && l.adjustByMajorUnit && !m.getMajorTickSteps()) { j = Ext.Object.chain(m.getSprites()[0].attr); j.min = m.range[0]; j.max = m.range[1]; j.visibleMin = p[0]; j.visibleMax = p[1]; a = { attr: j, segmenter: l }; h.calculateLayout(a); g = a.majorTicks; if (g) { l.adjustByMajorUnit(g.step, g.unit.scale, m.range); j.min = m.range[0]; j.max = m.range[1]; delete a.majorTicks; h.calculateLayout(a); g = a.majorTicks; l.adjustByMajorUnit(g.step, g.unit.scale, m.range) } else { if (!m.hasClearRangePending) { m.hasClearRangePending = true; m.getChart().on("layout", "clearRange", m) } } } if (!Ext.Array.equals(m.range, m.oldRange || [])) { m.fireEvent("rangechange", m, m.range); m.oldRange = m.range } return m.range }, clearRange: function() { delete this.hasClearRangePending; this.range = null }, reconcileRange: function() { var e = this, g = e.getChart().getAxes(), f = e.getDirection(), b, d, c, a; if (!g) { return } for (b = 0, d = g.length; b < d; b++) { c = g[b]; a = c.getRange(); if (c === e || c.getDirection() !== f || !a || !c.getReconcileRange()) { continue } if (a[0] < e.range[0]) { e.range[0] = a[0] } if (a[1] > e.range[1]) { e.range[1] = a[1] } } }, applyStyle: function(c, b) { var a = Ext.ClassManager.getByAlias("sprite." + this.seriesType); if (a && a.def) { c = a.def.normalize(c) } b = Ext.apply(b || {}, c); return b }, themeOnlyIfConfigured: { grid: true }, updateTheme: function(d) { var i = this, k = d.getAxis(), e = i.getPosition(), o = i.getInitialConfig(), c = i.defaultConfig, g = i.getConfigurator().configs, a = k.defaults, n = k[e], h = i.themeOnlyIfConfigured, l, j, p, b, m, f; k = Ext.merge({}, a, n); for (l in k) { j = k[l]; f = g[l]; if (j !== null && j !== undefined && f) { m = o[l]; p = Ext.isObject(j); b = m === c[l]; if (p) { if (b && h[l]) { continue } j = Ext.merge({}, j, m) } if (b || p) { i[f.names.set](j) } } } }, updateCenter: function(b) { var e = this.getSprites(), a = e[0], d = b[0], c = b[1]; if (a) { a.setAttributes({ centerX: d, centerY: c }) } if (this.gridSpriteEven) { this.gridSpriteEven.getTemplate().setAttributes({ translationX: d, translationY: c, rotationCenterX: d, rotationCenterY: c }) } if (this.gridSpriteOdd) { this.gridSpriteOdd.getTemplate().setAttributes({ translationX: d, translationY: c, rotationCenterX: d, rotationCenterY: c }) } }, getSprites: function() { if (!this.getChart()) { return } var i = this, e = i.getRange(), f = i.getPosition(), g = i.getChart(), c = g.getAnimation(), d, a, b = i.getLength(), h = i.superclass; if (c === false) { c = { duration: 0 } } if (e) { a = Ext.applyIf({ position: f, axis: i, min: e[0], max: e[1], length: b, grid: i.getGrid(), hidden: i.getHidden(), titleOffset: i.titleOffset, layout: i.getLayout(), segmenter: i.getSegmenter(), totalAngle: i.getTotalAngle(), label: i.getLabel() }, i.getStyle()); if (!i.sprites.length) { while (!h.xtype) { h = h.superclass } d = Ext.create("sprite." + h.xtype, a); d.fx.setCustomDurations({ baseRotation: 0 }); d.fx.on("animationstart", "onAnimationStart", i); d.fx.on("animationend", "onAnimationEnd", i); d.setLayout(i.getLayout()); d.setSegmenter(i.getSegmenter()); d.setLabel(i.getLabel()); i.sprites.push(d); i.updateTitleSprite() } else { d = i.sprites[0]; d.setAnimation(c); d.setAttributes(a) } if (i.getRenderer()) { d.setRenderer(i.getRenderer()) } } return i.sprites }, updateTitleSprite: function() { var f = this, b = f.getLength(); if (!f.sprites[0] || !Ext.isNumber(b)) { return } var h = this.sprites[0].thickness, a = f.getSurface(), g = f.getTitle(), e = f.getPosition(), c = f.getMargin(), i = f.getTitleMargin(), d = a.roundPixel(b / 2); if (g) { switch (e) { case "top": g.setAttributes({ x: d, y: c + i / 2, textBaseline: "top", textAlign: "center" }, true); g.applyTransformations(); f.titleOffset = g.getBBox().height + i; break; case "bottom": g.setAttributes({ x: d, y: h + i / 2, textBaseline: "top", textAlign: "center" }, true); g.applyTransformations(); f.titleOffset = g.getBBox().height + i; break; case "left": g.setAttributes({ x: c + i / 2, y: d, textBaseline: "top", textAlign: "center", rotationCenterX: c + i / 2, rotationCenterY: d, rotationRads: -Math.PI / 2 }, true); g.applyTransformations(); f.titleOffset = g.getBBox().width + i; break; case "right": g.setAttributes({ x: h - c + i / 2, y: d, textBaseline: "bottom", textAlign: "center", rotationCenterX: h + i / 2, rotationCenterY: d, rotationRads: Math.PI / 2 }, true); g.applyTransformations(); f.titleOffset = g.getBBox().width + i; break } } }, onThicknessChanged: function() { this.getChart().onThicknessChanged() }, getThickness: function() { if (this.getHidden()) { return 0 } return (this.sprites[0] && this.sprites[0].thickness || 1) + this.titleOffset + this.getMargin() }, onAnimationStart: function() { this.spriteAnimationCount++; if (this.spriteAnimationCount === 1) { this.fireEvent("animationstart", this) } }, onAnimationEnd: function() { this.spriteAnimationCount--; if (this.spriteAnimationCount === 0) { this.fireEvent("animationend", this) } }, getItemId: function() { return this.getId() }, getAncestorIds: function() { return [this.getChart().getId()] }, isXType: function(a) { return a === "axis" }, resolveListenerScope: function(e) { var d = this, a = Ext._namedScopes[e], c = d.getChart(), b; if (!a) { b = c ? c.resolveListenerScope(e, false) : (e || d) } else { if (a.isThis) { b = d } else { if (a.isController) { b = c ? c.resolveListenerScope(e, false) : d } else { if (a.isSelf) { b = c ? c.resolveListenerScope(e, false) : d; if (b === c && !c.getInheritedConfig("defaultListenerScope")) { b = d } } } } } return b }, destroy: function() { var a = this; a.setChart(null); a.surface.destroy(); a.surface = null; a.callParent() } }); Ext.define("Ext.chart.LegendBase", { extend: "Ext.view.View", config: { tpl: ['
', '', '
', "', "{name}", "
", "
", "
"], nodeContainerSelector: "div." + Ext.baseCSSPrefix + "legend-container", itemSelector: "div." + Ext.baseCSSPrefix + "legend-item", docked: "bottom" }, setDocked: function(d) { var c = this, a = c.ownerCt, b; c.docked = d; switch (d) { case "top": case "bottom": c.addCls(Ext.baseCSSPrefix + "horizontal"); b = "hbox"; break; case "left": case "right": c.removeCls(Ext.baseCSSPrefix + "horizontal"); b = "vbox"; break } if (a) { a.setDocked(d) } }, setStore: function(a) { this.bindStore(a) }, clearViewEl: function() { this.callParent(arguments); Ext.removeNode(this.getNodeContainer()) }, onItemClick: function(a, c, b, d) { this.callParent(arguments); this.toggleItem(b) } }); Ext.define("Ext.chart.Legend", { xtype: "legend", extend: "Ext.chart.LegendBase", config: { baseCls: Ext.baseCSSPrefix + "legend", padding: 5, rect: null, disableSelection: true, toggleable: true }, toggleItem: function(c) { if (!this.getToggleable()) { return } var b = this.getStore(), h = 0, e, g = true, d, f, a; if (b) { f = b.getCount(); for (d = 0; d < f; d++) { a = b.getAt(d); if (a.get("disabled")) { h++ } } g = f - h > 1; a = b.getAt(c); if (a) { e = a.get("disabled"); if (e || g) { a.set("disabled", !e) } } } } }); Ext.define("Ext.chart.AbstractChart", { extend: "Ext.draw.Container", requires: ["Ext.chart.theme.Default", "Ext.chart.series.Series", "Ext.chart.interactions.Abstract", "Ext.chart.axis.Axis", "Ext.data.StoreManager", "Ext.chart.Legend", "Ext.data.Store"], isChart: true, defaultBindProperty: "store", config: { store: "ext-empty-store", theme: "default", style: null, animation: !Ext.isIE8, series: [], axes: [], legend: null, colors: null, insetPadding: { top: 10, left: 10, right: 10, bottom: 10 }, background: null, interactions: [], mainRect: null, resizeHandler: null, highlightItem: null }, animationSuspendCount: 0, chartLayoutSuspendCount: 0, axisThicknessSuspendCount: 0, isThicknessChanged: false, surfaceZIndexes: { background: 0, main: 1, grid: 2, series: 3, axis: 4, chart: 5, overlay: 6, events: 7 }, constructor: function(a) { var b = this; b.itemListeners = {}; b.surfaceMap = {}; b.chartComponents = {}; b.isInitializing = true; b.suspendChartLayout(); b.animationSuspendCount++; b.callParent(arguments); delete b.isInitializing; b.getSurface("main"); b.getSurface("chart").setFlipRtlText(b.getInherited().rtl); b.getSurface("overlay").waitFor(b.getSurface("series")); b.animationSuspendCount--; b.resumeChartLayout() }, applyAnimation: function(a, b) { if (!a) { a = { duration: 0 } } else { if (a === true) { a = { easing: "easeInOut", duration: 500 } } } return b ? Ext.apply({}, a, b) : a }, getAnimation: function() { if (this.animationSuspendCount) { return { duration: 0 } } else { return this.callParent() } }, applyInsetPadding: function(b, a) { if (!Ext.isObject(b)) { return Ext.util.Format.parseBox(b) } else { if (!a) { return b } else { return Ext.apply(a, b) } } }, suspendAnimation: function() { var d = this, c = d.getSeries(), e = c.length, b = -1, a; d.animationSuspendCount++; if (d.animationSuspendCount === 1) { while (++b < e) { a = c[b]; a.setAnimation(a.getAnimation()) } } }, resumeAnimation: function() { var d = this, c = d.getSeries(), f = c.length, b = -1, a, e; d.animationSuspendCount--; if (d.animationSuspendCount === 0) { while (++b < f) { a = c[b]; e = a.getAnimation(); a.setAnimation(e.duration && e || d.getAnimation()) } } }, suspendChartLayout: function() { this.chartLayoutSuspendCount++; if (this.chartLayoutSuspendCount === 1) { if (this.scheduledLayoutId) { this.layoutInSuspension = true; this.cancelChartLayout() } else { this.layoutInSuspension = false } } }, resumeChartLayout: function() { this.chartLayoutSuspendCount--; if (this.chartLayoutSuspendCount === 0) { if (this.layoutInSuspension) { this.scheduleLayout() } } }, cancelChartLayout: function() { if (this.scheduledLayoutId) { Ext.draw.Animator.cancel(this.scheduledLayoutId); this.scheduledLayoutId = null } }, scheduleLayout: function() { var a = this; if (a.allowSchedule() && !a.scheduledLayoutId) { a.scheduledLayoutId = Ext.draw.Animator.schedule("doScheduleLayout", a) } }, allowSchedule: function() { return true }, doScheduleLayout: function() { if (this.chartLayoutSuspendCount) { this.layoutInSuspension = true } else { this.performLayout() } }, suspendThicknessChanged: function() { this.axisThicknessSuspendCount++ }, resumeThicknessChanged: function() { if (this.axisThicknessSuspendCount > 0) { this.axisThicknessSuspendCount--; if (this.axisThicknessSuspendCount === 0 && this.isThicknessChanged) { this.onThicknessChanged() } } }, onThicknessChanged: function() { if (this.axisThicknessSuspendCount === 0) { this.isThicknessChanged = false; this.performLayout() } else { this.isThicknessChanged = true } }, applySprites: function(b) { var a = this.getSurface("chart"); b = Ext.Array.from(b); a.removeAll(true); a.add(b); return b }, initItems: function() { var a = this.items, b, d, c; if (a && !a.isMixedCollection) { this.items = []; a = Ext.Array.from(a); for (b = 0, d = a.length; b < d; b++) { c = a[b]; if (c.type) { Ext.raise("To add custom sprites to the chart use the 'sprites' config.") } else { this.items.push(c) } } } this.callParent() }, applyBackground: function(c, e) { var b = this.getSurface("background"), d, a, f; if (c) { if (e) { d = e.attr.width; a = e.attr.height; f = e.type === (c.type || "rect") } if (c.isSprite) { e = c } else { if (c.type === "image" && Ext.isString(c.src)) { if (f) { e.setAttributes({ src: c.src }) } else { b.remove(e, true); e = b.add(c) } } else { if (f) { e.setAttributes({ fillStyle: c }) } else { b.remove(e, true); e = b.add({ type: "rect", fillStyle: c, fx: { customDurations: { x: 0, y: 0, width: 0, height: 0 } } }) } } } } if (d && a) { e.setAttributes({ width: d, height: a }) } e.setAnimation(this.getAnimation()); return e }, getLegendStore: function() { return this.legendStore }, refreshLegendStore: function() { if (this.getLegendStore()) { var d, e, c = this.getSeries(), b, a = []; if (c) { for (d = 0, e = c.length; d < e; d++) { b = c[d]; if (b.getShowInLegend()) { b.provideLegendInfo(a) } } } this.getLegendStore().setData(a) } }, resetLegendStore: function() { var c = this.getLegendStore(), e, d, a, b; if (c) { e = this.getLegendStore().getData().items; for (d = 0, a = e.length; d < a; d++) { b = e[d]; b.beginEdit(); b.set("disabled", false); b.commit() } } }, onUpdateLegendStore: function(b, a) { var d = this.getSeries(), c; if (a && d) { c = d.map[a.get("series")]; if (c) { c.setHiddenByIndex(a.get("index"), a.get("disabled")); this.redraw() } } }, defaultResizeHandler: function(a) { this.scheduleLayout(); return false }, applyMainRect: function(a, b) { if (!b) { return a } this.getSeries(); this.getAxes(); if (a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]) { return b } else { return a } }, register: function(a) { var b = this.chartComponents, c = a.getId(); b[c] = a }, unregister: function(a) { var b = this.chartComponents, c = a.getId(); delete b[c] }, get: function(a) { return this.chartComponents[a] }, getAxis: function(a) { if (a instanceof Ext.chart.axis.Axis) { return a } else { if (Ext.isNumber(a)) { return this.getAxes()[a] } else { if (Ext.isString(a)) { return this.get(a) } } } }, getSurface: function(b, c) { b = b || "main"; c = c || b; var d = this, a = this.callParent([b]), f = d.surfaceZIndexes, e = d.surfaceMap; if (c in f) { a.element.setStyle("zIndex", f[c]) } if (!e[c]) { e[c] = [] } if (Ext.Array.indexOf(e[c], a) < 0) { a.type = c; e[c].push(a); a.on("destroy", d.forgetSurface, d) } return a }, forgetSurface: function(a) { var d = this.surfaceMap; if (!d || this.isDestroying) { return } var c = d[a.type], b = c ? Ext.Array.indexOf(c, a) : -1; if (b >= 0) { c.splice(b, 1) } }, applyAxes: function(b, k) { var l = this, g = { left: "right", right: "left" }, m = [], c, d, e, a, f, h, j; l.animationSuspendCount++; l.getStore(); if (!k) { k = []; k.map = {} } j = k.map; m.map = {}; b = Ext.Array.from(b, true); for (f = 0, h = b.length; f < h; f++) { c = b[f]; if (!c) { continue } if (c instanceof Ext.chart.axis.Axis) { d = j[c.getId()]; c.setChart(l) } else { c = Ext.Object.chain(c); e = c.linkedTo; a = c.id; if (Ext.isNumber(e)) { c = Ext.merge({}, b[e], c) } else { if (Ext.isString(e)) { Ext.Array.each(b, function(i) { if (i.id === c.linkedTo) { c = Ext.merge({}, i, c); return false } }) } } c.id = a; c.chart = l; if (l.getInherited().rtl) { c.position = g[c.position] || c.position } a = c.getId && c.getId() || c.id; c = Ext.factory(c, null, d = j[a], "axis") } if (c) { m.push(c); m.map[c.getId()] = c; if (!d) { c.on("animationstart", "onAnimationStart", l); c.on("animationend", "onAnimationEnd", l) } } } for (f in j) { if (!m.map[f]) { j[f].destroy() } } l.animationSuspendCount--; return m }, updateAxes: function() { if (!this.isDestroying) { this.scheduleLayout() } }, circularCopyArray: function(e, f, d) { var c = [], b, a = e && e.length; if (a) { for (b = 0; b < d; b++) { c.push(e[(f + b) % a]) } } return c }, circularCopyObject: function(f, g, d) { var c = this, b, e, a = {}; if (d) { for (b in f) { if (f.hasOwnProperty(b)) { e = f[b]; if (Ext.isArray(e)) { a[b] = c.circularCopyArray(e, g, d) } else { a[b] = e } } } } return a }, getColors: function() { var b = this, a = b.config.colors, c = b.getTheme(); if (Ext.isArray(a) && a.length > 0) { a = b.applyColors(a) } return a || (c && c.getColors()) }, applyColors: function(a) { a = Ext.Array.map(a, function(b) { if (Ext.isString(b)) { return b } else { return b.toString() } }); return a }, updateColors: function(c) { var k = this, e = k.getTheme(), a = c || (e && e.getColors()), l = 0, f = k.getSeries(), d = f && f.length, g, j, b, h; if (a.length) { for (g = 0; g < d; g++) { j = f[g]; h = j.themeColorCount(); b = k.circularCopyArray(a, l, h); l += h; j.updateChartColors(b) } } k.refreshLegendStore() }, applyTheme: function(a) { if (a && a.isTheme) { return a } return Ext.Factory.chartTheme(a) }, updateTheme: function(g) { var e = this, f = e.getAxes(), d = e.getSeries(), a = e.getColors(), c, b; e.updateChartTheme(g); for (b = 0; b < f.length; b++) { f[b].updateTheme(g) } for (b = 0; b < d.length; b++) { c = d[b]; c.updateTheme(g) } e.updateSpriteTheme(g); e.updateColors(a); e.redraw() }, themeOnlyIfConfigured: {}, updateChartTheme: function(c) { var i = this, k = c.getChart(), n = i.getInitialConfig(), b = i.defaultConfig, e = i.getConfigurator().configs, f = k.defaults, g = k[i.xtype], h = i.themeOnlyIfConfigured, l, j, o, a, m, d; k = Ext.merge({}, f, g); for (l in k) { j = k[l]; d = e[l]; if (j !== null && j !== undefined && d) { m = n[l]; o = Ext.isObject(j); a = m === b[l]; if (o) { if (a && h[l]) { continue } j = Ext.merge({}, j, m) } if (a || o) { i[d.names.set](j) } } } }, updateSpriteTheme: function(c) { this.getSprites(); var j = this, e = j.getSurface("chart"), h = e.getItems(), m = c.getSprites(), k, a, l, f, d, b, g; for (b = 0, g = h.length; b < g; b++) { k = h[b]; a = m[k.type]; if (a) { f = {}; d = k.type === "text"; for (l in a) { if (!(l in k.config)) { if (!(d && l.indexOf("font") === 0 && k.config.font)) { f[l] = a[l] } } } k.setAttributes(f) } } }, addSeries: function(b) { var a = this.getSeries(); Ext.Array.push(a, b); this.setSeries(a) }, removeSeries: function(d) { d = Ext.Array.from(d); var b = this.getSeries(), f = [], a = d.length, g = {}, c, e; for (c = 0; c < a; c++) { e = d[c]; if (typeof e !== "string") { e = e.getId() } g[e] = true } for (c = 0, a = b.length; c < a; c++) { if (!g[b[c].getId()]) { f.push(b[c]) } } this.setSeries(f) }, applySeries: function(e, d) { var g = this, j = [], h, a, c, f, b; g.animationSuspendCount++; g.getAxes(); if (d) { h = d.map } else { d = []; h = d.map = {} } j.map = {}; e = Ext.Array.from(e, true); for (c = 0, f = e.length; c < f; c++) { b = e[c]; if (!b) { continue } a = h[b.getId && b.getId() || b.id]; if (b instanceof Ext.chart.series.Series) { if (a && a !== b) { a.destroy() } b.setChart(g) } else { if (Ext.isObject(b)) { if (a) { a.setConfig(b); b = a } else { if (Ext.isString(b)) { b = { type: b } } b.chart = g; b = Ext.create(b.xclass || ("series." + b.type), b); b.on("animationstart", "onAnimationStart", g); b.on("animationend", "onAnimationEnd", g) } } } j.push(b); j.map[b.getId()] = b } for (c in h) { if (!j.map[h[c].getId()]) { h[c].destroy() } } g.animationSuspendCount--; return j }, applyLegend: function(b, a) { return Ext.factory(b, Ext.chart.Legend, a) }, updateLegend: function(b, a) { if (a) { a.destroy() } if (b) { this.getItems(); this.legendStore = new Ext.data.Store({ autoDestroy: true, fields: ["id", "name", "mark", "disabled", "series", "index"] }); b.setStore(this.legendStore); this.refreshLegendStore(); this.legendStore.on("update", "onUpdateLegendStore", this) } }, updateSeries: function(b, a) { var c = this; if (c.isDestroying) { return } c.animationSuspendCount++; c.fireEvent("serieschange", c, b, a); c.refreshLegendStore(); if (!Ext.isEmpty(b)) { c.updateTheme(c.getTheme()) } c.scheduleLayout(); c.animationSuspendCount-- }, applyInteractions: function(h, d) { if (!d) { d = []; d.map = {} } var g = this, a = [], c = d.map, e, f, b; a.map = {}; h = Ext.Array.from(h, true); for (e = 0, f = h.length; e < f; e++) { b = h[e]; if (!b) { continue } b = Ext.factory(b, null, c[b.getId && b.getId() || b.id], "interaction"); if (b) { b.setChart(g); a.push(b); a.map[b.getId()] = b } } for (e in c) { if (!a.map[e]) { c[e].destroy() } } return a }, getInteraction: function(e) { var f = this.getInteractions(), a = f && f.length, c = null, b, d; if (a) { for (d = 0; d < a; ++d) { b = f[d]; if (b.type === e) { c = b; break } } } return c }, applyStore: function(a) { return a && Ext.StoreManager.lookup(a) }, updateStore: function(a, c) { var b = this; if (c) { c.un({ datachanged: "onDataChanged", update: "onDataChanged", scope: b, order: "after" }); if (c.autoDestroy) { c.destroy() } } if (a) { a.on({ datachanged: "onDataChanged", update: "onDataChanged", scope: b, order: "after" }) } b.fireEvent("storechange", b, a, c); b.onDataChanged() }, redraw: function() { this.fireEvent("redraw", this) }, performLayout: function() { var d = this, b = d.getChartSize(true), c = [0, 0, b.width, b.height], a = d.getBackground(); d.hasFirstLayout = true; d.fireEvent("layout", d); d.cancelChartLayout(); d.getSurface("background").setRect(c); d.getSurface("chart").setRect(c); a.setAttributes({ width: b.width, height: b.height }) }, getChartSize: function(b) { var a = this; if (b) { a.chartSize = null } return a.chartSize || (a.chartSize = a.innerElement.getSize()) }, getEventXY: function(a) { return this.getSurface().getEventXY(a) }, getItemForPoint: function(h, g) { var f = this, a = f.getSeries(), e = f.getMainRect(), d = a.length, b = f.hasFirstLayout ? d - 1 : -1, c, j; if (!(e && h >= 0 && h <= e[2] && g >= 0 && g <= e[3])) { return null } for (; b >= 0; b--) { c = a[b]; j = c.getItemForPoint(h, g); if (j) { return j } } return null }, getItemsForPoint: function(h, g) { var f = this, a = f.getSeries(), d = a.length, b = f.hasFirstLayout ? d - 1 : -1, e = [], c, j; for (; b >= 0; b--) { c = a[b]; j = c.getItemForPoint(h, g); if (j) { e.push(j) } } return e }, onAnimationStart: function() { this.fireEvent("animationstart", this) }, onAnimationEnd: function() { this.fireEvent("animationend", this) }, onDataChanged: function() { var d = this; if (d.isInitializing) { return } var c = d.getMainRect(), a = d.getStore(), b = d.getSeries(), e = d.getAxes(); if (!a || !e || !b) { return } if (!c) { d.on({ redraw: d.onDataChanged, scope: d, single: true }); return } d.processData(); d.redraw() }, recordCount: 0, processData: function() { var g = this, e = g.getStore().getCount(), c = g.getSeries(), f = c.length, d = false, b = 0, a; for (; b < f; b++) { a = c[b]; a.processData(); if (!d && a.isStoreDependantColorCount) { d = true } } if (d && e > g.recordCount) { g.updateColors(g.getColors()); g.recordCount = e } }, bindStore: function(a) { this.setStore(a) }, applyHighlightItem: function(f, a) { if (f === a) { return } if (Ext.isObject(f) && Ext.isObject(a)) { var e = f, d = a, c = e.sprite && (e.sprite[0] || e.sprite), b = d.sprite && (d.sprite[0] || d.sprite); if (c === b && e.index === d.index) { return } } return f }, updateHighlightItem: function(b, a) { if (a) { a.series.setAttributesForItem(a, { highlighted: false }) } if (b) { b.series.setAttributesForItem(b, { highlighted: true }); this.fireEvent("itemhighlight", this, b, a) } this.fireEvent("itemhighlightchange", this, b, a) }, destroyChart: function() { var f = this, d = f.getLegend(), g = f.getAxes(), c = f.getSeries(), h = f.getInteractions(), b = [], a, e; f.surfaceMap = null; for (a = 0, e = h.length; a < e; a++) { h[a].destroy() } for (a = 0, e = g.length; a < e; a++) { g[a].destroy() } for (a = 0, e = c.length; a < e; a++) { c[a].destroy() } f.setInteractions(b); f.setAxes(b); f.setSeries(b); if (d) { d.destroy(); f.setLegend(null) } f.legendStore = null; f.setStore(null); f.cancelChartLayout() }, getRefItems: function(b) { var g = this, e = g.getSeries(), h = g.getAxes(), a = g.getInteractions(), c = [], d, f; for (d = 0, f = e.length; d < f; d++) { c.push(e[d]); if (e[d].getRefItems) { c.push.apply(c, e[d].getRefItems(b)) } } for (d = 0, f = h.length; d < f; d++) { c.push(h[d]); if (h[d].getRefItems) { c.push.apply(c, h[d].getRefItems(b)) } } for (d = 0, f = a.length; d < f; d++) { c.push(a[d]); if (a[d].getRefItems) { c.push.apply(c, a[d].getRefItems(b)) } } return c } }); Ext.define("Ext.chart.overrides.AbstractChart", { override: "Ext.chart.AbstractChart", updateLegend: function(b, a) { var c; this.callParent([b, a]); if (b) { c = b.docked; this.addDocked({ dock: c, xtype: "panel", shrinkWrap: true, scrollable: true, layout: { type: c === "top" || c === "bottom" ? "hbox" : "vbox", pack: "center" }, items: b, cls: Ext.baseCSSPrefix + "legend-panel" }) } }, performLayout: function() { if (this.isVisible(true)) { return this.callParent() } this.cancelChartLayout(); return false }, afterComponentLayout: function(c, a, b, d) { this.callParent([c, a, b, d]); this.scheduleLayout() }, allowSchedule: function() { return this.rendered }, onDestroy: function() { this.destroyChart(); this.callParent(arguments) } }); Ext.define("Ext.chart.grid.HorizontalGrid", { extend: "Ext.draw.sprite.Sprite", alias: "grid.horizontal", inheritableStatics: { def: { processors: { x: "number", y: "number", width: "number", height: "number" }, defaults: { x: 0, y: 0, width: 1, height: 1, strokeStyle: "#DDD" } } }, render: function(b, c, e) { var a = this.attr, f = b.roundPixel(a.y), d = c.lineWidth * 0.5; c.beginPath(); c.rect(e[0] - b.matrix.getDX(), f + d, +e[2], a.height); c.fill(); c.beginPath(); c.moveTo(e[0] - b.matrix.getDX(), f + d); c.lineTo(e[0] + e[2] - b.matrix.getDX(), f + d); c.stroke() } }); Ext.define("Ext.chart.grid.VerticalGrid", { extend: "Ext.draw.sprite.Sprite", alias: "grid.vertical", inheritableStatics: { def: { processors: { x: "number", y: "number", width: "number", height: "number" }, defaults: { x: 0, y: 0, width: 1, height: 1, strokeStyle: "#DDD" } } }, render: function(c, d, f) { var b = this.attr, a = c.roundPixel(b.x), e = d.lineWidth * 0.5; d.beginPath(); d.rect(a - e, f[1] - c.matrix.getDY(), b.width, f[3]); d.fill(); d.beginPath(); d.moveTo(a - e, f[1] - c.matrix.getDY()); d.lineTo(a - e, f[1] + f[3] - c.matrix.getDY()); d.stroke() } }); Ext.define("Ext.chart.CartesianChart", { extend: "Ext.chart.AbstractChart", alternateClassName: "Ext.chart.Chart", requires: ["Ext.chart.grid.HorizontalGrid", "Ext.chart.grid.VerticalGrid"], xtype: ["cartesian", "chart"], isCartesian: true, config: { flipXY: false, innerRect: [0, 0, 1, 1], innerPadding: { top: 0, left: 0, right: 0, bottom: 0 } }, applyInnerPadding: function(b, a) { if (!Ext.isObject(b)) { return Ext.util.Format.parseBox(b) } else { if (!a) { return b } else { return Ext.apply(a, b) } } }, getDirectionForAxis: function(a) { var b = this.getFlipXY(); if (a === "left" || a === "right") { if (b) { return "X" } else { return "Y" } } else { if (b) { return "Y" } else { return "X" } } }, performLayout: function() { var A = this; A.animationSuspendCount++; if (A.callParent() === false) { --A.animationSuspendCount; return } A.suspendThicknessChanged(); var d = A.getSurface("chart").getRect(), o = d[2], n = d[3], z = A.getAxes(), b, q = A.getSeries(), h, l, a, f = A.getInsetPadding(), v = A.getInnerPadding(), r, c, e = Ext.apply({}, f), u, p, s, k, m, y, t, x, g, j = A.getInherited().rtl, w = A.getFlipXY(); if (o <= 0 || n <= 0) { return } for (x = 0; x < z.length; x++) { b = z[x]; l = b.getSurface(); m = b.getFloating(); y = m ? m.value : null; a = b.getThickness(); switch (b.getPosition()) { case "top": l.setRect([0, e.top + 1, o, a]); break; case "bottom": l.setRect([0, n - (e.bottom + a), o, a]); break; case "left": l.setRect([e.left, 0, a, n]); break; case "right": l.setRect([o - (e.right + a), 0, a, n]); break } if (y === null) { e[b.getPosition()] += a } } o -= e.left + e.right; n -= e.top + e.bottom; u = [e.left, e.top, o, n]; e.left += v.left; e.top += v.top; e.right += v.right; e.bottom += v.bottom; p = o - v.left - v.right; s = n - v.top - v.bottom; A.setInnerRect([e.left, e.top, p, s]); if (p <= 0 || s <= 0) { return } A.setMainRect(u); A.getSurface().setRect(u); for (x = 0, g = A.surfaceMap.grid && A.surfaceMap.grid.length; x < g; x++) { c = A.surfaceMap.grid[x]; c.setRect(u); c.matrix.set(1, 0, 0, 1, v.left, v.top); c.matrix.inverse(c.inverseMatrix) } for (x = 0; x < z.length; x++) { b = z[x]; l = b.getSurface(); t = l.matrix; k = t.elements; switch (b.getPosition()) { case "top": case "bottom": k[4] = e.left; b.setLength(p); break; case "left": case "right": k[5] = e.top; b.setLength(s); break } b.updateTitleSprite(); t.inverse(l.inverseMatrix) } for (x = 0, g = q.length; x < g; x++) { h = q[x]; r = h.getSurface(); r.setRect(u); if (w) { if (j) { r.matrix.set(0, -1, -1, 0, v.left + p, v.top + s) } else { r.matrix.set(0, -1, 1, 0, v.left, v.top + s) } } else { r.matrix.set(1, 0, 0, -1, v.left, v.top + s) } r.matrix.inverse(r.inverseMatrix); h.getOverlaySurface().setRect(u) } A.redraw(); A.animationSuspendCount--; A.resumeThicknessChanged() }, refloatAxes: function() { var h = this, g = h.getAxes(), o = (g && g.length) || 0, c, d, n, f, l, b, k, r = h.getChartSize(), q = h.getInsetPadding(), p = h.getInnerPadding(), a = r.width - q.left - q.right, m = r.height - q.top - q.bottom, j, e; for (e = 0; e < o; e++) { c = g[e]; f = c.getFloating(); l = f ? f.value : null; if (l === null) { delete c.floatingAtCoord; continue } d = c.getSurface(); n = d.getRect(); if (!n) { continue } n = n.slice(); b = h.getAxis(f.alongAxis); if (b) { j = b.getAlignment() === "horizontal"; if (Ext.isString(l)) { l = b.getCoordFor(l) } b.floatingAxes[c.getId()] = l; k = b.getSprites()[0].attr.matrix; if (j) { l = l * k.getXX() + k.getDX(); c.floatingAtCoord = l + p.left + p.right } else { l = l * k.getYY() + k.getDY(); c.floatingAtCoord = l + p.top + p.bottom } } else { j = c.getAlignment() === "horizontal"; if (j) { c.floatingAtCoord = l + p.top + p.bottom } else { c.floatingAtCoord = l + p.left + p.right } l = d.roundPixel(0.01 * l * (j ? m : a)) } switch (c.getPosition()) { case "top": n[1] = q.top + p.top + l - n[3] + 1; break; case "bottom": n[1] = q.top + p.top + (b ? l : m - l); break; case "left": n[0] = q.left + p.left + l - n[2]; break; case "right": n[0] = q.left + p.left + (b ? l : a - l) - 1; break } d.setRect(n) } }, redraw: function() { var C = this, r = C.getSeries(), z = C.getAxes(), b = C.getMainRect(), p, t, w = C.getInnerPadding(), f, l, s, e, q, A, v, g, d, c, a, k, n, y = C.getFlipXY(), x = 1000, m, u, h, o, B; if (!b) { return } p = b[2] - w.left - w.right; t = b[3] - w.top - w.bottom; for (A = 0; A < r.length; A++) { h = r[A]; if ((c = h.getXAxis())) { n = c.getVisibleRange(); l = c.getRange(); l = [l[0] + (l[1] - l[0]) * n[0], l[0] + (l[1] - l[0]) * n[1]] } else { l = h.getXRange() } if ((a = h.getYAxis())) { n = a.getVisibleRange(); s = a.getRange(); s = [s[0] + (s[1] - s[0]) * n[0], s[0] + (s[1] - s[0]) * n[1]] } else { s = h.getYRange() } q = { visibleMinX: l[0], visibleMaxX: l[1], visibleMinY: s[0], visibleMaxY: s[1], innerWidth: p, innerHeight: t, flipXY: y }; f = h.getSprites(); for (v = 0, g = f.length; v < g; v++) { o = f[v]; m = o.attr.zIndex; if (m < x) { m += (A + 1) * 100 + x; o.attr.zIndex = m; B = o.getMarker("items"); if (B) { u = B.attr.zIndex; if (u === Number.MAX_VALUE) { B.attr.zIndex = m } else { if (u < x) { B.attr.zIndex = m + u } } } } o.setAttributes(q, true) } } for (A = 0; A < z.length; A++) { d = z[A]; e = d.isSide(); f = d.getSprites(); k = d.getRange(); n = d.getVisibleRange(); q = { dataMin: k[0], dataMax: k[1], visibleMin: n[0], visibleMax: n[1] }; if (e) { q.length = t; q.startGap = w.bottom; q.endGap = w.top } else { q.length = p; q.startGap = w.left; q.endGap = w.right } for (v = 0, g = f.length; v < g; v++) { f[v].setAttributes(q, true) } } C.renderFrame(); C.callParent(arguments) }, renderFrame: function() { this.refloatAxes(); this.callParent() } }); Ext.define("Ext.chart.grid.CircularGrid", { extend: "Ext.draw.sprite.Circle", alias: "grid.circular", inheritableStatics: { def: { defaults: { r: 1, strokeStyle: "#DDD" } } } }); Ext.define("Ext.chart.grid.RadialGrid", { extend: "Ext.draw.sprite.Path", alias: "grid.radial", inheritableStatics: { def: { processors: { startRadius: "number", endRadius: "number" }, defaults: { startRadius: 0, endRadius: 1, scalingCenterX: 0, scalingCenterY: 0, strokeStyle: "#DDD" }, triggers: { startRadius: "path,bbox", endRadius: "path,bbox" } } }, render: function() { this.callParent(arguments) }, updatePath: function(d, a) { var b = a.startRadius, c = a.endRadius; d.moveTo(b, 0); d.lineTo(c, 0) } }); Ext.define("Ext.chart.PolarChart", { extend: "Ext.chart.AbstractChart", requires: ["Ext.chart.grid.CircularGrid", "Ext.chart.grid.RadialGrid"], xtype: "polar", isPolar: true, config: { center: [0, 0], radius: 0, innerPadding: 0 }, getDirectionForAxis: function(a) { return a === "radial" ? "Y" : "X" }, applyCenter: function(a, b) { if (b && a[0] === b[0] && a[1] === b[1]) { return } return [+a[0], +a[1]] }, updateCenter: function(a) { var g = this, h = g.getAxes(), d = g.getSeries(), c, f, e, b; for (c = 0, f = h.length; c < f; c++) { e = h[c]; e.setCenter(a) } for (c = 0, f = d.length; c < f; c++) { b = d[c]; b.setCenter(a) } }, applyInnerPadding: function(b, a) { return Ext.isNumber(b) ? b : a }, doSetSurfaceRect: function(b, c) { var a = this.getMainRect(); b.setRect(c); b.matrix.set(1, 0, 0, 1, a[0] - c[0], a[1] - c[1]); b.inverseMatrix.set(1, 0, 0, 1, c[0] - a[0], c[1] - a[1]) }, applyAxes: function(f, h) { var e = this, g = Ext.Array.from(e.config.series)[0], b, d, c, a; if (g.type === "radar" && f && f.length) { for (b = 0, d = f.length; b < d; b++) { c = f[b]; if (c.position === "angular") { a = true; break } } if (!a) { f.push({ type: "category", position: "angular", fields: g.xField || g.angleField, style: { estStepSize: 1 }, grid: true }) } } return this.callParent(arguments) }, performLayout: function() { var F = this, g = true; try { F.animationSuspendCount++; if (this.callParent() === false) { g = false; return } F.suspendThicknessChanged(); var h = F.getSurface("chart").getRect(), v = F.getInsetPadding(), G = F.getInnerPadding(), l = Ext.apply({}, v), d, s = h[2] - v.left - v.right, r = h[3] - v.top - v.bottom, x = [v.left, v.top, s, r], u = F.getSeries(), p, t = s - G * 2, w = r - G * 2, D = [t * 0.5 + G, w * 0.5 + G], j = Math.min(t, w) * 0.5, A = F.getAxes(), f, a, k, m = [], o = [], E = j - G, z, n, b, q, y, c, C; F.setMainRect(x); F.doSetSurfaceRect(F.getSurface(), x); for (z = 0, n = F.surfaceMap.grid && F.surfaceMap.grid.length; z < n; z++) { F.doSetSurfaceRect(F.surfaceMap.grid[z], h) } for (z = 0, n = A.length; z < n; z++) { f = A[z]; switch (f.getPosition()) { case "angular": m.push(f); break; case "radial": o.push(f); break } } for (z = 0, n = m.length; z < n; z++) { f = m[z]; q = f.getFloating(); y = q ? q.value : null; F.doSetSurfaceRect(f.getSurface(), h); a = f.getThickness(); for (d in l) { l[d] += a } s = h[2] - l.left - l.right; r = h[3] - l.top - l.bottom; b = Math.min(s, r) * 0.5; if (z === 0) { E = b - G } f.setMinimum(0); f.setLength(b); f.getSprites(); k = f.sprites[0].attr.lineWidth * 0.5; for (d in l) { l[d] += k } } for (z = 0, n = o.length; z < n; z++) { f = o[z]; F.doSetSurfaceRect(f.getSurface(), h); f.setMinimum(0); f.setLength(E); f.getSprites() } for (z = 0, n = u.length; z < n; z++) { p = u[z]; if (p.type === "gauge" && !c) { c = p } else { p.setRadius(E) } F.doSetSurfaceRect(p.getSurface(), x) } F.doSetSurfaceRect(F.getSurface("overlay"), h); if (c) { c.setRect(x); C = c.getRadius() - G; F.setRadius(C); F.setCenter(c.getCenter()); c.setRadius(C); if (A.length && A[0].getPosition() === "gauge") { f = A[0]; F.doSetSurfaceRect(f.getSurface(), h); f.setTotalAngle(c.getTotalAngle()); f.setLength(C) } } else { F.setRadius(j); F.setCenter(D) } F.redraw() } catch (B) { throw B } finally { F.animationSuspendCount--; if (g) { F.resumeThicknessChanged() } } }, refloatAxes: function() { var j = this, g = j.getAxes(), h = j.getMainRect(), f, k, b, d, a, c, e; if (!h) { return } e = 0.5 * Math.min(h[2], h[3]); for (d = 0, a = g.length; d < a; d++) { c = g[d]; f = c.getFloating(); k = f ? f.value : null; if (k !== null) { b = j.getAxis(f.alongAxis); if (c.getPosition() === "angular") { if (b) { k = b.getLength() * k / b.getRange()[1] } else { k = 0.01 * k * e } c.sprites[0].setAttributes({ length: k }, true) } else { if (b) { if (Ext.isString(k)) { k = b.getCoordFor(k) } k = k / (b.getRange()[1] + 1) * Math.PI * 2 - Math.PI * 1.5 + c.getRotation() } else { k = Ext.draw.Draw.rad(k) } c.sprites[0].setAttributes({ baseRotation: k }, true) } } } }, redraw: function() { var f = this, g = f.getAxes(), d, c = f.getSeries(), b, a, e; for (a = 0, e = g.length; a < e; a++) { d = g[a]; d.getSprites() } for (a = 0, e = c.length; a < e; a++) { b = c[a]; b.getSprites() } f.renderFrame(); f.callParent(arguments) }, renderFrame: function() { this.refloatAxes(); this.callParent() } }); Ext.define("Ext.chart.SpaceFillingChart", { extend: "Ext.chart.AbstractChart", xtype: "spacefilling", config: {}, performLayout: function() { var j = this; try { j.animationSuspendCount++; if (j.callParent() === false) { return } var k = j.getSurface("chart").getRect(), l = j.getInsetPadding(), a = k[2] - l.left - l.right, m = k[3] - l.top - l.bottom, h = [l.left, l.top, a, m], b = j.getSeries(), d, c, g; j.getSurface().setRect(h); j.setMainRect(h); for (c = 0, g = b.length; c < g; c++) { d = b[c]; d.getSurface().setRect(h); if (d.setRect) { d.setRect(h) } d.getOverlaySurface().setRect(k) } j.redraw() } catch (f) { throw f } finally { j.animationSuspendCount-- } }, redraw: function() { var e = this, c = e.getSeries(), b, a, d; for (a = 0, d = c.length; a < d; a++) { b = c[a]; b.getSprites() } e.renderFrame(); e.callParent(arguments) } }); Ext.define("Ext.chart.axis.sprite.Axis3D", { extend: "Ext.chart.axis.sprite.Axis", alias: "sprite.axis3d", type: "axis3d", inheritableStatics: { def: { processors: { depth: "number" }, defaults: { depth: 0 }, triggers: { depth: "layout" } } }, config: { fx: { customDurations: { depth: 0 } } }, layoutUpdater: function() { var h = this, f = h.getAxis().getChart(); if (f.isInitializing) { return } var e = h.attr, d = h.getLayout(), c = d.isDiscrete ? 0 : e.depth, g = f.getInherited().rtl, b = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMin, i = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMax, a = { attr: e, segmenter: h.getSegmenter(), renderer: h.defaultRenderer }; if (e.position === "left" || e.position === "right") { e.translationX = 0; e.translationY = i * (e.length - c) / (i - b) + c; e.scalingX = 1; e.scalingY = (-e.length + c) / (i - b); e.scalingCenterY = 0; e.scalingCenterX = 0; h.applyTransformations(true) } else { if (e.position === "top" || e.position === "bottom") { if (g) { e.translationX = e.length + b * e.length / (i - b) + 1 } else { e.translationX = -b * e.length / (i - b) } e.translationY = 0; e.scalingX = (g ? -1 : 1) * (e.length - c) / (i - b); e.scalingY = 1; e.scalingCenterY = 0; e.scalingCenterX = 0; h.applyTransformations(true) } } if (d) { d.calculateLayout(a); h.setLayoutContext(a) } }, renderAxisLine: function(a, j, f, c) { var i = this, h = i.attr, b = h.lineWidth * 0.5, f = i.getLayout(), d = f.isDiscrete ? 0 : h.depth, k = h.position, e, g; if (h.axisLine && h.length) { switch (k) { case "left": e = a.roundPixel(c[2]) - b; j.moveTo(e, -h.endGap + d); j.lineTo(e, h.length + h.startGap); break; case "right": j.moveTo(b, -h.endGap); j.lineTo(b, h.length + h.startGap); break; case "bottom": j.moveTo(-h.startGap, b); j.lineTo(h.length - d + h.endGap, b); break; case "top": e = a.roundPixel(c[3]) - b; j.moveTo(-h.startGap, e); j.lineTo(h.length + h.endGap, e); break; case "angular": j.moveTo(h.centerX + h.length, h.centerY); j.arc(h.centerX, h.centerY, h.length, 0, Math.PI * 2, true); break; case "gauge": g = i.getGaugeAngles(); j.moveTo(h.centerX + Math.cos(g.start) * h.length, h.centerY + Math.sin(g.start) * h.length); j.arc(h.centerX, h.centerY, h.length, g.start, g.end, true); break } } } }); Ext.define("Ext.chart.axis.Axis3D", { extend: "Ext.chart.axis.Axis", xtype: "axis3d", requires: ["Ext.chart.axis.sprite.Axis3D"], config: { depth: 0 }, onSeriesChange: function(e) { var g = this, b = "depthchange", f = "onSeriesDepthChange", d, c; function a(h) { var i = g.boundSeries; for (d = 0; d < i.length; d++) { c = i[d]; c[h](b, f, g) } } a("un"); g.callParent(arguments); a("on") }, onSeriesDepthChange: function(b, f) { var d = this, g = f, e = d.boundSeries, a, c; if (f > d.getDepth()) { g = f } else { for (a = 0; a < e.length; a++) { c = e[a]; if (c !== b && c.getDepth) { f = c.getDepth(); if (f > g) { g = f } } } } d.setDepth(g) }, updateDepth: function(d) { var b = this, c = b.getSprites(), a = { depth: d }; if (c && c.length) { c[0].setAttributes(a) } if (b.gridSpriteEven && b.gridSpriteOdd) { b.gridSpriteEven.getTemplate().setAttributes(a); b.gridSpriteOdd.getTemplate().setAttributes(a) } }, getGridAlignment: function() { switch (this.getPosition()) { case "left": case "right": return "horizontal3d"; case "top": case "bottom": return "vertical3d" } } }); Ext.define("Ext.chart.axis.Category", { requires: ["Ext.chart.axis.layout.CombineDuplicate", "Ext.chart.axis.segmenter.Names"], extend: "Ext.chart.axis.Axis", alias: "axis.category", type: "category", config: { layout: "combineDuplicate", segmenter: "names" } }); Ext.define("Ext.chart.axis.Category3D", { requires: ["Ext.chart.axis.layout.CombineDuplicate", "Ext.chart.axis.segmenter.Names"], extend: "Ext.chart.axis.Axis3D", alias: "axis.category3d", type: "category3d", config: { layout: "combineDuplicate", segmenter: "names" } }); Ext.define("Ext.chart.axis.Numeric", { extend: "Ext.chart.axis.Axis", type: "numeric", alias: ["axis.numeric", "axis.radial"], requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Numeric"], config: { layout: "continuous", segmenter: "numeric", aggregator: "double" } }); Ext.define("Ext.chart.axis.Numeric3D", { extend: "Ext.chart.axis.Axis3D", alias: ["axis.numeric3d"], type: "numeric3d", requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Numeric"], config: { layout: "continuous", segmenter: "numeric", aggregator: "double" } }); Ext.define("Ext.chart.axis.Time", { extend: "Ext.chart.axis.Numeric", alias: "axis.time", type: "time", requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Time"], config: { calculateByLabelSize: true, dateFormat: null, fromDate: null, toDate: null, step: [Ext.Date.DAY, 1], layout: "continuous", segmenter: "time", aggregator: "time" }, updateDateFormat: function(a) { this.setRenderer(function(c, b) { return Ext.Date.format(new Date(b), a) }) }, updateFromDate: function(a) { this.setMinimum(+a) }, updateToDate: function(a) { this.setMaximum(+a) }, getCoordFor: function(a) { if (Ext.isString(a)) { a = new Date(a) } return +a } }); Ext.define("Ext.chart.axis.Time3D", { extend: "Ext.chart.axis.Numeric3D", alias: "axis.time3d", type: "time3d", requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Time"], config: { calculateByLabelSize: true, dateFormat: null, fromDate: null, toDate: null, step: [Ext.Date.DAY, 1], layout: "continuous", segmenter: "time", aggregator: "time" }, updateDateFormat: function(a) { this.setRenderer(function(c, b) { return Ext.Date.format(new Date(b), a) }) }, updateFromDate: function(a) { this.setMinimum(+a) }, updateToDate: function(a) { this.setMaximum(+a) }, getCoordFor: function(a) { if (Ext.isString(a)) { a = new Date(a) } return +a } }); Ext.define("Ext.chart.grid.HorizontalGrid3D", { extend: "Ext.chart.grid.HorizontalGrid", alias: "grid.horizontal3d", inheritableStatics: { def: { processors: { depth: "number" }, defaults: { depth: 0 } } }, render: function(a, k, d) { var f = this.attr, i = a.roundPixel(f.x), h = a.roundPixel(f.y), l = a.matrix.getDX(), c = k.lineWidth * 0.5, j = f.height, e = f.depth, b, g; if (h <= d[1]) { return } b = d[0] + e - l; g = h + c - e; k.beginPath(); k.rect(b, g, d[2], j); k.fill(); k.beginPath(); k.moveTo(b, g); k.lineTo(b + d[2], g); k.stroke(); b = d[0] + i - l; g = h + c; k.beginPath(); k.moveTo(b, g); k.lineTo(b + e, g - e); k.lineTo(b + e, g - e + j); k.lineTo(b, g + j); k.closePath(); k.fill(); k.beginPath(); k.moveTo(b, g); k.lineTo(b + e, g - e); k.stroke() } }); Ext.define("Ext.chart.grid.VerticalGrid3D", { extend: "Ext.chart.grid.VerticalGrid", alias: "grid.vertical3d", inheritableStatics: { def: { processors: { depth: "number" }, defaults: { depth: 0 } } }, render_: function(c, d, f) { var b = this.attr, a = c.roundPixel(b.x), e = d.lineWidth * 0.5; d.beginPath(); d.rect(a - e, f[1] - c.matrix.getDY(), b.width, f[3]); d.fill(); d.beginPath(); d.moveTo(a - e, f[1] - c.matrix.getDY()); d.lineTo(a - e, f[1] + f[3] - c.matrix.getDY()); d.stroke() }, render: function(b, j, e) { var g = this.attr, i = b.roundPixel(g.x), k = b.matrix.getDY(), d = j.lineWidth * 0.5, a = g.width, f = g.depth, c, h; if (i >= e[2]) { return } c = i - d + f; h = e[1] - f - k; j.beginPath(); j.rect(c, h, a, e[3]); j.fill(); j.beginPath(); j.moveTo(c, h); j.lineTo(c, h + e[3]); j.stroke(); c = i - d; h = e[3]; j.beginPath(); j.moveTo(c, h); j.lineTo(c + f, h - f); j.lineTo(c + f + a, h - f); j.lineTo(c + a, h); j.closePath(); j.fill(); c = i - d; h = e[3]; j.beginPath(); j.moveTo(c, h); j.lineTo(c + f, h - f); j.stroke() } }); Ext.define("Ext.chart.interactions.CrossZoom", { extend: "Ext.chart.interactions.Abstract", type: "crosszoom", alias: "interaction.crosszoom", isCrossZoom: true, config: { axes: true, gestures: { dragstart: "onGestureStart", drag: "onGesture", dragend: "onGestureEnd", dblclick: "onDoubleTap" }, undoButton: {} }, stopAnimationBeforeSync: false, zoomAnimationInProgress: false, constructor: function() { this.callParent(arguments); this.zoomHistory = [] }, applyAxes: function(b) { var a = {}; if (b === true) { return { top: {}, right: {}, bottom: {}, left: {} } } else { if (Ext.isArray(b)) { a = {}; Ext.each(b, function(c) { a[c] = {} }) } else { if (Ext.isObject(b)) { Ext.iterate(b, function(c, d) { if (d === true) { a[c] = {} } else { if (d !== false) { a[c] = d } } }) } } } return a }, applyUndoButton: function(b, a) { var c = this; if (a) { a.destroy() } if (b) { return Ext.create("Ext.Button", Ext.apply({ cls: [], text: "Undo Zoom", disabled: true, handler: function() { c.undoZoom() } }, b)) } }, getSurface: function() { return this.getChart() && this.getChart().getSurface("main") }, setSeriesOpacity: function(b) { var a = this.getChart() && this.getChart().getSurface("series"); if (a) { a.element.setStyle("opacity", b) } }, onGestureStart: function(h) { var j = this, i = j.getChart(), d = j.getSurface(), l = i.getInnerRect(), c = i.getInnerPadding(), g = c.left, b = g + l[2], f = c.top, a = f + l[3], n = i.getEventXY(h), m = n[0], k = n[1]; if (j.zoomAnimationInProgress) { return } if (m > g && m < b && k > f && k < a) { j.gestureEvent = "drag"; j.lockEvents(j.gestureEvent); j.startX = m; j.startY = k; j.selectionRect = d.add({ type: "rect", globalAlpha: 0.5, fillStyle: "rgba(80,80,140,0.5)", strokeStyle: "rgba(80,80,140,1)", lineWidth: 2, x: m, y: k, width: 0, height: 0, zIndex: 10000 }); j.setSeriesOpacity(0.8); return false } }, onGesture: function(h) { var j = this; if (j.zoomAnimationInProgress) { return } if (j.getLocks()[j.gestureEvent] === j) { var i = j.getChart(), d = j.getSurface(), l = i.getInnerRect(), c = i.getInnerPadding(), g = c.left, b = g + l[2], f = c.top, a = f + l[3], n = i.getEventXY(h), m = n[0], k = n[1]; if (m < g) { m = g } else { if (m > b) { m = b } } if (k < f) { k = f } else { if (k > a) { k = a } } j.selectionRect.setAttributes({ width: m - j.startX, height: k - j.startY }); if (Math.abs(j.startX - m) < 11 || Math.abs(j.startY - k) < 11) { j.selectionRect.setAttributes({ globalAlpha: 0.5 }) } else { j.selectionRect.setAttributes({ globalAlpha: 1 }) } d.renderFrame(); return false } }, onGestureEnd: function(i) { var l = this; if (l.zoomAnimationInProgress) { return } if (l.getLocks()[l.gestureEvent] === l) { var k = l.getChart(), d = l.getSurface(), n = k.getInnerRect(), c = k.getInnerPadding(), g = c.left, b = g + n[2], f = c.top, a = f + n[3], h = n[2], j = n[3], p = k.getEventXY(i), o = p[0], m = p[1]; if (o < g) { o = g } else { if (o > b) { o = b } } if (m < f) { m = f } else { if (m > a) { m = a } } if (Math.abs(l.startX - o) < 11 || Math.abs(l.startY - m) < 11) { d.remove(l.selectionRect) } else { l.zoomBy([Math.min(l.startX, o) / h, 1 - Math.max(l.startY, m) / j, Math.max(l.startX, o) / h, 1 - Math.min(l.startY, m) / j]); l.selectionRect.setAttributes({ x: Math.min(l.startX, o), y: Math.min(l.startY, m), width: Math.abs(l.startX - o), height: Math.abs(l.startY - m) }); l.selectionRect.setAnimation(k.getAnimation() || { duration: 0 }); l.selectionRect.setAttributes({ globalAlpha: 0, x: 0, y: 0, width: h, height: j }); l.zoomAnimationInProgress = true; k.suspendThicknessChanged(); l.selectionRect.fx.on("animationend", function() { k.resumeThicknessChanged(); d.remove(l.selectionRect); l.selectionRect = null; l.zoomAnimationInProgress = false }) } d.renderFrame(); l.sync(); l.unlockEvents(l.gestureEvent); l.setSeriesOpacity(1); if (!l.zoomAnimationInProgress) { d.remove(l.selectionRect); l.selectionRect = null } } }, zoomBy: function(o) { var n = this, a = n.getAxes(), k = n.getChart(), j = k.getAxes(), l = k.getInherited().rtl, f, d = {}, c, b; if (l) { o = o.slice(); c = 1 - o[0]; b = 1 - o[2]; o[0] = Math.min(c, b); o[2] = Math.max(c, b) } for (var h = 0; h < j.length; h++) { var g = j[h]; f = a[g.getPosition()]; if (f && f.allowZoom !== false) { var e = g.isSide(), m = g.getVisibleRange(); d[g.getId()] = m.slice(0); if (!e) { g.setVisibleRange([(m[1] - m[0]) * o[0] + m[0], (m[1] - m[0]) * o[2] + m[0]]) } else { g.setVisibleRange([(m[1] - m[0]) * o[1] + m[0], (m[1] - m[0]) * o[3] + m[0]]) } } } n.zoomHistory.push(d); n.getUndoButton().setDisabled(false) }, undoZoom: function() { var c = this.zoomHistory.pop(), d = this.getChart().getAxes(); if (c) { for (var a = 0; a < d.length; a++) { var b = d[a]; if (c[b.getId()]) { b.setVisibleRange(c[b.getId()]) } } } this.getUndoButton().setDisabled(this.zoomHistory.length === 0); this.sync() }, onDoubleTap: function(a) { this.undoZoom() }, destroy: function() { this.setUndoButton(null); this.callParent(arguments) } }); Ext.define("Ext.chart.interactions.Crosshair", { extend: "Ext.chart.interactions.Abstract", requires: ["Ext.chart.grid.HorizontalGrid", "Ext.chart.grid.VerticalGrid", "Ext.chart.CartesianChart", "Ext.chart.axis.layout.Discrete"], type: "crosshair", alias: "interaction.crosshair", config: { axes: { top: { label: {}, rect: {} }, right: { label: {}, rect: {} }, bottom: { label: {}, rect: {} }, left: { label: {}, rect: {} } }, lines: { horizontal: { strokeStyle: "black", lineDash: [5, 5] }, vertical: { strokeStyle: "black", lineDash: [5, 5] } }, gesture: "drag" }, applyAxes: function(b, a) { return Ext.merge(a || {}, b) }, applyLines: function(a, b) { return Ext.merge(b || {}, a) }, updateChart: function(a) { if (a && !a.isCartesian) { Ext.raise("Crosshair interaction can only be used on cartesian charts.") } this.callParent(arguments) }, getGestures: function() { var a = this, b = {}; b[a.getGesture()] = "onGesture"; b[a.getGesture() + "start"] = "onGestureStart"; b[a.getGesture() + "end"] = "onGestureEnd"; return b }, onGestureStart: function(N) { var m = this, O = m.getChart(), B = O.getTheme().getAxis(), A, F = O.getSurface("overlay"), s = O.getInnerRect(), n = s[2], M = s[3], r = O.getEventXY(N), D = r[0], C = r[1], E = O.getAxes(), u = m.getAxes(), h = m.getLines(), q, v, b, d, k, z, G, L, J, o, I, w, l, f, p, j, t, a, g, H, c, K; if (D > 0 && D < n && C > 0 && C < M) { m.lockEvents(m.getGesture()); H = Ext.apply({ xclass: "Ext.chart.grid.HorizontalGrid", x: 0, y: C, width: n }, h.horizontal); c = Ext.apply({ xclass: "Ext.chart.grid.VerticalGrid", x: D, y: 0, height: M }, h.vertical); m.axesLabels = m.axesLabels || {}; for (K = 0; K < E.length; K++) { q = E[K]; v = q.getSurface(); b = v.getRect(); w = q.getSprites()[0]; d = b[2]; k = b[3]; z = q.getPosition(); G = q.getAlignment(); t = q.getTitle(); a = t && t.attr.text !== "" && t.getBBox(); l = w.attr; f = w.thickness; p = l.axisLine ? l.lineWidth : 0; j = p / 2; I = Math.max(l.majorTickSize, l.minorTickSize) + p; L = m.axesLabels[z] = v.add({ type: "composite" }); L.labelRect = L.add(Ext.apply({ type: "rect", fillStyle: "white", x: z === "right" ? p : 0, y: z === "bottom" ? p : 0, width: d - p - (G === "vertical" && a ? a.width : 0), height: k - p - (G === "horizontal" && a ? a.height : 0), translationX: z === "left" && a ? a.width : 0, translationY: z === "top" && a ? a.height : 0 }, u.rect || u[z].rect)); if (G === "vertical" && !c.strokeStyle) { c.strokeStyle = l.strokeStyle } if (G === "horizontal" && !H.strokeStyle) { H.strokeStyle = l.strokeStyle } A = Ext.merge({}, B.defaults, B[z]); J = Ext.apply({}, q.config.label, A.label); o = u.label || u[z].label; L.labelText = L.add(Ext.apply(J, o, { type: "text", x: (function() { switch (z) { case "left": g = a ? a.x + a.width : 0; return g + (d - g - I) / 2 - j; case "right": g = a ? d - a.x : 0; return I + (d - I - g) / 2 + j; default: return 0 } })(), y: (function() { switch (z) { case "top": g = a ? a.y + a.height : 0; return g + (k - g - I) / 2 - j; case "bottom": g = a ? k - a.y : 0; return I + (k - I - g) / 2 + j; default: return 0 } })() })) } m.horizontalLine = F.add(H); m.verticalLine = F.add(c); return false } }, onGesture: function(G) { var K = this; if (K.getLocks()[K.getGesture()] !== K) { return } var u = K.getChart(), z = u.getSurface("overlay"), a = Ext.Array.slice(u.getInnerRect()), r = u.getInnerPadding(), t = r.left, q = r.top, E = a[2], f = a[3], d = u.getEventXY(G), k = d[0], j = d[1], D = u.getAxes(), c, h, m, p, J, w, I, H, s, b, C, g, v, n, l, A, F, o, B; if (k < 0) { k = 0 } else { if (k > E) { k = E } } if (j < 0) { j = 0 } else { if (j > f) { j = f } } k += t; j += q; for (B = 0; B < D.length; B++) { c = D[B]; h = c.getPosition(); m = c.getAlignment(); p = c.getSurface(); J = c.getSprites()[0]; w = J.attr.matrix; C = J.attr.textPadding * 2; s = K.axesLabels[h]; I = J.getLayoutContext(); H = c.getSegmenter(); if (s) { if (m === "vertical") { v = w.getYY(); l = w.getDY(); F = (j - l - q) / v; if (c.getLayout() instanceof Ext.chart.axis.layout.Discrete) { j = Math.round(F) * v + l + q; F = H.from(Math.round(F)); F = J.attr.data[F] } else { F = H.from(F) } o = H.renderer(F, I); s.setAttributes({ translationY: j - q }); s.labelText.setAttributes({ text: o }); b = s.labelText.getBBox(); s.labelRect.setAttributes({ height: b.height + C, y: -(b.height + C) / 2 }); p.renderFrame() } else { g = w.getXX(); n = w.getDX(); A = (k - n - t) / g; if (c.getLayout() instanceof Ext.chart.axis.layout.Discrete) { k = Math.round(A) * g + n + t; A = H.from(Math.round(A)); A = J.attr.data[A] } else { A = H.from(A) } o = H.renderer(A, I); s.setAttributes({ translationX: k - t }); s.labelText.setAttributes({ text: o }); b = s.labelText.getBBox(); s.labelRect.setAttributes({ width: b.width + C, x: -(b.width + C) / 2 }); p.renderFrame() } } } K.horizontalLine.setAttributes({ y: j, strokeStyle: J.attr.strokeStyle }); K.verticalLine.setAttributes({ x: k, strokeStyle: J.attr.strokeStyle }); z.renderFrame(); return false }, onGestureEnd: function(h) { var l = this, k = l.getChart(), a = k.getSurface("overlay"), j = k.getAxes(), c, g, d, b, f; a.remove(l.verticalLine); a.remove(l.horizontalLine); for (f = 0; f < j.length; f++) { c = j[f]; g = c.getPosition(); d = c.getSurface(); b = l.axesLabels[g]; if (b) { delete l.axesLabels[g]; d.remove(b) } d.renderFrame() } a.renderFrame(); l.unlockEvents(l.getGesture()) } }); Ext.define("Ext.chart.interactions.ItemHighlight", { extend: "Ext.chart.interactions.Abstract", type: "itemhighlight", alias: "interaction.itemhighlight", isItemHighlight: true, config: { gestures: { tap: "onTapGesture", mousemove: "onMouseMoveGesture", mousedown: "onMouseDownGesture", mouseup: "onMouseUpGesture", mouseleave: "onMouseUpGesture" }, sticky: false }, stickyHighlightItem: null, onMouseMoveGesture: function(g) { var d = this, h = d.tipItem, a = g.pointerType === "mouse", c, f, b; if (d.getSticky()) { return true } if (d.isDragging) { if (h && a) { h.series.hideTooltip(h); d.tipItem = null } } else { if (!d.stickyHighlightItem) { c = d.getItemForEvent(g); b = d.getChart(); if (c !== b.getHighlightItem()) { d.highlight(c); d.sync() } if (a) { if (h && (!c || h.field !== c.field || h.record !== c.record)) { h.series.hideTooltip(h); d.tipItem = h = null } if (c && (f = c.series.getTooltip())) { if (f.trackMouse || !h) { c.series.showTooltip(c, g.getXY()) } d.tipItem = c } } return false } } }, highlight: function(a) { this.getChart().setHighlightItem(a) }, showTooltip: function(b, a) { a.series.showTooltip(a, b.getXY()); this.tipItem = a }, onMouseDownGesture: function() { this.isDragging = true }, onMouseUpGesture: function() { this.isDragging = false }, onTapGesture: function(c) { var b = this; if (c.pointerType === "mouse" && !b.getSticky()) { return } var a = b.getItemForEvent(c); if (b.stickyHighlightItem && a && (b.stickyHighlightItem.index === a.index)) { a = null } b.stickyHighlightItem = a; b.highlight(a) } }); Ext.define("Ext.chart.interactions.ItemEdit", { extend: "Ext.chart.interactions.ItemHighlight", requires: ["Ext.tip.ToolTip"], type: "itemedit", alias: "interaction.itemedit", isItemEdit: true, config: { style: null, renderer: null, tooltip: true, gestures: { dragstart: "onDragStart", drag: "onDrag", dragend: "onDragEnd" }, cursors: { ewResize: "ew-resize", nsResize: "ns-resize", move: "move" } }, item: null, applyTooltip: function(b) { if (b) { var a = Ext.apply({}, b, { renderer: this.defaultTooltipRenderer, constrainPosition: true, shrinkWrapDock: true, autoHide: true, offsetX: 10, offsetY: 10 }); b = new Ext.tip.ToolTip(a) } return b }, defaultTooltipRenderer: function(b, a, f, d) { var c = []; if (f.xField) { c.push(f.xField + ": " + f.xValue) } if (f.yField) { c.push(f.yField + ": " + f.yValue) } b.setHtml(c.join("
")) }, onDragStart: function(d) { var c = this, a = c.getChart(), b = a.getHighlightItem(); if (b) { a.fireEvent("beginitemedit", a, c, c.item = b); return false } }, onDrag: function(f) { var d = this, b = d.getChart(), c = b.getHighlightItem(), a = c && c.sprite.type; if (c) { switch (a) { case "barSeries": return d.onDragBar(f); break; case "scatterSeries": return d.onDragScatter(f); break } } }, highlight: function(f) { var e = this, d = e.getChart(), a = d.getFlipXY(), g = e.getCursors(), c = f && f.sprite.type, b = d.el.dom.style; e.callParent([f]); if (f) { switch (c) { case "barSeries": if (a) { b.cursor = g.ewResize } else { b.cursor = g.nsResize } break; case "scatterSeries": b.cursor = g.move; break } } else { d.el.dom.style.cursor = "default" } }, onDragBar: function(i) { var m = this, k = m.getChart(), l = k.getInherited().rtl, f = k.isCartesian && k.getFlipXY(), q = k.getHighlightItem(), g = q.sprite.getMarker("items"), p = g.getMarkerFor(q.sprite.getId(), q.index), b = q.sprite.getSurface(), c = b.getRect(), r = b.getEventXY(i), o = q.sprite.attr.matrix, j = m.getRenderer(), a, n, d, h; if (f) { h = l ? c[2] - r[0] : r[0] } else { h = c[3] - r[1] } a = { x: p.x, y: h, width: p.width, height: p.height + (p.y - h), radius: p.radius, fillStyle: "none", lineDash: [4, 4], zIndex: 100 }; Ext.apply(a, m.getStyle()); if (Ext.isArray(q.series.getYField())) { h = h - p.y - p.height } m.target = { index: q.index, yField: q.field, yValue: (h - o.getDY()) / o.getYY() }; d = [k, { target: m.target, style: a, item: q }]; n = Ext.callback(j, null, d, 0, k); if (n) { Ext.apply(a, n) } q.sprite.putMarker("items", a, "itemedit"); m.showTooltip(i, m.target, q); b.renderFrame() }, onDragScatter: function(n) { var t = this, g = t.getChart(), d = g.getInherited().rtl, l = g.isCartesian && g.getFlipXY(), o = g.getHighlightItem(), b = o.sprite.getMarker("items"), p = b.getMarkerFor(o.sprite.getId(), o.index), j = o.sprite.getSurface(), h = j.getRect(), a = j.getEventXY(n), k = o.sprite.attr.matrix, c = o.series.getXAxis(), f = c && c.getLayout().isContinuous, i = t.getRenderer(), m, u, q, s, r; if (l) { r = d ? h[2] - a[0] : a[0] } else { r = h[3] - a[1] } if (f) { if (l) { s = h[3] - a[1] } else { s = a[0] } } else { s = p.translationX } m = { translationX: s, translationY: r, scalingX: p.scalingX, scalingY: p.scalingY, r: p.r, fillStyle: "none", lineDash: [4, 4], zIndex: 100 }; Ext.apply(m, t.getStyle()); t.target = { index: o.index, yField: o.field, yValue: (r - k.getDY()) / k.getYY() }; if (f) { Ext.apply(t.target, { xField: o.series.getXField(), xValue: (s - k.getDX()) / k.getXX() }) } q = [g, { target: t.target, style: m, item: o }]; u = Ext.callback(i, null, q, 0, g); if (u) { Ext.apply(m, u) } o.sprite.putMarker("items", m, "itemedit"); t.showTooltip(n, t.target, o); j.renderFrame() }, showTooltip: function(g, f, c) { var d = this.getTooltip(), a, b; if (d && Ext.toolkit !== "modern") { a = d.config; b = this.getChart(); Ext.callback(a.renderer, null, [d, c, f, g], 0, b); d.show([g.x + a.offsetX, g.y + a.offsetY]) } }, hideTooltip: function() { var a = this.getTooltip(); if (a && Ext.toolkit !== "modern") { a.hide() } }, onDragEnd: function(g) { var d = this, f = d.target, c = d.getChart(), b = c.getStore(), a; if (f) { a = b.getAt(f.index); if (f.yField) { a.set(f.yField, f.yValue, { convert: false }) } if (f.xField) { a.set(f.xField, f.xValue, { convert: false }) } if (f.yField || f.xField) { d.getChart().onDataChanged() } d.target = null } d.hideTooltip(); if (d.item) { c.fireEvent("enditemedit", c, d, d.item, f) } d.highlight(d.item = null) }, destroy: function() { var a = this.getConfig("tooltip", true); Ext.destroy(a); this.callParent() } }); Ext.define("Ext.chart.interactions.PanZoom", { extend: "Ext.chart.interactions.Abstract", type: "panzoom", alias: "interaction.panzoom", requires: ["Ext.draw.Animator"], config: { axes: { top: {}, right: {}, bottom: {}, left: {} }, minZoom: null, maxZoom: null, showOverflowArrows: true, panGesture: "drag", zoomGesture: "pinch", zoomOnPanGesture: false, modeToggleButton: { xtype: "segmentedbutton", width: 200, defaults: { ui: "default-toolbar" }, cls: Ext.baseCSSPrefix + "panzoom-toggle", items: [{ text: "Pan" }, { text: "Zoom" }] }, hideLabelInGesture: false }, stopAnimationBeforeSync: true, applyAxes: function(b, a) { return Ext.merge(a || {}, b) }, applyZoomOnPanGesture: function(a) { this.getChart(); if (this.isMultiTouch()) { return false } return a }, updateZoomOnPanGesture: function(b) { var a = this.getModeToggleButton(); if (!this.isMultiTouch()) { a.show(); a.setValue(b ? 1 : 0) } else { a.hide() } }, toggleMode: function() { var a = this; if (!a.isMultiTouch()) { a.setZoomOnPanGesture(!a.getZoomOnPanGesture()) } }, applyModeToggleButton: function(c, b) { var d = this, a = Ext.factory(c, "Ext.button.Segmented", b); if (!a && b) { b.destroy() } if (a && !b) { a.addListener("toggle", function(e) { d.setZoomOnPanGesture(e.getValue() === 1) }) } return a }, getGestures: function() { var c = this, e = {}, d = c.getPanGesture(), b = c.getZoomGesture(), a = Ext.supports.Touch; e[b] = "onZoomGestureMove"; e[b + "start"] = "onZoomGestureStart"; e[b + "end"] = "onZoomGestureEnd"; e[d] = "onPanGestureMove"; e[d + "start"] = "onPanGestureStart"; e[d + "end"] = "onPanGestureEnd"; e.doubletap = "onDoubleTap"; return e }, onDoubleTap: function(h) { var f = this, c = f.getChart(), g = c.getAxes(), b, a, d; for (a = 0, d = g.length; a < d; a++) { b = g[a]; b.setVisibleRange([0, 1]) } c.redraw() }, onPanGestureStart: function(d) { if (!d || !d.touches || d.touches.length < 2) { var b = this, a = b.getChart().getInnerRect(), c = b.getChart().element.getXY(); b.startX = d.getX() - c[0] - a[0]; b.startY = d.getY() - c[1] - a[1]; b.oldVisibleRanges = null; b.hideLabels(); b.getChart().suspendThicknessChanged(); b.lockEvents(b.getPanGesture()); return false } }, onPanGestureMove: function(d) { var b = this; if (b.getLocks()[b.getPanGesture()] === b) { var a = b.getChart().getInnerRect(), c = b.getChart().element.getXY(); if (b.getZoomOnPanGesture()) { b.transformAxesBy(b.getZoomableAxes(d), 0, 0, (d.getX() - c[0] - a[0]) / b.startX, b.startY / (d.getY() - c[1] - a[1])) } else { b.transformAxesBy(b.getPannableAxes(d), d.getX() - c[0] - a[0] - b.startX, d.getY() - c[1] - a[1] - b.startY, 1, 1) } b.sync(); return false } }, onPanGestureEnd: function(b) { var a = this, c = a.getPanGesture(); if (a.getLocks()[c] === a) { a.getChart().resumeThicknessChanged(); a.showLabels(); a.sync(); a.unlockEvents(c); return false } }, onZoomGestureStart: function(b) { if (b.touches && b.touches.length === 2) { var c = this, i = c.getChart().element.getXY(), f = c.getChart().getInnerRect(), h = i[0] + f[0], d = i[1] + f[1], j = [b.touches[0].point.x - h, b.touches[0].point.y - d, b.touches[1].point.x - h, b.touches[1].point.y - d], g = Math.max(44, Math.abs(j[2] - j[0])), a = Math.max(44, Math.abs(j[3] - j[1])); c.getChart().suspendThicknessChanged(); c.lastZoomDistances = [g, a]; c.lastPoints = j; c.oldVisibleRanges = null; c.hideLabels(); c.lockEvents(c.getZoomGesture()); return false } }, onZoomGestureMove: function(d) { var f = this; if (f.getLocks()[f.getZoomGesture()] === f) { var i = f.getChart().getInnerRect(), n = f.getChart().element.getXY(), k = n[0] + i[0], h = n[1] + i[1], o = Math.abs, c = f.lastPoints, m = [d.touches[0].point.x - k, d.touches[0].point.y - h, d.touches[1].point.x - k, d.touches[1].point.y - h], g = Math.max(44, o(m[2] - m[0])), b = Math.max(44, o(m[3] - m[1])), a = this.lastZoomDistances || [g, b], l = g / a[0], j = b / a[1]; f.transformAxesBy(f.getZoomableAxes(d), i[2] * (l - 1) / 2 + m[2] - c[2] * l, i[3] * (j - 1) / 2 + m[3] - c[3] * j, l, j); f.sync(); return false } }, onZoomGestureEnd: function(c) { var b = this, a = b.getZoomGesture(); if (b.getLocks()[a] === b) { b.getChart().resumeThicknessChanged(); b.showLabels(); b.sync(); b.unlockEvents(a); return false } }, hideLabels: function() { if (this.getHideLabelInGesture()) { this.eachInteractiveAxes(function(a) { a.hideLabels() }) } }, showLabels: function() { if (this.getHideLabelInGesture()) { this.eachInteractiveAxes(function(a) { a.showLabels() }) } }, isEventOnAxis: function(c, a) { var b = a.getSurface().getRect(); return b[0] <= c.getX() && c.getX() <= b[0] + b[2] && b[1] <= c.getY() && c.getY() <= b[1] + b[3] }, getPannableAxes: function(d) { var h = this, a = h.getAxes(), f = h.getChart().getAxes(), c, g = f.length, k = [], j = false, b; if (d) { for (c = 0; c < g; c++) { if (this.isEventOnAxis(d, f[c])) { j = true; break } } } for (c = 0; c < g; c++) { b = a[f[c].getPosition()]; if (b && b.allowPan !== false && (!j || this.isEventOnAxis(d, f[c]))) { k.push(f[c]) } } return k }, getZoomableAxes: function(f) { var j = this, a = j.getAxes(), g = j.getChart().getAxes(), l = [], d, h = g.length, c, k = false, b; if (f) { for (d = 0; d < h; d++) { if (this.isEventOnAxis(f, g[d])) { k = true; break } } } for (d = 0; d < h; d++) { c = g[d]; b = a[c.getPosition()]; if (b && b.allowZoom !== false && (!k || this.isEventOnAxis(f, c))) { l.push(c) } } return l }, eachInteractiveAxes: function(c) { var d = this, b = d.getAxes(), e = d.getChart().getAxes(); for (var a = 0; a < e.length; a++) { if (b[e[a].getPosition()]) { if (false === c.call(this, e[a])) { return } } } }, transformAxesBy: function(d, j, g, h, e) { var f = this.getChart().getInnerRect(), a = this.getAxes(), k, b = this.oldVisibleRanges, l = false; if (!b) { this.oldVisibleRanges = b = {}; this.eachInteractiveAxes(function(i) { b[i.getId()] = i.getVisibleRange() }) } if (!f) { return } for (var c = 0; c < d.length; c++) { k = a[d[c].getPosition()]; l = this.transformAxisBy(d[c], b[d[c].getId()], j, g, h, e, this.minZoom || k.minZoom, this.maxZoom || k.maxZoom) || l } return l }, transformAxisBy: function(c, o, r, q, k, i, h, m) { var s = this, b = o[1] - o[0], l = c.getVisibleRange(), g = h || s.getMinZoom() || c.config.minZoom, j = m || s.getMaxZoom() || c.config.maxZoom, a = s.getChart().getInnerRect(), f, p; if (!a) { return } var d = c.isSide(), e = d ? a[3] : a[2], n = d ? -q : r; b /= d ? i : k; if (b < 0) { b = -b } if (b * g > 1) { b = 1 } if (b * j < 1) { b = 1 / j } f = o[0]; p = o[1]; l = l[1] - l[0]; if (b === l && l === 1) { return } c.setVisibleRange([(o[0] + o[1] - b) * 0.5 - n / e * b, (o[0] + o[1] + b) * 0.5 - n / e * b]); return (Math.abs(f - c.getVisibleRange()[0]) > 1e-10 || Math.abs(p - c.getVisibleRange()[1]) > 1e-10) }, destroy: function() { this.setModeToggleButton(null); this.callParent() } }); Ext.define("Ext.chart.interactions.Rotate", { extend: "Ext.chart.interactions.Abstract", type: "rotate", alias: "interaction.rotate", config: { gesture: "rotate", gestures: { rotate: "onRotate", rotateend: "onRotate", dragstart: "onGestureStart", drag: "onGesture", dragend: "onGestureEnd" }, rotation: 0 }, oldRotations: null, getAngle: function(f) { var c = this, b = c.getChart(), d = b.getEventXY(f), a = b.getCenter(); return Math.atan2(d[1] - a[1], d[0] - a[0]) }, getRadius: function(a) { return this.getChart().getRadius() }, getEventRadius: function(h) { var f = this, d = f.getChart(), g = d.getEventXY(h), a = d.getCenter(), c = g[0] - a[0], b = g[1] - a[1]; return Math.sqrt(c * c + b * b) }, onGestureStart: function(d) { var c = this, b = c.getRadius(d), a = c.getEventRadius(d); if (b >= a) { c.lockEvents("drag"); c.angle = c.getAngle(d); c.oldRotations = {}; return false } }, onGesture: function(b) { var a = this, c = a.getAngle(b) - a.angle; if (a.getLocks().drag === a) { a.doRotateTo(c, true); return false } }, doRotateTo: function(d, a, b) { var n = this, l = n.getChart(), k = l.getAxes(), f = l.getSeries(), m = n.oldRotations, c, j, g, e, h; if (!b) { l.suspendAnimation() } for (e = 0, h = k.length; e < h; e++) { c = k[e]; g = m[c.getId()] || (m[c.getId()] = c.getRotation()); c.setRotation(d + (a ? g : 0)) } for (e = 0, h = f.length; e < h; e++) { j = f[e]; g = m[j.getId()] || (m[j.getId()] = j.getRotation()); j.setRotation(d + (a ? g : 0)) } n.setRotation(d + (a ? g : 0)); n.fireEvent("rotate", n, n.getRotation()); n.sync(); if (!b) { l.resumeAnimation() } }, rotateTo: function(c, b, a) { this.doRotateTo(c, b, a); this.oldRotations = {} }, onGestureEnd: function(b) { var a = this; if (a.getLocks().drag === a) { a.onGesture(b); a.unlockEvents("drag"); a.fireEvent("rotationEnd", a, a.getRotation()); return false } }, onRotate: function(a) {} }); Ext.define("Ext.chart.interactions.RotatePie3D", { extend: "Ext.chart.interactions.Rotate", type: "rotatePie3d", alias: "interaction.rotatePie3d", getAngle: function(g) { var a = this.getChart(), f = a.getInherited().rtl, d = f ? -1 : 1, h = g.getXY(), c = a.element.getXY(), b = a.getMainRect(); return d * Math.atan2(h[1] - c[1] - b[3] * 0.5, h[0] - c[0] - b[2] * 0.5) }, getRadius: function(j) { var f = this.getChart(), a = f.getRadius(), d = f.getSeries(), h = d.length, c = 0, b, g; for (; c < h; c++) { b = d[c]; if (b.isPie3D) { g = b.getRadius(); if (g > a) { a = g } } } return a } }); Ext.define("Ext.chart.plugin.ItemEvents", { extend: "Ext.plugin.Abstract", alias: "plugin.chartitemevents", moveEvents: false, mouseMoveEvents: { mousemove: true, mouseover: true, mouseout: true }, itemMouseMoveEvents: { itemmousemove: true, itemmouseover: true, itemmouseout: true }, init: function(b) { var a = "handleEvent"; this.chart = b; b.addElementListener({ click: a, dblclick: a, mousedown: a, mousemove: a, mouseup: a, mouseover: a, mouseout: a, priority: 1001, scope: this }) }, hasItemMouseMoveListeners: function() { var b = this.chart.hasListeners, a; for (a in this.itemMouseMoveEvents) { if (a in b) { return true } } return false }, handleEvent: function(g) { var d = this, a = d.chart, h = g.type in d.mouseMoveEvents, c = d.lastItem, f, b; if (h && !d.hasItemMouseMoveListeners() && !d.moveEvents) { return } f = a.getEventXY(g); b = a.getItemForPoint(f[0], f[1]); if (h && !Ext.Object.equals(b, c)) { if (c) { a.fireEvent("itemmouseout", a, c, g); c.series.fireEvent("itemmouseout", c.series, c, g) } if (b) { a.fireEvent("itemmouseover", a, b, g); b.series.fireEvent("itemmouseover", b.series, b, g) } } if (b) { a.fireEvent("item" + g.type, a, b, g); b.series.fireEvent("item" + g.type, b.series, b, g) } d.lastItem = b } }); Ext.define("Ext.chart.series.Cartesian", { extend: "Ext.chart.series.Series", config: { xField: null, yField: null, xAxis: null, yAxis: null }, directions: ["X", "Y"], fieldCategoryX: ["X"], fieldCategoryY: ["Y"], applyXAxis: function(a, b) { return this.getChart().getAxis(a) || b }, applyYAxis: function(a, b) { return this.getChart().getAxis(a) || b }, updateXAxis: function(a) { a.processData(this) }, updateYAxis: function(a) { a.processData(this) }, coordinateX: function() { return this.coordinate("X", 0, 2) }, coordinateY: function() { return this.coordinate("Y", 1, 2) }, getItemForPoint: function(a, g) { if (this.getSprites()) { var f = this, d = f.getSprites()[0], b = f.getStore(), e, c; if (f.getHidden()) { return null } if (d) { c = d.getIndexNearPoint(a, g); if (c !== -1) { e = { series: f, category: f.getItemInstancing() ? "items" : "markers", index: c, record: b.getData().items[c], field: f.getYField(), sprite: d }; return e } } } }, createSprite: function() { var c = this, a = c.callParent(), b = c.getChart(), d = c.getXAxis(); a.setAttributes({ flipXY: b.getFlipXY(), xAxis: d }); if (a.setAggregator && d && d.getAggregator) { if (d.getAggregator) { a.setAggregator({ strategy: d.getAggregator() }) } else { a.setAggregator({}) } } return a }, getSprites: function() { var d = this, c = this.getChart(), e = d.getAnimation() || c && c.getAnimation(), b = d.getItemInstancing(), f = d.sprites, a; if (!c) { return [] } if (!f.length) { a = d.createSprite() } else { a = f[0] } if (e) { if (b) { a.itemsMarker.getTemplate().setAnimation(e) } a.setAnimation(e) } return f }, provideLegendInfo: function(d) { var b = this, a = b.getSubStyleWithTheme(), c = a.fillStyle; if (Ext.isArray(c)) { c = c[0] } d.push({ name: b.getTitle() || b.getYField() || b.getId(), mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black", disabled: b.getHidden(), series: b.getId(), index: 0 }) }, getXRange: function() { return [this.dataRange[0], this.dataRange[2]] }, getYRange: function() { return [this.dataRange[1], this.dataRange[3]] } }); Ext.define("Ext.chart.series.StackedCartesian", { extend: "Ext.chart.series.Cartesian", config: { stacked: true, splitStacks: true, fullStack: false, fullStackTotal: 100, hidden: [] }, spriteAnimationCount: 0, themeColorCount: function() { var b = this, a = b.getYField(); return Ext.isArray(a) ? a.length : 1 }, updateStacked: function() { this.processData() }, updateSplitStacks: function() { this.processData() }, coordinateY: function() { return this.coordinateStacked("Y", 1, 2) }, coordinateStacked: function(D, e, m) { var F = this, f = F.getStore(), r = f.getData().items, B = r.length, c = F["get" + D + "Axis"](), x = F.getHidden(), a = F.getSplitStacks(), z = F.getFullStack(), l = F.getFullStackTotal(), p = { min: 0, max: 0 }, n = F["fieldCategory" + D], C = [], o = [], E = [], h, A = F.getStacked(), g = F.getSprites(), q = [], w, v, u, s, H, y, b, d, G, t; if (!g.length) { return } for (w = 0; w < n.length; w++) { d = n[w]; s = F.getFields([d]); H = s.length; for (v = 0; v < B; v++) { C[v] = 0; o[v] = 0; E[v] = 0 } for (v = 0; v < H; v++) { if (!x[v]) { q[v] = F.coordinateData(r, s[v], c) } } if (A && z) { y = []; if (a) { b = [] } for (v = 0; v < B; v++) { y[v] = 0; if (a) { b[v] = 0 } for (u = 0; u < H; u++) { G = q[u]; if (!G) { continue } G = G[v]; if (G >= 0 || !a) { y[v] += G } else { if (G < 0) { b[v] += G } } } } } for (v = 0; v < H; v++) { t = {}; if (x[v]) { t["dataStart" + d] = C; t["data" + d] = C; g[v].setAttributes(t); continue } G = q[v]; if (A) { h = []; for (u = 0; u < B; u++) { if (!G[u]) { G[u] = 0 } if (G[u] >= 0 || !a) { if (z && y[u]) { G[u] *= l / y[u] } C[u] = o[u]; o[u] += G[u]; h[u] = o[u] } else { if (z && b[u]) { G[u] *= l / b[u] } C[u] = E[u]; E[u] += G[u]; h[u] = E[u] } } t["dataStart" + d] = C; t["data" + d] = h; F.getRangeOfData(C, p); F.getRangeOfData(h, p) } else { t["dataStart" + d] = C; t["data" + d] = G; F.getRangeOfData(G, p) } g[v].setAttributes(t) } } F.dataRange[e] = p.min; F.dataRange[e + m] = p.max; t = {}; t["dataMin" + D] = p.min; t["dataMax" + D] = p.max; for (w = 0; w < g.length; w++) { g[w].setAttributes(t) } }, getFields: function(f) { var e = this, a = [], c, b, d; for (b = 0, d = f.length; b < d; b++) { c = e["get" + f[b] + "Field"](); if (Ext.isArray(c)) { a.push.apply(a, c) } else { a.push(c) } } return a }, updateLabelOverflowPadding: function(a) { this.getLabel().setAttributes({ labelOverflowPadding: a }) }, getSprites: function() { var k = this, j = k.getChart(), c = k.getAnimation() || j && j.getAnimation(), f = k.getFields(k.fieldCategoryY), b = k.getItemInstancing(), h = k.sprites, l, e = k.getHidden(), g = false, d, a = f.length; if (!j) { return [] } for (d = 0; d < a; d++) { l = h[d]; if (!l) { l = k.createSprite(); l.setAttributes({ zIndex: -d }); l.setField(f[d]); g = true; e.push(false); if (b) { l.itemsMarker.getTemplate().setAttributes(k.getStyleByIndex(d)) } else { l.setAttributes(k.getStyleByIndex(d)) } } if (c) { if (b) { l.itemsMarker.getTemplate().setAnimation(c) } l.setAnimation(c) } } if (g) { k.updateHidden(e) } return h }, getItemForPoint: function(k, j) { if (this.getSprites()) { var h = this, b, g, m, a = h.getItemInstancing(), f = h.getSprites(), l = h.getStore(), c = h.getHidden(), n, d, e; for (b = 0, g = f.length; b < g; b++) { if (!c[b]) { m = f[b]; d = m.getIndexNearPoint(k, j); if (d !== -1) { e = h.getYField(); n = { series: h, index: d, category: a ? "items" : "markers", record: l.getData().items[d], field: typeof e === "string" ? e : e[b], sprite: m }; return n } } } return null } }, provideLegendInfo: function(e) { var g = this, f = g.getSprites(), h = g.getTitle(), j = g.getYField(), d = g.getHidden(), k = f.length === 1, b, l, c, a; for (c = 0; c < f.length; c++) { b = g.getStyleByIndex(c); l = b.fillStyle; if (h) { if (Ext.isArray(h)) { a = h[c] } else { if (k) { a = h } } } else { if (Ext.isArray(j)) { a = j[c] } else { a = g.getId() } } e.push({ name: a, mark: (Ext.isObject(l) ? l.stops && l.stops[0].color : l) || b.strokeStyle || "black", disabled: d[c], series: g.getId(), index: c }) } }, onSpriteAnimationStart: function(a) { this.spriteAnimationCount++; if (this.spriteAnimationCount === 1) { this.fireEvent("animationstart") } }, onSpriteAnimationEnd: function(a) { this.spriteAnimationCount--; if (this.spriteAnimationCount === 0) { this.fireEvent("animationend") } } }); Ext.define("Ext.chart.series.sprite.Series", { extend: "Ext.draw.sprite.Sprite", mixins: { markerHolder: "Ext.chart.MarkerHolder" }, inheritableStatics: { def: { processors: { dataMinX: "number", dataMaxX: "number", dataMinY: "number", dataMaxY: "number", rangeX: "data", rangeY: "data", dataX: "data", dataY: "data" }, defaults: { dataMinX: 0, dataMaxX: 1, dataMinY: 0, dataMaxY: 1, rangeX: null, rangeY: null, dataX: null, dataY: null }, triggers: { dataX: "bbox", dataY: "bbox", dataMinX: "bbox", dataMaxX: "bbox", dataMinY: "bbox", dataMaxY: "bbox" } } }, config: { store: null, series: null, field: null } }); Ext.define("Ext.chart.series.sprite.Cartesian", { extend: "Ext.chart.series.sprite.Series", inheritableStatics: { def: { processors: { labels: "default", labelOverflowPadding: "number", selectionTolerance: "number", flipXY: "bool", renderer: "default", visibleMinX: "number", visibleMinY: "number", visibleMaxX: "number", visibleMaxY: "number", innerWidth: "number", innerHeight: "number" }, defaults: { labels: null, labelOverflowPadding: 10, selectionTolerance: 20, flipXY: false, renderer: null, transformFillStroke: false, visibleMinX: 0, visibleMinY: 0, visibleMaxX: 1, visibleMaxY: 1, innerWidth: 1, innerHeight: 1 }, triggers: { dataX: "dataX,bbox", dataY: "dataY,bbox", visibleMinX: "panzoom", visibleMinY: "panzoom", visibleMaxX: "panzoom", visibleMaxY: "panzoom", innerWidth: "panzoom", innerHeight: "panzoom" }, updaters: { dataX: function(a) { this.processDataX(); this.scheduleUpdater(a, "dataY", ["dataY"]) }, dataY: function() { this.processDataY() }, panzoom: function(c) { var e = c.visibleMaxX - c.visibleMinX, d = c.visibleMaxY - c.visibleMinY, b = c.flipXY ? c.innerHeight : c.innerWidth, g = !c.flipXY ? c.innerHeight : c.innerWidth, a = this.getSurface(), f = a ? a.getInherited().rtl : false; if (f && !c.flipXY) { c.translationX = b + c.visibleMinX * b / e } else { c.translationX = -c.visibleMinX * b / e } c.translationY = -c.visibleMinY * g / d; c.scalingX = (f && !c.flipXY ? -1 : 1) * b / e; c.scalingY = g / d; c.scalingCenterX = 0; c.scalingCenterY = 0; this.applyTransformations(true) } } } }, processDataY: Ext.emptyFn, processDataX: Ext.emptyFn, updatePlainBBox: function(b) { var a = this.attr; b.x = a.dataMinX; b.y = a.dataMinY; b.width = a.dataMaxX - a.dataMinX; b.height = a.dataMaxY - a.dataMinY }, binarySearch: function(d) { var b = this.attr.dataX, f = 0, a = b.length; if (d <= b[0]) { return f } if (d >= b[a - 1]) { return a - 1 } while (f + 1 < a) { var c = (f + a) >> 1, e = b[c]; if (e === d) { return c } else { if (e < d) { f = c } else { a = c } } } return f }, render: function(b, c, g) { var f = this, a = f.attr, e = a.inverseMatrix.clone(); e.appendMatrix(b.inverseMatrix); if (a.dataX === null || a.dataX === undefined) { return } if (a.dataY === null || a.dataY === undefined) { return } if (e.getXX() * e.getYX() || e.getXY() * e.getYY()) { console.log("Cartesian Series sprite does not support rotation/sheering"); return } var d = e.transformList([ [g[0] - 1, g[3] + 1], [g[0] + g[2] + 1, -1] ]); d = d[0].concat(d[1]); f.renderClipped(b, c, d, g) }, renderClipped: Ext.emptyFn, getIndexNearPoint: function(f, e) { var w = this, q = w.attr.matrix, h = w.attr.dataX, g = w.attr.dataY, k = w.attr.selectionTolerance, t, r, c = -1, j = q.clone().prependMatrix(w.surfaceMatrix).inverse(), u = j.transformPoint([f, e]), b = j.transformPoint([f - k, e - k]), n = j.transformPoint([f + k, e + k]), a = Math.min(b[0], n[0]), s = Math.max(b[0], n[0]), l = Math.min(b[1], n[1]), d = Math.max(b[1], n[1]), m, v, o, p; for (o = 0, p = h.length; o < p; o++) { m = h[o]; v = g[o]; if (m > a && m < s && v > l && v < d) { if (c === -1 || (Math.abs(m - u[0]) < t) && (Math.abs(v - u[1]) < r)) { t = Math.abs(m - u[0]); r = Math.abs(v - u[1]); c = o } } } return c } }); Ext.define("Ext.chart.series.sprite.StackedCartesian", { extend: "Ext.chart.series.sprite.Cartesian", inheritableStatics: { def: { processors: { groupCount: "number", groupOffset: "number", dataStartY: "data" }, defaults: { selectionTolerance: 20, groupCount: 1, groupOffset: 0, dataStartY: null }, triggers: { dataStartY: "dataY,bbox" } } }, getIndexNearPoint: function(e, d) { var o = this, q = o.attr.matrix, h = o.attr.dataX, f = o.attr.dataY, u = o.attr.dataStartY, l = o.attr.selectionTolerance, s = 0.5, r = Infinity, b = -1, k = q.clone().prependMatrix(this.surfaceMatrix).inverse(), t = k.transformPoint([e, d]), a = k.transformPoint([e - l, d - l]), n = k.transformPoint([e + l, d + l]), m = Math.min(a[1], n[1]), c = Math.max(a[1], n[1]), j, g; for (var p = 0; p < h.length; p++) { if (Math.min(u[p], f[p]) <= c && m <= Math.max(u[p], f[p])) { j = Math.abs(h[p] - t[0]); g = Math.max(-Math.min(f[p] - t[1], t[1] - u[p]), 0); if (j < s && g <= r) { s = j; r = g; b = p } } } return b } }); Ext.define("Ext.chart.series.sprite.Area", { alias: "sprite.areaSeries", extend: "Ext.chart.series.sprite.StackedCartesian", inheritableStatics: { def: { processors: { step: "bool" }, defaults: { step: false } } }, renderClipped: function(q, s, A) { var B = this, p = B.attr, l = p.dataX, j = p.dataY, C = p.dataStartY, t = p.matrix, h, g, v, f, d, z, w, e = t.elements[0], m = t.elements[4], o = t.elements[3], k = t.elements[5], c = B.surfaceMatrix, n = {}, r = Math.min(A[0], A[2]), u = Math.max(A[0], A[2]), b = Math.max(0, this.binarySearch(r)), a = Math.min(l.length - 1, this.binarySearch(u) + 1); s.beginPath(); z = l[b] * e + m; w = j[b] * o + k; s.moveTo(z, w); if (p.step) { d = w; for (v = b; v <= a; v++) { h = l[v] * e + m; g = j[v] * o + k; s.lineTo(h, d); s.lineTo(h, d = g) } } else { for (v = b; v <= a; v++) { h = l[v] * e + m; g = j[v] * o + k; s.lineTo(h, g) } } if (C) { if (p.step) { f = l[a] * e + m; for (v = a; v >= b; v--) { h = l[v] * e + m; g = C[v] * o + k; s.lineTo(f, g); s.lineTo(f = h, g) } } else { for (v = a; v >= b; v--) { h = l[v] * e + m; g = C[v] * o + k; s.lineTo(h, g) } } } else { s.lineTo(l[a] * e + m, g); s.lineTo(l[a] * e + m, k); s.lineTo(z, k); s.lineTo(z, j[v] * o + k) } if (p.transformFillStroke) { p.matrix.toContext(s) } s.fill(); if (p.transformFillStroke) { p.inverseMatrix.toContext(s) } s.beginPath(); s.moveTo(z, w); if (p.step) { for (v = b; v <= a; v++) { h = l[v] * e + m; g = j[v] * o + k; s.lineTo(h, d); s.lineTo(h, d = g); n.translationX = c.x(h, g); n.translationY = c.y(h, g); B.putMarker("markers", n, v, !p.renderer) } } else { for (v = b; v <= a; v++) { h = l[v] * e + m; g = j[v] * o + k; s.lineTo(h, g); n.translationX = c.x(h, g); n.translationY = c.y(h, g); B.putMarker("markers", n, v, !p.renderer) } } if (p.transformFillStroke) { p.matrix.toContext(s) } s.stroke() } }); Ext.define("Ext.chart.series.Area", { extend: "Ext.chart.series.StackedCartesian", alias: "series.area", type: "area", seriesType: "areaSeries", requires: ["Ext.chart.series.sprite.Area"], config: { splitStacks: false } }); Ext.define("Ext.chart.series.sprite.Bar", { alias: "sprite.barSeries", extend: "Ext.chart.series.sprite.StackedCartesian", inheritableStatics: { def: { processors: { minBarWidth: "number", maxBarWidth: "number", minGapWidth: "number", radius: "number", inGroupGapWidth: "number" }, defaults: { minBarWidth: 2, maxBarWidth: 100, minGapWidth: 5, inGroupGapWidth: 3, radius: 0 } } }, drawLabel: function(k, i, s, h, o) { var q = this, n = q.attr, f = q.getMarker("labels"), d = f.getTemplate(), l = q.labelCfg || (q.labelCfg = {}), c = q.surfaceMatrix, j = n.labelOverflowPadding, b = d.attr.display, m = d.attr.orientation, g, e, a, r, t, p; l.x = c.x(i, h); l.y = c.y(i, h); if (!n.flipXY) { l.rotationRads = -Math.PI * 0.5 } else { l.rotationRads = 0 } l.calloutVertical = !n.flipXY; switch (m) { case "horizontal": l.rotationRads = 0; l.calloutVertical = false; break; case "vertical": l.rotationRads = -Math.PI * 0.5; l.calloutVertical = true; break } l.text = k; if (d.attr.renderer) { p = [k, f, l, { store: q.getStore() }, o]; r = Ext.callback(d.attr.renderer, null, p, 0, q.getSeries()); if (typeof r === "string") { l.text = r } else { if (typeof r === "object") { if ("text" in r) { l.text = r.text } t = true } } } a = q.getMarkerBBox("labels", o, true); if (!a) { q.putMarker("labels", l, o); a = q.getMarkerBBox("labels", o, true) } e = (a.width / 2 + j); if (s > h) { e = -e } if ((m === "horizontal" && n.flipXY) || (m === "vertical" && !n.flipXY) || !m) { g = (b === "insideStart") ? s + e : h - e } else { g = (b === "insideStart") ? s + j * 2 : h - j * 2 } l.x = c.x(i, g); l.y = c.y(i, g); g = (b === "insideStart") ? s - e : h + e; l.calloutPlaceX = c.x(i, g); l.calloutPlaceY = c.y(i, g); g = (b === "insideStart") ? s : h; l.calloutStartX = c.x(i, g); l.calloutStartY = c.y(i, g); if (s > h) { e = -e } if (Math.abs(h - s) <= e * 2 || b === "outside") { l.callout = 1 } else { l.callout = 0 } if (t) { Ext.apply(l, r) } q.putMarker("labels", l, o) }, drawBar: function(l, b, d, c, h, k, a, e) { var g = this, j = {}, f = g.attr.renderer, i; j.x = c; j.y = h; j.width = k - c; j.height = a - h; j.radius = g.attr.radius; if (f) { i = Ext.callback(f, null, [g, j, { store: g.getStore() }, e], 0, g.getSeries()); Ext.apply(j, i) } g.putMarker("items", j, e, !f) }, renderClipped: function(G, u, F, C) { if (this.cleanRedraw) { return } var q = this, o = q.attr, w = o.dataX, v = o.dataY, H = o.labels, n = o.dataStartY, m = o.groupCount, E = o.groupOffset - (m - 1) * 0.5, z = o.inGroupGapWidth, t = u.lineWidth, D = o.matrix, B = D.elements[0], j = D.elements[3], e = D.elements[4], d = G.roundPixel(D.elements[5]) - 1, J = (B < 0 ? -1 : 1) * B - o.minGapWidth, k = (Math.min(J, o.maxBarWidth) - z * (m - 1)) / m, A = G.roundPixel(Math.max(o.minBarWidth, k)), c = q.surfaceMatrix, g, I, b, h, K, a, l = 0.5 * o.lineWidth, L = Math.min(F[0], F[2]), x = Math.max(F[0], F[2]), y = Math.max(0, Math.floor(L)), p = Math.min(w.length - 1, Math.ceil(x)), f = H && q.getMarker("labels"), s, r; for (K = y; K <= p; K++) { s = n ? n[K] : 0; r = v[K]; a = w[K] * B + e + E * (A + z); g = G.roundPixel(a - A / 2) + l; h = G.roundPixel(r * j + d + t); I = G.roundPixel(a + A / 2) - l; b = G.roundPixel(s * j + d + t); q.drawBar(u, G, F, g, h - l, I, b - l, K); if (f && H[K] != null) { q.drawLabel(H[K], a, b, h, K) } q.putMarker("markers", { translationX: c.x(a, h), translationY: c.y(a, h) }, K, true) } }, getIndexNearPoint: function(l, k) { var m = this, g = m.attr, h = g.dataX, a = m.getSurface(), b = a.getRect() || [0, 0, 0, 0], j = b[3], e, d, c, n, f = -1; if (g.flipXY) { e = j - k; if (a.getInherited().rtl) { d = b[2] - l } else { d = l } } else { e = l; d = j - k } for (c = 0; c < h.length; c++) { n = m.getMarkerBBox("items", c); if (Ext.draw.Draw.isPointInBBox(e, d, n)) { f = c; break } } return f } }); Ext.define("Ext.chart.series.Bar", { extend: "Ext.chart.series.StackedCartesian", alias: "series.bar", type: "bar", seriesType: "barSeries", requires: ["Ext.chart.series.sprite.Bar", "Ext.draw.sprite.Rect"], config: { itemInstancing: { type: "rect", fx: { customDurations: { x: 0, y: 0, width: 0, height: 0, radius: 0 } } } }, getItemForPoint: function(a, f) { if (this.getSprites()) { var d = this, c = d.getChart(), e = c.getInnerPadding(), b = c.getInherited().rtl; arguments[0] = a + (b ? e.right : -e.left); arguments[1] = f + e.bottom; return d.callParent(arguments) } }, updateXAxis: function(a) { a.setLabelInSpan(true); this.callParent(arguments) }, updateHidden: function(a) { this.callParent(arguments); this.updateStacked() }, updateStacked: function(c) { var e = this, g = e.getSprites(), d = g.length, f = [], a = {}, b; for (b = 0; b < d; b++) { if (!g[b].attr.hidden) { f.push(g[b]) } } d = f.length; if (e.getStacked()) { a.groupCount = 1; a.groupOffset = 0; for (b = 0; b < d; b++) { f[b].setAttributes(a) } } else { a.groupCount = f.length; for (b = 0; b < d; b++) { a.groupOffset = b; f[b].setAttributes(a) } } e.callParent(arguments) } }); Ext.define("Ext.chart.series.sprite.Bar3D", { extend: "Ext.chart.series.sprite.Bar", alias: "sprite.bar3dSeries", requires: ["Ext.draw.gradient.Linear"], inheritableStatics: { def: { processors: { depthWidthRatio: "number", saturationFactor: "number", brightnessFactor: "number", colorSpread: "number" }, defaults: { depthWidthRatio: 1 / 3, saturationFactor: 1, brightnessFactor: 1, colorSpread: 1, transformFillStroke: true }, triggers: { groupCount: "panzoom" }, updaters: { panzoom: function(c) { var g = this, e = c.visibleMaxX - c.visibleMinX, d = c.visibleMaxY - c.visibleMinY, b = c.flipXY ? c.innerHeight : c.innerWidth, h = !c.flipXY ? c.innerHeight : c.innerWidth, a = g.getSurface(), f = a ? a.getInherited().rtl : false; if (f && !c.flipXY) { c.translationX = b + c.visibleMinX * b / e } else { c.translationX = -c.visibleMinX * b / e } c.translationY = -c.visibleMinY * (h - g.depth) / d; c.scalingX = (f && !c.flipXY ? -1 : 1) * b / e; c.scalingY = (h - g.depth) / d; c.scalingCenterX = 0; c.scalingCenterY = 0; g.applyTransformations(true) } } } }, config: { showStroke: false }, depth: 0, drawBar: function(p, b, d, c, l, o, a, h) { var k = this, i = k.attr, n = {}, j = i.renderer, m, g, f, e; n.x = (c + o) * 0.5; n.y = l; n.width = (o - c) * 0.75; n.height = a - l; n.depth = g = n.width * i.depthWidthRatio; n.orientation = i.flipXY ? "horizontal" : "vertical"; n.saturationFactor = i.saturationFactor; n.brightnessFactor = i.brightnessFactor; n.colorSpread = i.colorSpread; if (g !== k.depth) { k.depth = g; f = k.getSeries(); f.fireEvent("depthchange", f, g) } if (j) { e = [k, n, { store: k.getStore() }, h]; m = Ext.callback(j, null, e, 0, k.getSeries()); Ext.apply(n, m) } k.putMarker("items", n, h, !j) } }); Ext.define("Ext.chart.series.sprite.Box", { extend: "Ext.draw.sprite.Sprite", alias: "sprite.box", type: "box", inheritableStatics: { def: { processors: { x: "number", y: "number", width: "number", height: "number", depth: "number", orientation: "enums(vertical,horizontal)", showStroke: "bool", saturationFactor: "number", brightnessFactor: "number", colorSpread: "number" }, triggers: { x: "bbox", y: "bbox", width: "bbox", height: "bbox", depth: "bbox", orientation: "bbox" }, defaults: { x: 0, y: 0, width: 8, height: 8, depth: 8, orientation: "vertical", showStroke: false, saturationFactor: 1, brightnessFactor: 1, colorSpread: 1, lineJoin: "bevel" } } }, constructor: function(a) { this.callParent([a]); this.topGradient = new Ext.draw.gradient.Linear({}); this.rightGradient = new Ext.draw.gradient.Linear({}); this.frontGradient = new Ext.draw.gradient.Linear({}) }, updatePlainBBox: function(d) { var c = this.attr, b = c.x, g = c.y, e = c.width, a = c.height, f = c.depth; d.x = b - e * 0.5; d.width = e + f; if (a > 0) { d.y = g; d.height = a + f } else { d.y = g + f; d.height = a - f } }, render: function(l, m) { var u = this, k = u.attr, r = k.x, j = k.y, f = j + k.height, i = j < f, e = k.width * 0.5, v = k.depth, d = k.orientation === "horizontal", g = k.globalAlpha < 1, c = k.fillStyle, n = Ext.draw.Color.create(c.isGradient ? c.getStops()[0].color : c), h = k.saturationFactor, o = k.brightnessFactor, t = k.colorSpread, b = n.getHSV(), a = {}, s, q, p; if (!k.showStroke) { m.strokeStyle = Ext.draw.Color.RGBA_NONE } if (i) { p = j; j = f; f = p } u.topGradient.setDegrees(d ? 0 : 80); u.topGradient.setStops([{ offset: 0, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 + t * 0.1) * o, 0, 1)) }, { offset: 1, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.11) * o, 0, 1)) }]); u.rightGradient.setDegrees(d ? 45 : 90); u.rightGradient.setStops([{ offset: 0, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.14) * o, 0, 1)) }, { offset: 1, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 + t * 0.4) * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.32) * o, 0, 1)) }]); if (d) { u.frontGradient.setDegrees(0) } else { u.frontGradient.setRadians(Math.atan2(j - f, e * 2)) } u.frontGradient.setStops([{ offset: 0, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 - t * 0.1) * h, 0, 1), Ext.Number.constrain((0.5 + t * 0.1) * o, 0, 1)) }, { offset: 1, color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 + t * 0.1) * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.23) * o, 0, 1)) }]); if (g || i) { m.beginPath(); m.moveTo(r - e, f); m.lineTo(r - e + v, f + v); m.lineTo(r + e + v, f + v); m.lineTo(r + e, f); m.closePath(); a.x = r - e; a.y = j; a.width = e + v; a.height = v; m.fillStyle = (d ? u.rightGradient : u.topGradient).generateGradient(m, a); m.fillStroke(k) } if (g) { m.beginPath(); m.moveTo(r - e, j); m.lineTo(r - e + v, j + v); m.lineTo(r - e + v, f + v); m.lineTo(r - e, f); m.closePath(); a.x = r + e; a.y = f; a.width = v; a.height = j + v - f; m.fillStyle = (d ? u.topGradient : u.rightGradient).generateGradient(m, a); m.fillStroke(k) } q = l.roundPixel(j); m.beginPath(); m.moveTo(r - e, q); m.lineTo(r - e + v, j + v); m.lineTo(r + e + v, j + v); m.lineTo(r + e, q); m.closePath(); a.x = r - e; a.y = j; a.width = e + v; a.height = v; m.fillStyle = (d ? u.rightGradient : u.topGradient).generateGradient(m, a); m.fillStroke(k); s = l.roundPixel(r + e); m.beginPath(); m.moveTo(s, l.roundPixel(j)); m.lineTo(r + e + v, j + v); m.lineTo(r + e + v, f + v); m.lineTo(s, f); m.closePath(); a.x = r + e; a.y = f; a.width = v; a.height = j + v - f; m.fillStyle = (d ? u.topGradient : u.rightGradient).generateGradient(m, a); m.fillStroke(k); s = l.roundPixel(r + e); q = l.roundPixel(j); m.beginPath(); m.moveTo(r - e, f); m.lineTo(r - e, q); m.lineTo(s, q); m.lineTo(s, f); m.closePath(); a.x = r - e; a.y = f; a.width = e * 2; a.height = j - f; m.fillStyle = u.frontGradient.generateGradient(m, a); m.fillStroke(k) } }); Ext.define("Ext.chart.series.Bar3D", { extend: "Ext.chart.series.Bar", requires: ["Ext.chart.series.sprite.Bar3D", "Ext.chart.series.sprite.Box"], alias: "series.bar3d", type: "bar3d", seriesType: "bar3dSeries", config: { itemInstancing: { type: "box", fx: { customDurations: { x: 0, y: 0, width: 0, height: 0, depth: 0 } } }, highlightCfg: { opacity: 0.8 } }, getSprites: function() { var c = this.callParent(arguments), b, d, a; for (a = 0; a < c.length; a++) { b = c[a]; d = b.attr.zIndex; if (d < 0) { b.setAttributes({ zIndex: -d }) } if (b.setSeries) { b.setSeries(this) } } return c }, getDepth: function() { var a = this.getSprites()[0]; return a ? (a.depth || 0) : 0 }, getItemForPoint: function(m, k) { if (this.getSprites()) { var j = this, b, o, a = j.getItemInstancing(), h = j.getSprites(), n = j.getStore(), c = j.getHidden(), g = j.getChart(), l = g.getInnerPadding(), f = g.getInherited().rtl, p, d, e; m = m + (f ? l.right : -l.left); k = k + l.bottom; for (b = h.length - 1; b >= 0; b--) { if (!c[b]) { o = h[b]; d = o.getIndexNearPoint(m, k); if (d !== -1) { e = j.getYField(); p = { series: j, index: d, category: a ? "items" : "markers", record: n.getData().items[d], field: typeof e === "string" ? e : e[b], sprite: o }; return p } } } return null } } }); Ext.define("Ext.draw.LimitedCache", { config: { limit: 40, feeder: function() { return 0 }, scope: null }, cache: null, constructor: function(a) { this.cache = {}; this.cache.list = []; this.cache.tail = 0; this.initConfig(a) }, get: function(e) { var c = this.cache, b = this.getLimit(), a = this.getFeeder(), d = this.getScope() || this; if (c[e]) { return c[e].value } if (c.list[c.tail]) { delete c[c.list[c.tail].cacheId] } c[e] = c.list[c.tail] = { value: a.apply(d, Array.prototype.slice.call(arguments, 1)), cacheId: e }; c.tail++; if (c.tail === b) { c.tail = 0 } return c[e].value }, clear: function() { this.cache = {}; this.cache.list = []; this.cache.tail = 0 } }); Ext.define("Ext.draw.SegmentTree", { config: { strategy: "double" }, time: function(m, l, n, c, E, d, e) { var f = 0, o, A, s = new Date(n[m.startIdx[0]]), x = new Date(n[m.endIdx[l - 1]]), D = Ext.Date, u = [ [D.MILLI, 1, "ms1", null], [D.MILLI, 2, "ms2", "ms1"], [D.MILLI, 5, "ms5", "ms1"], [D.MILLI, 10, "ms10", "ms5"], [D.MILLI, 50, "ms50", "ms10"], [D.MILLI, 100, "ms100", "ms50"], [D.MILLI, 500, "ms500", "ms100"], [D.SECOND, 1, "s1", "ms500"], [D.SECOND, 10, "s10", "s1"], [D.SECOND, 30, "s30", "s10"], [D.MINUTE, 1, "mi1", "s10"], [D.MINUTE, 5, "mi5", "mi1"], [D.MINUTE, 10, "mi10", "mi5"], [D.MINUTE, 30, "mi30", "mi10"], [D.HOUR, 1, "h1", "mi30"], [D.HOUR, 6, "h6", "h1"], [D.HOUR, 12, "h12", "h6"], [D.DAY, 1, "d1", "h12"], [D.DAY, 7, "d7", "d1"], [D.MONTH, 1, "mo1", "d1"], [D.MONTH, 3, "mo3", "mo1"], [D.MONTH, 6, "mo6", "mo3"], [D.YEAR, 1, "y1", "mo3"], [D.YEAR, 5, "y5", "y1"], [D.YEAR, 10, "y10", "y5"], [D.YEAR, 100, "y100", "y10"] ], z, b, k = f, F = l, j = false, r = m.startIdx, h = m.endIdx, w = m.minIdx, C = m.maxIdx, a = m.open, y = m.close, g = m.minX, q = m.minY, p = m.maxX, B = m.maxY, v, t; for (z = 0; l > f + 1 && z < u.length; z++) { s = new Date(n[r[0]]); b = u[z]; s = D.align(s, b[0], b[1]); if (D.diff(s, x, b[0]) > n.length * 2 * b[1]) { continue } if (b[3] && m.map["time_" + b[3]]) { o = m.map["time_" + b[3]][0]; A = m.map["time_" + b[3]][1] } else { o = k; A = F } f = l; t = s; j = true; r[l] = r[o]; h[l] = h[o]; w[l] = w[o]; C[l] = C[o]; a[l] = a[o]; y[l] = y[o]; g[l] = g[o]; q[l] = q[o]; p[l] = p[o]; B[l] = B[o]; t = Ext.Date.add(t, b[0], b[1]); for (v = o + 1; v < A; v++) { if (n[h[v]] < +t) { h[l] = h[v]; y[l] = y[v]; if (B[v] > B[l]) { B[l] = B[v]; p[l] = p[v]; C[l] = C[v] } if (q[v] < q[l]) { q[l] = q[v]; g[l] = g[v]; w[l] = w[v] } } else { l++; r[l] = r[v]; h[l] = h[v]; w[l] = w[v]; C[l] = C[v]; a[l] = a[v]; y[l] = y[v]; g[l] = g[v]; q[l] = q[v]; p[l] = p[v]; B[l] = B[v]; t = Ext.Date.add(t, b[0], b[1]) } } if (l > f) { m.map["time_" + b[2]] = [f, l] } } }, "double": function(h, u, j, a, t, b, c) { var e = 0, k, f = 1, n, d, v, g, s, l, m, r, q, p, o; while (u > e + 1) { k = e; e = u; f += f; for (n = k; n < e; n += 2) { if (n === e - 1) { d = h.startIdx[n]; v = h.endIdx[n]; g = h.minIdx[n]; s = h.maxIdx[n]; l = h.open[n]; m = h.close[n]; r = h.minX[n]; q = h.minY[n]; p = h.maxX[n]; o = h.maxY[n] } else { d = h.startIdx[n]; v = h.endIdx[n + 1]; l = h.open[n]; m = h.close[n]; if (h.minY[n] <= h.minY[n + 1]) { g = h.minIdx[n]; r = h.minX[n]; q = h.minY[n] } else { g = h.minIdx[n + 1]; r = h.minX[n + 1]; q = h.minY[n + 1] } if (h.maxY[n] >= h.maxY[n + 1]) { s = h.maxIdx[n]; p = h.maxX[n]; o = h.maxY[n] } else { s = h.maxIdx[n + 1]; p = h.maxX[n + 1]; o = h.maxY[n + 1] } } h.startIdx[u] = d; h.endIdx[u] = v; h.minIdx[u] = g; h.maxIdx[u] = s; h.open[u] = l; h.close[u] = m; h.minX[u] = r; h.minY[u] = q; h.maxX[u] = p; h.maxY[u] = o; u++ } h.map["double_" + f] = [e, u] } }, none: Ext.emptyFn, aggregateData: function(h, a, r, c, d) { var b = h.length, e = [], s = [], f = [], q = [], j = [], p = [], n = [], o = [], m = [], k = [], g = { startIdx: e, endIdx: s, minIdx: f, maxIdx: q, open: j, minX: p, minY: n, maxX: o, maxY: m, close: k }, l; for (l = 0; l < b; l++) { e[l] = l; s[l] = l; f[l] = l; q[l] = l; j[l] = a[l]; p[l] = h[l]; n[l] = c[l]; o[l] = h[l]; m[l] = r[l]; k[l] = d[l] } g.map = { original: [0, b] }; if (b) { this[this.getStrategy()](g, b, h, a, r, c, d) } return g }, binarySearchMin: function(c, g, a, e) { var b = this.dataX; if (e <= b[c.startIdx[0]]) { return g } if (e >= b[c.startIdx[a - 1]]) { return a - 1 } while (g + 1 < a) { var d = (g + a) >> 1, f = b[c.startIdx[d]]; if (f === e) { return d } else { if (f < e) { g = d } else { a = d } } } return g }, binarySearchMax: function(c, g, a, e) { var b = this.dataX; if (e <= b[c.endIdx[0]]) { return g } if (e >= b[c.endIdx[a - 1]]) { return a - 1 } while (g + 1 < a) { var d = (g + a) >> 1, f = b[c.endIdx[d]]; if (f === e) { return d } else { if (f < e) { g = d } else { a = d } } } return a }, constructor: function(a) { this.initConfig(a) }, setData: function(d, a, b, c, e) { if (!b) { e = c = b = a } this.dataX = d; this.dataOpen = a; this.dataHigh = b; this.dataLow = c; this.dataClose = e; if (d.length === b.length && d.length === c.length) { this.cache = this.aggregateData(d, a, b, c, e) } }, getAggregation: function(d, k, i) { if (!this.cache) { return null } var c = Infinity, g = this.dataX[this.dataX.length - 1] - this.dataX[0], l = this.cache.map, m = l.original, a, e, j, b, f, h; for (a in l) { e = l[a]; j = e[1] - e[0] - 1; b = g / j; if (i <= b && b < c) { m = e; c = b } } f = Math.max(this.binarySearchMin(this.cache, m[0], m[1], d), m[0]); h = Math.min(this.binarySearchMax(this.cache, m[0], m[1], k) + 1, m[1]); return { data: this.cache, start: f, end: h } } }); Ext.define("Ext.chart.series.sprite.Aggregative", { extend: "Ext.chart.series.sprite.Cartesian", requires: ["Ext.draw.LimitedCache", "Ext.draw.SegmentTree"], inheritableStatics: { def: { processors: { dataHigh: "data", dataLow: "data", dataClose: "data" }, aliases: { dataOpen: "dataY" }, defaults: { dataHigh: null, dataLow: null, dataClose: null } } }, config: { aggregator: {} }, applyAggregator: function(b, a) { return Ext.factory(b, Ext.draw.SegmentTree, a) }, constructor: function() { this.callParent(arguments) }, processDataY: function() { var d = this, b = d.attr, e = b.dataHigh, a = b.dataLow, f = b.dataClose, c = b.dataY; d.callParent(arguments); if (b.dataX && c && c.length > 0) { if (e) { d.getAggregator().setData(b.dataX, b.dataY, e, a, f) } else { d.getAggregator().setData(b.dataX, b.dataY) } } }, getGapWidth: function() { return 1 }, renderClipped: function(b, c, g, f) { var e = this, d = Math.min(g[0], g[2]), a = Math.max(g[0], g[2]), h = e.getAggregator() && e.getAggregator().getAggregation(d, a, (a - d) / f[2] * e.getGapWidth()); if (h) { e.dataStart = h.data.startIdx[h.start]; e.dataEnd = h.data.endIdx[h.end - 1]; e.renderAggregates(h.data, h.start, h.end, b, c, g, f) } } }); Ext.define("Ext.chart.series.sprite.CandleStick", { alias: "sprite.candlestickSeries", extend: "Ext.chart.series.sprite.Aggregative", inheritableStatics: { def: { processors: { raiseStyle: function(b, a) { return Ext.merge({}, a || {}, b) }, dropStyle: function(b, a) { return Ext.merge({}, a || {}, b) }, barWidth: "number", padding: "number", ohlcType: "enums(candlestick,ohlc)" }, defaults: { raiseStyle: { strokeStyle: "green", fillStyle: "green" }, dropStyle: { strokeStyle: "red", fillStyle: "red" }, planar: false, barWidth: 15, padding: 3, lineJoin: "miter", miterLimit: 5, ohlcType: "candlestick" }, triggers: { raiseStyle: "raiseStyle", dropStyle: "dropStyle" }, updaters: { raiseStyle: function() { this.raiseTemplate && this.raiseTemplate.setAttributes(this.attr.raiseStyle) }, dropStyle: function() { this.dropTemplate && this.dropTemplate.setAttributes(this.attr.dropStyle) } } } }, candlestick: function(i, c, a, e, h, f, b) { var d = Math.min(c, h), g = Math.max(c, h); i.moveTo(f, e); i.lineTo(f, g); i.moveTo(f + b, g); i.lineTo(f + b, d); i.lineTo(f - b, d); i.lineTo(f - b, g); i.closePath(); i.moveTo(f, a); i.lineTo(f, d) }, ohlc: function(b, d, e, a, f, c, g) { b.moveTo(c, e); b.lineTo(c, a); b.moveTo(c, d); b.lineTo(c - g, d); b.moveTo(c, f); b.lineTo(c + g, f) }, constructor: function() { this.callParent(arguments); this.raiseTemplate = new Ext.draw.sprite.Rect({ parent: this }); this.dropTemplate = new Ext.draw.sprite.Rect({ parent: this }) }, getGapWidth: function() { var a = this.attr, b = a.barWidth, c = a.padding; return b + c }, renderAggregates: function(d, c, b, t, u, z) { var D = this, s = this.attr, j = s.dataX, v = s.matrix, e = v.getXX(), r = v.getYY(), l = v.getDX(), h = v.getDY(), o = s.barWidth / e, C, k = s.ohlcType, f = Math.round(o * 0.5 * e), a = d.open, y = d.close, B = d.maxY, p = d.minY, q = d.startIdx, m, g, E, n, A, x, w = s.lineWidth * t.devicePixelRatio / 2; w -= Math.floor(w); u.save(); C = this.raiseTemplate; C.useAttributes(u, z); u.beginPath(); for (x = c; x < b; x++) { if (a[x] <= y[x]) { m = Math.round(a[x] * r + h) + w; g = Math.round(B[x] * r + h) + w; E = Math.round(p[x] * r + h) + w; n = Math.round(y[x] * r + h) + w; A = Math.round(j[q[x]] * e + l) + w; D[k](u, m, g, E, n, A, f) } } u.fillStroke(C.attr); u.restore(); u.save(); C = this.dropTemplate; C.useAttributes(u, z); u.beginPath(); for (x = c; x < b; x++) { if (a[x] > y[x]) { m = Math.round(a[x] * r + h) + w; g = Math.round(B[x] * r + h) + w; E = Math.round(p[x] * r + h) + w; n = Math.round(y[x] * r + h) + w; A = Math.round(j[q[x]] * e + l) + w; D[k](u, m, g, E, n, A, f) } } u.fillStroke(C.attr); u.restore() } }); Ext.define("Ext.chart.series.CandleStick", { extend: "Ext.chart.series.Cartesian", requires: ["Ext.chart.series.sprite.CandleStick"], alias: "series.candlestick", type: "candlestick", seriesType: "candlestickSeries", config: { openField: null, highField: null, lowField: null, closeField: null }, fieldCategoryY: ["Open", "High", "Low", "Close"], themeColorCount: function() { return 2 } }); Ext.define("Ext.chart.series.Polar", { extend: "Ext.chart.series.Series", config: { rotation: 0, radius: null, center: [0, 0], offsetX: 0, offsetY: 0, showInLegend: true, xField: null, yField: null, angleField: null, radiusField: null, xAxis: null, yAxis: null }, directions: ["X", "Y"], fieldCategoryX: ["X"], fieldCategoryY: ["Y"], deprecatedConfigs: { field: "angleField", lengthField: "radiusField" }, constructor: function(b) { var c = this, a = c.getConfigurator(), e = a.configs, d; if (b) { for (d in c.deprecatedConfigs) { if (d in b && !(b in e)) { Ext.raise("'" + d + "' config has been deprecated. Please use the '" + c.deprecatedConfigs[d] + "' config instead.") } } } c.callParent([b]) }, getXField: function() { return this.getAngleField() }, updateXField: function(a) { this.setAngleField(a) }, getYField: function() { return this.getRadiusField() }, updateYField: function(a) { this.setRadiusField(a) }, applyXAxis: function(a, b) { return this.getChart().getAxis(a) || b }, applyYAxis: function(a, b) { return this.getChart().getAxis(a) || b }, getXRange: function() { return [this.dataRange[0], this.dataRange[2]] }, getYRange: function() { return [this.dataRange[1], this.dataRange[3]] }, themeColorCount: function() { var c = this, a = c.getStore(), b = a && a.getCount() || 0; return b }, isStoreDependantColorCount: true, getDefaultSpriteConfig: function() { return { type: this.seriesType, renderer: this.getRenderer(), centerX: 0, centerY: 0, rotationCenterX: 0, rotationCenterY: 0 } }, applyRotation: function(a) { return Ext.draw.sprite.AttributeParser.angle(a) }, updateRotation: function(a) { var b = this.getSprites(); if (b && b[0]) { b[0].setAttributes({ baseRotation: a }) } } }); Ext.define("Ext.chart.series.Gauge", { alias: "series.gauge", extend: "Ext.chart.series.Polar", type: "gauge", seriesType: "pieslice", requires: ["Ext.draw.sprite.Sector"], config: { needle: false, needleLength: 90, needleWidth: 4, donut: 30, showInLegend: false, value: null, colors: null, sectors: null, minimum: 0, maximum: 100, rotation: 0, totalAngle: Math.PI / 2, rect: [0, 0, 1, 1], center: [0.5, 0.75], radius: 0.5, wholeDisk: false }, coordinateX: function() { return this.coordinate("X", 0, 2) }, coordinateY: function() { return this.coordinate("Y", 1, 2) }, updateNeedle: function(b) { var a = this, d = a.getSprites(), c = a.valueToAngle(a.getValue()); if (d && d.length) { d[0].setAttributes({ startAngle: (b ? c : 0), endAngle: c, strokeOpacity: (b ? 1 : 0), lineWidth: (b ? a.getNeedleWidth() : 0) }); a.doUpdateStyles() } }, themeColorCount: function() { var c = this, a = c.getStore(), b = a && a.getCount() || 0; return b + (c.getNeedle() ? 0 : 1) }, updateColors: function(a, b) { var f = this, h = f.getSectors(), j = h && h.length, e = f.getSprites(), c = Ext.Array.clone(a), g = a && a.length, d; if (!g || !a[0]) { return } for (d = 0; d < j; d++) { c[d + 1] = h[d].color || c[d + 1] || a[d % g] } if (e.length) { e[0].setAttributes({ strokeStyle: c[0] }) } this.setSubStyle({ fillStyle: c, strokeStyle: c }); this.doUpdateStyles() }, updateRect: function(f) { var d = this.getWholeDisk(), c = d ? Math.PI : this.getTotalAngle() / 2, g = this.getDonut() / 100, e, b, a; if (c <= Math.PI / 2) { e = 2 * Math.sin(c); b = 1 - g * Math.cos(c) } else { e = 2; b = 1 - Math.cos(c) } a = Math.min(f[2] / e, f[3] / b); this.setRadius(a); this.setCenter([f[2] / 2, a + (f[3] - b * a) / 2]) }, updateCenter: function(a) { this.setStyle({ centerX: a[0], centerY: a[1], rotationCenterX: a[0], rotationCenterY: a[1] }); this.doUpdateStyles() }, updateRotation: function(a) { this.setStyle({ rotationRads: a - (this.getTotalAngle() + Math.PI) / 2 }); this.doUpdateStyles() }, doUpdateShape: function(b, f) { var a, d = this.getSectors(), c = (d && d.length) || 0, e = this.getNeedleLength() / 100; a = [b * e, b]; while (c--) { a.push(b) } this.setSubStyle({ endRho: a, startRho: b / 100 * f }); this.doUpdateStyles() }, updateRadius: function(a) { var b = this.getDonut(); this.doUpdateShape(a, b) }, updateDonut: function(b) { var a = this.getRadius(); this.doUpdateShape(a, b) }, valueToAngle: function(a) { a = this.applyValue(a); return this.getTotalAngle() * (a - this.getMinimum()) / (this.getMaximum() - this.getMinimum()) }, applyValue: function(a) { return Math.min(this.getMaximum(), Math.max(a, this.getMinimum())) }, updateValue: function(b) { var a = this, c = a.getNeedle(), e = a.valueToAngle(b), d = a.getSprites(); d[0].rendererData.value = b; d[0].setAttributes({ startAngle: (c ? e : 0), endAngle: e }); a.doUpdateStyles() }, processData: function() { var f = this, j = f.getStore(), a, d, h, b, g, e = j && j.first(), c, i; if (e) { c = f.getXField(); if (c) { i = e.get(c) } } if (a = f.getXAxis()) { d = a.getMinimum(); h = a.getMaximum(); b = a.getSprites()[0].fx; g = b.getDuration(); b.setDuration(0); if (Ext.isNumber(d)) { f.setMinimum(d) } else { a.setMinimum(f.getMinimum()) } if (Ext.isNumber(h)) { f.setMaximum(h) } else { a.setMaximum(f.getMaximum()) } b.setDuration(g) } if (!Ext.isNumber(i)) { i = f.getMinimum() } f.setValue(i) }, getDefaultSpriteConfig: function() { return { type: this.seriesType, renderer: this.getRenderer(), fx: { customDurations: { translationX: 0, translationY: 0, rotationCenterX: 0, rotationCenterY: 0, centerX: 0, centerY: 0, startRho: 0, endRho: 0, baseRotation: 0 } } } }, normalizeSectors: function(f) { var d = this, c = (f && f.length) || 0, b, e, g, a; if (c) { for (b = 0; b < c; b++) { e = f[b]; if (typeof e === "number") { f[b] = { start: (b > 0 ? f[b - 1].end : d.getMinimum()), end: Math.min(e, d.getMaximum()) }; if (b == (c - 1) && f[b].end < d.getMaximum()) { f[b + 1] = { start: f[b].end, end: d.getMaximum() } } } else { if (typeof e.start === "number") { g = Math.max(e.start, d.getMinimum()) } else { g = (b > 0 ? f[b - 1].end : d.getMinimum()) } if (typeof e.end === "number") { a = Math.min(e.end, d.getMaximum()) } else { a = d.getMaximum() } f[b].start = g; f[b].end = a } } } else { f = [{ start: d.getMinimum(), end: d.getMaximum() }] } return f }, getSprites: function() { var j = this, m = j.getStore(), l = j.getValue(), c, g; if (!m && !Ext.isNumber(l)) { return [] } var h = j.getChart(), b = j.getAnimation() || h && h.getAnimation(), f = j.sprites, k = 0, o, n, e, d, a = []; if (f && f.length) { f[0].setAnimation(b); return f } d = { store: m, field: j.getXField(), angleField: j.getXField(), value: l, series: j }; o = j.createSprite(); o.setAttributes({ zIndex: 10 }, true); o.rendererData = d; o.rendererIndex = k++; a.push(j.getNeedleWidth()); j.getLabel().getTemplate().setField(true); n = j.normalizeSectors(j.getSectors()); for (c = 0, g = n.length; c < g; c++) { e = { startAngle: j.valueToAngle(n[c].start), endAngle: j.valueToAngle(n[c].end), label: n[c].label, fillStyle: n[c].color, strokeOpacity: 0, doCallout: false, labelOverflowPadding: -1 }; Ext.apply(e, n[c].style); o = j.createSprite(); o.rendererData = d; o.rendererIndex = k++; o.setAttributes(e, true); a.push(e.lineWidth) } j.setSubStyle({ lineWidth: a }); j.doUpdateStyles(); return f } }); Ext.define("Ext.chart.series.sprite.Line", { alias: "sprite.lineSeries", extend: "Ext.chart.series.sprite.Aggregative", inheritableStatics: { def: { processors: { smooth: "bool", fillArea: "bool", step: "bool", preciseStroke: "bool", xAxis: "default", yCap: "default" }, defaults: { smooth: false, fillArea: false, step: false, preciseStroke: true, xAxis: null, yCap: Math.pow(2, 20), yJump: 50 }, triggers: { dataX: "dataX,bbox,smooth", dataY: "dataY,bbox,smooth", smooth: "smooth" }, updaters: { smooth: function(a) { var c = a.dataX, b = a.dataY; if (a.smooth && c && b && c.length > 2 && b.length > 2) { this.smoothX = Ext.draw.Draw.spline(c); this.smoothY = Ext.draw.Draw.spline(b) } else { delete this.smoothX; delete this.smoothY } } } } }, list: null, updatePlainBBox: function(d) { var b = this.attr, c = Math.min(0, b.dataMinY), a = Math.max(0, b.dataMaxY); d.x = b.dataMinX; d.y = c; d.width = b.dataMaxX - b.dataMinX; d.height = a - c }, drawStrip: function(a, c) { a.moveTo(c[0], c[1]); for (var b = 2, d = c.length; b < d; b += 2) { a.lineTo(c[b], c[b + 1]) } }, drawStraightStroke: function(p, q, e, d, u, h) { var w = this, o = w.attr, n = o.renderer, g = o.step, a = true, l = { type: "line", smooth: false, step: g }, m = [], l, z, v, f, k, j, t, c, s, b, r; for (r = 3; r < u.length; r += 3) { t = u[r - 3]; c = u[r - 2]; k = u[r]; j = u[r + 1]; s = u[r + 3]; b = u[r + 4]; if (n) { l.x = k; l.y = j; l.x0 = t; l.y0 = c; v = [w, l, w.rendererData, e + r / 3]; z = Ext.callback(n, null, v, 0, w.getSeries()) } if (Ext.isNumber(k + j + t + c)) { if (a) { q.beginPath(); q.moveTo(t, c); m.push(t, c); f = t; a = false } } else { continue } if (g) { q.lineTo(k, c); m.push(k, c) } q.lineTo(k, j); m.push(k, j); if (z || !(Ext.isNumber(s + b))) { q.save(); Ext.apply(q, z); if (o.fillArea) { q.lineTo(k, h); q.lineTo(f, h); q.closePath(); q.fill() } q.beginPath(); w.drawStrip(q, m); m = []; q.stroke(); q.restore(); q.beginPath(); a = true } } }, calculateScale: function(c, a) { var b = 0, d = c; while (d < a && c > 0) { b++; d += c >> b } return Math.pow(2, b > 0 ? b - 1 : b) }, drawSmoothStroke: function(u, v, c, b, C, f) { var G = this, t = G.attr, d = t.step, z = t.matrix, s = t.renderer, e = z.getXX(), p = z.getYY(), m = z.getDX(), k = z.getDY(), r = G.smoothX, q = G.smoothY, I = G.calculateScale(t.dataX.length, b), o, F, n, E, h, g, B, a, A, w, H, D, l = { type: "line", smooth: true, step: d }; v.beginPath(); v.moveTo(r[c * 3] * e + m, q[c * 3] * p + k); for (A = 0, w = c * 3 + 1; A < C.length - 3; A += 3, w += 3 * I) { o = r[w] * e + m; F = q[w] * p + k; n = r[w + 1] * e + m; E = q[w + 1] * p + k; h = u.roundPixel(C[A + 3]); g = C[A + 4]; B = u.roundPixel(C[A]); a = C[A + 1]; if (s) { l.x0 = B; l.y0 = a; l.cx1 = o; l.cy1 = F; l.cx2 = n; l.cy2 = E; l.x = h; l.y = g; D = [G, l, G.rendererData, c + A / 3 + 1]; H = Ext.callback(s, null, D, 0, G.getSeries()); v.save(); Ext.apply(v, H) } if (t.fillArea) { v.moveTo(B, a); v.bezierCurveTo(o, F, n, E, h, g); v.lineTo(h, f); v.lineTo(B, f); v.lineTo(B, a); v.closePath(); v.fill(); v.beginPath() } v.moveTo(B, a); v.bezierCurveTo(o, F, n, E, h, g); v.stroke(); v.moveTo(B, a); v.closePath(); if (s) { v.restore() } v.beginPath(); v.moveTo(h, g) } v.beginPath() }, drawLabel: function(k, i, h, o, a) { var q = this, n = q.attr, e = q.getMarker("labels"), d = e.getTemplate(), m = q.labelCfg || (q.labelCfg = {}), c = q.surfaceMatrix, g, f, j = n.labelOverflowPadding, l, b, r, p, s; m.x = c.x(i, h); m.y = c.y(i, h); if (n.flipXY) { m.rotationRads = Math.PI * 0.5 } else { m.rotationRads = 0 } m.text = k; if (d.attr.renderer) { p = [k, e, m, q.rendererData, o]; r = Ext.callback(d.attr.renderer, null, p, 0, q.getSeries()); if (typeof r === "string") { m.text = r } else { if (typeof r === "object") { if ("text" in r) { m.text = r.text } s = true } } } b = q.getMarkerBBox("labels", o, true); if (!b) { q.putMarker("labels", m, o); b = q.getMarkerBBox("labels", o, true) } l = b.height / 2; g = i; switch (d.attr.display) { case "under": f = h - l - j; break; case "rotate": g += j; f = h - j; m.rotationRads = -Math.PI / 4; break; default: f = h + l + j } m.x = c.x(g, f); m.y = c.y(g, f); if (s) { Ext.apply(m, r) } q.putMarker("labels", m, o) }, drawMarker: function(j, h, d) { var g = this, e = g.attr, f = e.renderer, c = g.surfaceMatrix, b = {}, i, a; if (f && g.getMarker("markers")) { b.type = "marker"; b.x = j; b.y = h; a = [g, b, g.rendererData, d]; i = Ext.callback(f, null, a, 0, g.getSeries()); if (i) { Ext.apply(b, i) } } b.translationX = c.x(j, h); b.translationY = c.y(j, h); delete b.x; delete b.y; g.putMarker("markers", b, d, !f) }, drawStroke: function(a, c, h, b, f, e) { var d = this, g = d.attr.smooth && d.smoothX && d.smoothY; if (g) { d.drawSmoothStroke(a, c, h, b, f, e) } else { d.drawStraightStroke(a, c, h, b, f, e) } }, renderAggregates: function(B, w, l, N, o, I, D) { var m = this, k = m.attr, s = k.dataX, r = k.dataY, h = k.labels, v = k.xAxis, a = k.yCap, g = k.smooth && m.smoothX && m.smoothY, d = h && m.getMarker("labels"), t = m.getMarker("markers"), E = k.matrix, u = N.devicePixelRatio, C = E.getXX(), f = E.getYY(), c = E.getDX(), b = E.getDY(), q = m.list || (m.list = []), F = B.minX, e = B.maxX, j = B.minY, P = B.maxY, U = B.startIdx, S = true, Q, T, L, K, R, G; m.rendererData = { store: m.getStore() }; q.length = 0; for (R = w; R < l; R++) { var O = F[R], p = e[R], M = j[R], n = P[R]; if (O < p) { q.push(O * C + c, M * f + b, U[R]); q.push(p * C + c, n * f + b, U[R]) } else { if (O > p) { q.push(p * C + c, n * f + b, U[R]); q.push(O * C + c, M * f + b, U[R]) } else { q.push(p * C + c, n * f + b, U[R]) } } } if (q.length) { for (R = 0; R < q.length; R += 3) { L = q[R]; K = q[R + 1]; if (Ext.isNumber(L + K)) { if (K > a) { K = a } else { if (K < -a) { K = -a } } q[R + 1] = K } else { S = false; continue } G = q[R + 2]; if (t) { m.drawMarker(L, K, G) } if (d && h[G]) { m.drawLabel(h[G], L, K, G, D) } } m.isContinuousLine = S; if (g && !S) { Ext.raise("Line smoothing in only supported for gapless data, where all data points are finite numbers.") } if (v) { T = v.getAlignment() === "vertical"; if (Ext.isNumber(v.floatingAtCoord)) { Q = (T ? D[2] : D[3]) - v.floatingAtCoord } else { Q = T ? D[0] : D[1] } } else { Q = k.flipXY ? D[0] : D[1] } if (k.preciseStroke) { if (k.fillArea) { o.fill() } if (k.transformFillStroke) { k.inverseMatrix.toContext(o) } m.drawStroke(N, o, w, l, q, Q); if (k.transformFillStroke) { k.matrix.toContext(o) } o.stroke() } else { m.drawStroke(N, o, w, l, q, Q); if (S && g && k.fillArea && !k.renderer) { var A = s[s.length - 1] * C + c + u, z = r[r.length - 1] * f + b, J = s[0] * C + c - u, H = r[0] * f + b; o.lineTo(A, z); o.lineTo(A, Q - k.lineWidth); o.lineTo(J, Q - k.lineWidth); o.lineTo(J, H) } if (k.transformFillStroke) { k.matrix.toContext(o) } if (k.fillArea) { o.fillStroke(k, true) } else { o.stroke(true) } } } } }); Ext.define("Ext.chart.series.Line", { extend: "Ext.chart.series.Cartesian", alias: "series.line", type: "line", seriesType: "lineSeries", requires: ["Ext.chart.series.sprite.Line"], config: { selectionTolerance: 20, smooth: false, step: false, fill: undefined, aggregator: { strategy: "double" } }, defaultSmoothness: 3, overflowBuffer: 1, themeMarkerCount: function() { return 1 }, getDefaultSpriteConfig: function() { var d = this, e = d.callParent(arguments), c = Ext.apply({}, d.getStyle()), b, a = false; if (typeof d.config.fill != "undefined") { if (d.config.fill) { a = true; if (typeof c.fillStyle == "undefined") { if (typeof c.strokeStyle == "undefined") { b = d.getStyleWithTheme(); c.fillStyle = b.fillStyle; c.strokeStyle = b.strokeStyle } else { c.fillStyle = c.strokeStyle } } } } else { if (c.fillStyle) { a = true } } if (!a) { delete c.fillStyle } c = Ext.apply(e || {}, c); return Ext.apply(c, { fillArea: a, step: d.config.step, smooth: d.config.smooth, selectionTolerance: d.config.selectionTolerance }) }, updateStep: function(b) { var a = this.getSprites()[0]; if (a && a.attr.step !== b) { a.setAttributes({ step: b }) } }, updateFill: function(b) { var a = this.getSprites()[0]; if (a && a.attr.fillArea !== b) { a.setAttributes({ fillArea: b }) } }, updateSmooth: function(a) { var b = this.getSprites()[0]; if (b && b.attr.smooth !== a) { b.setAttributes({ smooth: a }) } } }); Ext.define("Ext.chart.series.sprite.PieSlice", { extend: "Ext.draw.sprite.Sector", mixins: { markerHolder: "Ext.chart.MarkerHolder" }, alias: "sprite.pieslice", inheritableStatics: { def: { processors: { doCallout: "bool", label: "string", rotateLabels: "bool", labelOverflowPadding: "number", renderer: "default" }, defaults: { doCallout: true, rotateLabels: true, label: "", labelOverflowPadding: 10, renderer: null } } }, config: { rendererData: null, rendererIndex: 0, series: null }, setGradientBBox: function(q, k) { var j = this, i = j.attr, g = (i.fillStyle && i.fillStyle.isGradient) || (i.strokeStyle && i.strokeStyle.isGradient); if (g && !i.constrainGradients) { var b = j.getMidAngle(), d = i.margin, e = i.centerX, c = i.centerY, a = i.endRho, l = i.matrix, o = l.getScaleX(), n = l.getScaleY(), m = o * a, f = n * a, p = { width: m + m, height: f + f }; if (d) { e += d * Math.cos(b); c += d * Math.sin(b) } p.x = l.x(e, c) - m; p.y = l.y(e, c) - f; q.setGradientBBox(p) } else { j.callParent([q, k]) } }, render: function(b, c, g, f) { var e = this, a = e.attr, h = {}, d; if (a.renderer) { h = { type: "sector", text: a.text, centerX: a.centerX, centerY: a.centerY, margin: a.margin, startAngle: Math.min(a.startAngle, a.endAngle), endAngle: Math.max(a.startAngle, a.endAngle), startRho: Math.min(a.startRho, a.endRho), endRho: Math.max(a.startRho, a.endRho) }; d = Ext.callback(a.renderer, null, [e, h, e.rendererData, e.rendererIndex], 0, e.getSeries()); e.setAttributes(d); e.useAttributes(c, g) } e.callParent([b, c, g, f]); if (a.label && e.getMarker("labels")) { e.placeLabel() } }, placeLabel: function() { var z = this, s = z.attr, r = s.attributeId, t = Math.min(s.startAngle, s.endAngle), p = Math.max(s.startAngle, s.endAngle), k = (t + p) * 0.5, n = s.margin, h = s.centerX, g = s.centerY, f = Math.sin(k), c = Math.cos(k), v = Math.min(s.startRho, s.endRho) + n, m = Math.max(s.startRho, s.endRho) + n, l = (v + m) * 0.5, b = z.surfaceMatrix, o = z.labelCfg || (z.labelCfg = {}), e = z.getMarker("labels"), d = e.getTemplate(), a = d.getCalloutLine(), q = a && a.length || 40, u, j, i, A, w; b.appendMatrix(s.matrix); o.text = s.label; j = h + c * l; i = g + f * l; o.x = b.x(j, i); o.y = b.y(j, i); j = h + c * m; i = g + f * m; o.calloutStartX = b.x(j, i); o.calloutStartY = b.y(j, i); j = h + c * (m + q); i = g + f * (m + q); o.calloutPlaceX = b.x(j, i); o.calloutPlaceY = b.y(j, i); if (!s.rotateLabels) { o.rotationRads = 0 } else { switch (d.attr.orientation) { case "horizontal": o.rotationRads = k + Math.atan2(b.y(1, 0) - b.y(0, 0), b.x(1, 0) - b.x(0, 0)) + Math.PI / 2; break; case "vertical": o.rotationRads = k + Math.atan2(b.y(1, 0) - b.y(0, 0), b.x(1, 0) - b.x(0, 0)); break } } o.calloutColor = (a && a.color) || z.attr.fillStyle; if (a) { if (a.width) { o.calloutWidth = a.width } } else { o.calloutHasLine = false } o.globalAlpha = s.globalAlpha * s.fillOpacity; o.hidden = (s.startAngle == s.endAngle); if (d.attr.renderer) { w = [z.attr.label, e, o, z.rendererData, z.rendererIndex]; A = Ext.callback(d.attr.renderer, null, w, 0, z.getSeries()); if (typeof A === "string") { o.text = A } else { Ext.apply(o, A) } } z.putMarker("labels", o, r); u = z.getMarkerBBox("labels", r, true); if (u) { if (s.doCallout) { if (d.attr.display === "outside") { z.putMarker("labels", { callout: 1 }, r) } else { if (d.attr.display === "inside") { z.putMarker("labels", { callout: 0 }, r) } else { z.putMarker("labels", { callout: 1 - z.sliceContainsLabel(s, u) }, r) } } } else { z.putMarker("labels", { globalAlpha: z.sliceContainsLabel(s, u) }, r) } } }, sliceContainsLabel: function(d, f) { var e = d.labelOverflowPadding, h = (d.endRho + d.startRho) / 2, g = h + (f.width + e) / 2, i = h - (f.width + e) / 2, j, c, b, a; if (e < 0) { return 1 } if (f.width + e * 2 > (d.endRho - d.startRho)) { return 0 } c = Math.sqrt(d.endRho * d.endRho - g * g); b = Math.sqrt(d.endRho * d.endRho - i * i); j = Math.abs(d.endAngle - d.startAngle); a = (j > Math.PI / 2 ? i : Math.abs(Math.tan(j / 2)) * i); if (f.height + e * 2 > Math.min(c, b, a) * 2) { return 0 } return 1 } }); Ext.define("Ext.chart.series.Pie", { extend: "Ext.chart.series.Polar", requires: ["Ext.chart.series.sprite.PieSlice"], type: "pie", alias: "series.pie", seriesType: "pieslice", config: { donut: 0, rotation: 0, clockwise: true, totalAngle: 2 * Math.PI, hidden: [], radiusFactor: 100, highlightCfg: { margin: 20 }, style: {} }, directions: ["X"], applyLabel: function(a, b) { if (Ext.isObject(a) && !Ext.isString(a.orientation)) { Ext.apply(a = Ext.Object.chain(a), { orientation: "vertical" }) } return this.callParent([a, b]) }, updateLabelData: function() { var h = this, j = h.getStore(), g = j.getData().items, e = h.getSprites(), a = h.getLabel().getTemplate().getField(), d = h.getHidden(), b, f, c, k; if (e.length && a) { c = []; for (b = 0, f = g.length; b < f; b++) { c.push(g[b].get(a)) } for (b = 0, f = e.length; b < f; b++) { k = e[b]; k.setAttributes({ label: c[b] }); k.putMarker("labels", { hidden: d[b] }, k.attr.attributeId) } } }, coordinateX: function() { var t = this, f = t.getStore(), q = f.getData().items, c = q.length, b = t.getXField(), e = t.getYField(), l, a = 0, m, k, s = 0, o = t.getHidden(), d = [], p, g = 0, h = t.getTotalAngle(), r = t.getClockwise() ? 1 : -1, j = t.getSprites(), n; if (!j) { return } for (p = 0; p < c; p++) { l = Math.abs(Number(q[p].get(b))) || 0; k = e && Math.abs(Number(q[p].get(e))) || 0; if (!o[p]) { a += l; if (k > s) { s = k } } d[p] = a; if (p >= o.length) { o[p] = false } } o.length = c; t.maxY = s; if (a !== 0) { m = h / a } for (p = 0; p < c; p++) { j[p].setAttributes({ startAngle: g, endAngle: g = (m ? r * d[p] * m : 0), globalAlpha: 1 }) } if (c < t.sprites.length) { for (p = c; p < t.sprites.length; p++) { n = t.sprites[p]; n.getMarker("labels").clear(n.getId()); n.releaseMarker("labels"); n.destroy() } t.sprites.length = c } for (p = c; p < t.sprites.length; p++) { j[p].setAttributes({ startAngle: h, endAngle: h, globalAlpha: 0 }) } t.getChart().refreshLegendStore() }, updateCenter: function(a) { this.setStyle({ translationX: a[0] + this.getOffsetX(), translationY: a[1] + this.getOffsetY() }); this.doUpdateStyles() }, updateRadius: function(a) { this.setStyle({ startRho: a * this.getDonut() * 0.01, endRho: a * this.getRadiusFactor() * 0.01 }); this.doUpdateStyles() }, getStyleByIndex: function(c) { var g = this, j = g.getStore(), k = j.getAt(c), f = g.getYField(), d = g.getRadius(), a = {}, e, b, h; if (k) { h = f && Math.abs(Number(k.get(f))) || 0; e = d * g.getDonut() * 0.01; b = d * g.getRadiusFactor() * 0.01; a = g.callParent([c]); a.startRho = e; a.endRho = g.maxY ? (e + (b - e) * h / g.maxY) : b } return a }, updateDonut: function(b) { var a = this.getRadius(); this.setStyle({ startRho: a * b * 0.01, endRho: a * this.getRadiusFactor() * 0.01 }); this.doUpdateStyles() }, rotationOffset: -Math.PI / 2, updateRotation: function(a) { this.setStyle({ rotationRads: a + this.rotationOffset }); this.doUpdateStyles() }, updateTotalAngle: function(a) { this.processData() }, getSprites: function() { var k = this, h = k.getChart(), n = k.getStore(); if (!h || !n) { return [] } k.getColors(); k.getSubStyle(); var j = n.getData().items, b = j.length, d = k.getAnimation() || h && h.getAnimation(), g = k.sprites, o, l = 0, f, e, c = false, m = k.getLabel(), a = m.getTemplate(); f = { store: n, field: k.getXField(), angleField: k.getXField(), radiusField: k.getYField(), series: k }; for (e = 0; e < b; e++) { o = g[e]; if (!o) { o = k.createSprite(); if (k.getHighlight()) { o.config.highlight = k.getHighlight(); o.addModifier("highlight", true) } if (a.getField()) { a.setAttributes({ labelOverflowPadding: k.getLabelOverflowPadding() }); a.fx.setCustomDurations({ callout: 200 }) } o.setAttributes(k.getStyleByIndex(e)); o.rendererData = f; o.rendererIndex = l++; c = true } o.setAnimation(d) } if (c) { k.doUpdateStyles() } return k.sprites }, betweenAngle: function(d, f, c) { var e = Math.PI * 2, g = this.rotationOffset; if (!this.getClockwise()) { d *= -1; f *= -1; c *= -1; f -= g; c -= g } else { f += g; c += g } d -= f; c -= f; d %= e; c %= e; d += e; c += e; d %= e; c %= e; return d < c || c === 0 }, getItemForAngle: function(a) { var h = this, f = h.getSprites(), d; a %= Math.PI * 2; while (a < 0) { a += Math.PI * 2 } if (f) { var j = h.getStore(), g = j.getData().items, c = h.getHidden(), b = 0, e = j.getCount(); for (; b < e; b++) { if (!c[b]) { d = f[b].attr; if (d.startAngle <= a && d.endAngle >= a) { return { series: h, sprite: f[b], index: b, record: g[b], field: h.getXField() } } } } } return null }, getItemForPoint: function(f, e) { var t = this, c = t.getSprites(); if (c) { var s = t.getCenter(), q = t.getOffsetX(), p = t.getOffsetY(), j = f - s[0] + q, h = e - s[1] + p, b = t.getStore(), g = t.getDonut(), o = b.getData().items, r = Math.atan2(h, j) - t.getRotation(), a = Math.sqrt(j * j + h * h), l = t.getRadius() * g * 0.01, m = t.getHidden(), n, d, k; for (n = 0, d = o.length; n < d; n++) { if (!m[n]) { k = c[n].attr; if (a >= l + k.margin && a <= k.endRho + k.margin) { if (t.betweenAngle(r, k.startAngle, k.endAngle)) { return { series: t, sprite: c[n], index: n, record: o[n], field: t.getXField() } } } } } return null } }, provideLegendInfo: function(f) { var h = this, j = h.getStore(); if (j) { var g = j.getData().items, b = h.getLabel().getTemplate().getField(), c = h.getXField(), e = h.getHidden(), d, a, k; for (d = 0; d < g.length; d++) { a = h.getStyleByIndex(d); k = a.fillStyle; if (Ext.isObject(k)) { k = k.stops && k.stops[0].color } f.push({ name: b ? String(g[d].get(b)) : c + " " + d, mark: k || a.strokeStyle || "black", disabled: e[d], series: h.getId(), index: d }) } } } }); Ext.define("Ext.chart.series.sprite.Pie3DPart", { extend: "Ext.draw.sprite.Path", mixins: { markerHolder: "Ext.chart.MarkerHolder" }, alias: "sprite.pie3dPart", inheritableStatics: { def: { processors: { centerX: "number", centerY: "number", startAngle: "number", endAngle: "number", startRho: "number", endRho: "number", margin: "number", thickness: "number", bevelWidth: "number", distortion: "number", baseColor: "color", colorSpread: "number", baseRotation: "number", part: "enums(top,bottom,start,end,innerFront,innerBack,outerFront,outerBack)", label: "string" }, aliases: { rho: "endRho" }, triggers: { centerX: "path,bbox", centerY: "path,bbox", startAngle: "path,partZIndex", endAngle: "path,partZIndex", startRho: "path", endRho: "path,bbox", margin: "path,bbox", thickness: "path", distortion: "path", baseRotation: "path,partZIndex", baseColor: "partZIndex,partColor", colorSpread: "partColor", part: "path,partZIndex", globalAlpha: "canvas,alpha" }, defaults: { centerX: 0, centerY: 0, startAngle: Math.PI * 2, endAngle: Math.PI * 2, startRho: 0, endRho: 150, margin: 0, thickness: 35, distortion: 0.5, baseRotation: 0, baseColor: "white", colorSpread: 1, miterLimit: 1, bevelWidth: 5, strokeOpacity: 0, part: "top", label: "" }, updaters: { alpha: "alphaUpdater", partColor: "partColorUpdater", partZIndex: "partZIndexUpdater" } } }, bevelParams: [], constructor: function(a) { this.callParent([a]); this.bevelGradient = new Ext.draw.gradient.Linear({ stops: [{ offset: 0, color: "rgba(255,255,255,0)" }, { offset: 0.7, color: "rgba(255,255,255,0.6)" }, { offset: 1, color: "rgba(255,255,255,0)" }] }) }, alphaUpdater: function(a) { var d = this, c = a.globalAlpha, b = d.oldOpacity; if (c !== b && (c === 1 || b === 1)) { d.scheduleUpdater(a, "path", ["globalAlpha"]); d.oldOpacity = c } }, partColorUpdater: function(a) { var d = Ext.draw.Color.fly(a.baseColor), b = d.toString(), e = a.colorSpread, c; switch (a.part) { case "top": c = new Ext.draw.gradient.Radial({ start: { x: 0, y: 0, r: 0 }, end: { x: 0, y: 0, r: 1 }, stops: [{ offset: 0, color: d.createLighter(0.1 * e) }, { offset: 1, color: d.createDarker(0.1 * e) }] }); break; case "bottom": c = new Ext.draw.gradient.Radial({ start: { x: 0, y: 0, r: 0 }, end: { x: 0, y: 0, r: 1 }, stops: [{ offset: 0, color: d.createDarker(0.2 * e) }, { offset: 1, color: d.toString() }] }); break; case "outerFront": case "outerBack": c = new Ext.draw.gradient.Linear({ stops: [{ offset: 0, color: d.createDarker(0.15 * e).toString() }, { offset: 0.3, color: b }, { offset: 0.8, color: d.createLighter(0.2 * e).toString() }, { offset: 1, color: d.createDarker(0.25 * e).toString() }] }); break; case "start": c = new Ext.draw.gradient.Linear({ stops: [{ offset: 0, color: d.createDarker(0.1 * e).toString() }, { offset: 1, color: d.createLighter(0.2 * e).toString() }] }); break; case "end": c = new Ext.draw.gradient.Linear({ stops: [{ offset: 0, color: d.createDarker(0.1 * e).toString() }, { offset: 1, color: d.createLighter(0.2 * e).toString() }] }); break; case "innerFront": case "innerBack": c = new Ext.draw.gradient.Linear({ stops: [{ offset: 0, color: d.createDarker(0.1 * e).toString() }, { offset: 0.2, color: d.createLighter(0.2 * e).toString() }, { offset: 0.7, color: b }, { offset: 1, color: d.createDarker(0.1 * e).toString() }] }); break } a.fillStyle = c; a.canvasAttributes.fillStyle = c }, partZIndexUpdater: function(a) { var c = Ext.draw.sprite.AttributeParser.angle, e = a.baseRotation, d = a.startAngle, b = a.endAngle, f; switch (a.part) { case "top": a.zIndex = 5; break; case "outerFront": d = c(d + e); b = c(b + e); if (d >= 0 && b < 0) { f = Math.sin(d) } else { if (d <= 0 && b > 0) { f = Math.sin(b) } else { if (d >= 0 && b > 0) { if (d > b) { f = 0 } else { f = Math.max(Math.sin(d), Math.sin(b)) } } else { f = 1 } } } a.zIndex = 4 + f; break; case "outerBack": a.zIndex = 1; break; case "start": a.zIndex = 4 + Math.sin(c(d + e)); break; case "end": a.zIndex = 4 + Math.sin(c(b + e)); break; case "innerFront": a.zIndex = 2; break; case "innerBack": a.zIndex = 4 + Math.sin(c((d + b) / 2 + e)); break; case "bottom": a.zIndex = 0; break } a.dirtyZIndex = true }, updatePlainBBox: function(k) { var f = this.attr, a = f.part, b = f.baseRotation, e = f.centerX, d = f.centerY, j, c, i, h, g, l; if (a === "start") { c = f.startAngle + b } else { if (a === "end") { c = f.endAngle + b } } if (Ext.isNumber(c)) { g = Math.sin(c); l = Math.cos(c); i = Math.min(e + l * f.startRho, e + l * f.endRho); h = d + g * f.startRho * f.distortion; k.x = i; k.y = h; k.width = l * (f.endRho - f.startRho); k.height = f.thickness + g * (f.endRho - f.startRho) * 2; return } if (a === "innerFront" || a === "innerBack") { j = f.startRho } else { j = f.endRho } k.width = j * 2; k.height = j * f.distortion * 2 + f.thickness; k.x = f.centerX - j; k.y = f.centerY - j * f.distortion }, updateTransformedBBox: function(a) { if (this.attr.part === "start" || this.attr.part === "end") { return this.callParent(arguments) } return this.updatePlainBBox(a) }, updatePath: function(a) { if (!this.attr.globalAlpha) { return } if (this.attr.endAngle < this.attr.startAngle) { return } this[this.attr.part + "Renderer"](a) }, render: function(b, c) { var d = this, a = d.attr; if (!a.globalAlpha) { return } d.callParent([b, c]); d.bevelRenderer(b, c); if (a.label && d.getMarker("labels")) { d.placeLabel() } }, placeLabel: function() { var z = this, u = z.attr, t = u.attributeId, p = u.margin, c = u.distortion, i = u.centerX, h = u.centerY, j = u.baseRotation, v = u.startAngle + j, r = u.endAngle + j, m = (v + r) / 2, w = u.startRho + p, o = u.endRho + p, n = (w + o) / 2, a = Math.sin(m), b = Math.cos(m), e = z.surfaceMatrix, g = z.getMarker("labels"), f = g.getTemplate(), d = f.getCalloutLine(), s = d && d.length || 40, q = {}, l, k; e.appendMatrix(u.matrix); q.text = u.label; l = i + b * n; k = h + a * n * c; q.x = e.x(l, k); q.y = e.y(l, k); l = i + b * o; k = h + a * o * c; q.calloutStartX = e.x(l, k); q.calloutStartY = e.y(l, k); l = i + b * (o + s); k = h + a * (o + s) * c; q.calloutPlaceX = e.x(l, k); q.calloutPlaceY = e.y(l, k); q.calloutWidth = 2; z.putMarker("labels", q, t); z.putMarker("labels", { callout: 1 }, t) }, bevelRenderer: function(b, c) { var f = this, a = f.attr, e = a.bevelWidth, g = f.bevelParams, d; for (d = 0; d < g.length; d++) { c.beginPath(); c.ellipse.apply(c, g[d]); c.save(); c.lineWidth = e; c.strokeOpacity = e ? 1 : 0; c.strokeGradient = f.bevelGradient; c.stroke(a); c.restore() } }, lidRenderer: function(o, m) { var k = this.attr, g = k.margin, c = k.distortion, i = k.centerX, h = k.centerY, f = k.baseRotation, j = k.startAngle + f, e = k.endAngle + f, d = (j + e) / 2, l = k.startRho, b = k.endRho, n = Math.sin(e), a = Math.cos(e); i += Math.cos(d) * g; h += Math.sin(d) * g * c; o.ellipse(i, h + m, l, l * c, 0, j, e, false); o.lineTo(i + a * b, h + m + n * b * c); o.ellipse(i, h + m, b, b * c, 0, e, j, true); o.closePath() }, topRenderer: function(a) { this.lidRenderer(a, 0) }, bottomRenderer: function(b) { var a = this.attr; if (a.globalAlpha < 1 || a.shadowColor !== Ext.draw.Color.RGBA_NONE) { this.lidRenderer(b, a.thickness) } }, sideRenderer: function(l, s) { var o = this.attr, k = o.margin, g = o.centerX, f = o.centerY, e = o.distortion, h = o.baseRotation, p = o.startAngle + h, m = o.endAngle + h, a = o.thickness, q = o.startRho, j = o.endRho, r = (s === "start" && p) || (s === "end" && m), b = Math.sin(r), d = Math.cos(r), c = o.globalAlpha < 1, n = s === "start" && d < 0 || s === "end" && d > 0 || c, i; if (n) { i = (p + m) / 2; g += Math.cos(i) * k; f += Math.sin(i) * k * e; l.moveTo(g + d * q, f + b * q * e); l.lineTo(g + d * j, f + b * j * e); l.lineTo(g + d * j, f + b * j * e + a); l.lineTo(g + d * q, f + b * q * e + a); l.closePath() } }, startRenderer: function(a) { this.sideRenderer(a, "start") }, endRenderer: function(a) { this.sideRenderer(a, "end") }, rimRenderer: function(q, e, o, j) { var w = this, s = w.attr, p = s.margin, h = s.centerX, g = s.centerY, d = s.distortion, i = s.baseRotation, t = Ext.draw.sprite.AttributeParser.angle, u = s.startAngle + i, r = s.endAngle + i, k = t((u + r) / 2), a = s.thickness, b = s.globalAlpha < 1, c, n, v; w.bevelParams = []; u = t(u); r = t(r); h += Math.cos(k) * p; g += Math.sin(k) * p * d; c = u >= 0 && r >= 0; n = u <= 0 && r <= 0; function l() { q.ellipse(h, g + a, e, e * d, 0, Math.PI, u, true); q.lineTo(h + Math.cos(u) * e, g + Math.sin(u) * e * d); v = [h, g, e, e * d, 0, u, Math.PI, false]; if (!o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } function f() { q.ellipse(h, g + a, e, e * d, 0, 0, r, false); q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d); v = [h, g, e, e * d, 0, r, 0, true]; if (!o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } function x() { q.ellipse(h, g + a, e, e * d, 0, Math.PI, r, false); q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d); v = [h, g, e, e * d, 0, r, Math.PI, true]; if (o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } function m() { q.ellipse(h, g + a, e, e * d, 0, u, 0, false); q.lineTo(h + e, g); v = [h, g, e, e * d, 0, 0, u, true]; if (o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } if (j) { if (!o || b) { if (u >= 0 && r < 0) { l() } else { if (u <= 0 && r > 0) { f() } else { if (u <= 0 && r < 0) { if (u > r) { q.ellipse(h, g + a, e, e * d, 0, 0, Math.PI, false); q.lineTo(h - e, g); v = [h, g, e, e * d, 0, Math.PI, 0, true]; if (!o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } } else { if (u > r) { l(); f() } else { v = [h, g, e, e * d, 0, u, r, false]; if (c && !o || n && o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d + a); q.ellipse(h, g + a, e, e * d, 0, r, u, true); q.closePath() } } } } } } else { if (o || b) { if (u >= 0 && r < 0) { x() } else { if (u <= 0 && r > 0) { m() } else { if (u <= 0 && r < 0) { if (u > r) { x(); m() } else { q.ellipse(h, g + a, e, e * d, 0, u, r, false); q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d); v = [h, g, e, e * d, 0, r, u, true]; if (o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } } else { if (u > r) { q.ellipse(h, g + a, e, e * d, 0, -Math.PI, 0, false); q.lineTo(h + e, g); v = [h, g, e, e * d, 0, 0, -Math.PI, true]; if (o) { w.bevelParams.push(v) } q.ellipse.apply(q, v); q.closePath() } } } } } } }, innerFrontRenderer: function(a) { this.rimRenderer(a, this.attr.startRho, true, true) }, innerBackRenderer: function(a) { this.rimRenderer(a, this.attr.startRho, true, false) }, outerFrontRenderer: function(a) { this.rimRenderer(a, this.attr.endRho, false, true) }, outerBackRenderer: function(a) { this.rimRenderer(a, this.attr.endRho, false, false) } }); Ext.define("Ext.draw.PathUtil", function() { var a = Math.abs, c = Math.pow, e = Math.cos, b = Math.acos, d = Math.sqrt, f = Math.PI; return { singleton: true, requires: ["Ext.draw.overrides.Path", "Ext.draw.overrides.sprite.Path", "Ext.draw.overrides.sprite.Instancing", "Ext.draw.overrides.Surface"], cubicRoots: function(m) { var z = m[0], x = m[1], w = m[2], v = m[3]; if (z === 0) { return this.quadraticRoots(x, w, v) } var s = x / z, r = w / z, q = v / z, k = (3 * r - c(s, 2)) / 9, j = (9 * s * r - 27 * q - 2 * c(s, 3)) / 54, p = c(k, 3) + c(j, 2), n = [], h, g, o, l, u, y = Ext.Number.sign; if (p >= 0) { h = y(j + d(p)) * c(a(j + d(p)), 1 / 3); g = y(j - d(p)) * c(a(j - d(p)), 1 / 3); n[0] = -s / 3 + (h + g); n[1] = -s / 3 - (h + g) / 2; n[2] = n[1]; o = a(d(3) * (h - g) / 2); if (o !== 0) { n[1] = -1; n[2] = -1 } } else { l = b(j / d(-c(k, 3))); n[0] = 2 * d(-k) * e(l / 3) - s / 3; n[1] = 2 * d(-k) * e((l + 2 * f) / 3) - s / 3; n[2] = 2 * d(-k) * e((l + 4 * f) / 3) - s / 3 } for (u = 0; u < 3; u++) { if (n[u] < 0 || n[u] > 1) { n[u] = -1 } } return n }, quadraticRoots: function(h, g, n) { var m, l, k, j; if (h === 0) { return this.linearRoot(g, n) } m = g * g - 4 * h * n; if (m === 0) { k = [-g / (2 * h)] } else { if (m > 0) { l = d(m); k = [(-g - l) / (2 * h), (-g + l) / (2 * h)] } else { return [] } } for (j = 0; j < k.length; j++) { if (k[j] < 0 || k[j] > 1) { k[j] = -1 } } return k }, linearRoot: function(h, g) { var i = -g / h; if (h === 0 || i < 0 || i > 1) { return [] } return [i] }, bezierCoeffs: function(h, g, k, j) { var i = []; i[0] = -h + 3 * g - 3 * k + j; i[1] = 3 * h - 6 * g + 3 * k; i[2] = -3 * h + 3 * g; i[3] = h; return i }, cubicLineIntersections: function(I, G, F, E, l, k, j, h, M, p, K, n) { var u = [], N = [], D = p - n, z = K - M, y = M * (n - p) - p * (K - M), L = this.bezierCoeffs(I, G, F, E), J = this.bezierCoeffs(l, k, j, h), H, x, w, v, g, q, o, m; u[0] = D * L[0] + z * J[0]; u[1] = D * L[1] + z * J[1]; u[2] = D * L[2] + z * J[2]; u[3] = D * L[3] + z * J[3] + y; x = this.cubicRoots(u); for (H = 0; H < x.length; H++) { v = x[H]; if (v < 0 || v > 1) { continue } g = v * v; q = g * v; o = L[0] * q + L[1] * g + L[2] * v + L[3]; m = J[0] * q + J[1] * g + J[2] * v + J[3]; if ((K - M) !== 0) { w = (o - M) / (K - M) } else { w = (m - p) / (n - p) } if (!(w < 0 || w > 1)) { N.push([o, m]) } } return N }, splitCubic: function(g, q, p, o, m) { var j = m * m, n = m * j, i = m - 1, h = i * i, k = i * h, l = n * o - 3 * j * i * p + 3 * m * h * q - k * g; return [ [g, m * q - i * g, j * p - 2 * m * i * q + h * g, l], [l, j * o - 2 * m * i * p + h * q, m * o - i * p, o] ] }, cubicDimension: function(p, o, l, k) { var j = 3 * (-p + 3 * (o - l) + k), i = 6 * (p - 2 * o + l), h = -3 * (p - o), q, n, g = Math.min(p, k), m = Math.max(p, k), r; if (j === 0) { if (i === 0) { return [g, m] } else { q = -h / i; if (0 < q && q < 1) { n = this.interpolateCubic(p, o, l, k, q); g = Math.min(g, n); m = Math.max(m, n) } } } else { r = i * i - 4 * j * h; if (r >= 0) { r = d(r); q = (r - i) / 2 / j; if (0 < q && q < 1) { n = this.interpolateCubic(p, o, l, k, q); g = Math.min(g, n); m = Math.max(m, n) } if (r > 0) { q -= r / j; if (0 < q && q < 1) { n = this.interpolateCubic(p, o, l, k, q); g = Math.min(g, n); m = Math.max(m, n) } } } } return [g, m] }, interpolateCubic: function(h, g, l, k, i) { if (i === 0) { return h } if (i === 1) { return k } var j = (1 - i) / i; return i * i * i * (k + j * (3 * l + j * (3 * g + j * h))) }, cubicsIntersections: function(r, q, p, o, A, z, y, v, g, F, E, D, m, l, k, i) { var C = this, x = C.cubicDimension(r, q, p, o), B = C.cubicDimension(A, z, y, v), n = C.cubicDimension(g, F, E, D), s = C.cubicDimension(m, l, k, i), j, h, u, t, w = []; if (x[0] > n[1] || x[1] < n[0] || B[0] > s[1] || B[1] < s[0]) { return [] } if (a(A - z) < 1 && a(y - v) < 1 && a(r - o) < 1 && a(q - p) < 1 && a(m - l) < 1 && a(k - i) < 1 && a(g - D) < 1 && a(F - E) < 1) { return [ [(r + o) * 0.5, (A + z) * 0.5] ] } j = C.splitCubic(r, q, p, o, 0.5); h = C.splitCubic(A, z, y, v, 0.5); u = C.splitCubic(g, F, E, D, 0.5); t = C.splitCubic(m, l, k, i, 0.5); w.push.apply(w, C.cubicsIntersections.apply(C, j[0].concat(h[0], u[0], t[0]))); w.push.apply(w, C.cubicsIntersections.apply(C, j[0].concat(h[0], u[1], t[1]))); w.push.apply(w, C.cubicsIntersections.apply(C, j[1].concat(h[1], u[0], t[0]))); w.push.apply(w, C.cubicsIntersections.apply(C, j[1].concat(h[1], u[1], t[1]))); return w }, linesIntersection: function(k, p, j, o, h, n, q, m) { var l = (j - k) * (m - n) - (o - p) * (q - h), i, g; if (l === 0) { return null } i = ((q - h) * (p - n) - (k - h) * (m - n)) / l; g = ((j - k) * (p - n) - (o - p) * (k - h)) / l; if (i >= 0 && i <= 1 && g >= 0 && g <= 1) { return [k + i * (j - k), p + i * (o - p)] } return null }, pointOnLine: function(j, m, h, l, g, n) { var k, i; if (a(h - j) < a(l - m)) { i = j; j = m; m = i; i = h; h = l; l = i; i = g; g = n; n = i } k = (g - j) / (h - j); if (k < 0 || k > 1) { return false } return a(m + k * (l - m) - n) < 4 }, pointOnCubic: function(w, u, s, r, l, k, h, g, p, o) { var C = this, B = C.bezierCoeffs(w, u, s, r), A = C.bezierCoeffs(l, k, h, g), z, v, n, m, q; B[3] -= p; A[3] -= o; n = C.cubicRoots(B); m = C.cubicRoots(A); for (z = 0; z < n.length; z++) { q = n[z]; for (v = 0; v < m.length; v++) { if (q >= 0 && q <= 1 && a(q - m[v]) < 0.05) { return true } } } return false } } }); Ext.define("Ext.chart.series.Pie3D", { extend: "Ext.chart.series.Polar", requires: ["Ext.chart.series.sprite.Pie3DPart", "Ext.draw.PathUtil"], type: "pie3d", seriesType: "pie3d", alias: "series.pie3d", isPie3D: true, config: { rect: [0, 0, 0, 0], thickness: 35, distortion: 0.5, donut: false, hidden: [], highlightCfg: { margin: 20 }, shadow: false }, rotationOffset: -Math.PI / 2, setField: function(a) { return this.setXField(a) }, getField: function() { return this.getXField() }, updateRotation: function(a) { this.setStyle({ baseRotation: a + this.rotationOffset }); this.doUpdateStyles() }, updateDistortion: function() { this.setRadius() }, updateThickness: function() { this.setRadius() }, updateColors: function(a) { this.setSubStyle({ baseColor: a }) }, applyShadow: function(a) { if (a === true) { a = { shadowColor: "rgba(0,0,0,0.8)", shadowBlur: 30 } } else { if (!Ext.isObject(a)) { a = { shadowColor: Ext.draw.Color.RGBA_NONE } } } return a }, updateShadow: function(g) { var e = this, f = e.getSprites(), d = e.spritesPerSlice, c = f && f.length, b, a; for (b = 1; b < c; b += d) { a = f[b]; if (a.attr.part = "bottom") { a.setAttributes(g) } } }, getStyleByIndex: function(b) { var d = this.callParent([b]), c = this.getStyle(), a = d.fillStyle || d.fill || d.color, e = c.strokeStyle || c.stroke; if (a) { d.baseColor = a; delete d.fillStyle; delete d.fill; delete d.color } if (e) { d.strokeStyle = e } return d }, doUpdateStyles: function() { var g = this, h = g.getSprites(), f = g.spritesPerSlice, e = h && h.length, c = 0, b = 0, a, d; for (; c < e; c += f, b++) { d = g.getStyleByIndex(b); for (a = 0; a < f; a++) { h[c + a].setAttributes(d) } } }, coordinateX: function() { var w = this, m = w.getChart(), u = m && m.getAnimation(), f = w.getStore(), t = f.getData().items, d = t.length, b = w.getXField(), p = w.getRotation(), s = w.getHidden(), n, c = 0, h, e = [], k = w.getSprites(), a = k.length, l = w.spritesPerSlice, g = 0, o = Math.PI * 2, v = 1e-10, r, q; for (r = 0; r < d; r++) { n = Math.abs(Number(t[r].get(b))) || 0; if (!s[r]) { c += n } e[r] = c; if (r >= s.length) { s[r] = false } } s.length = d; if (c === 0) { return } h = 2 * Math.PI / c; for (r = 0; r < d; r++) { e[r] *= h } for (r = 0; r < a; r++) { k[r].setAnimation(u) } for (r = 0; r < d; r++) { for (q = 0; q < l; q++) { k[r * l + q].setAttributes({ startAngle: g, endAngle: e[r] - v, globalAlpha: 1, baseRotation: p }) } g = e[r] } for (r *= l; r < a; r++) { k[r].setAnimation(u); k[r].setAttributes({ startAngle: o, endAngle: o, globalAlpha: 0, baseRotation: p }) } }, updateLabelData: function() { var l = this, m = l.getStore(), k = m.getData().items, h = l.getSprites(), b = l.getLabel().getTemplate().getField(), f = l.getHidden(), a = l.spritesPerSlice, d, c, g, e, n; if (h.length && b) { e = []; for (d = 0, g = k.length; d < g; d++) { e.push(k[d].get(b)) } for (d = 0, c = 0, g = h.length; d < g; d += a, c++) { n = h[d]; n.setAttributes({ label: e[c] }); n.putMarker("labels", { hidden: f[c] }, n.attr.attributeId) } } }, applyRadius: function() { var f = this, d = f.getChart(), h = d.getInnerPadding(), e = d.getMainRect() || [0, 0, 1, 1], c = e[2] - h * 2, a = e[3] - h * 2 - f.getThickness(), g = c / 2, b = g * f.getDistortion(); if (b > a / 2) { return a / (f.getDistortion() * 2) } else { return g } }, getSprites: function() { var y = this, e = y.getStore(); if (!e) { return [] } var n = y.getChart(), p = y.getSurface(), t = e.getData().items, l = y.spritesPerSlice, a = t.length, v = y.getAnimation() || n && n.getAnimation(), x = y.getCenter(), w = y.getOffsetX(), u = y.getOffsetY(), b = y.getRadius(), q = y.getRotation(), d = y.getHighlight(), c = { centerX: x[0] + w, centerY: x[1] + u - y.getThickness() / 2, endRho: b, startRho: b * y.getDonut() / 100, thickness: y.getThickness(), distortion: y.getDistortion() }, k = y.sprites, h = y.getLabel(), f = h.getTemplate(), m, g, o, s, r; for (s = 0; s < a; s++) { g = Ext.apply({}, this.getStyleByIndex(s), c); if (!k[s * l]) { for (r = 0; r < y.partNames.length; r++) { o = p.add({ type: "pie3dPart", part: y.partNames[r] }); if (r === 0 && f.getField()) { o.bindMarker("labels", h) } o.fx.setDurationOn("baseRotation", q); if (d) { o.config.highlight = d; o.addModifier("highlight", true) } o.setAttributes(g); k.push(o) } } else { m = k.slice(s * l, (s + 1) * l); for (r = 0; r < m.length; r++) { o = m[r]; if (v) { o.setAnimation(v) } o.setAttributes(g) } } } return k }, betweenAngle: function(d, f, c) { var e = Math.PI * 2, g = this.rotationOffset; f += g; c += g; d -= f; c -= f; d %= e; c %= e; d += e; c += e; d %= e; c %= e; return d < c || c === 0 }, getItemForPoint: function(k, j) { var h = this, g = h.getSprites(); if (g) { var l = h.getStore(), b = l.getData().items, a = h.spritesPerSlice, e = h.getHidden(), c, f, m, d; for (c = 0, f = b.length; c < f; c++) { if (!e[c]) { d = c * a; m = g[d]; if (m.hitTest([k, j])) { return { series: h, sprite: g.slice(d, d + a), index: c, record: b[c], category: "sprites", field: h.getXField() } } } } return null } }, provideLegendInfo: function(f) { var h = this, k = h.getStore(); if (k) { var g = k.getData().items, b = h.getLabel().getTemplate().getField(), j = h.getField(), e = h.getHidden(), d, a, c; for (d = 0; d < g.length; d++) { a = h.getStyleByIndex(d); c = a.baseColor; f.push({ name: b ? String(g[d].get(b)) : j + " " + d, mark: c || "black", disabled: e[d], series: h.getId(), index: d }) } } } }, function() { var b = this.prototype, a = Ext.chart.series.sprite.Pie3DPart.def.getInitialConfig().processors.part; b.partNames = a.replace(/^enums\(|\)/g, "").split(","); b.spritesPerSlice = b.partNames.length }); Ext.define("Ext.chart.series.sprite.Polar", { extend: "Ext.chart.series.sprite.Series", inheritableStatics: { def: { processors: { centerX: "number", centerY: "number", startAngle: "number", endAngle: "number", startRho: "number", endRho: "number", baseRotation: "number", labels: "default", labelOverflowPadding: "number" }, defaults: { centerX: 0, centerY: 0, startAngle: 0, endAngle: Math.PI, startRho: 0, endRho: 150, baseRotation: 0, labels: null, labelOverflowPadding: 10 }, triggers: { centerX: "bbox", centerY: "bbox", startAngle: "bbox", endAngle: "bbox", startRho: "bbox", endRho: "bbox", baseRotation: "bbox" } } }, updatePlainBBox: function(b) { var a = this.attr; b.x = a.centerX - a.endRho; b.y = a.centerY + a.endRho; b.width = a.endRho * 2; b.height = a.endRho * 2 } }); Ext.define("Ext.chart.series.sprite.Radar", { alias: "sprite.radar", extend: "Ext.chart.series.sprite.Polar", getDataPointXY: function(d) { var u = this, n = u.attr, f = n.centerX, e = n.centerY, o = n.matrix, t = n.dataMinX, s = n.dataMaxX, k = n.dataX, j = n.dataY, l = n.endRho, p = n.startRho, g = n.baseRotation, i, h, m, c, b, a, q; if (n.rangeY) { q = n.rangeY[1] } else { q = n.dataMaxY } c = (k[d] - t) / (s - t + 1) * 2 * Math.PI + g; m = j[d] / q * (l - p) + p; b = f + Math.cos(c) * m; a = e + Math.sin(c) * m; i = o.x(b, a); h = o.y(b, a); return [i, h] }, render: function(a, l) { var h = this, f = h.attr, g = f.dataX, b = g.length, e = h.surfaceMatrix, d = {}, c, k, j, m; l.beginPath(); for (c = 0; c < b; c++) { m = h.getDataPointXY(c); k = m[0]; j = m[1]; if (c === 0) { l.moveTo(k, j) } l.lineTo(k, j); d.translationX = e.x(k, j); d.translationY = e.y(k, j); h.putMarker("markers", d, c, true) } l.closePath(); l.fillStroke(f) } }); Ext.define("Ext.chart.series.Radar", { extend: "Ext.chart.series.Polar", type: "radar", seriesType: "radar", alias: "series.radar", requires: ["Ext.chart.series.sprite.Radar"], themeColorCount: function() { return 1 }, isStoreDependantColorCount: false, themeMarkerCount: function() { return 1 }, updateAngularAxis: function(a) { a.processData(this) }, updateRadialAxis: function(a) { a.processData(this) }, coordinateX: function() { return this.coordinate("X", 0, 2) }, coordinateY: function() { return this.coordinate("Y", 1, 2) }, updateCenter: function(a) { this.setStyle({ translationX: a[0] + this.getOffsetX(), translationY: a[1] + this.getOffsetY() }); this.doUpdateStyles() }, updateRadius: function(a) { this.setStyle({ endRho: a }); this.doUpdateStyles() }, updateRotation: function(a) { this.setStyle({ rotationRads: a }); this.doUpdateStyles() }, updateTotalAngle: function(a) { this.processData() }, getItemForPoint: function(k, j) { var h = this, m = h.sprites && h.sprites[0], f = m.attr, g = f.dataX, a = g.length, l = h.getStore(), e = h.getMarker(), b, o, p, d, n, c; if (h.getHidden()) { return null } if (m && e) { c = m.getMarker("markers"); for (d = 0; d < a; d++) { n = c.getBBoxFor(d); b = (n.width + n.height) * 0.25; p = m.getDataPointXY(d); if (Math.abs(p[0] - k) < b && Math.abs(p[1] - j) < b) { o = { series: h, sprite: m, index: d, category: "markers", record: l.getData().items[d], field: h.getYField() }; return o } } } return h.callParent(arguments) }, getDefaultSpriteConfig: function() { var a = this.callParent(), b = { customDurations: { translationX: 0, translationY: 0, rotationRads: 0, dataMinX: 0, dataMaxX: 0 } }; if (a.fx) { Ext.apply(a.fx, b) } else { a.fx = b } return a }, getSprites: function() { var d = this, c = d.getChart(), e = d.getAnimation() || c && c.getAnimation(), b = d.sprites[0], a; if (!c) { return [] } if (!b) { b = d.createSprite() } if (e) { a = b.getMarker("markers"); if (a) { a.getTemplate().setAnimation(e) } b.setAnimation(e) } return d.sprites }, provideLegendInfo: function(d) { var b = this, a = b.getSubStyleWithTheme(), c = a.fillStyle; if (Ext.isArray(c)) { c = c[0] } d.push({ name: b.getTitle() || b.getYField() || b.getId(), mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black", disabled: b.getHidden(), series: b.getId(), index: 0 }) } }); Ext.define("Ext.chart.series.sprite.Scatter", { alias: "sprite.scatterSeries", extend: "Ext.chart.series.sprite.Cartesian", renderClipped: function(r, s, w, u) { if (this.cleanRedraw) { return } var C = this, q = C.attr, l = q.dataX, h = q.dataY, z = q.labels, j = C.getSeries(), b = z && C.getMarker("labels"), t = C.attr.matrix, c = t.getXX(), p = t.getYY(), m = t.getDX(), k = t.getDY(), n = {}, D, B, d = r.getInherited().rtl && !q.flipXY ? -1 : 1, a, A, o, e, g, f, v; if (q.flipXY) { a = u[1] - c * d; A = u[1] + u[3] + c * d; o = u[0] - p; e = u[0] + u[2] + p } else { a = u[0] - c * d; A = u[0] + u[2] + c * d; o = u[1] - p; e = u[1] + u[3] + p } for (v = 0; v < l.length; v++) { g = l[v]; f = h[v]; g = g * c + m; f = f * p + k; if (a <= g && g <= A && o <= f && f <= e) { if (q.renderer) { n = { type: "items", translationX: g, translationY: f }; B = [C, n, { store: C.getStore() }, v]; D = Ext.callback(q.renderer, null, B, 0, j); n = Ext.apply(n, D) } else { n.translationX = g; n.translationY = f } C.putMarker("items", n, v, !q.renderer); if (b && z[v]) { C.drawLabel(z[v], g, f, v, u) } } } }, drawLabel: function(j, h, g, p, a) { var r = this, m = r.attr, d = r.getMarker("labels"), c = d.getTemplate(), l = r.labelCfg || (r.labelCfg = {}), b = r.surfaceMatrix, f, e, i = m.labelOverflowPadding, o = m.flipXY, k, n, s, q; l.text = j; n = r.getMarkerBBox("labels", p, true); if (!n) { r.putMarker("labels", l, p); n = r.getMarkerBBox("labels", p, true) } if (o) { l.rotationRads = Math.PI * 0.5 } else { l.rotationRads = 0 } k = n.height / 2; f = h; switch (c.attr.display) { case "under": e = g - k - i; break; case "rotate": f += i; e = g - i; l.rotationRads = -Math.PI / 4; break; default: e = g + k + i } l.x = b.x(f, e); l.y = b.y(f, e); if (c.attr.renderer) { q = [j, d, l, { store: r.getStore() }, p]; s = Ext.callback(c.attr.renderer, null, q, 0, r.getSeries()); if (typeof s === "string") { l.text = s } else { Ext.apply(l, s) } } r.putMarker("labels", l, p) } }); Ext.define("Ext.chart.series.Scatter", { extend: "Ext.chart.series.Cartesian", alias: "series.scatter", type: "scatter", seriesType: "scatterSeries", requires: ["Ext.chart.series.sprite.Scatter"], config: { itemInstancing: { fx: { customDurations: { translationX: 0, translationY: 0 } } } }, themeMarkerCount: function() { return 1 }, applyMarker: function(b, a) { this.getItemInstancing(); this.setItemInstancing(b); return this.callParent(arguments) }, provideLegendInfo: function(d) { var b = this, a = b.getMarkerStyleByIndex(0), c = a.fillStyle; d.push({ name: b.getTitle() || b.getYField() || b.getId(), mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black", disabled: b.getHidden(), series: b.getId(), index: 0 }) } }); Ext.define("Ext.chart.theme.Blue", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.blue", "chart.theme.Blue"], config: { baseColor: "#4d7fe6" } }); Ext.define("Ext.chart.theme.BlueGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.blue-gradients", "chart.theme.Blue:gradients"], config: { baseColor: "#4d7fe6", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category1", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category1", "chart.theme.Category1"], config: { colors: ["#f0a50a", "#c20024", "#2044ba", "#810065", "#7eae29"] } }); Ext.define("Ext.chart.theme.Category1Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category1-gradients", "chart.theme.Category1:gradients"], config: { colors: ["#f0a50a", "#c20024", "#2044ba", "#810065", "#7eae29"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category2", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category2", "chart.theme.Category2"], config: { colors: ["#6d9824", "#87146e", "#2a9196", "#d39006", "#1e40ac"] } }); Ext.define("Ext.chart.theme.Category2Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category2-gradients", "chart.theme.Category2:gradients"], config: { colors: ["#6d9824", "#87146e", "#2a9196", "#d39006", "#1e40ac"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category3", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category3", "chart.theme.Category3"], config: { colors: ["#fbbc29", "#ce2e4e", "#7e0062", "#158b90", "#57880e"] } }); Ext.define("Ext.chart.theme.Category3Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category3-gradients", "chart.theme.Category3:gradients"], config: { colors: ["#fbbc29", "#ce2e4e", "#7e0062", "#158b90", "#57880e"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category4", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category4", "chart.theme.Category4"], config: { colors: ["#ef5773", "#fcbd2a", "#4f770d", "#1d3eaa", "#9b001f"] } }); Ext.define("Ext.chart.theme.Category4Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category4-gradients", "chart.theme.Category4:gradients"], config: { colors: ["#ef5773", "#fcbd2a", "#4f770d", "#1d3eaa", "#9b001f"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category5", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category5", "chart.theme.Category5"], config: { colors: ["#7eae29", "#fdbe2a", "#910019", "#27b4bc", "#d74dbc"] } }); Ext.define("Ext.chart.theme.Category5Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category5-gradients", "chart.theme.Category5:gradients"], config: { colors: ["#7eae29", "#fdbe2a", "#910019", "#27b4bc", "#d74dbc"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Category6", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category6", "chart.theme.Category6"], config: { colors: ["#44dce1", "#0b2592", "#996e05", "#7fb325", "#b821a1"] } }); Ext.define("Ext.chart.theme.Category6Gradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.category6-gradients", "chart.theme.Category6:gradients"], config: { colors: ["#44dce1", "#0b2592", "#996e05", "#7fb325", "#b821a1"], gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.DefaultGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.default-gradients", "chart.theme.Base:gradients"], config: { gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Green", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.green", "chart.theme.Green"], config: { baseColor: "#b1da5a" } }); Ext.define("Ext.chart.theme.GreenGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.green-gradients", "chart.theme.Green:gradients"], config: { baseColor: "#b1da5a", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Midnight", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.midnight", "chart.theme.Midnight"], config: { colors: ["#A837FF", "#4AC0F2", "#FF4D35", "#FF8809", "#61C102", "#FF37EA"], chart: { defaults: { background: "rgb(52, 52, 53)" } }, axis: { defaults: { style: { strokeStyle: "rgb(224, 224, 227)" }, label: { fillStyle: "rgb(224, 224, 227)" }, title: { fillStyle: "rgb(224, 224, 227)" }, grid: { strokeStyle: "rgb(112, 112, 115)" } } }, series: { defaults: { label: { fillStyle: "rgb(224, 224, 227)" } } }, sprites: { text: { fillStyle: "rgb(224, 224, 227)" } } } }); Ext.define("Ext.chart.theme.Muted", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.muted", "chart.theme.Muted"], config: { colors: ["#8ca640", "#974144", "#4091ba", "#8e658e", "#3b8d8b", "#b86465", "#d2af69", "#6e8852", "#3dcc7e", "#a6bed1", "#cbaa4b", "#998baa"] } }); Ext.define("Ext.chart.theme.Purple", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.purple", "chart.theme.Purple"], config: { baseColor: "#da5abd" } }); Ext.define("Ext.chart.theme.PurpleGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.purple-gradients", "chart.theme.Purple:gradients"], config: { baseColor: "#da5abd", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Red", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.red", "chart.theme.Red"], config: { baseColor: "#e84b67" } }); Ext.define("Ext.chart.theme.RedGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.red-gradients", "chart.theme.Red:gradients"], config: { baseColor: "#e84b67", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Sky", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.sky", "chart.theme.Sky"], config: { baseColor: "#4ce0e7" } }); Ext.define("Ext.chart.theme.SkyGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.sky-gradients", "chart.theme.Sky:gradients"], config: { baseColor: "#4ce0e7", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.chart.theme.Yellow", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.yellow", "chart.theme.Yellow"], config: { baseColor: "#fec935" } }); Ext.define("Ext.chart.theme.YellowGradients", { extend: "Ext.chart.theme.Base", singleton: true, alias: ["chart.theme.yellow-gradients", "chart.theme.Yellow:gradients"], config: { baseColor: "#fec935", gradients: { type: "linear", degrees: 90 } } }); Ext.define("Ext.draw.Point", { requires: ["Ext.draw.Draw", "Ext.draw.Matrix"], isPoint: true, x: 0, y: 0, length: 0, angle: 0, angleUnits: "degrees", statics: { fly: (function() { var a = null; return function(b, c) { if (!a) { a = new Ext.draw.Point() } a.constructor(b, c); return a } })() }, constructor: function(a, c) { var b = this; if (typeof a === "number") { b.x = a; if (typeof c === "number") { b.y = c } else { b.y = a } } else { if (Ext.isArray(a)) { b.x = a[0]; b.y = a[1] } else { if (a) { b.x = a.x; b.y = a.y } } } b.calculatePolar() }, calculateCartesian: function() { var b = this, a = b.length, c = b.angle; if (b.angleUnits === "degrees") { c = Ext.draw.Draw.rad(c) } b.x = Math.cos(c) * a; b.y = Math.sin(c) * a }, calculatePolar: function() { var b = this, a = b.x, c = b.y; b.length = Math.sqrt(a * a + c * c); b.angle = Math.atan2(c, a); if (b.angleUnits === "degrees") { b.angle = Ext.draw.Draw.degrees(b.angle) } }, setX: function(a) { this.x = a; this.calculatePolar() }, setY: function(a) { this.y = a; this.calculatePolar() }, set: function(a, b) { this.constructor(a, b) }, setAngle: function(a) { this.angle = a; this.calculateCartesian() }, setLength: function(a) { this.length = a; this.calculateCartesian() }, setPolar: function(b, a) { this.angle = b; this.length = a; this.calculateCartesian() }, clone: function() { return new Ext.draw.Point(this.x, this.y) }, add: function(a, c) { var b = Ext.draw.Point.fly(a, c); return new Ext.draw.Point(this.x + b.x, this.y + b.y) }, sub: function(a, c) { var b = Ext.draw.Point.fly(a, c); return new Ext.draw.Point(this.x - b.x, this.y - b.y) }, mul: function(a) { return new Ext.draw.Point(this.x * a, this.y * a) }, div: function(a) { return new Ext.draw.Point(this.x / a, this.y / a) }, dot: function(a, c) { var b = Ext.draw.Point.fly(a, c); return this.x * b.x + this.y * b.y }, equals: function(a, c) { var b = Ext.draw.Point.fly(a, c); return this.x === b.x && this.y === b.y }, rotate: function(f, c) { var d, e, b, g, a; if (this.angleUnits === "degrees") { f = Ext.draw.Draw.rad(f); d = Math.sin(f); e = Math.cos(f) } if (c) { b = c.x; g = c.y } else { b = 0; g = 0 } a = Ext.draw.Matrix.fly([e, d, -d, e, b - e * b + g * d, g - e * g + b * -d]).transformPoint(this); return new Ext.draw.Point(a) }, transform: function(a) { if (a && a.isMatrix) { return new Ext.draw.Point(a.transformPoint(this)) } else { if (arguments.length === 6) { return new Ext.draw.Point(Ext.draw.Matrix.fly(arguments).transformPoint(this)) } else { Ext.raise("Invalid parameters.") } } }, round: function() { return new Ext.draw.Point(Math.round(this.x), Math.round(this.y)) }, ceil: function() { return new Ext.draw.Point(Math.ceil(this.x), Math.ceil(this.y)) }, floor: function() { return new Ext.draw.Point(Math.floor(this.x), Math.floor(this.y)) }, abs: function(a, b) { return new Ext.draw.Point(Math.abs(this.x), Math.abs(this.y)) }, normalize: function(c) { var b = this.x, f = this.y, a, e, d; c = c || 1; if (b === 0) { a = 0; e = c * Ext.Number.sign(f) } else { d = f / b; a = c / Math.sqrt(1 + d * d); e = a * d } return new Ext.draw.Point(a, e) }, getDistanceToLine: function(c, b) { if (arguments.length === 4) { c = new Ext.draw.Point(arguments[0], arguments[1]); b = new Ext.draw.Point(arguments[2], arguments[3]) } var d = b.sub(c).normalize(), a = c.sub(this); return a.sub(d.mul(a.dot(d))) }, isZero: function() { return this.x === 0 && this.y === 0 }, isNumber: function() { return Ext.isNumber(this.x + this.y) } }); Ext.define("Ext.draw.plugin.SpriteEvents", { extend: "Ext.plugin.Abstract", alias: "plugin.spriteevents", requires: ["Ext.draw.PathUtil"], mouseMoveEvents: { mousemove: true, mouseover: true, mouseout: true }, spriteMouseMoveEvents: { spritemousemove: true, spritemouseover: true, spritemouseout: true }, init: function(a) { var b = "handleEvent"; this.drawContainer = a; a.addElementListener({ click: b, dblclick: b, mousedown: b, mousemove: b, mouseup: b, mouseover: b, mouseout: b, priority: 1001, scope: this }) }, hasSpriteMouseMoveListeners: function() { var b = this.drawContainer.hasListeners, a; for (a in this.spriteMouseMoveEvents) { if (a in b) { return true } } return false }, hitTestEvent: function(f) { var b = this.drawContainer.getItems(), a, d, c; for (c = b.length - 1; c >= 0; c--) { a = b.get(c); d = a.hitTestEvent(f); if (d) { return d } } return null }, handleEvent: function(f) { var d = this, b = d.drawContainer, g = f.type in d.mouseMoveEvents, a = d.lastSprite, c; if (g && !d.hasSpriteMouseMoveListeners()) { return } c = d.hitTestEvent(f); if (g && !Ext.Object.equals(c, a)) { if (a) { b.fireEvent("spritemouseout", a, f) } if (c) { b.fireEvent("spritemouseover", c, f) } } if (c) { b.fireEvent("sprite" + f.type, c, f) } d.lastSprite = c } }); Ext.define("Ext.chart.TipSurface", { extend: "Ext.draw.Container", spriteArray: false, renderFirst: true, constructor: function(a) { this.callParent([a]); if (a.sprites) { this.spriteArray = [].concat(a.sprites); delete a.sprites } }, onRender: function() { var c = this, b = 0, a = 0, d, e; this.callParent(arguments); e = c.spriteArray; if (c.renderFirst && e) { c.renderFirst = false; for (a = e.length; b < a; b++) { d = c.surface.add(e[b]); d.setAttributes({ hidden: false }, true) } } } }); Ext.define("Ext.chart.interactions.ItemInfo", { extend: "Ext.chart.interactions.Abstract", type: "iteminfo", alias: "interaction.iteminfo", config: { extjsGestures: { start: { event: "click", handler: "onInfoGesture" }, move: { event: "mousemove", handler: "onInfoGesture" }, end: { event: "mouseleave", handler: "onInfoGesture" } } }, item: null, onInfoGesture: function(f, a) { var c = this, b = c.getItemForEvent(f), d = b && b.series.tooltip; if (d) { d.onMouseMove.call(d, f) } if (b !== c.item) { if (b) { b.series.showTip(b) } else { c.item.series.hideTip(c.item) } c.item = b } return false } });