/* * Kendo UI v2015.2.805 (http://www.telerik.com/kendo-ui) * Copyright 2015 Telerik AD. All rights reserved. * * Kendo UI commercial licenses may be obtained at * http://www.telerik.com/purchase/license-agreement/kendo-ui-complete * If you do not own a commercial license, this file shall be governed by the trial license terms. */ (function(f, define) { define([], f) })(function() { "bundle all"; ! function(e, t, n) { function i() {} function r(e, t) { if (t) return "'" + e.split("'").join("\\'").split('\\"').join('\\\\\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t") + "'"; var n = e.charAt(0), i = e.substring(1); return "=" === n ? "+(" + i + ")+" : ":" === n ? "+$kendoHtmlEncode(" + i + ")+" : ";" + e + ";$kendoOutput+=" } function o(e, t, n) { return e += "", t = t || 2, n = t - e.length, n ? V[t].substring(0, n) + e : e } function a(e) { var t = e.css(mt.support.transitions.css + "box-shadow") || e.css("box-shadow"), n = t ? t.match(Dt) || [0, 0, 0, 0, 0] : [0, 0, 0, 0, 0], i = kt.max(+n[3], +(n[4] || 0)); return { left: -n[1] + i, right: +n[1] + i, bottom: +n[2] + i } } function s(t, n) { var i, r, o, s, l, c, d, u, h = Ct.browser, p = "rtl" == t.css("direction"); return t.parent().hasClass("k-animation-container") ? (d = t.parent(".k-animation-container"), u = d[0].style, d.is(":hidden") && d.show(), i = St.test(u.width) || St.test(u.height), i || d.css({ width: t.outerWidth(), height: t.outerHeight(), boxSizing: "content-box", mozBoxSizing: "content-box", webkitBoxSizing: "content-box" })) : (r = a(t), o = t[0].style.width, s = t[0].style.height, l = St.test(o), c = St.test(s), h.opera && (r.left = r.right = r.bottom = 5), i = l || c, !l && (!n || n && o) && (o = t.outerWidth()), !c && (!n || n && s) && (s = t.outerHeight()), t.wrap(e("<div/>").addClass("k-animation-container").css({ width: o, height: s, marginLeft: r.left * (p ? 1 : -1), paddingLeft: r.left, paddingRight: r.right, paddingBottom: r.bottom })), i && t.css({ width: "100%", height: "100%", boxSizing: "border-box", mozBoxSizing: "border-box", webkitBoxSizing: "border-box" })), h.msie && kt.floor(h.version) <= 7 && (t.css({ zoom: 1 }), t.children(".k-menu").width(t.width())), t.parent() } function l(e) { var t = 1, n = arguments.length; for (t = 1; n > t; t++) c(e, arguments[t]); return e } function c(e, t) { var n, i, r, o, a, s = mt.data.ObservableArray, l = mt.data.LazyObservableArray, d = mt.data.DataSource, u = mt.data.HierarchicalDataSource; for (n in t) i = t[n], r = typeof i, o = r === Mt && null !== i ? i.constructor : null, o && o !== Array && o !== s && o !== l && o !== d && o !== u ? i instanceof Date ? e[n] = new Date(i.getTime()) : P(i.clone) ? e[n] = i.clone() : (a = e[n], e[n] = typeof a === Mt ? a || {} : {}, c(e[n], i)) : r !== Rt && (e[n] = i); return e } function d(e, t, i) { for (var r in t) if (t.hasOwnProperty(r) && t[r].test(e)) return r; return i !== n ? i : e } function u(e) { return e.replace(/([a-z][A-Z])/g, function(e) { return e.charAt(0) + "-" + e.charAt(1).toLowerCase() }) } function h(e) { return e.replace(/\-(\w)/g, function(e, t) { return t.toUpperCase() }) } function p(t, n) { var i, r = {}; return document.defaultView && document.defaultView.getComputedStyle ? (i = document.defaultView.getComputedStyle(t, ""), n && e.each(n, function(e, t) { r[t] = i.getPropertyValue(t) })) : (i = t.currentStyle, n && e.each(n, function(e, t) { r[t] = i[h(t)] })), mt.size(r) || (r = i), r } function f(e) { var t = p(e, ["overflow"]).overflow; return "auto" == t || "scroll" == t } function g(e) { var t, n = 0; for (t in e) e.hasOwnProperty(t) && "toJSON" != t && n++; return n } function m(e, n, i) { n || (n = "offset"); var r = e[n](); return Ct.browser.msie && (Ct.pointers || Ct.msPointers) && !i && (r.top -= t.pageYOffset - document.documentElement.scrollTop, r.left -= t.pageXOffset - document.documentElement.scrollLeft), r } function v(e) { var t = {}; return _t("string" == typeof e ? e.split(" ") : e, function(e) { t[e] = this }), t } function _(e) { return new mt.effects.Element(e) } function w(e, t, n, i) { return typeof e === It && (P(t) && (i = t, t = 400, n = !1), P(n) && (i = n, n = !1), typeof t === Ft && (n = t, t = 400), e = { effects: e, duration: t, reverse: n, complete: i }), vt({ effects: {}, duration: 400, reverse: !1, init: yt, teardown: yt, hide: !1 }, e, { completeCallback: e.complete, complete: yt }) } function b(t, n, i, r, o) { for (var a, s = 0, l = t.length; l > s; s++) a = e(t[s]), a.queue(function() { W.promise(a, w(n, i, r, o)) }); return t } function y(e, t, n, i) { return t && (t = t.split(" "), _t(t, function(t, n) { e.toggleClass(n, i) })), e } function k(e) { return ("" + e).replace(j, "&").replace(G, "<").replace(Y, ">").replace(q, """).replace($, "'") } function x(e, t) { var i; return 0 === t.indexOf("data") && (t = t.substring(4), t = t.charAt(0).toLowerCase() + t.substring(1)), t = t.replace(it, "-$1"), i = e.getAttribute("data-" + mt.ns + t), null === i ? i = n : "null" === i ? i = null : "true" === i ? i = !0 : "false" === i ? i = !1 : At.test(i) ? i = parseFloat(i) : tt.test(i) && !nt.test(i) && (i = Function("return (" + i + ")")()), i } function C(t, i) { var r, o, a = {}; for (r in i) o = x(t, r), o !== n && (et.test(r) && (o = mt.template(e("#" + o).html())), a[r] = o); return a } function S(t, n) { return e.contains(t, n) ? -1 : 1 } function T() { var t = e(this); return e.inArray(t.attr("data-" + mt.ns + "role"), ["slider", "rangeslider"]) > -1 || t.is(":visible") } function D(e, t) { var n = e.nodeName.toLowerCase(); return (/input|select|textarea|button|object/.test(n) ? !e.disabled : "a" === n ? e.href || t : t) && A(e) } function A(t) { return e.expr.filters.visible(t) && !e(t).parents().addBack().filter(function() { return "hidden" === e.css(this, "visibility") }).length } function E(e, t) { return new E.fn.init(e, t) } var I, P, M, z, F, R, H, B, L, N, O, V, U, W, j, G, q, $, Y, Q, K, X, Z, J, et, tt, nt, it, rt, ot, at, st, lt, ct, dt, ut, ht, pt, ft, gt, mt = t.kendo = t.kendo || { cultures: {} }, vt = e.extend, _t = e.each, wt = e.isArray, bt = e.proxy, yt = e.noop, kt = Math, xt = t.JSON || {}, Ct = {}, St = /%/, Tt = /\{(\d+)(:[^\}]+)?\}/g, Dt = /(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+(?:\.?)\d*)px\s*(\d+)?/i, At = /^(\+|-?)\d+(\.?)\d*$/, Et = "function", It = "string", Pt = "number", Mt = "object", zt = "null", Ft = "boolean", Rt = "undefined", Ht = {}, Bt = {}, Lt = [].slice, Nt = t.Globalize; mt.version = "2015.2.805", i.extend = function(e) { var t, n, i = function() {}, r = this, o = e && e.init ? e.init : function() { r.apply(this, arguments) }; i.prototype = r.prototype, n = o.fn = o.prototype = new i; for (t in e) n[t] = null != e[t] && e[t].constructor === Object ? vt(!0, {}, i.prototype[t], e[t]) : e[t]; return n.constructor = o, o.extend = r.extend, o }, i.prototype._initOptions = function(e) { this.options = l({}, this.options, e) }, P = mt.isFunction = function(e) { return "function" == typeof e }, M = function() { this._defaultPrevented = !0 }, z = function() { return this._defaultPrevented === !0 }, F = i.extend({ init: function() { this._events = {} }, bind: function(e, t, i) { var r, o, a, s, l, c = this, d = typeof e === It ? [e] : e, u = typeof t === Et; if (t === n) { for (r in e) c.bind(r, e[r]); return c } for (r = 0, o = d.length; o > r; r++) e = d[r], s = u ? t : t[e], s && (i && (a = s, s = function() { c.unbind(e, s), a.apply(c, arguments) }, s.original = a), l = c._events[e] = c._events[e] || [], l.push(s)); return c }, one: function(e, t) { return this.bind(e, t, !0) }, first: function(e, t) { var n, i, r, o, a = this, s = typeof e === It ? [e] : e, l = typeof t === Et; for (n = 0, i = s.length; i > n; n++) e = s[n], r = l ? t : t[e], r && (o = a._events[e] = a._events[e] || [], o.unshift(r)); return a }, trigger: function(e, t) { var n, i, r = this, o = r._events[e]; if (o) { for (t = t || {}, t.sender = r, t._defaultPrevented = !1, t.preventDefault = M, t.isDefaultPrevented = z, o = o.slice(), n = 0, i = o.length; i > n; n++) o[n].call(r, t); return t._defaultPrevented === !0 } return !1 }, unbind: function(e, t) { var i, r = this, o = r._events[e]; if (e === n) r._events = {}; else if (o) if (t) for (i = o.length - 1; i >= 0; i--)(o[i] === t || o[i].original === t) && o.splice(i, 1); else r._events[e] = []; return r } }), R = /^\w+/, H = /\$\{([^}]*)\}/g, B = /\\\}/g, L = /__CURLY__/g, N = /\\#/g, O = /__SHARP__/g, V = ["", "0", "00", "000", "0000"], I = { paramName: "data", useWithBlock: !0, render: function(e, t) { var n, i, r = ""; for (n = 0, i = t.length; i > n; n++) r += e(t[n]); return r }, compile: function(e, t) { var n, i, o, a = vt({}, this, t), s = a.paramName, l = s.match(R)[0], c = a.useWithBlock, d = "var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;"; if (P(e)) return e; for (d += c ? "with(" + s + "){" : "", d += "$kendoOutput=", i = e.replace(B, "__CURLY__").replace(H, "#=$kendoHtmlEncode($1)#").replace(L, "}").replace(N, "__SHARP__").split("#"), o = 0; i.length > o; o++) d += r(i[o], o % 2 === 0); d += c ? ";}" : ";", d += "return $kendoOutput;", d = d.replace(O, "#"); try { return n = Function(l, d), n._slotCount = Math.floor(i.length / 2), n } catch (u) { throw Error(mt.format("Invalid template:'{0}' Generated code:'{1}'", e, d)) } } }, function() { function e(e) { return a.lastIndex = 0, a.test(e) ? '"' + e.replace(a, function(e) { var t = s[e]; return typeof t === It ? t : "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4) }) + '"' : '"' + e + '"' } function t(o, a) { var s, c, d, u, h, p, f = n, g = a[o]; if (g && typeof g === Mt && typeof g.toJSON === Et && (g = g.toJSON(o)), typeof r === Et && (g = r.call(a, o, g)), p = typeof g, p === It) return e(g); if (p === Pt) return isFinite(g) ? g + "" : zt; if (p === Ft || p === zt) return g + ""; if (p === Mt) { if (!g) return zt; if (n += i, h = [], "[object Array]" === l.apply(g)) { for (u = g.length, s = 0; u > s; s++) h[s] = t(s, g) || zt; return d = 0 === h.length ? "[]" : n ? "[\n" + n + h.join(",\n" + n) + "\n" + f + "]" : "[" + h.join(",") + "]", n = f, d } if (r && typeof r === Mt) for (u = r.length, s = 0; u > s; s++) typeof r[s] === It && (c = r[s], d = t(c, g), d && h.push(e(c) + (n ? ": " : ":") + d)); else for (c in g) Object.hasOwnProperty.call(g, c) && (d = t(c, g), d && h.push(e(c) + (n ? ": " : ":") + d)); return d = 0 === h.length ? "{}" : n ? "{\n" + n + h.join(",\n" + n) + "\n" + f + "}" : "{" + h.join(",") + "}", n = f, d } } var n, i, r, a = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, s = { "\b": "\\b", " ": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, l = {}.toString; typeof Date.prototype.toJSON !== Et && (Date.prototype.toJSON = function() { var e = this; return isFinite(e.valueOf()) ? o(e.getUTCFullYear(), 4) + "-" + o(e.getUTCMonth() + 1) + "-" + o(e.getUTCDate()) + "T" + o(e.getUTCHours()) + ":" + o(e.getUTCMinutes()) + ":" + o(e.getUTCSeconds()) + "Z" : null }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() { return this.valueOf() }), typeof xt.stringify !== Et && (xt.stringify = function(e, o, a) { var s; if (n = "", i = "", typeof a === Pt) for (s = 0; a > s; s += 1) i += " "; else typeof a === It && (i = a); if (r = o, o && typeof o !== Et && (typeof o !== Mt || typeof o.length !== Pt)) throw Error("JSON.stringify"); return t("", { "": e }) }) }(), function() { function t(e) { if (e) { if (e.numberFormat) return e; if (typeof e === It) { var t = mt.cultures; return t[e] || t[e.split("-")[0]] || null } return null } return null } function i(e) { return e && (e = t(e)), e || mt.cultures.current } function r(e) { e.groupSizes = e.groupSize, e.percent.groupSizes = e.percent.groupSize, e.currency.groupSizes = e.currency.groupSize } function a(e, t, r) { r = i(r); var a = r.calendars.standard, s = a.days, l = a.months; return t = a.patterns[t] || t, t.replace(d, function(t) { var i, r, c; return "d" === t ? r = e.getDate() : "dd" === t ? r = o(e.getDate()) : "ddd" === t ? r = s.namesAbbr[e.getDay()] : "dddd" === t ? r = s.names[e.getDay()] : "M" === t ? r = e.getMonth() + 1 : "MM" === t ? r = o(e.getMonth() + 1) : "MMM" === t ? r = l.namesAbbr[e.getMonth()] : "MMMM" === t ? r = l.names[e.getMonth()] : "yy" === t ? r = o(e.getFullYear() % 100) : "yyyy" === t ? r = o(e.getFullYear(), 4) : "h" === t ? r = e.getHours() % 12 || 12 : "hh" === t ? r = o(e.getHours() % 12 || 12) : "H" === t ? r = e.getHours() : "HH" === t ? r = o(e.getHours()) : "m" === t ? r = e.getMinutes() : "mm" === t ? r = o(e.getMinutes()) : "s" === t ? r = e.getSeconds() : "ss" === t ? r = o(e.getSeconds()) : "f" === t ? r = kt.floor(e.getMilliseconds() / 100) : "ff" === t ? (r = e.getMilliseconds(), r > 99 && (r = kt.floor(r / 10)), r = o(r)) : "fff" === t ? r = o(e.getMilliseconds(), 3) : "tt" === t ? r = e.getHours() < 12 ? a.AM[0] : a.PM[0] : "zzz" === t ? (i = e.getTimezoneOffset(), c = 0 > i, r = ("" + kt.abs(i / 60)).split(".")[0], i = kt.abs(i) - 60 * r, r = (c ? "+" : "-") + o(r), r += ":" + o(i)) : ("zz" === t || "z" === t) && (r = e.getTimezoneOffset() / 60, c = 0 > r, r = ("" + kt.abs(r)).split(".")[0], r = (c ? "+" : "-") + ("zz" === t ? o(r) : r)), r !== n ? r : t.slice(1, t.length - 1) }) } function s(e, t, r) { r = i(r); var o, a, s, c, d, b, y, k, x, C, S, T, D, A, E, I, P, M, z, F, R, H, B, L = r.numberFormat, N = L.groupSize[0], O = L[m], V = L[g], U = L.decimals, W = L.pattern[0], j = [], G = 0 > e, q = f, $ = f, Y = -1; if (e === n) return f; if (!isFinite(e)) return e; if (!t) return r.name.length ? e.toLocaleString() : "" + e; if (d = u.exec(t)) { if (t = d[1].toLowerCase(), a = "c" === t, s = "p" === t, (a || s) && (L = a ? L.currency : L.percent, N = L.groupSize[0], O = L[m], V = L[g], U = L.decimals, o = L.symbol, W = L.pattern[G ? 0 : 1]), c = d[2], c && (U = +c), "e" === t) return c ? e.toExponential(U) : e.toExponential(); if (s && (e *= 100), e = l(e, U), G = 0 > e, e = e.split(g), b = e[0], y = e[1], G && (b = b.substring(1)), $ = b, k = b.length, k >= N) for ($ = f, C = 0; k > C; C++) C > 0 && (k - C) % N === 0 && ($ += O), $ += b.charAt(C); if (y && ($ += V + y), "n" === t && !G) return $; for (e = f, C = 0, S = W.length; S > C; C++) T = W.charAt(C), e += "n" === T ? $ : "$" === T || "%" === T ? o : T; return e } if (G && (e = -e), (t.indexOf("'") > -1 || t.indexOf('"') > -1 || t.indexOf("\\") > -1) && (t = t.replace(h, function(e) { var t = e.charAt(0).replace("\\", ""), n = e.slice(1).replace(t, ""); return j.push(n), w })), t = t.split(";"), G && t[1]) t = t[1], A = !0; else if (0 === e) { if (t = t[2] || t[0], -1 == t.indexOf(v) && -1 == t.indexOf(_)) return t } else t = t[0]; if (F = t.indexOf("%"), R = t.indexOf("$"), s = -1 != F, a = -1 != R, s && (e *= 100), a && "\\" === t[R - 1] && (t = t.split("\\").join(""), a = !1), (a || s) && (L = a ? L.currency : L.percent, N = L.groupSize[0], O = L[m], V = L[g], U = L.decimals, o = L.symbol), D = t.indexOf(m) > -1, D && (t = t.replace(p, f)), E = t.indexOf(g), S = t.length, -1 != E ? (y = ("" + e).split("e"), y = y[1] ? l(e, Math.abs(y[1])) : y[0], y = y.split(g)[1] || f, P = t.lastIndexOf(_) - E, I = t.lastIndexOf(v) - E, M = P > -1, z = I > -1, C = y.length, M || z || (t = t.substring(0, E) + t.substring(E + 1), S = t.length, E = -1, C = 0), M && P > I ? C = P : I > P && (z && C > I ? C = I : M && P > C && (C = P)), C > -1 && (e = l(e, C))) : e = l(e), I = t.indexOf(v), H = P = t.indexOf(_), Y = -1 == I && -1 != P ? P : -1 != I && -1 == P ? I : I > P ? P : I, I = t.lastIndexOf(v), P = t.lastIndexOf(_), B = -1 == I && -1 != P ? P : -1 != I && -1 == P ? I : I > P ? I : P, Y == S && (B = Y), -1 != Y) { if ($ = ("" + e).split(g), b = $[0], y = $[1] || f, k = b.length, x = y.length, G && -1 * e >= 0 && (G = !1), D) if (k === N && E - H > k) b = O + b; else if (k > N) { for ($ = f, C = 0; k > C; C++) C > 0 && (k - C) % N === 0 && ($ += O), $ += b.charAt(C); b = $ } for (e = t.substring(0, Y), G && !A && (e += "-"), C = Y; S > C; C++) { if (T = t.charAt(C), -1 == E) { if (k > B - C) { e += b; break } } else if (-1 != P && C > P && (q = f), k >= E - C && E - C > -1 && (e += b, C = E), E === C) { e += (y ? V : f) + y, C += B - E + 1; continue } T === _ ? (e += T, q = T) : T === v && (e += q) } if (B >= Y && (e += t.substring(B + 1)), a || s) { for ($ = f, C = 0, S = e.length; S > C; C++) T = e.charAt(C), $ += "$" === T || "%" === T ? o : T; e = $ } if (S = j.length) for (C = 0; S > C; C++) e = e.replace(w, j[C]) } return e } var l, c, d = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|"[^"]*"|'[^']*'/g, u = /^(n|c|p|e)(\d*)$/i, h = /(\\.)|(['][^']*[']?)|(["][^"]*["]?)/g, p = /\,/g, f = "", g = ".", m = ",", v = "#", _ = "0", w = "??", b = "en-US", y = {}.toString; mt.cultures["en-US"] = { name: b, numberFormat: { pattern: ["-n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], percent: { pattern: ["-n %", "n %"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "%" }, currency: { pattern: ["($n)", "$n"], decimals: 2, ",": ",", ".": ".", groupSize: [3], symbol: "$" } }, calendars: { standard: { days: { names: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], namesAbbr: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], namesShort: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] }, months: { names: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], namesAbbr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }, AM: ["AM", "am", "AM"], PM: ["PM", "pm", "PM"], patterns: { d: "M/d/yyyy", D: "dddd, MMMM dd, yyyy", F: "dddd, MMMM dd, yyyy h:mm:ss tt", g: "M/d/yyyy h:mm tt", G: "M/d/yyyy h:mm:ss tt", m: "MMMM dd", M: "MMMM dd", s: "yyyy'-'MM'-'ddTHH':'mm':'ss", t: "h:mm tt", T: "h:mm:ss tt", u: "yyyy'-'MM'-'dd HH':'mm':'ss'Z'", y: "MMMM, yyyy", Y: "MMMM, yyyy" }, "/": "/", ":": ":", firstDay: 0, twoDigitYearMax: 2029 } } }, mt.culture = function(e) { var i, o = mt.cultures; return e === n ? o.current : (i = t(e) || o[b], i.calendar = i.calendars.standard, o.current = i, Nt && !Nt.load && r(i.numberFormat), n) }, mt.findCulture = t, mt.getCulture = i, mt.culture(b), l = function(e, t) { return t = t || 0, e = ("" + e).split("e"), e = Math.round(+(e[0] + "e" + (e[1] ? +e[1] + t : t))), e = ("" + e).split("e"), e = +(e[0] + "e" + (e[1] ? +e[1] - t : -t)), e.toFixed(t) }, c = function(e, t, i) { if (t) { if ("[object Date]" === y.call(e)) return a(e, t, i); if (typeof e === Pt) return s(e, t, i) } return e !== n ? e : "" }, Nt && !Nt.load && (c = function(t, n, i) { return e.isPlainObject(i) && (i = i.name), Nt.format(t, n, i) }), mt.format = function(e) { var t = arguments; return e.replace(Tt, function(e, n, i) { var r = t[parseInt(n, 10) + 1]; return c(r, i ? i.substring(1) : "") }) }, mt._extractFormat = function(e) { return "{0:" === e.slice(0, 3) && (e = e.slice(3, e.length - 1)), e }, mt._activeElement = function() { try { return document.activeElement } catch (e) { return document.documentElement.activeElement } }, mt._round = l, mt.toString = c }(), function() { function t(e, t, n) { return !(e >= t && n >= e) } function i(e) { return e.charAt(0) } function r(t) { return e.map(t, i) } function o(e, t) { t || 23 !== e.getHours() || e.setHours(e.getHours() + 2) } function a(e) { for (var t = 0, n = e.length, i = []; n > t; t++) i[t] = (e[t] + "").toLowerCase(); return i } function s(e) { var t, n = {}; for (t in e) n[t] = a(e[t]); return n } function l(e, i, a) { if (!e) return null; var l, c, d, u, f, g, m, _, w, b, y, k, x, C = function(e) { for (var t = 0; i[H] === e;) t++, H++; return t > 0 && (H -= 1), t }, S = function(t) { var n = v[t] || RegExp("^\\d{1," + t + "}"), i = e.substr(B, t).match(n); return i ? (i = i[0], B += i.length, parseInt(i, 10)) : null }, T = function(t, n) { for (var i, r, o, a = 0, s = t.length, l = 0, c = 0; s > a; a++) i = t[a], r = i.length, o = e.substr(B, r), n && (o = o.toLowerCase()), o == i && r > l && (l = r, c = a); return l ? (B += l, c + 1) : null }, D = function() { var t = !1; return e.charAt(B) === i[H] && (B++, t = !0), t }, A = a.calendars.standard, E = null, I = null, P = null, M = null, z = null, F = null, R = null, H = 0, B = 0, L = !1, N = new Date, O = A.twoDigitYearMax || 2029, V = N.getFullYear(); for (i || (i = "d"), u = A.patterns[i], u && (i = u), i = i.split(""), d = i.length; d > H; H++) if (l = i[H], L) "'" === l ? L = !1 : D(); else if ("d" === l) { if (c = C("d"), A._lowerDays || (A._lowerDays = s(A.days)), null !== P && c > 2) continue; if (P = 3 > c ? S(2) : T(A._lowerDays[3 == c ? "namesAbbr" : "names"], !0), null === P || t(P, 1, 31)) return null } else if ("M" === l) { if (c = C("M"), A._lowerMonths || (A._lowerMonths = s(A.months)), I = 3 > c ? S(2) : T(A._lowerMonths[3 == c ? "namesAbbr" : "names"], !0), null === I || t(I, 1, 12)) return null; I -= 1 } else if ("y" === l) { if (c = C("y"), E = S(c), null === E) return null; 2 == c && ("string" == typeof O && (O = V + parseInt(O, 10)), E = V - V % 100 + E, E > O && (E -= 100)) } else if ("h" === l) { if (C("h"), M = S(2), 12 == M && (M = 0), null === M || t(M, 0, 11)) return null } else if ("H" === l) { if (C("H"), M = S(2), null === M || t(M, 0, 23)) return null } else if ("m" === l) { if (C("m"), z = S(2), null === z || t(z, 0, 59)) return null } else if ("s" === l) { if (C("s"), F = S(2), null === F || t(F, 0, 59)) return null } else if ("f" === l) { if (c = C("f"), x = e.substr(B, c).match(v[3]), R = S(c), null !== R && (x = x[0].length, 3 > x && (R *= Math.pow(10, 3 - x)), c > 3 && (R = parseInt(("" + R).substring(0, 3), 10))), null === R || t(R, 0, 999)) return null } else if ("t" === l) { if (c = C("t"), _ = A.AM, w = A.PM, 1 === c && (_ = r(_), w = r(w)), f = T(w), !f && !T(_)) return null } else if ("z" === l) { if (g = !0, c = C("z"), "Z" === e.substr(B, 1)) { D(); continue } if (m = e.substr(B, 6).match(c > 2 ? p : h), !m) return null; if (m = m[0].split(":"), b = m[0], y = m[1], !y && b.length > 3 && (B = b.length - 2, y = b.substring(B), b = b.substring(0, B)), b = parseInt(b, 10), t(b, -12, 13)) return null; if (c > 2 && (y = parseInt(y, 10), isNaN(y) || t(y, 0, 59))) return null } else if ("'" === l) L = !0, D(); else if (!D()) return null; return k = null !== M || null !== z || F || null, null === E && null === I && null === P && k ? (E = V, I = N.getMonth(), P = N.getDate()) : (null === E && (E = V), null === P && (P = 1)), f && 12 > M && (M += 12), g ? (b && (M += -b), y && (z += -y), e = new Date(Date.UTC(E, I, P, M, z, F, R))) : (e = new Date(E, I, P, M, z, F, R), o(e, M)), 100 > E && e.setFullYear(E), e.getDate() !== P && g === n ? null : e } function c(e) { var t = "-" === e.substr(0, 1) ? -1 : 1; return e = e.substring(1), e = 60 * parseInt(e.substr(0, 2), 10) + parseInt(e.substring(2), 10), t * e } var d = /\u00A0/g, u = /[eE][\-+]?[0-9]+/, h = /[+|\-]\d{1,2}/, p = /[+|\-]\d{1,2}:?\d{2}/, f = /^\/Date\((.*?)\)\/$/, g = /[+-]\d*/, m = ["G", "g", "d", "F", "D", "y", "m", "T", "t"], v = { 2: /^\d{1,2}/, 3: /^\d{1,3}/, 4: /^\d{4}/ }, _ = {}.toString; mt.parseDate = function(e, t, n) { var i, r, o, a, s; if ("[object Date]" === _.call(e)) return e; if (i = 0, r = null, e && 0 === e.indexOf("/D") && (r = f.exec(e))) return r = r[1], s = g.exec(r.substring(1)), r = new Date(parseInt(r, 10)), s && (s = c(s[0]), r = mt.timezone.apply(r, 0), r = mt.timezone.convert(r, 0, -1 * s)), r; if (n = mt.getCulture(n), !t) { for (t = [], a = n.calendar.patterns, o = m.length; o > i; i++) t[i] = a[m[i]]; i = 0, t = ["yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "ddd MMM dd yyyy HH:mm:ss", "yyyy-MM-ddTHH:mm:ss.fffffffzzz", "yyyy-MM-ddTHH:mm:ss.fffzzz", "yyyy-MM-ddTHH:mm:sszzz", "yyyy-MM-ddTHH:mm:ss.fffffff", "yyyy-MM-ddTHH:mm:ss.fff", "yyyy-MM-ddTHH:mmzzz", "yyyy-MM-ddTHH:mmzz", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "HH:mm:ss", "HH:mm"].concat(t) } for (t = wt(t) ? t : [t], o = t.length; o > i; i++) if (r = l(e, t[i], n)) return r; return r }, mt.parseInt = function(e, t) { var n = mt.parseFloat(e, t); return n && (n = 0 | n), n }, mt.parseFloat = function(e, t, n) { if (!e && 0 !== e) return null; if (typeof e === Pt) return e; e = "" + e, t = mt.getCulture(t); var i, r, o = t.numberFormat, a = o.percent, s = o.currency, l = s.symbol, c = a.symbol, h = e.indexOf("-"); return u.test(e) ? (e = parseFloat(e.replace(o["."], ".")), isNaN(e) && (e = null), e) : h > 0 ? null : (h = h > -1, e.indexOf(l) > -1 || n && n.toLowerCase().indexOf("c") > -1 ? (o = s, i = o.pattern[0].replace("$", l).split("n"), e.indexOf(i[0]) > -1 && e.indexOf(i[1]) > -1 && (e = e.replace(i[0], "").replace(i[1], ""), h = !0)) : e.indexOf(c) > -1 && (r = !0, o = a, l = c), e = e.replace("-", "").replace(l, "").replace(d, " ").split(o[","].replace(d, " ")).join("").replace(o["."], "."), e = parseFloat(e), isNaN(e) ? e = null : h && (e *= -1), e && r && (e /= 100), e) }, Nt && !Nt.load && (mt.parseDate = function(e, t, n) { return "[object Date]" === _.call(e) ? e : Nt.parseDate(e, t, n) }, mt.parseFloat = function(t, i) { return typeof t === Pt ? t : t === n || null === t ? null : (e.isPlainObject(i) && (i = i.name), t = Nt.parseFloat(t, i), isNaN(t) ? null : t) }) }(), function() { var i, r, o, a, s, l, c; Ct._scrollbar = n, Ct.scrollbar = function(e) { if (isNaN(Ct._scrollbar) || e) { var t, n = document.createElement("div"); return n.style.cssText = "overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block", n.innerHTML = " ", document.body.appendChild(n), Ct._scrollbar = t = n.offsetWidth - n.scrollWidth, document.body.removeChild(n), t } return Ct._scrollbar }, Ct.isRtl = function(t) { return e(t).closest(".k-rtl").length > 0 }, i = document.createElement("table"); try { i.innerHTML = "<tr><td></td></tr>", Ct.tbodyInnerHtml = !0 } catch (u) { Ct.tbodyInnerHtml = !1 } Ct.touch = "ontouchstart" in t, Ct.msPointers = t.MSPointerEvent, Ct.pointers = t.PointerEvent, r = Ct.transitions = !1, o = Ct.transforms = !1, a = "HTMLElement" in t ? HTMLElement.prototype : [], Ct.hasHW3D = "WebKitCSSMatrix" in t && "m11" in new t.WebKitCSSMatrix || "MozPerspective" in document.documentElement.style || "msPerspective" in document.documentElement.style, _t(["Moz", "webkit", "O", "ms"], function() { var e, t = "" + this, a = typeof i.style[t + "Transition"] === It; return a || typeof i.style[t + "Transform"] === It ? (e = t.toLowerCase(), o = { css: "ms" != e ? "-" + e + "-" : "", prefix: t, event: "o" === e || "webkit" === e ? e : "" }, a && (r = o, r.event = r.event ? r.event + "TransitionEnd" : "transitionend"), !1) : n }), i = null, Ct.transforms = o, Ct.transitions = r, Ct.devicePixelRatio = t.devicePixelRatio === n ? 1 : t.devicePixelRatio; try { Ct.screenWidth = t.outerWidth || t.screen ? t.screen.availWidth : t.innerWidth, Ct.screenHeight = t.outerHeight || t.screen ? t.screen.availHeight : t.innerHeight } catch (u) { Ct.screenWidth = t.screen.availWidth, Ct.screenHeight = t.screen.availHeight } Ct.detectOS = function(e) { var n, i, r = !1, o = [], a = !/mobile safari/i.test(e), s = { wp: /(Windows Phone(?: OS)?)\s(\d+)\.(\d+(\.\d+)?)/, fire: /(Silk)\/(\d+)\.(\d+(\.\d+)?)/, android: /(Android|Android.*(?:Opera|Firefox).*?\/)\s*(\d+)\.(\d+(\.\d+)?)/, iphone: /(iPhone|iPod).*OS\s+(\d+)[\._]([\d\._]+)/, ipad: /(iPad).*OS\s+(\d+)[\._]([\d_]+)/, meego: /(MeeGo).+NokiaBrowser\/(\d+)\.([\d\._]+)/, webos: /(webOS)\/(\d+)\.(\d+(\.\d+)?)/, blackberry: /(BlackBerry|BB10).*?Version\/(\d+)\.(\d+(\.\d+)?)/, playbook: /(PlayBook).*?Tablet\s*OS\s*(\d+)\.(\d+(\.\d+)?)/, windows: /(MSIE)\s+(\d+)\.(\d+(\.\d+)?)/, tizen: /(tizen).*?Version\/(\d+)\.(\d+(\.\d+)?)/i, sailfish: /(sailfish).*rv:(\d+)\.(\d+(\.\d+)?).*firefox/i, ffos: /(Mobile).*rv:(\d+)\.(\d+(\.\d+)?).*Firefox/ }, l = { ios: /^i(phone|pad|pod)$/i, android: /^android|fire$/i, blackberry: /^blackberry|playbook/i, windows: /windows/, wp: /wp/, flat: /sailfish|ffos|tizen/i, meego: /meego/ }, c = { tablet: /playbook|ipad|fire/i }, u = { omini: /Opera\sMini/i, omobile: /Opera\sMobi/i, firefox: /Firefox|Fennec/i, mobilesafari: /version\/.*safari/i, ie: /MSIE|Windows\sPhone/i, chrome: /chrome|crios/i, webkit: /webkit/i }; for (i in s) if (s.hasOwnProperty(i) && (o = e.match(s[i]))) { if ("windows" == i && "plugins" in navigator) return !1; r = {}, r.device = i, r.tablet = d(i, c, !1), r.browser = d(e, u, "default"), r.name = d(i, l), r[r.name] = !0, r.majorVersion = o[2], r.minorVersion = o[3].replace("_", "."), n = r.minorVersion.replace(".", "").substr(0, 2), r.flatVersion = r.majorVersion + n + Array(3 - (3 > n.length ? n.length : 2)).join("0"), r.cordova = typeof t.PhoneGap !== Rt || typeof t.cordova !== Rt, r.appMode = t.navigator.standalone || /file|local|wmapp/.test(t.location.protocol) || r.cordova, r.android && (1.5 > Ct.devicePixelRatio && 400 > r.flatVersion || a) && (Ct.screenWidth > 800 || Ct.screenHeight > 800) && (r.tablet = i); break } return r }, s = Ct.mobileOS = Ct.detectOS(navigator.userAgent), Ct.wpDevicePixelRatio = s.wp ? screen.width / 320 : 0, Ct.kineticScrollNeeded = s && (Ct.touch || Ct.msPointers || Ct.pointers), Ct.hasNativeScrolling = !1, (s.ios || s.android && s.majorVersion > 2 || s.wp) && (Ct.hasNativeScrolling = s), Ct.mouseAndTouchPresent = Ct.touch && !(Ct.mobileOS.ios || Ct.mobileOS.android), Ct.detectBrowser = function(e) { var t, n = !1, i = [], r = { webkit: /(chrome)[ \/]([\w.]+)/i, safari: /(webkit)[ \/]([\w.]+)/i, opera: /(opera)(?:.*version|)[ \/]([\w.]+)/i, edge: /(edge)[ \/]([\w.]+)/i, msie: /(msie\s|trident.*? rv:)([\w.]+)/i, mozilla: /(mozilla)(?:.*? rv:([\w.]+)|)/i }; for (t in r) if (r.hasOwnProperty(t) && (i = e.match(r[t]))) { n = {}, n[t] = !0, n[i[1].toLowerCase().split(" ")[0].split("/")[0]] = !0, n.version = parseInt(document.documentMode || i[2], 10); break } return n }, Ct.browser = Ct.detectBrowser(navigator.userAgent), Ct.zoomLevel = function() { var e, n, i; try { return e = Ct.browser, n = 0, i = document.documentElement, e.msie && 11 == e.version && i.scrollHeight > i.clientHeight && !Ct.touch && (n = Ct.scrollbar()), Ct.touch ? i.clientWidth / t.innerWidth : e.msie && e.version >= 10 ? ((top || t).document.documentElement.offsetWidth + n) / (top || t).innerWidth : 1 } catch (r) { return 1 } }, Ct.cssBorderSpacing = n !== document.documentElement.style.borderSpacing && !(Ct.browser.msie && 8 > Ct.browser.version), function(t) { var n = "", i = e(document.documentElement), r = parseInt(t.version, 10); t.msie ? n = "ie" : t.mozilla ? n = "ff" : t.safari ? n = "safari" : t.webkit ? n = "webkit" : t.opera && (n = "opera"), n && (n = "k-" + n + " k-" + n + r), Ct.mobileOS && (n += " k-mobile"), i.addClass(n) }(Ct.browser), Ct.eventCapture = document.documentElement.addEventListener, l = document.createElement("input"), Ct.placeholder = "placeholder" in l, Ct.propertyChangeEvent = "onpropertychange" in l, Ct.input = function() { for (var e, t = ["number", "date", "time", "month", "week", "datetime", "datetime-local"], n = t.length, i = "test", r = {}, o = 0; n > o; o++) e = t[o], l.setAttribute("type", e), l.value = i, r[e.replace("-", "")] = "text" !== l.type && l.value !== i; return r }(), l.style.cssText = "float:left;", Ct.cssFloat = !!l.style.cssFloat, l = null, Ct.stableSort = function() { var e, t = 513, n = [{ index: 0, field: "b" }]; for (e = 1; t > e; e++) n.push({ index: e, field: "a" }); return n.sort(function(e, t) { return e.field > t.field ? 1 : t.field > e.field ? -1 : 0 }), 1 === n[0].index }(), Ct.matchesSelector = a.webkitMatchesSelector || a.mozMatchesSelector || a.msMatchesSelector || a.oMatchesSelector || a.matchesSelector || a.matches || function(t) { for (var n = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(t) || [] : e(t), i = n.length; i--;) if (n[i] == this) return !0; return !1 }, Ct.pushState = t.history && t.history.pushState, c = document.documentMode, Ct.hashChange = "onhashchange" in t && !(Ct.browser.msie && (!c || 8 >= c)) }(), U = { left: { reverse: "right" }, right: { reverse: "left" }, down: { reverse: "up" }, up: { reverse: "down" }, top: { reverse: "bottom" }, bottom: { reverse: "top" }, "in": { reverse: "out" }, out: { reverse: "in" } }, W = {}, e.extend(W, { enabled: !0, Element: function(t) { this.element = e(t) }, promise: function(e, t) { e.is(":visible") || e.css({ display: e.data("olddisplay") || "block" }).css("display"), t.hide && e.data("olddisplay", e.css("display")).hide(), t.init && t.init(), t.completeCallback && t.completeCallback(e), e.dequeue() }, disable: function() { this.enabled = !1, this.promise = this.promiseShim }, enable: function() { this.enabled = !0, this.promise = this.animatedPromise } }), W.promiseShim = W.promise, "kendoAnimate" in e.fn || vt(e.fn, { kendoStop: function(e, t) { return this.stop(e, t) }, kendoAnimate: function(e, t, n, i) { return b(this, e, t, n, i) }, kendoAddClass: function(e, t) { return mt.toggleClass(this, e, t, !0) }, kendoRemoveClass: function(e, t) { return mt.toggleClass(this, e, t, !1) }, kendoToggleClass: function(e, t, n) { return mt.toggleClass(this, e, t, n) } }), j = /&/g, G = /</g, q = /"/g, $ = /'/g, Y = />/g, Q = function(e) { return e.target }, Ct.touch && (Q = function(e) { var t = "originalEvent" in e ? e.originalEvent.changedTouches : "changedTouches" in e ? e.changedTouches : null; return t ? document.elementFromPoint(t[0].clientX, t[0].clientY) : e.target }, _t(["swipe", "swipeLeft", "swipeRight", "swipeUp", "swipeDown", "doubleTap", "tap"], function(t, n) { e.fn[n] = function(e) { return this.bind(n, e) } })), Ct.touch ? Ct.mobileOS ? (Ct.mousedown = "touchstart", Ct.mouseup = "touchend", Ct.mousemove = "touchmove", Ct.mousecancel = "touchcancel", Ct.click = "touchend", Ct.resize = "orientationchange") : (Ct.mousedown = "mousedown touchstart", Ct.mouseup = "mouseup touchend", Ct.mousemove = "mousemove touchmove", Ct.mousecancel = "mouseleave touchcancel", Ct.click = "click", Ct.resize = "resize") : Ct.pointers ? (Ct.mousemove = "pointermove", Ct.mousedown = "pointerdown", Ct.mouseup = "pointerup", Ct.mousecancel = "pointercancel", Ct.click = "pointerup", Ct.resize = "orientationchange resize") : Ct.msPointers ? (Ct.mousemove = "MSPointerMove", Ct.mousedown = "MSPointerDown", Ct.mouseup = "MSPointerUp", Ct.mousecancel = "MSPointerCancel", Ct.click = "MSPointerUp", Ct.resize = "orientationchange resize") : (Ct.mousemove = "mousemove", Ct.mousedown = "mousedown", Ct.mouseup = "mouseup", Ct.mousecancel = "mouseleave", Ct.click = "click", Ct.resize = "resize"), K = function(e, t) { var n, i, r, o, a = t || "d", s = 1; for (i = 0, r = e.length; r > i; i++) o = e[i], "" !== o && (n = o.indexOf("["), 0 !== n && (-1 == n ? o = "." + o : (s++, o = "." + o.substring(0, n) + " || {})" + o.substring(n))), s++, a += o + (r - 1 > i ? " || {})" : ")")); return Array(s).join("(") + a }, X = /^([a-z]+:)?\/\//i, vt(mt, { ui: mt.ui || {}, fx: mt.fx || _, effects: mt.effects || W, mobile: mt.mobile || {}, data: mt.data || {}, dataviz: mt.dataviz || {}, keys: { INSERT: 45, DELETE: 46, BACKSPACE: 8, TAB: 9, ENTER: 13, ESC: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, END: 35, HOME: 36, SPACEBAR: 32, PAGEUP: 33, PAGEDOWN: 34, F2: 113, F10: 121, F12: 123, NUMPAD_PLUS: 107, NUMPAD_MINUS: 109, NUMPAD_DOT: 110 }, support: mt.support || Ct, animate: mt.animate || b, ns: "", attr: function(e) { return "data-" + mt.ns + e }, getShadows: a, wrap: s, deepExtend: l, getComputedStyles: p, isScrollable: f, size: g, toCamelCase: h, toHyphens: u, getOffset: mt.getOffset || m, parseEffects: mt.parseEffects || v, toggleClass: mt.toggleClass || y, directions: mt.directions || U, Observable: F, Class: i, Template: I, template: bt(I.compile, I), render: bt(I.render, I), stringify: bt(xt.stringify, xt), eventTarget: Q, htmlEncode: k, isLocalUrl: function(e) { return e && !X.test(e) }, expr: function(e, t, n) { return e = e || "", typeof t == It && (n = t, t = !1), n = n || "d", e && "[" !== e.charAt(0) && (e = "." + e), t ? (e = e.replace(/"([^.]*)\.([^"]*)"/g, '"$1_$DOT$_$2"'), e = e.replace(/'([^.]*)\.([^']*)'/g, "'$1_$DOT$_$2'"), e = K(e.split("."), n), e = e.replace(/_\$DOT\$_/g, ".")) : e = n + e, e }, getter: function(e, t) { var n = e + t; return Ht[n] = Ht[n] || Function("d", "return " + mt.expr(e, t)) }, setter: function(e) { return Bt[e] = Bt[e] || Function("d,value", mt.expr(e) + "=value") }, accessor: function(e) { return { get: mt.getter(e), set: mt.setter(e) } }, guid: function() { var e, t, n = ""; for (e = 0; 32 > e; e++) t = 16 * kt.random() | 0, (8 == e || 12 == e || 16 == e || 20 == e) && (n += "-"), n += (12 == e ? 4 : 16 == e ? 3 & t | 8 : t).toString(16); return n }, roleSelector: function(e) { return e.replace(/(\S+)/g, "[" + mt.attr("role") + "=$1],").slice(0, -1) }, directiveSelector: function(e) { var t, n = e.split(" "); if (n) for (t = 0; n.length > t; t++) "view" != n[t] && (n[t] = n[t].replace(/(\w*)(view|bar|strip|over)$/, "$1-$2")); return n.join(" ").replace(/(\S+)/g, "kendo-mobile-$1,").slice(0, -1) }, triggeredByInput: function(e) { return /^(label|input|textarea|select)$/i.test(e.target.tagName) }, logToConsole: function(e) { var i = t.console; !mt.suppressLog && n !== i && i.log && i.log(e) } }), Z = F.extend({ init: function(e, t) { var n, i = this; i.element = mt.jQuery(e).handler(i), i.angular("init", t), F.fn.init.call(i), n = t ? t.dataSource : null, n && (t = vt({}, t, { dataSource: {} })), t = i.options = vt(!0, {}, i.options, t), n && (t.dataSource = n), i.element.attr(mt.attr("role")) || i.element.attr(mt.attr("role"), (t.name || "").toLowerCase()), i.element.data("kendo" + t.prefix + t.name, i), i.bind(i.events, t) }, events: [], options: { prefix: "" }, _hasBindingTarget: function() { return !!this.element[0].kendoBindingTarget }, _tabindex: function(e) { e = e || this.wrapper; var t = this.element, n = "tabindex", i = e.attr(n) || t.attr(n); t.removeAttr(n), e.attr(n, isNaN(i) ? 0 : i) }, setOptions: function(t) { this._setEvents(t), e.extend(this.options, t) }, _setEvents: function(e) { for (var t, n = this, i = 0, r = n.events.length; r > i; i++) t = n.events[i], n.options[t] && e[t] && n.unbind(t, n.options[t]); n.bind(n.events, e) }, resize: function(e) { var t = this.getSize(), n = this._size; (e || (t.width > 0 || t.height > 0) && (!n || t.width !== n.width || t.height !== n.height)) && (this._size = t, this._resize(t, e), this.trigger("resize", t)) }, getSize: function() { return mt.dimensions(this.element) }, size: function(e) { return e ? (this.setSize(e), n) : this.getSize() }, setSize: e.noop, _resize: e.noop, destroy: function() { var e = this; e.element.removeData("kendo" + e.options.prefix + e.options.name), e.element.removeData("handler"), e.unbind() }, _destroy: function() { this.destroy() }, angular: function() {} }), J = Z.extend({ dataItems: function() { return this.dataSource.flatView() }, _angularItems: function(t) { var n = this; n.angular(t, function() { return { elements: n.items(), data: e.map(n.dataItems(), function(e) { return { dataItem: e } }) } }) } }), mt.dimensions = function(e, t) { var n = e[0]; return t && e.css(t), { width: n.offsetWidth, height: n.offsetHeight } }, mt.notify = yt, et = /template$/i, tt = /^\s*(?:\{(?:.|\r\n|\n)*\}|\[(?:.|\r\n|\n)*\])\s*$/, nt = /^\{(\d+)(:[^\}]+)?\}|^\[[A-Za-z_]*\]$/, it = /([A-Z])/g, mt.initWidget = function(i, r, o) { var a, s, l, c, d, u, h, p, f, g, m, v, _; if (o ? o.roles && (o = o.roles) : o = mt.ui.roles, i = i.nodeType ? i : i[0], u = i.getAttribute("data-" + mt.ns + "role")) { f = -1 === u.indexOf("."), l = f ? o[u] : mt.getter(u)(t), m = e(i).data(), v = l ? "kendo" + l.fn.options.prefix + l.fn.options.name : "", g = f ? RegExp("^kendo.*" + u + "$", "i") : RegExp("^" + v + "$", "i"); for (_ in m) if (_.match(g)) { if (_ !== v) return m[_]; a = m[_] } if (l) { for (p = x(i, "dataSource"), r = e.extend({}, C(i, l.fn.options), r), p && (r.dataSource = typeof p === It ? mt.getter(p)(t) : p), c = 0, d = l.fn.events.length; d > c; c++) s = l.fn.events[c], h = x(i, s), h !== n && (r[s] = mt.getter(h)(t)); return a ? e.isEmptyObject(r) || a.setOptions(r) : a = new l(i, r), a } } }, mt.rolesFromNamespaces = function(e) { var t, n, i = []; for (e[0] || (e = [mt.ui, mt.dataviz.ui]), t = 0, n = e.length; n > t; t++) i[t] = e[t].roles; return vt.apply(null, [{}].concat(i.reverse())) }, mt.init = function(t) { var n = mt.rolesFromNamespaces(Lt.call(arguments, 1)); e(t).find("[data-" + mt.ns + "role]").addBack().each(function() { mt.initWidget(this, {}, n) }) }, mt.destroy = function(t) { e(t).find("[data-" + mt.ns + "role]").addBack().each(function() { var t, n = e(this).data(); for (t in n) 0 === t.indexOf("kendo") && typeof n[t].destroy === Et && n[t].destroy() }) }, mt.resize = function(t, n) { var i, r = e(t).find("[data-" + mt.ns + "role]").addBack().filter(T); r.length && (i = e.makeArray(r), i.sort(S), e.each(i, function() { var t = mt.widgetInstance(e(this)); t && t.resize(n) })) }, mt.parseOptions = C, vt(mt.ui, { Widget: Z, DataBoundWidget: J, roles: {}, progress: function(t, n) { var i, r, o, a, s = t.find(".k-loading-mask"), l = mt.support, c = l.browser; n ? s.length || (i = l.isRtl(t), r = i ? "right" : "left", a = t.scrollLeft(), o = c.webkit && i ? t[0].scrollWidth - t.width() - 2 * a : 0, s = e("<div class='k-loading-mask'><span class='k-loading-text'>Loading...</span><div class='k-loading-image'/><div class='k-loading-color'/></div>").width("100%").height("100%").css("top", t.scrollTop()).css(r, Math.abs(a) + o).prependTo(t)) : s && s.remove() }, plugin: function(t, i, r) { var o, a = t.fn.options.name; i = i || mt.ui, r = r || "", i[a] = t, i.roles[a.toLowerCase()] = t, o = "getKendo" + r + a, a = "kendo" + r + a, e.fn[a] = function(i) { var r, o = this; return typeof i === It ? (r = Lt.call(arguments, 1), this.each(function() { var t, s, l = e.data(this, a); if (!l) throw Error(mt.format("Cannot call method '{0}' of {1} before it is initialized", i, a)); if (t = l[i], typeof t !== Et) throw Error(mt.format("Cannot find method '{0}' of {1}", i, a)); return s = t.apply(l, r), s !== n ? (o = s, !1) : n })) : this.each(function() { new t(this, i) }), o }, e.fn[a].widget = t, e.fn[o] = function() { return this.data(a) } } }), rt = { bind: function() { return this }, nullObject: !0, options: {} }, ot = Z.extend({ init: function(e, t) { Z.fn.init.call(this, e, t), this.element.autoApplyNS(), this.wrapper = this.element, this.element.addClass("km-widget") }, destroy: function() { Z.fn.destroy.call(this), this.element.kendoDestroy() }, options: { prefix: "Mobile" }, events: [], view: function() { var e = this.element.closest(mt.roleSelector("view splitview modalview drawer")); return mt.widgetInstance(e, mt.mobile.ui) || rt }, viewHasNativeScrolling: function() { var e = this.view(); return e && e.options.useNativeScrolling }, container: function() { var e = this.element.closest(mt.roleSelector("view layout modalview drawer splitview")); return mt.widgetInstance(e.eq(0), mt.mobile.ui) || rt } }), vt(mt.mobile, { init: function(e) { mt.init(e, mt.mobile.ui, mt.ui, mt.dataviz.ui) }, appLevelNativeScrolling: function() { return mt.mobile.application && mt.mobile.application.options && mt.mobile.application.options.useNativeScrolling }, roles: {}, ui: { Widget: ot, DataBoundWidget: J.extend(ot.prototype), roles: {}, plugin: function(e) { mt.ui.plugin(e, mt.mobile.ui, "Mobile") } } }), l(mt.dataviz, { init: function(e) { mt.init(e, mt.dataviz.ui) }, ui: { roles: {}, themes: {}, views: [], plugin: function(e) { mt.ui.plugin(e, mt.dataviz.ui) } }, roles: {} }), mt.touchScroller = function(t, n) { return e(t).map(function(t, i) { return i = e(i), Ct.kineticScrollNeeded && mt.mobile.ui.Scroller && !i.data("kendoMobileScroller") ? (i.kendoMobileScroller(n), i.data("kendoMobileScroller")) : !1 })[0] }, mt.preventDefault = function(e) { e.preventDefault() }, mt.widgetInstance = function(e, n) { var i, r, o, a, s = e.data(mt.ns + "role"), l = []; if (s) { if ("content" === s && (s = "scroller"), n) if (n[0]) for (i = 0, r = n.length; r > i; i++) l.push(n[i].roles[s]); else l.push(n.roles[s]); else l = [mt.ui.roles[s], mt.dataviz.ui.roles[s], mt.mobile.ui.roles[s]]; for (s.indexOf(".") >= 0 && (l = [mt.getter(s)(t)]), i = 0, r = l.length; r > i; i++) if (o = l[i], o && (a = e.data("kendo" + o.fn.options.prefix + o.fn.options.name))) return a } }, mt.onResize = function(n) { var i = n; return Ct.mobileOS.android && (i = function() { setTimeout(n, 600) }), e(t).on(Ct.resize, i), i }, mt.unbindResize = function(n) { e(t).off(Ct.resize, n) }, mt.attrValue = function(e, t) { return e.data(mt.ns + t) }, mt.days = { Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6 }, e.extend(e.expr[":"], { kendoFocusable: function(t) { var n = e.attr(t, "tabindex"); return D(t, !isNaN(n) && n > -1) } }), at = ["mousedown", "mousemove", "mouseenter", "mouseleave", "mouseover", "mouseout", "mouseup", "click"], st = "label, input, [data-rel=external]", lt = { setupMouseMute: function() { var t, n = 0, i = at.length, r = document.documentElement; if (!lt.mouseTrap && Ct.eventCapture) for (lt.mouseTrap = !0, lt.bustClick = !1, lt.captureMouse = !1, t = function(t) { lt.captureMouse && ("click" === t.type ? lt.bustClick && !e(t.target).is(st) && (t.preventDefault(), t.stopPropagation()) : t.stopPropagation()) }; i > n; n++) r.addEventListener(at[n], t, !0) }, muteMouse: function(e) { lt.captureMouse = !0, e.data.bustClick && (lt.bustClick = !0), clearTimeout(lt.mouseTrapTimeoutID) }, unMuteMouse: function() { clearTimeout(lt.mouseTrapTimeoutID), lt.mouseTrapTimeoutID = setTimeout(function() { lt.captureMouse = !1, lt.bustClick = !1 }, 400) } }, ct = { down: "touchstart mousedown", move: "mousemove touchmove", up: "mouseup touchend touchcancel", cancel: "mouseleave touchcancel" }, Ct.touch && (Ct.mobileOS.ios || Ct.mobileOS.android) ? ct = { down: "touchstart", move: "touchmove", up: "touchend touchcancel", cancel: "touchcancel" } : Ct.pointers ? ct = { down: "pointerdown", move: "pointermove", up: "pointerup", cancel: "pointercancel pointerleave" } : Ct.msPointers && (ct = { down: "MSPointerDown", move: "MSPointerMove", up: "MSPointerUp", cancel: "MSPointerCancel MSPointerLeave" }), !Ct.msPointers || "onmspointerenter" in t || e.each({ MSPointerEnter: "MSPointerOver", MSPointerLeave: "MSPointerOut" }, function(t, n) { e.event.special[t] = { delegateType: n, bindType: n, handle: function(t) { var i, r = this, o = t.relatedTarget, a = t.handleObj; return (!o || o !== r && !e.contains(r, o)) && (t.type = a.origType, i = a.handler.apply(this, arguments), t.type = n), i } } }), dt = function(e) { return ct[e] || e }, ut = /([^ ]+)/g, mt.applyEventMap = function(e, t) { return e = e.replace(ut, dt), t && (e = e.replace(ut, "$1." + t)), e }, ht = e.fn.on, vt(!0, E, e), E.fn = E.prototype = new e, E.fn.constructor = E, E.fn.init = function(t, n) { return n && n instanceof e && !(n instanceof E) && (n = E(n)), e.fn.init.call(this, t, n, pt) }, E.fn.init.prototype = E.fn, pt = E(document), vt(E.fn, { handler: function(e) { return this.data("handler", e), this }, autoApplyNS: function(e) { return this.data("kendoNS", e || mt.guid()), this }, on: function() { var e, t, n, i, r, o, a = this, s = a.data("kendoNS"); return 1 === arguments.length ? ht.call(a, arguments[0]) : (e = a, t = Lt.call(arguments), typeof t[t.length - 1] === Rt && t.pop(), n = t[t.length - 1], i = mt.applyEventMap(t[0], s), Ct.mouseAndTouchPresent && i.search(/mouse|click/) > -1 && this[0] !== document.documentElement && (lt.setupMouseMute(), r = 2 === t.length ? null : t[1], o = i.indexOf("click") > -1 && i.indexOf("touchend") > -1, ht.call(this, { touchstart: lt.muteMouse, touchend: lt.unMuteMouse }, r, { bustClick: o })), typeof n === It && (e = a.data("handler"), n = e[n], t[t.length - 1] = function(t) { n.call(e, t) }), t[0] = i, ht.apply(a, t), a) }, kendoDestroy: function(e) { return e = e || this.data("kendoNS"), e && this.off("." + e), this } }), mt.jQuery = E, mt.eventMap = ct, mt.timezone = function() { function e(e, t) { var n, i, r, o = t[3], a = t[4], s = t[5], l = t[8]; return l || (t[8] = l = {}), l[e] ? l[e] : (isNaN(a) ? 0 === a.indexOf("last") ? (n = new Date(Date.UTC(e, d[o] + 1, 1, s[0] - 24, s[1], s[2], 0)), i = u[a.substr(4, 3)], r = n.getUTCDay(), n.setUTCDate(n.getUTCDate() + i - r - (i > r ? 7 : 0))) : a.indexOf(">=") >= 0 && (n = new Date(Date.UTC(e, d[o], a.substr(5), s[0], s[1], s[2], 0)), i = u[a.substr(0, 3)], r = n.getUTCDay(), n.setUTCDate(n.getUTCDate() + i - r + (r > i ? 7 : 0))) : n = new Date(Date.UTC(e, d[o], a, s[0], s[1], s[2], 0)), l[e] = n) } function t(t, n, i) { var r, o, a, s; return (n = n[i]) ? (a = new Date(t).getUTCFullYear(), n = jQuery.grep(n, function(e) { var t = e[0], n = e[1]; return a >= t && (n >= a || t == a && "only" == n || "max" == n) }), n.push(t), n.sort(function(t, n) { return "number" != typeof t && (t = +e(a, t)), "number" != typeof n && (n = +e(a, n)), t - n }), s = n[jQuery.inArray(t, n) - 1] || n[n.length - 1], isNaN(s) ? s : null) : (r = i.split(":"), o = 0, r.length > 1 && (o = 60 * r[0] + +r[1]), [-1e6, "max", "-", "Jan", 1, [0, 0, 0], o, "-"]) } function n(e, t, n) { var i, r, o, a = t[n]; if ("string" == typeof a && (a = t[a]), !a) throw Error('Timezone "' + n + '" is either incorrect, or kendo.timezones.min.js is not included.'); for (i = a.length - 1; i >= 0 && (r = a[i][3], !(r && e > r)); i--); if (o = a[i + 1], !o) throw Error('Timezone "' + n + '" not found on ' + e + "."); return o } function i(e, i, r, o) { typeof e != Pt && (e = Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds())); var a = n(e, i, o); return { zone: a, rule: t(e, r, a[1]) } } function r(e, t) { var n, r, o; return "Etc/UTC" == t || "Etc/GMT" == t ? 0 : (n = i(e, this.zones, this.rules, t), r = n.zone, o = n.rule, mt.parseFloat(o ? r[0] - o[6] : r[0])) } function o(e, t) { var n = i(e, this.zones, this.rules, t), r = n.zone, o = n.rule, a = r[2]; return a.indexOf("/") >= 0 ? a.split("/")[o && +o[6] ? 1 : 0] : a.indexOf("%s") >= 0 ? a.replace("%s", o && "-" != o[7] ? o[7] : "") : a } function a(e, t, n) { var i, r; return typeof t == It && (t = this.offset(e, t)), typeof n == It && (n = this.offset(e, n)), i = e.getTimezoneOffset(), e = new Date(e.getTime() + 6e4 * (t - n)), r = e.getTimezoneOffset(), new Date(e.getTime() + 6e4 * (r - i)) } function s(e, t) { return this.convert(e, e.getTimezoneOffset(), t) } function l(e, t) { return this.convert(e, t, e.getTimezoneOffset()) } function c(e) { return this.apply(new Date(e), "Etc/UTC") } var d = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }, u = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 }; return { zones: {}, rules: {}, offset: r, convert: a, apply: s, remove: l, abbr: o, toLocalDate: c } }(), mt.date = function() { function e(e, t) { return 0 === t && 23 === e.getHours() ? (e.setHours(e.getHours() + 2), !0) : !1 } function t(t, n, i) { var r = t.getHours(); i = i || 1, n = (n - t.getDay() + 7 * i) % 7, t.setDate(t.getDate() + n), e(t, r) } function n(e, n, i) { return e = new Date(e), t(e, n, i), e } function i(e) { return new Date(e.getFullYear(), e.getMonth(), 1) } function r(e) { var t = new Date(e.getFullYear(), e.getMonth() + 1, 0), n = i(e), r = Math.abs(t.getTimezoneOffset() - n.getTimezoneOffset()); return r && t.setHours(n.getHours() + r / 60), t } function o(t) { return t = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 0, 0, 0), e(t, 0), t } function a(e) { return Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds()) } function s(e) { return e.getTime() - o(e) } function l(e, t, n) { var i, r = s(t), o = s(n); return e && r != o ? (t >= n && (n += m), i = s(e), r > i && (i += m), r > o && (o += m), i >= r && o >= i) : !0 } function c(e, t, n) { var i, r = t.getTime(), o = n.getTime(); return r >= o && (o += m), i = e.getTime(), i >= r && o >= i } function d(t, n) { var i = t.getHours(); return t = new Date(t), u(t, n * m), e(t, i), t } function u(e, t, n) { var i, r = e.getTimezoneOffset(); e.setTime(e.getTime() + t), n || (i = e.getTimezoneOffset() - r, e.setTime(e.getTime() + i * g)) } function h() { return o(new Date) } function p(e) { return o(e).getTime() == h().getTime() } function f(e) { var t = new Date(1980, 1, 1, 0, 0, 0); return e && t.setHours(e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds()), t } var g = 6e4, m = 864e5; return { adjustDST: e, dayOfWeek: n, setDayOfWeek: t, getDate: o, isInDateRange: c, isInTimeRange: l, isToday: p, nextDay: function(e) { return d(e, 1) }, previousDay: function(e) { return d(e, -1) }, toUtcTime: a, MS_PER_DAY: m, MS_PER_HOUR: 60 * g, MS_PER_MINUTE: g, setTime: u, addDays: d, today: h, toInvariantTime: f, firstDayOfMonth: i, lastDayOfMonth: r, getMilliseconds: s } }(), mt.stripWhitespace = function(e) { var t, n, i; if (document.createNodeIterator) for (t = document.createNodeIterator(e, NodeFilter.SHOW_TEXT, function(t) { return t.parentNode == e ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT }, !1); t.nextNode();) t.referenceNode && !t.referenceNode.textContent.trim() && t.referenceNode.parentNode.removeChild(t.referenceNode); else for (n = 0; e.childNodes.length > n; n++) i = e.childNodes[n], 3 != i.nodeType || /\S/.test(i.nodeValue) || (e.removeChild(i), n--), 1 == i.nodeType && mt.stripWhitespace(i) }, ft = t.requestAnimationFrame || t.webkitRequestAnimationFrame || t.mozRequestAnimationFrame || t.oRequestAnimationFrame || t.msRequestAnimationFrame || function(e) { setTimeout(e, 1e3 / 60) }, mt.animationFrame = function(e) { ft.call(t, e) }, gt = [], mt.queueAnimation = function(e) { gt[gt.length] = e, 1 === gt.length && mt.runNextAnimation() }, mt.runNextAnimation = function() { mt.animationFrame(function() { gt[0] && (gt.shift()(), gt[0] && mt.runNextAnimation()) }) }, mt.parseQueryStringParams = function(e) { for (var t = e.split("?")[1] || "", n = {}, i = t.split(/&|=/), r = i.length, o = 0; r > o; o += 2) "" !== i[o] && (n[decodeURIComponent(i[o])] = decodeURIComponent(i[o + 1])); return n }, mt.elementUnderCursor = function(e) { return n !== e.x.client ? document.elementFromPoint(e.x.client, e.y.client) : n }, mt.wheelDeltaY = function(e) { var t, i = e.originalEvent, r = i.wheelDeltaY; return i.wheelDelta ? (r === n || r) && (t = i.wheelDelta) : i.detail && i.axis === i.VERTICAL_AXIS && (t = 10 * -i.detail), t }, mt.throttle = function(e, t) { var i, r, o = 0; return !t || 0 >= t ? e : (r = function() { function r() { e.apply(a, l), o = +new Date } var a = this, s = +new Date - o, l = arguments; return o ? (i && clearTimeout(i), s > t ? r() : i = setTimeout(r, t - s), n) : r() }, r.cancel = function() { clearTimeout(i) }, r) }, mt.caret = function(t, i, r) { var o, a, s, l, c = i !== n; if (r === n && (r = i), t[0] && (t = t[0]), !c || !t.disabled) { try { t.selectionStart !== n ? c ? (t.focus(), t.setSelectionRange(i, r)) : i = [t.selectionStart, t.selectionEnd] : document.selection && (e(t).is(":visible") && t.focus(), o = t.createTextRange(), c ? (o.collapse(!0), o.moveStart("character", i), o.moveEnd("character", r - i), o.select()) : (a = o.duplicate(), o.moveToBookmark(document.selection.createRange().getBookmark()), a.setEndPoint("EndToStart", o), s = a.text.length, l = s + o.text.length, i = [s, l])) } catch (d) { i = [] } return i } }, mt.compileMobileDirective = function(e, n) { var i = t.angular; return e.attr("data-" + mt.ns + "role", e[0].tagName.toLowerCase().replace("kendo-mobile-", "").replace("-", "")), i.element(e).injector().invoke(["$compile", function(t) { t(e)(n), /^\$(digest|apply)$/.test(n.$$phase) || n.$digest() } ]), mt.widgetInstance(e, mt.mobile.ui) }, mt.antiForgeryTokens = function() { var t = {}, i = e("meta[name=csrf-token],meta[name=_csrf]").attr("content"), r = e("meta[name=csrf-param],meta[name=_csrf_header]").attr("content"); return e("input[name^='__RequestVerificationToken']").each(function() { t[this.name] = this.value }), r !== n && i !== n && (t[r] = i), t }, mt.cycleForm = function(e) { function t(e) { var t = mt.widgetInstance(e); t && t.focus ? t.focus() : e.focus() } var n = e.find("input, .k-widget").first(), i = e.find("button, .k-button").last(); i.on("keydown", function(e) { e.keyCode != mt.keys.TAB || e.shiftKey || (e.preventDefault(), t(n)) }), n.on("keydown", function(e) { e.keyCode == mt.keys.TAB && e.shiftKey && (e.preventDefault(), t(i)) }) }, function() { function n(t, n, i, r) { var o, a, s = e("<form>").attr({ action: i, method: "POST", target: r }), l = mt.antiForgeryTokens(); l.fileName = n, o = t.split(";base64,"), l.contentType = o[0].replace("data:", ""), l.base64 = o[1]; for (a in l) l.hasOwnProperty(a) && e("<input>").attr({ value: l[a], name: a, type: "hidden" }).appendTo(s); s.appendTo("body").submit().remove() } function i(e, t) { var n, i, r, o, a, s = e; if ("string" == typeof e) { for (n = e.split(";base64,"), i = n[0], r = atob(n[1]), o = new Uint8Array(r.length), a = 0; r.length > a; a++) o[a] = r.charCodeAt(a); s = new Blob([o.buffer], { type: i }) } navigator.msSaveBlob(s, t) } function r(e, n) { t.Blob && e instanceof Blob && (e = URL.createObjectURL(e)), o.download = n, o.href = e; var i = document.createEvent("MouseEvents"); i.initMouseEvent("click", !0, !1, t, 0, 0, 0, 0, 0, !1, !1, !1, !1, 0, null), o.dispatchEvent(i) } var o = document.createElement("a"), a = "download" in o; mt.saveAs = function(e) { var t = n; e.forceProxy || (a ? t = r : navigator.msSaveBlob && (t = i)), t(e.dataURI, e.fileName, e.proxyURL, e.proxyTarget) } }() }(jQuery, window), function(e, t) { function n(e, t) { if (!t) return e; e + "/" === t && (e = t); var n = RegExp("^" + t, "i"); return n.test(e) || (e = t + "/" + e), p.protocol + "//" + (p.host + "/" + e).replace(/\/\/+/g, "/") } function i(e) { return e ? "#!" : "#" } function r(e) { var t = p.href; return "#!" === e && t.indexOf("#") > -1 && t.indexOf("#!") < 0 ? null : t.split(e)[1] || "" } function o(e, t) { return 0 === t.indexOf(e) ? t.substr(e.length).replace(/\/\//g, "/") : t } function a(e) { return e.replace(/^(#)?/, "#") } function s(e) { return e.replace(/^(#(!)?)?/, "#!") } var l = window.kendo, c = "change", d = "back", u = "same", h = l.support, p = window.location, f = window.history, g = 50, m = l.support.browser.msie, v = /^#*/, _ = window.document, w = l.Class.extend({ back: function() { m ? setTimeout(function() { f.back() }) : f.back() }, forward: function() { m ? setTimeout(function() { f.forward() }) : f.forward() }, length: function() { return f.length }, replaceLocation: function(e) { p.replace(e) } }), b = w.extend({ init: function(e) { this.root = e }, navigate: function(e) { f.pushState({}, _.title, n(e, this.root)) }, replace: function(e) { f.replaceState({}, _.title, n(e, this.root)) }, normalize: function(e) { return o(this.root, e) }, current: function() { var e = p.pathname; return p.search && (e += p.search), o(this.root, e) }, change: function(t) { e(window).bind("popstate.kendo", t) }, stop: function() { e(window).unbind("popstate.kendo") }, normalizeCurrent: function(e) { var t, o = e.root, a = p.pathname, s = r(i(e.hashBang)); o === a + "/" && (t = o), o === a && s && (t = n(s.replace(v, ""), o)), t && f.pushState({}, _.title, t) } }), y = w.extend({ init: function(e) { this._id = l.guid(), this.prefix = i(e), this.fix = e ? s : a }, navigate: function(e) { p.hash = this.fix(e) }, replace: function(e) { this.replaceLocation(this.fix(e)) }, normalize: function(e) { return e.indexOf(this.prefix) < 0 ? e : e.split(this.prefix)[1] }, change: function(t) { h.hashChange ? e(window).on("hashchange." + this._id, t) : this._interval = setInterval(t, g) }, stop: function() { e(window).off("hashchange." + this._id), clearInterval(this._interval) }, current: function() { return r(this.prefix) }, normalizeCurrent: function(e) { var t = p.pathname, n = e.root; return e.pushState && n !== t ? (this.replaceLocation(n + this.prefix + o(n, t)), !0) : !1 } }), k = l.Observable.extend({ start: function(t) { if (t = t || {}, this.bind([c, d, u], t), !this._started) { this._started = !0, t.root = t.root || "/"; var n, i = this.createAdapter(t); i.normalizeCurrent(t) || (n = i.current(), e.extend(this, { adapter: i, root: t.root, historyLength: i.length(), current: n, locations: [n] }), i.change(e.proxy(this, "_checkUrl"))) } }, createAdapter: function(e) { return h.pushState && e.pushState ? new b(e.root) : new y(e.hashBang) }, stop: function() { this._started && (this.adapter.stop(), this.unbind(c), this._started = !1) }, change: function(e) { this.bind(c, e) }, replace: function(e, t) { this._navigate(e, t, function(t) { t.replace(e), this.locations[this.locations.length - 1] = this.current }) }, navigate: function(e, n) { return "#:back" === e ? (this.backCalled = !0, this.adapter.back(), t) : (this._navigate(e, n, function(t) { t.navigate(e), this.locations.push(this.current) }), t) }, _navigate: function(e, n, i) { var r = this.adapter; return e = r.normalize(e), this.current === e || this.current === decodeURIComponent(e) ? (this.trigger(u), t) : ((n || !this.trigger(c, { url: e })) && (this.current = e, i.call(this, r), this.historyLength = r.length()), t) }, _checkUrl: function() { var e = this.adapter, n = e.current(), i = e.length(), r = this.historyLength === i, o = n === this.locations[this.locations.length - 2] && r, a = this.backCalled, s = this.current; return null === n || this.current === n || this.current === decodeURIComponent(n) ? !0 : (this.historyLength = i, this.backCalled = !1, this.current = n, o && this.trigger("back", { url: s, to: n }) ? (e.forward(), this.current = s, t) : this.trigger(c, { url: n, backButtonPressed: !a }) ? (o ? e.forward() : (e.back(), this.historyLength--), this.current = s, t) : (o ? this.locations.pop() : this.locations.push(n), t)) } }); l.History = k, l.History.HistoryAdapter = w, l.History.HashAdapter = y, l.History.PushStateAdapter = b, l.absoluteURL = n, l.history = new k }(window.kendo.jQuery), function() { function e(e, t) { return t ? e : "([^/]+)" } function t(t, n) { return RegExp("^" + t.replace(f, "\\$&").replace(u, "(?:$1)?").replace(h, e).replace(p, "(.*?)") + "$", n ? "i" : "") } function n(e) { return e.replace(/(\?.*)|(#.*)/g, "") } var i = window.kendo, r = i.history, o = i.Observable, a = "init", s = "routeMissing", l = "change", c = "back", d = "same", u = /\((.*?)\)/g, h = /(\(\?)?:\w+/g, p = /\*\w+/g, f = /[\-{}\[\]+?.,\\\^$|#\s]/g, g = i.Class.extend({ init: function(e, n, i) { e instanceof RegExp || (e = t(e, i)), this.route = e, this._callback = n }, callback: function(e) { var t, r, o = 0, a = i.parseQueryStringParams(e); for (e = n(e), t = this.route.exec(e).slice(1), r = t.length; r > o; o++) void 0 !== t[o] && (t[o] = decodeURIComponent(t[o])); t.push(a), this._callback.apply(null, t) }, worksWith: function(e) { return this.route.test(n(e)) ? (this.callback(e), !0) : !1 } }), m = o.extend({ init: function(e) { e || (e = {}), o.fn.init.call(this), this.routes = [], this.pushState = e.pushState, this.hashBang = e.hashBang, this.root = e.root, this.ignoreCase = e.ignoreCase !== !1, this.bind([a, s, l, d], e) }, destroy: function() { r.unbind(l, this._urlChangedProxy), r.unbind(d, this._sameProxy), r.unbind(c, this._backProxy), this.unbind() }, start: function() { var e, t = this, n = function() { t._same() }, i = function(e) { t._back(e) }, o = function(e) { t._urlChanged(e) }; r.start({ same: n, change: o, back: i, pushState: t.pushState, hashBang: t.hashBang, root: t.root }), e = { url: r.current || "/", preventDefault: $.noop }, t.trigger(a, e) || t._urlChanged(e), this._urlChangedProxy = o, this._backProxy = i }, route: function(e, t) { this.routes.push(new g(e, t, this.ignoreCase)) }, navigate: function(e, t) { i.history.navigate(e, t) }, replace: function(e, t) { i.history.replace(e, t) }, _back: function(e) { this.trigger(c, { url: e.url, to: e.to }) && e.preventDefault() }, _same: function() { this.trigger(d) }, _urlChanged: function(e) { var t, n, r, o, a = e.url; if (a || (a = "/"), this.trigger(l, { url: e.url, params: i.parseQueryStringParams(e.url), backButtonPressed: e.backButtonPressed })) return void e.preventDefault(); for (t = 0, n = this.routes, o = n.length; o > t; t++) if (r = n[t], r.worksWith(a)) return; this.trigger(s, { url: a, params: i.parseQueryStringParams(a), backButtonPressed: e.backButtonPressed }) && e.preventDefault() } }); i.Router = m }(), function(e, t) { function n(i, o) { var l, c, d, u, h, p, f, g, m = [], v = i.logic || "and", _ = i.filters; for (l = 0, c = _.length; c > l; l++) i = _[l], d = i.field, f = i.value, p = i.operator, i.filters ? i = n(i, o) : (g = i.ignoreCase, d = d.replace(/\./g, "/"), i = a[p], o && (i = s[p]), i && f !== t && (u = e.type(f), "string" === u ? (h = "'{1}'", f = f.replace(/'/g, "''"), g === !0 && (d = "tolower(" + d + ")")) : h = "date" === u ? o ? "{1:yyyy-MM-ddTHH:mm:ss+00:00}" : "datetime'{1:yyyy-MM-ddTHH:mm:ss}'" : "{1}", i.length > 3 ? "substringof" !== i ? h = "{0}({2}," + h + ")" : (h = "{0}(" + h + ",{2})", "doesnotcontain" === p && (o ? (h = "{0}({2},'{1}') eq -1", i = "indexof") : h += " eq false")) : h = "{2} {0} " + h, i = r.format(h, i, f, d))), m.push(i); return i = m.join(" " + v + " "), m.length > 1 && (i = "(" + i + ")"), i } function i(e) { for (var t in e) 0 === t.indexOf("@odata") && delete e[t] } var r = window.kendo, o = e.extend, a = { eq: "eq", neq: "ne", gt: "gt", gte: "ge", lt: "lt", lte: "le", contains: "substringof", doesnotcontain: "substringof", endswith: "endswith", startswith: "startswith" }, s = o({}, a, { contains: "contains" }), l = { pageSize: e.noop, page: e.noop, filter: function(e, t, i) { t && (t = n(t, i), t && (e.$filter = t)) }, sort: function(t, n) { var i = e.map(n, function(e) { var t = e.field.replace(/\./g, "/"); return "desc" === e.dir && (t += " desc"), t }).join(","); i && (t.$orderby = i) }, skip: function(e, t) { t && (e.$skip = t) }, take: function(e, t) { t && (e.$top = t) } }, c = { read: { dataType: "jsonp" } }; o(!0, r.data, { schemas: { odata: { type: "json", data: function(e) { return e.d.results || [e.d] }, total: "d.__count" } }, transports: { odata: { read: { cache: !0, dataType: "jsonp", jsonp: "$callback" }, update: { cache: !0, dataType: "json", contentType: "application/json", type: "PUT" }, create: { cache: !0, dataType: "json", contentType: "application/json", type: "POST" }, destroy: { cache: !0, dataType: "json", type: "DELETE" }, parameterMap: function(e, t, n) { var i, o, a, s; if (e = e || {}, t = t || "read", s = (this.options || c)[t], s = s ? s.dataType : "json", "read" === t) { i = { $inlinecount: "allpages" }, "json" != s && (i.$format = "json"); for (a in e) l[a] ? l[a](i, e[a], n) : i[a] = e[a] } else { if ("json" !== s) throw Error("Only json dataType can be used for " + t + " operation."); if ("destroy" !== t) { for (a in e) o = e[a], "number" == typeof o && (e[a] = o + ""); i = r.stringify(e) } } return i } } } }), o(!0, r.data, { schemas: { "odata-v4": { type: "json", data: function(t) { return t = e.extend({}, t), i(t), t.value ? t.value : [t] }, total: function(e) { return e["@odata.count"] } } }, transports: { "odata-v4": { read: { cache: !0, dataType: "json" }, update: { cache: !0, dataType: "json", contentType: "application/json;IEEE754Compatible=true", type: "PUT" }, create: { cache: !0, dataType: "json", contentType: "application/json;IEEE754Compatible=true", type: "POST" }, destroy: { cache: !0, dataType: "json", type: "DELETE" }, parameterMap: function(e, t) { var n = r.data.transports.odata.parameterMap(e, t, !0); return "read" == t && (n.$count = !0, delete n.$inlinecount), n } } } }) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = e.isArray, r = e.isPlainObject, o = e.map, a = e.each, s = e.extend, l = n.getter, c = n.Class, d = c.extend({ init: function(t) { var l, c, d, u, h = this, p = t.total, f = t.model, g = t.parse, m = t.errors, v = t.serialize, _ = t.data; f && (r(f) && (l = t.modelBase || n.data.Model, f.fields && a(f.fields, function(t, n) { r(n) && n.field ? e.isFunction(n.field) || (n = s(n, { field: h.getter(n.field) })) : n = { field: h.getter(n) }, f.fields[t] = n }), c = f.id, c && (d = {}, d[h.xpathToMember(c, !0)] = { field: h.getter(c) }, f.fields = s(d, f.fields), f.id = h.xpathToMember(c)), f = l.define(f)), h.model = f), p && ("string" == typeof p ? (p = h.getter(p), h.total = function(e) { return parseInt(p(e), 10) }) : "function" == typeof p && (h.total = p)), m && ("string" == typeof m ? (m = h.getter(m), h.errors = function(e) { return m(e) || null }) : "function" == typeof m && (h.errors = m)), _ && ("string" == typeof _ ? (_ = h.xpathToMember(_), h.data = function(e) { var t, n = h.evaluate(e, _); return n = i(n) ? n : [n], h.model && f.fields ? (t = new h.model, o(n, function(e) { if (e) { var n, i = {}; for (n in f.fields) i[n] = t._parse(n, f.fields[n].field(e)); return i } })) : n }) : "function" == typeof _ && (h.data = _)), "function" == typeof g && (u = h.parse, h.parse = function(e) { var t = g.call(h, e); return u.call(h, t) }), "function" == typeof v && (h.serialize = v) }, total: function(e) { return this.data(e).length }, errors: function(e) { return e ? e.errors : null }, serialize: function(e) { return e }, parseDOM: function(e) { var n, r, o, a, s, l, c, d = {}, u = e.attributes, h = u.length; for (c = 0; h > c; c++) l = u[c], d["@" + l.nodeName] = l.nodeValue; for (r = e.firstChild; r; r = r.nextSibling) o = r.nodeType, 3 === o || 4 === o ? d["#text"] = r.nodeValue : 1 === o && (n = this.parseDOM(r), a = r.nodeName, s = d[a], i(s) ? s.push(n) : s = s !== t ? [s, n] : n, d[a] = s); return d }, evaluate: function(e, t) { for (var n, r, o, a, s, l = t.split("."); n = l.shift();) if (e = e[n], i(e)) { for (r = [], t = l.join("."), s = 0, o = e.length; o > s; s++) a = this.evaluate(e[s], t), a = i(a) ? a : [a], r.push.apply(r, a); return r } return e }, parse: function(t) { var n, i, r = {}; return n = t.documentElement || e.parseXML(t).documentElement, i = this.parseDOM(n), r[n.nodeName] = i, r }, xpathToMember: function(e, t) { return e ? (e = e.replace(/^\//, "").replace(/\//g, "."), e.indexOf("@") >= 0 ? e.replace(/\.?(@.*)/, t ? "$1" : '["$1"]') : e.indexOf("text()") >= 0 ? e.replace(/(\.?text\(\))/, t ? "#text" : '["#text"]') : e) : "" }, getter: function(e) { return l(this.xpathToMember(e), !0) } }); e.extend(!0, n.data, { XmlDataReader: d, readers: { xml: d } }) }(window.kendo.jQuery), function(e, t) { function n(e, t, n, i) { return function(r) { var o, a = {}; for (o in r) a[o] = r[o]; a.field = i ? n + "." + r.field : n, t == wt && e._notifyChange && e._notifyChange(a), e.trigger(t, a) } } function i(t, n) { if (t === n) return !0; var r, o = e.type(t), a = e.type(n); if (o !== a) return !1; if ("date" === o) return t.getTime() === n.getTime(); if ("object" !== o && "array" !== o) return !1; for (r in t) if (!i(t[r], n[r])) return !1; return !0 } function r(e, t) { var n, i; for (i in e) { if (n = e[i], nt(n) && n.field && n.field === t) return n; if (n === t) return n } return null } function o(e) { this.data = e || [] } function a(e, n) { if (e) { var i = typeof e === pt ? { field: e, dir: n } : e, r = rt(i) ? i : i !== t ? [i] : []; return ot(r, function(e) { return !!e.dir }) } } function s(e) { var t, n, i, r, o = e.filters; if (o) for (t = 0, n = o.length; n > t; t++) i = o[t], r = i.operator, r && typeof r === pt && (i.operator = U[r.toLowerCase()] || r), s(i) } function l(e) { return e && !it(e) ? ((rt(e) || !e.filters) && (e = { logic: "and", filters: rt(e) ? e : [e] }), s(e), e) : t } function c(e) { return rt(e) ? e : [e] } function d(e, n) { var i = typeof e === pt ? { field: e, dir: n } : e, r = rt(i) ? i : i !== t ? [i] : []; return L(r, function(e) { return { field: e.field, dir: e.dir || "asc", aggregates: e.aggregates } }) } function u(e, t) { return e && e.getTime && t && t.getTime ? e.getTime() === t.getTime() : e === t } function h(e, t, n, i, r, o) { var a, s, l, c, d; for (t = t || [], c = t.length, a = 0; c > a; a++) s = t[a], l = s.aggregate, d = s.field, e[d] = e[d] || {}, o[d] = o[d] || {}, o[d][l] = o[d][l] || {}, e[d][l] = W[l.toLowerCase()](e[d][l], n, ct.accessor(d), i, r, o[d][l]) } function p(e) { return "number" == typeof e && !isNaN(e) } function f(e) { return e && e.getTime } function g(e) { var t, n = e.length, i = Array(n); for (t = 0; n > t; t++) i[t] = e[t].toJSON(); return i } function m(e, t, n, i, r) { var o, a, s, l, c; for (l = 0, c = e.length; c > l; l++) { o = e[l]; for (a in t) s = r[a], s && s !== a && (o[s] = t[a](o), delete o[a]) } } function v(e, t, n, i, r) { var o, a, s, l, c; for (l = 0, c = e.length; c > l; l++) { o = e[l]; for (a in t) o[a] = n._parse(a, t[a](o)), s = r[a], s && s !== a && delete o[s] } } function _(e, t, n, i, r) { var o, a, s, l; for (a = 0, l = e.length; l > a; a++) o = e[a], s = i[o.field], s && s != o.field && (o.field = s), o.value = n._parse(o.field, o.value), o.hasSubgroups ? _(o.items, t, n, i, r) : v(o.items, t, n, i, r) } function w(e, t, n, i, r, o) { return function(a) { return a = e(a), a && !it(i) && ("[object Array]" === Lt.call(a) || a instanceof Wt || (a = [a]), n(a, i, new t, r, o)), a || [] } } function b(e, t, n, i) { for (var r, o, a, s = 0; t.length && i && (r = t[s], o = r.items, a = o.length, e && e.field === r.field && e.value === r.value ? (e.hasSubgroups && e.items.length ? b(e.items[e.items.length - 1], r.items, n, i) : (o = o.slice(n, n + i), e.items = e.items.concat(o)), t.splice(s--, 1)) : r.hasSubgroups && o.length ? (b(r, o, n, i), r.items.length || t.splice(s--, 1)) : (o = o.slice(n, n + i), r.items = o, r.items.length || t.splice(s--, 1)), 0 === o.length ? n -= a : (n = 0, i -= o.length), !(++s >= t.length));); t.length > s && t.splice(s, t.length - s) } function y(e) { var t, n, i, r, o, a = []; for (t = 0, n = e.length; n > t; t++) if (o = e.at(t), o.hasSubgroups) a = a.concat(y(o.items)); else for (i = o.items, r = 0; i.length > r; r++) a.push(i.at(r)); return a } function k(e, t) { var n, i, r; if (t) for (n = 0, i = e.length; i > n; n++) r = e.at(n), r.hasSubgroups ? k(r.items, t) : r.items = new jt(r.items, t) } function x(e, t) { for (var n = 0, i = e.length; i > n; n++) if (e[n].hasSubgroups) { if (x(e[n].items, t)) return !0 } else if (t(e[n].items, e[n])) return !0 } function C(e, t, n, i) { for (var r = 0; e.length > r && e[r].data !== t && !S(e[r].data, n, i); r++); } function S(e, t, n) { for (var i = 0, r = e.length; r > i; i++) { if (e[i] && e[i].hasSubgroups) return S(e[i].items, t, n); if (e[i] === t || e[i] === n) return e[i] = n, !0 } } function T(e, n, i, r, o) { var a, s, l, c; for (a = 0, s = e.length; s > a; a++) if (l = e[a], l && !(l instanceof r)) if (l.hasSubgroups === t || o) { for (c = 0; n.length > c; c++) if (n[c] === l) { e[a] = n.at(c), C(i, n, l, e[a]); break } } else T(l.items, n, i, r, o) } function D(e, t) { var n, i, r; for (n = 0, i = e.length; i > n; n++) if (r = e.at(n), r.uid == t.uid) return e.splice(n, 1), r } function A(e, t) { return t ? I(e, function(e) { return e.uid && e.uid == t.uid || e[t.idField] === t.id && t.id !== t._defaultId }) : -1 } function E(e, t) { return t ? I(e, function(e) { return e.uid == t.uid }) : -1 } function I(e, t) { var n, i; for (n = 0, i = e.length; i > n; n++) if (t(e[n])) return n; return -1 } function P(e, t) { var n, i; return e && !it(e) ? (n = e[t], i = nt(n) ? n.from || n.field || t : e[t] || t, dt(i) ? t : i) : t } function M(e, t) { var n, i, r, o = {}; for (r in e) "filters" !== r && (o[r] = e[r]); if (e.filters) for (o.filters = [], n = 0, i = e.filters.length; i > n; n++) o.filters[n] = M(e.filters[n], t); else o.field = P(t.fields, o.field); return o } function z(e, t) { var n, i, r, o, a, s = []; for (n = 0, i = e.length; i > n; n++) { r = {}, o = e[n]; for (a in o) r[a] = o[a]; r.field = P(t.fields, r.field), r.aggregates && rt(r.aggregates) && (r.aggregates = z(r.aggregates, t)), s.push(r) } return s } function F(t, n) { var i, r, o, a, s, l, c, d, u, h; for (t = e(t)[0], i = t.options, r = n[0], o = n[1], a = [], s = 0, l = i.length; l > s; s++) u = {}, d = i[s], c = d.parentNode, c === t && (c = null), d.disabled || c && c.disabled || (c && (u.optgroup = c.label), u[r.field] = d.text, h = d.attributes.value, h = h && h.specified ? d.value : d.text, u[o.field] = h, a.push(u)); return a } function R(t, n) { var i, r, o, a, s, l, c, d = e(t)[0].tBodies[0], u = d ? d.rows : [], h = n.length, p = []; for (i = 0, r = u.length; r > i; i++) { for (s = {}, c = !0, a = u[i].cells, o = 0; h > o; o++) l = a[o], "th" !== l.nodeName.toLowerCase() && (c = !1, s[n[o].field] = l.innerHTML); c || p.push(s) } return p } function H(e) { return function() { var t = this._data, n = Y.fn[e].apply(this, Ht.call(arguments)); return this._data != t && this._attachBubbleHandlers(), n } } function B(t, n) { function i(e, t) { return e.filter(t).add(e.find(t)) } var r, o, a, s, l, c, d, u, h = e(t).children(), p = [], f = n[0].field, g = n[1] && n[1].field, m = n[2] && n[2].field, v = n[3] && n[3].field; for (r = 0, o = h.length; o > r; r++) a = { _loaded: !0 }, s = h.eq(r), c = s[0].firstChild, u = s.children(), t = u.filter("ul"), u = u.filter(":not(ul)"), l = s.attr("data-id"), l && (a.id = l), c && (a[f] = 3 == c.nodeType ? c.nodeValue : u.text()), g && (a[g] = i(u, "a").attr("href")), v && (a[v] = i(u, "img").attr("src")), m && (d = i(u, ".k-sprite").prop("className"), a[m] = d && e.trim(d.replace("k-sprite", ""))), t.length && (a.items = B(t.eq(0), n)), "true" == s.attr("data-hasChildren") && (a.hasChildren = !0), p.push(a); return p } var L, N, O, V, U, W, j, G, q, $, Y, Q, K, X, Z, J, et = e.extend, tt = e.proxy, nt = e.isPlainObject, it = e.isEmptyObject, rt = e.isArray, ot = e.grep, at = e.ajax, st = e.each, lt = e.noop, ct = window.kendo, dt = ct.isFunction, ut = ct.Observable, ht = ct.Class, pt = "string", ft = "function", gt = "create", mt = "read", vt = "update", _t = "destroy", wt = "change", bt = "sync", yt = "get", kt = "error", xt = "requestStart", Ct = "progress", St = "requestEnd", Tt = [gt, mt, vt, _t], Dt = function(e) { return e }, At = ct.getter, Et = ct.stringify, It = Math, Pt = [].push, Mt = [].join, zt = [].pop, Ft = [].splice, Rt = [].shift, Ht = [].slice, Bt = [].unshift, Lt = {}.toString, Nt = ct.support.stableSort, Ot = /^\/Date\((.*?)\)\/$/, Vt = /(\r+|\n+)/g, Ut = /(?=['\\])/g, Wt = ut.extend({ init: function(e, t) { var n = this; n.type = t || Gt, ut.fn.init.call(n), n.length = e.length, n.wrapAll(e, n) }, at: function(e) { return this[e] }, toJSON: function() { var e, t, n = this.length, i = Array(n); for (e = 0; n > e; e++) t = this[e], t instanceof Gt && (t = t.toJSON()), i[e] = t; return i }, parent: lt, wrapAll: function(e, t) { var n, i, r = this, o = function() { return r }; for (t = t || [], n = 0, i = e.length; i > n; n++) t[n] = r.wrap(e[n], o); return t }, wrap: function(e, t) { var n, i = this; return null !== e && "[object Object]" === Lt.call(e) && (n = e instanceof i.type || e instanceof Yt, n || (e = e instanceof Gt ? e.toJSON() : e, e = new i.type(e)), e.parent = t, e.bind(wt, function(e) { i.trigger(wt, { field: e.field, node: e.node, index: e.index, items: e.items || [this], action: e.node ? e.action || "itemloaded" : "itemchange" }) })), e }, push: function() { var e, t = this.length, n = this.wrapAll(arguments); return e = Pt.apply(this, n), this.trigger(wt, { action: "add", index: t, items: n }), e }, slice: Ht, sort: [].sort, join: Mt, pop: function() { var e = this.length, t = zt.apply(this); return e && this.trigger(wt, { action: "remove", index: e - 1, items: [t] }), t }, splice: function(e, t, n) { var i, r, o, a = this.wrapAll(Ht.call(arguments, 2)); if (i = Ft.apply(this, [e, t].concat(a)), i.length) for (this.trigger(wt, { action: "remove", index: e, items: i }), r = 0, o = i.length; o > r; r++) i[r] && i[r].children && i[r].unbind(wt); return n && this.trigger(wt, { action: "add", index: e, items: a }), i }, shift: function() { var e = this.length, t = Rt.apply(this); return e && this.trigger(wt, { action: "remove", index: 0, items: [t] }), t }, unshift: function() { var e, t = this.wrapAll(arguments); return e = Bt.apply(this, t), this.trigger(wt, { action: "add", index: 0, items: t }), e }, indexOf: function(e) { var t, n, i = this; for (t = 0, n = i.length; n > t; t++) if (i[t] === e) return t; return -1 }, forEach: function(e) { for (var t = 0, n = this.length; n > t; t++) e(this[t], t, this) }, map: function(e) { for (var t = 0, n = [], i = this.length; i > t; t++) n[t] = e(this[t], t, this); return n }, reduce: function(e) { var t, n = 0, i = this.length; for (2 == arguments.length ? t = arguments[1] : i > n && (t = this[n++]); i > n; n++) t = e(t, this[n], n, this); return t }, reduceRight: function(e) { var t, n = this.length - 1; for (2 == arguments.length ? t = arguments[1] : n > 0 && (t = this[n--]); n >= 0; n--) t = e(t, this[n], n, this); return t }, filter: function(e) { for (var t, n = 0, i = [], r = this.length; r > n; n++) t = this[n], e(t, n, this) && (i[i.length] = t); return i }, find: function(e) { for (var t, n = 0, i = this.length; i > n; n++) if (t = this[n], e(t, n, this)) return t }, every: function(e) { for (var t, n = 0, i = this.length; i > n; n++) if (t = this[n], !e(t, n, this)) return !1; return !0 }, some: function(e) { for (var t, n = 0, i = this.length; i > n; n++) if (t = this[n], e(t, n, this)) return !0; return !1 }, remove: function(e) { var t = this.indexOf(e); - 1 !== t && this.splice(t, 1) }, empty: function() { this.splice(0, this.length) } }), jt = Wt.extend({ init: function(e, t) { ut.fn.init.call(this), this.type = t || Gt; for (var n = 0; e.length > n; n++) this[n] = e[n]; this.length = n, this._parent = tt(function() { return this }, this) }, at: function(e) { var t = this[e]; return t instanceof this.type ? t.parent = this._parent : t = this[e] = this.wrap(t, this._parent), t } }), Gt = ut.extend({ init: function(e) { var t, n, i = this, r = function() { return i }; ut.fn.init.call(this); for (n in e) t = e[n], "object" == typeof t && t && !t.getTime && "_" != n.charAt(0) && (t = i.wrap(t, n, r)), i[n] = t; i.uid = ct.guid() }, shouldSerialize: function(e) { return this.hasOwnProperty(e) && "_events" !== e && typeof this[e] !== ft && "uid" !== e }, forEach: function(e) { for (var t in this) this.shouldSerialize(t) && e(this[t], t) }, toJSON: function() { var e, t, n = {}; for (t in this) this.shouldSerialize(t) && (e = this[t], (e instanceof Gt || e instanceof Wt) && (e = e.toJSON()), n[t] = e); return n }, get: function(e) { var t, n = this; return n.trigger(yt, { field: e }), t = "this" === e ? n : ct.getter(e, !0)(n) }, _set: function(e, t) { var n, i, r, o = this, a = e.indexOf(".") >= 0; if (a) for (n = e.split("."), i = ""; n.length > 1;) { if (i += n.shift(), r = ct.getter(i, !0)(o), r instanceof Gt) return r.set(n.join("."), t), a; i += "." } return ct.setter(e)(o, t), a }, set: function(e, t) { var n = this, i = e.indexOf(".") >= 0, r = ct.getter(e, !0)(n); r !== t && (n.trigger("set", { field: e, value: t }) || (i || (t = n.wrap(t, e, function() { return n })), (!n._set(e, t) || e.indexOf("(") >= 0 || e.indexOf("[") >= 0) && n.trigger(wt, { field: e }))) }, parent: lt, wrap: function(e, t, i) { var r, o, a = this, s = Lt.call(e); return null == e || "[object Object]" !== s && "[object Array]" !== s || (r = e instanceof Wt, o = e instanceof Y, "[object Object]" !== s || o || r ? ("[object Array]" === s || r || o) && (r || o || (e = new Wt(e)), e.parent() != i() && e.bind(wt, n(a, wt, t, !1))) : (e instanceof Gt || (e = new Gt(e)), e.parent() != i() && (e.bind(yt, n(a, yt, t, !0)), e.bind(wt, n(a, wt, t, !0)))), e.parent = i), e } }), qt = { number: function(e) { return ct.parseFloat(e) }, date: function(e) { return ct.parseDate(e) }, "boolean": function(e) { return typeof e === pt ? "true" === e.toLowerCase() : null != e ? !!e : e }, string: function(e) { return null != e ? e + "" : e }, "default": function(e) { return e } }, $t = { string: "", number: 0, date: new Date, "boolean": !1, "default": "" }, Yt = Gt.extend({ init: function(n) { var i, r, o = this; if ((!n || e.isEmptyObject(n)) && (n = e.extend({}, o.defaults, n), o._initializers)) for (i = 0; o._initializers.length > i; i++) r = o._initializers[i], n[r] = o.defaults[r](); Gt.fn.init.call(o, n), o.dirty = !1, o.idField && (o.id = o.get(o.idField), o.id === t && (o.id = o._defaultId)) }, shouldSerialize: function(e) { return Gt.fn.shouldSerialize.call(this, e) && "uid" !== e && !("id" !== this.idField && "id" === e) && "dirty" !== e && "_accessors" !== e }, _parse: function(e, t) { var n, i = this, o = e, a = i.fields || {}; return e = a[e], e || (e = r(a, o)), e && (n = e.parse, !n && e.type && (n = qt[e.type.toLowerCase()])), n ? n(t) : t }, _notifyChange: function(e) { var t = e.action; ("add" == t || "remove" == t) && (this.dirty = !0) }, editable: function(e) { return e = (this.fields || {})[e], e ? e.editable !== !1 : !0 }, set: function(e, t, n) { var r = this; r.editable(e) && (t = r._parse(e, t), i(t, r.get(e)) || (r.dirty = !0, Gt.fn.set.call(r, e, t, n))) }, accept: function(e) { var t, n, i = this, r = function() { return i }; for (t in e) n = e[t], "_" != t.charAt(0) && (n = i.wrap(e[t], t, r)), i._set(t, n); i.idField && (i.id = i.get(i.idField)), i.dirty = !1 }, isNew: function() { return this.id === this._defaultId } }); Yt.define = function(e, n) { n === t && (n = e, e = Yt); var i, r, o, a, s, l, c, d, u = et({ defaults: {} }, n), h = {}, p = u.id, f = []; if (p && (u.idField = p), u.id && delete u.id, p && (u.defaults[p] = u._defaultId = ""), "[object Array]" === Lt.call(u.fields)) { for (l = 0, c = u.fields.length; c > l; l++) o = u.fields[l], typeof o === pt ? h[o] = {} : o.field && (h[o.field] = o); u.fields = h } for (r in u.fields) o = u.fields[r], a = o.type || "default", s = null, d = r, r = typeof o.field === pt ? o.field : r, o.nullable || (s = u.defaults[d !== r ? d : r] = o.defaultValue !== t ? o.defaultValue : $t[a.toLowerCase()], "function" == typeof s && f.push(r)), n.id === r && (u._defaultId = s), u.defaults[d !== r ? d : r] = s, o.parse = o.parse || qt[a]; return f.length > 0 && (u._initializers = f), i = e.extend(u), i.define = function(e) { return Yt.define(i, e) }, u.fields && (i.fields = u.fields, i.idField = u.idField), i }, N = { selector: function(e) { return dt(e) ? e : At(e) }, compare: function(e) { var t = this.selector(e); return function(e, n) { return e = t(e), n = t(n), null == e && null == n ? 0 : null == e ? -1 : null == n ? 1 : e.localeCompare ? e.localeCompare(n) : e > n ? 1 : n > e ? -1 : 0 } }, create: function(e) { var t = e.compare || this.compare(e.field); return "desc" == e.dir ? function(e, n) { return t(n, e, !0) } : t }, combine: function(e) { return function(t, n) { var i, r, o = e[0](t, n); for (i = 1, r = e.length; r > i; i++) o = o || e[i](t, n); return o } } }, O = et({}, N, { asc: function(e) { var t = this.selector(e); return function(e, n) { var i = t(e), r = t(n); return i && i.getTime && r && r.getTime && (i = i.getTime(), r = r.getTime()), i === r ? e.__position - n.__position : null == i ? -1 : null == r ? 1 : i.localeCompare ? i.localeCompare(r) : i > r ? 1 : -1 } }, desc: function(e) { var t = this.selector(e); return function(e, n) { var i = t(e), r = t(n); return i && i.getTime && r && r.getTime && (i = i.getTime(), r = r.getTime()), i === r ? e.__position - n.__position : null == i ? 1 : null == r ? -1 : r.localeCompare ? r.localeCompare(i) : r > i ? 1 : -1 } }, create: function(e) { return this[e.dir](e.field) } }), L = function(e, t) { var n, i = e.length, r = Array(i); for (n = 0; i > n; n++) r[n] = t(e[n], n, e); return r }, V = function() { function e(e) { return e.replace(Ut, "\\").replace(Vt, "") } function t(t, n, i, r) { var o; return null != i && (typeof i === pt && (i = e(i), o = Ot.exec(i), o ? i = new Date(+o[1]) : r ? (i = "'" + i.toLowerCase() + "'", n = "(" + n + " || '').toLowerCase()") : i = "'" + i + "'"), i.getTime && (n = "(" + n + "?" + n + ".getTime():" + n + ")", i = i.getTime())), n + " " + t + " " + i } return { quote: function(t) { return t && t.getTime ? "new Date(" + t.getTime() + ")" : "string" == typeof t ? "'" + e(t) + "'" : "" + t }, eq: function(e, n, i) { return t("==", e, n, i) }, neq: function(e, n, i) { return t("!=", e, n, i) }, gt: function(e, n, i) { return t(">", e, n, i) }, gte: function(e, n, i) { return t(">=", e, n, i) }, lt: function(e, n, i) { return t("<", e, n, i) }, lte: function(e, n, i) { return t("<=", e, n, i) }, startswith: function(t, n, i) { return i && (t = "(" + t + " || '').toLowerCase()", n && (n = n.toLowerCase())), n && (n = e(n)), t + ".lastIndexOf('" + n + "', 0) == 0" }, endswith: function(t, n, i) { return i && (t = "(" + t + " || '').toLowerCase()", n && (n = n.toLowerCase())), n && (n = e(n)), t + ".indexOf('" + n + "', " + t + ".length - " + (n || "").length + ") >= 0" }, contains: function(t, n, i) { return i && (t = "(" + t + " || '').toLowerCase()", n && (n = n.toLowerCase())), n && (n = e(n)), t + ".indexOf('" + n + "') >= 0" }, doesnotcontain: function(t, n, i) { return i && (t = "(" + t + " || '').toLowerCase()", n && (n = n.toLowerCase())), n && (n = e(n)), t + ".indexOf('" + n + "') == -1" } } }(), o.filterExpr = function(e) { var n, i, r, a, s, l, c = [], d = { and: " && ", or: " || " }, u = [], h = [], p = e.filters; for (n = 0, i = p.length; i > n; n++) r = p[n], s = r.field, l = r.operator, r.filters ? (a = o.filterExpr(r), r = a.expression.replace(/__o\[(\d+)\]/g, function(e, t) { return t = +t, "__o[" + (h.length + t) + "]" }).replace(/__f\[(\d+)\]/g, function(e, t) { return t = +t, "__f[" + (u.length + t) + "]" }), h.push.apply(h, a.operators), u.push.apply(u, a.fields)) : (typeof s === ft ? (a = "__f[" + u.length + "](d)", u.push(s)) : a = ct.expr(s), typeof l === ft ? (r = "__o[" + h.length + "](" + a + ", " + V.quote(r.value) + ")", h.push(l)) : r = V[(l || "eq").toLowerCase()](a, r.value, r.ignoreCase !== t ? r.ignoreCase : !0)), c.push(r); return { expression: "(" + c.join(d[e.logic]) + ")", fields: u, operators: h } }, U = { "==": "eq", equals: "eq", isequalto: "eq", equalto: "eq", equal: "eq", "!=": "neq", ne: "neq", notequals: "neq", isnotequalto: "neq", notequalto: "neq", notequal: "neq", "<": "lt", islessthan: "lt", lessthan: "lt", less: "lt", "<=": "lte", le: "lte", islessthanorequalto: "lte", lessthanequal: "lte", ">": "gt", isgreaterthan: "gt", greaterthan: "gt", greater: "gt", ">=": "gte", isgreaterthanorequalto: "gte", greaterthanequal: "gte", ge: "gte", notsubstringof: "doesnotcontain" }, o.normalizeFilter = l, o.prototype = { toArray: function() { return this.data }, range: function(e, t) { return new o(this.data.slice(e, e + t)) }, skip: function(e) { return new o(this.data.slice(e)) }, take: function(e) { return new o(this.data.slice(0, e)) }, select: function(e) { return new o(L(this.data, e)) }, order: function(e, t) { var n = { dir: t }; return e && (e.compare ? n.compare = e.compare : n.field = e), new o(this.data.slice(0).sort(N.create(n))) }, orderBy: function(e) { return this.order(e, "asc") }, orderByDescending: function(e) { return this.order(e, "desc") }, sort: function(e, t, n) { var i, r, o = a(e, t), s = []; if (n = n || N, o.length) { for (i = 0, r = o.length; r > i; i++) s.push(n.create(o[i])); return this.orderBy({ compare: n.combine(s) }) } return this }, filter: function(e) { var t, n, i, r, a, s, c, d, u = this.data, h = []; if (e = l(e), !e || 0 === e.filters.length) return this; for (r = o.filterExpr(e), s = r.fields, c = r.operators, a = d = Function("d, __f, __o", "return " + r.expression), (s.length || c.length) && (d = function(e) { return a(e, s, c) }), t = 0, i = u.length; i > t; t++) n = u[t], d(n) && h.push(n); return new o(h) }, group: function(e, t) { e = d(e || []), t = t || this.data; var n, i = this, r = new o(i.data); return e.length > 0 && (n = e[0], r = r.groupBy(n).select(function(i) { var r = new o(t).filter([{ field: i.field, operator: "eq", value: i.value, ignoreCase: !1 }]); return { field: i.field, value: i.value, items: e.length > 1 ? new o(i.items).group(e.slice(1), r.toArray()).toArray() : i.items, hasSubgroups: e.length > 1, aggregates: r.aggregate(n.aggregates) } })), r }, groupBy: function(e) { if (it(e) || !this.data.length) return new o([]); var t, n, i, r, a = e.field, s = this._sortForGrouping(a, e.dir || "asc"), l = ct.accessor(a), c = l.get(s[0], a), d = { field: a, value: c, items: [] }, h = [d]; for (i = 0, r = s.length; r > i; i++) t = s[i], n = l.get(t, a), u(c, n) || (c = n, d = { field: a, value: c, items: [] }, h.push(d)), d.items.push(t); return new o(h) }, _sortForGrouping: function(e, t) { var n, i, r = this.data; if (!Nt) { for (n = 0, i = r.length; i > n; n++) r[n].__position = n; for (r = new o(r).sort(e, t, O).toArray(), n = 0, i = r.length; i > n; n++) delete r[n].__position; return r } return this.sort(e, t).toArray() }, aggregate: function(e) { var t, n, i = {}, r = {}; if (e && e.length) for (t = 0, n = this.data.length; n > t; t++) h(i, e, this.data[t], t, n, r); return i } }, W = { sum: function(e, t, n) { var i = n.get(t); return p(e) ? p(i) && (e += i) : e = i, e }, count: function(e) { return (e || 0) + 1 }, average: function(e, n, i, r, o, a) { var s = i.get(n); return a.count === t && (a.count = 0), p(e) ? p(s) && (e += s) : e = s, p(s) && a.count++, r == o - 1 && p(e) && (e /= a.count), e }, max: function(e, t, n) { var i = n.get(t); return p(e) || f(e) || (e = i), i > e && (p(i) || f(i)) && (e = i), e }, min: function(e, t, n) { var i = n.get(t); return p(e) || f(e) || (e = i), e > i && (p(i) || f(i)) && (e = i), e } }, o.process = function(e, n) { n = n || {}; var i, r = new o(e), s = n.group, l = d(s || []).concat(a(n.sort || [])), c = n.filterCallback, u = n.filter, h = n.skip, p = n.take; return u && (r = r.filter(u), c && (r = c(r)), i = r.toArray().length), l && (r = r.sort(l), s && (e = r.toArray())), h !== t && p !== t && (r = r.range(h, p)), s && (r = r.group(s, e)), { total: i, data: r.toArray() } }, j = ht.extend({ init: function(e) { this.data = e.data }, read: function(e) { e.success(this.data) }, update: function(e) { e.success(e.data) }, create: function(e) { e.success(e.data) }, destroy: function(e) { e.success(e.data) } }), G = ht.extend({ init: function(e) { var t, n = this; e = n.options = et({}, n.options, e), st(Tt, function(t, n) { typeof e[n] === pt && (e[n] = { url: e[n] }) }), n.cache = e.cache ? q.create(e.cache) : { find: lt, add: lt }, t = e.parameterMap, dt(e.push) && (n.push = e.push), n.push || (n.push = Dt), n.parameterMap = dt(t) ? t : function(e) { var n = {}; return st(e, function(e, i) { e in t && (e = t[e], nt(e) && (i = e.value(i), e = e.key)), n[e] = i }), n } }, options: { parameterMap: Dt }, create: function(e) { return at(this.setup(e, gt)) }, read: function(n) { var i, r, o, a = this, s = a.cache; n = a.setup(n, mt), i = n.success || lt, r = n.error || lt, o = s.find(n.data), o !== t ? i(o) : (n.success = function(e) { s.add(n.data, e), i(e) }, e.ajax(n)) }, update: function(e) { return at(this.setup(e, vt)) }, destroy: function(e) { return at(this.setup(e, _t)) }, setup: function(e, t) { e = e || {}; var n, i = this, r = i.options[t], o = dt(r.data) ? r.data(e.data) : r.data; return e = et(!0, {}, r, e), n = et(!0, {}, o, e.data), e.data = i.parameterMap(n, t), dt(e.url) && (e.url = e.url(n)), e } }), q = ht.extend({ init: function() { this._store = {} }, add: function(e, n) { e !== t && (this._store[Et(e)] = n) }, find: function(e) { return this._store[Et(e)] }, clear: function() { this._store = {} }, remove: function(e) { delete this._store[Et(e)] } }), q.create = function(e) { var t = { inmemory: function() { return new q } }; return nt(e) && dt(e.find) ? e : e === !0 ? new q : t[e]() }, $ = ht.extend({ init: function(e) { var t, n, i, r, o, a, s, l, c, d, u, h, p, f = this; e = e || {}; for (t in e) n = e[t], f[t] = typeof n === pt ? At(n) : n; r = e.modelBase || Yt, nt(f.model) && (f.model = i = r.define(f.model)), o = tt(f.data, f), f._dataAccessFunction = o, f.model && (a = tt(f.groups, f), s = tt(f.serialize, f), l = {}, c = {}, d = {}, u = {}, h = !1, i = f.model, i.fields && (st(i.fields, function(e, t) { var n; p = e, nt(t) && t.field ? p = t.field : typeof t === pt && (p = t), nt(t) && t.from && (n = t.from), h = h || n && n !== e || p !== e, c[e] = At(n || p), d[e] = At(e), l[n || p] = e, u[e] = n || p }), !e.serialize && h && (f.serialize = w(s, i, m, d, l, u))), f._dataAccessFunction = o, f.data = w(o, i, v, c, l, u), f.groups = w(a, i, _, c, l, u)) }, errors: function(e) { return e ? e.errors : null }, parse: Dt, data: Dt, total: function(e) { return e.length }, groups: Dt, aggregates: function() { return {} }, serialize: function(e) { return e } }), Y = ut.extend({ init: function(e) { var n, i, r, o = this; e && (i = e.data), e = o.options = et({}, o.options, e), o._map = {}, o._prefetch = {}, o._data = [], o._pristineData = [], o._ranges = [], o._view = [], o._pristineTotal = 0, o._destroyed = [], o._pageSize = e.pageSize, o._page = e.page || (e.pageSize ? 1 : t), o._sort = a(e.sort), o._filter = l(e.filter), o._group = d(e.group), o._aggregate = e.aggregate, o._total = e.total, o._shouldDetachObservableParents = !0, ut.fn.init.call(o), o.transport = Q.create(e, i, o), dt(o.transport.push) && o.transport.push({ pushCreate: tt(o._pushCreate, o), pushUpdate: tt(o._pushUpdate, o), pushDestroy: tt(o._pushDestroy, o) }), null != e.offlineStorage && ("string" == typeof e.offlineStorage ? (r = e.offlineStorage, o._storage = { getItem: function() { return JSON.parse(localStorage.getItem(r)) }, setItem: function(e) { localStorage.setItem(r, Et(o.reader.serialize(e))) } }) : o._storage = e.offlineStorage), o.reader = new ct.data.readers[e.schema.type || "json"](e.schema), n = o.reader.model || {}, o._detachObservableParents(), o._data = o._observe(o._data), o._online = !0, o.bind(["push", kt, wt, xt, bt, St, Ct], e) }, options: { data: null, schema: { modelBase: Yt }, offlineStorage: null, serverSorting: !1, serverPaging: !1, serverFiltering: !1, serverGrouping: !1, serverAggregates: !1, batch: !1 }, clone: function() { return this }, online: function(n) { return n !== t ? this._online != n && (this._online = n, n) ? this.sync() : e.Deferred().resolve().promise() : this._online }, offlineData: function(e) { return null == this.options.offlineStorage ? null : e !== t ? this._storage.setItem(e) : this._storage.getItem() || [] }, _isServerGrouped: function() { var e = this.group() || []; return this.options.serverGrouping && e.length }, _pushCreate: function(e) { this._push(e, "pushCreate") }, _pushUpdate: function(e) { this._push(e, "pushUpdate") }, _pushDestroy: function(e) { this._push(e, "pushDestroy") }, _push: function(e, t) { var n = this._readData(e); n || (n = e), this[t](n) }, _flatData: function(e, t) { if (e) { if (this._isServerGrouped()) return y(e); if (!t) for (var n = 0; e.length > n; n++) e.at(n) } return e }, parent: lt, get: function(e) { var t, n, i = this._flatData(this._data); for (t = 0, n = i.length; n > t; t++) if (i[t].id == e) return i[t] }, getByUid: function(e) { var t, n, i = this._flatData(this._data); if (i) for (t = 0, n = i.length; n > t; t++) if (i[t].uid == e) return i[t] }, indexOf: function(e) { return E(this._data, e) }, at: function(e) { return this._data.at(e) }, data: function(e) { var n, i = this; if (e === t) { if (i._data) for (n = 0; i._data.length > n; n++) i._data.at(n); return i._data } i._detachObservableParents(), i._data = this._observe(e), i._pristineData = e.slice(0), i._storeData(), i._ranges = [], i.trigger("reset"), i._addRange(i._data), i._total = i._data.length, i._pristineTotal = i._total, i._process(i._data) }, view: function(e) { return e === t ? this._view : (this._view = this._observeView(e), t) }, _observeView: function(e) { var t, n = this; return T(e, n._data, n._ranges, n.reader.model || Gt, n._isServerGrouped()), t = new jt(e, n.reader.model), t.parent = function() { return n.parent() }, t }, flatView: function() { var e = this.group() || []; return e.length ? y(this._view) : this._view }, add: function(e) { return this.insert(this._data.length, e) }, _createNewModel: function(e) { return this.reader.model ? new this.reader.model(e) : e instanceof Gt ? e : new Gt(e) }, insert: function(e, t) { return t || (t = e, e = 0), t instanceof Yt || (t = this._createNewModel(t)), this._isServerGrouped() ? this._data.splice(e, 0, this._wrapInEmptyGroup(t)) : this._data.splice(e, 0, t), t }, pushCreate: function(e) { var t, n, i, r, o, a; rt(e) || (e = [e]), t = [], n = this.options.autoSync, this.options.autoSync = !1; try { for (i = 0; e.length > i; i++) r = e[i], o = this.add(r), t.push(o), a = o.toJSON(), this._isServerGrouped() && (a = this._wrapInEmptyGroup(a)), this._pristineData.push(a) } finally { this.options.autoSync = n } t.length && this.trigger("push", { type: "create", items: t }) }, pushUpdate: function(e) { var t, n, i, r, o; for (rt(e) || (e = [e]), t = [], n = 0; e.length > n; n++) i = e[n], r = this._createNewModel(i), o = this.get(r.id), o ? (t.push(o), o.accept(i), o.trigger(wt), this._updatePristineForModel(o, i)) : this.pushCreate(i); t.length && this.trigger("push", { type: "update", items: t }) }, pushDestroy: function(e) { var t = this._removeItems(e); t.length && this.trigger("push", { type: "destroy", items: t }) }, _removeItems: function(e) { var t, n, i, r, o, a; rt(e) || (e = [e]), t = [], n = this.options.autoSync, this.options.autoSync = !1; try { for (i = 0; e.length > i; i++) r = e[i], o = this._createNewModel(r), a = !1, this._eachItem(this._data, function(e) { var n, i; for (n = 0; e.length > n; n++) if (i = e.at(n), i.id === o.id) { t.push(i), e.splice(n, 1), a = !0; break } }), a && (this._removePristineForModel(o), this._destroyed.pop()) } finally { this.options.autoSync = n } return t }, remove: function(e) { var n, i = this, r = i._isServerGrouped(); return this._eachItem(i._data, function(o) { return n = D(o, e), n && r ? (n.isNew && n.isNew() || i._destroyed.push(n), !0) : t }), this._removeModelFromRanges(e), this._updateRangesLength(), e }, destroyed: function() { return this._destroyed }, created: function() { var e, t, n = [], i = this._flatData(this._data); for (e = 0, t = i.length; t > e; e++) i[e].isNew && i[e].isNew() && n.push(i[e]); return n }, updated: function() { var e, t, n = [], i = this._flatData(this._data); for (e = 0, t = i.length; t > e; e++) i[e].isNew && !i[e].isNew() && i[e].dirty && n.push(i[e]); return n }, sync: function() { var t, n = this, i = [], r = [], o = n._destroyed, a = (n._flatData(n._data), e.Deferred().resolve().promise()); if (n.online()) { if (!n.reader.model) return a; i = n.created(), r = n.updated(), t = [], n.options.batch && n.transport.submit ? t = n._sendSubmit(i, r, o) : (t.push.apply(t, n._send("create", i)), t.push.apply(t, n._send("update", r)), t.push.apply(t, n._send("destroy", o))), a = e.when.apply(null, t).then(function() { var e, t; for (e = 0, t = arguments.length; t > e; e++) n._accept(arguments[e]); n._storeData(!0), n._change({ action: "sync" }), n.trigger(bt) }) } else n._storeData(!0), n._change({ action: "sync" }); return a }, cancelChanges: function(e) { var t = this; e instanceof ct.data.Model ? t._cancelModel(e) : (t._destroyed = [], t._detachObservableParents(), t._data = t._observe(t._pristineData), t.options.serverPaging && (t._total = t._pristineTotal), t._ranges = [], t._addRange(t._data), t._change()) }, hasChanges: function() { var e, t, n = this._flatData(this._data); if (this._destroyed.length) return !0; for (e = 0, t = n.length; t > e; e++) if (n[e].isNew && n[e].isNew() || n[e].dirty) return !0; return !1 }, _accept: function(t) { var n, i = this, r = t.models, o = t.response, a = 0, s = i._isServerGrouped(), l = i._pristineData, c = t.type; if (i.trigger(St, { response: o, type: c }), o && !it(o)) { if (o = i.reader.parse(o), i._handleCustomErrors(o)) return; o = i.reader.data(o), rt(o) || (o = [o]) } else o = e.map(r, function(e) { return e.toJSON() }); for ("destroy" === c && (i._destroyed = []), a = 0, n = r.length; n > a; a++) "destroy" !== c ? (r[a].accept(o[a]), "create" === c ? l.push(s ? i._wrapInEmptyGroup(r[a]) : o[a]) : "update" === c && i._updatePristineForModel(r[a], o[a])) : i._removePristineForModel(r[a]) }, _updatePristineForModel: function(e, t) { this._executeOnPristineForModel(e, function(e, n) { ct.deepExtend(n[e], t) }) }, _executeOnPristineForModel: function(e, n) { this._eachPristineItem(function(i) { var r = A(i, e); return r > -1 ? (n(r, i), !0) : t }) }, _removePristineForModel: function(e) { this._executeOnPristineForModel(e, function(e, t) { t.splice(e, 1) }) }, _readData: function(e) { var t = this._isServerGrouped() ? this.reader.groups : this.reader.data; return t.call(this.reader, e) }, _eachPristineItem: function(e) { this._eachItem(this._pristineData, e) }, _eachItem: function(e, t) { e && e.length && (this._isServerGrouped() ? x(e, t) : t(e)) }, _pristineForModel: function(e) { var n, i, r = function(r) { return i = A(r, e), i > -1 ? (n = r[i], !0) : t }; return this._eachPristineItem(r), n }, _cancelModel: function(e) { var t = this._pristineForModel(e); this._eachItem(this._data, function(n) { var i = E(n, e); i >= 0 && (!t || e.isNew() && !t.__state__ ? n.splice(i, 1) : n[i].accept(t)) }) }, _submit: function(t, n) { var i = this; i.trigger(xt, { type: "submit" }), i.transport.submit(et({ success: function(n, i) { var r = e.grep(t, function(e) { return e.type == i })[0]; r && r.resolve({ response: n, models: r.models, type: i }) }, error: function(e, n, r) { for (var o = 0; t.length > o; o++) t[o].reject(e); i.error(e, n, r) } }, n)) }, _sendSubmit: function(t, n, i) { var r = this, o = []; return r.options.batch && (t.length && o.push(e.Deferred(function(e) { e.type = "create", e.models = t })), n.length && o.push(e.Deferred(function(e) { e.type = "update", e.models = n })), i.length && o.push(e.Deferred(function(e) { e.type = "destroy", e.models = i })), r._submit(o, { data: { created: r.reader.serialize(g(t)), updated: r.reader.serialize(g(n)), destroyed: r.reader.serialize(g(i)) } })), o }, _promise: function(t, n, i) { var r = this; return e.Deferred(function(e) { r.trigger(xt, { type: i }), r.transport[i].call(r.transport, et({ success: function(t) { e.resolve({ response: t, models: n, type: i }) }, error: function(t, n, i) { e.reject(t), r.error(t, n, i) } }, t)) }).promise() }, _send: function(e, t) { var n, i, r = this, o = [], a = r.reader.serialize(g(t)); if (r.options.batch) t.length && o.push(r._promise({ data: { models: a } }, t, e)); else for (n = 0, i = t.length; i > n; n++) o.push(r._promise({ data: a[n] }, [t[n]], e)); return o }, read: function(t) { var n = this, i = n._params(t), r = e.Deferred(); return n._queueRequest(i, function() { var e = n.trigger(xt, { type: "read" }); e ? (n._dequeueRequest(), r.resolve(e)) : (n.trigger(Ct), n._ranges = [], n.trigger("reset"), n.online() ? n.transport.read({ data: i, success: function(e) { n.success(e, i), r.resolve() }, error: function() { var e = Ht.call(arguments); n.error.apply(n, e), r.reject.apply(r, e) } }) : null != n.options.offlineStorage && (n.success(n.offlineData(), i), r.resolve())) }), r.promise() }, _readAggregates: function(e) { return this.reader.aggregates(e) }, success: function(e) { var n, i, r, o, a, s, l, c, d = this, u = d.options; if (d.trigger(St, { response: e, type: "read" }), d.online()) { if (e = d.reader.parse(e), d._handleCustomErrors(e)) return d._dequeueRequest(), t; d._total = d.reader.total(e), d._aggregate && u.serverAggregates && (d._aggregateResult = d._readAggregates(e)), e = d._readData(e) } else { for (e = d._readData(e), n = [], i = {}, r = d.reader.model, o = r ? r.idField : "id", a = 0; this._destroyed.length > a; a++) s = this._destroyed[a][o], i[s] = s; for (a = 0; e.length > a; a++) l = e[a], c = l.__state__, "destroy" == c ? i[l[o]] || this._destroyed.push(this._createNewModel(l)) : n.push(l); e = n, d._total = e.length } d._pristineTotal = d._total, d._pristineData = e.slice(0), d._detachObservableParents(), d._data = d._observe(e), null != d.options.offlineStorage && d._eachItem(d._data, function(e) { var t, n; for (t = 0; e.length > t; t++) n = e.at(t), "update" == n.__state__ && (n.dirty = !0) }), d._storeData(), d._addRange(d._data), d._process(d._data), d._dequeueRequest() }, _detachObservableParents: function() { if (this._data && this._shouldDetachObservableParents) for (var e = 0; this._data.length > e; e++) this._data[e].parent && (this._data[e].parent = lt) }, _storeData: function(e) { function t(e) { var n, i, r, s = []; for (n = 0; e.length > n; n++) i = e.at(n), r = i.toJSON(), o && i.items ? r.items = t(i.items) : (r.uid = i.uid, a && (i.isNew() ? r.__state__ = "create" : i.dirty && (r.__state__ = "update"))), s.push(r); return s } var n, i, r, o = this._isServerGrouped(), a = this.reader.model; if (null != this.options.offlineStorage) { for (n = t(this._data), i = 0; this._destroyed.length > i; i++) r = this._destroyed[i].toJSON(), r.__state__ = "destroy", n.push(r); this.offlineData(n), e && (this._pristineData = n) } }, _addRange: function(e) { var t = this, n = t._skip || 0, i = n + t._flatData(e, !0).length; t._ranges.push({ start: n, end: i, data: e, timestamp: (new Date).getTime() }), t._ranges.sort(function(e, t) { return e.start - t.start }) }, error: function(e, t, n) { this._dequeueRequest(), this.trigger(St, {}), this.trigger(kt, { xhr: e, status: t, errorThrown: n }) }, _params: function(e) { var t = this, n = et({ take: t.take(), skip: t.skip(), page: t.page(), pageSize: t.pageSize(), sort: t._sort, filter: t._filter, group: t._group, aggregate: t._aggregate }, e); return t.options.serverPaging || (delete n.take, delete n.skip, delete n.page, delete n.pageSize), t.options.serverGrouping ? t.reader.model && n.group && (n.group = z(n.group, t.reader.model)) : delete n.group, t.options.serverFiltering ? t.reader.model && n.filter && (n.filter = M(n.filter, t.reader.model)) : delete n.filter, t.options.serverSorting ? t.reader.model && n.sort && (n.sort = z(n.sort, t.reader.model)) : delete n.sort, t.options.serverAggregates ? t.reader.model && n.aggregate && (n.aggregate = z(n.aggregate, t.reader.model)) : delete n.aggregate, n }, _queueRequest: function(e, n) { var i = this; i._requestInProgress ? i._pending = { callback: tt(n, i), options: e } : (i._requestInProgress = !0, i._pending = t, n()) }, _dequeueRequest: function() { var e = this; e._requestInProgress = !1, e._pending && e._queueRequest(e._pending.options, e._pending.callback) }, _handleCustomErrors: function(e) { if (this.reader.errors) { var t = this.reader.errors(e); if (t) return this.trigger(kt, { xhr: null, status: "customerror", errorThrown: "custom error", errors: t }), !0 } return !1 }, _shouldWrap: function(e) { var t = this.reader.model; return t && e.length ? !(e[0] instanceof t) : !1 }, _observe: function(e) { var t, n = this, i = n.reader.model; return n._shouldDetachObservableParents = !0, e instanceof Wt ? (n._shouldDetachObservableParents = !1, n._shouldWrap(e) && (e.type = n.reader.model, e.wrapAll(e, e))) : (t = n.pageSize() && !n.options.serverPaging ? jt : Wt, e = new t(e, n.reader.model), e.parent = function() { return n.parent() }), n._isServerGrouped() && k(e, i), n._changeHandler && n._data && n._data instanceof Wt ? n._data.unbind(wt, n._changeHandler) : n._changeHandler = tt(n._change, n), e.bind(wt, n._changeHandler) }, _change: function(e) { var t, n, i, r = this, o = e ? e.action : ""; if ("remove" === o) for (t = 0, n = e.items.length; n > t; t++) e.items[t].isNew && e.items[t].isNew() || r._destroyed.push(e.items[t]); !r.options.autoSync || "add" !== o && "remove" !== o && "itemchange" !== o ? (i = parseInt(r._total, 10), p(r._total) || (i = parseInt(r._pristineTotal, 10)), "add" === o ? i += e.items.length : "remove" === o ? i -= e.items.length : "itemchange" === o || "sync" === o || r.options.serverPaging ? "sync" === o && (i = r._pristineTotal = parseInt(r._total, 10)) : i = r._pristineTotal, r._total = i, r._process(r._data, e)) : r.sync() }, _calculateAggregates: function(e, t) { t = t || {}; var n = new o(e), i = t.aggregate, r = t.filter; return r && (n = n.filter(r)), n.aggregate(i) }, _process: function(e, n) { var i, r = this, o = {}; r.options.serverPaging !== !0 && (o.skip = r._skip, o.take = r._take || r._pageSize, o.skip === t && r._page !== t && r._pageSize !== t && (o.skip = (r._page - 1) * r._pageSize)), r.options.serverSorting !== !0 && (o.sort = r._sort), r.options.serverFiltering !== !0 && (o.filter = r._filter), r.options.serverGrouping !== !0 && (o.group = r._group), r.options.serverAggregates !== !0 && (o.aggregate = r._aggregate, r._aggregateResult = r._calculateAggregates(e, o)), i = r._queryProcess(e, o), r.view(i.data), i.total === t || r.options.serverFiltering || (r._total = i.total), n = n || {}, n.items = n.items || r._view, r.trigger(wt, n) }, _queryProcess: function(e, t) { return o.process(e, t) }, _mergeState: function(e) { var n = this; return e !== t && (n._pageSize = e.pageSize, n._page = e.page, n._sort = e.sort, n._filter = e.filter, n._group = e.group, n._aggregate = e.aggregate, n._skip = e.skip, n._take = e.take, n._skip === t && (n._skip = n.skip(), e.skip = n.skip()), n._take === t && n._pageSize !== t && (n._take = n._pageSize, e.take = n._take), e.sort && (n._sort = e.sort = a(e.sort)), e.filter && (n._filter = e.filter = l(e.filter)), e.group && (n._group = e.group = d(e.group)), e.aggregate && (n._aggregate = e.aggregate = c(e.aggregate))), e }, query: function(n) { var i, r, o = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates; return o || (this._data === t || 0 === this._data.length) && !this._destroyed.length ? this.read(this._mergeState(n)) : (r = this.trigger(xt, { type: "read" }), r || (this.trigger(Ct), i = this._queryProcess(this._data, this._mergeState(n)), this.options.serverFiltering || (this._total = i.total !== t ? i.total : this._data.length), this._aggregateResult = this._calculateAggregates(this._data, n), this.view(i.data), this.trigger(St, { type: "read" }), this.trigger(wt, { items: i.data })), e.Deferred().resolve(r).promise()) }, fetch: function(e) { var t = this, n = function(n) { n !== !0 && dt(e) && e.call(t) }; return this._query().then(n) }, _query: function(e) { var t = this; return t.query(et({}, { page: t.page(), pageSize: t.pageSize(), sort: t.sort(), filter: t.filter(), group: t.group(), aggregate: t.aggregate() }, e)) }, next: function(e) { var n = this, i = n.page(), r = n.total(); return e = e || {}, !i || r && i + 1 > n.totalPages() ? t : (n._skip = i * n.take(), i += 1, e.page = i, n._query(e), i) }, prev: function(e) { var n = this, i = n.page(); return e = e || {}, i && 1 !== i ? (n._skip = n._skip - n.take(), i -= 1, e.page = i, n._query(e), i) : t }, page: function(e) { var n, i = this; return e !== t ? (e = It.max(It.min(It.max(e, 1), i.totalPages()), 1), i._query({ page: e }), t) : (n = i.skip(), n !== t ? It.round((n || 0) / (i.take() || 1)) + 1 : t) }, pageSize: function(e) { var n = this; return e !== t ? (n._query({ pageSize: e, page: 1 }), t) : n.take() }, sort: function(e) { var n = this; return e !== t ? (n._query({ sort: e }), t) : n._sort }, filter: function(e) { var n = this; return e === t ? n._filter : (n.trigger("reset"), n._query({ filter: e, page: 1 }), t) }, group: function(e) { var n = this; return e !== t ? (n._query({ group: e }), t) : n._group }, total: function() { return parseInt(this._total || 0, 10) }, aggregate: function(e) { var n = this; return e !== t ? (n._query({ aggregate: e }), t) : n._aggregate }, aggregates: function() { var e = this._aggregateResult; return it(e) && (e = this._emptyAggregates(this.aggregate())), e }, _emptyAggregates: function(e) { var t, n, i = {}; if (!it(e)) for (t = {}, rt(e) || (e = [e]), n = 0; e.length > n; n++) t[e[n].aggregate] = 0, i[e[n].field] = t; return i }, _wrapInEmptyGroup: function(e) { var t, n, i, r, o = this.group(); for (i = o.length - 1, r = 0; i >= r; i--) n = o[i], t = { value: e.get(n.field), field: n.field, items: t ? [t] : [e], hasSubgroups: !!t, aggregates: this._emptyAggregates(n.aggregates) }; return t }, totalPages: function() { var e = this, t = e.pageSize() || e.total(); return It.ceil((e.total() || 0) / t) }, inRange: function(e, t) { var n = this, i = It.min(e + t, n.total()); return !n.options.serverPaging && n._data.length > 0 ? !0 : n._findRange(e, i).length > 0 }, lastRange: function() { var e = this._ranges; return e[e.length - 1] || { start: 0, end: 0, data: [] } }, firstItemUid: function() { var e = this._ranges; return e.length && e[0].data.length && e[0].data[0].uid }, enableRequestsInProgress: function() { this._skipRequestsInProgress = !1 }, _timeStamp: function() { return (new Date).getTime() }, range: function(e, n) { var i, r, o, a, s, l, c, d; if (this._currentRequestTimeStamp = this._timeStamp(), this._skipRequestsInProgress = !0, e = It.min(e || 0, this.total()), i = this, r = It.max(It.floor(e / n), 0) * n, o = It.min(r + n, i.total()), a = i._findRange(e, It.min(e + n, i.total())), a.length) { i._pending = t, i._skip = e > i.skip() ? It.min(o, (i.totalPages() - 1) * i.take()) : r, i._take = n, s = i.options.serverPaging, l = i.options.serverSorting, c = i.options.serverFiltering, d = i.options.serverAggregates; try { i.options.serverPaging = !0, i._isServerGrouped() || i.group() && i.group().length || (i.options.serverSorting = !0), i.options.serverFiltering = !0, i.options.serverPaging = !0, i.options.serverAggregates = !0, s && (i._detachObservableParents(), i._data = a = i._observe(a)), i._process(a) } finally { i.options.serverPaging = s, i.options.serverSorting = l, i.options.serverFiltering = c, i.options.serverAggregates = d } } else n !== t && (i._rangeExists(r, o) ? e > r && i.prefetch(o, n, function() { i.range(e, n) }) : i.prefetch(r, n, function() { e > r && o < i.total() && !i._rangeExists(o, It.min(o + n, i.total())) ? i.prefetch(o, n, function() { i.range(e, n) }) : i.range(e, n) })) }, _findRange: function(e, n) { var i, r, o, s, l, c, u, h, p, f, g, m, v = this, _ = v._ranges, w = [], b = v.options, y = b.serverSorting || b.serverPaging || b.serverFiltering || b.serverGrouping || b.serverAggregates; for (r = 0, g = _.length; g > r; r++) if (i = _[r], e >= i.start && i.end >= e) { for (f = 0, o = r; g > o; o++) if (i = _[o], p = v._flatData(i.data, !0), p.length && e + f >= i.start && (c = i.data, u = i.end, y || (m = d(v.group() || []).concat(a(v.sort() || [])), h = v._queryProcess(i.data, { sort: m, filter: v.filter() }), p = c = h.data, h.total !== t && (u = h.total)), s = 0, e + f > i.start && (s = e + f - i.start), l = p.length, u > n && (l -= u - n), f += l - s, w = v._mergeGroups(w, c, s, l), i.end >= n && f == n - e)) return w; break } return [] }, _mergeGroups: function(e, t, n, i) { if (this._isServerGrouped()) { var r, o = t.toJSON(); return e.length && (r = e[e.length - 1]), b(r, o, n, i), e.concat(o) } return e.concat(t.slice(n, i)) }, skip: function() { var e = this; return e._skip === t ? e._page !== t ? (e._page - 1) * (e.take() || 1) : t : e._skip }, take: function() { return this._take || this._pageSize }, _prefetchSuccessHandler: function(e, t, n, i) { var r = this, o = r._timeStamp(); return function(a) { var s, l, c, d = !1, u = { start: e, end: t, data: [], timestamp: r._timeStamp() }; if (r._dequeueRequest(), r.trigger(St, { response: a, type: "read" }), a = r.reader.parse(a), c = r._readData(a), c.length) { for (s = 0, l = r._ranges.length; l > s; s++) if (r._ranges[s].start === e) { d = !0, u = r._ranges[s]; break } d || r._ranges.push(u) } u.data = r._observe(c), u.end = u.start + r._flatData(u.data, !0).length, r._ranges.sort(function(e, t) { return e.start - t.start }), r._total = r.reader.total(a), (i || o >= r._currentRequestTimeStamp || !r._skipRequestsInProgress) && (n && c.length ? n() : r.trigger(wt, {})) } }, prefetch: function(e, t, n) { var i = this, r = It.min(e + t, i.total()), o = { take: t, skip: e, page: e / t + 1, pageSize: t, sort: i._sort, filter: i._filter, group: i._group, aggregate: i._aggregate }; i._rangeExists(e, r) ? n && n() : (clearTimeout(i._timeout), i._timeout = setTimeout(function() { i._queueRequest(o, function() { i.trigger(xt, { type: "read" }) ? i._dequeueRequest() : i.transport.read({ data: i._params(o), success: i._prefetchSuccessHandler(e, r, n), error: function() { var e = Ht.call(arguments); i.error.apply(i, e) } }) }) }, 100)) }, _multiplePrefetch: function(e, t, n) { var i = this, r = It.min(e + t, i.total()), o = { take: t, skip: e, page: e / t + 1, pageSize: t, sort: i._sort, filter: i._filter, group: i._group, aggregate: i._aggregate }; i._rangeExists(e, r) ? n && n() : i.trigger(xt, { type: "read" }) || i.transport.read({ data: i._params(o), success: i._prefetchSuccessHandler(e, r, n, !0) }) }, _rangeExists: function(e, t) { var n, i, r = this, o = r._ranges; for (n = 0, i = o.length; i > n; n++) if (e >= o[n].start && o[n].end >= t) return !0; return !1 }, _removeModelFromRanges: function(e) { var t, n, i, r, o; for (r = 0, o = this._ranges.length; o > r && (i = this._ranges[r], this._eachItem(i.data, function(i) { t = D(i, e), t && (n = !0) }), !n); r++); }, _updateRangesLength: function() { var e, t, n, i, r = 0; for (n = 0, i = this._ranges.length; i > n; n++) e = this._ranges[n], e.start = e.start - r, t = this._flatData(e.data, !0).length, r = e.end - t, e.end = e.start + t } }), Q = {}, Q.create = function(t, n, i) { var r, o = t.transport ? e.extend({}, t.transport) : null; return o ? (o.read = typeof o.read === pt ? { url: o.read } : o.read, i && (o.dataSource = i), t.type && (ct.data.transports = ct.data.transports || {}, ct.data.schemas = ct.data.schemas || {}, ct.data.transports[t.type] && !nt(ct.data.transports[t.type]) ? r = new ct.data.transports[t.type](et(o, { data: n })) : o = et(!0, {}, ct.data.transports[t.type], o), t.schema = et(!0, {}, ct.data.schemas[t.type], t.schema)), r || (r = dt(o.read) ? o : new G(o))) : r = new j({ data: t.data || [] }), r }, Y.create = function(e) { (rt(e) || e instanceof Wt) && (e = { data: e }); var n, i, r, o = e || {}, a = o.data, s = o.fields, l = o.table, c = o.select, d = {}; if (a || !s || o.transport || (l ? a = R(l, s) : c && (a = F(c, s), o.group === t && a[0] && a[0].optgroup !== t && (o.group = "optgroup"))), ct.data.Model && s && (!o.schema || !o.schema.model)) { for (n = 0, i = s.length; i > n; n++) r = s[n], r.type && (d[r.field] = r); it(d) || (o.schema = et(!0, o.schema, { model: { fields: d } })) } return o.data = a, c = null, o.select = null, l = null, o.table = null, o instanceof Y ? o : new Y(o) }, K = Yt.define({ idField: "id", init: function(e) { var t = this, n = t.hasChildren || e && e.hasChildren, i = "items", r = {}; ct.data.Model.fn.init.call(t, e), typeof t.children === pt && (i = t.children), r = { schema: { data: i, model: { hasChildren: n, id: t.idField, fields: t.fields } } }, typeof t.children !== pt && et(r, t.children), r.data = e, n || (n = r.schema.data), typeof n === pt && (n = ct.getter(n)), dt(n) && (t.hasChildren = !!n.call(t, t)), t._childrenOptions = r, t.hasChildren && t._initChildren(), t._loaded = !(!e || !e[i] && !e._loaded) }, _initChildren: function() { var e, t, n, i = this; i.children instanceof X || (e = i.children = new X(i._childrenOptions), t = e.transport, n = t.parameterMap, t.parameterMap = function(e, t) { return e[i.idField || "id"] = i.id, n && (e = n(e, t)), e }, e.parent = function() { return i }, e.bind(wt, function(e) { e.node = e.node || i, i.trigger(wt, e) }), e.bind(kt, function(e) { var t = i.parent(); t && (e.node = e.node || i, t.trigger(kt, e)) }), i._updateChildrenField()) }, append: function(e) { this._initChildren(), this.loaded(!0), this.children.add(e) }, hasChildren: !1, level: function() { for (var e = this.parentNode(), t = 0; e && e.parentNode;) t++, e = e.parentNode ? e.parentNode() : null; return t }, _updateChildrenField: function() { var e = this._childrenOptions.schema.data; this[e || "items"] = this.children.data() }, _childrenLoaded: function() { this._loaded = !0, this._updateChildrenField() }, load: function() { var n, i, r = {}, o = "_query"; return this.hasChildren ? (this._initChildren(), n = this.children, r[this.idField || "id"] = this.id, this._loaded || (n._data = t, o = "read"), n.one(wt, tt(this._childrenLoaded, this)), i = n[o](r)) : this.loaded(!0), i || e.Deferred().resolve().promise() }, parentNode: function() { var e = this.parent(); return e.parent() }, loaded: function(e) { return e === t ? this._loaded : (this._loaded = e, t) }, shouldSerialize: function(e) { return Yt.fn.shouldSerialize.call(this, e) && "children" !== e && "_loaded" !== e && "hasChildren" !== e && "_childrenOptions" !== e } }), X = Y.extend({ init: function(e) { var t = K.define({ children: e }); Y.fn.init.call(this, et(!0, {}, { schema: { modelBase: t, model: t } }, e)), this._attachBubbleHandlers() }, _attachBubbleHandlers: function() { var e = this; e._data.bind(kt, function(t) { e.trigger(kt, t) }) }, remove: function(e) { var t, n = e.parentNode(), i = this; return n && n._initChildren && (i = n.children), t = Y.fn.remove.call(i, e), n && !i.data().length && (n.hasChildren = !1), t }, success: H("success"), data: H("data"), insert: function(e, t) { var n = this.parent(); return n && n._initChildren && (n.hasChildren = !0, n._initChildren()), Y.fn.insert.call(this, e, t) }, _find: function(e, t) { var n, i, r, o, a; if (r = Y.fn[e].call(this, t)) return r; if (o = this._flatData(this._data)) for (n = 0, i = o.length; i > n; n++) if (a = o[n].children, a instanceof X && (r = a[e](t))) return r }, get: function(e) { return this._find("get", e) }, getByUid: function(e) { return this._find("getByUid", e) } }), X.create = function(e) { e = e && e.push ? { data: e } : e; var t = e || {}, n = t.data, i = t.fields, r = t.list; return n && n._dataSource ? n._dataSource : (n || !i || t.transport || r && (n = B(r, i)), t.data = n, t instanceof X ? t : new X(t)) }, Z = ct.Observable.extend({ init: function(e, t, n) { ct.Observable.fn.init.call(this), this._prefetching = !1, this.dataSource = e, this.prefetch = !n; var i = this; e.bind("change", function() { i._change() }), e.bind("reset", function() { i._reset() }), this._syncWithDataSource(), this.setViewSize(t) }, setViewSize: function(e) { this.viewSize = e, this._recalculate() }, at: function(e) { var n = this.pageSize, i = !0; return e >= this.total() ? (this.trigger("endreached", { index: e }), null) : this.useRanges ? this.useRanges ? ((this.dataOffset > e || e >= this.skip + n) && (i = this.range(Math.floor(e / n) * n)), e === this.prefetchThreshold && this._prefetch(), e === this.midPageThreshold ? this.range(this.nextMidRange, !0) : e === this.nextPageThreshold ? this.range(this.nextFullRange) : e === this.pullBackThreshold && this.range(this.offset === this.skip ? this.previousMidRange : this.previousFullRange), i ? this.dataSource.at(e - this.dataOffset) : (this.trigger("endreached", { index: e }), null)) : t : this.dataSource.view()[e] }, indexOf: function(e) { return this.dataSource.data().indexOf(e) + this.dataOffset }, total: function() { return parseInt(this.dataSource.total(), 10) }, next: function() { var e = this, t = e.pageSize, n = e.skip - e.viewSize + t, i = It.max(It.floor(n / t), 0) * t; this.offset = n, this.dataSource.prefetch(i, t, function() { e._goToRange(n, !0) }) }, range: function(e, t) { if (this.offset === e) return !0; var n = this, i = this.pageSize, r = It.max(It.floor(e / i), 0) * i, o = this.dataSource; return t && (r += i), o.inRange(e, i) ? (this.offset = e, this._recalculate(), this._goToRange(e), !0) : this.prefetch ? (o.prefetch(r, i, function() { n.offset = e, n._recalculate(), n._goToRange(e, !0) }), !1) : !0 }, syncDataSource: function() { var e = this.offset; this.offset = null, this.range(e) }, destroy: function() { this.unbind() }, _prefetch: function() { var e = this, t = this.pageSize, n = this.skip + t, i = this.dataSource; i.inRange(n, t) || this._prefetching || !this.prefetch || (this._prefetching = !0, this.trigger("prefetching", { skip: n, take: t }), i.prefetch(n, t, function() { e._prefetching = !1, e.trigger("prefetched", { skip: n, take: t }) })) }, _goToRange: function(e, t) { this.offset === e && (this.dataOffset = e, this._expanding = t, this.dataSource.range(e, this.pageSize), this.dataSource.enableRequestsInProgress()) }, _reset: function() { this._syncPending = !0 }, _change: function() { var e = this.dataSource; this.length = this.useRanges ? e.lastRange().end : e.view().length, this._syncPending && (this._syncWithDataSource(), this._recalculate(), this._syncPending = !1, this.trigger("reset", { offset: this.offset })), this.trigger("resize"), this._expanding && this.trigger("expand"), delete this._expanding }, _syncWithDataSource: function() { var e = this.dataSource; this._firstItemUid = e.firstItemUid(), this.dataOffset = this.offset = e.skip() || 0, this.pageSize = e.pageSize(), this.useRanges = e.options.serverPaging }, _recalculate: function() { var e = this.pageSize, t = this.offset, n = this.viewSize, i = Math.ceil(t / e) * e; this.skip = i, this.midPageThreshold = i + e - 1, this.nextPageThreshold = i + n - 1, this.prefetchThreshold = i + Math.floor(e / 3 * 2), this.pullBackThreshold = this.offset - 1, this.nextMidRange = i + e - n, this.nextFullRange = i, this.previousMidRange = t - n, this.previousFullRange = i - e } }), J = ct.Observable.extend({ init: function(e, t) { var n = this; ct.Observable.fn.init.call(n), this.dataSource = e, this.batchSize = t, this._total = 0, this.buffer = new Z(e, 3 * t), this.buffer.bind({ endreached: function(e) { n.trigger("endreached", { index: e.index }) }, prefetching: function(e) { n.trigger("prefetching", { skip: e.skip, take: e.take }) }, prefetched: function(e) { n.trigger("prefetched", { skip: e.skip, take: e.take }) }, reset: function() { n._total = 0, n.trigger("reset") }, resize: function() { n._total = Math.ceil(this.length / n.batchSize), n.trigger("resize", { total: n.total(), offset: this.offset }) } }) }, syncDataSource: function() { this.buffer.syncDataSource() }, at: function(e) { var t, n, i = this.buffer, r = e * this.batchSize, o = this.batchSize, a = []; for (i.offset > r && i.at(i.offset - 1), n = 0; o > n && (t = i.at(r + n), null !== t); n++) a.push(t); return a }, total: function() { return this._total }, destroy: function() { this.buffer.destroy(), this.unbind() } }), et(!0, ct.data, { readers: { json: $ }, Query: o, DataSource: Y, HierarchicalDataSource: X, Node: K, ObservableObject: Gt, ObservableArray: Wt, LazyObservableArray: jt, LocalTransport: j, RemoteTransport: G, Cache: q, DataReader: $, Model: Yt, Buffer: Z, BatchBuffer: J }) }(window.kendo.jQuery), function(e, t) { function n(t, n, i) { return v.extend({ init: function(e, t, n) { var i = this; v.fn.init.call(i, e.element[0], t, n), i.widget = e, i._dataBinding = P(i.dataBinding, i), i._dataBound = P(i.dataBound, i), i._itemChange = P(i.itemChange, i) }, itemChange: function(e) { a(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[t]._parents())) }, dataBinding: function(e) { var t, n, i = this.widget, r = e.removedItems || i.items(); for (t = 0, n = r.length; n > t; t++) c(r[t]) }, _ns: function(t) { t = t || C.ui; var n = [C.ui, C.dataviz.ui, C.mobile.ui]; return n.splice(e.inArray(t, n), 1), n.unshift(t), C.rolesFromNamespaces(n) }, dataBound: function(e) { var i, r, o, s, l = this.widget, c = e.addedItems || l.items(), d = l[n], u = (d.group() || [], C.data.HierarchicalDataSource); if (!(u && d instanceof u) && c.length) for (o = e.addedDataItems || d.flatView(), s = this.bindings[t]._parents(), i = 0, r = o.length; r > i; i++) a(c[i], o[i], this._ns(e.ns), [o[i]].concat(s)) }, refresh: function(e) { var r, o = this, a = o.widget; e = e || {}, e.action || (o.destroy(), a.bind("dataBinding", o._dataBinding), a.bind("dataBound", o._dataBound), a.bind("itemChange", o._itemChange), r = o.bindings[t].get(), a[n] instanceof C.data.DataSource && a[n] != r && (r instanceof C.data.DataSource ? a[i](r) : r && r._dataSource ? a[i](r._dataSource) : (a[n].data(r), o.bindings.value && (a instanceof C.ui.Select || a instanceof C.ui.MultiSelect) && a.value(p(o.bindings.value.get(), a.options.dataValueField))))) }, destroy: function() { var e = this.widget; e.unbind("dataBinding", this._dataBinding), e.unbind("dataBound", this._dataBound), e.unbind("itemChange", this._itemChange) } }) } function i(e, n) { var i = C.initWidget(e, {}, n); return i ? new y(i) : t } function r(e) { var t, n, i, o, a, s, l, c = {}; for (l = e.match(k), t = 0, n = l.length; n > t; t++) i = l[t], o = i.indexOf(":"), a = i.substring(0, o), s = i.substring(o + 1), "{" == s.charAt(0) && (s = r(s)), c[a] = s; return c } function o(e, t, n) { var i, r = {}; for (i in e) r[i] = new n(t, e[i]); return r } function a(e, t, n, s) { var c, d, u, h = e.getAttribute("data-" + C.ns + "role"), p = e.getAttribute("data-" + C.ns + "bind"), v = e.children, _ = [], w = !0, y = {}; if (s = s || [t], (h || p) && l(e), h && (u = i(e, n)), p && (p = r(p.replace(x, "")), u || (y = C.parseOptions(e, { textField: "", valueField: "", template: "", valueUpdate: L, valuePrimitive: !1, autoBind: !0 }), y.roles = n, u = new b(e, y)), u.source = t, d = o(p, s, f), y.template && (d.template = new m(s, "", y.template)), d.click && (p.events = p.events || {}, p.events.click = p.click, d.click.destroy(), delete d.click), d.source && (w = !1), p.attr && (d.attr = o(p.attr, s, f)), p.style && (d.style = o(p.style, s, f)), p.events && (d.events = o(p.events, s, g)), p.css && (d.css = o(p.css, s, f)), u.bind(d)), u && (e.kendoBindingTarget = u), w && v) { for (c = 0; v.length > c; c++) _[c] = v[c]; for (c = 0; _.length > c; c++) a(_[c], t, n, s) } } function s(t, n) { var i, r, o, s = C.rolesFromNamespaces([].slice.call(arguments, 2)); for (n = C.observable(n), t = e(t), i = 0, r = t.length; r > i; i++) o = t[i], 1 === o.nodeType && a(o, n, s) } function l(e) { var t = e.kendoBindingTarget; t && (t.destroy(), B ? delete e.kendoBindingTarget : e.removeAttribute ? e.removeAttribute("kendoBindingTarget") : e.kendoBindingTarget = null) } function c(e) { l(e), d(e) } function d(e) { var t, n, i = e.children; if (i) for (t = 0, n = i.length; n > t; t++) c(i[t]) } function u(t) { var n, i; for (t = e(t), n = 0, i = t.length; i > n; n++) c(t[n]) } function h(e, t) { var n = e.element, i = n[0].kendoBindingTarget; i && s(n, i.source, t) } function p(e, t) { var n, i, r = [], o = 0; if (!t) return e; if (e instanceof D) { for (n = e.length; n > o; o++) i = e[o], r[o] = i.get ? i.get(t) : i[t]; e = r } else e instanceof T && (e = e.get(t)); return e } var f, g, m, v, _, w, b, y, k, x, C = window.kendo, S = C.Observable, T = C.data.ObservableObject, D = C.data.ObservableArray, A = {}.toString, E = {}, I = C.Class, P = e.proxy, M = "value", z = "source", F = "events", R = "checked", H = "css", B = !0, L = "change"; ! function() { var e = document.createElement("a"); try { delete e.test } catch (t) { B = !1 } }(), f = S.extend({ init: function(e, t) { var n = this; S.fn.init.call(n), n.source = e[0], n.parents = e, n.path = t, n.dependencies = {}, n.dependencies[t] = !0, n.observable = n.source instanceof S, n._access = function(e) { n.dependencies[e.field] = !0 }, n.observable && (n._change = function(e) { n.change(e) }, n.source.bind(L, n._change)) }, _parents: function() { var t, n = this.parents, i = this.get(); return i && "function" == typeof i.parent && (t = i.parent(), e.inArray(t, n) < 0 && (n = [t].concat(n))), n }, change: function(e) { var t, n, i = e.field, r = this; if ("this" === r.path) r.trigger(L, e); else for (t in r.dependencies) if (0 === t.indexOf(i) && (n = t.charAt(i.length), !n || "." === n || "[" === n)) { r.trigger(L, e); break } }, start: function(e) { e.bind("get", this._access) }, stop: function(e) { e.unbind("get", this._access) }, get: function() { var e = this, n = e.source, i = 0, r = e.path, o = n; if (!e.observable) return o; for (e.start(e.source), o = n.get(r); o === t && n;) n = e.parents[++i], n instanceof T && (o = n.get(r)); if (o === t) for (n = e.source; o === t && n;) n = n.parent(), n instanceof T && (o = n.get(r)); return "function" == typeof o && (i = r.lastIndexOf("."), i > 0 && (n = n.get(r.substring(0, i))), e.start(n), o = n !== e.source ? o.call(n, e.source) : o.call(n), e.stop(n)), n && n !== e.source && (e.currentSource = n, n.unbind(L, e._change).bind(L, e._change)), e.stop(e.source), o }, set: function(e) { var t = this.currentSource || this.source, n = C.getter(this.path)(t); "function" == typeof n ? t !== this.source ? n.call(t, this.source, e) : n.call(t, e) : t.set(this.path, e) }, destroy: function() { this.observable && (this.source.unbind(L, this._change), this.currentSource && this.currentSource.unbind(L, this._change)), this.unbind() } }), g = f.extend({ get: function() { var e, t = this.source, n = this.path, i = 0; for (e = t.get(n); !e && t;) t = this.parents[++i], t instanceof T && (e = t.get(n)); return P(e, t) } }), m = f.extend({ init: function(e, t, n) { var i = this; f.fn.init.call(i, e, t), i.template = n }, render: function(e) { var t; return this.start(this.source), t = C.render(this.template, e), this.stop(this.source), t } }), v = I.extend({ init: function(e, t, n) { this.element = e, this.bindings = t, this.options = n }, bind: function(e, t) { var n = this; e = t ? e[t] : e, e.bind(L, function(e) { n.refresh(t || e) }), n.refresh(t) }, destroy: function() {} }), _ = v.extend({ dataType: function() { var e = this.element.getAttribute("data-type") || this.element.type || "text"; return e.toLowerCase() }, parsedValue: function() { return this._parseValue(this.element.value, this.dataType()) }, _parseValue: function(e, t) { return "date" == t ? e = C.parseDate(e, "yyyy-MM-dd") : "datetime-local" == t ? e = C.parseDate(e, ["yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm"]) : "number" == t ? e = C.parseFloat(e) : "boolean" == t && (e = e.toLowerCase(), e = null !== C.parseFloat(e) ? !!C.parseFloat(e) : "true" === e.toLowerCase()), e } }), E.attr = v.extend({ refresh: function(e) { this.element.setAttribute(e, this.bindings.attr[e].get()) } }), E.css = v.extend({ init: function(e, t, n) { v.fn.init.call(this, e, t, n), this.classes = {} }, refresh: function(t) { var n = e(this.element), i = this.bindings.css[t], r = this.classes[t] = i.get(); r ? n.addClass(t) : n.removeClass(t) } }), E.style = v.extend({ refresh: function(e) { this.element.style[e] = this.bindings.style[e].get() || "" } }), E.enabled = v.extend({ refresh: function() { this.bindings.enabled.get() ? this.element.removeAttribute("disabled") : this.element.setAttribute("disabled", "disabled") } }), E.readonly = v.extend({ refresh: function() { this.bindings.readonly.get() ? this.element.setAttribute("readonly", "readonly") : this.element.removeAttribute("readonly") } }), E.disabled = v.extend({ refresh: function() { this.bindings.disabled.get() ? this.element.setAttribute("disabled", "disabled") : this.element.removeAttribute("disabled") } }), E.events = v.extend({ init: function(e, t, n) { v.fn.init.call(this, e, t, n), this.handlers = {} }, refresh: function(t) { var n = e(this.element), i = this.bindings.events[t], r = this.handlers[t]; r && n.off(t, r), r = this.handlers[t] = i.get(), n.on(t, i.source, r) }, destroy: function() { var t, n = e(this.element); for (t in this.handlers) n.off(t, this.handlers[t]) } }), E.text = v.extend({ refresh: function() { var t = this.bindings.text.get(), n = this.element.getAttribute("data-format") || ""; null == t && (t = ""), e(this.element).text(C.toString(t, n)) } }), E.visible = v.extend({ refresh: function() { this.element.style.display = this.bindings.visible.get() ? "" : "none" } }), E.invisible = v.extend({ refresh: function() { this.element.style.display = this.bindings.invisible.get() ? "none" : "" } }), E.html = v.extend({ refresh: function() { this.element.innerHTML = this.bindings.html.get() } }), E.value = _.extend({ init: function(t, n, i) { _.fn.init.call(this, t, n, i), this._change = P(this.change, this), this.eventName = i.valueUpdate || L, e(this.element).on(this.eventName, this._change), this._initChange = !1 }, change: function() { this._initChange = this.eventName != L, this.bindings[M].set(this.parsedValue()), this._initChange = !1 }, refresh: function() { var e, t; this._initChange || (e = this.bindings[M].get(), null == e && (e = ""), t = this.dataType(), "date" == t ? e = C.toString(e, "yyyy-MM-dd") : "datetime-local" == t && (e = C.toString(e, "yyyy-MM-ddTHH:mm:ss")), this.element.value = e), this._initChange = !1 }, destroy: function() { e(this.element).off(this.eventName, this._change) } }), E.source = v.extend({ init: function(e, t, n) { v.fn.init.call(this, e, t, n); var i = this.bindings.source.get(); i instanceof C.data.DataSource && n.autoBind !== !1 && i.fetch() }, refresh: function(e) { var t = this, n = t.bindings.source.get(); n instanceof D || n instanceof C.data.DataSource ? (e = e || {}, "add" == e.action ? t.add(e.index, e.items) : "remove" == e.action ? t.remove(e.index, e.items) : "itemchange" != e.action && t.render()) : t.render() }, container: function() { var e = this.element; return "table" == e.nodeName.toLowerCase() && (e.tBodies[0] || e.appendChild(document.createElement("tbody")), e = e.tBodies[0]), e }, template: function() { var e = this.options, t = e.template, n = this.container().nodeName.toLowerCase(); return t || (t = "select" == n ? e.valueField || e.textField ? C.format('<option value="#:{0}#">#:{1}#</option>', e.valueField || e.textField, e.textField || e.valueField) : "<option>#:data#</option>" : "tbody" == n ? "<tr><td>#:data#</td></tr>" : "ul" == n || "ol" == n ? "<li>#:data#</li>" : "#:data#", t = C.template(t)), t }, add: function(t, n) { var i, r, o, s, l = this.container(), c = l.cloneNode(!1), d = l.children[t]; if (e(c).html(C.render(this.template(), n)), c.children.length) for (i = this.bindings.source._parents(), r = 0, o = n.length; o > r; r++) s = c.children[0], l.insertBefore(s, d || null), a(s, n[r], this.options.roles, [n[r]].concat(i)) }, remove: function(e, t) { var n, i, r = this.container(); for (n = 0; t.length > n; n++) i = r.children[e], c(i), r.removeChild(i) }, render: function() { var t, n, i, r = this.bindings.source.get(), o = this.container(), s = this.template(); if (r instanceof C.data.DataSource && (r = r.view()), r instanceof D || "[object Array]" === A.call(r) || (r = [r]), this.bindings.template) { if (d(o), e(o).html(this.bindings.template.render(r)), o.children.length) for (t = this.bindings.source._parents(), n = 0, i = r.length; i > n; n++) a(o.children[n], r[n], this.options.roles, [r[n]].concat(t)) } else e(o).html(C.render(s, r)) } }), E.input = { checked: _.extend({ init: function(t, n, i) { _.fn.init.call(this, t, n, i), this._change = P(this.change, this), e(this.element).change(this._change) }, change: function() { var e, t, n, i = this.element, r = this.value(); if ("radio" == i.type) r = this.parsedValue(), this.bindings[R].set(r); else if ("checkbox" == i.type) if (e = this.bindings[R].get(), e instanceof D) { if (r = this.parsedValue(), r instanceof Date) { for (n = 0; e.length > n; n++) if (e[n] instanceof Date && +e[n] === +r) { t = n; break } } else t = e.indexOf(r); t > -1 ? e.splice(t, 1) : e.push(r) } else this.bindings[R].set(r) }, refresh: function() { var e, t, n = this.bindings[R].get(), i = n, r = this.dataType(), o = this.element; if ("checkbox" == o.type) if (i instanceof D) { if (e = -1, n = this.parsedValue(), n instanceof Date) { for (t = 0; i.length > t; t++) if (i[t] instanceof Date && +i[t] === +n) { e = t; break } } else e = i.indexOf(n); o.checked = e >= 0 } else o.checked = i; else "radio" == o.type && null != n && ("date" == r ? n = C.toString(n, "yyyy-MM-dd") : "datetime-local" == r && (n = C.toString(n, "yyyy-MM-ddTHH:mm:ss")), o.value === "" + n && (o.checked = !0)) }, value: function() { var e = this.element, t = e.value; return "checkbox" == e.type && (t = e.checked), t }, destroy: function() { e(this.element).off(L, this._change) } }) }, E.select = { source: E.source.extend({ refresh: function(n) { var i = this, r = i.bindings.source.get(); r instanceof D || r instanceof C.data.DataSource ? (n = n || {}, "add" == n.action ? i.add(n.index, n.items) : "remove" == n.action ? i.remove(n.index, n.items) : ("itemchange" == n.action || n.action === t) && (i.render(), i.bindings.value && i.bindings.value && (i.element.value = p(i.bindings.value.get(), e(i.element).data("valueField"))))) : i.render() } }), value: _.extend({ init: function(t, n, i) { _.fn.init.call(this, t, n, i), this._change = P(this.change, this), e(this.element).change(this._change) }, parsedValue: function() { var e, t, n, i, r = this.dataType(), o = []; for (n = 0, i = this.element.options.length; i > n; n++) t = this.element.options[n], t.selected && (e = t.attributes.value, e = e && e.specified ? t.value : t.text, o.push(this._parseValue(e, r))); return o }, change: function() { var e, n, i, r, o, a, s = [], l = this.options.valueField || this.options.textField, c = this.options.valuePrimitive; if (s = this.parsedValue(), l) for (e = this.bindings.source.get(), e instanceof C.data.DataSource && (e = e.view()), n = 0; s.length > n; n++) for (r = 0, o = e.length; o > r; r++) if (a = c ? this._parseValue(s[n], this.dataType()) === e[r].get(l) : "" + this._parseValue(e[r].get(l), this.dataType()) === s[n]) { s[n] = e[r]; break } i = this.bindings[M].get(), i instanceof D ? i.splice.apply(i, [0, i.length].concat(s)) : this.bindings[M].set(c || !(i instanceof T || null === i || i === t) && l ? s[0].get(l) : s[0]) }, refresh: function() { var e, t, n, i = this.element, r = i.options, o = this.bindings[M].get(), a = o, s = this.options.valueField || this.options.textField, l = !1, c = this.dataType(); for (a instanceof D || (a = new D([o])), i.selectedIndex = -1, n = 0; a.length > n; n++) for (o = a[n], s && o instanceof T && (o = o.get(s)), "date" == c ? o = C.toString(a[n], "yyyy-MM-dd") : "datetime-local" == c && (o = C.toString(a[n], "yyyy-MM-ddTHH:mm:ss")), e = 0; r.length > e; e++) t = r[e].value, "" === t && "" !== o && (t = r[e].text), null != o && t == "" + o && (r[e].selected = !0, l = !0) }, destroy: function() { e(this.element).off(L, this._change) } }) }, E.widget = { events: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e, this.handlers = {} }, refresh: function(e) { var t = this.bindings.events[e], n = this.handlers[e]; n && this.widget.unbind(e, n), n = t.get(), this.handlers[e] = function(e) { e.data = t.source, n(e), e.data === t.source && delete e.data }, this.widget.bind(e, this.handlers[e]) }, destroy: function() { var e; for (e in this.handlers) this.widget.unbind(e, this.handlers[e]) } }), checked: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e, this._change = P(this.change, this), this.widget.bind(L, this._change) }, change: function() { this.bindings[R].set(this.value()) }, refresh: function() { this.widget.check(this.bindings[R].get() === !0) }, value: function() { var e = this.element, t = e.value; return ("on" == t || "off" == t) && (t = e.checked), t }, destroy: function() { this.widget.unbind(L, this._change) } }), visible: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e }, refresh: function() { var e = this.bindings.visible.get(); this.widget.wrapper[0].style.display = e ? "" : "none" } }), invisible: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e }, refresh: function() { var e = this.bindings.invisible.get(); this.widget.wrapper[0].style.display = e ? "none" : "" } }), enabled: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e }, refresh: function() { this.widget.enable && this.widget.enable(this.bindings.enabled.get()) } }), disabled: v.extend({ init: function(e, t, n) { v.fn.init.call(this, e.element[0], t, n), this.widget = e }, refresh: function() { this.widget.enable && this.widget.enable(!this.bindings.disabled.get()) } }), source: n("source", "dataSource", "setDataSource"), value: v.extend({ init: function(t, n, i) { v.fn.init.call(this, t.element[0], n, i), this.widget = t, this._change = e.proxy(this.change, this), this.widget.first(L, this._change); var r = this.bindings.value.get(); this._valueIsObservableObject = !i.valuePrimitive && (null == r || r instanceof T), this._valueIsObservableArray = r instanceof D, this._initChange = !1 }, change: function() { var e, t, n, i, r, o, a, s = this.widget.value(), l = this.options.dataValueField || this.options.dataTextField, c = "[object Array]" === A.call(s), d = this._valueIsObservableObject, u = []; if (this._initChange = !0, l) if (this.bindings.source && (a = this.bindings.source.get()), "" === s && (d || this.options.valuePrimitive)) s = null; else { for ((!a || a instanceof C.data.DataSource) && (a = this.widget.dataSource.flatView()), c && (t = s.length, u = s.slice(0)), r = 0, o = a.length; o > r; r++) if (n = a[r], i = n.get(l), c) { for (e = 0; t > e; e++) if (i == u[e]) { u[e] = n; break } } else if (i == s) { s = d ? n : i; break } u[0] && (s = this._valueIsObservableArray ? u : d || !l ? u[0] : u[0].get(l)) } this.bindings.value.set(s), this._initChange = !1 }, refresh: function() { var e, n, i, r, o, a, s, l, c; if (!this._initChange) { if (e = this.widget, n = e.options, i = n.dataTextField, r = n.dataValueField || i, o = this.bindings.value.get(), a = n.text || "", s = 0, c = [], o === t && (o = null), r) if (o instanceof D) { for (l = o.length; l > s; s++) c[s] = o[s].get(r); o = c } else o instanceof T && (a = o.get(i), o = o.get(r)); n.autoBind !== !1 || n.cascadeFrom || !e.listView || e.listView.isBound() ? e.value(o) : (i !== r || a || (a = o), a || !o && 0 !== o || !n.valuePrimitive ? e._preselect(o, a) : e.value(o)) } this._initChange = !1 }, destroy: function() { this.widget.unbind(L, this._change) } }), gantt: { dependencies: n("dependencies", "dependencies", "setDependenciesDataSource") }, multiselect: { value: v.extend({ init: function(t, n, i) { v.fn.init.call(this, t.element[0], n, i), this.widget = t, this._change = e.proxy(this.change, this), this.widget.first(L, this._change), this._initChange = !1 }, change: function() { var e, n, i, r, o, a, s, l, c, d = this, u = d.bindings[M].get(), h = d.options.valuePrimitive, p = h ? d.widget.value() : d.widget.dataItems(), f = this.options.dataValueField || this.options.dataTextField; if (p = p.slice(0), d._initChange = !0, u instanceof D) { for (e = [], n = p.length, i = 0, r = 0, o = u[i], a = !1; o !== t;) { for (c = !1, r = 0; n > r; r++) if (h ? a = p[r] == o : (l = p[r], l = l.get ? l.get(f) : l, a = l == (o.get ? o.get(f) : o)), a) { p.splice(r, 1), n -= 1, c = !0; break } c ? i += 1 : (e.push(o), w(u, i, 1), s = i), o = u[i] } w(u, u.length, 0, p), e.length && u.trigger("change", { action: "remove", items: e, index: s }), p.length && u.trigger("change", { action: "add", items: p, index: u.length - 1 }) } else d.bindings[M].set(p); d._initChange = !1 }, refresh: function() { if (!this._initChange) { var e, n, i = this.options, r = this.widget, o = i.dataValueField || i.dataTextField, a = this.bindings.value.get(), s = a, l = 0, c = []; if (a === t && (a = null), o) if (a instanceof D) { for (e = a.length; e > l; l++) n = a[l], c[l] = n.get ? n.get(o) : n; a = c } else a instanceof T && (a = a.get(o)); i.autoBind !== !1 || i.valuePrimitive === !0 || r.listView.isBound() ? r.value(a) : r._preselect(s, a) } }, destroy: function() { this.widget.unbind(L, this._change) } }) }, scheduler: { source: n("source", "dataSource", "setDataSource").extend({ dataBound: function(e) { var t, n, i, r, o = this.widget, s = e.addedItems || o.items(); if (s.length) for (i = e.addedDataItems || o.dataItems(), r = this.bindings.source._parents(), t = 0, n = i.length; n > t; t++) a(s[t], i[t], this._ns(e.ns), [i[t]].concat(r)) } }) } }, w = function(e, t, n, i) { var r, o, a, s, l; if (i = i || [], n = n || 0, r = i.length, o = e.length, a = [].slice.call(e, t + n), s = a.length, r) { for (r = t + r, l = 0; r > t; t++) e[t] = i[l], l++; e.length = r } else if (n) for (e.length = t, n += t; n > t;) delete e[--n]; if (s) { for (s = t + s, l = 0; s > t; t++) e[t] = a[l], l++; e.length = s } for (t = e.length; o > t;) delete e[t], t++ }, b = I.extend({ init: function(e, t) { this.target = e, this.options = t, this.toDestroy = [] }, bind: function(e) { var t, n, i, r, o, a, s = this instanceof y, l = this.binders(); for (t in e) t == M ? n = !0 : t == z ? i = !0 : t != F || s ? t == R ? o = !0 : t == H ? a = !0 : this.applyBinding(t, e, l) : r = !0; i && this.applyBinding(z, e, l), n && this.applyBinding(M, e, l), o && this.applyBinding(R, e, l), r && !s && this.applyBinding(F, e, l), a && !s && this.applyBinding(H, e, l) }, binders: function() { return E[this.target.nodeName.toLowerCase()] || {} }, applyBinding: function(e, t, n) { var i, r = n[e] || E[e], o = this.toDestroy, a = t[e]; if (r) if (r = new r(this.target, t, this.options), o.push(r), a instanceof f) r.bind(a), o.push(a); else for (i in a) r.bind(a, i), o.push(a[i]); else if ("template" !== e) throw Error("The " + e + " binding is not supported by the " + this.target.nodeName.toLowerCase() + " element") }, destroy: function() { var e, t, n = this.toDestroy; for (e = 0, t = n.length; t > e; e++) n[e].destroy() } }), y = b.extend({ binders: function() { return E.widget[this.target.options.name.toLowerCase()] || {} }, applyBinding: function(e, t, n) { var i, r = n[e] || E.widget[e], o = this.toDestroy, a = t[e]; if (!r) throw Error("The " + e + " binding is not supported by the " + this.target.options.name + " widget"); if (r = new r(this.target, t, this.target.options), o.push(r), a instanceof f) r.bind(a), o.push(a); else for (i in a) r.bind(a, i), o.push(a[i]) } }), k = /[A-Za-z0-9_\-]+:(\{([^}]*)\}|[^,}]+)/g, x = /\s/g, C.unbind = u, C.bind = s, C.data.binders = E, C.data.Binder = v, C.notify = h, C.observable = function(e) { return e instanceof T || (e = new T(e)), e }, C.observableHierarchy = function(e) { function t(e) { var n, i; for (n = 0; e.length > n; n++) e[n]._initChildren(), i = e[n].children, i.fetch(), e[n].items = i.data(), t(e[n].items) } var n = C.data.HierarchicalDataSource.create(e); return n.fetch(), t(n.data()), n._data._dataSource = n, n._data } }(window.kendo.jQuery), function(e, t) { function n(e) { return parseInt(e, 10) } function i(e, t) { return n(e.css(t)) } function r(e) { var t, n = []; for (t in e) n.push(t); return n } function o(e) { for (var t in e) - 1 != U.indexOf(t) && -1 == W.indexOf(t) && delete e[t]; return e } function a(e, t) { var n, i, r, o, a = [], s = {}; for (i in t) n = i.toLowerCase(), o = P && -1 != U.indexOf(n), !E.hasHW3D && o && -1 == W.indexOf(n) ? delete t[i] : (r = t[i], o ? a.push(i + "(" + r + ")") : s[i] = r); return a.length && (s[st] = a.join(" ")), s } function s(e, t) { var i, r, o; return P ? (i = e.css(st), i == Q ? "scale" == t ? 1 : 0 : (r = i.match(RegExp(t + "\\s*\\(([\\d\\w\\.]+)")), o = 0, r ? o = n(r[1]) : (r = i.match(H) || [0, 0, 0, 0, 0], t = t.toLowerCase(), L.test(t) ? o = parseFloat(r[3] / r[2]) : "translatey" == t ? o = parseFloat(r[4] / r[2]) : "scale" == t ? o = parseFloat(r[2]) : "rotate" == t && (o = parseFloat(Math.atan2(r[2], r[1])))), o)) : parseFloat(e.css(t)) } function l(e) { return e.charAt(0).toUpperCase() + e.substring(1) } function c(e, t) { var n = f.extend(t), i = n.prototype.directions; S[l(e)] = n, S.Element.prototype[e] = function(e, t, i, r) { return new n(this.element, e, t, i, r) }, T(i, function(t, i) { S.Element.prototype[e + l(i)] = function(e, t, r) { return new n(this.element, i, e, t, r) } }) } function d(e, n, i, r) { c(e, { directions: m, startValue: function(e) { return this._startValue = e, this }, endValue: function(e) { return this._endValue = e, this }, shouldHide: function() { return this._shouldHide }, prepare: function(e, o) { var a, s, l = this, c = "out" === this._direction, d = l.element.data(n), u = !(isNaN(d) || d == i); a = u ? d : t !== this._startValue ? this._startValue : c ? i : r, s = t !== this._endValue ? this._endValue : c ? r : i, this._reverse ? (e[n] = s, o[n] = a) : (e[n] = a, o[n] = s), l._shouldHide = o[n] === r } }) } function u(e, t) { var n = C.directions[t].vertical, i = e[n ? Z : X]() / 2 + "px"; return _[t].replace("$size", i) } var h, p, f, g, m, v, _, w, b, y, k, x, C = window.kendo, S = C.effects, T = e.each, D = e.extend, A = e.proxy, E = C.support, I = E.browser, P = E.transforms, M = E.transitions, z = { scale: 0, scalex: 0, scaley: 0, scale3d: 0 }, F = { translate: 0, translatex: 0, translatey: 0, translate3d: 0 }, R = t !== document.documentElement.style.zoom && !P, H = /matrix3?d?\s*\(.*,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?,\s*([\d\.\-]+)\w*?/i, B = /^(-?[\d\.\-]+)?[\w\s]*,?\s*(-?[\d\.\-]+)?[\w\s]*/i, L = /translatex?$/i, N = /(zoom|fade|expand)(\w+)/, O = /(zoom|fade|expand)/, V = /[xy]$/i, U = ["perspective", "rotate", "rotatex", "rotatey", "rotatez", "rotate3d", "scale", "scalex", "scaley", "scalez", "scale3d", "skew", "skewx", "skewy", "translate", "translatex", "translatey", "translatez", "translate3d", "matrix", "matrix3d"], W = ["rotate", "scale", "scalex", "scaley", "skew", "skewx", "skewy", "translate", "translatex", "translatey", "matrix"], j = { rotate: "deg", scale: "", skew: "px", translate: "px" }, G = P.css, q = Math.round, $ = "", Y = "px", Q = "none", K = "auto", X = "width", Z = "height", J = "hidden", et = "origin", tt = "abortId", nt = "overflow", it = "translate", rt = "position", ot = "completeCallback", at = G + "transition", st = G + "transform", lt = G + "backface-visibility", ct = G + "perspective", dt = "1500px", ut = "perspective(" + dt + ")", ht = { left: { reverse: "right", property: "left", transition: "translatex", vertical: !1, modifier: -1 }, right: { reverse: "left", property: "left", transition: "translatex", vertical: !1, modifier: 1 }, down: { reverse: "up", property: "top", transition: "translatey", vertical: !0, modifier: 1 }, up: { reverse: "down", property: "top", transition: "translatey", vertical: !0, modifier: -1 }, top: { reverse: "bottom" }, bottom: { reverse: "top" }, "in": { reverse: "out", modifier: -1 }, out: { reverse: "in", modifier: 1 }, vertical: { reverse: "vertical" }, horizontal: { reverse: "horizontal" } }; C.directions = ht, D(e.fn, { kendoStop: function(e, t) { return M ? S.stopQueue(this, e || !1, t || !1) : this.stop(e, t) } }), P && !M && (T(W, function(n, i) { e.fn[i] = function(n) { if (t === n) return s(this, i); var r = e(this)[0], o = i + "(" + n + j[i.replace(V, "")] + ")"; return -1 == r.style.cssText.indexOf(st) ? e(this).css(st, o) : r.style.cssText = r.style.cssText.replace(RegExp(i + "\\(.*?\\)", "i"), o), this }, e.fx.step[i] = function(t) { e(t.elem)[i](t.now) } }), h = e.fx.prototype.cur, e.fx.prototype.cur = function() { return -1 != W.indexOf(this.prop) ? parseFloat(e(this.elem)[this.prop]()) : h.apply(this, arguments) }), C.toggleClass = function(e, t, n, i) { return t && (t = t.split(" "), M && (n = D({ exclusive: "all", duration: 400, ease: "ease-out" }, n), e.css(at, n.exclusive + " " + n.duration + "ms " + n.ease), setTimeout(function() { e.css(at, "").css(Z) }, n.duration)), T(t, function(t, n) { e.toggleClass(n, i) })), e }, C.parseEffects = function(e, t) { var n = {}; return "string" == typeof e ? T(e.split(" "), function(e, i) { var r = !O.test(i), o = i.replace(N, function(e, t, n) { return t + ":" + n.toLowerCase() }), a = o.split(":"), s = a[1], l = {}; a.length > 1 && (l.direction = t && r ? ht[s].reverse : s), n[a[0]] = l }) : T(e, function(e) { var i = this.direction; i && t && !O.test(e) && (this.direction = ht[i].reverse), n[e] = this }), n }, M && D(S, { transition: function(t, n, i) { var o, s, l, c, d = 0, u = t.data("keys") || []; i = D({ duration: 200, ease: "ease-out", complete: null, exclusive: "all" }, i), l = !1, c = function() { l || (l = !0, s && (clearTimeout(s), s = null), t.removeData(tt).dequeue().css(at, "").css(at), i.complete.call(t)) }, i.duration = e.fx ? e.fx.speeds[i.duration] || i.duration : i.duration, o = a(t, n), e.merge(u, r(o)), t.data("keys", e.unique(u)).height(), t.css(at, i.exclusive + " " + i.duration + "ms " + i.ease).css(at), t.css(o).css(st), M.event && (t.one(M.event, c), 0 !== i.duration && (d = 500)), s = setTimeout(c, i.duration + d), t.data(tt, s), t.data(ot, c) }, stopQueue: function(e, t, n) { var i, r = e.data("keys"), o = !n && r, a = e.data(ot); return o && (i = C.getComputedStyles(e[0], r)), a && a(), o && e.css(i), e.removeData("keys").stop(t) } }), p = C.Class.extend({ init: function(e, t) { var n = this; n.element = e, n.effects = [], n.options = t, n.restore = [] }, run: function(t) { var n, i, r, s, l, c, d, u = this, h = t.length, p = u.element, f = u.options, g = e.Deferred(), m = {}, v = {}; for (u.effects = t, g.then(e.proxy(u, "complete")), p.data("animating", !0), i = 0; h > i; i++) for (n = t[i], n.setReverse(f.reverse), n.setOptions(f), u.addRestoreProperties(n.restore), n.prepare(m, v), l = n.children(), r = 0, c = l.length; c > r; r++) l[r].duration(f.duration).run(); for (d in f.effects) D(v, f.effects[d].properties); for (p.is(":visible") || D(m, { display: p.data("olddisplay") || "block" }), P && !f.reset && (s = p.data("targetTransform"), s && (m = D(s, m))), m = a(p, m), P && !M && (m = o(m)), p.css(m).css(st), i = 0; h > i; i++) t[i].setup(); return f.init && f.init(), p.data("targetTransform", v), S.animate(p, v, D({}, f, { complete: g.resolve })), g.promise() }, stop: function() { e(this.element).kendoStop(!0, !0) }, addRestoreProperties: function(e) { for (var t, n = this.element, i = 0, r = e.length; r > i; i++) t = e[i], this.restore.push(t), n.data(t) || n.data(t, n.css(t)) }, restoreCallback: function() { var e, t, n, i = this.element; for (e = 0, t = this.restore.length; t > e; e++) n = this.restore[e], i.css(n, i.data(n)) }, complete: function() { var t = this, n = 0, i = t.element, r = t.options, o = t.effects, a = o.length; for (i.removeData("animating").dequeue(), r.hide && i.data("olddisplay", i.css("display")).hide(), this.restoreCallback(), R && !P && setTimeout(e.proxy(this, "restoreCallback"), 0); a > n; n++) o[n].teardown(); r.completeCallback && r.completeCallback(i) } }), S.promise = function(e, t) { var n, i, r, o = [], a = new p(e, t), s = C.parseEffects(t.effects); t.effects = s; for (r in s) n = S[l(r)], n && (i = new n(e, s[r].direction), o.push(i)); o[0] ? a.run(o) : (e.is(":visible") || e.css({ display: e.data("olddisplay") || "block" }).css("display"), t.init && t.init(), e.dequeue(), a.complete()) }, D(S, { animate: function(n, r, a) { var s = a.transition !== !1; delete a.transition, M && "transition" in S && s ? S.transition(n, r, a) : P ? n.animate(o(r), { queue: !1, show: !1, hide: !1, duration: a.duration, complete: a.complete }) : n.each(function() { var n = e(this), o = {}; T(U, function(e, a) { var s, l, c, d, u, h, p, f = r ? r[a] + " " : null; f && (l = r, a in z && r[a] !== t ? (s = f.match(B), P && D(l, { scale: +s[0] })) : a in F && r[a] !== t && (c = n.css(rt), d = "absolute" == c || "fixed" == c, n.data(it) || (d ? n.data(it, { top: i(n, "top") || 0, left: i(n, "left") || 0, bottom: i(n, "bottom"), right: i(n, "right") }) : n.data(it, { top: i(n, "marginTop") || 0, left: i(n, "marginLeft") || 0 })), u = n.data(it), s = f.match(B), s && (h = a == it + "y" ? 0 : +s[1], p = a == it + "y" ? +s[1] : +s[2], d ? (isNaN(u.right) ? isNaN(h) || D(l, { left: u.left + h }) : isNaN(h) || D(l, { right: u.right - h }), isNaN(u.bottom) ? isNaN(p) || D(l, { top: u.top + p }) : isNaN(p) || D(l, { bottom: u.bottom - p })) : (isNaN(h) || D(l, { marginLeft: u.left + h }), isNaN(p) || D(l, { marginTop: u.top + p })))), !P && "scale" != a && a in l && delete l[a], l && D(o, l)) }), I.msie && delete o.scale, n.animate(o, { queue: !1, show: !1, hide: !1, duration: a.duration, complete: a.complete }) }) } }), S.animatedPromise = S.promise, f = C.Class.extend({ init: function(e, t) { var n = this; n.element = e, n._direction = t, n.options = {}, n._additionalEffects = [], n.restore || (n.restore = []) }, reverse: function() { return this._reverse = !0, this.run() }, play: function() { return this._reverse = !1, this.run() }, add: function(e) { return this._additionalEffects.push(e), this }, direction: function(e) { return this._direction = e, this }, duration: function(e) { return this._duration = e, this }, compositeRun: function() { var e = this, t = new p(e.element, { reverse: e._reverse, duration: e._duration }), n = e._additionalEffects.concat([e]); return t.run(n) }, run: function() { if (this._additionalEffects && this._additionalEffects[0]) return this.compositeRun(); var t, n, i = this, r = i.element, s = 0, l = i.restore, c = l.length, d = e.Deferred(), u = {}, h = {}, p = i.children(), f = p.length; for (d.then(e.proxy(i, "_complete")), r.data("animating", !0), s = 0; c > s; s++) t = l[s], r.data(t) || r.data(t, r.css(t)); for (s = 0; f > s; s++) p[s].duration(i._duration).run(); return i.prepare(u, h), r.is(":visible") || D(u, { display: r.data("olddisplay") || "block" }), P && (n = r.data("targetTransform"), n && (u = D(n, u))), u = a(r, u), P && !M && (u = o(u)), r.css(u).css(st), i.setup(), r.data("targetTransform", h), S.animate(r, h, { duration: i._duration, complete: d.resolve }), d.promise() }, stop: function() { var t = 0, n = this.children(), i = n.length; for (t = 0; i > t; t++) n[t].stop(); return e(this.element).kendoStop(!0, !0), this }, restoreCallback: function() { var e, t, n, i = this.element; for (e = 0, t = this.restore.length; t > e; e++) n = this.restore[e], i.css(n, i.data(n)) }, _complete: function() { var t = this, n = t.element; n.removeData("animating").dequeue(), t.restoreCallback(), t.shouldHide() && n.data("olddisplay", n.css("display")).hide(), R && !P && setTimeout(e.proxy(t, "restoreCallback"), 0), t.teardown() }, setOptions: function(e) { D(!0, this.options, e) }, children: function() { return [] }, shouldHide: e.noop, setup: e.noop, prepare: e.noop, teardown: e.noop, directions: [], setReverse: function(e) { return this._reverse = e, this } }), g = ["left", "right", "up", "down"], m = ["in", "out"], c("slideIn", { directions: g, divisor: function(e) { return this.options.divisor = e, this }, prepare: function(e, t) { var n, i = this, r = i.element, o = ht[i._direction], a = -o.modifier * (o.vertical ? r.outerHeight() : r.outerWidth()), s = a / (i.options && i.options.divisor || 1) + Y, l = "0px"; i._reverse && (n = e, e = t, t = n), P ? (e[o.transition] = s, t[o.transition] = l) : (e[o.property] = s, t[o.property] = l) } }), c("tile", { directions: g, init: function(e, t, n) { f.prototype.init.call(this, e, t), this.options = { previous: n } }, previousDivisor: function(e) { return this.options.previousDivisor = e, this }, children: function() { var e = this, t = e._reverse, n = e.options.previous, i = e.options.previousDivisor || 1, r = e._direction, o = [C.fx(e.element).slideIn(r).setReverse(t)]; return n && o.push(C.fx(n).slideIn(ht[r].reverse).divisor(i).setReverse(!t)), o } }), d("fade", "opacity", 1, 0), d("zoom", "scale", 1, .01), c("slideMargin", { prepare: function(e, t) { var n, i = this, r = i.element, o = i.options, a = r.data(et), s = o.offset, l = i._reverse; l || null !== a || r.data(et, parseFloat(r.css("margin-" + o.axis))), n = r.data(et) || 0, t["margin-" + o.axis] = l ? n : n + s } }), c("slideTo", { prepare: function(e, t) { var n = this, i = n.element, r = n.options, o = r.offset.split(","), a = n._reverse; P ? (t.translatex = a ? 0 : o[0], t.translatey = a ? 0 : o[1]) : (t.left = a ? 0 : o[0], t.top = a ? 0 : o[1]), i.css("left") } }), c("expand", { directions: ["horizontal", "vertical"], restore: [nt], prepare: function(e, n) { var i = this, r = i.element, o = i.options, a = i._reverse, s = "vertical" === i._direction ? Z : X, l = r[0].style[s], c = r.data(s), d = parseFloat(c || l), u = q(r.css(s, K)[s]()); e.overflow = J, d = o && o.reset ? u || d : d || u, n[s] = (a ? 0 : d) + Y, e[s] = (a ? d : 0) + Y, c === t && r.data(s, l) }, shouldHide: function() { return this._reverse }, teardown: function() { var e = this, t = e.element, n = "vertical" === e._direction ? Z : X, i = t.data(n); (i == K || i === $) && setTimeout(function() { t.css(n, K).css(n) }, 0) } }), v = { position: "absolute", marginLeft: 0, marginTop: 0, scale: 1 }, c("transfer", { init: function(e, t) { this.element = e, this.options = { target: t }, this.restore = [] }, setup: function() { this.element.appendTo(document.body) }, prepare: function(e, t) { var n = this, i = n.element, r = S.box(i), o = S.box(n.options.target), a = s(i, "scale"), l = S.fillScale(o, r), c = S.transformOrigin(o, r); D(e, v), t.scale = 1, i.css(st, "scale(1)").css(st), i.css(st, "scale(" + a + ")"), e.top = r.top, e.left = r.left, e.transformOrigin = c.x + Y + " " + c.y + Y, n._reverse ? e.scale = l : t.scale = l } }), _ = { top: "rect(auto auto $size auto)", bottom: "rect($size auto auto auto)", left: "rect(auto $size auto auto)", right: "rect(auto auto auto $size)" }, w = { top: { start: "rotatex(0deg)", end: "rotatex(180deg)" }, bottom: { start: "rotatex(-180deg)", end: "rotatex(0deg)" }, left: { start: "rotatey(0deg)", end: "rotatey(-180deg)" }, right: { start: "rotatey(180deg)", end: "rotatey(0deg)" } }, c("turningPage", { directions: g, init: function(e, t, n) { f.prototype.init.call(this, e, t), this._container = n }, prepare: function(e, t) { var n = this, i = n._reverse, r = i ? ht[n._direction].reverse : n._direction, o = w[r]; e.zIndex = 1, n._clipInHalf && (e.clip = u(n._container, C.directions[r].reverse)), e[lt] = J, t[st] = ut + (i ? o.start : o.end), e[st] = ut + (i ? o.end : o.start) }, setup: function() { this._container.append(this.element) }, face: function(e) { return this._face = e, this }, shouldHide: function() { var e = this, t = e._reverse, n = e._face; return t && !n || !t && n }, clipInHalf: function(e) { return this._clipInHalf = e, this }, temporary: function() { return this.element.addClass("temp-page"), this } }), c("staticPage", { directions: g, init: function(e, t, n) { f.prototype.init.call(this, e, t), this._container = n }, restore: ["clip"], prepare: function(e, t) { var n = this, i = n._reverse ? ht[n._direction].reverse : n._direction; e.clip = u(n._container, i), e.opacity = .999, t.opacity = 1 }, shouldHide: function() { var e = this, t = e._reverse, n = e._face; return t && !n || !t && n }, face: function(e) { return this._face = e, this } }), c("pageturn", { directions: ["horizontal", "vertical"], init: function(e, t, n, i) { f.prototype.init.call(this, e, t), this.options = {}, this.options.face = n, this.options.back = i }, children: function() { var e, t = this, n = t.options, i = "horizontal" === t._direction ? "left" : "top", r = C.directions[i].reverse, o = t._reverse, a = n.face.clone(!0).removeAttr("id"), s = n.back.clone(!0).removeAttr("id"), l = t.element; return o && (e = i, i = r, r = e), [C.fx(n.face).staticPage(i, l).face(!0).setReverse(o), C.fx(n.back).staticPage(r, l).setReverse(o), C.fx(a).turningPage(i, l).face(!0).clipInHalf(!0).temporary().setReverse(o), C.fx(s).turningPage(r, l).clipInHalf(!0).temporary().setReverse(o)] }, prepare: function(e, t) { e[ct] = dt, e.transformStyle = "preserve-3d", e.opacity = .999, t.opacity = 1 }, teardown: function() { this.element.find(".temp-page").remove() } }), c("flip", { directions: ["horizontal", "vertical"], init: function(e, t, n, i) { f.prototype.init.call(this, e, t), this.options = {}, this.options.face = n, this.options.back = i }, children: function() { var e, t = this, n = t.options, i = "horizontal" === t._direction ? "left" : "top", r = C.directions[i].reverse, o = t._reverse, a = t.element; return o && (e = i, i = r, r = e), [C.fx(n.face).turningPage(i, a).face(!0).setReverse(o), C.fx(n.back).turningPage(r, a).setReverse(o)] }, prepare: function(e) { e[ct] = dt, e.transformStyle = "preserve-3d" } }), b = !E.mobileOS.android, y = ".km-touch-scrollbar, .km-actionsheet-wrapper", c("replace", { _before: e.noop, _after: e.noop, init: function(t, n, i) { f.prototype.init.call(this, t), this._previous = e(n), this._transitionClass = i }, duration: function() { throw Error("The replace effect does not support duration setting; the effect duration may be customized through the transition class rule") }, beforeTransition: function(e) { return this._before = e, this }, afterTransition: function(e) { return this._after = e, this }, _both: function() { return e().add(this._element).add(this._previous) }, _containerClass: function() { var e = this._direction, t = "k-fx k-fx-start k-fx-" + this._transitionClass; return e && (t += " k-fx-" + e), this._reverse && (t += " k-fx-reverse"), t }, complete: function(t) { if (!(!this.deferred || t && e(t.target).is(y))) { var n = this.container; n.removeClass("k-fx-end").removeClass(this._containerClass()).off(M.event, this.completeProxy), this._previous.hide().removeClass("k-fx-current"), this.element.removeClass("k-fx-next"), b && n.css(nt, ""), this.isAbsolute || this._both().css(rt, ""), this.deferred.resolve(), delete this.deferred } }, run: function() { if (this._additionalEffects && this._additionalEffects[0]) return this.compositeRun(); var t, n = this, i = n.element, r = n._previous, o = i.parents().filter(r.parents()).first(), a = n._both(), s = e.Deferred(), l = i.css(rt); return o.length || (o = i.parent()), this.container = o, this.deferred = s, this.isAbsolute = "absolute" == l, this.isAbsolute || a.css(rt, "absolute"), b && (t = o.css(nt), o.css(nt, "hidden")), M ? (i.addClass("k-fx-hidden"), o.addClass(this._containerClass()), this.completeProxy = e.proxy(this, "complete"), o.on(M.event, this.completeProxy), C.animationFrame(function() { i.removeClass("k-fx-hidden").addClass("k-fx-next"), r.css("display", "").addClass("k-fx-current"), n._before(r, i), C.animationFrame(function() { o.removeClass("k-fx-start").addClass("k-fx-end"), n._after(r, i) }) })) : this.complete(), s.promise() }, stop: function() { this.complete() } }), k = C.Class.extend({ init: function() { var e = this; e._tickProxy = A(e._tick, e), e._started = !1 }, tick: e.noop, done: e.noop, onEnd: e.noop, onCancel: e.noop, start: function() { this.enabled() && (this.done() ? this.onEnd() : (this._started = !0, C.animationFrame(this._tickProxy))) }, enabled: function() { return !0 }, cancel: function() { this._started = !1, this.onCancel() }, _tick: function() { var e = this; e._started && (e.tick(), e.done() ? (e._started = !1, e.onEnd()) : C.animationFrame(e._tickProxy)) } }), x = k.extend({ init: function(e) { var t = this; D(t, e), k.fn.init.call(t) }, done: function() { return this.timePassed() >= this.duration }, timePassed: function() { return Math.min(this.duration, new Date - this.startDate) }, moveTo: function(e) { var t = this, n = t.movable; t.initial = n[t.axis], t.delta = e.location - t.initial, t.duration = "number" == typeof e.duration ? e.duration : 300, t.tick = t._easeProxy(e.ease), t.startDate = new Date, t.start() }, _easeProxy: function(e) { var t = this; return function() { t.movable.moveAxis(t.axis, e(t.timePassed(), t.initial, t.delta, t.duration)) } } }), D(x, { easeOutExpo: function(e, t, n, i) { return e == i ? t + n : n * (-Math.pow(2, -10 * e / i) + 1) + t }, easeOutBack: function(e, t, n, i, r) { return r = 1.70158, n * ((e = e / i - 1) * e * ((r + 1) * e + r) + 1) + t } }), S.Animation = k, S.Transition = x, S.createEffect = c, S.box = function(t) { t = e(t); var n = t.offset(); return n.width = t.outerWidth(), n.height = t.outerHeight(), n }, S.transformOrigin = function(e, t) { var n = (e.left - t.left) * t.width / (t.width - e.width), i = (e.top - t.top) * t.height / (t.height - e.height); return { x: isNaN(n) ? 0 : n, y: isNaN(i) ? 0 : i } }, S.fillScale = function(e, t) { return Math.min(e.width / t.width, e.height / t.height) }, S.fitScale = function(e, t) { return Math.max(e.width / t.width, e.height / t.height) } }(window.kendo.jQuery), function(e) { function t(e) { if (!e) return {}; var t = e.match(v) || []; return { type: t[1], direction: t[3], reverse: "reverse" === t[5] } } var n = window.kendo, i = n.Observable, r = "SCRIPT", o = "init", a = "show", s = "hide", l = "transitionStart", c = "transitionEnd", d = "attach", u = "detach", h = /unrecognized expression/, p = i.extend({ init: function(e, t) { var r = this; t = t || {}, i.fn.init.call(r), r.content = e, r.id = n.guid(), r.tagName = t.tagName || "div", r.model = t.model, r._wrap = t.wrap !== !1, this._evalTemplate = t.evalTemplate || !1, r._fragments = {}, r.bind([o, a, s, l, c], t) }, render: function(t) { var i = this, r = !i.element; return r && (i.element = i._createElement()), t && e(t).append(i.element), r && (n.bind(i.element, i.model), i.trigger(o)), t && (i._eachFragment(d), i.trigger(a)), i.element }, clone: function() { return new f(this) }, triggerBeforeShow: function() { return !0 }, triggerBeforeHide: function() { return !0 }, showStart: function() { this.element.css("display", "") }, showEnd: function() {}, hideEnd: function() { this.hide() }, beforeTransition: function(e) { this.trigger(l, { type: e }) }, afterTransition: function(e) { this.trigger(c, { type: e }) }, hide: function() { this._eachFragment(u), this.element.detach(), this.trigger(s) }, destroy: function() { var e = this.element; e && (n.unbind(e), n.destroy(e), e.remove()) }, fragments: function(t) { e.extend(this._fragments, t) }, _eachFragment: function(e) { for (var t in this._fragments) this._fragments[t][e](this, t) }, _createElement: function() { var t, i, o, a = this, s = "<" + a.tagName + " />"; try { i = e(document.getElementById(a.content) || a.content), i[0].tagName === r && (i = i.html()) } catch (l) { h.test(l.message) && (i = a.content) } return "string" == typeof i ? (i = i.replace(/^\s+|\s+$/g, ""), a._evalTemplate && (i = n.template(i)(a.model || {})), t = e(s).append(i), a._wrap || (t = t.contents())) : (t = i, a._evalTemplate && (o = e(n.template(e("<div />").append(t.clone(!0)).html())(a.model || {})), e.contains(document, t[0]) && t.replaceWith(o), t = o), a._wrap && (t = t.wrapAll(s).parent())), t } }), f = n.Class.extend({ init: function(t) { e.extend(this, { element: t.element.clone(!0), transition: t.transition, id: t.id }), t.element.parent().append(this.element) }, hideEnd: function() { this.element.remove() }, beforeTransition: e.noop, afterTransition: e.noop }), g = p.extend({ init: function(e, t) { p.fn.init.call(this, e, t), this.containers = {} }, container: function(e) { var t = this.containers[e]; return t || (t = this._createContainer(e), this.containers[e] = t), t }, showIn: function(e, t, n) { this.container(e).show(t, n) }, _createContainer: function(e) { var t, n = this.render(), i = n.find(e); if (!i.length && n.is(e)) { if (!n.is(e)) throw Error("can't find a container with the specified " + e + " selector"); i = n } return t = new _(i), t.bind("accepted", function(e) { e.view.render(i) }), t } }), m = p.extend({ attach: function(e, t) { e.element.find(t).replaceWith(this.render()) }, detach: function() {} }), v = /^(\w+)(:(\w+))?( (\w+))?$/, _ = i.extend({ init: function(e) { i.fn.init.call(this), this.container = e, this.history = [], this.view = null, this.running = !1 }, after: function() { this.running = !1, this.trigger("complete", { view: this.view }), this.trigger("after") }, end: function() { this.view.showEnd(), this.previous.hideEnd(), this.after() }, show: function(e, i, r) { if (!e.triggerBeforeShow() || this.view && !this.view.triggerBeforeHide()) return this.trigger("after"), !1; r = r || e.id; var o = this, a = e === o.view ? e.clone() : o.view, s = o.history, l = s[s.length - 2] || {}, c = l.id === r, d = i || (c ? s[s.length - 1].transition : e.transition), u = t(d); return o.running && o.effect.stop(), "none" === d && (d = null), o.trigger("accepted", { view: e }), o.view = e, o.previous = a, o.running = !0, c ? s.pop() : s.push({ id: r, transition: d }), a ? (d && n.effects.enabled ? (e.element.addClass("k-fx-hidden"), e.showStart(), c && !i && (u.reverse = !u.reverse), o.effect = n.fx(e.element).replace(a.element, u.type).beforeTransition(function() { e.beforeTransition("show"), a.beforeTransition("hide") }).afterTransition(function() { e.afterTransition("show"), a.afterTransition("hide") }).direction(u.direction).setReverse(u.reverse), o.effect.run().then(function() { o.end() })) : (e.showStart(), o.end()), !0) : (e.showStart(), e.showEnd(), o.after(), !0) } }); n.ViewContainer = _, n.Fragment = m, n.Layout = g, n.View = p, n.ViewClone = f }(window.kendo.jQuery), function(e) { function t() { this.node = null } function n() {} function i(e, t, n) { this.nodeName = e, this.attr = t || {}, this.children = n || [] } function r(e) { this.nodeValue = e } function o(e) { this.html = e } function a(e) { return new o(e) } function s(e, t, n) { return new i(e, t, n) } function l(e) { return new r(e) } function c(e) { this.root = e, this.children = [] } t.prototype = { remove: function() { this.node.parentNode.removeChild(this.node) }, attr: {} }, n.prototype = { nodeName: "#null", attr: { style: {} }, children: [], remove: function() {} }; var d = new n; i.prototype = new t, i.prototype.appendTo = function(e) { var t, n = document.createElement(this.nodeName), i = this.children; for (t = 0; i.length > t; t++) i[t].render(n, d); return e.appendChild(n), n }, i.prototype.render = function(e, t) { var n, i, r, o, a, s; if (t.nodeName !== this.nodeName) t.remove(), n = this.appendTo(e); else { if (n = t.node, r = this.children, o = r.length, a = t.children, s = a.length, Math.abs(s - o) > 2) return void this.render({ appendChild: function(n) { e.replaceChild(n, t.node) } }, d); for (i = 0; o > i; i++) r[i].render(n, a[i] || d); for (i = o; s > i; i++) a[i].remove() } this.node = n, this.syncAttributes(t.attr), this.removeAttributes(t.attr) }, i.prototype.syncAttributes = function(e) { var t, n, i, r = this.attr; for (t in r) n = r[t], i = e[t], "style" === t ? this.setStyle(n, i) : n !== i && this.setAttribute(t, n, i) }, i.prototype.setStyle = function(e, t) { var n, i = this.node; if (t) for (n in e) e[n] !== t[n] && (i.style[n] = e[n]); else for (n in e) i.style[n] = e[n] }, i.prototype.removeStyle = function(e) { var t, n = this.attr.style || {}, i = this.node; for (t in e) void 0 === n[t] && (i.style[t] = "") }, i.prototype.removeAttributes = function(e) { var t, n = this.attr; for (t in e) "style" === t ? this.removeStyle(e.style) : void 0 === n[t] && this.removeAttribute(t) }, i.prototype.removeAttribute = function(e) { var t = this.node; "style" === e ? t.style.cssText = "" : "className" === e ? t.className = "" : t.removeAttribute(e) }, i.prototype.setAttribute = function(e, t) { var n = this.node; void 0 !== n[e] ? n[e] = t : n.setAttribute(e, t) }, r.prototype = new t, r.prototype.nodeName = "#text", r.prototype.render = function(e, t) { var n; t.nodeName !== this.nodeName ? (t.remove(), n = document.createTextNode(this.nodeValue), e.appendChild(n)) : (n = t.node, this.nodeValue !== t.nodeValue && (n.nodeValue = this.nodeValue)), this.node = n }, o.prototype = { nodeName: "#html", attr: {}, remove: function() { for (var e = 0; this.nodes.length > e; e++) this.nodes[e].parentNode.removeChild(this.nodes[e]) }, render: function(e, t) { var n, i; if (t.nodeName !== this.nodeName || t.html !== this.html) for (t.remove(), n = e.lastChild, e.insertAdjacentHTML("beforeend", this.html), this.nodes = [], i = n ? n.nextSibling : e.firstChild; i; i = i.nextSibling) this.nodes.push(i); else this.nodes = t.nodes.slice(0) } }, c.prototype = { html: a, element: s, text: l, render: function(e) { var t, n, i = this.children; for (t = 0, n = e.length; n > t; t++) e[t].render(this.root, i[t] || d); for (t = n; i.length > t; t++) i[t].remove(); this.children = e } }, e.dom = { html: a, text: l, element: s, Tree: c } }(window.kendo), function(e, t) { function n(e) { var t = Math.floor(e / 26) - 1; return (t >= 0 ? n(t) : "") + String.fromCharCode(65 + e % 26) } function i(e, t) { return n(t) + (e + 1) } function r(e, t) { return n(t) + "$" + (e + 1) } function o(e) { return ((e.freezePane || {}).rowSplit || 1) - 1 } function a(e) { return 6 > e.length && (e = e.replace(/(\w)/g, function(e, t) { return t + t })), e = e.substring(1).toUpperCase(), 8 > e.length && (e = "FF" + e), e } var s = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>', l = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:creator>${creator}</dc:creator><cp:lastModifiedBy>${lastModifiedBy}</cp:lastModifiedBy><dcterms:created xsi:type="dcterms:W3CDTF">${created}</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">${modified}</dcterms:modified></cp:coreProperties>'), c = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Application>Microsoft Excel</Application><DocSecurity>0</DocSecurity><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="2" baseType="variant"><vt:variant><vt:lpstr>Worksheets</vt:lpstr></vt:variant><vt:variant><vt:i4>${sheets.length}</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="${sheets.length}" baseType="lpstr"># for (var idx = 0; idx < sheets.length; idx++) { ## if (sheets[idx].options.title) { #<vt:lpstr>${sheets[idx].options.title}</vt:lpstr># } else { #<vt:lpstr>Sheet${idx+1}</vt:lpstr># } ## } #</vt:vector></TitlesOfParts><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>14.0300</AppVersion></Properties>'), d = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" /><Default Extension="xml" ContentType="application/xml" /><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" /><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/># for (var idx = 1; idx <= count; idx++) { #<Override PartName="/xl/worksheets/sheet${idx}.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" /># } #<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml" /><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" /></Types>'), u = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9303" /><workbookPr defaultThemeVersion="124226" /><bookViews><workbookView xWindow="240" yWindow="45" windowWidth="18195" windowHeight="7995" /></bookViews><sheets># for (var idx = 0; idx < sheets.length; idx++) { ## if (sheets[idx].options.title) { #<sheet name="${sheets[idx].options.title}" sheetId="${idx+1}" r:id="rId${idx+1}" /># } else { #<sheet name="Sheet${idx+1}" sheetId="${idx+1}" r:id="rId${idx+1}" /># } ## } #</sheets># if (definedNames.length) { #<definedNames> # for (var di = 0; di < definedNames.length; di++) { #<definedName name="_xlnm._FilterDatabase" hidden="1" localSheetId="${definedNames[di].localSheetId}">${definedNames[di].name}!$${definedNames[di].from}:$${definedNames[di].to}</definedName> # } #</definedNames># } #<calcPr calcId="145621" /></workbook>'), h = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac"><dimension ref="A1" /><sheetViews><sheetView #if(index==0) {# tabSelected="1" #}# workbookViewId="0"># if (freezePane) { #<pane state="frozen"# if (freezePane.colSplit) { # xSplit="${freezePane.colSplit}"# } ## if (freezePane.rowSplit) { # ySplit="${freezePane.rowSplit}"# } # topLeftCell="${String.fromCharCode(65 + (freezePane.colSplit || 0))}${(freezePane.rowSplit || 0)+1}"/># } #</sheetView></sheetViews><sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25" /># if (columns) { #<cols># for (var ci = 0; ci < columns.length; ci++) { ## var column = columns[ci]; ## if (column.width) { #<col min="${ci+1}" max="${ci+1}" customWidth="1"# if (column.autoWidth) { # width="${((column.width*7+5)/7*256)/256}" bestFit="1"# } else { # width="${(((column.width)/7)*100+0.5)/100}" # } #/># } ## } #</cols># } #<sheetData># for (var ri = 0; ri < data.length; ri++) { ## var row = data[ri]; #<row r="#=ri + 1#"># for (var ci = 0; ci < row.data.length; ci++) { ## var cell = row.data[ci];#<c r="#=cell.ref#"# if (cell.style) { # s="#=cell.style#" # } ## if (cell.type) { # t="#=cell.type#"# } #># if (cell.value != null) { #<v>${cell.value}</v># } #</c># } #</row># } #</sheetData># if (filter) { #<autoFilter ref="${filter.from}:${filter.to}"/># } ## if (mergeCells.length) { #<mergeCells count="${mergeCells.length}"># for (var ci = 0; ci < mergeCells.length; ci++) { #<mergeCell ref="${mergeCells[ci]}"/># } #</mergeCells># } #<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" /></worksheet>'), p = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"># for (var idx = 1; idx <= count; idx++) { #<Relationship Id="rId${idx}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet${idx}.xml" /># } #<Relationship Id="rId${count+1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml" /><Relationship Id="rId${count+2}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml" /></Relationships>'), f = t.template('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="${count}" uniqueCount="${uniqueCount}"># for (var index in indexes) { #<si><t>${index.substring(1)}</t></si># } #</sst>'), g = t.template('<?xml version="1.0" encoding="UTF-8"?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><numFmts count="${formats.length}"># for (var fi = 0; fi < formats.length; fi++) { ## var format = formats[fi]; #<numFmt formatCode="${format.format}" numFmtId="${165+fi}" /># } #</numFmts><fonts count="${fonts.length+1}" x14ac:knownFonts="1"><font><sz val="11" /><color theme="1" /><name val="Calibri" /><family val="2" /><scheme val="minor" /></font># for (var fi = 0; fi < fonts.length; fi++) { ## var font = fonts[fi]; #<font># if (font.bold) { #<b/># } ## if (font.italic) { #<i/># } ## if (font.underline) { #<u/># } ## if (font.color) { #<color rgb="${font.color}" /># } else { #<color theme="1" /># } ## if (font.fontSize) { #<sz val="${font.fontSize}" /># } else { #<sz val="11" /># } ## if (font.fontName) { #<name val="${font.fontName}" /># } else { #<name val="Calibri" /><scheme val="minor" /># } #<family val="2" /></font># } #</fonts><fills count="${fills.length+1}"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill># for (var fi = 0; fi < fills.length; fi++) { ## var fill = fills[fi]; ## if (fill.background) { #<fill><patternFill patternType="solid"><fgColor rgb="${fill.background}"/></patternFill></fill># } ## } #</fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellXfs count="${styles.length+1}"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/># for (var si = 0; si < styles.length; si++) { ## var style = styles[si]; #<xf xfid="0"# if (style.fontId) { # fontId="${style.fontId}" applyFont="1"# } ## if (style.fillId) { # fillId="${style.fillId}" applyFill="1"# } ## if (style.numFmtId) { # numFmtId="${style.numFmtId}" applyNumberFormat="1"# } ## if (style.hAlign || style.vAlign || style.wrap) { # applyAlignment="1"# } #># if (style.hAlign || style.vAlign || style.wrap) { #<alignment# if (style.hAlign) { # horizontal="${style.hAlign}"# } ## if (style.vAlign) { # vertical="${style.vAlign}"# } ## if (style.wrap) { # wrapText="1"# } #/># } #</xf># } #</cellXfs><dxfs count="0" /><tableStyles count="0" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleMedium9" /></styleSheet>'), m = t.timezone.remove(new Date(1900, 0, 0), "Etc/UTC"), v = t.Class.extend({ init: function(e, t, n) { this.options = e, this._strings = t, this._styles = n, this._mergeCells = [] }, toXML: function(e) { var t, n, r = this.options.rows || [], a = this.options.filter, s = {}; for (this._maxCellIndex = 0, t = [], n = 0; r.length > n; n++) t.push(this._row(r, s, r[n], n)); return h({ freezePane: this.options.freezePane, columns: this.options.columns, data: t, index: e, mergeCells: this._mergeCells, filter: a ? { from: i(o(this.options), a.from), to: i(o(this.options), a.to) } : null }) }, _row: function(e, t, n, r) { var o, a, s, l, c, d; for (this._cellIndex && this._cellIndex > this._maxCellIndex && (this._maxCellIndex = this._cellIndex), this._cellIndex = 0, a = [], s = n.cells, l = 0, c = s.length; c > l; l++) o = this._cell(s[l], t, r), o && a.push.apply(a, o); for (; this._maxCellIndex > this._cellIndex;) d = t[this._cellIndex], d && (d.rowSpan -= 1), a.push({ ref: i(r, this._cellIndex) }), this._cellIndex++; return { data: a } }, _lookupString: function(e) { var t = "$" + e, n = this._strings.indexes[t]; return void 0 !== n ? e = n : (e = this._strings.indexes[t] = this._strings.uniqueCount, this._strings.uniqueCount++), this._strings.count++, e }, _lookupStyle: function(n) { var i, r = t.stringify(n); return "{}" == r ? 0 : (i = e.inArray(r, this._styles), 0 > i && (i = this._styles.push(r) - 1), i + 1) }, _cell: function(e, n, r) { var o, a, s, l, c, d, u, h, p, f, g, v; if (!e) return void this._cellIndex++; for (o = e.value, a = { bold: e.bold, color: e.color, background: e.background, italic: e.italic, underline: e.underline, fontName: e.fontName, fontSize: e.fontSize, format: e.format, hAlign: e.hAlign, vAlign: e.vAlign, wrap: e.wrap }, s = this.options.columns || [], l = s[this._cellIndex], l && l.autoWidth && (l.width = Math.max(l.width || 0, ("" + o).length)), c = typeof o, "string" === c ? (o = this._lookupString(o), c = "s") : "number" === c ? c = "n" : "boolean" === c ? (c = "b", o = +o) : o && o.getTime ? (c = null, o = (t.timezone.remove(o, "Etc/UTC") - m) / t.date.MS_PER_DAY + 1, a.format || (a.format = "mm-dd-yy")) : (c = null, o = ""), a = this._lookupStyle(a), d = [], p = n[this._cellIndex] || {}; p.rowSpan > 1;) { for (p.rowSpan -= 1, u = p.colSpan; u > 0;) d.push({ ref: i(r, this._cellIndex) }), u--, this._cellIndex++; p = n[this._cellIndex] || {} } if (h = i(r, this._cellIndex), d.push({ value: o, type: c, style: a, ref: h }), f = e.colSpan || 1, g = e.rowSpan || 1, f > 1 || g > 1) { for (g > 1 && (n[this._cellIndex] = { colSpan: f, rowSpan: g }), v = 1; f > v; v++) this._cellIndex++, d.push({ ref: i(r, this._cellIndex) }); this._mergeCells.push(h + ":" + i(r + g - 1, this._cellIndex)) } return this._cellIndex++, d } }), _ = { General: 0, 0: 1, "0.00": 2, "#,##0": 3, "#,##0.00": 4, "0%": 9, "0.00%": 10, "0.00E+00": 11, "# ?/?": 12, "# ??/??": 13, "mm-dd-yy": 14, "d-mmm-yy": 15, "d-mmm": 16, "mmm-yy": 17, "h:mm AM/PM": 18, "h:mm:ss AM/PM": 19, "h:mm": 20, "h:mm:ss": 21, "m/d/yy h:mm": 22, "#,##0 ;(#,##0)": 37, "#,##0 ;[Red](#,##0)": 38, "#,##0.00;(#,##0.00)": 39, "#,##0.00;[Red](#,##0.00)": 40, "mm:ss": 45, "[h]:mm:ss": 46, "mmss.0": 47, "##0.0E+0": 48, "@": 49, "[$-404]e/m/d": 27, "m/d/yy": 30, t0: 59, "t0.00": 60, "t#,##0": 61, "t#,##0.00": 62, "t0%": 67, "t0.00%": 68, "t# ?/?": 69, "t# ??/??": 70 }, w = t.Class.extend({ init: function(t) { this.options = t || {}, this._strings = { indexes: {}, count: 0, uniqueCount: 0 }, this._styles = [], this._sheets = e.map(this.options.sheets || [], e.proxy(function(e) { return new v(e, this._strings, this._styles) }, this)) }, toDataURL: function() { var n, i, h, m, v, w, b, y, k, x, C, S, T, D; if ("undefined" == typeof JSZip) throw Error("JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details."); for (n = new JSZip, i = n.folder("docProps"), i.file("core.xml", l({ creator: this.options.creator || "Kendo UI", lastModifiedBy: this.options.creator || "Kendo UI", created: this.options.date || (new Date).toJSON(), modified: this.options.date || (new Date).toJSON() })), h = this._sheets.length, i.file("app.xml", c({ sheets: this._sheets })), m = n.folder("_rels"), m.file(".rels", s), v = n.folder("xl"), w = v.folder("_rels"), w.file("workbook.xml.rels", p({ count: h })), v.file("workbook.xml", u({ sheets: this._sheets, definedNames: e.map(this._sheets, function(e, t) { var n = e.options, i = n.filter; return i ? { localSheetId: t, name: n.title || "Sheet" + (t + 1), from: r(o(n), i.from), to: r(o(n), i.to) } : void 0 }) })), b = v.folder("worksheets"), y = new Date, k = 0; h > k; k++) b.file(t.format("sheet{0}.xml", k + 1), this._sheets[k].toXML(k)); return x = e.map(this._styles, e.parseJSON), C = function(e) { return e.underline || e.bold || e.italic || e.color || e.fontName || e.fontSize }, S = e.map(x, function(e) { return e.color && (e.color = a(e.color)), C(e) ? e : void 0 }), T = e.map(x, function(e) { return e.format && void 0 === _[e.format] ? e : void 0 }), D = e.map(x, function(e) { return e.background ? (e.background = a(e.background), e) : void 0 }), v.file("styles.xml", g({ fonts: S, fills: D, formats: T, styles: e.map(x, function(t) { var n = {}; return C(t) && (n.fontId = e.inArray(t, S) + 1), t.background && (n.fillId = e.inArray(t, D) + 2), n.hAlign = t.hAlign, n.vAlign = t.vAlign, n.wrap = t.wrap, t.format && (n.numFmtId = void 0 !== _[t.format] ? _[t.format] : 165 + e.inArray(t, T)), n }) })), v.file("sharedStrings.xml", f(this._strings)), n.file("[Content_Types].xml", d({ count: h })), "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64," + n.generate({ compression: "DEFLATE" }) } }); t.ooxml = { Workbook: w, Worksheet: v } }(kendo.jQuery, kendo), function(e, t) { t.ExcelExporter = t.Class.extend({ init: function(n) { var i, r, o; n.columns = this._trimColumns(n.columns || []), this.allColumns = e.map(this._leafColumns(n.columns || []), this._prepareColumn), this.columns = e.grep(this.allColumns, function(e) { return !e.hidden }), this.options = n, i = n.dataSource, i instanceof t.data.DataSource ? (this.dataSource = new i.constructor(e.extend({}, i.options, { page: n.allPages ? 0 : i.page(), filter: i.filter(), pageSize: n.allPages ? i.total() : i.pageSize(), sort: i.sort(), group: i.group(), aggregate: i.aggregate() })), r = i.data(), r.length > 0 && (this.dataSource._data = r, o = this.dataSource.transport, i._isServerGrouped() && o.options.data && (o.options.data = null))) : this.dataSource = t.data.DataSource.create(i) }, _trimColumns: function(t) { var n = this; return e.grep(t, function(e) { var t = !!e.field; return !t && e.columns && (t = n._trimColumns(e.columns).length > 0), t }) }, _leafColumns: function(e) { var t, n = []; for (t = 0; e.length > t; t++) e[t].columns ? n = n.concat(this._leafColumns(e[t].columns)) : n.push(e[t]); return n }, workbook: function() { return e.Deferred(e.proxy(function(t) { this.dataSource.fetch().then(e.proxy(function() { var e = { sheets: [{ columns: this._columns(), rows: this._rows(), freezePane: this._freezePane(), filter: this._filter() }] }; t.resolve(e, this.dataSource.view()) }, this)) }, this)).promise() }, _prepareColumn: function(n) { var i, r; if (n.field) return i = function(e) { return e.get(n.field) }, r = null, n.values && (r = {}, e.each(n.values, function() { r[this.value] = this.text }), i = function(e) { return r[e.get(n.field)] }), e.extend({}, n, { value: i, values: r, groupHeaderTemplate: t.template(n.groupHeaderTemplate || "${title}: ${value}"), groupFooterTemplate: n.groupFooterTemplate ? t.template(n.groupFooterTemplate) : null, footerTemplate: n.footerTemplate ? t.template(n.footerTemplate) : null }) }, _filter: function() { if (!this.options.filterable) return null; var e = this._depth(); return { from: e, to: e + this.columns.length - 1 } }, _dataRow: function(t, n, i) { var r, o, a, s, l, c, d, u, h, p; for (this._hierarchical() && (n = this.dataSource.level(t) + 1), r = [], o = 0; n > o; o++) r[o] = { background: "#dfdfdf", color: "#333" }; if (i && t.items) return a = e.grep(this.allColumns, function(e) { return e.field == t.field })[0], s = a && a.title ? a.title : t.field, l = a ? a.groupHeaderTemplate : null, c = s + ": " + t.value, d = e.extend({ title: s, field: t.field, value: a && a.values ? a.values[t.value] : t.value, aggregates: t.aggregates }, t.aggregates[t.field]), l && (c = l(d)), r.push({ value: c, background: "#dfdfdf", color: "#333", colSpan: this.columns.length + i - n }), u = this._dataRows(t.items, n + 1), u.unshift({ type: "group-header", cells: r }), u.concat(this._footer(t)); for (h = [], p = 0; this.columns.length > p; p++) h[p] = this._cell(t, this.columns[p]); return this._hierarchical() && (h[0].colSpan = i - n + 1), [{ type: "data", cells: r.concat(h) }] }, _dataRows: function(e, t) { var n, i = this._depth(), r = []; for (n = 0; e.length > n; n++) r.push.apply(r, this._dataRow(e[n], t, i)); return r }, _footer: function(t) { var n = [], i = !1, r = e.map(this.columns, e.proxy(function(n) { return n.groupFooterTemplate ? (i = !0, { background: "#dfdfdf", color: "#333", value: n.groupFooterTemplate(e.extend({}, this.dataSource.aggregates(), t.aggregates, t.aggregates[n.field])) }) : { background: "#dfdfdf", color: "#333" } }, this)); return i && n.push({ type: "group-footer", cells: e.map(Array(this.dataSource.group().length), function() { return { background: "#dfdfdf", color: "#333" } }).concat(r) }), n }, _isColumnVisible: function(e) { return this._visibleColumns([e]).length > 0 && (e.field || e.columns) }, _visibleColumns: function(t) { var n = this; return e.grep(t, function(e) { var t = !e.hidden; return t && e.columns && (t = n._visibleColumns(e.columns).length > 0), t }) }, _headerRow: function(t, n) { var i = e.map(t.cells, function(e) { return { background: "#7a7a7a", color: "#fff", value: e.title, colSpan: e.colSpan > 1 ? e.colSpan : 1, rowSpan: t.rowSpan > 1 && !e.colSpan ? t.rowSpan : 1 } }); return this._hierarchical() && (i[0].colSpan = this._depth() + 1), { type: "header", cells: e.map(Array(n.length), function() { return { background: "#7a7a7a", color: "#fff" } }).concat(i) } }, _prependHeaderRows: function(e) { var t, n = this.dataSource.group(), i = [{ rowSpan: 1, cells: [], index: 0 }]; for (this._prepareHeaderRows(i, this.options.columns), t = i.length - 1; t >= 0; t--) e.unshift(this._headerRow(i[t], n)) }, _prepareHeaderRows: function(e, t, n, i) { var r, o, a, s = i || e[e.length - 1], l = e[s.index + 1], c = 0; for (a = 0; t.length > a; a++) r = t[a], this._isColumnVisible(r) && (o = { title: r.title || r.field, colSpan: 0 }, s.cells.push(o), r.columns && r.columns.length && (l || (l = { rowSpan: 0, cells: [], index: e.length }, e.push(l)), o.colSpan = this._trimColumns(this._visibleColumns(r.columns)).length, this._prepareHeaderRows(e, r.columns, o, l), c += o.colSpan - 1, s.rowSpan = e.length - s.index)); n && (n.colSpan += c) }, _rows: function() { var t, n, i = this.dataSource.group(), r = this._dataRows(this.dataSource.view(), 0); return this.columns.length && (this._prependHeaderRows(r), t = !1, n = e.map(this.columns, e.proxy(function(n) { if (n.footerTemplate) { t = !0; var i = this.dataSource.aggregates(); return { background: "#dfdfdf", color: "#333", value: n.footerTemplate(e.extend({}, i, i[n.field])) } } return { background: "#dfdfdf", color: "#333" } }, this)), t && r.push({ type: "footer", cells: e.map(Array(i.length), function() { return { background: "#dfdfdf", color: "#333" } }).concat(n) })), r }, _headerDepth: function(e) { var t, n, i = 1, r = 0; for (t = 0; e.length > t; t++) e[t].columns && (n = this._headerDepth(e[t].columns), n > r && (r = n)); return i + r }, _freezePane: function() { var t = this._visibleColumns(this.options.columns || []), n = this._visibleColumns(this._trimColumns(this._leafColumns(e.grep(t, function(e) { return e.locked })))).length; return { rowSplit: this._headerDepth(t), colSplit: n ? n + this.dataSource.group().length : 0 } }, _cell: function(e, t) { return { value: t.value(e) } }, _hierarchical: function() { return this.options.hierarchy && this.dataSource.level }, _depth: function() { var e, t, n, i = this.dataSource, r = 0; if (this._hierarchical()) { for (e = i.view(), t = 0; e.length > t; t++) n = i.level(e[t]), n > r && (r = n); r++ } else r = i.group().length; return r }, _columns: function() { var t = this._depth(), n = e.map(Array(t), function() { return { width: 20 } }); return n.concat(e.map(this.columns, function(e) { return { width: parseInt(e.width, 10), autoWidth: e.width ? !1 : !0 } })) } }), t.ExcelMixin = { extend: function(t) { t.events.push("excelExport"), t.options.excel = e.extend(t.options.excel, this.options), t.saveAsExcel = this.saveAsExcel }, options: { proxyURL: "", allPages: !1, filterable: !1, fileName: "Export.xlsx" }, saveAsExcel: function() { var n = this.options.excel || {}, i = new t.ExcelExporter({ columns: this.columns, dataSource: this.dataSource, allPages: n.allPages, filterable: n.filterable, hierarchy: n.hierarchy }); i.workbook().then(e.proxy(function(e, i) { if (!this.trigger("excelExport", { workbook: e, data: i })) { var r = new t.ooxml.Workbook(e); t.saveAs({ dataURI: r.toDataURL(), fileName: e.fileName || n.fileName, proxyURL: n.proxyURL, forceProxy: n.forceProxy }) } }, this)) } } }(kendo.jQuery, kendo), function(e) { var t = kendo.data.RemoteTransport.extend({ init: function(e) { var t, n = e && e.signalr ? e.signalr : {}, i = n.promise; if (!i) throw Error('The "promise" option must be set.'); if ("function" != typeof i.done || "function" != typeof i.fail) throw Error('The "promise" option must be a Promise.'); if (this.promise = i, t = n.hub, !t) throw Error('The "hub" option must be set.'); if ("function" != typeof t.on || "function" != typeof t.invoke) throw Error('The "hub" option is not a valid SignalR hub proxy.'); this.hub = t, kendo.data.RemoteTransport.fn.init.call(this, e) }, push: function(e) { var t = this.options.signalr.client || {}; t.create && this.hub.on(t.create, e.pushCreate), t.update && this.hub.on(t.update, e.pushUpdate), t.destroy && this.hub.on(t.destroy, e.pushDestroy) }, _crud: function(t, n) { var i, r, o = this.hub, a = this.options.signalr.server; if (!a || !a[n]) throw Error(kendo.format('The "server.{0}" option must be set.', n)); i = [a[n]], r = this.parameterMap(t.data, n), e.isEmptyObject(r) || i.push(r), this.promise.done(function() { o.invoke.apply(o, i).done(t.success).fail(t.error) }) }, read: function(e) { this._crud(e, "read") }, create: function(e) { this._crud(e, "create") }, update: function(e) { this._crud(e, "update") }, destroy: function(e) { this._crud(e, "destroy") } }); e.extend(!0, kendo.data, { transports: { signalr: t } }) }(window.kendo.jQuery), function(e, t, n) { function i(e, r) { var a, d; if (null == e || "none" == e) return null; if (e instanceof s) return e; if (e = e.toLowerCase(), a = o.exec(e)) return e = "transparent" == a[1] ? new l(1, 1, 1, 0) : i(u.namedColors[a[1]], r), e.match = [a[1]], e; if ((a = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\b/i.exec(e)) ? d = new c(n(a[1], 16), n(a[2], 16), n(a[3], 16), 1) : (a = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\b/i.exec(e)) ? d = new c(n(a[1] + a[1], 16), n(a[2] + a[2], 16), n(a[3] + a[3], 16), 1) : (a = /^rgb\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/.exec(e)) ? d = new c(n(a[1], 10), n(a[2], 10), n(a[3], 10), 1) : (a = /^rgba\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9.]+)\s*\)/.exec(e)) ? d = new c(n(a[1], 10), n(a[2], 10), n(a[3], 10), t(a[4])) : (a = /^rgb\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*\)/.exec(e)) ? d = new l(t(a[1]) / 100, t(a[2]) / 100, t(a[3]) / 100, 1) : (a = /^rgba\(\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9]*\.?[0-9]+)%\s*,\s*([0-9.]+)\s*\)/.exec(e)) && (d = new l(t(a[1]) / 100, t(a[2]) / 100, t(a[3]) / 100, t(a[4]))), d) d.match = a; else if (!r) throw Error("Cannot parse color: " + e); return d } function r(e, t, n) { for (n || (n = "0"), e = e.toString(16); t > e.length;) e = "0" + e; return e } var o, a, s, l, c, d, u = function(e) { var t, n, i, r, o, a = this, s = u.formats; if (1 === arguments.length) for (e = a.resolveColor(e), r = 0; s.length > r; r++) t = s[r].re, n = s[r].process, i = t.exec(e), i && (o = n(i), a.r = o[0], a.g = o[1], a.b = o[2]); else a.r = arguments[0], a.g = arguments[1], a.b = arguments[2]; a.r = a.normalizeByte(a.r), a.g = a.normalizeByte(a.g), a.b = a.normalizeByte(a.b) }; u.prototype = { toHex: function() { var e = this, t = e.padDigit, n = e.r.toString(16), i = e.g.toString(16), r = e.b.toString(16); return "#" + t(n) + t(i) + t(r) }, resolveColor: function(e) { return e = e || "black", "#" == e.charAt(0) && (e = e.substr(1, 6)), e = e.replace(/ /g, ""), e = e.toLowerCase(), e = u.namedColors[e] || e }, normalizeByte: function(e) { return 0 > e || isNaN(e) ? 0 : e > 255 ? 255 : e }, padDigit: function(e) { return 1 === e.length ? "0" + e : e }, brightness: function(e) { var t = this, n = Math.round; return t.r = n(t.normalizeByte(t.r * e)), t.g = n(t.normalizeByte(t.g * e)), t.b = n(t.normalizeByte(t.b * e)), t }, percBrightness: function() { var e = this; return Math.sqrt(.241 * e.r * e.r + .691 * e.g * e.g + .068 * e.b * e.b) } }, u.formats = [{ re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(e) { return [n(e[1], 10), n(e[2], 10), n(e[3], 10)] } }, { re: /^(\w{2})(\w{2})(\w{2})$/, process: function(e) { return [n(e[1], 16), n(e[2], 16), n(e[3], 16)] } }, { re: /^(\w{1})(\w{1})(\w{1})$/, process: function(e) { return [n(e[1] + e[1], 16), n(e[2] + e[2], 16), n(e[3] + e[3], 16)] } }], u.namedColors = { aqua: "00ffff", azure: "f0ffff", beige: "f5f5dc", black: "000000", blue: "0000ff", brown: "a52a2a", coral: "ff7f50", cyan: "00ffff", darkblue: "00008b", darkcyan: "008b8b", darkgray: "a9a9a9", darkgreen: "006400", darkorange: "ff8c00", darkred: "8b0000", dimgray: "696969", fuchsia: "ff00ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lightblue: "add8e6", lightgrey: "d3d3d3", lightgreen: "90ee90", lightpink: "ffb6c1", lightyellow: "ffffe0", lime: "00ff00", limegreen: "32cd32", linen: "faf0e6", magenta: "ff00ff", maroon: "800000", mediumblue: "0000cd", navy: "000080", olive: "808000", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", pink: "ffc0cb", plum: "dda0dd", purple: "800080", red: "ff0000", royalblue: "4169e1", salmon: "fa8072", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", snow: "fffafa", steelblue: "4682b4", tan: "d2b48c", teal: "008080", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "ffffff", whitesmoke: "f5f5f5", yellow: "ffff00", yellowgreen: "9acd32" }, o = ["transparent"]; for (a in u.namedColors) u.namedColors.hasOwnProperty(a) && o.push(a); o = RegExp("^(" + o.join("|") + ")(\\W|$)", "i"), s = kendo.Class.extend({ toHSV: function() { return this }, toRGB: function() { return this }, toHex: function() { return this.toBytes().toHex() }, toBytes: function() { return this }, toCss: function() { return "#" + this.toHex() }, toCssRgba: function() { var e = this.toBytes(); return "rgba(" + e.r + ", " + e.g + ", " + e.b + ", " + t((+this.a).toFixed(3)) + ")" }, toDisplay: function() { return kendo.support.browser.msie && 9 > kendo.support.browser.version ? this.toCss() : this.toCssRgba() }, equals: function(e) { return e === this || null !== e && this.toCssRgba() == i(e).toCssRgba() }, diff: function(e) { if (null == e) return 0 / 0; var t = this.toBytes(); return e = e.toBytes(), Math.sqrt(Math.pow(.3 * (t.r - e.r), 2) + Math.pow(.59 * (t.g - e.g), 2) + Math.pow(.11 * (t.b - e.b), 2)) }, clone: function() { var e = this.toBytes(); return e === this && (e = new c(e.r, e.g, e.b, e.a)), e } }), l = s.extend({ init: function(e, t, n, i) { this.r = e, this.g = t, this.b = n, this.a = i }, toHSV: function() { var e, t, n = this.r, i = this.g, r = this.b, o = Math.min(n, i, r), a = Math.max(n, i, r), s = a, l = a - o; return 0 === l ? new d(0, 0, s, this.a) : (0 !== a ? (t = l / a, e = n == a ? (i - r) / l : i == a ? 2 + (r - n) / l : 4 + (n - i) / l, e *= 60, 0 > e && (e += 360)) : (t = 0, e = -1), new d(e, t, s, this.a)) }, toBytes: function() { return new c(255 * this.r, 255 * this.g, 255 * this.b, this.a) } }), c = l.extend({ init: function(e, t, n, i) { this.r = Math.round(e), this.g = Math.round(t), this.b = Math.round(n), this.a = i }, toRGB: function() { return new l(this.r / 255, this.g / 255, this.b / 255, this.a) }, toHSV: function() { return this.toRGB().toHSV() }, toHex: function() { return r(this.r, 2) + r(this.g, 2) + r(this.b, 2) }, toBytes: function() { return this } }), d = s.extend({ init: function(e, t, n, i) { this.h = e, this.s = t, this.v = n, this.a = i }, toRGB: function() { var e, t, n, i, r, o, a, s, c = this.h, d = this.s, u = this.v; if (0 === d) t = n = i = u; else switch (c /= 60, e = Math.floor(c), r = c - e, o = u * (1 - d), a = u * (1 - d * r), s = u * (1 - d * (1 - r)), e) { case 0: t = u, n = s, i = o; break; case 1: t = a, n = u, i = o; break; case 2: t = o, n = u, i = s; break; case 3: t = o, n = a, i = u; break; case 4: t = s, n = o, i = u; break; default: t = u, n = o, i = a } return new l(t, n, i, this.a) }, toBytes: function() { return this.toRGB().toBytes() } }), u.fromBytes = function(e, t, n, i) { return new c(e, t, n, null != i ? i : 1) }, u.fromRGB = function(e, t, n, i) { return new l(e, t, n, null != i ? i : 1) }, u.fromHSV = function(e, t, n, i) { return new d(e, t, n, null != i ? i : 1) }, kendo.Color = u, kendo.parseColor = i }(window.kendo.jQuery, parseFloat, parseInt), function(e) { function t(e) { return typeof e !== F } function n(e, t) { var n = i(t); return A.round(e * n) / n } function i(e) { return e ? A.pow(10, e) : 1 } function r(e, t, n) { return A.max(A.min(e, n), t) } function o(e) { return e * P } function a(e) { return e / P } function s(e) { return "number" == typeof e && !isNaN(e) } function l(e, n) { return t(e) ? e : n } function c(e) { return e * e } function d(e) { var t, n = []; for (t in e) n.push(t + e[t]); return n.sort().join("") } function u(e) { var t, n = 2166136261; for (t = 0; e.length > t; ++t) n += (n << 1) + (n << 4) + (n << 7) + (n << 8) + (n << 24), n ^= e.charCodeAt(t); return n >>> 0 } function h(e) { return u(d(e)) } function p(e) { var t, n = e.length, i = M, r = z; for (t = 0; n > t; t++) r = A.max(r, e[t]), i = A.min(i, e[t]); return { min: i, max: r } } function f(e) { return p(e).min } function g(e) { return p(e).max } function m(e) { return _(e).min } function v(e) { return _(e).max } function _(e) { var t, n, i, r = M, o = z; for (t = 0, n = e.length; n > t; t++) i = e[t], null !== i && isFinite(i) && (r = A.min(r, i), o = A.max(o, i)); return { min: r === M ? void 0 : r, max: o === z ? void 0 : o } } function w(e) { return e ? e[e.length - 1] : void 0 } function b(e, t) { return e.push.apply(e, t), e } function y(e) { return E.template(e, { useWithBlock: !1, paramName: "d" }) } function k(e, n) { return t(n) && null !== n ? " " + e + "='" + n + "' " : "" } function x(e) { var t, n = ""; for (t = 0; e.length > t; t++) n += k(e[t][0], e[t][1]); return n } function C(e) { var n, i, r = ""; for (n = 0; e.length > n; n++) i = e[n][1], t(i) && (r += e[n][0] + ":" + i + ";"); return "" !== r ? r : void 0 } function S(e) { return "string" != typeof e && (e += "px"), e } function T(e) { var t, n, i = []; if (e) for (t = E.toHyphens(e).split("-"), n = 0; t.length > n; n++) i.push("k-pos-" + t[n]); return i.join(" ") } function D(e) { return "" === e || null === e || "none" === e || "transparent" === e || !t(e) } var A = Math, E = window.kendo, I = E.deepExtend, P = A.PI / 180, M = Number.MAX_VALUE, z = -Number.MAX_VALUE, F = "undefined", R = Date.now; R || (R = function() { return (new Date).getTime() }), I(E, { util: { MAX_NUM: M, MIN_NUM: z, append: b, arrayLimits: p, arrayMin: f, arrayMax: g, defined: t, deg: a, hashKey: u, hashObject: h, isNumber: s, isTransparent: D, last: w, limitValue: r, now: R, objectKey: d, round: n, rad: o, renderAttr: k, renderAllAttr: x, renderPos: T, renderSize: S, renderStyle: C, renderTemplate: y, sparseArrayLimits: _, sparseArrayMin: m, sparseArrayMax: v, sqr: c, valueOrDefault: l } }), E.dataviz.util = E.util }(window.kendo.jQuery), function() { function e(e) { var n, i, r, a, s, l, c, d = "", u = 0; for (e = t(e); e.length > u;) n = e.charCodeAt(u++), i = e.charCodeAt(u++), r = e.charCodeAt(u++), a = n >> 2, s = (3 & n) << 4 | i >> 4, l = (15 & i) << 2 | r >> 6, c = 63 & r, isNaN(i) ? l = c = 64 : isNaN(r) && (c = 64), d = d + o.charAt(a) + o.charAt(s) + o.charAt(l) + o.charAt(c); return d } function t(e) { var t, n, i = ""; for (t = 0; e.length > t; t++) n = e.charCodeAt(t), 128 > n ? i += r(n) : 2048 > n ? (i += r(192 | n >>> 6), i += r(128 | 63 & n)) : 65536 > n && (i += r(224 | n >>> 12), i += r(128 | n >>> 6 & 63), i += r(128 | 63 & n)); return i } var n = window.kendo, i = n.deepExtend, r = String.fromCharCode, o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; i(n.util, { encodeBase64: e, encodeUTF8: t }) }(window.kendo.jQuery), function(e) { var t = Math, n = window.kendo, i = n.deepExtend, r = e.inArray, o = { observers: function() { return this._observers = this._observers || [] }, addObserver: function(e) { return this._observers ? this._observers.push(e) : this._observers = [e], this }, removeObserver: function(e) { var t = this.observers(), n = r(e, t); return -1 != n && t.splice(n, 1), this }, trigger: function(e, t) { var n, i, r = this._observers; if (r && !this._suspended) for (i = 0; r.length > i; i++) n = r[i], n[e] && n[e](t); return this }, optionsChange: function(e) { this.trigger("optionsChange", e) }, geometryChange: function(e) { this.trigger("geometryChange", e) }, suspend: function() { return this._suspended = (this._suspended || 0) + 1, this }, resume: function() { return this._suspended = t.max((this._suspended || 0) - 1, 0), this }, _observerField: function(e, t) { this[e] && this[e].removeObserver(this), this[e] = t, t.addObserver(this) } }; i(n, { mixins: { ObserversMixin: o } }) }(window.kendo.jQuery), function(e) { function t(e) { return null === e ? null : e instanceof m ? e : new m(e) } function n(e) { return e && w.isFunction(e.matrix) ? e.matrix() : e } function i(e, t, n, i) { var r = 0, o = 0; return i && (r = v.atan2(i.c * n, i.a * t), 0 !== i.b && (o = v.atan2(i.d * n, i.b * t))), { x: r, y: o } } function r(e, t) { for (; t > e;) e += 90; return e } function o(e, t) { var n, i, r; for (n = 0; t.length > n; n++) i = t[n], r = i.charAt(0).toUpperCase() + i.substring(1, i.length), e["set" + r] = a(i), e["get" + r] = s(i) } function a(e) { return function(t) { return this[e] !== t && (this[e] = t, this.geometryChange()), this } } function s(e) { return function() { return this[e] } } function l(e, t, n) { e > t && (t += 360); var i = v.abs(t - e); return n || (i = 360 - i), i } function c(e, t, n, i, r, o) { var a = D((r - e) / n, 3), s = D((o - t) / i, 3); return D(T(v.atan2(s, a))) } function d(e, t, n, i, r, o, a, s) { var d, u, h, p, f, g, m, w, b, y, k, x, C, S, T, D, A, E; if (t !== i) b = n - e, y = i - t, k = _(r, 2), x = _(o, 2), C = (x * b * (e + n) + k * y * (t + i)) / (2 * k * y), S = C - i, T = -(b * x) / (k * y), f = 1 / k + _(T, 2) / x, g = 2 * (T * S / x - n / k), m = _(n, 2) / k + _(S, 2) / x - 1, w = v.sqrt(_(g, 2) - 4 * f * m), d = (-g - w) / (2 * f), u = C + T * d, h = (-g + w) / (2 * f), p = C + T * h; else { if (e === n) return !1; g = -2 * i, m = _((n - e) * o / (2 * r), 2) + _(i, 2) - _(o, 2), w = v.sqrt(_(g, 2) - 4 * m), d = h = (e + n) / 2, u = (-g - w) / 2, p = (-g + w) / 2 } return D = c(d, u, r, o, e, t), A = c(d, u, r, o, n, i), E = l(D, A, s), (a && 180 >= E || !a && E > 180) && (d = h, u = p, D = c(d, u, r, o, e, t), A = c(d, u, r, o, n, i)), { center: new P(d, u), startAngle: D, endAngle: A } } var u, h, p, f, g, m, v = Math, _ = v.pow, w = window.kendo, b = w.Class, y = w.deepExtend, k = w.mixins.ObserversMixin, x = w.util, C = x.defined, S = x.rad, T = x.deg, D = x.round, A = v.PI / 2, E = x.MIN_NUM, I = x.MAX_NUM, P = b.extend({ init: function(e, t) { this.x = e || 0, this.y = t || 0 }, equals: function(e) { return e && e.x === this.x && e.y === this.y }, clone: function() { return new P(this.x, this.y) }, rotate: function(e, n) { return this.transform(t().rotate(e, n)) }, translate: function(e, t) { return this.x += e, this.y += t, this.geometryChange(), this }, translateWith: function(e) { return this.translate(e.x, e.y) }, move: function(e, t) { return this.x = this.y = 0, this.translate(e, t) }, scale: function(e, t) { return C(t) || (t = e), this.x *= e, this.y *= t, this.geometryChange(), this }, scaleCopy: function(e, t) { return this.clone().scale(e, t) }, transform: function(e) { var t = n(e), i = this.x, r = this.y; return this.x = t.a * i + t.c * r + t.e, this.y = t.b * i + t.d * r + t.f, this.geometryChange(), this }, transformCopy: function(e) { var t = this.clone(); return e && t.transform(e), t }, distanceTo: function(e) { var t = this.x - e.x, n = this.y - e.y; return v.sqrt(t * t + n * n) }, round: function(e) { return this.x = D(this.x, e), this.y = D(this.y, e), this.geometryChange(), this }, toArray: function(e) { var t = C(e), n = t ? D(this.x, e) : this.x, i = t ? D(this.y, e) : this.y; return [n, i] } }); o(P.fn, ["x", "y"]), y(P.fn, k), P.fn.toString = function(e, t) { var n = this.x, i = this.y; return C(e) && (n = D(n, e), i = D(i, e)), t = t || " ", n + t + i }, P.create = function(e, t) { return C(e) ? e instanceof P ? e : 1 === arguments.length && 2 === e.length ? new P(e[0], e[1]) : new P(e, t) : void 0 }, P.min = function() { var e, t, n = x.MAX_NUM, i = x.MAX_NUM; for (e = 0; arguments.length > e; e++) t = arguments[e], n = v.min(t.x, n), i = v.min(t.y, i); return new P(n, i) }, P.max = function() { var e, t, n = x.MIN_NUM, i = x.MIN_NUM; for (e = 0; arguments.length > e; e++) t = arguments[e], n = v.max(t.x, n), i = v.max(t.y, i); return new P(n, i) }, P.minPoint = function() { return new P(E, E) }, P.maxPoint = function() { return new P(I, I) }, P.ZERO = new P(0, 0), u = b.extend({ init: function(e, t) { this.width = e || 0, this.height = t || 0 }, equals: function(e) { return e && e.width === this.width && e.height === this.height }, clone: function() { return new u(this.width, this.height) }, toArray: function(e) { var t = C(e), n = t ? D(this.width, e) : this.width, i = t ? D(this.height, e) : this.height; return [n, i] } }), o(u.fn, ["width", "height"]), y(u.fn, k), u.create = function(e, t) { return C(e) ? e instanceof u ? e : 1 === arguments.length && 2 === e.length ? new u(e[0], e[1]) : new u(e, t) : void 0 }, u.ZERO = new u(0, 0), h = b.extend({ init: function(e, t) { this.setOrigin(e || new P), this.setSize(t || new u) }, clone: function() { return new h(this.origin.clone(), this.size.clone()) }, equals: function(e) { return e && e.origin.equals(this.origin) && e.size.equals(this.size) }, setOrigin: function(e) { return this._observerField("origin", P.create(e)), this.geometryChange(), this }, getOrigin: function() { return this.origin }, setSize: function(e) { return this._observerField("size", u.create(e)), this.geometryChange(), this }, getSize: function() { return this.size }, width: function() { return this.size.width }, height: function() { return this.size.height }, topLeft: function() { return this.origin.clone() }, bottomRight: function() { return this.origin.clone().translate(this.width(), this.height()) }, topRight: function() { return this.origin.clone().translate(this.width(), 0) }, bottomLeft: function() { return this.origin.clone().translate(0, this.height()) }, center: function() { return this.origin.clone().translate(this.width() / 2, this.height() / 2) }, bbox: function(e) { var t = this.topLeft().transformCopy(e), n = this.topRight().transformCopy(e), i = this.bottomRight().transformCopy(e), r = this.bottomLeft().transformCopy(e); return h.fromPoints(t, n, i, r) }, transformCopy: function(e) { return h.fromPoints(this.topLeft().transform(e), this.bottomRight().transform(e)) } }), y(h.fn, k), h.fromPoints = function() { var e = P.min.apply(this, arguments), t = P.max.apply(this, arguments), n = new u(t.x - e.x, t.y - e.y); return new h(e, n) }, h.union = function(e, t) { return h.fromPoints(P.min(e.topLeft(), t.topLeft()), P.max(e.bottomRight(), t.bottomRight())) }, h.intersect = function(e, t) { return e = { left: e.topLeft().x, top: e.topLeft().y, right: e.bottomRight().x, bottom: e.bottomRight().y }, t = { left: t.topLeft().x, top: t.topLeft().y, right: t.bottomRight().x, bottom: t.bottomRight().y }, t.right >= e.left && e.right >= t.left && t.bottom >= e.top && e.bottom >= t.top ? h.fromPoints(new P(v.max(e.left, t.left), v.max(e.top, t.top)), new P(v.min(e.right, t.right), v.min(e.bottom, t.bottom))) : void 0 }, p = b.extend({ init: function(e, t) { this.setCenter(e || new P), this.setRadius(t || 0) }, setCenter: function(e) { return this._observerField("center", P.create(e)), this.geometryChange(), this }, getCenter: function() { return this.center }, equals: function(e) { return e && e.center.equals(this.center) && e.radius === this.radius }, clone: function() { return new p(this.center.clone(), this.radius) }, pointAt: function(e) { return this._pointAt(S(e)) }, bbox: function(e) { var t, n, r, o, a = P.maxPoint(), s = P.minPoint(), l = i(this.center, this.radius, this.radius, e); for (t = 0; 4 > t; t++) n = this._pointAt(l.x + t * A).transformCopy(e), r = this._pointAt(l.y + t * A).transformCopy(e), o = new P(n.x, r.y), a = P.min(a, o), s = P.max(s, o); return h.fromPoints(a, s) }, _pointAt: function(e) { var t = this.center, n = this.radius; return new P(t.x - n * v.cos(e), t.y - n * v.sin(e)) } }), o(p.fn, ["radius"]), y(p.fn, k), f = b.extend({ init: function(e, t) { this.setCenter(e || new P), t = t || {}, this.radiusX = t.radiusX, this.radiusY = t.radiusY || t.radiusX, this.startAngle = t.startAngle, this.endAngle = t.endAngle, this.anticlockwise = t.anticlockwise || !1 }, clone: function() { return new f(this.center, { radiusX: this.radiusX, radiusY: this.radiusY, startAngle: this.startAngle, endAngle: this.endAngle, anticlockwise: this.anticlockwise }) }, setCenter: function(e) { return this._observerField("center", P.create(e)), this.geometryChange(), this }, getCenter: function() { return this.center }, MAX_INTERVAL: 45, pointAt: function(e) { var t = this.center, n = S(e); return new P(t.x + this.radiusX * v.cos(n), t.y + this.radiusY * v.sin(n)) }, curvePoints: function() { var e, t, n, i = this.startAngle, r = this.anticlockwise ? -1 : 1, o = [this.pointAt(i)], a = i, s = this._arcInterval(), l = s.endAngle - s.startAngle, c = v.ceil(l / this.MAX_INTERVAL), d = l / c; for (e = 1; c >= e; e++) t = a + r * d, n = this._intervalCurvePoints(a, t), o.push(n.cp1, n.cp2, n.p2), a = t; return o }, bbox: function(e) { for (var t, n, o = this, a = o._arcInterval(), s = a.startAngle, l = a.endAngle, c = i(this.center, this.radiusX, this.radiusY, e), d = T(c.x), u = T(c.y), p = o.pointAt(s).transformCopy(e), f = o.pointAt(l).transformCopy(e), g = P.min(p, f), m = P.max(p, f), v = r(d, s), _ = r(u, s); l > v || l > _;) l > v && (t = o.pointAt(v).transformCopy(e), v += 90), l > _ && (n = o.pointAt(_).transformCopy(e), _ += 90), p = new P(t.x, n.y), g = P.min(g, p), m = P.max(m, p); return h.fromPoints(g, m) }, _arcInterval: function() { var e, t = this.startAngle, n = this.endAngle, i = this.anticlockwise; return i && (e = t, t = n, n = e), (t > n || i && t === n) && (n += 360), { startAngle: t, endAngle: n } }, _intervalCurvePoints: function(e, t) { var n = this, i = n.pointAt(e), r = n.pointAt(t), o = n._derivativeAt(e), a = n._derivativeAt(t), s = (S(t) - S(e)) / 3, l = new P(i.x + s * o.x, i.y + s * o.y), c = new P(r.x - s * a.x, r.y - s * a.y); return { p1: i, cp1: l, cp2: c, p2: r } }, _derivativeAt: function(e) { var t = this, n = S(e); return new P(-t.radiusX * v.sin(n), t.radiusY * v.cos(n)) } }), o(f.fn, ["radiusX", "radiusY", "startAngle", "endAngle", "anticlockwise"]), y(f.fn, k), f.fromPoints = function(e, t, n, i, r, o) { var a = d(e.x, e.y, t.x, t.y, n, i, r, o); return new f(a.center, { startAngle: a.startAngle, endAngle: a.endAngle, radiusX: n, radiusY: i, anticlockwise: 0 === o }) }, g = b.extend({ init: function(e, t, n, i, r, o) { this.a = e || 0, this.b = t || 0, this.c = n || 0, this.d = i || 0, this.e = r || 0, this.f = o || 0 }, multiplyCopy: function(e) { return new g(this.a * e.a + this.c * e.b, this.b * e.a + this.d * e.b, this.a * e.c + this.c * e.d, this.b * e.c + this.d * e.d, this.a * e.e + this.c * e.f + this.e, this.b * e.e + this.d * e.f + this.f) }, invert: function() { var e = this.a, t = this.b, n = this.c, i = this.d, r = this.e, o = this.f, a = e * i - t * n; return 0 === a ? null : new g(i / a, -t / a, -n / a, e / a, (n * o - i * r) / a, (t * r - e * o) / a) }, clone: function() { return new g(this.a, this.b, this.c, this.d, this.e, this.f) }, equals: function(e) { return e ? this.a === e.a && this.b === e.b && this.c === e.c && this.d === e.d && this.e === e.e && this.f === e.f : !1 }, round: function(e) { return this.a = D(this.a, e), this.b = D(this.b, e), this.c = D(this.c, e), this.d = D(this.d, e), this.e = D(this.e, e), this.f = D(this.f, e), this }, toArray: function(e) { var t, n = [this.a, this.b, this.c, this.d, this.e, this.f]; if (C(e)) for (t = 0; n.length > t; t++) n[t] = D(n[t], e); return n } }), g.fn.toString = function(e, t) { return this.toArray(e).join(t || ",") }, g.translate = function(e, t) { return new g(1, 0, 0, 1, e, t) }, g.unit = function() { return new g(1, 0, 0, 1, 0, 0) }, g.rotate = function(e, t, n) { var i = new g; return i.a = v.cos(S(e)), i.b = v.sin(S(e)), i.c = -i.b, i.d = i.a, i.e = t - t * i.a + n * i.b || 0, i.f = n - n * i.a - t * i.b || 0, i }, g.scale = function(e, t) { return new g(e, 0, 0, t, 0, 0) }, g.IDENTITY = g.unit(), m = b.extend({ init: function(e) { this._matrix = e || g.unit() }, clone: function() { return new m(this._matrix.clone()) }, equals: function(e) { return e && e._matrix.equals(this._matrix) }, _optionsChange: function() { this.optionsChange({ field: "transform", value: this }) }, translate: function(e, t) { return this._matrix = this._matrix.multiplyCopy(g.translate(e, t)), this._optionsChange(), this }, scale: function(e, t, n) { return C(t) || (t = e), n && (n = P.create(n), this._matrix = this._matrix.multiplyCopy(g.translate(n.x, n.y))), this._matrix = this._matrix.multiplyCopy(g.scale(e, t)), n && (this._matrix = this._matrix.multiplyCopy(g.translate(-n.x, -n.y))), this._optionsChange(), this }, rotate: function(e, t) { return t = P.create(t) || P.ZERO, this._matrix = this._matrix.multiplyCopy(g.rotate(e, t.x, t.y)), this._optionsChange(), this }, multiply: function(e) { var t = n(e); return this._matrix = this._matrix.multiplyCopy(t), this._optionsChange(), this }, matrix: function() { return this._matrix } }), y(m.fn, k), y(w, { geometry: { Arc: f, Circle: p, Matrix: g, Point: P, Rect: h, Size: u, Transformation: m, transform: t, toMatrix: n } }), w.dataviz.geometry = w.geometry }(window.kendo.jQuery), function(e) { var t, n, i, r = e.noop, o = Object.prototype.toString, a = window.kendo, s = a.Class, l = a.ui.Widget, c = a.deepExtend, d = a.util, u = d.defined, h = l.extend({ init: function(e, t) { this.options = c({}, this.options, t), l.fn.init.call(this, e, this.options), this._click = this._handler("click"), this._mouseenter = this._handler("mouseenter"), this._mouseleave = this._handler("mouseleave"), this._visual = new a.drawing.Group, this.options.width && this.element.css("width", this.options.width), this.options.height && this.element.css("height", this.options.height) }, options: { name: "Surface" }, events: ["click", "mouseenter", "mouseleave", "resize"], draw: function(e) { this._visual.children.push(e) }, clear: function() { this._visual.children = [] }, destroy: function() { this._visual = null, l.fn.destroy.call(this) }, exportVisual: function() { return this._visual }, getSize: function() { return { width: this.element.width(), height: this.element.height() } }, setSize: function(e) { this.element.css({ width: e.width, height: e.height }), this._size = e, this._resize() }, eventTarget: function(t) { for (var n, i = e(t.touch ? t.touch.initialTouch : t.target); !n && i.length > 0 && (n = i[0]._kendoNode, !i.is(this.element) && 0 !== i.length);) i = i.parent(); return n ? n.srcElement : void 0 }, _resize: r, _handler: function(e) { var t = this; return function(n) { var i = t.eventTarget(n); i && t.trigger(e, { element: i, originalEvent: n }) } } }); a.ui.plugin(h), h.create = function(e, t) { return i.current.create(e, t) }, t = s.extend({ init: function(e) { this.childNodes = [], this.parent = null, e && (this.srcElement = e, this.observe()) }, destroy: function() { var e, t; for (this.srcElement && this.srcElement.removeObserver(this), e = this.childNodes, t = 0; e.length > t; t++) this.childNodes[t].destroy(); this.parent = null }, load: r, observe: function() { this.srcElement && this.srcElement.addObserver(this) }, append: function(e) { this.childNodes.push(e), e.parent = this }, insertAt: function(e, t) { this.childNodes.splice(t, 0, e), e.parent = this }, remove: function(e, t) { var n, i = e + t; for (n = e; i > n; n++) this.childNodes[n].removeSelf(); this.childNodes.splice(e, t) }, removeSelf: function() { this.clear(), this.destroy() }, clear: function() { this.remove(0, this.childNodes.length) }, invalidate: function() { this.parent && this.parent.invalidate() }, geometryChange: function() { this.invalidate() }, optionsChange: function() { this.invalidate() }, childrenChange: function(e) { "add" === e.action ? this.load(e.items, e.index) : "remove" === e.action && this.remove(e.index, e.items.length), this.invalidate() } }), n = s.extend({ init: function(e, t) { var n, i; this.prefix = t || ""; for (n in e) i = e[n], i = this._wrap(i, n), this[n] = i }, get: function(e) { return a.getter(e, !0)(this) }, set: function(e, t) { var n, i = a.getter(e, !0)(this); i !== t && (n = this._set(e, this._wrap(t, e)), n || this.optionsChange({ field: this.prefix + e, value: t })) }, _set: function(e, t) { var i, r, o, s = e.indexOf(".") >= 0; if (s) for (i = e.split("."), r = ""; i.length > 1;) { if (r += i.shift(), o = a.getter(r, !0)(this), o || (o = new n({}, r + "."), o.addObserver(this), this[r] = o), o instanceof n) return o.set(i.join("."), t), s; r += "." } return this._clear(e), a.setter(e)(this, t), s }, _clear: function(e) { var t = a.getter(e, !0)(this); t && t.removeObserver && t.removeObserver(this) }, _wrap: function(e, t) { var i = o.call(e); return null !== e && u(e) && "[object Object]" === i && (e instanceof n || e instanceof s || (e = new n(e, this.prefix + t + ".")), e.addObserver(this)), e } }), c(n.fn, a.mixins.ObserversMixin), i = function() { this._items = [] }, i.prototype = { register: function(e, t, n) { var i = this._items, r = i[0], o = { name: e, type: t, order: n }; !r || r.order > n ? i.unshift(o) : i.push(o) }, create: function(e, t) { var n, i, r = this._items, o = r[0]; if (t && t.type) for (n = t.type.toLowerCase(), i = 0; r.length > i; i++) if (r[i].name === n) { o = r[i]; break } return o ? new o.type(e, t) : void a.logToConsole("Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\n- The browser does not support SVG, VML and Canvas. User agent: " + navigator.userAgent + "\n- The Kendo UI scripts are not fully loaded") } }, i.current = new i, c(a, { drawing: { DASH_ARRAYS: { dot: [1.5, 3.5], dash: [4, 3.5], longdash: [8, 3.5], dashdot: [3.5, 3.5, 1.5, 3.5], longdashdot: [8, 3.5, 1.5, 3.5], longdashdotdot: [8, 3.5, 1.5, 3.5, 1.5, 3.5] }, Color: a.Color, BaseNode: t, OptionsStore: n, Surface: h, SurfaceFactory: i } }), a.dataviz.drawing = a.drawing }(window.kendo.jQuery), function() { var e = window.kendo, t = e.deepExtend, n = e.util.defined, i = "gradient", r = { extend: function(e) { e.fill = this.fill, e.stroke = this.stroke }, fill: function(e, t) { var r, o = this.options; return n(e) ? (e && e.nodeType != i ? (r = { color: e }, n(t) && (r.opacity = t), o.set("fill", r)) : o.set("fill", e), this) : o.get("fill") }, stroke: function(e, t, i) { return n(e) ? (this.options.set("stroke.color", e), n(t) && this.options.set("stroke.width", t), n(i) && this.options.set("stroke.opacity", i), this) : this.options.get("stroke") } }, o = { extend: function(e, t) { e.traverse = function(e) { var n, i, r = this[t]; for (n = 0; r.length > n; n++) i = r[n], i.traverse ? i.traverse(e) : e(i); return this } } }; t(e.drawing, { mixins: { Paintable: r, Traversable: o } }) }(window.kendo.jQuery), function(e) { function t(e, t) { return d.current.measure(e, t) } var n = document, i = window.kendo, r = i.Class, o = i.deepExtend, a = i.util, s = a.defined, l = 1, c = r.extend({ init: function(e) { this._size = e, this._length = 0, this._map = {} }, put: function(e, t) { var n = this, i = n._map, r = { key: e, value: t }; i[e] = r, n._head ? (n._tail.newer = r, r.older = n._tail, n._tail = r) : n._head = n._tail = r, n._length >= n._size ? (i[n._head.key] = null, n._head = n._head.newer, n._head.older = null) : n._length++ }, get: function(e) { var t = this, n = t._map[e]; return n ? (n === t._head && n !== t._tail && (t._head = n.newer, t._head.older = null), n !== t._tail && (n.older && (n.older.newer = n.newer, n.newer.older = n.older), n.older = t._tail, n.newer = null, t._tail.newer = n, t._tail = n), n.value) : void 0 } }), d = r.extend({ init: function() { this._cache = new c(1e3) }, measure: function(t, i) { var r, o, c, d, u, h = a.objectKey(i), p = a.hashKey(t + h), f = this._cache.get(p); if (f) return f; r = { width: 0, height: 0, baseline: 0 }, o = this._measureBox, c = this._baselineMarker.cloneNode(!1); for (d in i) u = i[d], s(u) && (o.style[d] = u); return e(o).text(t), o.appendChild(c), n.body.appendChild(o), (t + "").length && (r.width = o.offsetWidth - l, r.height = o.offsetHeight, r.baseline = c.offsetTop + l), this._cache.put(p, r), o.parentNode.removeChild(o), r } }); d.fn._baselineMarker = e("<div class='k-baseline-marker' style='display: inline-block; vertical-align: baseline;width: " + l + "px; height: " + l + "px;overflow: hidden;' />")[0], d.fn._measureBox = e("<div style='position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;padding: 0 !important; margin: 0 !important; border: 0 !important;line-height: normal !important; visibility: hidden !important; white-space:nowrap !important;' />")[0], d.current = new d, o(i.drawing, { util: { TextMetrics: d, LRUCache: c, measureText: t } }) }(window.kendo.jQuery), function(e) { function t(e, t, n) { var i, r, o, a; for (r = 0; e.length > r; r++) o = e[r], o.visible() && (a = t ? o.bbox(n) : o.rawBBox(), a && (i = i ? $.union(i, a) : a)); return i } function n(e, t) { var n, i, r, o; for (i = 0; e.length > i; i++) r = e[i], r.visible() && (o = r.clippedBBox(t), o && (n = n ? $.union(n, o) : o)); return n } function i(e, t) { e.origin.x -= t, e.origin.y -= t, e.size.width += 2 * t, e.size.height += 2 * t } function r(e, t) { for (var n = 0; t.length > n; n++) e[t[n]] = o(t[n]) } function o(e) { var t = "_" + e; return function(e) { return rt(e) ? (this._observerField(t, e), this.geometryChange(), this) : this[t] } } function a(e, t) { for (var n = 0; t.length > n; n++) e[t[n]] = s(t[n]) } function s(e) { var t = "_" + e; return function(e) { return rt(e) ? (this._observerField(t, q.create(e)), this.geometryChange(), this) : this[t] } } function l(e, t) { for (var n = 0; t.length > n; n++) e[t[n]] = c(t[n]) } function c(e) { return function(t) { return rt(t) ? (this.options.set(e, t), this) : this.options.get(e) } } function d() { return "kdef" + gt++ } function u(e, t, n) { k(e, t, n, "x", "width") } function h(e, t, n) { k(e, t, n, "y", "height") } function p(e) { y(b(e), "x", "y", "width") } function f(e) { y(b(e), "y", "x", "height") } function g(e, t) { return v(e, t, "x", "y", "width") } function m(e, t) { return v(e, t, "y", "x", "height") } function v(e, t, n, i, r) { var o, a, s, l, c = [], d = w(e, t, r), u = t.origin.clone(); for (l = 0; d.length > l; l++) for (s = d[l], o = s[0], u[i] = o.bbox.origin[i], S(u, o.bbox, o.element), o.bbox.origin[n] = u[n], y(s, n, i, r), c.push([]), a = 0; s.length > a; a++) c[l].push(s[a].element); return c } function _(e, t) { var n, i, r = e.clippedBBox(), o = r.size, a = t.size; (o.width > a.width || o.height > a.height) && (n = J.min(a.width / o.width, a.height / o.height), i = e.transform() || G.transform(), i.scale(n, n), e.transform(i)) } function w(e, t, n) { var i, r, o, a, s = t.size[n], l = 0, c = [], d = [], u = function() { d.push({ element: i, bbox: o }) }; for (a = 0; e.length > a; a++) i = e[a], o = i.clippedBBox(), o && (r = o.size[n], l + r > s ? d.length ? (c.push(d), d = [], u(), l = r) : (u(), c.push(d), d = [], l = 0) : (u(), l += r)); return d.length && c.push(d), c } function b(e) { var t, n, i, r = []; for (i = 0; e.length > i; i++) t = e[i], n = t.clippedBBox(), n && r.push({ element: t, bbox: n }); return r } function y(e, t, n, i) { var r, o, a, s, l; if (e.length > 1) for (r = e[0].bbox, o = new q, l = 1; e.length > l; l++) a = e[l].element, s = e[l].bbox, o[t] = r.origin[t] + r.size[i], o[n] = s.origin[n], S(o, s, a), s.origin[t] = o[t], r = s } function k(e, t, n, i, r) { var o, a, s; for (n = n || "start", s = 0; e.length > s; s++) o = e[s].clippedBBox(), o && (a = o.origin.clone(), a[i] = x(o.size[r], t, n, i, r), S(a, o, e[s])) } function x(e, t, n, i, r) { var o; return o = n == mt ? t.origin[i] : n == vt ? t.origin[i] + t.size[r] - e : t.origin[i] + (t.size[r] - e) / 2 } function C(e, t, n) { var i = n.transform() || G.transform(), r = i.matrix(); r.e += e, r.f += t, n.transform(i) } function S(e, t, n) { C(e.x - t.origin.x, e.y - t.origin.y, n) } var T, D, A, E, I, P, M, z, F, R, H, B, L, N, O, V, U = window.kendo, W = U.Class, j = U.deepExtend, G = U.geometry, q = G.Point, $ = G.Rect, Y = G.Size, Q = G.Matrix, K = G.toMatrix, X = U.drawing, Z = X.OptionsStore, J = Math, et = J.pow, tt = U.util, nt = tt.append, it = tt.arrayLimits, rt = tt.defined, ot = tt.last, at = tt.valueOrDefault, st = U.mixins.ObserversMixin, lt = e.inArray, ct = [].push, dt = [].pop, ut = [].splice, ht = [].shift, pt = [].slice, ft = [].unshift, gt = 1, mt = "start", vt = "end", _t = "horizontal", wt = W.extend({ nodeType: "Element", init: function(e) { this._initOptions(e) }, _initOptions: function(e) { var t, n; e = e || {}, t = e.transform, n = e.clip, t && (e.transform = G.transform(t)), n && !n.id && (n.id = d()), this.options = new Z(e), this.options.addObserver(this) }, transform: function(e) { return rt(e) ? void this.options.set("transform", G.transform(e)) : this.options.get("transform") }, parentTransform: function() { for (var e, t, n = this; n.parent;) n = n.parent, e = n.transform(), e && (t = e.matrix().multiplyCopy(t || Q.unit())); return t ? G.transform(t) : void 0 }, currentTransform: function(e) { var t, n, i = this.transform(), r = K(i); return rt(e) || (e = this.parentTransform()), t = K(e), n = r && t ? t.multiplyCopy(r) : r || t, n ? G.transform(n) : void 0 }, visible: function(e) { return rt(e) ? (this.options.set("visible", e), this) : this.options.get("visible") !== !1 }, clip: function(e) { var t = this.options; return rt(e) ? (e && !e.id && (e.id = d()), t.set("clip", e), this) : t.get("clip") }, opacity: function(e) { return rt(e) ? (this.options.set("opacity", e), this) : at(this.options.get("opacity"), 1) }, clippedBBox: function(e) { var t, n = this._clippedBBox(e); return n ? (t = this.clip(), t ? $.intersect(n, t.bbox(e)) : n) : void 0 }, _clippedBBox: function(e) { return this.bbox(e) } }); j(wt.fn, st), T = W.extend({ init: function(e) { e = e || [], this.length = 0, this._splice(0, e.length, e) }, elements: function(e) { return e ? (this._splice(0, this.length, e), this._change(), this) : this.slice(0) }, push: function() { var e = arguments, t = ct.apply(this, e); return this._add(e), t }, slice: pt, pop: function() { var e = this.length, t = dt.apply(this); return e && this._remove([t]), t }, splice: function(e, t) { var n = pt.call(arguments, 2), i = this._splice(e, t, n); return this._change(), i }, shift: function() { var e = this.length, t = ht.apply(this); return e && this._remove([t]), t }, unshift: function() { var e = arguments, t = ft.apply(this, e); return this._add(e), t }, indexOf: function(e) { var t, n, i = this; for (t = 0, n = i.length; n > t; t++) if (i[t] === e) return t; return -1 }, _splice: function(e, t, n) { var i = ut.apply(this, [e, t].concat(n)); return this._clearObserver(i), this._setObserver(n), i }, _add: function(e) { this._setObserver(e), this._change() }, _remove: function(e) { this._clearObserver(e), this._change() }, _setObserver: function(e) { for (var t = 0; e.length > t; t++) e[t].addObserver(this) }, _clearObserver: function(e) { for (var t = 0; e.length > t; t++) e[t].removeObserver(this) }, _change: function() {} }), j(T.fn, st), D = wt.extend({ nodeType: "Group", init: function(e) { wt.fn.init.call(this, e), this.children = [] }, childrenChange: function(e, t, n) { this.trigger("childrenChange", { action: e, items: t, index: n }) }, append: function() { return nt(this.children, arguments), this._reparent(arguments, this), this.childrenChange("add", arguments), this }, insertAt: function(e, t) { return this.children.splice(t, 0, e), e.parent = this, this.childrenChange("add", [e], t), this }, remove: function(e) { var t = lt(e, this.children); return t >= 0 && (this.children.splice(t, 1), e.parent = null, this.childrenChange("remove", [e], t)), this }, removeAt: function(e) { if (e >= 0 && this.children.length > e) { var t = this.children[e]; this.children.splice(e, 1), t.parent = null, this.childrenChange("remove", [t], e) } return this }, clear: function() { var e = this.children; return this.children = [], this._reparent(e, null), this.childrenChange("remove", e, 0), this }, bbox: function(e) { return t(this.children, !0, this.currentTransform(e)) }, rawBBox: function() { return t(this.children, !1) }, _clippedBBox: function(e) { return n(this.children, this.currentTransform(e)) }, currentTransform: function(e) { return wt.fn.currentTransform.call(this, e) || null }, _reparent: function(e, t) { var n, i, r; for (n = 0; e.length > n; n++) i = e[n], r = i.parent, r && r != this && r.remove && r.remove(i), i.parent = t } }), X.mixins.Traversable.extend(D.fn, "children"), A = wt.extend({ nodeType: "Text", init: function(e, t, n) { wt.fn.init.call(this, n), this.content(e), this.position(t || new G.Point), this.options.font || (this.options.font = "12px sans-serif"), rt(this.options.fill) || this.fill("#000") }, content: function(e) { return rt(e) ? (this.options.set("content", e), this) : this.options.get("content") }, measure: function() { var e = X.util.measureText(this.content(), { font: this.options.get("font") }); return e }, rect: function() { var e = this.measure(), t = this.position().clone(); return new G.Rect(t, [e.width, e.height]) }, bbox: function(e) { var t = K(this.currentTransform(e)); return this.rect().bbox(t) }, rawBBox: function() { return this.rect().bbox() } }), X.mixins.Paintable.extend(A.fn), a(A.fn, ["position"]), E = wt.extend({ nodeType: "Circle", init: function(e, t) { wt.fn.init.call(this, t), this.geometry(e || new G.Circle), rt(this.options.stroke) || this.stroke("#000") }, bbox: function(e) { var t = K(this.currentTransform(e)), n = this._geometry.bbox(t), r = this.options.get("stroke.width"); return r && i(n, r / 2), n }, rawBBox: function() { return this._geometry.bbox() } }), X.mixins.Paintable.extend(E.fn), r(E.fn, ["geometry"]), I = wt.extend({ nodeType: "Arc", init: function(e, t) { wt.fn.init.call(this, t), this.geometry(e || new G.Arc), rt(this.options.stroke) || this.stroke("#000") }, bbox: function(e) { var t = K(this.currentTransform(e)), n = this.geometry().bbox(t), r = this.options.get("stroke.width"); return r && i(n, r / 2), n }, rawBBox: function() { return this.geometry().bbox() }, toPath: function() { var e, t = new z, n = this.geometry().curvePoints(); if (n.length > 0) for (t.moveTo(n[0].x, n[0].y), e = 1; n.length > e; e += 3) t.curveTo(n[e], n[e + 1], n[e + 2]); return t } }), X.mixins.Paintable.extend(I.fn), r(I.fn, ["geometry"]), P = T.extend({ _change: function() { this.geometryChange() } }), M = W.extend({ init: function(e, t, n) { this.anchor(e || new q), this.controlIn(t), this.controlOut(n) }, bboxTo: function(e, t) { var n, i = this.anchor().transformCopy(t), r = e.anchor().transformCopy(t); return n = this.controlOut() && e.controlIn() ? this._curveBoundingBox(i, this.controlOut().transformCopy(t), e.controlIn().transformCopy(t), r) : this._lineBoundingBox(i, r) }, _lineBoundingBox: function(e, t) { return $.fromPoints(e, t) }, _curveBoundingBox: function(e, t, n, i) { var r = [e, t, n, i], o = this._curveExtremesFor(r, "x"), a = this._curveExtremesFor(r, "y"), s = it([o.min, o.max, e.x, i.x]), l = it([a.min, a.max, e.y, i.y]); return $.fromPoints(new q(s.min, l.min), new q(s.max, l.max)) }, _curveExtremesFor: function(e, t) { var n = this._curveExtremes(e[0][t], e[1][t], e[2][t], e[3][t]); return { min: this._calculateCurveAt(n.min, t, e), max: this._calculateCurveAt(n.max, t, e) } }, _calculateCurveAt: function(e, t, n) { var i = 1 - e; return et(i, 3) * n[0][t] + 3 * et(i, 2) * e * n[1][t] + 3 * et(e, 2) * i * n[2][t] + et(e, 3) * n[3][t] }, _curveExtremes: function(e, t, n, i) { var r, o, a = e - 3 * t + 3 * n - i, s = -2 * (e - 2 * t + n), l = e - t, c = J.sqrt(s * s - 4 * a * l), d = 0, u = 1; return 0 === a ? 0 !== s && (d = u = -l / s) : isNaN(c) || (d = (-s + c) / (2 * a), u = (-s - c) / (2 * a)), r = J.max(J.min(d, u), 0), (0 > r || r > 1) && (r = 0), o = J.min(J.max(d, u), 1), (o > 1 || 0 > o) && (o = 1), { min: r, max: o } } }), a(M.fn, ["anchor", "controlIn", "controlOut"]), j(M.fn, st), z = wt.extend({ nodeType: "Path", init: function(e) { wt.fn.init.call(this, e), this.segments = new P, this.segments.addObserver(this), rt(this.options.stroke) || (this.stroke("#000"), rt(this.options.stroke.lineJoin) || this.options.set("stroke.lineJoin", "miter")) }, moveTo: function(e, t) { return this.suspend(), this.segments.elements([]), this.resume(), this.lineTo(e, t), this }, lineTo: function(e, t) { var n = rt(t) ? new q(e, t) : e, i = new M(n); return this.segments.push(i), this }, curveTo: function(e, t, n) { var i, r; return this.segments.length > 0 && (i = ot(this.segments), r = new M(n, t), this.suspend(), i.controlOut(e), this.resume(), this.segments.push(r)), this }, arc: function(e, t, n, i, r) { var o, a, s, l, c; return this.segments.length > 0 && (o = ot(this.segments), a = o.anchor(), s = tt.rad(e), l = new q(a.x - n * J.cos(s), a.y - i * J.sin(s)), c = new G.Arc(l, { startAngle: e, endAngle: t, radiusX: n, radiusY: i, anticlockwise: r }), this._addArcSegments(c)), this }, arcTo: function(e, t, n, i, r) { var o, a, s; return this.segments.length > 0 && (o = ot(this.segments), a = o.anchor(), s = G.Arc.fromPoints(a, e, t, n, i, r), this._addArcSegments(s)), this }, _addArcSegments: function(e) { var t, n; for (this.suspend(), t = e.curvePoints(), n = 1; t.length > n; n += 3) this.curveTo(t[n], t[n + 1], t[n + 2]); this.resume(), this.geometryChange() }, close: function() { return this.options.closed = !0, this.geometryChange(), this }, bbox: function(e) { var t = K(this.currentTransform(e)), n = this._bbox(t), r = this.options.get("stroke.width"); return r && i(n, r / 2), n }, rawBBox: function() { return this._bbox() }, _bbox: function(e) { var t, n, i, r, o = this.segments, a = o.length; if (1 === a) n = o[0].anchor().transformCopy(e), t = new $(n, Y.ZERO); else if (a > 0) for (i = 1; a > i; i++) r = o[i - 1].bboxTo(o[i], e), t = t ? $.union(t, r) : r; return t } }), X.mixins.Paintable.extend(z.fn), z.fromRect = function(e, t) { return new z(t).moveTo(e.topLeft()).lineTo(e.topRight()).lineTo(e.bottomRight()).lineTo(e.bottomLeft()).close() }, z.fromPoints = function(e, t) { var n, i, r; if (e) { for (n = new z(t), i = 0; e.length > i; i++) r = q.create(e[i]), r && (0 === i ? n.moveTo(r) : n.lineTo(r)); return n } }, z.fromArc = function(e, t) { var n = new z(t), i = e.startAngle, r = e.pointAt(i); return n.moveTo(r.x, r.y), n.arc(i, e.endAngle, e.radiusX, e.radiusY, e.anticlockwise), n }, F = wt.extend({ nodeType: "MultiPath", init: function(e) { wt.fn.init.call(this, e), this.paths = new P, this.paths.addObserver(this), rt(this.options.stroke) || this.stroke("#000") }, moveTo: function(e, t) { var n = new z; return n.moveTo(e, t), this.paths.push(n), this }, lineTo: function(e, t) { return this.paths.length > 0 && ot(this.paths).lineTo(e, t), this }, curveTo: function(e, t, n) { return this.paths.length > 0 && ot(this.paths).curveTo(e, t, n), this }, arc: function(e, t, n, i, r) { return this.paths.length > 0 && ot(this.paths).arc(e, t, n, i, r), this }, arcTo: function(e, t, n, i, r) { return this.paths.length > 0 && ot(this.paths).arcTo(e, t, n, i, r), this }, close: function() { return this.paths.length > 0 && ot(this.paths).close(), this }, bbox: function(e) { return t(this.paths, !0, this.currentTransform(e)) }, rawBBox: function() { return t(this.paths, !1) }, _clippedBBox: function(e) { return n(this.paths, this.currentTransform(e)) } }), X.mixins.Paintable.extend(F.fn), R = wt.extend({ nodeType: "Image", init: function(e, t, n) { wt.fn.init.call(this, n), this.src(e), this.rect(t || new G.Rect) }, src: function(e) { return rt(e) ? (this.options.set("src", e), this) : this.options.get("src") }, bbox: function(e) { var t = K(this.currentTransform(e)); return this._rect.bbox(t) }, rawBBox: function() { return this._rect.bbox() } }), r(R.fn, ["rect"]), H = W.extend({ init: function(e, t, n) { this.options = new Z({ offset: e, color: t, opacity: rt(n) ? n : 1 }), this.options.addObserver(this) } }), l(H.fn, ["offset", "color", "opacity"]), j(H.fn, st), H.create = function(e) { if (rt(e)) { var t; return t = e instanceof H ? e : e.length > 1 ? new H(e[0], e[1], e[2]) : new H(e.offset, e.color, e.opacity) } }, B = T.extend({ _change: function() { this.optionsChange({ field: "stops" }) } }), L = W.extend({ nodeType: "gradient", init: function(e) { this.stops = new B(this._createStops(e.stops)), this.stops.addObserver(this), this._userSpace = e.userSpace, this.id = d() }, userSpace: function(e) { return rt(e) ? (this._userSpace = e, this.optionsChange(), this) : this._userSpace }, _createStops: function(e) { var t, n = []; for (e = e || [], t = 0; e.length > t; t++) n.push(H.create(e[t])); return n }, addStop: function(e, t, n) { this.stops.push(new H(e, t, n)) }, removeStop: function(e) { var t = this.stops.indexOf(e); t >= 0 && this.stops.splice(t, 1) } }), j(L.fn, st, { optionsChange: function(e) { this.trigger("optionsChange", { field: "gradient" + (e ? "." + e.field : ""), value: this }) }, geometryChange: function() { this.optionsChange() } }), N = L.extend({ init: function(e) { e = e || {}, L.fn.init.call(this, e), this.start(e.start || new q), this.end(e.end || new q(1, 0)) } }), a(N.fn, ["start", "end"]), O = L.extend({ init: function(e) { e = e || {}, L.fn.init.call(this, e), this.center(e.center || new q), this._radius = rt(e.radius) ? e.radius : 1, this._fallbackFill = e.fallbackFill }, radius: function(e) { return rt(e) ? (this._radius = e, this.geometryChange(), this) : this._radius }, fallbackFill: function(e) { return rt(e) ? (this._fallbackFill = e, this.optionsChange(), this) : this._fallbackFill } }), a(O.fn, ["center"]), V = D.extend({ init: function(e, t) { D.fn.init.call(this, U.deepExtend({}, this._defaults, t)), this._rect = e, this._fieldMap = {} }, _defaults: { alignContent: mt, justifyContent: mt, alignItems: mt, spacing: 0, orientation: _t, lineSpacing: 0, wrap: !0 }, rect: function(e) { return e ? (this._rect = e, this) : this._rect }, _initMap: function() { var e = this.options, t = this._fieldMap; e.orientation == _t ? (t.sizeField = "width", t.groupsSizeField = "height", t.groupAxis = "x", t.groupsAxis = "y") : (t.sizeField = "height", t.groupsSizeField = "width", t.groupAxis = "y", t.groupsAxis = "x") }, reflow: function() { var e, t, n, i, r, o, a, s, l, c, d, u, h, p, f, g, m, v, _, w, b, y, k, C, T, D; if (this._rect && 0 !== this.children.length) { for (this._initMap(), this.options.transform && this.transform(null), e = this.options, t = this._fieldMap, n = this._rect, i = this._initGroups(), r = i.groups, o = i.groupsSize, a = t.sizeField, s = t.groupsSizeField, l = t.groupAxis, c = t.groupsAxis, d = x(o, n, e.alignContent, c, s), u = new q, h = new q, p = new G.Size, w = 0; r.length > w; w++) { for (v = r[w], u[l] = f = x(v.size, n, e.justifyContent, l, a), u[c] = d, p[a] = v.size, p[s] = v.lineSize, _ = new $(u, p), b = 0; v.bboxes.length > b; b++) m = v.elements[b], g = v.bboxes[b], h[l] = f, h[c] = x(g.size[s], _, e.alignItems, c, s), S(h, g, m), f += g.size[a] + e.spacing; d += v.lineSize + e.lineSpacing }!e.wrap && v.size > n.size[a] && (y = n.size[a] / _.size[a], k = _.topLeft().scale(y, y), C = _.size[s] * y, T = x(C, n, e.alignContent, c, s), D = G.transform(), "x" === l ? D.translate(n.origin.x - k.x, T - k.y) : D.translate(T - k.x, n.origin.y - k.y), D.scale(y, y), this.transform(D)) } }, _initGroups: function() { var e, t, n, i = this.options, r = this.children, o = i.lineSpacing, a = this._fieldMap.sizeField, s = -o, l = [], c = this._newGroup(), d = function() { l.push(c), s += c.lineSize + o }; for (n = 0; r.length > n; n++) t = r[n], e = r[n].clippedBBox(), t.visible() && e && (i.wrap && c.size + e.size[a] + i.spacing > this._rect.size[a] ? 0 === c.bboxes.length ? (this._addToGroup(c, e, t), d(), c = this._newGroup()) : (d(), c = this._newGroup(), this._addToGroup(c, e, t)) : this._addToGroup(c, e, t)); return c.bboxes.length && d(), { groups: l, groupsSize: s } }, _addToGroup: function(e, t, n) { e.size += t.size[this._fieldMap.sizeField] + this.options.spacing, e.lineSize = Math.max(t.size[this._fieldMap.groupsSizeField], e.lineSize), e.bboxes.push(t), e.elements.push(n) }, _newGroup: function() { return { lineSize: 0, size: -this.options.spacing, bboxes: [], elements: [] } } }), j(X, { align: u, Arc: I, Circle: E, Element: wt, ElementsArray: T, fit: _, Gradient: L, GradientStop: H, Group: D, Image: R, Layout: V, LinearGradient: N, MultiPath: F, Path: z, RadialGradient: O, Segment: M, stack: p, Text: A, vAlign: h, vStack: f, vWrap: m, wrap: g }) }(window.kendo.jQuery), function(e) { function t(e) { var t = []; return e.replace(g, function(e, n) { t.push(parseFloat(n)) }), t } function n(e, t, n) { var i, r = t ? 0 : 1; for (i = 0; e.length > i; i += 2) e.splice(i + r, 0, n) } function i(e, t) { return e && t ? t.scaleCopy(2).translate(-e.x, -e.y) : void 0 } function r(e, t, n) { var i = 1 / 3; return t = t.clone().scale(2 / 3), { controlOut: t.clone().translateWith(e.scaleCopy(i)), controlIn: t.translateWith(n.scaleCopy(i)) } } var o = window.kendo, a = o.drawing, s = o.geometry, l = o.Class, c = s.Point, d = o.deepExtend, u = e.trim, h = o.util, p = h.last, f = /([a-df-z]{1})([^a-df-z]*)(z)?/gi, g = /[,\s]?([+\-]?(?:\d*\.\d+|\d+)(?:[eE][+\-]?\d+)?)/g, m = "m", v = "z", _ = l.extend({ parse: function(e, n) { var i, r = new a.MultiPath(n), o = new c; return e.replace(f, function(e, n, a, s) { var l = n.toLowerCase(), c = l === n, d = t(u(a)); if (l === m && (c ? (o.x += d[0], o.y += d[1]) : (o.x = d[0], o.y = d[1]), r.moveTo(o.x, o.y), d.length > 2 && (l = "l", d.splice(0, 2))), w[l]) w[l](r, { parameters: d, position: o, isRelative: c, previousCommand: i }), s && s.toLowerCase() === v && r.close(); else if (l !== m) throw Error("Error while parsing SVG path. Unsupported command: " + l); i = l }), r } }), w = { l: function(e, t) { var n, i, r = t.parameters, o = t.position; for (n = 0; r.length > n; n += 2) i = new c(r[n], r[n + 1]), t.isRelative && i.translateWith(o), e.lineTo(i.x, i.y), o.x = i.x, o.y = i.y }, c: function(e, t) { var n, i, r, o, a = t.parameters, s = t.position; for (o = 0; a.length > o; o += 6) n = new c(a[o], a[o + 1]), i = new c(a[o + 2], a[o + 3]), r = new c(a[o + 4], a[o + 5]), t.isRelative && (i.translateWith(s), n.translateWith(s), r.translateWith(s)), e.curveTo(n, i, r), s.x = r.x, s.y = r.y }, v: function(e, t) { var i = t.isRelative ? 0 : t.position.x; n(t.parameters, !0, i), this.l(e, t) }, h: function(e, t) { var i = t.isRelative ? 0 : t.position.y; n(t.parameters, !1, i), this.l(e, t) }, a: function(e, t) { var n, i, r, o, a, s, l = t.parameters, d = t.position; for (n = 0; l.length > n; n += 7) i = l[n], r = l[n + 1], o = l[n + 3], a = l[n + 4], s = new c(l[n + 5], l[n + 6]), t.isRelative && s.translateWith(d), e.arcTo(s, i, r, o, a), d.x = s.x, d.y = s.y }, s: function(e, t) { var n, r, o, a, s, l = t.parameters, d = t.position, u = t.previousCommand; for (("s" == u || "c" == u) && (a = p(p(e.paths).segments).controlIn()), s = 0; l.length > s; s += 4) o = new c(l[s], l[s + 1]), r = new c(l[s + 2], l[s + 3]), t.isRelative && (o.translateWith(d), r.translateWith(d)), n = a ? i(a, d) : d.clone(), a = o, e.curveTo(n, o, r), d.x = r.x, d.y = r.y }, q: function(e, t) { var n, i, o, a, s = t.parameters, l = t.position; for (a = 0; s.length > a; a += 4) o = new c(s[a], s[a + 1]), i = new c(s[a + 2], s[a + 3]), t.isRelative && (o.translateWith(l), i.translateWith(l)), n = r(l, o, i), e.curveTo(n.controlOut, n.controlIn, i), l.x = i.x, l.y = i.y }, t: function(e, t) { var n, o, a, s, l, d = t.parameters, u = t.position, h = t.previousCommand; for (("q" == h || "t" == h) && (s = p(p(e.paths).segments), o = s.controlIn().clone().translateWith(u.scaleCopy(-1 / 3)).scale(1.5)), l = 0; d.length > l; l += 2) a = new c(d[l], d[l + 1]), t.isRelative && a.translateWith(u), o = o ? i(o, u) : u.clone(), n = r(u, o, a), e.curveTo(n.controlOut, n.controlIn, a), u.x = a.x, u.y = a.y } }; _.current = new _, a.Path.parse = function(e, t) { return _.current.parse(e, t) }, d(a, { PathParser: _ }) }(window.kendo.jQuery), function(e) { function t(e) { var t, n, i, r; try { t = e.getScreenCTM ? e.getScreenCTM() : null } catch (o) {} t && (n = -t.e % 1, i = -t.f % 1, r = e.style, (0 !== n || 0 !== i) && (r.left = n + "px", r.top = i + "px")) } function n() { var e = document.getElementsByTagName("base")[0], t = "", n = document.location.href, i = n.indexOf("#"); return e && !d.support.browser.msie && (-1 !== i && (n = n.substring(0, i)), t = n), t } function i(e) { return "url(" + n() + "#" + e + ")" } function r(e) { var t, n, i, r = new F({ encodeText: !0 }), o = e.clippedBBox(); return o && (t = o.getOrigin(), n = new p.Group, n.transform(h.transform().translate(-t.x, -t.y)), n.children.push(e), e = n), r.load([e]), i = "<?xml version='1.0' ?><svg xmlns='" + E + "' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1'>" + r.render() + "</svg>", r.destroy(), i } function o(t, n) { var i = r(t); return n && n.raw || (i = "data:image/svg+xml;base64," + g.encodeBase64(i)), e.Deferred().resolve(i).promise() } function a(e, t) { return "clip" == e || "fill" == e && (!t || t.nodeType == C) } function s(e) { if (!e || !e.indexOf || e.indexOf("&") < 0) return e; var t = s._element; return t.innerHTML = e, t.textContent || t.innerText } var l, c = document, d = window.kendo, u = d.deepExtend, h = d.geometry, p = d.drawing, f = p.BaseNode, g = d.util, m = g.defined, v = g.isTransparent, _ = g.renderAttr, w = g.renderAllAttr, b = g.renderTemplate, y = e.inArray, k = "butt", x = p.DASH_ARRAYS, C = "gradient", S = "none", T = ".kendo", D = "solid", A = " ", E = "http://www.w3.org/2000/svg", I = "transform", P = "undefined", M = p.Surface.extend({ init: function(e, n) { p.Surface.fn.init.call(this, e, n), this._root = new F(this.options), Q(this.element[0], this._template(this)), this._rootElement = this.element[0].firstElementChild, t(this._rootElement), this._root.attachTo(this._rootElement), this.element.on("click" + T, this._click), this.element.on("mouseover" + T, this._mouseenter), this.element.on("mouseout" + T, this._mouseleave), this.resize() }, type: "svg", destroy: function() { this._root && (this._root.destroy(), this._root = null, this._rootElement = null, this.element.off(T)), p.Surface.fn.destroy.call(this) }, translate: function(e) { var t = d.format("{0} {1} {2} {3}", Math.round(e.x), Math.round(e.y), this._size.width, this._size.height); this._offset = e, this._rootElement.setAttribute("viewBox", t) }, draw: function(e) { p.Surface.fn.draw.call(this, e), this._root.load([e]) }, clear: function() { p.Surface.fn.clear.call(this), this._root.clear() }, svg: function() { return "<?xml version='1.0' ?>" + this._template(this) }, exportVisual: function() { var e, t = this._visual, n = this._offset; return n && (e = new p.Group, e.children.push(t), e.transform(h.transform().translate(-n.x, -n.y)), t = e), t }, _resize: function() { this._offset && this.translate(this._offset) }, _template: b("<svg style='width: 100%; height: 100%; overflow: hidden;' xmlns='" + E + "' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1'>#= d._root.render() #</svg>") }), z = f.extend({ init: function(e) { f.fn.init.call(this, e), this.definitions = {} }, destroy: function() { this.element && (this.element._kendoNode = null, this.element = null), this.clearDefinitions(), f.fn.destroy.call(this) }, load: function(e, t) { var n, i, r, o, a = this, s = a.element; for (o = 0; e.length > o; o++) i = e[o], r = i.children, n = new Y[i.nodeType](i), m(t) ? a.insertAt(n, t) : a.append(n), n.createDefinitions(), r && r.length > 0 && n.load(r), s && n.attachTo(s, t) }, root: function() { for (var e = this; e.parent;) e = e.parent; return e }, attachTo: function(e, t) { var n, i = c.createElement("div"); Q(i, "<svg xmlns='" + E + "' version='1.1'>" + this.render() + "</svg>"), n = i.firstChild.firstChild, n && (m(t) ? e.insertBefore(n, e.childNodes[t] || null) : e.appendChild(n), this.setElement(n)) }, setElement: function(e) { var t, n, i = this.childNodes; for (this.element && (this.element._kendoNode = null), this.element = e, this.element._kendoNode = this, n = 0; i.length > n; n++) t = e.childNodes[n], i[n].setElement(t) }, clear: function() { var e, t; for (this.clearDefinitions(), this.element && (this.element.innerHTML = ""), e = this.childNodes, t = 0; e.length > t; t++) e[t].destroy(); this.childNodes = [] }, removeSelf: function() { if (this.element) { var e = this.element.parentNode; e && e.removeChild(this.element), this.element = null } f.fn.removeSelf.call(this) }, template: b("#= d.renderChildren() #"), render: function() { return this.template(this) }, renderChildren: function() { var e, t = this.childNodes, n = ""; for (e = 0; t.length > e; e++) n += t[e].render(); return n }, optionsChange: function(e) { var t = e.field, n = e.value; "visible" === t ? this.css("display", n ? "" : S) : l[t] && a(t, n) ? this.updateDefinition(t, n) : "opacity" === t && this.attr("opacity", n), f.fn.optionsChange.call(this, e) }, attr: function(e, t) { this.element && this.element.setAttribute(e, t) }, allAttr: function(e) { for (var t = 0; e.length > t; t++) this.attr(e[t][0], e[t][1]) }, css: function(e, t) { this.element && (this.element.style[e] = t) }, allCss: function(e) { for (var t = 0; e.length > t; t++) this.css(e[t][0], e[t][1]) }, removeAttr: function(e) { this.element && this.element.removeAttribute(e) }, mapTransform: function(e) { var t = []; return e && t.push([I, "matrix(" + e.matrix().toString(6) + ")"]), t }, renderTransform: function() { return w(this.mapTransform(this.srcElement.transform())) }, transformChange: function(e) { e ? this.allAttr(this.mapTransform(e)) : this.removeAttr(I) }, mapStyle: function() { var e = this.srcElement.options, t = [ ["cursor", e.cursor] ]; return e.visible === !1 && t.push(["display", S]), t }, renderStyle: function() { return _("style", g.renderStyle(this.mapStyle())) }, renderOpacity: function() { return _("opacity", this.srcElement.options.opacity) }, createDefinitions: function() { var e, t, n, i, r = this.srcElement, o = this.definitions; if (r) { n = r.options; for (t in l) e = n.get(t), e && a(t, e) && (o[t] = e, i = !0); i && this.definitionChange({ action: "add", definitions: o }) } }, definitionChange: function(e) { this.parent && this.parent.definitionChange(e) }, updateDefinition: function(e, t) { var n = this.definitions, r = n[e], o = l[e], a = {}; r && (a[e] = r, this.definitionChange({ action: "remove", definitions: a }), delete n[e]), t ? (a[e] = t, this.definitionChange({ action: "add", definitions: a }), n[e] = t, this.attr(o, i(t.id))) : r && this.removeAttr(o) }, clearDefinitions: function() { var e, t = this.definitions; for (e in t) { this.definitionChange({ action: "remove", definitions: t }), this.definitions = {}; break } }, renderDefinitions: function() { return w(this.mapDefinitions()) }, mapDefinitions: function() { var e, t = this.definitions, n = []; for (e in t) n.push([l[e], i(t[e].id)]); return n } }), F = z.extend({ init: function(e) { z.fn.init.call(this), this.options = e, this.defs = new R }, attachTo: function(e) { this.element = e, this.defs.attachTo(e.firstElementChild) }, clear: function() { f.fn.clear.call(this) }, template: b("#=d.defs.render()##= d.renderChildren() #"), definitionChange: function(e) { this.defs.definitionChange(e) } }), R = z.extend({ init: function() { z.fn.init.call(this), this.definitionMap = {} }, attachTo: function(e) { this.element = e }, template: b("<defs>#= d.renderChildren()#</defs>"), definitionChange: function(e) { var t = e.definitions, n = e.action; "add" == n ? this.addDefinitions(t) : "remove" == n && this.removeDefinitions(t) }, createDefinition: function(e, t) { var n; return "clip" == e ? n = H : "fill" == e && (t instanceof p.LinearGradient ? n = q : t instanceof p.RadialGradient && (n = $)), new n(t) }, addDefinitions: function(e) { for (var t in e) this.addDefinition(t, e[t]) }, addDefinition: function(e, t) { var n, i = this.definitionMap, r = t.id, o = this.element, a = i[r]; a ? a.count++ : (n = this.createDefinition(e, t), i[r] = { element: n, count: 1 }, this.append(n), o && n.attachTo(this.element)) }, removeDefinitions: function(e) { for (var t in e) this.removeDefinition(e[t]) }, removeDefinition: function(e) { var t = this.definitionMap, n = e.id, i = t[n]; i && (i.count--, 0 === i.count && (this.remove(y(i.element, this.childNodes), 1), delete t[n])) } }), H = z.extend({ init: function(e) { z.fn.init.call(this), this.srcElement = e, this.id = e.id, this.load([e]) }, template: b("<clipPath id='#=d.id#'>#= d.renderChildren()#</clipPath>") }), B = z.extend({ template: b("<g#= d.renderTransform() + d.renderStyle() + d.renderOpacity() + d.renderDefinitions()#>#= d.renderChildren() #</g>"), optionsChange: function(e) { e.field == I && this.transformChange(e.value), z.fn.optionsChange.call(this, e) } }), L = z.extend({ geometryChange: function() { this.attr("d", this.renderData()), this.invalidate() }, optionsChange: function(e) { switch (e.field) { case "fill": e.value ? this.allAttr(this.mapFill(e.value)) : this.removeAttr("fill"); break; case "fill.color": this.allAttr(this.mapFill({ color: e.value })); break; case "stroke": e.value ? this.allAttr(this.mapStroke(e.value)) : this.removeAttr("stroke"); break; case I: this.transformChange(e.value); break; default: var t = this.attributeMap[e.field]; t && this.attr(t, e.value) } z.fn.optionsChange.call(this, e) }, attributeMap: { "fill.opacity": "fill-opacity", "stroke.color": "stroke", "stroke.width": "stroke-width", "stroke.opacity": "stroke-opacity" }, content: function() { this.element && (this.element.textContent = this.srcElement.content()) }, renderData: function() { return this.printPath(this.srcElement) }, printPath: function(e) { var t, n, i, r, o, a = e.segments, s = a.length; if (s > 0) { for (t = [], o = 1; s > o; o++) i = this.segmentType(a[o - 1], a[o]), i !== r && (r = i, t.push(i)), t.push("L" === i ? this.printPoints(a[o].anchor()) : this.printPoints(a[o - 1].controlOut(), a[o].controlIn(), a[o].anchor())); return n = "M" + this.printPoints(a[0].anchor()) + A + t.join(A), e.options.closed && (n += "Z"), n } }, printPoints: function() { var e, t = arguments, n = t.length, i = []; for (e = 0; n > e; e++) i.push(t[e].toString(3)); return i.join(A) }, segmentType: function(e, t) { return e.controlOut() && t.controlIn() ? "C" : "L" }, mapStroke: function(e) { var t = []; return e && !v(e.color) ? (t.push(["stroke", e.color]), t.push(["stroke-width", e.width]), t.push(["stroke-linecap", this.renderLinecap(e)]), t.push(["stroke-linejoin", e.lineJoin]), m(e.opacity) && t.push(["stroke-opacity", e.opacity]), m(e.dashType) && t.push(["stroke-dasharray", this.renderDashType(e)])) : t.push(["stroke", S]), t }, renderStroke: function() { return w(this.mapStroke(this.srcElement.options.stroke)) }, renderDashType: function(e) { var t, n, i, r = e.width || 1, o = e.dashType; if (o && o != D) { for (t = x[o.toLowerCase()], n = [], i = 0; t.length > i; i++) n.push(t[i] * r); return n.join(" ") } }, renderLinecap: function(e) { var t = e.dashType, n = e.lineCap; return t && t != D ? k : n }, mapFill: function(e) { var t = []; return e && e.nodeType == C || (e && !v(e.color) ? (t.push(["fill", e.color]), m(e.opacity) && t.push(["fill-opacity", e.opacity])) : t.push(["fill", S])), t }, renderFill: function() { return w(this.mapFill(this.srcElement.options.fill)) }, template: b("<path #= d.renderStyle() # #= d.renderOpacity() # #= kendo.util.renderAttr('d', d.renderData()) # #= d.renderStroke() # #= d.renderFill() # #= d.renderDefinitions() # #= d.renderTransform() #></path>") }), N = L.extend({ renderData: function() { return this.printPath(this.srcElement.toPath()) } }), O = L.extend({ renderData: function() { var e, t, n = this.srcElement.paths; if (n.length > 0) { for (e = [], t = 0; n.length > t; t++) e.push(this.printPath(n[t])); return e.join(" ") } } }), V = L.extend({ geometryChange: function() { var e = this.center(); this.attr("cx", e.x), this.attr("cy", e.y), this.attr("r", this.radius()), this.invalidate() }, center: function() { return this.srcElement.geometry().center }, radius: function() { return this.srcElement.geometry().radius }, template: b("<circle #= d.renderStyle() # #= d.renderOpacity() # cx='#= d.center().x #' cy='#= d.center().y #' r='#= d.radius() #' #= d.renderStroke() # #= d.renderFill() # #= d.renderDefinitions() # #= d.renderTransform() # ></circle>") }), U = L.extend({ geometryChange: function() { var e = this.pos(); this.attr("x", e.x), this.attr("y", e.y), this.invalidate() }, optionsChange: function(e) { "font" === e.field ? (this.attr("style", g.renderStyle(this.mapStyle())), this.geometryChange()) : "content" === e.field && L.fn.content.call(this, this.srcElement.content()), L.fn.optionsChange.call(this, e) }, mapStyle: function() { var e = L.fn.mapStyle.call(this), t = this.srcElement.options.font; return e.push(["font", d.htmlEncode(t)]), e }, pos: function() { var e = this.srcElement.position(), t = this.srcElement.measure(); return e.clone().setY(e.y + t.baseline) }, content: function() { var e = this.srcElement.content(), t = this.root().options; return t && t.encodeText && (e = s(e), e = d.htmlEncode(e)), e }, template: b("<text #= d.renderStyle() # #= d.renderOpacity() # x='#= this.pos().x #' y='#= this.pos().y #' #= d.renderStroke() # #= d.renderTransform() # #= d.renderDefinitions() # #= d.renderFill() #>#= d.content() #</text>") }), W = L.extend({ geometryChange: function() { this.allAttr(this.mapPosition()), this.invalidate() }, optionsChange: function(e) { "src" === e.field && this.allAttr(this.mapSource()), L.fn.optionsChange.call(this, e) }, mapPosition: function() { var e = this.srcElement.rect(), t = e.topLeft(); return [ ["x", t.x], ["y", t.y], ["width", e.width() + "px"], ["height", e.height() + "px"] ] }, renderPosition: function() { return w(this.mapPosition()) }, mapSource: function() { return [ ["xlink:href", this.srcElement.src()] ] }, renderSource: function() { return w(this.mapSource()) }, template: b("<image preserveAspectRatio='none' #= d.renderStyle() # #= d.renderTransform()# #= d.renderOpacity() # #= d.renderPosition() # #= d.renderSource() # #= d.renderDefinitions()#></image>") }), j = z.extend({ template: b("<stop #=d.renderOffset()# #=d.renderStyle()# />"), renderOffset: function() { return _("offset", this.srcElement.offset()) }, mapStyle: function() { var e = this.srcElement; return [ ["stop-color", e.color()], ["stop-opacity", e.opacity()] ] }, optionsChange: function(e) { "offset" == e.field ? this.attr(e.field, e.value) : ("color" == e.field || "opacity" == e.field) && this.css("stop-" + e.field, e.value) } }), G = z.extend({ init: function(e) { z.fn.init.call(this, e), this.id = e.id, this.loadStops() }, loadStops: function() { var e, t, n = this.srcElement, i = n.stops, r = this.element; for (t = 0; i.length > t; t++) e = new j(i[t]), this.append(e), r && e.attachTo(r) }, optionsChange: function(e) { "gradient.stops" == e.field ? (f.fn.clear.call(this), this.loadStops()) : e.field == C && this.allAttr(this.mapCoordinates()) }, renderCoordinates: function() { return w(this.mapCoordinates()) }, mapSpace: function() { return ["gradientUnits", this.srcElement.userSpace() ? "userSpaceOnUse" : "objectBoundingBox"] } }), q = G.extend({ template: b("<linearGradient id='#=d.id#' #=d.renderCoordinates()#>#= d.renderChildren()#</linearGradient>"), mapCoordinates: function() { var e = this.srcElement, t = e.start(), n = e.end(), i = [ ["x1", t.x], ["y1", t.y], ["x2", n.x], ["y2", n.y], this.mapSpace() ]; return i } }), $ = G.extend({ template: b("<radialGradient id='#=d.id#' #=d.renderCoordinates()#>#= d.renderChildren()#</radialGradient>"), mapCoordinates: function() { var e = this.srcElement, t = e.center(), n = e.radius(), i = [ ["cx", t.x], ["cy", t.y], ["r", n], this.mapSpace() ]; return i } }), Y = { Group: B, Text: U, Path: L, MultiPath: O, Circle: V, Arc: N, Image: W }, Q = function(e, t) { e.innerHTML = t }; ! function() { var e = "<svg xmlns='" + E + "'></svg>", t = c.createElement("div"), n = typeof DOMParser != P; t.innerHTML = e, n && t.firstChild.namespaceURI != E && (Q = function(e, t) { var n = new DOMParser, i = n.parseFromString(t, "text/xml"), r = c.adoptNode(i.documentElement); e.innerHTML = "", e.appendChild(r) }) }(), s._element = document.createElement("span"), l = { clip: "clip-path", fill: "fill" }, d.support.svg = function() { return c.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") }(), d.support.svg && p.SurfaceFactory.current.register("svg", M, 10), u(p, { exportSVG: o, svg: { ArcNode: N, CircleNode: V, ClipNode: H, DefinitionNode: R, GradientStopNode: j, GroupNode: B, ImageNode: W, LinearGradientNode: q, MultiPathNode: O, Node: z, PathNode: L, RadialGradientNode: $, RootNode: F, Surface: M, TextNode: U, _exportGroup: r } }) }(window.kendo.jQuery), function(e) { function t(t, n) { var i, r, o, a, s, l, c = { width: "800px", height: "600px", cors: "Anonymous" }, d = t.clippedBBox(); return d && (i = d.getOrigin(), r = new b.Group, r.transform(w.transform().translate(-i.x, -i.y)), r.children.push(t), t = r, o = d.getSize(), c.width = o.width + "px", c.height = o.height + "px"), n = p(c, n), a = e("<div />").css({ display: "none", width: n.width, height: n.height }).appendTo(document.body), s = new T(a, n), s.draw(t), l = s.image(), l.always(function() { s.destroy(), a.remove() }), l } function n(e, t) { var n, i, r; for (r = 0; t.length > r; r++) i = t[r], n = h.parseColor(i.color()), n.a *= i.opacity(), e.addColorStop(i.offset(), n.toCssRgba()) } var i, r, o, a, s, l, c, d, u = document, h = window.kendo, p = h.deepExtend, f = h.util, g = f.defined, m = f.isTransparent, v = f.renderTemplate, _ = f.valueOrDefault, w = h.geometry, b = h.drawing, y = b.BaseNode, k = "butt", x = b.DASH_ARRAYS, C = 1e3 / 60, S = "solid", T = b.Surface.extend({ init: function(t, n) { b.Surface.fn.init.call(this, t, n), this.element[0].innerHTML = this._template(this); var r = this.element[0].firstElementChild; r.width = e(t).width(), r.height = e(t).height(), this._rootElement = r, this._root = new i(r) }, destroy: function() { b.Surface.fn.destroy.call(this), this._root && (this._root.destroy(), this._root = null) }, type: "canvas", draw: function(e) { b.Surface.fn.draw.call(this, e), this._root.load([e], void 0, this.options.cors) }, clear: function() { b.Surface.fn.clear.call(this), this._root.clear() }, image: function() { var t, n = this._root, i = this._rootElement, r = []; return n.traverse(function(e) { e.loading && r.push(e.loading) }), t = e.Deferred(), e.when.apply(e, r).done(function() { n._invalidate(); try { var e = i.toDataURL(); t.resolve(e) } catch (r) { t.reject(r) } }).fail(function(e) { t.reject(e) }), t.promise() }, _resize: function() { this._rootElement.width = this._size.width, this._rootElement.height = this._size.height, this._root.invalidate() }, _template: v("<canvas style='width: 100%; height: 100%;'></canvas>") }), D = y.extend({ init: function(e) { y.fn.init.call(this, e), e && this.initClip() }, initClip: function() { var e = this.srcElement.clip(); e && (this.clip = e, e.addObserver(this)) }, clear: function() { this.srcElement && this.srcElement.removeObserver(this), this.clearClip(), y.fn.clear.call(this) }, clearClip: function() { this.clip && (this.clip.removeObserver(this), delete this.clip) }, setClip: function(e) { this.clip && (e.beginPath(), r.fn.renderPoints(e, this.clip), e.clip()) }, optionsChange: function(e) { "clip" == e.field && (this.clearClip(), this.initClip()), y.fn.optionsChange.call(this, e) }, setTransform: function(e) { if (this.srcElement) { var t = this.srcElement.transform(); t && e.transform.apply(e, t.matrix().toArray(6)) } }, load: function(e, t, n) { var i, r, o, a, s = this; for (a = 0; e.length > a; a++) r = e[a], o = r.children, i = new d[r.nodeType](r, n), o && o.length > 0 && i.load(o, t, n), g(t) ? s.insertAt(i, t) : s.append(i); s.invalidate() }, setOpacity: function(e) { if (this.srcElement) { var t = this.srcElement.opacity(); g(t) && this.globalAlpha(e, t) } }, globalAlpha: function(e, t) { t && e.globalAlpha && (t *= e.globalAlpha), e.globalAlpha = t }, visible: function() { var e = this.srcElement; return !e || e && e.options.visible !== !1 } }), A = D.extend({ renderTo: function(e) { var t, n, i; if (this.visible()) { for (e.save(), this.setTransform(e), this.setClip(e), this.setOpacity(e), t = this.childNodes, n = 0; t.length > n; n++) i = t[n], i.visible() && i.renderTo(e); e.restore() } } }); b.mixins.Traversable.extend(A.fn, "childNodes"), i = A.extend({ init: function(t) { A.fn.init.call(this), this.canvas = t, this.ctx = t.getContext("2d"), this.invalidate = h.throttle(e.proxy(this._invalidate, this), C) }, destroy: function() { A.fn.destroy.call(this), this.canvas = null, this.ctx = null }, _invalidate: function() { this.ctx && (this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.renderTo(this.ctx)) } }), b.mixins.Traversable.extend(i.fn, "childNodes"), r = D.extend({ renderTo: function(e) { e.save(), this.setTransform(e), this.setClip(e), this.setOpacity(e), e.beginPath(), this.renderPoints(e, this.srcElement), this.setLineDash(e), this.setLineCap(e), this.setLineJoin(e), this.setFill(e), this.setStroke(e), e.restore() }, setFill: function(e) { var t = this.srcElement.options.fill, n = !1; return t && ("gradient" == t.nodeType ? (this.setGradientFill(e, t), n = !0) : m(t.color) || (e.fillStyle = t.color, e.save(), this.globalAlpha(e, t.opacity), e.fill(), e.restore(), n = !0)), n }, setGradientFill: function(e, t) { var i, r, o, a, s = this.srcElement.rawBBox(); t instanceof b.LinearGradient ? (r = t.start(), o = t.end(), i = e.createLinearGradient(r.x, r.y, o.x, o.y)) : t instanceof b.RadialGradient && (a = t.center(), i = e.createRadialGradient(a.x, a.y, 0, a.x, a.y, t.radius())), n(i, t.stops), e.save(), t.userSpace() || e.transform(s.width(), 0, 0, s.height(), s.origin.x, s.origin.y), e.fillStyle = i, e.fill(), e.restore() }, setStroke: function(e) { var t = this.srcElement.options.stroke; return t && !m(t.color) && t.width > 0 ? (e.strokeStyle = t.color, e.lineWidth = _(t.width, 1), e.save(), this.globalAlpha(e, t.opacity), e.stroke(), e.restore(), !0) : void 0 }, dashType: function() { var e = this.srcElement.options.stroke; return e && e.dashType ? e.dashType.toLowerCase() : void 0 }, setLineDash: function(e) { var t, n = this.dashType(); n && n != S && (t = x[n], e.setLineDash ? e.setLineDash(t) : (e.mozDash = t, e.webkitLineDash = t)) }, setLineCap: function(e) { var t = this.dashType(), n = this.srcElement.options.stroke; t && t !== S ? e.lineCap = k : n && n.lineCap && (e.lineCap = n.lineCap) }, setLineJoin: function(e) { var t = this.srcElement.options.stroke; t && t.lineJoin && (e.lineJoin = t.lineJoin) }, renderPoints: function(e, t) { var n, i, r, o, a, s, l = t.segments; if (0 !== l.length) { for (n = l[0], i = n.anchor(), e.moveTo(i.x, i.y), r = 1; l.length > r; r++) n = l[r], i = n.anchor(), o = l[r - 1], a = o.controlOut(), s = n.controlIn(), a && s ? e.bezierCurveTo(a.x, a.y, s.x, s.y, i.x, i.y) : e.lineTo(i.x, i.y); t.options.closed && e.closePath() } } }), o = r.extend({ renderPoints: function(e) { var t, n = this.srcElement.paths; for (t = 0; n.length > t; t++) r.fn.renderPoints(e, n[t]) } }), a = r.extend({ renderPoints: function(e) { var t = this.srcElement.geometry(), n = t.center, i = t.radius; e.arc(n.x, n.y, i, 0, 2 * Math.PI) } }), s = r.extend({ renderPoints: function(e) { var t = this.srcElement.toPath(); r.fn.renderPoints.call(this, e, t) } }), l = r.extend({ renderTo: function(e) { var t = this.srcElement, n = t.position(), i = t.measure(); e.save(), this.setTransform(e), this.setClip(e), this.setOpacity(e), e.beginPath(), e.font = t.options.font, this.setFill(e) && e.fillText(t.content(), n.x, n.y + i.baseline), this.setStroke(e) && (this.setLineDash(e), e.strokeText(t.content(), n.x, n.y + i.baseline)), e.restore() } }), c = r.extend({ init: function(t, n) { var i, o; r.fn.init.call(this, t), this.onLoad = e.proxy(this.onLoad, this), this.onError = e.proxy(this.onError, this), this.loading = e.Deferred(), i = this.img = new Image, n && !/^data:/i.test(t.src()) && (i.crossOrigin = n), o = i.src = t.src(), i.complete ? this.onLoad() : (i.onload = this.onLoad, i.onerror = this.onError) }, renderTo: function(e) { "resolved" === this.loading.state() && (e.save(), this.setTransform(e), this.setClip(e), this.drawImage(e), e.restore()) }, optionsChange: function(t) { "src" === t.field ? (this.loading = e.Deferred(), this.img.src = this.srcElement.src()) : r.fn.optionsChange.call(this, t) }, onLoad: function() { this.loading.resolve(), this.invalidate() }, onError: function() { this.loading.reject(Error("Unable to load image '" + this.img.src + "'. Check for connectivity and verify CORS headers.")) }, drawImage: function(e) { var t = this.srcElement.rect(), n = t.topLeft(); e.drawImage(this.img, n.x, n.y, t.width(), t.height()) } }), d = { Group: A, Text: l, Path: r, MultiPath: o, Circle: a, Arc: s, Image: c }, h.support.canvas = function() { return !!u.createElement("canvas").getContext }(), h.support.canvas && b.SurfaceFactory.current.register("canvas", T, 20), p(h.drawing, { exportImage: t, canvas: { ArcNode: s, CircleNode: a, GroupNode: A, ImageNode: c, MultiPathNode: o, Node: D, PathNode: r, RootNode: i, Surface: T, TextNode: l } }) }(window.kendo.jQuery), function(e) { function t() { if (u.namespaces && !u.namespaces.kvml) { u.namespaces.add("kvml", "urn:schemas-microsoft-com:vml"); var e = u.styleSheets.length > 30 ? u.styleSheets[0] : u.createStyleSheet(); e.addRule(".kvml", "behavior:url(#default#VML)") } } function n(e) { var t = u.createElement("kvml:" + e); return t.className = "kvml", t } function i(e) { var t, n = e.length, i = []; for (t = 0; n > t; t++) i.push(e[t].scaleCopy(M).toString(0, ",")); return i.join(" ") } function r(e, t) { var n, r, a, s, l, c = e.segments, d = c.length; if (d > 0) { for (n = [], l = 1; d > l; l++) a = o(c[l - 1], c[l]), a !== s && (s = a, n.push(a)), n.push("l" === a ? i([c[l].anchor()]) : i([c[l - 1].controlOut(), c[l].controlIn(), c[l].anchor()])); return r = "m " + i([c[0].anchor()]) + " " + n.join(" "), e.options.closed && (r += " x"), t !== !0 && (r += " e"), r } } function o(e, t) { return e.controlOut() && t.controlIn() ? "c" : "l" } function a(e) { return 0 === e.indexOf("fill") || 0 === e.indexOf(F) } function s(e, t, n) { var i, r = n * E(t.opacity(), 1); return i = e ? l(e, t.color(), r) : l(t.color(), "#fff", 1 - r) } function l(e, t, n) { var i = new x(e), r = new x(t), o = c(i.r, r.r, n), a = c(i.g, r.g, n), s = c(i.b, r.b, n); return new x(o, a, s).toHex() } function c(e, t, n) { return h.round(n * t + (1 - n) * e) } var d, u = document, h = Math, p = h.atan2, f = h.ceil, g = h.sqrt, m = window.kendo, v = m.deepExtend, _ = e.noop, w = m.drawing, b = w.BaseNode, y = m.geometry, k = y.toMatrix, x = m.Color, C = m.util, S = C.isTransparent, T = C.defined, D = C.deg, A = C.round, E = C.valueOrDefault, I = "none", P = ".kendo", M = 100, z = M * M, F = "gradient", R = 4, H = w.Surface.extend({ init: function(e, n) { w.Surface.fn.init.call(this, e, n), t(), this.element.empty(), this._root = new L, this._root.attachTo(this.element[0]), this.element.on("click" + P, this._click), this.element.on("mouseover" + P, this._mouseenter), this.element.on("mouseout" + P, this._mouseleave) }, type: "vml", destroy: function() { this._root && (this._root.destroy(), this._root = null, this.element.off(P)), w.Surface.fn.destroy.call(this) }, draw: function(e) { w.Surface.fn.draw.call(this, e), this._root.load([e], void 0, null) }, clear: function() { w.Surface.fn.clear.call(this), this._root.clear() } }), B = b.extend({ init: function(e) { b.fn.init.call(this, e), this.createElement(), this.attachReference() }, observe: _, destroy: function() { this.element && (this.element._kendoNode = null, this.element = null), b.fn.destroy.call(this) }, clear: function() { var e, t; for (this.element && (this.element.innerHTML = ""), e = this.childNodes, t = 0; e.length > t; t++) e[t].destroy(); this.childNodes = [] }, removeSelf: function() { this.element && (this.element.parentNode.removeChild(this.element), this.element = null), b.fn.removeSelf.call(this) }, createElement: function() { this.element = u.createElement("div") }, attachReference: function() { this.element._kendoNode = this }, load: function(e, t, n, i) { var r, o, a, s, l, c; for (i = E(i, 1), this.srcElement && (i *= E(this.srcElement.options.opacity, 1)), r = 0; e.length > r; r++) o = e[r], a = o.children, s = o.currentTransform(n), l = i * E(o.options.opacity, 1), c = new at[o.nodeType](o, s, l), a && a.length > 0 && c.load(a, t, s, i), T(t) ? this.insertAt(c, t) : this.append(c), c.attachTo(this.element, t) }, attachTo: function(e, t) { T(t) ? e.insertBefore(this.element, e.children[t] || null) : e.appendChild(this.element) }, optionsChange: function(e) { "visible" == e.field && this.css("display", e.value !== !1 ? "" : I) }, setStyle: function() { this.allCss(this.mapStyle()) }, mapStyle: function() { var e = []; return this.srcElement && this.srcElement.options.visible === !1 && e.push(["display", I]), e }, mapOpacityTo: function(e, t) { var n = E(this.opacity, 1); n *= E(t, 1), e.push(["opacity", n]) }, attr: function(e, t) { this.element && (this.element[e] = t) }, allAttr: function(e) { for (var t = 0; e.length > t; t++) this.attr(e[t][0], e[t][1]) }, css: function(e, t) { this.element && (this.element.style[e] = t) }, allCss: function(e) { for (var t = 0; e.length > t; t++) this.css(e[t][0], e[t][1]) } }), L = B.extend({ createElement: function() { B.fn.createElement.call(this), this.allCss([ ["width", "100%"], ["height", "100%"], ["position", "relative"], ["visibility", "visible"] ]) }, attachReference: _ }), N = m.Class.extend({ init: function(e, t) { this.srcElement = e, this.observer = t, e.addObserver(this) }, geometryChange: function() { this.observer.optionsChange({ field: "clip", value: this.srcElement }) }, clear: function() { this.srcElement.removeObserver(this) } }), O = B.extend({ init: function(e) { B.fn.init.call(this, e), e && this.initClip() }, observe: function() { b.fn.observe.call(this) }, mapStyle: function() { var e = B.fn.mapStyle.call(this); return this.srcElement && this.srcElement.clip() && e.push(["clip", this.clipRect()]), e }, optionsChange: function(e) { "clip" == e.field && (this.clearClip(), this.initClip(), this.setClip()), B.fn.optionsChange.call(this, e) }, clear: function() { this.clearClip(), B.fn.clear.call(this) }, initClip: function() { this.srcElement.clip() && (this.clip = new N(this.srcElement.clip(), this), this.clip.observer = this) }, clearClip: function() { this.clip && (this.clip.clear(), this.clip = null, this.css("clip", this.clipRect())) }, setClip: function() { this.clip && this.css("clip", this.clipRect()) }, clipRect: function() { var e, t, n, i = d, r = this.srcElement.clip(); return r && (e = this.clipBBox(r), t = e.topLeft(), n = e.bottomRight(), i = m.format("rect({0}px {1}px {2}px {3}px)", t.y, n.x, n.y, t.x)), i }, clipBBox: function(e) { var t = this.srcElement.rawBBox().topLeft(), n = e.rawBBox(); return n.origin.translate(-t.x, -t.y), n } }), V = O.extend({ createElement: function() { B.fn.createElement.call(this), this.setStyle() }, attachTo: function(e, t) { this.css("display", I), B.fn.attachTo.call(this, e, t), this.srcElement.options.visible !== !1 && this.css("display", "") }, _attachTo: function(e) { var t = document.createDocumentFragment(); t.appendChild(this.element), e.appendChild(t) }, mapStyle: function() { var e = O.fn.mapStyle.call(this); return e.push(["position", "absolute"]), e.push(["white-space", "nowrap"]), e }, optionsChange: function(e) { "transform" === e.field && this.refreshTransform(), "opacity" === e.field && this.refreshOpacity(), O.fn.optionsChange.call(this, e) }, refreshTransform: function(e) { var t, n = this.srcElement.currentTransform(e), i = this.childNodes, r = i.length; for (this.setClip(), t = 0; r > t; t++) i[t].refreshTransform(n) }, currentOpacity: function() { var e = E(this.srcElement.options.opacity, 1); return this.parent && this.parent.currentOpacity && (e *= this.parent.currentOpacity()), e }, refreshOpacity: function() { var e, t = this.childNodes, n = t.length, i = this.currentOpacity(); for (e = 0; n > e; e++) t[e].refreshOpacity(i) }, initClip: function() { if (O.fn.initClip.call(this), this.clip) { var e = this.clip.srcElement.bbox(this.srcElement.currentTransform()); e && (this.css("width", e.width() + e.origin.x), this.css("height", e.height() + e.origin.y)) } }, clipBBox: function(e) { return e.bbox(this.srcElement.currentTransform()) }, clearClip: function() { O.fn.clearClip.call(this) } }), U = B.extend({ init: function(e, t) { this.opacity = t, B.fn.init.call(this, e) }, createElement: function() { this.element = n("stroke"), this.setOpacity() }, optionsChange: function(e) { 0 === e.field.indexOf("stroke") && this.setStroke() }, refreshOpacity: function(e) { this.opacity = e, this.setStroke() }, setStroke: function() { this.allAttr(this.mapStroke()) }, setOpacity: function() { this.setStroke() }, mapStroke: function() { var e, t = this.srcElement.options.stroke, n = []; return t && !S(t.color) && 0 !== t.width ? (n.push(["on", "true"]), n.push(["color", t.color]), n.push(["weight", (t.width || 1) + "px"]), this.mapOpacityTo(n, t.opacity), T(t.dashType) && n.push(["dashstyle", t.dashType]), T(t.lineJoin) && n.push(["joinstyle", t.lineJoin]), T(t.lineCap) && (e = t.lineCap.toLowerCase(), "butt" === e && (e = "butt" === e ? "flat" : e), n.push(["endcap", e]))) : n.push(["on", "false"]), n } }), W = B.extend({ init: function(e, t, n) { this.opacity = n, B.fn.init.call(this, e) }, createElement: function() { this.element = n("fill"), this.setFill() }, optionsChange: function(e) { a(e.field) && this.setFill() }, refreshOpacity: function(e) { this.opacity = e, this.setOpacity() }, setFill: function() { this.allAttr(this.mapFill()) }, setOpacity: function() { this.setFill() }, attr: function(e, t) { var n, i = this.element; if (i) { for (n = e.split("."); n.length > 1;) i = i[n.shift()]; i[n[0]] = t } }, mapFill: function() { var e = this.srcElement.fill(), t = [ ["on", "false"] ]; return e && (e.nodeType == F ? t = this.mapGradient(e) : S(e.color) || (t = this.mapFillColor(e))), t }, mapFillColor: function(e) { var t = [ ["on", "true"], ["color", e.color] ]; return this.mapOpacityTo(t, e.opacity), t }, mapGradient: function(e) { var t, n = this.srcElement.options, i = n.fallbackFill || e.fallbackFill && e.fallbackFill(); return t = e instanceof w.LinearGradient ? this.mapLinearGradient(e) : e instanceof w.RadialGradient && e.supportVML ? this.mapRadialGradient(e) : i ? this.mapFillColor(i) : [ ["on", "false"] ] }, mapLinearGradient: function(e) { var t = e.start(), n = e.end(), i = C.deg(p(n.y - t.y, n.x - t.x)), r = [ ["on", "true"], ["type", F], ["focus", 0], ["method", "none"], ["angle", 270 - i] ]; return this.addColors(r), r }, mapRadialGradient: function(e) { var t = this.srcElement.rawBBox(), n = e.center(), i = (n.x - t.origin.x) / t.width(), r = (n.y - t.origin.y) / t.height(), o = [ ["on", "true"], ["type", "gradienttitle"], ["focus", "100%"], ["focusposition", i + " " + r], ["method", "none"] ]; return this.addColors(o), o }, addColors: function(e) { var t, n, i = this.srcElement.options, r = E(this.opacity, 1), o = [], a = i.fill.stops, l = i.baseColor, c = this.element.colors ? "colors.value" : "colors", d = s(l, a[0], r), u = s(l, a[a.length - 1], r); for (n = 0; a.length > n; n++) t = a[n], o.push(h.round(100 * t.offset()) + "% " + s(l, t, r)); e.push([c, o.join(",")], ["color", d], ["color2", u]) } }), j = B.extend({ init: function(e, t) { this.transform = t, B.fn.init.call(this, e) }, createElement: function() { this.element = n("skew"), this.setTransform() }, optionsChange: function(e) { "transform" === e.field && this.refresh(this.srcElement.currentTransform()) }, refresh: function(e) { this.transform = e, this.setTransform() }, transformOrigin: function() { return "-0.5,-0.5" }, setTransform: function() { this.allAttr(this.mapTransform()) }, mapTransform: function() { var e = this.transform, t = [], n = k(e); return n ? (n.round(R), t.push(["on", "true"], ["matrix", [n.a, n.c, n.b, n.d, 0, 0].join(",")], ["offset", n.e + "px," + n.f + "px"], ["origin", this.transformOrigin()])) : t.push(["on", "false"]), t } }), G = O.extend({ init: function(e, t, n) { this.fill = this.createFillNode(e, t, n), this.stroke = new U(e, n), this.transform = this.createTransformNode(e, t), O.fn.init.call(this, e) }, attachTo: function(e, t) { this.fill.attachTo(this.element), this.stroke.attachTo(this.element), this.transform.attachTo(this.element), B.fn.attachTo.call(this, e, t) }, createFillNode: function(e, t, n) { return new W(e, t, n) }, createTransformNode: function(e, t) { return new j(e, t) }, createElement: function() { this.element = n("shape"), this.setCoordsize(), this.setStyle() }, optionsChange: function(e) { a(e.field) ? this.fill.optionsChange(e) : 0 === e.field.indexOf("stroke") ? this.stroke.optionsChange(e) : "transform" === e.field ? this.transform.optionsChange(e) : "opacity" === e.field && (this.fill.setOpacity(), this.stroke.setOpacity()), O.fn.optionsChange.call(this, e) }, refreshTransform: function(e) { this.transform.refresh(this.srcElement.currentTransform(e)) }, refreshOpacity: function(e) { e *= E(this.srcElement.options.opacity, 1), this.fill.refreshOpacity(e), this.stroke.refreshOpacity(e) }, mapStyle: function(e, t) { var n, i = O.fn.mapStyle.call(this); return e && t || (e = t = M), i.push(["position", "absolute"], ["width", e + "px"], ["height", t + "px"]), n = this.srcElement.options.cursor, n && i.push(["cursor", n]), i }, setCoordsize: function() { this.allAttr([ ["coordorigin", "0 0"], ["coordsize", z + " " + z] ]) } }), q = B.extend({ createElement: function() { this.element = n("path"), this.setPathData() }, geometryChange: function() { this.setPathData() }, setPathData: function() { this.attr("v", this.renderData()) }, renderData: function() { return r(this.srcElement) } }), $ = G.extend({ init: function(e, t, n) { this.pathData = this.createDataNode(e), G.fn.init.call(this, e, t, n) }, attachTo: function(e, t) { this.pathData.attachTo(this.element), G.fn.attachTo.call(this, e, t) }, createDataNode: function(e) { return new q(e) }, geometryChange: function() { this.pathData.geometryChange(), G.fn.geometryChange.call(this) } }), Y = q.extend({ renderData: function() { var e, t, n, i = this.srcElement.paths; if (i.length > 0) { for (e = [], t = 0; i.length > t; t++) n = i.length - 1 > t, e.push(r(i[t], n)); return e.join(" ") } } }), Q = $.extend({ createDataNode: function(e) { return new Y(e) } }), K = j.extend({ transformOrigin: function() { var e = this.srcElement.geometry().bbox(), t = e.center(), n = -f(t.x) / f(e.width()), i = -f(t.y) / f(e.height()); return n + "," + i } }), X = G.extend({ createElement: function() { this.element = n("oval"), this.setStyle() }, createTransformNode: function(e, t) { return new K(e, t) }, geometryChange: function() { G.fn.geometryChange.call(this), this.setStyle(), this.refreshTransform() }, mapStyle: function() { var e = this.srcElement.geometry(), t = e.radius, n = e.center, i = f(2 * t), r = G.fn.mapStyle.call(this, i, i); return r.push(["left", f(n.x - t) + "px"], ["top", f(n.y - t) + "px"]), r } }), Z = q.extend({ renderData: function() { return r(this.srcElement.toPath()) } }), J = $.extend({ createDataNode: function(e) { return new Z(e) } }), et = q.extend({ createElement: function() { q.fn.createElement.call(this), this.attr("textpathok", !0) }, renderData: function() { var e = this.srcElement.rect(), t = e.center(); return "m " + i([new y.Point(e.topLeft().x, t.y)]) + " l " + i([new y.Point(e.bottomRight().x, t.y)]) } }), tt = B.extend({ createElement: function() { this.element = n("textpath"), this.attr("on", !0), this.attr("fitpath", !1), this.setStyle(), this.setString() }, optionsChange: function(e) { "content" === e.field ? this.setString() : this.setStyle(), B.fn.optionsChange.call(this, e) }, mapStyle: function() { return [ ["font", this.srcElement.options.font] ] }, setString: function() { this.attr("string", this.srcElement.content()) } }), nt = $.extend({ init: function(e, t, n) { this.path = new tt(e), $.fn.init.call(this, e, t, n) }, createDataNode: function(e) { return new et(e) }, attachTo: function(e, t) { this.path.attachTo(this.element), $.fn.attachTo.call(this, e, t) }, optionsChange: function(e) { ("font" === e.field || "content" === e.field) && (this.path.optionsChange(e), this.pathData.geometryChange(e)), $.fn.optionsChange.call(this, e) } }), it = q.extend({ renderData: function() { var e = this.srcElement.rect(), t = (new w.Path).moveTo(e.topLeft()).lineTo(e.topRight()).lineTo(e.bottomRight()).lineTo(e.bottomLeft()).close(); return r(t) } }), rt = j.extend({ init: function(e, t, n) { this.opacity = n, j.fn.init.call(this, e, t) }, createElement: function() { this.element = n("fill"), this.attr("type", "frame"), this.attr("rotate", !0), this.setOpacity(), this.setSrc(), this.setTransform() }, optionsChange: function(e) { "src" === e.field && this.setSrc(), j.fn.optionsChange.call(this, e) }, geometryChange: function() { this.refresh() }, refreshOpacity: function(e) { this.opacity = e, this.setOpacity() }, setOpacity: function() { var e = []; this.mapOpacityTo(e, this.srcElement.options.opacity), this.allAttr(e) }, setSrc: function() { this.attr("src", this.srcElement.src()) }, mapTransform: function() { var e, t, n, i, r, o, a, s, l = this.srcElement, c = l.rawBBox(), d = c.center(), u = M / 2, h = M, f = c.width() / h, m = c.height() / h, v = 0, _ = this.transform; return _ ? (n = k(_), i = g(n.a * n.a + n.b * n.b), r = g(n.c * n.c + n.d * n.d), f *= i, m *= r, o = D(p(n.b, n.d)), a = D(p(-n.c, n.a)), v = (o + a) / 2, 0 !== v ? (s = l.bbox().center(), e = (s.x - u) / h, t = (s.y - u) / h) : (e = (d.x * i + n.e - u) / h, t = (d.y * r + n.f - u) / h)) : (e = (d.x - u) / h, t = (d.y - u) / h), f = A(f, R), m = A(m, R), e = A(e, R), t = A(t, R), v = A(v, R), [ ["size", f + "," + m], ["position", e + "," + t], ["angle", v] ] } }), ot = $.extend({ createFillNode: function(e, t, n) { return new rt(e, t, n) }, createDataNode: function(e) { return new it(e) }, optionsChange: function(e) { ("src" === e.field || "transform" === e.field) && this.fill.optionsChange(e), $.fn.optionsChange.call(this, e) }, geometryChange: function() { this.fill.geometryChange(), $.fn.geometryChange.call(this) }, refreshTransform: function(e) { $.fn.refreshTransform.call(this, e), this.fill.refresh(this.srcElement.currentTransform(e)) } }), at = { Group: V, Text: nt, Path: $, MultiPath: Q, Circle: X, Arc: J, Image: ot }; m.support.vml = function() { var e = m.support.browser; return e.msie && 9 > e.version }(), d = "inherit", m.support.browser.msie && 8 > m.support.browser.version && (d = "rect(auto auto auto auto)"), m.support.vml && w.SurfaceFactory.current.register("vml", H, 30), v(w, { vml: { ArcDataNode: Z, ArcNode: J, CircleTransformNode: K, CircleNode: X, FillNode: W, GroupNode: V, ImageNode: ot, ImageFillNode: rt, ImagePathDataNode: it, MultiPathDataNode: Y, MultiPathNode: Q, Node: B, PathDataNode: q, PathNode: $, RootNode: L, StrokeNode: U, Surface: H, TextNode: nt, TextPathNode: tt, TextPathDataNode: et, TransformNode: j } }) }(window.kendo.jQuery), function(e, t, n) { "use strict"; function i(n, i) { function o(t) { var n = new st.Group, i = t.getBoundingClientRect(); return M(n, [1, 0, 0, 1, -i.left, -i.top]), pt._clipbox = !1, pt._matrix = lt.Matrix.unit(), pt._stackingContext = { element: t, group: n }, e(t).addClass("k-pdf-export"), tt(t, n), e(t).removeClass("k-pdf-export"), n } function a(t) { return null != t ? ("string" == typeof t && (t = kendo.template(t.replace(/^\s+|\s+$/g, ""))), "function" == typeof t ? function(n) { var i = t(n); return i ? e(i)[0] : void 0 } : function() { return e(t).clone()[0] }) : void 0 } function s(n, i, r, o, s, l, c) { function d() { function e() { setTimeout(function() { n({ pages: k, container: C }) }, 10) } var t, i; ("-" != r || s) && u(x), t = g(), x.parentNode.insertBefore(t, x), t.appendChild(x), _ ? (i = k.length, k.forEach(function(t, n) { var r = _({ element: t, pageNum: n + 1, totalPages: k.length }); r && (t.appendChild(r), h(r, function() { 0 === --i && e() })) })) : e() } function u(n) { var i, o, a, l, c = b(n), d = t(y(c, "padding-bottom")), h = t(y(c, "border-bottom-width")), p = S; for (S += d + h, i = !0, o = n.firstChild; o; o = o.nextSibling) if (1 == o.nodeType) { if (i = !1, a = e(o), a.is(r)) { f(o); continue } if (!s) { u(o); continue } if (!/^(?:static|relative)$/.test(y(b(o), "position"))) continue; l = m(o), 1 == l ? f(o) : l && (a.data("kendoChart") || /^(?:img|tr|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(o.tagName)) ? f(o) : u(o) } else 3 == o.nodeType && s && (v(o, i), i = !1); S = p } function p(e) { var t = e.parentNode, n = t.firstChild; if (e === n) return !0; if (e === t.children[0]) { if (7 == n.nodeType || 8 == n.nodeType) return !0; if (3 == n.nodeType) return !/\S/.test(n.data) } return !1 } function f(e) { var t, n; return 1 == e.nodeType && e !== x && p(e) ? f(e.parentNode) : (t = g(), n = w.createRange(), n.setStartBefore(x), n.setEndBefore(e), t.appendChild(n.extractContents()), void x.parentNode.insertBefore(t, x)) } function g() { var t = w.createElement("KENDO-PDF-PAGE"); return e(t).css({ display: "block", boxSizing: "content-box", width: o || "auto", padding: l.top + "px " + l.right + "px " + l.bottom + "px " + l.left + "px", position: "relative", height: s || "auto", overflow: s || o ? "hidden" : "visible", clear: "both" }), c && c.pageClassName && (t.className = c.pageClassName), k.push(t), t } function m(e) { var t, n, i = e.getBoundingClientRect(); return 0 === i.width || 0 === i.height ? 0 : (t = x.getBoundingClientRect().top, n = s - S, i.height > n ? 3 : i.top - t > n ? 1 : i.bottom - t > n ? 2 : 0) } function v(e, t) { var n, i, r, o, a; /\S/.test(e.data) && (n = e.data.length, i = w.createRange(), i.selectNodeContents(e), r = m(i), r && (o = e, 1 == r ? f(t ? e.parentNode : e) : (! function s(t, n, r) { return i.setEnd(e, n), t == n || n == r ? n : m(i) ? s(t, t + n >> 1, n) : s(n, n + r >> 1, r) }(0, n >> 1, n), !/\S/.test("" + i) && t ? f(e.parentNode) : (o = e.splitText(i.endOffset), a = g(), i.setStartBefore(x), a.appendChild(i.extractContents()), x.parentNode.insertBefore(a, x))), v(o))) } var _ = a(c.template), w = i.ownerDocument, k = [], x = e(i).clone(!0, !0)[0], C = w.createElement("KENDO-PDF-DOCUMENT"), S = 0; e(x).find("tfoot").each(function() { this.parentNode.appendChild(this) }), e(x).find("ol").each(function() { e(this).children().each(function(e) { this.setAttribute("kendo-split-index", e) }) }), e(C).css({ display: "block", position: "absolute", boxSizing: "content-box", left: "-10000px", top: "-10000px" }), o && (e(C).css({ width: o, paddingLeft: l.left, paddingRight: l.right }), e(x).css({ overflow: "hidden" })), C.appendChild(x), i.parentNode.insertBefore(C, i), c.beforePageBreak ? setTimeout(function() { c.beforePageBreak(C, d) }, 15) : setTimeout(d, 15) } i || (i = {}); var l = e.Deferred(); if (n = e(n)[0], !n) return l.reject("No element to export"); if ("function" != typeof window.getComputedStyle) throw Error("window.getComputedStyle is missing. You are using an unsupported browser, or running in IE8 compatibility mode. Drawing HTML is supported in Chrome, Firefox, Safari and IE9+."); return kendo.pdf && kendo.pdf.defineFont(r(n.ownerDocument)), h(n, function() { var e, t = i && i.forcePageBreak, r = i && i.paperSize && "auto" != i.paperSize, a = r && kendo.pdf.getPaperOptions(function(e, t) { return e in i ? i[e] : t }), c = r && a.paperSize[0], d = r && a.paperSize[1], u = i.margin && a.margin; t || d ? (u || (u = { left: 0, top: 0, right: 0, bottom: 0 }), e = new st.Group({ pdf: { multiPage: !0, paperSize: r ? a.paperSize : "auto" } }), s(function(t) { if (i.progress) { var n = !1, r = 0; ! function a() { t.pages.length > r ? (e.append(o(t.pages[r])), i.progress({ pageNum: ++r, totalPages: t.pages.length, cancel: function() { n = !0 } }), n ? t.container.parentNode.removeChild(t.container) : setTimeout(a)) : (t.container.parentNode.removeChild(t.container), l.resolve(e)) }() } else t.pages.forEach(function(t) { e.append(o(t)) }), t.container.parentNode.removeChild(t.container), l.resolve(e) }, n, t, c ? c - u.left - u.right : null, d ? d - u.top - u.bottom : null, u, i)) : l.resolve(o(n)) }), l.promise() } function r(e) { function t(e) { if (e) { var t = null; try { t = e.cssRules } catch (n) {} t && i(e, t) } } function n(e) { var t, n = y(e.style, "src"); return n ? ot(n).reduce(function(e, t) { var n = at(t); return n && e.push(n), e }, []) : (t = at(e.cssText), t ? [t] : []) } function i(e, i) { var o, a, s, l, c, d, u; for (o = 0; i.length > o; ++o) switch (a = i[o], a.type) { case 3: t(a.styleSheet); break; case 5: s = a.style, l = ot(y(s, "font-family")), c = /^(400|bold)$/i.test(y(s, "font-weight")), d = "italic" == y(s, "font-style"), u = n(a), u.length > 0 && r(e, l, c, d, u[0]) } } function r(e, t, n, i, r) { /^data:/i.test(r) || /^[^\/:]+:\/\//.test(r) || /^\//.test(r) || (r = (e.href + "").replace(/[^\/]*$/, "") + r), t.forEach(function(e) { e = e.replace(/^(['"]?)(.*?)\1$/, "$2"), n && (e += "|bold"), i && (e += "|italic"), o[e] = r }) } var o, a; for (null == e && (e = document), o = {}, a = 0; e.styleSheets.length > a; ++a) t(e.styleSheets[a]); return o } function o(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } function a(e) { return e = "_counter_" + e, pt[e] } function s(e) { var t = [], n = pt; for (e = "_counter_" + e; n;) o(n, e) && t.push(n[e]), n = Object.getPrototypeOf(n); return t.reverse() } function l(e, t) { var n = pt; for (e = "_counter_" + e; n && !o(n, e);) n = Object.getPrototypeOf(n); n || (n = pt._root), n[e] = (n[e] || 0) + (null == t ? 1 : t) } function c(e, t) { e = "_counter_" + e, pt[e] = null == t ? 0 : t } function d(e, n, i) { var r, o, a; for (r = 0; e.length > r;) o = e[r++], a = t(e[r]), isNaN(a) ? n(o, i) : (n(o, a), ++r) } function u(e, t) { var n = kendo.parseColor(e); return n && (n = n.toRGB(), t ? n = n.toCssRgba() : 0 === n.a && (n = null)), n } function h(e, t) { function n(e) { ht[e] || (ht[e] = !0, o.push(e)) } function i() { --r <= 0 && t() } var r, o = []; ! function a(e) { /^img$/i.test(e.tagName) && n(e.src), rt(y(b(e), "background-image")).forEach(function(e) { "url" == e.type && n(e.url) }), e.children && ct.call(e.children).forEach(a) }(e), r = o.length, 0 === r && i(), o.forEach(function(e) { var t = ht[e] = new Image; /^data:/i.test(e) || (t.crossOrigin = "Anonymous"), t.src = e, t.complete ? i() : (t.onload = i, t.onerror = function() { ht[e] = null, i() }) }) } function p(e) { for (var t = { 1: "i", 10: "x", 100: "c", 2: "ii", 20: "xx", 200: "cc", 3: "iii", 30: "xxx", 300: "ccc", 4: "iv", 40: "xl", 400: "cd", 5: "v", 50: "l", 500: "d", 6: "vi", 60: "lx", 600: "dc", 7: "vii", 70: "lxx", 700: "dcc", 8: "viii", 80: "lxxx", 800: "dccc", 9: "ix", 90: "xc", 900: "cm", 1e3: "m" }, n = [1e3, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1], i = ""; e > 0;) n[0] > e ? n.shift() : (i += t[n[0]], e -= n[0]); return i } function f(e) { var t, i = ""; do t = e % 26, i = String.fromCharCode(97 + t) + i, e = n.floor(e / 26); while (e > 0); return i } function g(e, t, n) { var i, r; pt = Object.create(pt), pt[e.tagName.toLowerCase()] = { element: e, style: t }, i = y(t, "text-decoration"), i && "none" != i && (r = y(t, "color"), i.split(/\s+/g).forEach(function(e) { pt[e] || (pt[e] = r) })), w(t) && (pt._stackingContext = { element: e, group: n }) } function m() { pt = Object.getPrototypeOf(pt) } function v(e) { if (null != pt._clipbox) { var t = e.bbox(pt._matrix); pt._clipbox = pt._clipbox ? lt.Rect.intersect(pt._clipbox, t) : t } } function _() { var e = pt._clipbox; return null == e ? !0 : e ? 0 === e.width() || 0 === e.height() : void 0 } function w(e) { function t(t) { return y(e, t) } return "none" != t("transform") || "static" != t("position") && "auto" != t("z-index") || t("opacity") < 1 ? !0 : void 0 } function b(e, t) { return window.getComputedStyle(e, t || null) } function y(e, t) { return e.getPropertyValue(t) || dt.webkit && e.getPropertyValue("-webkit-" + t) || dt.mozilla && e.getPropertyValue("-moz-" + t) || dt.opera && e.getPropertyValue("-o-" + t) || dt.msie && e.getPropertyValue("-ms-" + t) } function k(e, t, n, i) { e.setProperty(t, n, i), dt.webkit ? e.setProperty("-webkit-" + t, n, i) : dt.mozilla ? e.setProperty("-moz-" + t, n, i) : dt.opera ? e.setProperty("-o-" + t, n, i) : dt.msie && (e.setProperty("-ms-" + t, n, i), t = "ms" + t.replace(/(^|-)([a-z])/g, function(e, t, n) { return t + n.toUpperCase() }), e[t] = n) } function x(e) { if (dt.msie || dt.chrome) { var t = e.getClientRects(); if (2 == t.length && 1 >= t[1].width) return t[0]; if (3 == t.length && 1 >= t[0].width && 1 >= t[2].width) return t[1] } return e.getBoundingClientRect() } function C(e, n) { return n = "border-" + n, { width: t(y(e, n + "-width")), style: y(e, n + "-style"), color: u(y(e, n + "-color"), !0) } } function S(e, t) { var n = e.style.cssText, i = t(); return e.style.cssText = n, i } function T(e, n) { var i = y(e, "border-" + n + "-radius").split(/\s+/g).map(t); return 1 == i.length && i.push(i[0]), R({ x: i[0], y: i[1] }) } function D(e) { var t = e.getBoundingClientRect(); return t = A(t, "border-*-width", e), t = A(t, "padding-*", e) } function A(e, n, i) { var r, o, a, s, l; return "string" == typeof n ? (r = b(i), o = t(y(r, n.replace("*", "top"))), a = t(y(r, n.replace("*", "right"))), s = t(y(r, n.replace("*", "bottom"))), l = t(y(r, n.replace("*", "left")))) : "number" == typeof n && (o = a = s = l = n), { top: e.top + o, right: e.right - a, bottom: e.bottom - s, left: e.left + l, width: e.right - e.left - a - l, height: e.bottom - e.top - s - o } } function E(e) { var n, i, r = y(e, "transform"); return "none" == r ? null : (n = /^\s*matrix\(\s*(.*?)\s*\)\s*$/.exec(r), n ? (i = y(e, "transform-origin"), n = n[1].split(/\s*,\s*/g).map(t), i = i.split(/\s+/g).map(t), { matrix: n, origin: i }) : void 0) } function I(e) { return 180 * e / n.PI % 360 } function P(e) { var i = t(e); return /grad$/.test(e) ? n.PI * i / 200 : /rad$/.test(e) ? i : /turn$/.test(e) ? n.PI * i * 2 : /deg$/.test(e) ? n.PI * i / 180 : void 0 } function M(e, t) { return t = new lt.Matrix(t[0], t[1], t[2], t[3], t[4], t[5]), e.transform(t), t } function z(e, t) { e.clip(t) } function F(e, t, n, i) { for (var r = new lt.Arc([t, n], i).curvePoints(), o = 1; r.length > o;) e.curveTo(r[o++], r[o++], r[o++]) } function R(e) { return (0 >= e.x || 0 >= e.y) && (e.x = e.y = 0), e } function H(e, t, i, r, o) { var a = n.max(0, t.x), s = n.max(0, t.y), l = n.max(0, i.x), c = n.max(0, i.y), d = n.max(0, r.x), u = n.max(0, r.y), h = n.max(0, o.x), p = n.max(0, o.y), f = n.min(e.width / (a + l), e.height / (c + u), e.width / (d + h), e.height / (p + s)); return 1 > f && (a *= f, s *= f, l *= f, c *= f, d *= f, u *= f, h *= f, p *= f), { tl: { x: a, y: s }, tr: { x: l, y: c }, br: { x: d, y: u }, bl: { x: h, y: p } } } function B(e, n, i) { var r, o, a, s, l, c, d, u, h = b(e), p = T(h, "top-left"), f = T(h, "top-right"), g = T(h, "bottom-left"), m = T(h, "bottom-right"); return ("padding" == i || "content" == i) && (r = C(h, "top"), o = C(h, "right"), a = C(h, "bottom"), s = C(h, "left"), p.x -= s.width, p.y -= r.width, f.x -= o.width, f.y -= r.width, m.x -= o.width, m.y -= a.width, g.x -= s.width, g.y -= a.width, "content" == i && (l = t(y(h, "padding-top")), c = t(y(h, "padding-right")), d = t(y(h, "padding-bottom")), u = t(y(h, "padding-left")), p.x -= u, p.y -= l, f.x -= c, f.y -= l, m.x -= c, m.y -= d, g.x -= u, g.y -= d)), "number" == typeof i && (p.x -= i, p.y -= i, f.x -= i, f.y -= i, m.x -= i, m.y -= i, g.x -= i, g.y -= i), L(n, p, f, m, g) } function L(e, t, n, i, r) { var o = H(e, t, n, i, r), a = o.tl, s = o.tr, l = o.br, c = o.bl, d = new st.Path({ fill: null, stroke: null }); return d.moveTo(e.left, e.top + a.y), a.x && F(d, e.left + a.x, e.top + a.y, { startAngle: -180, endAngle: -90, radiusX: a.x, radiusY: a.y }), d.lineTo(e.right - s.x, e.top), s.x && F(d, e.right - s.x, e.top + s.y, { startAngle: -90, endAngle: 0, radiusX: s.x, radiusY: s.y }), d.lineTo(e.right, e.bottom - l.y), l.x && F(d, e.right - l.x, e.bottom - l.y, { startAngle: 0, endAngle: 90, radiusX: l.x, radiusY: l.y }), d.lineTo(e.left + c.x, e.bottom), c.x && F(d, e.left + c.x, e.bottom - c.y, { startAngle: 90, endAngle: 180, radiusX: c.x, radiusY: c.y }), d.close() } function N(e, n) { var i = t(e) + ""; switch (n) { case "decimal-leading-zero": return 2 > i.length && (i = "0" + i), i; case "lower-roman": return p(e); case "upper-roman": return p(e).toUpperCase(); case "lower-latin": case "lower-alpha": return f(e - 1); case "upper-latin": case "upper-alpha": return f(e - 1).toUpperCase(); default: return i } } function O(e, t) { function n(e, t, n) { return n ? (n = n.replace(/^\s*(["'])(.*)\1\s*$/, "$2"), s(e).map(function(e) { return N(e, t) }).join(n)) : N(a(e) || 0, t) } var i, r = ot(t, /^\s+/), o = []; return r.forEach(function(t) { var r; (i = /^\s*(["'])(.*)\1\s*$/.exec(t)) ? o.push(i[2].replace(/\\([0-9a-f]{4})/gi, function(e, t) { return String.fromCharCode(parseInt(t, 16)) })) : (i = /^\s*counter\((.*?)\)\s*$/.exec(t)) ? (r = ot(i[1]), o.push(n(r[0], r[1]))) : (i = /^\s*counters\((.*?)\)\s*$/.exec(t)) ? (r = ot(i[1]), o.push(n(r[0], r[2], r[1]))) : o.push((i = /^\s*attr\((.*?)\)\s*$/.exec(t)) ? e.getAttribute(i[1]) || "" : t) }), o.join("") } function V(e) { var t, n; if (e.cssText) return e.cssText; for (t = [], n = 0; e.length > n; ++n) t.push(e[n] + ": " + y(e, e[n])); return t.join(";\n") } function U(e, n) { function i(n, i) { var o, a = b(e, n); a.content && "normal" != a.content && "none" != a.content && "0px" != a.width && (o = e.ownerDocument.createElement(ut), o.style.cssText = V(a), o.textContent = O(e, a.content), e.insertBefore(o, i), ":before" != n || /absolute|fixed/.test(y(o.style, "position")) || (o.style.marginLeft = t(y(o.style, "margin-left")) - o.offsetWidth + "px"), r.push(o)) } if (e.tagName == ut) return void W(e, n); var r = []; i(":before", e.firstChild), i(":after", null), W(e, n), r.forEach(function(t) { e.removeChild(t) }) } function W(i, r) { function o(e) { var t, n, r, o, a, s; if (/^td$/i.test(i.tagName) && (t = pt.table, t && "collapse" == y(t.style, "border-collapse"))) { if (n = C(t.style, "left").width, r = C(t.style, "top").width, 0 === n && 0 === r) return e; if (o = t.element.getBoundingClientRect(), a = t.element.rows[0].cells[0], s = a.getBoundingClientRect(), s.top == o.top || s.left == o.left) return ct.call(e).map(function(e) { return { left: e.left + n, top: e.top + r, right: e.right + n, bottom: e.bottom + r, height: e.height, width: e.width } }) } return e } function a(e, t, i, o, a, s, l, c) { function d(t, r, o) { var a = n.PI / 2 * t / (t + i), s = { x: r.x - t, y: r.y - i }, l = new st.Path({ fill: { color: e }, stroke: null }).moveTo(0, 0); M(l, o), F(l, 0, r.y, { startAngle: -90, endAngle: -I(a), radiusX: r.x, radiusY: r.y }), s.x > 0 && s.y > 0 ? (l.lineTo(s.x * n.cos(a), r.y - s.y * n.sin(a)), F(l, 0, r.y, { startAngle: -I(a), endAngle: -90, radiusX: s.x, radiusY: s.y, anticlockwise: !0 })) : s.x > 0 ? l.lineTo(s.x, i).lineTo(0, i) : l.lineTo(s.x, i).lineTo(s.x, 0), h.append(l.close()) } if (!(0 >= i)) { var u, h = new st.Group; M(h, c), r.append(h), R(s), R(l), u = new st.Path({ fill: { color: e }, stroke: null }), h.append(u), u.moveTo(s.x ? n.max(s.x, o) : 0, 0).lineTo(t - (l.x ? n.max(l.x, a) : 0), 0).lineTo(t - n.max(l.x, a), i).lineTo(n.max(s.x, o), i).close(), s.x && d(o, s, [-1, 0, 0, 1, s.x, 0]), l.x && d(a, l, [1, 0, 0, 1, t - l.x, 0]) } } function s(t) { var n, o, a = new st.Group; for (z(a, L(t, U, W, $, q)), r.append(a), "A" == i.tagName && i.href && !/^#?$/.test(e(i).attr("href")) && (a._pdfLink = { url: i.href, top: t.top, right: t.right, bottom: t.bottom, left: t.left }), K && (n = new st.Path({ fill: { color: K.toCssRgba() }, stroke: null }), n.moveTo(t.left, t.top).lineTo(t.right, t.top).lineTo(t.right, t.bottom).lineTo(t.left, t.bottom).close(), a.append(n)), o = h.length; --o >= 0;) l(a, t, h[o], g[o % g.length], m[o % m.length], _[o % _.length], w[o % w.length]) } function l(e, n, r, o, a, s, l) { function c(e, n, r, c, d) { function u() { for (; m.origin.x > n.left;) m.origin.x -= r } function h() { for (; m.origin.y > n.top;) m.origin.y -= c } function p() { for (; n.right > m.origin.x;) d(e, m.clone()), m.origin.x += r } var f, g, m, v, _ = r / c, w = n; if ("content-box" == s ? (w = A(w, "border-*-width", i), w = A(w, "padding-*", i)) : "padding-box" == s && (w = A(w, "border-*-width", i)), /^\s*auto(\s+auto)?\s*$/.test(l) || (f = l.split(/\s+/g), r = /%$/.test(f[0]) ? w.width * t(f[0]) / 100 : t(f[0]), c = 1 == f.length || "auto" == f[1] ? r / _ : /%$/.test(f[1]) ? w.height * t(f[1]) / 100 : t(f[1])), g = (a + "").split(/\s+/), 1 == g.length && (g[1] = "50%"), g[0] = /%$/.test(g[0]) ? t(g[0]) / 100 * (w.width - r) : t(g[0]), g[1] = /%$/.test(g[1]) ? t(g[1]) / 100 * (w.height - c) : t(g[1]), m = new lt.Rect([w.left + g[0], w.top + g[1]], [r, c]), "no-repeat" == o) d(e, m); else if ("repeat-x" == o) u(), p(); else if ("repeat-y" == o) for (h(); n.bottom > m.origin.y;) d(e, m.clone()), m.origin.y += c; else if ("repeat" == o) for (u(), h(), v = m.origin.clone(); n.bottom > m.origin.y;) m.origin.x = v.x, p(), m.origin.y += c } if (r && "none" != r) if ("url" == r.type) { if (/^url\(\"data:image\/svg/i.test(r.url)) return; var d = ht[r.url]; d && d.width > 0 && d.height > 0 && c(e, n, d.width, d.height, function(e, t) { e.append(new st.Image(r.url, t)) }) } else { if ("linear" != r.type) return; c(e, n, n.width, n.height, j(r)) } } function c() { function e(e) { S(i, function() { i.style.position = "relative"; var t = i.ownerDocument.createElement(ut); t.style.position = "absolute", t.style.boxSizing = "border-box", "outside" == o ? (t.style.width = "6em", t.style.left = "-6.8em", t.style.textAlign = "right") : t.style.left = "0px", e(t), i.insertBefore(t, i.firstChild), tt(t, r), i.removeChild(t) }) } function t(e) { var t, n = i.parentNode.children, r = i.getAttribute("kendo-split-index"); if (null != r) return e(0 | r, n.length); for (t = 0; n.length > t; ++t) if (n[t] === i) return e(t, n.length) } var n, o, a = y(E, "list-style-type"); if ("none" != a) switch (n = y(E, "list-style-image"), o = y(E, "list-style-position"), a) { case "circle": case "disc": case "square": e(function(e) { e.style.fontSize = "60%", e.style.lineHeight = "200%", e.style.paddingRight = "0.5em", e.style.fontFamily = "DejaVu Serif", e.innerHTML = { disc: "●", circle: "◯", square: "■" }[a] }); break; case "decimal": case "decimal-leading-zero": e(function(e) { t(function(t) { ++t, "decimal-leading-zero" == a && 2 > (t + "").length && (t = "0" + t), e.innerHTML = t + "." }) }); break; case "lower-roman": case "upper-roman": e(function(e) { t(function(t) { t = p(t + 1), "upper-roman" == a && (t = t.toUpperCase()), e.innerHTML = t + "." }) }); break; case "lower-latin": case "lower-alpha": case "upper-latin": case "upper-alpha": e(function(e) { t(function(t) { t = f(t), /^upper/i.test(a) && (t = t.toUpperCase()), e.innerHTML = t + "." }) }) } } function d(e, t, n) { function o(e) { return { x: e.y, y: e.x } } var l, c, d, u, h, p, f, g; if (0 !== e.width && 0 !== e.height && (s(e), l = V.width > 0 && (t && "ltr" == Q || n && "rtl" == Q), c = N.width > 0 && (n && "ltr" == Q || t && "rtl" == Q), 0 !== P.width || 0 !== V.width || 0 !== N.width || 0 !== O.width)) { if (P.color == N.color && P.color == O.color && P.color == V.color && P.width == N.width && P.width == O.width && P.width == V.width && l && c) return e = A(e, P.width / 2), d = B(i, e, P.width / 2), d.options.stroke = { color: P.color, width: P.width }, void r.append(d); if (0 === U.x && 0 === W.x && 0 === $.x && 0 === q.x && 2 > P.width && 2 > V.width && 2 > N.width && 2 > O.width) return P.width > 0 && r.append(new st.Path({ stroke: { width: P.width, color: P.color } }).moveTo(e.left, e.top + P.width / 2).lineTo(e.right, e.top + P.width / 2)), O.width > 0 && r.append(new st.Path({ stroke: { width: O.width, color: O.color } }).moveTo(e.left, e.bottom - O.width / 2).lineTo(e.right, e.bottom - O.width / 2)), l && r.append(new st.Path({ stroke: { width: V.width, color: V.color } }).moveTo(e.left + V.width / 2, e.top).lineTo(e.left + V.width / 2, e.bottom)), void(c && r.append(new st.Path({ stroke: { width: N.width, color: N.color } }).moveTo(e.right - N.width / 2, e.top).lineTo(e.right - N.width / 2, e.bottom))); u = H(e, U, W, $, q), h = u.tl, p = u.tr, f = u.br, g = u.bl, a(P.color, e.width, P.width, V.width, N.width, h, p, [1, 0, 0, 1, e.left, e.top]), a(O.color, e.width, O.width, N.width, V.width, f, g, [-1, 0, 0, -1, e.right, e.bottom]), a(V.color, e.height, V.width, O.width, P.width, o(g), o(h), [0, -1, 1, 0, e.left, e.bottom]), a(N.color, e.height, N.width, P.width, O.width, o(p), o(f), [0, 1, -1, 0, e.right, e.top]) } } var h, g, m, _, w, k, x, D, E = b(i), P = C(E, "top"), N = C(E, "right"), O = C(E, "bottom"), V = C(E, "left"), U = T(E, "top-left"), W = T(E, "top-right"), q = T(E, "bottom-left"), $ = T(E, "bottom-right"), Q = y(E, "direction"), K = y(E, "background-color"); for (K = u(K), h = rt(y(E, "background-image")), g = ot(y(E, "background-repeat")), m = ot(y(E, "background-position")), _ = ot(y(E, "background-origin")), w = ot(y(E, "background-size")), dt.msie && 10 > dt.version && (m = ot(i.currentStyle.backgroundPosition)), k = A(i.getBoundingClientRect(), "border-*-width", i), function() { var e, n, i, o, a, s, l, c = y(E, "clip"), d = /^\s*rect\((.*)\)\s*$/.exec(c); d && (e = d[1].split(/[ ,]+/g), n = "auto" == e[0] ? k.top : t(e[0]) + k.top, i = "auto" == e[1] ? k.right : t(e[1]) + k.left, o = "auto" == e[2] ? k.bottom : t(e[2]) + k.top, a = "auto" == e[3] ? k.left : t(e[3]) + k.left, s = new st.Group, l = (new st.Path).moveTo(a, n).lineTo(i, n).lineTo(i, o).lineTo(a, o).close(), z(s, l), r.append(s), r = s, v(l)) }(), x = i.getClientRects(), 1 == x.length && (x = [i.getBoundingClientRect()]), x = o(x), D = 0; x.length > D; ++D) d(x[D], 0 === D, D == x.length - 1); return x.length > 0 && "list-item" == y(E, "display") && c(x[0]), function() { function e() { var e = B(i, k, "padding"), t = new st.Group; z(t, e), r.append(t), r = t, v(e) } Y(i) ? e() : /^(hidden|auto|scroll)/.test(y(E, "overflow")) ? e() : /^(hidden|auto|scroll)/.test(y(E, "overflow-x")) ? e() : /^(hidden|auto|scroll)/.test(y(E, "overflow-y")) && e() }(), G(i, r) || Z(i, r), r } function j(e) { return function(i, r) { { var o, a, s, l, c, d, u, h, p, f, g, m, v, _ = r.width(), w = r.height(); r.topLeft() } switch (e.type) { case "linear": switch (o = null != e.angle ? e.angle : n.PI, e.to) { case "top": o = 0; break; case "left": o = -n.PI / 2; break; case "bottom": o = n.PI; break; case "right": o = n.PI / 2; break; case "top left": case "left top": o = -n.atan2(w, _); break; case "top right": case "right top": o = n.atan2(w, _); break; case "bottom left": case "left bottom": o = n.PI + n.atan2(w, _); break; case "bottom right": case "right bottom": o = n.PI - n.atan2(w, _) } e.reverse && (o -= n.PI), o %= 2 * n.PI, 0 > o && (o += 2 * n.PI), a = n.abs(_ * n.sin(o)) + n.abs(w * n.cos(o)), s = n.atan(_ * n.tan(o) / w), l = n.sin(s), c = n.cos(s), d = n.abs(l) + n.abs(c), u = d / 2 * l, h = d / 2 * c, o > n.PI / 2 && 3 * n.PI / 2 >= o && (u = -u, h = -h), p = [], f = 0, g = e.stops.map(function(n, i) { var r, o = n.percent; return o ? o = t(o) / 100 : n.length ? o = t(n.length) / a : 0 === i ? o = 0 : i == e.stops.length - 1 && (o = 1), r = { color: n.color.toCssRgba(), offset: o }, null != o ? (f = o, p.forEach(function(e, t) { var n = e.stop; n.offset = e.left + (f - e.left) * (t + 1) / (p.length + 1) }), p = []) : p.push({ left: f, stop: r }), r }), m = [.5 - u, .5 + h], v = [.5 + u, .5 - h], i.append(st.Path.fromRect(r).stroke(null).fill(new st.LinearGradient({ start: m, end: v, stops: g, userSpace: !1 }))); break; case "radial": window.console && window.console.log && window.console.log("Radial gradients are not yet supported in HTML renderer") } } } function G(t, n) { var i, r, o, a; return t.getAttribute(kendo.attr("role")) && (i = kendo.widgetInstance(e(t)), i && (i.exportDOMVisual || i.exportVisual)) ? (r = i.exportDOMVisual ? i.exportDOMVisual() : i.exportVisual()) ? (o = new st.Group, o.children.push(r), a = t.getBoundingClientRect(), o.transform(lt.transform().translate(a.left, a.top)), n.append(o), !0) : !1 : void 0 } function q(e, t, n) { var i = D(e), r = new lt.Rect([i.left, i.top], [i.width, i.height]), o = new st.Image(t, r); z(o, B(e, i, "content")), n.append(o) } function $(e, n) { var i = b(e), r = b(n), o = t(y(i, "z-index")), a = t(y(r, "z-index")), s = y(i, "position"), l = y(r, "position"); return isNaN(o) && isNaN(a) ? /static|absolute/.test(s) && /static|absolute/.test(l) ? 0 : "static" == s ? -1 : "static" == l ? 1 : 0 : isNaN(o) ? 0 === a ? 0 : a > 0 ? -1 : 1 : isNaN(a) ? 0 === o ? 0 : o > 0 ? 1 : -1 : t(o) - t(a) } function Y(e) { return /^(?:textarea|select|input)$/i.test(e.tagName) } function Q(e) { return e.selectedOptions && e.selectedOptions.length > 0 ? e.selectedOptions[0] : e.options[e.selectedIndex] } function K(e, t) { var i = b(e), r = y(i, "color"), o = e.getBoundingClientRect(); "checkbox" == e.type ? (t.append(st.Path.fromRect(new lt.Rect([o.left + 1, o.top + 1], [o.width - 2, o.height - 2])).stroke(r, 1)), e.checked && t.append((new st.Path).stroke(r, 1.2).moveTo(o.left + .22 * o.width, o.top + .55 * o.height).lineTo(o.left + .45 * o.width, o.top + .75 * o.height).lineTo(o.left + .78 * o.width, o.top + .22 * o.width))) : (t.append(new st.Circle(new lt.Circle([(o.left + o.right) / 2, (o.top + o.bottom) / 2], n.min(o.width - 2, o.height - 2) / 2)).stroke(r, 1)), e.checked && t.append(new st.Circle(new lt.Circle([(o.left + o.right) / 2, (o.top + o.bottom) / 2], n.min(o.width - 8, o.height - 8) / 2)).fill(r).stroke(null))) } function X(e, t) { var n, i, r, o, a, s = e.tagName.toLowerCase(); if ("input" == s && ("checkbox" == e.type || "radio" == e.type)) return K(e, t); if (n = e.parentNode, i = e.ownerDocument, r = i.createElement(ut), r.style.cssText = V(b(e)), r.style.display = "inline-block", "input" == s && (r.style.whiteSpace = "pre"), ("select" == s || "textarea" == s) && (r.style.overflow = "auto"), "select" == s) if (e.multiple) for (a = 0; e.options.length > a; ++a) o = i.createElement(ut), o.style.cssText = V(b(e.options[a])), o.style.display = "block", o.textContent = e.options[a].textContent, r.appendChild(o); else o = Q(e), o && (r.textContent = o.textContent); else r.textContent = e.value; n.insertBefore(r, e), r.scrollLeft = e.scrollLeft, r.scrollTop = e.scrollTop, Z(r, t), n.removeChild(r) } function Z(e, t) { var n, i, r, o, a, s, l, c, d; switch (pt._stackingContext.element === e && (pt._stackingContext.group = t), e.tagName.toLowerCase()) { case "img": q(e, e.src, t); break; case "canvas": try { q(e, e.toDataURL("image/png"), t) } catch (u) {} break; case "textarea": case "input": case "select": X(e, t); break; default: for (n = [], i = [], r = [], o = [], a = e.firstChild; a; a = a.nextSibling) switch (a.nodeType) { case 3: /\S/.test(a.data) && J(e, a, t); break; case 1: s = b(a), l = y(s, "display"), c = y(s, "float"), d = y(s, "position"), "static" != d ? o.push(a) : "inline" != l ? "none" != c ? i.push(a) : n.push(a) : r.push(a) } n.sort($).forEach(function(e) { tt(e, t) }), i.sort($).forEach(function(e) { tt(e, t) }), r.sort($).forEach(function(e) { tt(e, t) }), o.sort($).forEach(function(e) { tt(e, t) }) } } function J(e, i, r) { function o() { var e, t, r, o, s, l, h, p = d, f = c.substr(d).search(/\S/); if (d += f, 0 > f || d >= u) return !0; if (m.setStart(i, d), m.setEnd(i, d + 1), e = m.getBoundingClientRect(), t = !1, w && (f = c.substr(d).search(/\s/), f >= 0 && (m.setEnd(i, d + f), r = m.getBoundingClientRect(), r.bottom == e.bottom && (e = r, t = !0, d += f))), !t) { if (f = function g(t, n, r) { m.setEnd(i, n); var o = x(m); return o.bottom != e.bottom && n > t ? g(t, t + n >> 1, n) : o.right != e.right ? (e = o, r > n ? g(n, n + r >> 1, r) : n) : n }(d, n.min(u, d + C), u), f == d) return !0; if (d = f, f = ("" + m).search(/\s+$/), 0 === f) return; f > 0 && (m.setEnd(i, m.startOffset + f), e = m.getBoundingClientRect()) } if (dt.msie && (e = m.getClientRects()[0]), o = "" + m, /^(?:pre|pre-wrap)$/i.test(k)) { if (/\t/.test(o)) { for (s = 0, f = p; m.startOffset > f; ++f) l = c.charCodeAt(f), 9 == l ? s += 8 - s % 8 : 10 == l || 13 == l ? s = 0 : s++; for (; (f = o.search(" ")) >= 0;) h = " ".substr(0, 8 - (s + f) % 8), o = o.substr(0, f) + h + o.substr(f + 1) } } else o = o.replace(/\s+/g, " "); a(o, e) } function a(e, t) { var n, i, o; dt.msie && !isNaN(p) && (n = st.util.measureText(e, { font: f }), i = (t.top + t.bottom - n.height) / 2, t = { top: i, right: t.right, bottom: i + n.height, left: t.left, height: n.height, width: t.right - t.left }), o = new it(e, new lt.Rect([t.left, t.top], [t.width, t.height]), { font: f, fill: { color: g } }), r.append(o), s(t) } function s(e) { function t(t, n) { var i, o; t && (i = h / 12, o = new st.Path({ stroke: { width: i, color: t } }), n -= i, o.moveTo(e.left, n).lineTo(e.right, n), r.append(o)) } t(pt.underline, e.bottom), t(pt["line-through"], e.bottom - e.height / 2.7), t(pt.overline, e.top) } var l, c, d, u, h, p, f, g, m, v, w, k, C; if (!_() && (l = b(e), !(t(y(l, "text-indent")) < -500) && (c = i.data, d = 0, u = c.search(/\S\s*$/) + 1, u && (h = y(l, "font-size"), p = y(l, "line-height"), f = [y(l, "font-style"), y(l, "font-variant"), y(l, "font-weight"), h, y(l, "font-family")].join(" "), h = t(h), p = t(p), 0 !== h)))) for (g = y(l, "color"), m = e.ownerDocument.createRange(), v = y(l, "text-align"), w = "justify" == v, k = y(l, "white-space"), C = e.getBoundingClientRect().width / h * 5, 0 === C && (C = 500); !o();); } function et(e, n, i) { var r, o, a, s, l, c; for ("auto" != i ? (r = pt._stackingContext.group, i = t(i)) : (r = n, i = 0), o = r.children, a = 0; o.length > a && !(null != o[a]._dom_zIndex && o[a]._dom_zIndex > i); ++a); return s = new st.Group, r.insertAt(s, a), s._dom_zIndex = i, r !== n && pt._clipbox && (l = pt._matrix.invert(), c = pt._clipbox.transformCopy(l), z(s, st.Path.fromRect(c))), s } function tt(e, n) { var i, r, o, a, s, u, h, p = b(e), f = y(p, "counter-reset"); f && d(ot(f, /^\s+/), c, 0), i = y(p, "counter-increment"), i && d(ot(i, /^\s+/), l, 1), /^(style|script|link|meta|iframe|svg|col|colgroup)$/i.test(e.tagName) || null != pt._clipbox && (r = t(y(p, "opacity")), o = y(p, "visibility"), a = y(p, "display"), 0 !== r && "hidden" != o && "none" != a && (s = E(p), h = y(p, "z-index"), (s || 1 > r) && "auto" == h && (h = 0), u = et(e, n, h), 1 > r && u.opacity(r * u.opacity()), g(e, p, u), s ? S(e, function() { var t, n, i, r; k(e.style, "transform", "none", "important"), k(e.style, "transition", "none", "important"), "static" == y(p, "position") && k(e.style, "position", "relative", "important"), t = e.getBoundingClientRect(), n = t.left + s.origin[0], i = t.top + s.origin[1], r = [1, 0, 0, 1, -n, -i], r = nt(r, s.matrix), r = nt(r, [1, 0, 0, 1, n, i]), r = M(u, r), pt._matrix = pt._matrix.multiplyCopy(r), U(e, u) }) : U(e, u), m())) } function nt(e, t) { var n = e[0], i = e[1], r = e[2], o = e[3], a = e[4], s = e[5], l = t[0], c = t[1], d = t[2], u = t[3], h = t[4], p = t[5]; return [n * l + i * d, n * c + i * u, r * l + o * d, r * c + o * u, a * l + s * d + h, a * c + s * u + p] } var it, rt, ot, at, st = kendo.drawing, lt = kendo.geometry, ct = Array.prototype.slice, dt = kendo.support.browser, ut = "KENDO-PSEUDO-ELEMENT", ht = {}, pt = {}; pt._root = pt, it = st.Text.extend({ nodeType: "Text", init: function(e, t, n) { st.Text.fn.init.call(this, e, t.getOrigin(), n), this._pdfRect = t }, rect: function() { return this._pdfRect }, rawBBox: function() { return this._pdfRect } }), st.drawDOM = i, i.getFontFaces = r, rt = function() { function e(e) { function f() { var t = s.exec(e); t && (e = e.substr(t[1].length)) } function g(t) { f(); var n = t.exec(e); return n ? (e = e.substr(n[1].length), n[1]) : void 0 } function m() { var t, r, o = kendo.parseColor(e, !0); return o ? (e = e.substr(o.match[0].length), o = o.toRGB(), (t = g(i)) || (r = g(n)), { color: o, length: t, percent: r }) : void 0 } function v(t) { var i, o, s, u, h, p, f = [], v = !1; if (g(l)) { for (i = g(a), i ? (i = P(i), g(d)) : (o = g(r), "to" == o ? o = g(r) : o && /^-/.test(t) && (v = !0), s = g(r), g(d)), /-moz-/.test(t) && null == i && null == o && (u = g(n), h = g(n), v = !0, "0%" == u ? o = "left" : "100%" == u && (o = "right"), "0%" == h ? s = "top" : "100%" == h && (s = "bottom"), g(d)); e && !g(c) && (p = m());) f.push(p), g(d); return { type: "linear", angle: i, to: o && s ? o + " " + s : o ? o : s ? s : null, stops: f, reverse: v } } } function _() { if (g(l)) { var e = g(h); return e = e.replace(/^['"]+|["']+$/g, ""), g(c), { type: "url", url: e } } } var w, b = e; return o(p, b) ? p[b] : ((w = g(t)) ? w = v(w) : (w = g(u)) && (w = _()), p[b] = w || { type: "none" }) } var t = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\s*)\(/, n = /^([-0-9.]+%)/, i = /^([-0-9.]+px)/, r = /^(left|right|top|bottom|to|center)\W/, a = /^([-0-9.]+(deg|grad|rad|turn))/, s = /^(\s+)/, l = /^(\()/, c = /^(\))/, d = /^(,)/, u = /^(url)\(/, h = /^(.*?)\)/, p = {}, f = {}; return function(t) { return o(f, t) ? f[t] : f[t] = ot(t).map(e) } }(), ot = function() { var e = {}; return function(t, n) { function i(e) { return h = e.exec(t.substr(c)) } function r(e) { return e.replace(/^\s+|\s+$/g, "") } var a, s, l, c, d, u, h; if (n || (n = /^\s*,\s*/), a = t + n, o(e, a)) return e[a]; for (s = [], l = 0, c = 0, d = 0, u = !1; t.length > c;)!u && i(/^[\(\[\{]/) ? (d++, c++) : !u && i(/^[\)\]\}]/) ? (d--, c++) : !u && i(/^[\"\']/) ? (u = h[0], c++) : "'" == u && i(/^\\\'/) ? c += 2 : '"' == u && i(/^\\\"/) ? c += 2 : "'" == u && i(/^\'/) ? (u = !1, c++) : '"' == u && i(/^\"/) ? (u = !1, c++) : i(n) ? (!u && !d && c > l && (s.push(r(t.substring(l, c))), l = c + h[0].length), c += h[0].length) : c++; return c > l && s.push(r(t.substring(l, c))), e[a] = s } }(), at = function() { var e = {}; return function(t) { var n, i = e[t]; return i || ((n = /url\((['"]?)([^'")]*?)\1\)\s+format\((['"]?)truetype\3\)/.exec(t)) ? i = e[t] = n[2] : (n = /url\((['"]?)([^'")]*?\.ttf)\1\)/.exec(t)) && (i = e[t] = n[2])), i } }() }(window.kendo.jQuery, parseFloat, Math), function(e) { var t = e.noop, n = window.kendo, i = n.Class, r = n.util, o = n.animationFrame, a = n.deepExtend, s = i.extend({ init: function(e, t) { var n = this; n.options = a({}, n.options, t), n.element = e }, options: { duration: 500, easing: "swing" }, setup: t, step: t, play: function() { var t = this, n = t.options, i = e.easing[n.easing], a = n.duration, s = n.delay || 0, l = r.now() + s, c = l + a; 0 === a ? (t.step(1), t.abort()) : setTimeout(function() { var e = function() { var n, s, d, u; t._stopped || (n = r.now(), s = r.limitValue(n - l, 0, a), d = s / a, u = i(d, s, 0, 1, a), t.step(u), c > n ? o(e) : t.abort()) }; e() }, s) }, abort: function() { this._stopped = !0 }, destroy: function() { this.abort() } }), l = function() { this._items = [] }; l.prototype = { register: function(e, t) { this._items.push({ name: e, type: t }) }, create: function(e, t) { var n, i, r, o = this._items; if (t && t.type) for (i = t.type.toLowerCase(), r = 0; o.length > r; r++) if (o[r].name.toLowerCase() === i) { n = o[r]; break } return n ? new n.type(e, t) : void 0 } }, l.current = new l, s.create = function(e, t, n) { return l.current.create(e, t, n) }, a(n.drawing, { Animation: s, AnimationFactory: l }) }(window.kendo.jQuery, Math), function(e) { function t(t) { var n, i = s.ui.validator.ruleResolvers || {}, r = {}; for (n in i) e.extend(!0, r, i[n].resolve(t)); return r } function n(e) { return e.replace(/&/g, "&").replace(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">") } function i(e) { return e = (e + "").split("."), e.length > 1 ? e[1].length : 0 } function r(t) { return e(e.parseHTML ? e.parseHTML(t) : t) } function o(t, n) { var i, r, o, a, l = e(); for (o = 0, a = t.length; a > o; o++) i = t[o], u.test(i.className) && (r = i.getAttribute(s.attr("for")), r === n && (l = l.add(i))); return l } var a, s = window.kendo, l = s.ui.Widget, c = ".kendoValidator", d = "k-invalid-msg", u = RegExp(d, "i"), h = "k-invalid", p = "k-valid", f = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i, g = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, m = ":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])", v = ":checkbox:not([disabled],[readonly])", _ = "[type=number],[type=range]", w = "blur", b = "name", y = "form", k = "novalidate", x = e.proxy, C = function(e, t) { return "string" == typeof t && (t = RegExp("^(?:" + t + ")$")), t.test(e) }, S = function(e, t, n) { var i = e.val(); return e.filter(t).length && "" !== i ? C(i, n) : !0 }, T = function(e, t) { return e.length ? null != e[0].attributes[t] : !1 }; s.ui.validator || (s.ui.validator = { rules: {}, messages: {} }), a = l.extend({ init: function(n, i) { var r = this, o = t(n), a = "[" + s.attr("validate") + "!=false]"; i = i || {}, i.rules = e.extend({}, s.ui.validator.rules, o.rules, i.rules), i.messages = e.extend({}, s.ui.validator.messages, o.messages, i.messages), l.fn.init.call(r, n, i), r._errorTemplate = s.template(r.options.errorTemplate), r.element.is(y) && r.element.attr(k, k), r._inputSelector = m + a, r._checkboxSelector = v + a, r._errors = {}, r._attachEvents(), r._isValidated = !1 }, events: ["validate", "change"], options: { name: "Validator", errorTemplate: '<span class="k-widget k-tooltip k-tooltip-validation"><span class="k-icon k-warning"> </span> #=message#</span>', messages: { required: "{0} is required", pattern: "{0} is not valid", min: "{0} should be greater than or equal to {1}", max: "{0} should be smaller than or equal to {1}", step: "{0} is not valid", email: "{0} is not valid email", url: "{0} is not valid URL", date: "{0} is not valid date", dateCompare: "End date should be greater than or equal to the start date" }, rules: { required: function(e) { var t = e.filter("[type=checkbox]").length && !e.is(":checked"), n = e.val(); return !(T(e, "required") && ("" === n || !n || t)) }, pattern: function(e) { return e.filter("[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]").filter("[pattern]").length && "" !== e.val() ? C(e.val(), e.attr("pattern")) : !0 }, min: function(e) { if (e.filter(_ + ",[" + s.attr("type") + "=number]").filter("[min]").length && "" !== e.val()) { var t = parseFloat(e.attr("min")) || 0, n = s.parseFloat(e.val()); return n >= t } return !0 }, max: function(e) { if (e.filter(_ + ",[" + s.attr("type") + "=number]").filter("[max]").length && "" !== e.val()) { var t = parseFloat(e.attr("max")) || 0, n = s.parseFloat(e.val()); return t >= n } return !0 }, step: function(e) { if (e.filter(_ + ",[" + s.attr("type") + "=number]").filter("[step]").length && "" !== e.val()) { var t, n = parseFloat(e.attr("min")) || 0, r = parseFloat(e.attr("step")) || 1, o = parseFloat(e.val()), a = i(r); return a ? (t = Math.pow(10, a), Math.floor((o - n) * t) % (r * t) / Math.pow(100, a) === 0) : (o - n) % r === 0 } return !0 }, email: function(e) { return S(e, "[type=email],[" + s.attr("type") + "=email]", f) }, url: function(e) { return S(e, "[type=url],[" + s.attr("type") + "=url]", g) }, date: function(e) { return e.filter("[type^=date],[" + s.attr("type") + "=date]").length && "" !== e.val() ? null !== s.parseDate(e.val(), e.attr(s.attr("format"))) : !0 } }, validateOnBlur: !0 }, destroy: function() { l.fn.destroy.call(this), this.element.off(c) }, value: function() { return this._isValidated ? 0 === this.errors().length : !1 }, _submit: function(e) { return this.validate() ? !0 : (e.stopPropagation(), e.stopImmediatePropagation(), e.preventDefault(), !1) }, _checkElement: function(e) { var t = this.value(); this.validateInput(e), this.value() !== t && this.trigger("change") }, _attachEvents: function() { var t = this; t.element.is(y) && t.element.on("submit" + c, x(t._submit, t)), t.options.validateOnBlur && (t.element.is(m) ? (t.element.on(w + c, function() { t._checkElement(t.element) }), t.element.is(v) && t.element.on("click" + c, function() { t._checkElement(t.element) })) : (t.element.on(w + c, t._inputSelector, function() { t._checkElement(e(this)) }), t.element.on("click" + c, t._checkboxSelector, function() { t._checkElement(e(this)) }))) }, validate: function() { var e, t, n, i, r = !1, o = this.value(); if (this._errors = {}, this.element.is(m)) r = this.validateInput(this.element); else { for (i = !1, e = this.element.find(this._inputSelector), t = 0, n = e.length; n > t; t++) this.validateInput(e.eq(t)) || (i = !0); r = !i } return this.trigger("validate", { valid: r }), o !== r && this.trigger("change"), r }, validateInput: function(t) { var i, o, a, l, c, u, f, g, m, v; return t = e(t), this._isValidated = !0, i = this, o = i._errorTemplate, a = i._checkValidity(t), l = a.valid, c = "." + d, u = t.attr(b) || "", f = i._findMessageContainer(u).add(t.next(c).filter(function() { var t = e(this); return t.filter("[" + s.attr("for") + "]").length ? t.attr(s.attr("for")) === u : !0 })).hide(), t.removeAttr("aria-invalid"), l ? delete i._errors[u] : (g = i._extractMessage(t, a.key), i._errors[u] = g, m = r(o({ message: n(g) })), v = f.attr("id"), i._decorateMessageContainer(m, u), v && m.attr("id", v), f.replaceWith(m).length || m.insertAfter(t), m.show(), t.attr("aria-invalid", !0)), t.toggleClass(h, !l), t.toggleClass(p, l), l }, hideMessages: function() { var e = this, t = "." + d, n = e.element; n.is(m) ? n.next(t).hide() : n.find(t).hide() }, _findMessageContainer: function(t) { var n, i, r, a = s.ui.validator.messageLocators, l = e(); for (i = 0, r = this.element.length; r > i; i++) l = l.add(o(this.element[i].getElementsByTagName("*"), t)); for (n in a) l = l.add(a[n].locate(this.element, t)); return l }, _decorateMessageContainer: function(e, t) { var n, i = s.ui.validator.messageLocators; e.addClass(d).attr(s.attr("for"), t || ""); for (n in i) i[n].decorate(e, t); e.attr("role", "alert") }, _extractMessage: function(e, t) { var n = this, i = n.options.messages[t], r = e.attr(b); return i = s.isFunction(i) ? i(e) : i, s.format(e.attr(s.attr(t + "-msg")) || e.attr("validationMessage") || e.attr("title") || i || "", r, e.attr(t)) }, _checkValidity: function(e) { var t, n = this.options.rules; for (t in n) if (!n[t].call(this, e)) return { valid: !1, key: t }; return { valid: !0 } }, errors: function() { var e, t = [], n = this._errors; for (e in n) t.push(n[e]); return t } }), s.ui.plugin(a) }(window.kendo.jQuery), function(e) { function t(e, t) { var n = e.x.location, i = e.y.location, r = t.x.location, o = t.y.location, a = n - r, s = i - o; return { center: { x: (n + r) / 2, y: (i + o) / 2 }, distance: Math.sqrt(a * a + s * s) } } function n(e) { var t, n, i, r = [], a = e.originalEvent, s = e.currentTarget, l = 0; if (e.api) r.push({ id: 2, event: e, target: e.target, currentTarget: e.target, location: e, type: "api" }); else if (e.type.match(/touch/)) for (n = a ? a.changedTouches : [], t = n.length; t > l; l++) i = n[l], r.push({ location: i, event: e, target: i.target, currentTarget: s, id: i.identifier, type: "touch" }); else r.push(o.pointers || o.msPointers ? { location: a, event: e, target: e.target, currentTarget: s, id: a.pointerId, type: "pointer" } : { id: 1, event: e, target: e.target, currentTarget: s, location: e, type: "mouse" }); return r } function i(e) { for (var t = r.eventMap.up.split(" "), n = 0, i = t.length; i > n; n++) e(t[n]) } var r = window.kendo, o = r.support, a = window.document, s = r.Class, l = r.Observable, c = e.now, d = e.extend, u = o.mobileOS, h = u && u.android, p = 800, f = o.browser.msie ? 5 : 0, g = "press", m = "hold", v = "select", _ = "start", w = "move", b = "end", y = "cancel", k = "tap", x = "release", C = "gesturestart", S = "gesturechange", T = "gestureend", D = "gesturetap", A = { api: 0, touch: 0, mouse: 9, pointer: 9 }, E = !o.touch || o.mouseAndTouchPresent, I = s.extend({ init: function(e, t) { var n = this; n.axis = e, n._updateLocationData(t), n.startLocation = n.location, n.velocity = n.delta = 0, n.timeStamp = c() }, move: function(e) { var t = this, n = e["page" + t.axis], i = c(), r = i - t.timeStamp || 1; (n || !h) && (t.delta = n - t.location, t._updateLocationData(e), t.initialDelta = n - t.startLocation, t.velocity = t.delta / r, t.timeStamp = i) }, _updateLocationData: function(e) { var t = this, n = t.axis; t.location = e["page" + n], t.client = e["client" + n], t.screen = e["screen" + n] } }), P = s.extend({ init: function(e, t, n) { d(this, { x: new I("X", n.location), y: new I("Y", n.location), type: n.type, threshold: e.threshold || A[n.type], userEvents: e, target: t, currentTarget: n.currentTarget, initialTouch: n.target, id: n.id, pressEvent: n, _moved: !1, _finished: !1 }) }, press: function() { this._holdTimeout = setTimeout(e.proxy(this, "_hold"), this.userEvents.minHold), this._trigger(g, this.pressEvent) }, _hold: function() { this._trigger(m, this.pressEvent) }, move: function(e) { var t = this; if (!t._finished) { if (t.x.move(e.location), t.y.move(e.location), !t._moved) { if (t._withinIgnoreThreshold()) return; if (M.current && M.current !== t.userEvents) return t.dispose(); t._start(e) } t._finished || t._trigger(w, e) } }, end: function(e) { var t = this; t.endTime = c(), t._finished || (t._finished = !0, t._trigger(x, e), t._moved ? t._trigger(b, e) : t._trigger(k, e), clearTimeout(t._holdTimeout), t.dispose()) }, dispose: function() { var t = this.userEvents, n = t.touches; this._finished = !0, this.pressEvent = null, clearTimeout(this._holdTimeout), n.splice(e.inArray(this, n), 1) }, skip: function() { this.dispose() }, cancel: function() { this.dispose() }, isMoved: function() { return this._moved }, _start: function(e) { clearTimeout(this._holdTimeout), this.startTime = c(), this._moved = !0, this._trigger(_, e) }, _trigger: function(e, t) { var n = this, i = t.event, r = { touch: n, x: n.x, y: n.y, target: n.target, event: i }; n.userEvents.notify(e, r) && i.preventDefault() }, _withinIgnoreThreshold: function() { var e = this.x.initialDelta, t = this.y.initialDelta; return Math.sqrt(e * e + t * t) <= this.threshold } }), M = l.extend({ init: function(t, n) { var s, c, u, h = this, A = r.guid(); n = n || {}, s = h.filter = n.filter, h.threshold = n.threshold || f, h.minHold = n.minHold || p, h.touches = [], h._maxTouches = n.multiTouch ? 2 : 1, h.allowSelection = n.allowSelection, h.captureUpIfMoved = n.captureUpIfMoved, h.eventNS = A, t = e(t).handler(h), l.fn.init.call(h), d(h, { element: t, surface: e(n.global && E ? a.documentElement : n.surface || t), stopPropagation: n.stopPropagation, pressed: !1 }), h.surface.handler(h).on(r.applyEventMap("move", A), "_move").on(r.applyEventMap("up cancel", A), "_end"), t.on(r.applyEventMap("down", A), s, "_start"), (o.pointers || o.msPointers) && t.css("-ms-touch-action", "pinch-zoom double-tap-zoom"), n.preventDragEvent && t.on(r.applyEventMap("dragstart", A), r.preventDefault), t.on(r.applyEventMap("mousedown", A), s, { root: t }, "_select"), h.captureUpIfMoved && o.eventCapture && (c = h.surface[0], u = e.proxy(h.preventIfMoving, h), i(function(e) { c.addEventListener(e, u, !0) })), h.bind([g, m, k, _, w, b, x, y, C, S, T, D, v], n) }, preventIfMoving: function(e) { this._isMoved() && e.preventDefault() }, destroy: function() { var e, t = this; t._destroyed || (t._destroyed = !0, t.captureUpIfMoved && o.eventCapture && (e = t.surface[0], i(function(n) { e.removeEventListener(n, t.preventIfMoving) })), t.element.kendoDestroy(t.eventNS), t.surface.kendoDestroy(t.eventNS), t.element.removeData("handler"), t.surface.removeData("handler"), t._disposeAll(), t.unbind(), delete t.surface, delete t.element, delete t.currentTarget) }, capture: function() { M.current = this }, cancel: function() { this._disposeAll(), this.trigger(y) }, notify: function(e, n) { var i = this, r = i.touches; if (this._isMultiTouch()) { switch (e) { case w: e = S; break; case b: e = T; break; case k: e = D } d(n, { touches: r }, t(r[0], r[1])) } return this.trigger(e, d(n, { type: e })) }, press: function(e, t, n) { this._apiCall("_start", e, t, n) }, move: function(e, t) { this._apiCall("_move", e, t) }, end: function(e, t) { this._apiCall("_end", e, t) }, _isMultiTouch: function() { return this.touches.length > 1 }, _maxTouchesReached: function() { return this.touches.length >= this._maxTouches }, _disposeAll: function() { for (var e = this.touches; e.length > 0;) e.pop().dispose() }, _isMoved: function() { return e.grep(this.touches, function(e) { return e.isMoved() }).length }, _select: function(e) { (!this.allowSelection || this.trigger(v, { event: e })) && e.preventDefault() }, _start: function(t) { var i, r, o = this, a = 0, s = o.filter, l = n(t), c = l.length, d = t.which; if (!(d && d > 1 || o._maxTouchesReached())) for (M.current = null, o.currentTarget = t.currentTarget, o.stopPropagation && t.stopPropagation(); c > a && !o._maxTouchesReached(); a++) r = l[a], i = s ? e(r.currentTarget) : o.element, i.length && (r = new P(o, i, r), o.touches.push(r), r.press(), o._isMultiTouch() && o.notify("gesturestart", {})) }, _move: function(e) { this._eachTouch("move", e) }, _end: function(e) { this._eachTouch("end", e) }, _eachTouch: function(e, t) { var i, r, o, a, s = this, l = {}, c = n(t), d = s.touches; for (i = 0; d.length > i; i++) r = d[i], l[r.id] = r; for (i = 0; c.length > i; i++) o = c[i], a = l[o.id], a && a[e](o) }, _apiCall: function(t, n, i, r) { this[t]({ api: !0, pageX: n, pageY: i, clientX: n, clientY: i, target: e(r || this.element)[0], stopPropagation: e.noop, preventDefault: e.noop }) } }); M.defaultThreshold = function(e) { f = e }, M.minHold = function(e) { p = e }, r.getTouches = n, r.touchDelta = t, r.UserEvents = M }(window.kendo.jQuery), function(e, t) { function n(t, n) { try { return e.contains(t, n) || t == n } catch (i) { return !1 } } function i(e, t) { return parseInt(e.css(t), 10) || 0 } function r(e, t) { return Math.min(Math.max(e, t.min), t.max) } function o(e, t) { var n = A(e), r = n.left + i(e, "borderLeftWidth") + i(e, "paddingLeft"), o = n.top + i(e, "borderTopWidth") + i(e, "paddingTop"), a = r + e.width() - t.outerWidth(!0), s = o + e.height() - t.outerHeight(!0); return { x: { min: r, max: a }, y: { min: o, max: s } } } function a(n, i, r) { for (var o, a, s = 0, l = i && i.length, c = r && r.length; n && n.parentNode;) { for (s = 0; l > s; s++) if (o = i[s], o.element[0] === n) return { target: o, targetElement: n }; for (s = 0; c > s; s++) if (a = r[s], e.contains(a.element[0], n) && w.matchesSelector.call(n, a.options.filter)) return { target: a, targetElement: n }; n = n.parentNode } return t } function s(e, t) { var n, i = t.options.group, r = e[i]; if (x.fn.destroy.call(t), r.length > 1) { for (n = 0; r.length > n; n++) if (r[n] == t) { r.splice(n, 1); break } } else r.length = 0, delete e[i] } function l(e) { var t, n, i, r = b.body; return e[0] === r ? (n = r.scrollTop, i = r.scrollLeft, { top: n, left: i, bottom: n + y.height(), right: i + y.width() }) : (t = e.offset(), t.bottom = t.top + e.height(), t.right = t.left + e.width(), t) } function c(e) { return e === b.body || e === b.documentElement || e === b } function d(t) { if (!t || c(t)) return e(b.body); for (var n = e(t)[0]; !_.isScrollable(n) && !c(n);) n = n.parentNode; return e(n) } function u(e, t, n) { var i = { x: 0, y: 0 }, r = 50; return r > e - n.left ? i.x = -(r - (e - n.left)) : r > n.right - e && (i.x = r - (n.right - e)), r > t - n.top ? i.y = -(r - (t - n.top)) : r > n.bottom - t && (i.y = r - (n.bottom - t)), i } var h, p, f, g, m, v, _ = window.kendo, w = _.support, b = window.document, y = e(window), k = _.Class, x = _.ui.Widget, C = _.Observable, S = _.UserEvents, T = e.proxy, D = e.extend, A = _.getOffset, E = {}, I = {}, P = {}, M = _.elementUnderCursor, z = "keyup", F = "change", R = "dragstart", H = "hold", B = "drag", L = "dragend", N = "dragcancel", O = "hintDestroyed", V = "dragenter", U = "dragleave", W = "drop", j = C.extend({ init: function(t, n) { var i = this, r = t[0]; i.capture = !1, r.addEventListener ? (e.each(_.eventMap.down.split(" "), function() { r.addEventListener(this, T(i._press, i), !0) }), e.each(_.eventMap.up.split(" "), function() { r.addEventListener(this, T(i._release, i), !0) })) : (e.each(_.eventMap.down.split(" "), function() { r.attachEvent(this, T(i._press, i)) }), e.each(_.eventMap.up.split(" "), function() { r.attachEvent(this, T(i._release, i)) })), C.fn.init.call(i), i.bind(["press", "release"], n || {}) }, captureNext: function() { this.capture = !0 }, cancelCapture: function() { this.capture = !1 }, _press: function(e) { var t = this; t.trigger("press"), t.capture && e.preventDefault() }, _release: function(e) { var t = this; t.trigger("release"), t.capture && (e.preventDefault(), t.cancelCapture()) } }), G = C.extend({ init: function(t) { var n = this; C.fn.init.call(n), n.forcedEnabled = !1, e.extend(n, t), n.scale = 1, n.horizontal ? (n.measure = "offsetWidth", n.scrollSize = "scrollWidth", n.axis = "x") : (n.measure = "offsetHeight", n.scrollSize = "scrollHeight", n.axis = "y") }, makeVirtual: function() { e.extend(this, { virtual: !0, forcedEnabled: !0, _virtualMin: 0, _virtualMax: 0 }) }, virtualSize: function(e, t) { (this._virtualMin !== e || this._virtualMax !== t) && (this._virtualMin = e, this._virtualMax = t, this.update()) }, outOfBounds: function(e) { return e > this.max || this.min > e }, forceEnabled: function() { this.forcedEnabled = !0 }, getSize: function() { return this.container[0][this.measure] }, getTotal: function() { return this.element[0][this.scrollSize] }, rescale: function(e) { this.scale = e }, update: function(e) { var t = this, n = t.virtual ? t._virtualMax : t.getTotal(), i = n * t.scale, r = t.getSize(); (0 !== n || t.forcedEnabled) && (t.max = t.virtual ? -t._virtualMin : 0, t.size = r, t.total = i, t.min = Math.min(t.max, r - i), t.minScale = r / n, t.centerOffset = (i - r) / 2, t.enabled = t.forcedEnabled || i > r, e || t.trigger(F, t)) } }), q = C.extend({ init: function(e) { var t = this; C.fn.init.call(t), t.x = new G(D({ horizontal: !0 }, e)), t.y = new G(D({ horizontal: !1 }, e)), t.container = e.container, t.forcedMinScale = e.minScale, t.maxScale = e.maxScale || 100, t.bind(F, e) }, rescale: function(e) { this.x.rescale(e), this.y.rescale(e), this.refresh() }, centerCoordinates: function() { return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) } }, refresh: function() { var e = this; e.x.update(), e.y.update(), e.enabled = e.x.enabled || e.y.enabled, e.minScale = e.forcedMinScale || Math.min(e.x.minScale, e.y.minScale), e.fitScale = Math.max(e.x.minScale, e.y.minScale), e.trigger(F) } }), $ = C.extend({ init: function(e) { var t = this; D(t, e), C.fn.init.call(t) }, outOfBounds: function() { return this.dimension.outOfBounds(this.movable[this.axis]) }, dragMove: function(e) { var t = this, n = t.dimension, i = t.axis, r = t.movable, o = r[i] + e; n.enabled && ((n.min > o && 0 > e || o > n.max && e > 0) && (e *= t.resistance), r.translateAxis(i, e), t.trigger(F, t)) } }), Y = k.extend({ init: function(e) { var t, n, i, r, o = this; D(o, { elastic: !0 }, e), i = o.elastic ? .5 : 0, r = o.movable, o.x = t = new $({ axis: "x", dimension: o.dimensions.x, resistance: i, movable: r }), o.y = n = new $({ axis: "y", dimension: o.dimensions.y, resistance: i, movable: r }), o.userEvents.bind(["move", "end", "gesturestart", "gesturechange"], { gesturestart: function(e) { o.gesture = e, o.offset = o.dimensions.container.offset() }, gesturechange: function(e) { var i, a, s, l = o.gesture, c = l.center, d = e.center, u = e.distance / l.distance, h = o.dimensions.minScale, p = o.dimensions.maxScale; h >= r.scale && 1 > u && (u += .8 * (1 - u)), r.scale * u >= p && (u = p / r.scale), a = r.x + o.offset.left, s = r.y + o.offset.top, i = { x: (a - c.x) * u + d.x - a, y: (s - c.y) * u + d.y - s }, r.scaleWith(u), t.dragMove(i.x), n.dragMove(i.y), o.dimensions.rescale(r.scale), o.gesture = e, e.preventDefault() }, move: function(e) { e.event.target.tagName.match(/textarea|input/i) || (t.dimension.enabled || n.dimension.enabled ? (t.dragMove(e.x.delta), n.dragMove(e.y.delta), e.preventDefault()) : e.touch.skip()) }, end: function(e) { e.preventDefault() } }) } }), Q = w.transitions.prefix + "Transform"; p = w.hasHW3D ? function(e, t, n) { return "translate3d(" + e + "px," + t + "px,0) scale(" + n + ")" } : function(e, t, n) { return "translate(" + e + "px," + t + "px) scale(" + n + ")" }, f = C.extend({ init: function(t) { var n = this; C.fn.init.call(n), n.element = e(t), n.element[0].style.webkitTransformOrigin = "left top", n.x = 0, n.y = 0, n.scale = 1, n._saveCoordinates(p(n.x, n.y, n.scale)) }, translateAxis: function(e, t) { this[e] += t, this.refresh() }, scaleTo: function(e) { this.scale = e, this.refresh() }, scaleWith: function(e) { this.scale *= e, this.refresh() }, translate: function(e) { this.x += e.x, this.y += e.y, this.refresh() }, moveAxis: function(e, t) { this[e] = t, this.refresh() }, moveTo: function(e) { D(this, e), this.refresh() }, refresh: function() { var e, t = this, n = t.x, i = t.y; t.round && (n = Math.round(n), i = Math.round(i)), e = p(n, i, t.scale), e != t.coordinates && (_.support.browser.msie && 10 > _.support.browser.version ? (t.element[0].style.position = "absolute", t.element[0].style.left = t.x + "px", t.element[0].style.top = t.y + "px") : t.element[0].style[Q] = e, t._saveCoordinates(e), t.trigger(F)) }, _saveCoordinates: function(e) { this.coordinates = e } }), g = x.extend({ init: function(e, t) { var n, i = this; x.fn.init.call(i, e, t), n = i.options.group, n in I ? I[n].push(i) : I[n] = [i] }, events: [V, U, W], options: { name: "DropTarget", group: "default" }, destroy: function() { s(I, this) }, _trigger: function(e, n) { var i = this, r = E[i.options.group]; return r ? i.trigger(e, D({}, n.event, { draggable: r, dropTarget: n.dropTarget })) : t }, _over: function(e) { this._trigger(V, e) }, _out: function(e) { this._trigger(U, e) }, _drop: function(e) { var t = this, n = E[t.options.group]; n && (n.dropped = !t._trigger(W, e)) } }), g.destroyGroup = function(e) { var t, n = I[e] || P[e]; if (n) { for (t = 0; n.length > t; t++) x.fn.destroy.call(n[t]); n.length = 0, delete I[e], delete P[e] } }, g._cache = I, m = g.extend({ init: function(e, t) { var n, i = this; x.fn.init.call(i, e, t), n = i.options.group, n in P ? P[n].push(i) : P[n] = [i] }, destroy: function() { s(P, this) }, options: { name: "DropTargetArea", group: "default", filter: null } }), v = x.extend({ init: function(e, t) { var n = this; x.fn.init.call(n, e, t), n._activated = !1, n.userEvents = new S(n.element, { global: !0, allowSelection: !0, filter: n.options.filter, threshold: n.options.distance, start: T(n._start, n), hold: T(n._hold, n), move: T(n._drag, n), end: T(n._end, n), cancel: T(n._cancel, n), select: T(n._select, n) }), n._afterEndHandler = T(n._afterEnd, n), n._captureEscape = T(n._captureEscape, n) }, events: [H, R, B, L, N, O], options: { name: "Draggable", distance: _.support.touch ? 0 : 5, group: "default", cursorOffset: null, axis: null, container: null, filter: null, ignore: null, holdToDrag: !1, autoScroll: !1, dropped: !1 }, cancelHold: function() { this._activated = !1 }, _captureEscape: function(e) { var t = this; e.keyCode === _.keys.ESC && (t._trigger(N, { event: e }), t.userEvents.cancel()) }, _updateHint: function(t) { var n, i = this, o = i.options, a = i.boundaries, s = o.axis, l = i.options.cursorOffset; l ? n = { left: t.x.location + l.left, top: t.y.location + l.top } : (i.hintOffset.left += t.x.delta, i.hintOffset.top += t.y.delta, n = e.extend({}, i.hintOffset)), a && (n.top = r(n.top, a.y), n.left = r(n.left, a.x)), "x" === s ? delete n.top : "y" === s && delete n.left, i.hint.css(n) }, _shouldIgnoreTarget: function(t) { var n = this.options.ignore; return n && e(t).is(n) }, _select: function(e) { this._shouldIgnoreTarget(e.event.target) || e.preventDefault() }, _start: function(n) { var i, r = this, a = r.options, s = a.container, l = a.hint; return this._shouldIgnoreTarget(n.touch.initialTouch) || a.holdToDrag && !r._activated ? (r.userEvents.cancel(), t) : (r.currentTarget = n.target, r.currentTargetOffset = A(r.currentTarget), l && (r.hint && r.hint.stop(!0, !0).remove(), r.hint = _.isFunction(l) ? e(l.call(r, r.currentTarget)) : l, i = A(r.currentTarget), r.hintOffset = i, r.hint.css({ position: "absolute", zIndex: 2e4, left: i.left, top: i.top }).appendTo(b.body), r.angular("compile", function() { r.hint.removeAttr("ng-repeat"); for (var t = e(n.target); !t.data("$$kendoScope") && t.length;) t = t.parent(); return { elements: r.hint.get(), scopeFrom: t.data("$$kendoScope") } })), E[a.group] = r, r.dropped = !1, s && (r.boundaries = o(s, r.hint)), e(b).on(z, r._captureEscape), r._trigger(R, n) && (r.userEvents.cancel(), r._afterEnd()), r.userEvents.capture(), t) }, _hold: function(e) { this.currentTarget = e.target, this._trigger(H, e) ? this.userEvents.cancel() : this._activated = !0 }, _drag: function(n) { var i, r, o = this; n.preventDefault(), i = this._elementUnderCursor(n), o._withDropTarget(i, function(i, r) { if (!i) return h && (h._trigger(U, D(n, { dropTarget: e(h.targetElement) })), h = null), t; if (h) { if (r === h.targetElement) return; h._trigger(U, D(n, { dropTarget: e(h.targetElement) })) } i._trigger(V, D(n, { dropTarget: e(r) })), h = D(i, { targetElement: r }) }), o._trigger(B, D(n, { dropTarget: h, elementUnderCursor: i })), this.options.autoScroll && (this._cursorElement !== i && (this._scrollableParent = d(i), this._cursorElement = i), this._scrollableParent[0] && (r = u(n.x.location, n.y.location, l(this._scrollableParent)), this._scrollCompenstation = e.extend({}, this.hintOffset), this._scrollVelocity = r, 0 === r.y && 0 === r.x ? (clearInterval(this._scrollInterval), this._scrollInterval = null) : this._scrollInterval || (this._scrollInterval = setInterval(e.proxy(this, "_autoScroll"), 50)))), o.hint && o._updateHint(n) }, _autoScroll: function() { var e, t, n, i, r, o, a, s = this._scrollableParent[0], l = this._scrollVelocity, c = this._scrollCompenstation; s && (n = s === b.body, n ? (e = b.body.offsetHeight > y.height(), t = b.body.offsetWidth > y.width()) : (e = s.scrollHeight >= s.offsetHeight, t = s.scrollWidth >= s.offsetWidth), i = s.scrollTop + l.y, r = e && i > 0 && s.scrollHeight > i, o = s.scrollLeft + l.x, a = t && o > 0 && s.scrollWidth > o, r && (s.scrollTop += l.y), a && (s.scrollLeft += l.x), n && (a || r) && (r && (c.top += l.y), a && (c.left += l.x), this.hint.css(c))) }, _end: function(t) { this._withDropTarget(this._elementUnderCursor(t), function(n, i) { n && (n._drop(D({}, t, { dropTarget: e(i) })), h = null) }), this._trigger(L, t), this._cancel(t.event) }, _cancel: function() { var e = this; e._scrollableParent = null, clearInterval(this._scrollInterval), e._activated = !1, e.hint && !e.dropped ? setTimeout(function() { e.hint.stop(!0, !0).animate(e.currentTargetOffset, "fast", e._afterEndHandler) }, 0) : e._afterEnd() }, _trigger: function(e, t) { var n = this; return n.trigger(e, D({}, t.event, { x: t.x, y: t.y, currentTarget: n.currentTarget, initialTarget: t.touch ? t.touch.initialTouch : null, dropTarget: t.dropTarget, elementUnderCursor: t.elementUnderCursor })) }, _elementUnderCursor: function(e) { var t = M(e), i = this.hint; return i && n(i[0], t) && (i.hide(), t = M(e), t || (t = M(e)), i.show()), t }, _withDropTarget: function(e, t) { var n, i = this.options.group, r = I[i], o = P[i]; (r && r.length || o && o.length) && (n = a(e, r, o), n ? t(n.target, n.targetElement) : t()) }, destroy: function() { var e = this; x.fn.destroy.call(e), e._afterEnd(), e.userEvents.destroy(), this._scrollableParent = null, this._cursorElement = null, clearInterval(this._scrollInterval), e.currentTarget = null }, _afterEnd: function() { var t = this; t.hint && t.hint.remove(), delete E[t.options.group], t.trigger("destroy"), t.trigger(O), e(b).off(z, t._captureEscape) } }), _.ui.plugin(g), _.ui.plugin(m), _.ui.plugin(v), _.TapCapture = j, _.containerBoundaries = o, D(_.ui, { Pane: Y, PaneDimensions: q, Movable: f }), _.ui.Draggable.utils = { autoScrollVelocity: u, scrollableViewPort: l, findScrollableParent: d } }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.mobile, r = n.effects, o = i.ui, a = e.proxy, s = e.extend, l = o.Widget, c = n.Class, d = n.ui.Movable, u = n.ui.Pane, h = n.ui.PaneDimensions, p = r.Transition, f = r.Animation, g = Math.abs, m = 500, v = .7, _ = .96, w = 10, b = 55, y = .5, k = 5, x = "km-scroller-release", C = "km-scroller-refresh", S = "pull", T = "change", D = "resize", A = "scroll", E = 2, I = f.extend({ init: function(e) { var t = this; f.fn.init.call(t), s(t, e), t.userEvents.bind("gestureend", a(t.start, t)), t.tapCapture.bind("press", a(t.cancel, t)) }, enabled: function() { return this.dimensions.minScale > this.movable.scale }, done: function() { return .01 > this.dimensions.minScale - this.movable.scale }, tick: function() { var e = this.movable; e.scaleWith(1.1), this.dimensions.rescale(e.scale) }, onEnd: function() { var e = this.movable; e.scaleTo(this.dimensions.minScale), this.dimensions.rescale(e.scale) } }), P = f.extend({ init: function(e) { var t = this; f.fn.init.call(t), s(t, e, { transition: new p({ axis: e.axis, movable: e.movable, onEnd: function() { t._end() } }) }), t.tapCapture.bind("press", function() { t.cancel() }), t.userEvents.bind("end", a(t.start, t)), t.userEvents.bind("gestureend", a(t.start, t)), t.userEvents.bind("tap", a(t.onEnd, t)) }, onCancel: function() { this.transition.cancel() }, freeze: function(e) { var t = this; t.cancel(), t._moveTo(e) }, onEnd: function() { var e = this; e.paneAxis.outOfBounds() ? e._snapBack() : e._end() }, done: function() { return g(this.velocity) < 1 }, start: function(e) { var t, n = this; n.dimension.enabled && (n.paneAxis.outOfBounds() ? n._snapBack() : (t = e.touch.id === E ? 0 : e.touch[n.axis].velocity, n.velocity = Math.max(Math.min(t * n.velocityMultiplier, b), -b), n.tapCapture.captureNext(), f.fn.start.call(n))) }, tick: function() { var e = this, t = e.dimension, n = e.paneAxis.outOfBounds() ? y : e.friction, i = e.velocity *= n, r = e.movable[e.axis] + i; !e.elastic && t.outOfBounds(r) && (r = Math.max(Math.min(r, t.max), t.min), e.velocity = 0), e.movable.moveAxis(e.axis, r) }, _end: function() { this.tapCapture.cancelCapture(), this.end() }, _snapBack: function() { var e = this, t = e.dimension, n = e.movable[e.axis] > t.max ? t.max : t.min; e._moveTo(n) }, _moveTo: function(e) { this.transition.moveTo({ location: e, duration: m, ease: p.easeOutExpo }) } }), M = f.extend({ init: function(e) { var t = this; n.effects.Animation.fn.init.call(this), s(t, e, { origin: {}, destination: {}, offset: {} }) }, tick: function() { this._updateCoordinates(), this.moveTo(this.origin) }, done: function() { return g(this.offset.y) < k && g(this.offset.x) < k }, onEnd: function() { this.moveTo(this.destination), this.callback && this.callback.call() }, setCoordinates: function(e, t) { this.offset = {}, this.origin = e, this.destination = t }, setCallback: function(e) { e && n.isFunction(e) ? this.callback = e : e = t }, _updateCoordinates: function() { this.offset = { x: (this.destination.x - this.origin.x) / 4, y: (this.destination.y - this.origin.y) / 4 }, this.origin = { y: this.origin.y + this.offset.y, x: this.origin.x + this.offset.x } } }), z = c.extend({ init: function(t) { var n = this, i = "x" === t.axis, r = e('<div class="km-touch-scrollbar km-' + (i ? "horizontal" : "vertical") + '-scrollbar" />'); s(n, t, { element: r, elementSize: 0, movable: new d(r), scrollMovable: t.movable, alwaysVisible: t.alwaysVisible, size: i ? "width" : "height" }), n.scrollMovable.bind(T, a(n.refresh, n)), n.container.append(r), t.alwaysVisible && n.show() }, refresh: function() { var e = this, t = e.axis, n = e.dimension, i = n.size, r = e.scrollMovable, o = i / n.total, a = Math.round(-r[t] * o), s = Math.round(i * o); o >= 1 ? this.element.css("display", "none") : this.element.css("display", ""), a + s > i ? s = i - a : 0 > a && (s += a, a = 0), e.elementSize != s && (e.element.css(e.size, s + "px"), e.elementSize = s), e.movable.moveAxis(t, a) }, show: function() { this.element.css({ opacity: v, visibility: "visible" }) }, hide: function() { this.alwaysVisible || this.element.css({ opacity: 0 }) } }), F = l.extend({ init: function(i, r) { var o, c, p, f, m, v, _, w, b, y = this; return l.fn.init.call(y, i, r), i = y.element, (y._native = y.options.useNative && n.support.hasNativeScrolling) ? (i.addClass("km-native-scroller").prepend('<div class="km-scroll-header"/>'), s(y, { scrollElement: i, fixedContainer: i.children().first() }), t) : (i.css("overflow", "hidden").addClass("km-scroll-wrapper").wrapInner('<div class="km-scroll-container"/>').prepend('<div class="km-scroll-header"/>'), o = i.children().eq(1), c = new n.TapCapture(i), p = new d(o), f = new h({ element: o, container: i, forcedEnabled: y.options.zoom }), m = this.options.avoidScrolling, v = new n.UserEvents(i, { allowSelection: !0, preventDragEvent: !0, captureUpIfMoved: !0, multiTouch: y.options.zoom, start: function(t) { f.refresh(); var n = g(t.x.velocity), i = g(t.y.velocity), r = 2 * n >= i, o = e.contains(y.fixedContainer[0], t.event.target), a = 2 * i >= n; !o && !m(t) && y.enabled && (f.x.enabled && r || f.y.enabled && a) ? v.capture() : v.cancel() } }), _ = new u({ movable: p, dimensions: f, userEvents: v, elastic: y.options.elastic }), w = new I({ movable: p, dimensions: f, userEvents: v, tapCapture: c }), b = new M({ moveTo: function(e) { y.scrollTo(e.x, e.y) } }), p.bind(T, function() { y.scrollTop = -p.y, y.scrollLeft = -p.x, y.trigger(A, { scrollTop: y.scrollTop, scrollLeft: y.scrollLeft }) }), y.options.mousewheelScrolling && i.on("DOMMouseScroll mousewheel", a(this, "_wheelScroll")), s(y, { movable: p, dimensions: f, zoomSnapBack: w, animatedScroller: b, userEvents: v, pane: _, tapCapture: c, pulled: !1, enabled: !0, scrollElement: o, scrollTop: 0, scrollLeft: 0, fixedContainer: i.children().first() }), y._initAxis("x"), y._initAxis("y"), y._wheelEnd = function() { y._wheel = !1, y.userEvents.end(0, y._wheelY) }, f.refresh(), y.options.pullToRefresh && y._initPullToRefresh(), t) }, _wheelScroll: function(e) { this._wheel || (this._wheel = !0, this._wheelY = 0, this.userEvents.press(0, this._wheelY)), clearTimeout(this._wheelTimeout), this._wheelTimeout = setTimeout(this._wheelEnd, 50); var t = n.wheelDeltaY(e); t && (this._wheelY += t, this.userEvents.move(0, this._wheelY)), e.preventDefault() }, makeVirtual: function() { this.dimensions.y.makeVirtual() }, virtualSize: function(e, t) { this.dimensions.y.virtualSize(e, t) }, height: function() { return this.dimensions.y.size }, scrollHeight: function() { return this.scrollElement[0].scrollHeight }, scrollWidth: function() { return this.scrollElement[0].scrollWidth }, options: { name: "Scroller", zoom: !1, pullOffset: 140, visibleScrollHints: !1, elastic: !0, useNative: !1, mousewheelScrolling: !0, avoidScrolling: function() { return !1 }, pullToRefresh: !1, messages: { pullTemplate: "Pull to refresh", releaseTemplate: "Release to refresh", refreshTemplate: "Refreshing" } }, events: [S, A, D], _resize: function() { this._native || this.contentResized() }, setOptions: function(e) { var t = this; l.fn.setOptions.call(t, e), e.pullToRefresh && t._initPullToRefresh() }, reset: function() { this._native ? this.scrollElement.scrollTop(0) : (this.movable.moveTo({ x: 0, y: 0 }), this._scale(1)) }, contentResized: function() { this.dimensions.refresh(), this.pane.x.outOfBounds() && this.movable.moveAxis("x", this.dimensions.x.min), this.pane.y.outOfBounds() && this.movable.moveAxis("y", this.dimensions.y.min) }, zoomOut: function() { var e = this.dimensions; e.refresh(), this._scale(e.fitScale), this.movable.moveTo(e.centerCoordinates()) }, enable: function() { this.enabled = !0 }, disable: function() { this.enabled = !1 }, scrollTo: function(e, t) { this._native ? (this.scrollElement.scrollLeft(g(e)), this.scrollElement.scrollTop(g(t))) : (this.dimensions.refresh(), this.movable.moveTo({ x: e, y: t })) }, animatedScrollTo: function(e, t, n) { var i, r; this._native ? this.scrollTo(e, t) : (i = { x: this.movable.x, y: this.movable.y }, r = { x: e, y: t }, this.animatedScroller.setCoordinates(i, r), this.animatedScroller.setCallback(n), this.animatedScroller.start()) }, pullHandled: function() { var e = this; e.refreshHint.removeClass(C), e.hintContainer.html(e.pullTemplate({})), e.yinertia.onEnd(), e.xinertia.onEnd(), e.userEvents.cancel() }, destroy: function() { l.fn.destroy.call(this), this.userEvents && this.userEvents.destroy() }, _scale: function(e) { this.dimensions.rescale(e), this.movable.scaleTo(e) }, _initPullToRefresh: function() { var e = this; e.dimensions.y.forceEnabled(), e.pullTemplate = n.template(e.options.messages.pullTemplate), e.releaseTemplate = n.template(e.options.messages.releaseTemplate), e.refreshTemplate = n.template(e.options.messages.refreshTemplate), e.scrollElement.prepend('<span class="km-scroller-pull"><span class="km-icon"></span><span class="km-loading-left"></span><span class="km-loading-right"></span><span class="km-template">' + e.pullTemplate({}) + "</span></span>"), e.refreshHint = e.scrollElement.children().first(), e.hintContainer = e.refreshHint.children(".km-template"), e.pane.y.bind("change", a(e._paneChange, e)), e.userEvents.bind("end", a(e._dragEnd, e)) }, _dragEnd: function() { var e = this; e.pulled && (e.pulled = !1, e.refreshHint.removeClass(x).addClass(C), e.hintContainer.html(e.refreshTemplate({})), e.yinertia.freeze(e.options.pullOffset / 2), e.trigger("pull")) }, _paneChange: function() { var e = this; e.movable.y / y > e.options.pullOffset ? e.pulled || (e.pulled = !0, e.refreshHint.removeClass(C).addClass(x), e.hintContainer.html(e.releaseTemplate({}))) : e.pulled && (e.pulled = !1, e.refreshHint.removeClass(x), e.hintContainer.html(e.pullTemplate({}))) }, _initAxis: function(e) { var t = this, n = t.movable, i = t.dimensions[e], r = t.tapCapture, o = t.pane[e], a = new z({ axis: e, movable: n, dimension: i, container: t.element, alwaysVisible: t.options.visibleScrollHints }); i.bind(T, function() { a.refresh() }), o.bind(T, function() { a.show() }), t[e + "inertia"] = new P({ axis: e, paneAxis: o, movable: n, tapCapture: r, userEvents: t.userEvents, dimension: i, elastic: t.options.elastic, friction: t.options.friction || _, velocityMultiplier: t.options.velocityMultiplier || w, end: function() { a.hide(), t.trigger("scrollEnd", { axis: e, scrollTop: t.scrollTop, scrollLeft: t.scrollLeft }) } }) } }); o.plugin(F) }(window.kendo.jQuery), function(e, t) { function n(e) { return e.position().top + 3 } var i = window.kendo, r = i.ui.Widget, o = e.proxy, a = !1, s = ".kendoGroupable", l = "change", c = i.template('<div class="k-group-indicator" data-#=data.ns#field="${data.field}" data-#=data.ns#title="${data.title || ""}" data-#=data.ns#dir="${data.dir || "asc"}"><a href="\\#" class="k-link"><span class="k-icon k-si-arrow-${(data.dir || "asc") == "asc" ? "n" : "s"}">(sorted ${(data.dir || "asc") == "asc" ? "ascending": "descending"})</span>${data.title ? data.title: data.field}</a><a class="k-button k-button-icon k-button-bare"><span class="k-icon k-group-delete"></span></a></div>', { useWithBlock: !1 }), d = function(t) { return e('<div class="k-header k-drag-clue" />').css({ width: t.width(), paddingLeft: t.css("paddingLeft"), paddingRight: t.css("paddingRight"), lineHeight: t.height() + "px", paddingTop: t.css("paddingTop"), paddingBottom: t.css("paddingBottom") }).html(t.attr(i.attr("title")) || t.attr(i.attr("field"))).prepend('<span class="k-icon k-drag-status k-denied" />') }, u = e('<div class="k-grouping-dropclue"/>'), h = r.extend({ init: function(c, h) { var p, f, g = this, m = i.guid(), v = o(g._intializePositions, g), _ = g._dropCuePositions = []; r.fn.init.call(g, c, h), a = i.support.isRtl(c), f = a ? "right" : "left", g.draggable = p = g.options.draggable || new i.ui.Draggable(g.element, { filter: g.options.draggableElements, hint: d, group: m }), g.groupContainer = e(g.options.groupContainer, g.element).kendoDropTarget({ group: p.options.group, dragenter: function(e) { g._canDrag(e.draggable.currentTarget) && (e.draggable.hint.find(".k-drag-status").removeClass("k-denied").addClass("k-add"), u.css("top", n(g.groupContainer)).css(f, 0).appendTo(g.groupContainer)) }, dragleave: function(e) { e.draggable.hint.find(".k-drag-status").removeClass("k-add").addClass("k-denied"), u.remove() }, drop: function(t) { var n, r = t.draggable.currentTarget, o = r.attr(i.attr("field")), s = r.attr(i.attr("title")), l = g.indicator(o), c = g._dropCuePositions, d = c[c.length - 1]; (r.hasClass("k-group-indicator") || g._canDrag(r)) && (d ? (n = g._dropCuePosition(i.getOffset(u).left + parseInt(d.element.css("marginLeft"), 10) * (a ? -1 : 1) + parseInt(d.element.css("marginRight"), 10)), n && g._canDrop(e(l), n.element, n.left) && (n.before ? n.element.before(l || g.buildIndicator(o, s)) : n.element.after(l || g.buildIndicator(o, s)), g._change())) : (g.groupContainer.append(g.buildIndicator(o, s)), g._change())) } }).kendoDraggable({ filter: "div.k-group-indicator", hint: d, group: p.options.group, dragcancel: o(g._dragCancel, g), dragstart: function(e) { var t = e.currentTarget, i = parseInt(t.css("marginLeft"), 10), r = t.position(), o = a ? r.left - i : r.left + t.outerWidth(); v(), u.css({ top: n(g.groupContainer), left: o }).appendTo(g.groupContainer), this.hint.find(".k-drag-status").removeClass("k-denied").addClass("k-add") }, dragend: function() { g._dragEnd(this) }, drag: o(g._drag, g) }).on("click" + s, ".k-button", function(t) { t.preventDefault(), g._removeIndicator(e(this).parent()) }).on("click" + s, ".k-link", function(t) { var n = e(this).parent(), r = g.buildIndicator(n.attr(i.attr("field")), n.attr(i.attr("title")), "asc" == n.attr(i.attr("dir")) ? "desc" : "asc"); n.before(r).remove(), g._change(), t.preventDefault() }), p.bind(["dragend", "dragcancel", "dragstart", "drag"], { dragend: function() { g._dragEnd(this) }, dragcancel: o(g._dragCancel, g), dragstart: function(e) { var n, i, r; return g.options.allowDrag || g._canDrag(e.currentTarget) ? (v(), _.length ? (n = _[_.length - 1].element, i = parseInt(n.css("marginRight"), 10), r = n.position().left + n.outerWidth() + i) : r = 0, t) : (e.preventDefault(), t) }, drag: o(g._drag, g) }), g.dataSource = g.options.dataSource, g.dataSource && g._refreshHandler ? g.dataSource.unbind(l, g._refreshHandler) : g._refreshHandler = o(g.refresh, g), g.dataSource && (g.dataSource.bind("change", g._refreshHandler), g.refresh()) }, refresh: function() { var t = this, n = t.dataSource; t.groupContainer && t.groupContainer.empty().append(e.map(n.group() || [], function(n) { var r = n.field, o = i.attr("field"), a = t.element.find(t.options.filter).filter(function() { return e(this).attr(o) === r }); return t.buildIndicator(n.field, a.attr(i.attr("title")), n.dir) }).join("")), t._invalidateGroupContainer() }, destroy: function() { var e = this; r.fn.destroy.call(e), e.groupContainer.off(s), e.groupContainer.data("kendoDropTarget") && e.groupContainer.data("kendoDropTarget").destroy(), e.groupContainer.data("kendoDraggable") && e.groupContainer.data("kendoDraggable").destroy(), e.options.draggable || e.draggable.destroy(), e.dataSource && e._refreshHandler && (e.dataSource.unbind("change", e._refreshHandler), e._refreshHandler = null), e.groupContainer = e.element = e.draggable = null }, options: { name: "Groupable", filter: "th", draggableElements: "th", messages: { empty: "Drag a column header and drop it here to group by that column" } }, indicator: function(t) { var n = e(".k-group-indicator", this.groupContainer); return e.grep(n, function(n) { return e(n).attr(i.attr("field")) === t })[0] }, buildIndicator: function(e, t, n) { return c({ field: e.replace(/"/g, "'"), dir: n, title: t, ns: i.ns }) }, descriptors: function() { var t, n, r, o, a, s = this, l = e(".k-group-indicator", s.groupContainer); return t = s.element.find(s.options.filter).map(function() { var t = e(this), r = t.attr(i.attr("aggregates")), s = t.attr(i.attr("field")); if (r && "" !== r) for (n = r.split(","), r = [], o = 0, a = n.length; a > o; o++) r.push({ field: s, aggregate: n[o] }); return r }).toArray(), e.map(l, function(n) { return n = e(n), r = n.attr(i.attr("field")), { field: r, dir: n.attr(i.attr("dir")), aggregates: t || [] } }) }, _removeIndicator: function(e) { var t = this; e.remove(), t._invalidateGroupContainer(), t._change() }, _change: function() { var e = this; e.dataSource && e.dataSource.group(e.descriptors()) }, _dropCuePosition: function(t) { var n, i, r, o, s, l = this._dropCuePositions; if (u.is(":visible") && 0 !== l.length) return t = Math.ceil(t), n = l[l.length - 1], i = n.left, r = n.right, o = parseInt(n.element.css("marginLeft"), 10), s = parseInt(n.element.css("marginRight"), 10), t >= r && !a || i > t && a ? t = { left: n.element.position().left + (a ? -o : n.element.outerWidth() + s), element: n.element, before: !1 } : (t = e.grep(l, function(e) { return t >= e.left && e.right >= t || a && t > e.right })[0], t && (t = { left: a ? t.element.position().left + t.element.outerWidth() + s : t.element.position().left - o, element: t.element, before: !0 })), t }, _drag: function(e) { var t = this._dropCuePosition(e.x.location); t && u.css({ left: t.left, right: "auto" }) }, _canDrag: function(e) { var t = e.attr(i.attr("field")); return "false" != e.attr(i.attr("groupable")) && t && (e.hasClass("k-group-indicator") || !this.indicator(t)) }, _canDrop: function(e, t, n) { var i = e.next(), r = e[0] !== t[0] && (!i[0] || t[0] !== i[0] || !a && n > i.position().left || a && n < i.position().left); return r }, _dragEnd: function(t) { var n = this, r = t.currentTarget.attr(i.attr("field")), o = n.indicator(r); t !== n.options.draggable && !t.dropped && o && n._removeIndicator(e(o)), n._dragCancel() }, _dragCancel: function() { u.remove(), this._dropCuePositions = [] }, _intializePositions: function() { var t, n = this, r = e(".k-group-indicator", n.groupContainer); n._dropCuePositions = e.map(r, function(n) { return n = e(n), t = i.getOffset(n).left, { left: parseInt(t, 10), right: parseInt(t + n.outerWidth(), 10), element: n } }) }, _invalidateGroupContainer: function() { var e = this.groupContainer; e && e.is(":empty") && e.html(this.options.messages.empty) } }); i.ui.plugin(h) }(window.kendo.jQuery), function(e) { function t(t, n) { t = e(t), n ? t.find(".k-drag-status").removeClass("k-add").addClass("k-denied") : t.find(".k-drag-status").removeClass("k-denied").addClass("k-add") } var n = window.kendo, i = n.getOffset, r = n.ui.Widget, o = "change", a = "k-reorderable", s = r.extend({ init: function(s, l) { var c, d = this, u = n.guid() + "-reorderable"; r.fn.init.call(d, s, l), s = d.element.addClass(a), l = d.options, d.draggable = c = l.draggable || new n.ui.Draggable(s, { group: u, filter: l.filter, hint: l.hint }), d.reorderDropCue = e('<div class="k-reorder-cue"><div class="k-icon k-i-arrow-s"></div><div class="k-icon k-i-arrow-n"></div></div>'), s.find(c.options.filter).kendoDropTarget({ group: c.options.group, dragenter: function(e) { var n, r, o, a; d._draggable && (n = this.element, o = !d._dropTargetAllowed(n) || d._isLastDraggable(), t(e.draggable.hint, o), o || (r = i(n), a = r.left, l.inSameContainer && !l.inSameContainer({ source: n, target: d._draggable, sourceIndex: d._index(n), targetIndex: d._index(d._draggable) }) ? d._dropTarget = n : d._index(n) > d._index(d._draggable) && (a += n.outerWidth()), d.reorderDropCue.css({ height: n.outerHeight(), top: r.top, left: a }).appendTo(document.body))) }, dragleave: function(e) { t(e.draggable.hint, !0), d.reorderDropCue.remove(), d._dropTarget = null }, drop: function() { var e, t, n; d._dropTarget = null, d._draggable && (e = this.element, t = d._draggable, n = !1, d._dropTargetAllowed(e) && !d._isLastDraggable() && d.trigger(o, { element: d._draggable, target: e, oldIndex: d._index(t), newIndex: d._index(e), position: i(d.reorderDropCue).left > i(e).left ? "after" : "before" })) } }), c.bind(["dragcancel", "dragend", "dragstart", "drag"], { dragcancel: function() { d.reorderDropCue.remove(), d._draggable = null, d._elements = null }, dragend: function() { d.reorderDropCue.remove(), d._draggable = null, d._elements = null }, dragstart: function(e) { d._draggable = e.currentTarget, d._elements = d.element.find(d.draggable.options.filter) }, drag: function(e) { var t, n; d._dropTarget && !this.hint.find(".k-drag-status").hasClass("k-denied") && (t = i(d._dropTarget).left, n = d._dropTarget.outerWidth(), d.reorderDropCue.css(e.pageX > t + n / 2 ? { left: t + n } : { left: t })) } }) }, options: { name: "Reorderable", filter: "*" }, events: [o], _isLastDraggable: function() { var e, t = this.options.inSameContainer, n = this._draggable[0], i = this._elements.get(), r = !1; if (!t) return !1; for (; !r && i.length > 0;) e = i.pop(), r = n !== e && t({ source: n, target: e, sourceIndex: this._index(n), targetIndex: this._index(e) }); return !r }, _dropTargetAllowed: function(e) { var t = this.options.inSameContainer, n = this.options.dragOverContainers, i = this._draggable; return i[0] === e[0] ? !1 : t && n ? t({ source: i, target: e, sourceIndex: this._index(i), targetIndex: this._index(e) }) ? !0 : n(this._index(i), this._index(e)) : !0 }, _index: function(e) { return this._elements.index(e) }, destroy: function() { var t = this; r.fn.destroy.call(t), t.element.find(t.draggable.options.filter).each(function() { var t = e(this); t.data("kendoDropTarget") && t.data("kendoDropTarget").destroy() }), t.draggable && (t.draggable.destroy(), t.draggable.element = t.draggable = null), t.elements = t.reorderDropCue = t._elements = t._draggable = null } }); n.ui.plugin(s) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui, r = i.Widget, o = e.proxy, a = n.isFunction, s = e.extend, l = "horizontal", c = "vertical", d = "start", u = "resize", h = "resizeend", p = r.extend({ init: function(e, t) { var n = this; r.fn.init.call(n, e, t), n.orientation = n.options.orientation.toLowerCase() != c ? l : c, n._positionMouse = n.orientation == l ? "x" : "y", n._position = n.orientation == l ? "left" : "top", n._sizingDom = n.orientation == l ? "outerWidth" : "outerHeight", n.draggable = new i.Draggable(e, { distance: 1, filter: t.handle, drag: o(n._resize, n), dragcancel: o(n._cancel, n), dragstart: o(n._start, n), dragend: o(n._stop, n) }), n.userEvents = n.draggable.userEvents }, events: [u, h, d], options: { name: "Resizable", orientation: l }, resize: function() {}, _max: function(e) { var n = this, i = n.hint ? n.hint[n._sizingDom]() : 0, r = n.options.max; return a(r) ? r(e) : r !== t ? n._initialElementPosition + r - i : r }, _min: function(e) { var n = this, i = n.options.min; return a(i) ? i(e) : i !== t ? n._initialElementPosition + i : i }, _start: function(t) { var n = this, i = n.options.hint, r = e(t.currentTarget); n._initialElementPosition = r.position()[n._position], n._initialMousePosition = t[n._positionMouse].startLocation, i && (n.hint = a(i) ? e(i(r)) : i, n.hint.css({ position: "absolute" }).css(n._position, n._initialElementPosition).appendTo(n.element)), n.trigger(d, t), n._maxPosition = n._max(t), n._minPosition = n._min(t), e(document.body).css("cursor", r.css("cursor")) }, _resize: function(e) { var n, i = this, r = i._maxPosition, o = i._minPosition, a = i._initialElementPosition + (e[i._positionMouse].location - i._initialMousePosition); n = o !== t ? Math.max(o, a) : a, i.position = n = r !== t ? Math.min(r, n) : n, i.hint && i.hint.toggleClass(i.options.invalidClass || "", n == r || n == o).css(i._position, n), i.resizing = !0, i.trigger(u, s(e, { position: n })) }, _stop: function(t) { var n = this; n.hint && n.hint.remove(), n.resizing = !1, n.trigger(h, s(t, { position: n.position })), e(document.body).css("cursor", "") }, _cancel: function(e) { var n = this; n.hint && (n.position = t, n.hint.css(n._position, n._initialElementPosition), n._stop(e)) }, destroy: function() { var e = this; r.fn.destroy.call(e), e.draggable && e.draggable.destroy() }, press: function(e) { if (e) { var t = e.position(), n = this; n.userEvents.press(t.left, t.top, e[0]), n.targetPosition = t, n.target = e } }, move: function(e) { var n = this, i = n._position, r = n.targetPosition, o = n.position; o === t && (o = r[i]), r[i] = o + e, n.userEvents.move(r.left, r.top) }, end: function() { this.userEvents.end(), this.target = this.position = t } }); n.ui.plugin(p) }(window.kendo.jQuery), function(e, t) { function n(t, n) { try { return e.contains(t, n) || t == n } catch (i) { return !1 } } function i(e) { return e.clone() } function r(e) { return e.clone().removeAttr("id").css("visibility", "hidden") } var o = window.kendo, a = o.ui.Widget, s = "start", l = "beforeMove", c = "move", d = "end", u = "change", h = "cancel", p = "sort", f = "remove", g = "receive", m = ">*", v = -1, _ = a.extend({ init: function(e, t) { var n = this; a.fn.init.call(n, e, t), n.options.placeholder || (n.options.placeholder = r), n.options.hint || (n.options.hint = i), n._draggable = n._createDraggable() }, events: [s, l, c, d, u, h], options: { name: "Sortable", hint: null, placeholder: null, filter: m, holdToDrag: !1, disabled: null, container: null, connectWith: null, handler: null, cursorOffset: null, axis: null, ignore: null, autoScroll: !1, cursor: "auto" }, destroy: function() { this._draggable.destroy(), a.fn.destroy.call(this) }, _createDraggable: function() { var t = this, n = t.element, i = t.options; return new o.ui.Draggable(n, { filter: i.filter, hint: o.isFunction(i.hint) ? i.hint : e(i.hint), holdToDrag: i.holdToDrag, container: i.container ? e(i.container) : null, cursorOffset: i.cursorOffset, axis: i.axis, ignore: i.ignore, autoScroll: i.autoScroll, dragstart: e.proxy(t._dragstart, t), dragcancel: e.proxy(t._dragcancel, t), drag: e.proxy(t._drag, t), dragend: e.proxy(t._dragend, t) }) }, _dragstart: function(t) { var n = this.draggedElement = t.currentTarget, i = (t.target || o.elementUnderCursor(t), this.options.disabled), r = this.options.handler, a = this.options.placeholder, l = this.placeholder = e(o.isFunction(a) ? a.call(this, n) : a); i && n.is(i) ? t.preventDefault() : r && !e(t.initialTarget).is(r) ? t.preventDefault() : this.trigger(s, { item: n, draggableEvent: t }) ? t.preventDefault() : (n.css("display", "none"), n.before(l), this._setCursor()) }, _dragcancel: function() { this._cancel(), this.trigger(h, { item: this.draggedElement }), this._resetCursor() }, _drag: function(n) { var i, r, o, a, s, l = this.draggedElement, c = this._findTarget(n), d = { left: n.x.location, top: n.y.location }, u = { x: n.x.delta, y: n.y.delta }, h = this.options.axis, p = { item: l, list: this, draggableEvent: n }; if ("x" === h || "y" === h) return this._movementByAxis(h, d, u[h], p), t; if (c) { if (i = this._getElementCenter(c.element), r = { left: Math.round(d.left - i.left), top: Math.round(d.top - i.top) }, e.extend(p, { target: c.element }), c.appendToBottom) return this._movePlaceholder(c, null, p), t; if (c.appendAfterHidden && this._movePlaceholder(c, "next", p), this._isFloating(c.element) ? 0 > u.x && 0 > r.left ? o = "prev" : u.x > 0 && r.left > 0 && (o = "next") : 0 > u.y && 0 > r.top ? o = "prev" : u.y > 0 && r.top > 0 && (o = "next"), o) { for (s = "prev" === o ? jQuery.fn.prev : jQuery.fn.next, a = s.call(c.element); a.length && !a.is(":visible");) a = s.call(a); a[0] != this.placeholder[0] && this._movePlaceholder(c, o, p) } } }, _dragend: function(n) { var i, r, o, a, s = this.placeholder, l = this.draggedElement, c = this.indexOf(l), h = this.indexOf(s), m = this.options.connectWith; return this._resetCursor(), o = { action: p, item: l, oldIndex: c, newIndex: h, draggableEvent: n }, h >= 0 ? r = this.trigger(d, o) : (i = s.parents(m).getKendoSortable(), o.action = f, a = e.extend({}, o, { action: g, oldIndex: v, newIndex: i.indexOf(s) }), r = !(!this.trigger(d, o) && !i.trigger(d, a))), r || h === c ? (this._cancel(), t) : (s.replaceWith(l), l.show(), this._draggable.dropped = !0, o = { action: this.indexOf(l) != v ? p : f, item: l, oldIndex: c, newIndex: this.indexOf(l), draggableEvent: n }, this.trigger(u, o), i && (a = e.extend({}, o, { action: g, oldIndex: v, newIndex: i.indexOf(l) }), i.trigger(u, a)), t) }, _findTarget: function(n) { var i, r, o = this._findElementUnderCursor(n), a = this.options.connectWith; return e.contains(this.element[0], o) ? (i = this.items(), r = i.filter(o)[0] || i.has(o)[0], r ? { element: e(r), sortable: this } : null) : this.element[0] == o && this._isEmpty() ? { element: this.element, sortable: this, appendToBottom: !0 } : this.element[0] == o && this._isLastHidden() ? (r = this.items().eq(0), { element: r, sortable: this, appendAfterHidden: !0 }) : a ? this._searchConnectedTargets(o, n) : t }, _findElementUnderCursor: function(e) { { var t = o.elementUnderCursor(e), i = e.sender; this.items() } return n(i.hint[0], t) && (i.hint.hide(), t = o.elementUnderCursor(e), t || (t = o.elementUnderCursor(e)), i.hint.show()), t }, _searchConnectedTargets: function(t, n) { var i, r, o, a, s = e(this.options.connectWith); for (a = 0; s.length > a; a++) if (i = s.eq(a).getKendoSortable(), e.contains(s[a], t)) { if (i) return r = i.items(), o = r.filter(t)[0] || r.has(t)[0], o ? (i.placeholder = this.placeholder, { element: e(o), sortable: i }) : null } else if (s[a] == t) { if (i && i._isEmpty()) return { element: s.eq(a), sortable: i, appendToBottom: !0 }; if (this._isCursorAfterLast(i, n)) return o = i.items().last(), { element: o, sortable: i } } }, _isCursorAfterLast: function(e, t) { var n, i, r = e.items().last(), a = { left: t.x.location, top: t.y.location }; return n = o.getOffset(r), n.top += r.outerHeight(), n.left += r.outerWidth(), i = this._isFloating(r) ? n.left - a.left : n.top - a.top, 0 > i ? !0 : !1 }, _movementByAxis: function(t, n, i, r) { var o, a = "x" === t ? n.left : n.top, s = 0 > i ? this.placeholder.prev() : this.placeholder.next(); s.length && !s.is(":visible") && (s = 0 > i ? s.prev() : s.next()), e.extend(r, { target: s }), o = this._getElementCenter(s), o && (o = "x" === t ? o.left : o.top), s.length && 0 > i && 0 > a - o ? this._movePlaceholder({ element: s, sortable: this }, "prev", r) : s.length && i > 0 && a - o > 0 && this._movePlaceholder({ element: s, sortable: this }, "next", r) }, _movePlaceholder: function(e, t, n) { var i = this.placeholder; e.sortable.trigger(l, n) || (t ? "prev" === t ? e.element.before(i) : "next" === t && e.element.after(i) : e.element.append(i), e.sortable.trigger(c, n)) }, _setCursor: function() { var t, n = this.options.cursor; n && "auto" !== n && (t = e(document.body), this._originalCursorType = t.css("cursor"), t.css({ cursor: n }), this._cursorStylesheet || (this._cursorStylesheet = e("<style>* { cursor: " + n + " !important; }</style>")), this._cursorStylesheet.appendTo(t)) }, _resetCursor: function() { this._originalCursorType && (e(document.body).css("cursor", this._originalCursorType), this._originalCursorType = null, this._cursorStylesheet.remove()) }, _getElementCenter: function(e) { var t = e.length ? o.getOffset(e) : null; return t && (t.top += e.outerHeight() / 2, t.left += e.outerWidth() / 2), t }, _isFloating: function(e) { return /left|right/.test(e.css("float")) || /inline|table-cell/.test(e.css("display")) }, _cancel: function() { this.draggedElement.show(), this.placeholder.remove() }, _items: function() { var e, t = this.options.filter; return e = t ? this.element.find(t) : this.element.children() }, indexOf: function(e) { var t = this._items(), n = this.placeholder, i = this.draggedElement; return n && e[0] == n[0] ? t.not(i).index(e) : t.not(n).index(e) }, items: function() { var e = this.placeholder, t = this._items(); return e && (t = t.not(e)), t }, _isEmpty: function() { return !this.items().length }, _isLastHidden: function() { return 1 === this.items().length && this.items().is(":hidden") } }); o.ui.plugin(_) }(window.kendo.jQuery), function(e, t) { function n(e, t) { if (!e.is(":visible")) return !1; var n = r.getOffset(e), i = t.left + t.width, o = t.top + t.height; return n.right = n.left + e.outerWidth(), n.bottom = n.top + e.outerHeight(), !(n.left > i || t.left > n.right || n.top > o || t.top > n.bottom) } var i, r = window.kendo, o = r.ui.Widget, a = e.proxy, s = Math.abs, l = "aria-selected", c = "k-state-selected", d = "k-state-selecting", u = "k-selectable", h = "change", p = ".kendoSelectable", f = "k-state-unselecting", g = "input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,button.k-button>.k-icon,span.k-icon.k-i-expand,span.k-icon.k-i-collapse", m = r.support.browser.msie, v = !1; ! function(e) { ! function() { e('<div class="parent"><span /></div>').on("click", ">*", function() { v = !0 }).find("span").click().end().off() }() }(e), i = o.extend({ init: function(t, n) { var i, s = this; o.fn.init.call(s, t, n), s._marquee = e("<div class='k-marquee'><div class='k-marquee-color'></div></div>"), s._lastActive = null, s.element.addClass(u), s.relatedTarget = s.options.relatedTarget, i = s.options.multiple, this.options.aria && i && s.element.attr("aria-multiselectable", !0), s.userEvents = new r.UserEvents(s.element, { global: !0, allowSelection: !0, filter: (v ? "" : "." + u + " ") + s.options.filter, tap: a(s._tap, s) }), i && s.userEvents.bind("start", a(s._start, s)).bind("move", a(s._move, s)).bind("end", a(s._end, s)).bind("select", a(s._select, s)) }, events: [h], options: { name: "Selectable", filter: ">*", multiple: !1, relatedTarget: e.noop }, _isElement: function(e) { var t, n = this.element, i = n.length, r = !1; for (e = e[0], t = 0; i > t; t++) if (n[t] === e) { r = !0; break } return r }, _tap: function(t) { var n, i = e(t.target), r = this, o = t.event.ctrlKey || t.event.metaKey, a = r.options.multiple, s = a && t.event.shiftKey, l = t.event.which, d = t.event.button; !r._isElement(i.closest("." + u)) || l && 3 == l || d && 2 == d || this._allowSelection(t.event.target) && (n = i.hasClass(c), a && o || r.clear(), i = i.add(r.relatedTarget(i)), s ? r.selectRange(r._firstSelectee(), i) : (n && o ? (r._unselect(i), r._notify(h)) : r.value(i), r._lastActive = r._downTarget = i)) }, _start: function(n) { var i, r = this, o = e(n.target), a = o.hasClass(c), s = n.event.ctrlKey || n.event.metaKey; if (this._allowSelection(n.event.target)) { if (r._downTarget = o, !r._isElement(o.closest("." + u))) return r.userEvents.cancel(), t; r.options.useAllItems ? r._items = r.element.find(r.options.filter) : (i = o.closest(r.element), r._items = i.find(r.options.filter)), n.sender.capture(), r._marquee.appendTo(document.body).css({ left: n.x.client + 1, top: n.y.client + 1, width: 0, height: 0 }), s || r.clear(), o = o.add(r.relatedTarget(o)), a && (r._selectElement(o, !0), s && o.addClass(f)) } }, _move: function(e) { var t = this, n = { left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation, top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation, width: s(e.x.initialDelta), height: s(e.y.initialDelta) }; t._marquee.css(n), t._invalidateSelectables(n, e.event.ctrlKey || e.event.metaKey), e.preventDefault() }, _end: function() { var e, t = this; t._marquee.remove(), t._unselect(t.element.find(t.options.filter + "." + f)).removeClass(f), e = t.element.find(t.options.filter + "." + d), e = e.add(t.relatedTarget(e)), t.value(e), t._lastActive = t._downTarget, t._items = null }, _invalidateSelectables: function(e, t) { var i, r, o, a, s = this._downTarget[0], l = this._items; for (i = 0, r = l.length; r > i; i++) a = l.eq(i), o = a.add(this.relatedTarget(a)), n(a, e) ? a.hasClass(c) ? t && s !== a[0] && o.removeClass(c).addClass(f) : a.hasClass(d) || a.hasClass(f) || o.addClass(d) : a.hasClass(d) ? o.removeClass(d) : t && a.hasClass(f) && o.removeClass(f).addClass(c) }, value: function(e) { var n = this, i = a(n._selectElement, n); return e ? (e.each(function() { i(this) }), n._notify(h), t) : n.element.find(n.options.filter + "." + c) }, _firstSelectee: function() { var e, t = this; return null !== t._lastActive ? t._lastActive : (e = t.value(), e.length > 0 ? e[0] : t.element.find(t.options.filter)[0]) }, _selectElement: function(t, n) { var i = e(t), r = !n && this._notify("select", { element: t }); i.removeClass(d), r || (i.addClass(c), this.options.aria && i.attr(l, !0)) }, _notify: function(e, t) { return t = t || {}, this.trigger(e, t) }, _unselect: function(e) { return e.removeClass(c), this.options.aria && e.attr(l, !1), e }, _select: function(t) { this._allowSelection(t.event.target) && (!m || m && !e(r._activeElement()).is(g)) && t.preventDefault() }, _allowSelection: function(t) { return e(t).is(g) ? (this.userEvents.cancel(), this._downTarget = null, !1) : !0 }, resetTouchEvents: function() { this.userEvents.cancel() }, clear: function() { var e = this.element.find(this.options.filter + "." + c); this._unselect(e) }, selectRange: function(t, n) { var i, r, o, a = this; for (a.clear(), a.element.length > 1 && (o = a.options.continuousItems()), o && o.length || (o = a.element.find(a.options.filter)), t = e.inArray(e(t)[0], o), n = e.inArray(e(n)[0], o), t > n && (r = t, t = n, n = r), a.options.useAllItems || (n += a.element.length - 1), i = t; n >= i; i++) a._selectElement(o[i]); a._notify(h) }, destroy: function() { var e = this; o.fn.destroy.call(e), e.element.off(p), e.userEvents.destroy(), e._marquee = e._lastActive = e.element = e.userEvents = null } }), i.parseOptions = function(e) { var t = "string" == typeof e && e.toLowerCase(); return { multiple: t && t.indexOf("multiple") > -1, cell: t && t.indexOf("cell") > -1 } }, r.ui.plugin(i) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui.Widget, r = e.proxy, o = n.keys, a = "click", s = "k-button", l = "k-button-icon", c = "k-button-icontext", d = ".kendoButton", u = "disabled", h = "k-state-disabled", p = "k-state-focused", f = "k-state-selected", g = i.extend({ init: function(e, t) { var o = this; i.fn.init.call(o, e, t), e = o.wrapper = o.element, t = o.options, e.addClass(s).attr("role", "button"), t.enable = t.enable && !e.attr(u), o.enable(t.enable), o._tabindex(), o._graphics(), e.on(a + d, r(o._click, o)).on("focus" + d, r(o._focus, o)).on("blur" + d, r(o._blur, o)).on("keydown" + d, r(o._keydown, o)).on("keyup" + d, r(o._keyup, o)), n.notify(o) }, destroy: function() { var e = this; e.wrapper.off(d), i.fn.destroy.call(e) }, events: [a], options: { name: "Button", icon: "", spriteCssClass: "", imageUrl: "", enable: !0 }, _isNativeButton: function() { return "button" == this.element.prop("tagName").toLowerCase() }, _click: function(e) { this.options.enable && this.trigger(a, { event: e }) && e.preventDefault() }, _focus: function() { this.options.enable && this.element.addClass(p) }, _blur: function() { this.element.removeClass(p) }, _keydown: function(e) { var t = this; t._isNativeButton() || (e.keyCode == o.ENTER || e.keyCode == o.SPACEBAR) && (e.keyCode == o.SPACEBAR && (e.preventDefault(), t.options.enable && t.element.addClass(f)), t._click(e)) }, _keyup: function() { this.element.removeClass(f) }, _graphics: function() { var t, n, i, r = this, o = r.element, a = r.options, s = a.icon, d = a.spriteCssClass, u = a.imageUrl; (d || u || s) && (i = !0, o.contents().not("span.k-sprite").not("span.k-icon").not("img.k-image").each(function(t, n) { (1 == n.nodeType || 3 == n.nodeType && e.trim(n.nodeValue).length > 0) && (i = !1) }), o.addClass(i ? l : c)), s ? (t = o.children("span.k-icon").first(), t[0] || (t = e('<span class="k-icon"></span>').prependTo(o)), t.addClass("k-i-" + s)) : d ? (t = o.children("span.k-sprite").first(), t[0] || (t = e('<span class="k-sprite"></span>').prependTo(o)), t.addClass(d)) : u && (n = o.children("img.k-image").first(), n[0] || (n = e('<img alt="icon" class="k-image" />').prependTo(o)), n.attr("src", u)) }, enable: function(e) { var n = this, i = n.element; e === t && (e = !0), e = !!e, n.options.enable = e, i.toggleClass(h, !e).attr("aria-disabled", !e).attr(u, !e); try { i.blur() } catch (r) {} } }); n.ui.plugin(g) }(window.kendo.jQuery), function(e, t) { function n(e, t, n, i, r) { return e({ idx: t, text: n, ns: c.ns, numeric: i, title: r || "" }) } function i(e, t, n) { return k({ className: e.substring(1), text: t, wrapClassName: n || "" }) } function r(e, t, n, i) { e.find(t).parent().attr(c.attr("page"), n).attr("tabindex", -1).toggleClass("k-state-disabled", i) } function o(e, t) { r(e, p, 1, 1 >= t) } function a(e, t) { r(e, g, Math.max(1, t - 1), 1 >= t) } function s(e, t, n) { r(e, m, Math.min(n, t + 1), t >= n) } function l(e, t, n) { r(e, f, n, t >= n) } var c = window.kendo, d = c.ui, u = d.Widget, h = e.proxy, p = ".k-i-seek-w", f = ".k-i-seek-e", g = ".k-i-arrow-w", m = ".k-i-arrow-e", v = "change", _ = ".kendoPager", w = "click", b = "keydown", y = "disabled", k = c.template('<a href="\\#" title="#=text#" class="k-link k-pager-nav #= wrapClassName #"><span class="k-icon #= className #">#=text#</span></a>'), x = u.extend({ init: function(t, n) { var r, d, y, k, x = this; u.fn.init.call(x, t, n), n = x.options, x.dataSource = c.data.DataSource.create(n.dataSource), x.linkTemplate = c.template(x.options.linkTemplate), x.selectTemplate = c.template(x.options.selectTemplate), x.currentPageTemplate = c.template(x.options.currentPageTemplate), r = x.page(), d = x.totalPages(), x._refreshHandler = h(x.refresh, x), x.dataSource.bind(v, x._refreshHandler), n.previousNext && (x.element.find(p).length || (x.element.append(i(p, n.messages.first, "k-pager-first")), o(x.element, r, d)), x.element.find(g).length || (x.element.append(i(g, n.messages.previous)), a(x.element, r, d))), n.numeric && (x.list = x.element.find(".k-pager-numbers"), x.list.length || (x.list = e('<ul class="k-pager-numbers k-reset" />').appendTo(x.element))), n.input && (x.element.find(".k-pager-input").length || x.element.append('<span class="k-pager-input k-label">' + n.messages.page + '<input class="k-textbox">' + c.format(n.messages.of, d) + "</span>"), x.element.on(b + _, ".k-pager-input input", h(x._keydown, x))), n.previousNext && (x.element.find(m).length || (x.element.append(i(m, n.messages.next)), s(x.element, r, d)), x.element.find(f).length || (x.element.append(i(f, n.messages.last, "k-pager-last")), l(x.element, r, d))), n.pageSizes && (x.element.find(".k-pager-sizes").length || (y = n.pageSizes.length ? n.pageSizes : ["all", 5, 10, 20], k = e.map(y, function(e) { return e.toLowerCase && "all" === e.toLowerCase() ? "<option value='all'>" + n.messages.allPages + "</option>" : "<option>" + e + "</option>" }), e('<span class="k-pager-sizes k-label"><select/>' + n.messages.itemsPerPage + "</span>").appendTo(x.element).find("select").html(k.join("")).end().appendTo(x.element)), x.element.find(".k-pager-sizes select").val(x.pageSize()), c.ui.DropDownList && x.element.find(".k-pager-sizes select").show().kendoDropDownList(), x.element.on(v + _, ".k-pager-sizes select", h(x._change, x))), n.refresh && (x.element.find(".k-pager-refresh").length || x.element.append('<a href="#" class="k-pager-refresh k-link" title="' + n.messages.refresh + '"><span class="k-icon k-i-refresh">' + n.messages.refresh + "</span></a>"), x.element.on(w + _, ".k-pager-refresh", h(x._refreshClick, x))), n.info && (x.element.find(".k-pager-info").length || x.element.append('<span class="k-pager-info k-label" />')), x.element.on(w + _, "a", h(x._click, x)).addClass("k-pager-wrap k-widget k-floatwrap"), x.element.on(w + _, ".k-current-page", h(x._toggleActive, x)), n.autoBind && x.refresh(), c.notify(x) }, destroy: function() { var e = this; u.fn.destroy.call(e), e.element.off(_), e.dataSource.unbind(v, e._refreshHandler), e._refreshHandler = null, c.destroy(e.element), e.element = e.list = null }, events: [v], options: { name: "Pager", selectTemplate: '<li><span class="k-state-selected">#=text#</span></li>', currentPageTemplate: '<li class="k-current-page"><span class="k-link k-pager-nav">#=text#</span></li>', linkTemplate: '<li><a tabindex="-1" href="\\#" class="k-link" data-#=ns#page="#=idx#" #if (title !== "") {# title="#=title#" #}#>#=text#</a></li>', buttonCount: 10, autoBind: !0, numeric: !0, info: !0, input: !1, previousNext: !0, pageSizes: !1, refresh: !1, messages: { allPages: "All", display: "{0} - {1} of {2} items", empty: "No items to display", page: "Page", of: "of {0}", itemsPerPage: "items per page", first: "Go to the first page", previous: "Go to the previous page", next: "Go to the next page", last: "Go to the last page", refresh: "Refresh", morePages: "More pages" } }, setDataSource: function(e) { var t = this; t.dataSource.unbind(v, t._refreshHandler), t.dataSource = t.options.dataSource = e, e.bind(v, t._refreshHandler), t.options.autoBind && e.fetch() }, refresh: function(e) { var t, i, r, d, u, h, p = this, f = 1, g = p.page(), m = "", v = p.options, _ = p.pageSize(), w = p.dataSource.total(), b = p.totalPages(), k = p.linkTemplate, x = v.buttonCount; if (!e || "itemchange" != e.action) { if (v.numeric) { for (g > x && (r = g % x, f = 0 === r ? g - x + 1 : g - r + 1), i = Math.min(f + x - 1, b), f > 1 && (m += n(k, f - 1, "...", !1, v.messages.morePages)), t = f; i >= t; t++) m += n(t == g ? p.selectTemplate : k, t, t, !0); b > i && (m += n(k, t, "...", !1, v.messages.morePages)), "" === m && (m = p.selectTemplate({ text: 0 })), m = this.currentPageTemplate({ text: g }) + m, p.list.removeClass("k-state-expanded").html(m) } v.info && (m = w > 0 ? c.format(v.messages.display, (g - 1) * _ + 1, Math.min(g * _, w), w) : v.messages.empty, p.element.find(".k-pager-info").html(m)), v.input && p.element.find(".k-pager-input").html(p.options.messages.page + '<input class="k-textbox">' + c.format(v.messages.of, b)).find("input").val(g).attr(y, 1 > w).toggleClass("k-state-disabled", 1 > w), v.previousNext && (o(p.element, g, b), a(p.element, g, b), s(p.element, g, b), l(p.element, g, b)), v.pageSizes && (d = p.element.find(".k-pager-sizes option[value='all']").length > 0, u = d && _ === this.dataSource.total(), h = _, u && (_ = "all", h = v.messages.allPages), p.element.find(".k-pager-sizes select").val(_).filter("[" + c.attr("role") + "=dropdownlist]").kendoDropDownList("value", _).kendoDropDownList("text", h)) } }, _keydown: function(e) { if (e.keyCode === c.keys.ENTER) { var t = this.element.find(".k-pager-input").find("input"), n = parseInt(t.val(), 10); (isNaN(n) || 1 > n || n > this.totalPages()) && (n = this.page()), t.val(n), this.page(n) } }, _refreshClick: function(e) { e.preventDefault(), this.dataSource.read() }, _change: function(e) { var t = e.currentTarget.value, n = parseInt(t, 10), i = this.dataSource; isNaN(n) ? "all" == (t + "").toLowerCase() && i.pageSize(i.total()) : i.pageSize(n) }, _toggleActive: function() { this.list.toggleClass("k-state-expanded") }, _click: function(t) { var n = e(t.currentTarget); t.preventDefault(), n.is(".k-state-disabled") || this.page(n.attr(c.attr("page"))) }, totalPages: function() { return Math.ceil((this.dataSource.total() || 0) / (this.pageSize() || 1)) }, pageSize: function() { return this.dataSource.pageSize() || this.dataSource.total() }, page: function(e) { return e === t ? this.dataSource.total() > 0 ? this.dataSource.page() : 0 : (this.dataSource.page(e), this.trigger(v, { index: e }), t) } }); d.plugin(x) }(window.kendo.jQuery), function(e) { function t(t, n) { return t === n || e.contains(t, n) } var n = window.kendo, i = n.ui, r = i.Widget, o = n.support, a = n.getOffset, s = "open", l = "close", c = "deactivate", d = "activate", u = "center", h = "left", p = "right", f = "top", g = "bottom", m = "absolute", v = "hidden", _ = "body", w = "location", b = "position", y = "visible", k = "effects", x = "k-state-active", C = "k-state-border", S = /k-state-border-(\w+)/, T = ".k-picker-wrap, .k-dropdown-wrap, .k-link", D = "down", A = e(document.documentElement), E = e(window), I = "scroll", P = "resize scroll", M = o.transitions.css, z = M + "transform", F = e.extend, R = ".kendoPopup", H = ["font-size", "font-family", "font-stretch", "font-style", "font-weight", "line-height"], B = r.extend({ init: function(t, i) { var o, a = this; i = i || {}, i.isRtl && (i.origin = i.origin || g + " " + p, i.position = i.position || f + " " + p), r.fn.init.call(a, t, i), t = a.element, i = a.options, a.collisions = i.collision ? i.collision.split(" ") : [], a.downEvent = n.applyEventMap(D, n.guid()), 1 === a.collisions.length && a.collisions.push(a.collisions[0]), o = e(a.options.anchor).closest(".k-popup,.k-group").filter(":not([class^=km-])"), i.appendTo = e(e(i.appendTo)[0] || o[0] || _), a.element.hide().addClass("k-popup k-group k-reset").toggleClass("k-rtl", !!i.isRtl).css({ position: m }).appendTo(i.appendTo).on("mouseenter" + R, function() { a._hovered = !0 }).on("mouseleave" + R, function() { a._hovered = !1 }), a.wrapper = e(), i.animation === !1 && (i.animation = { open: { effects: {} }, close: { hide: !0, effects: {} } }), F(i.animation.open, { complete: function() { a.wrapper.css({ overflow: y }), a._activated = !0, a._trigger(d) } }), F(i.animation.close, { complete: function() { a._animationClose() } }), a._mousedownProxy = function(e) { a._mousedown(e) }, a._resizeProxy = function(e) { a._resize(e) }, i.toggleTarget && e(i.toggleTarget).on(i.toggleEvent + R, e.proxy(a.toggle, a)) }, events: [s, d, l, c], options: { name: "Popup", toggleEvent: "click", origin: g + " " + h, position: f + " " + h, anchor: _, appendTo: null, collision: "flip fit", viewport: window, copyAnchorStyles: !0, autosize: !1, modal: !1, adjustSize: { width: 0, height: 0 }, animation: { open: { effects: "slideIn:down", transition: !0, duration: 200 }, close: { duration: 100, hide: !0 } } }, _animationClose: function() { var t, i, r, o, a = this, s = a.options; a.wrapper.hide(), t = a.wrapper.data(w), i = e(s.anchor), t && a.wrapper.css(t), s.anchor != _ && (r = ((i.attr("class") || "").match(S) || ["", "down"])[1], o = C + "-" + r, i.removeClass(o).children(T).removeClass(x).removeClass(o), a.element.removeClass(C + "-" + n.directions[r].reverse)), a._closing = !1, a._trigger(c) }, destroy: function() { var t, i = this, o = i.options, a = i.element.off(R); r.fn.destroy.call(i), o.toggleTarget && e(o.toggleTarget).off(R), o.modal || (A.unbind(i.downEvent, i._mousedownProxy), i._scrollableParents().unbind(I, i._resizeProxy), E.unbind(P, i._resizeProxy)), n.destroy(i.element.children()), a.removeData(), o.appendTo[0] === document.body && (t = a.parent(".k-animation-container"), t[0] ? t.remove() : a.remove()) }, open: function(t, i) { var r, a, l, c = this, d = { isFixed: !isNaN(parseInt(i, 10)), x: t, y: i }, u = c.element, h = c.options, p = "down", g = e(h.anchor), w = u[0] && u.hasClass("km-widget"); if (!c.visible()) { if (h.copyAnchorStyles && (w && "font-size" == H[0] && H.shift(), u.css(n.getComputedStyles(g[0], H))), u.data("animating") || c._trigger(s)) return; c._activated = !1, h.modal || (A.unbind(c.downEvent, c._mousedownProxy).bind(c.downEvent, c._mousedownProxy), o.mobileOS.ios || o.mobileOS.android || (c._scrollableParents().unbind(I, c._resizeProxy).bind(I, c._resizeProxy), E.unbind(P, c._resizeProxy).bind(P, c._resizeProxy))), c.wrapper = a = n.wrap(u, h.autosize).css({ overflow: v, display: "block", position: m }), o.mobileOS.android && a.css(z, "translatez(0)"), a.css(b), e(h.appendTo)[0] == document.body && a.css(f, "-10000px"), r = F(!0, {}, h.animation.open), c.flipped = c._position(d), r.effects = n.parseEffects(r.effects, c.flipped), p = r.effects.slideIn ? r.effects.slideIn.direction : p, h.anchor != _ && (l = C + "-" + p, u.addClass(C + "-" + n.directions[p].reverse), g.addClass(l).children(T).addClass(x).addClass(l)), u.data(k, r.effects).kendoStop(!0).kendoAnimate(r) } }, position: function() { this.visible() && this._position() }, toggle: function() { var e = this; e[e.visible() ? l : s]() }, visible: function() { return this.element.is(":" + y) }, close: function(t) { var i, r, o, a, s = this, c = s.options; if (s.visible()) { if (i = s.wrapper[0] ? s.wrapper : n.wrap(s.element).hide(), s._closing || s._trigger(l)) return; s.element.find(".k-popup").each(function() { var n = e(this), i = n.data("kendoPopup"); i && i.close(t) }), A.unbind(s.downEvent, s._mousedownProxy), s._scrollableParents().unbind(I, s._resizeProxy), E.unbind(P, s._resizeProxy), t ? r = { hide: !0, effects: {} } : (r = F(!0, {}, c.animation.close), o = s.element.data(k), a = r.effects, !a && !n.size(a) && o && n.size(o) && (r.effects = o, r.reverse = !0), s._closing = !0), s.element.kendoStop(!0), i.css({ overflow: v }), s.element.kendoAnimate(r) } }, _trigger: function(e) { return this.trigger(e, { type: e }) }, _resize: function(e) { var t = this; "resize" === e.type ? (clearTimeout(t._resizeTimeout), t._resizeTimeout = setTimeout(function() { t._position(), t._resizeTimeout = null }, 50)) : (!t._hovered || t._activated && t.element.hasClass("k-list-container")) && t.close() }, _mousedown: function(i) { var r = this, o = r.element[0], a = r.options, s = e(a.anchor)[0], l = a.toggleTarget, c = n.eventTarget(i), d = e(c).closest(".k-popup"), u = d.parent().parent(".km-shim").length; d = d[0], (u || !d || d === r.element[0]) && "popover" !== e(i.target).closest("a").data("rel") && (t(o, c) || t(s, c) || l && t(e(l)[0], c) || r.close()) }, _fit: function(e, t, n) { var i = 0; return e + t > n && (i = n - (e + t)), 0 > e && (i = -e), i }, _flip: function(e, t, n, i, r, o, a) { var s = 0; return a = a || t, o !== r && o !== u && r !== u && (e + a > i && (s += -(n + t)), 0 > e + s && (s += n + t)), s }, _scrollableParents: function() { return e(this.options.anchor).parentsUntil("body").filter(function(e, t) { return n.isScrollable(t) }) }, _position: function(t) { var i, r, s, l, c, d, u, h, p, f, g, v = this, _ = v.element, y = v.wrapper, k = v.options, x = e(k.viewport), C = x.offset(), S = e(k.anchor), T = k.origin.toLowerCase().split(" "), D = k.position.toLowerCase().split(" "), A = v.collisions, E = o.zoomLevel(), I = 10002, P = !!(x[0] == window && window.innerWidth && 1.02 >= E), M = 0, z = document.documentElement, R = P ? window.innerWidth : x.width(), H = P ? window.innerHeight : x.height(); if (P && z.scrollHeight - z.clientHeight > 0 && (R -= n.support.scrollbar()), i = S.parents().filter(y.siblings()), i[0]) if (s = Math.max(+i.css("zIndex"), 0)) I = s + 10; else for (r = S.parentsUntil(i), l = r.length; l > M; M++) s = +e(r[M]).css("zIndex"), s && s > I && (I = s + 10); return y.css("zIndex", I), y.css(t && t.isFixed ? { left: t.x, top: t.y } : v._align(T, D)), c = a(y, b, S[0] === y.offsetParent()[0]), d = a(y), u = S.offsetParent().parent(".k-animation-container,.k-popup,.k-group"), u.length && (c = a(y, b, !0), d = a(y)), x[0] === window ? (d.top -= window.pageYOffset || document.documentElement.scrollTop || 0, d.left -= window.pageXOffset || document.documentElement.scrollLeft || 0) : (d.top -= C.top, d.left -= C.left), v.wrapper.data(w) || y.data(w, F({}, c)), h = F({}, d), p = F({}, c), f = k.adjustSize, "fit" === A[0] && (p.top += v._fit(h.top, y.outerHeight() + f.height, H / E)), "fit" === A[1] && (p.left += v._fit(h.left, y.outerWidth() + f.width, R / E)), g = F({}, p), "flip" === A[0] && (p.top += v._flip(h.top, _.outerHeight(), S.outerHeight(), H / E, T[0], D[0], y.outerHeight())), "flip" === A[1] && (p.left += v._flip(h.left, _.outerWidth(), S.outerWidth(), R / E, T[1], D[1], y.outerWidth())), _.css(b, m), y.css(p), p.left != g.left || p.top != g.top }, _align: function(t, n) { var i, r = this, o = r.wrapper, s = e(r.options.anchor), l = t[0], c = t[1], d = n[0], h = n[1], f = a(s), m = e(r.options.appendTo), v = o.outerWidth(), _ = o.outerHeight(), w = s.outerWidth(), b = s.outerHeight(), y = f.top, k = f.left, x = Math.round; return m[0] != document.body && (i = a(m), y -= i.top, k -= i.left), l === g && (y += b), l === u && (y += x(b / 2)), d === g && (y -= _), d === u && (y -= x(_ / 2)), c === p && (k += w), c === u && (k += x(w / 2)), h === p && (k -= v), h === u && (k -= x(v / 2)), { top: y, left: k } } }); i.plugin(B) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui.Widget, r = e.proxy, o = e.extend, a = window.setTimeout, s = "click", l = "show", c = "hide", d = "k-notification", u = ".k-notification-wrap .k-i-close", h = "info", p = "success", f = "warning", g = "error", m = "top", v = "left", _ = "bottom", w = "right", b = "up", y = ".kendoNotification", k = '<div class="k-widget k-notification"></div>', x = '<div class="k-notification-wrap"><span class="k-icon k-i-note">#=typeIcon#</span>#=content#<span class="k-icon k-i-close">Hide</span></div>', C = i.extend({ init: function(t, r) { var o = this; i.fn.init.call(o, t, r), r = o.options, r.appendTo && e(r.appendTo).is(t) || o.element.hide(), o._compileTemplates(r.templates), o._guid = "_" + n.guid(), o._isRtl = n.support.isRtl(t), o._compileStacking(r.stacking, r.position.top, r.position.left), n.notify(o) }, events: [l, c], options: { name: "Notification", position: { pinned: !0, top: null, left: null, bottom: 20, right: 20 }, stacking: "default", hideOnClick: !0, button: !1, allowHideAfter: 0, autoHideAfter: 5e3, appendTo: null, width: null, height: null, templates: [], animation: { open: { effects: "fade:in", duration: 300 }, close: { effects: "fade:out", duration: 600, hide: !0 } } }, _compileTemplates: function(t) { var i = this, r = n.template; i._compiled = {}, e.each(t, function(t, n) { i._compiled[n.type] = r(n.template || e("#" + n.templateId).html()) }), i._defaultCompiled = r(x) }, _getCompiled: function(e) { var t = this, n = t._defaultCompiled; return e ? t._compiled[e] || n : n }, _compileStacking: function(e, t, n) { var i, r, o = this, a = { paddingTop: 0, paddingRight: 0, paddingBottom: 0, paddingLeft: 0 }, s = null !== n ? v : w; switch (e) { case "down": i = _ + " " + s, r = m + " " + s, delete a.paddingBottom; break; case w: i = m + " " + w, r = m + " " + v, delete a.paddingRight; break; case v: i = m + " " + v, r = m + " " + w, delete a.paddingLeft; break; case b: i = m + " " + s, r = _ + " " + s, delete a.paddingTop; break; default: null !== t ? (i = _ + " " + s, r = m + " " + s, delete a.paddingBottom) : (i = m + " " + s, r = _ + " " + s, delete a.paddingTop) } o._popupOrigin = i, o._popupPosition = r, o._popupPaddings = a }, _attachPopupEvents: function(e, t) { function i(e) { e.on(s + y, function() { o._hidePopup(t) }) } var r, o = this, l = e.allowHideAfter, c = !isNaN(l) && l > 0; t.options.anchor !== document.body && t.options.origin.indexOf(w) > 0 && t.bind("open", function() { var e = n.getShadows(t.element); a(function() { t.wrapper.css("left", parseFloat(t.wrapper.css("left")) + e.left + e.right) }) }), e.hideOnClick ? t.bind("activate", function() { c ? a(function() { i(t.element) }, l) : i(t.element) }) : e.button && (r = t.element.find(u), c ? a(function() { i(r) }, l) : i(r)) }, _showPopup: function(t, i) { var r, s, l = this, c = i.autoHideAfter, d = i.position.left, h = i.position.top; s = e("." + l._guid + ":not(.k-hiding)").last(), r = new n.ui.Popup(t, { anchor: s[0] ? s : document.body, origin: l._popupOrigin, position: l._popupPosition, animation: i.animation, modal: !0, collision: "", isRtl: l._isRtl, close: function() { l._triggerHide(this.element) }, deactivate: function(e) { e.sender.element.off(y), e.sender.element.find(u).off(y), e.sender.destroy() } }), l._attachPopupEvents(i, r), s[0] ? r.open() : (null === d && (d = e(window).width() - t.width() - i.position.right), null === h && (h = e(window).height() - t.height() - i.position.bottom), r.open(d, h)), r.wrapper.addClass(l._guid).css(o({ margin: 0 }, l._popupPaddings)), i.position.pinned ? (r.wrapper.css("position", "fixed"), s[0] && l._togglePin(r.wrapper, !0)) : s[0] || l._togglePin(r.wrapper, !1), c > 0 && a(function() { l._hidePopup(r) }, c) }, _hidePopup: function(e) { e.wrapper.addClass("k-hiding"), e.close() }, _togglePin: function(t, n) { var i = e(window), r = n ? -1 : 1; t.css({ top: parseInt(t.css(m), 10) + r * i.scrollTop(), left: parseInt(t.css(v), 10) + r * i.scrollLeft() }) }, _attachStaticEvents: function(e, t) { function n(e) { e.on(s + y, r(i._hideStatic, i, t)) } var i = this, o = e.allowHideAfter, l = !isNaN(o) && o > 0; e.hideOnClick ? l ? a(function() { n(t) }, o) : n(t) : e.button && (l ? a(function() { n(t.find(u)) }, o) : n(t.find(u))) }, _showStatic: function(e, t) { var n = this, i = t.autoHideAfter, r = t.animation, o = t.stacking == b || t.stacking == v ? "prependTo" : "appendTo"; e.addClass(n._guid)[o](t.appendTo).hide().kendoAnimate(r.open || !1), n._attachStaticEvents(t, e), i > 0 && a(function() { n._hideStatic(e) }, i) }, _hideStatic: function(e) { e.kendoAnimate(o(this.options.animation.close || !1, { complete: function() { e.off(y).find(u).off(y), e.remove() } })), this._triggerHide(e) }, _triggerHide: function(e) { this.trigger(c, { element: e }), this.angular("cleanup", function() { return { elements: e } }) }, show: function(i, r) { var a, s, c = this, u = c.options, p = e(k); return r || (r = h), null !== i && i !== t && "" !== i && (n.isFunction(i) && (i = i()), s = { typeIcon: r, content: "" }, a = e.isPlainObject(i) ? o(s, i) : o(s, { content: i }), p.addClass(d + "-" + r).toggleClass(d + "-button", u.button).attr("data-role", "alert").css({ width: u.width, height: u.height }).append(c._getCompiled(r)(a)), c.angular("compile", function() { return { elements: p, data: [{ dataItem: a }] } }), e(u.appendTo)[0] ? c._showStatic(p, u) : c._showPopup(p, u), c.trigger(l, { element: p })), c }, info: function(e) { return this.show(e, h) }, success: function(e) { return this.show(e, p) }, warning: function(e) { return this.show(e, f) }, error: function(e) { return this.show(e, g) }, hide: function() { var t = this, n = t.getNotifications(); return n.each(t.options.appendTo ? function(n, i) { t._hideStatic(e(i)) } : function(n, i) { var r = e(i).data("kendoPopup"); r && t._hidePopup(r) }), t }, getNotifications: function() { var t = this, n = e("." + t._guid); return t.options.appendTo ? n : n.children("." + d) }, setOptions: function(e) { var n, r = this; i.fn.setOptions.call(r, e), n = r.options, e.templates !== t && r._compileTemplates(n.templates), (e.stacking !== t || e.position !== t) && r._compileStacking(n.stacking, n.position.top, n.position.left) }, destroy: function() { i.fn.destroy.call(this), this.getNotifications().off(y).find(u).off(y) } }); n.ui.plugin(C) }(window.kendo.jQuery), function(e) { function t(e) { for (; e.length;) n(e), e = e.parent() } function n(e) { var t = e.data(o.ns + "title"); t && (e.attr("title", t), e.removeData(o.ns + "title")) } function i(e) { var t = e.attr("title"); t && (e.data(o.ns + "title", t), e.attr("title", "")) } function r(e) { for (; e.length && !e.is("body");) i(e), e = e.parent() } var o = window.kendo, a = o.ui.Widget, s = o.ui.Popup, l = o.isFunction, c = e.isPlainObject, d = e.extend, u = e.proxy, h = e(document), p = o.isLocalUrl, f = "_tt_active", g = "aria-describedby", m = "show", v = "hide", _ = "error", w = "contentLoad", b = "requestStart", y = "k-content-frame", k = '<div role="tooltip" class="k-widget k-tooltip#if (!autoHide) {# k-tooltip-closable#}#">#if (!autoHide) {# <div class="k-tooltip-button"><a href="\\#" class="k-icon k-i-close">close</a></div> #}#<div class="k-tooltip-content"></div>#if (callout){ #<div class="k-callout k-callout-#=dir#"></div>#}#</div>', x = o.template("<iframe frameborder='0' class='" + y + "' src='#= content.url #'>This page requires frames in order to show content</iframe>"), C = ".kendoTooltip", S = { bottom: { origin: "bottom center", position: "top center" }, top: { origin: "top center", position: "bottom center" }, left: { origin: "center left", position: "center right", collision: "fit flip" }, right: { origin: "center right", position: "center left", collision: "fit flip" }, center: { position: "center center", origin: "center center" } }, T = { top: "bottom", bottom: "top", left: "right", right: "left", center: "center" }, D = { bottom: "n", top: "s", left: "e", right: "w", center: "n" }, A = { horizontal: { offset: "top", size: "outerHeight" }, vertical: { offset: "left", size: "outerWidth" } }, E = function(e) { return e.target.data(o.ns + "title") }, I = a.extend({ init: function(e, t) { var n, i = this; a.fn.init.call(i, e, t), n = i.options.position.match(/left|right/) ? "horizontal" : "vertical", i.dimensions = A[n], i._documentKeyDownHandler = u(i._documentKeyDown, i), i.element.on(i.options.showOn + C, i.options.filter, u(i._showOn, i)).on("mouseenter" + C, i.options.filter, u(i._mouseenter, i)), this.options.autoHide && i.element.on("mouseleave" + C, i.options.filter, u(i._mouseleave, i)) }, options: { name: "Tooltip", filter: "", content: E, showAfter: 100, callout: !0, position: "bottom", showOn: "mouseenter", autoHide: !0, width: null, height: null, animation: { open: { effects: "fade:in", duration: 0 }, close: { effects: "fade:out", duration: 40, hide: !0 } } }, events: [m, v, w, _, b], _mouseenter: function(t) { r(e(t.currentTarget)) }, _showOn: function(t) { var n = this, i = e(t.currentTarget); n.options.showOn && n.options.showOn.match(/click|focus/) ? n._show(i) : (clearTimeout(n.timeout), n.timeout = setTimeout(function() { n._show(i) }, n.options.showAfter)) }, _appendContent: function(e) { var t, n = this, i = n.options.content, r = n.content, a = n.options.iframe; c(i) && i.url ? ("iframe" in n.options || (a = !p(i.url)), n.trigger(b, { options: i, target: e }), a ? (r.hide(), t = r.find("." + y)[0], t ? t.src = i.url || t.src : r.html(x({ content: i })), r.find("." + y).off("load" + C).on("load" + C, function() { n.trigger(w), r.show() })) : (r.empty(), o.ui.progress(r, !0), n._ajaxRequest(i))) : i && l(i) ? (i = i({ sender: this, target: e }), r.html(i || "")) : r.html(i), n.angular("compile", function() { return { elements: r } }) }, _ajaxRequest: function(e) { var t = this; jQuery.ajax(d({ type: "GET", dataType: "html", cache: !1, error: function(e, n) { o.ui.progress(t.content, !1), t.trigger(_, { status: n, xhr: e }) }, success: u(function(e) { o.ui.progress(t.content, !1), t.content.html(e), t.trigger(w) }, t) }, e)) }, _documentKeyDown: function(e) { e.keyCode === o.keys.ESC && this.hide() }, refresh: function() { var e = this, t = e.popup; t && t.options.anchor && e._appendContent(t.options.anchor) }, hide: function() { this.popup && this.popup.close() }, show: function(e) { e = e || this.element, r(e), this._show(e) }, _show: function(e) { var n = this, i = n.target(); n.popup || n._initPopup(), i && i[0] != e[0] && (n.popup.close(), n.popup.element.kendoStop(!0, !0)), i && i[0] == e[0] || (n._appendContent(e), n.popup.options.anchor = e), n.popup.one("deactivate", function() { t(e), e.removeAttr(g), this.element.removeAttr("id").attr("aria-hidden", !0), h.off("keydown" + C, n._documentKeyDownHandler) }), n.popup.open() }, _initPopup: function() { var t = this, n = t.options, i = e(o.template(k)({ callout: n.callout && "center" !== n.position, dir: D[n.position], autoHide: n.autoHide })); t.popup = new s(i, d({ activate: function() { var e = this.options.anchor, i = e[0].id || t.element[0].id; i && (e.attr(g, i + f), this.element.attr("id", i + f)), n.callout && t._positionCallout(), this.element.removeAttr("aria-hidden"), h.on("keydown" + C, t._documentKeyDownHandler), t.trigger(m) }, close: function() { t.trigger(v) }, copyAnchorStyles: !1, animation: n.animation }, S[n.position])), i.css({ width: n.width, height: n.height }), t.content = i.find(".k-tooltip-content"), t.arrow = i.find(".k-callout"), n.autoHide ? i.on("mouseleave" + C, u(t._mouseleave, t)) : i.on("click" + C, ".k-tooltip-button", u(t._closeButtonClick, t)) }, _closeButtonClick: function(e) { e.preventDefault(), this.hide() }, _mouseleave: function(n) { if (this.popup) { var i = e(n.currentTarget), r = i.offset(), o = n.pageX, a = n.pageY; if (r.right = r.left + i.outerWidth(), r.bottom = r.top + i.outerHeight(), o > r.left && r.right > o && a > r.top && r.bottom > a) return; this.popup.close() } else t(e(n.currentTarget)); clearTimeout(this.timeout) }, _positionCallout: function() { var t = this, n = t.options.position, i = t.dimensions, r = i.offset, o = t.popup, a = o.options.anchor, s = e(a).offset(), l = parseInt(t.arrow.css("border-top-width"), 10), c = e(o.element).offset(), d = D[o.flipped ? T[n] : n], u = s[r] - c[r] + e(a)[i.size]() / 2 - l; t.arrow.removeClass("k-callout-n k-callout-s k-callout-w k-callout-e").addClass("k-callout-" + d).css(r, u) }, target: function() { return this.popup ? this.popup.options.anchor : null }, destroy: function() { var e = this.popup; e && (e.element.off(C), e.destroy()), this.element.off(C), h.off("keydown" + C, this._documentKeyDownHandler), a.fn.destroy.call(this) } }); o.ui.plugin(I) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n, i, r, o = t.length, a = []; for (i = 0; e.length > i; i++) for (n = e[i], r = 0; o > r; r++) n === t[r] && a.push({ index: i, item: n }); return a } function i(t, n) { var r, o = !1; return t.filters && (r = e.grep(t.filters, function(e) { return o = i(e, n), e.filters ? e.filters.length : e.field != n }), o || t.filters.length === r.length || (o = !0), t.filters = r), o } var r, o, a = window.kendo, s = a.ui, l = s.Widget, c = a.keys, d = a.support, u = a.htmlEncode, h = a._activeElement, p = a.data.ObservableArray, f = "id", g = "change", m = "k-state-focused", v = "k-state-hover", _ = "k-loading", w = "open", b = "close", y = "select", k = "selected", x = "requestStart", C = "requestEnd", S = "width", T = e.extend, D = e.proxy, A = e.isArray, E = d.browser, I = E.msie && 9 > E.version, P = /"/g, M = { ComboBox: "DropDownList", DropDownList: "ComboBox" }, z = a.ui.DataBoundWidget.extend({ init: function(t, n) { var i, r = this, o = r.ns; l.fn.init.call(r, t, n), t = r.element, n = r.options, r._isSelect = t.is(y), r._isSelect && r.element[0].length && (n.dataSource || (n.dataTextField = n.dataTextField || "text", n.dataValueField = n.dataValueField || "value")), r.ul = e('<ul unselectable="on" class="k-list k-reset"/>').attr({ tabIndex: -1, "aria-hidden": !0 }), r.list = e("<div class='k-list-container'/>").append(r.ul).on("mousedown" + o, D(r._listMousedown, r)), i = t.attr(f), i && (r.list.attr(f, i + "-list"), r.ul.attr(f, i + "_listbox")), r._header(), r._accessors(), r._initValue() }, options: { valuePrimitive: !1, headerTemplate: "" }, setOptions: function(e) { l.fn.setOptions.call(this, e), e && e.enable !== t && (e.enabled = e.enable) }, focus: function() { this._focused.focus() }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, _listOptions: function(e) { var t = this.options; return e = e || {}, e = { height: e.height || t.height, dataValueField: e.dataValueField || t.dataValueField, dataTextField: e.dataTextField || t.dataTextField, groupTemplate: e.groupTemplate || t.groupTemplate, fixedGroupTemplate: e.fixedGroupTemplate || t.fixedGroupTemplate, template: e.template || t.template }, e.template || (e.template = "#:" + a.expr(e.dataTextField, "data") + "#"), e }, _initList: function() { var n = this, i = n.options, r = i.virtual, o = !!r, s = i.value, l = D(n._listBound, n), c = { autoBind: !1, selectable: !0, dataSource: n.dataSource, click: D(n._click, n), change: D(n._listChange, n), activate: D(n._activateItem, n), deactivate: D(n._deactivateItem, n), dataBinding: function() { n.trigger("dataBinding"), n._angularItems("cleanup") }, dataBound: l, listBound: l, selectedItemChange: D(n._listChange, n) }; c = e.extend(n._listOptions(), c, "object" == typeof r ? r : {}), n.listView = o ? new a.ui.VirtualList(n.ul, c) : new a.ui.StaticList(n.ul, c), s !== t && n.listView.value(s).done(function() { var e = i.text; !n.listView.filter() && n.input && (-1 === n.selectedIndex ? ((e === t || null === e) && (e = s), n._accessor(s), n.input.val(e), n._placeholder()) : -1 === n._oldIndex && (n._oldIndex = n.selectedIndex)) }) }, _listMousedown: function(e) { this.filterInput && this.filterInput[0] === e.target || e.preventDefault() }, _filterSource: function(e, t) { var n = this, r = n.options, o = n.dataSource, a = T({}, o.filter() || {}), s = i(a, r.dataTextField); (e || s) && n.trigger("filtering", { filter: e }) || (e && (a = a.filters || [], a.push(e)), t ? o.read(a) : o.filter(a)) }, _header: function() { var t, n = this, i = n.options.headerTemplate; e.isFunction(i) && (i = i({})), i && (n.list.prepend(i), t = n.ul.prev(), n.header = t[0] ? t : null, n.header && n.angular("compile", function() { return { elements: n.header } })) }, _initValue: function() { var e = this, t = e.options.value; null !== t ? e.element.val(t) : (t = e._accessor(), e.options.value = t), e._old = t }, _ignoreCase: function() { var e, t = this, n = t.dataSource.reader.model; n && n.fields && (e = n.fields[t.options.dataTextField], e && e.type && "string" !== e.type && (t.options.ignoreCase = !1)) }, _focus: function(e) { return this.listView.focus(e) }, current: function(e) { return this._focus(e) }, items: function() { return this.ul[0].children }, destroy: function() { var e = this, t = e.ns; l.fn.destroy.call(e), e._unbindDataSource(), e.listView.destroy(), e.list.off(t), e.popup.destroy(), e._form && e._form.off("reset", e._resetHandler) }, dataItem: function(n) { var i = this; return n === t ? i.listView.selectedDataItems()[0] : ("number" != typeof n && (n = e(i.items()).index(n)), i.dataSource.flatView()[n]) }, _activateItem: function() { var e = this.listView.focus(); e && this._focused.add(this.filterInput).attr("aria-activedescendant", e.attr("id")) }, _deactivateItem: function() { this._focused.add(this.filterInput).removeAttr("aria-activedescendant") }, _accessors: function() { var e = this, t = e.element, n = e.options, i = a.getter, r = t.attr(a.attr("text-field")), o = t.attr(a.attr("value-field")); !n.dataTextField && r && (n.dataTextField = r), !n.dataValueField && o && (n.dataValueField = o), e._text = i(n.dataTextField), e._value = i(n.dataValueField) }, _aria: function(e) { var n = this, i = n.options, r = n._focused.add(n.filterInput); i.suggest !== t && r.attr("aria-autocomplete", i.suggest ? "both" : "list"), e = e ? e + " " + n.ul[0].id : n.ul[0].id, r.attr("aria-owns", e), n.ul.attr("aria-live", i.filter && "none" !== i.filter ? "polite" : "off") }, _blur: function() { var e = this; e._change(), e.close() }, _change: function() { var e, n = this, i = n.selectedIndex, r = n.options.value, o = n.value(); n._isSelect && !n.listView.isBound() && r && (o = r), o !== n._old ? e = !0 : i !== t && i !== n._oldIndex && (e = !0), e && (n._old = o, n._oldIndex = i, n._typing || n.element.trigger(g), n.trigger(g)), n.typing = !1 }, _data: function() { return this.dataSource.view() }, _enable: function() { var e = this, n = e.options, i = e.element.is("[disabled]"); n.enable !== t && (n.enabled = n.enable), !n.enabled || i ? e.enable(!1) : e.readonly(e.element.is("[readonly]")) }, _dataValue: function(e) { var n = this._value(e); return n === t && (n = this._text(e)), n }, _offsetHeight: function() { var t = 0, n = this.listView.content.prevAll(":visible"); return n.each(function() { var n = e(this); t += n.hasClass("k-list-filter") ? n.children().outerHeight() : n.outerHeight() }), t }, _height: function(e) { var t, n, i = this, r = i.list, o = i.options.height, a = i.popup.visible(); return e && (n = r.add(r.parent(".k-animation-container")).show(), o = i.listView.content[0].scrollHeight > o ? o : "auto", n.height(o), "auto" !== o && (t = i._offsetHeight(), t && (o -= t)), i.listView.content.height(o), a || n.hide()), o }, _adjustListWidth: function() { var e, t, n = this.list, i = n[0].style.width, r = this.wrapper; if (n.data(S) || !i) return e = window.getComputedStyle ? window.getComputedStyle(r[0], null) : 0, t = e ? parseFloat(e.width) : r.outerWidth(), e && E.msie && (t += parseFloat(e.paddingLeft) + parseFloat(e.paddingRight) + parseFloat(e.borderLeftWidth) + parseFloat(e.borderRightWidth)), i = "border-box" !== n.css("box-sizing") ? t - (n.outerWidth() - n.width()) : t, n.css({ fontFamily: r.css("font-family"), width: i }).data(S, i), !0 }, _openHandler: function(e) { this._adjustListWidth(), this.trigger(w) ? e.preventDefault() : (this._focused.attr("aria-expanded", !0), this.ul.attr("aria-hidden", !1)) }, _closeHandler: function(e) { this.trigger(b) ? e.preventDefault() : (this._focused.attr("aria-expanded", !1), this.ul.attr("aria-hidden", !0)) }, _focusItem: function() { var e = this.listView, n = e.focus(), i = e.select(); i = i[i.length - 1], i === t && this.options.highlightFirst && !n && (i = 0), i !== t ? e.focus(i) : e.scrollToIndex(0) }, _calculateGroupPadding: function(e) { var t = this.ul.children(".k-first:first"), n = this.listView.content.prev(".k-group-header"), i = 0; n[0] && "none" !== n[0].style.display && ("auto" !== e && (i = a.support.scrollbar()), i += parseFloat(t.css("border-right-width"), 10) + parseFloat(t.children(".k-group").css("padding-right"), 10), n.css("padding-right", i)) }, _firstOpen: function() { var e = this._height(this.dataSource.flatView().length); this._calculateGroupPadding(e) }, _popup: function() { var e = this; e.popup = new s.Popup(e.list, T({}, e.options.popup, { anchor: e.wrapper, open: D(e._openHandler, e), close: D(e._closeHandler, e), animation: e.options.animation, isRtl: d.isRtl(e.wrapper) })), e.options.virtual || e.popup.one(w, D(e._firstOpen, e)) }, _makeUnselectable: function() { I && this.list.find("*").not(".k-textbox").attr("unselectable", "on") }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(v, "mouseenter" === t.type) }, _toggle: function(e, n) { var i = this, r = d.mobileOS && (d.touch || d.MSPointers || d.pointers); e = e !== t ? e : !i.popup.visible(), n || r || i._focused[0] === h() || (i._prevent = !0, i._focused.focus(), i._prevent = !1), i[e ? w : b]() }, _triggerCascade: function() { var e = this; e._cascadeTriggered && e._old === e.value() && e._oldIndex === e.selectedIndex || (e._cascadeTriggered = !0, e.trigger("cascade", { userTriggered: e._userTriggered })) }, _unbindDataSource: function() { var e = this; e.dataSource.unbind(x, e._requestStartHandler).unbind(C, e._requestEndHandler).unbind("error", e._errorHandler) } }); T(z, { inArray: function(e, t) { var n, i, r = t.children; if (!e || e.parentNode !== t) return -1; for (n = 0, i = r.length; i > n; n++) if (e === r[n]) return n; return -1 } }), a.ui.List = z, s.Select = z.extend({ init: function(e, t) { z.fn.init.call(this, e, t), this._initial = this.element.val() }, setDataSource: function(e) { var t, n = this; n.options.dataSource = e, n._dataSource(), n.listView.setDataSource(n.dataSource), n.options.autoBind && n.dataSource.fetch(), t = n._parentWidget(), t && n._cascadeSelect(t) }, close: function() { this.popup.close() }, select: function(e) { var n = this; return e === t ? n.selectedIndex : (n._select(e), n._old = n._accessor(), n._oldIndex = n.selectedIndex, t) }, search: function(e) { var t, n, i, r, o, a; e = "string" == typeof e ? e : this.text(), t = this, n = e.length, i = t.options, r = i.ignoreCase, o = i.filter, a = i.dataTextField, clearTimeout(t._typingTimeout), (!n || n >= i.minLength) && (t._state = "filter", t.listView.filter(!0), "none" === o ? t._filter(e) : (t._open = !0, t._filterSource({ value: r ? e.toLowerCase() : e, field: a, operator: o, ignoreCase: r }))) }, _accessor: function(e, t) { return this[this._isSelect ? "_accessorSelect" : "_accessorInput"](e, t) }, _accessorInput: function(e) { var n = this.element[0]; return e === t ? n.value : (null === e && (e = ""), n.value = e, t) }, _accessorSelect: function(e, n) { var i, r = this.element[0], o = r.selectedIndex; return e === t ? (o > -1 && (i = r.options[o]), i && (e = i.value), e || "") : (o > -1 && r.options[o].removeAttribute(k), n === t && (n = -1), null !== e && "" !== e && -1 == n ? this._custom(e) : (e ? r.value = e : r.selectedIndex = n, r.selectedIndex > -1 && (i = r.options[r.selectedIndex]), i && i.setAttribute(k, k)), t) }, _custom: function(t) { var n = this, i = n.element, r = n._customOption; r || (r = e("<option/>"), n._customOption = r, i.append(r)), r.text(t), r[0].setAttribute(k, k), r[0].selected = !0 }, _hideBusy: function() { var e = this; clearTimeout(e._busy), e._arrow.removeClass(_), e._focused.attr("aria-busy", !1), e._busy = null }, _showBusy: function() { var e = this; e._request = !0, e._busy || (e._busy = setTimeout(function() { e._arrow && (e._focused.attr("aria-busy", !0), e._arrow.addClass(_)) }, 100)) }, _requestEnd: function() { this._request = !1, this._hideBusy() }, _dataSource: function() { var t, n = this, i = n.element, r = n.options, o = r.dataSource || {}; o = e.isArray(o) ? { data: o } : o, n._isSelect && (t = i[0].selectedIndex, t > -1 && (r.index = t), o.select = i, o.fields = [{ field: r.dataTextField }, { field: r.dataValueField }]), n.dataSource ? n._unbindDataSource() : (n._requestStartHandler = D(n._showBusy, n), n._requestEndHandler = D(n._requestEnd, n), n._errorHandler = D(n._hideBusy, n)), n.dataSource = a.data.DataSource.create(o).bind(x, n._requestStartHandler).bind(C, n._requestEndHandler).bind("error", n._errorHandler) }, _firstItem: function() { this.listView.first() }, _lastItem: function() { this.listView.last() }, _nextItem: function() { this.listView.next() }, _prevItem: function() { this.listView.prev() }, _move: function(e) { var n, i, r, o, a = this, s = e.keyCode, l = s === c.DOWN; if (s === c.UP || l) { if (e.altKey) a.toggle(l); else { if (!a.listView.isBound()) return a._fetch || (a.dataSource.one(g, function() { a._fetch = !1, a._move(e) }), a._fetch = !0, a._filterSource()), e.preventDefault(), !0; if (r = a._focus(), a._fetch || r && !r.hasClass("k-state-selected") || (l ? (a._nextItem(), a._focus() || a._lastItem()) : (a._prevItem(), a._focus() || a._firstItem())), a.trigger(y, { item: a.listView.focus() })) return a._focus(r), t; a._select(a._focus(), !0), a.popup.visible() || a._blur() } e.preventDefault(), i = !0 } else if (s === c.ENTER || s === c.TAB) { if (a.popup.visible() && e.preventDefault(), r = a._focus(), n = a.dataItem(), a.popup.visible() || n && a.text() === a._text(n) || (r = null), o = a.filterInput && a.filterInput[0] === h(), r) { if (a.trigger(y, { item: r })) return; a._select(r) } else a.input && (a._accessor(a.input.val()), a.listView.value(a.input.val())); a._focusElement && a._focusElement(a.wrapper), o && s === c.TAB ? a.wrapper.focusout() : a._blur(), a.close(), i = !0 } else s === c.ESC && (a.popup.visible() && e.preventDefault(), a.close(), i = !0); return i }, _fetchData: function() { var e = this, t = !!e.dataSource.view().length; e._request || e.options.cascadeFrom || e.listView.isBound() || e._fetch || t || (e._fetch = !0, e.dataSource.fetch().done(function() { e._fetch = !1 })) }, _options: function(e, n, i) { var r, o, a, s, l = this, c = l.element, d = e.length, h = "", p = 0; for (n && (h = n); d > p; p++) r = "<option", o = e[p], a = l._text(o), s = l._value(o), s !== t && (s += "", -1 !== s.indexOf('"') && (s = s.replace(P, """)), r += ' value="' + s + '"'), r += ">", a !== t && (r += u(a)), r += "</option>", h += r; c.html(h), i !== t && (c[0].value = i) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { setTimeout(function() { t.value(t._initial) }) }, t._form = r.on("reset", t._resetHandler)) }, _parentWidget: function() { var t = this.options.name, n = e("#" + this.options.cascadeFrom), i = n.data("kendo" + t); return i || (i = n.data("kendo" + M[t])), i }, _cascade: function() { var e, t = this, n = t.options, i = n.cascadeFrom; if (i) { if (e = t._parentWidget(), !e) return; n.autoBind = !1, e.first("cascade", function(n) { t._userTriggered = n.userTriggered, t.listView.isBound() && t._clearSelection(e, !0), t._cascadeSelect(e) }), e.listView.isBound() ? t._cascadeSelect(e) : e.value() || t.enable(!1) } }, _cascadeChange: function(e) { var t = this, n = t._accessor(); t._userTriggered ? t._clearSelection(e, !0) : n ? (n !== t.listView.value()[0] && t.value(n), t.dataSource.view()[0] && -1 !== t.selectedIndex || t._clearSelection(e, !0)) : t.dataSource.flatView().length && t.select(t.options.index), t.enable(), t._triggerCascade(), t._userTriggered = !1 }, _cascadeSelect: function(e) { var t, n, r, o = this, a = e.dataItem(), s = a ? e._value(a) : null, l = o.options.cascadeFromField || e.options.dataValueField; s || 0 === s ? (t = o.dataSource.filter() || {}, i(t, l), n = t.filters || [], n.push({ field: l, operator: "eq", value: s }), r = function() { o.unbind("dataBound", r), o._cascadeChange(e) }, o.first("dataBound", r), o.dataSource.filter(n)) : (o.enable(!1), o._clearSelection(e), o._triggerCascade(), o._userTriggered = !1) } }), r = ".StaticList", o = a.ui.DataBoundWidget.extend({ init: function(t, n) { l.fn.init.call(this, t, n), this.element.attr("role", "listbox").on("click" + r, "li", D(this._click, this)).on("mouseenter" + r, "li", function() { e(this).addClass(v) }).on("mouseleave" + r, "li", function() { e(this).removeClass(v) }), this.content = this.element.wrap("<div unselectable='on'></div>").parent().css({ overflow: "auto", position: "relative" }), this.header = this.content.before('<div class="k-group-header" style="display:none"></div>').prev(), this._bound = !1, this._optionID = a.guid(), this._selectedIndices = [], this._view = [], this._dataItems = [], this._values = []; var i = this.options.value; i && (this._values = e.isArray(i) ? i.slice(0) : [i]), this._getter(), this._templates(), this.setDataSource(this.options.dataSource), this._onScroll = D(function() { var e = this; clearTimeout(e._scrollId), e._scrollId = setTimeout(function() { e._renderHeader() }, 50) }, this) }, options: { name: "StaticList", dataValueField: null, selectable: !0, template: null, groupTemplate: null, fixedGroupTemplate: null }, events: ["click", "change", "activate", "deactivate", "dataBinding", "dataBound", "selectedItemChange"], setDataSource: function(t) { var n, i = this, r = t || {}; r = e.isArray(r) ? { data: r } : r, r = a.data.DataSource.create(r), i.dataSource ? (i.dataSource.unbind(g, i._refreshHandler), n = i.value(), i.value([]), i._bound = !1, i.value(n)) : i._refreshHandler = D(i.refresh, i), i.dataSource = r.bind(g, i._refreshHandler), i._fixedHeader() }, setOptions: function(e) { l.fn.setOptions.call(this, e), this._getter(), this._templates(), this._render() }, destroy: function() { this.element.off(r), this._refreshHandler && this.dataSource.unbind(g, this._refreshHandler), l.fn.destroy.call(this) }, scrollToIndex: function(e) { var t = this.element[0].children[e]; t && this.scroll(t) }, scroll: function(e) { if (e) { e[0] && (e = e[0]); var t = this.content[0], n = e.offsetTop, i = e.offsetHeight, r = t.scrollTop, o = t.clientHeight, a = n + i; r > n ? r = n : a > r + o && (r = a - o), t.scrollTop = r } }, selectedDataItems: function(n) { var i = this._valueGetter; return n === t ? this._dataItems.slice() : (this._dataItems = n, this._values = e.map(n, function(e) { return i(e) }), t) }, next: function() { var e = this.focus(); e = e ? e.next() : 0, this.focus(e) }, prev: function() { var e = this.focus(); e = e ? e.prev() : this.element[0].children.length - 1, this.focus(e) }, first: function() { this.focus(this.element[0].children[0]) }, last: function() { this.focus(this.element[0].children[this.element[0].children.length - 1]) }, focus: function(n) { var i, r = this, o = r._optionID; return n === t ? r._current : (n = r._get(n), n = n[n.length - 1], n = e(this.element[0].children[n]), r._current && (r._current.removeClass(m).removeAttr("aria-selected").removeAttr(f), r.trigger("deactivate")), i = !!n[0], i && (n.addClass(m), r.scroll(n), n.attr("id", o)), r._current = i ? n : null, r.trigger("activate"), t) }, focusIndex: function() { return this.focus() ? this.focus().index() : t }, filter: function(e) { return e === t ? this._filtered : (this._filtered = e, t) }, skipUpdate: function(e) { this._skipUpdate = e }, select: function(n) { var i, r = this, o = r.options.selectable, a = "multiple" !== o && o !== !1, s = r._selectedIndices, l = [], c = []; if (n === t) return s.slice(); if (n = r._get(n), 1 === n.length && -1 === n[0] && (n = []), !r._filtered || a || !r._deselectFiltered(n)) { if (a && !r._filtered && -1 !== e.inArray(n[n.length - 1], s)) return r._dataItems.length && r._view.length && (r._dataItems = [r._view[s[0]].item]), t; i = r._deselect(n), c = i.removed, n = i.indices, n.length && (a && (n = [n[n.length - 1]]), l = r._select(n)), (l.length || c.length) && (r._valueComparer = null, r.trigger("change", { added: l, removed: c })) } }, removeAt: function(e) { return this._selectedIndices.splice(e, 1), this._values.splice(e, 1), this._valueComparer = null, { position: e, dataItem: this._dataItems.splice(e, 1)[0] } }, setValue: function(t) { t = e.isArray(t) || t instanceof p ? t.slice(0) : [t], this._values = t, this._valueComparer = null }, value: function(n) { var i, r = this, o = r._valueDeferred; return n === t ? r._values.slice() : (r.setValue(n), o && "resolved" !== o.state() || (r._valueDeferred = o = e.Deferred()), r.isBound() && (i = r._valueIndices(r._values), "multiple" === r.options.selectable && r.select(-1), r.select(i), o.resolve()), r._skipUpdate = !1, o) }, _click: function(t) { t.isDefaultPrevented() || this.trigger("click", { item: e(t.currentTarget) }) }, _valueExpr: function(e, n) { var i, r, o, a = this, s = 0, l = []; if (!a._valueComparer || a._valueType !== e) { for (a._valueType = e; n.length > s; s++) i = n[s], i !== t && "" !== i && null !== i && ("boolean" === e ? i = !!i : "number" === e ? i = +i : "string" === e && (i = "" + i)), l.push(i); r = "for (var idx = 0; idx < " + l.length + "; idx++) { if (current === values[idx]) { return idx; }} return -1;", o = Function(["current", "values"], r), a._valueComparer = function(e) { return o(e, l) } } return a._valueComparer }, _dataItemPosition: function(e, t) { var n = this._valueGetter(e), i = this._valueExpr(typeof n, t); return i(n) }, _getter: function() { this._valueGetter = a.getter(this.options.dataValueField) }, _deselect: function(t) { var n, i, r, o = this, a = o.element[0].children, s = o.options.selectable, l = o._selectedIndices, c = o._dataItems, d = o._values, u = [], h = 0, p = 0; if (t = t.slice(), s !== !0 && t.length) { if ("multiple" === s) for (; t.length > h; h++) if (i = t[h], e(a[i]).hasClass("k-state-selected")) for (n = 0; l.length > n; n++) if (r = l[n], r === i) { e(a[r]).removeClass("k-state-selected"), u.push({ position: n + p, dataItem: c.splice(n, 1)[0] }), l.splice(n, 1), t.splice(h, 1), d.splice(n, 1), p += 1, h -= 1, n -= 1; break } } else { for (; l.length > h; h++) e(a[l[h]]).removeClass("k-state-selected"), u.push({ position: h, dataItem: c[h] }); o._values = [], o._dataItems = [], o._selectedIndices = [] } return { indices: t, removed: u } }, _deselectFiltered: function(t) { for (var n, i, r, o = this.element[0].children, a = [], s = 0; t.length > s; s++) i = t[s], n = this._view[i].item, r = this._dataItemPosition(n, this._values), r > -1 && (a.push(this.removeAt(r)), e(o[i]).removeClass("k-state-selected")); return a.length ? (this.trigger("change", { added: [], removed: a }), !0) : !1 }, _select: function(t) { var n, i, r = this, o = r.element[0].children, a = r._view, s = [], l = 0; for (-1 !== t[t.length - 1] && r.focus(t); t.length > l; l++) i = t[l], n = a[i], -1 !== i && n && (n = n.item, r._selectedIndices.push(i), r._dataItems.push(n), r._values.push(r._valueGetter(n)), e(o[i]).addClass("k-state-selected").attr("aria-selected", !0), s.push({ dataItem: n })); return s }, _get: function(n) { return "number" == typeof n ? n = [n] : A(n) || (n = e(n).data("offset-index"), n === t && (n = -1), n = [n]), n }, _template: function() { var e = this, t = e.options, n = t.template; return n ? (n = a.template(n), n = function(e) { return '<li tabindex="-1" role="option" unselectable="on" class="k-item">' + n(e) + "</li>" }) : n = a.template('<li tabindex="-1" role="option" unselectable="on" class="k-item">${' + a.expr(t.dataTextField, "data") + "}</li>", { useWithBlock: !1 }), n }, _templates: function() { var e, t, n = { template: this.options.template, groupTemplate: this.options.groupTemplate, fixedGroupTemplate: this.options.fixedGroupTemplate }; for (t in n) e = n[t], e && "function" != typeof e && (n[t] = a.template(e)); this.templates = n }, _normalizeIndices: function(e) { for (var n = [], i = 0; e.length > i; i++) e[i] !== t && n.push(e[i]); return n }, _valueIndices: function(e, t) { var n, i = this._view, r = 0; if (t = t ? t.slice() : [], !e.length) return []; for (; i.length > r; r++) n = this._dataItemPosition(i[r].item, e), -1 !== n && (t[n] = r); return this._normalizeIndices(t) }, _firstVisibleItem: function() { for (var t = this.element[0], n = this.content[0], i = n.scrollTop, r = e(t.children[0]).height(), o = Math.floor(i / r) || 0, a = t.children[o] || t.lastChild, s = i > a.offsetTop; a;) if (s) { if (a.offsetTop + r > i || !a.nextSibling) break; a = a.nextSibling } else { if (i >= a.offsetTop || !a.previousSibling) break; a = a.previousSibling } return this._view[e(a).data("offset-index")] }, _fixedHeader: function() { this.isGrouped() && this.templates.fixedGroupTemplate ? (this.header.show(), this.content.scroll(this._onScroll)) : (this.header.hide(), this.content.off("scroll", this._onScroll)) }, _renderHeader: function() { var e, t = this.templates.fixedGroupTemplate; t && (e = this._firstVisibleItem(), e && this.header.html(t(e.group))) }, _renderItem: function(e) { var t = '<li tabindex="-1" role="option" unselectable="on" class="k-item', n = e.item, i = 0 !== e.index, r = e.selected; return i && e.newGroup && (t += " k-first"), r && (t += " k-state-selected"), t += '"' + (r ? ' aria-selected="true"' : "") + ' data-offset-index="' + e.index + '">', t += this.templates.template(n), i && e.newGroup && (t += '<div class="k-group">' + this.templates.groupTemplate(e.group) + "</div>"), t + "</li>" }, _render: function() { var e, t, n, i, r = "", o = 0, a = 0, s = [], l = this.dataSource.view(), c = this.value(), d = this.isGrouped(); if (d) for (o = 0; l.length > o; o++) for (t = l[o], n = !0, i = 0; t.items.length > i; i++) e = { selected: this._selected(t.items[i], c), item: t.items[i], group: t.value, newGroup: n, index: a }, s[a] = e, a += 1, r += this._renderItem(e), n = !1; else for (o = 0; l.length > o; o++) e = { selected: this._selected(l[o], c), item: l[o], index: o }, s[o] = e, r += this._renderItem(e); this._view = s, this.element[0].innerHTML = r, d && s.length && this._renderHeader() }, _selected: function(e, t) { var n = !this._filtered || "multiple" === this.options.selectable; return n && -1 !== this._dataItemPosition(e, t) }, refresh: function(e) { var t, i = this, r = e && e.action; i.trigger("dataBinding"), i._fixedHeader(), i._render(), i._bound = !0, "itemchange" === r ? (t = n(i._dataItems, e.items), t.length && i.trigger("selectedItemChange", { items: t })) : i._filtered || i._skipUpdate ? (i.focus(0), i._skipUpdate && (i._skipUpdate = !1, i._selectedIndices = i._valueIndices(i._values, i._selectedIndices))) : r && "add" !== r || i.value(i._values), i._valueDeferred && i._valueDeferred.resolve(), i.trigger("dataBound") }, isBound: function() { return this._bound }, isGrouped: function() { return (this.dataSource.group() || []).length } }), s.plugin(o) }(window.kendo.jQuery), function(e, t) { function n(e, t, n, i) { var r, o = e.getFullYear(), a = t.getFullYear(), s = n.getFullYear(); return o -= o % i, r = o + (i - 1), a > o && (o = a), r > s && (r = s), o + "-" + r } function i(e) { for (var t, n = 0, i = e.min, r = e.max, o = e.start, a = e.setter, l = e.build, c = e.cells || 12, d = e.perRow || 4, u = e.content || P, h = e.empty || M, p = e.html || '<table tabindex="0" role="grid" class="k-content k-meta-view" cellspacing="0"><tbody><tr role="row">'; c > n; n++) n > 0 && n % d === 0 && (p += '</tr><tr role="row">'), t = l(o, n), p += s(o, i, r) ? u(t) : h(t), a(o, 1); return p + "</tr></tbody></table>" } function r(e, t, n) { var i = e.getFullYear(), r = t.getFullYear(), o = r, a = 0; return n && (r -= r % n, o = r - r % n + n - 1), i > o ? a = 1 : r > i && (a = -1), a } function o() { var e = new ft; return new ft(e.getFullYear(), e.getMonth(), e.getDate()) } function a(e, t, n) { var i = o(); return e && (i = new ft(+e)), t > i ? i = new ft(+t) : i > n && (i = new ft(+n)), i } function s(e, t, n) { return +e >= +t && +n >= +e } function l(e, t) { return e.slice(t).concat(e.slice(0, t)) } function c(e, t, n) { t = t instanceof ft ? t.getFullYear() : e.getFullYear() + n * t, e.setFullYear(t) } function d(t) { e(this).toggleClass($, it.indexOf(t.type) > -1 || t.type == tt) } function u(e) { e.preventDefault() } function h(e) { return A(e).calendars.standard } function p(e) { var n = gt[e.start], i = gt[e.depth], r = A(e.culture); e.format = T(e.format || r.calendars.standard.patterns.d), isNaN(n) && (n = 0, e.start = U), (i === t || i > n) && (e.depth = U), e.dates || (e.dates = []) } function f(e) { F && e.find("*").attr("unselectable", "on") } function g(e, t) { for (var n = 0, i = t.length; i > n; n++) if (e === +t[n]) return !0; return !1 } function m(e, t) { return e ? e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth() && e.getDate() === t.getDate() : !1 } function v(e, t) { return e ? e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth() : !1 } var _, w = window.kendo, b = w.support, y = w.ui, k = y.Widget, x = w.keys, C = w.parseDate, S = w.date.adjustDST, T = w._extractFormat, D = w.template, A = w.getCulture, E = w.support.transitions, I = E ? E.css + "transform-origin" : "", P = D('<td#=data.cssClass# role="gridcell"><a tabindex="-1" class="k-link" href="\\#" data-#=data.ns#value="#=data.dateString#">#=data.value#</a></td>', { useWithBlock: !1 }), M = D('<td role="gridcell"> </td>', { useWithBlock: !1 }), z = w.support.browser, F = z.msie && 9 > z.version, R = ".kendoCalendar", H = "click" + R, B = "keydown" + R, L = "id", N = "min", O = "left", V = "slideIn", U = "month", W = "century", j = "change", G = "navigate", q = "value", $ = "k-state-hover", Y = "k-state-disabled", Q = "k-state-focused", K = "k-other-month", X = ' class="' + K + '"', Z = "k-nav-today", J = "td:has(.k-link)", et = "blur" + R, tt = "focus", nt = tt + R, it = b.touch ? "touchstart" : "mouseenter", rt = b.touch ? "touchstart" + R : "mouseenter" + R, ot = b.touch ? "touchend" + R + " touchmove" + R : "mouseleave" + R, at = 6e4, st = 864e5, lt = "_prevArrow", ct = "_nextArrow", dt = "aria-disabled", ut = "aria-selected", ht = e.proxy, pt = e.extend, ft = Date, gt = { month: 0, year: 1, decade: 2, century: 3 }, mt = k.extend({ init: function(t, n) { var i, r, o = this; k.fn.init.call(o, t, n), t = o.wrapper = o.element, n = o.options, n.url = window.unescape(n.url), o._templates(), o._header(), o._footer(o.footer), r = t.addClass("k-widget k-calendar").on(rt + " " + ot, J, d).on(B, "table.k-content", ht(o._move, o)).on(H, J, function(t) { var n = t.currentTarget.firstChild; - 1 != n.href.indexOf("#") && t.preventDefault(), o._click(e(n)) }).on("mouseup" + R, "table.k-content, .k-footer", function() { o._focusView(o.options.focusOnNav !== !1) }).attr(L), r && (o._cellID = r + "_cell_selected"), p(n), i = C(n.value, n.format, n.culture), o._index = gt[n.start], o._current = new ft(+a(i, n.min, n.max)), o._addClassProxy = function() { o._active = !0, o._cell.addClass(Q) }, o._removeClassProxy = function() { o._active = !1, o._cell.removeClass(Q) }, o.value(i), w.notify(o) }, options: { name: "Calendar", value: null, min: new ft(1900, 0, 1), max: new ft(2099, 11, 31), dates: [], url: "", culture: "", footer: "", format: "", month: {}, start: U, depth: U, animation: { horizontal: { effects: V, reverse: !0, duration: 500, divisor: 2 }, vertical: { effects: "zoomIn", duration: 400 } } }, events: [j, G], setOptions: function(e) { var t = this; p(e), e.dates[0] || (e.dates = t.options.dates), k.fn.setOptions.call(t, e), t._templates(), t._footer(t.footer), t._index = gt[t.options.start], t.navigate() }, destroy: function() { var e = this, t = e._today; e.element.off(R), e._title.off(R), e[lt].off(R), e[ct].off(R), w.destroy(e._table), t && w.destroy(t.off(R)), k.fn.destroy.call(e) }, current: function() { return this._current }, view: function() { return this._view }, focus: function(e) { e = e || this._table, this._bindTable(e), e.focus() }, min: function(e) { return this._option(N, e) }, max: function(e) { return this._option("max", e) }, navigateToPast: function() { this._navigate(lt, -1) }, navigateToFuture: function() { this._navigate(ct, 1) }, navigateUp: function() { var e = this, t = e._index; e._title.hasClass(Y) || e.navigate(e._current, ++t) }, navigateDown: function(e) { var n = this, i = n._index, r = n.options.depth; if (e) return i === gt[r] ? (+n._value != +e && (n.value(e), n.trigger(j)), t) : (n.navigate(e, --i), t) }, navigate: function(n, i) { i = isNaN(i) ? gt[i] : i; var r, o, s, l, c = this, d = c.options, u = d.culture, h = d.min, p = d.max, g = c._title, m = c._table, v = c._oldTable, w = c._value, b = c._current, y = n && +n > +b, k = i !== t && i !== c._index; n || (n = b), c._current = n = new ft(+a(n, h, p)), i === t ? i = c._index : c._index = i, c._view = o = _.views[i], s = o.compare, l = i === gt[W], g.toggleClass(Y, l).attr(dt, l), l = s(n, h) < 1, c[lt].toggleClass(Y, l).attr(dt, l), l = s(n, p) > -1, c[ct].toggleClass(Y, l).attr(dt, l), m && v && v.data("animating") && (v.kendoStop(!0, !0), m.kendoStop(!0, !0)), c._oldTable = m, (!m || c._changeView) && (g.html(o.title(n, h, p, u)), c._table = r = e(o.content(pt({ min: h, max: p, date: n, url: d.url, dates: d.dates, format: d.format, culture: u }, c[o.name]))), f(r), c._animate({ from: m, to: r, vertical: k, future: y }), c._focus(n), c.trigger(G)), i === gt[d.depth] && w && c._class("k-state-selected", o.toDateString(w)), c._class(Q, o.toDateString(n)), !m && c._cell && c._cell.removeClass(Q), c._changeView = !0 }, value: function(e) { var n = this, i = n._view, r = n.options, o = n._view, a = r.min, l = r.max; return e === t ? n._value : (e = C(e, r.format, r.culture), null !== e && (e = new ft(+e), s(e, a, l) || (e = null)), n._value = e, o && null === e && n._cell ? n._cell.removeClass("k-state-selected") : (n._changeView = !e || i && 0 !== i.compare(e, n._current), n.navigate(e)), t) }, _move: function(t) { var n, i, r, o, s = this, l = s.options, c = t.keyCode, d = s._view, u = s._index, h = new ft(+s._current), p = w.support.isRtl(s.wrapper); return t.target === s._table[0] && (s._active = !0), t.ctrlKey ? c == x.RIGHT && !p || c == x.LEFT && p ? (s.navigateToFuture(), i = !0) : c == x.LEFT && !p || c == x.RIGHT && p ? (s.navigateToPast(), i = !0) : c == x.UP ? (s.navigateUp(), i = !0) : c == x.DOWN && (s._click(e(s._cell[0].firstChild)), i = !0) : (c == x.RIGHT && !p || c == x.LEFT && p ? (n = 1, i = !0) : c == x.LEFT && !p || c == x.RIGHT && p ? (n = -1, i = !0) : c == x.UP ? (n = 0 === u ? -7 : -4, i = !0) : c == x.DOWN ? (n = 0 === u ? 7 : 4, i = !0) : c == x.ENTER ? (s._click(e(s._cell[0].firstChild)), i = !0) : c == x.HOME || c == x.END ? (r = c == x.HOME ? "first" : "last", o = d[r](h), h = new ft(o.getFullYear(), o.getMonth(), o.getDate(), h.getHours(), h.getMinutes(), h.getSeconds(), h.getMilliseconds()), i = !0) : c == x.PAGEUP ? (i = !0, s.navigateToPast()) : c == x.PAGEDOWN && (i = !0, s.navigateToFuture()), (n || r) && (r || d.setDate(h, n), s._focus(a(h, l.min, l.max)))), i && t.preventDefault(), s._current }, _animate: function(e) { var t = this, n = e.from, i = e.to, r = t._active; n ? n.parent().data("animating") ? (n.off(R), n.parent().kendoStop(!0, !0).remove(), n.remove(), i.insertAfter(t.element[0].firstChild), t._focusView(r)) : n.is(":visible") && t.options.animation !== !1 ? t[e.vertical ? "_vertical" : "_horizontal"](n, i, e.future) : (i.insertAfter(n), n.off(R).remove(), t._focusView(r)) : (i.insertAfter(t.element[0].firstChild), t._bindTable(i)) }, _horizontal: function(e, t, n) { var i = this, r = i._active, o = i.options.animation.horizontal, a = o.effects, s = e.outerWidth(); a && -1 != a.indexOf(V) && (e.add(t).css({ width: s }), e.wrap("<div/>"), i._focusView(r, e), e.parent().css({ position: "relative", width: 2 * s, "float": O, "margin-left": n ? 0 : -s }), t[n ? "insertAfter" : "insertBefore"](e), pt(o, { effects: V + ":" + (n ? "right" : O), complete: function() { e.off(R).remove(), i._oldTable = null, t.unwrap(), i._focusView(r) } }), e.parent().kendoStop(!0, !0).kendoAnimate(o)) }, _vertical: function(e, t) { var n, i, r = this, o = r.options.animation.vertical, a = o.effects, s = r._active; a && -1 != a.indexOf("zoom") && (t.css({ position: "absolute", top: e.prev().outerHeight(), left: 0 }).insertBefore(e), I && (n = r._cellByDate(r._view.toDateString(r._current)), i = n.position(), i = i.left + parseInt(n.width() / 2, 10) + "px " + (i.top + parseInt(n.height() / 2, 10) + "px"), t.css(I, i)), e.kendoStop(!0, !0).kendoAnimate({ effects: "fadeOut", duration: 600, complete: function() { e.off(R).remove(), r._oldTable = null, t.css({ position: "static", top: 0, left: 0 }), r._focusView(s) } }), t.kendoStop(!0, !0).kendoAnimate(o)) }, _cellByDate: function(t) { return this._table.find("td:not(." + K + ")").filter(function() { return e(this.firstChild).attr(w.attr(q)) === t }) }, _class: function(t, n) { var i = this, r = i._cellID, o = i._cell; o && o.removeAttr(ut).removeAttr("aria-label").removeAttr(L), o = i._table.find("td:not(." + K + ")").removeClass(t).filter(function() { return e(this.firstChild).attr(w.attr(q)) === n }).attr(ut, !0), t !== Q || i._active || i.options.focusOnNav === !1 || (t = ""), o.addClass(t), o[0] && (i._cell = o), r && (o.attr(L, r), i._table.removeAttr("aria-activedescendant").attr("aria-activedescendant", r)) }, _bindTable: function(e) { e.on(nt, this._addClassProxy).on(et, this._removeClassProxy) }, _click: function(e) { var t = this, n = t.options, i = new Date(+t._current), r = e.attr(w.attr(q)).split("/"); r = new ft(r[0], r[1], r[2]), S(r, 0), t._view.setDate(i, r), t.navigateDown(a(i, n.min, n.max)) }, _focus: function(e) { var t = this, n = t._view; 0 !== n.compare(e, t._current) ? t.navigate(e) : (t._current = e, t._class(Q, n.toDateString(e))) }, _focusView: function(e, t) { e && this.focus(t) }, _footer: function(n) { var i = this, r = o(), a = i.element, s = a.find(".k-footer"); return n ? (s[0] || (s = e('<div class="k-footer"><a href="#" class="k-link k-nav-today"></a></div>').appendTo(a)), i._today = s.show().find(".k-link").html(n(r)).attr("title", w.toString(r, "D", i.options.culture)), i._toggle(), t) : (i._toggle(!1), s.hide(), t) }, _header: function() { var e, t = this, n = t.element; n.find(".k-header")[0] || n.html('<div class="k-header"><a href="#" role="button" class="k-link k-nav-prev"><span class="k-icon k-i-arrow-w"></span></a><a href="#" role="button" aria-live="assertive" aria-atomic="true" class="k-link k-nav-fast"></a><a href="#" role="button" class="k-link k-nav-next"><span class="k-icon k-i-arrow-e"></span></a></div>'), e = n.find(".k-link").on(rt + " " + ot + " " + nt + " " + et, d).click(!1), t._title = e.eq(1).on(H, function() { t._active = t.options.focusOnNav !== !1, t.navigateUp() }), t[lt] = e.eq(0).on(H, function() { t._active = t.options.focusOnNav !== !1, t.navigateToPast() }), t[ct] = e.eq(2).on(H, function() { t._active = t.options.focusOnNav !== !1, t.navigateToFuture() }) }, _navigate: function(e, t) { var n = this, i = n._index + 1, r = new ft(+n._current); e = n[e], e.hasClass(Y) || (i > 3 ? r.setFullYear(r.getFullYear() + 100 * t) : _.views[i].setDate(r, t), n.navigate(r)) }, _option: function(e, n) { var i, r = this, o = r.options, a = r._value || r._current; return n === t ? o[e] : (n = C(n, o.format, o.culture), n && (o[e] = new ft(+n), i = e === N ? n > a : a > n, (i || v(a, n)) && (i && (r._value = null), r._changeView = !0), r._changeView || (r._changeView = !(!o.month.content && !o.month.empty)), r.navigate(r._value), r._toggle()), t) }, _toggle: function(e) { var n = this, i = n.options, r = n._today; e === t && (e = s(o(), i.min, i.max)), r && (r.off(H), e ? r.addClass(Z).removeClass(Y).on(H, ht(n._todayClick, n)) : r.removeClass(Z).addClass(Y).on(H, u)) }, _todayClick: function(e) { var t = this, n = gt[t.options.depth], i = o(); e.preventDefault(), 0 === t._view.compare(t._current, i) && t._index == n && (t._changeView = !1), t._value = i, t.navigate(i, n), t.trigger(j) }, _templates: function() { var e = this, t = e.options, n = t.footer, i = t.month, r = i.content, o = i.empty; e.month = { content: D('<td#=data.cssClass# role="gridcell"><a tabindex="-1" class="k-link#=data.linkClass#" href="#=data.url#" ' + w.attr("value") + '="#=data.dateString#" title="#=data.title#">' + (r || "#=data.value#") + "</a></td>", { useWithBlock: !!r }), empty: D('<td role="gridcell">' + (o || " ") + "</td>", { useWithBlock: !!o }) }, e.footer = n !== !1 ? D(n || '#= kendo.toString(data,"D","' + t.culture + '") #', { useWithBlock: !1 }) : null } }); y.plugin(mt), _ = { firstDayOfMonth: function(e) { return new ft(e.getFullYear(), e.getMonth(), 1) }, firstVisibleDay: function(e, t) { t = t || w.culture().calendar; for (var n = t.firstDay, i = new ft(e.getFullYear(), e.getMonth(), 0, e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds()); i.getDay() != n;) _.setTime(i, -1 * st); return i }, setTime: function(e, t) { var n = e.getTimezoneOffset(), i = new ft(e.getTime() + t), r = i.getTimezoneOffset() - n; e.setTime(i.getTime() + r * at) }, views: [{ name: U, title: function(e, t, n, i) { return h(i).months.names[e.getMonth()] + " " + e.getFullYear() }, content: function(e) { for (var t = this, n = 0, r = e.min, o = e.max, a = e.date, s = e.dates, c = e.format, d = e.culture, u = e.url, p = u && s[0], f = h(d), m = f.firstDay, v = f.days, b = l(v.names, m), y = l(v.namesShort, m), k = _.firstVisibleDay(a, f), x = t.first(a), C = t.last(a), T = t.toDateString, D = new ft, A = '<table tabindex="0" role="grid" class="k-content" cellspacing="0"><thead><tr role="row">'; 7 > n; n++) A += '<th scope="col" title="' + b[n] + '">' + y[n] + "</th>"; return D = new ft(D.getFullYear(), D.getMonth(), D.getDate()), S(D, 0), D = +D, k = new ft(k.getFullYear(), k.getMonth(), k.getDate()), S(k, 0), i({ cells: 42, perRow: 7, html: A += '</tr></thead><tbody><tr role="row">', start: k, min: new ft(r.getFullYear(), r.getMonth(), r.getDate()), max: new ft(o.getFullYear(), o.getMonth(), o.getDate()), content: e.content, empty: e.empty, setter: t.setDate, build: function(e) { var t = [], n = e.getDay(), i = "", r = "#"; return (x > e || e > C) && t.push(K), +e === D && t.push("k-today"), (0 === n || 6 === n) && t.push("k-weekend"), p && g(+e, s) && (r = u.replace("{0}", w.toString(e, c, d)), i = " k-action-link"), { date: e, dates: s, ns: w.ns, title: w.toString(e, "D", d), value: e.getDate(), dateString: T(e), cssClass: t[0] ? ' class="' + t.join(" ") + '"' : "", linkClass: i, url: r } } }) }, first: function(e) { return _.firstDayOfMonth(e) }, last: function(e) { var t = new ft(e.getFullYear(), e.getMonth() + 1, 0), n = _.firstDayOfMonth(e), i = Math.abs(t.getTimezoneOffset() - n.getTimezoneOffset()); return i && t.setHours(n.getHours() + i / 60), t }, compare: function(e, t) { var n, i = e.getMonth(), r = e.getFullYear(), o = t.getMonth(), a = t.getFullYear(); return n = r > a ? 1 : a > r ? -1 : i == o ? 0 : i > o ? 1 : -1 }, setDate: function(e, t) { var n = e.getHours(); t instanceof ft ? e.setFullYear(t.getFullYear(), t.getMonth(), t.getDate()) : _.setTime(e, t * st), S(e, n) }, toDateString: function(e) { return e.getFullYear() + "/" + e.getMonth() + "/" + e.getDate() } }, { name: "year", title: function(e) { return e.getFullYear() }, content: function(e) { var t = h(e.culture).months.namesAbbr, n = this.toDateString, r = e.min, o = e.max; return i({ min: new ft(r.getFullYear(), r.getMonth(), 1), max: new ft(o.getFullYear(), o.getMonth(), 1), start: new ft(e.date.getFullYear(), 0, 1), setter: this.setDate, build: function(e) { return { value: t[e.getMonth()], ns: w.ns, dateString: n(e), cssClass: "" } } }) }, first: function(e) { return new ft(e.getFullYear(), 0, e.getDate()) }, last: function(e) { return new ft(e.getFullYear(), 11, e.getDate()) }, compare: function(e, t) { return r(e, t) }, setDate: function(e, t) { var n, i = e.getHours(); t instanceof ft ? (n = t.getMonth(), e.setFullYear(t.getFullYear(), n, e.getDate()), n !== e.getMonth() && e.setDate(0)) : (n = e.getMonth() + t, e.setMonth(n), n > 11 && (n -= 12), n > 0 && e.getMonth() != n && e.setDate(0)), S(e, i) }, toDateString: function(e) { return e.getFullYear() + "/" + e.getMonth() + "/1" } }, { name: "decade", title: function(e, t, i) { return n(e, t, i, 10) }, content: function(e) { var t = e.date.getFullYear(), n = this.toDateString; return i({ start: new ft(t - t % 10 - 1, 0, 1), min: new ft(e.min.getFullYear(), 0, 1), max: new ft(e.max.getFullYear(), 0, 1), setter: this.setDate, build: function(e, t) { return { value: e.getFullYear(), ns: w.ns, dateString: n(e), cssClass: 0 === t || 11 == t ? X : "" } } }) }, first: function(e) { var t = e.getFullYear(); return new ft(t - t % 10, e.getMonth(), e.getDate()) }, last: function(e) { var t = e.getFullYear(); return new ft(t - t % 10 + 9, e.getMonth(), e.getDate()) }, compare: function(e, t) { return r(e, t, 10) }, setDate: function(e, t) { c(e, t, 1) }, toDateString: function(e) { return e.getFullYear() + "/0/1" } }, { name: W, title: function(e, t, i) { return n(e, t, i, 100) }, content: function(e) { var t = e.date.getFullYear(), n = e.min.getFullYear(), r = e.max.getFullYear(), o = this.toDateString, a = n, s = r; return a -= a % 10, s -= s % 10, 10 > s - a && (s = a + 9), i({ start: new ft(t - t % 100 - 10, 0, 1), min: new ft(a, 0, 1), max: new ft(s, 0, 1), setter: this.setDate, build: function(e, t) { var i = e.getFullYear(), a = i + 9; return n > i && (i = n), a > r && (a = r), { ns: w.ns, value: i + " - " + a, dateString: o(e), cssClass: 0 === t || 11 == t ? X : "" } } }) }, first: function(e) { var t = e.getFullYear(); return new ft(t - t % 100, e.getMonth(), e.getDate()) }, last: function(e) { var t = e.getFullYear(); return new ft(t - t % 100 + 99, e.getMonth(), e.getDate()) }, compare: function(e, t) { return r(e, t, 100) }, setDate: function(e, t) { c(e, t, 10) }, toDateString: function(e) { var t = e.getFullYear(); return t - t % 10 + "/0/1" } }] }, _.isEqualDatePart = m, _.makeUnselectable = f, _.restrictValue = a, _.isInRange = s, _.normalize = p, _.viewsEnum = gt, w.calendar = _ }(window.kendo.jQuery), function(e, t) { function n(t) { var n = t.parseFormats, i = t.format; H.normalize(t), n = e.isArray(n) ? n : [n], n.length || n.push("yyyy-MM-dd"), -1 === e.inArray(i, n) && n.splice(0, 0, t.format), t.parseFormats = n } function i(e) { e.preventDefault() } var r, o = window.kendo, a = o.ui, s = a.Widget, l = o.parseDate, c = o.keys, d = o.template, u = o._activeElement, h = "<div />", p = "<span />", f = ".kendoDatePicker", g = "click" + f, m = "open", v = "close", _ = "change", w = "disabled", b = "readonly", y = "k-state-default", k = "k-state-focused", x = "k-state-selected", C = "k-state-disabled", S = "k-state-hover", T = "mouseenter" + f + " mouseleave" + f, D = "mousedown" + f, A = "id", E = "min", I = "max", P = "month", M = "aria-disabled", z = "aria-expanded", F = "aria-hidden", R = "aria-readonly", H = o.calendar, B = H.isInRange, L = H.restrictValue, N = H.isEqualDatePart, O = e.extend, V = e.proxy, U = Date, W = function(t) { var n, i = this, r = document.body, s = e(h).attr(F, "true").addClass("k-calendar-container").appendTo(r); i.options = t = t || {}, n = t.id, n && (n += "_dateview", s.attr(A, n), i._dateViewID = n), i.popup = new a.Popup(s, O(t.popup, t, { name: "Popup", isRtl: o.support.isRtl(t.anchor) })), i.div = s, i.value(t.value) }; W.prototype = { _calendar: function() { var t, n = this, r = n.calendar, s = n.options; r || (t = e(h).attr(A, o.guid()).appendTo(n.popup.element).on(D, i).on(g, "td:has(.k-link)", V(n._click, n)), n.calendar = r = new a.Calendar(t), n._setOptions(s), o.calendar.makeUnselectable(r.element), r.navigate(n._value || n._current, s.start), n.value(n._value)) }, _setOptions: function(e) { this.calendar.setOptions({ focusOnNav: !1, change: e.change, culture: e.culture, dates: e.dates, depth: e.depth, footer: e.footer, format: e.format, max: e.max, min: e.min, month: e.month, start: e.start }) }, setOptions: function(e) { var t = this.options; this.options = O(t, e, { change: t.change, close: t.close, open: t.open }), this.calendar && this._setOptions(this.options) }, destroy: function() { this.popup.destroy() }, open: function() { var e = this; e._calendar(), e.popup.open() }, close: function() { this.popup.close() }, min: function(e) { this._option(E, e) }, max: function(e) { this._option(I, e) }, toggle: function() { var e = this; e[e.popup.visible() ? v : m]() }, move: function(e) { var t = this, n = e.keyCode, i = t.calendar, r = e.ctrlKey && n == c.DOWN || n == c.ENTER, o = !1; if (e.altKey) n == c.DOWN ? (t.open(), e.preventDefault(), o = !0) : n == c.UP && (t.close(), e.preventDefault(), o = !0); else if (t.popup.visible()) { if (n == c.ESC || r && i._cell.hasClass(x)) return t.close(), e.preventDefault(), !0; t._current = i._move(e), o = !0 } return o }, current: function(e) { this._current = e, this.calendar._focus(e) }, value: function(e) { var t = this, n = t.calendar, i = t.options; t._value = e, t._current = new U(+L(e, i.min, i.max)), n && n.value(e) }, _click: function(e) { -1 !== e.currentTarget.className.indexOf(x) && this.close() }, _option: function(e, t) { var n = this, i = n.calendar; n.options[e] = t, i && i[e](t) } }, W.normalize = n, o.DateView = W, r = s.extend({ init: function(t, i) { var r, a, c = this; s.fn.init.call(c, t, i), t = c.element, i = c.options, i.min = l(t.attr("min")) || l(i.min), i.max = l(t.attr("max")) || l(i.max), n(i), c._initialOptions = O({}, i), c._wrapper(), c.dateView = new W(O({}, i, { id: t.attr(A), anchor: c.wrapper, change: function() { c._change(this.value()), c.close() }, close: function(e) { c.trigger(v) ? e.preventDefault() : (t.attr(z, !1), a.attr(F, !0)) }, open: function(e) { var n, i = c.options; c.trigger(m) ? e.preventDefault() : (c.element.val() !== c._oldText && (n = l(t.val(), i.parseFormats, i.culture), c.dateView[n ? "current" : "value"](n)), t.attr(z, !0), a.attr(F, !1), c._updateARIA(n)) } })), a = c.dateView.div, c._icon(); try { t[0].setAttribute("type", "text") } catch (d) { t[0].type = "text" } t.addClass("k-input").attr({ role: "combobox", "aria-expanded": !1, "aria-owns": c.dateView._dateViewID }), c._reset(), c._template(), r = t.is("[disabled]") || e(c.element).parents("fieldset").is(":disabled"), r ? c.enable(!1) : c.readonly(t.is("[readonly]")), c._old = c._update(i.value || c.element.val()), c._oldText = t.val(), o.notify(c) }, events: [m, v, _], options: { name: "DatePicker", value: null, footer: "", format: "", culture: "", parseFormats: [], min: new Date(1900, 0, 1), max: new Date(2099, 11, 31), start: P, depth: P, animation: {}, month: {}, dates: [], ARIATemplate: 'Current focused date is #=kendo.toString(data.current, "D")#' }, setOptions: function(e) { var t = this, i = t._value; s.fn.setOptions.call(t, e), e = t.options, e.min = l(e.min), e.max = l(e.max), n(e), t.dateView.setOptions(e), i && (t.element.val(o.toString(i, e.format, e.culture)), t._updateARIA(i)) }, _editable: function(e) { var t = this, n = t._dateIcon.off(f), r = t.element.off(f), o = t._inputWrapper.off(f), a = e.readonly, s = e.disable; a || s ? (o.addClass(s ? C : y).removeClass(s ? y : C), r.attr(w, s).attr(b, a).attr(M, s).attr(R, a)) : (o.addClass(y).removeClass(C).on(T, t._toggleHover), r.removeAttr(w).removeAttr(b).attr(M, !1).attr(R, !1).on("keydown" + f, V(t._keydown, t)).on("focusout" + f, V(t._blur, t)).on("focus" + f, function() { t._inputWrapper.addClass(k) }), n.on(g, V(t._click, t)).on(D, i)) }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, destroy: function() { var e = this; s.fn.destroy.call(e), e.dateView.destroy(), e.element.off(f), e._dateIcon.off(f), e._inputWrapper.off(f), e._form && e._form.off("reset", e._resetHandler) }, open: function() { this.dateView.open() }, close: function() { this.dateView.close() }, min: function(e) { return this._option(E, e) }, max: function(e) { return this._option(I, e) }, value: function(e) { var n = this; return e === t ? n._value : (n._old = n._update(e), null === n._old && n.element.val(""), n._oldText = n.element.val(), t) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(S, "mouseenter" === t.type) }, _blur: function() { var e = this, t = e.element.val(); e.close(), t !== e._oldText && e._change(t), e._inputWrapper.removeClass(k) }, _click: function() { var e = this, t = e.element; e.dateView.toggle(), o.support.touch || t[0] === u() || t.focus() }, _change: function(e) { var t = this; e = t._update(e), +t._old != +e && (t._old = e, t._oldText = t.element.val(), t._typing || t.element.trigger(_), t.trigger(_)), t._typing = !1 }, _keydown: function(e) { var t = this, n = t.dateView, i = t.element.val(), r = !1; n.popup.visible() || e.keyCode != c.ENTER || i === t._oldText ? (r = n.move(e), t._updateARIA(n._current), r || (t._typing = !0)) : t._change(i) }, _icon: function() { var t, n = this, i = n.element; t = i.next("span.k-select"), t[0] || (t = e('<span unselectable="on" class="k-select"><span unselectable="on" class="k-icon k-i-calendar">select</span></span>').insertAfter(i)), n._dateIcon = t.attr({ role: "button", "aria-controls": n.dateView._dateViewID }) }, _option: function(e, n) { var i = this, r = i.options; return n === t ? r[e] : (n = l(n, r.parseFormats, r.culture), n && (r[e] = new U(+n), i.dateView[e](n)), t) }, _update: function(e) { var t, n = this, i = n.options, r = i.min, a = i.max, s = n._value, c = l(e, i.parseFormats, i.culture), d = null === c && null === s || c instanceof Date && s instanceof Date; return +c === +s && d ? (t = o.toString(c, i.format, i.culture), t !== e && n.element.val(null === c ? e : t), c) : (null !== c && N(c, r) ? c = L(c, r, a) : B(c, r, a) || (c = null), n._value = c, n.dateView.value(c), n.element.val(c ? o.toString(c, i.format, i.culture) : e), n._updateARIA(c), c) }, _wrapper: function() { var t, n = this, i = n.element; t = i.parents(".k-datepicker"), t[0] || (t = i.wrap(p).parent().addClass("k-picker-wrap k-state-default"), t = t.wrap(p).parent()), t[0].style.cssText = i[0].style.cssText, i.css({ width: "100%", height: i[0].style.height }), n.wrapper = t.addClass("k-widget k-datepicker k-header").addClass(i[0].className), n._inputWrapper = e(t[0].firstChild) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { t.value(n[0].defaultValue), t.max(t._initialOptions.max), t.min(t._initialOptions.min) }, t._form = r.on("reset", t._resetHandler)) }, _template: function() { this._ariaTemplate = d(this.options.ARIATemplate) }, _updateARIA: function(e) { var t, n = this, i = n.dateView.calendar; n.element.removeAttr("aria-activedescendant"), i && (t = i._cell, t.attr("aria-label", n._ariaTemplate({ current: e || i.current() })), n.element.attr("aria-activedescendant", t.attr("id"))) } }), a.plugin(r) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { return n ? t.substring(0, e).split(n).length - 1 : 0 } function i(e, t, i) { return t.split(i)[n(e, t, i)] } function r(e, t, i, r) { var o = t.split(r); return o.splice(n(e, t, r), 1, i), r && "" !== o[o.length - 1] && o.push(""), o.join(r) } var o = window.kendo, a = o.support, s = o.caret, l = o._activeElement, c = a.placeholder, d = o.ui, u = d.List, h = o.keys, p = o.data.DataSource, f = "aria-disabled", g = "aria-readonly", m = "k-state-default", v = "disabled", _ = "readonly", w = "k-state-focused", b = "k-state-selected", y = "k-state-disabled", k = "k-state-hover", x = ".kendoAutoComplete", C = "mouseenter" + x + " mouseleave" + x, S = e.proxy, T = u.extend({ init: function(t, n) { var i, r, a = this; a.ns = x, n = e.isArray(n) ? { dataSource: n } : n, u.fn.init.call(a, t, n), t = a.element, n = a.options, n.placeholder = n.placeholder || t.attr("placeholder"), c && t.attr("placeholder", n.placeholder), a._wrapper(), a._loader(), a._dataSource(), a._ignoreCase(), t[0].type = "text", i = a.wrapper, a._popup(), t.addClass("k-input").on("keydown" + x, S(a._keydown, a)).on("paste" + x, S(a._search, a)).on("focus" + x, function() { a._prev = a._accessor(), a._placeholder(!1), i.addClass(w) }).on("focusout" + x, function() { a._change(), a._placeholder(), i.removeClass(w) }).attr({ autocomplete: "off", role: "textbox", "aria-haspopup": !0 }), a._enable(), a._old = a._accessor(), t[0].id && t.attr("aria-owns", a.ul[0].id), a._aria(), a._placeholder(), a._initList(), r = e(a.element).parents("fieldset").is(":disabled"), r && a.enable(!1), o.notify(a) }, options: { name: "AutoComplete", enabled: !0, suggest: !1, template: "", groupTemplate: "#:data#", fixedGroupTemplate: "#:data#", dataTextField: "", minLength: 1, delay: 200, height: 200, filter: "startswith", ignoreCase: !0, highlightFirst: !1, separator: null, placeholder: "", animation: {}, value: null }, _dataSource: function() { var e = this; e.dataSource && e._refreshHandler ? e._unbindDataSource() : e._progressHandler = S(e._showBusy, e), e.dataSource = p.create(e.options.dataSource).bind("progress", e._progressHandler) }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.listView.setDataSource(this.dataSource) }, events: ["open", "close", "change", "select", "filtering", "dataBinding", "dataBound"], setOptions: function(e) { var t = this._listOptions(e); u.fn.setOptions.call(this, e), t.dataValueField = t.dataTextField, this.listView.setOptions(t), this._accessors(), this._aria() }, _editable: function(e) { var t = this, n = t.element, i = t.wrapper.off(x), r = e.readonly, o = e.disable; r || o ? (i.addClass(o ? y : m).removeClass(o ? m : y), n.attr(v, o).attr(_, r).attr(f, o).attr(g, r)) : (i.addClass(m).removeClass(y).on(C, t._toggleHover), n.removeAttr(v).removeAttr(_).attr(f, !1).attr(g, !1)) }, close: function() { var e = this, t = e.listView.focus(); t && t.removeClass(b), e.popup.close() }, destroy: function() { var e = this; e.element.off(x), e.wrapper.off(x), u.fn.destroy.call(e) }, refresh: function() { this.listView.refresh() }, select: function(e) { this._select(e) }, search: function(e) { var t, n = this, r = n.options, o = r.ignoreCase, a = r.separator; e = e || n._accessor(), clearTimeout(n._typingTimeout), a && (e = i(s(n.element)[0], e, a)), t = e.length, (!t || t >= r.minLength) && (n._open = !0, n.listView.filter(!0), n._filterSource({ value: o ? e.toLowerCase() : e, operator: r.filter, field: r.dataTextField, ignoreCase: o })) }, suggest: function(e) { var i, r = this, o = r._last, a = r._accessor(), c = r.element[0], d = s(c)[0], p = r.options.separator, f = a.split(p), g = n(d, a, p), m = d; return o == h.BACKSPACE || o == h.DELETE ? (r._last = t, t) : (e = e || "", "string" != typeof e && (e[0] && (e = r.dataSource.view()[u.inArray(e[0], r.ul[0])]), e = e ? r._text(e) : ""), 0 >= d && (d = a.toLowerCase().indexOf(e.toLowerCase()) + 1), i = a.substring(0, d).lastIndexOf(p), i = i > -1 ? d - (i + p.length) : d, a = f[g].substring(0, i), e && (e = "" + e, i = e.toLowerCase().indexOf(a.toLowerCase()), i > -1 && (e = e.substring(i + a.length), m = d + e.length, a += e), p && "" !== f[f.length - 1] && f.push("")), f[g] = a, r._accessor(f.join(p || "")), c === l() && s(c, d, m), t) }, value: function(e) { return e === t ? this._accessor() : (this.listView.value(e), this._accessor(e), this._old = this._accessor(), t) }, _click: function(e) { var n = e.item, i = this.element; return this.trigger("select", { item: n }) ? (this.close(), t) : (this._select(n), this._blur(), s(i, i.val().length), t) }, _initList: function() { var t = this, n = t.options.virtual, i = !!n, r = S(t._listBound, t), a = { autoBind: !1, selectable: !0, dataSource: t.dataSource, click: e.proxy(t._click, this), change: e.proxy(t._listChange, this), activate: S(t._activateItem, t), deactivate: S(t._deactivateItem, t), dataBinding: function() { t.trigger("dataBinding"), t._angularItems("cleanup") }, dataBound: r, listBound: r }; a = e.extend(t._listOptions(), a, "object" == typeof n ? n : {}), a.dataValueField = a.dataTextField, t.listView = i ? new o.ui.VirtualList(t.ul, a) : new o.ui.StaticList(t.ul, a), t.listView.value(t.options.value) }, _listBound: function() { var e, n, i = this, r = i.popup, o = i.options, a = i.dataSource.flatView(), s = a.length, c = i.element[0] === l(); i._angularItems("compile"), i.listView.value([]), i.listView.focus(-1), i.listView.filter(!1), i._calculateGroupPadding(i._height(s)), r.position(), s && (n = this.listView.focus(), o.highlightFirst && !n && i.listView.first(), o.suggest && c && i.suggest(a[0])), i._open && (i._open = !1, e = s ? "open" : "close", i._typingTimeout && !c && (e = "close"), r[e](), i._typingTimeout = t), i._touchScroller && i._touchScroller.reset(), i._hideBusy(), i._makeUnselectable(), i.trigger("dataBound") }, _listChange: function() { this.listView.filter() || this._selectValue(this.listView.selectedDataItems()[0]) }, _selectValue: function(e) { var t = this.options.separator, n = ""; e && (n = this._text(e)), null === n && (n = ""), t && (n = r(s(this.element)[0], this._accessor(), n, t)), this._prev = n, this._accessor(n), this._placeholder() }, _accessor: function(e) { var n = this, i = n.element[0]; return e === t ? (e = i.value, i.className.indexOf("k-readonly") > -1 && e === n.options.placeholder ? "" : e) : (i.value = null === e ? "" : e, n._placeholder(), t) }, _keydown: function(e) { var t = this, n = e.keyCode, i = t.popup.visible(), r = this.listView.focus(); if (t._last = n, n === h.DOWN) i && this._move(r ? "next" : "first"), e.preventDefault(); else if (n === h.UP) i && this._move(r ? "prev" : "last"), e.preventDefault(); else if (n === h.ENTER || n === h.TAB) { if (n === h.ENTER && i && e.preventDefault(), i && r) { if (t.trigger("select", { item: r })) return; this._select(r) } this._blur() } else n === h.ESC ? (i && e.preventDefault(), t.close()) : (t._search(), t._typing = !0) }, _move: function(e) { this.listView[e](), this.options.suggest && this.suggest(this.listView.focus()) }, _hideBusy: function() { var e = this; clearTimeout(e._busy), e._loading.hide(), e.element.attr("aria-busy", !1), e._busy = null }, _showBusy: function() { var e = this; e._busy || (e._busy = setTimeout(function() { e.element.attr("aria-busy", !0), e._loading.show() }, 100)) }, _placeholder: function(e) { if (!c) { var n, i = this, r = i.element, o = i.options.placeholder; if (o) { if (n = r.val(), e === t && (e = !n), e || (o = n !== o ? n : ""), n === i._old && !e) return; r.toggleClass("k-readonly", e).val(o), o || r[0] !== document.activeElement || s(r[0], 0, 0) } } }, _search: function() { var e = this; clearTimeout(e._typingTimeout), e._typingTimeout = setTimeout(function() { e._prev !== e._accessor() && (e._prev = e._accessor(), e.search()) }, e.options.delay) }, _select: function(e) { this.listView.select(e) }, _loader: function() { this._loading = e('<span class="k-icon k-loading" style="display:none"></span>').insertAfter(this.element) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(k, "mouseenter" === t.type) }, _wrapper: function() { var e, t = this, n = t.element, i = n[0]; e = n.parent(), e.is("span.k-widget") || (e = n.wrap("<span />").parent()), e.attr("tabindex", -1), e.attr("role", "presentation"), e[0].style.cssText = i.style.cssText, n.css({ width: "100%", height: i.style.height }), t._focused = t.element, t.wrapper = e.addClass("k-widget k-autocomplete k-header").addClass(i.className) } }); d.plugin(T) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { for (var i, r = 0, o = t.length - 1; o > r; ++r) i = t[r], i in e || (e[i] = {}), e = e[i]; e[t[o]] = n } var i = window.kendo, r = i.ui, o = r.Select, a = i.support, s = i._activeElement, l = i.data.ObservableObject, c = i.keys, d = ".kendoDropDownList", u = "disabled", h = "readonly", p = "change", f = "k-state-focused", g = "k-state-default", m = "k-state-disabled", v = "aria-disabled", _ = "aria-readonly", w = "mouseenter" + d + " mouseleave" + d, b = "tabindex", y = "filter", k = "accept", x = e.proxy, C = o.extend({ init: function(n, r) { var a, s, l, c = this, u = r && r.index; c.ns = d, r = e.isArray(r) ? { dataSource: r } : r, o.fn.init.call(c, n, r), r = c.options, n = c.element.on("focus" + d, x(c._focusHandler, c)), c._focusInputHandler = e.proxy(c._focusInput, c), c._inputTemplate(), c._reset(), c._prev = "", c._word = "", c.optionLabel = e(), c._wrapper(), c._tabindex(), c.wrapper.data(b, c.wrapper.attr(b)), c._span(), c._popup(), c._mobile(), c._dataSource(), c._ignoreCase(), c._filterHeader(), c._aria(), c._enable(), c._oldIndex = c.selectedIndex = -1, u !== t && (r.index = u), c._initialIndex = r.index, c._optionLabel(), c._initList(), c._cascade(), r.autoBind ? c.dataSource.fetch() : -1 === c.selectedIndex && (s = r.text || "", s || (a = r.optionLabel, a && 0 === r.index ? s = a : c._isSelect && (s = n.children(":selected").text())), c._textAccessor(s)), l = e(c.element).parents("fieldset").is(":disabled"), l && c.enable(!1), i.notify(c) }, options: { name: "DropDownList", enabled: !0, autoBind: !0, index: 0, text: null, value: null, delay: 500, height: 200, dataTextField: "", dataValueField: "", optionLabel: "", cascadeFrom: "", cascadeFromField: "", ignoreCase: !0, animation: {}, filter: "none", minLength: 1, virtual: !1, template: null, valueTemplate: null, optionLabelTemplate: null, groupTemplate: "#:data#", fixedGroupTemplate: "#:data#" }, events: ["open", "close", p, "select", "filtering", "dataBinding", "dataBound", "cascade"], setOptions: function(e) { o.fn.setOptions.call(this, e), this.listView.setOptions(this._listOptions(e)), this._optionLabel(), this._inputTemplate(), this._accessors(), this._filterHeader(), this._enable(), this._aria(), !this.value() && this.optionLabel[0] && this.select(0) }, destroy: function() { var e = this; e.wrapper.off(d), e.element.off(d), e._inputWrapper.off(d), e._arrow.off(), e._arrow = null, e.optionLabel.off(), o.fn.destroy.call(e) }, open: function() { var e = this; e.popup.visible() || (e.listView.isBound() && e._state !== k ? e._allowOpening() && (e.popup.one("activate", e._focusInputHandler), e.popup.open(), e._focusItem()) : (e._open = !0, e._state = "rebind", e.filterInput && (e.filterInput.val(""), e._prev = ""), e._filterSource())) }, _focusInput: function() { this._focusElement(this.filterInput) }, _allowOpening: function() { return this.optionLabel[0] || this.filterInput || this.dataSource.view().length }, toggle: function(e) { this._toggle(e, !0) }, current: function(e) { var n; return e === t ? (n = this.listView.focus(), !n && 0 === this.selectedIndex && this.optionLabel[0] ? this.optionLabel : n) : (this._focus(e), t) }, dataItem: function(n) { var i = this, r = null, o = !!i.optionLabel[0], a = i.options.optionLabel; return n === t ? r = i.listView.selectedDataItems()[0] : ("number" != typeof n ? n = n.hasClass("k-list-optionlabel") ? -1 : e(i.items()).index(n) : o && (n -= 1), r = i.dataSource.flatView()[n]), !r && o && (r = e.isPlainObject(a) ? new l(a) : i._assignInstance(i._optionLabelText(), "")), r }, refresh: function() { this.listView.refresh() }, text: function(e) { var n, i, r = this, o = r.options.ignoreCase; return e = null === e ? "" : e, e === t ? r._textAccessor() : ("string" == typeof e && (i = o ? e.toLowerCase() : e, r._select(function(e) { return e = r._text(e), o && (e = (e + "").toLowerCase()), e === i }), n = r.dataItem(), n && (e = n)), r._textAccessor(e), t) }, value: function(e) { var n = this, i = n.dataSource; return e === t ? (e = n._accessor() || n.listView.value()[0], e === t || null === e ? "" : e) : (e && (n._initialIndex = null), n._request && n.options.cascadeFrom && n.listView.isBound() ? (n._valueSetter && i.unbind(p, n._valueSetter), n._valueSetter = x(function() { n.value(e) }, n), i.one(p, n._valueSetter), t) : (n.listView.value(e).done(function() { -1 === n.selectedIndex && n.text() && (n.text(""), n._accessor("", -1)), n._old = n._accessor(), n._oldIndex = n.selectedIndex }), n._fetchData(), t)) }, _optionLabel: function() { var n = this, r = n.options, o = r.optionLabel, a = r.optionLabelTemplate; return o ? (a || (a = "#:", a += "string" == typeof o ? "data" : i.expr(r.dataTextField, "data"), a += "#"), "function" != typeof a && (a = i.template(a)), n.optionLabelTemplate = a, n.optionLabel[0] || (n.optionLabel = e('<div class="k-list-optionlabel"></div>').prependTo(n.list)), n.optionLabel.html(a(o)).off().click(x(n._click, n)).on(w, n._toggleHover), n.angular("compile", function() { return { elements: n.optionLabel } }), t) : (n.optionLabel.off().remove(), n.optionLabel = e(), t) }, _optionLabelText: function() { var e = this.options.optionLabel; return "string" == typeof e ? e : this._text(e) }, _listBound: function() { var e, t, n, i = this, r = i._initialIndex, o = i.options.optionLabel, a = i._state === y, s = i.dataSource.flatView(), l = s.length; i._angularItems("compile"), i._presetValue = !1, i.options.virtual || (t = i._height(a ? l || 1 : l), i._calculateGroupPadding(t)), i.popup.position(), i._isSelect && (n = i.value(), l ? o && (o = i._option("", i._optionLabelText())) : n && (o = i._option(n, i.text())), i._options(s, o, n)), i._makeUnselectable(), a || (i._open && i.toggle(i._allowOpening()), i._open = !1, i._fetch || (l ? (!i.listView.value().length && r > -1 && null !== r && i.select(r), i._initialIndex = null, e = i.listView.selectedDataItems()[0], e && i.text() !== i._text(e) && i._selectValue(e)) : i._textAccessor() !== i._optionLabelText() && (i.listView.value(""), i._selectValue(null), i._oldIndex = i.selectedIndex))), i._hideBusy(), i.trigger("dataBound") }, _listChange: function() { this._selectValue(this.listView.selectedDataItems()[0]), (this._presetValue || this._old && -1 === this._oldIndex) && (this._oldIndex = this.selectedIndex) }, _focusHandler: function() { this.wrapper.focus() }, _focusinHandler: function() { this._inputWrapper.addClass(f), this._prevent = !1 }, _focusoutHandler: function() { var e = this, t = e._state === y, n = window.self !== window.top, i = e._focus(); e._prevent || (clearTimeout(e._typingTimeout), t && i && !e.trigger("select", { item: i }) && e._select(i, !e.dataSource.view().length), a.mobileOS.ios && n ? e._change() : e._blur(), e._inputWrapper.removeClass(f), e._prevent = !0, e._open = !1, e.element.blur()) }, _wrapperMousedown: function() { this._prevent = !!this.filterInput }, _wrapperClick: function(e) { e.preventDefault(), this.popup.unbind("activate", this._focusInputHandler), this._focused = this.wrapper, this._toggle() }, _editable: function(e) { var t = this, n = t.element, i = e.disable, r = e.readonly, o = t.wrapper.add(t.filterInput).off(d), a = t._inputWrapper.off(w); r || i ? i ? (o.removeAttr(b), a.addClass(m).removeClass(g)) : (a.addClass(g).removeClass(m), o.on("focusin" + d, x(t._focusinHandler, t)).on("focusout" + d, x(t._focusoutHandler, t))) : (n.removeAttr(u).removeAttr(h), a.addClass(g).removeClass(m).on(w, t._toggleHover), o.attr(b, o.data(b)).attr(v, !1).attr(_, !1).on("keydown" + d, x(t._keydown, t)).on("focusin" + d, x(t._focusinHandler, t)).on("focusout" + d, x(t._focusoutHandler, t)).on("mousedown" + d, x(t._wrapperMousedown, t)), t.wrapper.on("click" + d, x(t._wrapperClick, t)), t.filterInput || o.on("keypress" + d, x(t._keypress, t))), n.attr(u, i).attr(h, r), o.attr(v, i).attr(_, r) }, _option: function(e, t) { return '<option value="' + e + '">' + t + "</option>" }, _keydown: function(e) { var n, i, r = this, o = e.keyCode, a = e.altKey, l = r.popup.visible(); if (r.filterInput && (n = r.filterInput[0] === s()), o === c.LEFT ? (o = c.UP, i = !0) : o === c.RIGHT && (o = c.DOWN, i = !0), !i || !n) { if (e.keyCode = o, a && o === c.UP && r._focusElement(r.wrapper), o === c.ENTER && r._typingTimeout && r.filterInput && l) return e.preventDefault(), t; i = r._move(e), i || (l && r.filterInput || (o === c.HOME ? (i = !0, r._firstItem()) : o === c.END && (i = !0, r._lastItem()), i && (r._select(r._focus()), e.preventDefault())), a || i || !r.filterInput || r._search()) } }, _matchText: function(e, t) { var n = this, i = n.options.ignoreCase, r = !1; return e += "", i && (e = e.toLowerCase()), 0 === e.indexOf(n._word) && (n.optionLabel[0] && (t += 1), n._select(t), n.popup.visible() || n._change(), r = !0), r }, _selectNext: function(e) { for (var t, n = this, i = e, r = n.dataSource.flatView(), o = r.length; o > e; e++) if (t = n._text(r[e]), t && n._matchText(t, e) && (1 !== n._word.length || i !== n.selectedIndex)) return !0; if (i > 0 && o > i) for (e = 0; i >= e; e++) if (t = n._text(r[e]), t && n._matchText(t, e)) return !0; return !1 }, _keypress: function(e) { var t, n, r, o = this; 0 !== e.which && e.keyCode !== i.keys.ENTER && (t = String.fromCharCode(e.charCode || e.keyCode), n = o.selectedIndex, r = o._word.length, o.options.ignoreCase && (t = t.toLowerCase()), " " === t && e.preventDefault(), r || (o._word = t), o._last === t && 1 >= r && n > -1 && o._selectNext(n) || (r && (o._word += t), o._last = t, o._search())) }, _popupOpen: function() { var e = this.popup; e.wrapper = i.wrap(e.element), e.element.closest(".km-root")[0] && (e.wrapper.addClass("km-popup km-widget"), this.wrapper.addClass("km-widget")) }, _popup: function() { o.fn._popup.call(this), this.popup.one("open", x(this._popupOpen, this)) }, _click: function(n) { var i = n.item || e(n.currentTarget); return this.trigger("select", { item: i }) ? (this.close(), t) : (this._userTriggered = !0, this._select(i), this._focusElement(this.wrapper), this._blur(), t) }, _focusElement: function(e) { var t = s(), n = this.wrapper, i = this.filterInput, r = e === i ? n : i, o = a.mobileOS && (a.touch || a.MSPointers || a.pointers); i && i[0] === e[0] && o || i && r[0] === t && (this._prevent = !0, this._focused = e.focus()) }, _filter: function(e) { var n, i; e && (n = this, i = n.options.ignoreCase, i && (e = e.toLowerCase()), n._select(function(r) { var o = n._text(r); return o !== t ? (o += "", i && (o = o.toLowerCase()), 0 === o.indexOf(e)) : t })) }, _search: function() { var e = this, n = e.dataSource, i = e.selectedIndex; if (clearTimeout(e._typingTimeout), "none" !== e.options.filter) e._typingTimeout = setTimeout(function() { var t = e.filterInput.val(); e._prev !== t && (e._prev = t, e.search(t)), e._typingTimeout = null }, e.options.delay); else { if (e._typingTimeout = setTimeout(function() { e._word = "" }, e.options.delay), -1 === i && (i = 0), !e.ul[0].firstChild) return n.fetch().done(function() { n.data()[0] && i > -1 && e._selectNext(i) }), t; e._selectNext(i) } }, _get: function(t) { var n, i, r, o = "function" == typeof t, a = o ? e() : e(t); if (this.optionLabel[0] && ("number" == typeof t ? t > -1 && (t -= 1) : a.hasClass("k-list-optionlabel") && (t = -1)), o) { for (n = this.dataSource.flatView(), r = 0; n.length > r; r++) if (t(n[r])) { t = r, i = !0; break } i || (t = -1) } return t }, _firstItem: function() { this.optionLabel[0] ? this._focus(this.optionLabel) : this.listView.first() }, _lastItem: function() { this.optionLabel.removeClass("k-state-focused"), this.listView.last() }, _nextItem: function() { this.optionLabel.hasClass("k-state-focused") ? (this.optionLabel.removeClass("k-state-focused"), this.listView.first()) : this.listView.next() }, _prevItem: function() { this.optionLabel.hasClass("k-state-focused") || (this.listView.prev(), this.listView.focus() || this.optionLabel.addClass("k-state-focused")) }, _focusItem: function() { var e = this.listView, n = e.focus(), i = e.select(); i = i[i.length - 1], i === t && this.options.highlightFirst && !n && (i = 0), i !== t ? e.focus(i) : this.options.optionLabel ? (this._focus(this.optionLabel), this._select(this.optionLabel)) : e.scrollToIndex(0) }, _focus: function(e) { var n = this.listView, i = this.optionLabel; return e === t ? (e = n.focus(), !e && i.hasClass("k-state-focused") && (e = i), e) : (i.removeClass("k-state-focused"), e = this._get(e), n.focus(e), -1 === e && i.addClass("k-state-focused"), t) }, _select: function(e, t) { var n = this; e = n._get(e), n.listView.select(e), t || n._state !== y || (n.listView.filter(!1), n._state = k), -1 === e && n._selectValue(null) }, _selectValue: function(e) { var n = this, i = n.options.optionLabel, r = n.optionLabel, o = n.listView.select(), a = "", s = ""; o = o[o.length - 1], o === t && (o = -1), r.removeClass("k-state-focused k-state-selected"), e ? (s = e, a = n._dataValue(e), i && (o += 1)) : i && (n._focus(r.addClass("k-state-selected")), s = n._optionLabelText(), a = "string" == typeof i ? "" : n._value(i), o = 0), n.selectedIndex = o, null === a && (a = ""), n._textAccessor(s), n._accessor(a, o), n._triggerCascade() }, _mobile: function() { var e = this, t = e.popup, n = a.mobileOS, i = t.element.parents(".km-root").eq(0); i.length && n && (t.options.animation.open.effects = n.android || n.meego ? "fadeIn" : n.ios || n.wp ? "slideIn:up" : t.options.animation.open.effects) }, _filterHeader: function() { var t, n = this.options, i = "none" !== n.filter; this.filterInput && (this.filterInput.off(d).parent().remove(), this.filterInput = null), i && (t = '<span unselectable="on" class="k-icon k-i-search">select</span>', this.filterInput = e('<input class="k-textbox"/>').attr({ role: "listbox", "aria-haspopup": !0, "aria-expanded": !1 }), this.list.prepend(e('<span class="k-list-filter" />').append(this.filterInput.add(t)))) }, _span: function() { var t, n = this, i = n.wrapper, r = "span.k-input"; t = i.find(r), t[0] || (i.append('<span unselectable="on" class="k-dropdown-wrap k-state-default"><span unselectable="on" class="k-input"> </span><span unselectable="on" class="k-select"><span unselectable="on" class="k-icon k-i-arrow-s">select</span></span></span>').append(n.element), t = i.find(r)), n.span = t, n._inputWrapper = e(i[0].firstChild), n._arrow = i.find(".k-icon") }, _wrapper: function() { var e, t = this, n = t.element, i = n[0]; e = n.parent(), e.is("span.k-widget") || (e = n.wrap("<span />").parent(), e[0].style.cssText = i.style.cssText, e[0].title = i.title), n.hide(), t._focused = t.wrapper = e.addClass("k-widget k-dropdown k-header").addClass(i.className).css("display", "").attr({ unselectable: "on", role: "listbox", "aria-haspopup": !0, "aria-expanded": !1 }) }, _clearSelection: function(e) { this.select(e.value() ? 0 : -1) }, _inputTemplate: function() { var t = this, n = t.options.valueTemplate; n = n ? i.template(n) : e.proxy(i.template("#:this._text(data)#", { useWithBlock: !1 }), t), t.valueTemplate = n }, _textAccessor: function(n) { var i, r = null, o = this.valueTemplate, a = this.options, s = a.optionLabel, c = this.span; return n === t ? c.text() : (e.isPlainObject(n) || n instanceof l ? r = n : s && this._optionLabelText() === n && (r = s, o = this.optionLabelTemplate), r || (r = this._assignInstance(n, this._accessor())), i = function() { return { elements: c.get(), data: [{ dataItem: r }] } }, this.angular("cleanup", i), c.html(o(r)), this.angular("compile", i), t) }, _preselect: function(e, t) { e || t || (t = this._optionLabelText()), this._accessor(e), this._textAccessor(t), this._old = this._accessor(), this._oldIndex = this.selectedIndex, this.listView.setValue(e), this._initialIndex = null, this._presetValue = !0 }, _assignInstance: function(e, t) { var i = this.options.dataTextField, r = {}; return i ? (n(r, i.split("."), e), n(r, this.options.dataValueField.split("."), t), r = new l(r)) : r = e, r } }); r.plugin(C) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui, r = i.List, o = i.Select, a = n.caret, s = n.support, l = s.placeholder, c = n._activeElement, d = n.keys, u = ".kendoComboBox", h = "click" + u, p = "mousedown" + u, f = "disabled", g = "readonly", m = "change", v = "k-state-default", _ = "k-state-focused", w = "k-state-disabled", b = "aria-disabled", y = "aria-readonly", k = "filter", x = "accept", C = "rebind", S = "mouseenter" + u + " mouseleave" + u, T = e.proxy, D = o.extend({ init: function(t, i) { var r, a, s = this; s.ns = u, i = e.isArray(i) ? { dataSource: i } : i, o.fn.init.call(s, t, i), i = s.options, t = s.element.on("focus" + u, T(s._focusHandler, s)), i.placeholder = i.placeholder || t.attr("placeholder"), s._reset(), s._wrapper(), s._input(), s._tabindex(s.input), s._popup(), s._dataSource(), s._ignoreCase(), s._enable(), s._oldIndex = s.selectedIndex = -1, s._aria(), s._initialIndex = i.index, s._initList(), s._cascade(), i.autoBind ? s._filterSource() : (r = i.text, !r && s._isSelect && (r = t.children(":selected").text()), r && (s.input.val(r), s._prev = r)), r || s._placeholder(), a = e(s.element).parents("fieldset").is(":disabled"), a && s.enable(!1), n.notify(s) }, options: { name: "ComboBox", enabled: !0, index: -1, text: null, value: null, autoBind: !0, delay: 200, dataTextField: "", dataValueField: "", minLength: 0, height: 200, highlightFirst: !0, filter: "none", placeholder: "", suggest: !1, cascadeFrom: "", cascadeFromField: "", ignoreCase: !0, animation: {}, template: null, groupTemplate: "#:data#", fixedGroupTemplate: "#:data#" }, events: ["open", "close", m, "select", "filtering", "dataBinding", "dataBound", "cascade"], setOptions: function(e) { o.fn.setOptions.call(this, e), this.listView.setOptions(e), this._accessors(), this._aria() }, destroy: function() { var e = this; e.input.off(u), e.element.off(u), e._inputWrapper.off(u), o.fn.destroy.call(e) }, _focusHandler: function() { this.input.focus() }, _arrowClick: function() { this._toggle() }, _inputFocus: function() { this._inputWrapper.addClass(_), this._placeholder(!1) }, _inputFocusout: function() { var e = this; e._inputWrapper.removeClass(_), clearTimeout(e._typingTimeout), e._typingTimeout = null, e.options.text !== e.input.val() && e.text(e.text()), e._placeholder(), e._blur(), e.element.blur() }, _editable: function(e) { var t = this, n = e.disable, i = e.readonly, r = t._inputWrapper.off(u), o = t.element.add(t.input.off(u)), a = t._arrow.parent().off(h + " " + p); i || n ? (r.addClass(n ? w : v).removeClass(n ? v : w), o.attr(f, n).attr(g, i).attr(b, n).attr(y, i)) : (r.addClass(v).removeClass(w).on(S, t._toggleHover), o.removeAttr(f).removeAttr(g).attr(b, !1).attr(y, !1), a.on(h, T(t._arrowClick, t)).on(p, function(e) { e.preventDefault() }), t.input.on("keydown" + u, T(t._keydown, t)).on("focus" + u, T(t._inputFocus, t)).on("focusout" + u, T(t._inputFocusout, t))) }, open: function() { var e = this, t = e._state; e.popup.visible() || (!e.listView.isBound() && t !== k || t === x ? (e._open = !0, e._state = C, e.listView.filter(!1), e._filterSource()) : (e.popup.open(), e._focusItem())) }, _listBound: function() { var e, n, i, r, o = this, a = o.options, s = o._initialIndex, l = o._state === k, d = o.input[0] === c(), u = o.listView, h = u.focus(), p = this.dataSource.flatView(), f = this.dataSource.page(), g = p.length; o._angularItems("compile"), o._presetValue = !1, a.virtual || o._calculateGroupPadding(o._height(g)), o.popup.position(), o._isSelect && (n = o.element[0].children[0], o._state === C && (o._state = ""), i = !0, r = o._customOption, o._customOption = t, o._options(p, "", o.value()), r && r[0].selected ? o._custom(r.val(), i) : n || o._custom("", i)), o._makeUnselectable(), l || o._fetch ? l && h && h.removeClass("k-state-selected") : (u.value().length || (null !== s && s > -1 ? (o.select(s), h = u.focus()) : o._accessor() && u.value(o._accessor())), o._initialIndex = null, e = o.listView.selectedDataItems()[0], e && o.text() && o.text() !== o._text(e) && o._selectValue(e)), !g || f !== t && 1 !== f || (a.highlightFirst ? h || u.focusIndex() || u.focus(0) : u.focus(-1), a.suggest && d && o.input.val() && o.suggest(p[0])), o._open && (o._open = !1, o._typingTimeout && !d ? o.popup.close() : o.toggle(!!g), o._typingTimeout = null), o._touchScroller && o._touchScroller.reset(), o._hideBusy(), o.trigger("dataBound") }, _listChange: function() { this._selectValue(this.listView.selectedDataItems()[0]), this._presetValue && (this._oldIndex = this.selectedIndex) }, _get: function(e) { var t, n, i; if ("function" == typeof e) { for (t = this.dataSource.flatView(), i = 0; t.length > i; i++) if (e(t[i])) { e = i, n = !0; break } n || (e = -1) } return e }, _select: function(e, t) { e = this._get(e), -1 === e && (this.input[0].value = "", this._accessor("")), this.listView.select(e), t || this._state !== k || (this.listView.filter(!1), this._state = x) }, _selectValue: function(e) { var n = this.listView.select(), i = "", r = ""; n = n[n.length - 1], n === t && (n = -1), this.selectedIndex = n, -1 === n ? (i = r = this.input[0].value, this.listView.focus(-1)) : (e && (i = this._dataValue(e), r = this._text(e)), null === i && (i = "")), this._prev = this.input[0].value = r, this._accessor(i !== t ? i : r, n), this._placeholder(), this._triggerCascade() }, refresh: function() { this.listView.refresh() }, suggest: function(e) { var n, i = this, o = i.input[0], s = i.text(), l = a(o)[0], u = i._last; return u == d.BACKSPACE || u == d.DELETE ? (i._last = t, t) : (e = e || "", "string" != typeof e && (e[0] && (e = i.dataSource.view()[r.inArray(e[0], i.ul[0])]), e = e ? i._text(e) : ""), 0 >= l && (l = s.toLowerCase().indexOf(e.toLowerCase()) + 1), e ? (e = "" + e, n = e.toLowerCase().indexOf(s.toLowerCase()), n > -1 && (s += e.substring(n + s.length))) : s = s.substring(0, l), s.length === l && e || (o.value = s, o === c() && a(o, l, s.length)), t) }, text: function(e) { var n, i, r, o, a, s; if (e = null === e ? "" : e, n = this, i = n.input[0], r = n.options.ignoreCase, o = e, e === t) return i.value; if (a = n.dataItem(), n.options.autoBind !== !1 || n.listView.isBound()) { if (a && n._text(a) === e && (s = n._value(a), null === s ? s = "" : s += "", s === n._old)) return n._triggerCascade(), t; r && (o = o.toLowerCase()), n._select(function(e) { return e = n._text(e), r && (e = (e + "").toLowerCase()), e === o }), 0 > n.selectedIndex && (n._accessor(e), i.value = e, n._triggerCascade()), n._prev = i.value } }, toggle: function(e) { this._toggle(e, !0) }, value: function(e) { var n = this, i = n.options; return e === t ? (e = n._accessor() || n.listView.value()[0], e === t || null === e ? "" : e) : ((e !== i.value || n.input.val() !== i.text) && (n._accessor(e), n.listView.value(e).done(function() { n._selectValue(n.listView.selectedDataItems()[0]), -1 === n.selectedIndex && (n._accessor(e), n.input.val(e), n._placeholder(!0)), n._old = n._accessor(), n._oldIndex = n.selectedIndex, n._prev = n.input.val(), n._state === k && (n._state = x) }), n._fetchData()), t) }, _click: function(e) { var n = e.item; return this.trigger("select", { item: n }) ? (this.close(), t) : (this._userTriggered = !0, this._select(n), this._blur(), t) }, _filter: function(e) { var n, i = this, r = i.options, o = i.dataSource, a = r.ignoreCase, s = function(n) { var r = i._text(n); return r !== t ? (r += "", "" !== r && "" === e ? !1 : (a && (r = r.toLowerCase()), 0 === r.indexOf(e))) : t }; return a && (e = e.toLowerCase()), i.ul[0].firstChild ? (this.listView.focus(this._get(s)), n = this.listView.focus(), n && (r.suggest && i.suggest(n), this.open()), this.options.highlightFirst && !e && this.listView.first(), t) : (o.one(m, function() { o.view()[0] && i.search(e) }).fetch(), t) }, _input: function() { var t, n = this, i = n.element.removeClass("k-input")[0], r = i.accessKey, o = n.wrapper, a = "input.k-input", s = i.name || ""; s && (s = 'name="' + s + '_input" '), t = o.find(a), t[0] || (o.append('<span tabindex="-1" unselectable="on" class="k-dropdown-wrap k-state-default"><input ' + s + 'class="k-input" type="text" autocomplete="off"/><span tabindex="-1" unselectable="on" class="k-select"><span unselectable="on" class="k-icon k-i-arrow-s">select</span></span></span>').append(n.element), t = o.find(a)), t[0].style.cssText = i.style.cssText, t[0].title = i.title, i.maxLength > -1 && (t[0].maxLength = i.maxLength), t.addClass(i.className).val(this.options.text || i.value).css({ width: "100%", height: i.style.height }).attr({ role: "combobox", "aria-expanded": !1 }).show(), l && t.attr("placeholder", n.options.placeholder), r && (i.accessKey = "", t[0].accessKey = r), n._focused = n.input = t, n._inputWrapper = e(o[0].firstChild), n._arrow = o.find(".k-icon").attr({ role: "button", tabIndex: -1 }), i.id && n._arrow.attr("aria-controls", n.ul[0].id) }, _keydown: function(e) { var t = this, n = e.keyCode; t._last = n, clearTimeout(t._typingTimeout), t._typingTimeout = null, n == d.TAB || t._move(e) || t._search() }, _placeholder: function(e) { if (!l) { var n, i = this, r = i.input, o = i.options.placeholder; if (o) { if (n = i.value(), e === t && (e = !n), r.toggleClass("k-readonly", e), !e) { if (n) return; o = "" } r.val(o), o || r[0] !== c() || a(r[0], 0, 0) } } }, _search: function() { var e = this; e._typingTimeout = setTimeout(function() { var t = e.text(); e._prev !== t && (e._prev = t, e.search(t)), e._typingTimeout = null }, e.options.delay) }, _wrapper: function() { var e = this, t = e.element, n = t.parent(); n.is("span.k-widget") || (n = t.hide().wrap("<span />").parent(), n[0].style.cssText = t[0].style.cssText), e.wrapper = n.addClass("k-widget k-combobox k-header").addClass(t[0].className).css("display", "") }, _clearSelection: function(e, t) { var n = this, i = e.value(), r = i && -1 === e.selectedIndex; (t || !i || r) && (n.options.value = "", n.value("")) }, _preselect: function(e, t) { this.input.val(t), this._accessor(e), this._old = this._accessor(), this._oldIndex = this.selectedIndex, this.listView.setValue(e), this._placeholder(), this._initialIndex = null, this._presetValue = !0 } }); i.plugin(D) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n; if (null === e && null !== t || null !== e && null === t) return !1; if (n = e.length, n !== t.length) return !1; for (; n--;) if (e[n] !== t[n]) return !1; return !0 } var i = window.kendo, r = i.ui, o = r.List, a = i.keys, s = i._activeElement, l = i.data.ObservableArray, c = e.proxy, d = "id", u = "li", h = "accept", p = "filter", f = "rebind", g = "open", m = "close", v = "change", _ = "progress", w = "select", b = "aria-disabled", y = "aria-readonly", k = "k-state-focused", x = "k-loading-hidden", C = "k-state-hover", S = "k-state-disabled", T = "disabled", D = "readonly", A = ".kendoMultiSelect", E = "click" + A, I = "keydown" + A, P = "mouseenter" + A, M = "mouseleave" + A, z = P + " " + M, F = /"/g, R = e.isArray, H = ["font-family", "font-size", "font-stretch", "font-style", "font-weight", "letter-spacing", "text-transform", "line-height"], B = o.extend({ init: function(t, n) { var r, a, s = this; s.ns = A, o.fn.init.call(s, t, n), s._optionsMap = {}, s._customOptions = {}, s._wrapper(), s._tagList(), s._input(), s._textContainer(), s._loader(), s._tabindex(s.input), t = s.element.attr("multiple", "multiple").hide(), n = s.options, n.placeholder || (n.placeholder = t.data("placeholder")), r = t.attr(d), r && (s._tagID = r + "_tag_active", r += "_taglist", s.tagList.attr(d, r)), s._aria(r), s._dataSource(), s._ignoreCase(), s._popup(), s._tagTemplate(), s._initList(), s._reset(), s._enable(), s._placeholder(), n.autoBind ? s.dataSource.fetch() : n.value && s._preselect(n.value), a = e(s.element).parents("fieldset").is(":disabled"), a && s.enable(!1), i.notify(s) }, _preselect: function(t, n) { var r = this; R(t) || t instanceof i.data.ObservableArray || (t = [t]), (e.isPlainObject(t[0]) || t[0] instanceof i.data.ObservableObject || !r.options.dataValueField) && (r.dataSource.data(t), r.value(n || r._initialValues), r._retrieveData = !0) }, options: { name: "MultiSelect", tagMode: "multiple", enabled: !0, autoBind: !0, autoClose: !0, highlightFirst: !0, dataTextField: "", dataValueField: "", filter: "startswith", ignoreCase: !0, minLength: 0, delay: 100, value: null, maxSelectedItems: null, placeholder: "", height: 200, animation: {}, itemTemplate: "", tagTemplate: "", groupTemplate: "#:data#", fixedGroupTemplate: "#:data#" }, events: [g, m, v, w, "filtering", "dataBinding", "dataBound"], setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.listView.setDataSource(this.dataSource), this.options.autoBind && this.dataSource.fetch() }, setOptions: function(e) { var t = this._listOptions(e); o.fn.setOptions.call(this, e), this._normalizeOptions(t), this.listView.setOptions(t), this._accessors(), this._aria(this.tagList.attr(d)), this._tagTemplate() }, currentTag: function(e) { var n = this; return e === t ? n._currentTag : (n._currentTag && (n._currentTag.removeClass(k).removeAttr(d), n.input.removeAttr("aria-activedescendant")), e && (e.addClass(k).attr(d, n._tagID), n.input.attr("aria-activedescendant", n._tagID)), n._currentTag = e, t) }, dataItems: function() { return this.listView.selectedDataItems() }, destroy: function() { var e = this, t = e.ns; clearTimeout(e._busy), clearTimeout(e._typingTimeout), e.wrapper.off(t), e.tagList.off(t), e.input.off(t), o.fn.destroy.call(e) }, _activateItem: function() { o.fn._activateItem.call(this), this.currentTag(null) }, _normalizeOptions: function(e) { var t = this.options.itemTemplate || this.options.template, n = e.itemTemplate || t || e.template; n || (n = "#:" + i.expr(e.dataTextField, "data") + "#"), e.template = n }, _initList: function() { var t = this, n = t.options.virtual, r = !!n, o = c(t._listBound, t), a = { autoBind: !1, selectable: "multiple", dataSource: t.dataSource, click: c(t._click, t), change: c(t._listChange, t), activate: c(t._activateItem, t), deactivate: c(t._deactivateItem, t), dataBinding: function() { t.trigger("dataBinding"), t._angularItems("cleanup") }, dataBound: o, listBound: o, selectedItemChange: c(t._selectedItemChange, t) }; a = e.extend(t._listOptions(), a, "object" == typeof n ? n : {}), t._normalizeOptions(a), t.listView = r ? new i.ui.VirtualList(t.ul, a) : new i.ui.StaticList(t.ul, a), t.listView.value(t._initialValues || t.options.value) }, _listChange: function(e) { this._state === f && (this._state = "", e.added = []), this._selectValue(e.added, e.removed) }, _selectedItemChange: function(e) { var t, n, i = e.items; for (n = 0; i.length > n; n++) t = i[n], this.tagList.children().eq(t.index).children("span:first").html(this.tagTextTemplate(t.item)) }, _wrapperMousedown: function(t) { var n = this, r = "input" !== t.target.nodeName.toLowerCase(), o = e(t.target), a = o.hasClass("k-select") || o.hasClass("k-icon"); a && (a = !o.closest(".k-select").children(".k-i-arrow-s").length), !r || a && i.support.mobileOS || t.preventDefault(), a || (n.input[0] !== s() && r && n.input.focus(), 0 === n.options.minLength && n.open()) }, _inputFocus: function() { this._placeholder(!1), this.wrapper.addClass(k) }, _inputFocusout: function() { var e = this; clearTimeout(e._typingTimeout), e.wrapper.removeClass(k), e._placeholder(!e.listView.selectedDataItems()[0], !0), e.close(), e._state === p && (e._state = h, e.listView.filter(!1), e.listView.skipUpdate(!0)), e.element.blur() }, _removeTag: function(e) { var n, i = this, r = i._state, o = e.index(), a = i.listView, s = a.value()[o], l = i._customOptions[s]; l !== t || r !== h && r !== p || (l = i._optionsMap[s]), l !== t ? (n = i.element[0].children[l], n.removeAttribute("selected"), n.selected = !1, a.removeAt(o), e.remove()) : a.select(a.select()[o]), i.currentTag(null), i._change(), i._close() }, _tagListClick: function(t) { var n = e(t.currentTarget); n.children(".k-i-arrow-s").length || this._removeTag(n.closest(u)) }, _editable: function(t) { var n = this, i = t.disable, r = t.readonly, o = n.wrapper.off(A), a = n.tagList.off(A), s = n.element.add(n.input.off(A)); r || i ? (i ? o.addClass(S) : o.removeClass(S), s.attr(T, i).attr(D, r).attr(b, i).attr(y, r)) : (o.removeClass(S).on(z, n._toggleHover).on("mousedown" + A + " touchend" + A, c(n._wrapperMousedown, n)), n.input.on(I, c(n._keydown, n)).on("paste" + A, c(n._search, n)).on("focus" + A, c(n._inputFocus, n)).on("focusout" + A, c(n._inputFocusout, n)), s.removeAttr(T).removeAttr(D).attr(b, !1).attr(y, !1), a.on(P, u, function() { e(this).addClass(C) }).on(M, u, function() { e(this).removeClass(C) }).on(E, "li.k-button .k-select", c(n._tagListClick, n))) }, _close: function() { var e = this; e.options.autoClose ? e.close() : e.popup.position() }, close: function() { this.popup.close() }, open: function() { var e = this; e._request && (e._retrieveData = !1), e._retrieveData || !e.listView.isBound() || e._state === h ? (e._open = !0, e._state = f, e._retrieveData = !1, e.listView.filter(!1), e.listView.skipUpdate(!0), e._filterSource()) : e._allowSelection() && (e.popup.open(), e._focusItem()) }, toggle: function(e) { e = e !== t ? e : !this.popup.visible(), this[e ? g : m]() }, refresh: function() { this.listView.refresh() }, _listBound: function() { var e = this, n = e.dataSource.flatView(), i = e.dataSource.page(), r = n.length; e._angularItems("compile"), e._render(n), e._calculateGroupPadding(e._height(r)), e._open && (e._open = !1, e.toggle(r)), e.popup.position(), !e.options.highlightFirst || i !== t && 1 !== i || e.listView.first(), e._touchScroller && e._touchScroller.reset(), e._hideBusy(), e._makeUnselectable(), e.trigger("dataBound") }, search: function(e) { var t, n, i = this, r = i.options, o = r.ignoreCase, a = r.filter, s = r.dataTextField, l = i.input.val(); r.placeholder === l && (l = ""), clearTimeout(i._typingTimeout), e = "string" == typeof e ? e : l, n = e.length, (!n || n >= r.minLength) && (i.listView.filter(!0), i._state = p, i._open = !0, t = { value: o ? e.toLowerCase() : e, field: s, operator: a, ignoreCase: o }, i._filterSource(t, i._retrieveData), i._retrieveData = !1) }, value: function(e) { var n = this, i = n.listView.value().slice(), r = n.options.maxSelectedItems; return e === t ? i : (e = n._normalizeValues(e), null !== r && e.length > r && (e = e.slice(0, r)), n.listView.value(e), n._old = e, n._fetchData(), t) }, _setOption: function(e, t) { var n = this.element[0].children[this._optionsMap[e]]; n && (t ? n.setAttribute("selected", "selected") : n.removeAttribute("selected"), n.selected = t) }, _fetchData: function() { var e = this, t = !!e.dataSource.view().length, n = 0 === e.listView.value().length; n || e._request || (e._retrieveData || !e._fetch && !t) && (e._fetch = !0, e._retrieveData = !1, e.dataSource.read().done(function() { e._fetch = !1 })) }, _dataSource: function() { var e = this, t = e.element, n = e.options, r = n.dataSource || {}; r = R(r) ? { data: r } : r, r.select = t, r.fields = [{ field: n.dataTextField }, { field: n.dataValueField }], e.dataSource && e._refreshHandler ? e._unbindDataSource() : e._progressHandler = c(e._showBusy, e), e.dataSource = i.data.DataSource.create(r).bind(_, e._progressHandler) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { setTimeout(function() { t.value(t._initialValues), t._placeholder() }) }, t._form = r.on("reset", t._resetHandler)) }, _initValue: function() { var e = this.options.value || this.element.val(); this._old = this._initialValues = this._normalizeValues(e) }, _normalizeValues: function(t) { var n = this; return null === t ? t = [] : t && e.isPlainObject(t) ? t = [n._value(t)] : t && e.isPlainObject(t[0]) ? t = e.map(t, function(e) { return n._value(e) }) : R(t) || t instanceof l || (t = [t]), t }, _change: function() { var e = this, t = e.value(); n(t, e._old) || (e._old = t.slice(), e.trigger(v), e.element.trigger(v)) }, _click: function(e) { var n = e.item; return this.trigger(w, { item: n }) ? (this._close(), t) : (this._select(n), this._change(), this._close(), t) }, _keydown: function(n) { var r = this, o = n.keyCode, s = r._currentTag, l = r.listView.focus(), c = r.input.val(), d = i.support.isRtl(r.wrapper), u = r.popup.visible(); if (o === a.DOWN) { if (n.preventDefault(), !u) return r.open(), l || this.listView.first(), t; l ? (this.listView.next(), this.listView.focus() || this.listView.last()) : this.listView.first() } else if (o === a.UP) u && (l && this.listView.prev(), this.listView.focus() || r.close()), n.preventDefault(); else if (o === a.LEFT && !d || o === a.RIGHT && d) c || (s = s ? s.prev() : e(r.tagList[0].lastChild), s[0] && r.currentTag(s)); else if (o === a.RIGHT && !d || o === a.LEFT && d)!c && s && (s = s.next(), r.currentTag(s[0] ? s : null)); else if (o === a.ENTER && u) { if (l) { if (r.trigger(w, { item: l })) return r._close(), t; r._select(l) } r._change(), r._close(), n.preventDefault() } else o === a.ESC ? (u ? n.preventDefault() : r.currentTag(null), r.close()) : o === a.HOME ? u ? this.listView.first() : c || (s = r.tagList[0].firstChild, s && r.currentTag(e(s))) : o === a.END ? u ? this.listView.last() : c || (s = r.tagList[0].lastChild, s && r.currentTag(e(s))) : o !== a.DELETE && o !== a.BACKSPACE || c ? (clearTimeout(r._typingTimeout), setTimeout(function() { r._scale() }), r._search()) : (o !== a.BACKSPACE || s || (s = e(r.tagList[0].lastChild)), s && s[0] && r._removeTag(s)) }, _hideBusy: function() { var e = this; clearTimeout(e._busy), e.input.attr("aria-busy", !1), e._loading.addClass(x), e._request = !1, e._busy = null }, _showBusyHandler: function() { this.input.attr("aria-busy", !0), this._loading.removeClass(x) }, _showBusy: function() { var e = this; e._request = !0, e._busy || (e._busy = setTimeout(c(e._showBusyHandler, e), 100)) }, _placeholder: function(e, n) { var r = this, o = r.input, a = s(); e === t && (e = !1, o[0] !== a && (e = !r.listView.selectedDataItems()[0])), r._prev = "", o.toggleClass("k-readonly", e).val(e ? r.options.placeholder : ""), o[0] !== a || n || i.caret(o[0], 0, 0), r._scale() }, _scale: function() { var e, t = this, n = t.wrapper, i = n.width(), r = t._span.text(t.input.val()); n.is(":visible") ? e = r.width() + 25 : (r.appendTo(document.documentElement), i = e = r.width() + 25, r.appendTo(n)), t.input.width(e > i ? i : e) }, _option: function(e, n, r) { var o = "<option"; return e !== t && (e += "", -1 !== e.indexOf('"') && (e = e.replace(F, """)), o += ' value="' + e + '"'), r && (o += " selected"), o += ">", n !== t && (o += i.htmlEncode(n)), o += "</option>" }, _render: function(e) { var t, n, i, r, o, a, s = this.listView.selectedDataItems(), l = this.listView.value(), c = e.length, d = ""; for (l.length !== s.length && (s = this._buildSelectedItems(l)), o = {}, a = {}, r = 0; c > r; r++) n = e[r], i = this._value(n), t = this._selectedItemIndex(i, s), -1 !== t && s.splice(t, 1), a[i] = r, d += this._option(i, this._text(n), -1 !== t); if (s.length) for (r = 0; s.length > r; r++) n = s[r], i = this._value(n), o[i] = c, a[i] = c, c += 1, d += this._option(i, this._text(n), !0); this._customOptions = o, this._optionsMap = a, this.element.html(d) }, _buildSelectedItems: function(e) { var t, n, i = this.options.dataValueField, r = this.options.dataTextField, o = []; for (n = 0; e.length > n; n++) t = {}, t[i] = e[n], t[r] = e[n], o.push(t); return o }, _selectedItemIndex: function(e, t) { for (var n = this._value, i = 0; t.length > i; i++) if (e === n(t[i])) return i; return -1 }, _search: function() { var e = this; e._typingTimeout = setTimeout(function() { var t = e.input.val(); e._prev !== t && (e._prev = t, e.search(t)) }, e.options.delay) }, _allowSelection: function() { var e = this.options.maxSelectedItems; return null === e || e > this.listView.value().length }, _angularTagItems: function(t) { var n = this; n.angular(t, function() { return { elements: n.tagList[0].children, data: e.map(n.dataItems(), function(e) { return { dataItem: e } }) } }) }, _selectValue: function(e, t) { var n, i, r, o = this, a = o.value(), s = o.dataSource.total(), l = o.tagList, c = o._value; if (o._angularTagItems("cleanup"), "multiple" === o.options.tagMode) { for (r = t.length - 1; r > -1; r--) n = t[r], l[0].removeChild(l[0].children[n.position]), o._setOption(c(n.dataItem), !1); for (r = 0; e.length > r; r++) i = e[r], l.append(o.tagTemplate(i.dataItem)), o._setOption(c(i.dataItem), !0) } else { for ((!o._maxTotal || s > o._maxTotal) && (o._maxTotal = s), l.html(""), a.length && l.append(o.tagTemplate({ values: a, dataItems: o.dataItems(), maxTotal: o._maxTotal, currentTotal: s })), r = t.length - 1; r > -1; r--) o._setOption(c(t[r].dataItem), !1); for (r = 0; e.length > r; r++) o._setOption(c(e[r].dataItem), !0) } o._angularTagItems("compile"), o._placeholder() }, _select: function(e) { var t = this; t._state === f && (t._state = ""), t._allowSelection() && (this.listView.select(e), t._placeholder(), t._state === p && (t._state = h, t.listView.filter(!1), t.listView.skipUpdate(!0))) }, _input: function() { var t = this, n = t.element[0].accessKey, i = t._innerWrapper.children("input.k-input"); i[0] || (i = e('<input class="k-input" style="width: 25px" />').appendTo(t._innerWrapper)), t.element.removeAttr("accesskey"), t._focused = t.input = i.attr({ accesskey: n, autocomplete: "off", role: "listbox", "aria-expanded": !1 }) }, _tagList: function() { var t = this, n = t._innerWrapper.children("ul"); n[0] || (n = e('<ul role="listbox" unselectable="on" class="k-reset"/>').appendTo(t._innerWrapper)), t.tagList = n }, _tagTemplate: function() { var e, t = this, n = t.options, r = n.tagTemplate, o = n.dataSource, a = "multiple" === n.tagMode; t.element[0].length && !o && (n.dataTextField = n.dataTextField || "text", n.dataValueField = n.dataValueField || "value"), e = a ? i.template("#:" + i.expr(n.dataTextField, "data") + "#", { useWithBlock: !1 }) : i.template("#:values.length# item(s) selected"), t.tagTextTemplate = r = r ? i.template(r) : e, t.tagTemplate = function(e) { return '<li class="k-button" unselectable="on"><span unselectable="on">' + r(e) + '</span><span unselectable="on" class="k-select"><span unselectable="on" class="k-icon ' + (a ? "k-i-close" : "k-i-arrow-s") + '">' + (a ? "delete" : "open") + "</span></span></li>" } }, _loader: function() { this._loading = e('<span class="k-icon k-loading ' + x + '"></span>').insertAfter(this.input) }, _textContainer: function() { var t = i.getComputedStyles(this.input[0], H); t.position = "absolute", t.visibility = "hidden", t.top = -3333, t.left = -3333, this._span = e("<span/>").css(t).appendTo(this.wrapper) }, _wrapper: function() { var t = this, n = t.element, i = n.parent("span.k-multiselect"); i[0] || (i = n.wrap('<div class="k-widget k-multiselect k-header" unselectable="on" />').parent(), i[0].style.cssText = n[0].style.cssText, i[0].title = n[0].title, e('<div class="k-multiselect-wrap k-floatwrap" unselectable="on" />').insertBefore(n)), t.wrapper = i.addClass(n[0].className).css("display", ""), t._innerWrapper = e(i[0].firstChild) } }); r.plugin(B) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { var i = n ? " k-slider-horizontal" : " k-slider-vertical", r = e.style ? e.style : t.attr("style"), o = t.attr("class") ? " " + t.attr("class") : "", a = ""; return "bottomRight" == e.tickPlacement ? a = " k-slider-bottomright" : "topLeft" == e.tickPlacement && (a = " k-slider-topleft"), r = r ? " style='" + r + "'" : "", "<div class='k-widget k-slider" + i + o + "'" + r + "><div class='k-slider-wrap" + (e.showButtons ? " k-slider-buttons" : "") + a + "'></div></div>" } function i(e, t, n) { var i = ""; return i = "increase" == t ? n ? "k-i-arrow-e" : "k-i-arrow-n" : n ? "k-i-arrow-w" : "k-i-arrow-s", "<a class='k-button k-button-" + t + "'><span class='k-icon " + i + "' title='" + e[t + "ButtonTitle"] + "'>" + e[t + "ButtonTitle"] + "</span></a>" } function r(e, t) { var n, i = "<ul class='k-reset k-slider-items'>", r = k.floor(c(t / e.smallStep)) + 1; for (n = 0; r > n; n++) i += "<li class='k-tick' role='presentation'> </li>"; return i += "</ul>" } function o(e, t) { var n = t.is("input") ? 1 : 2, i = 2 == n ? e.leftDragHandleTitle : e.dragHandleTitle; return "<div class='k-slider-track'><div class='k-slider-selection'><!-- --></div><a href='#' class='k-draghandle' title='" + i + "' role='slider' aria-valuemin='" + e.min + "' aria-valuemax='" + e.max + "' aria-valuenow='" + (n > 1 ? e.selectionStart || e.min : e.value || e.min) + "'>Drag</a>" + (n > 1 ? "<a href='#' class='k-draghandle' title='" + e.rightDragHandleTitle + "'role='slider' aria-valuemin='" + e.min + "' aria-valuemax='" + e.max + "' aria-valuenow='" + (e.selectionEnd || e.max) + "'>Drag</a>" : "") + "</div>" } function a(e) { return function(t) { return t + e } } function s(e) { return function() { return e } } function l(e) { return (e + "").replace(".", f.cultures.current.numberFormat["."]) } function c(e) { e = parseFloat(e, 10); var t = k.pow(10, q || 0); return k.round(e * t) / t } function d(e, n) { var i = w(e.getAttribute(n)); return null === i && (i = t), i } function u(e) { return typeof e !== Y } function h(e) { return 1e4 * e } var p, f = window.kendo, g = f.ui.Widget, m = f.ui.Draggable, v = e.extend, _ = f.format, w = f.parseFloat, b = e.proxy, y = e.isArray, k = Math, x = f.support, C = x.pointers, S = x.msPointers, T = "change", D = "slide", A = ".slider", E = "touchstart" + A + " mousedown" + A, I = C ? "pointerdown" + A : S ? "MSPointerDown" + A : E, P = "touchend" + A + " mouseup" + A, M = C ? "pointerup" : S ? "MSPointerUp" + A : P, z = "moveSelection", F = "keydown" + A, R = "click" + A, H = "mouseover" + A, B = "focus" + A, L = "blur" + A, N = ".k-draghandle", O = ".k-slider-track", V = ".k-tick", U = "k-state-selected", W = "k-state-focused", j = "k-state-default", G = "k-state-disabled", q = 3, $ = "disabled", Y = "undefined", Q = "tabindex", K = f.getTouches, X = g.extend({ init: function(e, t) { var n, i = this; if (g.fn.init.call(i, e, t), t = i.options, i._distance = c(t.max - t.min), i._isHorizontal = "horizontal" == t.orientation, i._isRtl = i._isHorizontal && f.support.isRtl(e), i._position = i._isHorizontal ? "left" : "bottom", i._sizeFn = i._isHorizontal ? "width" : "height", i._outerSize = i._isHorizontal ? "outerWidth" : "outerHeight", t.tooltip.format = t.tooltip.enabled ? t.tooltip.format || "{0}" : "{0}", 0 >= t.smallStep) throw Error("Kendo UI Slider smallStep must be a positive number."); i._createHtml(), i.wrapper = i.element.closest(".k-slider"), i._trackDiv = i.wrapper.find(O), i._setTrackDivWidth(), i._maxSelection = i._trackDiv[i._sizeFn](), i._sliderItemsInit(), i._reset(), i._tabindex(i.wrapper.find(N)), i[t.enabled ? "enable" : "disable"](), n = f.support.isRtl(i.wrapper) ? -1 : 1, i._keyMap = { 37: a(-1 * n * t.smallStep), 40: a(-t.smallStep), 39: a(1 * n * t.smallStep), 38: a(+t.smallStep), 35: s(t.max), 36: s(t.min), 33: a(+t.largeStep), 34: a(-t.largeStep) }, f.notify(i) }, events: [T, D], options: { enabled: !0, min: 0, max: 10, smallStep: 1, largeStep: 5, orientation: "horizontal", tickPlacement: "both", tooltip: { enabled: !0, format: "{0}" } }, _resize: function() { this._setTrackDivWidth(), this.wrapper.find(".k-slider-items").remove(), this._maxSelection = this._trackDiv[this._sizeFn](), this._sliderItemsInit(), this._refresh() }, _sliderItemsInit: function() { var e = this, t = e.options, n = e._maxSelection / ((t.max - t.min) / t.smallStep), i = e._calculateItemsWidth(k.floor(e._distance / t.smallStep)); "none" != t.tickPlacement && n >= 2 && (e._trackDiv.before(r(t, e._distance)), e._setItemsWidth(i), e._setItemsTitle()), e._calculateSteps(i), "none" != t.tickPlacement && n >= 2 && t.largeStep >= t.smallStep && e._setItemsLargeTick() }, getSize: function() { return f.dimensions(this.wrapper) }, _setTrackDivWidth: function() { var e = this, t = 2 * parseFloat(e._trackDiv.css(e._isRtl ? "right" : e._position), 10); e._trackDiv[e._sizeFn](e.wrapper[e._sizeFn]() - 2 - t) }, _setItemsWidth: function(t) { var n, i = this, r = i.options, o = 0, a = t.length - 1, s = i.wrapper.find(V), l = 0, c = 2, d = s.length, u = 0; for (n = 0; d - 2 > n; n++) e(s[n + 1])[i._sizeFn](t[n]); if (i._isHorizontal ? (e(s[o]).addClass("k-first")[i._sizeFn](t[a - 1]), e(s[a]).addClass("k-last")[i._sizeFn](t[a])) : (e(s[a]).addClass("k-first")[i._sizeFn](t[a]), e(s[o]).addClass("k-last")[i._sizeFn](t[a - 1])), i._distance % r.smallStep !== 0 && !i._isHorizontal) { for (n = 0; t.length > n; n++) u += t[n]; l = i._maxSelection - u, l += parseFloat(i._trackDiv.css(i._position), 10) + c, i.wrapper.find(".k-slider-items").css("padding-top", l) } }, _setItemsTitle: function() { for (var t = this, n = t.options, i = t.wrapper.find(V), r = n.min, o = i.length, a = t._isHorizontal && !t._isRtl ? 0 : o - 1, s = t._isHorizontal && !t._isRtl ? o : -1, l = t._isHorizontal && !t._isRtl ? 1 : -1; a - s !== 0; a += l) e(i[a]).attr("title", _(n.tooltip.format, c(r))), r += n.smallStep }, _setItemsLargeTick: function() { var t, n, i, r = this, o = r.options, a = r.wrapper.find(V), s = 0; if (h(o.largeStep) % h(o.smallStep) === 0 || r._distance / o.largeStep >= 3) for (r._isHorizontal || r._isRtl || (a = e.makeArray(a).reverse()), s = 0; a.length > s; s++) t = e(a[s]), n = r._values[s], i = c(h(n - this.options.min)), i % h(o.smallStep) === 0 && i % h(o.largeStep) === 0 && (t.addClass("k-tick-large").html("<span class='k-label'>" + t.attr("title") + "</span>"), 0 !== s && s !== a.length - 1 && t.css("line-height", t[r._sizeFn]() + "px")) }, _calculateItemsWidth: function(e) { var t, n, i, r = this, o = r.options, a = parseFloat(r._trackDiv.css(r._sizeFn)) + 1, s = a / r._distance; for (r._distance / o.smallStep - k.floor(r._distance / o.smallStep) > 0 && (a -= r._distance % o.smallStep * s), t = a / e, n = [], i = 0; e - 1 > i; i++) n[i] = t; return n[e - 1] = n[e] = t / 2, r._roundWidths(n) }, _roundWidths: function(e) { var t, n = 0, i = e.length; for (t = 0; i > t; t++) n += e[t] - k.floor(e[t]), e[t] = k.floor(e[t]); return n = k.round(n), this._addAdditionalSize(n, e) }, _addAdditionalSize: function(e, t) { if (0 === e) return t; var n, i = parseFloat(t.length - 1) / parseFloat(1 == e ? e : e - 1); for (n = 0; e > n; n++) t[parseInt(k.round(i * n), 10)] += 1; return t }, _calculateSteps: function(e) { var t, n = this, i = n.options, r = i.min, o = 0, a = k.ceil(n._distance / i.smallStep), s = 1; if (a += n._distance / i.smallStep % 1 === 0 ? 1 : 0, e.splice(0, 0, 2 * e[a - 2]), e.splice(a - 1, 1, 2 * e.pop()), n._pixelSteps = [o], n._values = [r], 0 !== a) { for (; a > s;) o += (e[s - 1] + e[s]) / 2, n._pixelSteps[s] = o, r += i.smallStep, n._values[s] = c(r), s++; t = n._distance % i.smallStep === 0 ? a - 1 : a, n._pixelSteps[t] = n._maxSelection, n._values[t] = i.max, n._isRtl && (n._pixelSteps.reverse(), n._values.reverse()) } }, _getValueFromPosition: function(e, t) { var n, i = this, r = i.options, o = k.max(r.smallStep * (i._maxSelection / i._distance), 0), a = 0, s = o / 2; if (i._isHorizontal ? (a = e - t.startPoint, i._isRtl && (a = i._maxSelection - a)) : a = t.startPoint - e, i._maxSelection - (parseInt(i._maxSelection % o, 10) - 3) / 2 < a) return r.max; for (n = 0; i._pixelSteps.length > n; n++) if (k.abs(i._pixelSteps[n] - a) - 1 <= s) return c(i._values[n]) }, _getFormattedValue: function(e, t) { var n, i, r, o = this, a = "", s = o.options.tooltip; return y(e) ? (i = e[0], r = e[1]) : t && t.type && (i = t.selectionStart, r = t.selectionEnd), t && (n = t.tooltipTemplate), !n && s.template && (n = f.template(s.template)), y(e) || t && t.type ? n ? a = n({ selectionStart: i, selectionEnd: r }) : (i = _(s.format, i), r = _(s.format, r), a = i + " - " + r) : (t && (t.val = e), a = n ? n({ value: e }) : _(s.format, e)), a }, _getDraggableArea: function() { var e = this, t = f.getOffset(e._trackDiv); return { startPoint: e._isHorizontal ? t.left : t.top + e._maxSelection, endPoint: e._isHorizontal ? t.left + e._maxSelection : t.top } }, _createHtml: function() { var e = this, t = e.element, r = e.options, a = t.find("input"); 2 == a.length ? (a.eq(0).prop("value", l(r.selectionStart)), a.eq(1).prop("value", l(r.selectionEnd))) : t.prop("value", l(r.value)), t.wrap(n(r, t, e._isHorizontal)).hide(), r.showButtons && t.before(i(r, "increase", e._isHorizontal)).before(i(r, "decrease", e._isHorizontal)), t.before(o(r, t)) }, _focus: function(t) { var n = this, i = t.target, r = n.value(), o = n._drag; o || (i == n.wrapper.find(N).eq(0)[0] ? (o = n._firstHandleDrag, n._activeHandle = 0) : (o = n._lastHandleDrag, n._activeHandle = 1), r = r[n._activeHandle]), e(i).addClass(W + " " + U), o && (n._activeHandleDrag = o, o.selectionStart = n.options.selectionStart, o.selectionEnd = n.options.selectionEnd, o._updateTooltip(r)) }, _focusWithMouse: function(t) { t = e(t); var n = this, i = t.is(N) ? t.index() : 0; window.setTimeout(function() { n.wrapper.find(N)[2 == i ? 1 : 0].focus() }, 1), n._setTooltipTimeout() }, _blur: function(t) { var n = this, i = n._activeHandleDrag; e(t.target).removeClass(W + " " + U), i && (i._removeTooltip(), delete n._activeHandleDrag, delete n._activeHandle) }, _setTooltipTimeout: function() { var e = this; e._tooltipTimeout = window.setTimeout(function() { var t = e._drag || e._activeHandleDrag; t && t._removeTooltip() }, 300) }, _clearTooltipTimeout: function() { var e, t = this; window.clearTimeout(this._tooltipTimeout), e = t._drag || t._activeHandleDrag, e && e.tooltipDiv && e.tooltipDiv.stop(!0, !1).css("opacity", 1) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._form = r.on("reset", b(t._formResetHandler, t))) }, destroy: function() { this._form && this._form.off("reset", this._formResetHandler), g.fn.destroy.call(this) } }), Z = X.extend({ init: function(n, i) { var r, o = this; n.type = "text", i = v({}, { value: d(n, "value"), min: d(n, "min"), max: d(n, "max"), smallStep: d(n, "step") }, i), n = e(n), i && i.enabled === t && (i.enabled = !n.is("[disabled]")), X.fn.init.call(o, n, i), i = o.options, u(i.value) && null !== i.value || (i.value = i.min, n.prop("value", l(i.min))), i.value = k.max(k.min(i.value, i.max), i.min), r = o.wrapper.find(N), new Z.Selection(r, o, i), o._drag = new Z.Drag(r, "", o, i) }, options: { name: "Slider", showButtons: !0, increaseButtonTitle: "Increase", decreaseButtonTitle: "Decrease", dragHandleTitle: "drag", tooltip: { format: "{0:#,#.##}" }, value: null }, enable: function(n) { var i, r, o, a = this, s = a.options; a.disable(), n !== !1 && (a.wrapper.removeClass(G).addClass(j), a.wrapper.find("input").removeAttr($), i = function(n) { var i, r, o, s = K(n)[0]; if (s) { if (i = a._isHorizontal ? s.location.pageX : s.location.pageY, r = a._getDraggableArea(), o = e(n.target), o.hasClass("k-draghandle")) return o.addClass(W + " " + U), t; a._update(a._getValueFromPosition(i, r)), a._focusWithMouse(n.target), a._drag.dragstart(n), n.preventDefault() } }, a.wrapper.find(V + ", " + O).on(I, i).end().on(I, function() { e(document.documentElement).one("selectstart", f.preventDefault) }).on(M, function() { a._drag._end() }), a.wrapper.find(N).attr(Q, 0).on(P, function() { a._setTooltipTimeout() }).on(R, function(e) { a._focusWithMouse(e.target), e.preventDefault() }).on(B, b(a._focus, a)).on(L, b(a._blur, a)), r = b(function(e) { var t = a._nextValueByIndex(a._valueIndex + 1 * e); a._setValueInRange(t), a._drag._updateTooltip(t) }, a), s.showButtons && (o = b(function(e, t) { this._clearTooltipTimeout(), (1 === e.which || x.touch && 0 === e.which) && (r(t), this.timeout = setTimeout(b(function() { this.timer = setInterval(function() { r(t) }, 60) }, this), 200)) }, a), a.wrapper.find(".k-button").on(P, b(function(e) { this._clearTimer(), a._focusWithMouse(e.target) }, a)).on(H, function(t) { e(t.currentTarget).addClass("k-state-hover") }).on("mouseout" + A, b(function(t) { e(t.currentTarget).removeClass("k-state-hover"), this._clearTimer() }, a)).eq(0).on(E, b(function(e) { o(e, 1) }, a)).click(!1).end().eq(1).on(E, b(function(e) { o(e, -1) }, a)).click(f.preventDefault)), a.wrapper.find(N).off(F, !1).on(F, b(this._keydown, a)), s.enabled = !0) }, disable: function() { var t = this; t.wrapper.removeClass(j).addClass(G), e(t.element).prop($, $), t.wrapper.find(".k-button").off(E).on(E, f.preventDefault).off(P).on(P, f.preventDefault).off("mouseleave" + A).on("mouseleave" + A, f.preventDefault).off(H).on(H, f.preventDefault), t.wrapper.find(V + ", " + O).off(I).off(M), t.wrapper.find(N).attr(Q, -1).off(P).off(F).off(R).off(B).off(L), t.options.enabled = !1 }, _update: function(e) { var t = this, n = t.value() != e; t.value(e), n && t.trigger(T, { value: t.options.value }) }, value: function(e) { var n = this, i = n.options; return e = c(e), isNaN(e) ? i.value : (e >= i.min && i.max >= e && i.value != e && (n.element.prop("value", l(e)), i.value = e, n._refreshAriaAttr(e), n._refresh()), t) }, _refresh: function() { this.trigger(z, { value: this.options.value }) }, _refreshAriaAttr: function(e) { var t, n = this, i = n._drag; t = i && i._tooltipDiv ? i._tooltipDiv.text() : n._getFormattedValue(e, null), this.wrapper.find(N).attr("aria-valuenow", e).attr("aria-valuetext", t) }, _clearTimer: function() { clearTimeout(this.timeout), clearInterval(this.timer) }, _keydown: function(e) { var t = this; e.keyCode in t._keyMap && (t._clearTooltipTimeout(), t._setValueInRange(t._keyMap[e.keyCode](t.options.value)), t._drag._updateTooltip(t.value()), e.preventDefault()) }, _setValueInRange: function(e) { var n = this, i = n.options; return e = c(e), isNaN(e) ? (n._update(i.min), t) : (e = k.max(k.min(e, i.max), i.min), n._update(e), t) }, _nextValueByIndex: function(e) { var t = this._values.length; return this._isRtl && (e = t - 1 - e), this._values[k.max(0, k.min(e, t - 1))] }, _formResetHandler: function() { var e = this, t = e.options.min; setTimeout(function() { var n = e.element[0].value; e.value("" === n || isNaN(n) ? t : n) }) }, destroy: function() { var e = this; X.fn.destroy.call(e), e.wrapper.off(A).find(".k-button").off(A).end().find(N).off(A).end().find(V + ", " + O).off(A).end(), e._drag.draggable.destroy(), e._drag._removeTooltip(!0) } }); Z.Selection = function(e, t, n) { function i(i) { var r = i - n.min, o = t._valueIndex = k.ceil(c(r / n.smallStep)), a = parseInt(t._pixelSteps[o], 10), s = t._trackDiv.find(".k-slider-selection"), l = parseInt(e[t._outerSize]() / 2, 10), d = t._isRtl ? 2 : 0; s[t._sizeFn](t._isRtl ? t._maxSelection - a : a), e.css(t._position, a - l - d) } i(n.value), t.bind([T, D, z], function(e) { i(parseFloat(e.value, 10)) }) }, Z.Drag = function(e, t, n, i) { var r = this; r.owner = n, r.options = i, r.element = e, r.type = t, r.draggable = new m(e, { distance: 0, dragstart: b(r._dragstart, r), drag: b(r.drag, r), dragend: b(r.dragend, r), dragcancel: b(r.dragcancel, r) }), e.click(!1) }, Z.Drag.prototype = { dragstart: function(e) { this.owner._activeDragHandle = this, this.draggable.userEvents.cancel(), this.draggable.userEvents._start(e) }, _dragstart: function(n) { var i = this, r = i.owner, o = i.options; return o.enabled ? (this.owner._activeDragHandle = this, r.element.off(H), r.wrapper.find("." + W).removeClass(W + " " + U), i.element.addClass(W + " " + U), e(document.documentElement).css("cursor", "pointer"), i.dragableArea = r._getDraggableArea(), i.step = k.max(o.smallStep * (r._maxSelection / r._distance), 0), i.type ? (i.selectionStart = o.selectionStart, i.selectionEnd = o.selectionEnd, r._setZIndex(i.type)) : i.oldVal = i.val = o.value, i._removeTooltip(!0), i._createTooltip(), t) : (n.preventDefault(), t) }, _createTooltip: function() { var t, n, i = this, r = i.owner, o = i.options.tooltip, a = "", s = e(window); o.enabled && (o.template && (t = i.tooltipTemplate = f.template(o.template)), e(".k-slider-tooltip").remove(), i.tooltipDiv = e("<div class='k-widget k-tooltip k-slider-tooltip'><!-- --></div>").appendTo(document.body), a = r._getFormattedValue(i.val || r.value(), i), i.type || (n = "k-callout-" + (r._isHorizontal ? "s" : "e"), i.tooltipInnerDiv = "<div class='k-callout " + n + "'><!-- --></div>", a += i.tooltipInnerDiv), i.tooltipDiv.html(a), i._scrollOffset = { top: s.scrollTop(), left: s.scrollLeft() }, i.moveTooltip()) }, drag: function(e) { var t, n = this, i = n.owner, r = e.x.location, o = e.y.location, a = n.dragableArea.startPoint, s = n.dragableArea.endPoint; e.preventDefault(), n.val = i._isHorizontal ? i._isRtl ? n.constrainValue(r, a, s, s > r) : n.constrainValue(r, a, s, r >= s) : n.constrainValue(o, s, a, s >= o), n.oldVal != n.val && (n.oldVal = n.val, n.type ? ("firstHandle" == n.type ? n.selectionStart = n.selectionEnd > n.val ? n.val : n.selectionEnd = n.val : n.val > n.selectionStart ? n.selectionEnd = n.val : n.selectionStart = n.selectionEnd = n.val, t = { values: [n.selectionStart, n.selectionEnd], value: [n.selectionStart, n.selectionEnd] }) : t = { value: n.val }, i.trigger(D, t)), n._updateTooltip(n.val) }, _updateTooltip: function(e) { var t = this, n = t.options, i = n.tooltip, r = ""; i.enabled && (t.tooltipDiv || t._createTooltip(), r = t.owner._getFormattedValue(c(e), t), t.type || (r += t.tooltipInnerDiv), t.tooltipDiv.html(r), t.moveTooltip()) }, dragcancel: function() { return this.owner._refresh(), e(document.documentElement).css("cursor", ""), this._end() }, dragend: function() { var t = this, n = t.owner; return e(document.documentElement).css("cursor", ""), t.type ? n._update(t.selectionStart, t.selectionEnd) : (n._update(t.val), t.draggable.userEvents._disposeAll()), t._end() }, _end: function() { var e = this, t = e.owner; return t._focusWithMouse(e.element), t.element.on(H), !1 }, _removeTooltip: function(t) { var n = this, i = n.owner; n.tooltipDiv && i.options.tooltip.enabled && i.options.enabled && (t ? (n.tooltipDiv.remove(), n.tooltipDiv = null) : n.tooltipDiv.fadeOut("slow", function() { e(this).remove(), n.tooltipDiv = null })) }, moveTooltip: function() { var t, n, i, r, o = this, a = o.owner, s = 0, l = 0, c = o.element, d = f.getOffset(c), u = 8, h = e(window), p = o.tooltipDiv.find(".k-callout"), g = o.tooltipDiv.outerWidth(), m = o.tooltipDiv.outerHeight(); o.type ? (t = a.wrapper.find(N), d = f.getOffset(t.eq(0)), n = f.getOffset(t.eq(1)), a._isHorizontal ? (s = n.top, l = d.left + (n.left - d.left) / 2) : (s = d.top + (n.top - d.top) / 2, l = n.left), r = t.eq(0).outerWidth() + 2 * u) : (s = d.top, l = d.left, r = c.outerWidth() + 2 * u), a._isHorizontal ? (l -= parseInt((g - c[a._outerSize]()) / 2, 10), s -= m + p.height() + u) : (s -= parseInt((m - c[a._outerSize]()) / 2, 10), l -= g + p.width() + u), a._isHorizontal ? (i = o._flip(s, m, r, h.outerHeight() + o._scrollOffset.top), s += i, l += o._fit(l, g, h.outerWidth() + o._scrollOffset.left)) : (i = o._flip(l, g, r, h.outerWidth() + o._scrollOffset.left), s += o._fit(s, m, h.outerHeight() + o._scrollOffset.top), l += i), i > 0 && p && (p.removeClass(), p.addClass("k-callout k-callout-" + (a._isHorizontal ? "n" : "w"))), o.tooltipDiv.css({ top: s, left: l }) }, _fit: function(e, t, n) { var i = 0; return e + t > n && (i = n - (e + t)), 0 > e && (i = -e), i }, _flip: function(e, t, n, i) { var r = 0; return e + t > i && (r += -(n + t)), 0 > e + r && (r += n + t), r }, constrainValue: function(e, t, n, i) { var r = this, o = 0; return o = e > t && n > e ? r.owner._getValueFromPosition(e, r.dragableArea) : i ? r.options.max : r.options.min } }, f.ui.plugin(Z), p = X.extend({ init: function(n, i) { var r, o = this, a = e(n).find("input"), s = a.eq(0)[0], c = a.eq(1)[0]; s.type = "text", c.type = "text", i && i.showButtons && (window.console && window.console.warn("showbuttons option is not supported for the range slider, ignoring"), i.showButtons = !1), i = v({}, { selectionStart: d(s, "value"), min: d(s, "min"), max: d(s, "max"), smallStep: d(s, "step") }, { selectionEnd: d(c, "value"), min: d(c, "min"), max: d(c, "max"), smallStep: d(c, "step") }, i), i && i.enabled === t && (i.enabled = !a.is("[disabled]")), X.fn.init.call(o, n, i), i = o.options, u(i.selectionStart) && null !== i.selectionStart || (i.selectionStart = i.min, a.eq(0).prop("value", l(i.min))), u(i.selectionEnd) && null !== i.selectionEnd || (i.selectionEnd = i.max, a.eq(1).prop("value", l(i.max))), r = o.wrapper.find(N), new p.Selection(r, o, i), o._firstHandleDrag = new Z.Drag(r.eq(0), "firstHandle", o, i), o._lastHandleDrag = new Z.Drag(r.eq(1), "lastHandle", o, i) }, options: { name: "RangeSlider", leftDragHandleTitle: "drag", rightDragHandleTitle: "drag", tooltip: { format: "{0:#,#.##}" }, selectionStart: null, selectionEnd: null }, enable: function(n) { var i, r = this, o = r.options; r.disable(), n !== !1 && (r.wrapper.removeClass(G).addClass(j), r.wrapper.find("input").removeAttr($), i = function(n) { var i, a, s, l, c, d, u, h = K(n)[0]; if (h) { if (i = r._isHorizontal ? h.location.pageX : h.location.pageY, a = r._getDraggableArea(), s = r._getValueFromPosition(i, a), l = e(n.target), l.hasClass("k-draghandle")) return r.wrapper.find("." + W).removeClass(W + " " + U), l.addClass(W + " " + U), t; o.selectionStart > s ? (c = s, d = o.selectionEnd, u = r._firstHandleDrag) : s > r.selectionEnd ? (c = o.selectionStart, d = s, u = r._lastHandleDrag) : o.selectionEnd - s >= s - o.selectionStart ? (c = s, d = o.selectionEnd, u = r._firstHandleDrag) : (c = o.selectionStart, d = s, u = r._lastHandleDrag), u.dragstart(n), r._setValueInRange(c, d), r._focusWithMouse(u.element) } }, r.wrapper.find(V + ", " + O).on(I, i).end().on(I, function() { e(document.documentElement).one("selectstart", f.preventDefault) }).on(M, function() { r._activeDragHandle && r._activeDragHandle._end() }), r.wrapper.find(N).attr(Q, 0).on(P, function() { r._setTooltipTimeout() }).on(R, function(e) { r._focusWithMouse(e.target), e.preventDefault() }).on(B, b(r._focus, r)).on(L, b(r._blur, r)), r.wrapper.find(N).off(F, f.preventDefault).eq(0).on(F, b(function(e) { this._keydown(e, "firstHandle") }, r)).end().eq(1).on(F, b(function(e) { this._keydown(e, "lastHandle") }, r)), r.options.enabled = !0) }, disable: function() { var e = this; e.wrapper.removeClass(j).addClass(G), e.wrapper.find("input").prop($, $), e.wrapper.find(V + ", " + O).off(I).off(M), e.wrapper.find(N).attr(Q, -1).off(P).off(F).off(R).off(B).off(L), e.options.enabled = !1 }, _keydown: function(e, t) { var n, i, r, o = this, a = o.options.selectionStart, s = o.options.selectionEnd; e.keyCode in o._keyMap && (o._clearTooltipTimeout(), "firstHandle" == t ? (r = o._activeHandleDrag = o._firstHandleDrag, a = o._keyMap[e.keyCode](a), a > s && (s = a)) : (r = o._activeHandleDrag = o._lastHandleDrag, s = o._keyMap[e.keyCode](s), a > s && (a = s)), o._setValueInRange(c(a), c(s)), n = Math.max(a, o.options.selectionStart), i = Math.min(s, o.options.selectionEnd), r.selectionEnd = Math.max(i, o.options.selectionStart), r.selectionStart = Math.min(n, o.options.selectionEnd), r._updateTooltip(o.value()[o._activeHandle]), e.preventDefault()) }, _update: function(e, t) { var n = this, i = n.value(), r = i[0] != e || i[1] != t; n.value([e, t]), r && n.trigger(T, { values: [e, t], value: [e, t] }) }, value: function(e) { return e && e.length ? this._value(e[0], e[1]) : this._value() }, _value: function(e, n) { var i = this, r = i.options, o = r.selectionStart, a = r.selectionEnd; return isNaN(e) && isNaN(n) ? [o, a] : (e = c(e), n = c(n), e >= r.min && r.max >= e && n >= r.min && r.max >= n && n >= e && (o != e || a != n) && (i.element.find("input").eq(0).prop("value", l(e)).end().eq(1).prop("value", l(n)), r.selectionStart = e, r.selectionEnd = n, i._refresh(), i._refreshAriaAttr(e, n)), t) }, values: function(e, t) { return y(e) ? this._value(e[0], e[1]) : this._value(e, t) }, _refresh: function() { var e = this, t = e.options; e.trigger(z, { values: [t.selectionStart, t.selectionEnd], value: [t.selectionStart, t.selectionEnd] }), t.selectionStart == t.max && t.selectionEnd == t.max && e._setZIndex("firstHandle") }, _refreshAriaAttr: function(e, t) { var n, i = this, r = i.wrapper.find(N), o = i._activeHandleDrag; n = i._getFormattedValue([e, t], o), r.eq(0).attr("aria-valuenow", e), r.eq(1).attr("aria-valuenow", t), r.attr("aria-valuetext", n) }, _setValueInRange: function(e, t) { var n = this.options; e = k.max(k.min(e, n.max), n.min), t = k.max(k.min(t, n.max), n.min), e == n.max && t == n.max && this._setZIndex("firstHandle"), this._update(k.min(e, t), k.max(e, t)) }, _setZIndex: function(t) { this.wrapper.find(N).each(function(n) { e(this).css("z-index", "firstHandle" == t ? 1 - n : n) }) }, _formResetHandler: function() { var e = this, t = e.options; setTimeout(function() { var n = e.element.find("input"), i = n[0].value, r = n[1].value; e.values("" === i || isNaN(i) ? t.min : i, "" === r || isNaN(r) ? t.max : r) }) }, destroy: function() { var e = this; X.fn.destroy.call(e), e.wrapper.off(A).find(V + ", " + O).off(A).end().find(N).off(A), e._firstHandleDrag.draggable.destroy(), e._lastHandleDrag.draggable.destroy() } }), p.Selection = function(e, t, n) { function i(i) { i = i || []; var o = i[0] - n.min, a = i[1] - n.min, s = k.ceil(c(o / n.smallStep)), l = k.ceil(c(a / n.smallStep)), d = t._pixelSteps[s], u = t._pixelSteps[l], h = parseInt(e.eq(0)[t._outerSize]() / 2, 10), p = t._isRtl ? 2 : 0; e.eq(0).css(t._position, d - h - p).end().eq(1).css(t._position, u - h - p), r(d, u) } function r(e, n) { var i, r, o = t._trackDiv.find(".k-slider-selection"); i = k.abs(e - n), o[t._sizeFn](i), t._isRtl ? (r = k.max(e, n), o.css("right", t._maxSelection - r - 1)) : (r = k.min(e, n), o.css(t._position, r - 1)) } i(t.value()), t.bind([T, D, z], function(e) { i(e.values) }) }, f.ui.plugin(p) }(window.kendo.jQuery), function(e, t, n) { function i(e, t, n) { n = d(n), n && !n.equals(e.color()) && ("change" == t && (e._value = n), n = 1 != n.a ? n.toCssRgba() : n.toCss(), e.trigger(t, { value: n })) } function r(e, t, n) { var i, r; return e = Array.prototype.slice.call(e), i = e.length, r = e.indexOf(t), 0 > r ? 0 > n ? e[i - 1] : e[0] : (r += n, 0 > r ? r += i : r %= i, e[r]) } function o(e) { e.preventDefault() } function a(e, t) { return function() { return e.apply(t, arguments) } } var s = window.kendo, l = s.ui, c = l.Widget, d = s.parseColor, u = s.Color, h = s.keys, p = "background-color", f = "k-state-selected", g = "000000,7f7f7f,880015,ed1c24,ff7f27,fff200,22b14c,00a2e8,3f48cc,a349a4,ffffff,c3c3c3,b97a57,ffaec9,ffc90e,efe4b0,b5e61d,99d9ea,7092be,c8bfe7", m = "FFFFFF,FFCCFF,FF99FF,FF66FF,FF33FF,FF00FF,CCFFFF,CCCCFF,CC99FF,CC66FF,CC33FF,CC00FF,99FFFF,99CCFF,9999FF,9966FF,9933FF,9900FF,FFFFCC,FFCCCC,FF99CC,FF66CC,FF33CC,FF00CC,CCFFCC,CCCCCC,CC99CC,CC66CC,CC33CC,CC00CC,99FFCC,99CCCC,9999CC,9966CC,9933CC,9900CC,FFFF99,FFCC99,FF9999,FF6699,FF3399,FF0099,CCFF99,CCCC99,CC9999,CC6699,CC3399,CC0099,99FF99,99CC99,999999,996699,993399,990099,FFFF66,FFCC66,FF9966,FF6666,FF3366,FF0066,CCFF66,CCCC66,CC9966,CC6666,CC3366,CC0066,99FF66,99CC66,999966,996666,993366,990066,FFFF33,FFCC33,FF9933,FF6633,FF3333,FF0033,CCFF33,CCCC33,CC9933,CC6633,CC3333,CC0033,99FF33,99CC33,999933,996633,993333,990033,FFFF00,FFCC00,FF9900,FF6600,FF3300,FF0000,CCFF00,CCCC00,CC9900,CC6600,CC3300,CC0000,99FF00,99CC00,999900,996600,993300,990000,66FFFF,66CCFF,6699FF,6666FF,6633FF,6600FF,33FFFF,33CCFF,3399FF,3366FF,3333FF,3300FF,00FFFF,00CCFF,0099FF,0066FF,0033FF,0000FF,66FFCC,66CCCC,6699CC,6666CC,6633CC,6600CC,33FFCC,33CCCC,3399CC,3366CC,3333CC,3300CC,00FFCC,00CCCC,0099CC,0066CC,0033CC,0000CC,66FF99,66CC99,669999,666699,663399,660099,33FF99,33CC99,339999,336699,333399,330099,00FF99,00CC99,009999,006699,003399,000099,66FF66,66CC66,669966,666666,663366,660066,33FF66,33CC66,339966,336666,333366,330066,00FF66,00CC66,009966,006666,003366,000066,66FF33,66CC33,669933,666633,663333,660033,33FF33,33CC33,339933,336633,333333,330033,00FF33,00CC33,009933,006633,003333,000033,66FF00,66CC00,669900,666600,663300,660000,33FF00,33CC00,339900,336600,333300,330000,00FF00,00CC00,009900,006600,003300,000000", v = { apply: "Apply", cancel: "Cancel" }, _ = ".kendoColorTools", w = "click" + _, b = "keydown" + _, y = s.support.browser, k = y.msie && 9 > y.version, x = c.extend({ init: function(e, t) { var n, i = this; c.fn.init.call(i, e, t), e = i.element, t = i.options, i._value = t.value = d(t.value), i._tabIndex = e.attr("tabIndex") || 0, n = i._ariaId = t.ariaId, n && e.attr("aria-labelledby", n), t._standalone && (i._triggerSelect = i._triggerChange) }, options: { name: "ColorSelector", value: null, _standalone: !0 }, events: ["change", "select", "cancel"], color: function(e) { return e !== n && (this._value = d(e), this._updateUI(this._value)), this._value }, value: function(e) { return e = this.color(e), e && (e = this.options.opacity ? e.toCssRgba() : e.toCss()), e || null }, enable: function(t) { 0 === arguments.length && (t = !0), e(".k-disabled-overlay", this.wrapper).remove(), t || this.wrapper.append("<div class='k-disabled-overlay'></div>"), this._onEnable(t) }, _select: function(e, t) { var n = this._value; e = this.color(e), t || (this.element.trigger("change"), e.equals(n) ? this._standalone || this.trigger("cancel") : this.trigger("change", { value: this.value() })) }, _triggerSelect: function(e) { i(this, "select", e) }, _triggerChange: function(e) { i(this, "change", e) }, destroy: function() { this.element && this.element.off(_), this.wrapper && this.wrapper.off(_).find("*").off(_), this.wrapper = null, c.fn.destroy.call(this) }, _updateUI: e.noop, _selectOnHide: function() { return null }, _cancel: function() { this.trigger("cancel") } }), C = x.extend({ init: function(t, n) { var i, r, o, l, c = this; if (x.fn.init.call(c, t, n), t = c.wrapper = c.element, n = c.options, i = n.palette, "websafe" == i ? (i = m, n.columns = 18) : "basic" == i && (i = g), "string" == typeof i && (i = i.split(",")), e.isArray(i) && (i = e.map(i, function(e) { return d(e) })), c._selectedID = (n.ariaId || s.guid()) + "_selected", t.addClass("k-widget k-colorpalette").attr("role", "grid").attr("aria-readonly", "true").append(e(c._template({ colors: i, columns: n.columns, tileSize: n.tileSize, value: c._value, id: n.ariaId }))).on(w, ".k-item", function(t) { c._select(e(t.currentTarget).css(p)) }).attr("tabIndex", c._tabIndex).on(b, a(c._keydown, c)), r = n.tileSize) { if (/number|string/.test(typeof r)) o = l = parseFloat(r); else { if ("object" != typeof r) throw Error("Unsupported value for the 'tileSize' argument"); o = parseFloat(r.width), l = parseFloat(r.height) } t.find(".k-item").css({ width: o, height: l }) } }, focus: function() { this.wrapper.focus() }, options: { name: "ColorPalette", columns: 10, tileSize: null, palette: "basic" }, _onEnable: function(e) { e ? this.wrapper.attr("tabIndex", this._tabIndex) : this.wrapper.removeAttr("tabIndex") }, _keydown: function(t) { var n, i, a = this.wrapper, s = a.find(".k-item"), l = s.filter("." + f).get(0), c = t.keyCode; if (c == h.LEFT ? n = r(s, l, -1) : c == h.RIGHT ? n = r(s, l, 1) : c == h.DOWN ? n = r(s, l, this.options.columns) : c == h.UP ? n = r(s, l, -this.options.columns) : c == h.ENTER ? (o(t), l && this._select(e(l).css(p))) : c == h.ESC && this._cancel(), n) { o(t), this._current(n); try { i = d(n.css(p)), this._triggerSelect(i) } catch (u) {} } }, _current: function(t) { this.wrapper.find("." + f).removeClass(f).attr("aria-selected", !1).removeAttr("id"), e(t).addClass(f).attr("aria-selected", !0).attr("id", this._selectedID), this.element.removeAttr("aria-activedescendant").attr("aria-activedescendant", this._selectedID) }, _updateUI: function(t) { var i = null; this.wrapper.find(".k-item").each(function() { var r = d(e(this).css(p)); return r && r.equals(t) ? (i = this, !1) : n }), this._current(i) }, _template: s.template('<table class="k-palette k-reset" role="presentation"><tr role="row"># for (var i = 0; i < colors.length; ++i) { ## var selected = colors[i].equals(value); ## if (i && i % columns == 0) { # </tr><tr role="row"> # } #<td role="gridcell" unselectable="on" style="background-color:#= colors[i].toCss() #"#= selected ? " aria-selected=true" : "" # #=(id && i === 0) ? "id=\\""+id+"\\" " : "" # class="k-item#= selected ? " ' + f + '" : "" #" aria-label="#= colors[i].toCss() #"></td># } #</tr></table>') }), S = x.extend({ init: function(t, n) { var i = this; x.fn.init.call(i, t, n), n = i.options, t = i.element, i.wrapper = t.addClass("k-widget k-flatcolorpicker").append(i._template(n)), i._hueElements = e(".k-hsv-rectangle, .k-transparency-slider .k-slider-track", t), i._selectedColor = e(".k-selected-color-display", t), i._colorAsText = e("input.k-color-value", t), i._sliders(), i._hsvArea(), i._updateUI(i._value || d("#f00")), t.find("input.k-color-value").on(b, function(t) { var n, r, o = this; if (t.keyCode == h.ENTER) try { n = d(o.value), r = i.color(), i._select(n, n.equals(r)) } catch (a) { e(o).addClass("k-state-error") } else i.options.autoupdate && setTimeout(function() { var e = d(o.value, !0); e && i._updateUI(e, !0) }, 10) }).end().on(w, ".k-controls button.apply", function() { i._select(i._getHSV()) }).on(w, ".k-controls button.cancel", function() { i._updateUI(i.color()), i._cancel() }), k && i._applyIEFilter() }, destroy: function() { this._hueSlider.destroy(), this._opacitySlider && this._opacitySlider.destroy(), this._hueSlider = this._opacitySlider = this._hsvRect = this._hsvHandle = this._hueElements = this._selectedColor = this._colorAsText = null, x.fn.destroy.call(this) }, options: { name: "FlatColorPicker", opacity: !1, buttons: !1, input: !0, preview: !0, autoupdate: !0, messages: v }, _applyIEFilter: function() { var e = this.element.find(".k-hue-slider .k-slider-track")[0], t = e.currentStyle.backgroundImage; t = t.replace(/^url\([\'\"]?|[\'\"]?\)$/g, ""), e.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + t + "', sizingMethod='scale')" }, _sliders: function() { function e(e) { n._updateUI(n._getHSV(e.value, null, null, null)) } function t(e) { n._updateUI(n._getHSV(null, null, null, e.value / 100)) } var n = this, i = n.element; n._hueSlider = i.find(".k-hue-slider").kendoSlider({ min: 0, max: 359, tickPlacement: "none", showButtons: !1, slide: e, change: e }).data("kendoSlider"), n._opacitySlider = i.find(".k-transparency-slider").kendoSlider({ min: 0, max: 100, tickPlacement: "none", showButtons: !1, slide: t, change: t }).data("kendoSlider") }, _hsvArea: function() { function e(e, n) { var i = this.offset, r = e - i.left, o = n - i.top, a = this.width, s = this.height; r = 0 > r ? 0 : r > a ? a : r, o = 0 > o ? 0 : o > s ? s : o, t._svChange(r / a, 1 - o / s) } var t = this, n = t.element, i = n.find(".k-hsv-rectangle"), r = i.find(".k-draghandle").attr("tabIndex", 0).on(b, a(t._keydown, t)); t._hsvEvents = new s.UserEvents(i, { global: !0, press: function(t) { this.offset = s.getOffset(i), this.width = i.width(), this.height = i.height(), r.focus(), e.call(this, t.x.location, t.y.location) }, start: function() { i.addClass("k-dragging"), r.focus() }, move: function(t) { t.preventDefault(), e.call(this, t.x.location, t.y.location) }, end: function() { i.removeClass("k-dragging") } }), t._hsvRect = i, t._hsvHandle = r }, _onEnable: function(e) { this._hueSlider.enable(e), this._opacitySlider && this._opacitySlider.enable(e), this.wrapper.find("input").attr("disabled", !e); var t = this._hsvRect.find(".k-draghandle"); e ? t.attr("tabIndex", this._tabIndex) : t.removeAttr("tabIndex") }, _keydown: function(e) { function t(t, n) { var r = i._getHSV(); r[t] += n * (e.shiftKey ? .01 : .05), 0 > r[t] && (r[t] = 0), r[t] > 1 && (r[t] = 1), i._updateUI(r), o(e) } function n(t) { var n = i._getHSV(); n.h += t * (e.shiftKey ? 1 : 5), 0 > n.h && (n.h = 0), n.h > 359 && (n.h = 359), i._updateUI(n), o(e) } var i = this; switch (e.keyCode) { case h.LEFT: e.ctrlKey ? n(-1) : t("s", -1); break; case h.RIGHT: e.ctrlKey ? n(1) : t("s", 1); break; case h.UP: t(e.ctrlKey && i._opacitySlider ? "a" : "v", 1); break; case h.DOWN: t(e.ctrlKey && i._opacitySlider ? "a" : "v", -1); break; case h.ENTER: i._select(i._getHSV()); break; case h.F2: i.wrapper.find("input.k-color-value").focus().select(); break; case h.ESC: i._cancel() } }, focus: function() { this._hsvHandle.focus() }, _getHSV: function(e, t, n, i) { var r = this._hsvRect, o = r.width(), a = r.height(), s = this._hsvHandle.position(); return null == e && (e = this._hueSlider.value()), null == t && (t = s.left / o), null == n && (n = 1 - s.top / a), null == i && (i = this._opacitySlider ? this._opacitySlider.value() / 100 : 1), u.fromHSV(e, t, n, i) }, _svChange: function(e, t) { var n = this._getHSV(null, e, t, null); this._updateUI(n) }, _updateUI: function(e, t) { var n = this, i = n._hsvRect; e && (this._colorAsText.removeClass("k-state-error"), n._selectedColor.css(p, e.toDisplay()), t || n._colorAsText.val(n._opacitySlider ? e.toCssRgba() : e.toCss()), n._triggerSelect(e), e = e.toHSV(), n._hsvHandle.css({ left: e.s * i.width() + "px", top: (1 - e.v) * i.height() + "px" }), n._hueElements.css(p, u.fromHSV(e.h, 1, 1, 1).toCss()), n._hueSlider.value(e.h), n._opacitySlider && n._opacitySlider.value(100 * e.a)) }, _selectOnHide: function() { return this.options.buttons ? null : this._getHSV() }, _template: s.template('# if (preview) { #<div class="k-selected-color"><div class="k-selected-color-display"><input class="k-color-value" #= !data.input ? \'style="visibility: hidden;"\' : "" #></div></div># } #<div class="k-hsv-rectangle"><div class="k-hsv-gradient"></div><div class="k-draghandle"></div></div><input class="k-hue-slider" /># if (opacity) { #<input class="k-transparency-slider" /># } ## if (buttons) { #<div unselectable="on" class="k-controls"><button class="k-button k-primary apply">#: messages.apply #</button> <button class="k-button cancel">#: messages.cancel #</button></div># } #') }), T = c.extend({ init: function(t, n) { var i, r, o, a, s, l = this; c.fn.init.call(l, t, n), n = l.options, t = l.element, i = t.attr("value") || t.val(), i = i ? d(i, !0) : d(n.value, !0), l._value = n.value = i, r = l.wrapper = e(l._template(n)), t.hide().after(r), t.is("input") && (t.appendTo(r), o = t.closest("label"), a = t.attr("id"), a && (o = o.add('label[for="' + a + '"]')), o.click(function(e) { l.open(), e.preventDefault() })), l._tabIndex = t.attr("tabIndex") || 0, l.enable(!t.attr("disabled")), s = t.attr("accesskey"), s && (t.attr("accesskey", null), r.attr("accesskey", s)), l.bind("activate", function(e) { e.isDefaultPrevented() || l.toggle() }), l._updateUI(i) }, destroy: function() { this.wrapper.off(_).find("*").off(_), this._popup && (this._selector.destroy(), this._popup.destroy()), this._selector = this._popup = this.wrapper = null, c.fn.destroy.call(this) }, enable: function(e) { var t = this, n = t.wrapper, i = n.children(".k-picker-wrap"), r = i.find(".k-select"); 0 === arguments.length && (e = !0), t.element.attr("disabled", !e), n.attr("aria-disabled", !e), r.off(_).on("mousedown" + _, o), n.addClass("k-state-disabled").removeAttr("tabIndex").add("*", n).off(_), e && n.removeClass("k-state-disabled").attr("tabIndex", t._tabIndex).on("mouseenter" + _, function() { i.addClass("k-state-hover") }).on("mouseleave" + _, function() { i.removeClass("k-state-hover") }).on("focus" + _, function() { i.addClass("k-state-focused") }).on("blur" + _, function() { i.removeClass("k-state-focused") }).on(b, a(t._keydown, t)).on(w, ".k-select", a(t.toggle, t)).on(w, t.options.toolIcon ? ".k-tool-icon" : ".k-selected-color", function() { t.trigger("activate") }) }, _template: s.template('<span role="textbox" aria-haspopup="true" class="k-widget k-colorpicker k-header"><span class="k-picker-wrap k-state-default"># if (toolIcon) { #<span class="k-tool-icon #= toolIcon #"><span class="k-selected-color"></span></span># } else { #<span class="k-selected-color"></span># } #<span class="k-select" unselectable="on"><span class="k-icon k-i-arrow-s" unselectable="on"></span></span></span></span>'), options: { name: "ColorPicker", palette: null, columns: 10, toolIcon: null, value: null, messages: v, opacity: !1, buttons: !0, preview: !0, ARIATemplate: 'Current selected color is #=data || ""#' }, events: ["activate", "change", "select", "open", "close"], open: function() { this._getPopup().open() }, close: function() { this._getPopup().close() }, toggle: function() { this._getPopup().toggle() }, color: x.fn.color, value: x.fn.value, _select: x.fn._select, _triggerSelect: x.fn._triggerSelect, _isInputTypeColor: function() { var e = this.element[0]; return /^input$/i.test(e.tagName) && /^color$/i.test(e.type) }, _updateUI: function(e) { var t = ""; e && (t = this._isInputTypeColor() || 1 == e.a ? e.toCss() : e.toCssRgba(), this.element.val(t)), this._ariaTemplate || (this._ariaTemplate = s.template(this.options.ARIATemplate)), this.wrapper.attr("aria-label", this._ariaTemplate(t)), this._triggerSelect(e), this.wrapper.find(".k-selected-color").css(p, e ? e.toDisplay() : "transparent") }, _keydown: function(e) { var t = e.keyCode; this._getPopup().visible() ? (t == h.ESC ? this._selector._cancel() : this._selector._keydown(e), o(e)) : (t == h.ENTER || t == h.DOWN) && (this.open(), o(e)) }, _getPopup: function() { var t, i, r, o, a = this, l = a._popup; return l || (t = a.options, i = t.palette ? C : S, t._standalone = !1, delete t.select, delete t.change, delete t.cancel, r = s.guid(), o = a._selector = new i(e('<div id="' + r + '"/>').appendTo(document.body), t), a.wrapper.attr("aria-owns", r), a._popup = l = o.wrapper.kendoPopup({ anchor: a.wrapper, adjustSize: { width: 5, height: 0 } }).data("kendoPopup"), o.bind({ select: function(e) { a._updateUI(d(e.value)) }, change: function() { a._select(o.color()), a.close() }, cancel: function() { a.close() } }), l.bind({ close: function(e) { if (a.trigger("close")) return e.preventDefault(), n; a.wrapper.children(".k-picker-wrap").removeClass("k-state-focused"); var t = o._selectOnHide(); t ? a._select(t) : (a.wrapper.focus(), a._updateUI(a.color())) }, open: function(e) { a.trigger("open") ? e.preventDefault() : a.wrapper.children(".k-picker-wrap").addClass("k-state-focused") }, activate: function() { o._select(a.color(), !0), o.focus(), a.wrapper.children(".k-picker-wrap").addClass("k-state-focused") } })), l } }); l.plugin(C), l.plugin(S), l.plugin(T) }(jQuery, parseInt), function(e, t) { function n(e, t) { return '<span unselectable="on" class="k-link"><span unselectable="on" class="k-icon k-i-arrow-' + e + '" title="' + t + '">' + t + "</span></span>" } var i = window.kendo, r = i.caret, o = i.keys, a = i.ui, s = a.Widget, l = i._activeElement, c = i._extractFormat, d = i.parseFloat, u = i.support.placeholder, h = i.getCulture, p = i._round, f = "change", g = "disabled", m = "readonly", v = "k-input", _ = "spin", w = ".kendoNumericTextBox", b = "touchend", y = "mouseleave" + w, k = "mouseenter" + w + " " + y, x = "k-state-default", C = "k-state-focused", S = "k-state-hover", T = "focus", D = ".", A = "k-state-selected", E = "k-state-disabled", I = "aria-disabled", P = "aria-readonly", M = /^(-)?(\d*)$/, z = null, F = e.proxy, R = e.extend, H = s.extend({ init: function(n, r) { var o, a, l, d, u, h = this, p = r && r.step !== t; s.fn.init.call(h, n, r), r = h.options, n = h.element.on("focusout" + w, F(h._focusout, h)).attr("role", "spinbutton"), r.placeholder = r.placeholder || n.attr("placeholder"), h._initialOptions = R({}, r), h._reset(), h._wrapper(), h._arrows(), h._input(), i.support.mobileOS ? h._text.on(b + w + " " + T + w, function() { h._toggleText(!1), n.focus() }) : h._text.on(T + w, F(h._click, h)), o = h.min(n.attr("min")), a = h.max(n.attr("max")), l = h._parse(n.attr("step")), r.min === z && o !== z && (r.min = o), r.max === z && a !== z && (r.max = a), p || l === z || (r.step = l), n.attr("aria-valuemin", r.min).attr("aria-valuemax", r.max), r.format = c(r.format), d = r.value, h.value(d !== z ? d : n.val()), u = n.is("[disabled]") || e(h.element).parents("fieldset").is(":disabled"), u ? h.enable(!1) : h.readonly(n.is("[readonly]")), i.notify(h) }, options: { name: "NumericTextBox", decimals: z, min: z, max: z, value: z, step: 1, culture: "", format: "n", spinners: !0, placeholder: "", upArrowText: "Increase value", downArrowText: "Decrease value" }, events: [f, _], _editable: function(e) { var t = this, n = t.element, i = e.disable, r = e.readonly, o = t._text.add(n), a = t._inputWrapper.off(k); t._toggleText(!0), t._upArrowEventHandler.unbind("press"), t._downArrowEventHandler.unbind("press"), n.off("keydown" + w).off("keypress" + w).off("paste" + w), r || i ? (a.addClass(i ? E : x).removeClass(i ? x : E), o.attr(g, i).attr(m, r).attr(I, i).attr(P, r)) : (a.addClass(x).removeClass(E).on(k, t._toggleHover), o.removeAttr(g).removeAttr(m).attr(I, !1).attr(P, !1), t._upArrowEventHandler.bind("press", function(e) { e.preventDefault(), t._spin(1), t._upArrow.addClass(A) }), t._downArrowEventHandler.bind("press", function(e) { e.preventDefault(), t._spin(-1), t._downArrow.addClass(A) }), t.element.on("keydown" + w, F(t._keydown, t)).on("keypress" + w, F(t._keypress, t)).on("paste" + w, F(t._paste, t))) }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, destroy: function() { var e = this; e.element.add(e._text).add(e._upArrow).add(e._downArrow).add(e._inputWrapper).off(w), e._upArrowEventHandler.destroy(), e._downArrowEventHandler.destroy(), e._form && e._form.off("reset", e._resetHandler), s.fn.destroy.call(e) }, min: function(e) { return this._option("min", e) }, max: function(e) { return this._option("max", e) }, step: function(e) { return this._option("step", e) }, value: function(e) { var n, i = this; return e === t ? i._value : (e = i._parse(e), n = i._adjust(e), e === n && (i._update(e), i._old = i._value), t) }, focus: function() { this._focusin() }, _adjust: function(e) { var t = this, n = t.options, i = n.min, r = n.max; return e === z ? e : (i !== z && i > e ? e = i : r !== z && e > r && (e = r), e) }, _arrows: function() { var t, r = this, o = function() { clearTimeout(r._spinning), t.removeClass(A) }, a = r.options, s = a.spinners, l = r.element; t = l.siblings(".k-icon"), t[0] || (t = e(n("n", a.upArrowText) + n("s", a.downArrowText)).insertAfter(l), t.wrapAll('<span class="k-select"/>')), s || (t.parent().toggle(s), r._inputWrapper.addClass("k-expand-padding")), r._upArrow = t.eq(0), r._upArrowEventHandler = new i.UserEvents(r._upArrow, { release: o }), r._downArrow = t.eq(1), r._downArrowEventHandler = new i.UserEvents(r._downArrow, { release: o }) }, _blur: function() { var e = this; e._toggleText(!0), e._change(e.element.val()) }, _click: function(e) { var t = this; clearTimeout(t._focusing), t._focusing = setTimeout(function() { var n, i, o, a = e.target, s = r(a)[0], l = a.value.substring(0, s), c = t._format(t.options.format), d = c[","], u = 0; d && (i = RegExp("\\" + d, "g"), o = RegExp("([\\d\\" + d + "]+)(\\" + c[D] + ")?(\\d+)?")), o && (n = o.exec(l)), n && (u = n[0].replace(i, "").length, -1 != l.indexOf("(") && 0 > t._value && u++), t._focusin(), r(t.element[0], u) }) }, _change: function(e) { var t = this; t._update(e), e = t._value, t._old != e && (t._old = e, t._typing || t.element.trigger(f), t.trigger(f)), t._typing = !1 }, _culture: function(e) { return e || h(this.options.culture) }, _focusin: function() { var e = this; e._inputWrapper.addClass(C), e._toggleText(!1), e.element[0].focus() }, _focusout: function() { var e = this; clearTimeout(e._focusing), e._inputWrapper.removeClass(C).removeClass(S), e._blur() }, _format: function(e, t) { var n = this._culture(t).numberFormat; return e = e.toLowerCase(), e.indexOf("c") > -1 ? n = n.currency : e.indexOf("p") > -1 && (n = n.percent), n }, _input: function() { var t, n = this, i = "k-formatted-value", r = n.element.addClass(v).show()[0], o = r.accessKey, a = n.wrapper; t = a.find(D + i), t[0] || (t = e('<input type="text"/>').insertBefore(r).addClass(i)); try { r.setAttribute("type", "text") } catch (s) { r.type = "text" } t[0].tabIndex = r.tabIndex, t[0].style.cssText = r.style.cssText, t[0].title = r.title, t.prop("placeholder", n.options.placeholder), o && (t.attr("accesskey", o), r.accessKey = ""), n._text = t.addClass(r.className) }, _keydown: function(e) { var t = this, n = e.keyCode; t._key = n, n == o.DOWN ? t._step(-1) : n == o.UP ? t._step(1) : n == o.ENTER ? t._change(t.element.val()) : t._typing = !0 }, _keypress: function(e) { var t, n, i, a, s, l, c, d, u, h, p; 0 === e.which || e.metaKey || e.ctrlKey || e.keyCode === o.BACKSPACE || e.keyCode === o.ENTER || (t = this, n = t.options.min, i = t.element, a = r(i), s = a[0], l = a[1], c = String.fromCharCode(e.which), d = t._format(t.options.format), u = t._key === o.NUMPAD_DOT, h = i.val(), u && (c = d[D]), h = h.substring(0, s) + c + h.substring(l), p = t._numericRegex(d).test(h), p && u ? (i.val(h), r(i, s + c.length), e.preventDefault()) : (null !== n && n >= 0 && "-" === h.charAt(0) || !p) && e.preventDefault(), t._key = 0) }, _numericRegex: function(e) { var t = this, n = e[D], i = t.options.decimals; return n === D && (n = "\\" + n), i === z && (i = e.decimals), 0 === i ? M : (t._separator !== n && (t._separator = n, t._floatRegExp = RegExp("^(-)?(((\\d+(" + n + "\\d*)?)|(" + n + "\\d*)))?$")), t._floatRegExp) }, _paste: function(e) { var t = this, n = e.target, i = n.value; setTimeout(function() { t._parse(n.value) === z && t._update(i) }) }, _option: function(e, n) { var i = this, r = i.options; return n === t ? r[e] : (n = i._parse(n), (n || "step" !== e) && (r[e] = n, i.element.attr("aria-value" + e, n).attr(e, n)), t) }, _spin: function(e, t) { var n = this; t = t || 500, clearTimeout(n._spinning), n._spinning = setTimeout(function() { n._spin(e, 50) }, t), n._step(e) }, _step: function(e) { var t = this, n = t.element, i = t._parse(n.val()) || 0; l() != n[0] && t._focusin(), i += t.options.step * e, t._update(t._adjust(i)), t._typing = !1, t.trigger(_) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(S, "mouseenter" === t.type) }, _toggleText: function(e) { var t = this; t._text.toggle(e), t.element.toggle(!e) }, _parse: function(e, t) { return d(e, this._culture(t), this.options.format) }, _update: function(e) { var t, n = this, r = n.options, o = r.format, a = r.decimals, s = n._culture(), l = n._format(o, s); a === z && (a = l.decimals), e = n._parse(e, s), t = e !== z, t && (e = parseFloat(p(e, a))), n._value = e = n._adjust(e), n._placeholder(i.toString(e, o, s)), t ? (e = "" + e, -1 !== e.indexOf("e") && (e = p(+e, a)), e = e.replace(D, l[D])) : e = "", n.element.val(e).attr("aria-valuenow", e) }, _placeholder: function(e) { this._text.val(e), u || e || this._text.val(this.options.placeholder) }, _wrapper: function() { var t, n = this, i = n.element, r = i[0]; t = i.parents(".k-numerictextbox"), t.is("span.k-numerictextbox") || (t = i.hide().wrap('<span class="k-numeric-wrap k-state-default" />').parent(), t = t.wrap("<span/>").parent()), t[0].style.cssText = r.style.cssText, r.style.width = "", n.wrapper = t.addClass("k-widget k-numerictextbox").addClass(r.className).css("display", ""), n._inputWrapper = e(t[0].firstChild) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { setTimeout(function() { t.value(n[0].value), t.max(t._initialOptions.max), t.min(t._initialOptions.min) }) }, t._form = r.on("reset", t._resetHandler)) } }); a.plugin(H) }(window.kendo.jQuery), function(e, t) { function n(t, i) { t.filters && (t.filters = e.grep(t.filters, function(e) { return n(e, i), e.filters ? e.filters.length : e.field != i })) } function i(e) { var t, n, i, r, o, a; if (e && e.length) for (a = [], t = 0, n = e.length; n > t; t++) i = e[t], o = i.text || i.value || i, r = null == i.value ? i.text || i : i.value, a[t] = { text: o, value: r }; return a } function r(t, n) { return e.grep(t, function(t) { return t.filters ? (t.filters = e.grep(t.filters, function(e) { return e.field != n }), t.filters.length) : t.field != n }) } function o(t, n) { t.filters && (t.filters = e.grep(t.filters, function(e) { return o(e, n), e.filters ? e.filters.length : e.field == n && "eq" == e.operator })) } function a(n) { return "and" == n.logic && n.filters.length > 1 ? [] : n.filters ? e.map(n.filters, function(e) { return a(e) }) : null !== n.value && n.value !== t ? [n.value] : [] } function s(e, n) { for (var i, r, o = c.getter(n, !0), a = [], s = 0, l = {}; e.length > s;) i = e[s++], r = o(i), r === t || null === r || l.hasOwnProperty(r) || (a.push(i), l[r] = !0); return a } function l(e, t) { return function(n) { var i = e(n); return s(i, t) } } var c = window.kendo, d = c.ui, u = e.proxy, h = "kendoPopup", p = "init", f = "refresh", g = "change", m = ".kendoFilterMenu", v = "Is equal to", _ = "Is not equal to", w = { number: "numerictextbox", date: "datepicker" }, b = { string: "text", number: "number", date: "date" }, y = c.isFunction, k = d.Widget, x = '<div><div class="k-filter-help-text">#=messages.info#</div><label><input type="radio" data-#=ns#bind="checked: filters[0].value" value="true" name="filters[0].value"/>#=messages.isTrue#</label><label><input type="radio" data-#=ns#bind="checked: filters[0].value" value="false" name="filters[0].value"/>#=messages.isFalse#</label><div><button type="submit" class="k-button k-primary">#=messages.filter#</button><button type="reset" class="k-button">#=messages.clear#</button></div></div>', C = '<div><div class="k-filter-help-text">#=messages.info#</div><select data-#=ns#bind="value: filters[0].operator" data-#=ns#role="dropdownlist">#for(var op in operators){#<option value="#=op#">#=operators[op]#</option>#}#</select>#if(values){#<select data-#=ns#bind="value:filters[0].value" data-#=ns#text-field="text" data-#=ns#value-field="value" data-#=ns#source=\'#=kendo.stringify(values).replace(/\'/g,"&\\#39;")#\' data-#=ns#role="dropdownlist" data-#=ns#option-label="#=messages.selectValue#" data-#=ns#value-primitive="true"></select>#}else{#<input data-#=ns#bind="value:filters[0].value" class="k-textbox" type="text" #=role ? "data-" + ns + "role=\'" + role + "\'" : ""# />#}##if(extra){#<select class="k-filter-and" data-#=ns#bind="value: logic" data-#=ns#role="dropdownlist"><option value="and">#=messages.and#</option><option value="or">#=messages.or#</option></select><select data-#=ns#bind="value: filters[1].operator" data-#=ns#role="dropdownlist">#for(var op in operators){#<option value="#=op#">#=operators[op]#</option>#}#</select>#if(values){#<select data-#=ns#bind="value:filters[1].value" data-#=ns#text-field="text" data-#=ns#value-field="value" data-#=ns#source=\'#=kendo.stringify(values).replace(/\'/g,"&\\#39;")#\' data-#=ns#role="dropdownlist" data-#=ns#option-label="#=messages.selectValue#" data-#=ns#value-primitive="true"></select>#}else{#<input data-#=ns#bind="value: filters[1].value" class="k-textbox" type="text" #=role ? "data-" + ns + "role=\'" + role + "\'" : ""#/>#}##}#<div><button type="submit" class="k-button k-primary">#=messages.filter#</button><button type="reset" class="k-button">#=messages.clear#</button></div></div>', S = '<div data-#=ns#role="view" data-#=ns#init-widgets="false" class="k-grid-filter-menu"><div data-#=ns#role="header" class="k-header"><button class="k-button k-cancel">#=messages.cancel#</button>#=title#<button type="submit" class="k-button k-submit">#=messages.filter#</button></div><form class="k-filter-menu k-mobile-list"><ul class="k-filter-help-text"><li><span class="k-link">#=messages.info#</span><ul><li class="k-item"><label class="k-label">#=messages.operator#<select data-#=ns#bind="value: filters[0].operator">#for(var op in operators){#<option value="#=op#">#=operators[op]#</option>#}#</select></label></li><li class="k-item"><label class="k-label">#=messages.value##if(values){#<select data-#=ns#bind="value:filters[0].value"><option value="">#=messages.selectValue#</option>#for(var val in values){#<option value="#=values[val].value#">#=values[val].text#</option>#}#</select>#}else{#<input data-#=ns#bind="value:filters[0].value" class="k-textbox" type="#=inputType#" #=useRole ? "data-" + ns + "role=\'" + role + "\'" : ""# />#}#</label></li>#if(extra){#</ul><ul class="k-filter-help-text"><li><span class="k-link"></span><li class="k-item"><label class="k-label"><input type="radio" name="logic" class="k-check" data-#=ns#bind="checked: logic" value="and" />#=messages.and#</label></li><li class="k-item"><label class="k-label"><input type="radio" name="logic" class="k-check" data-#=ns#bind="checked: logic" value="or" />#=messages.or#</label></li></ul><ul class="k-filter-help-text"><li><span class="k-link"></span><li class="k-item"><label class="k-label">#=messages.operator#<select data-#=ns#bind="value: filters[1].operator">#for(var op in operators){#<option value="#=op#">#=operators[op]#</option>#}#</select></label></li><li class="k-item"><label class="k-label">#=messages.value##if(values){#<select data-#=ns#bind="value:filters[1].value"><option value="">#=messages.selectValue#</option>#for(var val in values){#<option value="#=values[val].value#">#=values[val].text#</option>#}#</select>#}else{#<input data-#=ns#bind="value:filters[1].value" class="k-textbox" type="#=inputType#" #=useRole ? "data-" + ns + "role=\'" + role + "\'" : ""# />#}#</label></li>#}#</ul></li><li class="k-button-container"><button type="reset" class="k-button">#=messages.clear#</button></li></ul></div></form></div>', T = '<div data-#=ns#role="view" data-#=ns#init-widgets="false" class="k-grid-filter-menu"><div data-#=ns#role="header" class="k-header"><button class="k-button k-cancel">#=messages.cancel#</button>#=title#<button type="submit" class="k-button k-submit">#=messages.filter#</button></div><form class="k-filter-menu k-mobile-list"><ul class="k-filter-help-text"><li><span class="k-link">#=messages.info#</span><ul><li class="k-item"><label class="k-label"><input class="k-check" type="radio" data-#=ns#bind="checked: filters[0].value" value="true" name="filters[0].value"/>#=messages.isTrue#</label></li><li class="k-item"><label class="k-label"><input class="k-check" type="radio" data-#=ns#bind="checked: filters[0].value" value="false" name="filters[0].value"/>#=messages.isFalse#</label></li></ul></li><li class="k-button-container"><button type="reset" class="k-button">#=messages.clear#</button></li></ul></form></div>', D = k.extend({ init: function(t, n) { var i, r, o, a, s = this, l = "string"; k.fn.init.call(s, t, n), i = s.operators = n.operators || {}, t = s.element, n = s.options, n.appendToElement || (o = t.addClass("k-with-icon k-filterable").find(".k-grid-filter"), o[0] || (o = t.prepend('<a class="k-grid-filter" href="#"><span class="k-icon k-filter"/></a>').find(".k-grid-filter")), o.attr("tabindex", -1).on("click" + m, u(s._click, s))), s.link = o || e(), s.dataSource = n.dataSource, s.field = n.field || t.attr(c.attr("field")), s.model = s.dataSource.reader.model, s._parse = function(e) { return e + "" }, s.model && s.model.fields && (a = s.model.fields[s.field], a && (l = a.type || "string", a.parse && (s._parse = u(a.parse, a)))), n.values && (l = "enums"), s.type = l, i = i[l] || n.operators[l]; for (r in i) break; s._defaultFilter = function() { return { field: s.field, operator: r || "eq", value: "" } }, s._refreshHandler = u(s.refresh, s), s.dataSource.bind(g, s._refreshHandler), n.appendToElement ? s._init() : s.refresh() }, _init: function() { var t, n = this, i = n.options.ui, r = y(i); n.pane = n.options.pane, n.pane && (n._isMobile = !0), r || (t = i || w[n.type]), n._isMobile ? n._createMobileForm(t) : n._createForm(t), n.form.on("submit" + m, u(n._submit, n)).on("reset" + m, u(n._reset, n)), r && n.form.find(".k-textbox").removeClass("k-textbox").each(function() { i(e(this)) }), n.form.find("[" + c.attr("role") + "=numerictextbox]").removeClass("k-textbox").end().find("[" + c.attr("role") + "=datetimepicker]").removeClass("k-textbox").end().find("[" + c.attr("role") + "=timepicker]").removeClass("k-textbox").end().find("[" + c.attr("role") + "=datepicker]").removeClass("k-textbox"), n.refresh(), /*n.trigger(p, { field: n.field, container: n.form }),*/ c.cycleForm(n.form) }, _createForm: function(t) { var n = this, r = n.options, o = n.operators || {}, a = n.type; o = o[a] || r.operators[a], n.form = e('<form class="k-filter-menu"/>').html(c.template("boolean" === a ? x : C)({ field: n.field, format: r.format, ns: c.ns, messages: r.messages, extra: r.extra, operators: o, type: a, role: t, values: i(r.values) })), r.appendToElement ? (n.element.append(n.form), n.popup = n.element.closest(".k-popup").data(h)) : n.popup = n.form[h]({ anchor: n.link, open: u(n._open, n), activate: u(n._activate, n), close: function() { n.options.closeCallback && n.options.closeCallback(n.element) } }).data(h), n.form.on("keydown" + m, u(n._keydown, n)) }, _createMobileForm: function(t) { var n = this, r = n.options, o = n.operators || {}, a = n.type; o = o[a] || r.operators[a], n.form = e("<div />").html(c.template("boolean" === a ? T : S)({ field: n.field, title: r.title || n.field, format: r.format, ns: c.ns, messages: r.messages, extra: r.extra, operators: o, type: a, role: t, useRole: !c.support.input.date && "date" === a || "number" === a, inputType: b[a], values: i(r.values) })), n.view = n.pane.append(n.form.html()), n.form = n.view.element.find("form"), n.view.element.on("click", ".k-submit", function(e) { n.form.submit(), e.preventDefault() }).on("click", ".k-cancel", function(e) { n._closeForm(), e.preventDefault() }) }, refresh: function() { var e = this, t = e.dataSource.filter() || { filters: [], logic: "and" }; e.filterModel = c.observable({ logic: "and", filters: [e._defaultFilter(), e._defaultFilter()] }), e.form && c.bind(e.form.children().first(), e.filterModel), e._bind(t) ? e.link.addClass("k-state-active") : e.link.removeClass("k-state-active") }, destroy: function() { var e = this; k.fn.destroy.call(e), e.form && (c.unbind(e.form), c.destroy(e.form), e.form.unbind(m), e.popup && (e.popup.destroy(), e.popup = null), e.form = null), e.view && (e.view.purge(), e.view = null), e.link.unbind(m), e._refreshHandler && (e.dataSource.unbind(g, e._refreshHandler), e.dataSource = null), e.element = e.link = e._refreshHandler = e.filterModel = null }, _bind: function(e) { var t, n, i, r, o = this, a = e.filters, s = !1, l = 0, c = o.filterModel; for (t = 0, n = a.length; n > t; t++) r = a[t], r.field == o.field ? (c.set("logic", e.logic), i = c.filters[l], i || (c.filters.push({ field: o.field }), i = c.filters[l]), i.set("value", o._parse(r.value)), i.set("operator", r.operator), l++, s = !0) : r.filters && (s = s || o._bind(r)); return s }, _stripFilters: function(t) { return e.grep(t, function(e) { return "" !== e.value && null != e.value }) }, _merge: function(e) { var t, i, r, o = this, a = e.logic || "and", s = this._stripFilters(e.filters), l = o.dataSource.filter() || { filters: [], logic: "and" }; for (n(l, o.field), i = 0, r = s.length; r > i; i++) t = s[i], t.value = o._parse(t.value); return s.length && (l.filters.length ? (e.filters = s, "and" !== l.logic && (l.filters = [{ logic: l.logic, filters: l.filters }], l.logic = "and"), l.filters.push(s.length > 1 ? e : s[0])) : (l.filters = s, l.logic = a)), l }, filter: function(e) { e = this._merge(e), e.filters.length && this.dataSource.filter(e) }, clear: function() { var t = this, n = t.dataSource.filter() || { filters: [] }; n.filters = e.grep(n.filters, function(e) { return e.filters ? (e.filters = r(e.filters, t.field), e.filters.length) : e.field != t.field }), n.filters.length || (n = null), t.dataSource.filter(n) }, _submit: function(e) { e.preventDefault(), e.stopPropagation(), this.filter(this.filterModel.toJSON()), this._closeForm() }, _reset: function() { this.clear(), this._closeForm() }, _closeForm: function() { this._isMobile ? this.pane.navigate("", this.options.animations.right) : this.popup.close() }, _click: function(e) { e.preventDefault(), e.stopPropagation(), this.trigger(p, { field: this.field, container: this.form }), this.popup || this.pane || this._init(), this._isMobile ? this.pane.navigate(this.view, this.options.animations.left) : this.popup.toggle() }, _open: function() { var t; e(".k-filter-menu").not(this.form).each(function() { t = e(this).data(h), t && t.close() }) }, _activate: function() { this.form.find(":kendoFocusable:first").focus() }, _keydown: function(e) { e.keyCode == c.keys.ESC && this.popup.close() }, events: [p], options: { name: "FilterMenu", extra: !0, appendToElement: !1, type: "string", operators: { string: { eq: v, neq: _, startswith: "Starts with", contains: "Contains", doesnotcontain: "Does not contain", endswith: "Ends with" }, number: { eq: v, neq: _, gte: "Is greater than or equal to", gt: "Is greater than", lte: "Is less than or equal to", lt: "Is less than" }, date: { eq: v, neq: _, gte: "Is after or equal to", gt: "Is after", lte: "Is before or equal to", lt: "Is before" }, enums: { eq: v, neq: _ } }, messages: { info: "Show items with value that:", isTrue: "is true", isFalse: "is false", filter: "Filter", clear: "Clear", and: "And", or: "Or", selectValue: "-Select value-", operator: "Operator", value: "Value", cancel: "Cancel" }, animations: { left: "slide", right: "slide:right" } } }), A = ".kendoFilterMultiCheck", E = c.data.DataSource, I = k.extend({ init: function(t, n) { var i, r; k.fn.init.call(this, t, n), n = this.options, this.element = e(t), i = this.field = this.options.field || this.element.attr(c.attr("field")), r = n.checkSource, n.forceUnique ? (r = n.dataSource.options, delete r.pageSize, this.checkSource = E.create(r), this.checkSource.reader.data = l(this.checkSource.reader.data, this.field)) : this.checkSource = E.create(r), this.dataSource = n.dataSource, this.model = this.dataSource.reader.model, this._parse = function(e) { return e + "" }, this.model && this.model.fields && (i = this.model.fields[this.field], i && (i.parse && (this._parse = u(i.parse, i)), this.type = i.type || "string")), n.appendToElement ? this._init() : this._createLink(), this._refreshHandler = u(this.refresh, this), this.dataSource.bind(g, this._refreshHandler) }, _createLink: function() { var e = this.element, t = e.addClass("k-with-icon k-filterable").find(".k-grid-filter"); t[0] || (t = e.prepend('<a class="k-grid-filter" href="#"><span class="k-icon k-filter"/></a>').find(".k-grid-filter")), this._link = t.attr("tabindex", -1).on("click" + m, u(this._click, this)) }, _init: function() { var e = this, t = this.options.forceUnique, n = this.options; this.pane = n.pane, this.pane && (this._isMobile = !0), this._createForm(), t && !this.checkSource.options.serverPaging && this.dataSource.data().length ? (this.checkSource.data(s(this.dataSource.data(), this.field)), this.refresh()) : (this._attachProgress(), this.checkSource.fetch(function() { e.refresh.call(e) })), this.options.forceUnique || (this.checkChangeHandler = function() { e.container.empty(), e.refresh() }, this.checkSource.bind(g, this.checkChangeHandler)), this.form.on("keydown" + A, u(this._keydown, this)).on("submit" + A, u(this._filter, this)).on("reset" + A, u(this._reset, this)), this.trigger(p, { field: this.field, container: this.form }) }, _attachProgress: function() { var e = this; this._progressHandler = function() { d.progress(e.container, !0) }, this._progressHideHandler = function() { d.progress(e.container, !1) }, this.checkSource.bind("progress", this._progressHandler).bind("change", this._progressHideHandler) }, _createForm: function() { var t, n, i = this.options, r = "<ul class='k-reset k-multicheck-wrap'></ul><button type='submit' class='k-button k-primary'>" + i.messages.filter + "</button>"; r += "<button type='reset' class='k-button'>" + i.messages.clear + "</button>", this.form = e('<form class="k-filter-menu"/>').html(r), this.container = this.form.find(".k-multicheck-wrap"), this._isMobile ? (this.view = this.pane.append(this.form.addClass("k-mobile-list").wrap("<div/>").parent().html()), t = this.view.element, this.form = t.find("form"), this.container = t.find(".k-multicheck-wrap"), n = this, t.on("click", ".k-primary", function(e) { n.form.submit(), e.preventDefault() }).on("click", "[type=reset]", function(e) { n._reset(), e.preventDefault() })) : i.appendToElement ? (this.popup = this.element.closest(".k-popup").data(h), this.element.append(this.form)) : this.popup = this.form.kendoPopup({ anchor: this._link }).data(h) }, createCheckAllItem: function() { var t = this.options, n = c.template(t.itemTemplate({ field: "all", mobile: this._isMobile })), i = e(n({ all: t.messages.checkAll })); this.container.prepend(i), this.checkBoxAll = i.find(":checkbox").eq(0).addClass("k-check-all"), this.checkAllHandler = u(this.checkAll, this), this.checkBoxAll.on(g + A, this.checkAllHandler) }, updateCheckAllState: function() { if (this.checkBoxAll) { var e = this.container.find(":checkbox:not(.k-check-all)").length == this.container.find(":checked:not(.k-check-all)").length; this.checkBoxAll.prop("checked", e) } }, refresh: function(e) { var t = this.options.forceUnique, n = this.dataSource, i = this.getFilterArray(); this._link && this._link.toggleClass("k-state-active", 0 !== i.length), this.form && (!e || !t || e.sender !== n || n.options.serverPaging || "itemchange" != e.action && "add" != e.action && "remove" != e.action || (this.checkSource.data(s(this.dataSource.data(), this.field)), this.container.empty()), this.container.is(":empty") && this.createCheckBoxes(), this.checkValues(i), this.trigger(f)) }, getFilterArray: function() { var t, n = e.extend(!0, {}, { filters: [], logic: "and" }, this.dataSource.filter()); return o(n, this.field), t = a(n) }, createCheckBoxes: function() { var e, t, n, i = this.options, r = { field: this.field, format: i.format, mobile: this._isMobile, type: this.type }; this.options.forceUnique ? i.values ? (e = i.values, r.valueField = "value", r.field = "text") : e = this.checkSource.data() : e = this.checkSource.view(), t = c.template(i.itemTemplate(r)), n = c.render(t, e), i.checkAll && (this.createCheckAllItem(), this.container.on(g + A, ":checkbox", u(this.updateCheckAllState, this))), this.container.append(n) }, checkAll: function() { var e = this.checkBoxAll.is(":checked"); this.container.find(":checkbox").prop("checked", e) }, checkValues: function(t) { var n = this; e(e.grep(this.container.find(":checkbox").prop("checked", !1), function(i) { var r, o, a = !1; if (!e(i).is(".k-check-all")) for (r = n._parse(e(i).val()), o = 0; t.length > o; o++) if (a = "date" == n.type ? t[o].getTime() == r.getTime() : t[o] == r) return a })).prop("checked", !0), this.updateCheckAllState() }, _filter: function(t) { var n, i; t.preventDefault(), t.stopPropagation(), n = { logic: "or" }, i = this, n.filters = e.map(this.form.find(":checkbox:checked:not(.k-check-all)"), function(t) { return { value: e(t).val(), operator: "eq", field: i.field } }), n = this._merge(n), n.filters.length && this.dataSource.filter(n), this._closeForm() }, _stripFilters: function(t) { return e.grep(t, function(e) { return null != e.value }) }, destroy: function() { var e = this; k.fn.destroy.call(e), e.form && (c.unbind(e.form), c.destroy(e.form), e.form.unbind(A), e.popup && (e.popup.destroy(), e.popup = null), e.form = null, e.container && (e.container.unbind(A), e.container = null), e.checkBoxAll && e.checkBoxAll.unbind(A)), e.view && (e.view.purge(), e.view = null), e._link && e._link.unbind(m), e._refreshHandler && (e.dataSource.unbind(g, e._refreshHandler), e.dataSource = null), e.checkChangeHandler && e.checkSource.unbind(g, e.checkChangeHandler), e._progressHandler && e.checkSource.unbind("progress", e._progressHandler), e._progressHideHandler && e.checkSource.unbind("change", e._progressHideHandler), e.element = e.checkSource = e.container = e.checkBoxAll = e._link = e._refreshHandler = e.checkAllHandler = null }, options: { name: "FilterMultiCheck", itemTemplate: function(e) { var n = e.field, i = e.format, r = e.valueField, o = e.mobile, a = ""; return r === t && (r = n), "date" == e.type && (a = ":yyyy-MM-ddTHH:mm:sszzz"), "<li class='k-item'><label class='k-label'><input type='checkbox' class='" + (o ? "k-check" : "") + "' value='#:kendo.format('{0" + a + "}'," + r + ")#'/>#:kendo.format('" + (i ? i : "{0}") + "', " + n + ")#</label></li>" }, checkAll: !0, appendToElement: !1, messages: { checkAll: "Select All", clear: "Clear", filter: "Filter" }, forceUnique: !0, animations: { left: "slide", right: "slide:right" } }, events: [p, f] }); e.extend(I.fn, { _click: D.fn._click, _keydown: D.fn._keydown, _reset: D.fn._reset, _closeForm: D.fn._closeForm, clear: D.fn.clear, _merge: D.fn._merge }), d.plugin(D), d.plugin(I) }(window.kendo.jQuery), function(e, t) { function n(e, t) { return e = e.split(" ")[!t + 0] || e, e.replace("top", "up").replace("bottom", "down") } function i(e, t, n) { e = e.split(" ")[!t + 0] || e; var i = { origin: ["bottom", n ? "right" : "left"], position: ["top", n ? "right" : "left"] }, r = /left|right/.test(e); return r ? (i.origin = ["top", e], i.position[1] = c.directions[e].reverse) : (i.origin[0] = e, i.position[0] = c.directions[e].reverse), i.origin = i.origin.join(" "), i.position = i.position.join(" "), i } function r(t, n) { try { return e.contains(t, n) } catch (i) { return !1 } } function o(t) { t = e(t), t.addClass("k-item").children(x).addClass(P), t.children("a").addClass(T).children(x).addClass(P), t.filter(":not([disabled])").addClass(G), t.filter(".k-separator:empty").append(" "), t.filter("li[disabled]").addClass(Y).removeAttr("disabled").attr("aria-disabled", !0), t.filter("[role]").length || t.attr("role", "menuitem"), t.children("." + T).length || t.contents().filter(function() { return !(this.nodeName.match(y) || 3 == this.nodeType && !e.trim(this.nodeValue)) }).wrapAll("<span class='" + T + "'/>"), a(t), s(t) } function a(t) { t = e(t), t.find("> .k-link > [class*=k-i-arrow]:not(.k-sprite)").remove(), t.filter(":has(.k-menu-group)").children(".k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))").each(function() { var t = e(this), n = t.parent().parent(); t.append("<span class='k-icon " + (n.hasClass(S + "-horizontal") ? "k-i-arrow-s" : "k-i-arrow-e") + "'/>") }) } function s(t) { t = e(t), t.filter(".k-first:not(:first-child)").removeClass(I), t.filter(".k-last:not(:last-child)").removeClass(D), t.filter(":first-child").addClass(I), t.filter(":last-child").addClass(D) } var l, c = window.kendo, d = c.ui, u = c._activeElement, h = c.support.touch && c.support.mobileOS, p = "mousedown", f = "click", g = e.extend, m = e.proxy, v = e.each, _ = c.template, w = c.keys, b = d.Widget, y = /^(ul|a|div)$/i, k = ".kendoMenu", x = "img", C = "open", S = "k-menu", T = "k-link", D = "k-last", A = "close", E = "timer", I = "k-first", P = "k-image", M = "select", z = "zIndex", F = "activate", R = "deactivate", H = "touchstart" + k + " MSPointerDown" + k + " pointerdown" + k, B = c.support.pointers, L = c.support.msPointers, N = L || B, O = B ? "pointerover" : L ? "MSPointerOver" : "mouseenter", V = B ? "pointerout" : L ? "MSPointerOut" : "mouseleave", U = h || N, W = e(document.documentElement), j = "kendoPopup", G = "k-state-default", q = "k-state-hover", $ = "k-state-focused", Y = "k-state-disabled", Q = ".k-menu", K = ".k-menu-group", X = K + ",.k-animation-container", Z = ":not(.k-list) > .k-item", J = ".k-item.k-state-disabled", et = ".k-item:not(.k-state-disabled)", tt = ".k-item:not(.k-state-disabled) > .k-link", nt = ":not(.k-item.k-separator)", it = nt + ":eq(0)", rt = nt + ":last", ot = "> div:not(.k-animation-container,.k-list-container)", at = { 2: 1, touch: 1 }, st = { content: _("<div class='k-content #= groupCssClass() #' tabindex='-1'>#= content(item) #</div>"), group: _("<ul class='#= groupCssClass(group) #'#= groupAttributes(group) # role='menu' aria-hidden='true'>#= renderItems(data) #</ul>"), itemWrapper: _("<#= tag(item) # class='#= textClass(item) #'#= textAttributes(item) #>#= image(item) ##= sprite(item) ##= text(item) ##= arrow(data) #</#= tag(item) #>"), item: _("<li class='#= wrapperCssClass(group, item) #' role='menuitem' #=item.items ? \"aria-haspopup='true'\": \"\"##=item.enabled === false ? \"aria-disabled='true'\" : ''#>#= itemWrapper(data) ## if (item.items) { ##= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) ## } else if (item.content || item.contentUrl) { ##= renderContent(data) ## } #</li>"), image: _("<img class='k-image' alt='' src='#= imageUrl #' />"), arrow: _("<span class='#= arrowClass(item, group) #'></span>"), sprite: _("<span class='k-sprite #= spriteCssClass #'></span>"), empty: _("") }, lt = { wrapperCssClass: function(e, t) { var n = "k-item", i = t.index; return n += t.enabled === !1 ? " k-state-disabled" : " k-state-default", e.firstLevel && 0 === i && (n += " k-first"), i == e.length - 1 && (n += " k-last"), t.cssClass && (n += " " + t.cssClass), n }, textClass: function() { return T }, textAttributes: function(e) { return e.url ? " href='" + e.url + "'" : "" }, arrowClass: function(e, t) { var n = "k-icon"; return n += t.horizontal ? " k-i-arrow-s" : " k-i-arrow-e" }, text: function(e) { return e.encoded === !1 ? e.text : c.htmlEncode(e.text) }, tag: function(e) { return e.url ? "a" : "span" }, groupAttributes: function(e) { return e.expanded !== !0 ? " style='display:none'" : "" }, groupCssClass: function() { return "k-group k-menu-group" }, content: function(e) { return e.content ? e.content : " " } }, ct = b.extend({ init: function(t, n) { var i = this; b.fn.init.call(i, t, n), t = i.wrapper = i.element, n = i.options, i._initData(n), i._updateClasses(), i._animations(n), i.nextItemZIndex = 100, i._tabindex(), i._focusProxy = m(i._focusHandler, i), t.on(H, et, i._focusProxy).on(f + k, J, !1).on(f + k, et, m(i._click, i)).on("keydown" + k, m(i._keydown, i)).on("focus" + k, m(i._focus, i)).on("focus" + k, ".k-content", m(i._focus, i)).on(H + " " + p + k, ".k-content", m(i._preventClose, i)).on("blur" + k, m(i._removeHoverItem, i)).on("blur" + k, "[tabindex]", m(i._checkActiveElement, i)).on(O + k, et, m(i._mouseenter, i)).on(V + k, et, m(i._mouseleave, i)).on(O + k + " " + V + k + " " + p + k + " " + f + k, tt, m(i._toggleHover, i)), n.openOnClick && (i.clicked = !1, i._documentClickHandler = m(i._documentClick, i), e(document).click(i._documentClickHandler)), t.attr("role", "menubar"), t[0].id && (i._ariaId = c.format("{0}_mn_active", t[0].id)), c.notify(i) }, events: [C, A, F, R, M], options: { name: "Menu", animation: { open: { duration: 200 }, close: { duration: 100 } }, orientation: "horizontal", direction: "default", openOnClick: !1, closeOnClick: !0, hoverDelay: 100, popupCollision: t }, _initData: function(e) { var t = this; e.dataSource && (t.angular("cleanup", function() { return { elements: t.element.children() } }), t.element.empty(), t.append(e.dataSource, t.element), t.angular("compile", function() { return { elements: t.element.children() } })) }, setOptions: function(e) { var t = this.options.animation; this._animations(e), e.animation = g(!0, t, e.animation), "dataSource" in e && this._initData(e), this._updateClasses(), b.fn.setOptions.call(this, e) }, destroy: function() { var t = this; b.fn.destroy.call(t), t.element.off(k), t._documentClickHandler && e(document).unbind("click", t._documentClickHandler), c.destroy(t.element) }, enable: function(e, t) { return this._toggleDisabled(e, t !== !1), this }, disable: function(e) { return this._toggleDisabled(e, !1), this }, append: function(e, t) { t = this.element.find(t); var n = this._insert(e, t, t.length ? t.find("> .k-menu-group, > .k-animation-container > .k-menu-group") : null); return v(n.items, function() { n.group.append(this), a(this) }), a(t), s(n.group.find(".k-first, .k-last").add(n.items)), this }, insertBefore: function(e, t) { t = this.element.find(t); var n = this._insert(e, t, t.parent()); return v(n.items, function() { t.before(this), a(this), s(this) }), s(t), this }, insertAfter: function(e, t) { t = this.element.find(t); var n = this._insert(e, t, t.parent()); return v(n.items, function() { t.after(this), a(this), s(this) }), s(t), this }, _insert: function(t, n, i) { var r, a, s, l, c = this; return n && n.length || (i = c.element), s = e.isPlainObject(t), l = { firstLevel: i.hasClass(S), horizontal: i.hasClass(S + "-horizontal"), expanded: !0, length: i.children().length }, n && !i.length && (i = e(ct.renderGroup({ group: l })).appendTo(n)), s || e.isArray(t) ? r = e(e.map(s ? [t] : t, function(t, n) { return "string" == typeof t ? e(t).get() : e(ct.renderItem({ group: l, item: g(t, { index: n }) })).get() })) : (r = "string" == typeof t && "<" != t.charAt(0) ? c.element.find(t) : e(t), a = r.find("> ul").addClass("k-menu-group").attr("role", "menu"), r = r.filter("li"), r.add(a.find("> li")).each(function() { o(this) })), { items: r, group: i } }, remove: function(e) { var t, n, i, r; return e = this.element.find(e), t = this, n = e.parentsUntil(t.element, Z), i = e.parent("ul:not(.k-menu)"), e.remove(), i && !i.children(Z).length && (r = i.parent(".k-animation-container"), r.length ? r.remove() : i.remove()), n.length && (n = n.eq(0), a(n), s(n)), t }, open: function(r) { var o = this, a = o.options, s = "horizontal" == a.orientation, l = a.direction, d = c.support.isRtl(o.wrapper); return r = o.element.find(r), /^(top|bottom|default)$/.test(l) && (l = d ? s ? (l + " left").replace("default", "bottom") : "left" : s ? (l + " right").replace("default", "bottom") : "right"), r.siblings().find(">.k-popup:visible,>.k-animation-container>.k-popup:visible").each(function() { var t = e(this).data("kendoPopup"); t && t.close() }), r.each(function() { var r = e(this); clearTimeout(r.data(E)), r.data(E, setTimeout(function() { var u, p, f, m, v, _, w, b, y = r.find(".k-menu-group:first:hidden"); y[0] && o._triggerEvent({ item: r[0], type: C }) === !1 && (!y.find(".k-menu-group")[0] && y.children(".k-item").length > 1 ? (p = e(window).height(), f = function() { y.css({ maxHeight: p - (y.outerHeight() - y.height()) - c.getShadows(y).bottom, overflow: "auto" }) }, c.support.browser.msie && 7 >= c.support.browser.version ? setTimeout(f, 0) : f()) : y.css({ maxHeight: "", overflow: "" }), r.data(z, r.css(z)), r.css(z, o.nextItemZIndex++), u = y.data(j), m = r.parent().hasClass(S), v = m && s, _ = i(l, m, d), w = a.animation.open.effects, b = w !== t ? w : "slideIn:" + n(l, m), u ? (u = y.data(j), u.options.origin = _.origin, u.options.position = _.position, u.options.animation.open.effects = b) : u = y.kendoPopup({ activate: function() { o._triggerEvent({ item: this.wrapper.parent(), type: F }) }, deactivate: function(e) { e.sender.element.removeData("targetTransform").css({ opacity: "" }), o._triggerEvent({ item: this.wrapper.parent(), type: R }) }, origin: _.origin, position: _.position, collision: a.popupCollision !== t ? a.popupCollision : v ? "fit" : "fit flip", anchor: r, appendTo: r, animation: { open: g(!0, { effects: b }, a.animation.open), close: a.animation.close }, close: function(e) { var t = e.sender.wrapper.parent(); o._triggerEvent({ item: t[0], type: A }) ? e.preventDefault() : (t.css(z, t.data(z)), t.removeData(z), h && (t.removeClass(q), o._removeHoverItem())) } }).data(j), y.removeAttr("aria-hidden"), u.open()) }, o.options.hoverDelay)) }), o }, close: function(t, n) { var i = this, r = i.element; return t = r.find(t), t.length || (t = r.find(">.k-item")), t.each(function() { var t = e(this); !n && i._isRootItem(t) && (i.clicked = !1), clearTimeout(t.data(E)), t.data(E, setTimeout(function() { var e = t.find(".k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible").data(j); e && (e.close(), e.element.attr("aria-hidden", !0)) }, i.options.hoverDelay)) }), i }, _toggleDisabled: function(t, n) { this.element.find(t).each(function() { e(this).toggleClass(G, n).toggleClass(Y, !n).attr("aria-disabled", !n) }) }, _toggleHover: function(t) { var n = e(c.eventTarget(t) || t.target).closest(Z), i = t.type == O || -1 !== p.indexOf(t.type); n.parents("li." + Y).length || n.toggleClass(q, i || "mousedown" == t.type || "click" == t.type), this._removeHoverItem() }, _preventClose: function() { this.options.closeOnClick || (this._closurePrevented = !0) }, _checkActiveElement: function(t) { var n = this, i = e(t ? t.currentTarget : this._hoverItem()), o = n._findRootParent(i)[0]; this._closurePrevented || setTimeout(function() { (!document.hasFocus() || !r(o, c._activeElement()) && t && !r(o, t.currentTarget)) && n.close(o) }, 0), this._closurePrevented = !1 }, _removeHoverItem: function() { var e = this._hoverItem(); e && e.hasClass($) && (e.removeClass($), this._oldHoverItem = null) }, _updateClasses: function() { var e, t = this.element, n = ".k-menu-init div ul"; t.removeClass("k-menu-horizontal k-menu-vertical"), t.addClass("k-widget k-reset k-header k-menu-init " + S).addClass(S + "-" + this.options.orientation), t.find("li > ul").filter(function() { return !c.support.matchesSelector.call(this, n) }).addClass("k-group k-menu-group").attr("role", "menu").attr("aria-hidden", t.is(":visible")).end().find("li > div").addClass("k-content").attr("tabindex", "-1"), e = t.find("> li,.k-menu-group > li"), t.removeClass("k-menu-init"), e.each(function() { o(this) }) }, _mouseenter: function(t) { var n = this, i = e(t.currentTarget), o = i.children(".k-animation-container").length || i.children(K).length; t.delegateTarget == i.parents(Q)[0] && (n.options.openOnClick && !n.clicked || h || (B || L) && t.originalEvent.pointerType in at && n._isRootItem(i.closest(Z)) || !r(t.currentTarget, t.relatedTarget) && o && n.open(i), (n.options.openOnClick && n.clicked || U) && i.siblings().each(m(function(e, t) { n.close(t, !0) }, n))) }, _mouseleave: function(n) { var i = this, o = e(n.currentTarget), a = o.children(".k-animation-container").length || o.children(K).length; return o.parentsUntil(".k-animation-container", ".k-list-container,.k-calendar-container")[0] ? (n.stopImmediatePropagation(), t) : (i.options.openOnClick || h || (B || L) && n.originalEvent.pointerType in at || r(n.currentTarget, n.relatedTarget || n.target) || !a || r(n.currentTarget, c._activeElement()) || i.close(o), t) }, _click: function(n) { var i, r, o, a = this, s = a.options, l = e(c.eventTarget(n)), d = l[0] ? l[0].nodeName.toUpperCase() : "", u = "INPUT" == d || "SELECT" == d || "BUTTON" == d || "LABEL" == d, h = l.closest("." + T), p = l.closest(Z), f = h.attr("href"), g = l.attr("href"), m = e("<a href='#' />").attr("href"), v = !!f && f !== m, _ = v && !!f.match(/^#/), w = !!g && g !== m, b = s.openOnClick && o && a._isRootItem(p); if (!l.closest(ot, p[0]).length) { if (p.hasClass(Y)) return n.preventDefault(), t; if (n.handled || !a._triggerEvent({ item: p[0], type: M }) || u || n.preventDefault(), n.handled = !0, r = p.children(X), o = r.is(":visible"), s.closeOnClick && (!v || _) && (!r.length || b)) return p.removeClass(q).css("height"), a._oldHoverItem = a._findRootParent(p), a.close(h.parentsUntil(a.element, Z)), a.clicked = !1, -1 != "MSPointerUp".indexOf(n.type) && n.preventDefault(), t; v && n.enterKey && h[0].click(), (a._isRootItem(p) && s.openOnClick || c.support.touch || (B || L) && a._isRootItem(p.closest(Z))) && (v || u || w || n.preventDefault(), a.clicked = !0, i = r.is(":visible") ? A : C, (s.closeOnClick || i != A) && a[i](p)) } }, _documentClick: function(e) { r(this.element[0], e.target) || (this.clicked = !1) }, _focus: function(n) { var i = this, r = n.target, o = i._hoverItem(), a = u(); return r == i.wrapper[0] || e(r).is(":kendoFocusable") ? (a === n.currentTarget && (o.length ? i._moveHover([], o) : i._oldHoverItem || i._moveHover([], i.wrapper.children().first())), t) : (n.stopPropagation(), e(r).closest(".k-content").closest(".k-menu-group").closest(".k-item").addClass($), i.wrapper.focus(), t) }, _keydown: function(e) { var n, i, r, o = this, a = e.keyCode, s = o._oldHoverItem, l = c.support.isRtl(o.wrapper); if (e.target == e.currentTarget || a == w.ESC) { if (s || (s = o._oldHoverItem = o._hoverItem()), i = o._itemBelongsToVertival(s), r = o._itemHasChildren(s), a == w.RIGHT) n = o[l ? "_itemLeft" : "_itemRight"](s, i, r); else if (a == w.LEFT) n = o[l ? "_itemRight" : "_itemLeft"](s, i, r); else if (a == w.DOWN) n = o._itemDown(s, i, r); else if (a == w.UP) n = o._itemUp(s, i, r); else if (a == w.ESC) n = o._itemEsc(s, i); else if (a == w.ENTER || a == w.SPACEBAR) n = s.children(".k-link"), n.length > 0 && (o._click({ target: n[0], preventDefault: function() {}, enterKey: !0 }), o._moveHover(s, o._findRootParent(s))); else if (a == w.TAB) return n = o._findRootParent(s), o._moveHover(s, n), o._checkActiveElement(), t; n && n[0] && (e.preventDefault(), e.stopPropagation()) } }, _hoverItem: function() { return this.wrapper.find(".k-item.k-state-hover,.k-item.k-state-focused").filter(":visible") }, _itemBelongsToVertival: function(e) { var t = this.wrapper.hasClass("k-menu-vertical"); return e.length ? e.parent().hasClass("k-menu-group") || t : t }, _itemHasChildren: function(e) { return e.length ? e.children("ul.k-menu-group, div.k-animation-container").length > 0 : !1 }, _moveHover: function(t, n) { var i = this, r = i._ariaId; t.length && n.length && t.removeClass($), n.length && (n[0].id && (r = n[0].id), n.addClass($), i._oldHoverItem = n, r && (i.element.removeAttr("aria-activedescendant"), e("#" + r).removeAttr("id"), n.attr("id", r), i.element.attr("aria-activedescendant", r))) }, _findRootParent: function(e) { return this._isRootItem(e) ? e : e.parentsUntil(Q, "li.k-item").last() }, _isRootItem: function(e) { return e.parent().hasClass(S) }, _itemRight: function(e, t, n) { var i, r, o = this; if (!e.hasClass(Y)) return t ? n ? (o.open(e), i = e.find(".k-menu-group").children().first()) : "horizontal" == o.options.orientation && (r = o._findRootParent(e), o.close(r), i = r.nextAll(it)) : (i = e.nextAll(it), i.length || (i = e.prevAll(rt))), i && !i.length ? i = o.wrapper.children(".k-item").first() : i || (i = []), o._moveHover(e, i), i }, _itemLeft: function(e, t) { var n, i = this; return t ? (n = e.parent().closest(".k-item"), i.close(n), i._isRootItem(n) && "horizontal" == i.options.orientation && (n = n.prevAll(it))) : (n = e.prevAll(it), n.length || (n = e.nextAll(rt))), n.length || (n = i.wrapper.children(".k-item").last()), i._moveHover(e, n), n }, _itemDown: function(e, t, n) { var i, r = this; if (t) i = e.nextAll(it); else { if (!n || e.hasClass(Y)) return; r.open(e), i = e.find(".k-menu-group").children().first() } return !i.length && e.length ? i = e.parent().children().first() : e.length || (i = r.wrapper.children(".k-item").first()), r._moveHover(e, i), i }, _itemUp: function(e, t) { var n, i = this; if (t) return n = e.prevAll(it), !n.length && e.length ? n = e.parent().children().last() : e.length || (n = i.wrapper.children(".k-item").last()), i._moveHover(e, n), n }, _itemEsc: function(e, t) { var n, i = this; return t ? (n = e.parent().closest(".k-item"), i.close(n), i._moveHover(e, n), n) : e }, _triggerEvent: function(e) { var t = this; return t.trigger(e.type, { type: e.type, item: e.item }) }, _focusHandler: function(t) { var n = this, i = e(c.eventTarget(t)).closest(Z); setTimeout(function() { n._moveHover([], i), i.children(".k-content")[0] && i.parent().closest(".k-item").removeClass($) }, 200) }, _animations: function(e) { e && "animation" in e && !e.animation && (e.animation = { open: { effects: {} }, close: { hide: !0, effects: {} } }) } }); g(ct, { renderItem: function(e) { e = g({ menu: {}, group: {} }, e); var t = st.empty, n = e.item; return st.item(g(e, { image: n.imageUrl ? st.image : t, sprite: n.spriteCssClass ? st.sprite : t, itemWrapper: st.itemWrapper, renderContent: ct.renderContent, arrow: n.items || n.content ? st.arrow : t, subGroup: ct.renderGroup }, lt)) }, renderGroup: function(e) { return st.group(g({ renderItems: function(e) { for (var t = "", n = 0, i = e.items, r = i ? i.length : 0, o = g({ length: r }, e.group); r > n; n++) t += ct.renderItem(g(e, { group: o, item: g({ index: n }, i[n]) })); return t } }, e, lt)) }, renderContent: function(e) { return st.content(g(e, lt)) } }), l = ct.extend({ init: function(t, n) { var i = this; ct.fn.init.call(i, t, n), i.target = e(i.options.target), i._popup(), i._wire() }, options: { name: "ContextMenu", filter: null, showOn: "contextmenu", orientation: "vertical", alignToAnchor: !1, target: "body" }, events: [C, A, F, R, M], setOptions: function(t) { var n = this; ct.fn.setOptions.call(n, t), n.target.off(n.showOn + k, n._showProxy), n.userEvents && n.userEvents.destroy(), n.target = e(n.options.target), t.orientation && n.popup.wrapper[0] && n.popup.element.unwrap(), n._wire(), ct.fn.setOptions.call(this, t) }, destroy: function() { var e = this; e.target.off(e.options.showOn + k), W.off(c.support.mousedown + k, e._closeProxy), e.userEvents && e.userEvents.destroy(), ct.fn.destroy.call(e) }, open: function(n, i) { var o = this; return n = e(n)[0], r(o.element[0], e(n)[0]) ? ct.fn.open.call(o, n) : o._triggerEvent({ item: o.element, type: C }) === !1 && (o.popup.visible() && o.options.filter && o.popup.close(!0), i !== t ? (o.popup.wrapper.hide(), o.popup.open(n, i)) : (o.popup.options.anchor = (n ? n : o.popup.anchor) || o.target, o.popup.open()), W.off(o.popup.downEvent, o.popup._mousedownProxy), W.on(c.support.mousedown + k, o._closeProxy)), o }, close: function() { var t = this; r(t.element[0], e(arguments[0])[0]) ? ct.fn.close.call(t, arguments[0]) : t.popup.visible() && t._triggerEvent({ item: t.element, type: A }) === !1 && (t.popup.close(), W.off(c.support.mousedown + k, t._closeProxy), t.unbind(M, t._closeTimeoutProxy)) }, _showHandler: function(e) { var t, n = e, i = this, o = i.options; e.event && (n = e.event, n.pageX = e.x.location, n.pageY = e.y.location), r(i.element[0], e.relatedTarget || e.target) || (i._eventOrigin = n, n.preventDefault(), n.stopImmediatePropagation(), i.element.find("." + $).removeClass($), (o.filter && c.support.matchesSelector.call(n.currentTarget, o.filter) || !o.filter) && (o.alignToAnchor ? i.open(n.currentTarget) : (i.popup.options.anchor = n.currentTarget, i._targetChild ? (t = i.target.offset(), i.open(n.pageX - t.left, n.pageY - t.top)) : i.open(n.pageX, n.pageY)))) }, _closeHandler: function(t) { var n, i = this, o = e(t.relatedTarget || t.target), a = o.closest(i.target.selector)[0] == i.target[0], s = o.closest(et).children(X), l = r(i.element[0], o[0]); i._eventOrigin = t, n = 3 !== t.which, i.popup.visible() && (n && a || !a) && (i.options.closeOnClick && !s[0] && l || !l) && (l ? (this.unbind(M, this._closeTimeoutProxy), i.bind(M, i._closeTimeoutProxy)) : i.close()) }, _wire: function() { var e = this, t = e.options, n = e.target; e._showProxy = m(e._showHandler, e), e._closeProxy = m(e._closeHandler, e), e._closeTimeoutProxy = m(e.close, e), n[0] && (c.support.mobileOS && "contextmenu" == t.showOn ? (e.userEvents = new c.UserEvents(n, { filter: t.filter, allowSelection: !1 }), n.on(t.showOn + k, !1), e.userEvents.bind("hold", e._showProxy)) : t.filter ? n.on(t.showOn + k, t.filter, e._showProxy) : n.on(t.showOn + k, e._showProxy)) }, _triggerEvent: function(n) { var i = this, r = e(i.popup.options.anchor)[0], o = i._eventOrigin; return i._eventOrigin = t, i.trigger(n.type, g({ type: n.type, item: n.item || this.element[0], target: r }, o ? { event: o } : {})) }, _popup: function() { var e = this; e._triggerProxy = m(e._triggerEvent, e), e.popup = e.element.addClass("k-context-menu").kendoPopup({ anchor: e.target || "body", copyAnchorStyles: e.options.copyAnchorStyles, collision: e.options.popupCollision || "fit", animation: e.options.animation, activate: e._triggerProxy, deactivate: e._triggerProxy }).data("kendoPopup"), e._targetChild = r(e.target[0], e.popup.element[0]) } }), d.plugin(ct), d.plugin(l) }(window.kendo.jQuery), function(e, t) { function n(t) { return e.trim(t).replace(/ /gi, "") } function i(e, t) { var n, i, r, o = {}; for (n = 0, i = e.length; i > n; n++) r = e[n], o[r[t]] = r; return o } function r(e) { var t, n = []; for (t = 0; e.length > t; t++) e[t].columns ? n = n.concat(r(e[t].columns)) : n.push(e[t]); return n } var o = window.kendo, a = o.ui, s = e.proxy, l = e.extend, c = e.grep, d = e.map, u = e.inArray, h = "k-state-selected", p = "asc", f = "desc", g = "change", m = "init", v = "select", _ = "kendoPopup", w = "kendoFilterMenu", b = "kendoMenu", y = ".kendoColumnMenu", k = a.Widget, x = k.extend({ init: function(t, n) { var i, r = this; k.fn.init.call(r, t, n), t = r.element, n = r.options, r.owner = n.owner, r.dataSource = n.dataSource, r.field = t.attr(o.attr("field")), r.title = t.attr(o.attr("title")), i = t.find(".k-header-column-menu"), i[0] || (i = t.addClass("k-with-icon").prepend('<a class="k-header-column-menu" href="#"><span class="k-icon k-i-arrowhead-s"/></a>').find(".k-header-column-menu")), r.link = i.attr("tabindex", -1).on("click" + y, s(r._click, r)), r.wrapper = e('<div class="k-column-menu"/>') }, _init: function() { var e = this; e.pane = e.options.pane, e.pane && (e._isMobile = !0), e._isMobile ? e._createMobileMenu() : e._createMenu(), e._angularItems("compile"), e._refreshHandler = s(e.refresh, e), e.dataSource.bind(g, e._refreshHandler), e._sort(), e._columns(), e._filter(), e._lockColumns(), e.trigger(m, { field: e.field, container: e.wrapper }) }, events: [m], options: { name: "ColumnMenu", messages: { sortAscending: "Sort Ascending", sortDescending: "Sort Descending", filter: "Filter", columns: "Columns", done: "Done", settings: "Column Settings", lock: "Lock", unlock: "Unlock" }, filter: "", columns: !0, sortable: !0, filterable: !0, animations: { left: "slide" } }, _createMenu: function() { var e = this, t = e.options; e.wrapper.html(o.template(C)({ ns: o.ns, messages: t.messages, sortable: t.sortable, filterable: t.filterable, columns: e._ownerColumns(), showColumns: t.columns, lockedColumns: t.lockedColumns })), e.popup = e.wrapper[_]({ anchor: e.link, open: s(e._open, e), activate: s(e._activate, e), close: function() { e.options.closeCallback && e.options.closeCallback(e.element) } }).data(_), e.menu = e.wrapper.children()[b]({ orientation: "vertical", closeOnClick: !1 }).data(b) }, _createMobileMenu: function() { var e = this, t = e.options, n = o.template(S)({ ns: o.ns, field: e.field, title: e.title || e.field, messages: t.messages, sortable: t.sortable, filterable: t.filterable, columns: e._ownerColumns(), showColumns: t.columns, lockedColumns: t.lockedColumns }); e.view = e.pane.append(n), e.wrapper = e.view.element.find(".k-column-menu"), e.menu = new T(e.wrapper.children(), { pane: e.pane }), e.view.element.on("click", ".k-done", function(t) { e.close(), t.preventDefault() }), e.options.lockedColumns && e.view.bind("show", function() { e._updateLockedColumns() }) }, _angularItems: function(t) { var n = this; n.angular(t, function() { var t = n.wrapper.find(".k-columns-item input[" + o.attr("field") + "]").map(function() { return e(this).closest("li") }), i = d(n._ownerColumns(), function(e) { return { column: e._originalObject } }); return { elements: t, data: i } }) }, destroy: function() { var e = this; e._angularItems("cleanup"), k.fn.destroy.call(e), e.filterMenu && e.filterMenu.destroy(), e._refreshHandler && e.dataSource.unbind(g, e._refreshHandler), e.options.columns && e.owner && (e._updateColumnsMenuHandler && (e.owner.unbind("columnShow", e._updateColumnsMenuHandler), e.owner.unbind("columnHide", e._updateColumnsMenuHandler)), e._updateColumnsLockedStateHandler && (e.owner.unbind("columnLock", e._updateColumnsLockedStateHandler), e.owner.unbind("columnUnlock", e._updateColumnsLockedStateHandler))), e.menu && (e.menu.element.off(y), e.menu.destroy()), e.wrapper.off(y), e.popup && e.popup.destroy(), e.view && e.view.purge(), e.link.off(y), e.owner = null, e.wrapper = null, e.element = null }, close: function() { this.menu.close(), this.popup && (this.popup.close(), this.popup.element.off("keydown" + y)) }, _click: function(e) { e.preventDefault(), e.stopPropagation(); var t = this.options; t.filter && this.element.is(!t.filter) || (this.popup || this.pane || this._init(), this._isMobile ? this.pane.navigate(this.view, this.options.animations.left) : this.popup.toggle()) }, _open: function() { var t = this; e(".k-column-menu").not(t.wrapper).each(function() { e(this).data(_).close() }), t.popup.element.on("keydown" + y, function(e) { e.keyCode == o.keys.ESC && t.close() }), t.options.lockedColumns && t._updateLockedColumns() }, _activate: function() { this.menu.element.focus() }, _ownerColumns: function() { var e = r(this.owner.columns), t = c(e, function(e) { var t = !0, i = n(e.title || ""); return (e.menu === !1 || !e.field && !i.length) && (t = !1), t }); return d(t, function(t) { return { originalField: t.field, field: t.field || t.title, title: t.title || t.field, hidden: t.hidden, index: u(t, e), locked: !!t.locked, _originalObject: t } }) }, _sort: function() { var t = this; t.options.sortable && (t.refresh(), t.menu.bind(v, function(n) { var i, r = e(n.item); r.hasClass("k-sort-asc") ? i = p : r.hasClass("k-sort-desc") && (i = f), i && (r.parent().find(".k-sort-" + (i == p ? f : p)).removeClass(h), t._sortDataSource(r, i), t.close()) })) }, _sortDataSource: function(e, n) { var i, r, o = this, a = o.options.sortable, s = null === a.compare ? t : a.compare, l = o.dataSource, c = l.sort() || []; if (e.hasClass(h) && a && a.allowUnsort !== !1 ? (e.removeClass(h), n = t) : e.addClass(h), "multiple" === a.mode) { for (i = 0, r = c.length; r > i; i++) if (c[i].field === o.field) { c.splice(i, 1); break } c.push({ field: o.field, dir: n, compare: s }) } else c = [{ field: o.field, dir: n, compare: s }]; l.sort(c) }, _columns: function() { var t = this; t.options.columns && (t._updateColumnsMenu(), t._updateColumnsMenuHandler = s(t._updateColumnsMenu, t), t.owner.bind(["columnHide", "columnShow"], t._updateColumnsMenuHandler), t._updateColumnsLockedStateHandler = s(t._updateColumnsLockedState, t), t.owner.bind(["columnUnlock", "columnLock"], t._updateColumnsLockedStateHandler), t.menu.bind(v, function(n) { var i, a, s, l = e(n.item), d = r(t.owner.columns); t._isMobile && n.preventDefault(), l.parent().closest("li.k-columns-item")[0] && (i = l.find(":checkbox"), i.attr("disabled") || (s = i.attr(o.attr("field")), a = c(d, function(e) { return e.field == s || e.title == s })[0], a.hidden === !0 ? t.owner.showColumn(a) : t.owner.hideColumn(a))) })) }, _updateColumnsMenu: function() { var e, t, n, i, r, a, s = o.attr("field"), l = o.attr("locked"), h = c(this._ownerColumns(), function(e) { return !e.hidden }), p = c(h, function(e) { return e.originalField }), f = c(p, function(e) { return e.locked === !0 }).length, g = c(p, function(e) { return e.locked !== !0 }).length; for (h = d(h, function(e) { return e.field }), a = this.wrapper.find(".k-columns-item input[" + s + "]").prop("disabled", !1).prop("checked", !1), e = 0, t = a.length; t > e; e++) n = a.eq(e), r = "true" === n.attr(l), i = !1, u(n.attr(s), h) > -1 && (i = !0, n.prop("checked", i)), i && (1 == f && r && n.prop("disabled", !0), 1 != g || r || n.prop("disabled", !0)) }, _updateColumnsLockedState: function() { var e, t, n, r, a = o.attr("field"), s = o.attr("locked"), l = i(this._ownerColumns(), "field"), c = this.wrapper.find(".k-columns-item input[type=checkbox]"); for (e = 0, t = c.length; t > e; e++) n = c.eq(e), r = l[n.attr(a)], r && n.attr(s, r.locked); this._updateColumnsMenu() }, _filter: function() { var t = this, n = w, i = t.options; i.filterable !== !1 && (i.filterable.multi && (n = "kendoFilterMultiCheck", i.filterable.dataSource && (i.filterable.checkSource = i.filterable.dataSource, delete i.filterable.dataSource)), t.filterMenu = t.wrapper.find(".k-filterable")[n](l(!0, {}, { appendToElement: !0, dataSource: i.dataSource, values: i.values, field: t.field, title: t.title }, i.filterable)).data(n), t._isMobile && t.menu.bind(v, function(n) { var i = e(n.item); i.hasClass("k-filter-item") && t.pane.navigate(t.filterMenu.view, t.options.animations.left) })) }, _lockColumns: function() { var t = this; t.menu.bind(v, function(n) { var i = e(n.item); i.hasClass("k-lock") ? (t.owner.lockColumn(t.field), t.close()) : i.hasClass("k-unlock") && (t.owner.unlockColumn(t.field), t.close()) }) }, _updateLockedColumns: function() { var e, t, n, i, r = this.field, o = this.owner.columns, a = c(o, function(e) { return e.field == r || e.title == r })[0]; a && (e = a.locked === !0, t = c(o, function(t) { return !t.hidden && (t.locked && e || !t.locked && !e) }).length, n = this.wrapper.find(".k-lock").removeClass("k-state-disabled"), i = this.wrapper.find(".k-unlock").removeClass("k-state-disabled"), (e || 1 == t) && n.addClass("k-state-disabled"), e && 1 != t || i.addClass("k-state-disabled"), this._updateColumnsLockedState()) }, refresh: function() { var e, t, n, i = this, r = i.options.dataSource.sort() || [], o = i.field; for (i.wrapper.find(".k-sort-asc, .k-sort-desc").removeClass(h), t = 0, n = r.length; n > t; t++) e = r[t], o == e.field && i.wrapper.find(".k-sort-" + e.dir).addClass(h); i.link[i._filterExist(i.dataSource.filter()) ? "addClass" : "removeClass"]("k-state-active") }, _filterExist: function(e) { var t, n, i, r = !1; if (e) { for (e = e.filters, n = 0, i = e.length; i > n; n++) t = e[n], t.field == this.field ? r = !0 : t.filters && (r = r || this._filterExist(t)); return r } } }), C = '<ul>#if(sortable){#<li class="k-item k-sort-asc"><span class="k-link"><span class="k-sprite k-i-sort-asc"></span>${messages.sortAscending}</span></li><li class="k-item k-sort-desc"><span class="k-link"><span class="k-sprite k-i-sort-desc"></span>${messages.sortDescending}</span></li>#if(showColumns || filterable){#<li class="k-separator"></li>#}##}##if(showColumns){#<li class="k-item k-columns-item"><span class="k-link"><span class="k-sprite k-i-columns"></span>${messages.columns}</span><ul>#for (var idx = 0; idx < columns.length; idx++) {#<li><input type="checkbox" data-#=ns#field="#=columns[idx].field.replace(/"/g,"&\\#34;")#" data-#=ns#index="#=columns[idx].index#" data-#=ns#locked="#=columns[idx].locked#"/>#=columns[idx].title#</li>#}#</ul></li>#if(filterable || lockedColumns){#<li class="k-separator"></li>#}##}##if(filterable){#<li class="k-item k-filter-item"><span class="k-link"><span class="k-sprite k-filter"></span>${messages.filter}</span><ul><li><div class="k-filterable"></div></li></ul></li>#if(lockedColumns){#<li class="k-separator"></li>#}##}##if(lockedColumns){#<li class="k-item k-lock"><span class="k-link"><span class="k-sprite k-i-lock"></span>${messages.lock}</span></li><li class="k-item k-unlock"><span class="k-link"><span class="k-sprite k-i-unlock"></span>${messages.unlock}</span></li>#}#</ul>', S = '<div data-#=ns#role="view" data-#=ns#init-widgets="false" class="k-grid-column-menu"><div data-#=ns#role="header" class="k-header">${messages.settings}<button class="k-button k-done">#=messages.done#</button></div><div class="k-column-menu k-mobile-list"><ul><li><span class="k-link">${title}</span><ul>#if(sortable){#<li class="k-item k-sort-asc"><span class="k-link"><span class="k-sprite k-i-sort-asc"></span>${messages.sortAscending}</span></li><li class="k-item k-sort-desc"><span class="k-link"><span class="k-sprite k-i-sort-desc"></span>${messages.sortDescending}</span></li>#}##if(lockedColumns){#<li class="k-item k-lock"><span class="k-link"><span class="k-sprite k-i-lock"></span>${messages.lock}</span></li><li class="k-item k-unlock"><span class="k-link"><span class="k-sprite k-i-unlock"></span>${messages.unlock}</span></li>#}##if(filterable){#<li class="k-item k-filter-item"><span class="k-link k-filterable"><span class="k-sprite k-filter"></span>${messages.filter}</span></li>#}#</ul></li>#if(showColumns){#<li class="k-columns-item"><span class="k-link">${messages.columns}</span><ul>#for (var idx = 0; idx < columns.length; idx++) {#<li class="k-item"><label class="k-label"><input type="checkbox" class="k-check" data-#=ns#field="#=columns[idx].field.replace(/"/g,"&\\#34;")#" data-#=ns#index="#=columns[idx].index#" data-#=ns#locked="#=columns[idx].locked#"/>#=columns[idx].title#</label></li>#}#</ul></li>#}#</ul></div></div>', T = k.extend({ init: function(e, t) { k.fn.init.call(this, e, t), this.element.on("click" + y, "li.k-item:not(.k-separator):not(.k-state-disabled)", "_click") }, events: [v], _click: function(t) { e(t.target).is("[type=checkbox]") || t.preventDefault(), this.trigger(v, { item: t.currentTarget }) }, close: function() { this.options.pane.navigate("") }, destroy: function() { k.fn.destroy.call(this), this.element.off(y) } }); a.plugin(x) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui, r = i.Widget, o = "dir", a = "asc", s = "single", l = "field", c = "desc", d = ".kendoColumnSorter", u = ".k-link", h = "aria-sort", p = e.proxy, f = r.extend({ init: function(e, t) { var n, i = this; r.fn.init.call(i, e, t), i._refreshHandler = p(i.refresh, i), i.dataSource = i.options.dataSource.bind("change", i._refreshHandler), n = i.element.find(u), n[0] || (n = i.element.wrapInner('<a class="k-link" href="#"/>').find(u)), i.link = n, i.element.on("click" + d, p(i._click, i)) }, options: { name: "ColumnSorter", mode: s, allowUnsort: !0, compare: null, filter: "" }, destroy: function() { var e = this; r.fn.destroy.call(e), e.element.off(d), e.dataSource.unbind("change", e._refreshHandler), e._refreshHandler = e.element = e.link = e.dataSource = null }, refresh: function() { var t, i, r, s, d = this, u = d.dataSource.sort() || [], p = d.element, f = p.attr(n.attr(l)); for (p.removeAttr(n.attr(o)), p.removeAttr(h), t = 0, i = u.length; i > t; t++) r = u[t], f == r.field && p.attr(n.attr(o), r.dir); s = p.attr(n.attr(o)), p.find(".k-i-arrow-n,.k-i-arrow-s").remove(), s === a ? (e('<span class="k-icon k-i-arrow-n" />').appendTo(d.link), p.attr(h, "ascending")) : s === c && (e('<span class="k-icon k-i-arrow-s" />').appendTo(d.link), p.attr(h, "descending")) }, _click: function(e) { var i, r, d = this, u = d.element, h = u.attr(n.attr(l)), p = u.attr(n.attr(o)), f = d.options, g = null === d.options.compare ? t : d.options.compare, m = d.dataSource.sort() || []; if (e.preventDefault(), !f.filter || u.is(f.filter)) { if (p = p === a ? c : p === c && f.allowUnsort ? t : a, f.mode === s) m = [{ field: h, dir: p, compare: g }]; else if ("multiple" === f.mode) { for (i = 0, r = m.length; r > i; i++) if (m[i].field === h) { m.splice(i, 1); break } m.push({ field: h, dir: p, compare: g }) } this.dataSource.sort(m) } } }); i.plugin(f) }(window.kendo.jQuery), function(e, t) { function n(t) { return t = null != t ? t : "", t.type || e.type(t) || "string" } function i(t) { t.find(":input:not(:button, [" + s.attr("role") + "=upload], [" + s.attr("skip") + "], [type=file]), select").each(function() { var t = s.attr("bind"), n = this.getAttribute(t) || "", i = "checkbox" === this.type || "radio" === this.type ? "checked:" : "value:", r = this.name; - 1 === n.indexOf(i) && r && (n += (n.length ? "," : "") + i + r, e(this).attr(t, n)) }) } function r(e) { var t, i, r = (e.model.fields || e.model)[e.field], o = n(r), a = r ? r.validation : {}, l = s.attr("type"), c = s.attr("bind"), d = { name: e.field }; for (t in a) i = a[t], f(t, _) >= 0 ? d[l] = t : h(i) || (d[t] = p(i) ? i.value || t : i), d[s.attr(t + "-msg")] = i.message; return f(o, _) >= 0 && (d[l] = o), d[c] = ("boolean" === o ? "checked:" : "value:") + e.field, d } function o(e) { var t, n, i, r, o, a; if (e && e.length) for (a = [], t = 0, n = e.length; n > t; t++) i = e[t], o = i.text || i.value || i, r = null == i.value ? i.text || i : i.value, a[t] = { text: o, value: r }; return a } function a(e, t) { var n, i, r = e ? e.validation || {} : {}; for (n in r) i = r[n], p(i) && i.value && (i = i.value), h(i) && (t[n] = i) } var s = window.kendo, l = s.ui, c = l.Widget, d = e.extend, u = s.support.browser.msie && 9 > s.support.browser.version, h = s.isFunction, p = e.isPlainObject, f = e.inArray, g = /("|\%|'|\[|\]|\$|\.|\,|\:|\;|\+|\*|\&|\!|\#|\(|\)|<|>|\=|\?|\@|\^|\{|\}|\~|\/|\||`)/g, m = '<div class="k-widget k-tooltip k-tooltip-validation" style="margin:0.5em"><span class="k-icon k-warning"> </span>#=message#<div class="k-callout k-callout-n"></div></div>', v = "change", _ = ["url", "email", "number", "date", "boolean"], w = { number: function(t, n) { var i = r(n); e('<input type="text"/>').attr(i).appendTo(t).kendoNumericTextBox({ format: n.format }), e("<span " + s.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) }, date: function(t, n) { var i = r(n), o = n.format; o && (o = s._extractFormat(o)), i[s.attr("format")] = o, e('<input type="text"/>').attr(i).appendTo(t).kendoDatePicker({ format: n.format }), e("<span " + s.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) }, string: function(t, n) { var i = r(n); e('<input type="text" class="k-input k-textbox"/>').attr(i).appendTo(t) }, "boolean": function(t, n) { var i = r(n); e('<input type="checkbox" />').attr(i).appendTo(t) }, values: function(t, n) { var i = r(n); e("<select " + s.attr("text-field") + '="text"' + s.attr("value-field") + '="value"' + s.attr("source") + "='" + s.stringify(o(n.values)).replace(/\'/g, "'") + "'" + s.attr("role") + '="dropdownlist"/>').attr(i).appendTo(t), e("<span " + s.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) } }, b = c.extend({ init: function(t, n) { var i = this; n.target && (n.$angular = n.target.options.$angular), c.fn.init.call(i, t, n), i._validateProxy = e.proxy(i._validate, i), i.refresh() }, events: [v], options: { name: "Editable", editors: w, clearContainer: !0, errorTemplate: m }, editor: function(e, t) { var i = this, r = i.options.editors, o = p(e), a = o ? e.field : e, l = i.options.model || {}, c = o && e.values, u = c ? "values" : n(t), h = o && e.editor, f = h ? e.editor : r[u], m = i.element.find("[" + s.attr("container-for") + "=" + a.replace(g, "\\$1") + "]"); f = f ? f : r.string, h && "string" == typeof e.editor && (f = function(t) { t.append(e.editor) }), m = m.length ? m : i.element, f(m, d(!0, {}, o ? e : { field: a }, { model: l })) }, _validate: function(t) { var n, i = this, r = t.value, o = i._validationEventInProgress, a = {}, l = s.attr("bind"), c = t.field.replace(g, "\\$1"), d = RegExp("(value|checked)\\s*:\\s*" + c + "\\s*(,|$)"); a[t.field] = t.value, n = e(":input[" + l + '*="' + c + '"]', i.element).filter("[" + s.attr("validate") + "!='false']").filter(function() { return d.test(e(this).attr(l)) }), n.length > 1 && (n = n.filter(function() { var t = e(this); return !t.is(":radio") || t.val() == r })); try { i._validationEventInProgress = !0, (!i.validatable.validateInput(n) || !o && i.trigger(v, { values: a })) && t.preventDefault() } finally { i._validationEventInProgress = !1 } }, end: function() { return this.validatable.validate() }, destroy: function() { var e = this; e.angular("cleanup", function() { return { elements: e.element } }), c.fn.destroy.call(e), e.options.model.unbind("set", e._validateProxy), s.unbind(e.element), e.validatable && e.validatable.destroy(), s.destroy(e.element), e.element.removeData("kendoValidator") }, refresh: function() { var n, r, o, l, c, d, h, f, g = this, m = g.options.fields || [], v = g.options.clearContainer ? g.element.empty() : g.element, _ = g.options.model || {}, w = {}; for (e.isArray(m) || (m = [m]), n = 0, r = m.length; r > n; n++) o = m[n], l = p(o), c = l ? o.field : o, d = (_.fields || _)[c], a(d, w), g.editor(o, d); if (g.options.target && g.angular("compile", function() { return { elements: v, data: [{ dataItem: _ }] } }), !r) { h = _.fields || _; for (c in h) a(h[c], w) } i(v), g.validatable && g.validatable.destroy(), s.bind(v, g.options.model), g.options.model.unbind("set", g._validateProxy), g.options.model.bind("set", g._validateProxy), g.validatable = new s.ui.Validator(v, { validateOnBlur: !1, errorTemplate: g.options.errorTemplate || t, rules: w }), f = v.find(":kendoFocusable").eq(0).focus(), u && f.focus() } }); l.plugin(b) }(window.kendo.jQuery), function(e, t) { function n(e) { return t !== e } function i(e, t, n) { return Math.max(Math.min(parseInt(e, 10), 1 / 0 === n ? n : parseInt(n, 10)), parseInt(t, 10)) } function r(e, t) { return function() { var n = this, i = n.wrapper, r = i[0].style, o = n.options; return o.isMaximized || o.isMinimized ? n : (n.restoreOptions = { width: r.width, height: r.height }, i.children(x).hide().end().children(y).find(G).parent().hide().eq(0).before(J.action({ name: "Restore" })), t.call(n), "maximize" == e ? n.wrapper.children(y).find(Y).parent().hide() : n.wrapper.children(y).find(Y).parent().show(), n) } } function o() { return !this.type || this.type.toLowerCase().indexOf("script") >= 0 } function a(e) { var t = this; t.owner = e, t._draggable = new d(e.wrapper, { filter: ">" + x, group: e.wrapper.id + "-resizing", dragstart: p(t.dragstart, t), drag: p(t.drag, t), dragend: p(t.dragend, t) }), t._draggable.userEvents.bind("press", p(t.addOverlay, t)), t._draggable.userEvents.bind("release", p(t.removeOverlay, t)) } function s(e, t) { var n = this; n.owner = e, n._draggable = new d(e.wrapper, { filter: t, group: e.wrapper.id + "-moving", dragstart: p(n.dragstart, n), drag: p(n.drag, n), dragend: p(n.dragend, n), dragcancel: p(n.dragcancel, n) }), n._draggable.userEvents.stopPropagation = !1 } var l = window.kendo, c = l.ui.Widget, d = l.ui.Draggable, u = e.isPlainObject, h = l._activeElement, p = e.proxy, f = e.extend, g = e.each, m = l.template, v = "body", _ = ".kendoWindow", w = ".k-window", b = ".k-window-title", y = b + "bar", k = ".k-window-content", x = ".k-resize-handle", C = ".k-overlay", S = "k-content-frame", T = "k-loading", D = "k-state-hover", A = "k-state-focused", E = "k-window-maximized", I = ":visible", P = "hidden", M = "cursor", z = "open", F = "activate", R = "deactivate", H = "close", B = "refresh", L = "resize", N = "resizeEnd", O = "dragstart", V = "dragend", U = "error", W = "overflow", j = "zIndex", G = ".k-window-actions .k-i-minimize,.k-window-actions .k-i-maximize", q = ".k-i-pin", $ = ".k-i-unpin", Y = q + "," + $, Q = ".k-window-titlebar .k-window-action", K = ".k-window-titlebar .k-i-refresh", X = l.isLocalUrl, Z = c.extend({ init: function(i, r) { var a, s, d, h, f, g, m, v = this, x = {}, C = !1, S = r && r.actions && !r.actions.length; c.fn.init.call(v, i, r), r = v.options, h = r.position, i = v.element, f = r.content, S && (r.actions = []), v.appendTo = e(r.appendTo), v._animations(), f && !u(f) && (f = r.content = { url: f }), i.find("script").filter(o).remove(), i.parent().is(v.appendTo) || h.top !== t && h.left !== t || (i.is(I) ? (x = i.offset(), C = !0) : (s = i.css("visibility"), d = i.css("display"), i.css({ visibility: P, display: "" }), x = i.offset(), i.css({ visibility: s, display: d })), h.top === t && (h.top = x.top), h.left === t && (h.left = x.left)), n(r.visible) && null !== r.visible || (r.visible = i.is(I)), a = v.wrapper = i.closest(w), i.is(".k-content") && a[0] || (i.addClass("k-window-content k-content"), v._createWindow(i, r), a = v.wrapper = i.closest(w), v._dimensions()), v._position(), r.pinned && v.pin(!0), f && v.refresh(f), r.visible && v.toFront(), g = a.children(k), v._tabindex(g), r.visible && r.modal && v._overlay(a.is(I)).css({ opacity: .5 }), a.on("mouseenter" + _, Q, p(v._buttonEnter, v)).on("mouseleave" + _, Q, p(v._buttonLeave, v)).on("click" + _, "> " + Q, p(v._windowActionHandler, v)), g.on("keydown" + _, p(v._keydown, v)).on("focus" + _, p(v._focus, v)).on("blur" + _, p(v._blur, v)), this._resizable(), this._draggable(), m = i.attr("id"), m && (m += "_wnd_title", a.children(y).children(b).attr("id", m), g.attr({ role: "dialog", "aria-labelledby": m })), a.add(a.children(".k-resize-handle," + y)).on("mousedown" + _, p(v.toFront, v)), v.touchScroller = l.touchScroller(i), v._resizeHandler = p(v._onDocumentResize, v), v._marker = l.guid().substring(0, 8), e(window).on("resize" + _ + v._marker, v._resizeHandler), r.visible && (v.trigger(z), v.trigger(F)), l.notify(v) }, _buttonEnter: function(t) { e(t.currentTarget).addClass(D) }, _buttonLeave: function(t) { e(t.currentTarget).removeClass(D) }, _focus: function() { this.wrapper.addClass(A) }, _blur: function() { this.wrapper.removeClass(A) }, _dimensions: function() { var e, t, n = this.wrapper, r = this.options, o = r.width, a = r.height, s = r.maxHeight, l = ["minWidth", "minHeight", "maxWidth", "maxHeight"]; for (this.title(r.title), e = 0; l.length > e; e++) t = r[l[e]], t && 1 / 0 != t && n.css(l[e], t); s && 1 / 0 != s && this.element.css("maxHeight", s), o && n.width(("" + o).indexOf("%") > 0 ? o : i(o, r.minWidth, r.maxWidth)), a && n.height(("" + a).indexOf("%") > 0 ? a : i(a, r.minHeight, r.maxHeight)), r.visible || n.hide() }, _position: function() { var e = this.wrapper, t = this.options.position; 0 === t.top && (t.top = "" + t.top), 0 === t.left && (t.left = "" + t.left), e.css({ top: t.top || "", left: t.left || "" }) }, _animations: function() { var e = this.options; e.animation === !1 && (e.animation = { open: { effects: {} }, close: { hide: !0, effects: {} } }) }, _resize: function() { l.resize(this.element.children()) }, _resizable: function() { var t = this.options.resizable, n = this.wrapper; this.resizing && (n.off("dblclick" + _).children(x).remove(), this.resizing.destroy(), this.resizing = null), t && (n.on("dblclick" + _, y, p(function(t) { e(t.target).closest(".k-window-action").length || this.toggleMaximization() }, this)), g("n e s w se sw ne nw".split(" "), function(e, t) { n.append(J.resizeHandle(t)) }), this.resizing = new a(this)), n = null }, _draggable: function() { var e = this.options.draggable; this.dragging && (this.dragging.destroy(), this.dragging = null), e && (this.dragging = new s(this, e.dragHandle || y)) }, _actions: function() { var t = this.options.actions, n = this.wrapper.children(y), i = n.find(".k-window-actions"); t = e.map(t, function(e) { return { name: e } }), i.html(l.render(J.action, t)) }, setOptions: function(e) { c.fn.setOptions.call(this, e), this.restore(), this._animations(), this._dimensions(), this._position(), this._resizable(), this._draggable(), this._actions() }, events: [z, F, R, H, B, L, N, O, V, U], options: { name: "Window", animation: { open: { effects: { zoom: { direction: "in" }, fade: { direction: "in" } }, duration: 350 }, close: { effects: { zoom: { direction: "out", properties: { scale: .7 } }, fade: { direction: "out" } }, duration: 350, hide: !0 } }, title: "", actions: ["Close"], autoFocus: !0, modal: !1, resizable: !0, draggable: !0, minWidth: 90, minHeight: 50, maxWidth: 1 / 0, maxHeight: 1 / 0, pinned: !1, position: {}, content: null, visible: null, height: null, width: null, appendTo: "body" }, _closable: function() { return e.inArray("close", e.map(this.options.actions, function(e) { return e.toLowerCase() })) > -1 }, _keydown: function(e) { var t, n, r, o, a, s, c = this, d = c.options, u = l.keys, h = e.keyCode, p = c.wrapper, f = 10, g = c.options.isMaximized; e.target != e.currentTarget || c._closing || (h == u.ESC && c._closable() && c._close(!1), !d.draggable || e.ctrlKey || g || (t = l.getOffset(p), h == u.UP ? n = p.css("top", t.top - f) : h == u.DOWN ? n = p.css("top", t.top + f) : h == u.LEFT ? n = p.css("left", t.left - f) : h == u.RIGHT && (n = p.css("left", t.left + f))), d.resizable && e.ctrlKey && !g && (h == u.UP ? (n = !0, o = p.height() - f) : h == u.DOWN && (n = !0, o = p.height() + f), h == u.LEFT ? (n = !0, r = p.width() - f) : h == u.RIGHT && (n = !0, r = p.width() + f), n && (a = i(r, d.minWidth, d.maxWidth), s = i(o, d.minHeight, d.maxHeight), isNaN(a) || (p.width(a), c.options.width = a + "px"), isNaN(s) || (p.height(s), c.options.height = s + "px"), c.resize())), n && e.preventDefault()) }, _overlay: function(t) { var n = this.appendTo.children(C), i = this.wrapper; return n.length || (n = e("<div class='k-overlay' />")), n.insertBefore(i[0]).toggle(t).css(j, parseInt(i.css(j), 10) - 1), n }, _actionForIcon: function(e) { var t = /\bk-i-\w+\b/.exec(e[0].className)[0]; return { "k-i-close": "_close", "k-i-maximize": "maximize", "k-i-minimize": "minimize", "k-i-restore": "restore", "k-i-refresh": "refresh", "k-i-pin": "pin", "k-i-unpin": "unpin" }[t] }, _windowActionHandler: function(n) { var i, r; if (!this._closing) return i = e(n.target).closest(".k-window-action").find(".k-icon"), r = this._actionForIcon(i), r ? (n.preventDefault(), this[r](), !1) : t }, _modals: function() { var t = this, n = e(w).filter(function() { var n = e(this), i = t._object(n), r = i && i.options; return r && r.modal && r.visible && n.is(I) }).sort(function(t, n) { return +e(t).css("zIndex") - +e(n).css("zIndex") }); return t = null, n }, _object: function(e) { var n = e.children(k), i = l.widgetInstance(n); return i instanceof Z ? i : t }, center: function() { var t, n, i = this, r = i.options.position, o = i.wrapper, a = e(window), s = 0, l = 0; return i.options.isMaximized ? i : (i.options.pinned || (s = a.scrollTop(), l = a.scrollLeft()), n = l + Math.max(0, (a.width() - o.width()) / 2), t = s + Math.max(0, (a.height() - o.height() - parseInt(o.css("paddingTop"), 10)) / 2), o.css({ left: n, top: t }), r.top = t, r.left = n, i) }, title: function(e) { var t, n = this, i = n.wrapper, r = n.options, o = i.children(y), a = o.children(b); return arguments.length ? (e === !1 ? (i.addClass("k-window-titleless"), o.remove()) : (o.length ? a.html(e) : (i.prepend(J.titlebar(r)), n._actions(), o = i.children(y)), t = o.outerHeight(), i.css("padding-top", t), o.css("margin-top", -t)), n.options.title = e, n) : a.text() }, content: function(e, t) { var i = this.wrapper.children(k), r = i.children(".km-scroll-container"); return i = r[0] ? r : i, n(e) ? (this.angular("cleanup", function() { return { elements: i.children() } }), l.destroy(this.element.children()), i.empty().html(e), this.angular("compile", function() { var e, n = []; for (e = i.length; --e >= 0;) n.push({ dataItem: t }); return { elements: i.children(), data: n } }), this) : i.html() }, open: function() { var t, n, i = this, r = i.wrapper, o = i.options, a = o.animation.open, s = r.children(k), c = e(document); return i.trigger(z) || (i._closing && r.kendoStop(!0, !0), i._closing = !1, i.toFront(), o.autoFocus && i.element.focus(), o.visible = !0, o.modal && (t = i._overlay(!1), t.kendoStop(!0, !0), a.duration && l.effects.Fade ? (n = l.fx(t).fadeIn(), n.duration(a.duration || 0), n.endValue(.5), n.play()) : t.css("opacity", .5), t.show()), r.is(I) || (s.css(W, P), r.show().kendoStop().kendoAnimate({ effects: a.effects, duration: a.duration, complete: p(this._activate, this) }))), o.isMaximized && (i._documentScrollTop = c.scrollTop(), i._documentScrollLeft = c.scrollLeft(), e("html, body").css(W, P)), i }, _activate: function() { this.options.autoFocus && this.element.focus(), this.trigger(F), this.wrapper.children(k).css(W, "") }, _removeOverlay: function(n) { var i, r = this._modals(), o = this.options, a = o.modal && !r.length, s = o.modal ? this._overlay(!0) : e(t), c = o.animation.close; a ? !n && c.duration && l.effects.Fade ? (i = l.fx(s).fadeOut(), i.duration(c.duration || 0), i.startValue(.5), i.play()) : this._overlay(!1).remove() : r.length && this._object(r.last())._overlay(!0) }, _close: function(t) { var n = this, i = n.wrapper, r = n.options, o = r.animation.open, a = r.animation.close, s = e(document); if (i.is(I) && !n.trigger(H, { userTriggered: !t })) { if (n._closing) return; n._closing = !0, r.visible = !1, e(w).each(function(t, n) { var r = e(n).children(k); n != i && r.find("> ." + S).length > 0 && r.children(C).remove() }), this._removeOverlay(), i.kendoStop().kendoAnimate({ effects: a.effects || o.effects, reverse: a.reverse === !0, duration: a.duration, complete: p(this._deactivate, this) }) } n.options.isMaximized && (e("html, body").css(W, ""), n._documentScrollTop && n._documentScrollTop > 0 && s.scrollTop(n._documentScrollTop), n._documentScrollLeft && n._documentScrollLeft > 0 && s.scrollLeft(n._documentScrollLeft)) }, _deactivate: function() { var e, t = this; t.wrapper.hide().css("opacity", ""), t.trigger(R), t.options.modal && (e = t._object(t._modals().last()), e && e.toFront()) }, close: function() { return this._close(!0), this }, _actionable: function(t) { return e(t).is(Q + "," + Q + " .k-icon,:input,a") }, _shouldFocus: function(t) { var n = h(), i = this.element; return !(!this.options.autoFocus || e(n).is(i) || this._actionable(t) || i.find(n).length && i.find(t).length) }, toFront: function(t) { var n, i, r = this, o = r.wrapper, a = o[0], s = +o.css(j), l = s, c = t && t.target || null; return e(w).each(function(t, n) { var i = e(n), r = i.css(j), o = i.children(k); isNaN(r) || (s = Math.max(+r, s)), n != a && o.find("> ." + S).length > 0 && o.append(J.overlay) }), (!o[0].style.zIndex || s > l) && o.css(j, s + 2), r.element.find("> .k-overlay").remove(), r._shouldFocus(c) && (r.element.focus(), n = e(window).scrollTop(), i = parseInt(o.position().top, 10), i > 0 && n > i && (n > 0 ? e(window).scrollTop(i) : o.css("top", n))), o = null, r }, toggleMaximization: function() { return this._closing ? this : this[this.options.isMaximized ? "restore" : "maximize"]() }, restore: function() { var t = this, n = t.options, i = n.minHeight, r = t.restoreOptions, o = e(document); return n.isMaximized || n.isMinimized ? (i && 1 / 0 != i && t.wrapper.css("min-height", i), t.wrapper.css({ position: n.pinned ? "fixed" : "absolute", left: r.left, top: r.top, width: r.width, height: r.height }).removeClass(E).find(".k-window-content,.k-resize-handle").show().end().find(".k-window-titlebar .k-i-restore").parent().remove().end().end().find(G).parent().show().end().end().find(Y).parent().show(), t.options.width = r.width, t.options.height = r.height, e("html, body").css(W, ""), this._documentScrollTop && this._documentScrollTop > 0 && o.scrollTop(this._documentScrollTop), this._documentScrollLeft && this._documentScrollLeft > 0 && o.scrollLeft(this._documentScrollLeft), n.isMaximized = n.isMinimized = !1, t.resize(), t) : t }, maximize: r("maximize", function() { var t = this, n = t.wrapper, i = n.position(), r = e(document); f(t.restoreOptions, { left: i.left, top: i.top }), n.css({ left: 0, top: 0, position: "fixed" }).addClass(E), this._documentScrollTop = r.scrollTop(), this._documentScrollLeft = r.scrollLeft(), e("html, body").css(W, P), t.options.isMaximized = !0, t._onDocumentResize() }), minimize: r("minimize", function() { var e = this; e.wrapper.css({ height: "", minHeight: "" }), e.element.hide(), e.options.isMinimized = !0 }), pin: function(t) { var n = this, i = e(window), r = n.wrapper, o = parseInt(r.css("top"), 10), a = parseInt(r.css("left"), 10); (t || !n.options.pinned && !n.options.isMaximized) && (r.css({ position: "fixed", top: o - i.scrollTop(), left: a - i.scrollLeft() }), r.children(y).find(q).addClass("k-i-unpin").removeClass("k-i-pin"), n.options.pinned = !0) }, unpin: function() { var t = this, n = e(window), i = t.wrapper, r = parseInt(i.css("top"), 10), o = parseInt(i.css("left"), 10); t.options.pinned && !t.options.isMaximized && (i.css({ position: "", top: r + n.scrollTop(), left: o + n.scrollLeft() }), i.children(y).find($).addClass("k-i-pin").removeClass("k-i-unpin"), t.options.pinned = !1) }, _onDocumentResize: function() { var t, n, i = this, r = i.wrapper, o = e(window), a = l.support.zoomLevel(); i.options.isMaximized && (t = o.width() / a, n = o.height() / a - parseInt(r.css("padding-top"), 10), r.css({ width: t, height: n }), i.options.width = t, i.options.height = n, i.resize()) }, refresh: function(t) { var i, r, o, a = this, s = a.options, l = e(a.element); return u(t) || (t = { url: t }), t = f({}, s.content, t), r = n(s.iframe) ? s.iframe : t.iframe, o = t.url, o ? (n(r) || (r = !X(o)), r ? (i = l.find("." + S)[0], i ? i.src = o || i.src : l.html(J.contentFrame(f({}, s, { content: t }))), l.find("." + S).unbind("load" + _).on("load" + _, p(this._triggerRefresh, this))) : a._ajaxRequest(t)) : (t.template && a.content(m(t.template)({})), a.trigger(B)), l.toggleClass("k-window-iframecontent", !!r), a }, _triggerRefresh: function() { this.trigger(B) }, _ajaxComplete: function() { clearTimeout(this._loadingIconTimeout), this.wrapper.find(K).removeClass(T) }, _ajaxError: function(e, t) { this.trigger(U, { status: t, xhr: e }) }, _ajaxSuccess: function(e) { return function(t) { var n = t; e && (n = m(e)(t || {})), this.content(n, t), this.element.prop("scrollTop", 0), this.trigger(B) } }, _showLoading: function() { this.wrapper.find(K).addClass(T) }, _ajaxRequest: function(t) { this._loadingIconTimeout = setTimeout(p(this._showLoading, this), 100), e.ajax(f({ type: "GET", dataType: "html", cache: !1, error: p(this._ajaxError, this), complete: p(this._ajaxComplete, this), success: p(this._ajaxSuccess(t.template), this) }, t)) }, _destroy: function() { this.resizing && this.resizing.destroy(), this.dragging && this.dragging.destroy(), this.wrapper.off(_).children(k).off(_).end().find(".k-resize-handle,.k-window-titlebar").off(_), e(window).off("resize" + _ + this._marker), clearTimeout(this._loadingIconTimeout), c.fn.destroy.call(this), this.unbind(t), l.destroy(this.wrapper), this._removeOverlay(!0) }, destroy: function() { this._destroy(), this.wrapper.empty().remove(), this.wrapper = this.appendTo = this.element = e() }, _createWindow: function() { var t, n, i = this.element, r = this.options, o = l.support.isRtl(i); r.scrollable === !1 && i.attr("style", "overflow:hidden;"), n = e(J.wrapper(r)), t = i.find("iframe:not(.k-content)").map(function() { var e = this.getAttribute("src"); return this.src = "", e }), n.toggleClass("k-rtl", o).appendTo(this.appendTo).append(i).find("iframe:not(.k-content)").each(function(e) { this.src = t[e] }), n.find(".k-window-title").css(o ? "left" : "right", n.find(".k-window-actions").outerWidth() + 10), i.css("visibility", "").show(), i.find("[data-role=editor]").each(function() { var t = e(this).data("kendoEditor"); t && t.refresh() }), n = i = null } }), J = { wrapper: m("<div class='k-widget k-window' />"), action: m("<a role='button' href='\\#' class='k-window-action k-link'><span role='presentation' class='k-icon k-i-#= name.toLowerCase() #'>#= name #</span></a>"), titlebar: m("<div class='k-window-titlebar k-header'> <span class='k-window-title'>#= title #</span><div class='k-window-actions' /></div>"), overlay: "<div class='k-overlay' />", contentFrame: m("<iframe frameborder='0' title='#= title #' class='" + S + "' src='#= content.url #'>This page requires frames in order to show content</iframe>"), resizeHandle: m("<div class='k-resize-handle k-resize-#= data #'></div>") }; a.prototype = { addOverlay: function() { this.owner.wrapper.append(J.overlay) }, removeOverlay: function() { this.owner.wrapper.find(C).remove() }, dragstart: function(t) { var n = this, i = n.owner, r = i.wrapper; n.elementPadding = parseInt(r.css("padding-top"), 10), n.initialPosition = l.getOffset(r, "position"), n.resizeDirection = t.currentTarget.prop("className").replace("k-resize-handle k-resize-", ""), n.initialSize = { width: r.width(), height: r.height() }, n.containerOffset = l.getOffset(i.appendTo, "position"), r.children(x).not(t.currentTarget).hide(), e(v).css(M, t.currentTarget.css(M)) }, drag: function(e) { var t, n, r, o, a = this, s = a.owner, l = s.wrapper, c = s.options, d = a.resizeDirection, u = a.containerOffset, h = a.initialPosition, p = a.initialSize, f = Math.max(e.x.location, u.left), g = Math.max(e.y.location, u.top); d.indexOf("e") >= 0 ? (t = f - h.left, l.width(i(t, c.minWidth, c.maxWidth))) : d.indexOf("w") >= 0 && (o = h.left + p.width, t = i(o - f, c.minWidth, c.maxWidth), l.css({ left: o - t - u.left, width: t })), d.indexOf("s") >= 0 ? (n = g - h.top - a.elementPadding, l.height(i(n, c.minHeight, c.maxHeight))) : d.indexOf("n") >= 0 && (r = h.top + p.height, n = i(r - g, c.minHeight, c.maxHeight), l.css({ top: r - n - u.top, height: n })), t && (s.options.width = t + "px"), n && (s.options.height = n + "px"), s.resize() }, dragend: function(t) { var n = this, i = n.owner, r = i.wrapper; return r.children(x).not(t.currentTarget).show(), e(v).css(M, ""), i.touchScroller && i.touchScroller.reset(), 27 == t.keyCode && r.css(n.initialPosition).css(n.initialSize), i.trigger(N), !1 }, destroy: function() { this._draggable && this._draggable.destroy(), this._draggable = this.owner = null } }, s.prototype = { dragstart: function(t) { var n = this.owner, i = n.element, r = i.find(".k-window-actions"), o = l.getOffset(n.appendTo); n.trigger(O), n.initialWindowPosition = l.getOffset(n.wrapper, "position"), n.startPosition = { left: t.x.client - n.initialWindowPosition.left, top: t.y.client - n.initialWindowPosition.top }, n.minLeftPosition = r.length > 0 ? r.outerWidth() + parseInt(r.css("right"), 10) - i.outerWidth() : 20 - i.outerWidth(), n.minLeftPosition -= o.left, n.minTopPosition = -o.top, n.wrapper.append(J.overlay).children(x).hide(), e(v).css(M, t.currentTarget.css(M)) }, drag: function(t) { var n = this.owner, i = n.options.position, r = Math.max(t.y.client - n.startPosition.top, n.minTopPosition), o = Math.max(t.x.client - n.startPosition.left, n.minLeftPosition), a = { left: o, top: r }; e(n.wrapper).css(a), i.top = r, i.left = o }, _finishDrag: function() { var t = this.owner; t.wrapper.children(x).toggle(!t.options.isMinimized).end().find(C).remove(), e(v).css(M, "") }, dragcancel: function(e) { this._finishDrag(), e.currentTarget.closest(w).css(this.owner.initialWindowPosition) }, dragend: function() { return this._finishDrag(), this.owner.trigger(V), !1 }, destroy: function() { this._draggable && this._draggable.destroy(), this._draggable = this.owner = null } }, l.ui.plugin(Z) }(window.kendo.jQuery), function(e, t) { function n(e) { var t, n, i = e.find(k("popover")), r = s.roles; for (t = 0, n = i.length; n > t; t++) o.initWidget(i[t], {}, r) } function i(e) { o.triggeredByInput(e) || e.preventDefault() } function r(t) { t.each(function() { o.initWidget(e(this), {}, s.roles) }) } var o = window.kendo, a = o.mobile, s = a.ui, l = o.attr, c = s.Widget, d = o.ViewClone, u = "init", h = '<div style="height: 100%; width: 100%; position: absolute; top: 0; left: 0; z-index: 20000; display: none" />', p = "beforeShow", f = "show", g = "afterShow", m = "beforeHide", v = "transitionEnd", _ = "transitionStart", w = "hide", b = "destroy", y = o.attrValue, k = o.roleSelector, x = o.directiveSelector, C = o.compileMobileDirective, S = c.extend({ init: function(t, n) { c.fn.init.call(this, t, n), this.params = {}, e.extend(this, n), this.transition = this.transition || this.defaultTransition, this._id(), this.options.$angular ? this._overlay() : (this._layout(), this._overlay(), this._scroller(), this._model()) }, events: [u, p, f, g, m, w, b, _, v], options: { name: "View", title: "", layout: null, getLayout: e.noop, reload: !1, transition: "", defaultTransition: "", useNativeScrolling: !1, stretch: !1, zoom: !1, model: null, modelScope: window, scroller: {}, initWidgets: !0 }, enable: function(e) { t === e && (e = !0), e ? this.overlay.hide() : this.overlay.show() }, destroy: function() { this.layout && this.layout.detach(this), this.trigger(b), c.fn.destroy.call(this), this.scroller && this.scroller.destroy(), this.options.$angular && this.element.scope().$destroy(), o.destroy(this.element) }, purge: function() { this.destroy(), this.element.remove() }, triggerBeforeShow: function() { return this.trigger(p, { view: this }) ? !1 : !0 }, triggerBeforeHide: function() { return this.trigger(m, { view: this }) ? !1 : !0 }, showStart: function() { var e = this.element; e.css("display", ""), this.inited ? this._invokeNgController() : (this.inited = !0, this.trigger(u, { view: this })), this.layout && this.layout.attach(this), this._padIfNativeScrolling(), this.trigger(f, { view: this }), o.resize(e) }, showEnd: function() { this.trigger(g, { view: this }), this._padIfNativeScrolling() }, hideEnd: function() { var e = this; e.element.hide(), e.trigger(w, { view: e }), e.layout && e.layout.trigger(w, { view: e, layout: e.layout }) }, beforeTransition: function(e) { this.trigger(_, { type: e }) }, afterTransition: function(e) { this.trigger(v, { type: e }) }, _padIfNativeScrolling: function() { if (a.appLevelNativeScrolling()) { var e = o.support.mobileOS && o.support.mobileOS.android, t = a.application.skin() || "", n = a.application.os.android || t.indexOf("android") > -1, i = "flat" === t || t.indexOf("material") > -1, r = !e && !n || i ? "header" : "footer", s = !e && !n || i ? "footer" : "header"; this.content.css({ paddingTop: this[r].height(), paddingBottom: this[s].height() }) } }, contentElement: function() { var e = this; return e.options.stretch ? e.content : e.scrollerContent }, clone: function() { return new d(this) }, _scroller: function() { var t = this; a.appLevelNativeScrolling() || (t.options.stretch ? t.content.addClass("km-stretched-view") : (t.content.kendoMobileScroller(e.extend(t.options.scroller, { zoom: t.options.zoom, useNative: t.options.useNativeScrolling })), t.scroller = t.content.data("kendoMobileScroller"), t.scrollerContent = t.scroller.scrollElement), o.support.kineticScrollNeeded && (e(t.element).on("touchmove", ".km-header", i), t.options.useNativeScrolling || e(t.element).on("touchmove", ".km-content", i))) }, _model: function() { var e = this, t = e.element, i = e.options.model; "string" == typeof i && (i = o.getter(i)(e.options.modelScope)), e.model = i, n(t), e.element.css("display", ""), e.options.initWidgets && (i ? o.bind(t, i, s, o.ui, o.dataviz.ui) : a.init(t.children())), e.element.css("display", "none") }, _id: function() { var e = this.element, t = e.attr("id") || ""; this.id = y(e, "url") || "#" + t, "#" == this.id && (this.id = o.guid(), e.attr("id", this.id)) }, _layout: function() { var e = k("content"), t = this.element; t.addClass("km-view"), this.header = t.children(k("header")).addClass("km-header"), this.footer = t.children(k("footer")).addClass("km-footer"), t.children(e)[0] || t.wrapInner("<div " + l("role") + '="content"></div>'), this.content = t.children(k("content")).addClass("km-content"), this.element.prepend(this.header).append(this.footer), this.layout = this.options.getLayout(this.layout), this.layout && this.layout.setup(this) }, _overlay: function() { this.overlay = e(h).appendTo(this.element) }, _invokeNgController: function() { var t, n, i; this.options.$angular && (t = this.element.controller(), n = this.element.scope(), t && (i = e.proxy(this, "_callController", t, n), /^\$(digest|apply)$/.test(n.$$phase) ? i() : n.$apply(i))) }, _callController: function(e, t) { this.element.injector().invoke(e.constructor, e, { $scope: t }) } }), T = c.extend({ init: function(e, t) { c.fn.init.call(this, e, t), e = this.element, this.header = e.children(this._locate("header")).addClass("km-header"), this.footer = e.children(this._locate("footer")).addClass("km-footer"), this.elements = this.header.add(this.footer), n(e), this.options.$angular || o.mobile.init(this.element.children()), this.element.detach(), this.trigger(u, { layout: this }) }, _locate: function(e) { return this.options.$angular ? x(e) : k(e) }, options: { name: "Layout", id: null, platform: null }, events: [u, f, w], setup: function(e) { e.header[0] || (e.header = this.header), e.footer[0] || (e.footer = this.footer) }, detach: function(e) { var t = this; e.header === t.header && t.header[0] && e.element.prepend(t.header.detach()[0].cloneNode(!0)), e.footer === t.footer && t.footer.length && e.element.append(t.footer.detach()[0].cloneNode(!0)) }, attach: function(e) { var t = this, n = t.currentView; n && t.detach(n), e.header === t.header && (t.header.detach(), e.element.children(k("header")).remove(), e.element.prepend(t.header)), e.footer === t.footer && (t.footer.detach(), e.element.children(k("footer")).remove(), e.element.append(t.footer)), t.trigger(f, { layout: t, view: e }), t.currentView = e } }), D = o.Observable, A = /<body[^>]*>(([\u000a\u000d\u2028\u2029]|.)*)<\/body>/i, E = "loadStart", I = "loadComplete", P = "showStart", M = "sameViewRequested", z = "viewShow", F = "viewTypeDetermined", R = "after", H = D.extend({ init: function(t) { var n, i, a, s, l = this; if (D.fn.init.call(l), e.extend(l, t), l.sandbox = e("<div />"), a = l.container, n = l._hideViews(a), l.rootView = n.first(), !l.rootView[0] && t.rootNeeded) throw i = a[0] == o.mobile.application.element[0] ? 'Your kendo mobile application element does not contain any direct child elements with data-role="view" attribute set. Make sure that you instantiate the mobile application using the correct container.' : 'Your pane element does not contain any direct child elements with data-role="view" attribute set.', Error(i); l.layouts = {}, l.viewContainer = new o.ViewContainer(l.container), l.viewContainer.bind("accepted", function(e) { e.view.params = l.params }), l.viewContainer.bind("complete", function(e) { l.trigger(z, { view: e.view }) }), l.viewContainer.bind(R, function() { l.trigger(R) }), this.getLayoutProxy = e.proxy(this, "_getLayout"), l._setupLayouts(a), s = a.children(l._locate("modalview drawer")), l.$angular ? (l.$angular[0].viewOptions = { defaultTransition: l.transition, loader: l.loader, container: l.container, getLayout: l.getLayoutProxy }, s.each(function(n, i) { C(e(i), t.$angular[0]) })) : r(s), this.bind(this.events, t) }, events: [P, R, z, E, I, M, F], destroy: function() { o.destroy(this.container); for (var e in this.layouts) this.layouts[e].destroy() }, view: function() { return this.viewContainer.view }, showView: function(e, t, n) { if (e = e.replace(RegExp("^" + this.remoteViewURLPrefix), ""), "" === e && this.remoteViewURLPrefix && (e = "/"), e.replace(/^#/, "") === this.url) return this.trigger(M), !1; this.trigger(P); var i = this, r = function(n) { return i.viewContainer.show(n, t, e) }, a = i._findViewElement(e), s = o.widgetInstance(a); return i.url = e.replace(/^#/, ""), i.params = n, s && s.reload && (s.purge(), a = []), this.trigger(F, { remote: 0 === a.length, url: e }), a[0] ? (s || (s = i._createView(a)), r(s)) : (this.serverNavigation ? location.href = e : i._loadView(e, r), !0) }, append: function(e, t) { var n, i, o, a = this.sandbox, s = (t || "").split("?")[0], c = this.container; return A.test(e) && (e = RegExp.$1), a[0].innerHTML = e, c.append(a.children("script, style")), n = this._hideViews(a), o = n.first(), o.length || (n = o = a.wrapInner("<div data-role=view />").children()), s && o.hide().attr(l("url"), s), this._setupLayouts(a), i = a.children(this._locate("modalview drawer")), c.append(a.children(this._locate("layout modalview drawer")).add(n)), r(i), this._createView(o) }, _locate: function(e) { return this.$angular ? x(e) : k(e) }, _findViewElement: function(e) { var t, n = e.split("?")[0]; return n ? (t = this.container.children("[" + l("url") + "='" + n + "']"), t[0] || -1 !== n.indexOf("/") || (t = this.container.children("#" === n.charAt(0) ? n : "#" + n)), t) : this.rootView }, _createView: function(e) { return this.$angular ? C(e, this.$angular[0]) : o.initWidget(e, { defaultTransition: this.transition, loader: this.loader, container: this.container, getLayout: this.getLayoutProxy, modelScope: this.modelScope, reload: y(e, "reload") }, s.roles) }, _getLayout: function(e) { return "" === e ? null : e ? this.layouts[e] : this.layouts[this.layout] }, _loadView: function(t, n) { this._xhr && this._xhr.abort(), this.trigger(E), this._xhr = e.get(o.absoluteURL(t, this.remoteViewURLPrefix), "html").always(e.proxy(this, "_xhrComplete", n, t)) }, _xhrComplete: function(e, t, n) { var i = !0; if ("object" == typeof n && 0 === n.status) { if (!(n.responseText && n.responseText.length > 0)) return; i = !0, n = n.responseText } this.trigger(I), i && e(this.append(n, t)) }, _hideViews: function(e) { return e.children(this._locate("view splitview")).hide() }, _setupLayouts: function(t) { var n, i = this; t.children(i._locate("layout")).each(function() { n = i.$angular ? C(e(this), i.$angular[0]) : o.initWidget(e(this), {}, s.roles); var t = n.options.platform; t && t !== a.application.os.name ? n.destroy() : i.layouts[n.options.id] = n }) } }); o.mobile.ViewEngine = H, s.plugin(S), s.plugin(T) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.mobile.ui, i = n.Widget, r = e.map(t.eventMap, function(e) { return e }).join(" ").split(" "), o = i.extend({ init: function(t, n) { var r = this, o = e('<div class="km-loader"><span class="km-loading km-spin"></span><span class="km-loading-left"></span><span class="km-loading-right"></span></div>'); i.fn.init.call(r, o, n), r.container = t, r.captureEvents = !1, r._attachCapture(), o.append(r.options.loading).hide().appendTo(t) }, options: { name: "Loader", loading: "<h1>Loading...</h1>", timeout: 100 }, show: function() { var e = this; clearTimeout(e._loading), e.options.loading !== !1 && (e.captureEvents = !0, e._loading = setTimeout(function() { e.element.show() }, e.options.timeout)) }, hide: function() { this.captureEvents = !1, clearTimeout(this._loading), this.element.hide() }, changeMessage: function(e) { this.options.loading = e, this.element.find(">h1").html(e) }, transition: function() { this.captureEvents = !0, this.container.css("pointer-events", "none") }, transitionDone: function() { this.captureEvents = !1, this.container.css("pointer-events", "") }, _attachCapture: function() { function e(e) { n.captureEvents && e.preventDefault() } var t, n = this; for (n.captureEvents = !1, t = 0; r.length > t; t++) n.container[0].addEventListener(r[t], e, !0) } }); n.plugin(o) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.mobile, r = n.roleSelector, o = i.ui, a = o.Widget, s = i.ViewEngine, l = o.View, c = i.ui.Loader, d = "external", u = "href", h = "#!", p = "navigate", f = "viewShow", g = "sameViewRequested", m = n.support.mobileOS, v = m.ios && !m.appMode && m.flatVersion >= 700, _ = /popover|actionsheet|modalview|drawer/, w = "#:back", b = n.attrValue, y = a.extend({ init: function(e, t) { var i = this; a.fn.init.call(i, e, t), t = i.options, e = i.element, e.addClass("km-pane"), i.options.collapsible && e.addClass("km-collapsible-pane"), this.history = [], this.historyCallback = function(e, t, n) { var r = i.transition; return i.transition = null, v && n && (r = "none"), i.viewEngine.showView(e, r, t) }, this._historyNavigate = function(e) { if (e === w) { if (1 === i.history.length) return; i.history.pop(), e = i.history[i.history.length - 1] } else i.history.push(e); i.historyCallback(e, n.parseQueryStringParams(e)) }, this._historyReplace = function(e) { var t = n.parseQueryStringParams(e); i.history[i.history.length - 1] = e, i.historyCallback(e, t) }, i.loader = new c(e, { loading: i.options.loading }), i.viewEngine = new s({ container: e, transition: t.transition, modelScope: t.modelScope, rootNeeded: !t.initial, serverNavigation: t.serverNavigation, remoteViewURLPrefix: t.root || "", layout: t.layout, $angular: t.$angular, loader: i.loader, showStart: function() { i.loader.transition(), i.closeActiveDialogs() }, after: function() { i.loader.transitionDone() }, viewShow: function(e) { i.trigger(f, e) }, loadStart: function() { i.loader.show() }, loadComplete: function() { i.loader.hide() }, sameViewRequested: function() { i.trigger(g) }, viewTypeDetermined: function(e) { e.remote && i.options.serverNavigation || i.trigger(p, { url: e.url }) } }), this._setPortraitWidth(), n.onResize(function() { i._setPortraitWidth() }), i._setupAppLinks() }, closeActiveDialogs: function() { var t = this.element.find(r("actionsheet popover modalview")).filter(":visible"); t.each(function() { n.widgetInstance(e(this), o).close() }) }, navigateToInitial: function() { var e = this.options.initial; e && this.navigate(e) }, options: { name: "Pane", portraitWidth: "", transition: "", layout: "", collapsible: !1, initial: null, modelScope: window, loading: "<h1>Loading...</h1>" }, events: [p, f, g], append: function(e) { return this.viewEngine.append(e) }, destroy: function() { a.fn.destroy.call(this), this.viewEngine.destroy(), this.userEvents.destroy() }, navigate: function(e, t) { e instanceof l && (e = e.id), this.transition = t, this._historyNavigate(e) }, replace: function(e, t) { e instanceof l && (e = e.id), this.transition = t, this._historyReplace(e) }, bindToRouter: function(e) { var t = this, i = this.history, r = this.viewEngine; e.bind("init", function(t) { var o, a = t.url, s = e.pushState ? a : "/"; r.rootView.attr(n.attr("url"), s), o = i.length, "/" === a && o && (e.navigate(i[o - 1], !0), t.preventDefault()) }), e.bind("routeMissing", function(e) { t.historyCallback(e.url, e.params, e.backButtonPressed) || e.preventDefault() }), e.bind("same", function() { t.trigger(g) }), t._historyNavigate = function(t) { e.navigate(t) }, t._historyReplace = function(t) { e.replace(t) } }, hideLoading: function() { this.loader.hide() }, showLoading: function() { this.loader.show() }, changeLoadingMessage: function(e) { this.loader.changeMessage(e) }, view: function() { return this.viewEngine.view() }, _setPortraitWidth: function() { var e, t = this.options.portraitWidth; t && (e = n.mobile.application.element.is(".km-vertical") ? t : "auto", this.element.css("width", e)) }, _setupAppLinks: function() { var t = this, i = "tab", o = "[data-" + n.ns + "navigate-on-press]", a = e.map(["button", "backbutton", "detailbutton", "listview-link"], function(e) { return r(e) + ":not(" + o + ")" }).join(","); this.element.handler(this).on("down", r(i) + "," + o, "_mouseup").on("click", r(i) + "," + a + "," + o, "_appLinkClick"), this.userEvents = new n.UserEvents(this.element, { filter: a, tap: function(e) { e.event.currentTarget = e.touch.currentTarget, t._mouseup(e.event) } }), this.element.css("-ms-touch-action", "") }, _appLinkClick: function(t) { var n = e(t.currentTarget).attr("href"), i = n && "#" !== n[0] && this.options.serverNavigation; i || b(e(t.currentTarget), "rel") == d || t.preventDefault() }, _mouseup: function(r) { if (!(r.which > 1 || r.isDefaultPrevented())) { var a = this, s = e(r.currentTarget), l = b(s, "transition"), c = b(s, "rel") || "", p = b(s, "target"), f = s.attr(u), g = v && 0 === s[0].offsetHeight, m = f && "#" !== f[0] && this.options.serverNavigation; g || m || c === d || t === f || f === h || (s.attr(u, h), setTimeout(function() { s.attr(u, f) }), c.match(_) ? (n.widgetInstance(e(f), o).openFor(s), ("actionsheet" === c || "drawer" === c) && r.stopPropagation()) : ("_top" === p ? a = i.application.pane : p && (a = e("#" + p).data("kendoMobilePane")), a.navigate(f, l)), r.preventDefault()) } } }); y.wrap = function(e) { e.is(r("view")) || (e = e.wrap("<div data-" + n.ns + 'role="view" data-stretch="true"></div>').parent()); var t = e.wrap('<div class="km-pane-wrapper"><div></div></div>').parent(), i = new y(t); return i.navigate(""), i }, o.plugin(y) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.mobile, i = n.ui, r = "hide", o = "open", a = "close", s = '<div class="km-popup-wrapper" />', l = '<div class="km-popup-arrow" />', c = '<div class="km-popup-overlay" />', d = "km-up km-down km-left km-right", u = i.Widget, h = { down: { origin: "bottom center", position: "top center" }, up: { origin: "top center", position: "bottom center" }, left: { origin: "center left", position: "center right", collision: "fit flip" }, right: { origin: "center right", position: "center left", collision: "fit flip" } }, p = { animation: { open: { effects: "fade:in", duration: 0 }, close: { effects: "fade:out", duration: 400 } } }, f = { horizontal: { offset: "top", size: "height" }, vertical: { offset: "left", size: "width" } }, g = { up: "down", down: "up", left: "right", right: "left" }, m = u.extend({ init: function(n, i) { var o, a, d = this, g = n.closest(".km-modalview-wrapper"), m = n.closest(".km-root").children(".km-pane").first(), v = g[0] ? g : m; i.viewport ? m = i.viewport : m[0] || (m = window), i.container ? v = i.container : v[0] || (v = document.body), o = { viewport: m, copyAnchorStyles: !1, autosize: !0, open: function() { d.overlay.show() }, activate: e.proxy(d._activate, d), deactivate: function() { d.overlay.hide(), d._apiCall || d.trigger(r), d._apiCall = !1 } }, u.fn.init.call(d, n, i), n = d.element, i = d.options, n.wrap(s).addClass("km-popup").show(), a = d.options.direction.match(/left|right/) ? "horizontal" : "vertical", d.dimensions = f[a], d.wrapper = n.parent().css({ width: i.width, height: i.height }).addClass("km-popup-wrapper km-" + i.direction).hide(), d.arrow = e(l).prependTo(d.wrapper).hide(), d.overlay = e(c).appendTo(v).hide(), o.appendTo = d.overlay, i.className && d.overlay.addClass(i.className), d.popup = new t.ui.Popup(d.wrapper, e.extend(!0, o, p, h[i.direction])) }, options: { name: "Popup", width: 240, height: "", direction: "down", container: null, viewport: null }, events: [r], show: function(t) { this.popup.options.anchor = e(t), this.popup.open() }, hide: function() { this._apiCall = !0, this.popup.close() }, destroy: function() { u.fn.destroy.call(this), this.popup.destroy(), this.overlay.remove() }, target: function() { return this.popup.options.anchor }, _activate: function() { var t = this, n = t.options.direction, i = t.dimensions, r = i.offset, o = t.popup, a = o.options.anchor, s = e(a).offset(), l = e(o.element).offset(), c = o.flipped ? g[n] : n, u = 2 * t.arrow[i.size](), h = t.element[i.size]() - t.arrow[i.size](), p = e(a)[i.size](), f = s[r] - l[r] + p / 2; u > f && (f = u), f > h && (f = h), t.wrapper.removeClass(d).addClass("km-" + c), t.arrow.css(r, f).show() } }), v = u.extend({ init: function(n, r) { var o, s = this; s.initialOpen = !1, u.fn.init.call(s, n, r), o = e.extend({ className: "km-popover-root", hide: function() { s.trigger(a) } }, this.options.popup), s.popup = new m(s.element, o), s.popup.overlay.on("move", function(e) { e.target == s.popup.overlay[0] && e.preventDefault() }), s.pane = new i.Pane(s.element, e.extend(this.options.pane, { $angular: this.options.$angular })), s.pane.navigateToInitial(), t.notify(s, i) }, options: { name: "PopOver", popup: {}, pane: {} }, events: [o, a], open: function(e) { this.popup.show(e), this.initialOpen ? this.pane.view()._invokeNgController() : (this.pane.navigate(""), this.popup.popup._position(), this.initialOpen = !0) }, openFor: function(e) { this.open(e), this.trigger(o, { target: this.popup.target() }) }, close: function() { this.popup.hide() }, destroy: function() { u.fn.destroy.call(this), this.pane.destroy(), this.popup.destroy(), t.destroy(this.element) } }); i.plugin(m), i.plugin(v) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.mobile.ui, r = n.ui.Popup, o = '<div class="km-shim"/>', a = "hide", s = i.Widget, l = s.extend({ init: function(t, i) { var l = this, c = n.mobile.application, d = n.support.mobileOS, u = c ? c.os.name : d ? d.name : "ios", h = "ios" === u || "wp" === u || (c ? c.os.skin : !1), p = "blackberry" === u, f = i.align || (h ? "bottom center" : p ? "center right" : "center center"), g = i.position || (h ? "bottom center" : p ? "center right" : "center center"), m = i.effect || (h ? "slideIn:up" : p ? "slideIn:left" : "fade:in"), v = e(o).handler(l).hide(); s.fn.init.call(l, t, i), l.shim = v, t = l.element, i = l.options, i.className && l.shim.addClass(i.className), i.modal || l.shim.on("up", "_hide"), (c ? c.element : e(document.body)).append(v), l.popup = new r(l.element, { anchor: v, modal: !0, appendTo: v, origin: f, position: g, animation: { open: { effects: m, duration: i.duration }, close: { duration: i.duration } }, close: function(e) { var t = !1; l._apiCall || (t = l.trigger(a)), t && e.preventDefault(), l._apiCall = !1 }, deactivate: function() { v.hide() }, open: function() { v.show() } }), n.notify(l) }, events: [a], options: { name: "Shim", modal: !1, align: t, position: t, effect: t, duration: 200 }, show: function() { this.popup.open() }, hide: function() { this._apiCall = !0, this.popup.close() }, destroy: function() { s.fn.destroy.call(this), this.shim.kendoDestroy(), this.popup.destroy(), this.shim.remove() }, _hide: function(t) { t && e.contains(this.shim.children().children(".k-popup")[0], t.target) || this.popup.close() } }); i.plugin(l) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.support, i = t.mobile.ui, r = i.Shim, o = i.Popup, a = i.Widget, s = "open", l = "close", c = "command", d = "li>a", u = "actionsheetContext", h = '<div class="km-actionsheet-wrapper" />', p = t.template('<li class="km-actionsheet-cancel"><a href="\\#">#:cancel#</a></li>'), f = a.extend({ init: function(s, l) { var c, u, f, g = this, m = n.mobileOS; a.fn.init.call(g, s, l), l = g.options, f = l.type, s = g.element, u = "auto" === f ? m && m.tablet : "tablet" === f, c = u ? o : r, l.cancelTemplate && (p = t.template(l.cancelTemplate)), s.addClass("km-actionsheet").append(p({ cancel: g.options.cancel })).wrap(h).on("up", d, "_click").on("click", d, t.preventDefault), g.view().bind("destroy", function() { g.destroy() }), g.wrapper = s.parent().addClass(f ? " km-actionsheet-" + f : ""), g.shim = new c(g.wrapper, e.extend({ modal: m.ios && 7 > m.majorVersion, className: "km-actionsheet-root" }, g.options.popup)), g._closeProxy = e.proxy(g, "_close"), g.shim.bind("hide", g._closeProxy), u && t.onResize(g._closeProxy), t.notify(g, i) }, events: [s, l, c], options: { name: "ActionSheet", cancel: "Cancel", type: "auto", popup: { height: "auto" } }, open: function(t, n) { var i = this; i.target = e(t), i.context = n, i.shim.show(t) }, close: function() { this.context = this.target = null, this.shim.hide() }, openFor: function(e) { var t = this, n = e.data(u); t.open(e, n), t.trigger(s, { target: e, context: n }) }, destroy: function() { a.fn.destroy.call(this), t.unbindResize(this._closeProxy), this.shim.destroy() }, _click: function(n) { var i, r, o, a; n.isDefaultPrevented() || (i = e(n.currentTarget), r = i.data("action"), r && (o = { target: this.target, context: this.context }, a = this.options.$angular, a ? this.element.injector().get("$parse")(r)(a[0])(o) : t.getter(r)(window)(o)), this.trigger(c, { target: this.target, context: this.context, currentTarget: i }), n.preventDefault(), this._close()) }, _close: function(e) { this.trigger(l) ? e.preventDefault() : this.close() } }); i.plugin(f) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui, r = i.Widget, o = "horizontal", a = "vertical", s = 0, l = 100, c = 0, d = 5, u = "k-progressbar", h = "k-progressbar-reverse", p = "k-progressbar-indeterminate", f = "k-complete", g = "k-state-selected", m = "k-progress-status", v = "k-state-selected", _ = "k-state-default", w = "k-state-disabled", b = { VALUE: "value", PERCENT: "percent", CHUNK: "chunk" }, y = "change", k = "complete", x = "boolean", C = Math, S = e.extend, T = e.proxy, D = 100, A = 400, E = 3, I = { progressStatus: "<span class='k-progress-status-wrap'><span class='k-progress-status'></span></span>" }, P = r.extend({ init: function(e, t) { var n = this; r.fn.init.call(this, e, t), t = n.options, n._progressProperty = t.orientation === o ? "width" : "height", n._fields(), t.value = n._validateValue(t.value), n._validateType(t.type), n._wrapper(), n._progressAnimation(), t.value !== t.min && t.value !== !1 && n._updateProgress() }, setOptions: function(e) { var t = this; r.fn.setOptions.call(t, e), e.hasOwnProperty("reverse") && t.wrapper.toggleClass("k-progressbar-reverse", e.reverse), e.hasOwnProperty("enable") && t.enable(e.enable), t._progressAnimation(), t._validateValue(), t._updateProgress() }, events: [y, k], options: { name: "ProgressBar", orientation: o, reverse: !1, min: s, max: l, value: c, enable: !0, type: b.VALUE, chunkCount: d, showStatus: !0, animation: {} }, _fields: function() { var t = this; t._isStarted = !1, t.progressWrapper = t.progressStatus = e() }, _validateType: function(i) { var r = !1; if (e.each(b, function(e, n) { return n === i ? (r = !0, !1) : t }), !r) throw Error(n.format("Invalid ProgressBar type '{0}'", i)) }, _wrapper: function() { var e, t = this, n = t.wrapper = t.element, i = t.options, r = i.orientation; n.addClass("k-widget " + u), n.addClass(u + "-" + (r === o ? o : a)), i.enable === !1 && n.addClass(w), i.reverse && n.addClass(h), i.value === !1 && n.addClass(p), i.type === b.CHUNK ? t._addChunkProgressWrapper() : i.showStatus && (t.progressStatus = t.wrapper.prepend(I.progressStatus).find("." + m), e = i.value !== !1 ? i.value : i.min, t.progressStatus.text(i.type === b.VALUE ? e : t._calculatePercentage(e).toFixed() + "%")) }, value: function(e) { return this._value(e) }, _value: function(e) { var n, i = this, r = i.options; return e === t ? r.value : (typeof e !== x ? (e = i._roundValue(e), isNaN(e) || (n = i._validateValue(e), n !== r.value && (i.wrapper.removeClass(p), r.value = n, i._isStarted = !0, i._updateProgress()))) : e || (i.wrapper.addClass(p), r.value = !1), t) }, _roundValue: function(e) { e = parseFloat(e); var t = C.pow(10, E); return C.floor(e * t) / t }, _validateValue: function(e) { var t = this, n = t.options; if (e !== !1) { if (n.min >= e || e === !0) return n.min; if (e >= n.max) return n.max } else if (e === !1) return !1; return isNaN(t._roundValue(e)) ? n.min : e }, _updateProgress: function() { var e = this, t = e.options, n = e._calculatePercentage(); t.type === b.CHUNK ? (e._updateChunks(n), e._onProgressUpdateAlways(t.value)) : e._updateProgressWrapper(n) }, _updateChunks: function(e) { var t, n = this, i = n.options, r = i.chunkCount, s = parseInt(D / r * 100, 10) / 100, l = parseInt(100 * e, 10) / 100, c = C.floor(l / s); t = n.wrapper.find(i.orientation === o && !i.reverse || i.orientation === a && i.reverse ? "li.k-item:lt(" + c + ")" : "li.k-item:gt(-" + (c + 1) + ")"), n.wrapper.find("." + v).removeClass(v).addClass(_), t.removeClass(_).addClass(v) }, _updateProgressWrapper: function(e) { var t = this, n = t.options, i = t.wrapper.find("." + g), r = t._isStarted ? t._animation.duration : 0, o = {}; 0 === i.length && t._addRegularProgressWrapper(), o[t._progressProperty] = e + "%", t.progressWrapper.animate(o, { duration: r, start: T(t._onProgressAnimateStart, t), progress: T(t._onProgressAnimate, t), complete: T(t._onProgressAnimateComplete, t, n.value), always: T(t._onProgressUpdateAlways, t, n.value) }) }, _onProgressAnimateStart: function() { this.progressWrapper.show() }, _onProgressAnimate: function(e) { var t, n = this, i = n.options, r = parseFloat(e.elem.style[n._progressProperty], 10); i.showStatus && (t = 1e4 / parseFloat(n.progressWrapper[0].style[n._progressProperty]), n.progressWrapper.find(".k-progress-status-wrap").css(n._progressProperty, t + "%")), i.type !== b.CHUNK && 98 >= r && n.progressWrapper.removeClass(f) }, _onProgressAnimateComplete: function(e) { var t, n = this, i = n.options, r = parseFloat(n.progressWrapper[0].style[n._progressProperty]); i.type !== b.CHUNK && r > 98 && n.progressWrapper.addClass(f), i.showStatus && (t = i.type === b.VALUE ? e : i.type == b.PERCENT ? n._calculatePercentage(e).toFixed() + "%" : C.floor(n._calculatePercentage(e)) + "%", n.progressStatus.text(t)), e === i.min && n.progressWrapper.hide() }, _onProgressUpdateAlways: function(e) { var t = this, n = t.options; t._isStarted && t.trigger(y, { value: e }), e === n.max && t._isStarted && t.trigger(k, { value: n.max }) }, enable: function(e) { var n = this, i = n.options; i.enable = t === e ? !0 : e, n.wrapper.toggleClass(w, !i.enable) }, destroy: function() { var e = this; r.fn.destroy.call(e) }, _addChunkProgressWrapper: function() { var e, t = this, n = t.options, i = t.wrapper, r = D / n.chunkCount, o = ""; for (1 >= n.chunkCount && (n.chunkCount = d), o += "<ul class='k-reset'>", e = n.chunkCount - 1; e >= 0; e--) o += "<li class='k-item k-state-default'></li>"; o += "</ul>", i.append(o).find(".k-item").css(t._progressProperty, r + "%").first().addClass("k-first").end().last().addClass("k-last"), t._normalizeChunkSize() }, _normalizeChunkSize: function() { var e = this, t = e.options, n = e.wrapper.find(".k-item:last"), i = parseFloat(n[0].style[e._progressProperty]), r = D - t.chunkCount * i; r > 0 && n.css(e._progressProperty, i + r + "%") }, _addRegularProgressWrapper: function() { var t = this; t.progressWrapper = e("<div class='" + g + "'></div>").appendTo(t.wrapper), t.options.showStatus && (t.progressWrapper.append(I.progressStatus), t.progressStatus = t.wrapper.find("." + m)) }, _calculateChunkSize: function() { var e = this, t = e.options.chunkCount, n = e.wrapper.find("ul.k-reset"); return (parseInt(n.css(e._progressProperty), 10) - (t - 1)) / t }, _calculatePercentage: function(e) { var n = this, i = n.options, r = e !== t ? e : i.value, o = i.min, a = i.max; return n._onePercent = C.abs((a - o) / 100), C.abs((r - o) / n._onePercent) }, _progressAnimation: function() { var e = this, t = e.options, n = t.animation; e._animation = n === !1 ? { duration: 0 } : S({ duration: A }, t.animation) } }); n.ui.plugin(P) }(window.kendo.jQuery), function(e, t, n) { "use strict"; function i() { function e() { var t, r, o; for (t = 0; arguments.length > t; ++t) { if (r = arguments[t], r === n) throw Error("Cannot output undefined to PDF"); if (r instanceof y) r.beforeRender(e), r.render(e); else if (V(r)) g(r, e); else if (f(r)) m(r, e); else if ("number" == typeof r) { if (isNaN(r)) throw Error("Cannot output NaN to PDF"); o = r.toFixed(7), o.indexOf(".") >= 0 && (o = o.replace(/\.?0+$/, "")), "-0" == o && (o = "0"), i.writeString(o) } else /string|boolean/.test(typeof r) ? i.writeString(r + "") : "function" == typeof r.get ? i.write(r.get()) : "object" == typeof r && (r ? e(new q(r)) : i.writeString("null")) } } var t = 0, i = z(); return e.writeData = function(e) { i.write(e) }, e.withIndent = function(n) { ++t, n(e), --t }, e.indent = function() { e(it, u("", 2 * t, " ")), e.apply(null, arguments) }, e.offset = function() { return i.offset() }, e.toString = function() { throw Error("FIX CALLER") }, e.get = function() { return i.get() }, e.stream = function() { return i }, e } function r(e, t) { var n = e.beforeRender, i = e.render; e.beforeRender = function() {}, e.render = function(e) { e(t, " 0 R") }, e.renderFull = function(r) { e._offset = r.offset(), r(t, " 0 obj "), n.call(e, r), i.call(e, r), r(" endobj") } } function o(e) { var t, n = e("paperSize", at.a4); if (!n) return {}; if ("string" == typeof n && (n = at[n.toLowerCase()], null == n)) throw Error("Unknown paper size"); return n[0] = b(n[0]), n[1] = b(n[1]), e("landscape", !1) && (n = [Math.max(n[0], n[1]), Math.min(n[0], n[1])]), t = e("margin"), t && ("string" == typeof t || "number" == typeof t ? (t = b(t, 0), t = { left: t, top: t, right: t, bottom: t }) : t = { left: b(t.left, 0), top: b(t.top, 0), right: b(t.right, 0), bottom: b(t.bottom, 0) }, e("addMargin") && (n[0] += t.left + t.right, n[1] += t.top + t.bottom)), { paperSize: n, margin: t } } function a(e) { function t(t, n) { return e && null != e[t] ? e[t] : n } var n, a, s = this, l = i(), c = 0, d = []; s.getOption = t, s.attach = function(e) { return d.indexOf(e) < 0 && (r(e, ++c), d.push(e)), e }, s.pages = [], s.FONTS = {}, s.IMAGES = {}, s.GRAD_COL_FUNCTIONS = {}, s.GRAD_OPC_FUNCTIONS = {}, s.GRAD_COL = {}, s.GRAD_OPC = {}, n = s.attach(new Y), a = s.attach(new Q), n.setPages(a), s.addPage = function(e) { var t, n, r, l = o(function(t, n) { return e && null != e[t] ? e[t] : n }), c = l.paperSize, d = l.margin, u = c[0], h = c[1]; return d && (u -= d.left + d.right, h -= d.top + d.bottom), t = new $(i(), null, !0), n = { Contents: s.attach(t), Parent: a, MediaBox: [0, 0, c[0], c[1]] }, r = new J(s, n), r._content = t, a.addPage(s.attach(r)), r.transform(1, 0, 0, -1, 0, c[1]), d && (r.translate(d.left, d.top), r.rect(0, 0, u, h), r.clip()), s.pages.push(r), r }, s.render = function() { var e, i; for (l("%PDF-1.4", it, "%ÂÁÚÏÎ", it, it), e = 0; d.length > e; ++e) d[e].renderFull(l), l(it, it); for (i = l.offset(), l("xref", it, 0, " ", d.length + 1, it), l("0000000000 65535 f ", it), e = 0; d.length > e; ++e) l(h(d[e]._offset, 10), " 00000 n ", it); return l(it), l("trailer", it), l(new q({ Size: d.length + 1, Root: n, Info: new q({ Producer: new U(t("producer", "Kendo UI PDF Generator")), Title: new U(t("title", "")), Author: new U(t("author", "")), Subject: new U(t("subject", "")), Keywords: new U(t("keywords", "")), Creator: new U(t("creator", "Kendo UI PDF Generator")), CreationDate: t("date", new Date) }) }), it, it), l("startxref", it, i, it), l("%%EOF", it), l.stream().offset(0) } } function s(t, n) { function i() { e.console && (e.console.error ? e.console.error("Cannot load URL: %s", t) : e.console.log("Cannot load URL: %s", t)), n(null) } var r = new XMLHttpRequest; r.open("GET", t, !0), nt && (r.responseType = "arraybuffer"), r.onload = function() { 200 == r.status || 304 == r.status ? n(nt ? new Uint8Array(r.response) : new VBArray(r.responseBody).toArray()) : i() }, r.onerror = i, r.send(null) } function l(e, t) { var n = st[e]; n ? t(n) : s(e, function(n) { if (null == n) throw Error("Cannot load font from " + e); var i = new tt.pdf.TTFFont(n); st[e] = i, t(i) }) } function c(e, t) { function i(e) { c.src = e, c.complete && !tt.support.browser.msie ? o() : (c.onload = o, c.onerror = r) } function r() { t(lt[e] = "TAINTED") } function o() { var i, o, l, d, u, h, p, f, g, m, v, _; if (s && /^image\/jpe?g$/i.test(s.type)) return i = new FileReader, i.onload = function() { c = new C(c.width, c.height, z(new Uint8Array(this.result))), URL.revokeObjectURL(a), t(lt[e] = c) }, i.readAsArrayBuffer(s), n; o = document.createElement("canvas"), o.width = c.width, o.height = c.height, l = o.getContext("2d"), l.drawImage(c, 0, 0); try { d = l.getImageData(0, 0, c.width, c.height) } catch (w) { return r() } finally { a && URL.revokeObjectURL(a) } for (u = !1, h = z(), p = z(), f = d.data, g = 0; f.length > g;) h.writeByte(f[g++]), h.writeByte(f[g++]), h.writeByte(f[g++]), m = f[g++], 255 > m && (u = !0), p.writeByte(m); u ? c = new S(c.width, c.height, h, p) : (v = o.toDataURL("image/jpeg"), v = v.substr(v.indexOf(";base64,") + 8), _ = z(), _.writeBase64(v), _.offset(0), c = new C(c.width, c.height, _)), t(lt[e] = c) } var a, s, l, c = lt[e]; c ? t(c) : (c = new Image, /^data:/i.test(e) || (c.crossOrigin = "Anonymous"), nt && !/^data:/i.test(e) ? (l = new XMLHttpRequest, l.onload = function() { s = l.response, a = URL.createObjectURL(s), i(a) }, l.onerror = r, l.open("GET", e, !0), l.responseType = "blob", l.send()) : i(e)) } function d(e) { return function(t, n) { var i = t.length, r = i; if (0 === i) return n(); for (; r-- > 0;) e(t[r], function() { 0 === --i && n() }) } } function u(e, t, n) { for (; t > e.length;) e = n + e; return e } function h(e, t) { return u(e + "", t, "0") } function p(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } function f(e) { return e instanceof Date } function g(e, t) { t("["), e.length > 0 && t.withIndent(function() { for (var n = 0; e.length > n; ++n) n > 0 && n % 8 === 0 ? t.indent(e[n]) : t(" ", e[n]) }), t(" ]") } function m(e, t) { t("(D:", h(e.getUTCFullYear(), 4), h(e.getUTCMonth() + 1, 2), h(e.getUTCDate(), 2), h(e.getUTCHours(), 2), h(e.getUTCMinutes(), 2), h(e.getUTCSeconds(), 2), "Z)") } function v(e) { return e * (72 / 25.4) } function _(e) { return v(10 * e) } function w(e) { return 72 * e } function b(e, n) { var i, r; if ("number" == typeof e) return e; if ("string" == typeof e && (i = /^\s*([0-9.]+)\s*(mm|cm|in|pt)\s*$/.exec(e), i && (r = t(i[1]), !isNaN(r)))) return "pt" == i[2] ? r : { mm: v, cm: _, "in": w }[i[2]](r); if (null != n) return n; throw Error("Can't parse unit: " + e) } function y() {} function k(e, t, n) { n || (n = y), e.prototype = new n; for (var i in t) p(t, i) && (e.prototype[i] = t[i]); return e } function x(e) { return p(G, e) ? G[e] : G[e] = new j(e) } function C(e, t, n) { this.asStream = function() { var i = new $(n, { Type: x("XObject"), Subtype: x("Image"), Width: e, Height: t, BitsPerComponent: 8, ColorSpace: x("DeviceRGB"), Filter: x("DCTDecode") }); return i._resourceName = x("I" + ++rt), i } } function S(e, t, n, i) { this.asStream = function(r) { var o = new $(i, { Type: x("XObject"), Subtype: x("Image"), Width: e, Height: t, BitsPerComponent: 8, ColorSpace: x("DeviceGray") }, !0), a = new $(n, { Type: x("XObject"), Subtype: x("Image"), Width: e, Height: t, BitsPerComponent: 8, ColorSpace: x("DeviceRGB"), SMask: r.attach(o) }, !0); return a._resourceName = x("I" + ++rt), a } } function T(e) { return e.map(function(e) { return V(e) ? T(e) : "number" == typeof e ? (Math.round(1e3 * e) / 1e3).toFixed(3) : e }).join(" ") } function D(e, t, n, i, r, o, a) { var s = T([t, n, i, r, o, a]), l = e.GRAD_COL_FUNCTIONS[s]; return l || (l = e.GRAD_COL_FUNCTIONS[s] = e.attach(new q({ FunctionType: 2, Domain: [0, 1], Range: [0, 1, 0, 1, 0, 1], N: 1, C0: [t, n, i], C1: [r, o, a] }))), l } function A(e, t, n) { var i = T([t, n]), r = e.GRAD_OPC_FUNCTIONS[i]; return r || (r = e.GRAD_OPC_FUNCTIONS[i] = e.attach(new q({ FunctionType: 2, Domain: [0, 1], Range: [0, 1], N: 1, C0: [t], C1: [n] }))), r } function E(e, t) { function n(e) { return 1 == e.length ? e[0] : { FunctionType: 3, Functions: e, Domain: [0, 1], Bounds: u, Encode: h } } var i, r, o, a, s, l = !1, c = [], d = [], u = [], h = []; for (i = 1; t.length > i; ++i) r = t[i - 1], o = t[i], a = r.color, s = o.color, d.push(D(e, a.r, a.g, a.b, s.r, s.g, s.b)), (1 > a.a || 1 > s.a) && (l = !0), u.push(o.offset), h.push(0, 1); if (l) for (i = 1; t.length > i; ++i) r = t[i - 1], o = t[i], a = r.color, s = o.color, c.push(A(e, a.a, s.a)); return u.pop(), { hasAlpha: l, colors: n(d), opacities: l ? n(c) : null } } function I(e, t, n, i, r, o) { var a, s, l; return o || (l = [t].concat(i), n.forEach(function(e) { l.push(e.offset, e.color.r, e.color.g, e.color.b) }), s = T(l), a = e.GRAD_COL[s]), a || (a = new q({ Type: x("Shading"), ShadingType: t ? 3 : 2, ColorSpace: x("DeviceRGB"), Coords: i, Domain: [0, 1], Function: r, Extend: [!0, !0] }), e.attach(a), a._resourceName = "S" + ++rt, s && (e.GRAD_COL[s] = a)), a } function P(e, t, n, i, r, o) { var a, s, l; return o || (l = [t].concat(i), n.forEach(function(e) { l.push(e.offset, e.color.a) }), s = T(l), a = e.GRAD_OPC[s]), a || (a = new q({ Type: x("ExtGState"), AIS: !1, CA: 1, ca: 1, SMask: { Type: x("Mask"), S: x("Luminosity"), G: e.attach(new $("/a0 gs /s0 sh", { Type: x("XObject"), Subtype: x("Form"), FormType: 1, BBox: o ? [o.left, o.top + o.height, o.left + o.width, o.top] : [0, 1, 1, 0], Group: { Type: x("Group"), S: x("Transparency"), CS: x("DeviceGray"), I: !0 }, Resources: { ExtGState: { a0: { CA: 1, ca: 1 } }, Shading: { s0: { ColorSpace: x("DeviceGray"), Coords: i, Domain: [0, 1], ShadingType: t ? 3 : 2, Function: r, Extend: [!0, !0] } } } })) } }), e.attach(a), a._resourceName = "O" + ++rt, s && (e.GRAD_OPC[s] = a)), a } function M(e, t, n) { var i = "radial" == t.type, r = E(e, t.stops), o = i ? [t.start.x, t.start.y, t.start.r, t.end.x, t.end.y, t.end.r] : [t.start.x, t.start.y, t.end.x, t.end.y], a = I(e, i, t.stops, o, r.colors, t.userSpace && n), s = r.hasAlpha ? P(e, i, t.stops, o, r.opacities, t.userSpace && n) : null; return { hasAlpha: r.hasAlpha, shading: a, opacity: s } } function z(t) { function n() { return T >= D } function i() { return D > T ? t[T++] : 0 } function r(e) { y(T), t[T++] = 255 & e, T > D && (D = T) } function o() { return i() << 8 | i() } function a(e) { r(e >> 8), r(e) } function s() { var e = o(); return e >= 32768 ? e - 65536 : e } function l(e) { a(0 > e ? e + 65536 : e) } function c() { return 65536 * o() + o() } function d(e) { a(e >>> 16 & 65535), a(65535 & e) } function u() { var e = c(); return e >= 2147483648 ? e - 4294967296 : e } function h(e) { d(0 > e ? e + 4294967296 : e) } function p() { return c() / 65536 } function f(e) { d(Math.round(65536 * e)) } function g() { return u() / 65536 } function m(e) { h(Math.round(65536 * e)) } function v(e) { return b(e, i) } function _(e) { return String.fromCharCode.apply(String, v(e)) } function w(e) { for (var t = 0; e.length > t; ++t) r(e.charCodeAt(t)) } function b(e, t) { for (var n = Array(e), i = 0; e > i; ++i) n[i] = t(); return n } var y, k, x, C, S, T = 0, D = 0; return null == t ? t = nt ? new Uint8Array(256) : [] : D = t.length, y = nt ? function(e) { if (e >= t.length) { var n = new Uint8Array(Math.max(e + 256, 2 * t.length)); n.set(t, 0), t = n } } : function() {}, k = nt ? function() { return new Uint8Array(t.buffer, 0, D) } : function() { return t }, x = nt ? function(e) { if ("string" == typeof e) return w(e); var n = e.length; y(T + n), t.set(e, T), T += n, T > D && (D = T) } : function(e) { if ("string" == typeof e) return w(e); for (var t = 0; e.length > t; ++t) r(e[t]) }, C = nt ? function(e, n) { if (t.buffer.slice) return new Uint8Array(t.buffer.slice(e, e + n)); var i = new Uint8Array(n); return i.set(new Uint8Array(t.buffer, e, n)), i } : function(e, n) { return t.slice(e, e + n) }, S = { eof: n, readByte: i, writeByte: r, readShort: o, writeShort: a, readLong: c, writeLong: d, readFixed: p, writeFixed: f, readShort_: s, writeShort_: l, readLong_: u, writeLong_: h, readFixed_: g, writeFixed_: m, read: v, write: x, readString: _, writeString: w, times: b, get: k, slice: C, offset: function(e) { return null != e ? (T = e, S) : T }, skip: function(e) { T += e }, toString: function() { throw Error("FIX CALLER. BinaryStream is no longer convertible to string!") }, length: function() { return D }, saveExcursion: function(e) { var t = T; try { return e() } finally { T = t } }, writeBase64: function(t) { e.atob ? w(e.atob(t)) : x(ot.decode(t)) }, base64: function() { return ot.encode(k()) } } } function F(e) { return e.replace(/^\s*(['"])(.*)\1\s*$/, "$2") } function R(e) { var t, n = /^\s*((normal|italic)\s+)?((normal|small-caps)\s+)?((normal|bold|\d+)\s+)?(([0-9.]+)(px|pt))(\/(([0-9.]+)(px|pt)|normal))?\s+(.*?)\s*$/i, i = n.exec(e); return i ? (t = i[8] ? parseInt(i[8], 10) : 12, { italic: i[2] && "italic" == i[2].toLowerCase(), variant: i[4], bold: i[6] && /bold|700/i.test(i[6]), fontSize: t, lineHeight: i[12] ? "normal" == i[12] ? t : parseInt(i[12], 10) : null, fontFamily: i[14].split(/\s*,\s*/g).map(F) }) : { fontSize: 12, fontFamily: "sans-serif" } } function H(e) { function t(t) { return e.bold && (t += "|bold"), e.italic && (t += "|italic"), t.toLowerCase() } var n, i, r, o = e.fontFamily; if (o instanceof Array) for (r = 0; o.length > r && (n = t(o[r]), !(i = et[n])); ++r); else i = et[o.toLowerCase()]; for (; "function" == typeof i;) i = i(); return i || (i = "Times-Roman"), i } function B(e, t) { e = e.toLowerCase(), et[e] = function() { return et[t] }, et[e + "|bold"] = function() { return et[t + "|bold"] }, et[e + "|italic"] = function() { return et[t + "|italic"] }, et[e + "|bold|italic"] = function() { return et[t + "|bold|italic"] } } function L(e, t) { if (1 == arguments.length) for (var n in e) p(e, n) && L(n, e[n]); else switch (e = e.toLowerCase(), et[e] = t, e) { case "dejavu sans": et["sans-serif"] = t; break; case "dejavu sans|bold": et["sans-serif|bold"] = t; break; case "dejavu sans|italic": et["sans-serif|italic"] = t; break; case "dejavu sans|bold|italic": et["sans-serif|bold|italic"] = t; break; case "dejavu serif": et.serif = t; break; case "dejavu serif|bold": et["serif|bold"] = t; break; case "dejavu serif|italic": et["serif|italic"] = t; break; case "dejavu serif|bold|italic": et["serif|bold|italic"] = t; break; case "dejavu mono": et.monospace = t; break; case "dejavu mono|bold": et["monospace|bold"] = t; break; case "dejavu mono|italic": et["monospace|italic"] = t; break; case "dejavu mono|bold|italic": et["monospace|bold|italic"] = t } } function N(e, t) { var n = e[0], i = e[1], r = e[2], o = e[3], a = e[4], s = e[5], l = t[0], c = t[1], d = t[2], u = t[3], h = t[4], p = t[5]; return [n * l + i * d, n * c + i * u, r * l + o * d, r * c + o * u, a * l + s * d + h, a * c + s * u + p] } function O(e) { return 1 === e[0] && 0 === e[1] && 0 === e[2] && 1 === e[3] && 0 === e[4] && 0 === e[5] } var V, U, W, j, G, q, $, Y, Q, K, X, Z, J, et, tt = e.kendo, nt = !!e.Uint8Array, it = "\n", rt = 0, ot = function() { var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; return { decode: function(t) { for (var n, i, r, o, a, s, l, c = t.replace(/[^A-Za-z0-9\+\/\=]/g, ""), d = 0, u = c.length, h = []; u > d;) n = e.indexOf(c.charAt(d++)), i = e.indexOf(c.charAt(d++)), r = e.indexOf(c.charAt(d++)), o = e.indexOf(c.charAt(d++)), a = n << 2 | i >>> 4, s = (15 & i) << 4 | r >>> 2, l = (3 & r) << 6 | o, h.push(a), 64 != r && h.push(s), 64 != o && h.push(l); return h }, encode: function(t) { for (var n, i, r, o, a, s, l, c = 0, d = t.length, u = ""; d > c;) n = t[c++], i = t[c++], r = t[c++], o = n >>> 2, a = (3 & n) << 4 | i >>> 4, s = (15 & i) << 2 | r >>> 6, l = 63 & r, c - d == 2 ? s = l = 64 : c - d == 1 && (l = 64), u += e.charAt(o) + e.charAt(a) + e.charAt(s) + e.charAt(l); return u } } }(), at = { a0: [2383.94, 3370.39], a1: [1683.78, 2383.94], a2: [1190.55, 1683.78], a3: [841.89, 1190.55], a4: [595.28, 841.89], a5: [419.53, 595.28], a6: [297.64, 419.53], a7: [209.76, 297.64], a8: [147.4, 209.76], a9: [104.88, 147.4], a10: [73.7, 104.88], b0: [2834.65, 4008.19], b1: [2004.09, 2834.65], b2: [1417.32, 2004.09], b3: [1000.63, 1417.32], b4: [708.66, 1000.63], b5: [498.9, 708.66], b6: [354.33, 498.9], b7: [249.45, 354.33], b8: [175.75, 249.45], b9: [124.72, 175.75], b10: [87.87, 124.72], c0: [2599.37, 3676.54], c1: [1836.85, 2599.37], c2: [1298.27, 1836.85], c3: [918.43, 1298.27], c4: [649.13, 918.43], c5: [459.21, 649.13], c6: [323.15, 459.21], c7: [229.61, 323.15], c8: [161.57, 229.61], c9: [113.39, 161.57], c10: [79.37, 113.39], executive: [521.86, 756], folio: [612, 936], legal: [612, 1008], letter: [612, 792], tabloid: [792, 1224] }, st = { "Times-Roman": !0, "Times-Bold": !0, "Times-Italic": !0, "Times-BoldItalic": !0, Helvetica: !0, "Helvetica-Bold": !0, "Helvetica-Oblique": !0, "Helvetica-BoldOblique": !0, Courier: !0, "Courier-Bold": !0, "Courier-Oblique": !0, "Courier-BoldOblique": !0, Symbol: !0, ZapfDingbats: !0 }, lt = {}, ct = d(l), dt = d(c); a.prototype = { loadFonts: ct, loadImages: dt, getFont: function(e) { var t = this.FONTS[e]; if (!t) { if (t = st[e], !t) throw Error("Font " + e + " has not been loaded"); t = this.attach(t === !0 ? new K(e) : new X(this, t)), this.FONTS[e] = t } return t }, getImage: function(e) { var t = this.IMAGES[e]; if (!t) { if (t = lt[e], !t) throw Error("Image " + e + " has not been loaded"); if ("TAINTED" === t) return null; t = this.IMAGES[e] = this.attach(t.asStream(this)) } return t }, getOpacityGS: function(e, n) { var i, r, o, a = t(e).toFixed(3); return e = t(a), a += n ? "S" : "F", i = this._opacityGSCache || (this._opacityGSCache = {}), r = i[a], r || (o = { Type: x("ExtGState") }, n ? o.CA = e : o.ca = e, r = this.attach(new q(o)), r._resourceName = x("GS" + ++rt), i[a] = r), r }, dict: function(e) { return new q(e) }, name: function(e) { return x(e) }, stream: function(e, t) { return new $(t, e) } }, V = Array.isArray || function(e) { return e instanceof Array }, y.prototype.beforeRender = function() {}, U = k(function(e) { this.value = e }, { render: function(e) { var t, n = "", i = this.escape(); for (t = 0; i.length > t; ++t) n += String.fromCharCode(255 & i.charCodeAt(t)); e("(", n, ")") }, escape: function() { return this.value.replace(/([\(\)\\])/g, "\\$1") }, toString: function() { return this.value } }), W = k(function(e) { this.value = e }, { render: function(e) { e("<"); for (var t = 0; this.value.length > t; ++t) e(h(this.value.charCodeAt(t).toString(16), 4)); e(">") } }, U), j = k(function(e) { this.name = e }, { render: function(e) { e("/" + this.escape()) }, escape: function() { return this.name.replace(/[^\x21-\x7E]/g, function(e) { return "#" + h(e.charCodeAt(0).toString(16), 2) }) }, toString: function() { return this.name } }), G = {}, j.get = x, q = k(function(e) { this.props = e }, { render: function(e) { var t = this.props, n = !0; e("<<"), e.withIndent(function() { for (var i in t) p(t, i) && !/^_/.test(i) && (n = !1, e.indent(x(i), " ", t[i])) }), n || e.indent(), e(">>") } }), $ = k(function(e, t, n) { if ("string" == typeof e) { var i = z(); i.write(e), e = i } this.data = e, this.props = t || {}, this.compress = n }, { render: function(t) { var n = this.data.get(), i = this.props; this.compress && e.pako && "function" == typeof e.pako.deflate && (i.Filter ? i.Filter instanceof Array || (i.Filter = [i.Filter]) : i.Filter = [], i.Filter.unshift(x("FlateDecode")), n = e.pako.deflate(n)), i.Length = n.length, t(new q(i), " stream", it), t.writeData(n), t(it, "endstream") } }), Y = k(function(e) { e = this.props = e || {}, e.Type = x("Catalog") }, { setPages: function(e) { this.props.Pages = e } }, q), Q = k(function() { this.props = { Type: x("Pages"), Kids: [], Count: 0 } }, { addPage: function(e) { this.props.Kids.push(e), this.props.Count++ } }, q), K = k(function(e) { this.props = { Type: x("Font"), Subtype: x("Type1"), BaseFont: x(e) }, this._resourceName = x("F" + ++rt) }, { encodeText: function(e) { return new U(e + "") } }, q), X = k(function(e, t, n) { var i, r; n = this.props = n || {}, n.Type = x("Font"), n.Subtype = x("Type0"), n.Encoding = x("Identity-H"), this._pdf = e, this._font = t, this._sub = t.makeSubset(), this._resourceName = x("F" + ++rt), i = t.head, this.name = t.psName, r = this.scale = t.scale, this.bbox = [i.xMin * r, i.yMin * r, i.xMax * r, i.yMax * r], this.italicAngle = t.post.italicAngle, this.ascent = t.ascent * r, this.descent = t.descent * r, this.lineGap = t.lineGap * r, this.capHeight = t.os2.capHeight || this.ascent, this.xHeight = t.os2.xHeight || 0, this.stemV = 0, this.familyClass = (t.os2.familyClass || 0) >> 8, this.isSerif = this.familyClass >= 1 && 7 >= this.familyClass, this.isScript = 10 == this.familyClass, this.flags = (t.post.isFixedPitch ? 1 : 0) | (this.isSerif ? 2 : 0) | (this.isScript ? 8 : 0) | (0 !== this.italicAngle ? 64 : 0) | 32 }, { encodeText: function(e) { return new W(this._sub.encodeText(e + "")) }, getTextWidth: function(e, t) { var n, i, r = 0, o = this._font.cmap.getUnicodeEntry().codeMap; for (n = 0; t.length > n; ++n) i = o[t.charCodeAt(n)], r += this._font.widthOfGlyph(i || 0); return r * e / 1e3 }, beforeRender: function() { var e, t, n, r, o = this, a = o._sub, s = a.render(), l = new $(z(s), { Length1: s.length }, !0), c = o._pdf.attach(new q({ Type: x("FontDescriptor"), FontName: x(o._sub.psName), FontBBox: o.bbox, Flags: o.flags, StemV: o.stemV, ItalicAngle: o.italicAngle, Ascent: o.ascent, Descent: o.descent, CapHeight: o.capHeight, XHeight: o.xHeight, FontFile2: o._pdf.attach(l) })), d = a.ncid2ogid, u = a.firstChar, h = a.lastChar, p = []; ! function f(e, t) { if (h >= e) { var n = d[e]; null == n ? f(e + 1) : (t || p.push(e, t = []), t.push(o._font.widthOfGlyph(n)), f(e + 1, t)) } }(u), e = new q({ Type: x("Font"), Subtype: x("CIDFontType2"), BaseFont: x(o._sub.psName), CIDSystemInfo: new q({ Registry: new U("Adobe"), Ordering: new U("Identity"), Supplement: 0 }), FontDescriptor: c, FirstChar: u, LastChar: h, DW: Math.round(o._font.widthOfGlyph(0)), W: p, CIDToGIDMap: o._pdf.attach(o._makeCidToGidMap()) }), t = o.props, t.BaseFont = x(o._sub.psName), t.DescendantFonts = [o._pdf.attach(e)], n = new Z(u, h, a.subset), r = new $(i(), null, !0), r.data(n), t.ToUnicode = o._pdf.attach(r) }, _makeCidToGidMap: function() { return new $(z(this._sub.cidToGidMap()), null, !0) } }, q), Z = k(function(e, t, n) { this.firstChar = e, this.lastChar = t, this.map = n }, { render: function(e) { e.indent("/CIDInit /ProcSet findresource begin"), e.indent("12 dict begin"), e.indent("begincmap"), e.indent("/CIDSystemInfo <<"), e.indent(" /Registry (Adobe)"), e.indent(" /Ordering (UCS)"), e.indent(" /Supplement 0"), e.indent(">> def"), e.indent("/CMapName /Adobe-Identity-UCS def"), e.indent("/CMapType 2 def"), e.indent("1 begincodespacerange"), e.indent(" <0000><ffff>"), e.indent("endcodespacerange"); var t = this; e.indent(t.lastChar - t.firstChar + 1, " beginbfchar"), e.withIndent(function() { var n, i; for (n = t.firstChar; t.lastChar >= n; ++n) i = t.map[n], e.indent("<", h(n.toString(16), 4), ">", "<", h(i.toString(16), 4), ">") }), e.indent("endbfchar"), e.indent("endcmap"), e.indent("CMapName currentdict /CMap defineresource pop"), e.indent("end"), e.indent("end") } }), J = k(function(e, t) { this._pdf = e, this._rcount = 0, this._textMode = !1, this._fontResources = {}, this._gsResources = {}, this._xResources = {}, this._patResources = {}, this._shResources = {}, this._opacity = 1, this._matrix = [1, 0, 0, 1, 0, 0], this._annotations = [], this._font = null, this._fontSize = null, this._contextStack = [], t = this.props = t || {}, t.Type = x("Page"), t.ProcSet = [x("PDF"), x("Text"), x("ImageB"), x("ImageC"), x("ImageI")], t.Resources = new q({ Font: new q(this._fontResources), ExtGState: new q(this._gsResources), XObject: new q(this._xResources), Pattern: new q(this._patResources), Shading: new q(this._shResources) }), t.Annots = this._annotations }, { _out: function() { this._content.data.apply(null, arguments) }, transform: function(e, t, n, i, r, o) { O(arguments) || (this._matrix = N(arguments, this._matrix), this._out(e, " ", t, " ", n, " ", i, " ", r, " ", o, " cm"), this._out(it)) }, translate: function(e, t) { this.transform(1, 0, 0, 1, e, t) }, scale: function(e, t) { this.transform(e, 0, 0, t, 0, 0) }, rotate: function(e) { var t = Math.cos(e), n = Math.sin(e); this.transform(t, n, -n, t, 0, 0) }, beginText: function() { this._textMode = !0, this._out("BT", it) }, endText: function() { this._textMode = !1, this._out("ET", it) }, _requireTextMode: function() { if (!this._textMode) throw Error("Text mode required; call page.beginText() first") }, _requireFont: function() { if (!this._font) throw Error("No font selected; call page.setFont() first") }, setFont: function(e, t) { this._requireTextMode(), null == e ? e = this._font : e instanceof X || (e = this._pdf.getFont(e)), null == t && (t = this._fontSize), this._fontResources[e._resourceName] = e, this._font = e, this._fontSize = t, this._out(e._resourceName, " ", t, " Tf", it) }, setTextLeading: function(e) { this._requireTextMode(), this._out(e, " TL", it) }, setTextRenderingMode: function(e) { this._requireTextMode(), this._out(e, " Tr", it) }, showText: function(e, t) { var n, i; this._requireFont(), e.length > 1 && t && this._font instanceof X && (n = this._font.getTextWidth(this._fontSize, e), i = t / n * 100, this._out(i, " Tz ")), this._out(this._font.encodeText(e), " Tj", it) }, showTextNL: function(e) { this._requireFont(), this._out(this._font.encodeText(e), " '", it) }, addLink: function(e, t) { var n = this._toPage({ x: t.left, y: t.bottom }), i = this._toPage({ x: t.right, y: t.top }); this._annotations.push(new q({ Type: x("Annot"), Subtype: x("Link"), Rect: [n.x, n.y, i.x, i.y], Border: [0, 0, 0], A: new q({ Type: x("Action"), S: x("URI"), URI: new U(e) }) })) }, setStrokeColor: function(e, t, n) { this._out(e, " ", t, " ", n, " RG", it) }, setOpacity: function(e) { this.setFillOpacity(e), this.setStrokeOpacity(e), this._opacity *= e }, setStrokeOpacity: function(e) { if (1 > e) { var t = this._pdf.getOpacityGS(this._opacity * e, !0); this._gsResources[t._resourceName] = t, this._out(t._resourceName, " gs", it) } }, setFillColor: function(e, t, n) { this._out(e, " ", t, " ", n, " rg", it) }, setFillOpacity: function(e) { if (1 > e) { var t = this._pdf.getOpacityGS(this._opacity * e, !1); this._gsResources[t._resourceName] = t, this._out(t._resourceName, " gs", it) } }, gradient: function(e, t) { var n, i, r; this.save(), this.rect(t.left, t.top, t.width, t.height), this.clip(), e.userSpace || this.transform(t.width, 0, 0, t.height, t.left, t.top), n = M(this._pdf, e, t), i = n.shading._resourceName, this._shResources[i] = n.shading, n.hasAlpha && (r = n.opacity._resourceName, this._gsResources[r] = n.opacity, this._out("/" + r + " gs ")), this._out("/" + i + " sh", it), this.restore() }, setDashPattern: function(e, t) { this._out(e, " ", t, " d", it) }, setLineWidth: function(e) { this._out(e, " w", it) }, setLineCap: function(e) { this._out(e, " J", it) }, setLineJoin: function(e) { this._out(e, " j", it) }, setMitterLimit: function(e) { this._out(e, " M", it) }, save: function() { this._contextStack.push(this._context()), this._out("q", it) }, restore: function() { this._out("Q", it), this._context(this._contextStack.pop()) }, moveTo: function(e, t) { this._out(e, " ", t, " m", it) }, lineTo: function(e, t) { this._out(e, " ", t, " l", it) }, bezier: function(e, t, n, i, r, o) { this._out(e, " ", t, " ", n, " ", i, " ", r, " ", o, " c", it) }, bezier1: function(e, t, n, i) { this._out(e, " ", t, " ", n, " ", i, " y", it) }, bezier2: function(e, t, n, i) { this._out(e, " ", t, " ", n, " ", i, " v", it) }, close: function() { this._out("h", it) }, rect: function(e, t, n, i) { this._out(e, " ", t, " ", n, " ", i, " re", it) }, ellipse: function(e, t, n, i) { function r(t) { return e + t } function o(e) { return t + e } var a = .5522847498307936; this.moveTo(r(0), o(i)), this.bezier(r(n * a), o(i), r(n), o(i * a), r(n), o(0)), this.bezier(r(n), o(-i * a), r(n * a), o(-i), r(0), o(-i)), this.bezier(r(-n * a), o(-i), r(-n), o(-i * a), r(-n), o(0)), this.bezier(r(-n), o(i * a), r(-n * a), o(i), r(0), o(i)) }, circle: function(e, t, n) { this.ellipse(e, t, n, n) }, stroke: function() { this._out("S", it) }, nop: function() { this._out("n", it) }, clip: function() { this._out("W n", it) }, clipStroke: function() { this._out("W S", it) }, closeStroke: function() { this._out("s", it) }, fill: function() { this._out("f", it) }, fillStroke: function() { this._out("B", it) }, drawImage: function(e) { var t = this._pdf.getImage(e); t && (this._xResources[t._resourceName] = t, this._out(t._resourceName, " Do", it)) }, comment: function(e) { var t = this; e.split(/\r?\n/g).forEach(function(e) { t._out("% ", e, it) }) }, _context: function(e) { return null == e ? { opacity: this._opacity, matrix: this._matrix } : (this._opacity = e.opacity, this._matrix = e.matrix, n) }, _toPage: function(e) { var t = this._matrix, n = t[0], i = t[1], r = t[2], o = t[3], a = t[4], s = t[5]; return { x: n * e.x + r * e.y + a, y: i * e.x + o * e.y + s } } }, q), et = { serif: "Times-Roman", "serif|bold": "Times-Bold", "serif|italic": "Times-Italic", "serif|bold|italic": "Times-BoldItalic", "sans-serif": "Helvetica", "sans-serif|bold": "Helvetica-Bold", "sans-serif|italic": "Helvetica-Oblique", "sans-serif|bold|italic": "Helvetica-BoldOblique", monospace: "Courier", "monospace|bold": "Courier-Bold", "monospace|italic": "Courier-Oblique", "monospace|bold|italic": "Courier-BoldOblique", zapfdingbats: "ZapfDingbats", "zapfdingbats|bold": "ZapfDingbats", "zapfdingbats|italic": "ZapfDingbats", "zapfdingbats|bold|italic": "ZapfDingbats" }, B("Times New Roman", "serif"), B("Courier New", "monospace"), B("Arial", "sans-serif"), B("Helvetica", "sans-serif"), B("Verdana", "sans-serif"), B("Tahoma", "sans-serif"), B("Georgia", "sans-serif"), B("Monaco", "monospace"), B("Andale Mono", "monospace"), tt.pdf = { Document: a, BinaryStream: z, defineFont: L, parseFontDef: R, getFontURL: H, loadFonts: ct, loadImages: dt, getPaperOptions: o, TEXT_RENDERING_MODE: { fill: 0, stroke: 1, fillAndStroke: 2, invisible: 3, fillAndClip: 4, strokeAndClip: 5, fillStrokeClip: 6, clip: 7 } } }(window, parseFloat), function(e) { "use strict"; function t(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } function n(e) { return Object.keys(e).sort(function(e, t) { return e - t }).map(parseFloat) } function i(e) { var t, n, i; for (this.raw = e, this.scalerType = e.readLong(), this.tableCount = e.readShort(), this.searchRange = e.readShort(), this.entrySelector = e.readShort(), this.rangeShift = e.readShort(), t = this.tables = {}, n = 0; this.tableCount > n; ++n) i = { tag: e.readString(4), checksum: e.readLong(), offset: e.readLong(), length: e.readLong() }, t[i.tag] = i } function r(e) { function n(e, t) { this.definition = t, this.length = t.length, this.offset = t.offset, this.file = e, this.rawData = e.raw, this.parse(e.raw) } n.prototype.raw = function() { return this.rawData.slice(this.offset, this.length) }; for (var i in e) t(e, i) && (n[i] = n.prototype[i] = e[i]); return n } function o() { var e, t = "", n = _ + ""; for (e = 0; n.length > e; ++e) t += String.fromCharCode(n.charCodeAt(e) - 48 + 65); return ++_, t } function a(e) { this.font = e, this.subset = {}, this.unicodes = {}, this.ogid2ngid = { 0: 0 }, this.ngid2ogid = { 0: 0 }, this.ncid2ogid = {}, this.next = this.firstChar = 1, this.nextGid = 1, this.psName = o() + "+" + this.font.psName } function s(e, t) { var n, i, r, o, a = this, s = a.contents = b(e); if ("ttcf" == s.readString(4)) { if (!t) throw Error("Must specify a name for TTC files"); for (n = s.readLong(), i = s.readLong(), r = 0; i > r; ++r) if (o = s.readLong(), s.saveExcursion(function() { s.offset(o), a.parse() }), a.psName == t) return; throw Error("Font " + t + " not found in collection") } s.offset(0), a.parse() } var l, c, d, u, h, p, f, g, m, v, _, w = e.kendo.pdf, b = w.BinaryStream; i.prototype = { readTable: function(e, t) { var n = this.tables[e]; if (!n) throw Error("Table " + e + " not found in directory"); return this[e] = n.table = new t(this, n) }, render: function(e) { var n, i, r, o, a, s, l, c, d = Object.keys(e).length, u = Math.pow(2, Math.floor(Math.log(d) / Math.LN2)), h = 16 * u, p = Math.floor(Math.log(u) / Math.LN2), f = 16 * d - h, g = b(); g.writeLong(this.scalerType), g.writeShort(d), g.writeShort(h), g.writeShort(p), g.writeShort(f), n = 16 * d, i = g.offset() + n, r = null, o = b(); for (a in e) if (t(e, a)) for (s = e[a], g.writeString(a), g.writeLong(this.checksum(s)), g.writeLong(i), g.writeLong(s.length), o.write(s), "head" == a && (r = i), i += s.length; i % 4;) o.writeByte(0), i++; return g.write(o.get()), l = this.checksum(g.get()), c = 2981146554 - l, g.offset(r + 8), g.writeLong(c), g.get() }, checksum: function(e) { e = b(e); for (var t = 0; !e.eof();) t += e.readLong(); return 4294967295 & t } }, l = r({ parse: function(e) { e.offset(this.offset), this.version = e.readLong(), this.revision = e.readLong(), this.checkSumAdjustment = e.readLong(), this.magicNumber = e.readLong(), this.flags = e.readShort(), this.unitsPerEm = e.readShort(), this.created = e.read(8), this.modified = e.read(8), this.xMin = e.readShort_(), this.yMin = e.readShort_(), this.xMax = e.readShort_(), this.yMax = e.readShort_(), this.macStyle = e.readShort(), this.lowestRecPPEM = e.readShort(), this.fontDirectionHint = e.readShort_(), this.indexToLocFormat = e.readShort_(), this.glyphDataFormat = e.readShort_() }, render: function(e) { var t = b(); return t.writeLong(this.version), t.writeLong(this.revision), t.writeLong(0), t.writeLong(this.magicNumber), t.writeShort(this.flags), t.writeShort(this.unitsPerEm), t.write(this.created), t.write(this.modified), t.writeShort_(this.xMin), t.writeShort_(this.yMin), t.writeShort_(this.xMax), t.writeShort_(this.yMax), t.writeShort(this.macStyle), t.writeShort(this.lowestRecPPEM), t.writeShort_(this.fontDirectionHint), t.writeShort_(e), t.writeShort_(this.glyphDataFormat), t.get() } }), c = r({ parse: function(e) { e.offset(this.offset); var t = this.file.head.indexToLocFormat; this.offsets = 0 === t ? e.times(this.length / 2, function() { return 2 * e.readShort() }) : e.times(this.length / 4, e.readLong) }, offsetOf: function(e) { return this.offsets[e] }, lengthOf: function(e) { return this.offsets[e + 1] - this.offsets[e] }, render: function(e) { var t, n = b(), i = e[e.length - 1] > 65535; for (t = 0; e.length > t; ++t) i ? n.writeLong(e[t]) : n.writeShort(e[t] / 2); return { format: i ? 1 : 0, table: n.get() } } }), d = r({ parse: function(e) { e.offset(this.offset), this.version = e.readLong(), this.ascent = e.readShort_(), this.descent = e.readShort_(), this.lineGap = e.readShort_(), this.advanceWidthMax = e.readShort(), this.minLeftSideBearing = e.readShort_(), this.minRightSideBearing = e.readShort_(), this.xMaxExtent = e.readShort_(), this.caretSlopeRise = e.readShort_(), this.caretSlopeRun = e.readShort_(), this.caretOffset = e.readShort_(), e.skip(8), this.metricDataFormat = e.readShort_(), this.numOfLongHorMetrics = e.readShort() }, render: function(e) { var t = b(); return t.writeLong(this.version), t.writeShort_(this.ascent), t.writeShort_(this.descent), t.writeShort_(this.lineGap), t.writeShort(this.advanceWidthMax), t.writeShort_(this.minLeftSideBearing), t.writeShort_(this.minRightSideBearing), t.writeShort_(this.xMaxExtent), t.writeShort_(this.caretSlopeRise), t.writeShort_(this.caretSlopeRun), t.writeShort_(this.caretOffset), t.write([0, 0, 0, 0, 0, 0, 0, 0]), t.writeShort_(this.metricDataFormat), t.writeShort(e.length), t.get() } }), u = r({ parse: function(e) { e.offset(this.offset), this.version = e.readLong(), this.numGlyphs = e.readShort(), this.maxPoints = e.readShort(), this.maxContours = e.readShort(), this.maxComponentPoints = e.readShort(), this.maxComponentContours = e.readShort(), this.maxZones = e.readShort(), this.maxTwilightPoints = e.readShort(), this.maxStorage = e.readShort(), this.maxFunctionDefs = e.readShort(), this.maxInstructionDefs = e.readShort(), this.maxStackElements = e.readShort(), this.maxSizeOfInstructions = e.readShort(), this.maxComponentElements = e.readShort(), this.maxComponentDepth = e.readShort() }, render: function(e) { var t = b(); return t.writeLong(this.version), t.writeShort(e.length), t.writeShort(this.maxPoints), t.writeShort(this.maxContours), t.writeShort(this.maxComponentPoints), t.writeShort(this.maxComponentContours), t.writeShort(this.maxZones), t.writeShort(this.maxTwilightPoints), t.writeShort(this.maxStorage), t.writeShort(this.maxFunctionDefs), t.writeShort(this.maxInstructionDefs), t.writeShort(this.maxStackElements), t.writeShort(this.maxSizeOfInstructions), t.writeShort(this.maxComponentElements), t.writeShort(this.maxComponentDepth), t.get() } }), h = r({ parse: function(e) { var t, n, i; e.offset(this.offset), t = this.file, n = t.hhea, this.metrics = e.times(n.numOfLongHorMetrics, function() { return { advance: e.readShort(), lsb: e.readShort_() } }), i = t.maxp.numGlyphs - t.hhea.numOfLongHorMetrics, this.leftSideBearings = e.times(i, e.readShort_) }, forGlyph: function(e) { var t = this.metrics, n = t.length; return n > e ? t[e] : { advance: t[n - 1].advance, lsb: this.leftSideBearings[e - n] } }, render: function(e) { var t, n, i = b(); for (t = 0; e.length > t; ++t) n = this.forGlyph(e[t]), i.writeShort(n.advance), i.writeShort_(n.lsb); return i.get() } }), p = function() { function e(e) { this.raw = e } function n(e) { var t, n, r; for (this.raw = e, t = this.glyphIds = [], n = this.idOffsets = [];;) { if (r = e.readShort(), n.push(e.offset()), t.push(e.readShort()), !(r & a)) break; e.skip(r & i ? 4 : 2), r & l ? e.skip(8) : r & s ? e.skip(4) : r & o && e.skip(2) } } var i, o, a, s, l, c; return e.prototype = { compound: !1, render: function() { return this.raw.get() } }, i = 1, o = 8, a = 32, s = 64, l = 128, c = 256, n.prototype = { compound: !0, render: function(e) { var t, n, i = b(this.raw.get()); for (t = 0; this.glyphIds.length > t; ++t) n = this.glyphIds[t], i.offset(this.idOffsets[t]), i.writeShort(e[n]); return i.get() } }, r({ parse: function() { this.cache = {} }, glyphFor: function(i) { var r, o, a, s, l, c, d, u, h, p, f, g = this.cache; return t(g, i) ? g[i] : (r = this.file.loca, o = r.lengthOf(i), 0 === o ? g[i] = null : (a = this.rawData, s = this.offset + r.offsetOf(i), l = b(a.slice(s, o)), c = l.readShort_(), d = l.readShort_(), u = l.readShort_(), h = l.readShort_(), p = l.readShort_(), f = g[i] = -1 == c ? new n(l) : new e(l), f.numberOfContours = c, f.xMin = d, f.yMin = u, f.xMax = h, f.yMax = p, f)) }, render: function(e, t, n) { var i, r, o, a = b(), s = []; for (i = 0; t.length > i; ++i) r = t[i], o = e[r], s.push(a.offset()), o && a.write(o.render(n)); return s.push(a.offset()), { table: a.get(), offsets: s } } }) }(), f = function() { function e(e, t) { this.text = e, this.length = e.length, this.platformID = t.platformID, this.platformSpecificID = t.platformSpecificID, this.languageID = t.languageID, this.nameID = t.nameID } return r({ parse: function(t) { var n, i, r, o, a, s, l, c; for (t.offset(this.offset), n = t.readShort(), i = t.readShort(), r = this.offset + t.readShort(), o = t.times(i, function() { return { platformID: t.readShort(), platformSpecificID: t.readShort(), languageID: t.readShort(), nameID: t.readShort(), length: t.readShort(), offset: t.readShort() + r } }), a = this.strings = {}, s = 0; o.length > s; ++s) l = o[s], t.offset(l.offset), c = t.readString(l.length), a[l.nameID] || (a[l.nameID] = []), a[l.nameID].push(new e(c, l)); this.postscriptEntry = a[6][0], this.postscriptName = this.postscriptEntry.text.replace(/[^\x20-\x7F]/g, "") }, render: function(n) { var i, r, o, a, s, l, c = this.strings, d = 0; for (i in c) t(c, i) && (d += c[i].length); r = b(), o = b(), r.writeShort(0), r.writeShort(d), r.writeShort(6 + 12 * d); for (i in c) if (t(c, i)) for (a = 6 == i ? [new e(n, this.postscriptEntry)] : c[i], s = 0; a.length > s; ++s) l = a[s], r.writeShort(l.platformID), r.writeShort(l.platformSpecificID), r.writeShort(l.languageID), r.writeShort(l.nameID), r.writeShort(l.length), r.writeShort(o.offset()), o.writeString(l.text); return r.write(o.get()), r.get() } }) }(), g = function() { var e = ".notdef .null nonmarkingreturn space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal Delta guillemotleft guillemotright ellipsis nonbreakingspace Agrave Atilde Otilde OE oe endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent ring cedilla hungarumlaut ogonek caron Lslash lslash Scaron scaron Zcaron zcaron brokenbar Eth eth Yacute yacute Thorn thorn minus multiply onesuperior twosuperior threesuperior onehalf onequarter threequarters franc Gbreve gbreve Idotaccent Scedilla scedilla Cacute cacute Ccaron ccaron dcroat".split(/\s+/g); return r({ parse: function(e) { var t, n; switch (e.offset(this.offset), this.format = e.readLong(), this.italicAngle = e.readFixed_(), this.underlinePosition = e.readShort_(), this.underlineThickness = e.readShort_(), this.isFixedPitch = e.readLong(), this.minMemType42 = e.readLong(), this.maxMemType42 = e.readLong(), this.minMemType1 = e.readLong(), this.maxMemType1 = e.readLong(), this.format) { case 65536: case 196608: break; case 131072: for (t = e.readShort(), this.glyphNameIndex = e.times(t, e.readShort), this.names = [], n = this.offset + this.length; e.offset() < n;) this.names.push(e.readString(e.readByte())); break; case 151552: t = e.readShort(), this.offsets = e.read(t); break; case 262144: this.map = e.times(this.file.maxp.numGlyphs, e.readShort) } }, glyphFor: function(t) { switch (this.format) { case 65536: return e[t] || ".notdef"; case 131072: var n = this.glyphNameIndex[t]; return e.length > n ? e[n] : this.names[n - e.length] || ".notdef"; case 151552: case 196608: return ".notdef"; case 262144: return this.map[t] || 65535 } }, render: function(t) { var n, i, r, o, a, s, l; if (196608 == this.format) return this.raw(); for (n = b(this.rawData.slice(this.offset, 32)), n.writeLong(131072), n.offset(32), i = [], r = [], o = 0; t.length > o; ++o) a = t[o], s = this.glyphFor(a), l = e.indexOf(s), l >= 0 ? i.push(l) : (i.push(e.length + r.length), r.push(s)); for (n.writeShort(t.length), o = 0; i.length > o; ++o) n.writeShort(i[o]); for (o = 0; r.length > o; ++o) n.writeByte(r[o].length), n.writeString(r[o]); return n.get() } }) }(), m = function() { function e(e, t) { var n = this; n.platformID = e.readShort(), n.platformSpecificID = e.readShort(), n.offset = t + e.readLong(), e.saveExcursion(function() { var t, i, r, o, a, s, l, c, d, u, h, p, f; switch (e.offset(n.offset), n.format = e.readShort(), n.length = e.readShort(), n.language = e.readShort(), n.isUnicode = 3 == n.platformID && 1 == n.platformSpecificID && 4 == n.format || 0 === n.platformID && 4 == n.format, n.codeMap = {}, n.format) { case 0: for (t = 0; 256 > t; ++t) n.codeMap[t] = e.readByte(); break; case 4: for (i = e.readShort() / 2, e.skip(6), r = e.times(i, e.readShort), e.skip(2), o = e.times(i, e.readShort), a = e.times(i, e.readShort_), s = e.times(i, e.readShort), l = (n.length + n.offset - e.offset()) / 2, c = e.times(l, e.readShort), t = 0; i > t; ++t) for (d = o[t], u = r[t], h = d; u >= h; ++h) 0 === s[t] ? p = h + a[t] : (f = s[t] / 2 - (i - t) + (h - d), p = c[f] || 0, 0 !== p && (p += a[t])), n.codeMap[h] = 65535 & p } }) } function t(e, t) { function i(n) { return t[e[n]] } var r, o, a, s, l, c, d, u, h, p, f, g, m, v, _, w, y, k = n(e), x = [], C = [], S = null, T = null; for (r = 0; k.length > r; ++r) o = k[r], a = i(o), s = a - o, (null == S || s !== T) && (S && C.push(S), x.push(o), T = s), S = o; for (S && C.push(S), C.push(65535), x.push(65535), l = x.length, c = 2 * l, d = 2 * Math.pow(2, Math.floor(Math.log(l) / Math.LN2)), u = Math.log(d / 2) / Math.LN2, h = c - d, p = [], f = [], g = [], r = 0; l > r; ++r) { if (m = x[r], v = C[r], 65535 == m) { p.push(0), f.push(0); break } if (_ = i(m), m - _ >= 32768) for (p.push(0), f.push(2 * (g.length + l - r)), w = m; v >= w; ++w) g.push(i(w)); else p.push(_ - m), f.push(0) } return y = b(), y.writeShort(3), y.writeShort(1), y.writeLong(12), y.writeShort(4), y.writeShort(16 + 8 * l + 2 * g.length), y.writeShort(0), y.writeShort(c), y.writeShort(d), y.writeShort(u), y.writeShort(h), C.forEach(y.writeShort), y.writeShort(0), x.forEach(y.writeShort), p.forEach(y.writeShort_), f.forEach(y.writeShort), g.forEach(y.writeShort), y.get() } return r({ parse: function(t) { var n, i = this, r = i.offset; t.offset(r), i.version = t.readShort(), n = t.readShort(), i.unicodeEntry = null, i.tables = t.times(n, function() { var n = new e(t, r); return n.isUnicode && (i.unicodeEntry = n), n }) }, render: function(e, n) { var i = b(); return i.writeShort(0), i.writeShort(1), i.write(t(e, n)), i.get() }, getUnicodeEntry: function() { if (!this.unicodeEntry) throw Error("Font doesn't have an Unicode encoding"); return this.unicodeEntry } }) }(), v = r({ parse: function(e) { e.offset(this.offset), this.version = e.readShort(), this.averageCharWidth = e.readShort_(), this.weightClass = e.readShort(), this.widthClass = e.readShort(), this.type = e.readShort(), this.ySubscriptXSize = e.readShort_(), this.ySubscriptYSize = e.readShort_(), this.ySubscriptXOffset = e.readShort_(), this.ySubscriptYOffset = e.readShort_(), this.ySuperscriptXSize = e.readShort_(), this.ySuperscriptYSize = e.readShort_(), this.ySuperscriptXOffset = e.readShort_(), this.ySuperscriptYOffset = e.readShort_(), this.yStrikeoutSize = e.readShort_(), this.yStrikeoutPosition = e.readShort_(), this.familyClass = e.readShort_(), this.panose = e.times(10, e.readByte), this.charRange = e.times(4, e.readLong), this.vendorID = e.readString(4), this.selection = e.readShort(), this.firstCharIndex = e.readShort(), this.lastCharIndex = e.readShort(), this.version > 0 && (this.ascent = e.readShort_(), this.descent = e.readShort_(), this.lineGap = e.readShort_(), this.winAscent = e.readShort(), this.winDescent = e.readShort(), this.codePageRange = e.times(2, e.readLong), this.version > 1 && (this.xHeight = e.readShort(), this.capHeight = e.readShort(), this.defaultChar = e.readShort(), this.breakChar = e.readShort(), this.maxContext = e.readShort())) }, render: function() { return this.raw() } }), _ = 1e5, a.prototype = { use: function(e) { var t, n, i, r, o; if ("string" == typeof e) { for (n = "", i = 0; e.length > i; ++i) t = this.use(e.charCodeAt(i)), n += String.fromCharCode(t); return n } return t = this.unicodes[e], t || (t = this.next++, this.subset[t] = e, this.unicodes[e] = t, r = this.font.cmap.getUnicodeEntry().codeMap[e], r && (this.ncid2ogid[t] = r, null == this.ogid2ngid[r] && (o = this.nextGid++, this.ogid2ngid[r] = o, this.ngid2ogid[o] = r))), t }, encodeText: function(e) { return this.use(e) }, glyphIds: function() { return n(this.ogid2ngid) }, glyphsFor: function(e, t) { var n, i, r; for (t || (t = {}), n = 0; e.length > n; ++n) i = e[n], t[i] || (r = t[i] = this.font.glyf.glyphFor(i), r && r.compound && this.glyphsFor(r.glyphIds, t)); return t }, render: function() { var e, i, r, o, a, s, l, c, d = this.glyphsFor(this.glyphIds()); for (e in d) t(d, e) && (e = parseInt(e, 10), null == this.ogid2ngid[e] && (i = this.nextGid++, this.ogid2ngid[e] = i, this.ngid2ogid[i] = e)); return r = n(this.ngid2ogid), o = r.map(function(e) { return this.ngid2ogid[e] }, this), a = this.font, s = a.glyf.render(d, o, this.ogid2ngid), l = a.loca.render(s.offsets), this.lastChar = this.next - 1, c = { cmap: m.render(this.ncid2ogid, this.ogid2ngid), glyf: s.table, loca: l.table, hmtx: a.hmtx.render(o), hhea: a.hhea.render(o), maxp: a.maxp.render(o), post: a.post.render(o), name: a.name.render(this.psName), head: a.head.render(l.format), "OS/2": a.os2.render() }, this.font.directory.render(c) }, cidToGidMap: function() { var e, t, n, i = b(), r = 0; for (e = this.firstChar; this.next > e; ++e) { for (; e > r;) i.writeShort(0), r++; t = this.ncid2ogid[e], t ? (n = this.ogid2ngid[t], i.writeShort(n)) : i.writeShort(0), r++ } return i.get() } }, s.prototype = { parse: function() { var e = this.directory = new i(this.contents); this.head = e.readTable("head", l), this.loca = e.readTable("loca", c), this.hhea = e.readTable("hhea", d), this.maxp = e.readTable("maxp", u), this.hmtx = e.readTable("hmtx", h), this.glyf = e.readTable("glyf", p), this.name = e.readTable("name", f), this.post = e.readTable("post", g), this.cmap = e.readTable("cmap", m), this.os2 = e.readTable("OS/2", v), this.psName = this.name.postscriptName, this.ascent = this.os2.ascent || this.hhea.ascent, this.descent = this.os2.descent || this.hhea.descent, this.lineGap = this.os2.lineGap || this.hhea.lineGap, this.scale = 1e3 / this.head.unitsPerEm }, widthOfGlyph: function(e) { return this.hmtx.forGlyph(e).advance * this.scale }, makeSubset: function() { return new a(this) } }, w.TTFFont = s }(window), function(e, t) { "use strict"; function n(t, n) { function i(e, t, n) { return n || (n = d), n.pdf && null != n.pdf[e] ? n.pdf[e] : t } function r() { function r(e) { var t, n, r, o, l, c = e.options, d = S(e), u = d.bbox; e = d.root, t = i("paperSize", i("paperSize", "auto"), c), n = !1, "auto" == t && (u ? (r = u.getSize(), t = [r.width, r.height], n = !0, o = u.getOrigin(), d = new T.Group, d.transform(new D.Matrix(1, 0, 0, 1, -o.x, -o.y)), d.append(e), e = d) : t = "A4"), l = a.addPage({ paperSize: t, margin: i("margin", i("margin"), c), addMargin: n, landscape: i("landscape", i("landscape", !1), c) }), s(e, l, a) } if (!(--o > 0)) { var a = new e.pdf.Document({ producer: i("producer"), title: i("title"), author: i("author"), subject: i("subject"), keywords: i("keywords"), creator: i("creator"), date: i("date") }); u ? t.children.forEach(r) : r(t), n(a.render(), a) } } var o, l = [], c = [], d = t.options, u = i("multiPage"); t.traverse(function(t) { a({ Image: function(e) { c.indexOf(e.src()) < 0 && c.push(e.src()) }, Text: function(t) { var n = e.pdf.parseFontDef(t.options.font), i = e.pdf.getFontURL(n); l.indexOf(i) < 0 && l.push(i) } }, t) }), o = 2, e.pdf.loadFonts(l, r), e.pdf.loadImages(c, r) } function i(e, t) { n(e, function(e) { t("data:application/pdf;base64," + e.base64()) }) } function r(e, t) { n(e, function(e) { t(new Blob([e.get()], { type: "application/pdf" })) }) } function o(t, n, o, a) { window.Blob && !e.support.browser.safari ? r(t, function(t) { e.saveAs({ dataURI: t, fileName: n }), a && a(t) }) : i(t, function(t) { e.saveAs({ dataURI: t, fileName: n, proxyURL: o }), a && a(t) }) } function a(e, t) { var n = e[t.nodeType]; return n ? n.call.apply(n, arguments) : t } function s(e, t, n) { var i, r, o; e.options._pdfDebug && t.comment("BEGIN: " + e.options._pdfDebug), i = e.transform(), r = e.opacity(), t.save(), null != r && 1 > r && t.setOpacity(r), l(e, t, n), c(e, t, n), d(e, t, n), i && (o = i.matrix(), t.transform(o.a, o.b, o.c, o.d, o.e, o.f)), a({ Path: m, MultiPath: v, Circle: _, Arc: w, Text: b, Image: k, Group: y }, e, t, n), t.restore(), e.options._pdfDebug && t.comment("END: " + e.options._pdfDebug) } function l(e, t) { var n, i, r, o, a, s, l = e.stroke && e.stroke(); if (l) { if (n = l.color) { if (n = C(n), null == n) return; t.setStrokeColor(n.r, n.g, n.b), 1 != n.a && t.setStrokeOpacity(n.a) } if (i = l.width, null != i) { if (0 === i) return; t.setLineWidth(i) } r = l.dashType, r && t.setDashPattern(E[r], 0), o = l.lineCap, o && t.setLineCap(I[o]), a = l.lineJoin, a && t.setLineJoin(P[a]), s = l.opacity, null != s && t.setStrokeOpacity(s) } } function c(e, t) { var n, i, r = e.fill && e.fill(); if (r && !(r instanceof T.Gradient)) { if (n = r.color) { if (n = C(n), null == n) return; t.setFillColor(n.r, n.g, n.b), 1 != n.a && t.setFillOpacity(n.a) } i = r.opacity, null != i && t.setFillOpacity(i) } } function d(e, t, n) { var i = e.clip(); i && (g(i, t, n), t.clip()) } function u(e) { return e && (e instanceof T.Gradient || e.color && !/^(none|transparent)$/i.test(e.color) && (null == e.width || e.width > 0) && (null == e.opacity || e.opacity > 0)) } function h(e, t, n, i) { var r, o, a, s, l, c, d, u = e.fill(); return u instanceof T.Gradient ? (i ? t.clipStroke() : t.clip(), r = u instanceof T.RadialGradient, r ? (o = { x: u.center().x, y: u.center().y, r: 0 }, a = { x: u.center().x, y: u.center().y, r: u.radius() }) : (o = { x: u.start().x, y: u.start().y }, a = { x: u.end().x, y: u.end().y }), s = { type: r ? "radial" : "linear", start: o, end: a, userSpace: u.userSpace(), stops: u.stops.elements().map(function(e) { var t, n = e.offset(); return n = /%$/.test(n) ? parseFloat(n) / 100 : parseFloat(n), t = C(e.color()), t.a *= e.opacity(), { offset: n, color: t } }) }, l = e.rawBBox(), c = l.topLeft(), d = l.getSize(), l = { left: c.x, top: c.y, width: d.width, height: d.height }, t.gradient(s, l), !0) : void 0 } function p(e, t, n) { u(e.fill()) && u(e.stroke()) ? h(e, t, n, !0) || t.fillStroke() : u(e.fill()) ? h(e, t, n, !1) || t.fill() : u(e.stroke()) ? t.stroke() : t.nop() } function f(e, t) { var n, i, r, o = e.segments; if (4 == o.length && e.options.closed) { for (n = [], i = 0; o.length > i; ++i) { if (o[i].controlIn()) return !1; n[i] = o[i].anchor() } if (r = n[0].y == n[1].y && n[1].x == n[2].x && n[2].y == n[3].y && n[3].x == n[0].x || n[0].x == n[1].x && n[1].y == n[2].y && n[2].x == n[3].x && n[3].y == n[0].y) return t.rect(n[0].x, n[0].y, n[2].x - n[0].x, n[2].y - n[0].y), !0 } } function g(e, t, n) { var i, r, o, a, s, l, c = e.segments; if (0 !== c.length && !f(e, t, n)) { for (r = 0; c.length > r; ++r) o = c[r], a = o.anchor(), i ? (s = i.controlOut(), l = o.controlIn(), s && l ? t.bezier(s.x, s.y, l.x, l.y, a.x, a.y) : t.lineTo(a.x, a.y)) : t.moveTo(a.x, a.y), i = o; e.options.closed && t.close() } } function m(e, t, n) { g(e, t, n), p(e, t, n) } function v(e, t, n) { var i, r = e.paths; for (i = 0; r.length > i; ++i) g(r[i], t, n); p(e, t, n) } function _(e, t, n) { var i = e.geometry(); t.circle(i.center.x, i.center.y, i.radius), p(e, t, n) } function w(e, t, n) { var i, r = e.geometry().curvePoints(); for (t.moveTo(r[0].x, r[0].y), i = 1; r.length > i;) t.bezier(r[i].x, r[i++].y, r[i].x, r[i++].y, r[i].x, r[i++].y); p(e, t, n) } function b(t, n) { var i, r = e.pdf.parseFontDef(t.options.font), o = t._position; t.fill() && t.stroke() ? i = A.fillAndStroke : t.fill() ? i = A.fill : t.stroke() && (i = A.stroke), n.transform(1, 0, 0, -1, o.x, o.y + r.fontSize), n.beginText(), n.setFont(e.pdf.getFontURL(r), r.fontSize), n.setTextRenderingMode(i), n.showText(t.content(), t._pdfRect ? t._pdfRect.width() : null), n.endText() } function y(e, t, n) { var i, r; for (e._pdfLink && t.addLink(e._pdfLink.url, e._pdfLink), i = e.children, r = 0; i.length > r; ++r) s(i[r], t, n) } function k(e, t) { var n, i, r, o = e.src(); o && (n = e.rect(), i = n.getOrigin(), r = n.getSize(), t.transform(r.width, 0, 0, -r.height, i.x, i.y + r.height), t.drawImage(o)) } function x(e, n) { var i, r = t.Deferred(); for (i in n) e.options.set("pdf." + i, n[i]); return T.pdf.toDataURL(e, r.resolve), r.promise() } function C(t) { var n = e.parseColor(t, !0); return n ? n.toRGB() : null } function S(e) { function t(e) { return l = !0, e } function n(e) { return e.visible() && e.opacity() > 0 && (u(e.fill()) || u(e.stroke())) } function i(e) { var t, n, i = []; for (t = 0; e.length > t; ++t) n = s(e[t]), null != n && i.push(n); return i } function r(e, t) { var n, i = c, r = d; e.transform() && (d = d.multiplyCopy(e.transform().matrix())), n = e.clip(), n && (n = n.bbox(), n && (n = n.bbox(d), c = c ? D.Rect.intersect(c, n) : n)); try { return t() } finally { c = i, d = r } } function o(e) { if (null == c) return !1; var t = e.rawBBox().bbox(d); return c && t && (t = D.Rect.intersect(t, c)), t } function s(s) { return r(s, function() { if (!(s instanceof T.Group || s instanceof T.MultiPath)) { var r = o(s); if (!r) return t(null); h = h ? D.Rect.union(h, r) : r } return a({ Path: function(e) { return 0 !== e.segments.length && n(e) ? e : t(null) }, MultiPath: function(e) { if (!n(e)) return t(null); var r = new T.MultiPath(e.options); return r.paths = i(e.paths), 0 === r.paths.length ? t(null) : r }, Circle: function(e) { return n(e) ? e : t(null) }, Arc: function(e) { return n(e) ? e : t(null) }, Text: function(e) { return /\S/.test(e.content()) && n(e) ? e : t(null) }, Image: function(e) { return e.visible() && e.opacity() > 0 ? e : t(null) }, Group: function(n) { var r = new T.Group(n.options); return r.children = i(n.children), r._pdfLink = n._pdfLink, n === e || 0 !== r.children.length || n._pdfLink ? r : t(null) } }, s) }) } var l, c = !1, d = D.Matrix.unit(), h = null; do l = !1, e = s(e); while (e && l); return { root: e, bbox: h } } var T = e.drawing, D = e.geometry, A = e.pdf.TEXT_RENDERING_MODE, E = { dash: [4], dashDot: [4, 2, 1, 2], dot: [1, 2], longDash: [8, 2], longDashDot: [8, 2, 1, 2], longDashDotDot: [8, 2, 1, 2, 1, 2], solid: [] }, I = { butt: 0, round: 1, square: 2 }, P = { miter: 0, round: 1, bevel: 2 }; e.deepExtend(T, { exportPDF: x, pdf: { toDataURL: i, toBlob: r, saveAs: o, toStream: n } }) }(window.kendo, window.kendo.jQuery), function(e, t) { e.PDFMixin = { extend: function(e) { e.events.push("pdfExport"), e.options.pdf = this.options, e.saveAsPDF = this.saveAsPDF, e._drawPDF = this._drawPDF, e._drawPDFShadow = this._drawPDFShadow }, options: { fileName: "Export.pdf", proxyURL: "", paperSize: "auto", allPages: !1, landscape: !1, margin: null, title: null, author: null, subject: null, keywords: null, creator: "Kendo UI PDF Generator", date: null }, saveAsPDF: function() { var n, i = new t.Deferred, r = i.promise(), o = { promise: r }; if (!this.trigger("pdfExport", o)) return n = this.options.pdf, n.multiPage = n.allPages, this._drawPDF(i).then(function(t) { return e.drawing.exportPDF(t, n) }).done(function(t) { e.saveAs({ dataURI: t, fileName: n.fileName, proxyURL: n.proxyURL, forceProxy: n.forceProxy, proxyTarget: n.proxyTarget }), i.resolve() }).fail(function(e) { i.reject(e) }), r }, _drawPDF: function() { return e.drawing.drawDOM(this.wrapper) }, _drawPDFShadow: function(n) { var i, r, o; return n = n || {}, i = this.wrapper, r = t("<div class='k-pdf-export-shadow'>"), n.width && r.css({ width: n.width, overflow: "visible" }), i.before(r), r.append(n.content || i.clone(!0, !0)), o = e.drawing.drawDOM(r), o.always(function() { r.remove() }), o } } }(kendo, window.kendo.jQuery), function(e, t) { function n(e) { return Array(e + 1).join('<td class="k-group-cell"> </td>') } function i(e) { var t, n = " "; if (e) { if (typeof e === ln) return e; for (t in e) n += t + '="' + e[t] + '"' } return n } function r(t, n) { e("th, th .k-grid-filter, th .k-link", t).add(document.body).css("cursor", n) } function o(t, n, i, r, o) { var a, s = n; for (n = e(), o = o || 1, a = 0; o > a; a++) n = n.add(t.eq(s + a)); "number" == typeof i ? n[r ? "insertBefore" : "insertAfter"](t.eq(i)) : n.appendTo(i) } function a(t, n, i) { return e(t).add(n).find(i) } function s(e, t, n) { var i, r, o, a; for (n = yt(n) ? n : [n], i = 0, r = n.length; r > i; i++) o = n[i], vt(o) && o.click && (a = o.name || o.text, t.on(rn + Ht, "a.k-grid-" + (a || "").replace(/\s/g, ""), { commandName: a }, Ct(o.click, e))) } function l(e, t, n) { return wt(e, function(e) { var i, r; return e = typeof e === ln ? { field: e } : e, (!p(e) || n) && (e.attributes = W(e.attributes), e.footerAttributes = W(e.footerAttributes), e.headerAttributes = W(e.headerAttributes), i = !0), e.columns && (e.columns = l(e.columns, t, i)), r = dt.guid(), e.headerAttributes = _t({ id: r }, e.headerAttributes), _t({ encoded: t, hidden: i }, e) }) } function c(e, t) { var n = []; return d(e, t, n), n[n.length - 1] } function d(e, t, n) { var i, r; for (n = n || [], i = 0; t.length > i; i++) { if (e === t[i]) return !0; if (t[i].columns) { if (r = n.length, n.push(t[i]), d(e, t[i].columns, n)) return !0; n.splice(r, n.length - r) } } return !1 } function u(e, t) { var n = t ? j : W; e.hidden = !t, e.attributes = n(e.attributes), e.footerAttributes = n(e.footerAttributes), e.headerAttributes = n(e.headerAttributes) } function h() { return "none" !== this.style.display } function p(e) { return f([e]).length > 0 } function f(e) { return bt(e, function(e) { var t = !e.hidden; return t && e.columns && (t = f(e.columns).length > 0), t }) } function g(t) { return e(t).map(function() { return this.toArray() }) } function m(e, t, n) { var i = w(z(t)), r = w(F(t)), o = e.rowSpan; e.rowSpan = n ? i > r ? o - (i - r) || 1 : o + (r - i) : i > r ? o + (i - r) : o - (r - i) || 1 } function v(t, n, i, r, o, a, s) { var l, c, d = w(t), u = w([n]); d > u && (l = Array(s + 1).join('<th class="k-group-cell k-header"> </th>'), c = a.children(":not(.k-filter-row)"), e(Array(d - u + 1).join("<tr>" + l + "</tr>")).insertAfter(c.last())), I(a, d - u), b(i, r, o, a) } function _(t, n, i) { var r, o, a, s, l, c, d, u; for (i = i || 0, a = n, n = L(n), s = {}, l = t.find(">tr:not(.k-filter-row)"), c = function() { var t = e(this); return !t.hasClass("k-group-cell") && !t.hasClass("k-hierarchy-cell") }, d = 0, u = n.length; u > d; d++) r = y(n[d], a), s[r.row] || (s[r.row] = l.eq(r.row).find(".k-header").filter(c)), o = s[r.row].eq(r.cell), o.attr(dt.attr("index"), i + d); return n.length } function w(e) { var t, n, i = 1, r = 0; for (t = 0; e.length > t; t++) e[t].columns && (n = w(e[t].columns), n > r && (r = n)); return i + r } function b(t, n, i, r) { var o, a, s = C(t[0], n), l = i.find(">tr:not(.k-filter-row):eq(" + s.row + ")>th.k-header"), c = e(), d = s.cell; for (o = 0; t.length > o; o++) c = c.add(l.eq(d + o)); for (r.find(">tr:not(.k-filter-row)").eq(s.row).append(c), a = [], o = 0; t.length > o; o++) t[o].columns && (a = a.concat(t[o].columns)); a.length && b(a, n, i, r) } function y(e, t, n, i) { var r, o; for (n = n || 0, i = i || {}, i[n] = i[n] || 0, o = 0; t.length > o; o++) { if (t[o] == e) { r = { cell: i[n], row: n }; break } if (t[o].columns && (r = y(e, t[o].columns, n + 1, i))) break; i[n]++ } return r } function k(e, t, n, i) { var r, o = n.locked; do r = e[t], t += i ? 1 : -1; while (r && t > -1 && e.length > t && r != n && !r.columns && r.locked == o); return r } function x(e, t, n, i) { var r, o, a, s; return t.columns ? (t = t.columns, t[i ? 0 : t.length - 1]) : (r = c(t, e), o = r ? r.columns : e, a = kt(t, o), 0 === a && i ? a++ : a != o.length - 1 || i ? (a > 0 || 0 === a && !i) && (a += i ? -1 : 1) : a--, s = kt(n, o), t = k(o, a, n, s > a), t && t != n && t.columns ? x(e, t, n, i) : null) } function C(e, t, n, i) { var r, o; for (n = n || 0, i = i || {}, i[n] = i[n] || 0, o = 0; t.length > o; o++) { if (t[o] == e) { r = { cell: i[n], row: n }; break } if (t[o].columns && (r = C(e, t[o].columns, n + 1, i))) break; t[o].hidden || i[n]++ } return r } function S(e) { var t = T(z(e)); return t.concat(T(F(e))) } function T(e) { var t, n = [], i = []; for (t = 0; e.length > t; t++) n.push(e[t]), e[t].columns && (i = i.concat(e[t].columns)); return i.length && (n = n.concat(T(i))), n } function D(e) { var t, n, i = 0; for (n = 0; e.length > n; n++) t = e[n], t.columns ? i += D(t.columns) : t.hidden && i++; return i } function A(e) { var t, n, i, r = 0; for (n = 0, i = e.length; i > n; n++) t = e[n].style.width, t && -1 == t.indexOf("%") && (r += parseInt(t, 10)); return r } function E(e, t) { var n, i, r = e.find("tr:not(.k-filter-row) th:not(.k-group-cell,.k-hierarchy-cell)"); for (i = 0; r.length > i; i++) n = r[i].rowSpan, n > 1 && (r[i].rowSpan = n - t || 1) } function I(e, t) { var n, i = e.find("tr:not(.k-filter-row) th:not(.k-group-cell,.k-hierarchy-cell)"); for (n = 0; i.length > n; n++) i[n].rowSpan += t } function P(t) { var n, i = t.find("tr:not(.k-filter-row)"), r = i.filter(function() { return !e(this).children().length }).remove().length, o = i.find("th:not(.k-group-cell,.k-hierarchy-cell)"); for (n = 0; o.length > n; n++) o[n].rowSpan > 1 && (o[n].rowSpan -= r); return i.length - r } function M(e, t, n, i, r) { var o, a, s, l = []; for (o = 0, s = e.length; s > o; o++) a = n[i] || [], a.push(t.eq(r + o)), n[i] = a, e[o].columns && (l = l.concat(e[o].columns)); l.length && M(l, t, n, i + 1, r + e.length) } function z(e) { return bt(e, function(e) { return e.locked }) } function F(e) { return bt(e, function(e) { return !e.locked }) } function R(e) { return bt(e, function(e) { return !e.locked && p(e) }) } function H(e) { return bt(e, function(e) { return e.locked && p(e) }) } function B(e) { var t, n = []; for (t = 0; e.length > t; t++) e[t].hidden || (e[t].columns ? n = n.concat(B(e[t].columns)) : n.push(e[t])); return n } function L(e) { var t, n = []; for (t = 0; e.length > t; t++) e[t].columns ? n = n.concat(L(e[t].columns)) : n.push(e[t]); return n } function N(n) { var i, r = n.find(">tr:not(.k-filter-row)"), o = function() { var t = e(this); return !t.hasClass("k-group-cell") && !t.hasClass("k-hierarchy-cell") }, a = e(); return r.length > 1 && (a = r.find("th").filter(o).filter(function() { return this.rowSpan > 1 })), a = a.add(r.last().find("th").filter(o)), i = dt.attr("index"), a.sort(function(n, r) { var o, a; return n = e(n), r = e(r), o = n.attr(i), a = r.attr(i), o === t && (o = e(n).index()), a === t && (a = e(r).index()), o = parseInt(o, 10), a = parseInt(a, 10), o > a ? 1 : a > o ? -1 : 0 }), a } function O(t) { var n, i, r, o, a, s, l, c = t.closest("table"), d = e().add(t), u = t.closest("tr"), h = c.find("tr:not(.k-filter-row)"), p = h.index(u); if (p > 0) { for (n = h.eq(p - 1), i = n.find("th:not(.k-group-cell,.k-hierarchy-cell)").filter(function() { return !e(this).attr("rowspan") }), r = 0, o = u.find("th:not(.k-group-cell,.k-hierarchy-cell)").index(t), a = t.prevAll(":not(.k-group-cell,.k-hierarchy-cell)").filter(function() { return this.colSpan > 1 }), s = 0; a.length > s; s++) r += a[s].colSpan || 1; for (o += Math.max(r - 1, 0), r = 0, s = 0; i.length > s; s++) if (l = i.eq(s), r += l.attr("colSpan") ? l[0].colSpan : 1, o >= s && r > o) { d = O(l).add(d); break } } return d } function V(t) { var n, i, r, o, a, s, l, c, d = t.closest("thead"), u = e().add(t), h = t.closest("tr"), p = d.find("tr:not(.k-filter-row)"), f = p.index(h) + t[0].rowSpan, g = dt.attr("colspan"); if (p.length - 1 >= f) { for (n = h.next(), i = h.find("th:not(.k-group-cell,.k-hierarchy-cell)").index(t), r = t.prevAll(":not(.k-group-cell,.k-hierarchy-cell)"), r = r.filter(function() { return !this.rowSpan || 1 === this.rowSpan }), a = 0, o = 0; r.length > o; o++) a += parseInt(r.eq(o).attr(g), 10) || 1; for (s = n.find("th:not(.k-group-cell,.k-hierarchy-cell)"), l = parseInt(t.attr(g), 10) || 1, o = 0; l > o;) n = s.eq(o + a), u = u.add(V(n)), c = parseInt(n.attr(g), 10), c > 1 && (l -= c - 1), o++ } return u } function U(t, n, i, r) { var o, a = t; return r && t.empty(), pt ? t[0].innerHTML = i : (o = document.createElement("div"), o.innerHTML = "<table><tbody>" + i + "</tbody></table>", t = o.firstChild.firstChild, n[0].replaceChild(t, a[0]), t = e(t)), t } function W(e) { e = e || {}; var t = e.style; return t ? (t = t.replace(/((.*)?display)(.*)?:([^;]*)/i, "$1:none"), t === e.style && (t = t.replace(/(.*)?/i, "display:none;$1"))) : t = "display:none", _t({}, e, { style: t }) } function j(e) { e = e || {}; var t = e.style; return t && (e.style = t.replace(/(display\s*:\s*none\s*;?)*/gi, "")), e } function G(t, n, i, r) { var o, a = t.find(">colgroup"), s = wt(n, function(e) { return o = e.width, o && 0 !== parseInt(o, 10) ? dt.format('<col style="width:{0}"/>', typeof o === ln ? o : o + "px") : "<col />" }); (i || a.find(".k-hierarchy-col").length) && s.splice(0, 0, '<col class="k-hierarchy-col" />'), a.length && a.remove(), a = e(Array(r + 1).join('<col class="k-group-col">') + s.join("")), a.is("colgroup") || (a = e("<colgroup/>").append(a)), t.prepend(a), bn.msie && 8 == bn.version && (t.css("display", "inline-table"), window.setTimeout(function() { t.css("display", "") }, 1)) } function q(e, t) { var n, i, r = 0, o = e.find("th:not(.k-group-cell)"); for (n = 0, i = t.length; i > n; n++) t[n].locked && (o.eq(n).insertBefore(o.eq(r)), o = e.find("th:not(.k-group-cell)"), r++) } function $(e) { var t, n, i, r = {}; for (n = 0, i = e.length; i > n; n++) t = e[n], r[t.value] = t.text; return r } function Y(e, t, n, i) { var r = n && n.length && vt(n[0]) && "value" in n[0], o = r ? $(n)[e] : e; return o = null != o ? o : "", t ? dt.format(t, o) : i === !1 ? o : dt.htmlEncode(o) } function Q(e, t, n) { for (var i, r = 0, o = e[r]; o;) { if (i = n ? !0 : "none" !== o.style.display, i && !mn.test(o.className) && --t < 0) { o.style.display = n ? "" : "none"; break } o = e[++r] } } function K(t, n) { for (var i, r, o = 0, a = t.length; a > o; o += 1) r = t.eq(o), r.is(".k-grouping-row,.k-detail-row") ? (i = r.children(":not(.k-group-cell):first,.k-detail-cell").last(), i.attr("colspan", parseInt(i.attr("colspan"), 10) - 1)) : (r.hasClass("k-grid-edit-row") && (i = r.children(".k-edit-container")[0]) && (i = e(i), i.attr("colspan", parseInt(i.attr("colspan"), 10) - 1), i.find("col").eq(n).remove(), r = i.find("tr:first")), Q(r[0].cells, n, !1)) } function X(e) { var t, n, i = []; for (n = 0; e.length > n && (t = e[n], "field" in t && "value" in t && "items" in t); n++) i.push(t), t.hasSubgroups && (i = i.concat(X(t.items))); return i } function Z(e) { var t, n, i = []; for (n = 0; e.length > n && (t = e[n], "field" in t && "value" in t && "items" in t); n++) t.hasSubgroups && (i = i.concat(Z(t.items))), i.push(t.aggregates); return i } function J(t, n) { for (var i, r, o, a = 0, s = t.length; s > a; a += 1) r = t.eq(a), r.is(".k-grouping-row,.k-detail-row") ? (i = r.children(":not(.k-group-cell):first,.k-detail-cell").last(), i.attr("colspan", parseInt(i.attr("colspan"), 10) + 1)) : (r.hasClass("k-grid-edit-row") && (i = r.children(".k-edit-container")[0]) && (i = e(i), i.attr("colspan", parseInt(i.attr("colspan"), 10) + 1), G(i.find(">form>table"), f(o), !1, 0), r = i.find("tr:first")), Q(r[0].cells, n, !0)) } function et(e, t, n) { n = n || 1; var i, r, o; for (r = 0, o = e.length; o > r; r++) i = e.eq(r).children().last(), i.attr("colspan", parseInt(i.attr("colspan"), 10) + n), i = t.eq(r).children().last(), i.attr("colspan", parseInt(i.attr("colspan"), 10) - n) } function tt(e) { var t, n, i = 0, r = e.find(">colgroup>col"); for (t = 0, n = r.length; n > t; t += 1) i += parseInt(r[t].style.width, 10); return i } function nt(e, t) { var n, i, r, o; e = e[0], t = t[0], e.rows.length !== t.rows.length && (n = e.offsetHeight, i = t.offsetHeight, n > i ? (r = t.rows[t.rows.length - 1], vn.test(r.className) && (r = t.rows[t.rows.length - 2]), o = n - i) : (r = e.rows[e.rows.length - 1], vn.test(r.className) && (r = e.rows[e.rows.length - 2]), o = i - n), r.style.height = r.offsetHeight + o + "px") } function it(e, t) { var n, i = e.offsetHeight, r = t.offsetHeight; i > r ? n = i + "px" : r > i && (n = r + "px"), n && (e.style.height = t.style.height = n) } function rt(e, t) { var n, i, r; if (typeof e === ln && e === t) return e; if (vt(e) && e.name === t) return e; if (yt(e)) for (n = 0, i = e.length; i > n; n++) if (r = e[n], typeof r === ln && r === t || r.name === t) return r; return null } function ot(t, n) { var i, r, o, a = bn.msie; if (n === !0) { if (t = e(t), i = !0, i && (r = t.parent().scrollTop(), o = t.parent().scrollLeft()), a) try { t[0].setActive() } catch (s) { t[0].focus() } else t[0].focus(); i && (t.parent().scrollTop(r), t.parent().scrollLeft(o)) } else e(t).one("focusin", function(e) { e.preventDefault() }).focus() } function at(n) { var i = e(n.currentTarget), r = i.is("th"), o = this.table.add(this.lockedTable), a = this.thead.parent().add(e(">table", this.lockedHeader)), s = e(n.target).is(":button,a,:input,a>.k-icon,textarea,span.k-select,span.k-icon,span.k-link,.k-input,.k-multiselect-wrap,.k-tool-icon"), l = i.closest("table")[0]; if (!dt.support.touch) return s && i.find(dt.roleSelector("filtercell")).length ? (this.current(i), t) : ((l === o[0] || l === o[1] || l === a[0] || l === a[1]) && (e(n.target).is("a.k-i-collapse, a.k-i-expand") || (this.options.navigatable && this.current(i), (r || !s) && setTimeout(function() { kn && e(dt._activeElement()).hasClass("k-widget") || ot(l, !0) }), r && n.preventDefault())), t) } function st(e) { return e && (e.hasClass("k-edit-cell") || e.parent().hasClass("k-grid-edit-row")) } function lt(e, t, i) { return '<tr role="row" class="k-grouping-row">' + n(t) + '<td colspan="' + e + '" aria-expanded="true"><p class="k-reset"><a class="k-icon k-i-collapse" href="#" tabindex="-1"></a>' + i + "</p></td></tr>" } function ct(e) { return '<tr role="row" class="k-grouping-row"><td colspan="' + e + '" aria-expanded="true"><p class="k-reset"> </p></td></tr>' } var dt = window.kendo, ut = dt.ui, ht = dt.data.DataSource, pt = dt.support.tbodyInnerHtml, ft = dt._activeElement, gt = ut.Widget, mt = dt.keys, vt = e.isPlainObject, _t = e.extend, wt = e.map, bt = e.grep, yt = e.isArray, kt = e.inArray, xt = Array.prototype.push, Ct = e.proxy, St = dt.isFunction, Tt = e.isEmptyObject, Dt = Math, At = "progress", Et = "error", It = ":not(.k-group-cell):not(.k-hierarchy-cell):visible", Pt = "tbody>tr:not(.k-grouping-row):not(.k-detail-row):not(.k-group-footer) > td:not(.k-group-cell):not(.k-hierarchy-cell)", Mt = "tr:not(.k-footer-template):visible", zt = ":not(.k-group-cell):not(.k-hierarchy-cell):visible", Ft = Mt + ":first>" + zt + ":first", Rt = "th.k-header:not(.k-group-cell):not(.k-hierarchy-cell)", Ht = ".kendoGrid", Bt = "edit", Lt = "save", Nt = "remove", Ot = "detailInit", Vt = "filterMenuInit", Ut = "columnMenuInit", Wt = "change", jt = "columnHide", Gt = "columnShow", qt = "saveChanges", $t = "dataBound", Yt = "detailExpand", Qt = "detailCollapse", Kt = "k-state-focused", Xt = "k-state-selected", Zt = "k-grid-norecords", Jt = "columnResize", en = "columnReorder", tn = "columnLock", nn = "columnUnlock", rn = "click", on = "height", an = "tabIndex", sn = "function", ln = "string", cn = "Are you sure you want to delete this record?", dn = "No records available.", un = "Delete", hn = "Cancel", pn = /(\}|\#)/gi, fn = /#/gi, gn = "[\\x20\\t\\r\\n\\f]", mn = RegExp("(^|" + gn + ")(k-group-cell|k-hierarchy-cell)(" + gn + "|$)"), vn = RegExp("(^|" + gn + ")(k-filter-row)(" + gn + "|$)"), _n = '<a class="k-button k-button-icontext #=className#" #=attr# href="\\#"><span class="#=iconClass# #=imageClass#"></span>#=text#</a>', wn = !1, bn = dt.support.browser, yn = bn.msie && 7 == bn.version, kn = bn.msie && 8 == bn.version, xn = gt.extend({ init: function(e, t) { var n = this; gt.fn.init.call(n, e, t), n._refreshHandler = Ct(n.refresh, n), n.setDataSource(t.dataSource), n.wrap() }, setDataSource: function(e) { var t = this; t.dataSource && t.dataSource.unbind(Wt, t._refreshHandler), t.dataSource = e, t.dataSource.bind(Wt, t._refreshHandler) }, options: { name: "VirtualScrollable", itemHeight: e.noop, prefetch: !0 }, destroy: function() { var e = this; gt.fn.destroy.call(e), e.dataSource.unbind(Wt, e._refreshHandler), e.wrapper.add(e.verticalScrollbar).off(Ht), e.drag && (e.drag.destroy(), e.drag = null), e.wrapper = e.element = e.verticalScrollbar = null, e._refreshHandler = null }, wrap: function() { var t, n = this, i = dt.support.scrollbar() + 1, r = n.element; r.css({ width: "auto", overflow: "hidden" }).css(wn ? "padding-left" : "padding-right", i), n.content = r.children().first(), t = n.wrapper = n.content.wrap('<div class="k-virtual-scrollable-wrap"/>').parent().bind("DOMMouseScroll" + Ht + " mousewheel" + Ht, Ct(n._wheelScroll, n)), dt.support.kineticScrollNeeded && (n.drag = new dt.UserEvents(n.wrapper, { global: !0, start: function(e) { e.sender.capture() }, move: function(e) { n.verticalScrollbar.scrollTop(n.verticalScrollbar.scrollTop() - e.y.delta), t.scrollLeft(t.scrollLeft() - e.x.delta), e.preventDefault() } })), n.verticalScrollbar = e('<div class="k-scrollbar k-scrollbar-vertical" />').css({ width: i }).appendTo(r).bind("scroll" + Ht, Ct(n._scroll, n)) }, _wheelScroll: function(t) { if (!t.ctrlKey) { var n = this.verticalScrollbar, i = n.scrollTop(), r = dt.wheelDeltaY(t); !r || r > 0 && 0 === i || 0 > r && i + n[0].clientHeight == n[0].scrollHeight || (t.preventDefault(), e(t.currentTarget).one("wheel" + Ht, !1), this.verticalScrollbar.scrollTop(i + -r)) } }, _scroll: function(e) { var t = this, n = !t.options.prefetch, i = e.currentTarget.scrollTop, r = t.dataSource, o = t.itemHeight, a = r.skip() || 0, s = t._rangeStart || a, l = t.element.innerHeight(), c = !!(t._scrollbarTop && t._scrollbarTop > i), d = Dt.max(Dt.floor(i / o), 0), u = Dt.max(d + Dt.floor(l / o), 0); t._scrollTop = i - s * o, t._scrollbarTop = i, t._scrolling = n, t._fetch(d, u, c) || (t.wrapper[0].scrollTop = t._scrollTop), n && (t._scrollingTimeout && clearTimeout(t._scrollingTimeout), t._scrollingTimeout = setTimeout(function() { t._scrolling = !1, t._page(t._rangeStart, t.dataSource.take()) }, 100)) }, itemIndex: function(e) { var t = this._rangeStart || this.dataSource.skip() || 0; return t + e }, position: function(e) { var t, n = this._rangeStart || this.dataSource.skip() || 0, i = this.dataSource.pageSize(); return t = e > n ? e - n + 1 : n - e - 1, t > i ? i : t }, scrollIntoView: function(e) { var t = this.wrapper[0], n = t.clientHeight, i = this._scrollTop || t.scrollTop, r = e[0].offsetTop, o = e[0].offsetHeight; i > r ? this.verticalScrollbar[0].scrollTop -= n / 2 : r + o >= i + n && (this.verticalScrollbar[0].scrollTop += n / 2) }, _fetch: function(t, n, i) { var r = this, o = r.dataSource, a = r.itemHeight, s = o.take(), l = r._rangeStart || o.skip() || 0, c = Dt.floor(t / s) * s, d = !1, u = .33; return l > t ? (d = !0, l = Dt.max(0, n - s), r._scrollTop = (t - l) * a, r._page(l, s)) : n >= l + s && !i ? (d = !0, l = t, r._scrollTop = a, r._page(l, s)) : !r._fetching && r.options.prefetch && (c + s - s * u > t && t > s && o.prefetch(c - s, s, e.noop), n > c + s * u && o.prefetch(c + s, s, e.noop)), d }, fetching: function() { return this._fetching }, _page: function(e, t) { var n = this, i = !n.options.prefetch, r = n.dataSource; clearTimeout(n._timeout), n._fetching = !0, n._rangeStart = e, r.inRange(e, t) ? r.range(e, t) : (i || dt.ui.progress(n.wrapper.parent(), !0), n._timeout = setTimeout(function() { n._scrolling || (i && dt.ui.progress(n.wrapper.parent(), !0), r.range(e, t)) }, 100)) }, repaintScrollbar: function() { var e, t = this, n = "", i = 25e4, r = t.dataSource, o = dt.support.kineticScrollNeeded ? 0 : dt.support.scrollbar(), a = t.wrapper[0], s = t.itemHeight = t.options.itemHeight() || 0, l = a.scrollWidth > a.offsetWidth ? o : 0, c = r.total() * s + l; for (e = 0; e < Dt.floor(c / i); e++) n += '<div style="width:1px;height:' + i + 'px"></div>'; c % i && (n += '<div style="width:1px;height:' + c % i + 'px"></div>'), t.verticalScrollbar.html(n), a.scrollTop = t._scrollTop }, refresh: function() { var e = this, t = e.dataSource, n = e._rangeStart; dt.ui.progress(e.wrapper.parent(), !1), clearTimeout(e._timeout), e.repaintScrollbar(), e.drag && e.drag.cancel(), n && !e._fetching && (e._rangeStart = t.skip(), 1 === t.page() && (e.verticalScrollbar[0].scrollTop = 0)), e._fetching = !1 } }), Cn = { create: { text: "Add new record", imageClass: "k-add", className: "k-grid-add", iconClass: "k-icon" }, cancel: { text: "Cancel changes", imageClass: "k-cancel", className: "k-grid-cancel-changes", iconClass: "k-icon" }, save: { text: "Save changes", imageClass: "k-update", className: "k-grid-save-changes", iconClass: "k-icon" }, destroy: { text: "Delete", imageClass: "k-delete", className: "k-grid-delete", iconClass: "k-icon" }, edit: { text: "Edit", imageClass: "k-edit", className: "k-grid-edit", iconClass: "k-icon" }, update: { text: "Update", imageClass: "k-update", className: "k-primary k-grid-update", iconClass: "k-icon" }, canceledit: { text: "Cancel", imageClass: "k-cancel", className: "k-grid-cancel", iconClass: "k-icon" }, excel: { text: "Export to Excel", imageClass: "k-i-excel", className: "k-grid-excel", iconClass: "k-icon" }, pdf: { text: "Export to PDF", imageClass: "k-i-pdf", className: "k-grid-pdf", iconClass: "k-icon" } }, Sn = dt.ui.DataBoundWidget.extend({ init: function(t, n, i) { var r = this; n = yt(n) ? { dataSource: n } : n, gt.fn.init.call(r, t, n), i && (r._events = i), wn = dt.support.isRtl(t), r._element(), r._aria(), r._columns(r.options.columns), r._dataSource(), r._tbody(), r._pageable(), r._thead(), r._groupable(), r._toolbar(), r._setContentHeight(), r._templates(), r._navigatable(), r._selectable(), r._clipboard(), r._details(), r._editable(), r._attachCustomCommandsEvent(), r._minScreenSupport(), r.options.autoBind ? r.dataSource.fetch() : r._footer(), r.lockedContent && (r.wrapper.addClass("k-grid-lockedcolumns"), r._resizeHandler = function() { r.resize() }, e(window).on("resize" + Ht, r._resizeHandler)), dt.notify(r) }, events: [Wt, "dataBinding", "cancel", $t, Yt, Qt, Ot, Vt, Ut, Bt, Lt, Nt, qt, Jt, en, Gt, jt, tn, nn], setDataSource: function(e) { var t = this, n = t.options.scrollable; t.options.dataSource = e, t._dataSource(), t._pageable(), t._thead(), n && (n.virtual ? t.content.find(">.k-virtual-scrollable-wrap").scrollLeft(0) : t.content.scrollLeft(0)), t.options.groupable && t._groupable(), t.virtualScrollable && t.virtualScrollable.setDataSource(t.options.dataSource), t.options.navigatable && t._navigatable(), t.options.selectable && t._selectable(), t.options.autoBind && e.fetch() }, options: { name: "Grid", columns: [], toolbar: null, autoBind: !0, filterable: !1, scrollable: !0, sortable: !1, selectable: !1, allowCopy: !1, navigatable: !1, pageable: !1, editable: !1, groupable: !1, rowTemplate: "", altRowTemplate: "", noRecords: !1, dataSource: {}, height: null, resizable: !1, reorderable: !1, columnMenu: !1, detailTemplate: null, columnResizeHandleWidth: 3, mobile: "", messages: { editable: { cancelDelete: hn, confirmation: cn, confirmDelete: un }, commands: { create: Cn.create.text, cancel: Cn.cancel.text, save: Cn.save.text, destroy: Cn.destroy.text, edit: Cn.edit.text, update: Cn.update.text, canceledit: Cn.canceledit.text, excel: Cn.excel.text, pdf: Cn.pdf.text }, noRecords: dn } }, destroy: function() { var t, n = this; n._angularItems("cleanup"), n._destroyColumnAttachments(), gt.fn.destroy.call(n), this._navigatableTables = null, n._resizeHandler && e(window).off("resize" + Ht, n._resizeHandler), n.pager && n.pager.element && n.pager.destroy(), n.pager = null, n.groupable && n.groupable.element && n.groupable.element.kendoGroupable("destroy"), n.groupable = null, n.options.reorderable && n.wrapper.data("kendoReorderable").destroy(), n.selectable && n.selectable.element && (n.selectable.destroy(), n.clearArea(), n.copyHandler && (n.wrapper.off("keydown", n.copyHandler), n.unbind(n.copyHandler)), n.updateClipBoardState && (n.unbind(n.updateClipBoardState), n.updateClipBoardState = null), n.clearAreaHandler && n.wrapper.off("keyup", n.clearAreaHandler)), n.selectable = null, n.resizable && (n.resizable.destroy(), n._resizeUserEvents && (n._resizeHandleDocumentClickHandler && e(document).off("click", n._resizeHandleDocumentClickHandler), n._resizeUserEvents.destroy(), n._resizeUserEvents = null), n.resizable = null), n.virtualScrollable && n.virtualScrollable.element && n.virtualScrollable.destroy(), n.virtualScrollable = null, n._destroyEditable(), n.dataSource && (n.dataSource.unbind(Wt, n._refreshHandler).unbind(At, n._progressHandler).unbind(Et, n._errorHandler), n._refreshHandler = n._progressHandler = n._errorHandler = null), t = n.element.add(n.wrapper).add(n.table).add(n.thead).add(n.wrapper.find(">.k-grid-toolbar")), n.content && (t = t.add(n.content).add(n.content.find(">.k-virtual-scrollable-wrap"))), n.lockedHeader && n._removeLockedContainers(), n.pane && n.pane.destroy(), n.minScreenResizeHandler && e(window).off("resize", n.minScreenResizeHandler), n._draggableInstance && n._draggableInstance.element && n._draggableInstance.destroy(), n._draggableInstance = null, t.off(Ht), dt.destroy(n.wrapper), n.rowTemplate = n.altRowTemplate = n.lockedRowTemplate = n.lockedAltRowTemplate = n.detailTemplate = n.footerTemplate = n.groupFooterTemplate = n.lockedGroupFooterTemplate = n.noRecordsTemplate = null, n.scrollables = n.thead = n.tbody = n.element = n.table = n.content = n.footer = n.wrapper = n._groupableClickHandler = n._setContentWidthHandler = null }, getOptions: function() { var n, i, r, o = this.options; return o.dataSource = null, n = _t(!0, {}, this.options), n.columns = dt.deepExtend([], this.columns), i = this.dataSource, r = i.options.data && i._data, i.options.data = null, n.dataSource = e.extend(!0, {}, i.options), i.options.data = r, n.dataSource.data = r, n.dataSource.page = i.page(), n.dataSource.filter = i.filter(), n.dataSource.pageSize = i.pageSize(), n.dataSource.sort = i.sort(), n.dataSource.group = i.group(), n.dataSource.aggregate = i.aggregate(), n.dataSource.transport && (n.dataSource.transport.dataSource = null), n.$angular = t, n }, setOptions: function(e) { var t, n, i, r, o = this.getOptions(); dt.deepExtend(o, e), e.dataSource || (o.dataSource = this.dataSource), t = this.wrapper, n = this._events, i = this.element, this.destroy(), this.options = null, this._isMobile && (r = t.closest(dt.roleSelector("pane")).parent(), r.after(t), r.remove(), t.removeClass("k-grid-mobile")), t[0] !== i[0] && (t.before(i), t.remove()), i.empty(), this.init(i, o, n), this._setEvents(o) }, items: function() { return this.lockedContent ? this._items(this.tbody).add(this._items(this.lockedTable.children("tbody"))) : this._items(this.tbody) }, _items: function(t) { return t.children().filter(function() { var t = e(this); return !t.hasClass("k-grouping-row") && !t.hasClass("k-detail-row") && !t.hasClass("k-group-footer") }) }, dataItems: function() { var e, t, n, i = dt.ui.DataBoundWidget.fn.dataItems.call(this); if (this.lockedContent) { for (e = i.length, t = Array(2 * e), n = e; --n >= 0;) t[n] = t[n + e] = i[n]; i = t } return i }, _destroyColumnAttachments: function() { var t = this; t.resizeHandle = null, t.thead && (this.angular("cleanup", function() { return { elements: t.thead.get() } }), t.thead.add(t.lockedHeader).find("th").each(function() { var t = e(this), n = t.data("kendoFilterMenu"), i = t.data("kendoColumnSorter"), r = t.data("kendoColumnMenu"); n && n.destroy(), i && i.destroy(), r && r.destroy() })) }, _attachCustomCommandsEvent: function() { var e, t, n, i = this, r = L(i.columns || []); for (t = 0, n = r.length; n > t; t++) e = r[t].command, e && s(i, i.wrapper, e) }, _aria: function() { var e = this.element.attr("id") || "aria"; e && (this._cellId = e + "_active_cell") }, _element: function() { var t = this, n = t.element; n.is("table") || (n = t.options.scrollable ? t.element.find("> .k-grid-content > table") : t.element.children("table"), n.length || (n = e("<table />").appendTo(t.element))), yn && n.attr("cellspacing", 0), t.table = n.attr("role", t._hasDetails() ? "treegrid" : "grid"), t._wrapper() }, _createResizeHandle: function(t, n) { var i, r, o, a, s, l, c, d = this, u = d.options.columnResizeHandleWidth, h = d.options.scrollable, p = d.resizeHandle, f = this._groups(); if (p && d.lockedContent && p.data("th")[0] !== n[0] && (p.off(Ht).remove(), p = null), p || (p = d.resizeHandle = e('<div class="k-resize-handle"><div class="k-resize-handle-inner"></div></div>'), t.append(p)), wn) i = n.position().left, h && (a = n.closest(".k-grid-header-wrap, .k-grid-header-locked"), s = bn.msie ? a.scrollLeft() : 0, l = bn.webkit ? a[0].scrollWidth - a[0].offsetWidth - a.scrollLeft() : 0, c = bn.mozilla ? a[0].scrollWidth - a[0].offsetWidth - (a[0].scrollWidth - a[0].offsetWidth - a.scrollLeft()) : 0, i -= l - c + s); else { for (i = n[0].offsetWidth, r = N(n.closest("thead")).filter(":visible"), o = 0; r.length > o && r[o] != n[0]; o++) i += r[o].offsetWidth; f > 0 && (i += t.find(".k-group-cell:first").outerWidth() * f), d._hasDetails() && (i += t.find(".k-hierarchy-cell:first").outerWidth()) } p.css({ top: n.position().top, left: i - u, height: n.outerHeight(), width: 3 * u }).data("th", n).show(), p.off("dblclick" + Ht).on("dblclick" + Ht, function() { d._autoFitLeafColumn(n.data("index")) }) }, _positionColumnResizeHandle: function() { var t = this, n = t.options.columnResizeHandleWidth, i = t.lockedHeader ? t.lockedHeader.find("thead:first") : e(); t.thead.add(i).on("mousemove" + Ht, "th", function(i) { var o, a, s, l = e(this); l.hasClass("k-group-cell") || l.hasClass("k-hierarchy-cell") || (o = i.clientX, a = e(window).scrollLeft(), s = l.offset().left + (wn ? 0 : this.offsetWidth), o + a > s - n && s + n > o + a ? t._createResizeHandle(l.closest("div"), l) : t.resizeHandle ? t.resizeHandle.hide() : r(t.wrapper, "")) }) }, _resizeHandleDocumentClick: function(t) { e(t.target).closest(".k-column-active").length || (e(document).off(t), this._hideResizeHandle()) }, _hideResizeHandle: function() { this.resizeHandle && (this.resizeHandle.data("th").removeClass("k-column-active"), this.lockedContent && !this._isMobile ? (this.resizeHandle.off(Ht).remove(), this.resizeHandle = null) : this.resizeHandle.hide()) }, _positionColumnResizeHandleTouch: function() { var t = this, n = t.lockedHeader ? t.lockedHeader.find("thead:first") : e(); t._resizeUserEvents = new dt.UserEvents(n.add(t.thead), { filter: "th:not(.k-group-cell):not(.k-hierarchy-cell)", threshold: 10, hold: function(n) { var i = e(n.target); n.preventDefault(), i.addClass("k-column-active"), t._createResizeHandle(i.closest("div"), i), t._resizeHandleDocumentClickHandler || (t._resizeHandleDocumentClickHandler = Ct(t._resizeHandleDocumentClick, t)), e(document).on("click", t._resizeHandleDocumentClickHandler) } }) }, _resizable: function() { var t, n, i, o, a, s, l, c = this, d = c.options, u = this._isMobile, h = dt.support.mobileOS ? 0 : dt.support.scrollbar(); d.resizable && (t = d.scrollable ? c.wrapper.find(".k-grid-header-wrap:first") : c.wrapper, u ? c._positionColumnResizeHandleTouch(t) : c._positionColumnResizeHandle(t), c.resizable && c.resizable.destroy(), c.resizable = new ut.Resizable(t.add(c.lockedHeader), { handle: (d.scrollable ? "" : ">") + ".k-resize-handle", hint: function(t) { return e('<div class="k-grid-resize-indicator" />').css({ height: t.data("th").outerHeight() + c.tbody.attr("clientHeight") }) }, start: function(t) { var h, p, f, g; l = e(t.currentTarget).data("th"), u && c._hideResizeHandle(), h = l.closest("table"), p = e.inArray(l[0], N(l.closest("thead")).filter(":visible")), a = h.parent().hasClass("k-grid-header-locked"), f = a ? c.lockedTable : c.table, g = c.footer || e(), c.footer && c.lockedContent && (g = c.footer.children(a ? ".k-grid-footer-locked" : ".k-grid-footer-wrap")), r(c.wrapper, "col-resize"), s = d.scrollable ? h.find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + p + ")").add(f.children("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + p + ")")).add(g.find("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + p + ")")) : f.children("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + p + ")"), n = t.x.location, i = l.outerWidth(), o = a ? f.children("tbody").outerWidth() : c.tbody.outerWidth(), bn.webkit && c.wrapper.addClass("k-grid-column-resizing") }, resize: function(t) { var r, u, p, f, g, m, v = wn ? -1 : 1, _ = i + t.x.location * v - n * v; d.scrollable ? (a && c.lockedFooter ? r = c.lockedFooter.children("table") : c.footer && (r = c.footer.find(">.k-grid-footer-wrap>table")), r && r[0] || (r = e()), u = l.closest("table"), p = a ? c.lockedTable : c.table, f = !1, g = c.wrapper.width() - h, m = _, a && o - i + m > g && (m = i + (g - o - 2 * h), 0 > m && (m = _), f = !0), m > 10 && (s.css("width", m), o && (m = f ? g - 2 * h : o + t.x.location * v - n * v, p.add(u).add(r).css("width", m), a || (c._footerWidth = m)))) : _ > 10 && s.css("width", _) }, resizeend: function() { var e, t, n, o = l.outerWidth(); r(c.wrapper, ""), bn.webkit && c.wrapper.removeClass("k-grid-column-resizing"), i != o && (t = c.lockedHeader ? c.lockedHeader.find("thead:first tr:first").add(c.thead.find("tr:first")) : l.parent(), n = l.attr(dt.attr("index")), n || (n = t.find("th:not(.k-group-cell):not(.k-hierarchy-cell)").index(l)), e = L(c.columns)[n], e.width = o, c.trigger(Jt, { column: e, oldWidth: i, newWidth: o }), c._applyLockedContainersWidth(), c._syncLockedContentHeight(), c._syncLockedHeaderHeight()), c._hideResizeHandle(), l = null } })) }, _draggable: function() { var t = this; t.options.reorderable && (t._draggableInstance && t._draggableInstance.destroy(), t._draggableInstance = t.wrapper.kendoDraggable({ group: dt.guid(), filter: t.content ? ".k-grid-header:first " + Rt : "table:first>.k-grid-header " + Rt, drag: function() { t._hideResizeHandle() }, hint: function(t) { return e('<div class="k-header k-drag-clue" />').css({ width: t.width(), paddingLeft: t.css("paddingLeft"), paddingRight: t.css("paddingRight"), lineHeight: t.height() + "px", paddingTop: t.css("paddingTop"), paddingBottom: t.css("paddingBottom") }).html(t.attr(dt.attr("title")) || t.attr(dt.attr("field")) || t.text()).prepend('<span class="k-icon k-drag-status k-denied" />') } }).data("kendoDraggable")) }, _reorderable: function() { var t, n = this; n.options.reorderable && (n.wrapper.data("kendoReorderable") && n.wrapper.data("kendoReorderable").destroy(), t = function(e, t, i) { var r = e[t], o = e[i], a = c(r, n.columns); return e = a ? a.columns : n.columns, kt(o, e) }, n.wrapper.kendoReorderable({ draggable: n._draggableInstance, dragOverContainers: function(e, i) { var r = S(n.columns); return r[e].lockable !== !1 && t(r, e, i) > -1 }, inSameContainer: function(i) { return e(i.source).parent()[0] === e(i.target).parent()[0] && t(S(n.columns), i.sourceIndex, i.targetIndex) > -1 }, change: function(e) { var i = S(n.columns), r = i[e.oldIndex], o = t(i, e.oldIndex, e.newIndex); n.trigger(en, { newIndex: o, oldIndex: kt(r, i), column: r }), n.reorderColumn(o, r, "before" === e.position) } })) }, _reorderHeader: function(e, t, n) { var i, r, s, l, c = this, d = y(e[0], c.columns), u = y(t, c.columns), h = []; for (i = 0; e.length > i; i++) e[i].columns && (h = h.concat(e[i].columns)); r = a(c.lockedHeader, c.thead, "tr:eq(" + d.row + ")>th.k-header:not(.k-group-cell,.k-hierarchy-cell)"), s = z(e).length, l = z([t]).length, h.length ? (s > 0 && 0 === l ? v(e, t, h, c.columns, c.lockedHeader.find("thead"), c.thead, this._groups()) : 0 === s && l > 0 && v(e, t, h, c.columns, c.thead, c.lockedHeader.find("thead"), this._groups()), (t.columns || d.cell - u.cell > 1 || u.cell - d.cell > 1) && (t = x(c.columns, t, e[0], n), t && c._reorderHeader(h, t, n))) : s !== l && m(r[d.cell], c.columns, s), o(r, d.cell, u.cell, n, e.length) }, _reorderContent: function(t, n, i) { var r, s, l, c, d = this, u = e(), h = t[0], p = f(t), g = kt(h, L(d.columns)), m = kt(n, L(d.columns)), v = kt(h, B(d.columns)), _ = kt(n, B(d.columns)), w = z(d.columns).length, b = !!n.locked, y = d.footer || d.wrapper.find(".k-grid-footer"), k = r = _; for (n.hidden && (b ? (_ = d.lockedTable.find("colgroup"), k = d.lockedHeader.find("colgroup"), r = e(d.lockedFooter).find(">table>colgroup")) : (_ = d.tbody.prev(), k = d.thead.prev(), r = y.find(".k-grid-footer-wrap").find(">table>colgroup"))), d._hasFilterRow() && o(d.wrapper.find(".k-filter-row th:not(.k-group-cell,.k-hierarchy-cell)"), g, m, i, t.length), o(a(d.lockedHeader, d.thead.prev(), "col:not(.k-group-col,.k-hierarchy-col)"), v, k, i, p.length), d.options.scrollable && o(a(d.lockedTable, d.tbody.prev(), "col:not(.k-group-col,.k-hierarchy-col)"), v, _, i, p.length), y && y.length && (o(a(d.lockedFooter, y.find(".k-grid-footer-wrap"), ">table>colgroup>col:not(.k-group-col,.k-hierarchy-col)"), v, r, i, p.length), o(y.find(".k-footer-template>td:not(.k-group-cell,.k-hierarchy-cell)"), g, m, i, t.length)), s = d.tbody.children(":not(.k-grouping-row,.k-detail-row)"), d.lockedTable && (w > m ? g >= w && et(d.lockedTable.find(">tbody>tr.k-grouping-row"), d.table.find(">tbody>tr.k-grouping-row"), t.length) : w > g && et(d.table.find(">tbody>tr.k-grouping-row"), d.lockedTable.find(">tbody>tr.k-grouping-row"), t.length), u = d.lockedTable.find(">tbody>tr:not(.k-grouping-row,.k-detail-row)")), l = 0, c = s.length; c > l; l += 1) o(a(u[l], s[l], ">td:not(.k-group-cell,.k-hierarchy-cell)"), g, m, i, t.length) }, _autoFitLeafColumn: function(e) { this.autoFitColumn(L(this.columns)[e]) }, autoFitColumn: function(t) { var n, i, r, o, a, s, l, c, d, u, f, g, m, v, _, w, b, y = this, k = y.options, x = y.columns, C = y.lockedHeader ? N(y.lockedHeader.find(">table>thead")).filter(h).length : 0, S = "col:not(.k-group-col):not(.k-hierarchy-col)", D = "td:visible:not(.k-group-cell):not(.k-hierarchy-cell)"; if (t = "number" == typeof t ? x[t] : vt(t) ? bt(T(x), function(e) { return e === t })[0] : bt(T(x), function(e) { return e.field === t })[0], t && p(t)) { for (n = kt(t, L(x)), o = t.locked, r = o ? y.lockedHeader.children("table") : y.thead.parent(), i = r.find("[data-index='" + n + "']"), s = o ? y.lockedTable : y.table, l = y.footer || e(), y.footer && y.lockedContent && (l = y.footer.children(o ? ".k-grid-footer-locked" : ".k-grid-footer-wrap")), c = l.find("table").first(), y.lockedHeader && !o && (n -= C), d = 0; x.length > d && x[d] !== t; d++) x[d].hidden && n--; if (a = k.scrollable ? r.find(S).eq(n).add(s.children("colgroup").find(S).eq(n)).add(c.find("colgroup").find(S).eq(n)) : s.children("colgroup").find(S).eq(n), u = r.add(s).add(c), f = i.outerWidth(), a.width(""), u.css("table-layout", "fixed"), a.width("auto"), u.addClass("k-autofitting"), u.css("table-layout", ""), g = Math.ceil(Math.max(i.outerWidth(), s.find("tr:not(.k-grouping-row)").eq(0).children(D).eq(n).outerWidth(), c.find("tr").eq(0).children(D).eq(n).outerWidth())) + 1, a.width(g), t.width = g, k.scrollable) { for (m = r.find("col"), _ = 0, w = 0, b = m.length; b > w; w += 1) { if (v = m[w].style.width, !v || -1 != v.indexOf("%")) { _ = 0; break } _ += parseInt(v, 10) } _ && u.each(function() { this.style.width = _ + "px" }) } bn.msie && 8 == bn.version && (u.css("display", "inline-table"), setTimeout(function() { u.css("display", "table") }, 1)), u.removeClass("k-autofitting"), y.trigger(Jt, { column: t, oldWidth: f, newWidth: g }), y._applyLockedContainersWidth(), y._syncLockedContentHeight(), y._syncLockedHeaderHeight() } }, reorderColumn: function(e, n, i) { var r, o, a = this, s = c(n, a.columns), l = s ? s.columns : a.columns, d = kt(n, l), u = l[e], h = !!u.locked, p = z(a.columns).length; d !== e && (n.locked || !h || 1 != F(a.columns).length) && (!n.locked || h || 1 != p) && (a._hideResizeHandle(), i === t && (i = d > e), o = [n], a._reorderHeader(o, u, i), a.lockedHeader && (P(a.thead), P(a.lockedHeader)), u.columns && (u = L(u.columns), u = u[i ? 0 : u.length - 1]), n.columns && (o = L(n.columns)), a._reorderContent(o, u, i), r = !!n.locked, r = r != h, n.locked = h, l.splice(i ? e : e + 1, 0, n), l.splice(e > d ? d : d + 1, 1), a._templates(), a._updateColumnCellIndex(), a._updateTablesWidth(), a._applyLockedContainersWidth(), a._syncLockedHeaderHeight(), a._syncLockedContentHeight(), a._updateFirstColumnClass(), r && (h ? a.trigger(tn, { column: n }) : a.trigger(nn, { column: n }))) }, _updateColumnCellIndex: function() { var e, t = 0; this.lockedHeader && (e = this.lockedHeader.find("thead"), t = _(e, z(this.columns))), _(this.thead, F(this.columns), t) }, lockColumn: function(e) { var t, n = this.columns; e = "number" == typeof e ? n[e] : bt(n, function(t) { return t.field === e })[0], !e || e.locked || e.hidden || (t = z(n).length - 1, this.reorderColumn(t, e, !1)) }, unlockColumn: function(e) { var t, n = this.columns; e = "number" == typeof e ? n[e] : bt(n, function(t) { return t.field === e })[0], e && e.locked && !e.hidden && (t = z(n).length, this.reorderColumn(t, e, !0)) }, cellIndex: function(t) { var n = 0; return this.lockedTable && !e.contains(this.lockedTable[0], t[0]) && (n = L(z(this.columns)).length), e(t).parent().children("td:not(.k-group-cell,.k-hierarchy-cell)").index(t) + n }, _modelForContainer: function(t) { t = e(t), t.is("tr") || "popup" === this._editMode() || (t = t.closest("tr")); var n = t.attr(dt.attr("uid")); return this.dataSource.getByUid(n) }, _editable: function() { var t, n = this, i = n.selectable && n.selectable.options.multiple, r = n.options.editable, o = function() { var t = ft(), i = n._editContainer; !i || e.contains(i[0], t) || i[0] === t || e(t).closest(".k-animation-container").length || n.editable.end() && n.closeCell() }; r && (t = n._editMode(), "incell" === t ? r.update !== !1 && n.wrapper.on(rn + Ht, "tr:not(.k-grouping-row) > td", function(t) { var r = e(this), o = n.lockedTable && r.closest("table")[0] === n.lockedTable[0]; r.hasClass("k-hierarchy-cell") || r.hasClass("k-detail-cell") || r.hasClass("k-group-cell") || r.hasClass("k-edit-cell") || r.has("a.k-grid-delete").length || r.has("button.k-grid-delete").length || r.closest("tbody")[0] !== n.tbody[0] && !o || e(t.target).is(":input") || (n.editable ? n.editable.end() && (i && e(ft()).blur(), n.closeCell(), n.editCell(r)) : n.editCell(r)) }).on("focusin" + Ht, function() { e.contains(this, ft()) || (clearTimeout(n.timer), n.timer = null) }).on("focusout" + Ht, function() { n.timer = setTimeout(o, 1) }) : r.update !== !1 && n.wrapper.on(rn + Ht, "tbody>tr:not(.k-detail-row,.k-grouping-row):visible a.k-grid-edit", function(t) { t.preventDefault(), n.editRow(e(this).closest("tr")) }), r.destroy !== !1 ? n.wrapper.on(rn + Ht, "tbody>tr:not(.k-detail-row,.k-grouping-row):visible .k-grid-delete", function(t) { t.preventDefault(), t.stopPropagation(), n.removeRow(e(this).closest("tr")) }) : n.wrapper.on(rn + Ht, "tbody>tr:not(.k-detail-row,.k-grouping-row):visible button.k-grid-delete", function(e) { e.stopPropagation(), n._confirmation() || e.preventDefault() })) }, editCell: function(t) { var n, i, r, o; t = e(t), n = this, i = L(n.columns)[n.cellIndex(t)], r = n._modelForContainer(t), n.closeCell(), !r || r.editable && !r.editable(i.field) || i.command || !i.field || (n._attachModelChange(r), n._editContainer = t, n.editable = t.addClass("k-edit-cell").kendoEditable({ fields: { field: i.field, format: i.format, editor: i.editor, values: i.values }, model: r, target: n, change: function(e) { n.trigger(Lt, { values: e.values, container: t, model: r }) && e.preventDefault() } }).data("kendoEditable"), o = t.parent().addClass("k-grid-edit-row"), n.lockedContent && it(o[0], n._relatedRow(o).addClass("k-grid-edit-row")[0]), n.trigger(Bt, { container: t, model: r })) }, _adjustLockedHorizontalScrollBar: function() { var e = this.table, t = e.parent(), n = e[0].offsetWidth > t[0].clientWidth ? dt.support.scrollbar() : 0; this.lockedContent.height(t.height() - n) }, _syncLockedContentHeight: function() { this.lockedTable && (this.touchScroller || this._adjustLockedHorizontalScrollBar(), this._adjustRowsHeight(this.table, this.lockedTable)) }, _syncLockedHeaderHeight: function() { var e, t; this.lockedHeader && (e = this.lockedHeader.children("table"), t = this.thead.parent(), this._adjustRowsHeight(e, t), nt(e, t)) }, _syncLockedFooterHeight: function() { this.lockedFooter && this.footer && this.footer.length && this._adjustRowsHeight(this.lockedFooter.children("table"), this.footer.find(".k-grid-footer-wrap > table")) }, _destroyEditable: function() { var e = this, t = function() { if (e.editable) { var t = e.editView ? e.editView.element : e._editContainer; t && (t.off(rn + Ht, "a.k-grid-cancel", e._editCancelClickHandler), t.off(rn + Ht, "a.k-grid-update", e._editUpdateClickHandler)), e._detachModelChange(), e.editable.destroy(), e.editable = null, e._editContainer = null, e._destroyEditView() } }; e.editable && ("popup" !== e._editMode() || e._isMobile ? t() : e._editContainer.data("kendoWindow").bind("deactivate", t).close()), e._actionSheet && (e._actionSheet.destroy(), e._actionSheet = null) }, _destroyEditView: function() { this.editView && (this.editView.purge(), this.editView = null, this.pane.navigate("")) }, _attachModelChange: function(e) { var t = this; t._modelChangeHandler = function(e) { t._modelChange({ field: e.field, model: this }) }, e.bind("change", t._modelChangeHandler) }, _detachModelChange: function() { var e = this, t = e._editContainer, n = e._modelForContainer(t); n && n.unbind(Wt, e._modelChangeHandler) }, closeCell: function(t) { var n, i, r, o, a = this, s = a._editContainer; s && (n = s.closest("tr").attr(dt.attr("uid")), o = a.dataSource.getByUid(n), t && a.trigger("cancel", { container: s, model: o }) || (s.removeClass("k-edit-cell"), i = L(a.columns)[a.cellIndex(s)], r = s.parent().removeClass("k-grid-edit-row"), a._destroyEditable(), a._displayCell(s, i, o), s.hasClass("k-dirty-cell") && e('<span class="k-dirty"/>').prependTo(s), a.lockedContent && it(r.css("height", "")[0], a._relatedRow(r).css("height", "")[0]))) }, _displayCell: function(e, t, n) { var i = this, r = { storage: {}, count: 0 }, o = _t({}, dt.Template, i.options.templateSettings), a = dt.template(i._cellTmpl(t, r), o); r.count > 0 && (a = Ct(a, r.storage)), e.empty().html(a(n)), i.angular("compile", function() { return { elements: e, data: [{ dataItem: n }] } }) }, removeRow: function(e) { this._confirmation(e) && this._removeRow(e) }, _removeRow: function(t) { var n, i = this, r = i._editMode(); "incell" !== r && i.cancelRow(), t = e(t), i.lockedContent && (t = t.add(i._relatedRow(t))), t = t.hide(), n = i._modelForContainer(t), n && !i.trigger(Nt, { row: t, model: n }) ? (i.dataSource.remove(n), ("inline" === r || "popup" === r) && i.dataSource.sync()) : "incell" === r && i._destroyEditable() }, _editMode: function() { var e = "incell", t = this.options.editable; return t !== !0 && (e = "string" == typeof t ? t : t.mode || e), e }, editRow: function(n) { var i, r, o, a = this; n instanceof dt.data.ObservableObject ? i = n : (n = e(n), i = a._modelForContainer(n)), r = a._editMode(), a.cancelRow(), i && (a._attachModelChange(i), "popup" === r ? a._createPopupEditor(i) : "inline" === r ? a._createInlineEditor(n, i) : "incell" === r && e(n).children(It).each(function() { var n = e(this), r = L(a.columns)[n.index()]; return i = a._modelForContainer(n), i && (!i.editable || i.editable(r.field)) && r.field ? (a.editCell(n), !1) : t }), o = a.editView ? a.editView.element : a._editContainer, o && (this._editCancelClickHandler || (this._editCancelClickHandler = Ct(this._editCancelClick, this)), o.on(rn + Ht, "a.k-grid-cancel", this._editCancelClickHandler), this._editUpdateClickHandler || (this._editUpdateClickHandler = Ct(this._editUpdateClick, this)), o.on(rn + Ht, "a.k-grid-update", this._editUpdateClickHandler))) }, _editUpdateClick: function(e) { e.preventDefault(), e.stopPropagation(), this.saveRow() }, _editCancelClick: function(t) { var n, i = this, r = i.options.navigatable, o = i.editable.options.model, a = i.editView ? i.editView.element : i._editContainer; t.preventDefault(), t.stopPropagation(), i.trigger("cancel", { container: a, model: o }) || (n = i.items().index(e(i.current()).parent()), i.cancelRow(), r && (i.current(i.items().eq(n).children().filter(zt).first()), ot(i.table, !0))) }, _createPopupEditor: function(n) { var i, r, o, a, s, l, c, d, u, h, p, f = this, g = "<div " + dt.attr("uid") + '="' + n.uid + '" class="k-popup-edit-form' + (f._isMobile ? " k-mobile-list" : "") + '"><div class="k-edit-form-container">', m = [], v = L(f.columns), _ = f.options.editable, w = _.template, b = vt(_) ? _.window : {}, y = _t({}, dt.Template, f.options.templateSettings); if (b = b || {}, w) for (typeof w === ln && (w = window.unescape(w)), g += dt.template(w, y)(n), o = 0, a = v.length; a > o; o++) i = v[o], i.command && (d = rt(i.command, "edit"), d && (r = d)); else for (o = 0, a = v.length; a > o; o++) i = v[o], i.command ? i.command && (d = rt(i.command, "edit"), d && (r = d)) : (g += '<div class="k-edit-label"><label for="' + i.field + '">' + (i.title || i.field || "") + "</label></div>", n.editable && !n.editable(i.field) || !i.field ? (h = { storage: {}, count: 0 }, s = dt.template(f._cellTmpl(i, h), y), h.count > 0 && (s = Ct(s, h.storage)), g += '<div class="k-edit-field">' + s(n) + "</div>") : (m.push({ field: i.field, format: i.format, editor: i.editor, values: i.values }), g += "<div " + dt.attr("container-for") + '="' + i.field + '" class="k-edit-field"></div>')); r && vt(r) && (r.text && vt(r.text) && (l = r.text.update, c = r.text.cancel), r.attr && (u = r.attr)), f._isMobile ? (g += "</div></div>", f.editView = f.pane.append("<div data-" + dt.ns + 'role="view" data-' + dt.ns + 'init-widgets="false" class="k-grid-edit-form"><div data-' + dt.ns + 'role="header" class="k-header">' + f._createButton({ name: "update", text: l, attr: u }) + (b.title || "Edit") + f._createButton({ name: "canceledit", text: c, attr: u }) + "</div>" + g + "</div>"), p = f._editContainer = f.editView.element.find(".k-popup-edit-form")) : (g += '<div class="k-edit-buttons k-state-default">', g += f._createButton({ name: "update", text: l, attr: u }) + f._createButton({ name: "canceledit", text: c, attr: u }), g += "</div></div></div>", p = f._editContainer = e(g).appendTo(f.wrapper).eq(0).kendoWindow(_t({ modal: !0, resizable: !1, draggable: !0, title: "Edit", visible: !1, close: function(i) { if (i.userTriggered) { if (i.sender.element.focus(), f.trigger("cancel", { container: p, model: n })) return i.preventDefault(), t; var r = f.items().index(e(f.current()).parent()); f.cancelRow(), f.options.navigatable && (f.current(f.items().eq(r).children().filter(zt).first()), ot(f.table, !0)) } } }, b))), f.editable = f._editContainer.kendoEditable({ fields: m, model: n, clearContainer: !1, target: f }).data("kendoEditable"), f._isMobile && p.find("input[type=checkbox],input[type=radio]").parent(".k-edit-field").addClass("k-check").prev(".k-edit-label").addClass("k-check").click(function() { e(this).next().children("input").click() }), f._openPopUpEditor(), f.trigger(Bt, { container: p, model: n }) }, _openPopUpEditor: function() { this._isMobile ? this.pane.navigate(this.editView, this._editAnimation) : this._editContainer.data("kendoWindow").center().open() }, _createInlineEditor: function(t, n) { var i, r, o, a = this, s = []; a.lockedContent && (t = t.add(a._relatedRow(t))), t.children(":not(.k-group-cell,.k-hierarchy-cell)").each(function() { if (r = e(this), i = L(a.columns)[a.cellIndex(r)], i.command || !i.field || n.editable && !n.editable(i.field)) { if (i.command && (o = rt(i.command, "edit"))) { r.empty(); var t, l, c; vt(o) && (o.text && vt(o.text) && (t = o.text.update, l = o.text.cancel), o.attr && (c = o.attr)), e(a._createButton({ name: "update", text: t, attr: c }) + a._createButton({ name: "canceledit", text: l, attr: c })).appendTo(r) } } else s.push({ field: i.field, format: i.format, editor: i.editor, values: i.values }), r.attr(dt.attr("container-for"), i.field), r.empty() }), a._editContainer = t, a.editable = new dt.ui.Editable(t.addClass("k-grid-edit-row"), { target: a, fields: s, model: n, clearContainer: !1 }), t.length > 1 && (it(t[0], t[1]), a._applyLockedContainersWidth()), a.trigger(Bt, { container: t, model: n }) }, cancelRow: function() { var e, t = this, n = t._editContainer; n && (e = t._modelForContainer(n), t._destroyEditable(), t.dataSource.cancelChanges(e), t._displayRow("popup" !== t._editMode() ? n : t.tbody.find("[" + dt.attr("uid") + "=" + e.uid + "]"))) }, saveRow: function() { var e = this, t = e._editContainer, n = e._modelForContainer(t), i = e.editable; t && i && i.end() && !e.trigger(Lt, { container: t, model: n }) && e.dataSource.sync() }, _displayRow: function(t) { var n, i, r, o = this, a = o._modelForContainer(t), s = t.hasClass("k-state-selected"), l = t.hasClass("k-alt"); a && (o.lockedContent && (n = e((l ? o.lockedAltRowTemplate : o.lockedRowTemplate)(a)), o._relatedRow(t.last()).replaceWith(n)), o.angular("cleanup", function() { return { elements: t.get() } }), i = e((l ? o.altRowTemplate : o.rowTemplate)(a)), t.replaceWith(i), o.angular("compile", function() { return { elements: i.get(), data: [{ dataItem: a }] } }), s && o.options.selectable && o.select(i.add(n)), n && it(i[0], n[0]), r = i.next(), r.hasClass("k-detail-row") && r.is(":visible") && i.find(".k-hierarchy-cell .k-icon").removeClass("k-plus").addClass("k-minus")) }, _showMessage: function(t, n) { var i, r, o, a = this; return a._isMobile ? (i = dt.template('<ul><li class="km-actionsheet-title">#:title#</li><li><a href="\\#" class="k-button k-grid-delete">#:confirmDelete#</a></li></ul>'), r = e(i(t)).appendTo(a.view.element), o = a._actionSheet = new dt.mobile.ui.ActionSheet(r, { cancel: t.cancelDelete, cancelTemplate: '<li class="km-actionsheet-cancel"><a class="k-button" href="\\#">#:cancel#</a></li>', close: function() { this.destroy() }, command: function(t) { var i = e(t.currentTarget).parent(); i.hasClass("km-actionsheet-cancel") || a._removeRow(n) }, popup: a._actionSheetPopupOptions }), o.open(n), !1) : window.confirm(t.title) }, _confirmation: function(e) { var t = this, n = t.options.editable, i = n === !0 || typeof n === ln ? t.options.messages.editable.confirmation : n.confirmation; return i !== !1 && null != i ? (typeof i === sn && (i = i(t._modelForContainer(e))), t._showMessage({ confirmDelete: n.confirmDelete || t.options.messages.editable.confirmDelete, cancelDelete: n.cancelDelete || t.options.messages.editable.cancelDelete, title: i === !0 ? t.options.messages.editable.confirmation : i }, e)) : !0 }, cancelChanges: function() { this.dataSource.cancelChanges() }, saveChanges: function() { var e = this; (e.editable && e.editable.end() || !e.editable) && !e.trigger(qt) && e.dataSource.sync() }, addRow: function() { var e, t, n, i, r, o, a = this, s = a.dataSource, l = a._editMode(), c = a.options.editable.createAt || "", d = s.pageSize(), u = s.view() || []; (a.editable && a.editable.end() || !a.editable) && ("incell" != l && a.cancelRow(), e = s.indexOf(u[0]), "bottom" == c.toLowerCase() && (e += u.length, d && !s.options.serverPaging && u.length >= d && (e -= 1)), 0 > e && (e = s.page() > s.totalPages() ? (s.page() - 1) * d : 0), t = s.insert(e, {}), n = t.uid, i = a.lockedContent ? a.lockedTable : a.table, r = i.find("tr[" + dt.attr("uid") + "=" + n + "]"), o = r.children("td:not(.k-group-cell,.k-hierarchy-cell)").eq(a._firstEditableColumnIndex(r)), "inline" === l && r.length ? a.editRow(r) : "popup" === l ? a.editRow(t) : o.length && a.editCell(o), "bottom" == c.toLowerCase() && a.lockedContent && (a.lockedContent[0].scrollTop = a.content[0].scrollTop = a.content[0].offsetHeight)) }, _firstEditableColumnIndex: function(e) { var t, n, i, r = this, o = L(r.columns), a = r._modelForContainer(e); for (n = 0, i = o.length; i > n; n++) if (t = o[n], a && (!a.editable || a.editable(t.field)) && !t.command && t.field && t.hidden !== !0) return n; return -1 }, _toolbar: function() { var t, n = this, i = n.wrapper, r = n.options.toolbar, o = n.options.editable; r && (t = n.wrapper.find(".k-grid-toolbar"), t.length || (St(r) || (r = typeof r === ln ? r : n._toolbarTmpl(r).replace(fn, "\\#"), r = Ct(dt.template(r), n)), t = e('<div class="k-header k-grid-toolbar" />').html(r({})).prependTo(i), n.angular("compile", function() { return { elements: t.get() } })), o && o.create !== !1 && t.on(rn + Ht, ".k-grid-add", function(e) { e.preventDefault(), n.addRow() }).on(rn + Ht, ".k-grid-cancel-changes", function(e) { e.preventDefault(), n.cancelChanges() }).on(rn + Ht, ".k-grid-save-changes", function(e) { e.preventDefault(), n.saveChanges() }), t.on(rn + Ht, ".k-grid-excel", function(e) { e.preventDefault(), n.saveAsExcel() }), t.on(rn + Ht, ".k-grid-pdf", function(e) { e.preventDefault(), n.saveAsPDF() })) }, _toolbarTmpl: function(e) { var t, n, i = this, r = ""; if (yt(e)) for (t = 0, n = e.length; n > t; t++) r += i._createButton(e[t]); return r }, _createButton: function(e) { var n, r = e.template || _n, o = typeof e === ln ? e : e.name || e.text, a = Cn[o] ? Cn[o].className : "k-grid-" + (o || "").replace(/\s/g, ""), s = { className: a, text: o, imageClass: "", attr: "", iconClass: "" }, l = this.options.messages.commands; if (!(o || vt(e) && e.template)) throw Error("Custom commands should have name specified"); return vt(e) ? (e.className && kt(s.className, e.className.split(" ")) < 0 ? e.className += " " + s.className : e.className === t && (e.className = s.className), "edit" === o && vt(e.text) && (e = _t(!0, {}, e), e.text = e.text.edit), e.attr && (vt(e.attr) && (e.attr = i(e.attr)), typeof e.attr === ln && (n = e.attr.match(/class="(.+?)"/), n && kt(n[1], e.className.split(" ")) < 0 && (e.className += " " + n[1]))), s = _t(!0, s, Cn[o], { text: l[o] }, e)) : s = _t(!0, s, Cn[o], { text: l[o] }), dt.template(r)(s) }, _hasFooters: function() { return !!this.footerTemplate || !!this.groupFooterTemplate || this.footer && this.footer.length > 0 || this.wrapper.find(".k-grid-footer").length > 0 }, _groupable: function() { var t = this; t._groupableClickHandler ? t.table.add(t.lockedTable).off(rn + Ht, t._groupableClickHandler) : t._groupableClickHandler = function(n) { var i = e(this), r = i.closest("tr"); i.hasClass("k-i-collapse") ? t.collapseGroup(r) : t.expandGroup(r), n.preventDefault(), n.stopPropagation() }, t._isLocked() ? t.lockedTable.on(rn + Ht, ".k-grouping-row .k-i-collapse, .k-grouping-row .k-i-expand", t._groupableClickHandler) : t.table.on(rn + Ht, ".k-grouping-row .k-i-collapse, .k-grouping-row .k-i-expand", t._groupableClickHandler), t._attachGroupable() }, _attachGroupable: function() { var t = this, n = t.wrapper, i = t.options.groupable, r = Rt + "[" + dt.attr("field") + "]", o = t.content ? ".k-grid-header:first " + r : "table:first>.k-grid-header " + r; i && i.enabled !== !1 && (n.has("div.k-grouping-header")[0] || e("<div> </div>").addClass("k-grouping-header").prependTo(n), t.groupable && t.groupable.destroy(), t.groupable = new ut.Groupable(n, _t({}, i, { draggable: t._draggableInstance, groupContainer: ">div.k-grouping-header", dataSource: t.dataSource, draggableElements: o, filter: o, allowDrag: t.options.reorderable }))) }, _continuousItems: function(t, n) { var i, r, o, a, s, l, c, d; if (this.lockedContent) { for (i = this, r = i.table.add(i.lockedTable), o = e(t, r[0]), a = e(t, r[1]), s = n ? z(i.columns).length : 1, l = n ? i.columns.length - s : 1, c = [], d = 0; o.length > d; d += s) xt.apply(c, o.slice(d, d + s)), xt.apply(c, a.splice(0, l)); return c } }, _selectable: function() { var n, i, r, o, a = this, s = [], l = a._isLocked(), c = a.options.selectable; c && (a.selectable && a.selectable.destroy(), c = dt.ui.Selectable.parseOptions(c), n = c.multiple, i = c.cell, a._hasDetails() && (s[s.length] = ".k-detail-row"), (a.options.groupable || a._hasFooters()) && (s[s.length] = ".k-grouping-row,.k-group-footer"), s = s.join(","), "" !== s && (s = ":not(" + s + ")"), r = a.table, l && (r = r.add(a.lockedTable)), o = ">" + (i ? Pt : "tbody>tr" + s), a.selectable = new dt.ui.Selectable(r, { filter: o, aria: !0, multiple: n, change: function() { a.trigger(Wt) }, useAllItems: l && n && i, relatedTarget: function(t) { var n, r, o, s; if (!i && l) { for (r = e(), o = 0, s = t.length; s > o; o++) n = a._relatedRow(t[o]), kt(n[0], t) < 0 && (r = r.add(n)); return r } }, continuousItems: function() { return a._continuousItems(o, i) } }), a.options.navigatable && r.on("keydown" + Ht, function(o) { var s = a.current(), c = o.target; if (o.keyCode === mt.SPACEBAR && e.inArray(c, r) > -1 && !s.is(".k-edit-cell,.k-header") && s.parent().is(":not(.k-grouping-row,.k-detail-row,.k-group-footer)")) { if (o.preventDefault(), o.stopPropagation(), s = i ? s : s.parent(), l && !i && (s = s.add(a._relatedRow(s))), n) if (o.ctrlKey) { if (s.hasClass(Xt)) return s.removeClass(Xt), a.trigger(Wt), t } else a.selectable.clear(); else a.selectable.clear(); a.selectable.value(s) } })) }, _clipboard: function() { var e, t = this.options, n = t.selectable; n && t.allowCopy && (e = this, t.navigatable || e.table.add(e.lockedTable).attr("tabindex", 0).on("mousedown" + Ht + " keydown" + Ht, ".k-detail-cell", function(e) { e.target !== e.currentTarget && e.stopImmediatePropagation() }).on("mousedown" + Ht, Mt + ">" + zt, Ct(at, e)), e.copyHandler = Ct(e.copySelection, e), e.updateClipBoardState = function() { e.areaClipBoard && e.areaClipBoard.val(e.getTSV()).focus().select() }, e.bind("change", e.updateClipBoardState), e.wrapper.on("keydown", e.copyHandler), e.clearAreaHandler = Ct(e.clearArea, e), e.wrapper.on("keyup", e.clearAreaHandler)) }, copySelection: function(t) { t instanceof jQuery.Event && !t.ctrlKey && !t.metaKey || e(t.target).is("input:visible,textarea:visible") || window.getSelection && "" + window.getSelection() || document.selection && document.selection.createRange().text || (this.areaClipBoard || (this.areaClipBoard = e("<textarea />").css({ position: "fixed", top: "50%", left: "50%", opacity: 0, width: 0, height: 0 }).appendTo(this.wrapper)), this.areaClipBoard.val(this.getTSV()).focus().select()) }, getTSV: function() { var t, n, i, r, o, a, s = this, l = s.select(), c = " ", d = s.options.allowCopy, u = !0; return e.isPlainObject(d) && d.delimeter && (c = d.delimeter), t = "", l.length && (l.eq(0).is("tr") && (l = l.find("td:not(.k-group-cell)")), u && l.filter(":visible"), n = [], i = this.columns.length, r = s._isLocked() && z(s.columns).length, o = !0, e.each(l, function(t, a) { var l, c, d, h; a = e(a), l = a.closest("tr"), c = l.index(), d = a.index(), u && (d -= a.prevAll(":hidden").length), r && o && (o = e.contains(s.lockedTable[0], a[0])), s._groups() && o && (d -= s._groups()), d = o ? d : d + r, i > d && (i = d), h = a.text(), n[c] || (n[c] = []), n[c][d] = h }), a = n.length, n = e.each(n, function(e, t) { t && (n[e] = t.slice(i), a > e && (a = e)) }), e.each(n.slice(a), function(e, n) { t += n ? n.join(c) + "\r\n" : "\r\n" })), t }, clearArea: function(t) { this.areaClipBoard && t && t.target === this.areaClipBoard[0] && (this.options.navigatable ? e(this.current()).closest("table").focus() : this.table.focus()), this.areaClipBoard && (this.areaClipBoard.remove(), this.areaClipBoard = null) }, _minScreenSupport: function() { var t = this.hideMinScreenCols(); t && (this.minScreenResizeHandler = Ct(this.hideMinScreenCols, this), e(window).on("resize", this.minScreenResizeHandler)) }, hideMinScreenCols: function() { var e, n, i, r = this.columns, o = !1, a = window.innerWidth > 0 ? window.innerWidth : screen.width; for (e = 0; r.length > e; e++) n = r[e], i = n.minScreenWidth, i !== t && null !== i && (o = !0, i > a ? this.hideColumn(n) : this.showColumn(n)); return o }, _relatedRow: function(t) { var n, i, r = this.lockedTable; return t = e(t), r ? (n = t.closest(this.table.add(this.lockedTable)), i = n.find(">tbody>tr").index(t), n = n[0] === this.table[0] ? r : this.table, n.find(">tbody>tr").eq(i)) : t }, clearSelection: function() { var e = this; e.selectable.clear(), e.trigger(Wt) }, select: function(n) { var i = this, r = i.selectable; return n = e(n), n.length ? (r.options.multiple || (r.clear(), n = n.first()), i._isLocked() && (n = n.add(n.map(function() { return i._relatedRow(this) }))), r.value(n), t) : r.value() }, _updateCurrentAttr: function(t, n) { var i, r = e(t).data("headerId"); e(t).removeClass(Kt).removeAttr("aria-describedby").closest("table").removeAttr("aria-activedescendant"), r ? (r = r.replace(this._cellId, ""), e(t).attr("id", r)) : e(t).removeAttr("id"), n.data("headerId", n.attr("id")).attr("id", this._cellId).addClass(Kt).closest("table").attr("aria-activedescendant", this._cellId), n.closest("tr").hasClass("k-grouping-row") || n.hasClass("k-header") ? n.attr("aria-describedby", this._cellId) : (i = this.columns[this.cellIndex(n)], i && (r = i.headerAttributes.id), n.attr("aria-describedby", r + " " + this._cellId)), this._current = n }, _scrollCurrent: function() { var t, n, i, r, o, a, s = this._current, l = this.options.scrollable; s && l && (t = s.parent(), n = t.closest("table").parent(), i = n.is(".k-grid-content-locked,.k-grid-header-locked"), r = n.is(".k-grid-content-locked,.k-grid-content,.k-virtual-scrollable-wrap"), o = e(this.content).find(">.k-virtual-scrollable-wrap").andSelf().last()[0], r && (l.virtual ? (a = Math.max(kt(t[0], this._items(t.parent())), 0), this._rowVirtualIndex = this.virtualScrollable.itemIndex(a), this.virtualScrollable.scrollIntoView(t)) : this._scrollTo(this._relatedRow(t)[0], o)), this.lockedContent && (this.lockedContent[0].scrollTop = o.scrollTop), i || this._scrollTo(s[0], o)) }, current: function(t) { var n = this._current; return t = e(t), t.length && (n && n[0] === t[0] || (this._updateCurrentAttr(n, t), this._scrollCurrent())), this._current }, _removeCurrent: function() { this._current && (this._current.removeClass(Kt), this._current = null) }, _scrollTo: function(t, n) { var i, r = t.tagName.toLowerCase(), o = "td" === r || "th" === r, a = t[o ? "offsetLeft" : "offsetTop"], s = t[o ? "offsetWidth" : "offsetHeight"], l = n[o ? "scrollLeft" : "scrollTop"], c = n[o ? "clientWidth" : "clientHeight"], d = a + s, u = 0, h = 0, p = 0; wn && o && (i = e(t).closest("table")[0], bn.msie ? h = i.offsetLeft : bn.mozilla && (p = i.offsetLeft - dt.support.scrollbar())), l = Math.abs(l + h - p), u = l > a ? a : d > l + c ? c >= s ? d - c : a : l, u = Math.abs(u + h) + p, n[o ? "scrollLeft" : "scrollTop"] = u }, _navigatable: function() { var t, n, i, r = this; r.options.navigatable && (t = r.table.add(r.lockedTable), n = r.thead.parent().add(e(">table", r.lockedHeader)), i = t, r.options.scrollable && (i = i.add(n), n.attr(an, -1)), this._navigatableTables = i, i.off("mousedown" + Ht + " focus" + Ht + " focusout" + Ht + " keydown" + Ht), n.on("keydown" + Ht, Ct(r._openHeaderMenu, r)).find("a.k-link").attr("tabIndex", -1), t.attr(an, Dt.max(t.attr(an) || 0, 0)).on("mousedown" + Ht + " keydown" + Ht, ".k-detail-cell", function(e) { e.target !== e.currentTarget && e.stopImmediatePropagation() }), i.on(dt.support.touch ? "touchstart" + Ht : "mousedown" + Ht, Mt + ">" + zt, Ct(at, r)).on("focus" + Ht, Ct(r._tableFocus, r)).on("focusout" + Ht, Ct(r._tableBlur, r)).on("keydown" + Ht, Ct(r._tableKeyDown, r))) }, _openHeaderMenu: function(e) { e.altKey && e.keyCode == mt.DOWN && (this.current().find(".k-grid-filter, .k-header-column-menu").click(), e.stopImmediatePropagation()) }, _setTabIndex: function(e) { this._navigatableTables.attr(an, -1), e.attr(an, 0) }, _tableFocus: function(t) { var n, i; dt.support.touch || (n = this.current(), i = e(t.currentTarget), n && n.is(":visible") ? n.addClass(Kt) : this.current(i.find(Ft)), this._setTabIndex(i)) }, _tableBlur: function() { var e = this.current(); e && e.removeClass(Kt) }, _tableKeyDown: function(n) { var i, r = this.current(), o = this.virtualScrollable && this.virtualScrollable.fetching(), a = e(n.target), s = !n.isDefaultPrevented() && !a.is(":button,a,:input,a>.k-icon"); return o ? (n.preventDefault(), t) : (r = r ? r : e(this.lockedTable).add(this.table).find(Ft), r.length && (i = !1, s && n.keyCode == mt.UP && (i = this._moveUp(r)), s && n.keyCode == mt.DOWN && (i = this._moveDown(r)), s && n.keyCode == (wn ? mt.LEFT : mt.RIGHT) && (i = this._moveRight(r, n.altKey)), s && n.keyCode == (wn ? mt.RIGHT : mt.LEFT) && (i = this._moveLeft(r, n.altKey)), s && n.keyCode == mt.PAGEDOWN && (i = this._handlePageDown()), s && n.keyCode == mt.PAGEUP && (i = this._handlePageUp()), (n.keyCode == mt.ENTER || n.keyCode == mt.F2) && (i = this._handleEnterKey(r, n.currentTarget, a)), n.keyCode == mt.ESC && (i = this._handleEscKey(r, n.currentTarget)), n.keyCode == mt.TAB && (i = this._handleTabKey(r, n.currentTarget, n.shiftKey)), i && (n.preventDefault(), n.stopPropagation())), t) }, _moveLeft: function(e, t) { var n, i, r = e.parent(), o = r.parent(); return t ? this.collapseRow(r) : (i = o.find(Mt).index(r), n = this._prevHorizontalCell(o, e, i), n[0] || (o = this._horizontalContainer(o), n = this._prevHorizontalCell(o, e, i), n[0] !== e[0] && ot(o.parent(), !0)), this.current(n)), !0 }, _moveRight: function(e, t) { var n, i, r = e.parent(), o = r.parent(); return t ? this.expandRow(r) : (i = o.find(Mt).index(r), n = this._nextHorizontalCell(o, e, i), n[0] || (o = this._horizontalContainer(o, !0), n = this._nextHorizontalCell(o, e, i), n[0] !== e[0] && ot(o.parent(), !0)), this.current(n)), !0 }, _moveUp: function(e) { var t = e.parent().parent(), n = this._prevVerticalCell(t, e); return n[0] || (t = this._verticalContainer(t, !0), n = this._prevVerticalCell(t, e), n[0] && ot(t.parent(), !0)), this.current(n), !0 }, _moveDown: function(e) { var t = e.parent().parent(), n = this._nextVerticalCell(t, e); return n[0] || (t = this._verticalContainer(t), n = this._nextVerticalCell(t, e), n[0] && ot(t.parent(), !0)), this.current(n), !0 }, _handlePageDown: function() { return this.options.pageable ? (this.dataSource.page(this.dataSource.page() + 1), !0) : !1 }, _handlePageUp: function() { return this.options.pageable ? (this.dataSource.page(this.dataSource.page() - 1), !0) : !1 }, _handleTabKey: function(t, n, i) { var r, o = this.options.editable && "incell" == this._editMode(); return !o || t.is("th") ? !1 : (r = e(ft()).closest(".k-edit-cell"), r[0] && r[0] !== t[0] && (t = r), r = this._tabNext(t, n, i), r.length ? (this._handleEditing(t, r, r.closest("table")), !0) : !1) }, _handleEscKey: function(t, n) { var i, r = ft(), o = "incell" == this._editMode(); return st(t) ? (o ? this.closeCell(!0) : (i = e(t).parent().index(), r && r.blur(), this.cancelRow(), i >= 0 && this.current(this.items().eq(i).children(zt).first())), bn.msie && 9 > bn.version && document.body.focus(), ot(n, !0), !0) : t.has(r).length ? (ot(n, !0), !0) : !1 }, _toggleCurrent: function(e) { var t = e.parent(); return t.is(".k-master-row,.k-grouping-row") ? (t.find(".k-icon:first").click(), !0) : !1 }, _handleEnterKey: function(t, n, i) { var r, o = this.options.editable, a = i.closest("[role=gridcell]"); return i.is("table") || e.contains(t[0], i[0]) || (t = a), t.is("th") ? (t.find(".k-link").click(), !0) : !o && this._toggleCurrent(t) ? !0 : (r = t.find(":kendoFocusable:first"), r[0] && !t.hasClass("k-edit-cell") && t.hasClass("k-state-focused") ? (r.focus(), !0) : o && !i.is(":button,.k-button,textarea") ? (a[0] || (a = t), this._handleEditing(a, !1, n), !0) : !1) }, _nextHorizontalCell: function(e, t, n) { var i, r, o, a = t.nextAll(It); return a.length || (i = e.find(Mt), r = i.index(t.parent()), -1 != r) ? a.first() : t.hasClass("k-header") ? (o = [], M([z(this.columns)[0]], V(i.eq(0).children().first()), o, 0, 0), o[n] ? o[n][0] : t) : t.parent().hasClass("k-filter-row") ? i.last().children(It).first() : i.eq(n).children(It).first() }, _prevHorizontalCell: function(e, t, n) { var i, r, o, a, s = t.prevAll(It); return s.length || (i = e.find(Mt), r = i.index(t.parent()), -1 != r) ? s.first() : t.hasClass("k-header") ? (o = [], a = z(this.columns), M([a[a.length - 1]], V(i.eq(0).children().last()), o, 0, 0), o[n] ? o[n][0] : t) : t.parent().hasClass("k-filter-row") ? i.last().children(It).last() : i.eq(n).children(It).last() }, _currentDataIndex: function(e, n) { var i, r = n.attr("data-index"); return r ? (i = z(this.columns).length, i && !e.closest("div").hasClass("k-grid-content-locked")[0] ? r - i : r) : t }, _prevVerticalCell: function(t, n) { var i, r = n.parent(), o = t.children(Mt), a = o.index(r), s = this._currentDataIndex(t, n); if (s || n.hasClass("k-header")) return i = O(n), i.eq(i.length - 2); if (s = r.children(It).index(n), r.hasClass("k-filter-row")) return N(t).eq(s); if (-1 == a) { if (r = t.find(".k-filter-row"), !r[0]) return N(t).eq(s) } else r = 0 === a ? e() : o.eq(a - 1); return i = r.children(It), i.eq(i.length > s ? s : 0) }, _nextVerticalCell: function(e, n) { var i, r = n.parent(), o = e.children(Mt), a = o.index(r), s = this._currentDataIndex(e, n); return -1 != a && s === t && n.hasClass("k-header") ? V(n).eq(1) : (s = s ? parseInt(s, 10) : r.children(It).index(n), r = o.eq(-1 == a ? 0 : a + n[0].rowSpan), i = r.children(It), i.eq(i.length > s ? s : 0)) }, _verticalContainer: function(e, t) { var n = e.parent(), i = this._navigatableTables.length, r = Math.floor(i / 2), o = kt(n[0], this._navigatableTables); return t && (r *= -1), o += r, (o >= 0 || i > o) && (n = this._navigatableTables.eq(o)), n.find(t ? "thead" : "tbody") }, _horizontalContainer: function(e, t) { var n, i, r = this._navigatableTables.length; return 2 >= r ? e : (n = e.parent(), i = kt(n[0], this._navigatableTables), i += t ? 1 : -1, !t || 2 != i && i != r ? !t && (1 == i || 0 > i) ? e : this._navigatableTables.eq(i).find("thead, tbody") : e) }, _tabNext: function(e, t, n) { var i = !0, r = n ? e.prevAll(It + ":first") : e.nextAll(":visible:first"); return r.length || (r = e.parent(), this.lockedTable && (i = n && t == this.lockedTable[0] || !n && t == this.table[0], r = this._relatedRow(r)), i && (r = r[n ? "prevAll" : "nextAll"]("tr:not(.k-grouping-row):not(.k-detail-row):visible:first")), r = r.children(It + (n ? ":last" : ":first"))), r }, _handleEditing: function(n, i, r) { var o, a, s = this, l = e(ft()), c = s._editMode(), d = bn.msie, u = d && 9 > bn.version, h = s._editContainer; if (r = e(r), a = "incell" == c ? n.hasClass("k-edit-cell") : n.parent().hasClass("k-grid-edit-row"), s.editable) { if (e.contains(h[0], l[0]) && (bn.opera || u ? l.change().triggerHandler("blur") : (l.blur(), d && l.blur())), !s.editable) return ot(r), t; if (!s.editable.end()) return s.current("incell" == c ? h : h.children().filter(It).first()), o = h.find(":kendoFocusable:first")[0], o && o.focus(), t; "incell" == c ? s.closeCell() : (s.saveRow(), a = !0) } i && s.current(i), u && document.body.focus(), ot(r, !0), (!a && !i || i) && ("incell" == c ? s.editCell(s.current()) : s.editRow(s.current().parent())) }, _wrapper: function() { var e = this, t = e.table, n = e.options.height, i = e.element; i.is("div") || (i = i.wrap("<div/>").parent()), e.wrapper = i.addClass("k-grid k-widget"), n && (e.wrapper.css(on, n), t.css(on, "auto")), e._initMobile() }, _initMobile: function() { var t, n = this.options, i = this; this._isMobile = n.mobile === !0 && dt.support.mobileOS || "phone" === n.mobile || "tablet" === n.mobile, this._isMobile && (t = this.wrapper.addClass("k-grid-mobile").wrap("<div data-" + dt.ns + 'role="view" data-' + dt.ns + 'init-widgets="false"></div>').parent(), this.pane = dt.mobile.ui.Pane.wrap(t), this.view = this.pane.view(), this._actionSheetPopupOptions = e(document.documentElement).hasClass("km-root") ? { modal: !1 } : { align: "bottom center", position: "bottom center", effect: "slideIn:up" }, n.height && this.pane.element.parent().css(on, n.height), this._editAnimation = "slide", this.view.bind("show", function() { i._isLocked() && (i._updateTablesWidth(), i._applyLockedContainersWidth(), i._syncLockedContentHeight(), i._syncLockedHeaderHeight(), i._syncLockedFooterHeight()) })) }, _tbody: function() { var t, n = this, i = n.table; t = i.find(">tbody"), t.length || (t = e("<tbody/>").appendTo(i)), n.tbody = t.attr("role", "rowgroup") }, _scrollable: function() { var t, n, i, r, o = this, a = o.options, s = a.scrollable, l = s !== !0 && s.virtual && !o.virtualScrollable, c = !dt.support.kineticScrollNeeded || l ? dt.support.scrollbar() : 0; s && (t = o.wrapper.children(".k-grid-header"), t[0] || (t = e('<div class="k-grid-header" />').insertBefore(o.table)), t.css(wn ? "padding-left" : "padding-right", s.virtual ? c + 1 : c), n = e('<table role="grid" />'), yn && n.attr("cellspacing", 0), n.width(o.table[0].style.width), n.append(o.thead), t.empty().append(e('<div class="k-grid-header-wrap" />').append(n)), o.content = o.table.parent(), o.content.is(".k-virtual-scrollable-wrap, .km-scroll-container") && (o.content = o.content.parent()), o.content.is(".k-grid-content, .k-virtual-scrollable-wrap") || (o.content = o.table.wrap('<div class="k-grid-content" />').parent()), l && (o.virtualScrollable = new xn(o.content, { dataSource: o.dataSource, itemHeight: function() { return o._averageRowHeight() } })), o.scrollables = t.children(".k-grid-header-wrap"), i = o.wrapper.find(".k-grid-footer"), i.length && (o.scrollables = o.scrollables.add(i.children(".k-grid-footer-wrap"))), s.virtual ? o.content.find(">.k-virtual-scrollable-wrap").unbind("scroll" + Ht).bind("scroll" + Ht, function() { o.scrollables.scrollLeft(this.scrollLeft), o.lockedContent && (o.lockedContent[0].scrollTop = this.scrollTop) }) : (o.content.unbind("scroll" + Ht).bind("scroll" + Ht, function() { o.scrollables.scrollLeft(this.scrollLeft), o.lockedContent && (o.lockedContent[0].scrollTop = this.scrollTop) }), r = o.content.data("kendoTouchScroller"), r && r.destroy(), r = dt.touchScroller(o.content), r && r.movable && (o.touchScroller = r, r.movable.bind("change", function(e) { o.scrollables.scrollLeft(-e.sender.x), o.lockedContent && o.lockedContent.scrollTop(-e.sender.y) }), o.one($t, function(e) { e.sender.wrapper.addClass("k-grid-backface") })))) }, _renderNoRecordsContent: function() { var t, n = this; n.options.noRecords && n.wrapper.is(":visible") && (t = n.table.parent().children("." + Zt), t.length && t.remove(), n.dataSource && n.dataSource.view().length || e(n.noRecordsTemplate({})).insertAfter(n.table)) }, _setContentWidth: function(t) { var n, i = this, r = "k-grid-content-expander", o = '<div class="' + r + '"></div>', a = i.resizable; i.options.scrollable && i.wrapper.is(":visible") && (n = i.table.parent().children("." + r), i._setContentWidthHandler = Ct(i._setContentWidth, i), i.dataSource && i.dataSource.view().length ? n[0] && (n.remove(), a && a.unbind("resize", i._setContentWidthHandler)) : (n[0] || (n = e(o).appendTo(i.table.parent()), a && a.bind("resize", i._setContentWidthHandler)), i.thead && (n.width(i.thead.width()), t && i.content.scrollLeft(t))), i._applyLockedContainersWidth()) }, _applyLockedContainersWidth: function() { if (this.options.scrollable && this.lockedHeader) { var e, t = this.thead.parent(), n = t.parent(), i = this.wrapper[0].clientWidth, r = this._groups(), o = dt.support.scrollbar(), a = this.lockedHeader.find(">table>colgroup>col:not(.k-group-col, .k-hierarchy-col)"), s = t.find(">colgroup>col:not(.k-group-col, .k-hierarchy-col)"), l = A(a), c = A(s); r > 0 && (l += this.lockedHeader.find(".k-group-cell:first").outerWidth() * r), l >= i && (l = i - 3 * o), this.lockedHeader.add(this.lockedContent).width(l), n[0].style.width = n.parent().width() - l - 2 + "px", t.add(this.table).width(c), this.virtualScrollable && (i -= o), this.content[0].style.width = i - l - 2 + "px", this.lockedFooter && this.lockedFooter.length && (this.lockedFooter.width(l), e = this.footer.find(".k-grid-footer-wrap"), e[0].style.width = n[0].clientWidth + "px", e.children().first().width(c)) } }, _setContentHeight: function() { var e, t = this, n = t.options, i = t.wrapper.innerHeight(), r = t.wrapper.children(".k-grid-header"), o = dt.support.scrollbar(); n.scrollable && t.wrapper.is(":visible") && (i -= r.outerHeight(), t.pager && (i -= t.pager.element.outerHeight()), n.groupable && (i -= t.wrapper.children(".k-grouping-header").outerHeight()), n.toolbar && (i -= t.wrapper.children(".k-grid-toolbar").outerHeight()), t.footerTemplate && (i -= t.wrapper.children(".k-grid-footer").outerHeight()), e = function(e) { var t, n; return e[0].style.height ? !0 : (t = e.height(), e.height("auto"), n = e.height(), t != n ? (e.height(""), !0) : (e.height(""), !1)) }, e(t.wrapper) && (i > 2 * o ? (t.lockedContent && (o = t.table[0].offsetWidth > t.table.parent()[0].clientWidth ? o : 0, t.lockedContent.height(i - o)), t.content.height(i)) : t.content.height(2 * o + 1))) }, _averageRowHeight: function() { var e, t = this, n = t._items(t.tbody).length, i = t._rowHeight; return 0 === n ? i : (t._rowHeight || (t._rowHeight = i = t.table.outerHeight() / n, t._sum = i, t._measures = 1), e = t.table.outerHeight() / n, i !== e && (t._measures++, t._sum += e, t._rowHeight = t._sum / t._measures), i) }, _dataSource: function() { var e, n = this, i = n.options, r = i.dataSource; r = yt(r) ? { data: r } : r, vt(r) && (_t(r, { table: n.table, fields: n.columns }), e = i.pageable, vt(e) && e.pageSize !== t && (r.pageSize = e.pageSize)), n.dataSource && n._refreshHandler ? n.dataSource.unbind(Wt, n._refreshHandler).unbind(At, n._progressHandler).unbind(Et, n._errorHandler) : (n._refreshHandler = Ct(n.refresh, n), n._progressHandler = Ct(n._requestStart, n), n._errorHandler = Ct(n._error, n)), n.dataSource = ht.create(r).bind(Wt, n._refreshHandler).bind(At, n._progressHandler).bind(Et, n._errorHandler) }, _error: function() { this._progress(!1) }, _requestStart: function() { this._progress(!0) }, _modelChange: function(t) { var n, i, r, o, a, s, l, c, d, u, h = this, p = h.tbody, f = t.model, g = h.tbody.find("tr[" + dt.attr("uid") + "=" + f.uid + "]"), m = g.hasClass("k-alt"), v = h._items(p).index(g), _ = h.lockedContent; if (_ && (n = h._relatedRow(g)), g.add(n).children(".k-edit-cell").length && !h.options.rowTemplate) g.add(n).children(":not(.k-group-cell,.k-hierarchy-cell)").each(function() { i = e(this), r = L(h.columns)[h.cellIndex(i)], r.field === t.field && (i.hasClass("k-edit-cell") ? i.addClass("k-dirty-cell") : (h._displayCell(i, r, f), e('<span class="k-dirty"/>').prependTo(i))) }); else if (!g.hasClass("k-grid-edit-row")) { for (s = e().add(g), _ && (o = (m ? h.lockedAltRowTemplate : h.lockedRowTemplate)(f), s = s.add(n), n.replaceWith(o)), h.angular("cleanup", function() { return { elements: s.get() } }), o = (m ? h.altRowTemplate : h.rowTemplate)(f), g.replaceWith(o), o = h._items(p).eq(v), u = [{ dataItem: f }], _ && (g = g.add(n), n = h._relatedRow(o)[0], it(o[0], n), o = o.add(n), u.push({ dataItem: f })), h.angular("compile", function() { return { elements: o.get(), data: u } }), a = h.options.selectable, a && g.hasClass("k-state-selected") && h.select(o), c = s.children(":not(.k-group-cell,.k-hierarchy-cell)"), l = o.children(":not(.k-group-cell,.k-hierarchy-cell)"), v = 0, d = h.columns.length; d > v; v++) r = h.columns[v], i = l.eq(v), a && c.eq(v).hasClass("k-state-selected") && i.addClass("k-state-selected"), r.field === t.field && e('<span class="k-dirty"/>').prependTo(i); h.trigger("itemChange", { item: o, data: f, ns: ut }) } }, _pageable: function() { var t, n = this, i = n.options.pageable; i && (t = n.wrapper.children("div.k-grid-pager"), t.length || (t = e('<div class="k-pager-wrap k-grid-pager"/>').appendTo(n.wrapper)), n.pager && n.pager.destroy(), n.pager = "object" == typeof i && i instanceof dt.ui.Pager ? i : new dt.ui.Pager(t, _t({}, i, { dataSource: n.dataSource }))) }, _footer: function() { var t, n, i, r, o = this, a = o.dataSource.aggregates(), s = "", l = o.footerTemplate, c = o.options, d = o.footer || o.wrapper.find(".k-grid-footer"); l ? (s = e(o._wrapFooter(l(a))), d.length ? (n = s, o.angular("cleanup", function() { return { elements: d.get() } }), d.replaceWith(n), d = o.footer = n) : d = o.footer = c.scrollable ? c.pageable ? s.insertBefore(o.wrapper.children("div.k-grid-pager")) : s.appendTo(o.wrapper) : s.insertBefore(o.tbody), o.angular("compile", function() { return { elements: d.find("td:not(.k-group-cell, .k-hierarchy-cell)").get(), data: wt(o.columns, function(e) { return { column: e, aggregate: a[e.field] } }) } })) : d && !o.footer && (o.footer = d), d.length && (c.scrollable && (t = d.attr("tabindex", -1).children(".k-grid-footer-wrap"), o.scrollables = o.scrollables.filter(function() { return !e(this).is(".k-grid-footer-wrap") }).add(t)), o._footerWidth && d.find("table").css("width", o._footerWidth), t && (i = o.content.scrollLeft(), r = c.scrollable !== !0 && c.scrollable.virtual && !o.virtualScrollable, r && (i = o.wrapper.find(".k-virtual-scrollable-wrap").scrollLeft()), t.scrollLeft(i))), o.lockedContent && (o._appendLockedColumnFooter(), o._applyLockedContainersWidth(), o._syncLockedFooterHeight()) }, _wrapFooter: function(t) { var n = this, i = "", r = dt.support.mobileOS ? 0 : dt.support.scrollbar(); return n.options.scrollable ? (i = e('<div class="k-grid-footer"><div class="k-grid-footer-wrap"><table' + (yn ? ' cellspacing="0"' : "") + "><tbody>" + t + "</tbody></table></div></div>"), n._appendCols(i.find("table")), i.css(wn ? "padding-left" : "padding-right", r), i) : '<tfoot class="k-grid-footer">' + t + "</tfoot>" }, _columnMenu: function() { var e, n, i, r, o, a, s, l, c, d = this, u = L(d.columns), h = d.options, p = h.columnMenu, f = bt(d.columns, function(e) { return e.columns !== t }).length > 0, g = this._isMobile, m = function(e) { d.trigger(Ut, { field: e.field, container: e.container }) }, v = function(e) { ot(e.closest("table"), !0) }, _ = h.$angular; if (p) for ("boolean" == typeof p && (p = {}), a = N(d.thead), s = 0, l = a.length; l > s; s++) n = u[s], c = a.eq(s), n.command || !n.field && !c.attr("data-" + dt.ns + "field") || (e = c.data("kendoColumnMenu"), e && e.destroy(), r = n.sortable !== !1 && p.sortable !== !1 && h.sortable !== !1 ? _t({}, h.sortable, { compare: (n.sortable || {}).compare }) : !1, o = h.filterable && n.filterable !== !1 && p.filterable !== !1 ? _t({ pane: d.pane }, h.filterable, n.filterable) : !1, n.filterable && n.filterable.dataSource && (o.forceUnique = !1, o.checkSource = n.filterable.dataSource), o && (o.format = n.format), i = { dataSource: d.dataSource, values: n.values, columns: p.columns, sortable: r, filterable: o, messages: p.messages, owner: d, closeCallback: v, init: m, pane: d.pane, filter: g ? ":not(.k-column-active)" : "", lockedColumns: !f && n.lockable !== !1 && z(u).length > 0 }, _ && (i.$angular = _), c.kendoColumnMenu(i)) }, _headerCells: function() { return this.thead.find("th").filter(function() { var t = e(this); return !t.hasClass("k-group-cell") && !t.hasClass("k-hierarchy-cell") }) }, _filterable: function() { var e, t, n, i, r, o, a, s = this, l = L(s.columns), c = function(e) { s.trigger(Vt, { field: e.field, container: e.container }) }, d = function(e) { ot(e.closest("table"), !0) }, u = s.options.filterable; if (u && typeof u.mode == ln && -1 == u.mode.indexOf("menu") && (u = !1), u && !s.options.columnMenu) for (t = N(s.thead), i = 0, r = t.length; r > i; i++) n = t.eq(i), l[i].filterable === !1 || l[i].command || !l[i].field && !n.attr("data-" + dt.ns + "field") || (e = n.data("kendoFilterMenu"), e && e.destroy(), e = n.data("kendoFilterMultiCheck"), e && e.destroy(), o = l[i].filterable, a = _t({}, u, o, { dataSource: s.dataSource, values: l[i].values, format: l[i].format, closeCallback: d, title: l[i].title || l[i].field, init: c, pane: s.pane }), o && o.messages && (a.messages = _t(!0, {}, u.messages, o.messages)), o && o.dataSource && (a.forceUnique = !1, a.checkSource = o.dataSource), o && o.multi ? n.kendoFilterMultiCheck(a) : n.kendoFilterMenu(a)) }, _filterRow: function() { var t, n, i, r, o, a, s, l, c, d, u, h, p = this; if (p._hasFilterRow()) for (t = L(p.columns), n = p.options.filterable, i = p.thead.find(".k-filter-row"), this._updateHeader(this.dataSource.group().length), r = 0; t.length > r; r++) if (a = t[r], s = p.options.filterable.operators, l = !1, c = e("<th/>"), d = a.field, a.hidden && c.hide(), i.append(c), d && a.filterable !== !1) { if (u = a.filterable && a.filterable.cell || {}, o = p.options.dataSource, o instanceof ht && (o = p.options.dataSource.options), h = _t(!0, {}, n.messages), a.filterable && _t(!0, h, a.filterable.messages), u.enabled === !1) { c.html(" "); continue } u.dataSource && (o = u.dataSource, l = !0), a.filterable && a.filterable.operators && (s = a.filterable.operators), e("<span/>").attr(dt.attr("field"), d).kendoFilterCell({ dataSource: p.dataSource, suggestDataSource: o, customDataSource: l, field: d, messages: h, values: a.values, template: u.template, delay: u.delay, inputWidth: u.inputWidth, suggestionOperator: u.suggestionOperator, minLength: u.minLength, dataTextField: u.dataTextField, operator: u.operator, operators: s, showOperators: u.showOperators }).appendTo(c) } else c.html(" ") }, _sortable: function() { var e, t, n, i, r, o, a = this, s = L(a.columns), l = a.options.sortable; if (l) { for (i = N(a.thead), r = 0, o = i.length; o > r; r++) e = s[r], e.sortable !== !1 && !e.command && e.field && (n = i.eq(r), t = n.data("kendoColumnSorter"), t && t.destroy(), n.attr("data-" + dt.ns + "field", e.field).kendoColumnSorter(_t({}, l, e.sortable, { dataSource: a.dataSource, aria: !0, filter: ":not(.k-column-active)" }))); i = null } }, _columns: function(t) { var n, i, r, o = this, a = o.table, s = a.find("col"), c = o.options.dataSource; if (t = t.length ? t : wt(a.find("th"), function(t, n) { t = e(t); var i = t.attr(dt.attr("sortable")), r = t.attr(dt.attr("filterable")), o = t.attr(dt.attr("type")), a = t.attr(dt.attr("groupable")), l = t.attr(dt.attr("field")), c = t.attr(dt.attr("title")), d = t.attr(dt.attr("menu")); return l || (l = t.text().replace(/\s|[^A-z0-9]/g, "")), { field: l, type: o, title: c, sortable: "false" !== i, filterable: "false" !== r, groupable: "false" !== a, menu: d, template: t.attr(dt.attr("template")), width: s.eq(n).css("width") } }), n = !(o.table.find("tbody tr").length > 0 && (!c || !c.transport)), o.options.scrollable) { if (r = t, i = z(t), t = F(t), i.length > 0 && 0 === t.length) throw Error("There should be at least one non locked column"); q(o.element.find("tr:has(th):first"), r), t = i.concat(t) } o.columns = l(t, n) }, _groups: function() { var e = this.dataSource.group(); return e ? e.length : 0 }, _tmpl: function(e, t, r, o) { var a, s, l, c, d = this, u = _t({}, dt.Template, d.options.templateSettings), h = t.length, p = { storage: {}, count: 0 }, f = d._hasDetails(), g = [], m = d._groups(); if (!e) { for (e = "<tr", r && g.push("k-alt"), f && g.push("k-master-row"), g.length && (e += ' class="' + g.join(" ") + '"'), h && (e += " " + dt.attr("uid") + '="#=' + dt.expr("uid", u.paramName) + '#"'), e += " role='row'>", m > 0 && !o && (e += n(m)), f && (e += '<td class="k-hierarchy-cell"><a class="k-icon k-plus" href="\\#" tabindex="-1"></a></td>'), a = 0; h > a; a++) l = t[a], s = l.template, c = typeof s, e += "<td" + i(l.attributes) + " role='gridcell'>", e += d._cellTmpl(l, p), e += "</td>"; e += "</tr>" } return e = dt.template(e, u), p.count > 0 ? Ct(e, p.storage) : e }, _headerCellText: function(e) { var t = this, n = _t({}, dt.Template, t.options.templateSettings), i = e.headerTemplate, r = typeof i, o = e.title || e.field || ""; return r === sn ? o = dt.template(i, n)({}) : r === ln && (o = i), o }, _cellTmpl: function(e, t) { var n, i, r = this, o = _t({}, dt.Template, r.options.templateSettings), a = e.template, s = o.paramName, l = e.field, c = "", d = e.format, u = typeof a, h = e.values; if (e.command) { if (yt(e.command)) { for (n = 0, i = e.command.length; i > n; n++) c += r._createButton(e.command[n]); return c.replace(fn, "\\#") } return r._createButton(e.command).replace(fn, "\\#") } return u === sn ? (t.storage["tmpl" + t.count] = a, c += "#=this.tmpl" + t.count + "(" + s + ")#", t.count++) : u === ln ? c += a : h && h.length && vt(h[0]) && "value" in h[0] && l ? (c += "#var v =" + dt.stringify($(h)).replace(fn, "\\#") + "#", c += "#var f = v[", o.useWithBlock || (c += s + "."), c += l + "]#", c += "${f != null ? f : ''}") : (c += e.encoded ? "#:" : "#=", d && (c += 'kendo.format("' + d.replace(pn, "\\$1") + '",'), l ? (l = dt.expr(l, s), c += l + "==null?'':" + l) : c += "''", d && (c += ")"), c += "#"), c }, _templates: function() { var t = this, n = t.options, i = t.dataSource, r = i.group(), o = t.footer || t.wrapper.find(".k-grid-footer"), a = i.aggregate(), s = L(t.columns), l = L(z(t.columns)), c = n.scrollable ? L(F(t.columns)) : s; if (n.scrollable && l.length) { if (n.rowTemplate || n.altRowTemplate) throw Error("Having both row template and locked columns is not supported"); t.rowTemplate = t._tmpl(n.rowTemplate, c, !1, !0), t.altRowTemplate = t._tmpl(n.altRowTemplate || n.rowTemplate, c, !0, !0), t.lockedRowTemplate = t._tmpl(n.rowTemplate, l), t.lockedAltRowTemplate = t._tmpl(n.altRowTemplate || n.rowTemplate, l, !0) } else t.rowTemplate = t._tmpl(n.rowTemplate, c), t.altRowTemplate = t._tmpl(n.altRowTemplate || n.rowTemplate, c, !0); t._hasDetails() && (t.detailTemplate = t._detailTmpl(n.detailTemplate || "")), (t._group && !Tt(a) || !Tt(a) && !o.length || bt(s, function(e) { return e.footerTemplate }).length) && (t.footerTemplate = t._footerTmpl(s, a, "footerTemplate", "k-footer-template")), r && bt(s, function(e) { return e.groupFooterTemplate }).length && (a = e.map(r, function(e) { return e.aggregates }), t.groupFooterTemplate = t._footerTmpl(c, a, "groupFooterTemplate", "k-group-footer", l.length), n.scrollable && l.length && (t.lockedGroupFooterTemplate = t._footerTmpl(l, a, "groupFooterTemplate", "k-group-footer"))), t.options.noRecords && (t.noRecordsTemplate = t._noRecordsTmpl()) }, _noRecordsTmpl: function() { var t, n, i, r = '<div class="{0}">{1}</div>', o = '<div class="k-grid-norecords-template"{1}>{0}</div>', a = this.options.scrollable && !this.wrapper[0].style.height ? ' style="margin:0 auto;position:static;"' : "", s = { storage: {}, count: 0 }, l = e.extend({}, dt.Template, this.options.templateSettings), c = l.paramName, d = ""; return t = this.options.noRecords.template ? this.options.noRecords.template : dt.format(o, this.options.messages.noRecords, a), n = typeof t, "function" === n ? (s.storage["tmpl" + s.count] = t, d += "#=this.tmpl" + s.count + "(" + c + ")#", s.count++) : "string" === n && (d += t), i = dt.template(dt.format(r, Zt, d), l), s.count > 0 && (i = e.proxy(i, s.storage)), i }, _footerTmpl: function(e, t, r, o, a) { var s, l, c, d, u, h = this, p = _t({}, dt.Template, h.options.templateSettings), f = p.paramName, g = "", m = {}, v = 0, _ = {}, w = h._groups(), b = h.dataSource._emptyAggregates(t); for (g += '<tr class="' + o + '">', w > 0 && !a && (g += n(w)), h._hasDetails() && (g += '<td class="k-hierarchy-cell"> </td>'), s = 0, l = e.length; l > s; s++) u = e[s], c = u[r], d = typeof c, g += "<td" + i(u.footerAttributes) + ">", c ? (d !== sn && (_ = b[u.field] ? _t({}, p, { paramName: f + "['" + u.field + "']" }) : {}, c = dt.template(c, _)), m["tmpl" + v] = c, g += "#=this.tmpl" + v + "(" + f + ")#", v++) : g += " ", g += "</td>"; return g += "</tr>", g = dt.template(g, p), v > 0 ? Ct(g, m) : g }, _detailTmpl: function(e) { var t = this, i = "", r = _t({}, dt.Template, t.options.templateSettings), o = r.paramName, a = {}, s = 0, l = t._groups(), c = f(L(t.columns)).length, d = typeof e; return i += '<tr class="k-detail-row">', l > 0 && (i += n(l)), i += '<td class="k-hierarchy-cell"></td><td class="k-detail-cell"' + (c ? ' colspan="' + c + '"' : "") + ">", d === sn ? (a["tmpl" + s] = e, i += "#=this.tmpl" + s + "(" + o + ")#", s++) : i += e, i += "</td></tr>", i = dt.template(i, r), s > 0 ? Ct(i, a) : i }, _hasDetails: function() { var e = this; return null !== e.options.detailTemplate || (e._events[Ot] || []).length }, _hasFilterRow: function() { var t = this.options.filterable, n = t && typeof t.mode == ln && -1 != t.mode.indexOf("row"), i = this.columns, r = e.grep(i, function(e) { return e.filterable === !1 }); return i.length && r.length == i.length && (n = !1), n }, _details: function() { var t = this; if (t.options.scrollable && t._hasDetails() && z(t.columns).length) throw Error("Having both detail template and locked columns is not supported"); t.table.on(rn + Ht, ".k-hierarchy-cell .k-plus, .k-hierarchy-cell .k-minus", function(n) { var i, r, o = e(this), a = o.hasClass("k-plus"), s = o.closest("tr.k-master-row"), l = t.detailTemplate, c = t._hasDetails(); return o.toggleClass("k-plus", !a).toggleClass("k-minus", a), i = s.next(), c && !i.hasClass("k-detail-row") && (r = t.dataItem(s), i = e(l(r)).addClass(s.hasClass("k-alt") ? "k-alt" : "").insertAfter(s), t.angular("compile", function() { return { elements: i.get(), data: [{ dataItem: r }] } }), t.trigger(Ot, { masterRow: s, detailRow: i, data: r, detailCell: i.find(".k-detail-cell") })), t.trigger(a ? Yt : Qt, { masterRow: s, detailRow: i }), i.toggle(a), t._current && t._current.attr("aria-expanded", a), n.preventDefault(), !1 }) }, dataItem: function(t) { if (t = e(t)[0], !t) return null; var n, i, r = this.tbody.children(), o = /k-grouping-row|k-detail-row|k-group-footer/, a = t.sectionRowIndex; for (i = a, n = 0; a > n; n++) o.test(r[n].className) && i--; return this._data[i] }, expandRow: function(t) { e(t).find("> td .k-plus, > td .k-i-expand").click() }, collapseRow: function(t) { e(t).find("> td .k-minus, > td .k-i-collapse").click() }, _createHeaderCells: function(e, n) { var r, o, a, s, l, c, d = this, u = "", h = L(d.columns); for (r = 0, s = e.length; s > r; r++) o = e[r].column || e[r], a = d._headerCellText(o), l = "", c = kt(o, h), o.command ? (u += "<th" + i(o.headerAttributes), n && !e[r].colSpan && (u += " rowspan='" + n + "'"), c > -1 && (u += dt.attr("index") + "='" + c + "'"), u += ">" + a + "</th>") : (o.field && (l = dt.attr("field") + "='" + o.field + "' "), u += "<th role='columnheader' " + l, n && !e[r].colSpan && (u += " rowspan='" + n + "'"), e[r].colSpan > 1 && (u += 'colspan="' + (e[r].colSpan - D(o.columns)) + '" ', u += dt.attr("colspan") + "='" + e[r].colSpan + "'"), o.title && (u += dt.attr("title") + '="' + o.title.replace('"', """).replace(/'/g, "'") + '" '), o.groupable !== t && (u += dt.attr("groupable") + "='" + o.groupable + "' "), o.aggregates && o.aggregates.length && (u += dt.attr("aggregates") + "='" + o.aggregates + "'"), c > -1 && (u += dt.attr("index") + "='" + c + "'"), u += i(o.headerAttributes), u += ">" + a + "</th>"); return u }, _appendLockedColumnContent: function() { var t, n, i, r, o, a = this.columns, s = this.table.find("colgroup"), l = s.find("col:not(.k-group-col,.k-hierarchy-col)"), c = e(), d = 0, u = 0; for (t = 0, n = a.length; n > t; t++) if (a[t].locked) if (p(a[t])) { for (r = 1, a[t].columns && (r = L(a[t].columns).length - D(a[t].columns)), r = r || 1, o = 0; r > o; o++) c = c.add(l.eq(t + u + o - d)); u += r - 1 } else d++; i = e('<div class="k-grid-content-locked"><table' + (yn ? ' cellspacing="0"' : "") + "><colgroup/><tbody></tbody></table></div>"), s.detach(), i.find("colgroup").append(c), s.insertBefore(this.table.find("tbody")), this.lockedContent = i.insertBefore(this.content), this.lockedTable = i.children("table") }, _appendLockedColumnFooter: function() { var t, n, i = this, r = i.footer, o = r.find(".k-footer-template>td"), a = r.find(".k-grid-footer-wrap>table>colgroup>col"), s = e('<div class="k-grid-footer-locked"><table><colgroup /><tbody><tr class="k-footer-template"></tr></tbody></table></div>'), l = i._groups(), c = e(), d = e(); for (c = c.add(o.filter(".k-group-cell")), t = 0, n = L(z(i.columns)).length; n > t; t++) c = c.add(o.eq(t + l)); for (d = d.add(a.filter(".k-group-col")), t = 0, n = L(H(i.columns)).length; n > t; t++) d = d.add(a.eq(t + l)); c.appendTo(s.find("tr")), d.appendTo(s.find("colgroup")), i.lockedFooter = s.prependTo(r) }, _appendLockedColumnHeader: function(t) { var n, i, r, o, a, s, l, c, d, u, h, f = this, m = this.columns, v = [], _ = 0, w = e(), b = f._hasFilterRow(), y = 0, k = e(), x = 0, C = e(), S = f.thead.prev().find("col:not(.k-group-col,.k-hierarchy-col)"), T = f.thead.find("tr:first .k-header:not(.k-group-cell,.k-hierarchy-cell)"), A = f.thead.find(".k-filter-row").find("th:not(.k-group-cell,.k-hierarchy-cell)"), I = 0; for (n = 0, r = m.length; r > n; n++) { if (m[n].locked) { if (l = T.eq(n), x = L(m[n].columns || []).length, p(m[n])) { for (m[n].columns && (c = x - D(m[n].columns)), c = c || 1, d = 0; c > d; d++) w = w.add(S.eq(n + I + d - _)); I += c - 1 } for (M([m[n]], V(l), v, 0, 0), x = x || 1, u = 0; x > u; u++) k = k.add(A.eq(y + u)); y += x } m[n].columns && (_ += D(m[n].columns)), p(m[n]) || _++ } if (v.length) { for (i = '<div class="k-grid-header-locked" style="width:1px"><table' + (yn ? ' cellspacing="0"' : "") + "><colgroup/><thead>", i += Array(v.length + 1).join("<tr></tr>"), i += (b ? '<tr class="k-filter-row" />' : "") + "</thead></table></div>", s = e(i), S = s.find("colgroup"), S.append(f.thead.prev().find("col.k-group-col").add(w)), o = s.find("thead tr:not(.k-filter-row)"), n = 0, r = v.length; r > n; n++) C = g(v[n]), o.eq(n).append(f.thead.find("tr:eq(" + n + ") .k-group-cell").add(C)); h = P(this.thead), h > v.length && E(s, h - v.length), a = s.find(".k-filter-row"), a.append(f.thead.find(".k-filter-row .k-group-cell").add(k)), this.lockedHeader = s.prependTo(t), this.thead.find(".k-group-cell").remove(), this._syncLockedHeaderHeight() } }, _removeLockedContainers: function() { var e = this.lockedHeader.add(this.lockedContent).add(this.lockedFooter); dt.destroy(e), e.off(Ht).remove(), this.lockedHeader = this.lockedContent = this.lockedFooter = null, this.selectable = null }, _thead: function() { var t, n, i, r, o, a = this, s = a.columns, l = a._hasDetails() && s.length, c = a._hasFilterRow(), d = "", u = a.table.find(">thead"), h = a.element.find("thead:first").length > 0; if (u.length || (u = e("<thead/>").insertBefore(a.tbody)), a.lockedHeader && a.thead ? (n = a.thead.find("tr:has(th):not(.k-filter-row)").html(""), n.remove(), n = e(), a._removeLockedContainers()) : n = a.element.find(h ? "thead:first tr:has(th):not(.k-filter-row)" : "tr:has(th):first"), !n.length && (n = u.children().first(), !n.length)) { for (i = [{ rowSpan: 1, cells: [], index: 0 }], a._prepareColumns(i, s), t = 0; i.length > t; t++) d += "<tr>", l && (d += '<th class="k-hierarchy-cell"> </th>'), d += a._createHeaderCells(i[t].cells, i[t].rowSpan), d += "</tr>"; n = e(d) } c && (r = e("<tr/>"), r.addClass("k-filter-row"), (l || n.find(".k-hierarchy-cell").length) && r.prepend('<th class="k-hierarchy-cell"> </th>'), o = (a.thead || u).find(".k-filter-row"), o.length && (dt.destroy(o), o.remove()), u.append(r)), n.children().length ? l && !n.find(".k-hierarchy-cell")[0] && n.prepend('<th class="k-hierarchy-cell"> </th>') : (d = "", l && (d += '<th class="k-hierarchy-cell"> </th>'), d += a._createHeaderCells(s), n.html(d)), n.attr("role", "row").find("th").addClass("k-header"), a.options.scrollable || u.addClass("k-grid-header"), n.find("script").remove().end().prependTo(u), a.thead && a._destroyColumnAttachments(), this.angular("cleanup", function() { return { elements: u.find("th").get() } }), this.angular("compile", function() { return { elements: u.find("th").get(), data: wt(s, function(e) { return { column: e } }) } }), a.thead = u.attr("role", "rowgroup"), a._sortable(), a._filterable(), a._filterRow(), a._scrollable(), a._updateCols(), a._columnMenu(), this.options.scrollable && z(this.columns).length && (a._appendLockedColumnHeader(a.thead.closest(".k-grid-header")), a._appendLockedColumnContent(), a.lockedContent.bind("DOMMouseScroll" + Ht + " mousewheel" + Ht, Ct(a._wheelScroll, a)), a._applyLockedContainersWidth()), a._updateColumnCellIndex(), a._updateFirstColumnClass(), a._resizable(), a._draggable(), a._reorderable(), a.groupable && a._attachGroupable() }, _updateFirstColumnClass: function() { var t, n, i = this, r = i.columns || [], o = i._hasDetails() && r.length; o || i._groups() || (t = e(), n = i.thead.find(">tr:not(.k-filter-row):not(:first)"), r = F(r), n.length && r[0] && !r[0].columns && (t = t.add(n)), i._isLocked() && (n = i.lockedHeader.find("thead>tr:not(.k-filter-row):not(:first)"), r = z(i.columns), n.length && r[0] && !r[0].columns && (t = t.add(n))), t.each(function() { var t = e(this).find("th"); t.removeClass("k-first"), t.eq(0).addClass("k-first") })) }, _prepareColumns: function(e, t, n, i) { var r, o, a = i || e[e.length - 1], s = e[a.index + 1], l = 0; for (r = 0; t.length > r; r++) o = { column: t[r], colSpan: 0 }, a.cells.push(o), t[r].columns && t[r].columns.length && (s || (s = { rowSpan: 0, cells: [], index: e.length }, e.push(s)), o.colSpan = t[r].columns.length, this._prepareColumns(e, t[r].columns, o, s), l += o.colSpan - 1, a.rowSpan = e.length - a.index); n && (n.colSpan += l) }, _wheelScroll: function(t) { var n, i, r; t.ctrlKey || (n = this.content, this.options.scrollable.virtual && (n = this.virtualScrollable.verticalScrollbar), i = n.scrollTop(), r = dt.wheelDeltaY(t), r && (t.preventDefault(), e(t.currentTarget).one("wheel" + Ht, !1), n.scrollTop(i + -r))) }, _isLocked: function() { return null != this.lockedHeader }, _updateCols: function(e) { e = e || this.thead.parent().add(this.table), this._appendCols(e, this._isLocked()) }, _updateLockedCols: function(e) { this._isLocked() && (e = e || this.lockedHeader.find("table").add(this.lockedTable), G(e, B(H(this.columns)), this._hasDetails(), this._groups())) }, _appendCols: function(e, t) { t ? G(e, B(R(this.columns)), this._hasDetails(), 0) : G(e, B(f(this.columns)), this._hasDetails(), this._groups()) }, _autoColumns: function(e) { if (e && e.toJSON) { var t, n, i = this; e = e.toJSON(), n = !(i.table.find("tbody tr").length > 0 && (!i.dataSource || !i.dataSource.transport)); for (t in e) i.columns.push({ field: t, encoded: n, headerAttributes: { id: dt.guid() } }); i._thead(), i._templates() } }, _rowsHtml: function(e, t) { var n, i, r = this, o = "", a = t.rowTemplate, s = t.altRowTemplate; for (n = 0, i = e.length; i > n; n++) o += n % 2 ? s(e[n]) : a(e[n]), r._data.push(e[n]); return o }, _groupRowHtml: function(e, t, n, i, r, o) { var a, s, l = this, c = "", d = e.field, u = bt(L(l.columns), function(e) { return e.field == d })[0] || {}, h = u.groupHeaderTemplate, p = (u.title || d) + ": " + Y(e.value, u.format, u.values, u.encoded), f = l._groupAggregatesDefaultObject || {}, g = _t({}, f, e.aggregates), m = _t({}, { field: e.field, value: e.value, aggregates: g }, e.aggregates[e.field]), v = r.groupFooterTemplate, _ = e.items; if (h && (p = typeof h === sn ? h(m) : dt.template(h)(m)), c += i(t, n, p), e.hasSubgroups) for (a = 0, s = _.length; s > a; a++) c += l._groupRowHtml(_[a], o ? t : t - 1, n + 1, i, r, o); else c += l._rowsHtml(_, r); return v && (c += v(g)), c }, collapseGroup: function(t) { t = e(t); var n, i, r, o, a, s = this.options.groupable, l = s.showFooter, c = l ? 0 : 1, d = e(); for (this._isLocked() && (t.closest("div").hasClass("k-grid-content-locked") ? d = this.tbody.children("tr:eq(" + t.index() + ")").nextAll("tr") : (d = t.nextAll("tr"), t = this.lockedTable.find(">tbody>tr:eq(" + t.index() + ")"))), n = t.find(".k-group-cell").length, t.find(".k-icon").addClass("k-i-expand").removeClass("k-i-collapse"), t.find("td[aria-expanded='true']:first").attr("aria-expanded", !1), t = t.nextAll("tr"), r = 0, o = t.length; o > r && (a = t.eq(r), i = a.find(".k-group-cell").length, a.hasClass("k-grouping-row") ? c++ : a.hasClass("k-group-footer") && c--, !(n >= i || a.hasClass("k-group-footer") && 0 > c)); r++) a.hide(), d.eq(r).hide() }, expandGroup: function(t) { t = e(t); var n, i, r, o, a, s = this, l = s.options.groupable.showFooter, c = e(), d = [], u = 1; for (this._isLocked() && (t.closest("div").hasClass("k-grid-content-locked") ? c = this.tbody.children("tr:eq(" + t.index() + ")").nextAll("tr") : (c = t.nextAll("tr"), t = this.lockedTable.find(">tbody>tr:eq(" + t.index() + ")"))), n = t.find(".k-group-cell").length, t.find(".k-icon").addClass("k-i-collapse").removeClass("k-i-expand"), t.find("td[aria-expanded='false']:first").attr("aria-expanded", !0), t = t.nextAll("tr"), o = 0, a = t.length; a > o && (i = t.eq(o), r = i.find(".k-group-cell").length, !(n >= r)); o++) r != n + 1 || i.hasClass("k-detail-row") || (i.show(), c.eq(o).show(), i.hasClass("k-grouping-row") && i.find(".k-icon").hasClass("k-i-collapse") && s.expandGroup(i), i.hasClass("k-master-row") && i.find(".k-icon").hasClass("k-minus") && (i.next().show(), c.eq(o + 1).show())), i.hasClass("k-grouping-row") && (l && d.push(i.is(":visible")), u++), i.hasClass("k-group-footer") && (l && i.toggle(d.pop()), 1 == u ? (i.show(), c.eq(o).show()) : u--) }, _updateHeader: function(t) { var n = this, i = n._isLocked() ? n.lockedHeader.find("thead") : n.thead, r = i.find("tr.k-filter-row").find("th.k-group-cell").length, o = i.find("tr:first").find("th.k-group-cell").length, a = i.children("tr:not(:first)").filter(function() { return !e(this).children(":visible").length }); t > o ? (e(Array(t - o + 1).join('<th class="k-group-cell k-header"> </th>')).prependTo(i.children("tr:not(.k-filter-row)")), n.element.is(":visible") && a.find("th.k-group-cell").hide()) : o > t && i.find("tr").each(function() { e(this).find("th.k-group-cell").filter(":eq(" + t + "),:gt(" + t + ")").remove() }), t > r && e(Array(t - r + 1).join('<th class="k-group-cell k-header"> </th>')).prependTo(i.find(".k-filter-row")) }, _firstDataItem: function(e, t) { return e && t && (e = e.hasSubgroups ? this._firstDataItem(e.items[0], t) : e.items[0]), e }, _updateTablesWidth: function() { var t, n = this; n._isLocked() && (t = e(">.k-grid-footer>.k-grid-footer-wrap>table", n.wrapper).add(n.thead.parent()).add(n.table), n._footerWidth = tt(t.eq(0)), t.width(n._footerWidth), t = e(">.k-grid-footer>.k-grid-footer-locked>table", n.wrapper).add(n.lockedHeader.find(">table")).add(n.lockedTable), t.width(tt(t.eq(0)))) }, hideColumn: function(n) { var i, r, o, s, l, c, d, g, m, v, _ = this, w = 0, b = _.footer || _.wrapper.find(".k-grid-footer"), y = _.columns, k = _.lockedHeader ? N(_.lockedHeader.find(">table>thead")).filter(h).length : 0; if (n = "number" == typeof n ? y[n] : vt(n) ? bt(T(y), function(e) { return e === n })[0] : bt(T(y), function(e) { return e.field === n })[0], n && p(n)) { if (n.columns && n.columns.length) { for (c = C(n, y), u(n, !1), Q(a(e(">table>thead", _.lockedHeader), _.thead, ">tr:eq(" + c.row + ")>th"), c.cell, !1), o = 0; n.columns.length > o; o++) this.hideColumn(n.columns[o]); return _.trigger(jt, { column: n }), t } if (m = kt(n, f(L(y))), u(n, !1), _._setParentsVisibility(n, !1), _._templates(), _._updateCols(), _._updateLockedCols(), v = _.thead, d = m, _.lockedHeader && k > m ? v = _.lockedHeader.find(">table>thead") : d -= k, i = N(v).filter(h).eq(d), i[0].style.display = "none", Q(a(e(">table>thead", _.lockedHeader), _.thead, ">tr.k-filter-row>th"), m, !1), b[0] && (_._updateCols(b.find(">.k-grid-footer-wrap>table")), _._updateLockedCols(b.find(">.k-grid-footer-locked>table")), Q(b.find(".k-footer-template>td"), m, !1)), _.lockedTable && k > m ? K(_.lockedTable.find(">tbody>tr"), m) : K(_.tbody.children(), m - k), _.lockedTable) _._updateTablesWidth(), _._applyLockedContainersWidth(), _._syncLockedContentHeight(), _._syncLockedHeaderHeight(), _._syncLockedFooterHeight(); else { for (s = _.thead.prev().find("col"), o = 0, g = s.length; g > o; o += 1) { if (l = s[o].style.width, !l || -1 != l.indexOf("%")) { w = 0; break } w += parseInt(l, 10) } r = e(">.k-grid-header table:first,>.k-grid-footer table:first", _.wrapper).add(_.table), _._footerWidth = null, w && (r.each(function() { this.style.width = w + "px" }), _._footerWidth = w), bn.msie && 8 == bn.version && (r.css("display", "inline-table"), setTimeout(function() { r.css("display", "table") }, 1)) } _._updateFirstColumnClass(), _.trigger(jt, { column: n }) } }, _setParentsVisibility: function(t, n) { var i, r, o, s, l, c = this.columns, h = [], p = n ? function(e) { return f(e.columns).length && e.hidden } : function(e) { return !f(e.columns).length && !e.hidden }; if (d(t, c, h) && h.length) for (i = h.length - 1; i >= 0; i--) r = h[i], o = y(r, c), s = a(e(">table>thead", this.lockedHeader), this.thead, ">tr:eq(" + o.row + ")>th:not(.k-group-cell):not(.k-hierarchy-cell)").eq(o.cell), p(r) && (u(r, n), s[0].style.display = n ? "" : "none"), s.filter("[" + dt.attr("colspan") + "]").length && (l = parseInt(s.attr(dt.attr("colspan")), 10), s[0].colSpan = l - D(r.columns) || 1) }, showColumn: function(n) { var i, r, o, s, l, c, d, h, f, g, m, v = this, _ = v.columns, w = v.footer || v.wrapper.find(".k-grid-footer"), b = v.lockedHeader ? N(v.lockedHeader.find(">table>thead")).length : 0; if (n = "number" == typeof n ? _[n] : vt(n) ? bt(T(_), function(e) { return e === n })[0] : bt(T(_), function(e) { return e.field === n })[0], n && !p(n)) { if (n.columns && n.columns.length) { for (d = y(n, _), u(n, !0), Q(a(e(">table>thead", v.lockedHeader), v.thead, ">tr:eq(" + d.row + ")>th"), d.cell, !0), i = 0; n.columns.length > i; i++) this.showColumn(n.columns[i]); return v.trigger(Gt, { column: n }), t } if (g = kt(n, L(_)), u(n, !0), v._setParentsVisibility(n, !0), v._templates(), v._updateCols(), v._updateLockedCols(), m = v.thead, c = g, v.lockedHeader && b > g ? m = v.lockedHeader.find(">table>thead") : c -= b, o = N(m).eq(c), o[0].style.display = "", Q(a(e(">table>thead", v.lockedHeader), v.thead, ">tr.k-filter-row>th"), g, !0), w[0] && (v._updateCols(w.find(">.k-grid-footer-wrap>table")), v._updateLockedCols(w.find(">.k-grid-footer-locked>table")), Q(w.find(".k-footer-template>td"), g, !0)), v.lockedTable && b > g ? J(v.lockedTable.find(">tbody>tr"), g) : J(v.tbody.children(), g - b), v.lockedTable) v._updateTablesWidth(), v._applyLockedContainersWidth(), v._syncLockedContentHeight(), v._syncLockedHeaderHeight(); else if (s = e(">.k-grid-header table:first,>.k-grid-footer table:first", v.wrapper).add(v.table), n.width) { for (l = 0, f = v.thead.prev().find("col"), i = 0, r = f.length; r > i; i += 1) { if (h = f[i].style.width, h.indexOf("%") > -1) { l = 0; break } l += parseInt(h, 10) } v._footerWidth = null, l && (s.each(function() { this.style.width = l + "px" }), v._footerWidth = l) } else s.width(""); v._updateFirstColumnClass(), v.trigger(Gt, { column: n }) } }, _progress: function(e) { var t = this.element; this.lockedContent ? t = this.wrapper : this.element.is("table") ? t = this.element.parent() : this.content && this.content.length && (t = this.content), dt.ui.progress(t, e) }, _resize: function(e, t) { this.content && (this._setContentWidth(), this._setContentHeight()), this.virtualScrollable && (t || this._rowHeight) && (t && (this._rowHeight = null), this.virtualScrollable.repaintScrollbar()) }, _isActiveInTable: function() { var t = ft(); return this.table[0] === t || e.contains(this.table[0], t) || this._isLocked() && (this.lockedTable[0] === t || e.contains(this.lockedTable[0], t)) }, refresh: function(t) { var n, i = this, r = i.dataSource.view(), o = i.options.navigatable, a = e(i.current()), s = !1, l = (i.dataSource.group() || []).length, c = i.content && i.content.scrollLeft(), d = l + B(f(i.columns)).length; t && "itemchange" === t.action && i.editable || (t = t || {}, i.trigger("dataBinding", { action: t.action || "rebind", index: t.index, items: t.items }) || (i._angularItems("cleanup"), o && (i._isActiveInTable() || i._editContainer && i._editContainer.data("kendoWindow")) && (s = a.is("th"), n = Math.max(i.cellIndex(a), 0)), i._destroyEditable(), i._progress(!1), i._hideResizeHandle(), i._data = [], i.columns.length || (i._autoColumns(i._firstDataItem(r[0], l)), d = l + i.columns.length), i._group = l > 0 || i._group, i._group && (i._templates(), i._updateCols(), i._updateLockedCols(), i._updateHeader(l), i._group = l > 0), i._renderContent(r, d, l), i._renderLockedContent(r, d, l), i._footer(), i._renderNoRecordsContent(), i._setContentHeight(), i._setContentWidth(c), i.lockedTable && (i.options.scrollable.virtual ? i.content.find(">.k-virtual-scrollable-wrap").trigger("scroll") : i.touchScroller ? i.touchScroller.movable.trigger("change") : i.content.trigger("scroll")), i._restoreCurrent(n, s), i.touchScroller && i.touchScroller.contentResized(), i.selectable && i.selectable.resetTouchEvents(), i._angularItems("compile"), i.trigger($t))) }, _restoreCurrent: function(n, i) { var r, o, a; n === t || 0 > n || (this._removeCurrent(), i ? this.current(this.thead.find("th:not(.k-group-cell)").eq(n)) : (r = 0, this._rowVirtualIndex ? r = this.virtualScrollable.position(this._rowVirtualIndex) : n = 0, o = e(), this.lockedTable && (o = this.lockedTable.find(">tbody>tr").eq(r)), o = o.add(this.tbody.children().eq(r)), a = o.find(">td:not(.k-group-cell):not(.k-hierarchy-cell)").eq(n), this.current(a)), this._current && ot(this._current.closest("table")[0], !0)) }, _angularItems: function(e) { dt.ui.DataBoundWidget.fn._angularItems.call(this, e), "cleanup" === e && this._cleanupDetailItems(), this._angularGroupItems(e), this._angularGroupFooterItems(e) }, _cleanupDetailItems: function() { var e = this; e._hasDetails() && (e.angular("cleanup", function() { return { elements: e.tbody.children(".k-detail-row") } }), e.tbody.find(".k-detail-cell").empty()) }, _angularGroupItems: function(t) { var n = this; n._group && n.angular(t, function() { return { elements: n.tbody.children(".k-grouping-row"), data: e.map(X(n.dataSource.view()), function(e) { return { dataItem: e } }) } }) }, _angularGroupFooterItems: function(t) { var n = this; n._group && n.groupFooterTemplate && n.angular(t, function() { return { elements: n.tbody.children(".k-group-footer"), data: e.map(Z(n.dataSource.view()), function(e) { return { dataItem: e } }) } }) }, _renderContent: function(e, t, n) { var i, r, o = this, a = "", s = null != o.lockedContent, l = { rowTemplate: o.rowTemplate, altRowTemplate: o.altRowTemplate, groupFooterTemplate: o.groupFooterTemplate }; if (t = s ? t - B(H(o.columns)).length : t, n > 0) for (t = s ? t - n : t, o.detailTemplate && t++, o.groupFooterTemplate && (o._groupAggregatesDefaultObject = o.dataSource.aggregates()), i = 0, r = e.length; r > i; i++) a += o._groupRowHtml(e[i], t, 0, s ? ct : lt, l, s); else a += o._rowsHtml(e, l); o.tbody = U(o.tbody, o.table, a, this.options.$angular) }, _renderLockedContent: function(e, t, n) { var i, r, o, a = "", s = { rowTemplate: this.lockedRowTemplate, altRowTemplate: this.lockedAltRowTemplate, groupFooterTemplate: this.lockedGroupFooterTemplate }; if (this.lockedContent) { if (o = this.lockedTable, n > 0) for (t -= f(L(F(this.columns))).length, i = 0, r = e.length; r > i; i++) a += this._groupRowHtml(e[i], t, 0, lt, s); else a = this._rowsHtml(e, s); U(o.children("tbody"), o, a, this.options.$angular), this._syncLockedContentHeight() } }, _adjustRowsHeight: function(e, t) { var n, i, r, o, a = e[0].rows, s = a.length, l = t[0].rows, c = e.add(t), d = c.length, u = []; for (n = 0; s > n && l[n]; n++) a[n].style.height && (a[n].style.height = l[n].style.height = ""), i = a[n].offsetHeight, r = l[n].offsetHeight, o = 0, i > r ? o = i : r > i && (o = r), u.push(o); for (n = 0; d > n; n++) c[n].style.display = "none"; for (n = 0; s > n; n++) u[n] && (a[n].style.height = l[n].style.height = u[n] + 1 + "px"); for (n = 0; d > n; n++) c[n].style.display = "" } }); dt.ExcelMixin && dt.ExcelMixin.extend(Sn.prototype), dt.PDFMixin && (dt.PDFMixin.extend(Sn.prototype), Sn.prototype._drawPDF = function(n) { function i() { d && a !== t ? (c.unbind("change", r), c.one("change", function() { s.resolve(o) }), c.page(a)) : s.resolve(o) } function r() { l._drawPDFShadow({ width: l.wrapper.width() }).done(function(e) { var t = c.page(), r = d ? c.totalPages() : 1, a = { page: e, pageNumber: t, progress: t / r, totalPages: r }; n.notify(a), o.append(a.page), r > t ? c.page(t + 1) : i() }).fail(function(e) { s.reject(e) }) } var o, a, s = new e.Deferred, l = this, c = l.dataSource, d = l.options.pdf.allPages; return this._initPDFProgress(n), o = new dt.drawing.Group, a = c.page(), d ? (c.bind("change", r), c.page(1)) : r(), s.promise() }, Sn.prototype._initPDFProgress = function(t) { var n, i = e("<div class='k-loading-pdf-mask'><div class='k-loading-color'/></div>"); i.prepend(this.wrapper.clone().css({ position: "absolute", top: 0, left: 0 })), this.wrapper.append(i), n = e("<div class='k-loading-pdf-progress'>").appendTo(i).kendoProgressBar({ type: "chunk", chunkCount: 10, min: 0, max: 1, value: 0 }).data("kendoProgressBar"), t.progress(function(e) { n.value(e.progress) }).always(function() { dt.destroy(i), i.remove() }) }), ut.plugin(Sn), ut.plugin(xn) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = "change", r = "cancel", o = "dataBound", a = "dataBinding", s = n.ui.Widget, l = n.keys, c = ">*", d = "progress", u = "error", h = "k-state-focused", p = "k-state-selected", f = "k-edit-item", g = "edit", m = "remove", v = "save", _ = "click", w = ".kendoListView", b = e.proxy, y = n._activeElement, k = n.ui.progress, x = n.data.DataSource, C = n.ui.DataBoundWidget.extend({ init: function(t, i) { var r = this; i = e.isArray(i) ? { dataSource: i } : i, s.fn.init.call(r, t, i), i = r.options, r.wrapper = t = r.element, t[0].id && (r._itemId = t[0].id + "_lv_active"), r._element(), r._dataSource(), r._templates(), r._navigatable(), r._selectable(), r._pageable(), r._crudHandlers(), r.options.autoBind && r.dataSource.fetch(), n.notify(r) }, events: [i, r, a, o, g, m, v], options: { name: "ListView", autoBind: !0, selectable: !1, navigatable: !1, template: "", altTemplate: "", editTemplate: "" }, setOptions: function(e) { s.fn.setOptions.call(this, e), this._templates(), this.selectable && (this.selectable.destroy(), this.selectable = null), this._selectable() }, _templates: function() { var e = this.options; this.template = n.template(e.template || ""), this.altTemplate = n.template(e.altTemplate || e.template), this.editTemplate = n.template(e.editTemplate || "") }, _item: function(e) { return this.element.children()[e]() }, items: function() { return this.element.children() }, dataItem: function(t) { var i = n.attr("uid"), r = e(t).closest("[" + i + "]").attr(i); return this.dataSource.getByUid(r) }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.options.autoBind && e.fetch() }, _unbindDataSource: function() { var e = this; e.dataSource.unbind(i, e._refreshHandler).unbind(d, e._progressHandler).unbind(u, e._errorHandler) }, _dataSource: function() { var e = this; e.dataSource && e._refreshHandler ? e._unbindDataSource() : (e._refreshHandler = b(e.refresh, e), e._progressHandler = b(e._progress, e), e._errorHandler = b(e._error, e)), e.dataSource = x.create(e.options.dataSource).bind(i, e._refreshHandler).bind(d, e._progressHandler).bind(u, e._errorHandler) }, _progress: function() { k(this.element, !0) }, _error: function() { k(this.element, !1) }, _element: function() { this.element.addClass("k-widget k-listview").attr("role", "listbox") }, refresh: function(e) { var i, r, s, l, c, d = this, u = d.dataSource.view(), h = "", p = d.template, f = d.altTemplate, g = y(); if (e = e || {}, "itemchange" === e.action) return d._hasBindingTarget() || d.editable || (i = e.items[0], s = d.items().filter("[" + n.attr("uid") + "=" + i.uid + "]"), s.length > 0 && (l = s.index(), d.angular("cleanup", function() { return { elements: [s] } }), s.replaceWith(p(i)), s = d.items().eq(l), s.attr(n.attr("uid"), i.uid), d.angular("compile", function() { return { elements: [s], data: [{ dataItem: i }] } }), d.trigger("itemChange", { item: s, data: i }))), t; if (!d.trigger(a, { action: e.action || "rebind", items: e.items, index: e.index })) { for (d._angularItems("cleanup"), d._destroyEditable(), l = 0, c = u.length; c > l; l++) h += l % 2 ? f(u[l]) : p(u[l]); for (d.element.html(h), r = d.items(), l = 0, c = u.length; c > l; l++) r.eq(l).attr(n.attr("uid"), u[l].uid).attr("role", "option").attr("aria-selected", "false"); d.element[0] === g && d.options.navigatable && d.current(r.eq(0)), d._angularItems("compile"), d.trigger(o) } }, _pageable: function() { var t, i, r = this, o = r.options.pageable; e.isPlainObject(o) && (i = o.pagerId, t = e.extend({}, o, { dataSource: r.dataSource, pagerId: null }), r.pager = new n.ui.Pager(e("#" + i), t)) }, _selectable: function() { var e, r, o = this, a = o.options.selectable, s = o.options.navigatable; a && (e = n.ui.Selectable.parseOptions(a).multiple, o.selectable = new n.ui.Selectable(o.element, { aria: !0, multiple: e, filter: c, change: function() { o.trigger(i) } }), s && o.element.on("keydown" + w, function(n) { if (n.keyCode === l.SPACEBAR) { if (r = o.current(), n.target == n.currentTarget && n.preventDefault(), e) if (n.ctrlKey) { if (r && r.hasClass(p)) return r.removeClass(p), t } else o.selectable.clear(); else o.selectable.clear(); o.selectable.value(r) } })) }, current: function(e) { var n = this, i = n.element, r = n._current, o = n._itemId; return e === t ? r : (r && r[0] && (r[0].id === o && r.removeAttr("id"), r.removeClass(h), i.removeAttr("aria-activedescendant")), e && e[0] && (o = e[0].id || o, n._scrollTo(e[0]), i.attr("aria-activedescendant", o), e.addClass(h).attr("id", o)), n._current = e, t) }, _scrollTo: function(t) { var n, i, r = this, o = !1, a = "scroll"; "auto" == r.wrapper.css("overflow") || r.wrapper.css("overflow") == a ? n = r.wrapper[0] : (n = window, o = !0), i = function(i, r) { var s = o ? e(t).offset()[i.toLowerCase()] : t["offset" + i], l = t["client" + r], c = e(n)[a + i](), d = e(n)[r.toLowerCase()](); s + l > c + d ? e(n)[a + i](s + l - d) : c > s && e(n)[a + i](s) }, i("Top", "Height"), i("Left", "Width") }, _navigatable: function() { var t = this, i = t.options.navigatable, r = t.element, o = function(n) { t.current(e(n.currentTarget)), e(n.target).is(":button,a,:input,a>.k-icon,textarea") || r.focus() }; i && (t._tabindex(), r.on("focus" + w, function() { var e = t._current; e && e.is(":visible") || (e = t._item("first")), t.current(e) }).on("focusout" + w, function() { t._current && t._current.removeClass(h) }).on("keydown" + w, function(i) { var o, a, s = i.keyCode, c = t.current(), d = e(i.target), u = !d.is(":button,textarea,a,a>.t-icon,input"), h = d.is(":text"), p = n.preventDefault, g = r.find("." + f), m = y(); if (!(!u && !h && l.ESC != s || h && l.ESC != s && l.ENTER != s)) if (l.UP === s || l.LEFT === s) c && (c = c.prev()), t.current(c && c[0] ? c : t._item("last")), p(i); else if (l.DOWN === s || l.RIGHT === s) c && (c = c.next()), t.current(c && c[0] ? c : t._item("first")), p(i); else if (l.PAGEUP === s) t.current(null), t.dataSource.page(t.dataSource.page() - 1), p(i); else if (l.PAGEDOWN === s) t.current(null), t.dataSource.page(t.dataSource.page() + 1), p(i); else if (l.HOME === s) t.current(t._item("first")), p(i); else if (l.END === s) t.current(t._item("last")), p(i); else if (l.ENTER === s) 0 !== g.length && (u || h) ? (o = t.items().index(g), m && m.blur(), t.save(), a = function() { t.element.trigger("focus"), t.current(t.items().eq(o)) }, t.one("dataBound", a)) : "" !== t.options.editTemplate && t.edit(c); else if (l.ESC === s) { if (g = r.find("." + f), 0 === g.length) return; o = t.items().index(g), t.cancel(), t.element.trigger("focus"), t.current(t.items().eq(o)) } }), r.on("mousedown" + w + " touchstart" + w, c, b(o, t))) }, clearSelection: function() { var e = this; e.selectable.clear(), e.trigger(i) }, select: function(n) { var i = this, r = i.selectable; return n = e(n), n.length ? (r.options.multiple || (r.clear(), n = n.first()), r.value(n), t) : r.value() }, _destroyEditable: function() { var e = this; e.editable && (e.editable.destroy(), delete e.editable) }, _modelFromElement: function(e) { var t = e.attr(n.attr("uid")); return this.dataSource.getByUid(t) }, _closeEditable: function() { var e, t, i, r = this, o = r.editable, a = r.template; return o && (o.element.index() % 2 && (a = r.altTemplate), r.angular("cleanup", function() { return { elements: [o.element] } }), e = r._modelFromElement(o.element), r._destroyEditable(), i = o.element.index(), o.element.replaceWith(a(e)), t = r.items().eq(i), t.attr(n.attr("uid"), e.uid), r._hasBindingTarget() && n.bind(t, e), r.angular("compile", function() { return { elements: [t], data: [{ dataItem: e }] } })), !0 }, edit: function(e) { var t, i, r = this, o = r._modelFromElement(e), a = o.uid; r.cancel(), e = r.items().filter("[" + n.attr("uid") + "=" + a + "]"), i = e.index(), e.replaceWith(r.editTemplate(o)), t = r.items().eq(i).addClass(f).attr(n.attr("uid"), o.uid), r.editable = t.kendoEditable({ model: o, clearContainer: !1, errorTemplate: !1, target: r }).data("kendoEditable"), r.trigger(g, { model: o, item: t }) }, save: function() { var e, t, n = this, i = n.editable; i && (t = i.element, e = n._modelFromElement(t), i.end() && !n.trigger(v, { model: e, item: t }) && (n._closeEditable(), n.dataSource.sync())) }, remove: function(e) { var t = this, n = t.dataSource, i = t._modelFromElement(e); t.editable && (n.cancelChanges(t._modelFromElement(t.editable.element)), t._closeEditable()), t.trigger(m, { model: i, item: e }) || (e.hide(), n.remove(i), n.sync()) }, add: function() { var e = this, t = e.dataSource, n = t.indexOf((t.view() || [])[0]); 0 > n && (n = 0), e.cancel(), t.insert(n, {}), e.edit(e.element.children().first()) }, cancel: function() { var e, t, n = this, i = n.dataSource; n.editable && (e = n.editable.element, t = n._modelFromElement(e), n.trigger(r, { model: t, container: e }) || (i.cancelChanges(t), n._closeEditable())) }, _crudHandlers: function() { var t = this, i = _ + w; t.element.on(i, ".k-edit-button", function(i) { var r = e(this).closest("[" + n.attr("uid") + "]"); t.edit(r), i.preventDefault() }), t.element.on(i, ".k-delete-button", function(i) { var r = e(this).closest("[" + n.attr("uid") + "]"); t.remove(r), i.preventDefault() }), t.element.on(i, ".k-update-button", function(e) { t.save(), e.preventDefault() }), t.element.on(i, ".k-cancel-button", function(e) { t.cancel(), e.preventDefault() }) }, destroy: function() { var e = this; s.fn.destroy.call(e), e._unbindDataSource(), e._destroyEditable(), e.element.off(w), e.pager && e.pager.destroy(), n.destroy(e.element) } }); n.ui.plugin(C) }(window.kendo.jQuery), function(e, t) { function n(t) { return e.map(i(t), function(e) { return e.name }).join(", ") } function i(e) { var t = e[0]; return t.files ? r(t.files) : [{ name: s(t.value), extension: a(t.value), size: null }] } function r(t) { return e.map(t, function(e) { return o(e) }) } function o(e) { var t = e.name || e.fileName; return { name: w.htmlEncode(t), extension: a(t), size: e.size || e.fileSize, rawFile: e } } function a(e) { var t = e.match(x); return t ? t[0] : "" } function s(e) { var t = e.lastIndexOf("\\"); return -1 != t ? e.substr(t + 1) : e } function l(t, n) { var i = w.guid(); return e.map(t, function(e) { return e.uid = n ? w.guid() : i, e }) } function c(t) { return !t.multiple && e(".k-file", t.wrapper).length > 1 } function d(n, i, r) { var o, a; return i._supportsRemove() ? (o = n.data("fileNames"), a = e.map(o, function(e) { return e.name }), i._submitRemove(a, r, function(e, t, r) { i._removeFileEntry(n), i.trigger(D, { operation: "remove", files: o, response: e, XMLHttpRequest: r }) }, function(e) { c(i) && i._removeFileEntry(n), i.trigger(A, { operation: "remove", files: o, XMLHttpRequest: e }), k("Server response: " + e.responseText) }), t) : (c(i) && i._removeFileEntry(n), t) } function u(t, n, i) { var r = !1, o = ""; try { o = e.parseJSON(h(t)), r = !0 } catch (a) { i() } r && n(o) } function h(e) { return (t === e || "" === e) && (e = "{}"), e } function p(e) { e.stopPropagation(), e.preventDefault() } function f(e, t, n, i) { var r, o; e.on("dragenter" + t, function() { n(), o = new Date, r || (r = setInterval(function() { var e = new Date - o; e > 100 && (i(), clearInterval(r), r = null) }, 100)) }).on("dragover" + t, function() { o = new Date }) } function g(e) { return e.is(".k-file-progress, .k-file-success, .k-file-error") } function m(t) { return e(t.target).closest(".k-file") } var v, _, w = window.kendo, b = w.ui.Widget, y = w.antiForgeryTokens, k = w.logToConsole, x = /\.([^\.]+)$/, C = ".kendoUpload", S = "select", T = "upload", D = "success", A = "error", E = "complete", I = "cancel", P = "progress", M = "remove", z = b.extend({ init: function(t, n) { var i, r, o, a = this; b.fn.init.call(a, t, n), a.name = t.name, a.multiple = a.options.multiple, a.localization = a.options.localization, i = a.element, a.wrapper = i.closest(".k-upload"), 0 === a.wrapper.length && (a.wrapper = a._wrapInput(i)), a._activeInput(i), a.toggle(a.options.enabled), r = a._ns = C + "-" + w.guid(), i.closest("form").on("submit" + r, e.proxy(a._onParentFormSubmit, a)).on("reset" + r, e.proxy(a._onParentFormReset, a)), a.options.async.saveUrl ? (a._module = a._supportsFormData() ? new _(a) : new v(a), a._async = !0, o = a.options.files, o.length > 0 && a._renderInitialFiles(o)) : a._module = new F(a), a._supportsDrop() && a._setupDropZone(), a.wrapper.on("click", ".k-upload-action", e.proxy(a._onFileAction, a)).on("click", ".k-upload-selected", e.proxy(a._onUploadSelected, a)), a.element.val() && a._onInputChange({ target: a.element }) }, events: [S, T, D, A, E, I, P, M], options: { name: "Upload", enabled: !0, multiple: !0, showFileList: !0, template: "", files: [], async: { removeVerb: "POST", autoUpload: !0, withCredentials: !0 }, localization: { select: "Select files...", cancel: "Cancel", retry: "Retry", remove: "Remove", uploadSelectedFiles: "Upload files", dropFilesHere: "drop files here to upload", statusUploading: "uploading", statusUploaded: "uploaded", statusWarning: "warning", statusFailed: "failed", headerStatusUploading: "Uploading...", headerStatusUploaded: "Done" } }, setOptions: function(e) { var t = this, n = t.element; b.fn.setOptions.call(t, e), t.multiple = t.options.multiple, n.attr("multiple", t._supportsMultiple() ? t.multiple : !1), t.toggle(t.options.enabled) }, enable: function(e) { e = t === e ? !0 : e, this.toggle(e) }, disable: function() { this.toggle(!1) }, toggle: function(e) { e = t === e ? e : !e, this.wrapper.toggleClass("k-state-disabled", e), this.element.prop("disabled", e) }, destroy: function() { var t = this; e(document).add(e(".k-dropzone", t.wrapper)).add(t.wrapper.closest("form")).off(t._ns), e(t.element).off(C), b.fn.destroy.call(t) }, _addInput: function(t) { if (t[0].nodeType) { var n = this, i = t.clone().val(""); i.insertAfter(n.element).data("kendoUpload", n), e(n.element).hide().attr("tabindex", "-1").removeAttr("id").off(C), n._activeInput(i), n.element.focus() } }, _activeInput: function(t) { var n = this, i = n.wrapper; n.element = t, t.attr("multiple", n._supportsMultiple() ? n.multiple : !1).attr("autocomplete", "off").on("click" + C, function(e) { i.hasClass("k-state-disabled") && e.preventDefault() }).on("focus" + C, function() { e(this).parent().addClass("k-state-focused") }).on("blur" + C, function() { e(this).parent().removeClass("k-state-focused") }).on("change" + C, e.proxy(n._onInputChange, n)).on("keydown" + C, e.proxy(n._onInputKeyDown, n)) }, _onInputKeyDown: function(e) { var t = this, n = t.wrapper.find(".k-upload-action:first"); e.keyCode === w.keys.TAB && n.length > 0 && (e.preventDefault(), n.focus()) }, _onInputChange: function(t) { var n = this, i = e(t.target), r = l(n._inputFiles(i), n._isAsyncNonBatch()), o = n.trigger(S, { files: r }); o ? (n._addInput(i), i.remove()) : n._module.onSelect({ target: i }, r) }, _onDrop: function(t) { var n, i = t.originalEvent.dataTransfer, o = this, a = i.files, s = l(r(a), o._isAsyncNonBatch()); p(t), a.length > 0 && (!o.multiple && s.length > 1 && s.splice(1, s.length - 1), n = o.trigger(S, { files: s }), n || o._module.onSelect({ target: e(".k-dropzone", o.wrapper) }, s)) }, _isAsyncNonBatch: function() { return this._async && !this.options.async.batch || !1 }, _renderInitialFiles: function(t) { var n, i, r = this, o = 0; for (t = l(t, !0), o = 0; t.length > o; o++) n = t[o], i = r._enqueueFile(n.name, { fileNames: [n] }), i.addClass("k-file-success").data("files", [t[o]]), e(".k-progress", i).width("100%"), r.options.template || e(".k-upload-status", i).prepend("<span class='k-upload-pct'>100%</span>"), r._supportsRemove() && r._fileAction(i, M) }, _prepareTemplateData: function(e, t) { var n = t.fileNames, i = {}, r = 0, o = 0; for (o = 0; n.length > o; o++) r += n[o].size; return i.name = e, i.size = r, i.files = t.fileNames, i }, _prepareDefaultFileEntryTemplate: function(t, n) { var i = "", r = e("<li class='k-file'><span class='k-progress'></span><span class='k-icon'></span><span class='k-filename' title='" + t + "'>" + t + "</span><strong class='k-upload-status'></strong></li>"); return 1 == n.fileNames.length && n.fileNames[0].extension && (i = n.fileNames[0].extension.substring(1), e(".k-icon", r).addClass("k-i-" + i)), r }, _enqueueFile: function(t, n) { var i, r, o, a, s = this, l = n.fileNames[0].uid, c = e(".k-upload-files", s.wrapper), d = s.options, u = d.template; return 0 === c.length && (c = e("<ul class='k-upload-files k-reset'></ul>").appendTo(s.wrapper), s.options.showFileList || c.hide(), s.wrapper.removeClass("k-upload-empty")), i = e(".k-file", c), u ? (o = s._prepareTemplateData(t, n), u = w.template(u), r = e("<li class='k-file'>" + u(o) + "</li>"), r.find(".k-upload-action").addClass("k-button k-button-bare"), s.angular("compile", function() { return { elements: r, data: [o] } })) : r = s._prepareDefaultFileEntryTemplate(t, n), r.attr(w.attr("uid"), l).appendTo(c).data(n), s._async || e(".k-progress", r).width("100%"), !s.multiple && i.length > 0 && (a = { files: i.data("fileNames") }, s.trigger(M, a) || s._module.onRemove({ target: e(i, s.wrapper) }, a.data)), r }, _removeFileEntry: function(t) { var n, i, r = this, o = t.closest(".k-upload-files"); t.remove(), n = e(".k-file", o), i = e(".k-file-success, .k-file-error", o), i.length === n.length && this._hideUploadButton(), 0 === n.length && (o.remove(), r.wrapper.addClass("k-upload-empty"), r._hideHeaderUploadstatus()) }, _fileAction: function(e, t) { var n = { remove: "k-delete", cancel: "k-cancel", retry: "k-retry" }, i = { remove: "k-i-close", cancel: "k-i-close", retry: "k-i-refresh" }; n.hasOwnProperty(t) && (this._clearFileAction(e), this.options.template ? e.find(".k-upload-action").addClass("k-button k-button-bare").append("<span class='k-icon " + i[t] + " " + n[t] + "' title='" + this.localization[t] + "'></span>").show() : (e.find(".k-upload-status .k-upload-action").remove(), e.find(".k-upload-status").append(this._renderAction(n[t], this.localization[t], i[t])))) }, _fileState: function(t, n) { var i = this.localization, r = { uploading: { text: i.statusUploading }, uploaded: { text: i.statusUploaded }, failed: { text: i.statusFailed } }, o = r[n]; o && e(".k-icon:not(.k-delete, .k-cancel, .k-retry)", t).text(o.text) }, _renderAction: function(t, n, i) { return e("" !== t ? "<button type='button' class='k-button k-button-bare k-upload-action'><span class='k-icon " + i + " " + t + "' title='" + n + "'></span></button>" : "<button type='button' class='k-button'>" + n + "</button>") }, _clearFileAction: function(t) { e(".k-upload-action", t).empty().hide() }, _onFileAction: function(t) { var n, i, r, o, a = this; return a.wrapper.hasClass("k-state-disabled") || (n = e(t.target).closest(".k-upload-action"), i = n.find(".k-icon"), r = n.closest(".k-file"), o = { files: r.data("fileNames") }, i.hasClass("k-delete") ? a.trigger(M, o) || a._module.onRemove({ target: e(r, a.wrapper) }, o.data) : i.hasClass("k-cancel") ? (a.trigger(I, o), a._module.onCancel({ target: e(r, a.wrapper) }), this._checkAllComplete(), a._updateHeaderUploadStatus()) : i.hasClass("k-retry") && (e(".k-warning", r).remove(), a._module.onRetry({ target: e(r, a.wrapper) }))), !1 }, _onUploadSelected: function() { var e = this, t = e.wrapper; return t.hasClass("k-state-disabled") || this._module.onSaveSelected(), !1 }, _onFileProgress: function(t, n) { var i; this.options.template ? e(".k-progress", t.target).width(n + "%") : (i = e(".k-upload-pct", t.target), 0 === i.length && e(".k-upload-status", t.target).prepend("<span class='k-upload-pct'></span>"), e(".k-upload-pct", t.target).text(n + "%"), e(".k-progress", t.target).width(n + "%")), this.trigger(P, { files: m(t).data("fileNames"), percentComplete: n }) }, _onUploadSuccess: function(e, t, n) { var i = m(e); this._fileState(i, "uploaded"), i.removeClass("k-file-progress").addClass("k-file-success"), this._updateHeaderUploadStatus(), this.trigger(D, { files: i.data("fileNames"), response: t, operation: "upload", XMLHttpRequest: n }), this._supportsRemove() ? this._fileAction(i, M) : this._clearFileAction(i), this._checkAllComplete() }, _onUploadError: function(t, n) { var i = m(t), r = e(".k-upload-pct", i); this._fileState(i, "failed"), i.removeClass("k-file-progress").addClass("k-file-error"), e(".k-progress", i).width("100%"), r.length > 0 ? r.empty().removeClass("k-upload-pct").addClass("k-icon k-warning") : e(".k-upload-status", i).prepend("<span class='k-icon k-warning'></span>"), this._updateHeaderUploadStatus(), this._fileAction(i, "retry"), this.trigger(A, { operation: "upload", files: i.data("fileNames"), XMLHttpRequest: n }), k("Server response: " + n.responseText), this._checkAllComplete() }, _showUploadButton: function() { var t = e(".k-upload-selected", this.wrapper); 0 === t.length && (t = this._renderAction("", this.localization.uploadSelectedFiles).addClass("k-upload-selected")), this.wrapper.append(t) }, _hideUploadButton: function() { e(".k-upload-selected", this.wrapper).remove() }, _showHeaderUploadStatus: function() { var t = this.localization, n = e(".k-dropzone", this.wrapper), i = e(".k-upload-status-total", this.wrapper); 0 !== i.length && i.remove(), i = '<strong class="k-upload-status k-upload-status-total">' + t.headerStatusUploading + '<span class="k-icon k-loading">' + t.statusUploading + "</span></strong>", n.length > 0 ? n.append(i) : e(".k-upload-button", this.wrapper).after(i) }, _updateHeaderUploadStatus: function() { var t, n, i, r = this, o = r.localization, a = e(".k-file", r.wrapper).not(".k-file-success, .k-file-error"); 0 === a.length && (t = e(".k-file.k-file-error", r.wrapper), n = e(".k-upload-status-total", r.wrapper), i = e(".k-icon", n).removeClass("k-loading").addClass(0 !== t.length ? "k-warning" : "k-i-tick").text(0 !== t.length ? o.statusWarning : o.statusUploaded), n.text(r.localization.headerStatusUploaded).append(i)) }, _hideHeaderUploadstatus: function() { e(".k-upload-status-total", this.wrapper).remove() }, _onParentFormSubmit: function() { var n, i = this, r = i.element; t !== this._module.onAbort && this._module.onAbort(), r.value || (n = e(r), n.attr("disabled", "disabled"), window.setTimeout(function() { n.removeAttr("disabled") }, 0)) }, _onParentFormReset: function() { e(".k-upload-files", this.wrapper).remove() }, _supportsFormData: function() { return "undefined" != typeof FormData }, _supportsMultiple: function() { var e = this._userAgent().indexOf("Windows") > -1; return !(w.support.browser.opera || w.support.browser.safari && e) }, _supportsDrop: function() { var e = this._userAgent().toLowerCase(), t = /chrome/.test(e), n = !t && /safari/.test(e), i = n && /windows/.test(e); return !i && this._supportsFormData() && this.options.async.saveUrl }, _userAgent: function() { return navigator.userAgent }, _setupDropZone: function() { var t, n, i = this; e(".k-upload-button", this.wrapper).wrap("<div class='k-dropzone'></div>"), t = i._ns, n = e(".k-dropzone", i.wrapper).append(e("<em>" + i.localization.dropFilesHere + "</em>")).on("dragenter" + t, p).on("dragover" + t, function(e) { e.preventDefault() }).on("drop" + t, e.proxy(this._onDrop, this)), f(n, t, function() { n.addClass("k-dropzone-hovered") }, function() { n.removeClass("k-dropzone-hovered") }), f(e(document), t, function() { n.addClass("k-dropzone-active"), n.closest(".k-upload").removeClass("k-upload-empty") }, function() { n.removeClass("k-dropzone-active"), 0 === e("li.k-file", n.closest(".k-upload")).length && n.closest(".k-upload").addClass("k-upload-empty") }) }, _supportsRemove: function() { return !!this.options.async.removeUrl }, _submitRemove: function(t, n, i, r) { var o = this, a = o.options.async.removeField || "fileNames", s = e.extend(n, y()); s[a] = t, jQuery.ajax({ type: this.options.async.removeVerb, dataType: "json", dataFilter: h, url: this.options.async.removeUrl, traditional: !0, data: s, success: i, error: r, xhrFields: { withCredentials: this.options.async.withCredentials } }) }, _wrapInput: function(e) { var t = this, n = t.options; return e.wrap("<div class='k-widget k-upload k-header'><div class='k-button k-upload-button'></div></div>"), n.async.saveUrl || e.closest(".k-upload").addClass("k-upload-sync"), e.closest(".k-upload").addClass("k-upload-empty"), e.closest(".k-button").append("<span>" + this.localization.select + "</span>"), e.closest(".k-upload") }, _checkAllComplete: function() { 0 === e(".k-file.k-file-progress", this.wrapper).length && this.trigger(E) }, _inputFiles: function(e) { return i(e) } }), F = function(e) { this.name = "syncUploadModule", this.element = e.wrapper, this.upload = e, this.element.closest("form").attr("enctype", "multipart/form-data").attr("encoding", "multipart/form-data") }; F.prototype = { onSelect: function(t, i) { var r, o = this.upload, a = e(t.target); o._addInput(a), r = o._enqueueFile(n(a), { relatedInput: a, fileNames: i }), o._fileAction(r, M) }, onRemove: function(e) { var t = m(e); t.data("relatedInput").remove(), this.upload._removeFileEntry(t) } }, v = function(e) { this.name = "iframeUploadModule", this.element = e.wrapper, this.upload = e, this.iframes = [] }, z._frameId = 0, v.prototype = { onSelect: function(t, n) { var i = this.upload, r = e(t.target), o = this.prepareUpload(r, n); i.options.async.autoUpload ? this.performUpload(o) : (i._supportsRemove() && this.upload._fileAction(o, M), i._showUploadButton()) }, prepareUpload: function(t, i) { var r, o, a, s = this.upload, l = e(s.element), c = s.options.async.saveField || t.attr("name"); return s._addInput(t), t.attr("name", c), r = this.createFrame(s.name + "_" + z._frameId++), this.registerFrame(r), o = this.createForm(s.options.async.saveUrl, r.attr("name")).append(l), a = s._enqueueFile(n(t), { frame: r, relatedInput: l, fileNames: i }), r.data({ form: o, file: a }), a }, performUpload: function(t) { var n, i, r, o = { files: t.data("fileNames") }, a = t.data("frame"), s = this.upload; if (s.trigger(T, o)) s._removeFileEntry(a.data("file")), this.cleanupFrame(a), this.unregisterFrame(a); else { s._hideUploadButton(), s._showHeaderUploadStatus(), a.appendTo(document.body), n = a.data("form").attr("action", s.options.async.saveUrl).appendTo(document.body), o.data = e.extend({}, o.data, y()); for (i in o.data) r = n.find("input[name='" + i + "']"), 0 === r.length && (r = e("<input>", { type: "hidden", name: i }).prependTo(n)), r.val(o.data[i]); s._fileAction(t, I), s._fileState(t, "uploading"), e(t).removeClass("k-file-error").addClass("k-file-progress"), a.one("load", e.proxy(this.onIframeLoad, this)), n[0].submit() } }, onSaveSelected: function() { var t = this; e(".k-file", this.element).each(function() { var n = e(this), i = g(n); i || t.performUpload(n) }) }, onIframeLoad: function(t) { var n, i = e(t.target); try { n = i.contents().text() } catch (r) { n = "Error trying to get server response: " + r } this.processResponse(i, n) }, processResponse: function(t, n) { var i = t.data("file"), r = this, o = { responseText: n }; u(n, function(n) { e.extend(o, { statusText: "OK", status: "200" }), r.upload._onFileProgress({ target: e(i, r.upload.wrapper) }, 100), r.upload._onUploadSuccess({ target: e(i, r.upload.wrapper) }, n, o), r.cleanupFrame(t), r.unregisterFrame(t) }, function() { e.extend(o, { statusText: "error", status: "500" }), r.upload._onUploadError({ target: e(i, r.upload.wrapper) }, o) }) }, onCancel: function(t) { var n = e(t.target).data("frame"); this.stopFrameSubmit(n), this.cleanupFrame(n), this.unregisterFrame(n), this.upload._removeFileEntry(n.data("file")) }, onRetry: function(e) { var t = m(e); this.performUpload(t) }, onRemove: function(e, t) { var n = m(e), i = n.data("frame"); i ? (this.unregisterFrame(i), this.upload._removeFileEntry(n), this.cleanupFrame(i)) : d(n, this.upload, t) }, onAbort: function() { var t = this.element, n = this; e.each(this.iframes, function() { e("input", this.data("form")).appendTo(t), n.stopFrameSubmit(this[0]), this.data("form").remove(), this.remove() }), this.iframes = [] }, createFrame: function(t) { return e("<iframe name='" + t + "' id='" + t + "' style='display:none;' />") }, createForm: function(t, n) { return e("<form enctype='multipart/form-data' method='POST' action='" + t + "' target='" + n + "'/>") }, stopFrameSubmit: function(e) { t !== e.stop ? e.stop() : e.document && e.document.execCommand("Stop") }, registerFrame: function(e) { this.iframes.push(e) }, unregisterFrame: function(t) { this.iframes = e.grep(this.iframes, function(e) { return e.attr("name") != t.attr("name") }) }, cleanupFrame: function(e) { var t = e.data("form"); e.data("file").data("frame", null), setTimeout(function() { t.remove(), e.remove() }, 1) } }, _ = function(e) { this.name = "formDataUploadModule", this.element = e.wrapper, this.upload = e }, _.prototype = { onSelect: function(t, n) { var i = this.upload, r = this, o = e(t.target), a = this.prepareUpload(o, n); e.each(a, function() { i.options.async.autoUpload ? r.performUpload(this) : (i._supportsRemove() && i._fileAction(this, M), i._showUploadButton()) }) }, prepareUpload: function(t, n) { var i = this.enqueueFiles(n); return t.is("input") && (e.each(i, function() { e(this).data("relatedInput", t) }), t.data("relatedFileEntries", i), this.upload._addInput(t)), i }, enqueueFiles: function(t) { var n, i, r, o, a = this.upload, s = t.length, l = []; if (a.options.async.batch === !0) n = e.map(t, function(e) { return e.name }).join(", "), o = a._enqueueFile(n, { fileNames: t }), o.data("files", t), l.push(o); else for (i = 0; s > i; i++) r = t[i], n = r.name, o = a._enqueueFile(n, { fileNames: [r] }), o.data("files", [r]), l.push(o); return l }, performUpload: function(t) { var n, i = this.upload, r = this.createFormData(), o = this.createXHR(), a = { files: t.data("fileNames"), XMLHttpRequest: o }; if (i.trigger(T, a)) this.removeFileEntry(t); else { if (i._fileAction(t, I), i._hideUploadButton(), i._showHeaderUploadStatus(), a.formData) r = a.formData; else { a.data = e.extend({}, a.data, y()); for (n in a.data) r.append(n, a.data[n]); this.populateFormData(r, t.data("files")) } i._fileState(t, "uploading"), e(t).removeClass("k-file-error").addClass("k-file-progress"), this.postFormData(i.options.async.saveUrl, r, t, o) } }, onSaveSelected: function() { var t = this; e(".k-file", this.element).each(function() { var n = e(this), i = g(n); i || t.performUpload(n) }) }, onCancel: function(e) { var t = m(e); this.stopUploadRequest(t), this.removeFileEntry(t) }, onRetry: function(e) { var t = m(e); this.performUpload(t) }, onRemove: function(e, t) { var n = m(e); n.hasClass("k-file-success") ? d(n, this.upload, t) : this.removeFileEntry(n) }, createXHR: function() { return new XMLHttpRequest }, postFormData: function(e, t, n, i) { var r = this; n.data("request", i), i.addEventListener("load", function(e) { r.onRequestSuccess.call(r, e, n) }, !1), i.addEventListener(A, function(e) { r.onRequestError.call(r, e, n) }, !1), i.upload.addEventListener("progress", function(e) { r.onRequestProgress.call(r, e, n) }, !1), i.open("POST", e, !0), i.withCredentials = this.upload.options.async.withCredentials, i.send(t) }, createFormData: function() { return new FormData }, populateFormData: function(e, t) { var n, i = this.upload, r = t.length; for (n = 0; r > n; n++) e.append(i.options.async.saveField || i.name, t[n].rawFile); return e }, onRequestSuccess: function(t, n) { function i() { o.upload._onUploadError({ target: e(n, o.upload.wrapper) }, r) } var r = t.target, o = this; r.status >= 200 && 299 >= r.status ? u(r.responseText, function(t) { o.upload._onFileProgress({ target: e(n, o.upload.wrapper) }, 100), o.upload._onUploadSuccess({ target: e(n, o.upload.wrapper) }, t, r), o.cleanupFileEntry(n) }, i) : i() }, onRequestError: function(t, n) { var i = t.target; this.upload._onUploadError({ target: e(n, this.upload.wrapper) }, i) }, cleanupFileEntry: function(t) { var n = t.data("relatedInput"), i = !0; n && (e.each(n.data("relatedFileEntries") || [], function() { this.parent().length > 0 && this[0] != t[0] && (i = i && this.hasClass("k-file-success")) }), i && n.remove()) }, removeFileEntry: function(e) { this.cleanupFileEntry(e), this.upload._removeFileEntry(e) }, onRequestProgress: function(t, n) { var i = Math.round(100 * t.loaded / t.total); this.upload._onFileProgress({ target: e(n, this.upload.wrapper) }, i) }, stopUploadRequest: function(e) { e.data("request").abort() } }, w.ui.plugin(z) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { var i, r; e.on("dragenter" + x, function() { t(), r = new Date, i || (i = setInterval(function() { var e = new Date - r; e > 100 && (n(), clearInterval(i), i = null) }, 100)) }).on("dragover" + x, function() { r = new Date }) } function i(e, n) { return e !== t && e.match(/\/$/) || (e = (e || "") + "/"), e + n } function r(e) { if (!e) return ""; var t = " bytes"; return e >= 1073741824 ? (t = " GB", e /= 1073741824) : e >= 1048576 ? (t = " MB", e /= 1048576) : e >= 1024 && (t = " KB", e /= 1024), Math.round(100 * e) / 100 + t } function o(e, t) { var n = e[t]; return h(n) ? n.from || n.field || t : n } var a, s, l, c, d = window.kendo, u = d.ui.Widget, h = e.isPlainObject, p = e.proxy, f = e.extend, g = d.support.placeholder, m = d.support.browser, v = d.isFunction, _ = /(^\/|\/$)/g, w = "change", b = "apply", y = "error", k = "click", x = ".kendoFileBrowser", C = ".kendoBreadcrumbs", S = ".kendoSearchBox", T = "name", D = "size", A = "type", E = { field: A, dir: "asc" }, I = d.template('<li class="k-tile-empty"><strong>${text}</strong></li>'), P = '<div class="k-widget k-filebrowser-toolbar k-header k-floatwrap"><div class="k-toolbar-wrap"># if (showUpload) { # <div class="k-widget k-upload"><div class="k-button k-button-icontext k-upload-button"><span class="k-icon k-add"></span>#=messages.uploadFile#<input type="file" name="file" /></div></div># } ## if (showCreate) { #<button type="button" class="k-button k-button-icon"><span class="k-icon k-addfolder" /></button># } ## if (showDelete) { #<button type="button" class="k-button k-button-icon k-state-disabled"><span class="k-icon k-delete" /></button> # } #</div><div class="k-tiles-arrange"><label>#=messages.orderBy#: <select /></label></a></div></div>'; f(!0, d.data, { schemas: { filebrowser: { data: function(e) { return e.items || e || [] }, model: { id: "name", fields: { name: "name", size: "size", type: "type" } } } } }), f(!0, d.data, { transports: { filebrowser: d.data.RemoteTransport.extend({ init: function(t) { d.data.RemoteTransport.fn.init.call(this, e.extend(!0, {}, this.options, t)) }, _call: function(t, n) { n.data = e.extend({}, n.data, { path: this.options.path() }), v(this.options[t]) ? this.options[t].call(this, n) : d.data.RemoteTransport.fn[t].call(this, n) }, read: function(e) { this._call("read", e) }, create: function(e) { this._call("create", e) }, destroy: function(e) { this._call("destroy", e) }, update: function() {}, options: { read: { type: "POST" }, update: { type: "POST" }, create: { type: "POST" }, destroy: { type: "POST" } } }) } }), a = m.msie && 8 > m.version ? function(e) { return e.offsetTop } : function(t) { return t.offsetTop - e(t).height() }, s = u.extend({ init: function(e, t) { var n = this; t = t || {}, u.fn.init.call(n, e, t), n.element.addClass("k-filebrowser"), n.element.on(k + x, ".k-filebrowser-toolbar button:not(.k-state-disabled):has(.k-delete)", p(n._deleteClick, n)).on(k + x, ".k-filebrowser-toolbar button:not(.k-state-disabled):has(.k-addfolder)", p(n._addClick, n)).on("keydown" + x, "li.k-state-selected input", p(n._directoryKeyDown, n)).on("blur" + x, "li.k-state-selected input", p(n._directoryBlur, n)), n._dataSource(), n.refresh(), n.path(n.options.path) }, options: { name: "FileBrowser", messages: { uploadFile: "Upload", orderBy: "Arrange by", orderByName: "Name", orderBySize: "Size", directoryNotFound: "A directory with this name was not found.", emptyFolder: "Empty Folder", deleteFile: 'Are you sure you want to delete "{0}"?', invalidFileType: 'The selected file "{0}" is not valid. Supported file types are {1}.', overwriteFile: 'A file with name "{0}" already exists in the current directory. Do you want to overwrite it?', dropFilesHere: "drop file here to upload", search: "Search" }, transport: {}, path: "/", fileTypes: "*.*" }, events: [y, w, b], destroy: function() { var e = this; u.fn.destroy.call(e), e.dataSource.unbind(y, e._errorHandler), e.element.add(e.list).add(e.toolbar).off(x), d.destroy(e.element) }, value: function() { var e, n = this, r = n._selectedItem(), o = n.options.transport.fileUrl; return r && "f" === r.get(A) ? (e = i(n.path(), r.get(T)).replace(_, ""), o && (e = v(o) ? o(e) : d.format(o, encodeURIComponent(e))), e) : t }, _selectedItem: function() { var e = this.listView, n = e.select(); return n.length ? this.dataSource.getByUid(n.attr(d.attr("uid"))) : t }, _toolbar: function() { var t = this, n = d.template(P), i = t.options.messages, r = [{ text: i.orderByName, value: "name" }, { text: i.orderBySize, value: "size" }]; t.toolbar = e(n({ messages: i, showUpload: t.options.transport.uploadUrl, showCreate: t.options.transport.create, showDelete: t.options.transport.destroy })).appendTo(t.element).find(".k-upload input").kendoUpload({ multiple: !1, localization: { dropFilesHere: i.dropFilesHere }, async: { saveUrl: t.options.transport.uploadUrl, autoUpload: !0 }, upload: p(t._fileUpload, t), error: function(e) { t._error({ xhr: e.XMLHttpRequest, status: "error" }) } }).end(), t.upload = t.toolbar.find(".k-upload input").data("kendoUpload"), t.arrangeBy = t.toolbar.find(".k-tiles-arrange select").kendoDropDownList({ dataSource: r, dataTextField: "text", dataValueField: "value", change: function() { t.orderBy(this.value()) } }).data("kendoDropDownList"), t._attachDropzoneEvents() }, _attachDropzoneEvents: function() { var t = this; t.options.transport.uploadUrl && (n(e(document.documentElement), e.proxy(t._dropEnter, t), e.proxy(t._dropLeave, t)), t._scrollHandler = p(t._positionDropzone, t)) }, _dropEnter: function() { this._positionDropzone(), e(document).on("scroll" + x, this._scrollHandler) }, _dropLeave: function() { this._removeDropzone(), e(document).off("scroll" + x, this._scrollHandler) }, _positionDropzone: function() { var e = this, t = e.element, n = t.offset(); e.toolbar.find(".k-dropzone").addClass("k-filebrowser-dropzone").offset(n).css({ width: t[0].clientWidth, height: t[0].clientHeight, lineHeight: t[0].clientHeight + "px" }) }, _removeDropzone: function() { this.toolbar.find(".k-dropzone").removeClass("k-filebrowser-dropzone").css({ width: "", height: "", lineHeight: "", top: "", left: "" }) }, _deleteClick: function() { var e = this, t = e.listView.select(), n = d.format(e.options.messages.deleteFile, t.find("strong").text()); t.length && e._showMessage(n, "confirm") && e.listView.remove(t) }, _addClick: function() { this.createDirectory() }, _getFieldName: function(e) { return o(this.dataSource.reader.model.fields, e) }, _fileUpload: function(e) { var t, n = this, i = n.options, r = i.fileTypes, o = RegExp(("(" + r.split(",").join(")|(") + ")").replace(/\*\./g, ".*."), "i"), a = e.files[0].name, s = T, l = D; o.test(a) ? (e.data = { path: n.path() }, t = n._createFile(a), t ? n.upload.one("success", function(e) { t.set(s, e.response[n._getFieldName(s)]), t.set(l, e.response[n._getFieldName(l)]), n._tiles = n.listView.items().filter("[" + d.attr("type") + "=f]") }) : e.preventDefault()) : (e.preventDefault(), n._showMessage(d.format(i.messages.invalidFileType, a, r))) }, _findFile: function(e) { var t, n, i, r = this.dataSource.data(), o = A, a = T; for (e = e.toLowerCase(), t = 0, i = r.length; i > t; t++) if ("f" === r[t].get(o) && r[t].get(a).toLowerCase() === e) { n = r[t]; break } return n }, _createFile: function(e) { var t, n, i = this, r = 0, o = {}, a = A, s = i.dataSource.view(), l = i._findFile(e); if (l && !i._showMessage(d.format(i.options.messages.overwriteFile, e), "confirm")) return null; if (l) return l; for (t = 0, n = s.length; n > t; t++) if ("f" === s[t].get(a)) { r = t; break } return o[a] = "f", o[T] = e, o[D] = 0, i.dataSource.insert(++r, o) }, createDirectory: function() { var e, t, n = this, i = 0, r = A, o = T, a = n.dataSource.data(), s = n._nameDirectory(), l = new n.dataSource.reader.model; for (e = 0, t = a.length; t > e; e++) "d" === a[e].get(r) && (i = e); l.set(r, "d"), l.set(o, s), n.listView.one("dataBound", function() { var e = n.listView.items().filter("[" + d.attr("uid") + "=" + l.uid + "]"), t = e.find("input"); e.length && this.edit(e), this.element.scrollTop(e.attr("offsetTop") - this.element[0].offsetHeight), setTimeout(function() { t.select() }) }).one("save", function(e) { var t = e.model.get(o); t ? e.model.set(o, n._nameExists(t, l.uid) ? n._nameDirectory() : t) : e.model.set(o, s) }), n.dataSource.insert(++i, l) }, _directoryKeyDown: function(e) { 13 == e.keyCode && e.currentTarget.blur() }, _directoryBlur: function() { this.listView.save() }, _nameExists: function(e, t) { var n, i, r = this.dataSource.data(), o = A, a = T; for (n = 0, i = r.length; i > n; n++) if ("d" === r[n].get(o) && r[n].get(a).toLowerCase() === e.toLowerCase() && r[n].uid !== t) return !0; return !1 }, _nameDirectory: function() { var t, n, i, r = "New folder", o = this.dataSource.data(), a = [], s = A, l = T; for (n = 0, i = o.length; i > n; n++) "d" === o[n].get(s) && o[n].get(l).toLowerCase().indexOf(r.toLowerCase()) > -1 && a.push(o[n].get(l)); if (e.inArray(r, a) > -1) { n = 2; do t = r + " (" + n + ")", n++; while (e.inArray(t, a) > -1); r = t } return r }, orderBy: function(e) { this.dataSource.sort([{ field: A, dir: "asc" }, { field: e, dir: "asc" }]) }, search: function(e) { this.dataSource.filter({ field: T, operator: "contains", value: e }) }, _content: function() { var t = this; t.list = e('<ul class="k-reset k-floats k-tiles" />').appendTo(t.element).on("dblclick" + x, "li", p(t._dblClick, t)), t.listView = new d.ui.ListView(t.list, { dataSource: t.dataSource, template: t._itemTmpl(), editTemplate: t._editTmpl(), selectable: !0, autoBind: !1, dataBinding: function(e) { t.toolbar.find(".k-delete").parent().addClass("k-state-disabled"), ("remove" === e.action || "sync" === e.action) && e.preventDefault() }, dataBound: function() { t.dataSource.view().length ? t._tiles = this.items().filter("[" + d.attr("type") + "=f]") : this.wrapper.append(I({ text: t.options.messages.emptyFolder })) }, change: p(t._listViewChange, t) }) }, _dblClick: function(t) { var n, r = this, o = e(t.currentTarget); o.hasClass("k-edit-item") && r._directoryBlur(), o.filter("[" + d.attr("type") + "=d]").length ? (n = r.dataSource.getByUid(o.attr(d.attr("uid"))), n && (r.path(i(r.path(), n.get(T))), r.breadcrumbs.value(r.path()))) : o.filter("[" + d.attr("type") + "=f]").length && r.trigger(b) }, _listViewChange: function() { var e = this._selectedItem(); e && (this.toolbar.find(".k-delete").parent().removeClass("k-state-disabled"), "f" === e.get(A) && this.trigger(w)) }, _dataSource: function() { var e, t = this, n = t.options, i = n.transport, r = f({}, E), o = { field: T, dir: "asc" }, a = { type: i.type || "filebrowser", sort: [r, o] }; h(i) && (i.path = p(t.path, t), a.transport = i), h(n.schema) ? a.schema = n.schema : i.type && h(d.data.schemas[i.type]) && (e = d.data.schemas[i.type]), t.dataSource && t._errorHandler ? t.dataSource.unbind(y, t._errorHandler) : t._errorHandler = p(t._error, t), t.dataSource = d.data.DataSource.create(a).bind(y, t._errorHandler) }, _navigation: function() { var t = this, n = e('<div class="k-floatwrap"><input/><input/></div>').appendTo(this.element); t.breadcrumbs = n.find("input:first").kendoBreadcrumbs({ value: t.options.path, change: function() { t.path(this.value()) } }).data("kendoBreadcrumbs"), t.searchBox = n.parent().find("input:last").kendoSearchBox({ label: t.options.messages.search, change: function() { t.search(this.value()) } }).data("kendoSearchBox") }, _error: function(e) { var t, n = this; n.trigger(y, e) || (t = e.xhr.status, "error" == e.status ? "404" == t ? n._showMessage(n.options.messages.directoryNotFound) : "0" != t && n._showMessage("Error! The requested URL returned " + t + " - " + e.xhr.statusText) : "timeout" == t && n._showMessage("Error! Server timeout.")) }, _showMessage: function(e, t) { return window[t || "alert"](e) }, refresh: function() { var e = this; e._navigation(), e._toolbar(), e._content() }, _editTmpl: function() { var e = '<li class="k-tile k-state-selected" ' + d.attr("uid") + '="#=uid#" '; return e += d.attr("type") + '="${' + A + '}">', e += "#if(" + A + ' == "d") { #', e += '<div class="k-thumb"><span class="k-icon k-folder"></span></div>', e += "#}else{#", e += '<div class="k-thumb"><span class="k-icon k-loading"></span></div>', e += "#}#", e += "#if(" + A + ' == "d") { #', e += '<input class="k-input" ' + d.attr("bind") + '="value:' + T + '"/>', e += "#}#", e += "</li>", p(d.template(e), { sizeFormatter: r }) }, _itemTmpl: function() { var e = '<li class="k-tile" ' + d.attr("uid") + '="#=uid#" '; return e += d.attr("type") + '="${' + A + '}">', e += "#if(" + A + ' == "d") { #', e += '<div class="k-thumb"><span class="k-icon k-folder"></span></div>', e += "#}else{#", e += '<div class="k-thumb"><span class="k-icon k-file"></span></div>', e += "#}#", e += "<strong>${" + T + "}</strong>", e += "#if(" + A + ' == "f") { # <span class="k-filesize">${this.sizeFormatter(' + D + ")}</span> #}#", e += "</li>", p(d.template(e), { sizeFormatter: r }) }, path: function(e) { var n = this, i = n._path || ""; return e !== t ? (n._path = e.replace(_, "") + "/", n.dataSource.read({ path: n._path }), t) : (i && (i = i.replace(_, "")), "/" === i || "" === i ? "" : i + "/") } }), l = u.extend({ init: function(e, t) { var n = this; t = t || {}, u.fn.init.call(n, e, t), g && n.element.attr("placeholder", n.options.label), n._wrapper(), n.element.on("keydown" + S, p(n._keydown, n)).on("change" + S, p(n._updateValue, n)), n.wrapper.on(k + S, "a", p(n._click, n)), g || n.element.on("focus" + S, p(n._focus, n)).on("blur" + S, p(n._blur, n)) }, options: { name: "SearchBox", label: "Search", value: "" }, events: [w], destroy: function() { var e = this; e.wrapper.add(e.element).add(e.label).off(S), u.fn.destroy.call(e) }, _keydown: function(e) { 13 === e.keyCode && this._updateValue() }, _click: function(e) { e.preventDefault(), this._updateValue() }, _updateValue: function() { var e = this, t = e.element.val(); t !== e.value() && (e.value(t), e.trigger(w)) }, _blur: function() { this._updateValue(), this._toggleLabel() }, _toggleLabel: function() { g || this.label.toggle(!this.element.val()) }, _focus: function() { this.label.hide() }, _wrapper: function() { var t = this.element, n = t.parents(".k-search-wrap"); t[0].style.width = "", t.addClass("k-input"), n.length || (n = t.wrap(e('<div class="k-widget k-search-wrap k-textbox"/>')).parent(), g || e('<label style="display:block">' + this.options.label + "</label>").insertBefore(t), e('<a href="#" class="k-icon k-i-search k-search"/>').appendTo(n)), this.wrapper = n, this.label = n.find(">label") }, value: function(e) { var n = this; return e !== t ? (n.options.value = e, n.element.val(e), n._toggleLabel(), t) : n.options.value } }), c = u.extend({ init: function(e, t) { var n = this; t = t || {}, u.fn.init.call(n, e, t), n._wrapper(), n.wrapper.on("focus" + C, "input", p(n._focus, n)).on("blur" + C, "input", p(n._blur, n)).on("keydown" + C, "input", p(n._keydown, n)).on(k + C, "a.k-i-arrow-n:first", p(n._rootClick, n)).on(k + C, "a:not(.k-i-arrow-n)", p(n._click, n)), n.value(n.options.value) }, options: { name: "Breadcrumbs", gap: 50 }, events: [w], destroy: function() { var e = this; u.fn.destroy.call(e), e.wrapper.add(e.wrapper.find("input")).add(e.wrapper.find("a")).off(C) }, _update: function(e) { e = "/" === (e || "").charAt(0) ? e : "/" + (e || ""), e !== this.value() && (this.value(e), this.trigger(w)) }, _click: function(t) { t.preventDefault(), this._update(this._path(e(t.target).prevAll("a:not(.k-i-arrow-n)").addBack())) }, _rootClick: function(e) { e.preventDefault(), this._update("") }, _focus: function() { var e = this, t = e.element; e.overlay.hide(), e.element.val(e.value()), setTimeout(function() { t.select() }) }, _blur: function() { if (!this.overlay.is(":visible")) { var e = this, t = e.element, n = t.val().replace(/\/{2,}/g, "/"); e.overlay.show(), t.val(""), e._update(n) } }, _keydown: function(e) { var t = this; 13 === e.keyCode && (t._blur(), setTimeout(function() { t.overlay.find("a:first").focus() })) }, _wrapper: function() { var t, n = this.element, i = n.parents(".k-breadcrumbs"); n[0].style.width = "", n.addClass("k-input"), i.length || (i = n.wrap(e('<div class="k-widget k-breadcrumbs k-textbox"/>')).parent()), t = i.find(".k-breadcrumbs-wrap"), t.length || (t = e('<div class="k-breadcrumbs-wrap"/>').appendTo(i)), this.wrapper = i, this.overlay = t }, refresh: function() { var n, i, r, o, a = "", s = this.value(); for (s !== t && s.match(/^\//) || (s = "/" + (s || "")), n = s.split("/"), r = 0, o = n.length; o > r; r++) i = n[r], i && (a || (a += '<a href="#" class="k-icon k-i-arrow-n">root</a>'), a += '<a class="k-link" href="#">' + n[r] + "</a>", a += '<span class="k-icon k-i-arrow-e">></span>'); this.overlay.empty().append(e(a)), this._adjustSectionWidth() }, _adjustSectionWidth: function() { var t, n = this, i = n.wrapper, r = i.width() - n.options.gap, o = n.overlay.find("a"); o.each(function(n) { t = e(this), t.parent().width() > r && (n == o.length - 1 ? t.width(r) : t.prev().addBack().hide()) }) }, value: function(e) { return e !== t ? (this._value = e.replace(/\/{2,}/g, "/"), this.refresh(), t) : this._value }, _path: function(t) { return "/" + e.map(t, function(t) { return e(t).text() }).join("/") } }), d.ui.plugin(s), d.ui.plugin(c), d.ui.plugin(l) }(window.kendo.jQuery), function(e, t) { function n(e, n) { return e !== t && e.match(/\/$/) || (e = (e || "") + "/"), e + n } function i(e) { if (!e) return ""; var t = " bytes"; return e >= 1073741824 ? (t = " GB", e /= 1073741824) : e >= 1048576 ? (t = " MB", e /= 1048576) : e >= 1024 && (t = " KB", e /= 1024), Math.round(100 * e) / 100 + t } var r, o, a = window.kendo, s = a.ui.FileBrowser, l = e.isPlainObject, c = e.proxy, d = e.extend, u = a.support.browser, h = a.isFunction, p = /(^\/|\/$)/g, f = "error", g = ".kendoImageBrowser", m = "name", v = "size", _ = "type", w = { field: _, dir: "asc" }, b = a.template('<li class="k-tile-empty"><strong>${text}</strong></li>'); d(!0, a.data, { schemas: { imagebrowser: { data: function(e) { return e.items || e || [] }, model: { id: "name", fields: { name: "name", size: "size", type: "type" } } } } }), d(!0, a.data, { transports: { imagebrowser: a.data.RemoteTransport.extend({ init: function(t) { a.data.RemoteTransport.fn.init.call(this, e.extend(!0, {}, this.options, t)) }, _call: function(t, n) { n.data = e.extend({}, n.data, { path: this.options.path() }), h(this.options[t]) ? this.options[t].call(this, n) : a.data.RemoteTransport.fn[t].call(this, n) }, read: function(e) { this._call("read", e) }, create: function(e) { this._call("create", e) }, destroy: function(e) { this._call("destroy", e) }, update: function() {}, options: { read: { type: "POST" }, update: { type: "POST" }, create: { type: "POST" }, destroy: { type: "POST" } } }) } }), r = u.msie && 8 > u.version ? function(e) { return e.offsetTop } : function(t) { return t.offsetTop - e(t).height() }, o = s.extend({ init: function(e, t) { var n = this; t = t || {}, s.fn.init.call(n, e, t), n.element.addClass("k-imagebrowser") }, options: { name: "ImageBrowser", fileTypes: "*.png,*.gif,*.jpg,*.jpeg" }, value: function() { var e, i = this, r = i._selectedItem(), o = i.options.transport.imageUrl; return r && "f" === r.get(_) ? (e = n(i.path(), r.get(m)).replace(p, ""), o && (e = h(o) ? o(e) : a.format(o, encodeURIComponent(e))), e) : t }, _fileUpload: function(e) { var t, n = this, i = n.options, r = i.fileTypes, o = RegExp(("(" + r.split(",").join(")|(") + ")").replace(/\*\./g, ".*."), "i"), s = e.files[0].name, l = m, c = v; o.test(s) ? (e.data = { path: n.path() }, t = n._createFile(s), t ? (t._uploading = !0, n.upload.one("success", function(e) { delete t._uploading, t.set(l, e.response[n._getFieldName(l)]), t.set(c, e.response[n._getFieldName(c)]), n._tiles = n.listView.items().filter("[" + a.attr("type") + "=f]"), n._scroll() })) : e.preventDefault()) : (e.preventDefault(), n._showMessage(a.format(i.messages.invalidFileType, s, r))) }, _content: function() { var t = this; t.list = e('<ul class="k-reset k-floats k-tiles" />').appendTo(t.element).on("scroll" + g, c(t._scroll, t)).on("dblclick" + g, "li", c(t._dblClick, t)), t.listView = new a.ui.ListView(t.list, { dataSource: t.dataSource, template: t._itemTmpl(), editTemplate: t._editTmpl(), selectable: !0, autoBind: !1, dataBinding: function(e) { t.toolbar.find(".k-delete").parent().addClass("k-state-disabled"), ("remove" === e.action || "sync" === e.action) && e.preventDefault() }, dataBound: function() { t.dataSource.view().length ? (t._tiles = this.items().filter("[" + a.attr("type") + "=f]"), t._scroll()) : this.wrapper.append(b({ text: t.options.messages.emptyFolder })) }, change: c(t._listViewChange, t) }) }, _dataSource: function() { var e, t = this, n = t.options, i = n.transport, r = d({}, w), o = { field: m, dir: "asc" }, s = { type: i.type || "imagebrowser", sort: [r, o] }; l(i) && (i.path = c(t.path, t), s.transport = i), l(n.schema) ? s.schema = n.schema : i.type && l(a.data.schemas[i.type]) && (e = a.data.schemas[i.type]), t.dataSource && t._errorHandler ? t.dataSource.unbind(f, t._errorHandler) : t._errorHandler = c(t._error, t), t.dataSource = a.data.DataSource.create(s).bind(f, t._errorHandler) }, _loadImage: function(t) { var n = this, i = e(t), r = n.dataSource.getByUid(i.attr(a.attr("uid"))), o = r.get(m), s = n.options.transport.thumbnailUrl, l = e("<img />", { alt: o }), c = "?"; r._uploading || (l.hide().on("load" + g, function() { e(this).prev().remove().end().addClass("k-image").fadeIn() }), i.find(".k-loading").after(l), h(s) ? s = s(n.path(), encodeURIComponent(o)) : (s.indexOf("?") >= 0 && (c = "&"), s = s + c + "path=" + n.path() + encodeURIComponent(o)), l.attr("src", s), t.loaded = !0) }, _scroll: function() { var e = this; e.options.transport && e.options.transport.thumbnailUrl && (clearTimeout(e._timeout), e._timeout = setTimeout(function() { var n = e.list.outerHeight(), i = e.list.scrollTop(), o = i + n; e._tiles.each(function() { var n = r(this), a = n + this.offsetHeight; return (n >= i && o > n || a >= i && o > a) && e._loadImage(this), n > o ? !1 : t }), e._tiles = e._tiles.filter(function() { return !this.loaded }) }, 250)) }, _itemTmpl: function() { var e = this, t = '<li class="k-tile" ' + a.attr("uid") + '="#=uid#" '; return t += a.attr("type") + '="${' + _ + '}">', t += "#if(" + _ + ' == "d") { #', t += '<div class="k-thumb"><span class="k-icon k-folder"></span></div>', t += "#}else{#", t += e.options.transport && e.options.transport.thumbnailUrl ? '<div class="k-thumb"><span class="k-icon k-loading"></span></div>' : '<div class="k-thumb"><span class="k-icon k-file"></span></div>', t += "#}#", t += "<strong>${" + m + "}</strong>", t += "#if(" + _ + ' == "f") { # <span class="k-filesize">${this.sizeFormatter(' + v + ")}</span> #}#", t += "</li>", c(a.template(t), { sizeFormatter: i }) } }), a.ui.plugin(o) }(window.kendo.jQuery), function(e, t) { var n, i, r, o, a = window.kendo, s = a.Class, l = a.ui.Widget, c = a.support.mobileOS, d = a.support.browser, u = e.extend, h = e.proxy, p = a.deepExtend, f = ".kendoEditor", g = a.keys, m = s.extend({ init: function(e) { this.options = e }, getHtml: function() { var e = this.options; return a.template(e.template, { useWithBlock: !1 })(e) } }), v = { editorWrapperTemplate: '<table cellspacing="4" cellpadding="0" class="k-widget k-editor k-header" role="presentation"><tbody><tr role="presentation"><td class="k-editor-toolbar-wrap" role="presentation"><ul class="k-editor-toolbar" role="toolbar" /></td></tr><tr><td class="k-editable-area" /></tr></tbody></table>', buttonTemplate: '<a href="" role="button" class="k-tool"#= data.popup ? " data-popup" : "" # unselectable="on" title="#= data.title #"><span unselectable="on" class="k-tool-icon #= data.cssClass #"></span><span class="k-tool-text">#= data.title #</span></a>', colorPickerTemplate: '<div class="k-colorpicker #= data.cssClass #" />', comboBoxTemplate: '<select title="#= data.title #" class="#= data.cssClass #" />', dropDownListTemplate: '<span class="k-editor-dropdown"><select title="#= data.title #" class="#= data.cssClass #" /></span>', separatorTemplate: '<span class="k-separator" />', overflowAnchorTemplate: '<a href="" role="button" class="k-tool k-overflow-anchor" data-popup unselectable="on"><span unselectable="on" class="k-icon k-i-more"></span></a>', formatByName: function(t, n) { for (var i = 0; n.length > i; i++) if (e.inArray(t, n[i].tags) >= 0) return n[i] }, registerTool: function(e, t) { var n = t.options; n && n.template && (n.template.options.cssClass = "k-" + e), t.name || (t.options.name = e, t.name = e.toLowerCase()), y.defaultTools[e] = t }, registerFormat: function(e, t) { y.fn.options.formats[e] = t } }, _ = { bold: "Bold", italic: "Italic", underline: "Underline", strikethrough: "Strikethrough", superscript: "Superscript", subscript: "Subscript", justifyCenter: "Center text", justifyLeft: "Align text left", justifyRight: "Align text right", justifyFull: "Justify", insertUnorderedList: "Insert unordered list", insertOrderedList: "Insert ordered list", indent: "Indent", outdent: "Outdent", createLink: "Insert hyperlink", unlink: "Remove hyperlink", insertImage: "Insert image", insertFile: "Insert file", insertHtml: "Insert HTML", viewHtml: "View HTML", fontName: "Select font family", fontNameInherit: "(inherited font)", fontSize: "Select font size", fontSizeInherit: "(inherited size)", formatBlock: "Format", formatting: "Format", foreColor: "Color", backColor: "Background color", style: "Styles", emptyFolder: "Empty Folder", editAreaTitle: "Editable area. Press F10 for toolbar.", uploadFile: "Upload", orderBy: "Arrange by:", orderBySize: "Size", orderByName: "Name", invalidFileType: 'The selected file "{0}" is not valid. Supported file types are {1}.', deleteFile: 'Are you sure you want to delete "{0}"?', overwriteFile: 'A file with name "{0}" already exists in the current directory. Do you want to overwrite it?', directoryNotFound: "A directory with this name was not found.", imageWebAddress: "Web address", imageAltText: "Alternate text", imageWidth: "Width (px)", imageHeight: "Height (px)", fileWebAddress: "Web address", fileTitle: "Title", linkWebAddress: "Web address", linkText: "Text", linkToolTip: "ToolTip", linkOpenInNewWindow: "Open link in new window", dialogUpdate: "Update", dialogInsert: "Insert", dialogCancel: "Cancel", createTable: "Create table", createTableHint: "Create a {0} x {1} table", addColumnLeft: "Add column on the left", addColumnRight: "Add column on the right", addRowAbove: "Add row above", addRowBelow: "Add row below", deleteRow: "Delete row", deleteColumn: "Delete column" }, w = !c || c.ios && c.flatVersion >= 500 || !c.ios && t !== document.documentElement.contentEditable, b = { basic: ["bold", "italic", "underline"], alignment: ["justifyLeft", "justifyCenter", "justifyRight"], lists: ["insertUnorderedList", "insertOrderedList"], indenting: ["indent", "outdent"], links: ["createLink", "unlink"], tables: ["createTable", "addColumnLeft", "addColumnRight", "addRowAbove", "addRowBelow", "deleteRow", "deleteColumn"] }, y = l.extend({ init: function(t, n) { var i, r, o, s, c, d = this, g = a.ui.editor, m = g.Dom; w && (l.fn.init.call(d, t, n), d.options = p({}, d.options, n), t = d.element, c = t[0], s = m.name(c), t.closest("form").on("submit" + f, function() { d.update() }), o = u({}, d.options), o.editor = d, "textarea" == s ? (d._wrapTextarea(), r = d.wrapper.find(".k-editor-toolbar"), c.id && r.attr("aria-controls", c.id)) : (d.element.attr("contenteditable", !0).addClass("k-widget k-editor k-editor-inline"), o.popup = !0, r = e('<ul class="k-editor-toolbar" role="toolbar" />').insertBefore(t)), d.toolbar = new g.Toolbar(r[0], o), d.toolbar.bindTo(d), "textarea" == s && setTimeout(function() { var e = d.wrapper[0].style.height, t = parseInt(e, 10), n = d.wrapper.height(); e.indexOf("px") > 0 && !isNaN(t) && n > t && d.wrapper.height(t - (n - t)) }), d._resizable(), d._initializeContentElement(d), d.keyboard = new g.Keyboard([new g.BackspaceHandler(d), new g.TypingHandler(d), new g.SystemHandler(d)]), d.clipboard = new g.Clipboard(this), d.undoRedoStack = new g.UndoRedoStack, n && n.value ? i = n.value : d.textarea ? (i = c.value, d.options.encoded && e.trim(c.defaultValue).length && (i = c.defaultValue), i = i.replace(/[\r\n\v\f\t ]+/gi, " ")) : i = c.innerHTML, d.value(i), e(document).on("mousedown", h(d._endTyping, d)).on("mouseup", h(d._mouseup, d)), d.toolbar.resize(), a.notify(d)) }, _endTyping: function() { var e = this.keyboard; try { e.isTypingInProgress() && (e.endTyping(!0), this.saveSelection()) } catch (t) {} }, _selectionChange: function() { d.msie || a.ui.editor.Dom.ensureTrailingBreaks(this.body), this._selectionStarted = !1, this.saveSelection(), this.trigger("select", {}) }, _resizable: function() { var n = this.options.resizable, i = e.isPlainObject(n) ? n.content === t || n.content === !0 : n; i && this.textarea && (e("<div class='k-resize-handle'><span class='k-icon k-resize-se' /></div>").insertAfter(this.textarea), this.wrapper.kendoResizable(u({}, this.options.resizable, { start: function(t) { var n = this.editor = e(t.currentTarget).closest(".k-editor"); this.initialSize = n.height(), n.find("td:last").append("<div class='k-overlay' />") }, resize: function(e) { var t = e.y.initialDelta, n = this.initialSize + t, i = this.options.min || 0, r = this.options.max || 1 / 0; n = Math.min(r, Math.max(i, n)), this.editor.height(n) }, resizeend: function() { this.editor.find(".k-overlay").remove(), this.editor = null } }))) }, _wrapTextarea: function() { var t = this, n = t.element, i = n[0].style.width, r = n[0].style.height, o = v.editorWrapperTemplate, a = e(o).insertBefore(n).width(i).height(r), s = a.find(".k-editable-area"); n.attr("autocomplete", "off").appendTo(s).addClass("k-content k-raw-content").css("display", "none"), t.textarea = n, t.wrapper = a }, _createContentElement: function(t) { var n, i, r, o = this, s = o.textarea, l = o.options.domain, c = l || document.domain, d = "", u = 'javascript:""'; return (l || c != location.hostname) && (d = '<script>document.domain="' + c + '"</script>', u = "javascript:document.write('" + d + "')"), s.hide(), n = e("<iframe />", { title: o.options.messages.editAreaTitle, frameBorder: "0" })[0], e(n).css("display", "").addClass("k-content").insertBefore(s), n.src = u, i = n.contentWindow || n, r = i.document || n.contentDocument, e(n).one("load", function() { o.toolbar.decorateFrom(r.body) }), r.open(), r.write("<!DOCTYPE html><html><head><meta charset='utf-8' /><style>html,body{padding:0;margin:0;height:100%;min-height:100%;}body{font-size:12px;font-family:Verdana,Geneva,sans-serif;padding-top:1px;margin-top:-1px;word-wrap: break-word;-webkit-nbsp-mode: space;-webkit-line-break: after-white-space;" + (a.support.isRtl(s) ? "direction:rtl;" : "") + "}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em}h3{font-size:1.16em}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.7em}p{margin:0 0 1em;padding:0 .2em}.k-marker{display:none;}.k-paste-container,.Apple-style-span{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}ul,ol{padding-left:2.5em}span{-ms-high-contrast-adjust:none;}a{color:#00a}code{font-size:1.23em}telerik\\3Ascript{display: none;}.k-table{table-layout:fixed;width:100%;border-spacing:0;margin: 0 0 1em;}.k-table td{min-width:1px;padding:.2em .3em;}.k-table,.k-table td{outline:0;border: 1px dotted #ccc;}.k-table p{margin:0;padding:0;}</style>" + d + "<script>(function(d,c){d[c]('header'),d[c]('article'),d[c]('nav'),d[c]('section'),d[c]('footer');})(document, 'createElement');</script>" + e.map(t, function(e) { return "<link rel='stylesheet' href='" + e + "'>" }).join("") + "</head><body autocorrect='off' contenteditable='true'></body></html>"), r.close(), i }, _blur: function() { var e = this.textarea, t = e ? e.val() : this._oldValue, n = this.options.encoded ? this.encodedValue() : this.value(); this.update(), e && e.trigger("blur"), n != t && this.trigger("change") }, _spellCorrect: function(n) { var i, r = !1; e(n.body).on("contextmenu" + f, function() { n.one("select", function() { i = null }), n._spellCorrectTimeout = setTimeout(function() { i = new a.ui.editor.RestorePoint(n.getRange()), r = !1 }, 10) }).on("input" + f, function() { return i ? a.support.browser.mozilla && !r ? (r = !0, t) : (a.ui.editor._finishUpdate(n, i), t) : t }) }, _initializeContentElement: function() { var n, i, r = this; r.textarea ? (r.window = r._createContentElement(r.options.stylesheets), n = r.document = r.window.contentDocument || r.window.document, r.body = n.body, i = r.window, e(n).on("mouseup" + f, h(r._mouseup, r))) : (r.window = window, n = r.document = document, r.body = r.element[0], i = r.body, r.toolbar.decorateFrom(r.body)), e(i).on("blur" + f, h(this._blur, this)); try { n.execCommand("enableInlineTableEditing", null, !1) } catch (o) {} a.support.touch && e(n).on("selectionchange" + f, h(this._selectionChange, this)).on("keydown" + f, function() { a._activeElement() != n.body && r.window.focus() }), this._spellCorrect(r), e(r.body).on("dragstart" + f, !1).on("keydown" + f, function(e) { var n, i, o, a, s, l; return e.keyCode !== g.BACKSPACE && e.keyCode !== g.DELETE || "true" === r.body.getAttribute("contenteditable") ? e.keyCode === g.F10 ? (setTimeout(h(r.toolbar.focus, r.toolbar), 100), e.preventDefault(), t) : ((e.keyCode == g.LEFT || e.keyCode == g.RIGHT) && (n = r.getRange(), i = e.keyCode == g.LEFT, o = n[i ? "startContainer" : "endContainer"], a = n[i ? "startOffset" : "endOffset"], s = i ? -1 : 1, i && (a -= 1), a + s > 0 && 3 == o.nodeType && "" == o.nodeValue[a] && (n.setStart(o, a + s), n.collapse(!0), r.selectRange(n))), (l = r.keyboard.toolFromShortcut(r.toolbar.tools, e)) ? (e.preventDefault(), /^(undo|redo)$/.test(l) || r.keyboard.endTyping(!0), r.trigger("keydown", e), r.exec(l), !1) : (r.keyboard.clearTimeout(), r.keyboard.keydown(e), t)) : !1 }).on("keyup" + f, function(t) { var n = [8, 9, 33, 34, 35, 36, 37, 38, 39, 40, 40, 45, 46]; (e.inArray(t.keyCode, n) > -1 || 65 == t.keyCode && t.ctrlKey && !t.altKey && !t.shiftKey) && r._selectionChange(), r.keyboard.keyup(t) }).on("mousedown" + f, function(t) { if (r._selectionStarted = !0, !d.gecko) { var n = e(t.target); (2 == t.which || 1 == t.which && t.ctrlKey) && n.is("a[href]") && window.open(n.attr("href"), "_new") } }).on("click" + f, function(e) { var t, n = a.ui.editor.Dom; "img" === n.name(e.target) && (t = r.createRange(), t.selectNode(e.target), r.selectRange(t)) }).on("cut" + f + " paste" + f, function(e) { r.clipboard["on" + e.type](e) }).on("focusin" + f, function() { e(this).addClass("k-state-active"), r.toolbar.show() }).on("focusout" + f, function() { setTimeout(function() { var t = a._activeElement(), n = r.body, i = r.toolbar; t == n || e.contains(n, t) || e(t).is(".k-editortoolbar-dragHandle") || i.focused() || (e(n).removeClass("k-state-active"), i.hide()) }, 10) }) }, _mouseup: function() { var e = this; e._selectionStarted && setTimeout(function() { e._selectionChange() }, 1) }, refresh: function() { var e = this; e.textarea && (e.textarea.val(e.value()), e.wrapper.find("iframe").remove(), e._initializeContentElement(e), e.value(e.textarea.val())) }, events: ["select", "change", "execute", "error", "paste", "keydown", "keyup"], options: { name: "Editor", messages: _, formats: {}, encoded: !0, domain: null, resizable: !1, serialization: { entities: !0, semantic: !0, scripts: !1 }, stylesheets: [], dialogOptions: { modal: !0, resizable: !1, draggable: !0, animation: !1 }, fontName: [{ text: "Arial", value: "Arial,Helvetica,sans-serif" }, { text: "Courier New", value: "'Courier New',Courier,monospace" }, { text: "Georgia", value: "Georgia,serif" }, { text: "Impact", value: "Impact,Charcoal,sans-serif" }, { text: "Lucida Console", value: "'Lucida Console',Monaco,monospace" }, { text: "Tahoma", value: "Tahoma,Geneva,sans-serif" }, { text: "Times New Roman", value: "'Times New Roman',Times,serif" }, { text: "Trebuchet MS", value: "'Trebuchet MS',Helvetica,sans-serif" }, { text: "Verdana", value: "Verdana,Geneva,sans-serif" }], fontSize: [{ text: "1 (8pt)", value: "xx-small" }, { text: "2 (10pt)", value: "x-small" }, { text: "3 (12pt)", value: "small" }, { text: "4 (14pt)", value: "medium" }, { text: "5 (18pt)", value: "large" }, { text: "6 (24pt)", value: "x-large" }, { text: "7 (36pt)", value: "xx-large" }], formatBlock: [{ text: "Paragraph", value: "p" }, { text: "Quotation", value: "blockquote" }, { text: "Heading 1", value: "h1" }, { text: "Heading 2", value: "h2" }, { text: "Heading 3", value: "h3" }, { text: "Heading 4", value: "h4" }, { text: "Heading 5", value: "h5" }, { text: "Heading 6", value: "h6" }], tools: [].concat.call(["formatting"], b.basic, b.alignment, b.lists, b.indenting, b.links, ["insertImage"], b.tables) }, destroy: function() { var t = this; l.fn.destroy.call(t), e(t.window).add(t.document).add(t.body).add(t.wrapper).add(t.element.closest("form")).off(f), e(document).off("mousedown", h(t._endTyping, t)).off("mouseup", h(t._mouseup, t)), clearTimeout(this._spellCorrectTimeout), t._focusOutside(), t.toolbar.destroy(), a.destroy(t.wrapper) }, _focusOutside: function() { if (a.support.browser.msie && this.textarea) { var t = e("<input style='position:absolute;left:-10px;top:-10px;width:1px;height:1px;font-size:0;border:0;' />").appendTo(document.body).focus(); t.blur().remove() } }, state: function(e) { var t, n, i = y.defaultTools[e], r = i && (i.options.finder || i.finder), o = a.ui.editor.RangeUtils; return r ? (t = this.getRange(), n = o.textNodes(t), !n.length && t.collapsed && (n = [t.startContainer]), r.getFormat ? r.getFormat(n) : r.isFormatted(n)) : !1 }, value: function(e) { var n = this.body, i = a.ui.editor, r = i.Serializer.domToXhtml(n, this.options.serialization); return e === t ? r : (e != r && (i.Serializer.htmlToDom(e, n), d.msie || a.ui.editor.Dom.ensureTrailingBreaks(this.body), this.selectionRestorePoint = null, this.update(), this.toolbar.refreshTools()), t) }, saveSelection: function(t) { t = t || this.getRange(); var n = t.commonAncestorContainer, i = this.body; (n == i || e.contains(i, n)) && (this.selectionRestorePoint = new a.ui.editor.RestorePoint(t)) }, _focusBody: function() { var e, t = this.body, n = this.wrapper && this.wrapper.find("iframe")[0], i = this.document.documentElement, r = a._activeElement(); r != t && r != n && (e = i.scrollTop, t.focus(), i.scrollTop = e) }, restoreSelection: function() { this._focusBody(), this.selectionRestorePoint && this.selectRange(this.selectionRestorePoint.toRange()) }, focus: function() { this.restoreSelection() }, update: function(e) { e = e || this.options.encoded ? this.encodedValue() : this.value(), this.textarea ? this.textarea.val(e) : this._oldValue = e }, encodedValue: function() { return a.ui.editor.Dom.encode(this.value()) }, createRange: function(e) { return a.ui.editor.RangeUtils.createRange(e || this.document) }, getSelection: function() { return a.ui.editor.SelectionUtils.selectionFromDocument(this.document) }, selectRange: function(e) { this._focusBody(); var t = this.getSelection(); t.removeAllRanges(), t.addRange(e), this.saveSelection(e) }, getRange: function() { var e = this.getSelection(), t = e && e.rangeCount > 0 ? e.getRangeAt(0) : this.createRange(), n = this.document; return t.startContainer != n || t.endContainer != n || t.startOffset || t.endOffset || (t.setStart(this.body, 0), t.collapse(!0)), t }, selectedHtml: function() { return a.ui.editor.Serializer.domToXhtml(this.getRange().cloneContents()) }, paste: function(t, n) { var i = new a.ui.editor.InsertHtmlCommand(e.extend({ range: this.getRange(), html: t }, n)); i.editor = this, i.exec() }, exec: function(e, n) { var i, r, o, a, s = this, l = null; if (!e) throw Error("kendoEditor.exec(): `name` parameter cannot be empty"); if ("true" !== s.body.getAttribute("contenteditable")) return !1; if (e = e.toLowerCase(), s.keyboard.isTypingInProgress() || s.restoreSelection(), r = s.toolbar.toolById(e), !r) for (a in y.defaultTools) if (a.toLowerCase() == e) { r = y.defaultTools[a]; break } if (r) { if (i = s.getRange(), r.command && (l = r.command(u({ range: i }, n))), o = s.trigger("execute", { name: e, command: l })) return; if (/^(undo|redo)$/i.test(e)) s.undoRedoStack[e](); else if (l && (l.managesUndoRedo || s.undoRedoStack.push(l), l.editor = s, l.exec(), l.async)) return l.change = h(s._selectionChange, s), t; s._selectionChange() } } }); y.defaultTools = { undo: { options: { key: "Z", ctrl: !0 } }, redo: { options: { key: "Y", ctrl: !0 } } }, a.ui.plugin(y), n = s.extend({ init: function(e) { this.options = e }, initialize: function(e, t) { e.attr({ unselectable: "on", title: t.title }) }, command: function(e) { return new this.options.command(e) }, update: e.noop }), n.exec = function(e, t, n) { e.exec(t, { value: n }) }, i = n.extend({ init: function(e) { n.fn.init.call(this, e) }, command: function(e) { var t = this; return new a.ui.editor.FormatCommand(u(e, { formatter: t.options.formatter })) }, update: function(e, t) { var n = this.options.finder.isFormatted(t); e.toggleClass("k-state-selected", n), e.attr("aria-pressed", n) } }), v.registerTool("separator", new n({ template: new m({ template: v.separatorTemplate }) })), r = d.msie && 9 > d.version ? "" : "", o = '<br class="k-br" />', d.msie && (10 > d.version ? o = "" : 11 > d.version && (o = " ")), u(a.ui, { editor: { ToolTemplate: m, EditorUtils: v, Tool: n, FormatTool: i, _bomFill: r, emptyElementContent: o } }), a.PDFMixin && (a.PDFMixin.extend(y.prototype), y.prototype._drawPDF = function() { return a.drawing.drawDOM(this.body, this.options.pdf) }, y.prototype.saveAsPDF = function() { var t, n, i = new e.Deferred, r = i.promise(), o = { promise: r }; if (!this.trigger("pdfExport", o)) return t = this.options.pdf, n = t.paperSize, this._drawPDF(i).then(function(e) { return t.paperSize = "auto", a.drawing.exportPDF(e, t) }).done(function(e) { a.saveAs({ dataURI: e, fileName: t.fileName, proxyURL: t.proxyURL, forceProxy: t.forceProxy }), t.paperSize = n, i.resolve() }).fail(function(e) { i.reject(e) }), r }) }(window.jQuery), function(e) { function t(e) { var t, n, i = {}; for (t = 0, n = e.length; n > t; t++) i[e[t]] = !0; return i } var n, i, r, o, a, s, l, c, d, u, h = window.kendo, p = e.map, f = e.extend, g = h.support.browser, m = "style", v = "float", _ = "cssFloat", w = "styleFloat", b = "class", y = "k-marker", k = t("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed".split(",")), x = "div,p,h1,h2,h3,h4,h5,h6,address,applet,blockquote,button,center,dd,dir,dl,dt,fieldset,form,frameset,hr,iframe,isindex,map,menu,noframes,noscript,object,pre,script,table,tbody,td,tfoot,th,thead,tr,header,article,nav,footer,section,aside,main,figure,figcaption".split(","), C = x.concat(["ul", "ol", "li"]), S = t(C), T = "span,em,a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,strike,strong,sub,sup,textarea,tt,u,var,data,time,mark,ruby".split(","), D = t(T), A = t("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected".split(",")), E = function(e) { 1 == e.nodeType && e.normalize() }; g.msie && g.version >= 8 && (E = function(e) { if (1 == e.nodeType && e.firstChild) for (var t = e.firstChild, n = t;;) { if (n = n.nextSibling, !n) break; 3 == n.nodeType && 3 == t.nodeType && (n.nodeValue = t.nodeValue + n.nodeValue, u.remove(t)), t = n } }), n = /^\s+$/, i = /rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i, r = /\ufeff/g, o = /^(\s+|\ufeff)$/, s = "color,padding-left,padding-right,padding-top,padding-bottom,background-color,background-attachment,background-image,background-position,background-repeat,border-top-style,border-top-width,border-top-color,border-bottom-style,border-bottom-width,border-bottom-color,border-left-style,border-left-width,border-left-color,border-right-style,border-right-width,border-right-color,font-family,font-size,font-style,font-variant,font-weight,line-height".split(","), l = /[<>\&]/g, c = /[\u00A0-\u2666<>\&]/g, d = { 34: "quot", 38: "amp", 39: "apos", 60: "lt", 62: "gt", 160: "nbsp", 161: "iexcl", 162: "cent", 163: "pound", 164: "curren", 165: "yen", 166: "brvbar", 167: "sect", 168: "uml", 169: "copy", 170: "ordf", 171: "laquo", 172: "not", 173: "shy", 174: "reg", 175: "macr", 176: "deg", 177: "plusmn", 178: "sup2", 179: "sup3", 180: "acute", 181: "micro", 182: "para", 183: "middot", 184: "cedil", 185: "sup1", 186: "ordm", 187: "raquo", 188: "frac14", 189: "frac12", 190: "frac34", 191: "iquest", 192: "Agrave", 193: "Aacute", 194: "Acirc", 195: "Atilde", 196: "Auml", 197: "Aring", 198: "AElig", 199: "Ccedil", 200: "Egrave", 201: "Eacute", 202: "Ecirc", 203: "Euml", 204: "Igrave", 205: "Iacute", 206: "Icirc", 207: "Iuml", 208: "ETH", 209: "Ntilde", 210: "Ograve", 211: "Oacute", 212: "Ocirc", 213: "Otilde", 214: "Ouml", 215: "times", 216: "Oslash", 217: "Ugrave", 218: "Uacute", 219: "Ucirc", 220: "Uuml", 221: "Yacute", 222: "THORN", 223: "szlig", 224: "agrave", 225: "aacute", 226: "acirc", 227: "atilde", 228: "auml", 229: "aring", 230: "aelig", 231: "ccedil", 232: "egrave", 233: "eacute", 234: "ecirc", 235: "euml", 236: "igrave", 237: "iacute", 238: "icirc", 239: "iuml", 240: "eth", 241: "ntilde", 242: "ograve", 243: "oacute", 244: "ocirc", 245: "otilde", 246: "ouml", 247: "divide", 248: "oslash", 249: "ugrave", 250: "uacute", 251: "ucirc", 252: "uuml", 253: "yacute", 254: "thorn", 255: "yuml", 402: "fnof", 913: "Alpha", 914: "Beta", 915: "Gamma", 916: "Delta", 917: "Epsilon", 918: "Zeta", 919: "Eta", 920: "Theta", 921: "Iota", 922: "Kappa", 923: "Lambda", 924: "Mu", 925: "Nu", 926: "Xi", 927: "Omicron", 928: "Pi", 929: "Rho", 931: "Sigma", 932: "Tau", 933: "Upsilon", 934: "Phi", 935: "Chi", 936: "Psi", 937: "Omega", 945: "alpha", 946: "beta", 947: "gamma", 948: "delta", 949: "epsilon", 950: "zeta", 951: "eta", 952: "theta", 953: "iota", 954: "kappa", 955: "lambda", 956: "mu", 957: "nu", 958: "xi", 959: "omicron", 960: "pi", 961: "rho", 962: "sigmaf", 963: "sigma", 964: "tau", 965: "upsilon", 966: "phi", 967: "chi", 968: "psi", 969: "omega", 977: "thetasym", 978: "upsih", 982: "piv", 8226: "bull", 8230: "hellip", 8242: "prime", 8243: "Prime", 8254: "oline", 8260: "frasl", 8472: "weierp", 8465: "image", 8476: "real", 8482: "trade", 8501: "alefsym", 8592: "larr", 8593: "uarr", 8594: "rarr", 8595: "darr", 8596: "harr", 8629: "crarr", 8656: "lArr", 8657: "uArr", 8658: "rArr", 8659: "dArr", 8660: "hArr", 8704: "forall", 8706: "part", 8707: "exist", 8709: "empty", 8711: "nabla", 8712: "isin", 8713: "notin", 8715: "ni", 8719: "prod", 8721: "sum", 8722: "minus", 8727: "lowast", 8730: "radic", 8733: "prop", 8734: "infin", 8736: "ang", 8743: "and", 8744: "or", 8745: "cap", 8746: "cup", 8747: "int", 8756: "there4", 8764: "sim", 8773: "cong", 8776: "asymp", 8800: "ne", 8801: "equiv", 8804: "le", 8805: "ge", 8834: "sub", 8835: "sup", 8836: "nsub", 8838: "sube", 8839: "supe", 8853: "oplus", 8855: "otimes", 8869: "perp", 8901: "sdot", 8968: "lceil", 8969: "rceil", 8970: "lfloor", 8971: "rfloor", 9001: "lang", 9002: "rang", 9674: "loz", 9824: "spades", 9827: "clubs", 9829: "hearts", 9830: "diams", 338: "OElig", 339: "oelig", 352: "Scaron", 353: "scaron", 376: "Yuml", 710: "circ", 732: "tilde", 8194: "ensp", 8195: "emsp", 8201: "thinsp", 8204: "zwnj", 8205: "zwj", 8206: "lrm", 8207: "rlm", 8211: "ndash", 8212: "mdash", 8216: "lsquo", 8217: "rsquo", 8218: "sbquo", 8220: "ldquo", 8221: "rdquo", 8222: "bdquo", 8224: "dagger", 8225: "Dagger", 8240: "permil", 8249: "lsaquo", 8250: "rsaquo", 8364: "euro" }, u = { block: S, inline: D, findNodeIndex: function(e, t) { var n = 0; if (!e) return -1; for (;;) { if (e = e.previousSibling, !e) break; t && 3 == e.nodeType || n++ } return n }, isDataNode: function(e) { return e && null !== e.nodeValue && null !== e.data }, isAncestorOf: function(t, n) { try { return !u.isDataNode(t) && (e.contains(t, u.isDataNode(n) ? n.parentNode : n) || n.parentNode == t) } catch (i) { return !1 } }, isAncestorOrSelf: function(e, t) { return u.isAncestorOf(e, t) || e == t }, findClosestAncestor: function(e, t) { if (u.isAncestorOf(e, t)) for (; t && t.parentNode != e;) t = t.parentNode; return t }, getNodeLength: function(e) { return u.isDataNode(e) ? e.length : e.childNodes.length }, splitDataNode: function(e, t) { for (var n, i = e.cloneNode(!1), r = "", o = e.nextSibling; o && 3 == o.nodeType && o.nodeValue;) r += o.nodeValue, n = o, o = o.nextSibling, u.remove(n); e.deleteData(t, e.length), i.deleteData(0, t), i.nodeValue += r, u.insertAfter(i, e) }, attrEquals: function(e, t) { var n, i; for (n in t) if (i = e[n], n == v && (i = e[h.support.cssFloat ? _ : w]), "object" == typeof i) { if (!u.attrEquals(i, t[n])) return !1 } else if (i != t[n]) return !1; return !0 }, blockParentOrBody: function(e) { return u.parentOfType(e, C) || e.ownerDocument.body }, blockParents: function(t) { var n, i, r, o = []; for (n = 0, i = t.length; i > n; n++) r = u.parentOfType(t[n], u.blockElements), r && e.inArray(r, o) < 0 && o.push(r); return o }, windowFromDocument: function(e) { return e.defaultView || e.parentWindow }, normalize: E, blockElements: C, nonListBlockElements: x, inlineElements: T, empty: k, fillAttrs: A, toHex: function(e) { var t = i.exec(e); return t ? "#" + p(t.slice(1), function(e) { return e = parseInt(e, 10).toString(16), e.length > 1 ? e : "0" + e }).join("") : e }, encode: function(e, t) { var n = !t || t.entities ? c : l; return e.replace(n, function(e) { var t = e.charCodeAt(0), n = d[t]; return n ? "&" + n + ";" : e }) }, stripBom: function(e) { return (e || "").replace(r, "") }, insignificant: function(e) { var t = e.attributes; return "k-marker" == e.className || u.is(e, "br") && ("k-br" == e.className || t._moz_dirty || t._moz_editor_bogus_node) }, significantNodes: function(t) { return e.grep(t, function(e) { var t = u.name(e); return "br" == t ? !1 : u.insignificant(e) ? !1 : 3 == e.nodeType && o.test(e.nodeValue) ? !1 : 1 == e.nodeType && !k[t] && u.emptyNode(e) ? !1 : !0 }) }, emptyNode: function(e) { return !u.significantNodes(e.childNodes).length }, name: function(e) { return e.nodeName.toLowerCase() }, significantChildNodes: function(t) { return e.grep(t.childNodes, function(e) { return 3 != e.nodeType || !u.isWhitespace(e) }) }, lastTextNode: function(e) { var t, n = null; if (3 == e.nodeType) return e; for (t = e.lastChild; t; t = t.previousSibling) if (n = u.lastTextNode(t)) return n; return n }, is: function(e, t) { return u.name(e) == t }, isMarker: function(e) { return e.className == y }, isWhitespace: function(e) { return n.test(e.nodeValue) }, isBlock: function(e) { return S[u.name(e)] }, isEmpty: function(e) { return k[u.name(e)] }, isInline: function(e) { return D[u.name(e)] }, scrollContainer: function(e) { var t = u.windowFromDocument(e), n = (t.contentWindow || t).document || t.ownerDocument || t; return n = h.support.browser.webkit || "BackCompat" == n.compatMode ? n.body : n.documentElement }, scrollTo: function(t) { var n, i, r = e(u.isDataNode(t) ? t.parentNode : t), o = u.windowFromDocument(t.ownerDocument), a = o.innerHeight, s = u.scrollContainer(t.ownerDocument); n = r.offset().top, i = r[0].offsetHeight, i || (i = parseInt(r.css("line-height"), 10) || Math.ceil(1.2 * parseInt(r.css("font-size"), 10)) || 15), i + n > s.scrollTop + a && (s.scrollTop = i + n - a) }, persistScrollTop: function(e) { a = u.scrollContainer(e).scrollTop }, restoreScrollTop: function(e) { u.scrollContainer(e).scrollTop = a }, insertAt: function(e, t, n) { e.insertBefore(t, e.childNodes[n] || null) }, insertBefore: function(e, t) { return t.parentNode ? t.parentNode.insertBefore(e, t) : t }, insertAfter: function(e, t) { return t.parentNode.insertBefore(e, t.nextSibling) }, remove: function(e) { e.parentNode.removeChild(e) }, removeTextSiblings: function(e) { for (var t = e.parentNode; e.nextSibling && 3 == e.nextSibling.nodeType;) t.removeChild(e.nextSibling); for (; e.previousSibling && 3 == e.previousSibling.nodeType;) t.removeChild(e.previousSibling) }, trim: function(e) { var t, n; for (t = e.childNodes.length - 1; t >= 0; t--) n = e.childNodes[t], u.isDataNode(n) ? (u.stripBom(n.nodeValue).length || u.remove(n), u.isWhitespace(n) && u.insertBefore(n, e)) : n.className != y && (u.trim(n), n.childNodes.length || u.isEmpty(n) || u.remove(n)); return e }, closest: function(e, t) { for (; e && u.name(e) != t;) e = e.parentNode; return e }, sibling: function(e, t) { do e = e[t]; while (e && 1 != e.nodeType); return e }, next: function(e) { return u.sibling(e, "nextSibling") }, prev: function(e) { return u.sibling(e, "previousSibling") }, parentOfType: function(e, t) { do e = e.parentNode; while (e && !u.ofType(e, t)); return e }, ofType: function(t, n) { return e.inArray(u.name(t), n) >= 0 }, changeTag: function(e, t, n) { var i, r, o, a, s, l = u.create(e.ownerDocument, t), c = e.attributes; if (!n) for (i = 0, r = c.length; r > i; i++) s = c[i], s.specified && (o = s.nodeName, a = s.nodeValue, o == b ? l.className = a : o == m ? l.style.cssText = e.style.cssText : l.setAttribute(o, a)); for (; e.firstChild;) l.appendChild(e.firstChild); return u.insertBefore(l, e), u.remove(e), l }, editableParent: function(e) { for (; e && (3 == e.nodeType || "true" !== e.contentEditable);) e = e.parentNode; return e }, wrap: function(e, t) { return u.insertBefore(t, e), t.appendChild(e), t }, unwrap: function(e) { for (var t = e.parentNode; e.firstChild;) t.insertBefore(e.firstChild, e); t.removeChild(e) }, create: function(e, t, n) { return u.attr(e.createElement(t), n) }, attr: function(e, t) { t = f({}, t), t && m in t && (u.style(e, t.style), delete t.style); for (var n in t) null === t[n] ? (e.removeAttribute(n), delete t[n]) : "className" == n && (e[n] = t[n]); return f(e, t) }, style: function(t, n) { e(t).css(n || {}) }, unstyle: function(e, t) { for (var n in t) n == v && (n = h.support.cssFloat ? _ : w), e.style[n] = ""; "" === e.style.cssText && e.removeAttribute(m) }, inlineStyle: function(t, n, i) { var r, o = e(u.create(t.ownerDocument, n, i)); return t.appendChild(o[0]), r = p(s, function(e) { return g.msie && "line-height" == e && "1px" == o.css(e) ? "line-height:1.5" : e + ":" + o.css(e) }).join(";"), o.remove(), r }, getEffectiveBackground: function(e) { var t = e.css("background-color"); return t.indexOf("rgba(0, 0, 0, 0") < 0 && "transparent" !== t ? t : "html" === e[0].tagName.toLowerCase() ? "Window" : u.getEffectiveBackground(e.parent()) }, removeClass: function(t, n) { var i, r, o = " " + t.className + " ", a = n.split(" "); for (i = 0, r = a.length; r > i; i++) o = o.replace(" " + a[i] + " ", " "); o = e.trim(o), o.length ? t.className = o : t.removeAttribute(b) }, commonAncestor: function() { var e, t, n, i, r, o = arguments.length, a = [], s = 1 / 0, l = null; if (!o) return null; if (1 == o) return arguments[0]; for (e = 0; o > e; e++) { for (t = [], n = arguments[e]; n;) t.push(n), n = n.parentNode; a.push(t.reverse()), s = Math.min(s, t.length) } if (1 == o) return a[0][0]; for (e = 0; s > e; e++) { for (i = a[0][e], r = 1; o > r; r++) if (i != a[r][e]) return l; l = i } return l }, closestSplittableParent: function(t) { var n, i, r; return n = 1 == t.length ? u.parentOfType(t[0], ["ul", "ol"]) : u.commonAncestor.apply(null, t), n || (n = u.parentOfType(t[0], ["p", "td"]) || t[0].ownerDocument.body), u.isInline(n) && (n = u.blockParentOrBody(n)), i = p(t, u.editableParent), r = u.commonAncestor(i)[0], e.contains(n, r) && (n = r), n }, closestEditable: function(t, n) { var i, r = u.editableParent(t); return i = u.ofType(t, n) ? t : u.parentOfType(t, n), i && r && e.contains(i, r) ? i = r : !i && r && (i = r), i }, closestEditableOfType: function(e, t) { var n = u.closestEditable(e, t); return n && u.ofType(n, t) ? n : void 0 }, filter: function(e, t, n) { for (var i, r = 0, o = t.length, a = []; o > r; r++) i = u.name(t[r]), (!n && i == e || n && i != e) && a.push(t[r]); return a }, ensureTrailingBreaks: function(t) { var n = e(t).find("p,td,th"), i = n.length, r = 0; if (i) for (; i > r; r++) u.ensureTrailingBreak(n[r]); else u.ensureTrailingBreak(t) }, removeTrailingBreak: function(t) { e(t).find("br[type=_moz],.k-br").remove() }, ensureTrailingBreak: function(e) { var t, n, i; u.removeTrailingBreak(e), t = e.lastChild, n = t && u.name(t), (!n || "br" != n && "img" != n || "br" == n && "k-br" != t.className) && (i = e.ownerDocument.createElement("br"), i.className = "k-br", e.appendChild(i)) } }, h.ui.editor.Dom = u }(window.kendo.jQuery), function(e, t) { var n, i, r = window.kendo, o = r.ui.editor, a = o.Dom, s = e.extend, l = "xx-small,x-small,small,medium,large,x-large,xx-large".split(","), c = /"/g, d = /<br[^>]*>/i, u = /^\d+(\.\d*)?(px)?$/i, h = /<p><\/p>/i, p = /([\w|\-]+)\s*:\s*([^;]+);?/i, f = /^sizzle-\d+/i, g = /^k-script-/i, m = /\s*onerror\s*=\s*(?:'|")?([^'">\s]*)(?:'|")?/i, v = document.createElement("div"); v.innerHTML = " <hr>", n = 3 === v.firstChild.nodeType, v = null, i = { toEditableHtml: function(e) { var t = '<br class="k-br">'; return e = e || "", e.replace(/<!\[CDATA\[(.*)?\]\]>/g, "<!--[CDATA[$1]]-->").replace(/<script([^>]*)>(.*)?<\/script>/gi, "<k:script$1>$2</k:script>").replace(/<img([^>]*)>/gi, function(e) { return e.replace(m, "") }).replace(/(<\/?img[^>]*>)[\r\n\v\f\t ]+/gi, "$1").replace(/^<(table|blockquote)/i, t + "<$1").replace(/^[\s]*( |\u00a0)/i, "$1").replace(/<\/(table|blockquote)>$/i, "</$1>" + t) }, _fillEmptyElements: function(t) { e(t).find("p").each(function() { var t, n = e(this); if (/^\s*$/g.test(n.text()) && !n.find("img,input").length) { for (t = this; t.firstChild && 3 != t.firstChild.nodeType;) t = t.firstChild; 1 != t.nodeType || a.empty[a.name(t)] || (t.innerHTML = r.ui.editor.emptyElementContent) } }) }, _removeSystemElements: function(t) { e(".k-paste-container", t).remove() }, _resetOrderedLists: function(e) { var t, n, i, r = e.getElementsByTagName("ol"); for (t = 0; r.length > t; t++) n = r[t], i = n.getAttribute("start"), n.setAttribute("start", 1), i ? n.setAttribute("start", i) : n.removeAttribute(i) }, _preventScriptExecution: function(t) { e(t).find("*").each(function() { var e, t, n, i, r = this.attributes; for (t = 0, n = r.length; n > t; t++) e = r[t], i = e.nodeName, e.specified && /^on/i.test(i) && (this.setAttribute("k-script-" + i, e.value), this.removeAttribute(i)) }) }, htmlToDom: function(t, n) { var o, s, l = r.support.browser, c = l.msie, d = c && 9 > l.version; return t = i.toEditableHtml(t), d && (t = "<br/>" + t, o = "originalsrc", s = "originalhref", t = t.replace(/href\s*=\s*(?:'|")?([^'">\s]*)(?:'|")?/, s + '="$1"'), t = t.replace(/src\s*=\s*(?:'|")?([^'">\s]*)(?:'|")?/, o + '="$1"')), n.innerHTML = t, d ? (a.remove(n.firstChild), e(n).find("k\\:script,script,link,img,a").each(function() { var e = this; e[s] && (e.setAttribute("href", e[s]), e.removeAttribute(s)), e[o] && (e.setAttribute("src", e[o]), e.removeAttribute(o)) })) : c && (a.normalize(n), i._resetOrderedLists(n)), i._preventScriptExecution(n), i._fillEmptyElements(n), i._removeSystemElements(n), e("table", n).addClass("k-table"), n }, domToXhtml: function(i, o) { function s(t) { return e.grep(t, function(e) { return "style" != e.name }) } function m(t) { var n, i, r, o, s, l = e.trim, d = l(t).split(";"), u = []; for (o = 0, s = d.length; s > o; o++) d[o].length && (n = p.exec(d[o]), n && (i = l(n[1].toLowerCase()), r = l(n[2]), "font-size-adjust" != i && "font-stretch" != i && (i.indexOf("color") >= 0 ? r = a.toHex(r) : i.indexOf("font") >= 0 ? r = r.replace(c, "'") : /\burl\(/g.test(r) && (r = r.replace(c, "")), u.push({ property: i, value: r })))); return u } function v(e) { var t, n = m(e); for (t = 0; n.length > t; t++) C.push(n[t].property), C.push(":"), C.push(n[t].value), C.push(";") } function _(e) { var t, n, i, r, s, l, c = [], d = e.attributes; for (n = 0, i = d.length; i > n; n++) t = d[n], r = t.nodeName, s = t.value, l = t.specified, "value" == r && "value" in e && e.value ? l = !0 : "type" == r && "text" == s ? l = !0 : "class" != r || s ? f.test(r) ? l = !1 : "complete" == r ? l = !1 : "altHtml" == r ? l = !1 : "start" == r && (a.is(e, "ul") || a.is(e, "ol")) ? l = !1 : r.indexOf("_moz") >= 0 ? l = !1 : g.test(r) && (l = !!o.scripts) : l = !1, l && c.push(t); return c } function w(n, i) { var o, s, l, c, d, h, p, f; if (i = i || _(n), a.is(n, "img") && (h = n.style.width, p = n.style.height, f = e(n), h && u.test(h) && (f.attr("width", parseInt(h, 10)), a.unstyle(n, { width: t })), p && u.test(p) && (f.attr("height", parseInt(p, 10)), a.unstyle(n, { height: t }))), i.length) for (i.sort(function(e, t) { return e.nodeName > t.nodeName ? 1 : t.nodeName > e.nodeName ? -1 : 0 }), o = 0, s = i.length; s > o; o++) l = i[o], c = l.nodeName, d = l.value, ("class" != c || "k-table" != d) && (c = c.replace(g, ""), C.push(" "), C.push(c), C.push('="'), "style" == c ? v(d || n.style.cssText) : C.push("src" == c || "href" == c ? r.htmlEncode(n.getAttribute(c, 2)) : a.fillAttrs[c] ? c : d), C.push('"')) } function b(e, t, n) { for (var i = e.firstChild; i; i = i.nextSibling) k(i, t, n) } function y(e) { return e.nodeValue.replace(/\ufeff/g, "") } function k(e, i, r) { var s, l, c, d, u, h = e.nodeType; if (1 == h) { if (s = a.name(e), !s || a.insignificant(e)) return; if (a.isInline(e) && 1 == e.childNodes.length && 3 == e.firstChild.nodeType && !y(e.firstChild)) return; if (!o.scripts && ("script" == s || "k:script" == s)) return; if (l = S[s], l && (t === l.semantic || o.semantic ^ l.semantic)) return l.start(e), b(e, !1, l.skipEncoding), l.end(e), t; C.push("<"), C.push(s), w(e), a.empty[s] ? C.push(" />") : (C.push(">"), b(e, i || a.is(e, "pre")), C.push("</"), C.push(s), C.push(">")) } else 3 == h ? (d = y(e), !i && n && (c = e.parentNode, u = e.previousSibling, u || (u = (a.isInline(c) ? c : e).previousSibling), (!u || "" === u.innerHTML || a.isBlock(u)) && (d = d.replace(/^[\r\n\v\f\t ]+/, "")), d = d.replace(/ +/, " ")), C.push(r ? d : a.encode(d, o))) : 4 == h ? (C.push("<![CDATA["), C.push(e.data), C.push("]]>")) : 8 == h && (e.data.indexOf("[CDATA[") < 0 ? (C.push("<!--"), C.push(e.data), C.push("-->")) : (C.push("<!"), C.push(e.data), C.push(">"))) } function x(e) { var t = e.childNodes.length, n = t && 3 == e.firstChild.nodeType; return n && (1 == t || 2 == t && a.insignificant(e.lastChild)) } var C = [], S = { iframe: { start: function(e) { C.push("<iframe"), w(e), C.push(">") }, end: function() { C.push("</iframe>") } }, "k:script": { start: function(e) { C.push("<script"), w(e), C.push(">") }, end: function() { C.push("</script>") }, skipEncoding: !0 }, span: { semantic: !0, start: function(t) { var n, i, r = t.style, o = _(t), c = s(o); c.length && (C.push("<span"), w(t, c), C.push(">")), "underline" == r.textDecoration && C.push("<u>"), n = [], r.color && n.push('color="' + a.toHex(r.color) + '"'), r.fontFamily && n.push('face="' + r.fontFamily + '"'), r.fontSize && (i = e.inArray(r.fontSize, l), n.push('size="' + i + '"')), n.length && C.push("<font " + n.join(" ") + ">") }, end: function(e) { var t = e.style; (t.color || t.fontFamily || t.fontSize) && C.push("</font>"), "underline" == t.textDecoration && C.push("</u>"), s(_(e)).length && C.push("</span>") } }, strong: { semantic: !0, start: function() { C.push("<b>") }, end: function() { C.push("</b>") } }, em: { semantic: !0, start: function() { C.push("<i>") }, end: function() { C.push("</i>") } }, b: { semantic: !1, start: function() { C.push("<strong>") }, end: function() { C.push("</strong>") } }, i: { semantic: !1, start: function() { C.push("<em>") }, end: function() { C.push("</em>") } }, u: { semantic: !1, start: function() { C.push('<span style="text-decoration:underline;">') }, end: function() { C.push("</span>") } }, font: { semantic: !1, start: function(e) { var t, n, i; C.push('<span style="'), t = e.getAttribute("color"), n = l[e.getAttribute("size")], i = e.getAttribute("face"), t && (C.push("color:"), C.push(a.toHex(t)), C.push(";")), i && (C.push("font-family:"), C.push(i), C.push(";")), n && (C.push("font-size:"), C.push(n), C.push(";")), C.push('">') }, end: function() { C.push("</span>") } } }; return S.script = S["k:script"], o = o || {}, t === o.semantic && (o.semantic = !0), x(i) ? a.encode(y(i.firstChild).replace(/[\r\n\v\f\t ]+/, " "), o) : (b(i), C = C.join(""), "" === C.replace(d, "").replace(h, "") ? "" : C) } }, s(o, { Serializer: i }) }(window.kendo.jQuery), function(e) { function t(e, t, n, i) { var r, o, a, s; if (e == t) return i - n; for (r = t; r && r.parentNode != e;) r = r.parentNode; if (r) return p(r) - n; for (r = e; r && r.parentNode != t;) r = r.parentNode; if (r) return i - p(r) - 1; for (o = h.commonAncestor(e, t), a = e; a && a.parentNode != o;) a = a.parentNode; for (a || (a = o), s = t; s && s.parentNode != o;) s = s.parentNode; return s || (s = o), a == s ? 0 : p(s) - p(a) } function n(e, n) { function i(e) { try { return t(e.startContainer, e.endContainer, e.startOffset, e.endOffset) < 0 } catch (n) { return !0 } } i(e) && (n ? (e.commonAncestorContainer = e.endContainer = e.startContainer, e.endOffset = e.startOffset) : (e.commonAncestorContainer = e.startContainer = e.endContainer, e.startOffset = e.endOffset), e.collapsed = !0) } function i(e) { e.collapsed = e.startContainer == e.endContainer && e.startOffset == e.endOffset; for (var t = e.startContainer; t && t != e.endContainer && !h.isAncestorOf(t, e.endContainer);) t = t.parentNode; e.commonAncestorContainer = t } function r(e) { var t = e.duplicate(), n = e.duplicate(); return t.collapse(!0), n.collapse(!1), h.commonAncestor(e.parentElement(), t.parentElement(), n.parentElement()) } function o(e, t, n) { var i, r = t[n ? "startContainer" : "endContainer"], o = t[n ? "startOffset" : "endOffset"], a = 0, s = f(r), l = s ? r : r.childNodes[o] || null, c = s ? r.parentNode : r, d = t.ownerDocument, u = d.body.createTextRange(); (3 == r.nodeType || 4 == r.nodeType) && (a = o), c || (c = d.body), "img" == c.nodeName.toLowerCase() ? (u.moveToElementText(c), u.collapse(!1), e.setEndPoint(n ? "StartToStart" : "EndToStart", u)) : (i = c.insertBefore(h.create(d, "a"), l), u.moveToElementText(i), h.remove(i), u[n ? "moveStart" : "moveEnd"]("character", a), u.collapse(!1), e.setEndPoint(n ? "StartToStart" : "EndToStart", u)) } function a(e, t, n, i) { var r, o, a, s, l, c, d, u = h.create(t.ownerDocument, "a"), g = e.duplicate(), m = i ? "StartToStart" : "StartToEnd", v = !1; u.innerHTML = "", g.collapse(i), o = g.parentElement(), h.isAncestorOrSelf(n, o) || (o = n); do v ? o.insertBefore(u, u.previousSibling) : (o.appendChild(u), v = !0), g.moveToElementText(u); while ((r = g.compareEndPoints(m, e)) > 0 && u.previousSibling); a = u.nextSibling, -1 == r && f(a) ? (g.setEndPoint(i ? "EndToStart" : "EndToEnd", e), h.remove(u), c = [a, g.text.length]) : (s = !i && u.previousSibling, l = i && u.nextSibling, f(l) ? c = [l, 0] : f(s) ? c = [s, s.length] : (d = p(u), c = o.nextSibling && d == o.childNodes.length - 1 ? [o.nextSibling, 0] : [o, d]), h.remove(u)), t[i ? "setStart" : "setEnd"].apply(t, c) } var s = window.kendo, l = s.Class, c = e.extend, d = s.ui.editor, u = s.support.browser, h = d.Dom, p = h.findNodeIndex, f = h.isDataNode, g = h.findClosestAncestor, m = h.getNodeLength, v = h.normalize, _ = { selectionFromWindow: function(e) { return "getSelection" in e ? e.getSelection() : new y(e.document) }, selectionFromRange: function(e) { var t = T.documentFromRange(e); return _.selectionFromDocument(t) }, selectionFromDocument: function(e) { return _.selectionFromWindow(h.windowFromDocument(e)) } }, w = l.extend({ init: function(t) { e.extend(this, { ownerDocument: t, startContainer: t, endContainer: t, commonAncestorContainer: t, startOffset: 0, endOffset: 0, collapsed: !0 }) }, setStart: function(e, t) { this.startContainer = e, this.startOffset = t, i(this), n(this, !0) }, setEnd: function(e, t) { this.endContainer = e, this.endOffset = t, i(this), n(this, !1) }, setStartBefore: function(e) { this.setStart(e.parentNode, p(e)) }, setStartAfter: function(e) { this.setStart(e.parentNode, p(e) + 1) }, setEndBefore: function(e) { this.setEnd(e.parentNode, p(e)) }, setEndAfter: function(e) { this.setEnd(e.parentNode, p(e) + 1) }, selectNode: function(e) { this.setStartBefore(e), this.setEndAfter(e) }, selectNodeContents: function(e) { this.setStart(e, 0), this.setEnd(e, e[1 === e.nodeType ? "childNodes" : "nodeValue"].length) }, collapse: function(e) { var t = this; e ? t.setEnd(t.startContainer, t.startOffset) : t.setStart(t.endContainer, t.endOffset) }, deleteContents: function() { var e = this, t = e.cloneRange(); e.startContainer != e.commonAncestorContainer && e.setStartAfter(g(e.commonAncestorContainer, e.startContainer)), e.collapse(!0), function n(e) { for (; e.next();) e.hasPartialSubtree() ? n(e.getSubtreeIterator()) : e.remove() }(new b(t)) }, cloneContents: function() { var e = T.documentFromRange(this); return function t(n) { for (var i, r = e.createDocumentFragment(); i = n.next();) i = i.cloneNode(!n.hasPartialSubtree()), n.hasPartialSubtree() && i.appendChild(t(n.getSubtreeIterator())), r.appendChild(i); return r }(new b(this)) }, extractContents: function() { var e, t = this, n = t.cloneRange(); return t.startContainer != t.commonAncestorContainer && t.setStartAfter(g(t.commonAncestorContainer, t.startContainer)), t.collapse(!0), e = T.documentFromRange(t), function i(n) { for (var r, o = e.createDocumentFragment(); r = n.next();) n.hasPartialSubtree() ? (r = r.cloneNode(!1), r.appendChild(i(n.getSubtreeIterator()))) : n.remove(t.originalRange), o.appendChild(r); return o }(new b(n)) }, insertNode: function(e) { var t = this; f(t.startContainer) ? (t.startOffset != t.startContainer.nodeValue.length && h.splitDataNode(t.startContainer, t.startOffset), h.insertAfter(e, t.startContainer)) : h.insertAt(t.startContainer, e, t.startOffset), t.setStart(t.startContainer, t.startOffset) }, cloneRange: function() { return e.extend(new w(this.ownerDocument), { startContainer: this.startContainer, endContainer: this.endContainer, commonAncestorContainer: this.commonAncestorContainer, startOffset: this.startOffset, endOffset: this.endOffset, collapsed: this.collapsed, originalRange: this }) }, toString: function() { var e = this.startContainer.nodeName, t = this.endContainer.nodeName; return ("#text" == e ? this.startContainer.nodeValue : e) + "(" + this.startOffset + ") : " + ("#text" == t ? this.endContainer.nodeValue : t) + "(" + this.endOffset + ")" } }), b = l.extend({ init: function(t) { if (e.extend(this, { range: t, _current: null, _next: null, _end: null }), !t.collapsed) { var n = t.commonAncestorContainer; this._next = t.startContainer != n || f(t.startContainer) ? g(n, t.startContainer) : t.startContainer.childNodes[t.startOffset], this._end = t.endContainer != n || f(t.endContainer) ? g(n, t.endContainer).nextSibling : t.endContainer.childNodes[t.endOffset] } }, hasNext: function() { return !!this._next }, next: function() { var e = this, t = e._current = e._next; return e._next = e._current && e._current.nextSibling != e._end ? e._current.nextSibling : null, f(e._current) && (e.range.endContainer == e._current && (t = t.cloneNode(!0), t.deleteData(e.range.endOffset, t.length - e.range.endOffset)), e.range.startContainer == e._current && (t = t.cloneNode(!0), t.deleteData(0, e.range.startOffset))), t }, traverse: function(e) { function t() { return i._current = i._next, i._next = i._current && i._current.nextSibling != i._end ? i._current.nextSibling : null, i._current } for (var n, i = this; n = t();) i.hasPartialSubtree() ? i.getSubtreeIterator().traverse(e) : e(n); return n }, remove: function(e) { var t, n, i, r, o, a = this, s = a.range.startContainer == a._current, l = a.range.endContainer == a._current; f(a._current) && (s || l) ? (t = s ? a.range.startOffset : 0, n = l ? a.range.endOffset : a._current.length, i = n - t, e && (s || l) && (a._current == e.startContainer && e.startOffset >= t && (e.startOffset -= i), a._current == e.endContainer && e.endOffset >= n && (e.endOffset -= i)), a._current.deleteData(t, i)) : (r = a._current.parentNode, !e || a.range.startContainer != r && a.range.endContainer != r || (o = p(a._current), r == e.startContainer && e.startOffset >= o && (e.startOffset -= 1), r == e.endContainer && e.endOffset > o && (e.endOffset -= 1)), h.remove(a._current)) }, hasPartialSubtree: function() { return !f(this._current) && (h.isAncestorOrSelf(this._current, this.range.startContainer) || h.isAncestorOrSelf(this._current, this.range.endContainer)) }, getSubtreeIterator: function() { var e = this, t = e.range.cloneRange(); return t.selectNodeContents(e._current), h.isAncestorOrSelf(e._current, e.range.startContainer) && t.setStart(e.range.startContainer, e.range.startOffset), h.isAncestorOrSelf(e._current, e.range.endContainer) && t.setEnd(e.range.endContainer, e.range.endOffset), new b(t) } }), y = l.extend({ init: function(e) { this.ownerDocument = e, this.rangeCount = 1 }, addRange: function(e) { var t = this.ownerDocument.body.createTextRange(); o(t, e, !1), o(t, e, !0), t.select() }, removeAllRanges: function() { var e = this.ownerDocument.selection; "None" != e.type && e.empty() }, getRangeAt: function() { var e, t, n, i, o, s, l, c, d = new w(this.ownerDocument), u = this.ownerDocument.selection; try { if (e = u.createRange(), t = e.item ? e.item(0) : e.parentElement(), t.ownerDocument != this.ownerDocument) return d } catch (h) { return d } if ("Control" == u.type) d.selectNode(e.item(0)); else if (n = r(e), a(e, d, n, !0), a(e, d, n, !1), 9 == d.startContainer.nodeType && d.setStart(d.endContainer, d.startOffset), 9 == d.endContainer.nodeType && d.setEnd(d.startContainer, d.endOffset), 0 === e.compareEndPoints("StartToEnd", e) && d.collapse(!1), i = d.startContainer, o = d.endContainer, s = this.ownerDocument.body, !(d.collapsed || 0 !== d.startOffset || d.endOffset != m(d.endContainer) || i == o && f(i) && i.parentNode == s)) { for (l = !1, c = !1; 0 === p(i) && i == i.parentNode.firstChild && i != s;) i = i.parentNode, l = !0; for (; p(o) == m(o.parentNode) - 1 && o == o.parentNode.lastChild && o != s;) o = o.parentNode, c = !0; i == s && o == s && l && c && (d.setStart(i, 0), d.setEnd(o, m(s))) } return d } }), k = l.extend({ init: function(e) { this.enumerate = function() { function t(e) { if (h.is(e, "img") || 3 == e.nodeType && (!h.isWhitespace(e) || "" == e.nodeValue)) n.push(e); else for (e = e.firstChild; e;) t(e), e = e.nextSibling } var n = []; return new b(e).traverse(t), n } } }), x = l.extend({ init: function(e, t) { var n = this; n.range = e, n.rootNode = T.documentFromRange(e), n.body = t || n.getEditable(e), "body" != h.name(n.body) && (n.rootNode = n.body), n.html = n.body.innerHTML, n.startContainer = n.nodeToPath(e.startContainer), n.endContainer = n.nodeToPath(e.endContainer), n.startOffset = n.offset(e.startContainer, e.startOffset), n.endOffset = n.offset(e.endContainer, e.endOffset) }, index: function(e) { for (var t, n = 0, i = e.nodeType; e = e.previousSibling;) t = e.nodeType, (3 != t || i != t) && n++, i = t; return n }, getEditable: function(e) { for (var t = e.commonAncestorContainer; t && (3 == t.nodeType || t.attributes && !t.attributes.contentEditable);) t = t.parentNode; return t }, restoreHtml: function() { this.body.innerHTML = this.html }, offset: function(e, t) { if (3 == e.nodeType) for (; (e = e.previousSibling) && 3 == e.nodeType;) t += e.nodeValue.length; return t }, nodeToPath: function(e) { for (var t = []; e != this.rootNode;) t.push(this.index(e)), e = e.parentNode; return t }, toRangePoint: function(e, t, n, i) { for (var r = this.rootNode, o = n.length, a = i; o--;) r = r.childNodes[n[o]]; for (; r && 3 == r.nodeType && a > r.nodeValue.length;) a -= r.nodeValue.length, r = r.nextSibling; r && a >= 0 && e[t ? "setStart" : "setEnd"](r, a) }, toRange: function() { var e = this, t = e.range.cloneRange(); return e.toRangePoint(t, !0, e.startContainer, e.startOffset), e.toRangePoint(t, !1, e.endContainer, e.endOffset), t } }), C = l.extend({ init: function() { this.caret = null }, addCaret: function(e) { var t = this; return t.caret = h.create(T.documentFromRange(e), "span", { className: "k-marker" }), e.insertNode(t.caret), e.selectNode(t.caret), t.caret }, removeCaret: function(e) { var t, n, i, r, o = this, a = o.caret.previousSibling, s = 0; a && (s = f(a) ? a.nodeValue.length : p(a)), t = o.caret.parentNode, n = a ? p(a) : 0, h.remove(o.caret), v(t), i = t.childNodes[n], f(i) ? e.setStart(i, s) : i ? (r = h.lastTextNode(i), r ? e.setStart(r, r.nodeValue.length) : e[a ? "setStartAfter" : "setStartBefore"](i)) : (u.msie || t.innerHTML || (t.innerHTML = '<br _moz_dirty="" />'), e.selectNodeContents(t)), e.collapse(!0) }, add: function(e, t) { var n, i, r = this, o = e.collapsed && !T.isExpandable(e), a = T.documentFromRange(e); return t && e.collapsed && (r.addCaret(e), e = T.expand(e)), n = e.cloneRange(), n.collapse(!1), r.end = h.create(a, "span", { className: "k-marker" }), n.insertNode(r.end), n = e.cloneRange(), n.collapse(!0), r.start = r.end.cloneNode(!0), n.insertNode(r.start), r._removeDeadMarkers(r.start, r.end), o && (i = a.createTextNode(""), h.insertAfter(i.cloneNode(), r.start), h.insertBefore(i, r.end)), v(e.commonAncestorContainer), e.setStartBefore(r.start), e.setEndAfter(r.end), e }, _removeDeadMarkers: function(e, t) { e.previousSibling && "" == e.previousSibling.nodeValue && h.remove(e.previousSibling), t.nextSibling && "" == t.nextSibling.nodeValue && h.remove(t.nextSibling) }, _normalizedIndex: function(e) { for (var t = p(e), n = e; n.previousSibling;) 3 == n.nodeType && 3 == n.previousSibling.nodeType && t--, n = n.previousSibling; return t }, remove: function(e) { var t, n, i, r, o, a, s, l, c, d, u, p = this, g = p.start, m = p.end; for (v(e.commonAncestorContainer); !g.nextSibling && g.parentNode;) g = g.parentNode; for (; !m.previousSibling && m.parentNode;) m = m.parentNode; if (t = g.previousSibling && 3 == g.previousSibling.nodeType && g.nextSibling && 3 == g.nextSibling.nodeType, n = m.previousSibling && 3 == m.previousSibling.nodeType && m.nextSibling && 3 == m.nextSibling.nodeType, i = t && n, g = g.nextSibling, m = m.previousSibling, r = !1, o = !1, g == p.end && (o = !!p.start.previousSibling, g = m = p.start.previousSibling || p.end.nextSibling, r = !0), h.remove(p.start), h.remove(p.end), !g || !m) return e.selectNodeContents(e.commonAncestorContainer), void e.collapse(!0); if (a = r ? f(g) ? g.nodeValue.length : g.childNodes.length : 0, s = f(m) ? m.nodeValue.length : m.childNodes.length, 3 == g.nodeType) for (; g.previousSibling && 3 == g.previousSibling.nodeType;) g = g.previousSibling, a += g.nodeValue.length; if (3 == m.nodeType) for (; m.previousSibling && 3 == m.previousSibling.nodeType;) m = m.previousSibling, s += m.nodeValue.length; l = g.parentNode, c = m.parentNode, d = this._normalizedIndex(g), u = this._normalizedIndex(m), v(l), 3 == g.nodeType && (g = l.childNodes[d]), v(c), 3 == m.nodeType && (m = c.childNodes[u]), r ? (3 == g.nodeType ? e.setStart(g, a) : e[o ? "setStartAfter" : "setStartBefore"](g), e.collapse(!0)) : (3 == g.nodeType ? e.setStart(g, a) : e.setStartBefore(g), 3 == m.nodeType ? e.setEnd(m, s) : e.setEndAfter(m)), p.caret && p.removeCaret(e) } }), S = /[\u0009-\u000d]|\u0020|\u00a0|\ufeff|\.|,|;|:|!|\(|\)|\?/, T = { nodes: function(e) { var t = T.textNodes(e); return t.length || (e.selectNodeContents(e.commonAncestorContainer), t = T.textNodes(e), t.length || (t = h.significantChildNodes(e.commonAncestorContainer))), t }, textNodes: function(e) { return new k(e).enumerate() }, documentFromRange: function(e) { var t = e.startContainer; return 9 == t.nodeType ? t : t.ownerDocument }, createRange: function(e) { return u.msie && 9 > u.version ? new w(e) : e.createRange() }, selectRange: function(e) { var t, n = T.image(e); n && (e.setStartAfter(n), e.setEndAfter(n)), t = _.selectionFromRange(e), t.removeAllRanges(), t.addRange(e) }, stringify: function(e) { return s.format("{0}:{1} - {2}:{3}", h.name(e.startContainer), e.startOffset, h.name(e.endContainer), e.endOffset) }, split: function(e, t, n) { function i(i) { var r, o = e.cloneRange(); o.collapse(i), o[i ? "setStartBefore" : "setEndAfter"](t), r = o.extractContents(), n && (r = h.trim(r)), h[i ? "insertBefore" : "insertAfter"](r, t) } i(!0), i(!1) }, mapAll: function(t, n) { var i = []; return new b(t).traverse(function(t) { var r = n(t); r && e.inArray(r, i) < 0 && i.push(r) }), i }, getAll: function(e, t) { var n = t; return "string" == typeof t && (t = function(e) { return h.is(e, n) }), T.mapAll(e, function(e) { return t(e) ? e : void 0 }) }, getMarkers: function(e) { return T.getAll(e, function(e) { return "k-marker" == e.className }) }, image: function(e) { var t = T.getAll(e, "img"); return 1 == t.length ? t[0] : void 0 }, isStartOf: function(e, t) { var n, i; for (e = e.cloneRange(); 0 === e.startOffset && e.startContainer != t;) { for (n = h.findNodeIndex(e.startContainer), i = e.startContainer.parentNode; n > 0 && h.insignificant(i[n - 1]);) n--; e.setStart(i, n) } return 0 === e.startOffset && e.startContainer == t }, isEndOf: function(e, t) { function n(e) { h.insignificant(e) || r.push(e) } var i, r; return e = e.cloneRange(), e.collapse(!1), i = e.startContainer, h.isDataNode(i) && e.startOffset == h.getNodeLength(i) && (e.setStart(i.parentNode, h.findNodeIndex(i) + 1), e.collapse(!0)), e.setEnd(t, h.getNodeLength(t)), r = [], new b(e).traverse(n), !r.length }, wrapSelectedElements: function(e) { function t(e, t) { var n, i = h.getNodeLength(t); if (e == i) return !0; for (n = e; i > n; n++) if (!h.insignificant(t.childNodes[n])) return !1; return !0 } for (var n = h.editableParent(e.startContainer), i = h.editableParent(e.endContainer); 0 === e.startOffset && e.startContainer != n;) e.setStart(e.startContainer.parentNode, h.findNodeIndex(e.startContainer)); for (; t(e.endOffset, e.endContainer) && e.endContainer != i;) e.setEnd(e.endContainer.parentNode, h.findNodeIndex(e.endContainer) + 1); return e }, expand: function(e) { var t, n, i, r, o = e.cloneRange(), a = o.startContainer.childNodes[0 === o.startOffset ? 0 : o.startOffset - 1], s = o.endContainer.childNodes[o.endOffset]; return f(a) && f(s) ? (t = a.nodeValue, n = s.nodeValue, t && n ? (i = t.split("").reverse().join("").search(S), r = n.search(S), i && r ? (r = -1 == r ? n.length : r, i = -1 == i ? 0 : t.length - i, o.setStart(a, i), o.setEnd(s, r), o) : o) : o) : o }, isExpandable: function(e) { var t, n, i, r, o, a, s = e.startContainer, l = T.documentFromRange(e); return s == l || s == l.body ? !1 : (t = e.cloneRange(), (n = s.nodeValue) ? (i = n.substring(0, t.startOffset), r = n.substring(t.startOffset), o = 0, a = 0, i && (o = i.split("").reverse().join("").search(S)), r && (a = r.search(S)), o && a) : !1) } }; c(d, { SelectionUtils: _, W3CRange: w, RangeIterator: b, W3CSelection: y, RangeEnumerator: k, RestorePoint: x, Marker: C, RangeUtils: T }) }(window.kendo.jQuery), function(e) { function t(e, t) { var n = e.selectionRestorePoint = new d(e.getRange()), i = new f(t, n); return i.editor = e, e.undoRedoStack.push(i), n } var n = window.kendo, i = n.Class, r = n.ui.editor, o = r.EditorUtils, a = o.registerTool, s = r.Dom, l = r.Tool, c = r.ToolTemplate, d = r.RestorePoint, u = r.Marker, h = e.extend, p = i.extend({ init: function(e) { this.options = e, this.restorePoint = new d(e.range), this.marker = new u, this.formatter = e.formatter }, getRange: function() { return this.restorePoint.toRange() }, lockRange: function(e) { return this.marker.add(this.getRange(), e) }, releaseRange: function(e) { this.marker.remove(e), this.editor.selectRange(e) }, undo: function() { var e = this.restorePoint; e.restoreHtml(), this.editor.selectRange(e.toRange()) }, redo: function() { this.exec() }, createDialog: function(t, i) { var r = this.editor; return e(t).appendTo(document.body).kendoWindow(h({}, r.options.dialogOptions, i)).closest(".k-window").toggleClass("k-rtl", n.support.isRtl(r.wrapper)).end() }, exec: function() { var e = this.lockRange(!0); this.formatter.editor = this.editor, this.formatter.toggle(e), this.releaseRange(e) } }), f = i.extend({ init: function(e, t) { this.body = e.body, this.startRestorePoint = e, this.endRestorePoint = t }, redo: function() { this.body.innerHTML = this.endRestorePoint.html, this.editor.selectRange(this.endRestorePoint.toRange()) }, undo: function() { this.body.innerHTML = this.startRestorePoint.html, this.editor.selectRange(this.startRestorePoint.toRange()) } }), g = p.extend({ init: function(e) { p.fn.init.call(this, e), this.managesUndoRedo = !0 }, exec: function() { var e, t = this.editor, n = this.options, i = n.range, r = t.body, o = new d(i, r), a = n.html || n.value || ""; t.selectRange(i), t.clipboard.paste(a, n), n.postProcess && n.postProcess(t, t.getRange()), e = new f(o, new d(t.getRange(), r)), e.editor = t, t.undoRedoStack.push(e), t.focus() } }), m = l.extend({ initialize: function(e, t) { var n = t.editor, i = this.options, o = i.items ? i.items : n.options.insertHtml; new r.SelectBox(e, { dataSource: o, dataTextField: "text", dataValueField: "value", change: function() { l.exec(n, "insertHtml", this.value()) }, title: n.options.messages.insertHtml, highlightFirst: !1 }) }, command: function(e) { return new g(e) }, update: function(e) { var t = e.data("kendoSelectBox") || e.find("select").data("kendoSelectBox"); t.close(), t.value(t.options.title) } }), v = i.extend({ init: function() { this.clear() }, push: function(e) { this.stack = this.stack.slice(0, this.currentCommandIndex + 1), this.currentCommandIndex = this.stack.push(e) - 1 }, undo: function() { this.canUndo() && this.stack[this.currentCommandIndex--].undo() }, redo: function() { this.canRedo() && this.stack[++this.currentCommandIndex].redo() }, clear: function() { this.stack = [], this.currentCommandIndex = -1 }, canUndo: function() { return this.currentCommandIndex >= 0 }, canRedo: function() { return this.currentCommandIndex != this.stack.length - 1 } }), _ = i.extend({ init: function(e) { this.editor = e }, keydown: function(n) { var i, r = this, o = r.editor, a = o.keyboard, s = a.isTypingKey(n), l = h(e.Event(), n); return r.editor.trigger("keydown", l), l.isDefaultPrevented() ? (n.preventDefault(), !0) : l.isDefaultPrevented() || !s || a.isTypingInProgress() ? !1 : (i = o.getRange(), r.startRestorePoint = new d(i), a.startTyping(function() { r.endRestorePoint = t(o, r.startRestorePoint) }), !0) }, keyup: function(e) { var t = this.editor.keyboard; return this.editor.trigger("keyup", e), t.isTypingInProgress() ? (t.endTyping(), !0) : !1 } }), w = i.extend({ init: function(e) { this.editor = e }, _addCaret: function(e) { var t = s.create(this.editor.document, "a"); return e.appendChild(t), t }, _restoreCaret: function(e) { var t = this.editor.createRange(); t.setStartAfter(e), t.collapse(!0), this.editor.selectRange(t), s.remove(e) }, _handleDelete: function(e) { var t, n, i = e.endContainer, o = s.closestEditableOfType(i, s.blockElements); return o && r.RangeUtils.isEndOf(e, o) ? (t = this._addCaret(o), n = s.next(o), n && "p" == s.name(n) ? (this._merge(o, n), this._restoreCaret(t), !0) : (s.remove(t), !1)) : !1 }, _handleBackspace: function(e) { var t, n, i, o, a = e.startContainer, l = e.startOffset, c = s.closestEditableOfType(a, ["li"]), d = s.closestEditableOfType(a, "p,h1,h2,h3,h4,h5,h6".split(",")); if (s.isDataNode(a)) { for (; l >= 0 && "" == a.nodeValue[l - 1];) a.deleteData(l - 1, 1), l--; e.setStart(a, Math.max(0, l)), e.collapse(!0), this.editor.selectRange(e) } return d && d.previousSibling && r.RangeUtils.isStartOf(e, d) ? (t = d.previousSibling, n = this._addCaret(t), this._merge(t, d), this._restoreCaret(n), !0) : c && r.RangeUtils.isStartOf(e, c) ? (i = new r.GreedyBlockFormatter([{ tags: ["p"] }]), o = c.firstChild, i.editor = this.editor, i.apply(c.childNodes), e.setStart(o, 0), this.editor.selectRange(e), !0) : !1 }, _handleSelection: function(t) { var n, i, o, a = t.commonAncestorContainer, l = s.closest(a, "table"), c = r.emptyElementContent; return /t(able|body)/i.test(s.name(a)) && t.selectNode(l), n = new u, n.add(t, !1), t.setStartAfter(n.start), t.setEndBefore(n.end), i = t.startContainer, o = t.endContainer, t.deleteContents(), l && "" === e(l).text() && (t.selectNode(l), t.deleteContents()), a = t.commonAncestorContainer, "p" === s.name(a) && "" === a.innerHTML && (a.innerHTML = c, t.setStart(a, 0)), this._join(i, o), s.insertAfter(this.editor.document.createTextNode(""), n.start), n.remove(t), i = t.startContainer, "tr" == s.name(i) && (i = i.childNodes[Math.max(0, t.startOffset - 1)], t.setStart(i, s.getNodeLength(i))), t.collapse(!0), this.editor.selectRange(t), !0 }, _root: function(e) { for (; e && e.parentNode && "body" != s.name(e.parentNode);) e = e.parentNode; return e }, _join: function(e, t) { e = this._root(e), t = this._root(t), e != t && s.is(t, "p") && this._merge(e, t) }, _merge: function(e, t) { for (s.removeTrailingBreak(e); t.firstChild;) e.appendChild(t.firstChild); s.remove(t) }, keydown: function(e) { var i, r, o = this.editor.getRange(), a = e.keyCode, s = n.keys, l = a === s.BACKSPACE, c = a == s.DELETE; !l && !c || o.collapsed ? l ? i = "_handleBackspace" : c && (i = "_handleDelete") : i = "_handleSelection", i && (r = new d(o), this[i](o) && (e.preventDefault(), t(this.editor, r))) }, keyup: e.noop }), b = i.extend({ init: function(e) { this.editor = e, this.systemCommandIsInProgress = !1 }, createUndoCommand: function() { this.startRestorePoint = this.endRestorePoint = t(this.editor, this.startRestorePoint) }, changed: function() { return this.startRestorePoint ? this.startRestorePoint.html != this.editor.body.innerHTML : !1 }, keydown: function(e) { var t = this, n = t.editor, i = n.keyboard; return i.isModifierKey(e) ? (i.isTypingInProgress() && i.endTyping(!0), t.startRestorePoint = new d(n.getRange()), !0) : i.isSystem(e) ? (t.systemCommandIsInProgress = !0, t.changed() && (t.systemCommandIsInProgress = !1, t.createUndoCommand()), !0) : !1 }, keyup: function() { var e = this; return e.systemCommandIsInProgress && e.changed() ? (e.systemCommandIsInProgress = !1, e.createUndoCommand(), !0) : !1 } }), y = i.extend({ init: function(e) { this.handlers = e, this.typingInProgress = !1 }, isCharacter: function(e) { return e >= 48 && 90 >= e || e >= 96 && 111 >= e || e >= 186 && 192 >= e || e >= 219 && 222 >= e || 229 == e }, toolFromShortcut: function(t, n) { var i, r, o = String.fromCharCode(n.keyCode); for (i in t) if (r = e.extend({ ctrl: !1, alt: !1, shift: !1 }, t[i].options), (r.key == o || r.key == n.keyCode) && r.ctrl == n.ctrlKey && r.alt == n.altKey && r.shift == n.shiftKey) return i }, isTypingKey: function(e) { var t = e.keyCode; return this.isCharacter(t) && !e.ctrlKey && !e.altKey || 32 == t || 13 == t || 8 == t || 46 == t && !e.shiftKey && !e.ctrlKey && !e.altKey }, isModifierKey: function(e) { var t = e.keyCode; return 17 == t && !e.shiftKey && !e.altKey || 16 == t && !e.ctrlKey && !e.altKey || 18 == t && !e.ctrlKey && !e.shiftKey }, isSystem: function(e) { return 46 == e.keyCode && e.ctrlKey && !e.altKey && !e.shiftKey }, startTyping: function(e) { this.onEndTyping = e, this.typingInProgress = !0 }, stopTyping: function() { this.typingInProgress && this.onEndTyping && this.onEndTyping(), this.typingInProgress = !1 }, endTyping: function(t) { var n = this; n.clearTimeout(), t ? n.stopTyping() : n.timeout = window.setTimeout(e.proxy(n.stopTyping, n), 1e3) }, isTypingInProgress: function() { return this.typingInProgress }, clearTimeout: function() { window.clearTimeout(this.timeout) }, notify: function(e, t) { var n, i = this.handlers; for (n = 0; i.length > n && !i[n][t](e); n++); }, keydown: function(e) { this.notify(e, "keydown") }, keyup: function(e) { this.notify(e, "keyup") } }), k = i.extend({ init: function(e) { this.editor = e, this.cleaners = [new C, new S, new T, new D] }, htmlToFragment: function(e) { var t = this.editor, n = t.document, i = s.create(n, "div"), r = n.createDocumentFragment(); for (i.innerHTML = e; i.firstChild;) r.appendChild(i.firstChild); return r }, isBlock: function(e) { return /<(div|p|ul|ol|table|h[1-6])/i.test(e) }, _startModification: function() { var e, t, n = this.editor; if (!this._inProgress) return this._inProgress = !0, e = n.getRange(), t = new d(e), s.persistScrollTop(n.document), { range: e, restorePoint: t } }, _endModification: function(e) { t(this.editor, e.restorePoint), this.editor._selectionChange(), this._inProgress = !1 }, _contentModification: function(e, t) { var n = this, i = n.editor, r = n._startModification(); r && (e.call(n, i, r.range), setTimeout(function() { t.call(n, i, r.range), n._endModification(r) })) }, oncut: function() { this._contentModification(e.noop, e.noop) }, _fileToDataURL: function(t) { var n = e.Deferred(), i = new FileReader; return t instanceof window.File || (t = t.getAsFile()), i.onload = e.proxy(n.resolve, n), i.readAsDataURL(t), n.promise() }, _triggerPaste: function(e, t) { var n = { html: e || "" }; n.html = n.html.replace(/\ufeff/g, ""), this.editor.trigger("paste", n), this.paste(n.html, t || {}) }, _handleImagePaste: function(t) { var n, i, r, o; if ("FileReader" in window && (n = t.clipboardData || t.originalEvent.clipboardData || window.clipboardData, i = n && (n.items || n.files), r = i && e.grep(i, function(e) { return /^image\//i.test(e.type) }), r.length && (o = this._startModification()))) return e.when.apply(e, e.map(r, this._fileToDataURL)).done(e.proxy(function() { var t = Array.prototype.slice.call(arguments), n = e.map(t, function(e) { return '<img src="' + e.target.result + '" />' }).join(""); this._triggerPaste(n), this._endModification(o) }, this)), !0 }, onpaste: function(t) { return this._handleImagePaste(t) ? void t.preventDefault() : void this._contentModification(function(i, r) { var o, a, l, c = s.create(i.document, "div", { className: "k-paste-container", innerHTML: "" }), d = n.support.browser; i.body.appendChild(c), d.msie && 11 > d.version ? (t.preventDefault(), o = i.createRange(), o.selectNodeContents(c), i.selectRange(o), a = i.document.body.createTextRange(), a.moveToElementText(c), e(i.body).unbind("paste"), a.execCommand("Paste"), e(i.body).bind("paste", e.proxy(this.onpaste, this))) : (l = i.createRange(), l.selectNodeContents(c), i.selectRange(l)), r.deleteContents() }, function(t, n) { var i, r = ""; t.selectRange(n), i = e(t.body).children(".k-paste-container"), i.each(function() { var e = this.lastChild; e && s.is(e, "br") && s.remove(e), r += this.innerHTML }), i.remove(), this._triggerPaste(r, { clean: !0 }) }) }, splittableParent: function(e, t) { var n, i; if (e) return s.closestEditableOfType(t, ["p", "ul", "ol"]) || t.parentNode; if (n = t.parentNode, i = t.ownerDocument.body, s.isInline(n)) for (; n.parentNode != i && !s.isBlock(n.parentNode);) n = n.parentNode; return n }, paste: function(t, n) { var i, o, a, l, c, d, p, f, g, m, v, _, w = this.editor; for (n = h({ clean: !1, split: !0 }, n), i = 0, o = this.cleaners.length; o > i; i++) this.cleaners[i].applicable(t) && (t = this.cleaners[i].clean(t)); if (n.clean && (t = t.replace(/(<br>(\s| )*)+(<\/?(div|p|li|col|t))/gi, "$3"), t = t.replace(/<(a|span)[^>]*><\/\1>/gi, "")), t = t.replace(/^<li/i, "<ul><li").replace(/li>$/g, "li></ul>"), a = this.isBlock(t), w.focus(), l = w.getRange(), l.deleteContents(), l.startContainer == w.document && l.selectNodeContents(w.body), c = new u, d = c.addCaret(l), p = this.splittableParent(a, d), f = !1, g = p != w.body && !s.is(p, "td"), n.split && g && (a || s.isInline(p)) && (l.selectNode(d), r.RangeUtils.split(l, p, !0), f = !0), m = this.htmlToFragment(t), m.firstChild && "k-paste-container" === m.firstChild.className) { for (v = [], i = 0, o = m.childNodes.length; o > i; i++) v.push(m.childNodes[i].innerHTML); m = this.htmlToFragment(v.join("<br />")) } if (e(m.childNodes).filter("table").addClass("k-table").end().find("table").addClass("k-table"), l.insertNode(m), p = this.splittableParent(a, d), f) { for (; d.parentNode != p;) s.unwrap(d.parentNode); s.unwrap(d.parentNode) } s.normalize(l.commonAncestorContainer), d.style.display = "inline", s.restoreScrollTop(w.document), s.scrollTo(d), c.removeCaret(l), _ = l.commonAncestorContainer.parentNode, l.collapsed && "tbody" == s.name(_) && (l.setStartAfter(e(_).closest("table")[0]), l.collapse(!0)), w.selectRange(l) } }), x = i.extend({ clean: function(e) { var t, n, i = this, r = i.replacements; for (t = 0, n = r.length; n > t; t += 2) e = e.replace(r[t], r[t + 1]); return e } }), C = x.extend({ init: function() { this.replacements = [/<(\/?)script([^>]*)>/i, "<$1telerik:script$2>"] }, applicable: function(e) { return /<script[^>]*>/i.test(e) } }), S = x.extend({ init: function() { var e = " "; this.replacements = [/<span\s+class="Apple-tab-span"[^>]*>\s*<\/span>/gi, e, /\t/gi, e, / /gi, e] }, applicable: function(e) { return / |class="?Apple-tab-span/i.test(e) } }), T = x.extend({ init: function() { this.replacements = [/<\?xml[^>]*>/gi, "", /<!--(.|\n)*?-->/g, "", /"/g, "'", /(?:<br> [\s\r\n]+|<br>)*(<\/?(h[1-6]|hr|p|div|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|address|pre|form|blockquote|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br> [\s\r\n]+|<br>)*/g, "$1", /<br><br>/g, "<BR><BR>", /<br>(?!\n)/g, " ", /<table([^>]*)>(\s| )+<t/gi, "<table$1><t", /<tr[^>]*>(\s| )*<\/tr>/gi, "", /<tbody[^>]*>(\s| )*<\/tbody>/gi, "", /<table[^>]*>(\s| )*<\/table>/gi, "", /<BR><BR>/g, "<br>", /^\s*( )+/gi, "", /( |<br[^>]*>)+\s*$/gi, "", /mso-[^;"]*;?/gi, "", /<(\/?)b(\s[^>]*)?>/gi, "<$1strong$2>", /<(\/?)font(\s[^>]*)?>/gi, this.convertFontMatch, /<(\/?)i(\s[^>]*)?>/gi, "<$1em$2>", /<o:p> <\/o:p>/gi, " ", /<\/?(meta|link|style|o:|v:|x:)[^>]*>((?:.|\n)*?<\/(meta|link|style|o:|v:|x:)[^>]*>)?/gi, "", /<\/o>/g, "", /style=(["|'])\s*\1/g, "", /(<br[^>]*>)?\n/g, function(e, t) { return t ? e : " " } ] }, convertFontMatch: function(e, t, n) { var i = /face=['"]([^'"]+)['"]/i, r = i.exec(n), o = n && r && r[1]; return t ? "</span>" : o ? '<span style="font-family:' + o + '">' : "<span>" }, applicable: function(e) { return /class="?Mso/i.test(e) || /style="[^"]*mso-/i.test(e) || /urn:schemas-microsoft-com:office/.test(e) }, stripEmptyAnchors: function(e) { return e.replace(/<a([^>]*)>\s*<\/a>/gi, function(e, t) { return !t || t.indexOf("href") < 0 ? "" : e }) }, listType: function(e) { var t; return /^(<span [^>]*texhtml[^>]*>)?<span [^>]*(Symbol|Wingdings)[^>]*>/i.test(e) && (t = !0), e = e.replace(/<\/?\w+[^>]*>/g, "").replace(/ /g, " "), !t && /^[\u2022\u00b7\u00a7\u00d8o]\u00a0+/.test(e) || t && /^.\u00a0+/.test(e) ? "ul" : /^\s*\w+[\.\)]\u00a0{2,}/.test(e) ? "ol" : void 0 }, _convertToLi: function(e) { var t; return 1 == e.childNodes.length ? t = e.firstChild.innerHTML.replace(/^\w+[\.\)]( )+ /, "") : (s.remove(e.firstChild), 3 == e.firstChild.nodeType && /^[ivx]+\.$/i.test(e.firstChild.nodeValue) && s.remove(e.firstChild), /^( |\s)+$/i.test(e.firstChild.innerHTML) && s.remove(e.firstChild), t = e.innerHTML), s.remove(e), s.create(document, "li", { innerHTML: t }) }, lists: function(t) { var n, i, r, o, a, l, c, d, u, h = e(s.blockElements.join(","), t), p = -1, f = { ul: {}, ol: {} }, g = t; for (r = 0; h.length > r; r++) if (o = h[r], a = this.listType(o.innerHTML), i = s.name(o), "td" != i) if (a && "p" == i) { if (l = parseFloat(o.style.marginLeft || 0), c = f[a][l], (l > p || !c) && (c = s.create(document, a), g == t ? s.insertBefore(c, o) : g.appendChild(c), f[a][l] = c), n != a) for (d in f) for (u in f[d]) e.contains(c, f[d][u]) && delete f[d][u]; g = this._convertToLi(o), c.appendChild(g), p = l, n = a } else o.innerHTML ? (f = { ul: {}, ol: {} }, g = t, p = -1) : s.remove(o) }, removeAttributes: function(e) { for (var t = e.attributes, n = t.length; n--;) "colspan" != s.name(t[n]) && e.removeAttributeNode(t[n]) }, createColGroup: function(t) { var i = t.cells, r = e(t).closest("table"), o = r.children("colgroup"); 2 > i.length || (o.length && (i = o.children(), o[0].parentNode.removeChild(o[0])), o = e(e.map(i, function(e) { var t = e.width; return t && 0 !== parseInt(t, 10) ? n.format('<col style="width:{0}px;"/>', t) : "<col />" }).join("")), o.is("colgroup") || (o = e("<colgroup/>").append(o)), o.prependTo(r)) }, convertHeaders: function(t) { var n, i = t.cells, r = e.map(i, function(t) { var n = e(t).children("p").children("strong")[0]; return n && "strong" == s.name(n) ? n : void 0 }); if (r.length == i.length) { for (n = 0; r.length > n; n++) s.unwrap(r[n]); for (e(t).closest("table").find("colgroup").after("<thead></thead>").end().find("thead").append(t), n = 0; i.length > n; n++) s.changeTag(i[n], "th") } }, removeParagraphs: function(t) { var n, i, r, o, a; for (n = 0; t.length > n; n++) for (this.removeAttributes(t[n]), o = e(t[n]), a = o.children("p"), i = 0, r = a.length; r > i; i++) r - 1 > i && s.insertAfter(s.create(document, "br"), a[i]), s.unwrap(a[i]) }, removeDefaultColors: function(e) { for (var t = 0; e.length > t; t++) /^\s*color:\s*[^;]*;?$/i.test(e[t].style.cssText) && s.unwrap(e[t]) }, tables: function(t) { var n, i, r, o, a, s = e(t).find("table"), l = this; for (o = 0; s.length > o; o++) { for (n = s[o].rows, r = i = n[0], a = 1; n.length > a; a++) n[a].cells.length > r.cells.length && (r = n[a]); l.createColGroup(r), l.convertHeaders(i), l.removeAttributes(s[o]), l.removeParagraphs(s.eq(o).find("td,th")), l.removeDefaultColors(s.eq(o).find("span")) } }, headers: function(t) { var n, i = e(t).find("p.MsoTitle"); for (n = 0; i.length > n; n++) s.changeTag(i[n], "h1") }, clean: function(e) { var t, n = this; return e = x.fn.clean.call(n, e), e = n.stripEmptyAnchors(e), t = s.create(document, "div", { innerHTML: e }), n.headers(t), n.lists(t), n.tables(t), e = t.innerHTML.replace(/(<[^>]*)\s+class="?[^"\s>]*"?/gi, "$1") } }), D = x.extend({ init: function() { this.replacements = [/\s+class="Apple-style-span[^"]*"/gi, "", /<(div|p|h[1-6])\s+style="[^"]*"/gi, "<$1", /^<div>(.*)<\/div>$/, "$1"] }, applicable: function(e) { return /class="?Apple-style-span|style="[^"]*-webkit-nbsp-mode/i.test(e) } }), A = p.extend({ init: function(e) { p.fn.init.call(this, e), this.managesUndoRedo = !0 }, exec: function() { var e = this.editor; n.support.browser.msie ? e.document.execCommand("print", !1, null) : e.window.print && e.window.print() } }), E = p.extend({ init: function(e) { this.async = !0, p.fn.init.call(this, e) }, exec: function() { var e = this, t = this.lockRange(!0); this.editor.saveAsPDF().then(function() { e.releaseRange(t) }) } }); h(r, { _finishUpdate: t, Command: p, GenericCommand: f, InsertHtmlCommand: g, InsertHtmlTool: m, UndoRedoStack: v, TypingHandler: _, SystemHandler: b, BackspaceHandler: w, Keyboard: y, Clipboard: k, Cleaner: x, TabCleaner: S, MSWordFormatCleaner: T, WebkitFormatCleaner: D, PrintCommand: A, ExportPdfCommand: E }), a("insertHtml", new m({ template: new c({ template: o.dropDownListTemplate, title: "Insert HTML", initialValue: "Insert HTML" }) })), a("print", new l({ command: A, template: new c({ template: o.buttonTemplate, title: "Print" }) })), a("pdf", new l({ command: E, template: new c({ template: o.buttonTemplate, title: "Export PDF" }) })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.Class, i = t.ui.editor, r = t.ui.Editor.fn.options.formats, o = i.EditorUtils, a = i.Tool, s = i.ToolTemplate, l = i.FormatTool, c = i.Dom, d = i.RangeUtils, u = e.extend, h = i.EditorUtils.registerTool, p = i.EditorUtils.registerFormat, f = "k-marker", g = n.extend({ init: function(e) { this.format = e }, numberOfSiblings: function(e) { var t, n = 0, i = 0, r = 0, o = e.parentNode; for (t = o.firstChild; t; t = t.nextSibling) t != e && (t.className == f ? r++ : 3 == t.nodeType ? n++ : i++); return r > 1 && o.firstChild.className == f && o.lastChild.className == f ? 0 : i + n }, findSuitable: function(e, t) { var n, i; if (!t && this.numberOfSiblings(e) > 0) return null; for (n = e.parentNode, i = this.format[0].tags; !c.ofType(n, i);) { if (this.numberOfSiblings(n) > 0) return null; n = n.parentNode } return n }, findFormat: function(e) { var t, n, i, r, o, a = this.format, s = c.attrEquals; for (t = 0, n = a.length; n > t; t++) { if (i = e, r = a[t].tags, o = a[t].attr, i && c.ofType(i, r) && s(i, o)) return i; for (; i;) if (i = c.parentOfType(i, r), i && s(i, o)) return i } return null }, isFormatted: function(e) { var t, n; for (t = 0, n = e.length; n > t; t++) if (this.findFormat(e[t])) return !0; return !1 } }), m = n.extend({ init: function(e, t) { this.finder = new g(e), this.attributes = u({}, e[0].attr, t), this.tag = e[0].tags[0] }, wrap: function(e) { return c.wrap(e, c.create(e.ownerDocument, this.tag, this.attributes)) }, activate: function(e, t) { this.finder.isFormatted(t) ? (this.split(e), this.remove(t)) : this.apply(t) }, toggle: function(e) { var t = d.textNodes(e); t.length > 0 && this.activate(e, t) }, apply: function(e) { var t, n, i, r, o = []; for (t = 0, n = e.length; n > t; t++) { if (i = e[t], r = this.finder.findSuitable(i)) c.attr(r, this.attributes); else { for (; !c.isBlock(i.parentNode) && 1 == i.parentNode.childNodes.length;) i = i.parentNode; r = this.wrap(i) } o.push(r) } this.consolidate(o) }, remove: function(e) { var t, n, i; for (t = 0, n = e.length; n > t; t++) i = this.finder.findFormat(e[t]), i && (this.attributes && this.attributes.style ? (c.unstyle(i, this.attributes.style), i.style.cssText || i.attributes["class"] || c.unwrap(i)) : c.unwrap(i)) }, split: function(e) { var t, n, i = d.textNodes(e), r = i.length; if (r > 0) for (t = 0; r > t; t++) n = this.finder.findFormat(i[t]), n && d.split(e, n, !0) }, consolidate: function(e) { for (var t, n; e.length > 1;) if (t = e.pop(), n = e[e.length - 1], t.previousSibling && t.previousSibling.className == f && n.appendChild(t.previousSibling), t.tagName == n.tagName && t.previousSibling == n && t.style.cssText == n.style.cssText) { for (; t.firstChild;) n.appendChild(t.firstChild); c.remove(t) } } }), v = g.extend({ init: function(e, t) { this.format = e, this.greedyProperty = t, g.fn.init.call(this, e) }, getInlineCssValue: function(t) { var n, i, r, o, a, s, l, d, u, h, p, f, g = t.attributes, m = e.trim; if (g) for (n = 0, i = g.length; i > n; n++) if (r = g[n], o = r.nodeName, a = r.nodeValue, r.specified && "style" == o) for (s = m(a || t.style.cssText).split(";"), d = 0, u = s.length; u > d; d++) if (l = s[d], l.length) { if (h = l.split(":"), p = m(h[0].toLowerCase()), f = m(h[1]), p != this.greedyProperty) continue; return p.indexOf("color") >= 0 ? c.toHex(f) : f } }, getFormatInner: function(t) { var n, i, r, o = e(c.isDataNode(t) ? t.parentNode : t), a = o.parentsUntil("[contentEditable]").addBack().toArray().reverse(); for (n = 0, i = a.length; i > n; n++) if (r = "className" == this.greedyProperty ? a[n].className : this.getInlineCssValue(a[n])) return r; return "inherit" }, getFormat: function(e) { var t, n, i = this.getFormatInner(e[0]); for (t = 1, n = e.length; n > t; t++) if (i != this.getFormatInner(e[t])) return ""; return i }, isFormatted: function(e) { return "" !== this.getFormat(e) } }), _ = m.extend({ init: function(e, n, i) { m.fn.init.call(this, e, n), this.values = n, this.finder = new v(e, i), i && (this.greedyProperty = t.toCamelCase(i)) }, activate: function(e, t) { var n = this.greedyProperty, i = "apply"; this.split(e), n && "inherit" == this.values.style[n] && (i = "remove"), this[i](t) } }), w = l.extend({ init: function(e) { l.fn.init.call(this, u(e, { finder: new g(e.format), formatter: function() { return new m(e.format) } })) } }), b = a.extend({ update: function(e, t) { var n = e.data(this.type); n.close(), n.value(this.finder.getFormat(t)) } }), y = b.extend({ init: function(e) { a.fn.init.call(this, e), this.type = t.support.browser.msie || t.support.touch ? "kendoDropDownList" : "kendoComboBox", this.format = [{ tags: ["span"] }], this.finder = new v(this.format, e.cssAttr) }, command: function(e) { var t = this.options, n = this.format, r = {}; return new i.FormatCommand(u(e, { formatter: function() { return r[t.domAttr] = e.value, new _(n, { style: r }, t.cssAttr) } })) }, initialize: function(e, t) { var n, i = t.editor, r = this.options, o = r.name, s = []; r.defaultValue && (s = [{ text: i.options.messages[r.defaultValue[0].text], value: r.defaultValue[0].value }]), n = s.concat(r.items ? r.items : i.options[o] || []), e[this.type]({ dataTextField: "text", dataValueField: "value", dataSource: n, change: function() { a.exec(i, o, this.value()) }, highlightFirst: !1 }), e.closest(".k-widget").removeClass("k-" + o).find("*").addBack().attr("unselectable", "on"), e.data(this.type).value("inherit") } }), k = a.extend({ init: function(e) { a.fn.init.call(this, e), this.format = [{ tags: ["span"] }], this.finder = new v(this.format, e.cssAttr) }, options: { palette: "websafe" }, update: function() { this._widget.close() }, command: function(e) { var t = this.options, n = this.format, r = {}; return new i.FormatCommand(u(e, { formatter: function() { return r[t.domAttr] = e.value, new _(n, { style: r }, t.cssAttr) } })) }, initialize: function(n, i) { var r = i.editor, o = this.name, s = u({}, k.fn.options, this.options), l = s.palette; n = this._widget = new t.ui.ColorPicker(n, { value: e.isArray(l) ? l[0] : "#000", toolIcon: "k-" + s.name, palette: l, change: function() { var e = n.value(); e && a.exec(r, o, e), r.focus() }, activate: function(e) { e.preventDefault(), n.trigger("change") } }), n.wrapper.attr({ title: i.title, unselectable: "on" }).find("*").attr("unselectable", "on") } }); u(i, { InlineFormatFinder: g, InlineFormatter: m, DelayedExecutionTool: b, GreedyInlineFormatFinder: v, GreedyInlineFormatter: _, InlineFormatTool: w, FontTool: y, ColorTool: k }), p("bold", [{ tags: ["strong", "b"] }, { tags: ["span"], attr: { style: { fontWeight: "bold" } } }]), h("bold", new w({ key: "B", ctrl: !0, format: r.bold, template: new s({ template: o.buttonTemplate, title: "Bold" }) })), p("italic", [{ tags: ["em", "i"] }, { tags: ["span"], attr: { style: { fontStyle: "italic" } } }]), h("italic", new w({ key: "I", ctrl: !0, format: r.italic, template: new s({ template: o.buttonTemplate, title: "Italic" }) })), p("underline", [{ tags: ["span"], attr: { style: { textDecoration: "underline" } } }, { tags: ["u"] }]), h("underline", new w({ key: "U", ctrl: !0, format: r.underline, template: new s({ template: o.buttonTemplate, title: "Underline" }) })), p("strikethrough", [{ tags: ["del", "strike"] }, { tags: ["span"], attr: { style: { textDecoration: "line-through" } } }]), h("strikethrough", new w({ format: r.strikethrough, template: new s({ template: o.buttonTemplate, title: "Strikethrough" }) })), p("superscript", [{ tags: ["sup"] }]), h("superscript", new w({ format: r.superscript, template: new s({ template: o.buttonTemplate, title: "Superscript" }) })), p("subscript", [{ tags: ["sub"] }]), h("subscript", new w({ format: r.subscript, template: new s({ template: o.buttonTemplate, title: "Subscript" }) })), h("foreColor", new k({ cssAttr: "color", domAttr: "color", name: "foreColor", template: new s({ template: o.colorPickerTemplate, title: "Color" }) })), h("backColor", new k({ cssAttr: "background-color", domAttr: "backgroundColor", name: "backColor", template: new s({ template: o.colorPickerTemplate, title: "Background Color" }) })), h("fontName", new y({ cssAttr: "font-family", domAttr: "fontFamily", name: "fontName", defaultValue: [{ text: "fontNameInherit", value: "inherit" }], template: new s({ template: o.comboBoxTemplate, title: "Font Name" }) })), h("fontSize", new y({ cssAttr: "font-size", domAttr: "fontSize", name: "fontSize", defaultValue: [{ text: "fontSizeInherit", value: "inherit" }], template: new s({ template: o.comboBoxTemplate, title: "Font Size" }) })) }(window.kendo.jQuery), function(e) { var t, n = window.kendo, i = n.Class, r = e.extend, o = n.ui.editor, a = n.ui.Editor.fn.options.formats, s = o.Dom, l = o.Command, c = o.ToolTemplate, d = o.FormatTool, u = o.EditorUtils, h = u.registerTool, p = u.registerFormat, f = o.RangeUtils, g = i.extend({ init: function(e) { this.format = e }, contains: function(e, t) { var n, i, r; for (n = 0, i = t.length; i > n; n++) if (r = t[n], !r || !s.isAncestorOrSelf(e, r)) return !1; return !0 }, findSuitable: function(t) { var n, i, r, o, a = this.format, l = []; for (n = 0, i = t.length; i > n; n++) { for (o = a.length - 1; o >= 0 && !(r = s.ofType(t[n], a[o].tags) ? t[n] : s.parentOfType(t[n], a[o].tags)); o--); if (!r || "true" === r.contentEditable) return []; e.inArray(r, l) < 0 && l.push(r) } for (n = 0, i = l.length; i > n; n++) if (this.contains(l[n], l)) return [l[n]]; return l }, findFormat: function(e) { var t, n, i, r, o, a = this.format, l = s.editableParent(e); for (t = 0, n = a.length; n > t; t++) for (i = e, r = a[t].tags, o = a[t].attr; i && s.isAncestorOf(l, i);) { if (s.ofType(i, r) && s.attrEquals(i, o)) return i; i = i.parentNode } return null }, getFormat: function(e) { var t, n, i = this, r = function(e) { return i.findFormat(s.isDataNode(e) ? e.parentNode : e) }, o = r(e[0]); if (!o) return ""; for (t = 1, n = e.length; n > t; t++) if (o != r(e[t])) return ""; return o.nodeName.toLowerCase() }, isFormatted: function(e) { for (var t = 0, n = e.length; n > t; t++) if (!this.findFormat(e[t])) return !1; return !0 } }), m = i.extend({ init: function(e, t) { this.format = e, this.values = t, this.finder = new g(e) }, wrap: function(e, t, n) { var i, r, o, a, l, c = 1 == n.length ? s.blockParentOrBody(n[0]) : s.commonAncestor.apply(null, n); for (s.isInline(c) && (c = s.blockParentOrBody(c)), i = s.significantChildNodes(c), r = s.findNodeIndex(i[0]), o = s.create(c.ownerDocument, e, t), a = 0; i.length > a; a++) l = i[a], s.isBlock(l) ? (s.attr(l, t), o.childNodes.length && (s.insertBefore(o, l), o = o.cloneNode(!1)), r = s.findNodeIndex(l) + 1) : o.appendChild(l); o.firstChild && s.insertAt(c, o, r) }, apply: function(t) { function n(e) { return r({}, e && e.attr, d) } var i, o, a, l, c, d = this.values, h = s.filter("img", t), p = u.formatByName("img", this.format), f = n(p); if (e.each(h, function() { s.attr(this, f) }), h.length != t.length) if (o = s.filter("img", t, !0), a = this.finder.findSuitable(o), a.length) for (l = 0, c = a.length; c > l; l++) i = u.formatByName(s.name(a[l]), this.format), s.attr(a[l], n(i)); else i = this.format[0], this.wrap(i.tags[0], n(i), o) }, remove: function(e) { var t, n, i, r, o; for (t = 0, n = e.length; n > t; t++) i = this.finder.findFormat(e[t]), i && (o = s.name(i), "div" != o || i.getAttribute("class") ? (r = u.formatByName(o, this.format), r.attr.style && s.unstyle(i, r.attr.style), r.attr.className && s.removeClass(i, r.attr.className)) : s.unwrap(i)) }, toggle: function(e) { var t = this, n = f.nodes(e); t.finder.isFormatted(n) ? t.remove(n) : t.apply(n) } }), v = i.extend({ init: function(e, t) { var n = this; n.format = e, n.values = t, n.finder = new g(e) }, apply: function(e) { var t, n, i, r, a, l, c, d = this.format, u = s.blockParents(e), h = d[0].tags[0]; if (u.length) for (t = 0, n = u.length; n > t; t++) c = s.name(u[t]), "li" == c ? (i = u[t].parentNode, r = new o.ListFormatter(i.nodeName.toLowerCase(), h), a = this.editor.createRange(), a.selectNode(u[t]), r.toggle(a)) : h && ("td" == c || u[t].attributes.contentEditable) ? new m(d, this.values).apply(u[t].childNodes) : (l = s.changeTag(u[t], h), s.attr(l, d[0].attr)); else new m(d, this.values).apply(e) }, toggle: function(e) { var t = f.textNodes(e); t.length || (e.selectNodeContents(e.commonAncestorContainer), t = f.textNodes(e), t.length || (t = s.significantChildNodes(e.commonAncestorContainer))), this.apply(t) } }), _ = l.extend({ init: function(e) { e.formatter = e.formatter(), l.fn.init.call(this, e) } }), w = d.extend({ init: function(e) { d.fn.init.call(this, r(e, { finder: new g(e.format), formatter: function() { return new m(e.format) } })) } }); r(o, { BlockFormatFinder: g, BlockFormatter: m, GreedyBlockFormatter: v, FormatCommand: _, BlockFormatTool: w }), t = ["ul", "ol", "li"], p("justifyLeft", [{ tags: s.nonListBlockElements, attr: { style: { textAlign: "left" } } }, { tags: ["img"], attr: { style: { "float": "left", display: "", marginLeft: "", marginRight: "" } } }, { tags: t, attr: { style: { textAlign: "left", listStylePosition: "" } } }]), h("justifyLeft", new w({ format: a.justifyLeft, template: new c({ template: u.buttonTemplate, title: "Justify Left" }) })), p("justifyCenter", [{ tags: s.nonListBlockElements, attr: { style: { textAlign: "center" } } }, { tags: ["img"], attr: { style: { display: "block", marginLeft: "auto", marginRight: "auto", "float": "" } } }, { tags: t, attr: { style: { textAlign: "center", listStylePosition: "inside" } } }]), h("justifyCenter", new w({ format: a.justifyCenter, template: new c({ template: u.buttonTemplate, title: "Justify Center" }) })), p("justifyRight", [{ tags: s.nonListBlockElements, attr: { style: { textAlign: "right" } } }, { tags: ["img"], attr: { style: { "float": "right", display: "", marginLeft: "", marginRight: "" } } }, { tags: t, attr: { style: { textAlign: "right", listStylePosition: "inside" } } }]), h("justifyRight", new w({ format: a.justifyRight, template: new c({ template: u.buttonTemplate, title: "Justify Right" }) })), p("justifyFull", [{ tags: s.nonListBlockElements, attr: { style: { textAlign: "justify" } } }, { tags: ["img"], attr: { style: { display: "block", marginLeft: "auto", marginRight: "auto", "float": "" } } }, { tags: t, attr: { style: { textAlign: "justify", listStylePosition: "" } } }]), h("justifyFull", new w({ format: a.justifyFull, template: new c({ template: u.buttonTemplate, title: "Justify Full" }) })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = e.extend, i = t.ui.editor, r = i.Dom, o = i.Command, a = i.Tool, s = i.BlockFormatter, l = r.normalize, c = i.RangeUtils, d = i.EditorUtils.registerTool, u = o.extend({ init: function(e) { this.options = e, o.fn.init.call(this, e) }, _insertMarker: function(e, t) { var n, i = r.create(e, "a"); return i.className = "k-marker", t.insertNode(i), i.parentNode || (n = t.commonAncestorContainer, n.innerHTML = "", n.appendChild(i)), l(i.parentNode), i }, _moveFocus: function(e, t) { if (r.isEmpty(t)) e.setStartBefore(t); else { e.selectNodeContents(t); var n = c.textNodes(e)[0]; if (!n) { for (; t.childNodes.length && !r.is(t.firstChild, "br");) t = t.firstChild; n = t } r.isEmpty(n) ? e.setStartBefore(n) : e.selectNodeContents(n) } }, shouldTrim: function(e) { var t = "p,h1,h2,h3,h4,h5,h6".split(","), n = r.parentOfType(e.startContainer, t), i = r.parentOfType(e.endContainer, t); return n && !i || !n && i }, _blankAfter: function(e) { for (; e && (r.isMarker(e) || "" === r.stripBom(e.nodeValue));) e = e.nextSibling; return !e }, exec: function() { var e, t, n, o, a, d, u, h, p = this.getRange(), f = c.documentFromRange(p), g = i.emptyElementContent, m = this.shouldTrim(p); p.deleteContents(), a = this._insertMarker(f, p), d = r.closestEditableOfType(a, ["li"]), u = r.closestEditableOfType(a, "h1,h2,h3,h4,h5,h6".split(",")), d ? r.emptyNode(d) && (o = r.create(f, "p"), d.nextSibling && (h = p.cloneRange(), h.selectNode(d), c.split(h, d.parentNode)), r.insertAfter(o, d.parentNode), r.remove(1 == d.parentNode.childNodes.length ? d.parentNode : d), o.innerHTML = g, n = o) : u && this._blankAfter(a) && (o = r.create(f, "p"), r.insertAfter(o, u), o.innerHTML = g, r.remove(a), n = o), n || (d || u || new s([{ tags: ["p"] }]).apply([a]), p.selectNode(a), e = r.parentOfType(a, [d ? "li" : u ? r.name(u) : "p"]), c.split(p, e, m), t = e.previousSibling, r.is(t, "li") && t.firstChild && !r.is(t.firstChild, "br") && (t = t.firstChild), n = e.nextSibling, this.clean(t), this.clean(n, { links: !0 }), r.is(n, "li") && n.firstChild && !r.is(n.firstChild, "br") && (n = n.firstChild), r.remove(e), l(t)), l(n), this._moveFocus(p, n), p.collapse(!0), r.scrollTo(n), c.selectRange(p) }, clean: function(t, n) { var o, a = t; if (t.firstChild && r.is(t.firstChild, "br") && r.remove(t.firstChild), r.isDataNode(t) && !t.nodeValue && (t = t.parentNode), t) { for (o = !1; t.firstChild && 1 == t.firstChild.nodeType;) o = o || r.significantNodes(t.childNodes).length > 1, t = t.firstChild; if (r.isEmpty(t) || !/^\s*$/.test(t.innerHTML) || o || (e(a).find(".k-br").remove(), t.innerHTML = i.emptyElementContent), n && n.links) for (; t != a;) { if (r.is(t, "a") && r.emptyNode(t)) { r.unwrap(t); break } t = t.parentNode } } } }), h = o.extend({ init: function(e) { this.options = e, o.fn.init.call(this, e) }, exec: function() { var e, n = this.getRange(), i = r.create(c.documentFromRange(n), "br"), o = t.support.browser, a = o.msie && 11 > o.version; n.deleteContents(), n.insertNode(i), l(i.parentNode), a || i.nextSibling && !r.isWhitespace(i.nextSibling) || (e = i.cloneNode(!0), e.className = "k-br", r.insertAfter(e, i)), n.setStartAfter(i), n.collapse(!0), r.scrollTo(i.nextSibling || i), c.selectRange(n) } }); n(i, { ParagraphCommand: u, NewLineCommand: h }), d("insertLineBreak", new a({ key: 13, shift: !0, command: h })), d("insertParagraph", new a({ key: 13, command: u })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.Class, i = e.extend, r = t.ui.editor, o = r.Dom, a = r.RangeUtils, s = r.EditorUtils, l = r.Command, c = r.ToolTemplate, d = r.FormatTool, u = r.BlockFormatFinder, h = a.textNodes, p = r.EditorUtils.registerTool, f = u.extend({ init: function(e) { this.tag = e; var t = this.tags = ["ul" == e ? "ol" : "ul", e]; u.fn.init.call(this, [{ tags: t }]) }, isFormatted: function(e) { var t, n, i = []; for (n = 0; e.length > n; n++) t = this.findFormat(e[n]), t && o.name(t) == this.tag && i.push(t); if (1 > i.length) return !1; if (i.length != e.length) return !1; for (n = 0; i.length > n && i[n].parentNode == t.parentNode; n++) if (i[n] != t) return !1; return !0 }, findSuitable: function(e) { var t = this.findFormat(e[0]); return t && o.name(t) == this.tag ? t : null } }), g = n.extend({ init: function(e, t) { var n = this; n.finder = new f(e), n.tag = e, n.unwrapTag = t }, isList: function(e) { var t = o.name(e); return "ul" == t || "ol" == t || "dl" == t }, wrap: function(e, t) { var n, i, r = o.create(e.ownerDocument, "li"); for (n = 0; t.length > n; n++) if (i = t[n], o.is(i, "li")) e.appendChild(i); else if (this.isList(i)) for (; i.firstChild;) e.appendChild(i.firstChild); else if (o.is(i, "td")) { for (; i.firstChild;) r.appendChild(i.firstChild); e.appendChild(r), i.appendChild(e), e = e.cloneNode(!1), r = r.cloneNode(!1) } else r.appendChild(i), o.isBlock(i) && (e.appendChild(r), o.unwrap(i), r = r.cloneNode(!1)); r.firstChild && e.appendChild(r) }, containsAny: function(e, t) { for (var n = 0; t.length > n; n++) if (o.isAncestorOrSelf(e, t[n])) return !0; return !1 }, suitable: function(e, t) { if ("k-marker" == e.className) { var n = e.nextSibling; if (n && o.isBlock(n)) return !1; if (n = e.previousSibling, n && o.isBlock(n)) return !1 } return this.containsAny(e, t) || o.isInline(e) || 3 == e.nodeType }, _parentLists: function(t) { var n = o.closestEditable(t); return e(t).parentsUntil(n, "ul,ol") }, split: function(e) { var t, n, i, r, s, l, c = h(e); if (c.length) for (t = o.parentOfType(c[0], ["li"]), n = o.parentOfType(c[c.length - 1], ["li"]), e.setStartBefore(t), e.setEndAfter(n), r = 0, s = c.length; s > r; r++) l = this.finder.findFormat(c[r]), l && (i = this._parentLists(l), i.length ? a.split(e, i.last()[0], !0) : a.split(e, l, !0)) }, merge: function(e, t) { for (var n, i = t.previousSibling; i && ("k-marker" == i.className || 3 == i.nodeType && o.isWhitespace(i));) i = i.previousSibling; if (i && o.name(i) == e) { for (; t.firstChild;) i.appendChild(t.firstChild); o.remove(t), t = i } for (n = t.nextSibling; n && ("k-marker" == n.className || 3 == n.nodeType && o.isWhitespace(n));) n = n.nextSibling; if (n && o.name(n) == e) { for (; t.lastChild;) n.insertBefore(t.lastChild, n.firstChild); o.remove(t) } }, breakable: function(e) { return e != e.ownerDocument.body && !/table|tbody|tr|td/.test(o.name(e)) && !e.attributes.contentEditable }, applyOnSection: function(t, n) { function i() { u.push(this) } var r, a, s, l, c = this.tag, d = o.closestSplittableParent(n), u = [], h = this.finder.findSuitable(n); for (h || (h = new f("ul" == c ? "ol" : "ul").findSuitable(n)), /table|tbody/.test(o.name(d)) ? r = e.map(n, function(e) { return o.parentOfType(e, ["td"]) }) : (r = o.significantChildNodes(d), e.grep(r, o.isBlock).length && (r = e.grep(r, e.proxy(function(e) { return this.containsAny(e, n) }, this))), r.length || (r = n)), a = 0; r.length > a; a++) s = r[a], l = (!h || !o.isAncestorOrSelf(h, s)) && this.suitable(s, n), l && (h && this.isList(s) ? (e.each(s.childNodes, i), o.remove(s)) : u.push(s)); u.length == r.length && this.breakable(d) && (u = [d]), h || (h = o.create(d.ownerDocument, c), o.insertBefore(h, u[0])), this.wrap(h, u), o.is(h, c) || o.changeTag(h, c), this.merge(c, h) }, apply: function(e) { var t, n, i, r = 0, a = []; do i = o.closestEditable(e[r], ["td", "body"]), t && i == t ? n.push(e[r]) : (t && a.push({ section: t, nodes: n }), n = [e[r]], t = i), r++; while (e.length > r); for (a.push({ section: t, nodes: n }), r = 0; a.length > r; r++) this.applyOnSection(a[r].section, a[r].nodes) }, unwrap: function(e) { var t, n, i, r, a = e.ownerDocument.createDocumentFragment(), s = this.unwrapTag; for (n = e.firstChild; n; n = n.nextSibling) { for (i = o.create(e.ownerDocument, s || "p"); n.firstChild;) r = n.firstChild, o.isBlock(r) ? (i.firstChild && (a.appendChild(i), i = o.create(e.ownerDocument, s || "p")), a.appendChild(r)) : i.appendChild(r); i.firstChild && a.appendChild(i) } t = this._parentLists(e), t[0] ? (o.insertAfter(a, t.last()[0]), t.last().remove()) : o.insertAfter(a, e), o.remove(e) }, remove: function(e) { var t, n, i; for (n = 0, i = e.length; i > n; n++) t = this.finder.findFormat(e[n]), t && this.unwrap(t) }, toggle: function(e) { var t, n = this, i = h(e), r = e.commonAncestorContainer; i.length || (e.selectNodeContents(r), i = h(e), i.length || (t = r.ownerDocument.createTextNode(""), e.startContainer.appendChild(t), i = [t], e.selectNode(t.parentNode))), n.finder.isFormatted(i) ? (n.split(e), n.remove(i)) : n.apply(i) } }), m = l.extend({ init: function(e) { e.formatter = new g(e.tag), l.fn.init.call(this, e) } }), v = d.extend({ init: function(e) { this.options = e, d.fn.init.call(this, i(e, { finder: new f(e.tag) })) }, command: function(e) { return new m(i(e, { tag: this.options.tag })) } }); i(r, { ListFormatFinder: f, ListFormatter: g, ListCommand: m, ListTool: v }), p("insertUnorderedList", new v({ tag: "ul", template: new c({ template: s.buttonTemplate, title: "Insert unordered list" }) })), p("insertOrderedList", new v({ tag: "ol", template: new c({ template: s.buttonTemplate, title: "Insert ordered list" }) })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.Class, i = e.extend, r = e.proxy, o = t.ui.editor, a = o.Dom, s = o.RangeUtils, l = o.EditorUtils, c = o.Command, d = o.Tool, u = o.ToolTemplate, h = o.InlineFormatter, p = o.InlineFormatFinder, f = s.textNodes, g = o.EditorUtils.registerTool, m = n.extend({ findSuitable: function(e) { return a.parentOfType(e, ["a"]) } }), v = n.extend({ init: function() { this.finder = new m }, apply: function(e, t) { var n, i, r, o, l, c, d, u = f(e); if (t.innerHTML) { for (i = s.documentFromRange(e), n = s.getMarkers(e), e.deleteContents(), o = a.create(i, "a", t), e.insertNode(o), l = o.parentNode, "a" == a.name(l) && a.insertAfter(o, l), a.emptyNode(l) && a.remove(l), c = o, d = 0; n.length > d; d++) a.insertAfter(n[d], c), c = n[d]; n.length && (a.insertBefore(i.createTextNode(""), n[1]), a.insertAfter(i.createTextNode(""), n[1]), e.setStartBefore(n[0]), e.setEndAfter(n[n.length - 1])) } else r = new h([{ tags: ["a"] }], t), r.finder = this.finder, r.apply(u) } }), _ = c.extend({ init: function(e) { e.formatter = { toggle: function(e) { new h([{ tags: ["a"] }]).remove(f(e)) } }, this.options = e, c.fn.init.call(this, e) } }), w = c.extend({ init: function(e) { this.options = e, c.fn.init.call(this, e), this.formatter = new v, e.url ? this.exec = function() { this.formatter.apply(e.range, { href: e.url, innerHTML: e.text || e.url, target: e.target }) } : (this.attributes = null, this.async = !0) }, _dialogTemplate: function() { return t.template("<div class=\"k-editor-dialog k-popup-edit-form k-edit-form-container\"><div class='k-edit-label'><label for='k-editor-link-url'>#: messages.linkWebAddress #</label></div><div class='k-edit-field'><input type='text' class='k-input k-textbox' id='k-editor-link-url'></div><div class='k-edit-label k-editor-link-text-row'><label for='k-editor-link-text'>#: messages.linkText #</label></div><div class='k-edit-field k-editor-link-text-row'><input type='text' class='k-input k-textbox' id='k-editor-link-text'></div><div class='k-edit-label'><label for='k-editor-link-title'>#: messages.linkToolTip #</label></div><div class='k-edit-field'><input type='text' class='k-input k-textbox' id='k-editor-link-title'></div><div class='k-edit-label'></div><div class='k-edit-field'><input type='checkbox' class='k-checkbox' id='k-editor-link-target'><label for='k-editor-link-target' class='k-checkbox-label'>#: messages.linkOpenInNewWindow #</label></div><div class='k-edit-buttons k-state-default'><button class=\"k-dialog-insert k-button k-primary\">#: messages.dialogInsert #</button><button class=\"k-dialog-close k-button\">#: messages.dialogCancel #</button></div></div>")({ messages: this.editor.options.messages }) }, exec: function() { var t, n, i, o, s = (this.getRange().collapsed, this.editor.options.messages); this._initialText = "", this._range = this.lockRange(!0), t = f(this._range), n = t.length ? this.formatter.finder.findSuitable(t[0]) : null, i = t.length && "img" == a.name(t[0]), o = this.createDialog(this._dialogTemplate(), { title: s.createLink, close: r(this._close, this), visible: !1 }), n && (this._range.selectNodeContents(n), t = f(this._range)), this._initialText = this.linkText(t), o.find(".k-dialog-insert").click(r(this._apply, this)).end().find(".k-dialog-close").click(r(this._close, this)).end().find(".k-edit-field input").keydown(r(this._keydown, this)).end().find("#k-editor-link-url").val(this.linkUrl(n)).end().find("#k-editor-link-text").val(this._initialText).end().find("#k-editor-link-title").val(n ? n.title : "").end().find("#k-editor-link-target").attr("checked", n ? "_blank" == n.target : !1).end().find(".k-editor-link-text-row").toggle(!i), this._dialog = o.data("kendoWindow").center().open(), e("#k-editor-link-url", o).focus().select() }, _keydown: function(e) { var n = t.keys; e.keyCode == n.ENTER ? this._apply(e) : e.keyCode == n.ESC && this._close(e) }, _apply: function(t) { var n, i, r, o = this._dialog.element, s = e("#k-editor-link-url", o).val(), l = e("#k-editor-link-text", o); s && "http://" != s && (s.indexOf("@") > 0 && !/^(\w+:)|(\/\/)/i.test(s) && (s = "mailto:" + s), this.attributes = { href: s }, n = e("#k-editor-link-title", o).val(), n && (this.attributes.title = n), l.is(":visible") && (i = l.val(), i || this._initialText ? i && i !== this._initialText && (this.attributes.innerHTML = a.stripBom(i)) : this.attributes.innerHTML = s), r = e("#k-editor-link-target", o).is(":checked"), this.attributes.target = r ? "_blank" : null, this.formatter.apply(this._range, this.attributes)), this._close(t), this.change && this.change() }, _close: function(e) { e.preventDefault(), this._dialog.destroy(), a.windowFromDocument(s.documentFromRange(this._range)).focus(), this.releaseRange(this._range) }, linkUrl: function(e) { return e ? e.getAttribute("href", 2) : "http://" }, linkText: function(e) { var t, n = ""; for (t = 0; e.length > t; t++) n += e[t].nodeValue; return a.stripBom(n || "") }, redo: function() { var e = this.lockRange(!0); this.formatter.apply(e, this.attributes), this.releaseRange(e) } }), b = d.extend({ init: function(t) { this.options = t, this.finder = new p([{ tags: ["a"] }]), d.fn.init.call(this, e.extend(t, { command: _ })) }, initialize: function(e, t) { d.fn.initialize.call(this, e, t), e.addClass("k-state-disabled") }, update: function(e, t) { e.toggleClass("k-state-disabled", !this.finder.isFormatted(t)).removeClass("k-state-hover") } }); i(t.ui.editor, { LinkFormatFinder: m, LinkFormatter: v, UnlinkCommand: _, LinkCommand: w, UnlinkTool: b }), g("createLink", new d({ key: "K", ctrl: !0, command: w, template: new u({ template: l.buttonTemplate, title: "Create Link" }) })), g("unlink", new b({ key: "K", ctrl: !0, shift: !0, template: new u({ template: l.buttonTemplate, title: "Remove Link" }) })) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = e.extend, r = n.ui.editor, o = r.EditorUtils, a = r.Dom, s = o.registerTool, l = r.ToolTemplate, c = r.RangeUtils, d = r.Command, u = r.LinkFormatter, h = c.textNodes, p = n.keys, f = "#k-editor-file-url", g = "#k-editor-file-title", m = d.extend({ init: function(e) { var t = this; d.fn.init.call(t, e), t.formatter = new u, t.async = !0, t.attributes = {} }, insertFile: function(e, t) { var n = this.attributes, i = c.documentFromRange(t); if (n.href && "http://" != n.href) { if (!e) return e = a.create(i, "a", { href: n.href }), e.innerHTML = n.innerHTML, t.deleteContents(), t.insertNode(e), e.nextSibling || a.insertAfter(i.createTextNode(""), e), t.setStartAfter(e), t.setEndAfter(e), c.selectRange(t), !0; a.attr(e, n) } return !1 }, _dialogTemplate: function(e) { return n.template('<div class="k-editor-dialog k-popup-edit-form k-edit-form-container"># if (showBrowser) { #<div class="k-filebrowser"></div># } #<div class=\'k-edit-label\'><label for="k-editor-file-url">#: messages.fileWebAddress #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-file-url"></div><div class=\'k-edit-label\'><label for="k-editor-file-title">#: messages.fileTitle #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-file-title"></div><div class="k-edit-buttons k-state-default"><button class="k-dialog-insert k-button k-primary">#: messages.dialogInsert #</button><button class="k-dialog-close k-button">#: messages.dialogCancel #</button></div></div>')({ messages: this.editor.options.messages, showBrowser: e }) }, redo: function() { var e = this, t = e.lockRange(); this.formatter.apply(t, this.attributes), e.releaseRange(t) }, exec: function() { function e(e) { var t = s.element, n = t.find(f).val().replace(/ /g, "%20"), i = t.find(g).val(); l.attributes = { href: n, innerHTML: "" !== i ? i : n }, m = l.insertFile(v, d), r(e), l.change && l.change() } function r(e) { e.preventDefault(), s.destroy(), a.windowFromDocument(c.documentFromRange(d)).focus(), m || l.releaseRange(d) } function o(t) { t.keyCode == p.ENTER ? e(t) : t.keyCode == p.ESC && r(t) } var s, l = this, d = l.lockRange(), u = h(d), m = !1, v = u.length ? this.formatter.finder.findSuitable(u[0]) : null, _ = l.editor.options, w = _.messages, b = _.fileBrowser, y = !!(n.ui.FileBrowser && b && b.transport && b.transport.read !== t), k = { title: w.insertFile, visible: !1, resizable: y }; k.close = r, y && (k.width = 750), s = this.createDialog(l._dialogTemplate(y), k).toggleClass("k-filebrowser-dialog", y).find(".k-dialog-insert").click(e).end().find(".k-dialog-close").click(r).end().find(".k-edit-field input").keydown(o).end().find(f).val(v ? v.getAttribute("href", 2) : "http://").end().find(g).val(v ? v.title : "").end().data("kendoWindow"), y && new n.ui.FileBrowser(s.element.find(".k-filebrowser"), i({}, b, { change: function() { s.element.find(f).val(this.value()) }, apply: e })), s.center().open(), s.element.find(f).focus().select() } }); n.ui.editor.FileCommand = m, s("insertFile", new r.Tool({ command: m, template: new l({ template: o.buttonTemplate, title: "Insert File" }) })) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = e.extend, r = n.ui.editor, o = r.EditorUtils, a = r.Dom, s = o.registerTool, l = r.ToolTemplate, c = r.RangeUtils, d = r.Command, u = n.keys, h = "#k-editor-image-url", p = "#k-editor-image-title", f = "#k-editor-image-width", g = "#k-editor-image-height", m = d.extend({ init: function(e) { var t = this; d.fn.init.call(t, e), t.async = !0, t.attributes = {} }, insertImage: function(e, t) { var n, i = this.attributes, r = c.documentFromRange(t); if (i.src && "http://" != i.src) { if (n = function() { setTimeout(function() { i.width || e.removeAttribute("width"), i.height || e.removeAttribute("height"), e.removeAttribute("complete") }) }, !e) return e = a.create(r, "img", i), e.onload = e.onerror = n, t.deleteContents(), t.insertNode(e), e.nextSibling || a.insertAfter(r.createTextNode(""), e), n(), t.setStartAfter(e), t.setEndAfter(e), c.selectRange(t), !0; e.onload = e.onerror = n, a.attr(e, i), n() } return !1 }, _dialogTemplate: function(e) { return n.template('<div class="k-editor-dialog k-popup-edit-form k-edit-form-container"># if (showBrowser) { #<div class="k-filebrowser k-imagebrowser"></div># } #<div class=\'k-edit-label\'><label for="k-editor-image-url">#: messages.imageWebAddress #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-image-url"></div><div class=\'k-edit-label\'><label for="k-editor-image-title">#: messages.imageAltText #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-image-title"></div><div class=\'k-edit-label\'><label for="k-editor-image-width">#: messages.imageWidth #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-image-width"></div><div class=\'k-edit-label\'><label for="k-editor-image-height">#: messages.imageHeight #</label></div><div class=\'k-edit-field\'><input type="text" class="k-input k-textbox" id="k-editor-image-height"></div><div class="k-edit-buttons k-state-default"><button class="k-dialog-insert k-button k-primary">#: messages.dialogInsert #</button><button class="k-dialog-close k-button">#: messages.dialogCancel #</button></div></div>')({ messages: this.editor.options.messages, showBrowser: e }) }, redo: function() { var e = this, t = e.lockRange(); e.insertImage(c.image(t), t) || e.releaseRange(t) }, exec: function() { function e(e) { var t = s.element, n = parseInt(t.find(f).val(), 10), i = parseInt(t.find(g).val(), 10); l.attributes = { src: t.find(h).val().replace(/ /g, "%20"), alt: t.find(p).val() }, l.attributes.width = null, l.attributes.height = null, !isNaN(n) && n > 0 && (l.attributes.width = n), !isNaN(i) && i > 0 && (l.attributes.height = i), m = l.insertImage(v, d), r(e), l.change && l.change() } function r(e) { e.preventDefault(), s.destroy(), a.windowFromDocument(c.documentFromRange(d)).focus(), m || l.releaseRange(d) } function o(t) { t.keyCode == u.ENTER ? e(t) : t.keyCode == u.ESC && r(t) } var s, l = this, d = l.lockRange(), m = !1, v = c.image(d), _ = v && v.getAttribute("width") || "", w = v && v.getAttribute("height") || "", b = l.editor.options, y = b.messages, k = b.imageBrowser, x = !!(n.ui.ImageBrowser && k && k.transport && k.transport.read !== t), C = { title: y.insertImage, visible: !1, resizable: x }; C.close = r, x && (C.width = 750), s = this.createDialog(l._dialogTemplate(x), C).toggleClass("k-filebrowser-dialog", x).find(".k-dialog-insert").click(e).end().find(".k-dialog-close").click(r).end().find(".k-edit-field input").keydown(o).end().find(h).val(v ? v.getAttribute("src", 2) : "http://").end().find(p).val(v ? v.alt : "").end().find(f).val(_).end().find(g).val(w).end().data("kendoWindow"), x && new n.ui.ImageBrowser(s.element.find(".k-imagebrowser"), i({}, k, { change: function() { s.element.find(h).val(this.value()) }, apply: e })), s.center().open(), s.element.find(h).focus().select() } }); n.ui.editor.ImageCommand = m, s("insertImage", new r.Tool({ command: m, template: new l({ template: o.buttonTemplate, title: "Insert Image" }) })) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.ui.DropDownList, r = n.ui.editor.Dom, o = i.extend({ init: function(t, r) { var o = this; i.fn.init.call(o, t, r), n.support.mobileOS.ios && (this._initSelectOverlay(), this.bind("dataBound", e.proxy(this._initSelectOverlay, this))), o.text(o.options.title), o.bind("open", function() { if (o.options.autoSize) { var e, t = o.list; t.css({ whiteSpace: "nowrap", width: "auto" }), e = t.width(), e ? e += 20 : e = o._listWidth, t.css("width", e + n.support.scrollbar()), o._listWidth = e } }) }, options: { name: "SelectBox", index: -1 }, _initSelectOverlay: function() { var t, i, r, o, a = this, s = a.value(), l = this.dataSource.view(), c = "", d = n.htmlEncode; for (i = 0; l.length > i; i++) t = l[i], c += "<option value='" + d(t.value) + "'", t.value == s && (c += " selected"), c += ">" + d(t.text) + "</option>"; r = e("<select class='k-select-overlay'>" + c + "</select>"), o = e(this.element).closest(".k-widget"), o.next(".k-select-overlay").remove(), r.insertAfter(o), r.on("change", function() { a.value(this.value), a.trigger("change") }) }, value: function(e) { var n = this, r = i.fn.value.call(n, e); return e === t ? r : (i.fn.value.call(n) || n.text(n.options.title), t) }, decorate: function(t) { var n, i, o, a, s = this, l = s.dataSource, c = l.data(); for (t && s.list.css("background-color", r.getEffectiveBackground(e(t))), n = 0; c.length > n; n++) i = c[n].tag || "span", o = c[n].className, a = r.inlineStyle(t, i, { className: o }), a = a.replace(/"/g, "'"), c[n].style = a + ";display:inline-block"; l.trigger("change") } }); n.ui.plugin(o), n.ui.editor.SelectBox = o }(window.kendo.jQuery), function(e, t) { function n(n, i) { var r = "rtl" == e(n).css("direction"), o = r ? "Right" : "Left", a = "td" != s.name(n) ? "margin" + o : "padding" + o; return i === t ? n.style[a] || 0 : (i > 0 ? n.style[a] = i + "px" : (n.style[a] = "", n.style.cssText || n.removeAttribute("style")), t) } var i = window.kendo, r = i.Class, o = e.extend, a = i.ui.editor, s = a.Dom, l = a.EditorUtils, c = l.registerTool, d = a.Command, u = a.Tool, h = a.ToolTemplate, p = a.RangeUtils, f = s.blockElements, g = a.BlockFormatFinder, m = a.BlockFormatter, v = r.extend({ init: function() { this.finder = new g([{ tags: s.blockElements }]) }, apply: function(t) { var i, r, o, a, l, c, d, u, h, p, f = this.finder.findSuitable(t), g = []; if (f.length) { for (i = 0, r = f.length; r > i; i++) s.is(f[i], "li") ? e(f[i]).index() ? e.inArray(f[i].parentNode, g) < 0 && g.push(f[i]) : g.push(f[i].parentNode) : g.push(f[i]); for (; g.length;) if (o = g.shift(), s.is(o, "li")) if (a = o.parentNode, l = e(o).prev("li"), c = l.find("ul,ol").last(), d = e(o).children("ul,ol")[0], d && l[0]) c[0] ? (c.append(o), c.append(e(d).children()), s.remove(d)) : (l.append(d), d.insertBefore(o, d.firstChild)); else for (d = l.children("ul,ol")[0], d || (d = s.create(o.ownerDocument, s.name(a)), l.append(d)); o && o.parentNode == a;) d.appendChild(o), o = g.shift(); else for (u = parseInt(n(o), 10) + 30, n(o, u), h = 0; g.length > h; h++) e.contains(o, g[h]) && g.splice(h, 1) } else p = new m([{ tags: ["p"] }], { style: { marginLeft: 30 } }), p.apply(t) }, remove: function(t) { var i, r, o, a, s, l, c, d, u = this.finder.findSuitable(t); for (r = 0, o = u.length; o > r; r++) { if (c = e(u[r]), c.is("li")) { if (a = c.parent(), s = a.parent(), s.is("li,ul,ol") && !n(a[0])) { if (i && e.contains(i, s[0])) continue; l = c.nextAll("li"), l.length && e(a[0].cloneNode(!1)).appendTo(c).append(l), s.is("li") ? c.insertAfter(s) : c.appendTo(s), a.children("li").length || a.remove(); continue } if (i == a[0]) continue; i = a[0] } else i = u[r]; d = parseInt(n(i), 10) - 30, n(i, d) } } }), _ = d.extend({ init: function(e) { e.formatter = { toggle: function(e) { (new v).apply(p.nodes(e)) } }, d.fn.init.call(this, e) } }), w = d.extend({ init: function(e) { e.formatter = { toggle: function(e) { (new v).remove(p.nodes(e)) } }, d.fn.init.call(this, e) } }), b = u.extend({ init: function(e) { u.fn.init.call(this, e), this.finder = new g([{ tags: f }]) }, initialize: function(e, t) { u.fn.initialize.call(this, e, t), e.addClass("k-state-disabled") }, update: function(i, r) { var o, a, l, c, d = this.finder.findSuitable(r); for (l = 0, c = d.length; c > l; l++) if (o = n(d[l]), o || (a = e(d[l]).parents("ul,ol").length, o = s.is(d[l], "li") && (a > 1 || n(d[l].parentNode)) || s.ofType(d[l], ["ul", "ol"]) && a > 0), o) return i.removeClass("k-state-disabled"), t; i.addClass("k-state-disabled").removeClass("k-state-hover") } }); o(a, { IndentFormatter: v, IndentCommand: _, OutdentCommand: w, OutdentTool: b }), c("indent", new u({ command: _, template: new h({ template: l.buttonTemplate, title: "Indent" }) })), c("outdent", new b({ command: w, template: new h({ template: l.buttonTemplate, title: "Outdent" }) })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = e.extend, i = t.ui.editor, r = i.EditorUtils, o = i.Command, a = i.Tool, s = i.ToolTemplate, l = o.extend({ init: function(e) { var t = this; t.options = e, o.fn.init.call(t, e), t.attributes = null, t.async = !0 }, exec: function() { function n(e) { o.value(s.find(d).val()), i(e), r.change && r.change(), o.trigger("change") } function i(e) { e.preventDefault(), s.data("kendoWindow").destroy(), o.focus() } var r = this, o = r.editor, a = o.options.messages, s = e(t.template(l.template)(a)).appendTo(document.body), c = l.indent(o.value()), d = ".k-editor-textarea"; this.createDialog(s, { title: a.viewHtml, close: i, visible: !1 }).find(d).val(c).end().find(".k-dialog-update").click(n).end().find(".k-dialog-close").click(i).end().data("kendoWindow").center().open(), s.find(d).focus() } }); n(l, { template: "<div class='k-editor-dialog k-popup-edit-form k-edit-form-container k-viewhtml-dialog'><textarea class='k-editor-textarea k-input'></textarea><div class='k-edit-buttons k-state-default'><button class='k-dialog-update k-button k-primary'>#: dialogUpdate #</button><button class='k-dialog-close k-button'>#: dialogCancel #</button></div></div>", indent: function(e) { return e.replace(/<\/(p|li|ul|ol|h[1-6]|table|tr|td|th)>/gi, "</$1>\n").replace(/<(ul|ol)([^>]*)><li/gi, "<$1$2>\n<li").replace(/<br \/>/gi, "<br />\n").replace(/\n$/, "") } }), t.ui.editor.ViewHtmlCommand = l, i.EditorUtils.registerTool("viewHtml", new a({ command: l, template: new s({ template: r.buttonTemplate, title: "View HTML" }) })) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.ui.editor, i = n.Tool, r = n.ToolTemplate, o = n.DelayedExecutionTool, a = n.Command, s = n.Dom, l = n.EditorUtils, c = n.RangeUtils, d = l.registerTool, u = o.extend({ init: function(e) { var n = this; i.fn.init.call(n, t.deepExtend({}, n.options, e)), n.type = "kendoSelectBox", n.finder = { getFormat: function() { return "" } } }, options: { items: [{ text: "Paragraph", value: "p" }, { text: "Quotation", value: "blockquote" }, { text: "Heading 1", value: "h1" }, { text: "Heading 2", value: "h2" }, { text: "Heading 3", value: "h3" }, { text: "Heading 4", value: "h4" }, { text: "Heading 5", value: "h5" }, { text: "Heading 6", value: "h6" }], width: 110 }, toFormattingItem: function(e) { var t, n = e.value; return n ? e.tag || e.className ? e : (t = n.indexOf("."), 0 === t ? e.className = n.substring(1) : -1 == t ? e.tag = n : (e.tag = n.substring(0, t), e.className = n.substring(t + 1)), e) : e }, command: function(t) { var i = t.value; return i = this.toFormattingItem(i), new n.FormatCommand({ range: t.range, formatter: function() { var t, r = (i.tag || i.context || "span").split(","), o = [{ tags: r, attr: { className: i.className || "" } }]; return t = e.inArray(r[0], s.inlineElements) >= 0 ? new n.GreedyInlineFormatter(o) : new n.GreedyBlockFormatter(o) } }) }, initialize: function(e, n) { var r = n.editor, o = this.options, a = o.name, s = this; e.width(o.width), e.kendoSelectBox({ dataTextField: "text", dataValueField: "value", dataSource: o.items || r.options[a], title: r.options.messages[a], autoSize: !0, change: function() { var e = this.dataItem(); e && i.exec(r, a, e.toJSON()) }, dataBound: function() { var e, t = this.dataSource.data(); for (e = 0; t.length > e; e++) t[e] = s.toFormattingItem(t[e]) }, highlightFirst: !1, template: t.template('<span unselectable="on" style="display:block;#=(data.style||"")#">#:data.text#</span>') }), e.addClass("k-decorated").closest(".k-widget").removeClass("k-" + a).find("*").addBack().attr("unselectable", "on") }, getFormattingValue: function(t, n) { var i, r, o, a, s, l, c; for (i = 0; t.length > i; i++) if (r = t[i], o = r.tag || r.context || "", a = r.className ? "." + r.className : "", s = o + a, l = e(n[0]).closest(s)[0]) { if (1 == n.length) return r.value; for (c = 1; n.length > c && e(n[c]).closest(s)[0]; c++) if (c == n.length - 1) return r.value } return "" }, update: function(t, n) { var i, r, a, l, c, d = e(t).data(this.type); if (d && (i = d.dataSource, r = i.data(), c = s.commonAncestor.apply(null, n), c == s.closestEditable(c) || this._ancestor != c)) { for (this._ancestor = c, a = 0; r.length > a; a++) l = r[a].context, r[a].visible = !l || !!e(c).closest(l).length; i.filter([{ field: "visible", operator: "eq", value: !0 }]), o.fn.update.call(this, t, n), d.value(this.getFormattingValue(i.view(), n)), d.wrapper.toggleClass("k-state-disabled", !i.view().length) } }, destroy: function() { this._ancestor = null } }), h = a.extend({ exec: function() { var t, i = new n.ListFormatter("ul"), r = this.lockRange(!0), o = this.options.remove || "strong,em,span,sup,sub,del,b,i,u,font".split(","); c.wrapSelectedElements(r), t = new n.RangeIterator(r), t.traverse(function a(t) { var n, r, l, c; if (t && !s.isMarker(t)) { if (n = s.name(t), "ul" == n || "ol" == n) for (r = t.previousSibling, l = t.nextSibling, i.unwrap(t); r && r != l; r = r.nextSibling) a(r); else if ("blockquote" == n) s.changeTag(t, "p"); else if (1 == t.nodeType && !s.insignificant(t)) { for (c = t.childNodes.length - 1; c >= 0; c--) a(t.childNodes[c]); t.removeAttribute("style"), t.removeAttribute("class") } e.inArray(n, o) > -1 && s.unwrap(t) } }), this.releaseRange(r) } }); e.extend(n, { FormattingTool: u, CleanFormatCommand: h }), d("formatting", new u({ template: new r({ template: l.dropDownListTemplate, title: "Format" }) })), d("cleanFormatting", new i({ command: h, template: new r({ template: l.buttonTemplate, title: "Clean formatting" }) })) }(window.kendo.jQuery), function(e) { var t, n = window.kendo, i = n.ui, r = i.editor, o = i.Widget, a = e.extend, s = e.proxy, l = n.keys, c = ".kendoEditor", d = n.ui.editor.EditorUtils, u = n.ui.editor.ToolTemplate, h = n.ui.editor.Tool, p = "overflowAnchor", f = ".k-tool-group:visible a.k-tool:not(.k-state-disabled),.k-tool.k-overflow-anchor,.k-tool-group:visible .k-widget.k-colorpicker,.k-tool-group:visible .k-selectbox,.k-tool-group:visible .k-dropdown,.k-tool-group:visible .k-combobox .k-input", g = h.extend({ initialize: function(t, n) { t.attr({ unselectable: "on" }); var i = n.editor.toolbar; t.on("click", e.proxy(function() { this.overflowPopup.toggle() }, i)) }, options: { name: p }, command: e.noop, update: e.noop, destroy: e.noop }); d.registerTool(p, new g({ key: "", ctrl: !0, template: new u({ template: d.overflowAnchorTemplate }) })), t = o.extend({ init: function(e, t) { var i = this; t = a({}, t, { name: "EditorToolbar" }), o.fn.init.call(i, e, t), t.popup && i._initPopup(), t.resizable && t.resizable.toolbar && (i._resizeHandler = n.onResize(function() { i.resize() }), i.element.addClass("k-toolbar-resizable")) }, events: ["execute"], groups: { basic: ["bold", "italic", "underline", "strikethrough"], scripts: ["subscript", "superscript"], alignment: ["justifyLeft", "justifyCenter", "justifyRight", "justifyFull"], links: ["insertImage", "insertFile", "createLink", "unlink"], lists: ["insertUnorderedList", "insertOrderedList", "indent", "outdent"], tables: ["createTable", "addColumnLeft", "addColumnRight", "addRowAbove", "addRowBelow", "deleteRow", "deleteColumn"], advanced: ["viewHtml", "cleanFormatting", "print", "pdf"], fonts: ["fontName", "fontSize"], colors: ["foreColor", "backColor"] }, overflowFlaseTools: ["formatting", "fontName", "fontSize", "foreColor", "backColor", "insertHtml"], _initPopup: function() { this.window = e(this.element).wrap("<div class='editorToolbarWindow k-header' />").parent().prepend("<button class='k-button k-button-bare k-editortoolbar-dragHandle'><span class='k-icon k-i-move' /></button>").kendoWindow({ title: !1, resizable: !1, draggable: { dragHandle: ".k-editortoolbar-dragHandle" }, animation: { open: { effects: "fade:in" }, close: { effects: "fade:out" } }, minHeight: 42, visible: !1, autoFocus: !1, actions: [], dragend: function() { this._moved = !0 } }).on("mousedown", function(t) { e(t.target).is(".k-icon") || t.preventDefault() }).data("kendoWindow") }, _toggleOverflowStyles: function(e, t) { e.find("li").toggleClass("k-item k-state-default", t).find(".k-tool:not(.k-state-disabled),.k-overflow-button").toggleClass("k-overflow-button k-button", t) }, _initOverflowPopup: function(t) { var n = this, i = "<ul class='k-editor-overflow-popup k-overflow-container k-list-container'></ul>"; n.overflowPopup = e(i).appendTo("body").kendoPopup({ anchor: t, origin: "bottom right", position: "top right", copyAnchorStyles: !1, open: function(e) { this.element.is(":empty") && e.preventDefault(), n._toggleOverflowStyles(this.element, !0) }, activate: s(n.focusOverflowPopup, n) }).data("kendoPopup") }, items: function() { var e, t, n = this.options.resizable && this.options.resizable.toolbar; return t = this.element.children().find("> *, select"), n && (e = this.overflowPopup, t = t.add(e.element.children().find("> *"))), t }, focused: function() { return this.element.find(".k-state-focused").length > 0 }, toolById: function(e) { var t, n = this.tools; for (t in n) if (t.toLowerCase() == e) return n[t] }, toolGroupFor: function(t) { var n, i = this.groups; if (this.isCustomTool(t)) return "custom"; for (n in i) if (e.inArray(t, i[n]) >= 0) return n }, bindTo: function(t) { var n = this, i = n.window; n._editor && n._editor.unbind("select", s(n.resize, n)), n._editor = t, n.options.resizable && n.options.resizable.toolbar && t.options.tools.push(p), n.tools = n.expandTools(t.options.tools), n.render(), n.element.find(".k-combobox .k-input").keydown(function(t) { var n = e(this).closest(".k-combobox").data("kendoComboBox"), i = t.keyCode; i == l.RIGHT || i == l.LEFT ? n.close() : i == l.DOWN && (n.dropDown.isOpened() || (t.stopImmediatePropagation(), n.open())) }), n._attachEvents(), n.items().each(function() { var i, r = n._toolName(this), o = "more" !== r ? n.tools[r] : n.tools.overflowAnchor, a = o && o.options, s = t.options.messages, l = a && a.tooltip || s[r], c = e(this); o && o.initialize && (("fontSize" == r || "fontName" == r) && (i = s[r + "Inherit"], c.find("input").val(i).end().find("span.k-input").text(i).end()), o.initialize(c, { title: n._appendShortcutSequence(l, o), editor: n._editor }), c.closest(".k-widget", n.element).addClass("k-editor-widget"), c.closest(".k-colorpicker", n.element).next(".k-colorpicker").addClass("k-editor-widget")) }), t.bind("select", s(n.resize, n)), n.update(), i && i.wrapper.css({ top: "", left: "", width: "" }) }, show: function() { var e, t, n, i = this, r = i.window, o = i.options.editor; r && (e = r.wrapper, t = o.element, e.is(":visible") && i.window.options.visible || (e[0].style.width || e.width(t.outerWidth() - parseInt(e.css("border-left-width"), 10) - parseInt(e.css("border-right-width"), 10)), r._moved || (n = t.offset(), e.css({ top: Math.max(0, parseInt(n.top, 10) - e.outerHeight() - parseInt(i.window.element.css("padding-bottom"), 10)), left: Math.max(0, parseInt(n.left, 10)) })), r.open())) }, hide: function() { this.window && this.window.close() }, focus: function() { var e = "tabIndex", t = this.element, n = this._editor.element.attr(e); t.attr(e, n || 0).focus().find(f).first().focus(), n || 0 === n || t.removeAttr(e) }, focusOverflowPopup: function() { var e = "tabIndex", t = this.overflowPopup.element, n = this._editor.element.attr(e); t.closest(".k-animation-container").addClass("k-overflow-wrapper"), t.attr(e, n || 0).focus().find(f).first().focus(), n || 0 === n || t.removeAttr(e) }, _appendShortcutSequence: function(e, t) { if (!t.key) return e; var n = e + " ("; return t.ctrl && (n += "Ctrl + "), t.shift && (n += "Shift + "), t.alt && (n += "Alt + "), n += t.key + ")" }, _nativeTools: ["insertLineBreak", "insertParagraph", "redo", "undo"], tools: {}, isCustomTool: function(e) { return !(e in n.ui.Editor.defaultTools) }, expandTools: function(t) { var i, o, s, l, c = this._nativeTools, d = n.deepExtend({}, n.ui.Editor.defaultTools), u = {}; for (o = 0; t.length > o; o++) i = t[o], l = i.name, e.isPlainObject(i) ? l && d[l] ? (u[l] = a({}, d[l]), a(u[l].options, i)) : (s = a({ cssClass: "k-i-custom", type: "button", title: "" }, i), s.name || (s.name = "custom"), s.cssClass = "k-" + ("custom" == s.name ? "i-custom" : s.name), s.template || "button" != s.type || (s.template = r.EditorUtils.buttonTemplate, s.title = s.title || s.tooltip), u[l] = { options: s }) : d[i] && (u[i] = d[i]); for (o = 0; c.length > o; o++) u[c[o]] || (u[c[o]] = d[c[o]]); return u }, render: function() { function t(t) { var i; return t.getHtml ? i = t.getHtml() : (e.isFunction(t) || (t = n.template(t)), i = t(o)), e.trim(i) } function i() { h.children().length && (k && (h.data("position", y), y++), h.appendTo(_)) } function r(t) { t !== p ? (h = e("<li class='k-tool-group' role='presentation' />"), h.data("overflow", -1 === e.inArray(t, x) ? !0 : !1)) : h = e("<li class='k-overflow-tools' />") } var o, a, l, c, d, u, h, f, g = this, m = g.tools, v = g._editor.element, _ = g.element.empty(), w = g._editor.options.tools, b = n.support.browser, y = 0, k = g.options.resizable && g.options.resizable.toolbar, x = this.overflowFlaseTools; for (_.empty(), w.length && (c = w[0].name || w[0]), r(c, x), f = 0; w.length > f; f++) c = w[f].name || w[f], o = m[c] && m[c].options, !o && e.isPlainObject(c) && (o = c), a = o && o.template, "break" == c && (i(), e("<li class='k-row-break' />").appendTo(g.element), r(c, x)), a && (u = g.toolGroupFor(c), (d != u || c == p) && (i(), r(c, x), d = u), a = t(a), l = e(a).appendTo(h), "custom" == u && (i(), r(c, x)), o.exec && l.hasClass("k-tool") && l.click(s(o.exec, v[0]))); i(), e(g.element).children(":has(> .k-tool)").addClass("k-button-group"), g.options.popup && b.msie && 9 > b.version && g.window.wrapper.find("*").attr("unselectable", "on"), g.updateGroups(), k && g._initOverflowPopup(g.element.find(".k-overflow-anchor")), g.angular("compile", function() { return { elements: g.element } }) }, updateGroups: function() { e(this.element).children().each(function() { e(this).children().filter(function() { return !e(this).hasClass("k-state-disabled") }).removeClass("k-group-end").first().addClass("k-group-start").end().last().addClass("k-group-end").end() }) }, decorateFrom: function(t) { this.items().filter(".k-decorated").each(function() { var n = e(this).data("kendoSelectBox"); n && n.decorate(t) }) }, destroy: function() { o.fn.destroy.call(this); var e, t = this.tools; for (e in t) t[e].destroy && t[e].destroy(); this.window && this.window.destroy(), this._resizeHandler && n.unbindResize(this._resizeHandler), this.overflowPopup && this.overflowPopup.destroy() }, _attachEvents: function() { var t = this, n = "[role=button].k-tool", i = n + ":not(.k-state-disabled)", r = n + ".k-state-disabled", o = t.overflowPopup ? t.overflowPopup.element : e([]); t.element.add(o).off(c).on("mouseenter" + c, i, function() { e(this).addClass("k-state-hover") }).on("mouseleave" + c, i, function() { e(this).removeClass("k-state-hover") }).on("mousedown" + c, n, function(e) { e.preventDefault() }).on("keydown" + c, f, function(n) { function i(e, t, n) { var i = t.find(f), r = i.index(a) + e; return n && (r = Math.max(0, Math.min(i.length - 1, r))), i[r] } var r, o, a = this, s = t.options.resizable && t.options.resizable.toolbar, c = n.keyCode; c == l.RIGHT || c == l.LEFT ? e(a).hasClass(".k-dropdown") || (r = i(c == l.RIGHT ? 1 : -1, t.element, !0)) : !s || c != l.UP && c != l.DOWN ? c == l.ESC ? (t.overflowPopup.visible() && t.overflowPopup.close(), r = t._editor) : c != l.TAB || n.ctrlKey || n.altKey || (o = s && e(a.parentElement).hasClass("k-overflow-tool-group") ? t.overflowPopup.element : t.element, n.shiftKey ? r = i(-1, o) : (r = i(1, o), r || (r = t._editor))) : r = i(c == l.DOWN ? 1 : -1, t.overflowPopup.element, !0), r && (n.preventDefault(), r.focus()) }).on("click" + c, i, function(n) { var i = e(this); n.preventDefault(), n.stopPropagation(), i.removeClass("k-state-hover"), i.is("[data-popup]") || t._editor.exec(t._toolName(this)) }).on("click" + c, r, function(e) { e.preventDefault() }) }, _toolName: function(t) { var n, i; if (t) return n = t.className, /k-tool\b/i.test(n) && (n = t.firstChild.className), i = e.grep(n.split(" "), function(e) { return !/^k-(widget|tool|tool-icon|icon|state-hover|header|combobox|dropdown|selectbox|colorpicker)$/i.test(e) }), i[0] ? i[0].substring(i[0].lastIndexOf("-") + 1) : "custom" }, refreshTools: function() { var t = this, i = t._editor, r = i.getRange(), o = n.ui.editor.RangeUtils.textNodes(r); o.length || (o = [r.startContainer]), t.items().each(function() { var n = t.tools[t._toolName(this)]; n && n.update && n.update(e(this), o) }), this.update() }, update: function() { this.updateGroups() }, _resize: function(e) { var t = e.width, n = this.options.resizable && this.options.resizable.toolbar, i = this.overflowPopup; this.refreshTools(), n && (i.visible() && i.close(!0), this._refreshWidths(), this._shrink(t), this._stretch(t), this._toggleOverflowStyles(this.element, !1), this._toggleOverflowStyles(this.overflowPopup.element, !0), this.element.children("li.k-overflow-tools").css("visibility", i.element.is(":empty") ? "hidden" : "visible")) }, _refreshWidths: function() { this.element.children("li").each(function(t, n) { var i = e(n); i.data("outerWidth", i.outerWidth(!0)) }) }, _shrink: function(e) { var t, n, i; if (e < this._groupsWidth()) for (n = this._visibleGroups().filter(":not(.k-overflow-tools)"), i = n.length - 1; i >= 0 && (t = n.eq(i), !(e > this._groupsWidth())); i--) this._hideGroup(t) }, _stretch: function(e) { var t, n, i; if (e > this._groupsWidth()) for (n = this._hiddenGroups(), i = 0; n.length > i && (t = n.eq(i), !(e < this._groupsWidth()) && this._showGroup(t, e)); i++); }, _hiddenGroups: function() { var t = this.overflowPopup, n = this.element.children("li.k-tool-group").filter(":hidden"); return n = n.add(t.element.children("li")), n.sort(function(t, n) { return e(t).data("position") > e(n).data("position") ? 1 : -1 }), n }, _visibleGroups: function() { return this.element.children("li.k-tool-group, li.k-overflow-tools").filter(":visible") }, _groupsWidth: function() { var t = 0; return this._visibleGroups().each(function() { t += e(this).data("outerWidth") }), Math.ceil(t) }, _hideGroup: function(e) { if (e.data("overflow")) { var t = this.overflowPopup; e.detach().prependTo(t.element).addClass("k-overflow-tool-group") } else e.hide() }, _showGroup: function(t, n) { var i, r; return t.length && n > this._groupsWidth() + t.data("outerWidth") ? (t.hasClass("k-overflow-tool-group") ? (i = t.data("position"), 0 === i ? t.detach().prependTo(this.element) : (r = this.element.children().filter(function(t, n) { return e(n).data("position") === i - 1 }), t.detach().insertAfter(r)), t.removeClass("k-overflow-tool-group")) : t.show(), !0) : !1 } }), e.extend(r, { Toolbar: t }) }(window.jQuery), function(e) { var t = window.kendo, n = e.extend, i = e.proxy, r = t.ui.editor, o = r.Dom, a = r.EditorUtils, s = r.RangeUtils, l = r.Command, c = ".kendoEditor", d = "k-state-active", u = "k-state-selected", h = r.Tool, p = r.ToolTemplate, f = r.InsertHtmlCommand, g = r.BlockFormatFinder, m = r.EditorUtils.registerTool, v = "<td>" + r.emptyElementContent + "</td>", _ = new g([{ tags: ["table"] }]), w = f.extend({ _tableHtml: function(e, t) { return e = e || 1, t = t || 1, "<table class='k-table' data-last>" + Array(e + 1).join("<tr>" + Array(t + 1).join(v) + "</tr>") + "</table>" }, postProcess: function(t, n) { var i = e("table[data-last]", t.document).removeAttr("data-last"); n.setStart(i.find("td")[0], 0), n.collapse(!0), t.selectRange(n) }, exec: function() { var e = this.options; e.html = this._tableHtml(e.rows, e.columns), e.postProcess = this.postProcess, f.fn.exec.call(this) } }), b = h.extend({ initialize: function(t, n) { h.fn.initialize.call(this, t, n); var r = e(this.options.popupTemplate).appendTo("body").kendoPopup({ anchor: t, copyAnchorStyles: !1, open: i(this._open, this), activate: i(this._activate, this), close: i(this._close, this) }).data("kendoPopup"); t.click(i(this._toggle, this)).keydown(i(this._keydown, this)), this._editor = n.editor, this._popup = r }, popup: function() { return this._popup }, _activate: e.noop, _open: function() { this._popup.options.anchor.addClass(d) }, _close: function() { this._popup.options.anchor.removeClass(d) }, _keydown: function(e) { var n = t.keys, i = e.keyCode; i == n.DOWN && e.altKey ? this._popup.open() : i == n.ESC && this._popup.close() }, _toggle: function(t) { var n = e(t.target).closest(".k-tool"); n.hasClass("k-state-disabled") || this.popup().toggle() }, update: function(e) { var t = this.popup(); t.wrapper && "block" == t.wrapper.css("display") && t.close(), e.removeClass("k-state-hover") }, destroy: function() { this._popup.destroy() } }), y = b.extend({ init: function(t) { this.cols = 8, this.rows = 6, b.fn.init.call(this, e.extend(t, { command: w, popupTemplate: "<div class='k-ct-popup'>" + Array(this.cols * this.rows + 1).join("<span class='k-ct-cell k-state-disabled' />") + "<div class='k-status'></div></div>" })) }, _activate: function() { function n(t) { var n = e(window); return { row: Math.floor((t.clientY + n.scrollTop() - u.top) / r) + 1, col: Math.floor((t.clientX + n.scrollLeft() - u.left) / i) + 1 } } var i, r, o = this, a = o._popup.element, s = a.find(".k-ct-cell"), l = s.eq(0), d = s.eq(s.length - 1), u = t.getOffset(l), h = t.getOffset(d), p = o.cols, f = o.rows; a.find("*").addBack().attr("unselectable", "on"), h.left += d[0].offsetWidth, h.top += d[0].offsetHeight, i = (h.left - u.left) / p, r = (h.top - u.top) / f, a.on("mousemove" + c, function(e) { o._setTableSize(n(e)) }).on("mouseleave" + c, function() { o._setTableSize() }).on("mouseup" + c, function(e) { o._exec(n(e)) }) }, _valid: function(e) { return e && e.row > 0 && e.col > 0 && this.rows >= e.row && this.cols >= e.col }, _exec: function(e) { this._valid(e) && (this._editor.exec("createTable", { rows: e.row, columns: e.col }), this._popup.close()) }, _setTableSize: function(n) { var i = this._popup.element, r = i.find(".k-status"), o = i.find(".k-ct-cell"), a = this.cols, s = this._editor.options.messages; this._valid(n) ? (r.text(t.format(s.createTableHint, n.row, n.col)), o.each(function(t) { e(this).toggleClass(u, n.col > t % a && n.row > t / a) })) : (r.text(s.dialogCancel), o.removeClass(u)) }, _keydown: function(e) { var n, i, r, o, a, s, l, c; b.fn._keydown.call(this, e), this._popup.visible() && (n = t.keys, i = e.keyCode, r = this._popup.element.find(".k-ct-cell"), o = Math.max(r.filter(".k-state-selected").last().index(), 0), a = Math.floor(o / this.cols), s = o % this.cols, l = !1, i != n.DOWN || e.altKey ? i == n.UP ? (l = !0, a--) : i == n.RIGHT ? (l = !0, s++) : i == n.LEFT && (l = !0, s--) : (l = !0, a++), c = { row: Math.max(1, Math.min(this.rows, a + 1)), col: Math.max(1, Math.min(this.cols, s + 1)) }, i == n.ENTER ? this._exec(c) : this._setTableSize(c), l && (e.preventDefault(), e.stopImmediatePropagation())) }, _open: function() { var e = this._editor.options.messages; b.fn._open.call(this), this.popup().element.find(".k-status").text(e.dialogCancel).end().find(".k-ct-cell").removeClass(u) }, _close: function() { b.fn._close.call(this), this.popup().element.off(c) }, update: function(e, t) { var n; b.fn.update.call(this, e), n = _.isFormatted(t), e.toggleClass("k-state-disabled", n) } }), k = l.extend({ exec: function() { for (var e, t, n, i, a = this.lockRange(!0), s = a.endContainer; "td" != o.name(s);) s = s.parentNode; for (t = s.parentNode, e = t.children.length, n = t.cloneNode(!0), i = 0; t.cells.length > i; i++) n.cells[i].innerHTML = r.emptyElementContent; "before" == this.options.position ? o.insertBefore(n, t) : o.insertAfter(n, t), this.releaseRange(a) } }), x = l.extend({ exec: function() { var e, t, n, i, a = this.lockRange(!0), s = o.closest(a.endContainer, "td"), l = o.closest(s, "table"), c = l.rows, d = this.options.position; for (e = o.findNodeIndex(s, !0), t = 0; c.length > t; t++) n = c[t].cells[e], i = n.cloneNode(), i.innerHTML = r.emptyElementContent, "before" == d ? o.insertBefore(i, n) : o.insertAfter(i, n); this.releaseRange(a) } }), C = l.extend({ exec: function() { var t, n, i, r = this.lockRange(), a = s.mapAll(r, function(t) { return e(t).closest("tr")[0] }), l = o.closest(a[0], "table"); if (a.length >= l.rows.length) t = o.next(l), (!t || o.insignificant(t)) && (t = o.prev(l)), o.remove(l); else for (n = 0; a.length > n; n++) i = a[n], o.removeTextSiblings(i), t = o.next(i) || o.prev(i), t = t.cells[0], o.remove(i); t && (r.setStart(t, 0), r.collapse(!0), this.editor.selectRange(r)) } }), S = l.extend({ exec: function() { var e, t, n = this.lockRange(), i = o.closest(n.endContainer, "td"), r = o.closest(i, "table"), a = r.rows, s = o.findNodeIndex(i, !0), l = a[0].cells.length; if (1 == l) e = o.next(r), (!e || o.insignificant(e)) && (e = o.prev(r)), o.remove(r); else for (o.removeTextSiblings(i), e = o.next(i) || o.prev(i), t = 0; a.length > t; t++) o.remove(a[t].cells[s]); e && (n.setStart(e, 0), n.collapse(!0), this.editor.selectRange(n)) } }), T = h.extend({ command: function(e) { return e = n(e, this.options), "delete" == e.action ? "row" == e.type ? new C(e) : new S(e) : "row" == e.type ? new k(e) : new x(e) }, initialize: function(e, t) { h.fn.initialize.call(this, e, t), e.addClass("k-state-disabled") }, update: function(e, t) { var n = !_.isFormatted(t); e.toggleClass("k-state-disabled", n) } }); n(t.ui.editor, { PopupTool: b, TableCommand: w, InsertTableTool: y, TableModificationTool: T, InsertRowCommand: k, InsertColumnCommand: x, DeleteRowCommand: C, DeleteColumnCommand: S }), m("createTable", new y({ template: new p({ template: a.buttonTemplate, popup: !0, title: "Create table" }) })), m("addColumnLeft", new T({ type: "column", position: "before", template: new p({ template: a.buttonTemplate, title: "Add column on the left" }) })), m("addColumnRight", new T({ type: "column", template: new p({ template: a.buttonTemplate, title: "Add column on the right" }) })), m("addRowAbove", new T({ type: "row", position: "before", template: new p({ template: a.buttonTemplate, title: "Add row above" }) })), m("addRowBelow", new T({ type: "row", template: new p({ template: a.buttonTemplate, title: "Add row below" }) })), m("deleteRow", new T({ type: "row", action: "delete", template: new p({ template: a.buttonTemplate, title: "Delete row" }) })), m("deleteColumn", new T({ type: "column", action: "delete", template: new p({ template: a.buttonTemplate, title: "Delete column" }) })) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.caret, r = n.keys, o = n.ui, a = o.Widget, s = ".kendoMaskedTextBox", l = e.proxy, c = (n.support.propertyChangeEvent ? "propertychange" : "input") + s, d = "k-state-disabled", u = "disabled", h = "readonly", p = "change", f = a.extend({ init: function(t, r) { var o, l, c = this; a.fn.init.call(c, t, r), c._rules = e.extend({}, c.rules, c.options.rules), t = c.element, o = t[0], c.wrapper = t, c._tokenize(), c._form(), c.element.addClass("k-textbox").attr("autocomplete", "off").on("focus" + s, function() { var e = o.value; e ? c._togglePrompt(!0) : o.value = c._old = c._emptyMask, c._oldValue = e, c._timeoutId = setTimeout(function() { i(t, 0, e ? c._maskLength : 0) }) }).on("focusout" + s, function() { var e = t.val(); clearTimeout(c._timeoutId), o.value = c._old = "", e !== c._emptyMask && (o.value = c._old = e), c._change(), c._togglePrompt() }), l = t.is("[disabled]") || e(c.element).parents("fieldset").is(":disabled"), l ? c.enable(!1) : c.readonly(t.is("[readonly]")), c.value(c.options.value || t.val()), n.notify(c) }, options: { name: "MaskedTextBox", clearPromptChar: !1, unmaskOnPost: !1, promptChar: "_", culture: "", rules: {}, value: "", mask: "" }, events: [p], rules: { 0: /\d/, 9: /\d|\s/, "#": /\d|\s|\+|\-/, L: /[a-zA-Z]/, "?": /[a-zA-Z]|\s/, "&": /\S/, C: /./, A: /[a-zA-Z0-9]/, a: /[a-zA-Z0-9]|\s/ }, setOptions: function(t) { var n = this; a.fn.setOptions.call(n, t), n._rules = e.extend({}, n.rules, n.options.rules), n._tokenize(), this._unbindInput(), this._bindInput(), n.value(n.element.val()) }, destroy: function() { var e = this; e.element.off(s), e._formElement && (e._formElement.off("reset", e._resetHandler), e._formElement.off("submit", e._submitHandler)), a.fn.destroy.call(e) }, raw: function() { var e = this._unmask(this.element.val(), 0); return e.replace(RegExp(this.options.promptChar, "g"), "") }, value: function(e) { var i = this.element, r = this._emptyMask; return e === t ? this.element.val() : (null === e && (e = ""), r ? (e = this._unmask(e + ""), i.val(e ? r : ""), this._mask(0, this._maskLength, e), e = i.val(), this._oldValue = e, n._activeElement() !== i && (e === r ? i.val("") : this._togglePrompt()), t) : (i.val(e), t)) }, _togglePrompt: function(e) { var t = this.element[0], n = t.value; this.options.clearPromptChar && (n = e ? this._oldValue : n.replace(RegExp(this.options.promptChar, "g"), " "), t.value = this._old = n) }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, _bindInput: function() { var e = this; e._maskLength && e.element.on("keydown" + s, l(e._keydown, e)).on("keypress" + s, l(e._keypress, e)).on("paste" + s, l(e._paste, e)).on(c, l(e._propertyChange, e)) }, _unbindInput: function() { this.element.off("keydown" + s).off("keypress" + s).off("paste" + s).off(c) }, _editable: function(e) { var t = this, n = t.element, i = e.disable, r = e.readonly; t._unbindInput(), r || i ? n.attr(u, i).attr(h, r).toggleClass(d, i) : (n.removeAttr(u).removeAttr(h).removeClass(d), t._bindInput()) }, _change: function() { var e = this, t = e.value(); t !== e._oldValue && (e._oldValue = t, e.trigger(p), e.element.trigger(p)) }, _propertyChange: function() { var e, t, r = this, o = r.element[0], a = o.value; n._activeElement() === o && (a === r._old || r._pasting || (t = i(o)[0], e = r._unmask(a.substring(t), t), o.value = r._old = a.substring(0, t) + r._emptyMask.substring(t), r._mask(t, t, e), i(o, t))) }, _paste: function(e) { var t = this, n = e.target, r = i(n), o = r[0], a = r[1], s = t._unmask(n.value.substring(a), a); t._pasting = !0, setTimeout(function() { var e = n.value, r = e.substring(o, i(n)[0]); n.value = t._old = e.substring(0, o) + t._emptyMask.substring(o), t._mask(o, o, r), o = i(n)[0], t._mask(o, o, s), i(n, o), t._pasting = !1 }) }, _form: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { setTimeout(function() { t.value(n[0].value) }) }, t._submitHandler = function() { t.element[0].value = t._old = t.raw() }, t.options.unmaskOnPost && r.on("submit", t._submitHandler), t._formElement = r.on("reset", t._resetHandler)) }, _keydown: function(e) { var n, o = e.keyCode, a = this.element[0], s = i(a), l = s[0], c = s[1], d = o === r.BACKSPACE; d || o === r.DELETE ? (l === c && (d ? l -= 1 : c += 1, n = this._find(l, d)), n !== t && n !== l ? (d && (n += 1), i(a, n)) : l > -1 && this._mask(l, c, "", d), e.preventDefault()) : o === r.ENTER && this._change() }, _keypress: function(e) { var t, n; 0 === e.which || e.metaKey || e.ctrlKey || e.keyCode === r.ENTER || (t = String.fromCharCode(e.which), n = i(this.element), this._mask(n[0], n[1], t), (e.keyCode === r.BACKSPACE || t) && e.preventDefault()) }, _find: function(e, t) { var n = this.element.val() || this._emptyMask, i = 1; for (t === !0 && (i = -1); e > -1 || this._maskLength >= e;) { if (n.charAt(e) !== this.tokens[e]) return e; e += i } return -1 }, _mask: function(e, r, o, a) { var s, l, c, d, u = this.element[0], h = u.value || this._emptyMask, p = this.options.promptChar, f = 0; for (e = this._find(e, a), e > r && (r = e), l = this._unmask(h.substring(r), r), o = this._unmask(o, e), s = o.length, o && (l = l.replace(RegExp("^_{0," + s + "}"), "")), o += l, h = h.split(""), c = o.charAt(f); this._maskLength > e;) h[e] = c || p, c = o.charAt(++f), d === t && f > s && (d = e), e = this._find(e + 1); u.value = this._old = h.join(""), n._activeElement() === u && (d === t && (d = this._maskLength), i(u, d)) }, _unmask: function(t, n) { var i, r, o, a, s, l, c, d; if (!t) return ""; for (t = (t + "").split(""), o = 0, a = n || 0, s = this.options.promptChar, l = t.length, c = this.tokens.length, d = ""; c > a && (i = t[o], r = this.tokens[a], i === r || i === s ? (d += i === s ? s : "", o += 1, a += 1) : "string" != typeof r ? ((r.test && r.test(i) || e.isFunction(r) && r(i)) && (d += i, a += 1), o += 1) : a += 1, !(o >= l));); return d }, _tokenize: function() { for (var e, t, i, r, o = [], a = 0, s = this.options.mask || "", l = s.split(""), c = l.length, d = 0, u = "", h = this.options.promptChar, p = n.getCulture(this.options.culture).numberFormat, f = this._rules; c > d; d++) if (e = l[d], t = f[e]) o[a] = t, u += h, a += 1; else for ("." === e || "," === e ? e = p[e] : "$" === e ? e = p.currency.symbol : "\\" === e && (d += 1, e = l[d]), e = e.split(""), i = 0, r = e.length; r > i; i++) o[a] = e[i], u += e[i], a += 1; this.tokens = o, this._emptyMask = u, this._maskLength = u.length } }); o.plugin(f) }(window.kendo.jQuery), function(e, t) { function n(e) { var n = "string" == typeof e ? [{ name: e }] : e, i = "[object Array]" === vt.call(n) ? n : n !== t ? [n] : []; return wt(i, function(e) { return "string" == typeof e ? { name: e } : { name: e.name, type: e.type } }) } function i(e) { var n = "string" == typeof e ? [{ name: [e], expand: !1 }] : e, i = "[object Array]" === vt.call(n) ? n : n !== t ? [n] : []; return wt(i, function(e) { return "string" == typeof e ? { name: [e], expand: !1 } : { name: "[object Array]" === vt.call(e.name) ? e.name.slice() : [e.name], expand: e.expand } }) } function r(e, t, n, i) { var o, a, s, l; if (n || (n = t), i || (i = 0), l = n.members[i], l && !l.measure) { if (s = l.children, a = s.length, n === t ? e[ht.stringify([l.name])] = !!a : a && (e[ht.stringify(at(n, i))] = !0), a) for (o = 0; a > o; o++) r(e, t, s[o], i); r(e, t, n, i + 1) } } function o(t) { var n, i, o = {}; t.length && r(o, t[0]), n = []; for (i in o) n.push({ name: e.parseJSON(i), expand: o[i] }); return n } function a(e, t) { var n, i, r, o, a = t.tuples || [], s = a[0]; if (s && s.members.length > e.length) for (n = s.members, i = 0; n.length > i; i++) if (!n[i].measure) { for (r = !1, o = 0; e.length > o; o++) if (0 === H(e[o]).indexOf(n[i].hierarchy)) { r = !0; break } r || e.push({ name: [n[i].name], expand: !1 }) } } function s(e) { var t, n = [], i = e.members; for (t = 0; i.length > t; t++) i[t].measure || n.push({ name: [i[t].name], expand: i[t].children.length > 0 }); return n } function l(e, t, n) { var r, o; return e = e || {}, a(t, e), n.length > 1 && t.push({ name: Ct, measure: !0, children: i(n) }), r = { members: t }, e.tuples && (o = y(e.tuples, r), o.tuple && (t = s(o.tuple))), t } function c(e) { var t = ht.getter(e.field, !0); return function(n, i) { return e.aggregate(t(n.dataItem), i, n) } } function d(e) { return "number" == typeof e && !isNaN(e) } function u(e) { return e && e.getTime } function h(e, n, i) { return e.tuples.length < m(n.tuples, i) ? n : t } function p(e, t, n, i, r) { var o, a, s, l = e.length, c = m(t, i), d = i.length || 1; for (a = 0; n > a; a++) for (o = 0; l > o; o++) s = g(e[o], t) * d, s += o % d, r[a * l + o].ordinal = a * c + s } function f(e, t, n, i, r) { var o, a, s, l = e.length, c = (m(t, i), i.length || 1); for (a = 0; l > a; a++) for (s = g(e[a], t), s *= c, s += a % c, o = 0; n > o; o++) r[a * n + o].ordinal = s * n + o } function g(e, t) { return y(t, e).index } function m(e, t) { var n, i, r; if (!e.length) return 0; for (n = e.slice(), i = n.shift(), r = 1; i;) i.members ? [].push.apply(n, i.members) : i.children && (i.measure || (r += i.children.length), [].push.apply(n, i.children)), i = n.shift(); return t.length && (r *= t.length), r } function v(e) { return e || (e = { tuples: [] }), e.tuples || (e.tuples = []), e } function _(e, t, n) { var i, r, o, a; if (!e) return 0; for (i = Math.max(n.length, 1), r = e.members.slice(0, t), o = i, a = r.shift(), i > 1 && (i += 1); a;) a.name === Ct ? o += i : a.children ? [].push.apply(r, a.children) : (o++, [].push.apply(r, a.members)), a = r.shift(); return o } function w(e, t, n) { var i, r, o, a, s, l; if (!t[0]) return { parsedRoot: null, tuples: e, memberIndex: 0, index: 0 }; if (i = y(e, t[0]), !i.tuple) return { parsedRoot: null, tuples: t, memberIndex: 0, index: 0 }; if (r = i.tuple.members, o = t[0].members, a = -1, r.length !== o.length) return { parsedRoot: null, tuples: t, memberIndex: 0, index: 0 }; for (s = 0, l = r.length; l > s; s++)!r[s].measure && o[s].children[0] && (-1 == a && o[s].children.length && (a = s), r[s].children = o[s].children); return n = Math.max(n.length, 1), { parsedRoot: i.tuple, index: i.index * n, memberIndex: a, tuples: e } } function b(e, t) { var n, i, r = !0; for (e = e.members, t = t.members, n = 0, i = e.length; i > n; n++) e[n].measure || t[n].measure || (r = r && H(e[n]) === H(t[n])); return r } function y(e, t) { var n, i, r, o, a, s, l, c = 0; for (n = 0, i = e.length; i > n; n++) { if (r = e[n], b(r, t)) return { tuple: r, index: c }; for (c++, a = 0, s = r.members.length; s > a; a++) if (l = r.members[a], !l.measure && (o = y(l.children, t), c += o.index, o.tuple)) return { tuple: o.tuple, index: c } } return { index: c } } function k(e, t) { var n, i, r, o = ""; for (i = 0, r = e.length; r > i; i++) n = e[i], o += n.name, t[o] || (t[o] = n) } function x(e, t) { var n, i, r, o, a = e.members, s = "", l = ""; for (n = 0, i = a.length; i > n; n++) { if (r = a[n], o) { if (t[s + r.name]) { s += r.name, o = t[s]; continue } return t[s + r.parentName] ? t[s + r.parentName] : t[l + r.parentName] ? t[l + r.parentName] : t[l] } if (s += r.name, o = t[r.parentName], !o && (o = t[s], !o)) return null; o && (l += o.name) } return o } function C(e, t) { var n, i, r, o; if (0 === t.length) return -1; for (n = t[0], i = e.members, r = 0, o = i.length; o > r; r++) if (i[r].name == n.name) return r } function S(n, i) { if (!(0 > i)) { var r = { name: Ct, measure: !0, children: [e.extend({ members: [], dataIndex: n.dataIndex }, n.members[i])] }; n.members.splice(i, 1, r), n.dataIndex = t } } function T(e, t) { var n, i, r, o, a, s; if (1 > e.length) return []; for (n = [], i = {}, r = C(e[0], t), o = 0; e.length > o; o++) a = e[o], a.dataIndex = o, S(a, r), s = x(a, i), s ? s.children.push(0 > r || !s.measure ? a : a.members[r].children[0]) : n.push(a), k(a.members, i); return n } function D(e, t) { var n, i, r, o, a, s, l, c, d; if (!e || !e.length) return t; for (n = [], i = E(e), r = i.length, o = Math.max(t.length / r, 1), a = 0; r > a; a++) for (l = o * a, c = o * i[a], s = 0; o > s; s++) d = parseInt(c + s, 10), n[parseInt(l + s, 10)] = t[d] || { value: "", fmtValue: "", ordinal: d }; return n } function A(e, t) { var n, i, r, o, a, s, l, c; if (!e || !e.length) return t; for (n = [], i = E(e), r = i.length, o = Math.max(t.length / r, 1), s = 0; o > s; s++) for (l = r * s, a = 0; r > a; a++) c = i[a] + l, n[l + a] = t[c] || { value: "", fmtValue: "", ordinal: c }; return n } function E(e) { var n, i, r, o, a, s, l; for (e = e.slice(), n = [], i = e.shift(); i;) { for (i.dataIndex !== t && n.push(i.dataIndex), a = 0, r = 0, o = i.members.length; o > r; r++) l = i.members[r], s = l.children, l.measure ? [].splice.apply(e, [0, 0].concat(s)) : [].splice.apply(e, [a, 0].concat(s)), a += s.length; i = e.shift() } return n } function I(e) { var t = e.split("."); return t.length > 2 ? t[0] + "." + t[1] : e } function P(e, t) { var n = e.length - 1, i = e[n], r = M(t, i); return r && r.dir ? i = "ORDER(" + i + ".Children," + r.field + ".CurrentMember.MEMBER_CAPTION," + r.dir + ")" : i += ".Children", e[n] = i, e } function M(e, t) { for (var n = 0, i = e.length; i > n; n++) if (0 === t.indexOf(e[n].field)) return e[n]; return null } function z(e) { var t, n = "CROSSJOIN({"; return e.length > 2 ? (t = e.pop(), n += z(e)) : (n += e.shift(), t = e.pop()), n += "},{", n += t, n += "})" } function F(e, t) { var n = e.slice(0); return t.length > 1 && n.push("{" + R(t).join(",") + "}"), z(n) } function R(e) { for (var n, i = 0, r = e.length, o = []; r > i; i++) n = e[i], o.push(n.name !== t ? n.name : n); return o } function H(e) { return e = e.name || e, "[object Array]" === vt.call(e) && (e = e[e.length - 1]), e } function B(e) { for (var t = e.length, n = [], i = 0; t > i; i++) n.push(e[i].name[0]); return n } function L(e, t) { var n, i, r, o = 0, a = e.length, s = t.length; for (t = t.slice(0); a > o; o++) for (n = e[o], r = 0; s > r; r++) if (i = I(t[r]), -1 !== n.indexOf(i)) { t[r] = n; break } return { names: t, expandedIdx: r, uniquePath: t.slice(0, r + 1).join("") } } function N(e) { for (var t, n, i, r, o, a, s = [], l = [], c = [], d = 0, u = e.length; u > d; d++) if (t = e[d], r = t.name, a = !1, "[object Array]" !== vt.call(r) && (t.name = r = [r]), r.length > 1) l.push(t); else { for (o = I(r[0]), n = 0, i = c.length; i > n; n++) if (0 === c[n].name[0].indexOf(o)) { a = !0; break } a || c.push(t), t.expand && s.push(t) } return s = s.concat(l), { root: c, expanded: s } } function O(e, t, n) { var i, r, o, a, s, l, c, d, u = ""; if (e = e || [], i = N(e), r = i.root, o = B(r), a = [], i = i.expanded, s = i.length, l = 0, d = [], o.length > 1 || t.length > 1) { for (a.push(F(o, t)); s > l; l++) c = P(i[l].name, n), d = L(c, o).names, a.push(F(d, t)); u += a.join(",") } else { for (; s > l; l++) c = P(i[l].name, n), d.push(c[0]); u += o.concat(d).join(",") } return u } function V(e) { var t = "", n = e.value, i = e.field, r = e.operator; return "in" == r ? (t += "{", t += n, t += "}") : (t += "Filter(", t += i + ".MEMBERS", t += ht.format(q[r], i, n), t += ")"), t } function U(e, t) { var n, i, r = "", o = e.filters, a = o.length; for (i = a - 1; i >= 0; i--) n = "SELECT (", n += V(o[i]), n += ") ON 0", i == a - 1 ? (n += " FROM [" + t + "]", r = n) : r = n + " FROM ( " + r + " )"; return r } function W(e, t, n) { var i, r, o = ""; if (t) { o += "<" + e + ">"; for (r in t) i = t[r], n && (r = r.replace(/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g, "$1_").toUpperCase().replace(/_$/, "")), o += "<" + r + ">" + i + "</" + r + ">"; o += "</" + e + ">" } else o += "<" + e + "/>"; return o } function j(e) { if (null == e) return []; var t = vt.call(e); return "[object Array]" !== t ? [e] : e } function G(e) { var t, n, i, r, o = { tuples: [] }, a = j(ht.getter("Tuples.Tuple", !0)(e)), s = ht.getter("Caption['#text']"), l = ht.getter("UName['#text']"), c = ht.getter("LName['#text']"), d = ht.getter("LNum['#text']"), u = ht.getter("CHILDREN_CARDINALITY['#text']", !0), h = ht.getter("['@Hierarchy']"), p = ht.getter("PARENT_UNIQUE_NAME['#text']", !0); for (t = 0; a.length > t; t++) { for (n = [], i = j(a[t].Member), r = 0; i.length > r; r++) n.push({ children: [], caption: s(i[r]), name: l(i[r]), levelName: c(i[r]), levelNum: d(i[r]), hasChildren: parseInt(u(i[r]), 10) > 0, parentName: p(i[r]), hierarchy: h(i[r]) }); o.tuples.push({ members: n }) } return o } var q, $, Y, Q, K, X, Z, J, et, tt, nt, it, rt, ot, at, st, lt, ct, dt, ut, ht = window.kendo, pt = ht.ui, ft = ht.Class, gt = pt.Widget, mt = ht.data.DataSource, vt = {}.toString, _t = function(e) { return e }, wt = e.map, bt = e.extend, yt = ht.isFunction, kt = "change", xt = "error", Ct = "Measures", St = "progress", Tt = "stateReset", Dt = "auto", At = "<div/>", Et = ".kendoPivotGrid", It = "__row_total__", Pt = "dataBinding", Mt = "dataBound", zt = "expandMember", Ft = "collapseMember", Rt = "k-i-arrow-s", Ht = "k-i-arrow-e", Bt = "<span>#: data.member.caption || data.member.name #</span>", Lt = '<span class="k-icon k-i-kpi-#=data.dataItem.value > 0 ? "open" : data.dataItem.value < 0 ? "denied" : "hold"#">#:data.dataItem.value#</span>', Nt = '<span class="k-icon k-i-kpi-#=data.dataItem.value > 0 ? "increase" : data.dataItem.value < 0 ? "decrease" : "equal"#">#:data.dataItem.value#</span>', Ot = '#= data.dataItem ? kendo.htmlEncode(data.dataItem.fmtValue || data.dataItem.value) || " " : " " #', Vt = '<table class="k-pivot-layout"><tr><td><div class="k-pivot-rowheaders"></div></td><td><div class="k-pivot-table k-state-default"></div></td></tr></table>', Ut = { sum: function(e, t) { var n = t.accumulator; return d(n) ? d(e) && (n += e) : n = e, n }, count: function(e, t) { return (t.accumulator || 0) + 1 }, average: { aggregate: function(e, n) { var i = n.accumulator; return n.count === t && (n.count = 0), d(i) ? d(e) && (i += e) : i = e, d(e) && n.count++, i }, result: function(e) { var t = e.accumulator; return d(t) && (t /= e.count), t } }, max: function(e, t) { var n = t.accumulator; return d(n) || u(n) || (n = e), e > n && (d(e) || u(e)) && (n = e), n }, min: function(e, t) { var n = t.accumulator; return d(n) || u(n) || (n = e), n > e && (d(e) || u(e)) && (n = e), n } }, Wt = ft.extend({ init: function(e) { this.options = bt({}, this.options, e), this.dimensions = this._normalizeDescriptors("field", this.options.dimensions), this.measures = this._normalizeDescriptors("name", this.options.measures) }, _normalizeDescriptors: function(e, t) { var n, i, r, o; if (t = t || {}, n = {}, "[object Array]" === vt.call(t)) { for (r = 0, o = t.length; o > r; r++) i = t[r], "string" == typeof i ? n[i] = {} : i[e] && (n[i[e]] = i); t = n } return t }, _rootTuples: function(e, n) { var i, r, o, a, s = n.length || 1, l = this.dimensions || [], c = 0, d = e.length, u = [], h = []; if (d || n.length) { for (c = 0; s > c; c++) { for (i = { members: [] }, a = 0; d > a; a++) r = e[a], o = r.split("&"), i.members[i.members.length] = { children: [], caption: (l[r] || {}).caption || "All", name: r, levelName: r, levelNum: "0", hasChildren: !0, parentName: o.length > 1 ? o[0] : t, hierarchy: r }; s > 1 && (i.members[i.members.length] = { children: [], caption: n[c].caption, name: n[c].descriptor.name, levelName: "MEASURES", levelNum: "0", hasChildren: !1, parentName: t, hierarchy: "MEASURES" }), u[u.length] = i } h.push(It) } return { keys: h, tuples: u } }, _expandedTuples: function(e, n, i) { var r, o, a, s, l, c, d, u, h, p, f, g = i.length || 1, m = this.dimensions || [], v = [], _ = []; for (a in e) { for (s = e[a], d = this._findExpandedMember(n, s.uniquePath), l = v[d.index] || [], c = _[d.index] || [], u = d.member.names, r = 0; g > r; r++) { for (o = { members: [] }, f = 0; u.length > f; f++) f === d.member.expandedIdx ? (o.members[o.members.length] = { children: [], caption: s.value, name: s.name, hasChildren: !1, levelNum: 1, levelName: s.parentName + s.name, parentName: s.parentName, hierarchy: s.parentName + s.name }, 0 === r && c.push(at(o, f).join(""))) : (p = u[f], h = p.split("&"), o.members[o.members.length] = { children: [], caption: (m[p] || {}).caption || "All", name: p, levelName: p, levelNum: "0", hasChildren: !0, parentName: h.length > 1 ? h[0] : t, hierarchy: p }); g > 1 && (o.members[o.members.length] = { children: [], caption: i[r].caption, name: i[r].descriptor.name, levelName: "MEASURES", levelNum: "0", hasChildren: !0, parentName: t, hierarchy: "MEASURES" }), l[l.length] = o } v[d.index] = l, _[d.index] = c } return { keys: _, tuples: v } }, _findExpandedMember: function(e, t) { for (var n = 0; e.length > n; n++) if (e[n].uniquePath === t) return { member: e[n], index: n } }, _asTuples: function(e, t, n) { var i, r; return n = n || [], i = this._rootTuples(t.root, n), r = this._expandedTuples(e, t.expanded, n), { keys: [].concat.apply(i.keys, r.keys), tuples: [].concat.apply(i.tuples, r.tuples) } }, _measuresInfo: function(e, t) { for (var n, i, r = 0, o = e && e.length, a = [], s = {}, l = {}, c = this.measures || {}; o > r; r++) i = e[r].descriptor.name, n = c[i] || {}, a.push(i), n.result && (s[i] = n.result), n.format && (l[i] = n.format); return { names: a, formats: l, resultFuncs: s, rowAxis: t } }, _toDataArray: function(e, t, n, i) { var r, o, a, s, l, c, d, u, h, p, f = [], g = 1, m = [], v = n.length || 1, _ = i.length || 1; for (t.rowAxis ? (m = t.names, g = m.length) : p = t.names, a = 0; v > a; a++) for (d = e[n[a] || It], c = 0; g > c; c++) for (t.rowAxis && (p = [m[c]]), s = 0; _ > s; s++) for (h = i[s] || It, u = d.items[h], r = h === It ? d.aggregates : u ? u.aggregates : {}, l = 0; p.length > l; l++) o = p[l], this._addData(f, r[o], t.formats[o], t.resultFuncs[o]); return f }, _addData: function(e, t, n, i) { var r, o = ""; t && (t = i ? i(t) : t.accumulator, o = n ? ht.format(n, t) : t), r = e.length, e[r] = { ordinal: r, value: t || "", fmtValue: o } }, _matchDescriptors: function(e, n, i) { for (var r, o, a, s, l = n.names, c = n.expandedIdx; c > 0;) if (r = l[--c].split("&"), r.length > 1 && (o = r[0], a = r[1], s = i[o](e), s = s !== t && null !== s ? "" + s : s, s != a)) return !1; return !0 }, _calculateAggregate: function(e, t, n) { var i, r, o, a = {}; for (o = 0; e.length > o; o++) r = e[o].descriptor.name, i = n.aggregates[r] || {}, i.accumulator = e[o].aggregator(t, i), a[r] = i; return a }, _processColumns: function(e, n, i, r, o, a, s, l) { for (var c, d, u, h, p, f, g, m, v = o.dataItem, _ = 0; n.length > _; _++) d = n[_], this._matchDescriptors(v, d, i) && (m = d.names.slice(0, d.expandedIdx).join(""), f = d.names[d.expandedIdx], c = i[f](v), c = c !== t && null !== c ? "" + c : c, g = f, f = f + "&" + c, p = m + f, u = r[p] || { index: s.columnIndex, parentName: g, name: f, uniquePath: m + g, value: c }, h = a.items[p] || { aggregates: {} }, a.items[p] = { index: u.index, aggregates: this._calculateAggregate(e, o, h) }, l && (r[p] || s.columnIndex++, r[p] = u)) }, _measureAggregators: function(e) { var t, n, i, r, o, a, s = e.measures || [], l = this.measures || {}, d = []; if (s.length) { for (i = 0, r = s.length; r > i; i++) if (t = s[i], n = l[t.name], o = null, n) { if (a = n.aggregate, "string" == typeof a) { if (o = Ut[a.toLowerCase()], !o) throw Error("There is no such aggregate function"); n.aggregate = o.aggregate || o, n.result = o.result } d.push({ descriptor: t, caption: n.caption, result: n.result, aggregator: c(n) }) } } else d.push({ descriptor: { name: "default" }, caption: "default", aggregator: function() { return 1 } }); return d }, _normalizeName: function(e) { return -1 !== e.indexOf(" ") && (e = '["' + e + '"]'), e }, _buildGetters: function(e) { var t, n, i, r = {}; for (i = 0; e.length > i; i++) n = e[i], t = n.split("&"), t.length > 1 ? r[t[0]] = ht.getter(t[0], !0) : r[n] = ht.getter(this._normalizeName(n), !0); return r }, _parseDescriptors: function(e) { var t, n = N(e), i = B(n.root), r = n.expanded, o = []; for (t = 0; r.length > t; t++) o.push(L(r[t].name, i)); return { root: i, expanded: o } }, process: function(e, n) { var r, o, a, s, l, c, d, u, h, p, f, g, m, v, _, w, b, y, k, x, C, S, T, D, A, E, I, P, M, z; if (e = e || [], n = n || {}, r = n.measures || [], o = "rows" === n.measuresAxis, a = n.columns || [], s = n.rows || [], !a.length && s.length && (!r.length || r.length && o) && (a = s, s = [], o = !1), a.length || s.length || (o = !1), !a.length && r.length && (a = i(n.measures)), a = this._parseDescriptors(a), s = this._parseDescriptors(s), l = {}, c = {}, d = {}, h = { columnIndex: 0 }, p = this._measureAggregators(n), f = this._buildGetters(a.root), g = this._buildGetters(s.root), m = !1, v = a.expanded, _ = s.expanded, y = 0 !== _.length, M = e.length, z = 0, a.root.length || s.root.length) for (m = !0, z = 0; M > z; z++) for (w = e[z], b = { dataItem: w, index: z }, S = l[It] || { items: {}, aggregates: {} }, this._processColumns(p, v, f, c, b, S, h, !y), S.aggregates = this._calculateAggregate(p, b, S), l[It] = S, k = 0; _.length > k; k++) x = _[k], this._matchDescriptors(w, x, g) ? (D = x.names.slice(0, x.expandedIdx).join(""), C = x.names[x.expandedIdx], A = C, u = g[C](w), u = u !== t ? "" + u : u, C = C + "&" + u, T = D + C, d[T] = { uniquePath: D + A, parentName: A, name: C, value: u }, E = l[T] || { items: {}, aggregates: {} }, this._processColumns(p, v, f, c, b, E, h, !0), E.aggregates = this._calculateAggregate(p, b, E), l[T] = E) : this._processColumns(p, v, f, c, b, { items: {}, aggregates: {} }, h, !0); return m && M ? (!(p.length > 1) || n.columns && n.columns.length || (a = { root: [], expanded: [] }), I = this._asTuples(c, a, o ? [] : p), P = this._asTuples(d, s, o ? p : []), c = I.tuples, d = P.tuples, l = this._toDataArray(l, this._measuresInfo(p, o), P.keys, I.keys)) : l = c = d = [], { axes: { columns: { tuples: c }, rows: { tuples: d } }, data: l } } }), jt = ft.extend({ init: function(e, t) { this.transport = t, this.options = t.options || {}, this.transport.discover || yt(e.discover) && (this.discover = e.discover) }, read: function(e) { return this.transport.read(e) }, update: function(e) { return this.transport.update(e) }, create: function(e) { return this.transport.create(e) }, destroy: function(e) { return this.transport.destroy(e) }, discover: function(e) { return this.transport.discover ? this.transport.discover(e) : (e.success({}), t) }, catalog: function(n) { var i, r = this.options || {}; return n === t ? (r.connection || {}).catalog : (i = r.connection || {}, i.catalog = n, this.options.connection = i, e.extend(this.transport.options, { connection: i }), t) }, cube: function(e) { var n, i = this.options || {}; return e === t ? (i.connection || {}).cube : (n = i.connection || {}, n.cube = e, this.options.connection = n, bt(!0, this.transport.options, { connection: n }), t) } }), Gt = mt.extend({ init: function(t) { var r, o = ((t || {}).schema || {}).cube, a = "columns", s = { axes: _t, cubes: _t, catalogs: _t, measures: _t, dimensions: _t, hierarchies: _t, levels: _t, members: _t }; o && (s = e.extend(s, this._cubeSchema(o)), this.cubeBuilder = new Wt(o)), mt.fn.init.call(this, bt(!0, {}, { schema: s }, t)), this.transport = new jt(this.options.transport || {}, this.transport), this._columns = i(this.options.columns), this._rows = i(this.options.rows), r = this.options.measures || [], "[object Object]" === vt.call(r) && (a = r.axis || "columns", r = r.values || []), this._measures = n(r), this._measuresAxis = a, this._skipNormalize = 0, this._axes = {} }, _cubeSchema: function(e) { return { dimensions: function() { var t, n = [], i = e.dimensions; for (t in i) n.push({ name: t, caption: i[t].caption || t, uniqueName: t, defaultHierarchy: t, type: 1 }); return e.measures && n.push({ name: Ct, caption: Ct, uniqueName: Ct, type: 2 }), n }, hierarchies: function() { return [] }, measures: function() { var t, n = [], i = e.measures; for (t in i) n.push({ name: t, caption: t, uniqueName: t, aggregator: t }); return n } } }, options: { serverSorting: !0, serverPaging: !0, serverFiltering: !0, serverGrouping: !0, serverAggregates: !0 }, catalog: function(e) { return e === t ? this.transport.catalog() : (this.transport.catalog(e), this._mergeState({}), this._axes = {}, this.data([]), t) }, cube: function(e) { return e === t ? this.transport.cube() : (this.transport.cube(e), this._axes = {}, this._mergeState({}), this.data([]), t) }, axes: function() { return this._axes }, columns: function(e) { return e === t ? this._columns : (this._skipNormalize += 1, this._clearAxesData = !0, this._columns = i(e), this.query({ columns: e, rows: this.rowsAxisDescriptors(), measures: this.measures() }), t) }, rows: function(e) { return e === t ? this._rows : (this._skipNormalize += 1, this._clearAxesData = !0, this._rows = i(e), this.query({ columns: this.columnsAxisDescriptors(), rows: e, measures: this.measures() }), t) }, measures: function(e) { return e === t ? this._measures : (this._skipNormalize += 1, this._clearAxesData = !0, this.query({ columns: this.columnsAxisDescriptors(), rows: this.rowsAxisDescriptors(), measures: n(e) }), t) }, measuresAxis: function() { return this._measuresAxis || "columns" }, _expandPath: function(e, t) { var n, r, o, a = "columns" === t ? "columns" : "rows", s = "columns" === t ? "rows" : "columns", c = i(e), d = H(c[c.length - 1]); for (this._lastExpanded = a, c = l(this.axes()[a], c, this.measures()), n = 0; c.length > n; n++) if (r = H(c[n]), r === d) { if (c[n].expand) return; c[n].expand = !0 } else c[n].expand = !1; o = {}, o[a] = c, o[s] = this._descriptorsForAxis(s), this._query(o) }, _descriptorsForAxis: function(e) { var t = this.axes(), n = this[e]() || []; return t && t[e] && t[e].tuples && t[e].tuples[0] && (n = o(t[e].tuples || [])), n }, columnsAxisDescriptors: function() { return this._descriptorsForAxis("columns") }, rowsAxisDescriptors: function() { return this._descriptorsForAxis("rows") }, _process: function(e, t) { this._view = e, t = t || {}, t.items = t.items || this._view, this.trigger(kt, t) }, _query: function(e) { var t = this; return e || (this._skipNormalize += 1, this._clearAxesData = !0), t.query(bt({}, { page: t.page(), pageSize: t.pageSize(), sort: t.sort(), filter: t.filter(), group: t.group(), aggregate: t.aggregate(), columns: this.columnsAxisDescriptors(), rows: this.rowsAxisDescriptors(), measures: this.measures() }, e)) }, query: function(t) { var n = this._mergeState(t); return this._data.length && this.cubeBuilder ? (this._params(n), this._updateLocalData(this._pristineData), e.Deferred().resolve().promise()) : this.read(n) }, _mergeState: function(e) { return e = mt.fn._mergeState.call(this, e), e !== t && (this._measures = n(e.measures), e.columns ? e.columns = i(e.columns) : e.columns || (this._columns = []), e.rows ? e.rows = i(e.rows) : e.rows || (this._rows = [])), e }, filter: function(e) { return e === t ? this._filter : (this._skipNormalize += 1, this._clearAxesData = !0, this._query({ filter: e, page: 1 }), t) }, expandColumn: function(e) { this._expandPath(e, "columns") }, expandRow: function(e) { this._expandPath(e, "rows") }, success: function(e) { var t; this.cubeBuilder && (t = (this.reader.data(e) || []).slice(0)), mt.fn.success.call(this, e), t && (this._pristineData = t) }, _processResult: function(e, t) { var n, i, r, o, a, s, l, c, d, u, g; return this.cubeBuilder && (n = this.cubeBuilder.process(e, this._requestData), e = n.data, t = n.axes), c = this.columns(), d = this.rows(), u = t.columns && t.columns.tuples, c.length || !d.length || !u || !this._rowMeasures().length && this.measures().length || (t = { columns: {}, rows: t.columns }), c.length || d.length || "rows" !== this.measuresAxis() || !u || (t = { columns: {}, rows: t.columns }), this._axes = { columns: v(this._axes.columns), rows: v(this._axes.rows) }, t = { columns: v(t.columns), rows: v(t.rows) }, i = this._normalizeTuples(t.columns.tuples, this._axes.columns.tuples, c, this._columnMeasures()), r = this._normalizeTuples(t.rows.tuples, this._axes.rows.tuples, d, this._rowMeasures()), this._skipNormalize -= 1, this.cubeBuilder || (e = this._normalizeData({ columnsLength: t.columns.tuples.length, rowsLength: t.rows.tuples.length, columnIndexes: i, rowIndexes: r, data: e })), "rows" == this._lastExpanded ? (o = t.columns.tuples, s = this._columnMeasures(), a = h(t.columns, this._axes.columns, s), a && (l = "columns", t.columns = a, p(o, a.tuples, t.rows.tuples.length, s, e), this.cubeBuilder || (e = this._normalizeData({ columnsLength: m(t.columns.tuples, s), rowsLength: t.rows.tuples.length, data: e })))) : "columns" == this._lastExpanded && (o = t.rows.tuples, s = this._rowMeasures(), a = h(t.rows, this._axes.rows, s), a && (l = "rows", t.rows = a, f(o, a.tuples, t.columns.tuples.length, s, e), this.cubeBuilder || (e = this._normalizeData({ columnsLength: m(t.rows.tuples, s), rowsLength: t.columns.tuples.length, data: e })))), this._lastExpanded = null, g = this._mergeAxes(t, e, l), this._axes = g.axes, g.data }, _readData: function(e) { var t = this.reader.axes(e), n = this.reader.data(e); return this._processResult(n, t) }, _createTuple: function(e, t, n) { var i, r, o, a, s, l, c, d, u = e.members, h = u.length, p = { members: [] }, f = 0; for (t && (h -= 1); h > f; f++) d = u[f], r = +d.levelNum, o = d.name, a = d.parentName, c = d.caption || o, s = d.hasChildren, l = d.hierarchy, i = d.levelName, n && (c = "All", 0 === r ? a = d.name : r -= 1, s = !0, o = l = i = a), p.members.push({ name: o, children: [], caption: c, levelName: i, levelNum: "" + r, hasChildren: s, hierarchy: l, parentName: n ? "" : a }); return t && p.members.push({ name: t.name, children: [] }), p }, _hasRoot: function(e, t, n) { var i, r, o, a, s, l, c; if (t.length) return y(t, e).tuple; for (i = e.members, a = !0, l = 0, c = i.length; c > l; l++) if (r = i[l], s = +r.levelNum || 0, o = n[l], !(0 === s || o && r.name === H(o))) { a = !1; break } return a }, _mergeAxes: function(e, t, n) { var i, r, o, a, s, l = this._columnMeasures(), c = this._rowMeasures(), d = this.axes(), u = e.rows.tuples.length, h = m(d.columns.tuples, l), p = e.columns.tuples.length; return "columns" == n ? (p = h, r = e.columns.tuples) : (r = T(e.columns.tuples, l), t = A(r, t)), o = w(d.columns.tuples, r, l), "rows" == n ? (u = m(e.rows.tuples, c), r = e.rows.tuples) : (r = T(e.rows.tuples, c), t = D(r, t)), a = w(d.rows.tuples, r, c), d.columns.tuples = o.tuples, d.rows.tuples = a.tuples, h !== m(d.columns.tuples, l) ? (i = o.index + _(o.parsedRoot, o.memberIndex, l), s = h + p, t = this._mergeColumnData(t, i, u, p, s)) : (i = a.index + _(a.parsedRoot, a.memberIndex, c), t = this._mergeRowData(t, i, u, p)), { axes: d, data: t } }, _mergeColumnData: function(e, t, n, i, r) { var o, a, s, l = this.data().toJSON(), c = 0, d = Math.max(this._columnMeasures().length, 1); for (n = Math.max(n, 1), l.length > 0 && (c = d, r -= d), o = 0; n > o; o++) a = t + o * r, s = e.splice(0, i), s.splice(0, c), [].splice.apply(l, [a, 0].concat(s)); return l }, _mergeRowData: function(e, t, n, i) { var r, o, a, s = this.data().toJSON(), l = Math.max(this._rowMeasures().length, 1); for (i = Math.max(i, 1), s.length > 0 && (n -= l, e.splice(0, i * l)), r = 0; n > r; r++) a = e.splice(0, i), o = t * i + r * i, [].splice.apply(s, [o, 0].concat(a)); return s }, _columnMeasures: function() { var e = this.measures(), t = []; return "columns" === this.measuresAxis() && (0 === this.columns().length ? t = e : e.length > 1 && (t = e)), t }, _rowMeasures: function() { var e = this.measures(), t = []; return "rows" === this.measuresAxis() && (0 === this.rows().length ? t = e : e.length > 1 && (t = e)), t }, _updateLocalData: function(e, t) { this.cubeBuilder && (t && (this._requestData = t), e = this._processResult(e)), this._data = this._observe(e), this._ranges = [], this._addRange(this._data), this._total = this._data.length, this._pristineTotal = this._total, this._process(this._data) }, data: function(e) { var n = this; return e === t ? n._data : (this._pristineData = e.slice(0), this._updateLocalData(e, { columns: this.columns(), rows: this.rows(), measures: this.measures() }), t) }, _normalizeTuples: function(e, t, n, i) { var r, o, a, s = i.length || 1, l = 0, c = [], d = {}, u = 0; if (e.length) { if (0 >= this._skipNormalize && !this._hasRoot(e[0], t, n)) { for (this._skipNormalize = 0; s > l; l++) c.push(this._createTuple(e[0], i[l], !0)), d[l] = l; e.splice.apply(e, [0, e.length].concat(c).concat(e)), l = s } if (i.length) for (a = r = e[l], o = r.members.length - 1; r;) { if (u >= s && (u = 0), r.members[o].name !== i[u].name && (e.splice(l, 0, this._createTuple(r, i[u])), d[l] = l), l += 1, u += 1, r = e[l], s > u && (!r || st(a, o - 1) !== st(r, o - 1))) { for (; s > u; u++) e.splice(l, 0, this._createTuple(a, i[u])), d[l] = l, l += 1; r = e[l] } a = r } return d } }, _normalizeData: function(e) { var n, i, r = e.data, o = e.columnIndexes || {}, a = e.rowIndexes || {}, s = e.columnsLength || 1, l = s * (e.rowsLength || 1), c = 0, d = 0, u = 0, h = Array(l); if (r.length === l) return r; for (; l > c; c++) { for (; a[parseInt(c / s, 10)] !== t;) for (i = 0; s > i; i++) h[c] = { value: "", fmtValue: "", ordinal: c }, c += 1; for (; o[c % s] !== t;) h[c] = { value: "", fmtValue: "", ordinal: c }, c += 1; if (n = r[d]) { if (n.ordinal - u > 1) for (u += 1; n.ordinal > u; u++) h[c] = { value: "", fmtValue: "", ordinal: c }, c += 1; u = n.ordinal, n.ordinal = c, h[c] = n, d += 1 } else h[c] = { value: "", fmtValue: "", ordinal: c } } return h }, discover: function(t, n) { var i = this, r = i.transport; return e.Deferred(function(e) { r.discover(bt({ success: function(t) { t = i.reader.parse(t), i._handleCustomErrors(t) || (n && (t = n(t)), e.resolve(t)) }, error: function(t, n, r) { e.reject(t), i.error(t, n, r) } }, t)) }).promise().done(function() { i.trigger("schemaChange") }) }, schemaMeasures: function() { var e = this; return e.discover({ data: { command: "schemaMeasures", restrictions: { catalogName: e.transport.catalog(), cubeName: e.transport.cube() } } }, function(t) { return e.reader.measures(t) }) }, schemaKPIs: function() { var e = this; return e.discover({ data: { command: "schemaKPIs", restrictions: { catalogName: e.transport.catalog(), cubeName: e.transport.cube() } } }, function(t) { return e.reader.kpis(t) }) }, schemaDimensions: function() { var e = this; return e.discover({ data: { command: "schemaDimensions", restrictions: { catalogName: e.transport.catalog(), cubeName: e.transport.cube() } } }, function(t) { return e.reader.dimensions(t) }) }, schemaHierarchies: function(e) { var t = this; return t.discover({ data: { command: "schemaHierarchies", restrictions: { catalogName: t.transport.catalog(), cubeName: t.transport.cube(), dimensionUniqueName: e } } }, function(e) { return t.reader.hierarchies(e) }) }, schemaLevels: function(e) { var t = this; return t.discover({ data: { command: "schemaLevels", restrictions: { catalogName: t.transport.catalog(), cubeName: t.transport.cube(), hierarchyUniqueName: e } } }, function(e) { return t.reader.levels(e) }) }, schemaCubes: function() { var e = this; return e.discover({ data: { command: "schemaCubes", restrictions: { catalogName: e.transport.catalog() } } }, function(t) { return e.reader.cubes(t) }) }, schemaCatalogs: function() { var e = this; return e.discover({ data: { command: "schemaCatalogs" } }, function(t) { return e.reader.catalogs(t) }) }, schemaMembers: function(e) { var t = this; return t.discover({ data: { command: "schemaMembers", restrictions: bt({ catalogName: t.transport.catalog(), cubeName: t.transport.cube() }, e) } }, function(e) { return t.reader.members(e) }) }, _params: function(e) { this._clearAxesData && (this._axes = {}, this._data = this._observe([]), this._clearAxesData = !1, this.trigger(Tt)); var t = mt.fn._params.call(this, e); return t = bt({ measures: this.measures(), measuresAxis: this.measuresAxis(), columns: this.columns(), rows: this.rows() }, t), this.cubeBuilder && (this._requestData = t), t } }); Gt.create = function(e) { e = e && e.push ? { data: e } : e; var t = e || {}, n = t.data; if (t.data = n, !(t instanceof Gt) && t instanceof ht.data.DataSource) throw Error("Incorrect DataSource type. Only PivotDataSource instances are supported"); return t instanceof Gt ? t : new Gt(t) }, q = { contains: ', InStr({0}.CurrentMember.MEMBER_CAPTION,"{1}") > 0', doesnotcontain: ', InStr({0}.CurrentMember.MEMBER_CAPTION,"{1}") = 0', startswith: ', Left({0}.CurrentMember.MEMBER_CAPTION,Len("{1}"))="{1}"', endswith: ', Right({0}.CurrentMember.MEMBER_CAPTION,Len("{1}"))="{1}"', eq: ', {0}.CurrentMember.MEMBER_CAPTION = "{1}"', neq: ', NOT {0}.CurrentMember.MEMBER_CAPTION = "{1}"' }, $ = { schemaCubes: "MDSCHEMA_CUBES", schemaCatalogs: "DBSCHEMA_CATALOGS", schemaMeasures: "MDSCHEMA_MEASURES", schemaDimensions: "MDSCHEMA_DIMENSIONS", schemaHierarchies: "MDSCHEMA_HIERARCHIES", schemaLevels: "MDSCHEMA_LEVELS", schemaMembers: "MDSCHEMA_MEMBERS", schemaKPIs: "MDSCHEMA_KPIS" }, Y = { read: function(e) { var t, n, i, r, o, a = '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Header/><Body><Execute xmlns="urn:schemas-microsoft-com:xml-analysis"><Command><Statement>'; return a += "SELECT NON EMPTY {", t = e.columns || [], n = e.rows || [], i = e.measures || [], r = "rows" === e.measuresAxis, o = e.sort || [], !t.length && n.length && (!i.length || i.length && r) && (t = n, n = [], r = !1), t.length || n.length || (r = !1), t.length ? a += O(t, r ? [] : i, o) : i.length && !r && (a += R(i).join(",")), a += "} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS", (n.length || r && i.length > 1) && (a += ", NON EMPTY {", a += n.length ? O(n, r ? i : [], o) : R(i).join(","), a += "} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS"), e.filter ? (a += " FROM ", a += "(", a += U(e.filter, e.connection.cube), a += ")") : a += " FROM [" + e.connection.cube + "]", 1 == i.length && t.length && (a += " WHERE (" + R(i).join(",") + ")"), a += "</Statement></Command><Properties><PropertyList><Catalog>" + e.connection.catalog + "</Catalog><Format>Multidimensional</Format></PropertyList></Properties></Execute></Body></Envelope>", a.replace(/\&/g, "&") }, discover: function(t) { t = t || {}; var n = '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Header/><Body><Discover xmlns="urn:schemas-microsoft-com:xml-analysis">'; return n += "<RequestType>" + ($[t.command] || t.command) + "</RequestType>", n += "<Restrictions>" + W("RestrictionList", t.restrictions, !0) + "</Restrictions>", t.connection && t.connection.catalog && (t.properties = e.extend({}, { Catalog: t.connection.catalog }, t.properties)), n += "<Properties>" + W("PropertyList", t.properties) + "</Properties>", n += "</Discover></Body></Envelope>" } }, Q = ht.data.RemoteTransport.extend({ init: function(e) { var t = e; e = this.options = bt(!0, {}, this.options, e), ht.data.RemoteTransport.call(this, e), yt(t.discover) ? this.discover = t.discover : "string" == typeof t.discover ? this.options.discover = { url: t.discover } : t.discover || (this.options.discover = this.options.read) }, setup: function(t, n) { return t.data = t.data || {}, e.extend(!0, t.data, { connection: this.options.connection }), ht.data.RemoteTransport.fn.setup.call(this, t, n) }, options: { read: { dataType: "text", contentType: "text/xml", type: "POST" }, discover: { dataType: "text", contentType: "text/xml", type: "POST" }, parameterMap: function(e, t) { return Y[t](e, t) } }, discover: function(t) { return e.ajax(this.setup(t, "discover")) } }), K = { cubes: { name: ht.getter("CUBE_NAME['#text']", !0), caption: ht.getter("CUBE_CAPTION['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0), type: ht.getter("CUBE_TYPE['#text']", !0) }, catalogs: { name: ht.getter("CATALOG_NAME['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0) }, measures: { name: ht.getter("MEASURE_NAME['#text']", !0), caption: ht.getter("MEASURE_CAPTION['#text']", !0), uniqueName: ht.getter("MEASURE_UNIQUE_NAME['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0), aggregator: ht.getter("MEASURE_AGGREGATOR['#text']", !0), groupName: ht.getter("MEASUREGROUP_NAME['#text']", !0), displayFolder: ht.getter("MEASURE_DISPLAY_FOLDER['#text']", !0), defaultFormat: ht.getter("DEFAULT_FORMAT_STRING['#text']", !0) }, kpis: { name: ht.getter("KPI_NAME['#text']", !0), caption: ht.getter("KPI_CAPTION['#text']", !0), value: ht.getter("KPI_VALUE['#text']", !0), goal: ht.getter("KPI_GOAL['#text']", !0), status: ht.getter("KPI_STATUS['#text']", !0), trend: ht.getter("KPI_TREND['#text']", !0), statusGraphic: ht.getter("KPI_STATUS_GRAPHIC['#text']", !0), trendGraphic: ht.getter("KPI_TREND_GRAPHIC['#text']", !0), description: ht.getter("KPI_DESCRIPTION['#text']", !0), groupName: ht.getter("MEASUREGROUP_NAME['#text']", !0) }, dimensions: { name: ht.getter("DIMENSION_NAME['#text']", !0), caption: ht.getter("DIMENSION_CAPTION['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0), uniqueName: ht.getter("DIMENSION_UNIQUE_NAME['#text']", !0), defaultHierarchy: ht.getter("DEFAULT_HIERARCHY['#text']", !0), type: ht.getter("DIMENSION_TYPE['#text']", !0) }, hierarchies: { name: ht.getter("HIERARCHY_NAME['#text']", !0), caption: ht.getter("HIERARCHY_CAPTION['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0), uniqueName: ht.getter("HIERARCHY_UNIQUE_NAME['#text']", !0), dimensionUniqueName: ht.getter("DIMENSION_UNIQUE_NAME['#text']", !0), displayFolder: ht.getter("HIERARCHY_DISPLAY_FOLDER['#text']", !0), origin: ht.getter("HIERARCHY_ORIGIN['#text']", !0), defaultMember: ht.getter("DEFAULT_MEMBER['#text']", !0) }, levels: { name: ht.getter("LEVEL_NAME['#text']", !0), caption: ht.getter("LEVEL_CAPTION['#text']", !0), description: ht.getter("DESCRIPTION['#text']", !0), uniqueName: ht.getter("LEVEL_UNIQUE_NAME['#text']", !0), dimensionUniqueName: ht.getter("DIMENSION_UNIQUE_NAME['#text']", !0), displayFolder: ht.getter("LEVEL_DISPLAY_FOLDER['#text']", !0), orderingProperty: ht.getter("LEVEL_ORDERING_PROPERTY['#text']", !0), origin: ht.getter("LEVEL_ORIGIN['#text']", !0), hierarchyUniqueName: ht.getter("HIERARCHY_UNIQUE_NAME['#text']", !0) }, members: { name: ht.getter("MEMBER_NAME['#text']", !0), caption: ht.getter("MEMBER_CAPTION['#text']", !0), uniqueName: ht.getter("MEMBER_UNIQUE_NAME['#text']", !0), dimensionUniqueName: ht.getter("DIMENSION_UNIQUE_NAME['#text']", !0), hierarchyUniqueName: ht.getter("HIERARCHY_UNIQUE_NAME['#text']", !0), levelUniqueName: ht.getter("LEVEL_UNIQUE_NAME['#text']", !0), childrenCardinality: ht.getter("CHILDREN_CARDINALITY['#text']", !0) } }, X = ["axes", "catalogs", "cubes", "dimensions", "hierarchies", "levels", "measures"], Z = ht.data.XmlDataReader.extend({ init: function(e) { ht.data.XmlDataReader.call(this, e), this._extend(e) }, _extend: function(e) { for (var t, n, i = 0, r = X.length; r > i; i++) t = X[i], n = e[t], n && n !== _t && (this[t] = n) }, parse: function(e) { var t = ht.data.XmlDataReader.fn.parse(e.replace(/<(\/?)(\w|-)+:/g, "<$1")); return ht.getter("['Envelope']['Body']", !0)(t) }, errors: function(e) { var t = ht.getter("['Fault']", !0)(e); return t ? [{ faultstring: ht.getter("faultstring['#text']", !0)(t), faultcode: ht.getter("faultcode['#text']", !0)(t) }] : null }, axes: function(e) { var t, n, i, r; for (e = ht.getter('ExecuteResponse["return"].root', !0)(e), t = j(ht.getter("Axes.Axis", !0)(e)), i = { columns: {}, rows: {} }, r = 0; t.length > r; r++) n = t[r], "sliceraxis" !== n["@name"].toLowerCase() && (i.columns.tuples ? i.rows = G(n) : i.columns = G(n)); return i }, data: function(e) { var t, n, i, r, o, a; for (e = ht.getter('ExecuteResponse["return"].root', !0)(e), t = j(ht.getter("CellData.Cell", !0)(e)), n = [], i = ht.getter("['@CellOrdinal']"), r = ht.getter("Value['#text']"), o = ht.getter("FmtValue['#text']"), a = 0; t.length > a; a++) n.push({ value: r(t[a]), fmtValue: o(t[a]), ordinal: parseInt(i(t[a]), 10) }); return n }, _mapSchema: function(e, t) { var n, i, r, o, a; for (e = ht.getter('DiscoverResponse["return"].root', !0)(e), n = j(ht.getter("row", !0)(e)), i = [], r = 0; n.length > r; r++) { o = {}; for (a in t) o[a] = t[a](n[r]); i.push(o) } return i }, measures: function(e) { return this._mapSchema(e, K.measures) }, kpis: function(e) { return this._mapSchema(e, K.kpis) }, hierarchies: function(e) { return this._mapSchema(e, K.hierarchies) }, levels: function(e) { return this._mapSchema(e, K.levels) }, dimensions: function(e) { return this._mapSchema(e, K.dimensions) }, cubes: function(e) { return this._mapSchema(e, K.cubes) }, catalogs: function(e) { return this._mapSchema(e, K.catalogs) }, members: function(e) { return this._mapSchema(e, K.members) } }), bt(!0, ht.data, { PivotDataSource: Gt, XmlaTransport: Q, XmlaDataReader: Z, PivotCubeBuilder: Wt, transports: { xmla: Q }, readers: { xmla: Z } }), J = function(e, t) { if (!e) return null; for (var n = 0, i = e.length; i > n; n++) if (e[n].field === t) return e[n]; return null }, et = function(e, t) { var n, i, r = []; for (n = 0, i = e.length; i > n; n++) e[n].field !== t && r.push(e[n]); return r }, ht.ui.PivotSettingTarget = gt.extend({ init: function(t, n) { var i = this; gt.fn.init.call(i, t, n), i.element.addClass("k-pivot-setting"), i.dataSource = ht.data.PivotDataSource.create(n.dataSource), i._refreshHandler = e.proxy(i.refresh, i), i.dataSource.first(kt, i._refreshHandler), n.template || (i.options.template = "<div data-" + ht.ns + 'name="${data.name || data}">${data.name || data}' + (i.options.enabled ? '<a class="k-button k-button-icon k-button-bare"><span class="k-icon k-setting-delete"></span></a>' : "") + "</div>"), i.template = ht.template(i.options.template), i.emptyTemplate = ht.template(i.options.emptyTemplate), i._sortable(), i.element.on("click" + Et, ".k-button,.k-item", function(t) { var n = e(t.target), r = n.closest("[" + ht.attr("name") + "]").attr(ht.attr("name")); r && (n.hasClass("k-setting-delete") ? i.remove(r) : i.options.sortable && n[0] === t.currentTarget && i.sort({ field: r, dir: n.find(".k-i-sort-asc")[0] ? "desc" : "asc" })) }), (n.filterable || n.sortable) && (i.fieldMenu = new pt.PivotFieldMenu(i.element, { messages: i.options.messages.fieldMenu, filter: ".k-setting-fieldmenu", filterable: n.filterable, sortable: n.sortable, dataSource: i.dataSource })), i.refresh() }, options: { name: "PivotSettingTarget", template: null, filterable: !1, sortable: !1, emptyTemplate: "<div class='k-empty'>${data}</div>", setting: "columns", enabled: !0, messages: { empty: "Drop Fields Here" } }, setDataSource: function(e) { this.dataSource.unbind(kt, this._refreshHandler), this.dataSource = this.options.dataSource = e, this.fieldMenu && this.fieldMenu.setDataSource(e), e.first(kt, this._refreshHandler), this.refresh() }, _sortable: function() { var e = this; e.options.enabled && (this.sortable = this.element.kendoSortable({ connectWith: this.options.connectWith, filter: ">:not(.k-empty)", hint: e.options.hint, cursor: "move", start: function(e) { e.item.focus().blur() }, change: function(t) { var n = t.item.attr(ht.attr("name")); "receive" == t.action ? e.add(n) : "remove" == t.action ? e.remove(n) : "sort" == t.action && e.move(n, t.newIndex) } }).data("kendoSortable")) }, _indexOf: function(e, t) { var n, i, r = -1; for (n = 0, i = t.length; i > n; n++) if (H(t[n]) === e) { r = n; break } return r }, _isKPI: function(e) { return "kpi" === e.type || e.measure }, validate: function(e) { var t, n, i = 2 == e.type || "aggregator" in e || this._isKPI(e); return i ? "measures" === this.options.setting : "measures" === this.options.setting ? i : (t = this.dataSource[this.options.setting](), n = e.defaultHierarchy || e.uniqueName, this._indexOf(n, t) > -1 ? !1 : (t = this.dataSource["columns" === this.options.setting ? "rows" : "columns"](), this._indexOf(n, t) > -1 ? !1 : !0)) }, add: function(t) { var n, i, r = this.dataSource[this.options.setting](); for (t = e.isArray(t) ? t.slice(0) : [t], n = 0, i = t.length; i > n; n++) - 1 !== this._indexOf(t[n], r) && (t.splice(n, 1), n -= 1, i -= 1); t.length && (r = r.concat(t), this.dataSource[this.options.setting](r)) }, move: function(e, t) { var n = this.dataSource[this.options.setting](), i = this._indexOf(e, n); i > -1 && (e = n.splice(i, 1)[0], n.splice(t, 0, e), this.dataSource[this.options.setting](n)) }, remove: function(e) { var t = this.dataSource[this.options.setting](), n = this._indexOf(e, t); n > -1 && (t.splice(n, 1), this.dataSource[this.options.setting](t)) }, sort: function(e) { var t = this.options.sortable, n = t === !0 || t.allowUnsort, i = n && "asc" === e.dir, r = this.dataSource.sort() || [], o = et(r, e.field); i && r.length !== o.length && (e = null), e && o.push(e), this.dataSource.sort(o) }, refresh: function() { var e, n = "", i = this.dataSource[this.options.setting](), r = i.length, o = 0; if (r) for (; r > o; o++) e = i[o], e = e.name === t ? { name: e } : e, n += this.template(bt({ sortIcon: this._sortIcon(e.name) }, e)); else n = this.emptyTemplate(this.options.messages.empty); this.element.html(n) }, destroy: function() { gt.fn.destroy.call(this), this.dataSource.unbind(kt, this._refreshHandler), this.element.off(Et), this.sortable && this.sortable.destroy(), this.fieldMenu && this.fieldMenu.destroy(), this.element = null, this._refreshHandler = null }, _sortIcon: function(e) { var t = this.dataSource.sort(), n = J(t, H(e)), i = ""; return n && (i = "k-i-sort-" + n.dir), i } }), tt = gt.extend({ init: function(n, i) { var r, o, a = this; gt.fn.init.call(a, n, i), a._dataSource(), a._bindConfigurator(), a._wrapper(), a._createLayout(), a._columnBuilder = r = new lt, a._rowBuilder = o = new ct, a._contentBuilder = new dt, a._templates(), a.columnsHeader.add(a.rowsHeader).on("click", "span.k-icon", function() { var n, i, s, l, c = e(this), d = r, u = "expandColumn", h = c.attr(ht.attr("path")), p = { axis: "columns", path: e.parseJSON(h) }; c.parent().is("td") && (d = o, u = "expandRow", p.axis = "rows"), i = c.hasClass(Rt), s = d.metadata[h], l = s.expanded === t, n = i ? Ft : zt, a.trigger(n, p) || (d.metadata[h].expanded = !i, c.toggleClass(Rt, !i).toggleClass(Ht, i), !i && l ? a.dataSource[u](p.path) : a.refresh()) }), a._scrollable(), a.options.autoBind && a.dataSource.fetch(), ht.notify(a) }, events: [Pt, Mt, zt, Ft], options: { name: "PivotGrid", autoBind: !0, reorderable: !0, filterable: !1, sortable: !1, height: null, columnWidth: 100, configurator: "", columnHeaderTemplate: null, rowHeaderTemplate: null, dataCellTemplate: null, kpiStatusTemplate: null, kpiTrendTemplate: null, messages: { measureFields: "Drop Data Fields Here", columnFields: "Drop Column Fields Here", rowFields: "Drop Rows Fields Here" } }, _templates: function() { var e = this.options.columnHeaderTemplate, t = this.options.rowHeaderTemplate, n = this.options.dataCellTemplate, i = this.options.kpiStatusTemplate, r = this.options.kpiTrendTemplate; this._columnBuilder.template = ht.template(e || Bt, { useWithBlock: !!e }), this._contentBuilder.dataTemplate = ht.template(n || Ot, { useWithBlock: !!n }), this._contentBuilder.kpiStatusTemplate = ht.template(i || Lt, { useWithBlock: !!i }), this._contentBuilder.kpiTrendTemplate = ht.template(r || Nt, { useWithBlock: !!r }), this._rowBuilder.template = ht.template(t || Bt, { useWithBlock: !!t }) }, _bindConfigurator: function() { var t = this.options.configurator; t && e(t).kendoPivotConfigurator("setDataSource", this.dataSource) }, cellInfoByElement: function(t) { return t = e(t), this.cellInfo(t.index(), t.parent("tr").index()) }, cellInfo: function(e, t) { var n, i = this._contentBuilder, r = i.columnIndexes[e || 0], o = i.rowIndexes[t || 0]; return r && o ? (n = o.index * i.rowLength + r.index, { columnTuple: r.tuple, rowTuple: o.tuple, measure: r.measure || o.measure, dataItem: this.dataSource.view()[n] }) : null }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.measuresTarget && this.measuresTarget.setDataSource(e), this.rowsTarget && this.rowsTarget.setDataSource(e), this.columnsTarget && this.columnsTarget.setDataSource(e), this._bindConfigurator(), this.options.autoBind && e.fetch() }, setOptions: function(e) { gt.fn.setOptions.call(this, e), this._templates() }, _dataSource: function() { var t = this, n = t.options.dataSource; n = e.isArray(n) ? { data: n } : n, t.dataSource && this._refreshHandler ? t.dataSource.unbind(kt, t._refreshHandler).unbind(Tt, t._stateResetHandler).unbind(St, t._progressHandler).unbind(xt, t._errorHandler) : (t._refreshHandler = e.proxy(t.refresh, t), t._progressHandler = e.proxy(t._requestStart, t), t._stateResetHandler = e.proxy(t._stateReset, t), t._errorHandler = e.proxy(t._error, t)), t.dataSource = ht.data.PivotDataSource.create(n).bind(kt, t._refreshHandler).bind(St, t._progressHandler).bind(Tt, t._stateResetHandler).bind(xt, t._errorHandler) }, _error: function() { this._progress(!1) }, _requestStart: function() { this._progress(!0) }, _stateReset: function() { this._columnBuilder.reset(), this._rowBuilder.reset() }, _wrapper: function() { var e = this.options.height; this.wrapper = this.element.addClass("k-widget k-pivot"), e && this.wrapper.css("height", e) }, _measureFields: function() { this.measureFields = e(At).addClass("k-pivot-toolbar k-header k-settings-measures"), this.measuresTarget = this._createSettingTarget(this.measureFields, { setting: "measures", messages: { empty: this.options.messages.measureFields } }) }, _createSettingTarget: function(t, n) { var i = '<span tabindex="0" class="k-button" data-' + ht.ns + 'name="${data.name}">${data.name}', r = n.sortable, o = ""; return r && (o += "#if (data.sortIcon) {#", o += '<span class="k-icon ${data.sortIcon} k-setting-sort"></span>', o += "#}#"), (n.filterable || r) && (o += '<span class="k-icon k-i-arrowhead-s k-setting-fieldmenu"></span>'), this.options.reorderable && (o += '<span class="k-icon k-si-close k-setting-delete"></span>'), o && (i += '<span class="k-field-actions">' + o + "</span>"), i += "</span>", new ht.ui.PivotSettingTarget(t, e.extend({ template: i, emptyTemplate: '<span class="k-empty">${data}</span>', enabled: this.options.reorderable, dataSource: this.dataSource }, n)) }, _initSettingTargets: function() { this.columnsTarget = this._createSettingTarget(this.columnFields, { connectWith: this.rowFields, setting: "columns", filterable: this.options.filterable, sortable: this.options.sortable, messages: { empty: this.options.messages.columnFields, fieldMenu: this.options.messages.fieldMenu } }), this.rowsTarget = this._createSettingTarget(this.rowFields, { connectWith: this.columnFields, setting: "rows", filterable: this.options.filterable, sortable: this.options.sortable, messages: { empty: this.options.messages.rowFields, fieldMenu: this.options.messages.fieldMenu } }) }, _createLayout: function() { var t = this, n = e(Vt), i = n.find(".k-pivot-rowheaders"), r = n.find(".k-pivot-table"), o = e(At).addClass("k-grid k-widget"); t._measureFields(), t.columnFields = e(At).addClass("k-pivot-toolbar k-header k-settings-columns"), t.rowFields = e(At).addClass("k-pivot-toolbar k-header k-settings-rows"), t.columnsHeader = e('<div class="k-grid-header-wrap" />').wrap('<div class="k-grid-header" />'), t.columnsHeader.parent().css("padding-right", ht.support.scrollbar()), t.rowsHeader = e('<div class="k-grid k-widget k-alt"/>'), t.content = e('<div class="k-grid-content" />'), i.append(t.measureFields), i.append(t.rowFields), i.append(t.rowsHeader), o.append(t.columnsHeader.parent()), o.append(t.content), r.append(t.columnFields), r.append(o), t.wrapper.append(n), t.columnsHeaderTree = new ht.dom.Tree(t.columnsHeader[0]), t.rowsHeaderTree = new ht.dom.Tree(t.rowsHeader[0]), t.contentTree = new ht.dom.Tree(t.content[0]), t._initSettingTargets() }, _progress: function(e) { ht.ui.progress(this.wrapper, e) }, _resize: function() { this.columnsHeader.children("table"), this.content.children("table"); this.content[0].firstChild && (this._setSectionsWidth(), this._setSectionsHeight(), this._setContentWidth(), this._setContentHeight()) }, _setSectionsWidth: function() { var e = this.rowsHeader, t = e.parent(".k-pivot-rowheaders").width(Dt), n = Math.max(this.measureFields.outerWidth(), this.rowFields.outerWidth()); n = Math.max(e.children("table").width(), n), t.width(n) }, _setSectionsHeight: function() { var e = this.measureFields.height(Dt).height(), t = this.columnFields.height(Dt).height(), n = this.rowFields.height(Dt).innerHeight(), i = this.columnsHeader.height(Dt).innerHeight(), r = n - this.rowFields.height(), o = t > e ? t : e, a = i > n ? i : n; this.measureFields.height(o), this.columnFields.height(o), this.rowFields.height(a - r), this.columnsHeader.height(a) }, _setContentWidth: function() { var e = this.content.find("table"), t = this.columnsHeader.children("table"), n = e.children("colgroup").children().length, i = n * this.options.columnWidth, r = Math.ceil(i / this.content.width() * 100); 100 > r && (r = 100), e.add(t).css("width", r + "%"), this._resetColspan(t) }, _setContentHeight: function() { var e = this, n = e.content, i = e.rowsHeader, r = e.wrapper.innerHeight(), o = ht.support.scrollbar(), a = n[0].offsetHeight === n[0].clientHeight, s = e.options.height; if (e.wrapper.is(":visible")) { if (!r || !s) return a && (o = 0), n.height("auto"), i.height(n.height() - o), t; r -= e.columnFields.outerHeight(), r -= e.columnsHeader.outerHeight(), 2 * o >= r && (r = 2 * o + 1, a || (r += o)), n.height(r), a && (o = 0), i.height(r - o) } }, _resetColspan: function(e) { var n = this, i = e.children("tbody").children(":first").children(":first"); n._colspan === t && (n._colspan = i.attr("colspan")), i.attr("colspan", 1), clearTimeout(n._layoutTimeout), n._layoutTimeout = setTimeout(function() { i.attr("colspan", n._colspan), n._colspan = t }) }, _axisMeasures: function(e) { var t = [], n = this.dataSource, i = n.measures(), r = i.length > 1 || i[0] && i[0].type; return n.measuresAxis() === e && (0 === n[e]().length || r) && (t = i), t }, items: function() { return [] }, refresh: function() { var e, t = this, n = t.dataSource, i = n.axes(), r = (i.columns || {}).tuples || [], o = (i.rows || {}).tuples || [], a = t._columnBuilder, s = t._rowBuilder, l = {}, c = {}; t.trigger(Pt, { action: "rebind" }) || (a.measures = t._axisMeasures("columns"), t.columnsHeaderTree.render(a.build(r)), t.rowsHeaderTree.render(s.build(o)), l = { indexes: a._indexes, measures: a.measures, metadata: a.metadata }, c = { indexes: s._indexes, measures: this._axisMeasures("rows"), metadata: s.metadata }, t.contentTree.render(t._contentBuilder.build(n.view(), l, c)), t._resize(), t.touchScroller ? t.touchScroller.contentResized() : (e = ht.touchScroller(t.content), e && e.movable && (t.touchScroller = e, e.movable.bind("change", function(e) { t.columnsHeader.scrollLeft(-e.sender.x), t.rowsHeader.scrollTop(-e.sender.y) }))), t._progress(!1), t.trigger(Mt)) }, _scrollable: function() { var t = this, n = t.columnsHeader, i = t.rowsHeader; t.content.scroll(function() { n.scrollLeft(this.scrollLeft), i.scrollTop(this.scrollTop) }), i.bind("DOMMouseScroll" + Et + " mousewheel" + Et, e.proxy(t._wheelScroll, t)) }, _wheelScroll: function(t) { var n, i; t.ctrlKey || (n = ht.wheelDeltaY(t), i = this.content.scrollTop(), n && (t.preventDefault(), e(t.currentTarget).one("wheel" + Et, !1), this.rowsHeader.scrollTop(i + -n), this.content.scrollTop(i + -n))) } }), nt = ht.dom.element, it = ht.dom.html, rt = ht.dom.text, ot = function(e, t) { return { maxChildren: 0, children: 0, maxMembers: 0, members: 0, measures: 1, levelNum: e, parentMember: 0 !== t } }, at = function(e, t) { for (var n = [], i = 0; t >= i; i++) n.push(e.members[i].name); return n }, st = function(e, t) { for (var n = "", i = 0; t >= i; i++) n += e.members[i].name; return n }, lt = ft.extend({ init: function() { this.measures = 1, this.metadata = {} }, build: function(e) { var t = this._tbody(e), n = this._colGroup(); return [nt("table", null, [n, t])] }, reset: function() { this.metadata = {} }, _colGroup: function() { for (var e = this._rowLength(), t = [], n = 0; e > n; n++) t.push(nt("col", null)); return nt("colgroup", null, t) }, _tbody: function(e) { var t = e[0]; return this.map = {}, this.rows = [], this.rootTuple = t, this._indexes = [], t ? (this._buildRows(t, 0), this._normalize()) : this.rows.push(nt("tr", null, [nt("th", null, [it(" ")])])), nt("tbody", null, this.rows) }, _normalize: function() { for (var e, t, n, i, r, o = this.rows, a = o.length, s = 0; a > s; s++) if (e = o[s], 1 !== e.rowSpan) for (i = e.children, n = 0, t = i.length; t > n; n++) r = i[n], r.tupleAll && (r.attr.rowSpan = e.rowSpan) }, _rowIndex: function(e) { for (var t = this.rows, n = t.length, i = 0; n > i && t[i] !== e; i++); return i }, _rowLength: function() { var e = this.rows[0] ? this.rows[0].children : [], t = e.length, n = 0, i = 0; if (t) for (; t > i; i++) n += e[i].attr.colSpan || 1; return n || (n = this.measures), n }, _row: function(e, t, n) { var i, r, o = this.rootTuple.members[t].name, a = e.members[t].levelNum, s = o + a, l = this.map, c = l[s]; return c ? (c.notFirst = !1, c.parentMember && c.parentMember === n || (c.parentMember = n, c.collapsed = 0, c.colSpan = 0)) : (c = nt("tr", null, []), c.parentMember = n, c.collapsed = 0, c.colSpan = 0, c.rowSpan = 1, l[s] = c, i = l[o + (+a - 1)], i && (r = i.children, c.notFirst = r[1] && -1 === r[1].attr.className.indexOf("k-alt") ? !0 : i.notFirst), this.rows.splice(this._rowIndex(i) + 1, 0, c)), c }, _measures: function(e, t, n) { var i, r, o, a = this.map, s = a.measureRow; for (s || (s = nt("tr", null, []), a.measureRow = s, this.rows.push(s)), r = 0, o = e.length; o > r; r++) i = e[r], s.children.push(this._cell(n || "", [this._content(i, t)], i)); return o }, _content: function(e, t) { return it(this.template({ member: e, tuple: t })) }, _cell: function(e, t, n) { var i = nt("th", { className: "k-header" + e }, t); return i.value = n.caption || n.name, i }, _buildRows: function(e, n, i) { var r, o, a, s, l, c, d, u, h, p, f = e.members, g = f[n], m = f[n + 1], v = [], _ = 0, w = 0, b = 0; if (g.measure) return this._measures(g.children, e), t; if (u = ht.stringify(at(e, n)), r = this._row(e, n, i), a = g.children, s = a.length, h = this.metadata[u], h || (this.metadata[u] = h = ot(+g.levelNum, n)), this._indexes.push({ path: u, tuple: e }), g.hasChildren && (h.expanded === !1 && (w = h.maxChildren, r.collapsed += w, h.children = 0, s = 0), d = { className: "k-icon " + (s ? Rt : Ht) }, d[ht.attr("path")] = u, v.push(nt("span", d))), v.push(this._content(g, e)), l = this._cell(r.notFirst ? " k-first" : "", v, g), r.children.push(l), r.colSpan += 1, s) { for (c = this._cell(" k-alt", [this._content(g, e)], g), r.children.push(c); s > _; _++) o = this._buildRows(a[_], n, g); p = o.colSpan, w = o.collapsed, l.attr.colSpan = p, h.children = p, h.members = 1, r.colSpan += p, r.collapsed += w, r.rowSpan = o.rowSpan + 1, m && (m.measure ? p = this._measures(m.children, e, " k-alt") : (o = this._buildRows(e, n + 1), p = o.colSpan, r.collapsed += o.collapsed, b = o.collapsed), c.attr.colSpan = p, p -= 1, h.members += p, r.colSpan += p) } else m && (m.measure ? p = this._measures(m.children, e) : (o = this._buildRows(e, n + 1), p = o.colSpan, r.collapsed += o.collapsed, b = o.collapsed), h.members = p, p > 1 && (l.attr.colSpan = p, r.colSpan += p - 1)); return h.members + b > h.maxMembers && (h.maxMembers = h.members + b), a = h.children + w, a > h.maxChildren && (h.maxChildren = a), (c || l).tupleAll = !0, r } }), ct = ft.extend({ init: function() { this.metadata = {} }, build: function(e) { var t = this._tbody(e), n = this._colGroup(); return [nt("table", null, [n, t])] }, reset: function() { this.metadata = {} }, _rowLength: function() { for (var e = this.rows[0].children, t = 0, n = 0, i = e[n]; i;) t += i.attr.colSpan || 1, i = e[++n]; return t }, _colGroup: function() { for (var e = this._rowLength(), t = [], n = 0; e > n; n++) t.push(nt("col", null)); return nt("colgroup", null, t) }, _tbody: function(e) { var t = e[0]; return this.rootTuple = t, this.rows = [], this.map = {}, this._indexes = [], t ? (this._buildRows(t, 0), this._normalize()) : this.rows.push(nt("tr", null, [nt("td", null, [it(" ")])])), nt("tbody", null, this.rows) }, _normalize: function() { for (var e, t, n, i, r = this.rows, o = r.length, a = 0, s = this.rootTuple.members, l = s[0].name, c = s.length, d = 0, u = this.map; o > a; a++) for (e = r[a], d = 0; c > d; d++) n = this[s[d].name], t = e.colSpan["dim" + d], t && n > t.levelNum && (t.attr.colSpan = n - t.levelNum + 1); e = u[l], i = u[l + "all"], e && (e.children[0].attr.className = "k-first"), i && (i.children[0].attr.className += " k-first") }, _row: function(e) { var t = nt("tr", null, e); return t.rowSpan = 1, t.colSpan = {}, this.rows.push(t), t }, _content: function(e, t) { return it(this.template({ member: e, tuple: t })) }, _cell: function(e, t, n) { var i = nt("td", { className: e }, t); return i.value = n.caption || n.name, i }, _buildRows: function(e, t) { var n, i, r, o, a, s, l, c, d, u = this.map, h = e.members, p = h[t], f = h[t + 1], g = p.children, m = g.length, v = +p.levelNum + 1, _ = this.rootTuple.members[t].name, w = at(e, t - 1).join(""), b = w + (p.parentName || ""), y = u[b + "all"] || u[b], k = []; if (!y || y.hasChild ? y = this._row() : y.hasChild = !0, p.measure) { for (a = y.allCell ? "k-grid-footer" : "", y.children.push(this._cell(a, [this._content(g[0], e)], g[0])), y.rowSpan = m, d = 1; m > d; d++) this._row([this._cell(a, [this._content(g[d], e)], g[d])]); return y } if (u[w + p.name] = y, n = ht.stringify(at(e, t)), o = this.metadata[n], o || (this.metadata[n] = o = ot(v - 1, t)), this._indexes.push({ path: n, tuple: e }), p.hasChildren && (o.expanded === !1 && (m = 0, o.children = 0), s = { className: "k-icon " + (m ? Rt : Ht) }, s[ht.attr("path")] = n, k.push(nt("span", s))), k.push(this._content(p, e)), a = y.allCell && !m ? "k-grid-footer" : "", c = this._cell(a, k, p), c.levelNum = v, y.children.push(c), y.colSpan["dim" + t] = c, (!this[_] || v > this[_]) && (this[_] = v), m) { for (y.allCell = !1, y.hasChild = !1, d = 0; m > d; d++) i = this._buildRows(g[d], t), y !== i && (y.rowSpan += i.rowSpan); y.rowSpan > 1 && (c.attr.rowSpan = y.rowSpan), o.children = y.rowSpan, l = this._cell("k-grid-footer", [this._content(p, e)], p), l.levelNum = v, r = this._row([l]), r.colSpan["dim" + t] = l, r.allCell = !0, u[w + p.name + "all"] = r, f && (i = this._buildRows(e, t + 1), l.attr.rowSpan = i.rowSpan), y.rowSpan += r.rowSpan, o.members = r.rowSpan } else f && (y.hasChild = !1, this._buildRows(e, t + 1), (l || c).attr.rowSpan = y.rowSpan, o.members = y.rowSpan); return o.children > o.maxChildren && (o.maxChildren = o.children), o.members > o.maxMembers && (o.maxMembers = o.members), y } }), dt = ft.extend({ init: function() { this.columnAxis = {}, this.rowAxis = {} }, build: function(e, n, i) { var r, o, a = n.indexes[0], s = n.metadata[a ? a.path : t]; return this.columnAxis = n, this.rowAxis = i, this.data = e, this.rowLength = s ? s.maxChildren + s.maxMembers : n.measures.length || 1, this.rowLength || (this.rowLength = 1), r = this._tbody(), o = this._colGroup(), [nt("table", null, [o, r])] }, _colGroup: function() { var e = this.columnAxis.measures.length || 1, t = [], n = 0; for (this.rows[0] && (e = this.rows[0].children.length); e > n; n++) t.push(nt("col", null)); return nt("colgroup", null, t) }, _tbody: function() { return this.rows = [], this.data[0] ? (this.columnIndexes = this._indexes(this.columnAxis, this.rowLength), this.rowIndexes = this._indexes(this.rowAxis, Math.ceil(this.data.length / this.rowLength)), this._buildRows()) : this.rows.push(nt("tr", null, [nt("td", null, [it(" ")])])), nt("tbody", null, this.rows) }, _indexes: function(e, n) { var i, r, o, a, s, l = [], c = e.indexes, d = e.metadata, u = e.measures, h = u.length || 1, p = 0, f = 0, g = 0, m = c.length; if (!m) { for (o = 0; h > o; o++) l[o] = { index: o, measure: u[o], tuple: null }; return l } for (; m > g; g++) { if (i = c[g], r = d[i.path], a = r.children + r.members, s = 0, a && (a -= h), r.expanded === !1 && r.children !== r.maxChildren && (s = r.maxChildren), r.parentMember && 0 === r.levelNum && (a = -1), a > -1) { for (o = 0; h > o; o++) l[a + f + o] = { children: a, index: p, measure: u[o], tuple: i.tuple }, p += 1; for (; l[f] !== t;) f += 1 } if (f === n) break; p += s } return l }, _buildRows: function() { for (var e = this.rowIndexes, t = e.length, n = 0; t > n; n++) this.rows.push(this._buildRow(e[n])) }, _buildRow: function(e) { for (var t, n, i, r, o, a, s, l = e.index * this.rowLength, c = this.columnIndexes, d = c.length, u = [], h = 0; d > h; h++) t = c[h], o = {}, t.children && (o.className = "k-alt"), r = "", a = this.data[l + t.index], s = t.measure || e.measure, n = { columnTuple: t.tuple, rowTuple: e.tuple, measure: s, dataItem: a }, "" !== a.value && s && s.type && ("status" === s.type ? r = this.kpiStatusTemplate(n) : "trend" === s.type && (r = this.kpiTrendTemplate(n))), r || (r = this.dataTemplate(n)), i = nt("td", o, [it(r)]), i.value = a.value, u.push(i); return o = {}, e.children && (o.className = "k-grid-footer"), nt("tr", o, u) } }), pt.plugin(tt), ht.PivotExcelExporter = ht.Class.extend({ init: function(e) { this.options = e, this.widget = e.widget, this.dataSource = this.widget.dataSource }, _columns: function() { var e, t = this.widget.columnsHeaderTree.children[0], n = this.widget.rowsHeaderTree.children[0], i = t.children[0].children.length, r = n.children[0].children.length, o = this.widget.options.columnWidth, a = []; if (r && this.dataSource.data()[0]) for (e = 0; r > e; e++) a.push({ autoWidth: !0 }); for (e = 0; i > e; e++) a.push({ autoWidth: !1, width: o }); return a }, _cells: function(e, t, n) { for (var i, r, o, a, s, l = [], c = 0, d = e.length; d > c; c++) { for (r = [], o = e[c].children, i = o.length, a = 0; i > a; a++) s = o[a], r.push({ background: "#7a7a7a", color: "#fff", value: s.value, colSpan: s.attr.colSpan || 1, rowSpan: s.attr.rowSpan || 1 }); n && n(r, c), l.push({ cells: r, type: t }) } return l }, _rows: function() { var e, t, n = this.widget.columnsHeaderTree.children[0], i = this.widget.rowsHeaderTree.children[0], r = n.children[0].children.length, o = i.children[0].children.length, a = n.children[1].children, s = i.children[1].children, l = this.widget.contentTree.children[0].children[1].children, c = this._cells(a, "header"); return o && c[0].cells.splice(0, 0, { background: "#7a7a7a", color: "#fff", value: "", colSpan: o, rowSpan: a.length }), e = function(e, t) { for (var n, i, o = 0, a = l[t].children; r > o; o++) n = a[o], i = +n.value, isNaN(i) && (i = ""), e.push({ background: "#dfdfdf", color: "#333", value: i, colSpan: 1, rowSpan: 1 }) }, t = this._cells(s, "data", e), c.concat(t) }, _freezePane: function() { var e = this.widget.columnsHeaderTree.children[0], t = this.widget.rowsHeaderTree.children[0], n = t.children[0].children.length, i = e.children[1].children; return { colSplit: n, rowSplit: i.length } }, workbook: function() { var t; return this.dataSource.view()[0] ? (t = e.Deferred(), t.resolve()) : t = this.dataSource.fetch(), t.then(e.proxy(function() { return { sheets: [{ columns: this._columns(), rows: this._rows(), freezePane: this._freezePane(), filter: null }] } }, this)) } }), ut = { extend: function(t) { t.events.push("excelExport"), t.options.excel = e.extend(t.options.excel, this.options), t.saveAsExcel = this.saveAsExcel }, options: { proxyURL: "", filterable: !1, fileName: "Export.xlsx" }, saveAsExcel: function() { var t = this.options.excel || {}, n = new ht.PivotExcelExporter({ widget: this }); n.workbook().then(e.proxy(function(e) { if (!this.trigger("excelExport", { workbook: e })) { var n = new ht.ooxml.Workbook(e); ht.saveAs({ dataURI: n.toDataURL(), fileName: e.fileName || t.fileName, proxyURL: t.proxyURL, forceProxy: t.forceProxy }) } }, this)) } }, ht.PivotExcelMixin = ut, ht.ooxml && ht.ooxml.Workbook && ut.extend(tt.prototype), ht.PDFMixin && (ht.PDFMixin.extend(tt.prototype), tt.fn._drawPDF = function() { return this._drawPDFShadow({ width: this.wrapper.width() }) }) }(window.kendo.jQuery), function(e, t) { { var n = window.kendo, i = n.ui, r = e.proxy, o = e.extend, a = "visibility", s = "k-state-hover", l = "input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,button.k-button>.k-icon,span.k-icon.k-i-expand,span.k-icon.k-i-collapse"; i.HierarchicalDragAndDrop = n.Class.extend({ init: function(t, a) { this.element = t, this.hovered = t, this.options = o({ dragstart: e.noop, drag: e.noop, drop: e.noop, dragend: e.noop }, a), this._draggable = new i.Draggable(t, { ignore: l, filter: a.filter, autoScrolL: a.autoScroll, cursorOffset: { left: 10, top: n.support.mobileOS ? -40 / n.support.zoomLevel() : 10 }, hint: r(this._hint, this), dragstart: r(this.dragstart, this), dragcancel: r(this.dragcancel, this), drag: r(this.drag, this), dragend: r(this.dragend, this), $angular: a.$angular }) }, _hint: function(e) { return "<div class='k-header k-drag-clue'><span class='k-icon k-drag-status' />" + this.options.hintText(e) + "</div>" }, _removeTouchHover: function() { n.support.touch && this.hovered && (this.hovered.find("." + s).removeClass(s), this.hovered = !1) }, _hintStatus: function(n) { var i = this._draggable.hint.find(".k-drag-status")[0]; return n ? (i.className = "k-icon k-drag-status " + n, t) : e.trim(i.className.replace(/k-(icon|drag-status)/g, "")) }, dragstart: function(t) { this.source = t.currentTarget.closest(this.options.itemSelector), this.options.dragstart(this.source) && t.preventDefault(), this.dropHint = this.options.reorderable ? e("<div class='k-drop-hint' />").css(a, "hidden").appendTo(this.element) : e() }, drag: function(t) { var i, r, o, l, c, d, u, h, p, f, g, m = this.options, v = this.source, _ = this.dropTarget = e(n.eventTarget(t)), w = _.closest(m.allowedContainers); w.length ? v[0] == _[0] || m.contains(v[0], _[0]) ? g = "k-denied" : (g = "k-insert-middle", p = m.itemFromTarget(_), i = p.item, i.length ? (this._removeTouchHover(), r = i.outerHeight(), l = p.content, m.reorderable ? (c = r / (l.length > 0 ? 4 : 2), o = n.getOffset(i).top, d = o + c > t.y.location, u = t.y.location > o + r - c, h = l.length && !d && !u) : (h = !0, d = !1, u = !1), this.hovered = h ? w : !1, this.dropHint.css(a, h ? "hidden" : "visible"), this._lastHover && this._lastHover[0] != l[0] && this._lastHover.removeClass(s), this._lastHover = l.toggleClass(s, h), h ? g = "k-add" : (f = i.position(), f.top += d ? 0 : r, this.dropHint.css(f)[d ? "prependTo" : "appendTo"](m.dropHintContainer(i)), d && p.first && (g = "k-insert-top"), u && p.last && (g = "k-insert-bottom"))) : _[0] != this.dropHint[0] && (this._lastHover && this._lastHover.removeClass(s), g = e.contains(this.element[0], w[0]) ? "k-denied" : "k-add")) : (g = "k-denied", this._removeTouchHover()), this.options.drag({ originalEvent: t.originalEvent, source: v, target: _, pageY: t.y.location, pageX: t.x.location, status: g.substring(2), setStatus: function(e) { g = e } }), "k-denied" == g && this._lastHover && this._lastHover.removeClass(s), 0 !== g.indexOf("k-insert") && this.dropHint.css(a, "hidden"), this._hintStatus(g) }, dragcancel: function() { this.dropHint.remove() }, dragend: function(e) { var n, i, r, o = "over", l = this.source, c = this.dropHint, d = this.dropTarget; return "visible" == c.css(a) ? (o = this.options.dropPositionFrom(c), n = c.closest(this.options.itemSelector)) : d && (n = d.closest(this.options.itemSelector), n.length || (n = d.closest(this.options.allowedContainers))), i = { originalEvent: e.originalEvent, source: l[0], destination: n[0], valid: "k-denied" != this._hintStatus(), setValid: function(e) { this.valid = e }, dropTarget: d[0], position: o }, r = this.options.drop(i), c.remove(), this._removeTouchHover(), this._lastHover && this._lastHover.removeClass(s), !i.valid || r ? (this._draggable.dropped = i.valid, t) : (this._draggable.dropped = !0, this.options.dragend({ originalEvent: e.originalEvent, source: l, destination: n, position: o }), t) }, destroy: function() { this._lastHover = this.hovered = null, this._draggable.destroy() } }) } }(window.kendo.jQuery), function(e, t) { function n(e) { return function(t) { var n = t.children(".k-animation-container"); return n.length || (n = t), n.children(e) } } function i(e) { return p.template(e, { useWithBlock: !1 }) } function r(e) { return e.find("> div .k-checkbox [type=checkbox]") } function o(e) { return function(t, n) { n = n.closest(W); var i, r = n.parent(); return r.parent().is("li") && (i = r.parent()), this._dataSourceMove(t, r, i, function(t, i) { return this._insert(t.data(), i, n.index() + e) }) } } function a(t, n) { for (var i; t && "ul" != t.nodeName.toLowerCase();) i = t, t = t.nextSibling, 3 == i.nodeType && (i.nodeValue = e.trim(i.nodeValue)), h.test(i.className) ? n.insertBefore(i, n.firstChild) : n.appendChild(i) } function s(t) { var n = t.children("div"), i = t.children("ul"), r = n.children(".k-icon"), o = t.children(":checkbox"), s = n.children(".k-in"); t.hasClass("k-treeview") || (n.length || (n = e("<div />").prependTo(t)), !r.length && i.length ? r = e("<span class='k-icon' />").prependTo(n) : i.length && i.children().length || (r.remove(), i.remove()), o.length && e("<span class='k-checkbox' />").appendTo(n).append(o), s.length || (s = t.children("a").eq(0).addClass("k-in"), s.length || (s = e("<span class='k-in' />")), s.appendTo(n), n.length && a(n[0].nextSibling, s[0]))) } var l, c, d, u, h, p = window.kendo, f = p.ui, g = p.data, m = e.extend, v = p.template, _ = e.isArray, w = f.Widget, b = g.HierarchicalDataSource, y = e.proxy, k = p.keys, x = ".kendoTreeView", C = "select", S = "check", T = "navigate", D = "expand", A = "change", E = "error", I = "checked", P = "indeterminate", M = "collapse", z = "dragstart", F = "drag", R = "drop", H = "dragend", B = "dataBound", L = "click", N = "undefined", O = "k-state-hover", V = "k-treeview", U = ":visible", W = ".k-item", j = "string", G = "aria-selected", q = "aria-disabled", $ = { text: "dataTextField", url: "dataUrlField", spriteCssClass: "dataSpriteCssClassField", imageUrl: "dataImageUrlField" }, Y = function(e) { return "object" == typeof HTMLElement ? e instanceof HTMLElement : e && "object" == typeof e && 1 === e.nodeType && typeof e.nodeName === j }; c = n(".k-group"), d = n(".k-group,.k-content"), u = function(e) { return e.children("div").children(".k-icon") }, h = /k-sprite/, l = p.ui.DataBoundWidget.extend({ init: function(e, t) { var n, i, r = this, o = !1, a = t && !!t.dataSource; _(t) && (n = !0, t = { dataSource: t }), t && typeof t.loadOnDemand == N && _(t.dataSource) && (t.loadOnDemand = !1), w.prototype.init.call(r, e, t), e = r.element, t = r.options, i = e.is("ul") && e || e.hasClass(V) && e.children("ul"), o = !a && i.length, o && (t.dataSource.list = i), r._animation(), r._accessors(), r._templates(), e.hasClass(V) ? (r.wrapper = e, r.root = e.children("ul").eq(0)) : (r._wrapper(), i && (r.root = e, r._group(r.wrapper))), r._tabindex(), r.root.attr("role", "tree"), r._dataSource(o), r._attachEvents(), r._dragging(), o ? r._syncHtmlAndDataSource() : t.autoBind && (r._progress(!0), r.dataSource.fetch()), t.checkboxes && t.checkboxes.checkChildren && r.updateIndeterminate(), r.element[0].id && (r._ariaId = p.format("{0}_tv_active", r.element[0].id)), p.notify(r) }, _attachEvents: function() { var t = this, n = ".k-in:not(.k-state-selected,.k-state-disabled)", i = "mouseenter"; t.wrapper.on(i + x, ".k-in.k-state-selected", function(e) { e.preventDefault() }).on(i + x, n, function() { e(this).addClass(O) }).on("mouseleave" + x, n, function() { e(this).removeClass(O) }).on(L + x, n, y(t._click, t)).on("dblclick" + x, ".k-in:not(.k-state-disabled)", y(t._toggleButtonClick, t)).on(L + x, ".k-plus,.k-minus", y(t._toggleButtonClick, t)).on("keydown" + x, y(t._keydown, t)).on("focus" + x, y(t._focus, t)).on("blur" + x, y(t._blur, t)).on("mousedown" + x, ".k-in,.k-checkbox :checkbox,.k-plus,.k-minus", y(t._mousedown, t)).on("change" + x, ".k-checkbox :checkbox", y(t._checkboxChange, t)).on("click" + x, ".k-checkbox :checkbox", y(t._checkboxClick, t)).on("click" + x, ".k-request-retry", y(t._retryRequest, t)).on("click" + x, function(n) { e(n.target).is(":kendoFocusable") || t.focus() }) }, _checkboxClick: function(t) { var n = e(t.target); n.data(P) && (n.data(P, !1).prop(P, !1).prop(I, !0), this._checkboxChange(t)) }, _syncHtmlAndDataSource: function(e, t) { var n, i, o, a, s, l, c, d; for (e = e || this.root, t = t || this.dataSource, n = t.view(), i = p.attr("uid"), o = p.attr("expanded"), a = this.options.checkboxes, s = e.children("li"), l = 0; s.length > l; l++) d = n[l], c = s.eq(l), c.attr("role", "treeitem").attr(i, d.uid), d.expanded = "true" === c.attr(o), a && (d.checked = r(c).prop(I)), this._syncHtmlAndDataSource(c.children("ul"), d.children) }, _animation: function() { var e = this.options, t = e.animation; t === !1 ? t = { expand: { effects: {} }, collapse: { hide: !0, effects: {} } } : t.collapse && "effects" in t.collapse || (t.collapse = m({ reverse: !0 }, t.expand)), m(t.collapse, { hide: !0 }), e.animation = t }, _dragging: function() { var t, n = this.options.dragAndDrop, i = this.dragging; n && !i ? (t = this, this.dragging = new f.HierarchicalDragAndDrop(this.element, { reorderable: !0, $angular: this.options.$angular, autoScroll: this.options.autoScroll, filter: "div:not(.k-state-disabled) .k-in", allowedContainers: ".k-treeview", itemSelector: ".k-treeview .k-item", hintText: y(this._hintText, this), contains: function(t, n) { return e.contains(t, n) }, dropHintContainer: function(e) { return e }, itemFromTarget: function(e) { var t = e.closest(".k-top,.k-mid,.k-bot"); return { item: t, content: e.closest(".k-in"), first: t.hasClass("k-top"), last: t.hasClass("k-bot") } }, dropPositionFrom: function(e) { return e.prevAll(".k-in").length > 0 ? "after" : "before" }, dragstart: function(e) { return t.trigger(z, { sourceNode: e[0] }) }, drag: function(e) { t.trigger(F, { originalEvent: e.originalEvent, sourceNode: e.source[0], dropTarget: e.target[0], pageY: e.pageY, pageX: e.pageX, statusClass: e.status, setStatusClass: e.setStatus }) }, drop: function(e) { return t.trigger(R, { originalEvent: e.originalEvent, sourceNode: e.source, destinationNode: e.destination, valid: e.valid, setValid: function(t) { this.valid = t, e.setValid(t) }, dropTarget: e.dropTarget, dropPosition: e.position }) }, dragend: function(e) { function n(n) { t.updateIndeterminate(), t.trigger(H, { originalEvent: e.originalEvent, sourceNode: n && n[0], destinationNode: r[0], dropPosition: o }) } var i = e.source, r = e.destination, o = e.position; "over" == o ? t.append(i, r, n) : ("before" == o ? i = t.insertBefore(i, r) : "after" == o && (i = t.insertAfter(i, r)), n(i)) } })) : !n && i && (i.destroy(), this.dragging = null) }, _hintText: function(e) { return this.templates.dragClue({ item: this.dataItem(e), treeview: this.options }) }, _templates: function() { var e = this, t = e.options, n = y(e._fieldAccessor, e); t.template && typeof t.template == j ? t.template = v(t.template) : t.template || (t.template = i("# var text = " + n("text") + "(data.item); ## if (typeof data.item.encoded != 'undefined' && data.item.encoded === false) {##= text ## } else { ##: text ## } #")), e._checkboxes(), e.templates = { wrapperCssClass: function(e, t) { var n = "k-item", i = t.index; return e.firstLevel && 0 === i && (n += " k-first"), i == e.length - 1 && (n += " k-last"), n }, cssClass: function(e, t) { var n = "", i = t.index, r = e.length - 1; return e.firstLevel && 0 === i && (n += "k-top "), n += 0 === i && i != r ? "k-top" : i == r ? "k-bot" : "k-mid" }, textClass: function(e) { var t = "k-in"; return e.enabled === !1 && (t += " k-state-disabled"), e.selected === !0 && (t += " k-state-selected"), t }, toggleButtonClass: function(e) { var t = "k-icon"; return t += e.expanded !== !0 ? " k-plus" : " k-minus", e.enabled === !1 && (t += "-disabled"), t }, groupAttributes: function(e) { var t = ""; return e.firstLevel || (t = "role='group'"), t + (e.expanded !== !0 ? " style='display:none'" : "") }, groupCssClass: function(e) { var t = "k-group"; return e.firstLevel && (t += " k-treeview-lines"), t }, dragClue: i("#= data.treeview.template(data) #"), group: i("<ul class='#= data.r.groupCssClass(data.group) #'#= data.r.groupAttributes(data.group) #>#= data.renderItems(data) #</ul>"), itemContent: i("# var imageUrl = " + n("imageUrl") + "(data.item); ## var spriteCssClass = " + n("spriteCssClass") + "(data.item); ## if (imageUrl) { #<img class='k-image' alt='' src='#= imageUrl #'># } ## if (spriteCssClass) { #<span class='k-sprite #= spriteCssClass #' /># } ##= data.treeview.template(data) #"), itemElement: i("# var item = data.item, r = data.r; ## var url = " + n("url") + "(item); #<div class='#= r.cssClass(data.group, item) #'># if (item.hasChildren) { #<span class='#= r.toggleButtonClass(item) #' role='presentation' /># } ## if (data.treeview.checkboxes) { #<span class='k-checkbox' role='presentation'>#= data.treeview.checkboxes.template(data) #</span># } ## var tag = url ? 'a' : 'span'; ## var textAttr = url ? ' href=\\'' + url + '\\'' : ''; #<#=tag# class='#= r.textClass(item) #'#= textAttr #>#= r.itemContent(data) #</#=tag#></div>"), item: i("# var item = data.item, r = data.r; #<li role='treeitem' class='#= r.wrapperCssClass(data.group, item) #' " + p.attr("uid") + "='#= item.uid #' aria-selected='#= item.selected ? \"true\" : \"false \" #' #=item.enabled === false ? \"aria-disabled='true'\" : ''## if (item.expanded) { #data-expanded='true' aria-expanded='true'# } #>#= r.itemElement(data) #</li>"), loading: i("<div class='k-icon k-loading' /> #: data.messages.loading #"), retry: i("#: data.messages.requestFailed # <button class='k-button k-request-retry'>#: data.messages.retry #</button>") } }, items: function() { return this.element.find(".k-item > div:first-child") }, setDataSource: function(e) { var t = this.options; t.dataSource = e, this._dataSource(), this.dataSource.fetch(), t.checkboxes && t.checkboxes.checkChildren && this.updateIndeterminate() }, _bindDataSource: function() { this._refreshHandler = y(this.refresh, this), this._errorHandler = y(this._error, this), this.dataSource.bind(A, this._refreshHandler), this.dataSource.bind(E, this._errorHandler) }, _unbindDataSource: function() { var e = this.dataSource; e && (e.unbind(A, this._refreshHandler), e.unbind(E, this._errorHandler)) }, _dataSource: function(e) { function t(e) { for (var n = 0; e.length > n; n++) e[n]._initChildren(), e[n].children.fetch(), t(e[n].children.view()) } var n = this, i = n.options, r = i.dataSource; r = _(r) ? { data: r } : r, n._unbindDataSource(), r.fields || (r.fields = [{ field: "text" }, { field: "url" }, { field: "spriteCssClass" }, { field: "imageUrl" }]), n.dataSource = r = b.create(r), e && (r.fetch(), t(r.view())), n._bindDataSource() }, events: [z, F, R, H, B, D, M, C, A, T, S], options: { name: "TreeView", dataSource: {}, animation: { expand: { effects: "expand:vertical", duration: 200 }, collapse: { duration: 100 } }, messages: { loading: "Loading...", requestFailed: "Request failed.", retry: "Retry" }, dragAndDrop: !1, checkboxes: !1, autoBind: !0, autoScroll: !1, loadOnDemand: !0, template: "", dataTextField: null }, _accessors: function() { var e, t, n, i = this, r = i.options, o = i.element; for (e in $) t = r[$[e]], n = o.attr(p.attr(e + "-field")), !t && n && (t = n), t || (t = e), _(t) || (t = [t]), r[$[e]] = t }, _fieldAccessor: function(t) { var n = this.options[$[t]], i = n.length, r = "(function(item) {"; return 0 === i ? r += "return item['" + t + "'];" : (r += "var levels = [" + e.map(n, function(e) { return "function(d){ return " + p.expr(e) + "}" }).join(",") + "];", r += "return levels[Math.min(item.level(), " + i + "-1)](item)"), r += "})" }, setOptions: function(e) { w.fn.setOptions.call(this, e), this._animation(), this._dragging(), this._templates() }, _trigger: function(e, t) { return this.trigger(e, { node: t.closest(W)[0] }) }, _setChecked: function(t, n) { if (t && e.isFunction(t.view)) for (var i = 0, r = t.view(); r.length > i; i++) r[i][I] = n, r[i].children && this._setChecked(r[i].children, n) }, _setIndeterminate: function(e) { var t, n, i, o = c(e), a = !0; if (o.length && (t = r(o.children()), n = t.length)) { if (n > 1) { for (i = 1; n > i; i++) if (t[i].checked != t[i - 1].checked || t[i].indeterminate || t[i - 1].indeterminate) { a = !1; break } } else a = !t[0].indeterminate; return r(e).data(P, !a).prop(P, !a).prop(I, a && t[0].checked) } }, updateIndeterminate: function(e) { var t, n, i; if (e = e || this.wrapper, t = c(e).children(), t.length) { for (n = 0; t.length > n; n++) this.updateIndeterminate(t.eq(n)); i = this._setIndeterminate(e), i && i.prop(I) && (this.dataItem(e).checked = !0) } }, _bubbleIndeterminate: function(e) { if (e.length) { var t, n = this.parent(e); n.length && (this._setIndeterminate(n), t = n.children("div").find(".k-checkbox :checkbox"), t.prop(P) === !1 ? this.dataItem(n).set(I, t.prop(I)) : delete this.dataItem(n).checked, this._bubbleIndeterminate(n)) } }, _checkboxChange: function(t) { var n = e(t.target), i = n.prop(I), r = n.closest(W), o = this.dataItem(r); o.checked != i && (o.set(I, i), this._trigger(S, r)) }, _toggleButtonClick: function(t) { this.toggle(e(t.target).closest(W)) }, _mousedown: function(t) { var n = e(t.currentTarget).closest(W); this._clickTarget = n, this.current(n) }, _focusable: function(e) { return e && e.length && e.is(":visible") && !e.find(".k-in:first").hasClass("k-state-disabled") }, _focus: function() { var t = this.select(), n = this._clickTarget; p.support.touch || (n && n.length && (t = n), this._focusable(t) || (t = this.current()), this._focusable(t) || (t = this._nextVisible(e())), this.current(t)) }, focus: function() { var e, t = this.wrapper, n = t[0], i = [], r = [], o = document.documentElement; do n = n.parentNode, n.scrollHeight > n.clientHeight && (i.push(n), r.push(n.scrollTop)); while (n != o); for (t.focus(), e = 0; i.length > e; e++) i[e].scrollTop = r[e] }, _blur: function() { this.current().find(".k-in:first").removeClass("k-state-focused") }, _enabled: function(e) { return !e.children("div").children(".k-in").hasClass("k-state-disabled") }, parent: function(t) { var n, i, r = /\bk-treeview\b/, o = /\bk-item\b/; typeof t == j && (t = this.element.find(t)), Y(t) || (t = t[0]), i = o.test(t.className); do t = t.parentNode, o.test(t.className) && (i ? n = t : i = !0); while (!r.test(t.className) && !n); return e(n) }, _nextVisible: function(e) { function t(e) { for (; e.length && !e.next().length;) e = i.parent(e); return e.next().length ? e.next() : e } var n, i = this, r = i._expanded(e); return e.length && e.is(":visible") ? r ? (n = c(e).children().first(), n.length || (n = t(e))) : n = t(e) : n = i.root.children().eq(0), i._enabled(n) || (n = i._nextVisible(n)), n }, _previousVisible: function(e) { var t, n, i = this; if (!e.length || e.prev().length) for (n = e.length ? e.prev() : i.root.children().last(); i._expanded(n) && (t = c(n).children().last(), t.length);) n = t; else n = i.parent(e) || e; return i._enabled(n) || (n = i._previousVisible(n)), n }, _keydown: function(n) { var i, r = this, o = n.keyCode, a = r.current(), s = r._expanded(a), l = a.find(".k-checkbox:first :checkbox"), c = p.support.isRtl(r.element); n.target == n.currentTarget && (!c && o == k.RIGHT || c && o == k.LEFT ? s ? i = r._nextVisible(a) : r.expand(a) : !c && o == k.LEFT || c && o == k.RIGHT ? s ? r.collapse(a) : (i = r.parent(a), r._enabled(i) || (i = t)) : o == k.DOWN ? i = r._nextVisible(a) : o == k.UP ? i = r._previousVisible(a) : o == k.HOME ? i = r._nextVisible(e()) : o == k.END ? i = r._previousVisible(e()) : o == k.ENTER ? a.find(".k-in:first").hasClass("k-state-selected") || r._trigger(C, a) || r.select(a) : o == k.SPACEBAR && l.length && (l.prop(I, !l.prop(I)).data(P, !1).prop(P, !1), r._checkboxChange({ target: l }), i = a), i && (n.preventDefault(), a[0] != i[0] && (r._trigger(T, i), r.current(i)))) }, _click: function(t) { var n, i = this, r = e(t.currentTarget), o = d(r.closest(W)), a = r.attr("href"); n = a ? "#" == a || a.indexOf("#" + this.element.id + "-") >= 0 : o.length && !o.children().length, n && t.preventDefault(), r.hasClass(".k-state-selected") || i._trigger(C, r) || i.select(r) }, _wrapper: function() { var e, t, n = this, i = n.element, r = "k-widget k-treeview"; i.is("ul") ? (e = i.wrap("<div />").parent(), t = i) : (e = i, t = e.children("ul").eq(0)), n.wrapper = e.addClass(r), n.root = t }, _group: function(e) { var t = this, n = e.hasClass(V), i = { firstLevel: n, expanded: n || t._expanded(e) }, r = e.children("ul"); r.addClass(t.templates.groupCssClass(i)).css("display", i.expanded ? "" : "none"), t._nodes(r, i) }, _nodes: function(t, n) { var i, r = this, o = t.children("li"); n = m({ length: o.length }, n), o.each(function(t, o) { o = e(o), i = { index: t, expanded: r._expanded(o) }, s(o), r._updateNodeClasses(o, n, i), r._group(o) }) }, _checkboxes: function() { var e, t = this.options, n = t.checkboxes; n && (e = "<input type='checkbox' #= (item.enabled === false) ? 'disabled' : '' # #= item.checked ? 'checked' : '' #", n.name && (e += " name='" + n.name + "'"), e += " />", n = m({ template: e }, t.checkboxes), typeof n.template == j && (n.template = v(n.template)), t.checkboxes = n) }, _updateNodeClasses: function(e, t, n) { var i = e.children("div"), r = e.children("ul"), o = this.templates; e.hasClass("k-treeview") || (n = n || {}, n.expanded = typeof n.expanded != N ? n.expanded : this._expanded(e), n.index = typeof n.index != N ? n.index : e.index(), n.enabled = typeof n.enabled != N ? n.enabled : !i.children(".k-in").hasClass("k-state-disabled"), t = t || {}, t.firstLevel = typeof t.firstLevel != N ? t.firstLevel : e.parent().parent().hasClass(V), t.length = typeof t.length != N ? t.length : e.parent().children().length, e.removeClass("k-first k-last").addClass(o.wrapperCssClass(t, n)), i.removeClass("k-top k-mid k-bot").addClass(o.cssClass(t, n)), i.children(".k-in").removeClass("k-in k-state-default k-state-disabled").addClass(o.textClass(n)), (r.length || "true" == e.attr("data-hasChildren")) && (i.children(".k-icon").removeClass("k-plus k-minus k-plus-disabled k-minus-disabled").addClass(o.toggleButtonClass(n)), r.addClass("k-group"))) }, _processNodes: function(t, n) { var i = this; i.element.find(t).each(function(t, r) { n.call(i, t, e(r).closest(W)) }) }, dataItem: function(t) { var n = e(t).closest(W).attr(p.attr("uid")), i = this.dataSource; return i && i.getByUid(n) }, _insertNode: function(t, n, i, r, o) { var a, l, d, u, h = this, p = c(i), f = p.children().length + 1, g = { firstLevel: i.hasClass(V), expanded: !o, length: f }, m = "", v = function(e, t) { e.appendTo(t) }; for (d = 0; t.length > d; d++) u = t[d], u.index = n + d, m += h._renderItem({ group: g, item: u }); if (l = e(m), l.length) { for (h.angular("compile", function() { return { elements: l.get(), data: t.map(function(e) { return { dataItem: e } }) } }), p.length || (p = e(h._renderGroup({ group: g })).appendTo(i)), r(l, p), i.hasClass("k-item") && (s(i), h._updateNodeClasses(i)), h._updateNodeClasses(l.prev().first()), h._updateNodeClasses(l.next().last()), d = 0; t.length > d; d++) u = t[d], u.hasChildren && (a = u.children.data(), a.length && h._insertNode(a, u.index, l.eq(d), v, !h._expanded(l.eq(d)))); return l } }, _updateNodes: function(t, n) { function i(e, t) { e.find(".k-checkbox :checkbox").prop(I, t).data(P, !1).prop(P, !1) } var r, o, a, s, l, c, u, h = this, p = { treeview: h.options, item: s }, g = "expanded" != n && "checked" != n; if ("selected" == n) s = t[0], o = h.findByUid(s.uid).find(".k-in:first").removeClass("k-state-hover").toggleClass("k-state-selected", s[n]).end(), s[n] && h.current(o), o.attr(G, !!s[n]); else { for (u = e.map(t, function(e) { return h.findByUid(e.uid).children("div") }), g && h.angular("cleanup", function() { return { elements: u } }), r = 0; t.length > r; r++) p.item = s = t[r], a = u[r], o = a.parent(), g && a.children(".k-in").html(h.templates.itemContent(p)), n == I ? (l = s[n], i(a, l), h.options.checkboxes.checkChildren && (i(o.children(".k-group"), l), h._setChecked(s.children, l), h._bubbleIndeterminate(o))) : "expanded" == n ? h._toggle(o, s, s[n]) : "enabled" == n && (o.find(".k-checkbox :checkbox").prop("disabled", !s[n]), c = !d(o).is(U), o.removeAttr(q), s[n] || (s.selected && s.set("selected", !1), s.expanded && s.set("expanded", !1), c = !0, o.attr(G, !1).attr(q, !0)), h._updateNodeClasses(o, {}, { enabled: s[n], expanded: !c })), a.length && this.trigger("itemChange", { item: a, data: s, ns: f }); g && h.angular("compile", function() { return { elements: u, data: e.map(t, function(e) { return [{ dataItem: e }] }) } }) } }, _appendItems: function(e, t, n) { var i = c(n), r = i.children(), o = !this._expanded(n); typeof e == N && (e = r.length), this._insertNode(t, e, n, function(t, n) { e >= r.length ? t.appendTo(n) : t.insertBefore(r.eq(e)) }, o), this._expanded(n) && (this._updateNodeClasses(n), c(n).css("display", "block")) }, _refreshChildren: function(e, t, n) { var i, r, o, a = this.options, l = a.loadOnDemand, d = a.checkboxes && a.checkboxes.checkChildren; if (c(e).empty(), t.length) for (this._appendItems(n, t, e), r = c(e).children(), l && d && this._bubbleIndeterminate(r.last()), i = 0; r.length > i; i++) o = r.eq(i), this.trigger("itemChange", { item: o.children("div"), data: this.dataItem(o), ns: f }); else s(e) }, _refreshRoot: function(t) { var n, i, r, o = this._renderGroup({ items: t, group: { firstLevel: !0, expanded: !0 } }); for (this.root.length ? (this._angularItems("cleanup"), n = e(o), this.root.attr("class", n.attr("class")).html(n.html())) : this.root = this.wrapper.html(o).children("ul"), this.root.attr("role", "tree"), i = 0; t.length > i; i++) r = this.root.children(".k-item"), this.trigger("itemChange", { item: r.eq(i), data: t[i], ns: f }); this._angularItems("compile") }, refresh: function(e) { var n, i, r = e.node, o = e.action, a = e.items, s = this.wrapper, l = this.options, c = l.loadOnDemand, d = l.checkboxes && l.checkboxes.checkChildren; if (e.field) { if (!a[0] || !a[0].level) return; return this._updateNodes(a, e.field) } if (r && (s = this.findByUid(r.uid), this._progress(s, !1)), d && "remove" != o) { for (i = !1, n = 0; a.length > n; n++) if ("checked" in a[n]) { i = !0; break } if (!i && r && r.checked) for (n = 0; a.length > n; n++) a[n].checked = !0 } if ("add" == o ? this._appendItems(e.index, a, s) : "remove" == o ? this._remove(this.findByUid(a[0].uid), !1) : "itemchange" == o ? this._updateNodes(a) : "itemloaded" == o ? this._refreshChildren(s, a, e.index) : this._refreshRoot(a), "remove" != o) for (n = 0; a.length > n; n++)(!c || a[n].expanded) && a[n].load(); this.trigger(B, { node: r ? s : t }) }, _error: function(e) { var t = e.node && this.findByUid(e.node.uid), n = this.templates.retry({ messages: this.options.messages }); t ? (this._progress(t, !1), this._expanded(t, !1), u(t).addClass("k-i-refresh"), e.node.loaded(!1)) : (this._progress(!1), this.element.html(n)) }, _retryRequest: function(e) { e.preventDefault(), this.dataSource.fetch() }, expand: function(e) { this._processNodes(e, function(e, t) { this.toggle(t, !0) }) }, collapse: function(e) { this._processNodes(e, function(e, t) { this.toggle(t, !1) }) }, enable: function(e, t) { t = 2 == arguments.length ? !!t : !0, this._processNodes(e, function(e, n) { this.dataItem(n).set("enabled", t) }) }, current: function(n) { var i = this, r = i._current, o = i.element, a = i._ariaId; return arguments.length > 0 && n && n.length ? (r && (r[0].id === a && r.removeAttr("id"), r.find(".k-in:first").removeClass("k-state-focused")), r = i._current = e(n, o).closest(W), r.find(".k-in:first").addClass("k-state-focused"), a = r[0].id || a, a && (i.wrapper.removeAttr("aria-activedescendant"), r.attr("id", a), i.wrapper.attr("aria-activedescendant", a)), t) : (r || (r = i._nextVisible(e())), r) }, select: function(n) { var i = this, r = i.element; return arguments.length ? (n = e(n, r).closest(W), r.find(".k-state-selected").each(function() { var t = i.dataItem(this); t ? (t.set("selected", !1), delete t.selected) : e(this).removeClass("k-state-selected") }), n.length && i.dataItem(n).set("selected", !0), i.trigger(A), t) : r.find(".k-state-selected").closest(W) }, _toggle: function(e, t, n) { var i, r, o = this.options, a = d(e), s = n ? "expand" : "collapse"; a.data("animating") || this._trigger(s, e) || (this._expanded(e, n), i = t && t.loaded(), r = !a.children().length, !n || i && !r ? (this._updateNodeClasses(e, {}, { expanded: n }), n || a.css("height", a.height()).css("height"), a.kendoStop(!0, !0).kendoAnimate(m({ reset: !0 }, o.animation[s], { complete: function() { n && a.css("height", "") } }))) : (o.loadOnDemand && this._progress(e, !0), a.remove(), t.load())) }, toggle: function(t, n) { t = e(t), u(t).is(".k-minus,.k-plus,.k-minus-disabled,.k-plus-disabled") && (1 == arguments.length && (n = !this._expanded(t)), this._expanded(t, n)) }, destroy: function() { var e = this; w.fn.destroy.call(e), e.wrapper.off(x), e._unbindDataSource(), e.dragging && e.dragging.destroy(), p.destroy(e.element), e.root = e.wrapper = e.element = null }, _expanded: function(e, n) { var i = p.attr("expanded"), r = this.dataItem(e); return 1 == arguments.length ? "true" === e.attr(i) || r && r.expanded : (d(e).data("animating") || (r && (r.set("expanded", n), n = r.expanded), n ? (e.attr(i, "true"), e.attr("aria-expanded", "true")) : (e.removeAttr(i), e.attr("aria-expanded", "false"))), t) }, _progress: function(e, t) { var n = this.element, i = this.templates.loading({ messages: this.options.messages }); 1 == arguments.length ? (t = e, t ? n.html(i) : n.empty()) : u(e).toggleClass("k-loading", t).removeClass("k-i-refresh") }, text: function(e, n) { var i = this.dataItem(e), r = this.options[$.text], o = i.level(), a = r.length, s = r[Math.min(o, a - 1)]; return n ? (i.set(s, n), t) : i[s] }, _objectOrSelf: function(t) { return e(t).closest("[data-role=treeview]").data("kendoTreeView") || this }, _dataSourceMove: function(t, n, i, r) { var o, a = this._objectOrSelf(i || n), s = a.dataSource, l = e.Deferred().resolve().promise(); return i && i[0] != a.element[0] && (o = a.dataItem(i), o.loaded() || (a._progress(i, !0), l = o.load()), i != this.root && (s = o.children, s && s instanceof b || (o._initChildren(), o.loaded(!0), s = o.children))), t = this._toObservableData(t), r.call(this, s, t, l) }, _toObservableData: function(t) { var n, i, r = t; return (t instanceof window.jQuery || Y(t)) && (n = this._objectOrSelf(t).dataSource, i = e(t).attr(p.attr("uid")), r = n.getByUid(i), r && (r = n.remove(r))), r }, _insert: function(e, t, n) { t instanceof p.data.ObservableArray ? t = t.toJSON() : _(t) || (t = [t]); var i = e.parent(); return i && i._initChildren && (i.hasChildren = !0, i._initChildren()), e.splice.apply(e, [n, 0].concat(t)), this.findByUid(e[n].uid) }, insertAfter: o(1), insertBefore: o(0), append: function(t, n, i) { var r = this, o = r.root; return n && (o = c(n)), r._dataSourceMove(t, o, n, function(t, o, a) { function s() { n && r._expanded(n, !0); var e = t.data(), i = Math.max(e.length, 0); return r._insert(e, o, i) } var l; return a.then(function() { l = s(), (i = i || e.noop)(l) }), l || null }) }, _remove: function(t, n) { var i, r, o, a = this; return t = e(t, a.element), this.angular("cleanup", function() { return { elements: t.get() } }), i = t.parent().parent(), r = t.prev(), o = t.next(), t[n ? "detach" : "remove"](), i.hasClass("k-item") && (s(i), a._updateNodeClasses(i)), a._updateNodeClasses(r), a._updateNodeClasses(o), t }, remove: function(e) { var t = this.dataItem(e); t && this.dataSource.remove(t) }, detach: function(e) { return this._remove(e, !0) }, findByText: function(t) { return e(this.element).find(".k-in").filter(function(n, i) { return e(i).text() == t }).closest(W) }, findByUid: function(t) { var n, i, r = this.element.find(".k-item"), o = p.attr("uid"); for (i = 0; r.length > i; i++) if (r[i].getAttribute(o) == t) { n = r[i]; break } return e(n) }, expandPath: function(n, i) { function r(e, t, n) { e && !e.loaded() ? e.set("expanded", !0) : t.call(n) } var o, a, s; for (n = n.slice(0), o = this, a = this.dataSource, s = a.get(n[0]), i = i || e.noop; n.length > 0 && s && (s.expanded || s.loaded());) s.set("expanded", !0), n.shift(), s = a.get(n[0]); return n.length ? (a.bind("change", function(e) { var t, s = e.node && e.node.id; s && s === n[0] && (n.shift(), n.length ? (t = a.get(n[0]), r(t, i, o)) : i.call(o)) }), r(s, i, o), t) : i.call(o) }, _parents: function(e) { for (var t = e && e.parentNode(), n = []; t && t.parentNode;) n.push(t), t = t.parentNode(); return n }, expandTo: function(e) { var t, n; for (e instanceof p.data.Node || (e = this.dataSource.get(e)), t = this._parents(e), n = 0; t.length > n; n++) t[n].set("expanded", !0) }, _renderItem: function(e) { return e.group || (e.group = {}), e.treeview = this.options, e.r = this.templates, this.templates.item(e) }, _renderGroup: function(e) { var t = this; return e.renderItems = function(e) { var n = "", i = 0, r = e.items, o = r ? r.length : 0, a = e.group; for (a.length = o; o > i; i++) e.group = a, e.item = r[i], e.item.index = i, n += t._renderItem(e); return n }, e.r = t.templates, t.templates.group(e) } }), f.plugin(l) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n, i, r = []; for (n = 0, i = e.length; i > n; n++) e[n].field !== t && r.push(e[n]); return r } function i(e, t, n) { var i, r, o, a; if (!e) return []; for (e = e.filters, i = 0, r = [], o = e.length; o > i; i++) a = e[i].operator, (n || "in" === a) && a !== n || e[i].field !== t || r.push(e[i]); return r } function r(t, n, r) { var o, a = 0, s = r.length; if (t = i(t, n, "in")[0]) for (o = t.value.split(","); s > a; a++) r[a].checked = e.inArray(r[a].uniqueName, o) >= 0; else for (; s > a; a++) r[a].checked = !0 } function o(e, t) { var n, i = e.length; for (n = 0; i > n; n++) e[n].checked && 0 !== e[n].level() && t.push(e[n].uniqueName), e[n].hasChildren && o(e[n].children.view(), t) } var a = window.kendo, s = a.ui, l = "kendoContextMenu", c = e.proxy, d = ".kendoPivotFieldMenu", u = s.Widget, h = u.extend({ init: function(e, t) { u.fn.init.call(this, e, t), this._dataSource(), this._layout(), a.notify(this) }, events: [], options: { name: "PivotFieldMenu", filter: null, filterable: !0, sortable: !0, messages: { info: "Show items with value that:", sortAscending: "Sort Ascending", sortDescending: "Sort Descending", filterFields: "Fields Filter", filter: "Filter", include: "Include Fields...", title: "Fields to include", clear: "Clear", ok: "OK", cancel: "Cancel", operators: { contains: "Contains", doesnotcontain: "Does not contain", startswith: "Starts with", endswith: "Ends with", eq: "Is equal to", neq: "Is not equal to" } } }, _layout: function() { var t = this.options; this.wrapper = e(a.template(f)({ ns: a.ns, filterable: t.filterable, sortable: t.sortable, messages: t.messages })), this.menu = this.wrapper[l]({ filter: t.filter, target: this.element, orientation: "vertical", showOn: "click", closeOnClick: !1, open: c(this._menuOpen, this), select: c(this._select, this), copyAnchorStyles: !1 }).data(l), this._createWindow(), t.filterable && this._initFilterForm() }, _initFilterForm: function() { var e = this.menu.element.find(".k-filter-item"), t = c(this._filter, this); this._filterOperator = new a.ui.DropDownList(e.find("select")), this._filterValue = e.find(".k-textbox"), e.on("submit" + d, t).on("click" + d, ".k-button-filter", t).on("click" + d, ".k-button-clear", c(this._reset, this)) }, _setFilterForm: function(e) { var t = this._filterOperator, n = "", i = ""; e && (n = e.operator, i = e.value), t.value(n), t.value() || t.select(0), this._filterValue.val(i) }, _clearFilters: function(e) { var t, n, r = this.dataSource.filter() || {}, o = 0; for (r.filters = r.filters || [], t = i(r, e), n = t.length; n > o; o++) r.filters.splice(r.filters.indexOf(t[o]), 1); return r }, _filter: function(e) { var n, i, r = this, o = r._filterValue.val(); return e.preventDefault(), o ? (n = { field: r.currentMember, operator: r._filterOperator.value(), value: o }, i = r._clearFilters(r.currentMember), i.filters.push(n), r.dataSource.filter(i), r.menu.close(), t) : (r.menu.close(), t) }, _reset: function(e) { var t = this, n = t._clearFilters(t.currentMember); e.preventDefault(), n.filters[0] || (n = {}), t.dataSource.filter(n), t._setFilterForm(null), t.menu.close() }, _sort: function(e) { var t = this.currentMember, i = this.dataSource.sort() || []; i = n(i, t), i.push({ field: t, dir: e }), this.dataSource.sort(i), this.menu.close() }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource() }, _dataSource: function() { this.dataSource = a.data.PivotDataSource.create(this.options.dataSource) }, _createWindow: function() { var t = this.options.messages; this.includeWindow = e(a.template(g)({ messages: t })).on("click" + d, ".k-button-ok", c(this._applyIncludes, this)).on("click" + d, ".k-button-cancel", c(this._closeWindow, this)), this.includeWindow = new s.Window(this.includeWindow, { title: t.title, visible: !1, resizable: !1, open: c(this._windowOpen, this) }) }, _applyIncludes: function(e) { var t, n = [], r = this.treeView.dataSource.view(), a = r[0].checked, s = this.dataSource.filter(), l = i(s, this.currentMember, "in")[0]; o(r, n), l && (a ? (s.filters.splice(s.filters.indexOf(l), 1), s.filters.length || (s = {})) : l.value = n.join(","), t = s), n.length && (t || a || (t = { field: this.currentMember, operator: "in", value: n.join(",") }, s && (s.filters.push(t), t = s))), t && this.dataSource.filter(t), this._closeWindow(e) }, _closeWindow: function(e) { e.preventDefault(), this.includeWindow.close() }, _treeViewDataSource: function() { var e = this; return a.data.HierarchicalDataSource.create({ schema: { model: { id: "uniqueName", hasChildren: function(e) { return parseInt(e.childrenCardinality, 10) > 0 } } }, transport: { read: function(t) { var n = {}, i = e.treeView.dataSource.get(t.data.uniqueName), o = t.data.uniqueName; o ? (n.memberUniqueName = i.uniqueName.replace(/\&/g, "&"), n.treeOp = 1) : n.levelUniqueName = e.currentMember + ".[(ALL)]", e.dataSource.schemaMembers(n).done(function(n) { r(e.dataSource.filter(), e.currentMember, n), t.success(n) }).fail(t.error) } } }) }, _createTreeView: function(e) { var t = this; t.treeView = new s.TreeView(e, { autoBind: !1, dataSource: t._treeViewDataSource(), dataTextField: "caption", template: "#: data.item.caption || data.item.name #", checkboxes: { checkChildren: !0 }, dataBound: function() { s.progress(t.includeWindow.element, !1) } }) }, _menuOpen: function(t) { var n; t.event && (n = a.attr("name"), this.currentMember = e(t.event.target).closest("[" + n + "]").attr(n), this.options.filterable && this._setFilterForm(i(this.dataSource.filter(), this.currentMember)[0])) }, _select: function(t) { var n = e(t.item); e(".k-pivot-filter-window").not(this.includeWindow.element).kendoWindow("close"), n.hasClass("k-include-item") ? this.includeWindow.center().open() : n.hasClass("k-sort-asc") ? this._sort("asc") : n.hasClass("k-sort-desc") && this._sort("desc") }, _windowOpen: function() { this.treeView || this._createTreeView(this.includeWindow.element.find(".k-treeview")), s.progress(this.includeWindow.element, !0), this.treeView.dataSource.read() }, destroy: function() { u.fn.destroy.call(this), this.menu && (this.menu.destroy(), this.menu = null), this.treeView && (this.treeView.destroy(), this.treeView = null), this.includeWindow && (this.includeWindow.destroy(), this.includeWindow = null), this.wrapper = null, this.element = null } }), p = '<div class="k-filterable k-content" tabindex="-1" data-role="fieldmenu"><form class="k-filter-menu"><div><div class="k-filter-help-text">#=messages.info#</div><select>#for(var op in messages.operators){#<option value="#=op#">#=messages.operators[op]#</option>#}#</select><input class="k-textbox" type="text" /><div><a class="k-button k-primary k-button-filter" href="\\#">#=messages.filter#</a><a class="k-button k-button-clear" href="\\#">#=messages.clear#</a></div></div></form></div>', f = '<ul class="k-pivot-fieldmenu"># if (sortable) {#<li class="k-item k-sort-asc"><span class="k-link"><span class="k-icon k-i-sort-asc"></span>${messages.sortAscending}</span></li><li class="k-item k-sort-desc"><span class="k-link"><span class="k-icon k-i-sort-desc"></span>${messages.sortDescending}</span></li># if (filterable) {#<li class="k-separator"></li># } ## } ## if (filterable) {#<li class="k-item k-include-item"><span class="k-link"><span class="k-icon k-filter"></span>${messages.include}</span></li><li class="k-separator"></li><li class="k-item k-filter-item"><span class="k-link"><span class="k-icon k-filter"></span>${messages.filterFields}</span><ul><li>' + p + "</li></ul></li># } #</ul>", g = '<div class="k-popup-edit-form k-pivot-filter-window"><div class="k-edit-form-container"><div class="k-treeview"></div><div class="k-edit-buttons k-state-default"><a class="k-button k-primary k-button-ok" href="\\#">${messages.ok}</a><a class="k-button k-button-cancel" href="\\#">${messages.cancel}</a></div></div>'; s.plugin(h) }(window.kendo.jQuery), function(e, t) { function n(t, i) { var r, o, a = []; if (e.isPlainObject(t)) if (t.hasOwnProperty("filters")) a = t.filters; else if (t.field == i) return t; for (e.isArray(t) && (a = t), r = 0; a.length > r; r++) if (o = n(a[r], i)) return o } function i(t, n) { t.filters && (t.filters = e.grep(t.filters, function(e) { return i(e, n), e.filters ? e.filters.length : e.field != n })) } function r(e, t) { var n = o.getter(t, !0); return function(t) { for (var i, r, o = e(t), a = [], s = 0, l = {}; o.length > s;) i = o[s++], r = n(i), l.hasOwnProperty(r) || (a.push(i), l[r] = !0); return a } } var o = window.kendo, a = o.ui, s = o.data.DataSource, l = a.Widget, c = "change", d = "boolean", u = "enums", h = "string", p = "Is equal to", f = "Is not equal to", g = e.proxy, m = l.extend({ init: function(n, i) { var r, a, s, p, f, m, v, _, w, b, y, k; if (n = e(n).addClass("k-filtercell"), r = this.wrapper = e("<span/>").appendTo(n), a = this, f = i, _ = a.operators = i.operators || {}, w = a.input = e("<input/>").attr(o.attr("bind"), "value: value").appendTo(r), l.fn.init.call(a, n[0], i), i = a.options, s = a.dataSource = i.dataSource, a.model = s.reader.model, v = i.type = h, b = o.getter("reader.model.fields", !0)(s) || {}, y = b[i.field], y && y.type && (v = i.type = y.type), i.values && (i.type = v = u), _ = _[v] || i.operators[v], !f.operator) for (m in _) { i.operator = m; break } a._parse = function(e) { return e + "" }, a.model && a.model.fields && (k = a.model.fields[i.field], k && k.parse && (a._parse = g(k.parse, k))), a.viewModel = p = o.observable({ operator: i.operator, value: null, operatorVisible: function() { var e = this.get("value"); return null !== e && e !== t && "undefined" != e } }), p.bind(c, g(a.updateDsFilter, a)), v == h && a.initSuggestDataSource(i), null !== i.inputWidth && w.width(i.inputWidth), a._setInputType(i, v), v != d && i.showOperators !== !1 ? a._createOperatorDropDown(_) : r.addClass("k-operator-hidden"), a._createClearIcon(), o.bind(this.wrapper, p), v == h && (i.template || a.setAutoCompleteSource()), v == u && a.setComboBoxSource(a.options.values), a._refreshUI(), a._refreshHandler = g(a._refreshUI, a), a.dataSource.bind(c, a._refreshHandler) }, _setInputType: function(t, n) { var i, r, a, s, l, c = this, p = c.input; "function" == typeof t.template ? t.template.call(c.viewModel, { element: c.input, dataSource: c.suggestDataSource }) : n == h ? p.attr(o.attr("role"), "autocomplete").attr(o.attr("text-field"), t.dataTextField || t.field).attr(o.attr("filter"), t.suggestionOperator).attr(o.attr("delay"), t.delay).attr(o.attr("min-length"), t.minLength).attr(o.attr("value-primitive"), !0) : "date" == n ? p.attr(o.attr("role"), "datepicker") : n == d ? (p.remove(), i = e("<input type='radio'/>"), r = c.wrapper, a = o.guid(), s = e("<label/>").text(t.messages.isTrue).append(i), i.attr(o.attr("bind"), "checked:value").attr("name", a).val("true"), l = s.clone().text(t.messages.isFalse), i.clone().val("false").appendTo(l), r.append([s, l])) : "number" == n ? p.attr(o.attr("role"), "numerictextbox") : n == u && p.attr(o.attr("role"), "combobox").attr(o.attr("text-field"), "text").attr(o.attr("suggest"), !0).attr(o.attr("filter"), "contains").attr(o.attr("value-field"), "value").attr(o.attr("value-primitive"), !0) }, _createOperatorDropDown: function(t) { var n, i, r = []; for (n in t) r.push({ text: t[n], value: n }); i = e('<input class="k-dropdown-operator" ' + o.attr("bind") + '="value: operator"/>').appendTo(this.wrapper), this.operatorDropDown = i.kendoDropDownList({ dataSource: r, dataTextField: "text", dataValueField: "value", open: function() { this.popup.element.width(150) }, valuePrimitive: !0 }).data("kendoDropDownList"), this.operatorDropDown.wrapper.find(".k-i-arrow-s").removeClass("k-i-arrow-s").addClass("k-filter") }, initSuggestDataSource: function(e) { var n = e.suggestDataSource; n instanceof s || (!e.customDataSource && n && (n.group = t), n = this.suggestDataSource = s.create(n)), e.customDataSource || (n._pageSize = t, n.reader.data = r(n.reader.data, this.options.field)), this.suggestDataSource = n }, setAutoCompleteSource: function() { var e = this.input.data("kendoAutoComplete"); e && e.setDataSource(this.suggestDataSource) }, setComboBoxSource: function(e) { var t = s.create({ data: e }), n = this.input.data("kendoComboBox"); n && n.setDataSource(t) }, _refreshUI: function() { var t = this, i = n(t.dataSource.filter(), this.options.field) || {}, r = t.viewModel; t.manuallyUpdatingVM = !0, i = e.extend(!0, {}, i), t.options.type == d && r.value !== i.value && t.wrapper.find(":radio").prop("checked", !1), i.operator && r.set("operator", i.operator), r.set("value", i.value), t.manuallyUpdatingVM = !1 }, updateDsFilter: function(n) { var i, r, o, a = this, s = a.viewModel; a.manuallyUpdatingVM || "operator" == n.field && s.value === t || (i = e.extend({}, a.viewModel.toJSON(), { field: a.options.field }), r = { logic: "and", filters: [] }, i.value !== t && null !== i.value && r.filters.push(i), o = a._merge(r), a.dataSource.filter(o.filters.length ? o : {})) }, _merge: function(t) { var n, r, o, a = this, s = t.logic || "and", l = t.filters, c = a.dataSource.filter() || { filters: [], logic: "and" }; for (i(c, a.options.field), r = 0, o = l.length; o > r; r++) n = l[r], n.value = a._parse(n.value); return l = e.grep(l, function(e) { return "" !== e.value && null !== e.value }), l.length && (c.filters.length ? (t.filters = l, "and" !== c.logic && (c.filters = [{ logic: c.logic, filters: c.filters }], c.logic = "and"), c.filters.push(l.length > 1 ? t : l[0])) : (c.filters = l, c.logic = s)), c }, _createClearIcon: function() { var t = this; e("<button type='button' class='k-button k-button-icon'/>").attr(o.attr("bind"), "visible:operatorVisible").html("<span class='k-icon k-i-close'/>").click(g(t.clearFilter, t)).appendTo(t.wrapper) }, clearFilter: function() { this.viewModel.set("value", null) }, destroy: function() { var e = this; e.filterModel = null, l.fn.destroy.call(e), o.destroy(e.element) }, events: [c], options: { name: "FilterCell", delay: 200, minLength: 1, inputWidth: null, values: t, customDataSource: !1, field: "", dataTextField: "", type: "string", suggestDataSource: null, suggestionOperator: "startswith", operator: "eq", showOperators: !0, template: null, messages: { isTrue: "is true", isFalse: "is false", filter: "Filter", clear: "Clear", operator: "Operator" }, operators: { string: { eq: p, neq: f, startswith: "Starts with", contains: "Contains", doesnotcontain: "Does not contain", endswith: "Ends with" }, number: { eq: p, neq: f, gte: "Is greater than or equal to", gt: "Is greater than", lte: "Is less than or equal to", lt: "Is less than" }, date: { eq: p, neq: f, gte: "Is after or equal to", gt: "Is after", lte: "Is before or equal to", lt: "Is before" }, enums: { eq: p, neq: f } } } }); a.plugin(m) }(window.kendo.jQuery), function(e, t) { function n(t) { t = e(t), t.children(v).children(".k-icon").remove(), t.filter(":has(.k-panel),:has(.k-content)").children(".k-link:not(:has([class*=k-i-arrow]))").each(function() { var t = e(this), n = t.parent(); t.append("<span class='k-icon " + (n.hasClass(M) ? "k-i-arrow-n k-panelbar-collapse" : "k-i-arrow-s k-panelbar-expand") + "'/>") }) } function i(t) { t = e(t), t.filter(".k-first:not(:first-child)").removeClass(x), t.filter(".k-last:not(:last-child)").removeClass(g), t.filter(":first-child").addClass(x), t.filter(":last-child").addClass(g) } var r = window.kendo, o = r.ui, a = r.keys, s = e.extend, l = e.each, c = r.template, d = o.Widget, u = /^(ul|a|div)$/i, h = ".kendoPanelBar", p = "img", f = "href", g = "k-last", m = "k-link", v = "." + m, _ = "error", w = ".k-item", b = ".k-group", y = b + ":visible", k = "k-image", x = "k-first", C = "expand", S = "select", T = "k-content", D = "activate", A = "collapse", E = "mouseenter", I = "mouseleave", P = "contentLoad", M = "k-state-active", z = "> .k-panel", F = "> .k-content", R = "k-state-focused", H = "k-state-disabled", B = "k-state-selected", L = "." + B, N = "k-state-highlight", O = w + ":not(.k-state-disabled)", V = "> " + O + " > " + v + ", .k-panel > " + O + " > " + v, U = w + ".k-state-disabled > .k-link", W = "> li > " + L + ", .k-panel > li > " + L, j = "k-state-default", G = "aria-disabled", q = "aria-expanded", $ = "aria-hidden", Y = "aria-selected", Q = ":visible", K = ":empty", X = "single", Z = { content: c("<div role='region' class='k-content'#= contentAttributes(data) #>#= content(item) #</div>"), group: c("<ul role='group' aria-hidden='true' class='#= groupCssClass(group) #'#= groupAttributes(group) #>#= renderItems(data) #</ul>"), itemWrapper: c("<#= tag(item) # class='#= textClass(item, group) #' #= contentUrl(item) ##= textAttributes(item) #>#= image(item) ##= sprite(item) ##= text(item) ##= arrow(data) #</#= tag(item) #>"), item: c("<li role='menuitem' #=aria(item)#class='#= wrapperCssClass(group, item) #'>#= itemWrapper(data) ## if (item.items) { ##= subGroup({ items: item.items, panelBar: panelBar, group: { expanded: item.expanded } }) ## } else if (item.content || item.contentUrl) { ##= renderContent(data) ## } #</li>"), image: c("<img class='k-image' alt='' src='#= imageUrl #' />"), arrow: c("<span class='#= arrowClass(item) #'></span>"), sprite: c("<span class='k-sprite #= spriteCssClass #'></span>"), empty: c("") }, J = { aria: function(e) { var t = ""; return (e.items || e.content || e.contentUrl) && (t += q + "='" + (e.expanded ? "true" : "false") + "' "), e.enabled === !1 && (t += G + "='true'"), t }, wrapperCssClass: function(e, t) { var n = "k-item", i = t.index; return n += t.enabled === !1 ? " " + H : t.expanded === !0 ? " " + M : " k-state-default", 0 === i && (n += " k-first"), i == e.length - 1 && (n += " k-last"), t.cssClass && (n += " " + t.cssClass), n }, textClass: function(e, t) { var n = m; return t.firstLevel && (n += " k-header"), n }, textAttributes: function(e) { return e.url ? " href='" + e.url + "'" : "" }, arrowClass: function(e) { var t = "k-icon"; return t += e.expanded ? " k-i-arrow-n k-panelbar-collapse" : " k-i-arrow-s k-panelbar-expand" }, text: function(e) { return e.encoded === !1 ? e.text : r.htmlEncode(e.text) }, tag: function(e) { return e.url || e.contentUrl ? "a" : "span" }, groupAttributes: function(e) { return e.expanded !== !0 ? " style='display:none'" : "" }, groupCssClass: function() { return "k-group k-panel" }, contentAttributes: function(e) { return e.item.expanded !== !0 ? " style='display:none'" : "" }, content: function(e) { return e.content ? e.content : e.contentUrl ? "" : " " }, contentUrl: function(e) { return e.contentUrl ? 'href="' + e.contentUrl + '"' : "" } }, et = d.extend({ init: function(t, n) { var i, o = this; d.fn.init.call(o, t, n), t = o.wrapper = o.element.addClass("k-widget k-reset k-header k-panelbar"), n = o.options, t[0].id && (o._itemId = t[0].id + "_pb_active"), o._tabindex(), o._initData(n), o._updateClasses(), o._animations(n), t.on("click" + h, V, function(t) { o._click(e(t.currentTarget)) && t.preventDefault() }).on(E + h + " " + I + h, V, o._toggleHover).on("click" + h, U, !1).on("keydown" + h, e.proxy(o._keydown, o)).on("focus" + h, function() { var e = o.select(); o._current(e[0] ? e : o._first()) }).on("blur" + h, function() { o._current(null) }).attr("role", "menu"), i = t.find("li." + M + " > ." + T), i[0] && o.expand(i.parent(), !1), r.notify(o) }, events: [C, A, S, D, _, P], options: { name: "PanelBar", animation: { expand: { effects: "expand:vertical", duration: 200 }, collapse: { duration: 200 } }, expandMode: "multiple" }, destroy: function() { d.fn.destroy.call(this), this.element.off(h), r.destroy(this.element) }, _initData: function(e) { var t = this; e.dataSource && (t.element.empty(), t.append(e.dataSource, t.element)) }, setOptions: function(e) { var t = this.options.animation; this._animations(e), e.animation = s(!0, t, e.animation), "dataSource" in e && this._initData(e), d.fn.setOptions.call(this, e) }, expand: function(t, n) { var i = this, r = {}; return n = n !== !1, t = this.element.find(t), t.each(function(o, a) { a = e(a); var s = a.find(z).add(a.find(F)); if (!a.hasClass(H) && s.length > 0) { if (i.options.expandMode == X && i._collapseAllExpanded(a)) return i; t.find("." + N).removeClass(N), a.addClass(N), n || (r = i.options.animation, i.options.animation = { expand: { effects: {} }, collapse: { hide: !0, effects: {} } }), i._triggerEvent(C, a) || i._toggleItem(a, !1), n || (i.options.animation = r) } }), i }, collapse: function(t, n) { var i = this, r = {}; return n = n !== !1, t = i.element.find(t), t.each(function(t, o) { o = e(o); var a = o.find(z).add(o.find(F)); !o.hasClass(H) && a.is(Q) && (o.removeClass(N), n || (r = i.options.animation, i.options.animation = { expand: { effects: {} }, collapse: { hide: !0, effects: {} } }), i._triggerEvent(A, o) || i._toggleItem(o, !0), n || (i.options.animation = r)) }), i }, _toggleDisabled: function(e, t) { e = this.element.find(e), e.toggleClass(j, t).toggleClass(H, !t).attr(G, !t) }, select: function(n) { var i = this; return n === t ? i.element.find(W).parent() : (n = i.element.find(n), n.length ? n.each(function() { var n = e(this), r = n.children(v); return n.hasClass(H) ? i : (i._triggerEvent(S, n) || i._updateSelected(r), t) }) : this._updateSelected(n), i) }, clearSelection: function() { this.select(e()) }, enable: function(e, t) { return this._toggleDisabled(e, t !== !1), this }, disable: function(e) { return this._toggleDisabled(e, !1), this }, append: function(e, t) { t = this.element.find(t); var r = this._insert(e, t, t.length ? t.find(z) : null); return l(r.items, function() { r.group.append(this), i(this) }), n(t), i(r.group.find(".k-first, .k-last")), r.group.height("auto"), this }, insertBefore: function(e, t) { t = this.element.find(t); var n = this._insert(e, t, t.parent()); return l(n.items, function() { t.before(this), i(this) }), i(t), n.group.height("auto"), this }, insertAfter: function(e, t) { t = this.element.find(t); var n = this._insert(e, t, t.parent()); return l(n.items, function() { t.after(this), i(this) }), i(t), n.group.height("auto"), this }, remove: function(e) { e = this.element.find(e); var t = this, r = e.parentsUntil(t.element, w), o = e.parent("ul"); return e.remove(), !o || o.hasClass("k-panelbar") || o.children(w).length || o.remove(), r.length && (r = r.eq(0), n(r), i(r)), t }, reload: function(t) { var n = this; t = n.element.find(t), t.each(function() { var t = e(this); n._ajaxRequest(t, t.children("." + T), !t.is(Q)) }) }, _first: function() { return this.element.children(O).first() }, _last: function() { var e = this.element.children(O).last(), t = e.children(y); return t[0] ? t.children(O).last() : e }, _current: function(n) { var i = this, r = i._focused, o = i._itemId; return n === t ? r : (i.element.removeAttr("aria-activedescendant"), r && r.length && (r[0].id === o && r.removeAttr("id"), r.children(v).removeClass(R)), e(n).length && (o = n[0].id || o, n.attr("id", o).children(v).addClass(R), i.element.attr("aria-activedescendant", o)), i._focused = n, t) }, _keydown: function(e) { var t = this, n = e.keyCode, i = t._current(); e.target == e.currentTarget && (n == a.DOWN || n == a.RIGHT ? (t._current(t._nextItem(i)), e.preventDefault()) : n == a.UP || n == a.LEFT ? (t._current(t._prevItem(i)), e.preventDefault()) : n == a.ENTER || n == a.SPACEBAR ? (t._click(i.children(v)), e.preventDefault()) : n == a.HOME ? (t._current(t._first()), e.preventDefault()) : n == a.END && (t._current(t._last()), e.preventDefault())) }, _nextItem: function(e) { if (!e) return this._first(); var t = e.children(y), n = e.nextAll(":visible").first(); return t[0] && (n = t.children("." + x)), n[0] || (n = e.parent(y).parent(w).next()), n[0] || (n = this._first()), n.hasClass(H) && (n = this._nextItem(n)), n }, _prevItem: function(e) { if (!e) return this._last(); var t, n = e.prevAll(":visible").first(); if (n[0]) for (t = n; t[0];) t = t.children(y).children("." + g), t[0] && (n = t); else n = e.parent(y).parent(w), n[0] || (n = this._last()); return n.hasClass(H) && (n = this._prevItem(n)), n }, _insert: function(t, n, i) { var o, a, l = this, c = e.isPlainObject(t), d = n && n[0]; return d || (i = l.element), a = { firstLevel: i.hasClass("k-panelbar"), expanded: i.parent().hasClass(M), length: i.children().length }, d && !i.length && (i = e(et.renderGroup({ group: a })).appendTo(n)), t instanceof r.Observable && (t = t.toJSON()), c || e.isArray(t) ? (o = e.map(c ? [t] : t, function(t, n) { return e("string" == typeof t ? t : et.renderItem({ group: a, item: s(t, { index: n }) })) }), d && n.attr(q, !1)) : (o = "string" == typeof t && "<" != t.charAt(0) ? l.element.find(t) : e(t), l._updateItemsClasses(o)), { items: o, group: i } }, _toggleHover: function(t) { var n = e(t.currentTarget); n.parents("li." + H).length || n.toggleClass("k-state-hover", t.type == E) }, _updateClasses: function() { var t, r, o = this; t = o.element.find("li > ul").not(function() { return e(this).parentsUntil(".k-panelbar", "div").length }).addClass("k-group k-panel").attr("role", "group"), t.parent().attr(q, !1).not("." + M).children("ul").attr($, !0).hide(), r = o.element.add(t).children(), o._updateItemsClasses(r), n(r), i(r) }, _updateItemsClasses: function(e) { for (var t = e.length, n = 0; t > n; n++) this._updateItemClasses(e[n], n) }, _updateItemClasses: function(t, n) { var i, o, a = this._selected, s = this.options.contentUrls, l = s && s[n], c = this.element[0]; t = e(t).addClass("k-item").attr("role", "menuitem"), r.support.browser.msie && t.css("list-style-position", "inside").css("list-style-position", ""), t.children(p).addClass(k), o = t.children("a").addClass(m), o[0] && (o.attr("href", l), o.children(p).addClass(k)), t.filter(":not([disabled]):not([class*=k-state])").addClass("k-state-default"), t.filter("li[disabled]").addClass("k-state-disabled").attr(G, !0).removeAttr("disabled"), t.children("div").addClass(T).attr("role", "region").attr($, !0).hide().parent().attr(q, !1), o = t.children(L), o[0] && (a && a.removeAttr(Y).children(L).removeClass(B), o.addClass(B), this._selected = t.attr(Y, !0)), t.children(v)[0] || (i = "<span class='" + m + "'/>", s && s[n] && t[0].parentNode == c && (i = '<a class="k-link k-header" href="' + s[n] + '"/>'), t.contents().filter(function() { return !(this.nodeName.match(u) || 3 == this.nodeType && !e.trim(this.nodeValue)) }).wrapAll(i)), t.parent(".k-panelbar")[0] && t.children(v).addClass("k-header") }, _click: function(e) { var t, n, i, r, o, a, s, l = this, c = l.element; if (!e.parents("li." + H).length && e.closest(".k-widget")[0] == c[0]) { if (o = e.closest(v), a = o.closest(w), l._updateSelected(o), n = a.find(z).add(a.find(F)), i = o.attr(f), r = i && ("#" == i.charAt(i.length - 1) || -1 != i.indexOf("#" + l.element[0].id + "-")), t = !(!r && !n.length), n.data("animating")) return t; if (l._triggerEvent(S, a) && (t = !0), t !== !1) return l.options.expandMode == X && l._collapseAllExpanded(a) ? t : (n.length && (s = n.is(Q), l._triggerEvent(s ? A : C, a) || (t = l._toggleItem(a, s))), t) } }, _toggleItem: function(e, n) { var i, r, o = this, a = e.find(z), s = e.find(v), l = s.attr(f); return a.length ? (this._toggleGroup(a, n), i = !0) : (r = e.children("." + T), r.length && (i = !0, r.is(K) && l !== t ? o._ajaxRequest(e, r, n) : o._toggleGroup(r, n))), i }, _toggleGroup: function(e, t) { var n = this, i = n.options.animation, r = i.expand, o = s({}, i.collapse), a = o && "effects" in o; e.is(Q) == t && (e.parent().attr(q, !t).attr($, t).toggleClass(M, !t).find("> .k-link > .k-icon").toggleClass("k-i-arrow-n", !t).toggleClass("k-panelbar-collapse", !t).toggleClass("k-i-arrow-s", t).toggleClass("k-panelbar-expand", t), r = t ? s(a ? o : s({ reverse: !0 }, r), { hide: !0 }) : s({ complete: function(e) { n._triggerEvent(D, e.closest(w)) } }, r), e.kendoStop(!0, !0).kendoAnimate(r)) }, _collapseAllExpanded: function(t) { var n, i = this, r = !1, o = t.find(z).add(t.find(F)); return o.is(Q) && (r = !0), o.is(Q) || 0 === o.length || (n = t.siblings(), n.find(z).add(n.find(F)).filter(function() { return e(this).is(Q) }).each(function(t, n) { n = e(n), r = i._triggerEvent(A, n.closest(w)), r || i._toggleGroup(n, !0) })), r }, _ajaxRequest: function(t, n, i) { var r = this, o = t.find(".k-panelbar-collapse, .k-panelbar-expand"), a = t.find(v), s = setTimeout(function() { o.addClass("k-loading") }, 100), l = {}, c = a.attr(f); e.ajax({ type: "GET", cache: !1, url: c, dataType: "html", data: l, error: function(e, t) { o.removeClass("k-loading"), r.trigger(_, { xhr: e, status: t }) && this.complete() }, complete: function() { clearTimeout(s), o.removeClass("k-loading") }, success: function(e) { function o() { return { elements: n.get() } } try { r.angular("cleanup", o), n.html(e), r.angular("compile", o) } catch (a) { var s = window.console; s && s.error && s.error(a.name + ": " + a.message + " in " + c), this.error(this.xhr, "error") } r._toggleGroup(n, i), r.trigger(P, { item: t[0], contentElement: n[0] }) } }) }, _triggerEvent: function(e, t) { var n = this; return n.trigger(e, { item: t[0] }) }, _updateSelected: function(e) { var t = this, n = t.element, i = e.parent(w), r = t._selected; r && r.removeAttr(Y), t._selected = i.attr(Y, !0), n.find(W).removeClass(B), n.find("> ." + N + ", .k-panel > ." + N).removeClass(N), e.addClass(B), e.parentsUntil(n, w).filter(":has(.k-header)").addClass(N), t._current(i[0] ? i : null) }, _animations: function(e) { e && "animation" in e && !e.animation && (e.animation = { expand: { effects: {} }, collapse: { hide: !0, effects: {} } }) } }); s(et, { renderItem: function(e) { e = s({ panelBar: {}, group: {} }, e); var t = Z.empty, n = e.item; return Z.item(s(e, { image: n.imageUrl ? Z.image : t, sprite: n.spriteCssClass ? Z.sprite : t, itemWrapper: Z.itemWrapper, renderContent: et.renderContent, arrow: n.items || n.content || n.contentUrl ? Z.arrow : t, subGroup: et.renderGroup }, J)) }, renderGroup: function(e) { return Z.group(s({ renderItems: function(e) { for (var t = "", n = 0, i = e.items, r = i ? i.length : 0, o = s({ length: r }, e.group); r > n; n++) t += et.renderItem(s(e, { group: o, item: s({ index: n }, i[n]) })); return t } }, e, J)) }, renderContent: function(e) { return Z.content(s(e, J)) } }), r.ui.plugin(et) }(window.kendo.jQuery), function(e) { var t = e.proxy, n = ".kendoResponsivePanel", i = "open", r = "close", o = "click" + n + " touchstart" + n, a = kendo.ui.Widget, s = a.extend({ init: function(i, r) { a.fn.init.call(this, i, r), this._guid = "_" + kendo.guid(), this._toggleHandler = t(this._toggleButtonClick, this), this._closeHandler = t(this._close, this), e(document.documentElement).on(o, this.options.toggleButton, this._toggleHandler), this._registerBreakpoint(), this.element.addClass("k-rpanel k-rpanel-" + this.options.orientation + " " + this._guid), this._resizeHandler = t(this.resize, this, !1), e(window).on("resize" + n, this._resizeHandler) }, _mediaQuery: "@media (max-width: #= breakpoint-1 #px) {.#= guid #.k-rpanel-animate.k-rpanel-left,.#= guid #.k-rpanel-animate.k-rpanel-right {-webkit-transition: -webkit-transform .2s ease-out;-ms-transition: -ms-transform .2s ease-out;transition: transform .2s ease-out;} .#= guid #.k-rpanel-top {overflow: hidden;}.#= guid #.k-rpanel-animate.k-rpanel-top {-webkit-transition: max-height .2s linear;-ms-transition: max-height .2s linear;transition: max-height .2s linear;}} @media (min-width: #= breakpoint #px) {#= toggleButton # { display: none; } .#= guid #.k-rpanel-left { float: left; } .#= guid #.k-rpanel-right { float: right; } .#= guid #.k-rpanel-left, .#= guid #.k-rpanel-right {position: relative;-webkit-transform: translateX(0);-ms-transform: translateX(0);transform: translateX(0);-webkit-transform: translateX(0) translateZ(0);-ms-transform: translateX(0) translateZ(0);transform: translateX(0) translateZ(0);} .#= guid #.k-rpanel-top { max-height: none; }}", _registerBreakpoint: function() { var e = this.options; this._registerStyle(kendo.template(this._mediaQuery)({ breakpoint: e.breakpoint, toggleButton: e.toggleButton, guid: this._guid })) }, _registerStyle: function(t) { var n = e("head,body")[0], i = document.createElement("style"); n.appendChild(i), i.styleSheet ? i.styleSheet.cssText = t : i.appendChild(document.createTextNode(t)) }, options: { name: "ResponsivePanel", orientation: "left", toggleButton: ".k-rpanel-toggle", breakpoint: 640, autoClose: !0 }, events: [i, r], _resize: function() { this.element.removeClass("k-rpanel-animate") }, _toggleButtonClick: function(e) { e.preventDefault(), this.element.hasClass("k-rpanel-expanded") ? this.close() : this.open() }, open: function() { this.trigger(i) || (this.element.addClass("k-rpanel-animate k-rpanel-expanded"), this.options.autoClose && e(document.documentElement).on(o, this._closeHandler)) }, close: function() { this.trigger(r) || (this.element.addClass("k-rpanel-animate").removeClass("k-rpanel-expanded"), e(document.documentElement).off(o, this._closeHandler)) }, _close: function(t) { var n = t.isDefaultPrevented(), i = e(t.target).closest(this.options.toggleButton + ",.k-rpanel"); i.length || n || this.close() }, destroy: function() { a.fn.destroy.call(this), e(window).off("resize" + n, this._resizeHandler), e(document.documentElement).off(o, this._closeHandler) } }); kendo.ui.plugin(s) }(window.kendo.jQuery), function(e, t) { function n(t) { t.children(m).addClass(S), t.children("a").addClass(b).children(m).addClass(S), t.filter(":not([disabled]):not([class*=k-state-disabled])").addClass(R), t.filter("li[disabled]").addClass(F).removeAttr("disabled"), t.filter(":not([class*=k-state])").children("a").filter(":focus").parent().addClass(H + " " + N), t.attr("role", "tab"), t.filter("." + H).attr("aria-selected", !0), t.each(function() { var t = e(this); t.children("." + b).length || t.contents().filter(function() { return !(this.nodeName.match(f) || 3 == this.nodeType && !d(this.nodeValue)) }).wrapAll("<span class='" + b + "'/>") }) } function i(e) { var t = e.children(".k-item"); t.filter(".k-first:not(:first-child)").removeClass(T), t.filter(".k-last:not(:last-child)").removeClass(y), t.filter(":first-child").addClass(T), t.filter(":last-child").addClass(y) } function r(e, t) { return "<span class='k-button k-button-icon k-button-bare k-tabstrip-" + e + "' unselectable='on'><span class='k-icon " + t + "'></span></span>" } var o = window.kendo, a = o.ui, s = o.keys, l = e.map, c = e.each, d = e.trim, u = e.extend, h = o.template, p = a.Widget, f = /^(a|div)$/i, g = ".kendoTabStrip", m = "img", v = "href", _ = "prev", w = "show", b = "k-link", y = "k-last", k = "click", x = "error", C = ":empty", S = "k-image", T = "k-first", D = "select", A = "activate", E = "k-content", I = "contentUrl", P = "mouseenter", M = "mouseleave", z = "contentLoad", F = "k-state-disabled", R = "k-state-default", H = "k-state-active", B = "k-state-focused", L = "k-state-hover", N = "k-tab-on-top", O = ".k-item:not(." + F + ")", V = ".k-tabstrip-items > " + O + ":not(." + H + ")", U = { content: h("<div class='k-content'#= contentAttributes(data) # role='tabpanel'>#= content(item) #</div>"), itemWrapper: h("<#= tag(item) # class='k-link'#= contentUrl(item) ##= textAttributes(item) #>#= image(item) ##= sprite(item) ##= text(item) #</#= tag(item) #>"), item: h("<li class='#= wrapperCssClass(group, item) #' role='tab' #=item.active ? \"aria-selected='true'\" : ''#>#= itemWrapper(data) #</li>"), image: h("<img class='k-image' alt='' src='#= imageUrl #' />"), sprite: h("<span class='k-sprite #= spriteCssClass #'></span>"), empty: h("") }, W = { wrapperCssClass: function(e, t) { var n = "k-item", i = t.index; return n += t.enabled === !1 ? " k-state-disabled" : " k-state-default", 0 === i && (n += " k-first"), i == e.length - 1 && (n += " k-last"), n }, textAttributes: function(e) { return e.url ? " href='" + e.url + "'" : "" }, text: function(e) { return e.encoded === !1 ? e.text : o.htmlEncode(e.text) }, tag: function(e) { return e.url ? "a" : "span" }, contentAttributes: function(e) { return e.active !== !0 ? " style='display:none' aria-hidden='true' aria-expanded='false'" : "" }, content: function(e) { return e.content ? e.content : e.contentUrl ? "" : " " }, contentUrl: function(e) { return e.contentUrl ? o.attr("content-url") + '="' + e.contentUrl + '"' : "" } }, j = p.extend({ init: function(t, n) { var i, r, a = this; p.fn.init.call(a, t, n), a._animations(a.options), n = a.options, a._wrapper(), a._isRtl = o.support.isRtl(a.wrapper), a._tabindex(), a._updateClasses(), a._dataSource(), n.dataSource && a.dataSource.fetch(), a._tabPosition(), a._scrollable(), a.options.contentUrls && a.wrapper.find(".k-tabstrip-items > .k-item").each(function(t, n) { e(n).find(">." + b).data(I, a.options.contentUrls[t]) }), a.wrapper.on(P + g + " " + M + g, V, a._toggleHover).on("focus" + g, e.proxy(a._active, a)).on("blur" + g, function() { a._current(null) }), a._keyDownProxy = e.proxy(a._keydown, a), n.navigatable && a.wrapper.on("keydown" + g, a._keyDownProxy), a.wrapper.children(".k-tabstrip-items").on(k + g, ".k-state-disabled .k-link", !1).on(k + g, " > " + O, function(t) { var n, i = a.wrapper[0]; if (i !== document.activeElement) if (n = o.support.browser.msie) try { i.setActive() } catch (r) { i.focus() } else i.focus(); a._click(e(t.currentTarget)) && t.preventDefault() }), i = a.tabGroup.children("li." + H), r = a.contentHolder(i.index()), i[0] && r.length > 0 && 0 === r[0].childNodes.length && a.activateTab(i.eq(0)), a.element.attr("role", "tablist"), a.element[0].id && (a._ariaId = a.element[0].id + "_ts_active"), o.notify(a) }, _active: function() { var e = this.tabGroup.children().filter("." + H); e = e[0] ? e : this._endItem("first"), e[0] && this._current(e) }, _endItem: function(e) { return this.tabGroup.children(O)[e]() }, _item: function(e, t) { var n; return n = t === _ ? "last" : "first", e ? (e = e[t](), e[0] || (e = this._endItem(n)), e.hasClass(F) && (e = this._item(e, t)), e) : this._endItem(n) }, _current: function(e) { var n = this, i = n._focused, r = n._ariaId; return e === t ? i : (i && (i[0].id === r && i.removeAttr("id"), i.removeClass(B)), e && (e.hasClass(H) || e.addClass(B), n.element.removeAttr("aria-activedescendant"), r = e[0].id || r, r && (e.attr("id", r), n.element.attr("aria-activedescendant", r))), n._focused = e, t) }, _keydown: function(e) { var n, i = this, r = e.keyCode, o = i._current(), a = i._isRtl; if (e.target == e.currentTarget) { if (r == s.DOWN || r == s.RIGHT) n = a ? _ : "next"; else if (r == s.UP || r == s.LEFT) n = a ? "next" : _; else if (r == s.ENTER || r == s.SPACEBAR) i._click(o), e.preventDefault(); else { if (r == s.HOME) return i._click(i._endItem("first")), e.preventDefault(), t; if (r == s.END) return i._click(i._endItem("last")), e.preventDefault(), t } n && (i._click(i._item(o, n)), e.preventDefault()) } }, _dataSource: function() { var t = this; t.dataSource && t._refreshHandler ? t.dataSource.unbind("change", t._refreshHandler) : t._refreshHandler = e.proxy(t.refresh, t), t.dataSource = o.data.DataSource.create(t.options.dataSource).bind("change", t._refreshHandler) }, setDataSource: function(e) { var t = this; t.options.dataSource = e, t._dataSource(), t.dataSource.fetch() }, _animations: function(e) { e && "animation" in e && !e.animation && (e.animation = { open: { effects: {} }, close: { effects: {} } }) }, refresh: function(e) { var t, n, i, r, a = this, s = a.options, l = o.getter(s.dataTextField), c = o.getter(s.dataContentField), d = o.getter(s.dataContentUrlField), u = o.getter(s.dataImageUrlField), h = o.getter(s.dataUrlField), p = o.getter(s.dataSpriteCssClass), f = [], g = a.dataSource.view(); for (e = e || {}, i = e.action, i && (g = e.items), t = 0, r = g.length; r > t; t++) n = { text: l(g[t]) }, s.dataContentField && (n.content = c(g[t])), s.dataContentUrlField && (n.contentUrl = d(g[t])), s.dataUrlField && (n.url = h(g[t])), s.dataImageUrlField && (n.imageUrl = u(g[t])), s.dataSpriteCssClass && (n.spriteCssClass = p(g[t])), f[t] = n; if ("add" == e.action) e.index < a.tabGroup.children().length ? a.insertBefore(f, a.tabGroup.children().eq(e.index)) : a.append(f); else if ("remove" == e.action) for (t = 0; g.length > t; t++) a.remove(e.index); else "itemchange" == e.action ? (t = a.dataSource.view().indexOf(g[0]), e.field === s.dataTextField && a.tabGroup.children().eq(t).find(".k-link").text(g[0].get(e.field))) : (a.trigger("dataBinding"), a.remove("li"), a.append(f), a.trigger("dataBound")) }, value: function(n) { var i = this; return n === t ? i.select().text() : (n != i.value() && i.tabGroup.children().each(function() { e.trim(e(this).text()) == n && i.select(this) }), t) }, items: function() { return this.tabGroup[0].children }, setOptions: function(e) { var t = this, n = t.options.animation; t._animations(e), e.animation = u(!0, n, e.animation), e.navigatable ? t.wrapper.on("keydown" + g, t._keyDownProxy) : t.wrapper.off("keydown" + g, t._keyDownProxy), p.fn.setOptions.call(t, e) }, events: [D, A, w, x, z, "change", "dataBinding", "dataBound"], options: { name: "TabStrip", dataTextField: "", dataContentField: "", dataImageUrlField: "", dataUrlField: "", dataSpriteCssClass: "", dataContentUrlField: "", tabPosition: "top", animation: { open: { effects: "expand:vertical fadeIn", duration: 200 }, close: { duration: 200 } }, collapsible: !1, navigatable: !0, contentUrls: !1, scrollable: { distance: 200 } }, destroy: function() { var e = this; p.fn.destroy.call(e), e._refreshHandler && e.dataSource.unbind("change", e._refreshHandler), e.wrapper.off(g), e.wrapper.children(".k-tabstrip-items").off(g), e._scrollableModeActive && (e._scrollPrevButton.off().remove(), e._scrollNextButton.off().remove()), e.scrollWrap.children(".k-tabstrip").unwrap(), o.destroy(e.wrapper) }, select: function(t) { var n = this; return 0 === arguments.length ? n.tabGroup.children("li." + H) : (isNaN(t) || (t = n.tabGroup.children().get(t)), t = n.tabGroup.find(t), e(t).each(function(t, i) { i = e(i), i.hasClass(H) || n.trigger(D, { item: i[0], contentElement: n.contentHolder(i.index())[0] }) || n.activateTab(i) }), n) }, enable: function(e, t) { return this._toggleDisabled(e, t !== !1), this }, disable: function(e) { return this._toggleDisabled(e, !1), this }, reload: function(t) { t = this.tabGroup.find(t); var n = this; return t.each(function() { var t = e(this), i = t.find("." + b).data(I), r = n.contentHolder(t.index()); i && n.ajaxRequest(t, r, null, i) }), n }, append: function(e) { var t = this, n = t._create(e); return c(n.tabs, function(e) { var i = n.contents[e]; t.tabGroup.append(this), "bottom" == t.options.tabPosition ? t.tabGroup.before(i) : t._scrollableModeActive ? t._scrollPrevButton.before(i) : t.wrapper.append(i), t.angular("compile", function() { return { elements: [i] } }) }), i(t.tabGroup), t._updateContentElements(), t.resize(!0), t }, insertBefore: function(t, n) { n = this.tabGroup.find(n); var r = this, o = r._create(t), a = e(r.contentElement(n.index())); return c(o.tabs, function(e) { var t = o.contents[e]; n.before(this), a.before(t), r.angular("compile", function() { return { elements: [t] } }) }), i(r.tabGroup), r._updateContentElements(), r.resize(!0), r }, insertAfter: function(t, n) { n = this.tabGroup.find(n); var r = this, o = r._create(t), a = e(r.contentElement(n.index())); return c(o.tabs, function(e) { var t = o.contents[e]; n.after(this), a.after(t), r.angular("compile", function() { return { elements: [t] } }) }), i(r.tabGroup), r._updateContentElements(), r.resize(!0), r }, remove: function(t) { var n, i = this, r = typeof t; return "string" === r ? t = i.tabGroup.find(t) : "number" === r && (t = i.tabGroup.children().eq(t)), n = t.map(function() { var t = i.contentElement(e(this).index()); return o.destroy(t), t }), t.remove(), n.remove(), i._updateContentElements(), i.resize(!0), i }, _create: function(i) { var r, o, a, s = e.isPlainObject(i), c = this; return s || e.isArray(i) ? (i = e.isArray(i) ? i : [i], r = l(i, function(t, n) { return e(j.renderItem({ group: c.tabGroup, item: u(t, { index: n }) })) }), o = l(i, function(n, i) { return "string" == typeof n.content || n.contentUrl ? e(j.renderContent({ item: u(n, { index: i }) })) : t })) : (r = "string" == typeof i && "<" != i[0] ? c.element.find(i) : e(i), o = e(), r.each(function() { if (a = e("<div class='" + E + "'/>"), /k-tabstrip-items/.test(this.parentNode.className)) { var t = parseInt(this.getAttribute("aria-controls").replace(/^.*-/, ""), 10) - 1; a = e(c.contentElement(t)) } o = o.add(a) }), n(r)), { tabs: r, contents: o } }, _toggleDisabled: function(t, n) { t = this.tabGroup.find(t), t.each(function() { e(this).toggleClass(R, n).toggleClass(F, !n) }) }, _updateClasses: function() { var r, o, a, s = this; s.wrapper.addClass("k-widget k-header k-tabstrip"), s.tabGroup = s.wrapper.children("ul").addClass("k-tabstrip-items k-reset"), s.tabGroup[0] || (s.tabGroup = e("<ul class='k-tabstrip-items k-reset'/>").appendTo(s.wrapper)), r = s.tabGroup.find("li").addClass("k-item"), r.length && (o = r.filter("." + H).index(), a = o >= 0 ? o : t, s.tabGroup.contents().filter(function() { return 3 == this.nodeType && !d(this.nodeValue) }).remove()), o >= 0 && r.eq(o).addClass(N), s.contentElements = s.wrapper.children("div"), s.contentElements.addClass(E).eq(a).addClass(H).css({ display: "block" }), r.length && (n(r), i(s.tabGroup), s._updateContentElements()) }, _updateContentElements: function() { var t = this, n = t.options.contentUrls || [], i = t.tabGroup.find(".k-item"), r = (t.element.attr("id") || o.guid()) + "-", a = t.wrapper.children("div"); a.length && i.length > a.length ? (a.each(function(e) { var t = parseInt(this.id.replace(r, ""), 10), n = i.filter("[aria-controls=" + r + t + "]"), o = r + (e + 1); n.data("aria", o), this.setAttribute("id", o) }), i.each(function() { var t = e(this); this.setAttribute("aria-controls", t.data("aria")), t.removeData("aria") })) : i.each(function(i) { var o = a.eq(i), s = r + (i + 1); this.setAttribute("aria-controls", s), !o.length && n[i] ? e("<div class='" + E + "'/>").appendTo(t.wrapper).attr("id", s) : (o.attr("id", s), e(this).children(".k-loading")[0] || n[i] || e("<span class='k-loading k-complete'/>").prependTo(this)), o.attr("role", "tabpanel"), o.filter(":not(." + H + ")").attr("aria-hidden", !0).attr("aria-expanded", !1), o.filter("." + H).attr("aria-expanded", !0) }), t.contentElements = t.contentAnimators = t.wrapper.children("div"), t.tabsHeight = t.tabGroup.outerHeight() + parseInt(t.wrapper.css("border-top-width"), 10) + parseInt(t.wrapper.css("border-bottom-width"), 10), o.kineticScrollNeeded && o.mobile.ui.Scroller && (o.touchScroller(t.contentElements), t.contentElements = t.contentElements.children(".km-scroll-container")) }, _wrapper: function() { var e = this; e.wrapper = e.element.is("ul") ? e.element.wrapAll("<div />").parent() : e.element, e.scrollWrap = e.wrapper.parent(".k-tabstrip-wrapper"), e.scrollWrap[0] || (e.scrollWrap = e.wrapper.wrapAll("<div class='k-tabstrip-wrapper' />").parent()) }, _tabPosition: function() { var e = this, t = e.options.tabPosition; e.wrapper.addClass("k-floatwrap k-tabstrip-" + t), "bottom" == t && e.tabGroup.appendTo(e.wrapper), e.resize(!0) }, _setContentElementsDimensions: function() { var e, t, n, i, r, o, a = this, s = a.options.tabPosition; ("left" == s || "right" == s) && (e = a.wrapper.children(".k-content"), t = e.filter(":visible"), n = "margin-" + s, i = a.tabGroup, r = i.outerWidth(), o = Math.ceil(i.height()) - parseInt(t.css("padding-top"), 10) - parseInt(t.css("padding-bottom"), 10) - parseInt(t.css("border-top-width"), 10) - parseInt(t.css("border-bottom-width"), 10), setTimeout(function() { e.css(n, r).css("min-height", o) })) }, _resize: function() { this._setContentElementsDimensions(), this._scrollable() }, _sizeScrollWrap: function(e) { var t, n; e.is(":visible") && (t = this.options.tabPosition, n = Math.floor(e.outerHeight(!0)) + ("left" === t || "right" === t ? 2 : this.tabsHeight), this.scrollWrap.css("height", n).css("height")) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(L, t.type == P) }, _click: function(e) { var t, n, i = this, r = e.find("." + b), o = r.attr(v), a = i.options.collapsible, s = i.contentHolder(e.index()); if (e.closest(".k-widget")[0] == i.wrapper[0]) { if (e.is("." + F + (a ? "" : ",." + H))) return !0; if (n = r.data(I) || o && ("#" == o.charAt(o.length - 1) || -1 != o.indexOf("#" + i.element[0].id + "-")), t = !o || n, i.tabGroup.children("[data-animating]").length) return t; if (i.trigger(D, { item: e[0], contentElement: s[0] })) return !0; if (t !== !1) return a && e.is("." + H) ? (i.deactivateTab(e), !0) : (i.activateTab(e) && (t = !0), t) } }, _scrollable: function() { var e, t, n, i, a = this, s = a.options; a._scrollableAllowed() && (a.wrapper.addClass("k-tabstrip-scrollable"), e = a.wrapper[0].offsetWidth, t = a.tabGroup[0].scrollWidth, t > e && !a._scrollableModeActive ? (a._nowScrollingTabs = !1, a._isRtl = o.support.isRtl(a.element), a.wrapper.append(r("prev", "k-i-arrow-w") + r("next", "k-i-arrow-e")), n = a._scrollPrevButton = a.wrapper.children(".k-tabstrip-prev"), i = a._scrollNextButton = a.wrapper.children(".k-tabstrip-next"), a.tabGroup.css({ marginLeft: n.outerWidth() + 9, marginRight: i.outerWidth() + 12 }), n.on("mousedown" + g, function() { a._nowScrollingTabs = !0, a._scrollTabsByDelta(s.scrollable.distance * (a._isRtl ? 1 : -1)) }), i.on("mousedown" + g, function() { a._nowScrollingTabs = !0, a._scrollTabsByDelta(s.scrollable.distance * (a._isRtl ? -1 : 1)) }), n.add(i).on("mouseup" + g, function() { a._nowScrollingTabs = !1 }), a._scrollableModeActive = !0, a._toggleScrollButtons()) : a._scrollableModeActive && e >= t ? (a._scrollableModeActive = !1, a.wrapper.removeClass("k-tabstrip-scrollable"), a._scrollPrevButton.off().remove(), a._scrollNextButton.off().remove(), a.tabGroup.css({ marginLeft: "", marginRight: "" })) : a._scrollableModeActive || a.wrapper.removeClass("k-tabstrip-scrollable")) }, _scrollableAllowed: function() { var e = this.options; return e.scrollable && !isNaN(e.scrollable.distance) && ("top" == e.tabPosition || "bottom" == e.tabPosition) }, _scrollTabsToItem: function(e) { var t, n = this, i = n.tabGroup, r = i.scrollLeft(), o = e.outerWidth(), a = n._isRtl ? e.position().left : e.position().left - i.children().first().position().left, s = i[0].offsetWidth, l = Math.ceil(parseFloat(i.css("padding-left"))); n._isRtl ? 0 > a ? t = r + a - (s - r) - l : a + o > s && (t = r + a - o + 2 * l) : a + o > r + s ? t = a + o - s + 2 * l : r > a && (t = a - l), i.finish().animate({ scrollLeft: t }, "fast", "linear", function() { n._toggleScrollButtons() }) }, _scrollTabsByDelta: function(e) { var t = this, n = t.tabGroup, i = n.scrollLeft(); n.finish().animate({ scrollLeft: i + e }, "fast", "linear", function() { t._nowScrollingTabs ? t._scrollTabsByDelta(e) : t._toggleScrollButtons() }) }, _toggleScrollButtons: function() { var e = this, t = e.tabGroup, n = t.scrollLeft(); e._scrollPrevButton.toggle(e._isRtl ? t[0].scrollWidth - t[0].offsetWidth - 1 > n : 0 !== n), e._scrollNextButton.toggle(e._isRtl ? 0 !== n : t[0].scrollWidth - t[0].offsetWidth - 1 > n) }, deactivateTab: function(e) { var t = this, n = t.options.animation, i = n.open, r = u({}, n.close), a = r && "effects" in r; e = t.tabGroup.find(e), r = u(a ? r : u({ reverse: !0 }, i), { hide: !0 }), o.size(i.effects) ? (e.kendoAddClass(R, { duration: i.duration }), e.kendoRemoveClass(H, { duration: i.duration })) : (e.addClass(R), e.removeClass(H)), e.removeAttr("aria-selected"), t.contentAnimators.filter("." + H).kendoStop(!0, !0).kendoAnimate(r).removeClass(H).attr("aria-hidden", !0) }, activateTab: function(e) { var t, n, i, r, a, s, l, c, d, h, p, f, g, m, v; if (!this.tabGroup.children("[data-animating]").length) return e = this.tabGroup.find(e), t = this, n = t.options.animation, i = n.open, r = u({}, n.close), a = r && "effects" in r, s = e.parent().children(), l = s.filter("." + H), c = s.index(e), r = u(a ? r : u({ reverse: !0 }, i), { hide: !0 }), o.size(i.effects) ? (l.kendoRemoveClass(H, { duration: r.duration }), e.kendoRemoveClass(L, { duration: r.duration })) : (l.removeClass(H), e.removeClass(L)), d = t.contentAnimators, t.inRequest && (t.xhr.abort(), t.inRequest = !1), 0 === d.length ? (t.tabGroup.find("." + N).removeClass(N), e.addClass(N).css("z-index"), e.addClass(H), t._current(e), t.trigger("change"), t._scrollableModeActive && t._scrollTabsToItem(e), !1) : (h = d.filter("." + H), p = t.contentHolder(c), f = p.closest(".k-content"), t.tabsHeight = t.tabGroup.outerHeight() + parseInt(t.wrapper.css("border-top-width"), 10) + parseInt(t.wrapper.css("border-bottom-width"), 10), t._sizeScrollWrap(h), 0 === p.length ? (h.removeClass(H).attr("aria-hidden", !0).kendoStop(!0, !0).kendoAnimate(r), !1) : (e.attr("data-animating", !0), g = (e.children("." + b).data(I) || !1) && p.is(C), m = function() { t.tabGroup.find("." + N).removeClass(N), e.addClass(N).css("z-index"), o.size(i.effects) ? (l.kendoAddClass(R, { duration: i.duration }), e.kendoAddClass(H, { duration: i.duration })) : (l.addClass(R), e.addClass(H)), l.removeAttr("aria-selected"), e.attr("aria-selected", !0), t._current(e), t._sizeScrollWrap(f), f.addClass(H).removeAttr("aria-hidden").kendoStop(!0, !0).attr("aria-expanded", !0).kendoAnimate(u({ init: function() { t.trigger(w, { item: e[0], contentElement: p[0] }), o.resize(p) } }, i, { complete: function() { e.removeAttr("data-animating"), t.trigger(A, { item: e[0], contentElement: p[0] }), o.resize(p), t.scrollWrap.css("height", "").css("height") } })) }, v = function() { g ? (e.removeAttr("data-animating"), t.ajaxRequest(e, p, function() { e.attr("data-animating", !0), m(), t.trigger("change") })) : (m(), t.trigger("change")), t._scrollableModeActive && t._scrollTabsToItem(e) }, h.removeClass(H), h.attr("aria-hidden", !0), h.attr("aria-expanded", !1), h.length ? h.kendoStop(!0, !0).kendoAnimate(u({ complete: v }, r)) : v(), !0)) }, contentElement: function(e) { var n, i, r, a; if (isNaN(e - 0)) return t; if (n = this.contentElements && this.contentElements[0] && !o.kineticScrollNeeded ? this.contentElements : this.contentAnimators, e = n && 0 > e ? n.length + e : e, i = RegExp("-" + (e + 1) + "$"), n) for (r = 0, a = n.length; a > r; r++) if (i.test(n.eq(r).closest(".k-content")[0].id)) return n[r]; return t }, contentHolder: function(t) { var n = e(this.contentElement(t)), i = n.children(".km-scroll-container"); return o.support.touch && i[0] ? i : n }, ajaxRequest: function(t, n, i, r) { var a, s, l, c, d, u, h, p, f; t = this.tabGroup.find(t), a = this, s = e.ajaxSettings.xhr, l = t.find("." + b), c = {}, d = t.width() / 2, u = !1, h = t.find(".k-loading").removeClass("k-complete"), h[0] || (h = e("<span class='k-loading'/>").prependTo(t)), p = 2 * d - h.width(), f = function() { h.animate({ marginLeft: (parseInt(h.css("marginLeft"), 10) || 0) < d ? p : 0 }, 500, f) }, o.support.browser.msie && 10 > o.support.browser.version && setTimeout(f, 40), r = r || l.data(I) || l.attr(v), a.inRequest = !0, a.xhr = e.ajax({ type: "GET", cache: !1, url: r, dataType: "html", data: c, xhr: function() { var t = this, n = s(), i = t.progressUpload ? "progressUpload" : t.progress ? "progress" : !1; return n && e.each([n, n.upload], function() { this.addEventListener && this.addEventListener("progress", function(e) { i && t[i](e) }, !1) }), t.noProgress = !(window.XMLHttpRequest && "upload" in new XMLHttpRequest), n }, progress: function(e) { if (e.lengthComputable) { var t = parseInt(e.loaded / e.total * 100, 10) + "%"; h.stop(!0).addClass("k-progress").css({ width: t, marginLeft: 0 }) } }, error: function(e, t) { a.trigger("error", { xhr: e, status: t }) && this.complete() }, stopProgress: function() { clearInterval(u), h.stop(!0).addClass("k-progress")[0].style.cssText = "" }, complete: function(e) { a.inRequest = !1, this.noProgress ? setTimeout(this.stopProgress, 500) : this.stopProgress(), "abort" == e.statusText && h.remove() }, success: function(e) { var s, l, c; h.addClass("k-complete"); try { s = this, l = 10, s.noProgress && (h.width(l + "%"), u = setInterval(function() { s.progress({ lengthComputable: !0, loaded: Math.min(l, 100), total: 100 }), l += 10 }, 40)), a.angular("cleanup", function() { return { elements: n.get() } }), o.destroy(n), n.html(e) } catch (d) { c = window.console, c && c.error && c.error(d.name + ": " + d.message + " in " + r), this.error(this.xhr, "error") } i && i.call(a, n), a.angular("compile", function() { return { elements: n.get() } }), a.trigger(z, { item: t[0], contentElement: n[0] }) } }) } }); u(j, { renderItem: function(e) { e = u({ tabStrip: {}, group: {} }, e); var t = U.empty, n = e.item; return U.item(u(e, { image: n.imageUrl ? U.image : t, sprite: n.spriteCssClass ? U.sprite : t, itemWrapper: U.itemWrapper }, W)) }, renderContent: function(e) { return U.content(u(e, W)) } }), o.ui.plugin(j) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { var i, r = e.getTimezoneOffset(); e.setTime(e.getTime() + t), n || (i = e.getTimezoneOffset() - r, e.setTime(e.getTime() + i * z)) } function i() { var e = new $, t = new $(e.getFullYear(), e.getMonth(), e.getDate(), 0, 0, 0), n = new $(e.getFullYear(), e.getMonth(), e.getDate(), 12, 0, 0); return -1 * (t.getTimezoneOffset() - n.getTimezoneOffset()) } function r(e) { return 60 * e.getHours() * z + e.getMinutes() * z + 1e3 * e.getSeconds() + e.getMilliseconds() } function o(e, t, n) { var i, o = r(t), a = r(n); return e && o != a ? (i = r(e), o > i && (i += F), o > a && (a += F), i >= o && a >= i) : !0 } function a(e) { var t = e.parseFormats; e.format = f(e.format || d.getCulture(e.culture).calendars.standard.patterns.t), t = j(t) ? t : [t], t.splice(0, 0, e.format), e.parseFormats = t } function s(e) { e.preventDefault() } var l, c, d = window.kendo, u = d.keys, h = d.parseDate, p = d._activeElement, f = d._extractFormat, g = d.support, m = g.browser, v = d.ui, _ = v.Widget, w = "open", b = "close", y = "change", k = ".kendoTimePicker", x = "click" + k, C = "k-state-default", S = "disabled", T = "readonly", D = "li", A = "<span/>", E = "k-state-focused", I = "k-state-hover", P = "mouseenter" + k + " mouseleave" + k, M = "mousedown" + k, z = 6e4, F = 864e5, R = "k-state-selected", H = "k-state-disabled", B = "aria-selected", L = "aria-expanded", N = "aria-hidden", O = "aria-disabled", V = "aria-readonly", U = "aria-activedescendant", W = "id", j = e.isArray, G = e.extend, q = e.proxy, $ = Date, Y = new $; Y = new $(Y.getFullYear(), Y.getMonth(), Y.getDate(), 0, 0, 0), l = function(t) { var n = this, i = t.id; n.options = t, n.ul = e('<ul tabindex="-1" role="listbox" aria-hidden="true" unselectable="on" class="k-list k-reset"/>').css({ overflow: g.kineticScrollNeeded ? "" : "auto" }).on(x, D, q(n._click, n)).on("mouseenter" + k, D, function() { e(this).addClass(I) }).on("mouseleave" + k, D, function() { e(this).removeClass(I) }), n.list = e("<div class='k-list-container'/>").append(n.ul).on(M, s), i && (n._timeViewID = i + "_timeview", n._optionID = i + "_option_selected", n.ul.attr(W, n._timeViewID)), n._popup(), n._heightHandler = q(n._height, n), n.template = d.template('<li tabindex="-1" role="option" class="k-item" unselectable="on">#=data#</li>', { useWithBlock: !1 }) }, l.prototype = { current: function(n) { var i = this, r = i.options.active; return n === t ? i._current : (i._current && i._current.removeClass(R).removeAttr(B).removeAttr(W), n && (n = e(n).addClass(R).attr(W, i._optionID).attr(B, !0), i.scroll(n[0])), i._current = n, r && r(n), t) }, close: function() { this.popup.close() }, destroy: function() { var e = this; e.ul.off(k), e.list.off(k), e._touchScroller && e._touchScroller.destroy(), e.popup.destroy() }, open: function() { var e = this; e.ul[0].firstChild || e.bind(), e.popup.open(), e._current && e.scroll(e._current[0]) }, dataBind: function(e) { for (var t, n = this, i = n.options, r = i.format, a = d.toString, s = n.template, l = e.length, c = 0, u = ""; l > c; c++) t = e[c], o(t, i.min, i.max) && (u += s(a(t, r, i.culture))); n._html(u) }, refresh: function() { var e, t, o, a = this, s = a.options, l = s.format, c = i(), u = 0 > c, h = s.min, p = s.max, f = r(h), g = r(p), m = s.interval * z, v = d.toString, _ = a.template, w = new $(+h), b = w.getDate(), y = 0, k = ""; for (o = u ? (F + c * z) / m : F / m, f != g && (f > g && (g += F), o = (g - f) / m + 1), t = parseInt(o, 10); o > y; y++) y && n(w, m, u), g && t == y && (e = r(w), b < w.getDate() && (e += F), e > g && (w = new $(+p))), k += _(v(w, l, s.culture)); a._html(k) }, bind: function() { var e = this, t = e.options.dates; t && t[0] ? e.dataBind(t) : e.refresh() }, _html: function(e) { var t = this; t.ul[0].innerHTML = e, t.popup.unbind(w, t._heightHandler), t.popup.one(w, t._heightHandler), t.current(null), t.select(t._value) }, scroll: function(e) { if (e) { var t, n = this.ul[0], i = e.offsetTop, r = e.offsetHeight, o = n.scrollTop, a = n.clientHeight, s = i + r, l = this._touchScroller; l ? (t = this.list.height(), i > t && (i = i - t + r), l.scrollTo(0, -i)) : n.scrollTop = o > i ? i : s > o + a ? s - a : o } }, select: function(t) { var n = this, i = n.options, r = n._current; t instanceof Date && (t = d.toString(t, i.format, i.culture)), "string" == typeof t && (r && r.text() === t ? t = r : (t = e.grep(n.ul[0].childNodes, function(e) { return (e.textContent || e.innerText) == t }), t = t[0] ? t : null)), n.current(t) }, setOptions: function(e) { var t = this.options; e.min = h(e.min), e.max = h(e.max), this.options = G(t, e, { active: t.active, change: t.change, close: t.close, open: t.open }), this.bind() }, toggle: function() { var e = this; e.popup.visible() ? e.close() : e.open() }, value: function(e) { var t = this; t._value = e, t.ul[0].firstChild && t.select(e) }, _click: function(t) { var n = this, i = e(t.currentTarget), r = i.text(), o = n.options.dates; o && o.length > 0 && (r = o[i.index()]), t.isDefaultPrevented() || (n.select(i), n.options.change(r, !0), n.close()) }, _height: function() { var e = this, t = e.list, n = t.parent(".k-animation-container"), i = e.options.height; e.ul[0].children.length && t.add(n).show().height(e.ul[0].scrollHeight > i ? i : "auto").hide() }, _parse: function(e) { var t = this, n = t.options, i = t._value || Y; return e instanceof $ ? e : (e = h(e, n.parseFormats, n.culture), e && (e = new $(i.getFullYear(), i.getMonth(), i.getDate(), e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds())), e) }, _adjustListWidth: function() { var e, t, n = this.list, i = n[0].style.width, r = this.options.anchor; (n.data("width") || !i) && (e = window.getComputedStyle ? window.getComputedStyle(r[0], null) : 0, t = e ? parseFloat(e.width) : r.outerWidth(), e && (m.mozilla || m.msie) && (t += parseFloat(e.paddingLeft) + parseFloat(e.paddingRight) + parseFloat(e.borderLeftWidth) + parseFloat(e.borderRightWidth)), i = t - (n.outerWidth() - n.width()), n.css({ fontFamily: r.css("font-family"), width: i }).data("width", i)) }, _popup: function() { var e = this, t = e.list, n = e.options, i = n.anchor; e.popup = new v.Popup(t, G(n.popup, { anchor: i, open: n.open, close: n.close, animation: n.animation, isRtl: g.isRtl(n.anchor) })), e._touchScroller = d.touchScroller(e.popup.element) }, move: function(e) { var n = this, i = e.keyCode, r = n.ul[0], o = n._current, a = i === u.DOWN; if (i === u.UP || a) { if (e.altKey) return n.toggle(a), t; o = a ? o ? o[0].nextSibling : r.firstChild : o ? o[0].previousSibling : r.lastChild, o && n.select(o), n.options.change(n._current.text()), e.preventDefault() } else(i === u.ENTER || i === u.TAB || i === u.ESC) && (e.preventDefault(), o && n.options.change(o.text(), !0), n.close()) } }, l.getMilliseconds = r, d.TimeView = l, c = _.extend({ init: function(t, n) { var i, r, o, s = this; _.fn.init.call(s, t, n), t = s.element, n = s.options, n.min = h(t.attr("min")) || h(n.min), n.max = h(t.attr("max")) || h(n.max), a(n), s._initialOptions = G({}, n), s._wrapper(), s.timeView = r = new l(G({}, n, { id: t.attr(W), anchor: s.wrapper, format: n.format, change: function(e, n) { n ? s._change(e) : t.val(e) }, open: function(e) { s.timeView._adjustListWidth(), s.trigger(w) ? e.preventDefault() : (t.attr(L, !0), i.attr(N, !1)) }, close: function(e) { s.trigger(b) ? e.preventDefault() : (t.attr(L, !1), i.attr(N, !0)) }, active: function(e) { t.removeAttr(U), e && t.attr(U, r._optionID) } })), i = r.ul, s._icon(), s._reset(); try { t[0].setAttribute("type", "text") } catch (c) { t[0].type = "text" } t.addClass("k-input").attr({ role: "combobox", "aria-expanded": !1, "aria-owns": r._timeViewID }), o = t.is("[disabled]") || e(s.element).parents("fieldset").is(":disabled"), o ? s.enable(!1) : s.readonly(t.is("[readonly]")), s._old = s._update(n.value || s.element.val()), s._oldText = t.val(), d.notify(s) }, options: { name: "TimePicker", min: Y, max: Y, format: "", dates: [], parseFormats: [], value: null, interval: 30, height: 200, animation: {} }, events: [w, b, y], setOptions: function(e) { var t = this, n = t._value; _.fn.setOptions.call(t, e), e = t.options, a(e), t.timeView.setOptions(e), n && t.element.val(d.toString(n, e.format, e.culture)) }, dataBind: function(e) { j(e) && this.timeView.dataBind(e) }, _editable: function(e) { var t = this, n = e.disable, i = e.readonly, r = t._arrow.off(k), o = t.element.off(k), a = t._inputWrapper.off(k); i || n ? (a.addClass(n ? H : C).removeClass(n ? C : H), o.attr(S, n).attr(T, i).attr(O, n).attr(V, i)) : (a.addClass(C).removeClass(H).on(P, t._toggleHover), o.removeAttr(S).removeAttr(T).attr(O, !1).attr(V, !1).on("keydown" + k, q(t._keydown, t)).on("focusout" + k, q(t._blur, t)).on("focus" + k, function() { t._inputWrapper.addClass(E) }), r.on(x, q(t._click, t)).on(M, s)) }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, destroy: function() { var e = this; _.fn.destroy.call(e), e.timeView.destroy(), e.element.off(k), e._arrow.off(k), e._inputWrapper.off(k), e._form && e._form.off("reset", e._resetHandler) }, close: function() { this.timeView.close() }, open: function() { this.timeView.open() }, min: function(e) { return this._option("min", e) }, max: function(e) { return this._option("max", e) }, value: function(e) { var n = this; return e === t ? n._value : (n._old = n._update(e), null === n._old && n.element.val(""), n._oldText = n.element.val(), t) }, _blur: function() { var e = this, t = e.element.val(); e.close(), t !== e._oldText && e._change(t), e._inputWrapper.removeClass(E) }, _click: function() { var e = this, t = e.element; e.timeView.toggle(), g.touch || t[0] === p() || t.focus() }, _change: function(e) { var t = this; e = t._update(e), +t._old != +e && (t._old = e, t._oldText = t.element.val(), t._typing || t.element.trigger(y), t.trigger(y)), t._typing = !1 }, _icon: function() { var t, n = this, i = n.element; t = i.next("span.k-select"), t[0] || (t = e('<span unselectable="on" class="k-select"><span unselectable="on" class="k-icon k-i-clock">select</span></span>').insertAfter(i)), n._arrow = t.attr({ role: "button", "aria-controls": n.timeView._timeViewID }) }, _keydown: function(e) { var t = this, n = e.keyCode, i = t.timeView, r = t.element.val(); i.popup.visible() || e.altKey ? i.move(e) : n === u.ENTER && r !== t._oldText ? t._change(r) : t._typing = !0 }, _option: function(e, n) { var i = this, r = i.options; return n === t ? r[e] : (n = i.timeView._parse(n), n && (n = new $(+n), r[e] = n, i.timeView.options[e] = n, i.timeView.bind()), t) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(I, "mouseenter" === t.type) }, _update: function(e) { var t = this, n = t.options, i = t.timeView, r = i._parse(e); return o(r, n.min, n.max) || (r = null), t._value = r, t.element.val(r ? d.toString(r, n.format, n.culture) : e), i.value(r), r }, _wrapper: function() { var t, n = this, i = n.element; t = i.parents(".k-timepicker"), t[0] || (t = i.wrap(A).parent().addClass("k-picker-wrap k-state-default"), t = t.wrap(A).parent()), t[0].style.cssText = i[0].style.cssText, n.wrapper = t.addClass("k-widget k-timepicker k-header").addClass(i[0].className), i.css({ width: "100%", height: i[0].style.height }), n._inputWrapper = e(t[0].firstChild) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { t.value(n[0].defaultValue), t.max(t._initialOptions.max), t.min(t._initialOptions.min) }, t._form = r.on("reset", t._resetHandler)) } }), v.plugin(c) }(window.kendo.jQuery), function(e, t) { function n() { var e, t = this.options.anchor, n = t.outerWidth(); a.wrap(this.element).addClass("k-split-wrapper"), e = "border-box" !== this.element.css("box-sizing") ? n - (this.element.outerWidth() - this.element.width()) : n, this.element.css({ fontFamily: t.css("font-family"), "min-width": e }) } function i(e) { e.target.is(".k-toggle-button") || e.target.toggleClass(b, "press" == e.type) } function r(t) { return t = e(t), t.hasClass("km-actionsheet") ? t.closest(".km-popup-wrapper") : t.addClass("km-widget km-actionsheet").wrap('<div class="km-actionsheet-wrapper km-actionsheet-tablet km-widget km-popup"></div>').parent().wrap('<div class="km-popup-wrapper k-popup"></div>').parent() } function o(e) { e.preventDefault() } var a = window.kendo, s = a.Class, l = a.ui.Widget, c = e.proxy, d = a.isFunction, u = "k-toolbar", h = "k-button", p = "k-overflow-button", f = "k-toggle-button", g = "k-button-group", m = "k-split-button", v = "k-separator", _ = "k-popup", w = "k-toolbar-resizable", b = "k-state-active", y = "k-state-disabled", k = "k-state-hidden", x = "k-group-start", C = "k-group-end", S = "k-primary", T = "k-icon", D = "k-i-", A = "k-button-icon", E = "k-button-icontext", I = "k-list-container k-split-container", P = "k-split-button-arrow", M = "k-overflow-anchor", z = "k-overflow-container", F = "k-toolbar-first-visible", R = "k-toolbar-last-visible", H = "click", B = "toggle", L = "open", N = "close", O = "overflowOpen", V = "overflowClose", U = "never", W = "auto", j = "always", G = "k-overflow-hidden", q = a.attr("uid"), $ = a.Class.extend({ addOverflowAttr: function() { this.element.attr(a.attr("overflow"), this.options.overflow || W) }, addUidAttr: function() { this.element.attr(q, this.options.uid) }, addIdAttr: function() { this.options.id && this.element.attr("id", this.options.id) }, addOverflowIdAttr: function() { this.options.id && this.element.attr("id", this.options.id + "_overflow") }, attributes: function() { this.options.attributes && this.element.attr(this.options.attributes) }, show: function() { this.element.removeClass(k).show(), this.options.hidden = !1 }, hide: function() { this.element.addClass(k).hide(), this.options.hidden = !0 }, remove: function() { this.element.remove() }, enable: function(e) { e === t && (e = !0), this.element.toggleClass(y, !e), this.options.enable = e }, twin: function() { var e = this.element.attr(q); return this.overflow ? this.toolbar.element.find("[" + q + "='" + e + "']").data(this.options.type) : this.toolbar.options.resizable ? this.toolbar.popup.element.find("[" + q + "='" + e + "']").data(this.options.type) : t } }), Y = $.extend({ init: function(n, i) { var r = e(n.useButtonTag ? "<button></button>" : "<a></a>"); this.element = r, this.options = n, this.toolbar = i, this.attributes(), n.primary && r.addClass(S), n.togglable && (r.addClass(f), this.toggle(n.selected)), n.url === t || n.useButtonTag || (r.attr("href", n.url), n.mobile && r.attr(a.attr("role"), "button")), n.group && (r.attr(a.attr("group"), n.group), (this.overflow && this.options.overflow === j || !this.overflow) && (this.group = this.toolbar.addToGroup(this, n.group))), !n.togglable && n.click && d(n.click) && (this.clickHandler = n.click), n.togglable && n.toggle && d(n.toggle) && (this.toggleHandler = n.toggle) }, toggle: function(e, t) { e = !!e, this.group && e ? this.group.select(this) : this.group || this.select(e), t && this.twin() && this.twin().toggle(e) }, getParentGroup: function() { return this.options.isChild ? this.element.closest("." + g).data("buttonGroup") : t }, _addGraphics: function() { var t, n, i, r = this.element, o = this.options.icon, a = this.options.spriteCssClass, s = this.options.imageUrl; (a || s || o) && (t = !0, r.contents().not("span.k-sprite,span." + T + ",img.k-image").each(function(n, i) { (1 == i.nodeType || 3 == i.nodeType && e.trim(i.nodeValue).length > 0) && (t = !1) }), r.addClass(t ? A : E)), o ? (n = r.children("span." + T).first(), n[0] || (n = e('<span class="' + T + '"></span>').prependTo(r)), n.addClass(D + o)) : a ? (n = r.children("span.k-sprite").first(), n[0] || (n = e('<span class="k-sprite"></span>').prependTo(r)), n.addClass(a)) : s && (i = r.children("img.k-image").first(), i[0] || (i = e('<img alt="icon" class="k-image" />').prependTo(r)), i.attr("src", s)) } }), Q = Y.extend({ init: function(e, t) { Y.fn.init.call(this, e, t); var n = this.element; n.addClass(h), this.addIdAttr(), e.align && n.addClass("k-align-" + e.align), "overflow" != e.showText && e.text && n.html(e.mobile ? '<span class="km-text">' + e.text + "</span>" : e.text), e.hasIcon = "overflow" != e.showIcon && (e.icon || e.spriteCssClass || e.imageUrl), e.hasIcon && this._addGraphics(), this.addUidAttr(), this.addOverflowAttr(), this.enable(e.enable), e.hidden && this.hide(), this.element.data({ type: "button", button: this }) }, select: function(e) { e === t && (e = !1), this.element.toggleClass(b, e), this.options.selected = e } }), K = Y.extend({ init: function(e, t) { this.overflow = !0, Y.fn.init.call(this, e, t); var n = this.element; n.addClass(p + " " + h), "toolbar" != e.showText && e.text && n.html(e.mobile ? '<span class="km-text">' + e.text + "</span>" : e.text), e.hasIcon = "toolbar" != e.showIcon && (e.icon || e.spriteCssClass || e.imageUrl), e.hasIcon && this._addGraphics(), e.isChild || this._wrap(), this.addOverflowIdAttr(), this.attributes(), this.addUidAttr(), this.addOverflowAttr(), this.enable(e.enable), e.hidden && this.hide(), this.element.data({ type: "button", button: this }) }, _wrap: function() { this.element = this.element.wrap("<li></li>").parent() }, overflowHidden: function() { this.element.addClass(G) }, select: function(e) { e === t && (e = !1), this.options.isChild ? this.element.toggleClass(b, e) : this.element.find(".k-button").toggleClass(b, e), this.options.selected = e } }), X = $.extend({ createButtons: function(t) { var n, i, r = this.options, o = r.buttons || []; for (i = 0; o.length > i; i++) o[i].uid || (o[i].uid = a.guid()), n = new t(e.extend({ mobile: r.mobile, isChild: !0, type: "button" }, o[i]), this.toolbar), n.element.appendTo(this.element) }, refresh: function() { this.element.children().filter(":not('." + k + "'):first").addClass(x), this.element.children().filter(":not('." + k + "'):last").addClass(C) } }), Z = X.extend({ init: function(t, n) { var i = this.element = e("<div></div>"); this.options = t, this.toolbar = n, this.addIdAttr(), t.align && i.addClass("k-align-" + t.align), this.createButtons(Q), this.attributes(), this.addUidAttr(), this.addOverflowAttr(), this.refresh(), i.addClass(g), this.element.data({ type: "buttonGroup", buttonGroup: this }) } }), J = X.extend({ init: function(t, n) { var i = this.element = e("<li></li>"); this.options = t, this.toolbar = n, this.overflow = !0, this.addOverflowIdAttr(), this.createButtons(K), this.attributes(), this.addUidAttr(), this.addOverflowAttr(), this.refresh(), i.addClass((t.mobile ? "" : g) + " k-overflow-group"), this.element.data({ type: "buttonGroup", buttonGroup: this }) }, overflowHidden: function() { this.element.addClass(G) } }), et = $.extend({ init: function(t, n) { var i = this.element = e('<div class="' + m + '"></div>'); this.options = t, this.toolbar = n, this.mainButton = new Q(t, n), this.arrowButton = e('<a class="' + h + " " + P + '"><span class="' + (t.mobile ? "km-icon km-arrowdown" : "k-icon k-i-arrow-s") + '"></span></a>'), this.popupElement = e('<ul class="' + I + '"></ul>'), this.mainButton.element.appendTo(i), this.arrowButton.appendTo(i), this.popupElement.appendTo(i), t.align && i.addClass("k-align-" + t.align), t.id || (t.id = t.uid), i.attr("id", t.id + "_wrapper"), this.addOverflowAttr(), this.addUidAttr(), this.createMenuButtons(), this.createPopup(), this.mainButton.main = !0, i.data({ type: "splitButton", splitButton: this, kendoPopup: this.popup }) }, createMenuButtons: function() { var t, n, i = this.options, r = i.menuButtons; for (n = 0; r.length > n; n++) t = new Q(e.extend({ mobile: i.mobile, type: "button", click: i.click }, r[n]), this.toolbar), t.element.wrap("<li></li>").parent().appendTo(this.popupElement) }, createPopup: function() { var t = this.options, i = this.element; this.popupElement.attr("id", t.id + "_optionlist").attr(q, t.rootUid), t.mobile && (this.popupElement = r(this.popupElement)), this.popup = this.popupElement.kendoPopup({ appendTo: t.mobile ? e(t.mobile).children(".km-pane") : null, anchor: i, isRtl: this.toolbar._isRtl, copyAnchorStyles: !1, animation: t.animation, open: n }).data("kendoPopup") }, remove: function() { this.popup.destroy(), this.element.remove() }, toggle: function() { this.popup.toggle() }, enable: function(e) { e === t && (e = !0), this.mainButton.enable(e), this.options.enable = e } }), tt = $.extend({ init: function(t, n) { var i, r, o = this.element = e('<li class="' + m + '"></li>'), a = t.menuButtons; for (this.options = t, this.toolbar = n, this.overflow = !0, this.mainButton = new K(e.extend({ isChild: !0 }, t)), this.mainButton.element.appendTo(o), r = 0; a.length > r; r++) i = new K(e.extend({ mobile: t.mobile, isChild: !0 }, a[r]), this.toolbar), i.element.appendTo(o); this.addUidAttr(), this.addOverflowAttr(), this.mainButton.main = !0, o.data({ type: "splitButton", splitButton: this }) }, overflowHidden: function() { this.element.addClass(G) } }), nt = $.extend({ init: function(t, n) { var i = this.element = e("<div> </div>"); this.element = i, this.options = t, this.toolbar = n, this.attributes(), this.addIdAttr(), this.addUidAttr(), this.addOverflowAttr(), i.addClass(v), i.data({ type: "separator", separator: this }) } }), it = $.extend({ init: function(t, n) { var i = this.element = e("<li> </li>"); this.element = i, this.options = t, this.toolbar = n, this.overflow = !0, this.attributes(), this.addUidAttr(), this.addOverflowIdAttr(), i.addClass(v), i.data({ type: "separator", separator: this }) }, overflowHidden: function() { this.element.addClass(G) } }), rt = $.extend({ init: function(t, n, i) { var r = d(t) ? t(n) : t; r = r instanceof jQuery ? r.wrap("<div></div>").parent() : e("<div></div>").html(r), this.element = r, this.options = n, this.options.type = "template", this.toolbar = i, this.attributes(), this.addUidAttr(), this.addIdAttr(), this.addOverflowAttr(), r.data({ type: "template", template: this }) } }), ot = $.extend({ init: function(t, n, i) { var r = e(d(t) ? t(n) : t); r = r instanceof jQuery ? r.wrap("<li></li>").parent() : e("<li></li>").html(r), this.element = r, this.options = n, this.options.type = "template", this.toolbar = i, this.overflow = !0, this.attributes(), this.addUidAttr(), this.addOverflowIdAttr(), this.addOverflowAttr(), r.data({ type: "template", template: this }) }, overflowHidden: function() { this.element.addClass(G) } }), at = { button: { toolbar: Q, overflow: K }, buttonGroup: { toolbar: Z, overflow: J }, splitButton: { toolbar: et, overflow: tt }, separator: { toolbar: nt, overflow: it }, overflowAnchor: '<div class="k-overflow-anchor"></div>', overflowContainer: '<ul class="k-overflow-container k-list-container"></ul>' }, st = s.extend({ init: function(e) { this.name = e, this.buttons = [] }, add: function(e) { this.buttons[this.buttons.length] = e }, remove: function(t) { var n = e.inArray(t, this.buttons); this.buttons.splice(n, 1) }, select: function(e) { for (var t = 0; this.buttons.length > t; t++) this.buttons[t].select(!1); e.select(!0) } }), lt = l.extend({ init: function(t, n) { var r, s = this; if (l.fn.init.call(s, t, n), n = s.options, t = s.wrapper = s.element, t.addClass(u + " k-widget"), this.uid = a.guid(), this._isRtl = a.support.isRtl(t), this._groups = {}, t.attr(q, this.uid), s.isMobile = "boolean" == typeof n.mobile ? n.mobile : s.element.closest(".km-root")[0], s.animation = s.isMobile ? { open: { effects: "fade" } } : {}, s.isMobile && (t.addClass("km-widget"), T = "km-icon", D = "km-", h = "km-button", g = "km-buttongroup km-widget", b = "km-state-active", y = "km-state-disabled"), n.resizable ? (s._renderOverflow(), t.addClass(w), s.overflowUserEvents = new a.UserEvents(s.element, { threshold: 5, allowSelection: !0, filter: "." + M, tap: c(s._toggleOverflow, s) }), s._resizeHandler = a.onResize(function() { s.resize() })) : s.popup = { element: e([]) }, n.items && n.items.length) for (r = 0; n.items.length > r; r++) s.add(n.items[r]); s.userEvents = new a.UserEvents(document, { threshold: 5, allowSelection: !0, filter: "[" + q + "=" + this.uid + "] ." + h + ", [" + q + "=" + this.uid + "] ." + p, tap: c(s._buttonClick, s), press: i, release: i }), s.element.on(H, "." + y, o), n.resizable && s.popup.element.on(H, 0 / 0 + y, o), n.resizable && this._toggleOverflowAnchor(), a.notify(s) }, events: [H, B, L, N, O, V], options: { name: "ToolBar", items: [], resizable: !0, mobile: null }, addToGroup: function(e, t) { var n; return n = this._groups[t] ? this._groups[t] : this._groups[t] = new st, n.add(e), n }, destroy: function() { var t = this; t.element.find("." + m).each(function(t, n) { e(n).data("kendoPopup").destroy() }), t.userEvents.destroy(), t.options.resizable && (a.unbindResize(t._resizeHandler), t.overflowUserEvents.destroy(), t.popup.destroy()), l.fn.destroy.call(t) }, add: function(t) { var n, i, r = at[t.type], o = t.template, s = this, l = s.isMobile ? "" : "k-item k-state-default", c = t.overflowTemplate; e.extend(t, { uid: a.guid(), animation: s.animation, mobile: s.isMobile, rootUid: s.uid }), o && !c ? t.overflow = U : t.overflow || (t.overflow = W), t.overflow !== U && s.options.resizable && (c ? i = new ot(c, t, s) : r && (i = new r.overflow(t, s), i.element.addClass(l)), i && (t.overflow === W && i.overflowHidden(), i.element.appendTo(s.popup.container), s.angular("compile", function() { return { elements: i.element.get() } }))), t.overflow !== j && (o ? n = new rt(o, t, s) : r && (n = new r.toolbar(t, s)), n && (s.options.resizable ? (n.element.appendTo(s.element).css("visibility", "hidden"), s._shrink(s.element.innerWidth()), n.element.css("visibility", "visible")) : n.element.appendTo(s.element), s.angular("compile", function() { return { elements: n.element.get() } }))) }, _getItem: function(e) { var t, n, i, r, o = this.options.resizable; return t = this.element.find(e), r = t.length ? t.data("type") : "", n = t.data(r), n && n.main && (t = t.parent("." + m), r = "splitButton", n = t.data(r)), !t.length && o && (t = this.popup.element.find(e), r = t.data("type"), i = t.data(r)), i && i.main && (t = t.parent("." + m), r = "splitButton", i = t.data(r)), n && o && (i = n.twin()), { type: r, toolbar: n, overflow: i } }, remove: function(e) { var t = this._getItem(e); t.toolbar && t.toolbar.remove(), t.overflow && t.overflow.remove(), this.resize(!0) }, hide: function(e) { var t = this._getItem(e); t.toolbar && (t.toolbar.hide(), "button" === t.toolbar.options.type && t.toolbar.options.isChild && t.toolbar.getParentGroup().refresh()), t.overflow && (t.overflow.hide(), "button" === t.overflow.options.type && t.overflow.options.isChild && t.overflow.getParentGroup().refresh()), this.resize(!0) }, show: function(e) { var t = this._getItem(e); t.toolbar && (t.toolbar.show(), "button" === t.toolbar.options.type && t.toolbar.options.isChild && t.toolbar.getParentGroup().refresh()), t.overflow && (t.overflow.show(), "button" === t.overflow.options.type && t.overflow.options.isChild && t.overflow.getParentGroup().refresh()), this.resize(!0) }, enable: function(e, n) { var i = this._getItem(e); t === n && (n = !0), i.toolbar && i.toolbar.enable(n), i.overflow && i.overflow.enable(n) }, getSelectedFromGroup: function(e) { return this.element.find("." + f + "[data-group='" + e + "']").filter("." + b) }, toggle: function(t, n) { var i = e(t), r = i.data("button"); r.options.togglable && r.toggle(n ? n : !r.options.selected, !0) }, _renderOverflow: function() { var t = this, n = at.overflowContainer, i = t._isRtl, o = i ? "left" : "right"; t.overflowAnchor = e(at.overflowAnchor).addClass(h), t.element.append(t.overflowAnchor), t.isMobile ? (t.overflowAnchor.append('<span class="km-icon km-more"></span>'), n = r(n)) : t.overflowAnchor.append('<span class="k-icon k-i-more"></span>'), t.popup = new a.ui.Popup(n, { origin: "bottom " + o, position: "top " + o, anchor: t.overflowAnchor, isRtl: i, animation: t.animation, appendTo: t.isMobile ? e(t.isMobile).children(".km-pane") : null, copyAnchorStyles: !1, open: function(n) { var r = a.wrap(t.popup.element).addClass("k-overflow-wrapper"); t.isMobile ? t.popup.container.css("max-height", parseFloat(e(".km-content:visible").innerHeight()) - 15 + "px") : r.css("margin-left", (i ? -1 : 1) * ((r.outerWidth() - r.width()) / 2 + 1)), t.trigger(O) && n.preventDefault() }, close: function(e) { t.trigger(V) && e.preventDefault() } }), t.popup.container = t.isMobile ? t.popup.element.find("." + z) : t.popup.element, t.popup.container.attr(q, this.uid) }, _toggleOverflowAnchor: function() { this.overflowAnchor.css(this.popup.element.children(":not(." + G + ", ." + _ + ")").length > 0 ? { visibility: "visible", width: "" } : { visibility: "hidden", width: "1px" }) }, _buttonClick: function(n) { var i, r, o, a, s, l, c = this, u = n.target.closest("." + P).length; return n.preventDefault(), u ? (c._toggle(n), t) : (r = e(n.target).closest("." + h, c.element), r.hasClass(M) || (o = r.data("button"), !o && c.popup && (r = e(n.target).closest("." + p, c.popup.container), o = r.parent("li").data("button")), o && o.options.enable && (o.options.togglable ? (s = d(o.toggleHandler) ? o.toggleHandler : null, o.toggle(!o.options.selected, !0), l = { target: r, group: o.options.group, checked: o.options.selected, id: o.options.id }, s && s.call(c, l), c.trigger(B, l)) : (s = d(o.clickHandler) ? o.clickHandler : null, l = { target: r, id: o.options.id }, s && s.call(c, l), c.trigger(H, l)), r.hasClass(p) && c.popup.close(), a = r.closest(".k-split-container"), a[0] && (i = a.data("kendoPopup"), (i ? i : a.parents(".km-popup-wrapper").data("kendoPopup")).close()))), t) }, _toggle: function(t) { var n, i = e(t.target).closest("." + m).data("splitButton"); t.preventDefault(), i.options.enable && (n = i.popup.element.is(":visible") ? this.trigger(N, { target: i.element }) : this.trigger(L, { target: i.element }), n || i.toggle()) }, _toggleOverflow: function() { this.popup.toggle() }, _resize: function(e) { var t = e.width; this.options.resizable && (this.popup.close(), this._shrink(t), this._stretch(t), this._markVisibles(), this._toggleOverflowAnchor()) }, _childrenWidth: function() { var t = 0; return this.element.children(":visible:not('." + k + "')").each(function() { t += e(this).outerWidth(!0) }), Math.ceil(t) }, _shrink: function(e) { var t, n, i; if (e < this._childrenWidth()) for (n = this.element.children(":visible:not([data-overflow='never'], ." + M + ")"), i = n.length - 1; i >= 0 && (t = n.eq(i), !(e > this._childrenWidth())); i--) this._hideItem(t) }, _stretch: function(e) { var t, n, i; if (e > this._childrenWidth()) for (n = this.element.children(":hidden:not('." + k + "')"), i = 0; n.length > i && (t = n.eq(i), !(e < this._childrenWidth()) && this._showItem(t, e)); i++); }, _hideItem: function(e) { e.hide(), this.popup && this.popup.container.find(">li[data-uid='" + e.data("uid") + "']").removeClass(G) }, _showItem: function(e, t) { return e.length && t > this._childrenWidth() + e.outerWidth(!0) ? (e.show(), this.popup && this.popup.container.find(">li[data-uid='" + e.data("uid") + "']").addClass(G), !0) : !1 }, _markVisibles: function() { var e = this.popup.container.children(), t = this.element.children(":not(.k-overflow-anchor)"), n = e.filter(":not(.k-overflow-hidden)"), i = t.filter(":visible"); e.add(t).removeClass(F + " " + R), n.first().add(i.first()).addClass(F), n.last().add(i.last()).addClass(R) } }); a.ui.plugin(lt) }(window.kendo.jQuery), function(e, t) { function n(e) { var t = new Date(2100, 0, 1); return t.setMinutes(-e), t } function i(e) { e.preventDefault() } function r(t) { var n, i = o.getCulture(t.culture).calendars.standard.patterns, r = !t.parseFormats.length; t.format = c(t.format || i.g), t.timeFormat = n = c(t.timeFormat || i.t), o.DateView.normalize(t), r && t.parseFormats.push("yyyy-MM-ddTHH:mm:ss"), -1 === e.inArray(n, t.parseFormats) && t.parseFormats.splice(1, 0, n) } var o = window.kendo, a = o.TimeView, s = o.parseDate, l = o._activeElement, c = o._extractFormat, d = o.calendar, u = d.isInRange, h = d.restrictValue, p = d.isEqualDatePart, f = a.getMilliseconds, g = o.ui, m = g.Widget, v = "open", _ = "close", w = "change", b = ".kendoDateTimePicker", y = "click" + b, k = "disabled", x = "readonly", C = "k-state-default", S = "k-state-focused", T = "k-state-hover", D = "k-state-disabled", A = "mouseenter" + b + " mouseleave" + b, E = "mousedown" + b, I = "month", P = "<span/>", M = "aria-activedescendant", z = "aria-expanded", F = "aria-hidden", R = "aria-owns", H = "aria-disabled", B = "aria-readonly", L = Date, N = new L(1800, 0, 1), O = new L(2099, 11, 31), V = { view: "date" }, U = { view: "time" }, W = e.extend, j = m.extend({ init: function(t, n) { var i, a = this; m.fn.init.call(a, t, n), t = a.element, n = a.options, n.min = s(t.attr("min")) || s(n.min), n.max = s(t.attr("max")) || s(n.max), r(n), a._initialOptions = W({}, n), a._wrapper(), a._views(), a._icons(), a._reset(), a._template(); try { t[0].setAttribute("type", "text") } catch (l) { t[0].type = "text" } t.addClass("k-input").attr({ role: "combobox", "aria-expanded": !1 }), a._midnight = a._calculateMidnight(n.min, n.max), i = t.is("[disabled]") || e(a.element).parents("fieldset").is(":disabled"), i ? a.enable(!1) : a.readonly(t.is("[readonly]")), a._old = a._update(n.value || a.element.val()), a._oldText = t.val(), o.notify(a) }, options: { name: "DateTimePicker", value: null, format: "", timeFormat: "", culture: "", parseFormats: [], dates: [], min: new L(N), max: new L(O), interval: 30, height: 200, footer: "", start: I, depth: I, animation: {}, month: {}, ARIATemplate: 'Current focused date is #=kendo.toString(data.current, "d")#' }, events: [v, _, w], setOptions: function(e) { var t, n, i, a = this, l = a._value; m.fn.setOptions.call(a, e), e = a.options, e.min = t = s(e.min), e.max = n = s(e.max), r(e), a._midnight = a._calculateMidnight(e.min, e.max), i = e.value || a._value || a.dateView._current, t && !p(t, i) && (t = new L(N)), n && !p(n, i) && (n = new L(O)), a.dateView.setOptions(e), a.timeView.setOptions(W({}, e, { format: e.timeFormat, min: t, max: n })), l && (a.element.val(o.toString(l, e.format, e.culture)), a._updateARIA(l)) }, _editable: function(t) { var n = this, r = n.element.off(b), a = n._dateIcon.off(b), s = n._timeIcon.off(b), c = n._inputWrapper.off(b), d = t.readonly, u = t.disable; d || u ? (c.addClass(u ? D : C).removeClass(u ? C : D), r.attr(k, u).attr(x, d).attr(H, u).attr(B, d)) : (c.addClass(C).removeClass(D).on(A, n._toggleHover), r.removeAttr(k).removeAttr(x).attr(H, !1).attr(B, !1).on("keydown" + b, e.proxy(n._keydown, n)).on("focus" + b, function() { n._inputWrapper.addClass(S) }).on("focusout" + b, function() { n._inputWrapper.removeClass(S), r.val() !== n._oldText && n._change(r.val()), n.close("date"), n.close("time") }), a.on(E, i).on(y, function() { n.toggle("date"), o.support.touch || r[0] === l() || r.focus() }), s.on(E, i).on(y, function() { n.toggle("time"), o.support.touch || r[0] === l() || r.focus() })) }, readonly: function(e) { this._editable({ readonly: e === t ? !0 : e, disable: !1 }) }, enable: function(e) { this._editable({ readonly: !1, disable: !(e = e === t ? !0 : e) }) }, destroy: function() { var e = this; m.fn.destroy.call(e), e.dateView.destroy(), e.timeView.destroy(), e.element.off(b), e._dateIcon.off(b), e._timeIcon.off(b), e._inputWrapper.off(b), e._form && e._form.off("reset", e._resetHandler) }, close: function(e) { "time" !== e && (e = "date"), this[e + "View"].close() }, open: function(e) { "time" !== e && (e = "date"), this[e + "View"].open() }, min: function(e) { return this._option("min", e) }, max: function(e) { return this._option("max", e) }, toggle: function(e) { var t = "timeView"; "time" !== e ? e = "date" : t = "dateView", this[e + "View"].toggle(), this[t].close() }, value: function(e) { var n = this; return e === t ? n._value : (n._old = n._update(e), null === n._old && n.element.val(""), n._oldText = n.element.val(), t) }, _change: function(e) { var t = this; e = t._update(e), +t._old != +e && (t._old = e, t._oldText = t.element.val(), t.trigger(w), t._typing || t.element.trigger(w)) }, _option: function(e, i) { var r, o, a = this, l = a.options, c = a.timeView, d = c.options, u = a._value || a._old; if (i === t) return l[e]; if (i = s(i, l.parseFormats, l.culture)) { if (l.min.getTime() === l.max.getTime() && (d.dates = []), l[e] = new L(i.getTime()), a.dateView[e](i), a._midnight = a._calculateMidnight(l.min, l.max), u && (r = p(l.min, u), o = p(l.max, u)), r || o) { if (d[e] = i, r && !o && (d.max = n(l.interval)), o) { if (a._midnight) return c.dataBind([O]), t; r || (d.min = N) } } else d.max = O, d.min = N; c.bind() } }, _toggleHover: function(t) { e(t.currentTarget).toggleClass(T, "mouseenter" === t.type) }, _update: function(t) { var i, r, a, l, c, d = this, f = d.options, g = f.min, m = f.max, v = f.dates, _ = d.timeView, w = d._value, b = s(t, f.parseFormats, f.culture), y = null === b && null === w || b instanceof Date && w instanceof Date; return +b === +w && y ? (c = o.toString(b, f.format, f.culture), c !== t && d.element.val(null === b ? t : c), b) : (null !== b && p(b, g) ? b = h(b, g, m) : u(b, g, m) || (b = null), d._value = b, _.value(b), d.dateView.value(b), b && (a = d._old, r = _.options, v[0] && (v = e.grep(v, function(e) { return p(b, e) }), v[0] && (_.dataBind(v), l = !0)), l || (p(b, g) && (r.min = g, r.max = n(f.interval), i = !0), p(b, m) && (d._midnight ? (_.dataBind([O]), l = !0) : (r.max = m, i || (r.min = N), i = !0))), !l && (!a && i || a && !p(a, b)) && (i || (r.max = O, r.min = N), _.bind())), d.element.val(b ? o.toString(b, f.format, f.culture) : t), d._updateARIA(b), b) }, _keydown: function(e) { var t = this, n = t.dateView, i = t.timeView, r = t.element.val(), a = n.popup.visible(); e.altKey && e.keyCode === o.keys.DOWN ? t.toggle(a ? "time" : "date") : a ? (n.move(e), t._updateARIA(n._current)) : i.popup.visible() ? i.move(e) : e.keyCode === o.keys.ENTER && r !== t._oldText ? t._change(r) : t._typing = !0 }, _views: function() { var e, t, n, i, r, l, c = this, d = c.element, h = c.options, p = d.attr("id"); c.dateView = e = new o.DateView(W({}, h, { id: p, anchor: c.wrapper, change: function() { var t, n = e.calendar.value(), i = +n, r = +h.min, o = +h.max; (i === r || i === o) && (t = new L(+c._value), t.setFullYear(n.getFullYear(), n.getMonth(), n.getDate()), u(t, r, o) && (n = t)), c._change(n), c.close("date") }, close: function(e) { c.trigger(_, V) ? e.preventDefault() : (d.attr(z, !1), n.attr(F, !0), t.popup.visible() || d.removeAttr(R)) }, open: function(t) { c.trigger(v, V) ? t.preventDefault() : (d.val() !== c._oldText && (l = s(d.val(), h.parseFormats, h.culture), c.dateView[l ? "current" : "value"](l)), n.attr(F, !1), d.attr(z, !0).attr(R, e._dateViewID), c._updateARIA(l)) } })), n = e.div, r = h.min.getTime(), c.timeView = t = new a({ id: p, value: h.value, anchor: c.wrapper, animation: h.animation, format: h.timeFormat, culture: h.culture, height: h.height, interval: h.interval, min: new L(N), max: new L(O), dates: r === h.max.getTime() ? [new Date(r)] : [], parseFormats: h.parseFormats, change: function(n, i) { n = t._parse(n), h.min > n ? (n = new L(+h.min), t.options.min = n) : n > h.max && (n = new L(+h.max), t.options.max = n), i ? (c._timeSelected = !0, c._change(n)) : (d.val(o.toString(n, h.format, h.culture)), e.value(n), c._updateARIA(n)) }, close: function(t) { c.trigger(_, U) ? t.preventDefault() : (i.attr(F, !0), d.attr(z, !1), e.popup.visible() || d.removeAttr(R)) }, open: function(e) { t._adjustListWidth(), c.trigger(v, U) ? e.preventDefault() : (d.val() !== c._oldText && (l = s(d.val(), h.parseFormats, h.culture), c.timeView.value(l)), i.attr(F, !1), d.attr(z, !0).attr(R, t._timeViewID), t.options.active(t.current())) }, active: function(e) { d.removeAttr(M), e && d.attr(M, t._optionID) } }), i = t.ul }, _icons: function() { var t, n = this, i = n.element; t = i.next("span.k-select"), t[0] || (t = e('<span unselectable="on" class="k-select"><span unselectable="on" class="k-icon k-i-calendar">select</span><span unselectable="on" class="k-icon k-i-clock">select</span></span>').insertAfter(i)), t = t.children(), n._dateIcon = t.eq(0).attr({ role: "button", "aria-controls": n.dateView._dateViewID }), n._timeIcon = t.eq(1).attr({ role: "button", "aria-controls": n.timeView._timeViewID }) }, _wrapper: function() { var t, n = this, i = n.element; t = i.parents(".k-datetimepicker"), t[0] || (t = i.wrap(P).parent().addClass("k-picker-wrap k-state-default"), t = t.wrap(P).parent()), t[0].style.cssText = i[0].style.cssText, i.css({ width: "100%", height: i[0].style.height }), n.wrapper = t.addClass("k-widget k-datetimepicker k-header").addClass(i[0].className), n._inputWrapper = e(t[0].firstChild) }, _reset: function() { var t = this, n = t.element, i = n.attr("form"), r = i ? e("#" + i) : n.closest("form"); r[0] && (t._resetHandler = function() { t.value(n[0].defaultValue), t.max(t._initialOptions.max), t.min(t._initialOptions.min) }, t._form = r.on("reset", t._resetHandler)) }, _template: function() { this._ariaTemplate = o.template(this.options.ARIATemplate) }, _calculateMidnight: function(e, t) { return f(e) + f(t) === 0 }, _updateARIA: function(e) { var t, n = this, i = n.dateView.calendar; n.element.removeAttr(M), i && (t = i._cell, t.attr("aria-label", n._ariaTemplate({ current: e || i.current() })), n.element.attr(M, t.attr("id"))) } }); g.plugin(j) }(window.kendo.jQuery), function(e, t) { function n(e) { return v.test(e) } function i(e) { return m.test(e) || /^\d+$/.test(e) } function r(e) { return !n(e) && !i(e) } function o(e, t) { var i = parseInt(e, 10); return n(e) && (i = Math.floor(i * t / 100)), i } function a(e, n) { return function(i, r) { var o, a = this.element.find(i).data(E); return 1 == arguments.length ? a[e] : (a[e] = r, n && (o = this.element.data("kendo" + this.options.name), o.resize(!0)), t) } } function s(e) { var t = this, n = e.orientation; t.owner = e, t._element = e.element, t.orientation = n, p(t, n === S ? c : l), t._resizable = new d.ui.Resizable(e.element, { orientation: n, handle: ".k-splitbar-draggable-" + n + "[data-marker=" + e._marker + "]", hint: f(t._createHint, t), start: f(t._start, t), max: f(t._max, t), min: f(t._min, t), invalidClass: "k-restricted-size-" + n, resizeend: f(t._stop, t) }) } var l, c, d = window.kendo, u = d.ui, h = d.keys, p = e.extend, f = e.proxy, g = u.Widget, m = /^\d+(\.\d+)?px$/i, v = /^\d+(\.\d+)?%$/i, _ = ".kendoSplitter", w = "expand", b = "collapse", y = "contentLoad", k = "error", x = "resize", C = "layoutChange", S = "horizontal", T = "vertical", D = "mouseenter", A = "click", E = "pane", I = "mouseleave", P = "k-state-focused", M = "k-" + E, z = "." + M, F = g.extend({ init: function(e, t) { var n, i = this; g.fn.init.call(i, e, t), i.wrapper = i.element, n = i.options.orientation.toLowerCase() != T, i.orientation = n ? S : T, i._dimension = n ? "width" : "height", i._keys = { decrease: n ? h.LEFT : h.UP, increase: n ? h.RIGHT : h.DOWN }, i._resizeStep = 10, i._marker = d.guid().substring(0, 8), i._initPanes(), i.resizing = new s(i), i.element.triggerHandler("init" + _) }, events: [w, b, y, k, x, C], _addOverlays: function() { this._panes().append("<div class='k-splitter-overlay k-overlay' />") }, _removeOverlays: function() { this._panes().children(".k-splitter-overlay").remove() }, _attachEvents: function() { var t = this, n = t.options.orientation; t.element.children(".k-splitbar-draggable-" + n).on("keydown" + _, f(t._keydown, t)).on("mousedown" + _, function(e) { e.currentTarget.focus() }).on("focus" + _, function(t) { e(t.currentTarget).addClass(P) }).on("blur" + _, function(n) { e(n.currentTarget).removeClass(P), t.resizing && t.resizing.end() }).on(D + _, function() { e(this).addClass("k-splitbar-" + t.orientation + "-hover") }).on(I + _, function() { e(this).removeClass("k-splitbar-" + t.orientation + "-hover") }).on("mousedown" + _, f(t._addOverlays, t)).end().children(".k-splitbar").on("dblclick" + _, f(t._togglePane, t)).children(".k-collapse-next, .k-collapse-prev").on(A + _, t._arrowClick(b)).end().children(".k-expand-next, .k-expand-prev").on(A + _, t._arrowClick(w)).end().end(), e(window).on("resize" + _ + t._marker, f(t.resize, t, !1)), e(document).on("mouseup" + _ + t._marker, f(t._removeOverlays, t)) }, _detachEvents: function() { var t = this; t.element.children(".k-splitbar-draggable-" + t.orientation).off(_).end().children(".k-splitbar").off("dblclick" + _).children(".k-collapse-next, .k-collapse-prev, .k-expand-next, .k-expand-prev").off(_), e(window).off(_ + t._marker), e(document).off(_ + t._marker) }, options: { name: "Splitter", orientation: S, panes: [] }, destroy: function() { g.fn.destroy.call(this), this._detachEvents(), this.resizing && this.resizing.destroy(), d.destroy(this.element), this.wrapper = this.element = null }, _keydown: function(t) { var n, i = this, r = t.keyCode, o = i.resizing, a = e(t.currentTarget), s = i._keys, l = r === s.increase, c = r === s.decrease; l || c ? (t.ctrlKey ? (n = a[c ? "next" : "prev"](), o && o.isResizing() && o.end(), n[i._dimension]() ? i._triggerAction(b, a[c ? "prev" : "next"]()) : i._triggerAction(w, n)) : o && o.move((c ? -1 : 1) * i._resizeStep, a), t.preventDefault()) : r === h.ENTER && o && (o.end(), t.preventDefault()) }, _initPanes: function() { var e = this.options.panes || [], t = this; this.element.addClass("k-widget").addClass("k-splitter").children().each(function(n, i) { "script" != i.nodeName.toLowerCase() && t._initPane(i, e[n]) }), this.resize() }, _initPane: function(t, n) { t = e(t).attr("role", "group").addClass(M), t.data(E, n ? n : {}).toggleClass("k-scrollable", n ? n.scrollable !== !1 : !0), this.ajaxRequest(t) }, ajaxRequest: function(e, t, n) { var i, r = this; e = r.element.find(e), i = e.data(E), t = t || i.contentUrl, t && (e.append("<span class='k-icon k-loading k-pane-loading' />"), d.isLocalUrl(t) ? jQuery.ajax({ url: t, data: n || {}, type: "GET", dataType: "html", success: function(t) { r.angular("cleanup", function() { return { elements: e.get() } }), e.html(t), r.angular("compile", function() { return { elements: e.get() } }), r.trigger(y, { pane: e[0] }) }, error: function(t, n) { r.trigger(k, { pane: e[0], status: n, xhr: t }) } }) : e.removeClass("k-scrollable").html("<iframe src='" + t + "' frameborder='0' class='k-content-frame'>This page requires frames in order to show content</iframe>")) }, _triggerAction: function(e, t) { this.trigger(e, { pane: t[0] }) || this[e](t[0]) }, _togglePane: function(t) { var n, i = this, r = e(t.target); r.closest(".k-splitter")[0] == i.element[0] && (n = r.children(".k-icon:not(.k-resize-handle)"), 1 === n.length && (n.is(".k-collapse-prev") ? i._triggerAction(b, r.prev()) : n.is(".k-collapse-next") ? i._triggerAction(b, r.next()) : n.is(".k-expand-prev") ? i._triggerAction(w, r.prev()) : n.is(".k-expand-next") && i._triggerAction(w, r.next()))) }, _arrowClick: function(t) { var n = this; return function(i) { var r, o = e(i.target); o.closest(".k-splitter")[0] == n.element[0] && (r = o.is(".k-" + t + "-prev") ? o.parent().prev() : o.parent().next(), n._triggerAction(t, r)) } }, _updateSplitBar: function(e, t, n) { var i = function(e, t) { return t ? "<div class='k-icon " + e + "' />" : "" }, r = this.orientation, o = t.resizable !== !1 && n.resizable !== !1, a = t.collapsible, s = t.collapsed, l = n.collapsible, c = n.collapsed; e.addClass("k-splitbar k-state-default k-splitbar-" + r).attr("role", "separator").attr("aria-expanded", !(s || c)).removeClass("k-splitbar-" + r + "-hover").toggleClass("k-splitbar-draggable-" + r, o && !s && !c).toggleClass("k-splitbar-static-" + r, !o && !a && !l).html(i("k-collapse-prev", a && !s && !c) + i("k-expand-prev", a && s && !c) + i("k-resize-handle", o) + i("k-collapse-next", l && !c && !s) + i("k-expand-next", l && c && !s)), o || a || l || e.removeAttr("tabindex") }, _updateSplitBars: function() { var t = this; this.element.children(".k-splitbar").each(function() { var n = e(this), i = n.prevAll(z).first().data(E), r = n.nextAll(z).first().data(E); r && t._updateSplitBar(n, i, r) }) }, _removeSplitBars: function() { this.element.children(".k-splitbar").remove() }, _panes: function() { return this.element ? this.element.children(z) : e() }, _resize: function() { var n, i, a, s, l, c, u, h, p, f, g = this, m = g.element, v = m.children(z), _ = g.orientation == S, w = m.children(".k-splitbar"), b = w.length, y = _ ? "width" : "height", k = m[y](); g.wrapper.addClass("k-splitter-resizing"), 0 === b ? (b = v.length - 1, v.slice(0, b).after("<div tabindex='0' class='k-splitbar' data-marker='" + g._marker + "' />"), g._updateSplitBars(), w = m.children(".k-splitbar")) : g._updateSplitBars(), w.each(function() { k -= this[_ ? "offsetWidth" : "offsetHeight"] }), n = 0, i = 0, a = e(), v.css({ position: "absolute", top: 0 })[y](function() { var s, l = e(this), c = l.data(E) || {}; if (l.removeClass("k-state-collapsed"), c.collapsed) s = c.collapsedSize ? o(c.collapsedSize, k) : 0, l.css("overflow", "hidden").addClass("k-state-collapsed"); else { if (r(c.size)) return a = a.add(this), t; s = o(c.size, k) } return i++, n += s, s }), k -= n, s = a.length, l = Math.floor(k / s), a.slice(0, s - 1).css(y, l).end().eq(s - 1).css(y, k - (s - 1) * l), c = 0, u = _ ? "height" : "width", h = _ ? "left" : "top", p = _ ? "offsetWidth" : "offsetHeight", 0 === s && (f = v.filter(function() { return !(e(this).data(E) || {}).collapsed }).last(), f[y](k + f[0][p])), m.children().css(u, m[u]()).each(function(e, t) { "script" != t.tagName.toLowerCase() && (t.style[h] = Math.floor(c) + "px", c += t[p]) }), g._detachEvents(), g._attachEvents(), g.wrapper.removeClass("k-splitter-resizing"), d.resize(v), g.trigger(C) }, toggle: function(e, n) { var i, r = this; e = r.element.find(e), i = e.data(E), (n || i.collapsible) && (1 == arguments.length && (n = i.collapsed === t ? !1 : i.collapsed), i.collapsed = !n, i.collapsed ? e.css("overflow", "hidden") : e.css("overflow", ""), r.resize(!0)) }, collapse: function(e) { this.toggle(e, !1) }, expand: function(e) { this.toggle(e, !0) }, _addPane: function(e, t, n) { var i = this; return n.length && (i.options.panes.splice(t, 0, e), i._initPane(n, e), i._removeSplitBars(), i.resize(!0)), n }, append: function(t) { t = t || {}; var n = this, i = e("<div />").appendTo(n.element); return n._addPane(t, n.options.panes.length, i) }, insertBefore: function(t, n) { n = e(n), t = t || {}; var i = this, r = i.wrapper.children(".k-pane").index(n), o = e("<div />").insertBefore(e(n)); return i._addPane(t, r, o) }, insertAfter: function(t, n) { n = e(n), t = t || {}; var i = this, r = i.wrapper.children(".k-pane").index(n), o = e("<div />").insertAfter(e(n)); return i._addPane(t, r + 1, o) }, remove: function(t) { t = e(t); var n = this; return t.length && (d.destroy(t), t.each(function(t, i) { n.options.panes.splice(n.wrapper.children(".k-pane").index(i), 1), e(i).remove() }), n._removeSplitBars(), n.options.panes.length && n.resize(!0)), n }, size: a("size", !0), min: a("min"), max: a("max") }); u.plugin(F), l = { sizingProperty: "height", sizingDomProperty: "offsetHeight", alternateSizingProperty: "width", positioningProperty: "top", mousePositioningProperty: "pageY" }, c = { sizingProperty: "width", sizingDomProperty: "offsetWidth", alternateSizingProperty: "height", positioningProperty: "left", mousePositioningProperty: "pageX" }, s.prototype = { press: function(e) { this._resizable.press(e) }, move: function(e, t) { this.pressed || (this.press(t), this.pressed = !0), this._resizable.target || this._resizable.press(t), this._resizable.move(e) }, end: function() { this._resizable.end(), this.pressed = !1 }, destroy: function() { this._resizable.destroy(), this._resizable = this._element = this.owner = null }, isResizing: function() { return this._resizable.resizing }, _createHint: function(t) { var n = this; return e("<div class='k-ghost-splitbar k-ghost-splitbar-" + n.orientation + " k-state-default' />").css(n.alternateSizingProperty, t[n.alternateSizingProperty]()) }, _start: function(t) { var n = this, r = e(t.currentTarget), o = r.prev(), a = r.next(), s = o.data(E), l = a.data(E), c = parseInt(o[0].style[n.positioningProperty], 10), d = parseInt(a[0].style[n.positioningProperty], 10) + a[0][n.sizingDomProperty] - r[0][n.sizingDomProperty], u = parseInt(n._element.css(n.sizingProperty), 10), h = function(e) { var t = parseInt(e, 10); return (i(e) ? t : u * t / 100) || 0 }, p = h(s.min), f = h(s.max) || d - c, g = h(l.min), m = h(l.max) || d - c; n.previousPane = o, n.nextPane = a, n._maxPosition = Math.min(d - g, c + f), n._minPosition = Math.max(c + p, d - m) }, _max: function() { return this._maxPosition }, _min: function() { return this._minPosition }, _stop: function(t) { var n, i, o, a, s, l, c, u, h = this, p = e(t.currentTarget), f = h.owner; return f._panes().children(".k-splitter-overlay").remove(), t.keyCode !== d.keys.ESC && (n = t.position, i = p.prev(), o = p.next(), a = i.data(E), s = o.data(E), l = n - parseInt(i[0].style[h.positioningProperty], 10), c = parseInt(o[0].style[h.positioningProperty], 10) + o[0][h.sizingDomProperty] - n - p[0][h.sizingDomProperty], u = h._element.children(z).filter(function() { return r(e(this).data(E).size) }).length, (!r(a.size) || u > 1) && (r(a.size) && u--, a.size = l + "px"), (!r(s.size) || u > 1) && (s.size = c + "px"), f.resize(!0)), !1 } } }(window.kendo.jQuery), function(e, t) { function n(e) { return e[e.length - 1] } function i(e) { return e instanceof Array ? e : [e] } function r(e) { return "string" == typeof e || "number" == typeof e || "boolean" == typeof e } function o(e, t, n) { return Math.ceil(e * t / n) } function a(e, t, n) { var i = document.createElement(n || "div"); return t && (i.className = t), e.appendChild(i), i } function s() { var t, n = e('<div class="k-popup"><ul class="k-list"><li class="k-item"><li></ul></div>'); return n.css({ position: "absolute", left: "-200000px", visibility: "hidden" }), n.appendTo(document.body), t = parseFloat(v.getComputedStyles(n.find(".k-item")[0], ["line-height"])["line-height"]), n.remove(), t } function l(e, t, n) { return { down: e * n, up: e * (t - 1 - n) } } function c(e, t) { var n = (e.listScreens - 1 - e.threshold) * t, i = e.threshold * t; return function(e, t, r) { return t > r ? n > t - e.top : 0 === e.top || t - e.top > i } } function d(e, t) { return function(n) { return t(e.scrollTop, n) } } function u(e) { return function(t, n) { return e(t.items, t.index, n), t } } function h(e, t) { v.support.browser.msie && 10 > v.support.browser.version ? e.style.top = t + "px" : (e.style.webkitTransform = "translateY(" + t + "px)", e.style.transform = "translateY(" + t + "px)") } function p(t, n) { return function(i, r) { for (var o = 0, a = i.length; a > o; o++) t(i[o], r[o], n), r[o].item && (this.trigger(B, { item: e(i[o]), data: r[o].item, ns: v.ui }), r[o].index === this._selectedIndex && this.select(this._selectedIndex)) } } function f(e, t) { var n; return t > 0 ? (n = e.splice(0, t), e.push.apply(e, n)) : (n = e.splice(t, -t), e.unshift.apply(e, n)), n } function g(n, i, r) { var o = r.template; n = e(n), i.item || (o = r.placeholderTemplate), this.angular("cleanup", function() { return { elements: [n] } }), n.attr("data-uid", i.item ? i.item.uid : "").attr("data-offset-index", i.index).html(o(i.item || {})), n.toggleClass(M, i.current), n.toggleClass(P, i.selected), n.toggleClass("k-first", i.newGroup), n.toggleClass("k-loading-item", !i.item), 0 !== i.index && i.newGroup && e("<div class=" + I + "></div>").appendTo(n).html(r.groupTemplate({ group: i.group })), i.top !== t && h(n[0], i.top), this.angular("compile", function() { return { elements: [n], data: [{ dataItem: i.item, group: i.group, newGroup: i.newGroup }] } }) } function m(e, t) { var n, i, r, o = t.length, a = []; for (i = 0; e.length > i; i++) for (n = e[i], r = 0; o > r; r++) n === t[r] && a.push({ index: i, item: n }); return a } var v = window.kendo, _ = v.ui, w = _.Widget, b = _.DataBoundWidget, y = e.proxy, k = "k-virtual-wrap", x = "k-virtual-list", C = "k-virtual-content", S = "k-list", T = "k-group-header", D = "k-virtual-item", A = "k-item", E = "k-height-container", I = "k-group", P = "k-state-selected", M = "k-state-focused", z = "k-state-hover", F = "change", R = "click", H = "listBound", B = "itemChange", L = "activate", N = "deactivate", O = ".VirtualList", V = b.extend({ init: function(t, n) { var r = this; r._listCreated = !1, r._fetching = !1, r._filter = !1, w.fn.init.call(r, t, n), r.options.itemHeight || (r.options.itemHeight = s()), n = r.options, r.element.addClass(S + " " + x).attr("role", "listbox"), r.content = r.element.wrap("<div unselectable='on' class='" + C + "'></div>").parent(), r.wrapper = r.content.wrap("<div class='" + k + "'></div>").parent(), r.header = r.content.before("<div class='" + T + "'></div>").prev(), r.element.on("mouseenter" + O, "li:not(.k-loading-item)", function() { e(this).addClass(z) }).on("mouseleave" + O, "li", function() { e(this).removeClass(z) }), r._values = i(r.options.value), r._selectedDataItems = [], r._selectedIndexes = [], r._rangesList = {}, r._activeDeferred = null, r._promisesList = [], r._optionID = v.guid(), r.setDataSource(n.dataSource), r.content.on("scroll" + O, v.throttle(function() { r._renderItems() }, n.delay)), r._selectable() }, options: { name: "VirtualList", autoBind: !0, delay: 100, height: null, listScreens: 4, threshold: .5, itemHeight: null, oppositeBuffer: 1, type: "flat", selectable: !1, value: [], dataValueField: null, template: "#:data#", placeholderTemplate: "loading...", groupTemplate: "#:group#", fixedGroupTemplate: "fixed header template", valueMapper: null }, events: [F, R, H, B, L, N], setOptions: function(e) { w.fn.setOptions.call(this, e), this._selectProxy && this.options.selectable === !1 ? this.element.off(R, "." + D, this._selectProxy) : !this._selectProxy && this.options.selectable && this._selectable(), this.refresh() }, items: function() { return e(this._items) }, destroy: function() { this.wrapper.off(O), this.dataSource.unbind(F, this._refreshHandler), w.fn.destroy.call(this) }, setDataSource: function(t) { var n, i = this, r = t || {}; r = e.isArray(r) ? { data: r } : r, r = v.data.DataSource.create(r), i.dataSource ? (i.dataSource.unbind(F, i._refreshHandler), i.dataSource.unbind(F, i._rangeChangeHandler), n = i.value(), i.value([]), i.mute(function() { i.value(n) })) : (i._refreshHandler = e.proxy(i.refresh, i), i._rangeChangeHandler = e.proxy(i.rangeChange, i)), i.dataSource = r.bind(F, i._refreshHandler).bind(F, i._rangeChangeHandler), 0 !== i.dataSource.view().length ? i.refresh() : i.options.autoBind && i.dataSource.fetch() }, rangeChange: function() { var e = this, t = e.dataSource.page(); e.isBound() && e._rangeChange === !0 && e._lastPage !== t && (e._lastPage = t, e.trigger(H)) }, refresh: function(e) { var t, n = this, i = e && e.action; n._mute || (n._fetching ? n._renderItems && n._renderItems(!0) : (n._filter && n.focus(0), n._createList(), i || !n._values.length || n._filter ? (n._lastPage = n.dataSource.page(), n._listCreated = !0, n.trigger(H)) : n.value(n._values, !0).done(function() { n._lastPage = n.dataSource.page(), n._listCreated = !0, n.trigger(H) })), "itemchange" === i && (t = m(n._selectedDataItems, e.items), t.length && n.trigger("selectedItemChange", { items: t })), n._fetching = !1) }, removeAt: function(e) { return this._selectedIndexes.splice(e, 1), this._values.splice(e, 1), { position: e, dataItem: this._selectedDataItems.splice(e, 1)[0] } }, setValue: function(e) { this._values = i(e) }, value: function(n, r) { var o = this; return n === t ? o._values.slice() : (n = i(n), "multiple" === o.options.selectable && o.select().length && n.length && o.select(-1), o._valueDeferred && "resolved" !== o._valueDeferred.state() || (o._valueDeferred = e.Deferred()), n.length || o.select(-1), o._values = n, (o.isBound() && !o._mute || r) && o._prefetchByValue(n), o._valueDeferred) }, _prefetchByValue: function(e) { var n, o, a, s = this, l = s._dataView, c = s._valueGetter, d = !1, u = []; for (o = 0; e.length > o; o++) for (a = 0; l.length > a; a++) n = l[a].item, n && (d = r(n) ? e[o] === n : e[o] === c(n), d && u.push(a)); if (u.length === e.length) return s._values = [], s.select(u), t; if ("function" != typeof s.options.valueMapper) throw Error("valueMapper is not provided"); s.options.valueMapper({ value: "multiple" === this.options.selectable ? e : e[0], success: function(e) { s._values = [], s._selectedIndexes = [], s._selectedDataItems = [], e = i(e), e.length || (e = [-1]), s.select(e) } }) }, deferredRange: function(t) { var n = this.dataSource, i = this.itemCount, r = this._rangesList, o = e.Deferred(), a = [], s = Math.floor(t / i) * i, l = Math.ceil(t / i) * i, c = l === s ? [l] : [s, l]; return e.each(c, function(t, o) { var s, l = o + i, c = r[o]; c && c.end === l ? s = c.deferred : (s = e.Deferred(), r[o] = { end: l, deferred: s }, n._multiplePrefetch(o, i, function() { s.resolve() })), a.push(s) }), e.when.apply(e, a).then(function() { o.resolve() }), o }, prefetch: function(t) { var n = this, i = this.itemCount, r = !n._promisesList.length; return n._activeDeferred || (n._activeDeferred = e.Deferred(), n._promisesList = []), e.each(t, function(e, t) { var r = Math.floor(t / i) * i; n._promisesList.push(n.deferredRange(r)) }), r && e.when.apply(e, n._promisesList).done(function() { n._activeDeferred.resolve(), n._activeDeferred = null, n._promisesList = [] }), n._activeDeferred }, _findDataItem: function(e) { var t, n, i = this.dataSource.view(); if ("group" === this.options.type) for (n = 0; i.length > n; n++) { if (t = i[n].items, !(e >= t.length)) return t[e]; e -= t.length } return i[e] }, selectedDataItems: function() { return this._selectedDataItems.slice() }, scrollTo: function(e) { this.content.scrollTop(e) }, scrollToIndex: function(e) { this.scrollTo(e * this.options.itemHeight) }, focus: function(i) { var r, o, a, s, l, c, d = this.options.itemHeight, u = this._optionID, h = !0; if (i === t) return s = this.element.find("." + M), s.length ? s : null; if ("function" == typeof i) for (a = this.dataSource.flatView(), l = 0; a.length > l; l++) if (i(a[l])) { i = l; break } return i instanceof Array && (i = n(i)), isNaN(i) ? (r = e(i), o = parseInt(e(r).attr("data-offset-index"), 10)) : (o = i, r = this._getElementByIndex(o)), -1 === o ? (this.element.find("." + M).removeClass(M), this._focusedIndex = t, t) : (r.length ? (r.hasClass(M) && (h = !1), this._focusedIndex !== t && (s = this._getElementByIndex(this._focusedIndex), s.removeClass(M).removeAttr("id"), h && this.trigger(N)), this._focusedIndex = o, r.addClass(M).attr("id", u), c = this._getElementLocation(o), "top" === c ? this.scrollTo(o * d) : "bottom" === c ? this.scrollTo(o * d + d - this.screenHeight) : "outScreen" === c && this.scrollTo(o * d), h && this.trigger(L)) : (this._focusedIndex = o, this.items().removeClass(M), this.scrollToIndex(o)), t) }, focusIndex: function() { return this._focusedIndex }, first: function() { this.scrollTo(0), this.focus(0) }, last: function() { var e = this.dataSource.total(); this.scrollTo(this.heightContainer.offsetHeight), this.focus(e) }, prev: function() { var e, n = this._focusedIndex; return !isNaN(n) && n > 0 ? (n -= 1, this.focus(n), e = this.focus(), e && e.hasClass("k-loading-item") && (n += 1, this.focus(n)), n) : t }, next: function() { var e, n = this._focusedIndex, i = this.dataSource.total() - 1; return !isNaN(n) && i > n ? (n += 1, this.focus(n), e = this.focus(), e && e.hasClass("k-loading-item") && (n -= 1, this.focus(n)), n) : t }, select: function(e) { var i, r, o, a = this, s = "multiple" !== a.options.selectable, l = !!a._activeDeferred, c = []; return e === t ? a._selectedIndexes.slice() : (i = a._getIndecies(e), a._filter && !s && a._deselectFiltered(i) || !i.length || s && !a._filter && n(i) === n(this._selectedIndexes) || (c = a._deselect(i), s && (a._activeDeferred = null, l = !1, i.length && (i = [n(i)])), o = function() { var e = a._select(i); a.focus(i), (e.length || c.length) && a.trigger(F, { added: e, removed: c }), a._valueDeferred && a._valueDeferred.resolve() }, r = a.prefetch(i), l || (r ? r.done(o) : o())), t) }, isBound: function() { return this._listCreated }, mute: function(e) { this._mute = !0, y(e(), this), this._mute = !1 }, filter: function(e) { return e === t ? this._filter : (this._filter = e, this._rangeChange = !0, t) }, skipUpdate: e.noop, _getElementByIndex: function(t) { return this.items().filter(function(n, i) { return t === parseInt(e(i).attr("data-offset-index"), 10) }) }, _clean: function() { this.result = t, this._lastScrollTop = t, this._lastPage = t, e(this.heightContainer).remove(), this.heightContainer = t, this.element.empty() }, _height: function() { var e = !!this.dataSource.view().length, t = this.options.height, n = this.options.itemHeight, i = this.dataSource.total(); return e ? t / n > i && (t = i * n) : t = 0, t }, _screenHeight: function() { var e = this._height(), t = this.content; t.height(e), this.screenHeight = e }, _getElementLocation: function(e) { var t, n = this.content.scrollTop(), i = this.screenHeight, r = this.options.itemHeight, o = e * r, a = o + r, s = n + i; return t = o === n - r || a > n && n > o ? "top" : o === s || s > o && a > s ? "bottom" : o >= n && n + (i - r) >= o ? "inScreen" : "outScreen" }, _templates: function() { var e, t = { template: this.options.template, placeholderTemplate: this.options.placeholderTemplate, groupTemplate: this.options.groupTemplate, fixedGroupTemplate: this.options.fixedGroupTemplate }; for (e in t) "function" != typeof t[e] && (t[e] = v.template(t[e])); this.templates = t }, _generateItems: function(e, t) { for (var n, i = [], r = this.options.itemHeight + "px"; t-- > 0;) n = document.createElement("li"), n.tabIndex = -1, n.className = D + " " + A, n.setAttribute("role", "option"), n.style.height = r, n.style.minHeight = r, e.appendChild(n), i.push(n); return i }, _saveInitialRanges: function() { var t, n = this.dataSource._ranges, i = e.Deferred(); for (i.resolve(), this._rangesList = {}, t = 0; n.length > t; t++) this._rangesList[n[t].start] = { end: n[t].end, deferred: i } }, _createList: function() { { var t = this, n = t.content.get(0), i = t.options, r = t.dataSource; r.total() } t._listCreated && t._clean(), t._saveInitialRanges(), t._screenHeight(), t._buildValueGetter(), t.itemCount = o(t.screenHeight, i.listScreens, i.itemHeight), t.itemCount > r.total() && (t.itemCount = r.total()), t._templates(), t._items = t._generateItems(t.element[0], t.itemCount), t._setHeight(i.itemHeight * r.total()), t.options.type = (r.group() || []).length ? "group" : "flat", "flat" === t.options.type ? t.header.hide() : t.header.show(), t.getter = t._getter(function() { t._renderItems(!0) }), t._onScroll = function(e, n) { var i = t._listItems(t.getter); return t._fixedHeader(e, i(e, n)) }, t._renderItems = t._whenChanged(d(n, t._onScroll), u(t._reorderList(t._items, e.proxy(g, t)))), t._renderItems(), t._calculateGroupPadding(t.screenHeight) }, _setHeight: function(e) { var t, n, i = this.heightContainer; if (i ? t = i.offsetHeight : i = this.heightContainer = a(this.content[0], E), e !== t) for (i.innerHTML = ""; e > 0;) n = Math.min(e, 25e4), a(i).style.height = n + "px", e -= n }, _getter: function() { var e = null, t = this.dataSource, n = t.skip(), i = this.options.type, r = this.itemCount, o = {}; return function(a, s) { var l, c, d, u, h, p, f, g, m = this; if (t.inRange(s, r)) { if (n !== s && (m._mute = !0, m._fetching = !0, m._rangeChange = !0, t.range(s, r), n = s, m._rangeChange = !1, m._fetching = !1, m._mute = !1), "group" === i) { if (!o[s]) for (c = o[s] = [], d = t.view(), u = 0, h = d.length; h > u; u++) for (p = d[u], f = 0, g = p.items.length; g > f; f++) c.push({ item: p.items[f], group: p.value }); l = o[s][a - s] } else l = t.view()[a - s]; return l } return e !== s && (e = s, n = s, m._fetching = !0, m._getterDeferred && m._getterDeferred.reject(), m._getterDeferred = m.deferredRange(s), m._getterDeferred.then(function() { var e = m._indexConstraint(m.content[0].scrollTop); m._getterDeferred = null, e >= s && s + r >= e && (m._fetching = !0, m._rangeChange = !0, t.range(s, r), m._rangeChange = !1) })), null } }, _fixedHeader: function(e, t) { var n, i = this.currentVisibleGroup, r = this.options.itemHeight, o = Math.floor((e - t.top) / r), a = t.items[o]; return a && a.item && (n = a.group, n !== i && (this.header[0].innerHTML = n || "", this.currentVisibleGroup = n)), t }, _itemMapper: function(e, t, n) { var i, o = this.options.type, a = this.options.itemHeight, s = this._focusedIndex, l = !1, c = !1, d = !1, u = null, h = !1, p = this._valueGetter; if ("group" === o && (e && (d = 0 === t || this._currentGroup && this._currentGroup !== e.group, this._currentGroup = e.group), u = e ? e.group : null, e = e ? e.item : null), n.length && e) for (i = 0; n.length > i; i++) if (h = r(e) ? n[i] === e : n[i] === p(e)) { n.splice(i, 1), l = !0; break } return s === t && (c = !0), { item: e ? e : null, group: u, newGroup: d, selected: l, current: c, index: t, top: t * a } }, _range: function(e) { var t, n, i, r = this.itemCount, o = this._values.slice(), a = []; for (this._view = {}, this._currentGroup = null, n = e, i = e + r; i > n; n++) t = this._itemMapper(this.getter(n, e), n, o), a.push(t), this._view[t.index] = t; return this._dataView = a, a }, _getDataItemsCollection: function(e, t) { var n = this._range(this._listIndex(e, t)); return { index: n.length ? n[0].index : 0, top: n.length ? n[0].top : 0, items: n } }, _listItems: function() { var t = this.screenHeight, n = this.options, i = c(n, t); return e.proxy(function(e, t) { var n = this.result, r = this._lastScrollTop; return !t && n && i(n, e, r) || (n = this._getDataItemsCollection(e, r)), this._lastScrollTop = e, this.result = n, n }, this) }, _whenChanged: function(e, t) { var n; return function(i) { var r = e(i); r !== n && (n = r, t(r, i)) } }, _reorderList: function(t, n) { var i = this, r = t.length, o = -1 / 0; return n = e.proxy(p(n, this.templates), this), function(e, a, s) { var l, c, d = a - o; s || Math.abs(d) >= r ? (l = t, c = e) : (l = f(t, d), c = d > 0 ? e.slice(-d) : e.slice(0, -d)), n(l, c, i._listCreated), o = a } }, _bufferSizes: function() { var e = this.options; return l(this.screenHeight, e.listScreens, e.oppositeBuffer) }, _indexConstraint: function(e) { var t = this.itemCount, n = this.options.itemHeight, i = this.dataSource.total(); return Math.min(Math.max(i - t, 0), Math.max(0, Math.floor(e / n))) }, _listIndex: function(e, t) { var n, i = this._bufferSizes(); return n = e - (e > t ? i.down : i.up), this._indexConstraint(n) }, _selectable: function() { this.options.selectable && (this._selectProxy = e.proxy(this, "_clickHandler"), this.element.on(R + O, "." + D, this._selectProxy)) }, _getIndecies: function(e) { var t, n, i = []; if ("function" == typeof e) for (t = this.dataSource.flatView(), n = 0; t.length > n; n++) if (e(t[n])) { i.push(n); break } return "number" == typeof e && i.push(e), e instanceof jQuery && (e = parseInt(e.attr("data-offset-index"), 10), isNaN(e) || i.push(e)), e instanceof Array && (i = e), i }, _deselect: function(n) { var i, r, o, a, s, l, c = [], d = this._selectedIndexes, u = 0, h = this.options.selectable, p = 0; if (-1 === n[u]) { for (s = 0; d.length > s; s++) r = d[s], this._getElementByIndex(r).removeClass(P), c.push({ index: r, position: s, dataItem: this._selectedDataItems[s] }); return this._values = [], this._selectedDataItems = [], this._selectedIndexes = [], n.splice(0, n.length), c } if (h === !0) i = n[u], r = d[u], r !== t && i !== r && (this._getElementByIndex(r).removeClass(P), c.push({ index: r, position: u, dataItem: this._selectedDataItems[u] }), this._values = [], this._selectedDataItems = [], this._selectedIndexes = []); else if ("multiple" === h) for (l = 0; n.length > l; l++) if (u = e.inArray(n[l], d), r = d[u], r !== t) { if (a = this._getElementByIndex(r), !a.hasClass("k-state-selected")) continue; a.removeClass(P), this._values.splice(u, 1), this._selectedIndexes.splice(u, 1), o = this._selectedDataItems.splice(u, 1)[0], n.splice(l, 1), c.push({ index: r, position: u + p, dataItem: o }), p++, l-- } return c }, _deselectFiltered: function(t) { for (var n, i, r, o, a = this.element[0].children, s = this._values, l = [], c = 0; t.length > c; c++) { for (r = -1, i = t[c], n = this._valueGetter(this._view[i].item), o = 0; s.length > o; o++) if (n == s[o]) { r = o; break } r > -1 && (l.push(this.removeAt(r)), e(a[i]).removeClass("k-state-selected")) } return l.length ? (this.trigger("change", { added: [], removed: l }), !0) : !1 }, _select: function(t) { var n, i, o = this, a = "multiple" !== this.options.selectable, s = this.dataSource, l = this.itemCount, c = this._valueGetter, d = []; return a && (o._selectedIndexes = [], o._selectedDataItems = [], o._values = []), i = s.skip(), e.each(t, function(e, t) { var a = l > t ? 1 : Math.floor(t / l) + 1, u = (a - 1) * l; o.mute(function() { s.range(u, l), n = o._findDataItem([t - u]), o._selectedIndexes.push(t), o._selectedDataItems.push(n), o._values.push(r(n) ? n : c(n)), d.push({ index: t, dataItem: n }), o._getElementByIndex(t).addClass(P), s.range(i, l) }) }), d }, _clickHandler: function(t) { var n = e(t.currentTarget); !t.isDefaultPrevented() && n.attr("data-uid") && this.trigger(R, { item: n }) }, _buildValueGetter: function() { this._valueGetter = v.getter(this.options.dataValueField) }, _calculateGroupPadding: function(e) { var t = this.items().first(), n = this.header, i = 0; n[0] && "none" !== n[0].style.display && ("auto" !== e && (i = v.support.scrollbar()), i += parseFloat(t.css("border-right-width"), 10) + parseFloat(t.children(".k-group").css("right"), 10), n.css("padding-right", i)) } }); v.ui.VirtualList = V, v.ui.plugin(V) }(window.kendo.jQuery), function(e) { function t(e, t) { function n(e, r) { var o, a; if (r = r[t]) for (o = i[e] = i[e] || [], a = 0; r.length > a; a++) o.push(r[a]), n(e + 1, r[a]) } var i = []; return n(0, e), i } function n() { return I.support.cssBorderSpacing ? "" : 'cellspacing="0"' } function i(t, i) { return t.length ? "<table " + n() + ' class="' + e.trim("k-scheduler-table " + (i || "")) + '"><tr>' + t.join("</tr><tr>") + "</tr></table>" : "" } function r(e, t) { return e.length ? "<div style='position:relative'>" + i(e, t) + "</div>" : "" } function o(t, n, r) { var o, a = []; if (r > 0) for (o = 0; t > o; o++) a.push("<th> </th>"); return n && a.push('<th class="k-scheduler-times-all-day">' + n.text + "</th>"), 1 > r ? e() : e('<div class="k-scheduler-times">' + i(a) + "</div>") } function a(t, n, o) { var a, s, l, c, d, u, h, p, f, g, m = []; for (s = 0; t.length > s; s++) { for (l = t[s], c = [], d = n / l.length, a = 0; l.length > a; a++) u = l[a], c.push('<th colspan="' + (u.colspan || d) + '" class="' + (u.className || "") + '">' + u.text + "</th>"); m.push(c.join("")) } if (h = [], o) { for (p = t[t.length - 1], f = [], g = o.cellContent, a = 0; p.length > a; a++) f.push('<td class="' + (p[a].className || "") + '">' + (g ? g(a) : " ") + "</th>"); h.push(f.join("")) } return e('<div class="k-scheduler-header k-state-default"><div class="k-scheduler-header-wrap">' + i(m) + r(h, "k-scheduler-header-all-day") + "</div></div>") } function s(t, n) { var r, o, a, s, l, c = Array(n).join().split(","), d = []; for (o = 0; t.length > o; o++) for (a = t[o], s = n / a.length, r = 0; a.length > r; r++) l = a[r].className || "", a[r].allDay && (l = "k-scheduler-times-all-day"), c[s * r] += '<th class="' + l + '" rowspan="' + s + '">' + a[r].text + "</th>"; for (r = 0; n > r; r++) d.push(c[r]); return 1 > n ? e() : e('<div class="k-scheduler-times">' + i(d) + "</div>") } function l() { return e('<div class="k-scheduler-content"><table ' + n() + ' class="k-scheduler-table"/></div>') } function c() { return D = D ? D : I.support.scrollbar() } function d(e, t, n) { var i, r, o, a, s; for (i = e.length - 1; i >= 0; i--) r = u(e[i]), o = r.start, s = r.end, a = t >= o && s >= t, (a || o >= t && n >= s || o >= t && n >= o) && (t > o && (t = o), s > n && (n = s)); return h(e, t, n) } function u(e) { return { start: e.start, end: e.end } } function h(e, t, n) { var i, r, o = []; for (i = 0; e.length > i; i++) r = u(e[i]), (t > r.start && r.end > t || r.start >= t && n >= r.end) && o.push(e[i]); return o } function p(e) { return g(e) } function f(e) { return g(e) } function g(e) { var t, n, i, r, o, a, s, l = []; for (t = 0; e.length > t; t++) { for (n = e[t], i = u(n), r = null, o = 0, a = l.length; a > o; o++) if (s = i.start > l[o].end, l[o].start > i.start || s) { r = l[o], i.end > r.end && (r.end = i.end); break } r || (r = { start: i.start, end: i.end, events: [] }, l.push(r)), r.events.push(n) } return l } function m(e, t, n, i) { var r, o, a, s, l = t[0]; if (l) { for (r = [], o = l.dataSource.view(), a = 0; o.length > a; a++) s = { text: i({ text: I.htmlEncode(I.getter(l.dataTextField)(o[a])), color: I.getter(l.dataColorField)(o[a]), field: l.field, title: l.title, name: l.name, value: I.getter(l.dataValueField)(o[a]) }), className: "k-slot-cell" }, s[e] = m(e, t.slice(1), n, i), r.push(s); return r } return n } function v(t) { return function(n) { if (e.isArray(n) || n instanceof I.data.ObservableArray) { for (var i = 0; n.length > i; i++) if (n[i] == t) return !0; return !1 } return n == t } } function _(e) { e.className = e.className.replace(E, "") + " k-state-selected" } var w, b, y, k, x, C, S, T, D, A, E, I = window.kendo, P = I.ui, M = P.Widget, z = I.keys, F = ".kendoSchedulerView", R = Math, H = '<div class="k-marquee k-scheduler-marquee"><div class="k-marquee-color"></div><div class="k-marquee-text"><div class="k-label-top"></div><div class="k-label-bottom"></div></div></div>'; I.ui.scheduler = {}, w = I.Class.extend({ init: function(e) { this._index = e, this._timeSlotCollections = [], this._daySlotCollections = [] }, addTimeSlotCollection: function(e, t) { return this._addCollection(e, t, this._timeSlotCollections) }, addDaySlotCollection: function(e, t) { return this._addCollection(e, t, this._daySlotCollections) }, _addCollection: function(e, t, n) { var i = new x(e, t, this._index, n.length); return n.push(i), i }, timeSlotCollectionCount: function() { return this._timeSlotCollections.length }, daySlotCollectionCount: function() { return this._daySlotCollections.length }, daySlotByPosition: function(e, t) { return this._slotByPosition(e, t, this._daySlotCollections) }, timeSlotByPosition: function(e, t) { return this._slotByPosition(e, t, this._timeSlotCollections) }, _slotByPosition: function(e, t, n) { var i, r, o, a, s, l, c = I.support.browser; for (i = 0; n.length > i; i++) for (r = n[i], o = 0; o < r.count(); o++) if (a = r.at(o), s = a.offsetWidth, l = a.clientHeight, c.msie && (l = a.clientHeight - 1, s = a.clientWidth), e >= a.offsetLeft && a.offsetLeft + s > e && t >= a.offsetTop && a.offsetTop + l >= t) return a }, refresh: function() { var e; for (e = 0; this._daySlotCollections.length > e; e++) this._daySlotCollections[e].refresh(); for (e = 0; this._timeSlotCollections.length > e; e++) this._timeSlotCollections[e].refresh() }, timeSlotRanges: function(e, t) { var n, i = this._timeSlotCollections, r = this._startSlot(e, i); return !r.inRange && e >= r.slot.end && (r = null), n = r, t > e && (n = this._endSlot(t, i)), n && !n.inRange && n.slot.start >= t && (n = null), null === r && null === n ? [] : (null === r && (r = { inRange: !0, slot: i[n.slot.collectionIndex].first() }), null === n && (n = { inRange: !0, slot: i[r.slot.collectionIndex].last() }), this._continuousRange(y, i, r, n)) }, daySlotRanges: function(e, t, n) { var i, r = this._daySlotCollections, o = this._startSlot(e, r, n); if (!o.inRange && e >= o.slot.end && (o = null), i = o, t > e && (i = this._endSlot(t, r, n)), i && !i.inRange && i.slot.start >= t && (i = null), null === o && null === i) return []; if (null === o) do e += I.date.MS_PER_DAY, o = this._startSlot(e, r, n); while (!o.inRange && e >= o.slot.end); if (null === i) do t -= I.date.MS_PER_DAY, i = this._endSlot(t, r, n); while (!i.inRange && i.slot.start >= t); return this._continuousRange(k, r, o, i) }, _continuousRange: function(e, t, n, i) { var r, o, a, s, l, c, d = n.slot, u = i.slot, h = d.collectionIndex, p = u.collectionIndex, f = []; for (r = h; p >= r; r++) o = t[r], a = o.first(), s = o.last(), l = !1, c = !1, r == h && (c = !n.inRange), r == p && (l = !i.inRange), d.start > a.start && (a = d), s.start > u.start && (s = u), p > h && (r == h ? l = !0 : r == p ? c = !0 : l = c = !0), f.push(new e({ start: a, end: s, collection: o, head: l, tail: c })); return f }, slotRanges: function(e, t) { var n = e._startTime || I.date.toUtcTime(e.start), i = e._endTime || I.date.toUtcTime(e.end); return void 0 === t && (t = e.isMultiDay()), t ? this.daySlotRanges(n, i, e.isAllDay) : this.timeSlotRanges(n, i) }, ranges: function(e, t, n, i) { return "number" != typeof e && (e = I.date.toUtcTime(e)), "number" != typeof t && (t = I.date.toUtcTime(t)), n ? this.daySlotRanges(e, t, i) : this.timeSlotRanges(e, t) }, _startCollection: function(e, t) { var n, i; for (n = 0; t.length > n; n++) if (i = t[n], i.startInRange(e)) return i; return null }, _endCollection: function(e, t, n) { var i, r; for (i = 0; t.length > i; i++) if (r = t[i], r.endInRange(e, n)) return r; return null }, _getCollections: function(e) { return e ? this._daySlotCollections : this._timeSlotCollections }, continuousSlot: function(e, t) { var n = t ? -1 : 1, i = this._getCollections(e.isDaySlot), r = i[e.collectionIndex + n]; return r ? r[t ? "last" : "first"]() : void 0 }, firstSlot: function() { var e = this._getCollections(this.daySlotCollectionCount()); return e[0].first() }, lastSlot: function() { var e = this._getCollections(this.daySlotCollectionCount()); return e[e.length - 1].last() }, upSlot: function(e, t) { var n = this, i = function(e, i, r) { var o = 0 === r; return !t && !e && o && n.daySlotCollectionCount() ? n._daySlotCollections[0].at(i) : void 0 }; return this.timeSlotCollectionCount() || (t = !0), this._verticalSlot(e, -1, i) }, downSlot: function(e, t) { var n = this, i = function(e, i, r) { return !t && e && n.timeSlotCollectionCount() ? n._timeSlotCollections[r].at(0) : void 0 }; return this.timeSlotCollectionCount() || (t = !0), this._verticalSlot(e, 1, i) }, leftSlot: function(e) { return this._horizontalSlot(e, -1) }, rightSlot: function(e) { return this._horizontalSlot(e, 1) }, _horizontalSlot: function(e, t) { var n, i = e.index, r = e.isDaySlot, o = e.collectionIndex, a = this._getCollections(r); return r ? i += t : o += t, n = a[o], n ? n.at(i) : void 0 }, _verticalSlot: function(e, t, n) { var i, r = e.index, o = e.isDaySlot, a = e.collectionIndex, s = this._getCollections(o); return (e = n(o, a, r)) ? e : (o ? a += t : r += t, i = s[a], i ? i.at(r) : void 0) }, _collection: function(e, t) { var n = t ? this._daySlotCollections : this._timeSlotCollections; return n[e] }, _startSlot: function(e, t, n) { var i, r = this._startCollection(e, t), o = !0; return r || (r = t[0], o = !1), i = r.slotByStartDate(e, n), i || (i = r.first(), o = !1), { slot: i, inRange: o } }, _endSlot: function(e, t, n) { var i, r = this._endCollection(e, t, n), o = !0; return r || (r = t[t.length - 1], o = !1), i = r.slotByEndDate(e, n), i || (i = r.last(), o = !1), { slot: i, inRange: o } }, getSlotCollection: function(e, t) { return this[t ? "getDaySlotCollection" : "getTimeSlotCollection"](e) }, getTimeSlotCollection: function(e) { return this._timeSlotCollections[e] }, getDaySlotCollection: function(e) { return this._daySlotCollections[e] } }), b = I.Class.extend({ init: function(t) { e.extend(this, t) }, innerHeight: function() { var e, t = this.collection, n = this.start.index, i = this.end.index, r = 0; for (e = n; i >= e; e++) r += t.at(e).offsetHeight; return r }, events: function() { return this.collection.events() }, addEvent: function(e) { this.events().push(e) }, startSlot: function() { return this.start.offsetLeft > this.end.offsetLeft ? this.end : this.start }, endSlot: function() { return this.start.offsetLeft > this.end.offsetLeft ? this.start : this.end } }), y = b.extend({ innerHeight: function() { var e, t = this.collection, n = this.start.index, i = this.end.index, r = 0; for (e = n; i >= e; e++) r += t.at(e).offsetHeight; return r }, outerRect: function(e, t, n) { return this._rect("offset", e, t, n) }, _rect: function(e, t, n, i) { var r, o, a, s, l, c, d, u, h = this.start, p = this.end, f = I.support.isRtl(h.element); return "number" != typeof t && (t = I.date.toUtcTime(t)), "number" != typeof n && (n = I.date.toUtcTime(n)), i ? (r = h.offsetTop, o = p.offsetTop + p[e + "Height"], f ? (a = p.offsetLeft, s = h.offsetLeft + h[e + "Width"]) : (a = h.offsetLeft, s = p.offsetLeft + p[e + "Width"])) : (l = t - h.start, 0 > l && (l = 0), c = h.end - h.start, r = h.offsetTop + h[e + "Height"] * l / c, d = p.end - n, 0 > d && (d = 0), u = p.end - p.start, o = p.offsetTop + p[e + "Height"] - p[e + "Height"] * d / u, f ? (a = Math.round(p.offsetLeft + p[e + "Width"] * d / u), s = Math.round(h.offsetLeft + h[e + "Width"] - h[e + "Width"] * l / c)) : (a = Math.round(h.offsetLeft + h[e + "Width"] * l / c), s = Math.round(p.offsetLeft + p[e + "Width"] - p[e + "Width"] * d / u))), { top: r, bottom: o, left: 0 === a ? a : a + 1, right: s } }, innerRect: function(e, t, n) { return this._rect("client", e, t, n) } }), k = b.extend({ innerWidth: function() { var e, t = this.collection, n = this.start.index, i = this.end.index, r = 0, o = n !== i ? "offsetWidth" : "clientWidth"; for (e = n; i >= e; e++) r += t.at(e)[o]; return r } }), x = I.Class.extend({ init: function(e, t, n, i) { this._slots = [], this._events = [], this._start = I.date.toUtcTime(e), this._end = I.date.toUtcTime(t), this._groupIndex = n, this._collectionIndex = i }, refresh: function() { for (var e = 0; this._slots.length > e; e++) this._slots[e].refresh() }, startInRange: function(e) { return e >= this._start && this._end > e }, endInRange: function(e, t) { var n = t ? this._end > e : this._end >= e; return e >= this._start && n }, slotByStartDate: function(e) { var t, n, i = e; for ("number" != typeof i && (i = I.date.toUtcTime(e)), t = 0; this._slots.length > t; t++) if (n = this._slots[t], n.startInRange(i)) return n; return null }, slotByEndDate: function(e, t) { var n, i, r = e; if ("number" != typeof r && (r = I.date.toUtcTime(e)), t) return this.slotByStartDate(e, !1); for (n = 0; this._slots.length > n; n++) if (i = this._slots[n], i.endInRange(r)) return i; return null }, count: function() { return this._slots.length }, events: function() { return this._events }, addTimeSlot: function(e, t, n, i) { var r = new S(e, t, n, this._groupIndex, this._collectionIndex, this._slots.length, i); this._slots.push(r) }, addDaySlot: function(e, t, n, i) { var r = new T(e, t, n, this._groupIndex, this._collectionIndex, this._slots.length, i); this._slots.push(r) }, first: function() { return this._slots[0] }, last: function() { return this._slots[this._slots.length - 1] }, at: function(e) { return this._slots[e] } }), C = I.Class.extend({ init: function(e, t, n, i, r, o) { this.element = e, this.clientWidth = e.clientWidth, this.clientHeight = e.clientHeight, this.offsetWidth = e.offsetWidth, this.offsetHeight = e.offsetHeight, this.offsetTop = e.offsetTop, this.offsetLeft = e.offsetLeft, this.start = t, this.end = n, this.element = e, this.groupIndex = i, this.collectionIndex = r, this.index = o, this.isDaySlot = !1 }, startDate: function() { return I.timezone.toLocalDate(this.start) }, endDate: function() { return I.timezone.toLocalDate(this.end) }, startInRange: function(e) { return e >= this.start && this.end > e }, endInRange: function(e) { return e > this.start && this.end >= e }, startOffset: function() { return this.start }, endOffset: function() { return this.end } }), S = C.extend({ init: function(e, t, n, i, r, o, a) { C.fn.init.apply(this, arguments), this.isHorizontal = a ? !0 : !1 }, refresh: function() { var e = this.element; this.clientWidth = e.clientWidth, this.clientHeight = e.clientHeight, this.offsetWidth = e.offsetWidth, this.offsetHeight = e.offsetHeight, this.offsetTop = e.offsetTop, this.offsetLeft = e.offsetLeft }, offsetX: function(e, t) { return e ? this.offsetLeft + t : this.offsetLeft + t }, startInRange: function(e) { return e >= this.start && this.end > e }, endInRange: function(e) { return e > this.start && this.end >= e }, startOffset: function(t, n, i) { var r, o, a, s, l; if (i) return this.start; if (r = e(this.element).offset(), o = this.end - this.start, this.isHorizontal) { if (l = I.support.isRtl(this.element), a = t - r.left, s = Math.floor(o * (a / this.offsetWidth)), l) return this.start + o - s } else a = n - r.top, s = Math.floor(o * (a / this.offsetHeight)); return this.start + s }, endOffset: function(t, n, i) { var r, o, a, s, l; if (i) return this.end; if (r = e(this.element).offset(), o = this.end - this.start, this.isHorizontal) { if (l = I.support.isRtl(this.element), a = t - r.left, s = Math.floor(o * (a / this.offsetWidth)), l) return this.start + o - s } else a = n - r.top, s = Math.floor(o * (a / this.offsetHeight)); return this.start + s } }), T = C.extend({ init: function(e, t, n, i, r, o, a) { C.fn.init.apply(this, arguments), this.eventCount = a, this.isDaySlot = !0, this.element.children.length ? (this.firstChildHeight = this.element.children[0].offsetHeight + 3, this.firstChildTop = this.element.children[0].offsetTop) : (this.firstChildHeight = 3, this.firstChildTop = 0) }, refresh: function() { this.clientHeight = this.element.clientHeight, this.offsetTop = this.element.offsetTop }, startDate: function() { var e = new Date(this.start); return I.timezone.apply(e, "Etc/UTC") }, endDate: function() { var e = new Date(this.end); return I.timezone.apply(e, "Etc/UTC") }, startInRange: function(e) { return e >= this.start && this.end > e }, endInRange: function(e) { return e > this.start && this.end >= e } }), I.ui.SchedulerView = M.extend({ init: function(t, n) { M.fn.init.call(this, t, n), this._scrollbar = c(), this._isRtl = I.support.isRtl(t), this._resizeHint = e(), this._moveHint = e(), this._cellId = I.guid(), this._resourcesForGroups(), this._selectedSlots = [] }, _isMobile: function() { var e = this.options; return e.mobile === !0 && I.support.mobileOS || "phone" === e.mobile || "tablet" === e.mobile }, _isMobilePhoneView: function() { var e = this.options; return e.mobile === !0 && I.support.mobileOS && !I.support.mobileOS.tablet || "phone" === e.mobile }, _addResourceView: function() { var e = new w(this.groups.length); return this.groups.push(e), e }, dateForTitle: function() { return I.format(this.options.selectedDateFormat, this.startDate(), this.endDate()) }, shortDateForTitle: function() { return I.format(this.options.selectedShortDateFormat, this.startDate(), this.endDate()) }, _changeGroup: function(e, t) { var n = t ? "prevGroupSlot" : "nextGroupSlot", i = this[n](e.start, e.groupIndex, e.isAllDay); return i && (e.groupIndex += t ? -1 : 1), i }, _changeGroupContinuously: function() { return null }, _changeViewPeriod: function() { return !1 }, _horizontalSlots: function(e, t, n, i) { var r, o, a = i ? "leftSlot" : "rightSlot", s = t[0].start, l = t[t.length - 1].end, c = this.groups[e.groupIndex]; return n || (r = this._normalizeHorizontalSelection(e, t, i), r && (s = l = r)), s = c[a](s), l = c[a](l), n || this._isVerticallyGrouped() || s && l || (s = l = this._changeGroup(e, i)), s && l || (o = this._continuousSlot(e, t, i), o = this._changeGroupContinuously(e, o, n, i), o && (s = l = o)), { startSlot: s, endSlot: l } }, _verticalSlots: function(e, t, n, i) { var r, o, a = t[0].start, s = t[t.length - 1].end, l = this.groups[e.groupIndex]; return n || (r = this._normalizeVerticalSelection(e, t, i), r && (a = s = r)), o = i ? "upSlot" : "downSlot", a = l[o](a, n), s = l[o](s, n), n || !this._isVerticallyGrouped() || a && s || (a = s = this._changeGroup(e, i)), { startSlot: a, endSlot: s } }, _normalizeHorizontalSelection: function() { return null }, _normalizeVerticalSelection: function(e, t, n) { var i; return i = n ? t[0].start : t[t.length - 1].end }, _continuousSlot: function() { return null }, constrainSelection: function(e) { var t, n = this.groups[0]; this.inRange(e) ? n.daySlotCollectionCount() || (e.isAllDay = !1) : (t = n.firstSlot(), e.isAllDay = t.isDaySlot, e.start = t.startDate(), e.end = t.endDate()), this.groups[e.groupIndex] || (e.groupIndex = 0) }, move: function(e, t, n) { var i, r, o, a, s, l, c = !1, d = this.groups[e.groupIndex]; if (d.timeSlotCollectionCount() || (e.isAllDay = !0), i = d.ranges(e.start, e.end, e.isAllDay, !1), t === z.DOWN || t === z.UP) { if (c = !0, a = t === z.UP, this._updateDirection(e, i, n, a, !0), s = this._verticalSlots(e, i, n, a), !s.startSlot && !n && this._changeViewPeriod(e, a, !0)) return c } else if ((t === z.LEFT || t === z.RIGHT) && (c = !0, a = t === z.LEFT, this._updateDirection(e, i, n, a, !1), s = this._horizontalSlots(e, i, n, a), !s.startSlot && !n && this._changeViewPeriod(e, a, !1))) return c; return c && (r = s.startSlot, o = s.endSlot, n ? (l = e.backward, l && r ? e.start = r.startDate() : !l && o && (e.end = o.endDate())) : r && o && (e.isAllDay = r.isDaySlot, e.start = r.startDate(), e.end = o.endDate()), e.events = []), c }, moveToEventInGroup: function(t, n, i, r) { for (var o, a, s = t._continuousEvents || [], l = r ? -1 : 1, c = s.length, d = r ? c - 1 : 0; c > d && d > -1;) { if (a = s[d], (!r && a.start.startDate() >= n.startDate() || r && a.start.startDate() <= n.startDate()) && (i.length && (a = s[d + l]), a && -1 === e.inArray(a.uid, i))) { o = !!a; break } d += l } return a }, moveToEvent: function(e, t) { for (var n, i = e.groupIndex, r = this.groups[i], o = r.ranges(e.start, e.end, e.isAllDay, !1)[0].start, a = this.groups.length, s = t ? -1 : 1, l = e.events; a > i && i > -1 && (n = this.moveToEventInGroup(r, o, l, t), i += s, r = this.groups[i], r && !n);) l = [], o = t ? r.lastSlot() : r.firstSlot(!0); return n && (e.events = [n.uid], e.start = n.start.startDate(), e.end = n.end.endDate(), e.isAllDay = n.start.isDaySlot, e.groupIndex = n.start.groupIndex), !!n }, current: function(e) { return void 0 === e ? this._current : (this._current = e, void(this.content.has(e) && this._scrollTo(e, this.content[0]))) }, select: function(e) { this.clearSelection(), this._selectEvents(e) || this._selectSlots(e) }, _selectSlots: function(e) { var t, n, i, r, o, a, s, l = e.isAllDay, c = this.groups[e.groupIndex]; for (c.timeSlotCollectionCount() || (l = !0), this._selectedSlots = [], t = c.ranges(e.start, e.end, l, !1), r = 0; t.length > r; r++) for (o = t[r], a = o.collection, s = o.start.index; o.end.index >= s; s++) i = a.at(s), n = i.element, n.setAttribute("aria-selected", !0), _(n), this._selectedSlots.push({ start: i.startDate(), end: i.endDate(), element: n }); e.backward && (n = t[0].start.element), this.current(n) }, _selectEvents: function(t) { var n, i, r = !1, o = t.events, a = this.groups[t.groupIndex]._continuousEvents || [], s = a.length; if (!o[0] || !a[0]) return r; for (i = e(), t.events = [], n = 0; s > n; n++) e.inArray(a[n].uid, o) > -1 && (i = i.add(a[n].element), t.events.push(a[n].uid)); return i[0] && (i.addClass("k-state-selected").attr("aria-selected", !0), this.current(i.last()[0]), this._selectedSlots = [], r = !0), r }, inRange: function(e) { var t = this.startDate(), n = I.date.addDays(this.endDate(), 1), i = e.start, r = e.end; return i >= t && n > i && r > t && n >= r }, _resourceValue: function(e, t) { return e.valuePrimitive && (t = I.getter(e.dataValueField)(t)), t }, _resourceBySlot: function(e) { var t, n, i, r, o, a = this.groupedResources, s = {}; if (a.length) for (t = e.groupIndex, n = a.length - 1; n >= 0; n--) i = a[n], r = this._resourceValue(i, i.dataSource.view()[t % i.dataSource.total()]), i.multiple && (r = [r]), o = I.setter(i.field), o(s, r), t = Math.floor(t / i.dataSource.total()); return s }, _createResizeHint: function(t, n, i, r) { return e(H).css({ left: t, top: n, width: i, height: r }) }, _removeResizeHint: function() { this._resizeHint.remove(), this._resizeHint = e() }, _removeMoveHint: function() { this._moveHint.remove(), this._moveHint = e() }, _scrollTo: function(e, t) { var n = e.offsetTop, i = e.offsetHeight, r = t.scrollTop, o = t.clientHeight, a = n + i, s = 0; s = r > n ? n : a > r + o ? o >= i ? a - o : n : r, t.scrollTop = s }, _shouldInverseResourceColor: function(e) { var t = new A(e.color).isDark(), n = this.element.css("color"), i = new A(n).isDark(); return t == i }, _eventTmpl: function(t, n) { var i, r = this.options, o = e.extend({}, I.Template, r.templateSettings), a = o.paramName, s = "", l = typeof t, c = { storage: {}, count: 0 }; return "function" === l ? (c.storage["tmpl" + c.count] = t, s += "#=this.tmpl" + c.count + "(" + a + ")#", c.count++) : "string" === l && (s += t), i = I.template(I.format(n, s), o), c.count > 0 && (i = e.proxy(i, c.storage)), i }, eventResources: function(e) { var t, n, i, r, o, a, s, l, c, d, u = [], h = this.options; if (!h.resources) return u; for (t = 0; h.resources.length > t; t++) if (n = h.resources[t], i = n.field, r = I.getter(i)(e), null != r) for (n.multiple || (r = [r]), o = n.dataSource.view(), a = 0; r.length > a; a++) { for (s = null, l = r[a], n.valuePrimitive || (l = I.getter(n.dataValueField)(l)), c = 0; o.length > c; c++) if (o[c].get(n.dataValueField) == l) { s = o[c]; break } null !== s && (d = I.getter(n.dataColorField)(s), u.push({ field: n.field, title: n.title, name: n.name, text: I.getter(n.dataTextField)(s), value: l, color: d })) } return u }, createLayout: function(i) { var r, o, a, s, l, c = -1; for (i.rows || (i.rows = []), r = 0; i.rows.length > r; r++) if (i.rows[r].allDay) { c = r; break } o = i.rows[c], c >= 0 && i.rows.splice(c, 1), a = this.columnLevels = t(i, "columns"), s = this.rowLevels = t(i, "rows"), this.table = e("<table " + n() + ' class="k-scheduler-layout k-scheduler-' + this.name + 'view"/>'), l = s[s.length - 1].length, this.table.append(this._topSection(a, o, l)), this.table.append(this._bottomSection(a, s, l)), this.element.append(this.table), this._scroller() }, refreshLayout: function() { var t, n, i, r, o, a, s = this, l = s.element.find(">.k-scheduler-toolbar"), c = s.element.innerHeight(), d = this._scrollbar, u = 0, h = this._isRtl ? "left" : "right"; for (t = 0; l.length > t; t++) c -= l.eq(t).outerHeight(); s.datesHeader && (u = s.datesHeader.outerHeight()), s.timesHeader && s.timesHeader.outerHeight() > u && (u = s.timesHeader.outerHeight()), s.datesHeader && s.timesHeader && (n = s.datesHeader.find("table:first tr"), s.timesHeader.find("tr").height(function(t) { e(this).height(n.eq(t).height()) })), u && (c -= u), s.footer && (c -= s.footer.outerHeight()), i = function(e) { var t, n; return e[0].style.height ? !0 : (t = e.height(), e.height("auto"), n = e.height(), t != n ? (e.height(""), !0) : (e.height(""), !1)) }, r = s.content[0], o = I.support.kineticScrollNeeded ? 0 : d, i(s.element) && (s.content.height(c > 2 * d ? c : 2 * d + 1), s.times.height(r.clientHeight), a = s.times.find("table"), a.length && a.height(s.content.find("table")[0].clientHeight)), r.offsetWidth - r.clientWidth > 0 ? (s.table.addClass("k-scrollbar-v"), s.datesHeader.css("padding-" + h, o - parseInt(s.datesHeader.children().css("border-" + h + "-width"), 10))) : s.datesHeader.css("padding-" + h, ""), r.offsetHeight - r.clientHeight > 0 || r.clientHeight > s.content.children(".k-scheduler-table").height() ? s.table.addClass("k-scrollbar-h") : s.table.removeClass("k-scrollbar-h") }, _topSection: function(t, n, i) { this.timesHeader = o(t.length, n, i); var r = t[t.length - 1].length; return this.datesHeader = a(t, r, n), e("<tr>").append(this.timesHeader.add(this.datesHeader).wrap("<td>").parent()) }, _bottomSection: function(t, n, i) { return this.times = s(n, i), this.content = l(t[t.length - 1], n[n.length - 1]), e("<tr>").append(this.times.add(this.content).wrap("<td>").parent()) }, _scroller: function() { var t, n = this; this.content.bind("scroll" + F, function() { n.datesHeader.find(">.k-scheduler-header-wrap").scrollLeft(this.scrollLeft), n.times.scrollTop(this.scrollTop) }), t = I.touchScroller(this.content, { avoidScrolling: function(t) { return e(t.event.target).closest(".k-event.k-event-active").length > 0 } }), t && t.movable && (this._touchScroller = t, this.content = t.scrollElement, t.movable.bind("change", function(e) { n.datesHeader.find(">.k-scheduler-header-wrap").scrollLeft(-e.sender.x), n.times.scrollTop(-e.sender.y) })) }, _resourcesForGroups: function() { var e, t, n, i, r = [], o = this.options.group, a = this.options.resources; if (o = o && o.resources ? o.resources : [], a && o.length) for (e = 0, t = a.length; t > e; e++) for (n = 0, i = o.length; i > n; n++) a[e].name === o[n] && r.push(a[e]); this.groupedResources = r }, _createColumnsLayout: function(e, t, n) { return m("columns", e, t, n) }, _groupOrientation: function() { var e = this.options.group; return e && e.resources ? e.orientation : "horizontal" }, _isVerticallyGrouped: function() { return this.groupedResources.length && "vertical" === this._groupOrientation() }, _createRowsLayout: function(e, t, n) { return m("rows", e, t, n) }, selectionByElement: function() { return null }, clearSelection: function() { this.content.find(".k-state-selected").removeAttr("id").attr("aria-selected", !1).removeClass("k-state-selected") }, destroy: function() { var e = this; M.fn.destroy.call(this), e.table && (I.destroy(e.table), e.table.remove()), e.groups = null, e.table = null, e.content = null, e.times = null, e.datesHeader = null, e.timesHeader = null, e.footer = null, e._resizeHint = null, e._moveHint = null }, calendarInfo: function() { return I.getCulture().calendars.standard }, prevGroupSlot: function(e, t, n) { var i, r = this.groups[t], o = r.ranges(e, e, n, !1)[0].start; if (!(0 >= t)) return this._isVerticallyGrouped() ? r.timeSlotCollectionCount() ? (i = r._collection(n ? o.index : o.collectionIndex, !1), i.last()) : (i = r._collection(r.daySlotCollectionCount() - 1, !0), i.at(o.index)) : r.timeSlotCollectionCount() ? (i = r._collection(n ? 0 : r.timeSlotCollectionCount() - 1, n), n ? i.last() : i.at(o.index)) : (i = r._collection(o.collectionIndex, !0), i.last()) }, nextGroupSlot: function(e, t, n) { var i, r, o = this.groups[t], a = o.ranges(e, e, n, !1)[0].start; if (!(t >= this.groups.length - 1)) return this._isVerticallyGrouped() ? o.timeSlotCollectionCount() ? (r = o.daySlotCollectionCount(), i = o._collection(r ? 0 : a.collectionIndex, r), n ? i.first() : i.at(a.collectionIndex)) : (i = o._collection(0, !0), i.at(a.index)) : o.timeSlotCollectionCount() ? (i = o._collection(0, n), n ? i.first() : i.at(a.index)) : (i = o._collection(a.collectionIndex, !0), i.first()) }, _eventOptionsForMove: function() { return {} }, _updateEventForResize: function() {}, _updateEventForSelection: function(e) { return e } }), A = function(e) { var t, n, i, r, o, a = this, s = A.formats; if (1 === arguments.length) for (e = a.resolveColor(e), r = 0; s.length > r; r++) t = s[r].re, n = s[r].process, i = t.exec(e), i && (o = n(i), a.r = o[0], a.g = o[1], a.b = o[2]); else a.r = arguments[0], a.g = arguments[1], a.b = arguments[2]; a.r = a.normalizeByte(a.r), a.g = a.normalizeByte(a.g), a.b = a.normalizeByte(a.b) }, A.prototype = { resolveColor: function(e) { return e = e || "#000", "#" == e.charAt(0) && (e = e.substr(1, 6)), e = e.replace(/ /g, ""), e = e.toLowerCase(), e = A.namedColors[e] || e }, normalizeByte: function(e) { return 0 > e || isNaN(e) ? 0 : e > 255 ? 255 : e }, percBrightness: function() { var e = this; return R.sqrt(.241 * e.r * e.r + .691 * e.g * e.g + .068 * e.b * e.b) }, isDark: function() { var e = this, t = e.percBrightness(); return 180 > t } }, A.formats = [{ re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(e) { return [parseInt(e[1], 10), parseInt(e[2], 10), parseInt(e[3], 10)] } }, { re: /^(\w{2})(\w{2})(\w{2})$/, process: function(e) { return [parseInt(e[1], 16), parseInt(e[2], 16), parseInt(e[3], 16)] } }, { re: /^(\w{1})(\w{1})(\w{1})$/, process: function(e) { return [parseInt(e[1] + e[1], 16), parseInt(e[2] + e[2], 16), parseInt(e[3] + e[3], 16)] } }], A.namedColors = { aqua: "00ffff", azure: "f0ffff", beige: "f5f5dc", black: "000000", blue: "0000ff", brown: "a52a2a", coral: "ff7f50", cyan: "00ffff", darkblue: "00008b", darkcyan: "008b8b", darkgray: "a9a9a9", darkgreen: "006400", darkorange: "ff8c00", darkred: "8b0000", dimgray: "696969", fuchsia: "ff00ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lightblue: "add8e6", lightgrey: "d3d3d3", lightgreen: "90ee90", lightpink: "ffb6c1", lightyellow: "ffffe0", lime: "00ff00", limegreen: "32cd32", linen: "faf0e6", magenta: "ff00ff", maroon: "800000", mediumblue: "0000cd", navy: "000080", olive: "808000", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", pink: "ffc0cb", plum: "dda0dd", purple: "800080", red: "ff0000", royalblue: "4169e1", salmon: "fa8072", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", snow: "fffafa", steelblue: "4682b4", tan: "d2b48c", teal: "008080", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "ffffff", whitesmoke: "f5f5f5", yellow: "ffff00", yellowgreen: "9acd32" }, E = /\s*k-state-selected/, e.extend(P.SchedulerView, { createColumns: p, createRows: f, rangeIndex: u, collidingEvents: d, groupEqFilter: v }) }(window.kendo.jQuery), function(e, t) { function n(e) { var t = new Date(1980, 1, 1, 0, 0, 0); return c(t, m(e)), t } function i(e, t, n) { return e >= t && n >= e } function r(e, t, n, i) { return i = i ? n >= e : n > e, e > t && i } function o(e, t, n, i) { var r, o = e._continuousEvents, a = o[o.length - 1], l = p(t.start.startDate()).getTime(); if (i && a && p(a.start.startDate()).getTime() == l) { for (r = o.length - 1; r > -1 && !(o[r].isAllDay || p(o[r].start.startDate()).getTime() < l); r--); o.splice(r + 1, 0, { element: n, isAllDay: !0, uid: n.attr(s.attr("uid")), start: t.start, end: t.end }) } else o.push({ element: n, isAllDay: i, uid: n.attr(s.attr("uid")), start: t.start, end: t.end }) } function a(e) { var t = [], n = e.workWeekStart; for (t.push(n); e.workWeekEnd != n;) n > 6 ? n -= 7 : n++, t.push(n); return t } var s = window.kendo, l = s.ui, c = s.date.setTime, d = l.SchedulerView, u = e.extend, h = e.proxy, p = s.date.getDate, f = s.date.MS_PER_MINUTE, g = s.date.MS_PER_DAY, m = s.date.getMilliseconds, v = ".kendoMultiDayView", _ = s.template('<div title="(#=kendo.format("{0:t} - {1:t}", start, end)#): #=title.replace(/"/g,"&\\#34;")#"><div class="k-event-template k-event-time">#:kendo.format("{0:t} - {1:t}", start, end)#</div><div class="k-event-template">${title}</div></div>'), w = s.template('<div title="(#=kendo.format("{0:t}", start)#): #=title.replace(/"/g,"&\\#34;")#"><div class="k-event-template">${title}</div></div>'), b = s.template("<span class='k-link k-nav-day'>#=kendo.toString(date, 'ddd M/dd')#</span>"), y = '<div role="gridcell" aria-selected="false" data-#=ns#uid="#=uid#"#if (resources[0]) { #style="background-color:#=resources[0].color#; border-color: #=resources[0].color#"class="k-event#=inverseColor ? " k-event-inverse" : ""#" #} else {#class="k-event"#}#><span class="k-event-actions"># if(data.tail || data.middle) {#<span class="k-icon k-i-arrow-w"></span>#}## if(data.isException()) {#<span class="k-icon k-i-exception"></span># } else if(data.isRecurring()) {#<span class="k-icon k-i-refresh"></span># } #</span>{0}<span class="k-event-actions">#if (showDelete) {#<a href="\\#" class="k-link k-event-delete"><span class="k-icon k-si-close"></span></a>#}## if(data.head || data.middle) {#<span class="k-icon k-i-arrow-e"></span>#}#</span>#if(resizable && !singleDay && !data.tail && !data.middle){#<span class="k-resize-handle k-resize-w"></span>#}##if(resizable && !singleDay && !data.head && !data.middle){#<span class="k-resize-handle k-resize-e"></span>#}#</div>', k = '<div role="gridcell" aria-selected="false" data-#=ns#uid="#=uid#" #if (resources[0]) { #style="background-color:#=resources[0].color #; border-color: #=resources[0].color#"class="k-event#=inverseColor ? " k-event-inverse" : ""#"#} else {#class="k-event"#}#><span class="k-event-actions"># if(data.isException()) {#<span class="k-icon k-i-exception"></span># } else if(data.isRecurring()) {#<span class="k-icon k-i-refresh"></span># } #</span>{0}<span class="k-event-actions">#if (showDelete) {#<a href="\\#" class="k-link k-event-delete"><span class="k-icon k-si-close"></span></a>#}#</span><span class="k-event-top-actions"># if(data.tail || data.middle) {#<span class="k-icon k-i-arrow-n"></span># } #</span><span class="k-event-bottom-actions"># if(data.head || data.middle) {#<span class="k-icon k-i-arrow-s"></span># } #</span># if(resizable && !data.tail && !data.middle) {#<span class="k-resize-handle k-resize-n"></span># } ## if(resizable && !data.head && !data.middle) {#<span class="k-resize-handle k-resize-s"></span># } #</div>', x = d.extend({ init: function(e, t) { var n = this; d.fn.init.call(n, e, t), n.title = n.options.title || n.options.name, n._workDays = a(n.options), n._templates(), n._editable(), n.calculateDateRange(), n._groups(), n._currentTime() }, _currentTimeMarkerUpdater: function() { var t, n, i, r, o, a, l, c, d, u, h = new Date, p = this.options; for (p.currentTimeMarker.useLocalTimezone === !1 && (t = p.dataSource.options.schema.timezone, p.dataSource && t && (n = s.timezone.offset(h, t), h = s.timezone.convert(h, h.getTimezoneOffset(), n))), this.times.find(".k-current-time").remove(), i = p.group && "horizontal" != p.group.orientation ? this.groups.length : 1, r = 0; i > r; r++) { if (o = this.groups[r], a = s.date.toUtcTime(h), l = o.timeSlotRanges(a, a + 1), 0 === l.length) return; c = l[0].collection, d = c.slotByStartDate(h), d && (u = e("<div class='k-current-time'></div>"), u.appendTo(this.times).css({ top: Math.round(l[0].innerRect(h, new Date(h.getTime() + 1), !1).top), height: "1px", right: "1px", left: 0 })) } }, _currentTime: function() { var e, n = this, i = n.options.currentTimeMarker; i !== !1 && i.updateInterval !== t && (e = i.updateInterval, n._currentTimeMarkerUpdater(), n._currentTimeUpdateTimer = setInterval(h(this._currentTimeMarkerUpdater, n), e)) }, _updateResizeHint: function(e, t, n, i) { var r, o, a, l, c, u, h, p, f, g, m = e.isMultiDay(), v = this.groups[t], _ = v.ranges(n, i, m, e.isAllDay); for (this._removeResizeHint(), r = 0; _.length > r; r++) o = _[r], a = o.startSlot(), l = a.offsetWidth, c = a.clientHeight, u = a.offsetTop, m ? l = o.innerWidth() : (h = o.outerRect(n, i, this.options.snap), u = h.top, c = h.bottom - h.top), p = d.fn._createResizeHint.call(this, a.offsetLeft, u, l, c), this._resizeHint = this._resizeHint.add(p); f = "t", g = this.content, m && (f = "M/dd", g = this.element.find(".k-scheduler-header-wrap:has(.k-scheduler-header-all-day) > div"), g.length || (g = this.content)), this._resizeHint.appendTo(g), this._resizeHint.find(".k-label-top,.k-label-bottom").text(""), this._resizeHint.first().addClass("k-first").find(".k-label-top").text(s.toString(s.timezone.toLocalDate(n), f)), this._resizeHint.last().addClass("k-last").find(".k-label-bottom").text(s.toString(s.timezone.toLocalDate(i), f)) }, _updateMoveHint: function(e, t, n) { var i, r, o, a, l, c, d, u = e.isMultiDay(), h = this.groups[t], p = s.date.toUtcTime(e.start) + n, f = p + e.duration(), g = h.ranges(p, f, u, e.isAllDay); for (p = s.timezone.toLocalDate(p), f = s.timezone.toLocalDate(f), this._removeMoveHint(), !u && (0 === m(f) || m(f) < m(this.startTime())) && g.length > 1 && g.pop(), i = 0; g.length > i; i++) r = g[i], o = r.start, a = this._createEventElement(e.clone({ start: p, end: f }), !u), a.addClass("k-event-drag-hint"), l = { left: o.offsetLeft + 2, top: o.offsetTop }, this._isRtl && (l.left = .1 * o.clientWidth + o.offsetLeft + 2), u ? l.width = r.innerWidth() - 4 : (c = r.outerRect(p, f, this.options.snap), l.top = c.top, l.height = c.bottom - c.top, l.width = .9 * o.clientWidth - 4), a.css(l), this._moveHint = this._moveHint.add(a); d = this.content, u && (d = this.element.find(".k-scheduler-header-wrap:has(.k-scheduler-header-all-day) > div"), d.length || (d = this.content)), this._moveHint.appendTo(d) }, _slotByPosition: function(e, t) { var n, i, r, o; for (this._isVerticallyGrouped() ? (i = this.content.offset(), t += this.content[0].scrollTop, e += this.content[0].scrollLeft) : i = this.element.find(".k-scheduler-header-wrap:has(.k-scheduler-header-all-day)").find(">div").offset(), i && (e -= i.left, t -= i.top), e = Math.ceil(e), t = Math.ceil(t), o = 0; this.groups.length > o; o++) if (r = this.groups[o], n = r.daySlotByPosition(e, t)) return n; for (i && (e += i.left, t += i.top), i = this.content.offset(), e -= i.left, t -= i.top, this._isVerticallyGrouped() || (t += this.content[0].scrollTop, e += this.content[0].scrollLeft), e = Math.ceil(e), t = Math.ceil(t), o = 0; this.groups.length > o; o++) if (r = this.groups[o], n = r.timeSlotByPosition(e, t)) return n; return null }, _groupCount: function() { var e = this.groupedResources; return e.length ? "vertical" === this._groupOrientation() ? this._rowCountForLevel(e.length - 1) : this._columnCountForLevel(e.length) / this._columnOffsetForResource(e.length) : 1 }, _columnCountInResourceView: function() { var e = this.groupedResources; return !e.length || this._isVerticallyGrouped() ? this._columnCountForLevel(0) : this._columnOffsetForResource(e.length) }, _timeSlotGroups: function(e, t) { var n, i, r, o, a, s, l, c, d, u, h, p, f, g, v, _, w = this._timeSlotInterval(), b = this.content.find("tr:not(.k-scheduler-header-all-day)"); for (b.attr("role", "row"), n = b.length, this._isVerticallyGrouped() && (n = Math.floor(n / e)), i = 0; e > i; i++) for (r = 0, this._isVerticallyGrouped() && (r = i), o = r * n, s = 0, this._isVerticallyGrouped() || (s = i); (r + 1) * n > o;) { for (l = b[o].children, c = this.groups[i], o % n === 0 && (a = m(new Date(+this.startTime()))), d = s * t; (s + 1) * t > d; d++) u = l[d], h = d % t, p = c.getTimeSlotCollection(h), f = this._dates[h], g = Date.UTC(f.getFullYear(), f.getMonth(), f.getDate()), v = g + a, _ = v + w, u.setAttribute("role", "gridcell"), u.setAttribute("aria-selected", !1), p.addTimeSlot(u, v, _); a += w, o++ } }, _daySlotGroups: function(e, t) { var n, i, r, o, a, l, c, d, u, h, p, f; for (n = this.element.find(this._isVerticallyGrouped() ? ".k-scheduler-header-all-day" : ".k-scheduler-header-all-day tr"), n.attr("role", "row"), i = 0; e > i; i++) for (r = 0, this._isVerticallyGrouped() && (r = i), o = this.groups[i], a = o.getDaySlotCollection(0), l = n[r].children, c = 0, this._isVerticallyGrouped() || (c = i), d = 0, u = c * t; (c + 1) * t > u; u++) h = l[u], u % t === 0 && (d = 0), p = this._dates[d], f = Date.UTC(p.getFullYear(), p.getMonth(), p.getDate()), d++, h.setAttribute("role", "gridcell"), h.setAttribute("aria-selected", !1), a.addDaySlot(h, f, f + s.date.MS_PER_DAY) }, _groups: function() { var e, t, n, i = this._groupCount(), r = this._columnCountInResourceView(); for (this.groups = [], e = 0; i > e; e++) { for (t = this._addResourceView(e), n = 0; r > n; n++) t.addTimeSlotCollection(this._dates[n], s.date.addDays(this._dates[n], 1)); this.options.allDaySlot && t.addDaySlotCollection(this._dates[0], s.date.addDays(this._dates[this._dates.length - 1], 1)) } this._timeSlotGroups(i, r), this.options.allDaySlot && this._daySlotGroups(i, r) }, options: { name: "MultiDayView", selectedDateFormat: "{0:D}", selectedShortDateFormat: "{0:d}", allDaySlot: !0, showWorkHours: !1, title: "", startTime: s.date.today(), endTime: s.date.today(), minorTickCount: 2, majorTick: 60, majorTimeHeaderTemplate: "#=kendo.toString(date, 't')#", minorTimeHeaderTemplate: " ", groupHeaderTemplate: "#=text#", slotTemplate: " ", allDaySlotTemplate: " ", eventTemplate: _, allDayEventTemplate: w, dateHeaderTemplate: b, editable: !0, workDayStart: new Date(1980, 1, 1, 8, 0, 0), workDayEnd: new Date(1980, 1, 1, 17, 0, 0), workWeekStart: 1, workWeekEnd: 5, footer: { command: "workDay" }, messages: { allDay: "all day", showFullDay: "Show full day", showWorkDay: "Show business hours" }, currentTimeMarker: { updateInterval: 1e4, useLocalTimezone: !0 } }, events: ["remove", "add", "edit"], _templates: function() { var e = this.options, t = u({}, s.Template, e.templateSettings); this.eventTemplate = this._eventTmpl(e.eventTemplate, k), this.allDayEventTemplate = this._eventTmpl(e.allDayEventTemplate, y), this.majorTimeHeaderTemplate = s.template(e.majorTimeHeaderTemplate, t), this.minorTimeHeaderTemplate = s.template(e.minorTimeHeaderTemplate, t), this.dateHeaderTemplate = s.template(e.dateHeaderTemplate, t), this.slotTemplate = s.template(e.slotTemplate, t), this.allDaySlotTemplate = s.template(e.allDaySlotTemplate, t), this.groupHeaderTemplate = s.template(e.groupHeaderTemplate, t) }, _editable: function() { this.options.editable && (this._isMobile() ? this._touchEditable() : this._mouseEditable()) }, _mouseEditable: function() { var t = this; t.element.on("click" + v, ".k-event a:has(.k-si-close)", function(n) { t.trigger("remove", { uid: e(this).closest(".k-event").attr(s.attr("uid")) }), n.preventDefault() }), t.options.editable.create !== !1 && t.element.on("dblclick" + v, ".k-scheduler-content td", function(n) { var i, r; e(this).parent().hasClass("k-scheduler-header-all-day") || (i = t._slotByPosition(n.pageX, n.pageY), i && (r = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({ start: i.startDate(), end: i.endDate() }, r) })), n.preventDefault()) }).on("dblclick" + v, ".k-scheduler-header-all-day td", function(e) { var n, i = t._slotByPosition(e.pageX, e.pageY); i && (n = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({}, { isAllDay: !0, start: s.date.getDate(i.startDate()), end: s.date.getDate(i.startDate()) }, n) })), e.preventDefault() }), t.options.editable.update !== !1 && t.element.on("dblclick" + v, ".k-event", function(n) { t.trigger("edit", { uid: e(this).closest(".k-event").attr(s.attr("uid")) }), n.preventDefault() }) }, _touchEditable: function() { var t = this, n = 0; s.support.mobileOS.android && (n = 5), t.options.editable.create !== !1 && (t._addUserEvents = new s.UserEvents(t.element, { threshold: n, filter: ".k-scheduler-content td", tap: function(n) { var i, r; e(n.target).parent().hasClass("k-scheduler-header-all-day") || (i = t._slotByPosition(n.x.location, n.y.location), i && (r = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({ start: i.startDate(), end: i.endDate() }, r) })), n.preventDefault()) } }), t._allDayUserEvents = new s.UserEvents(t.element, { threshold: n, filter: ".k-scheduler-header-all-day td", tap: function(e) { var n, i = t._slotByPosition(e.x.location, e.y.location); i && (n = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({}, { isAllDay: !0, start: s.date.getDate(i.startDate()), end: s.date.getDate(i.startDate()) }, n) })), e.preventDefault() } })), t.options.editable.update !== !1 && (t._editUserEvents = new s.UserEvents(t.element, { threshold: n, filter: ".k-event", tap: function(n) { var i = e(n.target).closest(".k-event"); i.hasClass("k-event-active") || t.trigger("edit", { uid: i.attr(s.attr("uid")) }), n.preventDefault() } })) }, _layout: function(e) { var t, n, i, r = [], o = [], a = this.options, l = this; for (t = 0; e.length > t; t++) n = {}, n.text = l.dateHeaderTemplate({ date: e[t] }), s.date.isToday(e[t]) && (n.className = "k-today"), r.push(n); return i = this.groupedResources, a.allDaySlot && o.push({ text: a.messages.allDay, allDay: !0, cellContent: function(t) { var n = t; return t = i.length && "vertical" !== l._groupOrientation() ? t % e.length : t, l.allDaySlotTemplate({ date: e[t], resources: function() { return l._resourceBySlot({ groupIndex: n }) } }) } }), this._forTimeRange(this.startTime(), this.endTime(), function(e, t, n, i) { var r = t ? l.majorTimeHeaderTemplate : l.minorTimeHeaderTemplate, a = { text: r({ date: e }), className: i ? "k-slot-cell" : "" }; o.push(a) }), i.length && ("vertical" === this._groupOrientation() ? o = this._createRowsLayout(i, o, this.groupHeaderTemplate) : r = this._createColumnsLayout(i, r, this.groupHeaderTemplate)), { columns: r, rows: o } }, _footer: function() { var t, n, i, r = this.options; r.footer !== !1 && (t = '<div class="k-header k-scheduler-footer">', n = r.footer.command, n && "workDay" === n ? (t += '<ul class="k-reset k-header">', t += '<li class="k-state-default k-scheduler-fullday"><a href="#" class="k-link"><span class="k-icon k-i-clock"></span>', t += (r.showWorkHours ? r.messages.showFullDay : r.messages.showWorkDay) + "</a></li>", t += "</ul>") : t += " ", t += "</div>", this.footer = e(t).appendTo(this.element), i = this, this.footer.on("click" + v, ".k-scheduler-fullday", function(e) { e.preventDefault(), i.trigger("navigate", { view: i.name || r.name, date: i.startDate(), isWorkDay: !r.showWorkHours }) })) }, _forTimeRange: function(e, t, i, r) { var o, a, s, l, d, u, h, p, v, _, w, b, y, k, x, C; for (e = n(e), t = n(t), o = this, a = m(e), s = m(t), l = o.options.minorTickCount, d = o.options.majorTick * f, u = d / l || 1, h = new Date(+e), p = h.getDate(), _ = 0, b = "", w = g / u, a != s && (a > s && (s += g), w = (s - a) / u), w = Math.round(w); w > _; _++) y = _ % (d / u), k = 0 === y, x = l - 1 > y, C = y === l - 1, b += i(h, k, x, C), c(h, u, !1); return s && (v = m(h), p < h.getDate() && (v += g), v > s && (h = new Date(+t))), r && (b += r(h)), b }, _content: function(e) { var t, n, i, r = this, o = r.options, a = r.startTime(), l = this.endTime(), c = 1, d = 1, u = e.length, h = "", p = this.groupedResources, f = this.slotTemplate, g = this.allDaySlotTemplate, m = !1; for (p.length && (m = "vertical" === r._groupOrientation(), m ? (d = this._rowCountForLevel(this.rowLevels.length - 2), o.allDaySlot && (t = function(t) { var n, i, o = '<tr class="k-scheduler-header-all-day">', a = function() { return r._resourceBySlot({ groupIndex: t }) }; for (n = 0, i = e.length; i > n; n++) o += "<td>" + g({ date: e[n], resources: a }) + "</td>"; return o + "</tr>" })) : c = this._columnCountForLevel(this.columnLevels.length - 2)), h += "<tbody>", n = function(t, n) { var o, a, l, d, h = "", p = "", g = 0; for (h = "<tr" + (n ? ' class="k-middle-row"' : "") + ">", d = function(e) { return function() { return r._resourceBySlot({ groupIndex: e }) } }; c > g; g++) for (o = 0, a = u; a > o; o++) p = "", s.date.isToday(e[o]) && (p += "k-today"), (s.date.getMilliseconds(t) < s.date.getMilliseconds(r.options.workDayStart) || s.date.getMilliseconds(t) >= s.date.getMilliseconds(r.options.workDayEnd) || !r._isWorkDay(e[o])) && (p += " k-nonwork-hour"), h += "<td" + ("" !== p ? ' class="' + p + '"' : "") + ">", l = s.date.getDate(e[o]), s.date.setTime(l, s.date.getMilliseconds(t)), h += f({ date: l, resources: d(m ? i : g) }), h += "</td>"; return h += "</tr>" }, i = 0; d > i; i++) h += t ? t(i) : "", h += this._forTimeRange(a, l, n); h += "</tbody>", this.content.find("table").append(h) }, _isWorkDay: function(e) { var t, n = e.getDay(), i = this._workDays; for (t = 0; i.length > t; t++) if (i[t] === n) return !0; return !1 }, _render: function(t) { var n, i = this; t = t || [], this._dates = t, this._startDate = t[0], this._endDate = t[t.length - 1 || 0], this.createLayout(this._layout(t)), this._content(t), this._footer(), this.refreshLayout(), n = this.element.find(".k-scheduler-header-all-day td"), n.length && (this._allDayHeaderHeight = n.first()[0].clientHeight), i.datesHeader.on("click" + v, ".k-nav-day", function(t) { var n = e(t.currentTarget).closest("th"), r = n.offset(), o = i._slotByPosition(r.left, r.top + n.outerHeight()); i.trigger("navigate", { view: "day", date: o.startDate() }) }) }, startTime: function() { var e = this.options; return e.showWorkHours ? e.workDayStart : e.startTime }, endTime: function() { var e = this.options; return e.showWorkHours ? e.workDayEnd : e.endTime }, startDate: function() { return this._startDate }, endDate: function() { return this._endDate }, _end: function(e) { var t = m(this.endTime()) || g; return e && (t = 0), new Date(this._endDate.getTime() + t) }, nextDate: function() { return s.date.nextDay(this.endDate()) }, previousDate: function() { return s.date.previousDay(this.startDate()) }, calculateDateRange: function() { this._render([this.options.date]) }, destroy: function() { var e = this; e._currentTimeUpdateTimer && clearInterval(e._currentTimeUpdateTimer), e.datesHeader && e.datesHeader.off(v), e.element && e.element.off(v), e.footer && e.footer.remove(), d.fn.destroy.call(this), this._isMobile() && e.options.editable && (e.options.editable.create !== !1 && (e._addUserEvents.destroy(), e._allDayUserEvents.destroy()), e.options.editable.update !== !1 && e._editUserEvents.destroy()) }, inRange: function(e) { var t = d.fn.inRange.call(this, e), n = m(this.startTime()), i = m(this.endTime()) || s.date.MS_PER_DAY, r = m(e.start), o = m(e.end) || s.date.MS_PER_DAY; return t && r >= n && i >= o }, selectionByElement: function(e) { var t = e.offset(); return this._slotByPosition(t.left, t.top) }, _timeSlotInterval: function() { var e = this.options; return e.majorTick / e.minorTickCount * f }, _timeSlotIndex: function(e) { var t = this.options, n = m(e), i = m(this.startTime()), r = t.majorTick / t.minorTickCount * f; return (n - i) / r }, _slotIndex: function(e, t) { return t ? this._dateSlotIndex(e) : this._timeSlotIndex(e) }, _dateSlotIndex: function(e, t) { var n, r, o, a, l = this._dates || [], c = 1; for (n = 0, r = l.length; r > n; n++) if (o = s.date.getDate(l[n]), a = new Date(s.date.getDate(l[n]).getTime() + g - (t ? 0 : 1)), i(e, o, a)) return n * c; return -1 }, _positionAllDayEvent: function(t, n) { var i, r, o, a, s, l, c, u = n.innerWidth(), h = n.start.index, p = n.end.index, f = d.collidingEvents(n.events(), h, p), g = this._headerColumnCount || 0, m = 2, v = h !== p ? 5 : 4, _ = this._allDayHeaderHeight, w = n.startSlot(); for (t.css({ left: w.offsetLeft + m, width: u - v }), n.addEvent({ slotIndex: h, start: h, end: p, element: t }), f.push({ slotIndex: h, start: h, end: p, element: t }), i = d.createRows(f), i.length && i.length > g && (this._headerColumnCount = i.length), r = n.start.offsetTop, o = 0, a = i.length; a > o; o++) for (s = i[o].events, l = 0, c = s.length; c > l; l++) e(s[l].element).css({ top: r + o * _ }) }, _arrangeColumns: function(e, t, n, i) { var r, o, a, s, l, c, u, h, p, f, g, m = i.start; for (e = { element: e, slotIndex: m.index, start: t, end: t + n }, o = m.clientWidth, a = .1 * o, l = i.events(), c = d.collidingEvents(l, e.start, e.end), i.addEvent(e), c.push(e), r = d.createColumns(c), u = (o - a) / r.length, h = 0, p = r.length; p > h; h++) for (s = r[h].events, f = 0, g = s.length; g > f; f++) s[f].element[0].style.width = u - 4 + "px", s[f].element[0].style.left = (this._isRtl ? a : 0) + m.offsetLeft + h * u + 2 + "px" }, _positionEvent: function(e, t, n) { var i = e._startTime || e.start, r = e._endTime || e.end, o = n.innerRect(i, r, !1), a = o.bottom - o.top - 2; 0 > a && (a = 0), t.css({ top: o.top, height: a }), this._arrangeColumns(t, o.top, t[0].clientHeight, n) }, _createEventElement: function(t, n, r, o) { var a, l, c, d, h, f, v = n ? this.eventTemplate : this.allDayEventTemplate, _ = this.options, w = _.editable, b = this._isMobile(), y = w && w.destroy !== !1 && !b, k = w && w.resize !== !1, x = p(this.startDate()), C = p(this.endDate()), S = m(this.startTime()), T = m(this.endTime()), D = t._time("start"), A = t._time("end"); return S >= T && (T = m(new Date(this.endTime().getTime() + g - 1))), n || t.isAllDay || (C = new Date(C.getTime() + g)), l = t.start, c = t.end, t.isAllDay && (c = p(t.end)), !i(p(l), x, C) && !i(c, x, C) || n && S > D && A > T ? a = !0 : p(l) < x || n && S > D ? o = !0 : (c > C && !n || n && A > T) && (r = !0), d = this.eventResources(t), t._startTime && (l = new Date(D), l = s.timezone.apply(l, "Etc/UTC")), t.endTime && (c = new Date(A), c = s.timezone.apply(c, "Etc/UTC")), h = u({}, { ns: s.ns, resizable: k, showDelete: y, middle: a, head: r, tail: o, singleDay: 1 == this._dates.length, resources: d, inverseColor: d && d[0] ? this._shouldInverseResourceColor(d[0]) : !1 }, t, { start: l, end: c }), f = e(v(h)), this.angular("compile", function() { return { elements: f, data: [{ dataItem: h }] } }), f }, _isInTimeSlot: function(e) { var t, n = this.startTime(), i = this.endTime(), o = e._startTime || e.start, a = e._endTime || e.end; return m(i) === m(s.date.getDate(i)) && (i = s.date.getDate(i), c(i, g - 1)), e._date("end") > e._date("start") && (a = +e._date("end") + (g - 1)), a -= e._date("end"), o -= e._date("start"), i = m(i), n = m(n), n === o && o === a ? !0 : (t = o !== i, r(o, n, i, t) || r(a, n, i, t) || r(n, o, a) || r(i, o, a)) }, _isInDateSlot: function(e) { var t = this.groups[0], n = t.firstSlot().start, r = t.lastSlot().end - 1, o = s.date.toUtcTime(e.start), a = s.date.toUtcTime(e.end); return (i(o, n, r) || i(a, n, r) || i(n, o, a) || i(r, o, a)) && (!i(a, n, n) || i(a, o, o) || e.isAllDay) }, _updateAllDayHeaderHeight: function(e) { var t, n; if (this._height !== e && (this._height = e, t = this.element.find(".k-scheduler-header-all-day td"), t.length)) for (t.parent().add(this.element.find(".k-scheduler-times-all-day").parent()).height(e), n = 0; this.groups.length > n; n++) this.groups[n].refresh() }, _renderEvents: function(e, t) { var n, i, r, a, s, l, c, d, u, h, p, f, m, v, _, w = this.datesHeader.find(".k-scheduler-header-wrap > div"); for (i = 0, r = e.length; r > i; i++) if (n = e[i], this._isInDateSlot(n)) if (a = n.isAllDay || n.end.getTime() - n.start.getTime() >= g, s = a && !this._isVerticallyGrouped() ? w : this.content, a) this.options.allDaySlot && (d = this.groups[t], d._continuousEvents || (d._continuousEvents = []), c = d.slotRanges(n), c.length && (l = this._createEventElement(n, !a), this._positionAllDayEvent(l, c[0]), o(d, c[0], l, !0), l.appendTo(s))); else if (this._isInTimeSlot(n)) for (d = this.groups[t], d._continuousEvents || (d._continuousEvents = []), c = d.slotRanges(n), u = c.length, h = 0; u > h; h++) p = c[h], f = n.start, m = n.end, u > 1 && (0 === h ? m = p.end.endDate() : h == u - 1 ? f = p.start.startDate() : (f = p.start.startDate(), m = p.end.endDate())), v = n.clone({ start: f, end: m, _startTime: n._startTime, _endTime: n.endTime }), this._isInTimeSlot(v) && (_ = p.head, l = this._createEventElement(n, !a, _, p.tail), l.appendTo(s), this._positionEvent(v, l, p), o(d, p, l, !1)) }, render: function(t) { var n, r, o, a, l; for (this._headerColumnCount = 0, this._groups(), this.element.find(".k-event").remove(), t = new s.data.Query(t).sort([{ field: "start", dir: "asc" }, { field: "end", dir: "desc" }]).toArray(), n = [], this._eventsByResource(t, this.groupedResources, n), r = this, o = e.map(this._dates, function(t) { return Math.max.apply(null, e.map(n, function(n) { return e.grep(n, function(e) { return e.isMultiDay() && i(t, p(e.start), p(e.end)) }).length })) }), a = Math.max.apply(null, o), this._updateAllDayHeaderHeight((a + 1) * this._allDayHeaderHeight), l = 0; n.length > l; l++) this._renderEvents(n[l], l); this.refreshLayout(), this.trigger("activate") }, _eventsByResource: function(e, t, n) { var i, r, o, a, l = t[0]; if (l) for (i = l.dataSource.view(), r = 0; i.length > r; r++) o = this._resourceValue(l, i[r]), a = new s.data.Query(e).filter({ field: l.field, operator: d.groupEqFilter(o) }).toArray(), t.length > 1 ? this._eventsByResource(a, t.slice(1), n) : n.push(a); else n.push(e) }, _columnOffsetForResource: function(e) { return this._columnCountForLevel(e) / this._columnCountForLevel(e - 1) }, _columnCountForLevel: function(e) { var t = this.columnLevels[e]; return t ? t.length : 0 }, _rowCountForLevel: function(e) { var t = this.rowLevels[e]; return t ? t.length : 0 }, clearSelection: function() { this.content.add(this.datesHeader).find(".k-state-selected").removeAttr("id").attr("aria-selected", !1).removeClass("k-state-selected") }, _updateDirection: function(e, t, n, i, r) { var o = e.isAllDay, a = t[0].start, s = t[t.length - 1].end; n && (r ? o || a.index !== s.index || a.collectionIndex !== s.collectionIndex || (e.backward = i) : (o && a.index === s.index || !o && a.collectionIndex === s.collectionIndex) && (e.backward = i)) }, _changeViewPeriod: function(e, n, i) { var r, o, a, s; return i ? t : (r = n ? this.previousDate() : this.nextDate(), o = e.start, a = e.end, e.start = new Date(r), e.end = new Date(r), s = e.isAllDay ? g : m(a), c(e.start, m(o)), c(e.end, s), this._isVerticallyGrouped() || (e.groupIndex = n ? this.groups.length - 1 : 0), e.events = [], !0) } }); u(!0, l, { MultiDayView: x, DayView: x.extend({ options: { name: "DayView", title: "Day" }, name: "day" }), WeekView: x.extend({ options: { name: "WeekView", title: "Week", selectedDateFormat: "{0:D} - {1:D}", selectedShortDateFormat: "{0:d} - {1:d}" }, name: "week", calculateDateRange: function() { var e, t, n = this.options.date, i = s.date.dayOfWeek(n, this.calendarInfo().firstDay, -1), r = []; for (e = 0, t = 7; t > e; e++) r.push(i), i = s.date.nextDay(i); this._render(r) } }), WorkWeekView: x.extend({ options: { name: "WorkWeekView", title: "Work Week", selectedDateFormat: "{0:D} - {1:D}", selectedShortDateFormat: "{0:d} - {1:d}" }, name: "workWeek", nextDate: function() { return s.date.dayOfWeek(s.date.nextDay(this.startDate()), this.calendarInfo().firstDay, 1) }, previousDate: function() { var e = s.date.dayOfWeek(this.startDate(), this.calendarInfo().firstDay, -1); return s.date.previousDay(e) }, calculateDateRange: function() { for (var e = this.options.date, t = s.date.dayOfWeek, n = t(e, this.calendarInfo().firstDay, -1), i = t(n, this.options.workWeekStart, 1), r = t(i, this.options.workWeekEnd, 1), o = []; r >= i;) o.push(i), i = s.date.nextDay(i); this._render(o) } }) }) }(window.kendo.jQuery), function(e) { function t(e) { var t, n, i = 0; for (t = 0, n = e.length; n > t; t++) i += e[t].items.length; return i } function n(e, t) { return e.valuePrimitive && (t = o.getter(e.dataValueField)(t)), t } function i(e) { for (var t, n = 0, i = e.length, o = []; i > n; n++) t = e[n], t.groups ? (t = r(t.groups), o = o.concat(t)) : o = o.concat(r(t.items)); return o } function r(e) { for (var t = [].concat(e), n = t.shift(), i = [], r = [].push; n;) n.groups ? r.apply(t, n.groups) : n.items ? r.apply(t, n.items) : r.call(i, n), n = t.shift(); return i } var o = window.kendo, a = o.ui, s = ".kendoAgendaView", l = '<div class="k-task" title="#:title.replace(/"/g,"\'")#" data-#=kendo.ns#uid="#=uid#"># if (resources[0]) {#<span class="k-scheduler-mark" style="background-color:#=resources[0].color#"></span># } ## if (data.isException()) { #<span class="k-icon k-i-exception"></span># } else if (data.isRecurring()) {#<span class="k-icon k-i-refresh"></span># } #{0}#if (showDelete) {#<a href="\\#" class="k-link k-event-delete"><span class="k-icon k-si-close"></span></a>#}#</div>'; a.AgendaView = a.SchedulerView.extend({ init: function(t, n) { a.SchedulerView.fn.init.call(this, t, n), n = this.options, n.editable && (n.editable = e.extend({ "delete": !0 }, n.editable, { create: !1, update: !1 })), this.title = n.title, this.name = "agenda", this._eventTemplate = this._eventTmpl(n.eventTemplate, l), this._dateTemplate = o.template(n.eventDateTemplate), this._groupTemplate = o.template(n.eventGroupTemplate), this._timeTemplate = o.template(n.eventTimeTemplate), this.element.on("mouseenter" + s, ".k-scheduler-agenda .k-scheduler-content tr", "_mouseenter").on("mouseleave" + s, ".k-scheduler-agenda .k-scheduler-content tr", "_mouseleave").on("click" + s, ".k-scheduler-agenda .k-scheduler-content .k-link:has(.k-si-close)", "_remove"), this._renderLayout(n.date) }, _mouseenter: function(t) { e(t.currentTarget).addClass("k-state-hover") }, _mouseleave: function(t) { e(t.currentTarget).removeClass("k-state-hover") }, _remove: function(t) { t.preventDefault(), this.trigger("remove", { uid: e(t.currentTarget).closest(".k-task").attr(o.attr("uid")) }) }, nextDate: function() { return o.date.nextDay(this.startDate()) }, startDate: function() { return this._startDate }, endDate: function() { return this._endDate }, previousDate: function() { return o.date.previousDay(this.startDate()) }, _renderLayout: function(e) { this._startDate = e, this._endDate = o.date.addDays(e, 7), this.createLayout(this._layout()), this.table.addClass("k-scheduler-agenda") }, _layout: function() { var e, t, n, i = [{ text: this.options.messages.time, className: "k-scheduler-timecolumn" }, { text: this.options.messages.event }]; if (this._isMobilePhoneView() || i.splice(0, 0, { text: this.options.messages.date, className: "k-scheduler-datecolumn" }), e = this.groupedResources, e.length) { for (t = [], n = 0; e.length > n; n++) t.push({ text: "", className: "k-scheduler-groupcolumn" }); i = t.concat(i) } return { columns: i } }, _tasks: function(e) { var t, n, i, r, a, s, l, c = []; for (t = 0; e.length > t; t++) if (n = e[t], i = n.start, r = n.end, a = (o.date.getDate(r) - o.date.getDate(i)) / o.date.MS_PER_DAY + 1, s = n.clone(), s.startDate = o.date.getDate(i), s.startDate >= this.startDate() && c.push(s), a > 1) for (s.end = o.date.nextDay(i), s.head = !0, l = 1; a > l; l++) i = s.end, s = n.clone(), s.start = i, s.startDate = o.date.getDate(i), s.end = o.date.nextDay(i), l == a - 1 ? (s.end = new Date(s.start.getFullYear(), s.start.getMonth(), s.start.getDate(), r.getHours(), r.getMinutes(), r.getSeconds(), r.getMilliseconds()), s.tail = !0) : (s.isAllDay = !0, s.middle = !0), s.end <= this.endDate() && s.start >= this.startDate() && c.push(s); return new o.data.Query(c).sort([{ field: "start", dir: "asc" }, { field: "end", dir: "asc" }]).groupBy({ field: "startDate" }).toArray() }, _renderTaskGroups: function(e, t) { var n, i, r, a, s, l, c, d, u, h = [], p = this.options.editable, f = p && p.destroy !== !1 && !this._isMobile(), g = this._isMobilePhoneView(); for (n = 0; e.length > n; n++) for (i = e[n].value, r = e[n].items, a = o.date.isToday(i), s = 0; r.length > s; s++) { if (l = r[s], c = [], d = g ? [] : c, 0 === n && 0 === s && t.length) for (u = 0; t.length > u; u++) d.push(o.format('<td class="k-scheduler-groupcolumn{2}" rowspan="{0}">{1}</td>', t[u].rowSpan, this._groupTemplate({ value: t[u].text }), t[u].className)); 0 === s && (g ? (d.push(o.format('<td class="k-scheduler-datecolumn" colspan="2">{0}</td>', this._dateTemplate({ date: i }))), h.push('<tr role="row" aria-selected="false"' + (a ? ' class="k-today">' : ">") + d.join("") + "</tr>")) : c.push(o.format('<td class="k-scheduler-datecolumn{3}{2}" rowspan="{0}">{1}</td>', r.length, this._dateTemplate({ date: i }), n != e.length - 1 || t.length ? "" : " k-last", t.length ? "" : " k-first"))), l.format = l.head ? "{0:t}" : l.tail ? "{1:t}" : "{0:t}-{1:t}", l.resources = this.eventResources(l), c.push(o.format('<td class="k-scheduler-timecolumn"><div>{0}{1}{2}</div></td><td>{3}</td>', l.tail || l.middle ? '<span class="k-icon k-i-arrow-w"></span>' : "", this._timeTemplate(l.clone({ start: l._startTime || l.start, end: l.endTime || l.end })), l.head || l.middle ? '<span class="k-icon k-i-arrow-e"></span>' : "", this._eventTemplate(l.clone({ showDelete: f })))), h.push('<tr role="row" aria-selected="false"' + (a ? ' class="k-today">' : ">") + c.join("") + "</tr>") } return h.join("") }, render: function(e) { var t, n, r = this.content.find("table").empty(), o = []; e.length > 0 && (t = this.groupedResources, t.length ? (o = this._createGroupConfiguration(e, t, null), this._renderGroups(o, r, [])) : (o = this._tasks(e), r.append(this._renderTaskGroups(o, [])))), n = this._eventsList = i(o), this._angularItems(r, n), this.refreshLayout(), this.trigger("activate") }, _angularItems: function(e, t) { this.angular("compile", function() { var n = [], i = t.map(function(t) { return n.push({ dataItem: t }), e.find(".k-task[" + o.attr("uid") + "=" + t.uid + "]") }); return { elements: i, data: n } }) }, _renderGroups: function(e, t, n) { var i, r, o; for (i = 0, r = e.length; r > i; i++) o = n.splice(0), o.push(e[i]), e[i].groups ? this._renderGroups(e[i].groups, t, o) : t.append(this._renderTaskGroups(e[i].items, o)) }, _createGroupConfiguration: function(e, i, r) { var s, l, c, d, u, h, p, f = i[0], g = [], m = f.dataSource.view(), v = this._isMobilePhoneView(); for (s = 0; m.length > s; s++) l = n(f, m[s]), c = new o.data.Query(e).filter({ field: f.field, operator: a.SchedulerView.groupEqFilter(l) }).toArray(), c.length && (d = this._tasks(c), u = r ? "" : " k-first", s === m.length - 1 && (!r || r.className.indexOf("k-last") > -1) && (u += " k-last"), h = { text: o.getter(f.dataTextField)(m[s]), value: l, rowSpan: 0, className: u }, i.length > 1 ? (h.groups = this._createGroupConfiguration(c, i.slice(1), h), r && (r.rowSpan += h.rowSpan)) : (h.items = d, p = t(h.items), v && (p += h.items.length), h.rowSpan = p, r && (r.rowSpan += p)), g.push(h)); return g }, selectionByElement: function(t) { var n, i, r; return t = e(t), !t.hasClass("k-scheduler-datecolumn") && this._eventsList.length ? (t.is(".k-task") && (t = t.closest("td")), this._isMobile() ? (r = t.parent(), n = r.parent().children().filter(function() { return e(this).children(":not(.k-scheduler-datecolumn)").length }).index(r)) : n = t.parent().index(), i = this._eventsList[n], { index: n, start: i.start, end: i.end, isAllDay: i.isAllDay, uid: i.uid }) : void 0 }, select: function(e) { this.clearSelection(); var t = this.table.find(".k-task").eq(e.index).closest("tr").addClass("k-state-selected").attr("aria-selected", !0)[0]; this.current(t) }, move: function(e, t) { var n, i = !1, r = e.index; return t == o.keys.UP ? (r--, i = !0) : t == o.keys.DOWN && (r++, i = !0), i && (n = this._eventsList[r], n && (e.start = n.start, e.end = n.end, e.isAllDay = n.isAllDay, e.events = [n.uid], e.index = r)), i }, moveToEvent: function() { return !1 }, constrainSelection: function(e) { var t = this._eventsList[0]; t && (e.start = t.start, e.end = t.end, e.isAllDay = t.isAllDay, e.events = [t.uid], e.index = 0) }, isInRange: function() { return !0 }, destroy: function() { this.element && this.element.off(s), a.SchedulerView.fn.destroy.call(this) }, options: { title: "Agenda", name: "agenda", editable: !0, selectedDateFormat: "{0:D}-{1:D}", selectedShortDateFormat: "{0:d} - {1:d}", eventTemplate: "#:title#", eventTimeTemplate: "#if(data.isAllDay) {##=this.options.messages.allDay##} else { ##=kendo.format(format, start, end)## } #", eventDateTemplate: '<strong class="k-scheduler-agendaday">#=kendo.toString(date, "dd")#</strong><em class="k-scheduler-agendaweek">#=kendo.toString(date,"dddd")#</em><span class="k-scheduler-agendadate">#=kendo.toString(date, "y")#</span>', eventGroupTemplate: '<strong class="k-scheduler-adgendagroup">#=value#</strong>', messages: { event: "Event", date: "Date", time: "Time", allDay: "all day" } } }) }(window.kendo.jQuery), function(e) { function t(e, t) { return e.slice(t).concat(e.slice(0, t)) } function n(e, t) { for (var n = t.firstDay, i = new Date(e.getFullYear(), e.getMonth(), 0, e.getHours(), e.getMinutes(), e.getSeconds(), e.getMilliseconds()); i.getDay() != n;) r.date.setTime(i, -1 * d); return i } function i(e, t, n) { var i, r = t, o = n; return i = e, i >= r && o >= i } var r = window.kendo, o = r.ui, a = o.SchedulerView, s = ".kendoMonthView", l = e.extend, c = r.date.getDate, d = r.date.MS_PER_DAY, u = 6, h = 7, p = r.template('<span class="k-link k-nav-day">#:kendo.toString(date, "dd")#</span>'), f = '<div role="gridcell" aria-selected="false" data-#=ns#uid="#=uid#"#if (resources[0]) { #style="background-color:#=resources[0].color #; border-color: #=resources[0].color#"class="k-event#=inverseColor ? " k-event-inverse" : ""#"#} else {#class="k-event"#}#><span class="k-event-actions"># if(data.tail || data.middle) {#<span class="k-icon k-i-arrow-w"></span>#}## if(data.isException()) {#<span class="k-icon k-i-exception"></span># } else if(data.isRecurring()) {#<span class="k-icon k-i-refresh"></span>#}#</span>{0}<span class="k-event-actions">#if (showDelete) {#<a href="\\#" class="k-link k-event-delete"><span class="k-icon k-si-close"></span></a>#}## if(data.head || data.middle) {#<span class="k-icon k-i-arrow-e"></span>#}#</span># if(resizable && !data.tail && !data.middle) {#<span class="k-resize-handle k-resize-w"></span>#}## if(resizable && !data.head && !data.middle) {#<span class="k-resize-handle k-resize-e"></span>#}#</div>', g = r.template('<div title="#=title.replace(/"/g,"&\\#34;")#"><div class="k-event-template">#:title#</div></div>'), m = r.template('<div style="width:#=width#px;left:#=left#px;top:#=top#px" class="k-more-events k-button"><span>...</span></div>'); o.MonthView = a.extend({ init: function(e, t) { var n = this; a.fn.init.call(n, e, t), n.title = n.options.title, n.name = "month", n._templates(), n._editable(), n._renderLayout(n.options.date), n._groups() }, _updateDirection: function(e, t, n, i, r) { var o, a, s, l, c; n && (o = t[0].start, a = t[t.length - 1].end, s = o.index === a.index, l = o.collectionIndex === a.collectionIndex, c = r ? s && l || l : s && l, c && (e.backward = i)) }, _changeViewPeriod: function(e, t, n) { var i = n ? 7 : 1; return t && (i *= -1), e.start = r.date.addDays(e.start, i), e.end = r.date.addDays(e.end, i), (!n || n && this._isVerticallyGrouped()) && (e.groupIndex = t ? this.groups.length - 1 : 0), e.events = [], !0 }, _continuousSlot: function(e, t, n) { var i = e.backward ? 0 : t.length - 1, r = this.groups[e.groupIndex]; return r.continuousSlot(t[i].start, n) }, _changeGroupContinuously: function(e, t, n, i) { var r, o, a, s; return n || (r = e.groupIndex, o = this.groups.length - 1, a = this._isVerticallyGrouped(), s = this.groups[r], !t && a ? (t = s[i ? "lastSlot" : "firstSlot"](), r += i ? -1 : 1) : t && !a && (r = i ? o : 0), (0 > r || r > o) && (r = i ? o : 0, t = null), e.groupIndex = r), t }, _normalizeHorizontalSelection: function(e, t, n) { var i; return i = n ? t[0].start : t[t.length - 1].end }, _normalizeVerticalSelection: function(e, t) { var n; return n = e.backward ? t[0].start : t[t.length - 1].end }, _templates: function() { var e = this.options, t = l({}, r.Template, e.templateSettings); this.eventTemplate = this._eventTmpl(e.eventTemplate, f), this.dayTemplate = r.template(e.dayTemplate, t), this.groupHeaderTemplate = r.template(e.groupHeaderTemplate, t) }, dateForTitle: function() { return r.format(this.options.selectedDateFormat, this._firstDayOfMonth, this._lastDayOfMonth) }, shortDateForTitle: function() { return r.format(this.options.selectedShortDateFormat, this._firstDayOfMonth, this._lastDayOfMonth) }, nextDate: function() { return r.date.nextDay(this._lastDayOfMonth) }, previousDate: function() { return r.date.previousDay(this._firstDayOfMonth) }, startDate: function() { return this._startDate }, endDate: function() { return this._endDate }, _renderLayout: function(t) { var i = this; this._firstDayOfMonth = r.date.firstDayOfMonth(t), this._lastDayOfMonth = r.date.lastDayOfMonth(t), this._startDate = n(t, this.calendarInfo()), this.createLayout(this._layout()), this._content(), this.refreshLayout(), this.content.on("click" + s, ".k-nav-day,.k-more-events", function(t) { var n = e(t.currentTarget).offset(), r = i._slotByPosition(n.left, n.top); t.preventDefault(), i.trigger("navigate", { view: "day", date: r.startDate() }) }) }, _editable: function() { this.options.editable && !this._isMobilePhoneView() && (this._isMobile() ? this._touchEditable() : this._mouseEditable()) }, _mouseEditable: function() { var t = this; t.element.on("click" + s, ".k-scheduler-monthview .k-event a:has(.k-si-close)", function(n) { t.trigger("remove", { uid: e(this).closest(".k-event").attr(r.attr("uid")) }), n.preventDefault() }), t.options.editable.create !== !1 && t.element.on("dblclick" + s, ".k-scheduler-monthview .k-scheduler-content td", function(n) { var i, r = e(n.currentTarget).offset(), o = t._slotByPosition(r.left, r.top); o && (i = t._resourceBySlot(o), t.trigger("add", { eventInfo: l({ isAllDay: !0, start: o.startDate(), end: o.startDate() }, i) })), n.preventDefault() }), t.options.editable.update !== !1 && t.element.on("dblclick" + s, ".k-scheduler-monthview .k-event", function(n) { t.trigger("edit", { uid: e(this).closest(".k-event").attr(r.attr("uid")) }), n.preventDefault() }) }, _touchEditable: function() { var t = this, n = 0; r.support.mobileOS.android && (n = 5), t.options.editable.create !== !1 && (t._addUserEvents = new r.UserEvents(t.element, { threshold: n, filter: ".k-scheduler-monthview .k-scheduler-content td", tap: function(n) { var i, r = e(n.target).offset(), o = t._slotByPosition(r.left, r.top); o && (i = t._resourceBySlot(o), t.trigger("add", { eventInfo: l({ isAllDay: !0, start: o.startDate(), end: o.startDate() }, i) })), n.preventDefault() } })), t.options.editable.update !== !1 && (t._editUserEvents = new r.UserEvents(t.element, { threshold: n, filter: ".k-scheduler-monthview .k-event", tap: function(n) { 0 === e(n.event.target).closest("a:has(.k-si-close)").length && (t.trigger("edit", { uid: e(n.target).closest(".k-event").attr(r.attr("uid")) }), n.preventDefault()) } })) }, selectionByElement: function(t) { var n = e(t).offset(); return this._slotByPosition(n.left, n.top) }, _columnCountForLevel: function(e) { var t = this.columnLevels[e]; return t ? t.length : 0 }, _rowCountForLevel: function(e) { var t = this.rowLevels[e]; return t ? t.length : 0 }, _content: function() { var e, t = "<tbody>", n = 1, i = this.groupedResources; for (i.length && this._isVerticallyGrouped() && (n = this._rowCountForLevel(i.length - 1)), e = 0; n > e; e++) t += this._createCalendar(e); t += "</tbody>", this.content.find("table").html(t) }, _createCalendar: function(e) { var t, n, i, o, a = this.startDate(), s = h * u, l = h, c = [a], d = "", p = 1, f = this._isVerticallyGrouped(), g = this.groupedResources; for (g.length && (f || (p = this._columnCountForLevel(g.length - 1))), this._slotIndices = {}, t = 0, n = s / l; n > t; t++) { for (d += "<tr>", c.push(a), i = t * l, o = 0; p > o; o++) d += this._createRow(a, i, l, f ? e : o); a = r.date.addDays(a, l), d += "</tr>" } return this._weekStartDates = c, this._endDate = r.date.previousDay(a), d }, _createRow: function(e, t, n, i) { var o, a = this, s = a._firstDayOfMonth, l = a._lastDayOfMonth, d = a.dayTemplate, u = "", h = "", p = function() { return a._resourceBySlot({ groupIndex: i }) }; for (o = 0; n > o; o++) u = "", r.date.isToday(e) && (u += "k-today"), r.date.isInDateRange(e, s, l) || (u += " k-other-month"), h += "<td ", "" !== u && (h += 'class="' + u + '"'), h += ">", h += d({ date: e, resources: p }), h += "</td>", a._slotIndices[c(e).getTime()] = t + o, e = r.date.nextDay(e); return h }, _layout: function() { var n, i, r, o = this.calendarInfo(), a = this._isMobile() ? o.days.namesShort : o.days.names, s = t(a, o.firstDay), l = e.map(s, function(e) { return { text: e } }), c = this.groupedResources; if (c.length) if (this._isVerticallyGrouped()) { for (i = [], r = 0; 6 > r; r++) i.push({ text: "<div> </div>", className: "k-hidden k-slot-cell" }); n = this._createRowsLayout(c, i, this.groupHeaderTemplate) } else l = this._createColumnsLayout(c, l, this.groupHeaderTemplate); return { columns: l, rows: n } }, _createEventElement: function(t) { var n, i = this.options, o = i.editable, a = this._isMobile(); return t.showDelete = o && o.destroy !== !1 && !a, t.resizable = o && o.resize !== !1 && !a, t.ns = r.ns, t.resources = this.eventResources(t), t.inverseColor = t.resources && t.resources[0] ? this._shouldInverseResourceColor(t.resources[0]) : !1, n = e(this.eventTemplate(t)), this.angular("compile", function() { return { elements: n, data: [{ dataItem: t }] } }), n }, _isInDateSlot: function(e) { var t = this.groups[0], n = t.firstSlot().start, o = t.lastSlot().end - 1, a = r.date.toUtcTime(e.start), s = r.date.toUtcTime(e.end); return (i(a, n, o) || i(s, n, o) || i(n, a, s) || i(o, a, s)) && (!i(s, n, n) || i(s, a, a) || e.isAllDay) }, _slotIndex: function(e) { return this._slotIndices[c(e).getTime()] }, _positionMobileEvent: function(t, n, i) { var o, s, l, c, d, u, h, p = t.start; t.start.offsetLeft > t.end.offsetLeft && (p = t.end), o = t.start.index, s = o, l = 3, c = a.collidingEvents(t.events(), o, s), c.push({ element: n, start: o, end: s }), d = a.createRows(c), u = t.collection.at(o), h = u.container, h || (h = e(r.format('<div class="k-events-container" style="top:{0};left:{1};width:{2}"/>', p.offsetTop + p.firstChildTop + p.firstChildHeight - 3 + "px", p.offsetLeft + "px", p.offsetWidth + "px")), u.container = h, this.content[0].appendChild(h[0])), l >= d.length && (t.addEvent({ element: n, start: o, end: s, groupIndex: p.groupIndex }), i._continuousEvents.push({ element: n, uid: n.attr(r.attr("uid")), start: t.start, end: t.end }), h[0].appendChild(n[0])) }, _positionEvent: function(t, n, i) { var o, s, l, c, d, u, h, p, f, g, v, _, w, b, y, k = this.options.eventHeight, x = t.start; for (t.start.offsetLeft > t.end.offsetLeft && (x = t.end), o = t.start.index, s = t.end.index, l = x.eventCount, c = a.collidingEvents(t.events(), o, s), d = o !== s ? 5 : 4, c.push({ element: n, start: o, end: s }), u = a.createRows(c), h = 0, p = Math.min(u.length, l); p > h; h++) for (f = u[h].events, g = x.offsetTop + x.firstChildHeight + h * k + 3 * h + "px", v = 0, _ = f.length; _ > v; v++) f[v].element[0].style.top = g; if (u.length > l) for (w = o; s >= w; w++) { if (b = t.collection, y = b.at(w), y.more) return; y.more = e(m({ ns: r.ns, start: w, end: w, width: y.clientWidth - 2, left: y.offsetLeft + 2, top: y.offsetTop + y.firstChildHeight + l * k + 3 * l })), this.content[0].appendChild(y.more[0]) } else t.addEvent({ element: n, start: o, end: s, groupIndex: x.groupIndex }), n[0].style.width = t.innerWidth() - d + "px", n[0].style.left = x.offsetLeft + 2 + "px", n[0].style.height = k + "px", i._continuousEvents.push({ element: n, uid: n.attr(r.attr("uid")), start: t.start, end: t.end }), n.appendTo(this.content) }, _slotByPosition: function(e, t) { var n, i, r = this.content.offset(); for (e -= r.left, t -= r.top, t += this.content[0].scrollTop, e += this.content[0].scrollLeft, e = Math.ceil(e), t = Math.ceil(t), n = 0; this.groups.length > n; n++) if (i = this.groups[n].daySlotByPosition(e, t)) return i; return null }, _createResizeHint: function(e) { var t = e.startSlot().offsetLeft, n = e.start.offsetTop, i = e.innerWidth(), r = e.start.clientHeight - 2, o = a.fn._createResizeHint.call(this, t, n, i, r); o.appendTo(this.content), this._resizeHint = this._resizeHint.add(o) }, _updateResizeHint: function(e, t, n, i) { var o, a, s; for (this._removeResizeHint(), o = this.groups[t], a = o.ranges(n, i, !0, e.isAllDay), s = 0; a.length > s; s++) this._createResizeHint(a[s]); this._resizeHint.find(".k-label-top,.k-label-bottom").text(""), this._resizeHint.first().addClass("k-first").find(".k-label-top").text(r.toString(r.timezone.toLocalDate(n), "M/dd")), this._resizeHint.last().addClass("k-last").find(".k-label-bottom").text(r.toString(r.timezone.toLocalDate(i), "M/dd")) }, _updateMoveHint: function(e, t, n) { var i, o, a, s, l, c = r.date.toUtcTime(e.start) + n, d = c + e.duration(), u = this.groups[t], h = u.ranges(c, d, !0, e.isAllDay); for (this._removeMoveHint(), i = 0; h.length > i; i++) o = h[i], a = o.startSlot(), s = o.endSlot(), l = this._createEventElement(e.clone({ head: o.head, tail: o.tail })), l.css({ left: a.offsetLeft + 2, top: a.offsetTop + a.firstChildHeight, height: this.options.eventHeight, width: o.innerWidth() - (a.index !== s.index ? 5 : 4) }), l.addClass("k-event-drag-hint"), l.appendTo(this.content), this._moveHint = this._moveHint.add(l) }, _groups: function() { var e, t, n, i, o, a, s, l, c, d, p, f, g, m, v, _, w, b = this._groupCount(), y = h, k = u; for (this.groups = [], e = 0; b > e; e++) this._addResourceView(e); for (t = this.content[0].getElementsByTagName("tr"), n = 0; b > n; n++) for (i = 0, o = 0, this._isVerticallyGrouped() && (o = n), a = o * k; (o + 1) * k > a; a++) for (s = this.groups[n], l = s.addDaySlotCollection(r.date.addDays(this.startDate(), i), r.date.addDays(this.startDate(), i + y)), c = t[a], d = c.children, p = 0, c.setAttribute("role", "row"), this._isVerticallyGrouped() || (p = n), f = p * y; (p + 1) * y > f; f++) g = d[f], m = g.clientHeight, v = g.children.length ? g.children[0].offsetHeight + 3 : 0, _ = r.date.toUtcTime(r.date.addDays(this.startDate(), i)), i++, w = Math.floor((m - v - this.options.moreButtonHeight) / (this.options.eventHeight + 3)), g.setAttribute("role", "gridcell"), g.setAttribute("aria-selected", !1), l.addDaySlot(g, _, _ + r.date.MS_PER_DAY, w) }, render: function(e) { this.content.children(".k-event,.k-more-events,.k-events-container").remove(), this._groups(), e = new r.data.Query(e).sort([{ field: "start", dir: "asc" }, { field: "end", dir: "desc" }]).toArray(); var t = this.groupedResources; t.length ? this._renderGroups(e, t, 0, 1) : this._renderEvents(e, 0), this.refreshLayout(), this.trigger("activate") }, _renderEvents: function(e, t) { var n, i, r, o, a, s, l, c, d, u, h, p = this._isMobilePhoneView(); for (i = 0, r = e.length; r > i; i++) if (n = e[i], this._isInDateSlot(n)) for (o = this.groups[t], o._continuousEvents || (o._continuousEvents = []), a = o.slotRanges(n, !0), s = a.length, l = 0; s > l; l++) c = a[l], d = n.start, u = n.end, s > 1 && (0 === l ? u = c.end.endDate() : l == s - 1 ? d = c.start.startDate() : (d = c.start.startDate(), u = c.end.endDate())), h = n.clone({ start: d, end: u, head: c.head, tail: c.tail }), p ? this._positionMobileEvent(c, this._createEventElement(h), o) : this._positionEvent(c, this._createEventElement(h), o) }, _renderGroups: function(e, t, n, i) { var o, s, l, c, d = t[0]; if (d) for (o = d.dataSource.view(), s = 0; o.length > s; s++) l = this._resourceValue(d, o[s]), c = new r.data.Query(e).filter({ field: d.field, operator: a.groupEqFilter(l) }).toArray(), t.length > 1 ? n = this._renderGroups(c, t.slice(1), n++, i + 1) : this._renderEvents(c, n++); return n }, _groupCount: function() { var e = this.groupedResources; return e.length ? this._isVerticallyGrouped() ? this._rowCountForLevel(e.length - 1) : this._columnCountForLevel(e.length) / this._columnOffsetForResource(e.length) : 1 }, _columnOffsetForResource: function(e) { return this._columnCountForLevel(e) / this._columnCountForLevel(e - 1) }, destroy: function() { this.table && this.table.removeClass("k-scheduler-monthview"), this.content && this.content.off(s), this.element && this.element.off(s), a.fn.destroy.call(this), this._isMobile() && !this._isMobilePhoneView() && this.options.editable && (this.options.editable.create !== !1 && this._addUserEvents.destroy(), this.options.editable.update !== !1 && this._editUserEvents.destroy()) }, events: ["remove", "add", "edit", "navigate"], options: { title: "Month", name: "month", eventHeight: 25, moreButtonHeight: 13, editable: !0, selectedDateFormat: "{0:y}", selectedShortDateFormat: "{0:y}", groupHeaderTemplate: "#=text#", dayTemplate: p, eventTemplate: g } }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n; return 0 !== e && t > e ? n = t - e : (n = e % t, n && (n = t - n)), n } function i(e) { var t = e.getMonth(), n = m(e) ? et[t] : tt[t]; return n + e.getDate() } function r(e, n) { var i, r; return e = new Date(e.getFullYear(), e.getMonth(), e.getDate()), X(e, 0), i = e.getFullYear(), n !== t ? (K(e, n, -1), e.setDate(e.getDate() + 4)) : e.setDate(e.getDate() + (4 - (e.getDay() || 7))), X(e, 0), r = Math.floor((e.getTime() - new Date(i, 0, 1, -6)) / 864e5), 1 + Math.floor(r / 7) } function o(e, t) { var n = Z(e).getDay(), i = 7 - (n + 7 - (t || 7)) || 7; return 0 > i && (i += 7), Math.ceil((e.getDate() - i) / 7) + 1 } function a(e, t) { return e + (t > e ? 7 : 0) } function s(e, t, n) { var i, r, s, l, c, d = t.offset; return d ? (i = new Date(e.getFullYear(), e.getMonth() + 1, 0), r = o(i, n), s = a(t.day, n), l = s < a(new Date(e.getFullYear(), e.getMonth(), 1).getDay(), n), c = s > a(i.getDay(), n), 0 > d ? d = r + (d + 1 - (c ? 1 : 0)) : l && (d += 1), r -= c ? 1 : 0, (l ? 1 : 0) > d || d > r ? null : d) : o(e, n) } function l(e, t) { return o(new Date(e.getFullYear(), e.getMonth() + 1, 0), t) } function c(e, t, n) { return o(e, n) === s(e, t, n) } function d(e, t, n) { for (var i, r, l, c, d = a(t.getDay(), n), u = e.length, h = [], p = 0; u > p; p++) if (r = e[p], c = o(t, n), i = s(t, r, n), null !== i) if (i > c) h.push(r); else if (c === i) if (l = a(r.day, n), l > d) h.push(r); else if (d === l) return null; return h } function u(e, t, n) { for (var i, r = 0, o = e.length, a = []; o > r; r++) { if (i = e[r], n && (i = n(i)), t === i) return null; i > t && a.push(i) } return a } function h(e, t) { for (var n, i = 0, r = e.length; r > i; i++) { if (n = parseInt(e[i], 10), isNaN(n) || t.start > n || n > t.end || 0 === n && 0 > t.start) return null; e[i] = n } return e.sort(v) } function p(e) { for (var n, i, r, o = 0, a = e.length; a > o; o++) { if (n = e[o], i = n.length, r = n.substring(i - 2).toUpperCase(), r = rt[r], r === t) return null; e[o] = { offset: parseInt(n.substring(0, i - 2), 10) || 0, day: r } } return e } function f(e) { for (var t, n, i = 0, r = e.length, o = []; r > i; i++) t = e[i], "string" == typeof t ? n = t : (n = "" + it[t.day], t.offset && (n = t.offset + n)), o.push(n); return "" + o } function g(e) { var t = e.getMonth(); return 1 === t ? 1 === new Date(e.getFullYear(), 1, 29).getMonth() ? 29 : 28 : nt[t] } function m(e) { return e = e.getFullYear(), e % 4 === 0 && e % 100 !== 0 || e % 400 === 0 } function v(e, t) { return e - t } function _(e, t) { var n, i, r = 0, o = []; if (e) for (e = e.split(";"), n = e.length; n > r; r++) i = S(e[r], t), i && o.push(i); return o } function w(t, n, i) { for (var r = e.isArray(t) ? t : _(t, i), o = n.getTime() - n.getMilliseconds(), a = 0, s = r.length; s > a; a++) if (r[a].getTime() === o) return !0; return !1 } function b(e, t) { var n, i, r = 0, o = [].concat(e); for (n = o.length; n > r; r++) i = o[r], i = U.timezone.convert(i, t || i.getTimezoneOffset(), "Etc/UTC"), o[r] = U.toString(i, lt); return o.join(";") + ";" } function y(e, t) { var n = new Date(e); switch (t.freq) { case "yearly": n.setFullYear(n.getFullYear(), 0, 1); break; case "monthly": n.setFullYear(n.getFullYear(), n.getMonth(), 1); break; case "weekly": K(n, t.weekStart, -1) } return t.hours && n.setHours(0), t.minutes && n.setMinutes(0), t.seconds && n.setSeconds(0), n } function k(e, t) { var n = new Date(e); switch (t.freq) { case "yearly": n.setFullYear(n.getFullYear(), 11, 31); break; case "monthly": n.setFullYear(n.getFullYear(), n.getMonth() + 1, 0); break; case "weekly": K(n, t.weekStart, -1), n.setDate(n.getDate() + 6) } return t.hours && n.setHours(23), t.minutes && n.setMinutes(59), t.seconds && n.setSeconds(59), n } function x(e, t, n) { var i, r, o, a, s = e.slice(n._startIdx), l = s.length, c = n.positions, d = []; for (o = 0, a = c.length; a > o; o++) i = c[o], 0 > i ? i = l + i : i -= 1, r = s[i], r && r.start >= t && d.push(r); return e = e.slice(0, n._startIdx).concat(d), n._startIdx = e.length, e } function C(e, n, i, r) { var o, a, s, l, c, d, u, h, p, f, g, m, v, C, S, T, A, E, I, P, M, z, F = D(e.recurrenceRule, r), R = []; if (!F) return [e]; for (P = F.positions, M = P ? 0 : 1, f = F.start, g = F.end, (f || g) && (e = e.clone({ start: f ? new Date(f.value[0]) : t, end: g ? new Date(g.value[0]) : t })), A = e.start, T = A.getTime(), S = J(A), C = _(e.recurrenceException, r), !C[0] && F.exdates && (C = F.exdates.value, e.set("recurrenceException", b(C, r))), h = n = new Date(n), i = new Date(i), v = F.freq, I = mt[v], E = F.count, F.until && i > F.until && (i = new Date(F.until)), m = "yearly" === v || "monthly" === v || "weekly" === v, T > n || E || F.interval > 1 || m ? n = new Date(T) : (l = n.getHours(), c = n.getMinutes(), d = n.getSeconds(), F.hours || (l = A.getHours()), F.minutes || (c = A.getMinutes()), F.seconds || (d = A.getSeconds()), n.setHours(l, c, d, A.getMilliseconds())), F._startPeriod = new Date(n), P && (n = y(n, F), i = k(i, F), z = J(i) - J(n), 0 > z && (l = n.getHours(), i.setHours(l, n.getMinutes(), n.getSeconds(), n.getMilliseconds()), Y.adjustDST(i, l)), F._startPeriod = new Date(n), F._endPeriod = k(n, F), F._startIdx = 0), u = e.duration(), F._startTime = o = Y.toInvariantTime(n), I.setup && I.setup(F, A, n), I.limit(n, i, F); i >= n;) if (s = new Date(n), Q(s, u), p = n >= h || s > h, (p && !w(C, n, r) || P) && (o = Y.toUtcTime(Y.getDate(n)) + J(F._startTime), a = o + u, T !== n.getTime() || S !== J(F._startTime) ? R.push(e.toOccurrence({ start: new Date(n), end: s, _startTime: o, _endTime: a })) : (e._startTime = o, e._endTime = a, R.push(e))), P) { if (I.next(n, F), I.limit(n, i, F), n > F._endPeriod && (R = x(R, A, F), F._endPeriod = k(n, F), M = R.length), E && E === M) break } else { if (E && E === M) break; M++, I.next(n, F), I.limit(n, i, F) } return R } function S(e, t) { return e = U.parseDate(e, ot), e && t && (e = W.convert(e, e.getTimezoneOffset(), t)), e } function T(e, n) { var i, r, o, a, s, l, c, d, u = e.split(";"); for (c = 0, d = u.length; d > c; c++) if (i = u[c].split(":"), r = i[0], o = i[1], -1 !== r.indexOf("TZID") && (a = r.substring(r.indexOf("TZID")).split("=")[1]), o) for (o = o.split(","), s = 0, l = o.length; l > s; s++) o[s] = S(o[s], a || n); return o ? { value: o, tzid: a } : t } function D(n, i) { var r, o, a, s, l, c, d, u, f, g = {}, m = 0, v = !1, _ = function(e, t) { var n = e.day, i = t.day; return u > n && (n += 7), u > i && (i += 7), n - i }; if (!n) return null; for (c = n.split("\n"), c[1] || -1 === n.indexOf("DTSTART") && -1 === n.indexOf("DTEND") && -1 === n.indexOf("EXDATE") || (c = n.split(" ")), m = 0, a = c.length; a > m; m++) l = e.trim(c[m]), -1 !== l.indexOf("DTSTART") ? g.start = T(l, i) : -1 !== l.indexOf("DTEND") ? g.end = T(l, i) : -1 !== l.indexOf("EXDATE") ? g.exdates = T(l, i) : -1 !== l.indexOf("RRULE") ? s = l.substring(6) : e.trim(l) && (s = l); for (s = s.split(";"), m = 0, a = s.length; a > m; m++) switch (d = s[m], r = d.split("="), o = e.trim(r[1]).split(","), e.trim(r[0]).toUpperCase()) { case "FREQ": g.freq = o[0].toLowerCase(); break; case "UNTIL": g.until = S(o[0], i); break; case "COUNT": g.count = parseInt(o[0], 10); break; case "INTERVAL": g.interval = parseInt(o[0], 10); break; case "BYSECOND": g.seconds = h(o, { start: 0, end: 60 }), v = !0; break; case "BYMINUTE": g.minutes = h(o, { start: 0, end: 59 }), v = !0; break; case "BYHOUR": g.hours = h(o, { start: 0, end: 23 }), v = !0; break; case "BYMONTHDAY": g.monthDays = h(o, { start: -31, end: 31 }), v = !0; break; case "BYYEARDAY": g.yearDays = h(o, { start: -366, end: 366 }), v = !0; break; case "BYMONTH": g.months = h(o, { start: 1, end: 12 }), v = !0; break; case "BYDAY": g.weekDays = f = p(o), v = !0; break; case "BYWEEKNO": g.weeks = h(o, { start: -53, end: 53 }), v = !0; break; case "BYSETPOS": g.positions = h(o, { start: -366, end: 366 }); break; case "WKST": g.weekStart = u = rt[o[0]] } return g.freq === t || g.count !== t && g.until ? null : (g.interval || (g.interval = 1), u === t && (g.weekStart = u = U.culture().calendar.firstDay), f && (g.weekDays = f.sort(_)), g.positions && !v && (g.positions = null), g._hasRuleValue = v, g) } function A(e, t) { for (var n, i = e.value, r = e.tzid || "", o = i.length, a = 0; o > a; a++) n = i[a], n = W.convert(n, r || t || n.getTimezoneOffset(), "Etc/UTC"), i[a] = U.toString(n, "yyyyMMddTHHmmssZ"); return r && (r = ";TZID=" + r), r + ":" + i.join(",") + " " } function E(e, n) { var i = e.weekStart, r = "FREQ=" + e.freq.toUpperCase(), o = e.exdates || "", a = e.start || "", s = e.end || "", l = e.until; return e.interval > 1 && (r += ";INTERVAL=" + e.interval), e.count && (r += ";COUNT=" + e.count), l && (l = W.convert(l, n || l.getTimezoneOffset(), "Etc/UTC"), r += ";UNTIL=" + U.toString(l, "yyyyMMddTHHmmssZ")), e.months && (r += ";BYMONTH=" + e.months), e.weeks && (r += ";BYWEEKNO=" + e.weeks), e.yearDays && (r += ";BYYEARDAY=" + e.yearDays), e.monthDays && (r += ";BYMONTHDAY=" + e.monthDays), e.weekDays && (r += ";BYDAY=" + f(e.weekDays)), e.hours && (r += ";BYHOUR=" + e.hours), e.minutes && (r += ";BYMINUTE=" + e.minutes), e.seconds && (r += ";BYSECOND=" + e.seconds), e.positions && (r += ";BYSETPOS=" + e.positions), i !== t && (r += ";WKST=" + it[i]), a && (a = "DTSTART" + A(a, n)), s && (s = "DTEND" + A(s, n)), o && (o = "EXDATE" + A(o, n)), (a || s || o) && (r = a + s + o + "RRULE:" + r), r } var I, P, M, z, F, R, H, B, L, N, O, V, U = window.kendo, W = U.timezone, j = U.Class, G = U.ui, q = G.Widget, $ = G.DropDownList, Y = U.date, Q = Y.setTime, K = Y.setDayOfWeek, X = Y.adjustDST, Z = Y.firstDayOfMonth, J = Y.getMilliseconds, et = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366], tt = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365], nt = [31, 28, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31], it = { 0: "SU", 1: "MO", 2: "TU", 3: "WE", 4: "TH", 5: "FR", 6: "SA" }, rt = { SU: 0, MO: 1, TU: 2, WE: 3, TH: 4, FR: 5, SA: 6 }, ot = ["yyyy-MM-ddTHH:mm:ss.fffzzz", "yyyy-MM-ddTHH:mm:sszzz", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm", "yyyy-MM-ddTHH", "yyyy-MM-dd", "yyyyMMddTHHmmssfffzzz", "yyyyMMddTHHmmsszzz", "yyyyMMddTHHmmss", "yyyyMMddTHHmm", "yyyyMMddTHH", "yyyyMMdd"], at = ["months", "weeks", "yearDays", "monthDays", "weekDays", "hours", "minutes", "seconds"], st = at.length, lt = "yyyyMMddTHHmmssZ", ct = { months: function(e, t, n) { var i = n.months, r = u(i, e.getMonth() + 1), o = !1; return null !== r && (r.length ? e.setMonth(r[0] - 1, 1) : e.setFullYear(e.getFullYear() + 1, i[0] - 1, 1), o = !0), o }, monthDays: function(e, t, n) { for (var i, r, o, a = !1, s = e.getHours(), l = function(e) { return 0 > e && (e = i + e), e }; t >= e;) { if (r = e.getMonth(), i = g(e), o = u(n.monthDays, e.getDate(), l), null === o) return a; if (a = !0, o.length) { if (e.setMonth(r, o.sort(v)[0]), X(e, s), r === e.getMonth()) break } else e.setMonth(r + 1, 1) } return a }, yearDays: function(e, t, n) { for (var r, o, a = !1, s = e.getHours(), l = function(e) { return 0 > e && (e = r + e), e }; t > e;) { if (r = m(e) ? 366 : 365, o = u(n.yearDays, i(e), l), null === o) return a; if (a = !0, r = e.getFullYear(), o.length) { e.setFullYear(r, 0, o.sort(v)[0]), X(e, s); break } e.setFullYear(r + 1, 0, 1) } return a }, weeks: function(e, t, n) { for (var i, o, a, s = n.weekStart, l = !1, c = e.getHours(), d = function(e) { return 0 > e && (e = 53 + e), e }; t > e;) { if (o = u(n.weeks, r(e, s), d), null === o) return l; if (l = !0, i = e.getFullYear(), o.length) { a = 7 * o.sort(v)[0] - 1, e.setFullYear(i, 0, a), K(e, s, -1), X(e, c); break } e.setFullYear(i + 1, 0, 1) } return l }, weekDays: function(e, t, n) { var i, r, a = n.weekDays, s = n.weekStart, u = d(a, e, s), h = e.getHours(); if (null === u) return !1; if (i = u[0], i || (i = a[0], K(e, s)), r = i.day, i.offset) for (; t >= e && !c(e, i, s);) o(e, s) === l(e, s) ? (e.setMonth(e.getMonth() + 1, 1), X(e, h)) : (e.setDate(e.getDate() + 7), X(e, h), K(e, s, -1)); return e.getDay() !== r && K(e, r), !0 }, hours: function(e, t, n) { var i = n.hours, r = n._startTime, o = r.getHours(), a = u(i, o), s = !1; return null !== a && (s = !0, e.setHours(o), X(e, o), a.length ? (a = a[0], e.setHours(a)) : (a = e.getHours(), e.setDate(e.getDate() + 1), X(e, a), a = i[0], e.setHours(a), X(e, a)), n.minutes && e.setMinutes(0), r.setHours(a, e.getMinutes())), s }, minutes: function(e, t, n) { var i = n.minutes, r = e.getMinutes(), o = u(i, r), a = n._startTime.getHours(), s = !1; return null !== o && (s = !0, o.length ? o = o[0] : (a += 1, o = i[0]), n.seconds && e.setSeconds(0), e.setHours(a, o), a %= 24, X(e, a), n._startTime.setHours(a, o, e.getSeconds())), s }, seconds: function(e, t, n) { var i = n.seconds, r = n._startTime.getHours(), o = u(i, e.getSeconds()), a = e.getMinutes(), s = !1; return null !== o && (s = !0, o.length ? e.setSeconds(o[0]) : (a += 1, e.setMinutes(a, i[0]), a > 59 && (a %= 60, r = (r + 1) % 24)), n._startTime.setHours(r, a, e.getSeconds())), s } }, dt = j.extend({ next: function(e, t) { var n, i, r = t._startTime, o = r.getDate(); if (t.seconds) i = e.getSeconds() + 1, e.setSeconds(i), r.setSeconds(i), r.setDate(o); else { if (!t.minutes) return !1; n = e.getMinutes() + 1, e.setMinutes(n), r.setMinutes(n), r.setDate(o) } return !0 }, normalize: function(e) { var t = e.rule; 4 === e.idx && t.hours && (t._startTime.setHours(0), this._hour(e.date, t)) }, limit: function(e, n, i) { for (var r, o, a, s, l, c = i.interval; n >= e;) { for (a = o = t, l = e.getDate(), s = 0; st > s; s++) { if (r = at[s], i[r]) { if (a = ct[r](e, n, i), o !== t && a) break; o = a } a && this.normalize({ date: e, rule: i, day: l, idx: s }) } if ((1 === c || !this.interval(i, e)) && s === st) break } }, interval: function(e, t) { var i, o, a = new Date(e._startPeriod), s = new Date(t), l = t.getHours(), c = e.weekStart, d = e.interval, u = e.freq, h = !1, p = 0, f = 0, g = 1; return "hourly" === u ? (i = s.getTimezoneOffset() - a.getTimezoneOffset(), o = e._startTime.getHours(), s = s.getTime(), l !== o && (s += (o - l) * Y.MS_PER_HOUR), s -= a, i && (s -= i * Y.MS_PER_MINUTE), i = Math.floor(s / Y.MS_PER_HOUR), p = n(i, d), 0 !== p && (this._hour(t, e, p), h = !0)) : "daily" === u ? (Y.setTime(s, -a), i = Math.floor(s / Y.MS_PER_DAY), p = n(i, d), 0 !== p && (this._date(t, e, p), h = !0)) : "weekly" === u ? (i = 52 * (t.getFullYear() - a.getFullYear()), p = r(t, c) - r(a, c) + i, p = n(p, d), 0 !== p && (Y.setDayOfWeek(t, e.weekStart, -1), t.setDate(t.getDate() + 7 * p), X(t, l), h = !0)) : "monthly" === u ? (i = t.getFullYear() - a.getFullYear(), i = t.getMonth() - a.getMonth() + 12 * i, p = n(i, d), 0 !== p && (g = e._hasRuleValue ? 1 : t.getDate(), t.setFullYear(t.getFullYear(), t.getMonth() + p, g), X(t, l), h = !0)) : "yearly" === u && (i = t.getFullYear() - a.getFullYear(), p = n(i, d), e.months || (f = t.getMonth()), e.yearDays || e.monthDays || e.weekDays || (g = t.getDate()), 0 !== p && (t.setFullYear(t.getFullYear() + p, f, g), X(t, l), h = !0)), h }, _hour: function(e, t, n) { var i = t._startTime, r = i.getHours(); n && (r += n), e.setHours(r), r %= 24, i.setHours(r), X(e, r) }, _date: function(e, t, n) { var i = e.getHours(); e.setDate(e.getDate() + n), X(e, i) || this._hour(e, t) } }), ut = dt.extend({ next: function(e, t) { dt.fn.next(e, t) || this._hour(e, t, 1) }, normalize: function(e) { var t = e.rule; 4 === e.idx && (t._startTime.setHours(0), this._hour(e.date, t)) } }), ht = dt.extend({ next: function(e, t) { dt.fn.next(e, t) || this[t.hours ? "_hour" : "_date"](e, t, 1) } }), pt = ht.extend({ setup: function(e, t) { e.weekDays || (e.weekDays = [{ day: t.getDay(), offset: 0 }]) } }), ft = dt.extend({ next: function(e, t) { var n, i; if (!dt.fn.next(e, t)) if (t.hours) this._hour(e, t, 1); else if (t.monthDays || t.weekDays || t.yearDays || t.weeks) this._date(e, t, 1); else { for (n = e.getDate(), i = e.getHours(), e.setMonth(e.getMonth() + 1), X(e, i); e.getDate() !== n;) e.setDate(n), X(e, i); this._hour(e, t) } }, normalize: function(e) { var t = e.rule, n = e.date, i = n.getHours(); 0 !== e.idx || t.monthDays || t.weekDays ? dt.fn.normalize(e) : (n.setDate(e.day), X(n, i)) }, setup: function(e, t, n) { e.monthDays || e.weekDays || n.setDate(t.getDate()) } }), gt = ft.extend({ next: function(e, t) { var n, i = e.getHours(); if (!dt.fn.next(e, t)) if (t.hours) this._hour(e, t, 1); else if (t.monthDays || t.weekDays || t.yearDays || t.weeks) this._date(e, t, 1); else if (t.months) { for (n = e.getDate(), e.setMonth(e.getMonth() + 1), X(e, i); e.getDate() !== n;) e.setDate(n), X(e, i); this._hour(e, t) } else e.setFullYear(e.getFullYear() + 1), X(e, i), this._hour(e, t) }, setup: function() {} }), mt = { hourly: new ut, daily: new ht, weekly: new pt, monthly: new ft, yearly: new gt }, vt = "click"; U.recurrence = { rule: { parse: D, serialize: E }, expand: C, dayInYear: i, weekInYear: r, weekInMonth: o, numberOfWeeks: l, isException: w, toExceptionString: b }, I = function(e) { for (var t = U.culture().calendar.days.namesShort, n = t.length, i = "", r = 0, o = []; n > r; r++) o.push(r); for (t = t.slice(e).concat(t.slice(0, e)), o = o.slice(e).concat(o.slice(0, e)), r = 0; n > r; r++) i += '<label class="k-check"><input class="k-recur-weekday-checkbox" type="checkbox" value="' + o[r] + '" /> ' + t[r] + "</label>"; return i }, P = U.template('# if (frequency !== "never") { #<div class="k-edit-label"><label>#:messages.repeatEvery#</label></div><div class="k-edit-field"><input class="k-recur-interval"/>#:messages.interval#</div># } ## if (frequency === "weekly") { #<div class="k-edit-label"><label>#:messages.repeatOn#</label></div><div class="k-edit-field">#=weekDayCheckBoxes(firstWeekDay)#</div># } else if (frequency === "monthly") { #<div class="k-edit-label"><label>#:messages.repeatOn#</label></div><div class="k-edit-field"><ul class="k-reset"><li><label><input class="k-recur-month-radio" type="radio" name="month" value="monthday" />#:messages.day#</label><input class="k-recur-monthday" /></li><li><input class="k-recur-month-radio" type="radio" name="month" value="weekday" /><input class="k-recur-weekday-offset" /><input class="k-recur-weekday" /></li></ul></div># } else if (frequency === "yearly") { #<div class="k-edit-label"><label>#:messages.repeatOn#</label></div><div class="k-edit-field"><ul class="k-reset"><li><input class="k-recur-year-radio" type="radio" name="year" value="monthday" /><input class="k-recur-month" /><input class="k-recur-monthday" /></li><li><input class="k-recur-year-radio" type="radio" name="year" value="weekday" /><input class="k-recur-weekday-offset" /><input class="k-recur-weekday" />#:messages.of#<input class="k-recur-month" /></li></ul></div># } ## if (frequency !== "never") { #<div class="k-edit-label"><label>#:end.label#</label></div><div class="k-edit-field"><ul class="k-reset"><li><label><input class="k-recur-end-never" type="radio" name="end" value="never" />#:end.never#</label></li><li><label><input class="k-recur-end-count" type="radio" name="end" value="count" />#:end.after#</label><input class="k-recur-count" />#:end.occurrence#</li><li><label><input class="k-recur-end-until" type="radio" name="end" value="until" />#:end.on#</label><input class="k-recur-until" /></li></ul></div># } #'), M = [{ day: 0, offset: 0 }, { day: 1, offset: 0 }, { day: 2, offset: 0 }, { day: 3, offset: 0 }, { day: 4, offset: 0 }, { day: 5, offset: 0 }, { day: 6, offset: 0 }], z = [{ day: 1, offset: 0 }, { day: 2, offset: 0 }, { day: 3, offset: 0 }, { day: 4, offset: 0 }, { day: 5, offset: 0 }], F = [{ day: 0, offset: 0 }, { day: 6, offset: 0 }], R = q.extend({ init: function(e, t) { var n, i = this, r = t && t.frequencies; q.fn.init.call(i, e, t), i.wrapper = i.element, t = i.options, t.start = n = t.start || Y.today(), r && (t.frequencies = r), "string" == typeof n && (t.start = U.parseDate(n, "yyyyMMddTHHmmss")), null === t.firstWeekDay && (t.firstWeekDay = U.culture().calendar.firstDay), i._namespace = "." + t.name }, options: { value: "", start: "", timezone: "", spinners: !0, firstWeekDay: null, frequencies: ["never", "daily", "weekly", "monthly", "yearly"], mobile: !1, messages: { frequencies: { never: "Never", hourly: "Hourly", daily: "Daily", weekly: "Weekly", monthly: "Monthly", yearly: "Yearly" }, hourly: { repeatEvery: "Repeat every: ", interval: " hour(s)" }, daily: { repeatEvery: "Repeat every: ", interval: " day(s)" }, weekly: { interval: " week(s)", repeatEvery: "Repeat every: ", repeatOn: "Repeat on: " }, monthly: { repeatEvery: "Repeat every: ", repeatOn: "Repeat on: ", interval: " month(s)", day: "Day " }, yearly: { repeatEvery: "Repeat every: ", repeatOn: "Repeat on: ", interval: " year(s)", of: " of " }, end: { label: "End:", mobileLabel: "Ends", never: "Never", after: "After ", occurrence: " occurrence(s)", on: "On " }, offsetPositions: { first: "first", second: "second", third: "third", fourth: "fourth", last: "last" }, weekdays: { day: "day", weekday: "weekday", weekend: "weekend day" } } }, events: ["change"], _initInterval: function() { var e = this, t = e._value; e._container.find(".k-recur-interval").kendoNumericTextBox({ spinners: e.options.spinners, value: t.interval || 1, decimals: 0, format: "#", min: 1, change: function() { t.interval = this.value(), e._trigger() } }) }, _weekDayRule: function(e) { var t = this, n = (t._weekDay.element || t._weekDay).val(), i = +(t._weekDayOffset.element || t._weekDayOffset).val(), r = null, o = null; e || ("day" === n ? (r = M, o = i) : "weekday" === n ? (r = z, o = i) : "weekend" === n ? (r = F, o = i) : r = [{ offset: i, day: +n }]), t._value.weekDays = r, t._value.positions = o }, _weekDayView: function() { var e, t, n, i, r = this, o = r._value.weekDays, a = r._value.positions, s = r._weekDayOffset; o && (n = o.length, a && (7 === n ? (t = "day", e = a) : 5 === n ? (t = "weekday", e = a) : 2 === n && (t = "weekend", e = a)), t || (o = o[0], t = o.day, e = o.offset || ""), i = s.value ? "value" : "val", s[i](e), r._weekDay[i](t)) }, _initWeekDay: function() { var t, n = this, i = n.options.messages.weekdays, r = n.options.messages.offsetPositions, o = n._container.find(".k-recur-weekday"), a = function() { n._weekDayRule(), n._trigger() }; o[0] && (n._weekDayOffset = new $(n._container.find(".k-recur-weekday-offset"), { change: a, dataTextField: "text", dataValueField: "value", dataSource: [{ text: r.first, value: "1" }, { text: r.second, value: "2" }, { text: r.third, value: "3" }, { text: r.fourth, value: "4" }, { text: r.last, value: "-1" }] }), t = [{ text: i.day, value: "day" }, { text: i.weekday, value: "weekday" }, { text: i.weekend, value: "weekend" }], n._weekDay = new $(o, { value: n.options.start.getDay(), change: a, dataTextField: "text", dataValueField: "value", dataSource: t.concat(e.map(U.culture().calendar.days.names, function(e, t) { return { text: e, value: t } })) }), n._weekDayView()) }, _initWeekDays: function() { var t, n, i, r, o, a = this, s = a._value, l = a._container.find(".k-recur-weekday-checkbox"); if (l[0] && (l.on(vt + a._namespace, function() { s.weekDays = e.map(l.filter(":checked"), function(e) { return { day: +e.value, offset: 0 } }), a.options.mobile || a._trigger() }), s.weekDays)) for (i = 0, r = l.length, o = s.weekDays.length; r > i; i++) for (n = l[i], t = 0; o > t; t++) n.value == s.weekDays[t].day && (n.checked = !0) }, _initMonthDay: function() { var e = this, t = e._value, n = e._container.find(".k-recur-monthday"); n[0] && (e._monthDay = new U.ui.NumericTextBox(n, { spinners: e.options.spinners, min: 1, max: 31, decimals: 0, format: "#", value: t.monthDays ? t.monthDays[0] : e.options.start.getDate(), change: function() { var n = this.value(); t.monthDays = n ? [n] : n, e._trigger() } })) }, _initCount: function() { var e = this, t = e._container.find(".k-recur-count"), n = e._value; e._count = t.kendoNumericTextBox({ spinners: e.options.spinners, value: n.count || 1, decimals: 0, format: "#", min: 1, change: function() { n.count = this.value(), e._trigger() } }).data("kendoNumericTextBox") }, _initUntil: function() { var e = this, t = e._container.find(".k-recur-until"), n = e.options.start, i = e._value, r = i.until; e._until = t.kendoDatePicker({ min: r && n > r ? r : n, value: r || new Date(n.getFullYear(), n.getMonth(), n.getDate(), 23, 59, 59), change: function() { var t = this.value(); i.until = new Date(t.getFullYear(), t.getMonth(), t.getDate(), 23, 59, 59), e._trigger() } }).data("kendoDatePicker") }, _trigger: function() { this.options.mobile || this.trigger("change") } }), H = R.extend({ init: function(e, t) { var n = this; R.fn.init.call(n, e, t), n._initFrequency(), n._initContainer(), n.value(n.options.value) }, options: { name: "RecurrenceEditor" }, events: ["change"], destroy: function() { var e = this; e._frequency.destroy(), e._container.find("input[type=radio],input[type=checkbox]").off(vt + e._namespace), U.destroy(e._container), R.fn.destroy.call(e) }, value: function(e) { var n, i = this, r = i.options.timezone; return e === t ? i._value.freq ? E(i._value, r) : "" : (i._value = D(e, r) || {}, n = i._value.freq, n ? i._frequency.value(n) : i._frequency.select(0), i._initView(i._frequency.value()), t) }, _initContainer: function() { var t = this.element, n = e('<div class="k-recur-view" />'), i = t.parent(".k-edit-field"); i[0] ? n.insertAfter(i) : t.append(n), this._container = n }, _initFrequency: function() { var t, n = this, i = n.options, r = i.frequencies, o = i.messages.frequencies, a = e("<input />"); r = e.map(r, function(e) { return { text: o[e], value: e } }), t = r[0], t && "never" === t.value && (t.value = ""), n.element.append(a), n._frequency = new $(a, { dataTextField: "text", dataValueField: "value", dataSource: r, change: function() { n._value = {}, n._initView(n._frequency.value()), n.trigger("change") } }) }, _initView: function(e) { var n = this, i = n._value, r = n.options, o = { frequency: e || "never", weekDayCheckBoxes: I, firstWeekDay: r.firstWeekDay, messages: r.messages[e], end: r.messages.end }; return U.destroy(n._container), n._container.html(P(o)), e ? (i.freq = e, "weekly" !== e || i.weekDays || (i.weekDays = [{ day: r.start.getDay(), offset: 0 }]), n._initInterval(), n._initWeekDays(), n._initMonthDay(), n._initWeekDay(), n._initMonth(), n._initCount(), n._initUntil(), n._period(), n._end(), t) : (n._value = {}, t) }, _initMonth: function() { var t, n = this, i = n._value, r = i.months || [n.options.start.getMonth() + 1], o = n._container.find(".k-recur-month"); o[0] && (t = { change: function() { i.months = [+this.value()], n.trigger("change") }, dataTextField: "text", dataValueField: "value", dataSource: e.map(U.culture().calendar.months.names, function(e, t) { return { text: e, value: t + 1 } }) }, n._month1 = new $(o[0], t), n._month2 = new $(o[1], t), r && (r = r[0], n._month1.value(r), n._month2.value(r))) }, _end: function() { var e, t = this, n = t._value, i = t._container, r = t._namespace, o = function(e) { t._toggleEnd(e.currentTarget.value), t.trigger("change") }; t._buttonNever = i.find(".k-recur-end-never").on(vt + r, o), t._buttonCount = i.find(".k-recur-end-count").on(vt + r, o), t._buttonUntil = i.find(".k-recur-end-until").on(vt + r, o), n.count ? e = "count" : n.until && (e = "until"), t._toggleEnd(e) }, _period: function() { var e = this, t = e._value, n = "monthly" === t.freq, i = n ? e._toggleMonthDay : e._toggleYear, r = ".k-recur-" + (n ? "month" : "year") + "-radio", o = e._container.find(r); (n || "yearly" === t.freq) && (o.on(vt + e._namespace, function(t) { i.call(e, t.currentTarget.value), e.trigger("change") }), e._buttonMonthDay = o.eq(0), e._buttonWeekDay = o.eq(1), i.call(e, t.weekDays ? "weekday" : "monthday")) }, _toggleEnd: function(e) { var t, n, i, r, o = this; "count" === e ? (o._buttonCount.prop("checked", !0), i = !0, r = !1, t = o._count.value(), n = null) : "until" === e ? (o._buttonUntil.prop("checked", !0), i = !1, r = !0, t = null, n = o._until.value()) : (o._buttonNever.prop("checked", !0), i = r = !1, t = n = null), o._count.enable(i), o._until.enable(r), o._value.count = t, o._value.until = n }, _toggleMonthDay: function(e) { var t, n = this, i = !1, r = !0, o = !1; "monthday" === e ? (n._buttonMonthDay.prop("checked", !0), t = [n._monthDay.value()], i = !0, r = !1, o = !0) : (n._buttonWeekDay.prop("checked", !0), t = null), n._weekDay.enable(r), n._weekDayOffset.enable(r), n._monthDay.enable(i), n._value.monthDays = t, n._weekDayRule(o) }, _toggleYear: function(e) { var t, n = this, i = !1, r = !0; "monthday" === e ? (i = !0, r = !1, t = n._month1.value()) : t = n._month2.value(), n._month1.enable(i), n._month2.enable(r), n._value.months = [t], n._toggleMonthDay(e) } }), G.plugin(H), B = U.template('<div class="k-edit-label"><label>#:headerTitle#</label></div><div class="k-edit-field k-recur-pattern k-scheduler-toolbar"></div><div class="k-recur-view"></div>'), L = U.template('# if (frequency !== "never") { #<div class="k-edit-label"><label>#:messages.repeatEvery#</label></div><div class="k-edit-field"><input class="k-recur-interval" pattern="\\\\d*"/>#:messages.interval#</div># } ## if (frequency === "weekly") { #<div class="k-edit-label"><label>#:messages.repeatOn#</label></div><div class="k-edit-field">#=weekDayCheckBoxes(firstWeekDay)#</div># } else if (frequency === "monthly") { #<div class="k-edit-label"><label>#:messages.repeatBy#</label></div><div class="k-edit-field k-scheduler-toolbar k-repeat-rule"></div><div class="k-monthday-view" style="display:none"><div class="k-edit-label"><label>#:messages.day#</label></div><div class="k-edit-field"><input class="k-recur-monthday" pattern="\\\\d*"/></div></div><div class="k-weekday-view" style="display:none"><div class="k-edit-label"><label>#:messages.every#</label></div><div class="k-edit-field"><select class="k-recur-weekday-offset"></select></div><div class="k-edit-label"><label>#:messages.day#</label></div><div class="k-edit-field"><select class="k-recur-weekday"></select></div></div># } else if (frequency === "yearly") { #<div class="k-edit-label"><label>#:messages.repeatBy#</label></div><div class="k-edit-field k-scheduler-toolbar k-repeat-rule"></div><div class="k-monthday-view" style="display:none"><div class="k-edit-label"><label>#:messages.day#</label></div><div class="k-edit-field"><input class="k-recur-monthday" pattern="\\\\d*"/></div></div><div class="k-weekday-view" style="display:none"><div class="k-edit-label"><label>#:messages.every#</label></div><div class="k-edit-field"><select class="k-recur-weekday-offset"></select></div><div class="k-edit-label"><label>#:messages.day#</label></div><div class="k-edit-field"><select class="k-recur-weekday"></select></div></div><div class="k-edit-label"><label>#:messages.month#</label></div><div class="k-edit-field"><select class="k-recur-month"></select></div># } #'), N = U.template('# if (endPattern === "count") { #<div class="k-edit-label"><label>#:messages.after#</label></div><div class="k-edit-field"><input class="k-recur-count" pattern="\\\\d*" /></div># } else if (endPattern === "until") { #<div class="k-edit-label"><label>#:messages.on#</label></div><div class="k-edit-field"><input type="date" class="k-recur-until" /></div># } #'), O = U.template('<ul class="k-reset k-header k-scheduler-navigation">#for (var i = 0, length = dataSource.length; i < length; i++) {#<li class="k-state-default #= value === dataSource[i].value ? "k-state-selected" : "" #"><a role="button" href="\\#" class="k-link" data-#=ns#value="#=dataSource[i].value#">#:dataSource[i].text#</a></li>#}#</ul>'), V = R.extend({ init: function(e, t) { var n = this; R.fn.init.call(n, e, t), t = n.options, n._optionTemplate = U.template('<option value="#:value#">#:text#</option>'), n.value(t.value), n._pane = t.pane, n._initRepeatButton(), n._initRepeatEnd(), n._defaultValue = n._value }, options: { name: "MobileRecurrenceEditor", animations: { left: "slide", right: "slide:right" }, mobile: !0, messages: { cancel: "Cancel", update: "Save", endTitle: "Repeat ends", repeatTitle: "Repeat pattern", headerTitle: "Repeat event", end: { patterns: { never: "Never", after: "After...", on: "On..." }, never: "Never", after: "End repeat after", on: "End repeat on" }, daily: { interval: "" }, hourly: { interval: "" }, weekly: { interval: "" }, monthly: { interval: "", repeatBy: "Repeat by: ", dayOfMonth: "Day of the month", dayOfWeek: "Day of the week", repeatEvery: "Repeat every", every: "Every", day: "Day " }, yearly: { interval: "", repeatBy: "Repeat by: ", dayOfMonth: "Day of the month", dayOfWeek: "Day of the week", repeatEvery: "Repeat every: ", every: "Every", month: "Month", day: "Day" } } }, events: ["change"], value: function(e) { var n = this, i = n.options.timezone; return e === t ? n._value.freq ? E(n._value, i) : "" : (n._value = D(e, i) || {}, t) }, destroy: function() { this._destroyView(), U.destroy(this._endFields), this._repeatButton.off(vt + this._namespace), R.fn.destroy.call(this) }, _initRepeatButton: function() { var t = this, n = t.options.messages.frequencies[this._value.freq || "never"]; t._repeatButton = e('<a href="#" class="k-button k-scheduler-recur">' + n + "</a>").on(vt + t._namespace, function(e) { e.preventDefault(), t._createView("repeat"), t._pane.navigate("recurrence", t.options.animations.left) }), t.element.append(t._repeatButton) }, _initRepeatEnd: function() { var t = this, n = e('<div class="k-edit-label"><label>' + t.options.messages.end.mobileLabel + "</label></div>").insertAfter(t.element.parent(".k-edit-field")), i = e('<div class="k-edit-field"><a href="#" class="k-button k-scheduler-recur-end"></a></div>').on(vt + t._namespace, function(e) { e.preventDefault(), t._value.freq && (t._createView("end"), t._pane.navigate("recurrence", t.options.animations.left)) }).insertAfter(n); t._endFields = n.add(i).toggleClass("k-state-disabled", !t._value.freq), t._endButton = i.find(".k-scheduler-recur-end").text(t._endText()) }, _endText: function() { var e = this._value, t = this.options.messages.end, n = t.never; return e.count ? n = U.format("{0} {1}", t.after, e.count) : e.until && (n = U.format("{0} {1:d}", t.on, e.until)), n }, _initFrequency: function() { var t = this, n = t.options.messages.frequencies, i = O({ dataSource: e.map(this.options.frequencies, function(e) { return { text: n[e], value: "never" !== e ? e : "" } }), value: t._value.freq || "", ns: U.ns }); t._view.element.find(".k-recur-pattern").append(i).on(vt + t._namespace, ".k-scheduler-navigation li", function(n) { var i = e(this); n.preventDefault(), i.addClass("k-state-selected").siblings().removeClass("k-state-selected"), t._value = { freq: i.children("a").attr(U.attr("value")) }, t._initRepeatView() }) }, _initEndNavigation: function() { var t, n = this, i = n.options.messages.end.patterns, r = n._value, o = ""; r.count ? o = "count" : r.until && (o = "until"), t = O({ dataSource: [{ text: i.never, value: "" }, { text: i.after, value: "count" }, { text: i.on, value: "until" }], value: o, ns: U.ns }), n._view.element.find(".k-recur-pattern").append(t).on(vt + n._namespace, ".k-scheduler-navigation li", function(t) { var i = e(this), o = null, a = null; t.preventDefault(), i.addClass("k-state-selected").siblings().removeClass("k-state-selected"), n._initEndView(i.children("a").attr(U.attr("value"))), n._count ? (o = n._count.value(), a = null) : n._until && (o = null, a = n._until.val ? U.parseDate(n._until.val(), "yyyy-MM-dd") : n._until.value()), r.count = o, r.until = a }) }, _createView: function(t) { var n = this, i = n.options, r = i.messages, o = r["repeat" === t ? "repeatTitle" : "endTitle"], a = '<div data-role="view" class="k-popup-edit-form k-scheduler-edit-form k-mobile-list" id="recurrence"><div data-role="header" class="k-header"><a href="#" class="k-button k-scheduler-cancel">' + r.cancel + "</a>" + r.headerTitle + '<a href="#" class="k-button k-scheduler-update">' + r.update + "</a></div>", s = n._pane.view().id; n._view = n._pane.append(a + B({ headerTitle: o })), n._view.element.on(vt + n._namespace, "a.k-scheduler-cancel, a.k-scheduler-update", function(t) { t.preventDefault(), t.stopPropagation(), e(this).hasClass("k-scheduler-update") ? (n.trigger("change"), n._defaultValue = e.extend({}, n._value)) : n._value = n._defaultValue; var i = n._value.freq; n._endButton.text(n._endText()), n._endFields.toggleClass("k-state-disabled", !i), n._repeatButton.text(r.frequencies[i || "never"]), n._pane.one("viewShow", function() { n._destroyView() }), n._pane.navigate(s, n.options.animations.right) }), n._container = n._view.element.find(".k-recur-view"), "repeat" === t ? (n._initFrequency(), n._initRepeatView()) : (n._initEndNavigation(), n._initEndView()) }, _destroyView: function() { this._view && (this._view.destroy(), this._view.element.remove()), this._view = null }, _initRepeatView: function() { var e = this, n = e._value.freq || "never", i = { frequency: n, weekDayCheckBoxes: I, firstWeekDay: e.options.firstWeekDay, messages: e.options.messages[n] }, r = L(i), o = e._container, a = e._value; return U.destroy(o), o.html(r), r ? ("weekly" !== n || a.weekDays || (a.weekDays = [{ day: e.options.start.getDay(), offset: 0 }]), e._initInterval(), e._initMonthDay(), e._initWeekDays(), e._initWeekDay(), e._initMonth(), e._period(), t) : (e._value = {}, t) }, _initEndView: function(e) { var n, i = this, r = i._value; e === t && (r.count ? e = "count" : r.until && (e = "until")), n = { endPattern: e, messages: i.options.messages.end }, U.destroy(i._container), i._container.html(N(n)), i._initCount(), i._initUntil() }, _initWeekDay: function() { var t, n = this, i = n.options.messages.weekdays, r = n.options.messages.offsetPositions, o = n._container.find(".k-recur-weekday"), a = function() { n._weekDayRule(), n.trigger("change") }; o[0] && (n._weekDayOffset = n._container.find(".k-recur-weekday-offset").html(n._options([{ text: r.first, value: "1" }, { text: r.second, value: "2" }, { text: r.third, value: "3" }, { text: r.fourth, value: "4" }, { text: r.last, value: "-1" }])).change(a), t = [{ text: i.day, value: "day" }, { text: i.weekday, value: "weekday" }, { text: i.weekend, value: "weekend" }], t = t.concat(e.map(U.culture().calendar.days.names, function(e, t) { return { text: e, value: t } })), n._weekDay = o.html(n._options(t)).change(a).val(n.options.start.getDay()), n._weekDayView()) }, _initMonth: function() { var t, n = this, i = n._value, r = n.options.start, o = i.months || [r.getMonth() + 1], a = n._container.find(".k-recur-month"), s = U.culture().calendar.months.names; a[0] && (t = e.map(s, function(e, t) { return { text: e, value: t + 1 } }), a.html(n._options(t)).change(function() { i.months = [+this.value] }), n._monthSelect = a, o && a.val(o[0])) }, _period: function() { var t, n, i, r = this, o = r._value, a = r._container, s = r.options.messages[o.freq], l = a.find(".k-repeat-rule"), c = a.find(".k-weekday-view"), d = a.find(".k-monthday-view"); l[0] && (t = o.weekDays ? "weekday" : "monthday", n = O({ value: t, dataSource: [{ text: s.dayOfMonth, value: "monthday" }, { text: s.dayOfWeek, value: "weekday" }], ns: U.ns }), i = function(e) { var t = r._weekDay.val(), n = r._weekDayOffset.val(), i = r._monthDay.value(), a = r._monthSelect ? r._monthSelect.val() : null; "monthday" === e ? (o.weekDays = null, o.monthDays = i ? [i] : i, o.months = a ? [+a] : a, c.hide(), d.show()) : (o.monthDays = null, o.months = a ? [+a] : a, o.weekDays = [{ offset: +n, day: +t }], c.show(), d.hide()) }, l.append(n).on(vt + r._namespace, ".k-scheduler-navigation li", function(t) { var n, r = e(this).addClass("k-state-selected"); t.preventDefault(), r.siblings().removeClass("k-state-selected"), n = r.children("a").attr(U.attr("value")), i(n) }), i(t)) }, _initUntil: function() { var e = this, t = e._container.find(".k-recur-until"), n = e.options.start, i = e._value, r = i.until, o = r && n > r ? r : n; e._until = U.support.input.date ? t.attr("min", U.toString(o, "yyyy-MM-dd")).val(U.toString(r || n, "yyyy-MM-dd")).on("change", function() { i.until = U.parseDate(this.value, "yyyy-MM-dd") }) : t.kendoDatePicker({ min: o, value: r || n, change: function() { i.until = this.value() } }).data("kendoDatePicker") }, _options: function(e, t) { var n = 0, i = "", r = e.length, o = this._optionTemplate; for (t && (i += o({ value: "", text: t })); r > n; n++) i += o(e[n]); return i } }), G.plugin(V) }(window.kendo.jQuery), function(e, t) { function n(e) { var t = new Date(1980, 1, 1, 0, 0, 0); return c(t, f(e)), t } function i(e) { var t = [], n = e.workWeekStart; for (t.push(n); e.workWeekEnd != n;) n > 6 ? n -= 7 : n++, t.push(n); return t } function r(e) { var t, n = 0; if (e.columns) { for (t = 0; e.columns.length > t; t++) n += r(e.columns[t]); return e.colspan = n, n } return e.colspan = 1, 1 } function o(e, t, n) { var i, r, o, s; for (i = e.length - 1; i >= 0; i--) r = e[i].rectLeft, s = e[i].rectRight, o = t >= r && s >= t, (o || r >= t && n >= s || r >= t && n >= r) && (t > r && (t = r), s > n && (n = s)); return a(e, t, n) } function a(e, t, n) { var i, r, o = []; for (i = 0; e.length > i; i++) r = { rectLeft: e[i].rectLeft, rectRight: e[i].rectRight }, (t > r.rectLeft && r.rectRight > t || r.rectLeft >= t && n >= r.rectRight) && o.push(e[i]); return o } var s = window.kendo, l = s.ui, c = s.date.setTime, d = l.SchedulerView, u = e.extend, h = e.proxy, p = s.date.getDate, f = s.date.getMilliseconds, g = s.date.MS_PER_DAY, m = s.date.MS_PER_MINUTE, v = ".kendoTimelineView", _ = s.template('<div><div class="k-event-template k-event-time">#:kendo.format("{0:t} - {1:t}", start, end)#</div><div class="k-event-template">${title}</div></div>'), w = s.template("<span class='k-link k-nav-day'>#=kendo.format('{0:m}', date)#</span>"), b = '<div role="gridcell" aria-selected="false" data-#=ns#uid="#=uid#"#if (resources[0]) { #style="background-color:#=resources[0].color#; border-color: #=resources[0].color#"class="k-event#=inverseColor ? " k-event-inverse" : ""#" #} else {#class="k-event"#}#><span class="k-event-actions"># if(data.tail) {#<span class="k-icon k-i-arrow-w"></span>#}## if(data.isException()) {#<span class="k-icon k-i-exception"></span># } else if(data.isRecurring()) {#<span class="k-icon k-i-refresh"></span># } #</span>{0}<span class="k-event-actions">#if (showDelete) {#<a href="\\#" class="k-link k-event-delete"><span class="k-icon k-si-close"></span></a>#}## if(data.head) {#<span class="k-icon k-i-arrow-e"></span>#}#</span>#if(resizable && !data.tail){#<span class="k-resize-handle k-resize-w"></span>#}##if(resizable && !data.head){#<span class="k-resize-handle k-resize-e"></span>#}#</div>', y = d.extend({ init: function(e, t) { var n = this; d.fn.init.call(n, e, t), n.title = n.options.title || n.options.name, n._workDays = i(n.options), n._templates(), n._editable(), n.calculateDateRange(), n._groups(), n._currentTime() }, name: "timeline", _currentTimeMarkerUpdater: function() { var t, n, i, r, o, a, l, c, d, u, h, p, f = new Date, g = this.options; if (this.datesHeader.find(".k-current-time").remove(), this._isInDateSlot({ start: f, end: f })) for (g.currentTimeMarker.useLocalTimezone === !1 && (t = g.dataSource.options.schema.timezone, g.dataSource && t && (n = s.timezone.offset(f, t), f = s.timezone.convert(f, f.getTimezoneOffset(), n))), i = g.group && "vertical" != g.group.orientation ? this.groups.length : 1, r = 0; i > r; r++) { if (o = this.groups[r], a = s.date.toUtcTime(f), l = o.timeSlotRanges(a, a + 1), 0 === l.length) return; c = l[0].collection, d = c.slotByStartDate(f), d && (u = e("<div class='k-current-time'></div>"), h = this.datesHeader, p = Math.round(l[0].innerRect(f, new Date(f.getTime() + 1), !1).left), u.appendTo(h.find(".k-scheduler-header-wrap")).css({ left: this._adjustLeftPosition(p), width: "1px", bottom: "1px", top: 0 })) } }, _adjustLeftPosition: function(e) { return this._isRtl && (e -= this.content[0].scrollWidth - this.content[0].offsetWidth), e }, _currentTime: function() { var e, n = this, i = n.options.currentTimeMarker; i !== !1 && i.updateInterval !== t && (e = i.updateInterval, n._currentTimeMarkerUpdater(), n._currentTimeUpdateTimer = setInterval(h(this._currentTimeMarkerUpdater, n), e)) }, _editable: function() { this.options.editable && (this._isMobile() ? this._touchEditable() : this._mouseEditable()) }, _mouseEditable: function() { var t = this; t.element.on("click" + v, ".k-event a:has(.k-si-close)", function(n) { t.trigger("remove", { uid: e(this).closest(".k-event").attr(s.attr("uid")) }), n.preventDefault() }), t.options.editable.create !== !1 && t.element.on("dblclick" + v, ".k-scheduler-content td", function(e) { var n, i = t._slotByPosition(e.pageX, e.pageY); i && (n = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({ start: i.startDate(), end: i.endDate() }, n) })), e.preventDefault() }), t.options.editable.update !== !1 && t.element.on("dblclick" + v, ".k-event", function(n) { t.trigger("edit", { uid: e(this).closest(".k-event").attr(s.attr("uid")) }), n.preventDefault() }) }, _touchEditable: function() { var t = this, n = 0; s.support.mobileOS.android && (n = 5), t.options.editable.create !== !1 && (t._addUserEvents = new s.UserEvents(t.element, { threshold: n, filter: ".k-scheduler-content td", tap: function(e) { var n, i = t._slotByPosition(e.x.location, e.y.location); i && (n = t._resourceBySlot(i), t.trigger("add", { eventInfo: u({ start: i.startDate(), end: i.endDate() }, n) })), e.preventDefault() } })), t.options.editable.update !== !1 && (t._editUserEvents = new s.UserEvents(t.element, { threshold: n, filter: ".k-event", tap: function(n) { var i = e(n.target).closest(".k-event"); i.hasClass("k-event-active") || t.trigger("edit", { uid: i.attr(s.attr("uid")) }), n.preventDefault() } })) }, _slotByPosition: function(e, t) { var n, i, r, o, a = this.content, l = a.offset(); for (e -= l.left, t -= l.top, this._isRtl ? (o = s.support.browser, o.mozilla ? (e += a[0].scrollWidth - a[0].offsetWidth, e += a[0].scrollLeft) : o.msie ? (e -= a.scrollLeft(), e += a[0].scrollWidth - a[0].offsetWidth) : o.webkit && (e += a[0].scrollLeft)) : e += a[0].scrollLeft, t += a[0].scrollTop, e = Math.ceil(e), t = Math.ceil(t), r = 0; this.groups.length > r; r++) if (i = this.groups[r], n = i.timeSlotByPosition(e, t)) return n; return null }, options: { name: "TimelineView", title: "Timeline", selectedDateFormat: "{0:D}", selectedShortDateFormat: "{0:d}", date: s.date.today(), startTime: s.date.today(), endTime: s.date.today(), showWorkHours: !1, minorTickCount: 2, editable: !0, workDayStart: new Date(1980, 1, 1, 8, 0, 0), workDayEnd: new Date(1980, 1, 1, 17, 0, 0), workWeekStart: 1, workWeekEnd: 5, majorTick: 60, eventHeight: 25, eventMinWidth: 0, columnWidth: 100, groupHeaderTemplate: "#=text#", majorTimeHeaderTemplate: "#=kendo.toString(date, 't')#", slotTemplate: " ", eventTemplate: _, dateHeaderTemplate: w, footer: { command: "workDay" }, currentTimeMarker: { updateInterval: 1e4, useLocalTimezone: !0 }, messages: { defaultRowText: "All events", showFullDay: "Show full day", showWorkDay: "Show business hours" } }, events: ["remove", "add", "edit"], _templates: function() { var e = this.options, t = u({}, s.Template, e.templateSettings); this.eventTemplate = this._eventTmpl(e.eventTemplate, b), this.majorTimeHeaderTemplate = s.template(e.majorTimeHeaderTemplate, t), this.dateHeaderTemplate = s.template(e.dateHeaderTemplate, t), this.slotTemplate = s.template(e.slotTemplate, t), this.groupHeaderTemplate = s.template(e.groupHeaderTemplate, t) }, _render: function(t) { var n = this; t = t || [], n._dates = t, n._startDate = t[0], n._endDate = t[t.length - 1 || 0], n._calculateSlotRanges(), n.createLayout(n._layout(t)), n._content(t), n._footer(), n._setContentWidth(), n.refreshLayout(), n.datesHeader.on("click" + v, ".k-nav-day", function(t) { var i = e(t.currentTarget).closest("th"), r = n._slotByPosition(i.offset().left, n.content.offset().top); n.trigger("navigate", { view: "timeline", date: r.startDate() }) }), n.timesHeader.find("table tr:last").hide(), n.datesHeader.find("table tr:last").hide() }, _setContentWidth: function() { var e = this.content, t = e.width(), n = this.content.find("table"), i = n.find("tr:first").children().length, r = 100, o = i * this.options.columnWidth; o > t && (r = Math.ceil(o / t * 100)), n.add(this.datesHeader.find("table")).css("width", r + "%") }, _calculateSlotRanges: function() { var e, t, n, i, r = this._dates, o = this.startTime(), a = this.endTime(); for (f(a) === f(s.date.getDate(a)) && (a = s.date.getDate(a), c(a, g - 1)), a = f(a), o = f(o), e = [], t = 0; r.length > t; t++) n = p(r[t]), c(n, o), i = p(r[t]), c(i, a), e.push({ start: s.date.toUtcTime(n), end: s.date.toUtcTime(i) }); this._slotRanges = e }, _forTimeRange: function(e, t, i, r) { var o, a, s, l, d, u, h, p, v, _, w, b, y, k, x, C, S, T; for (e = n(e), t = n(t), o = this, a = f(e), s = f(t), l = o.options.minorTickCount, d = o.options.majorTick * m, u = d / l || 1, h = new Date(+e), p = h.getDate(), _ = 0, b = "", w = g / u, a != s && (a > s && (s += g), w = (s - a) / u), w = Math.round(w); w > _; _++) y = _ % (d / u), k = 0 === y, x = l - 1 > y, C = y === l - 1, S = l, w % l !== 0 && (T = l > w - (_ + 1), k && T && (S = w % l)), b += i(h, k, x, C, S), c(h, u, !1); return s && (v = f(h), p < h.getDate() && (v += g), v > s && (h = new Date(+t))), r && (b += r(h)), b }, _layout: function(e) { var t, n, i, o = [], a = [], s = this, l = [{ text: s.options.messages.defaultRowText }], c = []; for (t = 0; s.options.minorTickCount > t; t++) c.push({ text: "", className: "" }); for (this._forTimeRange(s.startTime(), s.endTime(), function(e, t, n, i, a) { var l, d = s.majorTimeHeaderTemplate; t && (l = { text: d({ date: e }), className: i ? "k-slot-cell" : "", columns: c.slice(0, a) }, r(l), o.push(l)) }), n = 0; e.length > n; n++) a.push({ text: s.dateHeaderTemplate({ date: e[n] }), className: "k-slot-cell", columns: o.slice(0) }); return i = this.groupedResources, i.length && ("vertical" === this._groupOrientation() ? l = s._createRowsLayout(i, null, this.groupHeaderTemplate) : a = s._createColumnsLayout(i, a, this.groupHeaderTemplate)), { columns: a, rows: l } }, _footer: function() { var t, n, i, r = this.options; r.footer !== !1 && (t = '<div class="k-header k-scheduler-footer">', n = r.footer.command, n && "workDay" === n ? (t += '<ul class="k-reset k-header">', t += '<li class="k-state-default k-scheduler-fullday"><a href="#" class="k-link"><span class="k-icon k-i-clock"></span>', t += (r.showWorkHours ? r.messages.showFullDay : r.messages.showWorkDay) + "</a></li>", t += "</ul>") : t += " ", t += "</div>", this.footer = e(t).appendTo(this.element), i = this, this.footer.on("click" + v, ".k-scheduler-fullday", function(e) { e.preventDefault(), i.trigger("navigate", { view: i.name || r.name, date: i.startDate(), isWorkDay: !r.showWorkHours }) })) }, _columnCountForLevel: function(e) { var t = this.columnLevels[e]; return t ? t.length : 0 }, _rowCountForLevel: function(e) { var t = this.rowLevels[e]; return t ? t.length : 0 }, _isWorkDay: function(e) { var t, n = e.getDay(), i = this._workDays; for (t = 0; i.length > t; t++) if (i[t] === n) return !0; return !1 }, _content: function(e) { var t, n, i, r, o, a = this, l = a.options, c = a.startTime(), d = this.endTime(), u = 1, h = 1, p = e.length, f = "", g = this.groupedResources, m = this.slotTemplate, v = !1; for (g.length && (v = "vertical" === a._groupOrientation(), v ? h = a._groupCount() : u = a._groupCount()), f += "<tbody>", t = function(t) { var o, c = "", d = "", u = function(e) { return function() { return a._resourceBySlot({ groupIndex: e }) } }; return s.date.isToday(e[r]) && (d += "k-today"), (s.date.getMilliseconds(t) < s.date.getMilliseconds(l.workDayStart) || s.date.getMilliseconds(t) >= s.date.getMilliseconds(l.workDayEnd) || !a._isWorkDay(e[r])) && (d += " k-nonwork-hour"), c += "<td" + ("" !== d ? ' class="' + d + '"' : "") + ">", o = s.date.getDate(e[r]), s.date.setTime(o, s.date.getMilliseconds(t)), c += m({ date: o, resources: u(v ? n : i) }), c += "</td>" }, n = 0; h > n; n++) { for (f += "<tr>", i = 0; u > i; i++) for (r = 0, o = p; o > r; r++) f += this._forTimeRange(c, d, t); f += "</tr>" } f += "</tbody>", this.content.find("table").append(f) }, _groups: function() { var e, t, n, i, r = this._groupCount(), o = this._dates, a = o.length; for (this.groups = [], e = 0; r > e; e++) t = this._addResourceView(e), n = o[0], i = o[o.length - 1 || 0], t.addTimeSlotCollection(n, s.date.addDays(i, 1)); this._timeSlotGroups(r, a) }, _isVerticallyGrouped: function() { return this.groupedResources.length && "vertical" === this._groupOrientation() }, _isHorizontallyGrouped: function() { return this.groupedResources.length && "horizontal" === this._groupOrientation() }, _timeSlotGroups: function(e, t) { var n, i, r, o, a, s, l, c, d, u, h, p, g, m, v, _, w, b, y = this._timeSlotInterval(), k = this._isVerticallyGrouped(), x = this.content.find("tr"), C = x.length; for (x.attr("role", "row"), k && (C = Math.floor(C / e)), n = 0; e > n; n++) for (i = 0, r = this.groups[n], k && (i = n), a = i * C, s = 0, k || (s = n), l = x[a].children, c = l.length / (k ? 1 : e), d = c / t, u = 0; t > u; u++) for (h = u * d + c * s, o = f(new Date(+this.startTime())), p = 0; d > p; p++) g = l[p + h], m = r.getTimeSlotCollection(0), v = this._dates[u], _ = Date.UTC(v.getFullYear(), v.getMonth(), v.getDate()), w = _ + o, b = w + y, g.setAttribute("role", "gridcell"), g.setAttribute("aria-selected", !1), m.addTimeSlot(g, w, b, !0), o += y }, startDate: function() { return this._startDate }, endDate: function() { return this._endDate }, startTime: function() { var e = this.options; return e.showWorkHours ? e.workDayStart : e.startTime }, endTime: function() { var e = this.options; return e.showWorkHours ? e.workDayEnd : e.endTime }, _timeSlotInterval: function() { var e = this.options; return e.majorTick / e.minorTickCount * m }, nextDate: function() { return s.date.nextDay(this.endDate()) }, previousDate: function() { return s.date.previousDay(this.startDate()) }, calculateDateRange: function() { this._render([this.options.date]) }, render: function(e) { var t, n, i, r, o; for (this._headerColumnCount = 0, this._groups(), this.element.find(".k-event").remove(), e = new s.data.Query(e).sort([{ field: "start", dir: "asc" }, { field: "end", dir: "desc" }]).toArray(), t = [], this._eventsByResource(e, this.groupedResources, t), n = [], i = 0, r = 0; t.length > r; r++) o = { groupIndex: r, maxRowCount: 0, events: {} }, n.push(o), this._renderEvents(t[r], r, o), o.maxRowCount > i && (i = o.maxRowCount); this._setRowsHeight(n, t.length, i), this._positionEvents(n, t.length), this.trigger("activate") }, _positionEvents: function(e, t) { var n, i, r, o; for (n = 0; t > n; n++) { i = e[n].events; for (r in i) o = i[r], this._positionEvent(o) } }, _setRowsHeight: function(t, n, i) { var r, o, a, s, l, c = this.options.eventHeight + 2, d = this._getBottomRowOffset(); for (n = this._isVerticallyGrouped() ? n : 1, r = 0; n > r; r++) o = this._isVerticallyGrouped() ? t[r].maxRowCount : i, o = o ? o : 1, a = (c + 2) * o + d, s = e(this.times.find("tr")[r]), l = e(this.content.find("tr")[r]), s.height(a), l.height(a); this._setContentWidth(), this.refreshLayout(), this._refreshSlots() }, _getBottomRowOffset: function() { var e, t, n = .5 * this.options.eventHeight, i = this._isMobile(); return i ? (e = 30, t = 60) : (e = 15, t = 30), n > t ? n = t : e > n && (n = e), n }, _positionEvent: function(e) { var t, n, i, r = this.options.eventHeight + 2, o = e.slotRange.innerRect(e.start, e.end, !1), a = this._adjustLeftPosition(o.left), s = o.right - o.left - 2; 0 > s && (s = 0), this.options.eventMinWidth > s && (t = e.slotRange.collection, n = t._slots[t._slots.length - 1], i = n.offsetLeft + n.offsetWidth, s = this.options.eventMinWidth, a + s > i && (s = i - o.left - 2)), e.element.css({ top: e.slotRange.start.offsetTop + e.rowIndex * (r + 2) + "px", left: a, width: s }) }, _refreshSlots: function() { for (var e = 0; this.groups.length > e; e++) this.groups[e].refresh() }, _eventsByResource: function(e, t, n) { var i, r, o, a, l = t[0]; if (l) for (i = l.dataSource.view(), r = 0; i.length > r; r++) o = this._resourceValue(l, i[r]), a = new s.data.Query(e).filter({ field: l.field, operator: d.groupEqFilter(o) }).toArray(), t.length > 1 ? this._eventsByResource(a, t.slice(1), n) : n.push(a); else n.push(e) }, _isInDateSlot: function(e) { var t = e.start, n = e.end, i = p(this._startDate), r = s.date.addDays(p(this._endDate), 1); return r > t && n >= i ? !0 : !1 }, _isInTimeSlot: function(e) { var t, n = e._startTime || s.date.toUtcTime(e.start), i = e._endTime || s.date.toUtcTime(e.end), r = this._slotRanges; for (n === i && (i += 1), t = 0; r.length > t; t++) if (r[t].end > n && i > r[t].start) return !0; return !1 }, _adjustEvent: function(e) { var t, n = e.start, i = e.end, r = e._time("start"), o = e._time("end"), a = f(this.startTime()), l = f(this.endTime()), d = null, u = null, h = !1, m = !1; return e.isAllDay ? (d = p(n), a > r && (c(d, a), m = !0), u = p(i), l === f(p(this.endTime())) ? u = s.date.addDays(u, 1) : (c(u, l), h = !0)) : (l = 0 === l ? g : l, a > r ? (d = p(n), c(d, a), m = !0) : r > l && (d = p(n), d = s.date.addDays(d, 1), c(d, a), m = !0), o > l ? (u = p(i), c(u, l), h = !0) : a > o && (u = p(i), u = s.date.addDays(u, -1), c(u, l), h = !0)), t = e.clone({ start: d ? d : n, end: u ? u : i, _startTime: d ? s.date.toUtcTime(d) : e._startTime, _endTime: u ? s.date.toUtcTime(u) : e._endTime, isAllDay: !1 }), { occurrence: t, head: h, tail: m } }, _renderEvents: function(e, t, n) { var i, r, o, a, s, l, c, d, u, h, p; for (r = 0, o = e.length; o > r; r++) i = e[r], this._isInDateSlot(i) && (a = i.isAllDay || i.end.getTime() - i.start.getTime() >= g, s = this.content, (a || this._isInTimeSlot(i)) && (l = this._adjustEvent(i), c = this.groups[t], c._continuousEvents || (c._continuousEvents = []), d = c.slotRanges(l.occurrence, !1), u = d[0], this._isInTimeSlot(l.occurrence) && (h = this._createEventElement(l.occurrence, i, u.head || l.head, u.tail || l.tail), h.appendTo(s).css({ top: 0, height: this.options.eventHeight }), p = { start: l.occurrence._startTime || l.occurrence.start, end: l.occurrence._endTime || l.occurrence.end, element: h, uid: i.uid, slotRange: u, rowIndex: 0, offsetTop: 0 }, n.events[i.uid] = p, this.addContinuousEvent(c, u, h, i.isAllDay), this._arrangeRows(p, u, n)))) }, addContinuousEvent: function(e, t, n, i) { var r = e._continuousEvents; r.push({ element: n, isAllDay: i, uid: n.attr(s.attr("uid")), start: t.start, end: t.end }) }, _createEventElement: function(t, n, i, r) { var o, a, l = this.eventTemplate, c = this.options.editable, d = this._isMobile(), h = c && c.destroy !== !1 && !d, p = c && c.resize !== !1, f = n._time("start"), g = n._time("end"), m = n.start, v = n.end, _ = this.eventResources(n); return n._startTime && (m = new Date(f), m = s.timezone.apply(m, "Etc/UTC")), n.endTime && (v = new Date(g), v = s.timezone.apply(v, "Etc/UTC")), o = u({}, { ns: s.ns, resizable: p, showDelete: h, head: i, tail: r, singleDay: 1 == this._dates.length, resources: _, inverseColor: _ && _[0] ? this._shouldInverseResourceColor(_[0]) : !1 }, n, { start: m, end: v }), a = e(l(o)), this.angular("compile", function() { return { elements: a, data: [{ dataItem: o }] } }), a }, _arrangeRows: function(e, t, n) { var i, r, a, s, l, c, u = t.start.index, h = t.end.index, p = e.slotRange.innerRect(e.start, e.end, !1), f = p.right + this.options.eventMinWidth, g = o(t.events(), p.left, f); for (t.addEvent({ slotIndex: u, start: u, end: h, rectLeft: p.left, rectRight: f, element: e.element, uid: e.uid }), g.push({ start: u, end: h, uid: e.uid }), i = d.createRows(g), i.length > n.maxRowCount && (n.maxRowCount = i.length), r = 0, a = i.length; a > r; r++) for (s = i[r].events, l = 0, c = s.length; c > l; l++) n.events[s[l].uid].rowIndex = r }, _groupCount: function() { var e = this.groupedResources; return e.length ? "vertical" === this._groupOrientation() ? this._rowCountForLevel(e.length - 1) : this._columnCountForLevel(e.length - 1) : 1 }, _updateEventForSelection: function(e) { var t = this._adjustEvent(e.clone()); return t.occurrence }, _eventOptionsForMove: function(e) { return e.isAllDay ? { isAllDay: !1 } : {} }, _updateEventForResize: function(e) { e.isAllDay && e.set("isAllDay", !1) }, _updateMoveHint: function(e, t, n) { var i, r, o, a, s, l, c, d, u, h, p, f = this.groups[t], g = e.clone({ start: e.start, end: e.end }), m = g.duration(); for (g.start = new Date(g.start.getTime() + n), g.end = new Date(+g.start + m), i = this._adjustEvent(g), r = f.slotRanges(i.occurrence, !1), this._removeMoveHint(), o = 0; r.length > o; o++) a = r[o], s = a.start, l = this._createEventElement(i.occurrence, i.occurrence, !1, !1), l.addClass("k-event-drag-hint"), c = a.innerRect(i.occurrence.start, i.occurrence.end, this.options.snap), d = c.right - c.left - 2, 0 > d && (d = 0), u = this._adjustLeftPosition(c.left), h = { left: u, top: s.offsetTop, height: s.offsetHeight - 2, width: d }, l.css(h), this._moveHint = this._moveHint.add(l); p = this.content, this._moveHint.appendTo(p) }, _updateResizeHint: function(e, t, n, i) { var r, o, a, l, c, u, h, p, f, g, m = this.groups[t], v = m.ranges(n, i, !1, !1); for (this._removeResizeHint(), r = 0; v.length > r; r++) o = v[r], a = o.startSlot(), l = o.innerRect(n, i, !1), l.top = a.offsetTop, c = l.right - l.left, u = a.offsetHeight, h = this._adjustLeftPosition(l.left), p = d.fn._createResizeHint.call(this, h, l.top, c, u), this._resizeHint = this._resizeHint.add(p); f = "t", g = this.content, this._resizeHint.appendTo(g), this._resizeHint.find(".k-label-top,.k-label-bottom").text(""), this._resizeHint.first().addClass("k-first").find(".k-label-top").text(s.toString(s.timezone.toLocalDate(n), f)), this._resizeHint.last().addClass("k-last").find(".k-label-bottom").text(s.toString(s.timezone.toLocalDate(i), f)) }, selectionByElement: function(e) { var t = e.offset(); return this._slotByPosition(t.left, t.top) }, _updateDirection: function(e, t, n, i, r) { var o = t[0].start, a = t[t.length - 1].end; n && !r && o.index === a.index && o.collectionIndex === a.collectionIndex && (e.backward = i) }, _changeGroup: function(e, t) { var n = t ? "prevGroupSlot" : "nextGroupSlot", i = this[n](e.start, e.groupIndex, !1); return i && (e.groupIndex += t ? -1 : 1), i }, prevGroupSlot: function(e, t, n) { var i, r = this.groups[t], o = r.ranges(e, e, n, !1)[0].start; if (!(0 >= t)) return this._isVerticallyGrouped() ? o : (i = r._collection(0, n), i.last()) }, nextGroupSlot: function(e, t, n) { var i, r = this.groups[t], o = r.ranges(e, e, n, !1)[0].start; if (!(t >= this.groups.length - 1)) return this._isVerticallyGrouped() ? o : (i = r._collection(0, n), i.first()) }, _verticalSlots: function(e, t, n, i) { var r = i ? "leftSlot" : "rightSlot", o = t[0].start, a = t[t.length - 1].end, s = this.groups[e.groupIndex]; return o = s[r](o), a = s[r](a), n || !this._isVerticallyGrouped() || o && a || (o = a = this._changeGroup(e, i)), { startSlot: o, endSlot: a } }, _horizontalSlots: function(e, t, n, i) { var r = i ? "upSlot" : "downSlot", o = t[0].start, a = t[t.length - 1].end, s = this.groups[e.groupIndex]; return o = s[r](o), a = s[r](a), n || !this._isHorizontallyGrouped() || o && a || (o = a = this._changeGroup(e, i)), { startSlot: o, endSlot: a } }, _changeViewPeriod: function(e, t) { var n, i = t ? this.previousDate() : this.nextDate(), r = e.start, o = e.end; return e.start = new Date(i), e.end = new Date(i), this._isHorizontallyGrouped() && (e.groupIndex = t ? this.groups.length - 1 : 0), n = o - r, t ? (o = f(this.endTime()), o = 0 === o ? g : o, c(e.start, o - n), c(e.end, o)) : (r = f(this.startTime()), c(e.start, r), c(e.end, r + n)), e.events = [], !0 }, move: function(e, t, n) { var i, r, o, a, l, c = !1, d = this.groups[e.groupIndex], u = s.keys, h = d.ranges(e.start, e.end, !1, !1); if (t === u.DOWN || t === u.UP) c = !0, o = t === u.UP, this._updateDirection(e, h, n, o, !0), a = this._verticalSlots(e, h, n, o); else if (!(t !== u.LEFT && t !== u.RIGHT || (c = !0, o = t === u.LEFT, this._updateDirection(e, h, n, o, !1), a = this._horizontalSlots(e, h, n, o), a.startSlot && a.endSlot || n || !this._changeViewPeriod(e, o, !1)))) return c; return c && (i = a.startSlot, r = a.endSlot, n ? (l = e.backward, l && i ? e.start = i.startDate() : !l && r && (e.end = r.endDate())) : i && r && (e.start = i.startDate(), e.end = r.endDate()), e.events = []), c }, destroy: function() { var e = this; e.element && e.element.off(v), e.footer && e.footer.remove(), e._currentTimeUpdateTimer && clearInterval(e._currentTimeUpdateTimer), d.fn.destroy.call(this), this._isMobile() && e.options.editable && (e.options.editable.create !== !1 && e._addUserEvents.destroy(), e.options.editable.update !== !1 && e._editUserEvents.destroy()) } }); u(!0, l, { TimelineView: y, TimelineWeekView: y.extend({ options: { name: "TimelineWeekView", title: "Timeline Week", selectedDateFormat: "{0:D} - {1:D}", selectedShortDateFormat: "{0:d} - {1:d}", majorTick: 120 }, name: "timelineWeek", calculateDateRange: function() { var e, t, n = this.options.date, i = s.date.dayOfWeek(n, this.calendarInfo().firstDay, -1), r = []; for (e = 0, t = 7; t > e; e++) r.push(i), i = s.date.nextDay(i); this._render(r) } }), TimelineWorkWeekView: y.extend({ options: { name: "TimelineWorkWeekView", title: "Timeline Work Week", selectedDateFormat: "{0:D} - {1:D}", selectedShortDateFormat: "{0:d} - {1:d}", majorTick: 120 }, name: "timelineWorkWeek", nextDate: function() { return s.date.dayOfWeek(s.date.nextDay(this.endDate()), this.options.workWeekStart, 1) }, previousDate: function() { return s.date.previousDay(this.startDate()) }, calculateDateRange: function() { for (var e = this.options.date, t = s.date.dayOfWeek(e, this.options.workWeekStart, -1), n = s.date.dayOfWeek(t, this.options.workWeekEnd, 1), i = []; n >= t;) i.push(t), t = s.date.nextDay(t); this._render(i) } }), TimelineMonthView: y.extend({ options: { name: "TimelineMonthView", title: "Timeline Month", selectedDateFormat: "{0:D} - {1:D}", selectedShortDateFormat: "{0:d} - {1:d}", workDayStart: new Date(1980, 1, 1, 0, 0, 0), workDayEnd: new Date(1980, 1, 1, 23, 59, 59), footer: !1, majorTick: 1440, minorTickCount: 1 }, name: "timelineMonth", calculateDateRange: function() { var e, t, n = this.options.date, i = s.date.firstDayOfMonth(n), r = s.date.lastDayOfMonth(n), o = []; for (e = 0, t = r.getDate(); t > e; e++) o.push(i), i = s.date.nextDay(i); this._render(o) } }) }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { return t = t || "", e.startTimezone && (t = e.startTimezone, e.endTimezone && (t += " | " + e.endTimezone)), t } function i(e, t) { var n = t.timezone; n && (e[M.attr("timezone")] = n) } function r(e, t) { var n, i = t.model.fields[t.field].validation; i && (n = i.dateCompare, n && $(n) && n.message && (e[M.attr("dateCompare-msg")] = n.message)) } function o(e, t) { return function(n) { return n = e(n), s(n, "apply", t), n || [] } } function a(e, t) { return function(n) { return n && ("[object Array]" === K.call(n) || n instanceof M.data.ObservableArray || (n = [n])), s(n, "remove", t, !0), n = e(n), n || [] } } function s(e, t, n, i) { var r, o, a; for (e = e || [], o = 0, a = e.length; a > o; o++) r = e[o], i ? r.startTimezone || r.endTimezone ? n ? (r.start = M.timezone.convert(r.start, r.startTimezone || r.endTimezone, n), r.end = M.timezone.convert(r.end, r.endTimezone || r.startTimezone, n), r.start = M.timezone[t](r.start, n), r.end = M.timezone[t](r.end, n)) : (r.start = M.timezone[t](r.start, r.startTimezone || r.endTimezone), r.end = M.timezone[t](r.end, r.endTimezone || r.startTimezone)) : n && (r.start = M.timezone[t](r.start, n), r.end = M.timezone[t](r.end, n)) : r.startTimezone || r.endTimezone ? (r.start = M.timezone[t](r.start, r.startTimezone || r.endTimezone), r.end = M.timezone[t](r.end, r.endTimezone || r.startTimezone), n && (r.start = M.timezone.convert(r.start, r.startTimezone || r.endTimezone, n), r.end = M.timezone.convert(r.end, r.endTimezone || r.startTimezone, n))) : n && (r.start = M.timezone[t](r.start, n), r.end = M.timezone[t](r.end, n)), i && delete r.uid; return e } function l(e, t) { for (var n, i = e.length, r = 0; i > r; r++) if (n = e[r], n.uid === t) return n } function c(e, t, n) { return e = n ? M.timezone.convert(e, t, n) : M.timezone.remove(e, t) } function d(e) { var t, n, i, r, o, a, s, l, d, u, h, p; return e.filter("[name=end]").length && (t = e.closest(".k-scheduler-edit-form"), n = t.find("[name=start]:visible"), i = t.find("[name=end]:visible"), i[0] && n[0] && (a = M.widgetInstance(n, M.ui), s = M.widgetInstance(i, M.ui), l = t.data("kendoEditable"), d = l ? l.options.model : null, a && s ? (r = a.value(), o = s.value()) : (r = M.parseDate(n.val()), o = M.parseDate(i.val())), r && o)) ? (d && (u = n.attr(M.attr("timezone")), h = d.startTimezone, p = d.endTimezone, h = h || p, p = p || h, h && (r = c(r, h, u), o = c(o, p, u))), o >= r) : !0 } function u(e, t, n, i) { for (var r = e.length, o = [], a = 0; r > a; a++) o = o.concat(e[a].expand(t, n, i)); return o } function h(e) { return delete e.name, delete e.prefix, delete e.remove, delete e.edit, delete e.add, delete e.navigate, e } function p(t) { return t = null != t ? t : "", t.type || e.type(t) || "string" } function f(t, n) { var i, r, o = (t.fields || t)[n], a = ["url", "email", "number", "date", "boolean"], s = o ? o.validation : {}, l = (p(o), M.attr("type")), c = e.inArray, d = {}; for (i in s) r = s[i], c(i, a) >= 0 ? d[l] = i : M.isFunction(r) || (d[i] = $(r) ? r.value || i : r), d[M.attr(i + "-msg")] = r.message; return d } function g(t, n) { var i = f(n, t.field); return function(n) { e(M.format('<select data-{0}bind="value:{1}">', M.ns, t.field)).appendTo(n).attr(i).kendoDropDownList({ dataTextField: t.dataTextField, dataValueField: t.dataValueField, dataSource: t.dataSource, valuePrimitive: t.valuePrimitive, optionLabel: "None", template: M.format('<span class="k-scheduler-mark" style="background-color:#= data.{0}?{0}:"none" #"></span>#={1}#', t.dataColorField, t.dataTextField) }) } } function m(t) { var n = f(t.model, t.field); return function(t) { e('<textarea name="description" class="k-textbox"/>').attr(n).appendTo(t) } } function v(t, n) { var i = f(n, t.field); return function(n) { e(M.format('<select data-{0}bind="value:{1}">', M.ns, t.field)).appendTo(n).attr(i).kendoMultiSelect({ dataTextField: t.dataTextField, dataValueField: t.dataValueField, dataSource: t.dataSource, valuePrimitive: t.valuePrimitive, itemTemplate: M.format('<span class="k-scheduler-mark" style="background-color:#= data.{0}?{0}:"none" #"></span>#={1}#', t.dataColorField, t.dataTextField), tagTemplate: M.format('<span class="k-scheduler-mark" style="background-color:#= data.{0}?{0}:"none" #"></span>#={1}#', t.dataColorField, t.dataTextField) }) } } function _(t, n) { var i = f(n, t.field); return function(n) { var r, o, a = "", s = t.dataSource.view(); for (r = 0, o = s.length; o > r; r++) a += M.format('<option value="{0}">{1}</option>', M.getter(t.dataValueField)(s[r]), M.getter(t.dataTextField)(s[r])); e(M.format('<select data-{0}bind="value:{1}" multiple="multiple" data-{0}value-primitive="{3}">{2}</select>', M.ns, t.field, a, t.valuePrimitive)).appendTo(n).attr(i) } } function w(e, t) { var n, i = e.end.getTime() - e.start.getTime(), r = new Date(e.start.getTime()); return M.date.setTime(r, t), n = new Date(r.getTime()), M.date.setTime(n, i, !0), { start: r, end: n } } var b, y, k, x, C, S, T, D, A, E, I, P, M = window.kendo, z = M.date, F = M.support.input, R = z.MS_PER_DAY, H = z.getDate, B = M.date.getMilliseconds, L = M.recurrence, N = M.keys, O = M.ui, V = O.Widget, U = O.DataBoundWidget, W = "string", j = O.Popup, G = O.Calendar, q = M.data.DataSource, $ = e.isPlainObject, Y = e.extend, Q = e.proxy, K = Object.prototype.toString, X = e.isArray, Z = ".kendoScheduler", J = "click", et = "change", tt = "cancel", nt = "remove", it = "save", rt = "add", ot = "edit", at = /(?:value:start|value:end)(?:,|$)/, st = H(new Date), lt = "recurrenceException", ct = "Are you sure you want to delete this event?", dt = "Do you want to delete only this event occurrence or the whole series?", ut = "Do you want to edit only this event occurrence or the whole series?", ht = "Are you sure you want to delete this event occurrence?", pt = "Are you sure you want to delete the whole series?", ft = '<a class="k-button #=className#" #=attr# href="\\#">#=text#</a>', gt = M.template('<li class="k-current-view" data-#=ns#name="#=view#"><a role="button" href="\\#" class="k-link">${views[view].title}</a></li>'), mt = M.template('<div class="k-floatwrap k-header k-scheduler-toolbar"># if (pdf) { #<ul class="k-reset k-scheduler-tools"><li><a role="button" href="\\#" class="k-button k-pdf"><span class="k-icon k-i-pdf"></span>${messages.pdf}</a></li></ul># } #<ul class="k-reset k-scheduler-navigation"><li class="k-state-default k-header k-nav-today"><a role="button" href="\\#" class="k-link">${messages.today}</a></li><li class="k-state-default k-header k-nav-prev"><a role="button" href="\\#" class="k-link"><span class="k-icon k-i-arrow-w"></span></a></li><li class="k-state-default k-header k-nav-next"><a role="button" href="\\#" class="k-link"><span class="k-icon k-i-arrow-e"></span></a></li><li class="k-state-default k-nav-current"><a role="button" href="\\#" class="k-link"><span class="k-icon k-i-calendar"></span><span class="k-sm-date-format" data-#=ns#bind="text: formattedShortDate"></span><span class="k-lg-date-format" data-#=ns#bind="text: formattedDate"></span></a></li></ul>#if(viewsCount === 1){#<a role="button" data-#=ns#name="#=view#" href="\\#" class="k-link k-scheduler-refresh"><span class="k-icon k-i-refresh"></span></a>#}else{#<ul class="k-reset k-header k-scheduler-views">#for(var view in views){#<li class="k-state-default k-view-#= view.toLowerCase() #" data-#=ns#name="#=view#"><a role="button" href="\\#" class="k-link">${views[view].title}</a></li>#}#</ul>#}#</div>'), vt = M.template('<div class="k-floatwrap k-header k-scheduler-toolbar"><ul class="k-reset k-header k-scheduler-navigation"><li class="k-state-default k-nav-today"><a role="button" href="\\#" class="k-link">${messages.today}</a></li></ul>#if(viewsCount === 1){#<a role="button" data-#=ns#name="#=view#" href="\\#" class="k-link k-scheduler-refresh"><span class="k-icon k-i-refresh"></span></a>#}else{#<ul class="k-reset k-header k-scheduler-views">#for(var view in views){#<li class="k-state-default k-view-#= view.toLowerCase() #" data-#=ns#name="#=view#"><a role="button" href="\\#" class="k-link">${views[view].title}</a></li>#}#</ul>#}#</div><div class="k-floatwrap k-header k-scheduler-toolbar"><ul class="k-reset k-header k-scheduler-navigation"><li class="k-state-default k-nav-prev"><a role="button" href="\\#" class="k-link"><span class="k-icon k-i-arrow-w"></span></a></li><li class="k-state-default k-nav-current"><span class="k-sm-date-format" data-#=ns#bind="text: formattedShortDate"></span><span class="k-lg-date-format" data-#=ns#bind="text: formattedDate"></span></li><li class="k-state-default k-nav-next"><a role="button" href="\\#" class="k-link"><span class="k-icon k-i-arrow-e"></span></a></li></ul></div>'), _t = function(t, n) { var o = { name: n.field }, a = F.date ? "" : M.attr("role") + '="datepicker" ', s = M.attr("role") + '="datetimepicker" ', l = n.model.isAllDay, c = M.attr("validate") + "='" + !l + "'", d = M.attr("validate") + "='" + l + "'"; i(o, n), r(o, n), e('<input type="datetime-local" required ' + M.attr("type") + '="date" ' + s + M.attr("bind") + '="value:' + n.field + ',invisible:isAllDay" ' + c + "/>").attr(o).appendTo(t), e('<input type="date" required ' + M.attr("type") + '="date" ' + a + M.attr("bind") + '="value:' + n.field + ',visible:isAllDay" ' + d + "/>").attr(o).appendTo(t), e("<span " + M.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) }, wt = function(t, n) { var o = { name: n.field }, a = n.model.isAllDay, s = M.attr("validate") + "='" + !a + "' ", l = M.attr("validate") + "='" + a + "' "; i(o, n), r(o, n), e('<input type="text" required ' + M.attr("type") + '="date" ' + M.attr("role") + '="datetimepicker" ' + M.attr("bind") + '="value:' + n.field + ',invisible:isAllDay" ' + s + "/>").attr(o).appendTo(t), e('<input type="text" required ' + M.attr("type") + '="date" ' + M.attr("role") + '="datepicker" ' + M.attr("bind") + '="value:' + n.field + ',visible:isAllDay" ' + l + "/>").attr(o).appendTo(t), e("<span " + M.attr("bind") + '="text: ' + n.field + 'Timezone"></span>').appendTo(t), "end" === n.field && e("<span " + M.attr("bind") + '="text: startTimezone, invisible: endTimezone"></span>').appendTo(t), e("<span " + M.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) }, bt = function(t, n) { e("<div " + M.attr("bind") + '="value:' + n.field + '" />').attr({ name: n.field }).appendTo(t).kendoRecurrenceEditor({ start: n.model.start, timezone: n.timezone, messages: n.messages }) }, yt = function(t, n) { e("<div " + M.attr("bind") + '="value:' + n.field + '" />').attr({ name: n.field }).appendTo(t).kendoMobileRecurrenceEditor({ start: n.model.start, timezone: n.timezone, messages: n.messages, pane: n.pane, value: n.model[n.field] }) }, kt = function(t, i) { var r = n(i.model, i.messages.noTimezone); e('<a href="#" class="k-button k-timezone-button" data-bind="invisible:isAllDay">' + r + "</a>").click(i.click).appendTo(t) }, xt = function(t, n) { e('<a href="#" class="k-button" data-bind="invisible:isAllDay">' + n.messages.timezoneEditorButton + "</a>").click(n.click).appendTo(t) }, Ct = function(t, n) { e("<div " + M.attr("bind") + '="value:' + n.field + '" />').attr({ name: n.field }).toggle(n.visible).appendTo(t).kendoMobileTimezoneEditor({ optionLabel: n.noTimezone }) }, St = function(t, n) { e("<div " + M.attr("bind") + '="value:' + n.field + '" />').attr({ name: n.field }).toggle(n.visible).appendTo(t).kendoTimezoneEditor({ optionLabel: n.noTimezone }) }, Tt = M.Class.extend({ init: function(t, n) { var i = t.timezone; this.reader = n, n.model && (this.model = n.model), this.timezone = i, this.data = o(e.proxy(this.data, this), i), this.serialize = a(e.proxy(this.serialize, this), i) }, errors: function(e) { return this.reader.errors(e) }, parse: function(e) { return this.reader.parse(e) }, data: function(e) { return this.reader.data(e) }, total: function(e) { return this.reader.total(e) }, groups: function(e) { return this.reader.groups(e) }, aggregates: function(e) { return this.reader.aggregates(e) }, serialize: function(e) { return this.reader.serialize(e) } }), Dt = M.data.Model.define({ init: function(e) { var t = this; M.data.Model.fn.init.call(t, e), t._defaultId = t.defaults[t.idField] }, _time: function(e) { var t = this[e], n = "_" + e + "Time"; return this[n] ? this[n] - M.date.toUtcTime(M.date.getDate(t)) : B(t) }, _date: function(e) { var t = "_" + e + "Time"; return this[t] ? this[t] - this._time(e) : M.date.getDate(this[e]) }, clone: function(t, n) { var i = this.uid, r = new this.constructor(e.extend({}, this.toJSON(), t)); return n || (r.uid = i), r }, duration: function() { var e = this.end, t = this.start, n = (e.getTimezoneOffset() - t.getTimezoneOffset()) * M.date.MS_PER_MINUTE; return e - t - n }, expand: function(e, t, n) { return L ? L.expand(this, e, t, n) : [this] }, update: function(e) { for (var t in e) this.set(t, e[t]); this._startTime && this.set("_startTime", M.date.toUtcTime(this.start)), this._endTime && this.set("_endTime", M.date.toUtcTime(this.end)) }, isMultiDay: function() { return this.isAllDay || this.duration() >= M.date.MS_PER_DAY }, isException: function() { return !this.isNew() && this.recurrenceId }, isOccurrence: function() { return this.isNew() && this.recurrenceId }, isRecurring: function() { return !(!this.recurrenceRule && !this.recurrenceId) }, isRecurrenceHead: function() { return !(!this.id || !this.recurrenceRule) }, toOccurrence: function(t) { return t = e.extend(t, { recurrenceException: null, recurrenceRule: null, recurrenceId: this.id || this.recurrenceId }), t[this.idField] = this.defaults[this.idField], this.clone(t, !0) }, toJSON: function() { var e = M.data.Model.fn.toJSON.call(this); return e.uid = this.uid, delete e._startTime, delete e._endTime, e }, shouldSerialize: function(e) { return M.data.Model.fn.shouldSerialize.call(this, e) && "_defaultId" !== e }, set: function(e, t) { var n, i, r, o = this.isAllDay || !1; M.data.Model.fn.set.call(this, e, t), "isAllDay" == e && t != o && (n = M.date.getDate(this.start), i = new Date(this.end), r = M.date.getMilliseconds(i), 0 === r && t && (r = R), this.set("start", n), t === !0 ? (M.date.setTime(i, -r), n > i && (i = n)) : M.date.setTime(i, R - r), this.set("end", i)) }, id: "id", fields: { id: { type: "number" }, title: { defaultValue: "", type: "string" }, start: { type: "date", validation: { required: !0 } }, startTimezone: { type: "string" }, end: { type: "date", validation: { required: !0, dateCompare: { value: d } } }, endTimezone: { type: "string" }, recurrenceRule: { defaultValue: "", type: "string" }, recurrenceException: { defaultValue: "", type: "string" }, isAllDay: { type: "boolean", defaultValue: !1 }, description: { type: "string" } } }), At = q.extend({ init: function(e) { q.fn.init.call(this, Y(!0, {}, { schema: { modelBase: Dt, model: Dt } }, e)), this.reader = new Tt(this.options.schema, this.reader) }, expand: function(e, t) { var n = this.view(), i = {}; return e && t && (t = new Date(t.getTime() + R - 1), i = { logic: "or", filters: [{ logic: "and", filters: [{ field: "start", operator: "gte", value: e }, { field: "end", operator: "gte", value: e }, { field: "start", operator: "lte", value: t }] }, { logic: "and", filters: [{ field: "start", operator: "lte", value: new Date(e.getTime() + R - 1) }, { field: "end", operator: "gte", value: e }] }] }, n = new M.data.Query(u(n, e, t, this.reader.timezone)).filter(i).toArray()), n }, cancelChanges: function(e) { e && e.isOccurrence() && this._removeExceptionDate(e), q.fn.cancelChanges.call(this, e) }, insert: function(e, t) { if (t) { if (!(t instanceof Dt)) { var n = t; t = this._createNewModel(), t.accept(n) } return (!this._pushCreated && t.isRecurrenceHead() || t.recurrenceId) && (t = t.recurrenceId ? t : t.toOccurrence(), this._addExceptionDate(t)), q.fn.insert.call(this, e, t) } }, pushCreate: function(e) { this._pushCreated = !0, q.fn.pushCreate.call(this, e), this._pushCreated = !1 }, remove: function(e) { return e.isRecurrenceHead() ? this._removeExceptions(e) : e.isRecurring() && this._addExceptionDate(e), q.fn.remove.call(this, e) }, _removeExceptions: function(e) { for (var t = this.data().slice(0), n = t.shift(), i = e.id; n;) n.recurrenceId === i && q.fn.remove.call(this, n), n = t.shift(); e.set(lt, "") }, _removeExceptionDate: function(e) { var t, n; e.recurrenceId && (t = this.get(e.recurrenceId), t && (n = e.start, t.set(lt, t.recurrenceException.replace(L.toExceptionString(n, this.reader.timezone), "")))) }, _addExceptionDate: function(e) { var t = e.start, n = this.reader.timezone, i = this.get(e.recurrenceId), r = i.recurrenceException || ""; L.isException(r, t, n) || i.set(lt, r + L.toExceptionString(t, n)) } }); At.create = function(e) { (X(e) || e instanceof M.data.ObservableArray) && (e = { data: e }); var t = e || {}, n = t.data; if (t.data = n, !(t instanceof At) && t instanceof M.data.DataSource) throw Error("Incorrect DataSource type. Only SchedulerDataSource instances are supported"); return t instanceof At ? t : new At(t) }, Y(!0, M.data, { SchedulerDataSource: At, SchedulerDataReader: Tt, SchedulerEvent: Dt }), b = { update: { text: "Save", className: "k-primary k-scheduler-update" }, canceledit: { text: "Cancel", className: "k-scheduler-cancel" }, destroy: { text: "Delete", imageClass: "k-delete", className: "k-primary k-scheduler-delete", iconClass: "k-icon" } }, y = { mobile: { dateRange: _t, timezonePopUp: kt, timezone: Ct, recurrence: yt, description: m, multipleResources: _, resources: g }, desktop: { dateRange: wt, timezonePopUp: xt, timezone: St, recurrence: bt, description: m, multipleResources: v, resources: g } }, k = M.Observable.extend({ init: function(e, t) { M.Observable.fn.init.call(this), this.element = e, this.options = Y(!0, {}, this.options, t), this.createButton = this.options.createButton, this.toggleDateValidationHandler = Q(this._toggleDateValidation, this) }, _toggleDateValidation: function(t) { if ("isAllDay" == t.field) { var n, i, r, o = this.container, a = this.editable.options.model.isAllDay, s = M.attr("bind"); o.find("[" + s + "*=end],[" + s + "*=start]").each(function() { n = e(this), at.test(n.attr(s)) && (i = n.is("[" + M.attr("role") + "=datetimepicker],[type*=datetime]"), r = a !== i, n.attr(M.attr("validate"), r)) }) } }, fields: function(e, t) { var n, i, r = this, o = r.options.messages, a = r.options.timezone, s = function(e) { e.preventDefault(), r._initTimezoneEditor(t, this) }, l = [{ field: "title", title: o.editor.title }, { field: "start", title: o.editor.start, editor: e.dateRange, timezone: a }, { field: "end", title: o.editor.end, editor: e.dateRange, timezone: a }, { field: "isAllDay", title: o.editor.allDayEvent }]; M.timezone.windows_zones && (l.push({ field: "timezone", title: o.editor.timezone, editor: e.timezonePopUp, click: s, messages: o.editor, model: t }), l.push({ field: "startTimezone", title: o.editor.startTimezone, editor: e.timezone, noTimezone: o.editor.noTimezone }), l.push({ field: "endTimezone", title: o.editor.endTimezone, editor: e.timezone, noTimezone: o.editor.noTimezone })), t.recurrenceId || l.push({ field: "recurrenceRule", title: o.editor.repeat, editor: e.recurrence, timezone: a, messages: o.recurrenceEditor, pane: this.pane }), "description" in t && l.push({ field: "description", title: o.editor.description, editor: e.description({ model: t, field: "description" }) }); for (n = 0; this.options.resources.length > n; n++) i = this.options.resources[n], l.push({ field: i.field, title: i.title, editor: i.multiple ? e.multipleResources(i, t) : e.resources(i, t) }); return l }, end: function() { return this.editable.end() }, _buildEditTemplate: function(e, t, n) { var i, r, o, a, s = this.options.messages, l = Y({}, M.Template, this.options.templateSettings), c = l.paramName, d = this.options.editable.template, u = ""; if (d) typeof d === W && (d = window.unescape(d)), u += M.template(d, l)(e); else for (i = 0, r = t.length; r > i; i++) o = t[i], "startTimezone" === o.field && (u += '<div class="k-popup-edit-form k-scheduler-edit-form k-scheduler-timezones" style="display:none">', u += '<div class="k-edit-form-container">', u += '<div class="k-edit-label"></div>', u += '<div class="k-edit-field"><label class="k-check"><input class="k-timezone-toggle" type="checkbox" />' + s.editor.separateTimezones + "</label></div>"), u += '<div class="k-edit-label"><label for="' + o.field + '">' + (o.title || o.field || "") + "</label></div>", !e.editable || e.editable(o.field) ? (n.push(o), u += "<div " + M.attr("container-for") + '="' + o.field + '" class="k-edit-field"></div>') : (a = "#:", o.field ? (o = M.expr(o.field, c), a += o + "==null?'':" + o) : a += "''", a += "#", a = M.template(a, l), u += '<div class="k-edit-field">' + a(e) + "</div>"), "endTimezone" === o.field && (u += this._createEndTimezoneButton()); return u }, _createEndTimezoneButton: function() { return "</div></div>" }, _revertTimezones: function(e) { e.set("startTimezone", this._startTimezone), e.set("endTimezone", this._endTimezone), delete this._startTimezone, delete this._endTimezone } }), x = k.extend({ init: function() { k.fn.init.apply(this, arguments), this.pane = M.mobile.ui.Pane.wrap(this.element), this.pane.element.parent().css("height", this.options.height), this.view = this.pane.view(), this._actionSheetButtonTemplate = M.template('<li><a #=attr# class="k-button #=className#" href="\\#">#:text#</a></li>'), this._actionSheetPopupOptions = e(document.documentElement).hasClass("km-root") ? { modal: !1 } : { align: "bottom center", position: "bottom center", effect: "slideIn:up" } }, options: { animations: { left: "slide", right: "slide:right" } }, destroy: function() { this.close(), this.unbind(), this.pane.destroy() }, _initTimezoneEditor: function(t) { var i, r = this, o = r.pane, a = r.options.messages, s = r.timezoneView, l = r.container.find(".k-scheduler-timezones"), c = l.find(".k-timezone-toggle"), d = l.find(".k-edit-label:last").add(l.find(".k-edit-field:last")), u = function(e) { if ("startTimezone" === e.field) { var n = t.startTimezone; c.prop("disabled", !n), n || (d.hide(), t.set("endTimezone", ""), c.prop("checked", !1)) } }; r._startTimezone = t.startTimezone || "", r._endTimezone = t.endTimezone || "", s || (i = '<div data-role="view" class="k-popup-edit-form k-scheduler-edit-form k-mobile-list"><div data-role="header" class="k-header"><a href="#" class="k-button k-scheduler-cancel">' + a.cancel + "</a>" + a.editor.timezoneTitle + '<a href="#" class="k-button k-scheduler-update">' + a.save + "</a></div></div>", this.timezoneView = s = o.append(i), s.contentElement().append(l.show()), s.element.on(J + Z, ".k-scheduler-cancel, .k-scheduler-update", function(i) { var s, l; i.preventDefault(), i.stopPropagation(), e(this).hasClass("k-scheduler-cancel") && r._revertTimezones(t), t.unbind("change", u), s = o.element.find("#edit").data("kendoMobileView"), l = n(t, a.editor.noTimezone), s.contentElement().find(".k-timezone-button").text(l), o.navigate(s, r.options.animations.right) }), c.click(function() { d.toggle(c.prop("checked")), t.set("endTimezone", "") }), t.bind("change", u)), c.prop("checked", t.endTimezone).prop("disabled", !t.startTimezone), t.endTimezone ? d.show() : d.hide(), o.navigate(s, r.options.animations.left) }, _createActionSheetButton: function(e) { return e.template = this._actionSheetButtonTemplate, this.createButton(e) }, showDialog: function(t) { var n, i, r = "", o = '<ul><li class="km-actionsheet-title">' + t.title + "</li>", a = this.element.find(".k-event[" + M.attr("uid") + "='" + t.model.uid + "']"); for (this.container && (a = this.container.find(".k-scheduler-delete"), a[0] && (r = "phone")), n = 0; t.buttons.length > n; n++) o += this._createActionSheetButton(t.buttons[n]); o += "</ul>", i = e(o).appendTo(this.pane.view().element).kendoMobileActionSheet({ type: r, cancel: this.options.messages.cancel, cancelTemplate: '<li class="km-actionsheet-cancel"><a class="k-button" href="\\#">#:cancel#</a></li>', close: function() { this.destroy() }, command: function(n) { var r = i.element.find("li:not(.km-actionsheet-cancel) > .k-button").index(e(n.currentTarget)); r > -1 && (i.close(), t.buttons[r].click()) }, popup: this._actionSheetPopupOptions }).data("kendoMobileActionSheet"), i.open(a) }, editEvent: function(t) { var n, i, r, o, a, s = this.pane, l = "", c = this.options.messages, d = c.save, u = c.destroy, h = c.cancel, p = c.editor.editorTitle; return l += '<div data-role="view" class="k-popup-edit-form k-scheduler-edit-form k-mobile-list" id="edit" ' + M.attr("uid") + '="' + t.uid + '"><div data-role="header" class="k-header"><a href="#" class="k-button k-scheduler-cancel">' + h + "</a>" + p + '<a href="#" class="k-button k-scheduler-update">' + d + "</a></div>", n = this.fields(y.mobile, t), i = this, r = [], l += this._buildEditTemplate(t, n, r), !t.isNew() && this.options.editable && this.options.editable.destroy !== !1 && (l += '<div class="k-edit-buttons"><a href="#" class="k-scheduler-delete k-button">' + u + "</a></div>"), l += "</div>", o = s.append(l), a = this.container = o.element, this.editable = a.kendoEditable({ fields: r, model: t, clearContainer: !1, target: i.options.target, validateOnBlur: !0 }).data("kendoEditable"), a.find("input[type=checkbox],input[type=radio]").parent(".k-edit-field").addClass("k-check").prev(".k-edit-label").addClass("k-check").click(function() { e(this).next().children("input").click() }), this.trigger("edit", { container: a, model: t }) ? this.trigger("cancel", { container: a, model: t }) : (a.on(J + Z, "a.k-scheduler-edit, a.k-scheduler-cancel, a.k-scheduler-update, a.k-scheduler-delete", function(n) { var r, o; n.preventDefault(), n.stopPropagation(), r = e(this), r.hasClass("k-scheduler-edit") ? s.navigate("#edit", i.options.animations.right) : (o = "cancel", r.hasClass("k-scheduler-update") ? o = "save" : r.hasClass("k-scheduler-delete") && (o = "remove"), i.trigger(o, { container: a, model: t })) }), s.navigate(o, i.options.animations.left), t.bind("change", i.toggleDateValidationHandler)), this.editable }, _views: function() { return this.pane.element.find(M.roleSelector("view")).not(this.view.element) }, close: function() { var e, t, n, i; if (this.container) { for (this.pane.navigate("", this.options.animations.right), e = this._views(), n = 0, i = e.length; i > n; n++) t = e.eq(n).data("kendoMobileView"), t && t.purge(); e.remove(), this.container = null, this.editable && (this.editable.options.model.unbind("change", this.toggleDateValidationHandler), this.editable.destroy(), this.editable = null), this.timezoneView = null } } }), C = k.extend({ destroy: function() { this.close(), this.unbind() }, editEvent: function(t) { var n, i, r, o = this, a = o.options.editable, s = "<div " + M.attr("uid") + '="' + t.uid + '" class="k-popup-edit-form k-scheduler-edit-form"><div class="k-edit-form-container">', l = o.options.messages, c = l.save, d = l.cancel, u = l.destroy, h = this.fields(y.desktop, t), p = []; return s += this._buildEditTemplate(t, h, p), i = $(a) ? a.window : {}, s += '<div class="k-edit-buttons k-state-default">', s += this.createButton({ name: "update", text: c, attr: n }) + this.createButton({ name: "canceledit", text: d, attr: n }), t.isNew() || a.destroy === !1 || (s += this.createButton({ name: "delete", text: u, attr: n })), s += "</div></div></div>", r = this.container = e(s).appendTo(o.element).eq(0).kendoWindow(Y({ modal: !0, resizable: !1, draggable: !0, title: l.editor.editorTitle, visible: !1, close: function(e) { e.userTriggered && o.trigger(tt, { container: r, model: t }) && e.preventDefault() } }, i)), o.editable = r.kendoEditable({ fields: p, model: t, clearContainer: !1, validateOnBlur: !0, target: o.options.target }).data("kendoEditable"), o.trigger(ot, { container: r, model: t }) ? o.trigger(tt, { container: r, model: t }) : (r.data("kendoWindow").center().open(), r.on(J + Z, "a.k-scheduler-cancel", function(e) { e.preventDefault(), e.stopPropagation(), o.trigger(tt, { container: r, model: t }) }), r.on(J + Z, "a.k-scheduler-update", function(e) { e.preventDefault(), e.stopPropagation(), o.trigger("save", { container: r, model: t }) }), r.on(J + Z, "a.k-scheduler-delete", function(e) { e.preventDefault(), e.stopPropagation(), o.trigger(nt, { container: r, model: t }) }), M.cycleForm(r), t.bind("change", o.toggleDateValidationHandler)), o.editable }, close: function() { var e = this, t = function() { e.editable && (e.editable.options.model.unbind("change", e.toggleDateValidationHandler), e.editable.destroy(), e.editable = null, e.container = null), e.popup && (e.popup.destroy(), e.popup = null) }; e.editable ? (e._timezonePopup && e._timezonePopup.data("kendoWindow") && (e._timezonePopup.data("kendoWindow").destroy(), e._timezonePopup = null), e.container.is(":visible") ? e.container.data("kendoWindow").bind("deactivate", t).close() : t()) : t() }, _createEndTimezoneButton: function() { var e = this.options.messages, t = ""; return t += '<div class="k-edit-buttons k-state-default">', t += this.createButton({ name: "savetimezone", text: e.save }) + this.createButton({ name: "canceltimezone", text: e.cancel }), t += "</div></div></div>" }, showDialog: function(t) { var n, i, r, o = M.format("<div class='k-popup-edit-form'><div class='k-edit-form-container'><p class='k-popup-message'>{0}</p>", t.text); for (o += '<div class="k-edit-buttons k-state-default">', n = 0; t.buttons.length > n; n++) o += this.createButton(t.buttons[n]); o += "</div></div></div>", i = this.element, this.popup && this.popup.destroy(), r = this.popup = e(o).appendTo(i).eq(0).on("click", ".k-button", function(n) { n.preventDefault(), r.close(); var i = e(n.currentTarget).index(); t.buttons[i].click() }).kendoWindow({ modal: !0, resizable: !1, draggable: !1, title: t.title, visible: !1, close: function() { this.destroy(), i.focus() } }).getKendoWindow(), r.center().open() }, _initTimezoneEditor: function(e, t) { var n, i = this, r = i.container.find(".k-scheduler-timezones"), o = r.find(".k-timezone-toggle"), a = r.find(".k-edit-label:last").add(r.find(".k-edit-field:last")), s = r.find(".k-scheduler-savetimezone"), l = r.find(".k-scheduler-canceltimezone"), c = i._timezonePopup, d = function(t) { if ("startTimezone" === t.field) { var n = e.startTimezone; o.prop("disabled", !n), n || (a.hide(), e.set("endTimezone", ""), o.prop("checked", !1)) } }; i._startTimezone = e.startTimezone, i._endTimezone = e.endTimezone, c || (i._timezonePopup = c = r.kendoWindow({ modal: !0, resizable: !1, draggable: !0, title: i.options.messages.editor.timezoneEditorTitle, visible: !1, close: function(n) { e.unbind("change", d), n.userTriggered && i._revertTimezones(e), t && t.focus() } }), o.click(function() { a.toggle(o.prop("checked")), e.set("endTimezone", "") }), s.click(function(e) { e.preventDefault(), n.close() }), l.click(function(t) { t.preventDefault(), i._revertTimezones(e), n.close() }), e.bind("change", d)), o.prop("checked", e.endTimezone).prop("disabled", !e.startTimezone), e.endTimezone ? a.show() : a.hide(), n = c.data("kendoWindow"), n.center().open() } }), S = U.extend({ init: function(t, n) { var i = this; V.fn.init.call(i, t, n), i.options.views && i.options.views.length || (i.options.views = ["day", "week"]), i.resources = [], i._initModel(), i._wrapper(), i._views(), i._toolbar(), i._dataSource(), i._resources(), i._resizeHandler = function() { i.resize() }, i.wrapper.on("mousedown" + Z + " selectstart" + Z, function(t) { e(t.target).is(":kendoFocusable") || t.preventDefault() }), i.options.editable && i.options.editable.resize !== !1 && i._resizable(), i._movable(), i._bindResize(), i.options.messages && i.options.messages.recurrence && (L.options = i.options.messages.recurrence), i._selectable(), i._ariaId = M.guid(), i._createEditor() }, _bindResize: function() { e(window).on("resize" + Z, this._resizeHandler) }, _unbindResize: function() { e(window).off("resize" + Z, this._resizeHandler) }, dataItems: function() { var n, i, r, o, a, s = this, l = s.items(), c = s._data, d = e.map(l, function(t) { return e(t).attr("data-uid") }), u = {}, h = d.length; for (n = 0; h > n; n++) u[d[n]] = null; for (r = c.length, n = 0; r > n; n++) o = c[n], u[o.uid] !== t && (u[o.uid] = o); a = []; for (i in u) a.push(u[i]); return a }, _isMobile: function() { var e = this.options; return e.mobile === !0 && M.support.mobileOS || "phone" === e.mobile || "tablet" === e.mobile }, _isMobilePhoneView: function() { var e = this.options; return e.mobile === !0 && M.support.mobileOS && !M.support.mobileOS.tablet || "phone" === e.mobile }, _groupsByResource: function(e, t, n, i, r) { var o, a, s, l, c, d, u; if (n || (n = []), o = e[0]) { for (s = o.dataSource.view(), l = 0, c = 0; s.length > c; c++) d = M.getter(o.dataValueField)(s[c]), u = t + l + c, a = this._groupsByResource(e.slice(1), u, n, d, o.field), a[o.field] = d, l = a.groupIndex, r && i && (a[r] = i), 1 === e.length && (a.groupIndex = t + c, n.push(a)); return a } return {} }, data: function() { return this._data }, select: function(n) { var i, r, o, a, s, l, c, d, u, h, p = this, f = p.view(), g = p._selection, m = f.groups; if (n === t) return o = f._selectedSlots, g ? (g && g.events && (r = p._selectedEvents()), { start: g.start, end: g.end, events: r, slots: o, resources: f._resourceBySlot(g) }) : []; if (!n) return p._selection = null, f.clearSelection(), t; if (e.isArray(n) && (n = { events: n.splice(0) }), n.resources) { s = [], l = [], f.groupedResources && p._groupsByResource(f.groupedResources, 0, l); for (a in n.resources) s.push({ field: a, operator: "eq", value: n.resources[a] }); i = new M.data.Query(l).filter(s).toArray() } return n.events && n.events.length ? (p._selectEvents(n.events, i), p._select(), t) : (m && n.start && n.end && (c = H(f._startDate), d = M.date.addDays(H(f._endDate), 1), d > n.start && n.end >= c && (u = i && i.length ? m[i[0].groupIndex] : m[0], h = u.ranges(n.start, n.end, n.isAllDay, !1), h.length && (p._selection = { start: M.timezone.toLocalDate(h[0].start.start), end: M.timezone.toLocalDate(h[h.length - 1].end.end), groupIndex: h[0].start.groupIndex, index: h[0].start.index, isAllDay: h[0].start.isDaySlot, events: [] }, p._select()))), t) }, _selectEvents: function(e, t) { var n, i, r, o, a, s, l, c, d = this, u = d.view(), h = u.groups, p = e.length, f = t && t.length; for (n = 0; p > n; n++) if (h && f) { for (i = h[t[0].groupIndex], r = [], o = i.timeSlotCollectionCount(), a = i.daySlotCollectionCount(), s = 0; o > s; s++) r = r.concat(i.getTimeSlotCollection(s).events()); for (l = 0; a > l; l++) r = r.concat(i.getDaySlotCollection(l).events()); r = new M.data.Query(r).filter({ field: "element[0].getAttribute('data-uid')", operator: "eq", value: e[n] }).toArray(), r[0] && d._createSelection(r[0].element) } else c = u.element.find(M.format(".k-event[data-uid={0}], .k-task[data-uid={0}]", e[n])), c.length && d._createSelection(c[0]) }, _selectable: function() { var t, n = this, i = n.wrapper, r = M.support.mobileOS ? "touchend" : "mousedown"; n.options.selectable && (n._tabindex(), i.on(r + Z, ".k-scheduler-header-all-day td, .k-scheduler-content td, .k-event", function(e) { var t = e.which, r = e.button, o = M.support.browser, a = t && 3 === t || r && 2 == r; M.support.mobileOS && e.isDefaultPrevented() || (a || n._createSelection(e.currentTarget), i.focus(), o.msie && 9 > o.version && setTimeout(function() { i.focus() })) }), t = e.proxy(n._mouseMove, n), i.on("mousedown" + Z, ".k-scheduler-header-all-day td, .k-scheduler-content td", function(e) { var n = e.which, r = e.button, o = n && 3 === n || r && 2 == r; o || i.on("mousemove" + Z, ".k-scheduler-header-all-day td, .k-scheduler-content td", t) }), i.on("mouseup" + Z + " mouseleave" + Z, function() { i.off("mousemove" + Z, ".k-scheduler-header-all-day td, .k-scheduler-content td", t) }), i.on("focus" + Z, function() { n._selection || n._createSelection(n.wrapper.find(".k-scheduler-content").find("td:first")), n._select() }), i.on("focusout" + Z, function() { n.view().clearSelection(), n._ctrlKey = n._shiftKey = !1 }), i.on("keydown" + Z, Q(n._keydown, n)), i.on("keyup" + Z, function(e) { n._ctrlKey = e.ctrlKey, n._shiftKey = e.shiftKey })) }, _select: function() { var t, n, i, r, o, a = this, s = a.view(), l = a.wrapper, c = s.current(), d = a._selection; if (c && (c.removeAttribute("id"), c.removeAttribute("aria-label"), l.removeAttr("aria-activedescendant")), s.select(d), c = s.current(), c && a._old !== c) { if (t = e(c).data("uid"), a._old && t && t === e(a._old).data("uid")) return; i = d, r = a._selectedEvents(), o = s._selectedSlots, r[0] ? (i = r[0] || d, n = M.format(a.options.messages.ariaEventLabel, i.title, i.start, i.start)) : n = M.format(a.options.messages.ariaSlotLabel, i.start, i.end), c.setAttribute("id", a._ariaId), c.setAttribute("aria-label", n), l.attr("aria-activedescendant", a._ariaId), a._old = c, a.trigger("change", { start: d.start, end: d.end, events: r, slots: o, resources: s._resourceBySlot(d) }) } }, _selectedEvents: function() { for (var e, t = this._selection.events, n = t.length, i = 0, r = []; n > i; i++) e = this.occurrenceByUid(t[i]), e && r.push(e); return r }, _mouseMove: function(t) { var n = this; clearTimeout(n._moveTimer), n._moveTimer = setTimeout(function() { var i, r, o, a = n.view(), s = n._selection; s && (i = a.selectionByElement(e(t.currentTarget)), i && s.groupIndex === i.groupIndex && (r = i.startDate(), o = i.endDate(), r >= s.end ? s.backward = !1 : s.start >= o && (s.backward = !0), s.backward ? s.start = r : s.end = o, n._select())) }, 5) }, _viewByIndex: function(e) { var t, n = this.views; for (t in n) { if (!e) return t; e-- } }, _keydown: function(t) { var n = this, i = t.keyCode, r = n.view(), o = r.options.editable, a = n._selection, s = t.shiftKey; n._ctrlKey = t.ctrlKey, n._shiftKey = t.shiftKey, i === N.TAB ? r.moveToEvent(a, s) && (n._select(), t.preventDefault()) : o && i === N.ENTER ? a.events.length ? o.update !== !1 && n.editEvent(a.events[0]) : o.create !== !1 && (a.isAllDay && (a = e.extend({}, a, { end: M.date.addDays(a.end, -1) })), n.addEvent(Y({}, a, r._resourceBySlot(a)))) : i === N.DELETE && o !== !1 && o.destroy !== !1 ? n.removeEvent(a.events[0]) : i >= 49 && 57 >= i ? n.view(n._viewByIndex(i - 49)) : r.move(a, i, s) && (r.inRange(a) ? n._select() : n.date(a.start), t.preventDefault()), n._adjustSelectedDate() }, _createSelection: function(t) { var n, i, r; this._selection && (this._ctrlKey || this._shiftKey) || (this._selection = { events: [], groupIndex: 0 }), t = e(t), r = this._selection, t.is(".k-event") && (n = t.attr(M.attr("uid"))), i = this.view().selectionByElement(t), i && (r.groupIndex = i.groupIndex || 0), n && (i = l(this._data, n)), i && i.uid && (n = [i.uid]), this._updateSelection(i, n), this._adjustSelectedDate() }, _updateSelection: function(e, t) { var n, i, r = this._selection; e && r && (n = this.view(), e.uid && (e = n._updateEventForSelection(e)), this._shiftKey && r.start && r.end ? (i = r.end > e.end, r.end = e.endDate ? e.endDate() : e.end, i && n._timeSlotInterval && M.date.setTime(r.end, -n._timeSlotInterval())) : (r.start = e.startDate ? e.startDate() : e.start, r.end = e.endDate ? e.endDate() : e.end), r.isAllDay = "isDaySlot" in e ? e.isDaySlot : e.isAllDay, r.index = e.index, r.events = this._ctrlKey ? r.events.concat(t || []) : t || []) }, options: { name: "Scheduler", date: st, editable: !0, autoBind: !0, snap: !0, mobile: !1, timezone: "", allDaySlot: !0, min: new Date(1900, 0, 1), max: new Date(2099, 11, 31), toolbar: null, messages: { today: "Today", pdf: "Export to PDF", save: "Save", cancel: "Cancel", destroy: "Delete", deleteWindowTitle: "Delete event", ariaSlotLabel: "Selected from {0:t} to {1:t}", ariaEventLabel: "{0} on {1:D} at {2:t}", views: { day: "Day", week: "Week", workWeek: "Work Week", agenda: "Agenda", month: "Month", timeline: "Timeline", timelineWeek: "Timeline Week", timelineWorkWeek: "Timeline Work Week", timelineMonth: "Timeline Month" }, recurrenceMessages: { deleteWindowTitle: "Delete Recurring Item", deleteWindowOccurrence: "Delete current occurrence", deleteWindowSeries: "Delete the series", editWindowTitle: "Edit Recurring Item", editWindowOccurrence: "Edit current occurrence", editWindowSeries: "Edit the series" }, editable: { confirmation: ct }, editor: { title: "Title", start: "Start", end: "End", allDayEvent: "All day event", description: "Description", repeat: "Repeat", timezone: " ", startTimezone: "Start timezone", endTimezone: "End timezone", separateTimezones: "Use separate start and end time zones", timezoneEditorTitle: "Timezones", timezoneEditorButton: "Time zone", timezoneTitle: "Time zones", noTimezone: "No timezone", editorTitle: "Event" } }, height: null, width: null, resources: [], group: { resources: [], direction: "horizontal" }, views: [], selectable: !1 }, events: [nt, ot, tt, it, "add", "dataBinding", "dataBound", "moveStart", "move", "moveEnd", "resizeStart", "resize", "resizeEnd", "navigate", "change"], destroy: function() { var t, n = this; V.fn.destroy.call(n), n.dataSource && (n.dataSource.unbind(et, n._refreshHandler), n.dataSource.unbind("progress", n._progressHandler), n.dataSource.unbind("error", n._errorHandler)), n.calendar && (n.calendar.destroy(), n.popup.destroy()), n.view() && n.view().destroy(), n._editor && n._editor.destroy(), this._moveDraggable && this._moveDraggable.destroy(), this._resizeDraggable && this._resizeDraggable.destroy(), t = n.element.add(n.wrapper).add(n.toolbar).add(n.popup), t.off(Z), clearTimeout(n._moveTimer), n._model = null, n.toolbar = null, n.element = null, e(window).off("resize" + Z, n._resizeHandler), M.destroy(n.wrapper) }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.options.autoBind && e.fetch() }, items: function() { return this.wrapper.find(".k-scheduler-content").children(".k-event, .k-task") }, _movable: function() { var n, i, r, o, a, s, l, c = this, d = 0, u = c._isMobile(), h = c.options.editable && c.options.editable.move !== !1, p = c.options.editable && c.options.editable.resize !== !1; (h || p && u) && (u && M.support.mobileOS.android && (d = 5), c._moveDraggable = new M.ui.Draggable(c.element, { distance: d, filter: ".k-event", ignore: ".k-resize-handle", holdToDrag: u }), h && c._moveDraggable.bind("dragstart", function(e) { var o = c.view(), d = e.currentTarget; return o.options.editable && o.options.editable.move !== !1 ? u && !d.hasClass("k-event-active") ? (c.element.find(".k-event-active").removeClass("k-event-active"), e.preventDefault(), t) : (a = c.occurrenceByUid(d.attr(M.attr("uid"))), s = a.clone(), s.update(o._eventOptionsForMove(s)), n = o._slotByPosition(e.x.startLocation, e.y.startLocation), r = n.startOffset(e.x.startLocation, e.y.startLocation, c.options.snap), i = n, l = n, (!n || c.trigger("moveStart", { event: a })) && e.preventDefault(), t) : (e.preventDefault(), t) }).bind("drag", function(e) { var t, l, d = c.view(), u = d._slotByPosition(e.x.location, e.y.location); u && (o = u.startOffset(e.x.location, e.y.location, c.options.snap), u.isDaySlot !== n.isDaySlot ? (n = d._slotByPosition(e.x.location, e.y.location), r = n.startOffset(e.x.location, e.y.location, c.options.snap), t = o - r, s.isAllDay = u.isDaySlot, s.start = M.timezone.toLocalDate(r), s.end = M.timezone.toLocalDate(o), d._updateMoveHint(s, u.groupIndex, t), l = { start: s.start, end: s.end }) : (t = o - r, d._updateMoveHint(s, u.groupIndex, t), l = w(s, t)), c.trigger("move", { event: a, slot: { element: u.element, start: u.startDate(), end: u.endDate(), isDaySlot: u.isDaySlot }, resources: d._resourceBySlot(u), start: l.start, end: l.end }) ? d._updateMoveHint(s, u.groupIndex, t) : i = u) }).bind("dragend", function(t) { var d, u, h, p, f, g, m, v, _; c.view()._removeMoveHint(), d = o - r, u = w(s, d), h = u.start, p = u.end, f = c.view()._resourceBySlot(i), g = c.view()._resourceBySlot(n), m = c.trigger("moveEnd", { event: a, slot: { element: i.element, start: i.startDate(), end: i.endDate() }, start: h, end: p, resources: f }), m || a.start.getTime() === h.getTime() && a.end.getTime() === p.getTime() && l.isDaySlot === i.isDaySlot && M.stringify(f) === M.stringify(g) || (v = c.view()._eventOptionsForMove(a), _ = l.isDaySlot !== i.isDaySlot ? i.isDaySlot ? e.extend({ start: i.startDate(), end: i.startDate(), isAllDay: i.isDaySlot }, v, f) : e.extend({ isAllDay: i.isDaySlot, start: h, end: p }, v, f) : e.extend({ isAllDay: a.isAllDay, start: h, end: p }, v, f), c._updateEvent(null, a, _)), t.currentTarget.removeClass("k-event-active"), this.cancelHold() }).bind("dragcancel", function() { c.view()._removeMoveHint(), this.cancelHold() }), u && (c._moveDraggable.bind("hold", function(e) { c.element.find(".k-scheduler-monthview").length && e.preventDefault(), c.element.find(".k-event-active").removeClass("k-event-active"), e.currentTarget.addClass("k-event-active") }), c._moveDraggable.userEvents.bind("press", function(e) { e.preventDefault() }))) }, _resizable: function() { function t(e) { var t, n = { "k-resize-e": "east", "k-resize-w": "west", "k-resize-n": "north", "k-resize-s": "south" }; for (t in n) if (e.hasClass(t)) return n[t] } var n, i, r, o, a, s = this, l = 0; s._isMobile() && M.support.mobileOS.android && (l = 5), s._resizeDraggable = new M.ui.Draggable(s.element, { distance: l, filter: ".k-resize-handle", dragstart: function(t) { var l = e(t.currentTarget), c = l.closest(".k-event"), d = c.attr(M.attr("uid")), u = s.view(); r = s.occurrenceByUid(d), o = r.clone(), u._updateEventForResize(o), a = u._slotByPosition(t.x.startLocation, t.y.startLocation), s.trigger("resizeStart", { event: r }) && t.preventDefault(), n = M.date.toUtcTime(o.start), i = M.date.toUtcTime(o.end) }, drag: function(l) { var c, d, u, h, p, f; a && (c = e(l.currentTarget), d = t(c), u = s.view(), h = u._slotByPosition(l.x.location, l.y.location), h && a.groupIndex == h.groupIndex && (a = h, p = n, f = i, "south" == d ? !a.isDaySlot && a.end - M.date.toUtcTime(o.start) >= u._timeSlotInterval() && (i = o.isAllDay ? a.startOffset(l.x.location, l.y.location, s.options.snap) : a.endOffset(l.x.location, l.y.location, s.options.snap)) : "north" == d ? !a.isDaySlot && M.date.toUtcTime(o.end) - a.start >= u._timeSlotInterval() && (n = a.startOffset(l.x.location, l.y.location, s.options.snap)) : "east" == d ? a.isDaySlot && M.date.toUtcTime(M.date.getDate(a.endDate())) >= M.date.toUtcTime(M.date.getDate(o.start)) ? i = o.isAllDay ? a.startOffset(l.x.location, l.y.location, s.options.snap) : a.endOffset(l.x.location, l.y.location, s.options.snap) : !a.isDaySlot && a.end - M.date.toUtcTime(o.start) >= u._timeSlotInterval() && (i = a.endOffset(l.x.location, l.y.location, s.options.snap)) : "west" == d && (a.isDaySlot && M.date.toUtcTime(M.date.getDate(o.end)) >= M.date.toUtcTime(M.date.getDate(a.startDate())) ? n = a.startOffset(l.x.location, l.y.location, s.options.snap) : !a.isDaySlot && M.date.toUtcTime(o.end) - a.start >= u._timeSlotInterval() && (n = a.startOffset(l.x.location, l.y.location, s.options.snap))), s.trigger("resize", { event: r, slot: { element: a.element, start: a.startDate(), end: a.endDate() }, start: M.timezone.toLocalDate(n), end: M.timezone.toLocalDate(i), resources: u._resourceBySlot(a) }) ? (n = p, i = f) : u._updateResizeHint(o, a.groupIndex, n, i))) }, dragend: function(l) { var c, d = e(l.currentTarget), u = new Date(o.start.getTime()), h = new Date(o.end.getTime()), p = t(d); s.view()._removeResizeHint(), "south" == p ? h = M.timezone.toLocalDate(i) : "north" == p ? u = M.timezone.toLocalDate(n) : "east" == p ? h = a.isDaySlot ? M.date.getDate(M.timezone.toLocalDate(i)) : M.timezone.toLocalDate(i) : "west" == p && (a.isDaySlot ? (u = new Date(M.timezone.toLocalDate(n)), u.setHours(0), u.setMinutes(0)) : u = M.timezone.toLocalDate(n)), c = s.trigger("resizeEnd", { event: r, slot: { element: a.element, start: a.startDate(), end: a.endDate() }, start: u, end: h, resources: s.view()._resourceBySlot(a) }), !c && h.getTime() >= u.getTime() && (o.start.getTime() != u.getTime() || o.end.getTime() != h.getTime()) && (s.view()._updateEventForResize(r), s._updateEvent(p, r, { start: u, end: h })), a = null, r = null }, dragcancel: function() { s.view()._removeResizeHint(), a = null, r = null } }) }, _updateEvent: function(e, t, n) { var i, r = this, o = function(e, t) { try { r._preventRefresh = !0, e.update(n), r._convertDates(e) } finally { r._preventRefresh = !1 } r.trigger(it, { event: e }) || (t && t(), r._updateSelection(e), r.dataSource.sync()) }, a = function(e) { return e.recurrenceRule ? r.dataSource.getByUid(e.uid) : r.dataSource.get(e.recurrenceId) }, s = function() { var i, s, l = a(t); ("south" == e || "north" == e) && (n.start && (i = M.date.getDate(l.start), M.date.setTime(i, B(n.start)), n.start = i), n.end && (s = M.date.getDate(l.end), M.date.setTime(s, B(n.end)), n.end = s)), r.dataSource._removeExceptions(l), o(l) }, l = function() { var e = a(t), n = function() { r._convertDates(e) }, i = e.toOccurrence({ start: t.start, end: t.end }); o(r.dataSource.add(i), n) }; t.recurrenceRule || t.isOccurrence() ? (i = r.options.messages.recurrenceMessages, r._showRecurringDialog(t, l, s, { title: i.editWindowTitle, text: i.editRecurring ? i.editRecurring : ut, occurrenceText: i.editWindowOccurrence, seriesText: i.editWindowSeries })) : o(r.dataSource.getByUid(t.uid)) }, _modelForContainer: function(t) { return t = e(t).closest("[" + M.attr("uid") + "]"), this.dataSource.getByUid(t.attr(M.attr("uid"))) }, showDialog: function(e) { this._editor.showDialog(e) }, focus: function() { this.wrapper.focus() }, _confirmation: function(e, t) { var n, i, r, o, a, s = this.options.editable; s === !0 || s.confirmation !== !1 ? (n = this.options.messages, i = n.deleteWindowTitle, r = typeof s.confirmation === W ? s.confirmation : n.editable.confirmation, this._isEditorOpened() && t.isRecurring() && (o = this.options.messages.recurrenceMessages, i = o.deleteWindowTitle, r = t.isException() ? o.deleteRecurringConfirmation ? o.deleteRecurringConfirmation : ht : o.deleteSeriesConfirmation ? o.deleteSeriesConfirmation : pt), a = [{ name: "destroy", text: n.destroy, click: function() { e() } }], this._isMobile() && M.mobile.ui.Pane || a.push({ name: "canceledit", text: n.cancel, click: function() { e(!0) } }), this._unbindResize(), this.showDialog({ model: t, text: r, title: i, buttons: a }), this._bindResize()) : e() }, addEvent: function(e) { var t, n, i = this._editor.editable, r = this.dataSource; e = e || {}, n = this.trigger("add", { event: e }), !n && (i && i.end() || !i) && (this.cancelEvent(), e && e.toJSON && (e = e.toJSON()), t = r.add(e), t && (this.cancelEvent(), this._editEvent(t))) }, saveEvent: function() { var e, t, n, i = this._editor; i && (e = i.editable, t = i.container, n = this._modelForContainer(t), t && e && e.end() && !this.trigger(it, { container: t, event: n }) && (n.isRecurrenceHead() && this.dataSource._removeExceptions(n), n.dirty || n.isOccurrence() || this._convertDates(n, "remove"), this.dataSource.sync())) }, cancelEvent: function() { var e, t = this._editor, n = t.container; n && (e = this._modelForContainer(n), e && e.isOccurrence() && (this._convertDates(e, "remove"), this._convertDates(this.dataSource.get(e.recurrenceId), "remove")), this.dataSource.cancelChanges(e), t.close()) }, editEvent: function(e) { var t = "string" == typeof e ? this.occurrenceByUid(e) : e; t && (this.cancelEvent(), t.isRecurring() ? this._editRecurringDialog(t) : this._editEvent(t)) }, _editEvent: function(e) { this._unbindResize(), this._createPopupEditor(e), this._bindResize() }, _editRecurringDialog: function(e) { var t = this, n = function() { e.isException() ? t._editEvent(e) : t.addEvent(e) }, i = function() { e.recurrenceId && (e = t.dataSource.get(e.recurrenceId)), t._editEvent(e) }, r = t.options.messages.recurrenceMessages; t._showRecurringDialog(e, n, i, { title: r.editWindowTitle, text: r.editRecurring ? r.editRecurring : ut, occurrenceText: r.editWindowOccurrence, seriesText: r.editWindowSeries }) }, _showRecurringDialog: function(e, t, n, i) { var r = this, o = r.options.editable, a = $(o) ? o.editRecurringMode : "dialog"; "series" === a ? n() : "occurrence" === a ? t() : (this._unbindResize(), r.showDialog({ model: e, title: i.title, text: i.text, buttons: [{ text: i.occurrenceText, click: t }, { text: i.seriesText, click: n }] }), this._bindResize()) }, _createButton: function(e) { var t = e.template || ft, n = typeof e === W ? e : e.name || e.text, i = { className: "k-scheduler-" + (n || "").replace(/\s/g, ""), text: n, attr: "" }; if (!(n || $(e) && e.template)) throw Error("Custom commands should have name specified"); return $(e) ? (e.className && (e.className += " " + i.className), "edit" === n && $(e.text) && (e = Y(!0, {}, e), e.text = e.text.edit), i = Y(!0, i, b[n], e)) : i = Y(!0, i, b[n]), M.template(t)(i) }, _convertDates: function(e, t) { var n = this.dataSource.reader.timezone, i = e.startTimezone, r = e.endTimezone, o = e.start, a = e.start; t = t || "apply", i = i || r, r = r || i, i && (n ? "apply" === t ? (o = M.timezone.convert(e.start, n, i), a = M.timezone.convert(e.end, n, r)) : (o = M.timezone.convert(e.start, i, n), a = M.timezone.convert(e.end, r, n)) : (o = M.timezone[t](e.start, i), a = M.timezone[t](e.end, r)), e._set("start", o), e._set("end", a)) }, _createEditor: function() { var e, n = this; e = n._editor = this._isMobile() && M.mobile.ui.Pane ? new x(this.wrapper, Y({}, this.options, { target: this, timezone: n.dataSource.reader.timezone, resources: n.resources, createButton: Q(this._createButton, this) })) : new C(this.wrapper, Y({}, this.options, { target: this, createButton: Q(this._createButton, this), timezone: n.dataSource.reader.timezone, resources: n.resources })), e.bind("cancel", function(e) { return n.trigger("cancel", { container: e.container, event: e.model }) ? (e.preventDefault(), t) : (n.cancelEvent(), n.focus(), t) }), e.bind("edit", function(e) { n.trigger(ot, { container: e.container, event: e.model }) && e.preventDefault() }), e.bind("save", function() { n.saveEvent() }), e.bind("remove", function(e) { n.removeEvent(e.model) }) }, _createPopupEditor: function(e) { var t = this._editor; (!e.isNew() || e.isOccurrence()) && (e.isOccurrence() && this._convertDates(e.recurrenceId ? this.dataSource.get(e.recurrenceId) : e), this._convertDates(e)), this.editable = t.editEvent(e) }, removeEvent: function(e) { var t = this, n = "string" == typeof e ? t.occurrenceByUid(e) : e; n && (n.isRecurring() ? t._deleteRecurringDialog(n) : t._confirmation(function(e) { e || t._removeEvent(n) }, n)) }, occurrenceByUid: function(e) { var t = this.dataSource.getByUid(e); return t || (t = l(this._data, e)), t }, occurrencesInRange: function(e, t) { return new M.data.Query(this._data).filter({ logic: "or", filters: [{ logic: "and", filters: [{ field: "start", operator: "gte", value: e }, { field: "end", operator: "gte", value: e }, { field: "start", operator: "lt", value: t }] }, { logic: "and", filters: [{ field: "start", operator: "lte", value: e }, { field: "end", operator: "gt", value: e }] }] }).toArray() }, _removeEvent: function(e) { this.trigger(nt, { event: e }) || this.dataSource.remove(e) && this.dataSource.sync() }, _deleteRecurringDialog: function(e) { var t, n, i, r, o, a = this, s = e, l = a.options.editable, c = $(l) ? l.editRecurringMode : "dialog", d = function() { var e = s.recurrenceId ? s : s.toOccurrence(), t = a.dataSource.get(e.recurrenceId); a._convertDates(t), a._removeEvent(e) }, u = function() { s.recurrenceId && (s = a.dataSource.get(s.recurrenceId)), a._removeEvent(s) }; ("dialog" != c || a._isEditorOpened()) && (t = function() { a._confirmation(function(e) { e || d() }, s) }, n = function() { a._confirmation(function(e) { e || u() }, s) }), i = n || u, r = t || d, a._isEditorOpened() ? e.isException() ? r() : i() : (o = a.options.messages.recurrenceMessages, a._showRecurringDialog(e, r, i, { title: o.deleteWindowTitle, text: o.deleteRecurring ? o.deleteRecurring : dt, occurrenceText: o.deleteWindowOccurrence, seriesText: o.deleteWindowSeries })) }, _isEditorOpened: function() { return !!this._editor.container }, _unbindView: function(e) { var t = this; t.angular("cleanup", function() { return { elements: t.items() } }), e.destroy() }, _bindView: function(e) { var t = this; t.options.editable && (t._viewRemoveHandler && e.unbind(nt, t._viewRemoveHandler), t._viewRemoveHandler = function(e) { t.removeEvent(e.uid) }, e.bind(nt, t._viewRemoveHandler), t._viewAddHandler && e.unbind(rt, t._viewAddHandler), t._viewAddHandler = function(e) { t.addEvent(e.eventInfo) }, e.bind(rt, this._viewAddHandler), t._viewEditHandler && e.unbind(ot, t._viewEditHandler), t._viewEditHandler = function(e) { t.editEvent(e.uid) }, e.bind(ot, this._viewEditHandler)), t._viewNavigateHandler && e.unbind("navigate", t._viewNavigateHandler), t._viewNavigateHandler = function(e) { var n, i; e.view && (n = "isWorkDay" in e, i = n ? "changeWorkDay" : "changeView", t.trigger("navigate", { view: e.view, isWorkDay: e.isWorkDay, action: i, date: e.date }) || (n && (t._workDayMode = e.isWorkDay), t._selectView(e.view), t.date(e.date))) }, e.bind("navigate", t._viewNavigateHandler), t._viewActivateHandler && e.unbind("activate", t._viewActivateHandler), t._viewActivateHandler = function() { var e = this; t._selection && (e.constrainSelection(t._selection), t._select(), t._adjustSelectedDate()) }, e.bind("activate", t._viewActivateHandler) }, _selectView: function(e) { var t, n, i, r = this; e && r.views[e] && (r._selectedView && r._unbindView(r._selectedView), r._selectedView = r._renderView(e), r._selectedViewName = e, r._viewsCount > 1 && (t = gt({ views: r.views, view: e, ns: M.ns }), n = r.toolbar.find(".k-scheduler-views li:first-child"), n.is(".k-current-view") ? n.replaceWith(t) : r.toolbar.find(".k-scheduler-views").prepend(t), i = r.toolbar.find(".k-scheduler-views li").removeClass("k-state-selected"), i.end().find(".k-view-" + e.replace(/\./g, "\\.").toLowerCase()).addClass("k-state-selected"))) }, view: function(e) { var n = this; return e ? (n._selectView(e), n.rebind(), t) : n._selectedView }, viewName: function() { return this.view().name }, _renderView: function(e) { var t = this._initializeView(e); return this._bindView(t), this._model.set("formattedDate", t.dateForTitle()), this._model.set("formattedShortDate", t.shortDateForTitle()), t }, resize: function(e) { var t = this.getSize(), n = this._size, i = this.view(); i && i.groups && (e || !n || t.width !== n.width || t.height !== n.height) && (this.refresh({ action: "resize" }), this._size = t) }, _adjustSelectedDate: function() { var e = this._model.selectedDate, t = this._selection, n = t.start; n && !M.date.isInDateRange(e, H(n), H(t.end)) && e.setFullYear(n.getFullYear(), n.getMonth(), n.getDate()) }, _initializeView: function(e) { var t, n, i = this.views[e]; if (i) { if (t = $(i), n = i.type, typeof n === W && (n = M.getter(i.type)(window)), !n) throw Error("There is no such view"); i = new n(this.wrapper, h(Y(!0, {}, this.options, t ? i : {}, { resources: this.resources, date: this.date(), showWorkHours: this._workDayMode }))) } return i }, _views: function() { var e, t, n, i, r, o, a, s, l, c = this.options.views; for (this.views = {}, this._viewsCount = 0, a = 0, s = c.length; s > a; a++) l = !1, e = c[a], i = $(e), i ? (o = r = e.type ? e.type : e, typeof o !== W && (r = e.title, l = !0)) : o = r = e, t = T[r], t && !l && (e.type = t.type, t.title = this.options.messages.views[r], "day" === t.type ? t.messages = { allDay: this.options.messages.allDay } : "agenda" === t.type && (t.messages = { event: this.options.messages.event, date: this.options.messages.date, time: this.options.messages.time })), e = Y({ title: r }, t, i ? e : {}), r && (this.views[r] = e, this._viewsCount++, (!n || e.selected) && (n = r)); n && (this._selectedViewName = n) }, rebind: function() { this.dataSource.fetch() }, _dataSource: function() { var e = this, t = e.options, n = t.dataSource; n = X(n) ? { data: n } : n, !t.timezone || n instanceof At ? n instanceof At && (t.timezone = n.options.schema ? n.options.schema.timezone : "") : n = Y(!0, n, { schema: { timezone: t.timezone } }), e.dataSource && e._refreshHandler ? e.dataSource.unbind(et, e._refreshHandler).unbind("progress", e._progressHandler).unbind("error", e._errorHandler) : (e._refreshHandler = Q(e.refresh, e), e._progressHandler = Q(e._requestStart, e), e._errorHandler = Q(e._error, e)), e.dataSource = M.data.SchedulerDataSource.create(n).bind(et, e._refreshHandler).bind("progress", e._progressHandler).bind("error", e._errorHandler), e.options.dataSource = e.dataSource }, _error: function() { this._progress(!1) }, _requestStart: function() { this._progress(!0) }, _progress: function(e) { var t = this.element.find(".k-scheduler-content"); M.ui.progress(t, e) }, _resources: function() { var t, n, i, r, o, a = this, s = a.options.resources; for (t = 0; s.length > t; t++) { if (n = s[t], i = n.field, r = n.dataSource, !i || !r) throw Error('The "field" and "dataSource" options of the scheduler resource are mandatory.'); a.resources.push({ field: i, name: n.name || i, title: n.title || i, dataTextField: n.dataTextField || "text", dataValueField: n.dataValueField || "value", dataColorField: n.dataColorField || "color", valuePrimitive: null != n.valuePrimitive ? n.valuePrimitive : !0, multiple: n.multiple || !1, dataSource: M.data.DataSource.create(r) }) } o = e.map(a.resources, function(e) { return e.dataSource.fetch() }), e.when.apply(null, o).then(function() { a.options.autoBind ? a.view(a._selectedViewName) : a._selectView(a._selectedViewName) }) }, _initModel: function() { var e = this; e._model = M.observable({ selectedDate: new Date(this.options.date), formattedDate: "", formattedShortDate: "" }), e._model.bind("change", function(t) { "selectedDate" === t.field && e.view(e._selectedViewName) }) }, _wrapper: function() { var e = this, t = e.options, n = t.height, i = t.width; e.wrapper = e.element.addClass("k-widget k-scheduler k-floatwrap").attr("role", "grid").attr("aria-multiselectable", !0), e._isMobile() && e.wrapper.addClass("k-scheduler-mobile"), e._isMobilePhoneView() && e.wrapper.addClass("k-scheduler-phone"), n && e.wrapper.height(n), i && e.wrapper.width(i) }, date: function(e) { return null != e && H(e) >= H(this.options.min) && H(e) <= H(this.options.max) && this._model.set("selectedDate", e), H(this._model.get("selectedDate")) }, _toolbar: function() { var n, i, r = this, o = r.options, a = []; o.toolbar && (a = e.isArray(o.toolbar) ? o.toolbar : [o.toolbar]), n = this._isMobilePhoneView() ? vt : mt, i = e(n({ messages: o.messages, pdf: e.grep(a, function(e) { return "pdf" == e || "pdf" == e.name }).length > 0, ns: M.ns, views: r.views, viewsCount: r._viewsCount })), r.wrapper.append(i), r.toolbar = i, M.bind(r.toolbar, r._model), i.on(J + Z, ".k-pdf", function(e) { e.preventDefault(), r.saveAsPDF() }), i.on(J + Z, ".k-scheduler-navigation li", function(n) { var i = e(this), o = new Date(r.date()), a = ""; if (n.preventDefault(), i.hasClass("k-nav-today")) a = "today", o = new Date; else if (i.hasClass("k-nav-next")) a = "next", o = r.view().nextDate(); else if (i.hasClass("k-nav-prev")) a = "previous", o = r.view().previousDate(); else if (i.hasClass("k-nav-current") && !r._isMobilePhoneView()) return r._showCalendar(), t; r.trigger("navigate", { view: r._selectedViewName, action: a, date: o }) || r.date(o) }), i.on(J + Z, ".k-scheduler-views li, .k-scheduler-refresh", function(t) { t.preventDefault(); var n = e(this).attr(M.attr("name")); r.trigger("navigate", { view: n, action: "changeView", date: r.date() }) || (r.view(n), r.element.find(".k-state-expanded").removeClass("k-state-expanded")) }), i.on(J + Z, ".k-scheduler-views li.k-current-view", function() { r.element.find(".k-scheduler-views").toggleClass("k-state-expanded") }), i.find("li").hover(function() { e(this).addClass("k-state-hover") }, function() { e(this).removeClass("k-state-hover") }) }, _showCalendar: function() { var t = this, n = t.toolbar.find(".k-nav-current"), i = e('<div class="k-calendar-container"><div class="k-scheduler-calendar"/></div>'); t.popup || (t.popup = new j(i, { anchor: n, activate: function() { t.calendar || (t.calendar = new G(this.element.find(".k-scheduler-calendar"), { change: function() { var e = this.value(); t.trigger("navigate", { view: t._selectedViewName, action: "changeDate", date: e }) || (t.date(e), t.popup.close()) }, min: t.options.min, max: t.options.max })), t.calendar.value(t.date()) }, copyAnchorStyles: !1 })), t.popup.open() }, refresh: function(e) { var t = this, n = this.view(); this._progress(!1), this.angular("cleanup", function() { return { elements: t.items() } }), e = e || {}, n && (e && "itemchange" === e.action && (this._editor.editable || this._preventRefresh) || this.trigger("dataBinding", { action: e.action || "rebind", index: e.index, items: e.items }) || (e && "resize" === e.action || !this._editor || this._editor.close(), this._data = this.dataSource.expand(n.startDate(), n.endDate()), n.render(this._data), this.trigger("dataBound"))) }, slotByPosition: function(e, t) { var n, i = this.view(); return i._slotByPosition ? (n = i._slotByPosition(e, t), n ? { startDate: n.startDate(), endDate: n.endDate(), groupIndex: n.groupIndex, element: n.element, isDaySlot: n.isDaySlot } : null) : null }, slotByElement: function(t) { var n = e(t).offset(); return this.slotByPosition(n.left, n.top) }, resourcesBySlot: function(e) { return this.view()._resourceBySlot(e) } }), T = { day: { type: "kendo.ui.DayView" }, week: { type: "kendo.ui.WeekView" }, workWeek: { type: "kendo.ui.WorkWeekView" }, agenda: { type: "kendo.ui.AgendaView" }, month: { type: "kendo.ui.MonthView" }, timeline: { type: "kendo.ui.TimelineView" }, timelineWeek: { type: "kendo.ui.TimelineWeekView" }, timelineWorkWeek: { type: "kendo.ui.TimelineWorkWeekView" }, timelineMonth: { type: "kendo.ui.TimelineMonthView" } }, O.plugin(S), M.PDFMixin && (M.PDFMixin.extend(S.prototype), D = "k-scheduler-pdf-export", S.fn._drawPDF = function(t) { var n, i, r = this.wrapper, o = r[0].style.cssText; return r.css({ width: r.width(), height: r.height() }), r.addClass(D), this.resize(!0), n = this, i = new e.Deferred, this._drawPDFShadow().done(function(e) { var n = { page: e, pageNumber: 1, progress: 1, totalPages: 1 }; t.notify(n), i.resolve(n.page) }).fail(function(e) { i.reject(e) }).always(function() { r[0].style.cssText = o, r.removeClass(D), n.resize(!0) }), i }), A = V.extend({ init: function(e, t) { var n = this, i = M.timezone.windows_zones; if (!i || !M.timezone.zones_titles) throw Error("kendo.timezones.min.js is not included."); V.fn.init.call(n, e, t), n.wrapper = n.element, n._zonesQuery = new M.data.Query(i), n._zoneTitleId = M.guid(), n._zoneTitlePicker(), n._zonePicker(), n._zoneTitle.bind("cascade", function() { this.value() || n._zone.wrapper.hide() }), n._zone.bind("cascade", function() { n._value = this.value(), n.trigger("change") }), n.value(n.options.value) }, options: { name: "TimezoneEditor", value: "", optionLabel: "No timezone" }, events: ["change"], _zoneTitlePicker: function() { var t = this, n = e('<input id="' + t._zoneTitleId + '"/>').appendTo(t.wrapper); t._zoneTitle = new M.ui.DropDownList(n, { dataSource: M.timezone.zones_titles, dataValueField: "other_zone", dataTextField: "name", optionLabel: t.options.optionLabel }) }, _zonePicker: function() { var t = this, n = e("<input />").appendTo(this.wrapper); t._zone = new M.ui.DropDownList(n, { dataValueField: "zone", dataTextField: "territory", dataSource: t._zonesQuery.data, cascadeFrom: t._zoneTitleId, dataBound: function() { t._value = this.value(), this.wrapper.toggle(this.dataSource.view().length > 1) } }), t._zone.wrapper.hide() }, destroy: function() { V.fn.destroy.call(this), M.destroy(this.wrapper) }, value: function(e) { var n, i = this; return e === t ? i._value : (n = i._zonesQuery.filter({ field: "zone", operator: "eq", value: e }).data[0], n ? (i._zoneTitle.value(n.other_zone), i._zone.value(n.zone)) : i._zoneTitle.select(0), t) } }), O.plugin(A), E = M.template('<option value="#=other_zone#">#=name#</option>'), I = M.template('<option value="#=zone#">#=territory#</option>'), P = V.extend({ init: function(e, t) { var n = this, i = M.timezone.windows_zones; if (!i || !M.timezone.zones_titles) throw Error("kendo.timezones.min.js is not included."); V.fn.init.call(n, e, t), n.wrapper = n.element, n._zonesQuery = new M.data.Query(i), n._zoneTitlePicker(), n._zonePicker(), n.value(n.options.value) }, options: { name: "MobileTimezoneEditor", optionLabel: "No timezone", value: "" }, events: ["change"], _bindZones: function(e) { var t = e ? this._filter(e) : []; this._zone.html(this._options(t, I)) }, _filter: function(e) { return this._zonesQuery.filter({ field: "other_zone", operator: "eq", value: e }).data }, _options: function(e, t, n) { var i = 0, r = "", o = e.length; for (n && (r += t({ other_zone: "", name: n })); o > i; i++) r += t(e[i]); return r }, _zoneTitlePicker: function() { var t = this, n = t._options(M.timezone.zones_titles, E, t.options.optionLabel); t._zoneTitle = e("<select>" + n + "</select>").appendTo(t.wrapper).change(function() { var e = this.value, n = t._zone; t._bindZones(e), e && n[0].children.length > 1 ? n.show() : n.hide(), t._value = n[0].value, t.trigger("change") }) }, _zonePicker: function() { var t = this; t._zone = e('<select style="display:none"></select>').appendTo(this.wrapper).change(function() { t._value = this.value, t.trigger("change") }), t._bindZones(t._zoneTitle.val()), t._value = t._zone[0].value }, destroy: function() { V.fn.destroy.call(this), M.destroy(this.wrapper) }, value: function(e) { var n, i = this, r = i._zone, o = "", a = ""; return e === t ? i._value : (n = i._zonesQuery.filter({ field: "zone", operator: "eq", value: e }).data[0], n && (a = n.zone, o = n.other_zone), i._zoneTitle.val(o), i._bindZones(o), r.val(a), a = r[0].value, a && r[0].children.length > 1 ? r.show() : r.hide(), i._value = a, t) } }), O.plugin(P) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.ui.Widget, i = e.proxy, r = Math.abs, o = 20, a = n.extend({ init: function(e, r) { function o(e) { return function(t) { s._triggerTouch(e, t) } } function a(e) { return function(t) { s.trigger(e, { touches: t.touches, distance: t.distance, center: t.center, event: t.event }) } } var s = this; n.fn.init.call(s, e, r), r = s.options, e = s.element, s.wrapper = e, s.events = new t.UserEvents(e, { filter: r.filter, surface: r.surface, minHold: r.minHold, multiTouch: r.multiTouch, allowSelection: !0, press: o("touchstart"), hold: o("hold"), tap: i(s, "_tap"), gesturestart: a("gesturestart"), gesturechange: a("gesturechange"), gestureend: a("gestureend") }), r.enableSwipe ? (s.events.bind("start", i(s, "_swipestart")), s.events.bind("move", i(s, "_swipemove"))) : (s.events.bind("start", i(s, "_dragstart")), s.events.bind("move", o("drag")), s.events.bind("end", o("dragend"))), t.notify(s) }, events: ["touchstart", "dragstart", "drag", "dragend", "tap", "doubletap", "hold", "swipe", "gesturestart", "gesturechange", "gestureend"], options: { name: "Touch", surface: null, global: !1, multiTouch: !1, enableSwipe: !1, minXDelta: 30, maxYDelta: 20, maxDuration: 1e3, minHold: 800, doubleTapTimeout: 800 }, cancel: function() { this.events.cancel() }, _triggerTouch: function(e, t) { this.trigger(e, { touch: t.touch, event: t.event }) && t.preventDefault() }, _tap: function(e) { var n = this, i = n.lastTap, r = e.touch; i && n.options.doubleTapTimeout > r.endTime - i.endTime && t.touchDelta(r, i).distance < o ? (n._triggerTouch("doubletap", e), n.lastTap = null) : (n._triggerTouch("tap", e), n.lastTap = r) }, _dragstart: function(e) { this._triggerTouch("dragstart", e) }, _swipestart: function(e) { 2 * r(e.x.velocity) >= r(e.y.velocity) && e.sender.capture() }, _swipemove: function(e) { var t = this, n = t.options, i = e.touch, o = e.event.timeStamp - i.startTime, a = i.x.initialDelta > 0 ? "right" : "left"; r(i.x.initialDelta) >= n.minXDelta && r(i.y.initialDelta) < n.maxYDelta && n.maxDuration > o && (t.trigger("swipe", { direction: a, touch: e.touch }), i.cancel()) } }); t.ui.plugin(a) }(window.kendo.jQuery), function(e) { function t(e) { var t, n, i = [], r = e.className; for (t = 0, n = e.level; n > t; t++) i.push(o("span", { className: r })); return i } function n() { var t = i._activeElement(); "body" !== t.nodeName.toLowerCase() && e(t).blur() } var i = window.kendo, r = i.dom, o = r.element, a = r.text, s = i.support.browser, l = i.support.mobileOS, c = i.ui, d = c.Widget, u = e.extend, h = e.map, p = e.isFunction, f = s.msie && 9 > s.version, g = i.keys, m = { title: "Title", start: "Start Time", end: "End Time", percentComplete: "% Done", parentId: "Predecessor ID", id: "ID", orderId: "Order ID" }, v = "string", _ = ".kendoGanttList", w = "click", b = ".", y = { wrapper: "k-treelist k-grid k-widget", header: "k-header", alt: "k-alt", editCell: "k-edit-cell", group: "k-treelist-group", gridHeader: "k-grid-header", gridHeaderWrap: "k-grid-header-wrap", gridContent: "k-grid-content", gridContentWrap: "k-grid-content", selected: "k-state-selected", icon: "k-icon", iconCollapse: "k-i-collapse", iconExpand: "k-i-expand", iconHidden: "k-i-none", iconPlaceHolder: "k-icon k-i-none", input: "k-input", link: "k-link", dropPositions: "k-insert-top k-insert-bottom k-add k-insert-middle", dropTop: "k-insert-top", dropBottom: "k-insert-bottom", dropAdd: "k-add", dropMiddle: "k-insert-middle", dropDenied: "k-denied", dragStatus: "k-drag-status", dragClue: "k-drag-clue", dragClueText: "k-clue-text" }, k = c.GanttList = d.extend({ init: function(e, t) { d.fn.init.call(this, e, t), 0 === this.options.columns.length && this.options.columns.push("title"), this.dataSource = this.options.dataSource, this._columns(), this._layout(), this._domTrees(), this._header(), this._sortable(), this._editable(), this._selectable(), this._draggable(), this._attachEvents(), this._adjustHeight() }, _adjustHeight: function() { this.content.height(this.element.height() - this.header.parent().outerHeight()) }, destroy: function() { d.fn.destroy.call(this), this._reorderDraggable && this._reorderDraggable.destroy(), this._tableDropArea && this._tableDropArea.destroy(), this._contentDropArea && this._contentDropArea.destroy(), this.touch && this.touch.destroy(), this.timer && clearTimeout(this.timer), this.content.off(_), this.header.find(b + k.link).off(_), this.header = null, this.content = null, this.levels = null, i.destroy(this.element) }, options: { name: "GanttList", selectable: !0, editable: !0 }, _attachEvents: function() { var t = this, n = k.styles; t.content.on(w + _, "td > span." + n.icon + ":not(." + n.iconHidden + ")", function(n) { var i = e(this), r = t._modelFromElement(i); r.set("expanded", !r.get("expanded")), n.stopPropagation() }) }, _domTrees: function() { this.headerTree = new r.Tree(this.header[0]), this.contentTree = new r.Tree(this.content[0]) }, _columns: function() { var e = this.options.columns, t = function() { this.field = "", this.title = "", this.editable = !1, this.sortable = !1 }; this.columns = h(e, function(e) { return e = "string" == typeof e ? { field: e, title: m[e] } : e, u(new t, e) }) }, _layout: function() { var e = this.element, t = k.styles; e.addClass(t.wrapper).append("<div class='" + t.gridHeader + "'><div class='" + t.gridHeaderWrap + "'></div></div>").append("<div class='" + t.gridContentWrap + "'></div>"), this.header = e.find(b + t.gridHeaderWrap), this.content = e.find(b + t.gridContent) }, _header: function() { var e = this.headerTree, t = o("colgroup", null, this._cols()), n = o("thead", { role: "rowgroup" }, [o("tr", { role: "row" }, this._ths())]), i = o("table", { style: { minWidth: this.options.listWidth + "px" }, role: "grid" }, [t, n]); e.render([i]) }, _render: function(e) { var t, n, i; this.levels = [{ field: null, value: 0 }], t = o("colgroup", null, this._cols()), n = o("tbody", { role: "rowgroup" }, this._trs(e)), i = o("table", { style: { minWidth: this.options.listWidth + "px" }, tabIndex: 0, role: "treegrid" }, [t, n]), this.contentTree.render([i]), this.trigger("render") }, _ths: function() { var e, t, n, i, r = this.columns, s = []; for (n = 0, i = r.length; i > n; n++) e = r[n], t = { "data-field": e.field, "data-title": e.title, className: k.styles.header, role: "columnheader" }, s.push(o("th", t, [a(e.title)])); return s }, _cols: function() { var e, t, n, i, r, a = this.columns, s = []; for (i = 0, r = a.length; r > i; i++) e = a[i], n = e.width, t = n && 0 !== parseInt(n, 10) ? { style: { width: typeof n === v ? n : n + "px" } } : null, s.push(o("col", t, [])); return s }, _trs: function(e) { var t, n, i, r, o, a = [], s = [], l = k.styles; for (r = 0, o = e.length; o > r; r++) t = e[r], i = this._levels({ idx: t.parentId, id: t.id, summary: t.summary }), n = { "data-uid": t.uid, "data-level": i, role: "row" }, t.summary && (n["aria-expanded"] = t.expanded), r % 2 !== 0 && s.push(l.alt), t.summary && s.push(l.group), s.length && (n.className = s.join(" ")), a.push(this._tds({ task: t, attr: n, level: i })), s = []; return a }, _tds: function(e) { var t, n, i, r = [], a = this.columns; for (n = 0, i = a.length; i > n; n++) t = a[n], r.push(this._td({ task: e.task, column: t, level: e.level })); return o("tr", e.attr, r) }, _td: function(e) { var n, r, s, l = [], c = this.options.resourcesField, d = k.styles, u = e.task, h = e.column, p = u.get(h.field) || []; if (h.field == c) { for (n = [], r = 0; p.length > r; r++) n.push(i.format("{0} [{1}]", p[r].get("name"), p[r].get("formatedValue"))); n = n.join(", ") } else n = h.format ? i.format(h.format, p) : p; return "title" === h.field && (l = t({ level: e.level, className: d.iconPlaceHolder }), l.push(o("span", { className: d.icon + " " + (u.summary ? u.expanded ? d.iconCollapse : d.iconExpand : d.iconHidden) })), s = i.format("{0}, {1:P0}", n, u.percentComplete)), l.push(o("span", { "aria-label": s }, [a(n)])), o("td", { role: "gridcell" }, l) }, _levels: function(e) { var t, n, i, r = this.levels, o = e.summary, a = e.idx, s = e.id; for (n = 0, i = r.length; i > n; n++) if (t = r[n], t.field == a) return o && r.push({ field: s, value: t.value + 1 }), t.value }, _sortable: function() { var e, t, n, r, o, a = this, s = this.options.resourcesField, l = this.columns, c = this.header.find("th"), d = function(e) { a.editable && a.editable.trigger("validate") && (e.preventDefault(), e.stopImmediatePropagation()) }; for (r = 0, o = c.length; o > r; r++) e = l[r], e.sortable && e.field !== s && (n = c.eq(r), t = n.data("kendoColumnSorter"), t && t.destroy(), n.attr("data-" + i.ns + "field", e.field).kendoColumnSorter({ dataSource: this.dataSource }).find(b + k.link).on("click" + _, d)); c = null }, _selectable: function() { var t = this, n = this.options.selectable; n && this.content.on(w + _, "tr", function(n) { var i = e(this); t.editable && t.editable.trigger("validate"), n.ctrlKey ? t.clearSelection() : t.select(i) }) }, select: function(e) { var t = this.content.find(e), n = k.styles.selected; return t.length ? (t.siblings(b + n).removeClass(n).attr("aria-selected", !1).end().addClass(n).attr("aria-selected", !0), void this.trigger("change")) : this.content.find(b + n) }, clearSelection: function() { var e = this.select(); e.length && (e.removeClass(k.styles.selected), this.trigger("change")) }, _setDataSource: function(e) { this.dataSource = e }, _editable: function() { var t = this, i = k.styles, r = "span." + i.icon + ":not(" + i.iconHidden + ")", o = function() { var e = t.editable; e && (e.end() ? t._closeCell() : e.trigger("validate")) }, a = function(t) { var r = e(t.currentTarget); r.hasClass(i.editCell) || n() }; this.options.editable && (this._startEditHandler = function(n) { var i = n.currentTarget ? e(n.currentTarget) : n, r = t._columnFromElement(i); t.editable || r.editable && t._editCell({ cell: i, column: r }) }, t.content.on("focusin" + _, function() { clearTimeout(t.timer), t.timer = null }).on("focusout" + _, function() { t.timer = setTimeout(o, 1) }).on("keyup" + _, function(e) { var i, r, a = e.keyCode; switch (a) { case g.ENTER: n(), o(); break; case g.ESC: t.editable && (i = t._editableContainer, r = t._modelFromElement(i), t.trigger("cancel", { model: r, cell: i }) || t._closeCell(!0)) } }), l ? t.touch = t.content.kendoTouch({ filter: "td", touchstart: function(e) { a(e.touch) }, doubletap: function(n) { e(n.touch.initialTouch).is(r) || t._startEditHandler(n.touch) } }).data("kendoTouch") : t.content.on("mousedown" + _, "td", function(e) { a(e) }).on("dblclick" + _, "td", function(n) { e(n.target).is(r) || t._startEditHandler(n) })) }, _editCell: function(t) { var n, r = this.options.resourcesField, o = k.styles, a = t.cell, s = t.column, l = this._modelFromElement(a), c = this.dataSource._createNewModel(l.toJSON()), d = c.fields[s.field] || c[s.field], u = d.validation, h = i.attr("type"), g = i.attr("bind"), m = i.attr("format"), v = { name: s.field, required: d.validation ? d.validation.required === !0 : !1 }; return s.field === r ? void s.editor(a, c) : (this._editableContent = a.children().detach(), this._editableContainer = a, a.data("modelCopy", c), "date" !== d.type && "date" !== e.type(d) || s.format && !/H|m|s|F|g|u/.test(s.format) || (v[g] = "value:" + s.field, v[h] = "date", s.format && (v[m] = i._extractFormat(s.format)), n = function(t, n) { e('<input type="text"/>').attr(v).appendTo(t).kendoDateTimePicker({ format: n.format }) }), this.editable = a.addClass(o.editCell).kendoEditable({ fields: { field: s.field, format: s.format, editor: s.editor || n }, model: c, clearContainer: !1 }).data("kendoEditable"), u && u.dateCompare && p(u.dateCompare) && u.message && (e("<span " + i.attr("for") + '="' + s.field + '" class="k-invalid-msg"/>').hide().appendTo(a), a.find("[name=" + s.field + "]").attr(i.attr("dateCompare-msg"), u.message)), this.trigger("edit", { model: l, cell: a }) && this._closeCell(!0), void this.editable.bind("validate", function(e) { var t = this.element.find(":kendoFocusable:first").focus(); f && t.focus(), e.preventDefault() })) }, _closeCell: function(e) { var t = k.styles, n = this._editableContainer, i = this._modelFromElement(n), r = this._columnFromElement(n), o = r.field, a = n.data("modelCopy"), s = {}; s[o] = a.get(o), n.empty().removeData("modelCopy").removeClass(t.editCell).append(this._editableContent), this.editable.unbind(), this.editable.destroy(), this.editable = null, this._editableContainer = null, this._editableContent = null, e || ("start" === o && (s.end = new Date(s.start.getTime() + i.duration())), this.trigger("update", { task: i, updateInfo: s })) }, _draggable: function() { var t, n = this, r = null, o = !0, a = k.styles, s = "tr[" + i.attr("level") + " = 0]:last", c = {}, d = function() { r = null, t = null, o = !0, c = {} }, h = function(e) { for (var t = e; t;) { if (r.get("id") === t.get("id")) { o = !1; break } t = n.dataSource.taskParent(t) } }, p = function() { var n = e(t).height(), r = i.getOffset(t).top; u(t, { beforeLimit: r + .25 * n, afterLimit: r + .75 * n }) }, f = function(e) { var n, r = e.location, o = a.dropAdd, s = "add", l = parseInt(t.attr(i.attr("level")), 10); t.beforeLimit >= r ? (n = t.prev(), o = a.dropTop, s = "insert-before") : r >= t.afterLimit && (n = t.next(), o = a.dropBottom, s = "insert-after"), n && parseInt(n.attr(i.attr("level")), 10) === l && (o = a.dropMiddle), c.className = o, c.command = s }, g = function() { return n._reorderDraggable.hint.children(b + a.dragStatus).removeClass(a.dropPositions) }; this.options.editable && (this._reorderDraggable = this.content.kendoDraggable({ distance: 10, holdToDrag: l, group: "listGroup", filter: "tr[data-uid]", ignore: b + a.input, hint: function(t) { return e('<div class="' + a.header + " " + a.dragClue + '"/>').css({ width: 300, paddingLeft: t.css("paddingLeft"), paddingRight: t.css("paddingRight"), lineHeight: t.height() + "px", paddingTop: t.css("paddingTop"), paddingBottom: t.css("paddingBottom") }).append('<span class="' + a.icon + " " + a.dragStatus + '" /><span class="' + a.dragClueText + '"/>') }, cursorOffset: { top: -20, left: 0 }, container: this.content, dragstart: function(e) { return n.editable && n.editable.trigger("validate") ? void e.preventDefault() : (r = n._modelFromElement(e.currentTarget), void this.hint.children(b + a.dragClueText).text(r.get("title"))) }, drag: function(e) { o && (f(e.y), g().addClass(c.className)) }, dragend: function() { d() }, dragcancel: function() { d() } }).data("kendoDraggable"), this._tableDropArea = this.content.kendoDropTargetArea({ distance: 0, group: "listGroup", filter: "tr[data-uid]", dragenter: function(e) { t = e.dropTarget, h(n._modelFromElement(t)), p(), g().toggleClass(a.dropDenied, !o) }, dragleave: function() { o = !0, g() }, drop: function() { var e = n._modelFromElement(t), i = e.orderId, a = { parentId: e.parentId }; if (o) { switch (c.command) { case "add": a.parentId = e.id; break; case "insert-before": a.orderId = e.parentId === r.parentId && e.orderId > r.orderId ? i - 1 : i; break; case "insert-after": a.orderId = e.parentId === r.parentId && e.orderId > r.orderId ? i : i + 1 } n.trigger("update", { task: r, updateInfo: a }) } } }).data("kendoDropTargetArea"), this._contentDropArea = this.element.kendoDropTargetArea({ distance: 0, group: "listGroup", filter: b + a.gridContent, drop: function() { var e = n._modelFromElement(n.content.find(s)), t = e.orderId, i = { parentId: null, orderId: null !== r.parentId ? t + 1 : t }; n.trigger("update", { task: r, updateInfo: i }) } }).data("kendoDropTargetArea")) }, _modelFromElement: function(e) { var t = e.closest("tr"), n = this.dataSource.getByUid(t.attr(i.attr("uid"))); return n }, _columnFromElement: function(e) { var t = e.closest("td"), n = t.parent(), i = n.children().index(t); return this.columns[i] } }); u(!0, c.GanttList, { styles: y }) }(window.kendo.jQuery), function(e) { function t(e) { return delete e.name, delete e.prefix, delete e.views, e } function n(e) { var t = [], n = e.workWeekStart; for (t.push(n); e.workWeekEnd != n;) n > 6 ? n -= 7 : n++, t.push(n); return t } function i() { var t = kendo._activeElement(); "body" !== t.nodeName.toLowerCase() && e(t).blur() } var r, o, a = kendo.ui.Widget, s = kendo.dom.element, l = kendo.dom.text, c = e.isPlainObject, d = e.extend, u = e.proxy, h = kendo.support.browser, p = !1, f = kendo.keys, g = kendo.data.Query, m = ".kendoGanttTimeline", v = "click", _ = "dblclick", w = "mousemove", b = "mouseenter", y = "mouseleave", k = "keydown", x = ".", C = kendo.template("#=kendo.toString(start, 't')#"), S = kendo.template("#=kendo.toString(start, 'ddd M/dd')#"), T = kendo.template("#=kendo.toString(start, 'ddd M/dd')# - #=kendo.toString(kendo.date.addDays(end, -1), 'ddd M/dd')#"), D = kendo.template("#=kendo.toString(start, 'MMM')#"), A = kendo.template("#=kendo.toString(start, 'yyyy')#"), E = kendo.template('<div class="#=styles.marquee#"><div class="#=styles.marqueeColor#"></div></div>'), I = kendo.template('<div style="z-index: 100002;" class="#=styles.tooltipWrapper#"><div class="#=styles.tooltipContent#"><div>#=messages.start#: #=kendo.toString(start, format)#</div><div>#=messages.end#: #=kendo.toString(end, format)#</div></div></div>'), P = kendo.template('<div style="z-index: 100002;" class="#=styles.tooltipWrapper#" ><div class="#=styles.tooltipContent#">#=text#%</div><div class="#=styles.tooltipCallout#" style="left:13px;"></div></div>'), M = kendo.template('<div class="#=styles.taskDetails#"><strong>#=task.title#</strong><div class="#=styles.taskDetailsPercent#">#=kendo.toString(task.percentComplete, "p0")#</div><ul class="#=styles.reset#"><li>#=messages.start#: #=kendo.toString(task.start, "h:mm tt ddd, MMM d")#</li><li>#=messages.end#: #=kendo.toString(task.end, "h:mm tt ddd, MMM d")#</li></ul></div>'), z = { day: { type: "kendo.ui.GanttDayView" }, week: { type: "kendo.ui.GanttWeekView" }, month: { type: "kendo.ui.GanttMonthView" }, year: { type: "kendo.ui.GanttYearView" } }, F = { alt: "k-alt", reset: "k-reset", nonWorking: "k-nonwork-hour", header: "k-header", gridHeader: "k-grid-header", gridHeaderWrap: "k-grid-header-wrap", gridContent: "k-grid-content", tasksWrapper: "k-gantt-tables", rowsTable: "k-gantt-rows", columnsTable: "k-gantt-columns", tasksTable: "k-gantt-tasks", dependenciesWrapper: "k-gantt-dependencies", resource: "k-resource", resourceAlt: "k-resource k-alt", task: "k-task", taskSingle: "k-task-single", taskMilestone: "k-task-milestone", taskSummary: "k-task-summary", taskWrap: "k-task-wrap", taskMilestoneWrap: "k-milestone-wrap", resourcesWrap: "k-resources-wrap", taskDot: "k-task-dot", taskDotStart: "k-task-start", taskDotEnd: "k-task-end", taskDragHandle: "k-task-draghandle", taskContent: "k-task-content", taskTemplate: "k-task-template", taskActions: "k-task-actions", taskDelete: "k-task-delete", taskComplete: "k-task-complete", taskDetails: "k-task-details", taskDetailsPercent: "k-task-pct", link: "k-link", icon: "k-icon", iconDelete: "k-si-close", taskResizeHandle: "k-resize-handle", taskResizeHandleWest: "k-resize-w", taskResizeHandleEast: "k-resize-e", taskSummaryProgress: "k-task-summary-progress", taskSummaryComplete: "k-task-summary-complete", line: "k-line", lineHorizontal: "k-line-h", lineVertical: "k-line-v", arrowWest: "k-arrow-w", arrowEast: "k-arrow-e", dragHint: "k-drag-hint", dependencyHint: "k-dependency-hint", tooltipWrapper: "k-widget k-tooltip k-popup k-group k-reset", tooltipContent: "k-tooltip-content", tooltipCallout: "k-callout k-callout-s", callout: "k-callout", marquee: "k-marquee k-gantt-marquee", marqueeColor: "k-marquee-color" }, R = kendo.ui.GanttView = a.extend({ init: function(e, t) { a.fn.init.call(this, e, t), this.title = this.options.title || this.options.name, this.header = this.element.find(x + R.styles.gridHeader), this.content = this.element.find(x + R.styles.gridContent), this.contentWidth = this.content.width(), this._workDays = n(this.options), this._headerTree = t.headerTree, this._taskTree = t.taskTree, this._dependencyTree = t.dependencyTree, this._taskCoordinates = {}, this._currentTime() }, destroy: function() { a.fn.destroy.call(this), clearTimeout(this._tooltipTimeout), this.headerRow = null, this.header = null, this.content = null, this._dragHint = null, this._resizeHint = null, this._resizeTooltip = null, this._taskTooltip = null, this._percentCompleteResizeTooltip = null, this._headerTree = null, this._taskTree = null, this._dependencyTree = null }, options: { showWorkHours: !1, showWorkDays: !1, workDayStart: new Date(1980, 1, 1, 8, 0, 0), workDayEnd: new Date(1980, 1, 1, 17, 0, 0), workWeekStart: 1, workWeekEnd: 5, hourSpan: 1, slotSize: 100, currentTimeMarker: { updateInterval: 1e4 } }, renderLayout: function() { this._slots = this._createSlots(), this._tableWidth = this._calculateTableWidth(), this.createLayout(this._layout()), this._slotDimensions(), this._adjustHeight(), this.content.find(x + R.styles.dependenciesWrapper).width(this._tableWidth) }, _adjustHeight: function() { this.content.height(this.element.height() - this.header.outerHeight()) }, createLayout: function(e) { var t = this._headers(e), n = this._colgroup(), i = this._headerTree, r = s("thead", null, t), o = s("table", { style: { width: this._tableWidth + "px" } }, [n, r]); i.render([o]), this.headerRow = this.header.find("table:first tr").last() }, _slotDimensions: function() { var e, t, n, i, r = this.headerRow[0].children, o = this._timeSlots(); for (n = 0, i = r.length; i > n; n++) t = r[n], e = o[n], e.offsetLeft = t.offsetLeft, e.offsetWidth = t.offsetWidth }, render: function(e) { var t, n = e.length, i = R.styles, r = this._rowsTable(n), o = this._columnsTable(n), a = this._tasksTable(e), s = this.options.currentTimeMarker; this._taskTree.render([r, o, a]), t = this.content.find(x + i.rowsTable), this._contentHeight = t.height(), this._rowHeight = this._contentHeight / t.find("tr").length, this.content.find(x + i.columnsTable).height(this._contentHeight), s !== !1 && void 0 !== s.updateInterval && this._renderCurrentTime() }, _rowsTable: function(e) { var t, n, i = [], r = R.styles, o = [null, { className: r.alt }]; for (n = 0; e > n; n++) t = s("tr", o[n % 2], [s("td", null, [l(" ")])]), i.push(t); return this._createTable(1, i, { className: r.rowsTable }) }, _columnsTable: function() { var e, t, n, i, r, o = [], a = R.styles, c = this._timeSlots(), d = c.length, u = 0; for (r = 0; d > r; r++) t = c[r], i = {}, n = t.span, u += n, 1 !== n && (i.colspan = n), t.isNonWorking && (i.className = a.nonWorking), o.push(s("td", i, [l(" ")])); return e = s("tr", null, o), this._createTable(u, [e], { className: a.columnsTable }) }, _tasksTable: function(e) { var t, n, i, r, o, a, l, c, d = [], u = R.styles, h = this._taskCoordinates = {}, f = this._calculateMilestoneWidth(), g = Math.round(f.width), m = this.options.resourcesField, v = [u.resource, u.resourceAlt], _ = this._calculateResourcesMargin(), w = this._calculateTaskBorderWidth(), b = function(e) { var t = i.left, n = t + i.width; r.isMilestone() && (t -= g / 2, n = t + g), h[r.id] = { start: t, end: n, rowIndex: e } }; for (l = 0, c = e.length; c > l; l++) r = e[l], i = this._taskPosition(r), i.borderWidth = w, t = s("tr", null), n = s("td", null, [this._renderTask(e[l], i)]), r[m] && r[m].length && (o = p ? this._tableWidth - i.left : Math.max(i.width || f.clientWidth, 0) + i.left, a = { width: this._tableWidth - (o + _) + "px" }, a[p ? "right" : "left"] = o + "px", n.children.push(s("div", { className: u.resourcesWrap, style: a }, this._renderResources(r[m], v[l % 2])))), t.children.push(n), d.push(t), b(l); return this._createTable(1, d, { className: R.styles.tasksTable }) }, _createTable: function(e, t, n) { var i, r, o, a = []; for (o = 0; e > o; o++) a.push(s("col")); return i = s("colgroup", null, a), r = s("tbody", null, t), n.style || (n.style = {}), n.style.width = this._tableWidth + "px", s("table", n, [i, r]) }, _calculateTableWidth: function() { var e, t, n, i, r = this._timeSlots(), o = 0, a = 0; for (n = 0, i = r.length; i > n; n++) e = r[n].span, a += e, e > o && (o = e); return t = Math.round(a * this.options.slotSize / o) }, _calculateMilestoneWidth: function() { var t, n, i = R.styles.task + " " + R.styles.taskMilestone, r = e("<div class='" + i + "' style='visibility: hidden; position: absolute'>"); return this.content.append(r), n = r[0].getBoundingClientRect(), t = { width: n.right - n.left, clientWidth: r[0].clientWidth }, r.remove(), t }, _calculateResourcesMargin: function() { var t, n = e("<div class='" + R.styles.resourcesWrap + "' style='visibility: hidden; position: absolute'>"); return this.content.append(n), t = parseInt(n.css(p ? "margin-right" : "margin-left"), 10), n.remove(), t }, _calculateTaskBorderWidth: function() { var t, n, i = R.styles.task + " " + R.styles.taskSingle, r = e("<div class='" + i + "' style='visibility: hidden; position: absolute'>"); return this.content.append(r), n = kendo.getComputedStyles(r[0], ["border-left-width"]), t = parseFloat(n["border-left-width"], 10), r.remove(), t }, _renderTask: function(e, t) { var n, i, r, o = this.options.editable, a = t.left, l = R.styles, c = l.taskWrap, d = {}; return e.summary ? i = this._renderSummary(e, t) : e.isMilestone() ? (i = this._renderMilestone(e, t), c += " " + l.taskMilestoneWrap) : i = this._renderSingleTask(e, t), n = s("div", { className: c, style: { left: a + "px" } }, [i]), o && (n.children.push(s("div", { className: l.taskDot + " " + l.taskDotStart })), n.children.push(s("div", { className: l.taskDot + " " + l.taskDotEnd }))), e.summary || e.isMilestone() || !o || (r = Math.round(t.width * e.percentComplete), d[p ? "right" : "left"] = r + "px", n.children.push(s("div", { className: l.taskDragHandle, style: d }))), n }, _renderSingleTask: function(e, t) { var n, i = R.styles, r = Math.round(t.width * e.percentComplete), o = s("div", { className: i.taskContent }, [s("div", { className: i.taskTemplate }, [l(e.title)])]); return this.options.editable && (o.children.push(s("span", { className: i.taskActions }, [s("a", { className: i.link + " " + i.taskDelete, href: "#" }, [s("span", { className: i.icon + " " + i.iconDelete })])])), o.children.push(s("span", { className: i.taskResizeHandle + " " + i.taskResizeHandleWest })), o.children.push(s("span", { className: i.taskResizeHandle + " " + i.taskResizeHandleEast }))), n = s("div", { className: i.task + " " + i.taskSingle, "data-uid": e.uid, style: { width: Math.max(t.width - 2 * t.borderWidth, 0) + "px" } }, [s("div", { className: i.taskComplete, style: { width: r + "px" } }), o]) }, _renderMilestone: function(e) { var t = R.styles, n = s("div", { className: t.task + " " + t.taskMilestone, "data-uid": e.uid }); return n }, _renderSummary: function(e, t) { var n = R.styles, i = Math.round(t.width * e.percentComplete), r = s("div", { className: n.task + " " + n.taskSummary, "data-uid": e.uid, style: { width: t.width + "px" } }, [s("div", { className: n.taskSummaryProgress, style: { width: i + "px" } }, [s("div", { className: n.taskSummaryComplete, style: { width: t.width + "px" } })])]); return r }, _renderResources: function(e, t) { var n, i, r, o = []; for (i = 0, r = e.length; r > i; i++) n = e[i], o.push(s("span", { className: t, style: { color: n.get("color") } }, [l(n.get("name"))])); return p && o.reverse(), o }, _taskPosition: function(e) { var t = Math.round, n = t(this._offset(p ? e.end : e.start)), i = t(this._offset(p ? e.start : e.end)); return { left: n, width: i - n } }, _offset: function(e) { var t, n, i, r, o = this._timeSlots(), a = 0; return o.length ? (r = this._slotIndex("start", e), t = o[r], e > t.end ? a = t.offsetWidth : e >= t.start && (n = e - t.start, i = t.end - t.start, a = n / i * t.offsetWidth), p && (a = t.offsetWidth + 1 - a), t.offsetLeft + a) : 0 }, _slotIndex: function(e, t, n) { var i, r = this._timeSlots(), o = 0, a = r.length - 1; n && (r = [].slice.call(r).reverse()); do i = Math.ceil((a + o) / 2), t > r[i][e] ? o = i : (i === a && i--, a = i); while (o !== a); return n && (o = r.length - 1 - o), o }, _timeByPosition: function(t, n, i) { var r, o, a, s = this._slotByPosition(t); return n ? i ? s.end : s.start : (r = t - e(x + R.styles.tasksTable).offset().left, o = s.end - s.start, a = r - s.offsetLeft, p && (a = s.offsetWidth - a), new Date(s.start.getTime() + o * (a / s.offsetWidth))) }, _slotByPosition: function(t) { var n = t - e(x + R.styles.tasksTable).offset().left, i = this._slotIndex("offsetLeft", n, p); return this._timeSlots()[i] }, _renderDependencies: function(e) { var t, n, i = [], r = this._dependencyTree; for (t = 0, n = e.length; n > t; t++) i.push.apply(i, this._renderDependency(e[t])); r.render(i) }, _renderDependency: function(e) { var t, n, i, r, o = this._taskCoordinates[e.predecessorId], a = this._taskCoordinates[e.successorId]; if (!o || !a) return []; for (n = "_render" + ["FF", "FS", "SF", "SS"][p ? 3 - e.type : e.type], t = this[n](o, a), i = 0, r = t.length; r > i; i++) t[i].attr["data-uid"] = e.uid; return t }, _renderFF: function(e, t) { var n = this._dependencyFF(e, t, !1); return n[n.length - 1].children[0] = this._arrow(!0), n }, _renderSS: function(e, t) { var n = this._dependencyFF(t, e, !0); return n[0].children[0] = this._arrow(!1), n.reverse() }, _renderFS: function(e, t) { var n = this._dependencyFS(e, t, !1); return n[n.length - 1].children[0] = this._arrow(!1), n }, _renderSF: function(e, t) { var n = this._dependencyFS(t, e, !0); return n[0].children[0] = this._arrow(!0), n.reverse() }, _dependencyFF: function(e, t, n) { var i, r = this, o = [], a = 0, s = 0, l = 0, c = 0, d = n ? "start" : "end", u = 2, h = 1, p = this._rowHeight, f = 10, g = e.rowIndex * p + Math.floor(p / 2) - 1, m = t.rowIndex * p + Math.floor(p / 2) - 1, v = R.styles, _ = function() { o.push(r._line(v.line + " " + v.lineHorizontal, { left: a + "px", top: s + "px", width: l + "px" })) }, w = function() { o.push(r._line(v.line + " " + v.lineVertical, { left: a + "px", top: s + "px", height: c + "px" })) }; return a = e[d], s = g, l = f, i = t[d] - e[d], i > 0 !== n && (l = Math.abs(i) + f), n ? (a -= l, l -= h, _()) : (_(), a += l - u), s > m ? (c = s - m, c += u, s = m, w()) : (c = m - s, c += u, w(), s += c - u), l = Math.abs(a - t[d]), n || (l -= h, a -= l), _(), o }, _dependencyFS: function(e, t, n) { var i = this, r = [], o = 0, a = 0, s = 0, l = 0, c = this._rowHeight, d = Math.floor(c / 2), u = 10, h = 2 * u, p = t.start - e.end, f = 2, g = 1, m = e.rowIndex * c + Math.floor(c / 2) - 1, v = t.rowIndex * c + Math.floor(c / 2) - 1, _ = R.styles, w = function() { r.push(i._line(_.line + " " + _.lineHorizontal, { left: o + "px", top: a + "px", width: s + "px" })) }, b = function() { r.push(i._line(_.line + " " + _.lineVertical, { left: o + "px", top: a + "px", height: l + "px" })) }; return o = e.end, a = m, s = u, n && (o += g, p > h && (s = p - (u - f)), s -= g), w(), o += s - f, h >= p && (l = n ? Math.abs(v - m) - d : d, m > v ? (a -= l, l += f, b()) : (b(), a += l), s = e.end - t.start + h, u > s && (s = u), o -= s - f, w()), m > v ? (l = a - v, a = v, l += f, b()) : (l = v - a, b(), a += l), s = t.start - o, n || (s -= g), w(), r }, _line: function(e, t) { return s("div", { className: e, style: t }) }, _arrow: function(e) { return s("span", { className: e ? R.styles.arrowWest : R.styles.arrowEast }) }, _colgroup: function() { var e, t, n, i = this._timeSlots(), r = i.length, o = []; for (e = 0; r > e; e++) for (t = 0, n = i[e].span; n > t; t++) o.push(s("col")); return s("colgroup", null, o) }, _createDragHint: function(e) { this._dragHint = e.clone().addClass(R.styles.dragHint).css("cursor", "move"), e.parent().append(this._dragHint) }, _updateDragHint: function(e) { var t = this._offset(e); this._dragHint.css({ left: t }) }, _removeDragHint: function() { this._dragHint.remove(), this._dragHint = null }, _createResizeHint: function(t) { var n, i, r = R.styles, o = this._taskCoordinates[t.id].rowIndex * this._rowHeight, a = this.options, s = a.messages; this._resizeHint = e(E({ styles: r })).css({ top: 0, height: this._contentHeight }), this.content.append(this._resizeHint), this._resizeTooltip = e(I({ styles: r, start: t.start, end: t.end, messages: s.views, format: a.resizeTooltipFormat })).css({ top: 0, left: 0 }), this.content.append(this._resizeTooltip), this._resizeTooltipWidth = this._resizeTooltip.outerWidth(), n = this._resizeTooltip.outerHeight(), i = o - n, 0 > i && (i = o + this._rowHeight), this._resizeTooltipTop = i }, _updateResizeHint: function(t, n, i) { var r = this._offset(p ? n : t), o = this._offset(p ? t : n), a = o - r, s = i !== p ? r : o, l = this._tableWidth - kendo.support.scrollbar(), c = this._resizeTooltipWidth, d = this.options, u = d.messages, h = e(x + R.styles.tasksTable).offset().left - e(x + R.styles.tasksWrapper).offset().left; p && (r += h), this._resizeHint.css({ left: r, width: a }), this._resizeTooltip && this._resizeTooltip.remove(), s -= Math.round(c / 2), 0 > s ? s = 0 : s + c > l && (s = l - c), p && (s += h), this._resizeTooltip = e(I({ styles: R.styles, start: t, end: n, messages: u.views, format: d.resizeTooltipFormat })).css({ top: this._resizeTooltipTop, left: s, "min-width": c }).appendTo(this.content) }, _removeResizeHint: function() { this._resizeHint.remove(), this._resizeHint = null, this._resizeTooltip.remove(), this._resizeTooltip = null }, _updatePercentCompleteTooltip: function(t, n, i) { var r, o, a, s; this._removePercentCompleteTooltip(), r = this._percentCompleteResizeTooltip = e(P({ styles: R.styles, text: i })).appendTo(this.element), o = Math.round(r.outerWidth() / 2), a = r.find(x + R.styles.callout), s = Math.round(a.outerWidth() / 2), r.css({ top: t - (r.outerHeight() + s), left: n - o }), a.css("left", o - s) }, _removePercentCompleteTooltip: function() { this._percentCompleteResizeTooltip && this._percentCompleteResizeTooltip.remove(), this._percentCompleteResizeTooltip = null }, _updateDependencyDragHint: function(e, t, n) { this._removeDependencyDragHint(), n ? this._creteVmlDependencyDragHint(e, t) : this._creteDependencyDragHint(e, t) }, _creteDependencyDragHint: function(t, n) { var i = R.styles, r = n.x - t.x, o = n.y - t.y, a = Math.sqrt(r * r + o * o), s = Math.atan(o / r); 0 > r && (s += Math.PI), e("<div class='" + i.line + " " + i.lineHorizontal + " " + i.dependencyHint + "'></div>").css({ top: t.y, left: t.x, width: a, "transform-origin": "0% 0", "-ms-transform-origin": "0% 0", "-webkit-transform-origin": "0% 0", transform: "rotate(" + s + "rad)", "-ms-transform": "rotate(" + s + "rad)", "-webkit-transform": "rotate(" + s + "rad)" }).appendTo(this.content) }, _creteVmlDependencyDragHint: function(t, n) { var i = e("<kvml:line class='" + R.styles.dependencyHint + "' style='position:absolute; top: 0px; left: 0px;' strokecolor='black' strokeweight='2px' from='" + t.x + "px," + t.y + "px' to='" + n.x + "px," + n.y + "px'></kvml:line>").appendTo(this.content); i[0].outerHTML = i[0].outerHTML }, _removeDependencyDragHint: function() { this.content.find(x + R.styles.dependencyHint).remove() }, _createTaskTooltip: function(t, n, i) { var r, o = R.styles, a = this.options, s = this.content, l = s.offset(), c = s.width(), d = s.scrollLeft(), u = e(n).parents("tr").first(), h = u.offset(), p = a.tooltip && a.tooltip.template ? kendo.template(a.tooltip.template) : M, f = i - (l.left - s.scrollLeft()), g = h.top + u.outerHeight() - l.top + s.scrollTop(), m = this._taskTooltip = e('<div style="z-index: 100002;" class="' + o.tooltipWrapper + '" ><div class="' + o.taskContent + '"></div></div>'); m.css({ left: f, top: g }).appendTo(s).find(x + o.taskContent).append(p({ styles: o, task: t, messages: a.messages.views })), m.outerHeight() < h.top - l.top && m.css("top", h.top - l.top - m.outerHeight() + s.scrollTop()), r = m.outerWidth(), r + f - d > c && (f -= r, d > f && (f = d + c - (r + 17)), m.css("left", f)) }, _removeTaskTooltip: function() { this._taskTooltip && this._taskTooltip.remove(), this._taskTooltip = null }, _scrollTo: function(e) { var t = e.offset().left, n = e.width(), i = t + n, r = e.closest("tr"), o = r.offset().top, a = r.height(), s = o + a, l = this.content, c = l.offset(), d = c.top, u = l.height(), h = d + u, p = c.left, f = l.width(), g = p + f, m = kendo.support.scrollbar(); d > o ? l.scrollTop(l.scrollTop() + (o - d)) : s > h && l.scrollTop(l.scrollTop() + (s + m - h)), p > t && n > f && g > i || i > g && f > n ? l.scrollLeft(l.scrollLeft() + (i + m - g)) : (i > g && n > f && t > p || p > t && f > n) && l.scrollLeft(l.scrollLeft() + (t - p)) }, _timeSlots: function() { return this._slots && this._slots.length ? this._slots[this._slots.length - 1] : [] }, _headers: function(e) { var t, n, i, r, o, a, c, d, u = [], h = R.styles; for (o = 0, a = e.length; a > o; o++) { for (t = e[o], n = [], c = 0, d = t.length; d > c; c++) i = t[c], r = l(i.text), n.push(s("th", { colspan: i.span, className: h.header + (i.isNonWorking ? " " + h.nonWorking : "") }, [r])); u.push(s("tr", null, n)) } return u }, _hours: function(e, t) { var n, i, r, o = [], a = this.options, s = a.workDayStart.getHours(), l = a.workDayEnd.getHours(), c = a.hourSpan; for (e = new Date(e), t = new Date(t); t > e;) n = new Date(e), r = n.getHours(), i = r >= s && l > r, n.setHours(n.getHours() + c), r == n.getHours() && n.setHours(n.getHours() + 2 * c), (!a.showWorkHours || i) && o.push({ start: e, end: n, isNonWorking: !i, span: 1 }), e = n; return o }, _days: function(e, t) { var n, i, r = []; for (e = new Date(e), t = new Date(t); t > e;) n = kendo.date.nextDay(e), i = this._isWorkDay(e), (!this.options.showWorkDays || i) && r.push({ start: e, end: n, isNonWorking: !i, span: 1 }), e = n; return r }, _weeks: function(e, t) { var n, i, r, o = [], a = this.calendarInfo().firstDay; for (e = new Date(e), t = new Date(t); t > e;) n = kendo.date.dayOfWeek(kendo.date.addDays(e, 1), a, 1), n > t && (n = t), i = this._days(e, n), r = i.length, r > 0 && o.push({ start: i[0].start, end: i[r - 1].end, span: r }), e = n; return o }, _months: function(e, t) { var n, i, r, o = []; for (e = new Date(e), t = new Date(t); t > e;) n = new Date(e), n.setMonth(n.getMonth() + 1), i = this._days(e, n), r = i.length, r > 0 && o.push({ start: i[0].start, end: i[r - 1].end, span: r }), e = n; return o }, _years: function(e, t) { var n, i = []; for (e = new Date(e), t = new Date(t); t > e;) n = new Date(e), n.setFullYear(n.getFullYear() + 1), i.push({ start: e, end: n, span: 12 }), e = n; return i }, _slotHeaders: function(e, t) { var n, i, r, o = []; for (i = 0, r = e.length; r > i; i++) n = e[i], o.push({ text: t(n), isNonWorking: !!n.isNonWorking, span: n.span }); return o }, _isWorkDay: function(e) { var t, n, i = e.getDay(), r = this._workDays; for (t = 0, n = r.length; n > t; t++) if (r[t] === i) return !0; return !1 }, calendarInfo: function() { return kendo.getCulture().calendars.standard }, _renderCurrentTime: function() { var t, n = this._getCurrentTime(), i = this._offset(n), r = e("<div class='k-current-time'></div>"), o = R.styles, a = e(x + o.tasksWrapper), s = e(x + o.tasksTable); this.content && this._timeSlots().length && (this.content.find(".k-current-time").remove(), t = this._timeSlots()[this._slotIndex("start", n)], t.start > n || n > t.end || (a.length && s.length && (i += s.offset().left - a.offset().left), r.css({ left: i + "px", top: "0px", width: "1px", height: this._contentHeight + "px" }).appendTo(this.content))) }, _getCurrentTime: function() { return new Date }, _currentTime: function() { var e = this.options.currentTimeMarker; e !== !1 && void 0 !== e.updateInterval && (this._renderCurrentTime(), this._currentTimeUpdateTimer = setInterval(u(this._renderCurrentTime, this), e.updateInterval)) } }); d(!0, R, { styles: F }), kendo.ui.GanttDayView = R.extend({ name: "day", options: { timeHeaderTemplate: C, dayHeaderTemplate: S, resizeTooltipFormat: "h:mm tt ddd, MMM d" }, range: function(e) { this.start = kendo.date.getDate(e.start), this.end = kendo.date.getDate(e.end), (kendo.date.getMilliseconds(e.end) > 0 || this.end.getTime() === this.start.getTime()) && (this.end = kendo.date.addDays(this.end, 1)) }, _createSlots: function() { var e, t, n, i, r = [], o = this._days(this.start, this.end), a = []; for (n = 0, i = o.length; i > n; n++) e = o[n], t = this._hours(e.start, e.end), e.span = t.length, a.push.apply(a, t); return r.push(o), r.push(a), r }, _layout: function() { var e = [], t = this.options; return e.push(this._slotHeaders(this._slots[0], kendo.template(t.dayHeaderTemplate))), e.push(this._slotHeaders(this._slots[1], kendo.template(t.timeHeaderTemplate))), e } }), kendo.ui.GanttWeekView = R.extend({ name: "week", options: { dayHeaderTemplate: S, weekHeaderTemplate: T, resizeTooltipFormat: "h:mm tt ddd, MMM d" }, range: function(e) { var t = this.calendarInfo(), n = t.firstDay, i = e.end; n === i.getDay() && i.setDate(i.getDate() + 7), this.start = kendo.date.getDate(kendo.date.dayOfWeek(e.start, n, -1)), this.end = kendo.date.getDate(kendo.date.dayOfWeek(i, n, 1)) }, _createSlots: function() { var e = []; return e.push(this._weeks(this.start, this.end)), e.push(this._days(this.start, this.end)), e }, _layout: function() { var e = [], t = this.options; return e.push(this._slotHeaders(this._slots[0], kendo.template(t.weekHeaderTemplate))), e.push(this._slotHeaders(this._slots[1], kendo.template(t.dayHeaderTemplate))), e } }), kendo.ui.GanttMonthView = R.extend({ name: "month", options: { weekHeaderTemplate: T, monthHeaderTemplate: D, resizeTooltipFormat: "dddd, MMM d, yyyy" }, range: function(e) { this.start = kendo.date.firstDayOfMonth(e.start), this.end = kendo.date.addDays(kendo.date.getDate(kendo.date.lastDayOfMonth(e.end)), 1) }, _createSlots: function() { var e = []; return e.push(this._months(this.start, this.end)), e.push(this._weeks(this.start, this.end)), e }, _layout: function() { var e = [], t = this.options; return e.push(this._slotHeaders(this._slots[0], kendo.template(t.monthHeaderTemplate))), e.push(this._slotHeaders(this._slots[1], kendo.template(t.weekHeaderTemplate))), e } }), kendo.ui.GanttYearView = R.extend({ name: "year", options: { yearHeaderTemplate: A, monthHeaderTemplate: D, resizeTooltipFormat: "dddd, MMM d, yyyy" }, range: function(e) { this.start = kendo.date.firstDayOfMonth(new Date(e.start.setMonth(0))), this.end = kendo.date.firstDayOfMonth(new Date(e.end.setMonth(12))) }, _createSlots: function() { var t = [], n = this._months(this.start, this.end); return e(n).each(function(e, t) { t.span = 1 }), t.push(this._years(this.start, this.end)), t.push(n), t }, _layout: function() { var e = [], t = this.options; return e.push(this._slotHeaders(this._slots[0], kendo.template(t.yearHeaderTemplate))), e.push(this._slotHeaders(this._slots[1], kendo.template(t.monthHeaderTemplate))), e } }), r = { wrapper: "k-timeline k-grid k-widget", gridHeader: "k-grid-header", gridHeaderWrap: "k-grid-header-wrap", gridContent: "k-grid-content", gridContentWrap: "k-grid-content", tasksWrapper: "k-gantt-tables", dependenciesWrapper: "k-gantt-dependencies", task: "k-task", line: "k-line", taskResizeHandle: "k-resize-handle", taskResizeHandleWest: "k-resize-w", taskDragHandle: "k-task-draghandle", taskComplete: "k-task-complete", taskDelete: "k-task-delete", taskWrapActive: "k-task-wrap-active", taskWrap: "k-task-wrap", taskDot: "k-task-dot", taskDotStart: "k-task-start", taskDotEnd: "k-task-end", hovered: "k-state-hover", selected: "k-state-selected", origin: "k-origin" }, o = kendo.ui.GanttTimeline = a.extend({ init: function(e, t) { a.fn.init.call(this, e, t), this.options.views && this.options.views.length || (this.options.views = ["day", "week", "month"]), p = kendo.support.isRtl(e), this._wrapper(), this._domTrees(), this._views(), this._selectable(), this._draggable(), this._resizable(), this._percentResizeDraggable(), this._createDependencyDraggable(), this._attachEvents(), this._tooltip() }, options: { name: "GanttTimeline", messages: { views: { day: "Day", week: "Week", month: "Month", year: "Year", start: "Start", end: "End" } }, snap: !0, selectable: !0, editable: !0 }, destroy: function() { a.fn.destroy.call(this), clearTimeout(this._tooltipTimeout), this._currentTimeUpdateTimer && clearInterval(this._currentTimeUpdateTimer), this._unbindView(this._selectedView), this._moveDraggable && this._moveDraggable.destroy(), this._resizeDraggable && this._resizeDraggable.destroy(), this._percentDraggable && this._percentDraggable.destroy(), this._dependencyDraggable && this._dependencyDraggable.destroy(), this.touch && this.touch.destroy(), this._headerTree = null, this._taskTree = null, this._dependencyTree = null, this.wrapper.off(m), kendo.destroy(this.wrapper) }, _wrapper: function() { var e = o.styles; this.wrapper = this.element.addClass(e.wrapper).append("<div class='" + e.gridHeader + "'><div class='" + e.gridHeaderWrap + "'></div></div>").append("<div class='" + e.gridContentWrap + "'><div class='" + e.tasksWrapper + "'></div><div class='" + e.dependenciesWrapper + "'></div></div>") }, _domTrees: function() { var e = o.styles, t = kendo.dom.Tree, n = this.wrapper; this._headerTree = new t(n.find(x + e.gridHeaderWrap)[0]), this._taskTree = new t(n.find(x + e.tasksWrapper)[0]), this._dependencyTree = new t(n.find(x + e.dependenciesWrapper)[0]) }, _views: function() { var e, t, n, i, r, o, a, s = this.options.views; for (this.views = {}, o = 0, a = s.length; a > o; o++) e = s[o], t = c(e), t && e.selectable === !1 || (n = t ? "string" != typeof e.type ? e.title : e.type : e, i = z[n], i && (t && (e.type = i.type), i.title = this.options.messages.views[n]), e = d({ title: n }, i, t ? e : {}), n && (this.views[n] = e, (!r || e.selected) && (r = n))); r && (this._selectedViewName = r) }, view: function(e) { return e && (this._selectView(e), this.trigger("navigate", { view: e, action: "changeView" })), this._selectedView }, _selectView: function(e) { e && this.views[e] && (this._selectedView && this._unbindView(this._selectedView), this._selectedView = this._initializeView(e), this._selectedViewName = e) }, _viewByIndex: function(e) { var t, n = this.views; for (t in n) { if (!e) return t; e-- } }, _initializeView: function(e) { var n, i = this.views[e]; if (i) { if (n = i.type, "string" == typeof n && (n = kendo.getter(i.type)(window)), !n) throw Error("There is no such view"); i = new n(this.wrapper, t(d(!0, { headerTree: this._headerTree, taskTree: this._taskTree, dependencyTree: this._dependencyTree }, i, this.options))) } return i }, _unbindView: function(e) { e && e.destroy() }, _range: function(e) { var t, n, i = { field: "start", dir: "asc" }, r = { field: "end", dir: "desc" }; return e && e.length ? (t = new g(e).sort(i).toArray()[0].start || new Date, n = new g(e).sort(r).toArray()[0].end || new Date, { start: new Date(t), end: new Date(n) }) : { start: new Date, end: new Date } }, _render: function(e) { var t = this.view(), n = this._range(e); this._tasks = e, t.range(n), t.renderLayout(), t.render(e) }, _renderDependencies: function(e) { this.view()._renderDependencies(e) }, _taskByUid: function(e) { var t, n, i = this._tasks, r = i.length; for (n = 0; r > n; n++) if (t = i[n], t.uid === e) return t }, _draggable: function() { var e, t, n, r, a = this, s = this.options.snap, l = o.styles, c = function() { a.view()._removeDragHint(), e && e.css("opacity", 1), e = null, t = null, a.dragInProgress = !1 }; this.options.editable && (this._moveDraggable = new kendo.ui.Draggable(this.wrapper, { distance: 0, filter: x + l.task, holdToDrag: kendo.support.mobileOS, ignore: x + l.taskResizeHandle }), this._moveDraggable.bind("dragstart", function(i) { var o = a.view(); return e = i.currentTarget.parent(), t = a._taskByUid(i.currentTarget.attr("data-uid")), a.trigger("moveStart", { task: t }) ? void i.preventDefault() : (n = t.start, r = o._timeByPosition(i.x.location, s) - n, o._createDragHint(e), e.css("opacity", .5), clearTimeout(a._tooltipTimeout), void(a.dragInProgress = !0)) }).bind("drag", kendo.throttle(function(e) { var i, o, l; a.dragInProgress && (i = a.view(), o = new Date(i._timeByPosition(e.x.location, s) - r), l = o, a.trigger("move", { task: t, start: o }) || (n = o, p && (l = new Date(n.getTime() + t.duration())), i._updateDragHint(l))) }, 15)).bind("dragend", function() { a.trigger("moveEnd", { task: t, start: n }), c() }).bind("dragcancel", function() { c() }).userEvents.bind("select", function() { i() })) }, _resizable: function() { var e, t, n, r, a, s = this, l = this.options.snap, c = o.styles, d = function() { s.view()._removeResizeHint(), e = null, t = null, s.dragInProgress = !1 }; this.options.editable && (this._resizeDraggable = new kendo.ui.Draggable(this.wrapper, { distance: 0, filter: x + c.taskResizeHandle, holdToDrag: !1 }), this._resizeDraggable.bind("dragstart", function(i) { return a = i.currentTarget.hasClass(c.taskResizeHandleWest), p && (a = !a), e = i.currentTarget.closest(x + c.task), t = s._taskByUid(e.attr("data-uid")), s.trigger("resizeStart", { task: t }) ? void i.preventDefault() : (n = t.start, r = t.end, s.view()._createResizeHint(t), clearTimeout(s._tooltipTimeout), void(s.dragInProgress = !0)) }).bind("drag", kendo.throttle(function(e) { var i, o; s.dragInProgress && (i = s.view(), o = i._timeByPosition(e.x.location, l, !a), a ? n = r > o ? o : r : r = o > n ? o : n, s.trigger("resize", { task: t, start: n, end: r }) || i._updateResizeHint(n, r, a)) }, 15)).bind("dragend", function() { s.trigger("resizeEnd", { task: t, resizeStart: a, start: n, end: r }), d() }).bind("dragcancel", function() { d() }).userEvents.bind("select", function() { i() })) }, _percentResizeDraggable: function() { var e, t, n, r, a, s, l, c, d, u, h = this, f = o.styles, g = function() { h.view()._removePercentCompleteTooltip(), t = null, e = null, h.dragInProgress = !1 }, m = function(e) { t.find(x + f.taskComplete).width(e).end().siblings(x + f.taskDragHandle).css(p ? "right" : "left", e) }; this.options.editable && (this._percentDraggable = new kendo.ui.Draggable(this.wrapper, { distance: 0, filter: x + f.taskDragHandle, holdToDrag: !1 }), this._percentDraggable.bind("dragstart", function(i) { return h.trigger("percentResizeStart") ? void i.preventDefault() : (t = i.currentTarget.siblings(x + f.task), e = h._taskByUid(t.attr("data-uid")), l = e.percentComplete, n = t.offset(), r = this.element.offset(), a = t.find(x + f.taskComplete).width(), s = t.outerWidth(), clearTimeout(h._tooltipTimeout), void(h.dragInProgress = !0)) }).bind("drag", kendo.throttle(function(e) { if (h.dragInProgress) { u = p ? -e.x.initialDelta : e.x.initialDelta; var t = Math.max(0, Math.min(s, a + u)); l = Math.round(t / s * 100), m(t), c = n.top - r.top, d = n.left + t - r.left, p && (d += s - 2 * t), h.view()._updatePercentCompleteTooltip(c, d, l) } }, 15)).bind("dragend", function() { h.trigger("percentResizeEnd", { task: e, percentComplete: l / 100 }), g() }).bind("dragcancel", function() { m(a), g() }).userEvents.bind("select", function() { i() })) }, _createDependencyDraggable: function() { var t, n, r, a = this, s = e(), l = e(), c = h.msie && 9 > h.version, d = o.styles, u = function() { t.css("display", "").removeClass(d.hovered), t.parent().removeClass(d.origin), t = null, p(!1), l = e(), s = e(), a.view()._removeDependencyDragHint(), a.dragInProgress = !1 }, p = function(e) { l.hasClass(d.origin) || (l.find(x + d.taskDot).css("display", e ? "block" : ""), s.toggleClass(d.hovered, e)) }; this.options.editable && (c && document.namespaces && document.namespaces.add("kvml", "urn:schemas-microsoft-com:vml", "#default#VML"), this._dependencyDraggable = new kendo.ui.Draggable(this.wrapper, { distance: 0, filter: x + d.taskDot, holdToDrag: !1 }), this._dependencyDraggable.bind("dragstart", function(i) { var o, s; return a.trigger("dependencyDragStart") ? void i.preventDefault() : (t = i.currentTarget.css("display", "block").addClass(d.hovered), t.parent().addClass(d.origin), o = t.offset(), s = e(x + d.tasksWrapper).offset(), n = Math.round(o.left - s.left + t.outerHeight() / 2), r = Math.round(o.top - s.top + t.outerWidth() / 2), clearTimeout(a._tooltipTimeout), void(a.dragInProgress = !0)) }).bind("drag", kendo.throttle(function(t) { var i, o, u, h; a.dragInProgress && (a.view()._removeDependencyDragHint(), i = e(kendo.elementUnderCursor(t)), o = e(x + d.tasksWrapper).offset(), u = t.x.location - o.left, h = t.y.location - o.top, a.view()._updateDependencyDragHint({ x: n, y: r }, { x: u, y: h }, c), p(!1), s = i.hasClass(d.taskDot) ? i : e(), l = i.closest(x + d.taskWrap), p(!0)) }, 15)).bind("dragend", function() { var e, n, i, r, o; s.length && (e = t.hasClass(d.taskDotStart), n = s.hasClass(d.taskDotStart), i = e ? n ? 3 : 2 : n ? 1 : 0, r = a._taskByUid(t.siblings(x + d.task).attr("data-uid")), o = a._taskByUid(s.siblings(x + d.task).attr("data-uid")), r !== o && a.trigger("dependencyDragEnd", { type: i, predecessor: r, successor: o })), u() }).bind("dragcancel", function() { u() }).userEvents.bind("select", function() { i() })) }, _selectable: function() { var t = this, n = o.styles; this.options.selectable && this.wrapper.on(v + m, x + n.task, function(n) { n.stopPropagation(), n.ctrlKey ? t.trigger("clear") : t.trigger("select", { uid: e(this).attr("data-uid") }) }).on(v + m, x + n.taskWrap, function(t) { t.stopPropagation(), e(this).css("z-index", "0"); var i = e(document.elementFromPoint(t.clientX, t.clientY)); i.hasClass(n.line) && i.click(), e(this).css("z-index", "") }).on(v + m, x + n.tasksWrapper, function() { t.selectDependency().length > 0 ? t.clearSelection() : t.trigger("clear") }).on(v + m, x + n.line, function(e) { e.stopPropagation(), t.selectDependency(this) }) }, select: function(e) { var t = this.wrapper.find(e), n = o.styles; return t.length ? (this.clearSelection(), t.addClass(n.selected), void(kendo.support.mobileOS && t.parent().addClass(n.taskWrapActive))) : this.wrapper.find(x + n.task + x + n.selected) }, selectDependency: function(t) { var n, i = this.wrapper.find(t), r = o.styles; return i.length ? (this.clearSelection(), this.trigger("clear"), n = e(i).attr("data-uid"), void this.wrapper.find(x + r.line + "[data-uid='" + n + "']").addClass(r.selected)) : this.wrapper.find(x + r.line + x + r.selected) }, clearSelection: function() { var e = o.styles; this.wrapper.find(x + e.selected).removeClass(e.selected), kendo.support.mobileOS && this.wrapper.find(x + e.taskWrapActive).removeClass(e.taskWrapActive) }, _attachEvents: function() { var t = this, n = o.styles; this.options.editable && (this._tabindex(), this.wrapper.on(v + m, x + n.taskDelete, function(i) { t.trigger("removeTask", { uid: e(this).closest(x + n.task).attr("data-uid") }), i.stopPropagation(), i.preventDefault() }).on(k + m, function(e) { var n; e.keyCode === f.DELETE && (n = t.selectDependency(), n.length && (t.trigger("removeDependency", { uid: n.attr("data-uid") }), t.clearSelection())) }), kendo.support.mobileOS ? this.touch = this.wrapper.kendoTouch({ filter: x + n.task, doubletap: function(n) { t.trigger("editTask", { uid: e(n.touch.currentTarget).attr("data-uid") }) } }).data("kendoTouch") : this.wrapper.on(_ + m, x + n.task, function(n) { t.trigger("editTask", { uid: e(this).attr("data-uid") }), n.stopPropagation(), n.preventDefault() })) }, _tooltip: function() { var t, n = this, i = this.options.tooltip, r = o.styles, a = function(e) { t = e.clientX }; i && i.visible === !1 || (kendo.support.mobileOS ? (this.wrapper.on(v + m, x + r.taskDelete, function(e) { e.stopPropagation(), n.view()._removeTaskTooltip() }).on(y + m, x + r.task, function(t) { var i = e(t.relatedTarget).parents(x + r.taskWrap, x + r.task); 0 === i.length && n.view()._removeTaskTooltip() }), this.touch.bind("tap", function(t) { var i = t.touch.target, r = n._taskByUid(e(i).attr("data-uid")), o = t.touch.x.client; n.view()._taskTooltip && n.view()._removeTaskTooltip(), n.view()._createTaskTooltip(r, i, o) }).bind("doubletap", function() { n.view()._removeTaskTooltip() })) : this.wrapper.on(b + m, x + r.task, function() { var i = this, r = n._taskByUid(e(this).attr("data-uid")); n.dragInProgress || (n._tooltipTimeout = setTimeout(function() { n.view()._createTaskTooltip(r, i, t) }, 800), e(this).on(w, a)) }).on(y + m, x + r.task, function() { clearTimeout(n._tooltipTimeout), n.view()._removeTaskTooltip(), e(this).off(w, a) })) } }), d(!0, o, { styles: r }) }(window.kendo.jQuery), function(e, t) { function n(e) { return "[" + f.attr("uid") + (e ? "='" + e + "']" : "]") } function i(e) { return delete e.name, delete e.prefix, delete e.remove, delete e.edit, delete e.add, delete e.navigate, e } function r(e) { var t, n, i, r, o, a; if (e.filter("[name=end], [name=start]").length) { for (t = e.attr("name"), n = f.widgetInstance(e, f.ui), i = {}, r = e; r !== window && !o;) r = r.parent(), o = r.data("kendoEditable"); return (a = o ? o.options.model : null) ? (i.start = a.start, i.end = a.end, i[t] = n ? n.value() : f.parseDate(e.value()), i.end >= i.start) : !0 } return !0 } function o(t, n) { var i = t.parents("[" + f.attr("role") + '="gantt"]'), r = [], o = a(i); t.attr(z, 0), n && o.each(function(t, n) { r[t] = e(n).scrollTop() }); try { t[0].setActive() } catch (s) { t[0].focus() } n && o.each(function(t, n) { e(n).scrollTop(r[t]) }) } function a(t) { return e(t).parentsUntil("body").filter(function(e, t) { var n = f.getComputedStyles(t, ["overflow"]); return "visible" != n.overflow }).add(window) } var s, l, c, d, u, h, p, f = window.kendo, g = f.support.browser, m = f.support.mobileOS, v = f.Observable, _ = f.ui.Widget, w = f.data.DataSource, b = f.data.ObservableObject, y = f.data.ObservableArray, k = f.data.Query, x = e.isArray, C = e.inArray, S = f.isFunction, T = e.proxy, D = e.extend, A = e.isPlainObject, E = e.map, I = f.keys, P = ".kendoGantt", M = "p0", z = "tabIndex", F = "click", R = "width", H = "string", B = { down: { origin: "bottom center", position: "top center" }, up: { origin: "top center", position: "bottom center" } }, L = "aria-activedescendant", N = "gantt_active_cell", O = "action-option-focused", V = ".", U = "Are you sure you want to delete this task?", W = "Are you sure you want to delete this dependency?", j = '<button class="#=styles.button# #=className#" #if (action) {#data-action="#=action#"#}#><span class="#=iconClass#"></span>#=text#</button>', G = '<a class="#=className#" #=attr# href="\\#">#=text#</a>', q = f.template('<ul class="#=styles.viewsWrapper#">#for(var view in views){#<li class="#=styles.viewButtonDefault# #=styles.viewButton#-#= view.toLowerCase() #" data-#=ns#name="#=view#"><a href="\\#" class="#=styles.link#">#=views[view].title#</a></li>#}#</ul>'), $ = f.template('<div class="#=styles.popupWrapper#"><ul class="#=styles.popupList#" role="listbox">#for(var i = 0, l = actions.length; i < l; i++){#<li class="#=styles.item#" data-action="#=actions[i].data#" role="option">#=actions[i].text#</span>#}#</ul></div>'), Y = function(t, n) { var i = { name: n.field }, r = n.model.fields[n.field].validation; r && A(r) && r.message && (i[f.attr("dateCompare-msg")] = r.message), e('<input type="text" required ' + f.attr("type") + '="date" ' + f.attr("role") + '="datetimepicker" ' + f.attr("bind") + '="value:' + n.field + '" ' + f.attr("validate") + "='true' />").attr(i).appendTo(t), e("<span " + f.attr("for") + '="' + n.field + '" class="k-invalid-msg"/>').hide().appendTo(t) }, Q = function(t, n) { e('<a href="#" class="' + n.styles.button + '">' + n.messages.assignButton + "</a>").click(n.click).appendTo(t) }, K = { wrapper: "k-widget k-gantt", listWrapper: "k-gantt-layout k-gantt-treelist", list: "k-gantt-treelist", timelineWrapper: "k-gantt-layout k-gantt-timeline", timeline: "k-gantt-timeline", splitBarWrapper: "k-splitbar k-state-default k-splitbar-horizontal k-splitbar-draggable-horizontal k-gantt-layout", splitBar: "k-splitbar", splitBarHover: "k-splitbar-horizontal-hover", popupWrapper: "k-list-container", popupList: "k-list k-reset", resizeHandle: "k-resize-handle", icon: "k-icon", item: "k-item", line: "k-line", buttonDelete: "k-gantt-delete", buttonCancel: "k-gantt-cancel", buttonSave: "k-gantt-update", primary: "k-primary", hovered: "k-state-hover", selected: "k-state-selected", focused: "k-state-focused", gridHeader: "k-grid-header", gridHeaderWrap: "k-grid-header-wrap", gridContent: "k-grid-content", popup: { form: "k-popup-edit-form", editForm: "k-gantt-edit-form", formContainer: "k-edit-form-container", resourcesFormContainer: "k-resources-form-container", message: "k-popup-message", buttonsContainer: "k-edit-buttons k-state-default", button: "k-button", editField: "k-edit-field", editLabel: "k-edit-label", resourcesField: "k-gantt-resources" }, toolbar: { headerWrapper: "k-floatwrap k-header k-gantt-toolbar", footerWrapper: "k-floatwrap k-header k-gantt-toolbar", toolbar: "k-gantt-toolbar", views: "k-gantt-views", viewsWrapper: "k-reset k-header k-gantt-views", actions: "k-gantt-actions", button: "k-button k-button-icontext", iconPlus: "k-icon k-i-plus", iconPdf: "k-icon k-i-pdf", viewButtonDefault: "k-state-default", viewButton: "k-view", link: "k-link", pdfButton: "k-gantt-pdf", appendButton: "k-gantt-create" } }, X = { append: { text: "Add Task", action: "add", className: K.toolbar.appendButton, iconClass: K.toolbar.iconPlus }, pdf: { text: "Export to PDF", className: K.toolbar.pdfButton, iconClass: K.toolbar.iconPdf } }, Z = v.extend({ init: function(e, t) { v.fn.init.call(this), this.element = e, this.options = D(!0, {}, this.options, t), this._popup() }, options: { direction: "down", navigatable: !1 }, _current: function(e) { var t = p.styles, n = this.list.find(V + t.focused), i = n[e](); i.length && (n.removeClass(t.focused).removeAttr("id"), i.addClass(t.focused).attr("id", O), this.list.find("ul").removeAttr(L).attr(L, O)) }, _popup: function() { var t = this, n = p.styles, i = "li" + V + n.item, r = V + n.toolbar.appendButton, o = this.options.messages.actions, a = this.options.navigatable; this.list = e($({ styles: n, actions: [{ data: "add", text: o.addChild }, { data: "insert-before", text: o.insertBefore }, { data: "insert-after", text: o.insertAfter }] })), this.element.append(this.list), this.popup = new f.ui.Popup(this.list, D({ anchor: this.element.find(r), open: function() { t._adjustListWidth() }, animation: this.options.animation }, B[this.options.direction])), this.element.on(F + P, r, function(i) { var r = e(this), o = r.attr(f.attr("action")); i.preventDefault(), o ? t.trigger("command", { type: o }) : (t.popup.open(), a && t.list.find("li:first").addClass(n.focused).attr("id", O).end().find("ul").attr({ TABINDEX: 0, "aria-activedescendant": O }).focus()) }), this.list.find(i).hover(function() { e(this).addClass(n.hovered) }, function() { e(this).removeClass(n.hovered) }).end().on(F + P, i, function() { t.trigger("command", { type: e(this).attr(f.attr("action")) }), t.popup.close() }), a && (this.popup.bind("close", function() { t.list.find(i).removeClass(n.focused).end().find("ul").attr(z, 0), t.element.parents("[" + f.attr("role") + '="gantt"]').find(V + n.gridContent + " > table:first").focus() }), this.list.find("ul").on("keydown" + P, function(e) { var i = e.keyCode; switch (i) { case I.UP: e.preventDefault(), t._current("prev"); break; case I.DOWN: e.preventDefault(), t._current("next"); break; case I.ENTER: t.list.find(V + n.focused).click(); break; case I.ESC: e.preventDefault(), t.popup.close() } })) }, _adjustListWidth: function() { var e, t, n = this.list, i = p.styles, r = n[0].style.width, o = this.element.find(V + i.toolbar.appendButton); (n.data(R) || !r) && (e = window.getComputedStyle ? window.getComputedStyle(o[0], null) : 0, t = e ? parseFloat(e.width) : o.outerWidth(), e && (g.mozilla || g.msie) && (t += parseFloat(e.paddingLeft) + parseFloat(e.paddingRight) + parseFloat(e.borderLeftWidth) + parseFloat(e.borderRightWidth)), r = "border-box" !== n.css("box-sizing") ? t - (n.outerWidth() - n.width()) : t, n.css({ fontFamily: o.css("font-family"), width: r }).data(R, r)) }, destroy: function() { clearTimeout(this._focusTimeout), this.popup.destroy(), this.element.off(P), this.list.off(P), this.unbind() } }), J = function(e, t) { return function(n) { var i, r; if (n = x(i) ? { data: n } : n, i = n || {}, r = i.data, i.data = r, !(i instanceof e) && i instanceof w) throw Error("Incorrect DataSource type. Only " + t + " instances are supported"); return i instanceof e ? i : new e(i) } }, et = f.data.Model.define({ id: "id", fields: { id: { type: "number" }, predecessorId: { type: "number" }, successorId: { type: "number" }, type: { type: "number" } } }), tt = w.extend({ init: function(e) { w.fn.init.call(this, D(!0, {}, { schema: { modelBase: et, model: et } }, e)) }, successors: function(e) { return this._dependencies("predecessorId", e) }, predecessors: function(e) { return this._dependencies("successorId", e) }, dependencies: function(e) { var t = this.predecessors(e), n = this.successors(e); return t.push.apply(t, n), t }, _dependencies: function(e, t) { var n = this.view(), i = { field: e, operator: "eq", value: t }; return n = new k(n).filter(i).toArray() } }); tt.create = J(tt, "GanttDependencyDataSource"), s = f.data.Model.define({ duration: function() { var e = this.end, t = this.start; return e - t }, isMilestone: function() { return 0 === this.duration() }, _offset: function(e) { var t, n, i = ["start", "end"]; for (n = 0; i.length > n; n++) t = new Date(this.get(i[n]).getTime() + e), this.set(i[n], t) }, id: "id", fields: { id: { type: "number" }, parentId: { type: "number", defaultValue: null, validation: { required: !0 } }, orderId: { type: "number", validation: { required: !0 } }, title: { type: "string", defaultValue: "" }, start: { type: "date", validation: { required: !0 } }, end: { type: "date", validation: { required: !0, dateCompare: r, message: "End date should be after or equal to the start date" } }, percentComplete: { type: "number", validation: { required: !0, min: 0, max: 1, step: .01 } }, summary: { type: "boolean" }, expanded: { type: "boolean", defaultValue: !0 } } }), l = w.extend({ init: function(e) { w.fn.init.call(this, D(!0, {}, { schema: { modelBase: s, model: s } }, e)) }, remove: function(e) { var t = e.get("parentId"), n = this.taskAllChildren(e); return this._removeItems(n), e = w.fn.remove.call(this, e), this._childRemoved(t, e.get("orderId")), e }, add: function(e) { return e ? (e = this._toGanttTask(e), this.insert(this.taskSiblings(e).length, e)) : t }, insert: function(e, n) { return n ? (n = this._toGanttTask(n), n.set("orderId", e), n = w.fn.insert.call(this, e, n), this._reorderSiblings(n, this.taskSiblings(n).length - 1), this._resolveSummaryFields(this.taskParent(n)), n) : t }, taskChildren: function(e) { var n, i = this.view(), r = { field: "parentId", operator: "eq", value: null }, o = this._sort || { field: "orderId", dir: "asc" }; if (e) { if (n = e.get("id"), n === t || null === n || "" === n) return []; r.value = n } return i = new k(i).filter(r).sort(o).toArray() }, taskAllChildren: function(e) { var t = [], n = this, i = function(e) { var r = n.taskChildren(e); t.push.apply(t, r), E(r, i) }; return e ? i(e) : t = this.view(), t }, taskSiblings: function(e) { if (!e) return null; var t = this.taskParent(e); return this.taskChildren(t) }, taskParent: function(e) { return e && null !== e.get("parentId") ? this.get(e.parentId) : null }, taskLevel: function(e) { for (var t = 0, n = this.taskParent(e); null !== n;) t += 1, n = this.taskParent(n); return t }, taskTree: function(e) { var t, n, i, r, o = [], a = this.taskChildren(e); for (n = 0, i = a.length; i > n; n++) t = a[n], o.push(t), t.get("expanded") && (r = this.taskTree(t), o.push.apply(o, r)); return o }, update: function(e, n) { var i, r, o = this, a = function(e, t) { var n, i, r = o.taskAllChildren(e); for (n = 0, i = r.length; i > n; n++) r[n]._offset(t) }, s = function(e) { var t = e.field, n = e.sender; switch (t) { case "start": o._resolveSummaryStart(o.taskParent(n)), a(n, n.get(t).getTime() - i.getTime()); break; case "end": o._resolveSummaryEnd(o.taskParent(n)); break; case "percentComplete": o._resolveSummaryPercentComplete(o.taskParent(n)); break; case "orderId": o._reorderSiblings(n, i) } }; n.parentId !== t && (i = e.get("parentId"), i !== n.parentId && (e.set("parentId", n.parentId), o._childRemoved(i, e.get("orderId")), e.set("orderId", o.taskSiblings(e).length - 1), o._resolveSummaryFields(o.taskParent(e))), delete n.parentId), e.bind("change", s); for (r in n) i = e.get(r), e.set(r, n[r]); e.unbind("change", s) }, _resolveSummaryFields: function(e) { e && (this._updateSummary(e), this.taskChildren(e).length && (this._resolveSummaryStart(e), this._resolveSummaryEnd(e), this._resolveSummaryPercentComplete(e))) }, _resolveSummaryStart: function(e) { var t = this, n = function(e) { var n, i, r, o = t.taskChildren(e), a = o[0].start.getTime(); for (i = 1, r = o.length; r > i; i++) n = o[i].start.getTime(), a > n && (a = n); return new Date(a) }; this._updateSummaryRecursive(e, "start", n) }, _resolveSummaryEnd: function(e) { var t = this, n = function(e) { var n, i, r, o = t.taskChildren(e), a = o[0].end.getTime(); for (i = 1, r = o.length; r > i; i++) n = o[i].end.getTime(), n > a && (a = n); return new Date(a) }; this._updateSummaryRecursive(e, "end", n) }, _resolveSummaryPercentComplete: function(e) { var t = this, n = function(e) { var n = t.taskChildren(e), i = new k(n).aggregate([{ field: "percentComplete", aggregate: "average" }]); return i.percentComplete.average }; this._updateSummaryRecursive(e, "percentComplete", n) }, _updateSummaryRecursive: function(e, t, n) { var i, r; e && (i = n(e), e.set(t, i), r = this.taskParent(e), r && this._updateSummaryRecursive(r, t, n)) }, _childRemoved: function(e, t) { var n, i, r = null === e ? null : this.get(e), o = this.taskChildren(r); for (n = t, i = o.length; i > n; n++) o[n].set("orderId", n); this._resolveSummaryFields(r) }, _reorderSiblings: function(e, t) { var n, i = e.get("orderId"), r = i > t, o = r ? t : i, a = r ? i : t, s = r ? o : o + 1, l = this.taskSiblings(e); for (a = Math.min(a, l.length - 1), n = o; a >= n; n++) l[n] !== e && (l[n].set("orderId", s), s += 1) }, _updateSummary: function(e) { if (null !== e) { var t = this.taskChildren(e).length; e.set("summary", t > 0) } }, _toGanttTask: function(e) { if (!(e instanceof s)) { var t = e; e = this._createNewModel(), e.accept(t) } return e } }), l.create = J(l, "GanttDataSource"), D(!0, f.data, { GanttDataSource: l, GanttTask: s, GanttDependencyDataSource: tt, GanttDependency: et }), c = { desktop: { dateRange: Y, resources: Q } }, d = f.Observable.extend({ init: function(e, t) { f.Observable.fn.init.call(this), this.element = e, this.options = D(!0, {}, this.options, t), this.createButton = this.options.createButton }, fields: function(t, n) { var i, r = this, o = this.options, a = o.messages.editor, s = o.resources, l = function(e) { e.preventDefault(), s.editor(r.container.find(V + p.styles.popup.resourcesField), n) }; return o.editable.template ? i = e.map(n.fields, function(e, t) { return { field: t } }) : (i = [{ field: "title", title: a.title }, { field: "start", title: a.start, editor: t.dateRange }, { field: "end", title: a.end, editor: t.dateRange }, { field: "percentComplete", title: a.percentComplete, format: M }], n.get(s.field) && i.push({ field: s.field, title: a.resources, messages: a, editor: t.resources, click: l, styles: p.styles.popup })), i }, _buildEditTemplate: function(e, t, n) { var i, r, o, a, s = this.options.resources, l = this.options.editable.template, c = D({}, f.Template, this.options.templateSettings), d = c.paramName, u = p.styles.popup, h = ""; if (l) typeof l === H && (l = window.unescape(l)), h += f.template(l, c)(e); else for (i = 0, r = t.length; r > i; i++) o = t[i], h += '<div class="' + u.editLabel + '"><label for="' + o.field + '">' + (o.title || o.field || "") + "</label></div>", o.field === s.field && (h += '<div class="' + u.resourcesField + '" style="display:none"></div>'), !e.editable || e.editable(o.field) ? (n.push(o), h += "<div " + f.attr("container-for") + '="' + o.field + '" class="' + u.editField + '"></div>') : (a = "#:", o.field ? (o = f.expr(o.field, d), a += o + "==null?'':" + o) : a += "''", a += "#", a = f.template(a, c), h += '<div class="' + u.editField + '">' + a(e) + "</div>"); return h } }), u = d.extend({ destroy: function() { this.close(), this.unbind() }, editTask: function(e) { this.editable = this._createPopupEditor(e) }, close: function() { var e = this, t = function() { e.editable && (e.editable.destroy(), e.editable = null, e.container = null), e.popup && (e.popup.destroy(), e.popup = null) }; this.editable && this.container.is(":visible") ? this.container.data("kendoWindow").bind("deactivate", t).close() : t() }, showDialog: function(t) { var n, i, r, o, a = t.buttons, s = p.styles.popup, l = f.format('<div class="{0}"><div class="{1}"><p class="{2}">{3}</p><div class="{4}">', s.form, s.formContainer, s.message, t.text, s.buttonsContainer); for (n = 0, i = a.length; i > n; n++) l += this.createButton(a[n]); l += "</div></div></div>", r = this.element, this.popup && this.popup.destroy(), o = this.popup = e(l).appendTo(r).eq(0).on("click", V + s.button, function(t) { t.preventDefault(), o.close(); var n = e(t.currentTarget).index(); a[n].click() }).kendoWindow({ modal: !0, resizable: !1, draggable: !1, title: t.title, visible: !1, close: function() { this.destroy(), r.focus() } }).getKendoWindow(), o.center().open() }, _createPopupEditor: function(t) { var n, i, r = this, o = {}, a = this.options.messages, s = p.styles, l = s.popup, d = f.format('<div {0}="{1}" class="{2} {3}"><div class="{4}">', f.attr("uid"), t.uid, l.form, l.editForm, l.formContainer), u = this.fields(c.desktop, t), h = []; return d += this._buildEditTemplate(t, u, h), d += '<div class="' + l.buttonsContainer + '">', d += this.createButton({ name: "update", text: a.save, className: p.styles.primary }), d += this.createButton({ name: "cancel", text: a.cancel }), d += this.createButton({ name: "delete", text: a.destroy }), d += "</div></div></div>", n = this.container = e(d).appendTo(this.element).eq(0).kendoWindow(D({ modal: !0, resizable: !1, draggable: !0, title: a.editor.editorTitle, visible: !1, close: function(e) { e.userTriggered && r.trigger("cancel", { container: n, model: t }) && e.preventDefault() } }, o)), i = n.kendoEditable({ fields: h, model: t, clearContainer: !1, validateOnBlur: !0, target: r.options.target }).data("kendoEditable"), f.cycleForm(n), this.trigger("edit", { container: n, model: t }) ? r.trigger("cancel", { container: n, model: t }) : (n.data("kendoWindow").center().open(), n.on(F + P, V + s.buttonCancel, function(e) { e.preventDefault(), e.stopPropagation(), r.trigger("cancel", { container: n, model: t }) }), n.on(F + P, V + s.buttonSave, function(e) { var i, o, a, s, l; for (e.preventDefault(), e.stopPropagation(), i = r.fields(c.desktop, t), o = {}, s = 0, l = i.length; l > s; s++) a = i[s].field, o[a] = t.get(a); r.trigger("save", { container: n, model: t, updateInfo: o }) }), n.on(F + P, V + s.buttonDelete, function(e) { e.preventDefault(), e.stopPropagation(), r.trigger("remove", { container: n, model: t }) })), i } }), h = _.extend({ init: function(e, t) { _.fn.init.call(this, e, t), this.wrapper = this.element, this.model = this.options.model, this.resourcesField = this.options.resourcesField, this.createButton = this.options.createButton, this._initContainer(), this._attachHandlers() }, events: ["save"], open: function() { this.window.center().open(), this.grid.resize(!0) }, close: function() { this.window.bind("deactivate", T(this.destroy, this)).close() }, destroy: function() { this._dettachHandlers(), this.grid.destroy(), this.grid = null, this.window.destroy(), this.window = null, _.fn.destroy.call(this), f.destroy(this.wrapper), this.element = this.wrapper = null }, _attachHandlers: function() { var t = p.styles, n = this.grid, i = this._cancelProxy = T(this._cancel, this); this.container.on(F + P, V + t.buttonCancel, this._cancelProxy), this._saveProxy = T(this._save, this), this.container.on(F + P, V + t.buttonSave, this._saveProxy), this.window.bind("close", function(e) { e.userTriggered && i(e) }), n.wrapper.on(F + P, "input[type='checkbox']", function() { var t = e(this), i = e(t).closest("tr"), r = n.dataSource.getByUid(i.attr(f.attr("uid"))), o = e(t).is(":checked") ? 1 : ""; r.set("value", o) }) }, _dettachHandlers: function() { this._cancelProxy = null, this._saveProxy = null, this.container.off(P), this.grid.wrapper.off() }, _cancel: function(e) { e.preventDefault(), this.close() }, _save: function(e) { e.preventDefault(), this._updateModel(), this.wrapper.is(V + p.styles.popup.resourcesField) || this.trigger("save", { container: this.wrapper, model: this.model }), this.close() }, _initContainer: function() { var t = p.styles.popup, n = f.format('<div class="{0} {1}"><div class="{2} {3}"/></div>"', t.form, t.editForm, t.formContainer, t.resourcesFormContainer); n = e(n), this.container = n.find(V + t.resourcesFormContainer), this.window = n.kendoWindow({ modal: !0, resizable: !1, draggable: !0, visible: !1, title: this.options.messages.resourcesEditorTitle }).data("kendoWindow"), this._resourceGrid(), this._createButtons() }, _resourceGrid: function() { var t = this, n = this.options.messages, i = e('<div id="resources-grid"/>').appendTo(this.container); this.grid = new f.ui.Grid(i, { columns: [{ field: "name", title: n.resourcesHeader, template: "<label><input type='checkbox' value='#=name#'# if (value > 0 && value !== null) {#checked='checked'# } #/>#=name#</labe>" }, { field: "value", title: n.unitsHeader, template: function(e) { var t = e.format, n = null !== e.value ? e.value : ""; return t ? f.toString(n, t) : n } }], height: 280, sortable: !0, editable: !0, filterable: !0, dataSource: { data: t.options.data, schema: { model: { id: "id", fields: { id: { from: "id" }, name: { from: "name", type: "string", editable: !1 }, value: { from: "value", type: "number", defaultValue: "" }, format: { from: "format", type: "string" } } } } }, save: function(e) { var t = !!e.values.value; e.container.parent().find("input[type='checkbox']").prop("checked", t) } }) }, _createButtons: function() { var e, t, n = this.options.buttons, i = '<div class="' + p.styles.popup.buttonsContainer + '">'; for (e = 0, t = n.length; t > e; e++) i += this.createButton(n[e]); i += "</div>", this.container.append(i) }, _updateModel: function() { var e, t, n, i = [], r = this.grid.dataSource.data(); for (t = 0, n = r.length; n > t; t++) e = r[t].get("value"), null !== e && e > 0 && i.push(r[t]); this.model[this.resourcesField] = i } }), p = _.extend({ init: function(e, t) { x(t) && (t = { dataSource: t }), _.fn.init.call(this, e, t), this._wrapper(), this._resources(), this._timeline(), this._toolbar(), this._footer(), this._adjustDimensions(), this._preventRefresh = !0, this.view(this.timeline._selectedViewName), this._preventRefresh = !1, this._dataSource(), this._assignments(), this._dropDowns(), this._list(), this._dependencies(), this._resizable(), this._scrollable(), this._dataBind(), this._attachEvents(), this._createEditor(), f.notify(this) }, events: ["dataBinding", "dataBound", "add", "edit", "remove", "cancel", "save", "change", "navigate", "moveStart", "move", "moveEnd", "resizeStart", "resize", "resizeEnd"], options: { name: "Gantt", autoBind: !0, navigatable: !1, selectable: !0, editable: !0, columns: [], views: [], dataSource: {}, dependencies: {}, resources: {}, assignments: {}, messages: { save: "Save", cancel: "Cancel", destroy: "Delete", deleteTaskConfirmation: U, deleteDependencyConfirmation: W, deleteTaskWindowTitle: "Delete task", deleteDependencyWindowTitle: "Delete dependency", views: { day: "Day", week: "Week", month: "Month", year: "Year", start: "Start", end: "End" }, actions: { append: "Add Task", addChild: "Add Child", insertBefore: "Add Above", insertAfter: "Add Below", pdf: "Export to PDF" }, editor: { editorTitle: "Task", resourcesEditorTitle: "Resources", title: "Title", start: "Start", end: "End", percentComplete: "Complete", resources: "Resources", assignButton: "Assign", resourcesHeader: "Resources", unitsHeader: "Units" } }, showWorkHours: !0, showWorkDays: !0, toolbar: null, workDayStart: new Date(1980, 1, 1, 8, 0, 0), workDayEnd: new Date(1980, 1, 1, 17, 0, 0), workWeekStart: 1, workWeekEnd: 5, hourSpan: 1, snap: !0, height: 600, listWidth: "30%" }, select: function(e) { var n = this.list; return e ? (n.select(e), t) : n.select() }, clearSelection: function() { this.list.clearSelection() }, destroy: function() { _.fn.destroy.call(this), this.dataSource && (this.dataSource.unbind("change", this._refreshHandler), this.dataSource.unbind("progress", this._progressHandler), this.dataSource.unbind("error", this._errorHandler)), this.dependencies && (this.dependencies.unbind("change", this._dependencyRefreshHandler), this.dependencies.unbind("error", this._dependencyErrorHandler)), this.timeline && (this.timeline.unbind(), this.timeline.destroy()), this.list && (this.list.unbind(), this.list.destroy()), this.footerDropDown && this.footerDropDown.destroy(), this.headerDropDown && this.headerDropDown.destroy(), this._editor && this._editor.destroy(), this._resizeDraggable && this._resizeDraggable.destroy(), this.toolbar.off(P), e(window).off("resize" + P, this._resizeHandler), e(this.wrapper).off(P), this.toolbar = null, this.footer = null }, _attachEvents: function() { this._resizeHandler = T(this.resize, this, !1), e(window).on("resize" + P, this._resizeHandler) }, _wrapper: function() { var e = p.styles, t = [e.icon, e.resizeHandle].join(" "), n = this.options, i = n.height, r = n.width; this.wrapper = this.element.addClass(e.wrapper).append("<div class='" + e.listWrapper + "'><div></div></div>").append("<div class='" + e.splitBarWrapper + "'><div class='" + t + "'></div></div>").append("<div class='" + e.timelineWrapper + "'><div></div></div>"), this.wrapper.find(V + e.list).width(n.listWidth), i && this.wrapper.height(i), r && this.wrapper.width(r) }, _toolbar: function() { var t, n, i = this, r = p.styles, o = V + r.toolbar.views + " > li", a = V + r.toolbar.pdfButton, s = r.hovered, l = this.options.toolbar, c = e("<div class='" + r.toolbar.actions + "'>"); S(l) || (l = typeof l === H ? l : this._actions(l), l = T(f.template(l), this)), n = e(q({ ns: f.ns, views: this.timeline.views, styles: r.toolbar })), c.append(l({})), t = e("<div class='" + r.toolbar.headerWrapper + "'>").append(c).append(n), this.wrapper.prepend(t), this.toolbar = t, t.on(F + P, o, function(t) { var n, r; t.preventDefault(), n = i.list, r = e(this).attr(f.attr("name")), n.editable && n.editable.trigger("validate") || i.trigger("navigate", { view: r }) || i.view(r) }).on(F + P, a, function() { i.saveAsPDF() }), this.wrapper.find(V + r.toolbar.toolbar + " li").hover(function() { e(this).addClass(s) }, function() { e(this).removeClass(s) }) }, _actions: function() { var e, t, n = this.options, i = n.toolbar, r = ""; if (!x(i)) { if (!n.editable) return r; i = ["append"] } for (e = 0, t = i.length; t > e; e++) r += this._createButton(i[e]); return r }, _footer: function() { var t, n, i, r, o; this.options.editable && (t = p.styles.toolbar, n = this.options.messages.actions, i = e(f.template(j)(D(!0, { styles: t }, X.append, { text: n.append }))), r = e("<div class='" + t.actions + "'>").append(i), o = e("<div class='" + t.footerWrapper + "'>").append(r), this.wrapper.append(o), this.footer = o) }, _createButton: function(e) { var t = e.template || j, n = this.options.messages.actions, i = typeof e === H ? e : e.name || e.text, r = X[i] ? X[i].className : "k-gantt-" + (i || "").replace(/\s/g, ""), o = { iconClass: "", action: "", text: i, className: r, styles: p.styles.toolbar }; if (!(i || A(e) && e.template)) throw Error("Custom commands should have name specified"); return o = D(!0, o, X[i], { text: n[i] }), A(e) && (e.className && C(o.className, e.className.split(" ")) < 0 && (e.className += " " + o.className), o = D(!0, o, e)), f.template(t)(o) }, _adjustDimensions: function() { var e = this.element, t = p.styles, n = V + t.list, i = V + t.timeline, r = V + t.splitBar, o = this.toolbar.outerHeight(), a = this.footer ? this.footer.outerHeight() : 0, s = e.height(), l = e.width(), c = e.find(r).outerWidth(), d = e.find(n).outerWidth(); e.children([n, i, r].join(",")).height(s - (o + a)).end().children(i).width(l - (c + d)) }, _scrollTo: function(e) { var t = this.timeline.view(), i = f.attr("uid"), r = "string" == typeof e ? e : e.closest("tr" + n()).attr(i), o = t.content.find(n(r)); 0 !== o.length && t._scrollTo(o) }, _dropDowns: function() { var e = this, t = V + p.styles.toolbar.actions, n = this.options.messages.actions, i = this.dataSource, r = this.timeline, o = function(t) { var n, o = t.type, a = i._createNewModel(), s = e.dataItem(e.select()), l = i.taskParent(s), c = r.view()._timeSlots()[0], d = "add" === o ? s : l, u = e.list.editable; u && u.trigger("validate") || (a.set("title", "New task"), d ? (a.set("parentId", d.get("id")), a.set("start", d.get("start")), a.set("end", d.get("end"))) : (a.set("start", c.start), a.set("end", c.end)), "add" !== o && (n = s.get("orderId"), n = "insert-before" === o ? n : n + 1), e._createTask(a, n)) }; this.options.editable && (this.footerDropDown = new Z(this.footer.children(t).eq(0), { messages: { actions: n }, direction: "up", animation: { open: { effects: "slideIn:up" } }, navigatable: e.options.navigatable }), this.headerDropDown = new Z(this.toolbar.children(t).eq(0), { messages: { actions: n }, navigatable: e.options.navigatable }), this.footerDropDown.bind("command", o), this.headerDropDown.bind("command", o)) }, _list: function() { var e, t, n = this, i = n.options.navigatable, r = p.styles, a = this.wrapper.find(V + r.list), s = a.find("> div"), l = this.wrapper.find(V + r.toolbar.actions + " > button"), c = { columns: this.options.columns || [], dataSource: this.dataSource, selectable: this.options.selectable, editable: this.options.editable, listWidth: a.outerWidth(), resourcesField: this.resources.field }, d = c.columns, u = function() { i && (n._current(n._cachedCurrent), o(n.list.content.find("table"), !0)), delete n._cachedCurrent }; for (t = 0; d.length > t; t++) e = d[t], e.field === this.resources.field && "function" != typeof e.editor && (e.editor = T(this._createResourceEditor, this)); this.list = new f.ui.GanttList(s, c), this.list.bind("render", function() { n._navigatable() }, !0).bind("edit", function(e) { n._cachedCurrent = e.cell, n.trigger("edit", { task: e.model, container: e.cell }) && e.preventDefault() }).bind("cancel", function(e) { n.trigger("cancel", { task: e.model, container: e.cell }) && e.preventDefault(), u() }).bind("update", function(e) { n._updateTask(e.task, e.updateInfo), u() }).bind("change", function() { n.trigger("change"); var e = n.list.select(); e.length ? (l.removeAttr("data-action", "add"), n.timeline.select("[data-uid='" + e.attr("data-uid") + "']")) : (l.attr("data-action", "add"), n.timeline.clearSelection()) }) }, _timeline: function() { var e = this, n = p.styles, r = i(D(!0, { resourcesField: this.resources.field }, this.options)), o = this.wrapper.find(V + n.timeline + " > div"); this.timeline = new f.ui.GanttTimeline(o, r), this.timeline.bind("navigate", function(t) { e.toolbar.find(V + n.toolbar.views + " > li").removeClass(n.selected).end().find(V + n.toolbar.viewButton + "-" + t.view.replace(/\./g, "\\.").toLowerCase()).addClass(n.selected), e.refresh() }).bind("moveStart", function(n) { var i = e.list.editable; return i && i.trigger("validate") ? (n.preventDefault(), t) : (e.trigger("moveStart", { task: n.task }) && n.preventDefault(), t) }).bind("move", function(t) { var n = t.task, i = t.start, r = new Date(i.getTime() + n.duration()); e.trigger("move", { task: n, start: i, end: r }) && t.preventDefault() }).bind("moveEnd", function(t) { var n = t.task, i = t.start, r = new Date(i.getTime() + n.duration()); e.trigger("moveEnd", { task: n, start: i, end: r }) || e._updateTask(e.dataSource.getByUid(n.uid), { start: i, end: r }) }).bind("resizeStart", function(n) { var i = e.list.editable; return i && i.trigger("validate") ? (n.preventDefault(), t) : (e.trigger("resizeStart", { task: n.task }) && n.preventDefault(), t) }).bind("resize", function(t) { e.trigger("resize", { task: t.task, start: t.start, end: t.end }) && t.preventDefault() }).bind("resizeEnd", function(t) { var n = t.task, i = {}; t.resizeStart ? i.start = t.start : i.end = t.end, e.trigger("resizeEnd", { task: n, start: t.start, end: t.end }) || e._updateTask(e.dataSource.getByUid(n.uid), i) }).bind("percentResizeStart", function(t) { var n = e.list.editable; n && n.trigger("validate") && t.preventDefault() }).bind("percentResizeEnd", function(t) { e._updateTask(e.dataSource.getByUid(t.task.uid), { percentComplete: t.percentComplete }) }).bind("dependencyDragStart", function(t) { var n = e.list.editable; n && n.trigger("validate") && t.preventDefault() }).bind("dependencyDragEnd", function(t) { var n = e.dependencies._createNewModel({ type: t.type, predecessorId: t.predecessor.id, successorId: t.successor.id }); e._createDependency(n) }).bind("select", function(t) { var n = e.list.editable; n && n.trigger("validate"), e.select("[data-uid='" + t.uid + "']") }).bind("editTask", function(t) { var n = e.list.editable; n && n.trigger("validate") || e.editTask(t.uid) }).bind("clear", function() { e.clearSelection() }).bind("removeTask", function(t) { var n = e.list.editable; n && n.trigger("validate") || e.removeTask(e.dataSource.getByUid(t.uid)) }).bind("removeDependency", function(t) { var n = e.list.editable; n && n.trigger("validate") || e.removeDependency(e.dependencies.getByUid(t.uid)) }) }, _dataSource: function() { var e = this.options, t = e.dataSource; t = x(t) ? { data: t } : t, this.dataSource && this._refreshHandler ? this.dataSource.unbind("change", this._refreshHandler).unbind("progress", this._progressHandler).unbind("error", this._errorHandler) : (this._refreshHandler = T(this.refresh, this), this._progressHandler = T(this._requestStart, this), this._errorHandler = T(this._error, this)), this.dataSource = f.data.GanttDataSource.create(t).bind("change", this._refreshHandler).bind("progress", this._progressHandler).bind("error", this._errorHandler) }, _dependencies: function() { var e = this.options.dependencies || {}, t = x(e) ? { data: e } : e; this.dependencies && this._dependencyRefreshHandler ? this.dependencies.unbind("change", this._dependencyRefreshHandler).unbind("error", this._dependencyErrorHandler) : (this._dependencyRefreshHandler = T(this.refreshDependencies, this), this._dependencyErrorHandler = T(this._error, this)), this.dependencies = f.data.GanttDependencyDataSource.create(t).bind("change", this._dependencyRefreshHandler).bind("error", this._dependencyErrorHandler) }, _resources: function() { var e = this.options.resources, t = e.dataSource || {}; this.resources = { field: "resources", dataTextField: "name", dataColorField: "color", dataFormatField: "format" }, D(this.resources, e), this.resources.dataSource = f.data.DataSource.create(t) }, _assignments: function() { var e = this.options.assignments, t = e.dataSource || {}; this.assignments ? this.assignments.dataSource.unbind("change", this._assignmentsRefreshHandler) : this._assignmentsRefreshHandler = T(this.refresh, this), this.assignments = { dataTaskIdField: "taskId", dataResourceIdField: "resourceId", dataValueField: "value" }, D(this.assignments, e), this.assignments.dataSource = f.data.DataSource.create(t), this.assignments.dataSource.bind("change", this._assignmentsRefreshHandler) }, _createEditor: function() { var e = this, n = this._editor = new u(this.wrapper, D({}, this.options, { target: this, resources: { field: this.resources.field, editor: T(this._createResourceEditor, this) }, createButton: T(this._createPopupButton, this) })); n.bind("cancel", function(n) { var i = e.dataSource.getByUid(n.model.uid); return e.trigger("cancel", { container: n.container, task: i }) ? (n.preventDefault(), t) : (e.cancelTask(), t) }).bind("edit", function(t) { var n = e.dataSource.getByUid(t.model.uid); e.trigger("edit", { container: t.container, task: n }) && t.preventDefault() }).bind("save", function(t) { var n = e.dataSource.getByUid(t.model.uid); e.saveTask(n, t.updateInfo) }).bind("remove", function(t) { e.removeTask(t.model.uid) }) }, _createResourceEditor: function(e, t) { var n = this, i = t instanceof b ? t : t.model, r = i.get("id"), o = this.options.messages, a = n.resources.field, s = this._resourceEditor = new h(e, { resourcesField: a, data: this._wrapResourceData(r), model: i, messages: D({}, o.editor), buttons: [{ name: "update", text: o.save, className: p.styles.primary }, { name: "cancel", text: o.cancel }], createButton: T(this._createPopupButton, this), save: function(e) { n._updateAssignments(e.model.get("id"), e.model.get(a)) } }); s.open() }, _createPopupButton: function(e) { var t = e.name || e.text, n = { className: p.styles.popup.button + " k-gantt-" + (t || "").replace(/\s/g, ""), text: t, attr: "" }; if (!(t || A(e) && e.template)) throw Error("Custom commands should have name specified"); return A(e) && (e.className && (e.className += " " + n.className), n = D(!0, n, e)), f.template(G)(n) }, view: function(e) { return this.timeline.view(e) }, dataItem: function(e) { var t, n; return e ? (t = this.list, n = t.content.find(e), t._modelFromElement(n)) : null }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.list._setDataSource(this.dataSource), this.options.autoBind && e.fetch() }, setDependenciesDataSource: function(e) { this.options.dependencies = e, this._dependencies(), this.options.autoBind && e.fetch() }, items: function() { return this.wrapper.children(".k-task") }, _updateAssignments: function(e, t) { for (var n, i, r, o, a, s, l, c = this.assignments.dataSource, d = this.assignments.dataTaskIdField, u = this.assignments.dataResourceIdField, h = !1, p = new k(c.view()).filter({ field: d, operator: "eq", value: e }).toArray(); p.length;) { for (n = p[0], o = 0, a = t.length; a > o; o++) if (i = t[o], n.get(u) === i.get("id")) { r = t[o].get("value"), this._updateAssignment(n, r), t.splice(o, 1), h = !0; break } h || this._removeAssignment(n), h = !1, p.shift() } for (s = 0, l = t.length; l > s; s++) i = t[s], this._createAssignment(i, e); c.sync() }, cancelTask: function() { var e = this._editor, t = e.container; t && e.close() }, editTask: function(e) { var t, n = "string" == typeof e ? this.dataSource.getByUid(e) : e; n && (t = this.dataSource._createNewModel(n.toJSON()), t.uid = n.uid, this.cancelTask(), this._editTask(t)) }, _editTask: function(e) { this._editor.editTask(e) }, saveTask: function(e, t) { var n = this._editor, i = n.container, r = n.editable; i && r && r.end() && this._updateTask(e, t) }, _updateTask: function(e, t) { var n = this.resources.field; this.trigger("save", { task: e, values: t }) || (this._preventRefresh = !0, this.dataSource.update(e, t), t[n] && this._updateAssignments(e.get("id"), t[n]), this._syncDataSource()) }, _updateAssignment: function(e, t) { var n = this.assignments.dataValueField; e.set(n, t) }, removeTask: function(e) { var t = this, n = "string" == typeof e ? this.dataSource.getByUid(e) : e; n && this._taskConfirm(function(e) { e || t._removeTask(n) }, n) }, _createTask: function(e, n) { if (!this.trigger("add", { task: e, dependency: null })) { var i = this.dataSource; this._preventRefresh = !0, n === t ? i.add(e) : i.insert(n, e), this._scrollToUid = e.uid, this._syncDataSource() } }, _createDependency: function(e) { this.trigger("add", { task: null, dependency: e }) || (this._preventDependencyRefresh = !0, this.dependencies.add(e), this._preventDependencyRefresh = !1, this.dependencies.sync()) }, _createAssignment: function(e, t) { var n = this.assignments, i = n.dataSource, r = n.dataTaskIdField, o = n.dataResourceIdField, a = n.dataValueField, s = i._createNewModel(); s[r] = t, s[o] = e.get("id"), s[a] = e.get("value"), i.add(s) }, removeDependency: function(e) { var t = this, n = "string" == typeof e ? this.dependencies.getByUid(e) : e; n && this._dependencyConfirm(function(e) { e || t._removeDependency(n) }, n) }, _removeTaskDependencies: function(e, t) { this._preventDependencyRefresh = !0; for (var n = 0, i = t.length; i > n; n++) this.dependencies.remove(t[n]); this._preventDependencyRefresh = !1, this.dependencies.sync() }, _removeTaskAssignments: function(e) { var t, n, i = this.assignments.dataSource, r = i.view(), o = { field: this.assignments.dataTaskIdField, operator: "eq", value: e.get("id") }; for (r = new k(r).filter(o).toArray(), this._preventRefresh = !0, t = 0, n = r.length; n > t; t++) i.remove(r[t]); this._preventRefresh = !1, i.sync() }, _removeTask: function(e) { var t = this.dependencies.dependencies(e.id); this.trigger("remove", { task: e, dependencies: t }) || (this._removeTaskDependencies(e, t), this._removeTaskAssignments(e), this._preventRefresh = !0, this.dataSource.remove(e) && this._syncDataSource(), this._preventRefresh = !1) }, _removeDependency: function(e) { this.trigger("remove", { task: null, dependencies: [e] }) || this.dependencies.remove(e) && this.dependencies.sync() }, _removeAssignment: function(e) { this.assignments.dataSource.remove(e) }, _taskConfirm: function(e, t) { var n = this.options.messages; this._confirm(e, { model: t, text: n.deleteTaskConfirmation, title: n.deleteTaskWindowTitle }) }, _dependencyConfirm: function(e, t) { var n = this.options.messages; this._confirm(e, { model: t, text: n.deleteDependencyConfirmation, title: n.deleteDependencyWindowTitle }) }, _confirm: function(e, t) { var n, i, r = this.options.editable; r === !0 || r.confirmation !== !1 ? (n = this.options.messages, i = [{ name: "delete", text: n.destroy, className: p.styles.primary, click: function() { e() } }, { name: "cancel", text: n.cancel, click: function() { e(!0) } }], this.showDialog(D(!0, {}, t, { buttons: i }))) : e() }, showDialog: function(e) { this._editor.showDialog(e) }, refresh: function() { var e, t, i, r, o, a; this._preventRefresh || this.list.editable || (this._progress(!1), e = this.dataSource, t = e.taskTree(), i = this._scrollToUid, a = -1, this.current && (o = this.current.closest("tr").attr(f.attr("uid")), a = this.current.index()), this.trigger("dataBinding") || (0 !== this.resources.dataSource.data().length && this._assignResources(t), this._editor && this._editor.close(), this.clearSelection(), this.list._render(t), this.timeline._render(t), this.timeline._renderDependencies(this.dependencies.view()), i && (this._scrollTo(i), this.select(n(i))), (i || o) && a >= 0 && (r = this.list.content.find("tr" + n(i || o) + " > td:eq(" + a + ")"), this._current(r)), this._scrollToUid = null, this.trigger("dataBound"))) }, refreshDependencies: function() { this._preventDependencyRefresh || this.trigger("dataBinding") || (this.timeline._renderDependencies(this.dependencies.view()), this.trigger("dataBound")) }, _assignResources: function(e) { var t, n, i = this.resources, r = this.assignments, o = function() { var e = r.dataSource.view(), t = { field: r.dataTaskIdField }; return e = new k(e).group(t).toArray() }, a = o(), s = function(e, t) { var n, r, o = e.get("id"); for (f.setter(i.field)(e, new y([])), n = 0, r = a.length; r > n; n++) a[n].value === o && t(e, a[n].items) }, l = function(e, t) { var n, o, a, s, l, c, d, u; for (n = 0, o = t.length; o > n; n++) a = t[n], s = i.dataSource.get(a.get(r.dataResourceIdField)), l = a.get(r.dataValueField), c = a.get(r.dataResourceIdField), d = s.get(i.dataFormatField) || M, u = f.toString(l, d), e[i.field].push(new b({ id: c, name: s.get(i.dataTextField), color: s.get(i.dataColorField), value: l, formatedValue: u })) }; for (t = 0, n = e.length; n > t; t++) s(e[t], l) }, _wrapResourceData: function(e) { var t, n, i, r = this, o = [], a = this.resources.dataSource.view(), s = this.assignments.dataSource.view(), l = new k(s).filter({ field: r.assignments.dataTaskIdField, operator: "eq", value: e }).toArray(), c = function(e) { var t = null; return new k(l).filter({ field: r.assignments.dataResourceIdField, operator: "eq", value: e }).select(function(e) { t += e.get(r.assignments.dataValueField) }), t }; for (n = 0, i = a.length; i > n; n++) t = a[n], o.push({ id: t.get("id"), name: t.get(r.resources.dataTextField), format: t.get(r.resources.dataFormatField) || M, value: c(t.id) }); return o }, _syncDataSource: function() { this._preventRefresh = !1, this._requestStart(), this.dataSource.sync() }, _requestStart: function() { this._progress(!0) }, _error: function() { this._progress(!1) }, _progress: function(e) { f.ui.progress(this.element, e) }, _resizable: function() { var t, n, i, r = this, o = this.wrapper, a = p.styles, s = V + a.gridContent, l = o.find(V + a.list), c = o.find(V + a.timeline); this._resizeDraggable = o.find(V + a.splitBar).height(l.height()).hover(function() { e(this).addClass(a.splitBarHover) }, function() { e(this).removeClass(a.splitBarHover) }).end().kendoResizable({ orientation: "horizontal", handle: V + a.splitBar, start: function() { t = l.width(), n = c.width(), i = c.find(s).scrollLeft() }, resize: function(e) { var a = e.x.initialDelta; f.support.isRtl(o) && (a *= -1), 0 > t + a || 0 > n - a || (l.width(t + a), c.width(n - a), c.find(s).scrollLeft(i + a), r.timeline.view()._renderCurrentTime()) } }).data("kendoResizable") }, _scrollable: function() { var t = p.styles, n = V + t.gridContent, i = V + t.gridHeaderWrap, r = this.timeline.element.find(i), o = this.timeline.element.find(n), a = this.list.element.find(i), s = this.list.element.find(n); m && s.css("overflow-y", "auto"), o.on("scroll", function() { r.scrollLeft(this.scrollLeft), s.scrollTop(this.scrollTop) }), s.on("scroll", function() { a.scrollLeft(this.scrollLeft), o.scrollTop(this.scrollTop) }).on("DOMMouseScroll" + P + " mousewheel" + P, function(t) { var n = o.scrollTop(), i = f.wheelDeltaY(t); i && (t.preventDefault(), e(t.currentTarget).one("wheel" + P, !1), o.scrollTop(n + -i)) }) }, _navigatable: function() { var i, r = this, a = this.options.navigatable, s = this.options.editable, l = this.list.header.find("table"), c = this.list.content.find("table"), d = p.styles, u = f.support.isRtl(this.wrapper), h = this.timeline.element.find(V + d.gridContent), g = l.add(c), m = n(), v = { collapse: !1, expand: !0 }, _ = function(e) { var t = r.timeline.view()._timeSlots()[0].offsetWidth; h.scrollLeft(h.scrollLeft() + (e ? -t : t)) }, w = function(e) { var t = r.current.parent("tr" + n()), i = r.current.index(), a = t[e](); 0 !== r.select().length && r.clearSelection(), 0 !== a.length ? (r._current(a.children("td:eq(" + i + ")")), r._scrollTo(r.current)) : r.current.is("td") && "prev" == e ? o(l) : r.current.is("th") && "next" == e && o(c) }, b = function(e) { var t = r.current[e](); 0 !== t.length && (r._current(t), i = r.current.index()) }, y = function(e) { var t = r.dataItem(r.current); t.summary && t.expanded !== e && t.set("expanded", e) }, k = function() { var e, t; r.options.editable && !r.list.editable && (e = r.select(), t = f.attr("uid"), e.length && r.removeTask(e.attr(t))) }; return e(this.wrapper).on("mousedown" + P, "tr" + m + ", div" + m + ":not(" + V + d.line + ")", function(t) { var i, l = e(t.currentTarget), c = e(t.target).is(":button,a,:input,a>.k-icon,textarea,span.k-icon,span.k-link,.k-input,.k-multiselect-wrap"); t.ctrlKey || (a && (i = l.is("tr") ? e(t.target).closest("td") : r.list.content.find("tr" + n(l.attr(f.attr("uid"))) + " > td:first"), r._current(i)), !a && !s || c || (r._focusTimeout = setTimeout(function() { o(r.list.content.find("table"), !0) }, 2))) }), a !== !0 ? (c.on("keydown" + P, function(e) { e.keyCode == I.DELETE && k() }), t) : (g.on("focus" + P, function() { var t = this === c.get(0) ? "td" : "th", n = (e(this), r.select()), o = r.current || e(n.length ? n : this).find(t + ":eq(" + (i || 0) + ")"); r._current(o) }).on("blur" + P, function() { r._current(), this == l && e(this).attr(z, -1) }).on("keydown" + P, function(e) { var t, n = e.keyCode; if (r.current) switch (t = r.current.is("td"), n) { case I.RIGHT: e.preventDefault(), e.altKey ? _() : e.ctrlKey ? y(u ? v.collapse : v.expand) : b(u ? "prev" : "next"); break; case I.LEFT: e.preventDefault(), e.altKey ? _(!0) : e.ctrlKey ? y(u ? v.expand : v.collapse) : b(u ? "next" : "prev"); break; case I.UP: e.preventDefault(), w("prev"); break; case I.DOWN: e.preventDefault(), w("next"); break; case I.SPACEBAR: e.preventDefault(), t && r.select(r.current.closest("tr")); break; case I.ENTER: e.preventDefault(), t ? r.options.editable && (r._cachedCurrent = r.current, r.list._startEditHandler(r.current), e.stopPropagation()) : r.current.children("a.k-link").click(); break; case I.ESC: e.stopPropagation(); break; case I.DELETE: t && k(); break; default: n >= 49 && 57 >= n && r.view(r.timeline._viewByIndex(n - 49)) } }), t) }, _current: function(t) { var n, i = p.styles; this.current && this.current.length && this.current.removeClass(i.focused).removeAttr("id"), t && t.length ? (this.current = t.addClass(i.focused).attr("id", N), n = e(f._activeElement()), n.is("table") && this.wrapper.find(n).length > 0 && n.removeAttr(L).attr(L, N)) : this.current = null }, _dataBind: function() { var t, n = this; n.options.autoBind && (this._preventRefresh = !0, this._preventDependencyRefresh = !0, t = e.map([this.dataSource, this.dependencies, this.resources.dataSource, this.assignments.dataSource], function(e) { return e.fetch() }), e.when.apply(null, t).done(function() { n._preventRefresh = !1, n._preventDependencyRefresh = !1, n.refresh() })) }, _resize: function() { this._adjustDimensions(), this.timeline.view()._adjustHeight(), this.timeline.view()._renderCurrentTime(), this.list._adjustHeight() } }), f.PDFMixin && (f.PDFMixin.extend(p.fn), p.fn._drawPDF = function() { var e = "." + K.list, t = this.wrapper.find(e).width(), n = this.wrapper.clone(); return n.find(e).css("width", t), this._drawPDFShadow({ content: n }) }), f.ui.plugin(p), D(!0, p, { styles: K }) }(window.kendo.jQuery), function(e, t) { function n(e) { return function(t) { return t[e] } } function i(e) { return function(t) { return !e(t) } } function r() { return "none" !== this.style.display } function o(n) { var i, r = n.find(">tr:not(.k-filter-row)"), o = function() { var t = e(this); return !t.hasClass("k-group-cell") && !t.hasClass("k-hierarchy-cell") }, a = e(); return r.length > 1 && (a = r.find("th").filter(o).filter(function() { return this.rowSpan > 1 })), a = a.add(r.last().find("th").filter(o)), i = kendo.attr("index"), a.sort(function(n, r) { var o, a; return n = e(n), r = e(r), o = n.attr(i), a = r.attr(i), o === t && (o = e(n).index()), a === t && (a = e(r).index()), o = parseInt(o, 10), a = parseInt(a, 10), o > a ? 1 : a > o ? -1 : 0 }), a } function a(e) { var t, n, i = [], r = e.className; for (t = 0, n = e.level; n > t; t++) i.push(m("span", { className: r })); return i } function s(e) { var t, n, i, r = 0; for (n = 0, i = e.length; i > n; n++) t = e[n].style.width, t && -1 == t.indexOf("%") && (r += parseInt(t, 10)); return r } function l(e, t) { var n, i, r, o; e = e[0], t = t[0], e.rows.length !== t.rows.length && (n = e.offsetHeight, i = t.offsetHeight, n > i ? (r = t.rows[t.rows.length - 1], o = n - i) : (r = e.rows[e.rows.length - 1], o = i - n), r.style.height = r.offsetHeight + o + "px") } var c, d, u, h, p = kendo.data, f = e.extend, g = kendo.dom, m = g.element, v = g.text, _ = g.html, w = kendo.ui, b = w.DataBoundWidget, y = p.DataSource, k = p.ObservableArray, x = p.Query, C = p.Model, S = e.proxy, T = e.map, D = e.grep, A = e.inArray, E = e.isPlainObject, I = Array.prototype.push, P = "string", M = "change", z = "error", F = "progress", R = ".", H = ".kendoTreeList", B = "click", L = "mousedown", N = "edit", O = "save", V = "expand", U = "collapse", W = "remove", j = "dataBinding", G = "dataBound", q = "cancel", $ = "filterMenuInit", Y = "columnHide", Q = "columnShow", K = "th.k-header", X = "columnReorder", Z = "columnResize", J = "columnMenuInit", et = "columnLock", tt = "columnUnlock", nt = "parentId", it = { wrapper: "k-treelist k-grid k-widget", header: "k-header", button: "k-button", alt: "k-alt", editCell: "k-edit-cell", group: "k-treelist-group", gridToolbar: "k-grid-toolbar", gridHeader: "k-grid-header", gridHeaderWrap: "k-grid-header-wrap", gridContent: "k-grid-content", gridContentWrap: "k-grid-content", gridFilter: "k-grid-filter", footerTemplate: "k-footer-template", loading: "k-loading", refresh: "k-i-refresh", retry: "k-request-retry", selected: "k-state-selected", status: "k-status", link: "k-link", withIcon: "k-with-icon", filterable: "k-filterable", icon: "k-icon", iconFilter: "k-filter", iconCollapse: "k-i-collapse", iconExpand: "k-i-expand", iconHidden: "k-i-none", iconPlaceHolder: "k-icon k-i-none", input: "k-input", dropPositions: "k-insert-top k-insert-bottom k-add k-insert-middle", dropTop: "k-insert-top", dropBottom: "k-insert-bottom", dropAdd: "k-add", dropMiddle: "k-insert-middle", dropDenied: "k-denied", dragStatus: "k-drag-status", dragClue: "k-drag-clue", dragClueText: "k-clue-text" }, rt = { create: { imageClass: "k-add", className: "k-grid-add", methodName: "addRow" }, createchild: { imageClass: "k-add", className: "k-grid-add", methodName: "addRow" }, destroy: { imageClass: "k-delete", className: "k-grid-delete", methodName: "removeRow" }, edit: { imageClass: "k-edit", className: "k-grid-edit", methodName: "editRow" }, update: { imageClass: "k-update", className: "k-primary k-grid-update", methodName: "saveRow" }, canceledit: { imageClass: "k-cancel", className: "k-grid-cancel", methodName: "_cancelEdit" }, excel: { imageClass: "k-i-excel", className: "k-grid-excel", methodName: "saveAsExcel" }, pdf: { imageClass: "k-i-pdf", className: "k-grid-pdf", methodName: "saveAsPDF" } }, ot = C.define({ id: "id", parentId: nt, fields: { id: { type: "number" }, parentId: { type: "number", nullable: !0 } }, init: function(e) { C.fn.init.call(this, e), this._loaded = !1, this.parentIdField || (this.parentIdField = nt), this.parentId = this.get(this.parentIdField) }, accept: function(e) { C.fn.accept.call(this, e), this.parentId = this.get(this.parentIdField) }, loaded: function(e) { return e === t ? this._loaded : (this._loaded = e, t) }, shouldSerialize: function(e) { return C.fn.shouldSerialize.call(this, e) && "_loaded" !== e && "_error" != e && "_edit" != e && !("parentId" !== this.parentIdField && "parentId" === e) } }); ot.parentIdField = nt, ot.define = function(e, n) { var i, r; return n === t && (n = e, e = ot), i = n.parentId || nt, delete n.parentId, n.parentIdField = i, r = C.define(e, n), i && (r.parentIdField = i), r }, c = y.extend({ init: function(e) { y.fn.init.call(this, f(!0, {}, { schema: { modelBase: ot, model: ot } }, e)) }, _createNewModel: function(e) { var t = {}, n = e instanceof C; return n && (t = e), t = y.fn._createNewModel.call(this, t), n || (e.parentId && (e[t.parentIdField] = e.parentId), t.accept(e)), t }, _shouldWrap: function() { return !0 }, _readData: function(e) { var t = this.data(); return e = y.fn._readData.call(this, e), this._concat(e, t), e instanceof k ? e : t }, _concat: function(e, t) { var n, i = t.length; for (n = 0; e.length > n; n++) t[i++] = e[n]; t.length = i }, _readAggregates: function(e) { var t = f(this._aggregateResult, this.reader.aggregates(e)); return "" in t && (t[this._defaultParentId()] = t[""], delete t[""]), t }, remove: function(e) { var t = this._subtree(this._childrenMap(this.data()), e.id); this._removeItems(t), y.fn.remove.call(this, e) }, _filterCallback: function(e) { var t, n, i = {}, r = [], o = e.toArray(); for (t = 0; o.length > t; t++) for (n = o[t]; n && (i[n.id] || (i[n.id] = !0, r.push(n)), !i[n.parentId]);) i[n.parentId] = !0, n = this.parentNode(n), n && r.push(n); return new x(r) }, _subtree: function(e, t) { var n, i, r = e[t] || [], o = this._defaultParentId(); for (n = 0, i = r.length; i > n; n++) r[n].id !== o && (r = r.concat(this._subtree(e, r[n].id))); return r }, _childrenMap: function(e) { var t, n, i, r, o = {}; for (e = this._observeView(e), t = 0; e.length > t; t++) n = e[t], i = n.id, r = n.parentId, o[i] = o[i] || [], o[r] = o[r] || [], o[r].push(n); return o }, _calculateAggregates: function(e, t) { var n, i, r, o, a, s; for (t = t || {}, n = {}, a = t.filter, a && (e = x.process(e, { filter: a, filterCallback: S(this._filterCallback, this) }).data), s = this._childrenMap(e), n[this._defaultParentId()] = new x(this._subtree(s, this._defaultParentId())).aggregate(t.aggregate), o = 0; e.length > o; o++) i = e[o], r = this._subtree(s, i.id), n[i.id] = new x(r).aggregate(t.aggregate); return n }, _queryProcess: function(e, t) { var n, i, r, o, a, s, l; for (t = t || {}, t.filterCallback = S(this._filterCallback, this), n = this._defaultParentId(), i = x.process(e, t), r = this._childrenMap(i.data), e = r[n] || [], a = 0; e.length > a; a++) s = e[a], s.id !== n && (l = r[s.id], o = !(!l || !l.length), s.loaded() || s.loaded(o || !s.hasChildren), (s.loaded() || s.hasChildren !== !0) && (s.hasChildren = o), o && (e = e.slice(0, a + 1).concat(l, e.slice(a + 1)))); return i.data = e, i }, _queueRequest: function(e, t) { t.call(this) }, _modelLoaded: function(e) { var t = this.get(e); t.loaded(!0), t.hasChildren = this.childNodes(t).length > 0 }, _modelError: function(e, t) { this.get(e)._error = t }, success: function(e, t) { return t && t.id || (this._data = this._observe([])), y.fn.success.call(this, e, t) }, load: function(t) { var n = "_query", i = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates, r = e.Deferred().resolve().promise(); if (t.loaded()) { if (i) return r } else t.hasChildren && (n = "read"); return this[n]({ id: t.id }).then(S(this._modelLoaded, this, t.id), S(this._modelError, this, t.id)) }, contains: function(e, t) { for (var n = e.id; t;) { if (t.parentId === n) return !0; t = this.parentNode(t) } return !1 }, _byParentId: function(e, t) { var n, i, r = [], o = this.view(); if (e === t) return []; for (i = 0; o.length > i; i++) n = o.at(i), n.parentId == e && r.push(n); return r }, _defaultParentId: function() { return this.reader.model.fn.defaults[this.reader.model.parentIdField] }, childNodes: function(e) { return this._byParentId(e.id, this._defaultParentId()) }, rootNodes: function() { return this._byParentId(this._defaultParentId()) }, parentNode: function(e) { return this.get(e.parentId) }, level: function(e) { var t = -1; e instanceof ot || (e = this.get(e)); do e = this.parentNode(e), t++; while (e); return t }, filter: function(e) { var n = y.fn.filter; return e === t ? n.call(this, e) : (n.call(this, e), t) } }), c.create = function(t) { return e.isArray(t) ? t = { data: t } : t instanceof k && (t = { data: t.toJSON() }), t instanceof c ? t : new c(t) }, d = kendo.Observable.extend({ init: function(e, t) { kendo.Observable.fn.init.call(this), t = this.options = f(!0, {}, this.options, t), this.element = e, this.bind(this.events, t), this.model = this.options.model, this.fields = this._fields(this.options.columns), this._initContainer(), this.createEditable() }, events: [], _initContainer: function() { this.wrapper = this.element }, createEditable: function() { var e = this.options; this.editable = new w.Editable(this.wrapper, { fields: this.fields, target: e.target, clearContainer: e.clearContainer, model: this.model }) }, _isEditable: function(e) { return e.field && this.model.editable(e.field) }, _fields: function(e) { var t, n, i, r = []; for (t = 0, n = e.length; n > t; t++) i = e[t], this._isEditable(i) && r.push({ field: i.field, format: i.format, editor: i.editor }); return r }, end: function() { return this.editable.end() }, close: function() { this.destroy() }, destroy: function() { this.editable.destroy(), this.editable.element.find("[" + kendo.attr("container-for") + "]").empty().end().removeAttr(kendo.attr("role")), this.model = this.wrapper = this.element = this.columns = this.editable = null } }), u = d.extend({ init: function(e, t) { d.fn.init.call(this, e, t), this._attachHandlers(), kendo.cycleForm(this.wrapper), this.open() }, events: [q, O], options: { window: { modal: !0, resizable: !1, draggable: !0, title: "Edit", visible: !1 } }, _initContainer: function() { var t = this.options, n = []; this.wrapper = e('<div class="k-popup-edit-form"/>').attr(kendo.attr("uid"), this.model.uid).append('<div class="k-edit-form-container"/>'), t.template ? (this._appendTemplate(n), this.fields = []) : this._appendFields(n), this._appendButtons(n), new g.Tree(this.wrapper.children()[0]).render(n), this.wrapper.appendTo(t.appendTo), this.window = new w.Window(this.wrapper, t.window) }, _appendTemplate: function(e) { var t = this.options.template; typeof t === P && (t = window.unescape(t)), t = kendo.template(t)(this.model), e.push(_(t)) }, _appendFields: function(e) { var t, n, i, r = this.options.columns; for (t = 0, n = r.length; n > t; t++) i = r[t], i.command || (e.push(_('<div class="k-edit-label"><label for="' + i.field + '">' + (i.title || i.field || "") + "</label></div>")), e.push(this._isEditable(i) ? _("<div " + kendo.attr("container-for") + '="' + i.field + '" class="k-edit-field"></div>') : m("div", { "class": "k-edit-field" }, [this.options.fieldRenderer(i, this.model)]))) }, _appendButtons: function(e) { e.push(m("div", { "class": "k-edit-buttons k-state-default" }, this.options.commandRenderer())) }, _attachHandlers: function() { var e = this._cancelProxy = S(this._cancel, this); this.wrapper.on(B + H, ".k-grid-cancel", this._cancelProxy), this._saveProxy = S(this._save, this), this.wrapper.on(B + H, ".k-grid-update", this._saveProxy), this.window.bind("close", function(t) { t.userTriggered && e(t) }) }, _dettachHandlers: function() { this._cancelProxy = null, this._saveProxy = null, this.wrapper.off(H) }, _cancel: function(e) { this.trigger(q, e) }, _save: function() { this.trigger(O) }, open: function() { this.window.center().open() }, close: function() { this.window.bind("deactivate", S(this.destroy, this)).close() }, destroy: function() { this.window.destroy(), this.window = null, this._dettachHandlers(), d.fn.destroy.call(this) } }), h = b.extend({ init: function(t, n) { if (b.fn.init.call(this, t, n), this._dataSource(this.options.dataSource), this._columns(), this._layout(), this._selectable(), this._sortable(), this._resizable(), this._filterable(), this._attachEvents(), this._toolbar(), this._scrollable(), this._reorderable(), this._columnMenu(), this._minScreenSupport(), this._draggable(), this.options.autoBind && this.dataSource.fetch(), this._hasLockedColumns) { var i = this; this.wrapper.addClass("k-grid-lockedcolumns"), this._resizeHandler = function() { i.resize() }, e(window).on("resize" + H, this._resizeHandler) } kendo.notify(this) }, _draggable: function() { var t = this.options.editable; t && t.move && (this._dragging = new kendo.ui.HierarchicalDragAndDrop(this.wrapper, { $angular: this.$angular, autoScroll: !0, filter: "tbody>tr", itemSelector: "tr", allowedContainers: this.wrapper, hintText: function(t) { var n = function() { return e(this).text() }, i = "<span class='k-header k-drag-separator' />"; return t.children("td").map(n).toArray().join(i) }, contains: S(function(e, t) { var n = this.dataItem(t), i = this.dataItem(e); return i == n || this.dataSource.contains(i, n) }, this), itemFromTarget: function(e) { var t = e.closest("tr"); return { item: t, content: t } }, dragstart: S(function() { this.wrapper.addClass("k-treelist-dragging") }, this), drop: S(function() { this.wrapper.removeClass("k-treelist-dragging") }, this), dragend: S(function(e) { var t = this.dataItem(e.destination), n = this.dataItem(e.source); n.set("parentId", t ? t.id : null) }, this), reorderable: !1, dropHintContainer: function(e) { return e.children("td:eq(1)") }, dropPositionFrom: function(e) { return e.prevAll(".k-i-none").length > 0 ? "after" : "before" } })) }, _scrollable: function() { var t, n, i; this.options.scrollable && (t = this.thead.closest(".k-grid-header-wrap"), n = e(this.lockedContent).bind("DOMMouseScroll" + H + " mousewheel" + H, S(this._wheelScroll, this)), this.content.bind("scroll" + H, function() { t.scrollLeft(this.scrollLeft), n.scrollTop(this.scrollTop) }), i = kendo.touchScroller(this.content), i && i.movable && (this._touchScroller = i, i.movable.bind("change", function(e) { t.scrollLeft(-e.sender.x), n && n.scrollTop(-e.sender.y) }))) }, _wheelScroll: function(t) { if (!t.ctrlKey) { var n = kendo.wheelDeltaY(t); n && (t.preventDefault(), e(t.currentTarget).one("wheel" + H, !1), this.content.scrollTop(this.content.scrollTop() + -n)) } }, _progress: function() { var e = this.options.messages; this.tbody.find("tr").length || this._showStatus(kendo.template("<span class='#= className #' /> #: messages.loading #")({ className: it.icon + " " + it.loading, messages: e })) }, _error: function(e) { this.dataSource.rootNodes().length || this._render({ error: e }) }, refresh: function(e) { e = e || {}, "itemchange" == e.action && this.editor || this.trigger(j) || (this._cancelEditor(), this._render(), this._adjustHeight(), this.trigger(G)) }, _angularFooters: function(e) { var t, n, i, r = this.dataSource.aggregates(), o = this._footerItems(); for (t = 0; o.length > t; t++) n = o.eq(t), i = r[n.attr("data-parentId")], this._angularFooter(e, n.find("td").get(), i) }, _angularFooter: function(e, t, n) { var i = this.columns; this.angular(e, function() { return { elements: t, data: T(i, function(e) { return { column: e, aggregate: n && n[e.field] } }) } }) }, items: function() { return this._hasLockedColumns ? this._items(this.tbody).add(this._items(this.lockedTable)) : this._items(this.tbody) }, _items: function(t) { return t.find("tr").filter(function() { return !e(this).hasClass(it.footerTemplate) }) }, _footerItems: function() { var t = this.tbody; return this._hasLockedColumns && (t = t.add(this.lockedTable)), t.find("tr").filter(function() { return e(this).hasClass(it.footerTemplate) }) }, dataItems: function() { var e, t, n, i = kendo.ui.DataBoundWidget.fn.dataItems.call(this); if (this._hasLockedColumns) { for (e = i.length, t = Array(2 * e), n = e; --n >= 0;) t[n] = t[n + e] = i[n]; i = t } return i }, _showStatus: function(t) { var n = this.element.find(".k-status"), i = e(this.content).add(this.lockedContent); n.length || (n = e("<div class='k-status' />").appendTo(this.element)), this._contentTree.render([]), this._hasLockedColumns && this._lockedContentTree.render([]), i.hide(), n.html(t) }, _hideStatus: function() { this.element.find(".k-status").remove(), e(this.content).add(this.lockedContent).show() }, _adjustHeight: function() { var e, t, n = this.element, i = n.find(R + it.gridContentWrap), r = n.find(R + it.gridHeader), o = n.find(R + it.gridToolbar), a = kendo.support.scrollbar(); n.height(this.options.height), t = function(e) { var t, n; return e[0].style.height ? !0 : (t = e.height(), e.height("auto"), n = e.height(), e.height(""), t != n) }, t(n) && (e = n.height() - r.outerHeight() - o.outerHeight(), i.height(e), this._hasLockedColumns && (a = this.table[0].offsetWidth > this.table.parent()[0].clientWidth ? a : 0, this.lockedContent.height(e - a))) }, _resize: function() { this._applyLockedContainersWidth(), this._adjustHeight() }, _minScreenSupport: function() { var t = this.hideMinScreenCols(); t && (this.minScreenResizeHandler = S(this.hideMinScreenCols, this), e(window).on("resize", this.minScreenResizeHandler)) }, hideMinScreenCols: function() { var e, n, i, r = this.columns, o = !1, a = window.innerWidth > 0 ? window.innerWidth : screen.width; for (e = 0; r.length > e; e++) n = r[e], i = n.minScreenWidth, i !== t && null !== i && (o = !0, i > a ? this.hideColumn(n) : this.showColumn(n)); return o }, destroy: function() { b.fn.destroy.call(this); var t = this.dataSource; t.unbind(M, this._refreshHandler), t.unbind(z, this._errorHandler), t.unbind(F, this._progressHandler), this._resizeHandler && e(window).off("resize" + H, this._resizeHandler), this._dragging && (this._dragging.destroy(), this._dragging = null), this.resizable && (this.resizable.destroy(), this.resizable = null), this.reorderable && (this.reorderable.destroy(), this.reorderable = null), this._draggableInstance && this._draggableInstance.element && (this._draggableInstance.destroy(), this._draggableInstance = null), this.minScreenResizeHandler && e(window).off("resize", this.minScreenResizeHandler), this._destroyEditor(), this.element.off(H), this._touchScroller && this._touchScroller.destroy(), this._autoExpandable = null, this._refreshHandler = this._errorHandler = this._progressHandler = null, this.thead = this.content = this.tbody = this.table = this.element = this.lockedHeader = this.lockedContent = null, this._statusTree = this._headerTree = this._contentTree = this._lockedHeaderColsTree = this._lockedContentColsTree = this._lockedHeaderTree = this._lockedContentTree = null }, options: { name: "TreeList", columns: [], autoBind: !0, scrollable: !0, selectable: !1, sortable: !1, toolbar: null, height: null, columnMenu: !1, messages: { noRows: "No records to display", loading: "Loading...", requestFailed: "Request failed.", retry: "Retry", commands: { edit: "Edit", update: "Update", canceledit: "Cancel", create: "Add new record", createchild: "Add child record", destroy: "Delete", excel: "Export to Excel", pdf: "Export to PDF" } }, excel: { hierarchy: !0 }, resizable: !1, filterable: !1, editable: !1, reorderable: !1 }, events: [M, N, O, W, V, U, j, G, q, $, Y, Q, X, Z, J, et, tt], _toggle: function(e, n) { var i = e.loaded(); e._error && (e.expanded = !1, e._error = t), (i || !e.expanded) && (t === n && (n = !e.expanded), e.expanded = n, i || this.dataSource.load(e).always(S(function() { this._render(), this._syncLockedContentHeight() }, this)), this._render(), this._syncLockedContentHeight()) }, expand: function(e) { this._toggle(this.dataItem(e), !0) }, collapse: function(e) { this._toggle(this.dataItem(e), !1) }, _toggleChildren: function(t) { var n = e(t.currentTarget), i = this.dataItem(n), r = i.expanded ? U : V; this.trigger(r, { model: i }) || this._toggle(i), t.preventDefault() }, _attachEvents: function() { var e = R + it.iconCollapse + ", ." + it.iconExpand + ", ." + it.refresh, t = R + it.retry, n = this.dataSource; this.element.on(L + H, e, S(this._toggleChildren, this)).on(B + H, t, S(n.fetch, n)).on(B + H, ".k-button[data-command]", S(this._commandClick, this)) }, _commandByName: function(t) { var n, i, r, o, a = this.columns, s = e.isArray(this.options.toolbar) ? this.options.toolbar : []; if (t = t.toLowerCase(), rt[t]) return rt[t]; for (n = 0; a.length > n; n++) if (r = a[n].command) for (i = 0; r.length > i; i++) if (o = r[i].name, o && o.toLowerCase() == t) return r[i]; for (n = 0; s.length > n; n++) if (o = s[n].name, o && o.toLowerCase() == t) return s[n] }, _commandClick: function(n) { var i = e(n.currentTarget), r = i.attr("data-command"), o = this._commandByName(r), a = i.parentsUntil(this.wrapper, "tr"); a = a.length ? a : t, o && (o.methodName ? this[o.methodName](a) : o.click && o.click.call(this, n), n.preventDefault()) }, _ensureExpandableColumn: function() { var e, t; this._autoExpandable && delete this._autoExpandable.expandable, e = D(this.columns, i(n("hidden"))), t = D(e, n("expandable")), this.columns.length && !t.length && (this._autoExpandable = e[0], e[0].expandable = !0) }, _columns: function() { var e, t = this.options.columns || []; this.columns = T(t, function(e) { return e = "string" == typeof e ? { field: e } : e, f({ encoded: !0 }, e) }), e = this._lockedColumns(), e.length > 0 && (this._hasLockedColumns = !0, this.columns = e.concat(this._nonLockedColumns())), this._ensureExpandableColumn(), this._columnTemplates(), this._columnAttributes() }, _columnTemplates: function() { var e, t, n, i = this.columns; for (e = 0, t = i.length; t > e; e++) n = i[e], n.template && (n.template = kendo.template(n.template)), n.headerTemplate && (n.headerTemplate = kendo.template(n.headerTemplate)), n.footerTemplate && (n.footerTemplate = kendo.template(n.footerTemplate)) }, _columnAttributes: function() { function t(t) { var n, i, r, o; if (t && t.style) for (n = t.style.split(";"), t.style = {}, i = 0; n.length > i; i++) r = n[i].split(":"), o = e.trim(r[0]), o && (t.style[e.camelCase(o)] = e.trim(r[1])) } var n, i, r = this.columns; for (n = 0, i = r.length; i > n; n++) t(r[n].attributes), t(r[n].headerAttributes) }, _layout: function() { var e, t, n = this.columns, i = this.element, r = ""; this.wrapper = i.addClass(it.wrapper), r = "<div class='#= gridHeader #' style=\"padding-right: " + kendo.support.scrollbar() + 'px;">', this._hasLockedColumns && (r += "<div class='k-grid-header-locked'><table role='grid'><colgroup></colgroup><thead role='rowgroup' /></table></div>"), r += "<div class='#= gridHeaderWrap #'><table role='grid'><colgroup></colgroup><thead role='rowgroup' /></table></div></div>", this._hasLockedColumns && (r += "<div class='k-grid-content-locked'><table role='treegrid' tabindex='0'><colgroup></colgroup><tbody /></table></div>"), r += "<div class='#= gridContentWrap #'><table role='treegrid' tabindex='0'><colgroup></colgroup><tbody /></table></div>", this.options.scrollable || (r = "<table role='treegrid' tabindex='0'><colgroup></colgroup><thead class='#= gridHeader #' role='rowgroup' /><tbody /></table>"), this.options.toolbar && (r = "<div class='#= header # #= gridToolbar #' />" + r), i.append(kendo.template(r)(it) + "<div class='k-status' />"), this.toolbar = i.find(R + it.gridToolbar), e = i.find(R + it.gridHeader).find("thead").addBack().filter("thead"), this.thead = e.last(), t = i.find(R + it.gridContentWrap), t.length ? this.content = t : t = i, this.table = t.find(">table"), this.tbody = this.table.find(">tbody"), this._hasLockedColumns && (this.lockedHeader = e.first().closest(".k-grid-header-locked"), this.lockedContent = i.find(".k-grid-content-locked"), this.lockedTable = this.lockedContent.children()), this._initVirtualTrees(), this._renderCols(), this._renderHeader(), this.angular("compile", function() { return { elements: e.find("th.k-header").get(), data: T(n, function(e) { return { column: e } }) } }) }, _initVirtualTrees: function() { this._headerColsTree = new g.Tree(this.thead.prev()[0]), this._contentColsTree = new g.Tree(this.tbody.prev()[0]), this._headerTree = new g.Tree(this.thead[0]), this._contentTree = new g.Tree(this.tbody[0]), this._statusTree = new g.Tree(this.element.children(".k-status")[0]), this.lockedHeader && (this._lockedHeaderColsTree = new g.Tree(this.lockedHeader.find("colgroup")[0]), this._lockedContentColsTree = new g.Tree(this.lockedTable.find(">colgroup")[0]), this._lockedHeaderTree = new g.Tree(this.lockedHeader.find("thead")[0]), this._lockedContentTree = new g.Tree(this.lockedTable.find(">tbody")[0])) }, _toolbar: function() { var t, n = this.options.toolbar, i = this.toolbar; n && (e.isArray(n) ? (t = this._buildCommands(n), new g.Tree(i[0]).render(t)) : i.append(kendo.template(n)({})), this.angular("compile", function() { return { elements: i.get() } })) }, _lockedColumns: function() { return D(this.columns, n("locked")) }, _nonLockedColumns: function() { return D(this.columns, i(n("locked"))) }, _flushCache: function() { this.options.$angular && (this._contentTree.render([]), this._hasLockedColumns && this._lockedContentTree.render([])) }, _render: function(t) { var n, i, r, o; t = t || {}, n = this.options.messages, i = this.dataSource.rootNodes(), r = this.dataSource.aggregates(), o = this.select().map(function(t, n) { return e(n).attr("data-uid") }), this._absoluteIndex = 0, this._angularItems("cleanup"), this._angularFooters("cleanup"), this._flushCache(), t.error ? this._showStatus(kendo.template("#: messages.requestFailed # <button class='#= buttonClass #'>#: messages.retry #</button>")({ buttonClass: [it.button, it.retry].join(" "), messages: n })) : i.length ? (this._hideStatus(), this._contentTree.render(this._trs({ columns: this._nonLockedColumns(), aggregates: t.aggregates, selected: o, data: i, visible: !0, level: 0 })), this._hasLockedColumns && (this._absoluteIndex = 0, this._lockedContentTree.render(this._trs({ columns: this._lockedColumns(), aggregates: t.aggregates, selected: o, data: i, visible: !0, level: 0 })))) : this._showStatus(kendo.htmlEncode(n.noRows)), this._touchScroller && this._touchScroller.contentResized(), this._angularItems("compile"), this._angularFooters("compile"), this._adjustRowsHeight() }, _adjustRowsHeight: function() { var e, t, n, i, r, o, a, s, l, c, d, u, h, p; if (this._hasLockedColumns) { for (e = this.table, t = this.lockedTable, n = e[0].rows, i = n.length, o = t[0].rows, a = e.add(t), s = a.length, l = [], c = this.lockedHeader.find("tr"), d = this.thead.find("tr"), c.add(d).height("auto").height(Math.max(c.height(), d.height())), r = 0; i > r && o[r]; r++) n[r].style.height && (n[r].style.height = o[r].style.height = ""), u = n[r].offsetHeight, h = o[r].offsetHeight, p = 0, u > h ? p = u : h > u && (p = h), l.push(p); for (r = 0; s > r; r++) a[r].style.display = "none"; for (r = 0; i > r; r++) l[r] && (n[r].style.height = o[r].style.height = l[r] + 1 + "px"); for (r = 0; s > r; r++) a[r].style.display = "" } }, _ths: function(e) { var t, n, i, r, o, a, s, l, c = []; for (s = 0, l = e.length; l > s; s++) t = e[s], i = [], r = [it.header], n = t.headerTemplate ? t.headerTemplate({}) : t.title || t.field || "", a = t.headerTemplate ? _(n) : v(n), i.push(t.sortable ? m("a", { href: "#", className: it.link }, [a]) : a), o = { "data-field": t.field, "data-title": t.title, style: t.hidden === !0 ? { display: "none" } : {}, className: r.join(" "), role: "columnheader" }, o = f(!0, {}, o, t.headerAttributes), c.push(m("th", o, i)); return c }, _cols: function(e) { var t, n, i, r = []; for (i = 0; e.length > i; i++) e[i].hidden !== !0 && (t = e[i].width, n = {}, t && 0 !== parseInt(t, 10) && (n.style = { width: "string" == typeof t ? t : t + "px" }), r.push(m("col", n))); return r }, _renderCols: function() { var e = this._nonLockedColumns(); this._headerColsTree.render(this._cols(e)), this.options.scrollable && this._contentColsTree.render(this._cols(e)), this._hasLockedColumns && (e = this._lockedColumns(), this._lockedHeaderColsTree.render(this._cols(e)), this._lockedContentColsTree.render(this._cols(e))) }, _renderHeader: function() { var e = this._nonLockedColumns(); this._headerTree.render([m("tr", { role: "row" }, this._ths(e))]), this._hasLockedColumns && (e = this._lockedColumns(), this._lockedHeaderTree.render([m("tr", { role: "row" }, this._ths(e))]), this._applyLockedContainersWidth()) }, _applyLockedContainersWidth: function() { var e, t, n, i, r, o; this._hasLockedColumns && (e = s(this.lockedHeader.find(">table>colgroup>col")), t = this.thead.parent(), n = s(t.find(">colgroup>col")), i = this.wrapper[0].clientWidth, r = kendo.support.scrollbar(), e >= i && (e = i - 3 * r), this.lockedHeader.add(this.lockedContent).width(e), t.add(this.table).width(n), o = i - e - 2, this.content.width(o), t.parent().width(o - r)) }, _trs: function(t) { var n, i, r, o, a, s, l, c, d = [], u = t.level, h = t.data, p = this.dataSource, f = p.aggregates() || {}, g = t.columns; for (s = 0, l = h.length; l > s; s++) r = [], n = h[s], a = n.loaded() && p.childNodes(n), o = a && a.length, i = { "data-uid": n.uid, role: "row" }, o && (i["aria-expanded"] = !!n.expanded), t.visible ? (this._absoluteIndex % 2 !== 0 && r.push(it.alt), this._absoluteIndex++) : i.style = { display: "none" }, e.inArray(n.uid, t.selected) >= 0 && r.push(it.selected), o && r.push(it.group), n._edit && r.push("k-grid-edit-row"), i.className = r.join(" "), d.push(this._tds({ model: n, attr: i, level: u }, g, S(this._td, this))), o && (d = d.concat(this._trs({ columns: g, parentId: n.id, aggregates: f, selected: t.selected, visible: t.visible && !!n.expanded, data: a, level: u + 1 }))); return this._hasFooterTemplate() && (c = t.parentId || null, i = { className: it.footerTemplate, "data-parentId": c }, t.visible || (i.style = { display: "none" }), d.push(this._tds({ model: f[c], attr: i, level: u }, g, this._footerTd))), d }, _footerTd: function(t) { var n = [], i = t.column, r = t.column.footerTemplate || e.noop, o = t.model[i.field] || {}, s = { role: "gridcell", style: i.hidden === !0 ? { display: "none" } : {} }; return i.expandable && (n = n.concat(a({ level: t.level + 1, className: it.iconPlaceHolder }))), i.attributes && f(s, i.attributes), n.push(_(r(o) || "")), m("td", s, n) }, _hasFooterTemplate: function() { return !!D(this.columns, function(e) { return e.footerTemplate }).length }, _tds: function(e, t, n) { var i, r, o, a = []; for (r = 0, o = t.length; o > r; r++) i = t[r], a.push(n({ model: e.model, column: i, level: e.level })); return m("tr", e.attr, a) }, _td: function(e) { var t, n = [], i = e.model, r = e.column, o = { role: "gridcell", style: r.hidden === !0 ? { display: "none" } : {} }; return i._edit && r.field && i.editable(r.field) ? o[kendo.attr("container-for")] = r.field : (r.expandable && (n = a({ level: e.level, className: it.iconPlaceHolder }), t = [it.icon], t.push(i.hasChildren ? i.expanded ? it.iconCollapse : it.iconExpand : it.iconHidden), i._error ? t.push(it.refresh) : !i.loaded() && i.expanded && t.push(it.loading), n.push(m("span", { className: t.join(" ") })), o.style["white-space"] = "nowrap"), r.attributes && f(!0, o, r.attributes), r.command ? n = this._buildCommands(i._edit ? ["update", "canceledit"] : r.command) : n.push(this._cellContent(r, i))), m("td", o, n) }, _cellContent: function(e, n) { var i; return e.template ? i = e.template(n) : e.field && (i = n.get(e.field), null !== i && e.format && (i = kendo.format(e.format, i))), (null === i || t === i) && (i = ""), e.template || !e.encoded ? _(i) : v(i) }, _buildCommands: function(e) { var t, n = []; for (t = 0; e.length > t; t++) n.push(this._button(e[t])); return n }, _button: function(e) { var t = (e.name || e).toLowerCase(), n = this.options.messages.commands[t], i = []; return e = f({}, rt[t], { text: n }, e), e.imageClass && i.push(m("span", { className: ["k-icon", e.imageClass].join(" ") })), m("button", { "data-command": t, className: ["k-button k-button-icontext", e.className].join(" ") }, i.concat([v(e.text || e.name)])) }, _positionResizeHandle: function(n) { var i, r, o, a = e(n.currentTarget), s = this.resizeHandle, l = a.position(), c = l.left, d = a.outerWidth(), u = a.closest("div"), h = n.clientX + e(window).scrollLeft(), p = this.options.columnResizeHandleWidth || 3; return c += u.scrollLeft(), s || (s = this.resizeHandle = e('<div class="k-resize-handle"><div class="k-resize-handle-inner" /></div>')), i = a.offset().left + d, (r = h > i - p && i + p > h) ? (u.append(s), s.show().css({ top: l.top, left: c + d - p - 1, height: a.outerHeight(), width: 3 * p }).data("th", a), o = this, s.off("dblclick" + H).on("dblclick" + H, function() { var t = a.index(); e.contains(o.thead[0], a[0]) && (t += D(o.columns, function(e) { return e.locked && !e.hidden }).length), o.autoFitColumn(t) }), t) : (s.hide(), t) }, autoFitColumn: function(t) { var n, i, a, s, l, c, d, u, h, p, f, g, m, v, _, w, b, y, k = this, x = k.options, C = k.columns, S = kendo.support.browser, T = k.lockedHeader ? o(k.lockedHeader.find(">table>thead")).filter(r).length : 0; if (t = "number" == typeof t ? C[t] : E(t) ? D(C, function(e) { return e === t })[0] : D(C, function(e) { return e.field === t })[0], t && !t.hidden) { for (n = A(t, C), s = t.locked, a = s ? k.lockedHeader.children("table") : k.thead.parent(), i = a.find("[data-index='" + n + "']"), c = s ? k.lockedTable : k.table, d = k.footer || e(), k.footer && k.lockedContent && (d = k.footer.children(s ? ".k-grid-footer-locked" : ".k-grid-footer-wrap")), u = d.find("table").first(), k.lockedHeader && T >= n && !s && (n -= T), h = 0; C.length > h && C[h] !== t; h++) C[h].hidden && n--; if (l = x.scrollable ? a.find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + n + ")").add(c.children("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + n + ")")).add(u.find("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + n + ")")) : c.children("colgroup").find("col:not(.k-group-col):not(.k-hierarchy-col):eq(" + n + ")"), p = a.add(c).add(u), f = i.outerWidth(), l.width(""), p.css("table-layout", "fixed"), l.width("auto"), p.addClass("k-autofitting"), p.css("table-layout", ""), g = Math.max(a.width(), c.width(), u.width()), m = Math.ceil(Math.max(i.outerWidth(), c.find("tr").eq(0).children("td:visible").eq(n).outerWidth(), u.find("tr").eq(0).children("td:visible").eq(n).outerWidth())), l.width(m), t.width = m, x.scrollable) { for (v = a.find("col"), w = 0, b = 0, y = v.length; y > b; b += 1) { if (_ = v[b].style.width, !_ || -1 != _.indexOf("%")) { w = 0; break } w += parseInt(_, 10) } w && p.each(function() { this.style.width = w + "px" }) } S.msie && 8 == S.version && (p.css("display", "inline-table"), setTimeout(function() { p.css("display", "table") }, 1)), p.removeClass("k-autofitting"), k.trigger(Z, { column: t, oldWidth: f, newWidth: m }), k._applyLockedContainersWidth(), k._syncLockedContentHeight(), k._syncLockedHeaderHeight() } }, _adjustLockedHorizontalScrollBar: function() { var e = this.table, t = e.parent(), n = e[0].offsetWidth > t[0].clientWidth ? kendo.support.scrollbar() : 0; this.lockedContent.height(t.height() - n) }, _syncLockedContentHeight: function() { this.lockedTable && (this._touchScroller || this._adjustLockedHorizontalScrollBar(), this._adjustRowsHeight(this.table, this.lockedTable)) }, _syncLockedHeaderHeight: function() { var e, t; this.lockedHeader && (e = this.lockedHeader.children("table"), t = this.thead.parent(), this._adjustRowsHeight(e, t), l(e, t)) }, _resizable: function() { if (this.options.resizable) { this.resizable && this.resizable.destroy(); var t = this; e(this.lockedHeader).find("thead").add(this.thead).on("mousemove" + H, "th", e.proxy(this._positionResizeHandle, this)), this.resizable = new kendo.ui.Resizable(this.wrapper, { handle: ".k-resize-handle", start: function(n) { var i, r, o = e(n.currentTarget).data("th"), a = "col:eq(" + o.index() + ")"; t.wrapper.addClass("k-grid-column-resizing"), t.lockedHeader && e.contains(t.lockedHeader[0], o[0]) ? (i = t.lockedHeader, r = t.lockedTable) : (i = t.thead.parent(), r = t.table), this.col = r.children("colgroup").find(a).add(i.find(a)), this.th = o, this.startLocation = n.x.location, this.columnWidth = o.outerWidth(), this.table = this.col.closest("table"), this.totalWidth = this.table.width() }, resize: function(e) { var t = 11, n = e.x.location - this.startLocation; t > this.columnWidth + n && (n = t - this.columnWidth), this.table.width(this.totalWidth + n), this.col.width(this.columnWidth + n) }, resizeend: function() { var e, n, i; t.wrapper.removeClass("k-grid-column-resizing"), e = this.th.attr("data-field"), n = D(t.columns, function(t) { return t.field == e }), i = Math.floor(this.th.outerWidth()), n[0].width = i, t._resize(), t._adjustRowsHeight(), t.trigger(Z, { column: n, oldWidth: this.columnWidth, newWidth: i }), this.table = this.col = this.th = null } }) } }, _sortable: function() { var t, n, i, r, o, a = this.columns, s = e(this.lockedHeader).add(this.thead).find("th"), l = kendo.attr("field"), c = this.options.sortable; if (c) for (r = 0, o = s.length; o > r; r++) t = a[r], t.sortable !== !1 && !t.command && t.field && (i = s.eq(r), n = i.data("kendoColumnSorter"), n && n.destroy(), i.attr(l, t.field).kendoColumnSorter(f({}, c, t.sortable, { dataSource: this.dataSource }))) }, _filterable: function() { var t, n, i, r, o, a, s = e(this.lockedHeader).add(this.thead).find("th"), l = this.options.filterable; if (l && !this.options.columnMenu) for (a = S(function(e) { this.trigger($, { field: e.field, container: e.container }) }, this), t = 0, n = s.length; n > t; t++) i = this.columns[t], r = s.eq(t), o = r.data("kendoFilterMenu"), o && o.destroy(), i.command || i.filterable === !1 || r.kendoFilterMenu(f(!0, {}, l, i.filterable, { dataSource: this.dataSource, init: a })) }, _change: function() { this.trigger(M) }, _selectable: function() { var e, n, i = this.options.selectable, r = this.table; i && (i = kendo.ui.Selectable.parseOptions(i), this._hasLockedColumns && (r = r.add(this.lockedTable), n = i.multiple && i.cell), e = ">tbody>tr:not(.k-footer-template)", i.cell && (e += ">td"), this.selectable = new kendo.ui.Selectable(r, { filter: e, aria: !0, multiple: i.multiple, change: S(this._change, this), useAllItems: n, continuousItems: S(this._continuousItems, this, e, i.cell), relatedTarget: !i.cell && this._hasLockedColumns ? S(this._selectableTarget, this) : t })) }, _continuousItems: function(t, n) { var i, r, o, a, s, l; if (this.lockedContent) { for (i = e(t, this.lockedTable), r = e(t, this.table), o = n ? this._lockedColumns().length : 1, a = n ? this.columns.length - o : 1, s = [], l = 0; i.length > l; l += o) I.apply(s, i.slice(l, l + o)), I.apply(s, r.splice(0, a)); return s } }, _selectableTarget: function(t) { var n, i, r, o = e(); for (i = 0, r = t.length; r > i; i++) n = this._relatedRow(t[i]), A(n[0], t) < 0 && (o = o.add(n)); return o }, _relatedRow: function(t) { var n, i, r = this.lockedTable; return t = e(t), r ? (n = t.closest(this.table.add(this.lockedTable)), i = n.find(">tbody>tr").index(t), n = n[0] === this.table[0] ? r : this.table, n.find(">tbody>tr").eq(i)) : t }, select: function(n) { var i = this.selectable; return i ? (t !== n && (i.options.multiple || (i.clear(), n = n.first()), this._hasLockedColumns && (n = n.add(e.map(n, S(this._relatedRow, this))))), i.value(n)) : e() }, clearSelection: function() { var e = this.select(); e.length && (this.selectable.clear(), this.trigger(M)) }, _dataSource: function(e) { var t = this.dataSource; t && (t.unbind(M, this._refreshHandler), t.unbind(z, this._errorHandler), t.unbind(F, this._progressHandler)), this._refreshHandler = S(this.refresh, this), this._errorHandler = S(this._error, this), this._progressHandler = S(this._progress, this), t = this.dataSource = c.create(e), t.bind(M, this._refreshHandler), t.bind(z, this._errorHandler), t.bind(F, this._progressHandler) }, setDataSource: function(e) { this._dataSource(e), this._sortable(), this._filterable(), this._contentTree.render([]), this.options.autoBind && this.dataSource.fetch() }, dataItem: function(t) { var n = e(t).closest("tr"), i = this.dataSource.getByUid(n.attr(kendo.attr("uid"))); return i }, editRow: function(e) { var t; typeof e === P && (e = this.tbody.find(e)), t = this.dataItem(e), t && ("popup" != this._editMode() && (t._edit = !0), this._cancelEditor(), this._render(), this._createEditor(t), this.trigger(N, { container: this.editor.wrapper, model: t })) }, _cancelEdit: function(e) { e = f(e, { container: this.editor.wrapper, model: this.editor.model }), this.trigger(q, e) || this.cancelRow() }, cancelRow: function() { this._cancelEditor(), this._render() }, saveRow: function() { var e, t = this.editor; t && (e = { model: t.model, container: t.wrapper }, t.end() && !this.trigger(O, e) && this.dataSource.sync()) }, addRow: function(e) { var n = this.editor, i = 0, r = {}; if (!n || n.end()) return e ? (e instanceof ot || (e = this.dataItem(e)), r[e.parentIdField] = e.id, i = this.dataSource.indexOf(e) + 1, e.set("expanded", !0), this.dataSource.load(e).then(S(this._insertAt, this, r, i)), t) : (this._insertAt(r, i), t) }, _insertAt: function(e, t) { e = this.dataSource.insert(t, e); var n = this.tbody.find("[" + kendo.attr("uid") + "=" + e.uid + "]"); this.editRow(n) }, removeRow: function(e) { var t = this.dataItem(e), n = { model: t, row: e }; t && !this.trigger(W, n) && (this.dataSource.remove(t), this.dataSource.sync()) }, _cancelEditor: function() { var e, t = this.editor; t && (e = t.model, this._destroyEditor(), this.dataSource.cancelChanges(e), e._edit = !1) }, _destroyEditor: function() { this.editor && (this.editor.close(), this.editor = null) }, _createEditor: function(e) { var t, n, i = this.tbody.find("[" + kendo.attr("uid") + "=" + e.uid + "]"); i = i.add(this._relatedRow(i)), t = this._editMode(), n = { columns: this.columns, model: e, target: this, clearContainer: !1, template: this.options.editable.template }, "inline" == t ? this.editor = new d(i, n) : (f(n, { window: this.options.editable.window, commandRenderer: S(function() { return this._buildCommands(["update", "canceledit"]) }, this), fieldRenderer: this._cellContent, save: S(this.saveRow, this), cancel: S(this._cancelEdit, this), appendTo: this.wrapper }), this.editor = new u(i, n)) }, _editMode: function() { var e = "inline", t = this.options.editable; return t !== !0 && (e = "string" == typeof t ? t : t.mode || e), e.toLowerCase() }, hideColumn: function(e) { this._toggleColumnVisibility(e, !0) }, showColumn: function(e) { this._toggleColumnVisibility(e, !1) }, _toggleColumnVisibility: function(e, t) { e = this._findColumn(e), e && e.hidden !== t && (e.hidden = t, this._ensureExpandableColumn(), this._renderCols(), this._renderHeader(), this._render(), this._adjustTablesWidth(), this.trigger(t ? Y : Q, { column: e }), t || e.width || this.table.add(this.thead.closest("table")).width("")) }, _findColumn: function(e) { return e = "number" == typeof e ? this.columns[e] : E(e) ? D(this.columns, function(t) { return t === e })[0] : D(this.columns, function(t) { return t.field === e })[0] }, _adjustTablesWidth: function() { var e, t, n, i = this.thead.prev().children(), r = 0; for (e = 0, t = i.length; t > e; e++) { if (n = i[e].style.width, !n || -1 != n.indexOf("%")) { r = 0; break } r += parseInt(n, 10) } r && this.table.add(this.thead.closest("table")).width(r) }, _reorderable: function() { var t, n, i; this.options.reorderable && (t = this.options.scrollable === !0, n = (t ? ".k-grid-header:first " : "table:first>.k-grid-header ") + K, i = this, this._draggableInstance = new w.Draggable(this.wrapper, { group: kendo.guid(), filter: n, hint: function(t) { return e('<div class="k-header k-drag-clue" />').css({ width: t.width(), paddingLeft: t.css("paddingLeft"), paddingRight: t.css("paddingRight"), lineHeight: t.height() + "px", paddingTop: t.css("paddingTop"), paddingBottom: t.css("paddingBottom") }).html(t.attr(kendo.attr("title")) || t.attr(kendo.attr("field")) || t.text()).prepend('<span class="k-icon k-drag-status k-denied" />') } }), this.reorderable = new w.Reorderable(this.wrapper, { draggable: this._draggableInstance, dragOverContainers: S(this._allowDragOverContainers, this), inSameContainer: function(t) { return e(t.source).parent()[0] === e(t.target).parent()[0] }, change: function(e) { var t = e.newIndex, n = e.oldIndex, r = "before" === e.position, o = i.columns[n]; i.trigger(X, { newIndex: t, oldIndex: n, column: o }), i.reorderColumn(t, o, r) } })) }, _allowDragOverContainers: function(e) { return this.columns[e].lockable !== !1 }, reorderColumn: function(n, i, r) { var o, a, s, l = this.columns, c = A(i, l), d = l[n], u = !!d.locked, h = this._nonLockedColumns().length; c !== n && (!u || i.locked || 1 != h) && (u || !i.locked || l.length - h != 1) && (r === t && (r = c > n), o = !!i.locked, o = o != u, i.locked = u, l.splice(r ? n : n + 1, 0, i), l.splice(n > c ? c : c + 1, 1), this._renderCols(), a = e(this.lockedHeader).add(this.thead).find("th"), a.eq(c)[r ? "insertBefore" : "insertAfter"](a.eq(n)), s = this._headerTree.children[0].children, this._hasLockedColumns && (s = this._lockedHeaderTree.children[0].children.concat(s)), s.splice(r ? n : n + 1, 0, s[c]), s.splice(n > c ? c : c + 1, 1), this._hasLockedColumns && (this._lockedHeaderTree.children[0].children = s.splice(0, this._lockedColumns().length), this._headerTree.children[0].children = s), this._applyLockedContainersWidth(), this.refresh(), o && (u ? this.trigger(et, { column: i }) : this.trigger(tt, { column: i }))) }, lockColumn: function(e) { var t, n = this.columns; e = "number" == typeof e ? n[e] : D(n, function(t) { return t.field === e })[0], e && !e.hidden && (t = this._lockedColumns().length - 1, this.reorderColumn(t, e, !1)) }, unlockColumn: function(e) { var t, n = this.columns; e = "number" == typeof e ? n[e] : D(n, function(t) { return t.field === e })[0], e && !e.hidden && (t = this._lockedColumns().length, this.reorderColumn(t, e, !0)) }, _columnMenu: function() { var t, n, i, r, o, a, s = e(this.lockedHeader).add(this.thead).find("th"), l = this.columns, c = this.options, d = c.columnMenu, u = S(this._columnMenuInit, this), h = this._lockedColumns().length; if (d) for ("boolean" == typeof d && (d = {}), a = 0; s.length > a; a++) t = l[a], t.field && (n = s.eq(a).data("kendoColumnMenu"), n && n.destroy(), r = !1, t.sortable !== !1 && d.sortable !== !1 && c.sortable !== !1 && (r = f({}, c.sortable, { compare: (t.sortable || {}).compare })), o = !1, c.filterable && t.filterable !== !1 && d.filterable !== !1 && (o = f({ pane: this.pane }, t.filterable, c.filterable)), i = { dataSource: this.dataSource, values: t.values, columns: d.columns, sortable: r, filterable: o, messages: d.messages, owner: this, closeCallback: e.noop, init: u, pane: this.pane, lockedColumns: t.lockable !== !1 && h > 0 }, c.$angular && (i.$angular = c.$angular), s.eq(a).kendoColumnMenu(i)) }, _columnMenuInit: function(e) { this.trigger(J, { field: e.field, container: e.container }) } }), kendo.ExcelMixin && kendo.ExcelMixin.extend(h.prototype), kendo.PDFMixin && kendo.PDFMixin.extend(h.prototype), f(!0, kendo.data, { TreeListDataSource: c, TreeListModel: ot }), f(!0, kendo.ui, { TreeList: h }), w.plugin(h) }(window.kendo.jQuery), function(e) { function t(e) { for (var t, n = 0, i = e.length; i > n; n++) if (2 == e[n].type) { t = !0; break } t && e.splice(n + 1, 0, { caption: "KPIs", defaultHierarchy: "[KPIs]", name: "KPIs", uniqueName: "[KPIs]" }) } function n(e) { return { name: e.uniqueName, type: e.type } } function i(e) { for (var t = 0, n = e.length; n > t; t++) e[t].uniqueName = e[t].name, e[t].type = "kpi"; return e } function r(t) { var n = e(t).closest(".k-pivot-setting"); return n.length ? n.data("kendoPivotSettingTarget") : null } function o(e, t, n) { return { hierarchyUniqueName: e, uniqueName: t, caption: t, measure: t, name: t, type: n, kpi: !0 } } function a(e) { var t = e.name; return [o(t, e.value, "value"), o(t, e.goal, "goal"), o(t, e.status, "status"), o(t, e.trend, "trend")] } var s = window.kendo, l = s.ui, c = l.Widget, d = ".kendoPivotConfigurator", u = "mouseenter" + d + " mouseleave" + d, h = s.template('<p class="k-reset"><span class="k-icon #=icon#"></span>${name}</p><div class="k-list-container k-reset"/>'), p = c.extend({ init: function(e, t) { c.fn.init.call(this, e, t), this.element.addClass("k-widget k-fieldselector k-alt k-edit-form-container"), this._dataSource(), this._layout(), this.refresh(), s.notify(this) }, events: [], options: { name: "PivotConfigurator", filterable: !1, sortable: !1, messages: { measures: "Drop Data Fields Here", columns: "Drop Column Fields Here", rows: "Drop Rows Fields Here", measuresLabel: "Measures", columnsLabel: "Columns", rowsLabel: "Rows", fieldsLabel: "Fields" } }, _dataSource: function() { var t = this; t.dataSource && t._refreshHandler ? t.dataSource.unbind("change", t._refreshHandler).unbind("error", t._errorHandler).unbind("progress", t._progressHandler) : (t._errorHandler = e.proxy(t._error, t), t._refreshHandler = e.proxy(t.refresh, t), t._progressHandler = e.proxy(t._requestStart, t)), t.dataSource = s.data.PivotDataSource.create(t.options.dataSource), t.dataSource.bind("change", t._refreshHandler).bind("error", t._errorHandler).bind("progress", t._progressHandler) }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.measures && this.measures.setDataSource(e), this.rows && this.rows.setDataSource(e), this.columns && this.columns.setDataSource(e), this.refresh() }, _treeViewDataSource: function() { var n = this; return s.data.HierarchicalDataSource.create({ schema: { model: { id: "uniqueName", hasChildren: function(e) { return !("hierarchyUniqueName" in e || "aggregator" in e) } } }, transport: { read: function(r) { var o, s, l; e.isEmptyObject(r.data) ? (o = n.dataSource.schemaDimensions(), o.done(function(e) { n.dataSource.cubeBuilder || t(e), r.success(e) }).fail(r.error)) : (s = n.treeView.dataSource.get(r.data.uniqueName), "[KPIs]" === s.uniqueName ? (l = !0, o = n.dataSource.schemaKPIs(), o.done(function(e) { r.success(i(e)) }).fail(r.error)) : "kpi" == s.type && (l = !0, r.success(a(s))), l || (o = 2 == s.type ? n.dataSource.schemaMeasures() : s.dimensionUniqueName ? n.dataSource.schemaLevels(r.data.uniqueName) : n.dataSource.schemaHierarchies(r.data.uniqueName), o.done(r.success).fail(r.error))) } } }) }, _progress: function(e) { s.ui.progress(this.element, e) }, _error: function() { this._progress(!1) }, _requestStart: function() { this._progress(!0) }, _layout: function() { this.form = e('<div class="k-columns k-state-default k-floatwrap"/>').appendTo(this.element), this._fields(), this._targets() }, _fields: function() { var t = e('<div class="k-state-default"><p class="k-reset"><span class="k-icon k-i-group"></span>' + this.options.messages.fieldsLabel + "</p></div>").appendTo(this.form), i = '# if (item.type == 2 || item.uniqueName == "[KPIs]") { #<span class="k-icon k-i-#= (item.type == 2 ? "sum" : "kpi") #"></span># } else if (item.type && item.type !== "kpi") { #<span class="k-icon k-i-dimension"></span># } ##: item.caption || item.name #'; this.treeView = e("<div/>").appendTo(t).kendoTreeView({ template: i, dataTextField: "caption", dragAndDrop: !0, autoBind: !1, dataSource: this._treeViewDataSource(), dragstart: function(e) { var t = this.dataItem(e.sourceNode); (t.hasChildren || t.aggregator || t.measure) && 2 != t.type && "[KPIs]" !== t.uniqueName || e.preventDefault() }, drag: function(e) { var t = "k-denied", n = r(e.dropTarget); n && n.validate(this.dataItem(e.sourceNode)) && (t = "k-add"), e.setStatusClass(t) }, drop: function(e) { var t, i, o, s, l, c; if (e.preventDefault(), t = r(e.dropTarget), i = this.dataItem(e.sourceNode), t && t.validate(i)) { if (c = i.defaultHierarchy || i.uniqueName, "kpi" === i.type) for (l = a(i), s = l.length, c = [], o = 0; s > o; o++) c.push(n(l[o])); else i.kpi && (c = [n(i)]); t.add(c) } } }).data("kendoTreeView") }, _createTarget: function(t, n) { var i = '<li class="k-item k-header" data-' + s.ns + 'name="${data.name}">${data.name}', r = n.sortable, o = ""; return r && (o += "#if (data.sortIcon) {#", o += '<span class="k-icon ${data.sortIcon} k-setting-sort"></span>', o += "#}#"), (n.filterable || r) && (o += '<span class="k-icon k-i-arrowhead-s k-setting-fieldmenu"></span>'), o += '<span class="k-icon k-si-close k-setting-delete"></span>', i += '<span class="k-field-actions">' + o + "</span></li>", new s.ui.PivotSettingTarget(t, e.extend({ dataSource: this.dataSource, hint: function(t) { var n = e('<div class="k-fieldselector"><ul class="k-list k-reset"></ul></div>'); return n.find(".k-list").append(t.clone()), n }, template: i, emptyTemplate: '<li class="k-item k-empty">${data}</li>' }, n)) }, _targets: function() { var t = e('<div class="k-state-default"/>').appendTo(this.form), n = e(h({ name: this.options.messages.columnsLabel, icon: "k-i-vbars" })).appendTo(t), i = e('<ul class="k-pivot-configurator-settings k-list k-reset" />').appendTo(n.last()), r = e(h({ name: this.options.messages.rowsLabel, icon: "k-i-hbars" })).appendTo(t), o = e('<ul class="k-pivot-configurator-settings k-list k-reset" />').appendTo(r.last()), a = e(h({ name: this.options.messages.measuresLabel, icon: "k-i-sum" })).appendTo(t), s = e('<ul class="k-pivot-configurator-settings k-list k-reset" />').appendTo(a.last()), l = this.options; this.columns = this._createTarget(i, { filterable: l.filterable, sortable: l.sortable, connectWith: o, messages: { empty: l.messages.columns, fieldMenu: l.messages.fieldMenu } }), this.rows = this._createTarget(o, { filterable: l.filterable, setting: "rows", connectWith: i, messages: { empty: this.options.messages.rows, fieldMenu: this.options.messages.fieldMenu } }), this.measures = this._createTarget(s, { setting: "measures", messages: { empty: l.messages.measures } }), i.add(o).add(s).on(u, ".k-item:not(.k-empty)", this._toggleHover) }, _toggleHover: function(t) { e(t.currentTarget).toggleClass("k-state-hover", "mouseenter" === t.type) }, _resize: function() { var e, t, n = this.element, i = this.options.height; i && (n.height(i), n.is(":visible") && (t = n.children(".k-columns").children("div.k-state-default"), i = n.innerHeight(), e = (n.outerHeight() - i) / 2, i = i - (t.outerHeight(!0) - t.height()) - e, t.height(i))) }, refresh: function() { var e = this.dataSource; (e.cubeBuilder || this._cube !== e.cube() || this._catalog !== e.catalog()) && this.treeView.dataSource.fetch(), this._catalog = this.dataSource.catalog(), this._cube = this.dataSource.cube(), this._resize(), this._progress(!1) }, destroy: function() { c.fn.destroy.call(this), this.dataSource.unbind("change", this._refreshHandler), this.form.find(".k-list").off(d), this.rows.destroy(), this.columns.destroy(), this.measures.destroy(), this.treeView.destroy(), this.element = null, this._refreshHandler = null } }); l.plugin(p) }(window.kendo.jQuery), function(e, t, n) { "use strict"; function i(e) { var t = C; try { return C = function(e) { return e() }, e() } finally { C = t } } function r(e, i, r, o) { i[r] = t.copy(e.$eval(o)), i[r] === n && o.match(/^\w*$/) && T.warn(r + " attribute resolved to undefined. Maybe you meant to use a string literal like: '" + o + "'?") } function o(i, o, c, d, m, v) { function _() { var n, v, _, w, b, x, C, S, T, P, M, z, F; return c.kRebind && (n = e(e(o)[0].cloneNode(!0))), v = d.replace(/^kendo/, ""), _ = t.extend({}, c.defaultOptions, i.$eval(c.kOptions || c.options)), (w = e(o)[d]) ? (b = w.widget.prototype.options, x = w.widget.prototype.events, e.each(c, function(e, t) { var n, o, a, s; "source" !== e && "kDataSource" !== e && "kScopeField" !== e && (n = "data" + e.charAt(0).toUpperCase() + e.slice(1), 0 === e.indexOf("on") && (o = e.replace(/^on./, function(e) { return e.charAt(2).toLowerCase() }), x.indexOf(o) > -1 && (_[o] = t)), b.hasOwnProperty(n) ? r(i, _, n, t) : b.hasOwnProperty(e) && !I[e] ? r(i, _, e, t) : E[e] || (a = e.match(/^k(On)?([A-Z].*)/), a && (s = a[2].charAt(0).toLowerCase() + a[2].slice(1), a[1] && "kOnLabel" != e ? _[s] = t : ("kOnLabel" == e && (s = "onLabel"), r(i, _, s, t))))) }), C = c.kDataSource || c.source, C && (_.dataSource = A(i, o, v, C)), _.$angular = [i], o.is("select") && ! function(t) { if (t.length > 0) { var n = e(t[0]); !/\S/.test(n.text()) && /^\?/.test(n.val()) && n.remove() } }(o[0].options), S = w.call(o, D = _).data(d), l(S, i, c, d, m), i.$emit("kendoWidgetCreated", S), T = p(i, S), c.kRebind && g(S, i, o, n, c.kRebind, T, c), c.kNgDisabled && (P = c.kNgDisabled, M = i.$eval(P), M && S.enable(!M), a(S, i, o, P)), c.kNgReadonly && (z = c.kNgReadonly, F = i.$eval(z), F && S.readonly(F), s(S, i, o, z)), c.kNgModel && h(S, i, c.kNgModel), y && u(S, i, o, y, k), S && f(S, o), S) : (window.console.error("Could not find: " + d), null) } var w, b, y, k, x, S; if (!(o instanceof jQuery)) throw Error("The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document."); return w = c.kNgDelay, b = i.$eval(w), v = v || [], y = v[0], k = v[1], w && !b ? (x = i.$root || i, S = function() { var e = i.$watch(w, function(t, n) { t !== n && (e(), o.removeAttr(c.$attr.kNgDelay), w = null, C(_)) }) }, /^\$(digest|apply)$/.test(x.$$phase) ? S() : i.$apply(S), n) : _() } function a(e, t, i, r) { return kendo.ui.PanelBar && e instanceof kendo.ui.PanelBar || kendo.ui.Menu && e instanceof kendo.ui.Menu ? (T.warn("k-ng-disabled specified on a widget that does not have the enable() method: " + e.options.name), n) : (t.$watch(r, function(t, n) { t != n && e.enable(!t) }), n) } function s(e, t, i, r) { return "function" != typeof e.readonly ? (T.warn("k-ng-readonly specified on a widget that does not have the readonly() method: " + e.options.name), n) : (t.$watch(r, function(t, n) { t != n && e.readonly(t) }), n) } function l(e, t, n, i, r) { if (n[r]) { var o = x(n[r]).assign; if (!o) throw Error(r + " attribute used but expression in it is not assignable: " + n[i]); o(t, e) } } function c(e) { return /checkbox|radio/i.test(e.attr("type")) ? e.prop("checked") : e.val() } function d(e) { return P.test(e[0].tagName) } function u(e, t, i, r, o) { var a, s, l, u; e.value && (a = d(i) ? function() { return c(i) } : function() { return e.value() }, r.$render = function() { var t = r.$viewValue; t === n && (t = r.$modelValue), t === n && (t = null), setTimeout(function() { e && e.value(t) }, 0) }, s = !1, d(i) && i.on("change", function() { s = !0 }), l = function(e) { return function() { var n; s || (s = !1, e && o && (n = o.$pristine), r.$setViewValue(a()), e && (r.$setPristine(), n && o.$setPristine()), _(t)) } }, e.first("change", l(!1)), kendo.ui.AutoComplete && e instanceof kendo.ui.AutoComplete || e.first("dataBound", l(!0)), u = a(), u != r.$viewValue && (r.$isEmpty(r.$viewValue) ? null != u && "" !== u && u != r.$viewValue && r.$setViewValue(u) : e.value(r.$viewValue)), r.$setPristine()) } function h(t, i, r) { var o, a, s, l, c, d; return "function" != typeof t.value ? (T.warn("k-ng-model specified on a widget that does not have the value() method: " + t.options.name), n) : (o = e(t.element).parents("form"), a = i[o.attr("name")], s = x(r), l = s.assign, c = !1, t.$angular_setLogicValue(s(i)), d = function(e, i) { e === n && (e = null), c || e !== i && t.$angular_setLogicValue(e) }, kendo.ui.MultiSelect && t instanceof kendo.ui.MultiSelect ? i.$watchCollection(r, d) : i.$watch(r, d), t.first("change", function() { c = !0, a && a.$pristine && a.$setDirty(), i.$apply(function() { l(i, t.$angular_getLogicValue()) }), c = !1 }), n) } function p(e, t) { var n = e.$on("$destroy", function() { n(), t && (t.element && (t = v(t.element), t && t.destroy()), t = null) }); return n } function f(t, n) { function i() { a.disconnect() } function r() { a.observe(e(n)[0], { attributes: !0 }) } var o, a; window.MutationObserver && t.wrapper && (o = [].slice.call(e(n)[0].classList), a = new MutationObserver(function(n) { i(), t && (n.forEach(function(n) { var i, r = e(t.wrapper)[0]; switch (n.attributeName) { case "class": i = [].slice.call(n.target.classList), i.forEach(function(e) { o.indexOf(e) < 0 && (r.classList.add(e), kendo.ui.ComboBox && t instanceof kendo.ui.ComboBox && t.input[0].classList.add(e)) }), o.forEach(function(e) { i.indexOf(e) < 0 && (r.classList.remove(e), kendo.ui.ComboBox && t instanceof kendo.ui.ComboBox && t.input[0].classList.remove(e)) }), o = i; break; case "disabled": "function" == typeof t.enable && t.enable(!e(n.target).attr("disabled")); break; case "readonly": "function" == typeof t.readonly && t.readonly(!!e(n.target).attr("readonly")) } }), r()) }), r(), t.first("destroy", i)) } function g(t, n, i, r, o, a, s) { var l = n.$watch(o, function(o, c) { var d, u, h, p; o !== c && (l(), d = H[t.options.name], d && d.forEach(function(t) { var i = n.$eval(s["k" + t]); i && r.append(e(i).attr(kendo.toHyphens("k" + t), "")) }), u = e(t.wrapper)[0], h = e(t.element)[0], p = i.injector().get("$compile"), t._destroy(), a && a(), t = null, u && h && (u.parentNode.replaceChild(h, u), e(i).replaceWith(r)), p(r)(n)) }, !0); _(n) } function m(e, n) { function i(e, t) { y.directive(e, ["directiveFactory", function(n) { return n.create(t, e) } ]) } var r, o, a, s, l = n ? "Mobile" : ""; l += e.fn.options.name, r = l, o = "kendo" + l.charAt(0) + l.substr(1).toLowerCase(), l = "kendo" + l, a = l.replace(/([A-Z])/g, "-$1"), -1 == z.indexOf(l.replace("kendo", "")) && (s = l === o ? [l] : [l, o], t.forEach(s, function(e) { y.directive(e, function() { return { restrict: "E", replace: !0, template: function(e, t) { var n = M[r] || "div", i = t.kScopeField; return "<" + n + " " + a + (i ? '="' + i + '"' : "") + ">" + e.html() + "</" + n + ">" } } }) })), F.indexOf(l.replace("kendo", "")) > -1 || (i(l, l), o != l && i(o, l)) } function v(t) { return t = e(t), kendo.widgetInstance(t, kendo.ui) || kendo.widgetInstance(t, kendo.mobile.ui) || kendo.widgetInstance(t, kendo.dataviz.ui) } function _(e, t) { var n = e.$root || e, i = /^\$(digest|apply)$/.test(n.$$phase); t ? i ? t() : n.$apply(t) : i || n.$digest() } function w(t, n) { t.$destroy(), n && e(n).removeData("$scope").removeData("$$kendoScope").removeData("$isolateScope").removeData("$isolateScopeNoTemplate").removeClass("ng-scope") } function b(n, i, r) { var o, a, s; if (e.isArray(n)) return t.forEach(n, function(e) { b(e, i, r) }); if ("string" == typeof n) { for (o = n.split("."), a = kendo; a && o.length > 0;) a = a[o.shift()]; if (!a) return R.push([n, i, r]), !1; n = a.prototype } return s = n[i], n[i] = function() { var e = this, t = arguments; return r.apply({ self: e, next: function() { return s.apply(e, arguments.length > 0 ? arguments : t) } }, t) }, !0 } var y, k, x, C, S, T, D, A, E, I, P, M, z, F, R, H; t && (y = t.module("kendo.directives", []), k = t.injector(["ng"]), x = k.get("$parse"), C = k.get("$timeout"), T = k.get("$log"), A = function() { var e = { TreeList: "TreeListDataSource", TreeView: "HierarchicalDataSource", Scheduler: "SchedulerDataSource", PanelBar: "$PLAIN", Menu: "$PLAIN", ContextMenu: "$PLAIN" }, t = function(e, t) { return "$PLAIN" == t ? e : kendo.data[t].create(e) }; return function(n, i, r, o) { var a = e[r] || "DataSource", s = t(n.$eval(o), a); return n.$watch(o, function(e, n) { var r, o; e !== n && (r = t(e, a), o = v(i), o && "function" == typeof o.setDataSource && o.setDataSource(r)) }), s } }(), E = { kDataSource: !0, kOptions: !0, kRebind: !0, kNgModel: !0, kNgDelay: !0 }, I = { name: !0, title: !0, style: !0 }, P = /^(input|select|textarea)$/i, y.factory("directiveFactory", ["$compile", function(t) { var n, i, r = !1; return S = t, i = function(t, i) { return { restrict: "AC", require: ["?ngModel", "^?form"], scope: !1, controller: ["$scope", "$attrs", "$element", function(e, t) { var n = this; n.template = function(e, n) { t[e] = kendo.stringify(n) }, e.$on("$destroy", function() { n.template = null, n = null }) } ], link: function(a, s, l, c) { var d, u = e(s), h = t.replace(/([A-Z])/g, "-$1"); u.attr(h, u.attr("data-" + h)), u[0].removeAttribute("data-" + h), d = o(a, s, l, t, i, c), d && (n && clearTimeout(n), n = setTimeout(function() { a.$emit("kendoRendered"), r || (r = !0, e("form").each(function() { var t = e(this).controller("form"); t && t.$setPristine() })) })) } } }, { create: i } } ]), M = { Editor: "textarea", NumericTextBox: "input", DatePicker: "input", DateTimePicker: "input", TimePicker: "input", AutoComplete: "input", ColorPicker: "input", MaskedTextBox: "input", MultiSelect: "input", Upload: "input", Validator: "form", Button: "button", MobileButton: "a", MobileBackButton: "a", MobileDetailButton: "a", ListView: "ul", MobileListView: "ul", TreeView: "ul", Menu: "ul", ContextMenu: "ul", ActionSheet: "ul" }, z = ["MobileView", "MobileLayout", "MobileSplitView", "MobilePane", "MobileModalView"], F = ["MobileApplication", "MobileView", "MobileModalView", "MobileLayout", "MobileActionSheet", "MobileDrawer", "MobileSplitView", "MobilePane", "MobileScrollView", "MobilePopOver"], t.forEach(["MobileNavBar", "MobileButton", "MobileBackButton", "MobileDetailButton", "MobileTabStrip", "MobileScrollView", "MobileScroller"], function(e) { F.push(e), e = "kendo" + e, y.directive(e, function() { return { restrict: "A", link: function(t, n, i) { o(t, n, i, e, e) } } }) }), function() { function e(e) { return function(n) { t.forEach(n, function(t) { t.fn && t.fn.options && t.fn.options.name && /^[A-Z]/.test(t.fn.options.name) && m(t, e) }) } } t.forEach([kendo.ui, kendo.dataviz && kendo.dataviz.ui], e(!1)), t.forEach([kendo.mobile && kendo.mobile.ui], e(!0)) }(), R = [], b(kendo.ui, "plugin", function(t, n, i) { this.next(), R = e.grep(R, function(e) { return !b.apply(null, e) }), m(t, "Mobile" == i) }), b(["ui.Widget", "mobile.ui.Widget"], "angular", function(r, o) { var a, s = this.self; return "init" == r ? (!o && D && (o = D), D = null, o && o.$angular && (s.$angular_scope = o.$angular[0], s.$angular_init(s.element, o)), n) : (a = s.$angular_scope, a && i(function() { var i, l, c = o(), d = c.elements, u = c.data; if (d.length > 0) switch (r) { case "cleanup": t.forEach(d, function(t) { var n = e(t).data("$$kendoScope"); n && n !== a && n.$$kendoScope && w(n, t) }); break; case "compile": i = s.element.injector(), l = i ? i.get("$compile") : S, t.forEach(d, function(t, i) { var r, o; c.scopeFrom ? r = c.scopeFrom : (o = u && u[i], o !== n ? (r = e.extend(a.$new(), o), r.$$kendoScope = !0) : r = a), e(t).data("$$kendoScope", r), l(t)(r) }), _(a) } }), n) }), b("ui.Widget", "$angular_getLogicValue", function() { return this.self.value() }), b("ui.Widget", "$angular_setLogicValue", function(e) { this.self.value(e) }), b("ui.Select", "$angular_getLogicValue", function() { var e = this.self.dataItem(), t = this.self.options.dataValueField; return e ? this.self.options.valuePrimitive ? t ? e[t] : e : e.toJSON() : null }), b("ui.Select", "$angular_setLogicValue", function(e) { var t = this.self, i = t.options, r = i.dataValueField, o = i.text || ""; e === n && (e = ""), r && !i.valuePrimitive && e && (o = e[i.dataTextField] || "", e = e[r || i.dataTextField]), t.options.autoBind !== !1 || t.listView.isBound() ? t.value(e) : !o && e && i.valuePrimitive ? t.value(e) : t._preselect(e, o) }), b("ui.MultiSelect", "$angular_getLogicValue", function() { var t = this.self.dataItems().slice(0), n = this.self.options.dataValueField; return n && this.self.options.valuePrimitive && (t = e.map(t, function(e) { return e[n] })), t }), b("ui.MultiSelect", "$angular_setLogicValue", function(t) { var n, i, r, o; null == t && (t = []), n = this.self, i = n.options, r = i.dataValueField, o = t, r && !i.valuePrimitive && (t = e.map(t, function(e) { return e[r] })), i.autoBind !== !1 || i.valuePrimitive || n.listView.isBound() ? n.value(t) : n._preselect(o, t) }), b("ui.AutoComplete", "$angular_getLogicValue", function() { var e, t, n, i, r, o = this.self.options, a = this.self.value().split(o.separator), s = o.valuePrimitive, l = this.self.dataSource.data(), c = []; for (e = 0, t = l.length; t > e; e++) for (n = l[e], i = o.dataTextField ? n[o.dataTextField] : n, r = 0; a.length > r; r++) if (i === a[r]) { c.push(s ? i : n.toJSON()); break } return c }), b("ui.AutoComplete", "$angular_setLogicValue", function(t) { null == t && (t = []); var n = this.self, i = n.options.dataTextField; i && !n.options.valuePrimitive && (t = e.map(t, function(e) { return e[i] })), n.value(t) }), b("ui.Widget", "$angular_init", function(t, n) { var i, r, o, a, s = this.self; if (n && !e.isArray(n)) for (i = s.$angular_scope, r = s.events.length; --r >= 0;) o = s.events[r], a = n[o], a && "string" == typeof a && (n[o] = s.$angular_makeEventHandler(o, i, a)) }), b("ui.Widget", "$angular_makeEventHandler", function(e, t, n) { return n = x(n), function(e) { _(t, function() { n(t, { kendoEvent: e }) }) } }), b(["ui.Grid", "ui.ListView", "ui.TreeView"], "$angular_makeEventHandler", function(e, n, i) { return "change" != e ? this.next() : (i = x(i), function(e) { var r, o, a, s, l, c, d, u, h, p = e.sender, f = p.options, g = { kendoEvent: e }; for (t.isString(f.selectable) && (r = -1 !== f.selectable.indexOf("cell"), o = -1 !== f.selectable.indexOf("multiple")), a = g.selected = this.select(), s = g.data = [], l = g.columns = [], d = 0; a.length > d; d++) u = r ? a[d].parentNode : a[d], h = p.dataItem(u), r ? (t.element.inArray(h, s) < 0 && s.push(h), c = t.element(a[d]).index(), t.element.inArray(c, l) < 0 && l.push(c)) : s.push(h); o || (g.dataItem = g.data = s[0], g.selected = a[0]), _(n, function() { i(n, g) }) }) }), b("ui.Grid", "$angular_init", function(i, r) { if (this.next(), r.columns) { var o = e.extend({}, kendo.Template, r.templateSettings); t.forEach(r.columns, function(e) { !e.field || e.template || e.format || e.values || e.encoded !== n && !e.encoded || (e.template = "<span ng-bind='" + kendo.expr(e.field, "dataItem") + "'>#: " + kendo.expr(e.field, o.paramName) + "#</span>") }) } }), b("mobile.ui.ButtonGroup", "value", function(e) { var t = this.self; return null != e && (t.select(t.element.children("li.km-button").eq(e)), t.trigger("change"), t.trigger("select", { index: t.selectedIndex })), t.selectedIndex }), b("mobile.ui.ButtonGroup", "_select", function() { this.next(), this.self.trigger("change") }), y.directive("kendoMobileApplication", function() { return { terminal: !0, link: function(e, t, n) { o(e, t, n, "kendoMobileApplication", "kendoMobileApplication") } } }).directive("kendoMobileView", function() { return { scope: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, n._instance = o(e, t, n, "kendoMobileView", "kendoMobileView") }, post: function(e, t, n) { n._instance._layout(), n._instance._scroller() } } } }).directive("kendoMobileDrawer", function() { return { scope: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, n._instance = o(e, t, n, "kendoMobileDrawer", "kendoMobileDrawer") }, post: function(e, t, n) { n._instance._layout(), n._instance._scroller() } } } }).directive("kendoMobileModalView", function() { return { scope: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, n._instance = o(e, t, n, "kendoMobileModalView", "kendoMobileModalView") }, post: function(e, t, n) { n._instance._layout(), n._instance._scroller() } } } }).directive("kendoMobileSplitView", function() { return { terminal: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, n._instance = o(e, t, n, "kendoMobileSplitView", "kendoMobileSplitView") }, post: function(e, t, n) { n._instance._layout() } } } }).directive("kendoMobilePane", function() { return { terminal: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, o(e, t, n, "kendoMobilePane", "kendoMobilePane") } } } }).directive("kendoMobileLayout", function() { return { link: { pre: function(e, t, n) { o(e, t, n, "kendoMobileLayout", "kendoMobileLayout") } } } }).directive("kendoMobileActionSheet", function() { return { restrict: "A", link: function(t, n, i) { n.find("a[k-action]").each(function() { e(this).attr("data-" + kendo.ns + "action", e(this).attr("k-action")) }), o(t, n, i, "kendoMobileActionSheet", "kendoMobileActionSheet") } } }).directive("kendoMobilePopOver", function() { return { terminal: !0, link: { pre: function(e, t, n) { n.defaultOptions = e.viewOptions, o(e, t, n, "kendoMobilePopOver", "kendoMobilePopOver") } } } }).directive("kendoViewTitle", function() { return { restrict: "E", replace: !0, template: function(e) { return "<span data-" + kendo.ns + "role='view-title'>" + e.html() + "</span>" } } }).directive("kendoMobileHeader", function() { return { restrict: "E", link: function(e, t) { t.addClass("km-header").attr("data-role", "header") } } }).directive("kendoMobileFooter", function() { return { restrict: "E", link: function(e, t) { t.addClass("km-footer").attr("data-role", "footer") } } }).directive("kendoMobileScrollViewPage", function() { return { restrict: "E", replace: !0, template: function(e) { return "<div data-" + kendo.ns + "role='page'>" + e.html() + "</div>" } } }), t.forEach(["align", "icon", "rel", "transition", "actionsheetContext"], function(e) { var t = "k" + e.slice(0, 1).toUpperCase() + e.slice(1); y.directive(t, function() { return { restrict: "A", priority: 2, link: function(n, i, r) { i.attr(kendo.attr(kendo.toHyphens(e)), n.$eval(r[t])) } } }) }), H = { TreeMap: ["Template"], MobileListView: ["HeaderTemplate", "Template"], MobileScrollView: ["EmptyTemplate", "Template"], Grid: ["AltRowTemplate", "DetailTemplate", "RowTemplate"], ListView: ["EditTemplate", "Template", "AltTemplate"], Pager: ["SelectTemplate", "LinkTemplate"], PivotGrid: ["ColumnHeaderTemplate", "DataCellTemplate", "RowHeaderTemplate"], Scheduler: ["AllDayEventTemplate", "DateHeaderTemplate", "EventTemplate", "MajorTimeHeaderTemplate", "MinorTimeHeaderTemplate"], TreeView: ["Template"], Validator: ["ErrorTemplate"] }, function() { var e = {}; t.forEach(H, function(n, i) { t.forEach(n, function(t) { e[t] || (e[t] = []), e[t].push("?^^kendo" + i) }) }), t.forEach(e, function(e, t) { var n = "k" + t, i = kendo.toHyphens(n); y.directive(n, function() { return { restrict: "A", require: e, terminal: !0, compile: function(t, r) { if ("" === r[n]) { t.removeAttr(i); var o = t[0].outerHTML; return function(r, a, s, l) { for (var c; !c && l.length;) c = l.shift(); c ? (c.template(n, o), t.remove()) : T.warn(i + " without a matching parent widget found. It can be one of the following: " + e.join(", ")) } } } } }) }) }()) }(window.kendo.jQuery, window.angular), function(e, t) { function n(e, t) { var n = { top: 0, right: 0, bottom: 0, left: 0 }; return t = t || 0, "number" == typeof e ? n[Ht] = n[Rt] = n[ct] = n[Tt] = e : (n[Ht] = e[Ht] || t, n[Rt] = e[Rt] || t, n[ct] = e[ct] || t, n[Tt] = e[Tt] || t), n } function i(e, t) { var n = e.tickX, i = e.tickY, r = e.position, o = new X.Path({ stroke: { width: t.width, color: t.color } }); return e.vertical ? o.moveTo(n, r).lineTo(n + t.size, r) : o.moveTo(r, i).lineTo(r, i + t.size), y(o), o } function r(e, t) { var n = e.lineStart, i = e.lineEnd, r = e.position, o = new X.Path({ stroke: { width: t.width, color: t.color, dashType: t.dashType } }); return e.vertical ? o.moveTo(n, r).lineTo(i, r) : o.moveTo(r, n).lineTo(r, i), y(o), o } function o(e, t) { var n, i, r, o = u(t - e, _t - 1); if (0 === o) { if (0 === t) return .1; o = ot.abs(t) } return n = ot.pow(10, ot.floor(ot.log(o) / ot.log(10))), i = u(o / n, _t), r = 1, r = 1.904762 > i ? .2 : 4.761904 > i ? .5 : 9.523809 > i ? 1 : 2, u(n * r, _t) } function a(e, t, n, i, r) { var o = r * bt; return new Wt(n + (e - n) * ot.cos(o) + (t - i) * ot.sin(o), i - (e - n) * ot.sin(o) + (t - i) * ot.cos(o)) } function s(t, n) { if (t.x1 == n.x1 && t.y1 == n.y1 && t.x2 == n.x2 && t.y2 == n.y2) return n; var i = ot.min(t.x1, n.x1), r = ot.max(t.x1, n.x1), o = ot.min(t.x2, n.x2), a = ot.max(t.x2, n.x2), s = ot.min(t.y1, n.y1), l = ot.max(t.y1, n.y1), c = ot.min(t.y2, n.y2), d = ot.max(t.y2, n.y2), u = []; return u[0] = C(r, s, o, l), u[1] = C(i, l, r, c), u[2] = C(o, l, a, c), u[3] = C(r, c, o, d), t.x1 == i && t.y1 == s || n.x1 == i && n.y1 == s ? (u[4] = C(i, s, r, l), u[5] = C(o, c, a, d)) : (u[4] = C(o, s, a, l), u[5] = C(i, c, r, d)), e.grep(u, function(e) { return e.height() > 0 && e.width() > 0 })[0] } function l(e, t) { return -1 != nt(e, t) } function c(e, t) { return u(ot.ceil(e / t) * t, _t) } function d(e, t) { return u(ot.floor(e / t) * t, _t) } function u(e, t) { var n = ot.pow(10, t || 0); return ot.round(e * n) / n } function h(e, t) { return ot.log(e) / ot.log(t) } function p(e, t, n) { var i = u(ot.abs(e % t), _t), r = t * (1 - n); return 0 === i || i > r } function f(e, t, n) { return u(e + (t - e) * n, ut) } function g(e, t) { return e - t } function m(e, t) { return e.match(yt) ? W.format.apply(this, arguments) : W.toString(t, e) } function v(e, t) { return 0 > -e.x * t.y + e.y * t.x } function _(e, t) { return e && t ? e.getTime() - t.getTime() : -1 } function w(e) { var t = e.originalEvent, n = 0; return t.wheelDelta && (n = -t.wheelDelta / 120, n = n > 0 ? ot.ceil(n) : ot.floor(n)), t.detail && (n = u(t.detail / 3)), n } function b(e) { if (!e || !e.indexOf || e.indexOf("&") < 0) return e; var t = b._element; return t.innerHTML = e, t.textContent || t.innerText } function y(e) { if (!W.support.vml) for (var t = 0; e.segments.length > t; t++) e.segments[t].anchor().round(0).translate(.5, .5); return e } function k(e) { var t, n, i = e.stops, r = e.innerRadius / e.radius * 100, o = i.length, a = []; for (t = 0; o > t; t++) n = at({}, i[t]), n.offset = (n.offset * (100 - r) + r) / 100, a.push(n); return a } function x(e) { var t = e.origin, n = e.bottomRight(); return new C(t.x, t.y, n.x, n.y) } var C, S, T, D, A, E, I, P, M, z, F, R, H, B, L, N, O, V, U, W = window.kendo, j = W.util, G = j.append, q = j.defined, $ = j.last, Y = j.valueOrDefault, Q = W.dataviz, K = Q.geometry, X = Q.drawing, Z = X.util.measureText, J = W.Class, et = W.template, tt = e.noop, nt = e.inArray, it = e.isPlainObject, rt = e.trim, ot = Math, at = W.deepExtend, st = "axisLabelClick", lt = "#000", ct = "bottom", dt = "center", ut = 3, ht = "clip", pt = "circle", ft = "cross", gt = "12px sans-serif", mt = 400, vt = 7, _t = 6, wt = 600, bt = ot.PI / 180, yt = /\{\d+:?/, kt = "height", xt = 1e5, Ct = 600, St = "inside", Tt = "left", Dt = "linear", At = Number.MAX_VALUE, Et = -Number.MAX_VALUE, It = "none", Pt = "noteClick", Mt = "noteHover", zt = "outside", Ft = "radial", Rt = "right", Ht = "top", Bt = "triangle", Lt = "width", Nt = "#fff", Ot = "x", Vt = "y", Ut = .2, Wt = function(e, n) { var i = this; return i instanceof Wt ? (i.x = e || 0, i.y = n || 0, t) : new Wt(e, n) }; Wt.fn = Wt.prototype = { clone: function() { var e = this; return new Wt(e.x, e.y) }, equals: function(e) { return e && e.x === this.x && e.y === this.y }, rotate: function(e, t) { var n = this, i = t * bt, r = ot.cos(i), o = ot.sin(i), a = e.x, s = e.y, l = n.x, c = n.y; return n.x = u(a + (l - a) * r + (c - s) * o, ut), n.y = u(s + (c - s) * r - (l - a) * o, ut), n }, multiply: function(e) { var t = this; return t.x *= e, t.y *= e, t }, distanceTo: function(e) { var t = this.x - e.x, n = this.y - e.y; return ot.sqrt(t * t + n * n) } }, Wt.onCircle = function(e, t, n) { return t *= bt, new Wt(e.x - n * ot.cos(t), e.y - n * ot.sin(t)) }, C = function(e, n, i, r) { var o = this; return o instanceof C ? (o.x1 = e || 0, o.x2 = i || 0, o.y1 = n || 0, o.y2 = r || 0, t) : new C(e, n, i, r) }, C.fn = C.prototype = { width: function() { return this.x2 - this.x1 }, height: function() { return this.y2 - this.y1 }, translate: function(e, t) { var n = this; return n.x1 += e, n.x2 += e, n.y1 += t, n.y2 += t, n }, move: function(e, t) { var n = this, i = n.height(), r = n.width(); return q(e) && (n.x1 = e, n.x2 = n.x1 + r), q(t) && (n.y1 = t, n.y2 = n.y1 + i), n }, wrap: function(e) { var t = this; return t.x1 = ot.min(t.x1, e.x1), t.y1 = ot.min(t.y1, e.y1), t.x2 = ot.max(t.x2, e.x2), t.y2 = ot.max(t.y2, e.y2), t }, wrapPoint: function(e) { return this.wrap(new C(e.x, e.y, e.x, e.y)), this }, snapTo: function(e, t) { var n = this; return t != Ot && t || (n.x1 = e.x1, n.x2 = e.x2), t != Vt && t || (n.y1 = e.y1, n.y2 = e.y2), n }, alignTo: function(e, t) { var n, i, r = this, o = r.height(), a = r.width(), s = t == Ht || t == ct ? Vt : Ot, l = s == Vt ? o : a; return t === dt ? (n = e.center(), i = r.center(), r.x1 += n.x - i.x, r.y1 += n.y - i.y) : r[s + 1] = t === Ht || t === Tt ? e[s + 1] - l : e[s + 2], r.x2 = r.x1 + a, r.y2 = r.y1 + o, r }, shrink: function(e, t) { var n = this; return n.x2 -= e, n.y2 -= t, n }, expand: function(e, t) { return this.shrink(-e, -t), this }, pad: function(e) { var t = this, i = n(e); return t.x1 -= i.left, t.x2 += i.right, t.y1 -= i.top, t.y2 += i.bottom, t }, unpad: function(e) { var t = this, i = n(e); return i.left = -i.left, i.top = -i.top, i.right = -i.right, i.bottom = -i.bottom, t.pad(i) }, clone: function() { var e = this; return new C(e.x1, e.y1, e.x2, e.y2) }, center: function() { var e = this; return new Wt(e.x1 + e.width() / 2, e.y1 + e.height() / 2) }, containsPoint: function(e) { var t = this; return e.x >= t.x1 && t.x2 >= e.x && e.y >= t.y1 && t.y2 >= e.y }, points: function() { var e = this; return [new Wt(e.x1, e.y1), new Wt(e.x2, e.y1), new Wt(e.x2, e.y2), new Wt(e.x1, e.y2)] }, getHash: function() { var e = this; return [e.x1, e.y1, e.x2, e.y2].join(",") }, overlaps: function(e) { return !(this.y1 > e.y2 || e.y1 > this.y2 || this.x1 > e.x2 || e.x1 > this.x2) }, rotate: function(e) { var t = this, n = t.width(), i = t.height(), r = t.center(), o = r.x, s = r.y, l = a(0, 0, o, s, e), c = a(n, 0, o, s, e), d = a(n, i, o, s, e), u = a(0, i, o, s, e); return n = ot.max(l.x, c.x, d.x, u.x) - ot.min(l.x, c.x, d.x, u.x), i = ot.max(l.y, c.y, d.y, u.y) - ot.min(l.y, c.y, d.y, u.y), t.x2 = t.x1 + n, t.y2 = t.y1 + i, t }, toRect: function() { return new K.Rect([this.x1, this.y1], [this.width(), this.height()]) }, hasSize: function() { return 0 !== this.width() && 0 !== this.height() }, align: function(e, t, n) { var i = this, r = t + 1, o = t + 2, a = t === Ot ? Lt : kt, s = i[a](); l(n, [Tt, Ht]) ? (i[r] = e[r], i[o] = i[r] + s) : l(n, [Rt, ct]) ? (i[o] = e[o], i[r] = i[o] - s) : n == dt && (i[r] = e[r] + (e[a]() - s) / 2, i[o] = i[r] + s) } }, S = J.extend({ init: function(e, t, n, i, r) { var o = this; o.c = e, o.ir = t, o.r = n, o.startAngle = i, o.angle = r }, clone: function() { var e = this; return new S(e.c, e.ir, e.r, e.startAngle, e.angle) }, middle: function() { return this.startAngle + this.angle / 2 }, radius: function(e, t) { var n = this; return t ? n.ir = e : n.r = e, n }, point: function(e, t) { var n = this, i = e * bt, r = ot.cos(i), o = ot.sin(i), a = t ? n.ir : n.r, s = u(n.c.x - r * a, ut), l = u(n.c.y - o * a, ut); return new Wt(s, l) }, adjacentBox: function(e, t, n) { var i = this.clone().expand(e), r = i.middle(), o = i.point(r), a = t / 2, s = n / 2, l = o.x - a, c = o.y - s, d = ot.sin(r * bt), u = ot.cos(r * bt); return ot.abs(d) < .9 && (l += a * -u / ot.abs(u)), ot.abs(u) < .9 && (c += s * -d / ot.abs(d)), new C(l, c, l + t, c + n) }, containsPoint: function(e) { var t = this, n = t.c, i = t.ir, r = t.r, o = t.startAngle, a = t.startAngle + t.angle, s = e.x - n.x, l = e.y - n.y, c = new Wt(s, l), d = t.point(o), h = new Wt(d.x - n.x, d.y - n.y), p = t.point(a), f = new Wt(p.x - n.x, p.y - n.y), g = u(s * s + l * l, ut); return (h.equals(c) || v(h, c)) && !v(f, c) && g >= i * i && r * r >= g }, getBBox: function() { var e, t, n, i = this, r = new C(At, At, Et, Et), o = u(i.startAngle % 360), a = u((o + i.angle) % 360), s = i.ir, l = [0, 90, 180, 270, o, a].sort(g), c = nt(o, l), d = nt(a, l); for (e = o == a ? l : d > c ? l.slice(c, d + 1) : [].concat(l.slice(0, d + 1), l.slice(c, l.length)), t = 0; e.length > t; t++) n = i.point(e[t]), r.wrapPoint(n), r.wrapPoint(n, s); return s || r.wrapPoint(i.c), r }, expand: function(e) { return this.r += e, this } }), T = S.extend({ init: function(e, t, n, i) { S.fn.init.call(this, e, 0, t, n, i) }, expand: function(e) { return S.fn.expand.call(this, e) }, clone: function() { var e = this; return new T(e.c, e.r, e.startAngle, e.angle) }, radius: function(e) { return S.fn.radius.call(this, e) }, point: function(e) { return S.fn.point.call(this, e) } }), D = function() {}, D.fn = D.prototype = { createRing: function(e, t) { var n, i = e.startAngle + 180, r = e.angle + i, o = new K.Point(e.c.x, e.c.y), a = ot.max(e.r, 0), s = ot.max(e.ir, 0), l = new K.Arc(o, { startAngle: i, endAngle: r, radiusX: a, radiusY: a }), c = X.Path.fromArc(l, t).close(); return s ? (l.radiusX = l.radiusY = s, n = l.pointAt(r), c.lineTo(n.x, n.y), c.arc(r, i, s, s, !0)) : c.lineTo(o.x, o.y), c } }, D.current = new D, A = J.extend({ init: function(e) { var t = this; t.children = [], t.options = at({}, t.options, e) }, reflow: function(e) { var t, n, i, r = this, o = r.children; for (n = 0; o.length > n; n++) i = o[n], i.reflow(e), t = t ? t.wrap(i.box) : i.box.clone(); r.box = t || e }, destroy: function() { { var e, t = this, n = t.children; t.getRoot() } for (this.animation && this.animation.destroy(), e = 0; n.length > e; e++) n[e].destroy() }, getRoot: function() { var e = this.parent; return e ? e.getRoot() : null }, translateChildren: function(e, t) { var n, i = this, r = i.children, o = r.length; for (n = 0; o > n; n++) r[n].box.translate(e, t) }, append: function() { G(this.children, arguments); for (var e = 0; arguments.length > e; e++) arguments[e].parent = this }, renderVisual: function() { this.options.visible !== !1 && (this.createVisual(), this.addVisual(), this.renderChildren(), this.createAnimation(), this.renderComplete()) }, addVisual: function() { this.visual && (this.visual.chartElement = this, this.parent && this.parent.appendVisual(this.visual)) }, renderChildren: function() { var e, t = this.children; for (e = 0; t.length > e; e++) t[e].renderVisual() }, createVisual: function() { this.visual = new Q.drawing.Group({ zIndex: this.options.zIndex, visible: Y(this.options.visible, !0) }) }, createAnimation: function() { this.visual && (this.animation = X.Animation.create(this.visual, this.options.animation)) }, appendVisual: function(e) { e.chartElement || (e.chartElement = this), e.options.noclip ? this.clipRoot().visual.append(e) : q(e.options.zIndex) ? this.stackRoot().stackVisual(e) : this.visual ? this.visual.append(e) : this.parent.appendVisual(e) }, clipRoot: function() { return this.parent ? this.parent.clipRoot() : this }, stackRoot: function() { return this.parent ? this.parent.stackRoot() : this }, stackVisual: function(e) { var t, n, i, r = e.options.zIndex || 0, o = this.visual.children; for (t = 0; o.length > t && (n = o[t], i = Y(n.options.zIndex, 0), !(i > r)); t++); this.visual.insertAt(e, t) }, traverse: function(e) { var t, n, i = this.children; for (t = 0; i.length > t; t++) n = i[t], e(n), n.traverse && n.traverse(e) }, closest: function(e) { for (var n = this, i = !1; n && !i;) i = e(n), i || (n = n.parent); return i ? n : t }, renderComplete: e.noop, hasHighlight: function() { var e = (this.options || {}).highlight; return !(!this.createHighlight || e && e.visible === !1) }, toggleHighlight: function(e) { var t, n = this, i = n._highlight, r = (n.options || {}).highlight, o = (r || {}).visual; if (!i) { if (t = { fill: { color: Nt, opacity: .2 }, stroke: { color: Nt, width: 1, opacity: .2 } }, o) { if (i = n._highlight = o(at(n.highlightVisualArgs(), { createVisual: function() { return n.createHighlight(t) }, series: n.series, dataItem: n.dataItem, category: n.category, value: n.value, percentage: n.percentage, runningTotal: n.runningTotal, total: n.total })), !i) return } else i = n._highlight = n.createHighlight(t); i.options.zIndex = n.options.zIndex, n.appendVisual(i) } i.visible(e) }, createGradientOverlay: function(e, t, n) { var i = new X.Path(at({ stroke: { color: It }, fill: this.createGradient(n), closed: e.options.closed }, t)); return i.segments.elements(e.segments.elements()), i }, createGradient: function(e) { return this.parent ? this.parent.createGradient(e) : t } }), E = A.extend({ init: function(e) { var t = this; t.gradients = {}, A.fn.init.call(t, e) }, options: { width: wt, height: mt, background: Nt, border: { color: lt, width: 0 }, margin: n(5), zIndex: -2 }, reflow: function() { var e, t = this, n = t.options, i = t.children, r = new C(0, 0, n.width, n.height); for (t.box = r.unpad(n.margin), e = 0; i.length > e; e++) i[e].reflow(r), r = s(r, i[e].box) || C() }, createVisual: function() { this.visual = new X.Group, this.createBackground() }, createBackground: function() { var e = this.options, t = e.border || {}, n = this.box.clone().pad(e.margin).unpad(t.width), i = X.Path.fromRect(n.toRect(), { stroke: { color: t.width ? t.color : "", width: t.width, dashType: t.dashType }, fill: { color: e.background, opacity: e.opacity }, zIndex: -10 }); this.visual.append(i) }, getRoot: function() { return this }, createGradient: function(e) { var t, n, i = this.gradients, r = j.objectKey(e), o = Q.Gradients[e.gradient]; return i[r] ? t = i[r] : (n = at({}, o, e), "linear" == o.type ? t = new X.LinearGradient(n) : (e.innerRadius && (n.stops = k(n)), t = new X.RadialGradient(n), t.supportVML = o.supportVML !== !1), i[r] = t), t } }), I = A.extend({ options: { align: Tt, vAlign: Ht, margin: {}, padding: {}, border: { color: lt, width: 0 }, background: "", shrinkToFit: !1, width: 0, height: 0, visible: !0 }, reflow: function(e) { function t() { s.align(e, Ot, l.align), s.align(e, Vt, l.vAlign), s.paddingBox = i.clone().unpad(p).unpad(g) } var i, r, o, a, s = this, l = s.options, c = l.width, d = l.height, u = c && d, h = l.shrinkToFit, p = n(l.margin), f = n(l.padding), g = l.border.width, m = s.children; for (r = e.clone(), u && (r.x2 = r.x1 + c, r.y2 = r.y1 + d), h && r.unpad(p).unpad(g).unpad(f), A.fn.reflow.call(s, r), i = u ? s.box = C(0, 0, c, d) : s.box, h && u ? (t(), r = s.contentBox = s.paddingBox.clone().unpad(f)) : (r = s.contentBox = i.clone(), i.pad(f).pad(g).pad(p), t()), s.translateChildren(i.x1 - r.x1 + p.left + g + f.left, i.y1 - r.y1 + p.top + g + f.top), o = 0; m.length > o; o++) a = m[o], a.reflow(a.box) }, align: function(e, t, n) { this.box.align(e, t, n) }, hasBox: function() { var e = this.options; return e.border.width || e.background }, createVisual: function() { A.fn.createVisual.call(this); var e = this.options; e.visible && this.hasBox() && this.visual.append(X.Path.fromRect(this.paddingBox.toRect(), this.visualStyle())) }, visualStyle: function() { var e = this, t = e.options, n = t.border || {}; return { stroke: { width: n.width, color: n.color, opacity: Y(n.opacity, t.opacity), dashType: n.dashType }, fill: { color: t.background, opacity: t.opacity }, cursor: t.cursor } } }), P = A.extend({ init: function(e, t) { var n = this; A.fn.init.call(n, t), n.content = e, n.reflow(C()) }, options: { font: gt, color: lt, align: Tt, vAlign: "" }, reflow: function(e) { var t, n = this, i = n.options; t = i.size = Z(n.content, { font: i.font }), n.baseline = t.baseline, n.box = C(e.x1, e.y1, e.x1 + t.width, e.y1 + t.height) }, createVisual: function() { var e = this.options; this.visual = new X.Text(this.content, this.box.toRect().topLeft(), { font: e.font, fill: { color: e.color, opacity: e.opacity }, cursor: e.cursor }) } }), M = A.extend({ init: function(e) { A.fn.init.call(this, e), this._initDirection() }, _initDirection: function() { var e = this.options; e.vertical ? (this.groupAxis = Ot, this.elementAxis = Vt, this.groupSizeField = Lt, this.elementSizeField = kt, this.groupSpacing = e.spacing, this.elementSpacing = e.vSpacing) : (this.groupAxis = Vt, this.elementAxis = Ot, this.groupSizeField = kt, this.elementSizeField = Lt, this.groupSpacing = e.vSpacing, this.elementSpacing = e.spacing) }, options: { vertical: !0, wrap: !0, vSpacing: 0, spacing: 0 }, reflow: function(e) { this.box = e.clone(), this.reflowChildren() }, reflowChildren: function() { var e, t, n, i, r, o, a, s, l, c, d = this, u = d.box, h = d.elementAxis, p = d.groupAxis, f = d.elementSizeField, g = d.groupSizeField, m = d.groupOptions(), v = m.groups, _ = v.length, w = u[p + 1] + d.alignStart(m.groupsSize, u[g]()), b = w; if (_) { for (a = 0; _ > a; a++) { for (n = v[a], i = n.groupElements, r = i.length, e = u[h + 1], o = 0; r > o; o++) s = i[o], c = d.elementSize(s), t = b + d.alignStart(c[g], n.groupSize), l = C(), l[p + 1] = t, l[p + 2] = t + c[g], l[h + 1] = e, l[h + 2] = e + c[f], s.reflow(l), e += c[f] + d.elementSpacing; b += n.groupSize + d.groupSpacing } u[p + 1] = w, u[p + 2] = w + m.groupsSize, u[h + 2] = u[h + 1] + m.maxGroupElementsSize } }, alignStart: function(e, t) { var n = 0, i = this.options.align; return i == Rt || i == ct ? n = t - e : i == dt && (n = (t - e) / 2), n }, groupOptions: function() { var e, t, n = this, i = n.box, r = n.children, o = r.length, a = this.elementSizeField, s = this.groupSizeField, l = this.elementSpacing, c = this.groupSpacing, d = u(i[a]()), h = 0, p = 0, f = 0, g = 0, m = [], v = [], _ = 0; for (h = 0; o > h; h++) t = r[h], t.box || t.reflow(i), e = this.elementSize(t), n.options.wrap && u(f + l + e[a]) > d && (m.push({ groupElements: v, groupSize: p, groupElementsSize: f }), _ = ot.max(_, f), g += c + p, p = 0, f = 0, v = []), p = ot.max(p, e[s]), f > 0 && (f += l), f += e[a], v.push(t); return m.push({ groupElements: v, groupSize: p, groupElementsSize: f }), _ = ot.max(_, f), g += p, { groups: m, groupsSize: g, maxGroupElementsSize: _ } }, elementSize: function(e) { return { width: e.box.width(), height: e.box.height() } }, createVisual: tt }), z = I.extend({ ROWS_SPLIT_REGEX: /\n|\\n/m, init: function(e, t) { var n = this; n.content = e, I.fn.init.call(n, t), n._initContainer(), n.reflow(C()) }, _initContainer: function() { { var e, t, n = this, i = n.options, r = (n.content + "").split(n.ROWS_SPLIT_REGEX), o = new M({ vertical: !0, align: i.align, wrap: !1 }), a = at({}, i, { opacity: 1, animation: null }); n.hasBox() } for (n.container = o, n.append(o), t = 0; r.length > t; t++) e = new P(rt(r[t]), a), o.append(e) }, reflow: function(e) { var t, i, r, o = this.options, a = o.visual; this.container.options.align = o.align, a && !this._boxReflow ? (e.hasSize() || (this._boxReflow = !0, this.reflow(e), this._boxReflow = !1, e = this.box), this.visual = a(this.visualContext(e)), t = e, this.visual && (t = x(this.visual.clippedBBox() || new K.Rect), this.visual.options.zIndex = o.zIndex, this.visual.options.noclip = o.noclip), this.box = this.contentBox = this.paddingBox = t) : (I.fn.reflow.call(this, e), o.rotation && (i = n(o.margin), r = this.box.unpad(i), this.targetBox = e, this.normalBox = r.clone(), r = this.rotate(), r.translate(i.left - i.right, i.top - i.bottom), this.rotatedBox = r.clone(), r.pad(i))) }, createVisual: function() { var e, t = this.options; t.visible && (this.visual = new Q.drawing.Group({ transform: this.rotationTransform(), zIndex: t.zIndex, noclip: t.noclip }), this.hasBox() && (e = X.Path.fromRect(this.paddingBox.toRect(), this.visualStyle()), this.visual.append(e))) }, renderVisual: function() { this.options.visual ? (this.addVisual(), this.createAnimation()) : I.fn.renderVisual.call(this) }, visualOptions: function() { var e = this.options; return { background: e.background, border: e.border, color: e.color, font: e.font, margin: e.margin, padding: e.padding, visible: e.visible } }, visualContext: function(e) { var t = this; return { text: t.content, rect: e.toRect(), options: t.visualOptions(), createVisual: function() { return t._boxReflow = !0, t.reflow(e), t._boxReflow = !1, t.getDefaultVisual() } } }, getDefaultVisual: function() { this.createVisual(), this.renderChildren(); var e = this.visual; return delete this.visual, e }, rotate: function() { var e = this.options; return this.box.rotate(e.rotation), this.align(this.targetBox, Ot, e.align), this.align(this.targetBox, Vt, e.vAlign), this.box }, rotationTransform: function() { var e, t, n, i, r = this.options.rotation; return r ? (e = this.normalBox.center(), t = e.x, n = e.y, i = this.rotatedBox.center(), K.transform().translate(i.x - t, i.y - n).rotate(r, [t, n])) : null } }), F = A.extend({ init: function(e) { var t = this; A.fn.init.call(t, e), e = t.options, t.append(new z(e.text, at({}, e, { vAlign: e.position }))) }, options: { color: lt, position: Ht, align: dt, margin: n(5), padding: n(5) }, reflow: function(e) { var t = this; A.fn.reflow.call(t, e), t.box.snapTo(e, Ot) } }), F.buildTitle = function(e, t, n) { var i; return "string" == typeof e && (e = { text: e }), e = at({ visible: !0 }, n, e), e && e.visible && e.text && (i = new F(e), t.append(i)), i }, R = z.extend({ init: function(e, t, n, i, r) { var o = this; o.text = t, o.value = e, o.index = n, o.dataItem = i, z.fn.init.call(o, t, r) }, visualContext: function(e) { var t = z.fn.visualContext.call(this, e); return t.value = this.value, t.dataItem = this.dataItem, t.format = this.options.format, t.culture = this.options.culture, t }, click: function(t, n) { var i = this; t.trigger(st, { element: e(n.target), value: i.value, text: i.text, index: i.index, dataItem: i.dataItem, axis: i.parent.options }) }, rotate: function() { var e, t; return this.options.alignRotation != dt ? (e = this.normalBox.toRect(), t = this.rotationTransform(), this.box = x(e.bbox(t.matrix()))) : z.fn.rotate.call(this), this.box }, rotationTransform: function() { var e, t, n, i, r, o, a, s, l, c, d, h, p, f, g, m, v, _, w = this.options, b = w.rotation; return b ? w.alignRotation == dt ? z.fn.rotationTransform.call(this) : (e = K.transform().rotate(b).matrix(), t = this.normalBox.toRect(), n = this.targetBox.toRect(), i = w.rotationOrigin || Ht, r = i == Ht || i == ct ? Ot : Vt, o = i == Ht || i == ct ? Vt : Ot, a = i == Ht || i == Tt ? n.origin : n.bottomRight(), s = t.topLeft().transformCopy(e), l = t.topRight().transformCopy(e), c = t.bottomRight().transformCopy(e), d = t.bottomLeft().transformCopy(e), h = K.Rect.fromPoints(s, l, c, d), p = {}, p[o] = n.origin[o] - h.origin[o], f = ot.abs(s[o] + p[o] - a[o]), g = ot.abs(l[o] + p[o] - a[o]), u(f, _t) === u(g, _t) ? (m = s, v = l) : f > g ? (m = l, v = c) : (m = s, v = d), _ = m[r] + (v[r] - m[r]) / 2, p[r] = n.center()[r] - _, K.transform().translate(p.x, p.y).rotate(b)) : null } }), H = A.extend({ init: function(e) { var t = this; A.fn.init.call(t, e), t.options.visible || (t.options = at({}, t.options, { labels: { visible: !1 }, line: { visible: !1 }, margin: 0, majorTickSize: 0, minorTickSize: 0 })), t.options.minorTicks = at({}, { color: t.options.line.color, width: t.options.line.width, visible: t.options.minorTickType != It }, t.options.minorTicks, { size: t.options.minorTickSize, align: t.options.minorTickType }), t.options.majorTicks = at({}, { color: t.options.line.color, width: t.options.line.width, visible: t.options.majorTickType != It }, t.options.majorTicks, { size: t.options.majorTickSize, align: t.options.majorTickType }), this.options._deferLabels || t.createLabels(), t.createTitle(), t.createNotes() }, options: { labels: { visible: !0, rotation: 0, mirror: !1, step: 1, skip: 0 }, line: { width: 1, color: lt, visible: !0 }, title: { visible: !0, position: dt }, majorTicks: { align: zt, size: 4, skip: 0, step: 1 }, minorTicks: { align: zt, size: 3, skip: 0, step: 1 }, axisCrossingValue: 0, majorTickType: zt, minorTickType: It, majorGridLines: { skip: 0, step: 1 }, minorGridLines: { visible: !1, width: 1, color: lt, skip: 0, step: 1 }, margin: 5, visible: !0, reverse: !1, justified: !0, notes: { label: { text: "" } }, _alignLines: !0, _deferLabels: !1 }, createLabels: function() { var t, n, i, r, o = this, a = o.options, s = a.vertical ? Rt : dt, l = at({}, a.labels, { align: s, zIndex: a.zIndex }), c = ot.max(1, l.step); if (o.children = e.grep(o.children, function(e) { return !(e instanceof R) }), o.labels = [], l.visible) for (t = o.labelsCount(), n = l.rotation, it(n) && (l.alignRotation = n.align, l.rotation = n.angle), "auto" == l.rotation && (l.rotation = 0, a.autoRotateLabels = !0), r = l.skip; t > r; r += c) i = o.createAxisLabel(r, l), i && (o.append(i), o.labels.push(i)) }, lineBox: function() { var e = this, t = e.options, n = e.box, i = t.vertical, r = t.labels.mirror, o = r ? n.x1 : n.x2, a = r ? n.y2 : n.y1, s = t.line.width || 0; return i ? C(o, n.y1, o, n.y2 - s) : C(n.x1, a, n.x2 - s, a) }, createTitle: function() { var e, t = this, n = t.options, i = at({ rotation: n.vertical ? -90 : 0, text: "", zIndex: 1, visualSize: !0 }, n.title); i.visible && i.text && (e = new z(i.text, i), t.append(e), t.title = e) }, createNotes: function() { var e, t, n, i = this, r = i.options, o = r.notes, a = o.data || []; for (i.notes = [], e = 0; a.length > e; e++) t = at({}, o, a[e]), t.value = i.parseNoteValue(t.value), n = new B(t.value, t.label.text, null, null, null, t), n.options.visible && (q(n.options.position) ? r.vertical && !l(n.options.position, [Tt, Rt]) ? n.options.position = r.reverse ? Tt : Rt : r.vertical || l(n.options.position, [Ht, ct]) || (n.options.position = r.reverse ? ct : Ht) : n.options.position = r.vertical ? r.reverse ? Tt : Rt : r.reverse ? ct : Ht, i.append(n), i.notes.push(n)) }, parseNoteValue: function(e) { return e }, renderVisual: function() { A.fn.renderVisual.call(this), this.createPlotBands() }, createVisual: function() { A.fn.createVisual.call(this), this.createBackground(), this.createLine() }, gridLinesVisual: function() { var e = this._gridLines; return e || (e = this._gridLines = new X.Group({ zIndex: -2 }), this.appendVisual(this._gridLines)), e }, createTicks: function(e) { function t(t, n, r) { var s, c = t.length; if (n.visible) for (s = n.skip; c > s; s += n.step) q(r) && s % r === 0 || (l.tickX = a ? o.x2 : o.x2 - n.size, l.tickY = a ? o.y1 - n.size : o.y1, l.position = t[s], e.append(i(l, n))) } var n = this, r = n.options, o = n.lineBox(), a = r.labels.mirror, s = r.majorTicks.visible ? r.majorUnit : 0, l = { vertical: r.vertical }; t(n.getMajorTickPositions(), r.majorTicks), t(n.getMinorTickPositions(), r.minorTicks, s / r.minorUnit) }, createLine: function() { var e, t, n = this, i = n.options, r = i.line, o = n.lineBox(); r.width > 0 && r.visible && (e = new X.Path({ stroke: { width: r.width, color: r.color, dashType: r.dashType } }), e.moveTo(o.x1, o.y1).lineTo(o.x2, o.y2), i._alignLines && y(e), t = this._lineGroup = new X.Group, t.append(e), this.visual.append(t), this.createTicks(t)) }, getActualTickSize: function() { var e = this, t = e.options, n = 0; return t.majorTicks.visible && t.minorTicks.visible ? n = ot.max(t.majorTicks.size, t.minorTicks.size) : t.majorTicks.visible ? n = t.majorTicks.size : t.minorTicks.visible && (n = t.minorTicks.size), n }, createBackground: function() { var e = this, t = e.options, n = t.background, i = e.box; n && (e._backgroundPath = X.Path.fromRect(i.toRect(), { fill: { color: n }, stroke: null }), this.visual.append(e._backgroundPath)) }, createPlotBands: function() { var t, n, i, r, o, a, s, l = this, c = l.options, d = c.plotBands || [], u = c.vertical, h = l.plotArea; 0 !== d.length && (o = this._plotbandGroup = new X.Group({ zIndex: -1 }), a = e.grep(l.pane.axes, function(e) { return e.options.vertical !== l.options.vertical })[0], s = this.range(), e.each(d, function(e, s) { var c, d, p; i = Y(s.from, Et), r = Y(s.to, At), c = [], u ? (t = (a || h.axisX).lineBox(), n = l.getSlot(s.from, s.to, !0)) : (t = l.getSlot(s.from, s.to, !0), n = (a || h.axisY).lineBox()), 0 !== t.width() && 0 !== n.height() && (d = new K.Rect([t.x1, n.y1], [t.width(), n.height()]), p = X.Path.fromRect(d, { fill: { color: s.color, opacity: s.opacity }, stroke: null }), o.append(p)) }), l.appendVisual(o)) }, createGridLines: function(e) { function t(e, t, i) { var o, s = e.length; if (t.visible) for (o = t.skip; s > o; o += t.step) n = u(e[o]), l(n, g) || o % i === 0 || a && p === n || (f.position = n, m.append(r(f, t)), g.push(n)) } var n, i = this, o = i.options, a = e.options.line.visible, s = o.majorGridLines, c = s.visible ? o.majorUnit : 0, d = o.vertical, h = e.lineBox(), p = h[d ? "y1" : "x1"], f = { lineStart: h[d ? "x1" : "y1"], lineEnd: h[d ? "x2" : "y2"], vertical: d }, g = [], m = this.gridLinesVisual(); return t(i.getMajorTickPositions(), o.majorGridLines), t(i.getMinorTickPositions(), o.minorGridLines, c / o.minorUnit), m.children }, reflow: function(e) { var t, n, i = this, r = i.options, o = r.vertical, a = i.labels, s = a.length, l = i.title, c = o ? Lt : kt, d = l ? l.box[c]() : 0, u = i.getActualTickSize() + r.margin + d, h = 0, p = (this.getRoot() || {}).box || e, f = p[c](); for (n = 0; s > n; n++) t = a[n].box[c](), f >= t + u && (h = ot.max(h, t)); i.box = o ? C(e.x1, e.y1, e.x1 + h + u, e.y2) : C(e.x1, e.y1, e.x2, e.y1 + h + u), i.arrangeTitle(), i.arrangeLabels(), i.arrangeNotes() }, arrangeLabels: function() { var e, t, n, i, r, o, a, s, l, c, d, u = this, h = u.options, p = u.labels, f = !h.justified, g = h.vertical, m = u.lineBox(), v = h.labels.mirror, _ = u.getMajorTickPositions(), w = u.getActualTickSize() + h.margin; for (n = 0; p.length > n; n++) i = p[n], r = i.index, o = g ? i.box.height() : i.box.width(), a = _[r] - o / 2, g ? (f && (s = _[r], l = _[r + 1], c = s + (l - s) / 2, a = c - o / 2), d = m.x2, v ? (d += w, i.options.rotationOrigin = Tt) : (d -= w + i.box.width(), i.options.rotationOrigin = Rt), e = i.box.move(d, a)) : (f ? (s = _[r], l = _[r + 1]) : (s = a, l = a + o), t = m.y1, v ? (t -= w + i.box.height(), i.options.rotationOrigin = ct) : (t += w, i.options.rotationOrigin = Ht), e = C(s, t, l, t + i.box.height())), i.reflow(e) }, autoRotateLabels: function() { var e, t, n, i, r, o; if (this.options.autoRotateLabels && !this.options.vertical) { for (e = this.getMajorTickPositions(), t = this.labels, o = 0; t.length > o; o++) { if (r = e[o + 1] - e[o], n = t[o].box, n.height() > r) { i = -90; break } n.width() > r && (i = -45) } if (i) { for (o = 0; t.length > o; o++) t[o].options.rotation = i, t[o].reflow(C()); return !0 } } }, arrangeTitle: function() { var e = this, t = e.options, n = t.labels.mirror, i = t.vertical, r = e.title; r && (i ? (r.options.align = n ? Rt : Tt, r.options.vAlign = r.options.position) : (r.options.align = r.options.position, r.options.vAlign = n ? Ht : ct), r.reflow(e.box)) }, arrangeNotes: function() { var e, t, n, i, r = this; for (e = 0; r.notes.length > e; e++) t = r.notes[e], i = t.options.value, q(i) ? (r.shouldRenderNote(i) ? t.show() : t.hide(), n = r.getSlot(i)) : t.hide(), t.reflow(n || r.lineBox()) }, alignTo: function(e) { var t = this, n = e.lineBox(), i = t.options.vertical, r = i ? Vt : Ot; t.box.snapTo(n, r), i ? t.box.shrink(0, t.lineBox().height() - n.height()) : t.box.shrink(t.lineBox().width() - n.width(), 0), t.box[r + 1] -= t.lineBox()[r + 1] - n[r + 1], t.box[r + 2] -= t.lineBox()[r + 2] - n[r + 2] }, axisLabelText: function(e, t, n) { var i, r = e; return n.template ? (i = et(n.template), r = i({ value: e, dataItem: t, format: n.format, culture: n.culture })) : n.format && (r = n.format.match(yt) ? W.format(n.format, e) : W.toString(e, n.format, n.culture)), r }, slot: function(e, n) { var i = this.getSlot(e, n); return i ? i.toRect() : t }, contentBox: function() { var e = this.box.clone(); return this.labels.length && e.wrap(this.labels[0].box).wrap($(this.labels).box), e } }), B = I.extend({ init: function(e, t, n, i, r, o) { var a = this; I.fn.init.call(a, o), a.value = e, a.text = t, a.dataItem = n, a.category = i, a.series = r, a.render() }, options: { icon: { visible: !0, type: pt }, label: { position: St, visible: !0, align: dt, vAlign: dt }, line: { visible: !0 }, visible: !0, position: Ht, zIndex: 2 }, hide: function() { this.options.visible = !1 }, show: function() { this.options.visible = !0 }, render: function() { var e, t, n, i, r = this, o = r.options, a = o.label, s = r.text, l = o.icon, c = l.size, d = C(); o.visible && (q(a) && a.visible && (a.template ? (i = et(a.template), s = i({ dataItem: r.dataItem, category: r.category, value: r.value, text: s, series: r.series })) : a.format && (s = m(a.format, s)), r.label = new z(s, at({}, a)), a.position !== St || q(c) || (l.type === pt ? c = ot.max(r.label.box.width(), r.label.box.height()) : (t = r.label.box.width(), n = r.label.box.height()), d.wrap(r.label.box))), l.width = t || c || vt, l.height = n || c || vt, e = new L(at({}, l)), r.marker = e, r.append(e), r.label && r.append(r.label), e.reflow(C()), r.wrapperBox = d.wrap(e.box)) }, reflow: function(e) { var t, n, i, r = this, o = r.options, a = e.center(), s = r.wrapperBox, c = o.line.length, d = o.position, u = r.label, h = r.marker; o.visible && (l(d, [Tt, Rt]) ? d === Tt ? (i = s.alignTo(e, d).translate(-c, e.center().y - s.center().y), o.line.visible && (t = [ot.floor(e.x1), a.y], r.linePoints = [t, [ot.floor(i.x2), a.y]], n = i.clone().wrapPoint(t))) : (i = s.alignTo(e, d).translate(c, e.center().y - s.center().y), o.line.visible && (t = [ot.floor(e.x2), a.y], r.linePoints = [t, [ot.floor(i.x1), a.y]], n = i.clone().wrapPoint(t))) : d === ct ? (i = s.alignTo(e, d).translate(e.center().x - s.center().x, c), o.line.visible && (t = [ot.floor(a.x), ot.floor(e.y2)], r.linePoints = [t, [ot.floor(a.x), ot.floor(i.y1)]], n = i.clone().wrapPoint(t))) : (i = s.alignTo(e, d).translate(e.center().x - s.center().x, -c), o.line.visible && (t = [ot.floor(a.x), ot.floor(e.y1)], r.linePoints = [t, [ot.floor(a.x), ot.floor(i.y2)]], n = i.clone().wrapPoint(t))), h && h.reflow(i), u && (u.reflow(i), h && (o.label.position === zt && u.box.alignTo(h.box, d), u.reflow(u.box))), r.contentBox = i, r.targetBox = e, r.box = n || i) }, createVisual: function() { I.fn.createVisual.call(this), this.options.visible && this.createLine() }, renderVisual: function() { var e, t = this, n = t.options, i = n.visual; n.visible && i ? (e = t.targetPoint, t.visual = i({ dataItem: t.dataItem, category: t.category, value: t.value, text: t.text, series: t.series, rect: t.targetBox.toRect(), options: { background: n.background, border: n.background, icon: n.icon, label: n.label, line: n.line, position: n.position, visible: n.visible }, createVisual: function() { t.createVisual(), t.renderChildren(); var e = t.visual; return delete t.visual, e } }), t.addVisual()) : I.fn.renderVisual.call(t) }, createLine: function() { var e, t = this.options.line; this.linePoints && (e = X.Path.fromPoints(this.linePoints, { stroke: { color: t.color, width: t.width, dashType: t.dashType } }), y(e), this.visual.append(e)) }, click: function(e, t) { var n = this.eventArgs(t); e.trigger(Pt, n) || t.preventDefault() }, hover: function(e, t) { var n = this.eventArgs(t); e.trigger(Mt, n) || t.preventDefault() }, leave: function(e) { e._unsetActivePoint() }, eventArgs: function(t) { var n = this, i = n.options; return { element: e(t.target), text: q(i.label) ? i.label.text : "", dataItem: n.dataItem, series: n.series, value: n.value, category: n.category } } }), L = I.extend({ init: function(e, t) { this.pointData = t, I.fn.init.call(this, e) }, options: { type: pt, align: dt, vAlign: dt }, getElement: function() { var e, t, n = this, i = n.options, r = i.type, o = i.rotation, a = n.paddingBox, s = a.center(), l = a.width() / 2; if (i.visible && n.hasBox()) return t = n.visualStyle(), r === pt ? e = new X.Circle(new K.Circle([u(a.x1 + l, ut), u(a.y1 + a.height() / 2, ut)], l), t) : r === Bt ? e = X.Path.fromPoints([ [a.x1 + l, a.y1], [a.x1, a.y2], [a.x2, a.y2] ], t).close() : r === ft ? (e = new X.MultiPath(t), e.moveTo(a.x1, a.y1).lineTo(a.x2, a.y2), e.moveTo(a.x1, a.y2).lineTo(a.x2, a.y1)) : e = X.Path.fromRect(a.toRect(), t), o && e.transform(K.transform().rotate(-o, [s.x, s.y])), e.options.zIndex = this.options.zIndex, e }, createElement: function() { var e, t = this, n = t.options.visual, i = t.pointData || {}; return e = n ? n({ value: i.value, dataItem: i.dataItem, series: i.series, category: i.category, rect: t.paddingBox.toRect(), options: t.visualOptions(), createVisual: function() { return t.getElement() } }) : t.getElement() }, visualOptions: function() { var e = this.options; return { background: e.background, border: e.border, margin: e.margin, padding: e.padding, type: e.type, size: e.width, visible: e.visible } }, createVisual: function() { this.visual = this.createElement() } }), N = H.extend({ init: function(e, t, n) { var i = this, r = i.initDefaults(e, t, n); H.fn.init.call(i, r) }, startValue: function() { return 0 }, options: { type: "numeric", min: 0, max: 1, vertical: !0, majorGridLines: { visible: !0, width: 1, color: lt }, labels: { format: "#.####################" }, zIndex: 1 }, initDefaults: function(e, t, n) { var i, r = this, a = n.narrowRange, s = r.autoAxisMin(e, t, a), l = r.autoAxisMax(e, t, a), u = o(s, l), h = { majorUnit: u }; return n.roundToMajorUnit !== !1 && (0 > s && p(s, u, 1 / 3) && (s -= u), l > 0 && p(l, u, 1 / 3) && (l += u)), h.min = d(s, u), h.max = c(l, u), n && (i = q(n.min) || q(n.max), i && n.min === n.max && (n.min > 0 ? n.min = 0 : n.max = 1), n.majorUnit ? (h.min = d(h.min, n.majorUnit), h.max = c(h.max, n.majorUnit)) : i && (n = at(h, n), h.majorUnit = o(n.min, n.max))), h.minorUnit = (n.majorUnit || h.majorUnit) / 5, at(h, n) }, range: function() { var e = this.options; return { min: e.min, max: e.max } }, autoAxisMax: function(e, t, n) { var i, r; if (!e && !t) return 1; if (0 >= e && 0 >= t) { if (t = e == t ? 0 : t, r = ot.abs((t - e) / t), n === !1 || !n && r > Ut) return 0; i = ot.min(0, t - (e - t) / 2) } else e = e == t ? 0 : e, i = t; return i }, autoAxisMin: function(e, t, n) { var i, r; if (!e && !t) return 0; if (e >= 0 && t >= 0) { if (e = e == t ? 0 : e, r = (t - e) / t, n === !1 || !n && r > Ut) return 0; i = ot.max(0, e - (t - e) / 2) } else t = e == t ? 0 : t, i = e; return i }, getDivisions: function(e) { if (0 === e) return 1; var t = this.options, n = t.max - t.min; return ot.floor(u(n / e, ut)) + 1 }, getTickPositions: function(e, t) { var n, i = this, r = i.options, o = r.vertical, a = r.reverse, s = i.lineBox(), l = o ? s.height() : s.width(), c = r.max - r.min, d = l / c, h = e * d, p = 0, f = i.getDivisions(e), g = (o ? -1 : 1) * (a ? -1 : 1), m = 1 === g ? 1 : 2, v = s[(o ? Vt : Ot) + m], _ = []; for (t && (p = t / e), n = 0; f > n; n++) n % p !== 0 && _.push(u(v, ut)), v += h * g; return _ }, getMajorTickPositions: function() { var e = this; return e.getTickPositions(e.options.majorUnit) }, getMinorTickPositions: function() { var e = this; return e.getTickPositions(e.options.minorUnit) }, getSlot: function(e, t, n) { var i, r, o = this, a = o.options, s = a.reverse, l = a.vertical, c = l ? Vt : Ot, d = o.lineBox(), u = d[c + (s ? 2 : 1)], h = l ? d.height() : d.width(), p = s ? -1 : 1, f = p * (h / (a.max - a.min)), g = new C(d.x1, d.y1, d.x1, d.y1); return q(e) || (e = t || 0), q(t) || (t = e || 0), n && (e = ot.max(ot.min(e, a.max), a.min), t = ot.max(ot.min(t, a.max), a.min)), l ? (i = a.max - ot.max(e, t), r = a.max - ot.min(e, t)) : (i = ot.min(e, t) - a.min, r = ot.max(e, t) - a.min), g[c + 1] = ot.max(ot.min(u + f * (s ? r : i), xt), -xt), g[c + 2] = ot.max(ot.min(u + f * (s ? i : r), xt), -xt), g }, getValue: function(e) { var t, n = this, i = n.options, r = i.reverse, o = i.vertical, a = 1 * i.max, s = 1 * i.min, l = o ? Vt : Ot, c = n.lineBox(), d = c[l + (r ? 2 : 1)], h = o ? c.height() : c.width(), p = r ? -1 : 1, f = p * (e[l] - d), g = (a - s) / h, m = f * g; return 0 > f || f > h ? null : (t = o ? a - m : s + m, u(t, _t)) }, translateRange: function(e) { var t = this, n = t.options, i = t.lineBox(), r = n.vertical, o = n.reverse, a = r ? i.height() : i.width(), s = n.max - n.min, l = a / s, c = u(e / l, _t); return !r && !o || r && o || (c = -c), { min: n.min + c, max: n.max + c } }, scaleRange: function(e) { var t = this, n = t.options, i = -e * n.majorUnit; return { min: n.min - i, max: n.max + i } }, labelsCount: function() { return this.getDivisions(this.options.majorUnit) }, createAxisLabel: function(e, t) { var n = this, i = n.options, r = u(i.min + e * i.majorUnit, _t), o = n.axisLabelText(r, null, t); return new R(r, o, e, null, t) }, shouldRenderNote: function(e) { var t = this.range(); return e >= t.min && t.max >= e } }), O = H.extend({ init: function(e, t, n) { this.options = this._initOptions(e, t, n), H.fn.init.call(this, n) }, startValue: function() { return this.options.min }, options: { type: "log", majorUnit: 10, minorUnit: 1, axisCrossingValue: 1, vertical: !0, majorGridLines: { visible: !0, width: 1, color: lt }, zIndex: 1 }, getSlot: function(e, n, i) { var r, o, a = this, s = a.options, l = s.reverse, c = s.vertical, d = c ? Vt : Ot, u = a.lineBox(), p = u[d + (l ? 2 : 1)], f = c ? u.height() : u.width(), g = l ? -1 : 1, m = s.majorUnit, v = a.logMin, _ = a.logMax, w = g * (f / (_ - v)), b = new C(u.x1, u.y1, u.x1, u.y1); return q(e) || (e = n || 1), q(n) || (n = e || 1), 0 >= e || 0 >= n ? t : (i && (e = ot.max(ot.min(e, s.max), s.min), n = ot.max(ot.min(n, s.max), s.min)), e = h(e, m), n = h(n, m), c ? (r = _ - ot.max(e, n), o = _ - ot.min(e, n)) : (r = ot.min(e, n) - v, o = ot.max(e, n) - v), b[d + 1] = p + w * (l ? o : r), b[d + 2] = p + w * (l ? r : o), b) }, getValue: function(e) { var t, n = this, i = n.options, r = i.reverse, o = i.vertical, a = n.lineBox(), s = i.majorUnit, l = n.logMin, c = n.logMax, d = o === r ? 1 : -1, h = 1 === d ? 1 : 2, p = o ? a.height() : a.width(), f = (c - l) / p, g = o ? Vt : Ot, m = a[g + h], v = d * (e[g] - m), _ = v * f; return 0 > v || v > p ? null : (t = l + _, u(ot.pow(s, t), _t)) }, range: function() { var e = this.options; return { min: e.min, max: e.max } }, scaleRange: function(e) { var t = this, n = t.options, i = n.majorUnit, r = -e; return { min: ot.pow(i, t.logMin - r), max: ot.pow(i, t.logMax + r) } }, translateRange: function(e) { var t = this, n = t.options, i = n.majorUnit, r = t.lineBox(), o = n.vertical, a = n.reverse, s = o ? r.height() : r.width(), l = s / (t.logMax - t.logMin), c = u(e / l, _t); return !o && !a || o && a || (c = -c), { min: ot.pow(i, t.logMin + c), max: ot.pow(i, t.logMax + c) } }, labelsCount: function() { var e = this, t = ot.floor(e.logMax), n = ot.floor(t - e.logMin) + 1; return n }, getMajorTickPositions: function() { var e = this, t = []; return e.traverseMajorTicksPositions(function(e) { t.push(e) }, { step: 1, skip: 0 }), t }, createTicks: function(e) { function t(t, n) { d.tickX = s ? a.x2 : a.x2 - n.size, d.tickY = s ? a.y1 - n.size : a.y1, d.position = t, e.append(i(d, n)) } var n = this, r = [], o = n.options, a = n.lineBox(), s = o.labels.mirror, l = o.majorTicks, c = o.minorTicks, d = { vertical: o.vertical }; return l.visible && n.traverseMajorTicksPositions(t, l), c.visible && n.traverseMinorTicksPositions(t, c), r }, createGridLines: function(e) { function t(e, t) { l(e, u) || (d.position = e, h.append(r(d, t)), u.push(e)) } var n = this, i = n.options, o = i.majorGridLines, a = i.minorGridLines, s = i.vertical, c = e.lineBox(), d = { lineStart: c[s ? "x1" : "y1"], lineEnd: c[s ? "x2" : "y2"], vertical: s }, u = [], h = this.gridLinesVisual(); return o.visible && n.traverseMajorTicksPositions(t, o), a.visible && n.traverseMinorTicksPositions(t, a), h.children }, traverseMajorTicksPositions: function(e, t) { var n, i, r = this, o = r._lineOptions(), a = o.lineStart, s = o.step, l = r.logMin, c = r.logMax; for (n = ot.ceil(l) + t.skip; c >= n; n += t.step) i = u(a + s * (n - l), _t), e(i, t) }, traverseMinorTicksPositions: function(e, t) { var n, i, r, o, a, s = this, l = s.options, c = s._lineOptions(), d = c.lineStart, p = c.step, f = l.majorUnit, g = s.logMin, m = s.logMax, v = ot.floor(g), _ = l.max, w = l.min, b = l.minorUnit; for (n = v; m > n; n++) for (o = s._minorIntervalOptions(n), a = t.skip; b > a && (i = o.value + a * o.minorStep, !(i > _)); a += t.step) i >= w && (r = u(d + p * (h(i, f) - g), _t), e(r, t)) }, createAxisLabel: function(e, t) { var n = this, i = n.options, r = ot.ceil(n.logMin + e), o = Math.pow(i.majorUnit, r), a = n.axisLabelText(o, null, t); return new R(o, a, e, null, t) }, shouldRenderNote: function(e) { var t = this.range(); return e >= t.min && t.max >= e }, _throwNegativeValuesError: function() { throw Error("Non positive values cannot be used for a logarithmic axis") }, _initOptions: function(e, t, n) { var i, r = this, o = at({}, r.options, { min: e, max: t }, n), a = o.min, s = o.max, l = o.majorUnit; return 0 >= o.axisCrossingValue && r._throwNegativeValuesError(), q(n.max) ? 0 >= n.max && r._throwNegativeValuesError() : (i = u(h(s, l), _t) % 1, s = 0 >= s ? l : 0 !== i && (.3 > i || i > .9) ? ot.pow(l, h(s, l) + .2) : ot.pow(l, ot.ceil(h(s, l)))), q(n.min) ? 0 >= n.min && r._throwNegativeValuesError() : 0 >= a ? a = 1 >= s ? ot.pow(l, -2) : 1 : n.narrowRange || (a = ot.pow(l, ot.floor(h(a, l)))), r.logMin = u(h(a, l), _t), r.logMax = u(h(s, l), _t), o.max = s, o.min = a, o.minorUnit = n.minorUnit || u(l - 1, _t), o }, _minorIntervalOptions: function(e) { var t = this.options.majorUnit, n = ot.pow(t, e), i = ot.pow(t, e + 1), r = i - n, o = r / this.options.minorUnit; return { value: n, minorStep: o } }, _lineOptions: function() { var e = this, t = e.options, n = t.reverse, i = t.vertical, r = i ? Vt : Ot, o = e.lineBox(), a = i === n ? 1 : -1, s = 1 === a ? 1 : 2, l = i ? o.height() : o.width(), c = a * (l / (e.logMax - e.logMin)), d = o[r + s]; return { step: c, lineStart: d, lineBox: o } } }), Q.Gradients = { glass: { type: Dt, rotation: 0, stops: [{ offset: 0, color: Nt, opacity: 0 }, { offset: .25, color: Nt, opacity: .3 }, { offset: 1, color: Nt, opacity: 0 }] }, sharpBevel: { type: Ft, stops: [{ offset: 0, color: Nt, opacity: .55 }, { offset: .65, color: Nt, opacity: 0 }, { offset: .95, color: Nt, opacity: .25 }] }, roundedBevel: { type: Ft, stops: [{ offset: .33, color: Nt, opacity: .06 }, { offset: .83, color: Nt, opacity: .2 }, { offset: .95, color: Nt, opacity: 0 }] }, roundedGlass: { type: Ft, supportVML: !1, stops: [{ offset: 0, color: Nt, opacity: 0 }, { offset: .5, color: Nt, opacity: .3 }, { offset: .99, color: Nt, opacity: 0 }] }, sharpGlass: { type: Ft, supportVML: !1, stops: [{ offset: 0, color: Nt, opacity: .2 }, { offset: .15, color: Nt, opacity: .15 }, { offset: .17, color: Nt, opacity: .35 }, { offset: .85, color: Nt, opacity: .05 }, { offset: .87, color: Nt, opacity: .15 }, { offset: .99, color: Nt, opacity: 0 }] } }, V = { extend: function(e, t) { if (!e.exportVisual) throw Error("Mixin target has no exportVisual method defined."); e.exportSVG = this.exportSVG, e.exportImage = this.exportImage, e.exportPDF = this.exportPDF, t || (e.svg = this.svg, e.imageDataURL = this.imageDataURL) }, exportSVG: function(e) { return X.exportSVG(this.exportVisual(), e) }, exportImage: function(e) { return X.exportImage(this.exportVisual(), e) }, exportPDF: function(e) { return X.exportPDF(this.exportVisual(), e) }, svg: function() { if (X.svg.Surface) return X.svg._exportGroup(this.exportVisual()); throw Error("SVG Export failed. Unable to export instantiate kendo.drawing.svg.Surface") }, imageDataURL: function() { var t, n, i; if (!W.support.canvas) return null; if (X.canvas.Surface) return t = e("<div />").css({ display: "none", width: this.element.width(), height: this.element.height() }).appendTo(document.body), n = new X.canvas.Surface(t), n.draw(this.exportVisual()), i = n._rootElement.toDataURL(), n.destroy(), t.remove(), i; throw Error("Image Export failed. Unable to export instantiate kendo.drawing.canvas.Surface") } }, U = function(e) { this.closed = e }, U.prototype = U.fn = { WEIGHT: .333, EXTREMUM_ALLOWED_DEVIATION: .01, process: function(e) { var t, n, i, r, o, a, s, l, c, d, u = this, h = u.closed, p = e.slice(0), f = p.length, g = []; if (f > 2 && (u.removeDuplicates(0, p), f = p.length), 2 > f || 2 == f && p[0].equals(p[1])) return g; for (t = p[0], n = p[1], i = p[2], g.push(new X.Segment(t)); t.equals(p[f - 1]);) h = !0, p.pop(), f--; if (2 == f) return s = u.tangent(t, n, Ot, Vt), $(g).controlOut(u.firstControlPoint(s, t, n, Ot, Vt)), g.push(new X.Segment(n, u.secondControlPoint(s, t, n, Ot, Vt))), g; for (h ? (t = p[f - 1], n = p[0], i = p[1], r = u.controlPoints(t, n, i), o = r[1], a = r[0]) : (s = u.tangent(t, n, Ot, Vt), o = u.firstControlPoint(s, t, n, Ot, Vt)), l = o, c = 0; f - 3 >= c; c++) u.removeDuplicates(c, p), f = p.length, f >= c + 3 && (t = p[c], n = p[c + 1], i = p[c + 2], r = u.controlPoints(t, n, i), $(g).controlOut(l), l = r[1], d = r[0], g.push(new X.Segment(n, d))); return h ? (t = p[f - 2], n = p[f - 1], i = p[0], r = u.controlPoints(t, n, i), $(g).controlOut(l), g.push(new X.Segment(n, r[0])), $(g).controlOut(r[1]), g.push(new X.Segment(i, a))) : (s = u.tangent(n, i, Ot, Vt), $(g).controlOut(l), g.push(new X.Segment(i, u.secondControlPoint(s, n, i, Ot, Vt)))), g }, removeDuplicates: function(e, t) { for (; t[e].equals(t[e + 1]) || t[e + 1].equals(t[e + 2]);) t.splice(e + 1, 1) }, invertAxis: function(e, t, n) { var i, r, o = this, a = !1; return e.x === t.x ? a = !0 : t.x === n.x ? (n.y > t.y && t.y >= e.y || t.y > n.y && e.y >= t.y) && (a = !0) : (i = o.lineFunction(e, t), r = o.calculateFunction(i, n.x), t.y >= e.y && r >= n.y || e.y >= t.y && n.y >= r || (a = !0)), a }, isLine: function(e, t, n) { var i = this, r = i.lineFunction(e, t), o = i.calculateFunction(r, n.x); return e.x == t.x && t.x == n.x || u(o, 1) === u(n.y, 1) }, lineFunction: function(e, t) { var n = (t.y - e.y) / (t.x - e.x), i = e.y - n * e.x; return [i, n] }, controlPoints: function(e, t, n) { var i, r, o, a, s, l, c = this, d = Ot, u = Vt, h = !1, p = !1, f = c.EXTREMUM_ALLOWED_DEVIATION; return c.isLine(e, t, n) ? i = c.tangent(e, t, Ot, Vt) : (r = { x: c.isMonotonicByField(e, t, n, Ot), y: c.isMonotonicByField(e, t, n, Vt) }, r.x && r.y ? (i = c.tangent(e, n, Ot, Vt), h = !0) : (c.invertAxis(e, t, n) && (d = Vt, u = Ot), r[d] ? i = 0 : (s = e[u] > n[u] && t[u] >= e[u] || n[u] > e[u] && e[u] >= t[u] ? c.sign((n[u] - e[u]) * (t[d] - e[d])) : -c.sign((n[d] - e[d]) * (t[u] - e[u])), i = f * s, p = !0))), a = c.secondControlPoint(i, e, t, d, u), p && (l = d, d = u, u = l), o = c.firstControlPoint(i, t, n, d, u), h && (c.restrictControlPoint(e, t, a, i), c.restrictControlPoint(t, n, o, i)), [a, o] }, sign: function(e) { return 0 >= e ? -1 : 1 }, restrictControlPoint: function(e, t, n, i) { t.y > e.y ? n.y > t.y ? (n.x = e.x + (t.y - e.y) / i, n.y = t.y) : e.y > n.y && (n.x = t.x - (t.y - e.y) / i, n.y = e.y) : t.y > n.y ? (n.x = e.x - (e.y - t.y) / i, n.y = t.y) : n.y > e.y && (n.x = t.x + (e.y - t.y) / i, n.y = e.y) }, tangent: function(e, t, n, i) { var r, o = t[n] - e[n], a = t[i] - e[i]; return r = 0 === o ? 0 : a / o }, isMonotonicByField: function(e, t, n, i) { return n[i] > t[i] && t[i] > e[i] || t[i] > n[i] && e[i] > t[i] }, firstControlPoint: function(e, t, n, i, r) { var o = this, a = t[i], s = n[i], l = (s - a) * o.WEIGHT; return o.point(a + l, t[r] + l * e, i, r) }, secondControlPoint: function(e, t, n, i, r) { var o = this, a = t[i], s = n[i], l = (s - a) * o.WEIGHT; return o.point(s - l, n[r] - l * e, i, r) }, point: function(e, t, n, i) { var r = new K.Point; return r[n] = e, r[i] = t, r }, calculateFunction: function(e, t) { var n, i = 0, r = e.length; for (n = 0; r > n; n++) i += Math.pow(t, n) * e[n]; return i } }, b._element = document.createElement("span"), at(W.dataviz, { AXIS_LABEL_CLICK: st, COORD_PRECISION: ut, DEFAULT_PRECISION: _t, DEFAULT_WIDTH: wt, DEFAULT_HEIGHT: mt, DEFAULT_FONT: gt, INITIAL_ANIMATION_DURATION: Ct, NOTE_CLICK: Pt, NOTE_HOVER: Mt, CLIP: ht, Axis: H, AxisLabel: R, Box2D: C, BoxElement: I, ChartElement: A, CurveProcessor: U, ExportMixin: V, FloatElement: M, LogarithmicAxis: O, Note: B, NumericAxis: N, Point2D: Wt, Ring: S, RootElement: E, Sector: T, ShapeBuilder: D, ShapeElement: L, Text: P, TextBox: z, Title: F, alignPathToPixel: y, autoFormat: m, autoMajorUnit: o, boxDiff: s, dateComparer: _, decodeEntities: b, getSpacing: n, inArray: l, interpolateValue: f, mwDelta: w, rectToBox: x, rotatePoint: a, round: u, ceil: c, floor: d }) }(window.kendo.jQuery), function(e) { function t(t, n) { return e.map(t, function(e, t) { return [ [e, n[t]] ] }) } var n = window.kendo, i = n.dataviz.ui, r = n.deepExtend, o = 1.5, a = .4, s = "#000", l = "Arial,Helvetica,sans-serif", c = "11px " + l, d = "12px " + l, u = "16px " + l, h = "#fff", p = { title: { font: u }, legend: { labels: { font: d } }, seriesDefaults: { visible: !0, labels: { font: c }, donut: { margin: 1 }, line: { width: 2 }, vericalLine: { width: 2 }, scatterLine: { width: 1 }, area: { opacity: .4, markers: { visible: !1, size: 6 }, highlight: { markers: { border: { color: "#fff", opacity: 1, width: 1 } } }, line: { opacity: 1, width: 0 } }, verticalArea: { opacity: .4, markers: { visible: !1, size: 6 }, line: { opacity: 1, width: 0 } }, radarLine: { width: 2, markers: { visible: !1 } }, radarArea: { opacity: .5, markers: { visible: !1, size: 6 }, line: { opacity: 1, width: 0 } }, candlestick: { line: { width: 1, color: s }, border: { width: 1, _brightness: .8 }, gap: 1, spacing: .3, downColor: h, highlight: { line: { width: 2 }, border: { width: 2, opacity: 1 } } }, ohlc: { line: { width: 1 }, gap: 1, spacing: .3, highlight: { line: { width: 3, opacity: 1 } } }, bubble: { opacity: .6, border: { width: 0 }, labels: { background: "transparent" } }, bar: { gap: o, spacing: a }, column: { gap: o, spacing: a }, rangeColumn: { gap: o, spacing: a }, rangeBar: { gap: o, spacing: a }, waterfall: { gap: .5, spacing: a, line: { width: 1, color: s } }, horizontalWaterfall: { gap: .5, spacing: a, line: { width: 1, color: s } }, bullet: { gap: o, spacing: a, target: { color: "#ff0000" } }, verticalBullet: { gap: o, spacing: a, target: { color: "#ff0000" } }, boxPlot: { outliersField: "", meanField: "", whiskers: { width: 1, color: s }, mean: { width: 1, color: s }, median: { width: 1, color: s }, border: { width: 1, _brightness: .8 }, gap: 1, spacing: .3, downColor: h, highlight: { whiskers: { width: 2 }, border: { width: 2, opacity: 1 } } }, funnel: { labels: { color: "", background: "" } }, notes: { icon: { border: { width: 1 } }, label: { padding: 3, font: d }, line: { length: 10, width: 1 }, visible: !0 } }, categoryAxis: { majorGridLines: { visible: !0 } }, axisDefaults: { labels: { font: d }, title: { font: u, margin: 5 }, crosshair: { tooltip: { font: d } }, notes: { icon: { size: 7, border: { width: 1 } }, label: { padding: 3, font: d }, line: { length: 10, width: 1 }, visible: !0 } }, tooltip: { font: d }, navigator: { pane: { height: 90, margin: { top: 10 } } } }, f = { scale: { labels: { font: d } } }, g = { shapeDefaults: { hover: { opacity: .2 }, stroke: { width: 0 } }, editable: { resize: { handles: { width: 7, height: 7 } } }, selectable: { stroke: { width: 1, dashType: "dot" } }, connectionDefaults: { stroke: { width: 2 }, selection: { handles: { width: 8, height: 8 } }, editable: { tools: ["edit", "delete"] } } }, m = i.themes, v = i.registerTheme = function(e, t) { var n, i = {}; i.chart = r({}, p, t.chart), i.gauge = r({}, f, t.gauge), i.diagram = r({}, g, t.diagram), i.treeMap = r({}, t.treeMap), n = i.chart.seriesDefaults, n.verticalLine = r({}, n.line), n.verticalArea = r({}, n.area), n.polarArea = r({}, n.radarArea), n.polarLine = r({}, n.radarLine), m[e] = i }; v("black", { chart: { title: { color: h }, legend: { labels: { color: h }, inactiveItems: { labels: { color: "#919191" }, markers: { color: "#919191" } } }, seriesDefaults: { labels: { color: h }, errorBars: { color: h }, notes: { icon: { background: "#3b3b3b", border: { color: "#8e8e8e" } }, label: { color: h }, line: { color: "#8e8e8e" } }, pie: { overlay: { gradient: "sharpBevel" } }, donut: { overlay: { gradient: "sharpGlass" } }, line: { markers: { background: "#3d3d3d" } }, scatter: { markers: { background: "#3d3d3d" } }, scatterLine: { markers: { background: "#3d3d3d" } }, waterfall: { line: { color: "#8e8e8e" } }, horizontalWaterfall: { line: { color: "#8e8e8e" } }, candlestick: { downColor: "#555", line: { color: h }, border: { _brightness: 1.5, opacity: 1 }, highlight: { border: { color: h, opacity: .2 } } }, ohlc: { line: { color: h } } }, chartArea: { background: "#3d3d3d" }, seriesColors: ["#0081da", "#3aafff", "#99c900", "#ffeb3d", "#b20753", "#ff4195"], axisDefaults: { line: { color: "#8e8e8e" }, labels: { color: h }, majorGridLines: { color: "#545454" }, minorGridLines: { color: "#454545" }, title: { color: h }, crosshair: { color: "#8e8e8e" }, notes: { icon: { background: "#3b3b3b", border: { color: "#8e8e8e" } }, label: { color: h }, line: { color: "#8e8e8e" } } } }, gauge: { pointer: { color: "#0070e4" }, scale: { rangePlaceholderColor: "#1d1d1d", labels: { color: h }, minorTicks: { color: h }, majorTicks: { color: h }, line: { color: h } } }, diagram: { shapeDefaults: { fill: { color: "#0066cc" }, connectorDefaults: { fill: { color: h }, stroke: { color: "#384049" }, hover: { fill: { color: "#3d3d3d" }, stroke: { color: "#efefef" } } }, content: { color: h } }, editable: { resize: { handles: { fill: { color: "#3d3d3d" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: h } } } }, rotate: { thumb: { stroke: { color: h }, fill: { color: h } } } }, selectable: { stroke: { color: h } }, connectionDefaults: { stroke: { color: h }, content: { color: h }, selection: { handles: { fill: { color: "#3d3d3d" }, stroke: { color: "#efefef" } } } } }, treeMap: { colors: [ ["#0081da", "#314b5c"], ["#3aafff", "#3c5464"], ["#99c900", "#4f5931"], ["#ffeb3d", "#64603d"], ["#b20753", "#543241"], ["#ff4195", "#643e4f"] ] } }), v("blueopal", { chart: { title: { color: "#293135" }, legend: { labels: { color: "#293135" }, inactiveItems: { labels: { color: "#27A5BA" }, markers: { color: "#27A5BA" } } }, seriesDefaults: { labels: { color: s, background: h, opacity: .5 }, errorBars: { color: "#293135" }, candlestick: { downColor: "#c4d0d5", line: { color: "#9aabb2" } }, waterfall: { line: { color: "#9aabb2" } }, horizontalWaterfall: { line: { color: "#9aabb2" } }, notes: { icon: { background: "transparent", border: { color: "#9aabb2" } }, label: { color: "#293135" }, line: { color: "#9aabb2" } } }, seriesColors: ["#0069a5", "#0098ee", "#7bd2f6", "#ffb800", "#ff8517", "#e34a00"], axisDefaults: { line: { color: "#9aabb2" }, labels: { color: "#293135" }, majorGridLines: { color: "#c4d0d5" }, minorGridLines: { color: "#edf1f2" }, title: { color: "#293135" }, crosshair: { color: "#9aabb2" }, notes: { icon: { background: "transparent", border: { color: "#9aabb2" } }, label: { color: "#293135" }, line: { color: "#9aabb2" } } } }, gauge: { pointer: { color: "#005c83" }, scale: { rangePlaceholderColor: "#daecf4", labels: { color: "#293135" }, minorTicks: { color: "#293135" }, majorTicks: { color: "#293135" }, line: { color: "#293135" } } }, diagram: { shapeDefaults: { fill: { color: "#7ec6e3" }, connectorDefaults: { fill: { color: "#003f59" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#003f59" } } }, content: { color: "#293135" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#003f59" }, hover: { fill: { color: "#003f59" }, stroke: { color: "#003f59" } } } }, rotate: { thumb: { stroke: { color: "#003f59" }, fill: { color: "#003f59" } } } }, selectable: { stroke: { color: "#003f59" } }, connectionDefaults: { stroke: { color: "#003f59" }, content: { color: "#293135" }, selection: { handles: { fill: { color: "#3d3d3d" }, stroke: { color: "#efefef" } } } } }, treeMap: { colors: [ ["#0069a5", "#bad7e7"], ["#0098ee", "#b9e0f5"], ["#7bd2f6", "#ceeaf6"], ["#ffb800", "#e6e3c4"], ["#ff8517", "#e4d8c8"], ["#e34a00", "#ddccc2"] ] } }), v("highcontrast", { chart: { title: { color: "#ffffff" }, legend: { labels: { color: "#ffffff" }, inactiveItems: { labels: { color: "#66465B" }, markers: { color: "#66465B" } } }, seriesDefaults: { labels: { color: "#ffffff" }, errorBars: { color: "#ffffff" }, notes: { icon: { background: "transparent", border: { color: "#ffffff" } }, label: { color: "#ffffff" }, line: { color: "#ffffff" } }, pie: { overlay: { gradient: "sharpGlass" } }, donut: { overlay: { gradient: "sharpGlass" } }, line: { markers: { background: "#2c232b" } }, scatter: { markers: { background: "#2c232b" } }, scatterLine: { markers: { background: "#2c232b" } }, area: { opacity: .5 }, waterfall: { line: { color: "#ffffff" } }, horizontalWaterfall: { line: { color: "#ffffff" } }, candlestick: { downColor: "#664e62", line: { color: "#ffffff" }, border: { _brightness: 1.5, opacity: 1 }, highlight: { border: { color: "#ffffff", opacity: 1 } } }, ohlc: { line: { color: "#ffffff" } } }, chartArea: { background: "#2c232b" }, seriesColors: ["#a7008f", "#ffb800", "#3aafff", "#99c900", "#b20753", "#ff4195"], axisDefaults: { line: { color: "#ffffff" }, labels: { color: "#ffffff" }, majorGridLines: { color: "#664e62" }, minorGridLines: { color: "#4f394b" }, title: { color: "#ffffff" }, crosshair: { color: "#ffffff" }, notes: { icon: { background: "transparent", border: { color: "#ffffff" } }, label: { color: "#ffffff" }, line: { color: "#ffffff" } } } }, gauge: { pointer: { color: "#a7008f" }, scale: { rangePlaceholderColor: "#2c232b", labels: { color: "#ffffff" }, minorTicks: { color: "#2c232b" }, majorTicks: { color: "#664e62" }, line: { color: "#ffffff" } } }, diagram: { shapeDefaults: { fill: { color: "#a7018f" }, connectorDefaults: { fill: { color: h }, stroke: { color: "#2c232b" }, hover: { fill: { color: "#2c232b" }, stroke: { color: h } } }, content: { color: h } }, editable: { resize: { handles: { fill: { color: "#2c232b" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: h } } } }, rotate: { thumb: { stroke: { color: h }, fill: { color: h } } } }, selectable: { stroke: { color: h } }, connectionDefaults: { stroke: { color: h }, content: { color: h }, selection: { handles: { fill: { color: "#2c232b" }, stroke: { color: h } } } } }, treeMap: { colors: [ ["#a7008f", "#451c3f"], ["#ffb800", "#564122"], ["#3aafff", "#2f3f55"], ["#99c900", "#424422"], ["#b20753", "#471d33"], ["#ff4195", "#562940"] ] } }), v("default", { chart: { title: { color: "#8e8e8e" }, legend: { labels: { color: "#232323" }, inactiveItems: { labels: { color: "#919191" }, markers: { color: "#919191" } } }, seriesDefaults: { labels: { color: s, background: h, opacity: .5 }, errorBars: { color: "#232323" }, candlestick: { downColor: "#dedede", line: { color: "#8d8d8d" } }, waterfall: { line: { color: "#8e8e8e" } }, horizontalWaterfall: { line: { color: "#8e8e8e" } }, notes: { icon: { background: "transparent", border: { color: "#8e8e8e" } }, label: { color: "#232323" }, line: { color: "#8e8e8e" } } }, seriesColors: ["#ff6800", "#a0a700", "#ff8d00", "#678900", "#ffb53c", "#396000"], axisDefaults: { line: { color: "#8e8e8e" }, labels: { color: "#232323" }, minorGridLines: { color: "#f0f0f0" }, majorGridLines: { color: "#dfdfdf" }, title: { color: "#232323" }, crosshair: { color: "#8e8e8e" }, notes: { icon: { background: "transparent", border: { color: "#8e8e8e" } }, label: { color: "#232323" }, line: { color: "#8e8e8e" } } } }, gauge: { pointer: { color: "#ea7001" }, scale: { rangePlaceholderColor: "#dedede", labels: { color: "#2e2e2e" }, minorTicks: { color: "#2e2e2e" }, majorTicks: { color: "#2e2e2e" }, line: { color: "#2e2e2e" } } }, diagram: { shapeDefaults: { fill: { color: "#e15613" }, connectorDefaults: { fill: { color: "#282828" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#282828" } } }, content: { color: "#2e2e2e" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#282828" }, hover: { fill: { color: "#282828" }, stroke: { color: "#282828" } } } }, rotate: { thumb: { stroke: { color: "#282828" }, fill: { color: "#282828" } } } }, selectable: { stroke: { color: "#a7018f" } }, connectionDefaults: { stroke: { color: "#282828" }, content: { color: "#2e2e2e" }, selection: { handles: { fill: { color: h }, stroke: { color: "#282828" } } } } }, treeMap: { colors: [ ["#ff6800", "#edcfba"], ["#a0a700", "#dadcba"], ["#ff8d00", "#edd7ba"], ["#678900", "#cfd6ba"], ["#ffb53c", "#eddfc6"], ["#396000", "#c6ceba"] ] } }), v("silver", { chart: { title: { color: "#4e5968" }, legend: { labels: { color: "#4e5968" }, inactiveItems: { labels: { color: "#B1BCC8" }, markers: { color: "#B1BCC8" } } }, seriesDefaults: { labels: { color: "#293135", background: "#eaeaec", opacity: .5 }, errorBars: { color: "#4e5968" }, notes: { icon: { background: "transparent", border: { color: "#4e5968" } }, label: { color: "#4e5968" }, line: { color: "#4e5968" } }, line: { markers: { background: "#eaeaec" } }, scatter: { markers: { background: "#eaeaec" } }, scatterLine: { markers: { background: "#eaeaec" } }, pie: { connectors: { color: "#A6B1C0" } }, donut: { connectors: { color: "#A6B1C0" } }, waterfall: { line: { color: "#a6b1c0" } }, horizontalWaterfall: { line: { color: "#a6b1c0" } }, candlestick: { downColor: "#a6afbe" } }, chartArea: { background: "#eaeaec" }, seriesColors: ["#007bc3", "#76b800", "#ffae00", "#ef4c00", "#a419b7", "#430B62"], axisDefaults: { line: { color: "#a6b1c0" }, labels: { color: "#4e5968" }, majorGridLines: { color: "#dcdcdf" }, minorGridLines: { color: "#eeeeef" }, title: { color: "#4e5968" }, crosshair: { color: "#a6b1c0" }, notes: { icon: { background: "transparent", border: { color: "#4e5968" } }, label: { color: "#4e5968" }, line: { color: "#4e5968" } } } }, gauge: { pointer: { color: "#0879c0" }, scale: { rangePlaceholderColor: "#f3f3f4", labels: { color: "#515967" }, minorTicks: { color: "#515967" }, majorTicks: { color: "#515967" }, line: { color: "#515967" } } }, diagram: { shapeDefaults: { fill: { color: "#1c82c2" }, connectorDefaults: { fill: { color: "#515967" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#282828" } } }, content: { color: "#515967" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#515967" }, hover: { fill: { color: "#515967" }, stroke: { color: "#515967" } } } }, rotate: { thumb: { stroke: { color: "#515967" }, fill: { color: "#515967" } } } }, selectable: { stroke: { color: "#515967" } }, connectionDefaults: { stroke: { color: "#515967" }, content: { color: "#515967" }, selection: { handles: { fill: { color: h }, stroke: { color: "#515967" } } } } }, treeMap: { colors: [ ["#007bc3", "#c2dbea"], ["#76b800", "#dae7c3"], ["#ffae00", "#f5e5c3"], ["#ef4c00", "#f2d2c3"], ["#a419b7", "#e3c7e8"], ["#430b62", "#d0c5d7"] ] } }), v("metro", { chart: { title: { color: "#777777" }, legend: { labels: { color: "#777777" }, inactiveItems: { labels: { color: "#CBCBCB" }, markers: { color: "#CBCBCB" } } }, seriesDefaults: { labels: { color: s }, errorBars: { color: "#777777" }, notes: { icon: { background: "transparent", border: { color: "#777777" } }, label: { color: "#777777" }, line: { color: "#777777" } }, candlestick: { downColor: "#c7c7c7", line: { color: "#787878" } }, waterfall: { line: { color: "#c7c7c7" } }, horizontalWaterfall: { line: { color: "#c7c7c7" } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, seriesColors: ["#8ebc00", "#309b46", "#25a0da", "#ff6900", "#e61e26", "#d8e404", "#16aba9", "#7e51a1", "#313131", "#ed1691"], axisDefaults: { line: { color: "#c7c7c7" }, labels: { color: "#777777" }, minorGridLines: { color: "#c7c7c7" }, majorGridLines: { color: "#c7c7c7" }, title: { color: "#777777" }, crosshair: { color: "#c7c7c7" }, notes: { icon: { background: "transparent", border: { color: "#777777" } }, label: { color: "#777777" }, line: { color: "#777777" } } } }, gauge: { pointer: { color: "#8ebc00" }, scale: { rangePlaceholderColor: "#e6e6e6", labels: { color: "#777" }, minorTicks: { color: "#777" }, majorTicks: { color: "#777" }, line: { color: "#777" } } }, diagram: { shapeDefaults: { fill: { color: "#8ebc00" }, connectorDefaults: { fill: { color: s }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: s } } }, content: { color: "#777" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#787878" }, hover: { fill: { color: "#787878" }, stroke: { color: "#787878" } } } }, rotate: { thumb: { stroke: { color: "#787878" }, fill: { color: "#787878" } } } }, selectable: { stroke: { color: "#515967" } }, connectionDefaults: { stroke: { color: "#787878" }, content: { color: "#777" }, selection: { handles: { fill: { color: h }, stroke: { color: "#787878" } } } } }, treeMap: { colors: [ ["#8ebc00", "#e8f2cc"], ["#309b46", "#d6ebda"], ["#25a0da", "#d3ecf8"], ["#ff6900", "#ffe1cc"], ["#e61e26", "#fad2d4"], ["#d8e404", "#f7facd"], ["#16aba9", "#d0eeee"], ["#7e51a1", "#e5dcec"], ["#313131", "#d6d6d6"], ["#ed1691", "#fbd0e9"] ] } }), v("metroblack", { chart: { title: { color: "#ffffff" }, legend: { labels: { color: "#ffffff" }, inactiveItems: { labels: { color: "#797979" }, markers: { color: "#797979" } } }, seriesDefaults: { border: { _brightness: 1 }, labels: { color: "#ffffff" }, errorBars: { color: "#ffffff" }, notes: { icon: { background: "transparent", border: { color: "#cecece" } }, label: { color: "#ffffff" }, line: { color: "#cecece" } }, line: { markers: { background: "#0e0e0e" } }, bubble: { opacity: .6 }, scatter: { markers: { background: "#0e0e0e" } }, scatterLine: { markers: { background: "#0e0e0e" } }, candlestick: { downColor: "#828282", line: { color: "#ffffff" } }, waterfall: { line: { color: "#cecece" } }, horizontalWaterfall: { line: { color: "#cecece" } }, overlay: { gradient: "none" } }, chartArea: { background: "#0e0e0e" }, seriesColors: ["#00aba9", "#309b46", "#8ebc00", "#ff6900", "#e61e26", "#d8e404", "#25a0da", "#7e51a1", "#313131", "#ed1691"], axisDefaults: { line: { color: "#cecece" }, labels: { color: "#ffffff" }, minorGridLines: { color: "#2d2d2d" }, majorGridLines: { color: "#333333" }, title: { color: "#ffffff" }, crosshair: { color: "#cecece" }, notes: { icon: { background: "transparent", border: { color: "#cecece" } }, label: { color: "#ffffff" }, line: { color: "#cecece" } } } }, gauge: { pointer: { color: "#00aba9" }, scale: { rangePlaceholderColor: "#2d2d2d", labels: { color: "#ffffff" }, minorTicks: { color: "#333333" }, majorTicks: { color: "#cecece" }, line: { color: "#cecece" } } }, diagram: { shapeDefaults: { fill: { color: "#00aba9" }, connectorDefaults: { fill: { color: h }, stroke: { color: "#0e0e0e" }, hover: { fill: { color: "#0e0e0e" }, stroke: { color: h } } }, content: { color: h } }, editable: { resize: { handles: { fill: { color: "#0e0e0e" }, stroke: { color: "#787878" }, hover: { fill: { color: "#787878" }, stroke: { color: "#787878" } } } }, rotate: { thumb: { stroke: { color: h }, fill: { color: h } } } }, selectable: { stroke: { color: "#787878" } }, connectionDefaults: { stroke: { color: h }, content: { color: h }, selection: { handles: { fill: { color: "#0e0e0e" }, stroke: { color: h } } } } }, treeMap: { colors: [ ["#00aba9", "#0b2d2d"], ["#309b46", "#152a19"], ["#8ebc00", "#28310b"], ["#ff6900", "#3e200b"], ["#e61e26", "#391113"], ["#d8e404", "#36390c"], ["#25a0da", "#132b37"], ["#7e51a1", "#241b2b"], ["#313131", "#151515"], ["#ed1691", "#3b1028"] ] } }), v("moonlight", { chart: { title: { color: "#ffffff" }, legend: { labels: { color: "#ffffff" }, inactiveItems: { labels: { color: "#A1A7AB" }, markers: { color: "#A1A7AB" } } }, seriesDefaults: { labels: { color: "#ffffff" }, errorBars: { color: "#ffffff" }, notes: { icon: { background: "transparent", border: { color: "#8c909e" } }, label: { color: "#ffffff" }, line: { color: "#8c909e" } }, pie: { overlay: { gradient: "sharpBevel" } }, donut: { overlay: { gradient: "sharpGlass" } }, line: { markers: { background: "#212a33" } }, bubble: { opacity: .6 }, scatter: { markers: { background: "#212a33" } }, scatterLine: { markers: { background: "#212a33" } }, area: { opacity: .3 }, candlestick: { downColor: "#757d87", line: { color: "#ea9d06" }, border: { _brightness: 1.5, opacity: 1 }, highlight: { border: { color: h, opacity: .2 } } }, waterfall: { line: { color: "#8c909e" } }, horizontalWaterfall: { line: { color: "#8c909e" } }, ohlc: { line: { color: "#ea9d06" } } }, chartArea: { background: "#212a33" }, seriesColors: ["#ffca08", "#ff710f", "#ed2e24", "#ff9f03", "#e13c02", "#a00201"], axisDefaults: { line: { color: "#8c909e" }, minorTicks: { color: "#8c909e" }, majorTicks: { color: "#8c909e" }, labels: { color: "#ffffff" }, majorGridLines: { color: "#3e424d" }, minorGridLines: { color: "#2f3640" }, title: { color: "#ffffff" }, crosshair: { color: "#8c909e" }, notes: { icon: { background: "transparent", border: { color: "#8c909e" } }, label: { color: "#ffffff" }, line: { color: "#8c909e" } } } }, gauge: { pointer: { color: "#f4af03" }, scale: { rangePlaceholderColor: "#2f3640", labels: { color: h }, minorTicks: { color: "#8c909e" }, majorTicks: { color: "#8c909e" }, line: { color: "#8c909e" } } }, diagram: { shapeDefaults: { fill: { color: "#f3ae03" }, connectorDefaults: { fill: { color: h }, stroke: { color: "#414550" }, hover: { fill: { color: "#414550" }, stroke: { color: h } } }, content: { color: h } }, editable: { resize: { handles: { fill: { color: "#414550" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: h } } } }, rotate: { thumb: { stroke: { color: h }, fill: { color: h } } } }, selectable: { stroke: { color: h } }, connectionDefaults: { stroke: { color: h }, content: { color: h }, selection: { handles: { fill: { color: "#414550" }, stroke: { color: h } } } } }, treeMap: { colors: [ ["#ffca08", "#4e4b2b"], ["#ff710f", "#4e392d"], ["#ed2e24", "#4b2c31"], ["#ff9f03", "#4e422a"], ["#e13c02", "#482e2a"], ["#a00201", "#3b232a"] ] } }), v("uniform", { chart: { title: { color: "#686868" }, legend: { labels: { color: "#686868" }, inactiveItems: { labels: { color: "#B6B6B6" }, markers: { color: "#B6B6B6" } } }, seriesDefaults: { labels: { color: "#686868" }, errorBars: { color: "#686868" }, notes: { icon: { background: "transparent", border: { color: "#9e9e9e" } }, label: { color: "#686868" }, line: { color: "#9e9e9e" } }, pie: { overlay: { gradient: "sharpBevel" } }, donut: { overlay: { gradient: "sharpGlass" } }, line: { markers: { background: "#ffffff" } }, bubble: { opacity: .6 }, scatter: { markers: { background: "#ffffff" } }, scatterLine: { markers: { background: "#ffffff" } }, area: { opacity: .3 }, candlestick: { downColor: "#cccccc", line: { color: "#cccccc" }, border: { _brightness: 1.5, opacity: 1 }, highlight: { border: { color: "#cccccc", opacity: .2 } } }, waterfall: { line: { color: "#9e9e9e" } }, horizontalWaterfall: { line: { color: "#9e9e9e" } }, ohlc: { line: { color: "#cccccc" } } }, chartArea: { background: "#ffffff" }, seriesColors: ["#527aa3", "#6f91b3", "#8ca7c2", "#a8bdd1", "#c5d3e0", "#e2e9f0"], axisDefaults: { line: { color: "#9e9e9e" }, minorTicks: { color: "#aaaaaa" }, majorTicks: { color: "#888888" }, labels: { color: "#686868" }, majorGridLines: { color: "#dadada" }, minorGridLines: { color: "#e7e7e7" }, title: { color: "#686868" }, crosshair: { color: "#9e9e9e" }, notes: { icon: { background: "transparent", border: { color: "#9e9e9e" } }, label: { color: "#686868" }, line: { color: "#9e9e9e" } } } }, gauge: { pointer: { color: "#527aa3" }, scale: { rangePlaceholderColor: "#e7e7e7", labels: { color: "#686868" }, minorTicks: { color: "#aaaaaa" }, majorTicks: { color: "#888888" }, line: { color: "#9e9e9e" } } }, diagram: { shapeDefaults: { fill: { color: "#d1d1d1" }, connectorDefaults: { fill: { color: "#686868" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#686868" } } }, content: { color: "#686868" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#686868" }, hover: { fill: { color: "#686868" }, stroke: { color: "#686868" } } } }, rotate: { thumb: { stroke: { color: "#686868" }, fill: { color: "#686868" } } } }, selectable: { stroke: { color: "#686868" } }, connectionDefaults: { stroke: { color: "#686868" }, content: { color: "#686868" }, selection: { handles: { fill: { color: h }, stroke: { color: "#686868" } } } } }, treeMap: { colors: [ ["#527aa3", "#d0d8e1"], ["#6f91b3", "#d6dde4"], ["#8ca7c2", "#dce1e7"], ["#a8bdd1", "#e2e6ea"], ["#c5d3e0", "#e7eaed"], ["#e2e9f0", "#edeff0"] ] } }), v("bootstrap", { chart: { title: { color: "#333333" }, legend: { labels: { color: "#333333" }, inactiveItems: { labels: { color: "#999999" }, markers: { color: "#9A9A9A" } } }, seriesDefaults: { labels: { color: "#333333" }, overlay: { gradient: "none" }, errorBars: { color: "#343434" }, notes: { icon: { background: "#000000", border: { color: "#000000" } }, label: { color: "#333333" }, line: { color: "#000000" } }, pie: { overlay: { gradient: "none" } }, donut: { overlay: { gradient: "none" } }, line: { markers: { background: "#ffffff" } }, bubble: { opacity: .6 }, scatter: { markers: { background: "#ffffff" } }, scatterLine: { markers: { background: "#ffffff" } }, area: { opacity: .8 }, candlestick: { downColor: "#d0d0d0", line: { color: "#333333" }, border: { _brightness: 1.5, opacity: 1 }, highlight: { border: { color: "#b8b8b8", opacity: .2 } } }, waterfall: { line: { color: "#cccccc" } }, horizontalWaterfall: { line: { color: "#cccccc" } }, ohlc: { line: { color: "#333333" } } }, chartArea: { background: "#ffffff" }, seriesColors: ["#428bca", "#5bc0de", "#5cb85c", "#f2b661", "#e67d4a", "#da3b36"], axisDefaults: { line: { color: "#cccccc" }, minorTicks: { color: "#ebebeb" }, majorTicks: { color: "#cccccc" }, labels: { color: "#333333" }, majorGridLines: { color: "#cccccc" }, minorGridLines: { color: "#ebebeb" }, title: { color: "#333333" }, crosshair: { color: "#000000" }, notes: { icon: { background: "#000000", border: { color: "#000000" } }, label: { color: "#ffffff" }, line: { color: "#000000" } } } }, gauge: { pointer: { color: "#428bca" }, scale: { rangePlaceholderColor: "#cccccc", labels: { color: "#333333" }, minorTicks: { color: "#ebebeb" }, majorTicks: { color: "#cccccc" }, line: { color: "#cccccc" } } }, diagram: { shapeDefaults: { fill: { color: "#428bca" }, connectorDefaults: { fill: { color: "#333333" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#333333" } } }, content: { color: "#333333" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#333333" }, hover: { fill: { color: "#333333" }, stroke: { color: "#333333" } } } }, rotate: { thumb: { stroke: { color: "#333333" }, fill: { color: "#333333" } } } }, selectable: { stroke: { color: "#333333" } }, connectionDefaults: { stroke: { color: "#c4c4c4" }, content: { color: "#333333" }, selection: { handles: { fill: { color: h }, stroke: { color: "#333333" } }, stroke: { color: "#333333" } } } }, treeMap: { colors: [ ["#428bca", "#d1e0ec"], ["#5bc0de", "#d6eaf0"], ["#5cb85c", "#d6e9d6"], ["#5cb85c", "#f4e8d7"], ["#e67d4a", "#f2ddd3"], ["#da3b36", "#f0d0cf"] ] } }), v("flat", { chart: { title: { color: "#4c5356" }, legend: { labels: { color: "#4c5356" }, inactiveItems: { labels: { color: "#CBCBCB" }, markers: { color: "#CBCBCB" } } }, seriesDefaults: { labels: { color: "#4c5356" }, errorBars: { color: "#4c5356" }, notes: { icon: { background: "transparent", border: { color: "#cdcdcd" } }, label: { color: "#4c5356" }, line: { color: "#cdcdcd" } }, candlestick: { downColor: "#c7c7c7", line: { color: "#787878" } }, area: { opacity: .9 }, waterfall: { line: { color: "#cdcdcd" } }, horizontalWaterfall: { line: { color: "#cdcdcd" } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, seriesColors: ["#10c4b2", "#ff7663", "#ffb74f", "#a2df53", "#1c9ec4", "#ff63a5", "#1cc47b"], axisDefaults: { line: { color: "#cdcdcd" }, labels: { color: "#4c5356" }, minorGridLines: { color: "#cdcdcd" }, majorGridLines: { color: "#cdcdcd" }, title: { color: "#4c5356" }, crosshair: { color: "#cdcdcd" }, notes: { icon: { background: "transparent", border: { color: "#cdcdcd" } }, label: { color: "#4c5356" }, line: { color: "#cdcdcd" } } } }, gauge: { pointer: { color: "#10c4b2" }, scale: { rangePlaceholderColor: "#cdcdcd", labels: { color: "#4c5356" }, minorTicks: { color: "#4c5356" }, majorTicks: { color: "#4c5356" }, line: { color: "#4c5356" } } }, diagram: { shapeDefaults: { fill: { color: "#10c4b2" }, connectorDefaults: { fill: { color: "#363940" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#363940" } } }, content: { color: "#4c5356" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#363940" }, hover: { fill: { color: "#363940" }, stroke: { color: "#363940" } } } }, rotate: { thumb: { stroke: { color: "#363940" }, fill: { color: "#363940" } } } }, selectable: { stroke: { color: "#363940" } }, connectionDefaults: { stroke: { color: "#cdcdcd" }, content: { color: "#4c5356" }, selection: { handles: { fill: { color: h }, stroke: { color: "#363940" } }, stroke: { color: "#363940" } } } }, treeMap: { colors: [ ["#10c4b2", "#cff3f0"], ["#ff7663", "#ffe4e0"], ["#ffb74f", "#fff1dc"], ["#a2df53", "#ecf9dd"], ["#1c9ec4", "#d2ecf3"], ["#ff63a5", "#ffe0ed"], ["#1cc47b", "#d2f3e5"] ] } }), v("material", { chart: { title: { color: "#444444" }, legend: { labels: { color: "#444444" }, inactiveItems: { labels: { color: "#CBCBCB" }, markers: { color: "#CBCBCB" } } }, seriesDefaults: { labels: { color: "#444444" }, errorBars: { color: "#444444" }, notes: { icon: { background: "transparent", border: { color: "#e5e5e5" } }, label: { color: "#444444" }, line: { color: "#e5e5e5" } }, candlestick: { downColor: "#c7c7c7", line: { color: "#787878" } }, area: { opacity: .9 }, waterfall: { line: { color: "#e5e5e5" } }, horizontalWaterfall: { line: { color: "#e5e5e5" } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, seriesColors: ["#3f51b5", "#03a9f4", "#4caf50", "#f9ce1d", "#ff9800", "#ff5722"], axisDefaults: { line: { color: "#e5e5e5" }, labels: { color: "#444444" }, minorGridLines: { color: "#e5e5e5" }, majorGridLines: { color: "#e5e5e5" }, title: { color: "#444444" }, crosshair: { color: "#7f7f7f" }, notes: { icon: { background: "transparent", border: { color: "#e5e5e5" } }, label: { color: "#444444" }, line: { color: "#e5e5e5" } } } }, gauge: { pointer: { color: "#3f51b5" }, scale: { rangePlaceholderColor: "#e5e5e5", labels: { color: "#444444" }, minorTicks: { color: "#444444" }, majorTicks: { color: "#444444" }, line: { color: "#444444" } } }, diagram: { shapeDefaults: { fill: { color: "#3f51b5" }, connectorDefaults: { fill: { color: "#7f7f7f" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#7f7f7f" } } }, content: { color: "#444444" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#444444" }, hover: { fill: { color: "#444444" }, stroke: { color: "#444444" } } } }, rotate: { thumb: { stroke: { color: "#444444" }, fill: { color: "#444444" } } } }, selectable: { stroke: { color: "#444444" } }, connectionDefaults: { stroke: { color: "#7f7f7f" }, content: { color: "#444444" }, selection: { handles: { fill: { color: h }, stroke: { color: "#444444" } }, stroke: { color: "#444444" } } } }, treeMap: { colors: [ ["#3f51b5", "#cff3f0"], ["#03a9f4", "#e5f6fe"], ["#4caf50", "#edf7ed"], ["#f9ce1d", "#fefae8"], ["#ff9800", "#fff4e5"], ["#ff5722", "#ffeee8"] ] } }), v("materialblack", { chart: { title: { color: "#fff" }, legend: { labels: { color: "#fff" }, inactiveItems: { labels: { color: "#CBCBCB" }, markers: { color: "#CBCBCB" } } }, seriesDefaults: { labels: { color: "#fff" }, errorBars: { color: "#fff" }, notes: { icon: { background: "transparent", border: { color: "#e5e5e5" } }, label: { color: "#fff" }, line: { color: "#e5e5e5" } }, candlestick: { downColor: "#c7c7c7", line: { color: "#787878" } }, area: { opacity: .9 }, waterfall: { line: { color: "#4d4d4d" } }, horizontalWaterfall: { line: { color: "#4d4d4d" } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, chartArea: { background: "#1c1c1c" }, seriesColors: ["#3f51b5", "#03a9f4", "#4caf50", "#f9ce1d", "#ff9800", "#ff5722"], axisDefaults: { line: { color: "#4d4d4d" }, labels: { color: "#fff" }, minorGridLines: { color: "#4d4d4d" }, majorGridLines: { color: "#4d4d4d" }, title: { color: "#fff" }, crosshair: { color: "#7f7f7f" }, notes: { icon: { background: "transparent", border: { color: "#4d4d4d" } }, label: { color: "#fff" }, line: { color: "#4d4d4d" } } } }, gauge: { pointer: { color: "#3f51b5" }, scale: { rangePlaceholderColor: "#4d4d4d", labels: { color: "#fff" }, minorTicks: { color: "#fff" }, majorTicks: { color: "#fff" }, line: { color: "#fff" } } }, diagram: { shapeDefaults: { fill: { color: "#3f51b5" }, connectorDefaults: { fill: { color: "#7f7f7f" }, stroke: { color: h }, hover: { fill: { color: h }, stroke: { color: "#7f7f7f" } } }, content: { color: "#fff" } }, editable: { resize: { handles: { fill: { color: h }, stroke: { color: "#fff" }, hover: { fill: { color: "#fff" }, stroke: { color: "#fff" } } } }, rotate: { thumb: { stroke: { color: "#fff" }, fill: { color: "#fff" } } } }, selectable: { stroke: { color: "#fff" } }, connectionDefaults: { stroke: { color: "#7f7f7f" }, content: { color: "#fff" }, selection: { handles: { fill: { color: h }, stroke: { color: "#fff" } }, stroke: { color: "#fff" } } } }, treeMap: { colors: [ ["#3f51b5", "#cff3f0"], ["#03a9f4", "#e5f6fe"], ["#4caf50", "#edf7ed"], ["#f9ce1d", "#fefae8"], ["#ff9800", "#fff4e5"], ["#ff5722", "#ffeee8"] ] } }), function() { function e() { return { icon: { background: "#007cc0", border: { color: "#007cc0" } }, label: { color: "#ffffff" }, line: { color: o } } } var n = "#333333", i = "#7f7f7f", r = "#bdbdbd", o = "#c8c8c8", a = "#dddddd", s = ["#008fd3", "#99d101", "#f39b02", "#f05662", "#c03c53", "#acacac"], l = ["#cbe8f5", "#eaf5cb", "#fceacc", "#fbdcdf", "#f2d7dc", "#eeeeee"], c = s[0], d = h; v("fiori", { chart: { title: { color: n }, legend: { labels: { color: n }, inactiveItems: { labels: { color: i }, markers: { color: i } } }, seriesDefaults: { labels: { color: n }, errorBars: { color: n }, notes: e(), candlestick: { downColor: o, line: { color: r } }, area: { opacity: .8 }, waterfall: { line: { color: o } }, horizontalWaterfall: { line: { color: o } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, seriesColors: s, axisDefaults: { line: { color: o }, labels: { color: n }, minorGridLines: { color: a }, majorGridLines: { color: o }, title: { color: n }, crosshair: { color: i }, notes: e() } }, gauge: { pointer: { color: c }, scale: { rangePlaceholderColor: o, labels: { color: n }, minorTicks: { color: n }, majorTicks: { color: n }, line: { color: n } } }, diagram: { shapeDefaults: { fill: { color: c }, connectorDefaults: { fill: { color: n }, stroke: { color: d }, hover: { fill: { color: d }, stroke: { color: n } } }, content: { color: n } }, editable: { resize: { handles: { fill: { color: d }, stroke: { color: r }, hover: { fill: { color: r }, stroke: { color: r } } } }, rotate: { thumb: { stroke: { color: r }, fill: { color: r } } } }, selectable: { stroke: { color: r } }, connectionDefaults: { stroke: { color: r }, content: { color: r }, selection: { handles: { fill: { color: d }, stroke: { color: r } }, stroke: { color: r } } } }, treeMap: { colors: t(s, l) } }) }(), function() { function e() { return { icon: { background: "#00b0ff", border: { color: "#00b0ff" } }, label: { color: "#ffffff" }, line: { color: o } } } var n = "#4e4e4e", i = "#7f7f7f", r = "#bdbdbd", o = "#c8c8c8", a = "#e5e5e5", s = ["#0072c6", "#5db2ff", "#008a17", "#82ba00", "#ff8f32", "#ac193d"], l = ["#cbe2f3", "#deeffe", "#cbe7d0", "#e5f0cb", "#fee8d5", "#eed0d7"], c = s[0], d = h; v("office365", { chart: { title: { color: n }, legend: { labels: { color: n }, inactiveItems: { labels: { color: i }, markers: { color: i } } }, seriesDefaults: { labels: { color: n }, errorBars: { color: n }, notes: e(), candlestick: { downColor: o, line: { color: r } }, area: { opacity: .8 }, waterfall: { line: { color: o } }, horizontalWaterfall: { line: { color: o } }, overlay: { gradient: "none" }, border: { _brightness: 1 } }, seriesColors: s, axisDefaults: { line: { color: o }, labels: { color: n }, minorGridLines: { color: a }, majorGridLines: { color: o }, title: { color: n }, crosshair: { color: i }, notes: e() } }, gauge: { pointer: { color: c }, scale: { rangePlaceholderColor: o, labels: { color: n }, minorTicks: { color: n }, majorTicks: { color: n }, line: { color: n } } }, diagram: { shapeDefaults: { fill: { color: c }, connectorDefaults: { fill: { color: n }, stroke: { color: d }, hover: { fill: { color: d }, stroke: { color: n } } }, content: { color: n } }, editable: { resize: { handles: { fill: { color: d }, stroke: { color: r }, hover: { fill: { color: r }, stroke: { color: r } } } }, rotate: { thumb: { stroke: { color: r }, fill: { color: r } } } }, selectable: { stroke: { color: r } }, connectionDefaults: { stroke: { color: r }, content: { color: r }, selection: { handles: { fill: { color: d }, stroke: { color: r } }, stroke: { color: r } } } }, treeMap: { colors: t(s, l) } }) }() }(window.kendo.jQuery), function(e, t) { function n() { this._defaults = {} } function i(e, t, n, i) { var r, o, a = (i.x - n.x) * (e.y - n.y) - (i.y - n.y) * (e.x - n.x), s = (i.y - n.y) * (t.x - e.x) - (i.x - n.x) * (t.y - e.y); return 0 !== s && (o = a / s, r = new $n(e.x + o * (t.x - e.x), e.y + o * (t.y - e.y))), r } function r(e, t) { var n, i, r, a = e.series, s = a.length, l = e.seriesDefaults, c = Pn({}, e.seriesDefaults), d = t ? Pn({}, t.seriesDefaults) : {}, u = Pn({}, d); for (o(c), o(u), n = 0; s > n; n++) i = a[n].type || e.seriesDefaults.type, r = Pn({ data: [] }, u, d[i], { tooltip: e.tooltip }, c, l[i]), a[n]._defaults = r, a[n] = Pn({}, r, a[n]) } function o(e) { delete e.bar, delete e.column, delete e.rangeColumn, delete e.line, delete e.verticalLine, delete e.pie, delete e.donut, delete e.area, delete e.verticalArea, delete e.scatter, delete e.scatterLine, delete e.bubble, delete e.candlestick, delete e.ohlc, delete e.boxPlot, delete e.bullet, delete e.verticalBullet, delete e.polarArea, delete e.polarLine, delete e.radarArea, delete e.radarLine, delete e.waterfall } function a(e) { var t, n, i, r, o = e.series, a = e.seriesColors || []; for (t = 0; o.length > t; t++) n = o[t], i = a[t % a.length], n.color = n.color || i, r = n._defaults, r && (r.color = r.color || i) } function s(e) { var t; _n([Bi, Uo, Qo, Ko], function() { t = this + "Axes", e[t] && (e[this + "Axis"] = e[t], delete e[t]) }) } function l(t, n) { var i = (n || {}).axisDefaults || {}; _n([Bi, Uo, Qo, Ko], function() { var n = this + "Axis", r = [].concat(t[n]), o = t.axisDefaults || {}; r = e.map(r, function(e) { var t = (e || {}).color, r = Pn({}, i, i[n], o, o[n], { line: { color: t }, labels: { color: t }, title: { color: t } }, e); return delete r[n], r }), t[n] = r.length > 1 ? r : r[0] }) } function c(e) { var t, n = e.length, i = 0; for (t = 0; n > t; t++) i = kn.max(i, e[t].data.length); return i } function d(e) { return e * e } function u(e, t) { if (null === t) return t; var n = Mn(e, !0); return n(t) } function h(e, t) { if (null === t) return t; var n = "_date_" + e, i = t[n]; return i || (i = p(Mn(e, !0)(t)), t[n] = i), i } function p(e) { var t, n; if (e instanceof Date) t = e; else if (typeof e === So) t = Tn.parseDate(e) || new Date(e); else if (e) if (wn(e)) for (t = [], n = 0; e.length > n; n++) t.push(p(e[n])); else t = new Date(e); return t } function f(e) { return wn(e) ? yn(e, f) : e ? p(e).getTime() : t } function g(e, t, n, i) { var r, o = e; return e && (e = p(e), r = e.getHours(), n === Xo ? (o = new Date(e.getFullYear() + t, 0, 1), Tn.date.adjustDST(o, 0)) : n === Or ? (o = new Date(e.getFullYear(), e.getMonth() + t, 1), Tn.date.adjustDST(o, r)) : n === $o ? (o = g(m(e, i), 7 * t, Xi), Tn.date.adjustDST(o, r)) : n === Xi ? (o = new Date(e.getFullYear(), e.getMonth(), e.getDate() + t), Tn.date.adjustDST(o, r)) : n === yr ? (o = new Date(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours() + t), t > 0 && S(e, o) && (o = g(e, t + 1, n, i))) : n === Nr ? (o = new Date(e.getTime() + t * Ao), o.getSeconds() > 0 && o.setSeconds(0)) : n === fo && (o = new Date(e.getTime() + t * Do)), o.getMilliseconds() > 0 && o.setMilliseconds(0)), o } function m(e, t) { var n = e.getDay(), i = 0; if (!isNaN(n)) for (t = t || 0; n !== t;) 0 === n ? n = 6 : n--, i++; return b(e, -i * Io) } function v(e, t, n) { return e = p(e), g(e, 0, t, n) } function _(e, t, n) { return e = p(e), e && v(e, t, n).getTime() === e.getTime() ? e : g(e, 1, t, n) } function w(e, t) { var n = e.getTime() - t, i = e.getTimezoneOffset() - t.getTimezoneOffset(); return n - i * Ao } function b(e, t) { var n = e.getTimezoneOffset(), i = new Date(e.getTime() + t), r = i.getTimezoneOffset() - n; return new Date(i.getTime() + r * Ao) } function y(e, t, n) { var i; return i = n === Xo ? t.getFullYear() - e.getFullYear() : n === Or ? 12 * y(e, t, Xo) + t.getMonth() - e.getMonth() : kn.floor(n === Xi ? w(t, e) / Io : (t - e) / Fo[n]) } function k(e) { return 1 === e.length ? e[0] : e } function x(e) { var t, n, i, r = e.length; if (r > 0) for (n = 0; r > n; n++) i = e[n].contentBox(), t ? t.wrap(i) : t = i.clone(); return t || Ln() } function C(e, t) { return e && t ? e.toLowerCase() === t.toLowerCase() : e === t } function S(e, t) { return e && t ? f(e) === f(t) : e === t } function T(e, t) { null !== t && e.push(t) } function D(e, t) { for (var n, i, r = 0, o = t.length - 1; o >= r;) if (n = kn.floor((r + o) / 2), i = t[n], e > i) r = n + 1; else { if (!(i > e)) { for (; S(t[n - 1], e);) n--; return n } o = n - 1 } return e >= t[n] ? n : n - 1 } function A(e) { return "number" == typeof e && !isNaN(e) } function E(e) { var t, n, i = e.length, r = 0; for (t = 0; i > t; t++) n = e[t], A(n) && r++; return r } function I(e) { return E(e) === e.length } function P(e) { var t, n, i, r = {}; for (t = 0; e.length > t; t++) n = e[t], i = n.options.name, i && (r[i] = n.range()); return r } function M(e, t, n, i) { var r, o, a, s, l, c = !1; if (n = n || {}, a = n.excluded = n.excluded || [], s = n.defaults = n.defaults || {}, l = n.depth = n.depth || 0, !(l > Rr)) { for (r in e)!ri(r, n.excluded) && e.hasOwnProperty(r) && (o = e[r], zn(o) ? (c = !0, i || (e[r] = vi(o(t), s[r]))) : typeof o === Zr && (n.defaults = s[r], n.depth++, c = M(o, t, n, i) || c, n.depth--)); return c } } function z(e, n) { var i, r, o, a = [], s = e.groupNameTemplate, l = n.length; if (0 === l) return o = Pn({}, e), o.visibleInLegend = !1, [o]; for (di(s) ? (Tn.logToConsole("'groupNameTemplate' is obsolete and will be removed in future versions. Specify the group name template as 'series.name'"), s && (i = Fn(s))) : (i = Fn(e.name || ""), 0 === i._slotCount && (i = Fn(di(e.name) ? "#= group.value #: #= series.name #" : "#= group.value #"))), r = 0; l > r; r++) o = Pn({}, e), zn(o.color) || (o.color = t), o._groupIx = r, a.push(o), i && (o.name = i({ series: o, group: n[r] })); return a } function F(e, t) { var n, i, r = []; for (t = [].concat(t), n = 0; e.length > n; n++) i = e[n], ri(i.type, t) && r.push(i); return r } function R(t, n) { if (t instanceof Date) { for (var i = 0, r = n.length; r > i; i++) if (S(n[i], t)) return i; return -1 } return e.inArray(t, n) } function H(e, t) { t = t || ni; for (var n = 1, i = e.length; i > n; n++) if (t(e[n], e[n - 1]) < 0) { e.sort(t); break } return e } function B(e, t) { var n, i = H(e, t), r = i.length, o = r > 0 ? [i[0]] : []; for (t = t || ni, n = 1; r > n; n++) 0 !== t(i[n], ui(o)) && o.push(i[n]); return o } function L(e, t) { var n = e.type, i = t instanceof Date; return !n && i || C(n, Ki) } function N(e) { var t, n, i, r, o = [], a = e.length; for (t = 0; a > t; t++) for (n = e[t], r = n.length, i = 0; r > i; i++) o[i] = o[i] || [], o[i].push(n[i]); return o } function O(e, t) { if (e.indexOf(".") > -1) for (var n, i = e.split("."), r = ""; i.length > 1;) r += i.shift(), n = Tn.getter(r)(t) || {}, Tn.setter(r)(t, n), r += "." } function V(e) { var t, n, i, r = e.data, o = 0; for (t = 0; r.length > t; t++) n = Q.current.bindPoint(e, t), i = n.valueFields.value, typeof i === So && (i = parseFloat(i)), A(i) && n.fields.visible !== !1 && (o += kn.abs(i)); return o } function U(e) { var t = e.overlay; return t && t.gradient && "none" != t.gradient } function W() { return this } function j(e) { for (var t = 0; e.length > t; t++) if (di(e[t].zIndex)) return !0 } function G() { this._defaultPrevented = !0 } function q(e, t) { if (e) for (var n = 0; e.length > n; n++) if (e[n].category === t) return [e[n]] } function $(e) { return di(e) && null !== e } var Y, Q, K, X, Z, J, et, tt, nt, it, rt, ot, at, st, lt, ct, dt, ut, ht, pt, ft, gt, mt, vt, _t, wt, bt, yt, kt, xt, Ct, St, Tt, Dt, At, Et, It, Pt, Mt, zt, Ft, Rt, Ht, Bt, Lt, Nt, Ot, Vt, Ut, Wt, jt, Gt, qt, $t, Yt, Qt, Kt, Xt, Zt, Jt, en, tn, nn, rn, on, an, sn, ln, cn, dn, un, hn, pn, fn, gn, mn, vn, _n = e.each, wn = e.isArray, bn = e.isPlainObject, yn = e.map, kn = Math, xn = e.noop, Cn = e.extend, Sn = e.proxy, Tn = window.kendo, Dn = Tn.Class, An = Tn.Observable, En = Tn.data.DataSource, In = Tn.ui.Widget, Pn = Tn.deepExtend, Mn = Tn.getter, zn = Tn.isFunction, Fn = Tn.template, Rn = Tn.dataviz, Hn = Rn.Axis, Bn = Rn.AxisLabel, Ln = Rn.Box2D, Nn = Rn.BoxElement, On = Rn.ChartElement, Vn = Tn.drawing.Color, Un = Rn.CurveProcessor, Wn = Rn.FloatElement, jn = Rn.Note, Gn = Rn.LogarithmicAxis, qn = Rn.NumericAxis, $n = Rn.Point2D, Yn = Rn.RootElement, Qn = Rn.Ring, Kn = Rn.ShapeElement, Xn = Rn.ShapeBuilder, Zn = Rn.TextBox, Jn = Rn.Title, ei = Rn.alignPathToPixel, ti = Rn.autoFormat, ni = Rn.dateComparer, ii = Rn.getSpacing, ri = Rn.inArray, oi = Rn.interpolateValue, ai = Rn.mwDelta, si = Rn.round, li = Tn.util, ci = li.append, di = li.defined, ui = li.last, hi = li.limitValue, pi = li.sparseArrayLimits, fi = li.sparseArrayMin, gi = li.sparseArrayMax, mi = li.renderTemplate, vi = li.valueOrDefault, _i = Rn.geometry, wi = Rn.drawing, bi = ".kendoChart", yi = "above", ki = "area", xi = "auto", Ci = "fit", Si = Rn.AXIS_LABEL_CLICK, Ti = "bar", Di = 6, Ai = .8, Ei = "below", Ii = "#000", Pi = "both", Mi = "bottom", zi = "boxPlot", Fi = "bubble", Ri = "bullet", Hi = "candlestick", Bi = "category", Li = "center", Ni = "change", Oi = "circle", Vi = "contextmenu" + bi, Ui = Rn.CLIP, Wi = "color", ji = "column", Gi = Rn.COORD_PRECISION, qi = "cross", $i = "k-", Yi = "custom", Qi = "dataBound", Ki = "date", Xi = "days", Zi = Rn.DEFAULT_FONT, Ji = Rn.DEFAULT_HEIGHT, er = Rn.DEFAULT_PRECISION, tr = Rn.DEFAULT_WIDTH, nr = 4, ir = "donut", rr = 50, or = "drag", ar = "dragEnd", sr = "dragStart", lr = "errorLow", cr = "errorHigh", dr = "xErrorLow", ur = "xErrorHigh", hr = "yErrorLow", pr = "yErrorHigh", fr = "fadeIn", gr = "first", mr = "from", vr = "funnel", _r = "glass", wr = "horizontal", br = "horizontalWaterfall", yr = "hours", kr = Rn.INITIAL_ANIMATION_DURATION, xr = "insideBase", Cr = "insideEnd", Sr = "interpolate", Tr = "leave", Dr = "left", Ar = "legendItemClick", Er = "legendItemHover", Ir = "line", Pr = 8, Mr = "linear", zr = "log", Fr = "max", Rr = 5, Hr = Number.MAX_VALUE, Br = "min", Lr = -Number.MAX_VALUE, Nr = "minutes", Or = "months", Vr = "mouseleave" + bi, Ur = "mousemove.tracking", Wr = "mouseover" + bi, jr = "mouseout" + bi, Gr = "mousemove" + bi, qr = 20, $r = 150, Yr = "DOMMouseScroll" + bi + " mousewheel" + bi, Qr = Rn.NOTE_CLICK, Kr = Rn.NOTE_HOVER, Xr = "noteText", Zr = "object", Jr = "ohlc", eo = "outsideEnd", to = "pie", no = 70, io = "plotAreaClick", ro = "pointer", oo = "rangeBar", ao = "rangeColumn", so = "render", lo = "right", co = "roundedBevel", uo = "roundedGlass", ho = "scatter", po = "scatterLine", fo = "seconds", go = "selectStart", mo = "select", vo = "selectEnd", _o = "seriesClick", wo = "seriesHover", bo = .001, yo = "step", ko = "smooth", xo = "stderr", Co = "stddev", So = "string", To = "summary", Do = 1e3, Ao = 60 * Do, Eo = 60 * Ao, Io = 24 * Eo, Po = 7 * Io, Mo = 31 * Io, zo = 365 * Io, Fo = { years: zo, months: Mo, weeks: Po, days: Io, hours: Eo, minutes: Ao, seconds: Do }, Ro = "to", Ho = "top", Bo = 150, Lo = 5, No = 100, Oo = 100, Vo = "chart-tooltip-inverse", Uo = "value", Wo = "verticalArea", jo = "verticalBullet", Go = "verticalLine", qo = "waterfall", $o = "weeks", Yo = "#fff", Qo = "x", Ko = "y", Xo = "years", Zo = "zero", Jo = 3, ea = "zoomStart", ta = "zoom", na = "zoomEnd", ia = [fo, Nr, yr, Xi, $o, Or, Xo], ra = [Ti, ji, Jr, Hi, zi, Ri, ao, oo, qo, br], oa = { seconds: "HH:mm:ss", minutes: "HH:mm", hours: "HH:mm", days: "M/d", weeks: "M/d", months: "MMM 'yy", years: "yyyy" }, aa = In.extend({ init: function(e, n) { var i, r, o = this; Tn.destroy(e), In.fn.init.call(o, e), o.element.addClass($i + this.options.name.toLowerCase()).css("position", "relative"), n && (r = n.dataSource, n.dataSource = t), i = Pn({}, o.options, n), o._originalOptions = Pn({}, i), o._initTheme(i), o._initSurface(), o.bind(o.events, o.options), o.wrapper = o.element, n && (n.dataSource = r), o._initDataSource(n), Tn.notify(o, Rn.ui) }, _initTheme: function(n) { var i, r = this, o = Rn.ui.themes || {}, l = n.theme, c = o[l] || o[l.toLowerCase()], d = l && c ? c.chart : {}, u = [], h = n.series || []; for (i = 0; h.length > i; i++) u.push(e.extend({}, h[i])); n.series = u, s(n), r._applyDefaults(n, d), null === n.seriesColors && (n.seriesColors = t), r.options = Pn({}, d, n), a(r.options) }, _initDataSource: function(e) { var t = this, n = (e || {}).dataSource; t._dataChangeHandler = Sn(t._onDataChanged, t), t.dataSource = En.create(n).bind(Ni, t._dataChangeHandler), t._bindCategories(), n && (t._hasDataSource = !0), t._redraw(), t._attachEvents(), n && t.options.autoBind && t.dataSource.fetch() }, setDataSource: function(e) { var t = this; t.dataSource.unbind(Ni, t._dataChangeHandler), t.dataSource = e = En.create(e), t._hasDataSource = !0, t._hasData = !1, e.bind(Ni, t._dataChangeHandler), t.options.autoBind && e.fetch() }, events: [Qi, _o, wo, Si, Ar, Er, io, sr, or, ar, ea, ta, na, go, mo, vo, Qr, Kr, so], items: function() { return e() }, options: { name: "Chart", renderAs: "", theme: "default", chartArea: {}, legend: { visible: !0, labels: {} }, categoryAxis: {}, autoBind: !0, seriesDefaults: { type: ji, data: [], highlight: { visible: !0 }, labels: {}, negativeValues: { visible: !1 } }, series: [], seriesColors: null, tooltip: { visible: !1 }, transitions: !0, valueAxis: {}, plotArea: {}, title: {}, xAxis: {}, yAxis: {}, panes: [{}] }, refresh: function() { var e = this; e._applyDefaults(e.options), a(e.options), e._bindSeries(), e._bindCategories(), e.trigger(Qi), e._redraw() }, getSize: function() { return Tn.dimensions(this.element) }, _resize: function() { var e = this.options.transitions; this.options.transitions = !1, this._redraw(), this.options.transitions = e }, redraw: function(e) { var t, n, i = this; i._applyDefaults(i.options), a(i.options), e ? (n = i._model._plotArea, t = n.findPane(e), n.redraw(t)) : i._redraw() }, getAxis: function(e) { var t, n = this._plotArea.axes; for (t = 0; n.length > t; t++) if (n[t].options.name === e) return new vn(n[t]) }, toggleHighlight: function(e, t) { var n, i, r, o, a = this._plotArea, s = this._highlight, l = (a.srcSeries || a.series || [])[0]; if (bn(t) ? (n = t.series, i = t.category) : n = i = t, r = l.type === ir ? q(a.pointsBySeriesName(n), i) : l.type === to || l.type === vr ? q((a.charts[0] || {}).points, i) : a.pointsBySeriesName(n)) for (o = 0; r.length > o; o++) s.togglePointHighlight(r[o], e) }, _initSurface: function() { var e = this.surface, t = this._surfaceWrap(), n = this.options.chartArea; n.width && t.css("width", n.width), n.height && t.css("height", n.height), e && e.options.type === this.options.renderAs ? (this.surface.clear(), this.surface.resize()) : (e && e.destroy(), this.surface = wi.Surface.create(t, { type: this.options.renderAs })) }, _surfaceWrap: function() { return this.element }, _redraw: function() { var e, t = this, n = t._getModel(); t._destroyView(), t._model = n, t._plotArea = n._plotArea, n.renderVisual(), this.options.transitions !== !1 && n.traverse(function(e) { e.animation && e.animation.setup() }), t._initSurface(), t.surface.draw(n.visual), this.options.transitions !== !1 && n.traverse(function(e) { e.animation && e.animation.play() }), t._tooltip = t._createTooltip(), t._highlight = new ln(e), t._setupSelection(), t._hasDataSource && !t._hasData && t.options.autoBind || t.trigger(so) }, exportVisual: function() { return this.surface.exportVisual() }, _sharedTooltip: function() { var e = this, t = e.options; return e._plotArea instanceof en && t.tooltip.shared }, _createTooltip: function() { var e, t = this, n = t.options, i = t.element; return e = t._sharedTooltip() ? new un(i, t._plotArea, n.tooltip) : new dn(i, n.tooltip), e.bind(Tr, Sn(t._tooltipleave, t)), e }, _tooltipleave: function() { var e = this, t = e._plotArea, n = e._highlight; t.hideCrosshairs(), n.hide() }, _applyDefaults: function(e, t) { l(e, t), r(e, t) }, _getModel: function() { var e, t = this, n = t.options, i = new Yn(t._modelOptions()); return i.chart = t, Jn.buildTitle(n.title, i), e = i._plotArea = t._createPlotArea(), n.legend.visible && i.append(new J(e.options.legend)), i.append(e), i.reflow(), i }, _modelOptions: function() { var e = this, t = e.options, n = e.element, i = kn.floor(n.height()), r = kn.floor(n.width()); return e._size = null, Pn({ width: r || tr, height: i || Ji, transitions: t.transitions }, t.chartArea) }, _createPlotArea: function(e) { var t = this, n = t.options; return Y.current.create(e ? [] : n.series, n) }, _setupSelection: function() { var e, t, n, i, r, o, a = this, s = a._plotArea, l = s.axes, c = a._selections = []; for (a._selectStartHandler || (a._selectStartHandler = Sn(a._selectStart, a), a._selectHandler = Sn(a._select, a), a._selectEndHandler = Sn(a._selectEnd, a)), t = 0; l.length > t; t++) n = l[t], o = n.options, n instanceof et && o.select && !o.vertical && (i = 0, r = o.categories.length - 1, n instanceof tt && (i = o.categories[i], r = o.categories[r]), o.justified || (n instanceof tt ? r = g(r, 1, o.baseUnit, o.weekStartDay) : r++), e = new gn(a, n, Pn({ min: i, max: r }, o.select)), e.bind(go, a._selectStartHandler), e.bind(mo, a._selectHandler), e.bind(vo, a._selectEndHandler), c.push(e)) }, _selectStart: function(e) { return this.trigger(go, e) }, _select: function(e) { return this.trigger(mo, e) }, _selectEnd: function(e) { return this.trigger(vo, e) }, _attachEvents: function() { var e = this, t = e.element; t.on(Vi, Sn(e._click, e)), t.on(Wr, Sn(e._mouseover, e)), t.on(jr, Sn(e._mouseout, e)), t.on(Yr, Sn(e._mousewheel, e)), t.on(Vr, Sn(e._mouseleave, e)), e._mousemove = Tn.throttle(Sn(e._mousemove, e), qr), e._shouldAttachMouseMove() && t.on(Gr, e._mousemove), Tn.UserEvents && (e._userEvents = new Tn.UserEvents(t, { global: !0, filter: ":not(.k-selector)", multiTouch: !1, tap: Sn(e._tap, e), start: Sn(e._start, e), move: Sn(e._move, e), end: Sn(e._end, e) })) }, _mouseout: function(e) { var t = this, n = t._getChartElement(e); n && n.leave && n.leave(t, e) }, _start: function(e) { var t = this, n = t._events; di(n[sr] || n[or] || n[ar]) && t._startNavigation(e, sr) }, _move: function(e) { var t, n, i, r, o, a, s = this, l = s._navState, c = {}; if (l) { for (e.preventDefault(), t = l.axes, n = 0; t.length > n; n++) i = t[n], r = i.options.name, r && (o = i.options.vertical ? e.y : e.x, a = o.startLocation - o.location, 0 !== a && (c[i.options.name] = i.translateRange(a))); l.axisRanges = c, s.trigger(or, { axisRanges: c, originalEvent: e }) } }, _end: function(e) { this._endNavigation(e, ar) }, _mousewheel: function(e) { var t, n, i, r, o, a, s = this, l = e.originalEvent, c = ai(e), d = s._navState, u = {}; if (d || (t = s._startNavigation(l, ea), t || (d = s._navState)), d) { for (n = d.totalDelta || c, d.totalDelta = n + c, i = s._navState.axes, r = 0; i.length > r; r++) o = i[r], a = o.options.name, a && (u[a] = o.scaleRange(-n)); s.trigger(ta, { delta: c, axisRanges: u, originalEvent: e }), s._mwTimeout && clearTimeout(s._mwTimeout), s._mwTimeout = setTimeout(function() { s._endNavigation(e, na) }, $r) } }, _startNavigation: function(e, t) { var n, i, r, o = this, a = o._eventCoordinates(e), s = o._model._plotArea, l = s.findPointPane(a), c = s.axes.slice(0), d = !1; if (l) { for (n = 0; c.length > n; n++) if (i = c[n], i.box.containsPoint(a)) { d = !0; break }!d && s.backgroundBox().containsPoint(a) && (r = o.trigger(t, { axisRanges: P(c), originalEvent: e }), r ? o._userEvents.cancel() : (o._suppressHover = !0, o._unsetActivePoint(), o._navState = { pane: l, axes: c })) } }, _endNavigation: function(e, t) { var n = this; n._navState && (n.trigger(t, { axisRanges: n._navState.axisRanges, originalEvent: e }), n._suppressHover = !1, n._navState = null) }, _getChartElement: function(e, n) { var i, r = this.surface.eventTarget(e); if (r) { for (; r && !i;) i = r.chartElement, r = r.parent; return i ? (i.aliasFor && (i = i.aliasFor(e, this._eventCoordinates(e))), n && (i = i.closest(n)), i) : t } }, _eventCoordinates: function(e) { var t = this, n = di((e.x || {}).client), i = n ? e.x.client : e.clientX, r = n ? e.y.client : e.clientY; return t._toModelCoordinates(i, r) }, _toModelCoordinates: function(t, n) { var i = this.element, r = i.offset(), o = parseInt(i.css("paddingLeft"), 10), a = parseInt(i.css("paddingTop"), 10), s = e(window); return new $n(t - r.left - o + s.scrollLeft(), n - r.top - a + s.scrollTop()) }, _tap: function(e) { var t = this, n = t._getChartElement(e); t._activePoint === n ? t._click(e) : (t._startHover(e) || t._unsetActivePoint(), t._click(e)) }, _click: function(e) { for (var t = this, n = t._getChartElement(e); n;) n.click && n.click(t, e), n = n.parent }, _startHover: function(e) { var n, i = this, r = i._getChartElement(e), o = i._tooltip, a = i._highlight, s = i.options.tooltip; if (!i._suppressHover && a && !a.isHighlighted(r) && !i._sharedTooltip()) return n = i._getChartElement(e, function(e) { return e.hover }), n && !n.hover(i, e) ? (i._activePoint = n, s = Pn({}, s, n.options.tooltip), s.visible && o.show(n), a.show(n), n.tooltipTracking) : t }, _mouseover: function(t) { var n = this; n._startHover(t) && e(document).on(Ur, Sn(n._mouseMoveTracking, n)) }, _mouseMoveTracking: function(t) { var n, i, r = this, o = r.options, a = r._tooltip, s = r._highlight, l = r._eventCoordinates(t), c = r._activePoint; r._plotArea.box.containsPoint(l) ? c && c.tooltipTracking && c.series && c.parent.getNearestPoint && (i = c.parent.getNearestPoint(l.x, l.y, c.seriesIx), i && i != c && (i.hover(r, t), r._activePoint = i, n = Pn({}, o.tooltip, c.options.tooltip), n.visible && a.show(i), s.show(i))) : (e(document).off(Ur), r._unsetActivePoint()) }, _mousemove: function(e) { var t = this._eventCoordinates(e); this._trackCrosshairs(t), this._sharedTooltip() && this._trackSharedTooltip(t, e) }, _trackCrosshairs: function(e) { var t, n, i = this._plotArea.crosshairs; for (t = 0; i.length > t; t++) n = i[t], n.box.containsPoint(e) ? n.showAt(e) : n.hide() }, _trackSharedTooltip: function(t, n) { var i, r, o, a, s = this, l = s.options, c = s._plotArea, d = c.categoryAxis, u = s._tooltip, h = l.tooltip, p = s._highlight; c.box.containsPoint(t) && (i = d.pointCategoryIndex(t), i !== s._tooltipCategoryIx && (r = c.pointsByCategoryIndex(i), o = e.map(r, function(e) { return e.eventArgs(n) }), a = o[0] || {}, a.categoryPoints = o, r.length > 0 && !this.trigger(wo, a) ? (h.visible && u.showAt(r, t), p.show(r)) : u.hide(), s._tooltipCategoryIx = i)) }, _mouseleave: function(t) { var n = this, i = n._plotArea, r = n._tooltip, o = n._highlight, a = t.relatedTarget; a && e(a).closest(r.element).length || (n._mousemove.cancel(), i.hideCrosshairs(), o.hide(), setTimeout(Sn(r.hide, r), Oo), n._tooltipCategoryIx = null) }, _unsetActivePoint: function() { var e = this, t = e._tooltip, n = e._highlight; e._activePoint = null, t && t.hide(), n && n.hide() }, _onDataChanged: function() { var e, t, n = this, i = n.options, r = n._sourceSeries || i.series, o = r.length, s = n.dataSource.view(), l = (n.dataSource.group() || []).length > 0, c = []; for (e = 0; o > e; e++) t = r[e], n._isBindable(t) && l ? ci(c, z(t, s)) : c.push(t || []); n._sourceSeries = r, i.series = c, a(n.options), n._bindSeries(), n._bindCategories(), n._hasData = !0, n._deferRedraw() }, _deferRedraw: function() { var e = this; Tn.support.vml ? (e._clearRedrawTimeout(), e._redrawTimeout = setTimeout(function() { e.surface && (e.trigger(Qi), e._redraw()) }, 0)) : (e.trigger(Qi), e._redraw()) }, _clearRedrawTimeout: function() { this._redrawTimeout && (clearInterval(this._redrawTimeout), this._redrawTimeout = null) }, _bindSeries: function() { var e, t, n, i, r = this, o = r.dataSource.view(), a = r.options.series, s = a.length; for (e = 0; s > e; e++) t = a[e], r._isBindable(t) && (n = t._groupIx, i = di(n) ? (o[n] || {}).items : o, t.autoBind !== !1 && (t.data = i)) }, _bindCategories: function() { var e, t, n = this, i = n.dataSource.view() || [], r = (n.dataSource.group() || []).length > 0, o = i, a = n.options, s = [].concat(a.categoryAxis); for (r && i.length && (o = i[0].items), e = 0; s.length > e; e++) t = s[e], t.autoBind !== !1 && n._bindCategoryAxis(t, o, e) }, _bindCategoryAxis: function(e, t, n) { var i, r, o, a = (t || []).length; if (e.field) for (e.categories = [], i = 0; a > i; i++) o = t[i], r = u(e.field, o), 0 === i ? (e.categories = [r], e.dataItems = [o]) : (e.categories.push(r), e.dataItems.push(o)); else this._bindCategoryAxisFromSeries(e, n) }, _bindCategoryAxisFromSeries: function(e, t) { var n, i, r, o, a, s, l, c, d, p, f, g = this, m = [], v = g.options.series, _ = v.length, w = {}; for (i = 0; _ > i; i++) if (r = v[i], o = r.categoryAxis === e.name || !r.categoryAxis && 0 === t, a = r.data, l = a.length, r.categoryField && o && l > 0) for (f = L(e, u(r.categoryField, a[0])), p = f ? h : u, s = 0; l > s; s++) c = a[s], d = p(r.categoryField, c), (f || !w[d]) && (m.push([d, c]), f || (w[d] = !0)); m.length > 0 && (f && (m = B(m, function(e, t) { return ni(e[0], t[0]) })), n = N(m), e.categories = n[0], e.dataItems = n[1]) }, _isBindable: function(e) { var t, n, i = Q.current.valueFields(e), r = !0; for (n = 0; i.length > n; n++) if (t = i[n], t === Uo ? t = "field" : t += "Field", !di(e[t])) { r = !1; break } return r }, _legendItemClick: function(e, t) { var n, i, r, o = this, a = o._plotArea, s = (a.srcSeries || a.series)[e], l = (o._sourceSeries || [])[e] || s; ri(s.type, [to, ir, vr]) ? (r = l.data[t], i = di(r.visible) ? !r.visible : !1, r.visible = i) : (i = !l.visible, l.visible = i, s.visible = i), o.options.transitions && (o.options.transitions = !1, n = !0), o.redraw(), n && (o.options.transitions = !0) }, _legendItemHover: function(e, t) { var n, i, r = this, o = r._plotArea, a = r._highlight, s = (o.srcSeries || o.series)[e]; n = ri(s.type, [to, ir, vr]) ? t : e, i = o.pointsBySeriesIndex(n), a.show(i) }, _shouldAttachMouseMove: function() { var e = this; return e._plotArea.crosshairs.length || e._tooltip && e._sharedTooltip() }, setOptions: function(n) { var i = this, r = n.dataSource; n.dataSource = t, i._originalOptions = Pn(i._originalOptions, n), i.options = Pn({}, i._originalOptions), i._sourceSeries = null, e(document).off(Gr), In.fn._setEvents.call(i, n), i._initTheme(i.options), r && i.setDataSource(r), i._hasDataSource ? i.refresh() : (i._bindCategories(), i.redraw()), i._shouldAttachMouseMove() && i.element.on(Gr, i._mousemove) }, destroy: function() { var t = this, n = t.dataSource; t.element.off(bi), n.unbind(Ni, t._dataChangeHandler), e(document).off(Ur), t._userEvents && t._userEvents.destroy(), t._destroyView(), t.surface.destroy(), t.surface = null, t._clearRedrawTimeout(), In.fn.destroy.call(t) }, _destroyView: function() { var e = this, t = e._model, n = e._selections; if (t && (t.destroy(), e._model = null), n) for (; n.length > 0;) n.shift().destroy(); e._unsetActivePoint(), e._tooltip && e._tooltip.destroy(), e._highlight && e._highlight.destroy() } }); Rn.ExportMixin.extend(aa.fn), Tn.PDFMixin && Tn.PDFMixin.extend(aa.fn), Y = Dn.extend({ init: function() { this._registry = [] }, register: function(e, t) { this._registry.push({ type: e, seriesTypes: t }) }, create: function(e, t) { var n, i, r, o = this._registry, a = o[0]; for (n = 0; o.length > n; n++) if (i = o[n], r = F(e, i.seriesTypes), r.length > 0) { a = i; break } return new a.type(r, t) } }), Y.current = new Y, Q = Dn.extend({ init: function() { this._valueFields = {}, this._otherFields = {}, this._nullValue = {}, this._undefinedValue = {} }, register: function(e, n, i) { var r, o, a = this; for (n = n || [Uo], r = 0; e.length > r; r++) o = e[r], a._valueFields[o] = n, a._otherFields[o] = i, a._nullValue[o] = a._makeValue(n, null), a._undefinedValue[o] = a._makeValue(n, t) }, canonicalFields: function(e) { return this.valueFields(e).concat(this.otherFields(e)) }, valueFields: function(e) { return this._valueFields[e.type] || [Uo] }, otherFields: function(e) { return this._otherFields[e.type] || [Uo] }, bindPoint: function(e, t) { var n, i, r, o, a, s = this, l = e.data, c = l[t], d = { valueFields: { value: c } }, u = s.valueFields(e), h = s._otherFields[e.type]; return null === c ? a = s._nullValue[e.type] : di(c) ? wn(c) ? (i = c.slice(u.length), a = s._bindFromArray(c, u), n = s._bindFromArray(i, h)) : typeof c === Zr && (r = s.sourceFields(e, u), o = s.sourceFields(e, h), a = s._bindFromObject(c, u, r), n = s._bindFromObject(c, h, o)) : a = s._undefinedValue[e.type], di(a) && (1 === u.length ? d.valueFields.value = a[u[0]] : d.valueFields = a), d.fields = n || {}, d }, _makeValue: function(e, t) { var n, i, r = {}, o = e.length; for (n = 0; o > n; n++) i = e[n], r[i] = t; return r }, _bindFromArray: function(e, t) { var n, i, r = {}; if (t) for (i = kn.min(t.length, e.length), n = 0; i > n; n++) r[t[n]] = e[n]; return r }, _bindFromObject: function(e, t, n) { var i, r, o, a, s = {}; if (t) for (r = t.length, n = n || t, i = 0; r > i; i++) o = t[i], a = n[i], s[o] = u(a, e); return s }, sourceFields: function(e, t) { var n, i, r, o, a; if (t) for (i = t.length, o = [], n = 0; i > n; n++) r = t[n], a = r === Uo ? "field" : r + "Field", o.push(e[a] || r); return o } }), Q.current = new Q, K = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), this.textBox = new Zn(e, n.options), n.append(this.textBox) }, options: { position: eo, margin: ii(3), padding: ii(4), color: Ii, background: "", border: { width: 1, color: "" }, aboveAxis: !0, vertical: !1, animation: { type: fr, delay: kr }, zIndex: 2 }, createVisual: function() { this.textBox.options.noclip = this.options.noclip }, reflow: function(e) { var t = this, n = t.options, i = n.vertical, r = n.aboveAxis, o = t.children[0], a = o.box, s = o.options.padding; o.options.align = i ? Li : Dr, o.options.vAlign = i ? Ho : Li, n.position == Cr ? i ? (o.options.vAlign = Ho, !r && a.height() < e.height() && (o.options.vAlign = Mi)) : o.options.align = r ? lo : Dr : n.position == Li ? (o.options.vAlign = Li, o.options.align = Li) : n.position == xr ? i ? o.options.vAlign = r ? Mi : Ho : o.options.align = r ? Dr : lo : n.position == eo && (i ? e = r ? new Ln(e.x1, e.y1 - a.height(), e.x2, e.y1) : new Ln(e.x1, e.y2, e.x2, e.y2 + a.height()) : (o.options.align = Li, e = r ? new Ln(e.x2, e.y1, e.x2 + a.width(), e.y2) : new Ln(e.x1 - a.width(), e.y1, e.x1, e.y2))), n.rotation || (i ? s.left = s.right = (e.width() - o.contentBox.width()) / 2 : s.top = s.bottom = (e.height() - o.contentBox.height()) / 2), o.reflow(e) }, alignToClipBox: function(e) { var t, n = this, i = n.options.vertical, r = i ? Ko : Qo, o = r + "1", a = r + "2", s = n.children[0], l = n.parent.box; (e[o] > l[o] || l[a] > e[a]) && (t = s.paddingBox.clone(), t[o] = kn.max(l[o], e[o]), t[a] = kn.min(l[a], e[a]), this.reflow(t)) } }), X = Nn.extend({ init: function(e) { var t = this; Nn.fn.init.call(t, e), t.createContainer(), t.createMarker(), t.createLabel() }, createContainer: function() { var e = this; e.container = new Wn({ vertical: !1, wrap: !1, align: Li }), e.append(e.container) }, createMarker: function() { this.container.append(new Kn(this.markerOptions())) }, markerOptions: function() { var e = this.options, t = e.markerColor; return Pn({}, e.markers, { background: t, border: { color: t } }) }, createLabel: function() { var e = this, t = e.options, n = Pn({}, t.labels); e.container.append(new Zn(t.text, n)) }, renderComplete: function() { var e, t; On.fn.renderComplete.call(this), e = this.options.cursor || {}, t = this._itemOverlay = wi.Path.fromRect(this.container.box.toRect(), { fill: { color: Yo, opacity: 0 }, stroke: null, cursor: e.style || e }), this.appendVisual(t) }, click: function(e, t) { var n = this.eventArgs(t); e.trigger(Ar, n) || (t.preventDefault(), e._legendItemClick(n.seriesIndex, n.pointIndex)) }, hover: function(e, t) { var n = this.eventArgs(t); return e.trigger(Er, n) || (t.preventDefault(), e._legendItemHover(n.seriesIndex, n.pointIndex)), !0 }, leave: function(e) { e._unsetActivePoint() }, eventArgs: function(t) { var n = this.options; return { element: e(t.target), text: n.text, series: n.series, seriesIndex: n.series.index, pointIndex: n.pointIndex } }, renderVisual: function() { var e = this, t = e.options, n = t.visual; n ? (e.visual = n({ active: t.active, series: t.series, options: { markers: e.markerOptions(), labels: t.labels }, createVisual: function() { On.fn.renderVisual.call(e); var t = e.visual; return delete e.visual, t } }), this.addVisual()) : On.fn.renderVisual.call(e) } }), Z = On.extend({ render: function() { { var e, t, n = this.children, i = this.options, r = i.vertical; this.visual = new wi.Layout(null, { spacing: r ? 0 : i.spacing, lineSpacing: r ? i.spacing : 0, orientation: r ? "vertical" : "horizontal" }) } for (t = 0; n.length > t; t++) e = n[t], e.reflow(new Ln), e.renderVisual() }, reflow: function(e) { this.visual.rect(e.toRect()), this.visual.reflow(); var t = this.visual.clippedBBox(); this.box = t ? Rn.rectToBox(t) : new Ln }, renderVisual: function() { this.addVisual() }, createVisual: xn }), J = On.extend({ init: function(e) { var t = this; On.fn.init.call(t, e), ri(t.options.position, [Ho, lo, Mi, Dr, Yi]) || (t.options.position = lo), t.createContainer(), t.createItems() }, options: { position: lo, items: [], labels: { margin: { left: 6 } }, offsetX: 0, offsetY: 0, margin: ii(5), padding: ii(5), border: { color: Ii, width: 0 }, item: { cursor: ro }, spacing: 6, background: "", zIndex: 1, markers: { border: { width: 1 }, width: 7, height: 7, type: "rect", align: Dr, vAlign: Li } }, createContainer: function() { var e = this, t = e.options, n = t.align, i = t.position, r = i, o = Li; i == Yi ? r = Dr : ri(i, [Ho, Mi]) ? (r = "start" == n ? Dr : "end" == n ? lo : Li, o = i) : n && ("start" == n ? o = Ho : "end" == n && (o = Mi)), e.container = new Nn({ margin: t.margin, padding: t.padding, background: t.background, border: t.border, vAlign: o, align: r, zIndex: t.zIndex, shrinkToFit: !0 }), e.append(e.container) }, createItems: function() { var e, t, n, i = this, r = i.options, o = r.items, a = o.length, s = i.isVertical(); for (e = new Z({ vertical: s, spacing: r.spacing }), r.reverse && (o = o.slice(0).reverse()), t = 0; a > t; t++) n = o[t], e.append(new X(Pn({}, { markers: r.markers, labels: r.labels }, r.item, n))); e.render(), i.container.append(e) }, isVertical: function() { var e = this, t = e.options, n = t.orientation, i = t.position, r = i == Yi && n != wr || (di(n) ? n != wr : ri(i, [Dr, lo])); return r }, hasItems: function() { return this.container.children[0].children.length > 0 }, reflow: function(e) { var n = this, i = n.options; return e = e.clone(), n.hasItems() ? (i.position === Yi ? (n.containerCustomReflow(e), n.box = e) : n.containerReflow(e), t) : (n.box = e, t) }, containerReflow: function(e) { var t, n = this, i = n.options, r = i.position, o = r == Ho || r == Mi ? Qo : Ko, a = e.clone(), s = n.container, l = i.width, c = i.height, d = n.isVertical(), u = e.clone(); (r == Dr || r == lo) && (a.y1 = u.y1 = 0), d && c ? (a.y2 = a.y1 + c, a.align(u, Ko, s.options.vAlign)) : !d && l && (a.x2 = a.x1 + l, a.align(u, Qo, s.options.align)), s.reflow(a), a = s.box, t = a.clone(), (i.offsetX || i.offsetY) && (a.translate(i.offsetX, i.offsetY), n.container.reflow(a)), t[o + 1] = e[o + 1], t[o + 2] = e[o + 2], n.box = t }, containerCustomReflow: function(e) { var t = this, n = t.options, i = n.offsetX, r = n.offsetY, o = t.container, a = n.width, s = n.height, l = t.isVertical(), c = e.clone(); l && s ? c.y2 = c.y1 + s : !l && a && (c.x2 = c.x1 + a), o.reflow(c), c = o.box, o.reflow(Ln(i, r, i + c.width(), r + c.height())) }, renderVisual: function() { this.hasItems() && On.fn.renderVisual.call(this) } }), et = Hn.extend({ init: function(e) { var t = this; Hn.fn.init.call(t, e), e = t.options, e.categories = e.categories.slice(0), t._ticks = {} }, options: { type: Bi, categories: [], vertical: !1, majorGridLines: { visible: !1, width: 1, color: Ii }, labels: { zIndex: 1 }, justified: !1 }, range: function() { return { min: 0, max: this.options.categories.length } }, getTickPositions: function(e) { var t, n = this, i = n.options, r = i.vertical, o = i.justified, a = n.lineBox(), s = r ? a.height() : a.width(), l = e - (o ? 1 : 0), c = s / l, d = r ? Ko : Qo, u = a[d + 1], h = []; for (t = 0; e > t; t++) h.push(si(u, Gi)), u += c; return o || h.push(a[d + 2]), i.reverse ? h.reverse() : h }, getMajorTickPositions: function() { return this.getTicks().majorTicks }, getMinorTickPositions: function() { return this.getTicks().minorTicks }, getTicks: function() { var e, t = this, n = t._ticks, i = t.options, r = i.categories.length, o = i.reverse, a = i.justified, s = t.lineBox(); return e = s.getHash() + r + o + a, n._hash !== e && (n._hash = e, n.majorTicks = t.getTickPositions(r), n.minorTicks = t.getTickPositions(2 * r)), n }, getSlot: function(e, t) { var n, i, r, o = this, a = o.options, s = o.getTicks().majorTicks, l = a.reverse, c = a.justified, d = a.vertical ? Ko : Qo, u = o.lineBox(), h = u[d + (l ? 2 : 1)], p = u[d + (l ? 1 : 2)], f = u.clone(), g = kn.max(1, s.length - (c ? 0 : 1)), m = !di(t); return e = vi(e, 0), t = vi(t, e), e = hi(e, 0, g), t = hi(t - 1, e, g), t = kn.max(e, t), n = 0 === e ? h : s[e] || p, i = c ? n : s[t], r = t - e, (r > 0 || e === t) && (i = s[t + 1] || p), m && c && (e === g ? n = i : i = n), f[d + 1] = l ? i : n, f[d + 2] = l ? n : i, f }, pointCategoryIndex: function(e) { var t, n, i, r, o = this, a = o.options, s = a.reverse, l = a.vertical, c = l ? Ko : Qo, d = o.lineBox(), u = d[c + 1], h = d[c + 2], p = e[c], f = o.getMajorTickPositions(), g = Hr; if (u > p || p > h) return null; for (i = 0; f.length > i; i++) if (t = f[i], n = f[i + 1], di(n) || (n = s ? u : h), s && (t = n, n = f[i]), a.justified) { if (p === n) { r = kn.max(0, l ? f.length - i - 1 : i + 1); break } kn.abs(p - t) < g && (g = p - t, r = i) } else if (p >= t && n >= p) { r = i; break } return r }, getCategory: function(e) { var t = this.pointCategoryIndex(e); return null === t ? null : this.options.categories[t] }, categoryIndex: function(e) { return R(e, this.options.categories) }, translateRange: function(e) { var t = this, n = t.options, i = t.lineBox(), r = n.vertical ? i.height() : i.width(), o = n.categories.length, a = r / o, s = si(e / a, er); return { min: s, max: o + s } }, scaleRange: function(e) { var t = this, n = t.options, i = n.categories.length, r = e * i; return { min: -r, max: i + r } }, labelsCount: function() { return this.options.categories.length }, createAxisLabel: function(e, t) { var n = this, i = n.options, r = i.dataItems ? i.dataItems[e] : null, o = vi(i.categories[e], ""), a = n.axisLabelText(o, r, t); return new Bn(o, a, e, r, t) }, shouldRenderNote: function(e) { var t = this.options.categories; return t.length && t.length > e && e >= 0 } }), tt = et.extend({ init: function(e) { var t, n, i = this; e = e || {}, e = Pn({ roundToBaseUnit: !0 }, e, { categories: p(e.categories), min: p(e.min), max: p(e.max) }), e.categories && e.categories.length > 0 ? (t = (e.baseUnit || "").toLowerCase(), n = t !== Ci && !ri(t, ia), n && (e.baseUnit = i.defaultBaseUnit(e)), (t === Ci || e.baseUnitStep === xi) && i.autoBaseUnit(e), i.groupCategories(e)) : e.baseUnit = e.baseUnit || Xi, et.fn.init.call(i, e) }, options: { type: Ki, labels: { dateFormats: oa }, autoBaseUnitSteps: { seconds: [1, 2, 5, 15, 30], minutes: [1, 2, 5, 15, 30], hours: [1, 2, 3], days: [1, 2, 3], weeks: [1, 2], months: [1, 2, 3, 6], years: [1, 2, 3, 5, 10, 25, 50] }, maxDateGroups: 10 }, shouldRenderNote: function(e) { var t = this, n = t.range(), i = t.options.categories || []; return ni(e, n.min) >= 0 && ni(e, n.max) <= 0 && i.length }, parseNoteValue: function(e) { return p(e) }, translateRange: function(e) { var t, n, i = this, r = i.options, o = r.baseUnit, a = r.weekStartDay, s = i.lineBox(), l = r.vertical ? s.height() : s.width(), c = i.range(), d = l / (c.max - c.min), u = si(e / d, er); return c.min && c.max && (t = b(r.min || c.min, u), n = b(r.max || c.max, u), c = { min: g(t, 0, o, a), max: g(n, 0, o, a) }), c }, scaleRange: function(e) { var t, n = this, i = kn.abs(e), r = n.range(), o = r.min, a = r.max; if (r.min && r.max) { for (; i--;) r = w(o, a), t = kn.round(.1 * r), 0 > e ? (o = b(o, t), a = b(a, -t)) : (o = b(o, -t), a = b(a, t)); r = { min: o, max: a } } return r }, defaultBaseUnit: function(e) { var t, n, i, r, o, a = e.categories, s = di(a) ? a.length : 0, l = Hr; for (t = 0; s > t; t++) n = a[t], n && r && (i = w(n, r), i > 0 && (l = kn.min(l, i), o = l >= zo ? Xo : l >= Mo - 3 * Io ? Or : l >= Po ? $o : l >= Io ? Xi : l >= Eo ? yr : l >= Ao ? Nr : fo)), r = n; return o || Xi }, _categoryRange: function(e) { var t = e._range; return t || (t = e._range = pi(e)), t }, range: function(e) { var t, n, i, r, o, a, s, l, c; return e = e || this.options, t = e.categories, n = e.baseUnit === Ci, i = n ? ia[0] : e.baseUnit, r = e.baseUnitStep || 1, o = f(e.min), a = f(e.max), s = this._categoryRange(t), l = f(s.min), c = f(s.max), e.roundToBaseUnit ? { min: g(o || l, 0, i, e.weekStartDay), max: g(a || c, r, i, e.weekStartDay) } : { min: p(o || l), max: p(a || this._srcMaxDate || c) } }, autoBaseUnit: function(e) { for (var t, n, i, r = this, o = r.range(Pn({}, e, { baseUnitStep: 1 })), a = e.baseUnit === Ci, s = 0, l = a ? ia[s++] : e.baseUnit, c = o.max - o.min, d = c / Fo[l], u = d, h = e.maxDateGroups || r.options.maxDateGroups, p = Pn({}, r.options.autoBaseUnitSteps, e.autoBaseUnitSteps); !n || d > h;) if (t = t || p[l].slice(0), i = t.shift()) n = i, d = u / n; else { if (l === ui(ia)) { n = kn.ceil(u / h); break } if (!a) { d > h && (n = kn.ceil(u / h)); break } l = ia[s++] || ui(ia), u = c / Fo[l], t = null } e.baseUnitStep = n, e.baseUnit = l }, _timeScale: function() { var e, t, n, i = this, r = i.range(), o = i.options, a = i.lineBox(), s = o.vertical, l = s ? a.height() : a.width(); return o.justified && o._collapse !== !1 ? (t = this._categoryRange(o.categories), n = f(t.max), e = p(n) - r.min) : e = r.max - r.min, l / e }, getTickPositions: function(e) { var t, n, i, r, o, a, s, l, c, d, u, h, p, f, g, m = this, v = m.options, _ = v.categories, w = []; if (v.roundToBaseUnit || 0 === _.length) w = et.fn.getTickPositions.call(m, e); else { for (t = v.vertical, n = v.reverse, i = m.lineBox(), r = _[0].getTime(), o = vi(v._collapse, v.justified), a = _.length - (o ? 1 : 0), s = m._timeScale(), l = (t ? -1 : 1) * (n ? -1 : 1), c = 1 === l ? 1 : 2, d = 1 === l ? 2 : 1, u = i[(t ? Ko : Qo) + c], h = i[(t ? Ko : Qo) + d], p = u, f = 0; a > f; f++) g = _[f] - r, p = u + g * s * l, w.push(si(p, Gi)); ui(w) !== h && w.push(h) } return w }, groupCategories: function(e) { var t, n, i = this, r = e.categories, o = p(gi(r)), a = e.baseUnit, s = e.baseUnitStep || 1, l = i.range(e), c = l.max, d = []; for (t = l.min; c > t && (d.push(t), n = g(t, s, a, e.weekStartDay), !(n > o) || e.max); t = n); e.roundToBaseUnit || S(ui(d), c) || (n > c && e._collapse !== !1 ? this._srcMaxDate = c : d.push(c)), e.srcCategories = r, e.categories = d }, createAxisLabel: function(e, n) { var i, r, o = this.options, a = o.dataItems ? o.dataItems[e] : null, s = o.categories[e], l = o.baseUnit, c = !0, d = n.dateFormats[l]; return o.justified ? (i = v(s, l, o.weekStartDay), c = S(i, s)) : o.roundToBaseUnit || (c = !S(this.range().max, s)), c && (n.format = n.format || d, r = this.axisLabelText(s, a, n)) ? new Bn(s, r, e, a, n) : t }, categoryIndex: function(e, t) { var n, i, r = this, o = r.options, a = o.categories; return e = p(e), t = t || r.range(), n = o.roundToBaseUnit && S(t.max, e), e && (e > t.max || n) ? a.length : !e || t.min > e ? -1 : i = D(e, a) }, getSlot: function(e, t) { var n = this; return typeof e === Zr && (e = n.categoryIndex(e)), typeof t === Zr && (t = n.categoryIndex(t)), et.fn.getSlot.call(n, e, t) } }), nt = Hn.extend({ init: function(e, t, n) { var i = this; n = n || {}, Pn(n, { min: p(n.min), max: p(n.max), axisCrossingValue: p(n.axisCrossingValues || n.axisCrossingValue) }), n = i.applyDefaults(p(e), p(t), n), Hn.fn.init.call(i, n) }, options: { type: Ki, majorGridLines: { visible: !0, width: 1, color: Ii }, labels: { dateFormats: oa } }, applyDefaults: function(e, n, i) { var r = this, o = i.min || e, a = i.max || n, s = i.baseUnit || r.timeUnits(a - o), l = Fo[s], c = v(f(o) - 1, s) || p(a), d = _(f(a) + 1, s), u = i.majorUnit ? i.majorUnit : t, h = u || Rn.ceil(Rn.autoMajorUnit(c.getTime(), d.getTime()), l) / l, m = y(c, d, s), w = Rn.ceil(m, h), b = w - m, k = kn.floor(b / 2), x = b - k; return i.baseUnit || delete i.baseUnit, i.baseUnit = i.baseUnit || s, i.min = i.min || g(c, -k, s), i.max = i.max || g(d, x, s), i.minorUnit = i.minorUnit || h / 5, i.majorUnit = h, i }, range: function() { var e = this.options; return { min: e.min, max: e.max } }, getDivisions: function(e) { var t = this.options; return kn.floor(y(t.min, t.max, t.baseUnit) / e + 1) }, getTickPositions: function(e) { var t, n, i, r = this.options, o = r.vertical, a = r.reverse, s = this.lineBox(), l = (o ? -1 : 1) * (a ? -1 : 1), c = 1 === l ? 1 : 2, d = s[(o ? Ko : Qo) + c], u = this.getDivisions(e), h = r.max - r.min, p = o ? s.height() : s.width(), f = p / h, m = [d]; for (t = 1; u > t; t++) n = g(r.min, t * r.majorUnit, r.baseUnit), i = d + (n - r.min) * f * l, m.push(si(i, Gi)); return m }, getMajorTickPositions: function() { var e = this; return e.getTickPositions(e.options.majorUnit) }, getMinorTickPositions: function() { var e = this; return e.getTickPositions(e.options.minorUnit) }, getSlot: function(e, t, n) { return qn.fn.getSlot.call(this, p(e), p(t), n) }, getValue: function(e) { var t = qn.fn.getValue.call(this, e); return null !== t ? p(t) : null }, labelsCount: function() { return this.getDivisions(this.options.majorUnit) }, createAxisLabel: function(e, t) { var n, i, r = this.options, o = e * r.majorUnit, a = r.min; return o > 0 && (a = g(a, o, r.baseUnit)), n = t.dateFormats[r.baseUnit], t.format = t.format || n, i = this.axisLabelText(a, null, t), new Bn(a, i, e, null, t) }, timeUnits: function(e) { var t = yr; return e >= zo ? t = Xo : e >= Mo ? t = Or : e >= Po ? t = $o : e >= Io && (t = Xi), t }, translateRange: function(e) { var t = this, n = t.options, i = n.baseUnit, r = n.weekStartDay, o = t.lineBox(), a = n.vertical ? o.height() : o.width(), s = t.range(), l = a / (s.max - s.min), c = si(e / l, er), d = b(n.min, c), u = b(n.max, c); return { min: g(d, 0, i, r), max: g(u, 0, i, r) } }, scaleRange: function(e) { for (var t, n, i = this, r = i.options, o = kn.abs(e), a = r.min, s = r.max; o--;) t = w(a, s), n = kn.round(.1 * t), 0 > e ? (a = b(a, n), s = b(s, -n)) : (a = b(a, -n), s = b(s, n)); return { min: a, max: s } }, shouldRenderNote: function(e) { var t = this.range(); return ni(e, t.min) >= 0 && ni(e, t.max) <= 0 } }), it = On.extend({ options: { vertical: !1, gap: 0, spacing: 0 }, reflow: function(e) { var t, n, i = this, r = i.options, o = r.vertical, a = o ? Ko : Qo, s = i.children, l = r.gap, c = r.spacing, d = s.length, u = d + l + c * (d - 1), h = (o ? e.height() : e.width()) / u, p = e[a + 1] + h * (l / 2); for (n = 0; d > n; n++) t = (s[n].box || e).clone(), t[a + 1] = p, t[a + 2] = p + h, s[n].reflow(t), d - 1 > n && (p += h * c), p += h } }), rt = On.extend({ options: { vertical: !0 }, reflow: function(e) { var t, n, i, r = this.options, o = r.vertical, a = o ? Qo : Ko, s = this.children, l = this.box = new Ln, c = s.length; for (t = 0; c > t; t++) n = s[t], n.visible !== !1 && (i = n.box.clone(), i.snapTo(e, a), 0 === t && (l = this.box = i.clone()), n.reflow(i), l.wrap(i)) } }), ot = { click: function(e, t) { return e.trigger(_o, this.eventArgs(t)) }, hover: function(e, t) { return e.trigger(wo, this.eventArgs(t)) }, eventArgs: function(t) { return { value: this.value, percentage: this.percentage, category: this.category, series: this.series, dataItem: this.dataItem, runningTotal: this.runningTotal, total: this.total, element: e((t || {}).target), originalEvent: t, point: this } } }, at = { createNote: function() { var e = this, t = e.options.notes, n = e.noteText || t.label.text; t.visible !== !1 && di(n) && null !== n && (e.note = new jn(e.value, n, e.dataItem, e.category, e.series, e.options.notes), e.append(e.note)) } }, st = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n), n.options = t, n.color = t.color || Yo, n.aboveAxis = vi(n.options.aboveAxis, !0), n.value = e }, defaults: { border: { width: 1 }, vertical: !0, overlay: { gradient: _r }, labels: { visible: !1, format: "{0}" }, opacity: 1, notes: { label: {} } }, render: function() { this._rendered || (this._rendered = !0, this.createLabel(), this.createNote(), this.errorBar && this.append(this.errorBar)) }, createLabel: function() { var e, t, n = this.options, i = n.labels; i.visible && (i.template ? (t = Fn(i.template), e = t({ dataItem: this.dataItem, category: this.category, value: this.value, percentage: this.percentage, runningTotal: this.runningTotal, total: this.total, series: this.series })) : e = this.formatValue(i.format), this.label = new K(e, Pn({ vertical: n.vertical }, n.labels)), this.append(this.label)) }, formatValue: function(e) { return this.owner.formatPointValue(this, e) }, reflow: function(e) { var t, n, i, r; if (this.render(), t = this, n = t.options, i = t.label, t.box = e, i && (i.options.aboveAxis = t.aboveAxis, i.reflow(e)), t.note && t.note.reflow(e), t.errorBars) for (r = 0; t.errorBars.length > r; r++) t.errorBars[r].reflow(e) }, createVisual: function() { var e, t = this, n = t.box, i = t.options, r = i.visual; t.visible !== !1 && (On.fn.createVisual.call(t), r ? (e = this.rectVisual = r({ category: t.category, dataItem: t.dataItem, value: t.value, series: t.series, percentage: t.percentage, runningTotal: t.runningTotal, total: t.total, rect: n.toRect(), createVisual: function() { var e = new wi.Group; return t.createRect(e), e }, options: i }), e && t.visual.append(e)) : n.width() > 0 && n.height() > 0 && t.createRect(t.visual)) }, createRect: function(e) { var n = this.options, i = n.border, r = di(i.opacity) ? i.opacity : n.opacity, o = this.rectVisual = wi.Path.fromRect(this.box.toRect(), { fill: { color: this.color, opacity: n.opacity }, stroke: { color: this.getBorderColor(), width: i.width, opacity: r, dashType: i.dashType } }), a = this.box.width(), s = this.box.height(), l = n.vertical ? a : s; l > Di && (ei(o), (1 > a || 1 > s) && (o.options.stroke.lineJoin = "round")), e.append(o), U(n) && e.append(this.createGradientOverlay(o, { baseColor: this.color }, Pn({ end: n.vertical ? t : [0, 1] }, n.overlay))) }, createHighlight: function(e) { var t = wi.Path.fromRect(this.box.toRect(), e); return ei(t) }, highlightVisual: function() { return this.rectVisual }, highlightVisualArgs: function() { return { options: this.options, rect: this.box.toRect(), visual: this.rectVisual } }, getBorderColor: function() { var e = this, t = e.options, n = e.color, i = t.border, r = i.color, o = i._brightness || Ai; return di(r) || (r = new Vn(n).brightness(o).toHex()), r }, tooltipAnchor: function(e, t) { var n, i, r, o, a = this, s = a.options, l = a.box, c = s.vertical, d = a.aboveAxis, u = a.owner.pane.clipBox() || l; return c ? (n = l.x2 + Lo, i = d ? kn.max(l.y1, u.y1) : kn.min(l.y2, u.y2) - t) : (r = kn.max(l.x1, u.x1), o = kn.min(l.x2, u.x2), s.isStacked ? (n = d ? o - e : r, i = l.y1 - t - Lo) : (n = d ? o + Lo : r - e - Lo, i = l.y1)), new $n(n, i) } }), Pn(st.fn, ot), Pn(st.fn, at), lt = wi.Animation.extend({ options: { duration: kr }, setup: function() { var e, t, n, i = this.element, r = this.options, o = i.bbox(); o ? (e = this.origin = r.origin, t = r.vertical ? Ko : Qo, n = this.fromScale = new _i.Point(1, 1), n[t] = bo, i.transform(_i.transform().scale(n.x, n.y))) : this.abort() }, step: function(e) { var t = oi(this.fromScale.x, 1, e), n = oi(this.fromScale.y, 1, e); this.element.transform(_i.transform().scale(t, n, this.origin)) }, abort: function() { wi.Animation.fn.abort.call(this), this.element.transform(null) } }), wi.AnimationFactory.current.register(Ti, lt), ct = wi.Animation.extend({ options: { duration: 200, easing: Mr }, setup: function() { this.fadeTo = this.element.opacity(), this.element.opacity(0) }, step: function(e) { this.element.opacity(e * this.fadeTo) } }), wi.AnimationFactory.current.register(fr, ct), dt = function(e, t, n) { var i = this; i.initGlobalRanges(e, t, n) }, dt.prototype = dt.fn = { percentRegex: /percent(?:\w*)\((\d+)\)/, standardDeviationRegex: RegExp("^" + Co + "(?:\\((\\d+(?:\\.\\d+)?)\\))?$"), initGlobalRanges: function(e, t, n) { var i, r, o, a, s, l = this, c = t.data, d = l.standardDeviationRegex.exec(e); d ? (l.valueGetter = l.createValueGetter(t, n), i = l.getAverage(c), r = l.getStandardDeviation(c, i, !1), o = d[1] ? parseFloat(d[1]) : 1, a = { low: i.value - r * o, high: i.value + r * o }, l.globalRange = function() { return a }) : e.indexOf && e.indexOf(xo) >= 0 && (l.valueGetter = l.createValueGetter(t, n), s = l.getStandardError(c, l.getAverage(c)), l.globalRange = function(e) { return { low: e - s, high: e + s } }) }, createValueGetter: function(e, t) { var n, i, r, o = e.data, a = Q.current, s = a.valueFields(e), l = di(o[0]) ? o[0] : {}; return wn(l) ? (n = t ? R(t, s) : 0, r = Mn("[" + n + "]")) : A(l) ? r = Mn() : typeof l === Zr && (i = a.sourceFields(e, s), r = Mn(i[R(t, s)])), r }, getErrorRange: function(e, t) { var n, i, r, o, a = this; if (di(t)) { if (a.globalRange) return a.globalRange(e); if (wn(t)) n = e - t[0], i = e + t[1]; else if (A(r = parseFloat(t))) n = e - r, i = e + r; else { if (!(r = a.percentRegex.exec(t))) throw Error("Invalid ErrorBar value: " + t); o = e * (parseFloat(r[1]) / 100), n = e - kn.abs(o), i = e + kn.abs(o) } return { low: n, high: i } } }, getStandardError: function(e, t) { return this.getStandardDeviation(e, t, !0) / kn.sqrt(t.count) }, getStandardDeviation: function(e, t, n) { var i, r, o = 0, a = e.length, s = n ? t.count - 1 : t.count; for (r = 0; a > r; r++) i = this.valueGetter(e[r]), A(i) && (o += kn.pow(i - t.value, 2)); return kn.sqrt(o / s) }, getAverage: function(e) { var t, n, i = 0, r = 0, o = e.length; for (n = 0; o > n; n++) t = this.valueGetter(e[n]), A(t) && (i += t, r++); return { value: i / r, count: r } } }, ut = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.plotArea = e, n.categoryAxis = e.seriesCategoryAxis(t.series[0]), n.valueAxisRanges = {}, n.points = [], n.categoryPoints = [], n.seriesPoints = [], n.seriesOptions = [], n._evalSeries = [], n.render() }, options: { series: [], invertAxes: !1, isStacked: !1, clip: !0 }, render: function() { var e = this; e.traverseDataPoints(Sn(e.addValue, e)) }, pointOptions: function(e, t) { var n, i = this.seriesOptions[t]; return i || (n = this.pointType().fn.defaults, this.seriesOptions[t] = i = Pn({}, n, { vertical: !this.options.invertAxes }, e)), i }, plotValue: function(e) { var t, n, i, r, o, a, s, l; if (!e) return 0; if (this.options.isStacked100 && A(e.value)) { for (t = e.categoryIx, n = this.categoryPoints[t], i = 0, r = [], o = 0; n.length > o; o++) if (a = n[o]) { if (s = e.series.stack, l = a.series.stack, s && l && s.group !== l.group) continue; A(a.value) && (i += kn.abs(a.value), r.push(kn.abs(a.value))) } if (i > 0) return e.value / i } return e.value }, plotRange: function(e, t) { var n, i, r, o, a, s, l, c, d, u, h, p, f = e.categoryIx, g = this.categoryPoints[f]; if (this.options.isStacked) { for (t = t || 0, n = this.plotValue(e), i = n >= 0, r = t, o = !1, a = 0; g.length > a && (s = g[a], e !== s); a++) { if (l = e.series.stack, c = s.series.stack, l && c) { if (typeof l === So && l !== c) continue; if (l.group && l.group !== c.group) continue } d = this.plotValue(s), (d >= 0 && i || 0 > d && !i) && (r += d, n += d, o = !0, this.options.isStacked100 && (n = kn.min(n, 1))) } return o && (r -= t), [r, n] } return u = e.series, h = this.seriesValueAxis(u), p = this.categoryAxisCrossingValue(h), [p, e.value || p] }, stackLimits: function(e, t) { var n, i, r, o, a, s = Hr, l = Lr; for (n = 0; this.categoryPoints.length > n; n++) for (i = this.categoryPoints[n], r = 0; i.length > r; r++) o = i[r], o && (o.series.stack === t || o.series.axis === e) && (a = this.plotRange(o, 0)[1], di(a) && isFinite(a) && (l = kn.max(l, a), s = kn.min(s, a))); return { min: s, max: l } }, updateStackRange: function() { var e, t, n, i, r, o, a = this, s = a.options.series, l = a.options.isStacked, c = {}; if (l) for (t = 0; s.length > t; t++) n = s[t], i = n.axis, r = i + n.stack, e = c[r], e || (e = a.stackLimits(i, n.stack), o = a.errorTotals, o && (o.negative.length && (e.min = kn.min(e.min, fi(o.negative))), o.positive.length && (e.max = kn.max(e.max, gi(o.positive)))), e.min !== Hr || e.max !== Lr ? c[r] = e : e = null), e && (a.valueAxisRanges[i] = e) }, addErrorBar: function(e, t, n) { var i, r = this, o = e.value, a = e.series, s = e.seriesIx, l = e.options.errorBars, c = t.fields[lr], d = t.fields[cr]; A(c) && A(d) ? i = { low: c, high: d } : l && di(l.value) && (r.seriesErrorRanges = r.seriesErrorRanges || [], r.seriesErrorRanges[s] = r.seriesErrorRanges[s] || new dt(l.value, a, Uo), i = r.seriesErrorRanges[s].getErrorRange(o, l.value)), i && (e.low = i.low, e.high = i.high, r.addPointErrorBar(e, n)) }, addPointErrorBar: function(e, t) { var n, i, r, o = this, a = e.series, s = e.low, l = e.high, c = !o.options.invertAxes, d = e.options.errorBars; o.options.isStacked ? (i = o.stackedErrorRange(e, t), s = i.low, l = i.high) : (r = { categoryIx: t, series: a }, o.updateRange({ value: s }, r), o.updateRange({ value: l }, r)), n = new wt(s, l, c, o, a, d), e.errorBars = [n], e.append(n) }, stackedErrorRange: function(e, t) { var n = this, i = n.plotRange(e, 0)[1] - e.value, r = e.low + i, o = e.high + i; return n.errorTotals = n.errorTotals || { positive: [], negative: [] }, 0 > r && (n.errorTotals.negative[t] = kn.min(n.errorTotals.negative[t] || 0, r)), o > 0 && (n.errorTotals.positive[t] = kn.max(n.errorTotals.positive[t] || 0, o)), { low: r, high: o } }, addValue: function(t, n) { var i, r, o = this, a = n.categoryIx, s = n.series, l = n.seriesIx, c = o.categoryPoints[a]; c || (o.categoryPoints[a] = c = []), i = o.seriesPoints[l], i || (o.seriesPoints[l] = i = []), r = o.createPoint(t, n), r && (e.extend(r, n), r.owner = o, r.dataItem = s.data[a], r.noteText = t.fields.noteText, o.addErrorBar(r, t, a)), o.points.push(r), i.push(r), c.push(r), o.updateRange(t.valueFields, n) }, evalPointOptions: function(e, t, n, i, r, o) { var a = { defaults: r._defaults, excluded: ["data", "aggregate", "_events", "tooltip", "template", "visual", "toggle"] }, s = this._evalSeries[o]; return di(s) || (this._evalSeries[o] = s = M(e, {}, a, !0)), s && (e = Pn({}, e), M(e, { value: t, category: n, index: i, series: r, dataItem: r.data[i] }, a)), e }, updateRange: function(e, t) { var n = this, i = t.series.axis, r = e.value, o = n.valueAxisRanges[i]; isFinite(r) && null !== r && (o = n.valueAxisRanges[i] = o || { min: Hr, max: Lr }, o.min = kn.min(o.min, r), o.max = kn.max(o.max, r)) }, seriesValueAxis: function(e) { var t = this.plotArea, n = e.axis, i = n ? t.namedValueAxes[n] : t.valueAxis; if (!i) throw Error("Unable to locate value axis with name " + n); return i }, reflow: function(e) { var t, n, i, r = this, o = 0, a = r.categorySlots = [], s = r.points, l = r.categoryAxis; r.traverseDataPoints(function(e, c) { var d, u, h, p, f = c.categoryIx, g = c.series; t = r.pointValue(e), n = r.seriesValueAxis(g), i = s[o++], d = a[f], d || (a[f] = d = r.categorySlot(l, f, n)), i && (u = r.plotRange(i, n.startValue()), h = n.getSlot(u[0], u[1], !r.options.clip), h ? (p = r.pointSlot(d, h), i.aboveAxis = r.aboveAxis(i, n), r.options.isStacked100 && (i.percentage = r.plotValue(i)), r.reflowPoint(i, p)) : i.visible = !1) }), r.reflowCategories(a), r.box = e }, aboveAxis: function(e, t) { var n = this.categoryAxisCrossingValue(t), i = e.value; return t.options.reverse ? n > i : i >= n }, categoryAxisCrossingValue: function(e) { var t = this.categoryAxis, n = e.options, i = [].concat(n.axisCrossingValues || n.axisCrossingValue); return i[t.axisIndex || 0] || 0 }, reflowPoint: function(e, t) { e.reflow(t) }, reflowCategories: function() {}, pointSlot: function(e, t) { var n = this, i = n.options, r = i.invertAxes, o = r ? t : e, a = r ? e : t; return new Ln(o.x1, a.y1, o.x2, a.y2) }, categorySlot: function(e, t) { return e.getSlot(t) }, traverseDataPoints: function(e) { var t, n, i, r, o, a = this, s = a.options, l = s.series, d = a.categoryAxis.options.categories || [], u = c(l), h = l.length; for (t = 0; u > t; t++) for (n = 0; h > n; n++) o = l[n], r = d[t], i = this._bindPoint(o, n, t), e(i, { category: r, categoryIx: t, series: o, seriesIx: n }) }, _bindPoint: function(e, t, n) { var i, r; return this._bindCache || (this._bindCache = []), i = this._bindCache[t], i || (i = this._bindCache[t] = []), r = i[n], r || (r = i[n] = Q.current.bindPoint(e, n)), r }, formatPointValue: function(e, t) { return null === e.value ? "" : ti(t, e.value) }, pointValue: function(e) { return e.valueFields.value } }), ht = ut.extend({ options: { animation: { type: Ti } }, render: function() { var e = this; ut.fn.render.apply(e), e.updateStackRange() }, pointType: function() { return st }, clusterType: function() { return it }, stackType: function() { return rt }, stackLimits: function(e, t) { var n = ut.fn.stackLimits.call(this, e, t); return n }, createPoint: function(e, t) { var n, i, r, o, a = this, s = t.categoryIx, l = t.category, c = t.series, d = t.seriesIx, u = a.pointValue(e), h = a.options, p = a.children, f = a.options.isStacked, g = a.pointType(), m = a.clusterType(), v = this.pointOptions(c, d), _ = v.labels; return f && _.position == eo && (_.position = Cr), v.isStacked = f, r = e.fields.color || c.color, 0 > u && v.negativeColor && (r = v.negativeColor), v = a.evalPointOptions(v, u, l, s, c, d), Tn.isFunction(c.color) && (r = v.color), n = new g(u, v), n.color = r, i = p[s], i || (i = new m({ vertical: h.invertAxes, gap: h.gap, spacing: h.spacing }), a.append(i)), f ? (o = a.getStackWrap(c, i), o.append(n)) : i.append(n), n }, getStackWrap: function(e, t) { var n, i, r, o = e.stack, a = o ? o.group || o : o, s = t.children; if (typeof a === So) { for (i = 0; s.length > i; i++) if (s[i]._stackGroup === a) { n = s[i]; break } } else n = s[0]; return n || (r = this.stackType(), n = new r({ vertical: !this.options.invertAxes }), n._stackGroup = a, t.append(n)), n }, categorySlot: function(e, t, n) { var i, r, o = this, a = o.options, s = e.getSlot(t), l = n.startValue(); return a.isStacked && (r = n.getSlot(l, l, !0), i = a.invertAxes ? Qo : Ko, s[i + 1] = s[i + 2] = r[i + 1]), s }, reflowCategories: function(e) { var t, n = this, i = n.children, r = i.length; for (t = 0; r > t; t++) i[t].reflow(e[t]) }, createAnimation: function() { this._setAnimationOptions(), On.fn.createAnimation.call(this), j(this.options.series) && this._setChildrenAnimation() }, _setChildrenAnimation: function() { var e, t, n, i = this.points; for (n = 0; i.length > n; n++) e = i[n], t = e.visual, t && di(t.options.zIndex) && (e.options.animation = this.options.animation, e.createAnimation()) }, _setAnimationOptions: function() { var e, t, n = this.options, i = n.animation || {}; this.options.isStacked ? (t = this.seriesValueAxis(n.series[0]), e = t.getSlot(t.startValue())) : e = this.categoryAxis.getSlot(0), i.origin = new _i.Point(e.x1, e.y1), i.vertical = !n.invertAxes } }), pt = st.extend({ defaults: { labels: { format: "{0} - {1}" }, tooltip: { format: "{1}" } }, createLabel: function() { var e = this.options.labels, t = Pn({}, e, e.from), n = Pn({}, e, e.to); t.visible && (this.labelFrom = this._createLabel(t), this.append(this.labelFrom)), n.visible && (this.labelTo = this._createLabel(n), this.append(this.labelTo)) }, _createLabel: function(e) { var t, n; return e.template ? (n = Fn(e.template), t = n({ dataItem: this.dataItem, category: this.category, value: this.value, percentage: this.percentage, runningTotal: this.runningTotal, total: this.total, series: this.series })) : t = this.formatValue(e.format), new K(t, Pn({ vertical: this.options.vertical }, e)) }, reflow: function(e) { this.render(); var t = this, n = t.labelFrom, i = t.labelTo; t.box = e, n && (n.options.aboveAxis = t.value.from > t.value.to, n.reflow(e)), i && (i.options.aboveAxis = t.value.to > t.value.from, i.reflow(e)), t.note && t.note.reflow(e) } }), ft = ht.extend({ pointType: function() { return pt }, pointValue: function(e) { return e.valueFields }, formatPointValue: function(e, t) { return null === e.value.from && null === e.value.to ? "" : ti(t, e.value.from, e.value.to) }, plotLimits: ut.fn.plotLimits, plotRange: function(e) { return e ? [e.value.from, e.value.to] : 0 }, updateRange: function(e, t) { var n = this, i = t.series.axis, r = e.from, o = e.to, a = n.valueAxisRanges[i]; null !== e && A(r) && A(o) && (a = n.valueAxisRanges[i] = a || { min: Hr, max: Lr }, a.min = kn.min(a.min, r), a.max = kn.max(a.max, r), a.min = kn.min(a.min, o), a.max = kn.max(a.max, o)) }, aboveAxis: function(e) { var t = e.value; return t.to > t.from } }), gt = ut.extend({ init: function(e, t) { var n = this; n.wrapData(t), ut.fn.init.call(n, e, t) }, options: { animation: { type: Ti } }, wrapData: function(e) { var t, n, i, r = e.series; for (t = 0; r.length > t; t++) i = r[t], n = i.data, n && !wn(n[0]) && typeof n[0] != Zr && (i.data = [n]) }, reflowCategories: function(e) { var t, n = this, i = n.children, r = i.length; for (t = 0; r > t; t++) i[t].reflow(e[t]) }, plotRange: function(e) { var t = e.series, n = this.seriesValueAxis(t), i = this.categoryAxisCrossingValue(n); return [i, e.value.current || i] }, createPoint: function(e, t) { var n, i, r = this, o = t.categoryIx, a = t.category, s = t.series, l = t.seriesIx, c = e.valueFields, d = r.options, u = r.children, h = Pn({ vertical: !d.invertAxes, overlay: s.overlay, categoryIx: o, invertAxes: d.invertAxes }, s), p = e.fields.color || s.color; return h = r.evalPointOptions(h, c, a, o, s, l), Tn.isFunction(s.color) && (p = h.color), n = new mt(c, h), n.color = p, i = u[o], i || (i = new it({ vertical: d.invertAxes, gap: d.gap, spacing: d.spacing }), r.append(i)), i.append(n), n }, updateRange: function(e, t) { var n = this, i = t.series.axis, r = e.current, o = e.target, a = n.valueAxisRanges[i]; di(r) && !isNaN(r) && di(o && !isNaN(o)) && (a = n.valueAxisRanges[i] = a || { min: Hr, max: Lr }, a.min = kn.min.apply(kn, [a.min, r, o]), a.max = kn.max.apply(kn, [a.max, r, o])) }, formatPointValue: function(e, t) { return ti(t, e.value.current, e.value.target) }, pointValue: function(e) { return e.valueFields.current }, aboveAxis: function(e) { var t = e.value.current; return t > 0 }, createAnimation: function() { var e, t, n = this.points; for (this._setAnimationOptions(), t = 0; n.length > t; t++) e = n[t], e.options.animation = this.options.animation, e.createAnimation() }, _setAnimationOptions: ht.fn._setAnimationOptions }), mt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.aboveAxis = n.options.aboveAxis, n.color = t.color || Yo, n.value = e }, options: { border: { width: 1 }, vertical: !1, opacity: 1, target: { shape: "", border: { width: 0, color: "green" }, line: { width: 2 } }, tooltip: { format: "Current: {0}</br>Target: {1}" } }, render: function() { var e = this, t = e.options; e._rendered || (e._rendered = !0, di(e.value.target) && (e.target = new vt({ type: t.target.shape, background: t.target.color || e.color, opacity: t.opacity, zIndex: t.zIndex, border: t.target.border, vAlign: Ho, align: lo }), e.append(e.target)), e.createNote()) }, reflow: function(e) { this.render(); var t, n = this, i = n.options, r = n.owner, o = n.target, a = i.invertAxes, s = r.seriesValueAxis(n.options), l = r.categorySlot(r.categoryAxis, i.categoryIx, s), c = s.getSlot(n.value.target), d = a ? c : l, u = a ? l : c; o && (t = new Ln(d.x1, u.y1, d.x2, u.y2), o.options.height = a ? t.height() : i.target.line.width, o.options.width = a ? i.target.line.width : t.width(), o.reflow(t)), n.note && n.note.reflow(e), n.box = e }, createVisual: function() { var e, t; On.fn.createVisual.call(this), e = this.options, t = wi.Path.fromRect(this.box.toRect(), { fill: { color: this.color, opacity: e.opacity }, stroke: null }), e.border.width > 0 && t.options.set("stroke", { color: e.border.color || this.color, width: e.border.width, dashType: e.border.dashType, opacity: vi(e.border.opacity, e.opacity) }), this.bodyVisual = t, ei(t), this.visual.append(t) }, createAnimation: function() { this.bodyVisual && (this.animation = wi.Animation.create(this.bodyVisual, this.options.animation)) }, tooltipAnchor: function(e, t) { var n, i, r, o, a = this, s = a.options, l = a.box, c = s.vertical, d = a.aboveAxis, u = a.owner.pane.clipBox() || l; return c ? (n = l.x2 + Lo, i = d ? kn.max(l.y1, u.y1) : kn.min(l.y2, u.y2) - t) : (r = kn.max(l.x1, u.x1), o = kn.min(l.x2, u.x2), s.isStacked ? (n = d ? o - e : r, i = l.y1 - t - Lo) : (n = d ? o + Lo : r - e - Lo, i = l.y1)), new $n(n, i) }, createHighlight: function(e) { return wi.Path.fromRect(this.box.toRect(), e) }, highlightVisual: function() { return this.bodyVisual }, highlightVisualArgs: function() { return { rect: this.box.toRect(), visual: this.bodyVisual, options: this.options } }, formatValue: function(e) { var t = this; return t.owner.formatPointValue(t, e) } }), Pn(mt.fn, ot), Pn(mt.fn, at), vt = Kn.extend(), Pn(vt.fn, ot), _t = On.extend({ init: function(e, t, n, i, r, o) { var a = this; a.low = e, a.high = t, a.isVertical = n, a.chart = i, a.series = r, On.fn.init.call(a, o) }, options: { animation: { type: fr, delay: kr }, endCaps: !0, line: { width: 1 }, zIndex: 1 }, getAxis: function() {}, reflow: function(e) { var t, n = this, i = n.options.endCaps, r = n.isVertical, o = n.getAxis(), a = o.getSlot(n.low, n.high), s = e.center(), l = n.getCapsWidth(e, r), c = r ? s.x : s.y, d = c - l, u = c + l; r ? (t = [$n(s.x, a.y1), $n(s.x, a.y2)], i && t.push($n(d, a.y1), $n(u, a.y1), $n(d, a.y2), $n(u, a.y2)), n.box = Ln(d, a.y1, u, a.y2)) : (t = [$n(a.x1, s.y), $n(a.x2, s.y)], i && t.push($n(a.x1, d), $n(a.x1, u), $n(a.x2, d), $n(a.x2, u)), n.box = Ln(a.x1, d, a.x2, u)), n.linePoints = t }, getCapsWidth: function(e, t) { var n = t ? e.width() : e.height(), i = kn.min(kn.floor(n / 2), nr) || nr; return i }, createVisual: function() { var e = this, t = e.options, n = t.visual; n ? e.visual = n({ low: e.low, high: e.high, rect: e.box.toRect(), options: { endCaps: t.endCaps, color: t.color, line: t.line }, createVisual: function() { e.createDefaultVisual(); var t = e.visual; return delete e.visual, t } }) : e.createDefaultVisual() }, createDefaultVisual: function() { var e, t, n = this, i = n.options, r = { stroke: { color: i.color, width: i.line.width, dashType: i.line.dashType } }, o = n.linePoints; for (On.fn.createVisual.call(this), e = 0; o.length > e; e += 2) t = new wi.Path(r).moveTo(o[e].x, o[e].y).lineTo(o[e + 1].x, o[e + 1].y), this.visual.append(t) } }), wt = _t.extend({ getAxis: function() { var e = this, t = e.chart, n = e.series, i = t.seriesValueAxis(n); return i } }), bt = _t.extend({ getAxis: function() { var e = this, t = e.chart, n = e.series, i = t.seriesAxes(n), r = e.isVertical ? i.y : i.x; return r } }), yt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n), n.value = e, n.options = t, n.aboveAxis = vi(n.options.aboveAxis, !0), n.tooltipTracking = !0 }, defaults: { vertical: !0, markers: { visible: !0, background: Yo, size: Pr, type: Oi, border: { width: 2 }, opacity: 1 }, labels: { visible: !1, position: yi, margin: ii(3), padding: ii(4), animation: { type: fr, delay: kr } }, notes: { label: {} }, highlight: { markers: { border: {} } } }, render: function() { var e, t = this, n = t.options, i = n.markers, r = n.labels, o = t.value; t._rendered || (t._rendered = !0, i.visible && i.size && (t.marker = t.createMarker(), t.append(t.marker)), r.visible && (r.template ? (e = Fn(r.template), o = e({ dataItem: t.dataItem, category: t.category, value: t.value, percentage: t.percentage, series: t.series })) : r.format && (o = t.formatValue(r.format)), t.label = new Zn(o, Pn({ align: Li, vAlign: Li, margin: { left: 5, right: 5 }, zIndex: vi(r.zIndex, this.series.zIndex) }, r)), t.append(t.label)), t.createNote(), t.errorBar && t.append(t.errorBar)) }, markerBorder: function() { var e = this.options.markers, t = e.background, n = Pn({ color: this.color }, e.border); return di(n.color) || (n.color = new Vn(t).brightness(Ai).toHex()), n }, createVisual: xn, createMarker: function() { var e = this.options.markers, t = new Kn({ type: e.type, width: e.size, height: e.size, rotation: e.rotation, background: e.background, border: this.markerBorder(), opacity: e.opacity, zIndex: vi(e.zIndex, this.series.zIndex), animation: e.animation, visual: e.visual }, { dataItem: this.dataItem, value: this.value, series: this.series, category: this.category }); return t }, markerBox: function() { return this.marker || (this.marker = this.createMarker(), this.marker.reflow(this._childBox)), this.marker.box }, reflow: function(e) { var t, n, i, r, o = this, a = o.options, s = a.vertical, l = o.aboveAxis; if (o.render(), o.box = e, t = e.clone(), s ? l ? t.y1 -= t.height() : t.y2 += t.height() : l ? t.x1 += t.width() : t.x2 -= t.width(), o._childBox = t, o.marker && o.marker.reflow(t), o.reflowLabel(t), o.errorBars) for (i = 0; o.errorBars.length > i; i++) o.errorBars[i].reflow(t); o.note && (r = o.markerBox(), o.marker || (n = r.center(), r = Ln(n.x, n.y, n.x, n.y)), o.note.reflow(r)) }, reflowLabel: function(e) { var t = this, n = t.options, i = t.label, r = n.labels.position; i && (r = r === yi ? Ho : r, r = r === Ei ? Mi : r, i.reflow(e), i.box.alignTo(t.markerBox(), r), i.reflow(i.box)) }, createHighlight: function() { var e = this.options.highlight, t = e.markers, n = this.markerBorder().color, i = this.options.markers, r = new Kn({ type: i.type, width: i.size, height: i.size, rotation: i.rotation, background: t.color || n, border: { color: t.border.color, width: t.border.width, opacity: vi(t.border.opacity, 1) }, opacity: vi(t.opacity, 1) }); return r.reflow(this._childBox), r.getElement() }, highlightVisual: function() { return (this.marker || {}).visual }, highlightVisualArgs: function() { var e, t, n, i, r, o = this.marker; return o ? (t = o.paddingBox.toRect(), e = o.visual) : (n = this.options.markers.size, i = n / 2, r = this.box.center(), t = new _i.Rect([r.x - i, r.y - i], [n, n])), { options: this.options, rect: t, visual: e } }, tooltipAnchor: function(e, n) { var i = this, r = i.markerBox(), o = i.aboveAxis, a = r.x2 + Lo, s = o ? r.y1 - n : r.y2, l = i.owner.pane.clipBox(), c = !l || l.overlaps(r); return c ? $n(a, s) : t }, formatValue: function(e) { var t = this; return t.owner.formatPointValue(t, e) } }), Pn(yt.fn, ot), Pn(yt.fn, at), kt = yt.extend({ init: function(e, t) { var n = this; yt.fn.init.call(n, e, t), n.category = e.category }, defaults: { labels: { position: Li }, highlight: { opacity: 1, border: { width: 1, opacity: 1 } } }, createHighlight: function() { var e = this.options.highlight, t = e.border, n = this.options.markers, i = this.box.center(), r = n.size / 2 - t.width / 2, o = new wi.Circle(new _i.Circle([i.x, i.y], r), { stroke: { color: t.color || new Vn(n.background).brightness(Ai).toHex(), width: t.width, opacity: t.opacity }, fill: { color: n.background, opacity: e.opacity } }); return o } }), xt = On.extend({ init: function(e, t, n) { var i = this; On.fn.init.call(i), i.linePoints = e, i.series = t, i.seriesIx = n }, options: { closed: !1 }, points: function(e) { var t, n, i = this, r = i.linePoints.concat(e || []), o = []; for (t = 0, n = r.length; n > t; t++) r[t].visible !== !1 && o.push(r[t]._childBox.toRect().center()); return o }, createVisual: function() { var e, t = this.options, n = this.series, i = n._defaults, r = n.color; zn(r) && i && (r = i.color), e = wi.Path.fromPoints(this.points(), { stroke: { color: r, width: n.width, opacity: n.opacity, dashType: n.dashType }, zIndex: n.zIndex }), t.closed && e.close(), this.visual = e }, aliasFor: function(e, t) { var n = this, i = n.seriesIx; return n.parent.getNearestPoint(t.x, t.y, i) } }), Ct = { renderSegments: function() { var e, t, n, i, r, o, a, s, l = this, c = l.options, d = c.series, u = l.seriesPoints, h = u.length; for (this._segments = [], t = 0; h > t; t++) { for (e = d[t], n = l.sortPoints(u[t]), a = n.length, i = [], o = 0; a > o; o++) r = n[o], r ? i.push(r) : l.seriesMissingValues(e) !== Sr && (i.length > 1 && (s = l.createSegment(i, e, t, s), this._addSegment(s)), i = []); i.length > 1 && (s = l.createSegment(i, e, t, s), this._addSegment(s)) } this.children.unshift.apply(this.children, this._segments) }, _addSegment: function(e) { this._segments.push(e), e.parent = this }, sortPoints: function(e) { return e }, seriesMissingValues: function(e) { var t = e.missingValues, n = !t && this.options.isStacked; return n ? Zo : t || Sr }, getNearestPoint: function(e, t, n) { var i, r, o, a, s, l = new $n(e, t), c = this.seriesPoints[n], d = Hr; for (r = 0; c.length > r; r++) o = c[r], o && di(o.value) && null !== o.value && o.visible !== !1 && (a = o.box, s = a.center().distanceTo(l), d > s && (i = o, d = s)); return i } }, St = { createAnimation: function() { var e, t, n = this.getRoot(); n && (n.options || {}).transitions !== !1 && (e = n.box, t = wi.Path.fromRect(e.toRect()), this.visual.clip(t), this.animation = new Dt(t, { box: e }), j(this.options.series) && this._setChildrenAnimation(t)) }, _setChildrenAnimation: function(e) { var t, n, i, r = this.animationPoints(); for (i = 0; r.length > i; i++) t = r[i], n = t.visual, n && di(n.options.zIndex) && n.clip(e) } }, Tt = ut.extend({ render: function() { var e = this; ut.fn.render.apply(e), e.updateStackRange(), e.renderSegments() }, pointType: function() { return yt }, createPoint: function(e, t) { var n, i, r, o = this, a = t.categoryIx, s = t.category, l = t.series, c = t.seriesIx, d = e.valueFields.value, u = o.seriesMissingValues(l); if (!di(d) || null === d) { if (u !== Zo) return null; d = 0 } return i = this.pointOptions(l, c), i = o.evalPointOptions(i, d, s, a, l, c), r = e.fields.color || l.color, Tn.isFunction(l.color) && (r = i.color), n = new yt(d, i), n.color = r, o.append(n), n }, plotRange: function(e) { var t, n, i, r, o = this.plotValue(e); if (this.options.isStacked) for (t = e.categoryIx, n = this.categoryPoints[t], i = 0; n.length > i && (r = n[i], e !== r); i++) o += this.plotValue(r); return [o, o] }, createSegment: function(e, t, n) { var i, r = t.style; return new(i = r === yo ? At : r === ko ? Et : xt)(e, t, n) }, animationPoints: function() { var e, t, n, i = this.seriesOptions, r = []; for (n = 0; i.length > n; n++) if (i[n].markers.visible) for (e = this.seriesPoints[n], t = 0; e.length > t; t++) r.push(e[t].marker); return r.concat(this._segments) } }), Pn(Tt.fn, Ct, St), Dt = wi.Animation.extend({ options: { duration: kr }, setup: function() { this._setEnd(this.options.box.x1) }, step: function(e) { var t = this.options.box; this._setEnd(oi(t.x1, t.x2, e)) }, _setEnd: function(e) { var t = this.element, n = t.segments, i = n[1].anchor(), r = n[2].anchor(); t.suspend(), i.setX(e), t.resume(), r.setX(e) } }), wi.AnimationFactory.current.register(Ui, Dt), At = xt.extend({ points: function(e) { var t, n = this; return t = n.calculateStepPoints(n.linePoints), e && e.length && (t = t.concat(n.calculateStepPoints(e).reverse())), t }, calculateStepPoints: function(e) { var t, n, i, r, o, a = this, s = a.parent, l = s.plotArea, c = l.seriesCategoryAxis(a.series), d = s.seriesMissingValues(a.series) === Sr, u = e.length, h = c.options.reverse, p = c.options.vertical, f = h ? 2 : 1, g = h ? 1 : 2, m = []; for (i = 1; u > i; i++) t = e[i - 1], n = e[i], r = t.markerBox().center(), o = n.markerBox().center(), c.options.justified ? (m.push(new _i.Point(r.x, r.y)), m.push(p ? new _i.Point(r.x, o.y) : new _i.Point(o.x, r.y)), m.push(new _i.Point(o.x, o.y))) : p ? (m.push(new _i.Point(r.x, t.box[Ko + f])), m.push(new _i.Point(r.x, t.box[Ko + g])), d && m.push(new _i.Point(r.x, n.box[Ko + f])), m.push(new _i.Point(o.x, n.box[Ko + f])), m.push(new _i.Point(o.x, n.box[Ko + g]))) : (m.push(new _i.Point(t.box[Qo + f], r.y)), m.push(new _i.Point(t.box[Qo + g], r.y)), d && m.push(new _i.Point(n.box[Qo + f], r.y)), m.push(new _i.Point(n.box[Qo + f], o.y)), m.push(new _i.Point(n.box[Qo + g], o.y))); return m || [] } }), Et = xt.extend({ createVisual: function() { var e, t, n, i = this.series, r = i._defaults, o = i.color; zn(o) && r && (o = r.color), e = new Un(this.options.closed), t = e.process(this.points()), n = new wi.Path({ stroke: { color: o, width: i.width, opacity: i.opacity, dashType: i.dashType }, zIndex: i.zIndex }), n.segments.push.apply(n.segments, t), this.visual = n } }), It = { points: function() { var e, t, n = this, i = n.parent, r = i.plotArea, o = i.options.invertAxes, a = i.seriesValueAxis(n.series), s = a.lineBox(), l = r.seriesCategoryAxis(n.series), c = l.lineBox(), d = o ? c.x1 : c.y1, u = n.stackPoints, h = n._linePoints(u), p = o ? Qo : Ko; return d = hi(d, s[p + 1], s[p + 2]), !n.stackPoints && h.length > 1 && (e = h[0], t = ui(h), o ? (h.unshift(new _i.Point(d, e.y)), h.push(new _i.Point(d, t.y))) : (h.unshift(new _i.Point(e.x, d)), h.push(new _i.Point(t.x, d)))), h }, createVisual: function() { var e = this.series, t = e._defaults, n = e.color; zn(n) && t && (n = t.color), this.visual = new wi.Group({ zIndex: e.zIndex }), this.createArea(n), this.createLine(n) }, createLine: function(e) { var t, n = this.series, i = Pn({ color: e, opacity: n.opacity }, n.line); i.visible !== !1 && i.width > 0 && (t = wi.Path.fromPoints(this._linePoints(), { stroke: { color: i.color, width: i.width, opacity: i.opacity, dashType: i.dashType, lineCap: "butt" } }), this.visual.append(t)) }, createArea: function(e) { var t = this.series, n = wi.Path.fromPoints(this.points(), { fill: { color: e, opacity: t.opacity }, stroke: null }); this.visual.append(n) } }, Pt = xt.extend({ init: function(e, t, n, i) { var r = this; r.stackPoints = t, xt.fn.init.call(r, e, n, i) }, _linePoints: xt.fn.points }), Pn(Pt.fn, It), Mt = Tt.extend({ createSegment: function(e, t, n, i) { var r, o, a, s = this, l = s.options, c = l.isStacked, d = (t.line || {}).style; return c && n > 0 && i && (a = this.seriesMissingValues(t), r = "gap" != a ? i.linePoints : this._gapStackPoints(e, n, d), d !== yo && (r = r.slice(0).reverse())), d === ko ? new zt(e, i, c, t, n) : new(o = d === yo ? Ft : Pt)(e, r, t, n) }, reflow: function(e) { var t, n, i, r; if (Tt.fn.reflow.call(this, e), t = this._stackPoints) for (r = 0; t.length > r; r++) n = t[r], i = this.categoryAxis.getSlot(n.categoryIx), n.reflow(i) }, _gapStackPoints: function(e, t, n) { var i, r, o, a, s = this.seriesPoints, l = e[0].categoryIx, c = l + e.length, d = []; for (this._stackPoints = this._stackPoints || [], a = l; c > a; a++) { i = t; do i--, r = s[i][a]; while (i > 0 && !r); r ? (n !== yo && a > l && !s[i][a - 1] && d.push(this._previousSegmentPoint(a, a - 1, i)), d.push(r), n !== yo && c > a + 1 && !s[i][a + 1] && d.push(this._previousSegmentPoint(a, a + 1, i))) : (o = this._createGapStackPoint(a), this._stackPoints.push(o), d.push(o)) } return d }, _previousSegmentPoint: function(e, t, n) { for (var i, r = this.seriesPoints; n > 0 && !i;) n--, i = r[n][t]; return i ? i = r[n][e] : (i = this._createGapStackPoint(e), this._stackPoints.push(i)), i }, _createGapStackPoint: function(e) { var t = this.pointOptions({}, 0), n = new yt(0, t); return n.categoryIx = e, n.series = {}, n }, seriesMissingValues: function(e) { return e.missingValues || Zo } }), zt = Pt.extend({ init: function(e, t, n, i, r) { var o = this; o.prevSegment = t, o.isStacked = n, xt.fn.init.call(o, e, i, r) }, strokeSegments: function() { var e, t, n = this._strokeSegments; return n || (e = new Un(this.options.closed), t = xt.fn.points.call(this), n = this._strokeSegments = e.process(t)), n }, createVisual: function() { var e = this.series, t = e._defaults, n = e.color; zn(n) && t && (n = t.color), this.visual = new wi.Group({ zIndex: e.zIndex }), this.createFill({ fill: { color: n, opacity: e.opacity }, stroke: null }), this.createStroke({ stroke: Pn({ color: n, opacity: e.opacity, lineCap: "butt" }, e.line) }) }, createFill: function(t) { var n, i, r, o, a, s = this.strokeSegments(), l = s.slice(0), c = this.prevSegment; this.isStacked && c && (n = c.strokeSegments(), i = ui(n).anchor(), l.push(new wi.Segment(i, i, ui(s).anchor())), r = e.map(n, function(e) { return new wi.Segment(e.anchor(), e.controlOut(), e.controlIn()) }).reverse(), ci(l, r), o = l[0].anchor(), l.push(new wi.Segment(o, o, ui(r).anchor()))), a = new wi.Path(t), a.segments.push.apply(a.segments, l), this.closeFill(a), this.visual.append(a) }, closeFill: function(e) { var t = this, n = t.parent, i = t.prevSegment, r = n.plotArea, o = n.options.invertAxes, a = n.seriesValueAxis(t.series), s = a.lineBox(), l = r.seriesCategoryAxis(t.series), c = l.lineBox(), d = o ? c.x1 : c.y1, u = o ? Qo : Ko, h = t.strokeSegments(), p = h[0].anchor(), f = ui(h).anchor(); d = hi(d, s[u + 1], s[u + 2]), n.options.isStacked && i || !(h.length > 1) || (o ? e.lineTo(d, f.y).lineTo(d, p.y) : e.lineTo(f.x, d).lineTo(p.x, d)) }, createStroke: function(e) { if (e.stroke.width > 0) { var t = new wi.Path(e); t.segments.push.apply(t.segments, this.strokeSegments()), this.visual.append(t) } } }), Ft = At.extend({ init: function(e, t, n, i) { var r = this; r.stackPoints = t, At.fn.init.call(r, e, n, i) }, _linePoints: At.fn.points }), Pn(Ft.fn, It), Rt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.plotArea = e, n.xAxisRanges = {}, n.yAxisRanges = {}, n.points = [], n.seriesPoints = [], n.seriesOptions = [], n._evalSeries = [], n.render() }, options: { series: [], tooltip: { format: "{0}, {1}" }, labels: { format: "{0}, {1}" }, clip: !0 }, render: function() { var e = this; e.traverseDataPoints(Sn(e.addValue, e)) }, addErrorBar: function(e, t, n) { var i, r = this, o = e.value[t], a = t + "Value", s = t + "ErrorLow", l = t + "ErrorHigh", c = n.seriesIx, d = n.series, u = e.options.errorBars, h = n[s], p = n[l]; A(o) && (A(h) && A(p) && (i = { low: h, high: p }), u && di(u[a]) && (r.seriesErrorRanges = r.seriesErrorRanges || { x: [], y: [] }, r.seriesErrorRanges[t][c] = r.seriesErrorRanges[t][c] || new dt(u[a], d, t), i = r.seriesErrorRanges[t][c].getErrorRange(o, u[a])), i && r.addPointErrorBar(i, e, t)) }, addPointErrorBar: function(e, t, n) { var i, r = this, o = e.low, a = e.high, s = t.series, l = n === Ko, c = t.options.errorBars, d = {}; t[n + "Low"] = o, t[n + "High"] = a, t.errorBars = t.errorBars || [], i = new bt(o, a, l, r, s, c), t.errorBars.push(i), t.append(i), d[n] = o, r.updateRange(d, s), d[n] = a, r.updateRange(d, s) }, addValue: function(e, t) { var n, i = this, r = e.x, o = e.y, a = t.seriesIx, s = this.options.series[a], l = this.seriesMissingValues(s), c = i.seriesPoints[a]; $(r) && $(o) || (e = this.createMissingValue(e, l)), e && (n = i.createPoint(e, t), n && (Cn(n, t), i.addErrorBar(n, Qo, t), i.addErrorBar(n, Ko, t)), i.updateRange(e, t.series)), i.points.push(n), c.push(n) }, seriesMissingValues: function(e) { return e.missingValues }, createMissingValue: xn, updateRange: function(e, t) { var n = this, i = e.x, r = e.y, o = t.xAxis, a = t.yAxis, s = n.xAxisRanges[o], l = n.yAxisRanges[a]; $(i) && (s = n.xAxisRanges[o] = s || { min: Hr, max: Lr }, typeof i === So && (i = p(i)), s.min = kn.min(s.min, i), s.max = kn.max(s.max, i)), $(r) && (l = n.yAxisRanges[a] = l || { min: Hr, max: Lr }, typeof r === So && (r = p(r)), l.min = kn.min(l.min, r), l.max = kn.max(l.max, r)) }, evalPointOptions: function(e, t, n) { var i = n.series, r = n.seriesIx, o = { defaults: i._defaults, excluded: ["data", "tooltip", "tempate", "visual", "toggle"] }, a = this._evalSeries[r]; return di(a) || (this._evalSeries[r] = a = M(e, {}, o, !0)), a && (e = Pn({}, e), M(e, { value: t, series: i, dataItem: n.dataItem }, o)), e }, pointType: function() { return yt }, pointOptions: function(e, t) { var n, i = this.seriesOptions[t]; return i || (n = this.pointType().fn.defaults, this.seriesOptions[t] = i = Pn({}, n, { markers: { opacity: e.opacity }, tooltip: { format: this.options.tooltip.format }, labels: { format: this.options.labels.format } }, e)), i }, createPoint: function(e, t) { var n, i = this, r = t.series, o = this.pointOptions(r, t.seriesIx), a = t.color || r.color; return o = i.evalPointOptions(o, e, t), Tn.isFunction(r.color) && (a = o.color), n = new yt(e, o), n.color = a, i.append(n), n }, seriesAxes: function(e) { var t = this.plotArea, n = e.xAxis, i = n ? t.namedXAxes[n] : t.axisX, r = e.yAxis, o = r ? t.namedYAxes[r] : t.axisY; if (!i) throw Error("Unable to locate X axis with name " + n); if (!o) throw Error("Unable to locate Y axis with name " + r); return { x: i, y: o } }, reflow: function(e) { var t, n, i = this, r = i.points, o = 0, a = !i.options.clip; i.traverseDataPoints(function(e, s) { t = r[o++], n = i.seriesAxes(s.series); var l, c = n.x.getSlot(e.x, e.x, a), d = n.y.getSlot(e.y, e.y, a); t && (c && d ? (l = i.pointSlot(c, d), t.reflow(l)) : t.visible = !1) }), i.box = e }, pointSlot: function(e, t) { return new Ln(e.x1, t.y1, e.x2, t.y2) }, traverseDataPoints: function(e) { var t, n, i, r, o, a, s, l = this, c = l.options, d = c.series, u = l.seriesPoints; for (n = 0; d.length > n; n++) for (i = d[n], r = u[n], r || (u[n] = []), t = 0; i.data.length > t; t++) o = this._bindPoint(i, n, t), a = o.valueFields, s = o.fields, e(a, Pn({ pointIx: t, series: i, seriesIx: n, dataItem: i.data[t], owner: l }, s)) }, _bindPoint: ut.fn._bindPoint, formatPointValue: function(e, t) { var n = e.value; return ti(t, n.x, n.y) }, animationPoints: function() { var e, t = this.points, n = []; for (e = 0; t.length > e; e++) t[e].marker && n.push(t[e].marker); return n } }), Pn(Rt.fn, St), Ht = Rt.extend({ render: function() { var e = this; Rt.fn.render.call(e), e.renderSegments() }, createSegment: function(e, t, n) { var i, r = t.style; return new(i = r === ko ? Et : xt)(e, t, n) }, animationPoints: function() { var e = Rt.fn.animationPoints.call(this); return e.concat(this._segments) }, createMissingValue: function(e, t) { if (t === Zo) { var n = { x: e.x, y: e.y }; return $(n.x) || (n.x = 0), $(n.y) || (n.y = 0), n } } }), Pn(Ht.fn, Ct), Bt = Rt.extend({ init: function(e, t) { this._maxSize = Lr, Rt.fn.init.call(this, e, t) }, options: { tooltip: { format: "{3}" }, labels: { format: "{3}" } }, addValue: function(e, t) { (null !== e.size && e.size >= 0 || t.series.negativeValues.visible) && (this._maxSize = kn.max(this._maxSize, kn.abs(e.size)), Rt.fn.addValue.call(this, e, t)) }, reflow: function(e) { var t = this; t.updateBubblesSize(e), Rt.fn.reflow.call(t, e) }, pointType: function() { return kt }, createPoint: function(e, t) { var n, i, r = this, o = t.series, a = o.data.length, s = t.pointIx * (kr / a), l = { delay: s, duration: kr - s, type: Fi }, c = t.color || o.color; return 0 > e.size && o.negativeValues.visible && (c = vi(o.negativeValues.color, c)), i = Pn({ labels: { animation: { delay: s, duration: kr - s } } }, this.pointOptions(o, t.seriesIx), { markers: { type: Oi, border: o.border, opacity: o.opacity, animation: l } }), i = r.evalPointOptions(i, e, t), Tn.isFunction(o.color) && (c = i.color), i.markers.background = c, n = new kt(e, i), n.color = c, r.append(n), n }, updateBubblesSize: function(e) { var t, n, i, r, o, a, s, l, c, d, u, h, p, f, g, m, v, _ = this, w = _.options, b = w.series, y = kn.min(e.width(), e.height()); for (t = 0; b.length > t; t++) for (i = b[t], r = _.seriesPoints[t], o = i.minSize || kn.max(.02 * y, 10), a = i.maxSize || .2 * y, s = o / 2, l = a / 2, c = kn.PI * s * s, d = kn.PI * l * l, u = d - c, h = u / _._maxSize, n = 0; r.length > n; n++) p = r[n], f = kn.abs(p.value.size) * h, g = kn.sqrt((c + f) / kn.PI), m = vi(p.options.zIndex, 0), v = m + (1 - g / l), Pn(p.options, { zIndex: v, markers: { size: 2 * g, zIndex: v }, labels: { zIndex: v + 1 } }) }, formatPointValue: function(e, t) { var n = e.value; return ti(t, n.x, n.y, n.size, e.category) }, createAnimation: xn, createVisual: xn }), Lt = On.extend({ init: function(e, t) { On.fn.init.call(this, t), this.value = e }, options: { border: { _brightness: .8 }, line: { width: 2 }, overlay: { gradient: _r }, tooltip: { format: "<table style='text-align: left;'><th colspan='2'>{4:d}</th><tr><td>Open:</td><td>{0:C}</td></tr><tr><td>High:</td><td>{1:C}</td></tr><tr><td>Low:</td><td>{2:C}</td></tr><tr><td>Close:</td><td>{3:C}</td></tr></table>" }, highlight: { opacity: 1, border: { width: 1, opacity: 1 }, line: { width: 1, opacity: 1 } }, notes: { visible: !0, label: {} } }, reflow: function(e) { var t, n, i, r = this, o = r.options, a = r.owner, s = r.value, l = a.seriesValueAxis(o), c = []; n = l.getSlot(s.open, s.close), i = l.getSlot(s.low, s.high), n.x1 = i.x1 = e.x1, n.x2 = i.x2 = e.x2, r.realBody = n, t = i.center().x, c.push([ [t, i.y1], [t, n.y1] ]), c.push([ [t, n.y2], [t, i.y2] ]), r.lines = c, r.box = i.clone().wrap(n), r._rendered || (r._rendered = !0, r.createNote()), r.reflowNote() }, reflowNote: function() { var e = this; e.note && e.note.reflow(e.box) }, createVisual: function() { On.fn.createVisual.call(this), this._mainVisual = this.mainVisual(this.options), this.visual.append(this._mainVisual), this.createOverlay() }, mainVisual: function(e) { var t = new wi.Group; return this.createBody(t, e), this.createLines(t, e), t }, createBody: function(e, t) { var n = wi.Path.fromRect(this.realBody.toRect(), { fill: { color: this.color, opacity: t.opacity }, stroke: null }); t.border.width > 0 && n.options.set("stroke", { color: this.getBorderColor(), width: t.border.width, dashType: t.border.dashType, opacity: vi(t.border.opacity, t.opacity) }), ei(n), e.append(n), U(t) && e.append(this.createGradientOverlay(n, { baseColor: this.color }, Pn({}, t.overlay))) }, createLines: function(e, t) { this.drawLines(e, t, this.lines, t.line) }, drawLines: function(e, t, n, i) { var r, o, a; if (n) for (r = { stroke: { color: i.color || this.color, opacity: vi(i.opacity, t.opacity), width: i.width, dashType: i.dashType, lineCap: "butt" } }, o = 0; n.length > o; o++) a = wi.Path.fromPoints(n[o], r), ei(a), e.append(a) }, getBorderColor: function() { var e = this, t = e.options, n = t.border, i = n.color; return di(i) || (i = new Vn(e.color).brightness(n._brightness).toHex()), i }, createOverlay: function() { var e = wi.Path.fromRect(this.box.toRect(), { fill: { color: Yo, opacity: 0 }, stroke: null }); this.visual.append(e) }, createHighlight: function() { var e, t = this.options.highlight, n = this.color; return this.color = t.color || this.color, e = this.mainVisual(Pn({}, this.options, { line: { color: this.getBorderColor() } }, t)), this.color = n, e }, highlightVisual: function() { return this._mainVisual }, highlightVisualArgs: function() { return { options: this.options, rect: this.box.toRect(), visual: this._mainVisual } }, tooltipAnchor: function() { var e = this, t = e.box, n = e.owner.pane.clipBox() || t; return new $n(t.x2 + Lo, kn.max(t.y1, n.y1) + Lo) }, formatValue: function(e) { var t = this; return t.owner.formatPointValue(t, e) } }), Pn(Lt.fn, ot), Pn(Lt.fn, at), Nt = ut.extend({ options: {}, reflowCategories: function(e) { var t, n = this, i = n.children, r = i.length; for (t = 0; r > t; t++) i[t].reflow(e[t]) }, addValue: function(e, t) { var n, i, r = this, o = t.categoryIx, a = t.category, s = t.series, l = t.seriesIx, c = r.options, d = e.valueFields, u = r.children, h = r.splitValue(d), p = I(h), f = r.categoryPoints[o], g = s.data[o]; f || (r.categoryPoints[o] = f = []), p && (n = r.createPoint(e, t)), i = u[o], i || (i = new it({ vertical: c.invertAxes, gap: c.gap, spacing: c.spacing }), r.append(i)), n && (r.updateRange(d, t), i.append(n), n.categoryIx = o, n.category = a, n.series = s, n.seriesIx = l, n.owner = r, n.dataItem = g, n.noteText = e.fields.noteText), r.points.push(n), f.push(n) }, pointType: function() { return Lt }, createPoint: function(e, t) { var n, i = this, r = t.categoryIx, o = t.category, a = t.series, s = t.seriesIx, l = e.valueFields, c = Pn({}, a), d = i.pointType(), u = e.fields.color || a.color; return c = i.evalPointOptions(c, l, o, r, a, s), a.type == Hi && l.open > l.close && (u = e.fields.downColor || a.downColor || a.color), Tn.isFunction(a.color) && (u = c.color), n = new d(l, c), n.color = u, n }, splitValue: function(e) { return [e.low, e.open, e.close, e.high] }, updateRange: function(e, t) { var n = this, i = t.series.axis, r = n.valueAxisRanges[i], o = n.splitValue(e); r = n.valueAxisRanges[i] = r || { min: Hr, max: Lr }, r = n.valueAxisRanges[i] = { min: kn.min.apply(kn, o.concat([r.min])), max: kn.max.apply(kn, o.concat([r.max])) } }, formatPointValue: function(e, t) { var n = e.value; return ti(t, n.open, n.high, n.low, n.close, e.category) }, animationPoints: function() { return this.points } }), Pn(Nt.fn, St), Ot = Lt.extend({ reflow: function(e) { var t, n, i, r, o = this, a = o.options, s = o.owner, l = o.value, c = s.seriesValueAxis(a), d = [], u = [], h = []; r = c.getSlot(l.low, l.high), n = c.getSlot(l.open, l.open), i = c.getSlot(l.close, l.close), n.x1 = i.x1 = r.x1 = e.x1, n.x2 = i.x2 = r.x2 = e.x2, t = r.center().x, d.push([n.x1, n.y1]), d.push([t, n.y1]), u.push([t, i.y1]), u.push([i.x2, i.y1]), h.push([t, r.y1]), h.push([t, r.y2]), o.lines = [d, u, h], o.box = r.clone().wrap(n.clone().wrap(i)), o.reflowNote() }, createBody: e.noop }), Vt = Nt.extend({ pointType: function() { return Ot } }), Ut = Nt.extend({ addValue: function(e, t) { var n, i, r = this, o = t.categoryIx, a = t.category, s = t.series, l = t.seriesIx, c = r.options, d = r.children, u = e.valueFields, h = r.splitValue(u), p = I(h), f = r.categoryPoints[o], g = s.data[o]; f || (r.categoryPoints[o] = f = []), p && (n = r.createPoint(e, t)), i = d[o], i || (i = new it({ vertical: c.invertAxes, gap: c.gap, spacing: c.spacing }), r.append(i)), n && (r.updateRange(u, t), i.append(n), n.categoryIx = o, n.category = a, n.series = s, n.seriesIx = l, n.owner = r, n.dataItem = g), r.points.push(n), f.push(n) }, pointType: function() { return Wt }, splitValue: function(e) { return [e.lower, e.q1, e.median, e.q3, e.upper] }, updateRange: function(e, t) { var n = this, i = t.series.axis, r = n.valueAxisRanges[i], o = n.splitValue(e).concat(n.filterOutliers(e.outliers)); di(e.mean) && (o = o.concat(e.mean)), r = n.valueAxisRanges[i] = r || { min: Hr, max: Lr }, r = n.valueAxisRanges[i] = { min: kn.min.apply(kn, o.concat([r.min])), max: kn.max.apply(kn, o.concat([r.max])) } }, formatPointValue: function(e, t) { var n = e.value; return ti(t, n.lower, n.q1, n.median, n.q3, n.upper, n.mean, e.category) }, filterOutliers: function(e) { var t, n, i = (e || []).length, r = []; for (t = 0; i > t; t++) n = e[t], di(n) && T(r, n); return r } }), Wt = Lt.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.value = e, n.createNote() }, options: { border: { _brightness: .8 }, line: { width: 2 }, mean: { width: 2, dashType: "dash" }, overlay: { gradient: _r }, tooltip: { format: "<table style='text-align: left;'><th colspan='2'>{6:d}</th><tr><td>Lower:</td><td>{0:C}</td></tr><tr><td>Q1:</td><td>{1:C}</td></tr><tr><td>Median:</td><td>{2:C}</td></tr><tr><td>Mean:</td><td>{5:C}</td></tr><tr><td>Q3:</td><td>{3:C}</td></tr><tr><td>Upper:</td><td>{4:C}</td></tr></table>" }, highlight: { opacity: 1, border: { width: 1, opacity: 1 }, line: { width: 1, opacity: 1 } }, notes: { visible: !0, label: {} }, outliers: { visible: !0, size: Pr, type: qi, background: Yo, border: { width: 2, opacity: 1 }, opacity: 0 }, extremes: { visible: !0, size: Pr, type: Oi, background: Yo, border: { width: 2, opacity: 1 }, opacity: 0 } }, reflow: function(e) { var t, n, i, r, o, a = this, s = a.options, l = a.owner, c = a.value, d = l.seriesValueAxis(s); i = d.getSlot(c.q1, c.q3), a.boxSlot = i, n = d.getSlot(c.lower, c.upper), r = d.getSlot(c.median), i.x1 = n.x1 = e.x1, i.x2 = n.x2 = e.x2, a.realBody = i, c.mean && (o = d.getSlot(c.mean), a.meanPoints = [ [ [e.x1, o.y1], [e.x2, o.y1] ] ]), t = n.center().x, a.whiskerPoints = [ [ [t - 5, n.y1], [t + 5, n.y1], [t, n.y1], [t, i.y1] ], [ [t - 5, n.y2], [t + 5, n.y2], [t, n.y2], [t, i.y2] ] ], a.medianPoints = [ [ [e.x1, r.y1], [e.x2, r.y1] ] ], a.box = n.clone().wrap(i), a.reflowNote() }, renderOutliers: function(e) { var t, n, i, r, o = this, a = e.markers || {}, s = o.value, l = s.outliers || [], c = (o.owner.seriesValueAxis(e), 3 * kn.abs(s.q3 - s.q1)), d = []; for (r = 0; l.length > r; r++) i = l[r], a = s.q3 + c > i && i > s.q1 - c ? e.outliers : e.extremes, t = Pn({}, a.border), di(t.color) || (t.color = di(o.color) ? o.color : new Vn(a.background).brightness(Ai).toHex()), n = new Kn({ type: a.type, width: a.size, height: a.size, rotation: a.rotation, background: a.background, border: t, opacity: a.opacity }), n.value = i, d.push(n); return this.reflowOutliers(d), d }, reflowOutliers: function(e) { var t, n, i, r = this.owner.seriesValueAxis(this.options), o = this.box.center().x; for (t = 0; e.length > t; t++) n = e[t].value, i = r.getSlot(n).move(o), this.box = this.box.wrap(i), e[t].reflow(i) }, mainVisual: function(e) { var t, n, i = Lt.fn.mainVisual.call(this, e), r = this.renderOutliers(e); for (t = 0; r.length > t; t++) n = r[t].getElement(), n && i.append(n); return i }, createLines: function(e, t) { this.drawLines(e, t, this.whiskerPoints, t.line), this.drawLines(e, t, this.medianPoints, t.median), this.drawLines(e, t, this.meanPoints, t.mean) }, getBorderColor: function() { return this.color ? this.color : Lt.getBorderColor.call(this) } }), Pn(Wt.fn, ot), jt = On.extend({ init: function(e, t, n) { var i = this; i.value = e, i.sector = t, On.fn.init.call(i, n) }, options: { color: Yo, overlay: { gradient: co }, border: { width: .5 }, labels: { visible: !1, distance: 35, font: Zi, margin: ii(.5), align: Oi, zIndex: 1, position: eo }, animation: { type: to }, highlight: { visible: !0, border: { width: 1 } }, visible: !0 }, render: function() { var e, t = this, n = t.options, i = n.labels, r = t.value; t._rendered || t.visible === !1 || (t._rendered = !0, i.template ? (e = Fn(i.template), r = e({ dataItem: t.dataItem, category: t.category, value: t.value, series: t.series, percentage: t.percentage })) : i.format && (r = ti(i.format, r)), i.visible && r && (t.label = new Zn(r, Pn({}, i, { align: Li, vAlign: "", animation: { type: fr, delay: t.animationDelay } })), t.append(t.label))) }, reflow: function(e) { var t = this; t.render(), t.box = e, t.reflowLabel() }, reflowLabel: function() { var e, t, n, i, r = this, o = r.sector.clone(), a = r.options, s = r.label, l = a.labels, c = l.distance, d = o.middle(); s && (i = s.box.height(), n = s.box.width(), l.position == Li ? (o.r = kn.abs((o.r - i) / 2) + i, e = o.point(d), s.reflow(Ln(e.x, e.y - i / 2, e.x, e.y))) : l.position == Cr ? (o.r = o.r - i / 2, e = o.point(d), s.reflow(Ln(e.x, e.y - i / 2, e.x, e.y))) : (e = o.clone().expand(c).point(d), e.x >= o.c.x ? (t = e.x + n, s.orientation = lo) : (t = e.x - n, s.orientation = Dr), s.reflow(Ln(t, e.y - i, e.x, e.y)))) }, createVisual: function() { var e, t = this, n = t.sector, i = t.options, r = i.border || {}, o = r.width > 0 ? { stroke: { color: r.color, width: r.width, opacity: r.opacity, dashType: r.dashType } } : {}, a = i.color, s = { color: a, opacity: i.opacity }; On.fn.createVisual.call(this), t.value && (e = t.createSegment(n, Pn({ fill: s, stroke: { opacity: i.opacity }, zIndex: i.zIndex }, o)), this.visual.append(e), U(i) && this.visual.append(this.createGradientOverlay(e, { baseColor: a, fallbackFill: s }, Pn({ center: [n.c.x, n.c.y], innerRadius: n.ir, radius: n.r, userSpace: !0 }, i.overlay)))) }, createSegment: function(e, t) { return t.singleSegment ? new wi.Circle(new _i.Circle(new _i.Point(e.c.x, e.c.y), e.r), t) : Xn.current.createRing(e, t) }, createAnimation: function() { var e = this.options, t = this.sector.c; Pn(e, { animation: { center: [t.x, t.y], delay: this.animationDelay } }), On.fn.createAnimation.call(this) }, createHighlight: function(e) { var t = this, n = t.options.highlight || {}, i = n.border || {}; return t.createSegment(t.sector, Pn({}, e, { fill: { color: n.color, opacity: n.opacity }, stroke: { opacity: i.opacity, width: i.width, color: i.color } })) }, highlightVisual: function() { return this.visual.children[0] }, highlightVisualArgs: function() { var e = this.sector; return { options: this.options, radius: e.r, innerRadius: e.ir, center: new _i.Point(e.c.x, e.c.y), startAngle: e.startAngle, endAngle: e.angle + e.startAngle, visual: this.visual } }, tooltipAnchor: function(e, t) { var n = this, i = n.sector.adjacentBox(Lo, e, t); return new $n(i.x1, i.y1) }, formatValue: function(e) { var t = this; return t.owner.formatPointValue(t, e) } }), Pn(jt.fn, ot), Gt = { createLegendItem: function(e, t, n) { var i, r, o, a, s, l = this, c = l.options.legend || {}, d = c.labels || {}, u = c.inactiveItems || {}, h = u.labels || {}; n && n.visibleInLegend !== !1 && (s = n.visible !== !1, i = n.category || "", r = s ? d.template : h.template || d.template, r && (i = Fn(r)({ text: i, series: n.series, dataItem: n.dataItem, percentage: n.percentage, value: e })), s ? (a = {}, o = t.color) : (a = { color: h.color, font: h.font }, o = (u.markers || {}).color), i && l.legendItems.push({ pointIndex: n.index, text: i, series: n.series, markerColor: o, labels: a })) } }, qt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.plotArea = e, n.points = [], n.legendItems = [], n.render() }, options: { startAngle: 90, connectors: { width: 1, color: "#939393", padding: 4 }, inactiveItems: { markers: {}, labels: {} } }, render: function() { var e = this; e.traverseDataPoints(Sn(e.addValue, e)) }, traverseDataPoints: function(e) { var t, n, i, r, o, a, s, l, c, d, u, h, p, f = this, g = f.options, m = f.plotArea.options.seriesColors || [], v = m.length, _ = g.series, w = _.length, b = 0; for (r = 0; w > r; r++) { for (t = _[r], a = t.data, u = V(t), s = 360 / u, h = di(t.startAngle) ? t.startAngle : g.startAngle, r != w - 1 && t.labels.position == eo && (t.labels.position = Li), p = 0; a.length > p; p++) n = Q.current.bindPoint(t, p), l = n.valueFields.value, c = kn.abs(l), i = n.fields, o = c * s, d = 1 != a.length && !!i.explode, zn(t.color) || (t.color = i.color || m[p % v]), e(l, new Qn(null, 0, 0, h, o), { owner: f, category: i.category || "", index: b, series: t, seriesIx: r, dataItem: a[p], percentage: 0 !== u ? c / u : 0, explode: d, visibleInLegend: i.visibleInLegend, visible: i.visible, zIndex: w - r, animationDelay: f.animationDelay(p, r, w) }), n.fields.visible !== !1 && (h += o), b++; b = 0 } }, evalSegmentOptions: function(e, t, n) { var i = n.series; M(e, { value: t, series: i, dataItem: n.dataItem, category: n.category, percentage: n.percentage }, { defaults: i._defaults, excluded: ["data", "template", "visual", "toggle"] }) }, addValue: function(e, t, n) { var i, r = this, o = Pn({}, n.series, { index: n.index }); r.evalSegmentOptions(o, e, n), r.createLegendItem(e, o, n), n.visible !== !1 && (i = new jt(e, t, o), Cn(i, n), r.append(i), r.points.push(i)) }, reflow: function(e) { var t, n, i, r, o, a, s, l, c = this, d = c.options, u = e.clone(), h = 5, p = kn.min(u.width(), u.height()), f = p / 2, g = p - .85 * p, m = vi(d.padding, g), v = Ln(u.x1, u.y1, u.x1 + p, u.y1 + p), _ = v.center(), w = c.seriesConfigs || [], b = u.center(), y = c.points, k = y.length, x = d.series.length, C = [], S = []; for (m = m > f - h ? f - h : m, v.translate(b.x - _.x, b.y - _.y), a = f - m, l = $n(a + v.x1 + m, a + v.y1 + m), s = 0; k > s; s++) r = y[s], o = r.sector, o.r = a, o.c = l, n = r.seriesIx, w.length && (t = w[n], o.ir = t.ir, o.r = t.r), n == x - 1 && r.explode && (o.c = o.clone().radius(.15 * o.r).point(o.middle())), r.reflow(v), i = r.label, i && i.options.position === eo && n == x - 1 && (i.orientation === lo ? S.push(i) : C.push(i)); C.length > 0 && (C.sort(c.labelComparator(!0)), c.leftLabelsReflow(C)), S.length > 0 && (S.sort(c.labelComparator(!1)), c.rightLabelsReflow(S)), c.box = v }, leftLabelsReflow: function(e) { var t = this, n = t.distanceBetweenLabels(e); t.distributeLabels(n, e) }, rightLabelsReflow: function(e) { var t = this, n = t.distanceBetweenLabels(e); t.distributeLabels(n, e) }, distanceBetweenLabels: function(e) { var t, n, i, r = this, o = r.points, a = o[o.length - 1], s = a.sector, l = e[0].box, c = e.length - 1, d = s.r + a.options.labels.distance, u = []; for (n = si(l.y1 - (s.c.y - d - l.height() - l.height() / 2)), u.push(n), i = 0; c > i; i++) l = e[i].box, t = e[i + 1].box, n = si(t.y1 - l.y2), u.push(n); return n = si(s.c.y + d - e[c].box.y2 - e[c].box.height() / 2), u.push(n), u }, distributeLabels: function(e, t) { var n, i, r, o, a = this, s = e.length; for (o = 0; s > o; o++) for (i = r = o, n = -e[o]; n > 0 && (i >= 0 || s > r);) n = a._takeDistance(e, o, --i, n), n = a._takeDistance(e, o, ++r, n); a.reflowLabels(e, t) }, _takeDistance: function(e, t, n, i) { if (e[n] > 0) { var r = kn.min(e[n], i); i -= r, e[n] -= r, e[t] += r } return i }, reflowLabels: function(e, t) { var n, i, r, o, a = this, s = a.points, l = s[s.length - 1], c = l.sector, d = t.length, u = l.options.labels, h = u.distance, p = c.c.y - (c.r + h) - t[0].box.height(); for (e[0] += 2, o = 0; d > o; o++) n = t[o], p += e[o], r = n.box, i = a.hAlignLabel(r.x2, c.clone().expand(h), p, p + r.height(), n.orientation == lo), n.orientation == lo ? (u.align !== Oi && (i = c.r + c.c.x + h), n.reflow(Ln(i + r.width(), p, i, p))) : (u.align !== Oi && (i = c.c.x - c.r - h), n.reflow(Ln(i - r.width(), p, i, p))), p += r.height() }, createVisual: function() { var e, t, n, r, o, a, s, l, c, d, u, h, p, f, g = this, m = g.options, v = m.connectors, _ = g.points, w = _.length, b = 4; for (On.fn.createVisual.call(this), this._connectorLines = [], s = 0; w > s; s++) r = _[s], t = r.sector, n = t.middle(), a = r.label, o = { seriesId: r.seriesIx }, a && (e = new wi.Path({ stroke: { color: v.color, width: v.width }, animation: { type: fr, delay: r.animationDelay } }), a.options.position === eo && 0 !== r.value && (l = a.box, c = t.c, d = t.point(n), u = $n(l.x1, l.center().y), d = t.clone().expand(v.padding).point(n), e.moveTo(d.x, d.y), a.orientation == lo ? (p = $n(l.x1 - v.padding, l.center().y), f = i(c, d, u, p), u = $n(p.x - b, p.y), f = f || u, f.x = kn.min(f.x, u.x), g.pointInCircle(f, t.c, t.r + b) || t.c.x > f.x ? (h = t.c.x + t.r + b, r.options.labels.align !== ji ? u.x > h ? e.lineTo(h, d.y) : e.lineTo(d.x + 2 * b, d.y) : e.lineTo(h, d.y), e.lineTo(u.x, p.y)) : (f.y = p.y, e.lineTo(f.x, f.y))) : (p = $n(l.x2 + v.padding, l.center().y), f = i(c, d, u, p), u = $n(p.x + b, p.y), f = f || u, f.x = kn.max(f.x, u.x), g.pointInCircle(f, t.c, t.r + b) || f.x > t.c.x ? (h = t.c.x - t.r - b, r.options.labels.align !== ji ? h > u.x ? e.lineTo(h, d.y) : e.lineTo(d.x - 2 * b, d.y) : e.lineTo(h, d.y), e.lineTo(u.x, p.y)) : (f.y = p.y, e.lineTo(f.x, f.y))), e.lineTo(p.x, p.y), this._connectorLines.push(e), this.visual.append(e))) }, labelComparator: function(e) { return e = e ? -1 : 1, function(t, n) { return t = (t.parent.sector.middle() + 270) % 360, n = (n.parent.sector.middle() + 270) % 360, (t - n) * e } }, hAlignLabel: function(e, t, n, i, r) { var o = t.c.x, a = t.c.y, s = t.r, l = kn.min(kn.abs(a - n), kn.abs(a - i)); return l > s ? e : o + kn.sqrt(s * s - l * l) * (r ? 1 : -1) }, pointInCircle: function(e, t, n) { return d(t.x - e.x) + d(t.y - e.y) < d(n) }, formatPointValue: function(e, t) { return ti(t, e.value) }, animationDelay: function(e) { return e * no } }), Pn(qt.fn, Gt), $t = jt.extend({ options: { overlay: { gradient: uo }, labels: { position: Li }, animation: { type: to } }, reflowLabel: function() { var e, t, n = this, i = n.sector.clone(), r = n.options, o = n.label, a = r.labels, s = i.middle(); o && (t = o.box.height(), a.position == Li ? (i.r -= (i.r - i.ir) / 2, e = i.point(s), o.reflow(new Ln(e.x, e.y - t / 2, e.x, e.y))) : jt.fn.reflowLabel.call(n)) }, createSegment: function(e, t) { return Xn.current.createRing(e, t) } }), Pn($t.fn, ot), Yt = qt.extend({ options: { startAngle: 90, connectors: { width: 1, color: "#939393", padding: 4 } }, addValue: function(e, t, n) { var i, r = this, o = Pn({}, n.series, { index: n.index }); r.evalSegmentOptions(o, e, n), r.createLegendItem(e, o, n), e && n.visible !== !1 && (i = new $t(e, t, o), Cn(i, n), r.append(i), r.points.push(i)) }, reflow: function(e) { var t, n, i, r, o, a, s = this, l = s.options, c = e.clone(), d = 5, u = kn.min(c.width(), c.height()), h = u / 2, p = u - .85 * u, f = vi(l.padding, p), g = l.series, m = g.length, v = 0, _ = 0, w = 0, b = 0; for (s.seriesConfigs = [], f = f > h - d ? h - d : f, i = h - f, o = 0; m > o; o++) t = g[o], 0 === o && di(t.holeSize) && (n = t.holeSize, i -= t.holeSize), di(t.size) ? i -= t.size : v++, di(t.margin) && o != m - 1 && (i -= t.margin); for (di(n) || (b = (h - f) / (m + .75), n = .75 * b, i -= n), w = n, o = 0; m > o; o++) t = g[o], r = vi(t.size, i / v), w += _, a = w + r, s.seriesConfigs.push({ ir: w, r: a }), _ = t.margin || 0, w = a; qt.fn.reflow.call(s, e) }, animationDelay: function(e, t, n) { return e * rr + kr * (t + 1) / (n + 1) } }), Qt = ht.extend({ render: function() { ht.fn.render.call(this), this.createSegments() }, traverseDataPoints: function(e) { var t, n, i, r, o, a, s, l, d, u, h = this.options.series, p = this.categoryAxis.options.categories || [], f = c(h), g = !this.options.invertAxes; for (t = 0; h.length > t; t++) for (n = h[t], i = 0, r = 0, o = 0; f > o; o++) a = Q.current.bindPoint(n, o), s = a.valueFields.value, l = a.fields.summary, d = i, l ? "total" === l.toLowerCase() ? (a.valueFields.value = i, d = 0, u = i) : (a.valueFields.value = r, u = d - r, r = 0) : A(s) && (r += s, i += s, u = i), e(a, { category: p[o], categoryIx: o, series: n, seriesIx: t, total: i, runningTotal: r, from: d, to: u, isVertical: g }) }, updateRange: function(e, t) { ht.fn.updateRange.call(this, { value: t.to }, t) }, aboveAxis: function(e) { return e.value >= 0 }, plotRange: function(e) { return [e.from, e.to] }, createSegments: function() { var e, t, n, i, r, o, a, s = this.options.series, l = this.seriesPoints, c = this.segments = []; for (e = 0; s.length > e; e++) if (t = s[e], n = l[e]) for (r = 0; n.length > r; r++) o = n[r], o && i && (a = new Kt(i, o, t), c.push(a), this.append(a)), i = o } }), Kt = On.extend({ init: function(e, t, n) { var i = this; On.fn.init.call(i), i.from = e, i.to = t, i.series = n }, options: { animation: { type: fr, delay: kr } }, linePoints: function() { var e, t, n = [], i = this.from, r = i.box, o = this.to.box; return i.isVertical ? (e = i.aboveAxis ? r.y1 : r.y2, n.push([r.x1, e], [o.x2, e])) : (t = i.aboveAxis ? r.x2 : r.x1, n.push([t, r.y1], [t, o.y2])), n }, createVisual: function() { var e, t, n; On.fn.createVisual.call(this), e = this.options, t = this.series.line || {}, n = wi.Path.fromPoints(this.linePoints(), { stroke: { color: t.color, width: t.width, opacity: t.opacity, dashType: t.dashType } }), ei(n), this.visual.append(n) } }), Xt = Nn.extend({ init: function(e) { var t = this; Nn.fn.init.call(t, e), e = t.options, t.id = Tn.guid(), t.createTitle(), t.content = new On, t.chartContainer = new Zt({}, t), t.append(t.content), t.axes = [], t.charts = [] }, options: { zIndex: -1, shrinkToFit: !0, title: { align: Dr }, visible: !0 }, createTitle: function() { var e = this, t = e.options.title; typeof t === Zr && (t = Pn({}, t, { align: t.position, position: Ho })), e.title = Jn.buildTitle(t, e, Xt.fn.options.title) }, appendAxis: function(e) { var t = this; t.content.append(e), t.axes.push(e), e.pane = t }, appendChart: function(e) { var t = this; t.chartContainer.parent !== t.content && t.content.append(t.chartContainer), t.charts.push(e), t.chartContainer.append(e), e.pane = t }, empty: function() { var e, t = this, n = t.parent; if (n) { for (e = 0; t.axes.length > e; e++) n.removeAxis(t.axes[e]); for (e = 0; t.charts.length > e; e++) n.removeChart(t.charts[e]) } t.axes = [], t.charts = [], t.content.destroy(), t.content.children = [], t.chartContainer.children = [] }, reflow: function(e) { var t, n = this; ui(n.children) === n.content && (t = n.children.pop()), Nn.fn.reflow.call(n, e), t && n.children.push(t), n.title && (n.contentBox.y1 += n.title.box.height()) }, visualStyle: function() { var e = Nn.fn.visualStyle.call(this); return e.zIndex = -10, e }, renderComplete: function() { this.options.visible && this.createGridLines() }, stackRoot: W, clipRoot: W, createGridLines: function() { var e, t, n, i, r, o, a = this, s = a.axes, l = s.concat(a.parent.axes), c = [], d = []; for (t = 0; s.length > t; t++) for (i = s[t], r = i.options.vertical, e = r ? c : d, n = 0; l.length > n; n++) 0 === e.length && (o = l[n], r !== o.options.vertical && ci(e, i.createGridLines(o))) }, refresh: function() { this.visual.clear(), this.content.parent = null, this.content.createGradient = e.proxy(this.createGradient, this), this.content.renderVisual(), this.content.parent = this, this.title && this.visual.append(this.title.visual), this.visual.append(this.content.visual), this.renderComplete() }, clipBox: function() { return this.chartContainer.clipBox } }), Zt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, e), n.pane = t }, shouldClip: function() { var e, t = this, n = t.children, i = n.length; for (e = 0; i > e; e++) if (n[e].options.clip === !0) return !0; return !1 }, _clipBox: function() { var e, t, n, i, r = this, o = r.pane, a = o.axes, s = a.length, l = o.box.clone(); for (t = 0; s > t; t++) i = a[t], e = i.options.vertical ? Ko : Qo, n = i.lineBox(), l[e + 1] = n[e + 1], l[e + 2] = n[e + 2]; return l }, createVisual: function() { var e, t, n; this.visual = new wi.Group({ zIndex: 0 }), this.shouldClip() && (e = this.clipBox = this._clipBox(), t = e.toRect(), n = wi.Path.fromRect(t), this.visual.clip(n), this.unclipLabels()) }, stackRoot: W, unclipLabels: function() { var e, t, n, i, r, o = this, a = o.children, s = o.clipBox; for (n = 0; a.length > n; n++) for (e = a[n].points || {}, r = e.length, i = 0; r > i; i++) t = e[i], t && t.label && t.label.options.visible && t.box.overlaps(s) && (t.label.alignToClipBox && t.label.alignToClipBox(s), t.label.options.noclip = !0) }, destroy: function() { On.fn.destroy.call(this), delete this.parent } }), Jt = On.extend({ init: function(e, t) { var n = this; On.fn.init.call(n, t), n.series = e, n.initSeries(), n.charts = [], n.options.legend.items = [], n.axes = [], n.crosshairs = [], n.createPanes(), n.render(), n.createCrosshairs() }, options: { series: [], plotArea: { margin: {} }, background: "", border: { color: Ii, width: 0 }, legend: { inactiveItems: { labels: { color: "#919191" }, markers: { color: "#919191" } } } }, initSeries: function() { var e, t, n = this.series; for (e = 0; n.length > e; e++) t = n[e], t.index = e }, createPanes: function() { var e, t, n = this, i = [], r = n.options.panes || [], o = kn.max(r.length, 1); for (e = 0; o > e; e++) t = new Xt(r[e]), t.paneIndex = e, i.push(t), n.append(t); n.panes = i }, createCrosshairs: function(e) { var t, n, i, r, o, a = this; for (e = e || a.panes, t = 0; e.length > t; t++) for (i = e[t], n = 0; i.axes.length > n; n++) r = i.axes[n], r.options.crosshair && r.options.crosshair.visible && (o = new hn(r, r.options.crosshair), a.crosshairs.push(o), i.content.append(o)) }, removeCrosshairs: function(e) { var t, n, i = this, r = i.crosshairs, o = e.axes; for (t = r.length - 1; t >= 0; t--) for (n = 0; o.length > n; n++) if (r[t].axis === o[n]) { r.splice(t, 1); break } }, hideCrosshairs: function() { var e, t = this.crosshairs; for (e = 0; t.length > e; e++) t[e].hide() }, findPane: function(e) { var t, n, i = this, r = i.panes; for (t = 0; r.length > t; t++) if (r[t].options.name === e) { n = r[t]; break } return n || r[0] }, findPointPane: function(e) { var t, n, i = this, r = i.panes; for (t = 0; r.length > t; t++) if (r[t].box.containsPoint(e)) { n = r[t]; break } return n }, appendAxis: function(e) { var t = this, n = t.findPane(e.options.pane); n.appendAxis(e), t.axes.push(e), e.plotArea = t }, removeAxis: function(e) { var t, n, i = this, r = []; for (t = 0; i.axes.length > t; t++) n = i.axes[t], e !== n ? r.push(n) : n.destroy(); i.axes = r }, appendChart: function(e, t) { var n = this; n.charts.push(e), t ? t.appendChart(e) : n.append(e) }, removeChart: function(e) { var t, n, i = this, r = []; for (t = 0; i.charts.length > t; t++) n = i.charts[t], n !== e ? r.push(n) : n.destroy(); i.charts = r }, addToLegend: function(e) { var t, n, i, r, o, a, s, l, c, d = e.length, u = [], h = this.options.legend, p = h.labels || {}, f = h.inactiveItems || {}, g = f.labels || {}; for (t = 0; d > t; t++) n = e[t], l = n.visible !== !1, n.visibleInLegend !== !1 && (i = n.name || "", c = l ? p.template : g.template || p.template, c && (i = Fn(c)({ text: i, series: n })), r = n.color, s = n._defaults, zn(r) && s && (r = s.color), l ? (o = {}, a = r) : (o = { color: g.color, font: g.font }, a = f.markers.color), i && u.push({ text: i, labels: o, markerColor: a, series: n, active: l })); ci(h.items, u) }, groupAxes: function(e) { var t, n, i, r, o = [], a = []; for (i = 0; e.length > i; i++) for (t = e[i].axes, r = 0; t.length > r; r++) n = t[r], n.options.vertical ? a.push(n) : o.push(n); return { x: o, y: a, any: o.concat(a) } }, groupSeriesByPane: function() { var e, t, n, i = this, r = i.series, o = {}; for (e = 0; r.length > e; e++) n = r[e], t = i.seriesPaneName(n), o[t] ? o[t].push(n) : o[t] = [n]; return o }, filterVisibleSeries: function(e) { var t, n, i = []; for (t = 0; e.length > t; t++) n = e[t], n.visible !== !1 && i.push(n); return i }, reflow: function(e) { var t = this, n = t.options.plotArea, i = t.panes, r = ii(n.margin); t.box = e.clone().unpad(r), t.reflowPanes(), t.reflowAxes(i), t.reflowCharts(i) }, redraw: function(e) { var t, n = this; for (e = [].concat(e), this.initSeries(), t = 0; e.length > t; t++) n.removeCrosshairs(e[t]), e[t].empty(); for (n.render(e), n.reflowAxes(n.panes), n.reflowCharts(e), n.createCrosshairs(e), t = 0; e.length > t; t++) e[t].refresh() }, axisCrossingValues: function(e, t) { var n, i = e.options, r = [].concat(i.axisCrossingValues || i.axisCrossingValue), o = t.length - r.length, a = r[0] || 0; for (n = 0; o > n; n++) r.push(a); return r }, alignAxisTo: function(e, t, n, i) { var r = e.getSlot(n, n, !0), o = e.options.reverse ? 2 : 1, a = t.getSlot(i, i, !0), s = t.options.reverse ? 2 : 1, l = e.box.translate(a[Qo + s] - r[Qo + o], a[Ko + s] - r[Ko + o]); e.pane !== t.pane && l.translate(0, e.pane.box.y1 - t.pane.box.y1), e.reflow(l) }, alignAxes: function(e, t) { var n, i, r, o, a = this, s = e[0], l = t[0], c = a.axisCrossingValues(s, t), d = a.axisCrossingValues(l, e), u = {}, h = {}, p = {}, f = {}; for (o = 0; t.length > o; o++) r = t[o], n = r.pane, i = n.id, a.alignAxisTo(r, s, d[o], c[o]), r.options._overlap || (si(r.lineBox().x1) === si(s.lineBox().x1) && (u[i] && r.reflow(r.box.alignTo(u[i].box, Dr).translate(-r.options.margin, 0)), u[i] = r), si(r.lineBox().x2) === si(s.lineBox().x2) && (r._mirrored || (r.options.labels.mirror = !r.options.labels.mirror, r._mirrored = !0), a.alignAxisTo(r, s, d[o], c[o]), h[i] && r.reflow(r.box.alignTo(h[i].box, lo).translate(r.options.margin, 0)), h[i] = r), 0 !== o && l.pane === r.pane && (r.alignTo(l), r.reflow(r.box))); for (o = 0; e.length > o; o++) r = e[o], n = r.pane, i = n.id, a.alignAxisTo(r, l, c[o], d[o]), r.options._overlap || (si(r.lineBox().y1) === si(l.lineBox().y1) && (r._mirrored || (r.options.labels.mirror = !r.options.labels.mirror, r._mirrored = !0), a.alignAxisTo(r, l, c[o], d[o]), p[i] && r.reflow(r.box.alignTo(p[i].box, Ho).translate(0, -r.options.margin)), p[i] = r), si(r.lineBox().y2, Gi) === si(l.lineBox().y2, Gi) && (f[i] && r.reflow(r.box.alignTo(f[i].box, Mi).translate(0, r.options.margin)), f[i] = r), 0 !== o && (r.alignTo(s), r.reflow(r.box))) }, shrinkAxisWidth: function(e) { var t, n, i, r = this, o = r.groupAxes(e).any, a = x(o), s = 0; for (t = 0; e.length > t; t++) n = e[t], n.axes.length > 0 && (s = kn.max(s, a.width() - n.contentBox.width())); if (0 !== s) for (t = 0; o.length > t; t++) i = o[t], i.options.vertical || i.reflow(i.box.shrink(s, 0)) }, shrinkAxisHeight: function(e) { var t, n, i, r, o, a, s; for (t = 0; e.length > t; t++) if (n = e[t], i = n.axes, r = kn.max(0, x(i).height() - n.contentBox.height()), 0 !== r) { for (o = 0; i.length > o; o++) a = i[o], a.options.vertical && a.reflow(a.box.shrink(0, r)); s = !0 } return s }, fitAxes: function(e) { var t, n, i, r, o, a, s, l, c = this, d = c.groupAxes(e).any, u = 0; for (s = 0; e.length > s; s++) if (o = e[s], t = o.axes, n = o.contentBox, t.length > 0) for (i = x(t), u = kn.max(u, n.x1 - i.x1), r = kn.max(n.y1 - i.y1, n.y2 - i.y2), l = 0; t.length > l; l++) a = t[l], a.reflow(a.box.translate(0, r)); for (s = 0; d.length > s; s++) a = d[s], a.reflow(a.box.translate(u, 0)) }, reflowAxes: function(e) { var t, n = this, i = n.groupAxes(e); for (t = 0; e.length > t; t++) n.reflowPaneAxes(e[t]); i.x.length > 0 && i.y.length > 0 && (n.alignAxes(i.x, i.y), n.shrinkAxisWidth(e), n.autoRotateAxisLabels(i), n.alignAxes(i.x, i.y), n.shrinkAxisWidth(e) && n.alignAxes(i.x, i.y), n.shrinkAxisHeight(e), n.alignAxes(i.x, i.y), n.shrinkAxisHeight(e) && n.alignAxes(i.x, i.y), n.fitAxes(e)) }, autoRotateAxisLabels: function(e) { var t, n, i, r = this.axes, o = this.panes; for (n = 0; r.length > n; n++) t = r[n], t.autoRotateLabels() && (i = !0); if (i) { for (n = 0; o.length > n; n++) this.reflowPaneAxes(o[n]); e.x.length > 0 && e.y.length > 0 && (this.alignAxes(e.x, e.y), this.shrinkAxisWidth(o)) } }, reflowPaneAxes: function(e) { var t, n = e.axes, i = n.length; if (i > 0) for (t = 0; i > t; t++) n[t].reflow(e.contentBox) }, reflowCharts: function(e) { var t, n, i = this, r = i.charts, o = r.length, a = i.box; for (n = 0; o > n; n++) t = r[n].pane, (!t || ri(t, e)) && r[n].reflow(a) }, reflowPanes: function() { var e, t, n, i, r, o = this, a = o.box, s = o.panes, l = s.length, c = a.height(), d = l, u = 0, h = a.y1; for (e = 0; l > e; e++) t = s[e], i = t.options.height, t.options.width = a.width(), t.options.height ? (i.indexOf && i.indexOf("%") && (r = parseInt(i, 10) / 100, t.options.height = r * a.height()), t.reflow(a.clone()), c -= t.options.height) : u++; for (e = 0; l > e; e++) t = s[e], t.options.height || (t.options.height = c / u); for (e = 0; l > e; e++) t = s[e], n = a.clone().move(a.x1, h), t.reflow(n), d--, h += t.options.height }, backgroundBox: function() { var e, t, n, i, r, o, a = this, s = a.axes, l = s.length; for (n = 0; l > n; n++) for (r = s[n], i = 0; l > i; i++) o = s[i], r.options.vertical !== o.options.vertical && (e = r.lineBox().clone().wrap(o.lineBox()), t = t ? t.wrap(e) : e); return t || a.box }, createVisual: function() { var e, t, n, i, r, o; On.fn.createVisual.call(this), e = this.backgroundBox(), t = this.options.plotArea, n = t.border || {}, i = t.background, r = t.opacity, li.isTransparent(i) && (i = Yo, r = 0), o = this._bgVisual = wi.Path.fromRect(e.toRect(), { fill: { color: i, opacity: r }, stroke: { color: n.width ? n.color : "", width: n.width, dashType: n.dashType }, zIndex: -1 }), this.appendVisual(o) }, pointsByCategoryIndex: function(e) { var t, n, i, r, o, a = this.charts, s = []; if (null !== e) for (t = 0; a.length > t; t++) if (o = a[t], "_navigator" !== o.pane.options.name && (i = a[t].categoryPoints[e], i && i.length)) for (n = 0; i.length > n; n++) r = i[n], r && di(r.value) && null !== r.value && s.push(r); return s }, pointsBySeriesIndex: function(e) { var t, n, i, r, o, a = this.charts, s = []; for (i = 0; a.length > i; i++) for (o = a[i], t = o.points, r = 0; t.length > r; r++) n = t[r], n && n.options.index === e && s.push(n); return s }, pointsBySeriesName: function(e) { var t, n, i, r, o, a = this.charts, s = []; for (i = 0; a.length > i; i++) for (o = a[i], t = o.points, r = 0; t.length > r; r++) n = t[r], n && n.series.name === e && s.push(n); return s }, paneByPoint: function(e) { var t, n, i = this, r = i.panes; for (n = 0; r.length > n; n++) if (t = r[n], t.box.containsPoint(e)) return t } }), en = Jt.extend({ init: function(e, t) { var n, i, r = this; if (r.namedCategoryAxes = {}, r.namedValueAxes = {}, r.valueAxisRangeTracker = new tn, e.length > 0) for (r.invertAxes = ri(e[0].type, [Ti, Ri, Go, Wo, oo, br]), n = 0; e.length > n; n++) if (i = e[n].stack, i && "100%" === i.type) { r.stack100 = !0; break } Jt.fn.init.call(r, e, t) }, options: { categoryAxis: { categories: [] }, valueAxis: {} }, render: function(e) { var t = this; e = e || t.panes, t.createCategoryAxes(e), t.aggregateCategories(e), t.createCategoryAxesLabels(e), t.createCharts(e), t.createValueAxes(e) }, removeAxis: function(e) { var t = this, n = e.options.name; Jt.fn.removeAxis.call(t, e), e instanceof et ? delete t.namedCategoryAxes[n] : (t.valueAxisRangeTracker.reset(n), delete t.namedValueAxes[n]), e === t.categoryAxis && delete t.categoryAxis, e === t.valueAxis && delete t.valueAxis }, createCharts: function(e) { var t, n, i, r, o, a, s = this.groupSeriesByPane(); for (t = 0; e.length > t; t++) if (n = e[t], i = s[n.options.name || "default"] || [], this.addToLegend(i), r = this.filterVisibleSeries(i)) for (o = this.groupSeriesByCategoryAxis(r), a = 0; o.length > a; a++) this.createChartGroup(o[a], n) }, createChartGroup: function(e, t) { this.createAreaChart(F(e, [ki, Wo]), t), this.createBarChart(F(e, [ji, Ti]), t), this.createRangeBarChart(F(e, [ao, oo]), t), this.createBulletChart(F(e, [Ri, jo]), t), this.createCandlestickChart(F(e, Hi), t), this.createBoxPlotChart(F(e, zi), t), this.createOHLCChart(F(e, Jr), t), this.createWaterfallChart(F(e, [qo, br]), t), this.createLineChart(F(e, [Ir, Go]), t) }, aggregateCategories: function(e) { var t, n, i, r, o, a = this, s = a.srcSeries || a.series, l = []; for (t = 0; s.length > t; t++) n = s[t], i = a.seriesCategoryAxis(n), r = a.findPane(i.options.pane), o = C(i.options.type, Ki), (o || n.categoryField) && ri(r, e) && (n = a.aggregateSeries(n, i)), l.push(n); a.srcSeries = s, a.series = l }, aggregateSeries: function(e, t) { var i, r, o, a, s, l = t.options, c = C(t.options.type, Ki), d = l.categories, p = l.srcCategories || d, f = e.data, g = [], m = t.range(), v = Pn({}, e), _ = Pn({}, e), w = u; for (v.data = a = [], c && (w = h), i = 0; f.length > i; i++) r = e.categoryField ? w(e.categoryField, f[i]) : p[i], o = t.categoryIndex(r, m), o > -1 && (g[o] = g[o] || [], g[o].push(i)); for (s = new mn(_, Q.current, n.current), i = 0; d.length > i; i++) a[i] = s.aggregatePoints(g[i], d[i]); return t.options.dataItems = a, v }, appendChart: function(e, t) { for (var n = this, i = e.options.series, r = n.seriesCategoryAxis(i[0]), o = r.options.categories, a = kn.max(0, c(i) - o.length); a--;) o.push(""); n.valueAxisRangeTracker.update(e.valueAxisRanges), Jt.fn.appendChart.call(n, e, t) }, seriesPaneName: function(t) { var n = this, i = n.options, r = t.axis, o = [].concat(i.valueAxis), a = e.grep(o, function(e) { return e.name === r })[0], s = i.panes || [{}], l = (s[0] || {}).name || "default", c = (a || {}).pane || l; return c }, seriesCategoryAxis: function(e) { var t = this, n = e.categoryAxis, i = n ? t.namedCategoryAxes[n] : t.categoryAxis; if (!i) throw Error("Unable to locate category axis with name " + n); return i }, stackableChartOptions: function(e, t) { var n, i = e.stack, r = i && "100%" === i.type; return di(t.options.clip) ? n = t.options.clip : r && (n = !1), { isStacked: i, isStacked100: r, clip: n } }, groupSeriesByCategoryAxis: function(n) { function i(t, i) { return e.grep(n, function(e) { return 0 === i && !e.categoryAxis || e.categoryAxis == t }) } var r, o, a, s = {}, l = e.map(n, function(e) { var n = e.categoryAxis || "$$default$$"; return s.hasOwnProperty(n) ? t : (s[n] = !0, n) }), c = []; for (r = 0; l.length > r; r++) o = l[r], a = i(o, r), 0 !== a.length && c.push(a); return c }, createBarChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new ht(n, Cn({ series: e, invertAxes: n.invertAxes, gap: i.gap, spacing: i.spacing }, n.stackableChartOptions(i, t))); n.appendChart(r, t) } }, createRangeBarChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new ft(n, { series: e, invertAxes: n.invertAxes, gap: i.gap, spacing: i.spacing }); n.appendChart(r, t) } }, createBulletChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new gt(n, { series: e, invertAxes: n.invertAxes, gap: i.gap, spacing: i.spacing, clip: t.options.clip }); n.appendChart(r, t) } }, createLineChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Tt(n, Cn({ invertAxes: n.invertAxes, series: e }, n.stackableChartOptions(i, t))); n.appendChart(r, t) } }, createAreaChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Mt(n, Cn({ invertAxes: n.invertAxes, series: e }, n.stackableChartOptions(i, t))); n.appendChart(r, t) } }, createOHLCChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Vt(n, { invertAxes: n.invertAxes, gap: i.gap, series: e, spacing: i.spacing, clip: t.options.clip }); n.appendChart(r, t) } }, createCandlestickChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Nt(n, { invertAxes: n.invertAxes, gap: i.gap, series: e, spacing: i.spacing, clip: t.options.clip }); n.appendChart(r, t) } }, createBoxPlotChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Ut(n, { invertAxes: n.invertAxes, gap: i.gap, series: e, spacing: i.spacing, clip: t.options.clip }); n.appendChart(r, t) } }, createWaterfallChart: function(e, t) { if (0 !== e.length) { var n = this, i = e[0], r = new Qt(n, { series: e, invertAxes: n.invertAxes, gap: i.gap, spacing: i.spacing }); n.appendChart(r, t) } }, axisRequiresRounding: function(e, t) { var n, i, r, o, a = this, s = F(a.series, ra); for (n = 0; a.series.length > n; n++) r = a.series[n], (r.type === Ir || r.type === ki) && (o = r.line, o && o.style === yo && s.push(r)); for (n = 0; s.length > n; n++) if (i = s[n].categoryAxis || "", i === e || !i && 0 === t) return !0 }, createCategoryAxesLabels: function() { var e, t = this.axes; for (e = 0; t.length > e; e++) t[e] instanceof et && t[e].createLabels() }, createCategoryAxes: function(e) { var t, n, i, r, o, a, s, l, c = this, d = c.invertAxes, u = [].concat(c.options.categoryAxis), h = []; for (t = 0; u.length > t; t++) if (n = u[t], i = c.findPane(n.pane), ri(i, e)) { if (a = n.name, r = n.categories || [], o = n.type || "", n = Pn({ vertical: d, axisCrossingValue: d ? Hr : 0, _deferLabels: !0 }, n), di(n.justified) || (n.justified = c.isJustified()), c.axisRequiresRounding(a, t) && (n.justified = !1, n.roundToBaseUnit = !0), s = L(n, r[0]) ? new tt(n) : new et(n), a) { if (c.namedCategoryAxes[a]) throw Error("Category axis with name " + a + " is already defined"); c.namedCategoryAxes[a] = s } s.axisIndex = t, h.push(s), c.appendAxis(s) } l = c.categoryAxis || h[0], c.categoryAxis = l, d ? c.axisY = l : c.axisX = l }, isJustified: function() { var e, t, n = this, i = n.series; for (e = 0; i.length > e; e++) if (t = i[e], !ri(t.type, [ki, Wo])) return !1; return !0 }, createValueAxes: function(e) { var t, n, i, r, o, a, s, l, c, d = this, u = d.valueAxisRangeTracker, h = u.query(), p = [].concat(d.options.valueAxis), f = d.invertAxes, g = { vertical: !f }, m = []; for (d.stack100 && (g.roundToMajorUnit = !1, g.labels = { format: "P0" }), c = 0; p.length > c; c++) if (t = p[c], n = d.findPane(t.pane), ri(n, e)) { if (l = t.name, s = C(t.type, zr) ? { min: .1, max: 1 } : { min: 0, max: 1 }, o = u.query(l) || h || s, 0 === c && o && h && (o.min = kn.min(o.min, h.min), o.max = kn.max(o.max, h.max)), a = C(t.type, zr) ? Gn : qn, i = new a(o.min, o.max, Pn({}, g, t)), l) { if (d.namedValueAxes[l]) throw Error("Value axis with name " + l + " is already defined"); d.namedValueAxes[l] = i } i.axisIndex = c, m.push(i), d.appendAxis(i) } r = d.valueAxis || m[0], d.valueAxis = r, f ? d.axisX = r : d.axisY = r }, click: function(t, n) { var i, r, o, a = this, s = t._eventCoordinates(n), l = new $n(s.x, s.y), c = a.pointPane(l), d = [], u = []; if (c) { for (i = c.axes, r = 0; i.length > r; r++) o = i[r], o.getValue ? T(u, o.getValue(l)) : T(d, o.getCategory(l)); 0 === d.length && T(d, a.categoryAxis.getCategory(l)), d.length > 0 && u.length > 0 && t.trigger(io, { element: e(n.target), originalEvent: n, category: k(d), value: k(u) }) } }, pointPane: function(e) { var t, n, i = this, r = i.panes; for (n = 0; r.length > n; n++) if (t = r[n], t.contentBox.containsPoint(e)) return t } }), tn = Dn.extend({ init: function() { var e = this; e.axisRanges = {} }, update: function(e) { var t, n, i, r = this, o = r.axisRanges; for (i in e) t = o[i], n = e[i], o[i] = t = t || { min: Hr, max: Lr }, t.min = kn.min(t.min, n.min), t.max = kn.max(t.max, n.max) }, reset: function(e) { this.axisRanges[e] = t }, query: function(e) { return this.axisRanges[e] } }), nn = Jt.extend({ init: function(e, t) { var n = this; n.namedXAxes = {}, n.namedYAxes = {}, n.xAxisRangeTracker = new tn, n.yAxisRangeTracker = new tn, Jt.fn.init.call(n, e, t) }, options: { xAxis: {}, yAxis: {} }, render: function(e) { var t, n, i, r, o = this, a = o.groupSeriesByPane(); for (e = e || o.panes, t = 0; e.length > t; t++) n = e[t], i = a[n.options.name || "default"] || [], o.addToLegend(i), r = o.filterVisibleSeries(i), r && (o.createScatterChart(F(r, ho), n), o.createScatterLineChart(F(r, po), n), o.createBubbleChart(F(r, Fi), n)); o.createAxes(e) }, appendChart: function(e, t) { var n = this; n.xAxisRangeTracker.update(e.xAxisRanges), n.yAxisRangeTracker.update(e.yAxisRanges), Jt.fn.appendChart.call(n, e, t) }, removeAxis: function(e) { var t = this, n = e.options.name; Jt.fn.removeAxis.call(t, e), e.options.vertical ? (t.yAxisRangeTracker.reset(n), delete t.namedYAxes[n]) : (t.xAxisRangeTracker.reset(n), delete t.namedXAxes[n]), e === t.axisX && delete t.axisX, e === t.axisY && delete t.axisY }, seriesPaneName: function(t) { var n = this, i = n.options, r = t.xAxis, o = [].concat(i.xAxis), a = e.grep(o, function(e) { return e.name === r })[0], s = t.yAxis, l = [].concat(i.yAxis), c = e.grep(l, function(e) { return e.name === s })[0], d = i.panes || [{}], u = d[0].name || "default", h = (a || {}).pane || (c || {}).pane || u; return h }, createScatterChart: function(e, t) { var n = this; e.length > 0 && n.appendChart(new Rt(n, { series: e, clip: t.options.clip }), t) }, createScatterLineChart: function(e, t) { var n = this; e.length > 0 && n.appendChart(new Ht(n, { series: e, clip: t.options.clip }), t) }, createBubbleChart: function(e, t) { var n = this; e.length > 0 && n.appendChart(new Bt(n, { series: e, clip: t.options.clip }), t) }, createXYAxis: function(e, t, n) { var i, r, o, a, s, l, c, d, u = this, h = e.name, p = t ? u.namedYAxes : u.namedXAxes, f = t ? u.yAxisRangeTracker : u.xAxisRangeTracker, g = Pn({}, e, { vertical: t }), m = C(g.type, zr), v = f.query(), _ = m ? { min: .1, max: 1 } : { min: 0, max: 1 }, w = f.query(h) || v || _, b = u.series, y = [g.min, g.max]; for (o = 0; b.length > o; o++) if (a = b[o], s = a[t ? "yAxis" : "xAxis"], s == g.name || 0 === n && !s) { l = Q.current.bindPoint(a, 0).valueFields, y.push(l[t ? "y" : "x"]); break } for (0 === n && v && (w.min = kn.min(w.min, v.min), w.max = kn.max(w.max, v.max)), d = 0; y.length > d; d++) if (y[d] instanceof Date) { c = !0; break } if (r = C(g.type, Ki) || !g.type && c ? nt : m ? Gn : qn, i = new r(w.min, w.max, g), h) { if (p[h]) throw Error((t ? "Y" : "X") + " axis with name " + h + " is already defined"); p[h] = i } return u.appendAxis(i), i }, createAxes: function(e) { var t, n = this, i = n.options, r = [].concat(i.xAxis), o = [], a = [].concat(i.yAxis), s = []; _n(r, function(i) { t = n.findPane(this.pane), ri(t, e) && o.push(n.createXYAxis(this, !1, i)) }), _n(a, function(i) { t = n.findPane(this.pane), ri(t, e) && s.push(n.createXYAxis(this, !0, i)) }), n.axisX = n.axisX || o[0], n.axisY = n.axisY || s[0] }, click: function(t, n) { var i, r, o, a, s = this, l = t._eventCoordinates(n), c = new $n(l.x, l.y), d = s.axes, u = d.length, h = [], p = []; for (i = 0; u > i; i++) r = d[i], a = r.options.vertical ? p : h, o = r.getValue(c), null !== o && a.push(o); h.length > 0 && p.length > 0 && t.trigger(io, { element: e(n.target), originalEvent: n, x: k(h), y: k(p) }) } }), rn = Jt.extend({ render: function() { var e = this, t = e.series; e.createPieChart(t) }, createPieChart: function(e) { var t = this, n = e[0], i = new qt(t, { series: e, padding: n.padding, startAngle: n.startAngle, connectors: n.connectors, legend: t.options.legend }); t.appendChart(i) }, appendChart: function(e, t) { Jt.fn.appendChart.call(this, e, t), ci(this.options.legend.items, e.legendItems) } }), on = rn.extend({ render: function() { var e = this, t = e.series; e.createDonutChart(t) }, createDonutChart: function(e) { var t = this, n = e[0], i = new Yt(t, { series: e, padding: n.padding, connectors: n.connectors, legend: t.options.legend }); t.appendChart(i) } }), an = wi.Animation.extend({ options: { easing: "easeOutElastic", duration: kr }, setup: function() { this.element.transform(_i.transform().scale(bo, bo, this.options.center)) }, step: function(e) { this.element.transform(_i.transform().scale(e, e, this.options.center)) } }), wi.AnimationFactory.current.register(to, an), sn = wi.Animation.extend({ options: { easing: "easeOutElastic" }, setup: function() { var e = this.center = this.element.bbox().center(); this.element.transform(_i.transform().scale(bo, bo, e)) }, step: function(e) { this.element.transform(_i.transform().scale(e, e, this.center)) } }), wi.AnimationFactory.current.register(Fi, sn), ln = Dn.extend({ init: function() { this._points = [] }, destroy: function() { this._points = [] }, show: function(e) { var t, n; for (e = [].concat(e), this.hide(), t = 0; e.length > t; t++) n = e[t], n && n.toggleHighlight && n.hasHighlight() && (this.togglePointHighlight(n, !0), this._points.push(n)) }, togglePointHighlight: function(e, t) { var n, i = (e.options.highlight || {}).toggle; i ? (n = { category: e.category, series: e.series, dataItem: e.dataItem, value: e.value, preventDefault: G, visual: e.highlightVisual(), show: t }, i(n), n._defaultPrevented || e.toggleHighlight(t)) : e.toggleHighlight(t) }, hide: function() { for (var e = this._points; e.length;) this.togglePointHighlight(e.pop(), !1) }, isHighlighted: function(e) { var t, n, i = this._points; for (t = 0; i.length > t; t++) if (n = i[t], e == n) return !0; return !1 } }), cn = An.extend({ init: function(t, n) { var i, r, o = this; An.fn.init.call(o), o.options = Pn({}, o.options, n), o.chartElement = t, o.template = cn.template, o.template || (o.template = cn.template = mi("<div class='" + $i + "tooltip " + $i + "chart-tooltip' style='display:none; position: absolute; font: #= d.font #;border: #= d.border.width #px solid;opacity: #= d.opacity #; filter: alpha(opacity=#= d.opacity * 100 #);'></div>")), i = ii(o.options.padding || {}, "auto"), o.element = e(o.template(o.options)).css({ "padding-top": i.top, "padding-right": i.right, "padding-bottom": i.bottom, "padding-left": i.left }), o.move = Sn(o.move, o), o._mouseleave = Sn(o._mouseleave, o), r = Tn.format("[{0}='content'],[{0}='scroller']", Tn.attr("role")), o._mobileScroller = t.closest(r).data("kendoMobileScroller") }, destroy: function() { this._clearShowTimeout(), this.element && (this.element.off(Vr).remove(), this.element = null) }, options: { border: { width: 1 }, opacity: 1, animation: { duration: Bo } }, move: function() { var e, t = this, n = t.options, i = t.element; t.anchor && t.element && (e = t._offset(), t.visible || i.css({ top: e.top, left: e.left }), t.visible = !0, t._ensureElement(document.body), i.stop(!0, !0).show().animate({ left: e.left, top: e.top }, n.animation.duration)) }, _clearShowTimeout: function() { this.showTimeout && (clearTimeout(this.showTimeout), this.showTimeout = null) }, _padding: function() { if (!this._chartPadding) { var e = this.chartElement; this._chartPadding = { top: parseInt(e.css("paddingTop"), 10), left: parseInt(e.css("paddingLeft"), 10) } } return this._chartPadding }, _offset: function() { var t, n, i = this, r = i._measure(), o = i.anchor, a = i._padding(), s = i.chartElement.offset(), l = si(o.y + a.top + s.top), c = si(o.x + a.left + s.left), d = Tn.support.zoomLevel(), u = e(window), h = window.pageYOffset || document.documentElement.scrollTop || 0, p = window.pageXOffset || document.documentElement.scrollLeft || 0, f = (this._mobileScroller || {}).movable; return f && 1 !== f.scale ? (t = _i.transform().scale(f.scale, f.scale, [f.x, f.y]), n = new _i.Point(c, l).transform(t), c = n.x, l = n.y) : (l += i._fit(l - h, r.height, u.outerHeight() / d), c += i._fit(c - p, r.width, u.outerWidth() / d)), { top: l, left: c } }, setStyle: function(e, t) { var n, i, r = e.background, o = e.border.color; t && (n = t.color || t.options.color, r = vi(r, n), o = vi(o, n)), di(e.color) || (i = new Vn(r).percBrightness(), this.element.toggleClass($i + Vo, i > 180)), this.element.css({ backgroundColor: r, borderColor: o, font: e.font, color: e.color, opacity: e.opacity, borderWidth: e.border.width }) }, show: function() { this._clearShowTimeout(), this.showTimeout = setTimeout(this.move, No) }, hide: function() { var e = this; clearTimeout(e.showTimeout), e._hideElement(), e.visible && (e.point = null, e.visible = !1, e.index = null) }, _measure: function() { this._ensureElement(); var e = { width: this.element.outerWidth(), height: this.element.outerHeight() }; return e }, _ensureElement: function() { this.element && this.element.appendTo(document.body).on(Vr, this._mouseleave) }, _mouseleave: function(t) { var n = t.relatedTarget, i = this.chartElement[0]; n && n !== i && !e.contains(i, n) && (this.trigger(Tr), this.hide()) }, _hideElement: function() { var e = this, t = this.element; t && t.fadeOut({ always: function() { e.visible || t.off(Vr).remove() } }) }, _pointContent: function(e) { var t, n, i = this, r = Pn({}, i.options, e.options.tooltip); return di(e.value) && (t = "" + e.value), r.template ? (n = Fn(r.template), t = n({ value: e.value, category: e.category, series: e.series, dataItem: e.dataItem, percentage: e.percentage, runningTotal: e.runningTotal, total: e.total, low: e.low, high: e.high, xLow: e.xLow, xHigh: e.xHigh, yLow: e.yLow, yHigh: e.yHigh })) : r.format && (t = e.formatValue(r.format)), t }, _pointAnchor: function(e) { var t = this._measure(); return e.tooltipAnchor(t.width, t.height) }, _fit: function(e, t, n) { var i = 0; return e + t > n && (i = n - (e + t)), 0 > e && (i = -e), i } }), dn = cn.extend({ show: function(e) { var t = this, n = Pn({}, t.options, e.options.tooltip); e && e.tooltipAnchor && t.element && (t.element.html(t._pointContent(e)), t.anchor = t._pointAnchor(e), t.anchor ? (t.setStyle(n, e), cn.fn.show.call(t, e)) : t.hide()) } }), un = cn.extend({ init: function(e, t, n) { var i = this; cn.fn.init.call(i, e, n), i.plotArea = t }, options: { sharedTemplate: "<table><th colspan='2'>#= categoryText #</th># for(var i = 0; i < points.length; i++) { ## var point = points[i]; #<tr># if(point.series.name) { # <td> #= point.series.name #:</td># } #<td>#= content(point) #</td></tr># } #</table>", categoryFormat: "{0:d}" }, showAt: function(t, n) { var i, r = this, o = r.options, a = r.plotArea, s = a.categoryAxis, l = s.pointCategoryIndex(n), c = s.getCategory(n), d = s.getSlot(l); t = e.grep(t, function(e) { var t = e.series.tooltip, n = t && t.visible === !1; return !n }), t.length > 0 && (i = r._content(t, c), r.element.html(i), r.anchor = r._slotAnchor(n, d), r.setStyle(o, t[0]), cn.fn.show.call(r)) }, _slotAnchor: function(e, t) { var n, i = this, r = i.plotArea, o = r.categoryAxis, a = this._measure(), s = e.y - a.height / 2; return n = o.options.vertical ? $n(e.x, s) : $n(t.center().x, s) }, _content: function(e, t) { var n, i, r = this; return n = Tn.template(r.options.sharedTemplate), i = n({ points: e, category: t, categoryText: ti(r.options.categoryFormat, t), content: r._pointContent }) } }), hn = On.extend({ init: function(e, t) { On.fn.init.call(this, t), this.axis = e, this.stickyMode = e instanceof et }, options: { color: Ii, width: 1, zIndex: -1, tooltip: { visible: !1 } }, showAt: function(e) { var t; this.point = e, this.moveLine(), this.line.visible(!0), t = this.options.tooltip, t.visible && (this.tooltip || (this.tooltip = new pn(this, Pn({}, t, { stickyMode: this.stickyMode }))), this.tooltip.showAt(e)) }, hide: function() { this.line.visible(!1), this.tooltip && this.tooltip.hide() }, moveLine: function() { var e, t, n, i = this, r = i.axis, o = r.options.vertical, a = i.getBox(), s = i.point, l = o ? Ko : Qo; t = new _i.Point(a.x1, a.y1), n = o ? new _i.Point(a.x2, a.y1) : new _i.Point(a.x1, a.y2), s && (i.stickyMode ? (e = r.getSlot(r.pointCategoryIndex(s)), t[l] = n[l] = e.center()[l]) : t[l] = n[l] = s[l]), i.box = a, this.line.moveTo(t).lineTo(n) }, getBox: function() { var e, t, n, i = this, r = i.axis, o = r.pane.axes, a = o.length, s = r.options.vertical, l = r.lineBox().clone(), c = s ? Qo : Ko; for (n = 0; a > n; n++) t = o[n], t.options.vertical != s && (e ? e.wrap(t.lineBox()) : e = t.lineBox().clone()); return l[c + 1] = e[c + 1], l[c + 2] = e[c + 2], l }, createVisual: function() { On.fn.createVisual.call(this); var e = this.options; this.line = new wi.Path({ stroke: { color: e.color, width: e.width, opacity: e.opacity, dashType: e.dashType }, visible: !1 }), this.moveLine(), this.visual.append(this.line) }, destroy: function() { var e = this; e.tooltip && e.tooltip.destroy(), On.fn.destroy.call(e) } }), pn = cn.extend({ init: function(e, t) { var n = this, i = e.axis.getRoot().chart.element; n.crosshair = e, cn.fn.init.call(n, i, Pn({}, n.options, { background: e.axis.plotArea.options.seriesColors[0] }, t)), n.setStyle(n.options) }, options: { padding: 10 }, showAt: function(e) { var t = this, n = t.element; n && (t.point = e, t.element.html(t.content(e)), t.anchor = t.getAnchor(), t.move()) }, move: function() { var e = this, t = e.element, n = e._offset(); e._ensureElement(), t.css({ top: n.top, left: n.left }).show() }, content: function(e) { var t, n, i, r = this, o = r.options, a = r.crosshair.axis, s = a.options; return n = t = a[o.stickyMode ? "getCategory" : "getValue"](e), o.template ? (i = Fn(o.template), t = i({ value: n })) : o.format ? t = ti(o.format, n) : s.type === Ki && (t = ti(s.labels.dateFormats[s.baseUnit], n)), t }, getAnchor: function() { var e, t = this, n = t.options, i = n.position, r = this.crosshair, o = !r.axis.options.vertical, a = r.line.bbox(), s = this._measure(), l = s.width / 2, c = s.height / 2, d = n.padding; return e = o ? i === Mi ? a.bottomLeft().translate(-l, d) : a.topLeft().translate(-l, -s.height - d) : i === Dr ? a.topLeft().translate(-s.width - d, -c) : a.topRight().translate(d, -c) }, hide: function() { this.element.hide(), this.point = null }, destroy: function() { cn.fn.destroy.call(this), this.point = null } }), fn = { min: function(e) { var t, n, i = Hr, r = e.length; for (t = 0; r > t; t++) n = e[t], A(n) && (i = kn.min(i, n)); return i === Hr ? e[0] : i }, max: function(e) { var t, n, i = Lr, r = e.length; for (t = 0; r > t; t++) n = e[t], A(n) && (i = kn.max(i, n)); return i === Lr ? e[0] : i }, sum: function(e) { var t, n, i = e.length, r = 0; for (t = 0; i > t; t++) n = e[t], A(n) && (r += n); return r }, sumOrNull: function(e) { var t = null; return E(e) && (t = fn.sum(e)), t }, count: function(e) { var t, n, i = e.length, r = 0; for (t = 0; i > t; t++) n = e[t], null !== n && di(n) && r++; return r }, avg: function(e) { var t = e[0], n = E(e); return n > 0 && (t = fn.sum(e) / n), t }, first: function(e) { var t, n, i = e.length; for (t = 0; i > t; t++) if (n = e[t], null !== n && di(n)) return n; return e[0] } }, n.prototype = { register: function(e, t) { for (var n = 0; e.length > n; n++) this._defaults[e[n]] = t }, query: function(e) { return this._defaults[e] } }, n.current = new n, gn = An.extend({ init: function(t, n, i) { var r, o, a = this, s = t.element, l = n.lineBox(), c = a.getValueAxis(n), d = c.lineBox(), u = "." + $i; An.fn.init.call(a), a.options = Pn({}, a.options, i), i = a.options, a.chart = t, a.chartElement = s, a.categoryAxis = n, a._dateAxis = a.categoryAxis instanceof tt, a.valueAxis = c, a._dateAxis && Pn(i, { min: p(i.min), max: p(i.max), from: p(i.from), to: p(i.to) }), a.template = gn.template, a.template || (a.template = gn.template = mi("<div class='" + $i + "selector' style='width: #= d.width #px; height: #= d.height #px; top: #= d.offset.top #px; left: #= d.offset.left #px;'><div class='" + $i + "mask'></div><div class='" + $i + "mask'></div><div class='" + $i + "selection'><div class='" + $i + "selection-bg'></div><div class='" + $i + "handle " + $i + "leftHandle'><div></div></div><div class='" + $i + "handle " + $i + "rightHandle'><div></div></div></div></div>")), o = { left: parseInt(s.css("paddingLeft"), 10), right: parseInt(s.css("paddingTop"), 10) }, a.options = Pn({}, { width: l.width(), height: d.height(), padding: o, offset: { left: d.x2 + o.left, top: d.y1 + o.right }, from: i.min, to: i.max }, i), a.options.visible && (a.wrapper = r = e(a.template(a.options)).appendTo(s), a.selection = r.find(u + "selection"), a.leftMask = r.find(u + "mask").first(), a.rightMask = r.find(u + "mask").last(), a.leftHandle = r.find(u + "leftHandle"), a.rightHandle = r.find(u + "rightHandle"), a.options.selection = { border: { left: parseFloat(a.selection.css("border-left-width"), 10), right: parseFloat(a.selection.css("border-right-width"), 10) } }, a.leftHandle.css("top", (a.selection.height() - a.leftHandle.height()) / 2), a.rightHandle.css("top", (a.selection.height() - a.rightHandle.height()) / 2), a.set(a._index(i.from), a._index(i.to)), a.bind(a.events, a.options), a.wrapper[0].style.cssText = a.wrapper[0].style.cssText, a.wrapper.on(Yr, Sn(a._mousewheel, a)), Tn.UserEvents ? a.userEvents = new Tn.UserEvents(a.wrapper, { global: !0, stopPropagation: !0, multiTouch: !0, start: Sn(a._start, a), move: Sn(a._move, a), end: Sn(a._end, a), tap: Sn(a._tap, a), gesturestart: Sn(a._gesturechange, a), gesturechange: Sn(a._gesturechange, a) }) : a.leftHandle.add(a.rightHandle).removeClass($i + "handle")) }, events: [go, mo, vo], options: { visible: !0, mousewheel: { zoom: Pi }, min: Lr, max: Hr }, destroy: function() { var e = this, t = e.userEvents; t && t.destroy(), clearTimeout(e._mwTimeout), e._state = null, e.wrapper.remove() }, _rangeEventArgs: function(e) { var t = this; return { axis: t.categoryAxis.options, from: t._value(e.from), to: t._value(e.to) } }, _start: function(t) { var n, i = this, r = i.options, o = e(t.event.target); !i._state && o && (i.chart._unsetActivePoint(), i._state = { moveTarget: o.parents(".k-handle").add(o).first(), startLocation: t.x ? t.x.location : 0, range: { from: i._index(r.from), to: i._index(r.to) } }, n = i._rangeEventArgs({ from: i._index(r.from), to: i._index(r.to) }), i.trigger(go, n) && (i.userEvents.cancel(), i._state = null)) }, _move: function(e) { if (this._state) { var t = this, n = t._state, i = t.options, r = t.categoryAxis.options.categories, o = t._index(i.from), a = t._index(i.to), s = t._index(i.min), l = t._index(i.max), c = n.startLocation - e.x.location, d = n.range, u = { from: d.from, to: d.to }, h = d.to - d.from, p = n.moveTarget, f = t.wrapper.width() / (r.length - 1), g = kn.round(c / f); p && (e.preventDefault(), p.is(".k-selection, .k-selection-bg") ? (d.from = kn.min(kn.max(s, o - g), l - h), d.to = kn.min(d.from + h, l)) : p.is(".k-leftHandle") ? (d.from = kn.min(kn.max(s, o - g), l - 1), d.to = kn.max(d.from + 1, d.to)) : p.is(".k-rightHandle") && (d.to = kn.min(kn.max(s + 1, a - g), l), d.from = kn.min(d.to - 1, d.from)), (d.from !== u.from || d.to !== u.to) && (t.move(d.from, d.to), t.trigger(mo, t._rangeEventArgs(d)))) } }, _end: function() { var e = this, t = e._state.range; delete e._state, e.set(t.from, t.to), e.trigger(vo, e._rangeEventArgs(t)) }, _gesturechange: function(e) { if (this._state) { var t = this, n = t.chart, i = t._state, r = t.options, o = t.categoryAxis, a = i.range, s = n._toModelCoordinates(e.touches[0].x.location).x, l = n._toModelCoordinates(e.touches[1].x.location).x, c = kn.min(s, l), d = kn.max(s, l); e.preventDefault(), i.moveTarget = null, a.from = o.pointCategoryIndex(new Rn.Point2D(c)) || r.min, a.to = o.pointCategoryIndex(new Rn.Point2D(d)) || r.max, t.move(a.from, a.to) } }, _tap: function(e) { var t = this, n = t.options, i = t.chart._eventCoordinates(e), r = t.categoryAxis, o = r.pointCategoryIndex(new Rn.Point2D(i.x, r.box.y1)), a = t._index(n.from), s = t._index(n.to), l = t._index(n.min), c = t._index(n.max), d = s - a, u = a + d / 2, h = kn.round(u - o), p = {}, f = 3 === e.event.which; t._state || f || (e.preventDefault(), t.chart._unsetActivePoint(), r.options.justified || h--, p.from = kn.min(kn.max(l, a - h), c - d), p.to = kn.min(p.from + d, c), t._start(e), t._state && (t._state.range = p, t.trigger(mo, t._rangeEventArgs(p)), t._end())) }, _mousewheel: function(e) { var t, n = this, i = n.options, r = ai(e); n._start({ event: { target: n.selection } }), n._state && (t = n._state.range, e.preventDefault(), e.stopPropagation(), kn.abs(r) > 1 && (r *= Jo), i.mousewheel.reverse && (r *= -1), n.expand(r) && n.trigger(mo, { axis: n.categoryAxis.options, delta: r, originalEvent: e, from: n._value(t.from), to: n._value(t.to) }), n._mwTimeout && clearTimeout(n._mwTimeout), n._mwTimeout = setTimeout(function() { n._end() }, $r)) }, _index: function(e) { var t = this, n = t.categoryAxis, i = n.options.categories, r = e; return e instanceof Date && (r = D(e, i), !n.options.justified && e > ui(i) && (r += 1)), r }, _value: function(e) { var t = this, n = this.categoryAxis, i = n.options.categories, r = e; return t._dateAxis && (r = e > i.length - 1 ? t.options.max : i[e]), r }, _slot: function(e) { var t = this, n = this.categoryAxis; return n.getSlot(t._index(e)) }, move: function(e, t) { var n, i, r, o, a = this, s = a.options, l = s.offset, c = s.padding, d = s.selection.border; r = a._slot(e), n = si(r.x1 - l.left + c.left), a.leftMask.width(n), a.selection.css("left", n), r = a._slot(t), i = si(s.width - (r.x1 - l.left + c.left)), a.rightMask.width(i), o = s.width - i, o != s.width && (o += d.right), a.rightMask.css("left", o), a.selection.width(kn.max(s.width - (n + i) - d.right, 0)) }, set: function(e, t) { var n = this, i = n.options, r = n._index(i.min), o = n._index(i.max); e = hi(n._index(e), r, o), t = hi(n._index(t), e + 1, o), i.visible && n.move(e, t), i.from = n._value(e), i.to = n._value(t) }, expand: function(e) { var n = this, i = n.options, r = n._index(i.min), o = n._index(i.max), a = i.mousewheel.zoom, s = n._index(i.from), l = n._index(i.to), c = { from: s, to: l }, d = Pn({}, c); return n._state && (c = n._state.range), a !== lo && (c.from = hi(hi(s - e, 0, l - 1), r, o)), a !== Dr && (c.to = hi(hi(l + e, c.from + 1, o), r, o)), c.from !== d.from || c.to !== d.to ? (n.set(c.from, c.to), !0) : t }, getValueAxis: function(e) { var t, n, i = e.pane.axes, r = i.length; for (t = 0; r > t; t++) if (n = i[t], n.options.vertical !== e.options.vertical) return n } }), mn = function(e, t, n) { var i, r, o, a = this, s = t.canonicalFields(e), l = t.valueFields(e), c = t.sourceFields(e, s), d = a._seriesFields = [], u = n.query(e.type), h = e.aggregate || u; for (a._series = e, a._binder = t, i = 0; s.length > i; i++) { if (r = s[i], typeof h === Zr) o = h[r]; else { if (0 !== i && !ri(r, l)) break; o = h } o && d.push({ canonicalName: r, name: c[i], transform: zn(o) ? o : fn[o] }) } }, mn.prototype = { aggregatePoints: function(e, t) { var n, i, r, o, a, s = this, l = s._bindPoints(e || []), c = s._series, d = s._seriesFields, u = l.dataItems[0], h = {}; for (!u || A(u) || wn(u) || (a = function() {}, a.prototype = u, h = new a), n = 0; d.length > n; n++) { if (i = d[n], r = s._bindField(l.values, i.canonicalName), o = i.transform(r, c, l.dataItems, t), null !== o && typeof o === Zr && !di(o.length)) { h = o; break } di(o) && (O(i.name, h), Tn.setter(i.name)(h, o)) } return h }, _bindPoints: function(e) { var t, n, i = this, r = i._binder, o = i._series, a = [], s = []; for (t = 0; e.length > t; t++) n = e[t], a.push(r.bindPoint(o, n)), s.push(o.data[n]); return { values: a, dataItems: s } }, _bindField: function(e, t) { var n, i, r, o, a = [], s = e.length; for (n = 0; s > n; n++) i = e[n], o = i.valueFields, r = di(o[t]) ? o[t] : i.fields[t], a.push(r); return a } }, vn = Dn.extend({ init: function(e) { this._axis = e }, slot: function(e, t) { return this._axis.slot(e, t) }, range: function() { return this._axis.range() } }), Cn(e.easing, { easeOutElastic: function(e, t, n, i) { var r = 1.70158, o = 0, a = i; return 0 === e ? n : 1 === e ? n + i : (o || (o = .5), a < kn.abs(i) ? (a = i, r = o / 4) : r = o / (2 * kn.PI) * kn.asin(i / a), a * kn.pow(2, -10 * e) * kn.sin(1.1 * (1 * e - r) * kn.PI / o) + i + n) } }), Rn.ui.plugin(aa), Y.current.register(en, [Ti, ji, Ir, Go, ki, Wo, Hi, Jr, Ri, jo, zi, ao, oo, qo, br]), Y.current.register(nn, [ho, po, Fi]), Y.current.register(rn, [to]), Y.current.register(on, [ir]), Q.current.register([Ti, ji, Ir, Go, ki, Wo], [Uo], [Bi, Wi, Xr, lr, cr]), Q.current.register([ao, oo], [mr, Ro], [Bi, Wi, Xr]), Q.current.register([qo, br], [Uo], [Bi, Wi, Xr, To]), n.current.register([Ti, ji, Ir, Go, ki, Wo, qo, br], { value: Fr, color: gr, noteText: gr, errorLow: Br, errorHigh: Fr }), n.current.register([ao, oo], { from: Br, to: Fr, color: gr, noteText: gr }), Q.current.register([ho, po, Fi], [Qo, Ko], [Wi, Xr, dr, ur, hr, pr]), Q.current.register([Fi], [Qo, Ko, "size"], [Wi, Bi, Xr]), Q.current.register([Hi, Jr], ["open", "high", "low", "close"], [Bi, Wi, "downColor", Xr]), n.current.register([Hi, Jr], { open: Fr, high: Fr, low: Br, close: Fr, color: gr, downColor: gr, noteText: gr }), Q.current.register([zi], ["lower", "q1", "median", "q3", "upper", "mean", "outliers"], [Bi, Wi, Xr]), n.current.register([zi], { lower: Fr, q1: Fr, median: Fr, q3: Fr, upper: Fr, mean: Fr, outliers: gr, color: gr, noteText: gr }), Q.current.register([Ri, jo], ["current", "target"], [Bi, Wi, "visibleInLegend", Xr]), n.current.register([Ri, jo], { current: Fr, target: Fr, color: gr, noteText: gr }), Q.current.register([to, ir], [Uo], [Bi, Wi, "explode", "visibleInLegend", "visible"]), Pn(Rn, { EQUALLY_SPACED_SERIES: ra, Aggregates: fn, AreaChart: Mt, AreaSegment: Pt, AxisGroupRangeTracker: tn, Bar: st, BarChart: ht, BarLabel: K, BubbleChart: Bt, Bullet: mt, BulletChart: gt, CandlestickChart: Nt, Candlestick: Lt, CategoricalChart: ut, CategoricalErrorBar: wt, CategoricalPlotArea: en, CategoryAxis: et, ChartAxis: vn, ChartContainer: Zt, ClipAnimation: Dt, ClusterLayout: it, Crosshair: hn, CrosshairTooltip: pn, DateCategoryAxis: tt, DateValueAxis: nt, DefaultAggregates: n, DonutChart: Yt, DonutPlotArea: on, DonutSegment: $t, ErrorBarBase: _t, ErrorRangeCalculator: dt, Highlight: ln, SharedTooltip: un, Legend: J, LegendItem: X, LegendLayout: Z, LineChart: Tt, LinePoint: yt, LineSegment: xt, Pane: Xt, PieAnimation: an, PieChart: qt, PieChartMixin: Gt, PiePlotArea: rn, PieSegment: jt, PlotAreaBase: Jt, PlotAreaFactory: Y, PointEventsMixin: ot, RangeBar: pt, RangeBarChart: ft, ScatterChart: Rt, ScatterErrorBar: bt, ScatterLineChart: Ht, Selection: gn, SeriesAggregator: mn, SeriesBinder: Q, ShapeElement: Kn, SplineSegment: Et, SplineAreaSegment: zt, StackWrap: rt, Tooltip: dn, OHLCChart: Vt, OHLCPoint: Ot, WaterfallChart: Qt, WaterfallSegment: Kt, XYPlotArea: nn, addDuration: g, areNumbers: I, axisGroupBox: x, categoriesCount: c, ceilDate: _, countNumbers: E, duration: y, ensureTree: O, indexOf: R, isNumber: A, floorDate: v, filterSeriesByType: F, hasValue: $, lteDateIndex: D, evalOptions: M, seriesTotal: V, singleItemOrArray: k, sortDates: H, startOfWeek: m, transpose: N, toDate: p, toTime: f, uniqueDates: B }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { return e.value.x - t.value.x } function i(e, t) { return 180 - C.abs(C.abs(e - t) - 180) } var r, o, a, s, l, c, d, u, h, p, f, g, m, v, _, w, b, y, k, x, C = Math, S = window.kendo, T = S.deepExtend, D = S.util, A = D.append, E = S.drawing, I = S.geometry, P = S.dataviz, M = P.AreaSegment, z = P.Axis, F = P.AxisGroupRangeTracker, R = P.BarChart, H = P.Box2D, B = P.CategoryAxis, L = P.CategoricalChart, N = P.CategoricalPlotArea, O = P.ChartElement, V = P.CurveProcessor, U = P.DonutSegment, W = P.LineChart, j = P.LineSegment, G = P.LogarithmicAxis, q = P.NumericAxis, $ = P.PlotAreaBase, Y = P.PlotAreaFactory, Q = P.Point2D, K = P.Ring, X = P.ScatterChart, Z = P.ScatterLineChart, J = P.SeriesBinder, et = P.ShapeBuilder, tt = P.SplineSegment, nt = P.SplineAreaSegment, it = P.getSpacing, rt = P.filterSeriesByType, ot = D.limitValue, at = P.round, st = "arc", lt = "#000", ct = P.COORD_PRECISION, dt = .15, ut = C.PI / 180, ht = "gap", pt = "interpolate", ft = "log", gt = "plotAreaClick", mt = "polarArea", vt = "polarLine", _t = "polarScatter", wt = "radarArea", bt = "radarColumn", yt = "radarLine", kt = "smooth", xt = "x", Ct = "y", St = "zero", Tt = [mt, vt, _t], Dt = [wt, bt, yt], At = { createGridLines: function(e) { var t, n, i = this, r = i.options, o = C.abs(i.box.center().y - e.lineBox().y1), a = !1, s = []; return r.majorGridLines.visible && (t = i.majorGridLineAngles(e), a = !0, s = i.renderMajorGridLines(t, o, r.majorGridLines)), r.minorGridLines.visible && (n = i.minorGridLineAngles(e, a), A(s, i.renderMinorGridLines(n, o, r.minorGridLines, e, a))), s }, renderMajorGridLines: function(e, t, n) { return this.renderGridLines(e, t, n) }, renderMinorGridLines: function(e, t, n, i, r) { var o = this.radiusCallback && this.radiusCallback(t, i, r); return this.renderGridLines(e, t, n, o) }, renderGridLines: function(e, t, n, i) { var r, o, a = { stroke: { width: n.width, color: n.color, dashType: n.dashType } }, s = this.box.center(), l = new I.Circle([s.x, s.y], t), c = this.gridLinesVisual(); for (r = 0; e.length > r; r++) o = new E.Path(a), i && (l.radius = i(e[r])), o.moveTo(l.center).lineTo(l.pointAt(e[r])), c.append(o); return c.children }, gridLineAngles: function(n, i, r, o, a) { var s = this, l = s.intervals(i, r, o, a), c = n.options, d = c.visible && (c.line || {}).visible !== !1; return e.map(l, function(e) { var n = s.intervalAngle(e); return d && 90 === n ? t : n }) } }, Et = B.extend({ options: { startAngle: 90, labels: { margin: it(10) }, majorGridLines: { visible: !0 }, justified: !0 }, range: function() { return { min: 0, max: this.options.categories.length } }, reflow: function(e) { this.box = e, this.reflowLabels() }, lineBox: function() { return this.box }, reflowLabels: function() { var e, t, n = this, i = n.options.labels, r = i.skip || 0, o = i.step || 1, a = new H, s = n.labels; for (t = 0; s.length > t; t++) s[t].reflow(a), e = s[t].box, s[t].reflow(n.getSlot(r + t * o).adjacentBox(0, e.width(), e.height())) }, intervals: function(e, t, n, i) { var r, o = this, a = o.options, s = a.categories.length, l = 0, c = s / e || 1, d = 360 / c, u = []; for (t = t || 0, n = n || 1, r = t; c > r; r += n) l = a.reverse ? 360 - r * d : r * d, l = at(l, ct) % 360, i && P.inArray(l, i) || u.push(l); return u }, majorIntervals: function() { return this.intervals(1) }, minorIntervals: function() { return this.intervals(.5) }, intervalAngle: function(e) { return (360 + e + this.options.startAngle) % 360 }, majorAngles: function() { return e.map(this.majorIntervals(), e.proxy(this.intervalAngle, this)) }, createLine: function() { return [] }, majorGridLineAngles: function(e) { var t = this.options.majorGridLines; return this.gridLineAngles(e, 1, t.skip, t.step) }, minorGridLineAngles: function(e, t) { var n = this.options, i = n.minorGridLines, r = n.majorGridLines, o = t ? this.intervals(1, r.skip, r.step) : null; return this.gridLineAngles(e, .5, i.skip, i.step, o) }, radiusCallback: function(e, n, i) { var r, o, a, s; return n.options.type !== st ? (r = 360 / (2 * this.options.categories.length), o = C.cos(r * ut) * e, a = this.majorAngles(), s = function(t) { return !i && P.inArray(t, a) ? e : o }) : t }, createPlotBands: function() { var e, t, n, i, r, o, a, s = this, l = s.options, c = l.plotBands || [], d = this._plotbandGroup = new E.Group({ zIndex: -1 }); for (e = 0; c.length > e; e++) t = c[e], n = s.plotBandSlot(t), i = s.getSlot(t.from), r = t.from - C.floor(t.from), n.startAngle += r * i.angle, o = C.ceil(t.to) - t.to, n.angle -= (o + r) * i.angle, a = et.current.createRing(n, { fill: { color: t.color, opacity: t.opacity }, stroke: { opacity: t.opacity } }), d.append(a); s.appendVisual(d) }, plotBandSlot: function(e) { return this.getSlot(e.from, e.to - 1) }, getSlot: function(e, t) { var n, i, r, o = this, a = o.options, s = a.justified, l = o.box, c = o.majorAngles(), d = c.length, u = 360 / d; return a.reverse && !s && (e = (e + 1) % d), e = ot(C.floor(e), 0, d - 1), i = c[e], s && (i -= u / 2, 0 > i && (i += 360)), t = ot(C.ceil(t || e), e, d - 1), n = t - e + 1, r = u * n, new K(l.center(), 0, l.height() / 2, i, r) }, slot: function(e, t) { var n = this.getSlot(e, t), i = n.startAngle + 180, r = i + n.angle; return new I.Arc([n.c.x, n.c.y], { startAngle: i, endAngle: r, radiusX: n.r, radiusY: n.r }) }, pointCategoryIndex: function(e) { var t, n, i = this, r = null, o = i.options.categories.length; for (t = 0; o > t; t++) if (n = i.getSlot(t), n.containsPoint(e)) { r = t; break } return r } }); T(Et.fn, At), r = { options: { majorGridLines: { visible: !0 } }, createPlotBands: function() { var e, t, n, i, r, o, a = this, s = a.options, l = s.plotBands || [], c = s.majorGridLines.type, d = a.plotArea.polarAxis, u = d.majorAngles(), h = d.box.center(), p = this._plotbandGroup = new E.Group({ zIndex: -1 }); for (e = 0; l.length > e; e++) t = l[e], n = { fill: { color: t.color, opacity: t.opacity }, stroke: { opacity: t.opacity } }, i = a.getSlot(t.from, t.to, !0), r = new K(h, h.y - i.y2, h.y - i.y1, 0, 360), o = c === st ? et.current.createRing(r, n) : E.Path.fromPoints(a.plotBandPoints(r, u), n).close(), p.append(o); a.appendVisual(p) }, plotBandPoints: function(e, t) { var n, i = [], r = [], o = [e.c.x, e.c.y], a = new I.Circle(o, e.ir), s = new I.Circle(o, e.r); for (n = 0; t.length > n; n++) i.push(a.pointAt(t[n])), r.push(s.pointAt(t[n])); return i.reverse(), i.push(i[0]), r.push(r[0]), r.concat(i) }, createGridLines: function(e) { var t, n = this, i = n.options, r = n.radarMajorGridLinePositions(), o = e.majorAngles(), a = e.box.center(), s = []; return i.majorGridLines.visible && (s = n.renderGridLines(a, r, o, i.majorGridLines)), i.minorGridLines.visible && (t = n.radarMinorGridLinePositions(), A(s, n.renderGridLines(a, t, o, i.minorGridLines))), s }, renderGridLines: function(e, t, n, i) { var r, o, a, s, l, c = { stroke: { width: i.width, color: i.color, dashType: i.dashType } }, d = this.gridLinesVisual(); for (o = 0; t.length > o; o++) if (r = e.y - t[o], r > 0) if (s = new I.Circle([e.x, e.y], r), i.type === st) d.append(new E.Circle(s, c)); else { for (l = new E.Path(c), a = 0; n.length > a; a++) l.lineTo(s.pointAt(n[a])); l.close(), d.append(l) } return d.children }, getValue: function(e) { var t, n, r, o, a, s, l, c = this, d = c.options, u = c.lineBox(), h = c.plotArea.polarAxis, p = h.majorAngles(), f = h.box.center(), g = e.distanceTo(f), m = g; return d.majorGridLines.type !== st && p.length > 1 && (t = e.x - f.x, n = e.y - f.y, r = (C.atan2(n, t) / ut + 540) % 360, p.sort(function(e, t) { return i(e, r) - i(t, r) }), o = i(p[0], p[1]) / 2, a = i(r, p[0]), s = 90 - o, l = 180 - a - s, m = g * (C.sin(l * ut) / C.sin(s * ut))), c.axisType().fn.getValue.call(c, new Q(u.x1, u.y2 - m)) } }, o = q.extend({ radarMajorGridLinePositions: function() { return this.getTickPositions(this.options.majorUnit) }, radarMinorGridLinePositions: function() { var e = this, t = e.options, n = 0; return t.majorGridLines.visible && (n = t.majorUnit), e.getTickPositions(t.minorUnit, n) }, axisType: function() { return q } }), T(o.fn, r), a = G.extend({ radarMajorGridLinePositions: function() { var e = this, t = []; return e.traverseMajorTicksPositions(function(e) { t.push(e) }, e.options.majorGridLines), t }, radarMinorGridLinePositions: function() { var e = this, t = []; return e.traverseMinorTicksPositions(function(e) { t.push(e) }, e.options.minorGridLines), t }, axisType: function() { return G } }), T(a.fn, r), s = z.extend({ init: function(e) { var t = this; z.fn.init.call(t, e), e = t.options, e.minorUnit = e.minorUnit || t.options.majorUnit / 2 }, options: { type: "polar", startAngle: 0, reverse: !1, majorUnit: 60, min: 0, max: 360, labels: { margin: it(10) }, majorGridLines: { color: lt, visible: !0, width: 1 }, minorGridLines: { color: "#aaa" } }, getDivisions: function(e) { return q.fn.getDivisions.call(this, e) - 1 }, reflow: function(e) { this.box = e, this.reflowLabels() }, reflowLabels: function() { var e, t, n = this, i = n.options, r = i.labels, o = r.skip || 0, a = r.step || 1, s = new H, l = n.intervals(i.majorUnit, o, a), c = n.labels; for (t = 0; c.length > t; t++) c[t].reflow(s), e = c[t].box, c[t].reflow(n.getSlot(l[t]).adjacentBox(0, e.width(), e.height())) }, lineBox: function() { return this.box }, intervals: function(e, t, n, i) { var r, o, a = this, s = a.options, l = a.getDivisions(e), c = s.min, d = []; for (t = t || 0, n = n || 1, o = t; l > o; o += n) r = (360 + c + o * e) % 360, i && P.inArray(r, i) || d.push(r); return d }, majorIntervals: function() { return this.intervals(this.options.majorUnit) }, minorIntervals: function() { return this.intervals(this.options.minorUnit) }, intervalAngle: function(e) { return (540 - e - this.options.startAngle) % 360 }, majorAngles: Et.fn.majorAngles, createLine: function() { return [] }, majorGridLineAngles: function(e) { var t = this.options.majorGridLines; return this.gridLineAngles(e, this.options.majorUnit, t.skip, t.step) }, minorGridLineAngles: function(e, t) { var n = this.options, i = n.minorGridLines, r = n.majorGridLines, o = t ? this.intervals(n.majorUnit, r.skip, r.step) : null; return this.gridLineAngles(e, this.options.minorUnit, i.skip, i.step, o) }, createPlotBands: Et.fn.createPlotBands, plotBandSlot: function(e) { return this.getSlot(e.from, e.to) }, getSlot: function(e, t) { var n, i = this, r = i.options, o = r.startAngle, a = i.box; return e = ot(e, r.min, r.max), t = ot(t || e, e, r.max), r.reverse && (e *= -1, t *= -1), e = (540 - e - o) % 360, t = (540 - t - o) % 360, e > t && (n = e, e = t, t = n), new K(a.center(), 0, a.height() / 2, e, t - e) }, slot: function(e, t) { var n, i, r, o, a = this.options, s = 360 - a.startAngle, l = this.getSlot(e, t); return P.util.defined(t) || (t = e), r = C.min(e, t), o = C.max(e, t), a.reverse ? (n = r, i = o) : (n = 360 - o, i = 360 - r), n = (n + s) % 360, i = (i + s) % 360, new I.Arc([l.c.x, l.c.y], { startAngle: n, endAngle: i, radiusX: l.r, radiusY: l.r }) }, getValue: function(e) { var t = this, n = t.options, i = t.box.center(), r = e.x - i.x, o = e.y - i.y, a = C.round(C.atan2(o, r) / ut), s = n.startAngle; return n.reverse || (a *= -1, s *= -1), (a + s + 360) % 360 }, range: q.fn.range, labelsCount: q.fn.labelsCount, createAxisLabel: q.fn.createAxisLabel }), T(s.fn, At), l = O.extend({ options: { gap: 1, spacing: 0 }, reflow: function(e) { var t, n, i = this, r = i.options, o = i.children, a = r.gap, s = r.spacing, l = o.length, c = l + a + s * (l - 1), d = e.angle / c, u = e.startAngle + d * (a / 2); for (n = 0; l > n; n++) t = e.clone(), t.startAngle = u, t.angle = d, o[n].sector && (t.r = o[n].sector.r), o[n].reflow(t), o[n].sector = t, u += d + d * s } }), c = O.extend({ reflow: function(e) { var t, n, i = this, r = i.options.isReversed, o = i.children, a = o.length, s = r ? a - 1 : 0, l = r ? -1 : 1; for (i.box = new H, n = s; n >= 0 && a > n; n += l) t = o[n].sector, t.startAngle = e.startAngle, t.angle = e.angle } }), d = U.extend({ init: function(e, t) { U.fn.init.call(this, e, null, t) }, options: { overlay: { gradient: null }, labels: { distance: 10 } } }), u = R.extend({ pointType: function() { return d }, clusterType: function() { return l }, stackType: function() { return c }, categorySlot: function(e, t) { return e.getSlot(t) }, pointSlot: function(e, t) { var n = e.clone(), i = e.c.y; return n.r = i - t.y1, n.ir = i - t.y2, n }, reflow: L.fn.reflow, reflowPoint: function(e, t) { e.sector = t, e.reflow() }, options: { clip: !1, animation: { type: "pie" } }, createAnimation: function() { this.options.animation.center = this.box.toRect().center(), R.fn.createAnimation.call(this) } }), h = W.extend({ options: { clip: !1 }, pointSlot: function(e, t) { var n = e.c.y - t.y1, i = Q.onCircle(e.c, e.middle(), n); return new H(i.x, i.y, i.x, i.y) }, createSegment: function(e, t, n) { var i, r, o = t.style; return r = o == kt ? tt : j, i = new r(e, t, n), e.length === t.data.length && (i.options.closed = !0), i } }), p = M.extend({ points: function() { return j.fn.points.call(this, this.stackPoints) } }), f = nt.extend({ closeFill: e.noop }), g = h.extend({ createSegment: function(e, t, n, i) { var r, o, a = this, s = a.options, l = s.isStacked, c = (t.line || {}).style; return c === kt ? (o = new f(e, i, l, t, n), o.options.closed = !0) : (l && n > 0 && i && (r = i.linePoints.slice(0).reverse()), e.push(e[0]), o = new p(e, r, t, n)), o }, seriesMissingValues: function(e) { return e.missingValues || St } }), m = X.extend({ pointSlot: function(e, t) { var n = e.c.y - t.y1, i = Q.onCircle(e.c, e.startAngle, n); return new H(i.x, i.y, i.x, i.y) }, options: { clip: !1 } }), v = Z.extend({ pointSlot: m.fn.pointSlot, options: { clip: !1 } }), _ = M.extend({ points: function() { var e = this, t = e.parent, n = t.plotArea, i = n.polarAxis, r = i.box.center(), o = e.stackPoints, a = j.fn.points.call(e, o); return a.unshift([r.x, r.y]), a.push([r.x, r.y]), a } }), w = nt.extend({ closeFill: function(e) { var t = this._polarAxisCenter(); e.lineTo(t.x, t.y) }, _polarAxisCenter: function() { var e = this.parent, t = e.plotArea, n = t.polarAxis, i = n.box.center(); return i }, strokeSegments: function() { var e, t, n, i = this._strokeSegments; return i || (e = this._polarAxisCenter(), t = new V(!1), n = j.fn.points.call(this), n.push(e), i = this._strokeSegments = t.process(n), i.pop()), i } }), b = v.extend({ createSegment: function(e, t, n) { var i, r = (t.line || {}).style; return i = r == kt ? new w(e, null, !1, t, n) : new _(e, [], t, n) }, createMissingValue: function(e, t) { var n; return P.hasValue(e.x) && t != pt && (n = { x: e.x, y: e.y }, t == St && (n.y = 0)), n }, seriesMissingValues: function(e) { return e.missingValues || St }, _hasMissingValuesGap: function() { var e, t = this.options.series; for (e = 0; t.length > e; e++) if (this.seriesMissingValues(t[e]) === ht) return !0 }, sortPoints: function(e) { var t, i, r; if (e.sort(n), this._hasMissingValuesGap()) for (r = 0; e.length > r; r++) i = e[r], i && (t = i.value, P.hasValue(t.y) || this.seriesMissingValues(i.series) !== ht || delete e[r]); return e } }), y = $.extend({ init: function(e, t) { var n = this; n.valueAxisRangeTracker = new F, $.fn.init.call(n, e, t) }, render: function() { var e = this; e.addToLegend(e.series), e.createPolarAxis(), e.createCharts(), e.createValueAxis() }, alignAxes: function() { var e = this.valueAxis, t = e.range(), n = e.options.reverse ? t.max : t.min, i = e.getSlot(n), r = this.polarAxis.getSlot(0).c, o = e.box.translate(r.x - i.x1, r.y - i.y1); e.reflow(o) }, createValueAxis: function() { var e, t, n, i, r = this, s = r.valueAxisRangeTracker, l = s.query(), c = r.valueAxisOptions({ roundToMajorUnit: !1, zIndex: -1 }); c.type === ft ? (n = a, i = { min: .1, max: 1 }) : (n = o, i = { min: 0, max: 1 }), e = s.query(name) || l || i, e && l && (e.min = C.min(e.min, l.min), e.max = C.max(e.max, l.max)), t = new n(e.min, e.max, c), r.valueAxis = t, r.appendAxis(t) }, reflowAxes: function() { var e, t = this, n = t.options.plotArea, i = t.valueAxis, r = t.polarAxis, o = t.box, a = C.min(o.width(), o.height()) * dt, s = it(n.padding || {}, a), l = o.clone().unpad(s), c = l.clone().shrink(0, l.height() / 2); r.reflow(l), i.reflow(c), e = i.lineBox().height() - i.box.height(), i.reflow(i.box.unpad({ top: e })), t.axisBox = l, t.alignAxes(l) }, backgroundBox: function() { return this.box } }), k = y.extend({ options: { categoryAxis: { categories: [] }, valueAxis: {} }, createPolarAxis: function() { var e, t = this; e = new Et(t.options.categoryAxis), t.polarAxis = e, t.categoryAxis = e, t.appendAxis(e) }, valueAxisOptions: function(e) { var t = this; return t._hasBarCharts && T(e, { majorGridLines: { type: st }, minorGridLines: { type: st } }), t._isStacked100 && T(e, { roundToMajorUnit: !1, labels: { format: "P0" } }), T(e, t.options.valueAxis) }, appendChart: N.fn.appendChart, createCharts: function() { var e = this, t = e.filterVisibleSeries(e.series), n = e.panes[0]; e.createAreaChart(rt(t, [wt]), n), e.createLineChart(rt(t, [yt]), n), e.createBarChart(rt(t, [bt]), n) }, chartOptions: function(e) { var t, n, i = { series: e }, r = e[0]; return r && (t = this.filterVisibleSeries(e), n = r.stack, i.isStacked = n && t.length > 1, i.isStacked100 = n && "100%" === n.type && t.length > 1, i.isStacked100 && (this._isStacked100 = !0)), i }, createAreaChart: function(e, t) { if (0 !== e.length) { var n = new g(this, this.chartOptions(e)); this.appendChart(n, t) } }, createLineChart: function(e, t) { if (0 !== e.length) { var n = new h(this, this.chartOptions(e)); this.appendChart(n, t) } }, createBarChart: function(e, t) { var n, i, r; 0 !== e.length && (n = e[0], i = this.chartOptions(e), i.gap = n.gap, i.spacing = n.spacing, r = new u(this, i), this.appendChart(r, t), this._hasBarCharts = !0) }, seriesCategoryAxis: function() { return this.categoryAxis }, click: function(t, n) { var i, r, o = this, a = t._eventCoordinates(n), s = new Q(a.x, a.y); i = o.categoryAxis.getCategory(s), r = o.valueAxis.getValue(s), null !== i && null !== r && t.trigger(gt, { element: e(n.target), category: i, value: r }) }, createCrosshairs: e.noop }), x = y.extend({ options: { xAxis: {}, yAxis: {} }, createPolarAxis: function() { var e, t = this; e = new s(t.options.xAxis), t.polarAxis = e, t.axisX = e, t.appendAxis(e) }, valueAxisOptions: function(e) { var t = this; return T(e, { majorGridLines: { type: st }, minorGridLines: { type: st } }, t.options.yAxis) }, createValueAxis: function() { var e = this; y.fn.createValueAxis.call(e), e.axisY = e.valueAxis }, appendChart: function(e, t) { var n = this; n.valueAxisRangeTracker.update(e.yAxisRanges), $.fn.appendChart.call(n, e, t) }, createCharts: function() { var e = this, t = e.filterVisibleSeries(e.series), n = e.panes[0]; e.createLineChart(rt(t, [vt]), n), e.createScatterChart(rt(t, [_t]), n), e.createAreaChart(rt(t, [mt]), n) }, createLineChart: function(e, t) { if (0 !== e.length) { var n = this, i = new v(n, { series: e }); n.appendChart(i, t) } }, createScatterChart: function(e, t) { if (0 !== e.length) { var n = this, i = new m(n, { series: e }); n.appendChart(i, t) } }, createAreaChart: function(e, t) { if (0 !== e.length) { var n = this, i = new b(n, { series: e }); n.appendChart(i, t) } }, click: function(t, n) { var i, r, o = this, a = t._eventCoordinates(n), s = new Q(a.x, a.y); i = o.axisX.getValue(s), r = o.axisY.getValue(s), null !== i && null !== r && t.trigger(gt, { element: e(n.target), x: i, y: r }) }, createCrosshairs: e.noop }), Y.current.register(x, Tt), Y.current.register(k, Dt), J.current.register(Tt, [xt, Ct], ["color"]), J.current.register(Dt, ["value"], ["color"]), P.DefaultAggregates.current.register(Dt, { value: "max", color: "first" }), T(P, { PolarAreaChart: b, PolarAxis: s, PolarLineChart: v, PolarPlotArea: x, RadarAreaChart: g, RadarBarChart: u, RadarCategoryAxis: Et, RadarClusterLayout: l, RadarLineChart: h, RadarNumericAxis: o, RadarPlotArea: k, SplinePolarAreaSegment: w, SplineRadarAreaSegment: f, RadarStackLayout: c }) }(window.kendo.jQuery), function(e, t) { var n, i = window.kendo, r = i.deepExtend, o = e.extend, a = i.isFunction, s = i.template, l = i.util, c = l.append, d = i.drawing, u = i.geometry, h = i.dataviz, p = i.drawing.Color, f = h.ChartElement, g = h.PieChartMixin, m = h.PlotAreaBase, v = h.PlotAreaFactory, _ = h.Point2D, w = h.Box2D, b = h.SeriesBinder, y = h.TextBox, k = h.autoFormat, x = h.evalOptions, C = l.limitValue, S = h.seriesTotal, T = "category", D = "color", A = "funnel", E = "value", I = "black", P = "white", M = m.extend({ render: function() { var e = this, t = e.series; e.createFunnelChart(t) }, createFunnelChart: function(e) { var t = this, n = e[0], i = new z(t, { series: e, legend: t.options.legend, neckRatio: n.neckRatio, dynamicHeight: n.dynamicHeight, dynamicSlope: n.dynamicSlope, segmentSpacing: n.segmentSpacing, highlight: n.highlight }); t.appendChart(i) }, appendChart: function(e, t) { m.fn.appendChart.call(this, e, t), c(this.options.legend.items, e.legendItems) } }), z = f.extend({ init: function(e, t) { var n = this; f.fn.init.call(n, t), n.plotArea = e, n.points = [], n.labels = [], n.legendItems = [], n.render() }, options: { neckRatio: .3, width: 300, dynamicSlope: !1, dynamicHeight: !0, segmentSpacing: 0, labels: { visible: !1, align: "center", position: "center" } }, formatPointValue: function(e, t) { return k(t, e.value) }, render: function() { var e, n, i, o, s, l, c, d = this, u = d.options, h = d.plotArea.options.seriesColors || [], p = h.length, f = u.series[0], g = f.data; if (g) for (i = S(f), s = 0; g.length > s; s++) e = b.current.bindPoint(f, s), o = e.valueFields.value, null !== o && o !== t && (n = e.fields, a(f.color) || (f.color = n.color || h[s % p]), n = r({ index: s, owner: d, series: f, category: n.category, dataItem: g[s], percentage: Math.abs(o) / i, visibleInLegend: n.visibleInLegend, visible: n.visible }, n), l = d.createSegment(o, n), c = d.createLabel(o, n), l && c && l.append(c)) }, evalSegmentOptions: function(e, t, n) { var i = n.series; x(e, { value: t, series: i, dataItem: n.dataItem, index: n.index }, { defaults: i._defaults, excluded: ["data", "toggle", "visual"] }) }, createSegment: function(e, i) { var a, s = this, l = r({}, i.series); return s.evalSegmentOptions(l, e, i), s.createLegendItem(e, l, i), i.visible !== !1 ? (a = new n(e, l, i), o(a, i), s.append(a), s.points.push(a), a) : t }, createLabel: function(e, n) { var i, o, a, l = this, c = n.series, d = n.dataItem, u = r({}, l.options.labels, c.labels), h = e; return u.visible ? (u.template ? (o = s(u.template), h = o({ dataItem: d, value: e, percentage: n.percentage, category: n.category, series: c })) : u.format && (h = k(u.format, h)), u.color || "center" !== u.align || (a = new p(c.color).percBrightness(), u.color = a > 180 ? I : P), l.evalSegmentOptions(u, e, n), i = new y(h, r({ vAlign: u.position }, u)), l.labels.push(i), i) : t }, labelPadding: function() { var e, t, n, i, r = this.labels, o = { left: 0, right: 0 }; for (i = 0; r.length > i; i++) e = r[i], t = e.options.align, "center" !== t && (n = r[i].box.width(), "left" === t ? o.left = Math.max(o.left, n) : o.right = Math.max(o.right, n)); return o }, reflow: function(t) { var n, i, r, o, a, s, l, c, d, h, p, f, g = this, m = g.options, v = g.points, _ = v.length, w = 1 >= m.neckRatio, b = t.clone().unpad(g.labelPadding()), y = b.width(), k = 0, x = w ? 0 : (y - y / m.neckRatio) / 2, S = m.segmentSpacing, T = m.dynamicSlope, D = b.height() - S * (_ - 1), A = w ? m.neckRatio * y : y; if (_) { if (T) for (l = v[0], c = l, e.each(v, function(e, t) { t.percentage > c.percentage && (c = t) }), r = l.percentage / c.percentage * y, x = (y - r) / 2, n = 0; _ > n; n++) a = v[n].percentage, d = v[n + 1], h = d ? d.percentage : a, o = v[n].points = [], i = m.dynamicHeight ? D * a : D / _, s = (y - r * (h / a)) / 2, s = C(s, 0, y), o.push(new u.Point(b.x1 + x, b.y1 + k)), o.push(new u.Point(b.x1 + y - x, b.y1 + k)), o.push(new u.Point(b.x1 + y - s, b.y1 + i + k)), o.push(new u.Point(b.x1 + s, b.y1 + i + k)), x = s, k += i + S, r *= h / a, r = C(r, 0, y); else for (p = w ? y : y - 2 * x, f = (p - A) / 2, n = 0; _ > n; n++) o = v[n].points = [], a = v[n].percentage, s = m.dynamicHeight ? f * a : f / _, i = m.dynamicHeight ? D * a : D / _, o.push(new u.Point(b.x1 + x, b.y1 + k)), o.push(new u.Point(b.x1 + y - x, b.y1 + k)), o.push(new u.Point(b.x1 + y - x - s, b.y1 + i + k)), o.push(new u.Point(b.x1 + x + s, b.y1 + i + k)), x += s, k += i + S; for (n = 0; _ > n; n++) v[n].reflow(t) } } }); r(z.fn, g), n = f.extend({ init: function(e, t, n) { var i = this; f.fn.init.call(i, t), i.value = e, i.options.index = n.index }, options: { color: P, border: { width: 1 } }, reflow: function(e) { var t = this, n = t.points, i = t.children[0]; t.box = new w(n[0].x, n[0].y, n[1].x, n[2].y), i && i.reflow(new w(e.x1, n[0].y, e.x2, n[2].y)) }, createVisual: function() { var e, t, n; f.fn.createVisual.call(this), e = this.options, t = e.border, n = d.Path.fromPoints(this.points, { fill: { color: e.color, opacity: e.opacity }, stroke: { color: t.color, opacity: t.opacity, width: t.width } }).close(), this.visual.append(n) }, createHighlight: function(e) { return d.Path.fromPoints(this.points, e) }, highlightVisual: function() { return this.visual.children[0] }, highlightVisualArgs: function() { var e = d.Path.fromPoints(this.points).close(); return { options: this.options, path: e } }, highlightOverlay: function(e, t) { var n, i, r, a = this.options, s = a.highlight || {}; if (s.visible !== !1) return n = s.border || {}, i = o({}, t, { fill: s.color, stroke: n.color, strokeOpacity: n.opacity, strokeWidth: n.width, fillOpacity: s.opacity }), r = e.createPolyline(this.points, !0, i) }, tooltipAnchor: function(e) { var t = this.box; return new _(t.center().x - e / 2, t.y1) }, formatValue: function(e) { var t = this; return t.owner.formatPointValue(t, e) } }), r(n.fn, h.PointEventsMixin), v.current.register(M, [A]), b.current.register([A], [E], [T, D, "visibleInLegend", "visible"]), r(h, { FunnelChart: z, FunnelSegment: n }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n = e.box, i = e.children[0].box, o = t.border || {}, a = t.background || "", s = new A, l = E.fromRect(new I([n.x1, n.y1], [n.width(), n.height()]), { stroke: {} }), c = new P(e.text, new D(i.x1, i.y1), { font: t.font, fill: { color: t.color } }), d = r(c.bbox().clone(), t.padding), u = E.fromRect(d, { stroke: { color: o.width ? o.color : "", width: o.width, dashType: o.dashType, lineJoin: "round", lineCap: "round" }, fill: { color: a } }); return s.append(l), s.append(u), s.append(c), s } function i(e, t, n) { var i = b(e.from) ? e.from : V, r = b(e.to) ? e.to : O; return e.from = l.max(l.min(r, i), t), e.to = l.min(l.max(r, i), n), e } function r(e, t) { var n = e.getOrigin(), i = e.getSize(), r = x(t); return e.setOrigin([n.x - r.left, n.y - r.top]), e.setSize([i.width + (r.left + r.right), i.height + (r.top + r.bottom)]), e } function o(e, t) { var n = x(t); return n.left = -n.left, n.top = -n.top, n.right = -n.right, n.bottom = -n.bottom, r(e, n) } var a, s, l = Math, c = window.kendo, d = c.util, u = c.ui.Widget, h = c.deepExtend, p = c.dataviz, f = p.autoMajorUnit, g = p.ChartElement, m = p.NumericAxis, v = p.Axis, _ = p.Box2D, w = c.Class, b = d.defined, y = d.isNumber, k = p.interpolateValue, x = p.getSpacing, C = p.round, S = p.geometry, T = p.drawing, D = S.Point, A = T.Group, E = T.Path, I = S.Rect, P = T.Text, M = 150, z = 250, F = "arrow", R = "arrowPointer", H = "barPointer", B = "#000", L = .05, N = p.COORD_PRECISION, O = Number.MAX_VALUE, V = -Number.MAX_VALUE, U = 200, W = .5, j = 200, G = 60, q = 60, $ = 5, Y = l.PI / 180, Q = 180, K = "inside", X = "linear", Z = "needle", J = "outside", et = "radialPointer", tt = "x", nt = "y", it = w.extend({ init: function(e, t) { var n = this, i = e.options; g.fn.init.call(n, t), t = n.options, t.fill = t.color, n.scale = e, t.value = b(t.value) ? l.min(l.max(t.value, i.min), i.max) : i.min }, options: { color: B }, value: function(e) { var n = this, i = n.options, r = i.value, o = n.scale.options; return 0 === arguments.length ? r : (i._oldValue = i._oldValue !== t ? i.value : o.min, i.value = l.min(l.max(e, o.min), o.max), n.elements && n.repaint(), t) } }), rt = it.extend({ options: { shape: Z, cap: { size: L }, arrow: { width: 16, height: 14 }, animation: { type: et, duration: M } }, setRadius: function(e) { var t = this; e && (t.elements.clear(), t.render(t.parent, t.center, e)) }, setAngle: function(e) { this.elements.transform(S.transform().rotate(e, this.center)) }, repaint: function() { var e = this, t = e.scale, n = e.options, i = t.slotAngle(n._oldValue), r = t.slotAngle(n.value); n.animation.transitions === !1 ? e.setAngle(r) : new pt(e.elements, h(n.animation, { oldAngle: i, newAngle: r })).play() }, render: function() { var e = this, t = e.scale, n = t.arc.center, i = e.options, r = (t.slotAngle(t.options.min), new A); return i.animation !== !1 && h(i.animation, { startAngle: 0, center: n, reverse: t.options.reverse }), i.shape === Z ? r.append(e._renderNeedle(), e._renderCap()) : r.append(e._renderArrow()), e.elements = r, e.setAngle(Y), r }, reflow: function(e) { var t = this, n = t.center = e.center, i = t.radius = e.getRadiusX(), r = t.capSize = Math.round(i * t.options.cap.size); t.bbox = I.fromPoints(new D(n.x - r, n.y - r), new D(n.x + r, n.y + r)) }, _renderNeedle: function() { var e = this, t = e.options, n = e.scale.options.minorTicks.size, i = e.center, r = t.color, o = new E({ fill: { color: r }, stroke: { color: r, width: W } }); return o.moveTo(i.x + e.radius - n, i.y).lineTo(i.x, i.y - e.capSize / 2).lineTo(i.x, i.y + e.capSize / 2).close(), o }, _renderCap: function() { var e = this, t = e.options, n = t.cap.color || t.color, i = new S.Circle(e.center, e.capSize), r = new T.Circle(i, { fill: { color: n }, stroke: { color: n } }); return r } }), ot = m.extend({ init: function(e) { var t = this; t.options = h({}, t.options, e), t.options.majorUnit = t.options.majorUnit || f(t.options.min, t.options.max), t.options.minorUnit = t.options.minorUnit || t.options.majorUnit / 10, v.fn.init.call(t, t.options) }, options: { min: 0, max: 100, majorTicks: { size: 15, align: K, color: B, width: W, visible: !0 }, minorTicks: { size: 10, align: K, color: B, width: W, visible: !0 }, startAngle: -30, endAngle: 210, labels: { position: K, padding: 2 } }, render: function(e, t) { var n = this, i = n.renderArc(e, t); n.bbox = i.bbox(), n.labelElements = n.renderLabels(), n.ticks = n.renderTicks(), n.ranges = n.renderRanges() }, reflow: function(e) { var n = this, i = e.center(), r = l.min(e.height(), e.width()) / 2; return n.bbox === t ? n.render(i, r) : (n.bbox = n.arc.bbox(), n.radius(n.arc.getRadiusX()), n.repositionRanges(), n.renderLabels(), t) }, slotAngle: function(e) { var t, n = this.options, i = n.startAngle, r = n.reverse, o = n.endAngle - i, a = n.min, s = n.max; return t = r ? n.endAngle - (e - a) / (s - a) * o : (e - a) / (s - a) * o + i, t + Q }, renderLabels: function() { var e, i, r, o, a, s, c, d, u, h, f, g, m, v, _ = this, w = _.options, b = w.majorTicks.size, y = _.arc.clone(), k = y.getRadiusX(), x = _.tickAngles(y, w.majorUnit), C = _.labels, T = C.length, E = w.labels, P = E.padding, M = .05 * k, z = w.rangeSize = w.rangeSize || .1 * k, F = w.ranges || [], R = new A; for (_.options.rangeDistance !== t ? M = _.options.rangeDistance : _.options.rangeDistance = M, E.position === K && (k -= b, F.length && _.labelElements === t && (k -= z + M), y.setRadiusX(k).setRadiusY(k)), c = 0; T > c; c++) a = C[c], e = a.box.width() / 2, i = a.box.height() / 2, o = x[c], r = (o - Q) * Y, h = E.position === K, s = y.pointAt(o), d = s.x + l.cos(r) * (e + P) * (h ? 1 : -1), u = s.y + l.sin(r) * (i + P) * (h ? 1 : -1), a.reflow(new p.Box2D(d - e, u - i, d + e, u + i)), g = new D(a.box.x1, a.box.y1), _.labelElements === t ? (f = n(a, w.labels), R.append(f)) : (f = _.labelElements.children[c], m = f.bbox().origin, v = f.transform() || S.transform(), v.translate(g.x - m.x, g.y - m.y), f.transform(v)), _.bbox = I.union(_.bbox, f.bbox()); return R }, repositionRanges: function() { var e, t, n, i = this, r = i.ranges.children, o = i.options.rangeSize, a = i.options.rangeDistance; if (r.length > 0) { for (e = i.getRangeRadius(), i.options.labels.position === K && (e += o + a), t = e + o / 2, n = 0; r.length > n; n++) r[n]._geometry.setRadiusX(t).setRadiusY(t); i.bbox = I.union(i.bbox, i.ranges.bbox()) } }, renderRanges: function() { var e, t, n, i, r, o, a = this, s = a.arc, l = new A, c = a.rangeSegments(), d = c.length, u = a.options.reverse, h = (a.radius(), a.options.rangeSize), p = a.options.rangeDistance; if (d) for (i = a.getRangeRadius(), a.radius(a.radius() - h - p), o = 0; d > o; o++) n = c[o], e = a.slotAngle(n[u ? "to" : "from"]), t = a.slotAngle(n[u ? "from" : "to"]), t - e !== 0 && (r = new S.Arc(s.center, { radiusX: i + h / 2, radiusY: i + h / 2, startAngle: e, endAngle: t }), l.append(new T.Arc(r, { stroke: { width: h, color: n.color, opacity: n.opacity } }))); return l }, rangeSegments: function() { function e(e, t, n, i) { return { from: e, to: t, color: n, opacity: i } } var t, n, r, o, a, s = this, l = s.options, c = l.ranges || [], d = c.length, u = l.rangePlaceholderColor, h = [], p = l.min, f = l.max; if (d) for (h.push(e(p, f, u)), o = 0; d > o; o++) for (t = i(c[o], p, f), n = h.length, a = 0; n > a; a++) if (r = h[a], t.from >= r.from && r.to >= t.from) { h.push(e(t.from, t.to, t.color, t.opacity)), t.to >= r.from && r.to >= t.to && h.push(e(t.to, r.to, u, t.opacity)), r.to = t.from; break } return h }, getRangeRadius: function() { var e, t = this, n = t.options, i = n.majorTicks.size, r = n.rangeSize, o = n.rangeDistance, a = t.arc; return e = n.labels.position === J ? a.getRadiusX() - i - o - r : a.getRadiusX() - r }, renderArc: function(e, t) { var n = this, i = n.options, r = n.arc = new S.Arc(e, { radiusX: t, radiusY: t, startAngle: i.startAngle + Q, endAngle: i.endAngle + Q }); return r }, renderTicks: function() { function e(e, t, n, i) { var r, o, a, s = new A, l = e.center, c = e.getRadiusX(), d = i.visible; if (d) for (r = 0; t.length > r; r++) o = e.pointAt(t[r]), a = new D(l.x + c - i.size, l.y).rotate(t[r], l), s.append(new E({ stroke: { color: i.color, width: i.width } }).moveTo(o).lineTo(a)); return s } var t = this, n = t.arc, i = t.options, r = i.labels.position, o = new A, a = i.majorTicks.size, s = i.minorTicks.size, l = n.clone(), c = l.getRadiusX(); return t.majorTickAngles = t.tickAngles(n, i.majorUnit), t.majorTicks = e(l, t.majorTickAngles, i.majorUnit, i.majorTicks), o.append(t.majorTicks), t._tickDifference = a - s, r === J && l.setRadiusX(c - a + s).setRadiusY(c - a + s), t.minorTickAngles = t.normalizeTickAngles(t.tickAngles(n, i.minorUnit)), t.minorTicks = e(l, t.minorTickAngles, i.minorUnit, i.minorTicks, i.majorUnit), o.append(t.minorTicks), o }, normalizeTickAngles: function(e) { var t, n = this, i = n.options, r = i.majorUnit / i.minorUnit; for (t = e.length - 1; t >= 0; t--) t % r === 0 && e.splice(t, 1); return e }, tickAngles: function(e, t) { var n, i = this, r = i.options, o = r.reverse, a = r.max - r.min, s = e.endAngle - e.startAngle, l = e.startAngle, c = a / t, d = s / c, u = []; for (o && (l += s, d = -d), n = 0; c > n; n++) u.push(C(l, N)), l += d; return C(l) <= e.endAngle && u.push(l), u }, radius: function(e) { var n = this; return e ? (n.arc.setRadiusX(e).setRadiusY(e), n.repositionTicks(n.majorTicks.children, n.majorTickAngles), n.repositionTicks(n.minorTicks.children, n.minorTickAngles, !0), t) : n.arc.getRadiusX() }, repositionTicks: function(e, t, n) { var i, r, o, a, s, l = this, c = n ? l._tickDifference || 0 : 0, d = l.arc, u = d.getRadiusX(); for (n && l.options.labels.position === J && 0 !== c && (d = l.arc.clone(), d.setRadiusX(u - c).setRadiusY(u - c)), i = 0; e.length > i; i++) r = d.pointAt(t[i]), o = e[i].segments, a = r.x - o[0].anchor().x, s = r.y - o[0].anchor().y, e[i].transform((new S.Transformation).translate(a, s)) } }), at = u.extend({ init: function(t, n) { var i, r, o, a, s, l = this, d = p.ui.themes || {}; if (c.destroy(t), e(t).empty(), u.fn.init.call(l, t), l.wrapper = l.element, l._originalOptions = h({}, n), i = h({}, l.options, n), o = i.theme, a = d[o] || d[o.toLowerCase()], r = o && a ? a.gauge : {}, l.options = h({}, r, i), e.isArray(i.pointer)) for (s = 0; i.pointer.length > s; s++) l.options.pointer[s] = h({}, r.pointer, i.pointer[s]); l.element.addClass("k-gauge"), l.surface = l._createSurface(), l.redraw() }, options: { plotArea: {}, theme: "default", renderAs: "", pointer: {}, scale: {}, gaugeArea: {} }, destroy: function() { this.surface.destroy(), u.fn.destroy.call(this) }, value: function(e) { var n = this, i = n.pointers[0]; return 0 === arguments.length ? i.value() : (i.value(e), n._setValueOptions(e), t) }, _draw: function() { var e = this.surface; e.clear(), e.draw(this._visuals) }, exportVisual: function() { return this._visuals }, allValues: function(t) { var n, i = this, r = i.pointers, o = []; if (0 === arguments.length) { for (n = 0; r.length > n; n++) o.push(r[n].value()); return o } if (e.isArray(t)) for (n = 0; t.length > n; n++) y(t[n]) && r[n].value(t[n]); i._setValueOptions(t) }, _setValueOptions: function(e) { var t, n = [].concat(this.options.pointer); for (e = [].concat(e), t = 0; e.length > t; t++) n[t].value = e[t] }, _resize: function() { var e, t = this, n = t.options.transitions; for (t.options.transitions = !1, e = 0; t.pointers.length > e; e++) t.pointers[e].options.animation.transitions = !1; for (t.redraw(), t.options.transitions = n, e = 0; t.pointers.length > e; e++) t.pointers[e].options.animation.transitions = n }, redraw: function() { var e, t = this, n = h(t._getSize(), t.options.gaugeArea), i = new I([0, 0], [n.width, n.height]); t.surface.clear(), t.gaugeArea = t._createGaugeArea(), t.surface.element.css({ width: n.width, height: n.height }), t._createModel(), e = o(i.bbox(), t._gaugeAreaMargin), t.reflow(e) }, _createGaugeArea: function() { var e, t = this, n = t.options.gaugeArea, i = t.surface.size(), r = (t._gaugeAreaMargin = n.margin || $, n.border || {}), a = new I([0, 0], [i.width, i.height]); return r.width > 0 && (a = o(a, r.width)), e = E.fromRect(a, { stroke: { color: r.width ? r.color : "", width: r.width, dashType: r.dashType, lineJoin: "round", lineCap: "round" }, fill: { color: n.background } }) }, _createSurface: function() { var t, n = this, i = n.options, r = n._getSize(); return r = i.gaugeArea ? h(r, i.gaugeArea) : r, t = e("<div></div>").appendTo(n.element).css({ width: r.width, height: r.height }), new T.Surface.create(t, { type: i.renderAs }) }, getSize: function() { return this._getSize() }, _getSize: function() { var e = this, t = e.element, n = t.width(), i = t.height(); return n || (n = j), i || (i = U), { width: n, height: i } } }), st = at.extend({ init: function(e, t) { var n = this; at.fn.init.call(n, e, t), c.notify(n, p.ui) }, options: { name: "RadialGauge", transitions: !0, gaugeArea: { background: "" } }, reflow: function(e) { { var t, n, i = this, r = i.pointers; i.scale.reflow(e) } for (i._initialPlotArea = i.scale.bbox, t = 0; r.length > t; t++) n = r[t].reflow(i.scale.arc), i._initialPlotArea = I.union(i._initialPlotArea, r[t].bbox); i.fitScale(e), i.alignScale(e), i._buildVisual(i.gaugeArea, r, i.scale), i._draw() }, _buildVisual: function(e, t, n) { var i, r, o = new A; for (o.append(e), o.append(n.ticks), o.append(n.ranges), r = 0; t.length > r; r++) i = t[r], i.render(), o.append(i.elements), i.value(i.options.value); o.append(n.labelElements), this._visuals = o }, fitScale: function(e) { for (var t, n, i, r, o, a = this, s = a.scale, c = s.arc, d = a._initialPlotArea, u = l.abs(a.getDiff(d, e)), h = C(u, N), p = C(-u, N), f = 0, g = 0; !(!(g++ < 100) || (f = o === i ? f + 1 : 0, f > 5) || h != r && (t = a.getPlotBox(h, e, c), t >= 0 && 2 >= t) || p != r && (i = a.getPlotBox(p, e, c), i >= 0 && 2 >= i) || (r = t > 0 && i > 0 ? 2 * h : 0 > t && 0 > i ? 2 * p : C((h + p) / 2 || 1, N), n = a.getPlotBox(r, e, c), n >= 0 && 2 >= n));) o = i, n > 0 ? (p = r, i = n) : (h = r, t = n) }, getPlotBox: function(e, t, n) { var i, r = this, o = r.scale, a = r.pointers, s = n.getRadiusX(); for (n = n.clone(), n.setRadiusX(s + e).setRadiusY(s + e), o.arc = n, o.reflow(t), r.plotBbox = o.bbox, i = 0; a.length > i; i++) a[i].reflow(n), r.plotBbox = I.union(r.plotBbox, a[i].bbox); return r.getDiff(r.plotBbox, t) }, getDiff: function(e, t) { return l.min(t.width() - e.width(), t.height() - e.height()) }, alignScale: function(e) { var t, n = this, i = n.plotBbox.center(), r = e.center(), o = i.x - r.x, a = i.y - r.y, s = n.scale, l = n.pointers; for (s.arc.center.x -= o, s.arc.center.y -= a, s.reflow(e), t = 0; l.length > t; t++) l[t].reflow(s.arc), n.plotBbox = I.union(s.bbox, l[t].bbox) }, _createModel: function() { var t, n, i = this, r = i.options, o = r.pointer, a = i.scale = new ot(r.scale); for (i.pointers = [], o = e.isArray(o) ? o : [o], n = 0; o.length > n; n++) t = new rt(a, h({}, o[n], { animation: { transitions: r.transitions } })), i.pointers.push(t) } }), lt = at.extend({ init: function(e, t) { var n = this; at.fn.init.call(n, e, t), c.notify(n, p.ui) }, options: { name: "LinearGauge", transitions: !0, gaugeArea: { background: "" }, scale: { vertical: !0 } }, reflow: function(e) { var t, n = this, i = n.pointers, r = e.origin.x, o = e.origin.y, a = new p.Box2D(r, r, r + e.width(), o + e.height()); for (n.scale.reflow(a), t = 0; i.length > t; t++) i[t].reflow(); n.bbox = n._getBox(a), n._alignElements(), n._shrinkElements(), n._buildVisual(), n._draw() }, _buildVisual: function() { var e, t, n = this, i = new A, r = n.scale.render(), o = n.pointers; for (i.append(n.gaugeArea), i.append(r), t = 0; o.length > t; t++) e = o[t], i.append(e.render()), e.value(e.options.value); n._visuals = i }, _createModel: function() { var t, n, i, r = this, o = r.options, a = o.pointer, s = r.scale = new ct(o.scale); for (r.pointers = [], a = e.isArray(a) ? a : [a], i = 0; a.length > i; i++) n = h({}, a[i], { animation: { transitions: o.transitions } }), t = n.shape === F ? new ut(s, n) : new ht(s, n), r.pointers.push(t) }, _getSize: function() { var e = this, t = e.element, n = t.width(), i = t.height(), r = e.options.scale.vertical; return n || (n = r ? G : j), i || (i = r ? U : q), { width: n, height: i } }, _getBox: function(e) { var t, n, i = this, r = i.scale, o = i.pointers, a = e.center(), s = o[0].box.clone().wrap(r.box); for (n = 0; o.length > n; n++) s.wrap(o[n].box.clone()); return r.options.vertical ? (t = s.width() / 2, s = new _(a.x - t, e.y1, a.x + t, e.y2)) : (t = s.height() / 2, s = new _(e.x1, a.y - t, e.x2, a.y + t)), s }, _alignElements: function() { var e, t, n = this, i = n.scale, r = n.pointers, o = i.box, a = r[0].box.clone().wrap(i.box), s = n.bbox; for (t = 0; r.length > t; t++) a.wrap(r[t].box.clone()); for (i.options.vertical ? (e = s.center().x - a.center().x, i.reflow(new _(o.x1 + e, s.y1, o.x2 + e, s.y2))) : (e = s.center().y - a.center().y, i.reflow(new _(s.x1, o.y1 + e, s.x2, o.y2 + e))), t = 0; r.length > t; t++) r[t].reflow(n.bbox) }, _shrinkElements: function() { var e, t = this, n = t.scale, i = t.pointers, r = n.box.clone(), o = n.options.vertical ? "y" : "x", a = i[0].box; for (e = 0; i.length > e; e++) a.wrap(i[e].box.clone()); for (r[o + 1] += l.max(r[o + 1] - a[o + 1], 0), r[o + 2] -= l.max(a[o + 2] - r[o + 2], 0), n.reflow(r), e = 0; i.length > e; e++) i[e].reflow(t.bbox) } }), ct = m.extend({ init: function(e) { var t = this; t.options = h({}, t.options, e), t.options = h({}, t.options, { labels: { mirror: t.options.mirror } }), t.options.majorUnit = t.options.majorUnit || f(t.options.min, t.options.max), v.fn.init.call(t, t.options), t.options.minorUnit = t.options.minorUnit || t.options.majorUnit / 10 }, options: { min: 0, max: 50, majorTicks: { size: 15, align: K, color: B, width: W, visible: !0 }, minorTicks: { size: 10, align: K, color: B, width: W, visible: !0 }, line: { width: W }, labels: { position: K, padding: 2 }, mirror: !1, _alignLines: !1 }, render: function() { var e = this, t = e.elements = new A, n = e.renderLabels(), i = e.renderLine(), r = e.renderTicks(), o = e.renderRanges(); return t.append(i, n, r, o), t }, renderRanges: function() { var e, t, n, r, o, a = this, s = a.options, l = s.min, c = s.max, d = s.ranges || [], u = s.vertical, h = s.labels.mirror, p = new A, f = d.length, g = s.rangeSize || s.minorTicks.size / 2; if (f) for (o = 0; f > o; o++) e = i(d[o], l, c), t = a.getSlot(e.from, e.to), n = u ? a.lineBox() : t, r = u ? t : a.lineBox(), u ? n.x1 -= g * (h ? -1 : 1) : r.y2 += g * (h ? -1 : 1), p.append(E.fromRect(new I([n.x1, r.y1], [n.x2 - n.x1, r.y2 - r.y1]), { fill: { color: e.color, opacity: e.opacity }, stroke: {} })); return p }, renderLabels: function() { var e, t = this, i = t.options, r = t.labels, o = new A; for (e = 0; r.length > e; e++) o.append(n(r[e], i.labels)); return o }, renderLine: function() { var e, t = this, n = t.options, i = n.line, r = t.lineBox(), o = new A; return i.width > 0 && i.visible && (e = new E({ stroke: { color: i.color, dashType: i.dashType, width: i.width } }), e.moveTo(r.x1, r.y1).lineTo(r.x2, r.y2), o.append(e)), o }, renderTicks: function() { function e(e, i) { var a, l = e.length; if (i.visible) for (a = i.skip; l > a; a += i.step) a % i.skipUnit !== 0 && (s.tickX = o ? r.x2 : r.x2 - i.size, s.tickY = o ? r.y1 - i.size : r.y1, s.position = e[a], n.append(t.renderAxisTick(s, i))) } var t = this, n = new A, i = t.options, r = t.lineBox(), o = i.labels.mirror, a = i.majorTicks.visible ? i.majorUnit : 0, s = { _alignLines: i._alignLines, vertical: i.vertical }; return e(t.getMajorTickPositions(), i.majorTicks), e(t.getMinorTickPositions(), h({}, { skipUnit: a / i.minorUnit }, i.minorTicks)), n }, renderAxisTick: function(e, t) { var n, i, r, o = e.tickX, a = e.tickY, s = e.position; return e.vertical ? (n = new D(o, s), i = new D(o + t.size, s)) : (n = new D(s, a), i = new D(s, a + t.size)), r = new E({ stroke: { color: t.color, width: t.width } }).moveTo(n).lineTo(i) } }), dt = it.extend({ init: function(e, t) { var n = this; it.fn.init.call(n, e, t), n.options = h({ track: { visible: b(t.track) } }, n.options) }, options: { shape: H, track: { border: { width: 1 } }, color: B, border: { width: 1 }, opacity: 1, margin: x(3), animation: { type: H }, visible: !0 }, reflow: function() { var e, t, n, i = this, r = i.options, o = i.scale, a = o.lineBox(), s = r.track.size || r.size, l = r.size / 2, c = o.options.mirror, d = x(r.margin), u = o.options.vertical, h = u ? d[c ? "left" : "right"] : d[c ? "bottom" : "top"]; h = c ? -h : h, u ? (n = new _(a.x1 + h, a.y1, a.x1 + h, a.y2), c ? n.x1 -= s : n.x2 += s, r.shape !== H && (t = new _(a.x2 + h, a.y1 - l, a.x2 + h, a.y2 + l), e = t)) : (n = new _(a.x1, a.y1 - h, a.x2, a.y1 - h), c ? n.y2 += s : n.y1 -= s, r.shape !== H && (t = new _(a.x1 - l, a.y1 - h, a.x2 + l, a.y1 - h), e = t)), i.trackBox = n, i.pointerRangeBox = t, i.box = e || n.clone().pad(r.border.width) }, getElementOptions: function() { { var e = this.options; new A } return { fill: { color: e.color, opacity: e.opacity }, stroke: b(e.border) ? { color: e.border.width ? e.border.color || e.color : "", width: e.border.width, dashType: e.border.dashType, opacity: e.opacity } : null } }, _margin: function() { var e = this, t = e.options, n = e.scale, i = n.options.mirror, r = x(t.margin), o = n.options.vertical, a = o ? r[i ? "left" : "right"] : r[i ? "bottom" : "top"]; return a } }), ut = dt.extend({ init: function(e, n) { dt.fn.init.call(this, e, n), this.options.size === t && (this.options.size = .6 * this.scale.options.majorTicks.size) }, pointerShape: function() { var e, t, n = this, i = n.options, r = n.scale, o = i.size, a = r.options.vertical, s = o / 2, l = r.options.mirror ? -1 : 1, c = r.options.reverse; return a ? (e = c ? "y2" : "y1", t = [new D(0, 0 - s), new D(0 - l * o, 0), new D(0, 0 + s)]) : (e = c ? "x1" : "x2", t = [new D(0 - s, 0), new D(0, 0 + l * o), new D(0 + s, 0)]), t }, repaint: function() { var e = this, t = e.scale, n = e.options, i = new a(e.elements, h(n.animation, { vertical: t.options.vertical, mirror: t.options.mirror, margin: e._margin(n.margin), from: t.getSlot(n._oldValue), to: t.getSlot(n.value) })); n.animation.transitions === !1 && (i.options.duration = 0), i.setup(), i.play() }, render: function() { var e, t = this, n = t.options, i = new A, r = t.scale, o = t.getElementOptions(), a = t.pointerShape(n.value); return n.animation.type = R, i = new E({ stroke: o.stroke, fill: o.fill }).moveTo(a[0]).lineTo(a[1]).lineTo(a[2]).close(), e = r.getSlot(n.value), i.transform(S.transform().translate(e.x1, e.y1)), t.elements = i, i } }), ht = dt.extend({ init: function(e, n) { dt.fn.init.call(this, e, n), this.options.size === t && (this.options.size = .3 * this.scale.options.majorTicks.size) }, pointerShape: function(e) { var t, n, i, r = this, o = r.options, a = r.scale, s = a.options.vertical, l = a.options.mirror, c = l == s ? -1 : 1, d = o.size * c, u = a.getSlot(a.options.min), h = a.getSlot(e), p = s ? nt : tt, f = s ? tt : nt, g = r._margin() * c, m = new D; return m[p] = u[p + "1"], m[f] = u[f + "1"], t = new D, t[p] = h[p + "1"], t[f] = h[f + "1"], s ? (m.translate(g, 0), t.translate(g, 0)) : (m.translate(0, g), t.translate(0, g)), n = t.clone(), i = m.clone(), s ? (n.translate(d, 0), i.translate(d, 0)) : (n.translate(0, d), i.translate(0, d)), [m, t, n, i] }, repaint: function() { var e, t = this, n = t.scale, i = t.options, r = t.pointerShape(i.value), o = t.elements.children[0], a = t.pointerShape(i._oldValue); o.moveTo(r[0]).lineTo(r[1]).lineTo(r[2]).lineTo(r[3]).close(), e = new s(o, h(i.animation, { reverse: n.options.reverse, vertical: n.options.vertical, oldPoints: [a[1], a[2]], newPoints: [r[1], r[2]] })), i.animation.transitions === !1 && (e.options.duration = 0), e.setup(), e.play() }, render: function() { var e = this, t = new A, n = e.getElementOptions(), i = new E({ stroke: n.stroke, fill: n.fill }); return t.append(i), e.elements = t, t } }), pt = T.Animation.extend({ init: function(e, t) { T.Animation.fn.init.call(this, e, t), t = this.options, t.duration = l.max(l.abs(t.newAngle - t.oldAngle) / t.duration * 1e3, 1) }, options: { easing: X, duration: M }, step: function(e) { var t = this, n = t.options, i = k(n.oldAngle, n.newAngle, e); t.element.transform(S.transform().rotate(i, n.center)) } }); T.AnimationFactory.current.register(et, pt), a = T.Animation.extend({ options: { easing: X, duration: z }, setup: function() { var e, t, n = this.options, i = (this.element.bbox().width() / 2, n.margin), r = n.from, o = n.to, a = n.vertical ? "x1" : "y1"; n.mirror == n.vertical ? (r[a] -= i, o[a] -= i) : (r[a] += i, o[a] += i), e = this.fromScale = new D(r.x1, r.y1), t = this.toScale = new D(o.x1, o.y1), 0 !== n.duration && (n.duration = l.max(e.distanceTo(t) / n.duration * 1e3, 1)) }, step: function(e) { var t = k(this.fromScale.x, this.toScale.x, e), n = k(this.fromScale.y, this.toScale.y, e); this.element.transform(S.transform().translate(t, n)) } }), T.AnimationFactory.current.register(R, a), s = T.Animation.extend({ options: { easing: X, speed: z }, setup: function() { var e = this.options, t = e.newPoints, n = e.oldPoints, i = this.axis = e.vertical ? nt : tt, r = this.to = t[0][i], o = this.from = n[0][i]; 0 !== e.duration && (e.duration = l.max(l.abs(r - o) / e.speed * 1e3, 1)), this._set(o) }, step: function(e) { var t = k(this.from, this.to, e); this._set(t) }, _set: function(e) { var t = "set" + this.axis.toUpperCase(), n = this.options.newPoints; n[0][t](e), n[1][t](e) } }), T.AnimationFactory.current.register(H, s), p.ui.plugin(st), p.ui.plugin(lt), p.ExportMixin.extend(at.fn), h(p, { Gauge: at, RadialPointer: rt, LinearPointer: dt, ArrowLinearPointer: ut, BarLinearPointer: ht, LinearScale: ct, RadialScale: ot, LinearGauge: lt, RadialGauge: st }) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { return e.substring(t, t + n) } var i, r, o, a, s, l, c = window.kendo, d = c.ui.Widget, u = e.extend, h = c.deepExtend, p = e.inArray, f = e.isPlainObject, g = c.drawing, m = c.geometry, v = c.util, _ = v.defined, w = c.dataviz, b = w.Box2D, y = w.TextBox, k = 300, x = 100, C = 10, S = /^\d+$/, T = /^[a-z0-9]+$/i, D = "Character '{0}' is not valid for symbology {1}", A = c.Class.extend({ init: function(e) { this.setOptions(e) }, setOptions: function(e) { var t = this; t.options = u({}, t.options, e), t.quietZoneLength = t.options.addQuietZone ? 2 * t.options.quietZoneLength : 0 }, encode: function(e, t, n) { var i = this; return _(e) && (e += ""), i.initValue(e, t, n), i.options.addQuietZone && i.addQuietZone(), i.addData(), i.options.addQuietZone && i.addQuietZone(), { baseUnit: i.baseUnit, pattern: i.pattern } }, options: { quietZoneLength: C, addQuietZone: !0, addCheckSum: !0 }, initValue: function() {}, addQuietZone: function() { this.pattern.push(this.options.quietZoneLength || C) }, addData: function() {}, invalidCharacterError: function(e) { throw Error(c.format(D, e, this.name)) } }), E = {}, I = A.extend({ minBaseUnitLength: .7, addData: function() { var e, t = this, n = t.value; for (t.addStart(), e = 0; n.length > e; e++) t.addCharacter(n.charAt(e)); t.options.addCheckSum && t.pushCheckSum(), t.addStop(), t.prepareValues() }, addCharacter: function(e) { var t = this, n = t.characterMap[e]; n || t.invalidCharacterError(e), t.addBase(n) }, addBase: function() {} }), P = { addCharacter: function(e) { var t = this; t.characterMap[e] ? t.addBase(t.characterMap[e]) : e.charCodeAt(0) > 127 ? t.invalidCharacterError(e) : t.addExtended(e.charCodeAt(0)) }, addExtended: function(e) { var n, i, r, o = this; for (i = 0; o.extendedMappings.length > i; i++) if (n = o.extendedMappings[i].call(o, e)) { for (r = 0; n.length > r; r++) o.addBase(n[r]); return o.dataLength += n.length - 1, t } }, extendedMappings: [ function(e) { if (e >= 97 && 122 >= e) { var t = this; return [t.characterMap[t.shiftCharacters[0]], t.characterMap[String.fromCharCode(e - 32)]] } }, function(e) { if (e >= 33 && 58 >= e) { var t = this; return [t.characterMap[t.shiftCharacters[1]], t.characterMap[String.fromCharCode(e + 32)]] } }, function(e) { if (e >= 1 && 26 >= e) { var t = this; return [t.characterMap[t.shiftCharacters[2]], t.characterMap[String.fromCharCode(e + 64)]] } }, function(e) { var t, n, i, r = this; if (r.specialAsciiCodes[e]) for (t = [], i = 0; r.specialAsciiCodes[e].length > i; i++) t.push(r.characterMap[r.shiftCharacters[3]]), t.push(r.characterMap[r.specialAsciiCodes[e][i]]); else n = 6 * Math.floor(e / 32) + (e - 27) % 32 + 64, t = [r.characterMap[r.shiftCharacters[3]], r.characterMap[String.fromCharCode(n)]]; return t } ], specialAsciiCodes: { 0: ["U"], 64: ["V"], 96: ["W"], 127: ["T", "X", "Y", "Z"] }, shiftValuesAsciiCodes: { 39: 36, 40: 47, 41: 43, 42: 37 }, characterMap: { "+": !1, "/": !1, $: !1, "%": !1 }, shiftCharacters: ["SHIFT0", "SHIFT1", "SHIFT2", "SHIFT3"] }; E.code39 = I.extend({ name: "Code 39", checkSumMod: 43, minRatio: 2.5, maxRatio: 3, gapWidth: 1, splitCharacter: "|", initValue: function(e, t, n) { var i = this; i.width = t, i.height = n, i.value = e, i.dataLength = e.length, i.pattern = [], i.patternString = "" }, prepareValues: function() { var e, t, n = this, i = n.minBaseUnitLength, r = n.maxRatio, o = n.minRatio, a = Math.max(.15 * n.width, 24); if (a > n.height) throw Error("Insufficient Height. The minimum height for value: " + n.value + " is: " + a); for (; (e = n.getBaseUnit(r)) < i && r > o;) r = parseFloat((r - .1).toFixed(1)); if (i > e) throw t = Math.ceil(n.getBaseWidth(o) * i), Error("Insufficient width. The minimum width for value: " + n.value + " is: " + t); n.ratio = r, n.baseUnit = e, n.patternString = n.patternString.substring(0, n.patternString.length - 1), n.pattern = n.pattern.concat(n.patternString.replace(/ratio/g, r).split(n.splitCharacter)) }, getBaseUnit: function(e) { return this.width / this.getBaseWidth(e) }, getBaseWidth: function(e) { var t = this, n = 3 * (e + 2); return t.quietZoneLength + n * (t.dataLength + 2) + t.gapWidth * (t.dataLength + 1) }, addStart: function() { var e = this; e.addPattern(e.characterMap.START.pattern), e.addCharacterGap() }, addBase: function(e) { this.addPattern(e.pattern), this.addCharacterGap() }, addStop: function() { this.addPattern(this.characterMap.START.pattern) }, addPattern: function(e) { for (var t = 0; e.length > t; t++) this.patternString += this.patternMappings[e.charAt(t)] }, addCharacterGap: function() { var e = this; e.patternString += e.gapWidth + e.splitCharacter }, patternMappings: { b: "1|", w: "1|", B: "ratio|", W: "ratio|" }, characterMap: { 0: { pattern: "bwbWBwBwb", value: 0 }, 1: { pattern: "BwbWbwbwB", value: 1 }, 2: { pattern: "bwBWbwbwB", value: 2 }, 3: { pattern: "BwBWbwbwb", value: 3 }, 4: { pattern: "bwbWBwbwB", value: 4 }, 5: { pattern: "BwbWBwbwb", value: 5 }, 6: { pattern: "bwBWBwbwb", value: 6 }, 7: { pattern: "bwbWbwBwB", value: 7 }, 8: { pattern: "BwbWbwBwb", value: 8 }, 9: { pattern: "bwBWbwBwb", value: 9 }, A: { pattern: "BwbwbWbwB", value: 10 }, B: { pattern: "bwBwbWbwB", value: 11 }, C: { pattern: "BwBwbWbwb", value: 12 }, D: { pattern: "bwbwBWbwB", value: 13 }, E: { pattern: "BwbwBWbwb", value: 14 }, F: { pattern: "bwBwBWbwb", value: 15 }, G: { pattern: "bwbwbWBwB", value: 16 }, H: { pattern: "BwbwbWBwb", value: 17 }, I: { pattern: "bwBwbWBwb", value: 18 }, J: { pattern: "bwbwBWBwb", value: 19 }, K: { pattern: "BwbwbwbWB", value: 20 }, L: { pattern: "bwBwbwbWB", value: 21 }, M: { pattern: "BwBwbwbWb", value: 22 }, N: { pattern: "bwbwBwbWB", value: 23 }, O: { pattern: "BwbwBwbWb", value: 24 }, P: { pattern: "bwBwBwbWb", value: 25 }, Q: { pattern: "bwbwbwBWB", value: 26 }, R: { pattern: "BwbwbwBWb", value: 27 }, S: { pattern: "bwBwbwBWb", value: 28 }, T: { pattern: "bwbwBwBWb", value: 29 }, U: { pattern: "BWbwbwbwB", value: 30 }, V: { pattern: "bWBwbwbwB", value: 31 }, W: { pattern: "BWBwbwbwb", value: 32 }, X: { pattern: "bWbwBwbwB", value: 33 }, Y: { pattern: "BWbwBwbwb", value: 34 }, Z: { pattern: "bWBwBwbwb", value: 35 }, "-": { pattern: "bWbwbwBwB", value: 36 }, ".": { pattern: "BWbwbwBwb", value: 37 }, " ": { pattern: "bWBwbwBwb", value: 38 }, $: { pattern: "bWbWbWbwb", value: 39 }, "/": { pattern: "bWbWbwbWb", value: 40 }, "+": { pattern: "bWbwbWbWb", value: 41 }, "%": { pattern: "bwbWbWbWb", value: 42 }, START: { pattern: "bWbwBwBwb" } }, options: { addCheckSum: !1 } }), E.code39extended = E.code39.extend(h({}, P, { name: "Code 39 extended", characterMap: { SHIFT0: { pattern: "bWbwbWbWb", value: 41 }, SHIFT1: { pattern: "bWbWbwbWb", value: 40 }, SHIFT2: { pattern: "bWbWbWbwb", value: 39 }, SHIFT3: { pattern: "bwbWbWbWb", value: 42 } } })), E.code93 = I.extend({ name: "Code 93", cCheckSumTotal: 20, kCheckSumTotal: 15, checkSumMod: 47, initValue: function(e, t, n) { var i = this; i.value = e, i.width = t, i.height = n, i.pattern = [], i.values = [], i.dataLength = e.length }, prepareValues: function() { var e = this, t = Math.max(.15 * e.width, 24); if (t > e.height) throw Error("Insufficient Height"); if (e.setBaseUnit(), e.minBaseUnitLength > e.baseUnit) throw Error("Insufficient Width") }, setBaseUnit: function() { var e = this, t = 2; e.baseUnit = e.width / (9 * (e.dataLength + 2 + t) + e.quietZoneLength + 1) }, addStart: function() { var e = this.characterMap.START.pattern; this.addPattern(e) }, addStop: function() { var e = this; e.addStart(), e.pattern.push(e.characterMap.TERMINATION_BAR) }, addBase: function(e) { this.addPattern(e.pattern), this.values.push(e.value) }, pushCheckSum: function() { var e, t, n = this, i = n._getCheckValues(); for (n.checksum = i.join(""), t = 0; i.length > t; t++) e = n.characterMap[n._findCharacterByValue(i[t])], n.addPattern(e.pattern) }, _getCheckValues: function() { var e, t, n, i = this, r = i.values, o = r.length, a = 0; for (n = o - 1; n >= 0; n--) a += i.weightedValue(r[n], o - n, i.cCheckSumTotal); for (e = a % i.checkSumMod, a = i.weightedValue(e, 1, i.kCheckSumTotal), n = o - 1; n >= 0; n--) a += i.weightedValue(r[n], o - n + 1, i.kCheckSumTotal); return t = a % i.checkSumMod, [e, t] }, _findCharacterByValue: function(e) { for (var t in this.characterMap) if (this.characterMap[t].value === e) return t }, weightedValue: function(e, t, n) { return (t % n || n) * e }, addPattern: function(e) { var t, n; for (n = 0; e.length > n; n++) t = parseInt(e.charAt(n), 10), this.pattern.push(t) }, characterMap: { 0: { pattern: "131112", value: 0 }, 1: { pattern: "111213", value: 1 }, 2: { pattern: "111312", value: 2 }, 3: { pattern: "111411", value: 3 }, 4: { pattern: "121113", value: 4 }, 5: { pattern: "121212", value: 5 }, 6: { pattern: "121311", value: 6 }, 7: { pattern: "111114", value: 7 }, 8: { pattern: "131211", value: 8 }, 9: { pattern: "141111", value: 9 }, A: { pattern: "211113", value: 10 }, B: { pattern: "211212", value: 11 }, C: { pattern: "211311", value: 12 }, D: { pattern: "221112", value: 13 }, E: { pattern: "221211", value: 14 }, F: { pattern: "231111", value: 15 }, G: { pattern: "112113", value: 16 }, H: { pattern: "112212", value: 17 }, I: { pattern: "112311", value: 18 }, J: { pattern: "122112", value: 19 }, K: { pattern: "132111", value: 20 }, L: { pattern: "111123", value: 21 }, M: { pattern: "111222", value: 22 }, N: { pattern: "111321", value: 23 }, O: { pattern: "121122", value: 24 }, P: { pattern: "131121", value: 25 }, Q: { pattern: "212112", value: 26 }, R: { pattern: "212211", value: 27 }, S: { pattern: "211122", value: 28 }, T: { pattern: "211221", value: 29 }, U: { pattern: "221121", value: 30 }, V: { pattern: "222111", value: 31 }, W: { pattern: "112122", value: 32 }, X: { pattern: "112221", value: 33 }, Y: { pattern: "122121", value: 34 }, Z: { pattern: "123111", value: 35 }, "-": { pattern: "121131", value: 36 }, ".": { pattern: "311112", value: 37 }, " ": { pattern: "311211", value: 38 }, $: { pattern: "321111", value: 39 }, "/": { pattern: "112131", value: 40 }, "+": { pattern: "113121", value: 41 }, "%": { pattern: "211131", value: 42 }, SHIFT0: { pattern: "122211", value: 46 }, SHIFT1: { pattern: "311121", value: 45 }, SHIFT2: { pattern: "121221", value: 43 }, SHIFT3: { pattern: "312111", value: 44 }, START: { pattern: "111141" }, TERMINATION_BAR: "1" } }), E.code93extended = E.code93.extend(h({}, P, { name: "Code 93 extended", pushCheckSum: function() { var e, t, n = this, i = n._getCheckValues(); for (n.checksum = i.join(""), t = 0; i.length > t; t++) e = i[t], n.shiftValuesAsciiCodes[e] ? n.addExtended(n.shiftValuesAsciiCodes[e]) : n.addPattern(n.characterMap[n._findCharacterByValue(e)].pattern) } })), i = c.Class.extend({ init: function(e) { this.encoding = e }, addStart: function() {}, is: function() {}, move: function() {}, pushState: function() {} }), r = i.extend({ FNC4: "FNC4", init: function(e, t) { var n = this; n.encoding = e, n.states = t, n._initMoves(t) }, addStart: function() { this.encoding.addPattern(this.START) }, is: function(e, t) { var n = e.charCodeAt(t); return this.isCode(n) }, move: function(e) { for (var t = this, n = 0; !t._moves[n].call(t, e) && t._moves.length > n;) n++ }, pushState: function(e) { var t, n, i = this, r = i.states, o = e.value, a = o.length; for (p("C", r) >= 0 && (n = o.substr(e.index).match(/\d{4,}/g), n && (a = o.indexOf(n[0], e.index))); (t = e.value.charCodeAt(e.index)) >= 0 && i.isCode(t) && a > e.index;) i.encoding.addPattern(i.getValue(t)), e.index++ }, _initMoves: function(e) { var t = this; t._moves = [], p(t.FNC4, e) >= 0 && t._moves.push(t._moveFNC), p(t.shiftKey, e) >= 0 && t._moves.push(t._shiftState), t._moves.push(t._moveState) }, _moveFNC: function(e) { return e.fnc ? (e.fnc = !1, e.previousState == this.key) : t }, _shiftState: function(e) { var n = this; return e.previousState == n.shiftKey && (e.index + 1 >= e.value.length || n.encoding[n.shiftKey].is(e.value, e.index + 1)) ? (n.encoding.addPattern(n.SHIFT), e.shifted = !0, !0) : t }, _moveState: function() { return this.encoding.addPattern(this.MOVE), !0 }, SHIFT: 98 }), o = {}, o.A = r.extend({ key: "A", shiftKey: "B", isCode: function(e) { return e >= 0 && 96 > e }, getValue: function(e) { return 32 > e ? e + 64 : e - 32 }, MOVE: 101, START: 103 }), o.B = r.extend({ key: "B", shiftKey: "A", isCode: function(e) { return e >= 32 && 128 > e }, getValue: function(e) { return e - 32 }, MOVE: 100, START: 104 }), o.C = i.extend({ key: "C", addStart: function() { this.encoding.addPattern(this.START) }, is: function(e, t) { var i = n(e, t, 4); return (e.length >= t + 4 || 2 == e.length) && S.test(i) }, move: function() { this.encoding.addPattern(this.MOVE) }, pushState: function(e) { for (var t; (t = n(e.value, e.index, 2)) && S.test(t) && 2 == t.length;) this.encoding.addPattern(parseInt(t, 10)), e.index += 2 }, getValue: function(e) { return e }, MOVE: 99, START: 105 }), o.FNC4 = i.extend({ key: "FNC4", dependentStates: ["A", "B"], init: function(e, t) { this.encoding = e, this._initSubStates(t) }, addStart: function(e) { var t = e.value.charCodeAt(0) - 128, n = this._getSubState(t); this.encoding[n].addStart() }, is: function(e, t) { var n = e.charCodeAt(t); return this.isCode(n) }, isCode: function(e) { return e >= 128 && 256 > e }, pushState: function(e) { var t, n = this, i = n._initSubState(e), r = n.encoding, o = i.value.length; if (e.index += o, 3 > o) for (; o > i.index; i.index++) t = i.value.charCodeAt(i.index), i.state = n._getSubState(t), i.previousState != i.state && (i.previousState = i.state, r[i.state].move(i)), r.addPattern(r[i.state].MOVE), r.addPattern(r[i.state].getValue(t)); else i.state != i.previousState && r[i.state].move(i), n._pushStart(i), r.pushData(i, n.subStates), e.value.length > e.index && n._pushStart(i); e.fnc = !0, e.state = i.state }, _pushStart: function(e) { var t = this; t.encoding.addPattern(t.encoding[e.state].MOVE), t.encoding.addPattern(t.encoding[e.state].MOVE) }, _initSubState: function(e) { var t = this, n = { value: t._getAll(e.value, e.index), index: 0 }; return n.state = t._getSubState(n.value.charCodeAt(0)), n.previousState = e.previousState == t.key ? n.state : e.previousState, n }, _initSubStates: function(e) { var t, n = this; for (n.subStates = [], t = 0; e.length > t; t++) p(e[t], n.dependentStates) >= 0 && n.subStates.push(e[t]) }, _getSubState: function(e) { var t, n = this; for (t = 0; n.subStates.length > t; t++) if (n.encoding[n.subStates[t]].isCode(e)) return n.subStates[t] }, _getAll: function(e, t) { for (var n, i = ""; (n = e.charCodeAt(t++)) && this.isCode(n);) i += String.fromCharCode(n - 128); return i } }), o.FNC1 = i.extend({ key: "FNC1", startState: "C", dependentStates: ["C", "B"], startAI: "(", endAI: ")", init: function(e, t) { this.encoding = e, this.states = t }, addStart: function() { this.encoding[this.startState].addStart() }, is: function() { return p(this.key, this.states) >= 0 }, pushState: function(e) { var t, n, i, r = this, o = r.encoding, a = e.value.replace(/\s/g, ""), s = RegExp("[" + r.startAI + r.endAI + "]", "g"), l = e.index, c = { state: r.startState }; for (o.addPattern(r.START);;) { if (c.index = 0, i = a.charAt(l) === r.startAI ? 2 : 0, t = i > 0 ? r.getBySeparator(a, l) : r.getByLength(a, l), t.ai.length) n = l + i + t.id.length + t.ai.length; else if (n = a.indexOf(r.startAI, l + 1), 0 > n) { if (a.length > l + t.ai.max + t.id.length + i) throw Error("Separators are required after variable length identifiers"); n = a.length } if (c.value = a.substring(l, n).replace(s, ""), r.validate(t, c.value), o.pushData(c, r.dependentStates), n >= a.length) break; l = n, c.state != r.startState && (o[r.startState].move(c), c.state = r.startState), t.ai.length || o.addPattern(r.START) } e.index = e.value.length }, validate: function(e, t) { var n = t.substr(e.id.length), i = e.ai; if (!i.type && !S.test(n)) throw Error("Application identifier " + e.id + " is numeric only but contains non numeric character(s)."); if ("alphanumeric" == i.type && !T.test(n)) throw Error("Application identifier " + e.id + " is alphanumeric only but contains non alphanumeric character(s)."); if (i.length && i.length !== n.length) throw Error("Application identifier " + e.id + " must be " + i.length + " characters long."); if (i.min && i.min > n.length) throw Error("Application identifier " + e.id + " must be at least " + i.min + " characters long."); if (i.max && n.length > i.max) throw Error("Application identifier " + e.id + " must be at most " + i.max + " characters long.") }, getByLength: function(e, t) { var i, r, o, a = this; for (o = 2; 4 >= o; o++) if (i = n(e, t, o), r = a.getAI(i) || a.getAI(i.substring(0, i.length - 1))) return { id: i, ai: r }; a.unsupportedAIError(i) }, unsupportedAIError: function(e) { throw Error(c.format("'{0}' is not a supported Application Identifier"), e) }, getBySeparator: function(e, t) { var n = this, i = e.indexOf(n.startAI, t), r = e.indexOf(n.endAI, i), o = e.substring(i + 1, r), a = n.getAI(o) || n.getAI(o.substr(o.length - 1)); return a || n.unsupportedAIError(o), { ai: a, id: o } }, getAI: function(e) { var t, n, i, r = this.applicationIdentifiers, o = r.multiKey; if (r[e]) return r[e]; for (t = 0; o.length > t; t++) { if (o[t].ids && p(e, o[t].ids) >= 0) return o[t].type; if (o[t].ranges) for (n = o[t].ranges, i = 0; n.length > i; i++) if (e >= n[i][0] && n[i][1] >= e) return o[t].type } }, applicationIdentifiers: { 22: { max: 29, type: "alphanumeric" }, 402: { length: 17 }, 7004: { max: 4, type: "alphanumeric" }, 242: { max: 6, type: "alphanumeric" }, 8020: { max: 25, type: "alphanumeric" }, 703: { min: 3, max: 30, type: "alphanumeric" }, 8008: { min: 8, max: 12, type: "alphanumeric" }, 253: { min: 13, max: 17, type: "alphanumeric" }, 8003: { min: 14, max: 30, type: "alphanumeric" }, multiKey: [{ ids: ["15", "17", "8005", "8100"], ranges: [ [11, 13], [310, 316], [320, 336], [340, 369] ], type: { length: 6 } }, { ids: ["240", "241", "250", "251", "400", "401", "403", "7002", "8004", "8007", "8110"], ranges: [ [-9] ], type: { max: 30, type: "alphanumeric" } }, { ids: ["7001"], ranges: [ [410, 414] ], type: { length: 13 } }, { ids: ["10", "21", "254", "420", "8002"], type: { max: 20, type: "alphanumeric" } }, { ids: ["00", "8006", "8017", "8018"], type: { length: 18 } }, { ids: ["01", "02", "8001"], type: { length: 14 } }, { ids: ["422"], ranges: [ [424, 426] ], type: { length: 3 } }, { ids: ["20", "8102"], type: { length: 2 } }, { ids: ["30", "37"], type: { max: 8, type: "alphanumeric" } }, { ids: ["390", "392"], type: { max: 15, type: "alphanumeric" } }, { ids: ["421", "423"], type: { min: 3, max: 15, type: "alphanumeric" } }, { ids: ["391", "393"], type: { min: 3, max: 18, type: "alphanumeric" } }, { ids: ["7003", "8101"], type: { length: 10 } }] }, START: 102 }), a = A.extend({ init: function(e) { A.fn.init.call(this, e), this._initStates() }, _initStates: function() { var e, t = this; for (e = 0; t.states.length > e; e++) t[t.states[e]] = new o[t.states[e]](t, t.states) }, initValue: function(e, t, n) { var i = this; i.pattern = [], i.value = e, i.width = t, i.height = n, i.checkSum = 0, i.totalUnits = 0, i.index = 0, i.position = 1 }, addData: function() { var e = this, t = { value: e.value, index: 0, state: "" }; 0 !== e.value.length && (t.state = t.previousState = e.getNextState(t, e.states), e.addStart(t), e.pushData(t, e.states), e.addCheckSum(), e.addStop(), e.setBaseUnit()) }, pushData: function(e, t) { for (var n, i = this;;) { if (i[e.state].pushState(e), e.index >= e.value.length) break; e.shifted ? (n = e.state, e.state = e.previousState, e.previousState = n, e.shifted = !1) : (e.previousState = e.state, e.state = i.getNextState(e, t), i[e.state].move(e)) } }, addStart: function(e) { this[e.state].addStart(e), this.position = 1 }, addCheckSum: function() { var e = this; e.checksum = e.checkSum % 103, e.addPattern(e.checksum) }, addStop: function() { this.addPattern(this.STOP) }, setBaseUnit: function() { var e = this; e.baseUnit = e.width / (e.totalUnits + e.quietZoneLength) }, addPattern: function(e) { var t, n, i = this, r = "" + i.characterMap[e]; for (n = 0; r.length > n; n++) t = parseInt(r.charAt(n), 10), i.pattern.push(t), i.totalUnits += t; i.checkSum += e * i.position++ }, getNextState: function(e, t) { for (var n = 0; t.length > n; n++) if (this[t[n]].is(e.value, e.index)) return t[n]; this.invalidCharacterError(e.value.charAt(e.index)) }, characterMap: [212222, 222122, 222221, 121223, 121322, 131222, 122213, 122312, 132212, 221213, 221312, 231212, 112232, 122132, 122231, 113222, 123122, 123221, 223211, 221132, 221231, 213212, 223112, 312131, 311222, 321122, 321221, 312212, 322112, 322211, 212123, 212321, 232121, 111323, 131123, 131321, 112313, 132113, 132311, 211313, 231113, 231311, 112133, 112331, 132131, 113123, 113321, 133121, 313121, 211331, 231131, 213113, 213311, 213131, 311123, 311321, 331121, 312113, 312311, 332111, 314111, 221411, 431111, 111224, 111422, 121124, 121421, 141122, 141221, 112214, 112412, 122114, 122411, 142112, 142211, 241211, 221114, 413111, 241112, 134111, 111242, 121142, 121241, 114212, 124112, 124211, 411212, 421112, 421211, 212141, 214121, 412121, 111143, 111341, 131141, 114113, 114311, 411113, 411311, 113141, 114131, 311141, 411131, 211412, 211214, 211232, 2331112], STOP: 106 }), E.code128a = a.extend({ name: "Code 128 A", states: ["A"] }), E.code128b = a.extend({ name: "Code 128 B", states: ["B"] }), E.code128c = a.extend({ name: "Code 128 C", states: ["C"] }), E.code128 = a.extend({ name: "Code 128", states: ["C", "B", "A", "FNC4"] }), E["gs1-128"] = a.extend({ name: "Code GS1-128", states: ["FNC1", "C", "B"] }), s = A.extend({ initValue: function(e, t) { var n = this; n.pattern = [], n.value = e, n.checkSumLength = 0, n.width = t }, setBaseUnit: function() { var e = this, t = 7; e.baseUnit = e.width / (12 * (e.value.length + e.checkSumLength) + e.quietZoneLength + t) }, addData: function() { var e, t = this, n = t.value; for (t.addPattern(t.START), e = 0; n.length > e; e++) t.addCharacter(n.charAt(e)); t.options.addCheckSum && t.addCheckSum(), t.addPattern(t.STOP), t.setBaseUnit() }, addCharacter: function(e) { var t = this, n = t.characterMap[e]; n || t.invalidCharacterError(e), t.addPattern(n) }, addPattern: function(e) { for (var t = 0; e.length > t; t++) this.pattern.push(parseInt(e.charAt(t), 10)) }, addCheckSum: function() { var e, t = this, n = t.checkSums[t.checkSumType], i = n.call(t.checkSums, t.value); for (t.checksum = i.join(""), e = 0; i.length > e; e++) t.checkSumLength++, t.addPattern(t.characterMap[i[e]]) }, checkSums: { Modulo10: function(e) { var t, n, i, r = [0, ""], o = e.length % 2; for (t = 0; e.length > t; t++) r[(t + o) % 2] += parseInt(e.charAt(t), 10); for (i = r[0], n = "" + 2 * r[1], t = 0; n.length > t; t++) i += parseInt(n.charAt(t), 10); return [(10 - i % 10) % 10] }, Modulo11: function(e) { var t, n, i, r = 0, o = 11, a = e.length; for (i = 0; a > i; i++) t = ((a - i) % 6 || 6) + 1, r += t * e.charAt(i); return n = (o - r % o) % o, 10 != n ? [n] : [1, 0] }, Modulo11Modulo10: function(e) { var t, n = this.Modulo11(e); return t = e + n[0], n.concat(this.Modulo10(t)) }, Modulo10Modulo10: function(e) { var t, n = this.Modulo10(e); return t = e + n[0], n.concat(this.Modulo10(t)) } }, characterMap: ["12121212", "12121221", "12122112", "12122121", "12211212", "12211221", "12212112", "12212121", "21121212", "21121221"], START: "21", STOP: "121", checkSumType: "" }), E.msimod10 = s.extend({ name: "MSI Modulo10", checkSumType: "Modulo10" }), E.msimod11 = s.extend({ name: "MSI Modulo11", checkSumType: "Modulo11" }), E.msimod1110 = s.extend({ name: "MSI Modulo11 Modulo10", checkSumType: "Modulo11Modulo10" }), E.msimod1010 = s.extend({ name: "MSI Modulo10 Modulo10", checkSumType: "Modulo10Modulo10" }), E.code11 = A.extend({ name: "Code 11", cCheckSumTotal: 10, kCheckSumTotal: 9, kCheckSumMinLength: 10, checkSumMod: 11, DASH_VALUE: 10, DASH: "-", START: "112211", STOP: "11221", initValue: function(e, t) { var n = this; n.pattern = [], n.value = e, n.width = t, n.totalUnits = 0 }, addData: function() { var e, t = this, n = t.value; for (t.addPattern(t.START), e = 0; n.length > e; e++) t.addCharacter(n.charAt(e)); t.options.addCheckSum && t.addCheckSum(), t.addPattern(t.STOP), t.setBaseUnit() }, setBaseUnit: function() { var e = this; e.baseUnit = e.width / (e.totalUnits + e.quietZoneLength) }, addCheckSum: function() { var e, t = this, n = t.value, i = n.length, r = t.getWeightedSum(n, i, t.cCheckSumTotal) % t.checkSumMod; t.checksum = r + "", t.addPattern(t.characterMap[r]), i++, i >= t.kCheckSumMinLength && (e = (r + t.getWeightedSum(n, i, t.kCheckSumTotal)) % t.checkSumMod, t.checksum += e, t.addPattern(t.characterMap[e])) }, getWeightedSum: function(e, t, n) { var i, r = 0; for (i = 0; e.length > i; i++) r += this.weightedValue(this.getValue(e.charAt(i)), t, i, n); return r }, weightedValue: function(e, t, n, i) { var r = (t - n) % i || i; return r * e }, getValue: function(e) { var t = this; return isNaN(e) ? (e !== t.DASH && t.invalidCharacterError(e), t.DASH_VALUE) : parseInt(e, 10) }, addCharacter: function(e) { var t = this, n = t.getValue(e), i = t.characterMap[n]; t.addPattern(i) }, addPattern: function(e) { var t, n; for (n = 0; e.length > n; n++) t = parseInt(e.charAt(n), 10), this.pattern.push(t), this.totalUnits += t }, characterMap: ["111121", "211121", "121121", "221111", "112121", "212111", "122111", "111221", "211211", "211111", "112111"], options: { addCheckSum: !0 } }), E.postnet = A.extend({ name: "Postnet", START: "2", VALID_CODE_LENGTHS: [5, 9, 11], DIGIT_SEPARATOR: "-", initValue: function(e, t, n) { var i = this; i.height = n, i.width = t, i.baseHeight = n / 2, i.value = e.replace(RegExp(i.DIGIT_SEPARATOR, "g"), ""), i.pattern = [], i.validate(i.value), i.checkSum = 0, i.setBaseUnit() }, addData: function() { var e, t = this, n = t.value; for (t.addPattern(t.START), e = 0; n.length > e; e++) t.addCharacter(n.charAt(e)); t.options.addCheckSum && t.addCheckSum(), t.addPattern(t.START), t.pattern.pop() }, addCharacter: function(e) { var t = this, n = t.characterMap[e]; t.checkSum += parseInt(e, 10), t.addPattern(n) }, addCheckSum: function() { var e = this; e.checksum = (10 - e.checkSum % 10) % 10, e.addCharacter(e.checksum) }, setBaseUnit: function() { var e = this, t = 3; e.baseUnit = e.width / (10 * (e.value.length + 1) + t + e.quietZoneLength) }, validate: function(e) { var t = this; if (S.test(e) || t.invalidCharacterError(e.match(/[^0-9]/)[0]), p(e.length, t.VALID_CODE_LENGTHS) < 0) throw Error("Invalid value length. Valid lengths for the Postnet symbology are " + t.VALID_CODE_LENGTHS.join(",")) }, addPattern: function(e) { var t, n, i = this; for (n = 0; e.length > n; n++) t = i.height - i.baseHeight * e.charAt(n), i.pattern.push({ width: 1, y1: t, y2: i.height }), i.pattern.push(1) }, characterMap: ["22111", "11122", "11212", "11221", "12112", "12121", "12211", "21112", "21121", "21211"] }), E.ean13 = A.extend({ initValue: function(e, t, n) { if (e += "", 12 != e.length || /\D/.test(e)) throw Error('The value of the "EAN13" encoding should be 12 symbols'); var i = this; i.pattern = [], i.options.height = n, i.baseUnit = t / (95 + i.quietZoneLength), i.value = e, i.checksum = i.calculateChecksum(), i.leftKey = e[0], i.leftPart = e.substr(1, 6), i.rightPart = e.substr(7) + i.checksum }, addData: function() { var e = this; e.addPieces(e.characterMap.start), e.addSide(e.leftPart, e.leftKey), e.addPieces(e.characterMap.middle), e.addSide(e.rightPart), e.addPieces(e.characterMap.start) }, addSide: function(e, t) { var n, i = this; for (n = 0; e.length > n; n++) t && parseInt(i.keyTable[t].charAt(n), 10) ? i.addPieces(Array.prototype.slice.call(i.characterMap.digits[e.charAt(n)]).reverse(), !0) : i.addPieces(i.characterMap.digits[e.charAt(n)], !0) }, addPieces: function(e, t) { var n, i = this; for (n = 0; e.length > n; n++) i.pattern.push(t ? { y1: 0, y2: .95 * i.options.height, width: e[n] } : e[n]) }, calculateChecksum: function() { var e, t, n = 0, i = 0, r = this.value.split("").reverse().join(""); for (e = 0; r.length > e; e++) e % 2 ? i += parseInt(r.charAt(e), 10) : n += parseInt(r.charAt(e), 10); return t = (10 - (3 * n + i) % 10) % 10 }, keyTable: ["000000", "001011", "001101", "001110", "010011", "011001", "011100", "010101", "010110", "011010"], characterMap: { digits: [ [3, 2, 1, 1], [2, 2, 2, 1], [2, 1, 2, 2], [1, 4, 1, 1], [1, 1, 3, 2], [1, 2, 3, 1], [1, 1, 1, 4], [1, 3, 1, 2], [1, 2, 1, 3], [3, 1, 1, 2] ], start: [1, 1, 1], middle: [1, 1, 1, 1, 1] } }), E.ean8 = E.ean13.extend({ initValue: function(e, t, n) { var i = this; if (7 != e.length || /\D/.test(e)) throw Error("Invalid value provided"); i.value = e, i.options.height = n, i.checksum = i.calculateChecksum(i.value), i.leftPart = i.value.substr(0, 4), i.rightPart = i.value.substr(4) + i.checksum, i.pattern = [], i.baseUnit = t / (67 + i.quietZoneLength) } }), l = d.extend({ init: function(t, n) { var i = this; d.fn.init.call(i, t, n), i.element = e(t), i.wrapper = i.element, i.element.addClass("k-barcode").css("display", "block"), i.surfaceWrap = e("<div />").css("position", "relative").appendTo(this.element), i.surface = g.Surface.create(i.surfaceWrap, { type: i.options.renderAs }), i.setOptions(n) }, setOptions: function(e) { var t = this; if (t.type = (e.type || t.options.type).toLowerCase(), "upca" == t.type && (t.type = "ean13", e.value = "0" + e.value), "upce" == t.type && (t.type = "ean8", e.value = "0" + e.value), !E[t.type]) throw Error("Encoding " + t.type + "is not supported."); t.encoding = new E[t.type], t.options = u(!0, t.options, e), _(e.value) && t.redraw() }, redraw: function() { var e = this._getSize(); this.surfaceWrap.css({ width: e.width, height: e.height }), this.surface.clear(), this.createVisual(), this.surface.draw(this.visual) }, getSize: function() { return c.dimensions(this.element) }, _resize: function() { this.redraw() }, createVisual: function() { this.visual = this._render() }, _render: function() { var e, t, n, i = this, r = i.options, o = r.value, a = r.text, s = w.getSpacing(a.margin), l = i._getSize(), c = r.border || {}, d = i.encoding, u = b(0, 0, l.width, l.height).unpad(c.width).unpad(r.padding), h = u.height(), p = new g.Group; return i.contentBox = u, p.append(i._getBackground(l)), a.visible && (n = g.util.measureText(o, { font: a.font }).height, h -= n + s.top + s.bottom), e = d.encode(o, u.width(), h), a.visible && (t = o, r.checksum && _(d.checksum) && (t += " " + d.checksum), p.append(i._getText(t))), i.barHeight = h, this._bandsGroup = this._getBands(e.pattern, e.baseUnit), p.append(this._bandsGroup), p }, exportVisual: function() { return this._render() }, _getSize: function() { var e = this, t = e.element, n = new m.Size(k, x); return t.width() > 0 && (n.width = t.width()), t.height() > 0 && (n.height = t.height()), e.options.width && (n.width = e.options.width), e.options.height && (n.height = e.options.height), n }, value: function(e) { var n = this; return _(e) ? (n.options.value = e + "", n.redraw(), t) : n.options.value }, _getBands: function(e, t) { var n, i, r, o, a, s = this, l = s.contentBox, c = l.x1, d = new g.Group; for (r = 0; e.length > r; r++) i = f(e[r]) ? e[r] : { width: e[r], y1: 0, y2: s.barHeight }, n = i.width * t, r % 2 && (o = m.Rect.fromPoints(new m.Point(c, i.y1 + l.y1), new m.Point(c + n, i.y2 + l.y1)), a = g.Path.fromRect(o, { fill: { color: s.options.color }, stroke: null }), d.append(a)), c += n; return d }, _getBackground: function(e) { var t = this, n = t.options, i = n.border || {}, r = b(0, 0, e.width, e.height).unpad(i.width / 2), o = g.Path.fromRect(r.toRect(), { fill: { color: n.background }, stroke: { color: i.width ? i.color : "", width: i.width, dashType: i.dashType } }); return o }, _getText: function(e) { var t = this, n = t.options.text, i = t._textbox = new y(e, { font: n.font, color: n.color, align: "center", vAlign: "bottom", margin: n.margin }); return i.reflow(t.contentBox), i.renderVisual(), i.visual }, options: { name: "Barcode", renderAs: "svg", value: "", type: "code39", checksum: !1, width: 0, height: 0, color: "black", background: "white", text: { visible: !0, font: "16px Consolas, Monaco, Sans Mono, monospace, sans-serif", color: "black", margin: { top: 0, bottom: 0, left: 0, right: 0 } }, border: { width: 0, dashType: "solid", color: "black" }, padding: { top: 0, bottom: 0, left: 0, right: 0 } } }), w.ExportMixin.extend(l.fn), w.ui.plugin(l), c.deepExtend(w, { encodings: E, Encoding: A }) }(window.kendo.jQuery), function(e, t) { function n(e) { return parseInt(e, 2) } function i(e, t) { var n = (+e).toString(2); return t > n.length && (n = Array(t - n.length + 1).join(0) + n), n } function r(e, t) { for (var n = [], i = 0; e.length > i;) n.push(e.substring(i, i + t)), i += t; return n } function o(e, t, n, i) { for (var r = 0; e.length > r; r++) e[r][n][i] = t } function a(e, t, n, i) { for (var r = 0; vt.length > r; r++) e[r][n][i] = vt[r](n, i) ? 1 ^ t : parseInt(t, 10) } function s() { var e, t; for (t = 1; 255 > t; t++) e = 2 * ot[t - 1], e > 255 && (e = 285 ^ e), ot[t] = e, rt[e] = t; e = 2 * ot[t - 1] ^ 285, ot[t] = e, ot[-1] = 0 } function l() { var e, t, n, i = 68; for (e = 2; i >= e; e++) t = at[e - 1], n = [e, 0], at[e] = b(t, n) } function c(e, n) { var i = [], r = e.length - 1; do i[r] = ot[(e[r] + n) % 255], r--; while (e[r] !== t); return i } function d(e, t) { return parseInt(e.charAt(t), 10) } function u(e, t, n, i, r) { t[e][i] = (t[e][i] << 1 ^ r) % 128, t[e][i] == mt && (n[e] += 40) } function h(e, t, n, i, r, o) { n[e][o] == i ? r[e][o]++ : (n[e][o] = i, r[e][o] >= 5 && (t[e] += 3 + r[e][o] - 5), r[e][o] = 1) } function p(e, t) { var n = Math.floor(e / t * 100), i = n % 5, r = Math.abs(n - i - 50), o = Math.abs(n + 5 - i - 50), a = 10 * Math.min(r / 5, o / 5); return a } var f, g, m, v, _, w, b, y, k, x, C, S, T, D, A, E, I, P, M, z, F, R, H, B, L, N, O, V, U, W, j, G, q, $, Y = window.kendo, Q = e.extend, K = Y.drawing, X = Y.dataviz, Z = Y.ui.Widget, J = X.Box2D, et = "0000", tt = "numeric", nt = "alphanumeric", it = "byte", rt = { 1: 0 }, ot = { 0: 1 }, at = [ [1, 0], [1, 25, 0] ], st = { 15: 20, 16: 20, 18: 24, 19: 24, 22: 20, 24: 22, 26: 24, 28: 20, 30: 20, 31: 24, 32: 28, 33: 24, 36: 18, 37: 22, 39: 20, 40: 24 }, lt = [{ L: { groups: [ [1, 19] ], totalDataCodewords: 19, errorCodewordsPerBlock: 7 }, M: { groups: [ [1, 16] ], totalDataCodewords: 16, errorCodewordsPerBlock: 10 }, Q: { groups: [ [1, 13] ], totalDataCodewords: 13, errorCodewordsPerBlock: 13 }, H: { groups: [ [1, 9] ], totalDataCodewords: 9, errorCodewordsPerBlock: 17 } }, { L: { groups: [ [1, 34] ], totalDataCodewords: 34, errorCodewordsPerBlock: 10 }, M: { groups: [ [1, 28] ], totalDataCodewords: 28, errorCodewordsPerBlock: 16 }, Q: { groups: [ [1, 22] ], totalDataCodewords: 22, errorCodewordsPerBlock: 22 }, H: { groups: [ [1, 16] ], totalDataCodewords: 16, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [1, 55] ], totalDataCodewords: 55, errorCodewordsPerBlock: 15 }, M: { groups: [ [1, 44] ], totalDataCodewords: 44, errorCodewordsPerBlock: 26 }, Q: { groups: [ [2, 17] ], totalDataCodewords: 34, errorCodewordsPerBlock: 18 }, H: { groups: [ [2, 13] ], totalDataCodewords: 26, errorCodewordsPerBlock: 22 } }, { L: { groups: [ [1, 80] ], totalDataCodewords: 80, errorCodewordsPerBlock: 20 }, M: { groups: [ [2, 32] ], totalDataCodewords: 64, errorCodewordsPerBlock: 18 }, Q: { groups: [ [2, 24] ], totalDataCodewords: 48, errorCodewordsPerBlock: 26 }, H: { groups: [ [4, 9] ], totalDataCodewords: 36, errorCodewordsPerBlock: 16 } }, { L: { groups: [ [1, 108] ], totalDataCodewords: 108, errorCodewordsPerBlock: 26 }, M: { groups: [ [2, 43] ], totalDataCodewords: 86, errorCodewordsPerBlock: 24 }, Q: { groups: [ [2, 15], [2, 16] ], totalDataCodewords: 62, errorCodewordsPerBlock: 18 }, H: { groups: [ [2, 11], [2, 12] ], totalDataCodewords: 46, errorCodewordsPerBlock: 22 } }, { L: { groups: [ [2, 68] ], totalDataCodewords: 136, errorCodewordsPerBlock: 18 }, M: { groups: [ [4, 27] ], totalDataCodewords: 108, errorCodewordsPerBlock: 16 }, Q: { groups: [ [4, 19] ], totalDataCodewords: 76, errorCodewordsPerBlock: 24 }, H: { groups: [ [4, 15] ], totalDataCodewords: 60, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [2, 78] ], totalDataCodewords: 156, errorCodewordsPerBlock: 20 }, M: { groups: [ [4, 31] ], totalDataCodewords: 124, errorCodewordsPerBlock: 18 }, Q: { groups: [ [2, 14], [4, 15] ], totalDataCodewords: 88, errorCodewordsPerBlock: 18 }, H: { groups: [ [4, 13], [1, 14] ], totalDataCodewords: 66, errorCodewordsPerBlock: 26 } }, { L: { groups: [ [2, 97] ], totalDataCodewords: 194, errorCodewordsPerBlock: 24 }, M: { groups: [ [2, 38], [2, 39] ], totalDataCodewords: 154, errorCodewordsPerBlock: 22 }, Q: { groups: [ [4, 18], [2, 19] ], totalDataCodewords: 110, errorCodewordsPerBlock: 22 }, H: { groups: [ [4, 14], [2, 15] ], totalDataCodewords: 86, errorCodewordsPerBlock: 26 } }, { L: { groups: [ [2, 116] ], totalDataCodewords: 232, errorCodewordsPerBlock: 30 }, M: { groups: [ [3, 36], [2, 37] ], totalDataCodewords: 182, errorCodewordsPerBlock: 22 }, Q: { groups: [ [4, 16], [4, 17] ], totalDataCodewords: 132, errorCodewordsPerBlock: 20 }, H: { groups: [ [4, 12], [4, 13] ], totalDataCodewords: 100, errorCodewordsPerBlock: 24 } }, { L: { groups: [ [2, 68], [2, 69] ], totalDataCodewords: 274, errorCodewordsPerBlock: 18 }, M: { groups: [ [4, 43], [1, 44] ], totalDataCodewords: 216, errorCodewordsPerBlock: 26 }, Q: { groups: [ [6, 19], [2, 20] ], totalDataCodewords: 154, errorCodewordsPerBlock: 24 }, H: { groups: [ [6, 15], [2, 16] ], totalDataCodewords: 122, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [4, 81] ], totalDataCodewords: 324, errorCodewordsPerBlock: 20 }, M: { groups: [ [1, 50], [4, 51] ], totalDataCodewords: 254, errorCodewordsPerBlock: 30 }, Q: { groups: [ [4, 22], [4, 23] ], totalDataCodewords: 180, errorCodewordsPerBlock: 28 }, H: { groups: [ [3, 12], [8, 13] ], totalDataCodewords: 140, errorCodewordsPerBlock: 24 } }, { L: { groups: [ [2, 92], [2, 93] ], totalDataCodewords: 370, errorCodewordsPerBlock: 24 }, M: { groups: [ [6, 36], [2, 37] ], totalDataCodewords: 290, errorCodewordsPerBlock: 22 }, Q: { groups: [ [4, 20], [6, 21] ], totalDataCodewords: 206, errorCodewordsPerBlock: 26 }, H: { groups: [ [7, 14], [4, 15] ], totalDataCodewords: 158, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [4, 107] ], totalDataCodewords: 428, errorCodewordsPerBlock: 26 }, M: { groups: [ [8, 37], [1, 38] ], totalDataCodewords: 334, errorCodewordsPerBlock: 22 }, Q: { groups: [ [8, 20], [4, 21] ], totalDataCodewords: 244, errorCodewordsPerBlock: 24 }, H: { groups: [ [12, 11], [4, 12] ], totalDataCodewords: 180, errorCodewordsPerBlock: 22 } }, { L: { groups: [ [3, 115], [1, 116] ], totalDataCodewords: 461, errorCodewordsPerBlock: 30 }, M: { groups: [ [4, 40], [5, 41] ], totalDataCodewords: 365, errorCodewordsPerBlock: 24 }, Q: { groups: [ [11, 16], [5, 17] ], totalDataCodewords: 261, errorCodewordsPerBlock: 20 }, H: { groups: [ [11, 12], [5, 13] ], totalDataCodewords: 197, errorCodewordsPerBlock: 24 } }, { L: { groups: [ [5, 87], [1, 88] ], totalDataCodewords: 523, errorCodewordsPerBlock: 22 }, M: { groups: [ [5, 41], [5, 42] ], totalDataCodewords: 415, errorCodewordsPerBlock: 24 }, Q: { groups: [ [5, 24], [7, 25] ], totalDataCodewords: 295, errorCodewordsPerBlock: 30 }, H: { groups: [ [11, 12], [7, 13] ], totalDataCodewords: 223, errorCodewordsPerBlock: 24 } }, { L: { groups: [ [5, 98], [1, 99] ], totalDataCodewords: 589, errorCodewordsPerBlock: 24 }, M: { groups: [ [7, 45], [3, 46] ], totalDataCodewords: 453, errorCodewordsPerBlock: 28 }, Q: { groups: [ [15, 19], [2, 20] ], totalDataCodewords: 325, errorCodewordsPerBlock: 24 }, H: { groups: [ [3, 15], [13, 16] ], totalDataCodewords: 253, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [1, 107], [5, 108] ], totalDataCodewords: 647, errorCodewordsPerBlock: 28 }, M: { groups: [ [10, 46], [1, 47] ], totalDataCodewords: 507, errorCodewordsPerBlock: 28 }, Q: { groups: [ [1, 22], [15, 23] ], totalDataCodewords: 367, errorCodewordsPerBlock: 28 }, H: { groups: [ [2, 14], [17, 15] ], totalDataCodewords: 283, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [5, 120], [1, 121] ], totalDataCodewords: 721, errorCodewordsPerBlock: 30 }, M: { groups: [ [9, 43], [4, 44] ], totalDataCodewords: 563, errorCodewordsPerBlock: 26 }, Q: { groups: [ [17, 22], [1, 23] ], totalDataCodewords: 397, errorCodewordsPerBlock: 28 }, H: { groups: [ [2, 14], [19, 15] ], totalDataCodewords: 313, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [3, 113], [4, 114] ], totalDataCodewords: 795, errorCodewordsPerBlock: 28 }, M: { groups: [ [3, 44], [11, 45] ], totalDataCodewords: 627, errorCodewordsPerBlock: 26 }, Q: { groups: [ [17, 21], [4, 22] ], totalDataCodewords: 445, errorCodewordsPerBlock: 26 }, H: { groups: [ [9, 13], [16, 14] ], totalDataCodewords: 341, errorCodewordsPerBlock: 26 } }, { L: { groups: [ [3, 107], [5, 108] ], totalDataCodewords: 861, errorCodewordsPerBlock: 28 }, M: { groups: [ [3, 41], [13, 42] ], totalDataCodewords: 669, errorCodewordsPerBlock: 26 }, Q: { groups: [ [15, 24], [5, 25] ], totalDataCodewords: 485, errorCodewordsPerBlock: 30 }, H: { groups: [ [15, 15], [10, 16] ], totalDataCodewords: 385, errorCodewordsPerBlock: 28 } }, { L: { groups: [ [4, 116], [4, 117] ], totalDataCodewords: 932, errorCodewordsPerBlock: 28 }, M: { groups: [ [17, 42] ], totalDataCodewords: 714, errorCodewordsPerBlock: 26 }, Q: { groups: [ [17, 22], [6, 23] ], totalDataCodewords: 512, errorCodewordsPerBlock: 28 }, H: { groups: [ [19, 16], [6, 17] ], totalDataCodewords: 406, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [2, 111], [7, 112] ], totalDataCodewords: 1006, errorCodewordsPerBlock: 28 }, M: { groups: [ [17, 46] ], totalDataCodewords: 782, errorCodewordsPerBlock: 28 }, Q: { groups: [ [7, 24], [16, 25] ], totalDataCodewords: 568, errorCodewordsPerBlock: 30 }, H: { groups: [ [34, 13] ], totalDataCodewords: 442, errorCodewordsPerBlock: 24 } }, { L: { groups: [ [4, 121], [5, 122] ], totalDataCodewords: 1094, errorCodewordsPerBlock: 30 }, M: { groups: [ [4, 47], [14, 48] ], totalDataCodewords: 860, errorCodewordsPerBlock: 28 }, Q: { groups: [ [11, 24], [14, 25] ], totalDataCodewords: 614, errorCodewordsPerBlock: 30 }, H: { groups: [ [16, 15], [14, 16] ], totalDataCodewords: 464, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [6, 117], [4, 118] ], totalDataCodewords: 1174, errorCodewordsPerBlock: 30 }, M: { groups: [ [6, 45], [14, 46] ], totalDataCodewords: 914, errorCodewordsPerBlock: 28 }, Q: { groups: [ [11, 24], [16, 25] ], totalDataCodewords: 664, errorCodewordsPerBlock: 30 }, H: { groups: [ [30, 16], [2, 17] ], totalDataCodewords: 514, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [8, 106], [4, 107] ], totalDataCodewords: 1276, errorCodewordsPerBlock: 26 }, M: { groups: [ [8, 47], [13, 48] ], totalDataCodewords: 1e3, errorCodewordsPerBlock: 28 }, Q: { groups: [ [7, 24], [22, 25] ], totalDataCodewords: 718, errorCodewordsPerBlock: 30 }, H: { groups: [ [22, 15], [13, 16] ], totalDataCodewords: 538, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [10, 114], [2, 115] ], totalDataCodewords: 1370, errorCodewordsPerBlock: 28 }, M: { groups: [ [19, 46], [4, 47] ], totalDataCodewords: 1062, errorCodewordsPerBlock: 28 }, Q: { groups: [ [28, 22], [6, 23] ], totalDataCodewords: 754, errorCodewordsPerBlock: 28 }, H: { groups: [ [33, 16], [4, 17] ], totalDataCodewords: 596, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [8, 122], [4, 123] ], totalDataCodewords: 1468, errorCodewordsPerBlock: 30 }, M: { groups: [ [22, 45], [3, 46] ], totalDataCodewords: 1128, errorCodewordsPerBlock: 28 }, Q: { groups: [ [8, 23], [26, 24] ], totalDataCodewords: 808, errorCodewordsPerBlock: 30 }, H: { groups: [ [12, 15], [28, 16] ], totalDataCodewords: 628, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [3, 117], [10, 118] ], totalDataCodewords: 1531, errorCodewordsPerBlock: 30 }, M: { groups: [ [3, 45], [23, 46] ], totalDataCodewords: 1193, errorCodewordsPerBlock: 28 }, Q: { groups: [ [4, 24], [31, 25] ], totalDataCodewords: 871, errorCodewordsPerBlock: 30 }, H: { groups: [ [11, 15], [31, 16] ], totalDataCodewords: 661, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [7, 116], [7, 117] ], totalDataCodewords: 1631, errorCodewordsPerBlock: 30 }, M: { groups: [ [21, 45], [7, 46] ], totalDataCodewords: 1267, errorCodewordsPerBlock: 28 }, Q: { groups: [ [1, 23], [37, 24] ], totalDataCodewords: 911, errorCodewordsPerBlock: 30 }, H: { groups: [ [19, 15], [26, 16] ], totalDataCodewords: 701, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [5, 115], [10, 116] ], totalDataCodewords: 1735, errorCodewordsPerBlock: 30 }, M: { groups: [ [19, 47], [10, 48] ], totalDataCodewords: 1373, errorCodewordsPerBlock: 28 }, Q: { groups: [ [15, 24], [25, 25] ], totalDataCodewords: 985, errorCodewordsPerBlock: 30 }, H: { groups: [ [23, 15], [25, 16] ], totalDataCodewords: 745, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [13, 115], [3, 116] ], totalDataCodewords: 1843, errorCodewordsPerBlock: 30 }, M: { groups: [ [2, 46], [29, 47] ], totalDataCodewords: 1455, errorCodewordsPerBlock: 28 }, Q: { groups: [ [42, 24], [1, 25] ], totalDataCodewords: 1033, errorCodewordsPerBlock: 30 }, H: { groups: [ [23, 15], [28, 16] ], totalDataCodewords: 793, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [17, 115] ], totalDataCodewords: 1955, errorCodewordsPerBlock: 30 }, M: { groups: [ [10, 46], [23, 47] ], totalDataCodewords: 1541, errorCodewordsPerBlock: 28 }, Q: { groups: [ [10, 24], [35, 25] ], totalDataCodewords: 1115, errorCodewordsPerBlock: 30 }, H: { groups: [ [19, 15], [35, 16] ], totalDataCodewords: 845, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [17, 115], [1, 116] ], totalDataCodewords: 2071, errorCodewordsPerBlock: 30 }, M: { groups: [ [14, 46], [21, 47] ], totalDataCodewords: 1631, errorCodewordsPerBlock: 28 }, Q: { groups: [ [29, 24], [19, 25] ], totalDataCodewords: 1171, errorCodewordsPerBlock: 30 }, H: { groups: [ [11, 15], [46, 16] ], totalDataCodewords: 901, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [13, 115], [6, 116] ], totalDataCodewords: 2191, errorCodewordsPerBlock: 30 }, M: { groups: [ [14, 46], [23, 47] ], totalDataCodewords: 1725, errorCodewordsPerBlock: 28 }, Q: { groups: [ [44, 24], [7, 25] ], totalDataCodewords: 1231, errorCodewordsPerBlock: 30 }, H: { groups: [ [59, 16], [1, 17] ], totalDataCodewords: 961, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [12, 121], [7, 122] ], totalDataCodewords: 2306, errorCodewordsPerBlock: 30 }, M: { groups: [ [12, 47], [26, 48] ], totalDataCodewords: 1812, errorCodewordsPerBlock: 28 }, Q: { groups: [ [39, 24], [14, 25] ], totalDataCodewords: 1286, errorCodewordsPerBlock: 30 }, H: { groups: [ [22, 15], [41, 16] ], totalDataCodewords: 986, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [6, 121], [14, 122] ], totalDataCodewords: 2434, errorCodewordsPerBlock: 30 }, M: { groups: [ [6, 47], [34, 48] ], totalDataCodewords: 1914, errorCodewordsPerBlock: 28 }, Q: { groups: [ [46, 24], [10, 25] ], totalDataCodewords: 1354, errorCodewordsPerBlock: 30 }, H: { groups: [ [2, 15], [64, 16] ], totalDataCodewords: 1054, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [17, 122], [4, 123] ], totalDataCodewords: 2566, errorCodewordsPerBlock: 30 }, M: { groups: [ [29, 46], [14, 47] ], totalDataCodewords: 1992, errorCodewordsPerBlock: 28 }, Q: { groups: [ [49, 24], [10, 25] ], totalDataCodewords: 1426, errorCodewordsPerBlock: 30 }, H: { groups: [ [24, 15], [46, 16] ], totalDataCodewords: 1096, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [4, 122], [18, 123] ], totalDataCodewords: 2702, errorCodewordsPerBlock: 30 }, M: { groups: [ [13, 46], [32, 47] ], totalDataCodewords: 2102, errorCodewordsPerBlock: 28 }, Q: { groups: [ [48, 24], [14, 25] ], totalDataCodewords: 1502, errorCodewordsPerBlock: 30 }, H: { groups: [ [42, 15], [32, 16] ], totalDataCodewords: 1142, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [20, 117], [4, 118] ], totalDataCodewords: 2812, errorCodewordsPerBlock: 30 }, M: { groups: [ [40, 47], [7, 48] ], totalDataCodewords: 2216, errorCodewordsPerBlock: 28 }, Q: { groups: [ [43, 24], [22, 25] ], totalDataCodewords: 1582, errorCodewordsPerBlock: 30 }, H: { groups: [ [10, 15], [67, 16] ], totalDataCodewords: 1222, errorCodewordsPerBlock: 30 } }, { L: { groups: [ [19, 118], [6, 119] ], totalDataCodewords: 2956, errorCodewordsPerBlock: 30 }, M: { groups: [ [18, 47], [31, 48] ], totalDataCodewords: 2334, errorCodewordsPerBlock: 28 }, Q: { groups: [ [34, 24], [34, 25] ], totalDataCodewords: 1666, errorCodewordsPerBlock: 30 }, H: { groups: [ [20, 15], [61, 16] ], totalDataCodewords: 1276, errorCodewordsPerBlock: 30 } }], ct = [1, 0, 1, 1, 1], dt = [1, 0, 1], ut = { L: "01", M: "00", Q: "11", H: "10" }, ht = "101010000010010", pt = "10100110111", ft = "1111100100101", gt = ["11101100", "00010001"], mt = 93, vt = [ function(e, t) { return (e + t) % 2 === 0 }, function(e) { return e % 2 === 0 }, function(e, t) { return t % 3 === 0 }, function(e, t) { return (e + t) % 3 === 0 }, function(e, t) { return (Math.floor(e / 2) + Math.floor(t / 3)) % 2 === 0 }, function(e, t) { return e * t % 2 + e * t % 3 === 0 }, function(e, t) { return (e * t % 2 + e * t % 3) % 2 === 0 }, function(e, t) { return ((e + t) % 2 + e * t % 3) % 2 === 0 } ], _t = /^\d+/, wt = "A-Z0-9 $%*+./:-", bt = "A-Z $%*+./:-", yt = RegExp("^[" + bt + "]+"), kt = RegExp("^[" + wt + "]+"), xt = RegExp("^[^" + wt + "]+"), Ct = 8, St = 5, Tt = 8, Dt = 17, At = 9, Et = 16, It = Math.round, Pt = Y.Class.extend({ getVersionIndex: function(e) { return 10 > e ? 0 : e > 26 ? 2 : 1 }, getBitsCharacterCount: function(e) { var t = this; return t.bitsInCharacterCount[t.getVersionIndex(e || 40)] }, getModeCountString: function(e, t) { var n = this; return n.modeIndicator + i(e, n.getBitsCharacterCount(t)) }, encode: function() {}, getStringBitsLength: function() {}, getValue: function() {}, modeIndicator: "", bitsInCharacterCount: [] }), Mt = {}; Mt[tt] = Pt.extend({ bitsInCharacterCount: [10, 12, 14], modeIndicator: "0001", getValue: function(e) { return parseInt(e, 10) }, encode: function(e, t) { var n, o = this, a = r(e, 3), s = o.getModeCountString(e.length, t); for (n = 0; a.length - 1 > n; n++) s += i(a[n], 10); return s + i(a[n], 1 + 3 * a[n].length) }, getStringBitsLength: function(e, t) { var n = e % 3; return 4 + this.getBitsCharacterCount(t) + 10 * Math.floor(e / 3) + 3 * n + (0 === n ? 0 : 1) } }), Mt[nt] = Pt.extend({ characters: { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, G: 16, H: 17, I: 18, J: 19, K: 20, L: 21, M: 22, N: 23, O: 24, P: 25, Q: 26, R: 27, S: 28, T: 29, U: 30, V: 31, W: 32, X: 33, Y: 34, Z: 35, " ": 36, $: 37, "%": 38, "*": 39, "+": 40, "-": 41, ".": 42, "/": 43, ":": 44 }, bitsInCharacterCount: [9, 11, 13], modeIndicator: "0010", getValue: function(e) { return this.characters[e] }, encode: function(e, t) { var n, o, a = this, s = r(e, 2), l = a.getModeCountString(e.length, t); for (o = 0; s.length - 1 > o; o++) n = 45 * a.getValue(s[o].charAt(0)) + a.getValue(s[o].charAt(1)), l += i(n, 11); return n = 2 == s[o].length ? 45 * a.getValue(s[o].charAt(0)) + a.getValue(s[o].charAt(1)) : a.getValue(s[o].charAt(0)), l + i(n, 1 + 5 * s[o].length) }, getStringBitsLength: function(e, t) { return 4 + this.getBitsCharacterCount(t) + 11 * Math.floor(e / 2) + 6 * (e % 2) } }), Mt[it] = Pt.extend({ bitsInCharacterCount: [8, 16, 16], modeIndicator: "0100", getValue: function(e) { var t = e.charCodeAt(0); if (127 >= t || t >= 160 && 255 >= t) return t; throw Error("Unsupported character: " + e) }, encode: function(e, t) { var n, r = this, o = r.getModeCountString(e.length, t); for (n = 0; e.length > n; n++) o += i(r.getValue(e.charAt(n)), 8); return o }, getStringBitsLength: function(e, t) { return 4 + this.getBitsCharacterCount(t) + 8 * e } }), f = {}; for (g in Mt) f[g] = new Mt[g]; m = function(e) { var n = this, i = e.length - 1, r = e.length - 1, o = r, a = -1, s = 0; n.move = function() { i += a * s, s ^= 1, r = o - s }, n.getNextCell = function() { for (; e[i][r] !== t;) n.move(), (0 > i || i >= e.length) && (a = -a, o -= 8 != o ? 2 : 3, r = o, i = 0 > a ? e.length - 1 : 0); return { row: i, column: r } }, n.getNextRemainderCell = function() { return n.move(), e[i][r] === t ? { row: i, column: r } : t } }, v = function(e, t) { var n, i, r, o, s, l, c = new m(e[0]); for (o = 0; t.length > o; o++) for (n = t[o], i = 0; n.length > 0;) { for (s = 0; n.length > s; s++) for (l = 0; 8 > l; l++) r = c.getNextCell(), a(e, n[s][i].charAt(l), r.row, r.column); for (i++; n[0] && i == n[0].length;) n.splice(0, 1) } for (; r = c.getNextRemainderCell();) a(e, 0, r.row, r.column) }, _ = function(e, t) { for (var n = 8 * t, i = 0, r = 0; n > e.length && et.length > i;) e += et.charAt(i++); for (e.length % 8 !== 0 && (e += Array(9 - e.length % 8).join("0")); n > e.length;) e += gt[r], r ^= 1; return e }, w = function(e, t) { var n, i = [], r = e.length - 2; for (n = r; n >= 0; n--) i[n] = e[n] ^ t[n]; return i }, b = function(e, n) { var i, r, o = []; for (i = 0; e.length > i; i++) for (r = 0; n.length > r; r++) o[i + r] = o[i + r] === t ? (e[i] + (n[r] >= 0 ? n[r] : 0)) % 255 : rt[ot[o[i + r]] ^ ot[(e[i] + n[r]) % 255]]; return o }, s(), l(), y = function(e, t) { var n, r, o = at[t - 1], a = Array(t).concat(e), s = Array(a.length - o.length).concat(o), l = e.length, d = []; for (r = 0; l > r; r++) n = c(s, rt[a[a.length - 1]]), s.splice(0, 1), a = w(n, a); for (r = a.length - 1; r >= 0; r--) d[t - 1 - r] = i(a[r], 8); return d }, k = function(e, t) { var i, r, o, a, s, l, c, d, u = 0, h = [], p = [], f = t.groups; for (l = 0; f.length > l; l++) for (o = f[l][0], c = 0; o > c; c++) { for (r = f[l][1], i = [], a = [], d = 1; r >= d; d++) s = e.substring(u, u + 8), i.push(s), a[r - d] = n(s), u += 8; h.push(i), p.push(y(a, t.errorCodewordsPerBlock)) } return [h, p] }, x = function(e, t, n, i, r) { var o, a, s = _t.exec(e), l = s ? s[0] : "", c = yt.exec(e), d = c ? c[0] : "", u = kt.exec(e), h = u ? u[0] : ""; return l && (l.length >= t || e.length == l.length || l.length >= n && !kt.test(e.charAt(l.length))) ? (o = tt, a = l) : h && (e.length == h.length || h.length >= i || r == nt) ? (o = nt, a = l || d) : (o = it, a = h ? h + xt.exec(e.substring(h.length))[0] : xt.exec(e)[0]), { mode: o, modeString: a } }, C = function(e) { var t, n, i = [], r = 0; for (i.push(x(e, Ct, St, Tt, t)), t = i[0].mode, e = e.substr(i[0].modeString.length); e.length > 0;) n = x(e, Dt, At, Et, t), n.mode != t ? (t = n.mode, i.push(n), r++) : i[r].modeString += n.modeString, e = e.substr(n.modeString.length); return i }, S = function(e) { var t, n, i = 0; for (n = 0; e.length > n; n++) t = f[e[n].mode], i += t.getStringBitsLength(e[n].modeString.length); return Math.ceil(i / 8) }, T = function(e, t) { var n = 0, i = lt.length - 1, r = Math.floor(lt.length / 2); do lt[r][t].totalDataCodewords > e ? i = r : n = r, r = n + Math.floor((i - n) / 2); while (i - n > 1); return lt[n][t].totalDataCodewords >= e ? r + 1 : i + 1 }, D = function(e, t) { var n, i, r = ""; for (i = 0; e.length > i; i++) n = f[e[i].mode], r += n.encode(e[i].modeString, t); return r }, A = function(e) { var t, i, r = n(e), o = ""; if (0 === r) return "101010000010010"; for (t = E(n(e), pt, 15), i = 0; t.length > i; i++) o += t.charAt(i) ^ ht.charAt(i); return o }, E = function(e, t, r) { var o = n(t), a = t.length - 1, s = e << a, l = r - a, c = i(e, l), d = I(s, o); return d = c + i(d, a) }, I = function(e, t) { var n = t.toString(2).length, i = e.toString(2).length; do e ^= t << i - n, i = e.toString(2).length; while (i >= n); return e }, P = function(e) { var t, n, i = [], r = 17 + 4 * e; for (t = 0; vt.length > t; t++) for (i[t] = Array(r), n = 0; r > n; n++) i[t][n] = Array(r); return i }, M = function(e, t) { var n, i, r = e[0], a = 0, s = t.length; for (n = 0, i = 8; 8 >= n; n++) 6 !== n && o(e, d(t, s - 1 - a++), n, i); for (n = 8, i = 7; i >= 0; i--) 6 !== i && o(e, d(t, s - 1 - a++), n, i); for (a = 0, i = r.length - 1, n = 8; i >= r.length - 8; i--) o(e, d(t, s - 1 - a++), n, i); for (o(e, 1, r.length - 8, 8), n = r.length - 7, i = 8; r.length > n; n++) o(e, d(t, s - 1 - a++), n, i) }, z = function(e) { return E(e, ft, 18) }, F = function(e, t) { var n, i, r, a, s = e[0], l = s.length, c = 0, u = l - 11, h = l - 11, p = 0; for (a = 0; t.length > a; a++) n = Math.floor(a / 3), i = a % 3, r = d(t, t.length - a - 1), o(e, r, c + n, u + i), o(e, r, h + i, p + n) }, R = function(e, t, n, i) { var r, a, s, l = t.length + 2, c = t.length + 1; for (a = 0; t.length > a; a++) for (s = a; l - a > s; s++) r = t[a], o(e, r, n + s, i + a), o(e, r, n + a, i + s), o(e, r, n + c - s, i + c - a), o(e, r, n + c - a, i + c - s) }, H = function(e, t, n, i) { var r = n, a = i, s = e[0]; do o(e, 0, r, i), o(e, 0, n, a), r += t[0], a += t[1]; while (r >= 0 && s.length > r) }, B = function(e) { var t = e[0].length; R(e, ct, 0, 0), H(e, [-1, -1], 7, 7), R(e, ct, t - 7, 0), H(e, [1, -1], t - 8, 7), R(e, ct, 0, t - 7), H(e, [-1, 1], 7, t - 8) }, L = function(e, n) { var i, r, o, a, s, l, c, d, u; if (!(2 > n)) { for (i = e[0], r = i.length, o = Math.floor(n / 7), a = [6], c = 0, (s = st[n]) ? l = (r - 13 - s) / o : s = l = (r - 13) / (o + 1), a.push(a[c++] + s); r > a[c] + l;) a.push(a[c++] + l); for (d = 0; a.length > d; d++) for (u = 0; a.length > u; u++) i[a[d]][a[u]] === t && R(e, dt, a[d] - 2, a[u] - 2) } }, N = function(e) { var t, n = 6, i = 6, r = 1, a = e[0].length; for (t = 8; a - 8 > t; t++) o(e, r, n, t), o(e, r, t, i), r ^= 1 }, O = function(e) { var t, n, i, r, o, a, s, l = [], c = [], d = [], f = [], g = [], m = 0, v = 1, _ = e[0].length; for (n = 0; e.length > n; n++) l[n] = 0, d[n] = 0, g[n] = [0, 0], f[n] = [0, 0], c[n] = []; for (n = 0; _ > n; n++) for (i = 0; _ > i; i++) for (r = 0; e.length > r; r++) t = e[r], d[r] += parseInt(t[n][i], 10), c[r][m] === t[n][i] && _ > n + 1 && i - 1 >= 0 && t[n + 1][i] == c[r][m] && t[n + 1][i - 1] == c[r][m] && (l[r] += 3), u(r, f, l, m, t[n][i]), u(r, f, l, v, t[i][n]), h(r, l, c, t[n][i], g, m), h(r, l, c, t[i][n], g, v); for (o = _ * _, s = Number.MAX_VALUE, n = 0; l.length > n; n++) l[n] += p(d[n], o), s > l[n] && (s = l[n], a = n); return a }, V = function(e, t) { this.dataString = e, this.version = t }, U = function() { this.getEncodingResult = function(e, t) { var n = C(e), i = S(n), r = T(i, t), o = D(n, r); return new V(o, r) } }, W = function() { this.mode = f[this.encodingMode] }, W.fn = W.prototype = { encodingMode: it, utfBOM: "111011111011101110111111", initialModeCountStringLength: 20, getEncodingResult: function(e, t) { var n = this, i = n.encode(e), r = n.getDataCodewordsCount(i), o = T(r, t), a = n.mode.getModeCountString(i.length / 8, o) + i; return new V(a, o) }, getDataCodewordsCount: function(e) { var t = this, n = e.length, i = Math.ceil((t.initialModeCountStringLength + n) / 8); return i }, encode: function(e) { var t, n = this, i = n.utfBOM; for (t = 0; e.length > t; t++) i += n.encodeCharacter(e.charCodeAt(t)); return i }, encodeCharacter: function(e) { var t, n, r = this.getBytesCount(e), o = r - 1, a = ""; if (1 == r) a = i(e, 8); else { for (t = 8 - r, n = 0; o > n; n++) a = i(e >> 6 * n & 63 | 128, 8) + a; a = (e >> 6 * o | 255 >> t << t).toString(2) + a } return a }, getBytesCount: function(e) { var t, n = this.ranges; for (t = 0; n.length > t; t++) if (n[t] > e) return t + 1 }, ranges: [128, 2048, 65536, 2097152, 67108864] }, j = function(e) { return e && e.toLowerCase().indexOf("utf_8") >= 0 ? new W : new U }, G = function(e, t, n) { var r, o, a, s = new j(n), l = s.getEncodingResult(e, t), c = l.version, d = lt[c - 1][t], u = _(l.dataString, d.totalDataCodewords), h = k(u, d), p = P(c); return B(p), L(p, c), N(p), c >= 7 && F(p, i(0, 18)), M(p, i(0, 15)), v(p, h), r = O(p), o = p[r], c >= 7 && F([o], z(c)), a = ut[t] + i(r, 3), M([o], A(a)), o }, q = { DEFAULT_SIZE: 200, QUIET_ZONE_LENGTH: 4, DEFAULT_ERROR_CORRECTION_LEVEL: "L", DEFAULT_BACKGROUND: "#fff", DEFAULT_DARK_MODULE_COLOR: "#000", MIN_BASE_UNIT_SIZE: 1 }, $ = Z.extend({ init: function(t, n) { var i = this; Z.fn.init.call(i, t, n), i.element = e(t), i.wrapper = i.element, i.element.addClass("k-qrcode"), i.surfaceWrap = e("<div />").css("position", "relative").appendTo(this.element), i.surface = K.Surface.create(i.surfaceWrap, { type: i.options.renderAs }), i.setOptions(n) }, redraw: function() { var e = this._getSize(); this.surfaceWrap.css({ width: e, height: e }), this.surface.clear(), this.createVisual(), this.surface.draw(this.visual) }, getSize: function() { return Y.dimensions(this.element) }, _resize: function() { this.redraw() }, createVisual: function() { this.visual = this._render() }, exportVisual: function() { return this._render() }, _render: function() { var e, t, n, i, r, o, a, s = this, l = s._value, c = s.options.border || {}, d = s.options.padding || 0, u = c.width || 0; return c.width = u, a = new K.Group, l && (n = G(l, s.options.errorCorrection, s.options.encoding), i = s._getSize(), o = i - 2 * (u + d), e = s._calculateBaseUnit(o, n.length), r = n.length * e, t = u + d + (o - r) / 2, a.append(s._renderBackground(i, c)), a.append(s._renderMatrix(n, e, t))), a }, _getSize: function() { var e, t, n, i = this; return i.options.size ? e = parseInt(i.options.size, 10) : (t = i.element, n = Math.min(t.width(), t.height()), e = n > 0 ? n : q.DEFAULT_SIZE), e }, _calculateBaseUnit: function(e, t) { var n = Math.floor(e / t); if (q.MIN_BASE_UNIT_SIZE > n) throw Error("Insufficient size."); return n * t >= e && n - 1 >= q.MIN_BASE_UNIT_SIZE && n--, n }, _renderMatrix: function(e, t, n) { var i, r, o, a, s, l, c, d, u = new K.MultiPath({ fill: { color: this.options.color }, stroke: null }); for (i = 0; e.length > i; i++) for (r = n + i * t, o = 0; e.length > o;) { for (; 0 === e[i][o] && e.length > o;) o++; if (e.length > o) { for (a = o; 1 == e[i][o];) o++; s = It(n + a * t), l = It(r), c = It(n + o * t), d = It(r + t), u.moveTo(s, l).lineTo(s, d).lineTo(c, d).lineTo(c, l).close() } } return u }, _renderBackground: function(e, t) { var n = J(0, 0, e, e).unpad(t.width / 2); return K.Path.fromRect(n.toRect(), { fill: { color: this.options.background }, stroke: { color: t.color, width: t.width } }) }, setOptions: function(e) { var n = this; e = e || {}, n.options = Q(n.options, e), e.value !== t && (n._value = n.options.value + ""), n.redraw() }, value: function(e) { var n = this; return e === t ? n._value : (n._value = e + "", n.redraw(), t) }, options: { name: "QRCode", renderAs: "svg", encoding: "ISO_8859_1", value: "", errorCorrection: q.DEFAULT_ERROR_CORRECTION_LEVEL, background: q.DEFAULT_BACKGROUND, color: q.DEFAULT_DARK_MODULE_COLOR, size: "", padding: 0, border: { color: "", width: 0 } } }), X.ExportMixin.extend($.fn), X.ui.plugin($), Y.deepExtend(X, { QRCode: $, QRCodeDefaults: q, QRCodeFunctions: { FreeCellVisitor: m, fillData: v, padDataString: _, generateErrorCodewords: y, xorPolynomials: w, getBlocks: k, multiplyPolynomials: b, chooseMode: x, getModes: C, getDataCodewordsCount: S, getVersion: T, getDataString: D, encodeFormatInformation: A, encodeBCH: E, dividePolynomials: I, initMatrices: P, addFormatInformation: M, encodeVersionInformation: z, addVersionInformation: F, addCentricPattern: R, addFinderSeparator: H, addFinderPatterns: B, addAlignmentPatterns: L, addTimingFunctions: N, scoreMaskMatrixes: O, encodeData: G, UTF8Encoder: W }, QRCodeFields: { modes: f, powersOfTwo: rt, powersOfTwoResult: ot, generatorPolynomials: at } }) }(window.kendo.jQuery), function(e, t) { function n() {} function i(e) { return n.prototype = e, new n } var r, o = window.kendo, a = o.Class, s = o.Observable, l = o.deepExtend, c = Math, d = e.proxy, u = o.util, h = u.last, p = u.renderTemplate, f = o.dataviz, g = u.defined, m = f.filterSeriesByType, v = o.template, _ = f.ui.Chart, w = f.Selection, b = f.addDuration, y = u.limitValue, k = f.lteDateIndex, x = f.toDate, C = f.toTime, S = 28, T = "change", D = "k-", A = "drag", E = "dragEnd", I = "_navigator", P = I, M = f.EQUALLY_SPACED_SERIES, z = 3, F = "zoom", R = "zoomEnd", H = _.extend({ init: function(t, n) { e(t).addClass(D + "chart"), _.fn.init.call(this, t, n) }, _applyDefaults: function(e, t) { var n = this, i = n.element.width() || f.DEFAULT_WIDTH, r = { seriesDefaults: { categoryField: e.dateField }, axisDefaults: { categoryAxis: { name: "default", majorGridLines: { visible: !1 }, labels: { step: 2 }, majorTicks: { visible: !1 }, maxDateGroups: c.floor(i / S) } } }; t && (t = l({}, t, r)), n._navigator || B.setup(e, t), _.fn._applyDefaults.call(n, e, t) }, _initDataSource: function(e) { var t, n, i = e || {}, r = i.dataSource, o = r && r.serverFiltering, a = [].concat(i.categoryAxis)[0], s = i.navigator || {}, c = s.select, d = c && c.from && c.to; o && d && (t = [].concat(r.filter || []), n = new f.DateCategoryAxis(l({ baseUnit: "fit" }, a, { categories: [c.from, c.to] })), r.filter = B.buildFilter(n.range().min, c.to).concat(t)), _.fn._initDataSource.call(this, e) }, options: { name: "StockChart", dateField: "date", axisDefaults: { categoryAxis: { type: "date", baseUnit: "fit", justified: !0 }, valueAxis: { narrowRange: !0, labels: { format: "C" } } }, navigator: { select: {}, seriesDefaults: { markers: { visible: !1 }, tooltip: { visible: !0, template: "#= kendo.toString(category, 'd') #" }, line: { width: 2 } }, hint: {}, visible: !0 }, tooltip: { visible: !0 }, legend: { visible: !1 } }, _resize: function() { var e = this.options.transitions; this.options.transitions = !1, this._fullRedraw(), this.options.transitions = e }, _redraw: function() { var e = this, t = e._navigator; !this._dirty() && t && t.dataSource ? t.redrawSlaves() : e._fullRedraw() }, _dirty: function() { var t = this.options, n = [].concat(t.series, t.navigator.series), i = e.grep(n, function(e) { return e && e.visible }).length, r = this._seriesCount !== i; return this._seriesCount = i, r }, _fullRedraw: function() { var e = this, t = e._navigator; t || (t = e._navigator = new B(e)), t._setRange(), _.fn._redraw.call(e), t._initSelection() }, _onDataChanged: function() { var e = this; _.fn._onDataChanged.call(e), e._dataBound = !0 }, _bindCategoryAxis: function(e, t, n) { var i, r = this, o = r.options.categoryAxis, a = o.length; if (_.fn._bindCategoryAxis.apply(this, arguments), e.name === P) for (; a > n;) i = o[n++], i.pane == I && (i.categories = e.categories) }, _trackSharedTooltip: function(e) { var t = this, n = t._plotArea, i = n.paneByPoint(e); i && i.options.name === I ? t._unsetActivePoint() : _.fn._trackSharedTooltip.call(t, e) }, destroy: function() { var e = this; e._navigator.destroy(), _.fn.destroy.call(e) } }), B = s.extend({ init: function(e) { var t = this; t.chart = e, t.options = l({}, t.options, e.options.navigator), t._initDataSource(), g(t.options.hint.visible) || (t.options.hint.visible = t.options.visible), e.bind(A, d(t._drag, t)), e.bind(E, d(t._dragEnd, t)), e.bind(F, d(t._zoom, t)), e.bind(R, d(t._zoomEnd, t)) }, options: {}, _initDataSource: function() { var e = this, t = e.options, n = t.autoBind, i = t.dataSource; g(n) || (n = e.chart.options.autoBind), e._dataChangedHandler = d(e._onDataChanged, e), i && (e.dataSource = o.data.DataSource.create(i).bind(T, e._dataChangedHandler), n && e.dataSource.fetch()) }, _onDataChanged: function() { var e, t, n, i, r, o = this, a = o.chart, s = a.options.series, l = s.length, c = a.options.categoryAxis, d = c.length, u = o.dataSource.view(); for (e = 0; l > e; e++) n = s[e], n.axis == P && a._isBindable(n) && (n.data = u); for (t = 0; d > t; t++) i = c[t], i.pane == I && (i.name == P ? (a._bindCategoryAxis(i, u, t), r = i.categories) : i.categories = r); a._model && (o.redraw(), o.filterAxes(), (!a.options.dataSource || a.options.dataSource && a._dataBound) && o.redrawSlaves()) }, destroy: function() { var e = this, t = e.dataSource; t && t.unbind(T, e._dataChangeHandler), e.selection && e.selection.destroy() }, redraw: function() { this._redrawSelf(), this._initSelection() }, _initSelection: function() { var t = this, n = t.chart, o = t.options, a = t.mainAxis(), s = i(a), l = a.range(), c = l.min, d = l.max, u = a.options.categories, h = t.options.select, p = t.selection, f = x(h.from), g = x(h.to); 0 !== u.length && (p && (p.destroy(), p.wrapper.remove()), s.box = a.box, p = t.selection = new w(n, s, { min: c, max: d, from: f, to: g, selectStart: e.proxy(t._selectStart, t), select: e.proxy(t._select, t), selectEnd: e.proxy(t._selectEnd, t), mousewheel: { zoom: "left" } }), o.hint.visible && (t.hint = new r(n.element, { min: c, max: d, template: o.hint.template, format: o.hint.format }))) }, _setRange: function() { var e, t = this.chart._createPlotArea(!0), n = t.namedCategoryAxes[P], i = n.options, r = n.range(), o = r.min, a = b(r.max, i.baseUnitStep, i.baseUnit), s = this.options.select || {}, l = x(s.from) || o; o > l && (l = o), e = x(s.to) || a, e > a && (e = a), this.options.select = { from: l, to: e }, this.filterAxes() }, _redrawSelf: function(e) { var t = this.chart._plotArea; t && t.redraw(h(t.panes), e) }, redrawSlaves: function() { var e = this, t = e.chart, n = t._plotArea, i = n.panes.slice(0, -1); n.srcSeries = t.options.series, n.redraw(i) }, _drag: function(e) { var t, n, i, r = this, o = r.chart, a = o._eventCoordinates(e.originalEvent), s = r.mainAxis(), l = s.range(), c = s.pane.box.containsPoint(a), d = o._plotArea.categoryAxis, u = e.axisRanges[d.options.name], h = r.options.select, p = r.selection; u && !c && p && (t = h.from && h.to ? C(h.to) - C(h.from) : C(p.options.to) - C(p.options.from), n = x(y(C(u.min), l.min, C(l.max) - t)), i = x(y(C(n) + t, C(l.min) + t, l.max)), r.options.select = { from: n, to: i }, r._liveDrag() && (r.filterAxes(), r.redrawSlaves()), p.set(n, i), r.showHint(n, i)) }, _dragEnd: function() { var e = this; e.filterAxes(), e.filterDataSource(), e.redrawSlaves(), e.hint && e.hint.hide() }, _liveDrag: function() { var e = o.support, t = e.touch, n = e.browser, i = n.mozilla, r = n.msie && 9 > n.version; return !t && !i && !r }, readSelection: function() { var e = this, t = e.selection, n = t.options, i = e.options.select; i.from = n.from, i.to = n.to }, filterAxes: function() { var e, t, n = this, i = n.options.select || {}, r = n.chart, o = r.options.categoryAxis, a = i.from, s = i.to; for (e = 0; o.length > e; e++) t = o[e], t.pane !== I && (t.min = x(a), t.max = x(s)) }, filterDataSource: function() { var e, t = this, n = t.options.select || {}, i = t.chart, r = i.dataSource, o = r && r.options.serverFiltering; t.dataSource && o && (e = new f.DateCategoryAxis(l({ baseUnit: "fit" }, i.options.categoryAxis[0], { categories: [n.from, n.to] })).options, r.filter(B.buildFilter(b(e.min, -e.baseUnitStep, e.baseUnit), b(e.max, e.baseUnitStep, e.baseUnit)))) }, _zoom: function(e) { var t, n, i = this, r = i.chart, a = e.delta, s = r._plotArea.categoryAxis, l = i.options.select, d = i.selection, u = i.mainAxis().options.categories; d && (t = k(d.options.from, u), n = k(d.options.to, u), e.originalEvent.preventDefault(), c.abs(a) > 1 && (a *= z), n - t > 1 ? (d.expand(a), i.readSelection()) : (s.options.min = l.from, l.from = s.scaleRange(-e.delta).min), o.support.touch || (i.filterAxes(), i.redrawSlaves()), d.set(l.from, l.to), i.showHint(i.options.select.from, i.options.select.to)) }, _zoomEnd: function(e) { this._dragEnd(e) }, showHint: function(e, t) { var n = this, i = n.chart, r = i._plotArea; n.hint && n.hint.show(e, t, r.backgroundBox()) }, _selectStart: function(e) { var t = this.chart; t._selectStart.call(t, e) }, _select: function(e) { var t = this, n = t.chart; t.showHint(e.from, e.to), n._select.call(n, e) }, _selectEnd: function(e) { var t = this, n = t.chart; t.hint && t.hint.hide(), t.readSelection(), t.filterAxes(), t.filterDataSource(), t.redrawSlaves(), n._selectEnd.call(n, e) }, mainAxis: function() { var e = this.chart._plotArea; return e ? e.namedCategoryAxes[P] : t } }); B.setup = function(e, t) { e = e || {}, t = t || {}; var n = l({}, t.navigator, e.navigator), i = e.panes = [].concat(e.panes), r = l({}, n.pane, { name: I }); n.visible || (r.visible = !1, r.height = .1), i.push(r), B.attachAxes(e, n), B.attachSeries(e, n, t) }, B.attachAxes = function(e, t) { var n = t.series || [], i = e.categoryAxis = [].concat(e.categoryAxis), r = e.valueAxis = [].concat(e.valueAxis), o = m(n, M), a = 0 === o.length, s = l({ type: "date", pane: I, roundToBaseUnit: !a, justified: a, _collapse: !1, majorTicks: { visible: !0 }, tooltip: { visible: !1 }, labels: { step: 1 }, autoBind: !t.dataSource, autoBaseUnitSteps: { minutes: [1], hours: [1, 2], days: [1, 2], weeks: [], months: [1], years: [1] }, _overlap: !1 }), c = t.categoryAxis; i.push(l({}, s, { maxDateGroups: 200 }, c, { name: P, baseUnit: "fit", baseUnitStep: "auto", labels: { visible: !1 }, majorTicks: { visible: !1 } }), l({}, s, c, { name: P + "_labels", maxDateGroups: 20, baseUnitStep: "auto", plotBands: [], autoBaseUnitSteps: { minutes: [] } }), l({}, s, c, { name: P + "_ticks", maxDateGroups: 200, majorTicks: { width: .5 }, plotBands: [], labels: { visible: !1, mirror: !0 } })), r.push(l({ name: P, pane: I, majorGridLines: { visible: !1 }, visible: !1 }, t.valueAxis)) }, B.attachSeries = function(e, t, n) { var i, r = e.series = e.series || [], o = [].concat(t.series || []), a = n.seriesColors, s = t.seriesDefaults; for (i = 0; o.length > i; i++) r.push(l({ color: a[i % a.length], categoryField: t.dateField, visibleInLegend: !1, tooltip: { visible: !1 } }, s, o[i], { axis: P, categoryAxis: P, autoBind: !t.dataSource })) }, B.buildFilter = function(e, t) { return [{ field: "Date", operator: "gte", value: x(e) }, { field: "Date", operator: "lt", value: x(t) }] }, r = a.extend({ init: function(t, n) { var i = this; i.options = l({}, i.options, n), i.container = t, i.chartPadding = { top: parseInt(t.css("paddingTop"), 10), left: parseInt(t.css("paddingLeft"), 10) }, i.template = i.template, i.template || (i.template = i.template = p("<div class='" + D + "navigator-hint' style='display: none; position: absolute; top: 1px; left: 1px;'><div class='" + D + "tooltip " + D + "chart-tooltip'> </div><div class='" + D + "scroll' /></div>")), i.element = e(i.template()).appendTo(t) }, options: { format: "{0:d} - {1:d}", hideDelay: 500 }, show: function(e, t, n) { var i, r = this, a = x(C(e) + C(t - e) / 2), s = r.options, l = o.format(r.options.format, e, t), c = r.element.find("." + D + "tooltip"), d = r.element.find("." + D + "scroll"), u = .4 * n.width(), h = n.center().x - u, p = n.center().x, f = p - h, g = s.max - s.min, m = f / g, _ = a - s.min; r._hideTimeout && clearTimeout(r._hideTimeout), r._visible || (r.element.stop(!1, !0).css("visibility", "hidden").show(), r._visible = !0), s.template && (i = v(s.template), l = i({ from: e, to: t })), c.html(l).css({ left: n.center().x - c.outerWidth() / 2, top: n.y1 }), d.css({ width: u, left: h + _ * m, top: n.y1 + parseInt(c.css("margin-top"), 10) + parseInt(c.css("border-top-width"), 10) + c.height() / 2 }), r.element.css("visibility", "visible") }, hide: function() { var e = this; e._hideTimeout && clearTimeout(e._hideTimeout), e._hideTimeout = setTimeout(function() { e._visible = !1, e.element.fadeOut("slow") }, e.options.hideDelay) } }), f.ui.plugin(H), l(f, { Navigator: B }) }(window.kendo.jQuery), function(e) { function t(e) { return "number" == typeof e ? [e] : e } var n = window.kendo, i = n.dataviz, r = i.ui.Chart, o = n.data.ObservableArray, a = i.SharedTooltip, s = n.deepExtend, l = e.isArray, c = e.proxy, d = i.inArray, u = Math, h = "k-", p = 150, f = 150, g = "bar", m = "bullet", v = "pie", _ = "leave", w = [g, m], b = r.extend({ init: function(n, i) { var a = this, c = a.stage = e("<span />"), p = i || {}; n = e(n).addClass(h + "sparkline").empty().append(c), a._initialWidth = u.floor(n.width()), p = t(p), (l(p) || p instanceof o) && (p = { seriesDefaults: { data: p } }), p.series || (p.series = [{ data: t(p.data) }]), s(p, { seriesDefaults: { type: p.type } }), (d(p.series[0].type, w) || d(p.seriesDefaults.type, w)) && (p = s({}, { categoryAxis: { crosshair: { visible: !1 } } }, p)), r.fn.init.call(a, n, p) }, options: { name: "Sparkline", chartArea: { margin: 2 }, axisDefaults: { visible: !1, majorGridLines: { visible: !1 }, valueAxis: { narrowRange: !0 } }, seriesDefaults: { type: "line", area: { line: { width: .5 } }, bar: { stack: !0 }, padding: 2, width: .5, overlay: { gradient: null }, highlight: { visible: !1 }, border: { width: 0 }, markers: { size: 2, visible: !1 } }, tooltip: { visible: !0, shared: !0 }, categoryAxis: { crosshair: { visible: !0, tooltip: { visible: !1 } } }, legend: { visible: !1 }, transitions: !1, pointWidth: 5, panes: [{ clip: !1 }] }, _modelOptions: function() { var t, n, i = this, r = i.options, o = i._initialWidth, a = i.stage; return i.stage.children().hide(), n = e("<span> </span>"), i.stage.append(n), t = s({ width: o ? o : i._autoWidth(), height: a.height(), transitions: r.transitions }, r.chartArea, { inline: !0, align: !1 }), a.css({ width: t.width, height: t.height }), n.remove(), i.stage.children().show(), i.surface.resize(), t }, _createTooltip: function() { var e, t = this, n = t.options, i = t.element; return e = t._sharedTooltip() ? new y(i, t._plotArea, n.tooltip) : r.fn._createTooltip.call(t), e.bind(_, c(t._tooltipleave, t)), e }, _surfaceWrap: function() { return this.stage }, _autoWidth: function() { var e, t, n, r = this, o = r.options, a = i.getSpacing(o.chartArea.margin), s = o.series, l = r.dataSource.total(), c = 0; for (t = 0; s.length > t; t++) { if (n = s[t], n.type === g) return p; if (n.type === m) return f; if (n.type === v) return r.stage.height(); n.data && (c = u.max(c, n.data.length)) } return e = u.max(l, c) * o.pointWidth, e > 0 && (e += a.left + a.right), e } }), y = a.extend({ options: { animation: { duration: 0 } }, _anchor: function(e, t) { var n = a.fn._anchor.call(this, e, t), i = this._measure(); return n.y = -i.height - this.options.offset, n }, _hideElement: function() { this.element && this.element.hide().remove() } }); i.ui.plugin(b), s(i, { SparklineSharedTooltip: y }) }(window.kendo.jQuery), function(e, t) { var n, i = Math, r = i.abs, o = i.atan, a = i.atan2, s = i.cos, l = i.max, c = i.min, d = i.sin, u = i.tan, h = window.kendo, p = h.Class, f = h.dataviz, g = h.deepExtend, m = h.util, v = m.defined, _ = m.deg, w = m.rad, b = m.round, y = m.sqr, k = m.valueOrDefault, x = p.extend({ init: function(e, t) { 1 === arguments.length ? (this.lat = e[0], this.lng = e[1]) : (this.lat = e, this.lng = t) }, DISTANCE_ITERATIONS: 100, DISTANCE_CONVERGENCE: 1e-12, DISTANCE_PRECISION: 2, FORMAT: "{0:N6},{1:N6}", toArray: function() { return [this.lat, this.lng] }, equals: function(e) { return e && e.lat === this.lat && e.lng === this.lng }, clone: function() { return new x(this.lat, this.lng) }, round: function(e) { return this.lng = b(this.lng, e), this.lat = b(this.lat, e), this }, wrap: function() { return this.lng = this.lng % 180, this.lat = this.lat % 90, this }, distanceTo: function(e, t) { return this.greatCircleTo(e, t).distance }, destination: function(e, t, n) { var r, o, l, c, u; return t = w(t), n = n || f.map.datums.WGS84, r = w(this.lat), o = w(this.lng), l = e / h.dataviz.map.datums.WGS84.a, c = i.asin(d(r) * s(l) + s(r) * d(l) * s(t)), u = o + a(d(t) * d(l) * s(r), s(l) - d(r) * d(c)), new x(_(c), _(u)) }, greatCircleTo: function(e, t) { var n, l, c, h, p, g, m, v, k, C, S, T, D, A, E, I, P, M, z, F, R, H, B, L, N, O, V, U, W; if (e = x.create(e), t = t || f.map.datums.WGS84, !e || this.clone().round(8).equals(e.clone().round(8))) return { distance: 0, azimuthFrom: 0, azimuthTo: 0 }; for (n = t.a, l = t.b, c = t.f, h = w(e.lng - this.lng), p = o((1 - c) * u(w(this.lat))), g = d(p), m = s(p), v = o((1 - c) * u(w(e.lat))), k = d(v), C = s(v), S = h, D = this.DISTANCE_ITERATIONS, A = !1; !A && D-- > 0;) E = d(S), I = s(S), P = i.sqrt(y(C * E) + y(m * k - g * C * I)), z = g * k + m * C * I, R = a(P, z), H = m * C * E / P, M = 1 - y(H), F = 0, 0 !== M && (F = z - 2 * g * k / M), T = S, B = c / 16 * M * (4 + c * (4 - 3 * M)), S = h + (1 - B) * c * H * (R + B * P * (F + B * z * (-1 + 2 * y(F)))), A = r(S - T) <= this.DISTANCE_CONVERGENCE; return L = M * (y(n) - y(l)) / y(l), N = 1 + L / 16384 * (4096 + L * (-768 + L * (320 - 175 * L))), O = L / 1024 * (256 + L * (-128 + L * (74 - 47 * L))), V = O * P * (F + O / 4 * (z * (-1 + 2 * y(F)) - O / 6 * F * (-3 + 4 * y(P)) * (-3 + 4 * y(F)))), U = a(C * E, m * k - g * C * I), W = a(m * E, -g * C + m * k * I), { distance: b(l * N * (R - V), this.DISTANCE_PRECISION), azimuthFrom: _(U), azimuthTo: _(W) } } }); x.fn.toString = function() { return h.format(this.FORMAT, this.lat, this.lng) }, x.fromLngLat = function(e) { return new x(e[1], e[0]) }, x.fromLatLng = function(e) { return new x(e[0], e[1]) }, x.create = function(e, n) { return v(e) ? e instanceof x ? e.clone() : 1 === arguments.length && 2 === e.length ? x.fromLatLng(e) : new x(e, n) : t }, n = p.extend({ init: function(e, t) { e = x.create(e), t = x.create(t), e.lng + 180 > t.lng + 180 && t.lat + 90 > e.lat + 90 ? (this.se = e, this.nw = t) : (this.se = t, this.nw = e) }, contains: function(e) { var t = this.nw, n = this.se, i = k(e.lng, e[1]), r = k(e.lat, e[0]); return e && i + 180 >= t.lng + 180 && n.lng + 180 >= i + 180 && r + 90 >= n.lat + 90 && t.lat + 90 >= r + 90 }, center: function() { var e = this.nw, t = this.se, n = e.lng + (t.lng - e.lng) / 2, i = e.lat + (t.lat - e.lat) / 2; return new x(i, n) }, containsAny: function(e) { var t, n = !1; for (t = 0; e.length > t; t++) n = n || this.contains(e[t]); return n }, include: function(e) { var t = this.nw, n = this.se, i = k(e.lng, e[1]), r = k(e.lat, e[0]); t.lng = c(t.lng, i), t.lat = l(t.lat, r), n.lng = l(n.lng, i), n.lat = c(n.lat, r) }, includeAll: function(e) { for (var t = 0; e.length > t; t++) this.include(e[t]) }, edges: function() { var e = this.nw, t = this.se; return { nw: this.nw, ne: new x(e.lat, t.lng), se: this.se, sw: new x(t.lat, e.lng) } }, toArray: function() { var e = this.nw, t = this.se; return [e, new x(e.lat, t.lng), t, new x(t.lat, e.lng)] }, overlaps: function(e) { return this.containsAny(e.toArray()) || e.containsAny(this.toArray()) } }), n.World = new n([90, -180], [-90, 180]), n.create = function(e, i) { return e instanceof n ? e : e && i ? new n(e, i) : e && 4 === e.length && !i ? new n([e[0], e[1]], [e[2], e[3]]) : t }, g(f, { map: { Extent: n, Location: x } }) }(window.kendo.jQuery), function() { var e = window.kendo, t = e.ui.Widget, n = e.template, i = e.util.valueOrDefault, r = e.util.defined, o = t.extend({ init: function(e, n) { t.fn.init.call(this, e, n), this._initOptions(n), this.items = [], this.element.addClass("k-widget k-attribution") }, options: { name: "Attribution", separator: " | ", itemTemplate: "#= text #" }, filter: function(e, t) { this._extent = e, this._zoom = t, this._render() }, add: function(e) { r(e) && ("string" == typeof e && (e = { text: e }), this.items.push(e), this._render()) }, remove: function(e) { var t, n, i = []; for (t = 0; this.items.length > t; t++) n = this.items[t], n.text !== e && i.push(n); this.items = i, this._render() }, clear: function() { this.items = [], this.element.empty() }, _render: function() { var e, t, i, r = [], o = n(this.options.itemTemplate); for (e = 0; this.items.length > e; e++) t = this.items[e], i = this._itemText(t), "" !== i && r.push(o({ text: i })); r.length > 0 ? this.element.empty().append(r.join(this.options.separator)).show() : this.element.hide() }, _itemText: function(e) { var t = "", n = this._inZoomLevel(e.minZoom, e.maxZoom), i = this._inArea(e.extent); return n && i && (t += e.text), t }, _inZoomLevel: function(e, t) { var n = !0; return e = i(e, -Number.MAX_VALUE), t = i(t, Number.MAX_VALUE), n = this._zoom > e && t > this._zoom }, _inArea: function(e) { var t = !0; return e && (t = e.contains(this._extent)), t } }); e.dataviz.ui.plugin(o) }(window.kendo.jQuery), function(e) { function t(e) { return n.format('<button class="k-button k-navigator-{0}"><span class="k-icon k-i-arrow-{0}"/></button>', e) } var n = window.kendo, i = n.ui.Widget, r = n.keys, o = e.proxy, a = ".kendoNavigator", s = t("n") + t("e") + t("s") + t("w"), l = i.extend({ init: function(e, t) { i.fn.init.call(this, e, t), this._initOptions(t), this.element.addClass("k-widget k-header k-shadow k-navigator").append(s).on("click" + a, ".k-button", o(this, "_click")); var r = this.element.parent().closest("[" + n.attr("role") + "]"); this._keyroot = r.length > 0 ? r : this.element, this._tabindex(this._keyroot), this._keydown = o(this._keydown, this), this._keyroot.on("keydown", this._keydown) }, options: { name: "Navigator", panStep: 1 }, events: ["pan"], dispose: function() { this._keyroot.off("keydown", this._keydown) }, _pan: function(e, t) { var n = this.options.panStep; this.trigger("pan", { x: e * n, y: t * n }) }, _click: function(t) { var n = 0, i = 0, r = e(t.currentTarget); r.is(".k-navigator-n") ? i = 1 : r.is(".k-navigator-s") ? i = -1 : r.is(".k-navigator-e") ? n = 1 : r.is(".k-navigator-w") && (n = -1), this._pan(n, i), t.preventDefault() }, _keydown: function(e) { switch (e.which) { case r.UP: this._pan(0, 1), e.preventDefault(); break; case r.DOWN: this._pan(0, -1), e.preventDefault(); break; case r.RIGHT: this._pan(1, 0), e.preventDefault(); break; case r.LEFT: this._pan(-1, 0), e.preventDefault() } } }); n.dataviz.ui.plugin(l) }(window.kendo.jQuery), function(e) { function t(e, t) { return n.format('<button class="k-button k-zoom-{0}" title="zoom-{0}">{1}</button>', e, t) } var n = window.kendo, i = n.ui.Widget, r = n.keys, o = e.proxy, a = ".kendoZoomControl", s = t("in", "+") + t("out", "-"), l = 187, c = 189, d = 61, u = 173, h = i.extend({ init: function(e, t) { i.fn.init.call(this, e, t), this._initOptions(t), this.element.addClass("k-widget k-zoom-control k-button-wrap k-buttons-horizontal").append(s).on("click" + a, ".k-button", o(this, "_click")); var r = this.element.parent().closest("[" + n.attr("role") + "]"); this._keyroot = r.length > 0 ? r : this.element, this._tabindex(this._keyroot), this._keydown = o(this._keydown, this), this._keyroot.on("keydown", this._keydown) }, options: { name: "ZoomControl", zoomStep: 1 }, events: ["change"], _change: function(e) { var t = this.options.zoomStep; this.trigger("change", { delta: e * t }) }, _click: function(t) { var n = e(t.currentTarget), i = 1; n.is(".k-zoom-out") && (i = -1), this._change(i), t.preventDefault() }, _keydown: function(e) { switch (e.which) { case r.NUMPAD_PLUS: case l: case d: this._change(1); break; case r.NUMPAD_MINUS: case c: case u: this._change(-1) } } }); n.dataviz.ui.plugin(h) }(window.kendo.jQuery), function() { var e = Math, t = e.atan, n = e.exp, i = e.pow, r = e.sin, o = e.log, a = e.tan, s = window.kendo, l = s.Class, c = s.dataviz, d = s.deepExtend, u = s.geometry, h = u.Point, p = c.map, f = p.Location, g = s.util, m = g.rad, v = g.deg, _ = g.limitValue, w = e.PI, b = w / 2, y = w / 4, k = w / 180, x = { a: 6378137, b: 6356752.314245179, f: .0033528106647474805, e: .08181919084262149 }, C = l.extend({ init: function(e) { this._initOptions(e) }, MAX_LNG: 180, MAX_LAT: 85.0840590501, INVERSE_ITERATIONS: 15, INVERSE_CONVERGENCE: 1e-12, options: { centralMeridian: 0, datum: x }, forward: function(e, t) { var n = this, i = n.options, r = i.datum, o = r.a, a = i.centralMeridian, s = _(e.lat, -n.MAX_LAT, n.MAX_LAT), l = t ? _(e.lng, -n.MAX_LNG, n.MAX_LNG) : e.lng, c = m(l - a) * o, d = n._projectLat(s); return new h(c, d) }, _projectLat: function(e) { var t = this.options.datum, n = t.e, s = t.a, l = m(e), c = a(y + l / 2), d = n * r(l), u = i((1 - d) / (1 + d), n / 2); return s * o(c * u) }, inverse: function(e, t) { var n = this, i = n.options, r = i.datum, o = r.a, a = i.centralMeridian, s = e.x / (k * o) + a, l = _(n._inverseY(e.y), -n.MAX_LAT, n.MAX_LAT); return t && (s = _(s, -n.MAX_LNG, n.MAX_LNG)), new f(l, s) }, _inverseY: function(o) { var a, s, l, c, d = this, u = d.options.datum, h = u.a, p = u.e, f = p / 2, g = n(-o / h), m = b - 2 * t(g); for (a = 0; d.INVERSE_ITERATIONS >= a && (s = p * r(m), l = i((1 - s) / (1 + s), f), c = b - 2 * t(g * l) - m, m += c, !(e.abs(c) <= d.INVERSE_CONVERGENCE)); a++); return v(m) } }), S = C.extend({ MAX_LAT: 85.0511287798, _projectLat: function(e) { var t = this.options.datum.a, n = m(e), i = a(y + n / 2); return t * o(i) }, _inverseY: function(e) { var i = this.options.datum.a, r = n(-e / i); return v(b - 2 * t(r)) } }), T = l.extend({ forward: function(e) { return new h(e.lng, e.lat) }, inverse: function(e) { return new f(e.y, e.x) } }), D = l.extend({ init: function() { var e = this, t = e._proj = new S, n = this.c = 2 * w * t.options.datum.a; this._tm = u.transform().translate(.5, .5).scale(1 / n, -1 / n), this._itm = u.transform().scale(n, -n).translate(-.5, -.5) }, toPoint: function(e, t, n) { var i = this._proj.forward(e, n); return i.transform(this._tm).scale(t || 1) }, toLocation: function(e, t, n) { return e = e.clone().scale(1 / (t || 1)).transform(this._itm), this._proj.inverse(e, n) } }), A = l.extend({ init: function() { this._proj = new C }, toPoint: function(e) { return this._proj.forward(e) }, toLocation: function(e) { return this._proj.inverse(e) } }), E = l.extend({ init: function() { this._proj = new T }, toPoint: function(e) { return this._proj.forward(e) }, toLocation: function(e) { return this._proj.inverse(e) } }); d(c, { map: { crs: { EPSG3395: A, EPSG3857: D, EPSG4326: E }, datums: { WGS84: x }, projections: { Equirectangular: T, Mercator: C, SphericalMercator: S } } }) }(window.kendo.jQuery), function(e) { var t = e.proxy, n = window.kendo, i = n.Class, r = n.dataviz, o = n.deepExtend, a = r.map.Extent, s = n.util, l = s.defined, c = i.extend({ init: function(n, i) { this._initOptions(i), this.map = n, this.element = e("<div class='k-layer'></div>").css({ zIndex: this.options.zIndex, opacity: this.options.opacity }).appendTo(n.scrollElement), this._beforeReset = t(this._beforeReset, this), this._reset = t(this._reset, this), this._resize = t(this._resize, this), this._panEnd = t(this._panEnd, this), this._activate(), this._updateAttribution() }, destroy: function() { this._deactivate() }, show: function() { this.reset(), this._activate(), this._applyExtent(!0) }, hide: function() { this._deactivate(), this._setVisibility(!1) }, reset: function() { this._beforeReset(), this._reset() }, _reset: function() { this._applyExtent() }, _beforeReset: e.noop, _resize: e.noop, _panEnd: function() { this._applyExtent() }, _applyExtent: function() { var e = this.options, t = this.map.zoom(), n = !l(e.minZoom) || t >= e.minZoom, i = !l(e.maxZoom) || e.maxZoom >= t, r = a.create(e.extent), o = !r || r.overlaps(this.map.extent()); this._setVisibility(n && i && o) }, _setVisibility: function(e) { this.element.css("display", e ? "" : "none") }, _activate: function() { var e = this.map; e.bind("beforeReset", this._beforeReset), e.bind("reset", this._reset), e.bind("resize", this._resize), e.bind("panEnd", this._panEnd) }, _deactivate: function() { var e = this.map; e.unbind("beforeReset", this._beforeReset), e.unbind("reset", this._reset), e.unbind("resize", this._resize), e.unbind("panEnd", this._panEnd) }, _updateAttribution: function() { var e = this.map.attribution; e && e.add(this.options.attribution) } }); o(r, { map: { layers: { Layer: c } } }) }(window.kendo.jQuery), function(e) { var t = e.proxy, n = window.kendo, i = n.Class, r = n.data.DataSource, o = n.dataviz, a = n.deepExtend, s = n.util.last, l = n.util.defined, c = n.geometry, d = n.drawing, u = d.Group, h = o.map, p = h.Location, f = h.layers.Layer, g = f.extend({ init: function(e, t) { f.fn.init.call(this, e, t), this.surface = d.Surface.create(this.element, { width: e.scrollElement.width(), height: e.scrollElement.height() }), this._initRoot(), this.movable = new n.ui.Movable(this.surface.element), this._markers = [], this._click = this._handler("shapeClick"), this.surface.bind("click", this._click), this._mouseenter = this._handler("shapeMouseEnter"), this.surface.bind("mouseenter", this._mouseenter), this._mouseleave = this._handler("shapeMouseLeave"), this.surface.bind("mouseleave", this._mouseleave), this._initDataSource() }, options: { autoBind: !0 }, destroy: function() { f.fn.destroy.call(this), this.surface.destroy(), this.dataSource.unbind("change", this._dataChange) }, setDataSource: function(e) { this.dataSource && this.dataSource.unbind("change", this._dataChange), this.dataSource = e, this.dataSource.bind("change", this._dataChange), this.options.autoBind && this.dataSource.fetch() }, _reset: function() { f.fn._reset.call(this), this._translateSurface(), this._data && this._load(this._data) }, _initRoot: function() { this._root = new u, this.surface.draw(this._root) }, _beforeReset: function() { this.surface.clear(), this._initRoot() }, _resize: function() { this.surface.size(this.map.size()) }, _initDataSource: function() { var e = this.options.dataSource; this._dataChange = t(this._dataChange, this), this.dataSource = r.create(e).bind("change", this._dataChange), e && this.options.autoBind && this.dataSource.fetch() }, _dataChange: function(e) { this._data = e.sender.view(), this._load(this._data) }, _load: function(e) { var t, n, i; for (this._clearMarkers(), this._loader || (this._loader = new m(this.map, this.options.style, this)), t = new u, n = 0; e.length > n; n++) i = this._loader.parse(e[n]), i && t.append(i); this._root.clear(), this._root.append(t) }, shapeCreated: function(e) { var t, n = !1; return e instanceof d.Circle && (n = l(this._createMarker(e))), n || (t = { layer: this, shape: e }, n = this.map.trigger("shapeCreated", t)), n }, _createMarker: function(e) { var t = this.map.markers.bind({ location: e.location }, e.dataItem); return t && this._markers.push(t), t }, _clearMarkers: function() { for (var e = 0; this._markers.length > e; e++) this.map.markers.remove(this._markers[e]); this._markers = [] }, _panEnd: function(e) { f.fn._panEnd.call(this, e), this._translateSurface() }, _translateSurface: function() { var e = this.map, t = e.locationToView(e.extent().nw); this.surface.translate && (this.surface.translate(t), this.movable.moveTo({ x: t.x, y: t.y })) }, _handler: function(e) { var t = this; return function(n) { if (n.element) { var i = { layer: t, shape: n.element, originalEvent: n.originalEvent }; t.map.trigger(e, i) } } } }), m = i.extend({ init: function(e, t, n) { this.observer = n, this.locator = e, this.style = t }, parse: function(e) { var t = new u; return "Feature" === e.type ? this._loadGeometryTo(t, e.geometry, e) : this._loadGeometryTo(t, e, e), 2 > t.children.length && (t = t.children[0]), t }, _shapeCreated: function(e) { var t = !1; return this.observer && this.observer.shapeCreated && (t = this.observer.shapeCreated(e)), t }, _loadGeometryTo: function(e, t, n) { var i, r, o = t.coordinates; switch (t.type) { case "LineString": r = this._loadPolygon(e, [o], n), this._setLineFill(r); break; case "MultiLineString": for (i = 0; o.length > i; i++) r = this._loadPolygon(e, [o[i]], n), this._setLineFill(r); break; case "Polygon": this._loadPolygon(e, o, n); break; case "MultiPolygon": for (i = 0; o.length > i; i++) this._loadPolygon(e, o[i], n); break; case "Point": this._loadPoint(e, o, n); break; case "MultiPoint": for (i = 0; o.length > i; i++) this._loadPoint(e, o[i], n) } }, _setLineFill: function(e) { var t = e.segments; (4 > t.length || !t[0].anchor().equals(s(t).anchor())) && (e.options.fill = null) }, _loadShape: function(e, t) { return this._shapeCreated(t) || e.append(t), t }, _loadPolygon: function(e, t, n) { var i = this._buildPolygon(t); return i.dataItem = n, this._loadShape(e, i) }, _buildPolygon: function(e) { var t, n, i, r = e.length > 1 ? d.MultiPath : d.Path, o = new r(this.style); for (t = 0; e.length > t; t++) for (n = 0; e[t].length > n; n++) i = this.locator.locationToView(p.fromLngLat(e[t][n])), 0 === n ? o.moveTo(i.x, i.y) : o.lineTo(i.x, i.y); return o }, _loadPoint: function(e, t, n) { var i = p.fromLngLat(t), r = this.locator.locationToView(i), o = new c.Circle(r, 10), a = new d.Circle(o, this.style); return a.dataItem = n, a.location = i, this._loadShape(e, a) } }); a(n.data, { schemas: { geojson: { type: "json", data: function(e) { return "FeatureCollection" === e.type ? e.features : "GeometryCollection" === e.type ? e.geometries : e } } }, transports: { geojson: { read: { dataType: "json" } } } }), a(o, { map: { layers: { shape: g, ShapeLayer: g }, GeoJSONLoader: m } }) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.getter, i = t.dataviz, r = t.deepExtend, o = t.util, a = o.defined, s = t.geometry, l = t.drawing, c = i.map, d = c.Location, u = c.layers.ShapeLayer, h = u.extend({ options: { autoBind: !0, locationField: "location", valueField: "value", minSize: 0, maxSize: 100, scale: "sqrt", symbol: "circle" }, _load: function(e) { var t, i, r, o, s, l, c, u, h, p, f, g; if (this.surface.clear(), 0 !== e.length) for (t = this.options, i = n(t.valueField), e = e.slice(0), e.sort(function(e, t) { return i(t) - i(e) }), r = i(e[0]), o = this._scaleType(), l = 0; e.length > l; l++) c = e[l], u = n(t.locationField)(c), h = n(t.valueField)(c), a(u) && a(h) && (s || (s = new o([0, h], [t.minSize, t.maxSize])), u = d.create(u), p = this.map.locationToView(u), f = s.map(h), g = this._createSymbol({ center: p, size: f, style: t.style, dataItem: c, location: u }), g.dataItem = c, g.location = u, g.value = h, this._drawSymbol(g)) }, _scaleType: function() { var e = this.options.scale; return t.isFunction(e) ? e : i.map.scales[e] }, _createSymbol: function(e) { var n = this.options.symbol; return t.isFunction(n) || (n = i.map.symbols[n]), n(e) }, _drawSymbol: function(e) { var t = { layer: this, shape: e }, n = this.map.trigger("shapeCreated", t); n || this.surface.draw(e) } }), p = t.Class.extend({ init: function(e, t) { var n, i; this._domain = e, this._range = t, n = Math.sqrt(e[1]) - Math.sqrt(e[0]), i = t[1] - t[0], this._ratio = i / n }, map: function(e) { var t = (Math.sqrt(e) - Math.sqrt(this._domain[0])) * this._ratio; return this._range[0] + t } }), f = { circle: function(e) { var t = new s.Circle(e.center, e.size / 2); return new l.Circle(t, e.style) }, square: function(e) { var t = new l.Path(e.style), n = e.size / 2, i = e.center; return t.moveTo(i.x - n, i.y - n).lineTo(i.x + n, i.y - n).lineTo(i.x + n, i.y + n).lineTo(i.x - n, i.y + n).close(), t } }; r(i, { map: { layers: { bubble: h, BubbleLayer: h }, scales: { sqrt: p }, symbols: f } }) }(window.kendo.jQuery), function(e) { function t(e) { return new d(f(e.x), f(e.y)) } var n = Math, i = e.proxy, r = window.kendo, o = r.Class, a = r.template, s = r.dataviz, l = r.deepExtend, c = r.geometry, d = c.Point, u = s.map.layers.Layer, h = r.util, p = h.objectKey, f = h.round, g = h.renderSize, m = h.limitValue, v = u.extend({ init: function(e, t) { u.fn.init.call(this, e, t), "string" == typeof this.options.subdomains && (this.options.subdomains = this.options.subdomains.split("")); var n = this._viewType(); this._view = new n(this.element, this.options) }, destroy: function() { u.fn.destroy.call(this), this._view.destroy(), this._view = null }, _reset: function() { u.fn._reset.call(this), this._updateView(), this._view.reset() }, _viewType: function() { return _ }, _activate: function() { u.fn._activate.call(this), r.support.mobileOS || (this._pan || (this._pan = r.throttle(i(this._render, this), 100)), this.map.bind("pan", this._pan)) }, _deactivate: function() { u.fn._deactivate.call(this), this._pan && this.map.unbind("pan", this._pan) }, _updateView: function() { var e = this._view, t = this.map, n = t.extent(), i = { nw: t.locationToLayer(n.nw).round(), se: t.locationToLayer(n.se).round() }; e.center(t.locationToLayer(t.center())), e.extent(i), e.zoom(t.zoom()) }, _resize: function() { this._render() }, _panEnd: function(e) { u.fn._panEnd.call(this, e), this._render() }, _render: function() { this._updateView(), this._view.render() } }), _ = o.extend({ init: function(e, t) { this.element = e, this._initOptions(t), this.pool = new b }, options: { tileSize: 256, subdomains: ["a", "b", "c"], urlTemplate: "" }, center: function(e) { this._center = e }, extent: function(e) { this._extent = e }, zoom: function(e) { this._zoom = e }, pointToTileIndex: function(e) { return new d(n.floor(e.x / this.options.tileSize), n.floor(e.y / this.options.tileSize)) }, tileCount: function() { var e = this.size(), t = this.pointToTileIndex(this._extent.nw), i = this._extent.nw, r = this.indexToPoint(t).translate(-i.x, -i.y); return { x: n.ceil((n.abs(r.x) + e.width) / this.options.tileSize), y: n.ceil((n.abs(r.y) + e.height) / this.options.tileSize) } }, size: function() { var e = this._extent.nw, t = this._extent.se, n = t.clone().translate(-e.x, -e.y); return { width: n.x, height: n.y } }, indexToPoint: function(e) { var t = e.x, n = e.y; return new d(t * this.options.tileSize, n * this.options.tileSize) }, subdomainText: function() { var e = this.options.subdomains; return e[this.subdomainIndex++ % e.length] }, destroy: function() { this.element.empty(), this.pool.empty() }, reset: function() { this.pool.reset(), this.subdomainIndex = 0, this.basePoint = this._extent.nw, this.render() }, render: function() { var e, t, n, i = this.tileCount(), r = this.pointToTileIndex(this._extent.nw); for (t = 0; i.x > t; t++) for (n = 0; i.y > n; n++) e = this.createTile({ x: r.x + t, y: r.y + n }), e.visible || e.show() }, createTile: function(e) { var t = this.tileOptions(e), n = this.pool.get(this._center, t); return 0 === n.element.parent().length && this.element.append(n.element), n }, tileOptions: function(e) { var n = this.wrapIndex(e), i = this.indexToPoint(e), r = this.basePoint, o = i.clone().translate(-r.x, -r.y); return { index: n, currentIndex: e, point: i, offset: t(o), zoom: this._zoom, subdomain: this.subdomainText(), urlTemplate: this.options.urlTemplate, errorUrlTemplate: this.options.errorUrlTemplate } }, wrapIndex: function(e) { var t = n.pow(2, this._zoom); return { x: this.wrapValue(e.x, t), y: m(e.y, 0, t - 1) } }, wrapValue: function(e, t) { var i = n.abs(e) % t; return e = e >= 0 ? i : t - (0 === i ? t : i) } }), w = o.extend({ init: function(e, t) { this.id = e, this.visible = !0, this._initOptions(t), this.createElement(), this.show() }, options: { urlTemplate: "", errorUrlTemplate: "" }, createElement: function() { this.element = e("<img style='position: absolute; display: block;' />").error(i(function(e) { this.errorUrl() ? e.target.setAttribute("src", this.errorUrl()) : e.target.removeAttribute("src") }, this)) }, show: function() { var e, t = this.element[0]; t.style.top = g(this.options.offset.y), t.style.left = g(this.options.offset.x), e = this.url(), e && t.setAttribute("src", e), t.style.visibility = "visible", this.visible = !0 }, hide: function() { this.element[0].style.visibility = "hidden", this.visible = !1 }, url: function() { var e = a(this.options.urlTemplate); return e(this.urlOptions()) }, errorUrl: function() { var e = a(this.options.errorUrlTemplate); return e(this.urlOptions()) }, urlOptions: function() { var e = this.options; return { zoom: e.zoom, subdomain: e.subdomain, z: e.zoom, x: e.index.x, y: e.index.y, s: e.subdomain, quadkey: e.quadkey, q: e.quadkey, culture: e.culture, c: e.culture } }, destroy: function() { this.element && (this.element.remove(), this.element = null) } }), b = o.extend({ init: function() { this._items = [] }, options: { maxSize: 100 }, get: function(e, t) { return this._items.length >= this.options.maxSize && this._remove(e), this._create(t) }, empty: function() { var e, t = this._items; for (e = 0; t.length > e; e++) t[e].destroy(); this._items = [] }, reset: function() { var e, t = this._items; for (e = 0; t.length > e; e++) t[e].hide() }, _create: function(e) { var t, n, i = this._items, r = h.hashKey(p(e) + p(e.currentIndex)); for (n = 0; i.length > n; n++) i[n].id === r && (t = i[n]); return t ? t.show() : (t = new w(r, e), this._items.push(t)), t }, _remove: function(e) { var t, n, i = this._items, r = -1, o = -1; for (t = 0; i.length > t; t++) n = i[t].options.point.distanceTo(e), n > r && (o = t, r = n); - 1 !== o && (i[o].destroy(), i.splice(o, 1)) } }); l(s, { map: { layers: { tile: v, TileLayer: v, ImageTile: w, TilePool: b, TileView: _ } } }) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.dataviz, r = n.deepExtend, o = n.util.defined, a = i.map.Extent, s = i.map.Location, l = i.map.layers.TileLayer, c = i.map.layers.TileView, d = l.extend({ init: function(t, n) { l.fn.init.call(this, t, n), this._onMetadata = e.proxy(this._onMetadata, this), this._fetchMetadata() }, options: { baseUrl: "//dev.virtualearth.net/REST/v1/Imagery/Metadata/", imagerySet: "road" }, _fetchMetadata: function() { var t = this.options; if (!t.key) throw Error("Bing tile layer: API key is required"); e.ajax({ url: t.baseUrl + t.imagerySet, data: { output: "json", include: "ImageryProviders", key: t.key, uriScheme: this._scheme(window.location.protocol) }, type: "get", dataType: "jsonp", jsonp: "jsonp", success: this._onMetadata }) }, _scheme: function(e) { return "https" === e.replace(":", "") ? "https" : "http" }, _onMetadata: function(e) { var t, n; e && e.resourceSets.length && (t = this.resource = e.resourceSets[0].resources[0], r(this._view.options, { urlTemplate: t.imageUrl.replace("{subdomain}", "#= subdomain #").replace("{quadkey}", "#= quadkey #").replace("{culture}", "#= culture #"), subdomains: t.imageUrlSubdomains }), n = this.options, o(n.minZoom) || (n.minZoom = t.zoomMin), o(n.maxZoom) || (n.maxZoom = t.zoomMax), this._addAttribution(), "none" !== this.element.css("display") && this.reset()) }, _viewType: function() { return u }, _addAttribution: function() { var e, t, n, i, r, o = this.map.attribution; if (o && (e = this.resource.imageryProviders)) for (t = 0; e.length > t; t++) for (n = e[t], i = 0; n.coverageAreas.length > i; i++) r = n.coverageAreas[i], o.add({ text: n.attribution, minZoom: r.zoomMin, maxZoom: r.zoomMax, extent: new a(new s(r.bbox[2], r.bbox[1]), new s(r.bbox[0], r.bbox[3])) }) }, imagerySet: function(e) { return e ? (this.options.imagerySet = e, this.map.attribution.clear(), this._fetchMetadata(), this._reset(), t) : this.options.imagerySet } }), u = c.extend({ options: { culture: "en-US" }, tileOptions: function(e) { var t = c.fn.tileOptions.call(this, e); return t.culture = this.options.culture, t.quadkey = this.tileQuadKey(this.wrapIndex(e)), t }, tileQuadKey: function(e) { var t, n, i, r = ""; for (i = this._zoom; i > 0; i--) t = 0, n = 1 << i - 1, 0 !== (e.x & n) && t++, 0 !== (e.y & n) && (t += 2), r += t; return r } }); r(i, { map: { layers: { bing: d, BingLayer: d, BingView: u } } }) }(window.kendo.jQuery), function(e, t) { var n = document, i = Math, r = e.inArray, o = e.proxy, a = window.kendo, s = a.Class, l = a.data.DataSource, c = a.ui.Tooltip, d = a.dataviz, u = a.deepExtend, h = d.map, p = h.Location, f = h.layers.Layer, g = f.extend({ init: function(e, t) { f.fn.init.call(this, e, t), this._markerClick = o(this._markerClick, this), this.element.on("click", ".k-marker", this._markerClick), this.items = [], this._initDataSource() }, destroy: function() { f.fn.destroy.call(this), this.element.off("click", ".k-marker", this._markerClick), this.dataSource.unbind("change", this._dataChange), this.clear() }, options: { zIndex: 1e3, autoBind: !0, dataSource: {}, locationField: "location", titleField: "title" }, add: function(t) { if (!e.isArray(t)) return this._addOne(t); for (var n = 0; t.length > n; n++) this._addOne(t[n]) }, remove: function(e) { e.destroy(); var t = r(e, this.items); t > -1 && this.items.splice(t, 1) }, clear: function() { for (var e = 0; this.items.length > e; e++) this.items[e].destroy(); this.items = [] }, update: function(e) { var t, n = e.location(); n && (e.showAt(this.map.locationToView(n)), t = { marker: e, layer: this }, this.map.trigger("markerActivate", t)) }, _reset: function() { var e, t; for (f.fn._reset.call(this), e = this.items, t = 0; e.length > t; t++) this.update(e[t]) }, bind: function(e, n) { var i, r, o = h.Marker.create(e, this.options); return o.dataItem = n, i = { marker: o, layer: this }, r = this.map.trigger("markerCreated", i), r ? t : (this.add(o), o) }, setDataSource: function(e) { this.dataSource && this.dataSource.unbind("change", this._dataChange), this.dataSource = e, this.dataSource.bind("change", this._dataChange), this.options.autoBind && this.dataSource.fetch() }, _addOne: function(e) { var t = m.create(e, this.options); return t.addTo(this), t }, _initDataSource: function() { var e = this.options.dataSource; this._dataChange = o(this._dataChange, this), this.dataSource = l.create(e).bind("change", this._dataChange), e && this.options.autoBind && this.dataSource.fetch() }, _dataChange: function(e) { this._load(e.sender.view()) }, _load: function(e) { var t, n, i, r; for (this._data = e, this.clear(), t = a.getter(this.options.locationField), n = a.getter(this.options.titleField), i = 0; e.length > i; i++) r = e[i], this.bind({ location: t(r), title: n(r) }, r) }, _markerClick: function(t) { var n = { marker: e(t.target).data("kendoMarker"), layer: this }; this.map.trigger("markerClick", n) } }), m = s.extend({ init: function(e) { this.options = e || {} }, addTo: function(e) { this.layer = e.markers || e, this.layer.items.push(this), this.layer.update(this) }, location: function(e) { return e ? (this.options.location = p.create(e).toArray(), this.layer && this.layer.update(this), this) : p.create(this.options.location) }, showAt: function(e) { this.render(), this.element.css({ left: i.round(e.x), top: i.round(e.y) }), this.tooltip && this.tooltip.popup && this.tooltip.popup._position() }, hide: function() { this.element && (this.element.remove(), this.element = null), this.tooltip && (this.tooltip.destroy(), this.tooltip = null) }, destroy: function() { this.layer = null, this.hide() }, render: function() { var t, i; this.element || (t = this.options, i = this.layer, this.element = e(n.createElement("span")).addClass("k-marker k-marker-" + a.toHyphens(t.shape || "pin")).attr("title", t.title).attr(t.attributes || {}).data("kendoMarker", this).css("zIndex", t.zIndex), i && i.element.append(this.element), this.renderTooltip()) }, renderTooltip: function() { var e, t, n = this, i = n.options.title, r = n.options.tooltip || {}; r && c && (e = r.template, e && (t = a.template(e), r.content = function(e) { return e.location = n.location(), e.marker = n, t(e) }), (i || r.content || r.contentUrl) && (this.tooltip = new c(this.element, r), this.tooltip.marker = this)) } }); m.create = function(e, t) { return e instanceof m ? e : new m(u({}, t, e)) }, u(d, { map: { layers: { marker: g, MarkerLayer: g }, Marker: m } }) }(window.kendo.jQuery), function(e) { var t = document, n = Math, i = n.min, r = n.pow, o = e.proxy, a = window.kendo, s = a.ui.Widget, l = a.deepExtend, c = a.dataviz, d = c.ui, u = a.geometry, h = u.Point, p = c.map, f = p.Extent, g = p.Location, m = p.crs.EPSG3857, v = a.util, _ = v.defined, w = v.limitValue, b = v.renderPos, y = v.valueOrDefault, k = "k-", x = .9, C = .93, S = "DOMMouseScroll mousewheel", T = 5, D = s.extend({ init: function(e, n) { a.destroy(e), s.fn.init.call(this, e), this._initOptions(n), this.bind(this.events, n), this.crs = new m, this.element.addClass(k + this.options.name.toLowerCase()).css("position", "relative").empty().append(t.createElement("div")), this._viewOrigin = this._getOrigin(), this._initScroller(), this._initMarkers(), this._initControls(), this._initLayers(), this._reset(), this._mousewheel = o(this._mousewheel, this), this.element.bind("click", o(this._click, this)), this.element.bind(S, this._mousewheel) }, options: { name: "Map", controls: { attribution: !0, navigator: { panStep: 100 }, zoom: !0 }, layers: [], layerDefaults: { shape: { style: { fill: { color: "#fff" }, stroke: { color: "#aaa", width: .5 } } }, bubble: { style: { fill: { color: "#fff", opacity: .5 }, stroke: { color: "#aaa", width: .5 } } }, marker: { shape: "pinTarget", tooltip: { position: "top" } } }, center: [0, 0], zoom: 3, minSize: 256, minZoom: 1, maxZoom: 19, markers: [], markerDefaults: { shape: "pinTarget", tooltip: { position: "top" } }, wraparound: !0 }, events: ["beforeReset", "click", "reset", "pan", "panEnd", "markerActivate", "markerClick", "markerCreated", "shapeClick", "shapeCreated", "shapeMouseEnter", "shapeMouseLeave", "zoomStart", "zoomEnd"], destroy: function() { this.scroller.destroy(), this.navigator && this.navigator.destroy(), this.attribution && this.attribution.destroy(), this.zoomControl && this.zoomControl.destroy(), this.markers.destroy(); for (var e = 0; this.layers.length > e; e++) this.layers[e].destroy(); s.fn.destroy.call(this) }, zoom: function(e) { var t = this.options; return _(e) ? (e = w(e, t.minZoom, t.maxZoom), t.zoom !== e && (t.zoom = e, this._reset()), this) : t.zoom }, center: function(e) { return e ? (this.options.center = g.create(e).toArray(), this._reset(), this) : g.create(this.options.center) }, extent: function(e) { return e ? (this._setExtent(e), this) : this._getExtent() }, setOptions: function(e) { s.fn.setOptions.call(this, e), this._reset() }, locationToLayer: function(e, t) { var n = !this.options.wraparound; return e = g.create(e), this.crs.toPoint(e, this._layerSize(t), n) }, layerToLocation: function(e, t) { var n = !this.options.wraparound; return e = h.create(e), this.crs.toLocation(e, this._layerSize(t), n) }, locationToView: function(e) { var t, n; return e = g.create(e), t = this.locationToLayer(this._viewOrigin), n = this.locationToLayer(e), n.translateWith(t.scale(-1)) }, viewToLocation: function(e, t) { var n = this.locationToLayer(this._getOrigin(), t); return e = h.create(e), e = e.clone().translateWith(n), this.layerToLocation(e, t) }, eventOffset: function(e) { var t = this.element.offset(), n = e.originalEvent || e, i = y(n.pageX, n.clientX) - t.left, r = y(n.pageY, n.clientY) - t.top; return new u.Point(i, r) }, eventToView: function(e) { var t = this.eventOffset(e); return this.locationToView(this.viewToLocation(t)) }, eventToLayer: function(e) { return this.locationToLayer(this.eventToLocation(e)) }, eventToLocation: function(e) { var t = this.eventOffset(e); return this.viewToLocation(t) }, viewSize: function() { var e = this.element, t = this._layerSize(), n = e.width(); return this.options.wraparound || (n = i(t, n)), { width: n, height: i(t, e.height()) } }, exportVisual: function() { return this._reset(), !1 }, _setOrigin: function(e, t) { var n, i = this.viewSize(); return e = this._origin = g.create(e), n = this.locationToLayer(e, t), n.x += i.width / 2, n.y += i.height / 2, this.options.center = this.layerToLocation(n, t).toArray(), this }, _getOrigin: function(e) { var t, n = this.viewSize(); return (e || !this._origin) && (t = this.locationToLayer(this.center()), t.x -= n.width / 2, t.y -= n.height / 2, this._origin = this.layerToLocation(t)), this._origin }, _setExtent: function(e) { var t, i, r, o, a, s, l; for (e = f.create(e), this.center(e.center()), t = this.element.width(), i = this.element.height(), r = this.options.maxZoom; r >= this.options.minZoom && (o = this.locationToLayer(e.nw, r), a = this.locationToLayer(e.se, r), s = n.abs(a.x - o.x), l = n.abs(a.y - o.y), !(t >= s && i >= l)); r--); this.zoom(r) }, _getExtent: function() { var e, t = this._getOrigin(), n = this.locationToLayer(t), i = this.viewSize(); return n.x += i.width, n.y += i.height, e = this.layerToLocation(n), new f(t, e) }, _zoomAround: function(e, t) { this._setOrigin(this.layerToLocation(e, t), t), this.zoom(t) }, _initControls: function() { var e = this.options.controls; d.Attribution && e.attribution && this._createAttribution(e.attribution), a.support.mobileOS || (d.Navigator && e.navigator && this._createNavigator(e.navigator), d.ZoomControl && e.zoom && this._createZoomControl(e.zoom)) }, _createControlElement: function(t, n) { var i = t.position || n, r = "." + b(i).replace(" ", "."), o = e(".k-map-controls" + r, this.element); return 0 === o.length && (o = e("<div>").addClass("k-map-controls " + b(i)).appendTo(this.element)), e("<div>").appendTo(o) }, _createAttribution: function(e) { var t = this._createControlElement(e, "bottomRight"); this.attribution = new d.Attribution(t, e) }, _createNavigator: function(e) { var t = this._createControlElement(e, "topLeft"), n = this.navigator = new d.Navigator(t, e); this._navigatorPan = o(this._navigatorPan, this), n.bind("pan", this._navigatorPan), this._navigatorCenter = o(this._navigatorCenter, this), n.bind("center", this._navigatorCenter) }, _navigatorPan: function(e) { var t = this, n = t.scroller, i = n.scrollLeft + e.x, r = n.scrollTop - e.y, o = this._virtualSize, a = this.element.height(), s = this.element.width(); i = w(i, o.x.min, o.x.max - s), r = w(r, o.y.min, o.y.max - a), t.scroller.one("scroll", function(e) { t._scrollEnd(e) }), t.scroller.scrollTo(-i, -r) }, _navigatorCenter: function() { this.center(this.options.center) }, _createZoomControl: function(e) { var t = this._createControlElement(e, "topLeft"), n = this.zoomControl = new d.ZoomControl(t, e); this._zoomControlChange = o(this._zoomControlChange, this), n.bind("change", this._zoomControlChange) }, _zoomControlChange: function(e) { this.trigger("zoomStart", { originalEvent: e }) || (this.zoom(this.zoom() + e.delta), this.trigger("zoomEnd", { originalEvent: e })) }, _initScroller: function() { var e = a.support.mobileOS ? C : x, t = this.options.zoomable !== !1, n = this.scroller = new a.mobile.ui.Scroller(this.element.children(0), { friction: e, velocityMultiplier: T, zoom: t, mousewheelScrolling: !1 }); n.bind("scroll", o(this._scroll, this)), n.bind("scrollEnd", o(this._scrollEnd, this)), n.userEvents.bind("gesturestart", o(this._scaleStart, this)), n.userEvents.bind("gestureend", o(this._scale, this)), this.scrollElement = n.scrollElement }, _initLayers: function() { var e, t, n, i, r, o = this.options.layers, a = this.layers = []; for (e = 0; o.length > e; e++) t = o[e], n = t.type || "shape", i = this.options.layerDefaults[n], r = c.map.layers[n], a.push(new r(this, l({}, i, t))) }, _initMarkers: function() { this.markers = new p.layers.MarkerLayer(this, this.options.markerDefaults), this.markers.add(this.options.markers) }, _scroll: function(e) { var t = this.locationToLayer(this._viewOrigin).round(), n = e.sender.movable, i = new u.Point(n.x, n.y).scale(-1).scale(1 / n.scale); t.x += i.x, t.y += i.y, this._scrollOffset = i, this._setOrigin(this.layerToLocation(t)), this.trigger("pan", { originalEvent: e, origin: this._getOrigin(), center: this.center() }) }, _scrollEnd: function(e) { this._scrollOffset && this._panComplete() && (this._scrollOffset = null, this._panEndTS = new Date, this.trigger("panEnd", { originalEvent: e, origin: this._getOrigin(), center: this.center() })) }, _panComplete: function() { return new Date - (this._panEndTS || 0) > 50 }, _scaleStart: function(e) { if (this.trigger("zoomStart", { originalEvent: e })) { var t = e.touches[1]; t && t.cancel() } }, _scale: function(e) { var t = this.scroller.movable.scale, n = this._scaleToZoom(t), i = new u.Point(e.center.x, e.center.y), r = this.viewToLocation(i, n), o = this.locationToLayer(r, n), a = o.translate(-i.x, -i.y); this._zoomAround(a, n), this.trigger("zoomEnd", { originalEvent: e }) }, _scaleToZoom: function(e) { var t = this._layerSize() * e, i = t / this.options.minSize, r = n.log(i) / n.log(2); return n.round(r) }, _reset: function() { this.attribution && this.attribution.filter(this.center(), this.zoom()), this._viewOrigin = this._getOrigin(!0), this._resetScroller(), this.trigger("beforeReset"), this.trigger("reset") }, _resetScroller: function() { var e, t, n, i, o = this.scroller, a = o.dimensions.x, s = o.dimensions.y, l = this._layerSize(), c = 20 * l, d = this.extent().nw, u = this.locationToLayer(d).round(); o.movable.round = !0, o.reset(), o.userEvents.cancel(), e = this.options.maxZoom - this.zoom(), o.dimensions.maxScale = r(2, e), t = { min: -u.x, max: l - u.x }, n = { min: -u.y, max: l - u.y }, this.options.wraparound && (t.min = -c, t.max = c), this.options.pannable === !1 && (i = this.viewSize(), t.min = n.min = 0, t.max = i.width, n.max = i.height), a.makeVirtual(), s.makeVirtual(), a.virtualSize(t.min, t.max), s.virtualSize(n.min, n.max), this._virtualSize = { x: t, y: n } }, _renderLayers: function() { var e, t, n, i, r, o = this.options.layers, a = this.layers = [], s = this.scrollWrap; for (s.empty(), e = 0; o.length > e; e++) t = o[e], n = t.type || "shape", i = this.options.layerDefaults[n], r = c.map.layers[n], a.push(new r(this, l({}, i, t))) }, _layerSize: function(e) { return e = y(e, this.options.zoom), this.options.minSize * r(2, e) }, _click: function(e) { if (this._panComplete()) { var t = this.eventOffset(e); this.trigger("click", { originalEvent: e, location: this.viewToLocation(t) }) } }, _mousewheel: function(e) { var t, n, i, r, o, a, s, l; e.preventDefault(), t = c.mwDelta(e) > 0 ? -1 : 1, n = this.options, i = this.zoom(), r = w(i + t, n.minZoom, n.maxZoom), n.zoomable !== !1 && r !== i && (this.trigger("zoomStart", { originalEvent: e }) || (o = this.eventOffset(e), a = this.viewToLocation(o), s = this.locationToLayer(a, r), l = s.translate(-o.x, -o.y), this._zoomAround(l, r), this.trigger("zoomEnd", { originalEvent: e }))) } }); c.ui.plugin(D) }(window.kendo.jQuery), function(e, t) { function n(e, n, i) { function r(e) { for (var t = 1; e * t % 1;) t *= 10; return t } var o, a, s, l; if (t === e || t === n) return []; if (i && u.sign(n - e) != u.sign(i)) throw "The sign of the increment should allow to reach the stop-value."; if (i = i || 1, e = e || 0, n = n || e, (n - e) / i === 1 / 0) throw "Infinite range defined."; if (o = [], a = -1, l = r(Math.abs(i)), e *= l, n *= l, i *= l, e > n && i > 0 && (i = -i), 0 > i) for (; (s = e + i * ++a) >= n;) o.push(s / l); else for (; (s = e + i * ++a) <= n;) o.push(s / l); return o } function i(e, t) { if (e == t) return 0; var n = t.x - e.x, i = e.y - t.y, r = Math.atan(n / i); return i >= 0 ? 0 > n ? r + 2 * Math.PI : r : r + Math.PI } var r, o, a = window.kendo, s = a.dataviz.diagram = {}, l = a.deepExtend, c = e.isArray, d = 1e-6, u = {}; l(u, { isNearZero: function(e) { return Math.abs(e) < d }, isDefined: function(e) { return t !== e }, isUndefined: function(e) { return t === e || null === e }, isObject: function(e) { return e === Object(e) }, has: function(e, t) { return Object.hasOwnProperty.call(e, t) }, isString: function(e) { return "[object String]" == Object.prototype.toString.call(e) }, isBoolean: function(e) { return "[object Boolean]" == Object.prototype.toString.call(e) }, isType: function(e, t) { return Object.prototype.toString.call(e) == "[object " + t + "]" }, isNumber: function(e) { return !isNaN(parseFloat(e)) && isFinite(e) }, isEmpty: function(e) { if (null === e) return !0; if (c(e) || u.isString(e)) return 0 === e.length; for (var t in e) if (u.has(e, t)) return !1; return !0 }, simpleExtend: function(e, t) { if (u.isObject(t)) for (var n in t) e[n] = t[n] }, initArray: function(e, t) { var n, i = []; for (n = 0; e > n; ++n) i[n] = t; return i }, serializePoints: function(e) { var t, n, i = []; for (t = 0; e.length > t; t++) n = e[t], i.push(n.x + ";" + n.y); return i.join(";") }, deserializePoints: function(e) { var t, n = e.split(";"), i = []; if (n.length % 2 !== 0) throw "Not an array of points."; for (t = 0; n.length > t; t += 2) i.push(new s.Point(parseInt(n[t], 10), parseInt(n[t + 1], 10))); return i }, randomInteger: function(e, t) { return parseInt(Math.floor(Math.random() * t) + e, 10) }, DFT: function(e, t) { var n, i; if (t(e), e.childNodes) for (n = 0; e.childNodes.length > n; n++) i = e.childNodes[n], this.DFT(i, t) }, getMatrixAngle: function(e) { return null === e || 0 === e.d ? 0 : 180 * Math.atan2(e.b, e.d) / Math.PI }, getMatrixScaling: function(e) { var t = Math.sqrt(e.a * e.a + e.c * e.c), n = Math.sqrt(e.b * e.b + e.d * e.d); return [t, n] } }), u.sign = function(e) { return e ? 0 > e ? -1 : 1 : 0 }, u.findAngle = function(e, t) { return 180 * i(e, t) / Math.PI }, u.forEach = function(e, t, n) { for (var i = 0; e.length > i; i++) t.call(n, e[i], i, e) }, u.any = function(e, t) { for (var n = 0; e.length > n; ++n) if (t(e[n])) return e[n]; return null }, u.remove = function(e, t) { for (var n; - 1 !== (n = u.indexOf(e, t));) e.splice(n, 1); return e }, u.contains = function(e, t) { return -1 !== u.indexOf(e, t) }, u.indexOf = function(t, n) { return e.inArray(n, t) }, u.fold = function(e, t, n, i) { var r, o, a = arguments.length > 2; for (r = 0; e.length > r; r++) o = e[r], a ? n = t.call(i, n, o, r, e) : (n = o, a = !0); if (!a) throw "Reduce of empty array with no initial value"; return n }, u.find = function(e, t, n) { var i; return u.any(e, function(e, r, o) { return t.call(n, e, r, o) ? (i = e, !0) : !1 }), i }, u.first = function(e, t, n) { return 0 === e.length ? null : u.isUndefined(t) ? e[0] : u.find(e, t, n) }, u.insert = function(e, t, n) { return e.splice(n, 0, t), e }, u.all = function(e, t, n) { var i, r, o = !0; for (r = 0; e.length > r && (i = e[r], o = o && t.call(n, i, r, e), o); r++); return o }, u.clear = function(e) { e.splice(0, e.length) }, u.bisort = function(e, t, n) { if (u.isUndefined(e)) throw "First array is not specified."; if (u.isUndefined(t)) throw "Second array is not specified."; if (e.length != t.length) throw "The two arrays should have equal length"; var i, r = []; for (i = 0; e.length > i; i++) r.push({ x: e[i], y: t[i] }); for (r.sort(u.isUndefined(n) ? function(e, t) { return e.x - t.x } : function(e, t) { return n(e.x, t.x) }), u.clear(e), u.clear(t), i = 0; r.length > i; i++) e.push(r[i].x), t.push(r[i].y) }, u.addRange = function(e, t) { e.push.apply(e, t) }, r = { easeInOut: function(e) { return -Math.cos(e * Math.PI) / 2 + .5 } }, o = a.Class.extend({ init: function() { this.adapters = [], this.target = 0, this.tick = 0, this.interval = 20, this.duration = 800, this.lastTime = null, this.handlers = []; var e = this; this.transition = r.easeInOut, this.timerDelegate = function() { e.onTimerEvent() } }, addAdapter: function(e) { this.adapters.push(e) }, onComplete: function(e) { this.handlers.push(e) }, removeHandler: function(t) { this.handlers = e.grep(this.handlers, function(e) { return e !== t }) }, trigger: function() { var e = this; this.handlers && u.forEach(this.handlers, function(t) { return t.call(null !== e.caller ? e.caller : e) }) }, onStep: function() {}, seekTo: function(e) { this.seekFromTo(this.tick, e) }, seekFromTo: function(e, t) { this.target = Math.max(0, Math.min(1, t)), this.tick = Math.max(0, Math.min(1, e)), this.lastTime = (new Date).getTime(), this.intervalId || (this.intervalId = window.setInterval(this.timerDelegate, this.interval)) }, stop: function() { this.intervalId && (window.clearInterval(this.intervalId), this.intervalId = null, this.trigger()) }, play: function(e) { 0 !== this.adapters.length && (null !== e && (this.caller = e), this.initState(), this.seekFromTo(0, 1)) }, reverse: function() { this.seekFromTo(1, 0) }, initState: function() { if (0 !== this.adapters.length) for (var e = 0; this.adapters.length > e; e++) this.adapters[e].initState() }, propagate: function() { var e, t = this.transition(this.tick); for (e = 0; this.adapters.length > e; e++) this.adapters[e].update(t) }, onTimerEvent: function() { var e, t = (new Date).getTime(), n = t - this.lastTime; this.lastTime = t, e = n / this.duration * (this.target > this.tick ? 1 : -1), Math.abs(e) >= Math.abs(this.tick - this.target) ? this.tick = this.target : this.tick += e; try { this.propagate() } finally { this.onStep.call(this), this.target == this.tick && this.stop() } } }), a.deepExtend(s, { init: function(e) { a.init(e, s.ui) }, Utils: u, Range: n, Ticker: o }) }(window.kendo.jQuery), function(e, t) { function n(e) { return Math.abs(e) < z } function i(e, t, i, r, o) { var a, s, l, c, d = (t.x - e.x) * (r.y - i.y) - (t.y - e.y) * (r.x - i.x); if (!n(d) && (a = (e.y - i.y) * (r.x - i.x) - (e.x - i.x) * (r.y - i.y), s = (e.y - i.y) * (t.x - e.x) - (e.x - i.x) * (t.y - e.y), l = a / d, c = s / d, !o || !(0 > l || l > 1 || 0 > c || c > 1))) return new A(e.x + l * (t.x - e.x), e.y + l * (t.y - e.y)) } function r(e, t) { var n, i, r; do n = 2 * Math.random() - 1, i = 2 * Math.random() - 1, r = n * n + i * i; while (!r || r > 1); return e + t * n * Math.sqrt(-2 * Math.log(r) / r) } function o(e) { var t, n, i; for (D.isUndefined(e) && (e = 10), t = "", n = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", i = e; i > 0; --i) t += n.charAt(Math.round(Math.random() * (n.length - 1))); return t } var a, s, l, c, d, u, h, p, f, g, m, v, _, w, b, y, k = window.kendo, x = k.dataviz.diagram, C = k.Class, S = k.deepExtend, T = k.dataviz, D = x.Utils, A = T.Point2D, E = k.isFunction, I = D.contains, P = e.map, M = 3, z = 1e-6; S(A.fn, { plus: function(e) { return new A(this.x + e.x, this.y + e.y) }, minus: function(e) { return new A(this.x - e.x, this.y - e.y) }, offset: function(e) { return new A(this.x - e, this.y - e) }, times: function(e) { return new A(this.x * e, this.y * e) }, normalize: function() { return 0 === this.length() ? new A : this.times(1 / this.length()) }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y) }, toString: function() { return "(" + this.x + "," + this.y + ")" }, lengthSquared: function() { return this.x * this.x + this.y * this.y }, middleOf: function(e, t) { return new A(t.x - e.x, t.y - e.y).times(.5).plus(e) }, toPolar: function(e) { var t, n, i, r = 1; if (e && (r = 180 / Math.PI), t = Math.atan2(Math.abs(this.y), Math.abs(this.x)), n = Math.PI / 2, i = this.length(), 0 === this.x) { if (0 === this.y) return new u(0, 0); if (this.y > 0) return new u(i, r * n); if (0 > this.y) return new u(i, 3 * r * n) } else if (this.x > 0) { if (0 === this.y) return new u(i, 0); if (this.y > 0) return new u(i, r * t); if (0 > this.y) return new u(i, r * (4 * n - t)) } else { if (0 === this.y) return new u(i, 2 * n); if (this.y > 0) return new u(i, r * (2 * n - t)); if (0 > this.y) return new u(i, r * (2 * n + t)) } }, isOnLine: function(e, t) { var n, i, r, o, a; return e.x > t.x && (n = t, t = e, e = n), i = new s(e.x, e.y).inflate(M, M), r = new s(t.x, t.y).inflate(M, M), i.union(r).contains(this) ? e.x === t.x || e.y === t.y ? !0 : (t.y > e.y ? (o = i.x + (r.x - i.x) * (this.y - (i.y + i.height)) / (r.y + r.height - (i.y + i.height)), a = i.x + i.width + (r.x + r.width - (i.x + i.width)) * (this.y - i.y) / (r.y - i.y)) : (o = i.x + (r.x - i.x) * (this.y - i.y) / (r.y - i.y), a = i.x + i.width + (r.x + r.width - (i.x + i.width)) * (this.y - (i.y + i.height)) / (r.y + r.height - (i.y + i.height))), this.x > o && a > this.x) : !1 } }), S(A, { parse: function(e) { var n = e.slice(1, e.length - 1), i = n.split(","), r = parseInt(i[0], 10), o = parseInt(i[1], 10); return isNaN(r) || isNaN(o) ? t : new A(r, o) } }), a = C.extend({ init: function(e, t, n) { this.point = e, this.left = t, this.right = n } }), s = C.extend({ init: function(e, t, n, i) { this.x = e || 0, this.y = t || 0, this.width = n || 0, this.height = i || 0 }, contains: function(e) { return e.x >= this.x && this.x + this.width >= e.x && e.y >= this.y && this.y + this.height >= e.y }, inflate: function(e, n) { return n === t && (n = e), this.x -= e, this.y -= n, this.width += 2 * e + 1, this.height += 2 * n + 1, this }, offset: function(e, t) { var n = e, i = t; return e instanceof A && (n = e.x, i = e.y), this.x += n, this.y += i, this }, union: function(e) { var t = Math.min(this.x, e.x), n = Math.min(this.y, e.y), i = Math.max(this.x + this.width, e.x + e.width), r = Math.max(this.y + this.height, e.y + e.height); return new s(t, n, i - t, r - n) }, center: function() { return new A(this.x + this.width / 2, this.y + this.height / 2) }, top: function() { return new A(this.x + this.width / 2, this.y) }, right: function() { return new A(this.x + this.width, this.y + this.height / 2) }, bottom: function() { return new A(this.x + this.width / 2, this.y + this.height) }, left: function() { return new A(this.x, this.y + this.height / 2) }, topLeft: function() { return new A(this.x, this.y) }, topRight: function() { return new A(this.x + this.width, this.y) }, bottomLeft: function() { return new A(this.x, this.y + this.height) }, bottomRight: function() { return new A(this.x + this.width, this.y + this.height) }, clone: function() { return new s(this.x, this.y, this.width, this.height) }, isEmpty: function() { return !this.width && !this.height }, equals: function(e) { return this.x === e.x && this.y === e.y && this.width === e.width && this.height === e.height }, rotatedBounds: function(e) { var t = this.clone(), n = this.rotatedPoints(e), i = n[0], r = n[1], o = n[2], a = n[3]; return t.x = Math.min(o.x, i.x, r.x, a.x), t.y = Math.min(o.y, i.y, r.y, a.y), t.width = Math.max(o.x, i.x, r.x, a.x) - t.x, t.height = Math.max(o.y, i.y, r.y, a.y) - t.y, t }, rotatedPoints: function(e) { var t = this, n = t.center(), i = t.bottomRight().rotate(n, 360 - e), r = t.topLeft().rotate(n, 360 - e), o = t.topRight().rotate(n, 360 - e), a = t.bottomLeft().rotate(n, 360 - e); return [r, o, i, a] }, toString: function(e) { return e = e || " ", this.x + e + this.y + e + this.width + e + this.height }, scale: function(e, t, n, i, r) { var o, a, s, l = this.topLeft(), c = this.center(); l.rotate(c, 360 - r).rotate(i, r), o = n.minus(l), a = new A(o.x * e, o.y * t), s = o.minus(a), l = l.plus(s), l.rotate(i, 360 - r).rotate(c, r), this.x = l.x, this.y = l.y, this.width *= e, this.height *= t }, zoom: function(e) { return this.x *= e, this.y *= e, this.width *= e, this.height *= e, this } }), l = C.extend({ init: function(e, t) { this.width = e, this.height = t } }), l.prototype.Empty = new l(0, 0), s.toRect = function(e) { return e instanceof s || (e = new s(e.x, e.y, e.width, e.height)), e }, s.empty = function() { return new s(0, 0, 0, 0) }, s.fromPoints = function(e, t) { if (isNaN(e.x) || isNaN(e.y) || isNaN(t.x) || isNaN(t.y)) throw "Some values are NaN."; return new s(Math.min(e.x, t.x), Math.min(e.y, t.y), Math.abs(e.x - t.x), Math.abs(e.y - t.y)) }, c = { lines: function(e, t, n, r) { return i(e, t, n, r) }, segments: function(e, t, n, r) { return i(e, t, n, r, !0) }, rectWithLine: function(e, t, n) { return c.segments(t, n, e.topLeft(), e.topRight()) || c.segments(t, n, e.topRight(), e.bottomRight()) || c.segments(t, n, e.bottomLeft(), e.bottomRight()) || c.segments(t, n, e.topLeft(), e.bottomLeft()) }, rects: function(e, t, n) { var i, r, o = t.topLeft(), a = t.topRight(), s = t.bottomLeft(), l = t.bottomRight(), d = t.center(); return n && (o = o.rotate(d, n), a = a.rotate(d, n), s = s.rotate(d, n), l = l.rotate(d, n)), i = e.contains(o) || e.contains(a) || e.contains(s) || e.contains(l) || c.rectWithLine(e, o, a) || c.rectWithLine(e, o, s) || c.rectWithLine(e, a, l) || c.rectWithLine(e, s, l), i || (o = e.topLeft(), a = e.topRight(), s = e.bottomLeft(), l = e.bottomRight(), n && (r = 360 - n, o = o.rotate(d, r), a = a.rotate(d, r), s = s.rotate(d, r), l = l.rotate(d, r)), i = t.contains(o) || t.contains(a) || t.contains(s) || t.contains(l)), i } }, d = C.extend({ init: function(e) { this.container = s.toRect(e) }, align: function(e, t) { var n, i = t.toLowerCase().split(" "); for (n = 0; i.length > n; n++) e = this._singleAlign(e, i[n]); return e }, _singleAlign: function(e, t) { return E(this[t]) ? this[t](e) : e }, left: function(e) { return this._align(e, this._left) }, center: function(e) { return this._align(e, this._center) }, right: function(e) { return this._align(e, this._right) }, stretch: function(e) { return this._align(e, this._stretch) }, top: function(e) { return this._align(e, this._top) }, middle: function(e) { return this._align(e, this._middle) }, bottom: function(e) { return this._align(e, this._bottom) }, _left: function(e, t) { t.x = e.x }, _center: function(e, t) { t.x = (e.width - t.width) / 2 || 0 }, _right: function(e, t) { t.x = e.width - t.width }, _top: function(e, t) { t.y = e.y }, _middle: function(e, t) { t.y = (e.height - t.height) / 2 || 0 }, _bottom: function(e, t) { t.y = e.height - t.height }, _stretch: function(e, t) { t.x = 0, t.y = 0, t.height = e.height, t.width = e.width }, _align: function(e, t) { return e = s.toRect(e), t(this.container, e), e } }), u = C.extend({ init: function(e, t) { this.r = e, this.angle = t } }), h = C.extend({ init: function(e, t, n, i, r, o) { this.a = e || 0, this.b = t || 0, this.c = n || 0, this.d = i || 0, this.e = r || 0, this.f = o || 0 }, plus: function(e) { this.a += e.a, this.b += e.b, this.c += e.c, this.d += e.d, this.e += e.e, this.f += e.f }, minus: function(e) { this.a -= e.a, this.b -= e.b, this.c -= e.c, this.d -= e.d, this.e -= e.e, this.f -= e.f }, times: function(e) { return new h(this.a * e.a + this.c * e.b, this.b * e.a + this.d * e.b, this.a * e.c + this.c * e.d, this.b * e.c + this.d * e.d, this.a * e.e + this.c * e.f + this.e, this.b * e.e + this.d * e.f + this.f) }, apply: function(e) { return new A(this.a * e.x + this.c * e.y + this.e, this.b * e.x + this.d * e.y + this.f) }, applyRect: function(e) { return s.fromPoints(this.apply(e.topLeft()), this.apply(e.bottomRight())) }, toString: function() { return "matrix(" + this.a + " " + this.b + " " + this.c + " " + this.d + " " + this.e + " " + this.f + ")" } }), S(h, { fromSVGMatrix: function(e) { var t = new h; return t.a = e.a, t.b = e.b, t.c = e.c, t.d = e.d, t.e = e.e, t.f = e.f, t }, fromMatrixVector: function(e) { var t = new h; return t.a = e.a, t.b = e.b, t.c = e.c, t.d = e.d, t.e = e.e, t.f = e.f, t }, fromList: function(e) { if (6 !== e.length) throw "The given list should consist of six elements."; var t = new h; return t.a = e[0], t.b = e[1], t.c = e[2], t.d = e[3], t.e = e[4], t.f = e[5], t }, translation: function(e, t) { var n = new h; return n.a = 1, n.b = 0, n.c = 0, n.d = 1, n.e = e, n.f = t, n }, unit: function() { return new h(1, 0, 0, 1, 0, 0) }, rotation: function(e, t, n) { var i = new h; return i.a = Math.cos(e * Math.PI / 180), i.b = Math.sin(e * Math.PI / 180), i.c = -i.b, i.d = i.a, i.e = t - t * i.a + n * i.b || 0, i.f = n - n * i.a - t * i.b || 0, i }, scaling: function(e, t) { var n = new h; return n.a = e, n.b = 0, n.c = 0, n.d = t, n.e = 0, n.f = 0, n }, parse: function(e) { var t, n; if (e) { if (e = e.trim(), "matrix" === e.slice(0, 6).toLowerCase()) { if (n = e.slice(7, e.length - 1).trim(), t = n.split(","), 6 === t.length) return h.fromList(P(t, function(e) { return parseFloat(e) })); if (t = n.split(" "), 6 === t.length) return h.fromList(P(t, function(e) { return parseFloat(e) })) } if ("(" === e.slice(0, 1) && ")" === e.slice(e.length - 1) && (e = e.substr(1, e.length - 1)), e.indexOf(",") > 0 && (t = e.split(","), 6 === t.length)) return h.fromList(P(t, function(e) { return parseFloat(e) })); if (e.indexOf(" ") > 0 && (t = e.split(" "), 6 === t.length)) return h.fromList(P(t, function(e) { return parseFloat(e) })) } return t } }), p = C.extend({ init: function(e, t, n, i, r, o) { this.a = e || 0, this.b = t || 0, this.c = n || 0, this.d = i || 0, this.e = r || 0, this.f = o || 0 }, fromMatrix: function(e) { var t = new p; return t.a = e.a, t.b = e.b, t.c = e.c, t.d = e.d, t.e = e.e, t.f = e.f, t } }), f = { _distanceToLineSquared: function(e, t, n) { function i(e, t) { return (e.x - t.x) * (e.x - t.x) + (e.y - t.y) * (e.y - t.y) } if (t === n) return i(e, t); var r = n.x - t.x, o = n.y - t.y, a = (e.x - t.x) * r + (e.y - t.y) * o; return 0 > a ? i(t, e) : (a = (n.x - e.x) * r + (n.y - e.y) * o, 0 > a ? i(n, e) : (a = (n.x - e.x) * o - (n.y - e.y) * r, a * a / (r * r + o * o))) }, distanceToLine: function(e, t, n) { return Math.sqrt(this._distanceToLineSquared(e, t, n)) }, distanceToPolyline: function(e, t) { var n, i, r, o, a = Number.MAX_VALUE; if (D.isUndefined(t) || 0 === t.length) return Number.MAX_VALUE; for (n = 0; t.length - 1 > n; n++) i = t[n], r = t[n + 1], o = this._distanceToLineSquared(e, i, r), a > o && (a = o); return Math.sqrt(a) } }, g = k.Class.extend({ init: function() { this._buckets = [], this.length = 0 }, add: function(e, t) { var n = this._createGetBucket(e); return D.isDefined(t) && (n.value = t), n }, get: function(e) { return this._bucketExists(e) ? this._createGetBucket(e) : null }, set: function(e, t) { this.add(e, t) }, containsKey: function(e) { return this._bucketExists(e) }, remove: function(e) { if (this._bucketExists(e)) { var t = this._hash(e); return delete this._buckets[t], this.length--, e } }, forEach: function(e) { var t, n, i, r, o = this._hashes(); for (t = 0, n = o.length; n > t; t++) i = o[t], r = this._buckets[i], D.isUndefined(r) || e(r) }, clone: function() { var e, t, n, i, r = new g, o = this._hashes(); for (e = 0, t = o.length; t > e; e++) n = o[e], i = this._buckets[n], D.isUndefined(i) || r.add(i.key, i.value); return r }, _hashes: function() { var e, t = []; for (e in this._buckets) this._buckets.hasOwnProperty(e) && t.push(e); return t }, _bucketExists: function(e) { var t = this._hash(e); return D.isDefined(this._buckets[t]) }, _createGetBucket: function(e) { var t = this._hash(e), n = this._buckets[t]; return D.isUndefined(n) && (n = { key: e }, this._buckets[t] = n, this.length++), n }, _hash: function(e) { if (D.isNumber(e)) return e; if (D.isString(e)) return this._hashString(e); if (D.isObject(e)) return this._objectHashId(e); throw "Unsupported key type." }, _hashString: function(e) { var t, n, i = 0; if (0 === e.length) return i; for (t = 0; e.length > t; t++) n = e.charCodeAt(t), i = 32 * i - i + n; return i }, _objectHashId: function(e) { var t = e._hashId; return D.isUndefined(t) && (t = o(), e._hashId = t), t } }), m = k.Observable.extend({ init: function(t) { var n, i = this; if (k.Observable.fn.init.call(i), this._hashTable = new g, this.length = 0, D.isDefined(t)) if (e.isArray(t)) for (n = 0; t.length > n; n++) this.add(t[n]); else t.forEach(function(e, t) { this.add(e, t) }, this) }, add: function(e, t) { var n = this._hashTable.get(e); n || (n = this._hashTable.add(e), this.length++, this.trigger("changed")), n.value = t }, set: function(e, t) { this.add(e, t) }, get: function(e) { var t = this._hashTable.get(e); if (t) return t.value; throw Error("Cannot find key " + e) }, containsKey: function(e) { return this._hashTable.containsKey(e) }, remove: function(e) { return this.containsKey(e) ? (this.trigger("changed"), this.length--, this._hashTable.remove(e)) : t }, forEach: function(e, t) { this._hashTable.forEach(function(n) { e.call(t, n.key, n.value) }) }, forEachValue: function(e, t) { this._hashTable.forEach(function(n) { e.call(t, n.value) }) }, forEachKey: function(e, t) { this._hashTable.forEach(function(n) { e.call(t, n.key) }) }, keys: function() { var e = []; return this.forEachKey(function(t) { e.push(t) }), e } }), v = k.Class.extend({ init: function() { this._tail = null, this._head = null, this.length = 0 }, enqueue: function(e) { var t = { value: e, next: null }; this._head ? (this._tail.next = t, this._tail = this._tail.next) : (this._head = t, this._tail = this._head), this.length++ }, dequeue: function() { if (1 > this.length) throw Error("The queue is empty."); var e = this._head.value; return this._head = this._head.next, this.length--, e }, contains: function(e) { for (var t = this._head; t;) { if (t.value === e) return !0; t = t.next } return !1 } }), _ = k.Observable.extend({ init: function(e) { var t = this; k.Observable.fn.init.call(t), this._hashTable = new g, this.length = 0, D.isDefined(e) && (e instanceof g ? e.forEach(function(e) { this.add(e) }) : e instanceof m && e.forEach(function(e, t) { this.add({ key: e, value: t }) }, this)) }, contains: function(e) { return this._hashTable.containsKey(e) }, add: function(e) { var t = this._hashTable.get(e); t || (this._hashTable.add(e, e), this.length++, this.trigger("changed")) }, get: function(e) { return this.contains(e) ? this._hashTable.get(e).value : null }, hash: function(e) { return this._hashTable._hash(e) }, remove: function(e) { this.contains(e) && (this._hashTable.remove(e), this.length--, this.trigger("changed")) }, forEach: function(e, t) { this._hashTable.forEach(function(t) { e(t.value) }, t) }, toArray: function() { var e = []; return this.forEach(function(t) { e.push(t) }), e } }), w = k.Class.extend({ init: function(e, t) { if (this.links = [], this.outgoing = [], this.incoming = [], this.weight = 1, this.id = D.isDefined(e) ? e : o(), D.isDefined(t)) { this.associatedShape = t; var n = t.bounds(); this.width = n.width, this.height = n.height, this.x = n.x, this.y = n.y } else this.associatedShape = null; this.data = null, this.type = "Node", this.shortForm = "Node '" + this.id + "'", this.isVirtual = !1 }, isIsolated: function() { return D.isEmpty(this.links) }, bounds: function(e) { return D.isDefined(e) ? (this.x = e.x, this.y = e.y, this.width = e.width, this.height = e.height, t) : new x.Rect(this.x, this.y, this.width, this.height) }, isLinkedTo: function(e) { var t = this; return D.any(t.links, function(n) { return n.getComplement(t) === e }) }, getChildren: function() { var e, t, n, i; if (0 === this.outgoing.length) return []; for (e = [], t = 0, n = this.outgoing.length; n > t; t++) i = this.outgoing[t], e.push(i.getComplement(this)); return e }, getParents: function() { var e, t, n, i; if (0 === this.incoming.length) return []; for (e = [], t = 0, n = this.incoming.length; n > t; t++) i = this.incoming[t], e.push(i.getComplement(this)); return e }, clone: function() { var e = new w; return D.isDefined(this.weight) && (e.weight = this.weight), D.isDefined(this.balance) && (e.balance = this.balance), D.isDefined(this.owner) && (e.owner = this.owner), e.associatedShape = this.associatedShape, e.x = this.x, e.y = this.y, e.width = this.width, e.height = this.height, e }, adjacentTo: function(e) { return null !== this.isLinkedTo(e) }, removeLink: function(e) { e.source === this && (D.remove(this.links, e), D.remove(this.outgoing, e), e.source = null), e.target === this && (D.remove(this.links, e), D.remove(this.incoming, e), e.target = null) }, hasLinkTo: function(e) { return D.any(this.outgoing, function(t) { return t.target === e }) }, degree: function() { return this.links.length }, incidentWith: function(e) { return I(this.links, e) }, getLinksWith: function(e) { return D.all(this.links, function(t) { return t.getComplement(this) === e }, this) }, getNeighbors: function() { var e = []; return D.forEach(this.incoming, function(t) { e.push(t.getComplement(this)) }, this), D.forEach(this.outgoing, function(t) { e.push(t.getComplement(this)) }, this), e } }), b = k.Class.extend({ init: function(e, t, n, i) { if (D.isUndefined(e)) throw "The source of the new link is not set."; if (D.isUndefined(t)) throw "The target of the new link is not set."; var r, a; r = D.isString(e) ? new w(e) : e, a = D.isString(t) ? new w(t) : t, this.source = r, this.target = a, this.source.links.push(this), this.target.links.push(this), this.source.outgoing.push(this), this.target.incoming.push(this), this.id = D.isDefined(n) ? n : o(), this.associatedConnection = D.isDefined(i) ? i : null, this.type = "Link", this.shortForm = "Link '" + this.source.id + "->" + this.target.id + "'" }, getComplement: function(e) { if (this.source !== e && this.target !== e) throw "The given node is not incident with this link."; return this.source === e ? this.target : this.source }, getCommonNode: function(e) { return this.source === e.source || this.source === e.target ? this.source : this.target === e.source || this.target === e.target ? this.target : null }, isBridging: function(e, t) { return this.source === e && this.target === t || this.source === t && this.target === e }, getNodes: function() { return [this.source, this.target] }, incidentWith: function(e) { return this.source === e || this.target === e }, adjacentTo: function(e) { return I(this.source.links, e) || I(this.target.links, e) }, changeSource: function(e) { D.remove(this.source.links, this), D.remove(this.source.outgoing, this), e.links.push(this), e.outgoing.push(this), this.source = e }, changeTarget: function(e) { D.remove(this.target.links, this), D.remove(this.target.incoming, this), e.links.push(this), e.incoming.push(this), this.target = e }, changesNodes: function(e, t) { this.source === e ? this.changeSource(t) : this.target === e && this.changeTarget(t) }, reverse: function() { var e = this.source, t = this.target; return this.source = t, D.remove(e.outgoing, this), this.source.outgoing.push(this), this.target = e, D.remove(t.incoming, this), this.target.incoming.push(this), this }, directTo: function(e) { if (this.source !== e && this.target !== e) throw "The given node is not incident with this link."; this.target !== e && this.reverse() }, createReverseEdge: function() { var e = this.clone(); return e.reverse(), e.reversed = !0, e }, clone: function() { var e = new b(this.source, this.target); return e } }), y = k.Class.extend({ init: function(e) { this.links = [], this.nodes = [], this.diagram = null, this._root = null, D.isDefined(e) ? D.isString(e) ? this.id = e : (this.diagram = e, this.id = e.id) : this.id = o(), this.bounds = new s, this._hasCachedRelationships = !1, this.type = "Graph" }, cacheRelationships: function(e) { var t, n, i; if (D.isUndefined(e) && (e = !1), !this._hasCachedRelationships || e) { for (t = 0, n = this.nodes.length; n > t; t++) i = this.nodes[t], i.children = this.getChildren(i), i.parents = this.getParents(i); this._hasCachedRelationships = !0 } }, assignLevels: function(e, t, n) { var i, r, o, a; if (!e) throw "Start node not specified."; for (D.isUndefined(t) && (t = 0), this.cacheRelationships(), D.isUndefined(n) && (n = new m, D.forEach(this.nodes, function(e) { n.add(e, !1) })), n.set(e, !0), e.level = t, i = e.children, r = 0, o = i.length; o > r; r++) a = i[r], a && !n.get(a) && this.assignLevels(a, t + 1, n) }, root: function(e) { if (D.isUndefined(e)) { if (this._root) return this._root; var t = D.first(this.nodes, function(e) { return 0 === e.incoming.length }); return t ? t : D.first(this.nodes) } this._root = e }, getConnectedComponents: function() { var e, t, n, i, r; for (this.componentIndex = 0, this.setItemIndices(), e = D.initArray(this.nodes.length, -1), t = 0; this.nodes.length > t; t++) - 1 === e[t] && (this._collectConnectedNodes(e, t), this.componentIndex++); for (n = [], i = 0; this.componentIndex > i; ++i) n[i] = new y; for (i = 0; e.length > i; ++i) r = n[e[i]], r.addNodeAndOutgoings(this.nodes[i]); return n.sort(function(e, t) { return t.nodes.length - e.nodes.length }), n }, _collectConnectedNodes: function(e, t) { e[t] = this.componentIndex; var n = this.nodes[t]; D.forEach(n.links, function(t) { var i = t.getComplement(n), r = i.index; - 1 === e[r] && this._collectConnectedNodes(e, r) }, this) }, calcBounds: function() { var e, t, n, i; if (this.isEmpty()) return this.bounds = new s; for (e = null, t = 0, n = this.nodes.length; n > t; t++) i = this.nodes[t], e = e ? e.union(i.bounds()) : i.bounds(); return this.bounds = e }, getSpanningTree: function(e) { var t, n, i, r, o, a, s, l, c, d, u, h, p = new y, f = new m; for (p.root = e.clone(), p.root.level = 0, p.root.id = e.id, f.add(e, p.root), e.level = 0, i = [], r = [], p.nodes.push(p.root), i.push(e), r.push(e), o = 1; r.length > 0;) for (a = r.pop(), s = 0; a.links.length > s; s++) l = a.links[s], c = l.getComplement(a), I(i, c) || (c.level = a.level + 1, c.level + 1 > o && (o = c.level + 1), I(r, c) || r.push(c), I(i, c) || i.push(c), f.containsKey(a) ? t = f.get(a) : (t = a.clone(), t.level = a.level, t.id = a.id, f.add(a, t)), f.containsKey(c) ? n = f.get(c) : (n = c.clone(), n.level = c.level, n.id = c.id, f.add(c, n)), d = new b(t, n), p.addLink(d)); for (u = [], h = 0; o > h; h++) u.push([]); return D.forEach(p.nodes, function(e) { u[e.level].push(e) }), p.treeLevels = u, p.cacheRelationships(), p }, takeRandomNode: function(t, n) { if (D.isUndefined(t) && (t = []), D.isUndefined(n) && (n = 4), 0 === this.nodes.length) return null; if (1 === this.nodes.length) return I(t, this.nodes[0]) ? null : this.nodes[0]; var i = e.grep(this.nodes, function(e) { return !I(t, e) && e.degree() <= n }); return D.isEmpty(i) ? null : i[D.randomInteger(0, i.length)] }, isEmpty: function() { return D.isEmpty(this.nodes) }, isHealthy: function() { return D.all(this.links, function(e) { return I(this.nodes, e.source) && I(this.nodes, e.target) }, this) }, getParents: function(e) { if (!this.hasNode(e)) throw "The given node is not part of this graph."; return e.getParents() }, getChildren: function(e) { if (!this.hasNode(e)) throw "The given node is not part of this graph."; return e.getChildren() }, addLink: function(e, n, i) { var r, o, a; if (D.isUndefined(e)) throw "The source of the link is not defined."; if (D.isUndefined(n)) { if (D.isDefined(e.type) && "Link" === e.type) return this.addExistingLink(e), t; throw "The target of the link is not defined." } return r = this.getNode(e), D.isUndefined(r) && (r = this.addNode(e)), o = this.getNode(n), D.isUndefined(o) && (o = this.addNode(n)), a = new b(r, o), D.isDefined(i) && (a.owner = i), this.links.push(a), a }, removeAllLinks: function() { for (; this.links.length > 0;) { var e = this.links[0]; this.removeLink(e) } }, addExistingLink: function(e) { var t, n; this.hasLink(e) || (this.links.push(e), this.hasNode(e.source.id) ? (t = this.getNode(e.source.id), e.changeSource(t)) : this.addNode(e.source), this.hasNode(e.target.id) ? (n = this.getNode(e.target.id), e.changeTarget(n)) : this.addNode(e.target)) }, hasLink: function(e) { if (D.isString(e)) return D.any(this.links, function(t) { return t.id === e }); if ("Link" === e.type) return I(this.links, e); throw "The given object is neither an identifier nor a Link." }, getNode: function(e) { if (D.isUndefined(e)) throw "No identifier or Node specified."; return D.isString(e) ? D.find(this.nodes, function(t) { return t.id == e }) : this.hasNode(e) ? e : null }, hasNode: function(e) { if (D.isString(e)) return D.any(this.nodes, function(t) { return t.id === e }); if (D.isObject(e)) return D.any(this.nodes, function(t) { return t === e }); throw "The identifier should be a Node or the Id (string) of a node." }, removeNode: function(e) { var t, n, i, r, o = e; if (D.isString(e) && (o = this.getNode(e)), !D.isDefined(o)) throw "The identifier should be a Node or the Id (string) of a node."; for (t = o.links, o.links = [], n = 0, i = t.length; i > n; n++) r = t[n], this.removeLink(r); D.remove(this.nodes, o) }, areConnected: function(e, t) { return D.any(this.links, function(n) { return n.source == e && n.target == t || n.source == t && n.target == e }) }, removeLink: function(e) { D.remove(this.links, e), D.remove(e.source.outgoing, e), D.remove(e.source.links, e), D.remove(e.target.incoming, e), D.remove(e.target.links, e) }, addNode: function(e, t, n) { var i = null; if (!D.isDefined(e)) throw "No Node or identifier for a new Node is given."; if (D.isString(e)) { if (this.hasNode(e)) return this.getNode(e); i = new w(e) } else { if (this.hasNode(e)) return this.getNode(e); i = e } return D.isDefined(t) && i.bounds(t), D.isDefined(n) && (i.owner = n), this.nodes.push(i), i }, addNodeAndOutgoings: function(e) { I(this.nodes, e) || this.nodes.push(e); var t = e.outgoing; e.outgoing = [], D.forEach(t, function(e) { this.addExistingLink(e) }, this) }, setItemIndices: function() { var e; for (e = 0; this.nodes.length > e; ++e) this.nodes[e].index = e; for (e = 0; this.links.length > e; ++e) this.links[e].index = e }, clone: function(e) { var t, n = new y, i = D.isDefined(e) && e === !0; return i && (n.nodeMap = new m, n.linkMap = new m), t = new m, D.forEach(this.nodes, function(e) { var r = e.clone(); t.set(e, r), n.nodes.push(r), i && n.nodeMap.set(r, e) }), D.forEach(this.links, function(e) { if (t.containsKey(e.source) && t.containsKey(e.target)) { var r = n.addLink(t.get(e.source), t.get(e.target)); i && n.linkMap.set(r, e) } }), n }, linearize: function(e) { return y.Utils.linearize(this, e) }, depthFirstTraversal: function(e, t) { var n, i; if (D.isUndefined(e)) throw "You need to supply a starting node."; if (D.isUndefined(t)) throw "You need to supply an action."; if (!this.hasNode(e)) throw "The given start-node is not part of this graph"; n = this.getNode(e), i = [], this._dftIterator(n, t, i) }, _dftIterator: function(e, t, n) { var i, r, o, a; for (t(e), n.push(e), i = e.getChildren(), r = 0, o = i.length; o > r; r++) a = i[r], I(n, a) || this._dftIterator(a, t, n) }, breadthFirstTraversal: function(e, t) { var n, i, r, o, a, s, l, c; if (D.isUndefined(e)) throw "You need to supply a starting node."; if (D.isUndefined(t)) throw "You need to supply an action."; if (!this.hasNode(e)) throw "The given start-node is not part of this graph"; for (n = this.getNode(e), i = new v, r = [], i.enqueue(n); i.length > 0;) for (o = i.dequeue(), t(o), r.push(o), a = o.getChildren(), s = 0, l = a.length; l > s; s++) c = a[s], I(r, c) || I(i, c) || i.enqueue(c) }, _stronglyConnectedComponents: function(e, t, n, i, r, o, a) { var s, l, c, d, u; for (n.add(t, a), i.add(t, a), a++, o.push(t), s = t.getChildren(), c = 0, d = s.length; d > c; c++) l = s[c], n.containsKey(l) ? I(o, l) && i.add(t, Math.min(i.get(t), n.get(l))) : (this._stronglyConnectedComponents(e, l, n, i, r, o, a), i.add(t, Math.min(i.get(t), i.get(l)))); if (i.get(t) === n.get(t)) { u = []; do l = o.pop(), u.push(l); while (l !== t); (!e || u.length > 1) && r.push(u) } }, findCycles: function(e) { var t, n, i, r, o, a, s; for (D.isUndefined(e) && (e = !0), t = new m, n = new m, i = [], r = [], o = 0, a = this.nodes.length; a > o; o++) s = this.nodes[o], t.containsKey(s) || this._stronglyConnectedComponents(e, s, t, n, i, r, 0); return i }, isAcyclic: function() { return D.isEmpty(this.findCycles()) }, isSubGraph: function(e) { var t = e.linearize(), n = this.linearize(); return D.all(t, function(e) { return I(n, e) }) }, makeAcyclic: function() { var e, t, n, i, r, o, a, s, l, c, d, u, h, p, f, g, v, _, w, b, y, k, x, C, S, T, A, E, I, P, M, z; if (this.isEmpty() || 1 >= this.nodes.length || 1 >= this.links.length) return []; if (2 == this.nodes.length) { if (e = [], this.links.length > 1) for (t = this.links[0], n = t.source, i = 0, r = this.links.length; r > i; i++) o = this.links[i], o.source != n && (a = o.reverse(), e.push(a)); return e } for (s = this.clone(!0), l = this.nodes.length, c = new m, d = function(e) { return 0 === e.outgoing.length ? 2 - l : 0 === e.incoming.length ? l - 2 : e.outgoing.length - e.incoming.length }, u = function(e, t) { var n = d(e, l); t.containsKey(n) || t.set(n, []), t.get(n).push(e) }, D.forEach(s.nodes, function(e) { u(e, c) }), h = [], p = []; s.nodes.length > 0;) { if (c.containsKey(2 - l)) for (_ = c.get(2 - l); _.length > 0;) { for (g = _.pop(), w = 0; g.links.length > w; w++) b = g.links[w], f = b.getComplement(g), v = d(f, l), D.remove(c.get(v), f), f.removeLink(b), u(f, c); D.remove(s.nodes, g), p.unshift(g) } if (c.containsKey(l - 2)) for (y = c.get(l - 2); y.length > 0;) { for (f = y.pop(), k = 0; f.links.length > k; k++) x = f.links[k], g = x.getComplement(f), v = d(g, l), D.remove(c.get(v), g), g.removeLink(x), u(g, c); h.push(f), D.remove(s.nodes, f) } if (s.nodes.length > 0) for (C = l - 3; C > 2 - l; C--) if (c.containsKey(C) && c.get(C).length > 0) { for (S = c.get(C), T = S.pop(), A = 0; T.links.length > A; A++) E = T.links[A], I = E.getComplement(T), v = d(I, l), D.remove(c.get(v), I), I.removeLink(E), u(I, c); h.push(T), D.remove(s.nodes, T); break } } for (h = h.concat(p), P = new m, M = 0; this.nodes.length > M; M++) P.set(s.nodeMap.get(h[M]), M); return z = [], D.forEach(this.links, function(e) { P.get(e.source) > P.get(e.target) && (e.reverse(), z.push(e)) }), z } }), y.Predefined = { EightGraph: function() { return y.Utils.parse(["1->2", "2->3", "3->4", "4->1", "3->5", "5->6", "6->7", "7->3"]) }, Mindmap: function() { return y.Utils.parse(["0->1", "0->2", "0->3", "0->4", "0->5", "1->6", "1->7", "7->8", "2->9", "9->10", "9->11", "3->12", "12->13", "13->14", "4->15", "4->16", "15->17", "15->18", "18->19", "18->20", "14->21", "14->22", "5->23", "23->24", "23->25", "6->26"]) }, ThreeGraph: function() { return y.Utils.parse(["1->2", "2->3", "3->1"]) }, BinaryTree: function(e) { return D.isUndefined(e) && (e = 5), y.Utils.createBalancedTree(e, 2) }, Linear: function(e) { return D.isUndefined(e) && (e = 10), y.Utils.createBalancedTree(e, 1) }, Tree: function(e, t) { return y.Utils.createBalancedTree(e, t) }, Forest: function(e, t, n) { return y.Utils.createBalancedForest(e, t, n) }, Workflow: function() { return y.Utils.parse(["0->1", "1->2", "2->3", "1->4", "4->3", "3->5", "5->6", "6->3", "6->7", "5->4"]) }, Grid: function(e, t) { var n, i, r, o, a, s = new x.Graph; if (0 >= e && 0 >= t) return s; for (n = 0; e + 1 > n; n++) for (i = null, r = 0; t + 1 > r; r++) o = new w("" + n + "." + r), s.addNode(o), i && s.addLink(i, o), n > 0 && (a = s.getNode("" + (n - 1) + "." + r), s.addLink(a, o)), i = o; return s } }, y.Utils = { parse: function(e) { var t, n, i, r, o, a = new x.Graph, s = e.slice(); for (n = 0, i = s.length; i > n; n++) { if (r = s[n], D.isString(r)) { if (r.indexOf("->") < 0) throw "The link should be specified as 'a->b'."; if (o = r.split("->"), 2 != o.length) throw "The link should be specified as 'a->b'."; t = new b(o[0], o[1]), a.addLink(t) } if (D.isObject(r)) { if (!t) throw "Specification found before Link definition."; k.deepExtend(t, r) } } return a }, linearize: function(e, t) { var n, i, r, o; if (D.isUndefined(e)) throw "Expected an instance of a Graph object in slot one."; for (D.isUndefined(t) && (t = !1), n = [], i = 0, r = e.links.length; r > i; i++) o = e.links[i], n.push(o.source.id + "->" + o.target.id), t && n.push({ id: o.id }); return n }, _addShape: function(e, t, n, i) { return D.isUndefined(t) && (t = new x.Point(0, 0)), D.isUndefined(n) && (n = o()), i = k.deepExtend({ width: 20, height: 20, id: n, radius: 10, fill: "#778899", data: "circle", undoable: !1, x: t.x, y: t.y }, i), e.addShape(i) }, _addConnection: function(e, t, n, i) { return e.connect(t, n, i) }, createDiagramFromGraph: function(e, t, n, i) { var r, o, a, l, c, d, u, h, p, f, g, m, v, _, w, b; if (D.isUndefined(e)) throw "The diagram surface is undefined."; if (D.isUndefined(t)) throw "No graph specification defined."; for (D.isUndefined(n) && (n = !0), D.isUndefined(i) && (i = !1), r = e.element.clientWidth || 200, o = e.element.clientHeight || 200, a = [], d = 0, u = t.nodes.length; u > d; d++) l = t.nodes[d], h = l.position, D.isUndefined(h) && (h = D.isDefined(l.x) && D.isDefined(l.y) ? new A(l.x, l.y) : new A(D.randomInteger(10, r - 20), D.randomInteger(10, o - 20))), p = {}, "0" === l.id || i && k.deepExtend(p, { width: 150 * Math.random() + 20, height: 80 * Math.random() + 50, data: "rectangle", fill: { color: "#778899" } }), c = this._addShape(e, h, l.id, p), f = c.bounds(), D.isDefined(f) && (l.x = f.x, l.y = f.y, l.width = f.width, l.height = f.height), a[l.id] = c; for (g = 0; t.links.length > g; g++) m = t.links[g], v = a[m.source.id], D.isUndefined(v) || (_ = a[m.target.id], D.isUndefined(_) || this._addConnection(e, v, _, { id: m.id })); if (n) for (w = new e.SpringLayout(e), w.layoutGraph(t, { limitToView: !1 }), b = 0; t.nodes.length > b; b++) l = t.nodes[b], c = a[l.id], c.bounds(new s(l.x, l.y, l.width, l.height)) }, createBalancedTree: function(e, t) { var n, i, r, o, a, s, l, c, d, u; if (D.isUndefined(e) && (e = 3), D.isUndefined(t) && (t = 3), n = new x.Graph, i = -1, r = [], 0 >= e || 0 >= t) return n; for (a = new w("" + ++i), n.addNode(a), n.root = a, r.push(a), s = 0; e > s; s++) { for (o = [], l = 0; r.length > l; l++) for (c = r[l], d = 0; t > d; d++) u = new w("" + ++i), n.addLink(c, u), o.push(u); r = o } return n }, createBalancedForest: function(e, t, n) { var i, r, o, a, s, l, c, d, u, h, p; if (D.isUndefined(e) && (e = 3), D.isUndefined(t) && (t = 3), D.isUndefined(n) && (n = 5), i = new x.Graph, r = -1, o = [], 0 >= e || 0 >= t || 0 >= n) return i; for (s = 0; n > s; s++) for (l = new w("" + ++r), i.addNode(l), o = [l], c = 0; e > c; c++) { for (a = [], d = 0; o.length > d; d++) for (u = o[d], h = 0; t > h; h++) p = new w("" + ++r), i.addLink(u, p), a.push(p); o = a } return i }, createRandomConnectedGraph: function(e, t, n) { var i, r, o, a, s, l, c, d, u, h; if (D.isUndefined(e) && (e = 40), D.isUndefined(t) && (t = 4), D.isUndefined(n) && (n = !1), i = new x.Graph, r = -1, 0 >= e) return i; if (o = new w("" + ++r), i.addNode(o), 1 === e) return i; if (e > 1) { for (a = 1; e > a && (s = i.takeRandomNode([], t), s); a++) l = i.addNode("" + a), i.addLink(s, l); if (!n && e > 1) for (c = D.randomInteger(1, e), d = 0; c > d; d++) u = i.takeRandomNode([], t), h = i.takeRandomNode([], t), u && h && !i.areConnected(u, h) && i.addLink(u, h); return i } }, randomDiagram: function(e, t, n, i, r) { var o = k.dataviz.diagram.Graph.Utils.createRandomConnectedGraph(t, n, i); y.Utils.createDiagramFromGraph(e, o, !1, r) } }, k.deepExtend(x, { init: function(e) { k.init(e, x.ui) }, Point: A, Intersect: c, Geometry: f, Rect: s, Size: l, RectAlign: d, Matrix: h, MatrixVector: p, normalVariable: r, randomId: o, Dictionary: m, HashTable: g, Queue: v, Set: _, Node: w, Link: b, Graph: y, PathDefiner: a }) }(window.kendo.jQuery), function(e, t) { function n(e) { return { x: e.x || 0, y: e.y || 0, width: e.width || 0, height: e.height || 0 } } function i(e) { if (e) { var t = e; return B(t) && (t = { color: t }), t.color && (t.color = r(t.color)), t } } function r(e) { var t; return t = e != W ? new O.Color(e).toHex() : e } function o(e, t) { var n = t.x - e.x, i = t.y - e.y, r = A.util.deg(Math.atan2(i, n)); return r } function a(e, t) { var n, i, r, o = this.options, a = !1; for (r = 0; t.length > r; r++) i = t[r], n = e[i], H(n) && o[i] !== n && (o[i] = n, a = !0); return a } function s(e, t) { return new O.Segment(new N.Point(e, t)) } var l, c, d, u, h, p, f, g, m, v, _, w, b, y, k, x, C, S, T, D, A = window.kendo, E = A.dataviz.diagram, I = A.Class, P = A.deepExtend, M = E.Point, z = E.Rect, F = E.Matrix, R = E.Utils, H = R.isNumber, B = R.isString, L = E.MatrixVector, N = A.geometry, O = A.drawing, V = A.util.defined, U = e.inArray, W = "transparent", j = { none: "none", arrowStart: "ArrowStart", filledCircle: "FilledCircle", arrowEnd: "ArrowEnd" }, G = 360, q = "start", $ = "end", Y = "width", Q = "height", K = "x", X = "y"; E.Markers = j, l = I.extend({ init: function(e, t) { this.x = e, this.y = t }, toMatrix: function() { return F.scaling(this.x, this.y) }, toString: function() { return A.format("scale({0},{1})", this.x, this.y) }, invert: function() { return new l(1 / this.x, 1 / this.y) } }), c = I.extend({ init: function(e, t) { this.x = e, this.y = t }, toMatrixVector: function() { return new L(0, 0, 0, 0, this.x, this.y) }, toMatrix: function() { return F.translation(this.x, this.y) }, toString: function() { return A.format("translate({0},{1})", this.x, this.y) }, plus: function(e) { this.x += e.x, this.y += e.y }, times: function(e) { this.x *= e, this.y *= e }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y) }, normalize: function() { 0 !== this.Length && this.times(1 / this.length()) }, invert: function() { return new c(-this.x, -this.y) } }), d = I.extend({ init: function(e, t, n) { this.x = t || 0, this.y = n || 0, this.angle = e }, toString: function() { return this.x && this.y ? A.format("rotate({0},{1},{2})", this.angle, this.x, this.y) : A.format("rotate({0})", this.angle) }, toMatrix: function() { return F.rotation(this.angle, this.x, this.y) }, center: function() { return new M(this.x, this.y) }, invert: function() { return new d(G - this.angle, this.x, this.y) } }), d.create = function(e) { return new d(e.angle, e.x, e.y) }, d.parse = function(e) { var t = e.slice(1, e.length - 1).split(","), n = t[0], i = t[1], r = t[2], o = new d(n, i, r); return o }, u = I.extend({ init: function(e, n, i, r, o, a) { this.translate = new c(e, n), i !== t && r !== t && (this.scale = new l(i, r)), o !== t && (this.rotate = a ? new d(o, a.x, a.y) : new d(o)) }, toString: function() { var e = function(e) { return e ? "" + e : "" }; return e(this.translate) + e(this.rotate) + e(this.scale) }, render: function(e) { e._transform = this, e._renderTransform() }, toMatrix: function() { var e = F.unit(); return this.translate && (e = e.times(this.translate.toMatrix())), this.rotate && (e = e.times(this.rotate.toMatrix())), this.scale && (e = e.times(this.scale.toMatrix())), e }, invert: function() { var e, n, i = this.rotate ? this.rotate.invert() : t, r = i ? i.toMatrix() : F.unit(), o = this.scale ? this.scale.invert() : t, a = o ? o.toMatrix() : F.unit(), s = new M(-this.translate.x, -this.translate.y); return s = r.times(a).apply(s), e = new c(s.x, s.y), n = new u, n.translate = e, n.rotate = i, n.scale = o, n } }), h = { _setScale: function() { var e = this.options, t = this._originWidth, n = this._originHeight, i = e.width / t, r = e.height / n; H(i) || (i = 1), H(r) || (r = 1), this._transform.scale = new l(i, r) }, _setTranslate: function() { var e = this.options, t = e.x || 0, n = e.y || 0; this._transform.translate = new c(t, n) }, _initSize: function() { var e = this.options, t = !1; e.autoSize !== !1 && (V(e.width) || V(e.height)) && (this._measure(!0), this._setScale(), t = !0), (V(e.x) || V(e.y)) && (this._setTranslate(), t = !0), t && this._renderTransform() }, _updateSize: function(e) { var t = !1; return this.options.autoSize !== !1 && this._diffNumericOptions(e, [Y, Q]) && (t = !0, this._measure(!0), this._setScale()), this._diffNumericOptions(e, [K, X]) && (t = !0, this._setTranslate()), t && this._renderTransform(), t } }, p = I.extend({ init: function(e) { var t = this; t.options = P({}, t.options, e), t.id = t.options.id, t._originSize = z.empty(), t._transform = new u }, visible: function(e) { return this.drawingContainer().visible(e) }, redraw: function(e) { e && e.id && (this.id = e.id) }, position: function(e, n) { var i = this.options; return V(e) ? (V(n) ? (i.x = e, i.y = n) : e instanceof M && (i.x = e.x, i.y = e.y), this._transform.translate = new c(i.x, i.y), this._renderTransform(), t) : new M(i.x, i.y) }, rotate: function(e, t) { return V(e) && (this._transform.rotate = new d(e, t.x, t.y), this._renderTransform()), this._transform.rotate || new d(0) }, drawingContainer: function() { return this.drawingElement }, _renderTransform: function() { var e = this._transform.toMatrix(); this.drawingContainer().transform(new N.Matrix(e.a, e.b, e.c, e.d, e.e, e.f)) }, _hover: function() {}, _diffNumericOptions: a, _measure: function(e) { var t, n, i; return !this._measured || e ? (n = this._boundingBox() || new N.Rect, i = n.topLeft(), t = new z(i.x, i.y, n.width(), n.height()), this._originSize = t, this._originWidth = t.width, this._originHeight = t.height, this._measured = !0) : t = this._originSize, t }, _boundingBox: function() { return this.drawingElement.rawBBox() } }), f = p.extend({ init: function(e) { p.fn.init.call(this, e), e = this.options, e.fill = i(e.fill), e.stroke = i(e.stroke) }, options: { stroke: { color: "gray", width: 1 }, fill: { color: W } }, fill: function(e, t) { this._fill({ color: r(e), opacity: t }) }, stroke: function(e, t, n) { this._stroke({ color: r(e), width: t, opacity: n }) }, redraw: function(e) { var t, n; e && (t = e.stroke, n = e.fill, t && this._stroke(i(t)), n && this._fill(i(n)), p.fn.redraw.call(this, e)) }, _hover: function(e) { var t, n = this.drawingElement, r = this.options, o = r.hover; o && o.fill && (t = e ? i(o.fill) : r.fill, n.fill(t.color, t.opacity)) }, _stroke: function(e) { var t, n = this.options; P(n, { stroke: e }), e = n.stroke, t = null, e.width > 0 && (t = { color: e.color, width: e.width, opacity: e.opacity, dashType: e.dashType }), this.drawingElement.options.set("stroke", t) }, _fill: function(e) { var t, n, i, r = this.options; P(r, { fill: e || {} }), t = r.fill, t.gradient ? (n = t.gradient, i = "radial" === n.type ? O.RadialGradient : O.LinearGradient, this.drawingElement.fill(new i(n))) : this.drawingElement.fill(t.color, t.opacity) } }), g = f.extend({ init: function(e) { this._textColor(e), f.fn.init.call(this, e), this._font(), this._initText(), this._initSize() }, options: { fontSize: 15, fontFamily: "sans-serif", stroke: { width: 0 }, fill: { color: "black" }, autoSize: !0 }, _initText: function() { var e = this.options; this.drawingElement = new O.Text(V(e.text) ? e.text : "", new N.Point, { font: e.font }), this._fill(), this._stroke() }, _textColor: function(e) { e && e.color && P(e, { fill: { color: e.color } }) }, _font: function() { var e = this.options; e.fontFamily && V(e.fontSize) ? e.font = e.fontSize + "px " + e.fontFamily : delete e.font }, content: function(e) { return this.drawingElement.content(e) }, redraw: function(e) { var t, n; e && (t = !1, n = this.options, this._textColor(e), f.fn.redraw.call(this, e), (e.fontFamily || V(e.fontSize)) && (P(n, { fontFamily: e.fontFamily, fontSize: e.fontSize }), this._font(), this.drawingElement.options.set("font", n.font), t = !0), e.text && (this.content(e.text), t = !0), !this._updateSize(e) && t && this._initSize()) } }), P(g.fn, h), m = f.extend({ init: function(e) { f.fn.init.call(this, e), this._initPath(), this._setPosition() }, _setPosition: function() { var e = this.options, t = e.x, n = e.y; (V(t) || V(n)) && this.position(t || 0, n || 0) }, redraw: function(e) { e && (f.fn.redraw.call(this, e), this._diffNumericOptions(e, [Y, Q]) && this._drawPath(), this._diffNumericOptions(e, [K, X]) && this._setPosition()) }, _initPath: function() { { var e = this.options; this.drawingElement = new O.Path({ stroke: e.stroke, closed: !0 }) } this._fill(), this._drawPath() }, _drawPath: function() { var e = this.drawingElement, t = n(this.options), i = t.width, r = t.height; e.segments.elements([s(0, 0), s(i, 0), s(i, r), s(0, r)]) } }), v = f.extend({ init: function(e) { f.fn.init.call(this, e); var t = this.options.anchor; this.anchor = new N.Point(t.x, t.y), this.createElement() }, options: { stroke: { color: W, width: 0 }, fill: { color: "black" } }, _transformToPath: function(e, t) { var n = t.transform(); return e && n && (e = e.transformCopy(n)), e }, redraw: function(e) { e && (e.position && (this.options.position = e.position), f.fn.redraw.call(this, e)) } }), _ = v.extend({ options: { radius: 4, anchor: { x: 0, y: 0 } }, createElement: function() { var e = this.options; this.drawingElement = new O.Circle(new N.Circle(this.anchor, e.radius), { fill: e.fill, stroke: e.stroke }) }, positionMarker: function(e) { var t, n, i = this.options, r = i.position, o = e.segments; t = r == q ? o[0] : o[o.length - 1], t && (n = this._transformToPath(t.anchor(), e), this.drawingElement.transform(N.transform().translate(n.x, n.y))) } }), w = v.extend({ options: { path: "M 0 0 L 10 5 L 0 10 L 3 5 z", anchor: { x: 10, y: 5 } }, createElement: function() { var e = this.options; this.drawingElement = O.Path.parse(e.path, { fill: e.fill, stroke: e.stroke }) }, positionMarker: function(e) { var t, n, i = this._linePoints(e), r = i.start, a = i.end, s = N.transform(); r && s.rotate(o(r, a), a), a && (t = this.anchor, n = a.clone().translate(-t.x, -t.y), s.translate(n.x, n.y)), this.drawingElement.transform(s) }, _linePoints: function(e) { var n, i, r, o, a, s = this.options, l = e.segments; return s.position == q ? (r = l[0], r && (i = r.anchor(), n = r.controlOut(), o = l[1], !n && o && (n = o.anchor()))) : (r = l[l.length - 1], r && (i = r.anchor(), n = r.controlIn(), a = l[l.length - 2], !n && a && (n = a.anchor()))), i ? { start: this._transformToPath(n, e), end: this._transformToPath(i, e) } : t } }), b = { _getPath: function(e) { var n = this.drawingElement; return n instanceof O.MultiPath && (n = e == q ? n.paths[0] : n.paths[n.paths.length - 1]), n && n.segments.length ? n : t }, _normalizeMarkerOptions: function(e) { var t = e.startCap, n = e.endCap; B(t) && (e.startCap = { type: t }), B(n) && (e.endCap = { type: n }) }, _removeMarker: function(e) { var t = this._markers[e]; t && (this.drawingContainer().remove(t.drawingElement), delete this._markers[e]) }, _createMarkers: function() { var e = this.options; this._normalizeMarkerOptions(e), this._markers = {}, this._markers[q] = this._createMarker(e.startCap, q), this._markers[$] = this._createMarker(e.endCap, $) }, _createMarker: function(e, n) { var i, r, o = (e || {}).type, a = this._getPath(n); return a ? (o == j.filledCircle ? i = _ : o == j.arrowStart || o == j.arrowEnd ? i = w : this._removeMarker(n), i ? (r = new i(P({}, e, { position: n })), r.positionMarker(a), this.drawingContainer().append(r.drawingElement), r) : t) : (this._removeMarker(n), t) }, _positionMarker: function(e) { var t, n = this._markers[e]; n && (t = this._getPath(e), t ? n.positionMarker(t) : this._removeMarker(e)) }, _capMap: { start: "startCap", end: "endCap" }, _redrawMarker: function(e, t, n) { var i, r, o, a, s; return this._normalizeMarkerOptions(n), i = this.options, r = this._capMap[t], o = (i[r] || {}).type, a = n[r], s = !1, a ? (i[r] = P({}, i[r], a), a.type && o != a.type ? (this._removeMarker(t), this._markers[t] = this._createMarker(i[r], t), s = !0) : this._markers[t] && this._markers[t].redraw(a)) : e && !this._markers[t] && i[r] && (this._markers[t] = this._createMarker(i[r], t), s = !0), s }, _redrawMarkers: function(e, t) { !this._redrawMarker(e, q, t) && e && this._positionMarker(q), !this._redrawMarker(e, $, t) && e && this._positionMarker($) } }, y = f.extend({ init: function(e) { f.fn.init.call(this, e), this.container = new O.Group, this._createElements(), this._initSize() }, options: { autoSize: !0 }, drawingContainer: function() { return this.container }, data: function(e) { var n = this.options; return e ? (n.data != e && (n.data = e, this._setData(e), this._initSize(), this._redrawMarkers(!0, {})), t) : n.data }, redraw: function(e) { var t, n; e && (f.fn.redraw.call(this, e), t = this.options, n = e.data, V(n) && t.data != n ? (t.data = n, this._setData(n), this._updateSize(e) || this._initSize(), this._redrawMarkers(!0, e)) : (this._updateSize(e), this._redrawMarkers(!1, e))) }, _createElements: function() { var e = this.options; this.drawingElement = O.Path.parse(e.data || "", { stroke: e.stroke }), this._fill(), this.container.append(this.drawingElement), this._createMarkers() }, _setData: function(e) { var t = this.drawingElement, n = O.Path.parse(e || ""), i = n.paths.slice(0); n.paths.elements([]), t.paths.elements(i) } }), P(y.fn, h), P(y.fn, b), k = f.extend({ init: function(e) { f.fn.init.call(this, e), this.container = new O.Group, this._initPath(), this._createMarkers() }, drawingContainer: function() { return this.container }, redraw: function(e) { var t, n; e && (e = e || {}, t = e.from, n = e.to, t && (this.options.from = t), n && (this.options.to = n), t || n ? (this._drawPath(), this._redrawMarkers(!0, e)) : this._redrawMarkers(!1, e), f.fn.redraw.call(this, e)) }, _initPath: function() { var e = this.options, t = this.drawingElement = new O.Path({ stroke: e.stroke }); this._fill(), this._drawPath(), this.container.append(t) }, _drawPath: function() { var e = this.options, t = this.drawingElement, n = e.from || new M, i = e.to || new M; t.segments.elements([s(n.x, n.y), s(i.x, i.y)]) } }), P(k.fn, b), x = f.extend({ init: function(e) { f.fn.init.call(this, e), this.container = new O.Group, this._initPath(), this._createMarkers() }, drawingContainer: function() { return this.container }, points: function(e) { var n = this.options; return e ? (n.points = e, this._updatePath(), t) : n.points }, redraw: function(e) { if (e) { var t = e.points; f.fn.redraw.call(this, e), t && this._pointsDiffer(t) ? (this.points(t), this._redrawMarkers(!0, e)) : this._redrawMarkers(!1, e) } }, _initPath: function() { var e = this.options; this.drawingElement = new O.Path({ stroke: e.stroke }), this._fill(), this.container.append(this.drawingElement), e.points && this._updatePath() }, _pointsDiffer: function(e) { var t, n = this.options.points, i = n.length !== e.length; if (!i) for (t = 0; e.length > t; t++) if (n[t].x !== e[t].x || n[t].y !== e[t].y) { i = !0; break } return i }, _updatePath: function() { var e, t, n = this.drawingElement, i = this.options, r = i.points, o = []; for (t = 0; r.length > t; t++) e = r[t], o.push(s(e.x, e.y)); n.segments.elements(o) }, options: { points: [] } }), P(x.fn, b), C = p.extend({ init: function(e) { p.fn.init.call(this, e), this._initImage() }, redraw: function(e) { e && (e.source && this.drawingElement.src(e.source), this._diffNumericOptions(e, [Y, Q, K, X]) && this.drawingElement.rect(this._rect()), p.fn.redraw.call(this, e)) }, _initImage: function() { var e = this.options, t = this._rect(); this.drawingElement = new O.Image(e.source, t, {}) }, _rect: function() { var e = n(this.options), t = new N.Point(e.x, e.y), i = new N.Size(e.width, e.height); return new N.Rect(t, i) } }), S = p.extend({ init: function(e) { this.children = [], p.fn.init.call(this, e), this.drawingElement = new O.Group, this._initSize() }, options: { autoSize: !1 }, append: function(e) { this.drawingElement.append(e.drawingContainer()), this.children.push(e), this._childrenChange = !0 }, remove: function(e) { this._remove(e) && (this._childrenChange = !0) }, _remove: function(e) { var n = U(e, this.children); return n >= 0 ? (this.drawingElement.removeAt(n), this.children.splice(n, 1), !0) : t }, clear: function() { this.drawingElement.clear(), this.children = [], this._childrenChange = !0 }, toFront: function(e) { var t, n; for (n = 0; e.length > n; n++) t = e[n], this._remove(t) && this.append(t) }, toBack: function(e) { this._reorderChildren(e, 0) }, toIndex: function(e, t) { this._reorderChildren(e, t) }, _reorderChildren: function(e, t) { var n, i, r, o, a, s = this.drawingElement, l = s.children.slice(0), c = this.children, d = H(t); for (n = 0; e.length > n; n++) a = e[n], o = a.drawingContainer(), i = U(a, c), i >= 0 && (l.splice(i, 1), c.splice(i, 1), r = d ? t : t[n], l.splice(r, 0, o), c.splice(r, 0, a)); s.clear(), s.append.apply(s, l) }, redraw: function(e) { e && (this._childrenChange ? (this._childrenChange = !1, this._updateSize(e) || this._initSize()) : this._updateSize(e), p.fn.redraw.call(this, e)) }, _boundingBox: function() { var e, t, n, i, r = this.children; for (i = 0; r.length > i; i++) t = r[i], t.visible() && t._includeInBBox !== !1 && (n = t.drawingContainer().clippedBBox(null), n && (e = e ? z.union(e, n) : n)); return e } }), P(S.fn, h), T = f.extend({ init: function(e) { f.fn.init.call(this, e), this._initCircle(), this._initSize() }, redraw: function(e) { if (e) { var t = this.options; e.center && (P(t, { center: e.center }), this._center.move(t.center.x, t.center.y)), this._diffNumericOptions(e, ["radius"]) && this._circle.setRadius(t.radius), this._updateSize(e), f.fn.redraw.call(this, e) } }, _initCircle: function() { var e, t = this.options, n = t.width, i = t.height, r = t.radius; V(r) || (V(n) || (n = i), V(i) || (i = n), t.radius = r = Math.min(n, i) / 2), e = t.center || { x: r, y: r }, this._center = new N.Point(e.x, e.y), this._circle = new N.Circle(this._center, r), this.drawingElement = new O.Circle(this._circle, { stroke: t.stroke }), this._fill() } }), P(T.fn, h), D = I.extend({ init: function(e, t) { t = t || {}, this.element = e, this.surface = O.Surface.create(e, t), A.isFunction(this.surface.translate) && (this.translate = this._translate), this.drawingElement = new O.Group, this._viewBox = new z(0, 0, t.width, t.height), this.size(this._viewBox) }, bounds: function() { var e = this.drawingElement.clippedBBox(); return new z(0, 0, e.width(), e.height()) }, size: function(e) { var t = this._viewBox; return V(e) && (t.width = e.width, t.height = e.height, this.surface.setSize(e)), { width: t.width, height: t.height } }, _translate: function(e, t) { var n = this._viewBox; return V(e) && V(t) && (n.x = e, n.y = t, this.surface.translate({ x: e, y: t })), { x: n.x, y: n.y } }, draw: function() { this.surface.draw(this.drawingElement) }, append: function(e) { return this.drawingElement.append(e.drawingContainer()), this }, remove: function(e) { this.drawingElement.remove(e.drawingContainer()) }, insertBefore: function() {}, clear: function() { this.drawingElement.clear() }, destroy: function(t) { this.surface.destroy(), t && e(this.element).remove() } }), A.deepExtend(E, { init: function(e) { A.init(e, E.ui) }, diffNumericOptions: a, Element: p, Scale: l, Translation: c, Rotation: d, Circle: T, Group: S, Rectangle: m, Canvas: D, Path: y, Line: k, MarkerBase: v, ArrowMarker: w, CircleMarker: _, Polyline: x, CompositeTransform: u, TextBlock: g, Image: C, VisualBase: f }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { e.isSelected ? t.ctrlKey && e.select(!1) : e.diagram.select(e, { addToSelection: t.ctrlKey }) } function i(e) { return e.ctrlKey === !1 && e.altKey === !1 && e.shiftKey === !1 } function r(e, t) { var n = e !== !1; return e.key && "none" != e.key && (n = t[e.key + "Key"]), n } function o(e, t) { return t.charCodeAt(0) == e || t.toUpperCase().charCodeAt(0) == e } function a(e, t) { var n; return -1 == e.x && -1 == e.y ? n = t.bottomRight() : 1 == e.x && 1 == e.y ? n = t.topLeft() : -1 == e.x && 1 == e.y ? n = t.topRight() : 1 == e.x && -1 == e.y ? n = t.bottomLeft() : 0 === e.x && -1 == e.y ? n = t.bottom() : 0 === e.x && 1 == e.y ? n = t.top() : 1 == e.x && 0 === e.y ? n = t.left() : -1 == e.x && 0 === e.y && (n = t.right()), n } function s(e) { var t = e.options.editable; return t && t.drag !== !1 } function l(e, t) { var n, i, r, o; for (o = 0; e.connectors.length > o; o++) if (n = e.connectors[o], i = n.position(), r = new q(i.x, i.y), r.inflate(at, at), r.contains(t)) return n } var c, d, u, h, p, f, g, m, v, _, w, b, y, k, x, C, S, T, D, A, E, I, P, M, z, F, R, H, B, L, N, O, V = window.kendo, U = V.dataviz, W = U.diagram, j = V.Class, G = W.Group, q = W.Rect, $ = W.Rectangle, Y = W.Utils, Q = Y.isUndefined, K = W.Point, X = W.Circle, Z = W.Ticker, J = V.deepExtend, et = V.ui.Movable, tt = V.support.browser, nt = V.util.defined, it = e.inArray, rt = e.proxy, ot = { arrow: "default", grip: "pointer", cross: "pointer", add: "pointer", move: "move", select: "pointer", south: "s-resize", east: "e-resize", west: "w-resize", north: "n-resize", rowresize: "row-resize", colresize: "col-resize" }, at = 10, st = "Auto", lt = "Top", ct = "Right", dt = "Left", ut = "Bottom", ht = 10, pt = 10, ft = "dragStart", gt = "drag", mt = "dragEnd", vt = "itemRotate", _t = "itemBoundsChange", wt = 5, bt = 5, yt = "mouseEnter", kt = "mouseLeave", xt = "zoomStart", Ct = "zoomEnd", St = -2e4, Tt = 2e4, Dt = .9, At = .93, Et = 5, It = "transparent", Pt = "pan", Mt = "rotated"; W.Cursors = ot, c = V.Class.extend({ init: function(e) { this.layoutState = e, this.diagram = e.diagram }, initState: function() { function e(e, t) { var n = this.diagram.getShapeById(e); n && (this.subjects.push(n), this.froms.push(n.bounds().topLeft()), this.tos.push(t.topLeft())) } this.froms = [], this.tos = [], this.subjects = [], this.layoutState.nodeMap.forEach(e, this) }, update: function(e) { if (!(0 >= this.subjects.length)) for (var t = 0; this.subjects.length > t; t++) this.subjects[t].position(new K(this.froms[t].x + (this.tos[t].x - this.froms[t].x) * e, this.froms[t].y + (this.tos[t].y - this.froms[t].y) * e)) } }), d = j.extend({ init: function(e, t, n) { this.animate = Q(n) ? !1 : n, this._initialState = e, this._finalState = t, this.title = "Diagram layout" }, undo: function() { this.setState(this._initialState) }, redo: function() { this.setState(this._finalState) }, setState: function(e) { var t, n = e.diagram; this.animate ? (e.linkMap.forEach(function(e, t) { var i = n.getShapeById(e); i.visible(!1), i && i.points(t) }), t = new Z, t.addAdapter(new c(e)), t.onComplete(function() { e.linkMap.forEach(function(e) { var t = n.getShapeById(e); t.visible(!0) }) }), t.play()) : (e.nodeMap.forEach(function(e, t) { var i = n.getShapeById(e); i && i.position(t.topLeft()) }), e.linkMap.forEach(function(e, t) { var i = n.getShapeById(e); i && i.points(t) })) } }), u = j.extend({ init: function(e) { this.units = [], this.title = "Composite unit", e !== t && this.units.push(e) }, add: function(e) { this.units.push(e) }, undo: function() { for (var e = 0; this.units.length > e; e++) this.units[e].undo() }, redo: function() { for (var e = 0; this.units.length > e; e++) this.units[e].redo() } }), h = j.extend({ init: function(e, t, n) { this.item = e, this._redoSource = t, this._redoTarget = n, nt(t) && (this._undoSource = e.source()), nt(n) && (this._undoTarget = e.target()), this.title = "Connection Editing" }, undo: function() { this._undoSource !== t && this.item._updateConnector(this._undoSource, "source"), this._undoTarget !== t && this.item._updateConnector(this._undoTarget, "target"), this.item.updateModel() }, redo: function() { this._redoSource !== t && this.item._updateConnector(this._redoSource, "source"), this._redoTarget !== t && this.item._updateConnector(this._redoTarget, "target"), this.item.updateModel() } }), p = j.extend({ init: function(e, t, n) { this.item = e, this._undoSource = t, this._undoTarget = n, this._redoSource = e.source(), this._redoTarget = e.target(), this.title = "Connection Editing" }, undo: function() { this.item._updateConnector(this._undoSource, "source"), this.item._updateConnector(this._undoTarget, "target"), this.item.updateModel() }, redo: function() { this.item._updateConnector(this._redoSource, "source"), this.item._updateConnector(this._redoTarget, "target"), this.item.updateModel() } }), f = j.extend({ init: function(e) { this.connection = e, this.diagram = e.diagram, this.targetConnector = e.targetConnector, this.title = "Delete connection" }, undo: function() { this.diagram._addConnection(this.connection, !1) }, redo: function() { this.diagram.remove(this.connection, !1) } }), g = j.extend({ init: function(e) { this.shape = e, this.diagram = e.diagram, this.title = "Deletion" }, undo: function() { this.diagram._addShape(this.shape, !1), this.shape.select(!1) }, redo: function() { this.shape.select(!1), this.diagram.remove(this.shape, !1) } }), m = j.extend({ init: function(e, t, n) { var i, r; for (this.shapes = e, this.undoStates = t, this.title = "Transformation", this.redoStates = [], this.adorner = n, i = 0; this.shapes.length > i; i++) r = this.shapes[i], this.redoStates.push(r.bounds()) }, undo: function() { var e, t; for (e = 0; this.shapes.length > e; e++) t = this.shapes[e], t.bounds(this.undoStates[e]), t.hasOwnProperty("layout") && t.layout(t, this.redoStates[e], this.undoStates[e]), t.updateModel(); this.adorner && (this.adorner.refreshBounds(), this.adorner.refresh()) }, redo: function() { var e, t; for (e = 0; this.shapes.length > e; e++) t = this.shapes[e], t.bounds(this.redoStates[e]), t.hasOwnProperty("layout") && t.layout(t, this.undoStates[e], this.redoStates[e]), t.updateModel(); this.adorner && (this.adorner.refreshBounds(), this.adorner.refresh()) } }), v = j.extend({ init: function(e, t) { this.connection = e, this.diagram = t, this.title = "New connection" }, undo: function() { this.diagram.remove(this.connection, !1) }, redo: function() { this.diagram._addConnection(this.connection, !1) } }), _ = j.extend({ init: function(e, t) { this.shape = e, this.diagram = t, this.title = "New shape" }, undo: function() { this.diagram.deselect(), this.diagram.remove(this.shape, !1) }, redo: function() { this.diagram._addShape(this.shape, !1) } }), w = j.extend({ init: function(e, t, n) { this.initial = e, this.finalPos = t, this.diagram = n, this.title = "Pan Unit" }, undo: function() { this.diagram.pan(this.initial) }, redo: function() { this.diagram.pan(this.finalPos) } }), b = j.extend({ init: function(e, t, n) { var i, r; for (this.shapes = t, this.undoRotates = n, this.title = "Rotation", this.redoRotates = [], this.redoAngle = e._angle, this.adorner = e, this.center = e._innerBounds.center(), i = 0; this.shapes.length > i; i++) r = this.shapes[i], this.redoRotates.push(r.rotate().angle) }, undo: function() { var e, t; for (e = 0; this.shapes.length > e; e++) t = this.shapes[e], t.rotate(this.undoRotates[e], this.center, !1), t.hasOwnProperty("layout") && t.layout(t), t.updateModel(); this.adorner && (this.adorner._initialize(), this.adorner.refresh()) }, redo: function() { var e, t; for (e = 0; this.shapes.length > e; e++) t = this.shapes[e], t.rotate(this.redoRotates[e], this.center, !1), t.hasOwnProperty("layout") && t.layout(t), t.updateModel(); this.adorner && (this.adorner._initialize(), this.adorner.refresh()) } }), y = j.extend({ init: function(e, t, n) { this.diagram = e, this.indices = n, this.items = t, this.title = "Rotate Unit" }, undo: function() { this.diagram._toIndex(this.items, this.indices) }, redo: function() { this.diagram.toFront(this.items, !1) } }), k = j.extend({ init: function(e, t, n) { this.diagram = e, this.indices = n, this.items = t, this.title = "Rotate Unit" }, undo: function() { this.diagram._toIndex(this.items, this.indices) }, redo: function() { this.diagram.toBack(this.items, !1) } }), x = V.Observable.extend({ init: function(e) { V.Observable.fn.init.call(this, e), this.bind(this.events, e), this.stack = [], this.index = 0, this.capacity = 100 }, events: ["undone", "redone"], begin: function() { this.composite = new u }, cancel: function() { this.composite = t }, commit: function(e) { this.composite.units.length > 0 && this._restart(this.composite, e), this.composite = t }, addCompositeItem: function(e) { this.composite ? this.composite.add(e) : this.add(e) }, add: function(e, t) { this._restart(e, t) }, pop: function() { this.index > 0 && (this.stack.pop(), this.index--) }, count: function() { return this.stack.length }, undo: function() { this.index > 0 && (this.index--, this.stack[this.index].undo(), this.trigger("undone")) }, redo: function() { this.stack.length > 0 && this.stack.length > this.index && (this.stack[this.index].redo(), this.index++, this.trigger("redone")) }, _restart: function(e, t) { this.stack.splice(this.index, this.stack.length - this.index), this.stack.push(e), t !== !1 ? this.redo() : this.index++, this.stack.length > this.capacity && (this.stack.splice(0, this.stack.length - this.capacity), this.index = this.capacity) }, clear: function() { this.stack = [], this.index = 0 } }), C = j.extend({ init: function(e) { this.toolService = e }, start: function() {}, move: function() {}, end: function() {}, tryActivate: function() { return !1 }, getCursor: function() { return ot.arrow } }), S = C.extend({ init: function(t) { var n, i, r, o, a = this, s = V.support.mobileOS ? At : Dt; C.fn.init.call(a, t), n = a.toolService.diagram, i = n.canvas, r = n.scroller = a.scroller = e(n.scrollable).kendoMobileScroller({ friction: s, velocityMultiplier: Et, mousewheelScrolling: !1, zoom: !1, scroll: rt(a._move, a) }).data("kendoMobileScroller"), i.translate && (a.movableCanvas = new et(i.element)), o = function(e, t, n) { e.makeVirtual(), e.virtualSize(t || St, n || Tt) }, o(r.dimensions.x), o(r.dimensions.y), r.disable() }, tryActivate: function(e, t) { var n = this.toolService, r = n.diagram.options.pannable, o = t.ctrlKey; return nt(r.key) && (o = r.key && "none" != r.key ? t[r.key + "Key"] && !(t.ctrlKey && nt(n.hoveredItem)) : i(t)), r !== !1 && o && !nt(n.hoveredAdorner) && !nt(n._hoveredConnector) }, start: function() { this.scroller.enable() }, move: function() {}, _move: function(e) { var t = this, n = t.toolService.diagram, i = n.canvas, r = new K(e.scrollLeft, e.scrollTop); i.translate ? (n._storePan(r.times(-1)), t.movableCanvas.moveTo(r), i.translate(r.x, r.y)) : r = r.plus(n._pan.times(-1)), n.trigger(Pt, { pan: r }) }, end: function() { this.scroller.disable() }, getCursor: function() { return ot.move } }), T = j.extend({ init: function(e) { this.toolService = e }, tryActivate: function() { return !0 }, start: function(e, t) { var i = this.toolService, o = i.diagram, a = i.hoveredItem, s = o.options.selectable; a && (r(s, t) && n(a, t), a.adorner && (this.adorner = a.adorner, this.handle = this.adorner._hitTest(e))), this.handle || (this.handle = o._resizingAdorner._hitTest(e), this.handle && (this.adorner = o._resizingAdorner)), this.adorner && (this.adorner.isDragHandle(this.handle) && o.trigger(ft, { shapes: this.adorner.shapes, connections: [] }) ? (i.startPoint = e, i.end(e)) : this.adorner.start(e)) }, move: function(e) { this.adorner && (this.adorner.move(this.handle, e), this.adorner.isDragHandle(this.handle) && this.toolService.diagram.trigger(gt, { shapes: this.adorner.shapes, connections: [] })) }, end: function(e, n) { var i, r = this.toolService.diagram, o = this.toolService, a = this.adorner; a && (a.isDragHandle(this.handle) && r.trigger(mt, { shapes: a.shapes, connections: [] }) ? a.cancel() : (i = a.stop(), i && r.undoRedoService.add(i, !1))), o.hoveredItem && this.toolService.triggerClick({ item: o.hoveredItem, point: e, meta: n }), this.adorner = t, this.handle = t }, getCursor: function(e) { return this.toolService.hoveredItem ? this.toolService.hoveredItem._getCursor(e) : ot.arrow } }), D = j.extend({ init: function(e) { this.toolService = e }, tryActivate: function(e, t) { var n = this.toolService, i = r(n.diagram.options.selectable, t); return i && !nt(n.hoveredItem) && !nt(n.hoveredAdorner) }, start: function(e) { var t = this.toolService.diagram; t.deselect(), t.selector.start(e) }, move: function(e) { var t = this.toolService.diagram; t.selector.move(e) }, end: function(e, t) { var n = this.toolService.diagram, i = this.toolService.hoveredItem, r = n.selector.bounds(); i && i.isSelected || t.ctrlKey || n.deselect(), r.isEmpty() || n.selectArea(r), n.selector.end() }, getCursor: function() { return ot.arrow } }), A = j.extend({ init: function(e) { this.toolService = e, this.type = "ConnectionTool" }, tryActivate: function() { return this.toolService._hoveredConnector }, start: function(e, t) { var i = this.toolService.diagram, r = this.toolService._hoveredConnector, o = i._createConnection({}, r._c, e); s(o) && !i.trigger(ft, { shapes: [], connections: [o] }) && i._addConnection(o) ? (this.toolService._connectionManipulation(o, r._c.shape, !0), this.toolService._removeHover(), n(this.toolService.activeConnection, t)) : (o.source(null), this.toolService.end(e)) }, move: function(e) { var t = this.toolService, n = t.activeConnection; return n.target(e), t.diagram.trigger(gt, { shapes: [], connections: [n] }), !0 }, end: function(e) { var t, n = this.toolService, i = n.diagram, r = n.activeConnection, o = n.hoveredItem, a = n._hoveredConnector; r && (t = a && a._c != r.sourceConnector ? a._c : o && o instanceof W.Shape ? o.getConnector(st) || o.getConnector(e) : e, r.target(t), i.trigger(mt, { shapes: [], connections: [r] }) ? (i.remove(r, !1), i.undoRedoService.pop()) : (r.updateModel(), i._syncConnectionChanges()), n._connectionManipulation()) }, getCursor: function() { return ot.arrow } }), E = j.extend({ init: function(e) { this.toolService = e, this.type = "ConnectionTool" }, tryActivate: function(e, t) { var n = this.toolService, i = n.diagram, o = i.options.selectable, a = n.hoveredItem, s = r(o, t) && a && a.path && !(a.isSelected && t.ctrlKey); return s && (this._c = a), s }, start: function(e, t) { var i, r = this._c; n(r, t), i = r.adorner, s(r) && i && !this.toolService.diagram.trigger(ft, { shapes: [], connections: [r] }) ? (this.handle = i._hitTest(e), i.start(e)) : (this.toolService.startPoint = e, this.toolService.end(e)) }, move: function(e) { var n = this._c.adorner; return s(this._c) && n ? (n.move(this.handle, e), this.toolService.diagram.trigger(gt, { shapes: [], connections: [this._c] }), !0) : t }, end: function(e, t) { var n, i = this._c, r = i.adorner, o = this.toolService, a = o.diagram; r && (o.triggerClick({ item: i, point: e, meta: t }), s(i) && (n = r.stop(e), a.trigger(mt, { shapes: [], connections: [i] }) ? n.undo() : (a.undoRedoService.add(n, !1), i.updateModel(), a._syncConnectionChanges()))) }, getCursor: function() { return ot.move } }), I = j.extend({ init: function(e) { this.diagram = e, this.tools = [new S(this), new E(this), new A(this), new D(this), new T(this)], this.activeTool = t }, start: function(e, t) { return t = J({}, t), this.activeTool && this.activeTool.end(e, t), this._updateHoveredItem(e), this._activateTool(e, t), this.activeTool.start(e, t), this._updateCursor(e), this.diagram.focus(), this.startPoint = e, !0 }, move: function(e, t) { t = J({}, t); var n = !0; return this.activeTool && (n = this.activeTool.move(e, t)), n && this._updateHoveredItem(e), this._updateCursor(e), !0 }, end: function(e, n) { return n = J({}, n), this.activeTool && this.activeTool.end(e, n), this.activeTool = t, this._updateCursor(e), !0 }, keyDown: function(e, t) { var n, i = this.diagram; if (t = J({ ctrlKey: !1, metaKey: !1, altKey: !1 }, t), !t.ctrlKey && !t.metaKey || t.altKey) { if (46 === e || 8 === e) return n = this.diagram._triggerRemove(i.select()), n.length && (this.diagram.remove(n, !0), this.diagram._syncChanges(), this.diagram._destroyToolBar()), !0; if (27 === e) return this._discardNewConnection(), i.deselect(), i._destroyToolBar(), !0 } else { if (o(e, "a")) return i.selectAll(), i._destroyToolBar(), !0; if (o(e, "z")) return i.undo(), i._destroyToolBar(), !0; if (o(e, "y")) return i.redo(), i._destroyToolBar(), !0; o(e, "c") ? (i.copy(), i._destroyToolBar()) : o(e, "x") ? (i.cut(), i._destroyToolBar()) : o(e, "v") ? (i.paste(), i._destroyToolBar()) : o(e, "l") ? (i.layout(), i._destroyToolBar()) : o(e, "d") && (i._destroyToolBar(), i.copy(), i.paste()) } }, wheel: function(e, t) { var n = this.diagram, i = t.delta, r = n.zoom(), o = n.options, a = o.zoomRate, s = { point: e, meta: t, zoom: r }; if (!n.trigger(xt, s)) return 0 > i ? r += a : r -= a, r = V.dataviz.round(Math.max(o.zoomMin, Math.min(o.zoomMax, r)), 2), s.zoom = r, n.zoom(r, s), n.trigger(Ct, s), !0 }, setTool: function(e, t) { e.toolService = this, this.tools[t] = e }, triggerClick: function(e) { this.startPoint.equals(e.point) && this.diagram.trigger("click", e) }, _discardNewConnection: function() { this.newConnection && (this.diagram.remove(this.newConnection), this.newConnection = t) }, _activateTool: function(e, t) { var n, i; for (n = 0; this.tools.length > n; n++) if (i = this.tools[n], i.tryActivate(e, t)) { this.activeTool = i; break } }, _updateCursor: function(e) { var t = this.diagram.element, n = this.activeTool ? this.activeTool.getCursor(e) : this.hoveredAdorner ? this.hoveredAdorner._getCursor(e) : this.hoveredItem ? this.hoveredItem._getCursor(e) : ot.arrow; t.css({ cursor: n }), tt.msie && 7 == tt.version && (t[0].style.cssText = t[0].style.cssText) }, _connectionManipulation: function(e, n, i) { this.activeConnection = e, this.disabledShape = n, this.newConnection = i ? this.activeConnection : t }, _updateHoveredItem: function(e) { var n = this._hitTest(e), i = this.diagram; n == this.hoveredItem || this.disabledShape && n == this.disabledShape || (this.hoveredItem && (i.trigger(kt, { item: this.hoveredItem }), this.hoveredItem._hover(!1)), n && n.options.enable ? (i.trigger(yt, { item: n }), this.hoveredItem = n, this.hoveredItem._hover(!0)) : this.hoveredItem = t) }, _removeHover: function() { this.hoveredItem && (this.hoveredItem._hover(!1), this.hoveredItem = t) }, _hitTest: function(e) { var n, i, r, o, a = this.diagram; if (this._hoveredConnector && (this._hoveredConnector._hover(!1), this._hoveredConnector = t), a._connectorsAdorner._visible && (n = a._connectorsAdorner._hitTest(e))) return n; if (n = this.diagram._resizingAdorner._hitTest(e)) { if (this.hoveredAdorner = a._resizingAdorner, 0 !== n.x || 0 !== n.y) return; n = t } else this.hoveredAdorner = t; if (!this.activeTool || "ConnectionTool" !== this.activeTool.type) { for (o = [], r = 0; a._selectedItems.length > r; r++) i = a._selectedItems[r], i instanceof W.Connection && o.push(i); n = this._hitTestItems(o, e) } return n || this._hitTestElements(e) }, _hitTestElements: function(e) { var t, n, i, r, o = this.diagram, a = this._hitTestItems(o.shapes, e), s = this._hitTestItems(o.connections, e); return this.activeTool && "ConnectionTool" == this.activeTool.type || !a || !s || l(a, e) || (n = o.mainLayer, i = it(a.visual, n.children), r = it(s.visual, n.children), t = i > r ? a : s), t || a || s }, _hitTestItems: function(e, t) { var n, i, r; for (n = e.length - 1; n >= 0; n--) if (i = e[n], r = i._hitTest(t)) return r } }), P = V.Class.extend({ init: function() {} }), M = P.extend({ init: function(e) { var t = this; P.fn.init.call(t), this.connection = e }, hitTest: function(e) { var t = this.getBounds().inflate(at); return t.contains(e) ? W.Geometry.distanceToPolyline(e, this.connection.allPoints()) < at : !1 }, getBounds: function() { var e, t = this.connection.allPoints(), n = t[0], i = t[t.length - 1], r = Math.max(n.x, i.x), o = Math.min(n.x, i.x), a = Math.min(n.y, i.y), s = Math.max(n.y, i.y); for (e = 1; t.length - 1 > e; ++e) r = Math.max(r, t[e].x), o = Math.min(o, t[e].x), a = Math.min(a, t[e].y), s = Math.max(s, t[e].y); return new q(o, a, r - o, s - a) } }), z = M.extend({ init: function(e) { var t = this; M.fn.init.call(t), this.connection = e }, route: function() {} }), F = M.extend({ SAME_SIDE_DISTANCE_RATIO: 5, init: function(e) { var t = this; M.fn.init.call(t), this.connection = e }, routePoints: function(e, t, n, i) { var r; return r = n && i ? this._connectorPoints(e, t, n, i) : this._floatingPoints(e, t, n) }, route: function() { var e = this.connection._resolvedSourceConnector, t = this.connection._resolvedTargetConnector, n = this.connection.sourcePoint(), i = this.connection.targetPoint(), r = this.routePoints(n, i, e, t); this.connection.points(r) }, _connectorSides: [{ name: "Top", axis: "y", boundsPoint: "topLeft", secondarySign: 1 }, { name: "Left", axis: "x", boundsPoint: "topLeft", secondarySign: 1 }, { name: "Bottom", axis: "y", boundsPoint: "bottomRight", secondarySign: -1 }, { name: "Right", axis: "x", boundsPoint: "bottomRight", secondarySign: -1 }], _connectorSide: function(e, t) { var n, i, r, o, a, s = e.position(), l = e.shape.bounds(Mt), c = { topLeft: l.topLeft(), bottomRight: l.bottomRight() }, d = this._connectorSides, u = V.util.MAX_NUM; for (a = 0; d.length > a; a++) o = d[a], r = o.axis, n = Math.round(Math.abs(s[r] - c[o.boundsPoint][r])), u > n ? (u = n, i = o) : n === u && (s[r] - t[r]) * o.secondarySign > (s[i.axis] - t[i.axis]) * i.secondarySign && (i = o); return i.name }, _sameSideDistance: function(e) { var t = e.shape.bounds(Mt); return Math.min(t.width, t.height) / this.SAME_SIDE_DISTANCE_RATIO }, _connectorPoints: function(e, t, n, i) { var r, o, a = this._connectorSide(n, t), s = this._connectorSide(i, e), l = t.x - e.x, c = t.y - e.y, d = this._sameSideDistance(n), u = []; return a === lt || a == ut ? s == lt || s == ut ? a == s ? (o = a == lt ? Math.min(e.y, t.y) - d : Math.max(e.y, t.y) + d, u = [new K(e.x, o), new K(t.x, o)]) : u = [new K(e.x, e.y + c / 2), new K(t.x, e.y + c / 2)] : u = [new K(e.x, t.y)] : s == dt || s == ct ? a == s ? (r = a == dt ? Math.min(e.x, t.x) - d : Math.max(e.x, t.x) + d, u = [new K(r, e.y), new K(r, t.y)]) : u = [new K(e.x + l / 2, e.y), new K(e.x + l / 2, e.y + c)] : u = [new K(t.x, e.y)], u }, _floatingPoints: function(e, t, n) { var i, r, o, a = n ? this._connectorSide(n, t) : null, s = this._startHorizontal(e, t, a), l = [e, e, t, t], c = t.x - e.x, d = t.y - e.y, u = l.length; for (o = 1; u - 1 > o; ++o) s ? o % 2 !== 0 ? (i = c / (u / 2), r = 0) : (i = 0, r = d / ((u - 1) / 2)) : o % 2 !== 0 ? (i = 0, r = d / (u / 2)) : (i = c / ((u - 1) / 2), r = 0), l[o] = new K(l[o - 1].x + i, l[o - 1].y + r); return o--, l[u - 2] = s && o % 2 !== 0 || !s && o % 2 === 0 ? new K(l[u - 1].x, l[u - 2].y) : new K(l[u - 2].x, l[u - 1].y), [l[1], l[2]] }, _startHorizontal: function(e, t, n) { var i; return i = null === n || n !== ct && n !== dt ? Math.abs(e.x - t.x) > Math.abs(e.y - t.y) : !0 } }), R = j.extend({ init: function(e, t) { var n = this; n.diagram = e, n.options = J({}, n.options, t), n.visual = new G, n.diagram._adorners.push(n) }, refresh: function() {} }), H = R.extend({ init: function(e, t) { var n, i, r, o = this; o.connection = e, n = o.connection.diagram, o._ts = n.toolService, R.fn.init.call(o, n, t), i = o.connection.sourcePoint(), r = o.connection.targetPoint(), o.spVisual = new X(J(o.options.handles, { center: i })), o.epVisual = new X(J(o.options.handles, { center: r })), o.visual.append(o.spVisual), o.visual.append(o.epVisual) }, options: { handles: {} }, _getCursor: function() { return ot.move }, start: function(e) { switch (this.handle = this._hitTest(e), this.startPoint = e, this._initialSource = this.connection.source(), this._initialTarget = this.connection.target(), this.handle) { case -1: this.connection.targetConnector && this._ts._connectionManipulation(this.connection, this.connection.targetConnector.shape); break; case 1: this.connection.sourceConnector && this._ts._connectionManipulation(this.connection, this.connection.sourceConnector.shape) } }, move: function(e, t) { switch (e) { case -1: this.connection.source(t); break; case 1: this.connection.target(t); break; default: var n = t.minus(this.startPoint); this.startPoint = t, this.connection.sourceConnector || this.connection.source(this.connection.sourcePoint().plus(n)), this.connection.targetConnector || this.connection.target(this.connection.targetPoint().plus(n)) } return this.refresh(), !0 }, stop: function(e) { var n, i = this.diagram.toolService, r = i.hoveredItem; return n = i._hoveredConnector ? i._hoveredConnector._c : r && r instanceof W.Shape ? r.getConnector(st) || r.getConnector(e) : e, -1 === this.handle ? this.connection.source(n) : 1 === this.handle && this.connection.target(n), this.handle = t, this._ts._connectionManipulation(), new p(this.connection, this._initialSource, this._initialTarget) }, _hitTest: function(e) { var t = this.connection.sourcePoint(), n = this.connection.targetPoint(), i = this.options.handles.width / 2, r = this.options.handles.height / 2, o = new q(t.x, t.y).inflate(i, r), a = new q(n.x, n.y).inflate(i, r); return o.contains(e) ? -1 : a.contains(e) ? 1 : 0 }, refresh: function() { this.spVisual.redraw({ center: this.diagram.modelToLayer(this.connection.sourcePoint()) }), this.epVisual.redraw({ center: this.diagram.modelToLayer(this.connection.targetPoint()) }) } }), B = R.extend({ init: function(e, t) { var n = this; R.fn.init.call(n, e, t), n._refreshHandler = function(e) { e.item == n.shape && n.refresh() } }, show: function(e) { var t, n, i, r = this; for (r._visible = !0, r.shape = e, r.diagram.bind(_t, r._refreshHandler), t = e.connectors.length, r.connectors = [], r.visual.clear(), n = 0; t > n; n++) i = new O(e.connectors[n]), r.connectors.push(i), r.visual.append(i.visual); r.visual.visible(!0), r.refresh() }, destroy: function() { var e = this; e.diagram.unbind(_t, e._refreshHandler), e.shape = t, e._visible = t, e.visual.visible(!1) }, _hitTest: function(e) { var t, n; for (n = 0; this.connectors.length > n; n++) if (t = this.connectors[n], t._hitTest(e)) { t._hover(!0), this.diagram.toolService._hoveredConnector = t; break } }, refresh: function() { if (this.shape) { var t = this.shape.bounds(); t = this.diagram.modelToLayer(t), this.visual.position(t.topLeft()), e.each(this.connectors, function() { this.refresh() }) } } }), L = R.extend({ init: function(e, t) { var n = this; R.fn.init.call(n, e, t), n._manipulating = !1, n.map = [], n.shapes = [], n._initSelection(), n._createHandles(), n.redraw(), n.diagram.bind("select", function(e) { n._initialize(e.selected) }), n._refreshHandler = function() { n._internalChange || (n.refreshBounds(), n.refresh()) }, n._rotatedHandler = function() { 1 == n.shapes.length && (n._angle = n.shapes[0].rotate().angle), n._refreshHandler() }, n.diagram.bind(_t, n._refreshHandler).bind(vt, n._rotatedHandler), n.refreshBounds(), n.refresh() }, options: { editable: {}, selectable: { stroke: { color: "#778899", width: 1, dashType: "dash" }, fill: { color: It } }, offset: 10 }, _initSelection: function() { var e = this, t = e.diagram, n = t.options.selectable, i = J({}, e.options.selectable, n); e.rect = new $(i), e.visual.append(e.rect) }, _createHandles: function() { var e, t, n, i, r = this.options.editable; if (r && r.resize) for (e = r.resize.handles, i = -1; 1 >= i; i++) for (n = -1; 1 >= n; n++)(0 !== i || 0 !== n) && (t = new $(e), t.drawingElement._hover = rt(this._hover, this), this.map.push({ x: i, y: n, visual: t }), this.visual.append(t)) }, bounds: function(e) { return e ? (this._innerBounds = e.clone(), this._bounds = this.diagram.modelToLayer(e).inflate(this.options.offset, this.options.offset), t) : this._bounds }, _hitTest: function(e) { var n, i, r, o, a = this.diagram.modelToLayer(e), s = this.options.editable, l = this.map.length; if (this._angle && (a = a.clone().rotate(this._bounds.center(), this._angle)), s && s.rotate && this._rotationThumbBounds && this._rotationThumbBounds.contains(a)) return new K(-1, -2); if (s && s.resize) for (n = 0; l > n; n++) if (o = this.map[n], i = new K(o.x, o.y), r = this._getHandleBounds(i), r.offset(this._bounds.x, this._bounds.y), r.contains(a)) return i; return this._bounds.contains(a) ? new K(0, 0) : t }, _getHandleBounds: function(e) { var n, i, r, o, a = this.options.editable; return a && a.resize ? (n = a.resize.handles || {}, i = n.width, r = n.height, o = new q(0, 0, i, r), 0 > e.x ? o.x = -i / 2 : 0 === e.x ? o.x = Math.floor(this._bounds.width / 2) - i / 2 : e.x > 0 && (o.x = this._bounds.width + 1 - i / 2), 0 > e.y ? o.y = -r / 2 : 0 === e.y ? o.y = Math.floor(this._bounds.height / 2) - r / 2 : e.y > 0 && (o.y = this._bounds.height + 1 - r / 2), o) : t }, _getCursor: function(e) { var t, n = this._hitTest(e); if (n && n.x >= -1 && 1 >= n.x && n.y >= -1 && 1 >= n.y && this.options.editable && this.options.editable.resize) { if (t = this._angle, t && (t = 360 - t, n.rotate(new K(0, 0), t), n = new K(Math.round(n.x), Math.round(n.y))), -1 == n.x && -1 == n.y) return "nw-resize"; if (1 == n.x && 1 == n.y) return "se-resize"; if (-1 == n.x && 1 == n.y) return "sw-resize"; if (1 == n.x && -1 == n.y) return "ne-resize"; if (0 === n.x && -1 == n.y) return "n-resize"; if (0 === n.x && 1 == n.y) return "s-resize"; if (1 == n.x && 0 === n.y) return "e-resize"; if (-1 == n.x && 0 === n.y) return "w-resize" } return this._manipulating ? ot.move : ot.select }, _initialize: function() { var e, t, n = this, i = n.diagram.select(); for (n.shapes = [], e = 0; i.length > e; e++) t = i[e], t instanceof W.Shape && (n.shapes.push(t), t._rotationOffset = new K); n._angle = 1 == n.shapes.length ? n.shapes[0].rotate().angle : 0, n._startAngle = n._angle, n._rotates(), n._positions(), n.refreshBounds(), n.refresh(), n.redraw() }, _rotates: function() { var e, t, n = this; for (n.initialRotates = [], e = 0; n.shapes.length > e; e++) t = n.shapes[e], n.initialRotates.push(t.rotate().angle) }, _positions: function() { var e, t, n = this; for (n.initialStates = [], e = 0; n.shapes.length > e; e++) t = n.shapes[e], n.initialStates.push(t.bounds()) }, _hover: function(e, t) { var n, i, r, o, a = this.options.editable; a && a.resize && (n = a.resize.handles, i = n.hover, r = n.stroke, o = n.fill, e && Y.isDefined(i.stroke) && (r = J({}, r, i.stroke)), e && Y.isDefined(i.fill) && (o = i.fill), t.stroke(r.color, r.width, r.opacity), t.fill(o.color, o.opacity)) }, start: function(e) { var t, n; for (this._sp = e, this._cp = e, this._lp = e, this._manipulating = !0, this._internalChange = !0, this.shapeStates = [], t = 0; this.shapes.length > t; t++) n = this.shapes[t], this.shapeStates.push(n.bounds()) }, redraw: function() { var e, t, n = this, i = n.options.editable, r = i.resize, o = i.rotate, a = i && r ? !0 : !1, s = i && o ? !0 : !1; for (e = 0; this.map.length > e; e++) t = this.map[e], t.visual.visible(a); n.rotationThumb && n.rotationThumb.visible(s) }, angle: function(e) { return nt(e) && (this._angle = e), this._angle }, rotate: function() { var e, t, n = this._innerBounds.center(), i = this.angle(); for (this._internalChange = !0, e = 0; this.shapes.length > e; e++) t = this.shapes[e], i = (i + this.initialRotates[e] - this._startAngle) % 360, t.rotate(i, n); this.refresh() }, move: function(e, n) { var i, r, o, l, c, d, u, h, p, f, g, m, v, _, w = new K, b = new K, y = 0; if (-2 === e.y && -1 === e.x) { for (l = this._innerBounds.center(), this._angle = this._truncateAngle(Y.findAngle(l, n)), d = 0; this.shapes.length > d; d++) c = this.shapes[d], u = (this._angle + this.initialRotates[d] - this._startAngle) % 360, c.rotate(u, l), c.hasOwnProperty("layout") && c.layout(c), this._rotating = !0; this.refresh() } else { if (this.shouldSnap()) { if (m = this._truncateDistance(n.minus(this._lp)), 0 === m.x && 0 === m.y) return this._cp = n, t; i = m, this._lp = new K(this._lp.x + m.x, this._lp.y + m.y) } else i = n.minus(this._cp); for (this.isDragHandle(e) ? (b = w = i, r = !0) : (this._angle && i.rotate(new K(0, 0), this._angle), -1 == e.x ? w.x = i.x : 1 == e.x && (b.x = i.x), -1 == e.y ? w.y = i.y : 1 == e.y && (b.y = i.y)), r || (p = a(e, this._innerBounds), f = (this._innerBounds.width + i.x * e.x) / this._innerBounds.width, g = (this._innerBounds.height + i.y * e.y) / this._innerBounds.height), d = 0; this.shapes.length > d; d++) { if (c = this.shapes[d], o = c.bounds(), r) { if (!s(c)) continue; h = this._displaceBounds(o, w, b, r) } else h = o.clone(), h.scale(f, g, p, this._innerBounds.center(), c.rotate().angle), v = h.center(), v.rotate(o.center(), -this._angle), h = new q(v.x - h.width / 2, v.y - h.height / 2, h.width, h.height); h.width >= c.options.minWidth && h.height >= c.options.minHeight && (_ = o, c.bounds(h), c.hasOwnProperty("layout") && c.layout(c, _, h), (_.width !== h.width || _.height !== h.height) && c.rotate(c.rotate().angle), y += 1) } y && (y == d ? (h = this._displaceBounds(this._innerBounds, w, b, r), this.bounds(h)) : this.refreshBounds(), this.refresh()), this._positions() } this._cp = n }, isDragHandle: function(e) { return 0 === e.x && 0 === e.y }, cancel: function() { var e, n = this.shapes, i = this.shapeStates; for (e = 0; n.length > e; e++) n[e].bounds(i[e]); this.refreshBounds(), this.refresh(), this._manipulating = t, this._internalChange = t, this._rotating = t }, _truncatePositionToGuides: function(e) { return this.diagram.ruler ? this.diagram.ruler.truncatePositionToGuides(e) : e }, _truncateSizeToGuides: function(e) { return this.diagram.ruler ? this.diagram.ruler.truncateSizeToGuides(e) : e }, _truncateAngle: function(e) { var t = this.snapOptions(), n = Math.max(t.angle || pt, bt); return t ? Math.floor(e % 360 / n) * n : e % 360 }, _truncateDistance: function(e) { var t, n; return e instanceof W.Point ? new W.Point(this._truncateDistance(e.x), this._truncateDistance(e.y)) : (t = this.snapOptions() || {}, n = Math.max(t.size || ht, wt), t ? Math.floor(e / n) * n : e) }, snapOptions: function() { var e = this.diagram.options.editable, t = ((e || {}).drag || {}).snap || {}; return t }, shouldSnap: function() { var e = this.diagram.options.editable, t = (e || {}).drag, n = (t || {}).snap; return e !== !1 && t !== !1 && n !== !1 }, _displaceBounds: function(e, t, n, i) { var r, o = e.topLeft().plus(t), a = e.bottomRight().plus(n), s = q.fromPoints(o, a); return i || (r = s.center(), r.rotate(e.center(), -this._angle), s = new q(r.x - s.width / 2, r.y - s.height / 2, s.width, s.height)), s }, stop: function() { var e, n, i, r; if (this._cp != this._sp) if (this._rotating) e = new b(this, this.shapes, this.initialRotates), this._rotating = !1; else if (this._diffStates()) { if (this.diagram.ruler) for (n = 0; this.shapes.length > n; n++) i = this.shapes[n], r = i.bounds(), r = this._truncateSizeToGuides(this._truncatePositionToGuides(r)), i.bounds(r), this.refreshBounds(), this.refresh(); for (n = 0; this.shapes.length > n; n++) i = this.shapes[n], i.updateModel(); e = new m(this.shapes, this.shapeStates, this), this.diagram._syncShapeChanges() } return this._manipulating = t, this._internalChange = t, this._rotating = t, e }, _diffStates: function() { var e, t = this.shapes, n = this.shapeStates; for (e = 0; t.length > e; e++) if (!t[e].bounds().equals(n[e])) return !0; return !1 }, refreshBounds: function() { var e = 1 == this.shapes.length ? this.shapes[0].bounds().clone() : this.diagram.boundingBox(this.shapes, !0); this.bounds(e) }, refresh: function() { var t, n, i, r, o = this; this.shapes.length > 0 ? (n = this.bounds(), this.visual.visible(!0), this.visual.position(n.topLeft()), e.each(this.map, function() { t = o._getHandleBounds(new K(this.x, this.y)), this.visual.position(t.topLeft()) }), this.visual.position(n.topLeft()), i = new K(n.width / 2, n.height / 2), this.visual.rotate(this._angle, i), this.rect.redraw({ width: n.width, height: n.height }), this.rotationThumb && (r = this.options.editable.rotate.thumb, this._rotationThumbBounds = new q(n.center().x, n.y + r.y, 0, 0).inflate(r.width), this.rotationThumb.redraw({ x: n.width / 2 - r.width / 2 }))) : this.visual.visible(!1) } }), N = j.extend({ init: function(e) { var t = e.options.selectable; this.options = J({}, this.options, t), this.visual = new $(this.options), this.diagram = e }, options: { stroke: { color: "#778899", width: 1, dashType: "dash" }, fill: { color: It } }, start: function(e) { this._sp = this._ep = e, this.refresh(), this.diagram._adorn(this, !0) }, end: function() { this._sp = this._ep = t, this.diagram._adorn(this, !1) }, bounds: function(e) { return e && (this._bounds = e), this._bounds }, move: function(e) { this._ep = e, this.refresh() }, refresh: function() { if (this._sp) { var e = q.fromPoints(this.diagram.modelToLayer(this._sp), this.diagram.modelToLayer(this._ep)); this.bounds(q.fromPoints(this._sp, this._ep)), this.visual.position(e.topLeft()), this.visual.redraw({ height: e.height + 1, width: e.width + 1 }) } } }), O = j.extend({ init: function(e) { this.options = J({}, e.options), this._c = e, this.visual = new X(this.options), this.refresh() }, _hover: function(e) { var t = this.options, n = t.hover, i = t.stroke, r = t.fill; e && Y.isDefined(n.stroke) && (i = J({}, i, n.stroke)), e && Y.isDefined(n.fill) && (r = n.fill), this.visual.redraw({ stroke: i, fill: r }) }, refresh: function() { var e = this._c.shape.diagram.modelToView(this._c.position()), t = e.minus(this._c.shape.bounds("transformed").topLeft()), n = new q(e.x, e.y, 0, 0); n.inflate(this.options.width / 2, this.options.height / 2), this._visualBounds = n, this.visual.redraw({ center: new K(t.x, t.y) }) }, _hitTest: function(e) { var t = this._c.shape.diagram.modelToView(e); return this._visualBounds.contains(t) } }), J(W, { CompositeUnit: u, TransformUnit: m, PanUndoUnit: w, AddShapeUnit: _, AddConnectionUnit: v, DeleteShapeUnit: g, DeleteConnectionUnit: f, ConnectionEditAdorner: H, ConnectionTool: A, ConnectorVisual: O, UndoRedoService: x, ResizingAdorner: L, Selector: N, ToolService: I, ConnectorsAdorner: B, LayoutUndoUnit: d, ConnectionEditUnit: h, ToFrontUnit: y, ToBackUnit: k, ConnectionRouterBase: P, PolylineRouter: z, CascadingRouter: F, SelectionTool: D, ScrollerTool: S, PointerTool: T, ConnectionEditTool: E, RotateUnit: b }) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.dataviz.diagram, i = n.Graph, r = n.Node, o = n.Link, a = t.deepExtend, s = n.Size, l = n.Rect, c = n.Dictionary, d = n.Set, u = n.Graph, h = n.Utils, p = n.Point, f = 1e-6, g = Math.PI / 180, m = h.contains, v = e.grep, _ = t.Class.extend({ defaultOptions: { type: "Tree", subtype: "Down", roots: null, animate: !1, limitToView: !1, friction: .9, nodeDistance: 50, iterations: 300, horizontalSeparation: 90, verticalSeparation: 50, underneathVerticalTopOffset: 15, underneathHorizontalOffset: 15, underneathVerticalSeparation: 15, grid: { width: 1500, offsetX: 50, offsetY: 50, componentSpacingX: 20, componentSpacingY: 20 }, layerSeparation: 50, layeredIterations: 2, startRadialAngle: 0, endRadialAngle: 360, radialSeparation: 150, radialFirstLevelSeparation: 200, keepComponentsInOneRadialLayout: !1, ignoreContainers: !0, layoutContainerChildren: !1, ignoreInvisible: !0, animateTransitions: !1 }, init: function() {}, gridLayoutComponents: function(e) { var t, n, i, r, o, a, s, l, c, d, u, f, g, m, v; if (!e) throw "No components supplied."; for (h.forEach(e, function(e) { e.calcBounds() }), e.sort(function(e, t) { return t.bounds.width - e.bounds.width }), t = this.options.grid.width, n = this.options.grid.componentSpacingX, i = this.options.grid.componentSpacingY, r = 0, o = this.options.grid.offsetX, a = this.options.grid.offsetY, s = o, l = a, d = [], u = []; e.length > 0;) { for (s >= t && (s = o, l += r + i, r = 0), f = e.pop(), this.moveToOffset(f, new p(s, l)), c = 0; f.nodes.length > c; c++) u.push(f.nodes[c]); for (c = 0; f.links.length > c; c++) d.push(f.links[c]); g = f.bounds, m = g.height, (0 >= m || isNaN(m)) && (m = 0), v = g.width, (0 >= v || isNaN(v)) && (v = 0), m >= r && (r = m), s += v + n } return { nodes: u, links: d } }, moveToOffset: function(e, t) { var n, i, r, o, a, s, c, d, u = e.bounds, h = t.x - u.x, f = t.y - u.y; for (n = 0; e.nodes.length > n; n++) r = e.nodes[n], o = r.bounds(), 0 === o.width && 0 === o.height && 0 === o.x && 0 === o.y && (o = new l(0, 0, 0, 0)), o.x += h, o.y += f, r.bounds(o); for (n = 0; e.links.length > n; n++) if (a = e.links[n], a.points) { for (s = [], c = a.points, i = 0; c.length > i; i++) d = c[i], d.x += h, d.y += f, s.push(d); a.points = s } return this.currentHorizontalOffset += u.width + this.options.grid.offsetX, new p(h, f) }, transferOptions: function(e) { this.options = t.deepExtend({}, this.defaultOptions), h.isUndefined(e) || (this.options = t.deepExtend(this.options, e || {})) } }), w = t.Class.extend({ init: function(e) { this.nodeMap = new c, this.shapeMap = new c, this.nodes = [], this.edges = [], this.edgeMap = new c, this.finalNodes = [], this.finalLinks = [], this.ignoredConnections = [], this.ignoredShapes = [], this.hyperMap = new c, this.hyperTree = new i, this.finalGraph = null, this.diagram = e }, convert: function(e) { if (h.isUndefined(this.diagram)) throw "No diagram to convert."; return this.options = t.deepExtend({ ignoreInvisible: !0, ignoreContainers: !0, layoutContainerChildren: !1 }, e || {}), this.clear(), this._renormalizeShapes(), this._renormalizeConnections(), this.finalNodes = new c(this.nodes), this.finalLinks = new c(this.edges), this.finalGraph = new i, this.finalNodes.forEach(function(e) { this.finalGraph.addNode(e) }, this), this.finalLinks.forEach(function(e) { this.finalGraph.addExistingLink(e) }, this), this.finalGraph }, mapConnection: function(e) { return this.edgeMap.first(function(t) { return m(this.edgeMap.get(t), e) }) }, mapShape: function(e) { var t, n, i, r = this.nodeMap.keys(); for (t = 0, n = r.length; n > t; t++) if (i = r[t], m(this.nodeMap.get(i), e)) return i }, getEdge: function(e, t) { return h.first(e.links, function(n) { return n.getComplement(e) === t }) }, clear: function() { this.finalGraph = null, this.hyperTree = !this.options.ignoreContainers && this.options.layoutContainerChildren ? new u : null, this.hyperMap = !this.options.ignoreContainers && this.options.layoutContainerChildren ? new c : null, this.nodeMap = new c, this.shapeMap = new c, this.nodes = [], this.edges = [], this.edgeMap = new c, this.ignoredConnections = [], this.ignoredShapes = [], this.finalNodes = [], this.finalLinks = [] }, listToRoot: function(e) { var t = [], n = e.container; if (!n) return t; for (t.push(n); n.parentContainer;) n = n.parentContainer, t.push(n); return t.reverse(), t }, firstNonIgnorableContainer: function(e) { return e.isContainer && !this._isIgnorableItem(e) ? e : e.parentContainer ? this.firstNonIgnorableContainer(e.parentContainer) : null }, isContainerConnection: function(e, t) { return e.isContainer && this.isDescendantOf(e, t) ? !0 : t.isContainer && this.isDescendantOf(t, e) }, isDescendantOf: function(e, t) { var n, i, r, o; if (!e.isContainer) throw "Expecting a container."; if (e === t) return !1; if (m(e.children, t)) return !0; for (n = [], i = 0, r = e.children.length; r > i; i++) o = e.children[i], o.isContainer && this.isDescendantOf(o, t) && n.push(o); return n.length > 0 }, isIgnorableItem: function(e) { return this.options.ignoreInvisible ? e.isCollapsed && this._isVisible(e) ? !1 : !e.isCollapsed && this._isVisible(e) ? !1 : !0 : e.isCollapsed && !this._isTop(e) }, isShapeMapped: function(e) { return e.isCollapsed && !this._isVisible(e) && !this._isTop(e) }, leastCommonAncestor: function(e, t) { var n, i, r, o, a, s; if (!e) throw "Parameter should not be null."; if (!t) throw "Parameter should not be null."; if (!this.hyperTree) throw "No hypertree available."; if (n = this.listToRoot(e), i = this.listToRoot(t), r = null, h.isEmpty(n) || h.isEmpty(i)) return this.hyperTree.root.data; for (o = n[0], a = i[0], s = 0; o === a && (r = n[s], s++, !(s >= n.length || s >= i.length));) o = n[s], a = i[s]; return r ? v(this.hyperTree.nodes, function(e) { return e.data.container === r }) : this.hyperTree.root.data }, _isTop: function(e) { return !e.parentContainer }, _isVisible: function(e) { return e.visible() ? e.parentContainer ? this._isVisible(e.parentContainer) : e.visible() : !1 }, _isCollapsed: function(e) { return e.isContainer && e.isCollapsed ? !0 : e.parentContainer && this._isCollapsed(e.parentContainer) }, _renormalizeShapes: function() { var e, t, n, i; if (!this.options.ignoreContainers) throw "Containers are not supported yet, but stay tuned."; for (e = 0, t = this.diagram.shapes.length; t > e; e++) n = this.diagram.shapes[e], this.options.ignoreInvisible && !this._isVisible(n) || n.isContainer ? this.ignoredShapes.push(n) : (i = new r(n.id, n), i.isVirtual = !1, this.nodeMap.add(i, [n]), this.nodes.push(i)) }, _renormalizeConnections: function() { var e, t, n, i, r, a, s, l; if (0 !== this.diagram.connections.length) for (e = 0, t = this.diagram.connections.length; t > e; e++) if (n = this.diagram.connections[e], this.isIgnorableItem(n)) this.ignoredConnections.push(n); else if (i = n.sourceConnector ? n.sourceConnector.shape : null, r = n.targetConnector ? n.targetConnector.shape : null, i && r) if (!m(this.ignoredShapes, i) || this.shapeMap.containsKey(i)) if (!m(this.ignoredShapes, r) || this.shapeMap.containsKey(r)) if (this.shapeMap.containsKey(i) && (i = this.shapeMap[i]), this.shapeMap.containsKey(r) && (r = this.shapeMap[r]), a = this.mapShape(i), s = this.mapShape(r), a === s || this.areConnectedAlready(a, s)) this.ignoredConnections.push(n); else { if (null === a || null === s) throw "A shape was not mapped to a node."; if (!this.options.ignoreContainers) throw "Containers are not supported yet, but stay tuned."; a.isVirtual || s.isVirtual ? this.ignoredConnections.push(n) : (l = new o(a, s, n.id, n), this.edgeMap.add(l, [n]), this.edges.push(l)) } else this.ignoredConnections.push(n); else this.ignoredConnections.push(n); else this.ignoredConnections.push(n) }, areConnectedAlready: function(e, t) { return h.any(this.edges, function(n) { return n.source === e && n.target === t || n.source === t && n.target === e }) } }), b = _.extend({ init: function(e) { var t = this; if (_.fn.init.call(t), h.isUndefined(e)) throw "Diagram is not specified."; this.diagram = e }, layout: function(e) { var t, i, r, o, a, s; if (this.transferOptions(e), t = new w(this.diagram), i = t.convert(e), !i.isEmpty() && (r = i.getConnectedComponents(), !h.isEmpty(r))) { for (o = 0; r.length > o; o++) a = r[o], this.layoutGraph(a, e); return s = this.gridLayoutComponents(r), new n.LayoutState(this.diagram, s) } }, layoutGraph: function(e, t) { var n, i, r; for (h.isDefined(t) && this.transferOptions(t), this.graph = e, n = 9 * this.options.nodeDistance, this.temperature = n, i = this._expectedBounds(), this.width = i.width, this.height = i.height, r = 0; this.options.iterations > r; r++) this.refineStage = r >= 5 * this.options.iterations / 6, this.tick(), this.temperature = this.refineStage ? n / 30 : n * (1 - r / (2 * this.options.iterations)) }, tick: function() { var e, t, n; for (e = 0; this.graph.nodes.length > e; e++) this._repulsion(this.graph.nodes[e]); for (e = 0; this.graph.links.length > e; e++) this._attraction(this.graph.links[e]); for (e = 0; this.graph.nodes.length > e; e++) { if (t = this.graph.nodes[e], n = Math.sqrt(t.dx * t.dx + t.dy * t.dy), 0 === n) return; t.x += Math.min(n, this.temperature) * t.dx / n, t.y += Math.min(n, this.temperature) * t.dy / n, this.options.limitToView && (t.x = Math.min(this.width, Math.max(t.width / 2, t.x)), t.y = Math.min(this.height, Math.max(t.height / 2, t.y))) } }, _shake: function(e) { var t = Math.random() * this.options.nodeDistance / 4, n = 2 * Math.random() * Math.PI; e.x += t * Math.cos(n), e.y -= t * Math.sin(n) }, _InverseSquareForce: function(e, t, n) { var i, r, o, a, s, l, c; return this.refineStage ? (r = t.x - n.x, o = t.y - n.y, a = t.width / 2, s = t.height / 2, l = n.width / 2, c = n.height / 2, i = Math.pow(r, 2) / Math.pow(a + l + this.options.nodeDistance, 2) + Math.pow(o, 2) / Math.pow(s + c + this.options.nodeDistance, 2)) : i = Math.pow(e, 2) / Math.pow(this.options.nodeDistance, 2), 4 * i / 3 }, _SquareForce: function(e, t, n) { return 1 / this._InverseSquareForce(e, t, n) }, _repulsion: function(e) { e.dx = 0, e.dy = 0, h.forEach(this.graph.nodes, function(t) { var n, i, r, o; if (t !== e) { for (; e.x === t.x && e.y === t.y;) this._shake(t); n = e.x - t.x, i = e.y - t.y, r = Math.sqrt(n * n + i * i), o = 2 * this._SquareForce(r, e, t), e.dx += n / r * o, e.dy += i / r * o } }, this) }, _attraction: function(e) { var t, n, i, r, o, a, s = e.target, l = e.source; if (l !== s) { for (; l.x === s.x && l.y === s.y;) this._shake(s); t = l.x - s.x, n = l.y - s.y, i = Math.sqrt(t * t + n * n), r = 5 * this._InverseSquareForce(i, l, s), o = t / i * r, a = n / i * r, s.dx += o, s.dy += a, l.dx -= o, l.dy -= a } }, _expectedBounds: function() { var e, t, n, i, r, o = this.graph.nodes.length, a = 1.5, s = 4; return 0 === o ? e : (e = h.fold(this.graph.nodes, function(e, t) { var n = t.width * t.height; return n > 0 ? e += Math.sqrt(n) : 0 }, 0, this), t = e / o, n = t * Math.ceil(Math.sqrt(o)), i = n * Math.sqrt(a), r = n / Math.sqrt(a), { width: i * s, height: r * s }) } }), y = t.Class.extend({ init: function(e) { this.center = null, this.options = e }, layout: function(e, t) { if (this.graph = e, this.graph.nodes && 0 !== this.graph.nodes.length) { if (!m(this.graph.nodes, t)) throw "The given root is not in the graph."; this.center = t, this.graph.cacheRelationships(), this.layoutSwitch() } }, layoutLeft: function(e) { var t, n, i, r, o, a, l, c; for (this.setChildrenDirection(this.center, "Left", !1), this.setChildrenLayout(this.center, "Default", !1), t = 0, n = 0, r = 0; e.length > r; r++) o = e[r], o.TreeDirection = "Left", a = this.measure(o, s.Empty), n = Math.max(n, a.Width), t += a.height + this.options.verticalSeparation; for (t -= this.options.verticalSeparation, l = this.center.x - this.options.horizontalSeparation, i = this.center.y + (this.center.height - t) / 2, r = 0; e.length > r; r++) o = e[r], c = new p(l - o.Size.width, i), this.arrange(o, c), i += o.Size.height + this.options.verticalSeparation }, layoutRight: function(e) { var t, n, i, r, o, a, l, c; for (this.setChildrenDirection(this.center, "Right", !1), this.setChildrenLayout(this.center, "Default", !1), t = 0, n = 0, r = 0; e.length > r; r++) o = e[r], o.TreeDirection = "Right", a = this.measure(o, s.Empty), n = Math.max(n, a.Width), t += a.height + this.options.verticalSeparation; for (t -= this.options.verticalSeparation, l = this.center.x + this.options.horizontalSeparation + this.center.width, i = this.center.y + (this.center.height - t) / 2, r = 0; e.length > r; r++) o = e[r], c = new p(l, i), this.arrange(o, c), i += o.Size.height + this.options.verticalSeparation }, layoutUp: function(e) { var t, n, i, r, o, a, l; for (this.setChildrenDirection(this.center, "Up", !1), this.setChildrenLayout(this.center, "Default", !1), t = 0, r = 0; e.length > r; r++) i = e[r], i.TreeDirection = "Up", o = this.measure(i, s.Empty), t += o.width + this.options.horizontalSeparation; for (t -= this.options.horizontalSeparation, a = this.center.x + this.center.width / 2 - t / 2, r = 0; e.length > r; r++) i = e[r], n = this.center.y - this.options.verticalSeparation - i.Size.height, l = new p(a, n), this.arrange(i, l), a += i.Size.width + this.options.horizontalSeparation }, layoutDown: function(e) { var t, n, i, r, o, a, l; for (this.setChildrenDirection(this.center, "Down", !1), this.setChildrenLayout(this.center, "Default", !1), i = 0, n = 0; e.length > n; n++) t = e[n], t.treeDirection = "Down", o = this.measure(t, s.Empty), i += o.width + this.options.horizontalSeparation; for (i -= this.options.horizontalSeparation, a = this.center.x + this.center.width / 2 - i / 2, r = this.center.y + this.options.verticalSeparation + this.center.height, n = 0; e.length > n; n++) t = e[n], l = new p(a, r), this.arrange(t, l), a += t.Size.width + this.options.horizontalSeparation }, layoutRadialTree: function() { var e, t; if (this.setChildrenDirection(this.center, "Radial", !1), this.setChildrenLayout(this.center, "Default", !1), this.previousRoot = null, e = this.options.startRadialAngle * g, t = this.options.endRadialAngle * g, e >= t) throw "Final angle should not be less than the start angle."; this.maxDepth = 0, this.origin = new p(this.center.x, this.center.y), this.calculateAngularWidth(this.center, 0), this.maxDepth > 0 && this.radialLayout(this.center, this.options.radialFirstLevelSeparation, e, t), this.center.Angle = t - e }, tipOverTree: function(e, t) { var n, i, r, o, a, l, c; for (h.isUndefined(t) && (t = 0), this.setChildrenDirection(this.center, "Down", !1), this.setChildrenLayout(this.center, "Default", !1), this.setChildrenLayout(this.center, "Underneath", !1, t), n = 0, o = 0; e.length > o; o++) r = e[o], r.TreeDirection = "Down", a = this.measure(r, s.Empty), n += a.width + this.options.horizontalSeparation; for (n -= this.options.horizontalSeparation, n -= e[e.length - 1].width, n += e[e.length - 1].associatedShape.bounds().width, l = this.center.x + this.center.width / 2 - n / 2, i = this.center.y + this.options.verticalSeparation + this.center.height, o = 0; e.length > o; o++) r = e[o], c = new p(l, i), this.arrange(r, c), l += r.Size.width + this.options.horizontalSeparation }, calculateAngularWidth: function(e, t) { var n, i, r, o, a, s, l; if (t > this.maxDepth && (this.maxDepth = t), n = 0, i = 1e3, r = 1e3, o = 0 === t ? 0 : Math.sqrt(i * i + r * r) / t, e.children.length > 0) { for (a = 0, s = e.children.length; s > a; a++) l = e.children[a], n += this.calculateAngularWidth(l, t + 1); n = Math.max(o, n) } else n = o; return e.sectorAngle = n, n }, sortChildren: function(e) { var t, n, i, r, o, a, s, l, c, d, u, f = 0; if (e.parents.length > 1) throw "Node is not part of a tree."; if (n = e.parents[0], n && (i = new p(n.x, n.y), r = new p(e.x, e.y), f = this.normalizeAngle(Math.atan2(i.y - r.y, i.x - r.x))), o = e.children.length, 0 === o) return null; for (a = [], s = [], t = 0; o > t; ++t) l = e.children[t], c = new p(l.x, l.y), s[t] = t, a[t] = this.normalizeAngle(-f + Math.atan2(c.y - c.y, c.x - c.x)); for (h.bisort(a, s), d = [], u = e.children, t = 0; o > t; ++t) d.push(u[s[t]]); return d }, normalizeAngle: function(e) { for (; e > 2 * Math.PI;) e -= 2 * Math.PI; for (; 0 > e;) e += 2 * Math.PI; return e }, radialLayout: function(e, t, n, i) { var r, o, a, s, l, c = i - n, d = c / 2, u = e.sectorAngle, h = 0, p = this.sortChildren(e); for (r = 0, o = p.length; o > r; r++) a = p[r], s = a, l = s.sectorAngle / u, a.children.length > 0 && this.radialLayout(a, t + this.options.radialSeparation, n + h * c, n + (h + l) * c), this.setPolarLocation(a, t, n + h * c + l * d), s.angle = l * c, h += l }, setPolarLocation: function(e, t, n) { e.x = this.origin.x + t * Math.cos(n), e.y = this.origin.y + t * Math.sin(n), e.BoundingRectangle = new l(e.x, e.y, e.width, e.height) }, setChildrenDirection: function(e, t, n) { var i = e.treeDirection; this.graph.depthFirstTraversal(e, function(e) { e.treeDirection = t }), n || (e.treeDirection = i) }, setChildrenLayout: function(e, t, n, i) { h.isUndefined(i) && (i = 0); var r = e.childrenLayout; i > 0 ? (this.graph.assignLevels(e), this.graph.depthFirstTraversal(e, function(e) { e.level >= i + 1 && (e.childrenLayout = t) })) : (this.graph.depthFirstTraversal(e, function(e) { e.childrenLayout = t }), n || (e.childrenLayout = r)) }, measure: function(e, t) { var n, i, r, o, a, l, c, d = 0, u = 0, p = new s(0, 0); if (!e) throw ""; if (i = e.associatedShape.bounds(), r = i.width, o = i.height, 1 !== e.parents.length) throw "Node not in a spanning tree."; if (a = e.parents[0], "Undefined" === e.treeDirection && (e.treeDirection = a.treeDirection), h.isEmpty(e.children)) p = new s(Math.abs(r) < f ? 50 : r, Math.abs(o) < f ? 25 : o); else if (1 === e.children.length) { switch (e.treeDirection) { case "Radial": n = this.measure(e.children[0], t), d = r + this.options.radialSeparation * Math.cos(e.AngleToParent) + n.width, u = o + Math.abs(this.options.radialSeparation * Math.sin(e.AngleToParent)) + n.height; break; case "Left": case "Right": switch (e.childrenLayout) { case "TopAlignedWithParent": break; case "BottomAlignedWithParent": break; case "Underneath": n = this.measure(e.children[0], t), d = r + n.width + this.options.underneathHorizontalOffset, u = o + this.options.underneathVerticalTopOffset + n.height; break; case "Default": n = this.measure(e.children[0], t), d = r + this.options.horizontalSeparation + n.width, u = Math.max(o, n.height); break; default: throw "Unhandled TreeDirection in the Radial layout measuring." } break; case "Up": case "Down": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": n = this.measure(e.children[0], t), d = Math.max(r, n.width + this.options.underneathHorizontalOffset), u = o + this.options.underneathVerticalTopOffset + n.height; break; case "Default": n = this.measure(e.children[0], t), u = o + this.options.verticalSeparation + n.height, d = Math.max(r, n.width); break; default: throw "Unhandled TreeDirection in the Down layout measuring." } break; default: throw "Unhandled TreeDirection in the layout measuring." } p = new s(d, u) } else { switch (e.treeDirection) { case "Left": case "Right": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": for (d = r, u = o + this.options.underneathVerticalTopOffset, l = 0; e.children.length > l; l++) c = e.children[l], n = this.measure(c, t), d = Math.max(d, n.width + this.options.underneathHorizontalOffset), u += n.height + this.options.underneathVerticalSeparation; u -= this.options.underneathVerticalSeparation; break; case "Default": for (d = r, u = 0, l = 0; e.children.length > l; l++) c = e.children[l], n = this.measure(c, t), d = Math.max(d, r + this.options.horizontalSeparation + n.width), u += n.height + this.options.verticalSeparation; u -= this.options.verticalSeparation; break; default: throw "Unhandled TreeDirection in the Right layout measuring." } break; case "Up": case "Down": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": for (d = r, u = o + this.options.underneathVerticalTopOffset, l = 0; e.children.length > l; l++) c = e.children[l], n = this.measure(c, t), d = Math.max(d, n.width + this.options.underneathHorizontalOffset), u += n.height + this.options.underneathVerticalSeparation; u -= this.options.underneathVerticalSeparation; break; case "Default": for (d = 0, u = 0, l = 0; e.children.length > l; l++) c = e.children[l], n = this.measure(c, t), d += n.width + this.options.horizontalSeparation, u = Math.max(u, n.height + this.options.verticalSeparation + o); d -= this.options.horizontalSeparation; break; default: throw "Unhandled TreeDirection in the Down layout measuring." } break; default: throw "Unhandled TreeDirection in the layout measuring." } p = new s(d, u) } return e.SectorAngle = Math.sqrt(d * d / 4 + u * u / 4), e.Size = p, p }, arrange: function(e, t) { var n, i, r, o, a, s, c, d, u = e.associatedShape.bounds(), g = u.width, m = u.height; if (h.isEmpty(e.children)) e.x = t.x, e.y = t.y, e.BoundingRectangle = new l(t.x, t.y, g, m); else switch (e.treeDirection) { case "Left": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": for (d = t, e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), c = t.y + m + this.options.underneathVerticalTopOffset, n = 0; o.children.length > n; n++) o = o.children[n], s = d.x - o.associatedShape.width - this.options.underneathHorizontalOffset, i = new p(s, c), this.arrange(o, i), c += o.Size.height + this.options.underneathVerticalSeparation; break; case "Default": for (d = new p(t.x + e.Size.width - g, t.y + (e.Size.height - m) / 2), e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), s = d.x - this.options.horizontalSeparation, c = t.y, n = 0; e.children.length > n; n++) o = e.children[n], i = new p(s - o.Size.width, c), this.arrange(o, i), c += o.Size.height + this.options.verticalSeparation; break; default: throw "Unsupported TreeDirection" } break; case "Right": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": for (d = t, e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), s = t.x + g + this.options.underneathHorizontalOffset, c = t.y + m + this.options.underneathVerticalTopOffset, n = 0; e.children.length > n; n++) o = e.children[n], i = new p(s, c), this.arrange(o, i), c += o.Size.height + this.options.underneathVerticalSeparation; break; case "Default": for (d = new p(t.x, t.y + (e.Size.height - m) / 2), e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), s = t.x + g + this.options.horizontalSeparation, c = t.y, n = 0; e.children.length > n; n++) o = e.children[n], i = new p(s, c), this.arrange(o, i), c += o.Size.height + this.options.verticalSeparation; break; default: throw "Unsupported TreeDirection" } break; case "Up": if (d = new p(t.x + (e.Size.width - g) / 2, t.y + e.Size.height - m), e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), Math.abs(d.x - t.x) < f) { for (a = 0, n = 0; e.children.length > n; n++) r = e.children[n], a += r.Size.width + this.options.horizontalSeparation; a -= this.options.horizontalSeparation, s = t.x + (g - a) / 2 } else s = t.x; for (n = 0; e.children.length > n; n++) o = e.children[n], c = d.y - this.options.verticalSeparation - o.Size.height, i = new p(s, c), this.arrange(o, i), s += o.Size.width + this.options.horizontalSeparation; break; case "Down": switch (e.childrenLayout) { case "TopAlignedWithParent": case "BottomAlignedWithParent": break; case "Underneath": for (d = t, e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), s = t.x + this.options.underneathHorizontalOffset, c = t.y + m + this.options.underneathVerticalTopOffset, n = 0; e.children.length > n; n++) o = e.children[n], i = new p(s, c), this.arrange(o, i), c += o.Size.height + this.options.underneathVerticalSeparation; break; case "Default": if (d = new p(t.x + (e.Size.width - g) / 2, t.y), e.x = d.x, e.y = d.y, e.BoundingRectangle = new l(e.x, e.y, e.width, e.height), Math.abs(d.x - t.x) < f) { for (a = 0, n = 0; e.children.length > n; n++) r = e.children[n], a += r.Size.width + this.options.horizontalSeparation; a -= this.options.horizontalSeparation, s = t.x + (g - a) / 2 } else s = t.x; for (n = 0; e.children.length > n; n++) o = e.children[n], c = d.y + this.options.verticalSeparation + m, i = new p(s, c), this.arrange(o, i), s += o.Size.width + this.options.horizontalSeparation; break; default: throw "Unsupported TreeDirection" } break; case "None": break; default: throw "Unsupported TreeDirection" } }, layoutSwitch: function() { var e, t, n, i, r, o; if (this.center && !h.isEmpty(this.center.children)) switch (e = this.options.subtype, h.isUndefined(e) && (e = "Down"), o = this.center.children, e.toLowerCase()) { case "radial": case "radialtree": this.layoutRadialTree(); break; case "mindmaphorizontal": case "mindmap": t = this.center.children, 1 === this.center.children.length ? this.layoutRight(t) : (r = o.length / 2, n = v(this.center.children, function(e) { return h.indexOf(o, e) < r }), i = v(this.center.children, function(e) { return h.indexOf(o, e) >= r }), this.layoutLeft(n), this.layoutRight(i)); break; case "mindmapvertical": t = this.center.children, 1 === this.center.children.length ? this.layoutDown(t) : (r = o.length / 2, n = v(this.center.children, function(e) { return h.indexOf(o, e) < r }), i = v(this.center.children, function(e) { return h.indexOf(o, e) >= r }), this.layoutUp(n), this.layoutDown(i)); break; case "right": this.layoutRight(this.center.children); break; case "left": this.layoutLeft(this.center.children); break; case "up": case "bottom": this.layoutUp(this.center.children); break; case "down": case "top": this.layoutDown(this.center.children); break; case "tipover": case "tipovertree": if (0 > this.options.tipOverTreeStartLevel) throw "The tip-over level should be a positive integer."; this.tipOverTree(this.center.children, this.options.tipOverTreeStartLevel); break; case "undefined": case "none": } } }), k = _.extend({ init: function(e) { var t = this; if (_.fn.init.call(t), h.isUndefined(e)) throw "No diagram specified."; this.diagram = e }, layout: function(e) { var t, i; return this.transferOptions(e), t = new w(this.diagram), this.graph = t.convert(), i = this.layoutComponents(), new n.LayoutState(this.diagram, i) }, layoutComponents: function() { var e, t, n, i, r, o, a, s; if (!this.graph.isEmpty() && (e = this.graph.getConnectedComponents(), !h.isEmpty(e))) { for (t = new y(this.options), n = [], i = 0; e.length > i; i++) { if (r = e[i], o = this.getTree(r), !o) throw "Failed to find a spanning tree for the component."; a = o.root, s = o.tree, t.layout(s, a), n.push(s) } return this.gridLayoutComponents(n) } }, getTree: function(e) { var t, n, i, r, o, a = null; if (this.options.roots && this.options.roots.length > 0) for (t = 0, n = e.nodes.length; n > t; t++) for (i = e.nodes[t], r = 0; this.options.roots.length > r; r++) if (o = this.options.roots[r], o === i.associatedShape) { a = i; break } if (!a && (a = e.root(), !a)) throw "Unable to find a root for the tree."; return this.getTreeForRoot(e, a) }, getTreeForRoot: function(e, t) { var n = e.getSpanningTree(t); return h.isUndefined(n) || n.isEmpty() ? null : { tree: n, root: n.root } } }), x = _.extend({ init: function(e) { var t = this; if (_.fn.init.call(t), h.isUndefined(e)) throw "Diagram is not specified."; this.diagram = e }, layout: function(e) { var t, i, r, o, a, s; if (this.transferOptions(e), t = new w(this.diagram), i = t.convert(e), !i.isEmpty() && (r = i.getConnectedComponents(), !h.isEmpty(r))) { for (o = 0; r.length > o; o++) a = r[o], this.layoutGraph(a, e); return s = this.gridLayoutComponents(r), new n.LayoutState(this.diagram, s) } }, _initRuntimeProperties: function() { var e, t; for (e = 0; this.graph.nodes.length > e; e++) t = this.graph.nodes[e], t.layer = -1, t.downstreamLinkCount = 0, t.upstreamLinkCount = 0, t.isVirtual = !1, t.uBaryCenter = 0, t.dBaryCenter = 0, t.upstreamPriority = 0, t.downstreamPriority = 0, t.gridPosition = 0 }, _prepare: function(e) { var t, n, i, r, o, a, s, l, d, u, p, f, g = []; for (n = 0; e.links.length > n; n++) e.links[n].depthOfDumminess = 0; for (r = new c, h.forEach(e.nodes, function(e) { 0 === e.incoming.length && (r.set(e, 0), g.push(e)) }); g.length > 0;) for (o = g.shift(), t = 0; o.outgoing.length > t; t++) i = o.outgoing[t], a = i.target, r.containsKey(a) ? r.set(a, Math.max(r.get(o) + 1, r.get(a))) : r.set(a, r.get(o) + 1), m(g, a) || g.push(a); for (s = 0, r.forEachValue(function(e) { s = Math.max(s, e) }), l = [], h.addRange(l, r.keys()), l.sort(function(e, t) { var n = r.get(e), i = r.get(t); return h.sign(i - n) }), d = 0; l.length > d; ++d) if (u = l[d], p = Number.MAX_VALUE, 0 !== u.outgoing.length) { for (n = 0; u.outgoing.length > n; ++n) i = u.outgoing[n], p = Math.min(p, r.get(i.target)); p > 1 && r.set(u, p - 1) } for (this.layers = [], t = 0; s + 1 > t; t++) this.layers.push([]); for (r.forEach(function(e, t) { e.layer = t, this.layers[t].push(e) }, this), n = 0; this.layers.length > n; n++) for (f = this.layers[n], t = 0; f.length > t; t++) f[t].gridPosition = t }, layoutGraph: function(e, t) { if (h.isUndefined(e)) throw "No graph given or graph analysis of the diagram failed."; h.isDefined(t) && this.transferOptions(t), this.graph = e, e.setItemIndices(); var n = e.makeAcyclic(); this._initRuntimeProperties(), this._prepare(e, t), this._dummify(), this._optimizeCrossings(), this._swapPairs(), this.arrangeNodes(), this._moveThingsAround(), this._dedummify(), h.forEach(n, function(e) { e.points && e.points.reverse() }) }, setMinDist: function(e, t, n) { var i = e.layer, r = e.layerIndex; this.minDistances[i][r] = n }, getMinDist: function(e, t) { var n, i = 0, r = e.layerIndex, o = t.layerIndex, a = e.layer, s = Math.min(r, o), l = Math.max(r, o); for (n = s; l > n; ++n) i += this.minDistances[a][n]; return i }, placeLeftToRight: function(e) { var t, n, i, r, o, a, s, l, d, u, p = new c; for (i = 0; this.layers.length > i; ++i) if (r = e[i]) { for (t = 0; r.length > t; t++) n = r[t], p.containsKey(n) || this.placeLeft(n, p, i); for (o = Number.POSITIVE_INFINITY, t = 0; r.length > t; t++) n = r[t], a = this.rightSibling(n), a && this.nodeLeftClass.get(a) !== i && (o = Math.min(o, p.get(a) - p.get(n) - this.getMinDist(n, a))); if (o === Number.POSITIVE_INFINITY) { for (s = [], t = 0; r.length > t; t++) for (n = r[t], l = [], h.addRange(l, this.upNodes.get(n)), h.addRange(l, this.downNodes.get(n)), d = 0; l.length > d; d++) u = l[d], this.nodeLeftClass.get(u) < i && s.push(p.get(u) - p.get(n)); s.sort(), o = 0 === s.length ? 0 : s.length % 2 === 1 ? s[this.intDiv(s.length, 2)] : (s[this.intDiv(s.length, 2) - 1] + s[this.intDiv(s.length, 2)]) / 2 } for (t = 0; r.length > t; t++) n = r[t], p.set(n, p.get(n) + o) } return p }, placeRightToLeft: function(e) { var t, n, i, r, o, a, s, l, d, u, p = new c; for (i = 0; this.layers.length > i; ++i) if (r = e[i]) { for (t = 0; r.length > t; t++) n = r[t], p.containsKey(n) || this.placeRight(n, p, i); for (o = Number.NEGATIVE_INFINITY, t = 0; r.length > t; t++) n = r[t], a = this.leftSibling(n), a && this.nodeRightClass.get(a) !== i && (o = Math.max(o, p.get(a) - p.get(n) + this.getMinDist(a, n))); if (o === Number.NEGATIVE_INFINITY) { for (s = [], t = 0; r.length > t; t++) for (n = r[t], l = [], h.addRange(l, this.upNodes.get(n)), h.addRange(l, this.downNodes.get(n)), d = 0; l.length > d; d++) u = l[d], this.nodeRightClass.get(u) < i && s.push(p.get(n) - p.get(u)); s.sort(), o = 0 === s.length ? 0 : s.length % 2 === 1 ? s[this.intDiv(s.length, 2)] : (s[this.intDiv(s.length, 2) - 1] + s[this.intDiv(s.length, 2)]) / 2 } for (t = 0; r.length > t; t++) n = r[t], p.set(n, p.get(n) + o) } return p }, _getLeftWing: function() { var e = { value: null }, t = this.computeClasses(e, 1); return this.nodeLeftClass = e.value, t }, _getRightWing: function() { var e = { value: null }, t = this.computeClasses(e, -1); return this.nodeRightClass = e.value, t }, computeClasses: function(e, t) { var n, i, r, o, a, s, l, d, u, h = 0, p = e.value = new c; for (n = 0; this.layers.length > n; ++n) for (h = n, i = this.layers[n], r = 1 === t ? 0 : i.length - 1; r >= 0 && i.length > r; r += t) if (o = i[r], p.containsKey(o)) h = p.get(o); else if (p.set(o, h), o.isVirtual) for (a = this._nodesInLink(o), s = 0; a.length > s; s++) l = a[s], p.set(l, h); for (d = [], u = 0; this.layers.length > u; u++) d.push(null); return p.forEach(function(e, t) { null === d[t] && (d[t] = []), d[t].push(e) }), d }, _isVerticalLayout: function() { return "up" === this.options.subtype.toLowerCase() || "down" === this.options.subtype.toLowerCase() || "vertical" === this.options.subtype.toLowerCase() }, _isHorizontalLayout: function() { return "right" === this.options.subtype.toLowerCase() || "left" === this.options.subtype.toLowerCase() || "horizontal" === this.options.subtype.toLowerCase() }, _isIncreasingLayout: function() { return "right" === this.options.subtype.toLowerCase() || "down" === this.options.subtype.toLowerCase() }, _moveThingsAround: function() { function e(e, t) { var n, i, r = Number.MIN_VALUE; for (n = 0; e.length > n; ++n) i = e[n], r = t._isVerticalLayout() ? Math.max(r, i.height) : Math.max(r, i.width); return r } var t, n, i, r, o, a, s, l, d, u, p, f, g, m, v, _, w, b, y, k, x, C, S, T, D, A, E; for (n = 0; this.layers.length > n; ++n) r = this.layers[n], r.sort(this._gridPositionComparer); for (this.minDistances = [], n = 0; this.layers.length > n; ++n) for (r = this.layers[n], this.minDistances[n] = [], o = 0; r.length > o; ++o) i = r[o], i.layerIndex = o, this.minDistances[n][o] = this.options.nodeDistance, r.length - 1 > o && (this.minDistances[n][o] += this._isVerticalLayout() ? (i.width + r[o + 1].width) / 2 : (i.height + r[o + 1].height) / 2); for (this.downNodes = new c, this.upNodes = new c, h.forEach(this.graph.nodes, function(e) { this.downNodes.set(e, []), this.upNodes.set(e, []) }, this), h.forEach(this.graph.links, function(e) { var t = e.source, n = e.target, i = null, r = null; t.layer > n.layer ? (i = e.source, r = e.target) : (r = e.source, i = e.target), this.downNodes.get(r).push(i), this.upNodes.get(i).push(r) }, this), this.downNodes.forEachValue(function(e) { e.sort(this._gridPositionComparer) }, this), this.upNodes.forEachValue(function(e) { e.sort(this._gridPositionComparer) }, this), n = 0; this.layers.length - 1 > n; ++n) for (r = this.layers[n], a = 0; r.length - 1 > a; a++) if (s = r[a], s.isVirtual && (l = this.downNodes.get(s)[0], l.isVirtual)) for (o = a + 1; r.length > o; ++o) i = r[o], i.isVirtual && (d = this.downNodes.get(i)[0], d.isVirtual && l.gridPosition > d.gridPosition && (u = l.gridPosition, l.gridPosition = d.gridPosition, d.gridPosition = u, p = l.layerIndex, f = d.layerIndex, this.layers[n + 1][p] = d, this.layers[n + 1][f] = l, l.layerIndex = f, d.layerIndex = p)); for (g = this._getLeftWing(), m = this._getRightWing(), v = this.placeLeftToRight(g), _ = this.placeRightToLeft(m), w = new c, h.forEach(this.graph.nodes, function(e) { w.set(e, (v.get(e) + _.get(e)) / 2) }), b = new c, y = new c, n = 0; this.layers.length > n; ++n) for (r = this.layers[n], k = -1, x = -1, o = 0; r.length > o; ++o) i = r[o], b.set(i, 0), y.set(i, !1), i.isVirtual && (-1 === k ? k = o : k === o - 1 ? k = o : (x = o, b.set(r[k], 0), w.get(i) - w.get(r[k]) === this.getMinDist(r[k], i) ? y.set(r[k], !0) : y.set(r[k], !1), k = o)); for (C = [1, -1], h.forEach(C, function(e) { var n, i, r, o, a, s, l, c = 1 === e ? 0 : this.layers.length - 1; for (n = c; n >= 0 && this.layers.length > n; n += e) { if (i = this.layers[n], r = this._firstVirtualNode(i), o = null, a = null, -1 !== r) for (o = i[r], a = [], t = 0; r > t; t++) a.push(i[t]); else o = null, a = i; if (a.length > 0) { for (this._sequencer(w, null, o, e, a), t = 0; a.length - 1 > t; ++t) this.setMinDist(a[t], a[t + 1], w.get(a[t + 1]) - w.get(a[t])); o && this.setMinDist(a[a.length - 1], o, w.get(o) - w.get(a[a.length - 1])) } for (; o;) { if (s = this.nextVirtualNode(i, o)) { if (b.get(o) === e) { for (r = o.layerIndex, l = s.layerIndex, a = [], t = r + 1; l > t; t++) a.push(i[t]); a.length > 0 && this._sequencer(w, o, s, e, a), y.set(o, !0) } } else { for (r = o.layerIndex, a = [], t = r + 1; i.length > t; t++) a.push(i[t]); if (a.length > 0) { for (this._sequencer(w, o, null, e, a), t = 0; a.length - 1 > t; ++t) this.setMinDist(a[t], a[t + 1], w.get(a[t + 1]) - w.get(a[t])); this.setMinDist(o, a[0], w.get(a[0]) - w.get(o)) } } o = s } this.adjustDirections(n, e, b, y) } }, this), S = this._isIncreasingLayout() ? 0 : this.layers.length - 1, T = function(e, t) { return t._isIncreasingLayout() ? t.layers.length > e : e >= 0 }, D = this._isIncreasingLayout() ? 1 : -1, A = 0, t = S; T(t, this); t += D) { for (r = this.layers[t], E = e(r, this), o = 0; r.length > o; ++o) i = r[o], this._isVerticalLayout() ? (i.x = w.get(i), i.y = A + E / 2) : (i.x = A + E / 2, i.y = w.get(i)); A += this.options.layerSeparation + E } }, adjustDirections: function(e, t, n, i) { var r, o, a, s, l, c, d, u, h, p, f, g, m, v; if (!(0 > e + t || e + t >= this.layers.length)) for (r = null, o = null, a = this.layers[e + t], s = 0; a.length > s; ++s) if (l = a[s], l.isVirtual && (c = this.getNeighborOnLayer(l, e), c.isVirtual)) { if (r) { for (d = i.get(o), u = this.layers[e], h = o.layerIndex, p = c.layerIndex, f = h + 1; p > f; ++f) u[f].isVirtual && (d = d && i.get(u[f])); if (d) for (n.set(r, t), g = r.layerIndex, m = l.layerIndex, v = g + 1; m > v; ++v) a[v].isVirtual && n.set(a[v], t) } r = l, o = c } }, getNeighborOnLayer: function(e, t) { var n = this.upNodes.get(e)[0]; return n.layer === t ? n : (n = this.downNodes.get(e)[0], n.layer === t ? n : null) }, _sequencer: function(e, t, n, i, r) { if (1 === r.length && this._sequenceSingle(e, t, n, i, r[0]), r.length > 1) { var o = r.length, a = this.intDiv(o, 2); this._sequencer(e, t, n, i, r.slice(0, a)), this._sequencer(e, t, n, i, r.slice(a)), this.combineSequences(e, t, n, i, r) } }, _sequenceSingle: function(e, t, n, i, r) { var o = -1 === i ? this.downNodes.get(r) : this.upNodes.get(r), a = o.length; 0 !== a && (a % 2 === 1 ? e.set(r, e.get(o[this.intDiv(a, 2)])) : e.set(r, (e.get(o[this.intDiv(a, 2) - 1]) + e.get(o[this.intDiv(a, 2)])) / 2), t && e.set(r, Math.max(e.get(r), e.get(t) + this.getMinDist(t, r))), n && e.set(r, Math.min(e.get(r), e.get(n) - this.getMinDist(r, n)))) }, combineSequences: function(e, t, n, i, r) { var o, a, s, l, c, d, u, h, p, f, g = r.length, m = this.intDiv(g, 2), v = []; for (o = 0; m > o; ++o) { for (a = 0, l = -1 === i ? this.downNodes.get(r[o]) : this.upNodes.get(r[o]), s = 0; l.length > s; ++s) c = l[s], e.get(c) >= e.get(r[o]) ? a++ : (a--, v.push({ k: e.get(c) + this.getMinDist(r[o], r[m - 1]), v: 2 })); v.push({ k: e.get(r[o]) + this.getMinDist(r[o], r[m - 1]), v: a }) } for (t && v.push({ k: e.get(t) + this.getMinDist(t, r[m - 1]), v: Number.MAX_VALUE }), v.sort(this._positionDescendingComparer), u = [], o = m; g > o; ++o) { for (a = 0, l = -1 === i ? this.downNodes.get(r[o]) : this.upNodes.get(r[o]), s = 0; l.length > s; ++s) c = l[s], e.get(c) <= e.get(r[o]) ? a++ : (a--, u.push({ k: e.get(c) - this.getMinDist(r[o], r[m]), v: 2 })); u.push({ k: e.get(r[o]) - this.getMinDist(r[o], r[m]), v: a }) } for (n && u.push({ k: e.get(n) - this.getMinDist(n, r[m]), v: Number.MAX_VALUE }), u.sort(this._positionAscendingComparer), h = 0, p = 0, f = this.getMinDist(r[m - 1], r[m]); e.get(r[m]) - e.get(r[m - 1]) < f;) if (p > h) { if (0 === v.length) { e.set(r[m - 1], e.get(r[m]) - f); break } d = v.shift(), h += d.v, e.set(r[m - 1], d.k), e.set(r[m - 1], Math.max(e.get(r[m - 1]), e.get(r[m]) - f)) } else { if (0 === u.length) { e.set(r[m], e.get(r[m - 1]) + f); break } d = u.shift(), p += d.v, e.set(r[m], d.k), e.set(r[m], Math.min(e.get(r[m]), e.get(r[m - 1]) + f)) } for (o = m - 2; o >= 0; o--) e.set(r[o], Math.min(e.get(r[o]), e.get(r[m - 1]) - this.getMinDist(r[o], r[m - 1]))); for (o = m + 1; g > o; o++) e.set(r[o], Math.max(e.get(r[o]), e.get(r[m]) + this.getMinDist(r[o], r[m]))) }, placeLeft: function(e, t, n) { var i = Number.NEGATIVE_INFINITY; h.forEach(this._getComposite(e), function(e) { var r = this.leftSibling(e); r && this.nodeLeftClass.get(r) === this.nodeLeftClass.get(e) && (t.containsKey(r) || this.placeLeft(r, t, n), i = Math.max(i, t.get(r) + this.getMinDist(r, e))) }, this), i === Number.NEGATIVE_INFINITY && (i = 0), h.forEach(this._getComposite(e), function(e) { t.set(e, i) }) }, placeRight: function(e, t, n) { var i = Number.POSITIVE_INFINITY; h.forEach(this._getComposite(e), function(e) { var r = this.rightSibling(e); r && this.nodeRightClass.get(r) === this.nodeRightClass.get(e) && (t.containsKey(r) || this.placeRight(r, t, n), i = Math.min(i, t.get(r) - this.getMinDist(e, r))) }, this), i === Number.POSITIVE_INFINITY && (i = 0), h.forEach(this._getComposite(e), function(e) { t.set(e, i) }) }, leftSibling: function(e) { var t = this.layers[e.layer], n = e.layerIndex; return 0 === n ? null : t[n - 1] }, rightSibling: function(e) { var t = this.layers[e.layer], n = e.layerIndex; return n === t.length - 1 ? null : t[n + 1] }, _getComposite: function(e) { return e.isVirtual ? this._nodesInLink(e) : [e] }, arrangeNodes: function() { var e, t, n, i, r, o, a, s; for (t = 0; this.layers.length > t; t++) for (i = this.layers[t], n = 0; i.length > n; n++) r = i[n], r.upstreamPriority = r.upstreamLinkCount, r.downstreamPriority = r.downstreamLinkCount; for (o = 2, a = 0; o > a; a++) { for (e = this.layers.length - 1; e >= 1; e--) this.layoutLayer(!1, e); for (e = 0; this.layers.length - 1 > e; e++) this.layoutLayer(!0, e) } for (s = Number.MAX_VALUE, t = 0; this.layers.length > t; t++) for (i = this.layers[t], n = 0; i.length > n; n++) r = i[n], s = Math.min(s, r.gridPosition); if (0 > s) for (t = 0; this.layers.length > t; t++) for (i = this.layers[t], n = 0; i.length > n; n++) r = i[n], r.gridPosition = r.gridPosition - s }, layoutLayer: function(e, t) { var n, i, r, o; for (i = e ? this.layers[n = t + 1] : this.layers[n = t - 1], r = [], o = 0; i.length > o; o++) r.push(i[o]); r.sort(function(e, t) { var n = (e.upstreamPriority + e.downstreamPriority) / 2, i = (t.upstreamPriority + t.downstreamPriority) / 2; return Math.abs(n - i) < 1e-4 ? 0 : i > n ? 1 : -1 }), h.forEach(r, function(e) { var t = e.gridPosition, n = this.calcBaryCenter(e), r = (e.upstreamPriority + e.downstreamPriority) / 2; if (!(Math.abs(t - n) < 1e-4 || Math.abs(t - n) < .2501)) if (n > t) for (; n > t && this.moveRight(e, i, r);) t = e.gridPosition; else for (; t > n && this.moveLeft(e, i, r);) t = e.gridPosition }, this), n > 0 && this.calcDownData(n - 1), this.layers.length - 1 > n && this.calcUpData(n + 1) }, moveRight: function(e, t, n) { var i, r, o = h.indexOf(t, e); return o === t.length - 1 ? (e.gridPosition = e.gridPosition + .5, !0) : (i = t[o + 1], r = (i.upstreamPriority + i.downstreamPriority) / 2, i.gridPosition > e.gridPosition + 1 ? (e.gridPosition = e.gridPosition + .5, !0) : r > n || Math.abs(r - n) < 1e-4 ? !1 : this.moveRight(i, t, n) ? (e.gridPosition = e.gridPosition + .5, !0) : !1) }, moveLeft: function(e, t, n) { var i, r, o = h.indexOf(t, e); return 0 === o ? (e.gridPosition = e.gridPosition - .5, !0) : (i = t[o - 1], r = (i.upstreamPriority + i.downstreamPriority) / 2, e.gridPosition - 1 > i.gridPosition ? (e.gridPosition = e.gridPosition - .5, !0) : r > n || Math.abs(r - n) < 1e-4 ? !1 : this.moveLeft(i, t, n) ? (e.gridPosition = e.gridPosition - .5, !0) : !1) }, mapVirtualNode: function(e, t) { this.nodeToLinkMap.set(e, t), this.linkToNodeMap.containsKey(t) || this.linkToNodeMap.set(t, []), this.linkToNodeMap.get(t).push(e) }, _nodesInLink: function(e) { return this.linkToNodeMap.get(this.nodeToLinkMap.get(e)) }, _dummify: function() { var e, t, n, i, a, s, l, d, u, p, f, g, m, v, _, w, b, y; for (this.linkToNodeMap = new c, this.nodeToLinkMap = new c, u = this.graph.links.slice(0), d = 0; u.length > d; d++) { if (p = u[d], f = p.source, g = p.target, m = f.layer, v = g.layer, _ = f.gridPosition, w = g.gridPosition, b = (w - _) / Math.abs(v - m), y = f, m - v > 1) { for (l = m - 1; l > v; l--) { for (n = new r, n.x = f.x, n.y = f.y, n.width = f.width / 100, n.height = f.height / 100, e = this.layers[l], t = (l - v) * b + _, t > e.length && (t = e.length), _ >= this.layers[m].length - 1 && w >= this.layers[v].length - 1 ? t = e.length : 0 === _ && 0 === w && (t = 0), n.layer = l, n.uBaryCenter = 0, n.dBaryCenter = 0, n.upstreamLinkCount = 0, n.downstreamLinkCount = 0, n.gridPosition = t, n.isVirtual = !0, h.insert(e, n, t), a = t + 1; e.length > a; a++) i = e[a], i.gridPosition = i.gridPosition + 1; s = new o(y, n), s.depthOfDumminess = 0, y = n, this.graph.nodes.push(n), this.graph.addLink(s), n.index = this.graph.nodes.length - 1, this.mapVirtualNode(n, p) } p.changeSource(y), p.depthOfDumminess = m - v - 1 } if (-1 > m - v) { for (l = m + 1; v > l; l++) { for (n = new r, n.x = f.x, n.y = f.y, n.width = f.width / 100, n.height = f.height / 100, e = this.layers[l], t = (l - m) * b + _, t > e.length && (t = e.length), _ >= this.layers[m].length - 1 && w >= this.layers[v].length - 1 ? t = e.length : 0 === _ && 0 === w && (t = 0), n.layer = l, n.uBaryCenter = 0, n.dBaryCenter = 0, n.upstreamLinkCount = 0, n.downstreamLinkCount = 0, n.gridPosition = t, n.isVirtual = !0, t &= t, h.insert(e, n, t), a = t + 1; e.length > a; a++) i = e[a], i.gridPosition = i.gridPosition + 1; s = new o(y, n), s.depthOfDumminess = 0, y = n, this.graph.nodes.push(n), this.graph.addLink(s), n.index = this.graph.nodes.length - 1, this.mapVirtualNode(n, p) } p.changeSource(y), p.depthOfDumminess = v - m - 1 } } }, _dedummify: function() { for (var e, t, n, i, r, o, a, s, l = !0; l;) for (l = !1, e = 0; this.graph.links.length > e; e++) if (t = this.graph.links[e], 0 !== t.depthOfDumminess) { for (n = [], n.unshift({ x: t.target.x, y: t.target.y }), n.unshift({ x: t.source.x, y: t.source.y }), i = t, r = t.depthOfDumminess, o = 0; r > o; o++) a = i.source, s = a.incoming[0], n.unshift({ x: s.source.x, y: s.source.y }), i = s; t.changeSource(i.source), t.depthOfDumminess = 0, n.length > 2 ? (n.splice(0, 1), n.splice(n.length - 1), t.points = n) : t.points = [], l = !0; break } }, _optimizeCrossings: function() { for (var e, t = -1, n = 3, i = 0; 0 !== t && !(i++ > n);) { for (t = 0, e = this.layers.length - 1; e >= 1; e--) t += this.optimizeLayerCrossings(!1, e); for (e = 0; this.layers.length - 1 > e; e++) t += this.optimizeLayerCrossings(!0, e) } }, calcUpData: function(e) { var t, n, i, r, o, a, s, l, c; if (0 !== e) { for (t = this.layers[e], o = new d, a = this.layers[e - 1], n = 0; a.length > n; n++) o.add(a[n]); for (n = 0; t.length > n; n++) { for (s = t[n], l = 0, c = 0, i = 0; s.incoming.length > i; i++) r = s.incoming[i], o.contains(r.source) && (c++, l += r.source.gridPosition); for (i = 0; s.outgoing.length > i; i++) r = s.outgoing[i], o.contains(r.target) && (c++, l += r.target.gridPosition); c > 0 ? (s.uBaryCenter = l / c, s.upstreamLinkCount = c) : (s.uBaryCenter = n, s.upstreamLinkCount = 0) } } }, calcDownData: function(e) { var t, n, i, r, o, a, s, l, c; if (e !== this.layers.length - 1) { for (t = this.layers[e], o = new d, a = this.layers[e + 1], n = 0; a.length > n; n++) o.add(a[n]); for (n = 0; t.length > n; n++) { for (s = t[n], l = 0, c = 0, i = 0; s.incoming.length > i; i++) r = s.incoming[i], o.contains(r.source) && (c++, l += r.source.gridPosition); for (i = 0; s.outgoing.length > i; i++) r = s.outgoing[i], o.contains(r.target) && (c++, l += r.target.gridPosition); c > 0 ? (s.dBaryCenter = l / c, s.downstreamLinkCount = c) : (s.dBaryCenter = n, s.downstreamLinkCount = 0) } } }, optimizeLayerCrossings: function(e, t) { var n, i, r, o, a, s, l, c; for (i = e ? this.layers[n = t + 1] : this.layers[n = t - 1], r = i.slice(0), e ? this.calcUpData(n) : this.calcDownData(n), o = this, i.sort(function(e, t) { var n, i = o.calcBaryCenter(e), r = o.calcBaryCenter(t); return Math.abs(i - r) < 1e-4 ? e.degree() === t.degree() ? o.compareByIndex(e, t) : e.degree() < t.degree() ? 1 : -1 : (n = 1e3 * (r - i), n > 0 ? -1 : 0 > n ? 1 : o.compareByIndex(e, t)) }), s = 0, a = 0; i.length > a; a++) i[a] !== r[a] && s++; if (s > 0) for (l = 0, a = 0; i.length > a; a++) c = i[a], c.gridPosition = l++; return s }, _swapPairs: function() { for (var e, t, n, i, r, o, a, s, l, c, d, u, h, p, f, g, m, v = this.options.layeredIterations, _ = 0;;) { if (_++ > v) break; for (e = 1 >= _ % 4, t = _ % 4 === 1, n = e ? 0 : this.layers.length - 1; e ? this.layers.length - 1 >= n : n >= 0; n += e ? 1 : -1) { for (i = this.layers[n], r = !1, o = !0, a = 0, s = 0; i.length - 1 > s; s++) l = 0, c = 0, d = 0, o ? (0 !== n && (l = this.countLinksCrossingBetweenTwoLayers(n - 1, n)), n !== this.layers.length - 1 && (c = this.countLinksCrossingBetweenTwoLayers(n, n + 1)), e ? l *= 2 : c *= 2, d = l + c) : d = a, 0 !== d && (u = i[s], h = i[s + 1], p = u.gridPosition, f = h.gridPosition, i[s] = h, i[s + 1] = u, u.gridPosition = f, h.gridPosition = p, l = 0, 0 !== n && (l = this.countLinksCrossingBetweenTwoLayers(n - 1, n)), c = 0, n !== this.layers.length - 1 && (c = this.countLinksCrossingBetweenTwoLayers(n, n + 1)), e ? l *= 2 : c *= 2, g = l + c, m = !1, m = t ? g >= d : g > d, m ? (u = i[s], h = i[s + 1], p = u.gridPosition, f = h.gridPosition, i[s] = h, i[s + 1] = u, u.gridPosition = f, h.gridPosition = p, a = d, o = !1) : (r = !0, o = !0)); r && (n !== this.layers.length - 1 && this.calcUpData(n + 1), 0 !== n && this.calcDownData(n - 1)) } } }, countLinksCrossingBetweenTwoLayers: function(e, t) { var n, i, r, o, a, s, l, c, u, p, f, g, m, v, _, w, b, y, k, x, C = 0, S = new d, T = this.layers[e]; for (n = 0; T.length > n; n++) S.add(T[n]); for (i = new d, r = this.layers[t], n = 0; r.length > n; n++) i.add(r[n]); for (o = new d, a = [], s = [], S.forEach(function(e) { h.addRange(s, e.incoming), h.addRange(s, e.outgoing) }), l = 0; s.length > l; l++) c = s[l], S.contains(c.source) && i.contains(c.target) ? (o.add(c), a.push(c)) : i.contains(c.source) && S.contains(c.target) && a.push(c); for (u = 0; a.length > u; u++) for (p = a[u], f = 0; a.length > f; f++) u !== f && (g = a[f], o.contains(p) ? (m = p.source, v = p.target) : (m = p.target, v = p.source), o.contains(g) ? (_ = g.source, w = g.target) : (_ = g.target, w = g.source), b = m.gridPosition, y = v.gridPosition, k = _.gridPosition, x = w.gridPosition, 0 > (b - k) * (y - x) && C++); return C / 2 }, calcBaryCenter: function(e) { var t = e.upstreamLinkCount, n = e.downstreamLinkCount, i = e.uBaryCenter, r = e.dBaryCenter; return t > 0 && n > 0 ? (i + r) / 2 : t > 0 ? i : n > 0 ? r : 0 }, _gridPositionComparer: function(e, t) { return t.gridPosition > e.gridPosition ? -1 : e.gridPosition > t.gridPosition ? 1 : 0 }, _positionAscendingComparer: function(e, t) { return t.k > e.k ? -1 : e.k > t.k ? 1 : 0 }, _positionDescendingComparer: function(e, t) { return t.k > e.k ? 1 : e.k > t.k ? -1 : 0 }, _firstVirtualNode: function(e) { for (var t = 0; e.length > t; t++) if (e[t].isVirtual) return t; return -1 }, compareByIndex: function(e, t) { var n = e.index, i = t.index; return i > n ? 1 : n > i ? -1 : 0 }, intDiv: function(e, t) { return (e - e % t) / t }, nextVirtualNode: function(e, t) { var n, i = t.layerIndex; for (n = i + 1; e.length > n; ++n) if (e[n].isVirtual) return e[n]; return null } }), C = t.Class.extend({ init: function(e, t) { if (h.isUndefined(e)) throw "No diagram given"; this.diagram = e, this.nodeMap = new c, this.linkMap = new c, this.capture(t ? t : e) }, capture: function(e) { var t, i, r, o, a, s, c, d, u; if (e instanceof n.Graph) { for (o = 0; e.nodes.length > o; o++) t = e.nodes[o], r = t.associatedShape, this.nodeMap.set(r.visual.id, new l(t.x, t.y, t.width, t.height)); for (o = 0; e.links.length > o; o++) s = e.links[o], a = s.associatedConnection, this.linkMap.set(a.visual.id, s.points()) } else if (e instanceof Array) for (i = e, o = 0; i.length > o; o++) t = i[o], r = t.associatedShape, r && this.nodeMap.set(r.visual.id, new l(t.x, t.y, t.width, t.height)); else if (e.hasOwnProperty("links") && e.hasOwnProperty("nodes")) { for (i = e.nodes, c = e.links, o = 0; i.length > o; o++) t = i[o], r = t.associatedShape, r && this.nodeMap.set(r.visual.id, new l(t.x, t.y, t.width, t.height)); for (o = 0; c.length > o; o++) s = c[o], a = s.associatedConnection, a && this.linkMap.set(a.visual.id, s.points) } else { for (d = this.diagram.shapes, u = this.diagram.connections, o = 0; d.length > o; o++) r = d[o], this.nodeMap.set(r.visual.id, r.bounds()); for (o = 0; u.length > o; o++) a = u[o], this.linkMap.set(a.visual.id, a.points()) } } }); a(n, { init: function(e) { t.init(e, n.ui) }, SpringLayout: b, TreeLayout: k, GraphAdapter: w, LayeredLayout: x, LayoutBase: _, LayoutState: C }) }(window.kendo.jQuery), function(e, t) { function n(e) { var t = e.originalEvent, n = 0; return t.wheelDelta ? (n = -t.wheelDelta / 40, n = n > 0 ? vt.ceil(n) : vt.floor(n)) : t.detail && (n = t.detail), n } function i(e) { return e.options.name.toLowerCase() === Et.toLowerCase() } function r(e, t) { var n, r, o, a, s = Ft, l = t.connectors; for (r = 0; l.length > r; r++) o = l[r], i(o) || (a = e.distanceTo(o.position()), s > a && (s = a, n = o)); return n } function o(e, t) { var n, i, r, o = [], a = e.drawingContainer().children, s = a.length; for (n = 0; t.length > n; n++) for (i = t[n], r = 0; s > r; r++) if (a[r] == i.drawingContainer()) { o.push(r); break } return o } function a(e) { var t = e.drawingContainer().clippedBBox(null); (0 !== t.origin.x || 0 !== t.origin.y) && e.position(-t.origin.x, -t.origin.y) } function s(e) { var t = {}; return e = e || {}, ht(e.text) && null !== e.text && (t.text = e.text), ht(e.x) && null !== e.x && (t.x = e.x), ht(e.y) && null !== e.y && (t.y = e.y), ht(e.width) && null !== e.width && (t.width = e.width), ht(e.height) && null !== e.height && (t.height = e.height), ht(e.type) && null !== e.type && (t.type = e.type), t } function l(e) { var t = {}; return e = e || {}, ht(e.text) && null !== e.text && (t.content = e.text), ht(e.type) && null !== e.type && (t.type = e.type), ht(e.from) && null !== e.from && (t.from = e.from), ht(e.fromX) && null !== e.fromX && (t.fromX = e.fromX), ht(e.fromY) && null !== e.fromY && (t.fromY = e.fromY), ht(e.to) && null !== e.to && (t.to = e.to), ht(e.toX) && null !== e.toX && (t.toX = e.toX), ht(e.toY) && null !== e.toY && (t.toY = e.toY), t } function c(t, n) { var i, r = this.dataSource.reader.model; r && (i = r.fn.fields.text ? "text" : r.idField, e("<input name='" + n.field + "' />").appendTo(t).kendoDropDownList({ dataValueField: r.idField, dataTextField: i, dataSource: this.dataSource.data().toJSON(), optionLabel: " ", valuePrimitive: !0 })) } function d(e) { this.dataItem = e, this.callbacks = [] } function u() { this.items = {} } function h(e) { var t = e; return e instanceof kendo.data.Model && (t = e.toJSON(), t[e.idField] = e._defaultId), t } function p(e) { var t, n, i = [], r = []; for (n = 0; e.length > n; n++) t = e[n], t instanceof w ? r.push(t) : i.push(t); return { shapes: r, connections: i } } function f(e, t) { return e.reader.model ? new e.reader.model(t) : new kendo.data.ObservableObject(t) } function g(e, t, n) { var i, r; for (r = 0; n.length > r; r++) i = n[r], t && !ht(t[i]) && (t[i] = e[i]) } var m, v, _, w, b, y, k, x, C, S, T, D, A = kendo.dataviz, E = kendo.drawing, I = kendo.geometry, P = A.diagram, M = kendo.ui.Widget, z = kendo.Class, F = e.proxy, R = kendo.deepExtend, H = e.extend, B = kendo.data.HierarchicalDataSource, L = P.Canvas, N = P.Group, O = P.Rectangle, V = P.Circle, U = P.CompositeTransform, W = P.Rect, j = P.Path, G = P.DeleteShapeUnit, q = P.DeleteConnectionUnit, $ = P.TextBlock, Y = P.Image, Q = P.Point, K = P.Intersect, X = P.ConnectionEditAdorner, Z = P.UndoRedoService, J = P.ToolService, et = P.Selector, tt = P.ResizingAdorner, nt = P.ConnectorsAdorner, it = P.Cursors, rt = P.Utils, ot = kendo.Observable, at = P.ToBackUnit, st = P.ToFrontUnit, lt = P.PolylineRouter, ct = P.CascadingRouter, dt = rt.isUndefined, ut = rt.isDefined, ht = kendo.util.defined, pt = e.isArray, ft = kendo.isFunction, gt = rt.isString, mt = e.isPlainObject, vt = Math, _t = ".kendoDiagram", wt = "cascading", bt = "itemBoundsChange", yt = "change", kt = "click", xt = "drag", Ct = "dragEnd", St = "dragStart", Tt = "mouseEnter", Dt = "mouseLeave", At = "error", Et = "Auto", It = "Top", Pt = "Right", Mt = "Left", zt = "Bottom", Ft = 9007199254740992, Rt = "select", Ht = "itemRotate", Bt = "pan", Lt = "zoomStart", Nt = "zoomEnd", Ot = "none", Vt = 600, Ut = 600, Wt = "rectangle", jt = 100, Gt = 100, qt = 20, $t = 20, Yt = 0, Qt = "Yellow", Kt = Number.MAX_VALUE, Xt = -Number.MAX_VALUE, Zt = "absolute", Jt = "transformed", en = "rotated", tn = "transparent", nn = "width", rn = "height", on = "x", an = "y", sn = "DOMMouseScroll" + _t + " mousewheel" + _t, ln = .05, cn = 5, dn = '<a class="k-button k-button-icontext #=className#" href="\\#"><span class="#=iconClass# #=imageClass#"></span>#=text#</a>'; P.DefaultConnectors = [{ name: It }, { name: zt }, { name: Mt }, { name: Pt }, { name: Et, position: function(e) { return e.getPosition("center") } }], m = { cancel: { text: "Cancel", imageClass: "k-cancel", className: "k-diagram-cancel", iconClass: "k-icon" }, update: { text: "Update", imageClass: "k-update", className: "k-diagram-update", iconClass: "k-icon" } }, P.shapeDefaults = function(e) { var t = { type: Wt, path: "", autoSize: !0, visual: null, x: Yt, y: Yt, minWidth: qt, minHeight: $t, width: jt, height: Gt, hover: {}, editable: { connect: !0, tools: [] }, connectors: P.DefaultConnectors, rotation: { angle: 0 } }; return rt.simpleExtend(t, e), t }, v = ot.extend({ init: function(e) { var t = this; t.dataItem = (e || {}).dataItem, ot.fn.init.call(t), t.options = R({ id: P.randomId() }, t.options, e), t.isSelected = !1, t.visual = new N({ id: t.options.id, autoSize: t.options.autoSize }), t._template() }, options: { hover: {}, cursor: it.grip, content: { align: "center middle" }, selectable: !0, serializable: !0, enable: !0 }, _getCursor: function(e) { return this.adorner ? this.adorner._getCursor(e) : this.options.cursor }, visible: function(e) { return dt(e) ? this.visual.visible() : (this.visual.visible(e), t) }, bounds: function() {}, refresh: function() { this.visual.redraw() }, position: function(e) { this.options.x = e.x, this.options.y = e.y, this.visual.position(e) }, toString: function() { return this.options.id }, serialize: function() { var e = R({}, { options: this.options }); return this.dataItem && (e.dataItem = "" + this.dataItem), e }, _content: function(e) { var n, i, r, o; return e !== t && (n = this.options, i = this.bounds(), P.Utils.isString(e) ? n.content.text = e : R(n.content, e), r = n.content, o = this._contentVisual, !o && r.text ? (this._contentVisual = new $(r), this._contentVisual._includeInBBox = !1, this.visual.append(this._contentVisual)) : o && o.redraw(r)), this.options.content.text }, _hitTest: function(e) { var t = this.bounds(); return this.visible() && t.contains(e) && this.options.enable }, _template: function() { var e, t, n = this; n.options.content.template && (e = n.dataItem || {}, t = kendo.template(n.options.content.template, { paramName: "dataItem" }), n.options.content.text = t(e)) }, _canSelect: function() { return this.options.selectable !== !1 }, toJSON: function() { return { id: this.options.id } } }), _ = z.extend({ init: function(e, t) { this.options = R({}, this.options, t), this.connections = [], this.shape = e }, options: { width: 7, height: 7, fill: { color: Qt }, hover: {} }, position: function() { return this.options.position ? this.options.position(this.shape) : this.shape.getPosition(this.options.name) }, toJSON: function() { return { shapeId: "" + this.shape, connector: this.options.name } } }), _.parse = function(e, t) { var n, i, r = t.split(":"), o = r[0], a = r[1] || Et; for (n = 0; e.shapes.length > n; n++) if (i = e.shapes[n], i.options.id == o) return i.getConnector(a.trim()) }, w = v.extend({ init: function(e, n) { var i = this; v.fn.init.call(i, e), this.diagram = n, this.updateOptionsFromModel(), e = i.options, i.connectors = [], i.type = e.type, i.shapeVisual = w.createShapeVisual(i.options), i.visual.append(this.shapeVisual), i.updateBounds(), i.content(i.content()), i._createConnectors(), i.parentContainer = null, i.isContainer = !1, i.isCollapsed = !1, i.id = i.visual.id, e.hasOwnProperty("layout") && e.layout !== t && (i.layout = e.layout.bind(e)) }, options: P.shapeDefaults(), _setOptionsFromModel: function(e) { var t = s(e || this.dataItem); this.options = R({}, this.options, t), this.redrawVisual(), this.options.content && (this._template(), this.content(this.options.content)) }, updateOptionsFromModel: function(e, t) { var n, i; this.diagram && this.diagram._isEditable && (n = s(e || this.dataItem), e && t ? A.inArray(t, ["x", "y", "width", "height"]) ? (i = this.bounds(), i[t] = e[t], this.bounds(i)) : (this.options.visual ? this.redrawVisual() : n.type && (this.options = R({}, this.options, n), this.redrawVisual()), this.options.content && (this._template(), this.content(this.options.content))) : this.options = R({}, this.options, n)) }, redrawVisual: function() { this.visual.clear(), this._contentVisual = null, this.options.dataItem = this.dataItem, this.shapeVisual = w.createShapeVisual(this.options), this.visual.append(this.shapeVisual), this.updateBounds() }, updateModel: function(e) { var t, n, i = this.diagram; i && i._isEditable && (t = this._bounds, n = this.dataItem, n && (i._suspendModelRefresh(), ht(n.x) && t.x !== n.x && n.set("x", t.x), ht(n.y) && t.y !== n.y && n.set("y", t.y), ht(n.width) && t.width !== n.width && n.set("width", t.width), ht(n.height) && t.height !== n.height && n.set("height", t.height), this.dataItem = n, i._resumeModelRefresh(), e && i._syncShapeChanges())) }, updateBounds: function() { var e = this.visual._measure(!0), t = this.options; this.bounds(new W(t.x, t.y, e.width, e.height)), this._rotate(), this._alignContent() }, content: function(e) { var t = this._content(e); return this._alignContent(), t }, _alignContent: function() { var e, t, n, i, r, o = this.options.content || {}, a = this._contentVisual; a && o.align && (e = this.visual._measure(), t = new P.RectAlign(e), n = a.drawingElement.bbox(null), i = new W(0, 0, n.width(), n.height()), r = t.align(i, o.align), a.position(r.topLeft())) }, _createConnectors: function() { var e, t, n = this.options, i = n.connectors.length, r = n.connectorDefaults; for (t = 0; i > t; t++) e = new _(this, R({}, r, n.connectors[t])), this.connectors.push(e) }, bounds: function(e) { var t, n; if (e) if (gt(e)) switch (e) { case Jt: t = this._transformedBounds(); break; case Zt: t = this._transformedBounds(), n = this.diagram._pan, t.x += n.x, t.y += n.y; break; case en: t = this._rotatedBounds(); break; default: t = this._bounds } else this._setBounds(e), this._triggerBoundsChange(), this.refreshConnections(); else t = this._bounds; return t }, _setBounds: function(e) { var t = this.options, n = e.topLeft(), i = t.x = n.x, r = t.y = n.y, o = t.width = vt.max(e.width, t.minWidth), a = t.height = vt.max(e.height, t.minHeight); this._bounds = new W(i, r, o, a), this.visual.redraw({ x: i, y: r, width: o, height: a }) }, position: function(e) { return e ? (this.bounds(new W(e.x, e.y, this._bounds.width, this._bounds.height)), t) : this._bounds.topLeft() }, clone: function() { var e = this.serialize(); return e.options.id = P.randomId(), this.diagram && this.diagram._isEditable && ht(this.dataItem) && (e.options.dataItem = h(this.dataItem)), new w(e.options) }, select: function(e) { var n, i, r = this.diagram; return dt(e) && (e = !0), this._canSelect() && this.isSelected != e ? (n = [], i = [], this.isSelected = e, this.isSelected ? (r._selectedItems.push(this), n.push(this)) : (rt.remove(r._selectedItems, this), i.push(this)), r._internalSelection || r._selectionChanged(n, i), !0) : t }, rotate: function(e, n, i) { var r, o, a, s, l = this.visual.rotate(); return e !== t && (i !== !1 && this.diagram && this.diagram.undoRedoService && e !== l.angle && this.diagram.undoRedoService.add(new P.RotateUnit(this.diagram._resizingAdorner, [this], [l.angle]), !1), r = this.bounds(), o = new Q(r.width / 2, r.height / 2), n && (a = e - l.angle, s = r.center().rotate(n, 360 - a).minus(o), this._rotationOffset = this._rotationOffset.plus(s.minus(r.topLeft())), this.position(s)), this.visual.rotate(e, o), this.options.rotation.angle = e, this.diagram && this.diagram._connectorsAdorner && this.diagram._connectorsAdorner.refresh(), this.refreshConnections(), this.diagram && this.diagram.trigger(Ht, { item: this })), l }, connections: function(e) { var t, n, i, r, o, a, s, l = []; for (t = 0; this.connectors.length > t; t++) for (o = this.connectors[t], r = o.connections, n = 0, r; r.length > n; n++) i = r[n], "out" == e ? (a = i.source(), a.shape && a.shape == this && l.push(i)) : "in" == e ? (s = i.target(), s.shape && s.shape == this && l.push(i)) : l.push(i); return l }, refreshConnections: function() { e.each(this.connections(), function() { this.refresh() }) }, getConnector: function(e) { var t, n; if (!gt(e)) return e instanceof Q ? r(e, this) : this.connectors.length ? this.connectors[0] : null; for (e = e.toLocaleLowerCase(), t = 0; this.connectors.length > t; t++) if (n = this.connectors[t], n.options.name.toLocaleLowerCase() == e) return n }, getPosition: function(e) { var t = this.bounds(), n = e.charAt(0).toLowerCase() + e.slice(1); return ft(t[n]) ? this._transformPoint(t[n]()) : t.center() }, redraw: function(e) { var t, n; e && (t = this.options, this.shapeVisual.redraw(this._visualOptions(e)), this._diffNumericOptions(e, [nn, rn, on, an]) && (this.bounds(new W(t.x, t.y, t.width, t.height)), n = !0), e.connectors && (t.connectors = e.connectors, this._updateConnectors()), t = R(t, e), (e.rotation || n) && this._rotate(), t.content && this.content(t.content)) }, _updateConnectors: function() { var e, t, n, i, r = this.connections(); for (this.connectors = [], this._createConnectors(), i = 0; r.length > i; i++) e = r[i], t = e.source(), n = e.target(), t.shape && t.shape === this ? e.source(this.getConnector(t.options.name) || null) : n.shape && n.shape === this && e.target(this.getConnector(n.options.name) || null), e.updateModel() }, _diffNumericOptions: P.diffNumericOptions, _visualOptions: function(e) { return { data: e.path, source: e.source, hover: e.hover, fill: e.fill, stroke: e.stroke, startCap: e.startCap, endCap: e.endCap } }, _triggerBoundsChange: function() { this.diagram && this.diagram.trigger(bt, { item: this, bounds: this._bounds.clone() }) }, _transformPoint: function(e) { var t = this.rotate(), n = this.bounds(), i = n.topLeft(); return t.angle && e.rotate(t.center().plus(i), 360 - t.angle), e }, _transformedBounds: function() { var e = this.bounds(), t = e.topLeft(), n = e.bottomRight(); return W.fromPoints(this.diagram.modelToView(t), this.diagram.modelToView(n)) }, _rotatedBounds: function() { var e = this.bounds().rotatedBounds(this.rotate().angle), t = e.topLeft(), n = e.bottomRight(); return W.fromPoints(t, n) }, _rotate: function() { var e = this.options.rotation; e && e.angle && this.rotate(e.angle), this._rotationOffset = new Q }, _hover: function(e) { var t = this.options, n = t.hover, i = t.stroke, r = t.fill; e && ut(n.stroke) && (i = R({}, i, n.stroke)), e && ut(n.fill) && (r = n.fill), this.shapeVisual.redraw({ stroke: i, fill: r }), t.editable && t.editable.connect && this.diagram._showConnectors(this, e) }, _hitTest: function(e) { if (this.visible()) { var t, n = this.bounds(), i = this.rotate().angle; if (e.isEmpty && !e.isEmpty()) return K.rects(e, n, i ? i : 0); if (t = e.clone().rotate(n.center(), i), n.contains(t)) return this } }, toJSON: function() { return { shapeId: this.options.id } } }), w.createShapeVisual = function(e) { var t, n, i, r; return delete e.diagram, t = R({}, e, { x: 0, y: 0 }), n = t.visual, i = (t.type + "").toLocaleLowerCase(), ft(n) ? r = n.call(this, t) : t.path ? (t.data = t.path, r = new j(t), a(r)) : r = "rectangle" == i ? new O(t) : "circle" == i ? new V(t) : "text" == i ? new $(t) : "image" == i ? new Y(t) : new j(t), r }, b = v.extend({ init: function(e, t, n) { var i = this; v.fn.init.call(i, n), this.updateOptionsFromModel(), this._initRouter(), i.path = new P.Polyline(i.options), i.path.fill(tn), i.visual.append(i.path), i._sourcePoint = i._targetPoint = new Q, i.source(e), i.target(t), i.content(i.options.content), i.definers = [], ht(n) && n.points && i.points(n.points), i.refresh() }, options: { hover: { stroke: {} }, startCap: Ot, endCap: Ot, points: [], selectable: !0 }, _setOptionsFromModel: function(e) { this.updateOptionsFromModel(e || this.dataItem) }, updateOptionsFromModel: function(e) { var t, n; this.diagram && this.diagram._isEditable && (t = this.diagram._dataMap, n = l(e || this.dataItem), e ? (ht(n.from) ? this.source(t[n.from]) : ht(n.fromX) && ht(n.fromY) && this.source(new Q(n.fromX, n.fromY)), ht(n.to) ? this.target(t[n.to]) : ht(n.toX) && ht(n.toY) && this.target(new Q(n.toX, n.toY)), ht(n.type) && this.type() !== n.type && (this.points([]), this.type(n.type)), this.dataItem = e, this._template(), this.redraw(this.options)) : this.options = R({}, n, this.options)) }, updateModel: function(e) { if (this.diagram && this.diagram._isEditable && this.diagram.connectionsDataSource) { var t = this.diagram.connectionsDataSource.getByUid(this.dataItem.uid); t && (this.diagram._suspendModelRefresh(), ht(this.options.fromX) && null !== this.options.fromX ? (t.set("from", null), t.set("fromX", this.options.fromX), t.set("fromY", this.options.fromY)) : (t.set("from", this.options.from), t.set("fromX", null), t.set("fromY", null)), ht(this.options.toX) && null !== this.options.toX ? (t.set("to", null), t.set("toX", this.options.toX), t.set("toY", this.options.toY)) : (t.set("to", this.options.to), t.set("toX", null), t.set("toY", null)), ht(this.options.type) && ht(t.type) && t.set("type", this.options.type), this.dataItem = t, this.diagram._resumeModelRefresh(), e && this.diagram._syncConnectionChanges()) } }, sourcePoint: function() { return this._resolvedSourceConnector ? this._resolvedSourceConnector.position() : this._sourcePoint }, source: function(e, n) { var i, r; if (ut(e)) { if (r = e instanceof w, r && !e.getConnector(Et)) return; n && this.diagram && this.diagram.undoRedoService.addCompositeItem(new P.ConnectionEditUnit(this, e)), e !== t && (this.from = e), this._removeFromSourceConnector(), null === e ? this.sourceConnector && (this._sourcePoint = this._resolvedSourceConnector.position(), this._clearSourceConnector(), this._setFromOptions(null, this._sourcePoint)) : e instanceof _ ? (i = e.shape.dataItem, i && this._setFromOptions(i.id), this.sourceConnector = e, this.sourceConnector.connections.push(this)) : e instanceof Q ? (this._setFromOptions(null, e), this._sourcePoint = e, this.sourceConnector && this._clearSourceConnector()) : r && (i = e.dataItem, i && this._setFromOptions(i.id), this.sourceConnector = e.getConnector(Et), this.sourceConnector.connections.push(this)), this.refresh() } return this.sourceConnector ? this.sourceConnector : this._sourcePoint }, _setFromOptions: function(e, t) { this.options.from = e, t ? (this.options.fromX = t.x, this.options.fromY = t.y) : (this.options.fromX = null, this.options.fromY = null) }, sourceDefiner: function(e) { if (!e) return this._sourceDefiner || (this._sourceDefiner = new P.PathDefiner(this.sourcePoint(), null, null)), this._sourceDefiner; if (!(e instanceof P.PathDefiner)) throw "The sourceDefiner needs to be a PathDefiner."; e.left = null, this._sourceDefiner = e, this.source(e.point) }, targetPoint: function() { return this._resolvedTargetConnector ? this._resolvedTargetConnector.position() : this._targetPoint }, target: function(e, n) { var i, r; if (ut(e)) { if (r = e instanceof w, r && !e.getConnector(Et)) return; n && this.diagram && this.diagram.undoRedoService.addCompositeItem(new P.ConnectionEditUnit(this, t, e)), e !== t && (this.to = e), this._removeFromTargetConnector(), null === e ? this.targetConnector && (this._targetPoint = this._resolvedTargetConnector.position(), this._clearTargetConnector(), this._setToOptions(null, this._targetPoint)) : e instanceof _ ? (i = e.shape.dataItem, i && this._setToOptions(i.id), this.targetConnector = e, this.targetConnector.connections.push(this)) : e instanceof Q ? (this._setToOptions(null, e), this._targetPoint = e, this.targetConnector && this._clearTargetConnector()) : r && (i = e.dataItem, i && this._setToOptions(i.id), this.targetConnector = e.getConnector(Et), this.targetConnector.connections.push(this)), this.refresh() } return this.targetConnector ? this.targetConnector : this._targetPoint }, _setToOptions: function(e, t) { this.options.to = e, t ? (this.options.toX = t.x, this.options.toY = t.y) : (this.options.toX = null, this.options.toY = null) }, targetDefiner: function(e) { if (!e) return this._targetDefiner || (this._targetDefiner = new P.PathDefiner(this.targetPoint(), null, null)), this._targetDefiner; if (!(e instanceof P.PathDefiner)) throw "The sourceDefiner needs to be a PathDefiner."; e.right = null, this._targetDefiner = e, this.target(e.point) }, _updateConnectors: function() { this._updateConnector(this.source(), "source"), this._updateConnector(this.target(), "target") }, _updateConnector: function(e, t) { var n, i, r, o, a = this, s = a.diagram; e instanceof _ && !s.getShapeById(e.shape.id) ? (n = e.shape.dataItem, i = e.options.name, r = function() { var r = s._dataMap[n.id]; e = r.getConnector(i), a[t](e, !1), a.updateModel() }, s._dataMap[n.id] ? r() : (o = s._inactiveShapeItems.getByUid(n.uid), o && s._deferredConnectionUpdates.push(o.onActivate(r)))) : a[t](e, !1) }, content: function(e) { var t = this._content(e); return ht(e) && this._alignContent(), t }, _alignContent: function() { var e, t, n, i; this._contentVisual && (e = this._bounds.topLeft(), t = this.sourcePoint().minus(e), n = this.targetPoint().minus(e), i = Q.fn.middleOf(t, n), this._contentVisual.position(new Q(i.x + e.x, i.y + e.y))) }, select: function(e) { var n, i, r = this.diagram; return this._canSelect() && this.isSelected !== e ? (this.isSelected = e, n = [], i = [], this.isSelected ? (this.adorner = new X(this, this.options.selection), r._adorn(this.adorner, !0), r._selectedItems.push(this), n.push(this)) : this.adorner && (r._adorn(this.adorner, !1), rt.remove(r._selectedItems, this), this.adorner = t, i.push(this)), this.adorner && this.adorner.refresh(), r._internalSelection || r._selectionChanged(n, i), !0) : t }, bounds: function(e) { return !e || gt(e) ? this._bounds : (this._bounds = e, t) }, type: function(e) { var n = this.options; return e ? (e !== n.type && (n.type = e, this._initRouter(), this.refresh()), t) : n.type }, _initRouter: function() { var e = (this.options.type || "").toLowerCase(); this._router = e == wt ? new ct(this) : new lt(this) }, points: function(e) { var t, n, i, r; if (!e) { if (i = [], ut(this.definers)) for (r = 0; this.definers.length > r; r++) i.push(this.definers[r].point); return i } for (this.definers = [], t = 0; e.length > t; t++) if (n = e[t], n instanceof P.Point) this.definers.push(new P.PathDefiner(n)); else { if (!n.hasOwnProperty("x") || !n.hasOwnProperty("y")) throw "A Connection point needs to be a Point or an object with x and y properties."; this.definers.push(new P.PathDefiner(new Q(n.x, n.y))) } }, allPoints: function() { var e, t = [this.sourcePoint()]; if (this.definers) for (e = 0; this.definers.length > e; e++) t.push(this.definers[e].point); return t.push(this.targetPoint()), t }, refresh: function() { this._resolveConnectors(), this._refreshPath(), this._alignContent(), this.adorner && this.adorner.refresh() }, _resolveConnectors: function() { var e, t, n, o, a = this, s = a.source(), l = a.target(); s instanceof Q ? e = s : s instanceof _ && (i(s) ? n = s.shape : (a._resolvedSourceConnector = s, e = s.position())), l instanceof Q ? t = l : l instanceof _ && (i(l) ? o = l.shape : (a._resolvedTargetConnector = l, t = l.position())), e ? o && (a._resolvedTargetConnector = r(e, o)) : n && (t ? a._resolvedSourceConnector = r(t, n) : o && this._resolveAutoConnectors(n, o)) }, _resolveAutoConnectors: function(e, t) { var n, r, o, a, s, l, c, d, u, h, p, f, g = Ft, m = Ft, v = e.connectors; for (h = 0; v.length > h; h++) if (d = v[h], !i(d)) for (a = d.position(), n = t.connectors, p = 0; n.length > p; p++) u = n[p], i(u) || (s = u.position(), f = vt.round(a.distanceTo(s)), g > f && this.diagram && this._testRoutePoints(a, s, d, u) && (g = f, r = d, o = u), m > f && (l = d, c = u, m = f)); r && (l = r, c = o), this._resolvedSourceConnector = l, this._resolvedTargetConnector = c }, _testRoutePoints: function(e, t, n, i) { var r, o, a, s, l, c, d = this._router, u = !0; if (d instanceof ct) for (r = d.routePoints(e, t, n, i), r.unshift(e), r.push(t), s = [n.shape, i.shape], c = 1; r.length > c; c++) if (o = r[c - 1], a = r[c], l = new W(vt.min(o.x, a.x), vt.min(o.y, a.y), vt.abs(o.x - a.x), vt.abs(o.y - a.y)), this.diagram._shapesQuadTree.hitTestRect(l, s)) { u = !1; break } return u }, redraw: function(e) { if (e) { this.options = R({}, this.options, e); var t = this.options.points; ht(t) && t.length > 0 && (this.points(t), this._refreshPath()), (e && e.content || e.text) && this.content(e.content), this.path.redraw({ fill: e.fill, stroke: e.stroke, startCap: e.startCap, endCap: e.endCap }) } }, clone: function() { var e = this.serialize(); return this.diagram && this.diagram._isEditable && ht(this.dataItem) && (e.options.dataItem = h(this.dataItem)), new b(this.from, this.to, e.options) }, serialize: function() { var e = this.from.toJSON ? this.from.toJSON : "" + this.from, t = this.to.toJSON ? this.to.toJSON : "" + this.to, n = R({}, { options: this.options, from: e, to: t }); return ht(this.dataItem) && (n.dataItem = "" + this.dataItem), n.options.points = this.points(), n }, _hitTest: function(e) { if (this.visible()) { var t = new Q(e.x, e.y), n = this.sourcePoint(), i = this.targetPoint(); if (e.isEmpty && !e.isEmpty() && e.contains(n) && e.contains(i)) return this; if (this._router.hitTest(t)) return this } }, _hover: function(e) { var t = (this.options.stroke || {}).color; e && ut(this.options.hover.stroke.color) && (t = this.options.hover.stroke.color), this.path.redraw({ stroke: { color: t } }) }, _refreshPath: function() { ht(this.path) && (this._drawPath(), this.bounds(this._router.getBounds())) }, _drawPath: function() { var e, t, n; this._router && this._router.route(), e = this.sourcePoint(), t = this.targetPoint(), n = this.points(), this.path.redraw({ points: [e].concat(n, [t]) }) }, _clearSourceConnector: function() { rt.remove(this.sourceConnector.connections, this), this.sourceConnector = t, this._resolvedSourceConnector = t }, _clearTargetConnector: function() { rt.remove(this.targetConnector.connections, this), this.targetConnector = t, this._resolvedTargetConnector = t }, _removeFromSourceConnector: function() { this.sourceConnector && rt.remove(this.sourceConnector.connections, this) }, _removeFromTargetConnector: function() { this.targetConnector && rt.remove(this.targetConnector.connections, this) } }), y = M.extend({ init: function(e, t) { var n = this; kendo.destroy(e), M.fn.init.call(n, e, t), n._initTheme(), n._initElements(), n._extendLayoutOptions(n.options), n._initDefaults(t), n._initCanvas(), n.mainLayer = new N({ id: "main-layer" }), n.canvas.append(n.mainLayer), n._shapesQuadTree = new D(n), n._pan = new Q, n._adorners = [], n.adornerLayer = new N({ id: "adorner-layer" }), n.canvas.append(n.adornerLayer), n._createHandlers(), n._initialize(), n._fetchFreshData(), n._createGlobalToolBar(), n._resizingAdorner = new tt(n, { editable: n.options.editable }), n._connectorsAdorner = new nt(n), n._adorn(n._resizingAdorner, !0), n._adorn(n._connectorsAdorner, !0), n.selector = new et(n), n._clipboard = [], n.pauseMouseHandlers = !1, n._createShapes(), n._createConnections(), n.options.layout && n.layout(n.options.layout), n.zoom(n.options.zoom), n.canvas.draw() }, options: { name: "Diagram", theme: "default", layout: "", zoomRate: .1, zoom: 1, zoomMin: 0, zoomMax: 2, dataSource: {}, draggable: !0, template: "", autoBind: !0, editable: { rotate: {}, resize: {}, text: !0, tools: [], drag: { snap: { size: 10, angle: 10 } }, remove: !0 }, pannable: { key: "ctrl" }, selectable: { key: "none" }, tooltip: { enabled: !0, format: "{0}" }, copy: { enabled: !0, offsetX: 20, offsetY: 20 }, shapeDefaults: P.shapeDefaults({ undoable: !0 }), connectionDefaults: { editable: { tools: [] }, type: wt }, shapes: [], connections: [] }, events: [Nt, Lt, Bt, Rt, Ht, bt, yt, kt, Tt, Dt, "toolBarClick", "save", "cancel", "edit", "remove", "add", "dataBound", St, xt, Ct], _createGlobalToolBar: function() { var e, t = this.options.editable; t && (e = t.tools, this._isEditable && 0 === e.length && (e = ["createShape", "undo", "redo", "rotateClockwise", "rotateAnticlockwise"]), e && e.length && (this.toolBar = new k(this, { tools: e || {}, click: F(this._toolBarClick, this), modal: !1 }), this.toolBar.element.css({ textAlign: "left" }), this.element.prepend(this.toolBar.element), this._resize())) }, createShape: function() { var e, t, n, i, r, o; (this.editor && this.editor.end() || !this.editor) && (e = this.dataSource, t = e.view() || [], n = t.length, i = f(e, {}), r = this._createShape(i, {}), this.trigger("add", { shape: r }) || (e.insert(n, i), o = this._inactiveShapeItems.getByUid(i.uid), o.element = r, this.edit(r))) }, _createShape: function(e, t) { t = R({}, this.options.shapeDefaults, t), t.dataItem = e; var n = new w(t, this); return n }, createConnection: function() { var e, t, n, i, r; (this.editor && this.editor.end() || !this.editor) && (e = this.connectionsDataSource, t = e.view() || [], n = t.length, i = f(e, {}), r = this._createConnection(i), this.trigger("add", { connection: r }) || (this._connectionsDataMap[i.uid] = r, e.insert(n, i), this.addConnection(r, !1), this.edit(r))) }, _createConnection: function(e, t, n) { var i, r = R({}, this.options.connectionDefaults); return r.dataItem = e, i = new b(t || new Q, n || new Q, r) }, editModel: function(e, t) { var n, i, r, o; if (this.cancelEdit(), r = this.options.editable, "shape" == t) n = r.shapeEditors, i = r.shapeTemplate; else { if ("connection" != t) return; o = F(c, this), n = R({}, { from: o, to: o }, r.connectionEditors), i = r.connectionTemplate } this.editor = new C(this.element, { update: F(this._update, this), cancel: F(this._cancel, this), model: e, type: t, target: this, editors: n, template: i }), this.trigger("edit", this._editArgs()) }, edit: function(e) { if (e.dataItem) { var t = e instanceof w ? "shape" : "connection"; this.editModel(e.dataItem, t) } }, cancelEdit: function() { this.editor && (this._getEditDataSource().cancelChanges(this.editor.model), this._destroyEditor()) }, saveEdit: function() { this.editor && this.editor.end() && !this.trigger("save", this._editArgs()) && this._getEditDataSource().sync() }, _update: function() { this.editor && this.editor.end() && !this.trigger("save", this._editArgs()) && (this._getEditDataSource().sync(), this._destroyEditor()) }, _cancel: function() { var e, t; this.editor && !this.trigger("cancel", this._editArgs()) && (e = this.editor.model, this._getEditDataSource().cancelChanges(e), t = this._connectionsDataMap[e.uid] || this._dataMap[e.id], t && t._setOptionsFromModel(e), this._destroyEditor()) }, _getEditDataSource: function() { return "shape" === this.editor.options.type ? this.dataSource : this.connectionsDataSource }, _editArgs: function() { var e = { container: this.editor.element }; return e[this.editor.options.type] = this.editor.model, e }, _destroyEditor: function() { this.editor && (this.editor.close(), this.editor = null) }, _initElements: function() { this.wrapper = this.element.empty().css("position", "relative").attr("tabindex", 0).addClass("k-widget k-diagram"), this.scrollable = e("<div />").appendTo(this.element) }, _initDefaults: function(e) { var t = this.options, n = t.editable, i = t.shapeDefaults, r = t.connectionDefaults, o = (e || {}).shapeDefaults; n === !1 ? (i.editable = !1, r.editable = !1) : (g(n, i.editable, ["drag", "remove", "connect"]), g(n, r.editable, ["drag", "remove"])), o && o.connectors && (t.shapeDefaults.connectors = o.connectors) }, _initCanvas: function() { var t = e("<div class='k-layer'></div>").appendTo(this.scrollable)[0], n = this.viewport(); this.canvas = new L(t, { width: n.width || Vt, height: n.height || Ut }) }, _createHandlers: function() { var e = this, t = e.element; t.on(sn, F(e._wheel, e)), kendo.support.touch || kendo.support.mobileOS ? (e._userEvents = new kendo.UserEvents(t, { multiTouch: !0, tap: F(e._tap, e) }), e._userEvents.bind(["gesturestart", "gesturechange", "gestureend"], { gesturestart: F(e._gestureStart, e), gesturechange: F(e._gestureChange, e), gestureend: F(e._gestureEnd, e) }), e.toolService = new J(e), e.options.pannable !== !1 && e.scroller.enable()) : (e.toolService = new J(e), this.scroller.wrapper.on("mousemove" + _t, F(e._mouseMove, e)).on("mouseup" + _t, F(e._mouseUp, e)).on("mousedown" + _t, F(e._mouseDown, e)).on("mouseover" + _t, F(e._mouseover, e)).on("mouseout" + _t, F(e._mouseout, e)), t.on("keydown" + _t, F(e._keydown, e))), this._syncHandler = F(e._syncChanges, e), e._resizeHandler = F(e.resize, e, !1), kendo.onResize(e._resizeHandler), this.bind(Lt, F(e._destroyToolBar, e)), this.bind(Bt, F(e._destroyToolBar, e)) }, _tap: function(e) { var t, n = this.toolService, i = this._caculateMobilePosition(e); n._updateHoveredItem(i), n.hoveredItem && (t = n.hoveredItem, this.options.selectable !== !1 && (this._destroyToolBar(), t.isSelected ? t.select(!1) : this.select(t, { addToSelection: !0 }), this._createToolBar()), this.trigger("click", { item: t, point: i })) }, _caculateMobilePosition: function(e) { return this.documentToModel(Q(e.x.location, e.y.location)) }, _gestureStart: function(e) { var t, n; this._destroyToolBar(), this.scroller.disable(), t = this.documentToModel(new Q(e.center.x, e.center.y)), n = { point: t, zoom: this.zoom() }, this.trigger(Lt, n) || (this._gesture = e, this._initialCenter = t) }, _gestureChange: function(e) { var t, n, i = this._gesture, r = this._initialCenter, o = this.documentToView(new Q(e.center.x, e.center.y)), a = e.distance / i.distance, s = this._zoom, l = !1; vt.abs(a - 1) >= ln && (this._zoom = s = this._getValidZoom(s * a), this.options.zoom = s, this._gesture = e, l = !0), t = r.times(s), n = o.minus(t), (l || this._pan.distanceTo(n) >= cn) && (this._panTransform(n), this._updateAdorners()), e.preventDefault() }, _gestureEnd: function() { this.options.pannable !== !1 && this.scroller.enable(), this.trigger(Nt, { point: this._initialCenter, zoom: this.zoom() }) }, _resize: function() { var e = this.viewport(); this.canvas && this.canvas.size(e), this.scrollable && this.toolBar && this.scrollable.height(e.height) }, _mouseover: function(e) { var t = e.target._kendoNode; t && t.srcElement._hover && t.srcElement._hover(!0, t.srcElement) }, _mouseout: function(e) { var t = e.target._kendoNode; t && t.srcElement._hover && t.srcElement._hover(!1, t.srcElement) }, _initTheme: function() { var e = this, t = A.ui.themes || {}, n = ((e.options || {}).theme || "").toLowerCase(), i = (t[n] || {}).diagram; e.options = R({}, i, e.options) }, _createShapes: function() { var e, t, n = this, i = n.options, r = i.shapes; for (t = 0; r.length > t; t++) e = r[t], n.addShape(e) }, _createConnections: function() { var e, t, n, i, r = this, o = r.options, a = o.connectionDefaults, s = o.connections; for (i = 0; s.length > i; i++) e = s[i], t = r._findConnectionShape(e.from), n = r._findConnectionShape(e.to), r.connect(t, n, R({}, a, e)) }, _findConnectionShape: function(e) { var t = this, n = gt(e) ? e : e.shapeId, i = t.getShapeById(n); return i.getConnector(e.connector || Et) }, destroy: function() { var e = this; M.fn.destroy.call(e), this._userEvents && this._userEvents.destroy(), kendo.unbindResize(e._resizeHandler), e.clear(), e.element.off(_t), e.scroller.wrapper.off(_t), e.canvas.destroy(!0), e.canvas = t, e._destroyEditor(), e.destroyScroller(), e._destroyGlobalToolBar(), e._destroyToolBar() }, destroyScroller: function() { var e = this.scroller; e && (e.destroy(), e.element.remove(), this.scroller = null) }, save: function() { var e, t, n, i, r = {}; for (r.shapes = [], r.connections = [], e = 0; this.shapes.length > e; e++) t = this.shapes[e], t.options.serializable && r.shapes.push(t.options); for (e = 0; this.connections.length > e; e++) n = this.connections[e], i = R({}, n.options, { from: n.from.toJSON(), to: n.to.toJSON() }), r.connections.push(i); return r }, focus: function() { if (!this.element.is(kendo._activeElement())) { var e, t = this.element, n = t[0], i = [], r = [], o = document.documentElement; do n = n.parentNode, n.scrollHeight > n.clientHeight && (i.push(n), r.push(n.scrollTop)); while (n != o); for (t.focus(), e = 0; i.length > e; e++) i[e].scrollTop = r[e] } }, load: function(e) { this.clear(), this.setOptions(e), this._createShapes(), this._createConnections() }, setOptions: function(e) { R(this.options, e) }, clear: function() { var e = this; e.select(!1), e.mainLayer.clear(), e._shapesQuadTree.clear(), e._initialize() }, connect: function(e, t, n) { var i, r; return this.connectionsDataSource && this._isEditable ? (r = this.connectionsDataSource.add({}), i = this._connectionsDataMap[r.uid], i.source(e), i.target(t), i.redraw(n), i.updateModel()) : (i = new b(e, t, R({}, this.options.connectionDefaults, n)), this.addConnection(i)), i }, connected: function(e, t) { var n, i; for (n = 0; this.connections.length > n; n++) if (i = this.connections[n], i.from == e && i.to == t) return !0; return !1 }, addConnection: function(e, t) { return t !== !1 && this.undoRedoService.add(new P.AddConnectionUnit(e, this), !1), e.diagram = this, e._setOptionsFromModel(), e.refresh(), this.mainLayer.append(e.visual), this.connections.push(e), this.trigger(yt, { added: [e], removed: [] }), e }, _addConnection: function(e, t) { var n, i = this.connectionsDataSource; if (i && this._isEditable) { if (n = f(i, h(e.dataItem)), e.dataItem = n, e.updateModel(), !this.trigger("add", { connection: e })) return this._connectionsDataMap[n.uid] = e, i.add(n), this.addConnection(e, t), e._updateConnectors(), e } else if (!this.trigger("add", { connection: e })) return this.addConnection(e, t), e._updateConnectors(), e }, addShape: function(e, t) { var n, i = this.options.shapeDefaults; if (e instanceof w) i = R({}, i, t), e.redraw(t), n = e; else { if (e instanceof kendo.Class) return; i = R({}, i, e || {}), n = new w(i) } return i.undoable && this.undoRedoService.add(new P.AddShapeUnit(n, this), !1), this.shapes.push(n), n.diagram = this, this.mainLayer.append(n.visual), this._shapesQuadTree.insert(n), this.trigger(yt, { added: [n], removed: [] }), n.hasOwnProperty("layout") && n.layout(n), n }, _addShape: function(e, t) { var n, i, r = this, o = r.dataSource; if (o && this._isEditable) { if (n = f(o, h(e.dataItem)), e.dataItem = n, e.updateModel(), !this.trigger("add", { shape: e })) return this.dataSource.add(n), i = this._inactiveShapeItems.getByUid(n.uid), i.element = e, i.undoable = t, e } else if (!this.trigger("add", { shape: e })) return this.addShape(e, { undoable: t }) }, remove: function(e, t) { var n, i, r, o; for (e = pt(e) ? e.slice(0) : [e], n = p(e), i = n.shapes, r = n.connections, ht(t) || (t = !0), t && this.undoRedoService.begin(), this._suspendModelRefresh(), o = i.length - 1; o >= 0; o--) this._removeItem(i[o], t, r); for (o = r.length - 1; o >= 0; o--) this._removeItem(r[o], t); this._resumeModelRefresh(), t && this.undoRedoService.commit(!1), this.trigger(yt, { added: [], removed: e }) }, _removeShapeDataItem: function(e) { this._isEditable && (this.dataSource.remove(e.dataItem), delete this._dataMap[e.dataItem.id]) }, _removeConnectionDataItem: function(e) { this._isEditable && (this.connectionsDataSource.remove(e.dataItem), delete this._connectionsDataMap[e.dataItem.uid]) }, _triggerRemove: function(e) { var t, n, i, r, o = []; for (r = 0; e.length > r; r++) t = e[r], i = t.options.editable, n = t instanceof w ? { shape: t } : { connection: t }, i && i.remove !== !1 && !this.trigger("remove", n) && o.push(t); return o }, undo: function() { this.undoRedoService.undo() }, redo: function() { this.undoRedoService.redo() }, select: function(e, t) { if (!ut(e)) return this._selectedItems; t = R({ addToSelection: !1 }, t); var n, i, r = t.addToSelection, o = [], a = []; for (r || this.deselect(), this._internalSelection = !0, e instanceof Array ? o = e : e instanceof v && (o = [e]), n = 0; o.length > n; n++) i = o[n], i.select(!0) && a.push(i); this._selectionChanged(a, []), this._internalSelection = !1 }, selectAll: function() { this.select(this.shapes.concat(this.connections)) }, selectArea: function(e) { var t, n, i, r; if (this._internalSelection = !0, r = [], e instanceof W) for (n = this.shapes.concat(this.connections), t = 0; n.length > t; t++) i = n[t], e && !i._hitTest(e) || !i.options.enable || i.select(!0) && r.push(i); this._selectionChanged(r, []), this._internalSelection = !1 }, deselect: function(e) { this._internalSelection = !0; var t, n, i = [], r = []; for (e instanceof Array ? r = e : e instanceof v ? r.push(e) : ut(e) || (r = this._selectedItems.slice(0)), n = 0; r.length > n; n++) t = r[n], t.select(!1) && i.push(t); this._selectionChanged([], i), this._internalSelection = !1 }, toFront: function(e, t) { var n, i, r; e || (e = this._selectedItems.slice()), n = this._getDiagramItems(e), !ht(t) || t ? (i = o(this.mainLayer, n.visuals), r = new st(this, e, i), this.undoRedoService.add(r)) : (this.mainLayer.toFront(n.visuals), this._fixOrdering(n, !0)) }, toBack: function(e, t) { var n, i, r; e || (e = this._selectedItems.slice()), n = this._getDiagramItems(e), !ht(t) || t ? (i = o(this.mainLayer, n.visuals), r = new at(this, e, i), this.undoRedoService.add(r)) : (this.mainLayer.toBack(n.visuals), this._fixOrdering(n, !1)) }, bringIntoView: function(e, t) { var n, i, r, o, a = this.viewport(), s = new P.RectAlign(a); 0 !== a.width && 0 !== a.height && (t = R({ animate: !1, align: "center middle" }, t), "none" == t.align && (t.align = "center middle"), e instanceof v ? i = e.bounds(Jt) : pt(e) ? i = this.boundingBox(e) : e instanceof W && (i = e.clone()), r = i.clone(), i.zoom(this._zoom), this._storePan(new Q), (i.width > a.width || i.height > a.height) && (this._zoom = this._getValidZoom(vt.min(a.width / r.width, a.height / r.height)), i = r.clone().zoom(this._zoom)), this._zoomMainLayer(), n = i.clone(), s.align(i, t.align), o = i.topLeft().minus(n.topLeft()), this.pan(o.times(-1), t.animate)) }, alignShapes: function(e) { var t, n, i, r, o, a, s; if (dt(e) && (e = "Left"), t = this.select(), 0 !== t.length) { switch (e.toLowerCase()) { case "left": case "top": n = Kt; break; case "right": case "bottom": n = Xt } for (r = 0; t.length > r; r++) if (i = t[r], i instanceof w) switch (e.toLowerCase()) { case "left": n = vt.min(n, i.options.x); break; case "top": n = vt.min(n, i.options.y); break; case "right": n = vt.max(n, i.options.x); break; case "bottom": n = vt.max(n, i.options.y) } for (o = [], a = [], r = 0; t.length > r; r++) if (i = t[r], i instanceof w) switch (a.push(i), o.push(i.bounds()), e.toLowerCase()) { case "left": case "right": i.position(new Q(n, i.options.y)); break; case "top": case "bottom": i.position(new Q(i.options.x, n)) } s = new P.TransformUnit(a, o), this.undoRedoService.add(s, !1) } }, zoom: function(e, t) { var n, i, r, o; return e && (n = t ? t.point : new P.Point(0, 0), e = this._zoom = this._getValidZoom(e), dt(n) || (n = new P.Point(vt.round(n.x), vt.round(n.y)), i = n.times(e), r = this.modelToView(n), o = r.minus(i), this._storePan(new P.Point(vt.round(o.x), vt.round(o.y)))), t && (t.zoom = e), this._panTransform(), this._updateAdorners()), this._zoom }, _getPan: function(e) { var t = this.canvas; return t.translate || (e = e.plus(this._pan)), e }, pan: function(e, t) { var n, i; e instanceof Q && (n = this, i = n.scroller, e = n._getPan(e), e = e.times(-1), t ? i.animatedScrollTo(e.x, e.y, function() { n._updateAdorners() }) : (i.scrollTo(e.x, e.y), n._updateAdorners())) }, viewport: function() { var e = this.element, t = e.width(), n = e.height(); return this.toolBar && (n -= this.toolBar.element.outerHeight()), new W(0, 0, t, n) }, copy: function() { var e, t; if (this.options.copy.enabled) for (this._clipboard = [], this._copyOffset = 1, e = 0; this._selectedItems.length > e; e++) t = this._selectedItems[e], this._clipboard.push(t) }, cut: function() { var e, t; if (this.options.copy.enabled) { for (this._clipboard = [], this._copyOffset = 0, e = 0; this._selectedItems.length > e; e++) t = this._selectedItems[e], this._clipboard.push(t); this.remove(this._clipboard, !0) } }, paste: function() { var e, t, n, i, r, o, a, s; if (this._clipboard.length > 0) { for (i = {}, r = p(this._clipboard), o = r.connections, a = r.shapes, s = { x: this._copyOffset * this.options.copy.offsetX, y: this._copyOffset * this.options.copy.offsetY }, this.deselect(), n = 0; a.length > n; n++) e = a[n], t = e.clone(), i[e.id] = t, t.position(new Q(e.options.x + s.x, e.options.y + s.y)), t.diagram = this, t = this._addShape(t), t && t.select(); for (n = 0; o.length > n; n++) e = o[n], t = this._addConnection(e.clone()), t && (this._updateCopiedConnection(t, e, "source", i, s), this._updateCopiedConnection(t, e, "target", i, s), t.select(!0), t.updateModel()); this._syncChanges(), this._copyOffset += 1 } }, _updateCopiedConnection: function(e, t, n, i, r) { var o, a, s, l = t[n](), c = this; l instanceof _ && i[l.shape.id] ? (s = i[l.shape.id], c.getShapeById(s.id) ? e[n](s.getConnector(l.options.name)) : (a = c._inactiveShapeItems.getByUid(s.dataItem.uid), a && (o = function(t) { s = c._dataMap[t.id], e[n](s.getConnector(l.options.name)), e.updateModel() }, c._deferredConnectionUpdates.push(a.onActivate(o))))) : e[n](new Q(t[n + "Point"]().x + r.x, t[n + "Point"]().y + r.y)) }, boundingBox: function(e, t) { var n, i, r, o = W.empty(), a = ut(e) ? this._getDiagramItems(e) : { shapes: this.shapes }; if (a.shapes.length > 0) for (i = a.shapes[0], o = i.bounds(en), r = 1; a.shapes.length > r; r++) i = a.shapes[r], n = i.bounds(en), t === !0 && (n.x -= i._rotationOffset.x, n.y -= i._rotationOffset.y), o = o.union(n); return o }, _containerOffset: function() { var e = this.element.offset(); return this.toolBar && (e.top += this.toolBar.element.outerHeight()), e }, documentToView: function(e) { var t = this._containerOffset(); return new Q(e.x - t.left, e.y - t.top) }, viewToDocument: function(e) { var t = this._containerOffset(); return new Q(e.x + t.left, e.y + t.top) }, viewToModel: function(e) { return this._transformWithMatrix(e, this._matrixInvert) }, modelToView: function(e) { return this._transformWithMatrix(e, this._matrix) }, modelToLayer: function(e) { return this._transformWithMatrix(e, this._layerMatrix) }, layerToModel: function(e) { return this._transformWithMatrix(e, this._layerMatrixInvert) }, documentToModel: function(e) { var t = this.documentToView(e); return this.canvas.translate || (t.x = t.x + this.scroller.scrollLeft, t.y = t.y + this.scroller.scrollTop), this.viewToModel(t) }, modelToDocument: function(e) { return this.viewToDocument(this.modelToView(e)) }, _transformWithMatrix: function(e, t) { var n, i, r = e; return e instanceof Q ? t && (r = t.apply(e)) : (n = this._transformWithMatrix(e.topLeft(), t), i = this._transformWithMatrix(e.bottomRight(), t), r = W.fromPoints(n, i)), r }, setDataSource: function(e) { this.options.dataSource = e, this._dataSource(), this.options.autoBind && this.dataSource.fetch() }, setConnectionsDataSource: function(e) { this.options.connectionsDataSource = e, this._connectionDataSource(), this.options.autoBind && this.connectionsDataSource.fetch() }, layout: function(e) { var t, n, i, r, o; switch (this.isLayouting = !0, dt(e) && (e = this.options.layout), t = dt(e) || dt(e.type) ? "Tree" : e.type, t.toLowerCase()) { case "tree": n = new P.TreeLayout(this); break; case "layered": n = new P.LayeredLayout(this); break; case "forcedirected": case "force": case "spring": case "springembedder": n = new P.SpringLayout(this); break; default: throw "Layout algorithm '" + t + "' is not supported." } i = new P.LayoutState(this), r = n.layout(e), r && (o = new P.LayoutUndoUnit(i, r, e ? e.animate : null), this.undoRedoService.add(o)), this.isLayouting = !1 }, getShapeById: function(e) { var t; return (t = rt.first(this.shapes, function(t) { return t.visual.id === e })) ? t : t = rt.first(this.connections, function(t) { return t.visual.id === e }) }, _extendLayoutOptions: function(e) { e.layout && (e.layout = R(P.LayoutBase.fn.defaultOptions || {}, e.layout)) }, _selectionChanged: function(e, t) { (e.length || t.length) && this.trigger(Rt, { selected: e, deselected: t }) }, _getValidZoom: function(e) { return vt.min(vt.max(e, this.options.zoomMin), this.options.zoomMax) }, _panTransform: function(e) { var t = this, n = e || t._pan; t.canvas.translate ? (t.scroller.scrollTo(n.x, n.y), t._zoomMainLayer()) : (t._storePan(n), t._transformMainLayer()) }, _finishPan: function() { this.trigger(Bt, { total: this._pan, delta: Number.NaN }) }, _storePan: function(e) { this._pan = e, this._storeViewMatrix() }, _zoomMainLayer: function() { var e = this._zoom, t = new U(0, 0, e, e); t.render(this.mainLayer), this._storeLayerMatrix(t), this._storeViewMatrix() }, _transformMainLayer: function() { var e = this._pan, t = this._zoom, n = new U(e.x, e.y, t, t); n.render(this.mainLayer), this._storeLayerMatrix(n), this._storeViewMatrix() }, _storeLayerMatrix: function(e) { this._layerMatrix = e.toMatrix(), this._layerMatrixInvert = e.invert().toMatrix() }, _storeViewMatrix: function() { var e = this._pan, t = this._zoom, n = new U(e.x, e.y, t, t); this._matrix = n.toMatrix(), this._matrixInvert = n.invert().toMatrix() }, _toIndex: function(e, t) { var n = this._getDiagramItems(e); this.mainLayer.toIndex(n.visuals, t), this._fixOrdering(n, !1) }, _fixOrdering: function(e, t) { var n, i, r = t ? this.shapes.length - 1 : 0, o = t ? this.connections.length - 1 : 0; for (n = 0; e.shapes.length > n; n++) i = e.shapes[n], rt.remove(this.shapes, i), rt.insert(this.shapes, i, r); for (n = 0; e.cons.length > n; n++) i = e.cons[n], rt.remove(this.connections, i), rt.insert(this.connections, i, o) }, _getDiagramItems: function(e) { var t, n, i = {}, r = e; for (i.visuals = [], i.shapes = [], i.cons = [], e ? pt(e) || (r = [e]) : r = this._selectedItems.slice(), t = 0; r.length > t; t++) n = r[t], n instanceof w ? (i.shapes.push(n), i.visuals.push(n.visual)) : n instanceof b && (i.cons.push(n), i.visuals.push(n.visual)); return i }, _removeItem: function(e, t, n) { e.select(!1), e instanceof w ? (this._removeShapeDataItem(e), this._removeShape(e, t, n)) : e instanceof b && (this._removeConnectionDataItem(e), this._removeConnection(e, t)), this.mainLayer.remove(e.visual) }, _removeShape: function(e, t, n) { var i, r, o, a, s = [], l = []; for (this.toolService._removeHover(), t && this.undoRedoService.addCompositeItem(new G(e)), rt.remove(this.shapes, e), this._shapesQuadTree.remove(e), i = 0; e.connectors.length > i; i++) for (o = e.connectors[i], a = 0; o.connections.length > a; a++) r = o.connections[a], n && A.inArray(r, n) || (r.sourceConnector == o ? s.push(r) : r.targetConnector == o && l.push(r)); for (i = 0; s.length > i; i++) s[i].source(null, t), s[i].updateModel(); for (i = 0; l.length > i; i++) l[i].target(null, t), l[i].updateModel() }, _removeConnection: function(e, t) { e.sourceConnector && rt.remove(e.sourceConnector.connections, e), e.targetConnector && rt.remove(e.targetConnector.connections, e), t && this.undoRedoService.addCompositeItem(new q(e)), rt.remove(this.connections, e) }, _removeDataItems: function(e, t) { var n, i, r, o; for (e = pt(e) ? e : [e]; e.length;) if (n = e.shift(), r = this._dataMap[n.uid], r && (this._removeShapeConnections(r), this._removeItem(r, !1), delete this._dataMap[n.uid], t && n.hasChildren && n.loaded())) for (i = n.children.data(), o = 0; i.length > o; o++) e.push(i[o]) }, _removeShapeConnections: function(e) { var t, n = e.connections(); if (n) for (t = 0; n.length > t; t++) this._removeItem(n[t], !1) }, _addDataItem: function(e, t) { var n, i; if (ht(e)) return (n = this._dataMap[e.id]) ? n : (i = R({}, this.options.shapeDefaults), i.dataItem = e, n = new w(i, this), this.addShape(n, { undoable: t !== !1 }), this._dataMap[e.id] = n, n) }, _addDataItemByUid: function(e) { var t, n; if (ht(e)) return (t = this._dataMap[e.uid]) ? t : (n = R({}, this.options.shapeDefaults), n.dataItem = e, t = new w(n, this), this.addShape(t), this._dataMap[e.uid] = t, t) }, _addDataItems: function(e, t) { var n, i, r, o, a; for (i = 0; e.length > i; i++) n = e[i], r = this._addDataItemByUid(n), o = this._addDataItemByUid(t), o && !this.connected(o, r) && (a = this.connect(o, r)) }, _refreshSource: function(e) { var t, n = this, i = e.node, r = e.action, o = e.items, a = n.options; if (!e.field) { if ("remove" == r) this._removeDataItems(e.items, !0); else for (r || i || n.clear(), this._addDataItems(o, i), t = 0; o.length > t; t++) o[t].load(); a.layout && n.layout(a.layout) } }, _mouseDown: function(e) { var t = this._calculatePosition(e); 1 == e.which && this.toolService.start(t, this._meta(e)) && (this._destroyToolBar(), e.preventDefault()) }, _addItem: function(e) { e instanceof w ? this.addShape(e) : e instanceof b && this.addConnection(e) }, _mouseUp: function(e) { var t = this._calculatePosition(e); 1 == e.which && this.toolService.end(t, this._meta(e)) && (this._createToolBar(), e.preventDefault()) }, _createToolBar: function() { var e, t, n, i, r, o, a, s, l, c, d = this.toolService.diagram; this.singleToolBar || 1 !== d.select().length || (e = d.select()[0], e && e.options.editable !== !1 && (t = e.options.editable, n = t.tools, this._isEditable && 0 === n.length && (e instanceof w ? n = ["edit", "rotateClockwise", "rotateAnticlockwise"] : e instanceof b && (n = ["edit"]), t && t.remove !== !1 && n.push("delete")), n && n.length && (i = 20, this.singleToolBar = new k(d, { tools: n, click: F(this._toolBarClick, this), modal: !0 }), o = this.singleToolBar.element, a = this.singleToolBar._popup.element.outerWidth(), s = this.singleToolBar._popup.element.outerHeight(), e instanceof w ? (l = this.modelToView(e.bounds(en)), r = Q(l.x, l.y).minus(Q((a - l.width) / 2, s + i))) : e instanceof b && (c = this.modelToView(e.bounds()), r = Q(c.x, c.y).minus(Q((a - c.width - 20) / 2, s + i))), r ? (this.canvas.translate || (r = r.minus(Q(this.scroller.scrollLeft, this.scroller.scrollTop))), r = this.viewToDocument(r), r = Q(vt.max(r.x, 0), vt.max(r.y, 0)), this.singleToolBar.showAt(r)) : this._destroyToolBar()))) }, _toolBarClick: function(e) { this.trigger("toolBarClick", e), this._destroyToolBar() }, _mouseMove: function(e) { if (!this.pauseMouseHandlers) { var t = this._calculatePosition(e); 0 !== e.which && 1 != e.which || !this.toolService.move(t, this._meta(e)) || e.preventDefault() } }, _keydown: function(e) { this.toolService.keyDown(e.keyCode, this._meta(e)) && e.preventDefault() }, _wheel: function(e) { var t = n(e), i = this._calculatePosition(e), r = R(this._meta(e), { delta: t }); this.toolService.wheel(i, r) && e.preventDefault() }, _meta: function(e) { return { ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey, shiftKey: e.shiftKey } }, _calculatePosition: function(e) { var n = e.pageX === t ? e.originalEvent : e, i = new Q(n.pageX, n.pageY), r = this.documentToModel(i); return r }, _normalizePointZoom: function(e) { return e.times(1 / this.zoom()) }, _initialize: function() { this.shapes = [], this._selectedItems = [], this.connections = [], this._dataMap = {}, this._connectionsDataMap = {}, this._inactiveShapeItems = new u, this._deferredConnectionUpdates = [], this.undoRedoService = new Z({ undone: this._syncHandler, redone: this._syncHandler }), this.id = P.randomId() }, _fetchFreshData: function() { var e = this; e._dataSource(), e._isEditable && e._connectionDataSource(), e.options.autoBind && (e._isEditable ? (this._loadingShapes = !0, this._loadingConnections = !0, e.dataSource.fetch(), e.connectionsDataSource.fetch()) : e.dataSource.fetch()) }, _dataSource: function() { var e, t; ht(this.options.connectionsDataSource) ? (this._isEditable = !0, e = this.options.dataSource || {}, t = pt(e) ? { data: e } : e, this.dataSource && this._shapesRefreshHandler ? this.dataSource.unbind("change", this._shapesRefreshHandler).unbind("requestStart", this._shapesRequestStartHandler).unbind("error", this._shapesErrorHandler) : (this._shapesRefreshHandler = F(this._refreshShapes, this), this._shapesRequestStartHandler = F(this._shapesRequestStart, this), this._shapesErrorHandler = F(this._error, this)), this.dataSource = kendo.data.DataSource.create(t).bind("change", this._shapesRefreshHandler).bind("requestStart", this._shapesRequestStartHandler).bind("error", this._shapesErrorHandler)) : (this._treeDataSource(), this._isEditable = !1) }, _connectionDataSource: function() { var e, t = this.options.connectionsDataSource; t && (e = pt(t) ? { data: t } : t, this.connectionsDataSource && this._connectionsRefreshHandler ? this.connectionsDataSource.unbind("change", this._connectionsRefreshHandler).unbind("requestStart", this._connectionsRequestStartHandler).unbind("error", this._connectionsErrorHandler) : (this._connectionsRefreshHandler = F(this._refreshConnections, this), this._connectionsRequestStartHandler = F(this._connectionsRequestStart, this), this._connectionsErrorHandler = F(this._connectionsError, this)), this.connectionsDataSource = kendo.data.DataSource.create(e).bind("change", this._connectionsRefreshHandler).bind("requestStart", this._connectionsRequestStartHandler).bind("error", this._connectionsErrorHandler)) }, _shapesRequestStart: function(e) { "read" == e.type && (this._loadingShapes = !0) }, _connectionsRequestStart: function(e) { "read" == e.type && (this._loadingConnections = !0) }, _error: function() { this._loadingShapes = !1 }, _connectionsError: function() { this._loadingConnections = !1 }, _refreshShapes: function(e) { "remove" === e.action ? this._shouldRefresh() && this._removeShapes(e.items) : "itemchange" === e.action ? this._shouldRefresh() && this._updateShapes(e.items, e.field) : "add" === e.action ? this._inactiveShapeItems.add(e.items) : "sync" === e.action ? this._syncShapes(e.items) : this.refresh() }, _shouldRefresh: function() { return !this._suspended }, _suspendModelRefresh: function() { this._suspended = (this._suspended || 0) + 1 }, _resumeModelRefresh: function() { this._suspended = vt.max((this._suspended || 0) - 1, 0) }, refresh: function() { this._loadingShapes = !1, this._loadingConnections || (this.trigger("dataBound"), this._rebindShapesAndConnections()) }, _rebindShapesAndConnections: function() { this.clear(), this._addShapes(this.dataSource.view()), this.connectionsDataSource && this._addConnections(this.connectionsDataSource.view(), !1), this.options.layout && this.layout(this.options.layout) }, refreshConnections: function() { this._loadingConnections = !1, this._loadingShapes || (this.trigger("dataBound"), this._rebindShapesAndConnections()) }, _removeShapes: function(e) { var t, n, i = this._dataMap; for (n = 0; e.length > n; n++) t = e[n], i[t.id] && (this.remove(i[t.id], !1), i[t.id] = null) }, _syncShapes: function() { var e = this, t = e._inactiveShapeItems; t.forEach(function(n) { var i = n.dataItem, r = n.element; i.isNew() || (r ? (r._setOptionsFromModel(), e.addShape(r, { undoable: n.undoable }), e._dataMap[i.id] = r) : e._addDataItem(i), n.activate(), t.remove(i)) }) }, _updateShapes: function(e, t) { var n, i, r; for (n = 0; e.length > n; n++) i = e[n], r = this._dataMap[i.id], r && r.updateOptionsFromModel(i, t) }, _addShapes: function(e) { for (var t = 0; e.length > t; t++) this._addDataItem(e[t], !1) }, _refreshConnections: function(e) { "remove" === e.action ? this._shouldRefresh() && this._removeConnections(e.items) : "add" === e.action ? this._addConnections(e.items) : "sync" === e.action || ("itemchange" === e.action ? this._shouldRefresh() && this._updateConnections(e.items) : this.refreshConnections()) }, _removeConnections: function(e) { for (var t = 0; e.length > t; t++) this.remove(this._connectionsDataMap[e[t].uid], !1), this._connectionsDataMap[e[t].uid] = null }, _updateConnections: function(e) { var t, n, i, r, o; for (t = 0; e.length > t; t++) n = e[t], i = this._connectionsDataMap[n.uid], i.updateOptionsFromModel(n), r = this._validateConnector(n.from), r && i.source(r), o = this._validateConnector(n.to), o && i.target(o) }, _addConnections: function(e, t) { var n, i, r = e.length; for (n = 0; r > n; n++) i = e[n], this._addConnectionDataItem(i, t) }, _addConnectionDataItem: function(e, t) { var n, i, r, o; this._connectionsDataMap[e.uid] || (n = this._validateConnector(e.from), ht(n) && null !== n || (n = new Q(e.fromX, e.fromY)), i = this._validateConnector(e.to), ht(i) && null !== i || (i = new Q(e.toX, e.toY)), ht(n) && ht(i) && (r = R({}, this.options.connectionDefaults), r.dataItem = e, o = new b(n, i, r), this._connectionsDataMap[e.uid] = o, this.addConnection(o, t))) }, _validateConnector: function(e) { var t; return ht(e) && null !== e && (t = this._dataMap[e]), t }, _treeDataSource: function() { var e = this, t = e.options, n = t.dataSource; n = pt(n) ? { data: n } : n, n.fields || (n.fields = [{ field: "text" }, { field: "url" }, { field: "spriteCssClass" }, { field: "imageUrl" }]), e.dataSource && e._refreshHandler && e._unbindDataSource(), e._refreshHandler = F(e._refreshSource, e), e._errorHandler = F(e._error, e), e.dataSource = B.create(n).bind(yt, e._refreshHandler).bind(At, e._errorHandler) }, _unbindDataSource: function() { var e = this; e.dataSource.unbind(yt, e._refreshHandler).unbind(At, e._errorHandler) }, _adorn: function(e, n) { n !== t && e && (n ? (this._adorners.push(e), this.adornerLayer.append(e.visual)) : (rt.remove(this._adorners, e), this.adornerLayer.remove(e.visual))) }, _showConnectors: function(e, t) { t ? this._connectorsAdorner.show(e) : this._connectorsAdorner.destroy() }, _updateAdorners: function() { var e, t, n = this._adorners; for (e = 0; n.length > e; e++) t = n[e], t.refreshBounds && t.refreshBounds(), t.refresh() }, _refresh: function() { for (var e = 0; this.connections.length > e; e++) this.connections[e].refresh() }, _destroyToolBar: function() { this.singleToolBar && (this.singleToolBar.hide(), this.singleToolBar.destroy(), this.singleToolBar = null) }, _destroyGlobalToolBar: function() { this.toolBar && (this.toolBar.hide(), this.toolBar.destroy(), this.toolBar = null) }, exportDOMVisual: function() { var e = this.canvas._viewBox, t = I.transform().translate(-e.x, -e.y), n = new I.Rect([0, 0], [e.width, e.height]), i = E.Path.fromRect(n), r = new E.Group({ transform: t }), o = new E.Group({ clip: i }), a = this.canvas.drawingElement.children[0]; return o.append(r), r.children.push(a), o }, exportVisual: function() { var e = I.transform().scale(1 / this._zoom), t = new E.Group({ transform: e }), n = this.mainLayer.drawingElement; return t.children.push(n), t }, _syncChanges: function() { this._syncShapeChanges(), this._syncConnectionChanges() }, _syncShapeChanges: function() { this.dataSource && this._isEditable && this.dataSource.sync() }, _syncConnectionChanges: function() { var t = this; t.connectionsDataSource && t._isEditable && (e.when.apply(e, t._deferredConnectionUpdates).then(function() { t.connectionsDataSource.sync() }), t.deferredConnectionUpdates = []) } }), A.ExportMixin.extend(y.fn, !0), kendo.PDFMixin && kendo.PDFMixin.extend(y.fn), k = kendo.Observable.extend({ init: function(e, t) { kendo.Observable.fn.init.call(this), this.diagram = e, this.options = R({}, this.options, t), this._tools = [], this.createToolBar(), this.createTools(), this.appendTools(), this.options.modal && this.createPopup(), this.bind(this.events, t) }, events: ["click"], createPopup: function() { this.container = e("<div/>").append(this.element), this._popup = this.container.kendoPopup({}).getKendoPopup() }, appendTools: function() { var e, t; for (e = 0; this._tools.length > e; e++) t = this._tools[e], (t.buttons && t.buttons.length || !ht(t.buttons)) && this._toolBar.add(t) }, createToolBar: function() { this.element = e("<div/>"), this._toolBar = this.element.kendoToolBar({ click: F(this.click, this), resizable: !1 }).getKendoToolBar(), this.element.css("border", "none") }, createTools: function() { for (var e = 0; this.options.tools.length > e; e++) this.createTool(this.options.tools[e]) }, createTool: function(e) { var t = (mt(e) ? e.name : e) + "Tool"; this[t] ? this[t](e) : this._tools.push(e) }, showAt: function(e) { this._popup && this._popup.open(e.x, e.y) }, hide: function() { this._popup && this._popup.close() }, newGroup: function() { return { type: "buttonGroup", buttons: [] } }, editTool: function() { this._tools.push({ spriteCssClass: "k-icon k-i-pencil", showText: "overflow", type: "button", text: "Edit", attributes: this._setAttributes({ action: "edit" }) }) }, deleteTool: function() { this._tools.push({ spriteCssClass: "k-icon k-i-close", showText: "overflow", type: "button", text: "Delete", attributes: this._setAttributes({ action: "delete" }) }) }, rotateAnticlockwiseTool: function(e) { this._appendGroup("rotate"), this._rotateGroup.buttons.push({ spriteCssClass: "k-icon k-i-rotateccw", showText: "overflow", text: "RotateAnticlockwise", group: "rotate", attributes: this._setAttributes({ action: "rotateAnticlockwise", step: e.step }) }) }, rotateClockwiseTool: function(e) { this._appendGroup("rotate"), this._rotateGroup.buttons.push({ spriteCssClass: "k-icon k-i-rotatecw", attributes: this._setAttributes({ action: "rotateClockwise", step: e.step }), showText: "overflow", text: "RotateClockwise", group: "rotate" }) }, createShapeTool: function() { this._appendGroup("create"), this._createGroup.buttons.push({ spriteCssClass: "k-icon k-i-shape", showText: "overflow", text: "CreateShape", group: "create", attributes: this._setAttributes({ action: "createShape" }) }) }, createConnectionTool: function() { this._appendGroup("create"), this._createGroup.buttons.push({ spriteCssClass: "k-icon k-i-connector", showText: "overflow", text: "CreateConnection", group: "create", attributes: this._setAttributes({ action: "createConnection" }) }) }, undoTool: function() { this._appendGroup("history"), this._historyGroup.buttons.push({ spriteCssClass: "k-icon k-i-undo", showText: "overflow", text: "Undo", group: "history", attributes: this._setAttributes({ action: "undo" }) }) }, redoTool: function() { this._appendGroup("history"), this._historyGroup.buttons.push({ spriteCssClass: "k-icon k-i-redo", showText: "overflow", text: "Redo", group: "history", attributes: this._setAttributes({ action: "redo" }) }) }, _appendGroup: function(e) { var t = "_" + e + "Group"; this[t] || (this[t] = this.newGroup(), this._tools.push(this[t])) }, _setAttributes: function(e) { var t = {}; return e.action && (t[kendo.attr("action")] = e.action), e.step && (t[kendo.attr("step")] = e.step), t }, _getAttributes: function(e) { var t, n = {}, i = e.attr(kendo.attr("action")); return i && (n.action = i), t = e.attr(kendo.attr("step")), t && (n.step = t), n }, click: function(t) { var n = this._getAttributes(e(t.target)), i = n.action; i && this[i](n), this.trigger("click", this.eventData(i)) }, eventData: function(e) { var t = this.selectedElements(), n = [], i = []; return t instanceof w ? n.push(t) : i.push(t), { shapes: n, connections: i, action: e } }, "delete": function() { var e = this.diagram, t = e._triggerRemove(this.selectedElements()); t.length && (this.diagram.remove(t, !0), this.diagram._syncChanges()) }, edit: function() { this.diagram.edit(this.selectedElements()[0]) }, rotateClockwise: function(e) { var t = (this.selectedElements(), parseFloat(e.step || 90)); this._rotate(t) }, rotateAnticlockwise: function(e) { var t = (this.selectedElements(), parseFloat(e.step || 90)); this._rotate(-t) }, _rotate: function(e) { var t = this.diagram._resizingAdorner; t.angle(t.angle() + e), t.rotate() }, selectedElements: function() { return this.diagram.select() }, createShape: function() { this.diagram.createShape() }, createConnection: function() { this.diagram.createConnection() }, undo: function() { this.diagram.undo() }, redo: function() { this.diagram.redo() }, destroy: function() { this.diagram = null, this.element = null, this.options = null, this._toolBar && this._toolBar.destroy(), this._popup && this._popup.destroy() } }), x = kendo.Observable.extend({ init: function(e, t) { kendo.Observable.fn.init.call(this), this.options = H(!0, {}, this.options, t), this.element = e, this.model = this.options.model, this.fields = this._getFields(), this._initContainer(), this.createEditable() }, options: { editors: {} }, _initContainer: function() { this.wrapper = this.element }, createEditable: function() { var e = this.options; this.editable = new kendo.ui.Editable(this.wrapper, { fields: this.fields, target: e.target, clearContainer: !1, model: this.model }) }, _isEditable: function(e) { return this.model.editable && this.model.editable(e) }, _getFields: function() { var e, t, n, i = [], r = this.model.fields; for (e in r) t = {}, this._isEditable(e) && (n = this.options.editors[e], n && (t.editor = n), t.field = e, i.push(t)); return i }, end: function() { return this.editable.end() }, destroy: function() { this.editable.destroy(), this.editable.element.find("[" + kendo.attr("container-for") + "]").empty(), this.model = this.wrapper = this.element = this.columns = this.editable = null } }), C = x.extend({ init: function(e, t) { x.fn.init.call(this, e, t), this.bind(this.events, this.options), this.open() }, events: ["update", "cancel"], options: { window: { modal: !0, resizable: !1, draggable: !0, title: "Edit", visible: !1 } }, _initContainer: function() { var t, n = this; this.wrapper = e('<div class="k-popup-edit-form"/>').attr(kendo.attr("uid"), this.model.uid), t = "", this.options.template ? (t += this._renderTemplate(), this.fields = []) : t += this._renderFields(), t += this._renderButtons(), this.wrapper.append(e('<div class="k-edit-form-container"/>').append(t)), this.window = new kendo.ui.Window(this.wrapper, this.options.window), this.window.bind("close", function(e) { e.userTriggered && (e.sender.element.focus(), n._cancelClick(e)) }), this._attachButtonEvents() }, _renderTemplate: function() { var e = this.options.template; return "string" == typeof e && (e = window.unescape(e)), e = kendo.template(e)(this.model) }, _renderFields: function() { var e, t, n = ""; for (e = 0; this.fields.length > e; e++) t = this.fields[e], n += '<div class="k-edit-label"><label for="' + t.field + '">' + (t.field || "") + "</label></div>", this._isEditable(t.field) && (n += "<div " + kendo.attr("container-for") + '="' + t.field + '" class="k-edit-field"></div>'); return n }, _renderButtons: function() { var e = '<div class="k-edit-buttons k-state-default">'; return e += this._createButton("update"), e += this._createButton("cancel"), e += "</div>" }, _createButton: function(e) { return kendo.template(dn)(m[e]) }, _attachButtonEvents: function() { this._cancelClickHandler = F(this._cancelClick, this), this.window.element.on(kt + _t, "a.k-diagram-cancel", this._cancelClickHandler), this._updateClickHandler = F(this._updateClick, this), this.window.element.on(kt + _t, "a.k-diagram-update", this._updateClickHandler) }, _updateClick: function(e) { e.preventDefault(), this.trigger("update") }, _cancelClick: function(e) { e.preventDefault(), this.trigger("cancel") }, open: function() { this.window.center().open() }, close: function() { this.window.bind("deactivate", F(this.destroy, this)).close() }, destroy: function() { this.window.close().destroy(), this.window.element.off(kt + _t, "a.k-diagram-cancel", this._cancelClickHandler), this.window.element.off(kt + _t, "a.k-diagram-update", this._updateClickHandler), this._cancelClickHandler = null, this._editUpdateClickHandler = null, this.window = null, x.fn.destroy.call(this) } }), d.fn = d.prototype = { onActivate: function(t) { var n = e.Deferred(); return this.callbacks.push({ callback: t, deferred: n }), n }, activate: function() { var e, t, n = this.callbacks; for (t = 0; n.length > t; t++) e = this.callbacks[t], e.callback(this.dataItem), e.deferred.resolve(); this.callbacks = [] } }, u.fn = u.prototype = { add: function(e) { for (var t = 0; e.length > t; t++) this.items[e[t].uid] = new d(e[t]) }, forEach: function(e) { for (var t in this.items) e(this.items[t]) }, getByUid: function(e) { return this.items[e] }, remove: function(e) { delete this.items[e.uid] } }, S = z.extend({ init: function() { this.shapes = [] }, _add: function(e, t) { this.shapes.push({ bounds: t, shape: e }), e._quadNode = this }, insert: function(e, t) { this._add(e, t) }, remove: function(e) { var t, n = this.shapes, i = n.length; for (t = 0; i > t; t++) if (n[t].shape === e) { n.splice(t, 1); break } }, hitTestRect: function(e, t) { var n, i = this.shapes, r = i.length, o = !1; for (n = 0; r > n; n++) if (this._overlaps(i[n].bounds, e) && !A.inArray(i[n].shape, t)) { o = !0; break } return o }, _overlaps: function(e, t) { var n = e.bottomRight(), i = t.bottomRight(), r = !(t.x > n.x || t.y > n.y || e.x > i.x || e.y > i.y); return r } }), T = S.extend({ init: function(e) { S.fn.init.call(this), this.children = [], this.rect = e }, inBounds: function(e) { var t = this.rect, n = t.bottomRight(), i = e.bottomRight(), r = e.x >= t.x && e.y >= t.y && n.x >= i.x && n.y >= i.y; return r }, overlapsBounds: function(e) { return this._overlaps(this.rect, e) }, insert: function(e, t) { var n, i = !1, r = this.children, o = r.length; if (this.inBounds(t)) { if (!o && 4 > this.shapes.length) this._add(e, t); else { for (o || this._initChildren(), n = 0; r.length > n; n++) if (r[n].insert(e, t)) { i = !0; break } i || this._add(e, t) } i = !0 } return i }, _initChildren: function() { var e, t, n = this.rect, i = this.children, r = this.shapes, o = n.center(), a = n.width / 2, s = n.height / 2; for (i.push(new T(new W(n.x, n.y, a, s)), new T(new W(o.x, n.y, a, s)), new T(new W(n.x, o.y, a, s)), new T(new W(o.x, o.y, a, s))), t = r.length - 1; t >= 0; t--) for (e = 0; i.length > e; e++) if (i[e].insert(r[t].shape, r[t].bounds)) { r.splice(t, 1); break } }, hitTestRect: function(e, t) { var n, i = this.children, r = i.length, o = !1; if (this.overlapsBounds(e)) if (S.fn.hitTestRect.call(this, e, t)) o = !0; else for (n = 0; r > n; n++) if (i[n].hitTestRect(e, t)) { o = !0; break } return o } }), D = z.extend({ ROOT_SIZE: 1e3, init: function(e) { e.bind(bt, F(this._boundsChange, this)), e.bind(Ht, F(this._boundsChange, this)), this.initRoots() }, initRoots: function() { this.rootMap = {}, this.root = new S }, clear: function() { this.initRoots() }, _boundsChange: function(e) { e.item._quadNode && (e.item._quadNode.remove(e.item), this.insert(e.item)) }, insert: function(e) { var t = e.bounds(en), n = this.ROOT_SIZE, i = this.getSectors(t), r = i[0][0], o = i[1][0]; this.inRoot(i) ? this.root.insert(e, t) : (this.rootMap[r] || (this.rootMap[r] = {}), this.rootMap[r][o] || (this.rootMap[r][o] = new T(new W(r * n, o * n, n, n))), this.rootMap[r][o].insert(e, t)) }, remove: function(e) { e._quadNode && e._quadNode.remove(e) }, inRoot: function(e) { return e[0].length > 1 || e[1].length > 1 }, getSectors: function(e) { var t = this.ROOT_SIZE, n = e.bottomRight(), i = Math.floor(e.x / t), r = Math.floor(e.y / t), o = Math.floor(n.x / t), a = Math.floor(n.y / t), s = [ [i], [r] ]; return i !== o && s[0].push(o), r !== a && s[1].push(a), s }, hitTestRect: function(e, t) { var n, i, r, o, a, s = this.getSectors(e); if (this.root.hitTestRect(e, t)) return !0; for (n = 0; s[0].length > n; n++) for (r = s[0][n], i = 0; s[1].length > i; i++) if (o = s[1][i], a = (this.rootMap[r] || {})[o], a && a.hitTestRect(e, t)) return !0; return !1 } }), A.ui.plugin(y), R(P, { Shape: w, Connection: b, Connector: _, DiagramToolBar: k, QuadNode: T, QuadRoot: S, ShapesQuadTree: D }) }(window.kendo.jQuery), function(e, t) { function n(e, t) { if (null === t) return t; var n = y(e, !0); return n(t) } function i(e) { return typeof e !== I } function r(e, t, n) { var i, r, l = s(e), c = s(t), d = u(e) - u(t) < 0, h = []; for (h.push(e), i = 0; n > i; i++) r = { r: o(l.r, c.r, i, n, d), g: o(l.g, c.g, i, n, d), b: o(l.b, c.b, i, n, d) }, h.push(a(r)); return h.push(t), h } function o(e, t, n, i, r) { var o, a = p.min(p.abs(e), p.abs(t)), s = p.max(p.abs(e), p.abs(t)), l = (s - a) / (i + 1), c = l * (n + 1); return o = r ? a + c : s - c } function a(e) { return "#" + l(e.r) + l(e.g) + l(e.b) } function s(e) { e = e.replace("#", ""); var t = c(e); return { r: d(t.r), g: d(t.g), b: d(t.b) } } function l(e) { var t = p.round(e).toString(16).toUpperCase(); return 1 === t.length && (t = "0" + t), t } function c(e) { var t = e.length, n = {}; return 3 === t ? (n.r = e[0], n.g = e[1], n.b = e[2]) : (n.r = e.substring(0, 2), n.g = e.substring(2, 4), n.b = e.substring(4, 6)), n } function d(e) { return parseInt(e.toString(16), 16) } function u(e) { var t = 0; return e && (e = s(e), t = p.sqrt(.241 * e.r * e.r + .691 * e.g * e.g + .068 * e.b * e.b)), t } function h(e) { var t = p.pow(10, 4); return p.round(e * t) / t } var p = Math, f = e.proxy, g = window.kendo, m = g.Class, v = g.ui.Widget, _ = g.template, w = g.deepExtend, b = g.data.HierarchicalDataSource, y = g.getter, k = g.dataviz, x = ".kendoTreeMap", C = "change", S = "dataBound", T = "itemCreated", D = Number.MAX_VALUE, A = "mouseover" + x, E = "mouseleave" + x, I = "undefined", P = v.extend({ init: function(t, n) { g.destroy(t), e(t).empty(), v.fn.init.call(this, t, n), this._initTheme(this.options), this.element.addClass("k-widget k-treemap"), this._setLayout(), this._originalOptions = w({}, this.options), this._initDataSource(), this._attachEvents(), g.notify(this, k.ui) }, options: { name: "TreeMap", theme: "default", autoBind: !0, textField: "text", valueField: "value", colorField: "color" }, events: [S, T], _initTheme: function(e) { var t = this, n = k.ui.themes || {}, i = ((e || {}).theme || "").toLowerCase(), r = (n[i] || {}).treeMap; t.options = w({}, r, e) }, _attachEvents: function() { this.element.on(A, f(this._mouseover, this)).on(E, f(this._mouseleave, this)) }, _setLayout: function() { "horizontal" === this.options.type ? (this._layout = new F(!1), this._view = new R(this, this.options)) : "vertical" === this.options.type ? (this._layout = new F(!0), this._view = new R(this, this.options)) : (this._layout = new M, this._view = new z(this, this.options)) }, _initDataSource: function() { var e = this, t = e.options, n = t.dataSource; e._dataChangeHandler = f(e._onDataChange, e), e.dataSource = b.create(n).bind(C, e._dataChangeHandler), n && e.options.autoBind && e.dataSource.fetch() }, setDataSource: function(e) { var t = this; t.dataSource.unbind(C, t._dataChangeHandler), t.dataSource = e.bind(C, t._dataChangeHandler), e && t.options.autoBind && t.dataSource.fetch() }, _onDataChange: function(e) { var t, n, o, a, s, l, c = e.node, d = e.items, u = this.options; if (c) { if (d.length) { for (a = this._getByUid(c.uid), a.children = [], o = i(a.minColor) || i(a.maxColor) ? r(a.minColor, a.maxColor, d.length) || [] : u.colors || [], n = 0; d.length > n; n++) t = d[n], a.children.push(this._wrapItem(t)); for (s = this._view.htmlSize(a), this._layout.compute(a.children, a.coord, s), n = 0; a.children.length > n; n++) t = a.children[n], i(t.color) || ("string" == typeof o[0] ? t.color = o[n % o.length] : (l = o[n % o.length], l && (t.color = l[0], t.minColor = l[0], t.maxColor = l[1]))); this._view.render(a) } } else this.element.empty(), t = this._wrapItem(d[0]), this._layout.createRoot(t, this.element.outerWidth(), this.element.outerHeight(), "vertical" === this.options.type), this._view.createRoot(t), this._root = t; for (n = 0; d.length > n; n++) d[n].load(); c && this.trigger(S, { node: c }) }, _contentSize: function(e) { this.view.renderHeight(e) }, _wrapItem: function(e) { var t = {}; return i(this.options.valueField) && (t.value = n(this.options.valueField, e)), i(this.options.colorField) && (t.color = n(this.options.colorField, e)), i(this.options.textField) && (t.text = n(this.options.textField, e)), t.level = e.level(), t.dataItem = e, t }, _getByUid: function(e) { for (var t, n = [this._root]; n.length;) { if (t = n.pop(), t.dataItem.uid === e) return t; t.children && (n = n.concat(t.children)) } }, dataItem: function(t) { var n = e(t).attr(g.attr("uid")), i = this.dataSource; return i && i.getByUid(n) }, findByUid: function(e) { return this.element.find(".k-treemap-tile[" + g.attr("uid") + "='" + e + "']") }, _mouseover: function(t) { var n = e(t.target); n.hasClass("k-leaf") && (this._removeActiveState(), n.removeClass("k-state-hover").addClass("k-state-hover")) }, _removeActiveState: function() { this.element.find(".k-state-hover").removeClass("k-state-hover") }, _mouseleave: function() { this._removeActiveState() }, destroy: function() { v.fn.destroy.call(this), this.element.off(x), this.dataSource && this.dataSource.unbind(C, this._dataChangeHandler), this._root = null, g.destroy(this.element) }, items: function() { return e() }, getSize: function() { return g.dimensions(this.element) }, _resize: function() { this.dataSource.fetch() }, setOptions: function(e) { var n = e.dataSource; e.dataSource = t, this._originalOptions = w(this._originalOptions, e), this.options = w({}, this._originalOptions), this._setLayout(), this._initTheme(this.options), v.fn._setEvents.call(this, e), n && this.setDataSource(b.create(n)), this.options.autoBind && this.dataSource.fetch() } }), M = m.extend({ createRoot: function(e, t, n) { e.coord = { width: t, height: n, top: 0, left: 0 } }, leaf: function(e) { return !e.children }, layoutChildren: function(e, t) { var n, i, r, o, a = t.width * t.height, s = 0, l = []; for (n = 0; e.length > n; n++) l[n] = parseFloat(e[n].value), s += l[n]; for (n = 0; l.length > n; n++) e[n].area = a * l[n] / s; i = this.layoutHorizontal() ? t.height : t.width, e = new g.data.Query(e)._sortForGrouping("value", "desc"), r = [e[0]], o = e.slice(1), this.squarify(o, r, i, t) }, squarify: function(e, t, n, i) { this.computeDim(e, t, n, i) }, computeDim: function(e, n, i, r) { var o, a, s; return e.length + n.length == 1 ? (o = 1 == e.length ? e : n, this.layoutLast(o, i, r), t) : (e.length >= 2 && 0 === n.length && (n = [e[0]], e = e.slice(1)), 0 === e.length ? (n.length > 0 && this.layoutRow(n, i, r), t) : (a = e[0], this.worstAspectRatio(n, i) >= this.worstAspectRatio([a].concat(n), i) ? this.computeDim(e.slice(1), n.concat([a]), i, r) : (s = this.layoutRow(n, i, r), this.computeDim(e, [], s.dim, s)), t)) }, layoutLast: function(e, t, n) { e[0].coord = n }, layoutRow: function(e, t, n) { return this.layoutHorizontal() ? this.layoutV(e, t, n) : this.layoutH(e, t, n) }, orientation: "h", layoutVertical: function() { return "v" === this.orientation }, layoutHorizontal: function() { return "h" === this.orientation }, layoutChange: function() { this.orientation = this.layoutVertical() ? "h" : "v" }, worstAspectRatio: function(e, t) { var n, i, r, o, a; if (!e || 0 === e.length) return D; for (n = 0, i = 0, r = D, o = 0; e.length > o; o++) a = e[o].area, n += a, r = a > r ? r : a, i = i > a ? i : a; return p.max(t * t * i / (n * n), n * n / (t * t * r)) }, compute: function(e, t, n) { if (t.width >= t.height && this.layoutHorizontal() || this.layoutChange(), e && e.length > 0) { var i = { width: t.width, height: t.height - n.text, top: 0, left: 0 }; this.layoutChildren(e, i) } }, layoutV: function(e, t, n) { var i, r, o, a = this._totalArea(e), s = 0; for (t = h(a / t), i = 0; e.length > i; i++) r = h(e[i].area / t), e[i].coord = { height: r, width: t, top: n.top + s, left: n.left }, s += r; return o = { height: n.height, width: n.width - t, top: n.top, left: n.left + t }, o.dim = p.min(o.width, o.height), o.dim != o.height && this.layoutChange(), o }, layoutH: function(e, t, n) { var i, r, o = this._totalArea(e), a = h(o / t), s = n.top, l = 0; for (i = 0; e.length > i; i++) e[i].coord = { height: a, width: h(e[i].area / a), top: s, left: n.left + l }, l += e[i].coord.width; return r = { height: n.height - a, width: n.width, top: n.top + a, left: n.left }, r.dim = p.min(r.width, r.height), r.dim != r.width && this.layoutChange(), r }, _totalArea: function(e) { var t, n = 0; for (t = 0; e.length > t; t++) n += e[t].area; return n } }), z = m.extend({ init: function(t, n) { this.options = w({}, this.options, n), this.treeMap = t, this.element = e(t.element), this.offset = 0 }, htmlSize: function(e) { var t, n, i = this._getByUid(e.dataItem.uid), r = { text: 0 }; return e.children && (this._clean(i), t = this._getText(e), t && (n = this._createTitle(e), i.append(n), r.text = n.height()), i.append(this._createWrap()), this.offset = (i.outerWidth() - i.innerWidth()) / 2), r }, _getByUid: function(e) { return this.element.find(".k-treemap-tile[" + g.attr("uid") + "='" + e + "']") }, render: function(e) { var t, n, i, r, o = this._getByUid(e.dataItem.uid), a = e.children; if (a) for (t = o.find(".k-treemap-wrap"), n = 0; a.length > n; n++) i = a[n], r = this._createLeaf(i), t.append(r), this.treeMap.trigger(T, { element: r }) }, createRoot: function(e) { var t = this._createLeaf(e); this.element.append(t), this.treeMap.trigger(T, { element: t }) }, _clean: function(e) { e.css("background-color", ""), e.removeClass("k-leaf"), e.removeClass("k-inverse"), e.empty() }, _createLeaf: function(t) { return this._createTile(t).css("background-color", t.color).addClass("k-leaf").toggleClass("k-inverse", this._tileColorBrightness(t) > 180).append(e("<div></div>").html(this._getText(t))) }, _createTile: function(t) { var n, r = { width: t.coord.width, height: t.coord.height, left: t.coord.left, top: t.coord.top }; return r.width += r.left && this.offset ? 2 * this.offset : this.offset, r.height += r.top ? 2 * this.offset : this.offset, n = e("<div class='k-treemap-tile'></div>").css({ width: r.width, height: r.height, left: r.left, top: r.top }), i(t.dataItem) && i(t.dataItem.uid) && n.attr(g.attr("uid"), t.dataItem.uid), n }, _getText: function(e) { var t = e.text; return this.options.template && (t = this._renderTemplate(e)), t }, _renderTemplate: function(e) { var t = _(this.options.template); return t({ dataItem: e.dataItem, text: e.text }) }, _createTitle: function(t) { return e("<div class='k-treemap-title'></div>").append(e("<div></div>").html(this._getText(t))) }, _createWrap: function() { return e("<div class='k-treemap-wrap'></div>") }, _tileColorBrightness: function(e) { return u(e.color) } }), F = m.extend({ createRoot: function(e, t, n, i) { e.coord = { width: t, height: n, top: 0, left: 0 }, e.vertical = i }, init: function(e) { this.vertical = e, this.quotient = e ? 1 : 0 }, compute: function(e, t, n) { var i, r, o; e.length > 0 && (i = t.width, r = t.height, this.vertical ? r -= n.text : i -= n.text, o = { width: i, height: r, top: 0, left: 0 }, this.layoutChildren(e, o)) }, layoutChildren: function(e, t) { var n, i, r = t.width * t.height, o = 0, a = []; for (n = 0; e.length > n; n++) i = e[n], a[n] = parseFloat(e[n].value), o += a[n], i.vertical = this.vertical; for (n = 0; a.length > n; n++) e[n].area = r * a[n] / o; e = new g.data.Query(e)._sortForGrouping("value", "desc"), this.sliceAndDice(e, t) }, sliceAndDice: function(e, t) { var n = this._totalArea(e); e[0].level % 2 === this.quotient ? this.layoutHorizontal(e, t, n) : this.layoutVertical(e, t, n) }, layoutHorizontal: function(e, t, n) { var i, r, o, a = 0; for (i = 0; e.length > i; i++) r = e[i], o = r.area / (n / t.width), r.coord = { height: t.height, width: o, top: t.top, left: t.left + a }, a += o }, layoutVertical: function(e, t, n) { var i, r, o, a = 0; for (i = 0; e.length > i; i++) r = e[i], o = r.area / (n / t.height), r.coord = { height: o, width: t.width, top: t.top + a, left: t.left }, a += o }, _totalArea: function(e) { var t, n = 0; for (t = 0; e.length > t; t++) n += e[t].area; return n } }), R = z.extend({ htmlSize: function(e) { var t, n, i = this._getByUid(e.dataItem.uid), r = { text: 0, offset: 0 }; return e.children && (this._clean(i), t = this._getText(e), t && (n = this._createTitle(e), i.append(n), r.text = e.vertical ? n.height() : n.width()), i.append(this._createWrap()), this.offset = (i.outerWidth() - i.innerWidth()) / 2), r }, _createTitle: function(t) { var n; return n = e(t.vertical ? "<div class='k-treemap-title'></div>" : "<div class='k-treemap-title-vertical'></div>"), n.append(e("<div></div>").html(this._getText(t))) } }); k.ui.plugin(P) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.mobile.ui, i = n.Shim, r = n.Widget, o = "beforeOpen", a = "open", s = "close", l = "init", c = '<div class="km-modalview-wrapper" />', d = n.View.extend({ init: function(e, t) { var n = this; r.fn.init.call(n, e, t), n._id(), n._wrap(), n._shim(), this.options.$angular || (n._layout(), n._scroller(), n._model()), n.element.css("display", ""), n.trigger(l) }, events: [l, o, a, s], options: { name: "ModalView", modal: !0, width: null, height: null }, destroy: function() { r.fn.destroy.call(this), this.shim.destroy() }, open: function(t) { var n = this; n.target = e(t), n.shim.show(), n._invokeNgController(), n.trigger("show", { view: n }) }, openFor: function(e) { this.trigger(o, { target: e }) || (this.open(e), this.trigger(a, { target: e })) }, close: function() { this.element.is(":visible") && !this.trigger(s) && this.shim.hide() }, _wrap: function() { var e, t, n = this, i = n.element, r = n.options; e = i[0].style.width || "auto", t = i[0].style.height || "auto", i.addClass("km-modalview").wrap(c), n.wrapper = i.parent().css({ width: r.width || e || 300, height: r.height || t || 300 }).addClass("auto" == t ? " km-auto-height" : ""), i.css({ width: "", height: "" }) }, _shim: function() { var e = this; e.shim = new i(e.wrapper, { modal: e.options.modal, position: "center center", align: "center center", effect: "fade:in", className: "km-modalview-root", hide: function(t) { e.trigger(s) && t.preventDefault() } }) } }); n.plugin(d) }(window.kendo.jQuery), function(e, t) { var n = window.kendo, i = n.mobile, r = n.support.mobileOS, o = n.effects.Transition, a = n.roleSelector, s = "x", l = i.ui, c = !(r.ios && 7 == r.majorVersion && !r.appMode), d = "beforeShow", u = "init", h = "show", p = "hide", f = "afterHide", g = { enable: e.noop }, m = l.View.extend({ init: function(t, r) { var o, s, l, d, h; if (e(t).parent().prepend(t), i.ui.Widget.fn.init.call(this, t, r), this.options.$angular || (this._layout(), this._scroller()), this._model(), o = this.element.closest(a("pane")).data("kendoMobilePane")) this.pane = o, this.pane.bind("viewShow", function(e) { d._viewShow(e) }), this.pane.bind("sameViewRequested", function() { d.hide() }), s = this.userEvents = new n.UserEvents(o.element, { filter: a("view splitview"), allowSelection: !0 }); else { if (this.currentView = g, l = e(this.options.container), !l) throw Error("The drawer needs a container configuration option set."); s = this.userEvents = new n.UserEvents(l, { allowSelection: !0 }), this._attachTransition(l) } d = this, h = function(e) { d.visible && (d.hide(), e.preventDefault()) }, this.options.swipeToOpen && c ? (s.bind("press", function() { d.transition.cancel() }), s.bind("start", function(e) { d._start(e) }), s.bind("move", function(e) { d._update(e) }), s.bind("end", function(e) { d._end(e) }), s.bind("tap", h)) : s.bind("press", h), this.leftPositioned = "left" === this.options.position, this.visible = !1, this.element.hide().addClass("km-drawer").addClass(this.leftPositioned ? "km-left-drawer" : "km-right-drawer"), this.trigger(u) }, options: { name: "Drawer", position: "left", views: [], swipeToOpenViews: [], swipeToOpen: !0, title: "", container: null }, events: [d, p, f, u, h], show: function() { this._activate() && this._show() }, hide: function() { this.currentView && (this.currentView.enable(), m.current = null, this._moveViewTo(0), this.trigger(p, { view: this })) }, openFor: function() { this.visible ? this.hide() : this.show() }, destroy: function() { l.View.fn.destroy.call(this), this.userEvents.destroy() }, _activate: function() { if (this.visible) return !0; var e = this._currentViewIncludedIn(this.options.views); return !e || this.trigger(d, { view: this }) ? !1 : (this._setAsCurrent(), this.element.show(), this.trigger(h, { view: this }), this._invokeNgController(), !0) }, _currentViewIncludedIn: function(t) { if (!this.pane || !t.length) return !0; var n = this.pane.view(); return e.inArray(n.id.replace("#", ""), t) > -1 || e.inArray(n.element.attr("id"), t) > -1 }, _show: function() { this.currentView.enable(!1), this.visible = !0; var e = this.element.width(); this.leftPositioned || (e = -e), this._moveViewTo(e) }, _setAsCurrent: function() { m.last !== this && (m.last && m.last.element.hide(), this.element.show()), m.last = this, m.current = this }, _moveViewTo: function(e) { this.userEvents.cancel(), this.transition.moveTo({ location: e, duration: 400, ease: o.easeOutExpo }) }, _viewShow: function(e) { return this.currentView && this.currentView.enable(), this.currentView === e.view ? (this.hide(), t) : (this.currentView = e.view, this._attachTransition(e.view.element), t) }, _attachTransition: function(e) { var t = this, i = this.movable, r = i && i.x; this.transition && (this.transition.cancel(), this.movable.moveAxis("x", 0)), i = this.movable = new n.ui.Movable(e), this.transition = new o({ axis: s, movable: this.movable, onEnd: function() { 0 === i[s] && (e[0].style.cssText = "", t.element.hide(), t.trigger(f), t.visible = !1) } }), r && (e.addClass("k-fx-hidden"), n.animationFrame(function() { e.removeClass("k-fx-hidden"), t.movable.moveAxis(s, r), t.hide() })) }, _start: function(e) { var i, r, o, a, s, l = e.sender; return Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || n.triggeredByInput(e.event) || !this._currentViewIncludedIn(this.options.swipeToOpenViews) ? (l.cancel(), t) : (i = this.leftPositioned, r = this.visible, o = i && r || !i && !m.current, a = !i && r || i && !m.current, s = 0 > e.x.velocity, (o && s || a && !s) && this._activate() ? (l.capture(), t) : (l.cancel(), t)) }, _update: function(e) { var t, n = this.movable, i = n.x + e.x.delta; t = this.leftPositioned ? Math.min(Math.max(0, i), this.element.width()) : Math.max(Math.min(0, i), -this.element.width()), this.movable.moveAxis(s, t), e.event.preventDefault(), e.event.stopPropagation() }, _end: function(e) { var t, n = e.x.velocity, i = Math.abs(this.movable.x) > this.element.width() / 2, r = .8; t = this.leftPositioned ? n > -r && (n > r || i) : r > n && (-r > n || i), t ? this._show() : this.hide() } }); l.plugin(m) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.mobile.ui, i = n.Widget, r = "<div class='km-expanded-pane-shim' />", o = n.View, a = o.extend({ init: function(o, a) { var s, l, c = this; i.fn.init.call(c, o, a), o = c.element, e.extend(c, a), c._id(), c.options.$angular ? c._overlay() : (c._layout(), c._overlay()), c._style(), l = o.children(c._locate("modalview")), c.options.$angular ? l.each(function(n, i) { t.compileMobileDirective(e(i), a.$angular[0]) }) : t.mobile.init(l), c.panes = [], c._paramsHistory = [], c.options.$angular ? (c.element.children(t.directiveSelector("pane")).each(function() { s = t.compileMobileDirective(e(this), a.$angular[0]), c.panes.push(s) }), c.element.children(t.directiveSelector("header footer")).each(function() { t.compileMobileDirective(e(this), a.$angular[0]) })) : c.content.children(t.roleSelector("pane")).each(function() { s = t.initWidget(this, {}, n.roles), c.panes.push(s) }), c.expandedPaneShim = e(r).appendTo(c.element), c._shimUserEvents = new t.UserEvents(c.expandedPaneShim, { tap: function() { c.collapsePanes() } }) }, _locate: function(e) { return this.options.$angular ? t.directiveSelector(e) : t.roleSelector(e) }, options: { name: "SplitView", style: "horizontal" }, expandPanes: function() { this.element.addClass("km-expanded-splitview") }, collapsePanes: function() { this.element.removeClass("km-expanded-splitview") }, _layout: function() { var e = this, n = e.element; e.transition = t.attrValue(n, "transition"), t.mobile.ui.View.prototype._layout.call(this), t.mobile.init(this.header.add(this.footer)), e.element.addClass("km-splitview"), e.content.addClass("km-split-content") }, _style: function() { var t, n = this.options.style, i = this.element; n && (t = n.split(" "), e.each(t, function() { i.addClass("km-split-" + this) })) }, showStart: function() { var t = this; t.element.css("display", ""), t.inited ? this._invokeNgController() : (t.inited = !0, e.each(t.panes, function() { this.options.initial ? this.navigateToInitial() : this.navigate("") }), t.trigger("init", { view: t })), t.trigger("show", { view: t }) } }); n.plugin(a) }(window.kendo.jQuery), function(e, t) { function n(e, t) { var n = []; return f && n.push("km-on-" + f.name), n.push(e.skin ? "km-" + e.skin : "ios" == e.name && e.majorVersion > 6 ? "km-ios7" : "km-" + e.name), ("ios" == e.name && 7 > e.majorVersion || "ios" != e.name) && n.push("km-" + e.name + e.majorVersion), n.push("km-" + e.majorVersion), n.push("km-m" + (e.minorVersion ? e.minorVersion[0] : 0)), e.variant && (e.skin && e.skin === e.name || !e.skin || e.setDefaultPlatform === !1) && n.push("km-" + (e.skin ? e.skin : e.name) + "-" + e.variant), e.cordova && n.push("km-cordova"), n.push(e.appMode ? "km-app" : "km-web"), t && t.statusBarStyle && n.push("km-" + t.statusBarStyle + "-status-bar"), n.join(" ") } function i(t) { return "km-wp-" + (t.noVariantSet ? 0 === parseInt(e("<div style='background: Background' />").css("background-color").split(",")[1], 10) ? "dark" : "light" : t.variant + " km-wp-" + t.variant + "-force") } function r(e) { return f.wp ? "-kendo-landscape" == e.css("animation-name") : Math.abs(window.orientation) / 90 == 1 } function o(e) { return r(e) ? y : v } function a(e) { e.parent().addBack().css("min-height", window.innerHeight) } function s() { e("meta[name=viewport]").remove(), R.append(x({ height: ", width=device-width" + (r() ? ", height=" + window.innerHeight + "px" : d.mobileOS.flatVersion >= 600 && 700 > d.mobileOS.flatVersion ? ", height=" + window.innerWidth + "px" : ", height=device-height") })) } var l = window.kendo, c = l.mobile, d = l.support, u = c.ui.Widget, h = c.ui.Pane, p = "ios7", f = d.mobileOS, g = "blackberry" == f.device && f.flatVersion >= 600 && 1e3 > f.flatVersion && f.appMode, m = .93, v = "km-vertical", _ = "chrome" === f.browser, w = f.ios && f.flatVersion >= 700 && 800 > f.flatVersion && (f.appMode || _), b = Math.abs(window.orientation) / 90 == 1, y = "km-horizontal", k = { ios7: { ios: !0, browser: "default", device: "iphone", flatVersion: "700", majorVersion: "7", minorVersion: "0.0", name: "ios", tablet: !1 }, ios: { ios: !0, browser: "default", device: "iphone", flatVersion: "612", majorVersion: "6", minorVersion: "1.2", name: "ios", tablet: !1 }, android: { android: !0, browser: "default", device: "android", flatVersion: "442", majorVersion: "4", minorVersion: "4.2", name: "android", tablet: !1 }, blackberry: { blackberry: !0, browser: "default", device: "blackberry", flatVersion: "710", majorVersion: "7", minorVersion: "1.0", name: "blackberry", tablet: !1 }, meego: { meego: !0, browser: "default", device: "meego", flatVersion: "850", majorVersion: "8", minorVersion: "5.0", name: "meego", tablet: !1 }, wp: { wp: !0, browser: "default", device: "wp", flatVersion: "800", majorVersion: "8", minorVersion: "0.0", name: "wp", tablet: !1 } }, x = l.template('<meta content="initial-scale=#: data.scale #, maximum-scale=#: data.scale #, user-scalable=no#=data.height#" name="viewport" />', { usedWithBlock: !1 }), C = l.template('<meta name="apple-mobile-web-app-capable" content="#= data.webAppCapable === false ? \'no\' : \'yes\' #" /> <meta name="apple-mobile-web-app-status-bar-style" content="#=data.statusBarStyle#" /> <meta name="msapplication-tap-highlight" content="no" /> ', { usedWithBlock: !1 }), S = l.template("<style>.km-view { clip: rect(0 #= data.width #px #= data.height #px 0); }</style>", { usedWithBlock: !1 }), T = f.android && "chrome" != f.browser || f.blackberry, D = l.template('<link rel="apple-touch-icon' + (f.android ? "-precomposed" : "") + '" # if(data.size) { # sizes="#=data.size#" #}# href="#=data.icon#" />', { usedWithBlock: !1 }), A = ("iphone" == f.device || "ipod" == f.device) && 7 > f.majorVersion, E = ("iphone" == f.device || "ipod" == f.device) && f.majorVersion >= 7, I = E ? "none" : null, P = "mobilesafari" == f.browser ? 60 : 0, M = 20, z = e(window), F = window.screen, R = e("head"), H = "init", B = e.proxy, L = u.extend({ init: function(t, n) { c.application = this, e(e.proxy(this, "bootstrap", t, n)) }, bootstrap: function(t, n) { var i, r, o; t = e(t), t[0] || (t = e(document.body)), u.fn.init.call(this, t, n), this.element.removeAttr("data-" + l.ns + "role"), this._setupPlatform(), this._attachMeta(), this._setupElementClass(), this._attachHideBarHandlers(), i = e.extend({}, this.options), delete i.name, r = this, o = function() { r.pane = new h(r.element, i), r.pane.navigateToInitial(), r.options.updateDocumentTitle && r._setupDocumentTitle(), r._startHistory(), r.trigger(H) }, this.options.$angular ? setTimeout(o) : o() }, options: { name: "Application", hideAddressBar: !0, browserHistory: !0, historyTransition: I, modelScope: window, statusBarStyle: "black", transition: "", retina: !1, platform: null, skin: null, updateDocumentTitle: !0, useNativeScrolling: !1 }, events: [H], navigate: function(e, t) { this.pane.navigate(e, t) }, replace: function(e, t) { this.pane.replace(e, t) }, scroller: function() { return this.view().scroller }, hideLoading: function() { if (!this.pane) throw Error("The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler."); this.pane.hideLoading() }, showLoading: function() { if (!this.pane) throw Error("The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler."); this.pane.showLoading() }, changeLoadingMessage: function(e) { if (!this.pane) throw Error("The mobile application instance is not fully instantiated. Please consider changing the message in the application init event handler."); this.pane.changeLoadingMessage(e) }, view: function() { return this.pane.view() }, skin: function(e) { var t = this; return arguments.length ? (t.options.skin = e || "", t.element[0].className = "km-pane", t._setupPlatform(), t._setupElementClass(), t.options.skin) : t.options.skin }, destroy: function() { u.fn.destroy.call(this), this.pane.destroy(), this.router.destroy() }, _setupPlatform: function() { var t = this, r = t.options.platform, o = t.options.skin, a = [], s = f || k[p]; r && (s.setDefaultPlatform = !0, "string" == typeof r ? (a = r.split("-"), s = e.extend({ variant: a[1] }, s, k[a[0]])) : s = r), o && (a = o.split("-"), f || (s.setDefaultPlatform = !1), s = e.extend({}, s, { skin: a[0], variant: a[1] })), s.variant || (s.noVariantSet = !0, s.variant = "dark"), t.os = s, t.osCssClass = n(t.os, t.options), "wp" == s.name && (t.refreshBackgroundColorProxy || (t.refreshBackgroundColorProxy = e.proxy(function() { (t.os.variant && t.os.skin && t.os.skin === t.os.name || !t.os.skin) && t.element.removeClass("km-wp-dark km-wp-light km-wp-dark-force km-wp-light-force").addClass(i(t.os)) }, t)), e(document).off("visibilitychange", t.refreshBackgroundColorProxy), e(document).off("resume", t.refreshBackgroundColorProxy), s.skin || (t.element.parent().css("overflow", "hidden"), e(document).on("visibilitychange", t.refreshBackgroundColorProxy), e(document).on("resume", t.refreshBackgroundColorProxy), t.refreshBackgroundColorProxy())) }, _startHistory: function() { this.options.browserHistory ? (this.router = new l.Router({ pushState: this.options.pushState, root: this.options.root, hashBang: this.options.hashBang }), this.pane.bindToRouter(this.router), this.router.start()) : this.options.initial || this.pane.navigate("") }, _resizeToScreenHeight: function() { var t, n = e("meta[name=apple-mobile-web-app-status-bar-style]").attr("content").match(/black-translucent|hidden/), i = this.element; t = _ ? window.innerHeight : r(i) ? n ? b ? F.availWidth + M : F.availWidth : b ? F.availWidth : F.availWidth - M : n ? b ? F.availHeight : F.availHeight + M : b ? F.availHeight - M : F.availHeight, i.height(t) }, _setupElementClass: function() { var t, n = this, i = n.element; i.parent().addClass("km-root km-" + (n.os.tablet ? "tablet" : "phone")), i.addClass(n.osCssClass + " " + o(i)), this.options.useNativeScrolling && i.parent().addClass("km-native-scrolling"), _ && i.addClass("km-ios-chrome"), d.wpDevicePixelRatio && i.parent().css("font-size", d.wpDevicePixelRatio + "em"), this.options.retina && (i.parent().addClass("km-retina"), i.parent().css("font-size", d.devicePixelRatio * m + "em")), g && s(), n.options.useNativeScrolling ? i.parent().addClass("km-native-scrolling") : T && (t = (screen.availWidth > screen.availHeight ? screen.availWidth : screen.availHeight) + 200, e(S({ width: t, height: t })).appendTo(R)), w && n._resizeToScreenHeight(), l.onResize(function() { i.removeClass("km-horizontal km-vertical").addClass(o(i)), n.options.useNativeScrolling && a(i), w && n._resizeToScreenHeight(), g && s(), l.resize(i) }) }, _clearExistingMeta: function() { R.find("meta").filter("[name|='apple-mobile-web-app'],[name|='msapplication-tap'],[name='viewport']").remove() }, _attachMeta: function() { var e, t = this.options, n = t.icon; if (this._clearExistingMeta(), g || R.prepend(x({ height: "", scale: this.options.retina ? 1 / d.devicePixelRatio : "1.0" })), R.prepend(C(t)), n) { "string" == typeof n && (n = { "": n }); for (e in n) R.prepend(D({ icon: n[e], size: e })) } t.useNativeScrolling && a(this.element) }, _attachHideBarHandlers: function() { var e = this, t = B(e, "_hideBar"); !d.mobileOS.appMode && e.options.hideAddressBar && A && !e.options.useNativeScrolling && (e._initialHeight = {}, z.on("load", t), l.onResize(function() { setTimeout(window.scrollTo, 0, 0, 1) })) }, _setupDocumentTitle: function() { var e = this, n = document.title; e.pane.bind("viewShow", function(e) { var i = e.view.title; document.title = i !== t ? i : n }) }, _hideBar: function() { var t = this, n = t.element; n.height(l.support.transforms.css + "calc(100% + " + P + "px)"), e(window).trigger(l.support.resize) } }); l.mobile.Application = L, l.ui.plugin(L, l.mobile, "Mobile") }(window.kendo.jQuery), function(e, t) { function n(t, n, i) { e(n.target).closest(".km-button,.km-detail").toggleClass("km-state-active", i), d && t.deactivateTimeoutID && (clearTimeout(t.deactivateTimeoutID), t.deactivateTimeoutID = 0) } function i(t) { return e('<span class="km-badge">' + t + "</span>") } var r = window.kendo, o = r.mobile, a = o.ui, s = a.Widget, l = r.support, c = l.mobileOS, d = c.android && c.flatVersion >= 300, u = "click", h = "disabled", p = "km-state-disabled", f = s.extend({ init: function(e, t) { var i, o = this; s.fn.init.call(o, e, t), i = "up" === o.options.clickOn, o._wrap(), o._style(), i || o.element.attr("data-navigate-on-press", !0), o.options.enable = o.options.enable && !o.element.attr(h), o.enable(o.options.enable), o._userEvents = new r.UserEvents(o.element, { allowSelection: !i, press: function(e) { o._activate(e) }, release: function(e) { n(o, e, !1), i || e.event.stopPropagation() } }), o._userEvents.bind(i ? "tap" : "press", function(e) { o._release(e) }), d && o.element.on("move", function(e) { o._timeoutDeactivate(e) }) }, destroy: function() { s.fn.destroy.call(this), this._userEvents.destroy() }, events: [u], options: { name: "Button", icon: "", style: "", badge: "", clickOn: "up", enable: !0 }, badge: function(e) { var t = this.badgeElement = this.badgeElement || i(e).appendTo(this.element); return e || 0 === e ? (t.html(e), this) : e === !1 ? (t.empty().remove(), this.badgeElement = !1, this) : t.html() }, enable: function(e) { var n = this.element; t === e && (e = !0), this.options.enable = e, e ? n.removeAttr(h) : n.attr(h, h), n.toggleClass(p, !e) }, _timeoutDeactivate: function(e) { this.deactivateTimeoutID || (this.deactivateTimeoutID = setTimeout(n, 500, this, e, !1)) }, _activate: function(e) { var t = document.activeElement, i = t ? t.nodeName : ""; this.options.enable && (n(this, e, !0), ("INPUT" == i || "TEXTAREA" == i) && t.blur()) }, _release: function(n) { var i = this; if (!(n.which > 1)) return i.options.enable ? (i.trigger(u, { target: e(n.target), button: i.element }) && n.preventDefault(), t) : (n.preventDefault(), t) }, _style: function() { var t, n = this.options.style, i = this.element; n && (t = n.split(" "), e.each(t, function() { i.addClass("km-" + this) })) }, _wrap: function() { var t = this, n = t.options.icon, r = t.options.badge, o = '<span class="km-icon km-' + n, a = t.element.addClass("km-button"), s = a.children("span:not(.km-icon)").addClass("km-text"), l = a.find("img").addClass("km-image"); !s[0] && a.html() && (s = a.wrapInner('<span class="km-text" />').children("span.km-text")), !l[0] && n && (s[0] || (o += " km-notext"), t.iconElement = a.prepend(e(o + '" />'))), (r || 0 === r) && (t.badgeElement = i(r).appendTo(a)) } }), g = f.extend({ options: { name: "BackButton", style: "back" }, init: function(e, n) { var i = this; f.fn.init.call(i, e, n), t === i.element.attr("href") && i.element.attr("href", "#:back") } }), m = f.extend({ options: { name: "DetailButton", style: "" }, init: function(e, t) { f.fn.init.call(this, e, t) }, _style: function() { var t, n = this.options.style + " detail", i = this.element; n && (t = n.split(" "), e.each(t, function() { i.addClass("km-" + this) })) }, _wrap: function() { var t = this, n = t.options.icon, i = '<span class="km-icon km-' + n, r = t.element, o = r.children("span"), a = r.find("img").addClass("km-image"); !a[0] && n && (o[0] || (i += " km-notext"), r.prepend(e(i + '" />'))) } }); a.plugin(f), a.plugin(g), a.plugin(m) }(window.kendo.jQuery), function(e, t) { function n(t) { return e('<span class="km-badge">' + t + "</span>") } var i = window.kendo, r = i.mobile.ui, o = r.Widget, a = "km-state-active", s = "km-state-disabled", l = "select", c = "li:not(." + a + ")", d = o.extend({ init: function(e, t) { var n = this; o.fn.init.call(n, e, t), n.element.addClass("km-buttongroup").find("li").each(n._button), n.element.on(n.options.selectOn, c, "_select"), n._enable = !0, n.select(n.options.index), n.options.enable || (n._enable = !1, n.wrapper.addClass(s)) }, events: [l], options: { name: "ButtonGroup", selectOn: "down", index: -1, enable: !0 }, current: function() { return this.element.find("." + a) }, select: function(n) { var i = this, r = -1; n !== t && -1 !== n && i._enable && !e(n).is("." + s) && (i.current().removeClass(a), "number" == typeof n ? (r = n, n = e(i.element[0].children[n])) : n.nodeType && (n = e(n), r = n.index()), n.addClass(a), i.selectedIndex = r) }, badge: function(t, i) { var r, o = this.element; return isNaN(t) || (t = o.children().get(t)), t = o.find(t), r = e(t.children(".km-badge")[0] || n(i).appendTo(t)), i || 0 === i ? (r.html(i), this) : i === !1 ? (r.empty().remove(), this) : r.html() }, enable: function(e) { var n = this.wrapper; t === e && (e = !0), e ? n.removeClass(s) : n.addClass(s), this._enable = this.options.enable = e }, _button: function() { var t = e(this).addClass("km-button"), r = i.attrValue(t, "icon"), o = i.attrValue(t, "badge"), a = t.children("span"), s = t.find("img").addClass("km-image"); a[0] || (a = t.wrapInner("<span/>").children("span")), a.addClass("km-text"), !s[0] && r && t.prepend(e('<span class="km-icon km-' + r + '"/>')), (o || 0 === o) && n(o).appendTo(t) }, _select: function(e) { e.which > 1 || e.isDefaultPrevented() || !this._enable || (this.select(e.currentTarget), this.trigger(l, { index: this.selectedIndex })) } }); r.plugin(d) }(window.kendo.jQuery), function(e) { var t = window.kendo, n = t.mobile.ui, i = n.Widget, r = "km-collapsible", o = "km-collapsible-header", a = "km-collapsible-content", s = "km-collapsibleinset", l = "<div data-role='collapsible-header' class='" + o + "'></div>", c = "<div data-role='collapsible-content' class='" + a + "'></div>", d = "km-collapsed", u = "km-expanded", h = "km-animated", p = "left", f = "expand", g = "collapse", m = i.extend({ init: function(n, o) { var a = this, l = e(n); i.fn.init.call(a, l, o), l.addClass(r), a._buildHeader(), a.content = l.children().not(a.header).wrapAll(c).parent(), a._userEvents = new t.UserEvents(a.header, { tap: function() { a.toggle() } }), l.addClass(a.options.collapsed ? d : u), a.options.inset && l.addClass(s), a.options.animation ? (a.content.addClass(h), a.content.height(0), a.options.collapsed && a.content.hide()) : a.options.collapsed && a.content.hide() }, events: [f, g], options: { name: "Collapsible", collapsed: !0, collapseIcon: "arrow-n", expandIcon: "arrow-s", iconPosition: p, animation: !0, inset: !1 }, destroy: function() { i.fn.destroy.call(this), this._userEvents.destroy() }, expand: function(e) { var n = this.options.collapseIcon, i = this.content, r = t.support.mobileOS.ios; this.trigger(f) || (n && this.header.find(".km-icon").removeClass().addClass("km-icon km-" + n), this.element.removeClass(d).addClass(u), this.options.animation && !e ? (i.off("transitionend"), i.show(), r && i.removeClass(h), i.height(this._getContentHeight()), r && i.addClass(h), t.resize(i)) : i.show()) }, collapse: function(e) { var t = this.options.expandIcon, n = this.content; this.trigger(g) || (t && this.header.find(".km-icon").removeClass().addClass("km-icon km-" + t), this.element.removeClass(u).addClass(d), this.options.animation && !e ? (n.one("transitionend", function() { n.hide() }), n.height(0)) : n.hide()) }, toggle: function(e) { this.isCollapsed() ? this.expand(e) : this.collapse(e) }, isCollapsed: function() { return this.element.hasClass(d) }, resize: function() { !this.isCollapsed() && this.options.animation && this.content.height(this._getContentHeight()) }, _buildHeader: function() { var t = this.element.children(":header").wrapAll(l), n = e('<span class="km-icon"/>'), i = this.options.collapsed ? this.options.expandIcon : this.options.collapseIcon, r = this.options.iconPosition; i && (t.prepend(n), n.addClass("km-" + i)), this.header = t.parent(), this.header.addClass("km-icon-" + r) }, _getContentHeight: function() { var e, t = this.content.attr("style"); return this.content.css({ position: "absolute", visibility: "hidden", height: "auto" }), e = this.content.height(), this.content.attr("style", t ? t : ""), e } }); n.plugin(m) }(window.kendo.jQuery), function(e, t) { function n() { return this.nodeType === v.TEXT_NODE && this.nodeValue.match(U) } function i(e, t) { t && !e[0].querySelector(".km-icon") && e.prepend('<span class="km-icon km-' + t + '"/>') } function r(e) { i(e, T(e, "icon")), i(e, T(e.children(C), "icon")) } function o(e) { var t = e.parent(), r = e.add(t.children(m.roleSelector("detailbutton"))), o = t.contents().not(r).not(n); o.length || (e.addClass("km-listview-link").attr(m.attr("role"), "listview-link"), i(e, T(t, "icon")), i(e, T(e, "icon"))) } function a(e) { if (e[0].querySelector("input[type=checkbox],input[type=radio]")) { var t = e.parent(); t.contents().not(e).not(function() { return 3 == this.nodeType })[0] || (e.addClass("km-listview-label"), e.children("[type=checkbox],[type=radio]").addClass("km-widget km-icon km-check")) } } function s(t, n) { e(t).css("transform", "translate3d(0px, " + n + "px, 0px)") } var l, c, d, u, h, p, f, g, m = window.kendo, v = window.Node, _ = m.mobile, w = _.ui, b = m.data.DataSource, y = w.DataBoundWidget, k = ".km-list > li, > li:not(.km-group-container)", x = ".km-listview-link, .km-listview-label", C = "[" + m.attr("icon") + "]", S = e.proxy, T = m.attrValue, D = "km-group-title", A = "km-state-active", E = '<div class="' + D + '"><div class="km-text"></div></div>', I = m.template('<li><div class="' + D + '"><div class="km-text">#= this.headerTemplate(data) #</div></div><ul>#= kendo.render(this.template, data.items)#</ul></li>'), P = '<div class="km-listview-wrapper" />', M = m.template('<form class="km-filter-form"><div class="km-filter-wrap"><input type="search" placeholder="#=placeholder#"/><a href="\\#" class="km-filter-reset" title="Clear"><span class="km-icon km-clear"></span><span class="km-text">Clear</span></a></div></form>'), z = ".kendoMobileListView", F = "styled", R = "dataBound", H = "dataBinding", B = "itemChange", L = "click", N = "change", O = "progress", V = "function", U = /^\s+$/, W = /button/, j = m.Class.extend({ init: function(e) { var t, n, i = e.scroller(); i && (this.options = e.options, this.element = e.element, this.scroller = e.scroller(), this._shouldFixHeaders(), t = this, n = function() { t._cacheHeaders() }, e.bind("resize", n), e.bind(F, n), e.bind(R, n), i.bind("scroll", function(e) { t._fixHeader(e) })) }, _fixHeader: function(t) { if (this.fixedHeaders) { var n, i, r, o = 0, a = this.scroller, s = this.headers, l = t.scrollTop; do { if (n = s[o++], !n) { r = e("<div />"); break } i = n.offset, r = n.header } while (i + 1 > l); this.currentHeader != o && (a.fixedContainer.html(r.clone()), this.currentHeader = o) } }, _shouldFixHeaders: function() { this.fixedHeaders = "group" === this.options.type && this.options.fixedHeaders }, _cacheHeaders: function() { if (this._shouldFixHeaders(), this.fixedHeaders) { var t = [], n = this.scroller.scrollTop; this.element.find("." + D).each(function(i, r) { r = e(r), t.unshift({ offset: r.position().top + n, header: r }) }), this.headers = t, this._fixHeader({ scrollTop: n }) } } }), G = function() { return { page: 1 } }, q = m.Class.extend({ init: function(e) { var t = this, n = e.options, i = e.scroller(), r = n.pullParameters || G; this.listView = e, this.scroller = i, e.bind("_dataSource", function(e) { t.setDataSource(e.dataSource) }), i.setOptions({ pullToRefresh: !0, pull: function() { t._pulled || (t._pulled = !0, t.dataSource.read(r.call(e, t._first))) }, messages: { pullTemplate: n.messages.pullTemplate, releaseTemplate: n.messages.releaseTemplate, refreshTemplate: n.messages.refreshTemplate } }) }, setDataSource: function(e) { var t = this; this._first = e.view()[0], this.dataSource = e, e.bind("change", function() { t._change() }), e.bind("error", function() { t._change() }) }, _change: function() { var e, t = this.scroller, n = this.dataSource; this._pulled && t.pullHandled(), (this._pulled || !this._first) && (e = n.view(), e[0] && (this._first = e[0])), this._pulled = !1 } }), $ = m.Observable.extend({ init: function(e) { var t = this; m.Observable.fn.init.call(t), t.buffer = e.buffer, t.height = e.height, t.item = e.item, t.items = [], t.footer = e.footer, t.buffer.bind("reset", function() { t.refresh() }) }, refresh: function() { for (var e, t, n, i, r = this.buffer, o = this.items, a = !1; o.length;) o.pop().destroy(); for (this.offset = r.offset, e = this.item, i = 0; r.viewSize > i; i++) { if (i === r.total()) { a = !0; break } n = e(this.content(this.offset + o.length)), n.below(t), t = n, o.push(n) } this.itemCount = o.length, this.trigger("reset"), this._resize(), a && this.trigger("endReached") }, totalHeight: function() { if (!this.items[0]) return 0; var e = this, t = e.items, n = t[0].top, i = t[t.length - 1].bottom, r = (i - n) / e.itemCount, o = e.buffer.length - e.offset - e.itemCount; return (this.footer ? this.footer.height : 0) + i + o * r }, batchUpdate: function(e) { var t, n, i = this.height(), r = this.items, o = this.offset; if (r[0]) { if (this.lastDirection) for (; r[r.length - 1].bottom > e + 2 * i && 0 !== this.offset;) this.offset--, t = r.pop(), t.update(this.content(this.offset)), t.above(r[0]), r.unshift(t); else for (; e - i > r[0].top;) { if (n = this.offset + this.itemCount, n === this.buffer.total()) { this.trigger("endReached"); break } if (n === this.buffer.length) break; t = r.shift(), t.update(this.content(this.offset + this.itemCount)), t.below(r[r.length - 1]), r.push(t), this.offset++ } o !== this.offset && this._resize() } }, update: function(e) { var t, n, i, r, o = this, a = this.items, s = this.height(), l = this.itemCount, c = s / 2, d = (this.lastTop || 0) > e, u = e - c, h = e + s + c; a[0] && (this.lastTop = e, this.lastDirection = d, d ? a[0].top > u && a[a.length - 1].bottom > h + c && this.offset > 0 && (this.offset--, t = a.pop(), n = a[0], t.update(this.content(this.offset)), a.unshift(t), t.above(n), o._resize()) : h > a[a.length - 1].bottom && u - c > a[0].top && (r = this.offset + l, r === this.buffer.total() ? this.trigger("endReached") : r !== this.buffer.length && (t = a.shift(), i = a[a.length - 1], a.push(t), t.update(this.content(this.offset + this.itemCount)), o.offset++, t.below(i), o._resize()))) }, content: function(e) { return this.buffer.at(e) }, destroy: function() { this.unbind() }, _resize: function() { var e = this.items, t = 0, n = 0, i = e[0], r = e[e.length - 1]; i && (t = i.top, n = r.bottom), this.trigger("resize", { top: t, bottom: n }), this.footer && this.footer.below(r) } }); m.mobile.ui.VirtualList = $, l = m.Class.extend({ init: function(t, n) { var i = t.append([n], !0)[0], r = i.offsetHeight; e.extend(this, { top: 0, element: i, listView: t, height: r, bottom: r }) }, update: function(e) { this.element = this.listView.setDataItem(this.element, e) }, above: function(e) { e && (this.height = this.element.offsetHeight, this.top = e.top - this.height, this.bottom = e.top, s(this.element, this.top)) }, below: function(e) { e && (this.height = this.element.offsetHeight, this.top = e.bottom, this.bottom = this.top + this.height, s(this.element, this.top)) }, destroy: function() { m.destroy(this.element), e(this.element).remove() } }), c = '<div><span class="km-icon"></span><span class="km-loading-left"></span><span class="km-loading-right"></span></div>', d = m.Class.extend({ init: function(t) { this.element = e('<li class="km-load-more km-scroller-refresh" style="display: none"></li>').appendTo(t.element), this._loadIcon = e(c).appendTo(this.element) }, enable: function() { this.element.show(), this.height = this.element.outerHeight(!0) }, disable: function() { this.element.hide(), this.height = 0 }, below: function(e) { e && (this.top = e.bottom, this.bottom = this.height + this.top, s(this.element, this.top)) } }), u = d.extend({ init: function(t, n) { this._loadIcon = e(c).hide(), this._loadButton = e('<a class="km-load">' + t.options.messages.loadMoreText + "</a>").hide(), this.element = e('<li class="km-load-more" style="display: none"></li>').append(this._loadIcon).append(this._loadButton).appendTo(t.element); var i = this; this._loadButton.kendoMobileButton().data("kendoMobileButton").bind("click", function() { i._hideShowButton(), n.next() }), n.bind("resize", function() { i._showLoadButton() }), this.height = this.element.outerHeight(!0), this.disable() }, _hideShowButton: function() { this._loadButton.hide(), this.element.addClass("km-scroller-refresh"), this._loadIcon.css("display", "block") }, _showLoadButton: function() { this._loadButton.show(), this.element.removeClass("km-scroller-refresh"), this._loadIcon.hide() } }), h = m.Class.extend({ init: function(e) { var t = this; this.chromeHeight = e.wrapper.children().not(e.element).outerHeight() || 0, this.listView = e, this.scroller = e.scroller(), this.options = e.options, e.bind("_dataSource", function(e) { t.setDataSource(e.dataSource, e.empty) }), e.bind("resize", function() { t.list.items.length && (t.scroller.reset(), t.buffer.range(0), t.list.refresh()) }), this.scroller.makeVirtual(), this.scroller.bind("scroll", function(e) { t.list.update(e.scrollTop) }), this.scroller.bind("scrollEnd", function(e) { t.list.batchUpdate(e.scrollTop) }) }, destroy: function() { this.list.unbind(), this.buffer.unbind() }, setDataSource: function(t, n) { var i, r, o, a, s = this, c = this.options, h = this.listView, p = h.scroller(), f = c.loadMore; if (this.dataSource = t, i = t.pageSize() || c.virtualViewSize, !i && !n) throw Error("the DataSource does not have page size configured. Page Size setting is mandatory for the mobile listview virtual scrolling to work as expected."); this.buffer && this.buffer.destroy(), r = new m.data.Buffer(t, Math.floor(i / 2), f), o = f ? new u(h, r) : new d(h), this.list && this.list.destroy(), a = new $({ buffer: r, footer: o, item: function(e) { return new l(h, e) }, height: function() { return p.height() } }), a.bind("resize", function() { s.updateScrollerSize(), h.updateSize() }), a.bind("reset", function() { s.footer.enable() }), a.bind("endReached", function() { o.disable(), s.updateScrollerSize() }), r.bind("expand", function() { a.lastDirection = !1, a.batchUpdate(p.scrollTop) }), e.extend(this, { buffer: r, scroller: p, list: a, footer: o }) }, updateScrollerSize: function() { this.scroller.virtualSize(0, this.list.totalHeight() + this.chromeHeight) }, refresh: function() { this.list.refresh() }, reset: function() { this.buffer.range(0), this.list.refresh() } }), p = m.Class.extend({ init: function(e) { var t, n = this; this.listView = e, this.options = e.options, t = this, this._refreshHandler = function(e) { t.refresh(e) }, this._progressHandler = function() { e.showLoading() }, e.bind("_dataSource", function(e) { n.setDataSource(e.dataSource) }) }, destroy: function() { this._unbindDataSource() }, reset: function() {}, refresh: function(e) { var n, i, r, o, a, s, l, c = e && e.action, d = e && e.items, u = this.listView, h = this.dataSource, p = this.options.appendOnRefresh, f = h.view(), g = h.group(), m = g && g[0]; return "itemchange" !== c || u._hasBindingTarget() ? (a = "add" === c && !m || p && !u._filter, s = "remove" === c && !m, a ? i = [] : s && (i = u.findByDataItem(d)), u.trigger(H, { action: c || "rebind", items: d, removedItems: i, index: e && e.index }) ? (this._shouldShowLoading() && u.hideLoading(), t) : ("add" !== c || m ? "remove" !== c || m ? m ? u.replaceGrouped(f) : p && !u._filter ? (r = u.prepend(f), o = f) : u.replace(f) : (r = [], u.remove(d)) : (l = f.indexOf(d[0]), l > -1 && (r = u.insertAt(d, l), o = d)), this._shouldShowLoading() && u.hideLoading(), u.trigger(R, { ns: w, addedItems: r, addedDataItems: o }), t)) : (n = u.findByDataItem(d)[0], n && u.setDataItem(n, d[0]), t) }, setDataSource: function(e) { this.dataSource && this._unbindDataSource(), this.dataSource = e, e.bind(N, this._refreshHandler), this._shouldShowLoading() && this.dataSource.bind(O, this._progressHandler) }, _unbindDataSource: function() { this.dataSource.unbind(N, this._refreshHandler).unbind(O, this._progressHandler) }, _shouldShowLoading: function() { var e = this.options; return !e.pullToRefresh && !e.loadMore && !e.endlessScroll } }), f = m.Class.extend({ init: function(t) { var n = this, i = t.options.filterable, r = "change paste", o = this; this.listView = t, this.options = i, t.element.before(M({ placeholder: i.placeholder || "Search..." })), i.autoFilter !== !1 && (r += " keyup"), this.element = t.wrapper.find(".km-search-form"), this.searchInput = t.wrapper.find("input[type=search]").closest("form").on("submit" + z, function(e) { e.preventDefault() }).end().on("focus" + z, function() { n._oldFilter = n.searchInput.val() }).on(r.split(" ").join(z + " ") + z, S(this._filterChange, this)), this.clearButton = t.wrapper.find(".km-filter-reset").on(L, S(this, "_clearFilter")).hide(), this._dataSourceChange = e.proxy(this._refreshInput, this), t.bind("_dataSource", function(e) { e.dataSource.bind("change", o._dataSourceChange) }) }, _refreshInput: function() { var e = this.listView.dataSource.filter(), t = this.listView._filter.searchInput; t.val(e && e.filters[0].field === this.listView.options.filterable.field ? e.filters[0].value : "") }, _search: function(e) { this._filter = !0, this.clearButton[e ? "show" : "hide"](), this.listView.dataSource.filter(e) }, _filterChange: function(e) { var t = this; "paste" == e.type && this.options.autoFilter !== !1 ? setTimeout(function() { t._applyFilter() }, 1) : this._applyFilter() }, _applyFilter: function() { var e = this.options, t = this.searchInput.val(), n = t.length ? { field: e.field, operator: e.operator || "startswith", ignoreCase: e.ignoreCase, value: t } : null; t !== this._oldFilter && (this._oldFilter = t, this._search(n)) }, _clearFilter: function(e) { this.searchInput.val(""), this._search(null), e.preventDefault() } }), g = y.extend({ init: function(t, n) { var i = this; y.fn.init.call(this, t, n), t = this.element, n = this.options, n.scrollTreshold && (n.scrollThreshold = n.scrollTreshold), t.on("down", x, "_highlight").on("move up cancel", x, "_dim"), this._userEvents = new m.UserEvents(t, { filter: k, allowSelection: !0, tap: function(e) { i._click(e) } }), t.css("-ms-touch-action", "auto"), t.wrap(P), this.wrapper = this.element.parent(), this._headerFixer = new j(this), this._itemsCache = {}, this._templates(), this.virtual = n.endlessScroll || n.loadMore, this._style(), this.options.$angular && (this.virtual || this.options.pullToRefresh) ? setTimeout(e.proxy(this, "_start")) : this._start() }, _start: function() { var e = this.options; this.options.filterable && (this._filter = new f(this)), this._itemBinder = this.virtual ? new h(this) : new p(this), this.options.pullToRefresh && (this._pullToRefreshHandler = new q(this)), this.setDataSource(e.dataSource), this._enhanceItems(this.items()), m.notify(this, w) }, events: [L, H, R, B], options: { name: "ListView", style: "", type: "flat", autoBind: !0, fixedHeaders: !1, template: "#:data#", headerTemplate: '<span class="km-text">#:value#</span>', appendOnRefresh: !1, loadMore: !1, endlessScroll: !1, scrollThreshold: 30, pullToRefresh: !1, messages: { loadMoreText: "Press to load more", pullTemplate: "Pull to refresh", releaseTemplate: "Release to refresh", refreshTemplate: "Refreshing" }, pullOffset: 140, filterable: !1, virtualViewSize: null }, refresh: function() { this._itemBinder.refresh() }, reset: function() { this._itemBinder.reset() }, setDataSource: function(e) { var t = !e; this.dataSource = b.create(e), this.trigger("_dataSource", { dataSource: this.dataSource, empty: t }), this.options.autoBind && !t && (this.items().remove(), this.dataSource.fetch()) }, destroy: function() { y.fn.destroy.call(this), m.destroy(this.element), this._userEvents.destroy(), this._itemBinder && this._itemBinder.destroy(), this.element.unwrap(), delete this.element, delete this.wrapper, delete this._userEvents }, items: function() { return "group" === this.options.type ? this.element.find(".km-list").children() : this.element.children().not(".km-load-more") }, scroller: function() { return this._scrollerInstance || (this._scrollerInstance = this.element.closest(".km-scroll-wrapper").data("kendoMobileScroller")), this._scrollerInstance }, showLoading: function() { var e = this.view(); e && e.loader && e.loader.show() }, hideLoading: function() { var e = this.view(); e && e.loader && e.loader.hide() }, insertAt: function(e, t, n) { var i = this; return i._renderItems(e, function(r) { if (0 === t ? i.element.prepend(r) : -1 === t ? i.element.append(r) : i.items().eq(t - 1).after(r), n) for (var o = 0; r.length > o; o++) i.trigger(B, { item: r.eq(o), data: e[o], ns: w }) }) }, append: function(e, t) { return this.insertAt(e, -1, t) }, prepend: function(e, t) { return this.insertAt(e, 0, t) }, replace: function(e) { return this.options.type = "flat", this._angularItems("cleanup"), this.element.empty(), this._style(), this.insertAt(e, 0) }, replaceGrouped: function(t) { this.options.type = "group", this._angularItems("cleanup"), this.element.empty(); var n = e(m.render(this.groupTemplate, t)); this._enhanceItems(n.children("ul").children("li")), this.element.append(n), _.init(n), this._style(), this._angularItems("compile") }, remove: function(e) { var t = this.findByDataItem(e); this.angular("cleanup", function() { return { elements: t } }), m.destroy(t), t.remove() }, findByDataItem: function(e) { var t, n, i = []; for (t = 0, n = e.length; n > t; t++) i[t] = "[data-" + m.ns + "uid=" + e[t].uid + "]"; return this.element.find(i.join(",")) }, setDataItem: function(t, n) { var i = this, r = function(r) { var o = e(r[0]); m.destroy(t), e(t).replaceWith(o), i.trigger(B, { item: o, data: n, ns: w }) }; return this._renderItems([n], r)[0] }, updateSize: function() { this._size = this.getSize() }, _renderItems: function(t, n) { var i = e(m.render(this.template, t)); return this.angular("compile", function() { return { elements: i, data: t.map(function(e) { return { dataItem: e } }) } }), n(i), _.init(i), this._enhanceItems(i), i }, _dim: function(e) { this._toggle(e, !1) }, _highlight: function(e) { this._toggle(e, !0) }, _toggle: function(t, n) { if (!(t.which > 1)) { var i = e(t.currentTarget), r = i.parent(), o = T(i, "role") || "", a = !o.match(W), s = t.isDefaultPrevented(); a && r.toggleClass(A, n && !s) } }, _templates: function() { var e = this.options.template, t = this.options.headerTemplate, n = ' data-uid="#=arguments[0].uid || ""#"', i = {}, r = {}; typeof e === V && (i.template = e, e = "#=this.template(data)#"), this.template = S(m.template("<li" + n + ">" + e + "</li>"), i), r.template = this.template, typeof t === V && (r._headerTemplate = t, t = "#=this._headerTemplate(data)#"), r.headerTemplate = m.template(t), this.groupTemplate = S(I, r) }, _click: function(t) { if (!(t.event.which > 1 || t.event.isDefaultPrevented())) { var n, i = t.target, r = e(t.event.target), o = r.closest(m.roleSelector("button", "detailbutton", "backbutton")), a = m.widgetInstance(o, w), s = i.attr(m.attr("uid")); s && (n = this.dataSource.getByUid(s)), this.trigger(L, { target: r, item: i, dataItem: n, button: a }) && t.preventDefault() } }, _styleGroups: function() { var t = this.element.children(); t.children("ul").addClass("km-list"), t.each(function() { var t = e(this), n = t.contents().first(); t.addClass("km-group-container"), n.is("ul") || n.is("div." + D) || n.wrap(E) }) }, _style: function() { var e = this.options, t = "group" === e.type, n = this.element, i = "inset" === e.style; n.addClass("km-listview").toggleClass("km-list", !t).toggleClass("km-virtual-list", this.virtual).toggleClass("km-listinset", !t && i).toggleClass("km-listgroup", t && !i).toggleClass("km-listgroupinset", t && i), n.parents(".km-listview")[0] || n.closest(".km-content").toggleClass("km-insetcontent", i), t && this._styleGroups(), this.trigger(F) }, _enhanceItems: function(t) { t.each(function() { var t, n = e(this), i = !1; n.children().each(function() { t = e(this), t.is("a") ? (o(t), i = !0) : t.is("label") && (a(t), i = !0) }), i || r(n) }) } }), w.plugin(g) }(window.kendo.jQuery), function(e, t) { function n(n, i) { var o = i.find("[" + r.attr("align") + "=" + n + "]"); return o[0] ? e('<div class="km-' + n + 'item" />').append(o).prependTo(i) : t } function i(t) { var n = t.siblings(), i = !!t.children("ul")[0], o = !!n[0] && "" === e.trim(t.text()), a = !(!r.mobile.application || !r.mobile.application.element.is(".km-android")); t.prevAll().toggleClass("km-absolute", i), t.toggleClass("km-show-title", o), t.toggleClass("km-fill-title", o && !e.trim(t.html())), t.toggleClass("km-no-title", i), t.toggleClass("km-hide-title", a && !n.children().is(":visible")) } var r = window.kendo, o = r.mobile, a = o.ui, s = a.Widget, l = s.extend({ init: function(t, i) { var r = this; s.fn.init.call(r, t, i), t = r.element, r.container().bind("show", e.proxy(this, "refresh")), t.addClass("km-navbar").wrapInner(e('<div class="km-view-title km-show-title" />')), r.leftElement = n("left", t), r.rightElement = n("right", t), r.centerElement = t.find(".km-view-title") }, options: { name: "NavBar" }, title: function(e) { this.element.find(r.roleSelector("view-title")).text(e), i(this.centerElement) }, refresh: function(e) { var t = e.view; t.options.title ? this.title(t.options.title) : i(this.centerElement) }, destroy: function() { s.fn.destroy.call(this), r.destroy(this.element) } }); a.plugin(l) }(window.kendo.jQuery), function(e, t) { var n, i, r, o, a, s, l, c, d = window.kendo, u = d.mobile, h = u.ui, p = e.proxy, f = d.effects.Transition, g = d.ui.Pane, m = d.ui.PaneDimensions, v = h.DataBoundWidget, _ = d.data.DataSource, w = d.data.Buffer, b = d.data.BatchBuffer, y = Math, k = y.abs, x = y.ceil, C = y.round, S = y.max, T = y.min, D = y.floor, A = "change", E = "changing", I = "refresh", P = "km-current-page", M = "km-virtual-page", z = "function", F = "itemChange", R = "cleanup", H = 3, B = -1, L = 0, N = 1, O = -1, V = 0, U = 1, W = d.Class.extend({ init: function(t) { var n = this, i = e("<ol class='km-pages'/>"); t.element.append(i), this._changeProxy = p(n, "_change"), this._refreshProxy = p(n, "_refresh"), t.bind(A, this._changeProxy), t.bind(I, this._refreshProxy), e.extend(n, { element: i, scrollView: t }) }, items: function() { return this.element.children() }, _refresh: function(e) { var t, n = ""; for (t = 0; e.pageCount > t; t++) n += "<li/>"; this.element.html(n), this.items().eq(e.page).addClass(P) }, _change: function(e) { this.items().removeClass(P).eq(e.page).addClass(P) }, destroy: function() { this.scrollView.unbind(A, this._changeProxy), this.scrollView.unbind(I, this._refreshProxy), this.element.remove() } }); d.mobile.ui.ScrollViewPager = W, n = "transitionEnd", i = "dragStart", r = "dragEnd", o = d.Observable.extend({ init: function(t, o) { var a, s, l, c, u, h, p = this; d.Observable.fn.init.call(this), this.element = t, this.container = t.parent(), a = new d.ui.Movable(p.element), s = new f({ axis: "x", movable: a, onEnd: function() { p.trigger(n) } }), l = new d.UserEvents(t, { start: function(e) { 2 * k(e.x.velocity) >= k(e.y.velocity) ? l.capture() : l.cancel(), p.trigger(i, e), s.cancel() }, allowSelection: !0, end: function(e) { p.trigger(r, e) } }), c = new m({ element: p.element, container: p.container }), u = c.x, u.bind(A, function() { p.trigger(A) }), h = new g({ dimensions: c, userEvents: l, movable: a, elastic: !0 }), e.extend(p, { duration: o && o.duration || 1, movable: a, transition: s, userEvents: l, dimensions: c, dimension: u, pane: h }), this.bind([n, i, r, A], o) }, size: function() { return { width: this.dimensions.x.getSize(), height: this.dimensions.y.getSize() } }, total: function() { return this.dimension.getTotal() }, offset: function() { return -this.movable.x }, updateDimension: function() { this.dimension.update(!0) }, refresh: function() { this.dimensions.refresh() }, moveTo: function(e) { this.movable.moveAxis("x", -e) }, transitionTo: function(e, t, n) { n ? this.moveTo(-e) : this.transition.moveTo({ location: e, duration: this.duration, ease: t }) } }), d.mobile.ui.ScrollViewElasticPane = o, a = d.Observable.extend({ init: function(e, t, n) { var i = this; d.Observable.fn.init.call(this), i.element = e, i.pane = t, i._getPages(), this.page = 0, this.pageSize = n.pageSize || 1, this.contentHeight = n.contentHeight, this.enablePager = n.enablePager, this.pagerOverlay = n.pagerOverlay }, scrollTo: function(e, t) { this.page = e, this.pane.transitionTo(-e * this.pane.size().width, f.easeOutExpo, t) }, paneMoved: function(e, t, n, i) { var r, o, a = this, s = a.pane, l = s.size().width * a.pageSize, c = C, d = t ? f.easeOutBack : f.easeOutExpo; e === O ? c = x : e === U && (c = D), o = c(s.offset() / l), r = S(a.minSnap, T(-o * l, a.maxSnap)), o != a.page && n && n({ currentPage: a.page, nextPage: o }) && (r = -a.page * s.size().width), s.transitionTo(r, d, i) }, updatePage: function() { var e = this.pane, t = C(e.offset() / e.size().width); return t != this.page ? (this.page = t, !0) : !1 }, forcePageUpdate: function() { return this.updatePage() }, resizeTo: function(e) { var t, n, i = this.pane, r = e.width; this.pageElements.width(r), "100%" === this.contentHeight && (t = this.element.parent().height(), this.enablePager === !0 && (n = this.element.parent().find("ol.km-pages"), !this.pagerOverlay && n.length && (t -= n.outerHeight(!0))), this.element.css("height", t), this.pageElements.css("height", t)), i.updateDimension(), this._paged || (this.page = D(i.offset() / r)), this.scrollTo(this.page, !0), this.pageCount = x(i.total() / r), this.minSnap = -(this.pageCount - 1) * r, this.maxSnap = 0 }, _getPages: function() { this.pageElements = this.element.find(d.roleSelector("page")), this._paged = this.pageElements.length > 0 } }), d.mobile.ui.ScrollViewContent = a, s = d.Observable.extend({ init: function(e, t, n) { var i = this; d.Observable.fn.init.call(this), i.element = e, i.pane = t, i.options = n, i._templates(), i.page = n.page || 0, i.pages = [], i._initPages(), i.resizeTo(i.pane.size()), i.pane.dimension.forceEnabled() }, setDataSource: function(e) { this.dataSource = _.create(e), this._buffer(), this._pendingPageRefresh = !1, this._pendingWidgetRefresh = !1 }, _viewShow: function() { var e = this; e._pendingWidgetRefresh && (setTimeout(function() { e._resetPages() }, 0), e._pendingWidgetRefresh = !1) }, _buffer: function() { var e = this.options.itemsPerPage; this.buffer && this.buffer.destroy(), this.buffer = e > 1 ? new b(this.dataSource, e) : new w(this.dataSource, 3 * e), this._resizeProxy = p(this, "_onResize"), this._resetProxy = p(this, "_onReset"), this._endReachedProxy = p(this, "_onEndReached"), this.buffer.bind({ resize: this._resizeProxy, reset: this._resetProxy, endreached: this._endReachedProxy }) }, _templates: function() { var e = this.options.template, t = this.options.emptyTemplate, n = {}, i = {}; typeof e === z && (n.template = e, e = "#=this.template(data)#"), this.template = p(d.template(e), n), typeof t === z && (i.emptyTemplate = t, t = "#=this.emptyTemplate(data)#"), this.emptyTemplate = p(d.template(t), i) }, _initPages: function() { var e, t, n = this.pages, i = this.element; for (t = 0; H > t; t++) e = new l(i), n.push(e); this.pane.updateDimension() }, resizeTo: function(e) { var t, n, i, r = this.pages, o = this.pane; for (t = 0; r.length > t; t++) r[t].setWidth(e.width); "auto" === this.options.contentHeight ? this.element.css("height", this.pages[1].element.height()) : "100%" === this.options.contentHeight && (n = this.element.parent().height(), this.options.enablePager === !0 && (i = this.element.parent().find("ol.km-pages"), !this.options.pagerOverlay && i.length && (n -= i.outerHeight(!0))), this.element.css("height", n), r[0].element.css("height", n), r[1].element.css("height", n), r[2].element.css("height", n)), o.updateDimension(), this._repositionPages(), this.width = e.width }, scrollTo: function(e) { var t, n = this.buffer; n.syncDataSource(), t = n.at(e), t && (this._updatePagesContent(e), this.page = e) }, paneMoved: function(e, t, n, i) { var r, o = this, a = o.pane, s = a.size().width, l = a.offset(), c = Math.abs(l) >= s / 3, u = t ? d.effects.Transition.easeOutBack : d.effects.Transition.easeOutExpo, h = o.page + 2 > o.buffer.total(), p = 0; e === U ? 0 !== o.page && (p = -1) : e !== O || h ? l > 0 && c && !h ? p = 1 : 0 > l && c && 0 !== o.page && (p = -1) : p = 1, r = o.page, p && (r = p > 0 ? r + 1 : r - 1), n && n({ currentPage: o.page, nextPage: r }) && (p = 0), 0 === p ? o._cancelMove(u, i) : -1 === p ? o._moveBackward(i) : 1 === p && o._moveForward(i) }, updatePage: function() { var e = this.pages; return 0 === this.pane.offset() ? !1 : (this.pane.offset() > 0 ? (e.push(this.pages.shift()), this.page++, this.setPageContent(e[2], this.page + 1)) : (e.unshift(this.pages.pop()), this.page--, this.setPageContent(e[0], this.page - 1)), this._repositionPages(), this._resetMovable(), !0) }, forcePageUpdate: function() { var e = this.pane.offset(), t = 3 * this.pane.size().width / 4; return k(e) > t ? this.updatePage() : !1 }, _resetMovable: function() { this.pane.moveTo(0) }, _moveForward: function(e) { this.pane.transitionTo(-this.width, d.effects.Transition.easeOutExpo, e) }, _moveBackward: function(e) { this.pane.transitionTo(this.width, d.effects.Transition.easeOutExpo, e) }, _cancelMove: function(e, t) { this.pane.transitionTo(0, e, t) }, _resetPages: function() { this.page = this.options.page || 0, this._updatePagesContent(this.page), this._repositionPages(), this.trigger("reset") }, _onResize: function() { this.pageCount = x(this.dataSource.total() / this.options.itemsPerPage), this._pendingPageRefresh && (this._updatePagesContent(this.page), this._pendingPageRefresh = !1), this.trigger("resize") }, _onReset: function() { this.pageCount = x(this.dataSource.total() / this.options.itemsPerPage), this._resetPages() }, _onEndReached: function() { this._pendingPageRefresh = !0 }, _repositionPages: function() { var e = this.pages; e[0].position(B), e[1].position(L), e[2].position(N) }, _updatePagesContent: function(e) { var t = this.pages, n = e || 0; this.setPageContent(t[0], n - 1), this.setPageContent(t[1], n), this.setPageContent(t[2], n + 1) }, setPageContent: function(t, n) { var i = this.buffer, r = this.template, o = this.emptyTemplate, a = null; n >= 0 && (a = i.at(n), e.isArray(a) && !a.length && (a = null)), this.trigger(R, { item: t.element }), t.content(null !== a ? r(a) : o({})), d.mobile.init(t.element), this.trigger(F, { item: t.element, data: a, ns: d.mobile.ui }) } }), d.mobile.ui.VirtualScrollViewContent = s, l = d.Class.extend({ init: function(t) { this.element = e("<div class='" + M + "'></div>"), this.width = t.width(), this.element.width(this.width), t.append(this.element) }, content: function(e) { this.element.html(e) }, position: function(e) { this.element.css("transform", "translate3d(" + this.width * e + "px, 0, 0)") }, setWidth: function(e) { this.width = e, this.element.width(e) } }), d.mobile.ui.VirtualPage = l, c = v.extend({ init: function(e, t) { var n, i, r, l = this; v.fn.init.call(l, e, t), t = l.options, e = l.element, d.stripWhitespace(e[0]), e.wrapInner("<div/>").addClass("km-scrollview"), this.options.enablePager && (this.pager = new W(this), this.options.pagerOverlay && e.addClass("km-scrollview-overlay")), l.inner = e.children().first(), l.page = 0, l.inner.css("height", t.contentHeight), l.pane = new o(l.inner, { duration: this.options.duration, transitionEnd: p(this, "_transitionEnd"), dragStart: p(this, "_dragStart"), dragEnd: p(this, "_dragEnd"), change: p(this, I) }), l.bind("resize", function() { l.pane.refresh() }), l.page = t.page, n = 0 === this.inner.children().length, i = n ? new s(l.inner, l.pane, t) : new a(l.inner, l.pane, t), i.page = l.page, i.bind("reset", function() { l._syncWithContent(), l.trigger(I, { pageCount: i.pageCount, page: i.page }) }), i.bind("resize", function() { l.trigger(I, { pageCount: i.pageCount, page: i.page }) }), i.bind(F, function(e) { l.trigger(F, e), l.angular("compile", function() { return { elements: e.item, data: [{ dataItem: e.data }] } }) }), i.bind(R, function(e) { l.angular("cleanup", function() { return { elements: e.item } }) }), l._content = i, l.setDataSource(t.dataSource), r = l.container(), r.nullObject ? (l.viewInit(), l.viewShow()) : r.bind("show", p(this, "viewShow")).bind("init", p(this, "viewInit")) }, options: { name: "ScrollView", page: 0, duration: 400, velocityThreshold: .8, contentHeight: "auto", pageSize: 1, itemsPerPage: 1, bounceVelocityThreshold: 1.6, enablePager: !0, pagerOverlay: !1, autoBind: !0, template: "", emptyTemplate: "" }, events: [E, A, I], destroy: function() { v.fn.destroy.call(this), d.destroy(this.element) }, viewInit: function() { this.options.autoBind && this._content.scrollTo(this._content.page, !0) }, viewShow: function() { this.pane.refresh() }, refresh: function() { var e = this._content; e.resizeTo(this.pane.size()), this.page = e.page, this.trigger(I, { pageCount: e.pageCount, page: e.page }) }, content: function(e) { this.element.children().first().html(e), this._content._getPages(), this.pane.refresh() }, value: function(e) { var n = this.dataSource; return e ? (this.scrollTo(n.indexOf(e), !0), t) : n.at(this.page) }, scrollTo: function(e, t) { this._content.scrollTo(e, t), this._syncWithContent() }, prev: function() { var e = this, n = e.page - 1; e._content instanceof s ? e._content.paneMoved(U, t, function(t) { return e.trigger(E, t) }) : n > -1 && e.scrollTo(n) }, next: function() { var e = this, n = e.page + 1; e._content instanceof s ? e._content.paneMoved(O, t, function(t) { return e.trigger(E, t) }) : e._content.pageCount > n && e.scrollTo(n) }, setDataSource: function(e) { if (this._content instanceof s) { var t = !e; this.dataSource = _.create(e), this._content.setDataSource(this.dataSource), this.options.autoBind && !t && this.dataSource.fetch() } }, items: function() { return this.element.find("." + M) }, _syncWithContent: function() { var e, n, i = this._content.pages, r = this._content.buffer; this.page = this._content.page, e = r ? r.at(this.page) : t, e instanceof Array || (e = [e]), n = i ? i[1].element : t, this.trigger(A, { page: this.page, element: n, data: e }) }, _dragStart: function() { this._content.forcePageUpdate() && this._syncWithContent() }, _dragEnd: function(e) { var t = this, n = e.x.velocity, i = this.options.velocityThreshold, r = V, o = k(n) > this.options.bounceVelocityThreshold; n > i ? r = U : -i > n && (r = O), this._content.paneMoved(r, o, function(e) { return t.trigger(E, e) }) }, _transitionEnd: function() { this._content.updatePage() && this._syncWithContent() } }), h.plugin(c) }(window.kendo.jQuery), function(e, t) { function n(e, t, n) { return Math.max(t, Math.min(n, e)) } var i = window.kendo, r = i.mobile.ui, o = r.Widget, a = i.support, s = "change", l = "km-switch-on", c = "km-switch-off", d = "margin-left", u = "km-state-active", h = "km-state-disabled", p = "disabled", f = a.transitions.css + "transform", g = e.proxy, m = '<span class="km-switch km-widget"> <span class="km-switch-wrapper"><span class="km-switch-background"></span></span> <span class="km-switch-container"><span class="km-switch-handle" > <span class="km-switch-label-on">{0}</span> <span class="km-switch-label-off">{1}</span> </span> </span>', v = o.extend({ init: function(t, n) { var r, a = this; o.fn.init.call(a, t, n), n = a.options, a.wrapper = e(i.format(m, n.onLabel, n.offLabel)), a.handle = a.wrapper.find(".km-switch-handle"), a.background = a.wrapper.find(".km-switch-background"), a.wrapper.insertBefore(a.element).prepend(a.element), a._drag(), a.origin = parseInt(a.background.css(d), 10), a.constrain = 0, a.snapPoint = 0, t = a.element[0], t.type = "checkbox", a._animateBackground = !0, r = a.options.checked, null === r && (r = t.checked), a.check(r), a.options.enable = a.options.enable && !a.element.attr(p), a.enable(a.options.enable), a.refresh(), i.notify(a, i.mobile.ui) }, refresh: function() { var e = this, t = e.handle.outerWidth(!0); e.width = e.wrapper.width(), e.constrain = e.width - t, e.snapPoint = e.constrain / 2, "number" != typeof e.origin && (e.origin = parseInt(e.background.css(d), 10)), e.background.data("origin", e.origin), e.check(e.element[0].checked) }, events: [s], options: { name: "Switch", onLabel: "on", offLabel: "off", checked: null, enable: !0 }, check: function(e) { var n = this, i = n.element[0]; return e === t ? i.checked : (n._position(e ? n.constrain : 0), i.checked = e, n.wrapper.toggleClass(l, e).toggleClass(c, !e), t) }, value: function() { return this.check.apply(this, arguments) }, destroy: function() { o.fn.destroy.call(this), this.userEvents.destroy() }, toggle: function() { var e = this; e.check(!e.element[0].checked) }, enable: function(e) { var n = this.element, i = this.wrapper; t === e && (e = !0), this.options.enable = e, e ? n.removeAttr(p) : n.attr(p, p), i.toggleClass(h, !e) }, _resize: function() { this.refresh() }, _move: function(e) { var t = this; e.preventDefault(), t._position(n(t.position + e.x.delta, 0, t.width - t.handle.outerWidth(!0))) }, _position: function(e) { var t = this; t.position = e, t.handle.css(f, "translatex(" + e + "px)"), t._animateBackground && t.background.css(d, t.origin + e) }, _start: function() { this.options.enable ? (this.userEvents.capture(), this.handle.addClass(u)) : this.userEvents.cancel() }, _stop: function() { var e = this; e.handle.removeClass(u), e._toggle(e.position > e.snapPoint) }, _toggle: function(e) { var t, n = this, r = n.handle, o = n.element[0], a = o.checked, d = i.mobile.application && i.mobile.application.os.wp ? 100 : 200; n.wrapper.toggleClass(l, e).toggleClass(c, !e), n.position = t = e * n.constrain, n._animateBackground && n.background.kendoStop(!0, !0).kendoAnimate({ effects: "slideMargin", offset: t, reset: !0, reverse: !e, axis: "left", duration: d }), r.kendoStop(!0, !0).kendoAnimate({ effects: "slideTo", duration: d, offset: t + "px,0", reset: !0, complete: function() { a !== e && (o.checked = e, n.trigger(s, { checked: e })) } }) }, _drag: function() { var e = this; e.userEvents = new i.UserEvents(e.wrapper, { tap: function() { e.options.enable && e._toggle(!e.element[0].checked) }, start: g(e._start, e), move: g(e._move, e), end: g(e._stop, e) }) } }); r.plugin(v) }(window.kendo.jQuery), function(e) { function t(t) { return e('<span class="km-badge">' + t + "</span>") } var n = window.kendo, i = n.mobile.ui, r = i.Widget, o = "km-state-active", a = "select", s = r.extend({ init: function(t, n) { var i = this; r.fn.init.call(i, t, n), i.container().bind("show", e.proxy(this, "refresh")), i.element.addClass("km-tabstrip").find("a").each(i._buildButton).eq(i.options.selectedIndex).addClass(o), i.element.on("down", "a", "_release") }, events: [a], switchTo: function(t) { var n, i, r = this.element.find("a"), o = 0, a = r.length; if (!isNaN(t)) return this._setActiveItem(r.eq(t)), !0; for (; a > o; o++) if (n = r[o], i = n.href.replace(/(\#.+)(\?.+)$/, "$1"), -1 !== i.indexOf(t, i.length - t.length)) return this._setActiveItem(e(n)), !0; return !1 }, switchByFullUrl: function(e) { var t; t = this.element.find("a[href$='" + e + "']"), this._setActiveItem(t) }, clear: function() { this.currentItem().removeClass(o) }, currentItem: function() { return this.element.children("." + o) }, badge: function(n, i) { var r, o = this.element; return isNaN(n) || (n = o.children().get(n)), n = o.find(n), r = e(n.find(".km-badge")[0] || t(i).insertAfter(n.children(".km-icon"))), i || 0 === i ? (r.html(i), this) : i === !1 ? (r.empty().remove(), this) : r.html() }, _release: function(t) { if (!(t.which > 1)) { var n = this, i = e(t.currentTarget); i[0] !== n.currentItem()[0] && (n.trigger(a, { item: i }) ? t.preventDefault() : n._setActiveItem(i)) } }, _setActiveItem: function(e) { e[0] && (this.clear(), e.addClass(o)) }, _buildButton: function() { var i = e(this), r = n.attrValue(i, "icon"), o = n.attrValue(i, "badge"), a = i.find("img"), s = e('<span class="km-icon"/>'); i.addClass("km-button").attr(n.attr("role"), "tab").contents().not(a).wrapAll('<span class="km-text"/>'), a[0] ? a.addClass("km-image").prependTo(i) : (i.prepend(s), r && (s.addClass("km-" + r), (o || 0 === o) && t(o).insertAfter(s))) }, refresh: function(e) { var t = e.view.element.attr(n.attr("url")); t && !this.switchTo(e.view.id) && this.switchTo(t) }, options: { name: "TabStrip", selectedIndex: 0, enable: !0 } }); i.plugin(s) }(window.kendo.jQuery); return window.kendo }, typeof define == "function" && define.amd ? define : function(_, f) { f() });