(function () { var d; window.AmCharts ? d = window.AmCharts : (d = {}, window.AmCharts = d, d.themes = {}, d.maps = {}, d.inheriting = {}, d.charts = [], d.onReadyArray = [], d.useUTC = !1, d.updateRate = 30, d.uid = 0, d.lang = {}, d.translations = {}, d.mapTranslations = {}, d.windows = {}, d.initHandlers = []); d.Class = function (a) { var b = function () { arguments[0] !== d.inheriting && (this.events = {}, this.construct.apply(this, arguments)) }; a.inherits ? (b.prototype = new a.inherits(d.inheriting), b.base = a.inherits.prototype, delete a.inherits) : (b.prototype.createEvents = function () { for (var a = 0, b = arguments.length; a < b; a++) this.events[arguments[a]] = [] }, b.prototype.listenTo = function (a, b, c) { this.removeListener(a, b, c); a.events[b].push({ handler: c, scope: this }) }, b.prototype.addListener = function (a, b, c) { this.removeListener(this, a, b); this.events[a].push({ handler: b, scope: c }) }, b.prototype.removeListener = function (a, b, c) { if (a && a.events) for (a = a.events[b], b = a.length - 1; 0 <= b; b--) a[b].handler === c && a.splice(b, 1) }, b.prototype.fire = function (a, b) { for (var c = this.events[a], d = 0, k = c.length; d < k; d++) { var l = c[d]; l.handler.call(l.scope, b) } }); for (var c in a) b.prototype[c] = a[c]; return b }; d.addChart = function (a) { d.updateInt || (d.updateInt = setInterval(function () { d.update() }, Math.round(1E3 / d.updateRate))); d.charts.push(a) }; d.removeChart = function (a) { for (var b = d.charts, c = b.length - 1; 0 <= c; c--) b[c] == a && b.splice(c, 1); 0 === b.length && d.updateInt && (clearInterval(d.updateInt), d.updateInt = NaN) }; d.isModern = !0; d.getIEVersion = function () { var a = 0, b, c; "Microsoft Internet Explorer" == navigator.appName && (b = navigator.userAgent, c = /MSIE ([0-9]{1,}[.0-9]{0,})/, null !== c.exec(b) && (a = parseFloat(RegExp.$1))); return a }; d.applyLang = function (a, b) { var c = d.translations; b.dayNames = d.extend({}, d.dayNames); b.shortDayNames = d.extend({}, d.shortDayNames); b.monthNames = d.extend({}, d.monthNames); b.shortMonthNames = d.extend({}, d.shortMonthNames); c && (c = c[a]) && (d.lang = c, c.monthNames && (b.dayNames = d.extend({}, c.dayNames), b.shortDayNames = d.extend({}, c.shortDayNames), b.monthNames = d.extend({}, c.monthNames), b.shortMonthNames = d.extend({}, c.shortMonthNames))) }; d.IEversion = d.getIEVersion(); 9 > d.IEversion && 0 < d.IEversion && (d.isModern = !1, d.isIE = !0); d.dx = 0; d.dy = 0; if (document.addEventListener || window.opera) d.isNN = !0, d.isIE = !1, d.dx = .5, d.dy = .5; document.attachEvent && (d.isNN = !1, d.isIE = !0, d.isModern || (d.dx = 0, d.dy = 0)); window.chrome && (d.chrome = !0); d.handleMouseUp = function (a) { for (var b = d.charts, c = 0; c < b.length; c++) { var e = b[c]; e && e.handleReleaseOutside && e.handleReleaseOutside(a) } }; d.handleMouseMove = function (a) { for (var b = d.charts, c = 0; c < b.length; c++) { var e = b[c]; e && e.handleMouseMove && e.handleMouseMove(a) } }; d.handleWheel = function (a) { for (var b = d.charts, c = 0; c < b.length; c++) { var e = b[c]; if (e && e.mouseIsOver) { e.mouseWheelScrollEnabled || e.mouseWheelZoomEnabled ? e.handleWheel && e.handleWheel(a) : a.stopPropagation && a.stopPropagation(); break } } }; d.resetMouseOver = function () { for (var a = d.charts, b = 0; b < a.length; b++) { var c = a[b]; c && (c.mouseIsOver = !1) } }; d.ready = function (a) { d.onReadyArray.push(a) }; d.handleLoad = function () { d.isReady = !0; for (var a = d.onReadyArray, b = 0; b < a.length; b++) { var c = a[b]; isNaN(d.processDelay) ? c() : setTimeout(c, d.processDelay * b) } }; d.addInitHandler = function (a, b) { d.initHandlers.push({ method: a, types: b }) }; d.callInitHandler = function (a) { var b = d.initHandlers; if (d.initHandlers) for (var c = 0; c < b.length; c++) { var e = b[c]; e.types ? d.isInArray(e.types, a.type) && e.method(a) : e.method(a) } }; d.getUniqueId = function () { d.uid++; return "AmChartsEl-" + d.uid }; d.isNN && (document.addEventListener("mousemove", d.handleMouseMove, !0), document.addEventListener("mouseup", d.handleMouseUp, !0), window.addEventListener("load", d.handleLoad, !0), window.addEventListener("DOMMouseScroll", d.handleWheel, !0), document.addEventListener("mousewheel", d.handleWheel, !0)); d.isIE && (document.attachEvent("onmousemove", d.handleMouseMove), document.attachEvent("onmouseup", d.handleMouseUp), window.attachEvent("onload", d.handleLoad)); d.clear = function () { var a = d.charts; if (a) for (var b = a.length - 1; 0 <= b; b--) a[b].clear(); d.updateInt && clearInterval(d.updateInt); d.charts = []; d.isNN && (document.removeEventListener("mousemove", d.handleMouseMove, !0), document.removeEventListener("mouseup", d.handleMouseUp, !0), window.removeEventListener("load", d.handleLoad, !0), window.removeEventListener("DOMMouseScroll", d.handleWheel, !0), document.removeEventListener("mousewheel", d.handleWheel, !0)); d.isIE && (document.detachEvent("onmousemove", d.handleMouseMove), document.detachEvent("onmouseup", d.handleMouseUp), window.detachEvent("onload", d.handleLoad)) }; d.makeChart = function (a, b, c) { var e = b.type, h = b.theme; d.isString(h) && (h = d.themes[h], b.theme = h); var f; switch (e) { case "serial": f = new d.AmSerialChart(h); break; case "xy": f = new d.AmXYChart(h); break; case "pie": f = new d.AmPieChart(h); break; case "radar": f = new d.AmRadarChart(h); break; case "gauge": f = new d.AmAngularGauge(h); break; case "funnel": f = new d.AmFunnelChart(h); break; case "map": f = new d.AmMap(h); break; case "stock": f = new d.AmStockChart(h); break; case "gantt": f = new d.AmGanttChart(h) } d.extend(f, b); d.isReady ? isNaN(c) ? f.write(a) : setTimeout(function () { d.realWrite(f, a) }, c) : d.ready(function () { isNaN(c) ? f.write(a) : setTimeout(function () { d.realWrite(f, a) }, c) }); return f }; d.realWrite = function (a, b) { a.write(b) }; d.updateCount = 0; d.validateAt = Math.round(d.updateRate / 5); d.update = function () { var a = d.charts; d.updateCount++; var b = !1; d.updateCount == d.validateAt && (b = !0, d.updateCount = 0); if (a) for (var c = 0; c < a.length; c++) a[c].update && a[c].update(), b && a[c].autoResize && a[c].validateSize && a[c].validateSize() }; d.bezierX = 3; d.bezierY = 6 })(); (function () { var d = window.AmCharts; d.toBoolean = function (a, b) { if (void 0 === a) return b; switch (String(a).toLowerCase()) { case "true": case "yes": case "1": return !0; case "false": case "no": case "0": case null: return !1; default: return Boolean(a) } }; d.removeFromArray = function (a, b) { var c; if (void 0 !== b && void 0 !== a) for (c = a.length - 1; 0 <= c; c--) a[c] == b && a.splice(c, 1) }; d.getPath = function () { var a = document.getElementsByTagName("script"); if (a) for (var b = 0; b < a.length; b++) { var c = a[b].src; if (-1 !== c.search(/\/(amcharts|ammap)\.js/)) return c.replace(/\/(amcharts|ammap)\.js.*/, "/") } }; d.normalizeUrl = function (a) { return "" !== a && -1 === a.search(/\/$/) ? a + "/" : a }; d.isAbsolute = function (a) { return 0 === a.search(/^http[s]?:|^\//) }; d.isInArray = function (a, b) { for (var c = 0; c < a.length; c++) if (a[c] == b) return !0; return !1 }; d.getDecimals = function (a) { var b = 0; isNaN(a) || (a = String(a), -1 != a.indexOf("e-") ? b = Number(a.split("-")[1]) : -1 != a.indexOf(".") && (b = a.split(".")[1].length)); return b }; d.wrappedText = function (a, b, c, e, h, f, g, k, l) { var m = d.text(a, b, c, e, h, f, g), n = "\n"; d.isModern || (n = "
"); if (10 < l) return m; if (m) { var q = m.getBBox(); if (q.width > k) { q = Math.ceil(q.width / k); m.remove(); for (var m = [], p = 0; - 1 < (p = b.indexOf(" ", p));) m.push(p), p += 1; for (var r, p = 0; p < m.length; p += Math.ceil(m.length / q)) r = m[p], b = b.substr(0, r) + n + b.substr(r + 1); if (isNaN(r)) { if (0 === l) for (p = 1; p < q; p++) r = Math.round(b.length / q * p), b = b.substr(0, r) + n + b.substr(r); return d.text(a, b, c, e, h, f, g) } return d.wrappedText(a, b, c, e, h, f, g, k, l + 1) } return m } }; d.getStyle = function (a, b) { var c = ""; document.defaultView && document.defaultView.getComputedStyle ? c = document.defaultView.getComputedStyle(a, "").getPropertyValue(b) : a.currentStyle && (b = b.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase() }), c = a.currentStyle[b]); return c }; d.removePx = function (a) { if (void 0 !== a) return Number(a.substring(0, a.length - 2)) }; d.getURL = function (a, b) { if (a) if ("_self" != b && b) if ("_top" == b && window.top) window.top.location.href = a; else if ("_parent" == b && window.parent) window.parent.location.href = a; else if ("_blank" == b) window.open(a); else { var c = document.getElementsByName(b)[0]; c ? c.src = a : (c = d.windows[b]) ? c.opener && !c.opener.closed ? c.location.href = a : d.windows[b] = window.open(a) : d.windows[b] = window.open(a) } else window.location.href = a }; d.ifArray = function (a) { return a && 0 < a.length ? !0 : !1 }; d.callMethod = function (a, b) { var c; for (c = 0; c < b.length; c++) { var e = b[c]; if (e) { if (e[a]) e[a](); var h = e.length; if (0 < h) { var d; for (d = 0; d < h; d++) { var g = e[d]; if (g && g[a]) g[a]() } } } } }; d.toNumber = function (a) { return "number" == typeof a ? a : Number(String(a).replace(/[^0-9\-.]+/g, "")) }; d.toColor = function (a) { if ("" !== a && void 0 !== a) if (-1 != a.indexOf(",")) { a = a.split(","); var b; for (b = 0; b < a.length; b++) { var c = a[b].substring(a[b].length - 6, a[b].length); a[b] = "#" + c } } else a = a.substring(a.length - 6, a.length), a = "#" + a; return a }; d.toCoordinate = function (a, b, c) { var e; void 0 !== a && (a = String(a), c && c < b && (b = c), e = Number(a), -1 != a.indexOf("!") && (e = b - Number(a.substr(1))), -1 != a.indexOf("%") && (e = b * Number(a.substr(0, a.length - 1)) / 100)); return e }; d.fitToBounds = function (a, b, c) { a < b && (a = b); a > c && (a = c); return a }; d.isDefined = function (a) { return void 0 === a ? !1 : !0 }; d.stripNumbers = function (a) { return a.replace(/[0-9]+/g, "") }; d.roundTo = function (a, b) { if (0 > b) return a; var c = Math.pow(10, b); return Math.round(a * c) / c }; d.toFixed = function (a, b) { var c = String(Math.round(a * Math.pow(10, b))); if (0 < b) { var e = c.length; if (e < b) { var h; for (h = 0; h < b - e; h++) c = "0" + c } e = c.substring(0, c.length - b); "" === e && (e = 0); return e + "." + c.substring(c.length - b, c.length) } return String(c) }; d.formatDuration = function (a, b, c, e, h, f) { var g = d.intervals, k = f.decimalSeparator; if (a >= g[b].contains) { var l = a - Math.floor(a / g[b].contains) * g[b].contains; "ss" == b && (l = d.formatNumber(l, f), 1 == l.split(k)[0].length && (l = "0" + l)); ("mm" == b || "hh" == b) && 10 > l && (l = "0" + l); c = l + "" + e[b] + "" + c; a = Math.floor(a / g[b].contains); b = g[b].nextInterval; return d.formatDuration(a, b, c, e, h, f) } "ss" == b && (a = d.formatNumber(a, f), 1 == a.split(k)[0].length && (a = "0" + a)); ("mm" == b || "hh" == b) && 10 > a && (a = "0" + a); c = a + "" + e[b] + "" + c; if (g[h].count > g[b].count) for (a = g[b].count; a < g[h].count; a++) b = g[b].nextInterval, "ss" == b || "mm" == b || "hh" == b ? c = "00" + e[b] + "" + c : "DD" == b && (c = "0" + e[b] + "" + c); ":" == c.charAt(c.length - 1) && (c = c.substring(0, c.length - 1)); return c }; d.formatNumber = function (a, b, c, e, h) { a = d.roundTo(a, b.precision); isNaN(c) && (c = b.precision); var f = b.decimalSeparator; b = b.thousandsSeparator; var g; g = 0 > a ? "-" : ""; a = Math.abs(a); var k = String(a), l = !1; - 1 != k.indexOf("e") && (l = !0); 0 <= c && !l && (k = d.toFixed(a, c)); var m = ""; if (l) m = k; else { var k = k.split("."), l = String(k[0]), n; for (n = l.length; 0 <= n; n -= 3) m = n != l.length ? 0 !== n ? l.substring(n - 3, n) + b + m : l.substring(n - 3, n) + m : l.substring(n - 3, n); void 0 !== k[1] && (m = m + f + k[1]); void 0 !== c && 0 < c && "0" != m && (m = d.addZeroes(m, f, c)) } m = g + m; "" === g && !0 === e && 0 !== a && (m = "+" + m); !0 === h && (m += "%"); return m }; d.addZeroes = function (a, b, c) { a = a.split(b); void 0 === a[1] && 0 < c && (a[1] = "0"); return a[1].length < c ? (a[1] += "0", d.addZeroes(a[0] + b + a[1], b, c)) : void 0 !== a[1] ? a[0] + b + a[1] : a[0] }; d.scientificToNormal = function (a) { var b; a = String(a).split("e"); var c; if ("-" == a[1].substr(0, 1)) { b = "0."; for (c = 0; c < Math.abs(Number(a[1])) - 1; c++) b += "0"; b += a[0].split(".").join("") } else { var e = 0; b = a[0].split("."); b[1] && (e = b[1].length); b = a[0].split(".").join(""); for (c = 0; c < Math.abs(Number(a[1])) - e; c++) b += "0" } return b }; d.toScientific = function (a, b) { if (0 === a) return "0"; var c = Math.floor(Math.log(Math.abs(a)) * Math.LOG10E), e = String(e).split(".").join(b); return String(e) + "e" + c }; d.randomColor = function () { return "#" + ("00000" + (16777216 * Math.random() << 0).toString(16)).substr(-6) }; d.hitTest = function (a, b, c) { var e = !1, h = a.x, f = a.x + a.width, g = a.y, k = a.y + a.height, l = d.isInRectangle; e || (e = l(h, g, b)); e || (e = l(h, k, b)); e || (e = l(f, g, b)); e || (e = l(f, k, b)); e || !0 === c || (e = d.hitTest(b, a, !0)); return e }; d.isInRectangle = function (a, b, c) { return a >= c.x - 5 && a <= c.x + c.width + 5 && b >= c.y - 5 && b <= c.y + c.height + 5 ? !0 : !1 }; d.isPercents = function (a) { if (-1 != String(a).indexOf("%")) return !0 }; d.findPosX = function (a) { var b = a, c = a.offsetLeft; if (a.offsetParent) { for (; a = a.offsetParent;) c += a.offsetLeft; for (; (b = b.parentNode) && b != document.body;) c -= b.scrollLeft || 0 } return c }; d.findPosY = function (a) { var b = a, c = a.offsetTop; if (a.offsetParent) { for (; a = a.offsetParent;) c += a.offsetTop; for (; (b = b.parentNode) && b != document.body;) c -= b.scrollTop || 0 } return c }; d.findIfFixed = function (a) { if (a.offsetParent) for (; a = a.offsetParent;) if ("fixed" == d.getStyle(a, "position")) return !0; return !1 }; d.findIfAuto = function (a) { return a.style && "auto" == d.getStyle(a, "overflow") ? !0 : a.parentNode ? d.findIfAuto(a.parentNode) : !1 }; d.findScrollLeft = function (a, b) { a.scrollLeft && (b += a.scrollLeft); return a.parentNode ? d.findScrollLeft(a.parentNode, b) : b }; d.findScrollTop = function (a, b) { a.scrollTop && (b += a.scrollTop); return a.parentNode ? d.findScrollTop(a.parentNode, b) : b }; d.formatValue = function (a, b, c, e, h, f, g, k) { if (b) { void 0 === h && (h = ""); var l; for (l = 0; l < c.length; l++) { var m = c[l], n = b[m]; void 0 !== n && (n = f ? d.addPrefix(n, k, g, e) : d.formatNumber(n, e), a = a.replace(new RegExp("\\[\\[" + h + "" + m + "\\]\\]", "g"), n)) } } return a }; d.formatDataContextValue = function (a, b) { if (a) { var c = a.match(/\[\[.*?\]\]/g), e; for (e = 0; e < c.length; e++) { var h = c[e], h = h.substr(2, h.length - 4); void 0 !== b[h] && (a = a.replace(new RegExp("\\[\\[" + h + "\\]\\]", "g"), b[h])) } } return a }; d.massReplace = function (a, b) { for (var c in b) if (b.hasOwnProperty(c)) { var e = b[c]; void 0 === e && (e = ""); a = a.replace(c, e) } return a }; d.cleanFromEmpty = function (a) { return a.replace(/\[\[[^\]]*\]\]/g, "") }; d.addPrefix = function (a, b, c, e, h) { var f = d.formatNumber(a, e), g = "", k, l, m; if (0 === a) return "0"; 0 > a && (g = "-"); a = Math.abs(a); if (1 < a) for (k = b.length - 1; - 1 < k; k--) { if (a >= b[k].number && (l = a / b[k].number, m = Number(e.precision), 1 > m && (m = 1), c = d.roundTo(l, m), m = d.formatNumber(c, { precision: -1, decimalSeparator: e.decimalSeparator, thousandsSeparator: e.thousandsSeparator }), !h || l == c)) { f = g + "" + m + "" + b[k].prefix; break } } else for (k = 0; k < c.length; k++) if (a <= c[k].number) { l = a / c[k].number; m = Math.abs(Math.round(Math.log(l) * Math.LOG10E)); l = d.roundTo(l, m); f = g + "" + l + "" + c[k].prefix; break } return f }; d.remove = function (a) { a && a.remove() }; d.getEffect = function (a) { ">" == a && (a = "easeOutSine"); "<" == a && (a = "easeInSine"); "elastic" == a && (a = "easeOutElastic"); return a }; d.getObjById = function (a, b) { var c, e; for (e = 0; e < a.length; e++) { var h = a[e]; h.id == b && (c = h) } return c }; d.applyTheme = function (a, b, c) { b || (b = d.theme); b && b[c] && d.extend(a, b[c]) }; d.isString = function (a) { return "string" == typeof a ? !0 : !1 }; d.extend = function (a, b, c) { var e; a || (a = {}); for (e in b) c ? a.hasOwnProperty(e) || (a[e] = b[e]) : a[e] = b[e]; return a }; d.copyProperties = function (a, b) { for (var c in a) a.hasOwnProperty(c) && "events" != c && void 0 !== a[c] && "function" != typeof a[c] && "cname" != c && (b[c] = a[c]) }; d.processObject = function (a, b, c, e) { !1 === a instanceof b && (a = e ? d.extend(new b(c), a) : d.extend(a, new b(c), !0)); return a }; d.fixNewLines = function (a) { var b = RegExp("\\n", "g"); a && (a = a.replace(b, "
")); return a }; d.fixBrakes = function (a) { if (d.isModern) { var b = RegExp("
", "g"); a && (a = a.replace(b, "\n")) } else a = d.fixNewLines(a); return a }; d.deleteObject = function (a, b) { if (a) { if (void 0 === b || null === b) b = 20; if (0 !== b) if ("[object Array]" === Object.prototype.toString.call(a)) for (var c = 0; c < a.length; c++) d.deleteObject(a[c], b - 1), a[c] = null; else if (a && !a.tagName) try { for (c in a) a[c] && ("object" == typeof a[c] && d.deleteObject(a[c], b - 1), "function" != typeof a[c] && (a[c] = null)) } catch (e) {} } }; d.bounce = function (a, b, c, e, h) { return (b /= h) < 1 / 2.75 ? 7.5625 * e * b * b + c : b < 2 / 2.75 ? e * (7.5625 * (b -= 1.5 / 2.75) * b + .75) + c : b < 2.5 / 2.75 ? e * (7.5625 * (b -= 2.25 / 2.75) * b + .9375) + c : e * (7.5625 * (b -= 2.625 / 2.75) * b + .984375) + c }; d.easeInSine = function (a, b, c, e, h) { return -e * Math.cos(b / h * (Math.PI / 2)) + e + c }; d.easeOutSine = function (a, b, c, e, h) { return e * Math.sin(b / h * (Math.PI / 2)) + c }; d.easeOutElastic = function (a, b, c, e, h) { a = 1.70158; var d = 0, g = e; if (0 === b) return c; if (1 == (b /= h)) return c + e; d || (d = .3 * h); g < Math.abs(e) ? (g = e, a = d / 4) : a = d / (2 * Math.PI) * Math.asin(e / g); return g * Math.pow(2, -10 * b) * Math.sin(2 * (b * h - a) * Math.PI / d) + e + c }; d.fixStepE = function (a) { a = a.toExponential(0).split("e"); var b = Number(a[1]); 9 == Number(a[0]) && b++; return d.generateNumber(1, b) }; d.generateNumber = function (a, b) { var c = "", e; e = 0 > b ? Math.abs(b) - 1 : Math.abs(b); var h; for (h = 0; h < e; h++) c += "0"; return 0 > b ? Number("0." + c + String(a)) : Number(String(a) + c) }; d.setCN = function (a, b, c, e) { if (a.addClassNames && b && (b = b.node) && c) { var h = b.getAttribute("class"); a = a.classNamePrefix + "-"; e && (a = ""); h ? b.setAttribute("class", h + " " + a + c) : b.setAttribute("class", a + c) } }; d.parseDefs = function (a, b) { for (var c in a) { var e = typeof a[c]; if (0 < a[c].length && "object" == e) for (var h = 0; h < a[c].length; h++) e = document.createElementNS(d.SVG_NS, c), b.appendChild(e), d.parseDefs(a[c][h], e); else "object" == e ? (e = document.createElementNS(d.SVG_NS, c), b.appendChild(e), d.parseDefs(a[c], e)) : b.setAttribute(c, a[c]) } } })(); (function () { var d = window.AmCharts; d.AxisBase = d.Class({ construct: function (a) { this.createEvents("clickItem", "rollOverItem", "rollOutItem"); this.viY = this.viX = this.y = this.x = this.dy = this.dx = 0; this.axisThickness = 1; this.axisColor = "#000000"; this.axisAlpha = 1; this.gridCount = this.tickLength = 5; this.gridAlpha = .15; this.gridThickness = 1; this.gridColor = "#000000"; this.dashLength = 0; this.labelFrequency = 1; this.showLastLabel = this.showFirstLabel = !0; this.fillColor = "#FFFFFF"; this.fillAlpha = 0; this.labelsEnabled = !0; this.labelRotation = 0; this.autoGridCount = !0; this.offset = 0; this.guides = []; this.visible = !0; this.counter = 0; this.guides = []; this.ignoreAxisWidth = this.inside = !1; this.minHorizontalGap = 75; this.minVerticalGap = 35; this.titleBold = !0; this.minorGridEnabled = !1; this.minorGridAlpha = .07; this.autoWrap = !1; this.titleAlign = "middle"; this.labelOffset = 0; this.bcn = "axis-"; this.periods = [{ period: "ss", count: 1 }, { period: "ss", count: 5 }, { period: "ss", count: 10 }, { period: "ss", count: 30 }, { period: "mm", count: 1 }, { period: "mm", count: 5 }, { period: "mm", count: 10 }, { period: "mm", count: 30 }, { period: "hh", count: 1 }, { period: "hh", count: 3 }, { period: "hh", count: 6 }, { period: "hh", count: 12 }, { period: "DD", count: 1 }, { period: "DD", count: 2 }, { period: "DD", count: 3 }, { period: "DD", count: 4 }, { period: "DD", count: 5 }, { period: "WW", count: 1 }, { period: "MM", count: 1 }, { period: "MM", count: 2 }, { period: "MM", count: 3 }, { period: "MM", count: 6 }, { period: "YYYY", count: 1 }, { period: "YYYY", count: 2 }, { period: "YYYY", count: 5 }, { period: "YYYY", count: 10 }, { period: "YYYY", count: 50 }, { period: "YYYY", count: 100 }]; this.dateFormats = [{ period: "fff", format: "JJ:NN:SS" }, { period: "ss", format: "JJ:NN:SS" }, { period: "mm", format: "JJ:NN" }, { period: "hh", format: "JJ:NN" }, { period: "DD", format: "MMM DD" }, { period: "WW", format: "MMM DD" }, { period: "MM", format: "MMM" }, { period: "YYYY", format: "YYYY" } ]; this.nextPeriod = { fff: "ss", ss: "mm", mm: "hh", hh: "DD", DD: "MM", MM: "YYYY" }; d.applyTheme(this, a, "AxisBase") }, zoom: function (a, b) { this.start = a; this.end = b; this.dataChanged = !0; this.draw() }, fixAxisPosition: function () { var a = this.position; "H" == this.orientation ? ("left" == a && (a = "bottom"), "right" == a && (a = "top")) : ("bottom" == a && (a = "left"), "top" == a && (a = "right")); this.position = a }, draw: function () { var a = this.chart; this.allLabels = []; this.counter = 0; this.destroy(); this.fixAxisPosition(); this.labels = []; var b = a.container, c = b.set(); a.gridSet.push(c); this.set = c; b = b.set(); a.axesLabelsSet.push(b); this.labelsSet = b; this.axisLine = new this.axisRenderer(this); this.autoGridCount ? ("V" == this.orientation ? (a = this.height / this.minVerticalGap, 3 > a && (a = 3)) : a = this.width / this.minHorizontalGap, this.gridCountR = Math.max(a, 1)) : this.gridCountR = this.gridCount; this.axisWidth = this.axisLine.axisWidth; this.addTitle() }, setOrientation: function (a) { this.orientation = a ? "H" : "V" }, addTitle: function () { var a = this.title; this.titleLabel = null; if (a) { var b = this.chart, c = this.titleColor; void 0 === c && (c = b.color); var e = this.titleFontSize; isNaN(e) && (e = b.fontSize + 1); a = d.text(b.container, a, c, b.fontFamily, e, this.titleAlign, this.titleBold); d.setCN(b, a, this.bcn + "title"); this.titleLabel = a } }, positionTitle: function () { var a = this.titleLabel; if (a) { var b, c, e = this.labelsSet, h = {}; 0 < e.length() ? h = e.getBBox() : (h.x = 0, h.y = 0, h.width = this.viW, h.height = this.viH, d.VML && (h.y += this.y, h.x += this.x)); e.push(a); var e = h.x, f = h.y; d.VML && (this.rotate ? e -= this.x : f -= this.y); var g = h.width, h = h.height, k = this.viW, l = this.viH, m = 0, n = a.getBBox().height / 2, q = this.inside, p = this.titleAlign; switch (this.position) { case "top": b = "left" == p ? -1 : "right" == p ? k : k / 2; c = f - 10 - n; break; case "bottom": b = "left" == p ? -1 : "right" == p ? k : k / 2; c = f + h + 10 + n; break; case "left": b = e - 10 - n; q && (b -= 5); c = "left" == p ? l + 1 : "right" == p ? -1 : l / 2; m = -90; break; case "right": b = e + g + 10 + n - 3, q && (b += 7), c = "left" == p ? l + 2 : "right" == p ? -2 : l / 2, m = -90 } this.marginsChanged ? (a.translate(b, c), this.tx = b, this.ty = c) : a.translate(this.tx, this.ty); this.marginsChanged = !1; 0 !== m && a.rotate(m) } }, pushAxisItem: function (a, b) { var c = this, e = a.graphics(); 0 < e.length() && (b ? c.labelsSet.push(e) : c.set.push(e)); if (e = a.getLabel()) this.labelsSet.push(e), e.click(function (b) { c.handleMouse(b, a, "clickItem") }).mouseover(function (b) { c.handleMouse(b, a, "rollOverItem") }).mouseout(function (b) { c.handleMouse(b, a, "rollOutItem") }) }, handleMouse: function (a, b, c) { this.fire(c, { type: c, value: b.value, serialDataItem: b.serialDataItem, axis: this, target: b.label, chart: this.chart, event: a }) }, addGuide: function (a) { for (var b = this.guides, c = !1, e = b.length, h = 0; h < b.length; h++) b[h] == a && (c = !0, e = h); a = d.processObject(a, d.Guide, this.theme); a.id || (a.id = "guideAuto" + e + "_" + (new Date).getTime()); c || b.push(a) }, removeGuide: function (a) { var b = this.guides, c; for (c = 0; c < b.length; c++) b[c] == a && b.splice(c, 1) }, handleGuideOver: function (a) { clearTimeout(this.chart.hoverInt); var b = a.graphics.getBBox(), c = b.x + b.width / 2, b = b.y + b.height / 2, e = a.fillColor; void 0 === e && (e = a.lineColor); this.chart.showBalloon(a.balloonText, e, !0, c, b) }, handleGuideOut: function () { this.chart.hideBalloon() }, addEventListeners: function (a, b) { var c = this; a.mouseover(function () { c.handleGuideOver(b) }); a.touchstart(function () { c.handleGuideOver(b) }); a.mouseout(function () { c.handleGuideOut(b) }) }, getBBox: function () { var a = this.labelsSet.getBBox(); d.VML || (a = { x: a.x + this.x, y: a.y + this.y, width: a.width, height: a.height }); return a }, destroy: function () { d.remove(this.set); d.remove(this.labelsSet); var a = this.axisLine; a && d.remove(a.set); d.remove(this.grid0) }, chooseMinorFrequency: function (a) { for (var b = 10; 0 < b; b--) if (a / b == Math.round(a / b)) return a / b }, parseDatesDraw: function () { var a, b = this.chart, c = this.showFirstLabel, e = this.showLastLabel, h, f = "", g = d.extractPeriod(this.minPeriod), k = d.getPeriodDuration(g.period, g.count), l, m, n, q, p, r = this.firstDayOfWeek, t = this.boldPeriodBeginning; a = this.minorGridEnabled; var u, z = this.gridAlpha, w, x = this.choosePeriod(0), v = x.period, x = x.count, A = d.getPeriodDuration(v, x); A < k && (v = g.period, x = g.count, A = k); g = v; "WW" == g && (g = "DD"); this.stepWidth = this.getStepWidth(this.timeDifference); var B = Math.ceil(this.timeDifference / A) + 5, D = l = d.resetDateToMin(new Date(this.startTime - A), v, x, r).getTime(); g == v && 1 == x && this.centerLabelOnFullPeriod && (n = A * this.stepWidth); this.cellWidth = k * this.stepWidth; q = Math.round(l / A); k = -1; q / 2 == Math.round(q / 2) && (k = -2, l -= A); q = this.firstTime; var C = 0; a && 1 < x && (u = this.chooseMinorFrequency(x), w = d.getPeriodDuration(v, u)); if (0 < this.gridCountR) for (a = k; a <= B; a++) { p = q + A * (a + Math.floor((D - q) / A)) - C; "DD" == v && (p += 36E5); p = d.resetDateToMin(new Date(p), v, x, r).getTime(); "MM" == v && (h = (p - l) / A, 1.5 <= (p - l) / A && (p = p - (h - 1) * A + d.getPeriodDuration("DD", 3), p = d.resetDateToMin(new Date(p), v, 1).getTime(), C += A)); h = (p - this.startTime) * this.stepWidth; h = this.rotate ? h + (this.x - this.viX) : "date" == this.type ? this.axisWidth - h + (this.y - this.viY) : h + (this.y - this.viY); f = !1; this.nextPeriod[g] && (f = this.checkPeriodChange(this.nextPeriod[g], 1, p, l, g)); l = !1; f && this.markPeriodChange ? (f = this.dateFormatsObject[this.nextPeriod[g]], this.twoLineMode && (f = this.dateFormatsObject[g] + "\n" + f, f = d.fixBrakes(f)), l = !0) : f = this.dateFormatsObject[g]; t || (l = !1); this.currentDateFormat = f; f = d.formatDate(new Date(p), f, b); if (a == k && !c || a == B && !e) f = " "; this.labelFunction && (f = this.labelFunction(f, new Date(p), this, v, x, m).toString()); this.boldLabels && (l = !0); m = new this.axisItemRenderer(this, h, f, !1, n, 0, !1, l); this.pushAxisItem(m); m = l = p; if (!isNaN(u)) for (h = 1; h < x; h += u) this.gridAlpha = this.minorGridAlpha, f = p + w * h, f = d.resetDateToMin(new Date(f), v, u, r).getTime(), f = new this.axisItemRenderer(this, (f - this.startTime) * this.stepWidth), this.pushAxisItem(f); this.gridAlpha = z } }, choosePeriod: function (a) { var b = d.getPeriodDuration(this.periods[a].period, this.periods[a].count), c = Math.ceil(this.timeDifference / b), e = this.periods; return this.timeDifference < b && 0 < a ? e[a - 1] : c <= this.gridCountR ? e[a] : a + 1 < e.length ? this.choosePeriod(a + 1) : e[a] }, getStepWidth: function (a) { var b; this.startOnAxis ? (b = this.axisWidth / (a - 1), 1 == a && (b = this.axisWidth)) : b = this.axisWidth / a; return b }, timeZoom: function (a, b) { this.startTime = a; this.endTime = b }, minDuration: function () { var a = d.extractPeriod(this.minPeriod); return d.getPeriodDuration(a.period, a.count) }, checkPeriodChange: function (a, b, c, e, h) { c = new Date(c); var f = new Date(e), g = this.firstDayOfWeek; e = b; "DD" == a && (b = 1); c = d.resetDateToMin(c, a, b, g).getTime(); b = d.resetDateToMin(f, a, b, g).getTime(); return "DD" == a && "hh" != h && c - b <= d.getPeriodDuration(a, e) ? !1 : c != b ? !0 : !1 }, generateDFObject: function () { this.dateFormatsObject = {}; var a; for (a = 0; a < this.dateFormats.length; a++) { var b = this.dateFormats[a]; this.dateFormatsObject[b.period] = b.format } } }) })(); (function () { var d = window.AmCharts; d.ValueAxis = d.Class({ inherits: d.AxisBase, construct: function (a) { this.cname = "ValueAxis"; this.createEvents("axisChanged", "logarithmicAxisFailed", "axisSelfZoomed", "axisZoomed"); d.ValueAxis.base.construct.call(this, a); this.dataChanged = !0; this.stackType = "none"; this.position = "left"; this.unitPosition = "right"; this.recalculateToPercents = this.includeHidden = this.includeGuidesInMinMax = this.integersOnly = !1; this.durationUnits = { DD: "d. ", hh: ":", mm: ":", ss: "" }; this.scrollbar = !1; this.baseValue = 0; this.radarCategoriesEnabled = !0; this.gridType = "polygons"; this.useScientificNotation = !1; this.axisTitleOffset = 10; this.minMaxMultiplier = 1; this.logGridLimit = 2; this.totalTextOffset = this.treatZeroAs = 0; this.minPeriod = "ss"; d.applyTheme(this, a, this.cname) }, updateData: function () { 0 >= this.gridCountR && (this.gridCountR = 1); this.totals = []; this.data = this.chart.chartData; var a = this.chart; "xy" != a.type && (this.stackGraphs("smoothedLine"), this.stackGraphs("line"), this.stackGraphs("column"), this.stackGraphs("step")); this.recalculateToPercents && this.recalculate(); this.synchronizationMultiplier && this.synchronizeWith ? (d.isString(this.synchronizeWith) && (this.synchronizeWith = a.getValueAxisById(this.synchronizeWith)), this.synchronizeWith && (this.synchronizeWithAxis(this.synchronizeWith), this.foundGraphs = !0)) : (this.foundGraphs = !1, this.getMinMax()) }, draw: function () { d.ValueAxis.base.draw.call(this); var a = this.chart, b = this.set; d.setCN(a, this.set, "value-axis value-axis-" + this.id); d.setCN(a, this.labelsSet, "value-axis value-axis-" + this.id); d.setCN(a, this.axisLine.axisSet, "value-axis value-axis-" + this.id); var c = this.type; "duration" == c && (this.duration = "ss"); !0 === this.dataChanged && (this.updateData(), this.dataChanged = !1); "date" == c && (this.logarithmic = !1, this.min = this.minRR, this.max = this.maxRR, this.minimumDate && (this.min = this.minimumDate.getTime()), this.maximumDate && (this.max = this.maximumDate.getTime())); if (this.logarithmic) { var e = this.treatZeroAs, h = this.getMin(0, this.data.length - 1); this.minReal < h && (this.minReal = h); isNaN(this.minReal) && (this.minReal = h); 0 < e && 0 === h && (this.minReal = h = e); if (0 >= h || 0 >= this.minimum) { this.fire("logarithmicAxisFailed", { type: "logarithmicAxisFailed", chart: a }); return } } this.grid0 = null; var f, g, k = a.dx, l = a.dy, e = !1, h = this.logarithmic; if (isNaN(this.min) || isNaN(this.max) || !this.foundGraphs || Infinity == this.min || -Infinity == this.max) e = !0; else { var m = this.labelFrequency, n = this.showFirstLabel, q = this.showLastLabel, p = 1; f = 0; this.minCalc = this.min; this.maxCalc = this.max; this.strictMinMax && (isNaN(this.minimum) || (this.min = this.minimum), isNaN(this.maximum) || (this.max = this.maximum)); isNaN(this.minZoom) || (this.min = this.minZoom); isNaN(this.maxZoom) || (this.max = this.maxZoom); var r = Math.round((this.maxCalc - this.minCalc) / this.step) + 1, t; !0 === h ? (t = Math.log(this.max) * Math.LOG10E - Math.log(this.minReal) * Math.LOG10E, this.stepWidth = this.axisWidth / t, t > this.logGridLimit && (r = Math.ceil(Math.log(this.max) * Math.LOG10E) + 1, f = Math.round(Math.log(this.minReal) * Math.LOG10E), r > this.gridCountR && (p = Math.ceil(r / this.gridCountR)))) : this.stepWidth = this.axisWidth / (this.max - this.min); var u = 0; 1 > this.step && -1 < this.step && (u = d.getDecimals(this.step)); this.integersOnly && (u = 0); u > this.maxDecCount && (u = this.maxDecCount); var z = this.precision; isNaN(z) || (u = z); this.max = d.roundTo(this.max, this.maxDecCount); this.min = d.roundTo(this.min, this.maxDecCount); g = {}; g.precision = u; g.decimalSeparator = a.nf.decimalSeparator; g.thousandsSeparator = a.nf.thousandsSeparator; this.numberFormatter = g; var w, x = this.guides, v = x.length; if (0 < v) { var A = this.fillAlpha; for (g = this.fillAlpha = 0; g < v; g++) { var B = x[g], D = NaN, C = B.above; isNaN(B.toValue) || (D = this.getCoordinate(B.toValue), w = new this.axisItemRenderer(this, D, "", !0, NaN, NaN, B), this.pushAxisItem(w, C)); var I = NaN; isNaN(B.value) || (I = this.getCoordinate(B.value), w = new this.axisItemRenderer(this, I, B.label, !0, NaN, (D - I) / 2, B), this.pushAxisItem(w, C)); isNaN(D - I) || (w = new this.guideFillRenderer(this, I, D, B), this.pushAxisItem(w, C), w = w.graphics(), B.graphics = w, B.balloonText && this.addEventListeners(w, B)) } this.fillAlpha = A } this.exponential = !1; for (g = f; g < r; g += p) x = d.roundTo(this.step * g + this.min, u), -1 != String(x).indexOf("e") && (this.exponential = !0); this.duration && (this.maxInterval = d.getMaxInterval(this.max, this.duration)); var u = this.step, H, x = this.minorGridAlpha; this.minorGridEnabled && (H = this.getMinorGridStep(u, this.stepWidth * u)); if ("date" == c) this.generateDFObject(), this.timeDifference = this.max - this.min, this.maxTime = this.lastTime = this.max, this.startTime = this.firstTime = this.min, this.parseDatesDraw(); else for (g = f; g < r; g += p) if (c = u * g + this.minCalc, h && this.max - this.min > 10 * this.min && (c -= this.min), c = d.roundTo(c, this.maxDecCount + 1), !this.integersOnly || Math.round(c) == c) if (isNaN(z) || Number(d.toFixed(c, z)) == c) { !0 === h && (0 === c && (c = this.minReal), t > this.logGridLimit && (c = Math.pow(10, g))); w = this.formatValue(c, !1, g); Math.round(g / m) != g / m && (w = void 0); if (0 === g && !n || g == r - 1 && !q) w = " "; f = this.getCoordinate(c); w = new this.axisItemRenderer(this, f, w, void 0, void 0, void 0, void 0, this.boldLabels); this.pushAxisItem(w); if (c == this.baseValue && "radar" != a.type) { var O, J, A = this.viW, B = this.viH; w = this.viX; v = this.viY; "H" == this.orientation ? 0 <= f && f <= A + 1 && (O = [f, f, f + k], J = [B, 0, l]) : 0 <= f && f <= B + 1 && (O = [0, A, A + k], J = [f, f, f + l]); O && (f = d.fitToBounds(2 * this.gridAlpha, 0, 1), f = d.line(a.container, O, J, this.gridColor, f, 1, this.dashLength), f.translate(w, v), this.grid0 = f, a.axesSet.push(f), f.toBack(), d.setCN(a, f, this.bcn + "zero-grid-" + this.id), d.setCN(a, f, this.bcn + "zero-grid")) } if (!isNaN(H) && 0 < x && g < r - 1) { f = this.gridAlpha; this.gridAlpha = this.minorGridAlpha; for (w = 1; w < u / H; w++) v = this.getCoordinate(c + H * w), v = new this.axisItemRenderer(this, v, "", !1, 0, 0, !1, !1, 0, !0), this.pushAxisItem(v); this.gridAlpha = f } } t = this.baseValue; this.min > this.baseValue && this.max > this.baseValue && (t = this.min); this.min < this.baseValue && this.max < this.baseValue && (t = this.max); h && t < this.minReal && (t = this.minReal); this.baseCoord = this.getCoordinate(t); t = { type: "axisChanged", target: this, chart: a }; t.min = h ? this.minReal : this.min; t.max = this.max; this.fire("axisChanged", t); this.axisCreated = !0 } h = this.axisLine.set; t = this.labelsSet; this.positionTitle(); "radar" != a.type ? (a = this.viX, H = this.viY, b.translate(a, H), t.translate(a, H)) : h.toFront(); !this.visible || e ? (b.hide(), h.hide(), t.hide()) : (b.show(), h.show(), t.show()); this.axisY = this.y - this.viY; this.axisX = this.x - this.viX }, formatValue: function (a, b, c) { var e = this.exponential, h = this.logarithmic, f = this.numberFormatter, g = this.chart; !0 === this.logarithmic && (e = -1 != String(a).indexOf("e") ? !0 : !1); this.useScientificNotation && (e = !0); this.usePrefixes && (e = !1); e ? (b = -1 == String(a).indexOf("e") ? a.toExponential(15) : String(a), c = b.split("e"), b = Number(c[0]), c = Number(c[1]), b = d.roundTo(b, 14), 10 == b && (b = 1, c += 1), b = b + "e" + c, 0 === a && (b = "0"), 1 == a && (b = "1")) : (h && (e = String(a).split("."), e[1] ? (f.precision = e[1].length, 0 > c && (f.precision = Math.abs(c)), b && 1 < a && (f.precision = 0)) : f.precision = -1), b = this.usePrefixes ? d.addPrefix(a, g.prefixesOfBigNumbers, g.prefixesOfSmallNumbers, f, !b) : d.formatNumber(a, f, f.precision)); this.duration && (b = d.formatDuration(a, this.duration, "", this.durationUnits, this.maxInterval, f)); "date" == this.type && (b = d.formatDate(new Date(a), this.currentDateFormat, g)); this.recalculateToPercents ? b += "%" : (f = this.unit) && (b = "left" == this.unitPosition ? f + b : b + f); this.labelFunction && (b = this.labelFunction(a, b, this).toString()); return b }, getMinorGridStep: function (a, b) { var c = [5, 4, 2]; 60 > b && c.shift(); for (var e = Math.floor(Math.log(Math.abs(a)) * Math.LOG10E), h = 0; h < c.length; h++) { var d = a / c[h], g = Math.floor(Math.log(Math.abs(d)) * Math.LOG10E); if (!(0 < Math.abs(e - g))) if (1 > a) { if (g = Math.pow(10, -g) * d, g == Math.round(g)) return d } else if (d == Math.round(d)) return d } }, stackGraphs: function (a) { var b = this.stackType; "stacked" == b && (b = "regular"); "line" == b && (b = "none"); "100% stacked" == b && (b = "100%"); this.stackType = b; var c = [], e = [], h = [], f = [], g, k = this.chart.graphs, l, m, n, q, p = this.baseValue, r = !1; if ("line" == a || "step" == a || "smoothedLine" == a) r = !0; if (r && ("regular" == b || "100%" == b)) for (q = 0; q < k.length; q++) n = k[q], n.hidden || (m = n.type, n.chart == this.chart && n.valueAxis == this && a == m && n.stackable && (l && (n.stackGraph = l), l = n)); for (l = this.start; l <= this.end; l++) { var t = 0; for (q = 0; q < k.length; q++) if (n = k[q], n.hidden) n.newStack && (h[l] = NaN, e[l] = NaN); else if (m = n.type, n.chart == this.chart && n.valueAxis == this && a == m && n.stackable) if (m = this.data[l].axes[this.id].graphs[n.id], g = m.values.value, isNaN(g)) n.newStack && (h[l] = NaN, e[l] = NaN); else { var u = d.getDecimals(g); t < u && (t = u); isNaN(f[l]) ? f[l] = Math.abs(g) : f[l] += Math.abs(g); f[l] = d.roundTo(f[l], t); u = n.fillToGraph; r && u && (u = this.data[l].axes[this.id].graphs[u.id]) && (m.values.open = u.values.value); "regular" == b && (r && (isNaN(c[l]) ? (c[l] = g, m.values.close = g, m.values.open = this.baseValue) : (isNaN(g) ? m.values.close = c[l] : m.values.close = g + c[l], m.values.open = c[l], c[l] = m.values.close)), "column" == a && (n.newStack && (h[l] = NaN, e[l] = NaN), m.values.close = g, 0 > g ? (m.values.close = g, isNaN(e[l]) ? m.values.open = p : (m.values.close += e[l], m.values.open = e[l]), e[l] = m.values.close) : (m.values.close = g, isNaN(h[l]) ? m.values.open = p : (m.values.close += h[l], m.values.open = h[l]), h[l] = m.values.close))) } } for (l = this.start; l <= this.end; l++) for (q = 0; q < k.length; q++)(n = k[q], n.hidden) ? n.newStack && (h[l] = NaN, e[l] = NaN) : (m = n.type, n.chart == this.chart && n.valueAxis == this && a == m && n.stackable && (m = this.data[l].axes[this.id].graphs[n.id], g = m.values.value, isNaN(g) || (c = g / f[l] * 100, m.values.percents = c, m.values.total = f[l], n.newStack && (h[l] = NaN, e[l] = NaN), "100%" == b && (isNaN(e[l]) && (e[l] = 0), isNaN(h[l]) && (h[l] = 0), 0 > c ? (m.values.close = d.fitToBounds(c + e[l], -100, 100), m.values.open = e[l], e[l] = m.values.close) : (m.values.close = d.fitToBounds(c + h[l], -100, 100), m.values.open = h[l], h[l] = m.values.close))))) }, recalculate: function () { var a = this.chart, b = a.graphs, c; for (c = 0; c < b.length; c++) { var e = b[c]; if (e.valueAxis == this) { var h = "value"; if ("candlestick" == e.type || "ohlc" == e.type) h = "open"; var f, g, k = this.end + 2, k = d.fitToBounds(this.end + 1, 0, this.data.length - 1), l = this.start; 0 < l && l--; var m; g = this.start; e.compareFromStart && (g = 0); if (!isNaN(a.startTime) && (m = a.categoryAxis)) { var n = m.minDuration(), n = new Date(a.startTime + n / 2), q = d.resetDateToMin(new Date(a.startTime), m.minPeriod).getTime(); d.resetDateToMin(new Date(n), m.minPeriod).getTime() > q && g++ } if (m = a.recalculateFromDate) m = d.getDate(m, a.dataDateFormat, "fff"), g = a.getClosestIndex(a.chartData, "time", m.getTime(), !0, 0, a.chartData.length), k = a.chartData.length - 1; for (m = g; m <= k && (g = this.data[m].axes[this.id].graphs[e.id], f = g.values[h], isNaN(f)); m++); this.recBaseValue = f; for (h = l; h <= k; h++) { g = this.data[h].axes[this.id].graphs[e.id]; g.percents = {}; var l = g.values, p; for (p in l) g.percents[p] = "percents" != p ? l[p] / f * 100 - 100 : l[p] } } } }, getMinMax: function () { var a = !1, b = this.chart, c = b.graphs, e; for (e = 0; e < c.length; e++) { var h = c[e].type; ("line" == h || "step" == h || "smoothedLine" == h) && this.expandMinMax && (a = !0) } a && (0 < this.start && this.start--, this.end < this.data.length - 1 && this.end++); "serial" == b.type && (!0 !== b.categoryAxis.parseDates || a || this.end < this.data.length - 1 && this.end++); a = this.minMaxMultiplier; this.min = this.getMin(this.start, this.end); this.max = this.getMax(); this.minRR = this.min; this.maxRR = this.max; a = (this.max - this.min) * (a - 1); this.min -= a; this.max += a; a = this.guides.length; if (this.includeGuidesInMinMax && 0 < a) for (b = 0; b < a; b++) c = this.guides[b], c.toValue < this.min && (this.min = c.toValue), c.value < this.min && (this.min = c.value), c.toValue > this.max && (this.max = c.toValue), c.value > this.max && (this.max = c.value); isNaN(this.minimum) || (this.min = this.minimum); isNaN(this.maximum) || (this.max = this.maximum); this.minimumDate && (this.min = this.minimumDate.getTime()); this.maximumDate && (this.max = this.maximumDate.getTime()); this.min > this.max && (a = this.max, this.max = this.min, this.min = a); isNaN(this.minTemp) || (this.min = this.minTemp); isNaN(this.maxTemp) || (this.max = this.maxTemp); this.minReal = this.min; this.maxReal = this.max; 0 === this.min && 0 === this.max && (this.max = 9); this.min > this.max && (this.min = this.max - 1); a = this.min; b = this.max; c = this.max - this.min; e = 0 === c ? Math.pow(10, Math.floor(Math.log(Math.abs(this.max)) * Math.LOG10E)) / 10 : Math.pow(10, Math.floor(Math.log(Math.abs(c)) * Math.LOG10E)) / 10; isNaN(this.maximum) && isNaN(this.maxTemp) && (this.max = Math.ceil(this.max / e) * e + e); isNaN(this.minimum) && isNaN(this.minTemp) && (this.min = Math.floor(this.min / e) * e - e); 0 > this.min && 0 <= a && (this.min = 0); 0 < this.max && 0 >= b && (this.max = 0); "100%" == this.stackType && (this.min = 0 > this.min ? -100 : 0, this.max = 0 > this.max ? 0 : 100); c = this.max - this.min; e = Math.pow(10, Math.floor(Math.log(Math.abs(c)) * Math.LOG10E)) / 10; this.step = Math.ceil(c / this.gridCountR / e) * e; c = Math.pow(10, Math.floor(Math.log(Math.abs(this.step)) * Math.LOG10E)); c = d.fixStepE(c); e = Math.ceil(this.step / c); 5 < e && (e = 10); 5 >= e && 2 < e && (e = 5); this.step = Math.ceil(this.step / (c * e)) * c * e; 1 > c ? (this.maxDecCount = Math.abs(Math.log(Math.abs(c)) * Math.LOG10E), this.maxDecCount = Math.round(this.maxDecCount), this.step = d.roundTo(this.step, this.maxDecCount + 1)) : this.maxDecCount = 0; this.min = this.step * Math.floor(this.min / this.step); this.max = this.step * Math.ceil(this.max / this.step); 0 > this.min && 0 <= a && (this.min = 0); 0 < this.max && 0 >= b && (this.max = 0); 1 < this.minReal && 1 < this.max - this.minReal && (this.minReal = Math.floor(this.minReal)); c = Math.pow(10, Math.floor(Math.log(Math.abs(this.minReal)) * Math.LOG10E)); 0 === this.min && (this.minReal = c); 0 === this.min && 1 < this.minReal && (this.minReal = 1); 0 < this.min && 0 < this.minReal - this.step && (this.minReal = this.min + this.step < this.minReal ? this.min + this.step : this.min); this.logarithmic && (2 < Math.log(b) * Math.LOG10E - Math.log(a) * Math.LOG10E ? (this.minReal = this.min = Math.pow(10, Math.floor(Math.log(Math.abs(a)) * Math.LOG10E)), this.max = Math.pow(10, Math.ceil(Math.log(Math.abs(b)) * Math.LOG10E))) : (b = Math.pow(10, Math.floor(Math.log(Math.abs(this.min)) * Math.LOG10E)) / 10, a = Math.pow(10, Math.floor(Math.log(Math.abs(a)) * Math.LOG10E)) / 10, b < a && (this.minReal = this.min = 10 * a))) }, getMin: function (a, b) { var c, e; for (e = a; e <= b; e++) { var h = this.data[e].axes[this.id].graphs, d; for (d in h) if (h.hasOwnProperty(d)) { var g = this.chart.getGraphById(d); if (g.includeInMinMax && (!g.hidden || this.includeHidden)) { isNaN(c) && (c = Infinity); this.foundGraphs = !0; g = h[d].values; this.recalculateToPercents && (g = h[d].percents); var k; if (this.minMaxField) k = g[this.minMaxField], k < c && (c = k); else for (var l in g) g.hasOwnProperty(l) && "percents" != l && "total" != l && (k = g[l], k < c && (c = k)) } } } return c }, getMax: function () { var a, b; for (b = this.start; b <= this.end; b++) { var c = this.data[b].axes[this.id].graphs, e; for (e in c) if (c.hasOwnProperty(e)) { var d = this.chart.getGraphById(e); if (d.includeInMinMax && (!d.hidden || this.includeHidden)) { isNaN(a) && (a = -Infinity); this.foundGraphs = !0; d = c[e].values; this.recalculateToPercents && (d = c[e].percents); var f; if (this.minMaxField) f = d[this.minMaxField], f > a && (a = f); else for (var g in d) d.hasOwnProperty(g) && "percents" != g && "total" != g && (f = d[g], f > a && (a = f)) } } } return a }, dispatchZoomEvent: function (a, b) { var c = { type: "axisZoomed", startValue: a, endValue: b, target: this, chart: this.chart }; this.fire(c.type, c) }, zoomOut: function () { var a = this.chart; "xy" != a.type && (this.maxZoom = this.minZoom = void 0, a.updateAfterValueZoom()) }, zoomToValues: function (a, b) { var c = this.chart; "xy" == c.type ? (b < a && (c = b, b = a, a = c), a < this.min && (a = this.min), b > this.max && (b = this.max), c = { type: "axisSelfZoomed" }, c.chart = this.chart, c.valueAxis = this, c.multiplier = this.axisWidth / Math.abs(this.getCoordinate(b) - this.getCoordinate(a)), c.startValue = a, c.endValue = b, c.position = "V" == this.orientation ? this.reversed ? this.getCoordinate(a) : this.getCoordinate(b) : this.reversed ? this.getCoordinate(b) : this.getCoordinate(a), this.fire(c.type, c)) : (this.minZoom = a, this.maxZoom = b, c.updateAfterValueZoom()) }, coordinateToValue: function (a) { if (isNaN(a)) return NaN; var b = this.axisWidth, c = this.stepWidth, e = this.reversed, d = this.rotate, f = this.min, g = this.minReal; return !0 === this.logarithmic ? Math.pow(10, (d ? !0 === e ? (b - a) / c : a / c : !0 === e ? a / c : (b - a) / c) + Math.log(g) * Math.LOG10E) : !0 === e ? d ? f - (a - b) / c : a / c + f : d ? a / c + f : f - (a - b) / c }, getCoordinate: function (a) { if (isNaN(a)) return NaN; var b = this.rotate, c = this.reversed, e = this.axisWidth, d = this.stepWidth, f = this.min, g = this.minReal; !0 === this.logarithmic ? (0 === a && (a = this.treatZeroAs), a = Math.log(a) * Math.LOG10E - Math.log(g) * Math.LOG10E, b = b ? !0 === c ? e - d * a : d * a : !0 === c ? d * a : e - d * a) : b = !0 === c ? b ? e - d * (a - f) : d * (a - f) : b ? d * (a - f) : e - d * (a - f); b = this.rotate ? b + (this.x - this.viX) : b + (this.y - this.viY); 1E7 < Math.abs(b) && (b = 1E7 * (b / Math.abs(b))); return Math.round(b) }, synchronizeWithAxis: function (a) { this.synchronizeWith = a; this.listenTo(this.synchronizeWith, "axisChanged", this.handleSynchronization) }, handleSynchronization: function () { var a = this.synchronizeWith, b = a.min, c = a.max, a = a.step, e = this.synchronizationMultiplier; e && (this.min = b * e, this.max = c * e, this.step = a * e, b = Math.pow(10, Math.floor(Math.log(Math.abs(this.step)) * Math.LOG10E)), b = Math.abs(Math.log(Math.abs(b)) * Math.LOG10E), this.maxDecCount = b = Math.round(b), this.draw()) } }) })(); (function () { var d = window.AmCharts; d.RecAxis = d.Class({ construct: function (a) { var b = a.chart, c = a.axisThickness, e = a.axisColor, h = a.axisAlpha, f = a.offset, g = a.dx, k = a.dy, l = a.viX, m = a.viY, n = a.viH, q = a.viW, p = b.container; "H" == a.orientation ? (e = d.line(p, [0, q], [0, 0], e, h, c), this.axisWidth = a.width, "bottom" == a.position ? (k = c / 2 + f + n + m - 1, c = l) : (k = -c / 2 - f + m + k, c = g + l)) : (this.axisWidth = a.height, "right" == a.position ? (e = d.line(p, [0, 0, -g], [0, n, n - k], e, h, c), k = m + k, c = c / 2 + f + g + q + l - 1) : (e = d.line(p, [0, 0], [0, n], e, h, c), k = m, c = -c / 2 - f + l)); e.translate(c, k); c = b.container.set(); c.push(e); b.axesSet.push(c); d.setCN(b, e, a.bcn + "line"); this.axisSet = c; this.set = e } }) })(); (function () { var d = window.AmCharts; d.RecItem = d.Class({ construct: function (a, b, c, e, h, f, g, k, l, m, n, q) { b = Math.round(b); var p = a.chart; this.value = c; void 0 == c && (c = ""); l || (l = 0); void 0 == e && (e = !0); var r = p.fontFamily, t = a.fontSize; void 0 == t && (t = p.fontSize); var u = a.color; void 0 == u && (u = p.color); void 0 !== n && (u = n); var z = a.chart.container, w = z.set(); this.set = w; var x = a.axisThickness, v = a.axisColor, A = a.axisAlpha, B = a.tickLength, D = a.gridAlpha, C = a.gridThickness, I = a.gridColor, H = a.dashLength, O = a.fillColor, J = a.fillAlpha, da = a.labelsEnabled; n = a.labelRotation; var pa = a.counter, U = a.inside, na = a.labelOffset, qa = a.dx, ja = a.dy, Pa = a.orientation, aa = a.position, Z = a.previousCoord, V = a.viH, sa = a.viW, ba = a.offset, ca, ta; g ? (void 0 !== g.id && (q = p.classNamePrefix + "-guide-" + g.id), da = !0, isNaN(g.tickLength) || (B = g.tickLength), void 0 != g.lineColor && (I = g.lineColor), void 0 != g.color && (u = g.color), isNaN(g.lineAlpha) || (D = g.lineAlpha), isNaN(g.dashLength) || (H = g.dashLength), isNaN(g.lineThickness) || (C = g.lineThickness), !0 === g.inside && (U = !0), isNaN(g.labelRotation) || (n = g.labelRotation), isNaN(g.fontSize) || (t = g.fontSize), g.position && (aa = g.position), void 0 !== g.boldLabel && (k = g.boldLabel), isNaN(g.labelOffset) || (na = g.labelOffset)) : "" === c && (B = 0); var ia = "start"; h && (ia = "middle"); var Q = n * Math.PI / 180, W, wa, G = 0, y = 0, ka = 0, ea = W = 0, Qa = 0; "V" == Pa && (n = 0); var Y; da && "" !== c && (Y = a.autoWrap && 0 === n ? d.wrappedText(z, c, u, r, t, ia, k, h, 0) : d.text(z, c, u, r, t, ia, k), ia = Y.getBBox(), ea = ia.width, Qa = ia.height); if ("H" == Pa) { if (0 <= b && b <= sa + 1 && (0 < B && 0 < A && b + l <= sa + 1 && (ca = d.line(z, [b + l, b + l], [0, B], v, A, C), w.push(ca)), 0 < D && (ta = d.line(z, [b, b + qa, b + qa], [V, V + ja, ja], I, D, C, H), w.push(ta))), y = 0, G = b, g && 90 == n && U && (G -= t), !1 === e ? (ia = "start", y = "bottom" == aa ? U ? y + B : y - B : U ? y - B : y + B, G += 3, h && (G += h / 2 - 3, ia = "middle"), 0 < n && (ia = "middle")) : ia = "middle", 1 == pa && 0 < J && !g && !m && Z < sa && (e = d.fitToBounds(b, 0, sa), Z = d.fitToBounds(Z, 0, sa), W = e - Z, 0 < W && (wa = d.rect(z, W, a.height, O, J), wa.translate(e - W + qa, ja), w.push(wa))), "bottom" == aa ? (y += V + t / 2 + ba, U ? (0 < n ? (y = V - ea / 2 * Math.sin(Q) - B - 3, G += ea / 2 * Math.cos(Q) - 4 + 2) : 0 > n ? (y = V + ea * Math.sin(Q) - B - 3 + 2, G += -ea * Math.cos(Q) - Qa * Math.sin(Q) - 4) : y -= B + t + 3 + 3, y -= na) : (0 < n ? (y = V + ea / 2 * Math.sin(Q) + B + 3, G -= ea / 2 * Math.cos(Q)) : 0 > n ? (y = V + B + 3 - ea / 2 * Math.sin(Q) + 2, G += ea / 2 * Math.cos(Q)) : y += B + x + 3 + 3, y += na)) : (y += ja + t / 2 - ba, G += qa, U ? (0 < n ? (y = ea / 2 * Math.sin(Q) + B + 3, G -= ea / 2 * Math.cos(Q)) : y += B + 3, y += na) : (0 < n ? (y = -(ea / 2) * Math.sin(Q) - B - 6, G += ea / 2 * Math.cos(Q)) : y -= B + t + 3 + x + 3, y -= na)), "bottom" == aa ? W = (U ? V - B - 1 : V + x - 1) + ba : (ka = qa, W = (U ? ja : ja - B - x + 1) - ba), f && (G += f), f = G, 0 < n && (f += ea / 2 * Math.cos(Q)), Y && (t = 0, U && (t = ea / 2 * Math.cos(Q)), f + t > sa + 2 || 0 > f)) Y.remove(), Y = null } else { 0 <= b && b <= V + 1 && (0 < B && 0 < A && b + l <= V + 1 && (ca = d.line(z, [0, B], [b + l, b + l], v, A, C), w.push(ca)), 0 < D && (ta = d.line(z, [0, qa, sa + qa], [b, b + ja, b + ja], I, D, C, H), w.push(ta))); ia = "end"; if (!0 === U && "left" == aa || !1 === U && "right" == aa) ia = "start"; y = b - t / 2; 1 == pa && 0 < J && !g && !m && (e = d.fitToBounds(b, 0, V), Z = d.fitToBounds(Z, 0, V), Q = e - Z, wa = d.polygon(z, [0, a.width, a.width, 0], [0, 0, Q, Q], O, J), wa.translate(qa, e - Q + ja), w.push(wa)); y += t / 2; "right" == aa ? (G += qa + sa + ba, y += ja, U ? (f || (y -= t / 2 + 3), G = G - (B + 4) - na) : (G += B + 4 + x, y -= 2, G += na)) : U ? (G += B + 4 - ba, f || (y -= t / 2 + 3), g && (G += qa, y += ja), G += na) : (G += -B - x - 4 - 2 - ba, y -= 2, G -= na); ca && ("right" == aa ? (ka += qa + ba + sa, W += ja, ka = U ? ka - x : ka + x) : (ka -= ba, U || (ka -= B + x))); f && (y += f); U = -3; "right" == aa && (U += ja); Y && (y > V + 1 || y < U) && (Y.remove(), Y = null) } ca && (ca.translate(ka, W), d.setCN(p, ca, a.bcn + "tick"), d.setCN(p, ca, q, !0), g && d.setCN(p, ca, "guide")); !1 === a.visible && (ca && ca.remove(), Y && (Y.remove(), Y = null)); Y && (Y.attr({ "text-anchor": ia }), Y.translate(G, y), 0 !== n && Y.rotate(-n, a.chart.backgroundColor), a.allLabels.push(Y), this.label = Y, d.setCN(p, Y, a.bcn + "label"), d.setCN(p, Y, q, !0), g && d.setCN(p, Y, "guide")); ta && (d.setCN(p, ta, a.bcn + "grid"), d.setCN(p, ta, q, !0), g && d.setCN(p, ta, "guide")); wa && (d.setCN(p, wa, a.bcn + "fill"), d.setCN(p, wa, q, !0)); m ? ta && d.setCN(p, ta, a.bcn + "grid-minor") : (a.counter = 0 === pa ? 1 : 0, a.previousCoord = b); 0 === this.set.node.childNodes.length && this.set.remove() }, graphics: function () { return this.set }, getLabel: function () { return this.label } }) })(); (function () { var d = window.AmCharts; d.RecFill = d.Class({ construct: function (a, b, c, e) { var h = a.dx, f = a.dy, g = a.orientation, k = 0; if (c < b) { var l = b; b = c; c = l } var m = e.fillAlpha; isNaN(m) && (m = 0); var l = a.chart.container, n = e.fillColor; "V" == g ? (b = d.fitToBounds(b, 0, a.viH), c = d.fitToBounds(c, 0, a.viH)) : (b = d.fitToBounds(b, 0, a.viW), c = d.fitToBounds(c, 0, a.viW)); c -= b; isNaN(c) && (c = 4, k = 2, m = 0); 0 > c && "object" == typeof n && (n = n.join(",").split(",").reverse()); "V" == g ? (g = d.rect(l, a.viW, c, n, m), g.translate(h, b - k + f)) : (g = d.rect(l, c, a.viH, n, m), g.translate(b - k + h, f)); d.setCN(a.chart, g, "guide-fill"); e.id && d.setCN(a.chart, g, "guide-fill-" + e.id); this.set = l.set([g]) }, graphics: function () { return this.set }, getLabel: function () {} }) })(); (function () { var d = window.AmCharts; d.AmChart = d.Class({ construct: function (a) { this.theme = a; this.classNamePrefix = "amcharts"; this.addClassNames = !1; this.version = "3.14.4"; d.addChart(this); this.createEvents("dataUpdated", "init", "rendered", "drawn", "failed", "resized"); this.height = this.width = "100%"; this.dataChanged = !0; this.chartCreated = !1; this.previousWidth = this.previousHeight = 0; this.backgroundColor = "#FFFFFF"; this.borderAlpha = this.backgroundAlpha = 0; this.color = this.borderColor = "#000000"; this.fontFamily = "Verdana"; this.fontSize = 11; this.usePrefixes = !1; this.addCodeCredits = this.autoResize = !0; this.precision = -1; this.percentPrecision = 2; this.decimalSeparator = "."; this.thousandsSeparator = ","; this.labels = []; this.allLabels = []; this.titles = []; this.marginRight = this.marginLeft = this.autoMarginOffset = 0; this.timeOuts = []; this.creditsPosition = "top-left"; var b = document.createElement("div"), c = b.style; c.overflow = "hidden"; c.position = "relative"; c.textAlign = "left"; this.chartDiv = b; b = document.createElement("div"); c = b.style; c.overflow = "hidden"; c.position = "relative"; c.textAlign = "left"; this.legendDiv = b; this.titleHeight = 0; this.hideBalloonTime = 150; this.handDrawScatter = 2; this.handDrawThickness = 1; this.prefixesOfBigNumbers = [{ number: 1E3, prefix: "k" }, { number: 1E6, prefix: "M" }, { number: 1E9, prefix: "G" }, { number: 1E12, prefix: "T" }, { number: 1E15, prefix: "P" }, { number: 1E18, prefix: "E" }, { number: 1E21, prefix: "Z" }, { number: 1E24, prefix: "Y" }]; this.prefixesOfSmallNumbers = [{ number: 1E-24, prefix: "y" }, { number: 1E-21, prefix: "z" }, { number: 1E-18, prefix: "a" }, { number: 1E-15, prefix: "f" }, { number: 1E-12, prefix: "p" }, { number: 1E-9, prefix: "n" }, { number: 1E-6, prefix: "\u03bc" }, { number: .001, prefix: "m" }]; this.panEventsEnabled = !0; this.product = "amcharts"; this.animations = []; this.balloon = new d.AmBalloon(this.theme); this.balloon.chart = this; d.applyTheme(this, a, "AmChart") }, drawChart: function () { this.drawBackground(); this.redrawLabels(); this.drawTitles(); this.brr() }, drawBackground: function () { d.remove(this.background); var a = this.container, b = this.backgroundColor, c = this.backgroundAlpha, e = this.set; d.isModern || 0 !== c || (c = .001); var h = this.updateWidth(); this.realWidth = h; var f = this.updateHeight(); this.realHeight = f; b = d.polygon(a, [0, h - 1, h - 1, 0], [0, 0, f - 1, f - 1], b, c, 1, this.borderColor, this.borderAlpha); d.setCN(this, b, "bg"); this.background = b; e.push(b); if (b = this.backgroundImage) a = a.image(b, 0, 0, h, f), d.setCN(this, b, "bg-image"), this.bgImg = a, e.push(a) }, drawTitles: function () { var a = this.titles; if (d.ifArray(a)) { var b = 20, c; for (c = 0; c < a.length; c++) { var e = a[c], e = d.processObject(e, d.Title, this.theme); if (!1 !== e.enabled) { var h = e.color; void 0 === h && (h = this.color); var f = e.size; isNaN(f) && (f = this.fontSize + 2); isNaN(e.alpha); var g = this.marginLeft, h = d.text(this.container, e.text, h, this.fontFamily, f); h.translate(g + (this.realWidth - this.marginRight - g) / 2, b); h.node.style.pointerEvents = "none"; d.setCN(this, h, "title"); e.id && d.setCN(this, h, "title-" + e.id); g = !0; void 0 !== e.bold && (g = e.bold); g && h.attr({ "font-weight": "bold" }); h.attr({ opacity: e.alpha }); b += f + 6; this.freeLabelsSet.push(h) } } } }, write: function (a) { if (a = "object" != typeof a ? document.getElementById(a) : a) { for (; a.firstChild;) a.removeChild(a.firstChild); this.div = a; a.style.overflow = "hidden"; a.style.textAlign = "left"; var b = this.chartDiv, c = this.legendDiv, e = this.legend, h = c.style, f = b.style; this.measure(); this.previousHeight = this.divRealHeight; this.previousWidth = this.divRealWidth; var g, k = document.createElement("div"); g = k.style; g.position = "relative"; this.containerDiv = k; k.className = this.classNamePrefix + "-main-div"; b.className = this.classNamePrefix + "-chart-div"; a.appendChild(k); var l = this.exportConfig; l && d.AmExport && !this.AmExport && (this.AmExport = new d.AmExport(this, l)); this.amExport && d.AmExport && (this.AmExport = d.extend(this.amExport, new d.AmExport(this), !0)); this.AmExport && this.AmExport.init && this.AmExport.init(); if (e) if (e = this.addLegend(e, e.divId), e.enabled) switch (e.position) { case "bottom": k.appendChild(b); k.appendChild(c); break; case "top": k.appendChild(c); k.appendChild(b); break; case "absolute": g.width = a.style.width; g.height = a.style.height; h.position = "absolute"; f.position = "absolute"; void 0 !== e.left && (h.left = e.left + "px"); void 0 !== e.right && (h.right = e.right + "px"); void 0 !== e.top && (h.top = e.top + "px"); void 0 !== e.bottom && (h.bottom = e.bottom + "px"); e.marginLeft = 0; e.marginRight = 0; k.appendChild(b); k.appendChild(c); break; case "right": g.width = a.style.width; g.height = a.style.height; h.position = "relative"; f.position = "absolute"; k.appendChild(b); k.appendChild(c); break; case "left": g.width = a.style.width; g.height = a.style.height; h.position = "absolute"; f.position = "relative"; k.appendChild(b); k.appendChild(c); break; case "outside": k.appendChild(b) } else k.appendChild(b); else k.appendChild(b); this.listenersAdded || (this.addListeners(), this.listenersAdded = !0); this.initChart() } }, createLabelsSet: function () { d.remove(this.labelsSet); this.labelsSet = this.container.set(); this.freeLabelsSet.push(this.labelsSet) }, initChart: function () { window.AmCharts_path && (this.path = window.AmCharts_path); void 0 === this.path && (this.path = d.getPath()); void 0 === this.path && (this.path = "amcharts/"); this.path = d.normalizeUrl(this.path); void 0 === this.pathToImages && (this.pathToImages = this.path + "images/"); this.initHC || (d.callInitHandler(this), this.initHC = !0); this.renderFix(); d.applyLang(this.language, this); var a = this.numberFormatter; a && (isNaN(a.precision) || (this.precision = a.precision), void 0 !== a.thousandsSeparator && (this.thousandsSeparator = a.thousandsSeparator), void 0 !== a.decimalSeparator && (this.decimalSeparator = a.decimalSeparator)); (a = this.percentFormatter) && !isNaN(a.precision) && (this.percentPrecision = a.precision); this.nf = { precision: this.precision, thousandsSeparator: this.thousandsSeparator, decimalSeparator: this.decimalSeparator }; this.pf = { precision: this.percentPrecision, thousandsSeparator: this.thousandsSeparator, decimalSeparator: this.decimalSeparator }; this.divIsFixed = d.findIfFixed(this.chartDiv); this.destroy(); a = 0; document.attachEvent && !window.opera && (a = 1); this.dmouseX = this.dmouseY = 0; var b = document.getElementsByTagName("html")[0]; b && window.getComputedStyle && (b = window.getComputedStyle(b, null)) && (this.dmouseY = d.removePx(b.getPropertyValue("margin-top")), this.dmouseX = d.removePx(b.getPropertyValue("margin-left"))); this.mouseMode = a; (a = this.container) ? (a.container.innerHTML = "", a.width = this.realWidth, a.height = this.realHeight, a.addDefs(this), this.chartDiv.appendChild(a.container)) : a = new d.AmDraw(this.chartDiv, this.realWidth, this.realHeight, this); a.chart = this; d.VML || d.SVG ? (a.handDrawn = this.handDrawn, a.handDrawScatter = this.handDrawScatter, a.handDrawThickness = this.handDrawThickness, this.container = a, this.set && this.set.remove(), this.set = a.set(), this.gridSet && this.gridSet.remove(), this.gridSet = a.set(), this.cursorLineSet && this.cursorLineSet.remove(), this.cursorLineSet = a.set(), this.graphsBehindSet && this.graphsBehindSet.remove(), this.graphsBehindSet = a.set(), this.bulletBehindSet && this.bulletBehindSet.remove(), this.bulletBehindSet = a.set(), this.columnSet && this.columnSet.remove(), this.columnSet = a.set(), this.graphsSet && this.graphsSet.remove(), this.graphsSet = a.set(), this.trendLinesSet && this.trendLinesSet.remove(), this.trendLinesSet = a.set(), this.axesSet && this.axesSet.remove(), this.axesSet = a.set(), this.cursorSet && this.cursorSet.remove(), this.cursorSet = a.set(), this.scrollbarsSet && this.scrollbarsSet.remove(), this.scrollbarsSet = a.set(), this.bulletSet && this.bulletSet.remove(), this.bulletSet = a.set(), this.freeLabelsSet && this.freeLabelsSet.remove(), this.axesLabelsSet && this.axesLabelsSet.remove(), this.axesLabelsSet = a.set(), this.freeLabelsSet = a.set(), this.balloonsSet && this.balloonsSet.remove(), this.balloonsSet = a.set(), this.zoomButtonSet && this.zoomButtonSet.remove(), this.zbSet && (this.zbSet.remove(), this.zbSet = null), this.zoomButtonSet = a.set(), this.linkSet && this.linkSet.remove(), this.linkSet = a.set()) : this.fire("failed", { type: "failed", chart: this }) }, premeasure: function () { var a = this.div; if (a) { var b = a.offsetWidth, c = a.offsetHeight; a.clientHeight && (b = a.clientWidth, c = a.clientHeight); if (b != this.mw || c != this.mh) this.mw = b, this.mh = c, this.measure() } }, measure: function () { var a = this.div; if (a) { var b = this.chartDiv, c = a.offsetWidth, e = a.offsetHeight, h = this.container; a.clientHeight && (c = a.clientWidth, e = a.clientHeight); var f = d.removePx(d.getStyle(a, "padding-left")), g = d.removePx(d.getStyle(a, "padding-right")), k = d.removePx(d.getStyle(a, "padding-top")), l = d.removePx(d.getStyle(a, "padding-bottom")); isNaN(f) || (c -= f); isNaN(g) || (c -= g); isNaN(k) || (e -= k); isNaN(l) || (e -= l); f = a.style; a = f.width; f = f.height; - 1 != a.indexOf("px") && (c = d.removePx(a)); - 1 != f.indexOf("px") && (e = d.removePx(f)); e = Math.round(e); c = Math.round(c); a = Math.round(d.toCoordinate(this.width, c)); f = Math.round(d.toCoordinate(this.height, e)); (c != this.previousWidth || e != this.previousHeight) && 0 < a && 0 < f && (b.style.width = a + "px", b.style.height = f + "px", h && h.setSize(a, f), this.balloon = d.processObject(this.balloon, d.AmBalloon, this.theme), this.balloon.setBounds(2, 2, a - 2, f)); this.balloon.chart = this; this.realWidth = a; this.realHeight = f; this.divRealWidth = c; this.divRealHeight = e } }, destroy: function () { this.chartDiv.innerHTML = ""; this.clearTimeOuts(); this.legend && this.legend.destroy() }, clearTimeOuts: function () { var a = this.timeOuts; if (a) { var b; for (b = 0; b < a.length; b++) clearTimeout(a[b]) } this.timeOuts = [] }, clear: function (a) { d.callMethod("clear", [this.chartScrollbar, this.scrollbarV, this.scrollbarH, this.chartCursor ]); this.chartCursor = this.scrollbarH = this.scrollbarV = this.chartScrollbar = null; this.clearTimeOuts(); this.container && (this.container.remove(this.chartDiv), this.container.remove(this.legendDiv)); a || d.removeChart(this); if (a = this.div) for (; a.firstChild;) a.removeChild(a.firstChild); this.legend && this.legend.destroy() }, setMouseCursor: function (a) { "auto" == a && d.isNN && (a = "default"); this.chartDiv.style.cursor = a; this.legendDiv.style.cursor = a }, redrawLabels: function () { this.labels = []; var a = this.allLabels; this.createLabelsSet(); var b; for (b = 0; b < a.length; b++) this.drawLabel(a[b]) }, drawLabel: function (a) { if (this.container && !1 !== a.enabled) { a = d.processObject(a, d.Label, this.theme); var b = a.y, c = a.text, e = a.align, h = a.size, f = a.color, g = a.rotation, k = a.alpha, l = a.bold, m = d.toCoordinate(a.x, this.realWidth), b = d.toCoordinate(b, this.realHeight); m || (m = 0); b || (b = 0); void 0 === f && (f = this.color); isNaN(h) && (h = this.fontSize); e || (e = "start"); "left" == e && (e = "start"); "right" == e && (e = "end"); "center" == e && (e = "middle", g ? b = this.realHeight - b + b / 2 : m = this.realWidth / 2 - m); void 0 === k && (k = 1); void 0 === g && (g = 0); b += h / 2; c = d.text(this.container, c, f, this.fontFamily, h, e, l, k); c.translate(m, b); d.setCN(this, c, "label"); a.id && d.setCN(this, c, "label-" + a.id); 0 !== g && c.rotate(g); a.url ? (c.setAttr("cursor", "pointer"), c.click(function () { d.getURL(a.url) })) : c.node.style.pointerEvents = "none"; this.labelsSet.push(c); this.labels.push(c) } }, addLabel: function (a, b, c, e, d, f, g, k, l, m) { a = { x: a, y: b, text: c, align: e, size: d, color: f, alpha: k, rotation: g, bold: l, url: m, enabled: !0 }; this.container && this.drawLabel(a); this.allLabels.push(a) }, clearLabels: function () { var a = this.labels, b; for (b = a.length - 1; 0 <= b; b--) a[b].remove(); this.labels = []; this.allLabels = [] }, updateHeight: function () { var a = this.divRealHeight, b = this.legend; if (b) { var c = this.legendDiv.offsetHeight, b = b.position; if ("top" == b || "bottom" == b) { a -= c; if (0 > a || isNaN(a)) a = 0; this.chartDiv.style.height = a + "px" } } return a }, updateWidth: function () { var a = this.divRealWidth, b = this.divRealHeight, c = this.legend; if (c) { var e = this.legendDiv, d = e.offsetWidth; isNaN(c.width) || (d = c.width); c.ieW && (d = c.ieW); var f = e.offsetHeight, e = e.style, g = this.chartDiv.style, c = c.position; if ("right" == c || "left" == c) { a -= d; if (0 > a || isNaN(a)) a = 0; g.width = a + "px"; "left" == c ? (g.left = d + "px", e.left = "0px") : (g.left = "0px", e.left = a + "px"); b > f && (e.top = (b - f) / 2 + "px") } } return a }, getTitleHeight: function () { var a = 0, b = this.titles, c = !0; if (0 < b.length) { var a = 20, e; for (e = 0; e < b.length; e++) { var d = b[e]; !1 !== d.enabled && (c = !1, d = d.size, isNaN(d) && (d = this.fontSize + 2), a += d + 6) } c && (a = 0) } return a }, addTitle: function (a, b, c, e, d) { isNaN(b) && (b = this.fontSize + 2); a = { text: a, size: b, color: c, alpha: e, bold: d, enabled: !0 }; this.titles.push(a); return a }, handleWheel: function (a) { var b = 0; a || (a = window.event); a.wheelDelta ? b = a.wheelDelta / 120 : a.detail && (b = -a.detail / 3); b && this.handleWheelReal(b, a.shiftKey); a.preventDefault && a.preventDefault() }, handleWheelReal: function () {}, addListeners: function () { var a = this, b = a.chartDiv; document.addEventListener ? (a.panEventsEnabled && (b.style.msTouchAction = "none"), "ontouchstart" in document.documentElement && (b.addEventListener("touchstart", function (b) { a.handleTouchMove.call(a, b); a.handleTouchStart.call(a, b) }, !0), b.addEventListener("touchmove", function (b) { a.handleTouchMove.call(a, b) }, !0), b.addEventListener("touchend", function (b) { a.handleTouchEnd.call(a, b) }, !0)), b.addEventListener("mousedown", function (b) { a.mouseIsOver = !0; a.handleMouseMove.call(a, b); a.handleMouseDown.call(a, b) }, !0), b.addEventListener("mouseover", function (b) { a.handleMouseOver.call(a, b) }, !0), b.addEventListener("mouseout", function (b) { a.handleMouseOut.call(a, b) }, !0)) : (b.attachEvent("onmousedown", function (b) { a.handleMouseDown.call(a, b) }), b.attachEvent("onmouseover", function (b) { a.handleMouseOver.call(a, b) }), b.attachEvent("onmouseout", function (b) { a.handleMouseOut.call(a, b) })) }, dispDUpd: function () { if (!this.skipEvents) { var a; this.dispatchDataUpdated && (this.dispatchDataUpdated = !1, a = "dataUpdated", this.fire(a, { type: a, chart: this })); this.chartCreated || (a = "init", this.fire(a, { type: a, chart: this })); this.chartRendered || (a = "rendered", this.fire(a, { type: a, chart: this }), this.chartRendered = !0); a = "drawn"; this.fire(a, { type: a, chart: this }) } this.skipEvents = !1 }, validateSize: function () { var a = this; a.premeasure(); if (a.divRealWidth != a.previousWidth || a.divRealHeight != a.previousHeight) { var b = a.legend; if (0 < a.realWidth && 0 < a.realHeight) { a.sizeChanged = !0; if (b) { clearTimeout(a.legendInitTO); var c = setTimeout(function () { b.invalidateSize() }, 100); a.timeOuts.push(c); a.legendInitTO = c } "xy" != a.type ? a.marginsUpdated = !1 : (a.marginsUpdated = !0, a.selfZoom = !0); clearTimeout(a.initTO); c = setTimeout(function () { a.initChart() }, 10); a.timeOuts.push(c); a.initTO = c } a.fire("resized", { type: "resized", chart: a }); a.renderFix(); b && b.renderFix && b.renderFix(); a.previousHeight = a.divRealHeight; a.previousWidth = a.divRealWidth } }, invalidateSize: function () { this.previousHeight = this.previousWidth = NaN; this.invalidateSizeReal() }, invalidateSizeReal: function () { var a = this; a.marginsUpdated = !1; clearTimeout(a.validateTO); var b = setTimeout(function () { a.validateSize() }, 5); a.timeOuts.push(b); a.validateTO = b }, validateData: function (a) { this.chartCreated && (this.dataChanged = !0, this.marginsUpdated = "xy" != this.type ? !1 : !0, this.initChart(a)) }, validateNow: function (a, b) { this.initTO && clearTimeout(this.initTO); a && (this.dataChanged = !0); this.skipEvents = b; this.chartRendered = !1; this.write(this.div) }, showItem: function (a) { a.hidden = !1; this.initChart() }, hideItem: function (a) { a.hidden = !0; this.initChart() }, hideBalloon: function () { var a = this; clearTimeout(a.hoverInt); clearTimeout(a.balloonTO); a.hoverInt = setTimeout(function () { a.hideBalloonReal.call(a) }, a.hideBalloonTime) }, cleanChart: function () {}, hideBalloonReal: function () { var a = this.balloon; a && a.hide() }, showBalloon: function (a, b, c, e, d) { var f = this; clearTimeout(f.balloonTO); clearTimeout(f.hoverInt); f.balloonTO = setTimeout(function () { f.showBalloonReal.call(f, a, b, c, e, d) }, 1) }, showBalloonReal: function (a, b, c, e, d) { this.handleMouseMove(); var f = this.balloon; f.enabled && (f.followCursor(!1), f.changeColor(b), !c || f.fixedPosition ? (f.setPosition(e, d), f.followCursor(!1)) : f.followCursor(!0), a && f.showBalloon(a)) }, handleTouchMove: function (a) { this.hideBalloon(); var b = this.chartDiv; a.touches && (a = a.touches.item(0), this.mouseX = a.pageX - d.findPosX(b), this.mouseY = a.pageY - d.findPosY(b)) }, handleMouseOver: function () { this.outTO && clearTimeout(this.outTO); d.resetMouseOver(); this.mouseIsOver = !0 }, handleMouseOut: function () { var a = this; a.outTO && clearTimeout(a.outTO); a.outTO = setTimeout(function () { a.handleMouseOutReal() }, 10) }, handleMouseOutReal: function () { d.resetMouseOver(); this.mouseIsOver = !1 }, handleMouseMove: function (a) { if (this.mouseIsOver) { var b = this.chartDiv; a || (a = window.event); var c, e; if (a) { this.posX = d.findPosX(b); this.posY = d.findPosY(b); switch (this.mouseMode) { case 1: c = a.clientX - this.posX; e = a.clientY - this.posY; if (!this.divIsFixed) { var b = document.body, h, f, g, k; b && (h = b.scrollLeft, g = b.scrollTop); if (b = document.documentElement) f = b.scrollLeft, k = b.scrollTop; h = Math.max(h, f); g = Math.max(g, k); c += h; e += g } break; case 0: this.divIsFixed ? (c = a.clientX - this.posX, e = a.clientY - this.posY) : (c = a.pageX - this.posX, e = a.pageY - this.posY) } a.touches && (a = a.touches.item(0), c = a.pageX - this.posX, e = a.pageY - this.posY); this.mouseX = c - this.dmouseX; this.mouseY = e - this.dmouseY } } }, handleTouchStart: function (a) { this.handleMouseDown(a) }, handleTouchEnd: function (a) { d.resetMouseOver(); this.handleReleaseOutside(a) }, handleReleaseOutside: function () {}, handleMouseDown: function (a) { d.resetMouseOver(); this.mouseIsOver = !0; a && a.preventDefault && (this.panEventsEnabled ? a.preventDefault() : a.touches || a.preventDefault()) }, addLegend: function (a, b) { a = d.processObject(a, d.AmLegend, this.theme); a.divId = b; a.ieW = 0; var c; c = "object" != typeof b && b ? document.getElementById(b) : b; this.legend = a; a.chart = this; c ? (a.div = c, a.position = "outside", a.autoMargins = !1) : a.div = this.legendDiv; c = this.handleLegendEvent; this.listenTo(a, "showItem", c); this.listenTo(a, "hideItem", c); this.listenTo(a, "clickMarker", c); this.listenTo(a, "rollOverItem", c); this.listenTo(a, "rollOutItem", c); this.listenTo(a, "rollOverMarker", c); this.listenTo(a, "rollOutMarker", c); this.listenTo(a, "clickLabel", c); return a }, removeLegend: function () { this.legend = void 0; this.legendDiv.innerHTML = "" }, handleResize: function () { (d.isPercents(this.width) || d.isPercents(this.height)) && this.invalidateSizeReal(); this.renderFix() }, renderFix: function () { if (!d.VML) { var a = this.container; a && a.renderFix() } }, getSVG: function () { if (d.hasSVG) return this.container }, animate: function (a, b, c, e, h, f, g) { a["an_" + b] && d.removeFromArray(this.animations, a["an_" + b]); c = { obj: a, frame: 0, attribute: b, from: c, to: e, time: h, effect: f, suffix: g }; a["an_" + b] = c; this.animations.push(c); return c }, setLegendData: function (a) { var b = this.legend; b && b.setData(a) }, stopAnim: function (a) { d.removeFromArray(this.animations, a) }, updateAnimations: function () { var a; this.container && this.container.update(); if (this.animations) for (a = this.animations.length - 1; 0 <= a; a--) { var b = this.animations[a], c = 1E3 * b.time / d.updateRate, e = b.frame + 1, h = b.obj, f = b.attribute; if (e <= c) { b.frame++; var g = Number(b.from), k = Number(b.to) - g, c = d[b.effect](0, e, g, k, c); 0 === k ? (this.animations.splice(a, 1), h.node.style[f] = Number(b.to) + b.suffix) : h.node.style[f] = c + b.suffix } else h.node.style[f] = Number(b.to) + b.suffix, this.animations.splice(a, 1) } }, update: function () { this.updateAnimations() }, inIframe: function () { try { return window.self !== window.top } catch (a) { return !0 } }, brr: function () { var a = window.location.hostname.split("."), b; 2 <= a.length && (b = a[a.length - 2] + "." + a[a.length - 1]); this.amLink && (a = this.amLink.parentNode) && a.removeChild(this.amLink); a = this.creditsPosition; if ("amcharts.com" != b || !0 === this.inIframe()) { var c = b = 0, e = this.realWidth, d = this.realHeight, f = this.type; if ("serial" == f || "xy" == f || "gantt" == f) b = this.marginLeftReal, c = this.marginTopReal, e = b + this.plotAreaWidth, d = c + this.plotAreaHeight; var g = "http://www.amcharts.com/javascript-charts/", k = "JavaScript charts", l = "JS chart by amCharts"; "ammap" == this.product && (g = "http://www.ammap.com/javascript-maps/", k = "Interactive JavaScript maps", l = "JS map by amCharts"); f = document.createElement("a"); l = document.createTextNode(l); f.setAttribute("href", g); f.setAttribute("title", k); // f.appendChild(l); this.chartDiv.appendChild(f); this.amLink = f; g = f.style; g.position = "absolute"; g.textDecoration = "none"; g.color = this.color; g.fontFamily = this.fontFamily; g.fontSize = this.fontSize + "px"; g.opacity = .7; g.display = "block"; var k = f.offsetWidth, f = f.offsetHeight, l = 5 + b, m = c + 5; "bottom-left" == a && (l = 5 + b, m = d - f - 3); "bottom-right" == a && (l = e - k - 5, m = d - f - 3); "top-right" == a && (l = e - k - 5, m = c + 5); g.left = l + "px"; g.top = m + "px" } } }); d.Slice = d.Class({ construct: function () {} }); d.SerialDataItem = d.Class({ construct: function () {} }); d.GraphDataItem = d.Class({ construct: function () {} }); d.Guide = d.Class({ construct: function (a) { this.cname = "Guide"; d.applyTheme(this, a, this.cname) } }); d.Title = d.Class({ construct: function (a) { this.cname = "Title"; d.applyTheme(this, a, this.cname) } }); d.Label = d.Class({ construct: function (a) { this.cname = "Label"; d.applyTheme(this, a, this.cname) } }) })(); (function () { var d = window.AmCharts; d.AmGraph = d.Class({ construct: function (a) { this.cname = "AmGraph"; this.createEvents("rollOverGraphItem", "rollOutGraphItem", "clickGraphItem", "doubleClickGraphItem", "rightClickGraphItem", "clickGraph", "rollOverGraph", "rollOutGraph"); this.type = "line"; this.stackable = !0; this.columnCount = 1; this.columnIndex = 0; this.centerCustomBullets = this.showBalloon = !0; this.maxBulletSize = 50; this.minBulletSize = 4; this.balloonText = "[[value]]"; this.hidden = this.scrollbar = this.animationPlayed = !1; this.pointPosition = "middle"; this.depthCount = 1; this.includeInMinMax = !0; this.negativeBase = 0; this.visibleInLegend = !0; this.showAllValueLabels = !1; this.showBulletsAt = this.showBalloonAt = "close"; this.lineThickness = 1; this.dashLength = 0; this.connect = !0; this.lineAlpha = 1; this.bullet = "none"; this.bulletBorderThickness = 2; this.bulletBorderAlpha = 0; this.bulletAlpha = 1; this.bulletSize = 8; this.cornerRadiusTop = this.hideBulletsCount = this.bulletOffset = 0; this.cursorBulletAlpha = 1; this.gradientOrientation = "vertical"; this.dy = this.dx = 0; this.periodValue = ""; this.clustered = !0; this.periodSpan = 1; this.y = this.x = 0; this.switchable = !0; this.tcc = this.minDistance = 1; this.labelRotation = 0; this.labelAnchor = "auto"; this.labelOffset = 3; this.bcn = "graph-"; this.dateFormat = "MMM DD, YYYY"; d.applyTheme(this, a, this.cname) }, draw: function () { var a = this.chart, b = a.type; isNaN(this.precision) || (this.numberFormatter ? this.numberFormatter.precision = this.precision : this.numberFormatter = { precision: this.precision, decimalSeparator: a.decimalSeparator, thousandsSeparator: a.thousandsSeparator }); var c = a.container; this.container = c; this.destroy(); var e = c.set(), h = c.set(); this.behindColumns ? (a.graphsBehindSet.push(e), a.bulletBehindSet.push(h)) : (a.graphsSet.push(e), a.bulletSet.push(h)); var f = this.bulletAxis; d.isString(f) && (this.bulletAxis = a.getValueAxisById(f)); this.bulletSet = h; if (!this.scrollbar) { var f = a.marginLeftReal, g = a.marginTopReal; e.translate(f, g); h.translate(f, g) } c = c.set(); d.remove(this.columnsSet); e.push(c); this.set = e; d.setCN(a, e, "graph-" + this.type); d.setCN(a, e, "graph-" + this.id); d.setCN(a, h, "graph-" + this.type); d.setCN(a, h, "graph-" + this.id); this.columnsSet = c; this.columnsArray = []; this.ownColumns = []; this.allBullets = []; this.animationArray = []; e = this.labelPosition; e || (h = this.valueAxis.stackType, e = "top", "column" == this.type && (a.rotate && (e = "right"), "100%" == h || "regular" == h) && (e = "middle"), this.labelPosition = e); d.ifArray(this.data) && (a = !1, "xy" == b ? this.xAxis.axisCreated && this.yAxis.axisCreated && (a = !0) : this.valueAxis.axisCreated && (a = !0), !this.hidden && a && this.createGraph()) }, createGraph: function () { var a = this, b = a.chart; a.startAlpha = b.startAlpha; a.seqAn = b.sequencedAnimation; a.baseCoord = a.valueAxis.baseCoord; void 0 === a.fillAlphas && (a.fillAlphas = 0); a.bulletColorR = a.bulletColor; void 0 === a.bulletColorR && (a.bulletColorR = a.lineColorR, a.bulletColorNegative = a.negativeLineColor); void 0 === a.bulletAlpha && (a.bulletAlpha = a.lineAlpha); b = b.type; "gantt" == b && (b = "serial"); clearTimeout(a.playedTO); if (!isNaN(a.valueAxis.min) && !isNaN(a.valueAxis.max)) { switch (b) { case "serial": a.categoryAxis && (a.createSerialGraph(), "candlestick" == a.type && 1 > a.valueAxis.minMaxMultiplier && a.positiveClip(a.set)); break; case "radar": a.createRadarGraph(); break; case "xy": a.createXYGraph(), a.positiveClip(a.set) } a.playedTO = setTimeout(function () { a.setAnimationPlayed.call(a) }, 500 * a.chart.startDuration) } }, setAnimationPlayed: function () { this.animationPlayed = !0 }, createXYGraph: function () { var a = [], b = [], c = this.xAxis, e = this.yAxis; this.pmh = e.viH + 1; this.pmw = c.viW + 1; this.pmy = this.pmx = 0; var d; for (d = this.start; d <= this.end; d++) { var f = this.data[d].axes[c.id].graphs[this.id], g = f.values, k = g.x, l = g.y, g = c.getCoordinate(k), m = e.getCoordinate(l); !isNaN(k) && !isNaN(l) && (a.push(g), b.push(m), f.x = g, f.y = m, k = this.createBullet(f, g, m, d), l = this.labelText) && (f = this.createLabel(f, g, m, l), this.positionLabel(g, m, f, k), this.allBullets.push(f)) } this.drawLineGraph(a, b); this.launchAnimation() }, createRadarGraph: function () { var a = this.valueAxis.stackType, b = [], c = [], e, d, f; for (f = this.start; f <= this.end; f++) { var g = this.data[f].axes[this.valueAxis.id].graphs[this.id], k; k = "none" == a || "3d" == a ? g.values.value : g.values.close; if (isNaN(k)) this.drawLineGraph(b, c), b = [], c = []; else { var l = this.y - (this.valueAxis.getCoordinate(k) - this.height), m = 180 - 360 / (this.end - this.start + 1) * f; k = l * Math.sin(m / 180 * Math.PI); l *= Math.cos(m / 180 * Math.PI); b.push(k); c.push(l); var m = this.createBullet(g, k, l, f), n = this.labelText; n && (g = this.createLabel(g, k, l, n), this.positionLabel(k, l, g, m), this.allBullets.push(g)); isNaN(e) && (e = k); isNaN(d) && (d = l) } } b.push(e); c.push(d); this.drawLineGraph(b, c); this.launchAnimation() }, positionLabel: function (a, b, c, e) { var d = "middle", f = !1, g = this.labelPosition, k = c.getBBox(); if (e) { var l = e.graphDataItem, m = this.chart.rotate, n = l.isNegative, q = this.chart; b -= k.height / 4 / 2; switch (g) { case "top": g = m ? "top" : n ? "bottom" : "top"; break; case "right": g = m ? n ? "left" : "right" : "right"; break; case "bottom": g = m ? "bottom" : n ? "top" : "bottom"; break; case "left": g = m ? n ? "right" : "left" : "left" } var p = l.columnGraphics, r = 0, t = 0; p && (r = p.x, t = p.y); var u = this.labelOffset; switch (g) { case "top": b -= e.size / 2 + k.height / 2 + u; break; case "right": d = "start"; a += e.size / 2 + u; break; case "bottom": b += e.size / 2 + k.height / 2 + u; break; case "left": d = "end"; a -= e.size / 2 + u; break; case "inside": "column" == this.type && (f = !0, m ? n ? (d = "end", a = r - 3 - u) : (d = "start", a = r + 3 + u) : b = n ? t + 7 + u : t - 10 - u); break; case "middle": "column" == this.type && (f = !0, m ? a -= (a - r) / 2 + u - 3 : b -= (b - t) / 2 + u - 3) } "auto" != this.labelAnchor && (d = this.labelAnchor); c.attr({ "text-anchor": d }); this.labelRotation && c.rotate(this.labelRotation); c.translate(a, b); k = c.getBBox(); !this.showAllValueLabels && p && f && (k.height > l.columnHeight || k.width > l.columnWidth) && (c.remove(), c = !1); if (c && ("serial" == q.type || "gantt" == q.type)) if (m) { if (0 > b || b > this.height) c.remove(), c = !1 } else if (0 > a || a > this.width) c.remove(), c = !1; return c } }, getGradRotation: function () { var a = 270; "horizontal" == this.gradientOrientation && (a = 0); return this.gradientRotation = a }, createSerialGraph: function () { this.dashLengthSwitched = this.fillColorsSwitched = this.lineColorSwitched = void 0; var a = this.chart, b = this.id, c = this.index, e = this.data, h = this.chart.container, f = this.valueAxis, g = this.type, k = this.columnWidthReal, l = this.showBulletsAt; isNaN(this.columnWidth) || (k = this.columnWidth); isNaN(k) && (k = .8); var m = this.useNegativeColorIfDown, n = this.width, q = this.height, p = this.y, r = this.rotate, t = this.columnCount, u = d.toCoordinate(this.cornerRadiusTop, k / 2), z = this.connect, w = [], x = [], v, A, B, D, C = this.chart.graphs.length, I, H = this.dx / this.tcc, O = this.dy / this.tcc, J = f.stackType, da = this.start, pa = this.end, U = this.scrollbar, na = "graph-column-"; U && (na = "scrollbar-graph-column-"); var qa = this.categoryAxis, ja = this.baseCoord, Pa = this.negativeBase, aa = this.columnIndex, Z = this.lineThickness, V = this.lineAlpha, sa = this.lineColorR, ba = this.dashLength, ca = this.set, ta, ia = this.getGradRotation(), Q = this.chart.columnSpacing, W = qa.cellWidth, wa = (W * k - t) / t; Q > wa && (Q = wa); var G, y, ka, ea = q + 1, Qa = n + 1, Y = 0, qb = 0, rb, sb, eb, fb, tb = this.fillColorsR, Ja = this.negativeFillColors, Ca = this.negativeLineColor, Wa = this.fillAlphas, Xa = this.negativeFillAlphas; "object" == typeof Wa && (Wa = Wa[0]); "object" == typeof Xa && (Xa = Xa[0]); var gb = f.getCoordinate(f.min); f.logarithmic && (gb = f.getCoordinate(f.minReal)); this.minCoord = gb; this.resetBullet && (this.bullet = "none"); if (!(U || "line" != g && "smoothedLine" != g && "step" != g || (1 == e.length && "step" != g && "none" == this.bullet && (this.bullet = "round", this.resetBullet = !0), !Ja && void 0 == Ca || m))) { var Ra = Pa; Ra > f.max && (Ra = f.max); Ra < f.min && (Ra = f.min); f.logarithmic && (Ra = f.minReal); var Ga = f.getCoordinate(Ra), Ib = f.getCoordinate(f.max); r ? (ea = q, Qa = Math.abs(Ib - Ga) + 1, rb = q, sb = Math.abs(gb - Ga) + 1, fb = qb = 0, f.reversed ? (Y = 0, eb = Ga) : (Y = Ga, eb = 0)) : (Qa = n, ea = Math.abs(Ib - Ga) + 1, sb = n, rb = Math.abs(gb - Ga) + 1, eb = Y = 0, f.reversed ? (fb = p, qb = Ga) : fb = Ga + 1) } var Ha = Math.round; this.pmx = Ha(Y); this.pmy = Ha(qb); this.pmh = Ha(ea); this.pmw = Ha(Qa); this.nmx = Ha(eb); this.nmy = Ha(fb); this.nmh = Ha(rb); this.nmw = Ha(sb); d.isModern || (this.nmy = this.nmx = 0, this.nmh = this.height); this.clustered || (t = 1); k = "column" == g ? (W * k - Q * (t - 1)) / t : W * k; 1 > k && (k = 1); var Jb = this.fixedColumnWidth; isNaN(Jb) || (k = Jb); var K; if ("line" == g || "step" == g || "smoothedLine" == g) { if (0 < da) { for (K = da - 1; - 1 < K; K--) if (G = e[K], y = G.axes[f.id].graphs[b], ka = y.values.value, !isNaN(ka)) { da = K; break } if (this.lineColorField) for (K = da; - 1 < K; K--) if (G = e[K], y = G.axes[f.id].graphs[b], y.lineColor) { this.bulletColorSwitched = this.lineColorSwitched = y.lineColor; break } if (this.fillColorsField) for (K = da; - 1 < K; K--) if (G = e[K], y = G.axes[f.id].graphs[b], y.fillColors) { this.fillColorsSwitched = y.fillColors; break } if (this.dashLengthField) for (K = da; - 1 < K; K--) if (G = e[K], y = G.axes[f.id].graphs[b], !isNaN(y.dashLength)) { this.dashLengthSwitched = y.dashLength; break } } if (pa < e.length - 1) for (K = pa + 1; K < e.length; K++) if (G = e[K], y = G.axes[f.id].graphs[b], ka = y.values.value, !isNaN(ka)) { pa = K; break } } pa < e.length - 1 && pa++; var R = [], S = [], Ka = !1; if ("line" == g || "step" == g || "smoothedLine" == g) if (this.stackable && "regular" == J || "100%" == J || this.fillToGraph) Ka = !0; var Kb = this.noStepRisers, hb = -1E3, ib = -1E3, jb = this.minDistance, La = !0, Ya = !1; for (K = da; K <= pa; K++) { G = e[K]; y = G.axes[f.id].graphs[b]; y.index = K; var Za, Ma = NaN; if (m && void 0 == this.openField) for (var ub = K + 1; ub < e.length && (!e[ub] || !(Za = e[K + 1].axes[f.id].graphs[b]) || !Za.values || (Ma = Za.values.value, isNaN(Ma))); ub++); var T, P, M, fa, la = NaN, F = NaN, E = NaN, N = NaN, L = NaN, Na = NaN, Da = NaN, Oa = NaN, Ea = NaN, ya = NaN, za = NaN, ga = NaN, ha = NaN, X = NaN, vb = NaN, wb = NaN, ma = NaN, oa = void 0, Ia = tb, Sa = Wa, Aa = sa, ua, xa, xb = this.proCandlesticks, kb = this.topRadius, $a = this.pattern; void 0 != y.pattern && ($a = y.pattern); isNaN(y.alpha) || (Sa = y.alpha); isNaN(y.dashLength) || (ba = y.dashLength); var Ba = y.values; f.recalculateToPercents && (Ba = y.percents); if (Ba) { X = this.stackable && "none" != J && "3d" != J ? Ba.close : Ba.value; if ("candlestick" == g || "ohlc" == g) X = Ba.close, wb = Ba.low, Da = f.getCoordinate(wb), vb = Ba.high, Ea = f.getCoordinate(vb); ma = Ba.open; E = f.getCoordinate(X); isNaN(ma) || (L = f.getCoordinate(ma), m && (Ma = ma, ma = L = NaN)); m && (void 0 == this.openField ? Za && (Za.isNegative = Ma < X ? !0 : !1, isNaN(Ma) && (y.isNegative = !La)) : y.isNegative = Ma > X ? !0 : !1); if (!U) switch (this.showBalloonAt) { case "close": y.y = E; break; case "open": y.y = L; break; case "high": y.y = Ea; break; case "low": y.y = Da } var la = G.x[qa.id], Ta = this.periodSpan - 1, ra = Math.floor(W / 2) + Math.floor(Ta * W / 2), Fa = ra, lb = 0; "left" == this.stepDirection && (lb = (2 * W + Ta * W) / 2, la -= lb); "center" == this.stepDirection && (lb = W / 2, la -= lb); "start" == this.pointPosition && (la -= W / 2 + Math.floor(Ta * W / 2), ra = 0, Fa = Math.floor(W) + Math.floor(Ta * W)); "end" == this.pointPosition && (la += W / 2 + Math.floor(Ta * W / 2), ra = Math.floor(W) + Math.floor(Ta * W), Fa = 0); if (Kb) { var yb = this.columnWidth; isNaN(yb) || (ra *= yb, Fa *= yb) } U || (y.x = la); - 1E5 > la && (la = -1E5); la > n + 1E5 && (la = n + 1E5); r ? (F = E, N = L, L = E = la, isNaN(ma) && !this.fillToGraph && (N = ja), Na = Da, Oa = Ea) : (N = F = la, isNaN(ma) && !this.fillToGraph && (L = ja)); if (!xb && X < ma || xb && X < ta) y.isNegative = !0, Ja && (Ia = Ja), Xa && (Sa = Xa), void 0 != Ca && (Aa = Ca); Ya = !1; isNaN(X) || (m ? X > Ma ? (La && (Ya = !0), La = !1) : (La || (Ya = !0), La = !0) : y.isNegative = X < Pa ? !0 : !1, ta = X); void 0 != y.color && (Ia = y.color); y.fillColors && (Ia = y.fillColors); switch (g) { case "line": if (isNaN(X)) z || (this.drawLineGraph(w, x, R, S), w = [], x = [], R = [], S = []); else { if (Math.abs(F - hb) >= jb || Math.abs(E - ib) >= jb) w.push(F), x.push(E), hb = F, ib = E; ya = F; za = E; ga = F; ha = E; !Ka || isNaN(L) || isNaN(N) || (R.push(N), S.push(L)); if (Ya || void 0 != y.lineColor || void 0 != y.fillColors || !isNaN(y.dashLength)) this.drawLineGraph(w, x, R, S), w = [F], x = [E], R = [], S = [], !Ka || isNaN(L) || isNaN(N) || (R.push(N), S.push(L)), m ? La ? (this.lineColorSwitched = sa, this.fillColorsSwitched = tb) : (this.lineColorSwitched = Ca, this.fillColorsSwitched = Ja) : (this.lineColorSwitched = y.lineColor, this.fillColorsSwitched = y.fillColors), this.dashLengthSwitched = y.dashLength; y.gap && (this.drawLineGraph(w, x, R, S), w = [], x = [], R = [], S = []) } break; case "smoothedLine": if (isNaN(X)) z || (this.drawSmoothedGraph(w, x, R, S), w = [], x = [], R = [], S = []); else { if (Math.abs(F - hb) >= jb || Math.abs(E - ib) >= jb) w.push(F), x.push(E), hb = F, ib = E; ya = F; za = E; ga = F; ha = E; !Ka || isNaN(L) || isNaN(N) || (R.push(N), S.push(L)); void 0 == y.lineColor && void 0 == y.fillColors && isNaN(y.dashLength) || (this.drawSmoothedGraph(w, x, R, S), w = [F], x = [E], R = [], S = [], !Ka || isNaN(L) || isNaN(N) || (R.push(N), S.push(L)), this.lineColorSwitched = y.lineColor, this.fillColorsSwitched = y.fillColors, this.dashLengthSwitched = y.dashLength); y.gap && (this.drawSmoothedGraph(w, x, R, S), w = [], x = [], R = [], S = []) } break; case "step": if (!isNaN(X)) { r ? (isNaN(v) || (w.push(v), x.push(E - ra)), x.push(E - ra), w.push(F), x.push(E + Fa), w.push(F), !Ka || isNaN(L) || isNaN(N) || (isNaN(B) || (R.push(B), S.push(L - ra)), R.push(N), S.push(L - ra), R.push(N), S.push(L + Fa))) : (isNaN(A) || (x.push(A), w.push(v), x.push(A), w.push(F - ra)), w.push(F - ra), x.push(E), w.push(F + Fa), x.push(E), !Ka || isNaN(L) || isNaN(N) || (isNaN(D) || (R.push(N - ra), S.push(D)), R.push(N - ra), S.push(L), R.push(N + Fa), S.push(L))); v = F; A = E; B = N; D = L; ya = F; za = E; ga = F; ha = E; if (Ya || void 0 != y.lineColor || void 0 != y.fillColors || !isNaN(y.dashLength)) { var Yb = w[w.length - 2], Zb = x[x.length - 2]; w.pop(); x.pop(); this.drawLineGraph(w, x, R, S); w = [Yb]; x = [Zb]; R = []; S = []; this.lineColorSwitched = y.lineColor; this.fillColorsSwitched = y.fillColors; this.dashLengthSwitched = y.dashLength; m && (La ? (this.lineColorSwitched = sa, this.fillColorsSwitched = tb) : (this.lineColorSwitched = Ca, this.fillColorsSwitched = Ja)) } if (Kb || y.gap) v = A = NaN, this.drawLineGraph(w, x, R, S), w = [], x = [], R = [], S = [] } else if (!z) { if (1 >= this.periodSpan || 1 < this.periodSpan && F - v > ra + Fa) v = A = NaN; this.drawLineGraph(w, x, R, S); w = []; x = []; R = []; S = [] } break; case "column": ua = Aa; void 0 != y.lineColor && (ua = y.lineColor); if (!isNaN(X)) { m || (y.isNegative = X < Pa ? !0 : !1); y.isNegative && (Ja && (Ia = Ja), void 0 != Ca && (ua = Ca)); var Lb = f.min, Mb = f.max; if (!(X < Lb && ma < Lb || X > Mb && ma > Mb)) { var va; if (r) { "3d" == J ? (P = E - (t / 2 - this.depthCount + 1) * (k + Q) + Q / 2 + O * aa, T = N + H * aa, va = aa) : (P = Math.floor(E - (t / 2 - aa) * (k + Q) + Q / 2), T = N, va = 0); M = k; ya = F; za = P + k / 2; isNaN(N) || N > F && !y.isNegative && (ya = N); ga = F; ha = P + k / 2; P + M > q + va * O && (M = q - P + va * O); P < va * O && (M += P, P = va * O); fa = F - N; var $b = T; T = d.fitToBounds(T, 0, n); fa += $b - T; fa = d.fitToBounds(fa, -T, n - T + H * aa); P < q && 0 < M && (oa = new d.Cuboid(h, fa, M, H - a.d3x, O - a.d3y, Ia, Sa, Z, ua, V, ia, u, r, ba, $a, kb, na), y.columnWidth = Math.abs(fa), y.columnHeight = Math.abs(M)) } else { "3d" == J ? (T = F - (t / 2 - this.depthCount + 1) * (k + Q) + Q / 2 + H * aa, P = L + O * aa, va = aa) : (T = F - (t / 2 - aa) * (k + Q) + Q / 2, P = L, va = 0); M = k; ya = T + k / 2; za = E; isNaN(L) || L < E && !y.isNegative && (za = L); ga = T + k / 2; ha = E; T + M > n + va * H && (M = n - T + va * H); T < va * H && (M += T - va * H, T = va * H); fa = E - L; var ac = P; P = d.fitToBounds(P, this.dy, q); fa += ac - P; fa = d.fitToBounds(fa, -P + O * aa, q - P); T < n + aa * H && 0 < M && (this.showOnAxis && (P -= O / 2), oa = new d.Cuboid(h, M, fa, H - a.d3x, O - a.d3y, Ia, Sa, Z, ua, this.lineAlpha, ia, u, r, ba, $a, kb, na), y.columnHeight = Math.abs(fa), y.columnWidth = Math.abs(M)) } } if (oa && (xa = oa.set, d.setCN(a, oa.set, "graph-" + this.type), d.setCN(a, oa.set, "graph-" + this.id), y.className && d.setCN(a, oa.set, y.className, !0), y.columnGraphics = xa, xa.translate(T, P), this.columnsSet.push(xa), (y.url || this.showHandOnHover) && xa.setAttr("cursor", "pointer"), !U)) { "none" == J && (I = r ? (this.end + 1 - K) * C - c : C * K + c); "3d" == J && (r ? (I = (this.end + 1 - K) * C - c - 1E3 * this.depthCount, ya += H * this.columnIndex, ga += H * this.columnIndex, y.y += H * this.columnIndex) : (I = (C - c) * (K + 1) + 1E3 * this.depthCount, za += O * this.columnIndex, ha += O * this.columnIndex, y.y += O * this.columnIndex)); if ("regular" == J || "100%" == J) I = r ? 0 < Ba.value ? (this.end + 1 - K) * C + c : (this.end + 1 - K) * C - c : 0 < Ba.value ? C * K + c : C * K - c; this.columnsArray.push({ column: oa, depth: I }); y.x = r ? P + M / 2 : T + M / 2; this.ownColumns.push(oa); this.animateColumns(oa, K, F, N, E, L); this.addListeners(xa, y) } } break; case "candlestick": if (!isNaN(ma) && !isNaN(X)) { var Ua, ab; ua = Aa; void 0 != y.lineColor && (ua = y.lineColor); if (r) { if (P = E - k / 2, T = N, M = k, P + M > q && (M = q - P), 0 > P && (M += P, P = 0), P < q && 0 < M) { var zb, Ab; X > ma ? (zb = [F, Oa], Ab = [N, Na]) : (zb = [N, Oa], Ab = [F, Na]); !isNaN(Oa) && !isNaN(Na) && E < q && 0 < E && (Ua = d.line(h, zb, [E, E], ua, V, Z), ab = d.line(h, Ab, [E, E], ua, V, Z)); fa = F - N; oa = new d.Cuboid(h, fa, M, H, O, Ia, Wa, Z, ua, V, ia, u, r, ba, $a, kb, na) } } else if (T = F - k / 2, P = L + Z / 2, M = k, T + M > n && (M = n - T), 0 > T && (M += T, T = 0), fa = E - L, T < n && 0 < M) { xb && X >= ma && (Sa = 0); var oa = new d.Cuboid(h, M, fa, H, O, Ia, Sa, Z, ua, V, ia, u, r, ba, $a, kb, na), Bb, Cb; X > ma ? (Bb = [E, Ea], Cb = [L, Da ]) : (Bb = [L, Ea], Cb = [E, Da]); !isNaN(Ea) && !isNaN(Da) && F < n && 0 < F && (Ua = d.line(h, [F, F], Bb, ua, V, Z), ab = d.line(h, [F, F], Cb, ua, V, Z), d.setCN(a, Ua, this.bcn + "line-high"), y.className && d.setCN(a, Ua, y.className, !0), d.setCN(a, ab, this.bcn + "line-low"), y.className && d.setCN(a, ab, y.className, !0)) } oa && (xa = oa.set, y.columnGraphics = xa, ca.push(xa), xa.translate(T, P - Z / 2), (y.url || this.showHandOnHover) && xa.setAttr("cursor", "pointer"), Ua && (ca.push(Ua), ca.push(ab)), ya = F, za = E, r ? (ha = E, ga = F, "open" == l && (ga = N), "high" == l && (ga = Oa), "low" == l && (ga = Na)) : (ha = E, "open" == l && (ha = L), "high" == l && (ha = Ea), "low" == l && (ha = Da), ga = F), U || (y.x = r ? P + M / 2 : T + M / 2, this.animateColumns(oa, K, F, N, E, L), this.addListeners(xa, y))) } break; case "ohlc": if (!(isNaN(ma) || isNaN(vb) || isNaN(wb) || isNaN(X))) { var Nb = h.set(); ca.push(Nb); X < ma && (y.isNegative = !0, void 0 != Ca && (Aa = Ca)); var mb, nb, ob; if (r) { var Db = E - k / 2, Db = d.fitToBounds(Db, 0, q), Ob = d.fitToBounds(E, 0, q), Eb = E + k / 2, Eb = d.fitToBounds(Eb, 0, q); nb = d.line(h, [N, N], [Db, Ob], Aa, V, Z, ba); 0 < E && E < q && (mb = d.line(h, [Na, Oa], [E, E], Aa, V, Z, ba)); ob = d.line(h, [F, F], [Ob, Eb], Aa, V, Z, ba); ha = E; ga = F; "open" == l && (ga = N); "high" == l && (ga = Oa); "low" == l && (ga = Na) } else { var Fb = F - k / 2, Fb = d.fitToBounds(Fb, 0, n), Pb = d.fitToBounds(F, 0, n), Gb = F + k / 2, Gb = d.fitToBounds(Gb, 0, n); nb = d.line(h, [Fb, Pb], [L, L], Aa, V, Z, ba); 0 < F && F < n && (mb = d.line(h, [F, F], [Da, Ea], Aa, V, Z, ba)); ob = d.line(h, [Pb, Gb], [E, E], Aa, V, Z, ba); ha = E; "open" == l && (ha = L); "high" == l && (ha = Ea); "low" == l && (ha = Da); ga = F } ca.push(nb); ca.push(mb); ca.push(ob); d.setCN(a, nb, this.bcn + "stroke-open"); d.setCN(a, ob, this.bcn + "stroke-close"); d.setCN(a, mb, this.bcn + "stroke"); y.className && d.setCN(a, Nb, y.className, !0); ya = F; za = E } } if (!U && !isNaN(X)) { var Qb = this.hideBulletsCount; if (this.end - this.start <= Qb || 0 === Qb) { var Rb = this.createBullet(y, ga, ha, K), Sb = this.labelText; if (Sb && Rb) { var Hb = this.createLabel(y, ga, ha, Sb); (Hb = this.positionLabel(ya, za, Hb, Rb, M, fa)) && this.allBullets.push(Hb) } if ("regular" == J || "100%" == J) { var Tb = f.totalText; if (Tb) { var Va = this.createLabel(y, 0, 0, Tb, f.totalTextColor); this.allBullets.push(Va); var Ub = Va.getBBox(), Vb = Ub.width, Wb = Ub.height, bb, cb, pb = f.totalTextOffset, Xb = f.totals[K]; Xb && Xb.remove(); var db = 0; "column" != g && (db = this.bulletSize); r ? (cb = E, bb = 0 > X ? F - Vb / 2 - 2 - db - pb : F + Vb / 2 + 3 + db + pb) : (bb = F, cb = 0 > X ? E + Wb / 2 + db + pb : E - Wb / 2 - 3 - db - pb); Va.translate(bb, cb); f.totals[K] = Va; r ? (0 > cb || cb > q) && Va.remove() : (0 > bb || bb > n) && Va.remove() } } } } } } if ("line" == g || "step" == g || "smoothedLine" == g) "smoothedLine" == g ? this.drawSmoothedGraph(w, x, R, S) : this.drawLineGraph(w, x, R, S), U || this.launchAnimation(); this.bulletsHidden && this.hideBullets(); this.customBulletsHidden && this.hideCustomBullets() }, animateColumns: function (a, b) { var c = this, e = c.chart.startDuration; 0 < e && !c.animationPlayed && (c.seqAn ? (a.set.hide(), c.animationArray.push(a), e = setTimeout(function () { c.animate.call(c) }, e / (c.end - c.start + 1) * (b - c.start) * 1E3), c.timeOuts.push(e)) : c.animate(a)) }, createLabel: function (a, b, c, e, h) { var f = this.chart, g = a.labelColor; g || (g = this.color); g || (g = f.color); h && (g = h); h = this.fontSize; void 0 === h && (this.fontSize = h = f.fontSize); var k = this.labelFunction; e = f.formatString(e, a); e = d.cleanFromEmpty(e); k && (e = k(a, e)); a = d.text(this.container, e, g, f.fontFamily, h); a.node.style.pointerEvents = "none"; a.translate(b, c); this.bulletSet.push(a); return a }, positiveClip: function (a) { a.clipRect(this.pmx, this.pmy, this.pmw, this.pmh) }, negativeClip: function (a) { a.clipRect(this.nmx, this.nmy, this.nmw, this.nmh) }, drawLineGraph: function (a, b, c, e) { var h = this; if (1 < a.length) { var f = h.set, g = h.chart, k = h.container, l = k.set(), m = k.set(); f.push(m); f.push(l); var n = h.lineAlpha, q = h.lineThickness, f = h.fillAlphas, p = h.lineColorR, r = h.negativeLineAlpha; isNaN(r) && (r = n); var t = h.lineColorSwitched; t && (p = t); var t = h.fillColorsR, u = h.fillColorsSwitched; u && (t = u); var z = h.dashLength; (u = h.dashLengthSwitched) && (z = u); var u = h.negativeLineColor, w = h.negativeFillColors, x = h.negativeFillAlphas, v = h.baseCoord; 0 !== h.negativeBase && (v = h.valueAxis.getCoordinate(h.negativeBase), v > h.height && (v = h.height), 0 > v && (v = 0)); n = d.line(k, a, b, p, n, q, z, !1, !0); d.setCN(g, n, h.bcn + "stroke"); l.push(n); l.click(function (a) { h.handleGraphEvent(a, "clickGraph") }).mouseover(function (a) { h.handleGraphEvent(a, "rollOverGraph") }).mouseout(function (a) { h.handleGraphEvent(a, "rollOutGraph") }); void 0 === u || h.useNegativeColorIfDown || (q = d.line(k, a, b, u, r, q, z, !1, !0), d.setCN(g, q, h.bcn + "stroke"), d.setCN(g, q, h.bcn + "stroke-negative"), m.push(q)); if (0 < f || 0 < x) if (q = a.join(";").split(";"), r = b.join(";").split(";"), n = g.type, "serial" == n ? 0 < c.length ? (c.reverse(), e.reverse(), q = a.concat(c), r = b.concat(e)) : h.rotate ? (r.push(r[r.length - 1]), q.push(v), r.push(r[0]), q.push(v), r.push(r[0]), q.push(q[0])) : (q.push(q[q.length - 1]), r.push(v), q.push(q[0]), r.push(v), q.push(a[0]), r.push(r[0])) : "xy" == n && (b = h.fillToAxis) && (d.isString(b) && (b = g.getValueAxisById(b)), "H" == b.orientation ? (v = "top" == b.position ? 0 : b.viH, q.push(q[q.length - 1]), r.push(v), q.push(q[0]), r.push(v), q.push(a[0]), r.push(r[0])) : (v = "left" == b.position ? 0 : b.viW, r.push(r[r.length - 1]), q.push(v), r.push(r[0]), q.push(v), r.push(r[0]), q.push(q[0]))), a = h.gradientRotation, 0 < f && (b = d.polygon(k, q, r, t, f, 1, "#000", 0, a), b.pattern(h.pattern, NaN, g.path), d.setCN(g, b, h.bcn + "fill"), l.push(b)), w || void 0 !== u) isNaN(x) && (x = f), w || (w = u), k = d.polygon(k, q, r, w, x, 1, "#000", 0, a), d.setCN(g, k, h.bcn + "fill"), d.setCN(g, k, h.bcn + "fill-negative"), k.pattern(h.pattern, NaN, g.path), m.push(k), m.click(function (a) { h.handleGraphEvent(a, "clickGraph") }).mouseover(function (a) { h.handleGraphEvent(a, "rollOverGraph") }).mouseout(function (a) { h.handleGraphEvent(a, "rollOutGraph") }); h.applyMask(m, l) } }, applyMask: function (a, b) { var c = a.length(); "serial" != this.chart.type || this.scrollbar || (this.positiveClip(b), 0 < c && this.negativeClip(a)) }, drawSmoothedGraph: function (a, b, c, e) { if (1 < a.length) { var h = this.set, f = this.chart, g = this.container, k = g.set(), l = g.set(); h.push(l); h.push(k); var m = this.lineAlpha, n = this.lineThickness, h = this.dashLength, q = this.fillAlphas, p = this.lineColorR, r = this.fillColorsR, t = this.negativeLineColor, u = this.negativeFillColors, z = this.negativeFillAlphas, w = this.baseCoord, x = this.lineColorSwitched; x && (p = x); (x = this.fillColorsSwitched) && (r = x); x = this.negativeLineAlpha; isNaN(x) && (x = m); m = new d.Bezier(g, a, b, p, m, n, r, 0, h); d.setCN(f, m, this.bcn + "stroke"); k.push(m.path); void 0 !== t && (n = new d.Bezier(g, a, b, t, x, n, r, 0, h), d.setCN(f, n, this.bcn + "stroke"), d.setCN(f, n, this.bcn + "stroke-negative"), l.push(n.path)); 0 < q && (m = a.join(";").split(";"), p = b.join(";").split(";"), n = "", 0 < c.length ? (c.push("M"), e.push("M"), c.reverse(), e.reverse(), m = a.concat(c), p = b.concat(e)) : (this.rotate ? (n += " L" + w + "," + b[b.length - 1], n += " L" + w + "," + b[0]) : (n += " L" + a[a.length - 1] + "," + w, n += " L" + a[0] + "," + w), n += " L" + a[0] + "," + b[0]), c = new d.Bezier(g, m, p, NaN, 0, 0, r, q, h, n), d.setCN(f, c, this.bcn + "fill"), c.path.pattern(this.pattern, NaN, f.path), k.push(c.path), u || void 0 !== t) && (z || (z = q), u || (u = t), a = new d.Bezier(g, a, b, NaN, 0, 0, u, z, h, n), a.path.pattern(this.pattern, NaN, f.path), d.setCN(f, a, this.bcn + "fill"), d.setCN(f, a, this.bcn + "fill-negative"), l.push(a.path)); this.applyMask(l, k) } }, launchAnimation: function () { var a = this, b = a.chart.startDuration; if (0 < b && !a.animationPlayed) { var c = a.set, e = a.bulletSet; d.VML || (c.attr({ opacity: a.startAlpha }), e.attr({ opacity: a.startAlpha })); c.hide(); e.hide(); a.seqAn ? (b = setTimeout(function () { a.animateGraphs.call(a) }, a.index * b * 1E3), a.timeOuts.push(b)) : a.animateGraphs() } }, animateGraphs: function () { var a = this.chart, b = this.set, c = this.bulletSet, e = this.x, d = this.y; b.show(); c.show(); var f = a.startDuration, a = a.startEffect; b && (this.rotate ? (b.translate(-1E3, d), c.translate(-1E3, d)) : (b.translate(e, -1E3), c.translate(e, -1E3)), b.animate({ opacity: 1, translate: e + "," + d }, f, a), c.animate({ opacity: 1, translate: e + "," + d }, f, a)) }, animate: function (a) { var b = this.chart, c = this.animationArray; !a && 0 < c.length && (a = c[0], c.shift()); c = d[d.getEffect(b.startEffect)]; b = b.startDuration; a && (this.rotate ? a.animateWidth(b, c) : a.animateHeight(b, c), a.set.show()) }, legendKeyColor: function () { var a = this.legendColor, b = this.lineAlpha; void 0 === a && (a = this.lineColorR, 0 === b && (b = this.fillColorsR) && (a = "object" == typeof b ? b[0] : b)); return a }, legendKeyAlpha: function () { var a = this.legendAlpha; void 0 === a && (a = this.lineAlpha, this.fillAlphas > a && (a = this.fillAlphas), 0 === a && (a = this.bulletAlpha), 0 === a && (a = 1)); return a }, createBullet: function (a, b, c) { if (!isNaN(b) && !isNaN(c)) { var e = this.chart, h = this.container, f = this.bulletOffset, g = this.bulletSize; isNaN(a.bulletSize) || (g = a.bulletSize); var k = a.values.value, l = this.maxValue, m = this.minValue, n = this.maxBulletSize, q = this.minBulletSize; isNaN(l) || (isNaN(k) || (g = (k - m) / (l - m) * (n - q) + q), m == l && (g = n)); l = g; this.bulletAxis && (g = a.values.error, isNaN(g) || (k = g), g = this.bulletAxis.stepWidth * k); g < this.minBulletSize && (g = this.minBulletSize); this.rotate ? b = a.isNegative ? b - f : b + f : c = a.isNegative ? c + f : c - f; var p, q = this.bulletColorR; a.lineColor && (this.bulletColorSwitched = a.lineColor); this.bulletColorSwitched && (q = this.bulletColorSwitched); a.isNegative && void 0 !== this.bulletColorNegative && (q = this.bulletColorNegative); void 0 !== a.color && (q = a.color); var r; "xy" == e.type && this.valueField && (r = this.pattern, a.pattern && (r = a.pattern)); f = this.bullet; a.bullet && (f = a.bullet); var k = this.bulletBorderThickness, m = this.bulletBorderColorR, n = this.bulletBorderAlpha, t = this.bulletAlpha; m || (m = q); this.useLineColorForBulletBorder && (m = this.lineColorR); var u = a.alpha; isNaN(u) || (t = u); if ("none" != this.bullet || a.bullet) p = d.bullet(h, f, g, q, t, k, m, n, l, 0, r, e.path); if (this.customBullet || a.customBullet) r = this.customBullet, a.customBullet && (r = a.customBullet), r && (p && p.remove(), "function" == typeof r ? (p = new r, p.chart = e, a.bulletConfig && (p.availableSpace = c, p.graph = this, p.graphDataItem = a, p.bulletY = c, a.bulletConfig.minCoord = this.minCoord - c, p.bulletConfig = a.bulletConfig), p.write(h), p = p.set) : (p = h.set(), h = h.image(r, 0, 0, g, g), p.push(h), this.centerCustomBullets && h.translate(-g / 2, -g / 2))); if (p) { (a.url || this.showHandOnHover) && p.setAttr("cursor", "pointer"); if ("serial" == e.type || "gantt" == e.type) if (-.5 > b - 0 || b - 0 > this.width || c < -g / 2 || c - 0 > this.height) p.remove(), p = null; p && (this.bulletSet.push(p), p.translate(b, c), this.addListeners(p, a), this.allBullets.push(p)); a.bx = b; a.by = c; d.setCN(e, p, this.bcn + "bullet"); a.className && d.setCN(e, p, a.className, !0) } p ? (p.size = g || 0, a.bulletGraphics = p) : p = { size: 0 }; p.graphDataItem = a; return p } }, showBullets: function () { var a = this.allBullets, b; this.bulletsHidden = !1; for (b = 0; b < a.length; b++) a[b].show() }, hideBullets: function () { var a = this.allBullets, b; this.bulletsHidden = !0; for (b = 0; b < a.length; b++) a[b].hide() }, showCustomBullets: function () { var a = this.allBullets, b; this.customBulletsHidden = !1; for (b = 0; b < a.length; b++) a[b].graphDataItem.customBullet && a[b].show() }, hideCustomBullets: function () { var a = this.allBullets, b; this.customBulletsHidden = !0; for (b = 0; b < a.length; b++) a[b].graphDataItem.customBullet && a[b].hide() }, addListeners: function (a, b) { var c = this; a.mouseover(function (a) { c.handleRollOver(b, a) }).mouseout(function (a) { c.handleRollOut(b, a) }).touchend(function (a) { c.handleRollOver(b, a); c.chart.panEventsEnabled && c.handleClick(b, a) }).touchstart(function (a) { c.handleRollOver(b, a) }).click(function (a) { c.handleClick(b, a) }).dblclick(function (a) { c.handleDoubleClick(b, a) }).contextmenu(function (a) { c.handleRightClick(b, a) }) }, handleRollOver: function (a, b) { if (a) { var c = this.chart, e = { type: "rollOverGraphItem", item: a, index: a.index, graph: this, target: this, chart: this.chart, event: b }; this.fire("rollOverGraphItem", e); c.fire("rollOverGraphItem", e); clearTimeout(c.hoverInt); e = this.showBalloon; !c.chartCursor || "serial" != c.type && "gantt" != c.type || (e = !1, !c.chartCursor.valueBalloonsEnabled && this.showBalloon && (e = !0)); if (e) { var e = c.formatString(this.balloonText, a, !0), h = this.balloonFunction; h && (e = h(a, a.graph)); e = d.cleanFromEmpty(e); h = c.getBalloonColor(this, a); c.balloon.showBullet = !1; c.balloon.pointerOrientation = "V"; var f = a.x, g = a.y; c.rotate && (f = a.y, g = a.x); "" !== e ? c.showBalloon(e, h, !0, f + c.marginLeftReal, g + c.marginTopReal) : this.chart.hideBalloonReal() } else this.chart.hideBalloonReal() } this.handleGraphEvent(b, "rollOverGraph") }, handleRollOut: function (a, b) { this.chart.hideBalloon(); if (a) { var c = { type: "rollOutGraphItem", item: a, index: a.index, graph: this, target: this, chart: this.chart, event: b }; this.fire("rollOutGraphItem", c); this.chart.fire("rollOutGraphItem", c) } this.handleGraphEvent(b, "rollOutGraph") }, handleClick: function (a, b) { if (a) { var c = { type: "clickGraphItem", item: a, index: a.index, graph: this, target: this, chart: this.chart, event: b }; this.fire("clickGraphItem", c); this.chart.fire("clickGraphItem", c); d.getURL(a.url, this.urlTarget) } this.handleGraphEvent(b, "clickGraph") }, handleGraphEvent: function (a, b) { var c = { type: b, graph: this, target: this, chart: this.chart, event: a }; this.fire(b, c); this.chart.fire(b, c) }, handleRightClick: function (a, b) { if (a) { var c = { type: "rightClickGraphItem", item: a, index: a.index, graph: this, target: this, chart: this.chart, event: b }; this.fire("rightClickGraphItem", c); this.chart.fire("rightClickGraphItem", c) } }, handleDoubleClick: function (a, b) { if (a) { var c = { type: "doubleClickGraphItem", item: a, index: a.index, graph: this, target: this, chart: this.chart, event: b }; this.fire("doubleClickGraphItem", c); this.chart.fire("doubleClickGraphItem", c) } }, zoom: function (a, b) { this.start = a; this.end = b; this.draw() }, changeOpacity: function (a) { var b = this.set; b && b.setAttr("opacity", a); if (b = this.ownColumns) { var c; for (c = 0; c < b.length; c++) { var e = b[c].set; e && e.setAttr("opacity", a) } }(b = this.bulletSet) && b.setAttr("opacity", a) }, destroy: function () { d.remove(this.set); d.remove(this.bulletSet); var a = this.timeOuts; if (a) { var b; for (b = 0; b < a.length; b++) clearTimeout(a[b]) } this.timeOuts = [] } }) })(); (function () { var d = window.AmCharts; d.ChartCursor = d.Class({ construct: function (a) { this.cname = "ChartCursor"; this.createEvents("changed", "zoomed", "onHideCursor", "draw", "selected", "moved"); this.enabled = !0; this.cursorAlpha = 1; this.selectionAlpha = .2; this.cursorColor = "#CC0000"; this.categoryBalloonAlpha = 1; this.color = "#FFFFFF"; this.type = "cursor"; this.zoomed = !1; this.zoomable = !0; this.pan = !1; this.categoryBalloonDateFormat = "MMM DD, YYYY"; this.categoryBalloonEnabled = this.valueBalloonsEnabled = !0; this.rolledOver = !1; this.cursorPosition = "middle"; this.bulletsEnabled = this.skipZoomDispatch = !1; this.bulletSize = 8; this.selectWithoutZooming = this.oneBalloonOnly = !1; this.graphBulletSize = 1.7; this.animationDuration = .3; this.zooming = !1; this.adjustment = 0; this.avoidBalloonOverlapping = !0; this.leaveCursor = !1; d.applyTheme(this, a, this.cname) }, draw: function () { this.destroy(); var a = this.chart, b = a.container; this.rotate = a.rotate; this.container = b; b = b.set(); b.translate(this.x, this.y); this.set = b; a.cursorSet.push(b); b = new d.AmBalloon; b.className = "category"; b.chart = a; this.categoryBalloon = b; d.copyProperties(a.balloon, b); b.cornerRadius = 0; b.shadowAlpha = 0; b.borderThickness = 1; b.borderAlpha = 1; b.showBullet = !1; var c = this.categoryBalloonColor; void 0 === c && (c = this.cursorColor); b.fillColor = c; b.balloonColor = c; b.fillAlpha = this.categoryBalloonAlpha; b.borderColor = c; b.color = this.color; c = this.valueLineAxis; d.isString(c) && (c = a.getValueAxisById(c)); c || (c = a.valueAxes[0]); this.valueLineAxis = c; this.valueLineBalloonEnabled && (this.vaBalloon = c = new d.AmBalloon, d.copyProperties(b, c), c.animationDuration = 0, this.rotate || (c.pointerOrientation = "H")); this.rotate && (b.pointerOrientation = "H"); this.extraWidth = 0; this.prevX = []; this.prevY = []; this.prevTX = []; this.prevTY = []; if (this.valueBalloonsEnabled) for (b = 0; b < a.graphs.length; b++) c = new d.AmBalloon, c.className = a.graphs[b].id, c.chart = a, d.copyProperties(a.balloon, c), a.graphs[b].valueBalloon = c; "cursor" == this.type ? this.createCursor() : this.createCrosshair() }, updateData: function () { var a = this.chart; this.data = a.chartData; this.firstTime = a.firstTime; this.lastTime = a.lastTime }, createCursor: function () { var a = this.chart, b = this.cursorAlpha, c = a.categoryAxis, e = this.categoryBalloon, h, f, g, k; g = a.dx; k = a.dy; var l = this.width, m = this.height, n = a.rotate; e.pointerWidth = c.tickLength; n ? (h = [0, l, l + g], f = [0, 0, k], g = [g, 0, 0], k = [k, 0, m]) : (h = [g, 0, 0], f = [k, 0, m], g = [0, l, l + g], k = [0, 0, k]); h = d.line(this.container, h, f, this.cursorColor, b, 1); d.setCN(a, h, "cursor-line"); this.line = h; h.node.style.pointerEvents = "none"; (f = this.fullRectSet) ? (f.push(h), f.translate(this.x, this.y)) : this.set.push(h); this.valueLineEnabled && (h = this.valueLineAlpha, isNaN(h) || (b = h), b = d.line(this.container, g, k, this.cursorColor, b, 1), b.node.style.pointerEvents = "none", d.setCN(a, b, "cursor-value-line"), this.vLine = b, this.set.push(b)); this.setBalloonBounds(e, c, n); (a = this.vaBalloon) && this.setBalloonBounds(a, this.valueLineAxis, !n); this.hideCursor() }, createCrosshair: function () { var a = this.cursorAlpha, b = this.container, c = d.line(b, [0, 0], [0, this.height], this.cursorColor, a, 1), a = d.line(b, [0, this.width], [0, 0], this.cursorColor, a, 1); d.setCN(this.chart, c, "cursor-line"); d.setCN(this.chart, a, "cursor-line"); this.set.push(c); this.set.push(a); this.vLine = c; this.hLine = a; this.hideCursor() }, update: function () { var a = this.chart; if (a.mouseIsOver) { var b = a.mouseX - this.x, c = a.mouseY - this.y; - .5 < b && b < this.width + 1 && 0 < c && c < this.height ? (this.drawing ? this.rolledOver || a.setMouseCursor("crosshair") : this.pan && (this.rolledOver || a.setMouseCursor("move")), this.rolledOver = !0, (this.valueLineEnabled || this.valueLineBalloonEnabled) && this.updateVLine(b, c), this.setPosition()) : this.rolledOver && (this.handleMouseOut(), this.rolledOver = !1) } else this.rolledOver && (this.handleMouseOut(), this.rolledOver = !1) }, updateVLine: function (a, b) { var c = this.vLine, e = this.vaBalloon; if ((c || e) && !this.panning && !this.drawing) { c && c.show(); var d = this.valueLineAxis, f, g = this.rotate; g ? (c && c.translate(a, 0), d && (f = d.coordinateToValue(a)), c = a) : (c && c.translate(0, b), d && (f = d.coordinateToValue(b)), c = b - 1); if (e && !isNaN(f) && this.prevLineValue != f) { var k = d.formatValue(f, !0); this.setBalloonPosition(e, d, c, !g); e.showBalloon(k) } this.prevLineValue = f } }, getMousePosition: function () { var a, b = this.width, c = this.height; a = this.chart; this.rotate ? (a = a.mouseY - this.y, 0 > a && (a = 0), a > c && (a = c)) : (a = a.mouseX - this.x - 1, 0 > a && (a = 0), a > b && (a = b)); return a }, updateCrosshair: function () { var a = this.chart, b = a.mouseX - this.x, c = a.mouseY - this.y, e = this.vLine, h = this.hLine, b = d.fitToBounds(b, 0, this.width), c = d.fitToBounds(c, 0, this.height); 0 < this.cursorAlpha && (e.show(), h.show(), e.translate(b, 0), h.translate(0, c)); this.zooming && (a.hideXScrollbar && (b = NaN), a.hideYScrollbar && (c = NaN), this.updateSelectionSize(b, c)); this.fireMoved(); a.mouseIsOver || this.zooming || this.hideCursor() }, fireMoved: function () { var a = this.chart, b = { type: "moved", target: this }; b.chart = a; b.zooming = this.zooming; b.x = a.mouseX - this.x; b.y = a.mouseY - this.y; this.fire("moved", b) }, updateSelectionSize: function (a, b) { d.remove(this.selection); var c = this.selectionPosX, e = this.selectionPosY, h = 0, f = 0, g = this.width, k = this.height; isNaN(a) || (c > a && (h = a, g = c - a), c < a && (h = c, g = a - c), c == a && (h = a, g = 0), g += this.extraWidth, h -= this.extraWidth / 2); isNaN(b) || (e > b && (f = b, k = e - b), e < b && (f = e, k = b - e), e == b && (f = b, k = 0), k += this.extraWidth, f -= this.extraWidth / 2); 0 < g && 0 < k && (c = d.rect(this.container, g, k, this.cursorColor, this.selectionAlpha), d.setCN(this.chart, c, "cursor-selection"), c.translate(h + this.x, f + this.y), this.selection = c) }, arrangeBalloons: function () { var a = this.valueBalloons, b = this.x, c = this.y, e = this.height + c; a.sort(this.compareY); var d; for (d = 0; d < a.length; d++) { var f = a[d].balloon; f.setBounds(b, c, b + this.width, e); f.prevX = this.prevX[d]; f.prevY = this.prevY[d]; f.prevTX = this.prevTX[d]; f.prevTY = this.prevTY[d]; f.draw(); e = f.yPos - 3 } this.arrangeBalloons2() }, compareY: function (a, b) { return a.yy < b.yy ? 1 : -1 }, arrangeBalloons2: function () { var a = this.valueBalloons; a.reverse(); var b, c = this.x, e, d, f = a.length; for (d = 0; d < f; d++) { var g = a[d].balloon; b = g.bottom; var k = g.bottom - g.yPos, l = f - d - 1; 0 < d && b - k < e + 3 && (g.setBounds(c, e + 3, c + this.width, e + k + 3), g.prevX = this.prevX[l], g.prevY = this.prevY[l], g.prevTX = this.prevTX[l], g.prevTY = this.prevTY[l], g.draw()); g.set && g.set.show(); this.prevX[l] = g.prevX; this.prevY[l] = g.prevY; this.prevTX[l] = g.prevTX; this.prevTY[l] = g.prevTY; e = g.bottom } }, showBullets: function () { d.remove(this.allBullets); var a = this.container, b = a.set(); this.set.push(b); this.set.show(); this.allBullets = b; var b = this.chart.graphs, c; for (c = 0; c < b.length; c++) { var e = b[c]; if (!e.hidden && e.balloonText) { var h = this.data[this.index].axes[e.valueAxis.id].graphs[e.id], f = h.y; if (!isNaN(f)) { var g, k; g = h.x; this.rotate ? (k = f, f = g) : k = g; e = d.circle(a, this.bulletSize / 2, this.chart.getBalloonColor(e, h, !0), e.cursorBulletAlpha); e.translate(k, f); this.allBullets.push(e) } } } }, destroy: function () { this.clear(); d.remove(this.selection); this.selection = null; var a = this.categoryBalloon; a && a.destroy(); (a = this.vaBalloon) && a.destroy(); this.destroyValueBalloons(); d.remove(this.set) }, clear: function () {}, destroyValueBalloons: function () { var a = this.valueBalloons; if (a) { var b; for (b = 0; b < a.length; b++) a[b].balloon.hide() } }, zoom: function (a, b, c, e) { var h = this.chart; this.destroyValueBalloons(); this.zooming = !1; var f; this.rotate ? this.selectionPosY = f = h.mouseY : this.selectionPosX = f = h.mouseX; this.start = a; this.end = b; this.startTime = c; this.endTime = e; this.zoomed = !0; e = h.categoryAxis; f = this.rotate; b = this.width; c = this.height; a = e.stepWidth; if (this.fullWidth) { var g = 1; e.parseDates && !e.equalSpacing && (g = e.minDuration()); f ? this.extraWidth = c = a * g : (this.extraWidth = b = a * g, this.categoryBalloon.minWidth = b); this.line && this.line.remove(); this.line = d.rect(this.container, b, c, this.cursorColor, this.cursorAlpha, 0); this.line.node.style.pointerEvents = "none"; d.setCN(h, this.line, "cursor-fill"); this.fullRectSet && this.fullRectSet.push(this.line) } this.stepWidth = a; this.tempVal = this.valueBalloonsEnabled; this.valueBalloonsEnabled = !1; this.setPosition(); this.valueBalloonsEnabled = this.tempVal; this.hideCursor() }, hideObj: function (a) { a && a.hide() }, hideCursor: function (a) { void 0 === a && (a = !0); this.leaveCursor || (this.hideObj(this.set), this.hideObj(this.categoryBalloon), this.hideObj(this.line), this.hideObj(this.vLine), this.hideObj(this.hLine), this.hideObj(this.vaBalloon), this.hideObj(this.allBullets), this.destroyValueBalloons(), this.selectWithoutZooming || d.remove(this.selection), this.previousIndex = NaN, a && this.fire("onHideCursor", { type: "onHideCursor", chart: this.chart, target: this }), this.drawing || this.chart.setMouseCursor("auto"), this.normalizeBulletSize()) }, setPosition: function (a, b, c) { void 0 === b && (b = !0); if ("cursor" == this.type) { if (this.tempPosition = NaN, d.ifArray(this.data)) isNaN(a) && (a = this.getMousePosition()), (a != this.previousMousePosition || !0 === this.zoomed || this.oneBalloonOnly) && !isNaN(a) && ("mouse" == this.cursorPosition && (this.tempPosition = a), isNaN(c) && (c = this.chart.categoryAxis.xToIndex(a)), c != this.previousIndex || this.zoomed || "mouse" == this.cursorPosition || this.oneBalloonOnly) && (this.updateCursor(c, b), this.zoomed = !1), this.previousMousePosition = a } else this.updateCrosshair() }, normalizeBulletSize: function () { var a = this.resizedBullets; if (a) for (var b = 0; b < a.length; b++) { var c = a[b], e = c.bulletGraphics; e && (e.translate(c.bx, c.by, 1), c = c.graph, isNaN(this.graphBulletAlpha) || (e.setAttr("fill-opacity", c.bulletAlpha), e.setAttr("stroke-opacity", c.bulletBorderAlpha))) } }, updateCursor: function (a, b) { var c = this.chart, e = this.fullWidth, h = c.mouseX - this.x, f = c.mouseY - this.y; this.drawingNow && (d.remove(this.drawingLine), this.drawingLine = d.line(this.container, [this.x + this.drawStartX, this.x + h], [this.y + this.drawStartY, this.y + f], this.cursorColor, 1, 1)); if (this.enabled) { void 0 === b && (b = !0); this.index = a += this.adjustment; var g = c.categoryAxis, k = c.dx, l = c.dy, m = this.x + 1, n = this.y + 1, q = this.width, p = this.height, r = this.data[a]; this.fireMoved(); if (r) { var t = r.x[g.id], u = c.rotate, z = this.stepWidth, w = this.categoryBalloon, x = this.firstTime, v = this.lastTime, A = this.cursorPosition, B = this.zooming, D = this.panning, C = c.graphs; if (c.mouseIsOver || B || D || this.forceShow) if (this.forceShow = !1, D) { var k = this.panClickPos, c = this.panClickEndTime, B = this.panClickStartTime, I = this.panClickEnd, m = this.panClickStart, h = (u ? k - f : k - h) / z; if (!g.parseDates || g.equalSpacing) h = Math.round(h); 0 !== h && (k = { type: "zoomed", target: this }, k.chart = this.chart, g.parseDates && !g.equalSpacing ? (c + h > v && (h = v - c), B + h < x && (h = x - B), k.start = Math.round(B + h), k.end = Math.round(c + h), this.fire(k.type, k)) : I + h >= this.data.length || 0 > m + h || (k.start = m + h, k.end = I + h, this.fire(k.type, k))) } else { "start" == A ? t -= g.cellWidth / 2 : "mouse" == A && (c.mouseIsOver ? t = u ? f - 2 : h - 2 : isNaN(this.tempPosition) || (t = this.tempPosition - 2)); if (u) { if (0 > t) if (B) t = 0; else { this.hideCursor(); return } if (t > p + 1) if (B) t = p + 1; else { this.hideCursor(); return } } else { if (0 > t) if (B) t = 0; else { this.hideCursor(); return } if (t > q) if (B) t = q; else { this.hideCursor(); return } } x = this.line; 0 < this.cursorAlpha && (u ? (v = 0, z = t + l, e && (z -= g.cellWidth / 2)) : (v = t, z = 0, e && (v -= g.cellWidth / 2)), A = this.animationDuration, 0 < A && !this.zooming ? isNaN(this.previousX) ? x.translate(v, z) : (x.translate(this.previousX, this.previousY), x.animate({ translate: v + "," + z }, A, "easeOutSine")) : x.translate(v, z), this.previousX = v, this.previousY = z, x.show()); this.linePos = u ? t + l : t; B && (e && x.hide(), u ? this.updateSelectionSize(NaN, t) : this.updateSelectionSize(t, NaN)); z = !0; B && (z = !1); this.categoryBalloonEnabled && z ? (this.setBalloonPosition(w, g, t, u), (x = this.categoryBalloonFunction) ? w.showBalloon(x(r.category)) : g.parseDates ? (g = d.formatDate(r.category, this.categoryBalloonDateFormat, c), -1 != g.indexOf("fff") && (g = d.formatMilliseconds(g, r.category)), w.showBalloon(g)) : w.showBalloon(d.fixNewLines(r.category))) : w.hide(); C && this.bulletsEnabled && this.showBullets(); if (this.oneBalloonOnly) { t = Infinity; for (g = 0; g < C.length; g++) w = C[g], w.showBalloon && !w.hidden && w.balloonText && (x = r.axes[w.valueAxis.id].graphs[w.id], v = x.y, isNaN(v) || (u ? Math.abs(h - v) < t && (t = Math.abs(h - v), I = w) : Math.abs(f - v) < t && (t = Math.abs(f - v), I = w))); this.mostCloseGraph && (I = this.mostCloseGraph) } if (a != this.previousIndex || I != this.previousMostCloseGraph) if (this.normalizeBulletSize(), this.destroyValueBalloons(), this.resizedBullets = [], C && this.valueBalloonsEnabled && z && c.balloon.enabled) { this.valueBalloons = t = []; for (g = 0; g < C.length; g++) if (w = C[g], v = NaN, (!this.oneBalloonOnly || w == I) && w.showBalloon && !w.hidden && w.balloonText && ("step" == w.type && "left" == w.stepDirection && (r = this.data[a + 1]), r)) { if (x = r.axes[w.valueAxis.id].graphs[w.id]) v = x.y; if (this.showNextAvailable && isNaN(v) && a + 1 < this.data.length) for (z = a + 1; z < this.data.length; z++) if (e = this.data[z]) if (x = e.axes[w.valueAxis.id].graphs[w.id], v = x.y, !isNaN(v)) break; if (!isNaN(v)) { e = x.x; l = !0; if (u) { if (z = v, 0 > e || e > p) l = !1 } else if (z = e, e = v, 0 > z || z > q + k + 1) l = !1; l && (l = this.graphBulletSize, A = this.graphBulletAlpha, 1 == l && isNaN(A) || !d.isModern || !(D = x.bulletGraphics) || (D.translate(x.bx, x.by, l), this.resizedBullets.push(x), isNaN(A) || (D.setAttr("fill-opacity", A), D.setAttr("stroke-opacity", A))), l = w.valueBalloon, A = c.getBalloonColor(w, x), l.setBounds(m, n, m + q, n + p), l.pointerOrientation = "H", D = this.balloonPointerOrientation, "vertical" == D && (l.pointerOrientation = "V"), "horizontal" == D && (l.pointerOrientation = "H"), l.changeColor(A), void 0 !== w.balloonAlpha && (l.fillAlpha = w.balloonAlpha), void 0 !== w.balloonTextColor && (l.color = w.balloonTextColor), l.setPosition(z + m, e + n), z = c.formatString(w.balloonText, x, !0), (e = w.balloonFunction) && (z = e(x, w).toString()), "" !== z && (u ? l.showBalloon(z) : (l.text = z, l.show = !0), t.push({ yy: v, balloon: l })), !u && l.set && (l.set.hide(), w = l.textDiv) && (w.style.visibility = "hidden")) } } this.avoidBalloonOverlapping && this.arrangeBalloons() } b ? (k = { type: "changed" }, k.index = a, k.chart = this.chart, k.zooming = B, k.mostCloseGraph = I, k.position = u ? f : h, k.target = this, c.fire("changed", k), this.fire("changed", k), this.skipZoomDispatch = !1) : (this.skipZoomDispatch = !0, c.updateLegendValues(a)); this.previousIndex = a; this.previousMostCloseGraph = I } } } else this.hideCursor() }, setBalloonPosition: function (a, b, c, e) { var d = b.position, f = b.inside; b = b.axisThickness; var g = this.chart, k = g.dx, g = g.dy, l = this.x, m = this.y, n = this.width, q = this.height; e ? (f && ("right" == d ? a.setBounds(l, m + g, l + n + k, m + c + g) : a.setBounds(l, m + g, l + n + k, m + c)), "right" == d ? f ? a.setPosition(l + n + k, m + c + g) : a.setPosition(l + n + k + b, m + c + g) : f ? a.setPosition(l, m + c) : a.setPosition(l - b, m + c)) : "top" == d ? f ? a.setPosition(l + c + k, m + g) : a.setPosition(l + c + k, m + g - b + 1) : f ? a.setPosition(l + c, m + q) : a.setPosition(l + c, m + q + b - 1) }, setBalloonBounds: function (a, b, c) { var e = b.position, d = b.inside, f = b.axisThickness, g = b.tickLength, k = this.chart, l = k.dx, k = k.dy, m = this.x, n = this.y, q = this.width, p = this.height; c ? (d && (a.pointerWidth = 0), "right" == e ? d ? a.setBounds(m, n + k, m + q + l, n + p + k) : a.setBounds(m + q + l + f, n + k, m + q + 1E3, n + p + k) : d ? a.setBounds(m, n, q + m, p + n) : a.setBounds(-1E3, -1E3, m - g - f, n + p + 15)) : (a.maxWidth = q, b.parseDates && (g = 0, a.pointerWidth = 0), "top" == e ? d ? a.setBounds(m + l, n + k, q + l + m, p + n) : a.setBounds(m + l, -1E3, q + l + m, n + k - g - f) : d ? a.setBounds(m, n, q + m, p + n - g) : a.setBounds(m, n + p + g + f - 1, m + q, n + p + g + f)) }, enableDrawing: function (a) { this.enabled = !a; this.hideCursor(); this.rolledOver = !1; this.drawing = a }, isZooming: function (a) { a && a != this.zooming && this.handleMouseDown("fake"); a || a == this.zooming || this.handleMouseUp() }, handleMouseOut: function () { if (this.enabled) if (this.zooming) this.setPosition(); else { this.index = void 0; var a = { type: "changed", index: void 0, target: this }; a.chart = this.chart; this.fire("changed", a); this.hideCursor() } }, handleReleaseOutside: function () { this.handleMouseUp() }, handleMouseUp: function () { var a = this.chart, b = this.data, c; if (a) { var e = a.mouseX - this.x, h = a.mouseY - this.y; if (this.drawingNow) { this.drawingNow = !1; d.remove(this.drawingLine); c = this.drawStartX; var f = this.drawStartY; if (2 < Math.abs(c - e) || 2 < Math.abs(f - h)) c = { type: "draw", target: this, chart: a, initialX: c, initialY: f, finalX: e, finalY: h }, this.fire(c.type, c) } if (this.enabled && 0 < b.length) { if (this.pan) this.rolledOver = !1; else if (this.zoomable && this.zooming) { c = this.selectWithoutZooming ? { type: "selected" } : { type: "zoomed" }; c.target = this; c.chart = a; if ("cursor" == this.type) this.rotate ? this.selectionPosY = h : this.selectionPosX = h = e, 4 > Math.abs(h - this.initialMouse) && this.fromIndex == this.index || (this.index < this.fromIndex ? (c.end = this.fromIndex, c.start = this.index) : (c.end = this.index, c.start = this.fromIndex), h = a.categoryAxis, h.parseDates && !h.equalSpacing && (b[c.start] && (c.start = b[c.start].time), b[c.end] && (c.end = a.getEndTime(b[c.end].time))), this.skipZoomDispatch || this.fire(c.type, c)); else { var g = this.initialMouseX, k = this.initialMouseY; 3 > Math.abs(e - g) && 3 > Math.abs(h - k) || (b = Math.min(g, e), f = Math.min(k, h), e = Math.abs(g - e), h = Math.abs(k - h), a.hideXScrollbar && (b = 0, e = this.width), a.hideYScrollbar && (f = 0, h = this.height), c.selectionHeight = h, c.selectionWidth = e, c.selectionY = f, c.selectionX = b, this.skipZoomDispatch || this.fire(c.type, c)) } this.selectWithoutZooming || d.remove(this.selection) } this.skipZoomDispatch = !1 } } this.panning = this.zooming = !1 }, showCursorAt: function (a) { var b = this.chart.categoryAxis; a = b.parseDates ? b.dateToCoordinate(a) : b.categoryToCoordinate(a); this.previousMousePosition = NaN; this.forceShow = !0; this.setPosition(a, !1) }, clearSelection: function () { d.remove(this.selection) }, handleMouseDown: function (a) { if (this.zoomable || this.pan || this.drawing) { var b = this.rotate, c = this.chart, e = c.mouseX - this.x, h = c.mouseY - this.y; if (0 < e && e < this.width && 0 < h && h < this.height || "fake" == a) this.setPosition(), this.selectWithoutZooming && d.remove(this.selection), this.drawing ? (this.drawStartY = h, this.drawStartX = e, this.drawingNow = !0) : this.pan ? (this.zoomable = !1, c.setMouseCursor("move"), this.panning = !0, this.panClickPos = b ? h : e, this.panClickStart = this.start, this.panClickEnd = this.end, this.panClickStartTime = this.startTime, this.panClickEndTime = this.endTime) : this.zoomable && ("cursor" == this.type ? (this.fromIndex = this.index, b ? (this.initialMouse = h, this.selectionPosY = this.linePos) : (this.initialMouse = e, this.selectionPosX = this.linePos)) : (this.initialMouseX = e, this.initialMouseY = h, this.selectionPosX = e, this.selectionPosY = h), this.zooming = !0) } } }) })(); (function () { var d = window.AmCharts; d.SimpleChartScrollbar = d.Class({ construct: function (a) { this.createEvents("zoomed"); this.backgroundColor = "#D4D4D4"; this.backgroundAlpha = 1; this.selectedBackgroundColor = "#EFEFEF"; this.scrollDuration = this.selectedBackgroundAlpha = 1; this.resizeEnabled = !0; this.hideResizeGrips = !1; this.scrollbarHeight = 20; this.updateOnReleaseOnly = !1; 9 > document.documentMode && (this.updateOnReleaseOnly = !0); this.dragIconHeight = this.dragIconWidth = 35; this.dragIcon = "dragIconRoundBig"; d.applyTheme(this, a, "SimpleChartScrollbar") }, draw: function () { var a = this; a.destroy(); if (a.enabled) { var b = a.chart.container, c = a.rotate, e = a.chart, h = b.set(); a.set = h; e.scrollbarsSet.push(h); var f, g; c ? (f = a.scrollbarHeight, g = e.plotAreaHeight) : (g = a.scrollbarHeight, f = e.plotAreaWidth); a.width = f; if ((a.height = g) && f) { var k = d.rect(b, f, g, a.backgroundColor, a.backgroundAlpha, 1, a.backgroundColor, a.backgroundAlpha); d.setCN(e, k, "scrollbar-bg"); a.bg = k; h.push(k); k = d.rect(b, f, g, "#000", .005); h.push(k); a.invisibleBg = k; k.click(function () { a.handleBgClick() }).mouseover(function () { a.handleMouseOver() }).mouseout(function () { a.handleMouseOut() }).touchend(function () { a.handleBgClick() }); k = d.rect(b, f, g, a.selectedBackgroundColor, a.selectedBackgroundAlpha); d.setCN(e, k, "scrollbar-bg-selected"); a.selectedBG = k; h.push(k); f = d.rect(b, f, g, "#000", .005); a.dragger = f; h.push(f); f.mousedown(function (b) { a.handleDragStart(b) }).mouseup(function () { a.handleDragStop() }).mouseover(function () { a.handleDraggerOver() }).mouseout(function () { a.handleMouseOut() }).touchstart(function (b) { a.handleDragStart(b) }).touchend(function () { a.handleDragStop() }); f = e.pathToImages; c ? (k = f + a.dragIcon + "H.png", f = a.dragIconWidth, c = a.dragIconHeight) : (k = f + a.dragIcon + ".png", c = a.dragIconWidth, f = a.dragIconHeight); g = b.image(k, 0, 0, c, f); d.setCN(e, g, "scrollbar-grip-left"); k = b.image(k, 0, 0, c, f); d.setCN(e, k, "scrollbar-grip-right"); var l = 10, m = 20; e.panEventsEnabled && (l = 25, m = a.scrollbarHeight); var n = d.rect(b, l, m, "#000", .005), q = d.rect(b, l, m, "#000", .005); q.translate(-(l - c) / 2, -(m - f) / 2); n.translate(-(l - c) / 2, -(m - f) / 2); c = b.set([g, q]); b = b.set([k, n]); a.iconLeft = c; h.push(a.iconLeft); a.iconRight = b; h.push(b); c.mousedown(function () { a.leftDragStart() }).mouseup(function () { a.leftDragStop() }).mouseover(function () { a.iconRollOver() }).mouseout(function () { a.iconRollOut() }).touchstart(function () { a.leftDragStart() }).touchend(function () { a.leftDragStop() }); b.mousedown(function () { a.rightDragStart() }).mouseup(function () { a.rightDragStop() }).mouseover(function () { a.iconRollOver() }).mouseout(function () { a.iconRollOut() }).touchstart(function () { a.rightDragStart() }).touchend(function () { a.rightDragStop() }); d.ifArray(e.chartData) ? h.show() : h.hide(); a.hideDragIcons(); a.clipDragger(!1) } h.translate(a.x, a.y); h.node.style.msTouchAction = "none" } }, updateScrollbarSize: function (a, b) { a = Math.round(a); b = Math.round(b); var c = this.dragger, e, d, f, g; this.rotate ? (e = 0, d = a, f = this.width + 1, g = b - a, c.setAttr("height", b - a), c.setAttr("y", d)) : (e = a, d = 0, f = b - a, g = this.height + 1, c.setAttr("width", b - a), c.setAttr("x", e)); this.clipAndUpdate(e, d, f, g) }, update: function () { var a, b = !1, c, e, d = this.x, f = this.y, g = this.dragger, k = this.getDBox(); if (k) { c = k.x + d; e = k.y + f; var l = k.width, k = k.height, m = this.rotate, n = this.chart, q = this.width, p = this.height, r = n.mouseX, t = n.mouseY; a = this.initialMouse; this.forceClip && this.clipDragger(!0); n.mouseIsOver && (this.dragging && (n = this.initialCoord, m ? (a = n + (t - a), 0 > a && (a = 0), n = p - k, a > n && (a = n), g.setAttr("y", a)) : (a = n + (r - a), 0 > a && (a = 0), n = q - l, a > n && (a = n), g.setAttr("x", a)), this.clipDragger(!0)), this.resizingRight && (m ? (a = t - e, a + e > p + f && (a = p - e + f), 0 > a ? (this.resizingRight = !1, b = this.resizingLeft = !0) : (0 === a && (a = .1), g.setAttr("height", a))) : (a = r - c, a + c > q + d && (a = q - c + d), 0 > a ? (this.resizingRight = !1, b = this.resizingLeft = !0) : (0 === a && (a = .1), g.setAttr("width", a))), this.clipDragger(!0)), this.resizingLeft && (m ? (c = e, e = t, e < f && (e = f), e > p + f && (e = p + f), a = !0 === b ? c - e : k + c - e, 0 > a ? (this.resizingRight = !0, this.resizingLeft = !1, g.setAttr("y", c + k - f)) : (0 === a && (a = .1), g.setAttr("y", e - f), g.setAttr("height", a))) : (e = r, e < d && (e = d), e > q + d && (e = q + d), a = !0 === b ? c - e : l + c - e, 0 > a ? (this.resizingRight = !0, this.resizingLeft = !1, g.setAttr("x", c + l - d)) : (0 === a && (a = .1), g.setAttr("x", e - d), g.setAttr("width", a))), this.clipDragger(!0))) } }, stopForceClip: function () { this.forceClip = !1 }, clipDragger: function (a) { var b = this.getDBox(); if (b) { var c = b.x, e = b.y, d = b.width, b = b.height, f = !1; if (this.rotate) { if (c = 0, d = this.width + 1, this.clipY != e || this.clipH != b) f = !0 } else if (e = 0, b = this.height + 1, this.clipX != c || this.clipW != d) f = !0; f && (this.clipAndUpdate(c, e, d, b), a && (this.updateOnReleaseOnly || this.dispatchScrollbarEvent())) } }, maskGraphs: function () {}, clipAndUpdate: function (a, b, c, e) { this.clipX = a; this.clipY = b; this.clipW = c; this.clipH = e; this.selectedBG.clipRect(a, b, c, e); this.updateDragIconPositions(); this.maskGraphs(a, b, c, e) }, dispatchScrollbarEvent: function () { if (this.skipEvent) this.skipEvent = !1; else { var a = this.chart; a.hideBalloon(); var b = this.getDBox(), c = b.x, e = b.y, d = b.width, b = b.height; this.rotate ? (c = e, d = this.height / b) : d = this.width / d; a = { type: "zoomed", position: c, chart: a, target: this, multiplier: d }; this.fire(a.type, a) } }, updateDragIconPositions: function () { var a = this.getDBox(), b = a.x, c = a.y, e = this.iconLeft, d = this.iconRight, f, g, k = this.scrollbarHeight; this.rotate ? (f = this.dragIconWidth, g = this.dragIconHeight, e.translate((k - g) / 2, c - f / 2), d.translate((k - g) / 2, c + a.height - f / 2)) : (f = this.dragIconHeight, g = this.dragIconWidth, e.translate(b - g / 2, (k - f) / 2), d.translate(b - g / 2 + a.width, (k - f) / 2)) }, showDragIcons: function () { this.resizeEnabled && (this.iconLeft.show(), this.iconRight.show()) }, hideDragIcons: function () { if (!this.resizingLeft && !this.resizingRight && !this.dragging) { if (this.hideResizeGrips || !this.resizeEnabled) this.iconLeft.hide(), this.iconRight.hide(); this.removeCursors() } }, removeCursors: function () { this.chart.setMouseCursor("auto") }, relativeZoom: function (a, b) { this.enabled && (this.dragger.stop(), this.multiplier = a, this.position = b, this.updateScrollbarSize(b, this.rotate ? b + this.height / a : b + this.width / a), this.clipDragger()) }, destroy: function () { this.clear(); d.remove(this.set); d.remove(this.iconRight); d.remove(this.iconLeft) }, clear: function () {}, handleDragStart: function () { if (this.enabled) { var a = this.chart; this.dragger.stop(); this.removeCursors(); this.dragging = !0; var b = this.getDBox(); this.rotate ? (this.initialCoord = b.y, this.initialMouse = a.mouseY) : (this.initialCoord = b.x, this.initialMouse = a.mouseX) } }, handleDragStop: function () { this.updateOnReleaseOnly && (this.update(), this.skipEvent = !1, this.dispatchScrollbarEvent()); this.dragging = !1; this.mouseIsOver && this.removeCursors(); this.update() }, handleDraggerOver: function () { this.handleMouseOver() }, leftDragStart: function () { this.dragger.stop(); this.resizingLeft = !0 }, leftDragStop: function () { this.resizingLeft = !1; this.mouseIsOver || this.removeCursors(); this.updateOnRelease() }, rightDragStart: function () { this.dragger.stop(); this.resizingRight = !0 }, rightDragStop: function () { this.resizingRight = !1; this.mouseIsOver || this.removeCursors(); this.updateOnRelease() }, iconRollOut: function () { this.removeCursors() }, iconRollOver: function () { this.rotate ? this.chart.setMouseCursor("n-resize") : this.chart.setMouseCursor("e-resize"); this.handleMouseOver() }, getDBox: function () { if (this.dragger) return this.dragger.getBBox() }, handleBgClick: function () { var a = this; if (!a.resizingRight && !a.resizingLeft) { a.zooming = !0; var b, c, e = a.scrollDuration, h = a.dragger; b = a.getDBox(); var f = b.height, g = b.width; c = a.chart; var k = a.y, l = a.x, m = a.rotate; m ? (b = "y", c = c.mouseY - f / 2 - k, c = d.fitToBounds(c, 0, a.height - f)) : (b = "x", c = c.mouseX - g / 2 - l, c = d.fitToBounds(c, 0, a.width - g)); a.updateOnReleaseOnly ? (a.skipEvent = !1, h.setAttr(b, c), a.dispatchScrollbarEvent(), a.clipDragger()) : (c = Math.round(c), m ? h.animate({ y: c }, e, ">") : h.animate({ x: c }, e, ">"), a.forceClip = !0, clearTimeout(a.forceTO), a.forceTO = setTimeout(function () { a.stopForceClip.call(a) }, 5E3 * e)) } }, updateOnRelease: function () { this.updateOnReleaseOnly && (this.update(), this.skipEvent = !1, this.dispatchScrollbarEvent()) }, handleReleaseOutside: function () { if (this.set) { if (this.resizingLeft || this.resizingRight || this.dragging) this.updateOnRelease(), this.removeCursors(); this.mouseIsOver = this.dragging = this.resizingRight = this.resizingLeft = !1; this.hideDragIcons(); this.update() } }, handleMouseOver: function () { this.mouseIsOver = !0; this.showDragIcons() }, handleMouseOut: function () { this.mouseIsOver = !1; this.hideDragIcons() } }) })(); (function () { var d = window.AmCharts; d.ChartScrollbar = d.Class({ inherits: d.SimpleChartScrollbar, construct: function (a) { this.cname = "ChartScrollbar"; d.ChartScrollbar.base.construct.call(this, a); this.enabled = !0; this.graphLineColor = "#BBBBBB"; this.graphLineAlpha = 0; this.graphFillColor = "#BBBBBB"; this.graphFillAlpha = 1; this.selectedGraphLineColor = "#888888"; this.selectedGraphLineAlpha = 0; this.selectedGraphFillColor = "#888888"; this.selectedGraphFillAlpha = 1; this.gridCount = 0; this.gridColor = "#FFFFFF"; this.gridAlpha = .7; this.skipEvent = this.autoGridCount = !1; this.color = "#FFFFFF"; this.scrollbarCreated = !1; this.offset = 0; d.applyTheme(this, a, this.cname) }, init: function () { var a = this.categoryAxis, b = this.chart; a || (this.categoryAxis = a = new d.CategoryAxis); a.chart = b; a.id = "scrollbar"; a.dateFormats = b.categoryAxis.dateFormats; a.markPeriodChange = b.categoryAxis.markPeriodChange; a.boldPeriodBeginning = b.categoryAxis.boldPeriodBeginning; a.axisItemRenderer = d.RecItem; a.axisRenderer = d.RecAxis; a.guideFillRenderer = d.RecFill; a.inside = !0; a.fontSize = this.fontSize; a.tickLength = 0; a.axisAlpha = 0; d.isString(this.graph) && (this.graph = d.getObjById(b.graphs, this.graph)); if (a = this.graph) { var c = this.valueAxis; c || (this.valueAxis = c = new d.ValueAxis, c.visible = !1, c.scrollbar = !0, c.axisItemRenderer = d.RecItem, c.axisRenderer = d.RecAxis, c.guideFillRenderer = d.RecFill, c.labelsEnabled = !1, c.chart = b); b = this.unselectedGraph; b || (b = new d.AmGraph, b.scrollbar = !0, this.unselectedGraph = b, b.negativeBase = a.negativeBase, b.noStepRisers = a.noStepRisers); b = this.selectedGraph; b || (b = new d.AmGraph, b.scrollbar = !0, this.selectedGraph = b, b.negativeBase = a.negativeBase, b.noStepRisers = a.noStepRisers) } this.scrollbarCreated = !0 }, draw: function () { var a = this; d.ChartScrollbar.base.draw.call(a); if (a.enabled) { a.scrollbarCreated || a.init(); var b = a.chart, c = b.chartData, e = a.categoryAxis, h = a.rotate, f = a.x, g = a.y, k = a.width, l = a.height, m = b.categoryAxis, n = a.set; e.setOrientation(!h); e.parseDates = m.parseDates; e.rotate = h; e.equalSpacing = m.equalSpacing; e.minPeriod = m.minPeriod; e.startOnAxis = m.startOnAxis; e.viW = k; e.viH = l; e.width = k; e.height = l; e.gridCount = a.gridCount; e.gridColor = a.gridColor; e.gridAlpha = a.gridAlpha; e.color = a.color; e.tickLength = 0; e.axisAlpha = 0; e.autoGridCount = a.autoGridCount; e.parseDates && !e.equalSpacing && e.timeZoom(b.firstTime, b.lastTime); e.zoom(0, c.length - 1); if (m = a.graph) { var q = a.valueAxis, p = m.valueAxis; q.id = p.id; q.rotate = h; q.setOrientation(h); q.width = k; q.height = l; q.viW = k; q.viH = l; q.dataProvider = c; q.reversed = p.reversed; q.logarithmic = p.logarithmic; q.gridAlpha = 0; q.axisAlpha = 0; n.push(q.set); h ? (q.y = g, q.x = 0) : (q.x = f, q.y = 0); var f = Infinity, g = -Infinity, r; for (r = 0; r < c.length; r++) { var t = c[r].axes[p.id].graphs[m.id].values, u; for (u in t) if (t.hasOwnProperty(u) && "percents" != u && "total" != u) { var z = t[u]; z < f && (f = z); z > g && (g = z) } } Infinity != f && (q.minimum = f); - Infinity != g && (q.maximum = g + .1 * (g - f)); f == g && (--q.minimum, q.maximum += 1); void 0 !== a.minimum && (q.minimum = a.minimum); void 0 !== a.maximum && (q.maximum = a.maximum); q.zoom(0, c.length - 1); u = a.unselectedGraph; u.id = m.id; u.bcn = "scrollbar-graph-"; u.rotate = h; u.chart = b; u.data = c; u.valueAxis = q; u.chart = m.chart; u.categoryAxis = a.categoryAxis; u.periodSpan = m.periodSpan; u.valueField = m.valueField; u.openField = m.openField; u.closeField = m.closeField; u.highField = m.highField; u.lowField = m.lowField; u.lineAlpha = a.graphLineAlpha; u.lineColorR = a.graphLineColor; u.fillAlphas = a.graphFillAlpha; u.fillColorsR = a.graphFillColor; u.connect = m.connect; u.hidden = m.hidden; u.width = k; u.height = l; u.pointPosition = m.pointPosition; u.stepDirection = m.stepDirection; u.periodSpan = m.periodSpan; p = a.selectedGraph; p.id = m.id; p.bcn = u.bcn + "selected-"; p.rotate = h; p.chart = b; p.data = c; p.valueAxis = q; p.chart = m.chart; p.categoryAxis = e; p.periodSpan = m.periodSpan; p.valueField = m.valueField; p.openField = m.openField; p.closeField = m.closeField; p.highField = m.highField; p.lowField = m.lowField; p.lineAlpha = a.selectedGraphLineAlpha; p.lineColorR = a.selectedGraphLineColor; p.fillAlphas = a.selectedGraphFillAlpha; p.fillColorsR = a.selectedGraphFillColor; p.connect = m.connect; p.hidden = m.hidden; p.width = k; p.height = l; p.pointPosition = m.pointPosition; p.stepDirection = m.stepDirection; p.periodSpan = m.periodSpan; b = a.graphType; b || (b = m.type); u.type = b; p.type = b; c = c.length - 1; u.zoom(0, c); p.zoom(0, c); p.set.click(function () { a.handleBackgroundClick() }).mouseover(function () { a.handleMouseOver() }).mouseout(function () { a.handleMouseOut() }); u.set.click(function () { a.handleBackgroundClick() }).mouseover(function () { a.handleMouseOver() }).mouseout(function () { a.handleMouseOut() }); n.push(u.set); n.push(p.set) } n.push(e.set); n.push(e.labelsSet); a.bg.toBack(); a.invisibleBg.toFront(); a.dragger.toFront(); a.iconLeft.toFront(); a.iconRight.toFront() } }, timeZoom: function (a, b, c) { this.startTime = a; this.endTime = b; this.timeDifference = b - a; this.skipEvent = !d.toBoolean(c); this.zoomScrollbar(); this.skipEvent || this.dispatchScrollbarEvent() }, zoom: function (a, b) { this.start = a; this.end = b; this.skipEvent = !0; this.zoomScrollbar() }, dispatchScrollbarEvent: function () { if (this.skipEvent) this.skipEvent = !1; else { var a = this.chart.chartData, b, c, e = this.dragger.getBBox(); b = e.x; var d = e.y, f = e.width, e = e.height, g = this.chart; this.rotate ? (b = d, c = e) : c = f; f = { type: "zoomed", target: this }; f.chart = g; var k = this.categoryAxis, l = this.stepWidth, d = g.minSelectedTime, e = !1; if (k.parseDates && !k.equalSpacing) { if (a = g.lastTime, g = g.firstTime, k = Math.round(b / l) + g, b = this.dragging ? k + this.timeDifference : Math.round((b + c) / l) + g, k > b && (k = b), 0 < d && b - k < d && (b = Math.round(k + (b - k) / 2), e = Math.round(d / 2), k = b - e, b += e, e = !0), b > a && (b = a), b - d < k && (k = b - d), k < g && (k = g), k + d > b && (b = k + d), k != this.startTime || b != this.endTime) this.startTime = k, this.endTime = b, f.start = k, f.end = b, f.startDate = new Date(k), f.endDate = new Date(b), this.fire(f.type, f) } else if (k.startOnAxis || (b += l / 2), c -= this.stepWidth / 2, d = k.xToIndex(b), b = k.xToIndex(b + c), d != this.start || this.end != b) k.startOnAxis && (this.resizingRight && d == b && b++, this.resizingLeft && d == b && (0 < d ? d-- : b = 1)), this.start = d, this.end = this.dragging ? this.start + this.difference : b, f.start = this.start, f.end = this.end, k.parseDates && (a[this.start] && (f.startDate = new Date(a[this.start].time)), a[this.end] && (f.endDate = new Date(a[this.end].time))), this.fire(f.type, f); e && this.zoomScrollbar() } }, zoomScrollbar: function () { var a, b; a = this.chart; var c = a.chartData, e = this.categoryAxis; e.parseDates && !e.equalSpacing ? (c = e.stepWidth, e = a.firstTime, a = c * (this.startTime - e), b = c * (this.endTime - e)) : (a = c[this.start].x[e.id], b = c[this.end].x[e.id], c = e.stepWidth, e.startOnAxis || (e = c / 2, a -= e, b += e)); this.stepWidth = c; this.updateScrollbarSize(a, b) }, maskGraphs: function (a, b, c, e) { var d = this.selectedGraph; d && d.set.clipRect(a, b, c, e) }, handleDragStart: function () { d.ChartScrollbar.base.handleDragStart.call(this); this.difference = this.end - this.start; this.timeDifference = this.endTime - this.startTime; 0 > this.timeDifference && (this.timeDifference = 0) }, handleBackgroundClick: function () { d.ChartScrollbar.base.handleBackgroundClick.call(this); this.dragging || (this.difference = this.end - this.start, this.timeDifference = this.endTime - this.startTime, 0 > this.timeDifference && (this.timeDifference = 0)) } }) })(); (function () { var d = window.AmCharts; d.AmBalloon = d.Class({ construct: function (a) { this.cname = "AmBalloon"; this.enabled = !0; this.fillColor = "#FFFFFF"; this.fillAlpha = .8; this.borderThickness = 2; this.borderColor = "#FFFFFF"; this.borderAlpha = 1; this.cornerRadius = 0; this.maxWidth = 220; this.horizontalPadding = 8; this.verticalPadding = 4; this.pointerWidth = 6; this.pointerOrientation = "V"; this.color = "#000000"; this.adjustBorderColor = !0; this.show = this.follow = this.showBullet = !1; this.bulletSize = 3; this.shadowAlpha = .4; this.shadowColor = "#000000"; this.fadeOutDuration = this.animationDuration = .3; this.fixedPosition = !1; this.offsetY = 6; this.offsetX = 1; this.textAlign = "center"; this.deltaSignX = this.deltaSignY = 1; d.isModern || (this.offsetY *= 1.5); d.applyTheme(this, a, this.cname) }, draw: function () { var a = this.pointToX, b = this.pointToY, c = this.chart; d.VML && (this.fadeOutDuration = 0); this.xAnim && c.stopAnim(this.xAnim); this.yAnim && c.stopAnim(this.yAnim); if (!isNaN(a)) { var e = this.follow, h = c.container, f = this.set; d.remove(f); this.removeDiv(); f = h.set(); f.node.style.pointerEvents = "none"; this.set = f; c.balloonsSet.push(f); if (this.show) { var g = this.l, k = this.t, l = this.r, m = this.b, n = this.balloonColor, q = this.fillColor, p = this.borderColor, r = q; void 0 != n && (this.adjustBorderColor ? r = p = n : q = n); var t = this.horizontalPadding, u = this.verticalPadding, z = this.pointerWidth, w = this.pointerOrientation, x = this.cornerRadius, v = c.fontFamily, A = this.fontSize; void 0 == A && (A = c.fontSize); var n = document.createElement("div"), B = c.classNamePrefix; n.className = B + "-balloon-div"; this.className && (n.className = n.className + " " + B + "-balloon-div-" + this.className); B = n.style; B.pointerEvents = "none"; B.position = "absolute"; var D = this.minWidth, C = ""; isNaN(D) || (C = "min-width:" + (D - 2 * t) + "px; "); n.innerHTML = "
" + this.text + "
"; c.chartDiv.appendChild(n); this.textDiv = n; A = n.offsetWidth; v = n.offsetHeight; n.clientHeight && (A = n.clientWidth, v = n.clientHeight); v += 2 * u; C = A + 2 * t; !isNaN(D) && C < D && (C = D); window.opera && (v += 2); var I = !1, A = this.offsetY; c.handDrawn && (A += c.handDrawScatter + 2); "H" != w ? (D = a - C / 2, b < k + v + 10 && "down" != w ? (I = !0, e && (b += A), A = b + z, this.deltaSignY = -1) : (e && (b -= A), A = b - v - z, this.deltaSignY = 1)) : (2 * z > v && (z = v / 2), A = b - v / 2, a < g + (l - g) / 2 ? (D = a + z, this.deltaSignX = -1) : (D = a - C - z, this.deltaSignX = 1)); A + v >= m && (A = m - v); A < k && (A = k); D < g && (D = g); D + C > l && (D = l - C); var k = A + u, m = D + t, u = this.shadowAlpha, H = this.shadowColor, t = this.borderThickness, O = this.bulletSize, J; 0 < x || 0 === z ? (0 < u && (a = d.rect(h, C, v, q, 0, t + 1, H, u, this.cornerRadius), d.isModern ? a.translate(1, 1) : a.translate(4, 4), f.push(a)), q = d.rect(h, C, v, q, this.fillAlpha, t, p, this.borderAlpha, this.cornerRadius), this.showBullet && (J = d.circle(h, O, r, this.fillAlpha), f.push(J))) : (r = [], x = [], "H" != w ? (g = a - D, g > C - z && (g = C - z), g < z && (g = z), r = [0, g - z, a - D, g + z, C, C, 0, 0], x = I ? [0, 0, b - A, 0, 0, v, v, 0] : [v, v, b - A, v, v, 0, 0, v]) : (r = b - A, r > v - z && (r = v - z), r < z && (r = z), x = [0, r - z, b - A, r + z, v, v, 0, 0], r = a < g + (l - g) / 2 ? [0, 0, D < a ? 0 : a - D, 0, 0, C, C, 0] : [C, C, D + C > a ? C : a - D, C, C, 0, 0, C]), 0 < u && (a = d.polygon(h, r, x, q, 0, t, H, u), a.translate(1, 1), f.push(a)), q = d.polygon(h, r, x, q, this.fillAlpha, t, p, this.borderAlpha)); this.bg = q; f.push(q); q.toFront(); d.setCN(c, q, "balloon-bg"); this.className && d.setCN(c, q, "balloon-bg-" + this.className); h = 1 * this.deltaSignX; B.left = m + "px"; B.top = k + "px"; f.translate(D - h, A); q = q.getBBox(); this.bottom = A + v + 1; this.yPos = q.y + A; J && J.translate(this.pointToX - D + h, b - A); b = this.animationDuration; 0 < this.animationDuration && !e && !isNaN(this.prevX) && (f.translate(this.prevX, this.prevY), f.animate({ translate: D - h + "," + A }, b, "easeOutSine"), n && (B.left = this.prevTX + "px", B.top = this.prevTY + "px", this.xAnim = c.animate({ node: n }, "left", this.prevTX, m, b, "easeOutSine", "px"), this.yAnim = c.animate({ node: n }, "top", this.prevTY, k, b, "easeOutSine", "px"))); this.prevX = D - h; this.prevY = A; this.prevTX = m; this.prevTY = k } } }, followMouse: function () { if (this.follow && this.show) { var a = this.chart.mouseX - this.offsetX * this.deltaSignX, b = this.chart.mouseY; this.pointToX = a; this.pointToY = b; if (a != this.previousX || b != this.previousY) if (this.previousX = a, this.previousY = b, 0 === this.cornerRadius) this.draw(); else { var c = this.set; if (c) { var e = c.getBBox(), a = a - e.width / 2, d = b - e.height - 10; a < this.l && (a = this.l); a > this.r - e.width && (a = this.r - e.width); d < this.t && (d = b + 10); c.translate(a, d); b = this.textDiv.style; b.left = a + this.horizontalPadding + "px"; b.top = d + this.verticalPadding + "px" } } } }, changeColor: function (a) { this.balloonColor = a }, setBounds: function (a, b, c, e) { this.l = a; this.t = b; this.r = c; this.b = e; this.destroyTO && clearTimeout(this.destroyTO) }, showBalloon: function (a) { this.text = a; this.show = !0; this.destroyTO && clearTimeout(this.destroyTO); a = this.chart; this.fadeAnim1 && a.stopAnim(this.fadeAnim1); this.fadeAnim2 && a.stopAnim(this.fadeAnim2); this.draw() }, hide: function () { var a = this, b = a.fadeOutDuration, c = a.chart; if (0 < b) { a.destroyTO && clearTimeout(a.destroyTO); a.destroyTO = setTimeout(function () { a.destroy.call(a) }, 1E3 * b); a.follow = !1; a.show = !1; var e = a.set; e && (e.setAttr("opacity", a.fillAlpha), a.fadeAnim1 = e.animate({ opacity: 0 }, b, "easeInSine")); a.textDiv && (a.fadeAnim2 = c.animate({ node: a.textDiv }, "opacity", 1, 0, b, "easeInSine", "")) } else a.show = !1, a.follow = !1, a.destroy() }, setPosition: function (a, b, c) { this.pointToX = a; this.pointToY = b; c && (a == this.previousX && b == this.previousY || this.draw()); this.previousX = a; this.previousY = b }, followCursor: function (a) { var b = this; (b.follow = a) ? (b.pShowBullet = b.showBullet, b.showBullet = !1) : void 0 !== b.pShowBullet && (b.showBullet = b.pShowBullet); clearInterval(b.interval); var c = b.chart.mouseX, e = b.chart.mouseY; !isNaN(c) && a && (b.pointToX = c - b.offsetX * b.deltaSignX, b.pointToY = e, b.followMouse(), b.interval = setInterval(function () { b.followMouse.call(b) }, 40)) }, removeDiv: function () { if (this.textDiv) { var a = this.textDiv.parentNode; a && a.removeChild(this.textDiv) } }, destroy: function () { clearInterval(this.interval); d.remove(this.set); this.removeDiv(); this.set = null } }) })(); (function () { var d = window.AmCharts; d.AmCoordinateChart = d.Class({ inherits: d.AmChart, construct: function (a) { d.AmCoordinateChart.base.construct.call(this, a); this.theme = a; this.createEvents("rollOverGraphItem", "rollOutGraphItem", "clickGraphItem", "doubleClickGraphItem", "rightClickGraphItem", "clickGraph", "rollOverGraph", "rollOutGraph"); this.startAlpha = 1; this.startDuration = 0; this.startEffect = "elastic"; this.sequencedAnimation = !0; this.colors = "#FF6600 #FCD202 #B0DE09 #0D8ECF #2A0CD0 #CD0D74 #CC0000 #00CC00 #0000CC #DDDDDD #999999 #333333 #990000".split(" "); this.balloonDateFormat = "MMM DD, YYYY"; this.valueAxes = []; this.graphs = []; this.guides = []; this.gridAboveGraphs = !1; d.applyTheme(this, a, "AmCoordinateChart") }, initChart: function () { d.AmCoordinateChart.base.initChart.call(this); var a = this.categoryAxis; a && (this.categoryAxis = d.processObject(a, d.CategoryAxis, this.theme)); this.processValueAxes(); this.createValueAxes(); this.processGraphs(); this.processGuides(); d.VML && (this.startAlpha = 1); this.setLegendData(this.graphs); this.gridAboveGraphs && this.gridSet.toFront() }, createValueAxes: function () { if (0 === this.valueAxes.length) { var a = new d.ValueAxis; this.addValueAxis(a) } }, parseData: function () { this.processValueAxes(); this.processGraphs() }, parseSerialData: function (a) { var b = this.graphs, c, e = {}, h = this.seriesIdField; h || (h = this.categoryField); this.chartData = []; if (a) { var f = !1, g, k = this.categoryAxis, l, m, n; k && (f = k.parseDates, l = k.forceShowField, n = k.classNameField, m = k.labelColorField, g = k.categoryFunction); var q, p, r = {}, t; f && (c = d.extractPeriod(k.minPeriod), q = c.period, p = c.count, t = d.getPeriodDuration(q, p)); var u = {}; this.lookupTable = u; var z, w = this.dataDateFormat, x = {}; for (z = 0; z < a.length; z++) { var v = {}, A = a[z]; c = A[this.categoryField]; v.dataContext = A; v.category = g ? g(c, A, k) : String(c); l && (v.forceShow = A[l]); n && (v.className = A[n]); m && (v.labelColor = A[m]); u[A[h]] = v; if (f && (k.categoryFunction ? c = k.categoryFunction(c, A, k) : (!w || c instanceof Date || (c = c.toString() + " |"), c = d.getDate(c, w, k.minPeriod)), c = d.resetDateToMin(c, q, p, k.firstDayOfWeek), v.category = c, v.time = c.getTime(), isNaN(v.time))) continue; var B = this.valueAxes; v.axes = {}; v.x = {}; var D; for (D = 0; D < B.length; D++) { var C = B[D].id; v.axes[C] = {}; v.axes[C].graphs = {}; var I; for (I = 0; I < b.length; I++) { c = b[I]; var H = c.id, O = 1.1; isNaN(c.gapPeriod) || (O = c.gapPeriod); var J = c.periodValue; if (c.valueAxis.id == C) { v.axes[C].graphs[H] = {}; var da = {}; da.index = z; var pa = A; c.dataProvider && (pa = e); da.values = this.processValues(pa, c, J); !c.connect && x && x[H] && v.time - r[H] >= t * O && (x[H].gap = !0); this.processFields(c, da, pa); da.category = v.category; da.serialDataItem = v; da.graph = c; v.axes[C].graphs[H] = da; r[H] = v.time; x[H] = da } } } this.chartData[z] = v } } for (a = 0; a < b.length; a++) c = b[a], c.dataProvider && this.parseGraphData(c) }, processValues: function (a, b, c) { var e = {}, h, f = !1; "candlestick" != b.type && "ohlc" != b.type || "" === c || (f = !0); for (var g = "value error open close low high".split(" "), k = 0; k < g.length; k++) { var l = g[k]; "value" != l && "error" != l && f && (c = l.charAt(0).toUpperCase() + l.slice(1)); var m = a[b[l + "Field"] + c]; h = Number(m); isNaN(h) || (e[l] = h); "date" == b.valueAxis.type && void 0 !== m && (h = d.getDate(m, b.chart.dataDateFormat), e[l] = h.getTime()) } return e }, parseGraphData: function (a) { var b = a.dataProvider, c = a.seriesIdField; c || (c = this.seriesIdField); c || (c = this.categoryField); var e; for (e = 0; e < b.length; e++) { var d = b[e], f = this.lookupTable[String(d[c])], g = a.valueAxis.id; f && (g = f.axes[g].graphs[a.id], g.serialDataItem = f, g.values = this.processValues(d, a, a.periodValue), this.processFields(a, g, d)) } }, addValueAxis: function (a) { a.chart = this; this.valueAxes.push(a); this.validateData() }, removeValueAxesAndGraphs: function () { var a = this.valueAxes, b; for (b = a.length - 1; - 1 < b; b--) this.removeValueAxis(a[b]) }, removeValueAxis: function (a) { var b = this.graphs, c; for (c = b.length - 1; 0 <= c; c--) { var e = b[c]; e && e.valueAxis == a && this.removeGraph(e) } b = this.valueAxes; for (c = b.length - 1; 0 <= c; c--) b[c] == a && b.splice(c, 1); this.validateData() }, addGraph: function (a) { this.graphs.push(a); this.chooseGraphColor(a, this.graphs.length - 1); this.validateData() }, removeGraph: function (a) { var b = this.graphs, c; for (c = b.length - 1; 0 <= c; c--) b[c] == a && (b.splice(c, 1), a.destroy()); this.validateData() }, processValueAxes: function () { var a = this.valueAxes, b; for (b = 0; b < a.length; b++) { var c = a[b], c = d.processObject(c, d.ValueAxis, this.theme); a[b] = c; c.chart = this; c.id || (c.id = "valueAxisAuto" + b + "_" + (new Date).getTime()); void 0 === c.usePrefixes && (c.usePrefixes = this.usePrefixes) } }, processGuides: function () { var a = this.guides, b = this.categoryAxis; if (a) for (var c = 0; c < a.length; c++) { var e = a[c]; (void 0 !== e.category || void 0 !== e.date) && b && b.addGuide(e); e.id || (e.id = "guideAuto" + c + "_" + (new Date).getTime()); var h = e.valueAxis; h ? (d.isString(h) && (h = this.getValueAxisById(h)), h ? h.addGuide(e) : this.valueAxes[0].addGuide(e)) : isNaN(e.value) || this.valueAxes[0].addGuide(e) } }, processGraphs: function () { var a = this.graphs, b; for (b = 0; b < a.length; b++) { var c = a[b], c = d.processObject(c, d.AmGraph, this.theme); a[b] = c; this.chooseGraphColor(c, b); c.chart = this; d.isString(c.valueAxis) && (c.valueAxis = this.getValueAxisById(c.valueAxis)); c.valueAxis || (c.valueAxis = this.valueAxes[0]); c.id || (c.id = "graphAuto" + b + "_" + (new Date).getTime()) } }, formatString: function (a, b, c) { var e = b.graph, h = e.valueAxis; h.duration && b.values.value && (h = d.formatDuration(b.values.value, h.duration, "", h.durationUnits, h.maxInterval, h.numberFormatter), a = a.split("[[value]]").join(h)); a = d.massReplace(a, { "[[title]]": e.title, "[[description]]": b.description }); a = c ? d.fixNewLines(a) : d.fixBrakes(a); return a = d.cleanFromEmpty(a) }, getBalloonColor: function (a, b, c) { var e = a.lineColor, d = a.balloonColor; c && (d = e); c = a.fillColorsR; "object" == typeof c ? e = c[0] : void 0 !== c && (e = c); b.isNegative && (c = a.negativeLineColor, a = a.negativeFillColors, "object" == typeof a ? c = a[0] : void 0 !== a && (c = a), void 0 !== c && (e = c)); void 0 !== b.color && (e = b.color); void 0 === d && (d = e); return d }, getGraphById: function (a) { return d.getObjById(this.graphs, a) }, getValueAxisById: function (a) { return d.getObjById(this.valueAxes, a) }, processFields: function (a, b, c) { if (a.itemColors) { var e = a.itemColors, h = b.index; b.color = h < e.length ? e[h] : d.randomColor() } e = "lineColor color alpha fillColors description bullet customBullet bulletSize bulletConfig url labelColor dashLength pattern gap className".split(" "); for (h = 0; h < e.length; h++) { var f = e[h], g = a[f + "Field"]; g && (g = c[g], d.isDefined(g) && (b[f] = g)) } b.dataContext = c }, chooseGraphColor: function (a, b) { if (a.lineColor) a.lineColorR = a.lineColor; else { var c; c = this.colors.length > b ? this.colors[b] : d.randomColor(); a.lineColorR = c } a.fillColorsR = a.fillColors ? a.fillColors : a.lineColorR; a.bulletBorderColorR = a.bulletBorderColor ? a.bulletBorderColor : a.useLineColorForBulletBorder ? a.lineColorR : a.bulletColor; a.bulletColorR = a.bulletColor ? a.bulletColor : a.lineColorR; if (c = this.patterns) a.pattern = c[b] }, handleLegendEvent: function (a) { var b = a.type; a = a.dataItem; if (!this.legend.data && a) { var c = a.hidden, e = a.showBalloon; switch (b) { case "clickMarker": this.textClickEnabled && (e ? this.hideGraphsBalloon(a) : this.showGraphsBalloon(a)); break; case "clickLabel": e ? this.hideGraphsBalloon(a) : this.showGraphsBalloon(a); break; case "rollOverItem": c || this.highlightGraph(a); break; case "rollOutItem": c || this.unhighlightGraph(); break; case "hideItem": this.hideGraph(a); break; case "showItem": this.showGraph(a) } } }, highlightGraph: function (a) { var b = this.graphs, c, e = .2; this.legend && (e = this.legend.rollOverGraphAlpha); if (1 != e) for (c = 0; c < b.length; c++) { var d = b[c]; d != a && d.changeOpacity(e) } }, unhighlightGraph: function () { var a; this.legend && (a = this.legend.rollOverGraphAlpha); if (1 != a) { a = this.graphs; var b; for (b = 0; b < a.length; b++) a[b].changeOpacity(1) } }, showGraph: function (a) { a.switchable && (a.hidden = !1, this.dataChanged = !0, "xy" != this.type && (this.marginsUpdated = !1), this.chartCreated && this.initChart()) }, hideGraph: function (a) { a.switchable && (this.dataChanged = !0, "xy" != this.type && (this.marginsUpdated = !1), a.hidden = !0, this.chartCreated && this.initChart()) }, hideGraphsBalloon: function (a) { a.showBalloon = !1; this.updateLegend() }, showGraphsBalloon: function (a) { a.showBalloon = !0; this.updateLegend() }, updateLegend: function () { this.legend && this.legend.invalidateSize() }, resetAnimation: function () { var a = this.graphs; if (a) { var b; for (b = 0; b < a.length; b++) a[b].animationPlayed = !1 } }, animateAgain: function () { this.resetAnimation(); this.validateNow() } }) })(); (function () { var d = window.AmCharts; d.AmSlicedChart = d.Class({ inherits: d.AmChart, construct: function (a) { this.createEvents("rollOverSlice", "rollOutSlice", "clickSlice", "pullOutSlice", "pullInSlice", "rightClickSlice"); d.AmSlicedChart.base.construct.call(this, a); this.colors = "#FF0F00 #FF6600 #FF9E01 #FCD202 #F8FF01 #B0DE09 #04D215 #0D8ECF #0D52D1 #2A0CD0 #8A0CCF #CD0D74 #754DEB #DDDDDD #999999 #333333 #000000 #57032A #CA9726 #990000 #4B0C25".split(" "); this.alpha = 1; this.groupPercent = 0; this.groupedTitle = "Other"; this.groupedPulled = !1; this.groupedAlpha = 1; this.marginLeft = 0; this.marginBottom = this.marginTop = 10; this.marginRight = 0; this.hoverAlpha = 1; this.outlineColor = "#FFFFFF"; this.outlineAlpha = 0; this.outlineThickness = 1; this.startAlpha = 0; this.startDuration = 1; this.startEffect = "bounce"; this.sequencedAnimation = !0; this.pullOutDuration = 1; this.pullOutEffect = "bounce"; this.pullOnHover = this.pullOutOnlyOne = !1; this.labelsEnabled = !0; this.labelTickColor = "#000000"; this.labelTickAlpha = .2; this.hideLabelsPercent = 0; this.urlTarget = "_self"; this.autoMarginOffset = 10; this.gradientRatio = []; this.maxLabelWidth = 200; d.applyTheme(this, a, "AmSlicedChart") }, initChart: function () { d.AmSlicedChart.base.initChart.call(this); this.dataChanged && (this.parseData(), this.dispatchDataUpdated = !0, this.dataChanged = !1, this.setLegendData(this.chartData)); this.drawChart() }, handleLegendEvent: function (a) { var b = a.type, c = a.dataItem, e = this.legend; if (!e.data && c) { var d = c.hidden; a = a.event; switch (b) { case "clickMarker": d || e.switchable || this.clickSlice(c, a); break; case "clickLabel": d || this.clickSlice(c, a, !1); break; case "rollOverItem": d || this.rollOverSlice(c, !1, a); break; case "rollOutItem": d || this.rollOutSlice(c, a); break; case "hideItem": this.hideSlice(c, a); break; case "showItem": this.showSlice(c, a) } } }, invalidateVisibility: function () { this.recalculatePercents(); this.initChart(); var a = this.legend; a && a.invalidateSize() }, addEventListeners: function (a, b) { var c = this; a.mouseover(function (a) { c.rollOverSlice(b, !0, a) }).mouseout(function (a) { c.rollOutSlice(b, a) }).touchend(function (a) { c.rollOverSlice(b, a); c.panEventsEnabled && c.clickSlice(b, a) }).touchstart(function (a) { c.rollOverSlice(b, a) }).click(function (a) { c.clickSlice(b, a) }).contextmenu(function (a) { c.handleRightClick(b, a) }) }, formatString: function (a, b, c) { a = d.formatValue(a, b, ["value"], this.nf, "", this.usePrefixes, this.prefixesOfSmallNumbers, this.prefixesOfBigNumbers); var e = this.pf.precision; isNaN(this.tempPrec) || (this.pf.precision = this.tempPrec); a = d.formatValue(a, b, ["percents"], this.pf); a = d.massReplace(a, { "[[title]]": b.title, "[[description]]": b.description }); this.pf.precision = e; - 1 != a.indexOf("[[") && (a = d.formatDataContextValue(a, b.dataContext)); a = c ? d.fixNewLines(a) : d.fixBrakes(a); return a = d.cleanFromEmpty(a) }, startSlices: function () { var a; for (a = 0; a < this.chartData.length; a++) 0 < this.startDuration && this.sequencedAnimation ? this.setStartTO(a) : this.startSlice(this.chartData[a]) }, setStartTO: function (a) { var b = this; a = setTimeout(function () { b.startSequenced.call(b) }, b.startDuration / b.chartData.length * 500 * a); b.timeOuts.push(a) }, pullSlices: function (a) { var b = this.chartData, c; for (c = 0; c < b.length; c++) { var e = b[c]; e.pulled && this.pullSlice(e, 1, a) } }, startSequenced: function () { var a = this.chartData, b; for (b = 0; b < a.length; b++) if (!a[b].started) { this.startSlice(this.chartData[b]); break } }, startSlice: function (a) { a.started = !0; var b = a.wedge, c = this.startDuration; b && 0 < c && (0 < a.alpha && b.show(), b.translate(a.startX, a.startY), b.animate({ opacity: 1, translate: "0,0" }, c, this.startEffect)) }, showLabels: function () { var a = this.chartData, b; for (b = 0; b < a.length; b++) { var c = a[b]; if (0 < c.alpha) { var e = c.label; e && e.show(); (c = c.tick) && c.show() } } }, showSlice: function (a) { isNaN(a) ? a.hidden = !1 : this.chartData[a].hidden = !1; this.invalidateVisibility() }, hideSlice: function (a) { isNaN(a) ? a.hidden = !0 : this.chartData[a].hidden = !0; this.hideBalloon(); this.invalidateVisibility() }, rollOverSlice: function (a, b, c) { isNaN(a) || (a = this.chartData[a]); clearTimeout(this.hoverInt); if (!a.hidden) { this.pullOnHover && this.pullSlice(a, 1); 1 > this.hoverAlpha && a.wedge && a.wedge.attr({ opacity: this.hoverAlpha }); var e = a.balloonX, h = a.balloonY; a.pulled && (e += a.pullX, h += a.pullY); var f = this.formatString(this.balloonText, a, !0), g = this.balloonFunction; g && (f = g(a, f)); g = d.adjustLuminosity(a.color, -.15); f ? this.showBalloon(f, g, b, e, h) : this.hideBalloon(); 0 === a.value && this.hideBalloon(); a = { type: "rollOverSlice", dataItem: a, chart: this, event: c }; this.fire(a.type, a) } }, rollOutSlice: function (a, b) { isNaN(a) || (a = this.chartData[a]); a.wedge && a.wedge.attr({ opacity: 1 }); this.hideBalloon(); var c = { type: "rollOutSlice", dataItem: a, chart: this, event: b }; this.fire(c.type, c) }, clickSlice: function (a, b, c) { isNaN(a) || (a = this.chartData[a]); a.pulled ? this.pullSlice(a, 0) : this.pullSlice(a, 1); d.getURL(a.url, this.urlTarget); c || (a = { type: "clickSlice", dataItem: a, chart: this, event: b }, this.fire(a.type, a)) }, handleRightClick: function (a, b) { isNaN(a) || (a = this.chartData[a]); var c = { type: "rightClickSlice", dataItem: a, chart: this, event: b }; this.fire(c.type, c) }, drawTicks: function () { var a = this.chartData, b; for (b = 0; b < a.length; b++) { var c = a[b]; if (c.label) { var e = c.ty, e = d.line(this.container, [c.tx0, c.tx, c.tx2], [c.ty0, e, e], this.labelTickColor, this.labelTickAlpha); d.setCN(this, e, this.type + "-tick"); d.setCN(this, e, c.className, !0); c.tick = e; c.wedge.push(e) } } }, initialStart: function () { var a = this, b = a.startDuration, c = setTimeout(function () { a.showLabels.call(a) }, 1E3 * b); a.timeOuts.push(c); a.chartCreated ? a.pullSlices(!0) : (a.startSlices(), 0 < b ? (b = setTimeout(function () { a.pullSlices.call(a) }, 1200 * b), a.timeOuts.push(b)) : a.pullSlices(!0)) }, pullSlice: function (a, b, c) { var e = this.pullOutDuration; !0 === c && (e = 0); (c = a.wedge) && (0 < e ? c.animate({ translate: b * a.pullX + "," + b * a.pullY }, e, this.pullOutEffect) : c.translate(b * a.pullX, b * a.pullY)); 1 == b ? (a.pulled = !0, this.pullOutOnlyOne && this.pullInAll(a.index), a = { type: "pullOutSlice", dataItem: a, chart: this }) : (a.pulled = !1, a = { type: "pullInSlice", dataItem: a, chart: this }); this.fire(a.type, a) }, pullInAll: function (a) { var b = this.chartData, c; for (c = 0; c < this.chartData.length; c++) c != a && b[c].pulled && this.pullSlice(b[c], 0) }, pullOutAll: function () { var a = this.chartData, b; for (b = 0; b < a.length; b++) a[b].pulled || this.pullSlice(a[b], 1) }, parseData: function () { var a = []; this.chartData = a; var b = this.dataProvider; isNaN(this.pieAlpha) || (this.alpha = this.pieAlpha); if (void 0 !== b) { var c = b.length, e = 0, h, f, g; for (h = 0; h < c; h++) { f = {}; var k = b[h]; f.dataContext = k; f.value = Number(k[this.valueField]); (g = k[this.titleField]) || (g = ""); f.title = g; f.pulled = d.toBoolean(k[this.pulledField], !1); (g = k[this.descriptionField]) || (g = ""); f.description = g; f.labelRadius = Number(k[this.labelRadiusField]); f.switchable = !0; f.className = k[this.classNameField]; f.url = k[this.urlField]; g = k[this.patternField]; !g && this.patterns && (g = this.patterns[h]); f.pattern = g; f.visibleInLegend = d.toBoolean(k[this.visibleInLegendField], !0); g = k[this.alphaField]; f.alpha = void 0 !== g ? Number(g) : this.alpha; g = k[this.colorField]; void 0 !== g && (f.color = g); f.labelColor = d.toColor(k[this.labelColorField]); e += f.value; f.hidden = !1; a[h] = f } for (h = b = 0; h < c; h++) f = a[h], f.percents = f.value / e * 100, f.percents < this.groupPercent && b++; 1 < b && (this.groupValue = 0, this.removeSmallSlices(), a.push({ title: this.groupedTitle, value: this.groupValue, percents: this.groupValue / e * 100, pulled: this.groupedPulled, color: this.groupedColor, url: this.groupedUrl, description: this.groupedDescription, alpha: this.groupedAlpha, pattern: this.groupedPattern, className: this.groupedClassName, dataContext: {} })); c = this.baseColor; c || (c = this.pieBaseColor); e = this.brightnessStep; e || (e = this.pieBrightnessStep); for (h = 0; h < a.length; h++) c ? g = d.adjustLuminosity(c, h * e / 100) : (g = this.colors[h], void 0 === g && (g = d.randomColor())), void 0 === a[h].color && (a[h].color = g); this.recalculatePercents() } }, recalculatePercents: function () { var a = this.chartData, b = 0, c, e; for (c = 0; c < a.length; c++) e = a[c], !e.hidden && 0 < e.value && (b += e.value); for (c = 0; c < a.length; c++) e = this.chartData[c], e.percents = !e.hidden && 0 < e.value ? 100 * e.value / b : 0 }, removeSmallSlices: function () { var a = this.chartData, b; for (b = a.length - 1; 0 <= b; b--) a[b].percents < this.groupPercent && (this.groupValue += a[b].value, a.splice(b, 1)) }, animateAgain: function () { var a = this; a.startSlices(); for (var b = 0; b < a.chartData.length; b++) { var c = a.chartData[b]; c.started = !1; var e = c.wedge; e && e.translate(c.startX, c.startY) } b = a.startDuration; 0 < b ? (b = setTimeout(function () { a.pullSlices.call(a) }, 1200 * b), a.timeOuts.push(b)) : a.pullSlices() }, measureMaxLabel: function () { var a = this.chartData, b = 0, c; for (c = 0; c < a.length; c++) { var e = a[c], h = this.formatString(this.labelText, e), f = this.labelFunction; f && (h = f(e, h)); e = d.text(this.container, h, this.color, this.fontFamily, this.fontSize); h = e.getBBox().width; h > b && (b = h); e.remove() } return b } }) })(); (function () { var d = window.AmCharts; d.AmRectangularChart = d.Class({ inherits: d.AmCoordinateChart, construct: function (a) { d.AmRectangularChart.base.construct.call(this, a); this.theme = a; this.createEvents("zoomed"); this.marginRight = this.marginBottom = this.marginTop = this.marginLeft = 20; this.verticalPosition = this.horizontalPosition = this.depth3D = this.angle = 0; this.heightMultiplier = this.widthMultiplier = 1; this.plotAreaFillColors = "#FFFFFF"; this.plotAreaFillAlphas = 0; this.plotAreaBorderColor = "#000000"; this.plotAreaBorderAlpha = 0; this.zoomOutButtonImageSize = 19; this.zoomOutButtonImage = "lens.png"; this.zoomOutText = "Show all"; this.zoomOutButtonColor = "#e5e5e5"; this.zoomOutButtonAlpha = 0; this.zoomOutButtonRollOverAlpha = 1; this.zoomOutButtonPadding = 8; this.trendLines = []; this.autoMargins = !0; this.marginsUpdated = !1; this.autoMarginOffset = 10; d.applyTheme(this, a, "AmRectangularChart") }, initChart: function () { d.AmRectangularChart.base.initChart.call(this); this.updateDxy(); var a = !0; !this.marginsUpdated && this.autoMargins && (this.resetMargins(), a = !1); this.processScrollbars(); this.updateMargins(); this.updatePlotArea(); this.updateScrollbars(); this.updateTrendLines(); this.updateChartCursor(); this.updateValueAxes(); a && (this.scrollbarOnly || this.updateGraphs()) }, drawChart: function () { d.AmRectangularChart.base.drawChart.call(this); this.drawPlotArea(); if (d.ifArray(this.chartData)) { var a = this.chartCursor; a && a.draw() } }, resetMargins: function () { var a = {}, b; if ("xy" == this.type) { var c = this.xAxes, e = this.yAxes; for (b = 0; b < c.length; b++) { var d = c[b]; d.ignoreAxisWidth || (d.setOrientation(!0), d.fixAxisPosition(), a[d.position] = !0) } for (b = 0; b < e.length; b++) c = e[b], c.ignoreAxisWidth || (c.setOrientation(!1), c.fixAxisPosition(), a[c.position] = !0) } else { e = this.valueAxes; for (b = 0; b < e.length; b++) c = e[b], c.ignoreAxisWidth || (c.setOrientation(this.rotate), c.fixAxisPosition(), a[c.position] = !0); (b = this.categoryAxis) && !b.ignoreAxisWidth && (b.setOrientation(!this.rotate), b.fixAxisPosition(), b.fixAxisPosition(), a[b.position] = !0) } a.left && (this.marginLeft = 0); a.right && (this.marginRight = 0); a.top && (this.marginTop = 0); a.bottom && (this.marginBottom = 0); this.fixMargins = a }, measureMargins: function () { var a = this.valueAxes, b, c = this.autoMarginOffset, e = this.fixMargins, d = this.realWidth, f = this.realHeight, g = c, k = c, l = d; b = f; var m; for (m = 0; m < a.length; m++) b = this.getAxisBounds(a[m], g, l, k, b), g = Math.round(b.l), l = Math.round(b.r), k = Math.round(b.t), b = Math.round(b.b); if (a = this.categoryAxis) b = this.getAxisBounds(a, g, l, k, b), g = Math.round(b.l), l = Math.round(b.r), k = Math.round(b.t), b = Math.round(b.b); e.left && g < c && (this.marginLeft = Math.round(-g + c)); e.right && l >= d - c && (this.marginRight = Math.round(l - d + c)); e.top && k < c + this.titleHeight && (this.marginTop = Math.round(this.marginTop - k + c + this.titleHeight)); e.bottom && b > f - c && (this.marginBottom = Math.round(this.marginBottom + b - f + c)); this.initChart() }, getAxisBounds: function (a, b, c, e, d) { if (!a.ignoreAxisWidth) { var f = a.labelsSet, g = a.tickLength; a.inside && (g = 0); if (f) switch (f = a.getBBox(), a.position) { case "top": a = f.y; e > a && (e = a); break; case "bottom": a = f.y + f.height; d < a && (d = a); break; case "right": a = f.x + f.width + g + 3; c < a && (c = a); break; case "left": a = f.x - g, b > a && (b = a) } } return { l: b, t: e, r: c, b: d } }, drawZoomOutButton: function () { var a = this; if (!a.zbSet) { var b = a.container.set(); a.zoomButtonSet.push(b); var c = a.color, e = a.fontSize, h = a.zoomOutButtonImageSize, f = a.zoomOutButtonImage, g = d.lang.zoomOutText || a.zoomOutText, k = a.zoomOutButtonColor, l = a.zoomOutButtonAlpha, m = a.zoomOutButtonFontSize, n = a.zoomOutButtonPadding; isNaN(m) || (e = m); (m = a.zoomOutButtonFontColor) && (c = m); var m = a.zoomOutButton, q; m && (m.fontSize && (e = m.fontSize), m.color && (c = m.color), m.backgroundColor && (k = m.backgroundColor), isNaN(m.backgroundAlpha) || (a.zoomOutButtonRollOverAlpha = m.backgroundAlpha)); var p = m = 0; void 0 !== a.pathToImages && f && (q = a.container.image(a.pathToImages + f, 0, 0, h, h), d.setCN(a, q, "zoom-out-image"), b.push(q), q = q.getBBox(), m = q.width + 5); void 0 !== g && (c = d.text(a.container, g, c, a.fontFamily, e, "start"), d.setCN(a, c, "zoom-out-label"), e = c.getBBox(), p = q ? q.height / 2 - 3 : e.height / 2, c.translate(m, p), b.push(c)); q = b.getBBox(); c = 1; d.isModern || (c = 0); k = d.rect(a.container, q.width + 2 * n + 5, q.height + 2 * n - 2, k, 1, 1, k, c); k.setAttr("opacity", l); k.translate(-n, -n); d.setCN(a, k, "zoom-out-bg"); b.push(k); k.toBack(); a.zbBG = k; q = k.getBBox(); b.translate(a.marginLeftReal + a.plotAreaWidth - q.width + n, a.marginTopReal + n); b.hide(); b.mouseover(function () { a.rollOverZB() }).mouseout(function () { a.rollOutZB() }).click(function () { a.clickZB() }).touchstart(function () { a.rollOverZB() }).touchend(function () { a.rollOutZB(); a.clickZB() }); for (l = 0; l < b.length; l++) b[l].attr({ cursor: "pointer" }); a.zbSet = b } }, rollOverZB: function () { this.zbBG.setAttr("opacity", this.zoomOutButtonRollOverAlpha) }, rollOutZB: function () { this.zbBG.setAttr("opacity", this.zoomOutButtonAlpha) }, clickZB: function () { this.zoomOut() }, zoomOut: function () { this.updateScrollbar = !0; this.zoom() }, drawPlotArea: function () { var a = this.dx, b = this.dy, c = this.marginLeftReal, e = this.marginTopReal, h = this.plotAreaWidth - 1, f = this.plotAreaHeight - 1, g = this.plotAreaFillColors, k = this.plotAreaFillAlphas, l = this.plotAreaBorderColor, m = this.plotAreaBorderAlpha; "object" == typeof k && (k = k[0]); g = d.polygon(this.container, [0, h, h, 0, 0 ], [0, 0, f, f, 0], g, k, 1, l, m, this.plotAreaGradientAngle); d.setCN(this, g, "plot-area"); g.translate(c + a, e + b); this.set.push(g); 0 !== a && 0 !== b && (g = this.plotAreaFillColors, "object" == typeof g && (g = g[0]), g = d.adjustLuminosity(g, -.15), h = d.polygon(this.container, [0, a, h + a, h, 0], [0, b, b, 0, 0], g, k, 1, l, m), d.setCN(this, h, "plot-area-bottom"), h.translate(c, e + f), this.set.push(h), a = d.polygon(this.container, [0, 0, a, a, 0], [0, f, f + b, b, 0], g, k, 1, l, m), d.setCN(this, a, "plot-area-left"), a.translate(c, e), this.set.push(a)); (c = this.bbset) && this.scrollbarOnly && c.remove() }, updatePlotArea: function () { var a = this.updateWidth(), b = this.updateHeight(), c = this.container; this.realWidth = a; this.realWidth = b; c && this.container.setSize(a, b); a = a - this.marginLeftReal - this.marginRightReal - this.dx; b = b - this.marginTopReal - this.marginBottomReal; 1 > a && (a = 1); 1 > b && (b = 1); this.plotAreaWidth = Math.round(a); this.plotAreaHeight = Math.round(b) }, updateDxy: function () { this.dx = Math.round(this.depth3D * Math.cos(this.angle * Math.PI / 180)); this.dy = Math.round(-this.depth3D * Math.sin(this.angle * Math.PI / 180)); this.d3x = Math.round(this.columnSpacing3D * Math.cos(this.angle * Math.PI / 180)); this.d3y = Math.round(-this.columnSpacing3D * Math.sin(this.angle * Math.PI / 180)) }, updateMargins: function () { var a = this.getTitleHeight(); this.titleHeight = a; this.marginTopReal = this.marginTop - this.dy; this.fixMargins && !this.fixMargins.top && (this.marginTopReal += a); this.marginBottomReal = this.marginBottom; this.marginLeftReal = this.marginLeft; this.marginRightReal = this.marginRight }, updateValueAxes: function () { var a = this.valueAxes, b = this.marginLeftReal, c = this.marginTopReal, e = this.plotAreaHeight, h = this.plotAreaWidth, f; for (f = 0; f < a.length; f++) { var g = a[f]; g.axisRenderer = d.RecAxis; g.guideFillRenderer = d.RecFill; g.axisItemRenderer = d.RecItem; g.dx = this.dx; g.dy = this.dy; g.viW = h - 1; g.viH = e - 1; g.marginsChanged = !0; g.viX = b; g.viY = c; this.updateObjectSize(g) } }, updateObjectSize: function (a) { a.width = (this.plotAreaWidth - 1) * this.widthMultiplier; a.height = (this.plotAreaHeight - 1) * this.heightMultiplier; a.x = this.marginLeftReal + this.horizontalPosition; a.y = this.marginTopReal + this.verticalPosition }, updateGraphs: function () { var a = this.graphs, b; for (b = 0; b < a.length; b++) { var c = a[b]; c.x = this.marginLeftReal + this.horizontalPosition; c.y = this.marginTopReal + this.verticalPosition; c.width = this.plotAreaWidth * this.widthMultiplier; c.height = this.plotAreaHeight * this.heightMultiplier; c.index = b; c.dx = this.dx; c.dy = this.dy; c.rotate = this.rotate } }, updateChartCursor: function () { var a = this.chartCursor; a && (a = d.processObject(a, d.ChartCursor, this.theme), this.addChartCursor(a), a.x = this.marginLeftReal, a.y = this.marginTopReal, a.width = this.plotAreaWidth - 1, a.height = this.plotAreaHeight - 1, a.chart = this) }, processScrollbars: function () { var a = this.chartScrollbar; a && (a = d.processObject(a, d.ChartScrollbar, this.theme), this.addChartScrollbar(a)) }, updateScrollbars: function () {}, addChartCursor: function (a) { d.callMethod("destroy", [this.chartCursor]); a && (this.listenTo(a, "changed", this.handleCursorChange), this.listenTo(a, "zoomed", this.handleCursorZoom)); this.chartCursor = a }, removeChartCursor: function () { d.callMethod("destroy", [this.chartCursor]); this.chartCursor = null }, zoomTrendLines: function () { var a = this.trendLines, b; for (b = 0; b < a.length; b++) { var c = a[b]; c.valueAxis.recalculateToPercents ? c.set && c.set.hide() : (c.x = this.marginLeftReal + this.horizontalPosition, c.y = this.marginTopReal + this.verticalPosition, c.draw()) } }, addTrendLine: function (a) { this.trendLines.push(a) }, removeTrendLine: function (a) { var b = this.trendLines, c; for (c = b.length - 1; 0 <= c; c--) b[c] == a && b.splice(c, 1) }, adjustMargins: function (a, b) { var c = a.position, e = a.scrollbarHeight + a.offset; a.enabled && ("top" == c ? b ? this.marginLeftReal += e : this.marginTopReal += e : b ? this.marginRightReal += e : this.marginBottomReal += e) }, getScrollbarPosition: function (a, b, c) { a.position = b ? "bottom" == c || "left" == c ? "bottom" : "top" : "top" == c || "right" == c ? "bottom" : "top" }, updateChartScrollbar: function (a, b) { if (a) { a.rotate = b; var c = this.marginTopReal, e = this.marginLeftReal, d = a.scrollbarHeight, f = this.dx, g = this.dy, k = a.offset; "top" == a.position ? b ? (a.y = c, a.x = e - d - k) : (a.y = c - d + g - k, a.x = e + f) : b ? (a.y = c + g, a.x = e + this.plotAreaWidth + f + k) : (a.y = c + this.plotAreaHeight + k, a.x = this.marginLeftReal) } }, showZB: function (a) { var b = this.zbSet; a && (b = this.zoomOutText, "" !== b && b && this.drawZoomOutButton()); if (b = this.zbSet) this.zoomButtonSet.push(b), a ? b.show() : b.hide(), this.rollOutZB() }, handleReleaseOutside: function (a) { d.AmRectangularChart.base.handleReleaseOutside.call(this, a); (a = this.chartCursor) && a.handleReleaseOutside && a.handleReleaseOutside() }, handleMouseDown: function (a) { d.AmRectangularChart.base.handleMouseDown.call(this, a); var b = this.chartCursor; b && b.handleMouseDown(a) }, handleCursorChange: function () {}, update: function () { d.AmRectangularChart.base.update.call(this); this.chartCursor && this.chartCursor.update && this.chartCursor.update() } }) })(); (function () { var d = window.AmCharts; d.TrendLine = d.Class({ construct: function (a) { this.cname = "TrendLine"; this.createEvents("click"); this.isProtected = !1; this.dashLength = 0; this.lineColor = "#00CC00"; this.lineThickness = this.lineAlpha = 1; d.applyTheme(this, a, this.cname) }, draw: function () { var a = this; a.destroy(); var b = a.chart, c = b.container, e, h, f, g, k = a.categoryAxis, l = a.initialDate, m = a.initialCategory, n = a.finalDate, q = a.finalCategory, p = a.valueAxis, r = a.valueAxisX, t = a.initialXValue, u = a.finalXValue, z = a.initialValue, w = a.finalValue, x = p.recalculateToPercents, v = b.dataDateFormat; k && (l && (l = d.getDate(l, v, "fff"), a.initialDate = l, e = k.dateToCoordinate(l)), m && (e = k.categoryToCoordinate(m)), n && (n = d.getDate(n, v, "fff"), a.finalDate = n, h = k.dateToCoordinate(n)), q && (h = k.categoryToCoordinate(q))); r && !x && (isNaN(t) || (e = r.getCoordinate(t)), isNaN(u) || (h = r.getCoordinate(u))); p && !x && (isNaN(z) || (f = p.getCoordinate(z)), isNaN(w) || (g = p.getCoordinate(w))); isNaN(e) || isNaN(h) || isNaN(f) || isNaN(f) || (b.rotate ? (k = [f, g], h = [e, h]) : (k = [e, h], h = [f, g]), f = a.lineColor, e = d.line(c, k, h, f, a.lineAlpha, a.lineThickness, a.dashLength), g = k, l = h, q = k[1] - k[0], p = h[1] - h[0], 0 === q && (q = .01), 0 === p && (p = .01), m = q / Math.abs(q), n = p / Math.abs(p), p = q * p / Math.abs(q * p) * Math.sqrt(Math.pow(q, 2) + Math.pow(p, 2)), q = Math.asin(q / p), p = 90 * Math.PI / 180 - q, q = Math.abs(5 * Math.cos(p)), p = Math.abs(5 * Math.sin(p)), g.push(k[1] - m * p, k[0] - m * p), l.push(h[1] + n * q, h[0] + n * q), k = d.polygon(c, g, l, f, .005, 0), c = c.set([k, e]), c.translate(b.marginLeftReal, b.marginTopReal), b.trendLinesSet.push(c), d.setCN(b, e, "trend-line"), d.setCN(b, e, "trend-line-" + a.id), a.line = e, a.set = c, k.mouseup(function () { a.handleLineClick() }).mouseover(function () { a.handleLineOver() }).mouseout(function () { a.handleLineOut() }), k.touchend && k.touchend(function () { a.handleLineClick() }), c.clipRect(0, 0, b.plotAreaWidth, b.plotAreaHeight)) }, handleLineClick: function () { var a = { type: "click", trendLine: this, chart: this.chart }; this.fire(a.type, a) }, handleLineOver: function () { var a = this.rollOverColor; void 0 !== a && this.line.attr({ stroke: a }) }, handleLineOut: function () { this.line.attr({ stroke: this.lineColor }) }, destroy: function () { d.remove(this.set) } }) })(); (function () { var d = window.AmCharts; d.circle = function (a, b, c, e, h, f, g, k, l) { 0 >= b && (b = .001); if (void 0 == h || 0 === h) h = .01; void 0 === f && (f = "#000000"); void 0 === g && (g = 0); e = { fill: c, stroke: f, "fill-opacity": e, "stroke-width": h, "stroke-opacity": g }; a = isNaN(l) ? a.circle(0, 0, b).attr(e) : a.ellipse(0, 0, b, l).attr(e); k && a.gradient("radialGradient", [c, d.adjustLuminosity(c, -.6)]); return a }; d.text = function (a, b, c, e, h, f, g, k) { f || (f = "middle"); "right" == f && (f = "end"); "left" == f && (f = "start"); isNaN(k) && (k = 1); void 0 !== b && (b = String(b), d.isIE && !d.isModern && (b = b.replace("&", "&"), b = b.replace("&", "&"))); c = { fill: c, "font-family": e, "font-size": h, opacity: k }; !0 === g && (c["font-weight"] = "bold"); c["text-anchor"] = f; return a.text(b, c) }; d.polygon = function (a, b, c, e, h, f, g, k, l, m, n) { isNaN(f) && (f = .01); isNaN(k) && (k = h); var q = e, p = !1; "object" == typeof q && 1 < q.length && (p = !0, q = q[0]); void 0 === g && (g = q); h = { fill: q, stroke: g, "fill-opacity": h, "stroke-width": f, "stroke-opacity": k }; void 0 !== n && 0 < n && (h["stroke-dasharray"] = n); n = d.dx; f = d.dy; a.handDrawn && (c = d.makeHD(b, c, a.handDrawScatter), b = c[0], c = c[1]); g = Math.round; m && (g = d.doNothing); m = "M" + (g(b[0]) + n) + "," + (g(c[0]) + f); for (k = 1; k < b.length; k++) m += " L" + (g(b[k]) + n) + "," + (g(c[k]) + f); a = a.path(m + " Z").attr(h); p && a.gradient("linearGradient", e, l); return a }; d.rect = function (a, b, c, e, h, f, g, k, l, m, n) { if (isNaN(b) || isNaN(c)) return a.set(); isNaN(f) && (f = 0); void 0 === l && (l = 0); void 0 === m && (m = 270); isNaN(h) && (h = 0); var q = e, p = !1; "object" == typeof q && (q = q[0], p = !0); void 0 === g && (g = q); void 0 === k && (k = h); b = Math.round(b); c = Math.round(c); var r = 0, t = 0; 0 > b && (b = Math.abs(b), r = -b); 0 > c && (c = Math.abs(c), t = -c); r += d.dx; t += d.dy; h = { fill: q, stroke: g, "fill-opacity": h, "stroke-opacity": k }; void 0 !== n && 0 < n && (h["stroke-dasharray"] = n); a = a.rect(r, t, b, c, l, f).attr(h); p && a.gradient("linearGradient", e, m); return a }; d.bullet = function (a, b, c, e, h, f, g, k, l, m, n, q) { var p; "circle" == b && (b = "round"); switch (b) { case "round": p = d.circle(a, c / 2, e, h, f, g, k); break; case "square": p = d.polygon(a, [-c / 2, c / 2, c / 2, -c / 2], [c / 2, c / 2, -c / 2, -c / 2], e, h, f, g, k, m - 180); break; case "rectangle": p = d.polygon(a, [-c, c, c, -c ], [c / 2, c / 2, -c / 2, -c / 2], e, h, f, g, k, m - 180); break; case "diamond": p = d.polygon(a, [-c / 2, 0, c / 2, 0], [0, -c / 2, 0, c / 2], e, h, f, g, k); break; case "triangleUp": p = d.triangle(a, c, 0, e, h, f, g, k); break; case "triangleDown": p = d.triangle(a, c, 180, e, h, f, g, k); break; case "triangleLeft": p = d.triangle(a, c, 270, e, h, f, g, k); break; case "triangleRight": p = d.triangle(a, c, 90, e, h, f, g, k); break; case "bubble": p = d.circle(a, c / 2, e, h, f, g, k, !0); break; case "line": p = d.line(a, [-c / 2, c / 2], [0, 0], e, h, f, g, k); break; case "yError": p = a.set(); p.push(d.line(a, [0, 0], [-c / 2, c / 2], e, h, f)); p.push(d.line(a, [-l, l], [-c / 2, -c / 2], e, h, f)); p.push(d.line(a, [-l, l], [c / 2, c / 2], e, h, f)); break; case "xError": p = a.set(), p.push(d.line(a, [-c / 2, c / 2], [0, 0], e, h, f)), p.push(d.line(a, [-c / 2, -c / 2], [-l, l], e, h, f)), p.push(d.line(a, [c / 2, c / 2], [-l, l], e, h, f)) } p && p.pattern(n, NaN, q); return p }; d.triangle = function (a, b, c, e, d, f, g, k) { if (void 0 === f || 0 === f) f = 1; void 0 === g && (g = "#000"); void 0 === k && (k = 0); e = { fill: e, stroke: g, "fill-opacity": d, "stroke-width": f, "stroke-opacity": k }; b /= 2; var l; 0 === c && (l = " M" + -b + "," + b + " L0," + -b + " L" + b + "," + b + " Z"); 180 == c && (l = " M" + -b + "," + -b + " L0," + b + " L" + b + "," + -b + " Z"); 90 == c && (l = " M" + -b + "," + -b + " L" + b + ",0 L" + -b + "," + b + " Z"); 270 == c && (l = " M" + -b + ",0 L" + b + "," + b + " L" + b + "," + -b + " Z"); return a.path(l).attr(e) }; d.line = function (a, b, c, e, h, f, g, k, l, m, n) { if (a.handDrawn && !n) return d.handDrawnLine(a, b, c, e, h, f, g, k, l, m, n); f = { fill: "none", "stroke-width": f }; void 0 !== g && 0 < g && (f["stroke-dasharray"] = g); isNaN(h) || (f["stroke-opacity"] = h); e && (f.stroke = e); e = Math.round; m && (e = d.doNothing); m = d.dx; h = d.dy; g = "M" + (e(b[0]) + m) + "," + (e(c[0]) + h); for (k = 1; k < b.length; k++) g += " L" + (e(b[k]) + m) + "," + (e(c[k]) + h); if (d.VML) return a.path(g, void 0, !0).attr(f); l && (g += " M0,0 L0,0"); return a.path(g).attr(f) }; d.makeHD = function (a, b, c) { for (var d = [], h = [], f = 1; f < a.length; f++) for (var g = Number(a[f - 1]), k = Number(b[f - 1]), l = Number(a[f]), m = Number(b[f]), n = Math.sqrt(Math.pow(l - g, 2) + Math.pow(m - k, 2)), n = Math.round(n / 50) + 1, l = (l - g) / n, m = (m - k) / n, q = 0; q <= n; q++) { var p = g + q * l + Math.random() * c, r = k + q * m + Math.random() * c; d.push(p); h.push(r) } return [d, h] }; d.handDrawnLine = function (a, b, c, e, h, f, g, k, l, m) { var n, q = a.set(); for (n = 1; n < b.length; n++) for (var p = [b[n - 1], b[n]], r = [c[n - 1], c[n]], r = d.makeHD(p, r, a.handDrawScatter), p = r[0], r = r[1], t = 1; t < p.length; t++) q.push(d.line(a, [p[t - 1], p[t]], [r[t - 1], r[t]], e, h, f + Math.random() * a.handDrawThickness - a.handDrawThickness / 2, g, k, l, m, !0)); return q }; d.doNothing = function (a) { return a }; d.wedge = function (a, b, c, e, h, f, g, k, l, m, n, q, p) { var r = Math.round; f = r(f); g = r(g); k = r(k); var t = r(g / f * k), u = d.VML, z = 359.5 + f / 100; 359.94 < z && (z = 359.94); h >= z && (h = z); var w = 1 / 180 * Math.PI, z = b + Math.sin(e * w) * k, x = c - Math.cos(e * w) * t, v = b + Math.sin(e * w) * f, A = c - Math.cos(e * w) * g, B = b + Math.sin((e + h) * w) * f, D = c - Math.cos((e + h) * w) * g, C = b + Math.sin((e + h) * w) * k, w = c - Math.cos((e + h) * w) * t, I = { fill: d.adjustLuminosity(m.fill, -.2), "stroke-opacity": 0, "fill-opacity": m["fill-opacity"] }, H = 0; 180 < Math.abs(h) && (H = 1); e = a.set(); var O; u && (z = r(10 * z), v = r(10 * v), B = r(10 * B), C = r(10 * C), x = r(10 * x), A = r(10 * A), D = r(10 * D), w = r(10 * w), b = r(10 * b), l = r(10 * l), c = r(10 * c), f *= 10, g *= 10, k *= 10, t *= 10, 1 > Math.abs(h) && 1 >= Math.abs(B - v) && 1 >= Math.abs(D - A) && (O = !0)); h = ""; var J; q && (I["fill-opacity"] = 0, I["stroke-opacity"] = m["stroke-opacity"] / 2, I.stroke = m.stroke); 0 < l && (J = " M" + z + "," + (x + l) + " L" + v + "," + (A + l), u ? (O || (J += " A" + (b - f) + "," + (l + c - g) + "," + (b + f) + "," + (l + c + g) + "," + v + "," + (A + l) + "," + B + "," + (D + l)), J += " L" + C + "," + (w + l), 0 < k && (O || (J += " B" + (b - k) + "," + (l + c - t) + "," + (b + k) + "," + (l + c + t) + "," + C + "," + (l + w) + "," + z + "," + (l + x)))) : (J += " A" + f + "," + g + ",0," + H + ",1," + B + "," + (D + l) + " L" + C + "," + (w + l), 0 < k && (J += " A" + k + "," + t + ",0," + H + ",0," + z + "," + (x + l))), J = a.path(J + " Z", void 0, void 0, "1000,1000").attr(I), e.push(J), J = a.path(" M" + z + "," + x + " L" + z + "," + (x + l) + " L" + v + "," + (A + l) + " L" + v + "," + A + " L" + z + "," + x + " Z", void 0, void 0, "1000,1000").attr(I), l = a.path(" M" + B + "," + D + " L" + B + "," + (D + l) + " L" + C + "," + (w + l) + " L" + C + "," + w + " L" + B + "," + D + " Z", void 0, void 0, "1000,1000").attr(I), e.push(J), e.push(l)); u ? (O || (h = " A" + r(b - f) + "," + r(c - g) + "," + r(b + f) + "," + r(c + g) + "," + r(v) + "," + r(A) + "," + r(B) + "," + r(D)), f = " M" + r(z) + "," + r(x) + " L" + r(v) + "," + r(A) + h + " L" + r(C) + "," + r(w)) : f = " M" + z + "," + x + " L" + v + "," + A + (" A" + f + "," + g + ",0," + H + ",1," + B + "," + D) + " L" + C + "," + w; 0 < k && (u ? O || (f += " B" + (b - k) + "," + (c - t) + "," + (b + k) + "," + (c + t) + "," + C + "," + w + "," + z + "," + x) : f += " A" + k + "," + t + ",0," + H + ",0," + z + "," + x); a.handDrawn && (b = d.line(a, [z, v], [x, A], m.stroke, m.thickness * Math.random() * a.handDrawThickness, m["stroke-opacity"]), e.push(b)); a = a.path(f + " Z", void 0, void 0, "1000,1000").attr(m); if (n) { b = []; for (c = 0; c < n.length; c++) b.push(d.adjustLuminosity(m.fill, n[c])); 0 < b.length && a.gradient("linearGradient", b) } a.pattern(q, NaN, p); e.wedge = a; e.push(a); return e }; d.adjustLuminosity = function (a, b) { a = String(a).replace(/[^0-9a-f]/gi, ""); 6 > a.length && (a = String(a[0]) + String(a[0]) + String(a[1]) + String(a[1]) + String(a[2]) + String(a[2])); b = b || 0; var c = "#", d, h; for (h = 0; 3 > h; h++) d = parseInt(a.substr(2 * h, 2), 16), d = Math.round(Math.min(Math.max(0, d + d * b), 255)).toString(16), c += ("00" + d).substr(d.length); return c } })(); (function () { var d = window.AmCharts; d.Bezier = d.Class({ construct: function (a, b, c, e, h, f, g, k, l, m) { "object" == typeof g && (g = g[0]); "object" == typeof k && (k = k[0]); 0 === k && (g = "none"); f = { fill: g, "fill-opacity": k, "stroke-width": f }; void 0 !== l && 0 < l && (f["stroke-dasharray"] = l); isNaN(h) || (f["stroke-opacity"] = h); e && (f.stroke = e); e = "M" + Math.round(b[0]) + "," + Math.round(c[0]); h = []; for (l = 0; l < b.length; l++) h.push({ x: Number(b[l]), y: Number(c[l]) }); 1 < h.length && (b = this.interpolate(h), e += this.drawBeziers(b)); m ? e += m : d.VML || (e += "M0,0 L0,0"); this.path = a.path(e).attr(f); this.node = this.path.node }, interpolate: function (a) { var b = []; b.push({ x: a[0].x, y: a[0].y }); var c = a[1].x - a[0].x, e = a[1].y - a[0].y, h = d.bezierX, f = d.bezierY; b.push({ x: a[0].x + c / h, y: a[0].y + e / f }); var g; for (g = 1; g < a.length - 1; g++) { var k = a[g - 1], l = a[g], e = a[g + 1]; isNaN(e.x) && (e = l); isNaN(l.x) && (l = k); isNaN(k.x) && (k = l); c = e.x - l.x; e = e.y - k.y; k = l.x - k.x; k > c && (k = c); b.push({ x: l.x - k / h, y: l.y - e / f }); b.push({ x: l.x, y: l.y }); b.push({ x: l.x + k / h, y: l.y + e / f }) } e = a[a.length - 1].y - a[a.length - 2].y; c = a[a.length - 1].x - a[a.length - 2].x; b.push({ x: a[a.length - 1].x - c / h, y: a[a.length - 1].y - e / f }); b.push({ x: a[a.length - 1].x, y: a[a.length - 1].y }); return b }, drawBeziers: function (a) { var b = "", c; for (c = 0; c < (a.length - 1) / 3; c++) b += this.drawBezierMidpoint(a[3 * c], a[3 * c + 1], a[3 * c + 2], a[3 * c + 3]); return b }, drawBezierMidpoint: function (a, b, c, d) { var h = Math.round, f = this.getPointOnSegment(a, b, .75), g = this.getPointOnSegment(d, c, .75), k = (d.x - a.x) / 16, l = (d.y - a.y) / 16, m = this.getPointOnSegment(a, b, .375); a = this.getPointOnSegment(f, g, .375); a.x -= k; a.y -= l; b = this.getPointOnSegment(g, f, .375); b.x += k; b.y += l; c = this.getPointOnSegment(d, c, .375); k = this.getMiddle(m, a); f = this.getMiddle(f, g); g = this.getMiddle(b, c); m = " Q" + h(m.x) + "," + h(m.y) + "," + h(k.x) + "," + h(k.y); m += " Q" + h(a.x) + "," + h(a.y) + "," + h(f.x) + "," + h(f.y); m += " Q" + h(b.x) + "," + h(b.y) + "," + h(g.x) + "," + h(g.y); return m += " Q" + h(c.x) + "," + h(c.y) + "," + h(d.x) + "," + h(d.y) }, getMiddle: function (a, b) { return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 } }, getPointOnSegment: function (a, b, c) { return { x: a.x + (b.x - a.x) * c, y: a.y + (b.y - a.y) * c } } }) })(); (function () { var d = window.AmCharts; d.AmDraw = d.Class({ construct: function (a, b, c, e) { d.SVG_NS = "http://www.w3.org/2000/svg"; d.SVG_XLINK = "http://www.w3.org/1999/xlink"; d.hasSVG = !!document.createElementNS && !!document.createElementNS(d.SVG_NS, "svg").createSVGRect; 1 > b && (b = 10); 1 > c && (c = 10); this.div = a; this.width = b; this.height = c; this.rBin = document.createElement("div"); d.hasSVG ? (d.SVG = !0, b = this.createSvgElement("svg"), a.appendChild(b), this.container = b, this.addDefs(e), this.R = new d.SVGRenderer(this)) : d.isIE && d.VMLRenderer && (d.VML = !0, d.vmlStyleSheet || (document.namespaces.add("amvml", "urn:schemas-microsoft-com:vml"), 31 > document.styleSheets.length ? (b = document.createStyleSheet(), b.addRule(".amvml", "behavior:url(#default#VML); display:inline-block; antialias:true"), d.vmlStyleSheet = b) : document.styleSheets[0].addRule(".amvml", "behavior:url(#default#VML); display:inline-block; antialias:true")), this.container = a, this.R = new d.VMLRenderer(this, e), this.R.disableSelection(a)) }, createSvgElement: function (a) { return document.createElementNS(d.SVG_NS, a) }, circle: function (a, b, c, e) { var h = new d.AmDObject("circle", this); h.attr({ r: c, cx: a, cy: b }); this.addToContainer(h.node, e); return h }, ellipse: function (a, b, c, e, h) { var f = new d.AmDObject("ellipse", this); f.attr({ rx: c, ry: e, cx: a, cy: b }); this.addToContainer(f.node, h); return f }, setSize: function (a, b) { 0 < a && 0 < b && (this.container.style.width = a + "px", this.container.style.height = b + "px") }, rect: function (a, b, c, e, h, f, g) { var k = new d.AmDObject("rect", this); d.VML && (h = Math.round(100 * h / Math.min(c, e)), c += 2 * f, e += 2 * f, k.bw = f, k.node.style.marginLeft = -f, k.node.style.marginTop = -f); 1 > c && (c = 1); 1 > e && (e = 1); k.attr({ x: a, y: b, width: c, height: e, rx: h, ry: h, "stroke-width": f }); this.addToContainer(k.node, g); return k }, image: function (a, b, c, e, h, f) { var g = new d.AmDObject("image", this); g.attr({ x: b, y: c, width: e, height: h }); this.R.path(g, a); this.addToContainer(g.node, f); return g }, addToContainer: function (a, b) { b || (b = this.container); b.appendChild(a) }, text: function (a, b, c) { return this.R.text(a, b, c) }, path: function (a, b, c, e) { var h = new d.AmDObject("path", this); e || (e = "100,100"); h.attr({ cs: e }); c ? h.attr({ dd: a }) : h.attr({ d: a }); this.addToContainer(h.node, b); return h }, set: function (a) { return this.R.set(a) }, remove: function (a) { if (a) { var b = this.rBin; b.appendChild(a); b.innerHTML = "" } }, renderFix: function () { var a = this.container, b = a.style, c; try { c = a.getScreenCTM() || a.createSVGMatrix() } catch (d) { c = a.createSVGMatrix() } a = 1 - c.e % 1; c = 1 - c.f % 1; .5 < a && --a; .5 < c && --c; a && (b.left = a + "px"); c && (b.top = c + "px") }, update: function () { this.R.update() }, addDefs: function (a) { if (d.hasSVG) { var b = this.createSvgElement("desc"), c = this.container; c.setAttribute("version", "1.1"); c.style.position = "absolute"; this.setSize(this.width, this.height); d.rtl && (c.setAttribute("direction", "rtl"), c.style.left = "auto", c.style.right = "0px"); a.addCodeCredits && b.appendChild(document.createTextNode("JavaScript chart by amCharts " + a.version)); c.appendChild(b); a.defs && (b = this.createSvgElement("defs"), c.appendChild(b), d.parseDefs(a.defs, b), this.defs = b) } } }) })(); (function () { var d = window.AmCharts; d.AmDObject = d.Class({ construct: function (a, b) { this.D = b; this.R = b.R; this.node = this.R.create(this, a); this.y = this.x = 0; this.scale = 1 }, attr: function (a) { this.R.attr(this, a); return this }, getAttr: function (a) { return this.node.getAttribute(a) }, setAttr: function (a, b) { this.R.setAttr(this, a, b); return this }, clipRect: function (a, b, c, d) { this.R.clipRect(this, a, b, c, d) }, translate: function (a, b, c, d) { d || (a = Math.round(a), b = Math.round(b)); this.R.move(this, a, b, c); this.x = a; this.y = b; this.scale = c; this.angle && this.rotate(this.angle) }, rotate: function (a, b) { this.R.rotate(this, a, b); this.angle = a }, animate: function (a, b, c) { for (var e in a) if (a.hasOwnProperty(e)) { var h = e, f = a[e]; c = d.getEffect(c); this.R.animate(this, h, f, b, c) } }, push: function (a) { if (a) { var b = this.node; b.appendChild(a.node); var c = a.clipPath; c && b.appendChild(c); (a = a.grad) && b.appendChild(a) } }, text: function (a) { this.R.setText(this, a) }, remove: function () { this.R.remove(this) }, clear: function () { var a = this.node; if (a.hasChildNodes()) for (; 1 <= a.childNodes.length;) a.removeChild(a.firstChild) }, hide: function () { this.setAttr("visibility", "hidden") }, show: function () { this.setAttr("visibility", "visible") }, getBBox: function () { return this.R.getBBox(this) }, toFront: function () { var a = this.node; if (a) { this.prevNextNode = a.nextSibling; var b = a.parentNode; b && b.appendChild(a) } }, toPrevious: function () { var a = this.node; a && this.prevNextNode && (a = a.parentNode) && a.insertBefore(this.prevNextNode, null) }, toBack: function () { var a = this.node; if (a) { this.prevNextNode = a.nextSibling; var b = a.parentNode; if (b) { var c = b.firstChild; c && b.insertBefore(a, c) } } }, mouseover: function (a) { this.R.addListener(this, "mouseover", a); return this }, mouseout: function (a) { this.R.addListener(this, "mouseout", a); return this }, click: function (a) { this.R.addListener(this, "click", a); return this }, dblclick: function (a) { this.R.addListener(this, "dblclick", a); return this }, mousedown: function (a) { this.R.addListener(this, "mousedown", a); return this }, mouseup: function (a) { this.R.addListener(this, "mouseup", a); return this }, touchstart: function (a) { this.R.addListener(this, "touchstart", a); return this }, touchend: function (a) { this.R.addListener(this, "touchend", a); return this }, contextmenu: function (a) { this.node.addEventListener ? this.node.addEventListener("contextmenu", a, !0) : this.R.addListener(this, "contextmenu", a); return this }, stop: function () { d.removeFromArray(this.R.animations, this.an_x); d.removeFromArray(this.R.animations, this.an_y) }, length: function () { return this.node.childNodes.length }, gradient: function (a, b, c) { this.R.gradient(this, a, b, c) }, pattern: function (a, b, c) { a && this.R.pattern(this, a, b, c) } }) })(); (function () { var d = window.AmCharts; d.VMLRenderer = d.Class({ construct: function (a, b) { this.chart = b; this.D = a; this.cNames = { circle: "oval", ellipse: "oval", rect: "roundrect", path: "shape" }; this.styleMap = { x: "left", y: "top", width: "width", height: "height", "font-family": "fontFamily", "font-size": "fontSize", visibility: "visibility" } }, create: function (a, b) { var c; if ("group" == b) c = document.createElement("div"), a.type = "div"; else if ("text" == b) c = document.createElement("div"), a.type = "text"; else if ("image" == b) c = document.createElement("img"), a.type = "image"; else { a.type = "shape"; a.shapeType = this.cNames[b]; c = document.createElement("amvml:" + this.cNames[b]); var d = document.createElement("amvml:stroke"); c.appendChild(d); a.stroke = d; var h = document.createElement("amvml:fill"); c.appendChild(h); a.fill = h; h.className = "amvml"; d.className = "amvml"; c.className = "amvml" } c.style.position = "absolute"; c.style.top = 0; c.style.left = 0; return c }, path: function (a, b) { a.node.setAttribute("src", b) }, setAttr: function (a, b, c) { if (void 0 !== c) { var e; 8 === document.documentMode && (e = !0); var h = a.node, f = a.type, g = h.style; "r" == b && (g.width = 2 * c, g.height = 2 * c); "oval" == a.shapeType && ("rx" == b && (g.width = 2 * c), "ry" == b && (g.height = 2 * c)); "roundrect" == a.shapeType && ("width" != b && "height" != b || --c); "cursor" == b && (g.cursor = c); "cx" == b && (g.left = c - d.removePx(g.width) / 2); "cy" == b && (g.top = c - d.removePx(g.height) / 2); var k = this.styleMap[b]; void 0 !== k && (g[k] = c); "text" == f && ("text-anchor" == b && (a.anchor = c, k = h.clientWidth, "end" == c && (g.marginLeft = -k + "px"), "middle" == c && (g.marginLeft = -(k / 2) + "px", g.textAlign = "center"), "start" == c && (g.marginLeft = "0px")), "fill" == b && (g.color = c), "font-weight" == b && (g.fontWeight = c)); if (g = a.children) for (k = 0; k < g.length; k++) g[k].setAttr(b, c); if ("shape" == f) { "cs" == b && (h.style.width = "100px", h.style.height = "100px", h.setAttribute("coordsize", c)); "d" == b && h.setAttribute("path", this.svgPathToVml(c)); "dd" == b && h.setAttribute("path", c); f = a.stroke; a = a.fill; "stroke" == b && (e ? f.color = c : f.setAttribute("color", c)); "stroke-width" == b && (e ? f.weight = c : f.setAttribute("weight", c)); "stroke-opacity" == b && (e ? f.opacity = c : f.setAttribute("opacity", c)); "stroke-dasharray" == b && (g = "solid", 0 < c && 3 > c && (g = "dot"), 3 <= c && 6 >= c && (g = "dash"), 6 < c && (g = "longdash"), e ? f.dashstyle = g : f.setAttribute("dashstyle", g)); if ("fill-opacity" == b || "opacity" == b) 0 === c ? e ? a.on = !1 : a.setAttribute("on", !1) : e ? a.opacity = c : a.setAttribute("opacity", c); "fill" == b && (e ? a.color = c : a.setAttribute("color", c)); "rx" == b && (e ? h.arcSize = c + "%" : h.setAttribute("arcsize", c + "%")) } } }, attr: function (a, b) { for (var c in b) b.hasOwnProperty(c) && this.setAttr(a, c, b[c]) }, text: function (a, b, c) { var e = new d.AmDObject("text", this.D), h = e.node; h.style.whiteSpace = "pre"; h.innerHTML = a; this.D.addToContainer(h, c); this.attr(e, b); return e }, getBBox: function (a) { return this.getBox(a.node) }, getBox: function (a) { var b = a.offsetLeft, c = a.offsetTop, d = a.offsetWidth, h = a.offsetHeight, f; if (a.hasChildNodes()) { var g, k, l; for (l = 0; l < a.childNodes.length; l++) { f = this.getBox(a.childNodes[l]); var m = f.x; isNaN(m) || (isNaN(g) ? g = m : m < g && (g = m)); var n = f.y; isNaN(n) || (isNaN(k) ? k = n : n < k && (k = n)); m = f.width + m; isNaN(m) || (d = Math.max(d, m)); f = f.height + n; isNaN(f) || (h = Math.max(h, f)) } 0 > g && (b += g); 0 > k && (c += k) } return { x: b, y: c, width: d, height: h } }, setText: function (a, b) { var c = a.node; c && (c.innerHTML = b); this.setAttr(a, "text-anchor", a.anchor) }, addListener: function (a, b, c) { a.node["on" + b] = c }, move: function (a, b, c) { var e = a.node, h = e.style; "text" == a.type && (c -= d.removePx(h.fontSize) / 2 - 1); "oval" == a.shapeType && (b -= d.removePx(h.width) / 2, c -= d.removePx(h.height) / 2); a = a.bw; isNaN(a) || (b -= a, c -= a); isNaN(b) || isNaN(c) || (e.style.left = b + "px", e.style.top = c + "px") }, svgPathToVml: function (a) { var b = a.split(" "); a = ""; var c, d = Math.round, h; for (h = 0; h < b.length; h++) { var f = b[h], g = f.substring(0, 1), f = f.substring(1), k = f.split(","), l = d(k[0]) + "," + d(k[1]); "M" == g && (a += " m " + l); "L" == g && (a += " l " + l); "Z" == g && (a += " x e"); if ("Q" == g) { var m = c.length, n = c[m - 1], q = k[0], p = k[1], l = k[2], r = k[3]; c = d(c[m - 2] / 3 + 2 / 3 * q); n = d(n / 3 + 2 / 3 * p); q = d(2 / 3 * q + l / 3); p = d(2 / 3 * p + r / 3); a += " c " + c + "," + n + "," + q + "," + p + "," + l + "," + r } "A" == g && (a += " wa " + f); "B" == g && (a += " at " + f); c = k } return a }, animate: function (a, b, c, d, h) { var f = a.node, g = this.chart; if ("translate" == b) { b = c.split(","); c = b[1]; var k = f.offsetTop; g.animate(a, "left", f.offsetLeft, b[0], d, h, "px"); g.animate(a, "top", k, c, d, h, "px") } }, clipRect: function (a, b, c, d, h) { a = a.node; 0 === b && 0 === c ? (a.style.width = d + "px", a.style.height = h + "px", a.style.overflow = "hidden") : a.style.clip = "rect(" + c + "px " + (b + d) + "px " + (c + h) + "px " + b + "px)" }, rotate: function (a, b, c) { if (0 !== Number(b)) { var e = a.node; a = e.style; c || (c = this.getBGColor(e.parentNode)); a.backgroundColor = c; a.paddingLeft = 1; c = b * Math.PI / 180; var h = Math.cos(c), f = Math.sin(c), g = d.removePx(a.left), k = d.removePx(a.top), l = e.offsetWidth, e = e.offsetHeight; b /= Math.abs(b); a.left = g + l / 2 - l / 2 * Math.cos(c) - b * e / 2 * Math.sin(c) + 3; a.top = k - b * l / 2 * Math.sin(c) + b * e / 2 * Math.sin(c); a.cssText = a.cssText + "; filter:progid:DXImageTransform.Microsoft.Matrix(M11='" + h + "', M12='" + -f + "', M21='" + f + "', M22='" + h + "', sizingmethod='auto expand');" } }, getBGColor: function (a) { var b = "#FFFFFF"; if (a.style) { var c = a.style.backgroundColor; "" !== c ? b = c : a.parentNode && (b = this.getBGColor(a.parentNode)) } return b }, set: function (a) { var b = new d.AmDObject("group", this.D); this.D.container.appendChild(b.node); if (a) { var c; for (c = 0; c < a.length; c++) b.push(a[c]) } return b }, gradient: function (a, b, c, d) { var h = ""; "radialGradient" == b && (b = "gradientradial", c.reverse()); "linearGradient" == b && (b = "gradient"); var f; for (f = 0; f < c.length; f++) { var g = Math.round(100 * f / (c.length - 1)), h = h + (g + "% " + c[f]); f < c.length - 1 && (h += ",") } a = a.fill; 90 == d ? d = 0 : 270 == d ? d = 180 : 180 == d ? d = 90 : 0 === d && (d = 270); 8 === document.documentMode ? (a.type = b, a.angle = d) : (a.setAttribute("type", b), a.setAttribute("angle", d)); h && (a.colors.value = h) }, remove: function (a) { a.clipPath && this.D.remove(a.clipPath); this.D.remove(a.node) }, disableSelection: function (a) { void 0 !== typeof a.onselectstart && (a.onselectstart = function () { return !1 }); a.style.cursor = "default" }, pattern: function (a, b, c, e) { c = a.node; a = a.fill; var h = "none"; b.color && (h = b.color); c.fillColor = h; b = b.url; d.isAbsolute(b) || (b = e + b); 8 === document.documentMode ? (a.type = "tile", a.src = b) : (a.setAttribute("type", "tile"), a.setAttribute("src", b)) }, update: function () {} }) })(); (function () { var d = window.AmCharts; d.SVGRenderer = d.Class({ construct: function (a) { this.D = a; this.animations = [] }, create: function (a, b) { return document.createElementNS(d.SVG_NS, b) }, attr: function (a, b) { for (var c in b) b.hasOwnProperty(c) && this.setAttr(a, c, b[c]) }, setAttr: function (a, b, c) { void 0 !== c && a.node.setAttribute(b, c) }, animate: function (a, b, c, e, h) { var f = a.node; a["an_" + b] && d.removeFromArray(this.animations, a["an_" + b]); "translate" == b ? (f = (f = f.getAttribute("transform")) ? String(f).substring(10, f.length - 1) : "0,0", f = f.split(", ").join(" "), f = f.split(" ").join(","), 0 === f && (f = "0,0")) : f = Number(f.getAttribute(b)); c = { obj: a, frame: 0, attribute: b, from: f, to: c, time: e, effect: h }; this.animations.push(c); a["an_" + b] = c }, update: function () { var a, b = this.animations; for (a = b.length - 1; 0 <= a; a--) { var c = b[a], e = 1E3 * c.time / d.updateRate, h = c.frame + 1, f = c.obj, g = c.attribute, k, l, m; h <= e ? (c.frame++, "translate" == g ? (k = c.from.split(","), g = Number(k[0]), k = Number(k[1]), isNaN(k) && (k = 0), l = c.to.split(","), m = Number(l[0]), l = Number(l[1]), m = 0 === m - g ? m : Math.round(d[c.effect](0, h, g, m - g, e)), c = 0 === l - k ? l : Math.round(d[c.effect](0, h, k, l - k, e)), g = "transform", c = "translate(" + m + "," + c + ")") : (l = Number(c.from), k = Number(c.to), m = k - l, c = d[c.effect](0, h, l, m, e), isNaN(c) && (c = k), 0 === m && this.animations.splice(a, 1)), this.setAttr(f, g, c)) : ("translate" == g ? (l = c.to.split(","), m = Number(l[0]), l = Number(l[1]), f.translate(m, l)) : (k = Number(c.to), this.setAttr(f, g, k)), this.animations.splice(a, 1)) } }, getBBox: function (a) { if (a = a.node) try { return a.getBBox() } catch (b) {} return { width: 0, height: 0, x: 0, y: 0 } }, path: function (a, b) { a.node.setAttributeNS(d.SVG_XLINK, "xlink:href", b) }, clipRect: function (a, b, c, e, h) { var f = a.node, g = a.clipPath; g && this.D.remove(g); var k = f.parentNode; k && (f = document.createElementNS(d.SVG_NS, "clipPath"), g = d.getUniqueId(), f.setAttribute("id", g), this.D.rect(b, c, e, h, 0, 0, f), k.appendChild(f), b = "#", d.baseHref && !d.isIE && (b = this.removeTarget(window.location.href) + b), this.setAttr(a, "clip-path", "url(" + b + g + ")"), this.clipPathC++, a.clipPath = f) }, text: function (a, b, c) { var e = new d.AmDObject("text", this.D); a = String(a).split("\n"); var h = b["font-size"], f; for (f = 0; f < a.length; f++) { var g = this.create(null, "tspan"); g.appendChild(document.createTextNode(a[f])); g.setAttribute("y", (h + 2) * f + Math.round(h / 2)); g.setAttribute("x", 0); g.style.fontSize = h + "px"; e.node.appendChild(g) } e.node.setAttribute("y", Math.round(h / 2)); this.attr(e, b); this.D.addToContainer(e.node, c); return e }, setText: function (a, b) { var c = a.node; c && (c.removeChild(c.firstChild), c.appendChild(document.createTextNode(b))) }, move: function (a, b, c, d) { isNaN(b) && (b = 0); isNaN(c) && (c = 0); b = "translate(" + b + "," + c + ")"; d && (b = b + " scale(" + d + ")"); this.setAttr(a, "transform", b) }, rotate: function (a, b) { var c = a.node.getAttribute("transform"), d = "rotate(" + b + ")"; c && (d = c + " " + d); this.setAttr(a, "transform", d) }, set: function (a) { var b = new d.AmDObject("g", this.D); this.D.container.appendChild(b.node); if (a) { var c; for (c = 0; c < a.length; c++) b.push(a[c]) } return b }, addListener: function (a, b, c) { a.node["on" + b] = c }, gradient: function (a, b, c, e) { var h = a.node, f = a.grad; f && this.D.remove(f); b = document.createElementNS(d.SVG_NS, b); f = d.getUniqueId(); b.setAttribute("id", f); if (!isNaN(e)) { var g = 0, k = 0, l = 0, m = 0; 90 == e ? l = 100 : 270 == e ? m = 100 : 180 == e ? g = 100 : 0 === e && (k = 100); b.setAttribute("x1", g + "%"); b.setAttribute("x2", k + "%"); b.setAttribute("y1", l + "%"); b.setAttribute("y2", m + "%") } for (e = 0; e < c.length; e++) g = document.createElementNS(d.SVG_NS, "stop"), k = 100 * e / (c.length - 1), 0 === e && (k = 0), g.setAttribute("offset", k + "%"), g.setAttribute("stop-color", c[e]), b.appendChild(g); h.parentNode.appendChild(b); c = "#"; d.baseHref && !d.isIE && (c = this.removeTarget(window.location.href) + c); h.setAttribute("fill", "url(" + c + f + ")"); a.grad = b }, removeTarget: function (a) { return a.split("#")[0] }, pattern: function (a, b, c, e) { var h = a.node; isNaN(c) && (c = 1); var f = a.patternNode; f && this.D.remove(f); var f = document.createElementNS(d.SVG_NS, "pattern"), g = d.getUniqueId(), k = b; b.url && (k = b.url); d.isAbsolute(k) || (k = e + k); e = Number(b.width); isNaN(e) && (e = 4); var l = Number(b.height); isNaN(l) && (l = 4); e /= c; l /= c; c = b.x; isNaN(c) && (c = 0); var m = -Math.random() * Number(b.randomX); isNaN(m) || (c = m); m = b.y; isNaN(m) && (m = 0); var n = -Math.random() * Number(b.randomY); isNaN(n) || (m = n); f.setAttribute("id", g); f.setAttribute("width", e); f.setAttribute("height", l); f.setAttribute("patternUnits", "userSpaceOnUse"); f.setAttribute("xlink:href", k); b.color && (n = document.createElementNS(d.SVG_NS, "rect"), n.setAttributeNS(null, "height", e), n.setAttributeNS(null, "width", l), n.setAttributeNS(null, "fill", b.color), f.appendChild(n)); this.D.image(k, 0, 0, e, l, f).translate(c, m); k = "#"; d.baseHref && !d.isIE && (k = this.removeTarget(window.location.href) + k); h.setAttribute("fill", "url(" + k + g + ")"); a.patternNode = f; h.parentNode.appendChild(f) }, remove: function (a) { a.clipPath && this.D.remove(a.clipPath); a.grad && this.D.remove(a.grad); a.patternNode && this.D.remove(a.patternNode); this.D.remove(a.node) } }) })(); AmCharts.AmDSet = AmCharts.Class({ construct: function (d) { this.create("g") }, attr: function (d) { this.R.attr(this.node, d) }, move: function (d, a) { this.R.move(this.node, d, a) } }); (function () { var d = window.AmCharts; d.AmLegend = d.Class({ construct: function (a) { this.enabled = !0; this.cname = "AmLegend"; this.createEvents("rollOverMarker", "rollOverItem", "rollOutMarker", "rollOutItem", "showItem", "hideItem", "clickMarker", "rollOverItem", "rollOutItem", "clickLabel"); this.position = "bottom"; this.borderColor = this.color = "#000000"; this.borderAlpha = 0; this.markerLabelGap = 5; this.verticalGap = 10; this.align = "left"; this.horizontalGap = 0; this.spacing = 10; this.markerDisabledColor = "#AAB3B3"; this.markerType = "square"; this.markerSize = 16; this.markerBorderThickness = this.markerBorderAlpha = 1; this.marginBottom = this.marginTop = 0; this.marginLeft = this.marginRight = 20; this.autoMargins = !0; this.valueWidth = 50; this.switchable = !0; this.switchType = "x"; this.switchColor = "#FFFFFF"; this.rollOverColor = "#CC0000"; this.reversedOrder = !1; this.labelText = "[[title]]"; this.valueText = "[[value]]"; this.useMarkerColorForLabels = !1; this.rollOverGraphAlpha = 1; this.textClickEnabled = !1; this.equalWidths = !0; this.dateFormat = "DD-MM-YYYY"; this.backgroundColor = "#FFFFFF"; this.backgroundAlpha = 0; this.useGraphSettings = !1; this.showEntries = !0; d.applyTheme(this, a, this.cname) }, setData: function (a) { this.legendData = a; this.invalidateSize() }, invalidateSize: function () { this.destroy(); this.entries = []; this.valueLabels = []; var a = this.legendData; this.enabled && (d.ifArray(a) || d.ifArray(this.data)) && this.drawLegend() }, drawLegend: function () { var a = this.chart, b = this.position, c = this.width, e = a.divRealWidth, h = a.divRealHeight, f = this.div, g = this.legendData; this.data && (g = this.data); isNaN(this.fontSize) && (this.fontSize = a.fontSize); if ("right" == b || "left" == b) this.maxColumns = 1, this.autoMargins && (this.marginLeft = this.marginRight = 10); else if (this.autoMargins) { this.marginRight = a.marginRight; this.marginLeft = a.marginLeft; var k = a.autoMarginOffset; "bottom" == b ? (this.marginBottom = k, this.marginTop = 0) : (this.marginTop = k, this.marginBottom = 0) } c = void 0 !== c ? d.toCoordinate(c, e) : a.realWidth; "outside" == b ? (c = f.offsetWidth, h = f.offsetHeight, f.clientHeight && (c = f.clientWidth, h = f.clientHeight)) : (isNaN(c) || (f.style.width = c + "px"), f.className = "amChartsLegend " + a.classNamePrefix + "-legend-div"); this.divWidth = c; (b = this.container) ? (b.container.innerHTML = "", f.appendChild(b.container), b.width = c, b.height = h, b.addDefs(a)) : b = new d.AmDraw(f, c, h, a); this.container = b; this.lx = 0; this.ly = 8; h = this.markerSize; h > this.fontSize && (this.ly = h / 2 - 1); 0 < h && (this.lx += h + this.markerLabelGap); this.titleWidth = 0; if (h = this.title) h = d.text(this.container, h, this.color, a.fontFamily, this.fontSize, "start", !0), d.setCN(a, h, "legend-title"), h.translate(this.marginLeft, this.marginTop + this.verticalGap + this.ly + 1), a = h.getBBox(), this.titleWidth = a.width + 15, this.titleHeight = a.height + 6; this.index = this.maxLabelWidth = 0; if (this.showEntries) { for (a = 0; a < g.length; a++) this.createEntry(g[a]); for (a = this.index = 0; a < g.length; a++) this.createValue(g[a]) } this.arrangeEntries(); this.updateValues() }, arrangeEntries: function () { var a = this.position, b = this.marginLeft + this.titleWidth, c = this.marginRight, e = this.marginTop, h = this.marginBottom, f = this.horizontalGap, g = this.div, k = this.divWidth, l = this.maxColumns, m = this.verticalGap, n = this.spacing, q = k - c - b, p = 0, r = 0, t = this.container; this.set && this.set.remove(); var u = t.set(); this.set = u; var z = t.set(); u.push(z); var w = this.entries, x, v; for (v = 0; v < w.length; v++) { x = w[v].getBBox(); var A = x.width; A > p && (p = A); x = x.height; x > r && (r = x) } var A = r = 0, B = f, D = 0, C = 0; for (v = 0; v < w.length; v++) { var I = w[v]; this.reversedOrder && (I = w[w.length - v - 1]); x = I.getBBox(); var H; this.equalWidths ? H = f + A * (p + n + this.markerLabelGap) : (H = B, B = B + x.width + f + n); x.height > C && (C = x.height); H + x.width > q && 0 < v && 0 !== A && (r++, A = 0, H = f, B = H + x.width + f + n, D = D + C + m, C = 0); I.translate(H, D); A++; !isNaN(l) && A >= l && (A = 0, r++, D = D + C + m, C = 0); z.push(I) } x = z.getBBox(); l = x.height + 2 * m - 1; "left" == a || "right" == a ? (n = x.width + 2 * f, k = n + b + c, g.style.width = k + "px", this.ieW = k) : n = k - b - c - 1; c = d.polygon(this.container, [0, n, n, 0], [0, 0, l, l], this.backgroundColor, this.backgroundAlpha, 1, this.borderColor, this.borderAlpha); d.setCN(this.chart, c, "legend-bg"); u.push(c); u.translate(b, e); c.toBack(); b = f; if ("top" == a || "bottom" == a || "absolute" == a || "outside" == a) "center" == this.align ? b = f + (n - x.width) / 2 : "right" == this.align && (b = f + n - x.width); z.translate(b, m + 1); this.titleHeight > l && (l = this.titleHeight); a = l + e + h + 1; 0 > a && (a = 0); a > this.chart.divRealHeight && (g.style.top = "0px"); g.style.height = Math.round(a) + "px"; t.setSize(this.divWidth, a) }, createEntry: function (a) { if (!1 !== a.visibleInLegend) { var b = this.chart, c = a.markerType; a.legendEntryWidth = this.markerSize; c || (c = this.markerType); var e = a.color, h = a.alpha; a.legendKeyColor && (e = a.legendKeyColor()); a.legendKeyAlpha && (h = a.legendKeyAlpha()); var f; !0 === a.hidden && (f = e = this.markerDisabledColor); var g = a.pattern, k = a.customMarker; k || (k = this.customMarker); var l = this.container, m = this.markerSize, n = 0, q = 0, p = m / 2; if (this.useGraphSettings) { c = a.type; this.switchType = void 0; if ("line" == c || "step" == c || "smoothedLine" == c || "ohlc" == c) g = l.set(), a.hidden || (e = a.lineColorR, f = a.bulletBorderColorR), n = d.line(l, [0, 2 * m], [m / 2, m / 2], e, a.lineAlpha, a.lineThickness, a.dashLength), d.setCN(b, n, "graph-stroke"), g.push(n), a.bullet && (a.hidden || (e = a.bulletColorR), n = d.bullet(l, a.bullet, a.bulletSize, e, a.bulletAlpha, a.bulletBorderThickness, f, a.bulletBorderAlpha)) && (d.setCN(b, n, "graph-bullet"), n.translate(m + 1, m / 2), g.push(n)), p = 0, n = m, q = m / 3; else { var r; a.getGradRotation && (r = a.getGradRotation()); n = a.fillColorsR; !0 === a.hidden && (n = e); if (g = this.createMarker("rectangle", n, a.fillAlphas, a.lineThickness, e, a.lineAlpha, r, g)) p = m, g.translate(p, m / 2); n = m } d.setCN(b, g, "graph-" + c); d.setCN(b, g, "graph-" + a.id) } else k ? (b.path && (k = b.path + k), g = l.image(k, 0, 0, m, m)) : (g = this.createMarker(c, e, h, void 0, void 0, void 0, void 0, g)) && g.translate(m / 2, m / 2); d.setCN(b, g, "legend-marker"); this.addListeners(g, a); l = l.set([g]); this.switchable && a.switchable && l.setAttr("cursor", "pointer"); void 0 !== a.id && d.setCN(b, l, "legend-item-" + a.id); d.setCN(b, l, a.className, !0); (f = this.switchType) && "none" != f && 0 < m && ("x" == f ? (c = this.createX(), c.translate(m / 2, m / 2)) : c = this.createV(), c.dItem = a, !0 !== a.hidden ? "x" == f ? c.hide() : c.show() : "x" != f && c.hide(), this.switchable || c.hide(), this.addListeners(c, a), a.legendSwitch = c, l.push(c), d.setCN(b, c, "legend-switch")); f = this.color; a.showBalloon && this.textClickEnabled && void 0 !== this.selectedColor && (f = this.selectedColor); this.useMarkerColorForLabels && (f = e); !0 === a.hidden && (f = this.markerDisabledColor); e = d.massReplace(this.labelText, { "[[title]]": a.title }); c = this.fontSize; g && (m <= c && g.translate(p, m / 2 + this.ly - c / 2 + (c + 2 - m) / 2 - q), a.legendEntryWidth = g.getBBox().width); var t; e && (e = d.fixBrakes(e), a.legendTextReal = e, t = this.labelWidth, t = isNaN(t) ? d.text(this.container, e, f, b.fontFamily, c, "start") : d.wrappedText(this.container, e, f, b.fontFamily, c, "start", !1, t, 0), d.setCN(b, t, "legend-label"), t.translate(this.lx + n, this.ly), l.push(t), b = t.getBBox().width, this.maxLabelWidth < b && (this.maxLabelWidth = b)); this.entries[this.index] = l; a.legendEntry = this.entries[this.index]; a.legendLabel = t; this.index++ } }, addListeners: function (a, b) { var c = this; a && a.mouseover(function (a) { c.rollOverMarker(b, a) }).mouseout(function (a) { c.rollOutMarker(b, a) }).click(function (a) { c.clickMarker(b, a) }) }, rollOverMarker: function (a, b) { this.switchable && this.dispatch("rollOverMarker", a, b); this.dispatch("rollOverItem", a, b) }, rollOutMarker: function (a, b) { this.switchable && this.dispatch("rollOutMarker", a, b); this.dispatch("rollOutItem", a, b) }, clickMarker: function (a, b) { this.switchable && (!0 === a.hidden ? this.dispatch("showItem", a, b) : this.dispatch("hideItem", a, b)); this.dispatch("clickMarker", a, b) }, rollOverLabel: function (a, b) { a.hidden || (this.textClickEnabled && a.legendLabel && a.legendLabel.attr({ fill: this.rollOverColor }), this.dispatch("rollOverItem", a, b)) }, rollOutLabel: function (a, b) { if (!a.hidden) { if (this.textClickEnabled && a.legendLabel) { var c = this.color; void 0 !== this.selectedColor && a.showBalloon && (c = this.selectedColor); this.useMarkerColorForLabels && (c = a.lineColor, void 0 === c && (c = a.color)); a.legendLabel.attr({ fill: c }) } this.dispatch("rollOutItem", a, b) } }, clickLabel: function (a, b) { this.textClickEnabled ? a.hidden || this.dispatch("clickLabel", a, b) : this.switchable && (!0 === a.hidden ? this.dispatch("showItem", a, b) : this.dispatch("hideItem", a, b)) }, dispatch: function (a, b, c) { this.fire(a, { type: a, dataItem: b, target: this, event: c, chart: this.chart }) }, createValue: function (a) { var b = this, c = b.fontSize, e = b.chart; if (!1 !== a.visibleInLegend) { var h = b.maxLabelWidth; b.forceWidth && (h = b.labelWidth); b.equalWidths || (b.valueAlign = "left"); "left" == b.valueAlign && (h = a.legendEntry.getBBox().width); var f = h; if (b.valueText && 0 < b.valueWidth) { var g = b.color; b.useMarkerColorForValues && (g = a.color, a.legendKeyColor && (g = a.legendKeyColor())); !0 === a.hidden && (g = b.markerDisabledColor); var k = b.valueText, h = h + b.lx + b.markerLabelGap + b.valueWidth, l = "end"; "left" == b.valueAlign && (h -= b.valueWidth, l = "start"); g = d.text(b.container, k, g, b.chart.fontFamily, c, l); d.setCN(e, g, "legend-value"); g.translate(h, b.ly); b.entries[b.index].push(g); f += b.valueWidth + 2 * b.markerLabelGap; g.dItem = a; b.valueLabels.push(g) } b.index++; e = b.markerSize; e < c + 7 && (e = c + 7, d.VML && (e += 3)); c = b.container.rect(a.legendEntryWidth, 0, f, e, 0, 0).attr({ stroke: "none", fill: "#fff", "fill-opacity": .005 }); c.dItem = a; b.entries[b.index - 1].push(c); c.mouseover(function (c) { b.rollOverLabel(a, c) }).mouseout(function (c) { b.rollOutLabel(a, c) }).click(function (c) { b.clickLabel(a, c) }) } }, createV: function () { var a = this.markerSize; return d.polygon(this.container, [a / 5, a / 2, a - a / 5, a / 2], [a / 3, a - a / 5, a / 5, a / 1.7], this.switchColor) }, createX: function () { var a = (this.markerSize - 4) / 2, b = { stroke: this.switchColor, "stroke-width": 3 }, c = this.container, e = d.line(c, [-a, a], [-a, a]).attr(b), a = d.line(c, [-a, a], [a, -a]).attr(b); return this.container.set([e, a]) }, createMarker: function (a, b, c, e, h, f, g, k) { var l = this.markerSize, m = this.container; h || (h = this.markerBorderColor); h || (h = b); isNaN(e) && (e = this.markerBorderThickness); isNaN(f) && (f = this.markerBorderAlpha); return d.bullet(m, a, l, b, c, e, h, f, l, g, k, this.chart.path) }, validateNow: function () { this.invalidateSize() }, updateValues: function () { var a = this.valueLabels, b = this.chart, c, d = this.data; for (c = 0; c < a.length; c++) { var h = a[c], f = h.dItem, g = " "; if (d) f.value ? h.text(f.value) : h.text(""); else { var k; if (void 0 !== f.type) { k = f.currentDataItem; var l = this.periodValueText; f.legendPeriodValueText && (l = f.legendPeriodValueText); k ? (g = this.valueText, f.legendValueText && (g = f.legendValueText), g = b.formatString(g, k)) : l && (g = b.formatPeriodString(l, f)) } else g = b.formatString(this.valueText, f); if (l = this.valueFunction) k && (f = k), g = l(f, g); h.text(g) } } }, renderFix: function () { if (!d.VML) { var a = this.container; a && a.renderFix() } }, destroy: function () { this.div.innerHTML = ""; d.remove(this.set) } }) })(); (function () { var d = window.AmCharts; d.formatMilliseconds = function (a, b) { if (-1 != a.indexOf("fff")) { var c = b.getMilliseconds(), d = String(c); 10 > c && (d = "00" + c); 10 <= c && 100 > c && (d = "0" + c); a = a.replace(/fff/g, d) } return a }; d.extractPeriod = function (a) { var b = d.stripNumbers(a), c = 1; b != a && (c = Number(a.slice(0, a.indexOf(b)))); return { period: b, count: c } }; d.getDate = function (a, b, c) { return a instanceof Date ? d.newDate(a, c) : b && isNaN(a) ? d.stringToDate(a, b) : new Date(a) }; d.newDate = function (a, b) { return b && "fff" != b ? new Date(a) : d.useUTC ? new Date(a.getUTCFullYear(), a.getUTCMonth(), a.getUTCDate(), a.getUTCHours(), a.getUTCMinutes(), a.getUTCSeconds(), a.getUTCMilliseconds()) : new Date(a.getFullYear(), a.getMonth(), a.getDate(), a.getHours(), a.getMinutes(), a.getSeconds(), a.getMilliseconds()) }; d.resetDateToMin = function (a, b, c, e) { void 0 === e && (e = 1); var h, f, g, k, l, m, n; d.useUTC ? (h = a.getUTCFullYear(), f = a.getUTCMonth(), g = a.getUTCDate(), k = a.getUTCHours(), l = a.getUTCMinutes(), m = a.getUTCSeconds(), n = a.getUTCMilliseconds(), a = a.getUTCDay()) : (h = a.getFullYear(), f = a.getMonth(), g = a.getDate(), k = a.getHours(), l = a.getMinutes(), m = a.getSeconds(), n = a.getMilliseconds(), a = a.getDay()); switch (b) { case "YYYY": h = Math.floor(h / c) * c; f = 0; g = 1; n = m = l = k = 0; break; case "MM": f = Math.floor(f / c) * c; g = 1; n = m = l = k = 0; break; case "WW": g = a >= e ? g - a + e : g - (7 + a) + e; n = m = l = k = 0; break; case "DD": n = m = l = k = 0; break; case "hh": k = Math.floor(k / c) * c; n = m = l = 0; break; case "mm": l = Math.floor(l / c) * c; n = m = 0; break; case "ss": m = Math.floor(m / c) * c; n = 0; break; case "fff": n = Math.floor(n / c) * c } d.useUTC ? (a = new Date, a.setUTCFullYear(h, f, g), a.setUTCHours(k, l, m, n)) : a = new Date(h, f, g, k, l, m, n); return a }; d.getPeriodDuration = function (a, b) { void 0 === b && (b = 1); var c; switch (a) { case "YYYY": c = 316224E5; break; case "MM": c = 26784E5; break; case "WW": c = 6048E5; break; case "DD": c = 864E5; break; case "hh": c = 36E5; break; case "mm": c = 6E4; break; case "ss": c = 1E3; break; case "fff": c = 1 } return c * b }; d.intervals = { s: { nextInterval: "ss", contains: 1E3 }, ss: { nextInterval: "mm", contains: 60, count: 0 }, mm: { nextInterval: "hh", contains: 60, count: 1 }, hh: { nextInterval: "DD", contains: 24, count: 2 }, DD: { nextInterval: "", contains: Infinity, count: 3 } }; d.getMaxInterval = function (a, b) { var c = d.intervals; return a >= c[b].contains ? (a = Math.round(a / c[b].contains), b = c[b].nextInterval, d.getMaxInterval(a, b)) : "ss" == b ? c[b].nextInterval : b }; d.dayNames = "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "); d.shortDayNames = "Sun Mon Tue Wed Thu Fri Sat".split(" "); d.monthNames = "January February March April May June July August September October November December".split(" "); d.shortMonthNames = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "); d.getWeekNumber = function (a) { a = new Date(a); a.setHours(0, 0, 0); a.setDate(a.getDate() + 4 - (a.getDay() || 7)); var b = new Date(a.getFullYear(), 0, 1); return Math.ceil(((a - b) / 864E5 + 1) / 7) }; d.stringToDate = function (a, b) { var c = {}, e = [{ pattern: "YYYY", period: "year" }, { pattern: "YY", period: "year" }, { pattern: "MM", period: "month" }, { pattern: "M", period: "month" }, { pattern: "DD", period: "date" }, { pattern: "D", period: "date" }, { pattern: "JJ", period: "hours" }, { pattern: "J", period: "hours" }, { pattern: "HH", period: "hours" }, { pattern: "H", period: "hours" }, { pattern: "KK", period: "hours" }, { pattern: "K", period: "hours" }, { pattern: "LL", period: "hours" }, { pattern: "L", period: "hours" }, { pattern: "NN", period: "minutes" }, { pattern: "N", period: "minutes" }, { pattern: "SS", period: "seconds" }, { pattern: "S", period: "seconds" }, { pattern: "QQQ", period: "milliseconds" }, { pattern: "QQ", period: "milliseconds" }, { pattern: "Q", period: "milliseconds" } ], h = !0, f = b.indexOf("AA"); - 1 != f && (a.substr(f, 2), "pm" == a.toLowerCase && (h = !1)); var f = b, g, k, l; for (l = 0; l < e.length; l++) k = e[l].period, c[k] = 0, "date" == k && (c[k] = 1); for (l = 0; l < e.length; l++) if (g = e[l].pattern, k = e[l].period, -1 != b.indexOf(g)) { var m = d.getFromDateString(g, a, f); b = b.replace(g, ""); if ("KK" == g || "K" == g || "LL" == g || "L" == g) h || (m += 12); c[k] = m } d.useUTC ? (e = new Date, e.setUTCFullYear(c.year, c.month, c.date), e.setUTCHours(c.hours, c.minutes, c.seconds, c.milliseconds)) : e = new Date(c.year, c.month, c.date, c.hours, c.minutes, c.seconds, c.milliseconds); return e }; d.getFromDateString = function (a, b, c) { if (void 0 !== b) return c = c.indexOf(a), b = String(b), b = b.substr(c, a.length), "0" == b.charAt(0) && (b = b.substr(1, b.length - 1)), b = Number(b), isNaN(b) && (b = 0), -1 != a.indexOf("M") && b--, b }; d.formatDate = function (a, b, c) { c || (c = d); var e, h, f, g, k, l, m, n = d.getWeekNumber(a); d.useUTC ? (e = a.getUTCFullYear(), h = a.getUTCMonth(), f = a.getUTCDate(), g = a.getUTCDay(), k = a.getUTCHours(), l = a.getUTCMinutes(), m = a.getUTCSeconds(), a = a.getUTCMilliseconds()) : (e = a.getFullYear(), h = a.getMonth(), f = a.getDate(), g = a.getDay(), k = a.getHours(), l = a.getMinutes(), m = a.getSeconds(), a = a.getMilliseconds()); var q = String(e).substr(2, 2), p = h + 1; 9 > h && (p = "0" + p); var r = "0" + g; b = b.replace(/W/g, n); n = k; 24 == n && (n = 0); var t = n; 10 > t && (t = "0" + t); b = b.replace(/JJ/g, t); b = b.replace(/J/g, n); t = k; 0 === t && (t = 24, -1 != b.indexOf("H") && f--); n = f; 10 > f && (n = "0" + f); var u = t; 10 > u && (u = "0" + u); b = b.replace(/HH/g, u); b = b.replace(/H/g, t); t = k; 11 < t && (t -= 12); u = t; 10 > u && (u = "0" + u); b = b.replace(/KK/g, u); b = b.replace(/K/g, t); t = k; 0 === t && (t = 12); 12 < t && (t -= 12); u = t; 10 > u && (u = "0" + u); b = b.replace(/LL/g, u); b = b.replace(/L/g, t); t = l; 10 > t && (t = "0" + t); b = b.replace(/NN/g, t); b = b.replace(/N/g, l); l = m; 10 > l && (l = "0" + l); b = b.replace(/SS/g, l); b = b.replace(/S/g, m); m = a; 10 > m && (m = "00" + m); 100 > m && (m = "0" + m); l = a; 10 > l && (l = "00" + l); b = b.replace(/QQQ/g, m); b = b.replace(/QQ/g, l); b = b.replace(/Q/g, a); b = 12 > k ? b.replace(/A/g, "am") : b.replace(/A/g, "pm"); b = b.replace(/YYYY/g, "@IIII@"); b = b.replace(/YY/g, "@II@"); b = b.replace(/MMMM/g, "@XXXX@"); b = b.replace(/MMM/g, "@XXX@"); b = b.replace(/MM/g, "@XX@"); b = b.replace(/M/g, "@X@"); b = b.replace(/DD/g, "@RR@"); b = b.replace(/D/g, "@R@"); b = b.replace(/EEEE/g, "@PPPP@"); b = b.replace(/EEE/g, "@PPP@"); b = b.replace(/EE/g, "@PP@"); b = b.replace(/E/g, "@P@"); b = b.replace(/@IIII@/g, e); b = b.replace(/@II@/g, q); b = b.replace(/@XXXX@/g, c.monthNames[h]); b = b.replace(/@XXX@/g, c.shortMonthNames[h]); b = b.replace(/@XX@/g, p); b = b.replace(/@X@/g, h + 1); b = b.replace(/@RR@/g, n); b = b.replace(/@R@/g, f); b = b.replace(/@PPPP@/g, c.dayNames[g]); b = b.replace(/@PPP@/g, c.shortDayNames[g]); b = b.replace(/@PP@/g, r); return b = b.replace(/@P@/g, g) }; d.changeDate = function (a, b, c, e, h) { if (d.useUTC) return d.changeUTCDate(a, b, c, e, h); var f = -1; void 0 === e && (e = !0); void 0 === h && (h = !1); !0 === e && (f = 1); switch (b) { case "YYYY": a.setFullYear(a.getFullYear() + c * f); e || h || a.setDate(a.getDate() + 1); break; case "MM": b = a.getMonth(); a.setMonth(a.getMonth() + c * f); a.getMonth() > b + c * f && a.setDate(a.getDate() - 1); e || h || a.setDate(a.getDate() + 1); break; case "DD": a.setDate(a.getDate() + c * f); break; case "WW": a.setDate(a.getDate() + c * f * 7); break; case "hh": a.setHours(a.getHours() + c * f); break; case "mm": a.setMinutes(a.getMinutes() + c * f); break; case "ss": a.setSeconds(a.getSeconds() + c * f); break; case "fff": a.setMilliseconds(a.getMilliseconds() + c * f) } return a }; d.changeUTCDate = function (a, b, c, d, h) { var f = -1; void 0 === d && (d = !0); void 0 === h && (h = !1); !0 === d && (f = 1); switch (b) { case "YYYY": a.setUTCFullYear(a.getUTCFullYear() + c * f); d || h || a.setUTCDate(a.getUTCDate() + 1); break; case "MM": b = a.getUTCMonth(); a.setUTCMonth(a.getUTCMonth() + c * f); a.getUTCMonth() > b + c * f && a.setUTCDate(a.getUTCDate() - 1); d || h || a.setUTCDate(a.getUTCDate() + 1); break; case "DD": a.setUTCDate(a.getUTCDate() + c * f); break; case "WW": a.setUTCDate(a.getUTCDate() + c * f * 7); break; case "hh": a.setUTCHours(a.getUTCHours() + c * f); break; case "mm": a.setUTCMinutes(a.getUTCMinutes() + c * f); break; case "ss": a.setUTCSeconds(a.getUTCSeconds() + c * f); break; case "fff": a.setUTCMilliseconds(a.getUTCMilliseconds() + c * f) } return a } })();