vendor: 37,002 bytes, lines 1-3
1 2/*! jQuery v3.6.3 | (c) OpenJS Foundation and other contributors | jquery.org/license */ 3!function (e, t) { "use strict"; "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function (C, e) { "use strict"; var t = [], r = Object.getPrototypeOf, s = t.slice, g = t.flat ? function (e) { return t.flat.call(e) } : function (e) { return t.concat.apply([], e) }, u = t.push, i = t.indexOf, n = {}, o = n.toString, y = n.hasOwnProperty, a = y.toString, l = a.call(Object), v = {}, m = function (e) { return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item }, x = function (e) { return null != e && e === e.window }, S = C.document, c = { type: !0, src: !0, nonce: !0, noModule: !0 }; function b(e, t, n) { var r, i, o = (n = n || S).createElement("script"); if (o.text = e, t) for (r in c) (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); n.head.appendChild(o).parentNode.removeChild(o) } function w(e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[o.call(e)] || "object" : typeof e } var f = "3.6.3", E = function (e, t) { return new E.fn.init(e, t) }; function p(e) { var t = !!e && "length" in e && e.length, n = w(e); return !m(e) && !x(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) } E.fn = E.prototype = { jquery: f, constructor: E, length: 0, toArray: function () { return s.call(this) }, get: function (e) { return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e] }, pushStack: function (e) { var t = E.merge(this.constructor(), e); return t.prevObject = this, t }, each: function (e) { return E.each(this, e) }, map: function (n) { return this.pushStack(E.map(this, function (e, t) { return n.call(e, t, e) })) }, slice: function () { return this.pushStack(s.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, even: function () { return this.pushStack(E.grep(this, function (e, t) { return (t + 1) % 2 })) }, odd: function () { return this.pushStack(E.grep(this, function (e, t) { return t % 2 })) }, eq: function (e) { var t = this.length, n = +e + (e < 0 ? t : 0); return this.pushStack(0 <= n && n < t ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: u, sort: t.sort, splice: t.splice }, E.extend = E.fn.extend = function () { var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || m(a) || (a = {}), s === u && (a = this, s--); s < u; s++)if (null != (e = arguments[s])) for (t in e) r = e[t], "__proto__" !== t && a !== r && (l && r && (E.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || E.isPlainObject(n) ? n : {}, i = !1, a[t] = E.extend(l, o, r)) : void 0 !== r && (a[t] = r)); return a }, E.extend({ expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { throw new Error(e) }, noop: function () { }, isPlainObject: function (e) { var t, n; return !(!e || "[object Object]" !== o.call(e)) && (!(t = r(e)) || "function" == typeof (n = y.call(t, "constructor") && t.constructor) && a.call(n) === l) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, globalEval: function (e, t, n) { b(e, { nonce: t && t.nonce }, n) }, each: function (e, t) { var n, r = 0; if (p(e)) { for (n = e.length; r < n; r++)if (!1 === t.call(e[r], r, e[r])) break } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; return e }, makeArray: function (e, t) { var n = t || []; return null != e && (p(Object(e)) ? E.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : i.call(t, e, n) }, merge: function (e, t) { for (var n = +t.length, r = 0, i = e.length; r < n; r++)e[i++] = t[r]; return e.length = i, e }, grep: function (e, t, n) { for (var r = [], i = 0, o = e.length, a = !n; i < o; i++)!t(e[i], i) !== a && r.push(e[i]); return r }, map: function (e, t, n) { var r, i, o = 0, a = []; if (p(e)) for (r = e.length; o < r; o++)null != (i = t(e[o], o, n)) && a.push(i); else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); return g(a) }, guid: 1, support: v }), "function" == typeof Symbol && (E.fn[Symbol.iterator] = t[Symbol.iterator]), E.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { n["[object " + t + "]"] = t.toLowerCase() }); var d = function (n) { var e, d, b, o, i, h, f, g, w, u, l, T, C, a, S, y, s, c, v, E = "sizzle" + 1 * new Date, p = n.document, k = 0, r = 0, m = ue(), x = ue(), A = ue(), N = ue(), j = function (e, t) { return e === t && (l = !0), 0 }, D = {}.hasOwnProperty, t = [], q = t.pop, L = t.push, H = t.push, O = t.slice, P = function (e, t) { for (var n = 0, r = e.length; n < r; n++)if (e[n] === t) return n; return -1 }, R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", M = "[\\x20\\t\\r\\n\\f]", I = "(?:\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", W = "\\[" + M + "*(" + I + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + I + "))|)" + M + "*\\]", F = ":(" + I + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + W + ")*)|.*)\\)|)", $ = new RegExp(M + "+", "g"), B = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), _ = new RegExp("^" + M + "*," + M + "*"), z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), U = new RegExp(M + "|>"), X = new RegExp(F), V = new RegExp("^" + I + "$"), G = { ID: new RegExp("^#(" + I + ")"), CLASS: new RegExp("^\\.(" + I + ")"), TAG: new RegExp("^(" + I + "|[*])"), ATTR: new RegExp("^" + W), PSEUDO: new RegExp("^" + F), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), bool: new RegExp("^(?:" + R + ")$", "i"), needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") }, Y = /HTML$/i, Q = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, ee = /[+~]/, te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), ne = function (e, t) { var n = "0x" + e.slice(1) - 65536; return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) }, re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ie = function (e, t) { return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e }, oe = function () { T() }, ae = be(function (e) { return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase() }, { dir: "parentNode", next: "legend" }); try { H.apply(t = O.call(p.childNodes), p.childNodes), t[p.childNodes.length].nodeType } catch (e) { H = { apply: t.length ? function (e, t) { L.apply(e, O.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function se(t, e, n, r) { var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; if (!r && (T(e), e = e || C, S)) { if (11 !== p && (u = Z.exec(t))) if (i = u[1]) { if (9 === p) { if (!(a = e.getElementById(i))) return n; if (a.id === i) return n.push(a), n } else if (f && (a = f.getElementById(i)) && v(e, a) && a.id === i) return n.push(a), n } else { if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; if ((i = u[3]) && d.getElementsByClassName && e.getElementsByClassName) return H.apply(n, e.getElementsByClassName(i)), n } if (d.qsa && !N[t + " "] && (!y || !y.test(t)) && (1 !== p || "object" !== e.nodeName.toLowerCase())) { if (c = t, f = e, 1 === p && (U.test(t) || z.test(t))) { (f = ee.test(t) && ve(e.parentNode) || e) === e && d.scope || ((s = e.getAttribute("id")) ? s = s.replace(re, ie) : e.setAttribute("id", s = E)), o = (l = h(t)).length; while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); c = l.join(",") } try { if (d.cssSupportsSelector && !CSS.supports("selector(:is(" + c + "))")) throw new Error; return H.apply(n, f.querySelectorAll(c)), n } catch (e) { N(t, !0) } finally { s === E && e.removeAttribute("id") } } } return g(t.replace(B, "$1"), e, n, r) } function ue() { var r = []; return function e(t, n) { return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n } } function le(e) { return e[E] = !0, e } function ce(e) { var t = C.createElement("fieldset"); try { return !!e(t) } catch (e) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function fe(e, t) { var n = e.split("|"), r = n.length; while (r--) b.attrHandle[n[r]] = t } function pe(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function de(t) { return function (e) { return "input" === e.nodeName.toLowerCase() && e.type === t } } function he(n) { return function (e) { var t = e.nodeName.toLowerCase(); return ("input" === t || "button" === t) && e.type === n } } function ge(t) { return function (e) { return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && ae(e) === t : e.disabled === t : "label" in e && e.disabled === t } } function ye(a) { return le(function (o) { return o = +o, le(function (e, t) { var n, r = a([], e.length, o), i = r.length; while (i--) e[n = r[i]] && (e[n] = !(t[n] = e[n])) }) }) } function ve(e) { return e && "undefined" != typeof e.getElementsByTagName && e } for (e in d = se.support = {}, i = se.isXML = function (e) { var t = e && e.namespaceURI, n = e && (e.ownerDocument || e).documentElement; return !Y.test(t || n && n.nodeName || "HTML") }, T = se.setDocument = function (e) { var t, n, r = e ? e.ownerDocument || e : p; return r != C && 9 === r.nodeType && r.documentElement && (a = (C = r).documentElement, S = !i(C), p != C && (n = C.defaultView) && n.top !== n && (n.addEventListener ? n.addEventListener("unload", oe, !1) : n.attachEvent && n.attachEvent("onunload", oe)), d.scope = ce(function (e) { return a.appendChild(e).appendChild(C.createElement("div")), "undefined" != typeof e.querySelectorAll && !e.querySelectorAll(":scope fieldset div").length }), d.cssSupportsSelector = ce(function () { return CSS.supports("selector(*)") && C.querySelectorAll(":is(:jqfake)") && !CSS.supports("selector(:is(*,:jqfake))") }), d.attributes = ce(function (e) { return e.className = "i", !e.getAttribute("className") }), d.getElementsByTagName = ce(function (e) { return e.appendChild(C.createComment("")), !e.getElementsByTagName("*").length }), d.getElementsByClassName = K.test(C.getElementsByClassName), d.getById = ce(function (e) { return a.appendChild(e).id = E, !C.getElementsByName || !C.getElementsByName(E).length }), d.getById ? (b.filter.ID = function (e) { var t = e.replace(te, ne); return function (e) { return e.getAttribute("id") === t } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && S) { var n = t.getElementById(e); return n ? [n] : [] } }) : (b.filter.ID = function (e) { var n = e.replace(te, ne); return function (e) { var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); return t && t.value === n } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && S) { var n, r, i, o = t.getElementById(e); if (o) { if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; i = t.getElementsByName(e), r = 0; while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] } return [] } }), b.find.TAG = d.getElementsByTagName ? function (e, t) { return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : d.qsa ? t.querySelectorAll(e) : void 0 } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, b.find.CLASS = d.getElementsByClassName && function (e, t) { if ("undefined" != typeof t.getElementsByClassName && S) return t.getElementsByClassName(e) }, s = [], y = [], (d.qsa = K.test(C.querySelectorAll)) && (ce(function (e) { var t; a.appendChild(e).innerHTML = "<a id='" + E + "'></a><select id='" + E + "-\r\\' msallowcapture=''><option selected=''></option></select>", e.querySelectorAll("[msallowcapture^='']").length && y.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || y.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll("[id~=" + E + "-]").length || y.push("~="), (t = C.createElement("input")).setAttribute("name", ""), e.appendChild(t), e.querySelectorAll("[name='']").length || y.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), e.querySelectorAll(":checked").length || y.push(":checked"), e.querySelectorAll("a#" + E + "+*").length || y.push(".#.+[+~]"), e.querySelectorAll("\\\f"), y.push("[\\r\\n\\f]") }), ce(function (e) { e.innerHTML = "<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>"; var t = C.createElement("input"); t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && y.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && y.push(":enabled", ":disabled"), a.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && y.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), y.push(",.*:") })), (d.matchesSelector = K.test(c = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.oMatchesSelector || a.msMatchesSelector)) && ce(function (e) { d.disconnectedMatch = c.call(e, "*"), c.call(e, "[s!='']:x"), s.push("!=", F) }), d.cssSupportsSelector || y.push(":has"), y = y.length && new RegExp(y.join("|")), s = s.length && new RegExp(s.join("|")), t = K.test(a.compareDocumentPosition), v = t || K.test(a.contains) ? function (e, t) { var n = 9 === e.nodeType && e.documentElement || e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, j = t ? function (e, t) { if (e === t) return l = !0, 0; var n = !e.compareDocumentPosition - !t.compareDocumentPosition; return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !d.sortDetached && t.compareDocumentPosition(e) === n ? e == C || e.ownerDocument == p && v(p, e) ? -1 : t == C || t.ownerDocument == p && v(p, t) ? 1 : u ? P(u, e) - P(u, t) : 0 : 4 & n ? -1 : 1) } : function (e, t) { if (e === t) return l = !0, 0; var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], s = [t]; if (!i || !o) return e == C ? -1 : t == C ? 1 : i ? -1 : o ? 1 : u ? P(u, e) - P(u, t) : 0; if (i === o) return pe(e, t); n = e; while (n = n.parentNode) a.unshift(n); n = t; while (n = n.parentNode) s.unshift(n); while (a[r] === s[r]) r++; return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0 }), C }, se.matches = function (e, t) { return se(e, null, null, t) }, se.matchesSelector = function (e, t) { if (T(e), d.matchesSelector && S && !N[t + " "] && (!s || !s.test(t)) && (!y || !y.test(t))) try { var n = c.call(e, t); if (n || d.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n } catch (e) { N(t, !0) } return 0 < se(t, C, null, [e]).length }, se.contains = function (e, t) { return (e.ownerDocument || e) != C && T(e), v(e, t) }, se.attr = function (e, t) { (e.ownerDocument || e) != C && T(e); var n = b.attrHandle[t.toLowerCase()], r = n && D.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !S) : void 0; return void 0 !== r ? r : d.attributes || !S ? e.getAttribute(t) : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }, se.escape = function (e) { return (e + "").replace(re, ie) }, se.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, se.uniqueSort = function (e) { var t, n = [], r = 0, i = 0; if (l = !d.detectDuplicates, u = !d.sortStable && e.slice(0), e.sort(j), l) { while (t = e[i++]) t === e[i] && (r = n.push(i)); while (r--) e.splice(n[r], 1) } return u = null, e }, o = se.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += o(e) } else if (3 === i || 4 === i) return e.nodeValue } else while (t = e[r++]) n += o(t); return n }, (b = se.selectors = { cacheLength: 50, createPseudo: le, match: G, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(te, ne), e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || se.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && se.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[6] && e[2]; return G.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = h(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(te, ne).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = m[e + " "]; return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && m(e, function (e) { return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") }) }, ATTR: function (n, r, i) { return function (e) { var t = se.attr(e, n); return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace($, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) } }, CHILD: function (h, e, t, g, y) { var v = "nth" !== h.slice(0, 3), m = "last" !== h.slice(-4), x = "of-type" === e; return 1 === g && 0 === y ? function (e) { return !!e.parentNode } : function (e, t, n) { var r, i, o, a, s, u, l = v !== m ? "nextSibling" : "previousSibling", c = e.parentNode, f = x && e.nodeName.toLowerCase(), p = !n && !x, d = !1; if (c) { if (v) { while (l) { a = e; while (a = a[l]) if (x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) return !1; u = l = "only" === h && !u && "nextSibling" } return !0 } if (u = [m ? c.firstChild : c.lastChild], m && p) { d = (s = (r = (i = (o = (a = c)[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && r[2], a = s && c.childNodes[s]; while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if (1 === a.nodeType && ++d && a === e) { i[h] = [k, s, d]; break } } else if (p && (d = s = (r = (i = (o = (a = e)[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), !1 === d) while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if ((x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) && ++d && (p && ((i = (o = a[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] = [k, d]), a === e)) break; return (d -= y) === g || d % g == 0 && 0 <= d / g } } }, PSEUDO: function (e, o) { var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || se.error("unsupported pseudo: " + e); return a[E] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? le(function (e, t) { var n, r = a(e, o), i = r.length; while (i--) e[n = P(e, r[i])] = !(t[n] = r[i]) }) : function (e) { return a(e, 0, t) }) : a } }, pseudos: { not: le(function (e) { var r = [], i = [], s = f(e.replace(B, "$1")); return s[E] ? le(function (e, t, n, r) { var i, o = s(e, null, r, []), a = e.length; while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) }) : function (e, t, n) { return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop() } }), has: le(function (t) { return function (e) { return 0 < se(t, e).length } }), contains: le(function (t) { return t = t.replace(te, ne), function (e) { return -1 < (e.textContent || o(e)).indexOf(t) } }), lang: le(function (n) { return V.test(n || "") || se.error("unsupported lang: " + n), n = n.replace(te, ne).toLowerCase(), function (e) { var t; do { if (t = S ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") } while ((e = e.parentNode) && 1 === e.nodeType); return !1 } }), target: function (e) { var t = n.location && n.location.hash; return t && t.slice(1) === e.id }, root: function (e) { return e === a }, focus: function (e) { return e === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: ge(!1), disabled: ge(!0), checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeType < 6) return !1; return !0 }, parent: function (e) { return !b.pseudos.empty(e) }, header: function (e) { return J.test(e.nodeName) }, input: function (e) { return Q.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) }, first: ye(function () { return [0] }), last: ye(function (e, t) { return [t - 1] }), eq: ye(function (e, t, n) { return [n < 0 ? n + t : n] }), even: ye(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: ye(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;)e.push(r); return e }), gt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }).pseudos.nth = b.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) b.pseudos[e] = de(e); for (e in { submit: !0, reset: !0 }) b.pseudos[e] = he(e); function me() { } function xe(e) { for (var t = 0, n = e.length, r = ""; t < n; t++)r += e[t].value; return r } function be(s, e, t) { var u = e.dir, l = e.next, c = l || u, f = t && "parentNode" === c, p = r++; return e.first ? function (e, t, n) { while (e = e[u]) if (1 === e.nodeType || f) return s(e, t, n); return !1 } : function (e, t, n) { var r, i, o, a = [k, p]; if (n) { while (e = e[u]) if ((1 === e.nodeType || f) && s(e, t, n)) return !0 } else while (e = e[u]) if (1 === e.nodeType || f) if (i = (o = e[E] || (e[E] = {}))[e.uniqueID] || (o[e.uniqueID] = {}), l && l === e.nodeName.toLowerCase()) e = e[u] || e; else { if ((r = i[c]) && r[0] === k && r[1] === p) return a[2] = r[2]; if ((i[c] = a)[2] = s(e, t, n)) return !0 } return !1 } } function we(i) { return 1 < i.length ? function (e, t, n) { var r = i.length; while (r--) if (!i[r](e, t, n)) return !1; return !0 } : i[0] } function Te(e, t, n, r, i) { for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)(o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); return a } function Ce(d, h, g, y, v, e) { return y && !y[E] && (y = Ce(y)), v && !v[E] && (v = Ce(v, e)), le(function (e, t, n, r) { var i, o, a, s = [], u = [], l = t.length, c = e || function (e, t, n) { for (var r = 0, i = t.length; r < i; r++)se(e, t[r], n); return n }(h || "*", n.nodeType ? [n] : n, []), f = !d || !e && h ? c : Te(c, s, d, n, r), p = g ? v || (e ? d : l || y) ? [] : t : f; if (g && g(f, p, n, r), y) { i = Te(p, u), y(i, [], n, r), o = i.length; while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)) } if (e) { if (v || d) { if (v) { i = [], o = p.length; while (o--) (a = p[o]) && i.push(f[o] = a); v(null, p = [], i, r) } o = p.length; while (o--) (a = p[o]) && -1 < (i = v ? P(e, a) : s[o]) && (e[i] = !(t[i] = a)) } } else p = Te(p === t ? p.splice(l, p.length) : p), v ? v(null, t, p, r) : H.apply(t, p) }) } function Se(e) { for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = be(function (e) { return e === i }, a, !0), l = be(function (e) { return -1 < P(i, e) }, a, !0), c = [function (e, t, n) { var r = !o && (n || t !== w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); return i = null, r }]; s < r; s++)if (t = b.relative[e[s].type]) c = [be(we(c), t)]; else { if ((t = b.filter[e[s].type].apply(null, e[s].matches))[E]) { for (n = ++s; n < r; n++)if (b.relative[e[n].type]) break; return Ce(1 < s && we(c), 1 < s && xe(e.slice(0, s - 1).concat({ value: " " === e[s - 2].type ? "*" : "" })).replace(B, "$1"), t, s < n && Se(e.slice(s, n)), n < r && Se(e = e.slice(n)), n < r && xe(e)) } c.push(t) } return we(c) } return me.prototype = b.filters = b.pseudos, b.setFilters = new me, h = se.tokenize = function (e, t) { var n, r, i, o, a, s, u, l = x[e + " "]; if (l) return t ? 0 : l.slice(0); a = e, s = [], u = b.preFilter; while (a) { for (o in n && !(r = _.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = z.exec(a)) && (n = r.shift(), i.push({ value: n, type: r[0].replace(B, " ") }), a = a.slice(n.length)), b.filter) !(r = G[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ value: n, type: o, matches: r }), a = a.slice(n.length)); if (!n) break } return t ? a.length : a ? se.error(e) : x(e, s).slice(0) }, f = se.compile = function (e, t) { var n, y, v, m, x, r, i = [], o = [], a = A[e + " "]; if (!a) { t || (t = h(e)), n = t.length; while (n--) (a = Se(t[n]))[E] ? i.push(a) : o.push(a); (a = A(e, (y = o, m = 0 < (v = i).length, x = 0 < y.length, r = function (e, t, n, r, i) { var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), h = k += null == p ? 1 : Math.random() || .1, g = d.length; for (i && (w = t == C || t || i); l !== g && null != (o = d[l]); l++) { if (x && o) { a = 0, t || o.ownerDocument == C || (T(o), n = !S); while (s = y[a++]) if (s(o, t || C, n)) { r.push(o); break } i && (k = h) } m && ((o = !s && o) && u--, e && c.push(o)) } if (u += l, m && l !== u) { a = 0; while (s = v[a++]) s(c, f, t, n); if (e) { if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); f = Te(f) } H.apply(r, f), i && !e && 0 < f.length && 1 < u + v.length && se.uniqueSort(r) } return i && (k = h, w = p), c }, m ? le(r) : r))).selector = e } return a }, g = se.select = function (e, t, n, r) { var i, o, a, s, u, l = "function" == typeof e && e, c = !r && h(e = l.selector || e); if (n = n || [], 1 === c.length) { if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && S && b.relative[o[1].type]) { if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) return n; l && (t = t.parentNode), e = e.slice(o.shift().value.length) } i = G.needsContext.test(e) ? 0 : o.length; while (i--) { if (a = o[i], b.relative[s = a.type]) break; if ((u = b.find[s]) && (r = u(a.matches[0].replace(te, ne), ee.test(o[0].type) && ve(t.parentNode) || t))) { if (o.splice(i, 1), !(e = r.length && xe(o))) return H.apply(n, r), n; break } } } return (l || f(e, c))(r, t, !S, n, !t || ee.test(e) && ve(t.parentNode) || t), n }, d.sortStable = E.split("").sort(j).join("") === E, d.detectDuplicates = !!l, T(), d.sortDetached = ce(function (e) { return 1 & e.compareDocumentPosition(C.createElement("fieldset")) }), ce(function (e) { return e.innerHTML = "<a href='#'></a>", "#" === e.firstChild.getAttribute("href") }) || fe("type|href|height|width", function (e, t, n) { if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), d.attributes && ce(function (e) { return e.innerHTML = "<input/>", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || fe("value", function (e, t, n) { if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue }), ce(function (e) { return null == e.getAttribute("disabled") }) || fe(R, function (e, t, n) { var r; if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }), se }(C); E.find = d, E.expr = d.selectors, E.expr[":"] = E.expr.pseudos, E.uniqueSort = E.unique = d.uniqueSort, E.text = d.getText, E.isXMLDoc = d.isXML, E.contains = d.contains, E.escapeSelector = d.escape; var h = function (e, t, n) { var r = [], i = void 0 !== n; while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { if (i && E(e).is(n)) break; r.push(e) } return r }, T = function (e, t) { for (var n = []; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e); return n }, k = E.expr.match.needsContext; function A(e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() } var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function j(e, n, r) { return m(n) ? E.grep(e, function (e, t) { return !!n.call(e, t, e) !== r }) : n.nodeType ? E.grep(e, function (e) { return e === n !== r }) : "string" != typeof n ? E.grep(e, function (e) { return -1 < i.call(n, e) !== r }) : E.filter(n, e, r) } E.filter = function (e, t, n) { var r = t[0]; return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? E.find.matchesSelector(r, e) ? [r] : [] : E.find.matches(e, E.grep(t, function (e) { return 1 === e.nodeType })) }, E.fn.extend({ find: function (e) { var t, n, r = this.length, i = this; if ("string" != typeof e) return this.pushStack(E(e).filter(function () { for (t = 0; t < r; t++)if (E.contains(i[t], this)) return !0 })); for (n = this.pushStack([]), t = 0; t < r; t++)E.find(e, i[t], n); return 1 < r ? E.uniqueSort(n) : n }, filter: function (e) { return this.pushStack(j(this, e || [], !1)) }, not: function (e) { return this.pushStack(j(this, e || [], !0)) }, is: function (e) { return !!j(this, "string" == typeof e && k.test(e) ? E(e) : e || [], !1).length } }); var D, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; (E.fn.init = function (e, t, n) { var r, i; if (!e) return this; if (n = n || D, "string" == typeof e) { if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : q.exec(e)) || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (r[1]) { if (t = t instanceof E ? t[0] : t, E.merge(this, E.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : S, !0)), N.test(r[1]) && E.isPlainObject(t)) for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); return this } return (i = S.getElementById(r[2])) && (this[0] = i, this.length = 1), this } return e.nodeType ? (this[0] = e, this.length = 1, this) : m(e) ? void 0 !== n.ready ? n.ready(e) : e(E) : E.makeArray(e, this) }).prototype = E.fn, D = E(S); var L = /^(?:parents|prev(?:Until|All))/, H = { children: !0, contents: !0, next: !0, prev: !0 }; function O(e, t) { while ((e = e[t]) && 1 !== e.nodeType); return e } E.fn.extend({ has: function (e) { var t = E(e, this), n = t.length; return this.filter(function () { for (var e = 0; e < n; e++)if (E.contains(this, t[e])) return !0 }) }, closest: function (e, t) { var n, r = 0, i = this.length, o = [], a = "string" != typeof e && E(e); if (!k.test(e)) for (; r < i; r++)for (n = this[r]; n && n !== t; n = n.parentNode)if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && E.find.matchesSelector(n, e))) { o.push(n); break } return this.pushStack(1 < o.length ? E.uniqueSort(o) : o) }, index: function (e) { return e ? "string" == typeof e ? i.call(E(e), this[0]) : i.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (e, t) { return this.pushStack(E.uniqueSort(E.merge(this.get(), E(e, t)))) }, addBack: function (e) { return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) } }), E.each({ parent: function (e) { var t = e.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (e) { return h(e, "parentNode") }, parentsUntil: function (e, t, n) { return h(e, "parentNode", n) }, next: function (e) { return O(e, "nextSibling") }, prev: function (e) { return O(e, "previousSibling") }, nextAll: function (e) { return h(e, "nextSibling") }, prevAll: function (e) { return h(e, "previousSibling") }, nextUntil: function (e, t, n) { return h(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return h(e, "previousSibling", n) }, siblings: function (e) { return T((e.parentNode || {}).firstChild, e) }, children: function (e) { return T(e.firstChild) }, contents: function (e) { return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (A(e, "template") && (e = e.content || e), E.merge([], e.childNodes)) } }, function (r, i) { E.fn[r] = function (e, t) { var n = E.map(this, i, e); return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = E.filter(t, n)), 1 < this.length && (H[r] || E.uniqueSort(n), L.test(r) && n.reverse()), this.pushStack(n) } }); var P = /[^\x20\t\r\n\f]+/g; function R(e) { return e } function M(e) { throw e } function I(e, t, n, r) { var i; try { e && m(i = e.promise) ? i.call(e).done(t).fail(n) : e && m(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) } catch (e) { n.apply(void 0, [e]) } } E.Callbacks = function (r) { var e, n; r = "string" == typeof r ? (e = r, n = {}, E.each(e.match(P) || [], function (e, t) { n[t] = !0 }), n) : E.extend({}, r); var i, t, o, a, s = [], u = [], l = -1, c = function () { for (a = a || r.once, o = i = !0; u.length; l = -1) { t = u.shift(); while (++l < s.length) !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1) } r.memory || (t = !1), i = !1, a && (s = t ? [] : "") }, f = { add: function () { return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) { E.each(e, function (e, t) { m(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== w(t) && n(t) }) }(arguments), t && !i && c()), this }, remove: function () { return E.each(arguments, function (e, t) { var n; while (-1 < (n = E.inArray(t, s, n))) s.splice(n, 1), n <= l && l-- }), this }, has: function (e) { return e ? -1 < E.inArray(e, s) : 0 < s.length }, empty: function () { return s && (s = []), this }, disable: function () { return a = u = [], s = t = "", this }, disabled: function () { return !s }, lock: function () { return a = u = [], t || i || (s = t = ""), this }, locked: function () { return !!a }, fireWith: function (e, t) { return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this }, fire: function () { return f.fireWith(this, arguments), this }, fired: function () { return !!o } }; return f }, E.extend({ Deferred: function (e) { var o = [["notify", "progress", E.Callbacks("memory"), E.Callbacks("memory"), 2], ["resolve", "done", E.Callbacks("once memory"), E.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", E.Callbacks("once memory"), E.Callbacks("once memory"), 1, "rejected"]], i = "pending", a = { state: function () { return i }, always: function () { return s.done(arguments).fail(arguments), this }, "catch": function (e) { return a.then(null, e) }, pipe: function () { var i = arguments; return E.Deferred(function (r) { E.each(o, function (e, t) { var n = m(i[t[4]]) && i[t[4]]; s[t[1]](function () { var e = n && n.apply(this, arguments); e && m(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) }) }), i = null }).promise() }, then: function (t, n, r) { var u = 0; function l(i, o, a, s) { return function () { var n = this, r = arguments, e = function () { var e, t; if (!(i < u)) { if ((e = a.apply(n, r)) === o.promise()) throw new TypeError("Thenable self
3-resolution"); t = e && ("object" == typeof e || "function" == typeof e) && e.then, m(t) ? s ? t.call(e, l(u, o, R, s), l(u, o, M, s)) : (u++, t.call(e, l(u, o, R, s), l(u, o, M, s), l(u, o, R, o.notifyWith))) : (a !== R && (n = void 0, r = [e]), (s || o.resolveWith)(n, r)) } }, t = s ? e : function () { try { e() } catch (e) { E.Deferred.exceptionHook && E.Deferred.exceptionHook(e, t.stackTrace), u <= i + 1 && (a !== M && (n = void 0, r = [e]), o.rejectWith(n, r)) } }; i ? t() : (E.Deferred.getStackHook && (t.stackTrace = E.Deferred.getStackHook()), C.setTimeout(t)) } } return E.Deferred(function (e) { o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), o[1][3].add(l(0, e, m(t) ? t : R)), o[2][3].add(l(0, e, m(n) ? n : M)) }).promise() }, promise: function (e) { return null != e ? E.extend(e, a) : a } }, s = {}; return E.each(o, function (e, t) { var n = t[2], r = t[5]; a[t[1]] = n.add, r && n.add(function () { i = r }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), n.add(t[3].fire), s[t[0]] = function () { return s[t[0] + "With"](this === s ? void 0 : this, arguments), this }, s[t[0] + "With"] = n.fireWith }), a.promise(s), e && e.call(s, s), s }, when: function (e) { var n = arguments.length, t = n, r = Array(t), i = s.call(arguments), o = E.Deferred(), a = function (t) { return function (e) { r[t] = this, i[t] = 1 < arguments.length ? s.call(arguments) : e, --n || o.resolveWith(r, i) } }; if (n <= 1 && (I(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || m(i[t] && i[t].then))) return o.then(); while (t--) I(i[t], a(t), o.reject); return o.promise() } }); var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; E.Deferred.exceptionHook = function (e, t) { C.console && C.console.warn && e && W.test(e.name) && C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) }, E.readyException = function (e) { C.setTimeout(function () { throw e }) }; var F = E.Deferred(); function $() { S.removeEventListener("DOMContentLoaded", $), C.removeEventListener("load", $), E.ready() } E.fn.ready = function (e) { return F.then(e)["catch"](function (e) { E.readyException(e) }), this }, E.extend({ isReady: !1, readyWait: 1, ready: function (e) { (!0 === e ? --E.readyWait : E.isReady) || (E.isReady = !0) !== e && 0 < --E.readyWait || F.resolveWith(S, [E]) } }), E.ready.then = F.then, "complete" === S.readyState || "loading" !== S.readyState && !S.documentElement.doScroll ? C.setTimeout(E.ready) : (S.addEventListener("DOMContentLoaded", $), C.addEventListener("load", $)); var B = function (e, t, n, r, i, o, a) { var s = 0, u = e.length, l = null == n; if ("object" === w(n)) for (s in i = !0, n) B(e, t, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, m(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(E(e), n) })), t)) for (; s < u; s++)t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); return i ? e : l ? t.call(e) : u ? t(e[0], n) : o }, _ = /^-ms-/, z = /-([a-z])/g; function U(e, t) { return t.toUpperCase() } function X(e) { return e.replace(_, "ms-").replace(z, U) } var V = function (e) { return 1 === e.nodeType || 9 === e.nodeType || !+e.n
vendor: 23,316 bytes, line 3
3odeType }; function G() { this.expando = E.expando + G.uid++ } G.uid = 1, G.prototype = { cache: function (e) { var t = e[this.expando]; return t || (t = {}, V(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), t }, set: function (e, t, n) { var r, i = this.cache(e); if ("string" == typeof t) i[X(t)] = n; else for (r in t) i[X(r)] = t[r]; return i }, get: function (e, t) { return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][X(t)] }, access: function (e, t, n) { return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) }, remove: function (e, t) { var n, r = e[this.expando]; if (void 0 !== r) { if (void 0 !== t) { n = (t = Array.isArray(t) ? t.map(X) : (t = X(t)) in r ? [t] : t.match(P) || []).length; while (n--) delete r[t[n]] } (void 0 === t || E.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) } }, hasData: function (e) { var t = e[this.expando]; return void 0 !== t && !E.isEmptyObject(t) } }; var Y = new G, Q = new G, J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, K = /[A-Z]/g; function Z(e, t, n) { var r, i; if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(K, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { try { n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : J.test(i) ? JSON.parse(i) : i) } catch (e) { } Q.set(e, t, n) } else n = void 0; return n } E.extend({ hasData: function (e) { return Q.hasData(e) || Y.hasData(e) }, data: function (e, t, n) { return Q.access(e, t, n) }, removeData: function (e, t) { Q.remove(e, t) }, _data: function (e, t, n) { return Y.access(e, t, n) }, _removeData: function (e, t) { Y.remove(e, t) } }), E.fn.extend({ data: function (n, e) { var t, r, i, o = this[0], a = o && o.attributes; if (void 0 === n) { if (this.length && (i = Q.get(o), 1 === o.nodeType && !Y.get(o, "hasDataAttrs"))) { t = a.length; while (t--) a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = X(r.slice(5)), Z(o, r, i[r])); Y.set(o, "hasDataAttrs", !0) } return i } return "object" == typeof n ? this.each(function () { Q.set(this, n) }) : B(this, function (e) { var t; if (o && void 0 === e) return void 0 !== (t = Q.get(o, n)) ? t : void 0 !== (t = Z(o, n)) ? t : void 0; this.each(function () { Q.set(this, n, e) }) }, null, e, 1 < arguments.length, null, !0) }, removeData: function (e) { return this.each(function () { Q.remove(this, e) }) } }), E.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = Y.get(e, t), n && (!r || Array.isArray(n) ? r = Y.access(e, t, E.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = E.queue(e, t), r = n.length, i = n.shift(), o = E._queueHooks(e, t); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function () { E.dequeue(e, t) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return Y.get(e, n) || Y.access(e, n, { empty: E.Callbacks("once memory").add(function () { Y.remove(e, [t + "queue", n]) }) }) } }), E.fn.extend({ queue: function (t, n) { var e = 2; return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? E.queue(this[0], t) : void 0 === n ? this : this.each(function () { var e = E.queue(this, t, n); E._queueHooks(this, t), "fx" === t && "inprogress" !== e[0] && E.dequeue(this, t) }) }, dequeue: function (e) { return this.each(function () { E.dequeue(this, e) }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, t) { var n, r = 1, i = E.Deferred(), o = this, a = this.length, s = function () { --r || i.resolveWith(o, [o]) }; "string" != typeof e && (t = e, e = void 0), e = e || "fx"; while (a--) (n = Y.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); return s(), i.promise(t) } }); var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), ne = ["Top", "Right", "Bottom", "Left"], re = S.documentElement, ie = function (e) { return E.contains(e.ownerDocument, e) }, oe = { composed: !0 }; re.getRootNode && (ie = function (e) { return E.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument }); var ae = function (e, t) { return "none" === (e = t || e).style.display || "" === e.style.display && ie(e) && "none" === E.css(e, "display") }; function se(e, t, n, r) { var i, o, a = 20, s = r ? function () { return r.cur() } : function () { return E.css(e, t, "") }, u = s(), l = n && n[3] || (E.cssNumber[t] ? "" : "px"), c = e.nodeType && (E.cssNumber[t] || "px" !== l && +u) && te.exec(E.css(e, t)); if (c && c[3] !== l) { u /= 2, l = l || c[3], c = +u || 1; while (a--) E.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; c *= 2, E.style(e, t, c + l), n = n || [] } return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i } var ue = {}; function le(e, t) { for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++)(r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = Y.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ae(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ue[s]) || (o = a.body.appendChild(a.createElement(s)), u = E.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ue[s] = u)))) : "none" !== n && (l[c] = "none", Y.set(r, "display", n))); for (c = 0; c < f; c++)null != l[c] && (e[c].style.display = l[c]); return e } E.fn.extend({ show: function () { return le(this, !0) }, hide: function () { return le(this) }, toggle: function (e) { return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { ae(this) ? E(this).show() : E(this).hide() }) } }); var ce, fe, pe = /^(?:checkbox|radio)$/i, de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, he = /^$|^module$|\/(?:java|ecma)script/i; ce = S.createDocumentFragment().appendChild(S.createElement("div")), (fe = S.createElement("input")).setAttribute("type", "radio"), fe.setAttribute("checked", "checked"), fe.setAttribute("name", "t"), ce.appendChild(fe), v.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked, ce.innerHTML = "<textarea>x</textarea>", v.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue, ce.innerHTML = "<option></option>", v.option = !!ce.lastChild; var ge = { thead: [1, "<table>", "</table>"], col: [2, "<table><colgroup>", "</colgroup></table>"], tr: [2, "<table><tbody>", "</tbody></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _default: [0, "", ""] }; function ye(e, t) { var n; return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && A(e, t) ? E.merge([e], n) : n } function ve(e, t) { for (var n = 0, r = e.length; n < r; n++)Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")) } ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td, v.option || (ge.optgroup = ge.option = [1, "<select multiple='multiple'>", "</select>"]); var me = /<|&#?\w+;/; function xe(e, t, n, r, i) { for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++)if ((o = e[d]) || 0 === o) if ("object" === w(o)) E.merge(p, o.nodeType ? [o] : o); else if (me.test(o)) { a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + E.htmlPrefilter(o) + u[2], c = u[0]; while (c--) a = a.lastChild; E.merge(p, a.childNodes), (a = f.firstChild).textContent = "" } else p.push(t.createTextNode(o)); f.textContent = "", d = 0; while (o = p[d++]) if (r && -1 < E.inArray(o, r)) i && i.push(o); else if (l = ie(o), a = ye(f.appendChild(o), "script"), l && ve(a), n) { c = 0; while (o = a[c++]) he.test(o.type || "") && n.push(o) } return f } var be = /^([^.]*)(?:\.(.+)|)/; function we() { return !0 } function Te() { return !1 } function Ce(e, t) { return e === function () { try { return S.activeElement } catch (e) { } }() == ("focus" === t) } function Se(e, t, n, r, i, o) { var a, s; if ("object" == typeof t) { for (s in "string" != typeof n && (r = r || n, n = void 0), t) Se(e, s, n, r, t[s], o); return e } if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = Te; else if (!i) return e; return 1 === o && (a = i, (i = function (e) { return E().off(e), a.apply(this, arguments) }).guid = a.guid || (a.guid = E.guid++)), e.each(function () { E.event.add(this, t, i, r, n) }) } function Ee(e, i, o) { o ? (Y.set(e, i, !1), E.event.add(e, i, { namespace: !1, handler: function (e) { var t, n, r = Y.get(this, i); if (1 & e.isTrigger && this[i]) { if (r.length) (E.event.special[i] || {}).delegateType && e.stopPropagation(); else if (r = s.call(arguments), Y.set(this, i, r), t = o(this, i), this[i](), r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : n = {}, r !== n) return e.stopImmediatePropagation(), e.preventDefault(), n && n.value } else r.length && (Y.set(this, i, { value: E.event.trigger(E.extend(r[0], E.Event.prototype), r.slice(1), this) }), e.stopImmediatePropagation()) } })) : void 0 === Y.get(e, i) && E.event.add(e, i, we) } E.event = { global: {}, add: function (t, e, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.get(t); if (V(t)) { n.handler && (n = (o = n).handler, i = o.selector), i && E.find.matchesSelector(re, i), n.guid || (n.guid = E.guid++), (u = y.events) || (u = y.events = Object.create(null)), (a = y.handle) || (a = y.handle = function (e) { return "undefined" != typeof E && E.event.triggered !== e.type ? E.event.dispatch.apply(t, arguments) : void 0 }), l = (e = (e || "").match(P) || [""]).length; while (l--) d = g = (s = be.exec(e[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = E.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = E.event.special[d] || {}, c = E.extend({ type: d, origType: g, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && E.expr.match.needsContext.test(i), namespace: h.join(".") }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), E.event.global[d] = !0) } }, remove: function (e, t, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.hasData(e) && Y.get(e); if (y && (u = y.events)) { l = (t = (t || "").match(P) || [""]).length; while (l--) if (d = g = (s = be.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) { f = E.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, y.handle) || E.removeEvent(e, d, y.handle), delete u[d]) } else for (d in u) E.event.remove(e, d + t[l], n, r, !0); E.isEmptyObject(u) && Y.remove(e, "handle events") } }, dispatch: function (e) { var t, n, r, i, o, a, s = new Array(arguments.length), u = E.event.fix(e), l = (Y.get(this, "events") || Object.create(null))[u.type] || [], c = E.event.special[u.type] || {}; for (s[0] = u, t = 1; t < arguments.length; t++)s[t] = arguments[t]; if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { a = E.event.handlers.call(this, u, l), t = 0; while ((i = a[t++]) && !u.isPropagationStopped()) { u.currentTarget = i.elem, n = 0; while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((E.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation())) } return c.postDispatch && c.postDispatch.call(this, u), u.result } }, handlers: function (e, t) { var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) for (; l !== this; l = l.parentNode || this)if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { for (o = [], a = {}, n = 0; n < u; n++)void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < E(i, this).index(l) : E.find(i, this, null, [l]).length), a[i] && o.push(r); o.length && s.push({ elem: l, handlers: o }) } return l = this, u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s }, addProp: function (t, e) { Object.defineProperty(E.Event.prototype, t, { enumerable: !0, configurable: !0, get: m(e) ? function () { if (this.originalEvent) return e(this.originalEvent) } : function () { if (this.originalEvent) return this.originalEvent[t] }, set: function (e) { Object.defineProperty(this, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) } }) }, fix: function (e) { return e[E.expando] ? e : new E.Event(e) }, special: { load: { noBubble: !0 }, click: { setup: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Ee(t, "click", we), !1 }, trigger: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Ee(t, "click"), !0 }, _default: function (e) { var t = e.target; return pe.test(t.type) && t.click && A(t, "input") && Y.get(t, "click") || A(t, "a") } }, beforeunload: { postDispatch: function (e) { void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) } } } }, E.removeEvent = function (e, t, n) { e.removeEventListener && e.removeEventListener(t, n) }, E.Event = function (e, t) { if (!(this instanceof E.Event)) return new E.Event(e, t); e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? we : Te, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && E.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[E.expando] = !0 }, E.Event.prototype = { constructor: E.Event, isDefaultPrevented: Te, isPropagationStopped: Te, isImmediatePropagationStopped: Te, isSimulated: !1, preventDefault: function () { var e = this.originalEvent; this.isDefaultPrevented = we, e && !this.isSimulated && e.preventDefault() }, stopPropagation: function () { var e = this.originalEvent; this.isPropagationStopped = we, e && !this.isSimulated && e.stopPropagation() }, stopImmediatePropagation: function () { var e = this.originalEvent; this.isImmediatePropagationStopped = we, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() } }, E.each({ altKey: !0, bubbles: !0, cancelable: !0, changedTouches: !0, ctrlKey: !0, detail: !0, eventPhase: !0, metaKey: !0, pageX: !0, pageY: !0, shiftKey: !0, view: !0, "char": !0, code: !0, charCode: !0, key: !0, keyCode: !0, button: !0, buttons: !0, clientX: !0, clientY: !0, offsetX: !0, offsetY: !0, pointerId: !0, pointerType: !0, screenX: !0, screenY: !0, targetTouches: !0, toElement: !0, touches: !0, which: !0 }, E.event.addProp), E.each({ focus: "focusin", blur: "focusout" }, function (t, e) { E.event.special[t] = { setup: function () { return Ee(this, t, Ce), !1 }, trigger: function () { return Ee(this, t), !0 }, _default: function (e) { return Y.get(e.target, t) }, delegateType: e } }), E.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (e, i) { E.event.special[e] = { delegateType: i, bindType: i, handle: function (e) { var t, n = e.relatedTarget, r = e.handleObj; return n && (n === this || E.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t } } }), E.fn.extend({ on: function (e, t, n, r) { return Se(this, e, t, n, r) }, one: function (e, t, n, r) { return Se(this, e, t, n, r, 1) }, off: function (e, t, n) { var r, i; if (e && e.preventDefault && e.handleObj) return r = e.handleObj, E(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" == typeof e) { for (i in e) this.off(i, t, e[i]); return this } return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = Te), this.each(function () { E.event.remove(this, e, n, t) }) } }); var ke = /<script|<style|<link/i, Ae = /checked\s*(?:[^=]|=\s*.checked.)/i, Ne = /^\s*<!\[CDATA\[|\]\]>\s*$/g; function je(e, t) { return A(e, "table") && A(11 !== t.nodeType ? t : t.firstChild, "tr") && E(e).children("tbody")[0] || e } function De(e) { return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e } function qe(e) { return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e } function Le(e, t) { var n, r, i, o, a, s; if (1 === t.nodeType) { if (Y.hasData(e) && (s = Y.get(e).events)) for (i in Y.remove(t, "handle events"), s) for (n = 0, r = s[i].length; n < r; n++)E.event.add(t, i, s[i][n]); Q.hasData(e) && (o = Q.access(e), a = E.extend({}, o), Q.set(t, a)) } } function He(n, r, i, o) { r = g(r); var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = m(d); if (h || 1 < f && "string" == typeof d && !v.checkClone && Ae.test(d)) return n.each(function (e) { var t = n.eq(e); h && (r[0] = d.call(this, e, t.html())), He(t, r, i, o) }); if (f && (t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === e.childNodes.length && (e = t), t || o)) { for (s = (a = E.map(ye(e, "script"), De)).length; c < f; c++)u = e, c !== p && (u = E.clone(u, !0, !0), s && E.merge(a, ye(u, "script"))), i.call(n[c], u, c); if (s) for (l = a[a.length - 1].ownerDocument, E.map(a, qe), c = 0; c < s; c++)u = a[c], he.test(u.type || "") && !Y.access(u, "globalEval") && E.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? E._evalUrl && !u.noModule && E._evalUrl(u.src, { nonce: u.nonce || u.getAttribute("nonce") }, l) : b(u.textContent.replace(Ne, ""), u, l)) } return n } function Oe(e, t, n) { for (var r, i = t ? E.filter(t, e) : e, o = 0; null != (r = i[o]); o++)n || 1 !== r.nodeType || E.cleanData(ye(r)), r.parentNode && (n && ie(r) && ve(ye(r, "script")), r.parentNode.removeChild(r)); return e } E.extend({ htmlPrefilter: function (e) { return e }, clone: function (e, t, n) { var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = ie(e); if (!(v.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || E.isXMLDoc(e))) for (a = ye(c), r = 0, i = (o = ye(e)).length; r < i; r++)s = o[r], u = a[r], void 0, "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); if (t) if (n) for (o = o || ye(e), a = a || ye(c), r = 0, i = o.length; r < i; r++)Le(o[r], a[r]); else Le(e, c); return 0 < (a = ye(c, "script")).length && ve(a, !f && ye(e, "script")), c }, cleanData: function (e) { for (var t, n, r, i = E.event.special, o = 0; void 0 !== (n = e[o]); o++)if (V(n)) { if (t = n[Y.expando]) { if (t.events) for (r in t.events) i[r] ? E.event.remove(n, r) : E.removeEvent(n, r, t.handle); n[Y.expando] = void 0 } n[Q.expando] && (n[Q.expando] = void 0) } } }), E.fn.extend({ detach: function (e) { return Oe(this, e, !0) }, remove: function (e) { return Oe(this, e) }, text: function (e) { return B(this, function (e) { return void 0 === e ? E.text(this) : this.empty().each(function () { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) }) }, null, e, arguments.length) }, append: function () { return He(this, arguments, function (e) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || je(this, e).appendChild(e) }) }, prepend: function () { return He(this, arguments, function (e) { if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { var t = je(this, e); t.insertBefore(e, t.firstChild) } }) }, before: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this) }) }, after: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) }) }, empty: function () { for (var e, t = 0; null != (e = this[t]); t++)1 === e.nodeType && (E.cleanData(ye(e, !1)), e.textContent = ""); return this }, clone: function (e, t) { return e = null != e && e, t = null == t ? e : t, this.map(function () { return E.clone(this, e, t) }) }, html: function (e) { return B(this, function (e) { var t = this[0] || {}, n = 0, r = this.length; if (void 0 === e && 1 === t.nodeType) return t.innerHTML; if ("string" == typeof e && !ke.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { e = E.htmlPrefilter(e); try { for (; n < r; n++)1 === (t = this[n] || {}).nodeType && (E.cleanData(ye(t, !1)), t.innerHTML = e); t = 0 } catch (e) { } } t && this.empty().append(e) }, null, e, arguments.length) }, replaceWith: function () { var n = []; return He(this, arguments, function (e) { var t = this.parentNode; E.inArray(this, n) < 0 && (E.cleanData(ye(this)), t && t.replaceChild(e, this)) }, n) } }), E.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (e, a) { E.fn[e] = function (e) { for (var t, n = [], r = E(e), i = r.length - 1, o = 0; o <= i; o++)t = o === i ? this : this.clone(!0), E(r[o])[a](t), u.apply(n, t.get()); return this.pushStack(n) } }); var Pe = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), Re = /^--/, Me = function (e) { var t = e.ownerDocument.defaultView; return t && t.opener || (t = C), t.getComputedStyle(e) }, Ie = function (e, t, n) { var r, i, o = {}; for (i in t) o[i] = e.style[i], e.style[i] = t[i]; for (i in r = n.call(e), t) e.style[i] = o[i]; return r }, We = new RegExp(ne.join("|"), "i"), Fe = "[\\x20\\t\\r\\n\\f]", $e = new RegExp("^" + Fe + "+|((?:^|[^\\\\])(?:\\\\.)*)" + Fe + "+$", "g"); function Be(e, t, n) { var r, i, o, a, s = Re.test(t), u = e.style; return (n = n || Me(e)) && (a = n.getPropertyValue(t) || n[t], s && a && (a = a.replace($e, "$1") || void 0), "" !== a || ie(e) || (a = E.style(e, t)), !v.pixelBoxStyles() && Pe.test(a) && We.test(t) && (r = u.width, i = u.minWidth, o = u.maxWidth, u.minWidth = u.maxWidth = u.width = a, a = n.width, u.width = r, u.minWidth = i, u.maxWidth = o)), void 0 !== a ? a + "" : a } function _e(e, t) { return { get: function () { if (!e()) return (this.get = t).apply(this, arguments); delete this.get } } } !function () { function e() { if (l) { u.style.cssText = "position:absolute;
3left:-11111px;width:60px;margin-top:1px;padding:0;border:0", l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", re.appendChild(u).appendChild(l); var e = C.getComputedStyle(l); n = "1%" !== e.top, s = 12 === t(e.marginLeft), l.style.right = "60%", o = 36 === t(e.right), r = 36 === t(e.width), l.style.position = "absolute", i = 12 === t(l.offsetWidth / 3), re.removeChild(u), l = null } } function t(e) { return Math.round(parseFloat(e)) } var n, r, i, o, a, s, u = S.createElement("div"), l = S.createElement("div"); l.style && (l.style.backgroundClip = "content-box", l.cloneNode(!0).style.backgroundClip = "", v.clearCloneStyle = "content-box" === l.style.backgroundClip, E.extend(v, { boxSizingReliable: function () { return e(), r }, pixelBoxStyles: function () { return e(), o }, pixelPosition: function () { return e(), n }, reliableMarginLeft: function () { return e(), s }, scrollboxSize: function () { return e(), i }, reliableTrDimensions: function () { var e, t, n, r; return null == a && (e = S.createElement("table"), t = S.createElement("tr"), n = S.createElement("div"), e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", t.style.cssText = "border:1px solid", t.style.height = "1px", n.style.height = "9px", n.style.display = "block", re.appendChild(e).appendChild(t).appendChild(n), r = C.getComputedStyle(t), a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, re.removeChild(e)), a } })) }(); var ze = ["Webkit", "Moz", "ms"], Ue = S.createElement("div").style, Xe = {}; function Ve(e) { var t = E.cssProps[e] || Xe[e]; return t || (e in Ue ? e : Xe[e] = function (e) { var t = e[0].toUpperCase() + e.slice(1), n = ze.length; while (n--) if ((e = ze[n] + t) in Ue) return e }(e) || e) } var Ge = /^(none|table(?!-c[ea]).+)/, Ye = { position: "absolute", visibility: "hidden", display: "block" }, Qe = { letterSpacing: "0", fontWeight: "400" }; function Je(e, t, n) { var r = te.exec(t); return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t } function Ke(e, t, n, r, i, o) { var a = "width" === t ? 1 : 0, s = 0, u = 0; if (n === (r ? "border" : "content")) return 0; for (; a < 4; a += 2)"margin" === n && (u += E.css(e, n + ne[a], !0, i)), r ? ("content" === n && (u -= E.css(e, "padding" + ne[a], !0, i)), "margin" !== n && (u -= E.css(e, "border" + ne[a] + "Width", !0, i))) : (u += E.css(e, "padding" + ne[a], !0, i), "padding" !== n ? u += E.css(e, "border" + ne[a] + "Width", !0, i) : s += E.css(e, "border" + ne[a] + "Width", !0, i)); return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), u } function Ze(e, t, n) { var r = Me(e), i = (!v.boxSizingReliable() || n) && "border-box" === E.css(e, "boxSizing", !1, r), o = i, a = Be(e, t, r), s = "offset" + t[0].toUpperCase() + t.slice(1); if (Pe.test(a)) { if (!n) return a; a = "auto" } return (!v.boxSizingReliable() && i || !v.reliableTrDimensions() && A(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === E.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === E.css(e, "boxSizing", !1, r), (o = s in e) && (a = e[s])), (a = parseFloat(a) || 0) + Ke(e, t, n || (i ? "border" : "content"), o, r, a) + "px" } function et(e, t, n, r, i) { return new et.prototype.init(e, t, n, r, i) } E.extend({ cssHooks: { opacity: { get: function (e, t) { if (t) { var n = Be(e, "opacity"); return "" === n ? "1" : n } } } }, cssNumber: { animationIterationCount: !0, columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, gridArea: !0, gridColumn: !0, gridColumnEnd: !0, gridColumnStart: !0, gridRow: !0, gridRowEnd: !0, gridRowStart: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: {}, style: function (e, t, n, r) { if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { var i, o, a, s = X(t), u = Re.test(t), l = e.style; if (u || (t = Ve(s)), a = E.cssHooks[t] || E.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; "string" === (o = typeof n) && (i = te.exec(n)) && i[1] && (n = se(e, t, i), o = "number"), null != n && n == n && ("number" !== o || u || (n += i && i[3] || (E.cssNumber[s] ? "" : "px")), v.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) } }, css: function (e, t, n, r) { var i, o, a, s = X(t); return Re.test(t) || (t = Ve(s)), (a = E.cssHooks[t] || E.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = Be(e, t, r)), "n
3ormal" === i && t in Qe && (i = Qe[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i } }), E.each(["height", "width"], function (e, u) { E.cssHooks[u] = { get: function (e, t, n) { if (t) return !Ge.test(E.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? Ze(e, u, n) : Ie(e, Ye, function () { return Ze(e, u, n) }) }, set: function (e, t, n) { var r, i = Me(e), o = !v.scrollboxSize() && "absolute" === i.position, a = (o || n) && "border-box" === E.css(e, "boxSizing", !1, i), s = n ? Ke(e, u, n, a, i) : 0; return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - Ke(e, u, "border", !1, i) - .5)), s && (r = te.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, t = E.css(e, u)), Je(0, t, s) } } }), E.cssHooks.marginLeft = _e(v.reliableMarginLeft, function (e, t) { if (t) return (parseFloat(Be(e, "marginLeft")) || e.getBoundingClientRect().left - Ie(e, { marginLeft: 0 }, function () { return e.getBoundingClientRect().left })) + "px" }), E.each({ margin: "", padding: "", border: "Width" }, function (i, o) { E.cssHooks[i + o] = { expand: function (e) { for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++)n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; return n } }, "margin" !== i && (E.cssHooks[i + o].set = Je) }), E.fn.extend({ css: function (e, t) { return B(this, function (e, t, n) { var r, i, o = {}, a = 0; if (Array.isArray(t)) { for (r = Me(e), i = t.length; a < i; a++)o[t[a]] = E.css(e, t[a], !1, r); return o } return void 0 !== n ? E.style(e, t, n) : E.css(e, t) }, e, t, 1 < arguments.length) } }), ((E.Tween = et).prototype = { constructor: et, init: function (e, t, n, r, i, o) { this.elem = e, this.prop = n, this.easing = i || E.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (E.cssNumber[n] ? "" : "px") }, cur: function () { var e = et.propHooks[this.prop]; return e && e.get ? e.get(this) : et.propHooks._default.get(this) }, run: function (e) { var t, n = et.propHooks[this.prop]; return this.options.duration ? this.pos = t = E.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : et.propHooks._default.set(this), this } }).init.prototype = et.prototype, (et.propHooks = { _default: { get: function (e) { var t; return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = E.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 }, set: function (e) { E.fx.step[e.prop] ? E.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !E.cssHooks[e.prop] && null == e.elem.style[Ve(e.prop)] ? e.elem[e.prop] = e.now : E.style(e.elem, e.prop, e.now + e.unit) } } }).scrollTop = et.propHooks.scrollLeft = { set: function (e) { e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) } }, E.easing = { linear: function (e) { return e }, swing: function (e) { return .5 - Math.cos(e * Math.PI) / 2 }, _default: "swing" }, E.fx = et.prototype.init, E.fx.step = {}; var tt, nt, rt, it, ot = /^(?:toggle|show|hide)$/, at = /queueHooks$/; function st() { nt && (!1 === S.hidden && C.requestAnimationFrame ? C.requestAnimationFrame(st) : C.setTimeout(st, E.fx.interval), E.fx.tick()) } function ut() { return C.setTimeout(function () { tt = void 0 }), tt = Date.now() } function lt(e, t) { var n, r = 0, i = { height: e }; for (t = t ? 1 : 0; r < 4; r += 2 - t)i["margin" + (n = ne[r])] = i["padding" + n] = e; return t && (i.opacity = i.width = e), i } function ct(e, t, n) { for (var r, i = (ft.tweeners[t] || []).concat(ft.tweeners["*"]), o = 0, a = i.length; o < a; o++)if (r = i[o].call(n, t, e)) return r } function ft(o, e, t) { var n, a, r = 0, i = ft.prefilters.length, s = E.Deferred().always(function () { delete u.elem }), u = function () { if (a) return !1; for (var e = tt || ut(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++)l.tweens[r].run(n); return s.notifyWith(o, [l, n, t]), n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) }, l = s.promise({ elem: o, props: E.extend({}, e), opts: E.extend(!0, { specialEasing: {}, easing: E.easing._default }, t), originalProperties: e, originalOptions: t, startTime: tt || ut(), duration: t.duration, tweens: [], createTween: function (e, t) { var n = E.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); return l.tweens.push(n), n }, stop: function (e) { var t = 0, n = e ? l.tweens.length : 0; if (a) return this; for (a = !0; t < n; t++)l.tweens[t].run(1); return e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), this } }), c = l.props; for (!function (e, t) { var n, r, i, o, a; for (n in e) if (i = t[r = X(n)], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = E.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete e[r], o) n in e || (e[n] = o[n], t[n] = i); else t[r] = i }(c, l.opts.specialEasing); r < i;
vendor: 32,207 bytes, line 3
3 r++)if (n = ft.prefilters[r].call(l, o, c, l.opts)) return m(n.stop) && (E._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n; return E.map(c, ct, l), m(l.opts.start) && l.opts.start.call(o, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), E.fx.timer(E.extend(u, { elem: o, anim: l, queue: l.opts.queue })), l } E.Animation = E.extend(ft, { tweeners: { "*": [function (e, t) { var n = this.createTween(e, t); return se(n.elem, e, te.exec(t), n), n }] }, tweener: function (e, t) { m(e) ? (t = e, e = ["*"]) : e = e.match(P); for (var n, r = 0, i = e.length; r < i; r++)n = e[r], ft.tweeners[n] = ft.tweeners[n] || [], ft.tweeners[n].unshift(t) }, prefilters: [function (e, t, n) { var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, p = this, d = {}, h = e.style, g = e.nodeType && ae(e), y = Y.get(e, "fxshow"); for (r in n.queue || (null == (a = E._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { a.unqueued || s() }), a.unqueued++, p.always(function () { p.always(function () { a.unqueued--, E.queue(e, "fx").length || a.empty.fire() }) })), t) if (i = t[r], ot.test(i)) { if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { if ("show" !== i || !y || void 0 === y[r]) continue; g = !0 } d[r] = y && y[r] || E.style(e, r) } if ((u = !E.isEmptyObject(t)) || !E.isEmptyObject(d)) for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = y && y.display) && (l = Y.get(e, "display")), "none" === (c = E.css(e, "display")) && (l ? c = l : (le([e], !0), l = e.style.display || l, c = E.css(e, "display"), le([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === E.css(e, "float") && (u || (p.done(function () { h.display = l }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] })), u = !1, d) u || (y ? "hidden" in y && (g = y.hidden) : y = Y.access(e, "fxshow", { display: l }), o && (y.hidden = !g), g && le([e], !0), p.done(function () { for (r in g || le([e]), Y.remove(e, "fxshow"), d) E.style(e, r, d[r]) })), u = ct(g ? y[r] : 0, r, p), r in y || (y[r] = u.start, g && (u.end = u.start, u.start = 0)) }], prefilter: function (e, t) { t ? ft.prefilters.unshift(e) : ft.prefilters.push(e) } }), E.speed = function (e, t, n) { var r = e && "object" == typeof e ? E.extend({}, e) : { complete: n || !n && t || m(e) && e, duration: e, easing: n && t || t && !m(t) && t }; return E.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in E.fx.speeds ? r.duration = E.fx.speeds[r.duration] : r.duration = E.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { m(r.old) && r.old.call(this), r.queue && E.dequeue(this, r.queue) }, r }, E.fn.extend({ fadeTo: function (e, t, n, r) { return this.filter(ae).css("opacity", 0).show().end().animate({ opacity: t }, e, n, r) }, animate: function (t, e, n, r) { var i = E.isEmptyObject(t), o = E.speed(e, n, r), a = function () { var e = ft(this, E.extend({}, t), o); (i || Y.get(this, "finish")) && e.stop(!0) }; return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) }, stop: function (i, e, o) { var a = function (e) { var t = e.stop; delete e.stop, t(o) }; return "string" != typeof i && (o = e, e = i, i = void 0), e && this.queue(i || "fx", []), this.each(function () { var e = !0, t = null != i && i + "queueHooks", n = E.timers, r = Y.get(this); if (t) r[t] && r[t].stop && a(r[t]); else for (t in r) r[t] && r[t].stop && at.test(t) && a(r[t]); for (t = n.length; t--;)n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), e = !1, n.splice(t, 1)); !e && o || E.dequeue(this, i) }) }, finish: function (a) { return !1 !== a && (a = a || "fx"), this.each(function () { var e, t = Y.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = E.timers, o = n ? n.length : 0; for (t.finish = !0, E.queue(this, a, []), r && r.stop && r.stop.call(this, !0), e = i.length; e--;)i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)); for (e = 0; e < o; e++)n[e] && n[e].finish && n[e].finish.call(this); delete t.finish }) } }), E.each(["toggle", "show", "hide"], function (e, r) { var i = E.fn[r]; E.fn[r] = function (e, t, n) { return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(lt(r, !0), e, t, n) } }), E.each({ slideDown: lt("show"), slideUp: lt("hide"), slideToggle: lt("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (e, r) { E.fn[e] = function (e, t, n) { return this.animate(r, e, t, n) } }), E.timers = [], E.fx.tick = function () { var e, t = 0, n = E.timers; for (tt = Date.now(); t < n.length; t++)(e = n[t])() || n[t] !== e || n.splice(t--, 1); n.length || E.fx.stop(), tt = void 0 }, E.fx.timer = function (e) { E.timers.push(e), E.fx.start() }, E.fx.interval = 13, E.fx.start = function () { nt || (nt = !0, st()) }, E.fx.stop = function () { nt = null }, E.fx.speeds = { slow: 600, fast: 200, _default: 400 }, E.fn.delay = function (r, e) { return r = E.fx && E.fx.speeds[r] || r, e = e || "fx", this.queue(e, function (e, t) { var n = C.setTimeout(e, r); t.stop = function () { C.clearTimeout(n) } }) }, rt = S.createElement("input"), it = S.createElement("select").appendChild(S.createElement("option")), rt.type = "checkbox", v.checkOn = "" !== rt.value, v.optSelected = it.selected, (rt = S.createElement("input")).value = "t", rt.type = "radio", v.radioValue = "t" === rt.value; var pt, dt = E.expr.attrHandle; E.fn.extend({ attr: function (e, t) { return B(this, E.attr, e, t, 1 < arguments.length) }, removeAttr: function (e) { return this.each(function () { E.removeAttr(this, e) }) } }), E.extend({ attr: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? E.prop(e, t, n) : (1 === o && E.isXMLDoc(e) || (i = E.attrHooks[t.toLowerCase()] || (E.expr.match.bool.test(t) ? pt : void 0)), void 0 !== n ? null === n ? void E.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = E.find.attr(e, t)) ? void 0 : r) }, attrHooks: { type: { set: function (e, t) { if (!v.radioValue && "radio" === t && A(e, "input")) { var n = e.value; return e.setAttribute("type", t), n && (e.value = n), t } } } }, removeAttr: function (e, t) { var n, r = 0, i = t && t.match(P); if (i && 1 === e.nodeType) while (n = i[r++]) e.removeAttribute(n) } }), pt = { set: function (e, t, n) { return !1 === t ? E.removeAttr(e, n) : e.setAttribute(n, n), n } }, E.each(E.expr.match.bool.source.match(/\w+/g), function (e, t) { var a = dt[t] || E.find.attr; dt[t] = function (e, t, n) { var r, i, o = t.toLowerCase(); return n || (i = dt[o], dt[o] = r, r = null != a(e, t, n) ? o : null, dt[o] = i), r } }); var ht = /^(?:input|select|textarea|button)$/i, gt = /^(?:a|area)$/i; function yt(e) { return (e.match(P) || []).join(" ") } function vt(e) { return e.getAttribute && e.getAttribute("class") || "" } function mt(e) { return Array.isArray(e) ? e : "string" == typeof e && e.match(P) || [] } E.fn.extend({ prop: function (e, t) { return B(this, E.prop, e, t, 1 < arguments.length) }, removeProp: function (e) { return this.each(function () { delete this[E.propFix[e] || e] }) } }), E.extend({ prop: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return 1 === o && E.isXMLDoc(e) || (t = E.propFix[t] || t, i = E.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] }, propHooks: { tabIndex: { get: function (e) { var t = E.find.attr(e, "tabindex"); return t ? parseInt(t, 10) : ht.test(e.nodeName) || gt.test(e.nodeName) && e.href ? 0 : -1 } } }, propFix: { "for": "htmlFor", "class": "className" } }), v.optSelected || (E.propHooks.selected = { get: function (e) { var t = e.parentNode; return t && t.parentNode && t.parentNode.selectedIndex, null }, set: function (e) { var t = e.parentNode; t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) } }), E.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { E.propFix[this.toLowerCase()] = this }), E.fn.extend({ addClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { E(this).addClass(t.call(this, e, vt(this))) }) : (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++)i = e[o], n.indexOf(" " + i + " ") < 0 && (n += i + " "); a = yt(n), r !== a && this.setAttribute("class", a) } }) : this }, removeClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { E(this).removeClass(t.call(this, e, vt(this))) }) : arguments.length ? (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++) { i = e[o]; while (-1 < n.indexOf(" " + i + " ")) n = n.replace(" " + i + " ", " ") } a = yt(n), r !== a && this.setAttribute("class", a) } }) : this : this.attr("class", "") }, toggleClass: function (t, n) { var e, r, i, o, a = typeof t, s = "string" === a || Array.isArray(t); return m(t) ? this.each(function (e) { E(this).toggleClass(t.call(this, e, vt(this), n), n) }) : "boolean" == typeof n && s ? n ? this.addClass(t) : this.removeClass(t) : (e = mt(t), this.each(function () { if (s) for (o = E(this), i = 0; i < e.length; i++)r = e[i], o.hasClass(r) ? o.removeClass(r) : o.addClass(r); else void 0 !== t && "boolean" !== a || ((r = vt(this)) && Y.set(this, "__className__", r), this.setAttribute && this.setAttribute("class", r || !1 === t ? "" : Y.get(this, "__className__") || "")) })) }, hasClass: function (e) { var t, n, r = 0; t = " " + e + " "; while (n = this[r++]) if (1 === n.nodeType && -1 < (" " + yt(vt(n)) + " ").indexOf(t)) return !0; return !1 } }); var xt = /\r/g; E.fn.extend({ val: function (n) { var r, e, i, t = this[0]; return arguments.length ? (i = m(n), this.each(function (e) { var t; 1 === this.nodeType && (null == (t = i ? n.call(this, e, E(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = E.map(t, function (e) { return null == e ? "" : e + "" })), (r = E.valHooks[this.type] || E.valHooks[this.nodeName.toLowerCase()]) && "set" in r && void 0 !== r.set(this, t, "value") || (this.value = t)) })) : t ? (r = E.valHooks[t.type] || E.valHooks[t.nodeName.toLowerCase()]) && "get" in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(xt, "") : null == e ? "" : e : void 0 } }), E.extend({ valHooks: { option: { get: function (e) { var t = E.find.attr(e, "value"); return null != t ? t : yt(E.text(e)) } }, select: { get: function (e) { var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], u = a ? o + 1 : i.length; for (r = o < 0 ? u : a ? o : 0; r < u; r++)if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !A(n.parentNode, "optgroup"))) { if (t = E(n).val(), a) return t; s.push(t) } return s }, set: function (e, t) { var n, r, i = e.options, o = E.makeArray(t), a = i.length; while (a--) ((r = i[a]).selected = -1 < E.inArray(E.valHooks.option.get(r), o)) && (n = !0); return n || (e.selectedIndex = -1), o } } } }), E.each(["radio", "checkbox"], function () { E.valHooks[this] = { set: function (e, t) { if (Array.isArray(t)) return e.checked = -1 < E.inArray(E(e).val(), t) } }, v.checkOn || (E.valHooks[this].get = function (e) { return null === e.getAttribute("value") ? "on" : e.value }) }), v.focusin = "onfocusin" in C; var bt = /^(?:focusinfocus|focusoutblur)$/, wt = function (e) { e.stopPropagation() }; E.extend(E.event, { trigger: function (e, t, n, r) { var i, o, a, s, u, l, c, f, p = [n || S], d = y.call(e, "type") ? e.type : e, h = y.call(e, "namespace") ? e.namespace.split(".") : []; if (o = f = a = n = n || S, 3 !== n.nodeType && 8 !== n.nodeType && !bt.test(d + E.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), h.sort()), u = d.indexOf(":") < 0 && "on" + d, (e = e[E.expando] ? e : new E.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3, e.namespace = h.join("."), e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = n), t = null == t ? [e] : E.makeArray(t, [e]), c = E.event.special[d] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, t))) { if (!r && !c.noBubble && !x(n)) { for (s = c.delegateType || d, bt.test(s + d) || (o = o.parentNode); o; o = o.parentNode)p.push(o), a = o; a === (n.ownerDocument || S) && p.push(a.defaultView || a.parentWindow || C) } i = 0; while ((o = p[i++]) && !e.isPropagationStopped()) f = o, e.type = 1 < i ? s : c.bindType || d, (l = (Y.get(o, "events") || Object.create(null))[e.type] && Y.get(o, "handle")) && l.apply(o, t), (l = u && o[u]) && l.apply && V(o) && (e.result = l.apply(o, t), !1 === e.result && e.preventDefault()); return e.type = d, r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !V(n) || u && m(n[d]) && !x(n) && ((a = n[u]) && (n[u] = null), E.event.triggered = d, e.isPropagationStopped() && f.addEventListener(d, wt), n[d](), e.isPropagationStopped() && f.removeEventListener(d, wt), E.event.triggered = void 0, a && (n[u] = a)), e.result } }, simulate: function (e, t, n) { var r = E.extend(new E.Event, n, { type: e, isSimulated: !0 }); E.event.trigger(r, null, t) } }), E.fn.extend({ trigger: function (e, t) { return this.each(function () { E.event.trigger(e, t, this) }) }, triggerHandler: function (e, t) { var n = this[0]; if (n) return E.event.trigger(e, t, n, !0) } }), v.focusin || E.each({ focus: "focusin", blur: "focusout" }, function (n, r) { var i = function (e) { E.event.simulate(r, e.target, E.event.fix(e)) }; E.event.special[r] = { setup: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r); t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1) }, teardown: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r) - 1; t ? Y.access(e, r, t) : (e.removeEventListener(n, i, !0), Y.remove(e, r)) } } }); var Tt = C.location, Ct = { guid: Date.now() }, St = /\?/; E.parseXML = function (e) { var t, n; if (!e || "string" != typeof e) return null; try { t = (new C.DOMParser).parseFromString(e, "text/xml") } catch (e) { } return n = t && t.getElementsByTagName("parsererror")[0], t && !n || E.error("Invalid XML: " + (n ? E.map(n.childNodes, function (e) { return e.textContent }).join("\n") : e)), t }; var Et = /\[\]$/, kt = /\r?\n/g, At = /^(?:submit|button|image|reset|file)$/i, Nt = /^(?:input|select|textarea|keygen)/i; function jt(n, e, r, i) { var t; if (Array.isArray(e)) E.each(e, function (e, t) { r || Et.test(n) ? i(n, t) : jt(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) }); else if (r || "object" !== w(e)) i(n, e); else for (t in e) jt(n + "[" + t + "]", e[t], r, i) } E.param = function (e, t) { var n, r = [], i = function (e, t) { var n = m(t) ? t() : t; r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) }; if (null == e) return ""; if (Array.isArray(e) || e.jquery && !E.isPlainObject(e)) E.each(e, function () { i(this.name, this.value) }); else for (n in e) jt(n, e[n], t, i); return r.join("&") }, E.fn.extend({ serialize: function () { return E.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var e = E.prop(this, "elements"); return e ? E.makeArray(e) : this }).filter(function () { var e = this.type; return this.name && !E(this).is(":disabled") && Nt.test(this.nodeName) && !At.test(e) && (this.checked || !pe.test(e)) }).map(function (e, t) { var n = E(this).val(); return null == n ? null : Array.isArray(n) ? E.map(n, function (e) { return { name: t.name, value: e.replace(kt, "\r\n") } }) : { name: t.name, value: n.replace(kt, "\r\n") } }).get() } }); var Dt = /%20/g, qt = /#.*$/, Lt = /([?&])_=[^&]*/, Ht = /^(.*?):[ \t]*([^\r\n]*)$/gm, Ot = /^(?:GET|HEAD)$/, Pt = /^\/\//, Rt = {}, Mt = {}, It = "*/".concat("*"), Wt = S.createElement("a"); function Ft(o) { return function (e, t) { "string" != typeof e && (t = e, e = "*"); var n, r = 0, i = e.toLowerCase().match(P) || []; if (m(t)) while (n = i[r++]) "+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) } } function $t(t, i, o, a) { var s = {}, u = t === Mt; function l(e) { var r; return s[e] = !0, E.each(t[e] || [], function (e, t) { var n = t(i, o, a); return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), l(n), !1) }), r } return l(i.dataTypes[0]) || !s["*"] && l("*") } function Bt(e, t) { var n, r, i = E.ajaxSettings.flatOptions || {}; for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); return r && E.extend(!0, e, r), e } Wt.href = Tt.href, E.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: Tt.href, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": It, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": JSON.parse, "text xml": E.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (e, t) { return t ? Bt(Bt(e, E.ajaxSettings), t) : Bt(E.ajaxSettings, e) }, ajaxPrefilter: Ft(Rt), ajaxTransport: Ft(Mt), ajax: function (e, t) { "object" == typeof e && (t = e, e = void 0), t = t || {}; var c, f, p, n, d, r, h, g, i, o, y = E.ajaxSetup({}, t), v = y.context || y, m = y.context && (v.nodeType || v.jquery) ? E(v) : E.event, x = E.Deferred(), b = E.Callbacks("once memory"), w = y.statusCode || {}, a = {}, s = {}, u = "canceled", T = { readyState: 0, getResponseHeader: function (e) { var t; if (h) { if (!n) { n = {}; while (t = Ht.exec(p)) n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) } t = n[e.toLowerCase() + " "] } return null == t ? null : t.join(", ") }, getAllResponseHeaders: function () { return h ? p : null }, setRequestHeader: function (e, t) { return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, a[e] = t), this }, overrideMimeType: function (e) { return null == h && (y.mimeType = e), this }, statusCode: function (e) { var t; if (e) if (h) T.always(e[T.status]); else for (t in e) w[t] = [w[t], e[t]]; return this }, abort: function (e) { var t = e || u; return c && c.abort(t), l(0, t), this } }; if (x.promise(T), y.url = ((e || y.url || Tt.href) + "").replace(Pt, Tt.protocol + "//"), y.type = t.method || t.type || y.method || y.type, y.dataTypes = (y.dataType || "*").toLowerCase().match(P) || [""], null == y.crossDomain) { r = S.createElement("a"); try { r.href = y.url, r.href = r.href, y.crossDomain = Wt.protocol + "//" + Wt.host != r.protocol + "//" + r.host } catch (e) { y.crossDomain = !0 } } if (y.data && y.processData && "string" != typeof y.data && (y.data = E.param(y.data, y.traditional)), $t(Rt, y, t, T), h) return T; for (i in (g = E.event && y.global) && 0 == E.active++ && E.event.trigger("ajaxStart"), y.type = y.type.toUpperCase(), y.hasContent = !Ot.test(y.type), f = y.url.replace(qt, ""), y.hasContent ? y.data && y.processData && 0 === (y.contentType || "").indexOf("application/x-www-form-urlencoded") && (y.data = y.data.replace(Dt, "+")) : (o = y.url.slice(f.length), y.data && (y.processData || "string" == typeof y.data) && (f += (St.test(f) ? "&" : "?") + y.data, delete y.data), !1 === y.cache && (f = f.replace(Lt, "$1"), o = (St.test(f) ? "&" : "?") + "_=" + Ct.guid++ + o), y.url = f + o), y.ifModified && (E.lastModified[f] && T.setRequestHeader("If-Modified-Since", E.lastModified[f]), E.etag[f] && T.setRequestHeader("If-None-Match", E.etag[f])), (y.data && y.hasContent && !1 !== y.contentType || t.contentType) && T.setRequestHeader("Content-Type", y.contentType), T.setRequestHeader("Accept", y.dataTypes[0] && y.accepts[y.dataTypes[0]] ? y.accepts[y.dataTypes[0]] + ("*" !== y.dataTypes[0] ? ", " + It + "; q=0.01" : "") : y.accepts["*"]), y.headers) T.setRequestHeader(i, y.headers[i]); if (y.beforeSend && (!1 === y.beforeSend.call(v, T, y) || h)) return T.abort(); if (u = "abort", b.add(y.complete), T.done(y.success), T.fail(y.error), c = $t(Mt, y, t, T)) { if (T.readyState = 1, g && m.trigger("ajaxSend", [T, y]), h) return T; y.async && 0 < y.timeout && (d = C.setTimeout(function () { T.abort("timeout") }, y.timeout)); try { h = !1, c.send(a, l) } catch (e) { if (h) throw e; l(-1, e) } } else l(-1, "No Transport"); function l(e, t, n, r) { var i, o, a, s, u, l = t; h || (h = !0, d && C.clearTimeout(d), c = void 0, p = r || "", T.readyState = 0 < e ? 4 : 0, i = 200 <= e && e < 300 || 304 === e, n && (s = function (e, t, n) { var r, i, o, a, s = e.contents, u = e.dataTypes; while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); if (r) for (i in s) if (s[i] && s[i].test(r)) { u.unshift(i); break } if (u[0] in n) o = u[0]; else { for (i in n) { if (!u[0] || e.converters[i + " " + u[0]]) { o = i; break } a || (a = i) } o = o || a } if (o) return o !== u[0] && u.unshift(o), n[o] }(y, T, n)), !i && -1 < E.inArray("script", y.dataTypes) && E.inArray("json", y.dataTypes) < 0 && (y.converters["text script"] = function () { }), s = function (e, t, n, r) { var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; o = c.shift(); while (o) if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { if (!(a = l[u + " " + o] || l["* " + o])) for (i in l) if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); break } if (!0 !== a) if (a && e["throws"]) t = a(t); else try { t = a(t) } catch (e) { return { state: "parsererror", error: a ? e : "No conversion from " + u + " to " + o } } } return { state: "success", data: t } }(y, s, T, i), i ? (y.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (E.lastModified[f] = u), (u = T.getResponseHeader("etag")) && (E.etag[f] = u)), 204 === e || "HEAD" === y.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, o = s.data, i = !(a = s.error))) : (a = l, !e && l || (l = "error", e < 0 && (e = 0))), T.status = e, T.statusText = (t || l) + "", i ? x.resolveWith(v, [o, l, T]) : x.rejectWith(v, [T, l, a]), T.statusCode(w), w = void 0, g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, y, i ? o : a]), b.fireWith(v, [T, l]), g && (m.trigger("ajaxComplete", [T, y]), --E.active || E.event.trigger("ajaxStop"))) } return T }, getJSON: function (e, t, n) { return E.get(e, t, n, "json") }, getScript: function (e, t) { return E.get(e, void 0, t, "script") } }), E.each(["get", "post"], function (e, i) { E[i] = function (e, t, n, r) { return m(t) && (r = r || n, n = t, t = void 0), E.ajax(E.extend({ url: e, type: i, dataType: r, data: t, success: n }, E.isPlainObject(e) && e)) } }), E.ajaxPrefilter(function (e) { var t; for (t in e.headers) "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") }), E._evalUrl = function (e, t, n) { return E.ajax({ url: e, type: "GET", dataType: "script", cache: !0, async: !1, global: !1, converters: { "text script": function () { } }, dataFilter: function (e) { E.globalEval(e, t, n) } }) }, E.fn.extend({ wrapAll: function (e) { var t; return this[0] && (m(e) && (e = e.call(this[0])), t = E(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { var e = this; while (e.firstElementChild) e = e.firstElementChild; return e }).append(this)), this }, wrapInner: function (n) { return m(n) ? this.each(function (e) { E(this).wrapInner(n.call(this, e)) }) : this.each(function () { var e = E(this), t = e.contents(); t.length ? t.wrapAll(n) : e.append(n) }) }, wrap: function (t) { var n = m(t); return this.each(function (e) { E(this).wrapAll(n ? t.call(this, e) : t) }) }, unwrap: function (e) { return this.parent(e).not("body").each(function () { E(this).replaceWith(this.childNodes) }), this } }), E.expr.pseudos.hidden = function (e) { return !E.expr.pseudos.visible(e) }, E.expr.pseudos.visible = function (e) { return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) }, E.ajaxSettings.xhr = function () { try { return new C.XMLHttpRequest } catch (e) { } }; var _t = { 0: 200, 1223: 204 }, zt = E.ajaxSettings.xhr(); v.cors = !!zt && "withCredentials" in zt, v.ajax = zt = !!zt, E.ajaxTransport(function (i) { var o, a; if (v.cors || zt && !i.crossDomain) return { send: function (e, t) { var n, r = i.xhr(); if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), e) r.setRequestHeader(n, e[n]); o = function (e) { return function () { o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(_t[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { binary: r.response } : { text: r.responseText }, r.getAllResponseHeaders())) } }, r.onload = o(), a = r.onerror = r.ontimeout = o("error"), void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function () { 4 === r.readyState && C.setTimeout(function () { o && a() }) }, o = o("abort"); try { r.send(i.hasContent && i.data || null) } catch (e) { if (o) throw e } }, abort: function () { o && o() } } }), E.ajaxPrefilter(function (e) { e.crossDomain && (e.contents.script = !1) }), E.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function (e) { return E.globalEval(e), e } } }), E.ajaxPrefilter("script", function (e) { void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") }), E.ajaxTransport("script", function (n) { var r, i; if (n.crossDomain || n.scriptAttrs) return { send: function (e, t) { r = E("<script>").attr(n.scriptAttrs || {}).prop({ charset: n.scriptCharset, src: n.url }).on("load error", i = function (e) { r.remove(), i = null, e && t("error" === e.type ? 404 : 200, e.type) }), S.head.appendChild(r[0]) }, abort: function () { i && i() } } }); var Ut, Xt = [], Vt = /(=)\?(?=&|$)|\?\?/; E.ajaxSetup({ jsonp: "callback", jsonpCallback: function () { var e = Xt.pop() || E.expando + "_" + Ct.guid++; return this[e] = !0, e } }), E.ajaxPrefilter("json jsonp", function (e, t, n) { var r, i, o, a = !1 !== e.jsonp && (Vt.test(e.url) ? "url" : "string" == typeof e.data && 0 === (e.contentType || "").indexOf("application/x-www-form-urlencoded") && Vt.test(e.data) && "data"); if (a || "jsonp" === e.dataTypes[0]) return r = e.jsonpCallback = m(e.jsonpCallback) ? e.jsonpCallback() : e.jsonpCallback, a ? e[a] = e[a].replace(Vt, "$1" + r) : !1 !== e.jsonp && (e.url += (St.test(e.url) ? "&" : "?") + e.jsonp + "=" + r), e.converters["script json"] = function () { return o || E.error(r + " was not called"), o[0] }, e.dataTypes[0] = "json", i = C[r], C[r] = function () { o = arguments }, n.always(function () { void 0 === i ? E(C).removeProp(r) : C[r] = i, e[r] && (e.jsonpCallback = t.jsonpCallback, Xt.push(r)), o && m(i) && i(o[0]), o = i = void 0 }), "script" }), v.createHTMLDocument = ((Ut = S.implementation.createHTMLDocument("").body).innerHTML = "<form></form><form></form>", 2 === Ut.childNodes.length), E.parseHTML = function (e, t, n) { return "string" != typeof e ? [] : ("boolean" == typeof t && (n = t, t = !1), t || (v.createHTMLDocument ? ((r = (t = S.implementation.createHTMLDocument("")).createElement("base")).href = S.location.href, t.head.appendChild(r)) : t = S), o = !n && [], (i = N.exec(e)) ? [t.createElement(i[1])] : (i = xe([e], t, o), o && o.length && E(o).remove(), E.merge([], i.childNodes))); var r, i, o }, E.fn.load = function (e, t, n) { var r, i, o, a = this, s = e.indexOf(" "); return -1 < s && (r = yt(e.slice(s)), e = e.slice(0, s)), m(t) ? (n = t, t = void 0) : t && "object" == typeof t && (i = "POST"), 0 < a.length && E.ajax({ url: e, type: i || "GET", dataType: "html", data: t }).done(function (e) { o = arguments, a.html(r ? E("<div>").append(E.parseHTML(e)).find(r) : e) }).always(n && function (e, t) { a.each(function () { n.apply(this, o || [e.responseText, t, e]) }) }), this }, E.expr.pseudos.animated = function (t) { return E.grep(E.timers, function (e) { return t === e.elem }).length }, E.offset = { setOffset: function (e, t, n) { var r, i, o, a, s, u, l = E.css(e, "position"), c = E(e), f = {}; "static" === l && (e.style.position = "relative"), s = c.offset(), o = E.css(e, "top"), u = E.css(e, "left"), ("absolute" === l || "fixed" === l) && -1 < (o + u).indexOf("auto") ? (a = (r = c.position()).top, i = r.left) : (a = parseFloat(o) || 0, i = parseFloat(u) || 0), m(t) && (t = t.call(e, n, E.extend({}, s))), null != t.top && (f.top = t.top - s.top + a), null != t.left && (f.left = t.left - s.left + i), "using" in t ? t.using.call(e, f) : c.css(f) } }, E.fn.extend({ offset: function (t) { if (arguments.length) return void 0 === t ? this : this.each(function (e) { E.offset.setOffset(this, t, e) }); var e, n, r = this[0]; return r ? r.getClientRects().length ? (e = r.getBoundingClientRect(), n = r.ownerDocument.defaultView, { top: e.top + n.pageYOffset, left: e.left + n.pageXOffset }) : { top: 0, left: 0 } : void 0 }, position: function () { if (this[0]) { var e, t, n, r = this[0], i = { top: 0, left: 0 }; if ("fixed" === E.css(r, "position")) t = r.getBoundingClientRect(); else { t = this.offset(), n = r.ownerDocument, e = r.offsetParent || n.documentElement; while (e && (e === n.body || e === n.documentElement) && "static" === E.css(e, "position")) e = e.parentNode; e && e !== r && 1 === e.nodeType && ((i = E(e).offset()).top += E.css(e, "borderTopWidth", !0), i.left += E.css(e, "borderLeftWidth", !0)) } return { top: t.top - i.top - E.css(r, "marginTop", !0), left: t.left - i.left - E.css(r, "marginLeft", !0) } } }, offsetParent: function () { return this.map(function () { var e = this.offsetParent; while (e && "static" === E.css(e, "position")) e = e.offsetParent; return e || re }) } }), E.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (t, i) { var o = "pageYOffset" === i; E.fn[t] = function (e) { return B(this, function (e, t, n) { var r; if (x(e) ? r = e : 9 === e.nodeType && (r = e.defaultView), void 0 === n) return r ? r[i] : e[t]; r ? r.scrollTo(o ? r.pageXOffset : n, o ? n : r.pageYOffset) : e[t] = n }, t, e, arguments.length) } }), E.each(["top", "left"], function (e, n) { E.cssHooks[n] = _e(v.pixelPosition, function (e, t) { if (t) return t = Be(e, n), Pe.test(t) ? E(e).position()[n] + "px" : t }) }), E.each({ Height: "height", Width: "width" }
3, function (a, s) { E.each({ padding: "inner" + a, content: s, "": "outer" + a }, function (r, o) { E.fn[o] = function (e, t) { var n = arguments.length && (r || "boolean" != typeof e), i = r || (!0 === e || !0 === t ? "margin" : "border"); return B(this, function (e, t, n) { var r; return x(e) ? 0 === o.indexOf("outer") ? e["inner" + a] : e.document.documentElement["client" + a] : 9 === e.nodeType ? (r = e.documentElement, Math.max(e.body["scroll" + a], r["scroll" + a], e.body["offset" + a], r["offset" + a], r["client" + a])) : void 0 === n ? E.css(e, t, i) : E.style(e, t, n, i) }, s, n ? e : void 0, n) } }) }), E.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) { E.fn[t] = function (e) { return this.on(t, e) } }), E.fn.extend({ bind: function (e, t, n) { return this.on(e, null, t, n) }, unbind: function (e, t) { return this.off(e, null, t) }, delegate: function (e, t, n, r) { return this.on(t, e, n, r) }, undelegate: function (e, t, n) { return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n) }, hover: function (e, t) { return this.mouseenter(e).mouseleave(t || e) } }), E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function (e, n) { E.fn[n] = function (e, t) { return 0 < arguments.length ? this.on(n, null, e, t) : this.trigger(n) } }); var Gt = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; E.proxy = function (e, t) { var n, r, i; if ("string" == typeof t && (n = e[t], t = e, e = n), m(e)) return r = s.call(arguments, 2), (i = function () { return e.apply(t || this, r.concat(s.call(arguments))) }).guid = e.guid = e.guid || E.guid++, i }, E.holdReady = function (e) { e ? E.readyWait++ : E.ready(!0) }, E.isArray = Array.isArray, E.parseJSON = JSON.parse, E.nodeName = A, E.isFunction = m, E.isWindow = x, E.camelCase = X, E.type = w, E.now = Date.now, E.isNumeric = function (e) { var t = E.type(e); return ("number" === t || "string" === t) && !isNaN(e - parseFloat(e)) }, E.trim = function (e) { return null == e ? "" : (e + "").replace(Gt, "$1") }, "function" == typeof define && define.amd && define("jquery", [], function () { return E }); var Yt = C.jQuery, Qt = C.$; return E.noConflict = function (e) { return C.$ === E && (C.$ = Qt), e && C.jQuery === E && (C.jQuery = Yt), E }, "undefined" == typeof e && (C.jQuery = C.$ = E), E }); 4 5/*! 6 * jQuery Migrate - v3.3.2 - 2020-11-17T23:22Z 7 * Copyright OpenJS Foundation and other contributors 8 */ 9(function (factory) { 10 "use strict"; 11 12 if (typeof define === "function" && define.amd) { 13 14 // AMD. Register as an anonymous module. 15 define(["jquery"], function (jQuery) { 16 return factory(jQuery, window); 17 }); 18 } else if (typeof module === "object" && module.exports) { 19 20 // Node/CommonJS 21 // eslint-disable-next-line no-undef 22 module.exports = factory(require("jquery"), window); 23 } else { 24 25 // Browser globals 26 factory(jQuery, window); 27 } 28})(function (jQuery, window) { 29 "use strict"; 30 31 jQuery.migrateVersion = "3.3.2"; 32 33 // Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2 34 function compareVersions(v1, v2) { 35 var i, 36 rVersionParts = /^(\d+)\.(\d+)\.(\d+)/, 37 v1p = rVersionParts.exec(v1) || [], 38 v2p = rVersionParts.exec(v2) || []; 39 40 for (i = 1; i <= 3; i++) { 41 if (+v1p[i] > +v2p[i]) { 42 return 1; 43 } 44 if (+v1p[i] < +v2p[i]) { 45 return -1; 46 } 47 } 48 return 0; 49 } 50 51 function jQueryVersionSince(version) { 52 return compareVersions(jQuery.fn.jquery, version) >= 0; 53 } 54 55 (function () { 56 57 // Support: IE9 only 58 // IE9 only creates console object when dev tools are first opened 59 // IE9 console is a host object, callable but doesn't have .apply() 60 if (!window.console || !window.console.log) { 61 return; 62 } 63 64 // Need jQuery 3.0.0+ and no older Migrate loaded 65 if (!jQuery || !jQueryVersionSince("3.0.0")) { 66 window.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED"); 67 } 68 if (jQuery.migrateWarnings) { 69 window.console.log("JQMIGRATE: Migrate plugin loaded multiple times"); 70 } 71 jQuery.migrateMute = window.location.host.indexOf('dev-') == -1 && window.location.host.indexOf('dev.') == -1; 72 if (!jQuery.migrateMute) { 73 74 // Show a message on the console so devs know we're active 75 window.console.log("JQMIGRATE: Migrate is installed" + 76 (jQuery.migrateMute ? "" : " with logging active on dev- domain ") + 77 ", version " + jQuery.migrateVersion); 78 } 79 80 })(); 81 82 var warnedAbout = {}; 83 84 // By default each warning is only reported once. 85 jQuery.migrateDeduplicateWarnings = true; 86 87 // List of warnings already given; public read only 88 jQuery.migrateWarnings = []; 89 90 // Set to false to disable traces that appear with warnings
91 if (jQuery.migrateTrace === undefined) { 92 jQuery.migrateTrace = true; 93 } 94 95 // Forget any warnings we've already given; public 96 jQuery.migrateReset = function () { 97 warnedAbout = {}; 98 jQuery.migrateWarnings.length = 0; 99 }; 100 101 function migrateWarn(msg) { 102 var console = window.console; 103 if (!jQuery.migrateDeduplicateWarnings || !warnedAbout[msg]) { 104 warnedAbout[msg] = true; 105 jQuery.migrateWarnings.push(msg); 106 if (console && console.warn && !jQuery.migrateMute) { 107 console.warn("JQMIGRATE: " + msg); 108 if (jQuery.migrateTrace && console.trace) { 109 console.trace(); 110 } 111 } 112 } 113 } 114 115 function migrateWarnProp(obj, prop, value, msg) { 116 Object.defineProperty(obj, prop, { 117 configurable: true, 118 enumerable: true, 119 get: function () { 120 migrateWarn(msg); 121 return value; 122 }, 123 set: function (newValue) { 124 migrateWarn(msg); 125 value = newValue; 126 } 127 }); 128 } 129 130 function migrateWarnFunc(obj, prop, newFunc, msg) { 131 obj[prop] = function () { 132 migrateWarn(msg); 133 return newFunc.apply(this, arguments); 134 }; 135 } 136 137 if (window.document.compatMode === "BackCompat") { 138 139 // JQuery has never supported or tested Quirks Mode 140 migrateWarn("jQuery is not compatible with Quirks Mode"); 141 } 142 143 var findProp, 144 class2type = {}, 145 oldInit = jQuery.fn.init, 146 oldFind = jQuery.find, 147 148 rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/, 149 rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g, 150 151 // Support: Android <=4.0 only 152 // Make sure we trim BOM and NBSP 153 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 154 155 jQuery.fn.init = function (arg1) { 156 var args = Array.prototype.slice.call(arguments); 157 158 if (typeof arg1 === "string" && arg1 === "#") { 159 160 // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0 161 migrateWarn("jQuery( '#' ) is not a valid selector"); 162 args[0] = []; 163 } 164 165 return oldInit.apply(this, args); 166 }; 167 jQuery.fn.init.prototype = jQuery.fn; 168 169 jQuery.find = function (selector) { 170 var args = Array.prototype.slice.call(arguments); 171 172 // Support: PhantomJS 1.x 173 // String#match fails to match when used with a //g RegExp, only on some strings 174 if (typeof selector === "string" && rattrHashTest.test(selector)) { 175 176 // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0 177 // First see if qS thinks it's a valid selector, if so avoid a false positive 178 try { 179 window.document.querySelector(selector); 180 } catch (err1) { 181 182 // Didn't *look* valid to qSA, warn and try quoting what we think is the value 183 selector = selector.replace(rattrHashGlob, function (_, attr, op, value) { 184 return "[" + attr + op + "\"" + value + "\"]"; 185 }); 186 187 // If the regexp *may* have created an invalid selector, don't update it 188 // Note that there may be false alarms if selector uses jQuery extensions 189 try { 190 window.document.querySelector(selector); 191 migrateWarn("Attribute selector with '#' must be quoted: " + args[0]); 192 args[0] = selector; 193 } catch (err2) { 194 migrateWarn("Attribute selector with '#' was not fixed: " + args[0]); 195 } 196 } 197 } 198 199 return oldFind.apply(this, args); 200 }; 201 202 // Copy properties attached to original jQuery.find method (e.g. .attr, .isXML) 203 for (findProp in oldFind) { 204 if (Object.prototype.hasOwnProperty.call(oldFind, findProp)) { 205 jQuery.find[findProp] = oldFind[findProp]; 206 } 207 } 208 209 // The number of elements contained in the matched element set 210 migrateWarnFunc(jQuery.fn, "size", function () { 211 return this.length; 212 }, 213 "jQuery.fn.size() is deprecated and removed; use the .length property"); 214 215 migrateWarnFunc(jQuery, "parseJSON", function () { 216 return JSON.parse.apply(null, arguments); 217 }, 218 "jQuery.parseJSON is deprecated; use JSON.parse"); 219 220 migrateWarnFunc(jQuery, "holdReady", jQuery.holdReady, 221 "jQuery.holdReady is deprecated"); 222 223 migrateWarnFunc(jQuery, "unique", jQuery.uniqueSort, 224 "jQuery.unique is deprecated; use jQuery.uniqueSort"); 225 226 // Now jQuery.expr.pseudos is the standard incantation 227 migrateWarnProp(jQuery.expr, "filters", jQuery.expr.pseudos, 228 "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos"); 229 migrateWarnProp(jQuery.expr, ":", jQuery.expr.pseudos, 230 "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos"); 231 232 // Prior to jQuery 3.1.1 there were internal refs so we don't warn there 233 if (jQueryVersionSince("3.1.1")) { 234 migrateWarnFunc(jQuery, "trim", function (text) { 235 return text == null ? 236 "" : 237 (text + "").replace(rtrim, ""); 238 }, 239 "jQuery.trim is deprecated; use String.prototype.trim"); 240 } 241 242 // Prior to jQuery 3.2 there were internal refs so we don't warn there 243 if (jQueryVersionSince("3.2.0")) { 244 migrateWarnFunc(jQuery, "nodeName", function (elem, name) { 245 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 246 }, 247 "jQuery.nodeName is deprecated"); 248 249 migrateWarnFunc(jQuery, "isArray", Array.isArray, 250 "jQuery.isArray is deprecated; use Array.isArray" 251 ); 252 } 253
254 if (jQueryVersionSince("3.3.0")) { 255 256 migrateWarnFunc(jQuery, "isNumeric", function (obj) { 257 258 // As of jQuery 3.0, isNumeric is limited to 259 // strings and numbers (primitives or objects) 260 // that can be coerced to finite numbers (gh-2662) 261 var type = typeof obj; 262 return (type === "number" || type === "string") && 263 264 // parseFloat NaNs numeric-cast false positives ("") 265 // ...but misinterprets leading-number strings, e.g. hex literals ("0x...") 266 // subtraction forces infinities to NaN 267 !isNaN(obj - parseFloat(obj)); 268 }, 269 "jQuery.isNumeric() is deprecated" 270 ); 271 272 // Populate the class2type map 273 jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol". 274 split(" "), 275 function (_, name) { 276 class2type["[object " + name + "]"] = name.toLowerCase(); 277 }); 278 279 migrateWarnFunc(jQuery, "type", function (obj) { 280 if (obj == null) { 281 return obj + ""; 282 } 283 284 // Support: Android <=2.3 only (functionish RegExp) 285 return typeof obj === "object" || typeof obj === "function" ? 286 class2type[Object.prototype.toString.call(obj)] || "object" : 287 typeof obj; 288 }, 289 "jQuery.type is deprecated"); 290 291 292 migrateWarnFunc(jQuery, "isWindow", 293 function (obj) { 294 return obj != null && obj === obj.window; 295 }, 296 "jQuery.isWindow() is deprecated" 297 ); 298 } 299 300 // Support jQuery slim which excludes the ajax module 301 if (jQuery.ajax) { 302 303 var oldAjax = jQuery.ajax, 304 rjsonp = /(=)\?(?=&|$)|\?\?/; 305 306 jQuery.ajax = function () { 307 var jQXHR = oldAjax.apply(this, arguments); 308 309 // Be sure we got a jQXHR (e.g., not sync) 310 if (jQXHR.promise) { 311 migrateWarnFunc(jQXHR, "success", jQXHR.done, 312 "jQXHR.success is deprecated and removed"); 313 migrateWarnFunc(jQXHR, "error", jQXHR.fail, 314 "jQXHR.error is deprecated and removed"); 315 migrateWarnFunc(jQXHR, "complete", jQXHR.always, 316 "jQXHR.complete is deprecated and removed"); 317 } 318 319 return jQXHR; 320 }; 321 322 // Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion 323 // behavior is gone in jQuery 4.0 and as it has security implications, we don't 324 // want to restore the legacy behavior. 325 if (!jQueryVersionSince("4.0.0")) { 326 327 // Register this prefilter before the jQuery one. Otherwise, a promoted 328 // request is transformed into one with the script dataType and we can't 329 // catch it anymore. 330 jQuery.ajaxPrefilter("+json", function (s) { 331 332 // Warn if JSON-to-JSONP auto-promotion happens. 333 if (s.jsonp !== false && (rjsonp.test(s.url) || 334 typeof s.data === "string" && 335 (s.contentType || "") 336 .indexOf("application/x-www-form-urlencoded") === 0 && 337 rjsonp.test(s.data) 338 )) { 339 migrateWarn("JSON-to-JSONP auto-promotion is deprecated"); 340 } 341 }); 342 } 343 344 } 345 346 var oldRemoveAttr = jQuery.fn.removeAttr, 347 oldToggleClass = jQuery.fn.toggleClass, 348 rmatchNonSpace = /\S+/g; 349 350 jQuery.fn.removeAttr = function (name) { 351 var self = this; 352 353 jQuery.each(name.match(rmatchNonSpace), function (_i, attr) { 354 if (jQuery.expr.match.bool.test(attr)) { 355 migrateWarn("jQuery.fn.removeAttr no longer sets boolean properties: " + attr); 356 self.prop(attr, false); 357 } 358 }); 359 360 return oldRemoveAttr.apply(this, arguments); 361 }; 362 363 jQuery.fn.toggleClass = function (state) { 364 365 // Only deprecating no-args or single boolean arg 366 if (state !== undefined && typeof state !== "boolean") { 367 return oldToggleClass.apply(this, arguments); 368 } 369 370 migrateWarn("jQuery.fn.toggleClass( boolean ) is deprecated"); 371 372 // Toggle entire class name of each element 373 return this.each(function () { 374 var className = this.getAttribute && this.getAttribute("class") || ""; 375 376 if (className) { 377 jQuery.data(this, "__className__", className); 378 } 379 380 // If the element has a class name or if we're passed `false`, 381 // then remove the whole classname (if there was one, the above saved it). 382 // Otherwise bring back whatever was previously saved (if anything), 383 // falling back to the empty string if nothing was stored. 384 if (this.setAttribute) { 385 this.setAttribute("class", 386 className || state === false ? 387 "" : 388 jQuery.data(this, "__className__") || "" 389 ); 390 } 391 }); 392 }; 393 394 function camelCase(string) { 395 return string.replace(/-([a-z])/g, function (_, letter) { 396 return letter.toUpperCase(); 397 }); 398 } 399 400 var oldFnCss, 401 internalSwapCall = false, 402 ralphaStart = /^[a-z]/, 403 404 // The regex visualized: 405 // 406 // /----------\ 407 // | | /-------\ 408 // | / Top \ | | | 409 // /--- Border ---+-| Right |-+---+- Width -+---\ 410 // | | Bottom | | 411 // | \ Left / | 412 // | | 413 // | /----------\ | 414 // | /-------------\ | | |- END 415 // | | | | / Top \ | | 416 // | | / Margin \ | | | Right | | | 417 // |---------+-| |-+---+-| Bottom |-+----| 418 // | \ Padding / \ Left / | 419 // BEGIN -| | 420 // | /---------\ | 421 // | | | | 422 // | | / Min \ | / Width \ | 423 // \--------------+-| |-+---| |---/ 424 // \ Max / \ Height / 425 rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; 426 427 // If this version of jQuery has .swap(), don't false-alarm on internal uses
428 if (jQuery.swap) { 429 jQuery.each(["height", "width", "reliableMarginRight"], function (_, name) { 430 var oldHook = jQuery.cssHooks[name] && jQuery.cssHooks[name].get; 431 432 if (oldHook) { 433 jQuery.cssHooks[name].get = function () { 434 var ret; 435 436 internalSwapCall = true; 437 ret = oldHook.apply(this, arguments); 438 internalSwapCall = false; 439 return ret; 440 }; 441 } 442 }); 443 } 444 445 jQuery.swap = function (elem, options, callback, args) { 446 var ret, name, 447 old = {}; 448 449 if (!internalSwapCall) { 450 migrateWarn("jQuery.swap() is undocumented and deprecated"); 451 } 452 453 // Remember the old values, and insert the new ones 454 for (name in options) { 455 old[name] = elem.style[name]; 456 elem.style[name] = options[name]; 457 } 458 459 ret = callback.apply(elem, args || []); 460 461 // Revert the old values 462 for (name in options) { 463 elem.style[name] = old[name]; 464 } 465 466 return ret; 467 }; 468 469 if (jQueryVersionSince("3.4.0") && typeof Proxy !== "undefined") { 470 471 jQuery.cssProps = new Proxy(jQuery.cssProps || {}, { 472 set: function () { 473 migrateWarn("JQMIGRATE: jQuery.cssProps is deprecated"); 474 return Reflect.set.apply(this, arguments); 475 } 476 }); 477 } 478 479 // Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but 480 // it will prevent code adding new keys to it unconditionally from crashing. 481 if (!jQuery.cssNumber) { 482 jQuery.cssNumber = {}; 483 } 484 485 function isAutoPx(prop) { 486 487 // The first test is used to ensure that: 488 // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex). 489 // 2. The prop is not empty. 490 return ralphaStart.test(prop) && 491 rautoPx.test(prop[0].toUpperCase() + prop.slice(1)); 492 } 493 494 oldFnCss = jQuery.fn.css; 495 496 jQuery.fn.css = function (name, value) { 497 var camelName, 498 origThis = this; 499 if (name && typeof name === "object" && !Array.isArray(name)) { 500 jQuery.each(name, function (n, v) { 501 jQuery.fn.css.call(origThis, n, v); 502 }); 503 return this; 504 } 505 if (typeof value === "number") { 506 camelName = camelCase(name); 507 if (!isAutoPx(camelName) && !jQuery.cssNumber[camelName]) { 508 migrateWarn("Number-typed values are deprecated for jQuery.fn.css( \"" + 509 name + "\", value )"); 510 } 511 } 512 513 return oldFnCss.apply(this, arguments); 514 }; 515 516 var oldData = jQuery.data; 517 518 jQuery.data = function (elem, name, value) { 519 var curData, sameKeys, key; 520 521 // Name can be an object, and each entry in the object is meant to be set as data 522 if (name && typeof name === "object" && arguments.length === 2) { 523 curData = jQuery.hasData(elem) && oldData.call(this, elem); 524 sameKeys = {}; 525 for (key in name) { 526 if (key !== camelCase(key)) { 527 migrateWarn("jQuery.data() always sets/gets camelCased names: " + key); 528 curData[key] = name[key]; 529 } else { 530 sameKeys[key] = name[key]; 531 } 532 } 533 534 oldData.call(this, elem, sameKeys); 535 536 return name; 537 } 538 539 // If the name is transformed, look for the un-transformed name in the data object 540 if (name && typeof name === "string" && name !== camelCase(name)) { 541 curData = jQuery.hasData(elem) && oldData.call(this, elem); 542 if (curData && name in curData) { 543 migrateWarn("jQuery.data() always sets/gets camelCased names: " + name); 544 if (arguments.length > 2) { 545 curData[name] = value; 546 } 547 return curData[name]; 548 } 549 } 550 551 return oldData.apply(this, arguments); 552 }; 553 554 // Support jQuery slim which excludes the effects module 555 if (jQuery.fx) { 556 557 var intervalValue, intervalMsg, 558 oldTweenRun = jQuery.Tween.prototype.run, 559 linearEasing = function (pct) { 560 return pct; 561 }; 562 563 jQuery.Tween.prototype.run = function () { 564 if (jQuery.easing[this.easing].length > 1) { 565 migrateWarn( 566 "'jQuery.easing." + this.easing.toString() + "' should use only one argument" 567 ); 568 569 jQuery.easing[this.easing] = linearEasing; 570 } 571 572 oldTweenRun.apply(this, arguments); 573 }; 574 575 intervalValue = jQuery.fx.interval || 13; 576 intervalMsg = "jQuery.fx.interval is deprecated"; 577
578 // Support: IE9, Android <=4.4 579 // Avoid false positives on browsers that lack rAF 580 // Don't warn if document is hidden, jQuery uses setTimeout (#292) 581 if (window.requestAnimationFrame) { 582 Object.defineProperty(jQuery.fx, "interval", { 583 configurable: true, 584 enumerable: true, 585 get: function () { 586 if (!window.document.hidden) { 587 migrateWarn(intervalMsg); 588 } 589 return intervalValue; 590 }, 591 set: function (newValue) { 592 migrateWarn(intervalMsg); 593 intervalValue = newValue; 594 } 595 }); 596 } 597 598 } 599 600 var oldLoad = jQuery.fn.load, 601 oldEventAdd = jQuery.event.add, 602 originalFix = jQuery.event.fix; 603 604 jQuery.event.props = []; 605 jQuery.event.fixHooks = {}; 606 607 migrateWarnProp(jQuery.event.props, "concat", jQuery.event.props.concat, 608 "jQuery.event.props.concat() is deprecated and removed"); 609 610 jQuery.event.fix = function (originalEvent) { 611 var event, 612 type = originalEvent.type, 613 fixHook = this.fixHooks[type], 614 props = jQuery.event.props; 615 616 if (props.length) { 617 migrateWarn("jQuery.event.props are deprecated and removed: " + props.join()); 618 while (props.length) { 619 jQuery.event.addProp(props.pop()); 620 } 621 } 622 623 if (fixHook && !fixHook._migrated_) { 624 fixHook._migrated_ = true; 625 migrateWarn("jQuery.event.fixHooks are deprecated and removed: " + type); 626 if ((props = fixHook.props) && props.length) { 627 while (props.length) { 628 jQuery.event.addProp(props.pop()); 629 } 630 } 631 } 632 633 event = originalFix.call(this, originalEvent); 634 635 return fixHook && fixHook.filter ? fixHook.filter(event, originalEvent) : event; 636 }; 637 638 jQuery.event.add = function (elem, types) { 639 640 // This misses the multiple-types case but that seems awfully rare 641 if (elem === window && types === "load" && window.document.readyState === "complete") { 642 migrateWarn("jQuery(window).on('load'...) called after load event occurred"); 643 } 644 return oldEventAdd.apply(this, arguments); 645 }; 646 647 jQuery.each(["load", "unload", "error"], function (_, name) { 648 649 jQuery.fn[name] = function () { 650 var args = Array.prototype.slice.call(arguments, 0); 651 652 // If this is an ajax load() the first arg should be the string URL; 653 // technically this could also be the "Anything" arg of the event .load() 654 // which just goes to show why this dumb signature has been deprecated! 655 // jQuery custom builds that exclude the Ajax module justifiably die here. 656 if (name === "load" && typeof args[0] === "string") { 657 return oldLoad.apply(this, args); 658 } 659 660 migrateWarn("jQuery.fn." + name + "() is deprecated"); 661 662 args.splice(0, 0, name); 663 if (arguments.length) { 664 return this.on.apply(this, args); 665 } 666 667 // Use .triggerHandler here because: 668 // - load and unload events don't need to bubble, only applied to window or image 669 // - error event should not bubble to window, although it does pre-1.7 670 // See http://bugs.jquery.com/ticket/11820 671 this.triggerHandler.apply(this, args); 672 return this; 673 }; 674 675 }); 676 677 jQuery.each(("blur focus focusin focusout resize scroll click dblclick " + 678 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 679 "change select submit keydown keypress keyup contextmenu").split(" "), 680 function (_i, name) { 681 682 // Handle event binding 683 jQuery.fn[name] = function (data, fn) { 684 migrateWarn("jQuery.fn." + name + "() event shorthand is deprecated"); 685 return arguments.length > 0 ? 686 this.on(name, null, data, fn) : 687 this.trigger(name); 688 }; 689 }); 690 691 // Trigger "ready" event only once, on document ready 692 jQuery(function () { 693 jQuery(window.document).triggerHandler("ready"); 694 }); 695 696 jQuery.event.special.ready = { 697 setup: function () { 698 if (this === window.document) { 699 migrateWarn("'ready' event is deprecated"); 700 } 701 } 702 }; 703 704 jQuery.fn.extend({ 705 706 bind: function (types, data, fn) { 707 migrateWarn("jQuery.fn.bind() is deprecated"); 708 return this.on(types, null, data, fn); 709 }, 710 unbind: function (types, fn) { 711 migrateWarn("jQuery.fn.unbind() is deprecated"); 712 return this.off(types, null, fn); 713 }, 714 delegate: function (selector, types, data, fn) { 715 migrateWarn("jQuery.fn.delegate() is deprecated"); 716 return this.on(types, selector, data, fn); 717 }, 718 undelegate: function (selector, types, fn) { 719 migrateWarn("jQuery.fn.undelegate() is deprecated"); 720 return arguments.length === 1 ? 721 this.off(selector, "**") : 722 this.off(types, selector || "**", fn); 723 }, 724 hover: function (fnOver, fnOut) { 725 migrateWarn("jQuery.fn.hover() is deprecated"); 726 return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver); 727 } 728 }); 729 730 var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, 731 origHtmlPrefilter = jQuery.htmlPrefilter, 732 makeMarkup = function (html) { 733 var doc = window.document.implementation.createHTMLDocument(""); 734 doc.body.innerHTML = html; 735 return doc.body && doc.body.innerHTML; 736 }, 737 warnIfChanged = function (html) { 738 var changed = html.replace(rxhtmlTag, "<$1></$2>"); 739 if (changed !== html && makeMarkup(html) !== makeMarkup(changed)) { 740 migrateWarn("HTML tags must be properly nested and closed: " + html); 741 } 742 }; 743 744 jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function () { 745 jQuery.htmlPrefilter = function (html) { 746 warnIfChanged(html); 747 return html.replace(rxhtmlTag, "<$1></$2>"); 748 }; 749 }; 750 751 jQuery.htmlPrefilter = function (html) { 752 warnIfChanged(html); 753 return origHtmlPrefilter(html); 754 }; 755 756 var oldOffset = jQuery.fn.offset; 757 758 jQuery.fn.offset = function () { 759 var elem = this[0]; 760 761 if (elem && (!elem.nodeType || !elem.getBoundingClientRect)) { 762 migrateWarn("jQuery.fn.offset() requires a valid DOM element");
763 return arguments.length ? this : undefined; 764 } 765 766 return oldOffset.apply(this, arguments); 767 }; 768 769 // Support jQuery slim which excludes the ajax module 770 // The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional` 771 // so it doesn't make sense for the slim build. 772 if (jQuery.ajax) { 773 774 var oldParam = jQuery.param; 775 776 jQuery.param = function (data, traditional) { 777 var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; 778 779 if (traditional === undefined && ajaxTraditional) { 780 781 migrateWarn("jQuery.param() no longer uses jQuery.ajaxSettings.traditional"); 782 traditional = ajaxTraditional; 783 } 784 785 return oldParam.call(this, data, traditional); 786 }; 787 788 } 789 790 var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack; 791 792 jQuery.fn.andSelf = function () { 793 migrateWarn("jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()"); 794 return oldSelf.apply(this, arguments); 795 }; 796 797 // Support jQuery slim which excludes the deferred module in jQuery 4.0+ 798 if (jQuery.Deferred) { 799 800 var oldDeferred = jQuery.Deferred, 801 tuples = [ 802 803 // Action, add listener, callbacks, .then handlers, final state 804 ["resolve", "done", jQuery.Callbacks("once memory"), 805 jQuery.Callbacks("once memory"), "resolved"], 806 ["reject", "fail", jQuery.Callbacks("once memory"), 807 jQuery.Callbacks("once memory"), "rejected"], 808 ["notify", "progress", jQuery.Callbacks("memory"), 809 jQuery.Callbacks("memory")] 810 ]; 811 812 jQuery.Deferred = function (func) { 813 var deferred = oldDeferred(), 814 promise = deferred.promise(); 815 816 deferred.pipe = promise.pipe = function ( /* fnDone, fnFail, fnProgress */) { 817 var fns = arguments; 818 819 migrateWarn("deferred.pipe() is deprecated"); 820 821 return jQuery.Deferred(function (newDefer) { 822 jQuery.each(tuples, function (i, tuple) { 823 var fn = typeof fns[i] === "function" && fns[i]; 824 825 // Deferred.done(function() { bind to newDefer or newDefer.resolve }) 826 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 827 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 828 deferred[tuple[1]](function () { 829 var returned = fn && fn.apply(this, arguments); 830 if (returned && typeof returned.promise === "function") { 831 returned.promise() 832 .done(newDefer.resolve) 833 .fail(newDefer.reject) 834 .progress(newDefer.notify); 835 } else { 836 newDefer[tuple[0] + "With"]( 837 this === promise ? newDefer.promise() : this, 838 fn ? [returned] : arguments 839 ); 840 } 841 }); 842 }); 843 fns = null; 844 }).promise(); 845 846 }; 847 848 if (func) { 849 func.call(deferred, deferred); 850 } 851 852 return deferred; 853 }; 854 855 // Preserve handler of uncaught exceptions in promise chains 856 jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook; 857 858 } 859 860 return jQuery; 861}); 862 863/*! jQuery UI - v1.13.1 - 2022-03-03 864* http://jqueryui.com 865* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/selectmenu.js 866* Copyright jQuery Foundation and other contributors; Licensed MIT */ 867 868(function (factory) { 869 "use strict"; 870 871 if (typeof define === "function" && define.amd) { 872 873 // AMD. Register as an anonymous module. 874 define(["jquery"], factory); 875 } else { 876 877 // Browser globals 878 factory(jQuery); 879 } 880})(function ($) { 881 "use strict"; 882 883 $.ui = $.ui || {}; 884 885 var version = $.ui.version = "1.13.1"; 886 887 888 /*! 889 * jQuery UI Widget 1.13.1 890 * http://jqueryui.com 891 * 892 * Copyright jQuery Foundation and other contributors 893 * Released under the MIT license. 894 * http://jquery.org/license 895 */ 896 897 //>>label: Widget 898 //>>group: Core 899 //>>description: Provides a factory for creating stateful widgets with a common API. 900 //>>docs: http://api.jqueryui.com/jQuery.widget/ 901 //>>demos: http://jqueryui.com/widget/ 902 903 904 var widgetUuid = 0; 905 var widgetHasOwnProperty = Array.prototype.hasOwnProperty; 906 var widgetSlice = Array.prototype.slice; 907 908 $.cleanData = (function (orig) { 909 return function (elems) { 910 var events, elem, i; 911 for (i = 0; (elem = elems[i]) != null; i++) { 912 913 // Only trigger remove when necessary to save time 914 events = $._data(elem, "events"); 915 if (events && events.remove) { 916 $(elem).triggerHandler("remove"); 917 } 918 } 919 orig(elems); 920 }; 921 })($.cleanData); 922 923 $.widget = function (name, base, prototype) { 924 var existingConstructor, constructor, basePrototype; 925 926 // ProxiedPrototype allows the provided prototype to remain unmodified 927 // so that it can be used as a mixin for multiple widgets (#8876) 928 var proxiedPrototype = {}; 929 930 var namespace = name.split(".")[0]; 931 name = name.split(".")[1]; 932 var fullName = namespace + "-" + name; 933 934 if (!prototype) { 935 prototype = base; 936 base = $.Widget; 937 } 938 939 if (Array.isArray(prototype)) { 940 prototype = $.extend.apply(null, [{}].concat(prototype)); 941 } 942 943 // Create selector for plugin 944 $.expr.pseudos[fullName.toLowerCase()] = function (elem) { 945 return !!$.data(elem, fullName); 946 }; 947 948 $[namespace] = $[namespace] || {}; 949 existingConstructor = $[namespace][name]; 950 constructor = $[namespace][name] = function (options, element) { 951 952 // Allow instantiation without "new" keyword 953 if (!this || !this._createWidget) { 954 return new constructor(options, element); 955 } 956 957 // Allow instantiation without initializing for simple inheritance 958 // must use "new" keyword (the code above always passes args) 959 if (arguments.length) { 960 this._createWidget(options, element); 961 } 962 }; 963 964 // Extend with the existing constructor to carry over any static properties 965 $.extend(constructor, existingConstructor, { 966 version: prototype.version, 967 968 // Copy the object used to create the prototype in case we need to 969 // redefine the widget later 970 _proto: $.extend({}, prototype), 971 972 // Track widgets that inherit from this widget in case this widget is 973 // redefined after a widget inherits from it 974 _childConstructors: [] 975 }); 976 977 basePrototype = new base(); 978 979 // We need to make the options hash a property directly on the new instance 980 // otherwise we'll modify the options hash on the prototype that we're 981 // inheriting from 982 basePrototype.options = $.widget.extend({}, basePrototype.options); 983 $.each(prototype, function (prop, value) { 984 if (typeof value !== "function") { 985 proxiedPrototype[prop] = value; 986 return; 987 } 988 proxiedPrototype[prop] = (function () { 989 function _super() { 990 return base.prototype[prop].apply(this, arguments); 991 } 992 993 function _superApply(args) { 994 return base.prototype[prop].apply(this, args); 995 } 996 997 return function () { 998 var __super = this._super; 999 var __superApply = this._superApply; 1000 var returnValue; 1001 1002 this._super = _super; 1003 this._superApply = _superApply; 1004
vendor: 33,156 bytes, lines 1005-2129
1005 returnValue = value.apply(this, arguments); 1006 1007 this._super = __super; 1008 this._superApply = __superApply; 1009 1010 return returnValue; 1011 }; 1012 })(); 1013 }); 1014 constructor.prototype = $.widget.extend(basePrototype, { 1015 1016 // TODO: remove support for widgetEventPrefix 1017 // always use the name + a colon as the prefix, e.g., draggable:start 1018 // don't prefix for widgets that aren't DOM-based 1019 widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name 1020 }, proxiedPrototype, { 1021 constructor: constructor, 1022 namespace: namespace, 1023 widgetName: name, 1024 widgetFullName: fullName 1025 }); 1026 1027 // If this widget is being redefined then we need to find all widgets that 1028 // are inheriting from it and redefine all of them so that they inherit from 1029 // the new version of this widget. We're essentially trying to replace one 1030 // level in the prototype chain. 1031 if (existingConstructor) { 1032 $.each(existingConstructor._childConstructors, function (i, child) { 1033 var childPrototype = child.prototype; 1034 1035 // Redefine the child widget using the same prototype that was 1036 // originally used, but inherit from the new version of the base 1037 $.widget(childPrototype.namespace + "." + childPrototype.widgetName, constructor, 1038 child._proto); 1039 }); 1040 1041 // Remove the list of existing child constructors from the old constructor 1042 // so the old child constructors can be garbage collected 1043 delete existingConstructor._childConstructors; 1044 } else { 1045 base._childConstructors.push(constructor); 1046 } 1047 1048 $.widget.bridge(name, constructor); 1049 1050 return constructor; 1051 }; 1052 1053 $.widget.extend = function (target) { 1054 var input = widgetSlice.call(arguments, 1); 1055 var inputIndex = 0; 1056 var inputLength = input.length; 1057 var key; 1058 var value; 1059 1060 for (; inputIndex < inputLength; inputIndex++) { 1061 for (key in input[inputIndex]) { 1062 value = input[inputIndex][key]; 1063 if (widgetHasOwnProperty.call(input[inputIndex], key) && value !== undefined) { 1064 1065 // Clone objects 1066 if ($.isPlainObject(value)) { 1067 target[key] = $.isPlainObject(target[key]) ? 1068 $.widget.extend({}, target[key], value) : 1069 1070 // Don't extend strings, arrays, etc. with objects 1071 $.widget.extend({}, value); 1072 1073 // Copy everything else by reference 1074 } else { 1075 target[key] = value; 1076 } 1077 } 1078 } 1079 } 1080 return target; 1081 }; 1082 1083 $.widget.bridge = function (name, object) { 1084 var fullName = object.prototype.widgetFullName || name; 1085 $.fn[name] = function (options) { 1086 var isMethodCall = typeof options === "string"; 1087 var args = widgetSlice.call(arguments, 1); 1088 var returnValue = this; 1089 1090 if (isMethodCall) { 1091 1092 // If this is an empty collection, we need to have the instance method 1093 // return undefined instead of the jQuery instance 1094 if (!this.length && options === "instance") { 1095 returnValue = undefined; 1096 } else { 1097 this.each(function () { 1098 var methodValue; 1099 var instance = $.data(this, fullName); 1100 1101 if (options === "instance") { 1102 returnValue = instance; 1103 return false; 1104 } 1105 1106 if (!instance) { 1107 return $.error("cannot call methods on " + name + 1108 " prior to initialization; " + 1109 "attempted to call method '" + options + "'"); 1110 } 1111 1112 if (typeof instance[options] !== "function" || 1113 options.charAt(0) === "_") { 1114 return $.error("no such method '" + options + "' for " + name + 1115 " widget instance"); 1116 } 1117 1118 methodValue = instance[options].apply(instance, args); 1119 1120 if (methodValue !== instance && methodValue !== undefined) { 1121 returnValue = methodValue && methodValue.jquery ? 1122 returnValue.pushStack(methodValue.get()) : 1123 methodValue; 1124 return false; 1125 } 1126 }); 1127 } 1128 } else { 1129 1130 // Allow multiple hashes to be passed on init 1131 if (args.length) { 1132 options = $.widget.extend.apply(null, [options].concat(args)); 1133 } 1134 1135 this.each(function () { 1136 var instance = $.data(this, fullName); 1137 if (instance) { 1138 instance.option(options || {}); 1139 if (instance._init) { 1140 instance._init(); 1141 } 1142 } else { 1143 $.data(this, fullName, new object(options, this)); 1144 } 1145 }); 1146 } 1147 1148 return returnValue; 1149 }; 1150 }; 1151 1152 $.Widget = function ( /* options, element */) { }; 1153 $.Widget._childConstructors = []; 1154 1155 $.Widget.prototype = { 1156 widgetName: "widget", 1157 widgetEventPrefix: "", 1158 defaultElement: "<div>", 1159 1160 options: { 1161 classes: {}, 1162 disabled: false, 1163 1164 // Callbacks 1165 create: null 1166 }, 1167 1168 _createWidget: function (options, element) { 1169 element = $(element || this.defaultElement || this)[0]; 1170 this.element = $(element); 1171 this.uuid = widgetUuid++; 1172 this.eventNamespace = "." + this.widgetName + this.uuid; 1173 1174 this.bindings = $(); 1175 this.hoverable = $(); 1176 this.focusable = $(); 1177 this.classesElementLookup = {}; 1178 1179 if (element !== this) { 1180 $.data(element, this.widgetFullName, this); 1181 this._on(true, this.element, { 1182 remove: function (event) { 1183 if (event.target === element) { 1184 this.destroy(); 1185 } 1186 } 1187 }); 1188 this.document = $(element.style ? 1189 1190 // Element within the document 1191 element.ownerDocument : 1192 1193 // Element is window or document 1194 element.document || element); 1195 this.window = $(this.document[0].defaultView || this.document[0].parentWindow); 1196 } 1197 1198 this.options = $.widget.extend({}, 1199 this.options, 1200 this._getCreateOptions(), 1201 options); 1202 1203 this._create(); 1204 1205 if (this.options.disabled) { 1206 this._setOptionDisabled(this.options.disabled); 1207 } 1208 1209 this._trigger("create", null, this._getCreateEventData()); 1210 this._init(); 1211 }, 1212 1213 _getCreateOptions: function () { 1214 return {}; 1215 }, 1216 1217 _getCreateEventData: $.noop, 1218 1219 _create: $.noop, 1220 1221 _init: $.noop, 1222 1223 destroy: function () { 1224 var that = this; 1225 1226 this._destroy(); 1227 $.each(this.classesElementLookup, function (key, value) { 1228 that._removeClass(value, key); 1229 }); 1230 1231 // We can probably remove the unbind calls in 2.0 1232 // all event bindings should go through this._on() 1233 this.element 1234 .off(this.eventNamespace) 1235 .removeData(this.widgetFullName); 1236 this.widget() 1237 .off(this.eventNamespace) 1238 .removeAttr("aria-disabled"); 1239 1240 // Clean up events and states 1241 this.bindings.off(this.eventNamespace); 1242 }, 1243 1244 _destroy: $.noop, 1245 1246 widget: function () { 1247 return this.element; 1248 }, 1249 1250 option: function (key, value) { 1251 var options = key; 1252 var parts; 1253 var curOption; 1254 var i; 1255 1256 if (arguments.length === 0) { 1257 1258 // Don't return a reference to the internal hash 1259 return $.widget.extend({}, this.options); 1260 } 1261 1262 if (typeof key === "string") { 1263 1264 // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } 1265 options = {}; 1266 parts = key.split("."); 1267 key = parts.shift(); 1268 if (parts.length) { 1269 curOption = options[key] = $.widget.extend({}, this.options[key]); 1270 for (i = 0; i < parts.length - 1; i++) { 1271 curOption[parts[i]] = curOption[parts[i]] || {}; 1272 curOption = curOption[parts[i]]; 1273 } 1274 key = parts.pop(); 1275 if (arguments.length === 1) { 1276 return curOption[key] === undefined ? null : curOption[key]; 1277 } 1278 curOption[key] = value; 1279 } else { 1280 if (arguments.length === 1) { 1281 return this.options[key] === undefined ? null : this.options[key]; 1282 } 1283 options[key] = value; 1284 } 1285 } 1286 1287 this._setOptions(options); 1288 1289 return this; 1290 }, 1291 1292 _setOptions: function (options) { 1293 var key; 1294 1295 for (key in options) { 1296 this._setOption(key, options[key]); 1297 } 1298 1299 return this; 1300 }, 1301 1302 _setOption: function (key, value) { 1303 if (key === "classes") { 1304 this._setOptionClasses(value); 1305 } 1306 1307 this.options[key] = value; 1308 1309 if (key === "disabled") { 1310 this._setOptionDisabled(value); 1311 } 1312 1313 return this; 1314 }, 1315 1316 _setOptionClasses: function (value) { 1317 var classKey, elements, currentElements; 1318 1319 for (classKey in value) { 1320 currentElements = this.classesElementLookup[classKey]; 1321 if (value[classKey] === this.options.classes[classKey] || 1322 !currentElements || 1323 !currentElements.length) { 1324 continue; 1325 } 1326 1327 // We are doing this to create a new jQuery object because the _removeClass() call 1328 // on the next line is going to destroy the reference to the current elements being 1329 // tracked. We need to save a copy of this collection so that we can add the new classes 1330 // below. 1331 elements = $(currentElements.get()); 1332 this._removeClass(currentElements, classKey); 1333 1334 // We don't use _addClass() here, because that uses this.options.classes 1335 // for generating the string of classes. We want to use the value passed in from 1336 // _setOption(), this is the new value of the classes option which was passed to 1337 // _setOption(). We pass this value directly to _classes(). 1338 elements.addClass(this._classes({ 1339 element: elements, 1340 keys: classKey, 1341 classes: value, 1342 add: true 1343 })); 1344 } 1345 }, 1346 1347 _setOptionDisabled: function (value) { 1348 this._toggleClass(this.widget(), this.widgetFullName + "-disabled", null, !!value); 1349 1350 // If the widget is becoming disabled, then nothing is interactive 1351 if (value) { 1352 this._removeClass(this.hoverable, null, "ui-state-hover"); 1353 this._removeClass(this.focusable, null, "ui-state-focus"); 1354 } 1355 }, 1356 1357 enable: function () { 1358 return this._setOptions({ disabled: false }); 1359 }, 1360 1361 disable: function () { 1362 return this._setOptions({ disabled: true }); 1363 }, 1364 1365 _classes: function (options) { 1366 var full = []; 1367 var that = this; 1368 1369 options = $.extend({ 1370 element: this.element, 1371 classes: this.options.classes || {} 1372 }, options); 1373 1374 function bindRemoveEvent() { 1375 var nodesToBind = []; 1376 1377 options.element.each(function (_, element) { 1378 var isTracked = $.map(that.classesElementLookup, function (elements) { 1379 return elements; 1380 }) 1381 .some(function (elements) { 1382 return elements.is(element); 1383 }); 1384 1385 if (!isTracked) { 1386 nodesToBind.push(element); 1387 } 1388 }); 1389 1390 that._on($(nodesToBind), { 1391 remove: "_untrackClassesElement" 1392 }); 1393 } 1394 1395 function processClassString(classes, checkOption) { 1396 var current, i; 1397 for (i = 0; i < classes.length; i++) { 1398 current = that.classesElementLookup[classes[i]] || $(); 1399 if (options.add) { 1400 bindRemoveEvent(); 1401 current = $($.uniqueSort(current.get().concat(options.element.get()))); 1402 } else { 1403 current = $(current.not(options.element).get()); 1404 } 1405 that.classesElementLookup[classes[i]] = current; 1406 full.push(classes[i]); 1407 if (checkOption && options.classes[classes[i]]) { 1408 full.push(options.classes[classes[i]]); 1409 } 1410 } 1411 } 1412 1413 if (options.keys) { 1414 processClassString(options.keys.match(/\S+/g) || [], true); 1415 } 1416 if (options.extra) { 1417 processClassString(options.extra.match(/\S+/g) || []); 1418 } 1419 1420 return full.join(" "); 1421 }, 1422 1423 _untrackClassesElement: function (event) { 1424 var that = this; 1425 $.each(that.classesElementLookup, function (key, value) { 1426 if ($.inArray(event.target, value) !== -1) { 1427 that.classesElementLookup[key] = $(value.not(event.target).get()); 1428 } 1429 }); 1430 1431 this._off($(event.target)); 1432 }, 1433 1434 _removeClass: function (element, keys, extra) { 1435 return this._toggleClass(element, keys, extra, false); 1436 }, 1437 1438 _addClass: function (element, keys, extra) { 1439 return this._toggleClass(element, keys, extra, true); 1440 }, 1441 1442 _toggleClass: function (element, keys, extra, add) { 1443 add = (typeof add === "boolean") ? add : extra; 1444 var shift = (typeof element === "string" || element === null), 1445 options = { 1446 extra: shift ? keys : extra, 1447 keys: shift ? element : keys, 1448 element: shift ? this.element : element, 1449 add: add 1450 }; 1451 options.element.toggleClass(this._classes(options), add); 1452 return this; 1453 }, 1454 1455 _on: function (suppressDisabledCheck, element, handlers) { 1456 var delegateElement; 1457 var instance = this; 1458 1459 // No suppressDisabledCheck flag, shuffle arguments 1460 if (typeof suppressDisabledCheck !== "boolean") { 1461 handlers = element; 1462 element = suppressDisabledCheck; 1463 suppressDisabledCheck = false; 1464 } 1465 1466 // No element argument, shuffle and use this.element 1467 if (!handlers) { 1468 handlers = element; 1469 element = this.element; 1470 delegateElement = this.widget(); 1471 } else { 1472 element = delegateElement = $(element); 1473 this.bindings = this.bindings.add(element); 1474 } 1475 1476 $.each(handlers, function (event, handler) { 1477 function handlerProxy() { 1478 1479 // Allow widgets to customize the disabled handling 1480 // - disabled as an array instead of boolean 1481 // - disabled class as method for disabling individual parts 1482 if (!suppressDisabledCheck && 1483 (instance.options.disabled === true || 1484 $(this).hasClass("ui-state-disabled"))) { 1485 return; 1486 } 1487 return (typeof handler === "string" ? instance[handler] : handler) 1488 .apply(instance, arguments); 1489 } 1490 1491 // Copy the guid so direct unbinding works 1492 if (typeof handler !== "string") { 1493 handlerProxy.guid = handler.guid = 1494 handler.guid || handlerProxy.guid || $.guid++; 1495 } 1496 1497 var match = event.match(/^([\w:-]*)\s*(.*)$/); 1498 var eventName = match[1] + instance.eventNamespace; 1499 var selector = match[2]; 1500 1501 if (selector) { 1502 delegateElement.on(eventName, selector, handlerProxy); 1503 } else { 1504 element.on(eventName, handlerProxy); 1505 } 1506 }); 1507 }, 1508 1509 _off: function (element, eventName) { 1510 eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") + 1511 this.eventNamespace; 1512 element.off(eventName); 1513 1514 // Clear the stack to avoid memory leaks (#10056) 1515 this.bindings = $(this.bindings.not(element).get()); 1516 this.focusable = $(this.focusable.not(element).get()); 1517 this.hoverable = $(this.hoverable.not(element).get()); 1518 }, 1519 1520 _delay: function (handler, delay) { 1521 function handlerProxy() { 1522 return (typeof handler === "string" ? instance[handler] : handler) 1523 .apply(instance, arguments); 1524 } 1525 var instance = this; 1526 return setTimeout(handlerProxy, delay || 0); 1527 }, 1528 1529 _hoverable: function (element) { 1530 this.hoverable = this.hoverable.add(element); 1531 this._on(element, { 1532 mouseenter: function (event) { 1533 this._addClass($(event.currentTarget), null, "ui-state-hover"); 1534 }, 1535 mouseleave: function (event) { 1536 this._removeClass($(event.currentTarget), null, "ui-state-hover"); 1537 } 1538 }); 1539 }, 1540 1541 _focusable: function (element) { 1542 this.focusable = this.focusable.add(element); 1543 this._on(element, { 1544 focusin: function (event) { 1545 this._addClass($(event.currentTarget), null, "ui-state-focus"); 1546 }, 1547 focusout: function (event) { 1548 this._removeClass($(event.currentTarget), null, "ui-state-focus"); 1549 } 1550 }); 1551 }, 1552 1553 _trigger: function (type, event, data) { 1554 var prop, orig; 1555 var callback = this.options[type]; 1556 1557 data = data || {}; 1558 event = $.Event(event); 1559 event.type = (type === this.widgetEventPrefix ? 1560 type : 1561 this.widgetEventPrefix + type).toLowerCase(); 1562 1563 // The original event may come from any element 1564 // so we need to reset the target on the new event 1565 event.target = this.element[0]; 1566 1567 // Copy original event properties over to the new event 1568 orig = event.originalEvent; 1569 if (orig) { 1570 for (prop in orig) { 1571 if (!(prop in event)) { 1572 event[prop] = orig[prop]; 1573 } 1574 } 1575 } 1576 1577 this.element.trigger(event, data); 1578 return !(typeof callback === "function" && 1579 callback.apply(this.element[0], [event].concat(data)) === false || 1580 event.isDefaultPrevented()); 1581 } 1582 }; 1583 1584 $.each({ show: "fadeIn", hide: "fadeOut" }, function (method, defaultEffect) { 1585 $.Widget.prototype["_" + method] = function (element, options, callback) { 1586 if (typeof options === "string") { 1587 options = { effect: options }; 1588 } 1589 1590 var hasOptions; 1591 var effectName = !options ? 1592 method : 1593 options === true || typeof options === "number" ? 1594 defaultEffect : 1595 options.effect || defaultEffect; 1596 1597 options = options || {}; 1598 if (typeof options === "number") { 1599 options = { duration: options }; 1600 } else if (options === true) { 1601 options = {}; 1602 } 1603 1604 hasOptions = !$.isEmptyObject(options); 1605 options.complete = callback; 1606 1607 if (options.delay) { 1608 element.delay(options.delay); 1609 } 1610 1611 if (hasOptions && $.effects && $.effects.effect[effectName]) { 1612 element[method](options); 1613 } else if (effectName !== method && element[effectName]) { 1614 element[effectName](options.duration, options.easing, callback); 1615 } else { 1616 element.queue(function (next) { 1617 $(this)[method](); 1618 if (callback) { 1619 callback.call(element[0]); 1620 } 1621 next(); 1622 }); 1623 } 1624 }; 1625 }); 1626 1627 var widget = $.widget; 1628 1629 1630 /*! 1631 * jQuery UI Position 1.13.1 1632 * http://jqueryui.com 1633 * 1634 * Copyright jQuery Foundation and other contributors 1635 * Released under the MIT license. 1636 * http://jquery.org/license 1637 * 1638 * http://api.jqueryui.com/position/ 1639 */ 1640 1641 //>>label: Position 1642 //>>group: Core 1643 //>>description: Positions elements relative to other elements. 1644 //>>docs: http://api.jqueryui.com/position/ 1645 //>>demos: http://jqueryui.com/position/ 1646 1647 1648 (function () { 1649 var cachedScrollbarWidth, 1650 max = Math.max, 1651 abs = Math.abs, 1652 rhorizontal = /left|center|right/, 1653 rvertical = /top|center|bottom/, 1654 roffset = /[\+\-]\d+(\.[\d]+)?%?/, 1655 rposition = /^\w+/, 1656 rpercent = /%$/, 1657 _position = $.fn.position; 1658 1659 function getOffsets(offsets, width, height) { 1660 return [ 1661 parseFloat(offsets[0]) * (rpercent.test(offsets[0]) ? width / 100 : 1), 1662 parseFloat(offsets[1]) * (rpercent.test(offsets[1]) ? height / 100 : 1) 1663 ]; 1664 } 1665 1666 function parseCss(element, property) { 1667 return parseInt($.css(element, property), 10) || 0; 1668 } 1669 1670 function isWindow(obj) { 1671 return obj != null && obj === obj.window; 1672 } 1673 1674 function getDimensions(elem) { 1675 var raw = elem[0]; 1676 if (raw.nodeType === 9) { 1677 return { 1678 width: elem.width(), 1679 height: elem.height(), 1680 offset: { top: 0, left: 0 } 1681 }; 1682 } 1683 if (isWindow(raw)) { 1684 return { 1685 width: elem.width(), 1686 height: elem.height(), 1687 offset: { top: elem.scrollTop(), left: elem.scrollLeft() } 1688 }; 1689 } 1690 if (raw.preventDefault) { 1691 return { 1692 width: 0, 1693 height: 0, 1694 offset: { top: raw.pageY, left: raw.pageX } 1695 }; 1696 } 1697 return { 1698 width: elem.outerWidth(), 1699 height: elem.outerHeight(), 1700 offset: elem.offset() 1701 }; 1702 } 1703 1704 $.position = { 1705 scrollbarWidth: function () { 1706 if (cachedScrollbarWidth !== undefined) { 1707 return cachedScrollbarWidth; 1708 } 1709 var w1, w2, 1710 div = $("<div style=" + 1711 "'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" + 1712 "<div style='height:300px;width:auto;'></div></div>"), 1713 innerDiv = div.children()[0]; 1714 1715 $("body").append(div); 1716 w1 = innerDiv.offsetWidth; 1717 div.css("overflow", "scroll"); 1718 1719 w2 = innerDiv.offsetWidth; 1720 1721 if (w1 === w2) { 1722 w2 = div[0].clientWidth; 1723 } 1724 1725 div.remove(); 1726 1727 return (cachedScrollbarWidth = w1 - w2); 1728 }, 1729 getScrollInfo: function (within) { 1730 var overflowX = within.isWindow || within.isDocument ? "" : 1731 within.element.css("overflow-x"), 1732 overflowY = within.isWindow || within.isDocument ? "" : 1733 within.element.css("overflow-y"), 1734 hasOverflowX = overflowX === "scroll" || 1735 (overflowX === "auto" && within.width < within.element[0].scrollWidth), 1736 hasOverflowY = overflowY === "scroll" || 1737 (overflowY === "auto" && within.height < within.element[0].scrollHeight); 1738 return { 1739 width: hasOverflowY ? $.position.scrollbarWidth() : 0, 1740 height: hasOverflowX ? $.position.scrollbarWidth() : 0 1741 }; 1742 }, 1743 getWithinInfo: function (element) { 1744 var withinElement = $(element || window), 1745 isElemWindow = isWindow(withinElement[0]), 1746 isDocument = !!withinElement[0] && withinElement[0].nodeType === 9, 1747 hasOffset = !isElemWindow && !isDocument; 1748 return { 1749 element: withinElement, 1750 isWindow: isElemWindow, 1751 isDocument: isDocument, 1752 offset: hasOffset ? $(element).offset() : { left: 0, top: 0 }, 1753 scrollLeft: withinElement.scrollLeft(), 1754 scrollTop: withinElement.scrollTop(), 1755 width: withinElement.outerWidth(), 1756 height: withinElement.outerHeight() 1757 }; 1758 } 1759 }; 1760 1761 $.fn.position = function (options) { 1762 if (!options || !options.of) { 1763 return _position.apply(this, arguments); 1764 } 1765 1766 // Make a copy, we don't want to modify arguments 1767 options = $.extend({}, options); 1768 1769 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, 1770 1771 // Make sure string options are treated as CSS selectors 1772 target = typeof options.of === "string" ? 1773 $(document).find(options.of) : 1774 $(options.of), 1775 1776 within = $.position.getWithinInfo(options.within), 1777 scrollInfo = $.position.getScrollInfo(within), 1778 collision = (options.collision || "flip").split(" "), 1779 offsets = {}; 1780 1781 dimensions = getDimensions(target); 1782 if (target[0].preventDefault) { 1783 1784 // Force left top to allow flipping 1785 options.at = "left top"; 1786 } 1787 targetWidth = dimensions.width; 1788 targetHeight = dimensions.height; 1789 targetOffset = dimensions.offset; 1790 1791 // Clone to reuse original targetOffset later 1792 basePosition = $.extend({}, targetOffset); 1793 1794 // Force my and at to have valid horizontal and vertical positions 1795 // if a value is missing or invalid, it will be converted to center 1796 $.each(["my", "at"], function () { 1797 var pos = (options[this] || "").split(" "), 1798 horizontalOffset, 1799 verticalOffset; 1800 1801 if (pos.length === 1) { 1802 pos = rhorizontal.test(pos[0]) ? 1803 pos.concat(["center"]) : 1804 rvertical.test(pos[0]) ? 1805 ["center"].concat(pos) : 1806 ["center", "center"]; 1807 } 1808 pos[0] = rhorizontal.test(pos[0]) ? pos[0] : "center"; 1809 pos[1] = rvertical.test(pos[1]) ? pos[1] : "center"; 1810 1811 // Calculate offsets 1812 horizontalOffset = roffset.exec(pos[0]); 1813 verticalOffset = roffset.exec(pos[1]); 1814 offsets[this] = [ 1815 horizontalOffset ? horizontalOffset[0] : 0, 1816 verticalOffset ? verticalOffset[0] : 0 1817 ]; 1818 1819 // Reduce to just the positions without the offsets 1820 options[this] = [ 1821 rposition.exec(pos[0])[0], 1822 rposition.exec(pos[1])[0] 1823 ]; 1824 }); 1825 1826 // Normalize collision option 1827 if (collision.length === 1) { 1828 collision[1] = collision[0]; 1829 } 1830 1831 if (options.at[0] === "right") { 1832 basePosition.left += targetWidth; 1833 } else if (options.at[0] === "center") { 1834 basePosition.left += targetWidth / 2; 1835 } 1836 1837 if (options.at[1] === "bottom") { 1838 basePosition.top += targetHeight; 1839 } else if (options.at[1] === "center") { 1840 basePosition.top += targetHeight / 2; 1841 } 1842 1843 atOffset = getOffsets(offsets.at, targetWidth, targetHeight); 1844 basePosition.left += atOffset[0]; 1845 basePosition.top += atOffset[1]; 1846 1847 return this.each(function () { 1848 var collisionPosition, using, 1849 elem = $(this), 1850 elemWidth = elem.outerWidth(), 1851 elemHeight = elem.outerHeight(), 1852 marginLeft = parseCss(this, "marginLeft"), 1853 marginTop = parseCss(this, "marginTop"), 1854 collisionWidth = elemWidth + marginLeft + parseCss(this, "marginRight") + 1855 scrollInfo.width, 1856 collisionHeight = elemHeight + marginTop + parseCss(this, "marginBottom") + 1857 scrollInfo.height, 1858 position = $.extend({}, basePosition), 1859 myOffset = getOffsets(offsets.my, elem.outerWidth(), elem.outerHeight()); 1860 1861 if (options.my[0] === "right") { 1862 position.left -= elemWidth; 1863 } else if (options.my[0] === "center") { 1864 position.left -= elemWidth / 2; 1865 } 1866 1867 if (options.my[1] === "bottom") { 1868 position.top -= elemHeight; 1869 } else if (options.my[1] === "center") { 1870 position.top -= elemHeight / 2; 1871 } 1872 1873 position.left += myOffset[0]; 1874 position.top += myOffset[1]; 1875 1876 collisionPosition = { 1877 marginLeft: marginLeft, 1878 marginTop: marginTop 1879 }; 1880 1881 $.each(["left", "top"], function (i, dir) { 1882 if ($.ui.position[collision[i]]) { 1883 $.ui.position[collision[i]][dir](position, { 1884 targetWidth: targetWidth, 1885 targetHeight: targetHeight, 1886 elemWidth: elemWidth, 1887 elemHeight: elemHeight, 1888 collisionPosition: collisionPosition, 1889 collisionWidth: collisionWidth, 1890 collisionHeight: collisionHeight, 1891 offset: [atOffset[0] + myOffset[0], atOffset[1] + myOffset[1]], 1892 my: options.my, 1893 at: options.at, 1894 within: within, 1895 elem: elem 1896 }); 1897 } 1898 }); 1899 1900 if (options.using) { 1901 1902 // Adds feedback as second argument to using callback, if present 1903 using = function (props) { 1904 var left = targetOffset.left - position.left, 1905 right = left + targetWidth - elemWidth, 1906 top = targetOffset.top - position.top, 1907 bottom = top + targetHeight - elemHeight, 1908 feedback = { 1909 target: { 1910 element: target, 1911 left: targetOffset.left, 1912 top: targetOffset.top, 1913 width: targetWidth, 1914 height: targetHeight 1915 }, 1916 element: { 1917 element: elem, 1918 left: position.left, 1919 top: position.top, 1920 width: elemWidth, 1921 height: elemHeight 1922 }, 1923 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", 1924 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" 1925 }; 1926 if (targetWidth < elemWidth && abs(left + right) < targetWidth) { 1927 feedback.horizontal = "center"; 1928 } 1929 if (targetHeight < elemHeight && abs(top + bottom) < targetHeight) { 1930 feedback.vertical = "middle"; 1931 } 1932 if (max(abs(left), abs(right)) > max(abs(top), abs(bottom))) { 1933 feedback.important = "horizontal"; 1934 } else { 1935 feedback.important = "vertical"; 1936 } 1937 options.using.call(this, props, feedback); 1938 }; 1939 } 1940 1941 elem.offset($.extend(position, { using: using })); 1942 }); 1943 }; 1944 1945 $.ui.position = { 1946 fit: { 1947 left: function (position, data) { 1948 var within = data.within, 1949 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, 1950 outerWidth = within.width, 1951 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 1952 overLeft = withinOffset - collisionPosLeft, 1953 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, 1954 newOverRight; 1955 1956 // Element is wider than within 1957 if (data.collisionWidth > outerWidth) { 1958 1959 // Element is initially over the left side of within 1960 if (overLeft > 0 && overRight <= 0) { 1961 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - 1962 withinOffset; 1963 position.left += overLeft - newOverRight; 1964 1965 // Element is initially over right side of within 1966 } else if (overRight > 0 && overLeft <= 0) { 1967 position.left = withinOffset; 1968 1969 // Element is initially over both left and right sides of within 1970 } else { 1971 if (overLeft > overRight) { 1972 position.left = withinOffset + outerWidth - data.collisionWidth; 1973 } else { 1974 position.left = withinOffset; 1975 } 1976 } 1977 1978 // Too far left -> align with left edge 1979 } else if (overLeft > 0) { 1980 position.left += overLeft; 1981 1982 // Too far right -> align with right edge 1983 } else if (overRight > 0) { 1984 position.left -= overRight; 1985 1986 // Adjust based on position and margin 1987 } else { 1988 position.left = max(position.left - collisionPosLeft, position.left); 1989 } 1990 }, 1991 top: function (position, data) { 1992 var within = data.within, 1993 withinOffset = within.isWindow ? within.scrollTop : within.offset.top, 1994 outerHeight = data.within.height, 1995 collisionPosTop = position.top - data.collisionPosition.marginTop, 1996 overTop = withinOffset - collisionPosTop, 1997 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, 1998 newOverBottom; 1999 2000 // Element is taller than within 2001 if (data.collisionHeight > outerHeight) { 2002 2003 // Element is initially over the top of within 2004 if (overTop > 0 && overBottom <= 0) { 2005 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - 2006 withinOffset; 2007 position.top += overTop - newOverBottom; 2008 2009 // Element is initially over bottom of within 2010 } else if (overBottom > 0 && overTop <= 0) { 2011 position.top = withinOffset; 2012 2013 // Element is initially over both top and bottom of within 2014 } else { 2015 if (overTop > overBottom) { 2016 position.top = withinOffset + outerHeight - data.collisionHeight; 2017 } else { 2018 position.top = withinOffset; 2019 } 2020 } 2021 2022 // Too far up -> align with top 2023 } else if (overTop > 0) { 2024 position.top += overTop; 2025 2026 // Too far down -> align with bottom edge 2027 } else if (overBottom > 0) { 2028 position.top -= overBottom; 2029 2030 // Adjust based on position and margin 2031 } else { 2032 position.top = max(position.top - collisionPosTop, position.top); 2033 } 2034 } 2035 }, 2036 flip: { 2037 left: function (position, data) { 2038 var within = data.within, 2039 withinOffset = within.offset.left + within.scrollLeft, 2040 outerWidth = within.width, 2041 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, 2042 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 2043 overLeft = collisionPosLeft - offsetLeft, 2044 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, 2045 myOffset = data.my[0] === "left" ? 2046 -data.elemWidth : 2047 data.my[0] === "right" ? 2048 data.elemWidth : 2049 0, 2050 atOffset = data.at[0] === "left" ? 2051 data.targetWidth : 2052 data.at[0] === "right" ? 2053 -data.targetWidth : 2054 0, 2055 offset = -2 * data.offset[0], 2056 newOverRight, 2057 newOverLeft; 2058 2059 if (overLeft < 0) { 2060 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - 2061 outerWidth - withinOffset; 2062 if (newOverRight < 0 || newOverRight < abs(overLeft)) { 2063 position.left += myOffset + atOffset + offset; 2064 } 2065 } else if (overRight > 0) { 2066 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + 2067 atOffset + offset - offsetLeft; 2068 if (newOverLeft > 0 || abs(newOverLeft) < overRight) { 2069 position.left += myOffset + atOffset + offset; 2070 } 2071 } 2072 }, 2073 top: function (position, data) { 2074 var within = data.within, 2075 withinOffset = within.offset.top + within.scrollTop, 2076 outerHeight = within.height, 2077 offsetTop = within.isWindow ? within.scrollTop : within.offset.top, 2078 collisionPosTop = position.top - data.collisionPosition.marginTop, 2079 overTop = collisionPosTop - offsetTop, 2080 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, 2081 top = data.my[1] === "top", 2082 myOffset = top ? 2083 -data.elemHeight : 2084 data.my[1] === "bottom" ? 2085 data.elemHeight : 2086 0, 2087 atOffset = data.at[1] === "top" ? 2088 data.targetHeight : 2089 data.at[1] === "bottom" ? 2090 -data.targetHeight : 2091 0, 2092 offset = -2 * data.offset[1], 2093 newOverTop, 2094 newOverBottom; 2095 if (overTop < 0) { 2096 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - 2097 outerHeight - withinOffset; 2098 if (newOverBottom < 0 || newOverBottom < abs(overTop)) { 2099 position.top += myOffset + atOffset + offset; 2100 } 2101 } else if (overBottom > 0) { 2102 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + 2103 offset - offsetTop; 2104 if (newOverTop > 0 || abs(newOverTop) < overBottom) { 2105 position.top += myOffset + atOffset + offset; 2106 } 2107 } 2108 } 2109 }, 2110 flipfit: { 2111 left: function () { 2112 $.ui.position.flip.left.apply(this, arguments); 2113 $.ui.position.fit.left.apply(this, arguments); 2114 }, 2115 top: function () { 2116 $.ui.position.flip.top.apply(this, arguments); 2117 $.ui.position.fit.top.apply(this, arguments); 2118 } 2119 } 2120 }; 2121 2122 })(); 2123 2124 var position = $.ui.position; 2125 2126 2127 /*! 2128 * jQuery UI :data 1.13.1 2129 * http://jqueryui.com
vendor: 24,520 bytes, lines 2130-3062
2130 * 2131 * Copyright jQuery Foundation and other contributors 2132 * Released under the MIT license. 2133 * http://jquery.org/license 2134 */ 2135 2136 //>>label: :data Selector 2137 //>>group: Core 2138 //>>description: Selects elements which have data stored under the specified key. 2139 //>>docs: http://api.jqueryui.com/data-selector/ 2140 2141 2142 var data = $.extend($.expr.pseudos, { 2143 data: $.expr.createPseudo ? 2144 $.expr.createPseudo(function (dataName) { 2145 return function (elem) { 2146 return !!$.data(elem, dataName); 2147 }; 2148 }) : 2149 2150 // Support: jQuery <1.8 2151 function (elem, i, match) { 2152 return !!$.data(elem, match[3]); 2153 } 2154 }); 2155 2156 /*! 2157 * jQuery UI Disable Selection 1.13.1 2158 * http://jqueryui.com 2159 * 2160 * Copyright jQuery Foundation and other contributors 2161 * Released under the MIT license. 2162 * http://jquery.org/license 2163 */ 2164 2165 //>>label: disableSelection 2166 //>>group: Core 2167 //>>description: Disable selection of text content within the set of matched elements. 2168 //>>docs: http://api.jqueryui.com/disableSelection/ 2169 2170 // This file is deprecated 2171 2172 var disableSelection = $.fn.extend({ 2173 disableSelection: (function () { 2174 var eventType = "onselectstart" in document.createElement("div") ? 2175 "selectstart" : 2176 "mousedown"; 2177 2178 return function () { 2179 return this.on(eventType + ".ui-disableSelection", function (event) { 2180 event.preventDefault(); 2181 }); 2182 }; 2183 })(), 2184 2185 enableSelection: function () { 2186 return this.off(".ui-disableSelection"); 2187 } 2188 }); 2189 2190 2191 /*! 2192 * jQuery UI Focusable 1.13.1 2193 * http://jqueryui.com 2194 * 2195 * Copyright jQuery Foundation and other contributors 2196 * Released under the MIT license. 2197 * http://jquery.org/license 2198 */ 2199 2200 //>>label: :focusable Selector 2201 //>>group: Core 2202 //>>description: Selects elements which can be focused. 2203 //>>docs: http://api.jqueryui.com/focusable-selector/ 2204 2205 2206 // Selectors 2207 $.ui.focusable = function (element, hasTabindex) { 2208 var map, mapName, img, focusableIfVisible, fieldset, 2209 nodeName = element.nodeName.toLowerCase(); 2210 2211 if ("area" === nodeName) { 2212 map = element.parentNode; 2213 mapName = map.name; 2214 if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") { 2215 return false; 2216 } 2217 img = $("img[usemap='#" + mapName + "']"); 2218 return img.length > 0 && img.is(":visible"); 2219 } 2220 2221 if (/^(input|select|textarea|button|object)$/.test(nodeName)) { 2222 focusableIfVisible = !element.disabled; 2223 2224 if (focusableIfVisible) { 2225 2226 // Form controls within a disabled fieldset are disabled. 2227 // However, controls within the fieldset's legend do not get disabled. 2228 // Since controls generally aren't placed inside legends, we skip 2229 // this portion of the check. 2230 fieldset = $(element).closest("fieldset")[0]; 2231 if (fieldset) { 2232 focusableIfVisible = !fieldset.disabled; 2233 } 2234 } 2235 } else if ("a" === nodeName) { 2236 focusableIfVisible = element.href || hasTabindex; 2237 } else { 2238 focusableIfVisible = hasTabindex; 2239 } 2240 2241 return focusableIfVisible && $(element).is(":visible") && visible($(element)); 2242 }; 2243 2244 // Support: IE 8 only 2245 // IE 8 doesn't resolve inherit to visible/hidden for computed values 2246 function visible(element) { 2247 var visibility = element.css("visibility"); 2248 while (visibility === "inherit") { 2249 element = element.parent(); 2250 visibility = element.css("visibility"); 2251 } 2252 return visibility === "visible"; 2253 } 2254 2255 $.extend($.expr.pseudos, { 2256 focusable: function (element) { 2257 return $.ui.focusable(element, $.attr(element, "tabindex") != null); 2258 } 2259 }); 2260 2261 var focusable = $.ui.focusable; 2262 2263 2264 2265 // Support: IE8 Only 2266 // IE8 does not support the form attribute and when it is supplied. It overwrites the form prop 2267 // with a string, so we need to find the proper form. 2268 var form = $.fn._form = function () { 2269 return typeof this[0].form === "string" ? this.closest("form") : $(this[0].form); 2270 }; 2271 2272 2273 /*! 2274 * jQuery UI Form Reset Mixin 1.13.1 2275 * http://jqueryui.com 2276 * 2277 * Copyright jQuery Foundation and other contributors 2278 * Released under the MIT license. 2279 * http://jquery.org/license 2280 */ 2281 2282 //>>label: Form Reset Mixin 2283 //>>group: Core 2284 //>>description: Refresh input widgets when their form is reset 2285 //>>docs: http://api.jqueryui.com/form-reset-mixin/ 2286 2287 2288 var formResetMixin = $.ui.formResetMixin = { 2289 _formResetHandler: function () { 2290 var form = $(this); 2291 2292 // Wait for the form reset to actually happen before refreshing 2293 setTimeout(function () { 2294 var instances = form.data("ui-form-reset-instances"); 2295 $.each(instances, function () { 2296 this.refresh(); 2297 }); 2298 }); 2299 }, 2300 2301 _bindFormResetHandler: function () { 2302 this.form = this.element._form(); 2303 if (!this.form.length) { 2304 return; 2305 } 2306 2307 var instances = this.form.data("ui-form-reset-instances") || []; 2308 if (!instances.length) { 2309 2310 // We don't use _on() here because we use a single event handler per form 2311 this.form.on("reset.ui-form-reset", this._formResetHandler); 2312 } 2313 instances.push(this); 2314 this.form.data("ui-form-reset-instances", instances); 2315 }, 2316 2317 _unbindFormResetHandler: function () { 2318 if (!this.form.length) { 2319 return; 2320 } 2321 2322 var instances = this.form.data("ui-form-reset-instances"); 2323 instances.splice($.inArray(this, instances), 1); 2324 if (instances.length) { 2325 this.form.data("ui-form-reset-instances", instances); 2326 } else { 2327 this.form 2328 .removeData("ui-form-reset-instances") 2329 .off("reset.ui-form-reset"); 2330 } 2331 } 2332 }; 2333 2334 2335 /*! 2336 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.1 2337 * http://jqueryui.com 2338 * 2339 * Copyright jQuery Foundation and other contributors 2340 * Released under the MIT license. 2341 * http://jquery.org/license 2342 * 2343 */ 2344 2345 //>>label: jQuery 1.8+ Support 2346 //>>group: Core 2347 //>>description: Support version 1.8.x and newer of jQuery core 2348 2349 2350 // Support: jQuery 1.9.x or older 2351 // $.expr[ ":" ] is deprecated. 2352 if (!$.expr.pseudos) { 2353 $.expr.pseudos = $.expr[":"]; 2354 } 2355 2356 // Support: jQuery 1.11.x or older 2357 // $.unique has been renamed to $.uniqueSort 2358 if (!$.uniqueSort) { 2359 $.uniqueSort = $.unique; 2360 } 2361 2362 // Support: jQuery 2.2.x or older. 2363 // This method has been defined in jQuery 3.0.0. 2364 // Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js 2365 if (!$.escapeSelector) { 2366 2367 // CSS string/identifier serialization 2368 // https://drafts.csswg.org/cssom/#common-serializing-idioms 2369 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 2370 2371 var fcssescape = function (ch, asCodePoint) { 2372 if (asCodePoint) { 2373 2374 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 2375 if (ch === "\0") { 2376 return "\uFFFD"; 2377 } 2378 2379 // Control characters and (dependent upon position) numbers get escaped as code points 2380 return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; 2381 } 2382 2383 // Other potentially-special ASCII characters get backslash-escaped 2384 return "\\" + ch; 2385 }; 2386 2387 $.escapeSelector = function (sel) { 2388 return (sel + "").replace(rcssescape, fcssescape); 2389 }; 2390 } 2391 2392 // Support: jQuery 3.4.x or older 2393 // These methods have been defined in jQuery 3.5.0. 2394 if (!$.fn.even || !$.fn.odd) { 2395 $.fn.extend({ 2396 even: function () { 2397 return this.filter(function (i) { 2398 return i % 2 === 0; 2399 }); 2400 }, 2401 odd: function () { 2402 return this.filter(function (i) { 2403 return i % 2 === 1; 2404 }); 2405 } 2406 }); 2407 } 2408 2409 ; 2410 /*! 2411 * jQuery UI Keycode 1.13.1 2412 * http://jqueryui.com 2413 * 2414 * Copyright jQuery Foundation and other contributors 2415 * Released under the MIT license. 2416 * http://jquery.org/license 2417 */ 2418 2419 //>>label: Keycode 2420 //>>group: Core 2421 //>>description: Provide keycodes as keynames 2422 //>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ 2423 2424 2425 var keycode = $.ui.keyCode = { 2426 BACKSPACE: 8, 2427 COMMA: 188, 2428 DELETE: 46, 2429 DOWN: 40, 2430 END: 35, 2431 ENTER: 13, 2432 ESCAPE: 27, 2433 HOME: 36, 2434 LEFT: 37, 2435 PAGE_DOWN: 34, 2436 PAGE_UP: 33, 2437 PERIOD: 190, 2438 RIGHT: 39, 2439 SPACE: 32, 2440 TAB: 9, 2441 UP: 38 2442 }; 2443 2444 2445 /*! 2446 * jQuery UI Labels 1.13.1 2447 * http://jqueryui.com 2448 * 2449 * Copyright jQuery Foundation and other contributors 2450 * Released under the MIT license. 2451 * http://jquery.org/license 2452 */ 2453 2454 //>>label: labels 2455 //>>group: Core 2456 //>>description: Find all the labels associated with a given input 2457 //>>docs: http://api.jqueryui.com/labels/ 2458 2459 2460 var labels = $.fn.labels = function () { 2461 var ancestor, selector, id, labels, ancestors; 2462 2463 if (!this.length) { 2464 return this.pushStack([]); 2465 } 2466 2467 // Check control.labels first 2468 if (this[0].labels && this[0].labels.length) { 2469 return this.pushStack(this[0].labels); 2470 } 2471 2472 // Support: IE <= 11, FF <= 37, Android <= 2.3 only 2473 // Above browsers do not support control.labels. Everything below is to support them 2474 // as well as document fragments. control.labels does not work on document fragments 2475 labels = this.eq(0).parents("label"); 2476 2477 // Look for the label based on the id 2478 id = this.attr("id"); 2479 if (id) { 2480 2481 // We don't search against the document in case the element 2482 // is disconnected from the DOM 2483 ancestor = this.eq(0).parents().last(); 2484 2485 // Get a full set of top level ancestors 2486 ancestors = ancestor.add(ancestor.length ? ancestor.siblings() : this.siblings()); 2487 2488 // Create a selector for the label based on the id 2489 selector = "label[for='" + $.escapeSelector(id) + "']"; 2490 2491 labels = labels.add(ancestors.find(selector).addBack(selector)); 2492 2493 } 2494 2495 // Return whatever we have found for labels 2496 return this.pushStack(labels); 2497 }; 2498 2499 2500 /*! 2501 * jQuery UI Scroll Parent 1.13.1 2502 * http://jqueryui.com 2503 * 2504 * Copyright jQuery Foundation and other contributors 2505 * Released under the MIT license. 2506 * http://jquery.org/license 2507 */ 2508 2509 //>>label: scrollParent 2510 //>>group: Core 2511 //>>description: Get the closest ancestor element that is scrollable. 2512 //>>docs: http://api.jqueryui.com/scrollParent/ 2513 2514 2515 var scrollParent = $.fn.scrollParent = function (includeHidden) { 2516 var position = this.css("position"), 2517 excludeStaticParent = position === "absolute", 2518 overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, 2519 scrollParent = this.parents().filter(function () { 2520 var parent = $(this); 2521 if (excludeStaticParent && parent.css("position") === "static") { 2522 return false; 2523 } 2524 return overflowRegex.test(parent.css("overflow") + parent.css("overflow-y") + 2525 parent.css("overflow-x")); 2526 }).eq(0); 2527 2528 return position === "fixed" || !scrollParent.length ? 2529 $(this[0].ownerDocument || document) : 2530 scrollParent; 2531 }; 2532 2533 2534 /*! 2535 * jQuery UI Tabbable 1.13.1 2536 * http://jqueryui.com 2537 * 2538 * Copyright jQuery Foundation and other contributors 2539 * Released under the MIT license. 2540 * http://jquery.org/license 2541 */ 2542 2543 //>>label: :tabbable Selector 2544 //>>group: Core 2545 //>>description: Selects elements which can be tabbed to. 2546 //>>docs: http://api.jqueryui.com/tabbable-selector/ 2547 2548 2549 var tabbable = $.extend($.expr.pseudos, { 2550 tabbable: function (element) { 2551 var tabIndex = $.attr(element, "tabindex"), 2552 hasTabindex = tabIndex != null; 2553 return (!hasTabindex || tabIndex >= 0) && $.ui.focusable(element, hasTabindex); 2554 } 2555 }); 2556 2557 2558 /*! 2559 * jQuery UI Unique ID 1.13.1 2560 * http://jqueryui.com 2561 * 2562 * Copyright jQuery Foundation and other contributors 2563 * Released under the MIT license. 2564 * http://jquery.org/license 2565 */ 2566 2567 //>>label: uniqueId 2568 //>>group: Core 2569 //>>description: Functions to generate and remove uniqueId's 2570 //>>docs: http://api.jqueryui.com/uniqueId/ 2571 2572 2573 var uniqueId = $.fn.extend({ 2574 uniqueId: (function () { 2575 var uuid = 0; 2576 2577 return function () { 2578 return this.each(function () { 2579 if (!this.id) { 2580 this.id = "ui-id-" + (++uuid); 2581 } 2582 }); 2583 }; 2584 })(), 2585 2586 removeUniqueId: function () { 2587 return this.each(function () { 2588 if (/^ui-id-\d+$/.test(this.id)) { 2589 $(this).removeAttr("id"); 2590 } 2591 }); 2592 } 2593 }); 2594 2595 2596 2597 // This file is deprecated 2598 var ie = $.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()); 2599 2600 /*! 2601 * jQuery UI Mouse 1.13.1 2602 * http://jqueryui.com 2603 * 2604 * Copyright jQuery Foundation and other contributors 2605 * Released under the MIT license. 2606 * http://jquery.org/license 2607 */ 2608 2609 //>>label: Mouse 2610 //>>group: Widgets 2611 //>>description: Abstracts mouse-based interactions to assist in creating certain widgets. 2612 //>>docs: http://api.jqueryui.com/mouse/ 2613 2614 2615 var mouseHandled = false; 2616 $(document).on("mouseup", function () { 2617 mouseHandled = false; 2618 }); 2619 2620 var widgetsMouse = $.widget("ui.mouse", { 2621 version: "1.13.1", 2622 options: { 2623 cancel: "input, textarea, button, select, option", 2624 distance: 1, 2625 delay: 0 2626 }, 2627 _mouseInit: function () { 2628 var that = this; 2629 2630 this.element 2631 .on("mousedown." + this.widgetName, function (event) { 2632 return that._mouseDown(event); 2633 }) 2634 .on("click." + this.widgetName, function (event) { 2635 if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { 2636 $.removeData(event.target, that.widgetName + ".preventClickEvent"); 2637 event.stopImmediatePropagation(); 2638 return false; 2639 } 2640 }); 2641 2642 this.started = false; 2643 }, 2644 2645 // TODO: make sure destroying one instance of mouse doesn't mess with 2646 // other instances of mouse 2647 _mouseDestroy: function () { 2648 this.element.off("." + this.widgetName); 2649 if (this._mouseMoveDelegate) { 2650 this.document 2651 .off("mousemove." + this.widgetName, this._mouseMoveDelegate) 2652 .off("mouseup." + this.widgetName, this._mouseUpDelegate); 2653 } 2654 }, 2655 2656 _mouseDown: function (event) { 2657 2658 // don't let more than one widget handle mouseStart 2659 if (mouseHandled) { 2660 return; 2661 } 2662 2663 this._mouseMoved = false; 2664 2665 // We may have missed mouseup (out of window) 2666 if (this._mouseStarted) { 2667 this._mouseUp(event); 2668 } 2669 2670 this._mouseDownEvent = event; 2671 2672 var that = this, 2673 btnIsLeft = (event.which === 1), 2674 2675 // event.target.nodeName works around a bug in IE 8 with 2676 // disabled inputs (#7620) 2677 elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? 2678 $(event.target).closest(this.options.cancel).length : false); 2679 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { 2680 return true; 2681 } 2682 2683 this.mouseDelayMet = !this.options.delay; 2684 if (!this.mouseDelayMet) { 2685 this._mouseDelayTimer = setTimeout(function () { 2686 that.mouseDelayMet = true; 2687 }, this.options.delay); 2688 } 2689 2690 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { 2691 this._mouseStarted = (this._mouseStart(event) !== false); 2692 if (!this._mouseStarted) { 2693 event.preventDefault(); 2694 return true; 2695 } 2696 } 2697 2698 // Click event may never have fired (Gecko & Opera) 2699 if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { 2700 $.removeData(event.target, this.widgetName + ".preventClickEvent"); 2701 } 2702 2703 // These delegates are required to keep context 2704 this._mouseMoveDelegate = function (event) { 2705 return that._mouseMove(event); 2706 }; 2707 this._mouseUpDelegate = function (event) { 2708 return that._mouseUp(event); 2709 }; 2710 2711 this.document 2712 .on("mousemove." + this.widgetName, this._mouseMoveDelegate) 2713 .on("mouseup." + this.widgetName, this._mouseUpDelegate); 2714 2715 event.preventDefault(); 2716 2717 mouseHandled = true; 2718 return true; 2719 }, 2720 2721 _mouseMove: function (event) { 2722 2723 // Only check for mouseups outside the document if you've moved inside the document 2724 // at least once. This prevents the firing of mouseup in the case of IE<9, which will 2725 // fire a mousemove event if content is placed under the cursor. See #7778 2726 // Support: IE <9 2727 if (this._mouseMoved) { 2728 2729 // IE mouseup check - mouseup happened when mouse was out of window 2730 if ($.ui.ie && (!document.documentMode || document.documentMode < 9) && 2731 !event.button) { 2732 return this._mouseUp(event); 2733 2734 // Iframe mouseup check - mouseup occurred in another document 2735 } else if (!event.which) { 2736 2737 // Support: Safari <=8 - 9 2738 // Safari sets which to 0 if you press any of the following keys 2739 // during a drag (#14461) 2740 if (event.originalEvent.altKey || event.originalEvent.ctrlKey || 2741 event.originalEvent.metaKey || event.originalEvent.shiftKey) { 2742 this.ignoreMissingWhich = true; 2743 } else if (!this.ignoreMissingWhich) { 2744 return this._mouseUp(event); 2745 } 2746 } 2747 } 2748 2749 if (event.which || event.button) { 2750 this._mouseMoved = true; 2751 } 2752 2753 if (this._mouseStarted) { 2754 this._mouseDrag(event); 2755 return event.preventDefault(); 2756 } 2757 2758 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { 2759 this._mouseStarted = 2760 (this._mouseStart(this._mouseDownEvent, event) !== false); 2761 if (this._mouseStarted) { 2762 this._mouseDrag(event); 2763 } else { 2764 this._mouseUp(event); 2765 } 2766 } 2767 2768 return !this._mouseStarted; 2769 }, 2770 2771 _mouseUp: function (event) { 2772 this.document 2773 .off("mousemove." + this.widgetName, this._mouseMoveDelegate) 2774 .off("mouseup." + this.widgetName, this._mouseUpDelegate); 2775 2776 if (this._mouseStarted) { 2777 this._mouseStarted = false; 2778 2779 if (event.target === this._mouseDownEvent.target) { 2780 $.data(event.target, this.widgetName + ".preventClickEvent", true); 2781 } 2782 2783 this._mouseStop(event); 2784 } 2785 2786 if (this._mouseDelayTimer) { 2787 clearTimeout(this._mouseDelayTimer); 2788 delete this._mouseDelayTimer; 2789 } 2790 2791 this.ignoreMissingWhich = false; 2792 mouseHandled = false; 2793 event.preventDefault(); 2794 }, 2795 2796 _mouseDistanceMet: function (event) { 2797 return (Math.max( 2798 Math.abs(this._mouseDownEvent.pageX - event.pageX), 2799 Math.abs(this._mouseDownEvent.pageY - event.pageY) 2800 ) >= this.options.distance 2801 ); 2802 }, 2803 2804 _mouseDelayMet: function ( /* event */) { 2805 return this.mouseDelayMet; 2806 }, 2807 2808 // These are placeholder methods, to be overriden by extending plugin 2809 _mouseStart: function ( /* event */) { }, 2810 _mouseDrag: function ( /* event */) { }, 2811 _mouseStop: function ( /* event */) { }, 2812 _mouseCapture: function ( /* event */) { 2813 return true; 2814 } 2815 }); 2816 2817 2818 2819 // $.ui.plugin is deprecated. Use $.widget() extensions instead. 2820 var plugin = $.ui.plugin = { 2821 add: function (module, option, set) { 2822 var i, 2823 proto = $.ui[module].prototype; 2824 for (i in set) { 2825 proto.plugins[i] = proto.plugins[i] || []; 2826 proto.plugins[i].push([option, set[i]]); 2827 } 2828 }, 2829 call: function (instance, name, args, allowDisconnected) { 2830 var i, 2831 set = instance.plugins[name]; 2832 2833 if (!set) { 2834 return; 2835 } 2836 2837 if (!allowDisconnected && (!instance.element[0].parentNode || 2838 instance.element[0].parentNode.nodeType === 11)) { 2839 return; 2840 } 2841 2842 for (i = 0; i < set.length; i++) { 2843 if (instance.options[set[i][0]]) { 2844 set[i][1].apply(instance.element, args); 2845 } 2846 } 2847 } 2848 }; 2849 2850 2851 2852 var safeActiveElement = $.ui.safeActiveElement = function (document) { 2853 var activeElement; 2854 2855 // Support: IE 9 only 2856 // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> 2857 try { 2858 activeElement = document.activeElement; 2859 } catch (error) { 2860 activeElement = document.body; 2861 } 2862 2863 // Support: IE 9 - 11 only 2864 // IE may return null instead of an element 2865 // Interestingly, this only seems to occur when NOT in an iframe 2866 if (!activeElement) { 2867 activeElement = document.body; 2868 } 2869 2870 // Support: IE 11 only 2871 // IE11 returns a seemingly empty object in some cases when accessing 2872 // document.activeElement from an <iframe> 2873 if (!activeElement.nodeName) { 2874 activeElement = document.body; 2875 } 2876 2877 return activeElement; 2878 }; 2879 2880 2881 2882 var safeBlur = $.ui.safeBlur = function (element) { 2883 2884 // Support: IE9 - 10 only 2885 // If the <body> is blurred, IE will switch windows, see #9420 2886 if (element && element.nodeName.toLowerCase() !== "body") { 2887 $(element).trigger("blur"); 2888 } 2889 }; 2890 2891 2892 /*! 2893 * jQuery UI Draggable 1.13.1 2894 * http://jqueryui.com 2895 * 2896 * Copyright jQuery Foundation and other contributors 2897 * Released under the MIT license. 2898 * http://jquery.org/license 2899 */ 2900 2901 //>>label: Draggable 2902 //>>group: Interactions 2903 //>>description: Enables dragging functionality for any element. 2904 //>>docs: http://api.jqueryui.com/draggable/ 2905 //>>demos: http://jqueryui.com/draggable/ 2906 //>>css.structure: ../../themes/base/draggable.css 2907 2908 2909 $.widget("ui.draggable", $.ui.mouse, { 2910 version: "1.13.1", 2911 widgetEventPrefix: "drag", 2912 options: { 2913 addClasses: true, 2914 appendTo: "parent", 2915 axis: false, 2916 connectToSortable: false, 2917 containment: false, 2918 cursor: "auto", 2919 cursorAt: false, 2920 grid: false, 2921 handle: false, 2922 helper: "original", 2923 iframeFix: false, 2924 opacity: false, 2925 refreshPositions: false, 2926 revert: false, 2927 revertDuration: 500, 2928 scope: "default", 2929 scroll: true, 2930 scrollSensitivity: 20, 2931 scrollSpeed: 20, 2932 snap: false, 2933 snapMode: "both", 2934 snapTolerance: 20, 2935 stack: false, 2936 zIndex: false, 2937 2938 // Callbacks 2939 drag: null, 2940 start: null, 2941 stop: null 2942 }, 2943 _create: function () { 2944 2945 if (this.options.helper === "original") { 2946 this._setPositionRelative(); 2947 } 2948 if (this.options.addClasses) { 2949 this._addClass("ui-draggable"); 2950 } 2951 this._setHandleClassName(); 2952 2953 this._mouseInit(); 2954 }, 2955 2956 _setOption: function (key, value) { 2957 this._super(key, value); 2958 if (key === "handle") { 2959 this._removeHandleClassName(); 2960 this._setHandleClassName(); 2961 } 2962 }, 2963 2964 _destroy: function () { 2965 if ((this.helper || this.element).is(".ui-draggable-dragging")) { 2966 this.destroyOnClear = true; 2967 return; 2968 } 2969 this._removeHandleClassName(); 2970 this._mouseDestroy(); 2971 }, 2972 2973 _mouseCapture: function (event) { 2974 var o = this.options; 2975 2976 // Among others, prevent a drag on a resizable-handle 2977 if (this.helper || o.disabled || 2978 $(event.target).closest(".ui-resizable-handle").length > 0) { 2979 return false; 2980 } 2981 2982 //Quit if we're not on a valid handle 2983 this.handle = this._getHandle(event); 2984 if (!this.handle) { 2985 return false; 2986 } 2987 2988 this._blurActiveElement(event); 2989 2990 this._blockFrames(o.iframeFix === true ? "iframe" : o.iframeFix); 2991 2992 return true; 2993 2994 }, 2995 2996 _blockFrames: function (selector) { 2997 this.iframeBlocks = this.document.find(selector).map(function () { 2998 var iframe = $(this); 2999 3000 return $("<div>") 3001 .css("position", "absolute") 3002 .appendTo(iframe.parent()) 3003 .outerWidth(iframe.outerWidth()) 3004 .outerHeight(iframe.outerHeight()) 3005 .offset(iframe.offset())[0]; 3006 }); 3007 }, 3008 3009 _unblockFrames: function () { 3010 if (this.iframeBlocks) { 3011 this.iframeBlocks.remove(); 3012 delete this.iframeBlocks; 3013 } 3014 }, 3015 3016 _blurActiveElement: function (event) { 3017 var activeElement = $.ui.safeActiveElement(this.document[0]), 3018 target = $(event.target); 3019 3020 // Don't blur if the event occurred on an element that is within 3021 // the currently focused element 3022 // See #10527, #12472 3023 if (target.closest(activeElement).length) { 3024 return; 3025 } 3026 3027 // Blur any element that currently has focus, see #4261 3028 $.ui.safeBlur(activeElement); 3029 }, 3030 3031 _mouseStart: function (event) { 3032 3033 var o = this.options; 3034 3035 //Create and append the visible helper 3036 this.helper = this._createHelper(event); 3037 3038 this._addClass(this.helper, "ui-draggable-dragging"); 3039 3040 //Cache the helper size 3041 this._cacheHelperProportions(); 3042 3043 //If ddmanager is used for droppables, set the global draggable 3044 if ($.ui.ddmanager) { 3045 $.ui.ddmanager.current = this; 3046 } 3047 3048 /* 3049 * - Position generation - 3050 * This block generates everything position related - it's the core of draggables. 3051 */ 3052 3053 //Cache the margins of the original element 3054 this._cacheMargins(); 3055 3056 //Store the helper's css position 3057 this.cssPosition = this.helper.css("position"); 3058 this.scrollParent = this.helper.scrollParent(true); 3059 this.offsetParent = this.helper.offsetParent(); 3060 this.hasFixedAncestor = this.helper.parents().filter(function () { 3061 return $(this).css("position") === "fixed"; 3062 }).length > 0;
vendor: 40,924 bytes, lines 3063-4469
3063 3064 //The element's absolute position on the page minus margins 3065 this.positionAbs = this.element.offset(); 3066 this._refreshOffsets(event); 3067 3068 //Generate the original position 3069 this.originalPosition = this.position = this._generatePosition(event, false); 3070 this.originalPageX = event.pageX; 3071 this.originalPageY = event.pageY; 3072 3073 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 3074 if (o.cursorAt) { 3075 this._adjustOffsetFromHelper(o.cursorAt); 3076 } 3077 3078 //Set a containment if given in the options 3079 this._setContainment(); 3080 3081 //Trigger event + callbacks 3082 if (this._trigger("start", event) === false) { 3083 this._clear(); 3084 return false; 3085 } 3086 3087 //Recache the helper size 3088 this._cacheHelperProportions(); 3089 3090 //Prepare the droppable offsets 3091 if ($.ui.ddmanager && !o.dropBehaviour) { 3092 $.ui.ddmanager.prepareOffsets(this, event); 3093 } 3094 3095 // Execute the drag once - this causes the helper not to be visible before getting its 3096 // correct position 3097 this._mouseDrag(event, true); 3098 3099 // If the ddmanager is used for droppables, inform the manager that dragging has started 3100 // (see #5003) 3101 if ($.ui.ddmanager) { 3102 $.ui.ddmanager.dragStart(this, event); 3103 } 3104 3105 return true; 3106 }, 3107 3108 _refreshOffsets: function (event) { 3109 this.offset = { 3110 top: this.positionAbs.top - this.margins.top, 3111 left: this.positionAbs.left - this.margins.left, 3112 scroll: false, 3113 parent: this._getParentOffset(), 3114 relative: this._getRelativeOffset() 3115 }; 3116 3117 this.offset.click = { 3118 left: event.pageX - this.offset.left, 3119 top: event.pageY - this.offset.top 3120 }; 3121 }, 3122 3123 _mouseDrag: function (event, noPropagation) { 3124 3125 // reset any necessary cached properties (see #5009) 3126 if (this.hasFixedAncestor) { 3127 this.offset.parent = this._getParentOffset(); 3128 } 3129 3130 //Compute the helpers position 3131 this.position = this._generatePosition(event, true); 3132 this.positionAbs = this._convertPositionTo("absolute"); 3133 3134 //Call plugins and callbacks and use the resulting position if something is returned 3135 if (!noPropagation) { 3136 var ui = this._uiHash(); 3137 if (this._trigger("drag", event, ui) === false) { 3138 this._mouseUp(new $.Event("mouseup", event)); 3139 return false; 3140 } 3141 this.position = ui.position; 3142 } 3143 3144 this.helper[0].style.left = this.position.left + "px"; 3145 this.helper[0].style.top = this.position.top + "px"; 3146 3147 if ($.ui.ddmanager) { 3148 $.ui.ddmanager.drag(this, event); 3149 } 3150 3151 return false; 3152 }, 3153 3154 _mouseStop: function (event) { 3155 3156 //If we are using droppables, inform the manager about the drop 3157 var that = this, 3158 dropped = false; 3159 if ($.ui.ddmanager && !this.options.dropBehaviour) { 3160 dropped = $.ui.ddmanager.drop(this, event); 3161 } 3162 3163 //if a drop comes from outside (a sortable) 3164 if (this.dropped) { 3165 dropped = this.dropped; 3166 this.dropped = false; 3167 } 3168 3169 if ((this.options.revert === "invalid" && !dropped) || 3170 (this.options.revert === "valid" && dropped) || 3171 this.options.revert === true || (typeof this.options.revert === "function" && 3172 this.options.revert.call(this.element, dropped)) 3173 ) { 3174 $(this.helper).animate( 3175 this.originalPosition, 3176 parseInt(this.options.revertDuration, 10), 3177 function () { 3178 if (that._trigger("stop", event) !== false) { 3179 that._clear(); 3180 } 3181 } 3182 ); 3183 } else { 3184 if (this._trigger("stop", event) !== false) { 3185 this._clear(); 3186 } 3187 } 3188 3189 return false; 3190 }, 3191 3192 _mouseUp: function (event) { 3193 this._unblockFrames(); 3194 3195 // If the ddmanager is used for droppables, inform the manager that dragging has stopped 3196 // (see #5003) 3197 if ($.ui.ddmanager) { 3198 $.ui.ddmanager.dragStop(this, event); 3199 } 3200 3201 // Only need to focus if the event occurred on the draggable itself, see #10527 3202 if (this.handleElement.is(event.target)) { 3203 3204 // The interaction is over; whether or not the click resulted in a drag, 3205 // focus the element 3206 this.element.trigger("focus"); 3207 } 3208 3209 return $.ui.mouse.prototype._mouseUp.call(this, event); 3210 }, 3211 3212 cancel: function () { 3213 3214 if (this.helper.is(".ui-draggable-dragging")) { 3215 this._mouseUp(new $.Event("mouseup", { target: this.element[0] })); 3216 } else { 3217 this._clear(); 3218 } 3219 3220 return this; 3221 3222 }, 3223 3224 _getHandle: function (event) { 3225 return this.options.handle ? 3226 !!$(event.target).closest(this.element.find(this.options.handle)).length : 3227 true; 3228 }, 3229 3230 _setHandleClassName: function () { 3231 this.handleElement = this.options.handle ? 3232 this.element.find(this.options.handle) : this.element; 3233 this._addClass(this.handleElement, "ui-draggable-handle"); 3234 }, 3235 3236 _removeHandleClassName: function () { 3237 this._removeClass(this.handleElement, "ui-draggable-handle"); 3238 }, 3239 3240 _createHelper: function (event) { 3241 3242 var o = this.options, 3243 helperIsFunction = typeof o.helper === "function", 3244 helper = helperIsFunction ? 3245 $(o.helper.apply(this.element[0], [event])) : 3246 (o.helper === "clone" ? 3247 this.element.clone().removeAttr("id") : 3248 this.element); 3249 3250 if (!helper.parents("body").length) { 3251 helper.appendTo((o.appendTo === "parent" ? 3252 this.element[0].parentNode : 3253 o.appendTo)); 3254 } 3255 3256 // Http://bugs.jqueryui.com/ticket/9446 3257 // a helper function can return the original element 3258 // which wouldn't have been set to relative in _create 3259 if (helperIsFunction && helper[0] === this.element[0]) { 3260 this._setPositionRelative(); 3261 } 3262 3263 if (helper[0] !== this.element[0] && 3264 !(/(fixed|absolute)/).test(helper.css("position"))) { 3265 helper.css("position", "absolute"); 3266 } 3267 3268 return helper; 3269 3270 }, 3271 3272 _setPositionRelative: function () { 3273 if (!(/^(?:r|a|f)/).test(this.element.css("position"))) { 3274 this.element[0].style.position = "relative"; 3275 } 3276 }, 3277 3278 _adjustOffsetFromHelper: function (obj) { 3279 if (typeof obj === "string") { 3280 obj = obj.split(" "); 3281 } 3282 if (Array.isArray(obj)) { 3283 obj = { left: +obj[0], top: +obj[1] || 0 }; 3284 } 3285 if ("left" in obj) { 3286 this.offset.click.left = obj.left + this.margins.left; 3287 } 3288 if ("right" in obj) { 3289 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 3290 } 3291 if ("top" in obj) { 3292 this.offset.click.top = obj.top + this.margins.top; 3293 } 3294 if ("bottom" in obj) { 3295 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 3296 } 3297 }, 3298 3299 _isRootNode: function (element) { 3300 return (/(html|body)/i).test(element.tagName) || element === this.document[0]; 3301 }, 3302 3303 _getParentOffset: function () { 3304 3305 //Get the offsetParent and cache its position 3306 var po = this.offsetParent.offset(), 3307 document = this.document[0]; 3308 3309 // This is a special case where we need to modify a offset calculated on start, since the 3310 // following happened: 3311 // 1. The position of the helper is absolute, so it's position is calculated based on the 3312 // next positioned parent 3313 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't 3314 // the document, which means that the scroll is included in the initial calculation of the 3315 // offset of the parent, and never recalculated upon drag 3316 if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && 3317 $.contains(this.scrollParent[0], this.offsetParent[0])) { 3318 po.left += this.scrollParent.scrollLeft(); 3319 po.top += this.scrollParent.scrollTop(); 3320 } 3321 3322 if (this._isRootNode(this.offsetParent[0])) { 3323 po = { top: 0, left: 0 }; 3324 } 3325 3326 return { 3327 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0), 3328 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0) 3329 }; 3330 3331 }, 3332 3333 _getRelativeOffset: function () { 3334 if (this.cssPosition !== "relative") { 3335 return { top: 0, left: 0 }; 3336 } 3337 3338 var p = this.element.position(), 3339 scrollIsRootNode = this._isRootNode(this.scrollParent[0]); 3340 3341 return { 3342 top: p.top - (parseInt(this.helper.css("top"), 10) || 0) + 3343 (!scrollIsRootNode ? this.scrollParent.scrollTop() : 0), 3344 left: p.left - (parseInt(this.helper.css("left"), 10) || 0) + 3345 (!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0) 3346 }; 3347 3348 }, 3349 3350 _cacheMargins: function () { 3351 this.margins = { 3352 left: (parseInt(this.element.css("marginLeft"), 10) || 0), 3353 top: (parseInt(this.element.css("marginTop"), 10) || 0), 3354 right: (parseInt(this.element.css("marginRight"), 10) || 0), 3355 bottom: (parseInt(this.element.css("marginBottom"), 10) || 0) 3356 }; 3357 }, 3358 3359 _cacheHelperProportions: function () { 3360 this.helperProportions = { 3361 width: this.helper.outerWidth(), 3362 height: this.helper.outerHeight() 3363 }; 3364 }, 3365 3366 _setContainment: function () { 3367 3368 var isUserScrollable, c, ce, 3369 o = this.options, 3370 document = this.document[0]; 3371 3372 this.relativeContainer = null; 3373 3374 if (!o.containment) { 3375 this.containment = null; 3376 return; 3377 } 3378 3379 if (o.containment === "window") { 3380 this.containment = [ 3381 $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left, 3382 $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top, 3383 $(window).scrollLeft() + $(window).width() - 3384 this.helperProportions.width - this.margins.left, 3385 $(window).scrollTop() + 3386 ($(window).height() || document.body.parentNode.scrollHeight) - 3387 this.helperProportions.height - this.margins.top 3388 ]; 3389 return; 3390 } 3391 3392 if (o.containment === "document") { 3393 this.containment = [ 3394 0, 3395 0, 3396 $(document).width() - this.helperProportions.width - this.margins.left, 3397 ($(document).height() || document.body.parentNode.scrollHeight) - 3398 this.helperProportions.height - this.margins.top 3399 ]; 3400 return; 3401 } 3402 3403 if (o.containment.constructor === Array) { 3404 this.containment = o.containment; 3405 return; 3406 } 3407 3408 if (o.containment === "parent") { 3409 o.containment = this.helper[0].parentNode; 3410 } 3411 3412 c = $(o.containment); 3413 ce = c[0]; 3414 3415 if (!ce) { 3416 return; 3417 } 3418 3419 isUserScrollable = /(scroll|auto)/.test(c.css("overflow")); 3420 3421 this.containment = [ 3422 (parseInt(c.css("borderLeftWidth"), 10) || 0) + 3423 (parseInt(c.css("paddingLeft"), 10) || 0), 3424 (parseInt(c.css("borderTopWidth"), 10) || 0) + 3425 (parseInt(c.css("paddingTop"), 10) || 0), 3426 (isUserScrollable ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) - 3427 (parseInt(c.css("borderRightWidth"), 10) || 0) - 3428 (parseInt(c.css("paddingRight"), 10) || 0) - 3429 this.helperProportions.width - 3430 this.margins.left - 3431 this.margins.right, 3432 (isUserScrollable ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) - 3433 (parseInt(c.css("borderBottomWidth"), 10) || 0) - 3434 (parseInt(c.css("paddingBottom"), 10) || 0) - 3435 this.helperProportions.height - 3436 this.margins.top - 3437 this.margins.bottom 3438 ]; 3439 this.relativeContainer = c; 3440 }, 3441 3442 _convertPositionTo: function (d, pos) { 3443 3444 if (!pos) { 3445 pos = this.position; 3446 } 3447 3448 var mod = d === "absolute" ? 1 : -1, 3449 scrollIsRootNode = this._isRootNode(this.scrollParent[0]); 3450 3451 return { 3452 top: ( 3453 3454 // The absolute mouse position 3455 pos.top + 3456 3457 // Only for relative positioned nodes: Relative offset from element to offset parent 3458 this.offset.relative.top * mod + 3459 3460 // The offsetParent's offset without borders (offset + border) 3461 this.offset.parent.top * mod - 3462 ((this.cssPosition === "fixed" ? 3463 -this.offset.scroll.top : 3464 (scrollIsRootNode ? 0 : this.offset.scroll.top)) * mod) 3465 ), 3466 left: ( 3467 3468 // The absolute mouse position 3469 pos.left + 3470 3471 // Only for relative positioned nodes: Relative offset from element to offset parent 3472 this.offset.relative.left * mod + 3473 3474 // The offsetParent's offset without borders (offset + border) 3475 this.offset.parent.left * mod - 3476 ((this.cssPosition === "fixed" ? 3477 -this.offset.scroll.left : 3478 (scrollIsRootNode ? 0 : this.offset.scroll.left)) * mod) 3479 ) 3480 }; 3481 3482 }, 3483 3484 _generatePosition: function (event, constrainPosition) { 3485 3486 var containment, co, top, left, 3487 o = this.options, 3488 scrollIsRootNode = this._isRootNode(this.scrollParent[0]), 3489 pageX = event.pageX, 3490 pageY = event.pageY; 3491 3492 // Cache the scroll 3493 if (!scrollIsRootNode || !this.offset.scroll) { 3494 this.offset.scroll = { 3495 top: this.scrollParent.scrollTop(), 3496 left: this.scrollParent.scrollLeft() 3497 }; 3498 } 3499 3500 /* 3501 * - Position constraining - 3502 * Constrain the position to a mix of grid, containment. 3503 */ 3504 3505 // If we are not dragging yet, we won't check for options 3506 if (constrainPosition) { 3507 if (this.containment) { 3508 if (this.relativeContainer) { 3509 co = this.relativeContainer.offset(); 3510 containment = [ 3511 this.containment[0] + co.left, 3512 this.containment[1] + co.top, 3513 this.containment[2] + co.left, 3514 this.containment[3] + co.top 3515 ]; 3516 } else { 3517 containment = this.containment; 3518 } 3519 3520 if (event.pageX - this.offset.click.left < containment[0]) { 3521 pageX = containment[0] + this.offset.click.left; 3522 } 3523 if (event.pageY - this.offset.click.top < containment[1]) { 3524 pageY = containment[1] + this.offset.click.top; 3525 } 3526 if (event.pageX - this.offset.click.left > containment[2]) { 3527 pageX = containment[2] + this.offset.click.left; 3528 } 3529 if (event.pageY - this.offset.click.top > containment[3]) { 3530 pageY = containment[3] + this.offset.click.top; 3531 } 3532 } 3533 3534 if (o.grid) { 3535 3536 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid 3537 // argument errors in IE (see ticket #6950) 3538 top = o.grid[1] ? this.originalPageY + Math.round((pageY - 3539 this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; 3540 pageY = containment ? ((top - this.offset.click.top >= containment[1] || 3541 top - this.offset.click.top > containment[3]) ? 3542 top : 3543 ((top - this.offset.click.top >= containment[1]) ? 3544 top - o.grid[1] : top + o.grid[1])) : top; 3545 3546 left = o.grid[0] ? this.originalPageX + 3547 Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : 3548 this.originalPageX; 3549 pageX = containment ? ((left - this.offset.click.left >= containment[0] || 3550 left - this.offset.click.left > containment[2]) ? 3551 left : 3552 ((left - this.offset.click.left >= containment[0]) ? 3553 left - o.grid[0] : left + o.grid[0])) : left; 3554 } 3555 3556 if (o.axis === "y") { 3557 pageX = this.originalPageX; 3558 } 3559 3560 if (o.axis === "x") { 3561 pageY = this.originalPageY; 3562 } 3563 } 3564 3565 return { 3566 top: ( 3567 3568 // The absolute mouse position 3569 pageY - 3570 3571 // Click offset (relative to the element) 3572 this.offset.click.top - 3573 3574 // Only for relative positioned nodes: Relative offset from element to offset parent 3575 this.offset.relative.top - 3576 3577 // The offsetParent's offset without borders (offset + border) 3578 this.offset.parent.top + 3579 (this.cssPosition === "fixed" ? 3580 -this.offset.scroll.top : 3581 (scrollIsRootNode ? 0 : this.offset.scroll.top)) 3582 ), 3583 left: ( 3584 3585 // The absolute mouse position 3586 pageX - 3587 3588 // Click offset (relative to the element) 3589 this.offset.click.left - 3590 3591 // Only for relative positioned nodes: Relative offset from element to offset parent 3592 this.offset.relative.left - 3593 3594 // The offsetParent's offset without borders (offset + border) 3595 this.offset.parent.left + 3596 (this.cssPosition === "fixed" ? 3597 -this.offset.scroll.left : 3598 (scrollIsRootNode ? 0 : this.offset.scroll.left)) 3599 ) 3600 }; 3601 3602 }, 3603 3604 _clear: function () { 3605 this._removeClass(this.helper, "ui-draggable-dragging"); 3606 if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { 3607 this.helper.remove(); 3608 } 3609 this.helper = null; 3610 this.cancelHelperRemoval = false; 3611 if (this.destroyOnClear) { 3612 this.destroy(); 3613 } 3614 }, 3615 3616 // From now on bulk stuff - mainly helpers 3617 3618 _trigger: function (type, event, ui) { 3619 ui = ui || this._uiHash(); 3620 $.ui.plugin.call(this, type, [event, ui, this], true); 3621 3622 // Absolute position and offset (see #6884 ) have to be recalculated after plugins 3623 if (/^(drag|start|stop)/.test(type)) { 3624 this.positionAbs = this._convertPositionTo("absolute"); 3625 ui.offset = this.positionAbs; 3626 } 3627 return $.Widget.prototype._trigger.call(this, type, event, ui); 3628 }, 3629 3630 plugins: {}, 3631 3632 _uiHash: function () { 3633 return { 3634 helper: this.helper, 3635 position: this.position, 3636 originalPosition: this.originalPosition, 3637 offset: this.positionAbs 3638 }; 3639 } 3640 3641 }); 3642 3643 $.ui.plugin.add("draggable", "connectToSortable", { 3644 start: function (event, ui, draggable) { 3645 var uiSortable = $.extend({}, ui, { 3646 item: draggable.element 3647 }); 3648 3649 draggable.sortables = []; 3650 $(draggable.options.connectToSortable).each(function () { 3651 var sortable = $(this).sortable("instance"); 3652 3653 if (sortable && !sortable.options.disabled) { 3654 draggable.sortables.push(sortable); 3655 3656 // RefreshPositions is called at drag start to refresh the containerCache 3657 // which is used in drag. This ensures it's initialized and synchronized 3658 // with any changes that might have happened on the page since initialization. 3659 sortable.refreshPositions(); 3660 sortable._trigger("activate", event, uiSortable); 3661 } 3662 }); 3663 }, 3664 stop: function (event, ui, draggable) { 3665 var uiSortable = $.extend({}, ui, { 3666 item: draggable.element 3667 }); 3668 3669 draggable.cancelHelperRemoval = false; 3670 3671 $.each(draggable.sortables, function () { 3672 var sortable = this; 3673 3674 if (sortable.isOver) { 3675 sortable.isOver = 0; 3676 3677 // Allow this sortable to handle removing the helper 3678 draggable.cancelHelperRemoval = true; 3679 sortable.cancelHelperRemoval = false; 3680 3681 // Use _storedCSS To restore properties in the sortable, 3682 // as this also handles revert (#9675) since the draggable 3683 // may have modified them in unexpected ways (#8809) 3684 sortable._storedCSS = { 3685 position: sortable.placeholder.css("position"), 3686 top: sortable.placeholder.css("top"), 3687 left: sortable.placeholder.css("left") 3688 }; 3689 3690 sortable._mouseStop(event); 3691 3692 // Once drag has ended, the sortable should return to using 3693 // its original helper, not the shared helper from draggable 3694 sortable.options.helper = sortable.options._helper; 3695 } else { 3696 3697 // Prevent this Sortable from removing the helper. 3698 // However, don't set the draggable to remove the helper 3699 // either as another connected Sortable may yet handle the removal. 3700 sortable.cancelHelperRemoval = true; 3701 3702 sortable._trigger("deactivate", event, uiSortable); 3703 } 3704 }); 3705 }, 3706 drag: function (event, ui, draggable) { 3707 $.each(draggable.sortables, function () { 3708 var innermostIntersecting = false, 3709 sortable = this; 3710 3711 // Copy over variables that sortable's _intersectsWith uses 3712 sortable.positionAbs = draggable.positionAbs; 3713 sortable.helperProportions = draggable.helperProportions; 3714 sortable.offset.click = draggable.offset.click; 3715 3716 if (sortable._intersectsWith(sortable.containerCache)) { 3717 innermostIntersecting = true; 3718 3719 $.each(draggable.sortables, function () { 3720 3721 // Copy over variables that sortable's _intersectsWith uses 3722 this.positionAbs = draggable.positionAbs; 3723 this.helperProportions = draggable.helperProportions; 3724 this.offset.click = draggable.offset.click; 3725 3726 if (this !== sortable && 3727 this._intersectsWith(this.containerCache) && 3728 $.contains(sortable.element[0], this.element[0])) { 3729 innermostIntersecting = false; 3730 } 3731 3732 return innermostIntersecting; 3733 }); 3734 } 3735 3736 if (innermostIntersecting) { 3737 3738 // If it intersects, we use a little isOver variable and set it once, 3739 // so that the move-in stuff gets fired only once. 3740 if (!sortable.isOver) { 3741 sortable.isOver = 1; 3742 3743 // Store draggable's parent in case we need to reappend to it later. 3744 draggable._parent = ui.helper.parent(); 3745 3746 sortable.currentItem = ui.helper 3747 .appendTo(sortable.element) 3748 .data("ui-sortable-item", true); 3749 3750 // Store helper option to later restore it 3751 sortable.options._helper = sortable.options.helper; 3752 3753 sortable.options.helper = function () { 3754 return ui.helper[0]; 3755 }; 3756 3757 // Fire the start events of the sortable with our passed browser event, 3758 // and our own helper (so it doesn't create a new one) 3759 event.target = sortable.currentItem[0]; 3760 sortable._mouseCapture(event, true); 3761 sortable._mouseStart(event, true, true); 3762 3763 // Because the browser event is way off the new appended portlet, 3764 // modify necessary variables to reflect the changes 3765 sortable.offset.click.top = draggable.offset.click.top; 3766 sortable.offset.click.left = draggable.offset.click.left; 3767 sortable.offset.parent.left -= draggable.offset.parent.left - 3768 sortable.offset.parent.left; 3769 sortable.offset.parent.top -= draggable.offset.parent.top - 3770 sortable.offset.parent.top; 3771 3772 draggable._trigger("toSortable", event); 3773 3774 // Inform draggable that the helper is in a valid drop zone, 3775 // used solely in the revert option to handle "valid/invalid". 3776 draggable.dropped = sortable.element; 3777 3778 // Need to refreshPositions of all sortables in the case that 3779 // adding to one sortable changes the location of the other sortables (#9675) 3780 $.each(draggable.sortables, function () { 3781 this.refreshPositions(); 3782 }); 3783 3784 // Hack so receive/update callbacks work (mostly) 3785 draggable.currentItem = draggable.element; 3786 sortable.fromOutside = draggable; 3787 } 3788 3789 if (sortable.currentItem) { 3790 sortable._mouseDrag(event); 3791 3792 // Copy the sortable's position because the draggable's can potentially reflect 3793 // a relative position, while sortable is always absolute, which the dragged 3794 // element has now become. (#8809) 3795 ui.position = sortable.position; 3796 } 3797 } else { 3798 3799 // If it doesn't intersect with the sortable, and it intersected before, 3800 // we fake the drag stop of the sortable, but make sure it doesn't remove 3801 // the helper by using cancelHelperRemoval. 3802 if (sortable.isOver) { 3803 3804 sortable.isOver = 0; 3805 sortable.cancelHelperRemoval = true; 3806 3807 // Calling sortable's mouseStop would trigger a revert, 3808 // so revert must be temporarily false until after mouseStop is called. 3809 sortable.options._revert = sortable.options.revert; 3810 sortable.options.revert = false; 3811 3812 sortable._trigger("out", event, sortable._uiHash(sortable)); 3813 sortable._mouseStop(event, true); 3814 3815 // Restore sortable behaviors that were modfied 3816 // when the draggable entered the sortable area (#9481) 3817 sortable.options.revert = sortable.options._revert; 3818 sortable.options.helper = sortable.options._helper; 3819 3820 if (sortable.placeholder) { 3821 sortable.placeholder.remove(); 3822 } 3823 3824 // Restore and recalculate the draggable's offset considering the sortable 3825 // may have modified them in unexpected ways. (#8809, #10669) 3826 ui.helper.appendTo(draggable._parent); 3827 draggable._refreshOffsets(event); 3828 ui.position = draggable._generatePosition(event, true); 3829 3830 draggable._trigger("fromSortable", event); 3831 3832 // Inform draggable that the helper is no longer in a valid drop zone 3833 draggable.dropped = false; 3834 3835 // Need to refreshPositions of all sortables just in case removing 3836 // from one sortable changes the location of other sortables (#9675) 3837 $.each(draggable.sortables, function () { 3838 this.refreshPositions(); 3839 }); 3840 } 3841 } 3842 }); 3843 } 3844 }); 3845 3846 $.ui.plugin.add("draggable", "cursor", { 3847 start: function (event, ui, instance) { 3848 var t = $("body"), 3849 o = instance.options; 3850 3851 if (t.css("cursor")) { 3852 o._cursor = t.css("cursor"); 3853 } 3854 t.css("cursor", o.cursor); 3855 }, 3856 stop: function (event, ui, instance) { 3857 var o = instance.options; 3858 if (o._cursor) { 3859 $("body").css("cursor", o._cursor); 3860 } 3861 } 3862 }); 3863 3864 $.ui.plugin.add("draggable", "opacity", { 3865 start: function (event, ui, instance) { 3866 var t = $(ui.helper), 3867 o = instance.options; 3868 if (t.css("opacity")) { 3869 o._opacity = t.css("opacity"); 3870 } 3871 t.css("opacity", o.opacity); 3872 }, 3873 stop: function (event, ui, instance) { 3874 var o = instance.options; 3875 if (o._opacity) { 3876 $(ui.helper).css("opacity", o._opacity); 3877 } 3878 } 3879 }); 3880 3881 $.ui.plugin.add("draggable", "scroll", { 3882 start: function (event, ui, i) { 3883 if (!i.scrollParentNotHidden) { 3884 i.scrollParentNotHidden = i.helper.scrollParent(false); 3885 } 3886 3887 if (i.scrollParentNotHidden[0] !== i.document[0] && 3888 i.scrollParentNotHidden[0].tagName !== "HTML") { 3889 i.overflowOffset = i.scrollParentNotHidden.offset(); 3890 } 3891 }, 3892 drag: function (event, ui, i) { 3893 3894 var o = i.options, 3895 scrolled = false, 3896 scrollParent = i.scrollParentNotHidden[0], 3897 document = i.document[0]; 3898 3899 if (scrollParent !== document && scrollParent.tagName !== "HTML") { 3900 if (!o.axis || o.axis !== "x") { 3901 if ((i.overflowOffset.top + scrollParent.offsetHeight) - event.pageY < 3902 o.scrollSensitivity) { 3903 scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed; 3904 } else if (event.pageY - i.overflowOffset.top < o.scrollSensitivity) { 3905 scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed; 3906 } 3907 } 3908 3909 if (!o.axis || o.axis !== "y") { 3910 if ((i.overflowOffset.left + scrollParent.offsetWidth) - event.pageX < 3911 o.scrollSensitivity) { 3912 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed; 3913 } else if (event.pageX - i.overflowOffset.left < o.scrollSensitivity) { 3914 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed; 3915 } 3916 } 3917 3918 } else { 3919 3920 if (!o.axis || o.axis !== "x") { 3921 if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) { 3922 scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); 3923 } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < 3924 o.scrollSensitivity) { 3925 scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); 3926 } 3927 } 3928 3929 if (!o.axis || o.axis !== "y") { 3930 if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { 3931 scrolled = $(document).scrollLeft( 3932 $(document).scrollLeft() - o.scrollSpeed 3933 ); 3934 } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < 3935 o.scrollSensitivity) { 3936 scrolled = $(document).scrollLeft( 3937 $(document).scrollLeft() + o.scrollSpeed 3938 ); 3939 } 3940 } 3941 3942 } 3943 3944 if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { 3945 $.ui.ddmanager.prepareOffsets(i, event); 3946 } 3947 3948 } 3949 }); 3950 3951 $.ui.plugin.add("draggable", "snap", { 3952 start: function (event, ui, i) { 3953 3954 var o = i.options; 3955 3956 i.snapElements = []; 3957 3958 $(o.snap.constructor !== String ? (o.snap.items || ":data(ui-draggable)") : o.snap) 3959 .each(function () { 3960 var $t = $(this), 3961 $o = $t.offset(); 3962 if (this !== i.element[0]) { 3963 i.snapElements.push({ 3964 item: this, 3965 width: $t.outerWidth(), height: $t.outerHeight(), 3966 top: $o.top, left: $o.left 3967 }); 3968 } 3969 }); 3970 3971 }, 3972 drag: function (event, ui, inst) { 3973 3974 var ts, bs, ls, rs, l, r, t, b, i, first, 3975 o = inst.options, 3976 d = o.snapTolerance, 3977 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, 3978 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; 3979 3980 for (i = inst.snapElements.length - 1; i >= 0; i--) { 3981 3982 l = inst.snapElements[i].left - inst.margins.left; 3983 r = l + inst.snapElements[i].width; 3984 t = inst.snapElements[i].top - inst.margins.top; 3985 b = t + inst.snapElements[i].height; 3986 3987 if (x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || 3988 !$.contains(inst.snapElements[i].item.ownerDocument, 3989 inst.snapElements[i].item)) { 3990 if (inst.snapElements[i].snapping) { 3991 if (inst.options.snap.release) { 3992 inst.options.snap.release.call( 3993 inst.element, 3994 event, 3995 $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }) 3996 ); 3997 } 3998 } 3999 inst.snapElements[i].snapping = false; 4000 continue; 4001 } 4002 4003 if (o.snapMode !== "inner") { 4004 ts = Math.abs(t - y2) <= d; 4005 bs = Math.abs(b - y1) <= d; 4006 ls = Math.abs(l - x2) <= d; 4007 rs = Math.abs(r - x1) <= d; 4008 if (ts) { 4009 ui.position.top = inst._convertPositionTo("relative", { 4010 top: t - inst.helperProportions.height, 4011 left: 0 4012 }).top; 4013 } 4014 if (bs) { 4015 ui.position.top = inst._convertPositionTo("relative", { 4016 top: b, 4017 left: 0 4018 }).top; 4019 } 4020 if (ls) { 4021 ui.position.left = inst._convertPositionTo("relative", { 4022 top: 0, 4023 left: l - inst.helperProportions.width 4024 }).left; 4025 } 4026 if (rs) { 4027 ui.position.left = inst._convertPositionTo("relative", { 4028 top: 0, 4029 left: r 4030 }).left; 4031 } 4032 } 4033 4034 first = (ts || bs || ls || rs); 4035 4036 if (o.snapMode !== "outer") { 4037 ts = Math.abs(t - y1) <= d; 4038 bs = Math.abs(b - y2) <= d; 4039 ls = Math.abs(l - x1) <= d; 4040 rs = Math.abs(r - x2) <= d; 4041 if (ts) { 4042 ui.position.top = inst._convertPositionTo("relative", { 4043 top: t, 4044 left: 0 4045 }).top; 4046 } 4047 if (bs) { 4048 ui.position.top = inst._convertPositionTo("relative", { 4049 top: b - inst.helperProportions.height, 4050 left: 0 4051 }).top; 4052 } 4053 if (ls) { 4054 ui.position.left = inst._convertPositionTo("relative", { 4055 top: 0, 4056 left: l 4057 }).left; 4058 } 4059 if (rs) { 4060 ui.position.left = inst._convertPositionTo("relative", { 4061 top: 0, 4062 left: r - inst.helperProportions.width 4063 }).left; 4064 } 4065 } 4066 4067 if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { 4068 if (inst.options.snap.snap) { 4069 inst.options.snap.snap.call( 4070 inst.element, 4071 event, 4072 $.extend(inst._uiHash(), { 4073 snapItem: inst.snapElements[i].item 4074 })); 4075 } 4076 } 4077 inst.snapElements[i].snapping = (ts || bs || ls || rs || first); 4078 4079 } 4080 4081 } 4082 }); 4083 4084 $.ui.plugin.add("draggable", "stack", { 4085 start: function (event, ui, instance) { 4086 var min, 4087 o = instance.options, 4088 group = $.makeArray($(o.stack)).sort(function (a, b) { 4089 return (parseInt($(a).css("zIndex"), 10) || 0) - 4090 (parseInt($(b).css("zIndex"), 10) || 0); 4091 }); 4092 4093 if (!group.length) { 4094 return; 4095 } 4096 4097 min = parseInt($(group[0]).css("zIndex"), 10) || 0; 4098 $(group).each(function (i) { 4099 $(this).css("zIndex", min + i); 4100 }); 4101 this.css("zIndex", (min + group.length)); 4102 } 4103 }); 4104 4105 $.ui.plugin.add("draggable", "zIndex", { 4106 start: function (event, ui, instance) { 4107 var t = $(ui.helper), 4108 o = instance.options; 4109 4110 if (t.css("zIndex")) { 4111 o._zIndex = t.css("zIndex"); 4112 } 4113 t.css("zIndex", o.zIndex); 4114 }, 4115 stop: function (event, ui, instance) { 4116 var o = instance.options; 4117 4118 if (o._zIndex) { 4119 $(ui.helper).css("zIndex", o._zIndex); 4120 } 4121 } 4122 }); 4123 4124 var widgetsDraggable = $.ui.draggable; 4125 4126 4127 /*! 4128 * jQuery UI Droppable 1.13.1 4129 * http://jqueryui.com 4130 * 4131 * Copyright jQuery Foundation and other contributors 4132 * Released under the MIT license. 4133 * http://jquery.org/license 4134 */ 4135 4136 //>>label: Droppable 4137 //>>group: Interactions 4138 //>>description: Enables drop targets for draggable elements. 4139 //>>docs: http://api.jqueryui.com/droppable/ 4140 //>>demos: http://jqueryui.com/droppable/ 4141 4142 4143 $.widget("ui.droppable", { 4144 version: "1.13.1", 4145 widgetEventPrefix: "drop", 4146 options: { 4147 accept: "*", 4148 addClasses: true, 4149 greedy: false, 4150 scope: "default", 4151 tolerance: "intersect", 4152 4153 // Callbacks 4154 activate: null, 4155 deactivate: null, 4156 drop: null, 4157 out: null, 4158 over: null 4159 }, 4160 _create: function () { 4161 4162 var proportions, 4163 o = this.options, 4164 accept = o.accept; 4165 4166 this.isover = false; 4167 this.isout = true; 4168 4169 this.accept = typeof accept === "function" ? accept : function (d) { 4170 return d.is(accept); 4171 }; 4172 4173 this.proportions = function ( /* valueToWrite */) { 4174 if (arguments.length) { 4175 4176 // Store the droppable's proportions 4177 proportions = arguments[0]; 4178 } else { 4179 4180 // Retrieve or derive the droppable's proportions 4181 return proportions ? 4182 proportions : 4183 proportions = { 4184 width: this.element[0].offsetWidth, 4185 height: this.element[0].offsetHeight 4186 }; 4187 } 4188 }; 4189 4190 this._addToManager(o.scope); 4191 4192 if (o.addClasses) { 4193 this._addClass("ui-droppable"); 4194 } 4195 4196 }, 4197 4198 _addToManager: function (scope) { 4199 4200 // Add the reference and positions to the manager 4201 $.ui.ddmanager.droppables[scope] = $.ui.ddmanager.droppables[scope] || []; 4202 $.ui.ddmanager.droppables[scope].push(this); 4203 }, 4204 4205 _splice: function (drop) { 4206 var i = 0; 4207 for (; i < drop.length; i++) { 4208 if (drop[i] === this) { 4209 drop.splice(i, 1); 4210 } 4211 } 4212 }, 4213 4214 _destroy: function () { 4215 var drop = $.ui.ddmanager.droppables[this.options.scope]; 4216 4217 this._splice(drop); 4218 }, 4219 4220 _setOption: function (key, value) { 4221 4222 if (key === "accept") { 4223 this.accept = typeof value === "function" ? value : function (d) { 4224 return d.is(value); 4225 }; 4226 } else if (key === "scope") { 4227 var drop = $.ui.ddmanager.droppables[this.options.scope]; 4228 4229 this._splice(drop); 4230 this._addToManager(value); 4231 } 4232 4233 this._super(key, value); 4234 }, 4235 4236 _activate: function (event) { 4237 var draggable = $.ui.ddmanager.current; 4238 4239 this._addActiveClass(); 4240 if (draggable) { 4241 this._trigger("activate", event, this.ui(draggable)); 4242 } 4243 }, 4244 4245 _deactivate: function (event) { 4246 var draggable = $.ui.ddmanager.current; 4247 4248 this._removeActiveClass(); 4249 if (draggable) { 4250 this._trigger("deactivate", event, this.ui(draggable)); 4251 } 4252 }, 4253 4254 _over: function (event) { 4255 4256 var draggable = $.ui.ddmanager.current; 4257 4258 // Bail if draggable and droppable are same element 4259 if (!draggable || (draggable.currentItem || 4260 draggable.element)[0] === this.element[0]) { 4261 return; 4262 } 4263 4264 if (this.accept.call(this.element[0], (draggable.currentItem || 4265 draggable.element))) { 4266 this._addHoverClass(); 4267 this._trigger("over", event, this.ui(draggable)); 4268 } 4269 4270 }, 4271 4272 _out: function (event) { 4273 4274 var draggable = $.ui.ddmanager.current; 4275 4276 // Bail if draggable and droppable are same element 4277 if (!draggable || (draggable.currentItem || 4278 draggable.element)[0] === this.element[0]) { 4279 return; 4280 } 4281 4282 if (this.accept.call(this.element[0], (draggable.currentItem || 4283 draggable.element))) { 4284 this._removeHoverClass(); 4285 this._trigger("out", event, this.ui(draggable)); 4286 } 4287 4288 }, 4289 4290 _drop: function (event, custom) { 4291 4292 var draggable = custom || $.ui.ddmanager.current, 4293 childrenIntersection = false; 4294 4295 // Bail if draggable and droppable are same element 4296 if (!draggable || (draggable.currentItem || 4297 draggable.element)[0] === this.element[0]) { 4298 return false; 4299 } 4300 4301 this.element 4302 .find(":data(ui-droppable)") 4303 .not(".ui-draggable-dragging") 4304 .each(function () { 4305 var inst = $(this).droppable("instance"); 4306 if ( 4307 inst.options.greedy && 4308 !inst.options.disabled && 4309 inst.options.scope === draggable.options.scope && 4310 inst.accept.call( 4311 inst.element[0], (draggable.currentItem || draggable.element) 4312 ) && 4313 $.ui.intersect( 4314 draggable, 4315 $.extend(inst, { offset: inst.element.offset() }), 4316 inst.options.tolerance, event 4317 ) 4318 ) { 4319 childrenIntersection = true; 4320 return false; 4321 } 4322 }); 4323 if (childrenIntersection) { 4324 return false; 4325 } 4326 4327 if (this.accept.call(this.element[0], 4328 (draggable.currentItem || draggable.element))) { 4329 this._removeActiveClass(); 4330 this._removeHoverClass(); 4331 4332 this._trigger("drop", event, this.ui(draggable)); 4333 return this.element; 4334 } 4335 4336 return false; 4337 4338 }, 4339 4340 ui: function (c) { 4341 return { 4342 draggable: (c.currentItem || c.element), 4343 helper: c.helper, 4344 position: c.position, 4345 offset: c.positionAbs 4346 }; 4347 }, 4348 4349 // Extension points just to make backcompat sane and avoid duplicating logic 4350 // TODO: Remove in 1.14 along with call to it below 4351 _addHoverClass: function () { 4352 this._addClass("ui-droppable-hover"); 4353 }, 4354 4355 _removeHoverClass: function () { 4356 this._removeClass("ui-droppable-hover"); 4357 }, 4358 4359 _addActiveClass: function () { 4360 this._addClass("ui-droppable-active"); 4361 }, 4362 4363 _removeActiveClass: function () { 4364 this._removeClass("ui-droppable-active"); 4365 } 4366 }); 4367 4368 $.ui.intersect = (function () { 4369 function isOverAxis(x, reference, size) { 4370 return (x >= reference) && (x < (reference + size)); 4371 } 4372 4373 return function (draggable, droppable, toleranceMode, event) { 4374 4375 if (!droppable.offset) { 4376 return false; 4377 } 4378 4379 var x1 = (draggable.positionAbs || 4380 draggable.position.absolute).left + draggable.margins.left, 4381 y1 = (draggable.positionAbs || 4382 draggable.position.absolute).top + draggable.margins.top, 4383 x2 = x1 + draggable.helperProportions.width, 4384 y2 = y1 + draggable.helperProportions.height, 4385 l = droppable.offset.left, 4386 t = droppable.offset.top, 4387 r = l + droppable.proportions().width, 4388 b = t + droppable.proportions().height; 4389 4390 switch (toleranceMode) { 4391 case "fit": 4392 return (l <= x1 && x2 <= r && t <= y1 && y2 <= b); 4393 case "intersect": 4394 return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half 4395 x2 - (draggable.helperProportions.width / 2) < r && // Left Half 4396 t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half 4397 y2 - (draggable.helperProportions.height / 2) < b); // Top Half 4398 case "pointer": 4399 return isOverAxis(event.pageY, t, droppable.proportions().height) && 4400 isOverAxis(event.pageX, l, droppable.proportions().width); 4401 case "touch": 4402 return ( 4403 (y1 >= t && y1 <= b) || // Top edge touching 4404 (y2 >= t && y2 <= b) || // Bottom edge touching 4405 (y1 < t && y2 > b) // Surrounded vertically 4406 ) && ( 4407 (x1 >= l && x1 <= r) || // Left edge touching 4408 (x2 >= l && x2 <= r) || // Right edge touching 4409 (x1 < l && x2 > r) // Surrounded horizontally 4410 ); 4411 default: 4412 return false; 4413 } 4414 }; 4415 })(); 4416 4417 /* 4418 This manager tracks offsets of draggables and droppables 4419 */ 4420 $.ui.ddmanager = { 4421 current: null, 4422 droppables: { "default": [] }, 4423 prepareOffsets: function (t, event) { 4424 4425 var i, j, 4426 m = $.ui.ddmanager.droppables[t.options.scope] || [], 4427 type = event ? event.type : null, // workaround for #2317 4428 list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack(); 4429 4430 droppablesLoop: for (i = 0; i < m.length; i++) { 4431 4432 // No disabled and non-accepted 4433 if (m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0], 4434 (t.currentItem || t.element)))) { 4435 continue; 4436 } 4437 4438 // Filter out elements in the current dragged item 4439 for (j = 0; j < list.length; j++) { 4440 if (list[j] === m[i].element[0]) { 4441 m[i].proportions().height = 0; 4442 continue droppablesLoop; 4443 } 4444 } 4445 4446 m[i].visible = m[i].element.css("display") !== "none"; 4447 if (!m[i].visible) { 4448 continue; 4449 } 4450 4451 // Activate the droppable if used directly from draggables 4452 if (type === "mousedown") { 4453 m[i]._activate.call(m[i], event); 4454 } 4455 4456 m[i].offset = m[i].element.offset(); 4457 m[i].proportions({ 4458 width: m[i].element[0].offsetWidth, 4459 height: m[i].element[0].offsetHeight 4460 }); 4461 4462 } 4463 4464 }, 4465 drop: function (draggable, event) { 4466 4467 var dropped = false; 4468 4469 // Create a copy of the droppables in case the list changes during the drop (#9116)
vendor: 22,499 bytes, lines 4470-5325
4470 $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function () { 4471 4472 if (!this.options) { 4473 return; 4474 } 4475 if (!this.options.disabled && this.visible && 4476 $.ui.intersect(draggable, this, this.options.tolerance, event)) { 4477 dropped = this._drop.call(this, event) || dropped; 4478 } 4479 4480 if (!this.options.disabled && this.visible && this.accept.call(this.element[0], 4481 (draggable.currentItem || draggable.element))) { 4482 this.isout = true; 4483 this.isover = false; 4484 this._deactivate.call(this, event); 4485 } 4486 4487 }); 4488 return dropped; 4489 4490 }, 4491 dragStart: function (draggable, event) { 4492 4493 // Listen for scrolling so that if the dragging causes scrolling the position of the 4494 // droppables can be recalculated (see #5003) 4495 draggable.element.parentsUntil("body").on("scroll.droppable", function () { 4496 if (!draggable.options.refreshPositions) { 4497 $.ui.ddmanager.prepareOffsets(draggable, event); 4498 } 4499 }); 4500 }, 4501 drag: function (draggable, event) { 4502 4503 // If you have a highly dynamic page, you might try this option. It renders positions 4504 // every time you move the mouse. 4505 if (draggable.options.refreshPositions) { 4506 $.ui.ddmanager.prepareOffsets(draggable, event); 4507 } 4508 4509 // Run through all droppables and check their positions based on specific tolerance options 4510 $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function () { 4511 4512 if (this.options.disabled || this.greedyChild || !this.visible) { 4513 return; 4514 } 4515 4516 var parentInstance, scope, parent, 4517 intersects = $.ui.intersect(draggable, this, this.options.tolerance, event), 4518 c = !intersects && this.isover ? 4519 "isout" : 4520 (intersects && !this.isover ? "isover" : null); 4521 if (!c) { 4522 return; 4523 } 4524 4525 if (this.options.greedy) { 4526 4527 // find droppable parents with same scope 4528 scope = this.options.scope; 4529 parent = this.element.parents(":data(ui-droppable)").filter(function () { 4530 return $(this).droppable("instance").options.scope === scope; 4531 }); 4532 4533 if (parent.length) { 4534 parentInstance = $(parent[0]).droppable("instance"); 4535 parentInstance.greedyChild = (c === "isover"); 4536 } 4537 } 4538 4539 // We just moved into a greedy child 4540 if (parentInstance && c === "isover") { 4541 parentInstance.isover = false; 4542 parentInstance.isout = true; 4543 parentInstance._out.call(parentInstance, event); 4544 } 4545 4546 this[c] = true; 4547 this[c === "isout" ? "isover" : "isout"] = false; 4548 this[c === "isover" ? "_over" : "_out"].call(this, event); 4549 4550 // We just moved out of a greedy child 4551 if (parentInstance && c === "isout") { 4552 parentInstance.isout = false; 4553 parentInstance.isover = true; 4554 parentInstance._over.call(parentInstance, event); 4555 } 4556 }); 4557 4558 }, 4559 dragStop: function (draggable, event) { 4560 draggable.element.parentsUntil("body").off("scroll.droppable"); 4561 4562 // Call prepareOffsets one final time since IE does not fire return scroll events when 4563 // overflow was caused by drag (see #5003) 4564 if (!draggable.options.refreshPositions) { 4565 $.ui.ddmanager.prepareOffsets(draggable, event); 4566 } 4567 } 4568 }; 4569 4570 // DEPRECATED 4571 // TODO: switch return back to widget declaration at top of file when this is removed 4572 if ($.uiBackCompat !== false) { 4573 4574 // Backcompat for activeClass and hoverClass options 4575 $.widget("ui.droppable", $.ui.droppable, { 4576 options: { 4577 hoverClass: false, 4578 activeClass: false 4579 }, 4580 _addActiveClass: function () { 4581 this._super(); 4582 if (this.options.activeClass) { 4583 this.element.addClass(this.options.activeClass); 4584 } 4585 }, 4586 _removeActiveClass: function () { 4587 this._super(); 4588 if (this.options.activeClass) { 4589 this.element.removeClass(this.options.activeClass); 4590 } 4591 }, 4592 _addHoverClass: function () { 4593 this._super(); 4594 if (this.options.hoverClass) { 4595 this.element.addClass(this.options.hoverClass); 4596 } 4597 }, 4598 _removeHoverClass: function () { 4599 this._super(); 4600 if (this.options.hoverClass) { 4601 this.element.removeClass(this.options.hoverClass); 4602 } 4603 } 4604 }); 4605 } 4606 4607 var widgetsDroppable = $.ui.droppable; 4608 4609 4610 /*! 4611 * jQuery UI Resizable 1.13.1 4612 * http://jqueryui.com 4613 * 4614 * Copyright jQuery Foundation and other contributors 4615 * Released under the MIT license. 4616 * http://jquery.org/license 4617 */ 4618 4619 //>>label: Resizable 4620 //>>group: Interactions 4621 //>>description: Enables resize functionality for any element. 4622 //>>docs: http://api.jqueryui.com/resizable/ 4623 //>>demos: http://jqueryui.com/resizable/ 4624 //>>css.structure: ../../themes/base/core.css 4625 //>>css.structure: ../../themes/base/resizable.css 4626 //>>css.theme: ../../themes/base/theme.css 4627 4628 4629 $.widget("ui.resizable", $.ui.mouse, { 4630 version: "1.13.1", 4631 widgetEventPrefix: "resize", 4632 options: { 4633 alsoResize: false, 4634 animate: false, 4635 animateDuration: "slow", 4636 animateEasing: "swing", 4637 aspectRatio: false, 4638 autoHide: false, 4639 classes: { 4640 "ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se" 4641 }, 4642 containment: false, 4643 ghost: false, 4644 grid: false, 4645 handles: "e,s,se", 4646 helper: false, 4647 maxHeight: null, 4648 maxWidth: null, 4649 minHeight: 10, 4650 minWidth: 10, 4651 4652 // See #7960 4653 zIndex: 90, 4654 4655 // Callbacks 4656 resize: null, 4657 start: null, 4658 stop: null 4659 }, 4660 4661 _num: function (value) { 4662 return parseFloat(value) || 0; 4663 }, 4664 4665 _isNumber: function (value) { 4666 return !isNaN(parseFloat(value)); 4667 }, 4668 4669 _hasScroll: function (el, a) { 4670 4671 if ($(el).css("overflow") === "hidden") { 4672 return false; 4673 } 4674 4675 var scroll = (a && a === "left") ? "scrollLeft" : "scrollTop", 4676 has = false; 4677 4678 if (el[scroll] > 0) { 4679 return true; 4680 } 4681 4682 // TODO: determine which cases actually cause this to happen 4683 // if the element doesn't have the scroll set, see if it's possible to 4684 // set the scroll 4685 try { 4686 el[scroll] = 1; 4687 has = (el[scroll] > 0); 4688 el[scroll] = 0; 4689 } catch (e) { 4690 4691 // `el` might be a string, then setting `scroll` will throw 4692 // an error in strict mode; ignore it. 4693 } 4694 return has; 4695 }, 4696 4697 _create: function () { 4698 4699 var margins, 4700 o = this.options, 4701 that = this; 4702 this._addClass("ui-resizable"); 4703 4704 $.extend(this, { 4705 _aspectRatio: !!(o.aspectRatio), 4706 aspectRatio: o.aspectRatio, 4707 originalElement: this.element, 4708 _proportionallyResizeElements: [], 4709 _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null 4710 }); 4711 4712 // Wrap the element if it cannot hold child nodes 4713 if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) { 4714 4715 this.element.wrap( 4716 $("<div class='ui-wrapper'></div>").css({ 4717 overflow: "hidden", 4718 position: this.element.css("position"), 4719 width: this.element.outerWidth(), 4720 height: this.element.outerHeight(), 4721 top: this.element.css("top"), 4722 left: this.element.css("left") 4723 }) 4724 ); 4725 4726 this.element = this.element.parent().data( 4727 "ui-resizable", this.element.resizable("instance") 4728 ); 4729 4730 this.elementIsWrapper = true; 4731 4732 margins = { 4733 marginTop: this.originalElement.css("marginTop"), 4734 marginRight: this.originalElement.css("marginRight"), 4735 marginBottom: this.originalElement.css("marginBottom"), 4736 marginLeft: this.originalElement.css("marginLeft") 4737 }; 4738 4739 this.element.css(margins); 4740 this.originalElement.css("margin", 0); 4741 4742 // support: Safari 4743 // Prevent Safari textarea resize 4744 this.originalResizeStyle = this.originalElement.css("resize"); 4745 this.originalElement.css("resize", "none"); 4746 4747 this._proportionallyResizeElements.push(this.originalElement.css({ 4748 position: "static", 4749 zoom: 1, 4750 display: "block" 4751 })); 4752 4753 // Support: IE9 4754 // avoid IE jump (hard set the margin) 4755 this.originalElement.css(margins); 4756 4757 this._proportionallyResize(); 4758 } 4759 4760 this._setupHandles(); 4761 4762 if (o.autoHide) { 4763 $(this.element) 4764 .on("mouseenter", function () { 4765 if (o.disabled) { 4766 return; 4767 } 4768 that._removeClass("ui-resizable-autohide"); 4769 that._handles.show(); 4770 }) 4771 .on("mouseleave", function () { 4772 if (o.disabled) { 4773 return; 4774 } 4775 if (!that.resizing) { 4776 that._addClass("ui-resizable-autohide"); 4777 that._handles.hide(); 4778 } 4779 }); 4780 } 4781 4782 this._mouseInit(); 4783 }, 4784 4785 _destroy: function () { 4786 4787 this._mouseDestroy(); 4788 this._addedHandles.remove(); 4789 4790 var wrapper, 4791 _destroy = function (exp) { 4792 $(exp) 4793 .removeData("resizable") 4794 .removeData("ui-resizable") 4795 .off(".resizable"); 4796 }; 4797 4798 // TODO: Unwrap at same DOM position 4799 if (this.elementIsWrapper) { 4800 _destroy(this.element); 4801 wrapper = this.element; 4802 this.originalElement.css({ 4803 position: wrapper.css("position"), 4804 width: wrapper.outerWidth(), 4805 height: wrapper.outerHeight(), 4806 top: wrapper.css("top"), 4807 left: wrapper.css("left") 4808 }).insertAfter(wrapper); 4809 wrapper.remove(); 4810 } 4811 4812 this.originalElement.css("resize", this.originalResizeStyle); 4813 _destroy(this.originalElement); 4814 4815 return this; 4816 }, 4817 4818 _setOption: function (key, value) { 4819 this._super(key, value); 4820 4821 switch (key) { 4822 case "handles": 4823 this._removeHandles(); 4824 this._setupHandles(); 4825 break; 4826 case "aspectRatio": 4827 this._aspectRatio = !!value; 4828 break; 4829 default: 4830 break; 4831 } 4832 }, 4833 4834 _setupHandles: function () { 4835 var o = this.options, handle, i, n, hname, axis, that = this; 4836 this.handles = o.handles || 4837 (!$(".ui-resizable-handle", this.element).length ? 4838 "e,s,se" : { 4839 n: ".ui-resizable-n", 4840 e: ".ui-resizable-e", 4841 s: ".ui-resizable-s", 4842 w: ".ui-resizable-w", 4843 se: ".ui-resizable-se", 4844 sw: ".ui-resizable-sw", 4845 ne: ".ui-resizable-ne", 4846 nw: ".ui-resizable-nw" 4847 }); 4848 4849 this._handles = $(); 4850 this._addedHandles = $(); 4851 if (this.handles.constructor === String) { 4852 4853 if (this.handles === "all") { 4854 this.handles = "n,e,s,w,se,sw,ne,nw"; 4855 } 4856 4857 n = this.handles.split(","); 4858 this.handles = {}; 4859 4860 for (i = 0; i < n.length; i++) { 4861 4862 handle = String.prototype.trim.call(n[i]); 4863 hname = "ui-resizable-" + handle; 4864 axis = $("<div>"); 4865 this._addClass(axis, "ui-resizable-handle " + hname); 4866 4867 axis.css({ zIndex: o.zIndex }); 4868 4869 this.handles[handle] = ".ui-resizable-" + handle; 4870 if (!this.element.children(this.handles[handle]).length) { 4871 this.element.append(axis); 4872 this._addedHandles = this._addedHandles.add(axis); 4873 } 4874 } 4875 4876 } 4877 4878 this._renderAxis = function (target) { 4879 4880 var i, axis, padPos, padWrapper; 4881 4882 target = target || this.element; 4883 4884 for (i in this.handles) { 4885 4886 if (this.handles[i].constructor === String) { 4887 this.handles[i] = this.element.children(this.handles[i]).first().show(); 4888 } else if (this.handles[i].jquery || this.handles[i].nodeType) { 4889 this.handles[i] = $(this.handles[i]); 4890 this._on(this.handles[i], { "mousedown": that._mouseDown }); 4891 } 4892 4893 if (this.elementIsWrapper && 4894 this.originalElement[0] 4895 .nodeName 4896 .match(/^(textarea|input|select|button)$/i)) { 4897 axis = $(this.handles[i], this.element); 4898 4899 padWrapper = /sw|ne|nw|se|n|s/.test(i) ? 4900 axis.outerHeight() : 4901 axis.outerWidth(); 4902 4903 padPos = ["padding", 4904 /ne|nw|n/.test(i) ? "Top" : 4905 /se|sw|s/.test(i) ? "Bottom" : 4906 /^e$/.test(i) ? "Right" : "Left"].join(""); 4907 4908 target.css(padPos, padWrapper); 4909 4910 this._proportionallyResize(); 4911 } 4912 4913 this._handles = this._handles.add(this.handles[i]); 4914 } 4915 }; 4916 4917 // TODO: make renderAxis a prototype function 4918 this._renderAxis(this.element); 4919 4920 this._handles = this._handles.add(this.element.find(".ui-resizable-handle")); 4921 this._handles.disableSelection(); 4922 4923 this._handles.on("mouseover", function () { 4924 if (!that.resizing) { 4925 if (this.className) { 4926 axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); 4927 } 4928 that.axis = axis && axis[1] ? axis[1] : "se"; 4929 } 4930 }); 4931 4932 if (o.autoHide) { 4933 this._handles.hide(); 4934 this._addClass("ui-resizable-autohide"); 4935 } 4936 }, 4937 4938 _removeHandles: function () { 4939 this._addedHandles.remove(); 4940 }, 4941 4942 _mouseCapture: function (event) { 4943 var i, handle, 4944 capture = false; 4945 4946 for (i in this.handles) { 4947 handle = $(this.handles[i])[0]; 4948 if (handle === event.target || $.contains(handle, event.target)) { 4949 capture = true; 4950 } 4951 } 4952 4953 return !this.options.disabled && capture; 4954 }, 4955 4956 _mouseStart: function (event) { 4957 4958 var curleft, curtop, cursor, 4959 o = this.options, 4960 el = this.element; 4961 4962 this.resizing = true; 4963 4964 this._renderProxy(); 4965 4966 curleft = this._num(this.helper.css("left")); 4967 curtop = this._num(this.helper.css("top")); 4968 4969 if (o.containment) { 4970 curleft += $(o.containment).scrollLeft() || 0; 4971 curtop += $(o.containment).scrollTop() || 0; 4972 } 4973 4974 this.offset = this.helper.offset(); 4975 this.position = { left: curleft, top: curtop }; 4976 4977 this.size = this._helper ? { 4978 width: this.helper.width(), 4979 height: this.helper.height() 4980 } : { 4981 width: el.width(), 4982 height: el.height() 4983 }; 4984 4985 this.originalSize = this._helper ? { 4986 width: el.outerWidth(), 4987 height: el.outerHeight() 4988 } : { 4989 width: el.width(), 4990 height: el.height() 4991 }; 4992 4993 this.sizeDiff = { 4994 width: el.outerWidth() - el.width(), 4995 height: el.outerHeight() - el.height() 4996 }; 4997 4998 this.originalPosition = { left: curleft, top: curtop }; 4999 this.originalMousePosition = { left: event.pageX, top: event.pageY }; 5000 5001 this.aspectRatio = (typeof o.aspectRatio === "number") ? 5002 o.aspectRatio : 5003 ((this.originalSize.width / this.originalSize.height) || 1); 5004 5005 cursor = $(".ui-resizable-" + this.axis).css("cursor"); 5006 $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor); 5007 5008 this._addClass("ui-resizable-resizing"); 5009 this._propagate("start", event); 5010 return true; 5011 }, 5012 5013 _mouseDrag: function (event) { 5014 5015 var data, props, 5016 smp = this.originalMousePosition, 5017 a = this.axis, 5018 dx = (event.pageX - smp.left) || 0, 5019 dy = (event.pageY - smp.top) || 0, 5020 trigger = this._change[a]; 5021 5022 this._updatePrevProperties(); 5023 5024 if (!trigger) { 5025 return false; 5026 } 5027 5028 data = trigger.apply(this, [event, dx, dy]); 5029 5030 this._updateVirtualBoundaries(event.shiftKey); 5031 if (this._aspectRatio || event.shiftKey) { 5032 data = this._updateRatio(data, event); 5033 } 5034 5035 data = this._respectSize(data, event); 5036 5037 this._updateCache(data); 5038 5039 this._propagate("resize", event); 5040 5041 props = this._applyChanges(); 5042 5043 if (!this._helper && this._proportionallyResizeElements.length) { 5044 this._proportionallyResize(); 5045 } 5046 5047 if (!$.isEmptyObject(props)) { 5048 this._updatePrevProperties(); 5049 this._trigger("resize", event, this.ui()); 5050 this._applyChanges(); 5051 } 5052 5053 return false; 5054 }, 5055 5056 _mouseStop: function (event) { 5057 5058 this.resizing = false; 5059 var pr, ista, soffseth, soffsetw, s, left, top, 5060 o = this.options, that = this; 5061 5062 if (this._helper) { 5063 5064 pr = this._proportionallyResizeElements; 5065 ista = pr.length && (/textarea/i).test(pr[0].nodeName); 5066 soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height; 5067 soffsetw = ista ? 0 : that.sizeDiff.width; 5068 5069 s = { 5070 width: (that.helper.width() - soffsetw), 5071 height: (that.helper.height() - soffseth) 5072 }; 5073 left = (parseFloat(that.element.css("left")) + 5074 (that.position.left - that.originalPosition.left)) || null; 5075 top = (parseFloat(that.element.css("top")) + 5076 (that.position.top - that.originalPosition.top)) || null; 5077 5078 if (!o.animate) { 5079 this.element.css($.extend(s, { top: top, left: left })); 5080 } 5081 5082 that.helper.height(that.size.height); 5083 that.helper.width(that.size.width); 5084 5085 if (this._helper && !o.animate) { 5086 this._proportionallyResize(); 5087 } 5088 } 5089 5090 $("body").css("cursor", "auto"); 5091 5092 this._removeClass("ui-resizable-resizing"); 5093 5094 this._propagate("stop", event); 5095 5096 if (this._helper) { 5097 this.helper.remove(); 5098 } 5099 5100 return false; 5101 5102 }, 5103 5104 _updatePrevProperties: function () { 5105 this.prevPosition = { 5106 top: this.position.top, 5107 left: this.position.left 5108 }; 5109 this.prevSize = { 5110 width: this.size.width, 5111 height: this.size.height 5112 }; 5113 }, 5114 5115 _applyChanges: function () { 5116 var props = {}; 5117 5118 if (this.position.top !== this.prevPosition.top) { 5119 props.top = this.position.top + "px"; 5120 } 5121 if (this.position.left !== this.prevPosition.left) { 5122 props.left = this.position.left + "px"; 5123 } 5124 if (this.size.width !== this.prevSize.width) { 5125 props.width = this.size.width + "px"; 5126 } 5127 if (this.size.height !== this.prevSize.height) { 5128 props.height = this.size.height + "px"; 5129 } 5130 5131 this.helper.css(props); 5132 5133 return props; 5134 }, 5135 5136 _updateVirtualBoundaries: function (forceAspectRatio) { 5137 var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, 5138 o = this.options; 5139 5140 b = { 5141 minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0, 5142 maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity, 5143 minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0, 5144 maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity 5145 }; 5146 5147 if (this._aspectRatio || forceAspectRatio) { 5148 pMinWidth = b.minHeight * this.aspectRatio; 5149 pMinHeight = b.minWidth / this.aspectRatio; 5150 pMaxWidth = b.maxHeight * this.aspectRatio; 5151 pMaxHeight = b.maxWidth / this.aspectRatio; 5152 5153 if (pMinWidth > b.minWidth) { 5154 b.minWidth = pMinWidth; 5155 } 5156 if (pMinHeight > b.minHeight) { 5157 b.minHeight = pMinHeight; 5158 } 5159 if (pMaxWidth < b.maxWidth) { 5160 b.maxWidth = pMaxWidth; 5161 } 5162 if (pMaxHeight < b.maxHeight) { 5163 b.maxHeight = pMaxHeight; 5164 } 5165 } 5166 this._vBoundaries = b; 5167 }, 5168 5169 _updateCache: function (data) { 5170 this.offset = this.helper.offset(); 5171 if (this._isNumber(data.left)) { 5172 this.position.left = data.left; 5173 } 5174 if (this._isNumber(data.top)) { 5175 this.position.top = data.top; 5176 } 5177 if (this._isNumber(data.height)) { 5178 this.size.height = data.height; 5179 } 5180 if (this._isNumber(data.width)) { 5181 this.size.width = data.width; 5182 } 5183 }, 5184 5185 _updateRatio: function (data) { 5186 5187 var cpos = this.position, 5188 csize = this.size, 5189 a = this.axis; 5190 5191 if (this._isNumber(data.height)) { 5192 data.width = (data.height * this.aspectRatio); 5193 } else if (this._isNumber(data.width)) { 5194 data.height = (data.width / this.aspectRatio); 5195 } 5196 5197 if (a === "sw") { 5198 data.left = cpos.left + (csize.width - data.width); 5199 data.top = null; 5200 } 5201 if (a === "nw") { 5202 data.top = cpos.top + (csize.height - data.height); 5203 data.left = cpos.left + (csize.width - data.width); 5204 } 5205 5206 return data; 5207 }, 5208 5209 _respectSize: function (data) { 5210 5211 var o = this._vBoundaries, 5212 a = this.axis, 5213 ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), 5214 ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), 5215 isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width), 5216 isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height), 5217 dw = this.originalPosition.left + this.originalSize.width, 5218 dh = this.originalPosition.top + this.originalSize.height, 5219 cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); 5220 if (isminw) { 5221 data.width = o.minWidth; 5222 } 5223 if (isminh) { 5224 data.height = o.minHeight; 5225 } 5226 if (ismaxw) { 5227 data.width = o.maxWidth; 5228 } 5229 if (ismaxh) { 5230 data.height = o.maxHeight; 5231 } 5232 5233 if (isminw && cw) { 5234 data.left = dw - o.minWidth; 5235 } 5236 if (ismaxw && cw) { 5237 data.left = dw - o.maxWidth; 5238 } 5239 if (isminh && ch) { 5240 data.top = dh - o.minHeight; 5241 } 5242 if (ismaxh && ch) { 5243 data.top = dh - o.maxHeight; 5244 } 5245 5246 // Fixing jump error on top/left - bug #2330 5247 if (!data.width && !data.height && !data.left && data.top) { 5248 data.top = null; 5249 } else if (!data.width && !data.height && !data.top && data.left) { 5250 data.left = null; 5251 } 5252 5253 return data; 5254 }, 5255 5256 _getPaddingPlusBorderDimensions: function (element) { 5257 var i = 0, 5258 widths = [], 5259 borders = [ 5260 element.css("borderTopWidth"), 5261 element.css("borderRightWidth"), 5262 element.css("borderBottomWidth"), 5263 element.css("borderLeftWidth") 5264 ], 5265 paddings = [ 5266 element.css("paddingTop"), 5267 element.css("paddingRight"), 5268 element.css("paddingBottom"), 5269 element.css("paddingLeft") 5270 ]; 5271 5272 for (; i < 4; i++) { 5273 widths[i] = (parseFloat(borders[i]) || 0); 5274 widths[i] += (parseFloat(paddings[i]) || 0); 5275 } 5276 5277 return { 5278 height: widths[0] + widths[2], 5279 width: widths[1] + widths[3] 5280 }; 5281 }, 5282 5283 _proportionallyResize: function () { 5284 5285 if (!this._proportionallyResizeElements.length) { 5286 return; 5287 } 5288 5289 var prel, 5290 i = 0, 5291 element = this.helper || this.element; 5292 5293 for (; i < this._proportionallyResizeElements.length; i++) { 5294 5295 prel = this._proportionallyResizeElements[i]; 5296 5297 // TODO: Seems like a bug to cache this.outerDimensions 5298 // considering that we are in a loop. 5299 if (!this.outerDimensions) { 5300 this.outerDimensions = this._getPaddingPlusBorderDimensions(prel); 5301 } 5302 5303 prel.css({ 5304 height: (element.height() - this.outerDimensions.height) || 0, 5305 width: (element.width() - this.outerDimensions.width) || 0 5306 }); 5307 5308 } 5309 5310 }, 5311 5312 _renderProxy: function () { 5313 5314 var el = this.element, o = this.options; 5315 this.elementOffset = el.offset(); 5316 5317 if (this._helper) { 5318 5319 this.helper = this.helper || $("<div></div>").css({ overflow: "hidden" }); 5320 5321 this._addClass(this.helper, this._helper); 5322 this.helper.css({ 5323 width: this.element.outerWidth(), 5324 height: this.element.outerHeight(), 5325 position: "absolute",
vendor: 4,474 bytes, lines 5326-5491
5326 left: this.elementOffset.left + "px", 5327 top: this.elementOffset.top + "px", 5328 zIndex: ++o.zIndex //TODO: Don't modify option 5329 }); 5330 5331 this.helper 5332 .appendTo("body") 5333 .disableSelection(); 5334 5335 } else { 5336 this.helper = this.element; 5337 } 5338 5339 }, 5340 5341 _change: { 5342 e: function (event, dx) { 5343 return { width: this.originalSize.width + dx }; 5344 }, 5345 w: function (event, dx) { 5346 var cs = this.originalSize, sp = this.originalPosition; 5347 return { left: sp.left + dx, width: cs.width - dx }; 5348 }, 5349 n: function (event, dx, dy) { 5350 var cs = this.originalSize, sp = this.originalPosition; 5351 return { top: sp.top + dy, height: cs.height - dy }; 5352 }, 5353 s: function (event, dx, dy) { 5354 return { height: this.originalSize.height + dy }; 5355 }, 5356 se: function (event, dx, dy) { 5357 return $.extend(this._change.s.apply(this, arguments), 5358 this._change.e.apply(this, [event, dx, dy])); 5359 }, 5360 sw: function (event, dx, dy) { 5361 return $.extend(this._change.s.apply(this, arguments), 5362 this._change.w.apply(this, [event, dx, dy])); 5363 }, 5364 ne: function (event, dx, dy) { 5365 return $.extend(this._change.n.apply(this, arguments), 5366 this._change.e.apply(this, [event, dx, dy])); 5367 }, 5368 nw: function (event, dx, dy) { 5369 return $.extend(this._change.n.apply(this, arguments), 5370 this._change.w.apply(this, [event, dx, dy])); 5371 } 5372 }, 5373 5374 _propagate: function (n, event) { 5375 $.ui.plugin.call(this, n, [event, this.ui()]); 5376 if (n !== "resize") { 5377 this._trigger(n, event, this.ui()); 5378 } 5379 }, 5380 5381 plugins: {}, 5382 5383 ui: function () { 5384 return { 5385 originalElement: this.originalElement, 5386 element: this.element, 5387 helper: this.helper, 5388 position: this.position, 5389 size: this.size, 5390 originalSize: this.originalSize, 5391 originalPosition: this.originalPosition 5392 }; 5393 } 5394 5395 }); 5396 5397 /* 5398 * Resizable Extensions 5399 */ 5400 5401 $.ui.plugin.add("resizable", "animate", { 5402 5403 stop: function (event) { 5404 var that = $(this).resizable("instance"), 5405 o = that.options, 5406 pr = that._proportionallyResizeElements, 5407 ista = pr.length && (/textarea/i).test(pr[0].nodeName), 5408 soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height, 5409 soffsetw = ista ? 0 : that.sizeDiff.width, 5410 style = { 5411 width: (that.size.width - soffsetw), 5412 height: (that.size.height - soffseth) 5413 }, 5414 left = (parseFloat(that.element.css("left")) + 5415 (that.position.left - that.originalPosition.left)) || null, 5416 top = (parseFloat(that.element.css("top")) + 5417 (that.position.top - that.originalPosition.top)) || null; 5418 5419 that.element.animate( 5420 $.extend(style, top && left ? { top: top, left: left } : {}), { 5421 duration: o.animateDuration, 5422 easing: o.animateEasing, 5423 step: function () { 5424 5425 var data = { 5426 width: parseFloat(that.element.css("width")), 5427 height: parseFloat(that.element.css("height")), 5428 top: parseFloat(that.element.css("top")), 5429 left: parseFloat(that.element.css("left")) 5430 }; 5431 5432 if (pr && pr.length) { 5433 $(pr[0]).css({ width: data.width, height: data.height }); 5434 } 5435 5436 // Propagating resize, and updating values for each animation step 5437 that._updateCache(data); 5438 that._propagate("resize", event); 5439 5440 } 5441 } 5442 ); 5443 } 5444 5445 }); 5446 5447 $.ui.plugin.add("resizable", "containment", { 5448 5449 start: function () { 5450 var element, p, co, ch, cw, width, height, 5451 that = $(this).resizable("instance"), 5452 o = that.options, 5453 el = that.element, 5454 oc = o.containment, 5455 ce = (oc instanceof $) ? 5456 oc.get(0) : 5457 (/parent/.test(oc)) ? el.parent().get(0) : oc; 5458 5459 if (!ce) { 5460 return; 5461 } 5462 5463 that.containerElement = $(ce); 5464 5465 if (/document/.test(oc) || oc === document) { 5466 that.containerOffset = { 5467 left: 0, 5468 top: 0 5469 }; 5470 that.containerPosition = { 5471 left: 0, 5472 top: 0 5473 }; 5474 5475 that.parentData = { 5476 element: $(document), 5477 left: 0, 5478 top: 0, 5479 width: $(document).width(), 5480 height: $(document).height() || document.body.parentNode.scrollHeight 5481 }; 5482 } else { 5483 element = $(ce); 5484 p = []; 5485 $(["Top", "Right", "Left", "Bottom"]).each(function (i, name) { 5486 p[i] = that._num(element.css("padding" + name)); 5487 }); 5488 5489 that.containerOffset = element.offset(); 5490 that.containerPosition = element.position(); 5491 that.containerSize = {
vendor: 4,908 bytes, lines 5492-5662
5492 height: (element.innerHeight() - p[3]), 5493 width: (element.innerWidth() - p[1]) 5494 }; 5495 5496 co = that.containerOffset; 5497 ch = that.containerSize.height; 5498 cw = that.containerSize.width; 5499 width = (that._hasScroll(ce, "left") ? ce.scrollWidth : cw); 5500 height = (that._hasScroll(ce) ? ce.scrollHeight : ch); 5501 5502 that.parentData = { 5503 element: ce, 5504 left: co.left, 5505 top: co.top, 5506 width: width, 5507 height: height 5508 }; 5509 } 5510 }, 5511 5512 resize: function (event) { 5513 var woset, hoset, isParent, isOffsetRelative, 5514 that = $(this).resizable("instance"), 5515 o = that.options, 5516 co = that.containerOffset, 5517 cp = that.position, 5518 pRatio = that._aspectRatio || event.shiftKey, 5519 cop = { 5520 top: 0, 5521 left: 0 5522 }, 5523 ce = that.containerElement, 5524 continueResize = true; 5525 5526 if (ce[0] !== document && (/static/).test(ce.css("position"))) { 5527 cop = co; 5528 } 5529 5530 if (cp.left < (that._helper ? co.left : 0)) { 5531 that.size.width = that.size.width + 5532 (that._helper ? 5533 (that.position.left - co.left) : 5534 (that.position.left - cop.left)); 5535 5536 if (pRatio) { 5537 that.size.height = that.size.width / that.aspectRatio; 5538 continueResize = false; 5539 } 5540 that.position.left = o.helper ? co.left : 0; 5541 } 5542 5543 if (cp.top < (that._helper ? co.top : 0)) { 5544 that.size.height = that.size.height + 5545 (that._helper ? 5546 (that.position.top - co.top) : 5547 that.position.top); 5548 5549 if (pRatio) { 5550 that.size.width = that.size.height * that.aspectRatio; 5551 continueResize = false; 5552 } 5553 that.position.top = that._helper ? co.top : 0; 5554 } 5555 5556 isParent = that.containerElement.get(0) === that.element.parent().get(0); 5557 isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position")); 5558 5559 if (isParent && isOffsetRelative) { 5560 that.offset.left = that.parentData.left + that.position.left; 5561 that.offset.top = that.parentData.top + that.position.top; 5562 } else { 5563 that.offset.left = that.element.offset().left; 5564 that.offset.top = that.element.offset().top; 5565 } 5566 5567 woset = Math.abs(that.sizeDiff.width + 5568 (that._helper ? 5569 that.offset.left - cop.left : 5570 (that.offset.left - co.left))); 5571 5572 hoset = Math.abs(that.sizeDiff.height + 5573 (that._helper ? 5574 that.offset.top - cop.top : 5575 (that.offset.top - co.top))); 5576 5577 if (woset + that.size.width >= that.parentData.width) { 5578 that.size.width = that.parentData.width - woset; 5579 if (pRatio) { 5580 that.size.height = that.size.width / that.aspectRatio; 5581 continueResize = false; 5582 } 5583 } 5584 5585 if (hoset + that.size.height >= that.parentData.height) { 5586 that.size.height = that.parentData.height - hoset; 5587 if (pRatio) { 5588 that.size.width = that.size.height * that.aspectRatio; 5589 continueResize = false; 5590 } 5591 } 5592 5593 if (!continueResize) { 5594 that.position.left = that.prevPosition.left; 5595 that.position.top = that.prevPosition.top; 5596 that.size.width = that.prevSize.width; 5597 that.size.height = that.prevSize.height; 5598 } 5599 }, 5600 5601 stop: function () { 5602 var that = $(this).resizable("instance"), 5603 o = that.options, 5604 co = that.containerOffset, 5605 cop = that.containerPosition, 5606 ce = that.containerElement, 5607 helper = $(that.helper), 5608 ho = helper.offset(), 5609 w = helper.outerWidth() - that.sizeDiff.width, 5610 h = helper.outerHeight() - that.sizeDiff.height; 5611 5612 if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) { 5613 $(this).css({ 5614 left: ho.left - cop.left - co.left, 5615 width: w, 5616 height: h 5617 }); 5618 } 5619 5620 if (that._helper && !o.animate && (/static/).test(ce.css("position"))) { 5621 $(this).css({ 5622 left: ho.left - cop.left - co.left, 5623 width: w, 5624 height: h 5625 }); 5626 } 5627 } 5628 }); 5629 5630 $.ui.plugin.add("resizable", "alsoResize", { 5631 5632 start: function () { 5633 var that = $(this).resizable("instance"), 5634 o = that.options; 5635 5636 $(o.alsoResize).each(function () { 5637 var el = $(this); 5638 el.data("ui-resizable-alsoresize", { 5639 width: parseFloat(el.width()), height: parseFloat(el.height()), 5640 left: parseFloat(el.css("left")), top: parseFloat(el.css("top")) 5641 }); 5642 }); 5643 }, 5644 5645 resize: function (event, ui) { 5646 var that = $(this).resizable("instance"), 5647 o = that.options, 5648 os = that.originalSize, 5649 op = that.originalPosition, 5650 delta = { 5651 height: (that.size.height - os.height) || 0, 5652 width: (that.size.width - os.width) || 0, 5653 top: (that.position.top - op.top) || 0, 5654 left: (that.position.left - op.left) || 0 5655 }; 5656 5657 $(o.alsoResize).each(function () { 5658 var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, 5659 css = el.parents(ui.originalElement[0]).length ? 5660 ["width", "height"] : 5661 ["width", "height", "top", "left"]; 5662
vendor: 5,423 bytes, lines 5663-5872
5663 $.each(css, function (i, prop) { 5664 var sum = (start[prop] || 0) + (delta[prop] || 0); 5665 if (sum && sum >= 0) { 5666 style[prop] = sum || null; 5667 } 5668 }); 5669 5670 el.css(style); 5671 }); 5672 }, 5673 5674 stop: function () { 5675 $(this).removeData("ui-resizable-alsoresize"); 5676 } 5677 }); 5678 5679 $.ui.plugin.add("resizable", "ghost", { 5680 5681 start: function () { 5682 5683 var that = $(this).resizable("instance"), cs = that.size; 5684 5685 that.ghost = that.originalElement.clone(); 5686 that.ghost.css({ 5687 opacity: 0.25, 5688 display: "block", 5689 position: "relative", 5690 height: cs.height, 5691 width: cs.width, 5692 margin: 0, 5693 left: 0, 5694 top: 0 5695 }); 5696 5697 that._addClass(that.ghost, "ui-resizable-ghost"); 5698 5699 // DEPRECATED 5700 // TODO: remove after 1.12 5701 if ($.uiBackCompat !== false && typeof that.options.ghost === "string") { 5702 5703 // Ghost option 5704 that.ghost.addClass(this.options.ghost); 5705 } 5706 5707 that.ghost.appendTo(that.helper); 5708 5709 }, 5710 5711 resize: function () { 5712 var that = $(this).resizable("instance"); 5713 if (that.ghost) { 5714 that.ghost.css({ 5715 position: "relative", 5716 height: that.size.height, 5717 width: that.size.width 5718 }); 5719 } 5720 }, 5721 5722 stop: function () { 5723 var that = $(this).resizable("instance"); 5724 if (that.ghost && that.helper) { 5725 that.helper.get(0).removeChild(that.ghost.get(0)); 5726 } 5727 } 5728 5729 }); 5730 5731 $.ui.plugin.add("resizable", "grid", { 5732 5733 resize: function () { 5734 var outerDimensions, 5735 that = $(this).resizable("instance"), 5736 o = that.options, 5737 cs = that.size, 5738 os = that.originalSize, 5739 op = that.originalPosition, 5740 a = that.axis, 5741 grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid, 5742 gridX = (grid[0] || 1), 5743 gridY = (grid[1] || 1), 5744 ox = Math.round((cs.width - os.width) / gridX) * gridX, 5745 oy = Math.round((cs.height - os.height) / gridY) * gridY, 5746 newWidth = os.width + ox, 5747 newHeight = os.height + oy, 5748 isMaxWidth = o.maxWidth && (o.maxWidth < newWidth), 5749 isMaxHeight = o.maxHeight && (o.maxHeight < newHeight), 5750 isMinWidth = o.minWidth && (o.minWidth > newWidth), 5751 isMinHeight = o.minHeight && (o.minHeight > newHeight); 5752 5753 o.grid = grid; 5754 5755 if (isMinWidth) { 5756 newWidth += gridX; 5757 } 5758 if (isMinHeight) { 5759 newHeight += gridY; 5760 } 5761 if (isMaxWidth) { 5762 newWidth -= gridX; 5763 } 5764 if (isMaxHeight) { 5765 newHeight -= gridY; 5766 } 5767 5768 if (/^(se|s|e)$/.test(a)) { 5769 that.size.width = newWidth; 5770 that.size.height = newHeight; 5771 } else if (/^(ne)$/.test(a)) { 5772 that.size.width = newWidth; 5773 that.size.height = newHeight; 5774 that.position.top = op.top - oy; 5775 } else if (/^(sw)$/.test(a)) { 5776 that.size.width = newWidth; 5777 that.size.height = newHeight; 5778 that.position.left = op.left - ox; 5779 } else { 5780 if (newHeight - gridY <= 0 || newWidth - gridX <= 0) { 5781 outerDimensions = that._getPaddingPlusBorderDimensions(this); 5782 } 5783 5784 if (newHeight - gridY > 0) { 5785 that.size.height = newHeight; 5786 that.position.top = op.top - oy; 5787 } else { 5788 newHeight = gridY - outerDimensions.height; 5789 that.size.height = newHeight; 5790 that.position.top = op.top + os.height - newHeight; 5791 } 5792 if (newWidth - gridX > 0) { 5793 that.size.width = newWidth; 5794 that.position.left = op.left - ox; 5795 } else { 5796 newWidth = gridX - outerDimensions.width; 5797 that.size.width = newWidth; 5798 that.position.left = op.left + os.width - newWidth; 5799 } 5800 } 5801 } 5802 5803 }); 5804 5805 var widgetsResizable = $.ui.resizable; 5806 5807 5808 /*! 5809 * jQuery UI Selectable 1.13.1 5810 * http://jqueryui.com 5811 * 5812 * Copyright jQuery Foundation and other contributors 5813 * Released under the MIT license. 5814 * http://jquery.org/license 5815 */ 5816 5817 //>>label: Selectable 5818 //>>group: Interactions 5819 //>>description: Allows groups of elements to be selected with the mouse. 5820 //>>docs: http://api.jqueryui.com/selectable/ 5821 //>>demos: http://jqueryui.com/selectable/ 5822 //>>css.structure: ../../themes/base/selectable.css 5823 5824 5825 var widgetsSelectable = $.widget("ui.selectable", $.ui.mouse, { 5826 version: "1.13.1", 5827 options: { 5828 appendTo: "body", 5829 autoRefresh: true, 5830 distance: 0, 5831 filter: "*", 5832 tolerance: "touch", 5833 5834 // Callbacks 5835 selected: null, 5836 selecting: null, 5837 start: null, 5838 stop: null, 5839 unselected: null, 5840 unselecting: null 5841 }, 5842 _create: function () { 5843 var that = this; 5844 5845 this._addClass("ui-selectable"); 5846 5847 this.dragged = false; 5848 5849 // Cache selectee children based on filter 5850 this.refresh = function () { 5851 that.elementPos = $(that.element[0]).offset(); 5852 that.selectees = $(that.options.filter, that.element[0]); 5853 that._addClass(that.selectees, "ui-selectee"); 5854 that.selectees.each(function () { 5855 var $this = $(this), 5856 selecteeOffset = $this.offset(), 5857 pos = { 5858 left: selecteeOffset.left - that.elementPos.left, 5859 top: selecteeOffset.top - that.elementPos.top 5860 }; 5861 $.data(this, "selectable-item", { 5862 element: this, 5863 $element: $this, 5864 left: pos.left, 5865 top: pos.top, 5866 right: pos.left + $this.outerWidth(), 5867 bottom: pos.top + $this.outerHeight(), 5868 startselected: false, 5869 selected: $this.hasClass("ui-selected"), 5870 selecting: $this.hasClass("ui-selecting"), 5871 unselecting: $this.hasClass("ui-unselecting") 5872 });
vendor: 10,126 bytes, lines 5873-6268
5873 }); 5874 }; 5875 this.refresh(); 5876 5877 this._mouseInit(); 5878 5879 this.helper = $("<div>"); 5880 this._addClass(this.helper, "ui-selectable-helper"); 5881 }, 5882 5883 _destroy: function () { 5884 this.selectees.removeData("selectable-item"); 5885 this._mouseDestroy(); 5886 }, 5887 5888 _mouseStart: function (event) { 5889 var that = this, 5890 options = this.options; 5891 5892 this.opos = [event.pageX, event.pageY]; 5893 this.elementPos = $(this.element[0]).offset(); 5894 5895 if (this.options.disabled) { 5896 return; 5897 } 5898 5899 this.selectees = $(options.filter, this.element[0]); 5900 5901 this._trigger("start", event); 5902 5903 $(options.appendTo).append(this.helper); 5904 5905 // position helper (lasso) 5906 this.helper.css({ 5907 "left": event.pageX, 5908 "top": event.pageY, 5909 "width": 0, 5910 "height": 0 5911 }); 5912 5913 if (options.autoRefresh) { 5914 this.refresh(); 5915 } 5916 5917 this.selectees.filter(".ui-selected").each(function () { 5918 var selectee = $.data(this, "selectable-item"); 5919 selectee.startselected = true; 5920 if (!event.metaKey && !event.ctrlKey) { 5921 that._removeClass(selectee.$element, "ui-selected"); 5922 selectee.selected = false; 5923 that._addClass(selectee.$element, "ui-unselecting"); 5924 selectee.unselecting = true; 5925 5926 // selectable UNSELECTING callback 5927 that._trigger("unselecting", event, { 5928 unselecting: selectee.element 5929 }); 5930 } 5931 }); 5932 5933 $(event.target).parents().addBack().each(function () { 5934 var doSelect, 5935 selectee = $.data(this, "selectable-item"); 5936 if (selectee) { 5937 doSelect = (!event.metaKey && !event.ctrlKey) || 5938 !selectee.$element.hasClass("ui-selected"); 5939 that._removeClass(selectee.$element, doSelect ? "ui-unselecting" : "ui-selected") 5940 ._addClass(selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting"); 5941 selectee.unselecting = !doSelect; 5942 selectee.selecting = doSelect; 5943 selectee.selected = doSelect; 5944 5945 // selectable (UN)SELECTING callback 5946 if (doSelect) { 5947 that._trigger("selecting", event, { 5948 selecting: selectee.element 5949 }); 5950 } else { 5951 that._trigger("unselecting", event, { 5952 unselecting: selectee.element 5953 }); 5954 } 5955 return false; 5956 } 5957 }); 5958 5959 }, 5960 5961 _mouseDrag: function (event) { 5962 5963 this.dragged = true; 5964 5965 if (this.options.disabled) { 5966 return; 5967 } 5968 5969 var tmp, 5970 that = this, 5971 options = this.options, 5972 x1 = this.opos[0], 5973 y1 = this.opos[1], 5974 x2 = event.pageX, 5975 y2 = event.pageY; 5976 5977 if (x1 > x2) { 5978 tmp = x2; x2 = x1; x1 = tmp; 5979 } 5980 if (y1 > y2) { 5981 tmp = y2; y2 = y1; y1 = tmp; 5982 } 5983 this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 }); 5984 5985 this.selectees.each(function () { 5986 var selectee = $.data(this, "selectable-item"), 5987 hit = false, 5988 offset = {}; 5989 5990 //prevent helper from being selected if appendTo: selectable 5991 if (!selectee || selectee.element === that.element[0]) { 5992 return; 5993 } 5994 5995 offset.left = selectee.left + that.elementPos.left; 5996 offset.right = selectee.right + that.elementPos.left; 5997 offset.top = selectee.top + that.elementPos.top; 5998 offset.bottom = selectee.bottom + that.elementPos.top; 5999 6000 if (options.tolerance === "touch") { 6001 hit = (!(offset.left > x2 || offset.right < x1 || offset.top > y2 || 6002 offset.bottom < y1)); 6003 } else if (options.tolerance === "fit") { 6004 hit = (offset.left > x1 && offset.right < x2 && offset.top > y1 && 6005 offset.bottom < y2); 6006 } 6007 6008 if (hit) { 6009 6010 // SELECT 6011 if (selectee.selected) { 6012 that._removeClass(selectee.$element, "ui-selected"); 6013 selectee.selected = false; 6014 } 6015 if (selectee.unselecting) { 6016 that._removeClass(selectee.$element, "ui-unselecting"); 6017 selectee.unselecting = false; 6018 } 6019 if (!selectee.selecting) { 6020 that._addClass(selectee.$element, "ui-selecting"); 6021 selectee.selecting = true; 6022 6023 // selectable SELECTING callback 6024 that._trigger("selecting", event, { 6025 selecting: selectee.element 6026 }); 6027 } 6028 } else { 6029 6030 // UNSELECT 6031 if (selectee.selecting) { 6032 if ((event.metaKey || event.ctrlKey) && selectee.startselected) { 6033 that._removeClass(selectee.$element, "ui-selecting"); 6034 selectee.selecting = false; 6035 that._addClass(selectee.$element, "ui-selected"); 6036 selectee.selected = true; 6037 } else { 6038 that._removeClass(selectee.$element, "ui-selecting"); 6039 selectee.selecting = false; 6040 if (selectee.startselected) { 6041 that._addClass(selectee.$element, "ui-unselecting"); 6042 selectee.unselecting = true; 6043 } 6044 6045 // selectable UNSELECTING callback 6046 that._trigger("unselecting", event, { 6047 unselecting: selectee.element 6048 }); 6049 } 6050 } 6051 if (selectee.selected) { 6052 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { 6053 that._removeClass(selectee.$element, "ui-selected"); 6054 selectee.selected = false; 6055 6056 that._addClass(selectee.$element, "ui-unselecting"); 6057 selectee.unselecting = true; 6058 6059 // selectable UNSELECTING callback 6060 that._trigger("unselecting", event, { 6061 unselecting: selectee.element 6062 }); 6063 } 6064 } 6065 } 6066 }); 6067 6068 return false; 6069 }, 6070 6071 _mouseStop: function (event) { 6072 var that = this; 6073 6074 this.dragged = false; 6075 6076 $(".ui-unselecting", this.element[0]).each(function () { 6077 var selectee = $.data(this, "selectable-item"); 6078 that._removeClass(selectee.$element, "ui-unselecting"); 6079 selectee.unselecting = false; 6080 selectee.startselected = false; 6081 that._trigger("unselected", event, { 6082 unselected: selectee.element 6083 }); 6084 }); 6085 $(".ui-selecting", this.element[0]).each(function () { 6086 var selectee = $.data(this, "selectable-item"); 6087 that._removeClass(selectee.$element, "ui-selecting") 6088 ._addClass(selectee.$element, "ui-selected"); 6089 selectee.selecting = false; 6090 selectee.selected = true; 6091 selectee.startselected = true; 6092 that._trigger("selected", event, { 6093 selected: selectee.element 6094 }); 6095 }); 6096 this._trigger("stop", event); 6097 6098 this.helper.remove(); 6099 6100 return false; 6101 } 6102 6103 }); 6104 6105 6106 /*! 6107 * jQuery UI Sortable 1.13.1 6108 * http://jqueryui.com 6109 * 6110 * Copyright jQuery Foundation and other contributors 6111 * Released under the MIT license. 6112 * http://jquery.org/license 6113 */ 6114 6115 //>>label: Sortable 6116 //>>group: Interactions 6117 //>>description: Enables items in a list to be sorted using the mouse. 6118 //>>docs: http://api.jqueryui.com/sortable/ 6119 //>>demos: http://jqueryui.com/sortable/ 6120 //>>css.structure: ../../themes/base/sortable.css 6121 6122 6123 var widgetsSortable = $.widget("ui.sortable", $.ui.mouse, { 6124 version: "1.13.1", 6125 widgetEventPrefix: "sort", 6126 ready: false, 6127 options: { 6128 appendTo: "parent", 6129 axis: false, 6130 connectWith: false, 6131 containment: false, 6132 cursor: "auto", 6133 cursorAt: false, 6134 dropOnEmpty: true, 6135 forcePlaceholderSize: false, 6136 forceHelperSize: false, 6137 grid: false, 6138 handle: false, 6139 helper: "original", 6140 items: "> *", 6141 opacity: false, 6142 placeholder: false, 6143 revert: false, 6144 scroll: true, 6145 scrollSensitivity: 20, 6146 scrollSpeed: 20, 6147 scope: "default", 6148 tolerance: "intersect", 6149 zIndex: 1000, 6150 6151 // Callbacks 6152 activate: null, 6153 beforeStop: null, 6154 change: null, 6155 deactivate: null, 6156 out: null, 6157 over: null, 6158 receive: null, 6159 remove: null, 6160 sort: null, 6161 start: null, 6162 stop: null, 6163 update: null 6164 }, 6165 6166 _isOverAxis: function (x, reference, size) { 6167 return (x >= reference) && (x < (reference + size)); 6168 }, 6169 6170 _isFloating: function (item) { 6171 return (/left|right/).test(item.css("float")) || 6172 (/inline|table-cell/).test(item.css("display")); 6173 }, 6174 6175 _create: function () { 6176 this.containerCache = {}; 6177 this._addClass("ui-sortable"); 6178 6179 //Get the items 6180 this.refresh(); 6181 6182 //Let's determine the parent's offset 6183 this.offset = this.element.offset(); 6184 6185 //Initialize mouse events for interaction 6186 this._mouseInit(); 6187 6188 this._setHandleClassName(); 6189 6190 //We're ready to go 6191 this.ready = true; 6192 6193 }, 6194 6195 _setOption: function (key, value) { 6196 this._super(key, value); 6197 6198 if (key === "handle") { 6199 this._setHandleClassName(); 6200 } 6201 }, 6202 6203 _setHandleClassName: function () { 6204 var that = this; 6205 this._removeClass(this.element.find(".ui-sortable-handle"), "ui-sortable-handle"); 6206 $.each(this.items, function () { 6207 that._addClass( 6208 this.instance.options.handle ? 6209 this.item.find(this.instance.options.handle) : 6210 this.item, 6211 "ui-sortable-handle" 6212 ); 6213 }); 6214 }, 6215 6216 _destroy: function () { 6217 this._mouseDestroy(); 6218 6219 for (var i = this.items.length - 1; i >= 0; i--) { 6220 this.items[i].item.removeData(this.widgetName + "-item"); 6221 } 6222 6223 return this; 6224 }, 6225 6226 _mouseCapture: function (event, overrideHandle) { 6227 var currentItem = null, 6228 validHandle = false, 6229 that = this; 6230 6231 if (this.reverting) { 6232 return false; 6233 } 6234 6235 if (this.options.disabled || this.options.type === "static") { 6236 return false; 6237 } 6238 6239 //We have to refresh the items data once first 6240 this._refreshItems(event); 6241 6242 //Find out if the clicked node (or one of its parents) is a actual item in this.items 6243 $(event.target).parents().each(function () { 6244 if ($.data(this, that.widgetName + "-item") === that) { 6245 currentItem = $(this); 6246 return false; 6247 } 6248 }); 6249 if ($.data(event.target, that.widgetName + "-item") === that) { 6250 currentItem = $(event.target); 6251 } 6252 6253 if (!currentItem) { 6254 return false; 6255 } 6256 if (this.options.handle && !overrideHandle) { 6257 $(this.options.handle, currentItem).find("*").addBack().each(function () { 6258 if (this === event.target) { 6259 validHandle = true; 6260 } 6261 }); 6262 if (!validHandle) { 6263 return false; 6264 } 6265 } 6266 6267 this.currentItem = currentItem; 6268 this._removeCurrentsFromItems();
vendor: 8,336 bytes, lines 6269-6540
6269 return true; 6270 6271 }, 6272 6273 _mouseStart: function (event, overrideHandle, noActivation) { 6274 6275 var i, body, 6276 o = this.options; 6277 6278 this.currentContainer = this; 6279 6280 //We only need to call refreshPositions, because the refreshItems call has been moved to 6281 // mouseCapture 6282 this.refreshPositions(); 6283 6284 //Prepare the dragged items parent 6285 this.appendTo = $(o.appendTo !== "parent" ? 6286 o.appendTo : 6287 this.currentItem.parent()); 6288 6289 //Create and append the visible helper 6290 this.helper = this._createHelper(event); 6291 6292 //Cache the helper size 6293 this._cacheHelperProportions(); 6294 6295 /* 6296 * - Position generation - 6297 * This block generates everything position related - it's the core of draggables. 6298 */ 6299 6300 //Cache the margins of the original element 6301 this._cacheMargins(); 6302 6303 //The element's absolute position on the page minus margins 6304 this.offset = this.currentItem.offset(); 6305 this.offset = { 6306 top: this.offset.top - this.margins.top, 6307 left: this.offset.left - this.margins.left 6308 }; 6309 6310 $.extend(this.offset, { 6311 click: { //Where the click happened, relative to the element 6312 left: event.pageX - this.offset.left, 6313 top: event.pageY - this.offset.top 6314 }, 6315 6316 // This is a relative to absolute position minus the actual position calculation - 6317 // only used for relative positioned helper 6318 relative: this._getRelativeOffset() 6319 }); 6320 6321 // After we get the helper offset, but before we get the parent offset we can 6322 // change the helper's position to absolute 6323 // TODO: Still need to figure out a way to make relative sorting possible 6324 this.helper.css("position", "absolute"); 6325 this.cssPosition = this.helper.css("position"); 6326 6327 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 6328 if (o.cursorAt) { 6329 this._adjustOffsetFromHelper(o.cursorAt); 6330 } 6331 6332 //Cache the former DOM position 6333 this.domPosition = { 6334 prev: this.currentItem.prev()[0], 6335 parent: this.currentItem.parent()[0] 6336 }; 6337 6338 // If the helper is not the original, hide the original so it's not playing any role during 6339 // the drag, won't cause anything bad this way 6340 if (this.helper[0] !== this.currentItem[0]) { 6341 this.currentItem.hide(); 6342 } 6343 6344 //Create the placeholder 6345 this._createPlaceholder(); 6346 6347 //Get the next scrolling parent 6348 this.scrollParent = this.placeholder.scrollParent(); 6349 6350 $.extend(this.offset, { 6351 parent: this._getParentOffset() 6352 }); 6353 6354 //Set a containment if given in the options 6355 if (o.containment) { 6356 this._setContainment(); 6357 } 6358 6359 if (o.cursor && o.cursor !== "auto") { // cursor option 6360 body = this.document.find("body"); 6361 6362 // Support: IE 6363 this.storedCursor = body.css("cursor"); 6364 body.css("cursor", o.cursor); 6365 6366 this.storedStylesheet = 6367 $("<style>*{ cursor: " + o.cursor + " !important; }</style>").appendTo(body); 6368 } 6369 6370 // We need to make sure to grab the zIndex before setting the 6371 // opacity, because setting the opacity to anything lower than 1 6372 // causes the zIndex to change from "auto" to 0. 6373 if (o.zIndex) { // zIndex option 6374 if (this.helper.css("zIndex")) { 6375 this._storedZIndex = this.helper.css("zIndex"); 6376 } 6377 this.helper.css("zIndex", o.zIndex); 6378 } 6379 6380 if (o.opacity) { // opacity option 6381 if (this.helper.css("opacity")) { 6382 this._storedOpacity = this.helper.css("opacity"); 6383 } 6384 this.helper.css("opacity", o.opacity); 6385 } 6386 6387 //Prepare scrolling 6388 if (this.scrollParent[0] !== this.document[0] && 6389 this.scrollParent[0].tagName !== "HTML") { 6390 this.overflowOffset = this.scrollParent.offset(); 6391 } 6392 6393 //Call callbacks 6394 this._trigger("start", event, this._uiHash()); 6395 6396 //Recache the helper size 6397 if (!this._preserveHelperProportions) { 6398 this._cacheHelperProportions(); 6399 } 6400 6401 //Post "activate" events to possible containers 6402 if (!noActivation) { 6403 for (i = this.containers.length - 1; i >= 0; i--) { 6404 this.containers[i]._trigger("activate", event, this._uiHash(this)); 6405 } 6406 } 6407 6408 //Prepare possible droppables 6409 if ($.ui.ddmanager) { 6410 $.ui.ddmanager.current = this; 6411 } 6412 6413 if ($.ui.ddmanager && !o.dropBehaviour) { 6414 $.ui.ddmanager.prepareOffsets(this, event); 6415 } 6416 6417 this.dragging = true; 6418 6419 this._addClass(this.helper, "ui-sortable-helper"); 6420 6421 //Move the helper, if needed 6422 if (!this.helper.parent().is(this.appendTo)) { 6423 this.helper.detach().appendTo(this.appendTo); 6424 6425 //Update position 6426 this.offset.parent = this._getParentOffset(); 6427 } 6428 6429 //Generate the original position 6430 this.position = this.originalPosition = this._generatePosition(event); 6431 this.originalPageX = event.pageX; 6432 this.originalPageY = event.pageY; 6433 this.lastPositionAbs = this.positionAbs = this._convertPositionTo("absolute"); 6434 6435 this._mouseDrag(event); 6436 6437 return true; 6438 6439 }, 6440 6441 _scroll: function (event) { 6442 var o = this.options, 6443 scrolled = false; 6444 6445 if (this.scrollParent[0] !== this.document[0] && 6446 this.scrollParent[0].tagName !== "HTML") { 6447 6448 if ((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - 6449 event.pageY < o.scrollSensitivity) { 6450 this.scrollParent[0].scrollTop = 6451 scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; 6452 } else if (event.pageY - this.overflowOffset.top < o.scrollSensitivity) { 6453 this.scrollParent[0].scrollTop = 6454 scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; 6455 } 6456 6457 if ((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - 6458 event.pageX < o.scrollSensitivity) { 6459 this.scrollParent[0].scrollLeft = scrolled = 6460 this.scrollParent[0].scrollLeft + o.scrollSpeed; 6461 } else if (event.pageX - this.overflowOffset.left < o.scrollSensitivity) { 6462 this.scrollParent[0].scrollLeft = scrolled = 6463 this.scrollParent[0].scrollLeft - o.scrollSpeed; 6464 } 6465 6466 } else { 6467 6468 if (event.pageY - this.document.scrollTop() < o.scrollSensitivity) { 6469 scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed); 6470 } else if (this.window.height() - (event.pageY - this.document.scrollTop()) < 6471 o.scrollSensitivity) { 6472 scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed); 6473 } 6474 6475 if (event.pageX - this.document.scrollLeft() < o.scrollSensitivity) { 6476 scrolled = this.document.scrollLeft( 6477 this.document.scrollLeft() - o.scrollSpeed 6478 ); 6479 } else if (this.window.width() - (event.pageX - this.document.scrollLeft()) < 6480 o.scrollSensitivity) { 6481 scrolled = this.document.scrollLeft( 6482 this.document.scrollLeft() + o.scrollSpeed 6483 ); 6484 } 6485 6486 } 6487 6488 return scrolled; 6489 }, 6490 6491 _mouseDrag: function (event) { 6492 var i, item, itemElement, intersection, 6493 o = this.options; 6494 6495 //Compute the helpers position 6496 this.position = this._generatePosition(event); 6497 this.positionAbs = this._convertPositionTo("absolute"); 6498 6499 //Set the helper position 6500 if (!this.options.axis || this.options.axis !== "y") { 6501 this.helper[0].style.left = this.position.left + "px"; 6502 } 6503 if (!this.options.axis || this.options.axis !== "x") { 6504 this.helper[0].style.top = this.position.top + "px"; 6505 } 6506 6507 //Do scrolling 6508 if (o.scroll) { 6509 if (this._scroll(event) !== false) { 6510 6511 //Update item positions used in position checks 6512 this._refreshItemPositions(true); 6513 6514 if ($.ui.ddmanager && !o.dropBehaviour) { 6515 $.ui.ddmanager.prepareOffsets(this, event); 6516 } 6517 } 6518 } 6519 6520 this.dragDirection = { 6521 vertical: this._getDragVerticalDirection(), 6522 horizontal: this._getDragHorizontalDirection() 6523 }; 6524 6525 //Rearrange 6526 for (i = this.items.length - 1; i >= 0; i--) { 6527 6528 //Cache variables and intersection, continue if no intersection 6529 item = this.items[i]; 6530 itemElement = item.item[0]; 6531 intersection = this._intersectsWithPointer(item); 6532 if (!intersection) { 6533 continue; 6534 } 6535 6536 // Only put the placeholder inside the current Container, skip all 6537 // items from other containers. This works because when moving 6538 // an item from one container to another the 6539 // currentContainer is switched before the placeholder is moved. 6540 //
vendor: 15,297 bytes, lines 6541-7051
6541 // Without this, moving items in "sub-sortables" can cause 6542 // the placeholder to jitter between the outer and inner container. 6543 if (item.instance !== this.currentContainer) { 6544 continue; 6545 } 6546 6547 // Cannot intersect with itself 6548 // no useless actions that have been done before 6549 // no action if the item moved is the parent of the item checked 6550 if (itemElement !== this.currentItem[0] && 6551 this.placeholder[intersection === 1 ? 6552 "next" : "prev"]()[0] !== itemElement && 6553 !$.contains(this.placeholder[0], itemElement) && 6554 (this.options.type === "semi-dynamic" ? 6555 !$.contains(this.element[0], itemElement) : 6556 true 6557 ) 6558 ) { 6559 6560 this.direction = intersection === 1 ? "down" : "up"; 6561 6562 if (this.options.tolerance === "pointer" || 6563 this._intersectsWithSides(item)) { 6564 this._rearrange(event, item); 6565 } else { 6566 break; 6567 } 6568 6569 this._trigger("change", event, this._uiHash()); 6570 break; 6571 } 6572 } 6573 6574 //Post events to containers 6575 this._contactContainers(event); 6576 6577 //Interconnect with droppables 6578 if ($.ui.ddmanager) { 6579 $.ui.ddmanager.drag(this, event); 6580 } 6581 6582 //Call callbacks 6583 this._trigger("sort", event, this._uiHash()); 6584 6585 this.lastPositionAbs = this.positionAbs; 6586 return false; 6587 6588 }, 6589 6590 _mouseStop: function (event, noPropagation) { 6591 6592 if (!event) { 6593 return; 6594 } 6595 6596 //If we are using droppables, inform the manager about the drop 6597 if ($.ui.ddmanager && !this.options.dropBehaviour) { 6598 $.ui.ddmanager.drop(this, event); 6599 } 6600 6601 if (this.options.revert) { 6602 var that = this, 6603 cur = this.placeholder.offset(), 6604 axis = this.options.axis, 6605 animation = {}; 6606 6607 if (!axis || axis === "x") { 6608 animation.left = cur.left - this.offset.parent.left - this.margins.left + 6609 (this.offsetParent[0] === this.document[0].body ? 6610 0 : 6611 this.offsetParent[0].scrollLeft 6612 ); 6613 } 6614 if (!axis || axis === "y") { 6615 animation.top = cur.top - this.offset.parent.top - this.margins.top + 6616 (this.offsetParent[0] === this.document[0].body ? 6617 0 : 6618 this.offsetParent[0].scrollTop 6619 ); 6620 } 6621 this.reverting = true; 6622 $(this.helper).animate( 6623 animation, 6624 parseInt(this.options.revert, 10) || 500, 6625 function () { 6626 that._clear(event); 6627 } 6628 ); 6629 } else { 6630 this._clear(event, noPropagation); 6631 } 6632 6633 return false; 6634 6635 }, 6636 6637 cancel: function () { 6638 6639 if (this.dragging) { 6640 6641 this._mouseUp(new $.Event("mouseup", { target: null })); 6642 6643 if (this.options.helper === "original") { 6644 this.currentItem.css(this._storedCSS); 6645 this._removeClass(this.currentItem, "ui-sortable-helper"); 6646 } else { 6647 this.currentItem.show(); 6648 } 6649 6650 //Post deactivating events to containers 6651 for (var i = this.containers.length - 1; i >= 0; i--) { 6652 this.containers[i]._trigger("deactivate", null, this._uiHash(this)); 6653 if (this.containers[i].containerCache.over) { 6654 this.containers[i]._trigger("out", null, this._uiHash(this)); 6655 this.containers[i].containerCache.over = 0; 6656 } 6657 } 6658 6659 } 6660 6661 if (this.placeholder) { 6662 6663 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, 6664 // it unbinds ALL events from the original node! 6665 if (this.placeholder[0].parentNode) { 6666 this.placeholder[0].parentNode.removeChild(this.placeholder[0]); 6667 } 6668 if (this.options.helper !== "original" && this.helper && 6669 this.helper[0].parentNode) { 6670 this.helper.remove(); 6671 } 6672 6673 $.extend(this, { 6674 helper: null, 6675 dragging: false, 6676 reverting: false, 6677 _noFinalSort: null 6678 }); 6679 6680 if (this.domPosition.prev) { 6681 $(this.domPosition.prev).after(this.currentItem); 6682 } else { 6683 $(this.domPosition.parent).prepend(this.currentItem); 6684 } 6685 } 6686 6687 return this; 6688 6689 }, 6690 6691 serialize: function (o) { 6692 6693 var items = this._getItemsAsjQuery(o && o.connected), 6694 str = []; 6695 o = o || {}; 6696 6697 $(items).each(function () { 6698 var res = ($(o.item || this).attr(o.attribute || "id") || "") 6699 .match(o.expression || (/(.+)[\-=_](.+)/)); 6700 if (res) { 6701 str.push( 6702 (o.key || res[1] + "[]") + 6703 "=" + (o.key && o.expression ? res[1] : res[2])); 6704 } 6705 }); 6706 6707 if (!str.length && o.key) { 6708 str.push(o.key + "="); 6709 } 6710 6711 return str.join("&"); 6712 6713 }, 6714 6715 toArray: function (o) { 6716 6717 var items = this._getItemsAsjQuery(o && o.connected), 6718 ret = []; 6719 6720 o = o || {}; 6721 6722 items.each(function () { 6723 ret.push($(o.item || this).attr(o.attribute || "id") || ""); 6724 }); 6725 return ret; 6726 6727 }, 6728 6729 /* Be careful with the following core functions */ 6730 _intersectsWith: function (item) { 6731 6732 var x1 = this.positionAbs.left, 6733 x2 = x1 + this.helperProportions.width, 6734 y1 = this.positionAbs.top, 6735 y2 = y1 + this.helperProportions.height, 6736 l = item.left, 6737 r = l + item.width, 6738 t = item.top, 6739 b = t + item.height, 6740 dyClick = this.offset.click.top, 6741 dxClick = this.offset.click.left, 6742 isOverElementHeight = (this.options.axis === "x") || ((y1 + dyClick) > t && 6743 (y1 + dyClick) < b), 6744 isOverElementWidth = (this.options.axis === "y") || ((x1 + dxClick) > l && 6745 (x1 + dxClick) < r), 6746 isOverElement = isOverElementHeight && isOverElementWidth; 6747 6748 if (this.options.tolerance === "pointer" || 6749 this.options.forcePointerForContainers || 6750 (this.options.tolerance !== "pointer" && 6751 this.helperProportions[this.floating ? "width" : "height"] > 6752 item[this.floating ? "width" : "height"]) 6753 ) { 6754 return isOverElement; 6755 } else { 6756 6757 return (l < x1 + (this.helperProportions.width / 2) && // Right Half 6758 x2 - (this.helperProportions.width / 2) < r && // Left Half 6759 t < y1 + (this.helperProportions.height / 2) && // Bottom Half 6760 y2 - (this.helperProportions.height / 2) < b); // Top Half 6761 6762 } 6763 }, 6764 6765 _intersectsWithPointer: function (item) { 6766 var verticalDirection, horizontalDirection, 6767 isOverElementHeight = (this.options.axis === "x") || 6768 this._isOverAxis( 6769 this.positionAbs.top + this.offset.click.top, item.top, item.height), 6770 isOverElementWidth = (this.options.axis === "y") || 6771 this._isOverAxis( 6772 this.positionAbs.left + this.offset.click.left, item.left, item.width), 6773 isOverElement = isOverElementHeight && isOverElementWidth; 6774 6775 if (!isOverElement) { 6776 return false; 6777 } 6778 6779 verticalDirection = this.dragDirection.vertical; 6780 horizontalDirection = this.dragDirection.horizontal; 6781 6782 return this.floating ? 6783 ((horizontalDirection === "right" || verticalDirection === "down") ? 2 : 1) : 6784 (verticalDirection && (verticalDirection === "down" ? 2 : 1)); 6785 6786 }, 6787 6788 _intersectsWithSides: function (item) { 6789 6790 var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + 6791 this.offset.click.top, item.top + (item.height / 2), item.height), 6792 isOverRightHalf = this._isOverAxis(this.positionAbs.left + 6793 this.offset.click.left, item.left + (item.width / 2), item.width), 6794 verticalDirection = this.dragDirection.vertical, 6795 horizontalDirection = this.dragDirection.horizontal; 6796 6797 if (this.floating && horizontalDirection) { 6798 return ((horizontalDirection === "right" && isOverRightHalf) || 6799 (horizontalDirection === "left" && !isOverRightHalf)); 6800 } else { 6801 return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || 6802 (verticalDirection === "up" && !isOverBottomHalf)); 6803 } 6804 6805 }, 6806 6807 _getDragVerticalDirection: function () { 6808 var delta = this.positionAbs.top - this.lastPositionAbs.top; 6809 return delta !== 0 && (delta > 0 ? "down" : "up"); 6810 }, 6811 6812 _getDragHorizontalDirection: function () { 6813 var delta = this.positionAbs.left - this.lastPositionAbs.left; 6814 return delta !== 0 && (delta > 0 ? "right" : "left"); 6815 }, 6816 6817 refresh: function (event) { 6818 this._refreshItems(event); 6819 this._setHandleClassName(); 6820 this.refreshPositions(); 6821 return this; 6822 }, 6823 6824 _connectWith: function () { 6825 var options = this.options; 6826 return options.connectWith.constructor === String ? 6827 [options.connectWith] : 6828 options.connectWith; 6829 }, 6830 6831 _getItemsAsjQuery: function (connected) { 6832 6833 var i, j, cur, inst, 6834 items = [], 6835 queries = [], 6836 connectWith = this._connectWith(); 6837 6838 if (connectWith && connected) { 6839 for (i = connectWith.length - 1; i >= 0; i--) { 6840 cur = $(connectWith[i], this.document[0]); 6841 for (j = cur.length - 1; j >= 0; j--) { 6842 inst = $.data(cur[j], this.widgetFullName); 6843 if (inst && inst !== this && !inst.options.disabled) { 6844 queries.push([typeof inst.options.items === "function" ? 6845 inst.options.items.call(inst.element) : 6846 $(inst.options.items, inst.element) 6847 .not(".ui-sortable-helper") 6848 .not(".ui-sortable-placeholder"), inst]); 6849 } 6850 } 6851 } 6852 } 6853 6854 queries.push([typeof this.options.items === "function" ? 6855 this.options.items 6856 .call(this.element, null, { options: this.options, item: this.currentItem }) : 6857 $(this.options.items, this.element) 6858 .not(".ui-sortable-helper") 6859 .not(".ui-sortable-placeholder"), this]); 6860 6861 function addItems() { 6862 items.push(this); 6863 } 6864 for (i = queries.length - 1; i >= 0; i--) { 6865 queries[i][0].each(addItems); 6866 } 6867 6868 return $(items); 6869 6870 }, 6871 6872 _removeCurrentsFromItems: function () { 6873 6874 var list = this.currentItem.find(":data(" + this.widgetName + "-item)"); 6875 6876 this.items = $.grep(this.items, function (item) { 6877 for (var j = 0; j < list.length; j++) { 6878 if (list[j] === item.item[0]) { 6879 return false; 6880 } 6881 } 6882 return true; 6883 }); 6884 6885 }, 6886 6887 _refreshItems: function (event) { 6888 6889 this.items = []; 6890 this.containers = [this]; 6891 6892 var i, j, cur, inst, targetData, _queries, item, queriesLength, 6893 items = this.items, 6894 queries = [[typeof this.options.items === "function" ? 6895 this.options.items.call(this.element[0], event, { item: this.currentItem }) : 6896 $(this.options.items, this.element), this]], 6897 connectWith = this._connectWith(); 6898 6899 //Shouldn't be run the first time through due to massive slow-down 6900 if (connectWith && this.ready) { 6901 for (i = connectWith.length - 1; i >= 0; i--) { 6902 cur = $(connectWith[i], this.document[0]); 6903 for (j = cur.length - 1; j >= 0; j--) { 6904 inst = $.data(cur[j], this.widgetFullName); 6905 if (inst && inst !== this && !inst.options.disabled) { 6906 queries.push([typeof inst.options.items === "function" ? 6907 inst.options.items 6908 .call(inst.element[0], event, { item: this.currentItem }) : 6909 $(inst.options.items, inst.element), inst]); 6910 this.containers.push(inst); 6911 } 6912 } 6913 } 6914 } 6915 6916 for (i = queries.length - 1; i >= 0; i--) { 6917 targetData = queries[i][1]; 6918 _queries = queries[i][0]; 6919 6920 for (j = 0, queriesLength = _queries.length; j < queriesLength; j++) { 6921 item = $(_queries[j]); 6922 6923 // Data for target checking (mouse manager) 6924 item.data(this.widgetName + "-item", targetData); 6925 6926 items.push({ 6927 item: item, 6928 instance: targetData, 6929 width: 0, height: 0, 6930 left: 0, top: 0 6931 }); 6932 } 6933 } 6934 6935 }, 6936 6937 _refreshItemPositions: function (fast) { 6938 var i, item, t, p; 6939 6940 for (i = this.items.length - 1; i >= 0; i--) { 6941 item = this.items[i]; 6942 6943 //We ignore calculating positions of all connected containers when we're not over them 6944 if (this.currentContainer && item.instance !== this.currentContainer && 6945 item.item[0] !== this.currentItem[0]) { 6946 continue; 6947 } 6948 6949 t = this.options.toleranceElement ? 6950 $(this.options.toleranceElement, item.item) : 6951 item.item; 6952 6953 if (!fast) { 6954 item.width = t.outerWidth(); 6955 item.height = t.outerHeight(); 6956 } 6957 6958 p = t.offset(); 6959 item.left = p.left; 6960 item.top = p.top; 6961 } 6962 }, 6963 6964 refreshPositions: function (fast) { 6965 6966 // Determine whether items are being displayed horizontally 6967 this.floating = this.items.length ? 6968 this.options.axis === "x" || this._isFloating(this.items[0].item) : 6969 false; 6970 6971 // This has to be redone because due to the item being moved out/into the offsetParent, 6972 // the offsetParent's position will change 6973 if (this.offsetParent && this.helper) { 6974 this.offset.parent = this._getParentOffset(); 6975 } 6976 6977 this._refreshItemPositions(fast); 6978 6979 var i, p; 6980 6981 if (this.options.custom && this.options.custom.refreshContainers) { 6982 this.options.custom.refreshContainers.call(this); 6983 } else { 6984 for (i = this.containers.length - 1; i >= 0; i--) { 6985 p = this.containers[i].element.offset(); 6986 this.containers[i].containerCache.left = p.left; 6987 this.containers[i].containerCache.top = p.top; 6988 this.containers[i].containerCache.width = 6989 this.containers[i].element.outerWidth(); 6990 this.containers[i].containerCache.height = 6991 this.containers[i].element.outerHeight(); 6992 } 6993 } 6994 6995 return this; 6996 }, 6997 6998 _createPlaceholder: function (that) { 6999 that = that || this; 7000 var className, nodeName, 7001 o = that.options; 7002 7003 if (!o.placeholder || o.placeholder.constructor === String) { 7004 className = o.placeholder; 7005 nodeName = that.currentItem[0].nodeName.toLowerCase(); 7006 o.placeholder = { 7007 element: function () { 7008 7009 var element = $("<" + nodeName + ">", that.document[0]); 7010 7011 that._addClass(element, "ui-sortable-placeholder", 7012 className || that.currentItem[0].className) 7013 ._removeClass(element, "ui-sortable-helper"); 7014 7015 if (nodeName === "tbody") { 7016 that._createTrPlaceholder( 7017 that.currentItem.find("tr").eq(0), 7018 $("<tr>", that.document[0]).appendTo(element) 7019 ); 7020 } else if (nodeName === "tr") { 7021 that._createTrPlaceholder(that.currentItem, element); 7022 } else if (nodeName === "img") { 7023 element.attr("src", that.currentItem.attr("src")); 7024 } 7025 7026 if (!className) { 7027 element.css("visibility", "hidden"); 7028 } 7029 7030 return element; 7031 }, 7032 update: function (container, p) { 7033 7034 // 1. If a className is set as 'placeholder option, we don't force sizes - 7035 // the class is responsible for that 7036 // 2. The option 'forcePlaceholderSize can be enabled to force it even if a 7037 // class name is specified 7038 if (className && !o.forcePlaceholderSize) { 7039 return; 7040 } 7041 7042 // If the element doesn't have a actual height or width by itself (without 7043 // styles coming from a stylesheet), it receives the inline height and width 7044 // from the dragged item. Or, if it's a tbody or tr, it's going to have a height 7045 // anyway since we're populating them with <td>s above, but they're unlikely to 7046 // be the correct height on their own if the row heights are dynamic, so we'll 7047 // always assign the height of the dragged item given forcePlaceholderSize 7048 // is true. 7049 if (!p.height() || (o.forcePlaceholderSize && 7050 (nodeName === "tbody" || nodeName === "tr"))) { 7051 p.height(
vendor: 12,083 bytes, lines 7052-7411
7052 that.currentItem.innerHeight() - 7053 parseInt(that.currentItem.css("paddingTop") || 0, 10) - 7054 parseInt(that.currentItem.css("paddingBottom") || 0, 10)); 7055 } 7056 if (!p.width()) { 7057 p.width( 7058 that.currentItem.innerWidth() - 7059 parseInt(that.currentItem.css("paddingLeft") || 0, 10) - 7060 parseInt(that.currentItem.css("paddingRight") || 0, 10)); 7061 } 7062 } 7063 }; 7064 } 7065 7066 //Create the placeholder 7067 that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)); 7068 7069 //Append it after the actual current item 7070 that.currentItem.after(that.placeholder); 7071 7072 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) 7073 o.placeholder.update(that, that.placeholder); 7074 7075 }, 7076 7077 _createTrPlaceholder: function (sourceTr, targetTr) { 7078 var that = this; 7079 7080 sourceTr.children().each(function () { 7081 $("<td> </td>", that.document[0]) 7082 .attr("colspan", $(this).attr("colspan") || 1) 7083 .appendTo(targetTr); 7084 }); 7085 }, 7086 7087 _contactContainers: function (event) { 7088 var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, 7089 floating, axis, 7090 innermostContainer = null, 7091 innermostIndex = null; 7092 7093 // Get innermost container that intersects with item 7094 for (i = this.containers.length - 1; i >= 0; i--) { 7095 7096 // Never consider a container that's located within the item itself 7097 if ($.contains(this.currentItem[0], this.containers[i].element[0])) { 7098 continue; 7099 } 7100 7101 if (this._intersectsWith(this.containers[i].containerCache)) { 7102 7103 // If we've already found a container and it's more "inner" than this, then continue 7104 if (innermostContainer && 7105 $.contains( 7106 this.containers[i].element[0], 7107 innermostContainer.element[0])) { 7108 continue; 7109 } 7110 7111 innermostContainer = this.containers[i]; 7112 innermostIndex = i; 7113 7114 } else { 7115 7116 // container doesn't intersect. trigger "out" event if necessary 7117 if (this.containers[i].containerCache.over) { 7118 this.containers[i]._trigger("out", event, this._uiHash(this)); 7119 this.containers[i].containerCache.over = 0; 7120 } 7121 } 7122 7123 } 7124 7125 // If no intersecting containers found, return 7126 if (!innermostContainer) { 7127 return; 7128 } 7129 7130 // Move the item into the container if it's not there already 7131 if (this.containers.length === 1) { 7132 if (!this.containers[innermostIndex].containerCache.over) { 7133 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 7134 this.containers[innermostIndex].containerCache.over = 1; 7135 } 7136 } else { 7137 7138 // When entering a new container, we will find the item with the least distance and 7139 // append our item near it 7140 dist = 10000; 7141 itemWithLeastDistance = null; 7142 floating = innermostContainer.floating || this._isFloating(this.currentItem); 7143 posProperty = floating ? "left" : "top"; 7144 sizeProperty = floating ? "width" : "height"; 7145 axis = floating ? "pageX" : "pageY"; 7146 7147 for (j = this.items.length - 1; j >= 0; j--) { 7148 if (!$.contains( 7149 this.containers[innermostIndex].element[0], this.items[j].item[0]) 7150 ) { 7151 continue; 7152 } 7153 if (this.items[j].item[0] === this.currentItem[0]) { 7154 continue; 7155 } 7156 7157 cur = this.items[j].item.offset()[posProperty]; 7158 nearBottom = false; 7159 if (event[axis] - cur > this.items[j][sizeProperty] / 2) { 7160 nearBottom = true; 7161 } 7162 7163 if (Math.abs(event[axis] - cur) < dist) { 7164 dist = Math.abs(event[axis] - cur); 7165 itemWithLeastDistance = this.items[j]; 7166 this.direction = nearBottom ? "up" : "down"; 7167 } 7168 } 7169 7170 //Check if dropOnEmpty is enabled 7171 if (!itemWithLeastDistance && !this.options.dropOnEmpty) { 7172 return; 7173 } 7174 7175 if (this.currentContainer === this.containers[innermostIndex]) { 7176 if (!this.currentContainer.containerCache.over) { 7177 this.containers[innermostIndex]._trigger("over", event, this._uiHash()); 7178 this.currentContainer.containerCache.over = 1; 7179 } 7180 return; 7181 } 7182 7183 if (itemWithLeastDistance) { 7184 this._rearrange(event, itemWithLeastDistance, null, true); 7185 } else { 7186 this._rearrange(event, null, this.containers[innermostIndex].element, true); 7187 } 7188 this._trigger("change", event, this._uiHash()); 7189 this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 7190 this.currentContainer = this.containers[innermostIndex]; 7191 7192 //Update the placeholder 7193 this.options.placeholder.update(this.currentContainer, this.placeholder); 7194 7195 //Update scrollParent 7196 this.scrollParent = this.placeholder.scrollParent(); 7197 7198 //Update overflowOffset 7199 if (this.scrollParent[0] !== this.document[0] && 7200 this.scrollParent[0].tagName !== "HTML") { 7201 this.overflowOffset = this.scrollParent.offset(); 7202 } 7203 7204 this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 7205 this.containers[innermostIndex].containerCache.over = 1; 7206 } 7207 7208 }, 7209 7210 _createHelper: function (event) { 7211 7212 var o = this.options, 7213 helper = typeof o.helper === "function" ? 7214 $(o.helper.apply(this.element[0], [event, this.currentItem])) : 7215 (o.helper === "clone" ? this.currentItem.clone() : this.currentItem); 7216 7217 //Add the helper to the DOM if that didn't happen already 7218 if (!helper.parents("body").length) { 7219 this.appendTo[0].appendChild(helper[0]); 7220 } 7221 7222 if (helper[0] === this.currentItem[0]) { 7223 this._storedCSS = { 7224 width: this.currentItem[0].style.width, 7225 height: this.currentItem[0].style.height, 7226 position: this.currentItem.css("position"), 7227 top: this.currentItem.css("top"), 7228 left: this.currentItem.css("left") 7229 }; 7230 } 7231 7232 if (!helper[0].style.width || o.forceHelperSize) { 7233 helper.width(this.currentItem.width()); 7234 } 7235 if (!helper[0].style.height || o.forceHelperSize) { 7236 helper.height(this.currentItem.height()); 7237 } 7238 7239 return helper; 7240 7241 }, 7242 7243 _adjustOffsetFromHelper: function (obj) { 7244 if (typeof obj === "string") { 7245 obj = obj.split(" "); 7246 } 7247 if (Array.isArray(obj)) { 7248 obj = { left: +obj[0], top: +obj[1] || 0 }; 7249 } 7250 if ("left" in obj) { 7251 this.offset.click.left = obj.left + this.margins.left; 7252 } 7253 if ("right" in obj) { 7254 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 7255 } 7256 if ("top" in obj) { 7257 this.offset.click.top = obj.top + this.margins.top; 7258 } 7259 if ("bottom" in obj) { 7260 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 7261 } 7262 }, 7263 7264 _getParentOffset: function () { 7265 7266 //Get the offsetParent and cache its position 7267 this.offsetParent = this.helper.offsetParent(); 7268 var po = this.offsetParent.offset(); 7269 7270 // This is a special case where we need to modify a offset calculated on start, since the 7271 // following happened: 7272 // 1. The position of the helper is absolute, so it's position is calculated based on the 7273 // next positioned parent 7274 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't 7275 // the document, which means that the scroll is included in the initial calculation of the 7276 // offset of the parent, and never recalculated upon drag 7277 if (this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && 7278 $.contains(this.scrollParent[0], this.offsetParent[0])) { 7279 po.left += this.scrollParent.scrollLeft(); 7280 po.top += this.scrollParent.scrollTop(); 7281 } 7282 7283 // This needs to be actually done for all browsers, since pageX/pageY includes this 7284 // information with an ugly IE fix 7285 if (this.offsetParent[0] === this.document[0].body || 7286 (this.offsetParent[0].tagName && 7287 this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { 7288 po = { top: 0, left: 0 }; 7289 } 7290 7291 return { 7292 top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0), 7293 left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0) 7294 }; 7295 7296 }, 7297 7298 _getRelativeOffset: function () { 7299 7300 if (this.cssPosition === "relative") { 7301 var p = this.currentItem.position(); 7302 return { 7303 top: p.top - (parseInt(this.helper.css("top"), 10) || 0) + 7304 this.scrollParent.scrollTop(), 7305 left: p.left - (parseInt(this.helper.css("left"), 10) || 0) + 7306 this.scrollParent.scrollLeft() 7307 }; 7308 } else { 7309 return { top: 0, left: 0 }; 7310 } 7311 7312 }, 7313 7314 _cacheMargins: function () { 7315 this.margins = { 7316 left: (parseInt(this.currentItem.css("marginLeft"), 10) || 0), 7317 top: (parseInt(this.currentItem.css("marginTop"), 10) || 0) 7318 }; 7319 }, 7320 7321 _cacheHelperProportions: function () { 7322 this.helperProportions = { 7323 width: this.helper.outerWidth(), 7324 height: this.helper.outerHeight() 7325 }; 7326 }, 7327 7328 _setContainment: function () { 7329 7330 var ce, co, over, 7331 o = this.options; 7332 if (o.containment === "parent") { 7333 o.containment = this.helper[0].parentNode; 7334 } 7335 if (o.containment === "document" || o.containment === "window") { 7336 this.containment = [ 7337 0 - this.offset.relative.left - this.offset.parent.left, 7338 0 - this.offset.relative.top - this.offset.parent.top, 7339 o.containment === "document" ? 7340 this.document.width() : 7341 this.window.width() - this.helperProportions.width - this.margins.left, 7342 (o.containment === "document" ? 7343 (this.document.height() || document.body.parentNode.scrollHeight) : 7344 this.window.height() || this.document[0].body.parentNode.scrollHeight 7345 ) - this.helperProportions.height - this.margins.top 7346 ]; 7347 } 7348 7349 if (!(/^(document|window|parent)$/).test(o.containment)) { 7350 ce = $(o.containment)[0]; 7351 co = $(o.containment).offset(); 7352 over = ($(ce).css("overflow") !== "hidden"); 7353 7354 this.containment = [ 7355 co.left + (parseInt($(ce).css("borderLeftWidth"), 10) || 0) + 7356 (parseInt($(ce).css("paddingLeft"), 10) || 0) - this.margins.left, 7357 co.top + (parseInt($(ce).css("borderTopWidth"), 10) || 0) + 7358 (parseInt($(ce).css("paddingTop"), 10) || 0) - this.margins.top, 7359 co.left + (over ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) - 7360 (parseInt($(ce).css("borderLeftWidth"), 10) || 0) - 7361 (parseInt($(ce).css("paddingRight"), 10) || 0) - 7362 this.helperProportions.width - this.margins.left, 7363 co.top + (over ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) - 7364 (parseInt($(ce).css("borderTopWidth"), 10) || 0) - 7365 (parseInt($(ce).css("paddingBottom"), 10) || 0) - 7366 this.helperProportions.height - this.margins.top 7367 ]; 7368 } 7369 7370 }, 7371 7372 _convertPositionTo: function (d, pos) { 7373 7374 if (!pos) { 7375 pos = this.position; 7376 } 7377 var mod = d === "absolute" ? 1 : -1, 7378 scroll = this.cssPosition === "absolute" && 7379 !(this.scrollParent[0] !== this.document[0] && 7380 $.contains(this.scrollParent[0], this.offsetParent[0])) ? 7381 this.offsetParent : 7382 this.scrollParent, 7383 scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); 7384 7385 return { 7386 top: ( 7387 7388 // The absolute mouse position 7389 pos.top + 7390 7391 // Only for relative positioned nodes: Relative offset from element to offset parent 7392 this.offset.relative.top * mod + 7393 7394 // The offsetParent's offset without borders (offset + border) 7395 this.offset.parent.top * mod - 7396 ((this.cssPosition === "fixed" ? 7397 -this.scrollParent.scrollTop() : 7398 (scrollIsRootNode ? 0 : scroll.scrollTop())) * mod) 7399 ), 7400 left: ( 7401 7402 // The absolute mouse position 7403 pos.left + 7404 7405 // Only for relative positioned nodes: Relative offset from element to offset parent 7406 this.offset.relative.left * mod + 7407 7408 // The offsetParent's offset without borders (offset + border) 7409 this.offset.parent.left * mod - 7410 ((this.cssPosition === "fixed" ? 7411 -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
vendor: 4,583 bytes, lines 7412-7546
7412 scroll.scrollLeft()) * mod) 7413 ) 7414 }; 7415 7416 }, 7417 7418 _generatePosition: function (event) { 7419 7420 var top, left, 7421 o = this.options, 7422 pageX = event.pageX, 7423 pageY = event.pageY, 7424 scroll = this.cssPosition === "absolute" && 7425 !(this.scrollParent[0] !== this.document[0] && 7426 $.contains(this.scrollParent[0], this.offsetParent[0])) ? 7427 this.offsetParent : 7428 this.scrollParent, 7429 scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); 7430 7431 // This is another very weird special case that only happens for relative elements: 7432 // 1. If the css position is relative 7433 // 2. and the scroll parent is the document or similar to the offset parent 7434 // we have to refresh the relative offset during the scroll so there are no jumps 7435 if (this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && 7436 this.scrollParent[0] !== this.offsetParent[0])) { 7437 this.offset.relative = this._getRelativeOffset(); 7438 } 7439 7440 /* 7441 * - Position constraining - 7442 * Constrain the position to a mix of grid, containment. 7443 */ 7444 7445 if (this.originalPosition) { //If we are not dragging yet, we won't check for options 7446 7447 if (this.containment) { 7448 if (event.pageX - this.offset.click.left < this.containment[0]) { 7449 pageX = this.containment[0] + this.offset.click.left; 7450 } 7451 if (event.pageY - this.offset.click.top < this.containment[1]) { 7452 pageY = this.containment[1] + this.offset.click.top; 7453 } 7454 if (event.pageX - this.offset.click.left > this.containment[2]) { 7455 pageX = this.containment[2] + this.offset.click.left; 7456 } 7457 if (event.pageY - this.offset.click.top > this.containment[3]) { 7458 pageY = this.containment[3] + this.offset.click.top; 7459 } 7460 } 7461 7462 if (o.grid) { 7463 top = this.originalPageY + Math.round((pageY - this.originalPageY) / 7464 o.grid[1]) * o.grid[1]; 7465 pageY = this.containment ? 7466 ((top - this.offset.click.top >= this.containment[1] && 7467 top - this.offset.click.top <= this.containment[3]) ? 7468 top : 7469 ((top - this.offset.click.top >= this.containment[1]) ? 7470 top - o.grid[1] : top + o.grid[1])) : 7471 top; 7472 7473 left = this.originalPageX + Math.round((pageX - this.originalPageX) / 7474 o.grid[0]) * o.grid[0]; 7475 pageX = this.containment ? 7476 ((left - this.offset.click.left >= this.containment[0] && 7477 left - this.offset.click.left <= this.containment[2]) ? 7478 left : 7479 ((left - this.offset.click.left >= this.containment[0]) ? 7480 left - o.grid[0] : left + o.grid[0])) : 7481 left; 7482 } 7483 7484 } 7485 7486 return { 7487 top: ( 7488 7489 // The absolute mouse position 7490 pageY - 7491 7492 // Click offset (relative to the element) 7493 this.offset.click.top - 7494 7495 // Only for relative positioned nodes: Relative offset from element to offset parent 7496 this.offset.relative.top - 7497 7498 // The offsetParent's offset without borders (offset + border) 7499 this.offset.parent.top + 7500 ((this.cssPosition === "fixed" ? 7501 -this.scrollParent.scrollTop() : 7502 (scrollIsRootNode ? 0 : scroll.scrollTop()))) 7503 ), 7504 left: ( 7505 7506 // The absolute mouse position 7507 pageX - 7508 7509 // Click offset (relative to the element) 7510 this.offset.click.left - 7511 7512 // Only for relative positioned nodes: Relative offset from element to offset parent 7513 this.offset.relative.left - 7514 7515 // The offsetParent's offset without borders (offset + border) 7516 this.offset.parent.left + 7517 ((this.cssPosition === "fixed" ? 7518 -this.scrollParent.scrollLeft() : 7519 scrollIsRootNode ? 0 : scroll.scrollLeft())) 7520 ) 7521 }; 7522 7523 }, 7524 7525 _rearrange: function (event, i, a, hardRefresh) { 7526 7527 if (a) { 7528 a[0].appendChild(this.placeholder[0]); 7529 } else { 7530 i.item[0].parentNode.insertBefore(this.placeholder[0], 7531 (this.direction === "down" ? i.item[0] : i.item[0].nextSibling)); 7532 } 7533 7534 //Various things done here to improve the performance: 7535 // 1. we create a setTimeout, that calls refreshPositions 7536 // 2. on the instance, we have a counter variable, that get's higher after every append 7537 // 3. on the local scope, we copy the counter variable, and check in the timeout, 7538 // if it's still the same 7539 // 4. this lets only the last addition to the timeout stack through 7540 this.counter = this.counter ? ++this.counter : 1; 7541 var counter = this.counter; 7542 7543 this._delay(function () { 7544 if (counter === this.counter) { 7545 7546 //Precompute after each DOM insertion, NOT on mousemove
vendor: 13,431 bytes, lines 7547-8033
7547 this.refreshPositions(!hardRefresh); 7548 } 7549 }); 7550 7551 }, 7552 7553 _clear: function (event, noPropagation) { 7554 7555 this.reverting = false; 7556 7557 // We delay all events that have to be triggered to after the point where the placeholder 7558 // has been removed and everything else normalized again 7559 var i, 7560 delayedTriggers = []; 7561 7562 // We first have to update the dom position of the actual currentItem 7563 // Note: don't do it if the current item is already removed (by a user), or it gets 7564 // reappended (see #4088) 7565 if (!this._noFinalSort && this.currentItem.parent().length) { 7566 this.placeholder.before(this.currentItem); 7567 } 7568 this._noFinalSort = null; 7569 7570 if (this.helper[0] === this.currentItem[0]) { 7571 for (i in this._storedCSS) { 7572 if (this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") { 7573 this._storedCSS[i] = ""; 7574 } 7575 } 7576 this.currentItem.css(this._storedCSS); 7577 this._removeClass(this.currentItem, "ui-sortable-helper"); 7578 } else { 7579 this.currentItem.show(); 7580 } 7581 7582 if (this.fromOutside && !noPropagation) { 7583 delayedTriggers.push(function (event) { 7584 this._trigger("receive", event, this._uiHash(this.fromOutside)); 7585 }); 7586 } 7587 if ((this.fromOutside || 7588 this.domPosition.prev !== 7589 this.currentItem.prev().not(".ui-sortable-helper")[0] || 7590 this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) { 7591 7592 // Trigger update callback if the DOM position has changed 7593 delayedTriggers.push(function (event) { 7594 this._trigger("update", event, this._uiHash()); 7595 }); 7596 } 7597 7598 // Check if the items Container has Changed and trigger appropriate 7599 // events. 7600 if (this !== this.currentContainer) { 7601 if (!noPropagation) { 7602 delayedTriggers.push(function (event) { 7603 this._trigger("remove", event, this._uiHash()); 7604 }); 7605 delayedTriggers.push((function (c) { 7606 return function (event) { 7607 c._trigger("receive", event, this._uiHash(this)); 7608 }; 7609 }).call(this, this.currentContainer)); 7610 delayedTriggers.push((function (c) { 7611 return function (event) { 7612 c._trigger("update", event, this._uiHash(this)); 7613 }; 7614 }).call(this, this.currentContainer)); 7615 } 7616 } 7617 7618 //Post events to containers 7619 function delayEvent(type, instance, container) { 7620 return function (event) { 7621 container._trigger(type, event, instance._uiHash(instance)); 7622 }; 7623 } 7624 for (i = this.containers.length - 1; i >= 0; i--) { 7625 if (!noPropagation) { 7626 delayedTriggers.push(delayEvent("deactivate", this, this.containers[i])); 7627 } 7628 if (this.containers[i].containerCache.over) { 7629 delayedTriggers.push(delayEvent("out", this, this.containers[i])); 7630 this.containers[i].containerCache.over = 0; 7631 } 7632 } 7633 7634 //Do what was originally in plugins 7635 if (this.storedCursor) { 7636 this.document.find("body").css("cursor", this.storedCursor); 7637 this.storedStylesheet.remove(); 7638 } 7639 if (this._storedOpacity) { 7640 this.helper.css("opacity", this._storedOpacity); 7641 } 7642 if (this._storedZIndex) { 7643 this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex); 7644 } 7645 7646 this.dragging = false; 7647 7648 if (!noPropagation) { 7649 this._trigger("beforeStop", event, this._uiHash()); 7650 } 7651 7652 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, 7653 // it unbinds ALL events from the original node! 7654 this.placeholder[0].parentNode.removeChild(this.placeholder[0]); 7655 7656 if (!this.cancelHelperRemoval) { 7657 if (this.helper[0] !== this.currentItem[0]) { 7658 this.helper.remove(); 7659 } 7660 this.helper = null; 7661 } 7662 7663 if (!noPropagation) { 7664 for (i = 0; i < delayedTriggers.length; i++) { 7665 7666 // Trigger all delayed events 7667 delayedTriggers[i].call(this, event); 7668 } 7669 this._trigger("stop", event, this._uiHash()); 7670 } 7671 7672 this.fromOutside = false; 7673 return !this.cancelHelperRemoval; 7674 7675 }, 7676 7677 _trigger: function () { 7678 if ($.Widget.prototype._trigger.apply(this, arguments) === false) { 7679 this.cancel(); 7680 } 7681 }, 7682 7683 _uiHash: function (_inst) { 7684 var inst = _inst || this; 7685 return { 7686 helper: inst.helper, 7687 placeholder: inst.placeholder || $([]), 7688 position: inst.position, 7689 originalPosition: inst.originalPosition, 7690 offset: inst.positionAbs, 7691 item: inst.currentItem, 7692 sender: _inst ? _inst.element : null 7693 }; 7694 } 7695 7696 }); 7697 7698 7699 /*! 7700 * jQuery UI Accordion 1.13.1 7701 * http://jqueryui.com 7702 * 7703 * Copyright jQuery Foundation and other contributors 7704 * Released under the MIT license. 7705 * http://jquery.org/license 7706 */ 7707 7708 //>>label: Accordion 7709 //>>group: Widgets 7710 /* eslint-disable max-len */ 7711 //>>description: Displays collapsible content panels for presenting information in a limited amount of space. 7712 /* eslint-enable max-len */ 7713 //>>docs: http://api.jqueryui.com/accordion/ 7714 //>>demos: http://jqueryui.com/accordion/ 7715 //>>css.structure: ../../themes/base/core.css 7716 //>>css.structure: ../../themes/base/accordion.css 7717 //>>css.theme: ../../themes/base/theme.css 7718 7719 7720 var widgetsAccordion = $.widget("ui.accordion", { 7721 version: "1.13.1", 7722 options: { 7723 active: 0, 7724 animate: {}, 7725 classes: { 7726 "ui-accordion-header": "ui-corner-top", 7727 "ui-accordion-header-collapsed": "ui-corner-all", 7728 "ui-accordion-content": "ui-corner-bottom" 7729 }, 7730 collapsible: false, 7731 event: "click", 7732 header: function (elem) { 7733 return elem.find("> li > :first-child").add(elem.find("> :not(li)").even()); 7734 }, 7735 heightStyle: "auto", 7736 icons: { 7737 activeHeader: "ui-icon-triangle-1-s", 7738 header: "ui-icon-triangle-1-e" 7739 }, 7740 7741 // Callbacks 7742 activate: null, 7743 beforeActivate: null 7744 }, 7745 7746 hideProps: { 7747 borderTopWidth: "hide", 7748 borderBottomWidth: "hide", 7749 paddingTop: "hide", 7750 paddingBottom: "hide", 7751 height: "hide" 7752 }, 7753 7754 showProps: { 7755 borderTopWidth: "show", 7756 borderBottomWidth: "show", 7757 paddingTop: "show", 7758 paddingBottom: "show", 7759 height: "show" 7760 }, 7761 7762 _create: function () { 7763 var options = this.options; 7764 7765 this.prevShow = this.prevHide = $(); 7766 this._addClass("ui-accordion", "ui-widget ui-helper-reset"); 7767 this.element.attr("role", "tablist"); 7768 7769 // Don't allow collapsible: false and active: false / null 7770 if (!options.collapsible && (options.active === false || options.active == null)) { 7771 options.active = 0; 7772 } 7773 7774 this._processPanels(); 7775 7776 // handle negative values 7777 if (options.active < 0) { 7778 options.active += this.headers.length; 7779 } 7780 this._refresh(); 7781 }, 7782 7783 _getCreateEventData: function () { 7784 return { 7785 header: this.active, 7786 panel: !this.active.length ? $() : this.active.next() 7787 }; 7788 }, 7789 7790 _createIcons: function () { 7791 var icon, children, 7792 icons = this.options.icons; 7793 7794 if (icons) { 7795 icon = $("<span>"); 7796 this._addClass(icon, "ui-accordion-header-icon", "ui-icon " + icons.header); 7797 icon.prependTo(this.headers); 7798 children = this.active.children(".ui-accordion-header-icon"); 7799 this._removeClass(children, icons.header) 7800 ._addClass(children, null, icons.activeHeader) 7801 ._addClass(this.headers, "ui-accordion-icons"); 7802 } 7803 }, 7804 7805 _destroyIcons: function () { 7806 this._removeClass(this.headers, "ui-accordion-icons"); 7807 this.headers.children(".ui-accordion-header-icon").remove(); 7808 }, 7809 7810 _destroy: function () { 7811 var contents; 7812 7813 // Clean up main element 7814 this.element.removeAttr("role"); 7815 7816 // Clean up headers 7817 this.headers 7818 .removeAttr("role aria-expanded aria-selected aria-controls tabIndex") 7819 .removeUniqueId(); 7820 7821 this._destroyIcons(); 7822 7823 // Clean up content panels 7824 contents = this.headers.next() 7825 .css("display", "") 7826 .removeAttr("role aria-hidden aria-labelledby") 7827 .removeUniqueId(); 7828 7829 if (this.options.heightStyle !== "content") { 7830 contents.css("height", ""); 7831 } 7832 }, 7833 7834 _setOption: function (key, value) { 7835 if (key === "active") { 7836 7837 // _activate() will handle invalid values and update this.options 7838 this._activate(value); 7839 return; 7840 } 7841 7842 if (key === "event") { 7843 if (this.options.event) { 7844 this._off(this.headers, this.options.event); 7845 } 7846 this._setupEvents(value); 7847 } 7848 7849 this._super(key, value); 7850 7851 // Setting collapsible: false while collapsed; open first panel 7852 if (key === "collapsible" && !value && this.options.active === false) { 7853 this._activate(0); 7854 } 7855 7856 if (key === "icons") { 7857 this._destroyIcons(); 7858 if (value) { 7859 this._createIcons(); 7860 } 7861 } 7862 }, 7863 7864 _setOptionDisabled: function (value) { 7865 this._super(value); 7866 7867 this.element.attr("aria-disabled", value); 7868 7869 // Support: IE8 Only 7870 // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE 7871 // so we need to add the disabled class to the headers and panels 7872 this._toggleClass(null, "ui-state-disabled", !!value); 7873 this._toggleClass(this.headers.add(this.headers.next()), null, "ui-state-disabled", 7874 !!value); 7875 }, 7876 7877 _keydown: function (event) { 7878 if (event.altKey || event.ctrlKey) { 7879 return; 7880 } 7881 7882 var keyCode = $.ui.keyCode, 7883 length = this.headers.length, 7884 currentIndex = this.headers.index(event.target), 7885 toFocus = false; 7886 7887 switch (event.keyCode) { 7888 case keyCode.RIGHT: 7889 case keyCode.DOWN: 7890 toFocus = this.headers[(currentIndex + 1) % length]; 7891 break; 7892 case keyCode.LEFT: 7893 case keyCode.UP: 7894 toFocus = this.headers[(currentIndex - 1 + length) % length]; 7895 break; 7896 case keyCode.SPACE: 7897 case keyCode.ENTER: 7898 this._eventHandler(event); 7899 break; 7900 case keyCode.HOME: 7901 toFocus = this.headers[0]; 7902 break; 7903 case keyCode.END: 7904 toFocus = this.headers[length - 1]; 7905 break; 7906 } 7907 7908 if (toFocus) { 7909 $(event.target).attr("tabIndex", -1); 7910 $(toFocus).attr("tabIndex", 0); 7911 $(toFocus).trigger("focus"); 7912 event.preventDefault(); 7913 } 7914 }, 7915 7916 _panelKeyDown: function (event) { 7917 if (event.keyCode === $.ui.keyCode.UP && event.ctrlKey) { 7918 $(event.currentTarget).prev().trigger("focus"); 7919 } 7920 }, 7921 7922 refresh: function () { 7923 var options = this.options; 7924 this._processPanels(); 7925 7926 // Was collapsed or no panel 7927 if ((options.active === false && options.collapsible === true) || 7928 !this.headers.length) { 7929 options.active = false; 7930 this.active = $(); 7931 7932 // active false only when collapsible is true 7933 } else if (options.active === false) { 7934 this._activate(0); 7935 7936 // was active, but active panel is gone 7937 } else if (this.active.length && !$.contains(this.element[0], this.active[0])) { 7938 7939 // all remaining panel are disabled 7940 if (this.headers.length === this.headers.find(".ui-state-disabled").length) { 7941 options.active = false; 7942 this.active = $(); 7943 7944 // activate previous panel 7945 } else { 7946 this._activate(Math.max(0, options.active - 1)); 7947 } 7948 7949 // was active, active panel still exists 7950 } else { 7951 7952 // make sure active index is correct 7953 options.active = this.headers.index(this.active); 7954 } 7955 7956 this._destroyIcons(); 7957 7958 this._refresh(); 7959 }, 7960 7961 _processPanels: function () { 7962 var prevHeaders = this.headers, 7963 prevPanels = this.panels; 7964 7965 if (typeof this.options.header === "function") { 7966 this.headers = this.options.header(this.element); 7967 } else { 7968 this.headers = this.element.find(this.options.header); 7969 } 7970 this._addClass(this.headers, "ui-accordion-header ui-accordion-header-collapsed", 7971 "ui-state-default"); 7972 7973 this.panels = this.headers.next().filter(":not(.ui-accordion-content-active)").hide(); 7974 this._addClass(this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content"); 7975 7976 // Avoid memory leaks (#10056) 7977 if (prevPanels) { 7978 this._off(prevHeaders.not(this.headers)); 7979 this._off(prevPanels.not(this.panels)); 7980 } 7981 }, 7982 7983 _refresh: function () { 7984 var maxHeight, 7985 options = this.options, 7986 heightStyle = options.heightStyle, 7987 parent = this.element.parent(); 7988 7989 this.active = this._findActive(options.active); 7990 this._addClass(this.active, "ui-accordion-header-active", "ui-state-active") 7991 ._removeClass(this.active, "ui-accordion-header-collapsed"); 7992 this._addClass(this.active.next(), "ui-accordion-content-active"); 7993 this.active.next().show(); 7994 7995 this.headers 7996 .attr("role", "tab") 7997 .each(function () { 7998 var header = $(this), 7999 headerId = header.uniqueId().attr("id"), 8000 panel = header.next(), 8001 panelId = panel.uniqueId().attr("id"); 8002 header.attr("aria-controls", panelId); 8003 panel.attr("aria-labelledby", headerId); 8004 }) 8005 .next() 8006 .attr("role", "tabpanel"); 8007 8008 this.headers 8009 .not(this.active) 8010 .attr({ 8011 "aria-selected": "false", 8012 "aria-expanded": "false", 8013 tabIndex: -1 8014 }) 8015 .next() 8016 .attr({ 8017 "aria-hidden": "true" 8018 }) 8019 .hide(); 8020 8021 // Make sure at least one header is in the tab order 8022 if (!this.active.length) { 8023 this.headers.eq(0).attr("tabIndex", 0); 8024 } else { 8025 this.active.attr({ 8026 "aria-selected": "true", 8027 "aria-expanded": "true", 8028 tabIndex: 0 8029 }) 8030 .next() 8031 .attr({ 8032 "aria-hidden": "false" 8033 });
vendor: 4,766 bytes, lines 8034-8200
8034 } 8035 8036 this._createIcons(); 8037 8038 this._setupEvents(options.event); 8039 8040 if (heightStyle === "fill") { 8041 maxHeight = parent.height(); 8042 this.element.siblings(":visible").each(function () { 8043 var elem = $(this), 8044 position = elem.css("position"); 8045 8046 if (position === "absolute" || position === "fixed") { 8047 return; 8048 } 8049 maxHeight -= elem.outerHeight(true); 8050 }); 8051 8052 this.headers.each(function () { 8053 maxHeight -= $(this).outerHeight(true); 8054 }); 8055 8056 this.headers.next() 8057 .each(function () { 8058 $(this).height(Math.max(0, maxHeight - 8059 $(this).innerHeight() + $(this).height())); 8060 }) 8061 .css("overflow", "auto"); 8062 } else if (heightStyle === "auto") { 8063 maxHeight = 0; 8064 this.headers.next() 8065 .each(function () { 8066 var isVisible = $(this).is(":visible"); 8067 if (!isVisible) { 8068 $(this).show(); 8069 } 8070 maxHeight = Math.max(maxHeight, $(this).css("height", "").height()); 8071 if (!isVisible) { 8072 $(this).hide(); 8073 } 8074 }) 8075 .height(maxHeight); 8076 } 8077 }, 8078 8079 _activate: function (index) { 8080 var active = this._findActive(index)[0]; 8081 8082 // Trying to activate the already active panel 8083 if (active === this.active[0]) { 8084 return; 8085 } 8086 8087 // Trying to collapse, simulate a click on the currently active header 8088 active = active || this.active[0]; 8089 8090 this._eventHandler({ 8091 target: active, 8092 currentTarget: active, 8093 preventDefault: $.noop 8094 }); 8095 }, 8096 8097 _findActive: function (selector) { 8098 return typeof selector === "number" ? this.headers.eq(selector) : $(); 8099 }, 8100 8101 _setupEvents: function (event) { 8102 var events = { 8103 keydown: "_keydown" 8104 }; 8105 if (event) { 8106 $.each(event.split(" "), function (index, eventName) { 8107 events[eventName] = "_eventHandler"; 8108 }); 8109 } 8110 8111 this._off(this.headers.add(this.headers.next())); 8112 this._on(this.headers, events); 8113 this._on(this.headers.next(), { keydown: "_panelKeyDown" }); 8114 this._hoverable(this.headers); 8115 this._focusable(this.headers); 8116 }, 8117 8118 _eventHandler: function (event) { 8119 var activeChildren, clickedChildren, 8120 options = this.options, 8121 active = this.active, 8122 clicked = $(event.currentTarget), 8123 clickedIsActive = clicked[0] === active[0], 8124 collapsing = clickedIsActive && options.collapsible, 8125 toShow = collapsing ? $() : clicked.next(), 8126 toHide = active.next(), 8127 eventData = { 8128 oldHeader: active, 8129 oldPanel: toHide, 8130 newHeader: collapsing ? $() : clicked, 8131 newPanel: toShow 8132 }; 8133 8134 event.preventDefault(); 8135 8136 if ( 8137 8138 // click on active header, but not collapsible 8139 (clickedIsActive && !options.collapsible) || 8140 8141 // allow canceling activation 8142 (this._trigger("beforeActivate", event, eventData) === false)) { 8143 return; 8144 } 8145 8146 options.active = collapsing ? false : this.headers.index(clicked); 8147 8148 // When the call to ._toggle() comes after the class changes 8149 // it causes a very odd bug in IE 8 (see #6720) 8150 this.active = clickedIsActive ? $() : clicked; 8151 this._toggle(eventData); 8152 8153 // Switch classes 8154 // corner classes on the previously active header stay after the animation 8155 this._removeClass(active, "ui-accordion-header-active", "ui-state-active"); 8156 if (options.icons) { 8157 activeChildren = active.children(".ui-accordion-header-icon"); 8158 this._removeClass(activeChildren, null, options.icons.activeHeader) 8159 ._addClass(activeChildren, null, options.icons.header); 8160 } 8161 8162 if (!clickedIsActive) { 8163 this._removeClass(clicked, "ui-accordion-header-collapsed") 8164 ._addClass(clicked, "ui-accordion-header-active", "ui-state-active"); 8165 if (options.icons) { 8166 clickedChildren = clicked.children(".ui-accordion-header-icon"); 8167 this._removeClass(clickedChildren, null, options.icons.header) 8168 ._addClass(clickedChildren, null, options.icons.activeHeader); 8169 } 8170 8171 this._addClass(clicked.next(), "ui-accordion-content-active"); 8172 } 8173 }, 8174 8175 _toggle: function (data) { 8176 var toShow = data.newPanel, 8177 toHide = this.prevShow.length ? this.prevShow : data.oldPanel; 8178 8179 // Handle activating a panel during the animation for another activation 8180 this.prevShow.add(this.prevHide).stop(true, true); 8181 this.prevShow = toShow; 8182 this.prevHide = toHide; 8183 8184 if (this.options.animate) { 8185 this._animate(toShow, toHide, data); 8186 } else { 8187 toHide.hide(); 8188 toShow.show(); 8189 this._toggleComplete(data); 8190 } 8191 8192 toHide.attr({ 8193 "aria-hidden": "true" 8194 }); 8195 toHide.prev().attr({ 8196 "aria-selected": "false", 8197 "aria-expanded": "false" 8198 }); 8199 8200 // if we're switching panels, remove the old header from the tab order
vendor: 6,077 bytes, lines 8201-8417
8201 // if we're opening from collapsed state, remove the previous header from the tab order 8202 // if we're collapsing, then keep the collapsing header in the tab order 8203 if (toShow.length && toHide.length) { 8204 toHide.prev().attr({ 8205 "tabIndex": -1, 8206 "aria-expanded": "false" 8207 }); 8208 } else if (toShow.length) { 8209 this.headers.filter(function () { 8210 return parseInt($(this).attr("tabIndex"), 10) === 0; 8211 }) 8212 .attr("tabIndex", -1); 8213 } 8214 8215 toShow 8216 .attr("aria-hidden", "false") 8217 .prev() 8218 .attr({ 8219 "aria-selected": "true", 8220 "aria-expanded": "true", 8221 tabIndex: 0 8222 }); 8223 }, 8224 8225 _animate: function (toShow, toHide, data) { 8226 var total, easing, duration, 8227 that = this, 8228 adjust = 0, 8229 boxSizing = toShow.css("box-sizing"), 8230 down = toShow.length && 8231 (!toHide.length || (toShow.index() < toHide.index())), 8232 animate = this.options.animate || {}, 8233 options = down && animate.down || animate, 8234 complete = function () { 8235 that._toggleComplete(data); 8236 }; 8237 8238 if (typeof options === "number") { 8239 duration = options; 8240 } 8241 if (typeof options === "string") { 8242 easing = options; 8243 } 8244 8245 // fall back from options to animation in case of partial down settings 8246 easing = easing || options.easing || animate.easing; 8247 duration = duration || options.duration || animate.duration; 8248 8249 if (!toHide.length) { 8250 return toShow.animate(this.showProps, duration, easing, complete); 8251 } 8252 if (!toShow.length) { 8253 return toHide.animate(this.hideProps, duration, easing, complete); 8254 } 8255 8256 total = toShow.show().outerHeight(); 8257 toHide.animate(this.hideProps, { 8258 duration: duration, 8259 easing: easing, 8260 step: function (now, fx) { 8261 fx.now = Math.round(now); 8262 } 8263 }); 8264 toShow 8265 .hide() 8266 .animate(this.showProps, { 8267 duration: duration, 8268 easing: easing, 8269 complete: complete, 8270 step: function (now, fx) { 8271 fx.now = Math.round(now); 8272 if (fx.prop !== "height") { 8273 if (boxSizing === "content-box") { 8274 adjust += fx.now; 8275 } 8276 } else if (that.options.heightStyle !== "content") { 8277 fx.now = Math.round(total - toHide.outerHeight() - adjust); 8278 adjust = 0; 8279 } 8280 } 8281 }); 8282 }, 8283 8284 _toggleComplete: function (data) { 8285 var toHide = data.oldPanel, 8286 prev = toHide.prev(); 8287 8288 this._removeClass(toHide, "ui-accordion-content-active"); 8289 this._removeClass(prev, "ui-accordion-header-active") 8290 ._addClass(prev, "ui-accordion-header-collapsed"); 8291 8292 // Work around for rendering bug in IE (#5421) 8293 if (toHide.length) { 8294 toHide.parent()[0].className = toHide.parent()[0].className; 8295 } 8296 this._trigger("activate", null, data); 8297 } 8298 }); 8299 8300 8301 /*! 8302 * jQuery UI Menu 1.13.1 8303 * http://jqueryui.com 8304 * 8305 * Copyright jQuery Foundation and other contributors 8306 * Released under the MIT license. 8307 * http://jquery.org/license 8308 */ 8309 8310 //>>label: Menu 8311 //>>group: Widgets 8312 //>>description: Creates nestable menus. 8313 //>>docs: http://api.jqueryui.com/menu/ 8314 //>>demos: http://jqueryui.com/menu/ 8315 //>>css.structure: ../../themes/base/core.css 8316 //>>css.structure: ../../themes/base/menu.css 8317 //>>css.theme: ../../themes/base/theme.css 8318 8319 8320 var widgetsMenu = $.widget("ui.menu", { 8321 version: "1.13.1", 8322 defaultElement: "<ul>", 8323 delay: 300, 8324 options: { 8325 icons: { 8326 submenu: "ui-icon-caret-1-e" 8327 }, 8328 items: "> *", 8329 menus: "ul", 8330 position: { 8331 my: "left top", 8332 at: "right top" 8333 }, 8334 role: "menu", 8335 8336 // Callbacks 8337 blur: null, 8338 focus: null, 8339 select: null 8340 }, 8341 8342 _create: function () { 8343 this.activeMenu = this.element; 8344 8345 // Flag used to prevent firing of the click handler 8346 // as the event bubbles up through nested menus 8347 this.mouseHandled = false; 8348 this.lastMousePosition = { x: null, y: null }; 8349 this.element 8350 .uniqueId() 8351 .attr({ 8352 role: this.options.role, 8353 tabIndex: 0 8354 }); 8355 8356 this._addClass("ui-menu", "ui-widget ui-widget-content"); 8357 this._on({ 8358 8359 // Prevent focus from sticking to links inside menu after clicking 8360 // them (focus should always stay on UL during navigation). 8361 "mousedown .ui-menu-item": function (event) { 8362 event.preventDefault(); 8363 8364 this._activateItem(event); 8365 }, 8366 "click .ui-menu-item": function (event) { 8367 var target = $(event.target); 8368 var active = $($.ui.safeActiveElement(this.document[0])); 8369 if (!this.mouseHandled && target.not(".ui-state-disabled").length) { 8370 this.select(event); 8371 8372 // Only set the mouseHandled flag if the event will bubble, see #9469. 8373 if (!event.isPropagationStopped()) { 8374 this.mouseHandled = true; 8375 } 8376 8377 // Open submenu on click 8378 if (target.has(".ui-menu").length) { 8379 this.expand(event); 8380 } else if (!this.element.is(":focus") && 8381 active.closest(".ui-menu").length) { 8382 8383 // Redirect focus to the menu 8384 this.element.trigger("focus", [true]); 8385 8386 // If the active item is on the top level, let it stay active. 8387 // Otherwise, blur the active item since it is no longer visible. 8388 if (this.active && this.active.parents(".ui-menu").length === 1) { 8389 clearTimeout(this.timer); 8390 } 8391 } 8392 } 8393 }, 8394 "mouseenter .ui-menu-item": "_activateItem", 8395 "mousemove .ui-menu-item": "_activateItem", 8396 mouseleave: "collapseAll", 8397 "mouseleave .ui-menu": "collapseAll", 8398 focus: function (event, keepActiveItem) { 8399 8400 // If there's already an active item, keep it active 8401 // If not, activate the first item 8402 var item = this.active || this._menuItems().first(); 8403 8404 if (!keepActiveItem) { 8405 this.focus(event, item); 8406 } 8407 }, 8408 blur: function (event) { 8409 this._delay(function () { 8410 var notContained = !$.contains( 8411 this.element[0], 8412 $.ui.safeActiveElement(this.document[0]) 8413 ); 8414 if (notContained) { 8415 this.collapseAll(event); 8416 } 8417 });
vendor: 13,718 bytes, lines 8418-8911
8418 }, 8419 keydown: "_keydown" 8420 }); 8421 8422 this.refresh(); 8423 8424 // Clicks outside of a menu collapse any open menus 8425 this._on(this.document, { 8426 click: function (event) { 8427 if (this._closeOnDocumentClick(event)) { 8428 this.collapseAll(event, true); 8429 } 8430 8431 // Reset the mouseHandled flag 8432 this.mouseHandled = false; 8433 } 8434 }); 8435 }, 8436 8437 _activateItem: function (event) { 8438 8439 // Ignore mouse events while typeahead is active, see #10458. 8440 // Prevents focusing the wrong item when typeahead causes a scroll while the mouse 8441 // is over an item in the menu 8442 if (this.previousFilter) { 8443 return; 8444 } 8445 8446 // If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356) 8447 if (event.clientX === this.lastMousePosition.x && 8448 event.clientY === this.lastMousePosition.y) { 8449 return; 8450 } 8451 8452 this.lastMousePosition = { 8453 x: event.clientX, 8454 y: event.clientY 8455 }; 8456 8457 var actualTarget = $(event.target).closest(".ui-menu-item"), 8458 target = $(event.currentTarget); 8459 8460 // Ignore bubbled events on parent items, see #11641 8461 if (actualTarget[0] !== target[0]) { 8462 return; 8463 } 8464 8465 // If the item is already active, there's nothing to do 8466 if (target.is(".ui-state-active")) { 8467 return; 8468 } 8469 8470 // Remove ui-state-active class from siblings of the newly focused menu item 8471 // to avoid a jump caused by adjacent elements both having a class with a border 8472 this._removeClass(target.siblings().children(".ui-state-active"), 8473 null, "ui-state-active"); 8474 this.focus(event, target); 8475 }, 8476 8477 _destroy: function () { 8478 var items = this.element.find(".ui-menu-item") 8479 .removeAttr("role aria-disabled"), 8480 submenus = items.children(".ui-menu-item-wrapper") 8481 .removeUniqueId() 8482 .removeAttr("tabIndex role aria-haspopup"); 8483 8484 // Destroy (sub)menus 8485 this.element 8486 .removeAttr("aria-activedescendant") 8487 .find(".ui-menu").addBack() 8488 .removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled " + 8489 "tabIndex") 8490 .removeUniqueId() 8491 .show(); 8492 8493 submenus.children().each(function () { 8494 var elem = $(this); 8495 if (elem.data("ui-menu-submenu-caret")) { 8496 elem.remove(); 8497 } 8498 }); 8499 }, 8500 8501 _keydown: function (event) { 8502 var match, prev, character, skip, 8503 preventDefault = true; 8504 8505 switch (event.keyCode) { 8506 case $.ui.keyCode.PAGE_UP: 8507 this.previousPage(event); 8508 break; 8509 case $.ui.keyCode.PAGE_DOWN: 8510 this.nextPage(event); 8511 break; 8512 case $.ui.keyCode.HOME: 8513 this._move("first", "first", event); 8514 break; 8515 case $.ui.keyCode.END: 8516 this._move("last", "last", event); 8517 break; 8518 case $.ui.keyCode.UP: 8519 this.previous(event); 8520 break; 8521 case $.ui.keyCode.DOWN: 8522 this.next(event); 8523 break; 8524 case $.ui.keyCode.LEFT: 8525 this.collapse(event); 8526 break; 8527 case $.ui.keyCode.RIGHT: 8528 if (this.active && !this.active.is(".ui-state-disabled")) { 8529 this.expand(event); 8530 } 8531 break; 8532 case $.ui.keyCode.ENTER: 8533 case $.ui.keyCode.SPACE: 8534 this._activate(event); 8535 break; 8536 case $.ui.keyCode.ESCAPE: 8537 this.collapse(event); 8538 break; 8539 default: 8540 preventDefault = false; 8541 prev = this.previousFilter || ""; 8542 skip = false; 8543 8544 // Support number pad values 8545 character = event.keyCode >= 96 && event.keyCode <= 105 ? 8546 (event.keyCode - 96).toString() : String.fromCharCode(event.keyCode); 8547 8548 clearTimeout(this.filterTimer); 8549 8550 if (character === prev) { 8551 skip = true; 8552 } else { 8553 character = prev + character; 8554 } 8555 8556 match = this._filterMenuItems(character); 8557 match = skip && match.index(this.active.next()) !== -1 ? 8558 this.active.nextAll(".ui-menu-item") : 8559 match; 8560 8561 // If no matches on the current filter, reset to the last character pressed 8562 // to move down the menu to the first item that starts with that character 8563 if (!match.length) { 8564 character = String.fromCharCode(event.keyCode); 8565 match = this._filterMenuItems(character); 8566 } 8567 8568 if (match.length) { 8569 this.focus(event, match); 8570 this.previousFilter = character; 8571 this.filterTimer = this._delay(function () { 8572 delete this.previousFilter; 8573 }, 1000); 8574 } else { 8575 delete this.previousFilter; 8576 } 8577 } 8578 8579 if (preventDefault) { 8580 event.preventDefault(); 8581 } 8582 }, 8583 8584 _activate: function (event) { 8585 if (this.active && !this.active.is(".ui-state-disabled")) { 8586 if (this.active.children("[aria-haspopup='true']").length) { 8587 this.expand(event); 8588 } else { 8589 this.select(event); 8590 } 8591 } 8592 }, 8593 8594 refresh: function () { 8595 var menus, items, newSubmenus, newItems, newWrappers, 8596 that = this, 8597 icon = this.options.icons.submenu, 8598 submenus = this.element.find(this.options.menus); 8599 8600 this._toggleClass("ui-menu-icons", null, !!this.element.find(".ui-icon").length); 8601 8602 // Initialize nested menus 8603 newSubmenus = submenus.filter(":not(.ui-menu)") 8604 .hide() 8605 .attr({ 8606 role: this.options.role, 8607 "aria-hidden": "true", 8608 "aria-expanded": "false" 8609 }) 8610 .each(function () { 8611 var menu = $(this), 8612 item = menu.prev(), 8613 submenuCaret = $("<span>").data("ui-menu-submenu-caret", true); 8614 8615 that._addClass(submenuCaret, "ui-menu-icon", "ui-icon " + icon); 8616 item 8617 .attr("aria-haspopup", "true") 8618 .prepend(submenuCaret); 8619 menu.attr("aria-labelledby", item.attr("id")); 8620 }); 8621 8622 this._addClass(newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front"); 8623 8624 menus = submenus.add(this.element); 8625 items = menus.find(this.options.items); 8626 8627 // Initialize menu-items containing spaces and/or dashes only as dividers 8628 items.not(".ui-menu-item").each(function () { 8629 var item = $(this); 8630 if (that._isDivider(item)) { 8631 that._addClass(item, "ui-menu-divider", "ui-widget-content"); 8632 } 8633 }); 8634 8635 // Don't refresh list items that are already adapted 8636 newItems = items.not(".ui-menu-item, .ui-menu-divider"); 8637 newWrappers = newItems.children() 8638 .not(".ui-menu") 8639 .uniqueId() 8640 .attr({ 8641 tabIndex: -1, 8642 role: this._itemRole() 8643 }); 8644 this._addClass(newItems, "ui-menu-item") 8645 ._addClass(newWrappers, "ui-menu-item-wrapper"); 8646 8647 // Add aria-disabled attribute to any disabled menu item 8648 items.filter(".ui-state-disabled").attr("aria-disabled", "true"); 8649 8650 // If the active item has been removed, blur the menu 8651 if (this.active && !$.contains(this.element[0], this.active[0])) { 8652 this.blur(); 8653 } 8654 }, 8655 8656 _itemRole: function () { 8657 return { 8658 menu: "menuitem", 8659 listbox: "option" 8660 }[this.options.role]; 8661 }, 8662 8663 _setOption: function (key, value) { 8664 if (key === "icons") { 8665 var icons = this.element.find(".ui-menu-icon"); 8666 this._removeClass(icons, null, this.options.icons.submenu) 8667 ._addClass(icons, null, value.submenu); 8668 } 8669 this._super(key, value); 8670 }, 8671 8672 _setOptionDisabled: function (value) { 8673 this._super(value); 8674 8675 this.element.attr("aria-disabled", String(value)); 8676 this._toggleClass(null, "ui-state-disabled", !!value); 8677 }, 8678 8679 focus: function (event, item) { 8680 var nested, focused, activeParent; 8681 this.blur(event, event && event.type === "focus"); 8682 8683 this._scrollIntoView(item); 8684 8685 this.active = item.first(); 8686 8687 focused = this.active.children(".ui-menu-item-wrapper"); 8688 this._addClass(focused, null, "ui-state-active"); 8689 8690 // Only update aria-activedescendant if there's a role 8691 // otherwise we assume focus is managed elsewhere 8692 if (this.options.role) { 8693 this.element.attr("aria-activedescendant", focused.attr("id")); 8694 } 8695 8696 // Highlight active parent menu item, if any 8697 activeParent = this.active 8698 .parent() 8699 .closest(".ui-menu-item") 8700 .children(".ui-menu-item-wrapper"); 8701 this._addClass(activeParent, null, "ui-state-active"); 8702 8703 if (event && event.type === "keydown") { 8704 this._close(); 8705 } else { 8706 this.timer = this._delay(function () { 8707 this._close(); 8708 }, this.delay); 8709 } 8710 8711 nested = item.children(".ui-menu"); 8712 if (nested.length && event && (/^mouse/.test(event.type))) { 8713 this._startOpening(nested); 8714 } 8715 this.activeMenu = item.parent(); 8716 8717 this._trigger("focus", event, { item: item }); 8718 }, 8719 8720 _scrollIntoView: function (item) { 8721 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; 8722 if (this._hasScroll()) { 8723 borderTop = parseFloat($.css(this.activeMenu[0], "borderTopWidth")) || 0; 8724 paddingTop = parseFloat($.css(this.activeMenu[0], "paddingTop")) || 0; 8725 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; 8726 scroll = this.activeMenu.scrollTop(); 8727 elementHeight = this.activeMenu.height(); 8728 itemHeight = item.outerHeight(); 8729 8730 if (offset < 0) { 8731 this.activeMenu.scrollTop(scroll + offset); 8732 } else if (offset + itemHeight > elementHeight) { 8733 this.activeMenu.scrollTop(scroll + offset - elementHeight + itemHeight); 8734 } 8735 } 8736 }, 8737 8738 blur: function (event, fromFocus) { 8739 if (!fromFocus) { 8740 clearTimeout(this.timer); 8741 } 8742 8743 if (!this.active) { 8744 return; 8745 } 8746 8747 this._removeClass(this.active.children(".ui-menu-item-wrapper"), 8748 null, "ui-state-active"); 8749 8750 this._trigger("blur", event, { item: this.active }); 8751 this.active = null; 8752 }, 8753 8754 _startOpening: function (submenu) { 8755 clearTimeout(this.timer); 8756 8757 // Don't open if already open fixes a Firefox bug that caused a .5 pixel 8758 // shift in the submenu position when mousing over the caret icon 8759 if (submenu.attr("aria-hidden") !== "true") { 8760 return; 8761 } 8762 8763 this.timer = this._delay(function () { 8764 this._close(); 8765 this._open(submenu); 8766 }, this.delay); 8767 }, 8768 8769 _open: function (submenu) { 8770 var position = $.extend({ 8771 of: this.active 8772 }, this.options.position); 8773 8774 clearTimeout(this.timer); 8775 this.element.find(".ui-menu").not(submenu.parents(".ui-menu")) 8776 .hide() 8777 .attr("aria-hidden", "true"); 8778 8779 submenu 8780 .show() 8781 .removeAttr("aria-hidden") 8782 .attr("aria-expanded", "true") 8783 .position(position); 8784 }, 8785 8786 collapseAll: function (event, all) { 8787 clearTimeout(this.timer); 8788 this.timer = this._delay(function () { 8789 8790 // If we were passed an event, look for the submenu that contains the event 8791 var currentMenu = all ? this.element : 8792 $(event && event.target).closest(this.element.find(".ui-menu")); 8793 8794 // If we found no valid submenu ancestor, use the main menu to close all 8795 // sub menus anyway 8796 if (!currentMenu.length) { 8797 currentMenu = this.element; 8798 } 8799 8800 this._close(currentMenu); 8801 8802 this.blur(event); 8803 8804 // Work around active item staying active after menu is blurred 8805 this._removeClass(currentMenu.find(".ui-state-active"), null, "ui-state-active"); 8806 8807 this.activeMenu = currentMenu; 8808 }, all ? 0 : this.delay); 8809 }, 8810 8811 // With no arguments, closes the currently active menu - if nothing is active 8812 // it closes all menus. If passed an argument, it will search for menus BELOW 8813 _close: function (startMenu) { 8814 if (!startMenu) { 8815 startMenu = this.active ? this.active.parent() : this.element; 8816 } 8817 8818 startMenu.find(".ui-menu") 8819 .hide() 8820 .attr("aria-hidden", "true") 8821 .attr("aria-expanded", "false"); 8822 }, 8823 8824 _closeOnDocumentClick: function (event) { 8825 return !$(event.target).closest(".ui-menu").length; 8826 }, 8827 8828 _isDivider: function (item) { 8829 8830 // Match hyphen, em dash, en dash 8831 return !/[^\-\u2014\u2013\s]/.test(item.text()); 8832 }, 8833 8834 collapse: function (event) { 8835 var newItem = this.active && 8836 this.active.parent().closest(".ui-menu-item", this.element); 8837 if (newItem && newItem.length) { 8838 this._close(); 8839 this.focus(event, newItem); 8840 } 8841 }, 8842 8843 expand: function (event) { 8844 var newItem = this.active && this._menuItems(this.active.children(".ui-menu")).first(); 8845 8846 if (newItem && newItem.length) { 8847 this._open(newItem.parent()); 8848 8849 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT 8850 this._delay(function () { 8851 this.focus(event, newItem); 8852 }); 8853 } 8854 }, 8855 8856 next: function (event) { 8857 this._move("next", "first", event); 8858 }, 8859 8860 previous: function (event) { 8861 this._move("prev", "last", event); 8862 }, 8863 8864 isFirstItem: function () { 8865 return this.active && !this.active.prevAll(".ui-menu-item").length; 8866 }, 8867 8868 isLastItem: function () { 8869 return this.active && !this.active.nextAll(".ui-menu-item").length; 8870 }, 8871 8872 _menuItems: function (menu) { 8873 return (menu || this.element) 8874 .find(this.options.items) 8875 .filter(".ui-menu-item"); 8876 }, 8877 8878 _move: function (direction, filter, event) { 8879 var next; 8880 if (this.active) { 8881 if (direction === "first" || direction === "last") { 8882 next = this.active 8883 [direction === "first" ? "prevAll" : "nextAll"](".ui-menu-item") 8884 .last(); 8885 } else { 8886 next = this.active 8887 [direction + "All"](".ui-menu-item") 8888 .first(); 8889 } 8890 } 8891 if (!next || !next.length || !this.active) { 8892 next = this._menuItems(this.activeMenu)[filter](); 8893 } 8894 8895 this.focus(event, next); 8896 }, 8897 8898 nextPage: function (event) { 8899 var item, base, height; 8900 8901 if (!this.active) { 8902 this.next(event); 8903 return; 8904 } 8905 if (this.isLastItem()) { 8906 return; 8907 } 8908 if (this._hasScroll()) { 8909 base = this.active.offset().top; 8910 height = this.element.innerHeight(); 8911
vendor: 13,108 bytes, lines 8912-9364
8912 // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. 8913 if ($.fn.jquery.indexOf("3.2.") === 0) { 8914 height += this.element[0].offsetHeight - this.element.outerHeight(); 8915 } 8916 8917 this.active.nextAll(".ui-menu-item").each(function () { 8918 item = $(this); 8919 return item.offset().top - base - height < 0; 8920 }); 8921 8922 this.focus(event, item); 8923 } else { 8924 this.focus(event, this._menuItems(this.activeMenu) 8925 [!this.active ? "first" : "last"]()); 8926 } 8927 }, 8928 8929 previousPage: function (event) { 8930 var item, base, height; 8931 if (!this.active) { 8932 this.next(event); 8933 return; 8934 } 8935 if (this.isFirstItem()) { 8936 return; 8937 } 8938 if (this._hasScroll()) { 8939 base = this.active.offset().top; 8940 height = this.element.innerHeight(); 8941 8942 // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. 8943 if ($.fn.jquery.indexOf("3.2.") === 0) { 8944 height += this.element[0].offsetHeight - this.element.outerHeight(); 8945 } 8946 8947 this.active.prevAll(".ui-menu-item").each(function () { 8948 item = $(this); 8949 return item.offset().top - base + height > 0; 8950 }); 8951 8952 this.focus(event, item); 8953 } else { 8954 this.focus(event, this._menuItems(this.activeMenu).first()); 8955 } 8956 }, 8957 8958 _hasScroll: function () { 8959 return this.element.outerHeight() < this.element.prop("scrollHeight"); 8960 }, 8961 8962 select: function (event) { 8963 8964 // TODO: It should never be possible to not have an active item at this 8965 // point, but the tests don't trigger mouseenter before click. 8966 this.active = this.active || $(event.target).closest(".ui-menu-item"); 8967 var ui = { item: this.active }; 8968 if (!this.active.has(".ui-menu").length) { 8969 this.collapseAll(event, true); 8970 } 8971 this._trigger("select", event, ui); 8972 }, 8973 8974 _filterMenuItems: function (character) { 8975 var escapedCharacter = character.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"), 8976 regex = new RegExp("^" + escapedCharacter, "i"); 8977 8978 return this.activeMenu 8979 .find(this.options.items) 8980 8981 // Only match on items, not dividers or other content (#10571) 8982 .filter(".ui-menu-item") 8983 .filter(function () { 8984 return regex.test( 8985 String.prototype.trim.call( 8986 $(this).children(".ui-menu-item-wrapper").text())); 8987 }); 8988 } 8989 }); 8990 8991 8992 /*! 8993 * jQuery UI Autocomplete 1.13.1 8994 * http://jqueryui.com 8995 * 8996 * Copyright jQuery Foundation and other contributors 8997 * Released under the MIT license. 8998 * http://jquery.org/license 8999 */ 9000 9001 //>>label: Autocomplete 9002 //>>group: Widgets 9003 //>>description: Lists suggested words as the user is typing. 9004 //>>docs: http://api.jqueryui.com/autocomplete/ 9005 //>>demos: http://jqueryui.com/autocomplete/ 9006 //>>css.structure: ../../themes/base/core.css 9007 //>>css.structure: ../../themes/base/autocomplete.css 9008 //>>css.theme: ../../themes/base/theme.css 9009 9010 9011 $.widget("ui.autocomplete", { 9012 version: "1.13.1", 9013 defaultElement: "<input>", 9014 options: { 9015 appendTo: null, 9016 autoFocus: false, 9017 delay: 300, 9018 minLength: 1, 9019 position: { 9020 my: "left top", 9021 at: "left bottom", 9022 collision: "none" 9023 }, 9024 source: null, 9025 9026 // Callbacks 9027 change: null, 9028 close: null, 9029 focus: null, 9030 open: null, 9031 response: null, 9032 search: null, 9033 select: null 9034 }, 9035 9036 requestIndex: 0, 9037 pending: 0, 9038 liveRegionTimer: null, 9039 9040 _create: function () { 9041 9042 // Some browsers only repeat keydown events, not keypress events, 9043 // so we use the suppressKeyPress flag to determine if we've already 9044 // handled the keydown event. #7269 9045 // Unfortunately the code for & in keypress is the same as the up arrow, 9046 // so we use the suppressKeyPressRepeat flag to avoid handling keypress 9047 // events when we know the keydown event was used to modify the 9048 // search term. #7799 9049 var suppressKeyPress, suppressKeyPressRepeat, suppressInput, 9050 nodeName = this.element[0].nodeName.toLowerCase(), 9051 isTextarea = nodeName === "textarea", 9052 isInput = nodeName === "input"; 9053 9054 // Textareas are always multi-line 9055 // Inputs are always single-line, even if inside a contentEditable element 9056 // IE also treats inputs as contentEditable 9057 // All other element types are determined by whether or not they're contentEditable 9058 this.isMultiLine = isTextarea || !isInput && this._isContentEditable(this.element); 9059 9060 this.valueMethod = this.element[isTextarea || isInput ? "val" : "text"]; 9061 this.isNewMenu = true; 9062 9063 this._addClass("ui-autocomplete-input"); 9064 this.element.attr("autocomplete", "off"); 9065 9066 this._on(this.element, { 9067 keydown: function (event) { 9068 if (this.element.prop("readOnly")) { 9069 suppressKeyPress = true; 9070 suppressInput = true; 9071 suppressKeyPressRepeat = true; 9072 return; 9073 } 9074 9075 suppressKeyPress = false; 9076 suppressInput = false; 9077 suppressKeyPressRepeat = false; 9078 var keyCode = $.ui.keyCode; 9079 switch (event.keyCode) { 9080 case keyCode.PAGE_UP: 9081 suppressKeyPress = true; 9082 this._move("previousPage", event); 9083 break; 9084 case keyCode.PAGE_DOWN: 9085 suppressKeyPress = true; 9086 this._move("nextPage", event); 9087 break; 9088 case keyCode.UP: 9089 suppressKeyPress = true; 9090 this._keyEvent("previous", event); 9091 break; 9092 case keyCode.DOWN: 9093 suppressKeyPress = true; 9094 this._keyEvent("next", event); 9095 break; 9096 case keyCode.ENTER: 9097 9098 // when menu is open and has focus 9099 if (this.menu.active) { 9100 9101 // #6055 - Opera still allows the keypress to occur 9102 // which causes forms to submit 9103 suppressKeyPress = true; 9104 event.preventDefault(); 9105 this.menu.select(event); 9106 } 9107 break; 9108 case keyCode.TAB: 9109 if (this.menu.active) { 9110 this.menu.select(event); 9111 } 9112 break; 9113 case keyCode.ESCAPE: 9114 if (this.menu.element.is(":visible")) { 9115 if (!this.isMultiLine) { 9116 this._value(this.term); 9117 } 9118 this.close(event); 9119 9120 // Different browsers have different default behavior for escape 9121 // Single press can mean undo or clear 9122 // Double press in IE means clear the whole form 9123 event.preventDefault(); 9124 } 9125 break; 9126 default: 9127 suppressKeyPressRepeat = true; 9128 9129 // search timeout should be triggered before the input value is changed 9130 this._searchTimeout(event); 9131 break; 9132 } 9133 }, 9134 keypress: function (event) { 9135 if (suppressKeyPress) { 9136 suppressKeyPress = false; 9137 if (!this.isMultiLine || this.menu.element.is(":visible")) { 9138 event.preventDefault(); 9139 } 9140 return; 9141 } 9142 if (suppressKeyPressRepeat) { 9143 return; 9144 } 9145 9146 // Replicate some key handlers to allow them to repeat in Firefox and Opera 9147 var keyCode = $.ui.keyCode; 9148 switch (event.keyCode) { 9149 case keyCode.PAGE_UP: 9150 this._move("previousPage", event); 9151 break; 9152 case keyCode.PAGE_DOWN: 9153 this._move("nextPage", event); 9154 break; 9155 case keyCode.UP: 9156 this._keyEvent("previous", event); 9157 break; 9158 case keyCode.DOWN: 9159 this._keyEvent("next", event); 9160 break; 9161 } 9162 }, 9163 input: function (event) { 9164 if (suppressInput) { 9165 suppressInput = false; 9166 event.preventDefault(); 9167 return; 9168 } 9169 this._searchTimeout(event); 9170 }, 9171 focus: function () { 9172 this.selectedItem = null; 9173 this.previous = this._value(); 9174 }, 9175 blur: function (event) { 9176 clearTimeout(this.searching); 9177 this.close(event); 9178 this._change(event); 9179 } 9180 }); 9181 9182 this._initSource(); 9183 this.menu = $("<ul>") 9184 .appendTo(this._appendTo()) 9185 .menu({ 9186 9187 // disable ARIA support, the live region takes care of that 9188 role: null 9189 }) 9190 .hide() 9191 9192 // Support: IE 11 only, Edge <= 14 9193 // For other browsers, we preventDefault() on the mousedown event 9194 // to keep the dropdown from taking focus from the input. This doesn't 9195 // work for IE/Edge, causing problems with selection and scrolling (#9638) 9196 // Happily, IE and Edge support an "unselectable" attribute that 9197 // prevents an element from receiving focus, exactly what we want here. 9198 .attr({ 9199 "unselectable": "on" 9200 }) 9201 .menu("instance"); 9202 9203 this._addClass(this.menu.element, "ui-autocomplete", "ui-front"); 9204 this._on(this.menu.element, { 9205 mousedown: function (event) { 9206 9207 // Prevent moving focus out of the text field 9208 event.preventDefault(); 9209 }, 9210 menufocus: function (event, ui) { 9211 var label, item; 9212 9213 // support: Firefox 9214 // Prevent accidental activation of menu items in Firefox (#7024 #9118) 9215 if (this.isNewMenu) { 9216 this.isNewMenu = false; 9217 if (event.originalEvent && /^mouse/.test(event.originalEvent.type)) { 9218 this.menu.blur(); 9219 9220 this.document.one("mousemove", function () { 9221 $(event.target).trigger(event.originalEvent); 9222 }); 9223 9224 return; 9225 } 9226 } 9227 9228 item = ui.item.data("ui-autocomplete-item"); 9229 if (false !== this._trigger("focus", event, { item: item })) { 9230 9231 // use value to match what will end up in the input, if it was a key event 9232 if (event.originalEvent && /^key/.test(event.originalEvent.type)) { 9233 this._value(item.value); 9234 } 9235 } 9236 9237 // Announce the value in the liveRegion 9238 label = ui.item.attr("aria-label") || item.value; 9239 if (label && String.prototype.trim.call(label).length) { 9240 clearTimeout(this.liveRegionTimer); 9241 this.liveRegionTimer = this._delay(function () { 9242 this.liveRegion.html($("<div>").text(label)); 9243 }, 100); 9244 } 9245 }, 9246 menuselect: function (event, ui) { 9247 var item = ui.item.data("ui-autocomplete-item"), 9248 previous = this.previous; 9249 9250 // Only trigger when focus was lost (click on menu) 9251 if (this.element[0] !== $.ui.safeActiveElement(this.document[0])) { 9252 this.element.trigger("focus"); 9253 this.previous = previous; 9254 9255 // #6109 - IE triggers two focus events and the second 9256 // is asynchronous, so we need to reset the previous 9257 // term synchronously and asynchronously :-( 9258 this._delay(function () { 9259 this.previous = previous; 9260 this.selectedItem = item; 9261 }); 9262 } 9263 9264 if (false !== this._trigger("select", event, { item: item })) { 9265 this._value(item.value); 9266 } 9267 9268 // reset the term after the select event 9269 // this allows custom select handling to work properly 9270 this.term = this._value(); 9271 9272 this.close(event); 9273 this.selectedItem = item; 9274 } 9275 }); 9276 9277 this.liveRegion = $("<div>", { 9278 role: "status", 9279 "aria-live": "assertive", 9280 "aria-relevant": "additions" 9281 }) 9282 .appendTo(this.document[0].body); 9283 9284 this._addClass(this.liveRegion, null, "ui-helper-hidden-accessible"); 9285 9286 // Turning off autocomplete prevents the browser from remembering the 9287 // value when navigating through history, so we re-enable autocomplete 9288 // if the page is unloaded before the widget is destroyed. #7790 9289 this._on(this.window, { 9290 beforeunload: function () { 9291 this.element.removeAttr("autocomplete"); 9292 } 9293 }); 9294 }, 9295 9296 _destroy: function () { 9297 clearTimeout(this.searching); 9298 this.element.removeAttr("autocomplete"); 9299 this.menu.element.remove(); 9300 this.liveRegion.remove(); 9301 }, 9302 9303 _setOption: function (key, value) { 9304 this._super(key, value); 9305 if (key === "source") { 9306 this._initSource(); 9307 } 9308 if (key === "appendTo") { 9309 this.menu.element.appendTo(this._appendTo()); 9310 } 9311 if (key === "disabled" && value && this.xhr) { 9312 this.xhr.abort(); 9313 } 9314 }, 9315 9316 _isEventTargetInWidget: function (event) { 9317 var menuElement = this.menu.element[0]; 9318 9319 return event.target === this.element[0] || 9320 event.target === menuElement || 9321 $.contains(menuElement, event.target); 9322 }, 9323 9324 _closeOnClickOutside: function (event) { 9325 if (!this._isEventTargetInWidget(event)) { 9326 this.close(); 9327 } 9328 }, 9329 9330 _appendTo: function () { 9331 var element = this.options.appendTo; 9332 9333 if (element) { 9334 element = element.jquery || element.nodeType ? 9335 $(element) : 9336 this.document.find(element).eq(0); 9337 } 9338 9339 if (!element || !element[0]) { 9340 element = this.element.closest(".ui-front, dialog"); 9341 } 9342 9343 if (!element.length) { 9344 element = this.document[0].body; 9345 } 9346 9347 return element; 9348 }, 9349 9350 _initSource: function () { 9351 var array, url, 9352 that = this; 9353 if (Array.isArray(this.options.source)) { 9354 array = this.options.source; 9355 this.source = function (request, response) { 9356 response($.ui.autocomplete.filter(array, request.term)); 9357 }; 9358 } else if (typeof this.options.source === "string") { 9359 url = this.options.source; 9360 this.source = function (request, response) { 9361 if (that.xhr) { 9362 that.xhr.abort(); 9363 } 9364 that.xhr = $.ajax({
vendor: 5,291 bytes, lines 9365-9581
9365 url: url, 9366 data: request, 9367 dataType: "json", 9368 success: function (data) { 9369 response(data); 9370 }, 9371 error: function () { 9372 response([]); 9373 } 9374 }); 9375 }; 9376 } else { 9377 this.source = this.options.source; 9378 } 9379 }, 9380 9381 _searchTimeout: function (event) { 9382 clearTimeout(this.searching); 9383 this.searching = this._delay(function () { 9384 9385 // Search if the value has changed, or if the user retypes the same value (see #7434) 9386 var equalValues = this.term === this._value(), 9387 menuVisible = this.menu.element.is(":visible"), 9388 modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; 9389 9390 if (!equalValues || (equalValues && !menuVisible && !modifierKey)) { 9391 this.selectedItem = null; 9392 this.search(null, event); 9393 } 9394 }, this.options.delay); 9395 }, 9396 9397 search: function (value, event) { 9398 value = value != null ? value : this._value(); 9399 9400 // Always save the actual value, not the one passed as an argument 9401 this.term = this._value(); 9402 9403 if (value.length < this.options.minLength) { 9404 return this.close(event); 9405 } 9406 9407 if (this._trigger("search", event) === false) { 9408 return; 9409 } 9410 9411 return this._search(value); 9412 }, 9413 9414 _search: function (value) { 9415 this.pending++; 9416 this._addClass("ui-autocomplete-loading"); 9417 this.cancelSearch = false; 9418 9419 this.source({ term: value }, this._response()); 9420 }, 9421 9422 _response: function () { 9423 var index = ++this.requestIndex; 9424 9425 return function (content) { 9426 if (index === this.requestIndex) { 9427 this.__response(content); 9428 } 9429 9430 this.pending--; 9431 if (!this.pending) { 9432 this._removeClass("ui-autocomplete-loading"); 9433 } 9434 }.bind(this); 9435 }, 9436 9437 __response: function (content) { 9438 if (content) { 9439 content = this._normalize(content); 9440 } 9441 this._trigger("response", null, { content: content }); 9442 if (!this.options.disabled && content && content.length && !this.cancelSearch) { 9443 this._suggest(content); 9444 this._trigger("open"); 9445 } else { 9446 9447 // use ._close() instead of .close() so we don't cancel future searches 9448 this._close(); 9449 } 9450 }, 9451 9452 close: function (event) { 9453 this.cancelSearch = true; 9454 this._close(event); 9455 }, 9456 9457 _close: function (event) { 9458 9459 // Remove the handler that closes the menu on outside clicks 9460 this._off(this.document, "mousedown"); 9461 9462 if (this.menu.element.is(":visible")) { 9463 this.menu.element.hide(); 9464 this.menu.blur(); 9465 this.isNewMenu = true; 9466 this._trigger("close", event); 9467 } 9468 }, 9469 9470 _change: function (event) { 9471 if (this.previous !== this._value()) { 9472 this._trigger("change", event, { item: this.selectedItem }); 9473 } 9474 }, 9475 9476 _normalize: function (items) { 9477 9478 // assume all items have the right format when the first item is complete 9479 if (items.length && items[0].label && items[0].value) { 9480 return items; 9481 } 9482 return $.map(items, function (item) { 9483 if (typeof item === "string") { 9484 return { 9485 label: item, 9486 value: item 9487 }; 9488 } 9489 return $.extend({}, item, { 9490 label: item.label || item.value, 9491 value: item.value || item.label 9492 }); 9493 }); 9494 }, 9495 9496 _suggest: function (items) { 9497 var ul = this.menu.element.empty(); 9498 this._renderMenu(ul, items); 9499 this.isNewMenu = true; 9500 this.menu.refresh(); 9501 9502 // Size and position menu 9503 ul.show(); 9504 this._resizeMenu(); 9505 ul.position($.extend({ 9506 of: this.element 9507 }, this.options.position)); 9508 9509 if (this.options.autoFocus) { 9510 this.menu.next(); 9511 } 9512 9513 // Listen for interactions outside of the widget (#6642) 9514 this._on(this.document, { 9515 mousedown: "_closeOnClickOutside" 9516 }); 9517 }, 9518 9519 _resizeMenu: function () { 9520 var ul = this.menu.element; 9521 ul.outerWidth(Math.max( 9522 9523 // Firefox wraps long text (possibly a rounding bug) 9524 // so we add 1px to avoid the wrapping (#7513) 9525 ul.width("").outerWidth() + 1, 9526 this.element.outerWidth() 9527 )); 9528 }, 9529 9530 _renderMenu: function (ul, items) { 9531 var that = this; 9532 $.each(items, function (index, item) { 9533 that._renderItemData(ul, item); 9534 }); 9535 }, 9536 9537 _renderItemData: function (ul, item) { 9538 return this._renderItem(ul, item).data("ui-autocomplete-item", item); 9539 }, 9540 9541 _renderItem: function (ul, item) { 9542 return $("<li>") 9543 .append($("<div>").text(item.label)) 9544 .appendTo(ul); 9545 }, 9546 9547 _move: function (direction, event) { 9548 if (!this.menu.element.is(":visible")) { 9549 this.search(null, event); 9550 return; 9551 } 9552 if (this.menu.isFirstItem() && /^previous/.test(direction) || 9553 this.menu.isLastItem() && /^next/.test(direction)) { 9554 9555 if (!this.isMultiLine) { 9556 this._value(this.term); 9557 } 9558 9559 this.menu.blur(); 9560 return; 9561 } 9562 this.menu[direction](event); 9563 }, 9564 9565 widget: function () { 9566 return this.menu.element; 9567 }, 9568 9569 _value: function () { 9570 return this.valueMethod.apply(this.element, arguments); 9571 }, 9572 9573 _keyEvent: function (keyEvent, event) { 9574 if (!this.isMultiLine || this.menu.element.is(":visible")) { 9575 this._move(keyEvent, event); 9576 9577 // Prevents moving cursor to beginning/end of the text field in some browsers 9578 event.preventDefault(); 9579 } 9580 }, 9581
vendor: 4,339 bytes, lines 9582-9731
9582 // Support: Chrome <=50 9583 // We should be able to just use this.element.prop( "isContentEditable" ) 9584 // but hidden elements always report false in Chrome. 9585 // https://code.google.com/p/chromium/issues/detail?id=313082 9586 _isContentEditable: function (element) { 9587 if (!element.length) { 9588 return false; 9589 } 9590 9591 var editable = element.prop("contentEditable"); 9592 9593 if (editable === "inherit") { 9594 return this._isContentEditable(element.parent()); 9595 } 9596 9597 return editable === "true"; 9598 } 9599 }); 9600 9601 $.extend($.ui.autocomplete, { 9602 escapeRegex: function (value) { 9603 return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); 9604 }, 9605 filter: function (array, term) { 9606 var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i"); 9607 return $.grep(array, function (value) { 9608 return matcher.test(value.label || value.value || value); 9609 }); 9610 } 9611 }); 9612 9613 // Live region extension, adding a `messages` option 9614 // NOTE: This is an experimental API. We are still investigating 9615 // a full solution for string manipulation and internationalization. 9616 $.widget("ui.autocomplete", $.ui.autocomplete, { 9617 options: { 9618 messages: { 9619 noResults: "No search results.", 9620 results: function (amount) { 9621 return amount + (amount > 1 ? " results are" : " result is") + 9622 " available, use up and down arrow keys to navigate."; 9623 } 9624 } 9625 }, 9626 9627 __response: function (content) { 9628 var message; 9629 this._superApply(arguments); 9630 if (this.options.disabled || this.cancelSearch) { 9631 return; 9632 } 9633 if (content && content.length) { 9634 message = this.options.messages.results(content.length); 9635 } else { 9636 message = this.options.messages.noResults; 9637 } 9638 clearTimeout(this.liveRegionTimer); 9639 this.liveRegionTimer = this._delay(function () { 9640 this.liveRegion.html($("<div>").text(message)); 9641 }, 100); 9642 } 9643 }); 9644 9645 var widgetsAutocomplete = $.ui.autocomplete; 9646 9647 9648 /*! 9649 * jQuery UI Controlgroup 1.13.1 9650 * http://jqueryui.com 9651 * 9652 * Copyright jQuery Foundation and other contributors 9653 * Released under the MIT license. 9654 * http://jquery.org/license 9655 */ 9656 9657 //>>label: Controlgroup 9658 //>>group: Widgets 9659 //>>description: Visually groups form control widgets 9660 //>>docs: http://api.jqueryui.com/controlgroup/ 9661 //>>demos: http://jqueryui.com/controlgroup/ 9662 //>>css.structure: ../../themes/base/core.css 9663 //>>css.structure: ../../themes/base/controlgroup.css 9664 //>>css.theme: ../../themes/base/theme.css 9665 9666 9667 var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g; 9668 9669 var widgetsControlgroup = $.widget("ui.controlgroup", { 9670 version: "1.13.1", 9671 defaultElement: "<div>", 9672 options: { 9673 direction: "horizontal", 9674 disabled: null, 9675 onlyVisible: true, 9676 items: { 9677 "button": "input[type=button], input[type=submit], input[type=reset], button, a", 9678 "controlgroupLabel": ".ui-controlgroup-label", 9679 "checkboxradio": "input[type='checkbox'], input[type='radio']", 9680 "selectmenu": "select", 9681 "spinner": ".ui-spinner-input" 9682 } 9683 }, 9684 9685 _create: function () { 9686 this._enhance(); 9687 }, 9688 9689 // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation 9690 _enhance: function () { 9691 this.element.attr("role", "toolbar"); 9692 this.refresh(); 9693 }, 9694 9695 _destroy: function () { 9696 this._callChildMethod("destroy"); 9697 this.childWidgets.removeData("ui-controlgroup-data"); 9698 this.element.removeAttr("role"); 9699 if (this.options.items.controlgroupLabel) { 9700 this.element 9701 .find(this.options.items.controlgroupLabel) 9702 .find(".ui-controlgroup-label-contents") 9703 .contents().unwrap(); 9704 } 9705 }, 9706 9707 _initWidgets: function () { 9708 var that = this, 9709 childWidgets = []; 9710 9711 // First we iterate over each of the items options 9712 $.each(this.options.items, function (widget, selector) { 9713 var labels; 9714 var options = {}; 9715 9716 // Make sure the widget has a selector set 9717 if (!selector) { 9718 return; 9719 } 9720 9721 if (widget === "controlgroupLabel") { 9722 labels = that.element.find(selector); 9723 labels.each(function () { 9724 var element = $(this); 9725 9726 if (element.children(".ui-controlgroup-label-contents").length) { 9727 return; 9728 } 9729 element.contents() 9730 .wrapAll("<span class='ui-controlgroup-label-contents'></span>"); 9731 });
vendor: 4,936 bytes, lines 9732-9888
9732 that._addClass(labels, null, "ui-widget ui-widget-content ui-state-default"); 9733 childWidgets = childWidgets.concat(labels.get()); 9734 return; 9735 } 9736 9737 // Make sure the widget actually exists 9738 if (!$.fn[widget]) { 9739 return; 9740 } 9741 9742 // We assume everything is in the middle to start because we can't determine 9743 // first / last elements until all enhancments are done. 9744 if (that["_" + widget + "Options"]) { 9745 options = that["_" + widget + "Options"]("middle"); 9746 } else { 9747 options = { classes: {} }; 9748 } 9749 9750 // Find instances of this widget inside controlgroup and init them 9751 that.element 9752 .find(selector) 9753 .each(function () { 9754 var element = $(this); 9755 var instance = element[widget]("instance"); 9756 9757 // We need to clone the default options for this type of widget to avoid 9758 // polluting the variable options which has a wider scope than a single widget. 9759 var instanceOptions = $.widget.extend({}, options); 9760 9761 // If the button is the child of a spinner ignore it 9762 // TODO: Find a more generic solution 9763 if (widget === "button" && element.parent(".ui-spinner").length) { 9764 return; 9765 } 9766 9767 // Create the widget if it doesn't exist 9768 if (!instance) { 9769 instance = element[widget]()[widget]("instance"); 9770 } 9771 if (instance) { 9772 instanceOptions.classes = 9773 that._resolveClassesValues(instanceOptions.classes, instance); 9774 } 9775 element[widget](instanceOptions); 9776 9777 // Store an instance of the controlgroup to be able to reference 9778 // from the outermost element for changing options and refresh 9779 var widgetElement = element[widget]("widget"); 9780 $.data(widgetElement[0], "ui-controlgroup-data", 9781 instance ? instance : element[widget]("instance")); 9782 9783 childWidgets.push(widgetElement[0]); 9784 }); 9785 }); 9786 9787 this.childWidgets = $($.uniqueSort(childWidgets)); 9788 this._addClass(this.childWidgets, "ui-controlgroup-item"); 9789 }, 9790 9791 _callChildMethod: function (method) { 9792 this.childWidgets.each(function () { 9793 var element = $(this), 9794 data = element.data("ui-controlgroup-data"); 9795 if (data && data[method]) { 9796 data[method](); 9797 } 9798 }); 9799 }, 9800 9801 _updateCornerClass: function (element, position) { 9802 var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"; 9803 var add = this._buildSimpleOptions(position, "label").classes.label; 9804 9805 this._removeClass(element, null, remove); 9806 this._addClass(element, null, add); 9807 }, 9808 9809 _buildSimpleOptions: function (position, key) { 9810 var direction = this.options.direction === "vertical"; 9811 var result = { 9812 classes: {} 9813 }; 9814 result.classes[key] = { 9815 "middle": "", 9816 "first": "ui-corner-" + (direction ? "top" : "left"), 9817 "last": "ui-corner-" + (direction ? "bottom" : "right"), 9818 "only": "ui-corner-all" 9819 }[position]; 9820 9821 return result; 9822 }, 9823 9824 _spinnerOptions: function (position) { 9825 var options = this._buildSimpleOptions(position, "ui-spinner"); 9826 9827 options.classes["ui-spinner-up"] = ""; 9828 options.classes["ui-spinner-down"] = ""; 9829 9830 return options; 9831 }, 9832 9833 _buttonOptions: function (position) { 9834 return this._buildSimpleOptions(position, "ui-button"); 9835 }, 9836 9837 _checkboxradioOptions: function (position) { 9838 return this._buildSimpleOptions(position, "ui-checkboxradio-label"); 9839 }, 9840 9841 _selectmenuOptions: function (position) { 9842 var direction = this.options.direction === "vertical"; 9843 return { 9844 width: direction ? "auto" : false, 9845 classes: { 9846 middle: { 9847 "ui-selectmenu-button-open": "", 9848 "ui-selectmenu-button-closed": "" 9849 }, 9850 first: { 9851 "ui-selectmenu-button-open": "ui-corner-" + (direction ? "top" : "tl"), 9852 "ui-selectmenu-button-closed": "ui-corner-" + (direction ? "top" : "left") 9853 }, 9854 last: { 9855 "ui-selectmenu-button-open": direction ? "" : "ui-corner-tr", 9856 "ui-selectmenu-button-closed": "ui-corner-" + (direction ? "bottom" : "right") 9857 }, 9858 only: { 9859 "ui-selectmenu-button-open": "ui-corner-top", 9860 "ui-selectmenu-button-closed": "ui-corner-all" 9861 } 9862 9863 }[position] 9864 }; 9865 }, 9866 9867 _resolveClassesValues: function (classes, instance) { 9868 var result = {}; 9869 $.each(classes, function (key) { 9870 var current = instance.options.classes[key] || ""; 9871 current = String.prototype.trim.call(current.replace(controlgroupCornerRegex, "")); 9872 result[key] = (current + " " + classes[key]).replace(/\s+/g, " "); 9873 }); 9874 return result; 9875 }, 9876 9877 _setOption: function (key, value) { 9878 if (key === "direction") { 9879 this._removeClass("ui-controlgroup-" + this.options.direction); 9880 } 9881 9882 this._super(key, value); 9883 if (key === "disabled") { 9884 this._callChildMethod(value ? "disable" : "enable"); 9885 return; 9886 } 9887 9888 this.refresh();
vendor: 4,850 bytes, lines 9889-10048
9889 }, 9890 9891 refresh: function () { 9892 var children, 9893 that = this; 9894 9895 this._addClass("ui-controlgroup ui-controlgroup-" + this.options.direction); 9896 9897 if (this.options.direction === "horizontal") { 9898 this._addClass(null, "ui-helper-clearfix"); 9899 } 9900 this._initWidgets(); 9901 9902 children = this.childWidgets; 9903 9904 // We filter here because we need to track all childWidgets not just the visible ones 9905 if (this.options.onlyVisible) { 9906 children = children.filter(":visible"); 9907 } 9908 9909 if (children.length) { 9910 9911 // We do this last because we need to make sure all enhancment is done 9912 // before determining first and last 9913 $.each(["first", "last"], function (index, value) { 9914 var instance = children[value]().data("ui-controlgroup-data"); 9915 9916 if (instance && that["_" + instance.widgetName + "Options"]) { 9917 var options = that["_" + instance.widgetName + "Options"]( 9918 children.length === 1 ? "only" : value 9919 ); 9920 options.classes = that._resolveClassesValues(options.classes, instance); 9921 instance.element[instance.widgetName](options); 9922 } else { 9923 that._updateCornerClass(children[value](), value); 9924 } 9925 }); 9926 9927 // Finally call the refresh method on each of the child widgets. 9928 this._callChildMethod("refresh"); 9929 } 9930 } 9931 }); 9932 9933 /*! 9934 * jQuery UI Checkboxradio 1.13.1 9935 * http://jqueryui.com 9936 * 9937 * Copyright jQuery Foundation and other contributors 9938 * Released under the MIT license. 9939 * http://jquery.org/license 9940 */ 9941 9942 //>>label: Checkboxradio 9943 //>>group: Widgets 9944 //>>description: Enhances a form with multiple themeable checkboxes or radio buttons. 9945 //>>docs: http://api.jqueryui.com/checkboxradio/ 9946 //>>demos: http://jqueryui.com/checkboxradio/ 9947 //>>css.structure: ../../themes/base/core.css 9948 //>>css.structure: ../../themes/base/button.css 9949 //>>css.structure: ../../themes/base/checkboxradio.css 9950 //>>css.theme: ../../themes/base/theme.css 9951 9952 9953 $.widget("ui.checkboxradio", [$.ui.formResetMixin, { 9954 version: "1.13.1", 9955 options: { 9956 disabled: null, 9957 label: null, 9958 icon: true, 9959 classes: { 9960 "ui-checkboxradio-label": "ui-corner-all", 9961 "ui-checkboxradio-icon": "ui-corner-all" 9962 } 9963 }, 9964 9965 _getCreateOptions: function () { 9966 var disabled, labels; 9967 var that = this; 9968 var options = this._super() || {}; 9969 9970 // We read the type here, because it makes more sense to throw a element type error first, 9971 // rather then the error for lack of a label. Often if its the wrong type, it 9972 // won't have a label (e.g. calling on a div, btn, etc) 9973 this._readType(); 9974 9975 labels = this.element.labels(); 9976 9977 // If there are multiple labels, use the last one 9978 this.label = $(labels[labels.length - 1]); 9979 if (!this.label.length) { 9980 $.error("No label found for checkboxradio widget"); 9981 } 9982 9983 this.originalLabel = ""; 9984 9985 // We need to get the label text but this may also need to make sure it does not contain the 9986 // input itself. 9987 this.label.contents().not(this.element[0]).each(function () { 9988 9989 // The label contents could be text, html, or a mix. We concat each element to get a 9990 // string representation of the label, without the input as part of it. 9991 that.originalLabel += this.nodeType === 3 ? $(this).text() : this.outerHTML; 9992 }); 9993 9994 // Set the label option if we found label text 9995 if (this.originalLabel) { 9996 options.label = this.originalLabel; 9997 } 9998 9999 disabled = this.element[0].disabled; 10000 if (disabled != null) { 10001 options.disabled = disabled; 10002 } 10003 return options; 10004 }, 10005 10006 _create: function () { 10007 var checked = this.element[0].checked; 10008 10009 this._bindFormResetHandler(); 10010 10011 if (this.options.disabled == null) { 10012 this.options.disabled = this.element[0].disabled; 10013 } 10014 10015 this._setOption("disabled", this.options.disabled); 10016 this._addClass("ui-checkboxradio", "ui-helper-hidden-accessible"); 10017 this._addClass(this.label, "ui-checkboxradio-label", "ui-button ui-widget"); 10018 10019 if (this.type === "radio") { 10020 this._addClass(this.label, "ui-checkboxradio-radio-label"); 10021 } 10022 10023 if (this.options.label && this.options.label !== this.originalLabel) { 10024 this._updateLabel(); 10025 } else if (this.originalLabel) { 10026 this.options.label = this.originalLabel; 10027 } 10028 10029 this._enhance(); 10030 10031 if (checked) { 10032 this._addClass(this.label, "ui-checkboxradio-checked", "ui-state-active"); 10033 } 10034 10035 this._on({ 10036 change: "_toggleClasses", 10037 focus: function () { 10038 this._addClass(this.label, null, "ui-state-focus ui-visual-focus"); 10039 }, 10040 blur: function () { 10041 this._removeClass(this.label, null, "ui-state-focus ui-visual-focus"); 10042 } 10043 }); 10044 }, 10045 10046 _readType: function () { 10047 var nodeName = this.element[0].nodeName.toLowerCase(); 10048 this.type = this.element[0].type;
vendor: 2,386 bytes, lines 10049-10142
10049 if (nodeName !== "input" || !/radio|checkbox/.test(this.type)) { 10050 $.error("Can't create checkboxradio on element.nodeName=" + nodeName + 10051 " and element.type=" + this.type); 10052 } 10053 }, 10054 10055 // Support jQuery Mobile enhanced option 10056 _enhance: function () { 10057 this._updateIcon(this.element[0].checked); 10058 }, 10059 10060 widget: function () { 10061 return this.label; 10062 }, 10063 10064 _getRadioGroup: function () { 10065 var group; 10066 var name = this.element[0].name; 10067 var nameSelector = "input[name='" + $.escapeSelector(name) + "']"; 10068 10069 if (!name) { 10070 return $([]); 10071 } 10072 10073 if (this.form.length) { 10074 group = $(this.form[0].elements).filter(nameSelector); 10075 } else { 10076 10077 // Not inside a form, check all inputs that also are not inside a form 10078 group = $(nameSelector).filter(function () { 10079 return $(this)._form().length === 0; 10080 }); 10081 } 10082 10083 return group.not(this.element); 10084 }, 10085 10086 _toggleClasses: function () { 10087 var checked = this.element[0].checked; 10088 this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked); 10089 10090 if (this.options.icon && this.type === "checkbox") { 10091 this._toggleClass(this.icon, null, "ui-icon-check ui-state-checked", checked) 10092 ._toggleClass(this.icon, null, "ui-icon-blank", !checked); 10093 } 10094 10095 if (this.type === "radio") { 10096 this._getRadioGroup() 10097 .each(function () { 10098 var instance = $(this).checkboxradio("instance"); 10099 10100 if (instance) { 10101 instance._removeClass(instance.label, 10102 "ui-checkboxradio-checked", "ui-state-active"); 10103 } 10104 }); 10105 } 10106 }, 10107 10108 _destroy: function () { 10109 this._unbindFormResetHandler(); 10110 10111 if (this.icon) { 10112 this.icon.remove(); 10113 this.iconSpace.remove(); 10114 } 10115 }, 10116 10117 _setOption: function (key, value) { 10118 10119 // We don't allow the value to be set to nothing 10120 if (key === "label" && !value) { 10121 return; 10122 } 10123 10124 this._super(key, value); 10125 10126 if (key === "disabled") { 10127 this._toggleClass(this.label, null, "ui-state-disabled", value); 10128 this.element[0].disabled = value; 10129 10130 // Don't refresh when setting disabled 10131 return; 10132 } 10133 this.refresh(); 10134 }, 10135 10136 _updateIcon: function (checked) { 10137 var toAdd = "ui-icon ui-icon-background "; 10138 10139 if (this.options.icon) { 10140 if (!this.icon) { 10141 this.icon = $("<span>"); 10142 this.iconSpace = $("<span> </span>");
vendor: 5,778 bytes, lines 10143-10349
10143 this._addClass(this.iconSpace, "ui-checkboxradio-icon-space"); 10144 } 10145 10146 if (this.type === "checkbox") { 10147 toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank"; 10148 this._removeClass(this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check"); 10149 } else { 10150 toAdd += "ui-icon-blank"; 10151 } 10152 this._addClass(this.icon, "ui-checkboxradio-icon", toAdd); 10153 if (!checked) { 10154 this._removeClass(this.icon, null, "ui-icon-check ui-state-checked"); 10155 } 10156 this.icon.prependTo(this.label).after(this.iconSpace); 10157 } else if (this.icon !== undefined) { 10158 this.icon.remove(); 10159 this.iconSpace.remove(); 10160 delete this.icon; 10161 } 10162 }, 10163 10164 _updateLabel: function () { 10165 10166 // Remove the contents of the label ( minus the icon, icon space, and input ) 10167 var contents = this.label.contents().not(this.element[0]); 10168 if (this.icon) { 10169 contents = contents.not(this.icon[0]); 10170 } 10171 if (this.iconSpace) { 10172 contents = contents.not(this.iconSpace[0]); 10173 } 10174 contents.remove(); 10175 10176 this.label.append(this.options.label); 10177 }, 10178 10179 refresh: function () { 10180 var checked = this.element[0].checked, 10181 isDisabled = this.element[0].disabled; 10182 10183 this._updateIcon(checked); 10184 this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked); 10185 if (this.options.label !== null) { 10186 this._updateLabel(); 10187 } 10188 10189 if (isDisabled !== this.options.disabled) { 10190 this._setOptions({ "disabled": isDisabled }); 10191 } 10192 } 10193 10194 }]); 10195 10196 var widgetsCheckboxradio = $.ui.checkboxradio; 10197 10198 10199 /*! 10200 * jQuery UI Button 1.13.1 10201 * http://jqueryui.com 10202 * 10203 * Copyright jQuery Foundation and other contributors 10204 * Released under the MIT license. 10205 * http://jquery.org/license 10206 */ 10207 10208 //>>label: Button 10209 //>>group: Widgets 10210 //>>description: Enhances a form with themeable buttons. 10211 //>>docs: http://api.jqueryui.com/button/ 10212 //>>demos: http://jqueryui.com/button/ 10213 //>>css.structure: ../../themes/base/core.css 10214 //>>css.structure: ../../themes/base/button.css 10215 //>>css.theme: ../../themes/base/theme.css 10216 10217 10218 $.widget("ui.button", { 10219 version: "1.13.1", 10220 defaultElement: "<button>", 10221 options: { 10222 classes: { 10223 "ui-button": "ui-corner-all" 10224 }, 10225 disabled: null, 10226 icon: null, 10227 iconPosition: "beginning", 10228 label: null, 10229 showLabel: true 10230 }, 10231 10232 _getCreateOptions: function () { 10233 var disabled, 10234 10235 // This is to support cases like in jQuery Mobile where the base widget does have 10236 // an implementation of _getCreateOptions 10237 options = this._super() || {}; 10238 10239 this.isInput = this.element.is("input"); 10240 10241 disabled = this.element[0].disabled; 10242 if (disabled != null) { 10243 options.disabled = disabled; 10244 } 10245 10246 this.originalLabel = this.isInput ? this.element.val() : this.element.html(); 10247 if (this.originalLabel) { 10248 options.label = this.originalLabel; 10249 } 10250 10251 return options; 10252 }, 10253 10254 _create: function () { 10255 if (!this.option.showLabel & !this.options.icon) { 10256 this.options.showLabel = true; 10257 } 10258 10259 // We have to check the option again here even though we did in _getCreateOptions, 10260 // because null may have been passed on init which would override what was set in 10261 // _getCreateOptions 10262 if (this.options.disabled == null) { 10263 this.options.disabled = this.element[0].disabled || false; 10264 } 10265 10266 this.hasTitle = !!this.element.attr("title"); 10267 10268 // Check to see if the label needs to be set or if its already correct 10269 if (this.options.label && this.options.label !== this.originalLabel) { 10270 if (this.isInput) { 10271 this.element.val(this.options.label); 10272 } else { 10273 this.element.html(this.options.label); 10274 } 10275 } 10276 this._addClass("ui-button", "ui-widget"); 10277 this._setOption("disabled", this.options.disabled); 10278 this._enhance(); 10279 10280 if (this.element.is("a")) { 10281 this._on({ 10282 "keyup": function (event) { 10283 if (event.keyCode === $.ui.keyCode.SPACE) { 10284 event.preventDefault(); 10285 10286 // Support: PhantomJS <= 1.9, IE 8 Only 10287 // If a native click is available use it so we actually cause navigation 10288 // otherwise just trigger a click event 10289 if (this.element[0].click) { 10290 this.element[0].click(); 10291 } else { 10292 this.element.trigger("click"); 10293 } 10294 } 10295 } 10296 }); 10297 } 10298 }, 10299 10300 _enhance: function () { 10301 if (!this.element.is("button")) { 10302 this.element.attr("role", "button"); 10303 } 10304 10305 if (this.options.icon) { 10306 this._updateIcon("icon", this.options.icon); 10307 this._updateTooltip(); 10308 } 10309 }, 10310 10311 _updateTooltip: function () { 10312 this.title = this.element.attr("title"); 10313 10314 if (!this.options.showLabel && !this.title) { 10315 this.element.attr("title", this.options.label); 10316 } 10317 }, 10318 10319 _updateIcon: function (option, value) { 10320 var icon = option !== "iconPosition", 10321 position = icon ? this.options.iconPosition : value, 10322 displayBlock = position === "top" || position === "bottom"; 10323 10324 // Create icon 10325 if (!this.icon) { 10326 this.icon = $("<span>"); 10327 10328 this._addClass(this.icon, "ui-button-icon", "ui-icon"); 10329 10330 if (!this.options.showLabel) { 10331 this._addClass("ui-button-icon-only"); 10332 } 10333 } else if (icon) { 10334 10335 // If we are updating the icon remove the old icon class 10336 this._removeClass(this.icon, null, this.options.icon); 10337 } 10338 10339 // If we are updating the icon add the new icon class 10340 if (icon) { 10341 this._addClass(this.icon, null, value); 10342 } 10343 10344 this._attachIcon(position); 10345 10346 // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove 10347 // the iconSpace if there is one. 10348 if (displayBlock) { 10349 this._addClass(this.icon, null, "ui-widget-icon-block");
vendor: 6,075 bytes, lines 10350-10567
10350 if (this.iconSpace) { 10351 this.iconSpace.remove(); 10352 } 10353 } else { 10354 10355 // Position is beginning or end so remove the ui-widget-icon-block class and add the 10356 // space if it does not exist 10357 if (!this.iconSpace) { 10358 this.iconSpace = $("<span> </span>"); 10359 this._addClass(this.iconSpace, "ui-button-icon-space"); 10360 } 10361 this._removeClass(this.icon, null, "ui-wiget-icon-block"); 10362 this._attachIconSpace(position); 10363 } 10364 }, 10365 10366 _destroy: function () { 10367 this.element.removeAttr("role"); 10368 10369 if (this.icon) { 10370 this.icon.remove(); 10371 } 10372 if (this.iconSpace) { 10373 this.iconSpace.remove(); 10374 } 10375 if (!this.hasTitle) { 10376 this.element.removeAttr("title"); 10377 } 10378 }, 10379 10380 _attachIconSpace: function (iconPosition) { 10381 this.icon[/^(?:end|bottom)/.test(iconPosition) ? "before" : "after"](this.iconSpace); 10382 }, 10383 10384 _attachIcon: function (iconPosition) { 10385 this.element[/^(?:end|bottom)/.test(iconPosition) ? "append" : "prepend"](this.icon); 10386 }, 10387 10388 _setOptions: function (options) { 10389 var newShowLabel = options.showLabel === undefined ? 10390 this.options.showLabel : 10391 options.showLabel, 10392 newIcon = options.icon === undefined ? this.options.icon : options.icon; 10393 10394 if (!newShowLabel && !newIcon) { 10395 options.showLabel = true; 10396 } 10397 this._super(options); 10398 }, 10399 10400 _setOption: function (key, value) { 10401 if (key === "icon") { 10402 if (value) { 10403 this._updateIcon(key, value); 10404 } else if (this.icon) { 10405 this.icon.remove(); 10406 if (this.iconSpace) { 10407 this.iconSpace.remove(); 10408 } 10409 } 10410 } 10411 10412 if (key === "iconPosition") { 10413 this._updateIcon(key, value); 10414 } 10415 10416 // Make sure we can't end up with a button that has neither text nor icon 10417 if (key === "showLabel") { 10418 this._toggleClass("ui-button-icon-only", null, !value); 10419 this._updateTooltip(); 10420 } 10421 10422 if (key === "label") { 10423 if (this.isInput) { 10424 this.element.val(value); 10425 } else { 10426 10427 // If there is an icon, append it, else nothing then append the value 10428 // this avoids removal of the icon when setting label text 10429 this.element.html(value); 10430 if (this.icon) { 10431 this._attachIcon(this.options.iconPosition); 10432 this._attachIconSpace(this.options.iconPosition); 10433 } 10434 } 10435 } 10436 10437 this._super(key, value); 10438 10439 if (key === "disabled") { 10440 this._toggleClass(null, "ui-state-disabled", value); 10441 this.element[0].disabled = value; 10442 if (value) { 10443 this.element.trigger("blur"); 10444 } 10445 } 10446 }, 10447 10448 refresh: function () { 10449 10450 // Make sure to only check disabled if its an element that supports this otherwise 10451 // check for the disabled class to determine state 10452 var isDisabled = this.element.is("input, button") ? 10453 this.element[0].disabled : this.element.hasClass("ui-button-disabled"); 10454 10455 if (isDisabled !== this.options.disabled) { 10456 this._setOptions({ disabled: isDisabled }); 10457 } 10458 10459 this._updateTooltip(); 10460 } 10461 }); 10462 10463 // DEPRECATED 10464 if ($.uiBackCompat !== false) { 10465 10466 // Text and Icons options 10467 $.widget("ui.button", $.ui.button, { 10468 options: { 10469 text: true, 10470 icons: { 10471 primary: null, 10472 secondary: null 10473 } 10474 }, 10475 10476 _create: function () { 10477 if (this.options.showLabel && !this.options.text) { 10478 this.options.showLabel = this.options.text; 10479 } 10480 if (!this.options.showLabel && this.options.text) { 10481 this.options.text = this.options.showLabel; 10482 } 10483 if (!this.options.icon && (this.options.icons.primary || 10484 this.options.icons.secondary)) { 10485 if (this.options.icons.primary) { 10486 this.options.icon = this.options.icons.primary; 10487 } else { 10488 this.options.icon = this.options.icons.secondary; 10489 this.options.iconPosition = "end"; 10490 } 10491 } else if (this.options.icon) { 10492 this.options.icons.primary = this.options.icon; 10493 } 10494 this._super(); 10495 }, 10496 10497 _setOption: function (key, value) { 10498 if (key === "text") { 10499 this._super("showLabel", value); 10500 return; 10501 } 10502 if (key === "showLabel") { 10503 this.options.text = value; 10504 } 10505 if (key === "icon") { 10506 this.options.icons.primary = value; 10507 } 10508 if (key === "icons") { 10509 if (value.primary) { 10510 this._super("icon", value.primary); 10511 this._super("iconPosition", "beginning"); 10512 } else if (value.secondary) { 10513 this._super("icon", value.secondary); 10514 this._super("iconPosition", "end"); 10515 } 10516 } 10517 this._superApply(arguments); 10518 } 10519 }); 10520 10521 $.fn.button = (function (orig) { 10522 return function (options) { 10523 var isMethodCall = typeof options === "string"; 10524 var args = Array.prototype.slice.call(arguments, 1); 10525 var returnValue = this; 10526 10527 if (isMethodCall) { 10528 10529 // If this is an empty collection, we need to have the instance method 10530 // return undefined instead of the jQuery instance 10531 if (!this.length && options === "instance") { 10532 returnValue = undefined; 10533 } else { 10534 this.each(function () { 10535 var methodValue; 10536 var type = $(this).attr("type"); 10537 var name = type !== "checkbox" && type !== "radio" ? 10538 "button" : 10539 "checkboxradio"; 10540 var instance = $.data(this, "ui-" + name); 10541 10542 if (options === "instance") { 10543 returnValue = instance; 10544 return false; 10545 } 10546 10547 if (!instance) { 10548 return $.error("cannot call methods on button" + 10549 " prior to initialization; " + 10550 "attempted to call method '" + options + "'"); 10551 } 10552 10553 if (typeof instance[options] !== "function" || 10554 options.charAt(0) === "_") { 10555 return $.error("no such method '" + options + "' for button" + 10556 " widget instance"); 10557 } 10558 10559 methodValue = instance[options].apply(instance, args); 10560 10561 if (methodValue !== instance && methodValue !== undefined) { 10562 returnValue = methodValue && methodValue.jquery ? 10563 returnValue.pushStack(methodValue.get()) : 10564 methodValue; 10565 return false; 10566 } 10567 });
vendor: 5,001 bytes, lines 10568-10699
10568 } 10569 } else { 10570 10571 // Allow multiple hashes to be passed on init 10572 if (args.length) { 10573 options = $.widget.extend.apply(null, [options].concat(args)); 10574 } 10575 10576 this.each(function () { 10577 var type = $(this).attr("type"); 10578 var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio"; 10579 var instance = $.data(this, "ui-" + name); 10580 10581 if (instance) { 10582 instance.option(options || {}); 10583 if (instance._init) { 10584 instance._init(); 10585 } 10586 } else { 10587 if (name === "button") { 10588 orig.call($(this), options); 10589 return; 10590 } 10591 10592 $(this).checkboxradio($.extend({ icon: false }, options)); 10593 } 10594 }); 10595 } 10596 10597 return returnValue; 10598 }; 10599 })($.fn.button); 10600 10601 $.fn.buttonset = function () { 10602 if (!$.ui.controlgroup) { 10603 $.error("Controlgroup widget missing"); 10604 } 10605 if (arguments[0] === "option" && arguments[1] === "items" && arguments[2]) { 10606 return this.controlgroup.apply(this, 10607 [arguments[0], "items.button", arguments[2]]); 10608 } 10609 if (arguments[0] === "option" && arguments[1] === "items") { 10610 return this.controlgroup.apply(this, [arguments[0], "items.button"]); 10611 } 10612 if (typeof arguments[0] === "object" && arguments[0].items) { 10613 arguments[0].items = { 10614 button: arguments[0].items 10615 }; 10616 } 10617 return this.controlgroup.apply(this, arguments); 10618 }; 10619 } 10620 10621 var widgetsButton = $.ui.button; 10622 10623 10624 /* eslint-disable max-len, camelcase */ 10625 /*! 10626 * jQuery UI Datepicker 1.13.1 10627 * http://jqueryui.com 10628 * 10629 * Copyright jQuery Foundation and other contributors 10630 * Released under the MIT license. 10631 * http://jquery.org/license 10632 */ 10633 10634 //>>label: Datepicker 10635 //>>group: Widgets 10636 //>>description: Displays a calendar from an input or inline for selecting dates. 10637 //>>docs: http://api.jqueryui.com/datepicker/ 10638 //>>demos: http://jqueryui.com/datepicker/ 10639 //>>css.structure: ../../themes/base/core.css 10640 //>>css.structure: ../../themes/base/datepicker.css 10641 //>>css.theme: ../../themes/base/theme.css 10642 10643 10644 $.extend($.ui, { datepicker: { version: "1.13.1" } }); 10645 10646 var datepicker_instActive; 10647 10648 function datepicker_getZindex(elem) { 10649 var position, value; 10650 while (elem.length && elem[0] !== document) { 10651 10652 // Ignore z-index if position is set to a value where z-index is ignored by the browser 10653 // This makes behavior of this function consistent across browsers 10654 // WebKit always returns auto if the element is positioned 10655 position = elem.css("position"); 10656 if (position === "absolute" || position === "relative" || position === "fixed") { 10657 10658 // IE returns 0 when zIndex is not specified 10659 // other browsers return a string 10660 // we ignore the case of nested elements with an explicit value of 0 10661 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> 10662 value = parseInt(elem.css("zIndex"), 10); 10663 if (!isNaN(value) && value !== 0) { 10664 return value; 10665 } 10666 } 10667 elem = elem.parent(); 10668 } 10669 10670 return 0; 10671 } 10672 10673 /* Date picker manager. 10674 Use the singleton instance of this class, $.datepicker, to interact with the date picker. 10675 Settings for (groups of) date pickers are maintained in an instance object, 10676 allowing multiple different settings on the same page. */ 10677 10678 function Datepicker() { 10679 this._curInst = null; // The current instance in use 10680 this._keyEvent = false; // If the last event was a key event 10681 this._disabledInputs = []; // List of date picker inputs that have been disabled 10682 this._datepickerShowing = false; // True if the popup picker is showing , false if not 10683 this._inDialog = false; // True if showing within a "dialog", false if not 10684 this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division 10685 this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class 10686 this._appendClass = "ui-datepicker-append"; // The name of the append marker class 10687 this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class 10688 this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class 10689 this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class 10690 this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class 10691 this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class 10692 this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class 10693 this.regional = []; // Available regional settings, indexed by language code 10694 this.regional[""] = { // Default regional settings 10695 closeText: "Done", // Display text for close link 10696 prevText: "Prev", // Display text for previous month link 10697 nextText: "Next", // Display text for next month link 10698 currentText: "Today", // Display text for current month link 10699 monthNames: ["January", "February", "March", "April", "May", "June",
10700 "July", "August", "September", "October", "November", "December"], // Names of months for drop-down and formatting 10701 monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting 10702 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting 10703 dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting 10704 dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], // Column headings for days starting at Sunday 10705 weekHeader: "Wk", // Column header for week of the year 10706 dateFormat: "mm/dd/yy", // See format options on parseDate 10707 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... 10708 isRTL: false, // True if right-to-left language, false if left-to-right 10709 showMonthAfterYear: false, // True if the year select precedes month, false for month then year 10710 yearSuffix: "", // Additional text to append to the year in the month headers, 10711 selectMonthLabel: "Select month", // Invisible label for month selector 10712 selectYearLabel: "Select year" // Invisible label for year selector 10713 }; 10714 this._defaults = { // Global defaults for all the date picker instances 10715 showOn: "focus", // "focus" for popup on focus, 10716 // "button" for trigger button, or "both" for either 10717 showAnim: "fadeIn", // Name of jQuery animation for popup 10718 showOptions: {}, // Options for enhanced animations 10719 defaultDate: null, // Used when field is blank: actual date, 10720 // +/-number for offset from today, null for today 10721 appendText: "", // Display text following the input box, e.g. showing the format 10722 buttonText: "...", // Text for trigger button 10723 buttonImage: "", // URL for trigger button image 10724 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button 10725 hideIfNoPrevNext: false, // True to hide next/previous month links 10726 // if not applicable, false to just disable them 10727 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links 10728 gotoCurrent: false, // True if today link goes back to current selection instead 10729 changeMonth: false, // True if month can be selected directly, false if only prev/next 10730 changeYear: false, // True if year can be selected directly, false if only prev/next 10731 yearRange: "c-10:c+10", // Range of years to display in drop-down, 10732 // either relative to today's year (-nn:+nn), relative to currently displayed year 10733 // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) 10734 showOtherMonths: false, // True to show dates in other months, false to leave blank 10735 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable 10736 showWeek: false, // True to show week of the year, false to not show it 10737 calculateWeek: this.iso8601Week, // How to calculate the week of the year, 10738 // takes a Date and returns the number of the week for it 10739 shortYearCutoff: "+10", // Short year values < this are in the current century, 10740 // > this are in the previous century, 10741 // string value starting with "+" for current year + value 10742 minDate: null, // The earliest selectable date, or null for no limit 10743 maxDate: null, // The latest selectable date, or null for no limit 10744 duration: "fast", // Duration of display/closure 10745 beforeShowDay: null, // Function that takes a date and returns an array with 10746 // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "", 10747 // [2] = cell title (optional), e.g. $.datepicker.noWeekends 10748 beforeShow: null, // Function that takes an input field and 10749 // returns a set of custom settings for the date picker 10750 onSelect: null, // Define a callback function when a date is selected 10751 onChangeMonthYear: null, // Define a callback function when the month or year is changed 10752 onClose: null, // Define a callback function when the datepicker is closed
vendor: 10,578 bytes, lines 10753-11033
10753 onUpdateDatepicker: null, // Define a callback function when the datepicker is updated 10754 numberOfMonths: 1, // Number of months to show at a time 10755 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) 10756 stepMonths: 1, // Number of months to step back/forward 10757 stepBigMonths: 12, // Number of months to step back/forward for the big links 10758 altField: "", // Selector for an alternate field to store selected dates into 10759 altFormat: "", // The date format to use for the alternate field 10760 constrainInput: true, // The input is constrained by the current date format 10761 showButtonPanel: false, // True to show button panel, false to not show it 10762 autoSize: false, // True to size the input for the date format, false to leave as is 10763 disabled: false // The initial disabled state 10764 }; 10765 $.extend(this._defaults, this.regional[""]); 10766 this.regional.en = $.extend(true, {}, this.regional[""]); 10767 this.regional["en-US"] = $.extend(true, {}, this.regional.en); 10768 this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")); 10769 } 10770 10771 $.extend(Datepicker.prototype, { 10772 10773 /* Class name added to elements to indicate already configured with a date picker. */ 10774 markerClassName: "hasDatepicker", 10775 10776 //Keep track of the maximum number of rows displayed (see #7043) 10777 maxRows: 4, 10778 10779 // TODO rename to "widget" when switching to widget factory 10780 _widgetDatepicker: function () { 10781 return this.dpDiv; 10782 }, 10783 10784 /* Override the default settings for all instances of the date picker. 10785 * @param settings object - the new settings to use as defaults (anonymous object) 10786 * @return the manager object 10787 */ 10788 setDefaults: function (settings) { 10789 datepicker_extendRemove(this._defaults, settings || {}); 10790 return this; 10791 }, 10792 10793 /* Attach the date picker to a jQuery selection. 10794 * @param target element - the target input field or division or span 10795 * @param settings object - the new settings to use for this date picker instance (anonymous) 10796 */ 10797 _attachDatepicker: function (target, settings) { 10798 var nodeName, inline, inst; 10799 nodeName = target.nodeName.toLowerCase(); 10800 inline = (nodeName === "div" || nodeName === "span"); 10801 if (!target.id) { 10802 this.uuid += 1; 10803 target.id = "dp" + this.uuid; 10804 } 10805 inst = this._newInst($(target), inline); 10806 inst.settings = $.extend({}, settings || {}); 10807 if (nodeName === "input") { 10808 this._connectDatepicker(target, inst); 10809 } else if (inline) { 10810 this._inlineDatepicker(target, inst); 10811 } 10812 }, 10813 10814 /* Create a new instance object. */ 10815 _newInst: function (target, inline) { 10816 var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars 10817 return { 10818 id: id, input: target, // associated target 10819 selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection 10820 drawMonth: 0, drawYear: 0, // month being drawn 10821 inline: inline, // is datepicker inline or not 10822 dpDiv: (!inline ? this.dpDiv : // presentation div 10823 datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))) 10824 }; 10825 }, 10826 10827 /* Attach the date picker to an input field. */ 10828 _connectDatepicker: function (target, inst) { 10829 var input = $(target); 10830 inst.append = $([]); 10831 inst.trigger = $([]); 10832 if (input.hasClass(this.markerClassName)) { 10833 return; 10834 } 10835 this._attachments(input, inst); 10836 input.addClass(this.markerClassName).on("keydown", this._doKeyDown). 10837 on("keypress", this._doKeyPress).on("keyup", this._doKeyUp); 10838 this._autoSize(inst); 10839 $.data(target, "datepicker", inst); 10840 10841 //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665) 10842 if (inst.settings.disabled) { 10843 this._disableDatepicker(target); 10844 } 10845 }, 10846 10847 /* Make attachments based on settings. */ 10848 _attachments: function (input, inst) { 10849 var showOn, buttonText, buttonImage, 10850 appendText = this._get(inst, "appendText"), 10851 isRTL = this._get(inst, "isRTL"); 10852 10853 if (inst.append) { 10854 inst.append.remove(); 10855 } 10856 if (appendText) { 10857 inst.append = $("<span>") 10858 .addClass(this._appendClass) 10859 .text(appendText); 10860 input[isRTL ? "before" : "after"](inst.append); 10861 } 10862 10863 input.off("focus", this._showDatepicker); 10864 10865 if (inst.trigger) { 10866 inst.trigger.remove(); 10867 } 10868 10869 showOn = this._get(inst, "showOn"); 10870 if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field 10871 input.on("focus", this._showDatepicker); 10872 } 10873 if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked 10874 buttonText = this._get(inst, "buttonText"); 10875 buttonImage = this._get(inst, "buttonImage"); 10876 10877 if (this._get(inst, "buttonImageOnly")) { 10878 inst.trigger = $("<img>") 10879 .addClass(this._triggerClass) 10880 .attr({ 10881 src: buttonImage, 10882 alt: buttonText, 10883 title: buttonText 10884 }); 10885 } else { 10886 inst.trigger = $("<button type='button'>") 10887 .addClass(this._triggerClass); 10888 if (buttonImage) { 10889 inst.trigger.html( 10890 $("<img>") 10891 .attr({ 10892 src: buttonImage, 10893 alt: buttonText, 10894 title: buttonText 10895 }) 10896 ); 10897 } else { 10898 inst.trigger.text(buttonText); 10899 } 10900 } 10901 10902 input[isRTL ? "before" : "after"](inst.trigger); 10903 inst.trigger.on("click", function () { 10904 if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { 10905 $.datepicker._hideDatepicker(); 10906 } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { 10907 $.datepicker._hideDatepicker(); 10908 $.datepicker._showDatepicker(input[0]); 10909 } else { 10910 $.datepicker._showDatepicker(input[0]); 10911 } 10912 return false; 10913 }); 10914 } 10915 }, 10916 10917 /* Apply the maximum length for the date format. */ 10918 _autoSize: function (inst) { 10919 if (this._get(inst, "autoSize") && !inst.inline) { 10920 var findMax, max, maxI, i, 10921 date = new Date(2009, 12 - 1, 20), // Ensure double digits 10922 dateFormat = this._get(inst, "dateFormat"); 10923 10924 if (dateFormat.match(/[DM]/)) { 10925 findMax = function (names) { 10926 max = 0; 10927 maxI = 0; 10928 for (i = 0; i < names.length; i++) { 10929 if (names[i].length > max) { 10930 max = names[i].length; 10931 maxI = i; 10932 } 10933 } 10934 return maxI; 10935 }; 10936 date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? 10937 "monthNames" : "monthNamesShort")))); 10938 date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? 10939 "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); 10940 } 10941 inst.input.attr("size", this._formatDate(inst, date).length); 10942 } 10943 }, 10944 10945 /* Attach an inline date picker to a div. */ 10946 _inlineDatepicker: function (target, inst) { 10947 var divSpan = $(target); 10948 if (divSpan.hasClass(this.markerClassName)) { 10949 return; 10950 } 10951 divSpan.addClass(this.markerClassName).append(inst.dpDiv); 10952 $.data(target, "datepicker", inst); 10953 this._setDate(inst, this._getDefaultDate(inst), true); 10954 this._updateDatepicker(inst); 10955 this._updateAlternate(inst); 10956 10957 //If disabled option is true, disable the datepicker before showing it (see ticket #5665) 10958 if (inst.settings.disabled) { 10959 this._disableDatepicker(target); 10960 } 10961 10962 // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements 10963 // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height 10964 inst.dpDiv.css("display", "block"); 10965 }, 10966 10967 /* Pop-up the date picker in a "dialog" box. 10968 * @param input element - ignored 10969 * @param date string or Date - the initial date to display 10970 * @param onSelect function - the function to call when a date is selected 10971 * @param settings object - update the dialog date picker instance's settings (anonymous object) 10972 * @param pos int[2] - coordinates for the dialog's position within the screen or 10973 * event - with x/y coordinates or 10974 * leave empty for default (screen centre) 10975 * @return the manager object 10976 */ 10977 _dialogDatepicker: function (input, date, onSelect, settings, pos) { 10978 var id, browserWidth, browserHeight, scrollX, scrollY, 10979 inst = this._dialogInst; // internal instance 10980 10981 if (!inst) { 10982 this.uuid += 1; 10983 id = "dp" + this.uuid; 10984 this._dialogInput = $("<input type='text' id='" + id + 10985 "' style='position: absolute; top: -100px; width: 0px;'/>"); 10986 this._dialogInput.on("keydown", this._doKeyDown); 10987 $("body").append(this._dialogInput); 10988 inst = this._dialogInst = this._newInst(this._dialogInput, false); 10989 inst.settings = {}; 10990 $.data(this._dialogInput[0], "datepicker", inst); 10991 } 10992 datepicker_extendRemove(inst.settings, settings || {}); 10993 date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); 10994 this._dialogInput.val(date); 10995 10996 this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); 10997 if (!this._pos) { 10998 browserWidth = document.documentElement.clientWidth; 10999 browserHeight = document.documentElement.clientHeight; 11000 scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; 11001 scrollY = document.documentElement.scrollTop || document.body.scrollTop; 11002 this._pos = // should use actual width/height below 11003 [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; 11004 } 11005 11006 // Move input on screen for focus, but hidden behind dialog 11007 this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); 11008 inst.settings.onSelect = onSelect; 11009 this._inDialog = true; 11010 this.dpDiv.addClass(this._dialogClass); 11011 this._showDatepicker(this._dialogInput[0]); 11012 if ($.blockUI) { 11013 $.blockUI(this.dpDiv); 11014 } 11015 $.data(this._dialogInput[0], "datepicker", inst); 11016 return this; 11017 }, 11018 11019 /* Detach a datepicker from its control. 11020 * @param target element - the target input field or division or span 11021 */ 11022 _destroyDatepicker: function (target) { 11023 var nodeName, 11024 $target = $(target), 11025 inst = $.data(target, "datepicker"); 11026 11027 if (!$target.hasClass(this.markerClassName)) { 11028 return; 11029 } 11030 11031 nodeName = target.nodeName.toLowerCase(); 11032 $.removeData(target, "datepicker"); 11033 if (nodeName === "input") {
vendor: 12,085 bytes, lines 11034-11385
11034 inst.append.remove(); 11035 inst.trigger.remove(); 11036 $target.removeClass(this.markerClassName). 11037 off("focus", this._showDatepicker). 11038 off("keydown", this._doKeyDown). 11039 off("keypress", this._doKeyPress). 11040 off("keyup", this._doKeyUp); 11041 } else if (nodeName === "div" || nodeName === "span") { 11042 $target.removeClass(this.markerClassName).empty(); 11043 } 11044 11045 if (datepicker_instActive === inst) { 11046 datepicker_instActive = null; 11047 this._curInst = null; 11048 } 11049 }, 11050 11051 /* Enable the date picker to a jQuery selection. 11052 * @param target element - the target input field or division or span 11053 */ 11054 _enableDatepicker: function (target) { 11055 var nodeName, inline, 11056 $target = $(target), 11057 inst = $.data(target, "datepicker"); 11058 11059 if (!$target.hasClass(this.markerClassName)) { 11060 return; 11061 } 11062 11063 nodeName = target.nodeName.toLowerCase(); 11064 if (nodeName === "input") { 11065 target.disabled = false; 11066 inst.trigger.filter("button"). 11067 each(function () { 11068 this.disabled = false; 11069 }).end(). 11070 filter("img").css({ opacity: "1.0", cursor: "" }); 11071 } else if (nodeName === "div" || nodeName === "span") { 11072 inline = $target.children("." + this._inlineClass); 11073 inline.children().removeClass("ui-state-disabled"); 11074 inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). 11075 prop("disabled", false); 11076 } 11077 this._disabledInputs = $.map(this._disabledInputs, 11078 11079 // Delete entry 11080 function (value) { 11081 return (value === target ? null : value); 11082 }); 11083 }, 11084 11085 /* Disable the date picker to a jQuery selection. 11086 * @param target element - the target input field or division or span 11087 */ 11088 _disableDatepicker: function (target) { 11089 var nodeName, inline, 11090 $target = $(target), 11091 inst = $.data(target, "datepicker"); 11092 11093 if (!$target.hasClass(this.markerClassName)) { 11094 return; 11095 } 11096 11097 nodeName = target.nodeName.toLowerCase(); 11098 if (nodeName === "input") { 11099 target.disabled = true; 11100 inst.trigger.filter("button"). 11101 each(function () { 11102 this.disabled = true; 11103 }).end(). 11104 filter("img").css({ opacity: "0.5", cursor: "default" }); 11105 } else if (nodeName === "div" || nodeName === "span") { 11106 inline = $target.children("." + this._inlineClass); 11107 inline.children().addClass("ui-state-disabled"); 11108 inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). 11109 prop("disabled", true); 11110 } 11111 this._disabledInputs = $.map(this._disabledInputs, 11112 11113 // Delete entry 11114 function (value) { 11115 return (value === target ? null : value); 11116 }); 11117 this._disabledInputs[this._disabledInputs.length] = target; 11118 }, 11119 11120 /* Is the first field in a jQuery collection disabled as a datepicker? 11121 * @param target element - the target input field or division or span 11122 * @return boolean - true if disabled, false if enabled 11123 */ 11124 _isDisabledDatepicker: function (target) { 11125 if (!target) { 11126 return false; 11127 } 11128 for (var i = 0; i < this._disabledInputs.length; i++) { 11129 if (this._disabledInputs[i] === target) { 11130 return true; 11131 } 11132 } 11133 return false; 11134 }, 11135 11136 /* Retrieve the instance data for the target control. 11137 * @param target element - the target input field or division or span 11138 * @return object - the associated instance data 11139 * @throws error if a jQuery problem getting data 11140 */ 11141 _getInst: function (target) { 11142 try { 11143 return $.data(target, "datepicker"); 11144 } catch (err) { 11145 throw "Missing instance data for this datepicker"; 11146 } 11147 }, 11148 11149 /* Update or retrieve the settings for a date picker attached to an input field or division. 11150 * @param target element - the target input field or division or span 11151 * @param name object - the new settings to update or 11152 * string - the name of the setting to change or retrieve, 11153 * when retrieving also "all" for all instance settings or 11154 * "defaults" for all global defaults 11155 * @param value any - the new value for the setting 11156 * (omit if above is an object or to retrieve a value) 11157 */ 11158 _optionDatepicker: function (target, name, value) { 11159 var settings, date, minDate, maxDate, 11160 inst = this._getInst(target); 11161 11162 if (arguments.length === 2 && typeof name === "string") { 11163 return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : 11164 (inst ? (name === "all" ? $.extend({}, inst.settings) : 11165 this._get(inst, name)) : null)); 11166 } 11167 11168 settings = name || {}; 11169 if (typeof name === "string") { 11170 settings = {}; 11171 settings[name] = value; 11172 } 11173 11174 if (inst) { 11175 if (this._curInst === inst) { 11176 this._hideDatepicker(); 11177 } 11178 11179 date = this._getDateDatepicker(target, true); 11180 minDate = this._getMinMaxDate(inst, "min"); 11181 maxDate = this._getMinMaxDate(inst, "max"); 11182 datepicker_extendRemove(inst.settings, settings); 11183 11184 // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided 11185 if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { 11186 inst.settings.minDate = this._formatDate(inst, minDate); 11187 } 11188 if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { 11189 inst.settings.maxDate = this._formatDate(inst, maxDate); 11190 } 11191 if ("disabled" in settings) { 11192 if (settings.disabled) { 11193 this._disableDatepicker(target); 11194 } else { 11195 this._enableDatepicker(target); 11196 } 11197 } 11198 this._attachments($(target), inst); 11199 this._autoSize(inst); 11200 this._setDate(inst, date); 11201 this._updateAlternate(inst); 11202 this._updateDatepicker(inst); 11203 } 11204 }, 11205 11206 // Change method deprecated 11207 _changeDatepicker: function (target, name, value) { 11208 this._optionDatepicker(target, name, value); 11209 }, 11210 11211 /* Redraw the date picker attached to an input field or division. 11212 * @param target element - the target input field or division or span 11213 */ 11214 _refreshDatepicker: function (target) { 11215 var inst = this._getInst(target); 11216 if (inst) { 11217 this._updateDatepicker(inst); 11218 } 11219 }, 11220 11221 /* Set the dates for a jQuery selection. 11222 * @param target element - the target input field or division or span 11223 * @param date Date - the new date 11224 */ 11225 _setDateDatepicker: function (target, date) { 11226 var inst = this._getInst(target); 11227 if (inst) { 11228 this._setDate(inst, date); 11229 this._updateDatepicker(inst); 11230 this._updateAlternate(inst); 11231 } 11232 }, 11233 11234 /* Get the date(s) for the first entry in a jQuery selection. 11235 * @param target element - the target input field or division or span 11236 * @param noDefault boolean - true if no default date is to be used 11237 * @return Date - the current date 11238 */ 11239 _getDateDatepicker: function (target, noDefault) { 11240 var inst = this._getInst(target); 11241 if (inst && !inst.inline) { 11242 this._setDateFromField(inst, noDefault); 11243 } 11244 return (inst ? this._getDate(inst) : null); 11245 }, 11246 11247 /* Handle keystrokes. */ 11248 _doKeyDown: function (event) { 11249 var onSelect, dateStr, sel, 11250 inst = $.datepicker._getInst(event.target), 11251 handled = true, 11252 isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); 11253 11254 inst._keyEvent = true; 11255 if ($.datepicker._datepickerShowing) { 11256 switch (event.keyCode) { 11257 case 9: $.datepicker._hideDatepicker(); 11258 handled = false; 11259 break; // hide on tab out 11260 case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + 11261 $.datepicker._currentClass + ")", inst.dpDiv); 11262 if (sel[0]) { 11263 $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); 11264 } 11265 11266 onSelect = $.datepicker._get(inst, "onSelect"); 11267 if (onSelect) { 11268 dateStr = $.datepicker._formatDate(inst); 11269 11270 // Trigger custom callback 11271 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); 11272 } else { 11273 $.datepicker._hideDatepicker(); 11274 } 11275 11276 return false; // don't submit the form 11277 case 27: $.datepicker._hideDatepicker(); 11278 break; // hide on escape 11279 case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? 11280 -$.datepicker._get(inst, "stepBigMonths") : 11281 -$.datepicker._get(inst, "stepMonths")), "M"); 11282 break; // previous month/year on page up/+ ctrl 11283 case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? 11284 +$.datepicker._get(inst, "stepBigMonths") : 11285 +$.datepicker._get(inst, "stepMonths")), "M"); 11286 break; // next month/year on page down/+ ctrl 11287 case 35: if (event.ctrlKey || event.metaKey) { 11288 $.datepicker._clearDate(event.target); 11289 } 11290 handled = event.ctrlKey || event.metaKey; 11291 break; // clear on ctrl or command +end 11292 case 36: if (event.ctrlKey || event.metaKey) { 11293 $.datepicker._gotoToday(event.target); 11294 } 11295 handled = event.ctrlKey || event.metaKey; 11296 break; // current on ctrl or command +home 11297 case 37: if (event.ctrlKey || event.metaKey) { 11298 $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); 11299 } 11300 handled = event.ctrlKey || event.metaKey; 11301 11302 // -1 day on ctrl or command +left 11303 if (event.originalEvent.altKey) { 11304 $.datepicker._adjustDate(event.target, (event.ctrlKey ? 11305 -$.datepicker._get(inst, "stepBigMonths") : 11306 -$.datepicker._get(inst, "stepMonths")), "M"); 11307 } 11308 11309 // next month/year on alt +left on Mac 11310 break; 11311 case 38: if (event.ctrlKey || event.metaKey) { 11312 $.datepicker._adjustDate(event.target, -7, "D"); 11313 } 11314 handled = event.ctrlKey || event.metaKey; 11315 break; // -1 week on ctrl or command +up 11316 case 39: if (event.ctrlKey || event.metaKey) { 11317 $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); 11318 } 11319 handled = event.ctrlKey || event.metaKey; 11320 11321 // +1 day on ctrl or command +right 11322 if (event.originalEvent.altKey) { 11323 $.datepicker._adjustDate(event.target, (event.ctrlKey ? 11324 +$.datepicker._get(inst, "stepBigMonths") : 11325 +$.datepicker._get(inst, "stepMonths")), "M"); 11326 } 11327 11328 // next month/year on alt +right 11329 break; 11330 case 40: if (event.ctrlKey || event.metaKey) { 11331 $.datepicker._adjustDate(event.target, +7, "D"); 11332 } 11333 handled = event.ctrlKey || event.metaKey; 11334 break; // +1 week on ctrl or command +down 11335 default: handled = false; 11336 } 11337 } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home 11338 $.datepicker._showDatepicker(this); 11339 } else { 11340 handled = false; 11341 } 11342 11343 if (handled) { 11344 event.preventDefault(); 11345 event.stopPropagation(); 11346 } 11347 }, 11348 11349 /* Filter entered characters - based on date format. */ 11350 _doKeyPress: function (event) { 11351 var chars, chr, 11352 inst = $.datepicker._getInst(event.target); 11353 11354 if ($.datepicker._get(inst, "constrainInput")) { 11355 chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); 11356 chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); 11357 return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); 11358 } 11359 }, 11360 11361 /* Synchronise manual entry and field/alternate field. */ 11362 _doKeyUp: function (event) { 11363 var date, 11364 inst = $.datepicker._getInst(event.target); 11365 11366 if (inst.input.val() !== inst.lastVal) { 11367 try { 11368 date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), 11369 (inst.input ? inst.input.val() : null), 11370 $.datepicker._getFormatConfig(inst)); 11371 11372 if (date) { // only if valid 11373 $.datepicker._setDateFromField(inst); 11374 $.datepicker._updateAlternate(inst); 11375 $.datepicker._updateDatepicker(inst); 11376 } 11377 } catch (err) { 11378 } 11379 } 11380 return true; 11381 }, 11382 11383 /* Pop-up the date picker for a given input field. 11384 * If false returned from beforeShow event handler do not show. 11385 * @param input element - the input field attached to the date picker or
vendor: 4,409 bytes, lines 11386-11510
11386 * event - if triggered by focus 11387 */ 11388 _showDatepicker: function (input) { 11389 input = input.target || input; 11390 if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger 11391 input = $("input", input.parentNode)[0]; 11392 } 11393 11394 if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here 11395 return; 11396 } 11397 11398 var inst, beforeShow, beforeShowSettings, isFixed, 11399 offset, showAnim, duration; 11400 11401 inst = $.datepicker._getInst(input); 11402 if ($.datepicker._curInst && $.datepicker._curInst !== inst) { 11403 $.datepicker._curInst.dpDiv.stop(true, true); 11404 if (inst && $.datepicker._datepickerShowing) { 11405 $.datepicker._hideDatepicker($.datepicker._curInst.input[0]); 11406 } 11407 } 11408 11409 beforeShow = $.datepicker._get(inst, "beforeShow"); 11410 beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; 11411 if (beforeShowSettings === false) { 11412 return; 11413 } 11414 datepicker_extendRemove(inst.settings, beforeShowSettings); 11415 11416 inst.lastVal = null; 11417 $.datepicker._lastInput = input; 11418 $.datepicker._setDateFromField(inst); 11419 11420 if ($.datepicker._inDialog) { // hide cursor 11421 input.value = ""; 11422 } 11423 if (!$.datepicker._pos) { // position below input 11424 $.datepicker._pos = $.datepicker._findPos(input); 11425 $.datepicker._pos[1] += input.offsetHeight; // add the height 11426 } 11427 11428 isFixed = false; 11429 $(input).parents().each(function () { 11430 isFixed |= $(this).css("position") === "fixed"; 11431 return !isFixed; 11432 }); 11433 11434 offset = { left: $.datepicker._pos[0], top: $.datepicker._pos[1] }; 11435 $.datepicker._pos = null; 11436 11437 //to avoid flashes on Firefox 11438 inst.dpDiv.empty(); 11439 11440 // determine sizing offscreen 11441 inst.dpDiv.css({ position: "absolute", display: "block", top: "-1000px" }); 11442 $.datepicker._updateDatepicker(inst); 11443 11444 // fix width for dynamic number of date pickers 11445 // and adjust position before showing 11446 offset = $.datepicker._checkOffset(inst, offset, isFixed); 11447 inst.dpDiv.css({ 11448 position: ($.datepicker._inDialog && $.blockUI ? 11449 "static" : (isFixed ? "fixed" : "absolute")), display: "none", 11450 left: offset.left + "px", top: offset.top + "px" 11451 }); 11452 11453 if (!inst.inline) { 11454 showAnim = $.datepicker._get(inst, "showAnim"); 11455 duration = $.datepicker._get(inst, "duration"); 11456 inst.dpDiv.css("z-index", datepicker_getZindex($(input)) + 1); 11457 $.datepicker._datepickerShowing = true; 11458 11459 if ($.effects && $.effects.effect[showAnim]) { 11460 inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); 11461 } else { 11462 inst.dpDiv[showAnim || "show"](showAnim ? duration : null); 11463 } 11464 11465 if ($.datepicker._shouldFocusInput(inst)) { 11466 inst.input.trigger("focus"); 11467 } 11468 11469 $.datepicker._curInst = inst; 11470 } 11471 }, 11472 11473 /* Generate the date picker content. */ 11474 _updateDatepicker: function (inst) { 11475 this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) 11476 datepicker_instActive = inst; // for delegate hover events 11477 inst.dpDiv.empty().append(this._generateHTML(inst)); 11478 this._attachHandlers(inst); 11479 11480 var origyearshtml, 11481 numMonths = this._getNumberOfMonths(inst), 11482 cols = numMonths[1], 11483 width = 17, 11484 activeCell = inst.dpDiv.find("." + this._dayOverClass + " a"), 11485 onUpdateDatepicker = $.datepicker._get(inst, "onUpdateDatepicker"); 11486 11487 if (activeCell.length > 0) { 11488 datepicker_handleMouseover.apply(activeCell.get(0)); 11489 } 11490 11491 inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); 11492 if (cols > 1) { 11493 inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); 11494 } 11495 inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + 11496 "Class"]("ui-datepicker-multi"); 11497 inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + 11498 "Class"]("ui-datepicker-rtl"); 11499 11500 if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput(inst)) { 11501 inst.input.trigger("focus"); 11502 } 11503 11504 // Deffered render of the years select (to avoid flashes on Firefox) 11505 if (inst.yearshtml) { 11506 origyearshtml = inst.yearshtml; 11507 setTimeout(function () { 11508 11509 //assure that inst.yearshtml didn't change. 11510 if (origyearshtml === inst.yearshtml && inst.yearshtml) {
vendor: 5,592 bytes, lines 11511-11669
11511 inst.dpDiv.find("select.ui-datepicker-year").first().replaceWith(inst.yearshtml); 11512 } 11513 origyearshtml = inst.yearshtml = null; 11514 }, 0); 11515 } 11516 11517 if (onUpdateDatepicker) { 11518 onUpdateDatepicker.apply((inst.input ? inst.input[0] : null), [inst]); 11519 } 11520 }, 11521 11522 // #6694 - don't focus the input if it's already focused 11523 // this breaks the change event in IE 11524 // Support: IE and jQuery <1.9 11525 _shouldFocusInput: function (inst) { 11526 return inst.input && inst.input.is(":visible") && !inst.input.is(":disabled") && !inst.input.is(":focus"); 11527 }, 11528 11529 /* Check positioning to remain on screen. */ 11530 _checkOffset: function (inst, offset, isFixed) { 11531 var dpWidth = inst.dpDiv.outerWidth(), 11532 dpHeight = inst.dpDiv.outerHeight(), 11533 inputWidth = inst.input ? inst.input.outerWidth() : 0, 11534 inputHeight = inst.input ? inst.input.outerHeight() : 0, 11535 viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), 11536 viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); 11537 11538 offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); 11539 offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; 11540 offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; 11541 11542 // Now check if datepicker is showing outside window viewport - move to a better place if so. 11543 offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? 11544 Math.abs(offset.left + dpWidth - viewWidth) : 0); 11545 offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? 11546 Math.abs(dpHeight + inputHeight) : 0); 11547 11548 return offset; 11549 }, 11550 11551 /* Find an object's position on the screen. */ 11552 _findPos: function (obj) { 11553 var position, 11554 inst = this._getInst(obj), 11555 isRTL = this._get(inst, "isRTL"); 11556 11557 while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden(obj))) { 11558 obj = obj[isRTL ? "previousSibling" : "nextSibling"]; 11559 } 11560 11561 position = $(obj).offset(); 11562 return [position.left, position.top]; 11563 }, 11564 11565 /* Hide the date picker from view. 11566 * @param input element - the input field attached to the date picker 11567 */ 11568 _hideDatepicker: function (input) { 11569 var showAnim, duration, postProcess, onClose, 11570 inst = this._curInst; 11571 11572 if (!inst || (input && inst !== $.data(input, "datepicker"))) { 11573 return; 11574 } 11575 11576 if (this._datepickerShowing) { 11577 showAnim = this._get(inst, "showAnim"); 11578 duration = this._get(inst, "duration"); 11579 postProcess = function () { 11580 $.datepicker._tidyDialog(inst); 11581 }; 11582 11583 // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed 11584 if ($.effects && ($.effects.effect[showAnim] || $.effects[showAnim])) { 11585 inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); 11586 } else { 11587 inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : 11588 (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); 11589 } 11590 11591 if (!showAnim) { 11592 postProcess(); 11593 } 11594 this._datepickerShowing = false; 11595 11596 onClose = this._get(inst, "onClose"); 11597 if (onClose) { 11598 onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); 11599 } 11600 11601 this._lastInput = null; 11602 if (this._inDialog) { 11603 this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); 11604 if ($.blockUI) { 11605 $.unblockUI(); 11606 $("body").append(this.dpDiv); 11607 } 11608 } 11609 this._inDialog = false; 11610 } 11611 }, 11612 11613 /* Tidy up after a dialog display. */ 11614 _tidyDialog: function (inst) { 11615 inst.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar"); 11616 }, 11617 11618 /* Close date picker if clicked elsewhere. */ 11619 _checkExternalClick: function (event) { 11620 if (!$.datepicker._curInst) { 11621 return; 11622 } 11623 11624 var $target = $(event.target), 11625 inst = $.datepicker._getInst($target[0]); 11626 11627 if ((($target[0].id !== $.datepicker._mainDivId && 11628 $target.parents("#" + $.datepicker._mainDivId).length === 0 && 11629 !$target.hasClass($.datepicker.markerClassName) && 11630 !$target.closest("." + $.datepicker._triggerClass).length && 11631 $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))) || 11632 ($target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst)) { 11633 $.datepicker._hideDatepicker(); 11634 } 11635 }, 11636 11637 /* Adjust one of the date sub-fields. */ 11638 _adjustDate: function (id, offset, period) { 11639 var target = $(id), 11640 inst = this._getInst(target[0]); 11641 11642 if (this._isDisabledDatepicker(target[0])) { 11643 return; 11644 } 11645 this._adjustInstDate(inst, offset, period); 11646 this._updateDatepicker(inst); 11647 }, 11648 11649 /* Action for current link. */ 11650 _gotoToday: function (id) { 11651 var date, 11652 target = $(id), 11653 inst = this._getInst(target[0]); 11654 11655 if (this._get(inst, "gotoCurrent") && inst.currentDay) { 11656 inst.selectedDay = inst.currentDay; 11657 inst.drawMonth = inst.selectedMonth = inst.currentMonth; 11658 inst.drawYear = inst.selectedYear = inst.currentYear; 11659 } else { 11660 date = new Date(); 11661 inst.selectedDay = date.getDate(); 11662 inst.drawMonth = inst.selectedMonth = date.getMonth(); 11663 inst.drawYear = inst.selectedYear = date.getFullYear(); 11664 } 11665 this._notifyChange(inst); 11666 this._adjustDate(target); 11667 }, 11668 11669 /* Action for selecting a new month/year. */
vendor: 43,825 bytes, lines 11670-12854
11670 _selectMonthYear: function (id, select, period) { 11671 var target = $(id), 11672 inst = this._getInst(target[0]); 11673 11674 inst["selected" + (period === "M" ? "Month" : "Year")] = 11675 inst["draw" + (period === "M" ? "Month" : "Year")] = 11676 parseInt(select.options[select.selectedIndex].value, 10); 11677 11678 this._notifyChange(inst); 11679 this._adjustDate(target); 11680 }, 11681 11682 /* Action for selecting a day. */ 11683 _selectDay: function (id, month, year, td) { 11684 var inst, 11685 target = $(id); 11686 11687 if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { 11688 return; 11689 } 11690 11691 inst = this._getInst(target[0]); 11692 inst.selectedDay = inst.currentDay = parseInt($("a", td).attr("data-date")); 11693 inst.selectedMonth = inst.currentMonth = month; 11694 inst.selectedYear = inst.currentYear = year; 11695 this._selectDate(id, this._formatDate(inst, 11696 inst.currentDay, inst.currentMonth, inst.currentYear)); 11697 }, 11698 11699 /* Erase the input field and hide the date picker. */ 11700 _clearDate: function (id) { 11701 var target = $(id); 11702 this._selectDate(target, ""); 11703 }, 11704 11705 /* Update the input field with the selected date. */ 11706 _selectDate: function (id, dateStr) { 11707 var onSelect, 11708 target = $(id), 11709 inst = this._getInst(target[0]); 11710 11711 dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); 11712 if (inst.input) { 11713 inst.input.val(dateStr); 11714 } 11715 this._updateAlternate(inst); 11716 11717 onSelect = this._get(inst, "onSelect"); 11718 if (onSelect) { 11719 onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback 11720 } else if (inst.input) { 11721 inst.input.trigger("change"); // fire the change event 11722 } 11723 11724 if (inst.inline) { 11725 this._updateDatepicker(inst); 11726 } else { 11727 this._hideDatepicker(); 11728 this._lastInput = inst.input[0]; 11729 if (typeof (inst.input[0]) !== "object") { 11730 inst.input.trigger("focus"); // restore focus 11731 } 11732 this._lastInput = null; 11733 } 11734 }, 11735 11736 /* Update any alternate field to synchronise with the main field. */ 11737 _updateAlternate: function (inst) { 11738 var altFormat, date, dateStr, 11739 altField = this._get(inst, "altField"); 11740 11741 if (altField) { // update alternate field too 11742 altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); 11743 date = this._getDate(inst); 11744 dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); 11745 $(document).find(altField).val(dateStr); 11746 } 11747 }, 11748 11749 /* Set as beforeShowDay function to prevent selection of weekends. 11750 * @param date Date - the date to customise 11751 * @return [boolean, string] - is this date selectable?, what is its CSS class? 11752 */ 11753 noWeekends: function (date) { 11754 var day = date.getDay(); 11755 return [(day > 0 && day < 6), ""]; 11756 }, 11757 11758 /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. 11759 * @param date Date - the date to get the week for 11760 * @return number - the number of the week within the year that contains this date 11761 */ 11762 iso8601Week: function (date) { 11763 var time, 11764 checkDate = new Date(date.getTime()); 11765 11766 // Find Thursday of this week starting on Monday 11767 checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); 11768 11769 time = checkDate.getTime(); 11770 checkDate.setMonth(0); // Compare with Jan 1 11771 checkDate.setDate(1); 11772 return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; 11773 }, 11774 11775 /* Parse a string value into a date object. 11776 * See formatDate below for the possible formats. 11777 * 11778 * @param format string - the expected format of the date 11779 * @param value string - the date in the above format 11780 * @param settings Object - attributes include: 11781 * shortYearCutoff number - the cutoff year for determining the century (optional) 11782 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 11783 * dayNames string[7] - names of the days from Sunday (optional) 11784 * monthNamesShort string[12] - abbreviated names of the months (optional) 11785 * monthNames string[12] - names of the months (optional) 11786 * @return Date - the extracted date value or null if value is blank 11787 */ 11788 parseDate: function (format, value, settings) { 11789 if (format == null || value == null) { 11790 throw "Invalid arguments"; 11791 } 11792 11793 value = (typeof value === "object" ? value.toString() : value + ""); 11794 if (value === "") { 11795 return null; 11796 } 11797 11798 var iFormat, dim, extra, 11799 iValue = 0, 11800 shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, 11801 shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : 11802 new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), 11803 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, 11804 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, 11805 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, 11806 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, 11807 year = -1, 11808 month = -1, 11809 day = -1, 11810 doy = -1, 11811 literal = false, 11812 date, 11813 11814 // Check whether a format character is doubled 11815 lookAhead = function (match) { 11816 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 11817 if (matches) { 11818 iFormat++; 11819 } 11820 return matches; 11821 }, 11822 11823 // Extract a number from the string value 11824 getNumber = function (match) { 11825 var isDoubled = lookAhead(match), 11826 size = (match === "@" ? 14 : (match === "!" ? 20 : 11827 (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), 11828 minSize = (match === "y" ? size : 1), 11829 digits = new RegExp("^\\d{" + minSize + "," + size + "}"), 11830 num = value.substring(iValue).match(digits); 11831 if (!num) { 11832 throw "Missing number at position " + iValue; 11833 } 11834 iValue += num[0].length; 11835 return parseInt(num[0], 10); 11836 }, 11837 11838 // Extract a name from the string value and convert to an index 11839 getName = function (match, shortNames, longNames) { 11840 var index = -1, 11841 names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { 11842 return [[k, v]]; 11843 }).sort(function (a, b) { 11844 return -(a[1].length - b[1].length); 11845 }); 11846 11847 $.each(names, function (i, pair) { 11848 var name = pair[1]; 11849 if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { 11850 index = pair[0]; 11851 iValue += name.length; 11852 return false; 11853 } 11854 }); 11855 if (index !== -1) { 11856 return index + 1; 11857 } else { 11858 throw "Unknown name at position " + iValue; 11859 } 11860 }, 11861 11862 // Confirm that a literal character matches the string value 11863 checkLiteral = function () { 11864 if (value.charAt(iValue) !== format.charAt(iFormat)) { 11865 throw "Unexpected literal at position " + iValue; 11866 } 11867 iValue++; 11868 }; 11869 11870 for (iFormat = 0; iFormat < format.length; iFormat++) { 11871 if (literal) { 11872 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 11873 literal = false; 11874 } else { 11875 checkLiteral(); 11876 } 11877 } else { 11878 switch (format.charAt(iFormat)) { 11879 case "d": 11880 day = getNumber("d"); 11881 break; 11882 case "D": 11883 getName("D", dayNamesShort, dayNames); 11884 break; 11885 case "o": 11886 doy = getNumber("o"); 11887 break; 11888 case "m": 11889 month = getNumber("m"); 11890 break; 11891 case "M": 11892 month = getName("M", monthNamesShort, monthNames); 11893 break; 11894 case "y": 11895 year = getNumber("y"); 11896 break; 11897 case "@": 11898 date = new Date(getNumber("@")); 11899 year = date.getFullYear(); 11900 month = date.getMonth() + 1; 11901 day = date.getDate(); 11902 break; 11903 case "!": 11904 date = new Date((getNumber("!") - this._ticksTo1970) / 10000); 11905 year = date.getFullYear(); 11906 month = date.getMonth() + 1; 11907 day = date.getDate(); 11908 break; 11909 case "'": 11910 if (lookAhead("'")) { 11911 checkLiteral(); 11912 } else { 11913 literal = true; 11914 } 11915 break; 11916 default: 11917 checkLiteral(); 11918 } 11919 } 11920 } 11921 11922 if (iValue < value.length) { 11923 extra = value.substr(iValue); 11924 if (!/^\s+/.test(extra)) { 11925 throw "Extra/unparsed characters found in date: " + extra; 11926 } 11927 } 11928 11929 if (year === -1) { 11930 year = new Date().getFullYear(); 11931 } else if (year < 100) { 11932 year += new Date().getFullYear() - new Date().getFullYear() % 100 + 11933 (year <= shortYearCutoff ? 0 : -100); 11934 } 11935 11936 if (doy > -1) { 11937 month = 1; 11938 day = doy; 11939 do { 11940 dim = this._getDaysInMonth(year, month - 1); 11941 if (day <= dim) { 11942 break; 11943 } 11944 month++; 11945 day -= dim; 11946 } while (true); 11947 } 11948 11949 date = this._daylightSavingAdjust(new Date(year, month - 1, day)); 11950 if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { 11951 throw "Invalid date"; // E.g. 31/02/00 11952 } 11953 return date; 11954 }, 11955 11956 /* Standard date formats. */ 11957 ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) 11958 COOKIE: "D, dd M yy", 11959 ISO_8601: "yy-mm-dd", 11960 RFC_822: "D, d M y", 11961 RFC_850: "DD, dd-M-y", 11962 RFC_1036: "D, d M y", 11963 RFC_1123: "D, d M yy", 11964 RFC_2822: "D, d M yy", 11965 RSS: "D, d M y", // RFC 822 11966 TICKS: "!", 11967 TIMESTAMP: "@", 11968 W3C: "yy-mm-dd", // ISO 8601 11969 11970 _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + 11971 Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), 11972 11973 /* Format a date object into a string value. 11974 * The format can be combinations of the following: 11975 * d - day of month (no leading zero) 11976 * dd - day of month (two digit) 11977 * o - day of year (no leading zeros) 11978 * oo - day of year (three digit) 11979 * D - day name short 11980 * DD - day name long 11981 * m - month of year (no leading zero) 11982 * mm - month of year (two digit) 11983 * M - month name short 11984 * MM - month name long 11985 * y - year (two digit) 11986 * yy - year (four digit) 11987 * @ - Unix timestamp (ms since 01/01/1970) 11988 * ! - Windows ticks (100ns since 01/01/0001) 11989 * "..." - literal text 11990 * '' - single quote 11991 * 11992 * @param format string - the desired format of the date 11993 * @param date Date - the date value to format 11994 * @param settings Object - attributes include: 11995 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 11996 * dayNames string[7] - names of the days from Sunday (optional) 11997 * monthNamesShort string[12] - abbreviated names of the months (optional) 11998 * monthNames string[12] - names of the months (optional) 11999 * @return string - the date in the above format 12000 */ 12001 formatDate: function (format, date, settings) { 12002 if (!date) { 12003 return ""; 12004 } 12005 12006 var iFormat, 12007 dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, 12008 dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, 12009 monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, 12010 monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, 12011 12012 // Check whether a format character is doubled 12013 lookAhead = function (match) { 12014 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 12015 if (matches) { 12016 iFormat++; 12017 } 12018 return matches; 12019 }, 12020 12021 // Format a number, with leading zero if necessary 12022 formatNumber = function (match, value, len) { 12023 var num = "" + value; 12024 if (lookAhead(match)) { 12025 while (num.length < len) { 12026 num = "0" + num; 12027 } 12028 } 12029 return num; 12030 }, 12031 12032 // Format a name, short or long as requested 12033 formatName = function (match, value, shortNames, longNames) { 12034 return (lookAhead(match) ? longNames[value] : shortNames[value]); 12035 }, 12036 output = "", 12037 literal = false; 12038 12039 if (date) { 12040 for (iFormat = 0; iFormat < format.length; iFormat++) { 12041 if (literal) { 12042 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 12043 literal = false; 12044 } else { 12045 output += format.charAt(iFormat); 12046 } 12047 } else { 12048 switch (format.charAt(iFormat)) { 12049 case "d": 12050 output += formatNumber("d", date.getDate(), 2); 12051 break; 12052 case "D": 12053 output += formatName("D", date.getDay(), dayNamesShort, dayNames); 12054 break; 12055 case "o": 12056 output += formatNumber("o", 12057 Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); 12058 break; 12059 case "m": 12060 output += formatNumber("m", date.getMonth() + 1, 2); 12061 break; 12062 case "M": 12063 output += formatName("M", date.getMonth(), monthNamesShort, monthNames); 12064 break; 12065 case "y": 12066 output += (lookAhead("y") ? date.getFullYear() : 12067 (date.getFullYear() % 100 < 10 ? "0" : "") + date.getFullYear() % 100); 12068 break; 12069 case "@": 12070 output += date.getTime(); 12071 break; 12072 case "!": 12073 output += date.getTime() * 10000 + this._ticksTo1970; 12074 break; 12075 case "'": 12076 if (lookAhead("'")) { 12077 output += "'"; 12078 } else { 12079 literal = true; 12080 } 12081 break; 12082 default: 12083 output += format.charAt(iFormat); 12084 } 12085 } 12086 } 12087 } 12088 return output; 12089 }, 12090 12091 /* Extract all possible characters from the date format. */ 12092 _possibleChars: function (format) { 12093 var iFormat, 12094 chars = "", 12095 literal = false, 12096 12097 // Check whether a format character is doubled 12098 lookAhead = function (match) { 12099 var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); 12100 if (matches) { 12101 iFormat++; 12102 } 12103 return matches; 12104 }; 12105 12106 for (iFormat = 0; iFormat < format.length; iFormat++) { 12107 if (literal) { 12108 if (format.charAt(iFormat) === "'" && !lookAhead("'")) { 12109 literal = false; 12110 } else { 12111 chars += format.charAt(iFormat); 12112 } 12113 } else { 12114 switch (format.charAt(iFormat)) { 12115 case "d": case "m": case "y": case "@": 12116 chars += "0123456789"; 12117 break; 12118 case "D": case "M": 12119 return null; // Accept anything 12120 case "'": 12121 if (lookAhead("'")) { 12122 chars += "'"; 12123 } else { 12124 literal = true; 12125 } 12126 break; 12127 default: 12128 chars += format.charAt(iFormat); 12129 } 12130 } 12131 } 12132 return chars; 12133 }, 12134 12135 /* Get a setting value, defaulting if necessary. */ 12136 _get: function (inst, name) { 12137 return inst.settings[name] !== undefined ? 12138 inst.settings[name] : this._defaults[name]; 12139 }, 12140 12141 /* Parse existing date and initialise date picker. */ 12142 _setDateFromField: function (inst, noDefault) { 12143 if (inst.input.val() === inst.lastVal) { 12144 return; 12145 } 12146 12147 var dateFormat = this._get(inst, "dateFormat"), 12148 dates = inst.lastVal = inst.input ? inst.input.val() : null, 12149 defaultDate = this._getDefaultDate(inst), 12150 date = defaultDate, 12151 settings = this._getFormatConfig(inst); 12152 12153 try { 12154 date = this.parseDate(dateFormat, dates, settings) || defaultDate; 12155 } catch (event) { 12156 dates = (noDefault ? "" : dates); 12157 } 12158 inst.selectedDay = date.getDate(); 12159 inst.drawMonth = inst.selectedMonth = date.getMonth(); 12160 inst.drawYear = inst.selectedYear = date.getFullYear(); 12161 inst.currentDay = (dates ? date.getDate() : 0); 12162 inst.currentMonth = (dates ? date.getMonth() : 0); 12163 inst.currentYear = (dates ? date.getFullYear() : 0); 12164 this._adjustInstDate(inst); 12165 }, 12166 12167 /* Retrieve the default date shown on opening. */ 12168 _getDefaultDate: function (inst) { 12169 return this._restrictMinMax(inst, 12170 this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); 12171 }, 12172 12173 /* A date may be specified as an exact value or a relative one. */ 12174 _determineDate: function (inst, date, defaultDate) { 12175 var offsetNumeric = function (offset) { 12176 var date = new Date(); 12177 date.setDate(date.getDate() + offset); 12178 return date; 12179 }, 12180 offsetString = function (offset) { 12181 try { 12182 return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), 12183 offset, $.datepicker._getFormatConfig(inst)); 12184 } catch (e) { 12185 12186 // Ignore 12187 } 12188 12189 var date = (offset.toLowerCase().match(/^c/) ? 12190 $.datepicker._getDate(inst) : null) || new Date(), 12191 year = date.getFullYear(), 12192 month = date.getMonth(), 12193 day = date.getDate(), 12194 pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, 12195 matches = pattern.exec(offset); 12196 12197 while (matches) { 12198 switch (matches[2] || "d") { 12199 case "d": case "D": 12200 day += parseInt(matches[1], 10); break; 12201 case "w": case "W": 12202 day += parseInt(matches[1], 10) * 7; break; 12203 case "m": case "M": 12204 month += parseInt(matches[1], 10); 12205 day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); 12206 break; 12207 case "y": case "Y": 12208 year += parseInt(matches[1], 10); 12209 day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); 12210 break; 12211 } 12212 matches = pattern.exec(offset); 12213 } 12214 return new Date(year, month, day); 12215 }, 12216 newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : 12217 (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); 12218 12219 newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); 12220 if (newDate) { 12221 newDate.setHours(0); 12222 newDate.setMinutes(0); 12223 newDate.setSeconds(0); 12224 newDate.setMilliseconds(0); 12225 } 12226 return this._daylightSavingAdjust(newDate); 12227 }, 12228 12229 /* Handle switch to/from daylight saving. 12230 * Hours may be non-zero on daylight saving cut-over: 12231 * > 12 when midnight changeover, but then cannot generate 12232 * midnight datetime, so jump to 1AM, otherwise reset. 12233 * @param date (Date) the date to check 12234 * @return (Date) the corrected date 12235 */ 12236 _daylightSavingAdjust: function (date) { 12237 if (!date) { 12238 return null; 12239 } 12240 date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); 12241 return date; 12242 }, 12243 12244 /* Set the date(s) directly. */ 12245 _setDate: function (inst, date, noChange) { 12246 var clear = !date, 12247 origMonth = inst.selectedMonth, 12248 origYear = inst.selectedYear, 12249 newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); 12250 12251 inst.selectedDay = inst.currentDay = newDate.getDate(); 12252 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); 12253 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); 12254 if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { 12255 this._notifyChange(inst); 12256 } 12257 this._adjustInstDate(inst); 12258 if (inst.input) { 12259 inst.input.val(clear ? "" : this._formatDate(inst)); 12260 } 12261 }, 12262 12263 /* Retrieve the date(s) directly. */ 12264 _getDate: function (inst) { 12265 var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : 12266 this._daylightSavingAdjust(new Date( 12267 inst.currentYear, inst.currentMonth, inst.currentDay))); 12268 return startDate; 12269 }, 12270 12271 /* Attach the onxxx handlers. These are declared statically so 12272 * they work with static code transformers like Caja. 12273 */ 12274 _attachHandlers: function (inst) { 12275 var stepMonths = this._get(inst, "stepMonths"), 12276 id = "#" + inst.id.replace(/\\\\/g, "\\"); 12277 inst.dpDiv.find("[data-handler]").map(function () { 12278 var handler = { 12279 prev: function () { 12280 $.datepicker._adjustDate(id, -stepMonths, "M"); 12281 }, 12282 next: function () { 12283 $.datepicker._adjustDate(id, +stepMonths, "M"); 12284 }, 12285 hide: function () { 12286 $.datepicker._hideDatepicker(); 12287 }, 12288 today: function () { 12289 $.datepicker._gotoToday(id); 12290 }, 12291 selectDay: function () { 12292 $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); 12293 return false; 12294 }, 12295 selectMonth: function () { 12296 $.datepicker._selectMonthYear(id, this, "M"); 12297 return false; 12298 }, 12299 selectYear: function () { 12300 $.datepicker._selectMonthYear(id, this, "Y"); 12301 return false; 12302 } 12303 }; 12304 $(this).on(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); 12305 }); 12306 }, 12307 12308 /* Generate the HTML for the current state of the date picker. */ 12309 _generateHTML: function (inst) { 12310 var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, 12311 controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, 12312 monthNames, monthNamesShort, beforeShowDay, showOtherMonths, 12313 selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, 12314 cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, 12315 printDate, dRow, tbody, daySettings, otherMonth, unselectable, 12316 tempDate = new Date(), 12317 today = this._daylightSavingAdjust( 12318 new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time 12319 isRTL = this._get(inst, "isRTL"), 12320 showButtonPanel = this._get(inst, "showButtonPanel"), 12321 hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), 12322 navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), 12323 numMonths = this._getNumberOfMonths(inst), 12324 showCurrentAtPos = this._get(inst, "showCurrentAtPos"), 12325 stepMonths = this._get(inst, "stepMonths"), 12326 isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), 12327 currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : 12328 new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), 12329 minDate = this._getMinMaxDate(inst, "min"), 12330 maxDate = this._getMinMaxDate(inst, "max"), 12331 drawMonth = inst.drawMonth - showCurrentAtPos, 12332 drawYear = inst.drawYear; 12333 12334 if (drawMonth < 0) { 12335 drawMonth += 12; 12336 drawYear--; 12337 } 12338 if (maxDate) { 12339 maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), 12340 maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); 12341 maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); 12342 while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { 12343 drawMonth--; 12344 if (drawMonth < 0) { 12345 drawMonth = 11; 12346 drawYear--; 12347 } 12348 } 12349 } 12350 inst.drawMonth = drawMonth; 12351 inst.drawYear = drawYear; 12352 12353 prevText = this._get(inst, "prevText"); 12354 prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, 12355 this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), 12356 this._getFormatConfig(inst))); 12357 12358 if (this._canAdjustMonth(inst, -1, drawYear, drawMonth)) { 12359 prev = $("<a>") 12360 .attr({ 12361 "class": "ui-datepicker-prev ui-corner-all", 12362 "data-handler": "prev", 12363 "data-event": "click", 12364 title: prevText 12365 }) 12366 .append( 12367 $("<span>") 12368 .addClass("ui-icon ui-icon-circle-triangle-" + 12369 (isRTL ? "e" : "w")) 12370 .text(prevText) 12371 )[0].outerHTML; 12372 } else if (hideIfNoPrevNext) { 12373 prev = ""; 12374 } else { 12375 prev = $("<a>") 12376 .attr({ 12377 "class": "ui-datepicker-prev ui-corner-all ui-state-disabled", 12378 title: prevText 12379 }) 12380 .append( 12381 $("<span>") 12382 .addClass("ui-icon ui-icon-circle-triangle-" + 12383 (isRTL ? "e" : "w")) 12384 .text(prevText) 12385 )[0].outerHTML; 12386 } 12387 12388 nextText = this._get(inst, "nextText"); 12389 nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, 12390 this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), 12391 this._getFormatConfig(inst))); 12392 12393 if (this._canAdjustMonth(inst, +1, drawYear, drawMonth)) { 12394 next = $("<a>") 12395 .attr({ 12396 "class": "ui-datepicker-next ui-corner-all", 12397 "data-handler": "next", 12398 "data-event": "click", 12399 title: nextText 12400 }) 12401 .append( 12402 $("<span>") 12403 .addClass("ui-icon ui-icon-circle-triangle-" + 12404 (isRTL ? "w" : "e")) 12405 .text(nextText) 12406 )[0].outerHTML; 12407 } else if (hideIfNoPrevNext) { 12408 next = ""; 12409 } else { 12410 next = $("<a>") 12411 .attr({ 12412 "class": "ui-datepicker-next ui-corner-all ui-state-disabled", 12413 title: nextText 12414 }) 12415 .append( 12416 $("<span>") 12417 .attr("class", "ui-icon ui-icon-circle-triangle-" + 12418 (isRTL ? "w" : "e")) 12419 .text(nextText) 12420 )[0].outerHTML; 12421 } 12422 12423 currentText = this._get(inst, "currentText"); 12424 gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); 12425 currentText = (!navigationAsDateFormat ? currentText : 12426 this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); 12427 12428 controls = ""; 12429 if (!inst.inline) { 12430 controls = $("<button>") 12431 .attr({ 12432 type: "button", 12433 "class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all", 12434 "data-handler": "hide", 12435 "data-event": "click" 12436 }) 12437 .text(this._get(inst, "closeText"))[0].outerHTML; 12438 } 12439 12440 buttonPanel = ""; 12441 if (showButtonPanel) { 12442 buttonPanel = $("<div class='ui-datepicker-buttonpane ui-widget-content'>") 12443 .append(isRTL ? controls : "") 12444 .append(this._isInRange(inst, gotoDate) ? 12445 $("<button>") 12446 .attr({ 12447 type: "button", 12448 "class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all", 12449 "data-handler": "today", 12450 "data-event": "click" 12451 }) 12452 .text(currentText) : 12453 "") 12454 .append(isRTL ? "" : controls)[0].outerHTML; 12455 } 12456 12457 firstDay = parseInt(this._get(inst, "firstDay"), 10); 12458 firstDay = (isNaN(firstDay) ? 0 : firstDay); 12459 12460 showWeek = this._get(inst, "showWeek"); 12461 dayNames = this._get(inst, "dayNames"); 12462 dayNamesMin = this._get(inst, "dayNamesMin"); 12463 monthNames = this._get(inst, "monthNames"); 12464 monthNamesShort = this._get(inst, "monthNamesShort"); 12465 beforeShowDay = this._get(inst, "beforeShowDay"); 12466 showOtherMonths = this._get(inst, "showOtherMonths"); 12467 selectOtherMonths = this._get(inst, "selectOtherMonths"); 12468 defaultDate = this._getDefaultDate(inst); 12469 html = ""; 12470 12471 for (row = 0; row < numMonths[0]; row++) { 12472 group = ""; 12473 this.maxRows = 4; 12474 for (col = 0; col < numMonths[1]; col++) { 12475 selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); 12476 cornerClass = " ui-corner-all"; 12477 calender = ""; 12478 if (isMultiMonth) { 12479 calender += "<div class='ui-datepicker-group"; 12480 if (numMonths[1] > 1) { 12481 switch (col) { 12482 case 0: calender += " ui-datepicker-group-first"; 12483 cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break; 12484 case numMonths[1] - 1: calender += " ui-datepicker-group-last"; 12485 cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break; 12486 default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break; 12487 } 12488 } 12489 calender += "'>"; 12490 } 12491 calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" + 12492 (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + 12493 (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + 12494 this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, 12495 row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers 12496 "</div><table class='ui-datepicker-calendar'><thead>" + 12497 "<tr>"; 12498 thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : ""); 12499 for (dow = 0; dow < 7; dow++) { // days of the week 12500 day = (dow + firstDay) % 7; 12501 thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + 12502 "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>"; 12503 } 12504 calender += thead + "</tr></thead><tbody>"; 12505 daysInMonth = this._getDaysInMonth(drawYear, drawMonth); 12506 if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { 12507 inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); 12508 } 12509 leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; 12510 curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate 12511 numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) 12512 this.maxRows = numRows; 12513 printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); 12514 for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows 12515 calender += "<tr>"; 12516 tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" + 12517 this._get(inst, "calculateWeek")(printDate) + "</td>"); 12518 for (dow = 0; dow < 7; dow++) { // create date picker days 12519 daySettings = (beforeShowDay ? 12520 beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); 12521 otherMonth = (printDate.getMonth() !== drawMonth); 12522 unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || 12523 (minDate && printDate < minDate) || (maxDate && printDate > maxDate); 12524 tbody += "<td class='" + 12525 ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends 12526 (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months 12527 ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key 12528 (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ? 12529 12530 // or defaultDate is current printedDate and defaultDate is selectedDate 12531 " " + this._dayOverClass : "") + // highlight selected day 12532 (unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "") + // highlight unselectable days 12533 (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates 12534 (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day 12535 (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different) 12536 ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "'") + "'" : "") + // cell title 12537 (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions 12538 (otherMonth && !showOtherMonths ? " " : // display for other months 12539 (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" + 12540 (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") + 12541 (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day 12542 (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months 12543 "' href='#' aria-current='" + (printDate.getTime() === currentDate.getTime() ? "true" : "false") + // mark date as selected for screen reader 12544 "' data-date='" + printDate.getDate() + // store date as data 12545 "'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date 12546 printDate.setDate(printDate.getDate() + 1); 12547 printDate = this._daylightSavingAdjust(printDate); 12548 } 12549 calender += tbody + "</tr>"; 12550 } 12551 drawMonth++; 12552 if (drawMonth > 11) { 12553 drawMonth = 0; 12554 drawYear++; 12555 } 12556 calender += "</tbody></table>" + (isMultiMonth ? "</div>" + 12557 ((numMonths[0] > 0 && col === numMonths[1] - 1) ? "<div class='ui-datepicker-row-break'></div>" : "") : ""); 12558 group += calender; 12559 } 12560 html += group; 12561 } 12562 html += buttonPanel; 12563 inst._keyEvent = false; 12564 return html; 12565 }, 12566 12567 /* Generate the month and year header. */ 12568 _generateMonthYearHeader: function (inst, drawMonth, drawYear, minDate, maxDate, 12569 secondary, monthNames, monthNamesShort) { 12570 12571 var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, 12572 changeMonth = this._get(inst, "changeMonth"), 12573 changeYear = this._get(inst, "changeYear"), 12574 showMonthAfterYear = this._get(inst, "showMonthAfterYear"), 12575 selectMonthLabel = this._get(inst, "selectMonthLabel"), 12576 selectYearLabel = this._get(inst, "selectYearLabel"), 12577 html = "<div class='ui-datepicker-title'>", 12578 monthHtml = ""; 12579 12580 // Month selection 12581 if (secondary || !changeMonth) { 12582 monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>"; 12583 } else { 12584 inMinYear = (minDate && minDate.getFullYear() === drawYear); 12585 inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); 12586 monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>"; 12587 for (month = 0; month < 12; month++) { 12588 if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) { 12589 monthHtml += "<option value='" + month + "'" + 12590 (month === drawMonth ? " selected='selected'" : "") + 12591 ">" + monthNamesShort[month] + "</option>"; 12592 } 12593 } 12594 monthHtml += "</select>"; 12595 } 12596 12597 if (!showMonthAfterYear) { 12598 html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : ""); 12599 } 12600 12601 // Year selection 12602 if (!inst.yearshtml) { 12603 inst.yearshtml = ""; 12604 if (secondary || !changeYear) { 12605 html += "<span class='ui-datepicker-year'>" + drawYear + "</span>"; 12606 } else { 12607 12608 // determine range of years to display 12609 years = this._get(inst, "yearRange").split(":"); 12610 thisYear = new Date().getFullYear(); 12611 determineYear = function (value) { 12612 var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : 12613 (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : 12614 parseInt(value, 10))); 12615 return (isNaN(year) ? thisYear : year); 12616 }; 12617 year = determineYear(years[0]); 12618 endYear = Math.max(year, determineYear(years[1] || "")); 12619 year = (minDate ? Math.max(year, minDate.getFullYear()) : year); 12620 endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); 12621 inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>"; 12622 for (; year <= endYear; year++) { 12623 inst.yearshtml += "<option value='" + year + "'" + 12624 (year === drawYear ? " selected='selected'" : "") + 12625 ">" + year + "</option>"; 12626 } 12627 inst.yearshtml += "</select>"; 12628 12629 html += inst.yearshtml; 12630 inst.yearshtml = null; 12631 } 12632 } 12633 12634 html += this._get(inst, "yearSuffix"); 12635 if (showMonthAfterYear) { 12636 html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml; 12637 } 12638 html += "</div>"; // Close datepicker_header 12639 return html; 12640 }, 12641 12642 /* Adjust one of the date sub-fields. */ 12643 _adjustInstDate: function (inst, offset, period) { 12644 var year = inst.selectedYear + (period === "Y" ? offset : 0), 12645 month = inst.selectedMonth + (period === "M" ? offset : 0), 12646 day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), 12647 date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); 12648 12649 inst.selectedDay = date.getDate(); 12650 inst.drawMonth = inst.selectedMonth = date.getMonth(); 12651 inst.drawYear = inst.selectedYear = date.getFullYear(); 12652 if (period === "M" || period === "Y") { 12653 this._notifyChange(inst); 12654 } 12655 }, 12656 12657 /* Ensure a date is within any min/max bounds. */ 12658 _restrictMinMax: function (inst, date) { 12659 var minDate = this._getMinMaxDate(inst, "min"), 12660 maxDate = this._getMinMaxDate(inst, "max"), 12661 newDate = (minDate && date < minDate ? minDate : date); 12662 return (maxDate && newDate > maxDate ? maxDate : newDate); 12663 }, 12664 12665 /* Notify change of month/year. */ 12666 _notifyChange: function (inst) { 12667 var onChange = this._get(inst, "onChangeMonthYear"); 12668 if (onChange) { 12669 onChange.apply((inst.input ? inst.input[0] : null), 12670 [inst.selectedYear, inst.selectedMonth + 1, inst]); 12671 } 12672 }, 12673 12674 /* Determine the number of months to show. */ 12675 _getNumberOfMonths: function (inst) { 12676 var numMonths = this._get(inst, "numberOfMonths"); 12677 return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); 12678 }, 12679 12680 /* Determine the current maximum date - ensure no time components are set. */ 12681 _getMinMaxDate: function (inst, minMax) { 12682 return this._determineDate(inst, this._get(inst, minMax + "Date"), null); 12683 }, 12684 12685 /* Find the number of days in a given month. */ 12686 _getDaysInMonth: function (year, month) { 12687 return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); 12688 }, 12689 12690 /* Find the day of the week of the first of a month. */ 12691 _getFirstDayOfMonth: function (year, month) { 12692 return new Date(year, month, 1).getDay(); 12693 }, 12694 12695 /* Determines if we should allow a "next/prev" month display change. */ 12696 _canAdjustMonth: function (inst, offset, curYear, curMonth) { 12697 var numMonths = this._getNumberOfMonths(inst), 12698 date = this._daylightSavingAdjust(new Date(curYear, 12699 curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); 12700 12701 if (offset < 0) { 12702 date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); 12703 } 12704 return this._isInRange(inst, date); 12705 }, 12706 12707 /* Is the given date in the accepted range? */ 12708 _isInRange: function (inst, date) { 12709 var yearSplit, currentYear, 12710 minDate = this._getMinMaxDate(inst, "min"), 12711 maxDate = this._getMinMaxDate(inst, "max"), 12712 minYear = null, 12713 maxYear = null, 12714 years = this._get(inst, "yearRange"); 12715 if (years) { 12716 yearSplit = years.split(":"); 12717 currentYear = new Date().getFullYear(); 12718 minYear = parseInt(yearSplit[0], 10); 12719 maxYear = parseInt(yearSplit[1], 10); 12720 if (yearSplit[0].match(/[+\-].*/)) { 12721 minYear += currentYear; 12722 } 12723 if (yearSplit[1].match(/[+\-].*/)) { 12724 maxYear += currentYear; 12725 } 12726 } 12727 12728 return ((!minDate || date.getTime() >= minDate.getTime()) && 12729 (!maxDate || date.getTime() <= maxDate.getTime()) && 12730 (!minYear || date.getFullYear() >= minYear) && 12731 (!maxYear || date.getFullYear() <= maxYear)); 12732 }, 12733 12734 /* Provide the configuration settings for formatting/parsing. */ 12735 _getFormatConfig: function (inst) { 12736 var shortYearCutoff = this._get(inst, "shortYearCutoff"); 12737 shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : 12738 new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); 12739 return { 12740 shortYearCutoff: shortYearCutoff, 12741 dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), 12742 monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames") 12743 }; 12744 }, 12745 12746 /* Format the given date for display. */ 12747 _formatDate: function (inst, day, month, year) { 12748 if (!day) { 12749 inst.currentDay = inst.selectedDay; 12750 inst.currentMonth = inst.selectedMonth; 12751 inst.currentYear = inst.selectedYear; 12752 } 12753 var date = (day ? (typeof day === "object" ? day : 12754 this._daylightSavingAdjust(new Date(year, month, day))) : 12755 this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); 12756 return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); 12757 } 12758 }); 12759 12760 /* 12761 * Bind hover events for datepicker elements. 12762 * Done via delegate so the binding only occurs once in the lifetime of the parent div. 12763 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. 12764 */ 12765 function datepicker_bindHover(dpDiv) { 12766 var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; 12767 return dpDiv.on("mouseout", selector, function () { 12768 $(this).removeClass("ui-state-hover"); 12769 if (this.className.indexOf("ui-datepicker-prev") !== -1) { 12770 $(this).removeClass("ui-datepicker-prev-hover"); 12771 } 12772 if (this.className.indexOf("ui-datepicker-next") !== -1) { 12773 $(this).removeClass("ui-datepicker-next-hover"); 12774 } 12775 }) 12776 .on("mouseover", selector, datepicker_handleMouseover); 12777 } 12778 12779 function datepicker_handleMouseover() { 12780 if (!$.datepicker._isDisabledDatepicker(datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) { 12781 $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); 12782 $(this).addClass("ui-state-hover"); 12783 if (this.className.indexOf("ui-datepicker-prev") !== -1) { 12784 $(this).addClass("ui-datepicker-prev-hover"); 12785 } 12786 if (this.className.indexOf("ui-datepicker-next") !== -1) { 12787 $(this).addClass("ui-datepicker-next-hover"); 12788 } 12789 } 12790 } 12791 12792 /* jQuery extend now ignores nulls! */ 12793 function datepicker_extendRemove(target, props) { 12794 $.extend(target, props); 12795 for (var name in props) { 12796 if (props[name] == null) { 12797 target[name] = props[name]; 12798 } 12799 } 12800 return target; 12801 } 12802 12803 /* Invoke the datepicker functionality. 12804 @param options string - a command, optionally followed by additional parameters or 12805 Object - settings for attaching new datepicker functionality 12806 @return jQuery object */ 12807 $.fn.datepicker = function (options) { 12808 12809 /* Verify an empty collection wasn't passed - Fixes #6976 */ 12810 if (!this.length) { 12811 return this; 12812 } 12813 12814 /* Initialise the date picker. */ 12815 if (!$.datepicker.initialized) { 12816 $(document).on("mousedown", $.datepicker._checkExternalClick); 12817 $.datepicker.initialized = true; 12818 } 12819 12820 /* Append datepicker main container to body if not exist. */ 12821 if ($("#" + $.datepicker._mainDivId).length === 0) { 12822 $("body").append($.datepicker.dpDiv); 12823 } 12824 12825 var otherArgs = Array.prototype.slice.call(arguments, 1); 12826 if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { 12827 return $.datepicker["_" + options + "Datepicker"]. 12828 apply($.datepicker, [this[0]].concat(otherArgs)); 12829 } 12830 if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { 12831 return $.datepicker["_" + options + "Datepicker"]. 12832 apply($.datepicker, [this[0]].concat(otherArgs)); 12833 } 12834 return this.each(function () { 12835 if (typeof options === "string") { 12836 $.datepicker["_" + options + "Datepicker"] 12837 .apply($.datepicker, [this].concat(otherArgs)); 12838 } else { 12839 $.datepicker._attachDatepicker(this, options); 12840 } 12841 }); 12842 }; 12843 12844 $.datepicker = new Datepicker(); // singleton instance 12845 $.datepicker.initialized = false; 12846 $.datepicker.uuid = new Date().getTime(); 12847 $.datepicker.version = "1.13.1"; 12848 12849 var widgetsDatepicker = $.datepicker; 12850 12851 12852 /*! 12853 * jQuery UI Dialog 1.13.1 12854 * http://jqueryui.com
vendor: 28,232 bytes, lines 12855-13922
12855 * 12856 * Copyright jQuery Foundation and other contributors 12857 * Released under the MIT license. 12858 * http://jquery.org/license 12859 */ 12860 12861 //>>label: Dialog 12862 //>>group: Widgets 12863 //>>description: Displays customizable dialog windows. 12864 //>>docs: http://api.jqueryui.com/dialog/ 12865 //>>demos: http://jqueryui.com/dialog/ 12866 //>>css.structure: ../../themes/base/core.css 12867 //>>css.structure: ../../themes/base/dialog.css 12868 //>>css.theme: ../../themes/base/theme.css 12869 12870 12871 $.widget("ui.dialog", { 12872 version: "1.13.1", 12873 options: { 12874 appendTo: "body", 12875 autoOpen: true, 12876 buttons: [], 12877 classes: { 12878 "ui-dialog": "ui-corner-all", 12879 "ui-dialog-titlebar": "ui-corner-all" 12880 }, 12881 closeOnEscape: true, 12882 closeText: "Close", 12883 draggable: true, 12884 hide: null, 12885 height: "auto", 12886 maxHeight: null, 12887 maxWidth: null, 12888 minHeight: 150, 12889 minWidth: 150, 12890 modal: false, 12891 position: { 12892 my: "center", 12893 at: "center", 12894 of: window, 12895 collision: "fit", 12896 12897 // Ensure the titlebar is always visible 12898 using: function (pos) { 12899 var topOffset = $(this).css(pos).offset().top; 12900 if (topOffset < 0) { 12901 $(this).css("top", pos.top - topOffset); 12902 } 12903 } 12904 }, 12905 resizable: true, 12906 show: null, 12907 title: null, 12908 width: 300, 12909 12910 // Callbacks 12911 beforeClose: null, 12912 close: null, 12913 drag: null, 12914 dragStart: null, 12915 dragStop: null, 12916 focus: null, 12917 open: null, 12918 resize: null, 12919 resizeStart: null, 12920 resizeStop: null 12921 }, 12922 12923 sizeRelatedOptions: { 12924 buttons: true, 12925 height: true, 12926 maxHeight: true, 12927 maxWidth: true, 12928 minHeight: true, 12929 minWidth: true, 12930 width: true 12931 }, 12932 12933 resizableRelatedOptions: { 12934 maxHeight: true, 12935 maxWidth: true, 12936 minHeight: true, 12937 minWidth: true 12938 }, 12939 12940 _create: function () { 12941 this.originalCss = { 12942 display: this.element[0].style.display, 12943 width: this.element[0].style.width, 12944 minHeight: this.element[0].style.minHeight, 12945 maxHeight: this.element[0].style.maxHeight, 12946 height: this.element[0].style.height 12947 }; 12948 this.originalPosition = { 12949 parent: this.element.parent(), 12950 index: this.element.parent().children().index(this.element) 12951 }; 12952 this.originalTitle = this.element.attr("title"); 12953 if (this.options.title == null && this.originalTitle != null) { 12954 this.options.title = this.originalTitle; 12955 } 12956 12957 // Dialogs can't be disabled 12958 if (this.options.disabled) { 12959 this.options.disabled = false; 12960 } 12961 12962 this._createWrapper(); 12963 12964 this.element 12965 .show() 12966 .removeAttr("title") 12967 .appendTo(this.uiDialog); 12968 12969 this._addClass("ui-dialog-content", "ui-widget-content"); 12970 12971 this._createTitlebar(); 12972 this._createButtonPane(); 12973 12974 if (this.options.draggable && $.fn.draggable) { 12975 this._makeDraggable(); 12976 } 12977 if (this.options.resizable && $.fn.resizable) { 12978 this._makeResizable(); 12979 } 12980 12981 this._isOpen = false; 12982 12983 this._trackFocus(); 12984 }, 12985 12986 _init: function () { 12987 if (this.options.autoOpen) { 12988 this.open(); 12989 } 12990 }, 12991 12992 _appendTo: function () { 12993 var element = this.options.appendTo; 12994 if (element && (element.jquery || element.nodeType)) { 12995 return $(element); 12996 } 12997 return this.document.find(element || "body").eq(0); 12998 }, 12999 13000 _destroy: function () { 13001 var next, 13002 originalPosition = this.originalPosition; 13003 13004 this._untrackInstance(); 13005 this._destroyOverlay(); 13006 13007 this.element 13008 .removeUniqueId() 13009 .css(this.originalCss) 13010 13011 // Without detaching first, the following becomes really slow 13012 .detach(); 13013 13014 this.uiDialog.remove(); 13015 13016 if (this.originalTitle) { 13017 this.element.attr("title", this.originalTitle); 13018 } 13019 13020 next = originalPosition.parent.children().eq(originalPosition.index); 13021 13022 // Don't try to place the dialog next to itself (#8613) 13023 if (next.length && next[0] !== this.element[0]) { 13024 next.before(this.element); 13025 } else { 13026 originalPosition.parent.append(this.element); 13027 } 13028 }, 13029 13030 widget: function () { 13031 return this.uiDialog; 13032 }, 13033 13034 disable: $.noop, 13035 enable: $.noop, 13036 13037 close: function (event) { 13038 var that = this; 13039 13040 if (!this._isOpen || this._trigger("beforeClose", event) === false) { 13041 return; 13042 } 13043 13044 this._isOpen = false; 13045 this._focusedElement = null; 13046 this._destroyOverlay(); 13047 this._untrackInstance(); 13048 13049 if (!this.opener.filter(":focusable").trigger("focus").length) { 13050 13051 // Hiding a focused element doesn't trigger blur in WebKit 13052 // so in case we have nothing to focus on, explicitly blur the active element 13053 // https://bugs.webkit.org/show_bug.cgi?id=47182 13054 $.ui.safeBlur($.ui.safeActiveElement(this.document[0])); 13055 } 13056 13057 this._hide(this.uiDialog, this.options.hide, function () { 13058 that._trigger("close", event); 13059 }); 13060 }, 13061 13062 isOpen: function () { 13063 return this._isOpen; 13064 }, 13065 13066 moveToTop: function () { 13067 this._moveToTop(); 13068 }, 13069 13070 _moveToTop: function (event, silent) { 13071 var moved = false, 13072 zIndices = this.uiDialog.siblings(".ui-front:visible").map(function () { 13073 return +$(this).css("z-index"); 13074 }).get(), 13075 zIndexMax = Math.max.apply(null, zIndices); 13076 13077 if (zIndexMax >= +this.uiDialog.css("z-index")) { 13078 this.uiDialog.css("z-index", zIndexMax + 1); 13079 moved = true; 13080 } 13081 13082 if (moved && !silent) { 13083 this._trigger("focus", event); 13084 } 13085 return moved; 13086 }, 13087 13088 open: function () { 13089 var that = this; 13090 if (this._isOpen) { 13091 if (this._moveToTop()) { 13092 this._focusTabbable(); 13093 } 13094 return; 13095 } 13096 13097 this._isOpen = true; 13098 this.opener = $($.ui.safeActiveElement(this.document[0])); 13099 13100 this._size(); 13101 this._position(); 13102 this._createOverlay(); 13103 this._moveToTop(null, true); 13104 13105 // Ensure the overlay is moved to the top with the dialog, but only when 13106 // opening. The overlay shouldn't move after the dialog is open so that 13107 // modeless dialogs opened after the modal dialog stack properly. 13108 if (this.overlay) { 13109 this.overlay.css("z-index", this.uiDialog.css("z-index") - 1); 13110 } 13111 13112 this._show(this.uiDialog, this.options.show, function () { 13113 that._focusTabbable(); 13114 that._trigger("focus"); 13115 }); 13116 13117 // Track the dialog immediately upon opening in case a focus event 13118 // somehow occurs outside of the dialog before an element inside the 13119 // dialog is focused (#10152) 13120 this._makeFocusTarget(); 13121 13122 this._trigger("open"); 13123 }, 13124 13125 _focusTabbable: function () { 13126 13127 // Set focus to the first match: 13128 // 1. An element that was focused previously 13129 // 2. First element inside the dialog matching [autofocus] 13130 // 3. Tabbable element inside the content element 13131 // 4. Tabbable element inside the buttonpane 13132 // 5. The close button 13133 // 6. The dialog itself 13134 var hasFocus = this._focusedElement; 13135 if (!hasFocus) { 13136 hasFocus = this.element.find("[autofocus]"); 13137 } 13138 if (!hasFocus.length) { 13139 hasFocus = this.element.find(":tabbable"); 13140 } 13141 if (!hasFocus.length) { 13142 hasFocus = this.uiDialogButtonPane.find(":tabbable"); 13143 } 13144 if (!hasFocus.length) { 13145 hasFocus = this.uiDialogTitlebarClose.filter(":tabbable"); 13146 } 13147 if (!hasFocus.length) { 13148 hasFocus = this.uiDialog; 13149 } 13150 hasFocus.eq(0).trigger("focus"); 13151 }, 13152 13153 _restoreTabbableFocus: function () { 13154 var activeElement = $.ui.safeActiveElement(this.document[0]), 13155 isActive = this.uiDialog[0] === activeElement || 13156 $.contains(this.uiDialog[0], activeElement); 13157 if (!isActive) { 13158 this._focusTabbable(); 13159 } 13160 }, 13161 13162 _keepFocus: function (event) { 13163 event.preventDefault(); 13164 this._restoreTabbableFocus(); 13165 13166 // support: IE 13167 // IE <= 8 doesn't prevent moving focus even with event.preventDefault() 13168 // so we check again later 13169 this._delay(this._restoreTabbableFocus); 13170 }, 13171 13172 _createWrapper: function () { 13173 this.uiDialog = $("<div>") 13174 .hide() 13175 .attr({ 13176 13177 // Setting tabIndex makes the div focusable 13178 tabIndex: -1, 13179 role: "dialog" 13180 }) 13181 .appendTo(this._appendTo()); 13182 13183 this._addClass(this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front"); 13184 this._on(this.uiDialog, { 13185 keydown: function (event) { 13186 if (this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && 13187 event.keyCode === $.ui.keyCode.ESCAPE) { 13188 event.preventDefault(); 13189 this.close(event); 13190 return; 13191 } 13192 13193 // Prevent tabbing out of dialogs 13194 if (event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented()) { 13195 return; 13196 } 13197 var tabbables = this.uiDialog.find(":tabbable"), 13198 first = tabbables.first(), 13199 last = tabbables.last(); 13200 13201 if ((event.target === last[0] || event.target === this.uiDialog[0]) && 13202 !event.shiftKey) { 13203 this._delay(function () { 13204 first.trigger("focus"); 13205 }); 13206 event.preventDefault(); 13207 } else if ((event.target === first[0] || 13208 event.target === this.uiDialog[0]) && event.shiftKey) { 13209 this._delay(function () { 13210 last.trigger("focus"); 13211 }); 13212 event.preventDefault(); 13213 } 13214 }, 13215 mousedown: function (event) { 13216 if (this._moveToTop(event)) { 13217 this._focusTabbable(); 13218 } 13219 } 13220 }); 13221 13222 // We assume that any existing aria-describedby attribute means 13223 // that the dialog content is marked up properly 13224 // otherwise we brute force the content as the description 13225 if (!this.element.find("[aria-describedby]").length) { 13226 this.uiDialog.attr({ 13227 "aria-describedby": this.element.uniqueId().attr("id") 13228 }); 13229 } 13230 }, 13231 13232 _createTitlebar: function () { 13233 var uiDialogTitle; 13234 13235 this.uiDialogTitlebar = $("<div>"); 13236 this._addClass(this.uiDialogTitlebar, 13237 "ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix"); 13238 this._on(this.uiDialogTitlebar, { 13239 mousedown: function (event) { 13240 13241 // Don't prevent click on close button (#8838) 13242 // Focusing a dialog that is partially scrolled out of view 13243 // causes the browser to scroll it into view, preventing the click event 13244 if (!$(event.target).closest(".ui-dialog-titlebar-close")) { 13245 13246 // Dialog isn't getting focus when dragging (#8063) 13247 this.uiDialog.trigger("focus"); 13248 } 13249 } 13250 }); 13251 13252 // Support: IE 13253 // Use type="button" to prevent enter keypresses in textboxes from closing the 13254 // dialog in IE (#9312) 13255 this.uiDialogTitlebarClose = $("<button type='button'></button>") 13256 .button({ 13257 label: $("<a>").text(this.options.closeText).html(), 13258 icon: "ui-icon-closethick", 13259 showLabel: false 13260 }) 13261 .appendTo(this.uiDialogTitlebar); 13262 13263 this._addClass(this.uiDialogTitlebarClose, "ui-dialog-titlebar-close"); 13264 this._on(this.uiDialogTitlebarClose, { 13265 click: function (event) { 13266 event.preventDefault(); 13267 this.close(event); 13268 } 13269 }); 13270 13271 uiDialogTitle = $("<span>").uniqueId().prependTo(this.uiDialogTitlebar); 13272 this._addClass(uiDialogTitle, "ui-dialog-title"); 13273 this._title(uiDialogTitle); 13274 13275 this.uiDialogTitlebar.prependTo(this.uiDialog); 13276 13277 this.uiDialog.attr({ 13278 "aria-labelledby": uiDialogTitle.attr("id") 13279 }); 13280 }, 13281 13282 _title: function (title) { 13283 if (this.options.title) { 13284 title.text(this.options.title); 13285 } else { 13286 title.html(" "); 13287 } 13288 }, 13289 13290 _createButtonPane: function () { 13291 this.uiDialogButtonPane = $("<div>"); 13292 this._addClass(this.uiDialogButtonPane, "ui-dialog-buttonpane", 13293 "ui-widget-content ui-helper-clearfix"); 13294 13295 this.uiButtonSet = $("<div>") 13296 .appendTo(this.uiDialogButtonPane); 13297 this._addClass(this.uiButtonSet, "ui-dialog-buttonset"); 13298 13299 this._createButtons(); 13300 }, 13301 13302 _createButtons: function () { 13303 var that = this, 13304 buttons = this.options.buttons; 13305 13306 // If we already have a button pane, remove it 13307 this.uiDialogButtonPane.remove(); 13308 this.uiButtonSet.empty(); 13309 13310 if ($.isEmptyObject(buttons) || (Array.isArray(buttons) && !buttons.length)) { 13311 this._removeClass(this.uiDialog, "ui-dialog-buttons"); 13312 return; 13313 } 13314 13315 $.each(buttons, function (name, props) { 13316 var click, buttonOptions; 13317 props = typeof props === "function" ? 13318 { click: props, text: name } : 13319 props; 13320 13321 // Default to a non-submitting button 13322 props = $.extend({ type: "button" }, props); 13323 13324 // Change the context for the click callback to be the main element 13325 click = props.click; 13326 buttonOptions = { 13327 icon: props.icon, 13328 iconPosition: props.iconPosition, 13329 showLabel: props.showLabel, 13330 13331 // Deprecated options 13332 icons: props.icons, 13333 text: props.text 13334 }; 13335 13336 delete props.click; 13337 delete props.icon; 13338 delete props.iconPosition; 13339 delete props.showLabel; 13340 13341 // Deprecated options 13342 delete props.icons; 13343 if (typeof props.text === "boolean") { 13344 delete props.text; 13345 } 13346 13347 $("<button></button>", props) 13348 .button(buttonOptions) 13349 .appendTo(that.uiButtonSet) 13350 .on("click", function () { 13351 click.apply(that.element[0], arguments); 13352 }); 13353 }); 13354 this._addClass(this.uiDialog, "ui-dialog-buttons"); 13355 this.uiDialogButtonPane.appendTo(this.uiDialog); 13356 }, 13357 13358 _makeDraggable: function () { 13359 var that = this, 13360 options = this.options; 13361 13362 function filteredUi(ui) { 13363 return { 13364 position: ui.position, 13365 offset: ui.offset 13366 }; 13367 } 13368 13369 this.uiDialog.draggable({ 13370 cancel: ".ui-dialog-content, .ui-dialog-titlebar-close", 13371 handle: ".ui-dialog-titlebar", 13372 containment: "document", 13373 start: function (event, ui) { 13374 that._addClass($(this), "ui-dialog-dragging"); 13375 that._blockFrames(); 13376 that._trigger("dragStart", event, filteredUi(ui)); 13377 }, 13378 drag: function (event, ui) { 13379 that._trigger("drag", event, filteredUi(ui)); 13380 }, 13381 stop: function (event, ui) { 13382 var left = ui.offset.left - that.document.scrollLeft(), 13383 top = ui.offset.top - that.document.scrollTop(); 13384 13385 options.position = { 13386 my: "left top", 13387 at: "left" + (left >= 0 ? "+" : "") + left + " " + 13388 "top" + (top >= 0 ? "+" : "") + top, 13389 of: that.window 13390 }; 13391 that._removeClass($(this), "ui-dialog-dragging"); 13392 that._unblockFrames(); 13393 that._trigger("dragStop", event, filteredUi(ui)); 13394 } 13395 }); 13396 }, 13397 13398 _makeResizable: function () { 13399 var that = this, 13400 options = this.options, 13401 handles = options.resizable, 13402 13403 // .ui-resizable has position: relative defined in the stylesheet 13404 // but dialogs have to use absolute or fixed positioning 13405 position = this.uiDialog.css("position"), 13406 resizeHandles = typeof handles === "string" ? 13407 handles : 13408 "n,e,s,w,se,sw,ne,nw"; 13409 13410 function filteredUi(ui) { 13411 return { 13412 originalPosition: ui.originalPosition, 13413 originalSize: ui.originalSize, 13414 position: ui.position, 13415 size: ui.size 13416 }; 13417 } 13418 13419 this.uiDialog.resizable({ 13420 cancel: ".ui-dialog-content", 13421 containment: "document", 13422 alsoResize: this.element, 13423 maxWidth: options.maxWidth, 13424 maxHeight: options.maxHeight, 13425 minWidth: options.minWidth, 13426 minHeight: this._minHeight(), 13427 handles: resizeHandles, 13428 start: function (event, ui) { 13429 that._addClass($(this), "ui-dialog-resizing"); 13430 that._blockFrames(); 13431 that._trigger("resizeStart", event, filteredUi(ui)); 13432 }, 13433 resize: function (event, ui) { 13434 that._trigger("resize", event, filteredUi(ui)); 13435 }, 13436 stop: function (event, ui) { 13437 var offset = that.uiDialog.offset(), 13438 left = offset.left - that.document.scrollLeft(), 13439 top = offset.top - that.document.scrollTop(); 13440 13441 options.height = that.uiDialog.height(); 13442 options.width = that.uiDialog.width(); 13443 options.position = { 13444 my: "left top", 13445 at: "left" + (left >= 0 ? "+" : "") + left + " " + 13446 "top" + (top >= 0 ? "+" : "") + top, 13447 of: that.window 13448 }; 13449 that._removeClass($(this), "ui-dialog-resizing"); 13450 that._unblockFrames(); 13451 that._trigger("resizeStop", event, filteredUi(ui)); 13452 } 13453 }) 13454 .css("position", position); 13455 }, 13456 13457 _trackFocus: function () { 13458 this._on(this.widget(), { 13459 focusin: function (event) { 13460 this._makeFocusTarget(); 13461 this._focusedElement = $(event.target); 13462 } 13463 }); 13464 }, 13465 13466 _makeFocusTarget: function () { 13467 this._untrackInstance(); 13468 this._trackingInstances().unshift(this); 13469 }, 13470 13471 _untrackInstance: function () { 13472 var instances = this._trackingInstances(), 13473 exists = $.inArray(this, instances); 13474 if (exists !== -1) { 13475 instances.splice(exists, 1); 13476 } 13477 }, 13478 13479 _trackingInstances: function () { 13480 var instances = this.document.data("ui-dialog-instances"); 13481 if (!instances) { 13482 instances = []; 13483 this.document.data("ui-dialog-instances", instances); 13484 } 13485 return instances; 13486 }, 13487 13488 _minHeight: function () { 13489 var options = this.options; 13490 13491 return options.height === "auto" ? 13492 options.minHeight : 13493 Math.min(options.minHeight, options.height); 13494 }, 13495 13496 _position: function () { 13497 13498 // Need to show the dialog to get the actual offset in the position plugin 13499 var isVisible = this.uiDialog.is(":visible"); 13500 if (!isVisible) { 13501 this.uiDialog.show(); 13502 } 13503 this.uiDialog.position(this.options.position); 13504 if (!isVisible) { 13505 this.uiDialog.hide(); 13506 } 13507 }, 13508 13509 _setOptions: function (options) { 13510 var that = this, 13511 resize = false, 13512 resizableOptions = {}; 13513 13514 $.each(options, function (key, value) { 13515 that._setOption(key, value); 13516 13517 if (key in that.sizeRelatedOptions) { 13518 resize = true; 13519 } 13520 if (key in that.resizableRelatedOptions) { 13521 resizableOptions[key] = value; 13522 } 13523 }); 13524 13525 if (resize) { 13526 this._size(); 13527 this._position(); 13528 } 13529 if (this.uiDialog.is(":data(ui-resizable)")) { 13530 this.uiDialog.resizable("option", resizableOptions); 13531 } 13532 }, 13533 13534 _setOption: function (key, value) { 13535 var isDraggable, isResizable, 13536 uiDialog = this.uiDialog; 13537 13538 if (key === "disabled") { 13539 return; 13540 } 13541 13542 this._super(key, value); 13543 13544 if (key === "appendTo") { 13545 this.uiDialog.appendTo(this._appendTo()); 13546 } 13547 13548 if (key === "buttons") { 13549 this._createButtons(); 13550 } 13551 13552 if (key === "closeText") { 13553 this.uiDialogTitlebarClose.button({ 13554 13555 // Ensure that we always pass a string 13556 label: $("<a>").text("" + this.options.closeText).html() 13557 }); 13558 } 13559 13560 if (key === "draggable") { 13561 isDraggable = uiDialog.is(":data(ui-draggable)"); 13562 if (isDraggable && !value) { 13563 uiDialog.draggable("destroy"); 13564 } 13565 13566 if (!isDraggable && value) { 13567 this._makeDraggable(); 13568 } 13569 } 13570 13571 if (key === "position") { 13572 this._position(); 13573 } 13574 13575 if (key === "resizable") { 13576 13577 // currently resizable, becoming non-resizable 13578 isResizable = uiDialog.is(":data(ui-resizable)"); 13579 if (isResizable && !value) { 13580 uiDialog.resizable("destroy"); 13581 } 13582 13583 // Currently resizable, changing handles 13584 if (isResizable && typeof value === "string") { 13585 uiDialog.resizable("option", "handles", value); 13586 } 13587 13588 // Currently non-resizable, becoming resizable 13589 if (!isResizable && value !== false) { 13590 this._makeResizable(); 13591 } 13592 } 13593 13594 if (key === "title") { 13595 this._title(this.uiDialogTitlebar.find(".ui-dialog-title")); 13596 } 13597 }, 13598 13599 _size: function () { 13600 13601 // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content 13602 // divs will both have width and height set, so we need to reset them 13603 var nonContentHeight, minContentHeight, maxContentHeight, 13604 options = this.options; 13605 13606 // Reset content sizing 13607 this.element.show().css({ 13608 width: "auto", 13609 minHeight: 0, 13610 maxHeight: "none", 13611 height: 0 13612 }); 13613 13614 if (options.minWidth > options.width) { 13615 options.width = options.minWidth; 13616 } 13617 13618 // Reset wrapper sizing 13619 // determine the height of all the non-content elements 13620 nonContentHeight = this.uiDialog.css({ 13621 height: "auto", 13622 width: options.width 13623 }) 13624 .outerHeight(); 13625 minContentHeight = Math.max(0, options.minHeight - nonContentHeight); 13626 maxContentHeight = typeof options.maxHeight === "number" ? 13627 Math.max(0, options.maxHeight - nonContentHeight) : 13628 "none"; 13629 13630 if (options.height === "auto") { 13631 this.element.css({ 13632 minHeight: minContentHeight, 13633 maxHeight: maxContentHeight, 13634 height: "auto" 13635 }); 13636 } else { 13637 this.element.height(Math.max(0, options.height - nonContentHeight)); 13638 } 13639 13640 if (this.uiDialog.is(":data(ui-resizable)")) { 13641 this.uiDialog.resizable("option", "minHeight", this._minHeight()); 13642 } 13643 }, 13644 13645 _blockFrames: function () { 13646 this.iframeBlocks = this.document.find("iframe").map(function () { 13647 var iframe = $(this); 13648 13649 return $("<div>") 13650 .css({ 13651 position: "absolute", 13652 width: iframe.outerWidth(), 13653 height: iframe.outerHeight() 13654 }) 13655 .appendTo(iframe.parent()) 13656 .offset(iframe.offset())[0]; 13657 }); 13658 }, 13659 13660 _unblockFrames: function () { 13661 if (this.iframeBlocks) { 13662 this.iframeBlocks.remove(); 13663 delete this.iframeBlocks; 13664 } 13665 }, 13666 13667 _allowInteraction: function (event) { 13668 if ($(event.target).closest(".ui-dialog").length) { 13669 return true; 13670 } 13671 13672 // TODO: Remove hack when datepicker implements 13673 // the .ui-front logic (#8989) 13674 return !!$(event.target).closest(".ui-datepicker").length; 13675 }, 13676 13677 _createOverlay: function () { 13678 if (!this.options.modal) { 13679 return; 13680 } 13681 13682 var jqMinor = $.fn.jquery.substring(0, 4); 13683 13684 // We use a delay in case the overlay is created from an 13685 // event that we're going to be cancelling (#2804) 13686 var isOpening = true; 13687 this._delay(function () { 13688 isOpening = false; 13689 }); 13690 13691 if (!this.document.data("ui-dialog-overlays")) { 13692 13693 // Prevent use of anchors and inputs 13694 // This doesn't use `_on()` because it is a shared event handler 13695 // across all open modal dialogs. 13696 this.document.on("focusin.ui-dialog", function (event) { 13697 if (isOpening) { 13698 return; 13699 } 13700 13701 var instance = this._trackingInstances()[0]; 13702 if (!instance._allowInteraction(event)) { 13703 event.preventDefault(); 13704 instance._focusTabbable(); 13705 13706 // Support: jQuery >=3.4 <3.6 only 13707 // Focus re-triggering in jQuery 3.4/3.5 makes the original element 13708 // have its focus event propagated last, breaking the re-targeting. 13709 // Trigger focus in a delay in addition if needed to avoid the issue 13710 // See https://github.com/jquery/jquery/issues/4382 13711 if (jqMinor === "3.4." || jqMinor === "3.5.") { 13712 instance._delay(instance._restoreTabbableFocus); 13713 } 13714 } 13715 }.bind(this)); 13716 } 13717 13718 this.overlay = $("<div>") 13719 .appendTo(this._appendTo()); 13720 13721 this._addClass(this.overlay, null, "ui-widget-overlay ui-front"); 13722 this._on(this.overlay, { 13723 mousedown: "_keepFocus" 13724 }); 13725 this.document.data("ui-dialog-overlays", 13726 (this.document.data("ui-dialog-overlays") || 0) + 1); 13727 }, 13728 13729 _destroyOverlay: function () { 13730 if (!this.options.modal) { 13731 return; 13732 } 13733 13734 if (this.overlay) { 13735 var overlays = this.document.data("ui-dialog-overlays") - 1; 13736 13737 if (!overlays) { 13738 this.document.off("focusin.ui-dialog"); 13739 this.document.removeData("ui-dialog-overlays"); 13740 } else { 13741 this.document.data("ui-dialog-overlays", overlays); 13742 } 13743 13744 this.overlay.remove(); 13745 this.overlay = null; 13746 } 13747 } 13748 }); 13749 13750 // DEPRECATED 13751 // TODO: switch return back to widget declaration at top of file when this is removed 13752 if ($.uiBackCompat !== false) { 13753 13754 // Backcompat for dialogClass option 13755 $.widget("ui.dialog", $.ui.dialog, { 13756 options: { 13757 dialogClass: "" 13758 }, 13759 _createWrapper: function () { 13760 this._super(); 13761 this.uiDialog.addClass(this.options.dialogClass); 13762 }, 13763 _setOption: function (key, value) { 13764 if (key === "dialogClass") { 13765 this.uiDialog 13766 .removeClass(this.options.dialogClass) 13767 .addClass(value); 13768 } 13769 this._superApply(arguments); 13770 } 13771 }); 13772 } 13773 13774 var widgetsDialog = $.ui.dialog; 13775 13776 13777 /*! 13778 * jQuery UI Selectmenu 1.13.1 13779 * http://jqueryui.com 13780 * 13781 * Copyright jQuery Foundation and other contributors 13782 * Released under the MIT license. 13783 * http://jquery.org/license 13784 */ 13785 13786 //>>label: Selectmenu 13787 //>>group: Widgets 13788 /* eslint-disable max-len */ 13789 //>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select. 13790 /* eslint-enable max-len */ 13791 //>>docs: http://api.jqueryui.com/selectmenu/ 13792 //>>demos: http://jqueryui.com/selectmenu/ 13793 //>>css.structure: ../../themes/base/core.css 13794 //>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css 13795 //>>css.theme: ../../themes/base/theme.css 13796 13797 13798 var widgetsSelectmenu = $.widget("ui.selectmenu", [$.ui.formResetMixin, { 13799 version: "1.13.1", 13800 defaultElement: "<select>", 13801 options: { 13802 appendTo: null, 13803 classes: { 13804 "ui-selectmenu-button-open": "ui-corner-top", 13805 "ui-selectmenu-button-closed": "ui-corner-all" 13806 }, 13807 disabled: null, 13808 icons: { 13809 button: "ui-icon-triangle-1-s" 13810 }, 13811 position: { 13812 my: "left top", 13813 at: "left bottom", 13814 collision: "none" 13815 }, 13816 width: false, 13817 13818 // Callbacks 13819 change: null, 13820 close: null, 13821 focus: null, 13822 open: null, 13823 select: null 13824 }, 13825 13826 _create: function () { 13827 var selectmenuId = this.element.uniqueId().attr("id"); 13828 this.ids = { 13829 element: selectmenuId, 13830 button: selectmenuId + "-button", 13831 menu: selectmenuId + "-menu" 13832 }; 13833 13834 this._drawButton(); 13835 this._drawMenu(); 13836 this._bindFormResetHandler(); 13837 13838 this._rendered = false; 13839 this.menuItems = $(); 13840 }, 13841 13842 _drawButton: function () { 13843 var icon, 13844 that = this, 13845 item = this._parseOption( 13846 this.element.find("option:selected"), 13847 this.element[0].selectedIndex 13848 ); 13849 13850 // Associate existing label with the new button 13851 this.labels = this.element.labels().attr("for", this.ids.button); 13852 this._on(this.labels, { 13853 click: function (event) { 13854 this.button.trigger("focus"); 13855 event.preventDefault(); 13856 } 13857 }); 13858 13859 // Hide original select element 13860 this.element.hide(); 13861 13862 // Create button 13863 this.button = $("<span>", { 13864 tabindex: this.options.disabled ? -1 : 0, 13865 id: this.ids.button, 13866 role: "combobox", 13867 "aria-expanded": "false", 13868 "aria-autocomplete": "list", 13869 "aria-owns": this.ids.menu, 13870 "aria-haspopup": "true", 13871 title: this.element.attr("title") 13872 }) 13873 .insertAfter(this.element); 13874 13875 this._addClass(this.button, "ui-selectmenu-button ui-selectmenu-button-closed", 13876 "ui-button ui-widget"); 13877 13878 icon = $("<span>").appendTo(this.button); 13879 this._addClass(icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button); 13880 this.buttonItem = this._renderButtonItem(item) 13881 .appendTo(this.button); 13882 13883 if (this.options.width !== false) { 13884 this._resizeButton(); 13885 } 13886 13887 this._on(this.button, this._buttonEvents); 13888 this.button.one("focusin", function () { 13889 13890 // Delay rendering the menu items until the button receives focus. 13891 // The menu may have already been rendered via a programmatic open. 13892 if (!that._rendered) { 13893 that._refreshMenu(); 13894 } 13895 }); 13896 }, 13897 13898 _drawMenu: function () { 13899 var that = this; 13900 13901 // Create menu 13902 this.menu = $("<ul>", { 13903 "aria-hidden": "true", 13904 "aria-labelledby": this.ids.button, 13905 id: this.ids.menu 13906 }); 13907 13908 // Wrap menu 13909 this.menuWrap = $("<div>").append(this.menu); 13910 this._addClass(this.menuWrap, "ui-selectmenu-menu", "ui-front"); 13911 this.menuWrap.appendTo(this._appendTo()); 13912 13913 // Initialize menu widget 13914 this.menuInstance = this.menu 13915 .menu({ 13916 classes: { 13917 "ui-menu": "ui-corner-bottom" 13918 }, 13919 role: "listbox", 13920 select: function (event, ui) { 13921 event.preventDefault(); 13922
vendor: 11,594 bytes, lines 13923-14393
13923 // Support: IE8 13924 // If the item was selected via a click, the text selection 13925 // will be destroyed in IE 13926 that._setSelection(); 13927 13928 that._select(ui.item.data("ui-selectmenu-item"), event); 13929 }, 13930 focus: function (event, ui) { 13931 var item = ui.item.data("ui-selectmenu-item"); 13932 13933 // Prevent inital focus from firing and check if its a newly focused item 13934 if (that.focusIndex != null && item.index !== that.focusIndex) { 13935 that._trigger("focus", event, { item: item }); 13936 if (!that.isOpen) { 13937 that._select(item, event); 13938 } 13939 } 13940 that.focusIndex = item.index; 13941 13942 that.button.attr("aria-activedescendant", 13943 that.menuItems.eq(item.index).attr("id")); 13944 } 13945 }) 13946 .menu("instance"); 13947 13948 // Don't close the menu on mouseleave 13949 this.menuInstance._off(this.menu, "mouseleave"); 13950 13951 // Cancel the menu's collapseAll on document click 13952 this.menuInstance._closeOnDocumentClick = function () { 13953 return false; 13954 }; 13955 13956 // Selects often contain empty items, but never contain dividers 13957 this.menuInstance._isDivider = function () { 13958 return false; 13959 }; 13960 }, 13961 13962 refresh: function () { 13963 this._refreshMenu(); 13964 this.buttonItem.replaceWith( 13965 this.buttonItem = this._renderButtonItem( 13966 13967 // Fall back to an empty object in case there are no options 13968 this._getSelectedItem().data("ui-selectmenu-item") || {} 13969 ) 13970 ); 13971 if (this.options.width === null) { 13972 this._resizeButton(); 13973 } 13974 }, 13975 13976 _refreshMenu: function () { 13977 var item, 13978 options = this.element.find("option"); 13979 13980 this.menu.empty(); 13981 13982 this._parseOptions(options); 13983 this._renderMenu(this.menu, this.items); 13984 13985 this.menuInstance.refresh(); 13986 this.menuItems = this.menu.find("li") 13987 .not(".ui-selectmenu-optgroup") 13988 .find(".ui-menu-item-wrapper"); 13989 13990 this._rendered = true; 13991 13992 if (!options.length) { 13993 return; 13994 } 13995 13996 item = this._getSelectedItem(); 13997 13998 // Update the menu to have the correct item focused 13999 this.menuInstance.focus(null, item); 14000 this._setAria(item.data("ui-selectmenu-item")); 14001 14002 // Set disabled state 14003 this._setOption("disabled", this.element.prop("disabled")); 14004 }, 14005 14006 open: function (event) { 14007 if (this.options.disabled) { 14008 return; 14009 } 14010 14011 // If this is the first time the menu is being opened, render the items 14012 if (!this._rendered) { 14013 this._refreshMenu(); 14014 } else { 14015 14016 // Menu clears focus on close, reset focus to selected item 14017 this._removeClass(this.menu.find(".ui-state-active"), null, "ui-state-active"); 14018 this.menuInstance.focus(null, this._getSelectedItem()); 14019 } 14020 14021 // If there are no options, don't open the menu 14022 if (!this.menuItems.length) { 14023 return; 14024 } 14025 14026 this.isOpen = true; 14027 this._toggleAttr(); 14028 this._resizeMenu(); 14029 this._position(); 14030 14031 this._on(this.document, this._documentClick); 14032 14033 this._trigger("open", event); 14034 }, 14035 14036 _position: function () { 14037 this.menuWrap.position($.extend({ of: this.button }, this.options.position)); 14038 }, 14039 14040 close: function (event) { 14041 if (!this.isOpen) { 14042 return; 14043 } 14044 14045 this.isOpen = false; 14046 this._toggleAttr(); 14047 14048 this.range = null; 14049 this._off(this.document); 14050 14051 this._trigger("close", event); 14052 }, 14053 14054 widget: function () { 14055 return this.button; 14056 }, 14057 14058 menuWidget: function () { 14059 return this.menu; 14060 }, 14061 14062 _renderButtonItem: function (item) { 14063 var buttonItem = $("<span>"); 14064 14065 this._setText(buttonItem, item.label); 14066 this._addClass(buttonItem, "ui-selectmenu-text"); 14067 14068 return buttonItem; 14069 }, 14070 14071 _renderMenu: function (ul, items) { 14072 var that = this, 14073 currentOptgroup = ""; 14074 14075 $.each(items, function (index, item) { 14076 var li; 14077 14078 if (item.optgroup !== currentOptgroup) { 14079 li = $("<li>", { 14080 text: item.optgroup 14081 }); 14082 that._addClass(li, "ui-selectmenu-optgroup", "ui-menu-divider" + 14083 (item.element.parent("optgroup").prop("disabled") ? 14084 " ui-state-disabled" : 14085 "")); 14086 14087 li.appendTo(ul); 14088 14089 currentOptgroup = item.optgroup; 14090 } 14091 14092 that._renderItemData(ul, item); 14093 }); 14094 }, 14095 14096 _renderItemData: function (ul, item) { 14097 return this._renderItem(ul, item).data("ui-selectmenu-item", item); 14098 }, 14099 14100 _renderItem: function (ul, item) { 14101 var li = $("<li>"), 14102 wrapper = $("<div>", { 14103 title: item.element.attr("title") 14104 }); 14105 14106 if (item.disabled) { 14107 this._addClass(li, null, "ui-state-disabled"); 14108 } 14109 this._setText(wrapper, item.label); 14110 14111 return li.append(wrapper).appendTo(ul); 14112 }, 14113 14114 _setText: function (element, value) { 14115 if (value) { 14116 element.text(value); 14117 } else { 14118 element.html(" "); 14119 } 14120 }, 14121 14122 _move: function (direction, event) { 14123 var item, next, 14124 filter = ".ui-menu-item"; 14125 14126 if (this.isOpen) { 14127 item = this.menuItems.eq(this.focusIndex).parent("li"); 14128 } else { 14129 item = this.menuItems.eq(this.element[0].selectedIndex).parent("li"); 14130 filter += ":not(.ui-state-disabled)"; 14131 } 14132 14133 if (direction === "first" || direction === "last") { 14134 next = item[direction === "first" ? "prevAll" : "nextAll"](filter).eq(-1); 14135 } else { 14136 next = item[direction + "All"](filter).eq(0); 14137 } 14138 14139 if (next.length) { 14140 this.menuInstance.focus(event, next); 14141 } 14142 }, 14143 14144 _getSelectedItem: function () { 14145 return this.menuItems.eq(this.element[0].selectedIndex).parent("li"); 14146 }, 14147 14148 _toggle: function (event) { 14149 this[this.isOpen ? "close" : "open"](event); 14150 }, 14151 14152 _setSelection: function () { 14153 var selection; 14154 14155 if (!this.range) { 14156 return; 14157 } 14158 14159 if (window.getSelection) { 14160 selection = window.getSelection(); 14161 selection.removeAllRanges(); 14162 selection.addRange(this.range); 14163 14164 // Support: IE8 14165 } else { 14166 this.range.select(); 14167 } 14168 14169 // Support: IE 14170 // Setting the text selection kills the button focus in IE, but 14171 // restoring the focus doesn't kill the selection. 14172 this.button.focus(); 14173 }, 14174 14175 _documentClick: { 14176 mousedown: function (event) { 14177 if (!this.isOpen) { 14178 return; 14179 } 14180 14181 if (!$(event.target).closest(".ui-selectmenu-menu, #" + 14182 $.escapeSelector(this.ids.button)).length) { 14183 this.close(event); 14184 } 14185 } 14186 }, 14187 14188 _buttonEvents: { 14189 14190 // Prevent text selection from being reset when interacting with the selectmenu (#10144) 14191 mousedown: function () { 14192 var selection; 14193 14194 if (window.getSelection) { 14195 selection = window.getSelection(); 14196 if (selection.rangeCount) { 14197 this.range = selection.getRangeAt(0); 14198 } 14199 14200 // Support: IE8 14201 } else { 14202 this.range = document.selection.createRange(); 14203 } 14204 }, 14205 14206 click: function (event) { 14207 this._setSelection(); 14208 this._toggle(event); 14209 }, 14210 14211 keydown: function (event) { 14212 var preventDefault = true; 14213 switch (event.keyCode) { 14214 case $.ui.keyCode.TAB: 14215 case $.ui.keyCode.ESCAPE: 14216 this.close(event); 14217 preventDefault = false; 14218 break; 14219 case $.ui.keyCode.ENTER: 14220 if (this.isOpen) { 14221 this._selectFocusedItem(event); 14222 } 14223 break; 14224 case $.ui.keyCode.UP: 14225 if (event.altKey) { 14226 this._toggle(event); 14227 } else { 14228 this._move("prev", event); 14229 } 14230 break; 14231 case $.ui.keyCode.DOWN: 14232 if (event.altKey) { 14233 this._toggle(event); 14234 } else { 14235 this._move("next", event); 14236 } 14237 break; 14238 case $.ui.keyCode.SPACE: 14239 if (this.isOpen) { 14240 this._selectFocusedItem(event); 14241 } else { 14242 this._toggle(event); 14243 } 14244 break; 14245 case $.ui.keyCode.LEFT: 14246 this._move("prev", event); 14247 break; 14248 case $.ui.keyCode.RIGHT: 14249 this._move("next", event); 14250 break; 14251 case $.ui.keyCode.HOME: 14252 case $.ui.keyCode.PAGE_UP: 14253 this._move("first", event); 14254 break; 14255 case $.ui.keyCode.END: 14256 case $.ui.keyCode.PAGE_DOWN: 14257 this._move("last", event); 14258 break; 14259 default: 14260 this.menu.trigger(event); 14261 preventDefault = false; 14262 } 14263 14264 if (preventDefault) { 14265 event.preventDefault(); 14266 } 14267 } 14268 }, 14269 14270 _selectFocusedItem: function (event) { 14271 var item = this.menuItems.eq(this.focusIndex).parent("li"); 14272 if (!item.hasClass("ui-state-disabled")) { 14273 this._select(item.data("ui-selectmenu-item"), event); 14274 } 14275 }, 14276 14277 _select: function (item, event) { 14278 var oldIndex = this.element[0].selectedIndex; 14279 14280 // Change native select element 14281 this.element[0].selectedIndex = item.index; 14282 this.buttonItem.replaceWith(this.buttonItem = this._renderButtonItem(item)); 14283 this._setAria(item); 14284 this._trigger("select", event, { item: item }); 14285 14286 if (item.index !== oldIndex) { 14287 this._trigger("change", event, { item: item }); 14288 } 14289 14290 this.close(event); 14291 }, 14292 14293 _setAria: function (item) { 14294 var id = this.menuItems.eq(item.index).attr("id"); 14295 14296 this.button.attr({ 14297 "aria-labelledby": id, 14298 "aria-activedescendant": id 14299 }); 14300 this.menu.attr("aria-activedescendant", id); 14301 }, 14302 14303 _setOption: function (key, value) { 14304 if (key === "icons") { 14305 var icon = this.button.find("span.ui-icon"); 14306 this._removeClass(icon, null, this.options.icons.button) 14307 ._addClass(icon, null, value.button); 14308 } 14309 14310 this._super(key, value); 14311 14312 if (key === "appendTo") { 14313 this.menuWrap.appendTo(this._appendTo()); 14314 } 14315 14316 if (key === "width") { 14317 this._resizeButton(); 14318 } 14319 }, 14320 14321 _setOptionDisabled: function (value) { 14322 this._super(value); 14323 14324 this.menuInstance.option("disabled", value); 14325 this.button.attr("aria-disabled", value); 14326 this._toggleClass(this.button, null, "ui-state-disabled", value); 14327 14328 this.element.prop("disabled", value); 14329 if (value) { 14330 this.button.attr("tabindex", -1); 14331 this.close(); 14332 } else { 14333 this.button.attr("tabindex", 0); 14334 } 14335 }, 14336 14337 _appendTo: function () { 14338 var element = this.options.appendTo; 14339 14340 if (element) { 14341 element = element.jquery || element.nodeType ? 14342 $(element) : 14343 this.document.find(element).eq(0); 14344 } 14345 14346 if (!element || !element[0]) { 14347 element = this.element.closest(".ui-front, dialog"); 14348 } 14349 14350 if (!element.length) { 14351 element = this.document[0].body; 14352 } 14353 14354 return element; 14355 }, 14356 14357 _toggleAttr: function () { 14358 this.button.attr("aria-expanded", this.isOpen); 14359 14360 // We can't use two _toggleClass() calls here, because we need to make sure 14361 // we always remove classes first and add them second, otherwise if both classes have the 14362 // same theme class, it will be removed after we add it. 14363 this._removeClass(this.button, "ui-selectmenu-button-" + 14364 (this.isOpen ? "closed" : "open")) 14365 ._addClass(this.button, "ui-selectmenu-button-" + 14366 (this.isOpen ? "open" : "closed")) 14367 ._toggleClass(this.menuWrap, "ui-selectmenu-open", null, this.isOpen); 14368 14369 this.menu.attr("aria-hidden", !this.isOpen); 14370 }, 14371 14372 _resizeButton: function () { 14373 var width = this.options.width; 14374 14375 // For `width: false`, just remove inline style and stop 14376 if (width === false) { 14377 this.button.css("width", ""); 14378 return; 14379 } 14380 14381 // For `width: null`, match the width of the original element 14382 if (width === null) { 14383 width = this.element.show().outerWidth(); 14384 this.element.hide(); 14385 } 14386 14387 this.button.outerWidth(width); 14388 }, 14389 14390 _resizeMenu: function () { 14391 this.menu.outerWidth(Math.max( 14392 this.button.outerWidth(), 14393
vendor: 1,163 bytes, lines 14394-14448
14394 // Support: IE10 14395 // IE10 wraps long text (possibly a rounding bug) 14396 // so we add 1px to avoid the wrapping 14397 this.menu.width("").outerWidth() + 1 14398 )); 14399 }, 14400 14401 _getCreateOptions: function () { 14402 var options = this._super(); 14403 14404 options.disabled = this.element.prop("disabled"); 14405 14406 return options; 14407 }, 14408 14409 _parseOptions: function (options) { 14410 var that = this, 14411 data = []; 14412 options.each(function (index, item) { 14413 if (item.hidden) { 14414 return; 14415 } 14416 14417 data.push(that._parseOption($(item), index)); 14418 }); 14419 this.items = data; 14420 }, 14421 14422 _parseOption: function (option, index) { 14423 var optgroup = option.parent("optgroup"); 14424 14425 return { 14426 element: option, 14427 index: index, 14428 value: option.val(), 14429 label: option.text(), 14430 optgroup: optgroup.attr("label") || "", 14431 disabled: optgroup.prop("disabled") || option.prop("disabled") 14432 }; 14433 }, 14434 14435 _destroy: function () { 14436 this._unbindFormResetHandler(); 14437 this.menuWrap.remove(); 14438 this.button.remove(); 14439 this.element.show(); 14440 this.element.removeUniqueId(); 14441 this.labels.attr("for", this.ids.element); 14442 } 14443 }]); 14444 14445 14446 14447 14448});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.