(function () { var h = window.AmCharts; h.AmPieChart = h.Class({ inherits: h.AmSlicedChart, construct: function (d) { this.type = "pie"; h.AmPieChart.base.construct.call(this, d); this.cname = "AmPieChart"; this.pieBrightnessStep = 30; this.minRadius = 10; this.depth3D = 0; this.startAngle = 90; this.angle = this.innerRadius = 0; this.startRadius = "500%"; this.pullOutRadius = "20%"; this.labelRadius = 20; this.labelText = "[[title]]: [[percents]]%"; this.balloonText = "[[title]]: [[percents]]% ([[value]])\n[[description]]"; this.previousScale = 1; this.adjustPrecision = !1; h.applyTheme(this, d, this.cname) }, drawChart: function () { h.AmPieChart.base.drawChart.call(this); var d = this.chartData; if (h.ifArray(d)) { if (0 < this.realWidth && 0 < this.realHeight) { h.VML && (this.startAlpha = 1); var f = this.startDuration, c = this.container, b = this.updateWidth(); this.realWidth = b; var m = this.updateHeight(); this.realHeight = m; var e = h.toCoordinate, k = e(this.marginLeft, b), a = e(this.marginRight, b), v = e(this.marginTop, m) + this.getTitleHeight(), n = e(this.marginBottom, m), y, z, g, x = h.toNumber(this.labelRadius), q = this.measureMaxLabel(); q > this.maxLabelWidth && (q = this.maxLabelWidth); this.labelText && this.labelsEnabled || (x = q = 0); y = void 0 === this.pieX ? (b - k - a) / 2 + k : e(this.pieX, this.realWidth); z = void 0 === this.pieY ? (m - v - n) / 2 + v : e(this.pieY, m); g = e(this.radius, b, m); g || (b = 0 <= x ? b - k - a - 2 * q : b - k - a, m = m - v - n, g = Math.min(b, m), m < b && (g /= 1 - this.angle / 90, g > b && (g = b)), m = h.toCoordinate(this.pullOutRadius, g), g = (0 <= x ? g - 1.8 * (x + m) : g - 1.8 * m) / 2); g < this.minRadius && (g = this.minRadius); m = e(this.pullOutRadius, g); v = h.toCoordinate(this.startRadius, g); e = e(this.innerRadius, g); e >= g && (e = g - 1); n = h.fitToBounds(this.startAngle, 0, 360); 0 < this.depth3D && (n = 270 <= n ? 270 : 90); n -= 90; b = g - g * this.angle / 90; for (k = q = 0; k < d.length; k++) a = d[k], !0 !== a.hidden && (q += h.roundTo(a.percents, this.pf.precision)); q = h.roundTo(q, this.pf.precision); this.tempPrec = NaN; this.adjustPrecision && 100 != q && (this.tempPrec = this.pf.precision + 1); for (k = 0; k < d.length; k++) if (a = d[k], !0 !== a.hidden && 0 < a.percents) { var r = 360 * a.percents / 100, q = Math.sin((n + r / 2) / 180 * Math.PI), A = -Math.cos((n + r / 2) / 180 * Math.PI) * (b / g), p = this.outlineColor; p || (p = a.color); var B = this.alpha; isNaN(a.alpha) || (B = a.alpha); p = { fill: a.color, stroke: p, "stroke-width": this.outlineThickness, "stroke-opacity": this.outlineAlpha, "fill-opacity": B }; a.url && (p.cursor = "pointer"); p = h.wedge(c, y, z, n, r, g, b, e, this.depth3D, p, this.gradientRatio, a.pattern, this.path); h.setCN(this, p, "pie-item"); h.setCN(this, p.wedge, "pie-slice"); h.setCN(this, p, a.className, !0); this.addEventListeners(p, a); a.startAngle = n; d[k].wedge = p; 0 < f && (this.chartCreated || p.setAttr("opacity", this.startAlpha)); a.ix = q; a.iy = A; a.wedge = p; a.index = k; if (this.labelsEnabled && this.labelText && a.percents >= this.hideLabelsPercent) { var l = n + r / 2; 360 < l && (l -= 360); var t = x; isNaN(a.labelRadius) || (t = a.labelRadius); var r = y + q * (g + t), B = z + A * (g + t), C, w = 0; if (0 <= t) { var D; 90 >= l && 0 <= l ? (D = 0, C = "start", w = 8) : 90 <= l && 180 > l ? (D = 1, C = "start", w = 8) : 180 <= l && 270 > l ? (D = 2, C = "end", w = -8) : 270 <= l && 360 > l && (D = 3, C = "end", w = -8); a.labelQuarter = D } else C = "middle"; var l = this.formatString(this.labelText, a), u = this.labelFunction; u && (l = u(a, l)); u = a.labelColor; u || (u = this.color); "" !== l && (l = h.wrappedText(c, l, u, this.fontFamily, this.fontSize, C, !1, this.maxLabelWidth), h.setCN(this, l, "pie-label"), h.setCN(this, l, a.className, !0), l.translate(r + 1.5 * w, B), l.node.style.pointerEvents = "none", a.tx = r + 1.5 * w, a.ty = B, 0 <= t ? (t = l.getBBox(), u = h.rect(c, t.width + 5, t.height + 5, "#FFFFFF", .005), u.translate(r + 1.5 * w + t.x, B + t.y), a.hitRect = u, p.push(l), p.push(u)) : this.freeLabelsSet.push(l), a.label = l); a.tx = r; a.tx2 = r + w; a.tx0 = y + q * g; a.ty0 = z + A * g } r = e + (g - e) / 2; a.pulled && (r += this.pullOutRadiusReal); a.balloonX = q * r + y; a.balloonY = A * r + z; a.startX = Math.round(q * v); a.startY = Math.round(A * v); a.pullX = Math.round(q * m); a.pullY = Math.round(A * m); this.graphsSet.push(p); (0 === a.alpha || 0 < f && !this.chartCreated) && p.hide(); n += 360 * a.percents / 100 } 0 < x && !this.labelRadiusField && this.arrangeLabels(); this.pieXReal = y; this.pieYReal = z; this.radiusReal = g; this.innerRadiusReal = e; 0 < x && this.drawTicks(); this.initialStart(); this.setDepths() }(d = this.legend) && d.invalidateSize() } else this.cleanChart(); this.dispDUpd(); this.chartCreated = !0 }, setDepths: function () { var d = this.chartData, f; for (f = 0; f < d.length; f++) { var c = d[f], b = c.wedge, c = c.startAngle; 0 <= c && 180 > c ? b.toFront() : 180 <= c && b.toBack() } }, arrangeLabels: function () { var d = this.chartData, f = d.length, c, b; for (b = f - 1; 0 <= b; b--) c = d[b], 0 !== c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 0, !0, 0); for (b = 0; b < f; b++) c = d[b], 1 != c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 1, !1, 0); for (b = f - 1; 0 <= b; b--) c = d[b], 2 != c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 2, !0, 0); for (b = 0; b < f; b++) c = d[b], 3 != c.labelQuarter || c.hidden || this.checkOverlapping(b, c, 3, !1, 0) }, checkOverlapping: function (d, f, c, b, h) { var e, k, a = this.chartData, v = a.length, n = f.label; if (n) { if (!0 === b) for (k = d + 1; k < v; k++) a[k].labelQuarter == c && (e = this.checkOverlappingReal(f, a[k], c)) && (k = v); else for (k = d - 1; 0 <= k; k--) a[k].labelQuarter == c && (e = this.checkOverlappingReal(f, a[k], c)) && (k = 0); !0 === e && 100 > h && (e = f.ty + 3 * f.iy, f.ty = e, n.translate(f.tx2, e), f.hitRect && (n = n.getBBox(), f.hitRect.translate(f.tx2 + n.x, e + n.y)), this.checkOverlapping(d, f, c, b, h + 1)) } }, checkOverlappingReal: function (d, f, c) { var b = !1, m = d.label, e = f.label; d.labelQuarter != c || d.hidden || f.hidden || !e || (m = m.getBBox(), c = {}, c.width = m.width, c.height = m.height, c.y = d.ty, c.x = d.tx, d = e.getBBox(), e = {}, e.width = d.width, e.height = d.height, e.y = f.ty, e.x = f.tx, h.hitTest(c, e) && (b = !0)); return b } }) })();