17696 lines
839 KiB
JavaScript
Vendored
17696 lines
839 KiB
JavaScript
Vendored
/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
|
|
//@ sourceMappingURL=jquery.min.map
|
|
*/
|
|
(function (e, t) {
|
|
var n, r, i = typeof t, o = e.document, a = e.location, s = e.jQuery, u = e.$, l = {}, c = [], p = "1.9.1",
|
|
f = c.concat, d = c.push, h = c.slice, g = c.indexOf, m = l.toString, y = l.hasOwnProperty, v = p.trim,
|
|
b = function (e, t) {
|
|
return new b.fn.init(e, t, r)
|
|
}, x = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, w = /\S+/g, T = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
|
|
N = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/, C = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, k = /^[\],:{}\s]*$/,
|
|
E = /(?:^|:|,)(?:\s*\[)+/g, S = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
|
|
A = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, j = /^-ms-/, D = /-([\da-z])/gi,
|
|
L = function (e, t) {
|
|
return t.toUpperCase()
|
|
}, H = function (e) {
|
|
(o.addEventListener || "load" === e.type || "complete" === o.readyState) && (q(), b.ready())
|
|
}, q = function () {
|
|
o.addEventListener ? (o.removeEventListener("DOMContentLoaded", H, !1), e.removeEventListener("load", H, !1)) : (o.detachEvent("onreadystatechange", H), e.detachEvent("onload", H))
|
|
};
|
|
b.fn = b.prototype = {
|
|
jquery: p, constructor: b, init: function (e, n, r) {
|
|
var i, a;
|
|
if (!e) return this;
|
|
if ("string" == typeof e) {
|
|
if (i = "<" === e.charAt(0) && ">" === e.charAt(e.length - 1) && e.length >= 3 ? [null, e, null] : N.exec(e), !i || !i[1] && n) return !n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e);
|
|
if (i[1]) {
|
|
if (n = n instanceof b ? n[0] : n, b.merge(this, b.parseHTML(i[1], n && n.nodeType ? n.ownerDocument || n : o, !0)), C.test(i[1]) && b.isPlainObject(n)) for (i in n) b.isFunction(this[i]) ? this[i](n[i]) : this.attr(i, n[i]);
|
|
return this
|
|
}
|
|
if (a = o.getElementById(i[2]), a && a.parentNode) {
|
|
if (a.id !== i[2]) return r.find(e);
|
|
this.length = 1, this[0] = a
|
|
}
|
|
return this.context = o, this.selector = e, this
|
|
}
|
|
return e.nodeType ? (this.context = this[0] = e, this.length = 1, this) : b.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, this.context = e.context), b.makeArray(e, this))
|
|
}, selector: "", length: 0, size: function () {
|
|
return this.length
|
|
}, toArray: function () {
|
|
return h.call(this)
|
|
}, get: function (e) {
|
|
return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e]
|
|
}, pushStack: function (e) {
|
|
var t = b.merge(this.constructor(), e);
|
|
return t.prevObject = this, t.context = this.context, t
|
|
}, each: function (e, t) {
|
|
return b.each(this, e, t)
|
|
}, ready: function (e) {
|
|
return b.ready.promise().done(e), this
|
|
}, slice: function () {
|
|
return this.pushStack(h.apply(this, arguments))
|
|
}, first: function () {
|
|
return this.eq(0)
|
|
}, last: function () {
|
|
return this.eq(-1)
|
|
}, eq: function (e) {
|
|
var t = this.length, n = +e + (0 > e ? t : 0);
|
|
return this.pushStack(n >= 0 && t > n ? [this[n]] : [])
|
|
}, map: function (e) {
|
|
return this.pushStack(b.map(this, function (t, n) {
|
|
return e.call(t, n, t)
|
|
}))
|
|
}, end: function () {
|
|
return this.prevObject || this.constructor(null)
|
|
}, push: d, sort: [].sort, splice: [].splice
|
|
}, b.fn.init.prototype = b.fn, b.extend = b.fn.extend = function () {
|
|
var e, n, r, i, o, a, s = arguments[0] || {}, u = 1, l = arguments.length, c = !1;
|
|
for ("boolean" == typeof s && (c = s, s = arguments[1] || {}, u = 2), "object" == typeof s || b.isFunction(s) || (s = {}), l === u && (s = this, --u); l > u; u++) if (null != (o = arguments[u])) for (i in o) e = s[i], r = o[i], s !== r && (c && r && (b.isPlainObject(r) || (n = b.isArray(r))) ? (n ? (n = !1, a = e && b.isArray(e) ? e : []) : a = e && b.isPlainObject(e) ? e : {}, s[i] = b.extend(c, a, r)) : r !== t && (s[i] = r));
|
|
return s
|
|
}, b.extend({
|
|
noConflict: function (t) {
|
|
return e.$ === b && (e.$ = u), t && e.jQuery === b && (e.jQuery = s), b
|
|
}, isReady: !1, readyWait: 1, holdReady: function (e) {
|
|
e ? b.readyWait++ : b.ready(!0)
|
|
}, ready: function (e) {
|
|
if (e === !0 ? !--b.readyWait : !b.isReady) {
|
|
if (!o.body) return setTimeout(b.ready);
|
|
b.isReady = !0, e !== !0 && --b.readyWait > 0 || (n.resolveWith(o, [b]), b.fn.trigger && b(o).trigger("ready").off("ready"))
|
|
}
|
|
}, isFunction: function (e) {
|
|
return "function" === b.type(e)
|
|
}, isArray: Array.isArray || function (e) {
|
|
return "array" === b.type(e)
|
|
}, isWindow: function (e) {
|
|
return null != e && e == e.window
|
|
}, isNumeric: function (e) {
|
|
return !isNaN(parseFloat(e)) && isFinite(e)
|
|
}, type: function (e) {
|
|
return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[m.call(e)] || "object" : typeof e
|
|
}, isPlainObject: function (e) {
|
|
if (!e || "object" !== b.type(e) || e.nodeType || b.isWindow(e)) return !1;
|
|
try {
|
|
if (e.constructor && !y.call(e, "constructor") && !y.call(e.constructor.prototype, "isPrototypeOf")) return !1
|
|
} catch (n) {
|
|
return !1
|
|
}
|
|
var r;
|
|
for (r in e) ;
|
|
return r === t || y.call(e, r)
|
|
}, isEmptyObject: function (e) {
|
|
var t;
|
|
for (t in e) return !1;
|
|
return !0
|
|
}, error: function (e) {
|
|
throw Error(e)
|
|
}, parseHTML: function (e, t, n) {
|
|
if (!e || "string" != typeof e) return null;
|
|
"boolean" == typeof t && (n = t, t = !1), t = t || o;
|
|
var r = C.exec(e), i = !n && [];
|
|
return r ? [t.createElement(r[1])] : (r = b.buildFragment([e], t, i), i && b(i).remove(), b.merge([], r.childNodes))
|
|
}, parseJSON: function (n) {
|
|
return e.JSON && e.JSON.parse ? e.JSON.parse(n) : null === n ? n : "string" == typeof n && (n = b.trim(n), n && k.test(n.replace(S, "@").replace(A, "]").replace(E, ""))) ? Function("return " + n)() : (b.error("Invalid JSON: " + n), t)
|
|
}, parseXML: function (n) {
|
|
var r, i;
|
|
if (!n || "string" != typeof n) return null;
|
|
try {
|
|
e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n))
|
|
} catch (o) {
|
|
r = t
|
|
}
|
|
return r && r.documentElement && !r.getElementsByTagName("parsererror").length || b.error("Invalid XML: " + n), r
|
|
}, noop: function () {
|
|
}, globalEval: function (t) {
|
|
t && b.trim(t) && (e.execScript || function (t) {
|
|
e.eval.call(e, t)
|
|
})(t)
|
|
}, camelCase: function (e) {
|
|
return e.replace(j, "ms-").replace(D, L)
|
|
}, nodeName: function (e, t) {
|
|
return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
|
|
}, each: function (e, t, n) {
|
|
var r, i = 0, o = e.length, a = M(e);
|
|
if (n) {
|
|
if (a) {
|
|
for (; o > i; i++) if (r = t.apply(e[i], n), r === !1) break
|
|
} else for (i in e) if (r = t.apply(e[i], n), r === !1) break
|
|
} else if (a) {
|
|
for (; o > i; i++) if (r = t.call(e[i], i, e[i]), r === !1) break
|
|
} else for (i in e) if (r = t.call(e[i], i, e[i]), r === !1) break;
|
|
return e
|
|
}, trim: v && !v.call("\ufeff\u00a0") ? function (e) {
|
|
return null == e ? "" : v.call(e)
|
|
} : function (e) {
|
|
return null == e ? "" : (e + "").replace(T, "")
|
|
}, makeArray: function (e, t) {
|
|
var n = t || [];
|
|
return null != e && (M(Object(e)) ? b.merge(n, "string" == typeof e ? [e] : e) : d.call(n, e)), n
|
|
}, inArray: function (e, t, n) {
|
|
var r;
|
|
if (t) {
|
|
if (g) return g.call(t, e, n);
|
|
for (r = t.length, n = n ? 0 > n ? Math.max(0, r + n) : n : 0; r > n; n++) if (n in t && t[n] === e) return n
|
|
}
|
|
return -1
|
|
}, merge: function (e, n) {
|
|
var r = n.length, i = e.length, o = 0;
|
|
if ("number" == typeof r) for (; r > o; o++) e[i++] = n[o]; else while (n[o] !== t) e[i++] = n[o++];
|
|
return e.length = i, e
|
|
}, grep: function (e, t, n) {
|
|
var r, i = [], o = 0, a = e.length;
|
|
for (n = !!n; a > o; o++) r = !!t(e[o], o), n !== r && i.push(e[o]);
|
|
return i
|
|
}, map: function (e, t, n) {
|
|
var r, i = 0, o = e.length, a = M(e), s = [];
|
|
if (a) for (; o > i; i++) r = t(e[i], i, n), null != r && (s[s.length] = r); else for (i in e) r = t(e[i], i, n), null != r && (s[s.length] = r);
|
|
return f.apply([], s)
|
|
}, guid: 1, proxy: function (e, n) {
|
|
var r, i, o;
|
|
return "string" == typeof n && (o = e[n], n = e, e = o), b.isFunction(e) ? (r = h.call(arguments, 2), i = function () {
|
|
return e.apply(n || this, r.concat(h.call(arguments)))
|
|
}, i.guid = e.guid = e.guid || b.guid++, i) : t
|
|
}, access: function (e, n, r, i, o, a, s) {
|
|
var u = 0, l = e.length, c = null == r;
|
|
if ("object" === b.type(r)) {
|
|
o = !0;
|
|
for (u in r) b.access(e, n, u, r[u], !0, a, s)
|
|
} else if (i !== t && (o = !0, b.isFunction(i) || (s = !0), c && (s ? (n.call(e, i), n = null) : (c = n, n = function (e, t, n) {
|
|
return c.call(b(e), n)
|
|
})), n)) for (; l > u; u++) n(e[u], r, s ? i : i.call(e[u], u, n(e[u], r)));
|
|
return o ? e : c ? n.call(e) : l ? n(e[0], r) : a
|
|
}, now: function () {
|
|
return (new Date).getTime()
|
|
}
|
|
}), b.ready.promise = function (t) {
|
|
if (!n) if (n = b.Deferred(), "complete" === o.readyState) setTimeout(b.ready); else if (o.addEventListener) o.addEventListener("DOMContentLoaded", H, !1), e.addEventListener("load", H, !1); else {
|
|
o.attachEvent("onreadystatechange", H), e.attachEvent("onload", H);
|
|
var r = !1;
|
|
try {
|
|
r = null == e.frameElement && o.documentElement
|
|
} catch (i) {
|
|
}
|
|
r && r.doScroll && function a() {
|
|
if (!b.isReady) {
|
|
try {
|
|
r.doScroll("left")
|
|
} catch (e) {
|
|
return setTimeout(a, 50)
|
|
}
|
|
q(), b.ready()
|
|
}
|
|
}()
|
|
}
|
|
return n.promise(t)
|
|
}, b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (e, t) {
|
|
l["[object " + t + "]"] = t.toLowerCase()
|
|
});
|
|
|
|
function M(e) {
|
|
var t = e.length, n = b.type(e);
|
|
return b.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e)
|
|
}
|
|
|
|
r = b(o);
|
|
var _ = {};
|
|
|
|
function F(e) {
|
|
var t = _[e] = {};
|
|
return b.each(e.match(w) || [], function (e, n) {
|
|
t[n] = !0
|
|
}), t
|
|
}
|
|
|
|
b.Callbacks = function (e) {
|
|
e = "string" == typeof e ? _[e] || F(e) : b.extend({}, e);
|
|
var n, r, i, o, a, s, u = [], l = !e.once && [], c = function (t) {
|
|
for (r = e.memory && t, i = !0, a = s || 0, s = 0, o = u.length, n = !0; u && o > a; a++) if (u[a].apply(t[0], t[1]) === !1 && e.stopOnFalse) {
|
|
r = !1;
|
|
break
|
|
}
|
|
n = !1, u && (l ? l.length && c(l.shift()) : r ? u = [] : p.disable())
|
|
}, p = {
|
|
add: function () {
|
|
if (u) {
|
|
var t = u.length;
|
|
(function i(t) {
|
|
b.each(t, function (t, n) {
|
|
var r = b.type(n);
|
|
"function" === r ? e.unique && p.has(n) || u.push(n) : n && n.length && "string" !== r && i(n)
|
|
})
|
|
})(arguments), n ? o = u.length : r && (s = t, c(r))
|
|
}
|
|
return this
|
|
}, remove: function () {
|
|
return u && b.each(arguments, function (e, t) {
|
|
var r;
|
|
while ((r = b.inArray(t, u, r)) > -1) u.splice(r, 1), n && (o >= r && o--, a >= r && a--)
|
|
}), this
|
|
}, has: function (e) {
|
|
return e ? b.inArray(e, u) > -1 : !(!u || !u.length)
|
|
}, empty: function () {
|
|
return u = [], this
|
|
}, disable: function () {
|
|
return u = l = r = t, this
|
|
}, disabled: function () {
|
|
return !u
|
|
}, lock: function () {
|
|
return l = t, r || p.disable(), this
|
|
}, locked: function () {
|
|
return !l
|
|
}, fireWith: function (e, t) {
|
|
return t = t || [], t = [e, t.slice ? t.slice() : t], !u || i && !l || (n ? l.push(t) : c(t)), this
|
|
}, fire: function () {
|
|
return p.fireWith(this, arguments), this
|
|
}, fired: function () {
|
|
return !!i
|
|
}
|
|
};
|
|
return p
|
|
}, b.extend({
|
|
Deferred: function (e) {
|
|
var t = [["resolve", "done", b.Callbacks("once memory"), "resolved"], ["reject", "fail", b.Callbacks("once memory"), "rejected"], ["notify", "progress", b.Callbacks("memory")]],
|
|
n = "pending", r = {
|
|
state: function () {
|
|
return n
|
|
}, always: function () {
|
|
return i.done(arguments).fail(arguments), this
|
|
}, then: function () {
|
|
var e = arguments;
|
|
return b.Deferred(function (n) {
|
|
b.each(t, function (t, o) {
|
|
var a = o[0], s = b.isFunction(e[t]) && e[t];
|
|
i[o[1]](function () {
|
|
var e = s && s.apply(this, arguments);
|
|
e && b.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[a + "With"](this === r ? n.promise() : this, s ? [e] : arguments)
|
|
})
|
|
}), e = null
|
|
}).promise()
|
|
}, promise: function (e) {
|
|
return null != e ? b.extend(e, r) : r
|
|
}
|
|
}, i = {};
|
|
return r.pipe = r.then, b.each(t, function (e, o) {
|
|
var a = o[2], s = o[3];
|
|
r[o[1]] = a.add, s && a.add(function () {
|
|
n = s
|
|
}, t[1 ^ e][2].disable, t[2][2].lock), i[o[0]] = function () {
|
|
return i[o[0] + "With"](this === i ? r : this, arguments), this
|
|
}, i[o[0] + "With"] = a.fireWith
|
|
}), r.promise(i), e && e.call(i, i), i
|
|
}, when: function (e) {
|
|
var t = 0, n = h.call(arguments), r = n.length, i = 1 !== r || e && b.isFunction(e.promise) ? r : 0,
|
|
o = 1 === i ? e : b.Deferred(), a = function (e, t, n) {
|
|
return function (r) {
|
|
t[e] = this, n[e] = arguments.length > 1 ? h.call(arguments) : r, n === s ? o.notifyWith(t, n) : --i || o.resolveWith(t, n)
|
|
}
|
|
}, s, u, l;
|
|
if (r > 1) for (s = Array(r), u = Array(r), l = Array(r); r > t; t++) n[t] && b.isFunction(n[t].promise) ? n[t].promise().done(a(t, l, n)).fail(o.reject).progress(a(t, u, s)) : --i;
|
|
return i || o.resolveWith(l, n), o.promise()
|
|
}
|
|
}), b.support = function () {
|
|
var t, n, r, a, s, u, l, c, p, f, d = o.createElement("div");
|
|
if (d.setAttribute("className", "t"), d.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>", n = d.getElementsByTagName("*"), r = d.getElementsByTagName("a")[0], !n || !r || !n.length) return {};
|
|
s = o.createElement("select"), l = s.appendChild(o.createElement("option")), a = d.getElementsByTagName("input")[0], r.style.cssText = "top:1px;float:left;opacity:.5", t = {
|
|
getSetAttribute: "t" !== d.className,
|
|
leadingWhitespace: 3 === d.firstChild.nodeType,
|
|
tbody: !d.getElementsByTagName("tbody").length,
|
|
htmlSerialize: !!d.getElementsByTagName("link").length,
|
|
style: /top/.test(r.getAttribute("style")),
|
|
hrefNormalized: "/a" === r.getAttribute("href"),
|
|
opacity: /^0.5/.test(r.style.opacity),
|
|
cssFloat: !!r.style.cssFloat,
|
|
checkOn: !!a.value,
|
|
optSelected: l.selected,
|
|
enctype: !!o.createElement("form").enctype,
|
|
html5Clone: "<:nav></:nav>" !== o.createElement("nav").cloneNode(!0).outerHTML,
|
|
boxModel: "CSS1Compat" === o.compatMode,
|
|
deleteExpando: !0,
|
|
noCloneEvent: !0,
|
|
inlineBlockNeedsLayout: !1,
|
|
shrinkWrapBlocks: !1,
|
|
reliableMarginRight: !0,
|
|
boxSizingReliable: !0,
|
|
pixelPosition: !1
|
|
}, a.checked = !0, t.noCloneChecked = a.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !l.disabled;
|
|
try {
|
|
delete d.test
|
|
} catch (h) {
|
|
t.deleteExpando = !1
|
|
}
|
|
a = o.createElement("input"), a.setAttribute("value", ""), t.input = "" === a.getAttribute("value"), a.value = "t", a.setAttribute("type", "radio"), t.radioValue = "t" === a.value, a.setAttribute("checked", "t"), a.setAttribute("name", "t"), u = o.createDocumentFragment(), u.appendChild(a), t.appendChecked = a.checked, t.checkClone = u.cloneNode(!0).cloneNode(!0).lastChild.checked, d.attachEvent && (d.attachEvent("onclick", function () {
|
|
t.noCloneEvent = !1
|
|
}), d.cloneNode(!0).click());
|
|
for (f in{
|
|
submit: !0,
|
|
change: !0,
|
|
focusin: !0
|
|
}) d.setAttribute(c = "on" + f, "t"), t[f + "Bubbles"] = c in e || d.attributes[c].expando === !1;
|
|
return d.style.backgroundClip = "content-box", d.cloneNode(!0).style.backgroundClip = "", t.clearCloneStyle = "content-box" === d.style.backgroundClip, b(function () {
|
|
var n, r, a,
|
|
s = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
|
|
u = o.getElementsByTagName("body")[0];
|
|
u && (n = o.createElement("div"), n.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", u.appendChild(n).appendChild(d), d.innerHTML = "<table><tr><td></td><td>t</td></tr></table>", a = d.getElementsByTagName("td"), a[0].style.cssText = "padding:0;margin:0;border:0;display:none", p = 0 === a[0].offsetHeight, a[0].style.display = "", a[1].style.display = "none", t.reliableHiddenOffsets = p && 0 === a[0].offsetHeight, d.innerHTML = "", d.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", t.boxSizing = 4 === d.offsetWidth, t.doesNotIncludeMarginInBodyOffset = 1 !== u.offsetTop, e.getComputedStyle && (t.pixelPosition = "1%" !== (e.getComputedStyle(d, null) || {}).top, t.boxSizingReliable = "4px" === (e.getComputedStyle(d, null) || {width: "4px"}).width, r = d.appendChild(o.createElement("div")), r.style.cssText = d.style.cssText = s, r.style.marginRight = r.style.width = "0", d.style.width = "1px", t.reliableMarginRight = !parseFloat((e.getComputedStyle(r, null) || {}).marginRight)), typeof d.style.zoom !== i && (d.innerHTML = "", d.style.cssText = s + "width:1px;padding:1px;display:inline;zoom:1", t.inlineBlockNeedsLayout = 3 === d.offsetWidth, d.style.display = "block", d.innerHTML = "<div></div>", d.firstChild.style.width = "5px", t.shrinkWrapBlocks = 3 !== d.offsetWidth, t.inlineBlockNeedsLayout && (u.style.zoom = 1)), u.removeChild(n), n = d = a = r = null)
|
|
}), n = s = u = l = r = a = null, t
|
|
}();
|
|
var O = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, B = /([A-Z])/g;
|
|
|
|
function P(e, n, r, i) {
|
|
if (b.acceptData(e)) {
|
|
var o, a, s = b.expando, u = "string" == typeof n, l = e.nodeType, p = l ? b.cache : e,
|
|
f = l ? e[s] : e[s] && s;
|
|
if (f && p[f] && (i || p[f].data) || !u || r !== t) return f || (l ? e[s] = f = c.pop() || b.guid++ : f = s), p[f] || (p[f] = {}, l || (p[f].toJSON = b.noop)), ("object" == typeof n || "function" == typeof n) && (i ? p[f] = b.extend(p[f], n) : p[f].data = b.extend(p[f].data, n)), o = p[f], i || (o.data || (o.data = {}), o = o.data), r !== t && (o[b.camelCase(n)] = r), u ? (a = o[n], null == a && (a = o[b.camelCase(n)])) : a = o, a
|
|
}
|
|
}
|
|
|
|
function R(e, t, n) {
|
|
if (b.acceptData(e)) {
|
|
var r, i, o, a = e.nodeType, s = a ? b.cache : e, u = a ? e[b.expando] : b.expando;
|
|
if (s[u]) {
|
|
if (t && (o = n ? s[u] : s[u].data)) {
|
|
b.isArray(t) ? t = t.concat(b.map(t, b.camelCase)) : t in o ? t = [t] : (t = b.camelCase(t), t = t in o ? [t] : t.split(" "));
|
|
for (r = 0, i = t.length; i > r; r++) delete o[t[r]];
|
|
if (!(n ? $ : b.isEmptyObject)(o)) return
|
|
}
|
|
(n || (delete s[u].data, $(s[u]))) && (a ? b.cleanData([e], !0) : b.support.deleteExpando || s != s.window ? delete s[u] : s[u] = null)
|
|
}
|
|
}
|
|
}
|
|
|
|
b.extend({
|
|
cache: {},
|
|
expando: "jQuery" + (p + Math.random()).replace(/\D/g, ""),
|
|
noData: {embed: !0, object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet: !0},
|
|
hasData: function (e) {
|
|
return e = e.nodeType ? b.cache[e[b.expando]] : e[b.expando], !!e && !$(e)
|
|
},
|
|
data: function (e, t, n) {
|
|
return P(e, t, n)
|
|
},
|
|
removeData: function (e, t) {
|
|
return R(e, t)
|
|
},
|
|
_data: function (e, t, n) {
|
|
return P(e, t, n, !0)
|
|
},
|
|
_removeData: function (e, t) {
|
|
return R(e, t, !0)
|
|
},
|
|
acceptData: function (e) {
|
|
if (e.nodeType && 1 !== e.nodeType && 9 !== e.nodeType) return !1;
|
|
var t = e.nodeName && b.noData[e.nodeName.toLowerCase()];
|
|
return !t || t !== !0 && e.getAttribute("classid") === t
|
|
}
|
|
}), b.fn.extend({
|
|
data: function (e, n) {
|
|
var r, i, o = this[0], a = 0, s = null;
|
|
if (e === t) {
|
|
if (this.length && (s = b.data(o), 1 === o.nodeType && !b._data(o, "parsedAttrs"))) {
|
|
for (r = o.attributes; r.length > a; a++) i = r[a].name, i.indexOf("data-") || (i = b.camelCase(i.slice(5)), W(o, i, s[i]));
|
|
b._data(o, "parsedAttrs", !0)
|
|
}
|
|
return s
|
|
}
|
|
return "object" == typeof e ? this.each(function () {
|
|
b.data(this, e)
|
|
}) : b.access(this, function (n) {
|
|
return n === t ? o ? W(o, e, b.data(o, e)) : null : (this.each(function () {
|
|
b.data(this, e, n)
|
|
}), t)
|
|
}, null, n, arguments.length > 1, null, !0)
|
|
}, removeData: function (e) {
|
|
return this.each(function () {
|
|
b.removeData(this, e)
|
|
})
|
|
}
|
|
});
|
|
|
|
function W(e, n, r) {
|
|
if (r === t && 1 === e.nodeType) {
|
|
var i = "data-" + n.replace(B, "-$1").toLowerCase();
|
|
if (r = e.getAttribute(i), "string" == typeof r) {
|
|
try {
|
|
r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : O.test(r) ? b.parseJSON(r) : r
|
|
} catch (o) {
|
|
}
|
|
b.data(e, n, r)
|
|
} else r = t
|
|
}
|
|
return r
|
|
}
|
|
|
|
function $(e) {
|
|
var t;
|
|
for (t in e) if (("data" !== t || !b.isEmptyObject(e[t])) && "toJSON" !== t) return !1;
|
|
return !0
|
|
}
|
|
|
|
b.extend({
|
|
queue: function (e, n, r) {
|
|
var i;
|
|
return e ? (n = (n || "fx") + "queue", i = b._data(e, n), r && (!i || b.isArray(r) ? i = b._data(e, n, b.makeArray(r)) : i.push(r)), i || []) : t
|
|
}, dequeue: function (e, t) {
|
|
t = t || "fx";
|
|
var n = b.queue(e, t), r = n.length, i = n.shift(), o = b._queueHooks(e, t), a = function () {
|
|
b.dequeue(e, t)
|
|
};
|
|
"inprogress" === i && (i = n.shift(), r--), o.cur = i, i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, a, o)), !r && o && o.empty.fire()
|
|
}, _queueHooks: function (e, t) {
|
|
var n = t + "queueHooks";
|
|
return b._data(e, n) || b._data(e, n, {
|
|
empty: b.Callbacks("once memory").add(function () {
|
|
b._removeData(e, t + "queue"), b._removeData(e, n)
|
|
})
|
|
})
|
|
}
|
|
}), b.fn.extend({
|
|
queue: function (e, n) {
|
|
var r = 2;
|
|
return "string" != typeof e && (n = e, e = "fx", r--), r > arguments.length ? b.queue(this[0], e) : n === t ? this : this.each(function () {
|
|
var t = b.queue(this, e, n);
|
|
b._queueHooks(this, e), "fx" === e && "inprogress" !== t[0] && b.dequeue(this, e)
|
|
})
|
|
}, dequeue: function (e) {
|
|
return this.each(function () {
|
|
b.dequeue(this, e)
|
|
})
|
|
}, delay: function (e, t) {
|
|
return e = b.fx ? b.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function (t, n) {
|
|
var r = setTimeout(t, e);
|
|
n.stop = function () {
|
|
clearTimeout(r)
|
|
}
|
|
})
|
|
}, clearQueue: function (e) {
|
|
return this.queue(e || "fx", [])
|
|
}, promise: function (e, n) {
|
|
var r, i = 1, o = b.Deferred(), a = this, s = this.length, u = function () {
|
|
--i || o.resolveWith(a, [a])
|
|
};
|
|
"string" != typeof e && (n = e, e = t), e = e || "fx";
|
|
while (s--) r = b._data(a[s], e + "queueHooks"), r && r.empty && (i++, r.empty.add(u));
|
|
return u(), o.promise(n)
|
|
}
|
|
});
|
|
var I, z, X = /[\t\r\n]/g, U = /\r/g, V = /^(?:input|select|textarea|button|object)$/i, Y = /^(?:a|area)$/i,
|
|
J = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
|
|
G = /^(?:checked|selected)$/i, Q = b.support.getSetAttribute, K = b.support.input;
|
|
b.fn.extend({
|
|
attr: function (e, t) {
|
|
return b.access(this, b.attr, e, t, arguments.length > 1)
|
|
}, removeAttr: function (e) {
|
|
return this.each(function () {
|
|
b.removeAttr(this, e)
|
|
})
|
|
}, prop: function (e, t) {
|
|
return b.access(this, b.prop, e, t, arguments.length > 1)
|
|
}, removeProp: function (e) {
|
|
return e = b.propFix[e] || e, this.each(function () {
|
|
try {
|
|
this[e] = t, delete this[e]
|
|
} catch (n) {
|
|
}
|
|
})
|
|
}, addClass: function (e) {
|
|
var t, n, r, i, o, a = 0, s = this.length, u = "string" == typeof e && e;
|
|
if (b.isFunction(e)) return this.each(function (t) {
|
|
b(this).addClass(e.call(this, t, this.className))
|
|
});
|
|
if (u) for (t = (e || "").match(w) || []; s > a; a++) if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : " ")) {
|
|
o = 0;
|
|
while (i = t[o++]) 0 > r.indexOf(" " + i + " ") && (r += i + " ");
|
|
n.className = b.trim(r)
|
|
}
|
|
return this
|
|
}, removeClass: function (e) {
|
|
var t, n, r, i, o, a = 0, s = this.length, u = 0 === arguments.length || "string" == typeof e && e;
|
|
if (b.isFunction(e)) return this.each(function (t) {
|
|
b(this).removeClass(e.call(this, t, this.className))
|
|
});
|
|
if (u) for (t = (e || "").match(w) || []; s > a; a++) if (n = this[a], r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(X, " ") : "")) {
|
|
o = 0;
|
|
while (i = t[o++]) while (r.indexOf(" " + i + " ") >= 0) r = r.replace(" " + i + " ", " ");
|
|
n.className = e ? b.trim(r) : ""
|
|
}
|
|
return this
|
|
}, toggleClass: function (e, t) {
|
|
var n = typeof e, r = "boolean" == typeof t;
|
|
return b.isFunction(e) ? this.each(function (n) {
|
|
b(this).toggleClass(e.call(this, n, this.className, t), t)
|
|
}) : this.each(function () {
|
|
if ("string" === n) {
|
|
var o, a = 0, s = b(this), u = t, l = e.match(w) || [];
|
|
while (o = l[a++]) u = r ? u : !s.hasClass(o), s[u ? "addClass" : "removeClass"](o)
|
|
} else (n === i || "boolean" === n) && (this.className && b._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : b._data(this, "__className__") || "")
|
|
})
|
|
}, hasClass: function (e) {
|
|
var t = " " + e + " ", n = 0, r = this.length;
|
|
for (; r > n; n++) if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(X, " ").indexOf(t) >= 0) return !0;
|
|
return !1
|
|
}, val: function (e) {
|
|
var n, r, i, o = this[0];
|
|
{
|
|
if (arguments.length) return i = b.isFunction(e), this.each(function (n) {
|
|
var o, a = b(this);
|
|
1 === this.nodeType && (o = i ? e.call(this, n, a.val()) : e, null == o ? o = "" : "number" == typeof o ? o += "" : b.isArray(o) && (o = b.map(o, function (e) {
|
|
return null == e ? "" : e + ""
|
|
})), r = b.valHooks[this.type] || b.valHooks[this.nodeName.toLowerCase()], r && "set" in r && r.set(this, o, "value") !== t || (this.value = o))
|
|
});
|
|
if (o) return r = b.valHooks[o.type] || b.valHooks[o.nodeName.toLowerCase()], r && "get" in r && (n = r.get(o, "value")) !== t ? n : (n = o.value, "string" == typeof n ? n.replace(U, "") : null == n ? "" : n)
|
|
}
|
|
}
|
|
}), b.extend({
|
|
valHooks: {
|
|
option: {
|
|
get: function (e) {
|
|
var t = e.attributes.value;
|
|
return !t || t.specified ? e.value : e.text
|
|
}
|
|
}, select: {
|
|
get: function (e) {
|
|
var t, n, r = e.options, i = e.selectedIndex, o = "select-one" === e.type || 0 > i,
|
|
a = o ? null : [], s = o ? i + 1 : r.length, u = 0 > i ? s : o ? i : 0;
|
|
for (; s > u; u++) if (n = r[u], !(!n.selected && u !== i || (b.support.optDisabled ? n.disabled : null !== n.getAttribute("disabled")) || n.parentNode.disabled && b.nodeName(n.parentNode, "optgroup"))) {
|
|
if (t = b(n).val(), o) return t;
|
|
a.push(t)
|
|
}
|
|
return a
|
|
}, set: function (e, t) {
|
|
var n = b.makeArray(t);
|
|
return b(e).find("option").each(function () {
|
|
this.selected = b.inArray(b(this).val(), n) >= 0
|
|
}), n.length || (e.selectedIndex = -1), n
|
|
}
|
|
}
|
|
},
|
|
attr: function (e, n, r) {
|
|
var o, a, s, u = e.nodeType;
|
|
if (e && 3 !== u && 8 !== u && 2 !== u) return typeof e.getAttribute === i ? b.prop(e, n, r) : (a = 1 !== u || !b.isXMLDoc(e), a && (n = n.toLowerCase(), o = b.attrHooks[n] || (J.test(n) ? z : I)), r === t ? o && a && "get" in o && null !== (s = o.get(e, n)) ? s : (typeof e.getAttribute !== i && (s = e.getAttribute(n)), null == s ? t : s) : null !== r ? o && a && "set" in o && (s = o.set(e, r, n)) !== t ? s : (e.setAttribute(n, r + ""), r) : (b.removeAttr(e, n), t))
|
|
},
|
|
removeAttr: function (e, t) {
|
|
var n, r, i = 0, o = t && t.match(w);
|
|
if (o && 1 === e.nodeType) while (n = o[i++]) r = b.propFix[n] || n, J.test(n) ? !Q && G.test(n) ? e[b.camelCase("default-" + n)] = e[r] = !1 : e[r] = !1 : b.attr(e, n, ""), e.removeAttribute(Q ? n : r)
|
|
},
|
|
attrHooks: {
|
|
type: {
|
|
set: function (e, t) {
|
|
if (!b.support.radioValue && "radio" === t && b.nodeName(e, "input")) {
|
|
var n = e.value;
|
|
return e.setAttribute("type", t), n && (e.value = n), t
|
|
}
|
|
}
|
|
}
|
|
},
|
|
propFix: {
|
|
tabindex: "tabIndex",
|
|
readonly: "readOnly",
|
|
"for": "htmlFor",
|
|
"class": "className",
|
|
maxlength: "maxLength",
|
|
cellspacing: "cellSpacing",
|
|
cellpadding: "cellPadding",
|
|
rowspan: "rowSpan",
|
|
colspan: "colSpan",
|
|
usemap: "useMap",
|
|
frameborder: "frameBorder",
|
|
contenteditable: "contentEditable"
|
|
},
|
|
prop: function (e, n, r) {
|
|
var i, o, a, s = e.nodeType;
|
|
if (e && 3 !== s && 8 !== s && 2 !== s) return a = 1 !== s || !b.isXMLDoc(e), a && (n = b.propFix[n] || n, o = b.propHooks[n]), r !== t ? o && "set" in o && (i = o.set(e, r, n)) !== t ? i : e[n] = r : o && "get" in o && null !== (i = o.get(e, n)) ? i : e[n]
|
|
},
|
|
propHooks: {
|
|
tabIndex: {
|
|
get: function (e) {
|
|
var n = e.getAttributeNode("tabindex");
|
|
return n && n.specified ? parseInt(n.value, 10) : V.test(e.nodeName) || Y.test(e.nodeName) && e.href ? 0 : t
|
|
}
|
|
}
|
|
}
|
|
}), z = {
|
|
get: function (e, n) {
|
|
var r = b.prop(e, n), i = "boolean" == typeof r && e.getAttribute(n),
|
|
o = "boolean" == typeof r ? K && Q ? null != i : G.test(n) ? e[b.camelCase("default-" + n)] : !!i : e.getAttributeNode(n);
|
|
return o && o.value !== !1 ? n.toLowerCase() : t
|
|
}, set: function (e, t, n) {
|
|
return t === !1 ? b.removeAttr(e, n) : K && Q || !G.test(n) ? e.setAttribute(!Q && b.propFix[n] || n, n) : e[b.camelCase("default-" + n)] = e[n] = !0, n
|
|
}
|
|
}, K && Q || (b.attrHooks.value = {
|
|
get: function (e, n) {
|
|
var r = e.getAttributeNode(n);
|
|
return b.nodeName(e, "input") ? e.defaultValue : r && r.specified ? r.value : t
|
|
}, set: function (e, n, r) {
|
|
return b.nodeName(e, "input") ? (e.defaultValue = n, t) : I && I.set(e, n, r)
|
|
}
|
|
}), Q || (I = b.valHooks.button = {
|
|
get: function (e, n) {
|
|
var r = e.getAttributeNode(n);
|
|
return r && ("id" === n || "name" === n || "coords" === n ? "" !== r.value : r.specified) ? r.value : t
|
|
}, set: function (e, n, r) {
|
|
var i = e.getAttributeNode(r);
|
|
return i || e.setAttributeNode(i = e.ownerDocument.createAttribute(r)), i.value = n += "", "value" === r || n === e.getAttribute(r) ? n : t
|
|
}
|
|
}, b.attrHooks.contenteditable = {
|
|
get: I.get, set: function (e, t, n) {
|
|
I.set(e, "" === t ? !1 : t, n)
|
|
}
|
|
}, b.each(["width", "height"], function (e, n) {
|
|
b.attrHooks[n] = b.extend(b.attrHooks[n], {
|
|
set: function (e, r) {
|
|
return "" === r ? (e.setAttribute(n, "auto"), r) : t
|
|
}
|
|
})
|
|
})), b.support.hrefNormalized || (b.each(["href", "src", "width", "height"], function (e, n) {
|
|
b.attrHooks[n] = b.extend(b.attrHooks[n], {
|
|
get: function (e) {
|
|
var r = e.getAttribute(n, 2);
|
|
return null == r ? t : r
|
|
}
|
|
})
|
|
}), b.each(["href", "src"], function (e, t) {
|
|
b.propHooks[t] = {
|
|
get: function (e) {
|
|
return e.getAttribute(t, 4)
|
|
}
|
|
}
|
|
})), b.support.style || (b.attrHooks.style = {
|
|
get: function (e) {
|
|
return e.style.cssText || t
|
|
}, set: function (e, t) {
|
|
return e.style.cssText = t + ""
|
|
}
|
|
}), b.support.optSelected || (b.propHooks.selected = b.extend(b.propHooks.selected, {
|
|
get: function (e) {
|
|
var t = e.parentNode;
|
|
return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null
|
|
}
|
|
})), b.support.enctype || (b.propFix.enctype = "encoding"), b.support.checkOn || b.each(["radio", "checkbox"], function () {
|
|
b.valHooks[this] = {
|
|
get: function (e) {
|
|
return null === e.getAttribute("value") ? "on" : e.value
|
|
}
|
|
}
|
|
}), b.each(["radio", "checkbox"], function () {
|
|
b.valHooks[this] = b.extend(b.valHooks[this], {
|
|
set: function (e, n) {
|
|
return b.isArray(n) ? e.checked = b.inArray(b(e).val(), n) >= 0 : t
|
|
}
|
|
})
|
|
});
|
|
var Z = /^(?:input|select|textarea)$/i, et = /^key/, tt = /^(?:mouse|contextmenu)|click/,
|
|
nt = /^(?:focusinfocus|focusoutblur)$/, rt = /^([^.]*)(?:\.(.+)|)$/;
|
|
|
|
function it() {
|
|
return !0
|
|
}
|
|
|
|
function ot() {
|
|
return !1
|
|
}
|
|
|
|
b.event = {
|
|
global: {},
|
|
add: function (e, n, r, o, a) {
|
|
var s, u, l, c, p, f, d, h, g, m, y, v = b._data(e);
|
|
if (v) {
|
|
r.handler && (c = r, r = c.handler, a = c.selector), r.guid || (r.guid = b.guid++), (u = v.events) || (u = v.events = {}), (f = v.handle) || (f = v.handle = function (e) {
|
|
return typeof b === i || e && b.event.triggered === e.type ? t : b.event.dispatch.apply(f.elem, arguments)
|
|
}, f.elem = e), n = (n || "").match(w) || [""], l = n.length;
|
|
while (l--) s = rt.exec(n[l]) || [], g = y = s[1], m = (s[2] || "").split(".").sort(), p = b.event.special[g] || {}, g = (a ? p.delegateType : p.bindType) || g, p = b.event.special[g] || {}, d = b.extend({
|
|
type: g,
|
|
origType: y,
|
|
data: o,
|
|
handler: r,
|
|
guid: r.guid,
|
|
selector: a,
|
|
needsContext: a && b.expr.match.needsContext.test(a),
|
|
namespace: m.join(".")
|
|
}, c), (h = u[g]) || (h = u[g] = [], h.delegateCount = 0, p.setup && p.setup.call(e, o, m, f) !== !1 || (e.addEventListener ? e.addEventListener(g, f, !1) : e.attachEvent && e.attachEvent("on" + g, f))), p.add && (p.add.call(e, d), d.handler.guid || (d.handler.guid = r.guid)), a ? h.splice(h.delegateCount++, 0, d) : h.push(d), b.event.global[g] = !0;
|
|
e = null
|
|
}
|
|
},
|
|
remove: function (e, t, n, r, i) {
|
|
var o, a, s, u, l, c, p, f, d, h, g, m = b.hasData(e) && b._data(e);
|
|
if (m && (c = m.events)) {
|
|
t = (t || "").match(w) || [""], l = t.length;
|
|
while (l--) if (s = rt.exec(t[l]) || [], d = g = s[1], h = (s[2] || "").split(".").sort(), d) {
|
|
p = b.event.special[d] || {}, d = (r ? p.delegateType : p.bindType) || d, f = c[d] || [], s = s[2] && RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), u = o = f.length;
|
|
while (o--) a = f[o], !i && g !== a.origType || n && n.guid !== a.guid || s && !s.test(a.namespace) || r && r !== a.selector && ("**" !== r || !a.selector) || (f.splice(o, 1), a.selector && f.delegateCount--, p.remove && p.remove.call(e, a));
|
|
u && !f.length && (p.teardown && p.teardown.call(e, h, m.handle) !== !1 || b.removeEvent(e, d, m.handle), delete c[d])
|
|
} else for (d in c) b.event.remove(e, d + t[l], n, r, !0);
|
|
b.isEmptyObject(c) && (delete m.handle, b._removeData(e, "events"))
|
|
}
|
|
},
|
|
trigger: function (n, r, i, a) {
|
|
var s, u, l, c, p, f, d, h = [i || o], g = y.call(n, "type") ? n.type : n,
|
|
m = y.call(n, "namespace") ? n.namespace.split(".") : [];
|
|
if (l = f = i = i || o, 3 !== i.nodeType && 8 !== i.nodeType && !nt.test(g + b.event.triggered) && (g.indexOf(".") >= 0 && (m = g.split("."), g = m.shift(), m.sort()), u = 0 > g.indexOf(":") && "on" + g, n = n[b.expando] ? n : new b.Event(g, "object" == typeof n && n), n.isTrigger = !0, n.namespace = m.join("."), n.namespace_re = n.namespace ? RegExp("(^|\\.)" + m.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, n.result = t, n.target || (n.target = i), r = null == r ? [n] : b.makeArray(r, [n]), p = b.event.special[g] || {}, a || !p.trigger || p.trigger.apply(i, r) !== !1)) {
|
|
if (!a && !p.noBubble && !b.isWindow(i)) {
|
|
for (c = p.delegateType || g, nt.test(c + g) || (l = l.parentNode); l; l = l.parentNode) h.push(l), f = l;
|
|
f === (i.ownerDocument || o) && h.push(f.defaultView || f.parentWindow || e)
|
|
}
|
|
d = 0;
|
|
while ((l = h[d++]) && !n.isPropagationStopped()) n.type = d > 1 ? c : p.bindType || g, s = (b._data(l, "events") || {})[n.type] && b._data(l, "handle"), s && s.apply(l, r), s = u && l[u], s && b.acceptData(l) && s.apply && s.apply(l, r) === !1 && n.preventDefault();
|
|
if (n.type = g, !(a || n.isDefaultPrevented() || p._default && p._default.apply(i.ownerDocument, r) !== !1 || "click" === g && b.nodeName(i, "a") || !b.acceptData(i) || !u || !i[g] || b.isWindow(i))) {
|
|
f = i[u], f && (i[u] = null), b.event.triggered = g;
|
|
try {
|
|
i[g]()
|
|
} catch (v) {
|
|
}
|
|
b.event.triggered = t, f && (i[u] = f)
|
|
}
|
|
return n.result
|
|
}
|
|
},
|
|
dispatch: function (e) {
|
|
e = b.event.fix(e);
|
|
var n, r, i, o, a, s = [], u = h.call(arguments), l = (b._data(this, "events") || {})[e.type] || [],
|
|
c = b.event.special[e.type] || {};
|
|
if (u[0] = e, e.delegateTarget = this, !c.preDispatch || c.preDispatch.call(this, e) !== !1) {
|
|
s = b.event.handlers.call(this, e, l), n = 0;
|
|
while ((o = s[n++]) && !e.isPropagationStopped()) {
|
|
e.currentTarget = o.elem, a = 0;
|
|
while ((i = o.handlers[a++]) && !e.isImmediatePropagationStopped()) (!e.namespace_re || e.namespace_re.test(i.namespace)) && (e.handleObj = i, e.data = i.data, r = ((b.event.special[i.origType] || {}).handle || i.handler).apply(o.elem, u), r !== t && (e.result = r) === !1 && (e.preventDefault(), e.stopPropagation()))
|
|
}
|
|
return c.postDispatch && c.postDispatch.call(this, e), e.result
|
|
}
|
|
},
|
|
handlers: function (e, n) {
|
|
var r, i, o, a, s = [], u = n.delegateCount, l = e.target;
|
|
if (u && l.nodeType && (!e.button || "click" !== e.type)) for (; l != this; l = l.parentNode || this) if (1 === l.nodeType && (l.disabled !== !0 || "click" !== e.type)) {
|
|
for (o = [], a = 0; u > a; a++) i = n[a], r = i.selector + " ", o[r] === t && (o[r] = i.needsContext ? b(r, this).index(l) >= 0 : b.find(r, this, null, [l]).length), o[r] && o.push(i);
|
|
o.length && s.push({elem: l, handlers: o})
|
|
}
|
|
return n.length > u && s.push({elem: this, handlers: n.slice(u)}), s
|
|
},
|
|
fix: function (e) {
|
|
if (e[b.expando]) return e;
|
|
var t, n, r, i = e.type, a = e, s = this.fixHooks[i];
|
|
s || (this.fixHooks[i] = s = tt.test(i) ? this.mouseHooks : et.test(i) ? this.keyHooks : {}), r = s.props ? this.props.concat(s.props) : this.props, e = new b.Event(a), t = r.length;
|
|
while (t--) n = r[t], e[n] = a[n];
|
|
return e.target || (e.target = a.srcElement || o), 3 === e.target.nodeType && (e.target = e.target.parentNode), e.metaKey = !!e.metaKey, s.filter ? s.filter(e, a) : e
|
|
},
|
|
props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
|
|
fixHooks: {},
|
|
keyHooks: {
|
|
props: "char charCode key keyCode".split(" "), filter: function (e, t) {
|
|
return null == e.which && (e.which = null != t.charCode ? t.charCode : t.keyCode), e
|
|
}
|
|
},
|
|
mouseHooks: {
|
|
props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
|
|
filter: function (e, n) {
|
|
var r, i, a, s = n.button, u = n.fromElement;
|
|
return null == e.pageX && null != n.clientX && (i = e.target.ownerDocument || o, a = i.documentElement, r = i.body, e.pageX = n.clientX + (a && a.scrollLeft || r && r.scrollLeft || 0) - (a && a.clientLeft || r && r.clientLeft || 0), e.pageY = n.clientY + (a && a.scrollTop || r && r.scrollTop || 0) - (a && a.clientTop || r && r.clientTop || 0)), !e.relatedTarget && u && (e.relatedTarget = u === e.target ? n.toElement : u), e.which || s === t || (e.which = 1 & s ? 1 : 2 & s ? 3 : 4 & s ? 2 : 0), e
|
|
}
|
|
},
|
|
special: {
|
|
load: {noBubble: !0}, click: {
|
|
trigger: function () {
|
|
return b.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : t
|
|
}
|
|
}, focus: {
|
|
trigger: function () {
|
|
if (this !== o.activeElement && this.focus) try {
|
|
return this.focus(), !1
|
|
} catch (e) {
|
|
}
|
|
}, delegateType: "focusin"
|
|
}, blur: {
|
|
trigger: function () {
|
|
return this === o.activeElement && this.blur ? (this.blur(), !1) : t
|
|
}, delegateType: "focusout"
|
|
}, beforeunload: {
|
|
postDispatch: function (e) {
|
|
e.result !== t && (e.originalEvent.returnValue = e.result)
|
|
}
|
|
}
|
|
},
|
|
simulate: function (e, t, n, r) {
|
|
var i = b.extend(new b.Event, n, {type: e, isSimulated: !0, originalEvent: {}});
|
|
r ? b.event.trigger(i, null, t) : b.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault()
|
|
}
|
|
}, b.removeEvent = o.removeEventListener ? function (e, t, n) {
|
|
e.removeEventListener && e.removeEventListener(t, n, !1)
|
|
} : function (e, t, n) {
|
|
var r = "on" + t;
|
|
e.detachEvent && (typeof e[r] === i && (e[r] = null), e.detachEvent(r, n))
|
|
}, b.Event = function (e, n) {
|
|
return this instanceof b.Event ? (e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? it : ot) : this.type = e, n && b.extend(this, n), this.timeStamp = e && e.timeStamp || b.now(), this[b.expando] = !0, t) : new b.Event(e, n)
|
|
}, b.Event.prototype = {
|
|
isDefaultPrevented: ot,
|
|
isPropagationStopped: ot,
|
|
isImmediatePropagationStopped: ot,
|
|
preventDefault: function () {
|
|
var e = this.originalEvent;
|
|
this.isDefaultPrevented = it, e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1)
|
|
},
|
|
stopPropagation: function () {
|
|
var e = this.originalEvent;
|
|
this.isPropagationStopped = it, e && (e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0)
|
|
},
|
|
stopImmediatePropagation: function () {
|
|
this.isImmediatePropagationStopped = it, this.stopPropagation()
|
|
}
|
|
}, b.each({mouseenter: "mouseover", mouseleave: "mouseout"}, function (e, t) {
|
|
b.event.special[e] = {
|
|
delegateType: t, bindType: t, handle: function (e) {
|
|
var n, r = this, i = e.relatedTarget, o = e.handleObj;
|
|
return (!i || i !== r && !b.contains(r, i)) && (e.type = o.origType, n = o.handler.apply(this, arguments), e.type = t), n
|
|
}
|
|
}
|
|
}), b.support.submitBubbles || (b.event.special.submit = {
|
|
setup: function () {
|
|
return b.nodeName(this, "form") ? !1 : (b.event.add(this, "click._submit keypress._submit", function (e) {
|
|
var n = e.target, r = b.nodeName(n, "input") || b.nodeName(n, "button") ? n.form : t;
|
|
r && !b._data(r, "submitBubbles") && (b.event.add(r, "submit._submit", function (e) {
|
|
e._submit_bubble = !0
|
|
}), b._data(r, "submitBubbles", !0))
|
|
}), t)
|
|
}, postDispatch: function (e) {
|
|
e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && b.event.simulate("submit", this.parentNode, e, !0))
|
|
}, teardown: function () {
|
|
return b.nodeName(this, "form") ? !1 : (b.event.remove(this, "._submit"), t)
|
|
}
|
|
}), b.support.changeBubbles || (b.event.special.change = {
|
|
setup: function () {
|
|
return Z.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (b.event.add(this, "propertychange._change", function (e) {
|
|
"checked" === e.originalEvent.propertyName && (this._just_changed = !0)
|
|
}), b.event.add(this, "click._change", function (e) {
|
|
this._just_changed && !e.isTrigger && (this._just_changed = !1), b.event.simulate("change", this, e, !0)
|
|
})), !1) : (b.event.add(this, "beforeactivate._change", function (e) {
|
|
var t = e.target;
|
|
Z.test(t.nodeName) && !b._data(t, "changeBubbles") && (b.event.add(t, "change._change", function (e) {
|
|
!this.parentNode || e.isSimulated || e.isTrigger || b.event.simulate("change", this.parentNode, e, !0)
|
|
}), b._data(t, "changeBubbles", !0))
|
|
}), t)
|
|
}, handle: function (e) {
|
|
var n = e.target;
|
|
return this !== n || e.isSimulated || e.isTrigger || "radio" !== n.type && "checkbox" !== n.type ? e.handleObj.handler.apply(this, arguments) : t
|
|
}, teardown: function () {
|
|
return b.event.remove(this, "._change"), !Z.test(this.nodeName)
|
|
}
|
|
}), b.support.focusinBubbles || b.each({focus: "focusin", blur: "focusout"}, function (e, t) {
|
|
var n = 0, r = function (e) {
|
|
b.event.simulate(t, e.target, b.event.fix(e), !0)
|
|
};
|
|
b.event.special[t] = {
|
|
setup: function () {
|
|
0 === n++ && o.addEventListener(e, r, !0)
|
|
}, teardown: function () {
|
|
0 === --n && o.removeEventListener(e, r, !0)
|
|
}
|
|
}
|
|
}), b.fn.extend({
|
|
on: function (e, n, r, i, o) {
|
|
var a, s;
|
|
if ("object" == typeof e) {
|
|
"string" != typeof n && (r = r || n, n = t);
|
|
for (a in e) this.on(a, n, r, e[a], o);
|
|
return this
|
|
}
|
|
if (null == r && null == i ? (i = n, r = n = t) : null == i && ("string" == typeof n ? (i = r, r = t) : (i = r, r = n, n = t)), i === !1) i = ot; else if (!i) return this;
|
|
return 1 === o && (s = i, i = function (e) {
|
|
return b().off(e), s.apply(this, arguments)
|
|
}, i.guid = s.guid || (s.guid = b.guid++)), this.each(function () {
|
|
b.event.add(this, e, i, r, n)
|
|
})
|
|
}, one: function (e, t, n, r) {
|
|
return this.on(e, t, n, r, 1)
|
|
}, off: function (e, n, r) {
|
|
var i, o;
|
|
if (e && e.preventDefault && e.handleObj) return i = e.handleObj, b(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), this;
|
|
if ("object" == typeof e) {
|
|
for (o in e) this.off(o, n, e[o]);
|
|
return this
|
|
}
|
|
return (n === !1 || "function" == typeof n) && (r = n, n = t), r === !1 && (r = ot), this.each(function () {
|
|
b.event.remove(this, e, r, n)
|
|
})
|
|
}, 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)
|
|
}, trigger: function (e, t) {
|
|
return this.each(function () {
|
|
b.event.trigger(e, t, this)
|
|
})
|
|
}, triggerHandler: function (e, n) {
|
|
var r = this[0];
|
|
return r ? b.event.trigger(e, n, r, !0) : t
|
|
}
|
|
}), function (e, t) {
|
|
var n, r, i, o, a, s, u, l, c, p, f, d, h, g, m, y, v, x = "sizzle" + -new Date, w = e.document, T = {}, N = 0,
|
|
C = 0, k = it(), E = it(), S = it(), A = typeof t, j = 1 << 31, D = [], L = D.pop, H = D.push, q = D.slice,
|
|
M = D.indexOf || function (e) {
|
|
var t = 0, n = this.length;
|
|
for (; n > t; t++) if (this[t] === e) return t;
|
|
return -1
|
|
}, _ = "[\\x20\\t\\r\\n\\f]", F = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", O = F.replace("w", "w#"),
|
|
B = "([*^$|!~]?=)",
|
|
P = "\\[" + _ + "*(" + F + ")" + _ + "*(?:" + B + _ + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + O + ")|)|)" + _ + "*\\]",
|
|
R = ":(" + F + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + P.replace(3, 8) + ")*)|.*)\\)|)",
|
|
W = RegExp("^" + _ + "+|((?:^|[^\\\\])(?:\\\\.)*)" + _ + "+$", "g"), $ = RegExp("^" + _ + "*," + _ + "*"),
|
|
I = RegExp("^" + _ + "*([\\x20\\t\\r\\n\\f>+~])" + _ + "*"), z = RegExp(R), X = RegExp("^" + O + "$"), U = {
|
|
ID: RegExp("^#(" + F + ")"),
|
|
CLASS: RegExp("^\\.(" + F + ")"),
|
|
NAME: RegExp("^\\[name=['\"]?(" + F + ")['\"]?\\]"),
|
|
TAG: RegExp("^(" + F.replace("w", "w*") + ")"),
|
|
ATTR: RegExp("^" + P),
|
|
PSEUDO: RegExp("^" + R),
|
|
CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + _ + "*(even|odd|(([+-]|)(\\d*)n|)" + _ + "*(?:([+-]|)" + _ + "*(\\d+)|))" + _ + "*\\)|)", "i"),
|
|
needsContext: RegExp("^" + _ + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + _ + "*((?:-\\d)?\\d*)" + _ + "*\\)|)(?=[^-]|$)", "i")
|
|
}, V = /[\x20\t\r\n\f]*[+~]/, Y = /^[^{]+\{\s*\[native code/, J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
|
|
G = /^(?:input|select|textarea|button)$/i, Q = /^h\d$/i, K = /'|\\/g,
|
|
Z = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, et = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
|
|
tt = function (e, t) {
|
|
var n = "0x" + t - 65536;
|
|
return n !== n ? t : 0 > n ? String.fromCharCode(n + 65536) : String.fromCharCode(55296 | n >> 10, 56320 | 1023 & n)
|
|
};
|
|
try {
|
|
q.call(w.documentElement.childNodes, 0)[0].nodeType
|
|
} catch (nt) {
|
|
q = function (e) {
|
|
var t, n = [];
|
|
while (t = this[e++]) n.push(t);
|
|
return n
|
|
}
|
|
}
|
|
|
|
function rt(e) {
|
|
return Y.test(e + "")
|
|
}
|
|
|
|
function it() {
|
|
var e, t = [];
|
|
return e = function (n, r) {
|
|
return t.push(n += " ") > i.cacheLength && delete e[t.shift()], e[n] = r
|
|
}
|
|
}
|
|
|
|
function ot(e) {
|
|
return e[x] = !0, e
|
|
}
|
|
|
|
function at(e) {
|
|
var t = p.createElement("div");
|
|
try {
|
|
return e(t)
|
|
} catch (n) {
|
|
return !1
|
|
} finally {
|
|
t = null
|
|
}
|
|
}
|
|
|
|
function st(e, t, n, r) {
|
|
var i, o, a, s, u, l, f, g, m, v;
|
|
if ((t ? t.ownerDocument || t : w) !== p && c(t), t = t || p, n = n || [], !e || "string" != typeof e) return n;
|
|
if (1 !== (s = t.nodeType) && 9 !== s) return [];
|
|
if (!d && !r) {
|
|
if (i = J.exec(e)) if (a = i[1]) {
|
|
if (9 === s) {
|
|
if (o = t.getElementById(a), !o || !o.parentNode) return n;
|
|
if (o.id === a) return n.push(o), n
|
|
} else if (t.ownerDocument && (o = t.ownerDocument.getElementById(a)) && y(t, o) && o.id === a) return n.push(o), n
|
|
} else {
|
|
if (i[2]) return H.apply(n, q.call(t.getElementsByTagName(e), 0)), n;
|
|
if ((a = i[3]) && T.getByClassName && t.getElementsByClassName) return H.apply(n, q.call(t.getElementsByClassName(a), 0)), n
|
|
}
|
|
if (T.qsa && !h.test(e)) {
|
|
if (f = !0, g = x, m = t, v = 9 === s && e, 1 === s && "object" !== t.nodeName.toLowerCase()) {
|
|
l = ft(e), (f = t.getAttribute("id")) ? g = f.replace(K, "\\$&") : t.setAttribute("id", g), g = "[id='" + g + "'] ", u = l.length;
|
|
while (u--) l[u] = g + dt(l[u]);
|
|
m = V.test(e) && t.parentNode || t, v = l.join(",")
|
|
}
|
|
if (v) try {
|
|
return H.apply(n, q.call(m.querySelectorAll(v), 0)), n
|
|
} catch (b) {
|
|
} finally {
|
|
f || t.removeAttribute("id")
|
|
}
|
|
}
|
|
}
|
|
return wt(e.replace(W, "$1"), t, n, r)
|
|
}
|
|
|
|
a = st.isXML = function (e) {
|
|
var t = e && (e.ownerDocument || e).documentElement;
|
|
return t ? "HTML" !== t.nodeName : !1
|
|
}, c = st.setDocument = function (e) {
|
|
var n = e ? e.ownerDocument || e : w;
|
|
return n !== p && 9 === n.nodeType && n.documentElement ? (p = n, f = n.documentElement, d = a(n), T.tagNameNoComments = at(function (e) {
|
|
return e.appendChild(n.createComment("")), !e.getElementsByTagName("*").length
|
|
}), T.attributes = at(function (e) {
|
|
e.innerHTML = "<select></select>";
|
|
var t = typeof e.lastChild.getAttribute("multiple");
|
|
return "boolean" !== t && "string" !== t
|
|
}), T.getByClassName = at(function (e) {
|
|
return e.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>", e.getElementsByClassName && e.getElementsByClassName("e").length ? (e.lastChild.className = "e", 2 === e.getElementsByClassName("e").length) : !1
|
|
}), T.getByName = at(function (e) {
|
|
e.id = x + 0, e.innerHTML = "<a name='" + x + "'></a><div name='" + x + "'></div>", f.insertBefore(e, f.firstChild);
|
|
var t = n.getElementsByName && n.getElementsByName(x).length === 2 + n.getElementsByName(x + 0).length;
|
|
return T.getIdNotName = !n.getElementById(x), f.removeChild(e), t
|
|
}), i.attrHandle = at(function (e) {
|
|
return e.innerHTML = "<a href='#'></a>", e.firstChild && typeof e.firstChild.getAttribute !== A && "#" === e.firstChild.getAttribute("href")
|
|
}) ? {} : {
|
|
href: function (e) {
|
|
return e.getAttribute("href", 2)
|
|
}, type: function (e) {
|
|
return e.getAttribute("type")
|
|
}
|
|
}, T.getIdNotName ? (i.find.ID = function (e, t) {
|
|
if (typeof t.getElementById !== A && !d) {
|
|
var n = t.getElementById(e);
|
|
return n && n.parentNode ? [n] : []
|
|
}
|
|
}, i.filter.ID = function (e) {
|
|
var t = e.replace(et, tt);
|
|
return function (e) {
|
|
return e.getAttribute("id") === t
|
|
}
|
|
}) : (i.find.ID = function (e, n) {
|
|
if (typeof n.getElementById !== A && !d) {
|
|
var r = n.getElementById(e);
|
|
return r ? r.id === e || typeof r.getAttributeNode !== A && r.getAttributeNode("id").value === e ? [r] : t : []
|
|
}
|
|
}, i.filter.ID = function (e) {
|
|
var t = e.replace(et, tt);
|
|
return function (e) {
|
|
var n = typeof e.getAttributeNode !== A && e.getAttributeNode("id");
|
|
return n && n.value === t
|
|
}
|
|
}), i.find.TAG = T.tagNameNoComments ? function (e, n) {
|
|
return typeof n.getElementsByTagName !== A ? n.getElementsByTagName(e) : t
|
|
} : 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
|
|
}, i.find.NAME = T.getByName && function (e, n) {
|
|
return typeof n.getElementsByName !== A ? n.getElementsByName(name) : t
|
|
}, i.find.CLASS = T.getByClassName && function (e, n) {
|
|
return typeof n.getElementsByClassName === A || d ? t : n.getElementsByClassName(e)
|
|
}, g = [], h = [":focus"], (T.qsa = rt(n.querySelectorAll)) && (at(function (e) {
|
|
e.innerHTML = "<select><option selected=''></option></select>", e.querySelectorAll("[selected]").length || h.push("\\[" + _ + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)"), e.querySelectorAll(":checked").length || h.push(":checked")
|
|
}), at(function (e) {
|
|
e.innerHTML = "<input type='hidden' i=''/>", e.querySelectorAll("[i^='']").length && h.push("[*^$]=" + _ + "*(?:\"\"|'')"), e.querySelectorAll(":enabled").length || h.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), h.push(",.*:")
|
|
})), (T.matchesSelector = rt(m = f.matchesSelector || f.mozMatchesSelector || f.webkitMatchesSelector || f.oMatchesSelector || f.msMatchesSelector)) && at(function (e) {
|
|
T.disconnectedMatch = m.call(e, "div"), m.call(e, "[s!='']:x"), g.push("!=", R)
|
|
}), h = RegExp(h.join("|")), g = RegExp(g.join("|")), y = rt(f.contains) || f.compareDocumentPosition ? 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
|
|
}, v = f.compareDocumentPosition ? function (e, t) {
|
|
var r;
|
|
return e === t ? (u = !0, 0) : (r = t.compareDocumentPosition && e.compareDocumentPosition && e.compareDocumentPosition(t)) ? 1 & r || e.parentNode && 11 === e.parentNode.nodeType ? e === n || y(w, e) ? -1 : t === n || y(w, t) ? 1 : 0 : 4 & r ? -1 : 1 : e.compareDocumentPosition ? -1 : 1
|
|
} : function (e, t) {
|
|
var r, i = 0, o = e.parentNode, a = t.parentNode, s = [e], l = [t];
|
|
if (e === t) return u = !0, 0;
|
|
if (!o || !a) return e === n ? -1 : t === n ? 1 : o ? -1 : a ? 1 : 0;
|
|
if (o === a) return ut(e, t);
|
|
r = e;
|
|
while (r = r.parentNode) s.unshift(r);
|
|
r = t;
|
|
while (r = r.parentNode) l.unshift(r);
|
|
while (s[i] === l[i]) i++;
|
|
return i ? ut(s[i], l[i]) : s[i] === w ? -1 : l[i] === w ? 1 : 0
|
|
}, u = !1, [0, 0].sort(v), T.detectDuplicates = u, p) : p
|
|
}, st.matches = function (e, t) {
|
|
return st(e, null, null, t)
|
|
}, st.matchesSelector = function (e, t) {
|
|
if ((e.ownerDocument || e) !== p && c(e), t = t.replace(Z, "='$1']"), !(!T.matchesSelector || d || g && g.test(t) || h.test(t))) try {
|
|
var n = m.call(e, t);
|
|
if (n || T.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n
|
|
} catch (r) {
|
|
}
|
|
return st(t, p, null, [e]).length > 0
|
|
}, st.contains = function (e, t) {
|
|
return (e.ownerDocument || e) !== p && c(e), y(e, t)
|
|
}, st.attr = function (e, t) {
|
|
var n;
|
|
return (e.ownerDocument || e) !== p && c(e), d || (t = t.toLowerCase()), (n = i.attrHandle[t]) ? n(e) : d || T.attributes ? e.getAttribute(t) : ((n = e.getAttributeNode(t)) || e.getAttribute(t)) && e[t] === !0 ? t : n && n.specified ? n.value : null
|
|
}, st.error = function (e) {
|
|
throw Error("Syntax error, unrecognized expression: " + e)
|
|
}, st.uniqueSort = function (e) {
|
|
var t, n = [], r = 1, i = 0;
|
|
if (u = !T.detectDuplicates, e.sort(v), u) {
|
|
for (; t = e[r]; r++) t === e[r - 1] && (i = n.push(r));
|
|
while (i--) e.splice(n[i], 1)
|
|
}
|
|
return e
|
|
};
|
|
|
|
function ut(e, t) {
|
|
var n = t && e, r = n && (~t.sourceIndex || j) - (~e.sourceIndex || j);
|
|
if (r) return r;
|
|
if (n) while (n = n.nextSibling) if (n === t) return -1;
|
|
return e ? 1 : -1
|
|
}
|
|
|
|
function lt(e) {
|
|
return function (t) {
|
|
var n = t.nodeName.toLowerCase();
|
|
return "input" === n && t.type === e
|
|
}
|
|
}
|
|
|
|
function ct(e) {
|
|
return function (t) {
|
|
var n = t.nodeName.toLowerCase();
|
|
return ("input" === n || "button" === n) && t.type === e
|
|
}
|
|
}
|
|
|
|
function pt(e) {
|
|
return ot(function (t) {
|
|
return t = +t, ot(function (n, r) {
|
|
var i, o = e([], n.length, t), a = o.length;
|
|
while (a--) n[i = o[a]] && (n[i] = !(r[i] = n[i]))
|
|
})
|
|
})
|
|
}
|
|
|
|
o = st.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 for (; t = e[r]; r++) n += o(t);
|
|
return n
|
|
}, i = st.selectors = {
|
|
cacheLength: 50,
|
|
createPseudo: ot,
|
|
match: U,
|
|
find: {},
|
|
relative: {
|
|
">": {dir: "parentNode", first: !0},
|
|
" ": {dir: "parentNode"},
|
|
"+": {dir: "previousSibling", first: !0},
|
|
"~": {dir: "previousSibling"}
|
|
},
|
|
preFilter: {
|
|
ATTR: function (e) {
|
|
return e[1] = e[1].replace(et, tt), e[3] = (e[4] || e[5] || "").replace(et, tt), "~=" === 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] || st.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] && st.error(e[0]), e
|
|
}, PSEUDO: function (e) {
|
|
var t, n = !e[5] && e[2];
|
|
return U.CHILD.test(e[0]) ? null : (e[4] ? e[2] = e[4] : n && z.test(n) && (t = ft(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) {
|
|
return "*" === e ? function () {
|
|
return !0
|
|
} : (e = e.replace(et, tt).toLowerCase(), function (t) {
|
|
return t.nodeName && t.nodeName.toLowerCase() === e
|
|
})
|
|
}, CLASS: function (e) {
|
|
var t = k[e + " "];
|
|
return t || (t = RegExp("(^|" + _ + ")" + e + "(" + _ + "|$)")) && k(e, function (e) {
|
|
return t.test(e.className || typeof e.getAttribute !== A && e.getAttribute("class") || "")
|
|
})
|
|
}, ATTR: function (e, t, n) {
|
|
return function (r) {
|
|
var i = st.attr(r, e);
|
|
return null == i ? "!=" === t : t ? (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i + " ").indexOf(n) > -1 : "|=" === t ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0
|
|
}
|
|
}, CHILD: function (e, t, n, r, i) {
|
|
var o = "nth" !== e.slice(0, 3), a = "last" !== e.slice(-4), s = "of-type" === t;
|
|
return 1 === r && 0 === i ? function (e) {
|
|
return !!e.parentNode
|
|
} : function (t, n, u) {
|
|
var l, c, p, f, d, h, g = o !== a ? "nextSibling" : "previousSibling", m = t.parentNode,
|
|
y = s && t.nodeName.toLowerCase(), v = !u && !s;
|
|
if (m) {
|
|
if (o) {
|
|
while (g) {
|
|
p = t;
|
|
while (p = p[g]) if (s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) return !1;
|
|
h = g = "only" === e && !h && "nextSibling"
|
|
}
|
|
return !0
|
|
}
|
|
if (h = [a ? m.firstChild : m.lastChild], a && v) {
|
|
c = m[x] || (m[x] = {}), l = c[e] || [], d = l[0] === N && l[1], f = l[0] === N && l[2], p = d && m.childNodes[d];
|
|
while (p = ++d && p && p[g] || (f = d = 0) || h.pop()) if (1 === p.nodeType && ++f && p === t) {
|
|
c[e] = [N, d, f];
|
|
break
|
|
}
|
|
} else if (v && (l = (t[x] || (t[x] = {}))[e]) && l[0] === N) f = l[1]; else while (p = ++d && p && p[g] || (f = d = 0) || h.pop()) if ((s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) && ++f && (v && ((p[x] || (p[x] = {}))[e] = [N, f]), p === t)) break;
|
|
return f -= i, f === r || 0 === f % r && f / r >= 0
|
|
}
|
|
}
|
|
}, PSEUDO: function (e, t) {
|
|
var n, r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || st.error("unsupported pseudo: " + e);
|
|
return r[x] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? ot(function (e, n) {
|
|
var i, o = r(e, t), a = o.length;
|
|
while (a--) i = M.call(e, o[a]), e[i] = !(n[i] = o[a])
|
|
}) : function (e) {
|
|
return r(e, 0, n)
|
|
}) : r
|
|
}
|
|
},
|
|
pseudos: {
|
|
not: ot(function (e) {
|
|
var t = [], n = [], r = s(e.replace(W, "$1"));
|
|
return r[x] ? ot(function (e, t, n, i) {
|
|
var o, a = r(e, null, i, []), s = e.length;
|
|
while (s--) (o = a[s]) && (e[s] = !(t[s] = o))
|
|
}) : function (e, i, o) {
|
|
return t[0] = e, r(t, null, o, n), !n.pop()
|
|
}
|
|
}), has: ot(function (e) {
|
|
return function (t) {
|
|
return st(e, t).length > 0
|
|
}
|
|
}), contains: ot(function (e) {
|
|
return function (t) {
|
|
return (t.textContent || t.innerText || o(t)).indexOf(e) > -1
|
|
}
|
|
}), lang: ot(function (e) {
|
|
return X.test(e || "") || st.error("unsupported lang: " + e), e = e.replace(et, tt).toLowerCase(), function (t) {
|
|
var n;
|
|
do if (n = d ? t.getAttribute("xml:lang") || t.getAttribute("lang") : t.lang) return n = n.toLowerCase(), n === e || 0 === n.indexOf(e + "-"); while ((t = t.parentNode) && 1 === t.nodeType);
|
|
return !1
|
|
}
|
|
}), target: function (t) {
|
|
var n = e.location && e.location.hash;
|
|
return n && n.slice(1) === t.id
|
|
}, root: function (e) {
|
|
return e === f
|
|
}, focus: function (e) {
|
|
return e === p.activeElement && (!p.hasFocus || p.hasFocus()) && !!(e.type || e.href || ~e.tabIndex)
|
|
}, enabled: function (e) {
|
|
return e.disabled === !1
|
|
}, disabled: function (e) {
|
|
return e.disabled === !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, e.selected === !0
|
|
}, empty: function (e) {
|
|
for (e = e.firstChild; e; e = e.nextSibling) if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType) return !1;
|
|
return !0
|
|
}, parent: function (e) {
|
|
return !i.pseudos.empty(e)
|
|
}, header: function (e) {
|
|
return Q.test(e.nodeName)
|
|
}, input: function (e) {
|
|
return G.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")) || t.toLowerCase() === e.type)
|
|
}, first: pt(function () {
|
|
return [0]
|
|
}), last: pt(function (e, t) {
|
|
return [t - 1]
|
|
}), eq: pt(function (e, t, n) {
|
|
return [0 > n ? n + t : n]
|
|
}), even: pt(function (e, t) {
|
|
var n = 0;
|
|
for (; t > n; n += 2) e.push(n);
|
|
return e
|
|
}), odd: pt(function (e, t) {
|
|
var n = 1;
|
|
for (; t > n; n += 2) e.push(n);
|
|
return e
|
|
}), lt: pt(function (e, t, n) {
|
|
var r = 0 > n ? n + t : n;
|
|
for (; --r >= 0;) e.push(r);
|
|
return e
|
|
}), gt: pt(function (e, t, n) {
|
|
var r = 0 > n ? n + t : n;
|
|
for (; t > ++r;) e.push(r);
|
|
return e
|
|
})
|
|
}
|
|
};
|
|
for (n in{radio: !0, checkbox: !0, file: !0, password: !0, image: !0}) i.pseudos[n] = lt(n);
|
|
for (n in{submit: !0, reset: !0}) i.pseudos[n] = ct(n);
|
|
|
|
function ft(e, t) {
|
|
var n, r, o, a, s, u, l, c = E[e + " "];
|
|
if (c) return t ? 0 : c.slice(0);
|
|
s = e, u = [], l = i.preFilter;
|
|
while (s) {
|
|
(!n || (r = $.exec(s))) && (r && (s = s.slice(r[0].length) || s), u.push(o = [])), n = !1, (r = I.exec(s)) && (n = r.shift(), o.push({
|
|
value: n,
|
|
type: r[0].replace(W, " ")
|
|
}), s = s.slice(n.length));
|
|
for (a in i.filter) !(r = U[a].exec(s)) || l[a] && !(r = l[a](r)) || (n = r.shift(), o.push({
|
|
value: n,
|
|
type: a,
|
|
matches: r
|
|
}), s = s.slice(n.length));
|
|
if (!n) break
|
|
}
|
|
return t ? s.length : s ? st.error(e) : E(e, u).slice(0)
|
|
}
|
|
|
|
function dt(e) {
|
|
var t = 0, n = e.length, r = "";
|
|
for (; n > t; t++) r += e[t].value;
|
|
return r
|
|
}
|
|
|
|
function ht(e, t, n) {
|
|
var i = t.dir, o = n && "parentNode" === i, a = C++;
|
|
return t.first ? function (t, n, r) {
|
|
while (t = t[i]) if (1 === t.nodeType || o) return e(t, n, r)
|
|
} : function (t, n, s) {
|
|
var u, l, c, p = N + " " + a;
|
|
if (s) {
|
|
while (t = t[i]) if ((1 === t.nodeType || o) && e(t, n, s)) return !0
|
|
} else while (t = t[i]) if (1 === t.nodeType || o) if (c = t[x] || (t[x] = {}), (l = c[i]) && l[0] === p) {
|
|
if ((u = l[1]) === !0 || u === r) return u === !0
|
|
} else if (l = c[i] = [p], l[1] = e(t, n, s) || r, l[1] === !0) return !0
|
|
}
|
|
}
|
|
|
|
function gt(e) {
|
|
return e.length > 1 ? function (t, n, r) {
|
|
var i = e.length;
|
|
while (i--) if (!e[i](t, n, r)) return !1;
|
|
return !0
|
|
} : e[0]
|
|
}
|
|
|
|
function mt(e, t, n, r, i) {
|
|
var o, a = [], s = 0, u = e.length, l = null != t;
|
|
for (; u > s; s++) (o = e[s]) && (!n || n(o, r, i)) && (a.push(o), l && t.push(s));
|
|
return a
|
|
}
|
|
|
|
function yt(e, t, n, r, i, o) {
|
|
return r && !r[x] && (r = yt(r)), i && !i[x] && (i = yt(i, o)), ot(function (o, a, s, u) {
|
|
var l, c, p, f = [], d = [], h = a.length, g = o || xt(t || "*", s.nodeType ? [s] : s, []),
|
|
m = !e || !o && t ? g : mt(g, f, e, s, u), y = n ? i || (o ? e : h || r) ? [] : a : m;
|
|
if (n && n(m, y, s, u), r) {
|
|
l = mt(y, d), r(l, [], s, u), c = l.length;
|
|
while (c--) (p = l[c]) && (y[d[c]] = !(m[d[c]] = p))
|
|
}
|
|
if (o) {
|
|
if (i || e) {
|
|
if (i) {
|
|
l = [], c = y.length;
|
|
while (c--) (p = y[c]) && l.push(m[c] = p);
|
|
i(null, y = [], l, u)
|
|
}
|
|
c = y.length;
|
|
while (c--) (p = y[c]) && (l = i ? M.call(o, p) : f[c]) > -1 && (o[l] = !(a[l] = p))
|
|
}
|
|
} else y = mt(y === a ? y.splice(h, y.length) : y), i ? i(null, a, y, u) : H.apply(a, y)
|
|
})
|
|
}
|
|
|
|
function vt(e) {
|
|
var t, n, r, o = e.length, a = i.relative[e[0].type], s = a || i.relative[" "], u = a ? 1 : 0,
|
|
c = ht(function (e) {
|
|
return e === t
|
|
}, s, !0), p = ht(function (e) {
|
|
return M.call(t, e) > -1
|
|
}, s, !0), f = [function (e, n, r) {
|
|
return !a && (r || n !== l) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r))
|
|
}];
|
|
for (; o > u; u++) if (n = i.relative[e[u].type]) f = [ht(gt(f), n)]; else {
|
|
if (n = i.filter[e[u].type].apply(null, e[u].matches), n[x]) {
|
|
for (r = ++u; o > r; r++) if (i.relative[e[r].type]) break;
|
|
return yt(u > 1 && gt(f), u > 1 && dt(e.slice(0, u - 1)).replace(W, "$1"), n, r > u && vt(e.slice(u, r)), o > r && vt(e = e.slice(r)), o > r && dt(e))
|
|
}
|
|
f.push(n)
|
|
}
|
|
return gt(f)
|
|
}
|
|
|
|
function bt(e, t) {
|
|
var n = 0, o = t.length > 0, a = e.length > 0, s = function (s, u, c, f, d) {
|
|
var h, g, m, y = [], v = 0, b = "0", x = s && [], w = null != d, T = l,
|
|
C = s || a && i.find.TAG("*", d && u.parentNode || u), k = N += null == T ? 1 : Math.random() || .1;
|
|
for (w && (l = u !== p && u, r = n); null != (h = C[b]); b++) {
|
|
if (a && h) {
|
|
g = 0;
|
|
while (m = e[g++]) if (m(h, u, c)) {
|
|
f.push(h);
|
|
break
|
|
}
|
|
w && (N = k, r = ++n)
|
|
}
|
|
o && ((h = !m && h) && v--, s && x.push(h))
|
|
}
|
|
if (v += b, o && b !== v) {
|
|
g = 0;
|
|
while (m = t[g++]) m(x, y, u, c);
|
|
if (s) {
|
|
if (v > 0) while (b--) x[b] || y[b] || (y[b] = L.call(f));
|
|
y = mt(y)
|
|
}
|
|
H.apply(f, y), w && !s && y.length > 0 && v + t.length > 1 && st.uniqueSort(f)
|
|
}
|
|
return w && (N = k, l = T), x
|
|
};
|
|
return o ? ot(s) : s
|
|
}
|
|
|
|
s = st.compile = function (e, t) {
|
|
var n, r = [], i = [], o = S[e + " "];
|
|
if (!o) {
|
|
t || (t = ft(e)), n = t.length;
|
|
while (n--) o = vt(t[n]), o[x] ? r.push(o) : i.push(o);
|
|
o = S(e, bt(i, r))
|
|
}
|
|
return o
|
|
};
|
|
|
|
function xt(e, t, n) {
|
|
var r = 0, i = t.length;
|
|
for (; i > r; r++) st(e, t[r], n);
|
|
return n
|
|
}
|
|
|
|
function wt(e, t, n, r) {
|
|
var o, a, u, l, c, p = ft(e);
|
|
if (!r && 1 === p.length) {
|
|
if (a = p[0] = p[0].slice(0), a.length > 2 && "ID" === (u = a[0]).type && 9 === t.nodeType && !d && i.relative[a[1].type]) {
|
|
if (t = i.find.ID(u.matches[0].replace(et, tt), t)[0], !t) return n;
|
|
e = e.slice(a.shift().value.length)
|
|
}
|
|
o = U.needsContext.test(e) ? 0 : a.length;
|
|
while (o--) {
|
|
if (u = a[o], i.relative[l = u.type]) break;
|
|
if ((c = i.find[l]) && (r = c(u.matches[0].replace(et, tt), V.test(a[0].type) && t.parentNode || t))) {
|
|
if (a.splice(o, 1), e = r.length && dt(a), !e) return H.apply(n, q.call(r, 0)), n;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return s(e, p)(r, t, d, n, V.test(e)), n
|
|
}
|
|
|
|
i.pseudos.nth = i.pseudos.eq;
|
|
|
|
function Tt() {
|
|
}
|
|
|
|
i.filters = Tt.prototype = i.pseudos, i.setFilters = new Tt, c(), st.attr = b.attr, b.find = st, b.expr = st.selectors, b.expr[":"] = b.expr.pseudos, b.unique = st.uniqueSort, b.text = st.getText, b.isXMLDoc = st.isXML, b.contains = st.contains
|
|
}(e);
|
|
var at = /Until$/, st = /^(?:parents|prev(?:Until|All))/, ut = /^.[^:#\[\.,]*$/, lt = b.expr.match.needsContext,
|
|
ct = {children: !0, contents: !0, next: !0, prev: !0};
|
|
b.fn.extend({
|
|
find: function (e) {
|
|
var t, n, r, i = this.length;
|
|
if ("string" != typeof e) return r = this, this.pushStack(b(e).filter(function () {
|
|
for (t = 0; i > t; t++) if (b.contains(r[t], this)) return !0
|
|
}));
|
|
for (n = [], t = 0; i > t; t++) b.find(e, this[t], n);
|
|
return n = this.pushStack(i > 1 ? b.unique(n) : n), n.selector = (this.selector ? this.selector + " " : "") + e, n
|
|
}, has: function (e) {
|
|
var t, n = b(e, this), r = n.length;
|
|
return this.filter(function () {
|
|
for (t = 0; r > t; t++) if (b.contains(this, n[t])) return !0
|
|
})
|
|
}, not: function (e) {
|
|
return this.pushStack(ft(this, e, !1))
|
|
}, filter: function (e) {
|
|
return this.pushStack(ft(this, e, !0))
|
|
}, is: function (e) {
|
|
return !!e && ("string" == typeof e ? lt.test(e) ? b(e, this.context).index(this[0]) >= 0 : b.filter(e, this).length > 0 : this.filter(e).length > 0)
|
|
}, closest: function (e, t) {
|
|
var n, r = 0, i = this.length, o = [], a = lt.test(e) || "string" != typeof e ? b(e, t || this.context) : 0;
|
|
for (; i > r; r++) {
|
|
n = this[r];
|
|
while (n && n.ownerDocument && n !== t && 11 !== n.nodeType) {
|
|
if (a ? a.index(n) > -1 : b.find.matchesSelector(n, e)) {
|
|
o.push(n);
|
|
break
|
|
}
|
|
n = n.parentNode
|
|
}
|
|
}
|
|
return this.pushStack(o.length > 1 ? b.unique(o) : o)
|
|
}, index: function (e) {
|
|
return e ? "string" == typeof e ? b.inArray(this[0], b(e)) : b.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
|
|
}, add: function (e, t) {
|
|
var n = "string" == typeof e ? b(e, t) : b.makeArray(e && e.nodeType ? [e] : e), r = b.merge(this.get(), n);
|
|
return this.pushStack(b.unique(r))
|
|
}, addBack: function (e) {
|
|
return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
|
|
}
|
|
}), b.fn.andSelf = b.fn.addBack;
|
|
|
|
function pt(e, t) {
|
|
do e = e[t]; while (e && 1 !== e.nodeType);
|
|
return e
|
|
}
|
|
|
|
b.each({
|
|
parent: function (e) {
|
|
var t = e.parentNode;
|
|
return t && 11 !== t.nodeType ? t : null
|
|
}, parents: function (e) {
|
|
return b.dir(e, "parentNode")
|
|
}, parentsUntil: function (e, t, n) {
|
|
return b.dir(e, "parentNode", n)
|
|
}, next: function (e) {
|
|
return pt(e, "nextSibling")
|
|
}, prev: function (e) {
|
|
return pt(e, "previousSibling")
|
|
}, nextAll: function (e) {
|
|
return b.dir(e, "nextSibling")
|
|
}, prevAll: function (e) {
|
|
return b.dir(e, "previousSibling")
|
|
}, nextUntil: function (e, t, n) {
|
|
return b.dir(e, "nextSibling", n)
|
|
}, prevUntil: function (e, t, n) {
|
|
return b.dir(e, "previousSibling", n)
|
|
}, siblings: function (e) {
|
|
return b.sibling((e.parentNode || {}).firstChild, e)
|
|
}, children: function (e) {
|
|
return b.sibling(e.firstChild)
|
|
}, contents: function (e) {
|
|
return b.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : b.merge([], e.childNodes)
|
|
}
|
|
}, function (e, t) {
|
|
b.fn[e] = function (n, r) {
|
|
var i = b.map(this, t, n);
|
|
return at.test(e) || (r = n), r && "string" == typeof r && (i = b.filter(r, i)), i = this.length > 1 && !ct[e] ? b.unique(i) : i, this.length > 1 && st.test(e) && (i = i.reverse()), this.pushStack(i)
|
|
}
|
|
}), b.extend({
|
|
filter: function (e, t, n) {
|
|
return n && (e = ":not(" + e + ")"), 1 === t.length ? b.find.matchesSelector(t[0], e) ? [t[0]] : [] : b.find.matches(e, t)
|
|
}, dir: function (e, n, r) {
|
|
var i = [], o = e[n];
|
|
while (o && 9 !== o.nodeType && (r === t || 1 !== o.nodeType || !b(o).is(r))) 1 === o.nodeType && i.push(o), o = o[n];
|
|
return i
|
|
}, sibling: function (e, t) {
|
|
var n = [];
|
|
for (; e; e = e.nextSibling) 1 === e.nodeType && e !== t && n.push(e);
|
|
return n
|
|
}
|
|
});
|
|
|
|
function ft(e, t, n) {
|
|
if (t = t || 0, b.isFunction(t)) return b.grep(e, function (e, r) {
|
|
var i = !!t.call(e, r, e);
|
|
return i === n
|
|
});
|
|
if (t.nodeType) return b.grep(e, function (e) {
|
|
return e === t === n
|
|
});
|
|
if ("string" == typeof t) {
|
|
var r = b.grep(e, function (e) {
|
|
return 1 === e.nodeType
|
|
});
|
|
if (ut.test(t)) return b.filter(t, r, !n);
|
|
t = b.filter(t, r)
|
|
}
|
|
return b.grep(e, function (e) {
|
|
return b.inArray(e, t) >= 0 === n
|
|
})
|
|
}
|
|
|
|
function dt(e) {
|
|
var t = ht.split("|"), n = e.createDocumentFragment();
|
|
if (n.createElement) while (t.length) n.createElement(t.pop());
|
|
return n
|
|
}
|
|
|
|
var ht = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
|
|
gt = / jQuery\d+="(?:null|\d+)"/g, mt = RegExp("<(?:" + ht + ")[\\s/>]", "i"), yt = /^\s+/,
|
|
vt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, bt = /<([\w:]+)/,
|
|
xt = /<tbody/i, wt = /<|&#?\w+;/, Tt = /<(?:script|style|link)/i, Nt = /^(?:checkbox|radio)$/i,
|
|
Ct = /checked\s*(?:[^=]|=\s*.checked.)/i, kt = /^$|\/(?:java|ecma)script/i, Et = /^true\/(.*)/,
|
|
St = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, At = {
|
|
option: [1, "<select multiple='multiple'>", "</select>"],
|
|
legend: [1, "<fieldset>", "</fieldset>"],
|
|
area: [1, "<map>", "</map>"],
|
|
param: [1, "<object>", "</object>"],
|
|
thead: [1, "<table>", "</table>"],
|
|
tr: [2, "<table><tbody>", "</tbody></table>"],
|
|
col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
|
|
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
|
|
_default: b.support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
|
|
}, jt = dt(o), Dt = jt.appendChild(o.createElement("div"));
|
|
At.optgroup = At.option, At.tbody = At.tfoot = At.colgroup = At.caption = At.thead, At.th = At.td, b.fn.extend({
|
|
text: function (e) {
|
|
return b.access(this, function (e) {
|
|
return e === t ? b.text(this) : this.empty().append((this[0] && this[0].ownerDocument || o).createTextNode(e))
|
|
}, null, e, arguments.length)
|
|
}, wrapAll: function (e) {
|
|
if (b.isFunction(e)) return this.each(function (t) {
|
|
b(this).wrapAll(e.call(this, t))
|
|
});
|
|
if (this[0]) {
|
|
var t = b(e, this[0].ownerDocument).eq(0).clone(!0);
|
|
this[0].parentNode && t.insertBefore(this[0]), t.map(function () {
|
|
var e = this;
|
|
while (e.firstChild && 1 === e.firstChild.nodeType) e = e.firstChild;
|
|
return e
|
|
}).append(this)
|
|
}
|
|
return this
|
|
}, wrapInner: function (e) {
|
|
return b.isFunction(e) ? this.each(function (t) {
|
|
b(this).wrapInner(e.call(this, t))
|
|
}) : this.each(function () {
|
|
var t = b(this), n = t.contents();
|
|
n.length ? n.wrapAll(e) : t.append(e)
|
|
})
|
|
}, wrap: function (e) {
|
|
var t = b.isFunction(e);
|
|
return this.each(function (n) {
|
|
b(this).wrapAll(t ? e.call(this, n) : e)
|
|
})
|
|
}, unwrap: function () {
|
|
return this.parent().each(function () {
|
|
b.nodeName(this, "body") || b(this).replaceWith(this.childNodes)
|
|
}).end()
|
|
}, append: function () {
|
|
return this.domManip(arguments, !0, function (e) {
|
|
(1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.appendChild(e)
|
|
})
|
|
}, prepend: function () {
|
|
return this.domManip(arguments, !0, function (e) {
|
|
(1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) && this.insertBefore(e, this.firstChild)
|
|
})
|
|
}, before: function () {
|
|
return this.domManip(arguments, !1, function (e) {
|
|
this.parentNode && this.parentNode.insertBefore(e, this)
|
|
})
|
|
}, after: function () {
|
|
return this.domManip(arguments, !1, function (e) {
|
|
this.parentNode && this.parentNode.insertBefore(e, this.nextSibling)
|
|
})
|
|
}, remove: function (e, t) {
|
|
var n, r = 0;
|
|
for (; null != (n = this[r]); r++) (!e || b.filter(e, [n]).length > 0) && (t || 1 !== n.nodeType || b.cleanData(Ot(n)), n.parentNode && (t && b.contains(n.ownerDocument, n) && Mt(Ot(n, "script")), n.parentNode.removeChild(n)));
|
|
return this
|
|
}, empty: function () {
|
|
var e, t = 0;
|
|
for (; null != (e = this[t]); t++) {
|
|
1 === e.nodeType && b.cleanData(Ot(e, !1));
|
|
while (e.firstChild) e.removeChild(e.firstChild);
|
|
e.options && b.nodeName(e, "select") && (e.options.length = 0)
|
|
}
|
|
return this
|
|
}, clone: function (e, t) {
|
|
return e = null == e ? !1 : e, t = null == t ? e : t, this.map(function () {
|
|
return b.clone(this, e, t)
|
|
})
|
|
}, html: function (e) {
|
|
return b.access(this, function (e) {
|
|
var n = this[0] || {}, r = 0, i = this.length;
|
|
if (e === t) return 1 === n.nodeType ? n.innerHTML.replace(gt, "") : t;
|
|
if (!("string" != typeof e || Tt.test(e) || !b.support.htmlSerialize && mt.test(e) || !b.support.leadingWhitespace && yt.test(e) || At[(bt.exec(e) || ["", ""])[1].toLowerCase()])) {
|
|
e = e.replace(vt, "<$1></$2>");
|
|
try {
|
|
for (; i > r; r++) n = this[r] || {}, 1 === n.nodeType && (b.cleanData(Ot(n, !1)), n.innerHTML = e);
|
|
n = 0
|
|
} catch (o) {
|
|
}
|
|
}
|
|
n && this.empty().append(e)
|
|
}, null, e, arguments.length)
|
|
}, replaceWith: function (e) {
|
|
var t = b.isFunction(e);
|
|
return t || "string" == typeof e || (e = b(e).not(this).detach()), this.domManip([e], !0, function (e) {
|
|
var t = this.nextSibling, n = this.parentNode;
|
|
n && (b(this).remove(), n.insertBefore(e, t))
|
|
})
|
|
}, detach: function (e) {
|
|
return this.remove(e, !0)
|
|
}, domManip: function (e, n, r) {
|
|
e = f.apply([], e);
|
|
var i, o, a, s, u, l, c = 0, p = this.length, d = this, h = p - 1, g = e[0], m = b.isFunction(g);
|
|
if (m || !(1 >= p || "string" != typeof g || b.support.checkClone) && Ct.test(g)) return this.each(function (i) {
|
|
var o = d.eq(i);
|
|
m && (e[0] = g.call(this, i, n ? o.html() : t)), o.domManip(e, n, r)
|
|
});
|
|
if (p && (l = b.buildFragment(e, this[0].ownerDocument, !1, this), i = l.firstChild, 1 === l.childNodes.length && (l = i), i)) {
|
|
for (n = n && b.nodeName(i, "tr"), s = b.map(Ot(l, "script"), Ht), a = s.length; p > c; c++) o = l, c !== h && (o = b.clone(o, !0, !0), a && b.merge(s, Ot(o, "script"))), r.call(n && b.nodeName(this[c], "table") ? Lt(this[c], "tbody") : this[c], o, c);
|
|
if (a) for (u = s[s.length - 1].ownerDocument, b.map(s, qt), c = 0; a > c; c++) o = s[c], kt.test(o.type || "") && !b._data(o, "globalEval") && b.contains(u, o) && (o.src ? b.ajax({
|
|
url: o.src,
|
|
type: "GET",
|
|
dataType: "script",
|
|
async: !1,
|
|
global: !1,
|
|
"throws": !0
|
|
}) : b.globalEval((o.text || o.textContent || o.innerHTML || "").replace(St, "")));
|
|
l = i = null
|
|
}
|
|
return this
|
|
}
|
|
});
|
|
|
|
function Lt(e, t) {
|
|
return e.getElementsByTagName(t)[0] || e.appendChild(e.ownerDocument.createElement(t))
|
|
}
|
|
|
|
function Ht(e) {
|
|
var t = e.getAttributeNode("type");
|
|
return e.type = (t && t.specified) + "/" + e.type, e
|
|
}
|
|
|
|
function qt(e) {
|
|
var t = Et.exec(e.type);
|
|
return t ? e.type = t[1] : e.removeAttribute("type"), e
|
|
}
|
|
|
|
function Mt(e, t) {
|
|
var n, r = 0;
|
|
for (; null != (n = e[r]); r++) b._data(n, "globalEval", !t || b._data(t[r], "globalEval"))
|
|
}
|
|
|
|
function _t(e, t) {
|
|
if (1 === t.nodeType && b.hasData(e)) {
|
|
var n, r, i, o = b._data(e), a = b._data(t, o), s = o.events;
|
|
if (s) {
|
|
delete a.handle, a.events = {};
|
|
for (n in s) for (r = 0, i = s[n].length; i > r; r++) b.event.add(t, n, s[n][r])
|
|
}
|
|
a.data && (a.data = b.extend({}, a.data))
|
|
}
|
|
}
|
|
|
|
function Ft(e, t) {
|
|
var n, r, i;
|
|
if (1 === t.nodeType) {
|
|
if (n = t.nodeName.toLowerCase(), !b.support.noCloneEvent && t[b.expando]) {
|
|
i = b._data(t);
|
|
for (r in i.events) b.removeEvent(t, r, i.handle);
|
|
t.removeAttribute(b.expando)
|
|
}
|
|
"script" === n && t.text !== e.text ? (Ht(t).text = e.text, qt(t)) : "object" === n ? (t.parentNode && (t.outerHTML = e.outerHTML), b.support.html5Clone && e.innerHTML && !b.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : "input" === n && Nt.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : "option" === n ? t.defaultSelected = t.selected = e.defaultSelected : ("input" === n || "textarea" === n) && (t.defaultValue = e.defaultValue)
|
|
}
|
|
}
|
|
|
|
b.each({
|
|
appendTo: "append",
|
|
prependTo: "prepend",
|
|
insertBefore: "before",
|
|
insertAfter: "after",
|
|
replaceAll: "replaceWith"
|
|
}, function (e, t) {
|
|
b.fn[e] = function (e) {
|
|
var n, r = 0, i = [], o = b(e), a = o.length - 1;
|
|
for (; a >= r; r++) n = r === a ? this : this.clone(!0), b(o[r])[t](n), d.apply(i, n.get());
|
|
return this.pushStack(i)
|
|
}
|
|
});
|
|
|
|
function Ot(e, n) {
|
|
var r, o, a = 0,
|
|
s = typeof e.getElementsByTagName !== i ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== i ? e.querySelectorAll(n || "*") : t;
|
|
if (!s) for (s = [], r = e.childNodes || e; null != (o = r[a]); a++) !n || b.nodeName(o, n) ? s.push(o) : b.merge(s, Ot(o, n));
|
|
return n === t || n && b.nodeName(e, n) ? b.merge([e], s) : s
|
|
}
|
|
|
|
function Bt(e) {
|
|
Nt.test(e.type) && (e.defaultChecked = e.checked)
|
|
}
|
|
|
|
b.extend({
|
|
clone: function (e, t, n) {
|
|
var r, i, o, a, s, u = b.contains(e.ownerDocument, e);
|
|
if (b.support.html5Clone || b.isXMLDoc(e) || !mt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (Dt.innerHTML = e.outerHTML, Dt.removeChild(o = Dt.firstChild)), !(b.support.noCloneEvent && b.support.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || b.isXMLDoc(e))) for (r = Ot(o), s = Ot(e), a = 0; null != (i = s[a]); ++a) r[a] && Ft(i, r[a]);
|
|
if (t) if (n) for (s = s || Ot(e), r = r || Ot(o), a = 0; null != (i = s[a]); a++) _t(i, r[a]); else _t(e, o);
|
|
return r = Ot(o, "script"), r.length > 0 && Mt(r, !u && Ot(e, "script")), r = s = i = null, o
|
|
}, buildFragment: function (e, t, n, r) {
|
|
var i, o, a, s, u, l, c, p = e.length, f = dt(t), d = [], h = 0;
|
|
for (; p > h; h++) if (o = e[h], o || 0 === o) if ("object" === b.type(o)) b.merge(d, o.nodeType ? [o] : o); else if (wt.test(o)) {
|
|
s = s || f.appendChild(t.createElement("div")), u = (bt.exec(o) || ["", ""])[1].toLowerCase(), c = At[u] || At._default, s.innerHTML = c[1] + o.replace(vt, "<$1></$2>") + c[2], i = c[0];
|
|
while (i--) s = s.lastChild;
|
|
if (!b.support.leadingWhitespace && yt.test(o) && d.push(t.createTextNode(yt.exec(o)[0])), !b.support.tbody) {
|
|
o = "table" !== u || xt.test(o) ? "<table>" !== c[1] || xt.test(o) ? 0 : s : s.firstChild, i = o && o.childNodes.length;
|
|
while (i--) b.nodeName(l = o.childNodes[i], "tbody") && !l.childNodes.length && o.removeChild(l)
|
|
}
|
|
b.merge(d, s.childNodes), s.textContent = "";
|
|
while (s.firstChild) s.removeChild(s.firstChild);
|
|
s = f.lastChild
|
|
} else d.push(t.createTextNode(o));
|
|
s && f.removeChild(s), b.support.appendChecked || b.grep(Ot(d, "input"), Bt), h = 0;
|
|
while (o = d[h++]) if ((!r || -1 === b.inArray(o, r)) && (a = b.contains(o.ownerDocument, o), s = Ot(f.appendChild(o), "script"), a && Mt(s), n)) {
|
|
i = 0;
|
|
while (o = s[i++]) kt.test(o.type || "") && n.push(o)
|
|
}
|
|
return s = null, f
|
|
}, cleanData: function (e, t) {
|
|
var n, r, o, a, s = 0, u = b.expando, l = b.cache, p = b.support.deleteExpando, f = b.event.special;
|
|
for (; null != (n = e[s]); s++) if ((t || b.acceptData(n)) && (o = n[u], a = o && l[o])) {
|
|
if (a.events) for (r in a.events) f[r] ? b.event.remove(n, r) : b.removeEvent(n, r, a.handle);
|
|
l[o] && (delete l[o], p ? delete n[u] : typeof n.removeAttribute !== i ? n.removeAttribute(u) : n[u] = null, c.push(o))
|
|
}
|
|
}
|
|
});
|
|
var Pt, Rt, Wt, $t = /alpha\([^)]*\)/i, It = /opacity\s*=\s*([^)]*)/, zt = /^(top|right|bottom|left)$/,
|
|
Xt = /^(none|table(?!-c[ea]).+)/, Ut = /^margin/, Vt = RegExp("^(" + x + ")(.*)$", "i"),
|
|
Yt = RegExp("^(" + x + ")(?!px)[a-z%]+$", "i"), Jt = RegExp("^([+-])=(" + x + ")", "i"), Gt = {BODY: "block"},
|
|
Qt = {position: "absolute", visibility: "hidden", display: "block"}, Kt = {letterSpacing: 0, fontWeight: 400},
|
|
Zt = ["Top", "Right", "Bottom", "Left"], en = ["Webkit", "O", "Moz", "ms"];
|
|
|
|
function tn(e, t) {
|
|
if (t in e) return t;
|
|
var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = en.length;
|
|
while (i--) if (t = en[i] + n, t in e) return t;
|
|
return r
|
|
}
|
|
|
|
function nn(e, t) {
|
|
return e = t || e, "none" === b.css(e, "display") || !b.contains(e.ownerDocument, e)
|
|
}
|
|
|
|
function rn(e, t) {
|
|
var n, r, i, o = [], a = 0, s = e.length;
|
|
for (; s > a; a++) r = e[a], r.style && (o[a] = b._data(r, "olddisplay"), n = r.style.display, t ? (o[a] || "none" !== n || (r.style.display = ""), "" === r.style.display && nn(r) && (o[a] = b._data(r, "olddisplay", un(r.nodeName)))) : o[a] || (i = nn(r), (n && "none" !== n || !i) && b._data(r, "olddisplay", i ? n : b.css(r, "display"))));
|
|
for (a = 0; s > a; a++) r = e[a], r.style && (t && "none" !== r.style.display && "" !== r.style.display || (r.style.display = t ? o[a] || "" : "none"));
|
|
return e
|
|
}
|
|
|
|
b.fn.extend({
|
|
css: function (e, n) {
|
|
return b.access(this, function (e, n, r) {
|
|
var i, o, a = {}, s = 0;
|
|
if (b.isArray(n)) {
|
|
for (o = Rt(e), i = n.length; i > s; s++) a[n[s]] = b.css(e, n[s], !1, o);
|
|
return a
|
|
}
|
|
return r !== t ? b.style(e, n, r) : b.css(e, n)
|
|
}, e, n, arguments.length > 1)
|
|
}, show: function () {
|
|
return rn(this, !0)
|
|
}, hide: function () {
|
|
return rn(this)
|
|
}, toggle: function (e) {
|
|
var t = "boolean" == typeof e;
|
|
return this.each(function () {
|
|
(t ? e : nn(this)) ? b(this).show() : b(this).hide()
|
|
})
|
|
}
|
|
}), b.extend({
|
|
cssHooks: {
|
|
opacity: {
|
|
get: function (e, t) {
|
|
if (t) {
|
|
var n = Wt(e, "opacity");
|
|
return "" === n ? "1" : n
|
|
}
|
|
}
|
|
}
|
|
},
|
|
cssNumber: {
|
|
columnCount: !0,
|
|
fillOpacity: !0,
|
|
fontWeight: !0,
|
|
lineHeight: !0,
|
|
opacity: !0,
|
|
orphans: !0,
|
|
widows: !0,
|
|
zIndex: !0,
|
|
zoom: !0
|
|
},
|
|
cssProps: {"float": b.support.cssFloat ? "cssFloat" : "styleFloat"},
|
|
style: function (e, n, r, i) {
|
|
if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) {
|
|
var o, a, s, u = b.camelCase(n), l = e.style;
|
|
if (n = b.cssProps[u] || (b.cssProps[u] = tn(l, u)), s = b.cssHooks[n] || b.cssHooks[u], r === t) return s && "get" in s && (o = s.get(e, !1, i)) !== t ? o : l[n];
|
|
if (a = typeof r, "string" === a && (o = Jt.exec(r)) && (r = (o[1] + 1) * o[2] + parseFloat(b.css(e, n)), a = "number"), !(null == r || "number" === a && isNaN(r) || ("number" !== a || b.cssNumber[u] || (r += "px"), b.support.clearCloneStyle || "" !== r || 0 !== n.indexOf("background") || (l[n] = "inherit"), s && "set" in s && (r = s.set(e, r, i)) === t))) try {
|
|
l[n] = r
|
|
} catch (c) {
|
|
}
|
|
}
|
|
},
|
|
css: function (e, n, r, i) {
|
|
var o, a, s, u = b.camelCase(n);
|
|
return n = b.cssProps[u] || (b.cssProps[u] = tn(e.style, u)), s = b.cssHooks[n] || b.cssHooks[u], s && "get" in s && (a = s.get(e, !0, r)), a === t && (a = Wt(e, n, i)), "normal" === a && n in Kt && (a = Kt[n]), "" === r || r ? (o = parseFloat(a), r === !0 || b.isNumeric(o) ? o || 0 : a) : a
|
|
},
|
|
swap: function (e, t, n, r) {
|
|
var i, o, a = {};
|
|
for (o in t) a[o] = e.style[o], e.style[o] = t[o];
|
|
i = n.apply(e, r || []);
|
|
for (o in t) e.style[o] = a[o];
|
|
return i
|
|
}
|
|
}), e.getComputedStyle ? (Rt = function (t) {
|
|
return e.getComputedStyle(t, null)
|
|
}, Wt = function (e, n, r) {
|
|
var i, o, a, s = r || Rt(e), u = s ? s.getPropertyValue(n) || s[n] : t, l = e.style;
|
|
return s && ("" !== u || b.contains(e.ownerDocument, e) || (u = b.style(e, n)), Yt.test(u) && Ut.test(n) && (i = l.width, o = l.minWidth, a = l.maxWidth, l.minWidth = l.maxWidth = l.width = u, u = s.width, l.width = i, l.minWidth = o, l.maxWidth = a)), u
|
|
}) : o.documentElement.currentStyle && (Rt = function (e) {
|
|
return e.currentStyle
|
|
}, Wt = function (e, n, r) {
|
|
var i, o, a, s = r || Rt(e), u = s ? s[n] : t, l = e.style;
|
|
return null == u && l && l[n] && (u = l[n]), Yt.test(u) && !zt.test(n) && (i = l.left, o = e.runtimeStyle, a = o && o.left, a && (o.left = e.currentStyle.left), l.left = "fontSize" === n ? "1em" : u, u = l.pixelLeft + "px", l.left = i, a && (o.left = a)), "" === u ? "auto" : u
|
|
});
|
|
|
|
function on(e, t, n) {
|
|
var r = Vt.exec(t);
|
|
return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t
|
|
}
|
|
|
|
function an(e, t, n, r, i) {
|
|
var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0, a = 0;
|
|
for (; 4 > o; o += 2) "margin" === n && (a += b.css(e, n + Zt[o], !0, i)), r ? ("content" === n && (a -= b.css(e, "padding" + Zt[o], !0, i)), "margin" !== n && (a -= b.css(e, "border" + Zt[o] + "Width", !0, i))) : (a += b.css(e, "padding" + Zt[o], !0, i), "padding" !== n && (a += b.css(e, "border" + Zt[o] + "Width", !0, i)));
|
|
return a
|
|
}
|
|
|
|
function sn(e, t, n) {
|
|
var r = !0, i = "width" === t ? e.offsetWidth : e.offsetHeight, o = Rt(e),
|
|
a = b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, o);
|
|
if (0 >= i || null == i) {
|
|
if (i = Wt(e, t, o), (0 > i || null == i) && (i = e.style[t]), Yt.test(i)) return i;
|
|
r = a && (b.support.boxSizingReliable || i === e.style[t]), i = parseFloat(i) || 0
|
|
}
|
|
return i + an(e, t, n || (a ? "border" : "content"), r, o) + "px"
|
|
}
|
|
|
|
function un(e) {
|
|
var t = o, n = Gt[e];
|
|
return n || (n = ln(e, t), "none" !== n && n || (Pt = (Pt || b("<iframe frameborder='0' width='0' height='0'/>").css("cssText", "display:block !important")).appendTo(t.documentElement), t = (Pt[0].contentWindow || Pt[0].contentDocument).document, t.write("<!doctype html><html><body>"), t.close(), n = ln(e, t), Pt.detach()), Gt[e] = n), n
|
|
}
|
|
|
|
function ln(e, t) {
|
|
var n = b(t.createElement(e)).appendTo(t.body), r = b.css(n[0], "display");
|
|
return n.remove(), r
|
|
}
|
|
|
|
b.each(["height", "width"], function (e, n) {
|
|
b.cssHooks[n] = {
|
|
get: function (e, r, i) {
|
|
return r ? 0 === e.offsetWidth && Xt.test(b.css(e, "display")) ? b.swap(e, Qt, function () {
|
|
return sn(e, n, i)
|
|
}) : sn(e, n, i) : t
|
|
}, set: function (e, t, r) {
|
|
var i = r && Rt(e);
|
|
return on(e, t, r ? an(e, n, r, b.support.boxSizing && "border-box" === b.css(e, "boxSizing", !1, i), i) : 0)
|
|
}
|
|
}
|
|
}), b.support.opacity || (b.cssHooks.opacity = {
|
|
get: function (e, t) {
|
|
return It.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : ""
|
|
}, set: function (e, t) {
|
|
var n = e.style, r = e.currentStyle, i = b.isNumeric(t) ? "alpha(opacity=" + 100 * t + ")" : "",
|
|
o = r && r.filter || n.filter || "";
|
|
n.zoom = 1, (t >= 1 || "" === t) && "" === b.trim(o.replace($t, "")) && n.removeAttribute && (n.removeAttribute("filter"), "" === t || r && !r.filter) || (n.filter = $t.test(o) ? o.replace($t, i) : o + " " + i)
|
|
}
|
|
}), b(function () {
|
|
b.support.reliableMarginRight || (b.cssHooks.marginRight = {
|
|
get: function (e, n) {
|
|
return n ? b.swap(e, {display: "inline-block"}, Wt, [e, "marginRight"]) : t
|
|
}
|
|
}), !b.support.pixelPosition && b.fn.position && b.each(["top", "left"], function (e, n) {
|
|
b.cssHooks[n] = {
|
|
get: function (e, r) {
|
|
return r ? (r = Wt(e, n), Yt.test(r) ? b(e).position()[n] + "px" : r) : t
|
|
}
|
|
}
|
|
})
|
|
}), b.expr && b.expr.filters && (b.expr.filters.hidden = function (e) {
|
|
return 0 >= e.offsetWidth && 0 >= e.offsetHeight || !b.support.reliableHiddenOffsets && "none" === (e.style && e.style.display || b.css(e, "display"))
|
|
}, b.expr.filters.visible = function (e) {
|
|
return !b.expr.filters.hidden(e)
|
|
}), b.each({margin: "", padding: "", border: "Width"}, function (e, t) {
|
|
b.cssHooks[e + t] = {
|
|
expand: function (n) {
|
|
var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n];
|
|
for (; 4 > r; r++) i[e + Zt[r] + t] = o[r] || o[r - 2] || o[0];
|
|
return i
|
|
}
|
|
}, Ut.test(e) || (b.cssHooks[e + t].set = on)
|
|
});
|
|
var cn = /%20/g, pn = /\[\]$/, fn = /\r?\n/g, dn = /^(?:submit|button|image|reset|file)$/i,
|
|
hn = /^(?:input|select|textarea|keygen)/i;
|
|
b.fn.extend({
|
|
serialize: function () {
|
|
return b.param(this.serializeArray())
|
|
}, serializeArray: function () {
|
|
return this.map(function () {
|
|
var e = b.prop(this, "elements");
|
|
return e ? b.makeArray(e) : this
|
|
}).filter(function () {
|
|
var e = this.type;
|
|
return this.name && !b(this).is(":disabled") && hn.test(this.nodeName) && !dn.test(e) && (this.checked || !Nt.test(e))
|
|
}).map(function (e, t) {
|
|
var n = b(this).val();
|
|
return null == n ? null : b.isArray(n) ? b.map(n, function (e) {
|
|
return {name: t.name, value: e.replace(fn, "\r\n")}
|
|
}) : {name: t.name, value: n.replace(fn, "\r\n")}
|
|
}).get()
|
|
}
|
|
}), b.param = function (e, n) {
|
|
var r, i = [], o = function (e, t) {
|
|
t = b.isFunction(t) ? t() : null == t ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t)
|
|
};
|
|
if (n === t && (n = b.ajaxSettings && b.ajaxSettings.traditional), b.isArray(e) || e.jquery && !b.isPlainObject(e)) b.each(e, function () {
|
|
o(this.name, this.value)
|
|
}); else for (r in e) gn(r, e[r], n, o);
|
|
return i.join("&").replace(cn, "+")
|
|
};
|
|
|
|
function gn(e, t, n, r) {
|
|
var i;
|
|
if (b.isArray(t)) b.each(t, function (t, i) {
|
|
n || pn.test(e) ? r(e, i) : gn(e + "[" + ("object" == typeof i ? t : "") + "]", i, n, r)
|
|
}); else if (n || "object" !== b.type(t)) r(e, t); else for (i in t) gn(e + "[" + i + "]", t[i], n, r)
|
|
}
|
|
|
|
b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function (e, t) {
|
|
b.fn[t] = function (e, n) {
|
|
return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t)
|
|
}
|
|
}), b.fn.hover = function (e, t) {
|
|
return this.mouseenter(e).mouseleave(t || e)
|
|
};
|
|
var mn, yn, vn = b.now(), bn = /\?/, xn = /#.*$/, wn = /([?&])_=[^&]*/, Tn = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm,
|
|
Nn = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Cn = /^(?:GET|HEAD)$/, kn = /^\/\//,
|
|
En = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, Sn = b.fn.load, An = {}, jn = {}, Dn = "*/".concat("*");
|
|
try {
|
|
yn = a.href
|
|
} catch (Ln) {
|
|
yn = o.createElement("a"), yn.href = "", yn = yn.href
|
|
}
|
|
mn = En.exec(yn.toLowerCase()) || [];
|
|
|
|
function Hn(e) {
|
|
return function (t, n) {
|
|
"string" != typeof t && (n = t, t = "*");
|
|
var r, i = 0, o = t.toLowerCase().match(w) || [];
|
|
if (b.isFunction(n)) while (r = o[i++]) "+" === r[0] ? (r = r.slice(1) || "*", (e[r] = e[r] || []).unshift(n)) : (e[r] = e[r] || []).push(n)
|
|
}
|
|
}
|
|
|
|
function qn(e, n, r, i) {
|
|
var o = {}, a = e === jn;
|
|
|
|
function s(u) {
|
|
var l;
|
|
return o[u] = !0, b.each(e[u] || [], function (e, u) {
|
|
var c = u(n, r, i);
|
|
return "string" != typeof c || a || o[c] ? a ? !(l = c) : t : (n.dataTypes.unshift(c), s(c), !1)
|
|
}), l
|
|
}
|
|
|
|
return s(n.dataTypes[0]) || !o["*"] && s("*")
|
|
}
|
|
|
|
function Mn(e, n) {
|
|
var r, i, o = b.ajaxSettings.flatOptions || {};
|
|
for (i in n) n[i] !== t && ((o[i] ? e : r || (r = {}))[i] = n[i]);
|
|
return r && b.extend(!0, e, r), e
|
|
}
|
|
|
|
b.fn.load = function (e, n, r) {
|
|
if ("string" != typeof e && Sn) return Sn.apply(this, arguments);
|
|
var i, o, a, s = this, u = e.indexOf(" ");
|
|
return u >= 0 && (i = e.slice(u, e.length), e = e.slice(0, u)), b.isFunction(n) ? (r = n, n = t) : n && "object" == typeof n && (a = "POST"), s.length > 0 && b.ajax({
|
|
url: e,
|
|
type: a,
|
|
dataType: "html",
|
|
data: n
|
|
}).done(function (e) {
|
|
o = arguments, s.html(i ? b("<div>").append(b.parseHTML(e)).find(i) : e)
|
|
}).complete(r && function (e, t) {
|
|
s.each(r, o || [e.responseText, t, e])
|
|
}), this
|
|
}, b.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) {
|
|
b.fn[t] = function (e) {
|
|
return this.on(t, e)
|
|
}
|
|
}), b.each(["get", "post"], function (e, n) {
|
|
b[n] = function (e, r, i, o) {
|
|
return b.isFunction(r) && (o = o || i, i = r, r = t), b.ajax({
|
|
url: e,
|
|
type: n,
|
|
dataType: o,
|
|
data: r,
|
|
success: i
|
|
})
|
|
}
|
|
}), b.extend({
|
|
active: 0,
|
|
lastModified: {},
|
|
etag: {},
|
|
ajaxSettings: {
|
|
url: yn,
|
|
type: "GET",
|
|
isLocal: Nn.test(mn[1]),
|
|
global: !0,
|
|
processData: !0,
|
|
async: !0,
|
|
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
|
accepts: {
|
|
"*": Dn,
|
|
text: "text/plain",
|
|
html: "text/html",
|
|
xml: "application/xml, text/xml",
|
|
json: "application/json, text/javascript"
|
|
},
|
|
contents: {xml: /xml/, html: /html/, json: /json/},
|
|
responseFields: {xml: "responseXML", text: "responseText"},
|
|
converters: {"* text": e.String, "text html": !0, "text json": b.parseJSON, "text xml": b.parseXML},
|
|
flatOptions: {url: !0, context: !0}
|
|
},
|
|
ajaxSetup: function (e, t) {
|
|
return t ? Mn(Mn(e, b.ajaxSettings), t) : Mn(b.ajaxSettings, e)
|
|
},
|
|
ajaxPrefilter: Hn(An),
|
|
ajaxTransport: Hn(jn),
|
|
ajax: function (e, n) {
|
|
"object" == typeof e && (n = e, e = t), n = n || {};
|
|
var r, i, o, a, s, u, l, c, p = b.ajaxSetup({}, n), f = p.context || p,
|
|
d = p.context && (f.nodeType || f.jquery) ? b(f) : b.event, h = b.Deferred(),
|
|
g = b.Callbacks("once memory"), m = p.statusCode || {}, y = {}, v = {}, x = 0, T = "canceled", N = {
|
|
readyState: 0, getResponseHeader: function (e) {
|
|
var t;
|
|
if (2 === x) {
|
|
if (!c) {
|
|
c = {};
|
|
while (t = Tn.exec(a)) c[t[1].toLowerCase()] = t[2]
|
|
}
|
|
t = c[e.toLowerCase()]
|
|
}
|
|
return null == t ? null : t
|
|
}, getAllResponseHeaders: function () {
|
|
return 2 === x ? a : null
|
|
}, setRequestHeader: function (e, t) {
|
|
var n = e.toLowerCase();
|
|
return x || (e = v[n] = v[n] || e, y[e] = t), this
|
|
}, overrideMimeType: function (e) {
|
|
return x || (p.mimeType = e), this
|
|
}, statusCode: function (e) {
|
|
var t;
|
|
if (e) if (2 > x) for (t in e) m[t] = [m[t], e[t]]; else N.always(e[N.status]);
|
|
return this
|
|
}, abort: function (e) {
|
|
var t = e || T;
|
|
return l && l.abort(t), k(0, t), this
|
|
}
|
|
};
|
|
if (h.promise(N).complete = g.add, N.success = N.done, N.error = N.fail, p.url = ((e || p.url || yn) + "").replace(xn, "").replace(kn, mn[1] + "//"), p.type = n.method || n.type || p.method || p.type, p.dataTypes = b.trim(p.dataType || "*").toLowerCase().match(w) || [""], null == p.crossDomain && (r = En.exec(p.url.toLowerCase()), p.crossDomain = !(!r || r[1] === mn[1] && r[2] === mn[2] && (r[3] || ("http:" === r[1] ? 80 : 443)) == (mn[3] || ("http:" === mn[1] ? 80 : 443)))), p.data && p.processData && "string" != typeof p.data && (p.data = b.param(p.data, p.traditional)), qn(An, p, n, N), 2 === x) return N;
|
|
u = p.global, u && 0 === b.active++ && b.event.trigger("ajaxStart"), p.type = p.type.toUpperCase(), p.hasContent = !Cn.test(p.type), o = p.url, p.hasContent || (p.data && (o = p.url += (bn.test(o) ? "&" : "?") + p.data, delete p.data), p.cache === !1 && (p.url = wn.test(o) ? o.replace(wn, "$1_=" + vn++) : o + (bn.test(o) ? "&" : "?") + "_=" + vn++)), p.ifModified && (b.lastModified[o] && N.setRequestHeader("If-Modified-Since", b.lastModified[o]), b.etag[o] && N.setRequestHeader("If-None-Match", b.etag[o])), (p.data && p.hasContent && p.contentType !== !1 || n.contentType) && N.setRequestHeader("Content-Type", p.contentType), N.setRequestHeader("Accept", p.dataTypes[0] && p.accepts[p.dataTypes[0]] ? p.accepts[p.dataTypes[0]] + ("*" !== p.dataTypes[0] ? ", " + Dn + "; q=0.01" : "") : p.accepts["*"]);
|
|
for (i in p.headers) N.setRequestHeader(i, p.headers[i]);
|
|
if (p.beforeSend && (p.beforeSend.call(f, N, p) === !1 || 2 === x)) return N.abort();
|
|
T = "abort";
|
|
for (i in{success: 1, error: 1, complete: 1}) N[i](p[i]);
|
|
if (l = qn(jn, p, n, N)) {
|
|
N.readyState = 1, u && d.trigger("ajaxSend", [N, p]), p.async && p.timeout > 0 && (s = setTimeout(function () {
|
|
N.abort("timeout")
|
|
}, p.timeout));
|
|
try {
|
|
x = 1, l.send(y, k)
|
|
} catch (C) {
|
|
if (!(2 > x)) throw C;
|
|
k(-1, C)
|
|
}
|
|
} else k(-1, "No Transport");
|
|
|
|
function k(e, n, r, i) {
|
|
var c, y, v, w, T, C = n;
|
|
2 !== x && (x = 2, s && clearTimeout(s), l = t, a = i || "", N.readyState = e > 0 ? 4 : 0, r && (w = _n(p, N, r)), e >= 200 && 300 > e || 304 === e ? (p.ifModified && (T = N.getResponseHeader("Last-Modified"), T && (b.lastModified[o] = T), T = N.getResponseHeader("etag"), T && (b.etag[o] = T)), 204 === e ? (c = !0, C = "nocontent") : 304 === e ? (c = !0, C = "notmodified") : (c = Fn(p, w), C = c.state, y = c.data, v = c.error, c = !v)) : (v = C, (e || !C) && (C = "error", 0 > e && (e = 0))), N.status = e, N.statusText = (n || C) + "", c ? h.resolveWith(f, [y, C, N]) : h.rejectWith(f, [N, C, v]), N.statusCode(m), m = t, u && d.trigger(c ? "ajaxSuccess" : "ajaxError", [N, p, c ? y : v]), g.fireWith(f, [N, C]), u && (d.trigger("ajaxComplete", [N, p]), --b.active || b.event.trigger("ajaxStop")))
|
|
}
|
|
|
|
return N
|
|
},
|
|
getScript: function (e, n) {
|
|
return b.get(e, t, n, "script")
|
|
},
|
|
getJSON: function (e, t, n) {
|
|
return b.get(e, t, n, "json")
|
|
}
|
|
});
|
|
|
|
function _n(e, n, r) {
|
|
var i, o, a, s, u = e.contents, l = e.dataTypes, c = e.responseFields;
|
|
for (s in c) s in r && (n[c[s]] = r[s]);
|
|
while ("*" === l[0]) l.shift(), o === t && (o = e.mimeType || n.getResponseHeader("Content-Type"));
|
|
if (o) for (s in u) if (u[s] && u[s].test(o)) {
|
|
l.unshift(s);
|
|
break
|
|
}
|
|
if (l[0] in r) a = l[0]; else {
|
|
for (s in r) {
|
|
if (!l[0] || e.converters[s + " " + l[0]]) {
|
|
a = s;
|
|
break
|
|
}
|
|
i || (i = s)
|
|
}
|
|
a = a || i
|
|
}
|
|
return a ? (a !== l[0] && l.unshift(a), r[a]) : t
|
|
}
|
|
|
|
function Fn(e, t) {
|
|
var n, r, i, o, a = {}, s = 0, u = e.dataTypes.slice(), l = u[0];
|
|
if (e.dataFilter && (t = e.dataFilter(t, e.dataType)), u[1]) for (i in e.converters) a[i.toLowerCase()] = e.converters[i];
|
|
for (; r = u[++s];) if ("*" !== r) {
|
|
if ("*" !== l && l !== r) {
|
|
if (i = a[l + " " + r] || a["* " + r], !i) for (n in a) if (o = n.split(" "), o[1] === r && (i = a[l + " " + o[0]] || a["* " + o[0]])) {
|
|
i === !0 ? i = a[n] : a[n] !== !0 && (r = o[0], u.splice(s--, 0, r));
|
|
break
|
|
}
|
|
if (i !== !0) if (i && e["throws"]) t = i(t); else try {
|
|
t = i(t)
|
|
} catch (c) {
|
|
return {state: "parsererror", error: i ? c : "No conversion from " + l + " to " + r}
|
|
}
|
|
}
|
|
l = r
|
|
}
|
|
return {state: "success", data: t}
|
|
}
|
|
|
|
b.ajaxSetup({
|
|
accepts: {script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},
|
|
contents: {script: /(?:java|ecma)script/},
|
|
converters: {
|
|
"text script": function (e) {
|
|
return b.globalEval(e), e
|
|
}
|
|
}
|
|
}), b.ajaxPrefilter("script", function (e) {
|
|
e.cache === t && (e.cache = !1), e.crossDomain && (e.type = "GET", e.global = !1)
|
|
}), b.ajaxTransport("script", function (e) {
|
|
if (e.crossDomain) {
|
|
var n, r = o.head || b("head")[0] || o.documentElement;
|
|
return {
|
|
send: function (t, i) {
|
|
n = o.createElement("script"), n.async = !0, e.scriptCharset && (n.charset = e.scriptCharset), n.src = e.url, n.onload = n.onreadystatechange = function (e, t) {
|
|
(t || !n.readyState || /loaded|complete/.test(n.readyState)) && (n.onload = n.onreadystatechange = null, n.parentNode && n.parentNode.removeChild(n), n = null, t || i(200, "success"))
|
|
}, r.insertBefore(n, r.firstChild)
|
|
}, abort: function () {
|
|
n && n.onload(t, !0)
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var On = [], Bn = /(=)\?(?=&|$)|\?\?/;
|
|
b.ajaxSetup({
|
|
jsonp: "callback", jsonpCallback: function () {
|
|
var e = On.pop() || b.expando + "_" + vn++;
|
|
return this[e] = !0, e
|
|
}
|
|
}), b.ajaxPrefilter("json jsonp", function (n, r, i) {
|
|
var o, a, s,
|
|
u = n.jsonp !== !1 && (Bn.test(n.url) ? "url" : "string" == typeof n.data && !(n.contentType || "").indexOf("application/x-www-form-urlencoded") && Bn.test(n.data) && "data");
|
|
return u || "jsonp" === n.dataTypes[0] ? (o = n.jsonpCallback = b.isFunction(n.jsonpCallback) ? n.jsonpCallback() : n.jsonpCallback, u ? n[u] = n[u].replace(Bn, "$1" + o) : n.jsonp !== !1 && (n.url += (bn.test(n.url) ? "&" : "?") + n.jsonp + "=" + o), n.converters["script json"] = function () {
|
|
return s || b.error(o + " was not called"), s[0]
|
|
}, n.dataTypes[0] = "json", a = e[o], e[o] = function () {
|
|
s = arguments
|
|
}, i.always(function () {
|
|
e[o] = a, n[o] && (n.jsonpCallback = r.jsonpCallback, On.push(o)), s && b.isFunction(a) && a(s[0]), s = a = t
|
|
}), "script") : t
|
|
});
|
|
var Pn, Rn, Wn = 0, $n = e.ActiveXObject && function () {
|
|
var e;
|
|
for (e in Pn) Pn[e](t, !0)
|
|
};
|
|
|
|
function In() {
|
|
try {
|
|
return new e.XMLHttpRequest
|
|
} catch (t) {
|
|
}
|
|
}
|
|
|
|
function zn() {
|
|
try {
|
|
return new e.ActiveXObject("Microsoft.XMLHTTP")
|
|
} catch (t) {
|
|
}
|
|
}
|
|
|
|
b.ajaxSettings.xhr = e.ActiveXObject ? function () {
|
|
return !this.isLocal && In() || zn()
|
|
} : In, Rn = b.ajaxSettings.xhr(), b.support.cors = !!Rn && "withCredentials" in Rn, Rn = b.support.ajax = !!Rn, Rn && b.ajaxTransport(function (n) {
|
|
if (!n.crossDomain || b.support.cors) {
|
|
var r;
|
|
return {
|
|
send: function (i, o) {
|
|
var a, s, u = n.xhr();
|
|
if (n.username ? u.open(n.type, n.url, n.async, n.username, n.password) : u.open(n.type, n.url, n.async), n.xhrFields) for (s in n.xhrFields) u[s] = n.xhrFields[s];
|
|
n.mimeType && u.overrideMimeType && u.overrideMimeType(n.mimeType), n.crossDomain || i["X-Requested-With"] || (i["X-Requested-With"] = "XMLHttpRequest");
|
|
try {
|
|
for (s in i) u.setRequestHeader(s, i[s])
|
|
} catch (l) {
|
|
}
|
|
u.send(n.hasContent && n.data || null), r = function (e, i) {
|
|
var s, l, c, p;
|
|
try {
|
|
if (r && (i || 4 === u.readyState)) if (r = t, a && (u.onreadystatechange = b.noop, $n && delete Pn[a]), i) 4 !== u.readyState && u.abort(); else {
|
|
p = {}, s = u.status, l = u.getAllResponseHeaders(), "string" == typeof u.responseText && (p.text = u.responseText);
|
|
try {
|
|
c = u.statusText
|
|
} catch (f) {
|
|
c = ""
|
|
}
|
|
s || !n.isLocal || n.crossDomain ? 1223 === s && (s = 204) : s = p.text ? 200 : 404
|
|
}
|
|
} catch (d) {
|
|
i || o(-1, d)
|
|
}
|
|
p && o(s, c, p, l)
|
|
}, n.async ? 4 === u.readyState ? setTimeout(r) : (a = ++Wn, $n && (Pn || (Pn = {}, b(e).unload($n)), Pn[a] = r), u.onreadystatechange = r) : r()
|
|
}, abort: function () {
|
|
r && r(t, !0)
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var Xn, Un, Vn = /^(?:toggle|show|hide)$/, Yn = RegExp("^(?:([+-])=|)(" + x + ")([a-z%]*)$", "i"),
|
|
Jn = /queueHooks$/, Gn = [nr], Qn = {
|
|
"*": [function (e, t) {
|
|
var n, r, i = this.createTween(e, t), o = Yn.exec(t), a = i.cur(), s = +a || 0, u = 1, l = 20;
|
|
if (o) {
|
|
if (n = +o[2], r = o[3] || (b.cssNumber[e] ? "" : "px"), "px" !== r && s) {
|
|
s = b.css(i.elem, e, !0) || n || 1;
|
|
do u = u || ".5", s /= u, b.style(i.elem, e, s + r); while (u !== (u = i.cur() / a) && 1 !== u && --l)
|
|
}
|
|
i.unit = r, i.start = s, i.end = o[1] ? s + (o[1] + 1) * n : n
|
|
}
|
|
return i
|
|
}]
|
|
};
|
|
|
|
function Kn() {
|
|
return setTimeout(function () {
|
|
Xn = t
|
|
}), Xn = b.now()
|
|
}
|
|
|
|
function Zn(e, t) {
|
|
b.each(t, function (t, n) {
|
|
var r = (Qn[t] || []).concat(Qn["*"]), i = 0, o = r.length;
|
|
for (; o > i; i++) if (r[i].call(e, t, n)) return
|
|
})
|
|
}
|
|
|
|
function er(e, t, n) {
|
|
var r, i, o = 0, a = Gn.length, s = b.Deferred().always(function () {
|
|
delete u.elem
|
|
}), u = function () {
|
|
if (i) return !1;
|
|
var t = Xn || Kn(), n = Math.max(0, l.startTime + l.duration - t), r = n / l.duration || 0, o = 1 - r,
|
|
a = 0, u = l.tweens.length;
|
|
for (; u > a; a++) l.tweens[a].run(o);
|
|
return s.notifyWith(e, [l, o, n]), 1 > o && u ? n : (s.resolveWith(e, [l]), !1)
|
|
}, l = s.promise({
|
|
elem: e,
|
|
props: b.extend({}, t),
|
|
opts: b.extend(!0, {specialEasing: {}}, n),
|
|
originalProperties: t,
|
|
originalOptions: n,
|
|
startTime: Xn || Kn(),
|
|
duration: n.duration,
|
|
tweens: [],
|
|
createTween: function (t, n) {
|
|
var r = b.Tween(e, l.opts, t, n, l.opts.specialEasing[t] || l.opts.easing);
|
|
return l.tweens.push(r), r
|
|
},
|
|
stop: function (t) {
|
|
var n = 0, r = t ? l.tweens.length : 0;
|
|
if (i) return this;
|
|
for (i = !0; r > n; n++) l.tweens[n].run(1);
|
|
return t ? s.resolveWith(e, [l, t]) : s.rejectWith(e, [l, t]), this
|
|
}
|
|
}), c = l.props;
|
|
for (tr(c, l.opts.specialEasing); a > o; o++) if (r = Gn[o].call(l, e, c, l.opts)) return r;
|
|
return Zn(l, c), b.isFunction(l.opts.start) && l.opts.start.call(e, l), b.fx.timer(b.extend(u, {
|
|
elem: e,
|
|
anim: l,
|
|
queue: l.opts.queue
|
|
})), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always)
|
|
}
|
|
|
|
function tr(e, t) {
|
|
var n, r, i, o, a;
|
|
for (i in e) if (r = b.camelCase(i), o = t[r], n = e[i], b.isArray(n) && (o = n[1], n = e[i] = n[0]), i !== r && (e[r] = n, delete e[i]), a = b.cssHooks[r], a && "expand" in a) {
|
|
n = a.expand(n), delete e[r];
|
|
for (i in n) i in e || (e[i] = n[i], t[i] = o)
|
|
} else t[r] = o
|
|
}
|
|
|
|
b.Animation = b.extend(er, {
|
|
tweener: function (e, t) {
|
|
b.isFunction(e) ? (t = e, e = ["*"]) : e = e.split(" ");
|
|
var n, r = 0, i = e.length;
|
|
for (; i > r; r++) n = e[r], Qn[n] = Qn[n] || [], Qn[n].unshift(t)
|
|
}, prefilter: function (e, t) {
|
|
t ? Gn.unshift(e) : Gn.push(e)
|
|
}
|
|
});
|
|
|
|
function nr(e, t, n) {
|
|
var r, i, o, a, s, u, l, c, p, f = this, d = e.style, h = {}, g = [], m = e.nodeType && nn(e);
|
|
n.queue || (c = b._queueHooks(e, "fx"), null == c.unqueued && (c.unqueued = 0, p = c.empty.fire, c.empty.fire = function () {
|
|
c.unqueued || p()
|
|
}), c.unqueued++, f.always(function () {
|
|
f.always(function () {
|
|
c.unqueued--, b.queue(e, "fx").length || c.empty.fire()
|
|
})
|
|
})), 1 === e.nodeType && ("height" in t || "width" in t) && (n.overflow = [d.overflow, d.overflowX, d.overflowY], "inline" === b.css(e, "display") && "none" === b.css(e, "float") && (b.support.inlineBlockNeedsLayout && "inline" !== un(e.nodeName) ? d.zoom = 1 : d.display = "inline-block")), n.overflow && (d.overflow = "hidden", b.support.shrinkWrapBlocks || f.always(function () {
|
|
d.overflow = n.overflow[0], d.overflowX = n.overflow[1], d.overflowY = n.overflow[2]
|
|
}));
|
|
for (i in t) if (a = t[i], Vn.exec(a)) {
|
|
if (delete t[i], u = u || "toggle" === a, a === (m ? "hide" : "show")) continue;
|
|
g.push(i)
|
|
}
|
|
if (o = g.length) {
|
|
s = b._data(e, "fxshow") || b._data(e, "fxshow", {}), "hidden" in s && (m = s.hidden), u && (s.hidden = !m), m ? b(e).show() : f.done(function () {
|
|
b(e).hide()
|
|
}), f.done(function () {
|
|
var t;
|
|
b._removeData(e, "fxshow");
|
|
for (t in h) b.style(e, t, h[t])
|
|
});
|
|
for (i = 0; o > i; i++) r = g[i], l = f.createTween(r, m ? s[r] : 0), h[r] = s[r] || b.style(e, r), r in s || (s[r] = l.start, m && (l.end = l.start, l.start = "width" === r || "height" === r ? 1 : 0))
|
|
}
|
|
}
|
|
|
|
function rr(e, t, n, r, i) {
|
|
return new rr.prototype.init(e, t, n, r, i)
|
|
}
|
|
|
|
b.Tween = rr, rr.prototype = {
|
|
constructor: rr, init: function (e, t, n, r, i, o) {
|
|
this.elem = e, this.prop = n, this.easing = i || "swing", this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (b.cssNumber[n] ? "" : "px")
|
|
}, cur: function () {
|
|
var e = rr.propHooks[this.prop];
|
|
return e && e.get ? e.get(this) : rr.propHooks._default.get(this)
|
|
}, run: function (e) {
|
|
var t, n = rr.propHooks[this.prop];
|
|
return this.pos = t = this.options.duration ? b.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : 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) : rr.propHooks._default.set(this), this
|
|
}
|
|
}, rr.prototype.init.prototype = rr.prototype, rr.propHooks = {
|
|
_default: {
|
|
get: function (e) {
|
|
var t;
|
|
return null == e.elem[e.prop] || e.elem.style && null != e.elem.style[e.prop] ? (t = b.css(e.elem, e.prop, ""), t && "auto" !== t ? t : 0) : e.elem[e.prop]
|
|
}, set: function (e) {
|
|
b.fx.step[e.prop] ? b.fx.step[e.prop](e) : e.elem.style && (null != e.elem.style[b.cssProps[e.prop]] || b.cssHooks[e.prop]) ? b.style(e.elem, e.prop, e.now + e.unit) : e.elem[e.prop] = e.now
|
|
}
|
|
}
|
|
}, rr.propHooks.scrollTop = rr.propHooks.scrollLeft = {
|
|
set: function (e) {
|
|
e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now)
|
|
}
|
|
}, b.each(["toggle", "show", "hide"], function (e, t) {
|
|
var n = b.fn[t];
|
|
b.fn[t] = function (e, r, i) {
|
|
return null == e || "boolean" == typeof e ? n.apply(this, arguments) : this.animate(ir(t, !0), e, r, i)
|
|
}
|
|
}), b.fn.extend({
|
|
fadeTo: function (e, t, n, r) {
|
|
return this.filter(nn).css("opacity", 0).show().end().animate({opacity: t}, e, n, r)
|
|
}, animate: function (e, t, n, r) {
|
|
var i = b.isEmptyObject(e), o = b.speed(t, n, r), a = function () {
|
|
var t = er(this, b.extend({}, e), o);
|
|
a.finish = function () {
|
|
t.stop(!0)
|
|
}, (i || b._data(this, "finish")) && t.stop(!0)
|
|
};
|
|
return a.finish = a, i || o.queue === !1 ? this.each(a) : this.queue(o.queue, a)
|
|
}, stop: function (e, n, r) {
|
|
var i = function (e) {
|
|
var t = e.stop;
|
|
delete e.stop, t(r)
|
|
};
|
|
return "string" != typeof e && (r = n, n = e, e = t), n && e !== !1 && this.queue(e || "fx", []), this.each(function () {
|
|
var t = !0, n = null != e && e + "queueHooks", o = b.timers, a = b._data(this);
|
|
if (n) a[n] && a[n].stop && i(a[n]); else for (n in a) a[n] && a[n].stop && Jn.test(n) && i(a[n]);
|
|
for (n = o.length; n--;) o[n].elem !== this || null != e && o[n].queue !== e || (o[n].anim.stop(r), t = !1, o.splice(n, 1));
|
|
(t || !r) && b.dequeue(this, e)
|
|
})
|
|
}, finish: function (e) {
|
|
return e !== !1 && (e = e || "fx"), this.each(function () {
|
|
var t, n = b._data(this), r = n[e + "queue"], i = n[e + "queueHooks"], o = b.timers,
|
|
a = r ? r.length : 0;
|
|
for (n.finish = !0, b.queue(this, e, []), i && i.cur && i.cur.finish && i.cur.finish.call(this), t = o.length; t--;) o[t].elem === this && o[t].queue === e && (o[t].anim.stop(!0), o.splice(t, 1));
|
|
for (t = 0; a > t; t++) r[t] && r[t].finish && r[t].finish.call(this);
|
|
delete n.finish
|
|
})
|
|
}
|
|
});
|
|
|
|
function ir(e, t) {
|
|
var n, r = {height: e}, i = 0;
|
|
for (t = t ? 1 : 0; 4 > i; i += 2 - t) n = Zt[i], r["margin" + n] = r["padding" + n] = e;
|
|
return t && (r.opacity = r.width = e), r
|
|
}
|
|
|
|
b.each({
|
|
slideDown: ir("show"),
|
|
slideUp: ir("hide"),
|
|
slideToggle: ir("toggle"),
|
|
fadeIn: {opacity: "show"},
|
|
fadeOut: {opacity: "hide"},
|
|
fadeToggle: {opacity: "toggle"}
|
|
}, function (e, t) {
|
|
b.fn[e] = function (e, n, r) {
|
|
return this.animate(t, e, n, r)
|
|
}
|
|
}), b.speed = function (e, t, n) {
|
|
var r = e && "object" == typeof e ? b.extend({}, e) : {
|
|
complete: n || !n && t || b.isFunction(e) && e,
|
|
duration: e,
|
|
easing: n && t || t && !b.isFunction(t) && t
|
|
};
|
|
return r.duration = b.fx.off ? 0 : "number" == typeof r.duration ? r.duration : r.duration in b.fx.speeds ? b.fx.speeds[r.duration] : b.fx.speeds._default, (null == r.queue || r.queue === !0) && (r.queue = "fx"), r.old = r.complete, r.complete = function () {
|
|
b.isFunction(r.old) && r.old.call(this), r.queue && b.dequeue(this, r.queue)
|
|
}, r
|
|
}, b.easing = {
|
|
linear: function (e) {
|
|
return e
|
|
}, swing: function (e) {
|
|
return .5 - Math.cos(e * Math.PI) / 2
|
|
}
|
|
}, b.timers = [], b.fx = rr.prototype.init, b.fx.tick = function () {
|
|
var e, n = b.timers, r = 0;
|
|
for (Xn = b.now(); n.length > r; r++) e = n[r], e() || n[r] !== e || n.splice(r--, 1);
|
|
n.length || b.fx.stop(), Xn = t
|
|
}, b.fx.timer = function (e) {
|
|
e() && b.timers.push(e) && b.fx.start()
|
|
}, b.fx.interval = 13, b.fx.start = function () {
|
|
Un || (Un = setInterval(b.fx.tick, b.fx.interval))
|
|
}, b.fx.stop = function () {
|
|
clearInterval(Un), Un = null
|
|
}, b.fx.speeds = {
|
|
slow: 600,
|
|
fast: 200,
|
|
_default: 400
|
|
}, b.fx.step = {}, b.expr && b.expr.filters && (b.expr.filters.animated = function (e) {
|
|
return b.grep(b.timers, function (t) {
|
|
return e === t.elem
|
|
}).length
|
|
}), b.fn.offset = function (e) {
|
|
if (arguments.length) return e === t ? this : this.each(function (t) {
|
|
b.offset.setOffset(this, e, t)
|
|
});
|
|
var n, r, o = {top: 0, left: 0}, a = this[0], s = a && a.ownerDocument;
|
|
if (s) return n = s.documentElement, b.contains(n, a) ? (typeof a.getBoundingClientRect !== i && (o = a.getBoundingClientRect()), r = or(s), {
|
|
top: o.top + (r.pageYOffset || n.scrollTop) - (n.clientTop || 0),
|
|
left: o.left + (r.pageXOffset || n.scrollLeft) - (n.clientLeft || 0)
|
|
}) : o
|
|
}, b.offset = {
|
|
setOffset: function (e, t, n) {
|
|
var r = b.css(e, "position");
|
|
"static" === r && (e.style.position = "relative");
|
|
var i = b(e), o = i.offset(), a = b.css(e, "top"), s = b.css(e, "left"),
|
|
u = ("absolute" === r || "fixed" === r) && b.inArray("auto", [a, s]) > -1, l = {}, c = {}, p, f;
|
|
u ? (c = i.position(), p = c.top, f = c.left) : (p = parseFloat(a) || 0, f = parseFloat(s) || 0), b.isFunction(t) && (t = t.call(e, n, o)), null != t.top && (l.top = t.top - o.top + p), null != t.left && (l.left = t.left - o.left + f), "using" in t ? t.using.call(e, l) : i.css(l)
|
|
}
|
|
}, b.fn.extend({
|
|
position: function () {
|
|
if (this[0]) {
|
|
var e, t, n = {top: 0, left: 0}, r = this[0];
|
|
return "fixed" === b.css(r, "position") ? t = r.getBoundingClientRect() : (e = this.offsetParent(), t = this.offset(), b.nodeName(e[0], "html") || (n = e.offset()), n.top += b.css(e[0], "borderTopWidth", !0), n.left += b.css(e[0], "borderLeftWidth", !0)), {
|
|
top: t.top - n.top - b.css(r, "marginTop", !0),
|
|
left: t.left - n.left - b.css(r, "marginLeft", !0)
|
|
}
|
|
}
|
|
}, offsetParent: function () {
|
|
return this.map(function () {
|
|
var e = this.offsetParent || o.documentElement;
|
|
while (e && !b.nodeName(e, "html") && "static" === b.css(e, "position")) e = e.offsetParent;
|
|
return e || o.documentElement
|
|
})
|
|
}
|
|
}), b.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function (e, n) {
|
|
var r = /Y/.test(n);
|
|
b.fn[e] = function (i) {
|
|
return b.access(this, function (e, i, o) {
|
|
var a = or(e);
|
|
return o === t ? a ? n in a ? a[n] : a.document.documentElement[i] : e[i] : (a ? a.scrollTo(r ? b(a).scrollLeft() : o, r ? o : b(a).scrollTop()) : e[i] = o, t)
|
|
}, e, i, arguments.length, null)
|
|
}
|
|
});
|
|
|
|
function or(e) {
|
|
return b.isWindow(e) ? e : 9 === e.nodeType ? e.defaultView || e.parentWindow : !1
|
|
}
|
|
|
|
b.each({Height: "height", Width: "width"}, function (e, n) {
|
|
b.each({padding: "inner" + e, content: n, "": "outer" + e}, function (r, i) {
|
|
b.fn[i] = function (i, o) {
|
|
var a = arguments.length && (r || "boolean" != typeof i),
|
|
s = r || (i === !0 || o === !0 ? "margin" : "border");
|
|
return b.access(this, function (n, r, i) {
|
|
var o;
|
|
return b.isWindow(n) ? n.document.documentElement["client" + e] : 9 === n.nodeType ? (o = n.documentElement, Math.max(n.body["scroll" + e], o["scroll" + e], n.body["offset" + e], o["offset" + e], o["client" + e])) : i === t ? b.css(n, r, s) : b.style(n, r, i, s)
|
|
}, n, a ? i : t, a, null)
|
|
}
|
|
})
|
|
}), e.jQuery = e.$ = b, "function" == typeof define && define.amd && define.amd.jQuery && define("jquery", [], function () {
|
|
return b
|
|
})
|
|
})(window);
|
|
/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */
|
|
jQuery.migrateMute === void 0 && (jQuery.migrateMute = !0), function (e, t, n) {
|
|
function r(n) {
|
|
var r = t.console;
|
|
i[n] || (i[n] = !0, e.migrateWarnings.push(n), r && r.warn && !e.migrateMute && (r.warn("JQMIGRATE: " + n), e.migrateTrace && r.trace && r.trace()))
|
|
}
|
|
|
|
function a(t, a, i, o) {
|
|
if (Object.defineProperty) try {
|
|
return Object.defineProperty(t, a, {
|
|
configurable: !0, enumerable: !0, get: function () {
|
|
return r(o), i
|
|
}, set: function (e) {
|
|
r(o), i = e
|
|
}
|
|
}), n
|
|
} catch (s) {
|
|
}
|
|
e._definePropertyBroken = !0, t[a] = i
|
|
}
|
|
|
|
var i = {};
|
|
e.migrateWarnings = [], !e.migrateMute && t.console && t.console.log && t.console.log("JQMIGRATE: Logging is active"), e.migrateTrace === n && (e.migrateTrace = !0), e.migrateReset = function () {
|
|
i = {}, e.migrateWarnings.length = 0
|
|
}, "BackCompat" === document.compatMode && r("jQuery is not compatible with Quirks Mode");
|
|
var o = e("<input/>", {size: 1}).attr("size") && e.attrFn, s = e.attr,
|
|
u = e.attrHooks.value && e.attrHooks.value.get || function () {
|
|
return null
|
|
}, c = e.attrHooks.value && e.attrHooks.value.set || function () {
|
|
return n
|
|
}, l = /^(?:input|button)$/i, d = /^[238]$/,
|
|
p = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
|
f = /^(?:checked|selected)$/i;
|
|
a(e, "attrFn", o || {}, "jQuery.attrFn is deprecated"), e.attr = function (t, a, i, u) {
|
|
var c = a.toLowerCase(), g = t && t.nodeType;
|
|
return u && (4 > s.length && r("jQuery.fn.attr( props, pass ) is deprecated"), t && !d.test(g) && (o ? a in o : e.isFunction(e.fn[a]))) ? e(t)[a](i) : ("type" === a && i !== n && l.test(t.nodeName) && t.parentNode && r("Can't change the 'type' of an input or button in IE 6/7/8"), !e.attrHooks[c] && p.test(c) && (e.attrHooks[c] = {
|
|
get: function (t, r) {
|
|
var a, i = e.prop(t, r);
|
|
return i === !0 || "boolean" != typeof i && (a = t.getAttributeNode(r)) && a.nodeValue !== !1 ? r.toLowerCase() : n
|
|
}, set: function (t, n, r) {
|
|
var a;
|
|
return n === !1 ? e.removeAttr(t, r) : (a = e.propFix[r] || r, a in t && (t[a] = !0), t.setAttribute(r, r.toLowerCase())), r
|
|
}
|
|
}, f.test(c) && r("jQuery.fn.attr('" + c + "') may use property instead of attribute")), s.call(e, t, a, i))
|
|
}, e.attrHooks.value = {
|
|
get: function (e, t) {
|
|
var n = (e.nodeName || "").toLowerCase();
|
|
return "button" === n ? u.apply(this, arguments) : ("input" !== n && "option" !== n && r("jQuery.fn.attr('value') no longer gets properties"), t in e ? e.value : null)
|
|
}, set: function (e, t) {
|
|
var a = (e.nodeName || "").toLowerCase();
|
|
return "button" === a ? c.apply(this, arguments) : ("input" !== a && "option" !== a && r("jQuery.fn.attr('value', val) no longer sets properties"), e.value = t, n)
|
|
}
|
|
};
|
|
var g, h, v = e.fn.init, m = e.parseJSON, y = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
|
|
e.fn.init = function (t, n, a) {
|
|
var i;
|
|
return t && "string" == typeof t && !e.isPlainObject(n) && (i = y.exec(e.trim(t))) && i[0] && ("<" !== t.charAt(0) && r("$(html) HTML strings must start with '<' character"), i[3] && r("$(html) HTML text after last tag is ignored"), "#" === i[0].charAt(0) && (r("HTML string cannot start with a '#' character"), e.error("JQMIGRATE: Invalid selector string (XSS)")), n && n.context && (n = n.context), e.parseHTML) ? v.call(this, e.parseHTML(i[2], n, !0), n, a) : v.apply(this, arguments)
|
|
}, e.fn.init.prototype = e.fn, e.parseJSON = function (e) {
|
|
return e || null === e ? m.apply(this, arguments) : (r("jQuery.parseJSON requires a valid JSON string"), null)
|
|
}, e.uaMatch = function (e) {
|
|
e = e.toLowerCase();
|
|
var t = /(chrome)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+)/.exec(e) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e) || /(msie) ([\w.]+)/.exec(e) || 0 > e.indexOf("compatible") && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e) || [];
|
|
return {browser: t[1] || "", version: t[2] || "0"}
|
|
}, e.browser || (g = e.uaMatch(navigator.userAgent), h = {}, g.browser && (h[g.browser] = !0, h.version = g.version), h.chrome ? h.webkit = !0 : h.webkit && (h.safari = !0), e.browser = h), a(e, "browser", e.browser, "jQuery.browser is deprecated"), e.sub = function () {
|
|
function t(e, n) {
|
|
return new t.fn.init(e, n)
|
|
}
|
|
|
|
e.extend(!0, t, this), t.superclass = this, t.fn = t.prototype = this(), t.fn.constructor = t, t.sub = this.sub, t.fn.init = function (r, a) {
|
|
return a && a instanceof e && !(a instanceof t) && (a = t(a)), e.fn.init.call(this, r, a, n)
|
|
}, t.fn.init.prototype = t.fn;
|
|
var n = t(document);
|
|
return r("jQuery.sub() is deprecated"), t
|
|
}, e.ajaxSetup({converters: {"text json": e.parseJSON}});
|
|
var b = e.fn.data;
|
|
e.fn.data = function (t) {
|
|
var a, i, o = this[0];
|
|
return !o || "events" !== t || 1 !== arguments.length || (a = e.data(o, t), i = e._data(o, t), a !== n && a !== i || i === n) ? b.apply(this, arguments) : (r("Use of jQuery.fn.data('events') is deprecated"), i)
|
|
};
|
|
var j = /\/(java|ecma)script/i, w = e.fn.andSelf || e.fn.addBack;
|
|
e.fn.andSelf = function () {
|
|
return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"), w.apply(this, arguments)
|
|
}, e.clean || (e.clean = function (t, a, i, o) {
|
|
a = a || document, a = !a.nodeType && a[0] || a, a = a.ownerDocument || a, r("jQuery.clean() is deprecated");
|
|
var s, u, c, l, d = [];
|
|
if (e.merge(d, e.buildFragment(t, a).childNodes), i) for (c = function (e) {
|
|
return !e.type || j.test(e.type) ? o ? o.push(e.parentNode ? e.parentNode.removeChild(e) : e) : i.appendChild(e) : n
|
|
}, s = 0; null != (u = d[s]); s++) e.nodeName(u, "script") && c(u) || (i.appendChild(u), u.getElementsByTagName !== n && (l = e.grep(e.merge([], u.getElementsByTagName("script")), c), d.splice.apply(d, [s + 1, 0].concat(l)), s += l.length));
|
|
return d
|
|
});
|
|
var Q = e.event.add, x = e.event.remove, k = e.event.trigger, N = e.fn.toggle, T = e.fn.live, M = e.fn.die,
|
|
S = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess", C = RegExp("\\b(?:" + S + ")\\b"),
|
|
H = /(?:^|\s)hover(\.\S+|)\b/, A = function (t) {
|
|
return "string" != typeof t || e.event.special.hover ? t : (H.test(t) && r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"), t && t.replace(H, "mouseenter$1 mouseleave$1"))
|
|
};
|
|
e.event.props && "attrChange" !== e.event.props[0] && e.event.props.unshift("attrChange", "attrName", "relatedNode", "srcElement"), e.event.dispatch && a(e.event, "handle", e.event.dispatch, "jQuery.event.handle is undocumented and deprecated"), e.event.add = function (e, t, n, a, i) {
|
|
e !== document && C.test(t) && r("AJAX events should be attached to document: " + t), Q.call(this, e, A(t || ""), n, a, i)
|
|
}, e.event.remove = function (e, t, n, r, a) {
|
|
x.call(this, e, A(t) || "", n, r, a)
|
|
}, e.fn.error = function () {
|
|
var e = Array.prototype.slice.call(arguments, 0);
|
|
return r("jQuery.fn.error() is deprecated"), e.splice(0, 0, "error"), arguments.length ? this.bind.apply(this, e) : (this.triggerHandler.apply(this, e), this)
|
|
}, e.fn.toggle = function (t, n) {
|
|
if (!e.isFunction(t) || !e.isFunction(n)) return N.apply(this, arguments);
|
|
r("jQuery.fn.toggle(handler, handler...) is deprecated");
|
|
var a = arguments, i = t.guid || e.guid++, o = 0, s = function (n) {
|
|
var r = (e._data(this, "lastToggle" + t.guid) || 0) % o;
|
|
return e._data(this, "lastToggle" + t.guid, r + 1), n.preventDefault(), a[r].apply(this, arguments) || !1
|
|
};
|
|
for (s.guid = i; a.length > o;) a[o++].guid = i;
|
|
return this.click(s)
|
|
}, e.fn.live = function (t, n, a) {
|
|
return r("jQuery.fn.live() is deprecated"), T ? T.apply(this, arguments) : (e(this.context).on(t, this.selector, n, a), this)
|
|
}, e.fn.die = function (t, n) {
|
|
return r("jQuery.fn.die() is deprecated"), M ? M.apply(this, arguments) : (e(this.context).off(t, this.selector || "**", n), this)
|
|
}, e.event.trigger = function (e, t, n, a) {
|
|
return n || C.test(e) || r("Global events are undocumented and deprecated"), k.call(this, e, t, n || document, a)
|
|
}, e.each(S.split("|"), function (t, n) {
|
|
e.event.special[n] = {
|
|
setup: function () {
|
|
var t = this;
|
|
return t !== document && (e.event.add(document, n + "." + e.guid, function () {
|
|
e.event.trigger(n, null, t, !0)
|
|
}), e._data(this, n, e.guid++)), !1
|
|
}, teardown: function () {
|
|
return this !== document && e.event.remove(document, n + "." + e._data(this, n)), !1
|
|
}
|
|
}
|
|
})
|
|
}(jQuery, window);
|
|
/*! jQuery UI - v1.10.3 - 2013-07-31
|
|
* http://jqueryui.com
|
|
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.sortable.js, jquery.ui.datepicker.js, jquery.ui.slider.js, jquery.ui.effect.js, jquery.ui.effect-slide.js
|
|
* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
|
|
|
|
(function (e, t) {
|
|
function i(t, i) {
|
|
var a, n, r, o = t.nodeName.toLowerCase();
|
|
return "area" === o ? (a = t.parentNode, n = a.name, t.href && n && "map" === a.nodeName.toLowerCase() ? (r = e("img[usemap=#" + n + "]")[0], !!r && s(r)) : !1) : (/input|select|textarea|button|object/.test(o) ? !t.disabled : "a" === o ? t.href || i : i) && s(t)
|
|
}
|
|
|
|
function s(t) {
|
|
return e.expr.filters.visible(t) && !e(t).parents().addBack().filter(function () {
|
|
return "hidden" === e.css(this, "visibility")
|
|
}).length
|
|
}
|
|
|
|
var a = 0, n = /^ui-id-\d+$/;
|
|
e.ui = e.ui || {}, e.extend(e.ui, {
|
|
version: "1.10.3",
|
|
keyCode: {
|
|
BACKSPACE: 8,
|
|
COMMA: 188,
|
|
DELETE: 46,
|
|
DOWN: 40,
|
|
END: 35,
|
|
ENTER: 13,
|
|
ESCAPE: 27,
|
|
HOME: 36,
|
|
LEFT: 37,
|
|
NUMPAD_ADD: 107,
|
|
NUMPAD_DECIMAL: 110,
|
|
NUMPAD_DIVIDE: 111,
|
|
NUMPAD_ENTER: 108,
|
|
NUMPAD_MULTIPLY: 106,
|
|
NUMPAD_SUBTRACT: 109,
|
|
PAGE_DOWN: 34,
|
|
PAGE_UP: 33,
|
|
PERIOD: 190,
|
|
RIGHT: 39,
|
|
SPACE: 32,
|
|
TAB: 9,
|
|
UP: 38
|
|
}
|
|
}), e.fn.extend({
|
|
focus: function (t) {
|
|
return function (i, s) {
|
|
return "number" == typeof i ? this.each(function () {
|
|
var t = this;
|
|
setTimeout(function () {
|
|
e(t).focus(), s && s.call(t)
|
|
}, i)
|
|
}) : t.apply(this, arguments)
|
|
}
|
|
}(e.fn.focus), scrollParent: function () {
|
|
var t;
|
|
return t = e.ui.ie && /(static|relative)/.test(this.css("position")) || /absolute/.test(this.css("position")) ? this.parents().filter(function () {
|
|
return /(relative|absolute|fixed)/.test(e.css(this, "position")) && /(auto|scroll)/.test(e.css(this, "overflow") + e.css(this, "overflow-y") + e.css(this, "overflow-x"))
|
|
}).eq(0) : this.parents().filter(function () {
|
|
return /(auto|scroll)/.test(e.css(this, "overflow") + e.css(this, "overflow-y") + e.css(this, "overflow-x"))
|
|
}).eq(0), /fixed/.test(this.css("position")) || !t.length ? e(document) : t
|
|
}, zIndex: function (i) {
|
|
if (i !== t) return this.css("zIndex", i);
|
|
if (this.length) for (var s, a, n = e(this[0]); n.length && n[0] !== document;) {
|
|
if (s = n.css("position"), ("absolute" === s || "relative" === s || "fixed" === s) && (a = parseInt(n.css("zIndex"), 10), !isNaN(a) && 0 !== a)) return a;
|
|
n = n.parent()
|
|
}
|
|
return 0
|
|
}, uniqueId: function () {
|
|
return this.each(function () {
|
|
this.id || (this.id = "ui-id-" + ++a)
|
|
})
|
|
}, removeUniqueId: function () {
|
|
return this.each(function () {
|
|
n.test(this.id) && e(this).removeAttr("id")
|
|
})
|
|
}
|
|
}), e.extend(e.expr[":"], {
|
|
data: e.expr.createPseudo ? e.expr.createPseudo(function (t) {
|
|
return function (i) {
|
|
return !!e.data(i, t)
|
|
}
|
|
}) : function (t, i, s) {
|
|
return !!e.data(t, s[3])
|
|
}, focusable: function (t) {
|
|
return i(t, !isNaN(e.attr(t, "tabindex")))
|
|
}, tabbable: function (t) {
|
|
var s = e.attr(t, "tabindex"), a = isNaN(s);
|
|
return (a || s >= 0) && i(t, !a)
|
|
}
|
|
}), e("<a>").outerWidth(1).jquery || e.each(["Width", "Height"], function (i, s) {
|
|
function a(t, i, s, a) {
|
|
return e.each(n, function () {
|
|
i -= parseFloat(e.css(t, "padding" + this)) || 0, s && (i -= parseFloat(e.css(t, "border" + this + "Width")) || 0), a && (i -= parseFloat(e.css(t, "margin" + this)) || 0)
|
|
}), i
|
|
}
|
|
|
|
var n = "Width" === s ? ["Left", "Right"] : ["Top", "Bottom"], r = s.toLowerCase(), o = {
|
|
innerWidth: e.fn.innerWidth,
|
|
innerHeight: e.fn.innerHeight,
|
|
outerWidth: e.fn.outerWidth,
|
|
outerHeight: e.fn.outerHeight
|
|
};
|
|
e.fn["inner" + s] = function (i) {
|
|
return i === t ? o["inner" + s].call(this) : this.each(function () {
|
|
e(this).css(r, a(this, i) + "px")
|
|
})
|
|
}, e.fn["outer" + s] = function (t, i) {
|
|
return "number" != typeof t ? o["outer" + s].call(this, t) : this.each(function () {
|
|
e(this).css(r, a(this, t, !0, i) + "px")
|
|
})
|
|
}
|
|
}), e.fn.addBack || (e.fn.addBack = function (e) {
|
|
return this.add(null == e ? this.prevObject : this.prevObject.filter(e))
|
|
}), e("<a>").data("a-b", "a").removeData("a-b").data("a-b") && (e.fn.removeData = function (t) {
|
|
return function (i) {
|
|
return arguments.length ? t.call(this, e.camelCase(i)) : t.call(this)
|
|
}
|
|
}(e.fn.removeData)), e.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()), e.support.selectstart = "onselectstart" in document.createElement("div"), e.fn.extend({
|
|
disableSelection: function () {
|
|
return this.bind((e.support.selectstart ? "selectstart" : "mousedown") + ".ui-disableSelection", function (e) {
|
|
e.preventDefault()
|
|
})
|
|
}, enableSelection: function () {
|
|
return this.unbind(".ui-disableSelection")
|
|
}
|
|
}), e.extend(e.ui, {
|
|
plugin: {
|
|
add: function (t, i, s) {
|
|
var a, n = e.ui[t].prototype;
|
|
for (a in s) n.plugins[a] = n.plugins[a] || [], n.plugins[a].push([i, s[a]])
|
|
}, call: function (e, t, i) {
|
|
var s, a = e.plugins[t];
|
|
if (a && e.element[0].parentNode && 11 !== e.element[0].parentNode.nodeType) for (s = 0; a.length > s; s++) e.options[a[s][0]] && a[s][1].apply(e.element, i)
|
|
}
|
|
}, hasScroll: function (t, i) {
|
|
if ("hidden" === e(t).css("overflow")) return !1;
|
|
var s = i && "left" === i ? "scrollLeft" : "scrollTop", a = !1;
|
|
return t[s] > 0 ? !0 : (t[s] = 1, a = t[s] > 0, t[s] = 0, a)
|
|
}
|
|
})
|
|
})(jQuery);
|
|
(function (e, t) {
|
|
var i = 0, s = Array.prototype.slice, n = e.cleanData;
|
|
e.cleanData = function (t) {
|
|
for (var i, s = 0; null != (i = t[s]); s++) try {
|
|
e(i).triggerHandler("remove")
|
|
} catch (a) {
|
|
}
|
|
n(t)
|
|
}, e.widget = function (i, s, n) {
|
|
var a, r, o, h, l = {}, u = i.split(".")[0];
|
|
i = i.split(".")[1], a = u + "-" + i, n || (n = s, s = e.Widget), e.expr[":"][a.toLowerCase()] = function (t) {
|
|
return !!e.data(t, a)
|
|
}, e[u] = e[u] || {}, r = e[u][i], o = e[u][i] = function (e, i) {
|
|
return this._createWidget ? (arguments.length && this._createWidget(e, i), t) : new o(e, i)
|
|
}, e.extend(o, r, {
|
|
version: n.version,
|
|
_proto: e.extend({}, n),
|
|
_childConstructors: []
|
|
}), h = new s, h.options = e.widget.extend({}, h.options), e.each(n, function (i, n) {
|
|
return e.isFunction(n) ? (l[i] = function () {
|
|
var e = function () {
|
|
return s.prototype[i].apply(this, arguments)
|
|
}, t = function (e) {
|
|
return s.prototype[i].apply(this, e)
|
|
};
|
|
return function () {
|
|
var i, s = this._super, a = this._superApply;
|
|
return this._super = e, this._superApply = t, i = n.apply(this, arguments), this._super = s, this._superApply = a, i
|
|
}
|
|
}(), t) : (l[i] = n, t)
|
|
}), o.prototype = e.widget.extend(h, {widgetEventPrefix: r ? h.widgetEventPrefix : i}, l, {
|
|
constructor: o,
|
|
namespace: u,
|
|
widgetName: i,
|
|
widgetFullName: a
|
|
}), r ? (e.each(r._childConstructors, function (t, i) {
|
|
var s = i.prototype;
|
|
e.widget(s.namespace + "." + s.widgetName, o, i._proto)
|
|
}), delete r._childConstructors) : s._childConstructors.push(o), e.widget.bridge(i, o)
|
|
}, e.widget.extend = function (i) {
|
|
for (var n, a, r = s.call(arguments, 1), o = 0, h = r.length; h > o; o++) for (n in r[o]) a = r[o][n], r[o].hasOwnProperty(n) && a !== t && (i[n] = e.isPlainObject(a) ? e.isPlainObject(i[n]) ? e.widget.extend({}, i[n], a) : e.widget.extend({}, a) : a);
|
|
return i
|
|
}, e.widget.bridge = function (i, n) {
|
|
var a = n.prototype.widgetFullName || i;
|
|
e.fn[i] = function (r) {
|
|
var o = "string" == typeof r, h = s.call(arguments, 1), l = this;
|
|
return r = !o && h.length ? e.widget.extend.apply(null, [r].concat(h)) : r, o ? this.each(function () {
|
|
var s, n = e.data(this, a);
|
|
return n ? e.isFunction(n[r]) && "_" !== r.charAt(0) ? (s = n[r].apply(n, h), s !== n && s !== t ? (l = s && s.jquery ? l.pushStack(s.get()) : s, !1) : t) : e.error("no such method '" + r + "' for " + i + " widget instance") : e.error("cannot call methods on " + i + " prior to initialization; " + "attempted to call method '" + r + "'")
|
|
}) : this.each(function () {
|
|
var t = e.data(this, a);
|
|
t ? t.option(r || {})._init() : e.data(this, a, new n(r, this))
|
|
}), l
|
|
}
|
|
}, e.Widget = function () {
|
|
}, e.Widget._childConstructors = [], e.Widget.prototype = {
|
|
widgetName: "widget",
|
|
widgetEventPrefix: "",
|
|
defaultElement: "<div>",
|
|
options: {disabled: !1, create: null},
|
|
_createWidget: function (t, s) {
|
|
s = e(s || this.defaultElement || this)[0], this.element = e(s), this.uuid = i++, this.eventNamespace = "." + this.widgetName + this.uuid, this.options = e.widget.extend({}, this.options, this._getCreateOptions(), t), this.bindings = e(), this.hoverable = e(), this.focusable = e(), s !== this && (e.data(s, this.widgetFullName, this), this._on(!0, this.element, {
|
|
remove: function (e) {
|
|
e.target === s && this.destroy()
|
|
}
|
|
}), this.document = e(s.style ? s.ownerDocument : s.document || s), this.window = e(this.document[0].defaultView || this.document[0].parentWindow)), this._create(), this._trigger("create", null, this._getCreateEventData()), this._init()
|
|
},
|
|
_getCreateOptions: e.noop,
|
|
_getCreateEventData: e.noop,
|
|
_create: e.noop,
|
|
_init: e.noop,
|
|
destroy: function () {
|
|
this._destroy(), this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)), this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName + "-disabled " + "ui-state-disabled"), this.bindings.unbind(this.eventNamespace), this.hoverable.removeClass("ui-state-hover"), this.focusable.removeClass("ui-state-focus")
|
|
},
|
|
_destroy: e.noop,
|
|
widget: function () {
|
|
return this.element
|
|
},
|
|
option: function (i, s) {
|
|
var n, a, r, o = i;
|
|
if (0 === arguments.length) return e.widget.extend({}, this.options);
|
|
if ("string" == typeof i) if (o = {}, n = i.split("."), i = n.shift(), n.length) {
|
|
for (a = o[i] = e.widget.extend({}, this.options[i]), r = 0; n.length - 1 > r; r++) a[n[r]] = a[n[r]] || {}, a = a[n[r]];
|
|
if (i = n.pop(), s === t) return a[i] === t ? null : a[i];
|
|
a[i] = s
|
|
} else {
|
|
if (s === t) return this.options[i] === t ? null : this.options[i];
|
|
o[i] = s
|
|
}
|
|
return this._setOptions(o), this
|
|
},
|
|
_setOptions: function (e) {
|
|
var t;
|
|
for (t in e) this._setOption(t, e[t]);
|
|
return this
|
|
},
|
|
_setOption: function (e, t) {
|
|
return this.options[e] = t, "disabled" === e && (this.widget().toggleClass(this.widgetFullName + "-disabled ui-state-disabled", !!t).attr("aria-disabled", t), this.hoverable.removeClass("ui-state-hover"), this.focusable.removeClass("ui-state-focus")), this
|
|
},
|
|
enable: function () {
|
|
return this._setOption("disabled", !1)
|
|
},
|
|
disable: function () {
|
|
return this._setOption("disabled", !0)
|
|
},
|
|
_on: function (i, s, n) {
|
|
var a, r = this;
|
|
"boolean" != typeof i && (n = s, s = i, i = !1), n ? (s = a = e(s), this.bindings = this.bindings.add(s)) : (n = s, s = this.element, a = this.widget()), e.each(n, function (n, o) {
|
|
function h() {
|
|
return i || r.options.disabled !== !0 && !e(this).hasClass("ui-state-disabled") ? ("string" == typeof o ? r[o] : o).apply(r, arguments) : t
|
|
}
|
|
|
|
"string" != typeof o && (h.guid = o.guid = o.guid || h.guid || e.guid++);
|
|
var l = n.match(/^(\w+)\s*(.*)$/), u = l[1] + r.eventNamespace, c = l[2];
|
|
c ? a.delegate(c, u, h) : s.bind(u, h)
|
|
})
|
|
},
|
|
_off: function (e, t) {
|
|
t = (t || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace, e.unbind(t).undelegate(t)
|
|
},
|
|
_delay: function (e, t) {
|
|
function i() {
|
|
return ("string" == typeof e ? s[e] : e).apply(s, arguments)
|
|
}
|
|
|
|
var s = this;
|
|
return setTimeout(i, t || 0)
|
|
},
|
|
_hoverable: function (t) {
|
|
this.hoverable = this.hoverable.add(t), this._on(t, {
|
|
mouseenter: function (t) {
|
|
e(t.currentTarget).addClass("ui-state-hover")
|
|
}, mouseleave: function (t) {
|
|
e(t.currentTarget).removeClass("ui-state-hover")
|
|
}
|
|
})
|
|
},
|
|
_focusable: function (t) {
|
|
this.focusable = this.focusable.add(t), this._on(t, {
|
|
focusin: function (t) {
|
|
e(t.currentTarget).addClass("ui-state-focus")
|
|
}, focusout: function (t) {
|
|
e(t.currentTarget).removeClass("ui-state-focus")
|
|
}
|
|
})
|
|
},
|
|
_trigger: function (t, i, s) {
|
|
var n, a, r = this.options[t];
|
|
if (s = s || {}, i = e.Event(i), i.type = (t === this.widgetEventPrefix ? t : this.widgetEventPrefix + t).toLowerCase(), i.target = this.element[0], a = i.originalEvent) for (n in a) n in i || (i[n] = a[n]);
|
|
return this.element.trigger(i, s), !(e.isFunction(r) && r.apply(this.element[0], [i].concat(s)) === !1 || i.isDefaultPrevented())
|
|
}
|
|
}, e.each({show: "fadeIn", hide: "fadeOut"}, function (t, i) {
|
|
e.Widget.prototype["_" + t] = function (s, n, a) {
|
|
"string" == typeof n && (n = {effect: n});
|
|
var r, o = n ? n === !0 || "number" == typeof n ? i : n.effect || i : t;
|
|
n = n || {}, "number" == typeof n && (n = {duration: n}), r = !e.isEmptyObject(n), n.complete = a, n.delay && s.delay(n.delay), r && e.effects && e.effects.effect[o] ? s[t](n) : o !== t && s[o] ? s[o](n.duration, n.easing, a) : s.queue(function (i) {
|
|
e(this)[t](), a && a.call(s[0]), i()
|
|
})
|
|
}
|
|
})
|
|
})(jQuery);
|
|
(function (e) {
|
|
var t = !1;
|
|
e(document).mouseup(function () {
|
|
t = !1
|
|
}), e.widget("ui.mouse", {
|
|
version: "1.10.3",
|
|
options: {cancel: "input,textarea,button,select,option", distance: 1, delay: 0},
|
|
_mouseInit: function () {
|
|
var t = this;
|
|
this.element.bind("mousedown." + this.widgetName, function (e) {
|
|
return t._mouseDown(e)
|
|
}).bind("click." + this.widgetName, function (i) {
|
|
return !0 === e.data(i.target, t.widgetName + ".preventClickEvent") ? (e.removeData(i.target, t.widgetName + ".preventClickEvent"), i.stopImmediatePropagation(), !1) : undefined
|
|
}), this.started = !1
|
|
},
|
|
_mouseDestroy: function () {
|
|
this.element.unbind("." + this.widgetName), this._mouseMoveDelegate && e(document).unbind("mousemove." + this.widgetName, this._mouseMoveDelegate).unbind("mouseup." + this.widgetName, this._mouseUpDelegate)
|
|
},
|
|
_mouseDown: function (i) {
|
|
if (!t) {
|
|
this._mouseStarted && this._mouseUp(i), this._mouseDownEvent = i;
|
|
var s = this, n = 1 === i.which,
|
|
a = "string" == typeof this.options.cancel && i.target.nodeName ? e(i.target).closest(this.options.cancel).length : !1;
|
|
return n && !a && this._mouseCapture(i) ? (this.mouseDelayMet = !this.options.delay, this.mouseDelayMet || (this._mouseDelayTimer = setTimeout(function () {
|
|
s.mouseDelayMet = !0
|
|
}, this.options.delay)), this._mouseDistanceMet(i) && this._mouseDelayMet(i) && (this._mouseStarted = this._mouseStart(i) !== !1, !this._mouseStarted) ? (i.preventDefault(), !0) : (!0 === e.data(i.target, this.widgetName + ".preventClickEvent") && e.removeData(i.target, this.widgetName + ".preventClickEvent"), this._mouseMoveDelegate = function (e) {
|
|
return s._mouseMove(e)
|
|
}, this._mouseUpDelegate = function (e) {
|
|
return s._mouseUp(e)
|
|
}, e(document).bind("mousemove." + this.widgetName, this._mouseMoveDelegate).bind("mouseup." + this.widgetName, this._mouseUpDelegate), i.preventDefault(), t = !0, !0)) : !0
|
|
}
|
|
},
|
|
_mouseMove: function (t) {
|
|
return e.ui.ie && (!document.documentMode || 9 > document.documentMode) && !t.button ? this._mouseUp(t) : this._mouseStarted ? (this._mouseDrag(t), t.preventDefault()) : (this._mouseDistanceMet(t) && this._mouseDelayMet(t) && (this._mouseStarted = this._mouseStart(this._mouseDownEvent, t) !== !1, this._mouseStarted ? this._mouseDrag(t) : this._mouseUp(t)), !this._mouseStarted)
|
|
},
|
|
_mouseUp: function (t) {
|
|
return e(document).unbind("mousemove." + this.widgetName, this._mouseMoveDelegate).unbind("mouseup." + this.widgetName, this._mouseUpDelegate), this._mouseStarted && (this._mouseStarted = !1, t.target === this._mouseDownEvent.target && e.data(t.target, this.widgetName + ".preventClickEvent", !0), this._mouseStop(t)), !1
|
|
},
|
|
_mouseDistanceMet: function (e) {
|
|
return Math.max(Math.abs(this._mouseDownEvent.pageX - e.pageX), Math.abs(this._mouseDownEvent.pageY - e.pageY)) >= this.options.distance
|
|
},
|
|
_mouseDelayMet: function () {
|
|
return this.mouseDelayMet
|
|
},
|
|
_mouseStart: function () {
|
|
},
|
|
_mouseDrag: function () {
|
|
},
|
|
_mouseStop: function () {
|
|
},
|
|
_mouseCapture: function () {
|
|
return !0
|
|
}
|
|
})
|
|
})(jQuery);
|
|
(function (t, e) {
|
|
function i(t, e, i) {
|
|
return [parseFloat(t[0]) * (p.test(t[0]) ? e / 100 : 1), parseFloat(t[1]) * (p.test(t[1]) ? i / 100 : 1)]
|
|
}
|
|
|
|
function s(e, i) {
|
|
return parseInt(t.css(e, i), 10) || 0
|
|
}
|
|
|
|
function n(e) {
|
|
var i = e[0];
|
|
return 9 === i.nodeType ? {
|
|
width: e.width(),
|
|
height: e.height(),
|
|
offset: {top: 0, left: 0}
|
|
} : t.isWindow(i) ? {
|
|
width: e.width(),
|
|
height: e.height(),
|
|
offset: {top: e.scrollTop(), left: e.scrollLeft()}
|
|
} : i.preventDefault ? {width: 0, height: 0, offset: {top: i.pageY, left: i.pageX}} : {
|
|
width: e.outerWidth(),
|
|
height: e.outerHeight(),
|
|
offset: e.offset()
|
|
}
|
|
}
|
|
|
|
t.ui = t.ui || {};
|
|
var a, o = Math.max, r = Math.abs, h = Math.round, l = /left|center|right/, c = /top|center|bottom/,
|
|
u = /[\+\-]\d+(\.[\d]+)?%?/, d = /^\w+/, p = /%$/, f = t.fn.position;
|
|
t.position = {
|
|
scrollbarWidth: function () {
|
|
if (a !== e) return a;
|
|
var i, s,
|
|
n = t("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),
|
|
o = n.children()[0];
|
|
return t("body").append(n), i = o.offsetWidth, n.css("overflow", "scroll"), s = o.offsetWidth, i === s && (s = n[0].clientWidth), n.remove(), a = i - s
|
|
}, getScrollInfo: function (e) {
|
|
var i = e.isWindow ? "" : e.element.css("overflow-x"), s = e.isWindow ? "" : e.element.css("overflow-y"),
|
|
n = "scroll" === i || "auto" === i && e.width < e.element[0].scrollWidth,
|
|
a = "scroll" === s || "auto" === s && e.height < e.element[0].scrollHeight;
|
|
return {width: a ? t.position.scrollbarWidth() : 0, height: n ? t.position.scrollbarWidth() : 0}
|
|
}, getWithinInfo: function (e) {
|
|
var i = t(e || window), s = t.isWindow(i[0]);
|
|
return {
|
|
element: i,
|
|
isWindow: s,
|
|
offset: i.offset() || {left: 0, top: 0},
|
|
scrollLeft: i.scrollLeft(),
|
|
scrollTop: i.scrollTop(),
|
|
width: s ? i.width() : i.outerWidth(),
|
|
height: s ? i.height() : i.outerHeight()
|
|
}
|
|
}
|
|
}, t.fn.position = function (e) {
|
|
if (!e || !e.of) return f.apply(this, arguments);
|
|
e = t.extend({}, e);
|
|
var a, p, m, g, v, b, _ = t(e.of), y = t.position.getWithinInfo(e.within), w = t.position.getScrollInfo(y),
|
|
x = (e.collision || "flip").split(" "), k = {};
|
|
return b = n(_), _[0].preventDefault && (e.at = "left top"), p = b.width, m = b.height, g = b.offset, v = t.extend({}, g), t.each(["my", "at"], function () {
|
|
var t, i, s = (e[this] || "").split(" ");
|
|
1 === s.length && (s = l.test(s[0]) ? s.concat(["center"]) : c.test(s[0]) ? ["center"].concat(s) : ["center", "center"]), s[0] = l.test(s[0]) ? s[0] : "center", s[1] = c.test(s[1]) ? s[1] : "center", t = u.exec(s[0]), i = u.exec(s[1]), k[this] = [t ? t[0] : 0, i ? i[0] : 0], e[this] = [d.exec(s[0])[0], d.exec(s[1])[0]]
|
|
}), 1 === x.length && (x[1] = x[0]), "right" === e.at[0] ? v.left += p : "center" === e.at[0] && (v.left += p / 2), "bottom" === e.at[1] ? v.top += m : "center" === e.at[1] && (v.top += m / 2), a = i(k.at, p, m), v.left += a[0], v.top += a[1], this.each(function () {
|
|
var n, l, c = t(this), u = c.outerWidth(), d = c.outerHeight(), f = s(this, "marginLeft"),
|
|
b = s(this, "marginTop"), D = u + f + s(this, "marginRight") + w.width,
|
|
T = d + b + s(this, "marginBottom") + w.height, C = t.extend({}, v),
|
|
M = i(k.my, c.outerWidth(), c.outerHeight());
|
|
"right" === e.my[0] ? C.left -= u : "center" === e.my[0] && (C.left -= u / 2), "bottom" === e.my[1] ? C.top -= d : "center" === e.my[1] && (C.top -= d / 2), C.left += M[0], C.top += M[1], t.support.offsetFractions || (C.left = h(C.left), C.top = h(C.top)), n = {
|
|
marginLeft: f,
|
|
marginTop: b
|
|
}, t.each(["left", "top"], function (i, s) {
|
|
t.ui.position[x[i]] && t.ui.position[x[i]][s](C, {
|
|
targetWidth: p,
|
|
targetHeight: m,
|
|
elemWidth: u,
|
|
elemHeight: d,
|
|
collisionPosition: n,
|
|
collisionWidth: D,
|
|
collisionHeight: T,
|
|
offset: [a[0] + M[0], a[1] + M[1]],
|
|
my: e.my,
|
|
at: e.at,
|
|
within: y,
|
|
elem: c
|
|
})
|
|
}), e.using && (l = function (t) {
|
|
var i = g.left - C.left, s = i + p - u, n = g.top - C.top, a = n + m - d, h = {
|
|
target: {element: _, left: g.left, top: g.top, width: p, height: m},
|
|
element: {element: c, left: C.left, top: C.top, width: u, height: d},
|
|
horizontal: 0 > s ? "left" : i > 0 ? "right" : "center",
|
|
vertical: 0 > a ? "top" : n > 0 ? "bottom" : "middle"
|
|
};
|
|
u > p && p > r(i + s) && (h.horizontal = "center"), d > m && m > r(n + a) && (h.vertical = "middle"), h.important = o(r(i), r(s)) > o(r(n), r(a)) ? "horizontal" : "vertical", e.using.call(this, t, h)
|
|
}), c.offset(t.extend(C, {using: l}))
|
|
})
|
|
}, t.ui.position = {
|
|
fit: {
|
|
left: function (t, e) {
|
|
var i, s = e.within, n = s.isWindow ? s.scrollLeft : s.offset.left, a = s.width,
|
|
r = t.left - e.collisionPosition.marginLeft, h = n - r, l = r + e.collisionWidth - a - n;
|
|
e.collisionWidth > a ? h > 0 && 0 >= l ? (i = t.left + h + e.collisionWidth - a - n, t.left += h - i) : t.left = l > 0 && 0 >= h ? n : h > l ? n + a - e.collisionWidth : n : h > 0 ? t.left += h : l > 0 ? t.left -= l : t.left = o(t.left - r, t.left)
|
|
}, top: function (t, e) {
|
|
var i, s = e.within, n = s.isWindow ? s.scrollTop : s.offset.top, a = e.within.height,
|
|
r = t.top - e.collisionPosition.marginTop, h = n - r, l = r + e.collisionHeight - a - n;
|
|
e.collisionHeight > a ? h > 0 && 0 >= l ? (i = t.top + h + e.collisionHeight - a - n, t.top += h - i) : t.top = l > 0 && 0 >= h ? n : h > l ? n + a - e.collisionHeight : n : h > 0 ? t.top += h : l > 0 ? t.top -= l : t.top = o(t.top - r, t.top)
|
|
}
|
|
}, flip: {
|
|
left: function (t, e) {
|
|
var i, s, n = e.within, a = n.offset.left + n.scrollLeft, o = n.width,
|
|
h = n.isWindow ? n.scrollLeft : n.offset.left, l = t.left - e.collisionPosition.marginLeft,
|
|
c = l - h, u = l + e.collisionWidth - o - h,
|
|
d = "left" === e.my[0] ? -e.elemWidth : "right" === e.my[0] ? e.elemWidth : 0,
|
|
p = "left" === e.at[0] ? e.targetWidth : "right" === e.at[0] ? -e.targetWidth : 0,
|
|
f = -2 * e.offset[0];
|
|
0 > c ? (i = t.left + d + p + f + e.collisionWidth - o - a, (0 > i || r(c) > i) && (t.left += d + p + f)) : u > 0 && (s = t.left - e.collisionPosition.marginLeft + d + p + f - h, (s > 0 || u > r(s)) && (t.left += d + p + f))
|
|
}, top: function (t, e) {
|
|
var i, s, n = e.within, a = n.offset.top + n.scrollTop, o = n.height,
|
|
h = n.isWindow ? n.scrollTop : n.offset.top, l = t.top - e.collisionPosition.marginTop, c = l - h,
|
|
u = l + e.collisionHeight - o - h, d = "top" === e.my[1],
|
|
p = d ? -e.elemHeight : "bottom" === e.my[1] ? e.elemHeight : 0,
|
|
f = "top" === e.at[1] ? e.targetHeight : "bottom" === e.at[1] ? -e.targetHeight : 0,
|
|
m = -2 * e.offset[1];
|
|
0 > c ? (s = t.top + p + f + m + e.collisionHeight - o - a, t.top + p + f + m > c && (0 > s || r(c) > s) && (t.top += p + f + m)) : u > 0 && (i = t.top - e.collisionPosition.marginTop + p + f + m - h, t.top + p + f + m > u && (i > 0 || u > r(i)) && (t.top += p + f + m))
|
|
}
|
|
}, flipfit: {
|
|
left: function () {
|
|
t.ui.position.flip.left.apply(this, arguments), t.ui.position.fit.left.apply(this, arguments)
|
|
}, top: function () {
|
|
t.ui.position.flip.top.apply(this, arguments), t.ui.position.fit.top.apply(this, arguments)
|
|
}
|
|
}
|
|
}, function () {
|
|
var e, i, s, n, a, o = document.getElementsByTagName("body")[0], r = document.createElement("div");
|
|
e = document.createElement(o ? "div" : "body"), s = {
|
|
visibility: "hidden",
|
|
width: 0,
|
|
height: 0,
|
|
border: 0,
|
|
margin: 0,
|
|
background: "none"
|
|
}, o && t.extend(s, {position: "absolute", left: "-1000px", top: "-1000px"});
|
|
for (a in s) e.style[a] = s[a];
|
|
e.appendChild(r), i = o || document.documentElement, i.insertBefore(e, i.firstChild), r.style.cssText = "position: absolute; left: 10.7432222px;", n = t(r).offset().left, t.support.offsetFractions = n > 10 && 11 > n, e.innerHTML = "", i.removeChild(e)
|
|
}()
|
|
})(jQuery);
|
|
(function (t) {
|
|
function e(t, e, i) {
|
|
return t > e && e + i > t
|
|
}
|
|
|
|
function i(t) {
|
|
return /left|right/.test(t.css("float")) || /inline|table-cell/.test(t.css("display"))
|
|
}
|
|
|
|
t.widget("ui.sortable", t.ui.mouse, {
|
|
version: "1.10.3",
|
|
widgetEventPrefix: "sort",
|
|
ready: !1,
|
|
options: {
|
|
appendTo: "parent",
|
|
axis: !1,
|
|
connectWith: !1,
|
|
containment: !1,
|
|
cursor: "auto",
|
|
cursorAt: !1,
|
|
dropOnEmpty: !0,
|
|
forcePlaceholderSize: !1,
|
|
forceHelperSize: !1,
|
|
grid: !1,
|
|
handle: !1,
|
|
helper: "original",
|
|
items: "> *",
|
|
opacity: !1,
|
|
placeholder: !1,
|
|
revert: !1,
|
|
scroll: !0,
|
|
scrollSensitivity: 20,
|
|
scrollSpeed: 20,
|
|
scope: "default",
|
|
tolerance: "intersect",
|
|
zIndex: 1e3,
|
|
activate: null,
|
|
beforeStop: null,
|
|
change: null,
|
|
deactivate: null,
|
|
out: null,
|
|
over: null,
|
|
receive: null,
|
|
remove: null,
|
|
sort: null,
|
|
start: null,
|
|
stop: null,
|
|
update: null
|
|
},
|
|
_create: function () {
|
|
var t = this.options;
|
|
this.containerCache = {}, this.element.addClass("ui-sortable"), this.refresh(), this.floating = this.items.length ? "x" === t.axis || i(this.items[0].item) : !1, this.offset = this.element.offset(), this._mouseInit(), this.ready = !0
|
|
},
|
|
_destroy: function () {
|
|
this.element.removeClass("ui-sortable ui-sortable-disabled"), this._mouseDestroy();
|
|
for (var t = this.items.length - 1; t >= 0; t--) this.items[t].item.removeData(this.widgetName + "-item");
|
|
return this
|
|
},
|
|
_setOption: function (e, i) {
|
|
"disabled" === e ? (this.options[e] = i, this.widget().toggleClass("ui-sortable-disabled", !!i)) : t.Widget.prototype._setOption.apply(this, arguments)
|
|
},
|
|
_mouseCapture: function (e, i) {
|
|
var s = null, n = !1, a = this;
|
|
return this.reverting ? !1 : this.options.disabled || "static" === this.options.type ? !1 : (this._refreshItems(e), t(e.target).parents().each(function () {
|
|
return t.data(this, a.widgetName + "-item") === a ? (s = t(this), !1) : undefined
|
|
}), t.data(e.target, a.widgetName + "-item") === a && (s = t(e.target)), s ? !this.options.handle || i || (t(this.options.handle, s).find("*").addBack().each(function () {
|
|
this === e.target && (n = !0)
|
|
}), n) ? (this.currentItem = s, this._removeCurrentsFromItems(), !0) : !1 : !1)
|
|
},
|
|
_mouseStart: function (e, i, s) {
|
|
var n, a, o = this.options;
|
|
if (this.currentContainer = this, this.refreshPositions(), this.helper = this._createHelper(e), this._cacheHelperProportions(), this._cacheMargins(), this.scrollParent = this.helper.scrollParent(), this.offset = this.currentItem.offset(), this.offset = {
|
|
top: this.offset.top - this.margins.top,
|
|
left: this.offset.left - this.margins.left
|
|
}, t.extend(this.offset, {
|
|
click: {left: e.pageX - this.offset.left, top: e.pageY - this.offset.top},
|
|
parent: this._getParentOffset(),
|
|
relative: this._getRelativeOffset()
|
|
}), this.helper.css("position", "absolute"), this.cssPosition = this.helper.css("position"), this.originalPosition = this._generatePosition(e), this.originalPageX = e.pageX, this.originalPageY = e.pageY, o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt), this.domPosition = {
|
|
prev: this.currentItem.prev()[0],
|
|
parent: this.currentItem.parent()[0]
|
|
}, this.helper[0] !== this.currentItem[0] && this.currentItem.hide(), this._createPlaceholder(), o.containment && this._setContainment(), o.cursor && "auto" !== o.cursor && (a = this.document.find("body"), this.storedCursor = a.css("cursor"), a.css("cursor", o.cursor), this.storedStylesheet = t("<style>*{ cursor: " + o.cursor + " !important; }</style>").appendTo(a)), o.opacity && (this.helper.css("opacity") && (this._storedOpacity = this.helper.css("opacity")), this.helper.css("opacity", o.opacity)), o.zIndex && (this.helper.css("zIndex") && (this._storedZIndex = this.helper.css("zIndex")), this.helper.css("zIndex", o.zIndex)), this.scrollParent[0] !== document && "HTML" !== this.scrollParent[0].tagName && (this.overflowOffset = this.scrollParent.offset()), this._trigger("start", e, this._uiHash()), this._preserveHelperProportions || this._cacheHelperProportions(), !s) for (n = this.containers.length - 1; n >= 0; n--) this.containers[n]._trigger("activate", e, this._uiHash(this));
|
|
return t.ui.ddmanager && (t.ui.ddmanager.current = this), t.ui.ddmanager && !o.dropBehaviour && t.ui.ddmanager.prepareOffsets(this, e), this.dragging = !0, this.helper.addClass("ui-sortable-helper"), this._mouseDrag(e), !0
|
|
},
|
|
_mouseDrag: function (e) {
|
|
var i, s, n, a, o = this.options, r = !1;
|
|
for (this.position = this._generatePosition(e), this.positionAbs = this._convertPositionTo("absolute"), this.lastPositionAbs || (this.lastPositionAbs = this.positionAbs), this.options.scroll && (this.scrollParent[0] !== document && "HTML" !== this.scrollParent[0].tagName ? (this.overflowOffset.top + this.scrollParent[0].offsetHeight - e.pageY < o.scrollSensitivity ? this.scrollParent[0].scrollTop = r = this.scrollParent[0].scrollTop + o.scrollSpeed : e.pageY - this.overflowOffset.top < o.scrollSensitivity && (this.scrollParent[0].scrollTop = r = this.scrollParent[0].scrollTop - o.scrollSpeed), this.overflowOffset.left + this.scrollParent[0].offsetWidth - e.pageX < o.scrollSensitivity ? this.scrollParent[0].scrollLeft = r = this.scrollParent[0].scrollLeft + o.scrollSpeed : e.pageX - this.overflowOffset.left < o.scrollSensitivity && (this.scrollParent[0].scrollLeft = r = this.scrollParent[0].scrollLeft - o.scrollSpeed)) : (e.pageY - t(document).scrollTop() < o.scrollSensitivity ? r = t(document).scrollTop(t(document).scrollTop() - o.scrollSpeed) : t(window).height() - (e.pageY - t(document).scrollTop()) < o.scrollSensitivity && (r = t(document).scrollTop(t(document).scrollTop() + o.scrollSpeed)), e.pageX - t(document).scrollLeft() < o.scrollSensitivity ? r = t(document).scrollLeft(t(document).scrollLeft() - o.scrollSpeed) : t(window).width() - (e.pageX - t(document).scrollLeft()) < o.scrollSensitivity && (r = t(document).scrollLeft(t(document).scrollLeft() + o.scrollSpeed))), r !== !1 && t.ui.ddmanager && !o.dropBehaviour && t.ui.ddmanager.prepareOffsets(this, e)), this.positionAbs = this._convertPositionTo("absolute"), this.options.axis && "y" === this.options.axis || (this.helper[0].style.left = this.position.left + "px"), this.options.axis && "x" === this.options.axis || (this.helper[0].style.top = this.position.top + "px"), i = this.items.length - 1; i >= 0; i--) if (s = this.items[i], n = s.item[0], a = this._intersectsWithPointer(s), a && s.instance === this.currentContainer && n !== this.currentItem[0] && this.placeholder[1 === a ? "next" : "prev"]()[0] !== n && !t.contains(this.placeholder[0], n) && ("semi-dynamic" === this.options.type ? !t.contains(this.element[0], n) : !0)) {
|
|
if (this.direction = 1 === a ? "down" : "up", "pointer" !== this.options.tolerance && !this._intersectsWithSides(s)) break;
|
|
this._rearrange(e, s), this._trigger("change", e, this._uiHash());
|
|
break
|
|
}
|
|
return this._contactContainers(e), t.ui.ddmanager && t.ui.ddmanager.drag(this, e), this._trigger("sort", e, this._uiHash()), this.lastPositionAbs = this.positionAbs, !1
|
|
},
|
|
_mouseStop: function (e, i) {
|
|
if (e) {
|
|
if (t.ui.ddmanager && !this.options.dropBehaviour && t.ui.ddmanager.drop(this, e), this.options.revert) {
|
|
var s = this, n = this.placeholder.offset(), a = this.options.axis, o = {};
|
|
a && "x" !== a || (o.left = n.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft)), a && "y" !== a || (o.top = n.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop)), this.reverting = !0, t(this.helper).animate(o, parseInt(this.options.revert, 10) || 500, function () {
|
|
s._clear(e)
|
|
})
|
|
} else this._clear(e, i);
|
|
return !1
|
|
}
|
|
},
|
|
cancel: function () {
|
|
if (this.dragging) {
|
|
this._mouseUp({target: null}), "original" === this.options.helper ? this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper") : this.currentItem.show();
|
|
for (var e = this.containers.length - 1; e >= 0; e--) this.containers[e]._trigger("deactivate", null, this._uiHash(this)), this.containers[e].containerCache.over && (this.containers[e]._trigger("out", null, this._uiHash(this)), this.containers[e].containerCache.over = 0)
|
|
}
|
|
return this.placeholder && (this.placeholder[0].parentNode && this.placeholder[0].parentNode.removeChild(this.placeholder[0]), "original" !== this.options.helper && this.helper && this.helper[0].parentNode && this.helper.remove(), t.extend(this, {
|
|
helper: null,
|
|
dragging: !1,
|
|
reverting: !1,
|
|
_noFinalSort: null
|
|
}), this.domPosition.prev ? t(this.domPosition.prev).after(this.currentItem) : t(this.domPosition.parent).prepend(this.currentItem)), this
|
|
},
|
|
serialize: function (e) {
|
|
var i = this._getItemsAsjQuery(e && e.connected), s = [];
|
|
return e = e || {}, t(i).each(function () {
|
|
var i = (t(e.item || this).attr(e.attribute || "id") || "").match(e.expression || /(.+)[\-=_](.+)/);
|
|
i && s.push((e.key || i[1] + "[]") + "=" + (e.key && e.expression ? i[1] : i[2]))
|
|
}), !s.length && e.key && s.push(e.key + "="), s.join("&")
|
|
},
|
|
toArray: function (e) {
|
|
var i = this._getItemsAsjQuery(e && e.connected), s = [];
|
|
return e = e || {}, i.each(function () {
|
|
s.push(t(e.item || this).attr(e.attribute || "id") || "")
|
|
}), s
|
|
},
|
|
_intersectsWith: function (t) {
|
|
var e = this.positionAbs.left, i = e + this.helperProportions.width, s = this.positionAbs.top,
|
|
n = s + this.helperProportions.height, a = t.left, o = a + t.width, r = t.top, h = r + t.height,
|
|
l = this.offset.click.top, c = this.offset.click.left,
|
|
u = "x" === this.options.axis || s + l > r && h > s + l,
|
|
d = "y" === this.options.axis || e + c > a && o > e + c, p = u && d;
|
|
return "pointer" === this.options.tolerance || this.options.forcePointerForContainers || "pointer" !== this.options.tolerance && this.helperProportions[this.floating ? "width" : "height"] > t[this.floating ? "width" : "height"] ? p : e + this.helperProportions.width / 2 > a && o > i - this.helperProportions.width / 2 && s + this.helperProportions.height / 2 > r && h > n - this.helperProportions.height / 2
|
|
},
|
|
_intersectsWithPointer: function (t) {
|
|
var i = "x" === this.options.axis || e(this.positionAbs.top + this.offset.click.top, t.top, t.height),
|
|
s = "y" === this.options.axis || e(this.positionAbs.left + this.offset.click.left, t.left, t.width),
|
|
n = i && s, a = this._getDragVerticalDirection(), o = this._getDragHorizontalDirection();
|
|
return n ? this.floating ? o && "right" === o || "down" === a ? 2 : 1 : a && ("down" === a ? 2 : 1) : !1
|
|
},
|
|
_intersectsWithSides: function (t) {
|
|
var i = e(this.positionAbs.top + this.offset.click.top, t.top + t.height / 2, t.height),
|
|
s = e(this.positionAbs.left + this.offset.click.left, t.left + t.width / 2, t.width),
|
|
n = this._getDragVerticalDirection(), a = this._getDragHorizontalDirection();
|
|
return this.floating && a ? "right" === a && s || "left" === a && !s : n && ("down" === n && i || "up" === n && !i)
|
|
},
|
|
_getDragVerticalDirection: function () {
|
|
var t = this.positionAbs.top - this.lastPositionAbs.top;
|
|
return 0 !== t && (t > 0 ? "down" : "up")
|
|
},
|
|
_getDragHorizontalDirection: function () {
|
|
var t = this.positionAbs.left - this.lastPositionAbs.left;
|
|
return 0 !== t && (t > 0 ? "right" : "left")
|
|
},
|
|
refresh: function (t) {
|
|
return this._refreshItems(t), this.refreshPositions(), this
|
|
},
|
|
_connectWith: function () {
|
|
var t = this.options;
|
|
return t.connectWith.constructor === String ? [t.connectWith] : t.connectWith
|
|
},
|
|
_getItemsAsjQuery: function (e) {
|
|
var i, s, n, a, o = [], r = [], h = this._connectWith();
|
|
if (h && e) for (i = h.length - 1; i >= 0; i--) for (n = t(h[i]), s = n.length - 1; s >= 0; s--) a = t.data(n[s], this.widgetFullName), a && a !== this && !a.options.disabled && r.push([t.isFunction(a.options.items) ? a.options.items.call(a.element) : t(a.options.items, a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), a]);
|
|
for (r.push([t.isFunction(this.options.items) ? this.options.items.call(this.element, null, {
|
|
options: this.options,
|
|
item: this.currentItem
|
|
}) : t(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]), i = r.length - 1; i >= 0; i--) r[i][0].each(function () {
|
|
o.push(this)
|
|
});
|
|
return t(o)
|
|
},
|
|
_removeCurrentsFromItems: function () {
|
|
var e = this.currentItem.find(":data(" + this.widgetName + "-item)");
|
|
this.items = t.grep(this.items, function (t) {
|
|
for (var i = 0; e.length > i; i++) if (e[i] === t.item[0]) return !1;
|
|
return !0
|
|
})
|
|
},
|
|
_refreshItems: function (e) {
|
|
this.items = [], this.containers = [this];
|
|
var i, s, n, a, o, r, h, l, c = this.items,
|
|
u = [[t.isFunction(this.options.items) ? this.options.items.call(this.element[0], e, {item: this.currentItem}) : t(this.options.items, this.element), this]],
|
|
d = this._connectWith();
|
|
if (d && this.ready) for (i = d.length - 1; i >= 0; i--) for (n = t(d[i]), s = n.length - 1; s >= 0; s--) a = t.data(n[s], this.widgetFullName), a && a !== this && !a.options.disabled && (u.push([t.isFunction(a.options.items) ? a.options.items.call(a.element[0], e, {item: this.currentItem}) : t(a.options.items, a.element), a]), this.containers.push(a));
|
|
for (i = u.length - 1; i >= 0; i--) for (o = u[i][1], r = u[i][0], s = 0, l = r.length; l > s; s++) h = t(r[s]), h.data(this.widgetName + "-item", o), c.push({
|
|
item: h,
|
|
instance: o,
|
|
width: 0,
|
|
height: 0,
|
|
left: 0,
|
|
top: 0
|
|
})
|
|
},
|
|
refreshPositions: function (e) {
|
|
this.offsetParent && this.helper && (this.offset.parent = this._getParentOffset());
|
|
var i, s, n, a;
|
|
for (i = this.items.length - 1; i >= 0; i--) s = this.items[i], s.instance !== this.currentContainer && this.currentContainer && s.item[0] !== this.currentItem[0] || (n = this.options.toleranceElement ? t(this.options.toleranceElement, s.item) : s.item, e || (s.width = n.outerWidth(), s.height = n.outerHeight()), a = n.offset(), s.left = a.left, s.top = a.top);
|
|
if (this.options.custom && this.options.custom.refreshContainers) this.options.custom.refreshContainers.call(this); else for (i = this.containers.length - 1; i >= 0; i--) a = this.containers[i].element.offset(), this.containers[i].containerCache.left = a.left, this.containers[i].containerCache.top = a.top, this.containers[i].containerCache.width = this.containers[i].element.outerWidth(), this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
|
|
return this
|
|
},
|
|
_createPlaceholder: function (e) {
|
|
e = e || this;
|
|
var i, s = e.options;
|
|
s.placeholder && s.placeholder.constructor !== String || (i = s.placeholder, s.placeholder = {
|
|
element: function () {
|
|
var s = e.currentItem[0].nodeName.toLowerCase(),
|
|
n = t("<" + s + ">", e.document[0]).addClass(i || e.currentItem[0].className + " ui-sortable-placeholder").removeClass("ui-sortable-helper");
|
|
return "tr" === s ? e.currentItem.children().each(function () {
|
|
t("<td> </td>", e.document[0]).attr("colspan", t(this).attr("colspan") || 1).appendTo(n)
|
|
}) : "img" === s && n.attr("src", e.currentItem.attr("src")), i || n.css("visibility", "hidden"), n
|
|
}, update: function (t, n) {
|
|
(!i || s.forcePlaceholderSize) && (n.height() || n.height(e.currentItem.innerHeight() - parseInt(e.currentItem.css("paddingTop") || 0, 10) - parseInt(e.currentItem.css("paddingBottom") || 0, 10)), n.width() || n.width(e.currentItem.innerWidth() - parseInt(e.currentItem.css("paddingLeft") || 0, 10) - parseInt(e.currentItem.css("paddingRight") || 0, 10)))
|
|
}
|
|
}), e.placeholder = t(s.placeholder.element.call(e.element, e.currentItem)), e.currentItem.after(e.placeholder), s.placeholder.update(e, e.placeholder)
|
|
},
|
|
_contactContainers: function (s) {
|
|
var n, a, o, r, h, l, c, u, d, p, f = null, m = null;
|
|
for (n = this.containers.length - 1; n >= 0; n--) if (!t.contains(this.currentItem[0], this.containers[n].element[0])) if (this._intersectsWith(this.containers[n].containerCache)) {
|
|
if (f && t.contains(this.containers[n].element[0], f.element[0])) continue;
|
|
f = this.containers[n], m = n
|
|
} else this.containers[n].containerCache.over && (this.containers[n]._trigger("out", s, this._uiHash(this)), this.containers[n].containerCache.over = 0);
|
|
if (f) if (1 === this.containers.length) this.containers[m].containerCache.over || (this.containers[m]._trigger("over", s, this._uiHash(this)), this.containers[m].containerCache.over = 1); else {
|
|
for (o = 1e4, r = null, p = f.floating || i(this.currentItem), h = p ? "left" : "top", l = p ? "width" : "height", c = this.positionAbs[h] + this.offset.click[h], a = this.items.length - 1; a >= 0; a--) t.contains(this.containers[m].element[0], this.items[a].item[0]) && this.items[a].item[0] !== this.currentItem[0] && (!p || e(this.positionAbs.top + this.offset.click.top, this.items[a].top, this.items[a].height)) && (u = this.items[a].item.offset()[h], d = !1, Math.abs(u - c) > Math.abs(u + this.items[a][l] - c) && (d = !0, u += this.items[a][l]), o > Math.abs(u - c) && (o = Math.abs(u - c), r = this.items[a], this.direction = d ? "up" : "down"));
|
|
if (!r && !this.options.dropOnEmpty) return;
|
|
if (this.currentContainer === this.containers[m]) return;
|
|
r ? this._rearrange(s, r, null, !0) : this._rearrange(s, null, this.containers[m].element, !0), this._trigger("change", s, this._uiHash()), this.containers[m]._trigger("change", s, this._uiHash(this)), this.currentContainer = this.containers[m], this.options.placeholder.update(this.currentContainer, this.placeholder), this.containers[m]._trigger("over", s, this._uiHash(this)), this.containers[m].containerCache.over = 1
|
|
}
|
|
},
|
|
_createHelper: function (e) {
|
|
var i = this.options,
|
|
s = t.isFunction(i.helper) ? t(i.helper.apply(this.element[0], [e, this.currentItem])) : "clone" === i.helper ? this.currentItem.clone() : this.currentItem;
|
|
return s.parents("body").length || t("parent" !== i.appendTo ? i.appendTo : this.currentItem[0].parentNode)[0].appendChild(s[0]), s[0] === this.currentItem[0] && (this._storedCSS = {
|
|
width: this.currentItem[0].style.width,
|
|
height: this.currentItem[0].style.height,
|
|
position: this.currentItem.css("position"),
|
|
top: this.currentItem.css("top"),
|
|
left: this.currentItem.css("left")
|
|
}), (!s[0].style.width || i.forceHelperSize) && s.width(this.currentItem.width()), (!s[0].style.height || i.forceHelperSize) && s.height(this.currentItem.height()), s
|
|
},
|
|
_adjustOffsetFromHelper: function (e) {
|
|
"string" == typeof e && (e = e.split(" ")), t.isArray(e) && (e = {
|
|
left: +e[0],
|
|
top: +e[1] || 0
|
|
}), "left" in e && (this.offset.click.left = e.left + this.margins.left), "right" in e && (this.offset.click.left = this.helperProportions.width - e.right + this.margins.left), "top" in e && (this.offset.click.top = e.top + this.margins.top), "bottom" in e && (this.offset.click.top = this.helperProportions.height - e.bottom + this.margins.top)
|
|
},
|
|
_getParentOffset: function () {
|
|
this.offsetParent = this.helper.offsetParent();
|
|
var e = this.offsetParent.offset();
|
|
return "absolute" === this.cssPosition && this.scrollParent[0] !== document && t.contains(this.scrollParent[0], this.offsetParent[0]) && (e.left += this.scrollParent.scrollLeft(), e.top += this.scrollParent.scrollTop()), (this.offsetParent[0] === document.body || this.offsetParent[0].tagName && "html" === this.offsetParent[0].tagName.toLowerCase() && t.ui.ie) && (e = {
|
|
top: 0,
|
|
left: 0
|
|
}), {
|
|
top: e.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
|
|
left: e.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
|
|
}
|
|
},
|
|
_getRelativeOffset: function () {
|
|
if ("relative" === this.cssPosition) {
|
|
var t = this.currentItem.position();
|
|
return {
|
|
top: t.top - (parseInt(this.helper.css("top"), 10) || 0) + this.scrollParent.scrollTop(),
|
|
left: t.left - (parseInt(this.helper.css("left"), 10) || 0) + this.scrollParent.scrollLeft()
|
|
}
|
|
}
|
|
return {top: 0, left: 0}
|
|
},
|
|
_cacheMargins: function () {
|
|
this.margins = {
|
|
left: parseInt(this.currentItem.css("marginLeft"), 10) || 0,
|
|
top: parseInt(this.currentItem.css("marginTop"), 10) || 0
|
|
}
|
|
},
|
|
_cacheHelperProportions: function () {
|
|
this.helperProportions = {width: this.helper.outerWidth(), height: this.helper.outerHeight()}
|
|
},
|
|
_setContainment: function () {
|
|
var e, i, s, n = this.options;
|
|
"parent" === n.containment && (n.containment = this.helper[0].parentNode), ("document" === n.containment || "window" === n.containment) && (this.containment = [0 - this.offset.relative.left - this.offset.parent.left, 0 - this.offset.relative.top - this.offset.parent.top, t("document" === n.containment ? document : window).width() - this.helperProportions.width - this.margins.left, (t("document" === n.containment ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top]), /^(document|window|parent)$/.test(n.containment) || (e = t(n.containment)[0], i = t(n.containment).offset(), s = "hidden" !== t(e).css("overflow"), this.containment = [i.left + (parseInt(t(e).css("borderLeftWidth"), 10) || 0) + (parseInt(t(e).css("paddingLeft"), 10) || 0) - this.margins.left, i.top + (parseInt(t(e).css("borderTopWidth"), 10) || 0) + (parseInt(t(e).css("paddingTop"), 10) || 0) - this.margins.top, i.left + (s ? Math.max(e.scrollWidth, e.offsetWidth) : e.offsetWidth) - (parseInt(t(e).css("borderLeftWidth"), 10) || 0) - (parseInt(t(e).css("paddingRight"), 10) || 0) - this.helperProportions.width - this.margins.left, i.top + (s ? Math.max(e.scrollHeight, e.offsetHeight) : e.offsetHeight) - (parseInt(t(e).css("borderTopWidth"), 10) || 0) - (parseInt(t(e).css("paddingBottom"), 10) || 0) - this.helperProportions.height - this.margins.top])
|
|
},
|
|
_convertPositionTo: function (e, i) {
|
|
i || (i = this.position);
|
|
var s = "absolute" === e ? 1 : -1,
|
|
n = "absolute" !== this.cssPosition || this.scrollParent[0] !== document && t.contains(this.scrollParent[0], this.offsetParent[0]) ? this.scrollParent : this.offsetParent,
|
|
a = /(html|body)/i.test(n[0].tagName);
|
|
return {
|
|
top: i.top + this.offset.relative.top * s + this.offset.parent.top * s - ("fixed" === this.cssPosition ? -this.scrollParent.scrollTop() : a ? 0 : n.scrollTop()) * s,
|
|
left: i.left + this.offset.relative.left * s + this.offset.parent.left * s - ("fixed" === this.cssPosition ? -this.scrollParent.scrollLeft() : a ? 0 : n.scrollLeft()) * s
|
|
}
|
|
},
|
|
_generatePosition: function (e) {
|
|
var i, s, n = this.options, a = e.pageX, o = e.pageY,
|
|
r = "absolute" !== this.cssPosition || this.scrollParent[0] !== document && t.contains(this.scrollParent[0], this.offsetParent[0]) ? this.scrollParent : this.offsetParent,
|
|
h = /(html|body)/i.test(r[0].tagName);
|
|
return "relative" !== this.cssPosition || this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0] || (this.offset.relative = this._getRelativeOffset()), this.originalPosition && (this.containment && (e.pageX - this.offset.click.left < this.containment[0] && (a = this.containment[0] + this.offset.click.left), e.pageY - this.offset.click.top < this.containment[1] && (o = this.containment[1] + this.offset.click.top), e.pageX - this.offset.click.left > this.containment[2] && (a = this.containment[2] + this.offset.click.left), e.pageY - this.offset.click.top > this.containment[3] && (o = this.containment[3] + this.offset.click.top)), n.grid && (i = this.originalPageY + Math.round((o - this.originalPageY) / n.grid[1]) * n.grid[1], o = this.containment ? i - this.offset.click.top >= this.containment[1] && i - this.offset.click.top <= this.containment[3] ? i : i - this.offset.click.top >= this.containment[1] ? i - n.grid[1] : i + n.grid[1] : i, s = this.originalPageX + Math.round((a - this.originalPageX) / n.grid[0]) * n.grid[0], a = this.containment ? s - this.offset.click.left >= this.containment[0] && s - this.offset.click.left <= this.containment[2] ? s : s - this.offset.click.left >= this.containment[0] ? s - n.grid[0] : s + n.grid[0] : s)), {
|
|
top: o - this.offset.click.top - this.offset.relative.top - this.offset.parent.top + ("fixed" === this.cssPosition ? -this.scrollParent.scrollTop() : h ? 0 : r.scrollTop()),
|
|
left: a - this.offset.click.left - this.offset.relative.left - this.offset.parent.left + ("fixed" === this.cssPosition ? -this.scrollParent.scrollLeft() : h ? 0 : r.scrollLeft())
|
|
}
|
|
},
|
|
_rearrange: function (t, e, i, s) {
|
|
i ? i[0].appendChild(this.placeholder[0]) : e.item[0].parentNode.insertBefore(this.placeholder[0], "down" === this.direction ? e.item[0] : e.item[0].nextSibling), this.counter = this.counter ? ++this.counter : 1;
|
|
var n = this.counter;
|
|
this._delay(function () {
|
|
n === this.counter && this.refreshPositions(!s)
|
|
})
|
|
},
|
|
_clear: function (t, e) {
|
|
this.reverting = !1;
|
|
var i, s = [];
|
|
if (!this._noFinalSort && this.currentItem.parent().length && this.placeholder.before(this.currentItem), this._noFinalSort = null, this.helper[0] === this.currentItem[0]) {
|
|
for (i in this._storedCSS) ("auto" === this._storedCSS[i] || "static" === this._storedCSS[i]) && (this._storedCSS[i] = "");
|
|
this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")
|
|
} else this.currentItem.show();
|
|
for (this.fromOutside && !e && s.push(function (t) {
|
|
this._trigger("receive", t, this._uiHash(this.fromOutside))
|
|
}), !this.fromOutside && this.domPosition.prev === this.currentItem.prev().not(".ui-sortable-helper")[0] && this.domPosition.parent === this.currentItem.parent()[0] || e || s.push(function (t) {
|
|
this._trigger("update", t, this._uiHash())
|
|
}), this !== this.currentContainer && (e || (s.push(function (t) {
|
|
this._trigger("remove", t, this._uiHash())
|
|
}), s.push(function (t) {
|
|
return function (e) {
|
|
t._trigger("receive", e, this._uiHash(this))
|
|
}
|
|
}.call(this, this.currentContainer)), s.push(function (t) {
|
|
return function (e) {
|
|
t._trigger("update", e, this._uiHash(this))
|
|
}
|
|
}.call(this, this.currentContainer)))), i = this.containers.length - 1; i >= 0; i--) e || s.push(function (t) {
|
|
return function (e) {
|
|
t._trigger("deactivate", e, this._uiHash(this))
|
|
}
|
|
}.call(this, this.containers[i])), this.containers[i].containerCache.over && (s.push(function (t) {
|
|
return function (e) {
|
|
t._trigger("out", e, this._uiHash(this))
|
|
}
|
|
}.call(this, this.containers[i])), this.containers[i].containerCache.over = 0);
|
|
if (this.storedCursor && (this.document.find("body").css("cursor", this.storedCursor), this.storedStylesheet.remove()), this._storedOpacity && this.helper.css("opacity", this._storedOpacity), this._storedZIndex && this.helper.css("zIndex", "auto" === this._storedZIndex ? "" : this._storedZIndex), this.dragging = !1, this.cancelHelperRemoval) {
|
|
if (!e) {
|
|
for (this._trigger("beforeStop", t, this._uiHash()), i = 0; s.length > i; i++) s[i].call(this, t);
|
|
this._trigger("stop", t, this._uiHash())
|
|
}
|
|
return this.fromOutside = !1, !1
|
|
}
|
|
if (e || this._trigger("beforeStop", t, this._uiHash()), this.placeholder[0].parentNode.removeChild(this.placeholder[0]), this.helper[0] !== this.currentItem[0] && this.helper.remove(), this.helper = null, !e) {
|
|
for (i = 0; s.length > i; i++) s[i].call(this, t);
|
|
this._trigger("stop", t, this._uiHash())
|
|
}
|
|
return this.fromOutside = !1, !0
|
|
},
|
|
_trigger: function () {
|
|
t.Widget.prototype._trigger.apply(this, arguments) === !1 && this.cancel()
|
|
},
|
|
_uiHash: function (e) {
|
|
var i = e || this;
|
|
return {
|
|
helper: i.helper,
|
|
placeholder: i.placeholder || t([]),
|
|
position: i.position,
|
|
originalPosition: i.originalPosition,
|
|
offset: i.positionAbs,
|
|
item: i.currentItem,
|
|
sender: e ? e.element : null
|
|
}
|
|
}
|
|
})
|
|
})(jQuery);
|
|
(function (t, e) {
|
|
function i() {
|
|
this._curInst = null, this._keyEvent = !1, this._disabledInputs = [], this._datepickerShowing = !1, this._inDialog = !1, this._mainDivId = "ui-datepicker-div", this._inlineClass = "ui-datepicker-inline", this._appendClass = "ui-datepicker-append", this._triggerClass = "ui-datepicker-trigger", this._dialogClass = "ui-datepicker-dialog", this._disableClass = "ui-datepicker-disabled", this._unselectableClass = "ui-datepicker-unselectable", this._currentClass = "ui-datepicker-current-day", this._dayOverClass = "ui-datepicker-days-cell-over", this.regional = [], this.regional[""] = {
|
|
closeText: "Done",
|
|
prevText: "Prev",
|
|
nextText: "Next",
|
|
currentText: "Today",
|
|
monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
|
|
monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
|
dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
|
dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
weekHeader: "Wk",
|
|
dateFormat: "mm/dd/yy",
|
|
firstDay: 0,
|
|
isRTL: !1,
|
|
showMonthAfterYear: !1,
|
|
yearSuffix: ""
|
|
}, this._defaults = {
|
|
showOn: "focus",
|
|
showAnim: "fadeIn",
|
|
showOptions: {},
|
|
defaultDate: null,
|
|
appendText: "",
|
|
buttonText: "...",
|
|
buttonImage: "",
|
|
buttonImageOnly: !1,
|
|
hideIfNoPrevNext: !1,
|
|
navigationAsDateFormat: !1,
|
|
gotoCurrent: !1,
|
|
changeMonth: !1,
|
|
changeYear: !1,
|
|
yearRange: "c-10:c+10",
|
|
showOtherMonths: !1,
|
|
selectOtherMonths: !1,
|
|
showWeek: !1,
|
|
calculateWeek: this.iso8601Week,
|
|
shortYearCutoff: "+10",
|
|
minDate: null,
|
|
maxDate: null,
|
|
duration: "fast",
|
|
beforeShowDay: null,
|
|
beforeShow: null,
|
|
onSelect: null,
|
|
onChangeMonthYear: null,
|
|
onClose: null,
|
|
numberOfMonths: 1,
|
|
showCurrentAtPos: 0,
|
|
stepMonths: 1,
|
|
stepBigMonths: 12,
|
|
altField: "",
|
|
altFormat: "",
|
|
constrainInput: !0,
|
|
showButtonPanel: !1,
|
|
autoSize: !1,
|
|
disabled: !1
|
|
}, t.extend(this._defaults, this.regional[""]), this.dpDiv = s(t("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))
|
|
}
|
|
|
|
function s(e) {
|
|
var i = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
|
|
return e.delegate(i, "mouseout", function () {
|
|
t(this).removeClass("ui-state-hover"), -1 !== this.className.indexOf("ui-datepicker-prev") && t(this).removeClass("ui-datepicker-prev-hover"), -1 !== this.className.indexOf("ui-datepicker-next") && t(this).removeClass("ui-datepicker-next-hover")
|
|
}).delegate(i, "mouseover", function () {
|
|
t.datepicker._isDisabledDatepicker(a.inline ? e.parent()[0] : a.input[0]) || (t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"), t(this).addClass("ui-state-hover"), -1 !== this.className.indexOf("ui-datepicker-prev") && t(this).addClass("ui-datepicker-prev-hover"), -1 !== this.className.indexOf("ui-datepicker-next") && t(this).addClass("ui-datepicker-next-hover"))
|
|
})
|
|
}
|
|
|
|
function n(e, i) {
|
|
t.extend(e, i);
|
|
for (var s in i) null == i[s] && (e[s] = i[s]);
|
|
return e
|
|
}
|
|
|
|
t.extend(t.ui, {datepicker: {version: "1.10.3"}});
|
|
var a, r = "datepicker";
|
|
t.extend(i.prototype, {
|
|
markerClassName: "hasDatepicker",
|
|
maxRows: 4,
|
|
_widgetDatepicker: function () {
|
|
return this.dpDiv
|
|
},
|
|
setDefaults: function (t) {
|
|
return n(this._defaults, t || {}), this
|
|
},
|
|
_attachDatepicker: function (e, i) {
|
|
var s, n, a;
|
|
s = e.nodeName.toLowerCase(), n = "div" === s || "span" === s, e.id || (this.uuid += 1, e.id = "dp" + this.uuid), a = this._newInst(t(e), n), a.settings = t.extend({}, i || {}), "input" === s ? this._connectDatepicker(e, a) : n && this._inlineDatepicker(e, a)
|
|
},
|
|
_newInst: function (e, i) {
|
|
var n = e[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1");
|
|
return {
|
|
id: n,
|
|
input: e,
|
|
selectedDay: 0,
|
|
selectedMonth: 0,
|
|
selectedYear: 0,
|
|
drawMonth: 0,
|
|
drawYear: 0,
|
|
inline: i,
|
|
dpDiv: i ? s(t("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")) : this.dpDiv
|
|
}
|
|
},
|
|
_connectDatepicker: function (e, i) {
|
|
var s = t(e);
|
|
i.append = t([]), i.trigger = t([]), s.hasClass(this.markerClassName) || (this._attachments(s, i), s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp), this._autoSize(i), t.data(e, r, i), i.settings.disabled && this._disableDatepicker(e))
|
|
},
|
|
_attachments: function (e, i) {
|
|
var s, n, a, r = this._get(i, "appendText"), o = this._get(i, "isRTL");
|
|
i.append && i.append.remove(), r && (i.append = t("<span class='" + this._appendClass + "'>" + r + "</span>"), e[o ? "before" : "after"](i.append)), e.unbind("focus", this._showDatepicker), i.trigger && i.trigger.remove(), s = this._get(i, "showOn"), ("focus" === s || "both" === s) && e.focus(this._showDatepicker), ("button" === s || "both" === s) && (n = this._get(i, "buttonText"), a = this._get(i, "buttonImage"), i.trigger = t(this._get(i, "buttonImageOnly") ? t("<img/>").addClass(this._triggerClass).attr({
|
|
src: a,
|
|
alt: n,
|
|
title: n
|
|
}) : t("<button type='button'></button>").addClass(this._triggerClass).html(a ? t("<img/>").attr({
|
|
src: a,
|
|
alt: n,
|
|
title: n
|
|
}) : n)), e[o ? "before" : "after"](i.trigger), i.trigger.click(function () {
|
|
return t.datepicker._datepickerShowing && t.datepicker._lastInput === e[0] ? t.datepicker._hideDatepicker() : t.datepicker._datepickerShowing && t.datepicker._lastInput !== e[0] ? (t.datepicker._hideDatepicker(), t.datepicker._showDatepicker(e[0])) : t.datepicker._showDatepicker(e[0]), !1
|
|
}))
|
|
},
|
|
_autoSize: function (t) {
|
|
if (this._get(t, "autoSize") && !t.inline) {
|
|
var e, i, s, n, a = new Date(2009, 11, 20), r = this._get(t, "dateFormat");
|
|
r.match(/[DM]/) && (e = function (t) {
|
|
for (i = 0, s = 0, n = 0; t.length > n; n++) t[n].length > i && (i = t[n].length, s = n);
|
|
return s
|
|
}, a.setMonth(e(this._get(t, r.match(/MM/) ? "monthNames" : "monthNamesShort"))), a.setDate(e(this._get(t, r.match(/DD/) ? "dayNames" : "dayNamesShort")) + 20 - a.getDay())), t.input.attr("size", this._formatDate(t, a).length)
|
|
}
|
|
},
|
|
_inlineDatepicker: function (e, i) {
|
|
var s = t(e);
|
|
s.hasClass(this.markerClassName) || (s.addClass(this.markerClassName).append(i.dpDiv), t.data(e, r, i), this._setDate(i, this._getDefaultDate(i), !0), this._updateDatepicker(i), this._updateAlternate(i), i.settings.disabled && this._disableDatepicker(e), i.dpDiv.css("display", "block"))
|
|
},
|
|
_dialogDatepicker: function (e, i, s, a, o) {
|
|
var h, l, c, u, d, p = this._dialogInst;
|
|
return p || (this.uuid += 1, h = "dp" + this.uuid, this._dialogInput = t("<input type='text' id='" + h + "' style='position: absolute; top: -100px; width: 0px;'/>"), this._dialogInput.keydown(this._doKeyDown), t("body").append(this._dialogInput), p = this._dialogInst = this._newInst(this._dialogInput, !1), p.settings = {}, t.data(this._dialogInput[0], r, p)), n(p.settings, a || {}), i = i && i.constructor === Date ? this._formatDate(p, i) : i, this._dialogInput.val(i), this._pos = o ? o.length ? o : [o.pageX, o.pageY] : null, this._pos || (l = document.documentElement.clientWidth, c = document.documentElement.clientHeight, u = document.documentElement.scrollLeft || document.body.scrollLeft, d = document.documentElement.scrollTop || document.body.scrollTop, this._pos = [l / 2 - 100 + u, c / 2 - 150 + d]), this._dialogInput.css("left", this._pos[0] + 20 + "px").css("top", this._pos[1] + "px"), p.settings.onSelect = s, this._inDialog = !0, this.dpDiv.addClass(this._dialogClass), this._showDatepicker(this._dialogInput[0]), t.blockUI && t.blockUI(this.dpDiv), t.data(this._dialogInput[0], r, p), this
|
|
},
|
|
_destroyDatepicker: function (e) {
|
|
var i, s = t(e), n = t.data(e, r);
|
|
s.hasClass(this.markerClassName) && (i = e.nodeName.toLowerCase(), t.removeData(e, r), "input" === i ? (n.append.remove(), n.trigger.remove(), s.removeClass(this.markerClassName).unbind("focus", this._showDatepicker).unbind("keydown", this._doKeyDown).unbind("keypress", this._doKeyPress).unbind("keyup", this._doKeyUp)) : ("div" === i || "span" === i) && s.removeClass(this.markerClassName).empty())
|
|
},
|
|
_enableDatepicker: function (e) {
|
|
var i, s, n = t(e), a = t.data(e, r);
|
|
n.hasClass(this.markerClassName) && (i = e.nodeName.toLowerCase(), "input" === i ? (e.disabled = !1, a.trigger.filter("button").each(function () {
|
|
this.disabled = !1
|
|
}).end().filter("img").css({
|
|
opacity: "1.0",
|
|
cursor: ""
|
|
})) : ("div" === i || "span" === i) && (s = n.children("." + this._inlineClass), s.children().removeClass("ui-state-disabled"), s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled", !1)), this._disabledInputs = t.map(this._disabledInputs, function (t) {
|
|
return t === e ? null : t
|
|
}))
|
|
},
|
|
_disableDatepicker: function (e) {
|
|
var i, s, n = t(e), a = t.data(e, r);
|
|
n.hasClass(this.markerClassName) && (i = e.nodeName.toLowerCase(), "input" === i ? (e.disabled = !0, a.trigger.filter("button").each(function () {
|
|
this.disabled = !0
|
|
}).end().filter("img").css({
|
|
opacity: "0.5",
|
|
cursor: "default"
|
|
})) : ("div" === i || "span" === i) && (s = n.children("." + this._inlineClass), s.children().addClass("ui-state-disabled"), s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled", !0)), this._disabledInputs = t.map(this._disabledInputs, function (t) {
|
|
return t === e ? null : t
|
|
}), this._disabledInputs[this._disabledInputs.length] = e)
|
|
},
|
|
_isDisabledDatepicker: function (t) {
|
|
if (!t) return !1;
|
|
for (var e = 0; this._disabledInputs.length > e; e++) if (this._disabledInputs[e] === t) return !0;
|
|
return !1
|
|
},
|
|
_getInst: function (e) {
|
|
try {
|
|
return t.data(e, r)
|
|
} catch (i) {
|
|
throw"Missing instance data for this datepicker"
|
|
}
|
|
},
|
|
_optionDatepicker: function (i, s, a) {
|
|
var r, o, h, l, c = this._getInst(i);
|
|
return 2 === arguments.length && "string" == typeof s ? "defaults" === s ? t.extend({}, t.datepicker._defaults) : c ? "all" === s ? t.extend({}, c.settings) : this._get(c, s) : null : (r = s || {}, "string" == typeof s && (r = {}, r[s] = a), c && (this._curInst === c && this._hideDatepicker(), o = this._getDateDatepicker(i, !0), h = this._getMinMaxDate(c, "min"), l = this._getMinMaxDate(c, "max"), n(c.settings, r), null !== h && r.dateFormat !== e && r.minDate === e && (c.settings.minDate = this._formatDate(c, h)), null !== l && r.dateFormat !== e && r.maxDate === e && (c.settings.maxDate = this._formatDate(c, l)), "disabled" in r && (r.disabled ? this._disableDatepicker(i) : this._enableDatepicker(i)), this._attachments(t(i), c), this._autoSize(c), this._setDate(c, o), this._updateAlternate(c), this._updateDatepicker(c)), e)
|
|
},
|
|
_changeDatepicker: function (t, e, i) {
|
|
this._optionDatepicker(t, e, i)
|
|
},
|
|
_refreshDatepicker: function (t) {
|
|
var e = this._getInst(t);
|
|
e && this._updateDatepicker(e)
|
|
},
|
|
_setDateDatepicker: function (t, e) {
|
|
var i = this._getInst(t);
|
|
i && (this._setDate(i, e), this._updateDatepicker(i), this._updateAlternate(i))
|
|
},
|
|
_getDateDatepicker: function (t, e) {
|
|
var i = this._getInst(t);
|
|
return i && !i.inline && this._setDateFromField(i, e), i ? this._getDate(i) : null
|
|
},
|
|
_doKeyDown: function (e) {
|
|
var i, s, n, a = t.datepicker._getInst(e.target), r = !0, o = a.dpDiv.is(".ui-datepicker-rtl");
|
|
if (a._keyEvent = !0, t.datepicker._datepickerShowing) switch (e.keyCode) {
|
|
case 9:
|
|
t.datepicker._hideDatepicker(), r = !1;
|
|
break;
|
|
case 13:
|
|
return n = t("td." + t.datepicker._dayOverClass + ":not(." + t.datepicker._currentClass + ")", a.dpDiv), n[0] && t.datepicker._selectDay(e.target, a.selectedMonth, a.selectedYear, n[0]), i = t.datepicker._get(a, "onSelect"), i ? (s = t.datepicker._formatDate(a), i.apply(a.input ? a.input[0] : null, [s, a])) : t.datepicker._hideDatepicker(), !1;
|
|
case 27:
|
|
t.datepicker._hideDatepicker();
|
|
break;
|
|
case 33:
|
|
t.datepicker._adjustDate(e.target, e.ctrlKey ? -t.datepicker._get(a, "stepBigMonths") : -t.datepicker._get(a, "stepMonths"), "M");
|
|
break;
|
|
case 34:
|
|
t.datepicker._adjustDate(e.target, e.ctrlKey ? +t.datepicker._get(a, "stepBigMonths") : +t.datepicker._get(a, "stepMonths"), "M");
|
|
break;
|
|
case 35:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._clearDate(e.target), r = e.ctrlKey || e.metaKey;
|
|
break;
|
|
case 36:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._gotoToday(e.target), r = e.ctrlKey || e.metaKey;
|
|
break;
|
|
case 37:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._adjustDate(e.target, o ? 1 : -1, "D"), r = e.ctrlKey || e.metaKey, e.originalEvent.altKey && t.datepicker._adjustDate(e.target, e.ctrlKey ? -t.datepicker._get(a, "stepBigMonths") : -t.datepicker._get(a, "stepMonths"), "M");
|
|
break;
|
|
case 38:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._adjustDate(e.target, -7, "D"), r = e.ctrlKey || e.metaKey;
|
|
break;
|
|
case 39:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._adjustDate(e.target, o ? -1 : 1, "D"), r = e.ctrlKey || e.metaKey, e.originalEvent.altKey && t.datepicker._adjustDate(e.target, e.ctrlKey ? +t.datepicker._get(a, "stepBigMonths") : +t.datepicker._get(a, "stepMonths"), "M");
|
|
break;
|
|
case 40:
|
|
(e.ctrlKey || e.metaKey) && t.datepicker._adjustDate(e.target, 7, "D"), r = e.ctrlKey || e.metaKey;
|
|
break;
|
|
default:
|
|
r = !1
|
|
} else 36 === e.keyCode && e.ctrlKey ? t.datepicker._showDatepicker(this) : r = !1;
|
|
r && (e.preventDefault(), e.stopPropagation())
|
|
},
|
|
_doKeyPress: function (i) {
|
|
var s, n, a = t.datepicker._getInst(i.target);
|
|
return t.datepicker._get(a, "constrainInput") ? (s = t.datepicker._possibleChars(t.datepicker._get(a, "dateFormat")), n = String.fromCharCode(null == i.charCode ? i.keyCode : i.charCode), i.ctrlKey || i.metaKey || " " > n || !s || s.indexOf(n) > -1) : e
|
|
},
|
|
_doKeyUp: function (e) {
|
|
var i, s = t.datepicker._getInst(e.target);
|
|
if (s.input.val() !== s.lastVal) try {
|
|
i = t.datepicker.parseDate(t.datepicker._get(s, "dateFormat"), s.input ? s.input.val() : null, t.datepicker._getFormatConfig(s)), i && (t.datepicker._setDateFromField(s), t.datepicker._updateAlternate(s), t.datepicker._updateDatepicker(s))
|
|
} catch (n) {
|
|
}
|
|
return !0
|
|
},
|
|
_showDatepicker: function (e) {
|
|
if (e = e.target || e, "input" !== e.nodeName.toLowerCase() && (e = t("input", e.parentNode)[0]), !t.datepicker._isDisabledDatepicker(e) && t.datepicker._lastInput !== e) {
|
|
var i, s, a, r, o, h, l;
|
|
i = t.datepicker._getInst(e), t.datepicker._curInst && t.datepicker._curInst !== i && (t.datepicker._curInst.dpDiv.stop(!0, !0), i && t.datepicker._datepickerShowing && t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])), s = t.datepicker._get(i, "beforeShow"), a = s ? s.apply(e, [e, i]) : {}, a !== !1 && (n(i.settings, a), i.lastVal = null, t.datepicker._lastInput = e, t.datepicker._setDateFromField(i), t.datepicker._inDialog && (e.value = ""), t.datepicker._pos || (t.datepicker._pos = t.datepicker._findPos(e), t.datepicker._pos[1] += e.offsetHeight), r = !1, t(e).parents().each(function () {
|
|
return r |= "fixed" === t(this).css("position"), !r
|
|
}), o = {
|
|
left: t.datepicker._pos[0],
|
|
top: t.datepicker._pos[1]
|
|
}, t.datepicker._pos = null, i.dpDiv.empty(), i.dpDiv.css({
|
|
position: "absolute",
|
|
display: "block",
|
|
top: "-1000px"
|
|
}), t.datepicker._updateDatepicker(i), o = t.datepicker._checkOffset(i, o, r), i.dpDiv.css({
|
|
position: t.datepicker._inDialog && t.blockUI ? "static" : r ? "fixed" : "absolute",
|
|
display: "none",
|
|
left: o.left + "px",
|
|
top: o.top + "px"
|
|
}), i.inline || (h = t.datepicker._get(i, "showAnim"), l = t.datepicker._get(i, "duration"), i.dpDiv.zIndex(t(e).zIndex() + 1), t.datepicker._datepickerShowing = !0, t.effects && t.effects.effect[h] ? i.dpDiv.show(h, t.datepicker._get(i, "showOptions"), l) : i.dpDiv[h || "show"](h ? l : null), t.datepicker._shouldFocusInput(i) && i.input.focus(), t.datepicker._curInst = i))
|
|
}
|
|
},
|
|
_updateDatepicker: function (e) {
|
|
this.maxRows = 4, a = e, e.dpDiv.empty().append(this._generateHTML(e)), this._attachHandlers(e), e.dpDiv.find("." + this._dayOverClass + " a").mouseover();
|
|
var i, s = this._getNumberOfMonths(e), n = s[1], r = 17;
|
|
e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""), n > 1 && e.dpDiv.addClass("ui-datepicker-multi-" + n).css("width", r * n + "em"), e.dpDiv[(1 !== s[0] || 1 !== s[1] ? "add" : "remove") + "Class"]("ui-datepicker-multi"), e.dpDiv[(this._get(e, "isRTL") ? "add" : "remove") + "Class"]("ui-datepicker-rtl"), e === t.datepicker._curInst && t.datepicker._datepickerShowing && t.datepicker._shouldFocusInput(e) && e.input.focus(), e.yearshtml && (i = e.yearshtml, setTimeout(function () {
|
|
i === e.yearshtml && e.yearshtml && e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml), i = e.yearshtml = null
|
|
}, 0))
|
|
},
|
|
_shouldFocusInput: function (t) {
|
|
return t.input && t.input.is(":visible") && !t.input.is(":disabled") && !t.input.is(":focus")
|
|
},
|
|
_checkOffset: function (e, i, s) {
|
|
var n = e.dpDiv.outerWidth(), a = e.dpDiv.outerHeight(), r = e.input ? e.input.outerWidth() : 0,
|
|
o = e.input ? e.input.outerHeight() : 0,
|
|
h = document.documentElement.clientWidth + (s ? 0 : t(document).scrollLeft()),
|
|
l = document.documentElement.clientHeight + (s ? 0 : t(document).scrollTop());
|
|
return i.left -= this._get(e, "isRTL") ? n - r : 0, i.left -= s && i.left === e.input.offset().left ? t(document).scrollLeft() : 0, i.top -= s && i.top === e.input.offset().top + o ? t(document).scrollTop() : 0, i.left -= Math.min(i.left, i.left + n > h && h > n ? Math.abs(i.left + n - h) : 0), i.top -= Math.min(i.top, i.top + a > l && l > a ? Math.abs(a + o) : 0), i
|
|
},
|
|
_findPos: function (e) {
|
|
for (var i, s = this._getInst(e), n = this._get(s, "isRTL"); e && ("hidden" === e.type || 1 !== e.nodeType || t.expr.filters.hidden(e));) e = e[n ? "previousSibling" : "nextSibling"];
|
|
return i = t(e).offset(), [i.left, i.top]
|
|
},
|
|
_hideDatepicker: function (e) {
|
|
var i, s, n, a, o = this._curInst;
|
|
!o || e && o !== t.data(e, r) || this._datepickerShowing && (i = this._get(o, "showAnim"), s = this._get(o, "duration"), n = function () {
|
|
t.datepicker._tidyDialog(o)
|
|
}, t.effects && (t.effects.effect[i] || t.effects[i]) ? o.dpDiv.hide(i, t.datepicker._get(o, "showOptions"), s, n) : o.dpDiv["slideDown" === i ? "slideUp" : "fadeIn" === i ? "fadeOut" : "hide"](i ? s : null, n), i || n(), this._datepickerShowing = !1, a = this._get(o, "onClose"), a && a.apply(o.input ? o.input[0] : null, [o.input ? o.input.val() : "", o]), this._lastInput = null, this._inDialog && (this._dialogInput.css({
|
|
position: "absolute",
|
|
left: "0",
|
|
top: "-100px"
|
|
}), t.blockUI && (t.unblockUI(), t("body").append(this.dpDiv))), this._inDialog = !1)
|
|
},
|
|
_tidyDialog: function (t) {
|
|
t.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")
|
|
},
|
|
_checkExternalClick: function (e) {
|
|
if (t.datepicker._curInst) {
|
|
var i = t(e.target), s = t.datepicker._getInst(i[0]);
|
|
(i[0].id !== t.datepicker._mainDivId && 0 === i.parents("#" + t.datepicker._mainDivId).length && !i.hasClass(t.datepicker.markerClassName) && !i.closest("." + t.datepicker._triggerClass).length && t.datepicker._datepickerShowing && (!t.datepicker._inDialog || !t.blockUI) || i.hasClass(t.datepicker.markerClassName) && t.datepicker._curInst !== s) && t.datepicker._hideDatepicker()
|
|
}
|
|
},
|
|
_adjustDate: function (e, i, s) {
|
|
var n = t(e), a = this._getInst(n[0]);
|
|
this._isDisabledDatepicker(n[0]) || (this._adjustInstDate(a, i + ("M" === s ? this._get(a, "showCurrentAtPos") : 0), s), this._updateDatepicker(a))
|
|
},
|
|
_gotoToday: function (e) {
|
|
var i, s = t(e), n = this._getInst(s[0]);
|
|
this._get(n, "gotoCurrent") && n.currentDay ? (n.selectedDay = n.currentDay, n.drawMonth = n.selectedMonth = n.currentMonth, n.drawYear = n.selectedYear = n.currentYear) : (i = new Date, n.selectedDay = i.getDate(), n.drawMonth = n.selectedMonth = i.getMonth(), n.drawYear = n.selectedYear = i.getFullYear()), this._notifyChange(n), this._adjustDate(s)
|
|
},
|
|
_selectMonthYear: function (e, i, s) {
|
|
var n = t(e), a = this._getInst(n[0]);
|
|
a["selected" + ("M" === s ? "Month" : "Year")] = a["draw" + ("M" === s ? "Month" : "Year")] = parseInt(i.options[i.selectedIndex].value, 10), this._notifyChange(a), this._adjustDate(n)
|
|
},
|
|
_selectDay: function (e, i, s, n) {
|
|
var a, r = t(e);
|
|
t(n).hasClass(this._unselectableClass) || this._isDisabledDatepicker(r[0]) || (a = this._getInst(r[0]), a.selectedDay = a.currentDay = t("a", n).html(), a.selectedMonth = a.currentMonth = i, a.selectedYear = a.currentYear = s, this._selectDate(e, this._formatDate(a, a.currentDay, a.currentMonth, a.currentYear)))
|
|
},
|
|
_clearDate: function (e) {
|
|
var i = t(e);
|
|
this._selectDate(i, "")
|
|
},
|
|
_selectDate: function (e, i) {
|
|
var s, n = t(e), a = this._getInst(n[0]);
|
|
i = null != i ? i : this._formatDate(a), a.input && a.input.val(i), this._updateAlternate(a), s = this._get(a, "onSelect"), s ? s.apply(a.input ? a.input[0] : null, [i, a]) : a.input && a.input.trigger("change"), a.inline ? this._updateDatepicker(a) : (this._hideDatepicker(), this._lastInput = a.input[0], "object" != typeof a.input[0] && a.input.focus(), this._lastInput = null)
|
|
},
|
|
_updateAlternate: function (e) {
|
|
var i, s, n, a = this._get(e, "altField");
|
|
a && (i = this._get(e, "altFormat") || this._get(e, "dateFormat"), s = this._getDate(e), n = this.formatDate(i, s, this._getFormatConfig(e)), t(a).each(function () {
|
|
t(this).val(n)
|
|
}))
|
|
},
|
|
noWeekends: function (t) {
|
|
var e = t.getDay();
|
|
return [e > 0 && 6 > e, ""]
|
|
},
|
|
iso8601Week: function (t) {
|
|
var e, i = new Date(t.getTime());
|
|
return i.setDate(i.getDate() + 4 - (i.getDay() || 7)), e = i.getTime(), i.setMonth(0), i.setDate(1), Math.floor(Math.round((e - i) / 864e5) / 7) + 1
|
|
},
|
|
parseDate: function (i, s, n) {
|
|
if (null == i || null == s) throw"Invalid arguments";
|
|
if (s = "object" == typeof s ? "" + s : s + "", "" === s) return null;
|
|
var a, r, o, h, l = 0, c = (n ? n.shortYearCutoff : null) || this._defaults.shortYearCutoff,
|
|
u = "string" != typeof c ? c : (new Date).getFullYear() % 100 + parseInt(c, 10),
|
|
d = (n ? n.dayNamesShort : null) || this._defaults.dayNamesShort,
|
|
p = (n ? n.dayNames : null) || this._defaults.dayNames,
|
|
f = (n ? n.monthNamesShort : null) || this._defaults.monthNamesShort,
|
|
m = (n ? n.monthNames : null) || this._defaults.monthNames, g = -1, v = -1, _ = -1, b = -1, y = !1,
|
|
x = function (t) {
|
|
var e = i.length > a + 1 && i.charAt(a + 1) === t;
|
|
return e && a++, e
|
|
}, k = function (t) {
|
|
var e = x(t), i = "@" === t ? 14 : "!" === t ? 20 : "y" === t && e ? 4 : "o" === t ? 3 : 2,
|
|
n = RegExp("^\\d{1," + i + "}"), a = s.substring(l).match(n);
|
|
if (!a) throw"Missing number at position " + l;
|
|
return l += a[0].length, parseInt(a[0], 10)
|
|
}, w = function (i, n, a) {
|
|
var r = -1, o = t.map(x(i) ? a : n, function (t, e) {
|
|
return [[e, t]]
|
|
}).sort(function (t, e) {
|
|
return -(t[1].length - e[1].length)
|
|
});
|
|
if (t.each(o, function (t, i) {
|
|
var n = i[1];
|
|
return s.substr(l, n.length).toLowerCase() === n.toLowerCase() ? (r = i[0], l += n.length, !1) : e
|
|
}), -1 !== r) return r + 1;
|
|
throw"Unknown name at position " + l
|
|
}, D = function () {
|
|
if (s.charAt(l) !== i.charAt(a)) throw"Unexpected literal at position " + l;
|
|
l++
|
|
};
|
|
for (a = 0; i.length > a; a++) if (y) "'" !== i.charAt(a) || x("'") ? D() : y = !1; else switch (i.charAt(a)) {
|
|
case"d":
|
|
_ = k("d");
|
|
break;
|
|
case"D":
|
|
w("D", d, p);
|
|
break;
|
|
case"o":
|
|
b = k("o");
|
|
break;
|
|
case"m":
|
|
v = k("m");
|
|
break;
|
|
case"M":
|
|
v = w("M", f, m);
|
|
break;
|
|
case"y":
|
|
g = k("y");
|
|
break;
|
|
case"@":
|
|
h = new Date(k("@")), g = h.getFullYear(), v = h.getMonth() + 1, _ = h.getDate();
|
|
break;
|
|
case"!":
|
|
h = new Date((k("!") - this._ticksTo1970) / 1e4), g = h.getFullYear(), v = h.getMonth() + 1, _ = h.getDate();
|
|
break;
|
|
case"'":
|
|
x("'") ? D() : y = !0;
|
|
break;
|
|
default:
|
|
D()
|
|
}
|
|
if (s.length > l && (o = s.substr(l), !/^\s+/.test(o))) throw"Extra/unparsed characters found in date: " + o;
|
|
if (-1 === g ? g = (new Date).getFullYear() : 100 > g && (g += (new Date).getFullYear() - (new Date).getFullYear() % 100 + (u >= g ? 0 : -100)), b > -1) for (v = 1, _ = b; ;) {
|
|
if (r = this._getDaysInMonth(g, v - 1), r >= _) break;
|
|
v++, _ -= r
|
|
}
|
|
if (h = this._daylightSavingAdjust(new Date(g, v - 1, _)), h.getFullYear() !== g || h.getMonth() + 1 !== v || h.getDate() !== _) throw"Invalid date";
|
|
return h
|
|
},
|
|
ATOM: "yy-mm-dd",
|
|
COOKIE: "D, dd M yy",
|
|
ISO_8601: "yy-mm-dd",
|
|
RFC_822: "D, d M y",
|
|
RFC_850: "DD, dd-M-y",
|
|
RFC_1036: "D, d M y",
|
|
RFC_1123: "D, d M yy",
|
|
RFC_2822: "D, d M yy",
|
|
RSS: "D, d M y",
|
|
TICKS: "!",
|
|
TIMESTAMP: "@",
|
|
W3C: "yy-mm-dd",
|
|
_ticksTo1970: 1e7 * 60 * 60 * 24 * (718685 + Math.floor(492.5) - Math.floor(19.7) + Math.floor(4.925)),
|
|
formatDate: function (t, e, i) {
|
|
if (!e) return "";
|
|
var s, n = (i ? i.dayNamesShort : null) || this._defaults.dayNamesShort,
|
|
a = (i ? i.dayNames : null) || this._defaults.dayNames,
|
|
r = (i ? i.monthNamesShort : null) || this._defaults.monthNamesShort,
|
|
o = (i ? i.monthNames : null) || this._defaults.monthNames, h = function (e) {
|
|
var i = t.length > s + 1 && t.charAt(s + 1) === e;
|
|
return i && s++, i
|
|
}, l = function (t, e, i) {
|
|
var s = "" + e;
|
|
if (h(t)) for (; i > s.length;) s = "0" + s;
|
|
return s
|
|
}, c = function (t, e, i, s) {
|
|
return h(t) ? s[e] : i[e]
|
|
}, u = "", d = !1;
|
|
if (e) for (s = 0; t.length > s; s++) if (d) "'" !== t.charAt(s) || h("'") ? u += t.charAt(s) : d = !1; else switch (t.charAt(s)) {
|
|
case"d":
|
|
u += l("d", e.getDate(), 2);
|
|
break;
|
|
case"D":
|
|
u += c("D", e.getDay(), n, a);
|
|
break;
|
|
case"o":
|
|
u += l("o", Math.round((new Date(e.getFullYear(), e.getMonth(), e.getDate()).getTime() - new Date(e.getFullYear(), 0, 0).getTime()) / 864e5), 3);
|
|
break;
|
|
case"m":
|
|
u += l("m", e.getMonth() + 1, 2);
|
|
break;
|
|
case"M":
|
|
u += c("M", e.getMonth(), r, o);
|
|
break;
|
|
case"y":
|
|
u += h("y") ? e.getFullYear() : (10 > e.getYear() % 100 ? "0" : "") + e.getYear() % 100;
|
|
break;
|
|
case"@":
|
|
u += e.getTime();
|
|
break;
|
|
case"!":
|
|
u += 1e4 * e.getTime() + this._ticksTo1970;
|
|
break;
|
|
case"'":
|
|
h("'") ? u += "'" : d = !0;
|
|
break;
|
|
default:
|
|
u += t.charAt(s)
|
|
}
|
|
return u
|
|
},
|
|
_possibleChars: function (t) {
|
|
var e, i = "", s = !1, n = function (i) {
|
|
var s = t.length > e + 1 && t.charAt(e + 1) === i;
|
|
return s && e++, s
|
|
};
|
|
for (e = 0; t.length > e; e++) if (s) "'" !== t.charAt(e) || n("'") ? i += t.charAt(e) : s = !1; else switch (t.charAt(e)) {
|
|
case"d":
|
|
case"m":
|
|
case"y":
|
|
case"@":
|
|
i += "0123456789";
|
|
break;
|
|
case"D":
|
|
case"M":
|
|
return null;
|
|
case"'":
|
|
n("'") ? i += "'" : s = !0;
|
|
break;
|
|
default:
|
|
i += t.charAt(e)
|
|
}
|
|
return i
|
|
},
|
|
_get: function (t, i) {
|
|
return t.settings[i] !== e ? t.settings[i] : this._defaults[i]
|
|
},
|
|
_setDateFromField: function (t, e) {
|
|
if (t.input.val() !== t.lastVal) {
|
|
var i = this._get(t, "dateFormat"), s = t.lastVal = t.input ? t.input.val() : null,
|
|
n = this._getDefaultDate(t), a = n, r = this._getFormatConfig(t);
|
|
try {
|
|
a = this.parseDate(i, s, r) || n
|
|
} catch (o) {
|
|
s = e ? "" : s
|
|
}
|
|
t.selectedDay = a.getDate(), t.drawMonth = t.selectedMonth = a.getMonth(), t.drawYear = t.selectedYear = a.getFullYear(), t.currentDay = s ? a.getDate() : 0, t.currentMonth = s ? a.getMonth() : 0, t.currentYear = s ? a.getFullYear() : 0, this._adjustInstDate(t)
|
|
}
|
|
},
|
|
_getDefaultDate: function (t) {
|
|
return this._restrictMinMax(t, this._determineDate(t, this._get(t, "defaultDate"), new Date))
|
|
},
|
|
_determineDate: function (e, i, s) {
|
|
var n = function (t) {
|
|
var e = new Date;
|
|
return e.setDate(e.getDate() + t), e
|
|
}, a = function (i) {
|
|
try {
|
|
return t.datepicker.parseDate(t.datepicker._get(e, "dateFormat"), i, t.datepicker._getFormatConfig(e))
|
|
} catch (s) {
|
|
}
|
|
for (var n = (i.toLowerCase().match(/^c/) ? t.datepicker._getDate(e) : null) || new Date, a = n.getFullYear(), r = n.getMonth(), o = n.getDate(), h = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, l = h.exec(i); l;) {
|
|
switch (l[2] || "d") {
|
|
case"d":
|
|
case"D":
|
|
o += parseInt(l[1], 10);
|
|
break;
|
|
case"w":
|
|
case"W":
|
|
o += 7 * parseInt(l[1], 10);
|
|
break;
|
|
case"m":
|
|
case"M":
|
|
r += parseInt(l[1], 10), o = Math.min(o, t.datepicker._getDaysInMonth(a, r));
|
|
break;
|
|
case"y":
|
|
case"Y":
|
|
a += parseInt(l[1], 10), o = Math.min(o, t.datepicker._getDaysInMonth(a, r))
|
|
}
|
|
l = h.exec(i)
|
|
}
|
|
return new Date(a, r, o)
|
|
},
|
|
r = null == i || "" === i ? s : "string" == typeof i ? a(i) : "number" == typeof i ? isNaN(i) ? s : n(i) : new Date(i.getTime());
|
|
return r = r && "Invalid Date" == "" + r ? s : r, r && (r.setHours(0), r.setMinutes(0), r.setSeconds(0), r.setMilliseconds(0)), this._daylightSavingAdjust(r)
|
|
},
|
|
_daylightSavingAdjust: function (t) {
|
|
return t ? (t.setHours(t.getHours() > 12 ? t.getHours() + 2 : 0), t) : null
|
|
},
|
|
_setDate: function (t, e, i) {
|
|
var s = !e, n = t.selectedMonth, a = t.selectedYear,
|
|
r = this._restrictMinMax(t, this._determineDate(t, e, new Date));
|
|
t.selectedDay = t.currentDay = r.getDate(), t.drawMonth = t.selectedMonth = t.currentMonth = r.getMonth(), t.drawYear = t.selectedYear = t.currentYear = r.getFullYear(), n === t.selectedMonth && a === t.selectedYear || i || this._notifyChange(t), this._adjustInstDate(t), t.input && t.input.val(s ? "" : this._formatDate(t))
|
|
},
|
|
_getDate: function (t) {
|
|
var e = !t.currentYear || t.input && "" === t.input.val() ? null : this._daylightSavingAdjust(new Date(t.currentYear, t.currentMonth, t.currentDay));
|
|
return e
|
|
},
|
|
_attachHandlers: function (e) {
|
|
var i = this._get(e, "stepMonths"), s = "#" + e.id.replace(/\\\\/g, "\\");
|
|
e.dpDiv.find("[data-handler]").map(function () {
|
|
var e = {
|
|
prev: function () {
|
|
t.datepicker._adjustDate(s, -i, "M")
|
|
}, next: function () {
|
|
t.datepicker._adjustDate(s, +i, "M")
|
|
}, hide: function () {
|
|
t.datepicker._hideDatepicker()
|
|
}, today: function () {
|
|
t.datepicker._gotoToday(s)
|
|
}, selectDay: function () {
|
|
return t.datepicker._selectDay(s, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this), !1
|
|
}, selectMonth: function () {
|
|
return t.datepicker._selectMonthYear(s, this, "M"), !1
|
|
}, selectYear: function () {
|
|
return t.datepicker._selectMonthYear(s, this, "Y"), !1
|
|
}
|
|
};
|
|
t(this).bind(this.getAttribute("data-event"), e[this.getAttribute("data-handler")])
|
|
})
|
|
},
|
|
_generateHTML: function (t) {
|
|
var e, i, s, n, a, r, o, h, l, c, u, d, p, f, m, g, v, _, b, y, x, k, w, D, T, C, M, S, N, I, P, A, z, H, E,
|
|
F, O, W, j, R = new Date,
|
|
L = this._daylightSavingAdjust(new Date(R.getFullYear(), R.getMonth(), R.getDate())),
|
|
Y = this._get(t, "isRTL"), B = this._get(t, "showButtonPanel"), J = this._get(t, "hideIfNoPrevNext"),
|
|
K = this._get(t, "navigationAsDateFormat"), Q = this._getNumberOfMonths(t),
|
|
V = this._get(t, "showCurrentAtPos"), U = this._get(t, "stepMonths"), q = 1 !== Q[0] || 1 !== Q[1],
|
|
X = this._daylightSavingAdjust(t.currentDay ? new Date(t.currentYear, t.currentMonth, t.currentDay) : new Date(9999, 9, 9)),
|
|
G = this._getMinMaxDate(t, "min"), $ = this._getMinMaxDate(t, "max"), Z = t.drawMonth - V,
|
|
te = t.drawYear;
|
|
if (0 > Z && (Z += 12, te--), $) for (e = this._daylightSavingAdjust(new Date($.getFullYear(), $.getMonth() - Q[0] * Q[1] + 1, $.getDate())), e = G && G > e ? G : e; this._daylightSavingAdjust(new Date(te, Z, 1)) > e;) Z--, 0 > Z && (Z = 11, te--);
|
|
for (t.drawMonth = Z, t.drawYear = te, i = this._get(t, "prevText"), i = K ? this.formatDate(i, this._daylightSavingAdjust(new Date(te, Z - U, 1)), this._getFormatConfig(t)) : i, s = this._canAdjustMonth(t, -1, te, Z) ? "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='" + i + "'><span class='ui-icon ui-icon-circle-triangle-" + (Y ? "e" : "w") + "'>" + i + "</span></a>" : J ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + i + "'><span class='ui-icon ui-icon-circle-triangle-" + (Y ? "e" : "w") + "'>" + i + "</span></a>", n = this._get(t, "nextText"), n = K ? this.formatDate(n, this._daylightSavingAdjust(new Date(te, Z + U, 1)), this._getFormatConfig(t)) : n, a = this._canAdjustMonth(t, 1, te, Z) ? "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='" + n + "'><span class='ui-icon ui-icon-circle-triangle-" + (Y ? "w" : "e") + "'>" + n + "</span></a>" : J ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + n + "'><span class='ui-icon ui-icon-circle-triangle-" + (Y ? "w" : "e") + "'>" + n + "</span></a>", r = this._get(t, "currentText"), o = this._get(t, "gotoCurrent") && t.currentDay ? X : L, r = K ? this.formatDate(r, o, this._getFormatConfig(t)) : r, h = t.inline ? "" : "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" + this._get(t, "closeText") + "</button>", l = B ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (Y ? h : "") + (this._isInRange(t, o) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>" + r + "</button>" : "") + (Y ? "" : h) + "</div>" : "", c = parseInt(this._get(t, "firstDay"), 10), c = isNaN(c) ? 0 : c, u = this._get(t, "showWeek"), d = this._get(t, "dayNames"), p = this._get(t, "dayNamesMin"), f = this._get(t, "monthNames"), m = this._get(t, "monthNamesShort"), g = this._get(t, "beforeShowDay"), v = this._get(t, "showOtherMonths"), _ = this._get(t, "selectOtherMonths"), b = this._getDefaultDate(t), y = "", k = 0; Q[0] > k; k++) {
|
|
for (w = "", this.maxRows = 4, D = 0; Q[1] > D; D++) {
|
|
if (T = this._daylightSavingAdjust(new Date(te, Z, t.selectedDay)), C = " ui-corner-all", M = "", q) {
|
|
if (M += "<div class='ui-datepicker-group", Q[1] > 1) switch (D) {
|
|
case 0:
|
|
M += " ui-datepicker-group-first", C = " ui-corner-" + (Y ? "right" : "left");
|
|
break;
|
|
case Q[1] - 1:
|
|
M += " ui-datepicker-group-last", C = " ui-corner-" + (Y ? "left" : "right");
|
|
break;
|
|
default:
|
|
M += " ui-datepicker-group-middle", C = ""
|
|
}
|
|
M += "'>"
|
|
}
|
|
for (M += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + C + "'>" + (/all|left/.test(C) && 0 === k ? Y ? a : s : "") + (/all|right/.test(C) && 0 === k ? Y ? s : a : "") + this._generateMonthYearHeader(t, Z, te, G, $, k > 0 || D > 0, f, m) + "</div><table class='ui-datepicker-calendar'><thead>" + "<tr>", S = u ? "<th class='ui-datepicker-week-col'>" + this._get(t, "weekHeader") + "</th>" : "", x = 0; 7 > x; x++) N = (x + c) % 7, S += "<th" + ((x + c + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + "<span title='" + d[N] + "'>" + p[N] + "</span></th>";
|
|
for (M += S + "</tr></thead><tbody>", I = this._getDaysInMonth(te, Z), te === t.selectedYear && Z === t.selectedMonth && (t.selectedDay = Math.min(t.selectedDay, I)), P = (this._getFirstDayOfMonth(te, Z) - c + 7) % 7, A = Math.ceil((P + I) / 7), z = q ? this.maxRows > A ? this.maxRows : A : A, this.maxRows = z, H = this._daylightSavingAdjust(new Date(te, Z, 1 - P)), E = 0; z > E; E++) {
|
|
for (M += "<tr>", F = u ? "<td class='ui-datepicker-week-col'>" + this._get(t, "calculateWeek")(H) + "</td>" : "", x = 0; 7 > x; x++) O = g ? g.apply(t.input ? t.input[0] : null, [H]) : [!0, ""], W = H.getMonth() !== Z, j = W && !_ || !O[0] || G && G > H || $ && H > $, F += "<td class='" + ((x + c + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + (W ? " ui-datepicker-other-month" : "") + (H.getTime() === T.getTime() && Z === t.selectedMonth && t._keyEvent || b.getTime() === H.getTime() && b.getTime() === T.getTime() ? " " + this._dayOverClass : "") + (j ? " " + this._unselectableClass + " ui-state-disabled" : "") + (W && !v ? "" : " " + O[1] + (H.getTime() === X.getTime() ? " " + this._currentClass : "") + (H.getTime() === L.getTime() ? " ui-datepicker-today" : "")) + "'" + (W && !v || !O[2] ? "" : " title='" + O[2].replace(/'/g, "'") + "'") + (j ? "" : " data-handler='selectDay' data-event='click' data-month='" + H.getMonth() + "' data-year='" + H.getFullYear() + "'") + ">" + (W && !v ? " " : j ? "<span class='ui-state-default'>" + H.getDate() + "</span>" : "<a class='ui-state-default" + (H.getTime() === L.getTime() ? " ui-state-highlight" : "") + (H.getTime() === X.getTime() ? " ui-state-active" : "") + (W ? " ui-priority-secondary" : "") + "' href='#'>" + H.getDate() + "</a>") + "</td>", H.setDate(H.getDate() + 1), H = this._daylightSavingAdjust(H);
|
|
M += F + "</tr>"
|
|
}
|
|
Z++, Z > 11 && (Z = 0, te++), M += "</tbody></table>" + (q ? "</div>" + (Q[0] > 0 && D === Q[1] - 1 ? "<div class='ui-datepicker-row-break'></div>" : "") : ""), w += M
|
|
}
|
|
y += w
|
|
}
|
|
return y += l, t._keyEvent = !1, y
|
|
},
|
|
_generateMonthYearHeader: function (t, e, i, s, n, a, r, o) {
|
|
var h, l, c, u, d, p, f, m, g = this._get(t, "changeMonth"), v = this._get(t, "changeYear"),
|
|
_ = this._get(t, "showMonthAfterYear"), b = "<div class='ui-datepicker-title'>", y = "";
|
|
if (a || !g) y += "<span class='ui-datepicker-month'>" + r[e] + "</span>"; else {
|
|
for (h = s && s.getFullYear() === i, l = n && n.getFullYear() === i, y += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>", c = 0; 12 > c; c++) (!h || c >= s.getMonth()) && (!l || n.getMonth() >= c) && (y += "<option value='" + c + "'" + (c === e ? " selected='selected'" : "") + ">" + o[c] + "</option>");
|
|
y += "</select>"
|
|
}
|
|
if (_ || (b += y + (!a && g && v ? "" : " ")), !t.yearshtml) if (t.yearshtml = "", a || !v) b += "<span class='ui-datepicker-year'>" + i + "</span>"; else {
|
|
for (u = this._get(t, "yearRange").split(":"), d = (new Date).getFullYear(), p = function (t) {
|
|
var e = t.match(/c[+\-].*/) ? i + parseInt(t.substring(1), 10) : t.match(/[+\-].*/) ? d + parseInt(t, 10) : parseInt(t, 10);
|
|
return isNaN(e) ? d : e
|
|
}, f = p(u[0]), m = Math.max(f, p(u[1] || "")), f = s ? Math.max(f, s.getFullYear()) : f, m = n ? Math.min(m, n.getFullYear()) : m, t.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>"; m >= f; f++) t.yearshtml += "<option value='" + f + "'" + (f === i ? " selected='selected'" : "") + ">" + f + "</option>";
|
|
t.yearshtml += "</select>", b += t.yearshtml, t.yearshtml = null
|
|
}
|
|
return b += this._get(t, "yearSuffix"), _ && (b += (!a && g && v ? "" : " ") + y), b += "</div>"
|
|
},
|
|
_adjustInstDate: function (t, e, i) {
|
|
var s = t.drawYear + ("Y" === i ? e : 0), n = t.drawMonth + ("M" === i ? e : 0),
|
|
a = Math.min(t.selectedDay, this._getDaysInMonth(s, n)) + ("D" === i ? e : 0),
|
|
r = this._restrictMinMax(t, this._daylightSavingAdjust(new Date(s, n, a)));
|
|
t.selectedDay = r.getDate(), t.drawMonth = t.selectedMonth = r.getMonth(), t.drawYear = t.selectedYear = r.getFullYear(), ("M" === i || "Y" === i) && this._notifyChange(t)
|
|
},
|
|
_restrictMinMax: function (t, e) {
|
|
var i = this._getMinMaxDate(t, "min"), s = this._getMinMaxDate(t, "max"), n = i && i > e ? i : e;
|
|
return s && n > s ? s : n
|
|
},
|
|
_notifyChange: function (t) {
|
|
var e = this._get(t, "onChangeMonthYear");
|
|
e && e.apply(t.input ? t.input[0] : null, [t.selectedYear, t.selectedMonth + 1, t])
|
|
},
|
|
_getNumberOfMonths: function (t) {
|
|
var e = this._get(t, "numberOfMonths");
|
|
return null == e ? [1, 1] : "number" == typeof e ? [1, e] : e
|
|
},
|
|
_getMinMaxDate: function (t, e) {
|
|
return this._determineDate(t, this._get(t, e + "Date"), null)
|
|
},
|
|
_getDaysInMonth: function (t, e) {
|
|
return 32 - this._daylightSavingAdjust(new Date(t, e, 32)).getDate()
|
|
},
|
|
_getFirstDayOfMonth: function (t, e) {
|
|
return new Date(t, e, 1).getDay()
|
|
},
|
|
_canAdjustMonth: function (t, e, i, s) {
|
|
var n = this._getNumberOfMonths(t),
|
|
a = this._daylightSavingAdjust(new Date(i, s + (0 > e ? e : n[0] * n[1]), 1));
|
|
return 0 > e && a.setDate(this._getDaysInMonth(a.getFullYear(), a.getMonth())), this._isInRange(t, a)
|
|
},
|
|
_isInRange: function (t, e) {
|
|
var i, s, n = this._getMinMaxDate(t, "min"), a = this._getMinMaxDate(t, "max"), r = null, o = null,
|
|
h = this._get(t, "yearRange");
|
|
return h && (i = h.split(":"), s = (new Date).getFullYear(), r = parseInt(i[0], 10), o = parseInt(i[1], 10), i[0].match(/[+\-].*/) && (r += s), i[1].match(/[+\-].*/) && (o += s)), (!n || e.getTime() >= n.getTime()) && (!a || e.getTime() <= a.getTime()) && (!r || e.getFullYear() >= r) && (!o || o >= e.getFullYear())
|
|
},
|
|
_getFormatConfig: function (t) {
|
|
var e = this._get(t, "shortYearCutoff");
|
|
return e = "string" != typeof e ? e : (new Date).getFullYear() % 100 + parseInt(e, 10), {
|
|
shortYearCutoff: e,
|
|
dayNamesShort: this._get(t, "dayNamesShort"),
|
|
dayNames: this._get(t, "dayNames"),
|
|
monthNamesShort: this._get(t, "monthNamesShort"),
|
|
monthNames: this._get(t, "monthNames")
|
|
}
|
|
},
|
|
_formatDate: function (t, e, i, s) {
|
|
e || (t.currentDay = t.selectedDay, t.currentMonth = t.selectedMonth, t.currentYear = t.selectedYear);
|
|
var n = e ? "object" == typeof e ? e : this._daylightSavingAdjust(new Date(s, i, e)) : this._daylightSavingAdjust(new Date(t.currentYear, t.currentMonth, t.currentDay));
|
|
return this.formatDate(this._get(t, "dateFormat"), n, this._getFormatConfig(t))
|
|
}
|
|
}), t.fn.datepicker = function (e) {
|
|
if (!this.length) return this;
|
|
t.datepicker.initialized || (t(document).mousedown(t.datepicker._checkExternalClick), t.datepicker.initialized = !0), 0 === t("#" + t.datepicker._mainDivId).length && t("body").append(t.datepicker.dpDiv);
|
|
var i = Array.prototype.slice.call(arguments, 1);
|
|
return "string" != typeof e || "isDisabled" !== e && "getDate" !== e && "widget" !== e ? "option" === e && 2 === arguments.length && "string" == typeof arguments[1] ? t.datepicker["_" + e + "Datepicker"].apply(t.datepicker, [this[0]].concat(i)) : this.each(function () {
|
|
"string" == typeof e ? t.datepicker["_" + e + "Datepicker"].apply(t.datepicker, [this].concat(i)) : t.datepicker._attachDatepicker(this, e)
|
|
}) : t.datepicker["_" + e + "Datepicker"].apply(t.datepicker, [this[0]].concat(i))
|
|
}, t.datepicker = new i, t.datepicker.initialized = !1, t.datepicker.uuid = (new Date).getTime(), t.datepicker.version = "1.10.3"
|
|
})(jQuery);
|
|
(function (t) {
|
|
var e = 5;
|
|
t.widget("ui.slider", t.ui.mouse, {
|
|
version: "1.10.3",
|
|
widgetEventPrefix: "slide",
|
|
options: {
|
|
animate: !1,
|
|
distance: 0,
|
|
max: 100,
|
|
min: 0,
|
|
orientation: "horizontal",
|
|
range: !1,
|
|
step: 1,
|
|
value: 0,
|
|
values: null,
|
|
change: null,
|
|
slide: null,
|
|
start: null,
|
|
stop: null
|
|
},
|
|
_create: function () {
|
|
this._keySliding = !1, this._mouseSliding = !1, this._animateOff = !0, this._handleIndex = null, this._detectOrientation(), this._mouseInit(), this.element.addClass("ui-slider ui-slider-" + this.orientation + " ui-widget" + " ui-widget-content" + " ui-corner-all"), this._refresh(), this._setOption("disabled", this.options.disabled), this._animateOff = !1
|
|
},
|
|
_refresh: function () {
|
|
this._createRange(), this._createHandles(), this._setupEvents(), this._refreshValue()
|
|
},
|
|
_createHandles: function () {
|
|
var e, i, s = this.options,
|
|
n = this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),
|
|
a = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>", o = [];
|
|
for (i = s.values && s.values.length || 1, n.length > i && (n.slice(i).remove(), n = n.slice(0, i)), e = n.length; i > e; e++) o.push(a);
|
|
this.handles = n.add(t(o.join("")).appendTo(this.element)), this.handle = this.handles.eq(0), this.handles.each(function (e) {
|
|
t(this).data("ui-slider-handle-index", e)
|
|
})
|
|
},
|
|
_createRange: function () {
|
|
var e = this.options, i = "";
|
|
e.range ? (e.range === !0 && (e.values ? e.values.length && 2 !== e.values.length ? e.values = [e.values[0], e.values[0]] : t.isArray(e.values) && (e.values = e.values.slice(0)) : e.values = [this._valueMin(), this._valueMin()]), this.range && this.range.length ? this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({
|
|
left: "",
|
|
bottom: ""
|
|
}) : (this.range = t("<div></div>").appendTo(this.element), i = "ui-slider-range ui-widget-header ui-corner-all"), this.range.addClass(i + ("min" === e.range || "max" === e.range ? " ui-slider-range-" + e.range : ""))) : this.range = t([])
|
|
},
|
|
_setupEvents: function () {
|
|
var t = this.handles.add(this.range).filter("a");
|
|
this._off(t), this._on(t, this._handleEvents), this._hoverable(t), this._focusable(t)
|
|
},
|
|
_destroy: function () {
|
|
this.handles.remove(), this.range.remove(), this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"), this._mouseDestroy()
|
|
},
|
|
_mouseCapture: function (e) {
|
|
var i, s, n, a, o, r, h, l, u = this, c = this.options;
|
|
return c.disabled ? !1 : (this.elementSize = {
|
|
width: this.element.outerWidth(),
|
|
height: this.element.outerHeight()
|
|
}, this.elementOffset = this.element.offset(), i = {
|
|
x: e.pageX,
|
|
y: e.pageY
|
|
}, s = this._normValueFromMouse(i), n = this._valueMax() - this._valueMin() + 1, this.handles.each(function (e) {
|
|
var i = Math.abs(s - u.values(e));
|
|
(n > i || n === i && (e === u._lastChangedValue || u.values(e) === c.min)) && (n = i, a = t(this), o = e)
|
|
}), r = this._start(e, o), r === !1 ? !1 : (this._mouseSliding = !0, this._handleIndex = o, a.addClass("ui-state-active").focus(), h = a.offset(), l = !t(e.target).parents().addBack().is(".ui-slider-handle"), this._clickOffset = l ? {
|
|
left: 0,
|
|
top: 0
|
|
} : {
|
|
left: e.pageX - h.left - a.width() / 2,
|
|
top: e.pageY - h.top - a.height() / 2 - (parseInt(a.css("borderTopWidth"), 10) || 0) - (parseInt(a.css("borderBottomWidth"), 10) || 0) + (parseInt(a.css("marginTop"), 10) || 0)
|
|
}, this.handles.hasClass("ui-state-hover") || this._slide(e, o, s), this._animateOff = !0, !0))
|
|
},
|
|
_mouseStart: function () {
|
|
return !0
|
|
},
|
|
_mouseDrag: function (t) {
|
|
var e = {x: t.pageX, y: t.pageY}, i = this._normValueFromMouse(e);
|
|
return this._slide(t, this._handleIndex, i), !1
|
|
},
|
|
_mouseStop: function (t) {
|
|
return this.handles.removeClass("ui-state-active"), this._mouseSliding = !1, this._stop(t, this._handleIndex), this._change(t, this._handleIndex), this._handleIndex = null, this._clickOffset = null, this._animateOff = !1, !1
|
|
},
|
|
_detectOrientation: function () {
|
|
this.orientation = "vertical" === this.options.orientation ? "vertical" : "horizontal"
|
|
},
|
|
_normValueFromMouse: function (t) {
|
|
var e, i, s, n, a;
|
|
return "horizontal" === this.orientation ? (e = this.elementSize.width, i = t.x - this.elementOffset.left - (this._clickOffset ? this._clickOffset.left : 0)) : (e = this.elementSize.height, i = t.y - this.elementOffset.top - (this._clickOffset ? this._clickOffset.top : 0)), s = i / e, s > 1 && (s = 1), 0 > s && (s = 0), "vertical" === this.orientation && (s = 1 - s), n = this._valueMax() - this._valueMin(), a = this._valueMin() + s * n, this._trimAlignValue(a)
|
|
},
|
|
_start: function (t, e) {
|
|
var i = {handle: this.handles[e], value: this.value()};
|
|
return this.options.values && this.options.values.length && (i.value = this.values(e), i.values = this.values()), this._trigger("start", t, i)
|
|
},
|
|
_slide: function (t, e, i) {
|
|
var s, n, a;
|
|
this.options.values && this.options.values.length ? (s = this.values(e ? 0 : 1), 2 === this.options.values.length && this.options.range === !0 && (0 === e && i > s || 1 === e && s > i) && (i = s), i !== this.values(e) && (n = this.values(), n[e] = i, a = this._trigger("slide", t, {
|
|
handle: this.handles[e],
|
|
value: i,
|
|
values: n
|
|
}), s = this.values(e ? 0 : 1), a !== !1 && this.values(e, i, !0))) : i !== this.value() && (a = this._trigger("slide", t, {
|
|
handle: this.handles[e],
|
|
value: i
|
|
}), a !== !1 && this.value(i))
|
|
},
|
|
_stop: function (t, e) {
|
|
var i = {handle: this.handles[e], value: this.value()};
|
|
this.options.values && this.options.values.length && (i.value = this.values(e), i.values = this.values()), this._trigger("stop", t, i)
|
|
},
|
|
_change: function (t, e) {
|
|
if (!this._keySliding && !this._mouseSliding) {
|
|
var i = {handle: this.handles[e], value: this.value()};
|
|
this.options.values && this.options.values.length && (i.value = this.values(e), i.values = this.values()), this._lastChangedValue = e, this._trigger("change", t, i)
|
|
}
|
|
},
|
|
value: function (t) {
|
|
return arguments.length ? (this.options.value = this._trimAlignValue(t), this._refreshValue(), this._change(null, 0), undefined) : this._value()
|
|
},
|
|
values: function (e, i) {
|
|
var s, n, a;
|
|
if (arguments.length > 1) return this.options.values[e] = this._trimAlignValue(i), this._refreshValue(), this._change(null, e), undefined;
|
|
if (!arguments.length) return this._values();
|
|
if (!t.isArray(arguments[0])) return this.options.values && this.options.values.length ? this._values(e) : this.value();
|
|
for (s = this.options.values, n = arguments[0], a = 0; s.length > a; a += 1) s[a] = this._trimAlignValue(n[a]), this._change(null, a);
|
|
this._refreshValue()
|
|
},
|
|
_setOption: function (e, i) {
|
|
var s, n = 0;
|
|
switch ("range" === e && this.options.range === !0 && ("min" === i ? (this.options.value = this._values(0), this.options.values = null) : "max" === i && (this.options.value = this._values(this.options.values.length - 1), this.options.values = null)), t.isArray(this.options.values) && (n = this.options.values.length), t.Widget.prototype._setOption.apply(this, arguments), e) {
|
|
case"orientation":
|
|
this._detectOrientation(), this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-" + this.orientation), this._refreshValue();
|
|
break;
|
|
case"value":
|
|
this._animateOff = !0, this._refreshValue(), this._change(null, 0), this._animateOff = !1;
|
|
break;
|
|
case"values":
|
|
for (this._animateOff = !0, this._refreshValue(), s = 0; n > s; s += 1) this._change(null, s);
|
|
this._animateOff = !1;
|
|
break;
|
|
case"min":
|
|
case"max":
|
|
this._animateOff = !0, this._refreshValue(), this._animateOff = !1;
|
|
break;
|
|
case"range":
|
|
this._animateOff = !0, this._refresh(), this._animateOff = !1
|
|
}
|
|
},
|
|
_value: function () {
|
|
var t = this.options.value;
|
|
return t = this._trimAlignValue(t)
|
|
},
|
|
_values: function (t) {
|
|
var e, i, s;
|
|
if (arguments.length) return e = this.options.values[t], e = this._trimAlignValue(e);
|
|
if (this.options.values && this.options.values.length) {
|
|
for (i = this.options.values.slice(), s = 0; i.length > s; s += 1) i[s] = this._trimAlignValue(i[s]);
|
|
return i
|
|
}
|
|
return []
|
|
},
|
|
_trimAlignValue: function (t) {
|
|
if (this._valueMin() >= t) return this._valueMin();
|
|
if (t >= this._valueMax()) return this._valueMax();
|
|
var e = this.options.step > 0 ? this.options.step : 1, i = (t - this._valueMin()) % e, s = t - i;
|
|
return 2 * Math.abs(i) >= e && (s += i > 0 ? e : -e), parseFloat(s.toFixed(5))
|
|
},
|
|
_valueMin: function () {
|
|
return this.options.min
|
|
},
|
|
_valueMax: function () {
|
|
return this.options.max
|
|
},
|
|
_refreshValue: function () {
|
|
var e, i, s, n, a, o = this.options.range, r = this.options, h = this,
|
|
l = this._animateOff ? !1 : r.animate, u = {};
|
|
this.options.values && this.options.values.length ? this.handles.each(function (s) {
|
|
i = 100 * ((h.values(s) - h._valueMin()) / (h._valueMax() - h._valueMin())), u["horizontal" === h.orientation ? "left" : "bottom"] = i + "%", t(this).stop(1, 1)[l ? "animate" : "css"](u, r.animate), h.options.range === !0 && ("horizontal" === h.orientation ? (0 === s && h.range.stop(1, 1)[l ? "animate" : "css"]({left: i + "%"}, r.animate), 1 === s && h.range[l ? "animate" : "css"]({width: i - e + "%"}, {
|
|
queue: !1,
|
|
duration: r.animate
|
|
})) : (0 === s && h.range.stop(1, 1)[l ? "animate" : "css"]({bottom: i + "%"}, r.animate), 1 === s && h.range[l ? "animate" : "css"]({height: i - e + "%"}, {
|
|
queue: !1,
|
|
duration: r.animate
|
|
}))), e = i
|
|
}) : (s = this.value(), n = this._valueMin(), a = this._valueMax(), i = a !== n ? 100 * ((s - n) / (a - n)) : 0, u["horizontal" === this.orientation ? "left" : "bottom"] = i + "%", this.handle.stop(1, 1)[l ? "animate" : "css"](u, r.animate), "min" === o && "horizontal" === this.orientation && this.range.stop(1, 1)[l ? "animate" : "css"]({width: i + "%"}, r.animate), "max" === o && "horizontal" === this.orientation && this.range[l ? "animate" : "css"]({width: 100 - i + "%"}, {
|
|
queue: !1,
|
|
duration: r.animate
|
|
}), "min" === o && "vertical" === this.orientation && this.range.stop(1, 1)[l ? "animate" : "css"]({height: i + "%"}, r.animate), "max" === o && "vertical" === this.orientation && this.range[l ? "animate" : "css"]({height: 100 - i + "%"}, {
|
|
queue: !1,
|
|
duration: r.animate
|
|
}))
|
|
},
|
|
_handleEvents: {
|
|
keydown: function (i) {
|
|
var s, n, a, o, r = t(i.target).data("ui-slider-handle-index");
|
|
switch (i.keyCode) {
|
|
case t.ui.keyCode.HOME:
|
|
case t.ui.keyCode.END:
|
|
case t.ui.keyCode.PAGE_UP:
|
|
case t.ui.keyCode.PAGE_DOWN:
|
|
case t.ui.keyCode.UP:
|
|
case t.ui.keyCode.RIGHT:
|
|
case t.ui.keyCode.DOWN:
|
|
case t.ui.keyCode.LEFT:
|
|
if (i.preventDefault(), !this._keySliding && (this._keySliding = !0, t(i.target).addClass("ui-state-active"), s = this._start(i, r), s === !1)) return
|
|
}
|
|
switch (o = this.options.step, n = a = this.options.values && this.options.values.length ? this.values(r) : this.value(), i.keyCode) {
|
|
case t.ui.keyCode.HOME:
|
|
a = this._valueMin();
|
|
break;
|
|
case t.ui.keyCode.END:
|
|
a = this._valueMax();
|
|
break;
|
|
case t.ui.keyCode.PAGE_UP:
|
|
a = this._trimAlignValue(n + (this._valueMax() - this._valueMin()) / e);
|
|
break;
|
|
case t.ui.keyCode.PAGE_DOWN:
|
|
a = this._trimAlignValue(n - (this._valueMax() - this._valueMin()) / e);
|
|
break;
|
|
case t.ui.keyCode.UP:
|
|
case t.ui.keyCode.RIGHT:
|
|
if (n === this._valueMax()) return;
|
|
a = this._trimAlignValue(n + o);
|
|
break;
|
|
case t.ui.keyCode.DOWN:
|
|
case t.ui.keyCode.LEFT:
|
|
if (n === this._valueMin()) return;
|
|
a = this._trimAlignValue(n - o)
|
|
}
|
|
this._slide(i, r, a)
|
|
}, click: function (t) {
|
|
t.preventDefault()
|
|
}, keyup: function (e) {
|
|
var i = t(e.target).data("ui-slider-handle-index");
|
|
this._keySliding && (this._keySliding = !1, this._stop(e, i), this._change(e, i), t(e.target).removeClass("ui-state-active"))
|
|
}
|
|
}
|
|
})
|
|
})(jQuery);
|
|
(function (t, e) {
|
|
var i = "ui-effects-";
|
|
t.effects = {effect: {}}, function (t, e) {
|
|
function i(t, e, i) {
|
|
var s = u[e.type] || {};
|
|
return null == t ? i || !e.def ? null : e.def : (t = s.floor ? ~~t : parseFloat(t), isNaN(t) ? e.def : s.mod ? (t + s.mod) % s.mod : 0 > t ? 0 : t > s.max ? s.max : t)
|
|
}
|
|
|
|
function s(i) {
|
|
var s = l(), n = s._rgba = [];
|
|
return i = i.toLowerCase(), f(h, function (t, a) {
|
|
var o, r = a.re.exec(i), h = r && a.parse(r), l = a.space || "rgba";
|
|
return h ? (o = s[l](h), s[c[l].cache] = o[c[l].cache], n = s._rgba = o._rgba, !1) : e
|
|
}), n.length ? ("0,0,0,0" === n.join() && t.extend(n, a.transparent), s) : a[i]
|
|
}
|
|
|
|
function n(t, e, i) {
|
|
return i = (i + 1) % 1, 1 > 6 * i ? t + 6 * (e - t) * i : 1 > 2 * i ? e : 2 > 3 * i ? t + 6 * (e - t) * (2 / 3 - i) : t
|
|
}
|
|
|
|
var a,
|
|
o = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
|
|
r = /^([\-+])=\s*(\d+\.?\d*)/, h = [{
|
|
re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
|
|
parse: function (t) {
|
|
return [t[1], t[2], t[3], t[4]]
|
|
}
|
|
}, {
|
|
re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
|
|
parse: function (t) {
|
|
return [2.55 * t[1], 2.55 * t[2], 2.55 * t[3], t[4]]
|
|
}
|
|
}, {
|
|
re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, parse: function (t) {
|
|
return [parseInt(t[1], 16), parseInt(t[2], 16), parseInt(t[3], 16)]
|
|
}
|
|
}, {
|
|
re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, parse: function (t) {
|
|
return [parseInt(t[1] + t[1], 16), parseInt(t[2] + t[2], 16), parseInt(t[3] + t[3], 16)]
|
|
}
|
|
}, {
|
|
re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
|
|
space: "hsla",
|
|
parse: function (t) {
|
|
return [t[1], t[2] / 100, t[3] / 100, t[4]]
|
|
}
|
|
}], l = t.Color = function (e, i, s, n) {
|
|
return new t.Color.fn.parse(e, i, s, n)
|
|
}, c = {
|
|
rgba: {
|
|
props: {
|
|
red: {idx: 0, type: "byte"},
|
|
green: {idx: 1, type: "byte"},
|
|
blue: {idx: 2, type: "byte"}
|
|
}
|
|
},
|
|
hsla: {
|
|
props: {
|
|
hue: {idx: 0, type: "degrees"},
|
|
saturation: {idx: 1, type: "percent"},
|
|
lightness: {idx: 2, type: "percent"}
|
|
}
|
|
}
|
|
}, u = {"byte": {floor: !0, max: 255}, percent: {max: 1}, degrees: {mod: 360, floor: !0}}, d = l.support = {},
|
|
p = t("<p>")[0], f = t.each;
|
|
p.style.cssText = "background-color:rgba(1,1,1,.5)", d.rgba = p.style.backgroundColor.indexOf("rgba") > -1, f(c, function (t, e) {
|
|
e.cache = "_" + t, e.props.alpha = {idx: 3, type: "percent", def: 1}
|
|
}), l.fn = t.extend(l.prototype, {
|
|
parse: function (n, o, r, h) {
|
|
if (n === e) return this._rgba = [null, null, null, null], this;
|
|
(n.jquery || n.nodeType) && (n = t(n).css(o), o = e);
|
|
var u = this, d = t.type(n), p = this._rgba = [];
|
|
return o !== e && (n = [n, o, r, h], d = "array"), "string" === d ? this.parse(s(n) || a._default) : "array" === d ? (f(c.rgba.props, function (t, e) {
|
|
p[e.idx] = i(n[e.idx], e)
|
|
}), this) : "object" === d ? (n instanceof l ? f(c, function (t, e) {
|
|
n[e.cache] && (u[e.cache] = n[e.cache].slice())
|
|
}) : f(c, function (e, s) {
|
|
var a = s.cache;
|
|
f(s.props, function (t, e) {
|
|
if (!u[a] && s.to) {
|
|
if ("alpha" === t || null == n[t]) return;
|
|
u[a] = s.to(u._rgba)
|
|
}
|
|
u[a][e.idx] = i(n[t], e, !0)
|
|
}), u[a] && 0 > t.inArray(null, u[a].slice(0, 3)) && (u[a][3] = 1, s.from && (u._rgba = s.from(u[a])))
|
|
}), this) : e
|
|
}, is: function (t) {
|
|
var i = l(t), s = !0, n = this;
|
|
return f(c, function (t, a) {
|
|
var o, r = i[a.cache];
|
|
return r && (o = n[a.cache] || a.to && a.to(n._rgba) || [], f(a.props, function (t, i) {
|
|
return null != r[i.idx] ? s = r[i.idx] === o[i.idx] : e
|
|
})), s
|
|
}), s
|
|
}, _space: function () {
|
|
var t = [], e = this;
|
|
return f(c, function (i, s) {
|
|
e[s.cache] && t.push(i)
|
|
}), t.pop()
|
|
}, transition: function (t, e) {
|
|
var s = l(t), n = s._space(), a = c[n], o = 0 === this.alpha() ? l("transparent") : this,
|
|
r = o[a.cache] || a.to(o._rgba), h = r.slice();
|
|
return s = s[a.cache], f(a.props, function (t, n) {
|
|
var a = n.idx, o = r[a], l = s[a], c = u[n.type] || {};
|
|
null !== l && (null === o ? h[a] = l : (c.mod && (l - o > c.mod / 2 ? o += c.mod : o - l > c.mod / 2 && (o -= c.mod)), h[a] = i((l - o) * e + o, n)))
|
|
}), this[n](h)
|
|
}, blend: function (e) {
|
|
if (1 === this._rgba[3]) return this;
|
|
var i = this._rgba.slice(), s = i.pop(), n = l(e)._rgba;
|
|
return l(t.map(i, function (t, e) {
|
|
return (1 - s) * n[e] + s * t
|
|
}))
|
|
}, toRgbaString: function () {
|
|
var e = "rgba(", i = t.map(this._rgba, function (t, e) {
|
|
return null == t ? e > 2 ? 1 : 0 : t
|
|
});
|
|
return 1 === i[3] && (i.pop(), e = "rgb("), e + i.join() + ")"
|
|
}, toHslaString: function () {
|
|
var e = "hsla(", i = t.map(this.hsla(), function (t, e) {
|
|
return null == t && (t = e > 2 ? 1 : 0), e && 3 > e && (t = Math.round(100 * t) + "%"), t
|
|
});
|
|
return 1 === i[3] && (i.pop(), e = "hsl("), e + i.join() + ")"
|
|
}, toHexString: function (e) {
|
|
var i = this._rgba.slice(), s = i.pop();
|
|
return e && i.push(~~(255 * s)), "#" + t.map(i, function (t) {
|
|
return t = (t || 0).toString(16), 1 === t.length ? "0" + t : t
|
|
}).join("")
|
|
}, toString: function () {
|
|
return 0 === this._rgba[3] ? "transparent" : this.toRgbaString()
|
|
}
|
|
}), l.fn.parse.prototype = l.fn, c.hsla.to = function (t) {
|
|
if (null == t[0] || null == t[1] || null == t[2]) return [null, null, null, t[3]];
|
|
var e, i, s = t[0] / 255, n = t[1] / 255, a = t[2] / 255, o = t[3], r = Math.max(s, n, a),
|
|
h = Math.min(s, n, a), l = r - h, c = r + h, u = .5 * c;
|
|
return e = h === r ? 0 : s === r ? 60 * (n - a) / l + 360 : n === r ? 60 * (a - s) / l + 120 : 60 * (s - n) / l + 240, i = 0 === l ? 0 : .5 >= u ? l / c : l / (2 - c), [Math.round(e) % 360, i, u, null == o ? 1 : o]
|
|
}, c.hsla.from = function (t) {
|
|
if (null == t[0] || null == t[1] || null == t[2]) return [null, null, null, t[3]];
|
|
var e = t[0] / 360, i = t[1], s = t[2], a = t[3], o = .5 >= s ? s * (1 + i) : s + i - s * i, r = 2 * s - o;
|
|
return [Math.round(255 * n(r, o, e + 1 / 3)), Math.round(255 * n(r, o, e)), Math.round(255 * n(r, o, e - 1 / 3)), a]
|
|
}, f(c, function (s, n) {
|
|
var a = n.props, o = n.cache, h = n.to, c = n.from;
|
|
l.fn[s] = function (s) {
|
|
if (h && !this[o] && (this[o] = h(this._rgba)), s === e) return this[o].slice();
|
|
var n, r = t.type(s), u = "array" === r || "object" === r ? s : arguments, d = this[o].slice();
|
|
return f(a, function (t, e) {
|
|
var s = u["object" === r ? t : e.idx];
|
|
null == s && (s = d[e.idx]), d[e.idx] = i(s, e)
|
|
}), c ? (n = l(c(d)), n[o] = d, n) : l(d)
|
|
}, f(a, function (e, i) {
|
|
l.fn[e] || (l.fn[e] = function (n) {
|
|
var a, o = t.type(n), h = "alpha" === e ? this._hsla ? "hsla" : "rgba" : s, l = this[h](),
|
|
c = l[i.idx];
|
|
return "undefined" === o ? c : ("function" === o && (n = n.call(this, c), o = t.type(n)), null == n && i.empty ? this : ("string" === o && (a = r.exec(n), a && (n = c + parseFloat(a[2]) * ("+" === a[1] ? 1 : -1))), l[i.idx] = n, this[h](l)))
|
|
})
|
|
})
|
|
}), l.hook = function (e) {
|
|
var i = e.split(" ");
|
|
f(i, function (e, i) {
|
|
t.cssHooks[i] = {
|
|
set: function (e, n) {
|
|
var a, o, r = "";
|
|
if ("transparent" !== n && ("string" !== t.type(n) || (a = s(n)))) {
|
|
if (n = l(a || n), !d.rgba && 1 !== n._rgba[3]) {
|
|
for (o = "backgroundColor" === i ? e.parentNode : e; ("" === r || "transparent" === r) && o && o.style;) try {
|
|
r = t.css(o, "backgroundColor"), o = o.parentNode
|
|
} catch (h) {
|
|
}
|
|
n = n.blend(r && "transparent" !== r ? r : "_default")
|
|
}
|
|
n = n.toRgbaString()
|
|
}
|
|
try {
|
|
e.style[i] = n
|
|
} catch (h) {
|
|
}
|
|
}
|
|
}, t.fx.step[i] = function (e) {
|
|
e.colorInit || (e.start = l(e.elem, i), e.end = l(e.end), e.colorInit = !0), t.cssHooks[i].set(e.elem, e.start.transition(e.end, e.pos))
|
|
}
|
|
})
|
|
}, l.hook(o), t.cssHooks.borderColor = {
|
|
expand: function (t) {
|
|
var e = {};
|
|
return f(["Top", "Right", "Bottom", "Left"], function (i, s) {
|
|
e["border" + s + "Color"] = t
|
|
}), e
|
|
}
|
|
}, a = t.Color.names = {
|
|
aqua: "#00ffff",
|
|
black: "#000000",
|
|
blue: "#0000ff",
|
|
fuchsia: "#ff00ff",
|
|
gray: "#808080",
|
|
green: "#008000",
|
|
lime: "#00ff00",
|
|
maroon: "#800000",
|
|
navy: "#000080",
|
|
olive: "#808000",
|
|
purple: "#800080",
|
|
red: "#ff0000",
|
|
silver: "#c0c0c0",
|
|
teal: "#008080",
|
|
white: "#ffffff",
|
|
yellow: "#ffff00",
|
|
transparent: [null, null, null, 0],
|
|
_default: "#ffffff"
|
|
}
|
|
}(jQuery), function () {
|
|
function i(e) {
|
|
var i, s,
|
|
n = e.ownerDocument.defaultView ? e.ownerDocument.defaultView.getComputedStyle(e, null) : e.currentStyle,
|
|
a = {};
|
|
if (n && n.length && n[0] && n[n[0]]) for (s = n.length; s--;) i = n[s], "string" == typeof n[i] && (a[t.camelCase(i)] = n[i]); else for (i in n) "string" == typeof n[i] && (a[i] = n[i]);
|
|
return a
|
|
}
|
|
|
|
function s(e, i) {
|
|
var s, n, o = {};
|
|
for (s in i) n = i[s], e[s] !== n && (a[s] || (t.fx.step[s] || !isNaN(parseFloat(n))) && (o[s] = n));
|
|
return o
|
|
}
|
|
|
|
var n = ["add", "remove", "toggle"], a = {
|
|
border: 1,
|
|
borderBottom: 1,
|
|
borderColor: 1,
|
|
borderLeft: 1,
|
|
borderRight: 1,
|
|
borderTop: 1,
|
|
borderWidth: 1,
|
|
margin: 1,
|
|
padding: 1
|
|
};
|
|
t.each(["borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle"], function (e, i) {
|
|
t.fx.step[i] = function (t) {
|
|
("none" !== t.end && !t.setAttr || 1 === t.pos && !t.setAttr) && (jQuery.style(t.elem, i, t.end), t.setAttr = !0)
|
|
}
|
|
}), t.fn.addBack || (t.fn.addBack = function (t) {
|
|
return this.add(null == t ? this.prevObject : this.prevObject.filter(t))
|
|
}), t.effects.animateClass = function (e, a, o, r) {
|
|
var h = t.speed(a, o, r);
|
|
return this.queue(function () {
|
|
var a, o = t(this), r = o.attr("class") || "", l = h.children ? o.find("*").addBack() : o;
|
|
l = l.map(function () {
|
|
var e = t(this);
|
|
return {el: e, start: i(this)}
|
|
}), a = function () {
|
|
t.each(n, function (t, i) {
|
|
e[i] && o[i + "Class"](e[i])
|
|
})
|
|
}, a(), l = l.map(function () {
|
|
return this.end = i(this.el[0]), this.diff = s(this.start, this.end), this
|
|
}), o.attr("class", r), l = l.map(function () {
|
|
var e = this, i = t.Deferred(), s = t.extend({}, h, {
|
|
queue: !1, complete: function () {
|
|
i.resolve(e)
|
|
}
|
|
});
|
|
return this.el.animate(this.diff, s), i.promise()
|
|
}), t.when.apply(t, l.get()).done(function () {
|
|
a(), t.each(arguments, function () {
|
|
var e = this.el;
|
|
t.each(this.diff, function (t) {
|
|
e.css(t, "")
|
|
})
|
|
}), h.complete.call(o[0])
|
|
})
|
|
})
|
|
}, t.fn.extend({
|
|
addClass: function (e) {
|
|
return function (i, s, n, a) {
|
|
return s ? t.effects.animateClass.call(this, {add: i}, s, n, a) : e.apply(this, arguments)
|
|
}
|
|
}(t.fn.addClass), removeClass: function (e) {
|
|
return function (i, s, n, a) {
|
|
return arguments.length > 1 ? t.effects.animateClass.call(this, {remove: i}, s, n, a) : e.apply(this, arguments)
|
|
}
|
|
}(t.fn.removeClass), toggleClass: function (i) {
|
|
return function (s, n, a, o, r) {
|
|
return "boolean" == typeof n || n === e ? a ? t.effects.animateClass.call(this, n ? {add: s} : {remove: s}, a, o, r) : i.apply(this, arguments) : t.effects.animateClass.call(this, {toggle: s}, n, a, o)
|
|
}
|
|
}(t.fn.toggleClass), switchClass: function (e, i, s, n, a) {
|
|
return t.effects.animateClass.call(this, {add: i, remove: e}, s, n, a)
|
|
}
|
|
})
|
|
}(), function () {
|
|
function s(e, i, s, n) {
|
|
return t.isPlainObject(e) && (i = e, e = e.effect), e = {effect: e}, null == i && (i = {}), t.isFunction(i) && (n = i, s = null, i = {}), ("number" == typeof i || t.fx.speeds[i]) && (n = s, s = i, i = {}), t.isFunction(s) && (n = s, s = null), i && t.extend(e, i), s = s || i.duration, e.duration = t.fx.off ? 0 : "number" == typeof s ? s : s in t.fx.speeds ? t.fx.speeds[s] : t.fx.speeds._default, e.complete = n || i.complete, e
|
|
}
|
|
|
|
function n(e) {
|
|
return !e || "number" == typeof e || t.fx.speeds[e] ? !0 : "string" != typeof e || t.effects.effect[e] ? t.isFunction(e) ? !0 : "object" != typeof e || e.effect ? !1 : !0 : !0
|
|
}
|
|
|
|
t.extend(t.effects, {
|
|
version: "1.10.3", save: function (t, e) {
|
|
for (var s = 0; e.length > s; s++) null !== e[s] && t.data(i + e[s], t[0].style[e[s]])
|
|
}, restore: function (t, s) {
|
|
var n, a;
|
|
for (a = 0; s.length > a; a++) null !== s[a] && (n = t.data(i + s[a]), n === e && (n = ""), t.css(s[a], n))
|
|
}, setMode: function (t, e) {
|
|
return "toggle" === e && (e = t.is(":hidden") ? "show" : "hide"), e
|
|
}, getBaseline: function (t, e) {
|
|
var i, s;
|
|
switch (t[0]) {
|
|
case"top":
|
|
i = 0;
|
|
break;
|
|
case"middle":
|
|
i = .5;
|
|
break;
|
|
case"bottom":
|
|
i = 1;
|
|
break;
|
|
default:
|
|
i = t[0] / e.height
|
|
}
|
|
switch (t[1]) {
|
|
case"left":
|
|
s = 0;
|
|
break;
|
|
case"center":
|
|
s = .5;
|
|
break;
|
|
case"right":
|
|
s = 1;
|
|
break;
|
|
default:
|
|
s = t[1] / e.width
|
|
}
|
|
return {x: s, y: i}
|
|
}, createWrapper: function (e) {
|
|
if (e.parent().is(".ui-effects-wrapper")) return e.parent();
|
|
var i = {width: e.outerWidth(!0), height: e.outerHeight(!0), "float": e.css("float")},
|
|
s = t("<div></div>").addClass("ui-effects-wrapper").css({
|
|
fontSize: "100%",
|
|
background: "transparent",
|
|
border: "none",
|
|
margin: 0,
|
|
padding: 0
|
|
}), n = {width: e.width(), height: e.height()}, a = document.activeElement;
|
|
try {
|
|
a.id
|
|
} catch (o) {
|
|
a = document.body
|
|
}
|
|
return e.wrap(s), (e[0] === a || t.contains(e[0], a)) && t(a).focus(), s = e.parent(), "static" === e.css("position") ? (s.css({position: "relative"}), e.css({position: "relative"})) : (t.extend(i, {
|
|
position: e.css("position"),
|
|
zIndex: e.css("z-index")
|
|
}), t.each(["top", "left", "bottom", "right"], function (t, s) {
|
|
i[s] = e.css(s), isNaN(parseInt(i[s], 10)) && (i[s] = "auto")
|
|
}), e.css({
|
|
position: "relative",
|
|
top: 0,
|
|
left: 0,
|
|
right: "auto",
|
|
bottom: "auto"
|
|
})), e.css(n), s.css(i).show()
|
|
}, removeWrapper: function (e) {
|
|
var i = document.activeElement;
|
|
return e.parent().is(".ui-effects-wrapper") && (e.parent().replaceWith(e), (e[0] === i || t.contains(e[0], i)) && t(i).focus()), e
|
|
}, setTransition: function (e, i, s, n) {
|
|
return n = n || {}, t.each(i, function (t, i) {
|
|
var a = e.cssUnit(i);
|
|
a[0] > 0 && (n[i] = a[0] * s + a[1])
|
|
}), n
|
|
}
|
|
}), t.fn.extend({
|
|
effect: function () {
|
|
function e(e) {
|
|
function s() {
|
|
t.isFunction(a) && a.call(n[0]), t.isFunction(e) && e()
|
|
}
|
|
|
|
var n = t(this), a = i.complete, r = i.mode;
|
|
(n.is(":hidden") ? "hide" === r : "show" === r) ? (n[r](), s()) : o.call(n[0], i, s)
|
|
}
|
|
|
|
var i = s.apply(this, arguments), n = i.mode, a = i.queue, o = t.effects.effect[i.effect];
|
|
return t.fx.off || !o ? n ? this[n](i.duration, i.complete) : this.each(function () {
|
|
i.complete && i.complete.call(this)
|
|
}) : a === !1 ? this.each(e) : this.queue(a || "fx", e)
|
|
}, show: function (t) {
|
|
return function (e) {
|
|
if (n(e)) return t.apply(this, arguments);
|
|
var i = s.apply(this, arguments);
|
|
return i.mode = "show", this.effect.call(this, i)
|
|
}
|
|
}(t.fn.show), hide: function (t) {
|
|
return function (e) {
|
|
if (n(e)) return t.apply(this, arguments);
|
|
var i = s.apply(this, arguments);
|
|
return i.mode = "hide", this.effect.call(this, i)
|
|
}
|
|
}(t.fn.hide), toggle: function (t) {
|
|
return function (e) {
|
|
if (n(e) || "boolean" == typeof e) return t.apply(this, arguments);
|
|
var i = s.apply(this, arguments);
|
|
return i.mode = "toggle", this.effect.call(this, i)
|
|
}
|
|
}(t.fn.toggle), cssUnit: function (e) {
|
|
var i = this.css(e), s = [];
|
|
return t.each(["em", "px", "%", "pt"], function (t, e) {
|
|
i.indexOf(e) > 0 && (s = [parseFloat(i), e])
|
|
}), s
|
|
}
|
|
})
|
|
}(), function () {
|
|
var e = {};
|
|
t.each(["Quad", "Cubic", "Quart", "Quint", "Expo"], function (t, i) {
|
|
e[i] = function (e) {
|
|
return Math.pow(e, t + 2)
|
|
}
|
|
}), t.extend(e, {
|
|
Sine: function (t) {
|
|
return 1 - Math.cos(t * Math.PI / 2)
|
|
}, Circ: function (t) {
|
|
return 1 - Math.sqrt(1 - t * t)
|
|
}, Elastic: function (t) {
|
|
return 0 === t || 1 === t ? t : -Math.pow(2, 8 * (t - 1)) * Math.sin((80 * (t - 1) - 7.5) * Math.PI / 15)
|
|
}, Back: function (t) {
|
|
return t * t * (3 * t - 2)
|
|
}, Bounce: function (t) {
|
|
for (var e, i = 4; ((e = Math.pow(2, --i)) - 1) / 11 > t;) ;
|
|
return 1 / Math.pow(4, 3 - i) - 7.5625 * Math.pow((3 * e - 2) / 22 - t, 2)
|
|
}
|
|
}), t.each(e, function (e, i) {
|
|
t.easing["easeIn" + e] = i, t.easing["easeOut" + e] = function (t) {
|
|
return 1 - i(1 - t)
|
|
}, t.easing["easeInOut" + e] = function (t) {
|
|
return .5 > t ? i(2 * t) / 2 : 1 - i(-2 * t + 2) / 2
|
|
}
|
|
})
|
|
}()
|
|
})(jQuery);
|
|
(function (t) {
|
|
t.effects.effect.slide = function (e, i) {
|
|
var s, n = t(this), a = ["position", "top", "bottom", "left", "right", "width", "height"],
|
|
o = t.effects.setMode(n, e.mode || "show"), r = "show" === o, h = e.direction || "left",
|
|
l = "up" === h || "down" === h ? "top" : "left", c = "up" === h || "left" === h, u = {};
|
|
t.effects.save(n, a), n.show(), s = e.distance || n["top" === l ? "outerHeight" : "outerWidth"](!0), t.effects.createWrapper(n).css({overflow: "hidden"}), r && n.css(l, c ? isNaN(s) ? "-" + s : -s : s), u[l] = (r ? c ? "+=" : "-=" : c ? "-=" : "+=") + s, n.animate(u, {
|
|
queue: !1,
|
|
duration: e.duration,
|
|
easing: e.easing,
|
|
complete: function () {
|
|
"hide" === o && n.hide(), t.effects.restore(n, a), t.effects.removeWrapper(n), i()
|
|
}
|
|
})
|
|
}
|
|
})(jQuery);
|
|
/*!
|
|
* jquery.customscroll 1.0
|
|
*
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
* http://www.gnu.org/licenses/gpl-2.0.html
|
|
*/
|
|
;(function ($) {
|
|
|
|
$.customscrollOptions = {
|
|
always: false,
|
|
show: {
|
|
on: 'mouseenter scrollstart',
|
|
effect: 'fadeIn',
|
|
speed: 250,
|
|
delay: 0
|
|
},
|
|
hide: {
|
|
on: 'mouseleave scrollstop',
|
|
effect: 'fadeOut',
|
|
speed: 250,
|
|
delay: 750
|
|
},
|
|
grow: {
|
|
size: 3,
|
|
speed: 100
|
|
},
|
|
pageUpnDown: {
|
|
speed: 100
|
|
}
|
|
};
|
|
|
|
$.fn.customscroll = function (options) {
|
|
options = $.extend(true, {}, $.customscrollOptions, options || {});
|
|
return this.each(function () {
|
|
var object = $(this);
|
|
|
|
// build template
|
|
object.addClass('customscroll');
|
|
object.html([
|
|
'<div class="wrapper" style="height:' + object.height() + 'px">',
|
|
'<div class="content" style="width:' + object.width() + 'px">',
|
|
object.html(),
|
|
'</div>',
|
|
'</div>',
|
|
'<div class="placeholder" style="top:' + object.css('paddingTop') + ';bottom:' + object.css('paddingBottom') + '">',
|
|
'<div class="track">',
|
|
'<div class="grip"></div>',
|
|
'</div>',
|
|
'</div>'
|
|
].join(''));
|
|
|
|
// get elements
|
|
var wrapper = object.children('.wrapper'),
|
|
placeholder = object.children('.placeholder'),
|
|
track = placeholder.children('.track'),
|
|
grip = track.children('.grip');
|
|
|
|
// object hover
|
|
var showHideTimer,
|
|
show = function (event) {
|
|
if (object.height() >= wrapper[0].scrollHeight) {
|
|
// we dont need scroll
|
|
return;
|
|
}
|
|
if (wrapper[0].scrollHeight < parseInt(object.css('max-height'))) {
|
|
// this is a fix for IE
|
|
return;
|
|
}
|
|
// show
|
|
clearInterval(showHideTimer);
|
|
showHideTimer = setTimeout(function () {
|
|
track[options.show.effect](options.show.speed);
|
|
}, options.show.delay);
|
|
if (!event || event.type !== 'scrollstart') {
|
|
// used for adjusting sizes
|
|
wrapper.trigger('scroll');
|
|
}
|
|
};
|
|
wrapper.on(options.show.on, show);
|
|
wrapper.on(options.hide.on, function callback() {
|
|
// don't hide if always is true
|
|
if (options.always) {
|
|
return;
|
|
}
|
|
if (wrapper.hasClass('keep')) {
|
|
// someone says do not hide, try again later
|
|
return setTimeout(function () {
|
|
callback();
|
|
}, 250);
|
|
}
|
|
// hide
|
|
clearInterval(showHideTimer);
|
|
showHideTimer = setTimeout(function () {
|
|
track[options.hide.effect](options.hide.speed);
|
|
}, options.hide.delay);
|
|
});
|
|
|
|
// bind scroll event
|
|
var scrollingTimer;
|
|
wrapper.on('scroll', function (event) {
|
|
var height = object.height();
|
|
grip.css({
|
|
// grip height is view height / scroll height * 200 (4 is for margins)
|
|
height: height / this.scrollHeight * height - parseInt(object.css('paddingTop')) - parseInt(object.css('paddingBottom')),
|
|
// scroll position
|
|
marginTop: this.scrollTop * 100 / this.scrollHeight * height / 100 + 'px'
|
|
});
|
|
// custom scroll start / end events
|
|
if (!scrollingTimer) {
|
|
wrapper.trigger('scrollstart');
|
|
}
|
|
clearInterval(scrollingTimer);
|
|
scrollingTimer = setTimeout(function () {
|
|
wrapper.trigger('scrollstop');
|
|
scrollingTimer = null;
|
|
}, 200);
|
|
});
|
|
|
|
// placeholder and track hover
|
|
wrapper.on('mouseover', function () {
|
|
// do not hide track and show
|
|
wrapper.addClass('keep');
|
|
show();
|
|
});
|
|
|
|
// placeholder and track hover
|
|
wrapper.on('mouseleave', function () {
|
|
// do not hide track and show
|
|
wrapper.removeClass('keep');
|
|
});
|
|
placeholder.on('mouseover', function () {
|
|
// do not hide track and show
|
|
wrapper.addClass('keep');
|
|
show();
|
|
});
|
|
placeholder.on('mouseleave', function () {
|
|
// hide track
|
|
wrapper.removeClass('keep');
|
|
});
|
|
track.on('mouseenter', function () {
|
|
track.addClass('hover');
|
|
if (options.grow) {
|
|
// stop animation queue and animate
|
|
track.stop(true, true);
|
|
track.animate({width: '+=' + options.grow.size + 'px'}, options.grow.speed);
|
|
}
|
|
});
|
|
track.on('mouseleave', function hover() {
|
|
track.removeClass('hover');
|
|
if (options.grow) {
|
|
// stop animation queue and animate
|
|
track.stop(true, true);
|
|
track.animate({width: '-=' + options.grow.size + 'px'}, options.grow.speed);
|
|
}
|
|
});
|
|
|
|
// page up / down (track click)
|
|
track.on('click', function (event) {
|
|
if ($(event.target).hasClass('grip')) {
|
|
// do not trigger when clicking the egrip
|
|
return;
|
|
}
|
|
if (event.pageY - track.offset().top > parseInt(grip.css('marginTop'))) {
|
|
// clicked after grip
|
|
var operation = '+';
|
|
} else {
|
|
// clicked before grip
|
|
var operation = '-';
|
|
}
|
|
// scroll
|
|
wrapper.animate({
|
|
scrollTop: operation + '=' + object.height() + 'px'
|
|
}, options.pageUpnDown.speed);
|
|
});
|
|
|
|
// show initially if always is true
|
|
if (options.always) {
|
|
show();
|
|
}
|
|
// grip drag
|
|
var dragging = false;
|
|
grip.on('mousedown', function (event) {
|
|
// do not hide
|
|
wrapper.addClass('keep');
|
|
// mark as dragging
|
|
dragging = true;
|
|
// prevent text selection
|
|
$('body').addClass('dragging');
|
|
});
|
|
$(document).on('mousemove', function (event) {
|
|
if (dragging) {
|
|
// we have drag, move
|
|
wrapper.scrollTop(wrapper[0].scrollHeight * (event.pageY - track.offset().top - grip.height() / 2) / object.height());
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
$(document).on('mouseup', function () {
|
|
if (dragging) {
|
|
// we have drag, remove
|
|
wrapper.removeClass('keep');
|
|
dragging = false;
|
|
$('body').removeClass('dragging');
|
|
}
|
|
});
|
|
|
|
});
|
|
};
|
|
})(jQuery);
|
|
!function (e, t, n) {
|
|
"use strict";
|
|
!function o(e, t, n) {
|
|
function a(s, l) {
|
|
if (!t[s]) {
|
|
if (!e[s]) {
|
|
var i = "function" == typeof require && require;
|
|
if (!l && i) return i(s, !0);
|
|
if (r) return r(s, !0);
|
|
var u = new Error("Cannot find module '" + s + "'");
|
|
throw u.code = "MODULE_NOT_FOUND", u
|
|
}
|
|
var c = t[s] = {exports: {}};
|
|
e[s][0].call(c.exports, function (t) {
|
|
var n = e[s][1][t];
|
|
return a(n ? n : t)
|
|
}, c, c.exports, o, e, t, n)
|
|
}
|
|
return t[s].exports
|
|
}
|
|
|
|
for (var r = "function" == typeof require && require, s = 0; s < n.length; s++) a(n[s]);
|
|
return a
|
|
}({
|
|
1: [function (o, a, r) {
|
|
var s = function (e) {
|
|
return e && e.__esModule ? e : {"default": e}
|
|
};
|
|
Object.defineProperty(r, "__esModule", {value: !0});
|
|
var l, i, u, c, d = o("./modules/handle-dom"), f = o("./modules/utils"), p = o("./modules/handle-swal-dom"),
|
|
m = o("./modules/handle-click"), v = o("./modules/handle-key"), y = s(v),
|
|
h = o("./modules/default-params"), b = s(h), g = o("./modules/set-params"), w = s(g);
|
|
r["default"] = u = c = function () {
|
|
function o(e) {
|
|
var t = a;
|
|
return t[e] === n ? b["default"][e] : t[e]
|
|
}
|
|
|
|
var a = arguments[0];
|
|
if (d.addClass(t.body, "stop-scrolling"), p.resetInput(), a === n) return f.logStr("SweetAlert expects at least 1 attribute!"), !1;
|
|
var r = f.extend({}, b["default"]);
|
|
switch (typeof a) {
|
|
case"string":
|
|
r.title = a, r.text = arguments[1] || "", r.type = arguments[2] || "";
|
|
break;
|
|
case"object":
|
|
if (a.title === n) return f.logStr('Missing "title" argument!'), !1;
|
|
r.title = a.title;
|
|
for (var s in b["default"]) r[s] = o(s);
|
|
r.confirmButtonText = r.showCancelButton ? "Confirm" : b["default"].confirmButtonText, r.confirmButtonText = o("confirmButtonText"), r.doneFunction = arguments[1] || null;
|
|
break;
|
|
default:
|
|
return f.logStr('Unexpected type of argument! Expected "string" or "object", got ' + typeof a), !1
|
|
}
|
|
w["default"](r), p.fixVerticalPosition(), p.openModal(arguments[1]);
|
|
for (var u = p.getModal(), v = u.querySelectorAll("button"), h = ["onclick", "onmouseover", "onmouseout", "onmousedown", "onmouseup", "onfocus"], g = function (e) {
|
|
return m.handleButton(e, r, u)
|
|
}, C = 0; C < v.length; C++) for (var S = 0; S < h.length; S++) {
|
|
var x = h[S];
|
|
v[C][x] = g
|
|
}
|
|
p.getOverlay().onclick = g, l = e.onkeydown;
|
|
var k = function (e) {
|
|
return y["default"](e, r, u)
|
|
};
|
|
e.onkeydown = k, e.onfocus = function () {
|
|
setTimeout(function () {
|
|
i !== n && (i.focus(), i = n)
|
|
}, 0)
|
|
}, c.enableButtons()
|
|
}, u.setDefaults = c.setDefaults = function (e) {
|
|
if (!e) throw new Error("userParams is required");
|
|
if ("object" != typeof e) throw new Error("userParams has to be a object");
|
|
f.extend(b["default"], e)
|
|
}, u.close = c.close = function () {
|
|
var o = p.getModal();
|
|
d.fadeOut(p.getOverlay(), 5), d.fadeOut(o, 5), d.removeClass(o, "showSweetAlert"), d.addClass(o, "hideSweetAlert"), d.removeClass(o, "visible");
|
|
var a = o.querySelector(".sa-icon.sa-success");
|
|
d.removeClass(a, "animate"), d.removeClass(a.querySelector(".sa-tip"), "animateSuccessTip"), d.removeClass(a.querySelector(".sa-long"), "animateSuccessLong");
|
|
var r = o.querySelector(".sa-icon.sa-error");
|
|
d.removeClass(r, "animateErrorIcon"), d.removeClass(r.querySelector(".sa-x-mark"), "animateXMark");
|
|
var s = o.querySelector(".sa-icon.sa-warning");
|
|
return d.removeClass(s, "pulseWarning"), d.removeClass(s.querySelector(".sa-body"), "pulseWarningIns"), d.removeClass(s.querySelector(".sa-dot"), "pulseWarningIns"), setTimeout(function () {
|
|
var e = o.getAttribute("data-custom-class");
|
|
d.removeClass(o, e)
|
|
}, 300), d.removeClass(t.body, "stop-scrolling"), e.onkeydown = l, e.previousActiveElement && e.previousActiveElement.focus(), i = n, clearTimeout(o.timeout), !0
|
|
}, u.showInputError = c.showInputError = function (e) {
|
|
var t = p.getModal(), n = t.querySelector(".sa-input-error");
|
|
d.addClass(n, "show");
|
|
var o = t.querySelector(".sa-error-container");
|
|
d.addClass(o, "show"), o.querySelector("p").innerHTML = e, setTimeout(function () {
|
|
u.enableButtons()
|
|
}, 1), t.querySelector("input").focus()
|
|
}, u.resetInputError = c.resetInputError = function (e) {
|
|
if (e && 13 === e.keyCode) return !1;
|
|
var t = p.getModal(), n = t.querySelector(".sa-input-error");
|
|
d.removeClass(n, "show");
|
|
var o = t.querySelector(".sa-error-container");
|
|
d.removeClass(o, "show")
|
|
}, u.disableButtons = c.disableButtons = function () {
|
|
var e = p.getModal(), t = e.querySelector("button.confirm"), n = e.querySelector("button.cancel");
|
|
t.disabled = !0, n.disabled = !0
|
|
}, u.enableButtons = c.enableButtons = function () {
|
|
var e = p.getModal(), t = e.querySelector("button.confirm"), n = e.querySelector("button.cancel");
|
|
t.disabled = !1, n.disabled = !1
|
|
}, "undefined" != typeof e ? e.sweetAlert = e.swal = u : f.logStr("SweetAlert is a frontend module!"), a.exports = r["default"]
|
|
}, {
|
|
"./modules/default-params": 2,
|
|
"./modules/handle-click": 3,
|
|
"./modules/handle-dom": 4,
|
|
"./modules/handle-key": 5,
|
|
"./modules/handle-swal-dom": 6,
|
|
"./modules/set-params": 8,
|
|
"./modules/utils": 9
|
|
}], 2: [function (e, t, n) {
|
|
Object.defineProperty(n, "__esModule", {value: !0});
|
|
var o = {
|
|
title: "",
|
|
text: "",
|
|
type: null,
|
|
allowOutsideClick: !1,
|
|
showConfirmButton: !0,
|
|
showCancelButton: !1,
|
|
closeOnConfirm: !0,
|
|
closeOnCancel: !0,
|
|
confirmButtonText: "OK",
|
|
confirmButtonColor: "#8CD4F5",
|
|
cancelButtonText: "Cancel",
|
|
imageUrl: null,
|
|
imageSize: null,
|
|
timer: null,
|
|
customClass: "",
|
|
html: !1,
|
|
animation: !0,
|
|
allowEscapeKey: !0,
|
|
inputType: "text",
|
|
inputPlaceholder: "",
|
|
inputValue: "",
|
|
showLoaderOnConfirm: !1
|
|
};
|
|
n["default"] = o, t.exports = n["default"]
|
|
}, {}], 3: [function (t, n, o) {
|
|
Object.defineProperty(o, "__esModule", {value: !0});
|
|
var a = t("./utils"), r = (t("./handle-swal-dom"), t("./handle-dom")), s = function (t, n, o) {
|
|
function s(e) {
|
|
m && n.confirmButtonColor && (p.style.backgroundColor = e)
|
|
}
|
|
|
|
var u, c, d, f = t || e.event, p = f.target || f.srcElement, m = -1 !== p.className.indexOf("confirm"),
|
|
v = -1 !== p.className.indexOf("sweet-overlay"), y = r.hasClass(o, "visible"),
|
|
h = n.doneFunction && "true" === o.getAttribute("data-has-done-function");
|
|
switch (m && n.confirmButtonColor && (u = n.confirmButtonColor, c = a.colorLuminance(u, -.04), d = a.colorLuminance(u, -.14)), f.type) {
|
|
case"mouseover":
|
|
s(c);
|
|
break;
|
|
case"mouseout":
|
|
s(u);
|
|
break;
|
|
case"mousedown":
|
|
s(d);
|
|
break;
|
|
case"mouseup":
|
|
s(c);
|
|
break;
|
|
case"focus":
|
|
var b = o.querySelector("button.confirm"), g = o.querySelector("button.cancel");
|
|
m ? g.style.boxShadow = "none" : b.style.boxShadow = "none";
|
|
break;
|
|
case"click":
|
|
var w = o === p, C = r.isDescendant(o, p);
|
|
if (!w && !C && y && !n.allowOutsideClick) break;
|
|
m && h && y ? l(o, n) : h && y || v ? i(o, n) : r.isDescendant(o, p) && "BUTTON" === p.tagName && sweetAlert.close()
|
|
}
|
|
}, l = function (e, t) {
|
|
var n = !0;
|
|
r.hasClass(e, "show-input") && (n = e.querySelector("input").value, n || (n = "")), t.doneFunction(n), t.closeOnConfirm && sweetAlert.close(), t.showLoaderOnConfirm && sweetAlert.disableButtons()
|
|
}, i = function (e, t) {
|
|
var n = String(t.doneFunction).replace(/\s/g, ""),
|
|
o = "function(" === n.substring(0, 9) && ")" !== n.substring(9, 10);
|
|
o && t.doneFunction(!1), t.closeOnCancel && sweetAlert.close()
|
|
};
|
|
o["default"] = {handleButton: s, handleConfirm: l, handleCancel: i}, n.exports = o["default"]
|
|
}, {"./handle-dom": 4, "./handle-swal-dom": 6, "./utils": 9}], 4: [function (n, o, a) {
|
|
Object.defineProperty(a, "__esModule", {value: !0});
|
|
var r = function (e, t) {
|
|
return new RegExp(" " + t + " ").test(" " + e.className + " ")
|
|
}, s = function (e, t) {
|
|
r(e, t) || (e.className += " " + t)
|
|
}, l = function (e, t) {
|
|
var n = " " + e.className.replace(/[\t\r\n]/g, " ") + " ";
|
|
if (r(e, t)) {
|
|
for (; n.indexOf(" " + t + " ") >= 0;) n = n.replace(" " + t + " ", " ");
|
|
e.className = n.replace(/^\s+|\s+$/g, "")
|
|
}
|
|
}, i = function (e) {
|
|
var n = t.createElement("div");
|
|
return n.appendChild(t.createTextNode(e)), n.innerHTML
|
|
}, u = function (e) {
|
|
e.style.opacity = "", e.style.display = "block"
|
|
}, c = function (e) {
|
|
if (e && !e.length) return u(e);
|
|
for (var t = 0; t < e.length; ++t) u(e[t])
|
|
}, d = function (e) {
|
|
e.style.opacity = "", e.style.display = "none"
|
|
}, f = function (e) {
|
|
if (e && !e.length) return d(e);
|
|
for (var t = 0; t < e.length; ++t) d(e[t])
|
|
}, p = function (e, t) {
|
|
for (var n = t.parentNode; null !== n;) {
|
|
if (n === e) return !0;
|
|
n = n.parentNode
|
|
}
|
|
return !1
|
|
}, m = function (e) {
|
|
e.style.left = "-9999px", e.style.display = "block";
|
|
var t, n = e.clientHeight;
|
|
return t = "undefined" != typeof getComputedStyle ? parseInt(getComputedStyle(e).getPropertyValue("padding-top"), 10) : parseInt(e.currentStyle.padding), e.style.left = "", e.style.display = "none", "-" + parseInt((n + t) / 2) + "px"
|
|
}, v = function (e, t) {
|
|
if (+e.style.opacity < 1) {
|
|
t = t || 16, e.style.opacity = 0, e.style.display = "block";
|
|
var n = +new Date, o = function (e) {
|
|
function t() {
|
|
return e.apply(this, arguments)
|
|
}
|
|
|
|
return t.toString = function () {
|
|
return e.toString()
|
|
}, t
|
|
}(function () {
|
|
e.style.opacity = +e.style.opacity + (new Date - n) / 100, n = +new Date, +e.style.opacity < 1 && setTimeout(o, t)
|
|
});
|
|
o()
|
|
}
|
|
e.style.display = "block"
|
|
}, y = function (e, t) {
|
|
t = t || 16, e.style.opacity = 1;
|
|
var n = +new Date, o = function (e) {
|
|
function t() {
|
|
return e.apply(this, arguments)
|
|
}
|
|
|
|
return t.toString = function () {
|
|
return e.toString()
|
|
}, t
|
|
}(function () {
|
|
e.style.opacity = +e.style.opacity - (new Date - n) / 100, n = +new Date, +e.style.opacity > 0 ? setTimeout(o, t) : e.style.display = "none"
|
|
});
|
|
o()
|
|
}, h = function (n) {
|
|
if ("function" == typeof MouseEvent) {
|
|
var o = new MouseEvent("click", {view: e, bubbles: !1, cancelable: !0});
|
|
n.dispatchEvent(o)
|
|
} else if (t.createEvent) {
|
|
var a = t.createEvent("MouseEvents");
|
|
a.initEvent("click", !1, !1), n.dispatchEvent(a)
|
|
} else t.createEventObject ? n.fireEvent("onclick") : "function" == typeof n.onclick && n.onclick()
|
|
}, b = function (t) {
|
|
"function" == typeof t.stopPropagation ? (t.stopPropagation(), t.preventDefault()) : e.event && e.event.hasOwnProperty("cancelBubble") && (e.event.cancelBubble = !0)
|
|
};
|
|
a.hasClass = r, a.addClass = s, a.removeClass = l, a.escapeHtml = i, a._show = u, a.show = c, a._hide = d, a.hide = f, a.isDescendant = p, a.getTopMargin = m, a.fadeIn = v, a.fadeOut = y, a.fireClick = h, a.stopEventPropagation = b
|
|
}, {}], 5: [function (t, o, a) {
|
|
Object.defineProperty(a, "__esModule", {value: !0});
|
|
var r = t("./handle-dom"), s = t("./handle-swal-dom"), l = function (t, o, a) {
|
|
var l = t || e.event, i = l.keyCode || l.which, u = a.querySelector("button.confirm"),
|
|
c = a.querySelector("button.cancel"), d = a.querySelectorAll("button[tabindex]");
|
|
if (-1 !== [9, 13, 32, 27].indexOf(i)) {
|
|
for (var f = l.target || l.srcElement, p = -1, m = 0; m < d.length; m++) if (f === d[m]) {
|
|
p = m;
|
|
break
|
|
}
|
|
9 === i ? (f = -1 === p ? u : p === d.length - 1 ? d[0] : d[p + 1], r.stopEventPropagation(l), f.focus(), o.confirmButtonColor && s.setFocusStyle(f, o.confirmButtonColor)) : 13 === i ? ("INPUT" === f.tagName && (f = u, u.focus()), f = -1 === p ? u : n) : 27 === i && o.allowEscapeKey === !0 ? (f = c, r.fireClick(f, l)) : f = n
|
|
}
|
|
};
|
|
a["default"] = l, o.exports = a["default"]
|
|
}, {"./handle-dom": 4, "./handle-swal-dom": 6}], 6: [function (n, o, a) {
|
|
var r = function (e) {
|
|
return e && e.__esModule ? e : {"default": e}
|
|
};
|
|
Object.defineProperty(a, "__esModule", {value: !0});
|
|
var s = n("./utils"), l = n("./handle-dom"), i = n("./default-params"), u = r(i), c = n("./injected-html"),
|
|
d = r(c), f = ".sweet-alert", p = ".sweet-overlay", m = function () {
|
|
var e = t.createElement("div");
|
|
for (e.innerHTML = d["default"]; e.firstChild;) t.body.appendChild(e.firstChild)
|
|
}, v = function (e) {
|
|
function t() {
|
|
return e.apply(this, arguments)
|
|
}
|
|
|
|
return t.toString = function () {
|
|
return e.toString()
|
|
}, t
|
|
}(function () {
|
|
var e = t.querySelector(f);
|
|
return e || (m(), e = v()), e
|
|
}), y = function () {
|
|
var e = v();
|
|
return e ? e.querySelector("input") : void 0
|
|
}, h = function () {
|
|
return t.querySelector(p)
|
|
}, b = function (e, t) {
|
|
var n = s.hexToRgb(t);
|
|
e.style.boxShadow = "0 0 2px rgba(" + n + ", 0.8), inset 0 0 0 1px rgba(0, 0, 0, 0.05)"
|
|
}, g = function (n) {
|
|
var o = v();
|
|
l.fadeIn(h(), 10), l.show(o), l.addClass(o, "showSweetAlert"), l.removeClass(o, "hideSweetAlert"), e.previousActiveElement = t.activeElement;
|
|
var a = o.querySelector("button.confirm");
|
|
a.focus(), setTimeout(function () {
|
|
l.addClass(o, "visible")
|
|
}, 500);
|
|
var r = o.getAttribute("data-timer");
|
|
if ("null" !== r && "" !== r) {
|
|
var s = n;
|
|
o.timeout = setTimeout(function () {
|
|
var e = (s || null) && "true" === o.getAttribute("data-has-done-function");
|
|
e ? s(null) : sweetAlert.close()
|
|
}, r)
|
|
}
|
|
}, w = function () {
|
|
var e = v(), t = y();
|
|
l.removeClass(e, "show-input"), t.value = u["default"].inputValue, t.setAttribute("type", u["default"].inputType), t.setAttribute("placeholder", u["default"].inputPlaceholder), C()
|
|
}, C = function (e) {
|
|
if (e && 13 === e.keyCode) return !1;
|
|
var t = v(), n = t.querySelector(".sa-input-error");
|
|
l.removeClass(n, "show");
|
|
var o = t.querySelector(".sa-error-container");
|
|
l.removeClass(o, "show")
|
|
}, S = function () {
|
|
var e = v();
|
|
e.style.marginTop = l.getTopMargin(v())
|
|
};
|
|
a.sweetAlertInitialize = m, a.getModal = v, a.getOverlay = h, a.getInput = y, a.setFocusStyle = b, a.openModal = g, a.resetInput = w, a.resetInputError = C, a.fixVerticalPosition = S
|
|
}, {"./default-params": 2, "./handle-dom": 4, "./injected-html": 7, "./utils": 9}], 7: [function (e, t, n) {
|
|
Object.defineProperty(n, "__esModule", {value: !0});
|
|
var o = '<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert"><div class="sa-icon sa-error">\n <span class="sa-x-mark">\n <span class="sa-line sa-left"></span>\n <span class="sa-line sa-right"></span>\n </span>\n </div><div class="sa-icon sa-warning">\n <span class="sa-body"></span>\n <span class="sa-dot"></span>\n </div><div class="sa-icon sa-info"></div><div class="sa-icon sa-success">\n <span class="sa-line sa-tip"></span>\n <span class="sa-line sa-long"></span>\n\n <div class="sa-placeholder"></div>\n <div class="sa-fix"></div>\n </div><div class="sa-icon sa-custom"></div><h2>Title</h2>\n <p>Text</p>\n <fieldset>\n <input type="text" tabIndex="3" />\n <div class="sa-input-error"></div>\n </fieldset><div class="sa-error-container">\n <div class="icon">!</div>\n <p>Not valid!</p>\n </div><div class="sa-button-container">\n <button class="cancel" tabIndex="2">Cancel</button>\n <div class="sa-confirm-button-container">\n <button class="confirm" tabIndex="1">OK</button><div class="la-ball-fall">\n <div></div>\n <div></div>\n <div></div>\n </div>\n </div>\n </div></div>';
|
|
n["default"] = o, t.exports = n["default"]
|
|
}, {}], 8: [function (e, t, o) {
|
|
Object.defineProperty(o, "__esModule", {value: !0});
|
|
var a = e("./utils"), r = e("./handle-swal-dom"), s = e("./handle-dom"),
|
|
l = ["error", "warning", "info", "success", "input", "prompt"], i = function (e) {
|
|
var t = r.getModal(), o = t.querySelector("h2"), i = t.querySelector("p"),
|
|
u = t.querySelector("button.cancel"), c = t.querySelector("button.confirm");
|
|
if (o.innerHTML = e.html ? e.title : s.escapeHtml(e.title).split("\n").join("<br>"), i.innerHTML = e.html ? e.text : s.escapeHtml(e.text || "").split("\n").join("<br>"), e.text && s.show(i), e.customClass) s.addClass(t, e.customClass), t.setAttribute("data-custom-class", e.customClass); else {
|
|
var d = t.getAttribute("data-custom-class");
|
|
s.removeClass(t, d), t.setAttribute("data-custom-class", "")
|
|
}
|
|
if (s.hide(t.querySelectorAll(".sa-icon")), e.type && !a.isIE8()) {
|
|
var f = function () {
|
|
for (var o = !1, a = 0; a < l.length; a++) if (e.type === l[a]) {
|
|
o = !0;
|
|
break
|
|
}
|
|
if (!o) return logStr("Unknown alert type: " + e.type), {v: !1};
|
|
var i = ["success", "error", "warning", "info"], u = n;
|
|
-1 !== i.indexOf(e.type) && (u = t.querySelector(".sa-icon.sa-" + e.type), s.show(u));
|
|
var c = r.getInput();
|
|
switch (e.type) {
|
|
case"success":
|
|
s.addClass(u, "animate"), s.addClass(u.querySelector(".sa-tip"), "animateSuccessTip"), s.addClass(u.querySelector(".sa-long"), "animateSuccessLong");
|
|
break;
|
|
case"error":
|
|
s.addClass(u, "animateErrorIcon"), s.addClass(u.querySelector(".sa-x-mark"), "animateXMark");
|
|
break;
|
|
case"warning":
|
|
s.addClass(u, "pulseWarning"), s.addClass(u.querySelector(".sa-body"), "pulseWarningIns"), s.addClass(u.querySelector(".sa-dot"), "pulseWarningIns");
|
|
break;
|
|
case"input":
|
|
case"prompt":
|
|
c.setAttribute("type", e.inputType), c.value = e.inputValue, c.setAttribute("placeholder", e.inputPlaceholder), s.addClass(t, "show-input"), setTimeout(function () {
|
|
c.focus(), c.addEventListener("keyup", swal.resetInputError)
|
|
}, 400)
|
|
}
|
|
}();
|
|
if ("object" == typeof f) return f.v
|
|
}
|
|
if (e.imageUrl) {
|
|
var p = t.querySelector(".sa-icon.sa-custom");
|
|
p.style.backgroundImage = "url(" + e.imageUrl + ")", s.show(p);
|
|
var m = 80, v = 80;
|
|
if (e.imageSize) {
|
|
var y = e.imageSize.toString().split("x"), h = y[0], b = y[1];
|
|
h && b ? (m = h, v = b) : logStr("Parameter imageSize expects value with format WIDTHxHEIGHT, got " + e.imageSize)
|
|
}
|
|
p.setAttribute("style", p.getAttribute("style") + "width:" + m + "px; height:" + v + "px")
|
|
}
|
|
t.setAttribute("data-has-cancel-button", e.showCancelButton), e.showCancelButton ? u.style.display = "inline-block" : s.hide(u), t.setAttribute("data-has-confirm-button", e.showConfirmButton), e.showConfirmButton ? c.style.display = "inline-block" : s.hide(c), e.cancelButtonText && (u.innerHTML = s.escapeHtml(e.cancelButtonText)), e.confirmButtonText && (c.innerHTML = s.escapeHtml(e.confirmButtonText)), e.confirmButtonColor && (c.style.backgroundColor = e.confirmButtonColor, c.style.borderLeftColor = e.confirmLoadingButtonColor, c.style.borderRightColor = e.confirmLoadingButtonColor, r.setFocusStyle(c, e.confirmButtonColor)), t.setAttribute("data-allow-outside-click", e.allowOutsideClick);
|
|
var g = e.doneFunction ? !0 : !1;
|
|
t.setAttribute("data-has-done-function", g), e.animation ? "string" == typeof e.animation ? t.setAttribute("data-animation", e.animation) : t.setAttribute("data-animation", "pop") : t.setAttribute("data-animation", "none"), t.setAttribute("data-timer", e.timer)
|
|
};
|
|
o["default"] = i, t.exports = o["default"]
|
|
}, {"./handle-dom": 4, "./handle-swal-dom": 6, "./utils": 9}], 9: [function (t, n, o) {
|
|
Object.defineProperty(o, "__esModule", {value: !0});
|
|
var a = function (e, t) {
|
|
for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]);
|
|
return e
|
|
}, r = function (e) {
|
|
var t = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);
|
|
return t ? parseInt(t[1], 16) + ", " + parseInt(t[2], 16) + ", " + parseInt(t[3], 16) : null
|
|
}, s = function () {
|
|
return e.attachEvent && !e.addEventListener
|
|
}, l = function (t) {
|
|
e.console && e.console.log("SweetAlert: " + t)
|
|
}, i = function (e, t) {
|
|
e = String(e).replace(/[^0-9a-f]/gi, ""), e.length < 6 && (e = e[0] + e[0] + e[1] + e[1] + e[2] + e[2]), t = t || 0;
|
|
var n, o, a = "#";
|
|
for (o = 0; 3 > o; o++) n = parseInt(e.substr(2 * o, 2), 16), n = Math.round(Math.min(Math.max(0, n + n * t), 255)).toString(16), a += ("00" + n).substr(n.length);
|
|
return a
|
|
};
|
|
o.extend = a, o.hexToRgb = r, o.isIE8 = s, o.logStr = l, o.colorLuminance = i
|
|
}, {}]
|
|
}, {}, [1]), "function" == typeof define && define.amd ? define(function () {
|
|
return sweetAlert
|
|
}) : "undefined" != typeof module && module.exports && (module.exports = sweetAlert)
|
|
}(window, document);
|
|
/*!
|
|
* Bootstrap v3.3.1 (http://getbootstrap.com)
|
|
* Copyright 2011-2014 Twitter, Inc.
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
*/
|
|
if ("undefined" == typeof jQuery) throw new Error("Bootstrap's JavaScript requires jQuery");
|
|
+function (a) {
|
|
var b = a.fn.jquery.split(" ")[0].split(".");
|
|
if (b[0] < 2 && b[1] < 9 || 1 == b[0] && 9 == b[1] && b[2] < 1) throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b() {
|
|
var a = document.createElement("bootstrap"), b = {
|
|
WebkitTransition: "webkitTransitionEnd",
|
|
MozTransition: "transitionend",
|
|
OTransition: "oTransitionEnd otransitionend",
|
|
transition: "transitionend"
|
|
};
|
|
for (var c in b) if (void 0 !== a.style[c]) return {end: b[c]};
|
|
return !1
|
|
}
|
|
|
|
a.fn.emulateTransitionEnd = function (b) {
|
|
var c = !1, d = this;
|
|
a(this).one("bsTransitionEnd", function () {
|
|
c = !0
|
|
});
|
|
var e = function () {
|
|
c || a(d).trigger(a.support.transition.end)
|
|
};
|
|
return setTimeout(e, b), this
|
|
}, a(function () {
|
|
a.support.transition = b(), a.support.transition && (a.event.special.bsTransitionEnd = {
|
|
bindType: a.support.transition.end,
|
|
delegateType: a.support.transition.end,
|
|
handle: function (b) {
|
|
return a(b.target).is(this) ? b.handleObj.handler.apply(this, arguments) : void 0
|
|
}
|
|
})
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var c = a(this), e = c.data("bs.alert");
|
|
e || c.data("bs.alert", e = new d(this)), "string" == typeof b && e[b].call(c)
|
|
})
|
|
}
|
|
|
|
var c = '[data-dismiss="alert"]', d = function (b) {
|
|
a(b).on("click", c, this.close)
|
|
};
|
|
d.VERSION = "3.3.1", d.TRANSITION_DURATION = 150, d.prototype.close = function (b) {
|
|
function c() {
|
|
g.detach().trigger("closed.bs.alert").remove()
|
|
}
|
|
|
|
var e = a(this), f = e.attr("data-target");
|
|
f || (f = e.attr("href"), f = f && f.replace(/.*(?=#[^\s]*$)/, ""));
|
|
var g = a(f);
|
|
b && b.preventDefault(), g.length || (g = e.closest(".alert")), g.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (g.removeClass("in"), a.support.transition && g.hasClass("fade") ? g.one("bsTransitionEnd", c).emulateTransitionEnd(d.TRANSITION_DURATION) : c())
|
|
};
|
|
var e = a.fn.alert;
|
|
a.fn.alert = b, a.fn.alert.Constructor = d, a.fn.alert.noConflict = function () {
|
|
return a.fn.alert = e, this
|
|
}, a(document).on("click.bs.alert.data-api", c, d.prototype.close)
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.button"), f = "object" == typeof b && b;
|
|
e || d.data("bs.button", e = new c(this, f)), "toggle" == b ? e.toggle() : b && e.setState(b)
|
|
})
|
|
}
|
|
|
|
var c = function (b, d) {
|
|
this.$element = a(b), this.options = a.extend({}, c.DEFAULTS, d), this.isLoading = !1
|
|
};
|
|
c.VERSION = "3.3.1", c.DEFAULTS = {loadingText: "loading..."}, c.prototype.setState = function (b) {
|
|
var c = "disabled", d = this.$element, e = d.is("input") ? "val" : "html", f = d.data();
|
|
b += "Text", null == f.resetText && d.data("resetText", d[e]()), setTimeout(a.proxy(function () {
|
|
d[e](null == f[b] ? this.options[b] : f[b]), "loadingText" == b ? (this.isLoading = !0, d.addClass(c).attr(c, c)) : this.isLoading && (this.isLoading = !1, d.removeClass(c).removeAttr(c))
|
|
}, this), 0)
|
|
}, c.prototype.toggle = function () {
|
|
var a = !0, b = this.$element.closest('[data-toggle="buttons"]');
|
|
if (b.length) {
|
|
var c = this.$element.find("input");
|
|
"radio" == c.prop("type") && (c.prop("checked") && this.$element.hasClass("active") ? a = !1 : b.find(".active").removeClass("active")), a && c.prop("checked", !this.$element.hasClass("active")).trigger("change")
|
|
} else this.$element.attr("aria-pressed", !this.$element.hasClass("active"));
|
|
a && this.$element.toggleClass("active")
|
|
};
|
|
var d = a.fn.button;
|
|
a.fn.button = b, a.fn.button.Constructor = c, a.fn.button.noConflict = function () {
|
|
return a.fn.button = d, this
|
|
}, a(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function (c) {
|
|
var d = a(c.target);
|
|
d.hasClass("btn") || (d = d.closest(".btn")), b.call(d, "toggle"), c.preventDefault()
|
|
}).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function (b) {
|
|
a(b.target).closest(".btn").toggleClass("focus", /^focus(in)?$/.test(b.type))
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.carousel"),
|
|
f = a.extend({}, c.DEFAULTS, d.data(), "object" == typeof b && b),
|
|
g = "string" == typeof b ? b : f.slide;
|
|
e || d.data("bs.carousel", e = new c(this, f)), "number" == typeof b ? e.to(b) : g ? e[g]() : f.interval && e.pause().cycle()
|
|
})
|
|
}
|
|
|
|
var c = function (b, c) {
|
|
this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = c, this.paused = this.sliding = this.interval = this.$active = this.$items = null, this.options.keyboard && this.$element.on("keydown.bs.carousel", a.proxy(this.keydown, this)), "hover" == this.options.pause && !("ontouchstart" in document.documentElement) && this.$element.on("mouseenter.bs.carousel", a.proxy(this.pause, this)).on("mouseleave.bs.carousel", a.proxy(this.cycle, this))
|
|
};
|
|
c.VERSION = "3.3.1", c.TRANSITION_DURATION = 600, c.DEFAULTS = {
|
|
interval: 5e3,
|
|
pause: "hover",
|
|
wrap: !0,
|
|
keyboard: !0
|
|
}, c.prototype.keydown = function (a) {
|
|
if (!/input|textarea/i.test(a.target.tagName)) {
|
|
switch (a.which) {
|
|
case 37:
|
|
this.prev();
|
|
break;
|
|
case 39:
|
|
this.next();
|
|
break;
|
|
default:
|
|
return
|
|
}
|
|
a.preventDefault()
|
|
}
|
|
}, c.prototype.cycle = function (b) {
|
|
return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this
|
|
}, c.prototype.getItemIndex = function (a) {
|
|
return this.$items = a.parent().children(".item"), this.$items.index(a || this.$active)
|
|
}, c.prototype.getItemForDirection = function (a, b) {
|
|
var c = "prev" == a ? -1 : 1, d = this.getItemIndex(b), e = (d + c) % this.$items.length;
|
|
return this.$items.eq(e)
|
|
}, c.prototype.to = function (a) {
|
|
var b = this, c = this.getItemIndex(this.$active = this.$element.find(".item.active"));
|
|
return a > this.$items.length - 1 || 0 > a ? void 0 : this.sliding ? this.$element.one("slid.bs.carousel", function () {
|
|
b.to(a)
|
|
}) : c == a ? this.pause().cycle() : this.slide(a > c ? "next" : "prev", this.$items.eq(a))
|
|
}, c.prototype.pause = function (b) {
|
|
return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this
|
|
}, c.prototype.next = function () {
|
|
return this.sliding ? void 0 : this.slide("next")
|
|
}, c.prototype.prev = function () {
|
|
return this.sliding ? void 0 : this.slide("prev")
|
|
}, c.prototype.slide = function (b, d) {
|
|
var e = this.$element.find(".item.active"), f = d || this.getItemForDirection(b, e), g = this.interval,
|
|
h = "next" == b ? "left" : "right", i = "next" == b ? "first" : "last", j = this;
|
|
if (!f.length) {
|
|
if (!this.options.wrap) return;
|
|
f = this.$element.find(".item")[i]()
|
|
}
|
|
if (f.hasClass("active")) return this.sliding = !1;
|
|
var k = f[0], l = a.Event("slide.bs.carousel", {relatedTarget: k, direction: h});
|
|
if (this.$element.trigger(l), !l.isDefaultPrevented()) {
|
|
if (this.sliding = !0, g && this.pause(), this.$indicators.length) {
|
|
this.$indicators.find(".active").removeClass("active");
|
|
var m = a(this.$indicators.children()[this.getItemIndex(f)]);
|
|
m && m.addClass("active")
|
|
}
|
|
var n = a.Event("slid.bs.carousel", {relatedTarget: k, direction: h});
|
|
return a.support.transition && this.$element.hasClass("slide") ? (f.addClass(b), f[0].offsetWidth, e.addClass(h), f.addClass(h), e.one("bsTransitionEnd", function () {
|
|
f.removeClass([b, h].join(" ")).addClass("active"), e.removeClass(["active", h].join(" ")), j.sliding = !1, setTimeout(function () {
|
|
j.$element.trigger(n)
|
|
}, 0)
|
|
}).emulateTransitionEnd(c.TRANSITION_DURATION)) : (e.removeClass("active"), f.addClass("active"), this.sliding = !1, this.$element.trigger(n)), g && this.cycle(), this
|
|
}
|
|
};
|
|
var d = a.fn.carousel;
|
|
a.fn.carousel = b, a.fn.carousel.Constructor = c, a.fn.carousel.noConflict = function () {
|
|
return a.fn.carousel = d, this
|
|
};
|
|
var e = function (c) {
|
|
var d, e = a(this), f = a(e.attr("data-target") || (d = e.attr("href")) && d.replace(/.*(?=#[^\s]+$)/, ""));
|
|
if (f.hasClass("carousel")) {
|
|
var g = a.extend({}, f.data(), e.data()), h = e.attr("data-slide-to");
|
|
h && (g.interval = !1), b.call(f, g), h && f.data("bs.carousel").to(h), c.preventDefault()
|
|
}
|
|
};
|
|
a(document).on("click.bs.carousel.data-api", "[data-slide]", e).on("click.bs.carousel.data-api", "[data-slide-to]", e), a(window).on("load", function () {
|
|
a('[data-ride="carousel"]').each(function () {
|
|
var c = a(this);
|
|
b.call(c, c.data())
|
|
})
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
var c, d = b.attr("data-target") || (c = b.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, "");
|
|
return a(d)
|
|
}
|
|
|
|
function c(b) {
|
|
return this.each(function () {
|
|
var c = a(this), e = c.data("bs.collapse"),
|
|
f = a.extend({}, d.DEFAULTS, c.data(), "object" == typeof b && b);
|
|
!e && f.toggle && "show" == b && (f.toggle = !1), e || c.data("bs.collapse", e = new d(this, f)), "string" == typeof b && e[b]()
|
|
})
|
|
}
|
|
|
|
var d = function (b, c) {
|
|
this.$element = a(b), this.options = a.extend({}, d.DEFAULTS, c), this.$trigger = a(this.options.trigger).filter('[href="#' + b.id + '"], [data-target="#' + b.id + '"]'), this.transitioning = null, this.options.parent ? this.$parent = this.getParent() : this.addAriaAndCollapsedClass(this.$element, this.$trigger), this.options.toggle && this.toggle()
|
|
};
|
|
d.VERSION = "3.3.1", d.TRANSITION_DURATION = 350, d.DEFAULTS = {
|
|
toggle: !0,
|
|
trigger: '[data-toggle="collapse"]'
|
|
}, d.prototype.dimension = function () {
|
|
var a = this.$element.hasClass("width");
|
|
return a ? "width" : "height"
|
|
}, d.prototype.show = function () {
|
|
if (!this.transitioning && !this.$element.hasClass("in")) {
|
|
var b, e = this.$parent && this.$parent.find("> .panel").children(".in, .collapsing");
|
|
if (!(e && e.length && (b = e.data("bs.collapse"), b && b.transitioning))) {
|
|
var f = a.Event("show.bs.collapse");
|
|
if (this.$element.trigger(f), !f.isDefaultPrevented()) {
|
|
e && e.length && (c.call(e, "hide"), b || e.data("bs.collapse", null));
|
|
var g = this.dimension();
|
|
this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded", !0), this.$trigger.removeClass("collapsed").attr("aria-expanded", !0), this.transitioning = 1;
|
|
var h = function () {
|
|
this.$element.removeClass("collapsing").addClass("collapse in")[g](""), this.transitioning = 0, this.$element.trigger("shown.bs.collapse")
|
|
};
|
|
if (!a.support.transition) return h.call(this);
|
|
var i = a.camelCase(["scroll", g].join("-"));
|
|
this.$element.one("bsTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])
|
|
}
|
|
}
|
|
}
|
|
}, d.prototype.hide = function () {
|
|
if (!this.transitioning && this.$element.hasClass("in")) {
|
|
var b = a.Event("hide.bs.collapse");
|
|
if (this.$element.trigger(b), !b.isDefaultPrevented()) {
|
|
var c = this.dimension();
|
|
this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", !1), this.$trigger.addClass("collapsed").attr("aria-expanded", !1), this.transitioning = 1;
|
|
var e = function () {
|
|
this.transitioning = 0, this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")
|
|
};
|
|
return a.support.transition ? void this.$element[c](0).one("bsTransitionEnd", a.proxy(e, this)).emulateTransitionEnd(d.TRANSITION_DURATION) : e.call(this)
|
|
}
|
|
}
|
|
}, d.prototype.toggle = function () {
|
|
this[this.$element.hasClass("in") ? "hide" : "show"]()
|
|
}, d.prototype.getParent = function () {
|
|
return a(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each(a.proxy(function (c, d) {
|
|
var e = a(d);
|
|
this.addAriaAndCollapsedClass(b(e), e)
|
|
}, this)).end()
|
|
}, d.prototype.addAriaAndCollapsedClass = function (a, b) {
|
|
var c = a.hasClass("in");
|
|
a.attr("aria-expanded", c), b.toggleClass("collapsed", !c).attr("aria-expanded", c)
|
|
};
|
|
var e = a.fn.collapse;
|
|
a.fn.collapse = c, a.fn.collapse.Constructor = d, a.fn.collapse.noConflict = function () {
|
|
return a.fn.collapse = e, this
|
|
}, a(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function (d) {
|
|
var e = a(this);
|
|
e.attr("data-target") || d.preventDefault();
|
|
var f = b(e), g = f.data("bs.collapse"), h = g ? "toggle" : a.extend({}, e.data(), {trigger: this});
|
|
c.call(f, h)
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
b && 3 === b.which || (a(e).remove(), a(f).each(function () {
|
|
var d = a(this), e = c(d), f = {relatedTarget: this};
|
|
e.hasClass("open") && (e.trigger(b = a.Event("hide.bs.dropdown", f)), b.isDefaultPrevented() || (d.attr("aria-expanded", "false"), e.removeClass("open").trigger("hidden.bs.dropdown", f)))
|
|
}))
|
|
}
|
|
|
|
function c(b) {
|
|
var c = b.attr("data-target");
|
|
c || (c = b.attr("href"), c = c && /#[A-Za-z]/.test(c) && c.replace(/.*(?=#[^\s]*$)/, ""));
|
|
var d = c && a(c);
|
|
return d && d.length ? d : b.parent()
|
|
}
|
|
|
|
function d(b) {
|
|
return this.each(function () {
|
|
var c = a(this), d = c.data("bs.dropdown");
|
|
d || c.data("bs.dropdown", d = new g(this)), "string" == typeof b && d[b].call(c)
|
|
})
|
|
}
|
|
|
|
var e = ".dropdown-backdrop", f = '[data-toggle="dropdown"]', g = function (b) {
|
|
a(b).on("click.bs.dropdown", this.toggle)
|
|
};
|
|
g.VERSION = "3.3.1", g.prototype.toggle = function (d) {
|
|
var e = a(this);
|
|
if (!e.is(".disabled, :disabled")) {
|
|
var f = c(e), g = f.hasClass("open");
|
|
if (b(), !g) {
|
|
"ontouchstart" in document.documentElement && !f.closest(".navbar-nav").length && a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click", b);
|
|
var h = {relatedTarget: this};
|
|
if (f.trigger(d = a.Event("show.bs.dropdown", h)), d.isDefaultPrevented()) return;
|
|
e.trigger("focus").attr("aria-expanded", "true"), f.toggleClass("open").trigger("shown.bs.dropdown", h)
|
|
}
|
|
return !1
|
|
}
|
|
}, g.prototype.keydown = function (b) {
|
|
if (/(38|40|27|32)/.test(b.which) && !/input|textarea/i.test(b.target.tagName)) {
|
|
var d = a(this);
|
|
if (b.preventDefault(), b.stopPropagation(), !d.is(".disabled, :disabled")) {
|
|
var e = c(d), g = e.hasClass("open");
|
|
if (!g && 27 != b.which || g && 27 == b.which) return 27 == b.which && e.find(f).trigger("focus"), d.trigger("click");
|
|
var h = " li:not(.divider):visible a", i = e.find('[role="menu"]' + h + ', [role="listbox"]' + h);
|
|
if (i.length) {
|
|
var j = i.index(b.target);
|
|
38 == b.which && j > 0 && j--, 40 == b.which && j < i.length - 1 && j++, ~j || (j = 0), i.eq(j).trigger("focus")
|
|
}
|
|
}
|
|
}
|
|
};
|
|
var h = a.fn.dropdown;
|
|
a.fn.dropdown = d, a.fn.dropdown.Constructor = g, a.fn.dropdown.noConflict = function () {
|
|
return a.fn.dropdown = h, this
|
|
}, a(document).on("click.bs.dropdown.data-api", b).on("click.bs.dropdown.data-api", ".dropdown form", function (a) {
|
|
a.stopPropagation()
|
|
}).on("click.bs.dropdown.data-api", f, g.prototype.toggle).on("keydown.bs.dropdown.data-api", f, g.prototype.keydown).on("keydown.bs.dropdown.data-api", '[role="menu"]', g.prototype.keydown).on("keydown.bs.dropdown.data-api", '[role="listbox"]', g.prototype.keydown)
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b, d) {
|
|
return this.each(function () {
|
|
var e = a(this), f = e.data("bs.modal"), g = a.extend({}, c.DEFAULTS, e.data(), "object" == typeof b && b);
|
|
f || e.data("bs.modal", f = new c(this, g)), "string" == typeof b ? f[b](d) : g.show && f.show(d)
|
|
})
|
|
}
|
|
|
|
var c = function (b, c) {
|
|
this.options = c, this.$body = a(document.body), this.$element = a(b), this.$backdrop = this.isShown = null, this.scrollbarWidth = 0, this.options.remote && this.$element.find(".modal-content").load(this.options.remote, a.proxy(function () {
|
|
this.$element.trigger("loaded.bs.modal")
|
|
}, this))
|
|
};
|
|
c.VERSION = "3.3.1", c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150, c.DEFAULTS = {
|
|
backdrop: !0,
|
|
keyboard: !0,
|
|
show: !0
|
|
}, c.prototype.toggle = function (a) {
|
|
return this.isShown ? this.hide() : this.show(a)
|
|
}, c.prototype.show = function (b) {
|
|
var d = this, e = a.Event("show.bs.modal", {relatedTarget: b});
|
|
this.$element.trigger(e), this.isShown || e.isDefaultPrevented() || (this.isShown = !0, this.checkScrollbar(), this.setScrollbar(), this.$body.addClass("modal-open"), this.escape(), this.resize(), this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', a.proxy(this.hide, this)), this.backdrop(function () {
|
|
var e = a.support.transition && d.$element.hasClass("fade");
|
|
d.$element.parent().length || d.$element.appendTo(d.$body), d.$element.show().scrollTop(0), d.options.backdrop && d.adjustBackdrop(), d.adjustDialog(), e && d.$element[0].offsetWidth, d.$element.addClass("in").attr("aria-hidden", !1), d.enforceFocus();
|
|
var f = a.Event("shown.bs.modal", {relatedTarget: b});
|
|
e ? d.$element.find(".modal-dialog").one("bsTransitionEnd", function () {
|
|
d.$element.trigger("focus").trigger(f)
|
|
}).emulateTransitionEnd(c.TRANSITION_DURATION) : d.$element.trigger("focus").trigger(f)
|
|
}))
|
|
}, c.prototype.hide = function (b) {
|
|
b && b.preventDefault(), b = a.Event("hide.bs.modal"), this.$element.trigger(b), this.isShown && !b.isDefaultPrevented() && (this.isShown = !1, this.escape(), this.resize(), a(document).off("focusin.bs.modal"), this.$element.removeClass("in").attr("aria-hidden", !0).off("click.dismiss.bs.modal"), a.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", a.proxy(this.hideModal, this)).emulateTransitionEnd(c.TRANSITION_DURATION) : this.hideModal())
|
|
}, c.prototype.enforceFocus = function () {
|
|
a(document).off("focusin.bs.modal").on("focusin.bs.modal", a.proxy(function (a) {
|
|
this.$element[0] === a.target || this.$element.has(a.target).length || this.$element.trigger("focus")
|
|
}, this))
|
|
}, c.prototype.escape = function () {
|
|
this.isShown && this.options.keyboard ? this.$element.on("keydown.dismiss.bs.modal", a.proxy(function (a) {
|
|
27 == a.which && this.hide()
|
|
}, this)) : this.isShown || this.$element.off("keydown.dismiss.bs.modal")
|
|
}, c.prototype.resize = function () {
|
|
this.isShown ? a(window).on("resize.bs.modal", a.proxy(this.handleUpdate, this)) : a(window).off("resize.bs.modal")
|
|
}, c.prototype.hideModal = function () {
|
|
var a = this;
|
|
this.$element.hide(), this.backdrop(function () {
|
|
a.$body.removeClass("modal-open"), a.resetAdjustments(), a.resetScrollbar(), a.$element.trigger("hidden.bs.modal")
|
|
})
|
|
}, c.prototype.removeBackdrop = function () {
|
|
this.$backdrop && this.$backdrop.remove(), this.$backdrop = null
|
|
}, c.prototype.backdrop = function (b) {
|
|
var d = this, e = this.$element.hasClass("fade") ? "fade" : "";
|
|
if (this.isShown && this.options.backdrop) {
|
|
var f = a.support.transition && e;
|
|
if (this.$backdrop = a('<div class="modal-backdrop ' + e + '" />').prependTo(this.$element).on("click.dismiss.bs.modal", a.proxy(function (a) {
|
|
a.target === a.currentTarget && ("static" == this.options.backdrop ? this.$element[0].focus.call(this.$element[0]) : this.hide.call(this))
|
|
}, this)), f && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !b) return;
|
|
f ? this.$backdrop.one("bsTransitionEnd", b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : b()
|
|
} else if (!this.isShown && this.$backdrop) {
|
|
this.$backdrop.removeClass("in");
|
|
var g = function () {
|
|
d.removeBackdrop(), b && b()
|
|
};
|
|
a.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : g()
|
|
} else b && b()
|
|
}, c.prototype.handleUpdate = function () {
|
|
this.options.backdrop && this.adjustBackdrop(), this.adjustDialog()
|
|
}, c.prototype.adjustBackdrop = function () {
|
|
this.$backdrop.css("height", 0).css("height", this.$element[0].scrollHeight)
|
|
}, c.prototype.adjustDialog = function () {
|
|
var a = this.$element[0].scrollHeight > document.documentElement.clientHeight;
|
|
this.$element.css({
|
|
paddingLeft: !this.bodyIsOverflowing && a ? this.scrollbarWidth : "",
|
|
paddingRight: this.bodyIsOverflowing && !a ? this.scrollbarWidth : ""
|
|
})
|
|
}, c.prototype.resetAdjustments = function () {
|
|
this.$element.css({paddingLeft: "", paddingRight: ""})
|
|
}, c.prototype.checkScrollbar = function () {
|
|
this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight, this.scrollbarWidth = this.measureScrollbar()
|
|
}, c.prototype.setScrollbar = function () {
|
|
var a = parseInt(this.$body.css("padding-right") || 0, 10);
|
|
this.bodyIsOverflowing && this.$body.css("padding-right", a + this.scrollbarWidth)
|
|
}, c.prototype.resetScrollbar = function () {
|
|
this.$body.css("padding-right", "")
|
|
}, c.prototype.measureScrollbar = function () {
|
|
var a = document.createElement("div");
|
|
a.className = "modal-scrollbar-measure", this.$body.append(a);
|
|
var b = a.offsetWidth - a.clientWidth;
|
|
return this.$body[0].removeChild(a), b
|
|
};
|
|
var d = a.fn.modal;
|
|
a.fn.modal = b, a.fn.modal.Constructor = c, a.fn.modal.noConflict = function () {
|
|
return a.fn.modal = d, this
|
|
}, a(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (c) {
|
|
var d = a(this), e = d.attr("href"), f = a(d.attr("data-target") || e && e.replace(/.*(?=#[^\s]+$)/, "")),
|
|
g = f.data("bs.modal") ? "toggle" : a.extend({remote: !/#/.test(e) && e}, f.data(), d.data());
|
|
d.is("a") && c.preventDefault(), f.one("show.bs.modal", function (a) {
|
|
a.isDefaultPrevented() || f.one("hidden.bs.modal", function () {
|
|
d.is(":visible") && d.trigger("focus")
|
|
})
|
|
}), b.call(f, g, this)
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.tooltip"), f = "object" == typeof b && b, g = f && f.selector;
|
|
(e || "destroy" != b) && (g ? (e || d.data("bs.tooltip", e = {}), e[g] || (e[g] = new c(this, f))) : e || d.data("bs.tooltip", e = new c(this, f)), "string" == typeof b && e[b]())
|
|
})
|
|
}
|
|
|
|
var c = function (a, b) {
|
|
this.type = this.options = this.enabled = this.timeout = this.hoverState = this.$element = null, this.init("tooltip", a, b)
|
|
};
|
|
c.VERSION = "3.3.1", c.TRANSITION_DURATION = 150, c.DEFAULTS = {
|
|
animation: !0,
|
|
placement: "top",
|
|
selector: !1,
|
|
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
|
|
trigger: "hover focus",
|
|
title: "",
|
|
delay: 0,
|
|
html: !1,
|
|
container: !1,
|
|
viewport: {selector: "body", padding: 0}
|
|
}, c.prototype.init = function (b, c, d) {
|
|
this.enabled = !0, this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.$viewport = this.options.viewport && a(this.options.viewport.selector || this.options.viewport);
|
|
for (var e = this.options.trigger.split(" "), f = e.length; f--;) {
|
|
var g = e[f];
|
|
if ("click" == g) this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)); else if ("manual" != g) {
|
|
var h = "hover" == g ? "mouseenter" : "focusin", i = "hover" == g ? "mouseleave" : "focusout";
|
|
this.$element.on(h + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(i + "." + this.type, this.options.selector, a.proxy(this.leave, this))
|
|
}
|
|
}
|
|
this.options.selector ? this._options = a.extend({}, this.options, {
|
|
trigger: "manual",
|
|
selector: ""
|
|
}) : this.fixTitle()
|
|
}, c.prototype.getDefaults = function () {
|
|
return c.DEFAULTS
|
|
}, c.prototype.getOptions = function (b) {
|
|
return b = a.extend({}, this.getDefaults(), this.$element.data(), b), b.delay && "number" == typeof b.delay && (b.delay = {
|
|
show: b.delay,
|
|
hide: b.delay
|
|
}), b
|
|
}, c.prototype.getDelegateOptions = function () {
|
|
var b = {}, c = this.getDefaults();
|
|
return this._options && a.each(this._options, function (a, d) {
|
|
c[a] != d && (b[a] = d)
|
|
}), b
|
|
}, c.prototype.enter = function (b) {
|
|
var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type);
|
|
return c && c.$tip && c.$tip.is(":visible") ? void(c.hoverState = "in") : (c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), clearTimeout(c.timeout), c.hoverState = "in", c.options.delay && c.options.delay.show ? void(c.timeout = setTimeout(function () {
|
|
"in" == c.hoverState && c.show()
|
|
}, c.options.delay.show)) : c.show())
|
|
}, c.prototype.leave = function (b) {
|
|
var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type);
|
|
return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), clearTimeout(c.timeout), c.hoverState = "out", c.options.delay && c.options.delay.hide ? void(c.timeout = setTimeout(function () {
|
|
"out" == c.hoverState && c.hide()
|
|
}, c.options.delay.hide)) : c.hide()
|
|
}, c.prototype.show = function () {
|
|
var b = a.Event("show.bs." + this.type);
|
|
if (this.hasContent() && this.enabled) {
|
|
this.$element.trigger(b);
|
|
var d = a.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]);
|
|
if (b.isDefaultPrevented() || !d) return;
|
|
var e = this, f = this.tip(), g = this.getUID(this.type);
|
|
this.setContent(), f.attr("id", g), this.$element.attr("aria-describedby", g), this.options.animation && f.addClass("fade");
|
|
var h = "function" == typeof this.options.placement ? this.options.placement.call(this, f[0], this.$element[0]) : this.options.placement,
|
|
i = /\s?auto?\s?/i, j = i.test(h);
|
|
j && (h = h.replace(i, "") || "top"), f.detach().css({
|
|
top: 0,
|
|
left: 0,
|
|
display: "block"
|
|
}).addClass(h).data("bs." + this.type, this), this.options.container ? f.appendTo(this.options.container) : f.insertAfter(this.$element);
|
|
var k = this.getPosition(), l = f[0].offsetWidth, m = f[0].offsetHeight;
|
|
if (j) {
|
|
var n = h, o = this.options.container ? a(this.options.container) : this.$element.parent(),
|
|
p = this.getPosition(o);
|
|
h = "bottom" == h && k.bottom + m > p.bottom ? "top" : "top" == h && k.top - m < p.top ? "bottom" : "right" == h && k.right + l > p.width ? "left" : "left" == h && k.left - l < p.left ? "right" : h, f.removeClass(n).addClass(h)
|
|
}
|
|
var q = this.getCalculatedOffset(h, k, l, m);
|
|
this.applyPlacement(q, h);
|
|
var r = function () {
|
|
var a = e.hoverState;
|
|
e.$element.trigger("shown.bs." + e.type), e.hoverState = null, "out" == a && e.leave(e)
|
|
};
|
|
a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", r).emulateTransitionEnd(c.TRANSITION_DURATION) : r()
|
|
}
|
|
}, c.prototype.applyPlacement = function (b, c) {
|
|
var d = this.tip(), e = d[0].offsetWidth, f = d[0].offsetHeight, g = parseInt(d.css("margin-top"), 10),
|
|
h = parseInt(d.css("margin-left"), 10);
|
|
isNaN(g) && (g = 0), isNaN(h) && (h = 0), b.top = b.top + g, b.left = b.left + h, a.offset.setOffset(d[0], a.extend({
|
|
using: function (a) {
|
|
d.css({top: Math.round(a.top), left: Math.round(a.left)})
|
|
}
|
|
}, b), 0), d.addClass("in");
|
|
var i = d[0].offsetWidth, j = d[0].offsetHeight;
|
|
"top" == c && j != f && (b.top = b.top + f - j);
|
|
var k = this.getViewportAdjustedDelta(c, b, i, j);
|
|
k.left ? b.left += k.left : b.top += k.top;
|
|
var l = /top|bottom/.test(c), m = l ? 2 * k.left - e + i : 2 * k.top - f + j,
|
|
n = l ? "offsetWidth" : "offsetHeight";
|
|
d.offset(b), this.replaceArrow(m, d[0][n], l)
|
|
}, c.prototype.replaceArrow = function (a, b, c) {
|
|
this.arrow().css(c ? "left" : "top", 50 * (1 - a / b) + "%").css(c ? "top" : "left", "")
|
|
}, c.prototype.setContent = function () {
|
|
var a = this.tip(), b = this.getTitle();
|
|
a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right")
|
|
}, c.prototype.hide = function (b) {
|
|
function d() {
|
|
"in" != e.hoverState && f.detach(), e.$element.removeAttr("aria-describedby").trigger("hidden.bs." + e.type), b && b()
|
|
}
|
|
|
|
var e = this, f = this.tip(), g = a.Event("hide.bs." + this.type);
|
|
return this.$element.trigger(g), g.isDefaultPrevented() ? void 0 : (f.removeClass("in"), a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", d).emulateTransitionEnd(c.TRANSITION_DURATION) : d(), this.hoverState = null, this)
|
|
}, c.prototype.fixTitle = function () {
|
|
var a = this.$element;
|
|
(a.attr("title") || "string" != typeof a.attr("data-original-title")) && a.attr("data-original-title", a.attr("title") || "").attr("title", "")
|
|
}, c.prototype.hasContent = function () {
|
|
return this.getTitle()
|
|
}, c.prototype.getPosition = function (b) {
|
|
b = b || this.$element;
|
|
var c = b[0], d = "BODY" == c.tagName, e = c.getBoundingClientRect();
|
|
null == e.width && (e = a.extend({}, e, {width: e.right - e.left, height: e.bottom - e.top}));
|
|
var f = d ? {top: 0, left: 0} : b.offset(),
|
|
g = {scroll: d ? document.documentElement.scrollTop || document.body.scrollTop : b.scrollTop()},
|
|
h = d ? {width: a(window).width(), height: a(window).height()} : null;
|
|
return a.extend({}, e, g, h, f)
|
|
}, c.prototype.getCalculatedOffset = function (a, b, c, d) {
|
|
return "bottom" == a ? {
|
|
top: b.top + b.height,
|
|
left: b.left + b.width / 2 - c / 2
|
|
} : "top" == a ? {
|
|
top: b.top - d,
|
|
left: b.left + b.width / 2 - c / 2
|
|
} : "left" == a ? {top: b.top + b.height / 2 - d / 2, left: b.left - c} : {
|
|
top: b.top + b.height / 2 - d / 2,
|
|
left: b.left + b.width
|
|
}
|
|
}, c.prototype.getViewportAdjustedDelta = function (a, b, c, d) {
|
|
var e = {top: 0, left: 0};
|
|
if (!this.$viewport) return e;
|
|
var f = this.options.viewport && this.options.viewport.padding || 0, g = this.getPosition(this.$viewport);
|
|
if (/right|left/.test(a)) {
|
|
var h = b.top - f - g.scroll, i = b.top + f - g.scroll + d;
|
|
h < g.top ? e.top = g.top - h : i > g.top + g.height && (e.top = g.top + g.height - i)
|
|
} else {
|
|
var j = b.left - f, k = b.left + f + c;
|
|
j < g.left ? e.left = g.left - j : k > g.width && (e.left = g.left + g.width - k)
|
|
}
|
|
return e
|
|
}, c.prototype.getTitle = function () {
|
|
var a, b = this.$element, c = this.options;
|
|
return a = b.attr("data-original-title") || ("function" == typeof c.title ? c.title.call(b[0]) : c.title)
|
|
}, c.prototype.getUID = function (a) {
|
|
do a += ~~(1e6 * Math.random()); while (document.getElementById(a));
|
|
return a
|
|
}, c.prototype.tip = function () {
|
|
return this.$tip = this.$tip || a(this.options.template)
|
|
}, c.prototype.arrow = function () {
|
|
return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
|
|
}, c.prototype.enable = function () {
|
|
this.enabled = !0
|
|
}, c.prototype.disable = function () {
|
|
this.enabled = !1
|
|
}, c.prototype.toggleEnabled = function () {
|
|
this.enabled = !this.enabled
|
|
}, c.prototype.toggle = function (b) {
|
|
var c = this;
|
|
b && (c = a(b.currentTarget).data("bs." + this.type), c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c))), c.tip().hasClass("in") ? c.leave(c) : c.enter(c)
|
|
}, c.prototype.destroy = function () {
|
|
var a = this;
|
|
clearTimeout(this.timeout), this.hide(function () {
|
|
a.$element.off("." + a.type).removeData("bs." + a.type)
|
|
})
|
|
};
|
|
var d = a.fn.tooltip;
|
|
a.fn.tooltip = b, a.fn.tooltip.Constructor = c, a.fn.tooltip.noConflict = function () {
|
|
return a.fn.tooltip = d, this
|
|
}
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.popover"), f = "object" == typeof b && b, g = f && f.selector;
|
|
(e || "destroy" != b) && (g ? (e || d.data("bs.popover", e = {}), e[g] || (e[g] = new c(this, f))) : e || d.data("bs.popover", e = new c(this, f)), "string" == typeof b && e[b]())
|
|
})
|
|
}
|
|
|
|
var c = function (a, b) {
|
|
this.init("popover", a, b)
|
|
};
|
|
if (!a.fn.tooltip) throw new Error("Popover requires tooltip.js");
|
|
c.VERSION = "3.3.1", c.DEFAULTS = a.extend({}, a.fn.tooltip.Constructor.DEFAULTS, {
|
|
placement: "right",
|
|
trigger: "click",
|
|
content: "",
|
|
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
|
|
}), c.prototype = a.extend({}, a.fn.tooltip.Constructor.prototype), c.prototype.constructor = c, c.prototype.getDefaults = function () {
|
|
return c.DEFAULTS
|
|
}, c.prototype.setContent = function () {
|
|
var a = this.tip(), b = this.getTitle(), c = this.getContent();
|
|
a.find(".popover-title")[this.options.html ? "html" : "text"](b), a.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof c ? "html" : "append" : "text"](c), a.removeClass("fade top bottom left right in"), a.find(".popover-title").html() || a.find(".popover-title").hide()
|
|
}, c.prototype.hasContent = function () {
|
|
return this.getTitle() || this.getContent()
|
|
}, c.prototype.getContent = function () {
|
|
var a = this.$element, b = this.options;
|
|
return a.attr("data-content") || ("function" == typeof b.content ? b.content.call(a[0]) : b.content)
|
|
}, c.prototype.arrow = function () {
|
|
return this.$arrow = this.$arrow || this.tip().find(".arrow")
|
|
}, c.prototype.tip = function () {
|
|
return this.$tip || (this.$tip = a(this.options.template)), this.$tip
|
|
};
|
|
var d = a.fn.popover;
|
|
a.fn.popover = b, a.fn.popover.Constructor = c, a.fn.popover.noConflict = function () {
|
|
return a.fn.popover = d, this
|
|
}
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(c, d) {
|
|
var e = a.proxy(this.process, this);
|
|
this.$body = a("body"), this.$scrollElement = a(a(c).is("body") ? window : c), this.options = a.extend({}, b.DEFAULTS, d), this.selector = (this.options.target || "") + " .nav li > a", this.offsets = [], this.targets = [], this.activeTarget = null, this.scrollHeight = 0, this.$scrollElement.on("scroll.bs.scrollspy", e), this.refresh(), this.process()
|
|
}
|
|
|
|
function c(c) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.scrollspy"), f = "object" == typeof c && c;
|
|
e || d.data("bs.scrollspy", e = new b(this, f)), "string" == typeof c && e[c]()
|
|
})
|
|
}
|
|
|
|
b.VERSION = "3.3.1", b.DEFAULTS = {offset: 10}, b.prototype.getScrollHeight = function () {
|
|
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
|
|
}, b.prototype.refresh = function () {
|
|
var b = "offset", c = 0;
|
|
a.isWindow(this.$scrollElement[0]) || (b = "position", c = this.$scrollElement.scrollTop()), this.offsets = [], this.targets = [], this.scrollHeight = this.getScrollHeight();
|
|
var d = this;
|
|
this.$body.find(this.selector).map(function () {
|
|
var d = a(this), e = d.data("target") || d.attr("href"), f = /^#./.test(e) && a(e);
|
|
return f && f.length && f.is(":visible") && [[f[b]().top + c, e]] || null
|
|
}).sort(function (a, b) {
|
|
return a[0] - b[0]
|
|
}).each(function () {
|
|
d.offsets.push(this[0]), d.targets.push(this[1])
|
|
})
|
|
}, b.prototype.process = function () {
|
|
var a, b = this.$scrollElement.scrollTop() + this.options.offset, c = this.getScrollHeight(),
|
|
d = this.options.offset + c - this.$scrollElement.height(), e = this.offsets, f = this.targets,
|
|
g = this.activeTarget;
|
|
if (this.scrollHeight != c && this.refresh(), b >= d) return g != (a = f[f.length - 1]) && this.activate(a);
|
|
if (g && b < e[0]) return this.activeTarget = null, this.clear();
|
|
for (a = e.length; a--;) g != f[a] && b >= e[a] && (!e[a + 1] || b <= e[a + 1]) && this.activate(f[a])
|
|
}, b.prototype.activate = function (b) {
|
|
this.activeTarget = b, this.clear();
|
|
var c = this.selector + '[data-target="' + b + '"],' + this.selector + '[href="' + b + '"]',
|
|
d = a(c).parents("li").addClass("active");
|
|
d.parent(".dropdown-menu").length && (d = d.closest("li.dropdown").addClass("active")), d.trigger("activate.bs.scrollspy")
|
|
}, b.prototype.clear = function () {
|
|
a(this.selector).parentsUntil(this.options.target, ".active").removeClass("active")
|
|
};
|
|
var d = a.fn.scrollspy;
|
|
a.fn.scrollspy = c, a.fn.scrollspy.Constructor = b, a.fn.scrollspy.noConflict = function () {
|
|
return a.fn.scrollspy = d, this
|
|
}, a(window).on("load.bs.scrollspy.data-api", function () {
|
|
a('[data-spy="scroll"]').each(function () {
|
|
var b = a(this);
|
|
c.call(b, b.data())
|
|
})
|
|
})
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.tab");
|
|
e || d.data("bs.tab", e = new c(this)), "string" == typeof b && e[b]()
|
|
})
|
|
}
|
|
|
|
var c = function (b) {
|
|
this.element = a(b)
|
|
};
|
|
c.VERSION = "3.3.1", c.TRANSITION_DURATION = 150, c.prototype.show = function () {
|
|
var b = this.element, c = b.closest("ul:not(.dropdown-menu)"), d = b.data("target");
|
|
if (d || (d = b.attr("href"), d = d && d.replace(/.*(?=#[^\s]*$)/, "")), !b.parent("li").hasClass("active")) {
|
|
var e = c.find(".active:last a"), f = a.Event("hide.bs.tab", {relatedTarget: b[0]}),
|
|
g = a.Event("show.bs.tab", {relatedTarget: e[0]});
|
|
if (e.trigger(f), b.trigger(g), !g.isDefaultPrevented() && !f.isDefaultPrevented()) {
|
|
var h = a(d);
|
|
this.activate(b.closest("li"), c), this.activate(h, h.parent(), function () {
|
|
e.trigger({type: "hidden.bs.tab", relatedTarget: b[0]}), b.trigger({
|
|
type: "shown.bs.tab",
|
|
relatedTarget: e[0]
|
|
})
|
|
})
|
|
}
|
|
}
|
|
}, c.prototype.activate = function (b, d, e) {
|
|
function f() {
|
|
g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !1), b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", !0), h ? (b[0].offsetWidth, b.addClass("in")) : b.removeClass("fade"), b.parent(".dropdown-menu") && b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !0), e && e()
|
|
}
|
|
|
|
var g = d.find("> .active"),
|
|
h = e && a.support.transition && (g.length && g.hasClass("fade") || !!d.find("> .fade").length);
|
|
g.length && h ? g.one("bsTransitionEnd", f).emulateTransitionEnd(c.TRANSITION_DURATION) : f(), g.removeClass("in")
|
|
};
|
|
var d = a.fn.tab;
|
|
a.fn.tab = b, a.fn.tab.Constructor = c, a.fn.tab.noConflict = function () {
|
|
return a.fn.tab = d, this
|
|
};
|
|
var e = function (c) {
|
|
c.preventDefault(), b.call(a(this), "show")
|
|
};
|
|
a(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', e).on("click.bs.tab.data-api", '[data-toggle="pill"]', e)
|
|
}(jQuery), +function (a) {
|
|
"use strict";
|
|
|
|
function b(b) {
|
|
return this.each(function () {
|
|
var d = a(this), e = d.data("bs.affix"), f = "object" == typeof b && b;
|
|
e || d.data("bs.affix", e = new c(this, f)), "string" == typeof b && e[b]()
|
|
})
|
|
}
|
|
|
|
var c = function (b, d) {
|
|
this.options = a.extend({}, c.DEFAULTS, d), this.$target = a(this.options.target).on("scroll.bs.affix.data-api", a.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", a.proxy(this.checkPositionWithEventLoop, this)), this.$element = a(b), this.affixed = this.unpin = this.pinnedOffset = null, this.checkPosition()
|
|
};
|
|
c.VERSION = "3.3.1", c.RESET = "affix affix-top affix-bottom", c.DEFAULTS = {
|
|
offset: 0,
|
|
target: window
|
|
}, c.prototype.getState = function (a, b, c, d) {
|
|
var e = this.$target.scrollTop(), f = this.$element.offset(), g = this.$target.height();
|
|
if (null != c && "top" == this.affixed) return c > e ? "top" : !1;
|
|
if ("bottom" == this.affixed) return null != c ? e + this.unpin <= f.top ? !1 : "bottom" : a - d >= e + g ? !1 : "bottom";
|
|
var h = null == this.affixed, i = h ? e : f.top, j = h ? g : b;
|
|
return null != c && c >= i ? "top" : null != d && i + j >= a - d ? "bottom" : !1
|
|
}, c.prototype.getPinnedOffset = function () {
|
|
if (this.pinnedOffset) return this.pinnedOffset;
|
|
this.$element.removeClass(c.RESET).addClass("affix");
|
|
var a = this.$target.scrollTop(), b = this.$element.offset();
|
|
return this.pinnedOffset = b.top - a
|
|
}, c.prototype.checkPositionWithEventLoop = function () {
|
|
setTimeout(a.proxy(this.checkPosition, this), 1)
|
|
}, c.prototype.checkPosition = function () {
|
|
if (this.$element.is(":visible")) {
|
|
var b = this.$element.height(), d = this.options.offset, e = d.top, f = d.bottom, g = a("body").height();
|
|
"object" != typeof d && (f = e = d), "function" == typeof e && (e = d.top(this.$element)), "function" == typeof f && (f = d.bottom(this.$element));
|
|
var h = this.getState(g, b, e, f);
|
|
if (this.affixed != h) {
|
|
null != this.unpin && this.$element.css("top", "");
|
|
var i = "affix" + (h ? "-" + h : ""), j = a.Event(i + ".bs.affix");
|
|
if (this.$element.trigger(j), j.isDefaultPrevented()) return;
|
|
this.affixed = h, this.unpin = "bottom" == h ? this.getPinnedOffset() : null, this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix", "affixed") + ".bs.affix")
|
|
}
|
|
"bottom" == h && this.$element.offset({top: g - b - f})
|
|
}
|
|
};
|
|
var d = a.fn.affix;
|
|
a.fn.affix = b, a.fn.affix.Constructor = c, a.fn.affix.noConflict = function () {
|
|
return a.fn.affix = d, this
|
|
}, a(window).on("load", function () {
|
|
a('[data-spy="affix"]').each(function () {
|
|
var c = a(this), d = c.data();
|
|
d.offset = d.offset || {}, null != d.offsetBottom && (d.offset.bottom = d.offsetBottom), null != d.offsetTop && (d.offset.top = d.offsetTop), b.call(c, d)
|
|
})
|
|
})
|
|
}(jQuery);
|
|
/*
|
|
* metismenu - v2.0.2
|
|
* A jQuery menu plugin
|
|
* https://github.com/onokumus/metisMenu
|
|
*
|
|
* Made by Osman Nuri Okumus
|
|
* Under MIT License
|
|
*/
|
|
|
|
!function (a) {
|
|
"use strict";
|
|
|
|
function b() {
|
|
var a = document.createElement("mm"), b = {
|
|
WebkitTransition: "webkitTransitionEnd",
|
|
MozTransition: "transitionend",
|
|
OTransition: "oTransitionEnd otransitionend",
|
|
transition: "transitionend"
|
|
};
|
|
for (var c in b) if (void 0 !== a.style[c]) return {end: b[c]};
|
|
return !1
|
|
}
|
|
|
|
function c(b) {
|
|
return this.each(function () {
|
|
var c = a(this), d = c.data("mm"), f = a.extend({}, e.DEFAULTS, c.data(), "object" == typeof b && b);
|
|
d || c.data("mm", d = new e(this, f)), "string" == typeof b && d[b]()
|
|
})
|
|
}
|
|
|
|
a.fn.emulateTransitionEnd = function (b) {
|
|
var c = !1, e = this;
|
|
a(this).one("mmTransitionEnd", function () {
|
|
c = !0
|
|
});
|
|
var f = function () {
|
|
c || a(e).trigger(d.end)
|
|
};
|
|
return setTimeout(f, b), this
|
|
};
|
|
var d = b();
|
|
d && (a.event.special.mmTransitionEnd = {
|
|
bindType: d.end, delegateType: d.end, handle: function (b) {
|
|
return a(b.target).is(this) ? b.handleObj.handler.apply(this, arguments) : void 0
|
|
}
|
|
});
|
|
var e = function (b, c) {
|
|
this.$element = a(b), this.options = a.extend({}, e.DEFAULTS, c), this.transitioning = null, this.init()
|
|
};
|
|
e.TRANSITION_DURATION = 350, e.DEFAULTS = {
|
|
toggle: !0,
|
|
doubleTapToGo: !1,
|
|
activeClass: "active"
|
|
}, e.prototype.init = function () {
|
|
var b = this, c = this.options.activeClass;
|
|
this.$element.find("li." + c).has("ul").children("ul").addClass("collapse in"), this.$element.find("li").not("." + c).has("ul").children("ul").addClass("collapse"), this.options.doubleTapToGo && this.$element.find("li." + c).has("ul").children("a").addClass("doubleTapToGo"), this.$element.find("li").has("ul").children("a").on("click.metisMenu", function (d) {
|
|
var e = a(this), f = e.parent("li"), g = f.children("ul");
|
|
return d.preventDefault(), f.hasClass(c) ? b.hide(g) : b.show(g), b.options.doubleTapToGo && b.doubleTapToGo(e) && "#" !== e.attr("href") && "" !== e.attr("href") ? (d.stopPropagation(), void(document.location = e.attr("href"))) : void 0
|
|
})
|
|
}, e.prototype.doubleTapToGo = function (a) {
|
|
var b = this.$element;
|
|
return a.hasClass("doubleTapToGo") ? (a.removeClass("doubleTapToGo"), !0) : a.parent().children("ul").length ? (b.find(".doubleTapToGo").removeClass("doubleTapToGo"), a.addClass("doubleTapToGo"), !1) : void 0
|
|
}, e.prototype.show = function (b) {
|
|
var c = this.options.activeClass, f = a(b), g = f.parent("li");
|
|
if (!this.transitioning && !f.hasClass("in")) {
|
|
g.addClass(c), this.options.toggle && this.hide(g.siblings().children("ul.in")), f.removeClass("collapse").addClass("collapsing").height(0), this.transitioning = 1;
|
|
var h = function () {
|
|
f.removeClass("collapsing").addClass("collapse in").height(""), this.transitioning = 0
|
|
};
|
|
return d ? void f.one("mmTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight) : h.call(this)
|
|
}
|
|
}, e.prototype.hide = function (b) {
|
|
var c = this.options.activeClass, f = a(b);
|
|
if (!this.transitioning && f.hasClass("in")) {
|
|
f.parent("li").removeClass(c), f.height(f.height())[0].offsetHeight, f.addClass("collapsing").removeClass("collapse").removeClass("in"), this.transitioning = 1;
|
|
var g = function () {
|
|
this.transitioning = 0, f.removeClass("collapsing").addClass("collapse")
|
|
};
|
|
return d ? void f.height(0).one("mmTransitionEnd", a.proxy(g, this)).emulateTransitionEnd(e.TRANSITION_DURATION) : g.call(this)
|
|
}
|
|
};
|
|
var f = a.fn.metisMenu;
|
|
a.fn.metisMenu = c, a.fn.metisMenu.Constructor = e, a.fn.metisMenu.noConflict = function () {
|
|
return a.fn.metisMenu = f, this
|
|
}
|
|
}(jQuery);
|
|
/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
|
|
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
|
*
|
|
* Version: 1.3.6
|
|
*
|
|
*/
|
|
(function (e) {
|
|
e.fn.extend({
|
|
slimScroll: function (g) {
|
|
var a = e.extend({
|
|
width: "auto",
|
|
height: "250px",
|
|
size: "7px",
|
|
color: "#000",
|
|
position: "right",
|
|
distance: "1px",
|
|
start: "top",
|
|
opacity: .4,
|
|
alwaysVisible: !1,
|
|
disableFadeOut: !1,
|
|
railVisible: !1,
|
|
railColor: "#333",
|
|
railOpacity: .2,
|
|
railDraggable: !0,
|
|
railClass: "slimScrollRail",
|
|
barClass: "slimScrollBar",
|
|
wrapperClass: "slimScrollDiv",
|
|
allowPageScroll: !1,
|
|
wheelStep: 20,
|
|
touchScrollStep: 200,
|
|
borderRadius: "7px",
|
|
railBorderRadius: "7px"
|
|
}, g);
|
|
this.each(function () {
|
|
function v(d) {
|
|
if (r) {
|
|
d = d || window.event;
|
|
var c = 0;
|
|
d.wheelDelta && (c = -d.wheelDelta / 120);
|
|
d.detail && (c = d.detail / 3);
|
|
e(d.target || d.srcTarget || d.srcElement).closest("." + a.wrapperClass).is(b.parent()) && m(c, !0);
|
|
d.preventDefault && !k && d.preventDefault();
|
|
k || (d.returnValue = !1)
|
|
}
|
|
}
|
|
|
|
function m(d, e, g) {
|
|
k = !1;
|
|
var f = d, h = b.outerHeight() - c.outerHeight();
|
|
e && (f = parseInt(c.css("top")) + d * parseInt(a.wheelStep) / 100 * c.outerHeight(), f = Math.min(Math.max(f, 0), h), f = 0 < d ? Math.ceil(f) : Math.floor(f), c.css({top: f + "px"}));
|
|
l = parseInt(c.css("top")) / (b.outerHeight() - c.outerHeight());
|
|
f = l * (b[0].scrollHeight - b.outerHeight());
|
|
g && (f = d, d = f / b[0].scrollHeight * b.outerHeight(), d = Math.min(Math.max(d, 0), h), c.css({top: d + "px"}));
|
|
b.scrollTop(f);
|
|
b.trigger("slimscrolling", ~~f);
|
|
w();
|
|
p()
|
|
}
|
|
|
|
function x() {
|
|
u = Math.max(b.outerHeight() / b[0].scrollHeight * b.outerHeight(), 30);
|
|
c.css({height: u + "px"});
|
|
var a = u == b.outerHeight() ? "none" : "block";
|
|
c.css({display: a})
|
|
}
|
|
|
|
function w() {
|
|
x();
|
|
clearTimeout(B);
|
|
l == ~~l ? (k = a.allowPageScroll, C != l && b.trigger("slimscroll", 0 == ~~l ? "top" : "bottom")) : k = !1;
|
|
C = l;
|
|
u >= b.outerHeight() ? k = !0 : (c.stop(!0,
|
|
!0).fadeIn("fast"), a.railVisible && h.stop(!0, !0).fadeIn("fast"))
|
|
}
|
|
|
|
function p() {
|
|
a.alwaysVisible || (B = setTimeout(function () {
|
|
a.disableFadeOut && r || y || z || (c.fadeOut("slow"), h.fadeOut("slow"))
|
|
}, 1E3))
|
|
}
|
|
|
|
var r, y, z, B, A, u, l, C, k = !1, b = e(this);
|
|
if (b.parent().hasClass(a.wrapperClass)) {
|
|
var n = b.scrollTop(), c = b.closest("." + a.barClass), h = b.closest("." + a.railClass);
|
|
x();
|
|
if (e.isPlainObject(g)) {
|
|
if ("height" in g && "auto" == g.height) {
|
|
b.parent().css("height", "auto");
|
|
b.css("height", "auto");
|
|
var q = b.parent().parent().height();
|
|
b.parent().css("height",
|
|
q);
|
|
b.css("height", q)
|
|
}
|
|
if ("scrollTo" in g) n = parseInt(a.scrollTo); else if ("scrollBy" in g) n += parseInt(a.scrollBy); else if ("destroy" in g) {
|
|
c.remove();
|
|
h.remove();
|
|
b.unwrap();
|
|
return
|
|
}
|
|
m(n, !1, !0)
|
|
}
|
|
} else if (!(e.isPlainObject(g) && "destroy" in g)) {
|
|
a.height = "auto" == a.height ? b.parent().height() : a.height;
|
|
n = e("<div></div>").addClass(a.wrapperClass).css({
|
|
position: "relative",
|
|
overflow: "hidden",
|
|
width: a.width,
|
|
height: a.height
|
|
});
|
|
b.css({overflow: "hidden", width: a.width, height: a.height});
|
|
var h = e("<div></div>").addClass(a.railClass).css({
|
|
width: a.size,
|
|
height: "100%",
|
|
position: "absolute",
|
|
top: 0,
|
|
display: a.alwaysVisible && a.railVisible ? "block" : "none",
|
|
"border-radius": a.railBorderRadius,
|
|
background: a.railColor,
|
|
opacity: a.railOpacity,
|
|
zIndex: 90
|
|
}), c = e("<div></div>").addClass(a.barClass).css({
|
|
background: a.color,
|
|
width: a.size,
|
|
position: "absolute",
|
|
top: 0,
|
|
opacity: a.opacity,
|
|
display: a.alwaysVisible ? "block" : "none",
|
|
"border-radius": a.borderRadius,
|
|
BorderRadius: a.borderRadius,
|
|
MozBorderRadius: a.borderRadius,
|
|
WebkitBorderRadius: a.borderRadius,
|
|
zIndex: 99
|
|
}), q = "right" == a.position ?
|
|
{right: a.distance} : {left: a.distance};
|
|
h.css(q);
|
|
c.css(q);
|
|
b.wrap(n);
|
|
b.parent().append(c);
|
|
b.parent().append(h);
|
|
a.railDraggable && c.bind("mousedown", function (a) {
|
|
var b = e(document);
|
|
z = !0;
|
|
t = parseFloat(c.css("top"));
|
|
pageY = a.pageY;
|
|
b.bind("mousemove.slimscroll", function (a) {
|
|
currTop = t + a.pageY - pageY;
|
|
c.css("top", currTop);
|
|
m(0, c.position().top, !1)
|
|
});
|
|
b.bind("mouseup.slimscroll", function (a) {
|
|
z = !1;
|
|
p();
|
|
b.unbind(".slimscroll")
|
|
});
|
|
return !1
|
|
}).bind("selectstart.slimscroll", function (a) {
|
|
a.stopPropagation();
|
|
a.preventDefault();
|
|
return !1
|
|
});
|
|
h.hover(function () {
|
|
w()
|
|
}, function () {
|
|
p()
|
|
});
|
|
c.hover(function () {
|
|
y = !0
|
|
}, function () {
|
|
y = !1
|
|
});
|
|
b.hover(function () {
|
|
r = !0;
|
|
w();
|
|
p()
|
|
}, function () {
|
|
r = !1;
|
|
p()
|
|
});
|
|
b.bind("touchstart", function (a, b) {
|
|
a.originalEvent.touches.length && (A = a.originalEvent.touches[0].pageY)
|
|
});
|
|
b.bind("touchmove", function (b) {
|
|
k || b.originalEvent.preventDefault();
|
|
b.originalEvent.touches.length && (m((A - b.originalEvent.touches[0].pageY) / a.touchScrollStep, !0), A = b.originalEvent.touches[0].pageY)
|
|
});
|
|
x();
|
|
"bottom" === a.start ? (c.css({top: b.outerHeight() - c.outerHeight()}),
|
|
m(0, !0)) : "top" !== a.start && (m(e(a.start).position().top, null, !0), a.alwaysVisible || c.hide());
|
|
window.addEventListener ? (this.addEventListener("DOMMouseScroll", v, !1), this.addEventListener("mousewheel", v, !1)) : document.attachEvent("onmousewheel", v)
|
|
}
|
|
});
|
|
return this
|
|
}
|
|
});
|
|
e.fn.extend({slimscroll: e.fn.slimScroll})
|
|
})(jQuery);
|
|
|
|
$(document).ready(function () {
|
|
|
|
// Add body-small class if window less than 768px
|
|
if ($(this).width() < 769) {
|
|
$('body').addClass('body-small')
|
|
} else {
|
|
$('body').removeClass('body-small')
|
|
}
|
|
|
|
// MetsiMenu
|
|
$('#side-menu').metisMenu();
|
|
|
|
// Collapse ibox function
|
|
$('.collapse-link').click(function () {
|
|
var ibox = $(this).closest('div.ibox');
|
|
var button = $(this).find('i');
|
|
var content = ibox.find('div.ibox-content');
|
|
content.slideToggle(200);
|
|
button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
|
|
ibox.toggleClass('').toggleClass('border-bottom');
|
|
setTimeout(function () {
|
|
ibox.resize();
|
|
ibox.find('[id^=map-]').resize();
|
|
}, 50);
|
|
});
|
|
|
|
// Close ibox function
|
|
$('.close-link').click(function () {
|
|
var content = $(this).closest('div.ibox');
|
|
content.remove();
|
|
});
|
|
|
|
// Close menu in canvas mode
|
|
$('.close-canvas-menu').click(function () {
|
|
$("body").toggleClass("mini-navbar");
|
|
SmoothlyMenu();
|
|
});
|
|
|
|
// Open close right sidebar
|
|
$('.right-sidebar-toggle').click(function () {
|
|
$('#right-sidebar').toggleClass('sidebar-open');
|
|
});
|
|
|
|
// Initialize slimscroll for right sidebar
|
|
$('.sidebar-container').slimScroll({
|
|
height: '100%',
|
|
railOpacity: 0.4,
|
|
wheelStep: 10
|
|
});
|
|
|
|
// Open close small chat
|
|
$('.open-small-chat').click(function () {
|
|
$(this).children().toggleClass('fa-comments').toggleClass('fa-remove');
|
|
$('.small-chat-box').toggleClass('active');
|
|
});
|
|
|
|
// Initialize slimscroll for small chat
|
|
$('.small-chat-box .content').slimScroll({
|
|
height: '234px',
|
|
railOpacity: 0.4
|
|
});
|
|
|
|
// Small todo handler
|
|
$('.check-link').click(function () {
|
|
var button = $(this).find('i');
|
|
var label = $(this).next('span');
|
|
button.toggleClass('fa-check-square').toggleClass('fa-square-o');
|
|
label.toggleClass('todo-completed');
|
|
return false;
|
|
});
|
|
|
|
// Minimalize menu
|
|
$('.navbar-minimalize').click(function () {
|
|
$("body").toggleClass("mini-navbar");
|
|
SmoothlyMenu();
|
|
|
|
});
|
|
|
|
// Tooltips demo
|
|
$('.tooltip-demo').tooltip({
|
|
selector: "[data-toggle=tooltip]",
|
|
container: "body"
|
|
});
|
|
|
|
// Move modal to body
|
|
// Fix Bootstrap backdrop issu with animation.css
|
|
$('.modal').appendTo("body");
|
|
|
|
// Full height of sidebar
|
|
function fix_height() {
|
|
var heightWithoutNavbar = $("body > #wrapper").height() - 61;
|
|
$(".sidebard-panel").css("min-height", heightWithoutNavbar + "px");
|
|
|
|
var navbarHeigh = $('nav.navbar-default').height();
|
|
var wrapperHeigh = $('#page-wrapper').height();
|
|
|
|
if (navbarHeigh > wrapperHeigh) {
|
|
$('#page-wrapper').css("min-height", navbarHeigh + "px");
|
|
}
|
|
|
|
if (navbarHeigh < wrapperHeigh) {
|
|
$('#page-wrapper').css("min-height", $(window).height() + "px");
|
|
}
|
|
|
|
if ($('body').hasClass('fixed-nav')) {
|
|
$('#page-wrapper').css("min-height", $(window).height() - 60 + "px");
|
|
}
|
|
|
|
}
|
|
|
|
fix_height();
|
|
|
|
// Fixed Sidebar
|
|
$(window).bind("load", function () {
|
|
if ($("body").hasClass('fixed-sidebar')) {
|
|
$('.sidebar-collapse').slimScroll({
|
|
height: '100%',
|
|
railOpacity: 0.9
|
|
});
|
|
}
|
|
})
|
|
|
|
// Move right sidebar top after scroll
|
|
$(window).scroll(function () {
|
|
if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) {
|
|
$('#right-sidebar').addClass('sidebar-top');
|
|
} else {
|
|
$('#right-sidebar').removeClass('sidebar-top');
|
|
}
|
|
});
|
|
|
|
$(window).bind("load resize scroll", function () {
|
|
if (!$("body").hasClass('body-small')) {
|
|
fix_height();
|
|
}
|
|
});
|
|
|
|
$("[data-toggle=popover]")
|
|
.popover();
|
|
|
|
// Add slimscroll to element
|
|
$('.full-height-scroll').slimscroll({
|
|
height: '100%'
|
|
})
|
|
});
|
|
|
|
|
|
// Minimalize menu when screen is less than 768px
|
|
$(window).bind("resize", function () {
|
|
if ($(this).width() < 769) {
|
|
$('body').addClass('body-small')
|
|
} else {
|
|
$('body').removeClass('body-small')
|
|
}
|
|
});
|
|
|
|
// For demo purpose - animation css script
|
|
function animationHover(element, animation) {
|
|
element = $(element);
|
|
element.hover(
|
|
function () {
|
|
element.addClass('animated ' + animation);
|
|
},
|
|
function () {
|
|
//wait for animation to finish before removing classes
|
|
window.setTimeout(function () {
|
|
element.removeClass('animated ' + animation);
|
|
}, 2000);
|
|
});
|
|
}
|
|
|
|
function SmoothlyMenu() {
|
|
if (!$('body').hasClass('mini-navbar') || $('body').hasClass('body-small')) {
|
|
// Hide menu in order to smoothly turn on when maximize menu
|
|
$('#side-menu').hide();
|
|
// For smoothly turn on menu
|
|
setTimeout(
|
|
function () {
|
|
$('#side-menu').fadeIn(500);
|
|
}, 100);
|
|
} else if ($('body').hasClass('fixed-sidebar')) {
|
|
$('#side-menu').hide();
|
|
setTimeout(
|
|
function () {
|
|
$('#side-menu').fadeIn(500);
|
|
}, 300);
|
|
} else {
|
|
// Remove all inline style from jquery fadeIn function to reset menu state
|
|
$('#side-menu').removeAttr('style');
|
|
}
|
|
}
|
|
|
|
|
|
/*! pace 1.0.0 */
|
|
(function () {
|
|
var a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K,
|
|
L, M, N, O, P, Q, R, S, T, U, V, W, X = [].slice, Y = {}.hasOwnProperty, Z = function (a, b) {
|
|
function c() {
|
|
this.constructor = a
|
|
}
|
|
|
|
for (var d in b) Y.call(b, d) && (a[d] = b[d]);
|
|
return c.prototype = b.prototype, a.prototype = new c, a.__super__ = b.prototype, a
|
|
}, $ = [].indexOf || function (a) {
|
|
for (var b = 0, c = this.length; c > b; b++) if (b in this && this[b] === a) return b;
|
|
return -1
|
|
};
|
|
for (u = {
|
|
catchupTime: 100,
|
|
initialRate: .03,
|
|
minTime: 250,
|
|
ghostTime: 100,
|
|
maxProgressPerFrame: 20,
|
|
easeFactor: 1.25,
|
|
startOnPageLoad: !0,
|
|
restartOnPushState: !0,
|
|
restartOnRequestAfter: 500,
|
|
target: "body",
|
|
elements: {checkInterval: 100, selectors: ["body"]},
|
|
eventLag: {minSamples: 10, sampleCount: 3, lagThreshold: 3},
|
|
ajax: {trackMethods: ["GET"], trackWebSockets: !0, ignoreURLs: []}
|
|
}, C = function () {
|
|
var a;
|
|
return null != (a = "undefined" != typeof performance && null !== performance && "function" == typeof performance.now ? performance.now() : void 0) ? a : +new Date
|
|
}, E = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame, t = window.cancelAnimationFrame || window.mozCancelAnimationFrame, null == E && (E = function (a) {
|
|
return setTimeout(a, 50)
|
|
}, t = function (a) {
|
|
return clearTimeout(a)
|
|
}), G = function (a) {
|
|
var b, c;
|
|
return b = C(), (c = function () {
|
|
var d;
|
|
return d = C() - b, d >= 33 ? (b = C(), a(d, function () {
|
|
return E(c)
|
|
})) : setTimeout(c, 33 - d)
|
|
})()
|
|
}, F = function () {
|
|
var a, b, c;
|
|
return c = arguments[0], b = arguments[1], a = 3 <= arguments.length ? X.call(arguments, 2) : [], "function" == typeof c[b] ? c[b].apply(c, a) : c[b]
|
|
}, v = function () {
|
|
var a, b, c, d, e, f, g;
|
|
for (b = arguments[0], d = 2 <= arguments.length ? X.call(arguments, 1) : [], f = 0, g = d.length; g > f; f++) if (c = d[f]) for (a in c) Y.call(c, a) && (e = c[a], null != b[a] && "object" == typeof b[a] && null != e && "object" == typeof e ? v(b[a], e) : b[a] = e);
|
|
return b
|
|
}, q = function (a) {
|
|
var b, c, d, e, f;
|
|
for (c = b = 0, e = 0, f = a.length; f > e; e++) d = a[e], c += Math.abs(d), b++;
|
|
return c / b
|
|
}, x = function (a, b) {
|
|
var c, d, e;
|
|
if (null == a && (a = "options"), null == b && (b = !0), e = document.querySelector("[data-pace-" + a + "]")) {
|
|
if (c = e.getAttribute("data-pace-" + a), !b) return c;
|
|
try {
|
|
return JSON.parse(c)
|
|
} catch (f) {
|
|
return d = f, "undefined" != typeof console && null !== console ? console.error("Error parsing inline pace options", d) : void 0
|
|
}
|
|
}
|
|
}, g = function () {
|
|
function a() {
|
|
}
|
|
|
|
return a.prototype.on = function (a, b, c, d) {
|
|
var e;
|
|
return null == d && (d = !1), null == this.bindings && (this.bindings = {}), null == (e = this.bindings)[a] && (e[a] = []), this.bindings[a].push({
|
|
handler: b,
|
|
ctx: c,
|
|
once: d
|
|
})
|
|
}, a.prototype.once = function (a, b, c) {
|
|
return this.on(a, b, c, !0)
|
|
}, a.prototype.off = function (a, b) {
|
|
var c, d, e;
|
|
if (null != (null != (d = this.bindings) ? d[a] : void 0)) {
|
|
if (null == b) return delete this.bindings[a];
|
|
for (c = 0, e = []; c < this.bindings[a].length;) e.push(this.bindings[a][c].handler === b ? this.bindings[a].splice(c, 1) : c++);
|
|
return e
|
|
}
|
|
}, a.prototype.trigger = function () {
|
|
var a, b, c, d, e, f, g, h, i;
|
|
if (c = arguments[0], a = 2 <= arguments.length ? X.call(arguments, 1) : [], null != (g = this.bindings) ? g[c] : void 0) {
|
|
for (e = 0, i = []; e < this.bindings[c].length;) h = this.bindings[c][e], d = h.handler, b = h.ctx, f = h.once, d.apply(null != b ? b : this, a), i.push(f ? this.bindings[c].splice(e, 1) : e++);
|
|
return i
|
|
}
|
|
}, a
|
|
}(), j = window.Pace || {}, window.Pace = j, v(j, g.prototype), D = j.options = v({}, u, window.paceOptions, x()), U = ["ajax", "document", "eventLag", "elements"], Q = 0, S = U.length; S > Q; Q++) K = U[Q], D[K] === !0 && (D[K] = u[K]);
|
|
i = function (a) {
|
|
function b() {
|
|
return V = b.__super__.constructor.apply(this, arguments)
|
|
}
|
|
|
|
return Z(b, a), b
|
|
}(Error), b = function () {
|
|
function a() {
|
|
this.progress = 0
|
|
}
|
|
|
|
return a.prototype.getElement = function () {
|
|
var a;
|
|
if (null == this.el) {
|
|
if (a = document.querySelector(D.target), !a) throw new i;
|
|
this.el = document.createElement("div"), this.el.className = "pace pace-active", document.body.className = document.body.className.replace(/pace-done/g, ""), document.body.className += " pace-running", this.el.innerHTML = '<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>', null != a.firstChild ? a.insertBefore(this.el, a.firstChild) : a.appendChild(this.el)
|
|
}
|
|
return this.el
|
|
}, a.prototype.finish = function () {
|
|
var a;
|
|
return a = this.getElement(), a.className = a.className.replace("pace-active", ""), a.className += " pace-inactive", document.body.className = document.body.className.replace("pace-running", ""), document.body.className += " pace-done"
|
|
}, a.prototype.update = function (a) {
|
|
return this.progress = a, this.render()
|
|
}, a.prototype.destroy = function () {
|
|
try {
|
|
this.getElement().parentNode.removeChild(this.getElement())
|
|
} catch (a) {
|
|
i = a
|
|
}
|
|
return this.el = void 0
|
|
}, a.prototype.render = function () {
|
|
var a, b, c, d, e, f, g;
|
|
if (null == document.querySelector(D.target)) return !1;
|
|
for (a = this.getElement(), d = "translate3d(" + this.progress + "%, 0, 0)", g = ["webkitTransform", "msTransform", "transform"], e = 0, f = g.length; f > e; e++) b = g[e], a.children[0].style[b] = d;
|
|
return (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) && (a.children[0].setAttribute("data-progress-text", "" + (0 | this.progress) + "%"), this.progress >= 100 ? c = "99" : (c = this.progress < 10 ? "0" : "", c += 0 | this.progress), a.children[0].setAttribute("data-progress", "" + c)), this.lastRenderedProgress = this.progress
|
|
}, a.prototype.done = function () {
|
|
return this.progress >= 100
|
|
}, a
|
|
}(), h = function () {
|
|
function a() {
|
|
this.bindings = {}
|
|
}
|
|
|
|
return a.prototype.trigger = function (a, b) {
|
|
var c, d, e, f, g;
|
|
if (null != this.bindings[a]) {
|
|
for (f = this.bindings[a], g = [], d = 0, e = f.length; e > d; d++) c = f[d], g.push(c.call(this, b));
|
|
return g
|
|
}
|
|
}, a.prototype.on = function (a, b) {
|
|
var c;
|
|
return null == (c = this.bindings)[a] && (c[a] = []), this.bindings[a].push(b)
|
|
}, a
|
|
}(), P = window.XMLHttpRequest, O = window.XDomainRequest, N = window.WebSocket, w = function (a, b) {
|
|
var c, d, e, f;
|
|
f = [];
|
|
for (d in b.prototype) try {
|
|
e = b.prototype[d], f.push(null == a[d] && "function" != typeof e ? a[d] = e : void 0)
|
|
} catch (g) {
|
|
c = g
|
|
}
|
|
return f
|
|
}, A = [], j.ignore = function () {
|
|
var a, b, c;
|
|
return b = arguments[0], a = 2 <= arguments.length ? X.call(arguments, 1) : [], A.unshift("ignore"), c = b.apply(null, a), A.shift(), c
|
|
}, j.track = function () {
|
|
var a, b, c;
|
|
return b = arguments[0], a = 2 <= arguments.length ? X.call(arguments, 1) : [], A.unshift("track"), c = b.apply(null, a), A.shift(), c
|
|
}, J = function (a) {
|
|
var b;
|
|
if (null == a && (a = "GET"), "track" === A[0]) return "force";
|
|
if (!A.length && D.ajax) {
|
|
if ("socket" === a && D.ajax.trackWebSockets) return !0;
|
|
if (b = a.toUpperCase(), $.call(D.ajax.trackMethods, b) >= 0) return !0
|
|
}
|
|
return !1
|
|
}, k = function (a) {
|
|
function b() {
|
|
var a, c = this;
|
|
b.__super__.constructor.apply(this, arguments), a = function (a) {
|
|
var b;
|
|
return b = a.open, a.open = function (d, e) {
|
|
return J(d) && c.trigger("request", {type: d, url: e, request: a}), b.apply(a, arguments)
|
|
}
|
|
}, window.XMLHttpRequest = function (b) {
|
|
var c;
|
|
return c = new P(b), a(c), c
|
|
};
|
|
try {
|
|
w(window.XMLHttpRequest, P)
|
|
} catch (d) {
|
|
}
|
|
if (null != O) {
|
|
window.XDomainRequest = function () {
|
|
var b;
|
|
return b = new O, a(b), b
|
|
};
|
|
try {
|
|
w(window.XDomainRequest, O)
|
|
} catch (d) {
|
|
}
|
|
}
|
|
if (null != N && D.ajax.trackWebSockets) {
|
|
window.WebSocket = function (a, b) {
|
|
var d;
|
|
return d = null != b ? new N(a, b) : new N(a), J("socket") && c.trigger("request", {
|
|
type: "socket",
|
|
url: a,
|
|
protocols: b,
|
|
request: d
|
|
}), d
|
|
};
|
|
try {
|
|
w(window.WebSocket, N)
|
|
} catch (d) {
|
|
}
|
|
}
|
|
}
|
|
|
|
return Z(b, a), b
|
|
}(h), R = null, y = function () {
|
|
return null == R && (R = new k), R
|
|
}, I = function (a) {
|
|
var b, c, d, e;
|
|
for (e = D.ajax.ignoreURLs, c = 0, d = e.length; d > c; c++) if (b = e[c], "string" == typeof b) {
|
|
if (-1 !== a.indexOf(b)) return !0
|
|
} else if (b.test(a)) return !0;
|
|
return !1
|
|
}, y().on("request", function (b) {
|
|
var c, d, e, f, g;
|
|
return f = b.type, e = b.request, g = b.url, I(g) ? void 0 : j.running || D.restartOnRequestAfter === !1 && "force" !== J(f) ? void 0 : (d = arguments, c = D.restartOnRequestAfter || 0, "boolean" == typeof c && (c = 0), setTimeout(function () {
|
|
var b, c, g, h, i, k;
|
|
if (b = "socket" === f ? e.readyState < 2 : 0 < (h = e.readyState) && 4 > h) {
|
|
for (j.restart(), i = j.sources, k = [], c = 0, g = i.length; g > c; c++) {
|
|
if (K = i[c], K instanceof a) {
|
|
K.watch.apply(K, d);
|
|
break
|
|
}
|
|
k.push(void 0)
|
|
}
|
|
return k
|
|
}
|
|
}, c))
|
|
}), a = function () {
|
|
function a() {
|
|
var a = this;
|
|
this.elements = [], y().on("request", function () {
|
|
return a.watch.apply(a, arguments)
|
|
})
|
|
}
|
|
|
|
return a.prototype.watch = function (a) {
|
|
var b, c, d, e;
|
|
return d = a.type, b = a.request, e = a.url, I(e) ? void 0 : (c = "socket" === d ? new n(b) : new o(b), this.elements.push(c))
|
|
}, a
|
|
}(), o = function () {
|
|
function a(a) {
|
|
var b, c, d, e, f, g, h = this;
|
|
if (this.progress = 0, null != window.ProgressEvent) for (c = null, a.addEventListener("progress", function (a) {
|
|
return h.progress = a.lengthComputable ? 100 * a.loaded / a.total : h.progress + (100 - h.progress) / 2
|
|
}, !1), g = ["load", "abort", "timeout", "error"], d = 0, e = g.length; e > d; d++) b = g[d], a.addEventListener(b, function () {
|
|
return h.progress = 100
|
|
}, !1); else f = a.onreadystatechange, a.onreadystatechange = function () {
|
|
var b;
|
|
return 0 === (b = a.readyState) || 4 === b ? h.progress = 100 : 3 === a.readyState && (h.progress = 50), "function" == typeof f ? f.apply(null, arguments) : void 0
|
|
}
|
|
}
|
|
|
|
return a
|
|
}(), n = function () {
|
|
function a(a) {
|
|
var b, c, d, e, f = this;
|
|
for (this.progress = 0, e = ["error", "open"], c = 0, d = e.length; d > c; c++) b = e[c], a.addEventListener(b, function () {
|
|
return f.progress = 100
|
|
}, !1)
|
|
}
|
|
|
|
return a
|
|
}(), d = function () {
|
|
function a(a) {
|
|
var b, c, d, f;
|
|
for (null == a && (a = {}), this.elements = [], null == a.selectors && (a.selectors = []), f = a.selectors, c = 0, d = f.length; d > c; c++) b = f[c], this.elements.push(new e(b))
|
|
}
|
|
|
|
return a
|
|
}(), e = function () {
|
|
function a(a) {
|
|
this.selector = a, this.progress = 0, this.check()
|
|
}
|
|
|
|
return a.prototype.check = function () {
|
|
var a = this;
|
|
return document.querySelector(this.selector) ? this.done() : setTimeout(function () {
|
|
return a.check()
|
|
}, D.elements.checkInterval)
|
|
}, a.prototype.done = function () {
|
|
return this.progress = 100
|
|
}, a
|
|
}(), c = function () {
|
|
function a() {
|
|
var a, b, c = this;
|
|
this.progress = null != (b = this.states[document.readyState]) ? b : 100, a = document.onreadystatechange, document.onreadystatechange = function () {
|
|
return null != c.states[document.readyState] && (c.progress = c.states[document.readyState]), "function" == typeof a ? a.apply(null, arguments) : void 0
|
|
}
|
|
}
|
|
|
|
return a.prototype.states = {loading: 0, interactive: 50, complete: 100}, a
|
|
}(), f = function () {
|
|
function a() {
|
|
var a, b, c, d, e, f = this;
|
|
this.progress = 0, a = 0, e = [], d = 0, c = C(), b = setInterval(function () {
|
|
var g;
|
|
return g = C() - c - 50, c = C(), e.push(g), e.length > D.eventLag.sampleCount && e.shift(), a = q(e), ++d >= D.eventLag.minSamples && a < D.eventLag.lagThreshold ? (f.progress = 100, clearInterval(b)) : f.progress = 100 * (3 / (a + 3))
|
|
}, 50)
|
|
}
|
|
|
|
return a
|
|
}(), m = function () {
|
|
function a(a) {
|
|
this.source = a, this.last = this.sinceLastUpdate = 0, this.rate = D.initialRate, this.catchup = 0, this.progress = this.lastProgress = 0, null != this.source && (this.progress = F(this.source, "progress"))
|
|
}
|
|
|
|
return a.prototype.tick = function (a, b) {
|
|
var c;
|
|
return null == b && (b = F(this.source, "progress")), b >= 100 && (this.done = !0), b === this.last ? this.sinceLastUpdate += a : (this.sinceLastUpdate && (this.rate = (b - this.last) / this.sinceLastUpdate), this.catchup = (b - this.progress) / D.catchupTime, this.sinceLastUpdate = 0, this.last = b), b > this.progress && (this.progress += this.catchup * a), c = 1 - Math.pow(this.progress / 100, D.easeFactor), this.progress += c * this.rate * a, this.progress = Math.min(this.lastProgress + D.maxProgressPerFrame, this.progress), this.progress = Math.max(0, this.progress), this.progress = Math.min(100, this.progress), this.lastProgress = this.progress, this.progress
|
|
}, a
|
|
}(), L = null, H = null, r = null, M = null, p = null, s = null, j.running = !1, z = function () {
|
|
return D.restartOnPushState ? j.restart() : void 0
|
|
}, null != window.history.pushState && (T = window.history.pushState, window.history.pushState = function () {
|
|
return z(), T.apply(window.history, arguments)
|
|
}), null != window.history.replaceState && (W = window.history.replaceState, window.history.replaceState = function () {
|
|
return z(), W.apply(window.history, arguments)
|
|
}), l = {ajax: a, elements: d, document: c, eventLag: f}, (B = function () {
|
|
var a, c, d, e, f, g, h, i;
|
|
for (j.sources = L = [], g = ["ajax", "elements", "document", "eventLag"], c = 0, e = g.length; e > c; c++) a = g[c], D[a] !== !1 && L.push(new l[a](D[a]));
|
|
for (i = null != (h = D.extraSources) ? h : [], d = 0, f = i.length; f > d; d++) K = i[d], L.push(new K(D));
|
|
return j.bar = r = new b, H = [], M = new m
|
|
})(), j.stop = function () {
|
|
return j.trigger("stop"), j.running = !1, r.destroy(), s = !0, null != p && ("function" == typeof t && t(p), p = null), B()
|
|
}, j.restart = function () {
|
|
return j.trigger("restart"), j.stop(), j.start()
|
|
}, j.go = function () {
|
|
var a;
|
|
return j.running = !0, r.render(), a = C(), s = !1, p = G(function (b, c) {
|
|
var d, e, f, g, h, i, k, l, n, o, p, q, t, u, v, w;
|
|
for (l = 100 - r.progress, e = p = 0, f = !0, i = q = 0, u = L.length; u > q; i = ++q) for (K = L[i], o = null != H[i] ? H[i] : H[i] = [], h = null != (w = K.elements) ? w : [K], k = t = 0, v = h.length; v > t; k = ++t) g = h[k], n = null != o[k] ? o[k] : o[k] = new m(g), f &= n.done, n.done || (e++, p += n.tick(b));
|
|
return d = p / e, r.update(M.tick(b, d)), r.done() || f || s ? (r.update(100), j.trigger("done"), setTimeout(function () {
|
|
return r.finish(), j.running = !1, j.trigger("hide")
|
|
}, Math.max(D.ghostTime, Math.max(D.minTime - (C() - a), 0)))) : c()
|
|
})
|
|
}, j.start = function (a) {
|
|
v(D, a), j.running = !0;
|
|
try {
|
|
r.render()
|
|
} catch (b) {
|
|
i = b
|
|
}
|
|
return document.querySelector(".pace") ? (j.trigger("start"), j.go()) : setTimeout(j.start, 50)
|
|
}, "function" == typeof define && define.amd ? define(function () {
|
|
return j
|
|
}) : "object" == typeof exports ? module.exports = j : D.startOnPageLoad && j.start()
|
|
}).call(this);
|
|
var QRCode;
|
|
!function () {
|
|
function a(a) {
|
|
this.mode = c.MODE_8BIT_BYTE, this.data = a, this.parsedData = [];
|
|
for (var b = [], d = 0, e = this.data.length; e > d; d++) {
|
|
var f = this.data.charCodeAt(d);
|
|
f > 65536 ? (b[0] = 240 | (1835008 & f) >>> 18, b[1] = 128 | (258048 & f) >>> 12, b[2] = 128 | (4032 & f) >>> 6, b[3] = 128 | 63 & f) : f > 2048 ? (b[0] = 224 | (61440 & f) >>> 12, b[1] = 128 | (4032 & f) >>> 6, b[2] = 128 | 63 & f) : f > 128 ? (b[0] = 192 | (1984 & f) >>> 6, b[1] = 128 | 63 & f) : b[0] = f, this.parsedData = this.parsedData.concat(b)
|
|
}
|
|
this.parsedData.length != this.data.length && (this.parsedData.unshift(191), this.parsedData.unshift(187), this.parsedData.unshift(239))
|
|
}
|
|
|
|
function b(a, b) {
|
|
this.typeNumber = a, this.errorCorrectLevel = b, this.modules = null, this.moduleCount = 0, this.dataCache = null, this.dataList = []
|
|
}
|
|
|
|
function i(a, b) {
|
|
if (void 0 == a.length) throw new Error(a.length + "/" + b);
|
|
for (var c = 0; c < a.length && 0 == a[c];) c++;
|
|
this.num = new Array(a.length - c + b);
|
|
for (var d = 0; d < a.length - c; d++) this.num[d] = a[d + c]
|
|
}
|
|
|
|
function j(a, b) {
|
|
this.totalCount = a, this.dataCount = b
|
|
}
|
|
|
|
function k() {
|
|
this.buffer = [], this.length = 0
|
|
}
|
|
|
|
function m() {
|
|
return "undefined" != typeof CanvasRenderingContext2D
|
|
}
|
|
|
|
function n() {
|
|
var a = !1, b = navigator.userAgent;
|
|
return /android/i.test(b) && (a = !0, aMat = b.toString().match(/android ([0-9]\.[0-9])/i), aMat && aMat[1] && (a = parseFloat(aMat[1]))), a
|
|
}
|
|
|
|
function r(a, b) {
|
|
for (var c = 1, e = s(a), f = 0, g = l.length; g >= f; f++) {
|
|
var h = 0;
|
|
switch (b) {
|
|
case d.L:
|
|
h = l[f][0];
|
|
break;
|
|
case d.M:
|
|
h = l[f][1];
|
|
break;
|
|
case d.Q:
|
|
h = l[f][2];
|
|
break;
|
|
case d.H:
|
|
h = l[f][3]
|
|
}
|
|
if (h >= e) break;
|
|
c++
|
|
}
|
|
if (c > l.length) throw new Error("Too long data");
|
|
return c
|
|
}
|
|
|
|
function s(a) {
|
|
var b = encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g, "a");
|
|
return b.length + (b.length != a ? 3 : 0)
|
|
}
|
|
|
|
a.prototype = {
|
|
getLength: function () {
|
|
return this.parsedData.length
|
|
}, write: function (a) {
|
|
for (var b = 0, c = this.parsedData.length; c > b; b++) a.put(this.parsedData[b], 8)
|
|
}
|
|
}, b.prototype = {
|
|
addData: function (b) {
|
|
var c = new a(b);
|
|
this.dataList.push(c), this.dataCache = null
|
|
}, isDark: function (a, b) {
|
|
if (0 > a || this.moduleCount <= a || 0 > b || this.moduleCount <= b) throw new Error(a + "," + b);
|
|
return this.modules[a][b]
|
|
}, getModuleCount: function () {
|
|
return this.moduleCount
|
|
}, make: function () {
|
|
this.makeImpl(!1, this.getBestMaskPattern())
|
|
}, makeImpl: function (a, c) {
|
|
this.moduleCount = 4 * this.typeNumber + 17, this.modules = new Array(this.moduleCount);
|
|
for (var d = 0; d < this.moduleCount; d++) {
|
|
this.modules[d] = new Array(this.moduleCount);
|
|
for (var e = 0; e < this.moduleCount; e++) this.modules[d][e] = null
|
|
}
|
|
this.setupPositionProbePattern(0, 0), this.setupPositionProbePattern(this.moduleCount - 7, 0), this.setupPositionProbePattern(0, this.moduleCount - 7), this.setupPositionAdjustPattern(), this.setupTimingPattern(), this.setupTypeInfo(a, c), this.typeNumber >= 7 && this.setupTypeNumber(a), null == this.dataCache && (this.dataCache = b.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, c)
|
|
}, setupPositionProbePattern: function (a, b) {
|
|
for (var c = -1; 7 >= c; c++) if (!(-1 >= a + c || this.moduleCount <= a + c)) for (var d = -1; 7 >= d; d++) -1 >= b + d || this.moduleCount <= b + d || (this.modules[a + c][b + d] = c >= 0 && 6 >= c && (0 == d || 6 == d) || d >= 0 && 6 >= d && (0 == c || 6 == c) || c >= 2 && 4 >= c && d >= 2 && 4 >= d ? !0 : !1)
|
|
}, getBestMaskPattern: function () {
|
|
for (var a = 0, b = 0, c = 0; 8 > c; c++) {
|
|
this.makeImpl(!0, c);
|
|
var d = f.getLostPoint(this);
|
|
(0 == c || a > d) && (a = d, b = c)
|
|
}
|
|
return b
|
|
}, createMovieClip: function (a, b, c) {
|
|
var d = a.createEmptyMovieClip(b, c), e = 1;
|
|
this.make();
|
|
for (var f = 0; f < this.modules.length; f++) for (var g = f * e, h = 0; h < this.modules[f].length; h++) {
|
|
var i = h * e, j = this.modules[f][h];
|
|
j && (d.beginFill(0, 100), d.moveTo(i, g), d.lineTo(i + e, g), d.lineTo(i + e, g + e), d.lineTo(i, g + e), d.endFill())
|
|
}
|
|
return d
|
|
}, setupTimingPattern: function () {
|
|
for (var a = 8; a < this.moduleCount - 8; a++) null == this.modules[a][6] && (this.modules[a][6] = 0 == a % 2);
|
|
for (var b = 8; b < this.moduleCount - 8; b++) null == this.modules[6][b] && (this.modules[6][b] = 0 == b % 2)
|
|
}, setupPositionAdjustPattern: function () {
|
|
for (var a = f.getPatternPosition(this.typeNumber), b = 0; b < a.length; b++) for (var c = 0; c < a.length; c++) {
|
|
var d = a[b], e = a[c];
|
|
if (null == this.modules[d][e]) for (var g = -2; 2 >= g; g++) for (var h = -2; 2 >= h; h++) this.modules[d + g][e + h] = -2 == g || 2 == g || -2 == h || 2 == h || 0 == g && 0 == h ? !0 : !1
|
|
}
|
|
}, setupTypeNumber: function (a) {
|
|
for (var b = f.getBCHTypeNumber(this.typeNumber), c = 0; 18 > c; c++) {
|
|
var d = !a && 1 == (1 & b >> c);
|
|
this.modules[Math.floor(c / 3)][c % 3 + this.moduleCount - 8 - 3] = d
|
|
}
|
|
for (var c = 0; 18 > c; c++) {
|
|
var d = !a && 1 == (1 & b >> c);
|
|
this.modules[c % 3 + this.moduleCount - 8 - 3][Math.floor(c / 3)] = d
|
|
}
|
|
}, setupTypeInfo: function (a, b) {
|
|
for (var c = this.errorCorrectLevel << 3 | b, d = f.getBCHTypeInfo(c), e = 0; 15 > e; e++) {
|
|
var g = !a && 1 == (1 & d >> e);
|
|
6 > e ? this.modules[e][8] = g : 8 > e ? this.modules[e + 1][8] = g : this.modules[this.moduleCount - 15 + e][8] = g
|
|
}
|
|
for (var e = 0; 15 > e; e++) {
|
|
var g = !a && 1 == (1 & d >> e);
|
|
8 > e ? this.modules[8][this.moduleCount - e - 1] = g : 9 > e ? this.modules[8][15 - e - 1 + 1] = g : this.modules[8][15 - e - 1] = g
|
|
}
|
|
this.modules[this.moduleCount - 8][8] = !a
|
|
}, mapData: function (a, b) {
|
|
for (var c = -1, d = this.moduleCount - 1, e = 7, g = 0, h = this.moduleCount - 1; h > 0; h -= 2) for (6 == h && h--; ;) {
|
|
for (var i = 0; 2 > i; i++) if (null == this.modules[d][h - i]) {
|
|
var j = !1;
|
|
g < a.length && (j = 1 == (1 & a[g] >>> e));
|
|
var k = f.getMask(b, d, h - i);
|
|
k && (j = !j), this.modules[d][h - i] = j, e--, -1 == e && (g++, e = 7)
|
|
}
|
|
if (d += c, 0 > d || this.moduleCount <= d) {
|
|
d -= c, c = -c;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}, b.PAD0 = 236, b.PAD1 = 17, b.createData = function (a, c, d) {
|
|
for (var e = j.getRSBlocks(a, c), g = new k, h = 0; h < d.length; h++) {
|
|
var i = d[h];
|
|
g.put(i.mode, 4), g.put(i.getLength(), f.getLengthInBits(i.mode, a)), i.write(g)
|
|
}
|
|
for (var l = 0, h = 0; h < e.length; h++) l += e[h].dataCount;
|
|
if (g.getLengthInBits() > 8 * l) throw new Error("code length overflow. (" + g.getLengthInBits() + ">" + 8 * l + ")");
|
|
for (g.getLengthInBits() + 4 <= 8 * l && g.put(0, 4); 0 != g.getLengthInBits() % 8;) g.putBit(!1);
|
|
for (; ;) {
|
|
if (g.getLengthInBits() >= 8 * l) break;
|
|
if (g.put(b.PAD0, 8), g.getLengthInBits() >= 8 * l) break;
|
|
g.put(b.PAD1, 8)
|
|
}
|
|
return b.createBytes(g, e)
|
|
}, b.createBytes = function (a, b) {
|
|
for (var c = 0, d = 0, e = 0, g = new Array(b.length), h = new Array(b.length), j = 0; j < b.length; j++) {
|
|
var k = b[j].dataCount, l = b[j].totalCount - k;
|
|
d = Math.max(d, k), e = Math.max(e, l), g[j] = new Array(k);
|
|
for (var m = 0; m < g[j].length; m++) g[j][m] = 255 & a.buffer[m + c];
|
|
c += k;
|
|
var n = f.getErrorCorrectPolynomial(l), o = new i(g[j], n.getLength() - 1), p = o.mod(n);
|
|
h[j] = new Array(n.getLength() - 1);
|
|
for (var m = 0; m < h[j].length; m++) {
|
|
var q = m + p.getLength() - h[j].length;
|
|
h[j][m] = q >= 0 ? p.get(q) : 0
|
|
}
|
|
}
|
|
for (var r = 0, m = 0; m < b.length; m++) r += b[m].totalCount;
|
|
for (var s = new Array(r), t = 0, m = 0; d > m; m++) for (var j = 0; j < b.length; j++) m < g[j].length && (s[t++] = g[j][m]);
|
|
for (var m = 0; e > m; m++) for (var j = 0; j < b.length; j++) m < h[j].length && (s[t++] = h[j][m]);
|
|
return s
|
|
};
|
|
for (var c = {MODE_NUMBER: 1, MODE_ALPHA_NUM: 2, MODE_8BIT_BYTE: 4, MODE_KANJI: 8}, d = {
|
|
L: 1,
|
|
M: 0,
|
|
Q: 3,
|
|
H: 2
|
|
}, e = {
|
|
PATTERN000: 0,
|
|
PATTERN001: 1,
|
|
PATTERN010: 2,
|
|
PATTERN011: 3,
|
|
PATTERN100: 4,
|
|
PATTERN101: 5,
|
|
PATTERN110: 6,
|
|
PATTERN111: 7
|
|
}, f = {
|
|
PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]],
|
|
G15: 1335,
|
|
G18: 7973,
|
|
G15_MASK: 21522,
|
|
getBCHTypeInfo: function (a) {
|
|
for (var b = a << 10; f.getBCHDigit(b) - f.getBCHDigit(f.G15) >= 0;) b ^= f.G15 << f.getBCHDigit(b) - f.getBCHDigit(f.G15);
|
|
return (a << 10 | b) ^ f.G15_MASK
|
|
},
|
|
getBCHTypeNumber: function (a) {
|
|
for (var b = a << 12; f.getBCHDigit(b) - f.getBCHDigit(f.G18) >= 0;) b ^= f.G18 << f.getBCHDigit(b) - f.getBCHDigit(f.G18);
|
|
return a << 12 | b
|
|
},
|
|
getBCHDigit: function (a) {
|
|
for (var b = 0; 0 != a;) b++, a >>>= 1;
|
|
return b
|
|
},
|
|
getPatternPosition: function (a) {
|
|
return f.PATTERN_POSITION_TABLE[a - 1]
|
|
},
|
|
getMask: function (a, b, c) {
|
|
switch (a) {
|
|
case e.PATTERN000:
|
|
return 0 == (b + c) % 2;
|
|
case e.PATTERN001:
|
|
return 0 == b % 2;
|
|
case e.PATTERN010:
|
|
return 0 == c % 3;
|
|
case e.PATTERN011:
|
|
return 0 == (b + c) % 3;
|
|
case e.PATTERN100:
|
|
return 0 == (Math.floor(b / 2) + Math.floor(c / 3)) % 2;
|
|
case e.PATTERN101:
|
|
return 0 == b * c % 2 + b * c % 3;
|
|
case e.PATTERN110:
|
|
return 0 == (b * c % 2 + b * c % 3) % 2;
|
|
case e.PATTERN111:
|
|
return 0 == (b * c % 3 + (b + c) % 2) % 2;
|
|
default:
|
|
throw new Error("bad maskPattern:" + a)
|
|
}
|
|
},
|
|
getErrorCorrectPolynomial: function (a) {
|
|
for (var b = new i([1], 0), c = 0; a > c; c++) b = b.multiply(new i([1, g.gexp(c)], 0));
|
|
return b
|
|
},
|
|
getLengthInBits: function (a, b) {
|
|
if (b >= 1 && 10 > b) switch (a) {
|
|
case c.MODE_NUMBER:
|
|
return 10;
|
|
case c.MODE_ALPHA_NUM:
|
|
return 9;
|
|
case c.MODE_8BIT_BYTE:
|
|
return 8;
|
|
case c.MODE_KANJI:
|
|
return 8;
|
|
default:
|
|
throw new Error("mode:" + a)
|
|
} else if (27 > b) switch (a) {
|
|
case c.MODE_NUMBER:
|
|
return 12;
|
|
case c.MODE_ALPHA_NUM:
|
|
return 11;
|
|
case c.MODE_8BIT_BYTE:
|
|
return 16;
|
|
case c.MODE_KANJI:
|
|
return 10;
|
|
default:
|
|
throw new Error("mode:" + a)
|
|
} else {
|
|
if (!(41 > b)) throw new Error("type:" + b);
|
|
switch (a) {
|
|
case c.MODE_NUMBER:
|
|
return 14;
|
|
case c.MODE_ALPHA_NUM:
|
|
return 13;
|
|
case c.MODE_8BIT_BYTE:
|
|
return 16;
|
|
case c.MODE_KANJI:
|
|
return 12;
|
|
default:
|
|
throw new Error("mode:" + a)
|
|
}
|
|
}
|
|
},
|
|
getLostPoint: function (a) {
|
|
for (var b = a.getModuleCount(), c = 0, d = 0; b > d; d++) for (var e = 0; b > e; e++) {
|
|
for (var f = 0, g = a.isDark(d, e), h = -1; 1 >= h; h++) if (!(0 > d + h || d + h >= b)) for (var i = -1; 1 >= i; i++) 0 > e + i || e + i >= b || (0 != h || 0 != i) && g == a.isDark(d + h, e + i) && f++;
|
|
f > 5 && (c += 3 + f - 5)
|
|
}
|
|
for (var d = 0; b - 1 > d; d++) for (var e = 0; b - 1 > e; e++) {
|
|
var j = 0;
|
|
a.isDark(d, e) && j++, a.isDark(d + 1, e) && j++, a.isDark(d, e + 1) && j++, a.isDark(d + 1, e + 1) && j++, (0 == j || 4 == j) && (c += 3)
|
|
}
|
|
for (var d = 0; b > d; d++) for (var e = 0; b - 6 > e; e++) a.isDark(d, e) && !a.isDark(d, e + 1) && a.isDark(d, e + 2) && a.isDark(d, e + 3) && a.isDark(d, e + 4) && !a.isDark(d, e + 5) && a.isDark(d, e + 6) && (c += 40);
|
|
for (var e = 0; b > e; e++) for (var d = 0; b - 6 > d; d++) a.isDark(d, e) && !a.isDark(d + 1, e) && a.isDark(d + 2, e) && a.isDark(d + 3, e) && a.isDark(d + 4, e) && !a.isDark(d + 5, e) && a.isDark(d + 6, e) && (c += 40);
|
|
for (var k = 0, e = 0; b > e; e++) for (var d = 0; b > d; d++) a.isDark(d, e) && k++;
|
|
var l = Math.abs(100 * k / b / b - 50) / 5;
|
|
return c += 10 * l
|
|
}
|
|
}, g = {
|
|
glog: function (a) {
|
|
if (1 > a) throw new Error("glog(" + a + ")");
|
|
return g.LOG_TABLE[a]
|
|
}, gexp: function (a) {
|
|
for (; 0 > a;) a += 255;
|
|
for (; a >= 256;) a -= 255;
|
|
return g.EXP_TABLE[a]
|
|
}, EXP_TABLE: new Array(256), LOG_TABLE: new Array(256)
|
|
}, h = 0; 8 > h; h++) g.EXP_TABLE[h] = 1 << h;
|
|
for (var h = 8; 256 > h; h++) g.EXP_TABLE[h] = g.EXP_TABLE[h - 4] ^ g.EXP_TABLE[h - 5] ^ g.EXP_TABLE[h - 6] ^ g.EXP_TABLE[h - 8];
|
|
for (var h = 0; 255 > h; h++) g.LOG_TABLE[g.EXP_TABLE[h]] = h;
|
|
i.prototype = {
|
|
get: function (a) {
|
|
return this.num[a]
|
|
}, getLength: function () {
|
|
return this.num.length
|
|
}, multiply: function (a) {
|
|
for (var b = new Array(this.getLength() + a.getLength() - 1), c = 0; c < this.getLength(); c++) for (var d = 0; d < a.getLength(); d++) b[c + d] ^= g.gexp(g.glog(this.get(c)) + g.glog(a.get(d)));
|
|
return new i(b, 0)
|
|
}, mod: function (a) {
|
|
if (this.getLength() - a.getLength() < 0) return this;
|
|
for (var b = g.glog(this.get(0)) - g.glog(a.get(0)), c = new Array(this.getLength()), d = 0; d < this.getLength(); d++) c[d] = this.get(d);
|
|
for (var d = 0; d < a.getLength(); d++) c[d] ^= g.gexp(g.glog(a.get(d)) + b);
|
|
return new i(c, 0).mod(a)
|
|
}
|
|
}, j.RS_BLOCK_TABLE = [[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], [1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], [1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], [1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], [1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], [2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], [2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], [2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], [2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], [2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], [4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], [2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], [4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], [3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], [5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], [5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], [1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], [5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], [3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], [3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], [4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], [2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], [4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], [6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], [8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], [10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], [8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], [3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], [7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], [5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], [13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], [17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], [17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], [13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], [12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], [6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], [17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], [4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], [20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], [19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]], j.getRSBlocks = function (a, b) {
|
|
var c = j.getRsBlockTable(a, b);
|
|
if (void 0 == c) throw new Error("bad rs block @ typeNumber:" + a + "/errorCorrectLevel:" + b);
|
|
for (var d = c.length / 3, e = [], f = 0; d > f; f++) for (var g = c[3 * f + 0], h = c[3 * f + 1], i = c[3 * f + 2], k = 0; g > k; k++) e.push(new j(h, i));
|
|
return e
|
|
}, j.getRsBlockTable = function (a, b) {
|
|
switch (b) {
|
|
case d.L:
|
|
return j.RS_BLOCK_TABLE[4 * (a - 1) + 0];
|
|
case d.M:
|
|
return j.RS_BLOCK_TABLE[4 * (a - 1) + 1];
|
|
case d.Q:
|
|
return j.RS_BLOCK_TABLE[4 * (a - 1) + 2];
|
|
case d.H:
|
|
return j.RS_BLOCK_TABLE[4 * (a - 1) + 3];
|
|
default:
|
|
return void 0
|
|
}
|
|
}, k.prototype = {
|
|
get: function (a) {
|
|
var b = Math.floor(a / 8);
|
|
return 1 == (1 & this.buffer[b] >>> 7 - a % 8)
|
|
}, put: function (a, b) {
|
|
for (var c = 0; b > c; c++) this.putBit(1 == (1 & a >>> b - c - 1))
|
|
}, getLengthInBits: function () {
|
|
return this.length
|
|
}, putBit: function (a) {
|
|
var b = Math.floor(this.length / 8);
|
|
this.buffer.length <= b && this.buffer.push(0), a && (this.buffer[b] |= 128 >>> this.length % 8), this.length++
|
|
}
|
|
};
|
|
var l = [[17, 14, 11, 7], [32, 26, 20, 14], [53, 42, 32, 24], [78, 62, 46, 34], [106, 84, 60, 44], [134, 106, 74, 58], [154, 122, 86, 64], [192, 152, 108, 84], [230, 180, 130, 98], [271, 213, 151, 119], [321, 251, 177, 137], [367, 287, 203, 155], [425, 331, 241, 177], [458, 362, 258, 194], [520, 412, 292, 220], [586, 450, 322, 250], [644, 504, 364, 280], [718, 560, 394, 310], [792, 624, 442, 338], [858, 666, 482, 382], [929, 711, 509, 403], [1003, 779, 565, 439], [1091, 857, 611, 461], [1171, 911, 661, 511], [1273, 997, 715, 535], [1367, 1059, 751, 593], [1465, 1125, 805, 625], [1528, 1190, 868, 658], [1628, 1264, 908, 698], [1732, 1370, 982, 742], [1840, 1452, 1030, 790], [1952, 1538, 1112, 842], [2068, 1628, 1168, 898], [2188, 1722, 1228, 958], [2303, 1809, 1283, 983], [2431, 1911, 1351, 1051], [2563, 1989, 1423, 1093], [2699, 2099, 1499, 1139], [2809, 2213, 1579, 1219], [2953, 2331, 1663, 1273]],
|
|
o = function () {
|
|
var a = function (a, b) {
|
|
this._el = a, this._htOption = b
|
|
};
|
|
return a.prototype.draw = function (a) {
|
|
function g(a, b) {
|
|
var c = document.createElementNS("http://www.w3.org/2000/svg", a);
|
|
for (var d in b) b.hasOwnProperty(d) && c.setAttribute(d, b[d]);
|
|
return c
|
|
}
|
|
|
|
var b = this._htOption, c = this._el, d = a.getModuleCount();
|
|
Math.floor(b.width / d), Math.floor(b.height / d), this.clear();
|
|
var h = g("svg", {
|
|
viewBox: "0 0 " + String(d) + " " + String(d),
|
|
width: "100%",
|
|
height: "100%",
|
|
fill: b.colorLight
|
|
});
|
|
h.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"), c.appendChild(h), h.appendChild(g("rect", {
|
|
fill: b.colorDark,
|
|
width: "1",
|
|
height: "1",
|
|
id: "template"
|
|
}));
|
|
for (var i = 0; d > i; i++) for (var j = 0; d > j; j++) if (a.isDark(i, j)) {
|
|
var k = g("use", {x: String(i), y: String(j)});
|
|
k.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template"), h.appendChild(k)
|
|
}
|
|
}, a.prototype.clear = function () {
|
|
for (; this._el.hasChildNodes();) this._el.removeChild(this._el.lastChild)
|
|
}, a
|
|
}(), p = "svg" === document.documentElement.tagName.toLowerCase(), q = p ? o : m() ? function () {
|
|
function a() {
|
|
this._elImage.src = this._elCanvas.toDataURL("image/png"), this._elImage.style.display = "block", this._elCanvas.style.display = "none"
|
|
}
|
|
|
|
function d(a, b) {
|
|
var c = this;
|
|
if (c._fFail = b, c._fSuccess = a, null === c._bSupportDataURI) {
|
|
var d = document.createElement("img"), e = function () {
|
|
c._bSupportDataURI = !1, c._fFail && _fFail.call(c)
|
|
}, f = function () {
|
|
c._bSupportDataURI = !0, c._fSuccess && c._fSuccess.call(c)
|
|
};
|
|
return d.onabort = e, d.onerror = e, d.onload = f, d.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", void 0
|
|
}
|
|
c._bSupportDataURI === !0 && c._fSuccess ? c._fSuccess.call(c) : c._bSupportDataURI === !1 && c._fFail && c._fFail.call(c)
|
|
}
|
|
|
|
if (this._android && this._android <= 2.1) {
|
|
var b = 1 / window.devicePixelRatio, c = CanvasRenderingContext2D.prototype.drawImage;
|
|
CanvasRenderingContext2D.prototype.drawImage = function (a, d, e, f, g, h, i, j) {
|
|
if ("nodeName" in a && /img/i.test(a.nodeName)) for (var l = arguments.length - 1; l >= 1; l--) arguments[l] = arguments[l] * b; else "undefined" == typeof j && (arguments[1] *= b, arguments[2] *= b, arguments[3] *= b, arguments[4] *= b);
|
|
c.apply(this, arguments)
|
|
}
|
|
}
|
|
var e = function (a, b) {
|
|
this._bIsPainted = !1, this._android = n(), this._htOption = b, this._elCanvas = document.createElement("canvas"), this._elCanvas.width = b.width, this._elCanvas.height = b.height, a.appendChild(this._elCanvas), this._el = a, this._oContext = this._elCanvas.getContext("2d"), this._bIsPainted = !1, this._elImage = document.createElement("img"), this._elImage.style.display = "none", this._el.appendChild(this._elImage), this._bSupportDataURI = null
|
|
};
|
|
return e.prototype.draw = function (a) {
|
|
var b = this._elImage, c = this._oContext, d = this._htOption, e = a.getModuleCount(), f = d.width / e,
|
|
g = d.height / e, h = Math.round(f), i = Math.round(g);
|
|
b.style.display = "none", this.clear();
|
|
for (var j = 0; e > j; j++) for (var k = 0; e > k; k++) {
|
|
var l = a.isDark(j, k), m = k * f, n = j * g;
|
|
c.strokeStyle = l ? d.colorDark : d.colorLight, c.lineWidth = 1, c.fillStyle = l ? d.colorDark : d.colorLight, c.fillRect(m, n, f, g), c.strokeRect(Math.floor(m) + .5, Math.floor(n) + .5, h, i), c.strokeRect(Math.ceil(m) - .5, Math.ceil(n) - .5, h, i)
|
|
}
|
|
this._bIsPainted = !0
|
|
}, e.prototype.makeImage = function () {
|
|
this._bIsPainted && d.call(this, a)
|
|
}, e.prototype.isPainted = function () {
|
|
return this._bIsPainted
|
|
}, e.prototype.clear = function () {
|
|
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height), this._bIsPainted = !1
|
|
}, e.prototype.round = function (a) {
|
|
return a ? Math.floor(1e3 * a) / 1e3 : a
|
|
}, e
|
|
}() : function () {
|
|
var a = function (a, b) {
|
|
this._el = a, this._htOption = b
|
|
};
|
|
return a.prototype.draw = function (a) {
|
|
for (var b = this._htOption, c = this._el, d = a.getModuleCount(), e = Math.floor(b.width / d), f = Math.floor(b.height / d), g = ['<table style="border:0;border-collapse:collapse;">'], h = 0; d > h; h++) {
|
|
g.push("<tr>");
|
|
for (var i = 0; d > i; i++) g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + e + "px;height:" + f + "px;background-color:" + (a.isDark(h, i) ? b.colorDark : b.colorLight) + ';"></td>');
|
|
g.push("</tr>")
|
|
}
|
|
g.push("</table>"), c.innerHTML = g.join("");
|
|
var j = c.childNodes[0], k = (b.width - j.offsetWidth) / 2, l = (b.height - j.offsetHeight) / 2;
|
|
k > 0 && l > 0 && (j.style.margin = l + "px " + k + "px")
|
|
}, a.prototype.clear = function () {
|
|
this._el.innerHTML = ""
|
|
}, a
|
|
}();
|
|
QRCode = function (a, b) {
|
|
if (this._htOption = {
|
|
width: 256,
|
|
height: 256,
|
|
typeNumber: 4,
|
|
colorDark: "#000000",
|
|
colorLight: "#ffffff",
|
|
correctLevel: d.H
|
|
}, "string" == typeof b && (b = {text: b}), b) for (var c in b) this._htOption[c] = b[c];
|
|
"string" == typeof a && (a = document.getElementById(a)), this._android = n(), this._el = a, this._oQRCode = null, this._oDrawing = new q(this._el, this._htOption), this._htOption.text && this.makeCode(this._htOption.text)
|
|
}, QRCode.prototype.makeCode = function (a) {
|
|
this._oQRCode = new b(r(a, this._htOption.correctLevel), this._htOption.correctLevel), this._oQRCode.addData(a), this._oQRCode.make(), this._el.title = a, this._oDrawing.draw(this._oQRCode), this.makeImage()
|
|
}, QRCode.prototype.makeImage = function () {
|
|
"function" == typeof this._oDrawing.makeImage && (!this._android || this._android >= 3) && this._oDrawing.makeImage()
|
|
}, QRCode.prototype.clear = function () {
|
|
this._oDrawing.clear()
|
|
}, QRCode.CorrectLevel = d
|
|
}();
|
|
/*
|
|
Copyright 2012 Igor Vaynberg
|
|
|
|
Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013
|
|
|
|
This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
|
|
General Public License version 2 (the "GPL License"). You may choose either license to govern your
|
|
use of this software only upon the condition that you accept all of the terms of either the Apache
|
|
License or the GPL License.
|
|
|
|
You may obtain a copy of the Apache License and the GPL License at:
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
http://www.gnu.org/licenses/gpl-2.0.html
|
|
|
|
Unless required by applicable law or agreed to in writing, software distributed under the
|
|
Apache License or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
|
|
the specific language governing permissions and limitations under the Apache License and the GPL License.
|
|
*/
|
|
(function ($) {
|
|
if (typeof $.fn.each2 == "undefined") {
|
|
$.fn.extend({
|
|
/*
|
|
* 4-10 times faster .each replacement
|
|
* use it carefully, as it overrides jQuery context of element on each iteration
|
|
*/
|
|
each2: function (c) {
|
|
var j = $([0]), i = -1, l = this.length;
|
|
while (
|
|
++i < l
|
|
&& (j.context = j[0] = this[i])
|
|
&& c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
|
|
) ;
|
|
return this;
|
|
}
|
|
});
|
|
}
|
|
})(jQuery);
|
|
|
|
(function ($, undefined) {
|
|
"use strict";
|
|
/*global document, window, jQuery, console */
|
|
|
|
if (window.Select2 !== undefined) {
|
|
return;
|
|
}
|
|
|
|
var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
|
|
lastMousePosition = {x: 0, y: 0}, $document, scrollBarDimensions,
|
|
|
|
KEY = {
|
|
TAB: 9,
|
|
ENTER: 13,
|
|
ESC: 27,
|
|
SPACE: 32,
|
|
LEFT: 37,
|
|
UP: 38,
|
|
RIGHT: 39,
|
|
DOWN: 40,
|
|
SHIFT: 16,
|
|
CTRL: 17,
|
|
ALT: 18,
|
|
PAGE_UP: 33,
|
|
PAGE_DOWN: 34,
|
|
HOME: 36,
|
|
END: 35,
|
|
BACKSPACE: 8,
|
|
DELETE: 46,
|
|
isArrow: function (k) {
|
|
k = k.which ? k.which : k;
|
|
switch (k) {
|
|
case KEY.LEFT:
|
|
case KEY.RIGHT:
|
|
case KEY.UP:
|
|
case KEY.DOWN:
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
isControl: function (e) {
|
|
var k = e.which;
|
|
switch (k) {
|
|
case KEY.SHIFT:
|
|
case KEY.CTRL:
|
|
case KEY.ALT:
|
|
return true;
|
|
}
|
|
|
|
if (e.metaKey) return true;
|
|
|
|
return false;
|
|
},
|
|
isFunctionKey: function (k) {
|
|
k = k.which ? k.which : k;
|
|
return k >= 112 && k <= 123;
|
|
}
|
|
},
|
|
MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>";
|
|
|
|
$document = $(document);
|
|
|
|
nextUid = (function () {
|
|
var counter = 1;
|
|
return function () {
|
|
return counter++;
|
|
};
|
|
}());
|
|
|
|
function indexOf(value, array) {
|
|
var i = 0, l = array.length;
|
|
for (; i < l; i = i + 1) {
|
|
if (equal(value, array[i])) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
function measureScrollbar() {
|
|
var $template = $(MEASURE_SCROLLBAR_TEMPLATE);
|
|
$template.appendTo('body');
|
|
|
|
var dim = {
|
|
width: $template.width() - $template[0].clientWidth,
|
|
height: $template.height() - $template[0].clientHeight
|
|
};
|
|
$template.remove();
|
|
|
|
return dim;
|
|
}
|
|
|
|
/**
|
|
* Compares equality of a and b
|
|
* @param a
|
|
* @param b
|
|
*/
|
|
function equal(a, b) {
|
|
if (a === b) return true;
|
|
if (a === undefined || b === undefined) return false;
|
|
if (a === null || b === null) return false;
|
|
// Check whether 'a' or 'b' is a string (primitive or object).
|
|
// The concatenation of an empty string (+'') converts its argument to a string's primitive.
|
|
if (a.constructor === String) return a + '' === b + ''; // a+'' - in case 'a' is a String object
|
|
if (b.constructor === String) return b + '' === a + ''; // b+'' - in case 'b' is a String object
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
|
|
* strings
|
|
* @param string
|
|
* @param separator
|
|
*/
|
|
function splitVal(string, separator) {
|
|
var val, i, l;
|
|
if (string === null || string.length < 1) return [];
|
|
val = string.split(separator);
|
|
for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
|
|
return val;
|
|
}
|
|
|
|
function getSideBorderPadding(element) {
|
|
return element.outerWidth(false) - element.width();
|
|
}
|
|
|
|
function installKeyUpChangeEvent(element) {
|
|
var key = "keyup-change-value";
|
|
element.on("keydown", function () {
|
|
if ($.data(element, key) === undefined) {
|
|
$.data(element, key, element.val());
|
|
}
|
|
});
|
|
element.on("keyup", function () {
|
|
var val = $.data(element, key);
|
|
if (val !== undefined && element.val() !== val) {
|
|
$.removeData(element, key);
|
|
element.trigger("keyup-change");
|
|
}
|
|
});
|
|
}
|
|
|
|
$document.on("mousemove", function (e) {
|
|
lastMousePosition.x = e.pageX;
|
|
lastMousePosition.y = e.pageY;
|
|
});
|
|
|
|
/**
|
|
* filters mouse events so an event is fired only if the mouse moved.
|
|
*
|
|
* filters out mouse events that occur when mouse is stationary but
|
|
* the elements under the pointer are scrolled.
|
|
*/
|
|
function installFilteredMouseMove(element) {
|
|
element.on("mousemove", function (e) {
|
|
var lastpos = lastMousePosition;
|
|
if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
|
|
$(e.target).trigger("mousemove-filtered", e);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
|
|
* within the last quietMillis milliseconds.
|
|
*
|
|
* @param quietMillis number of milliseconds to wait before invoking fn
|
|
* @param fn function to be debounced
|
|
* @param ctx object to be used as this reference within fn
|
|
* @return debounced version of fn
|
|
*/
|
|
function debounce(quietMillis, fn, ctx) {
|
|
ctx = ctx || undefined;
|
|
var timeout;
|
|
return function () {
|
|
var args = arguments;
|
|
window.clearTimeout(timeout);
|
|
timeout = window.setTimeout(function () {
|
|
fn.apply(ctx, args);
|
|
}, quietMillis);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A simple implementation of a thunk
|
|
* @param formula function used to lazily initialize the thunk
|
|
* @return {Function}
|
|
*/
|
|
function thunk(formula) {
|
|
var evaluated = false,
|
|
value;
|
|
return function () {
|
|
if (evaluated === false) {
|
|
value = formula();
|
|
evaluated = true;
|
|
}
|
|
return value;
|
|
};
|
|
};
|
|
|
|
function installDebouncedScroll(threshold, element) {
|
|
var notify = debounce(threshold, function (e) {
|
|
element.trigger("scroll-debounced", e);
|
|
});
|
|
element.on("scroll", function (e) {
|
|
if (indexOf(e.target, element.get()) >= 0) notify(e);
|
|
});
|
|
}
|
|
|
|
function focus($el) {
|
|
if ($el[0] === document.activeElement) return;
|
|
|
|
/* set the focus in a 0 timeout - that way the focus is set after the processing
|
|
of the current event has finished - which seems like the only reliable way
|
|
to set focus */
|
|
window.setTimeout(function () {
|
|
var el = $el[0], pos = $el.val().length, range;
|
|
|
|
$el.focus();
|
|
|
|
/* make sure el received focus so we do not error out when trying to manipulate the caret.
|
|
sometimes modals or others listeners may steal it after its set */
|
|
if ($el.is(":visible") && el === document.activeElement) {
|
|
|
|
/* after the focus is set move the caret to the end, necessary when we val()
|
|
just before setting focus */
|
|
if (el.setSelectionRange) {
|
|
el.setSelectionRange(pos, pos);
|
|
}
|
|
else if (el.createTextRange) {
|
|
range = el.createTextRange();
|
|
range.collapse(false);
|
|
range.select();
|
|
}
|
|
}
|
|
}, 0);
|
|
}
|
|
|
|
function getCursorInfo(el) {
|
|
el = $(el)[0];
|
|
var offset = 0;
|
|
var length = 0;
|
|
if ('selectionStart' in el) {
|
|
offset = el.selectionStart;
|
|
length = el.selectionEnd - offset;
|
|
} else if ('selection' in document) {
|
|
el.focus();
|
|
var sel = document.selection.createRange();
|
|
length = document.selection.createRange().text.length;
|
|
sel.moveStart('character', -el.value.length);
|
|
offset = sel.text.length - length;
|
|
}
|
|
return {offset: offset, length: length};
|
|
}
|
|
|
|
function killEvent(event) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
}
|
|
|
|
function killEventImmediately(event) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
|
|
function measureTextWidth(e) {
|
|
if (!sizer) {
|
|
var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
|
|
sizer = $(document.createElement("div")).css({
|
|
position: "absolute",
|
|
left: "-10000px",
|
|
top: "-10000px",
|
|
display: "none",
|
|
fontSize: style.fontSize,
|
|
fontFamily: style.fontFamily,
|
|
fontStyle: style.fontStyle,
|
|
fontWeight: style.fontWeight,
|
|
letterSpacing: style.letterSpacing,
|
|
textTransform: style.textTransform,
|
|
whiteSpace: "nowrap"
|
|
});
|
|
sizer.attr("class", "select2-sizer");
|
|
$("body").append(sizer);
|
|
}
|
|
sizer.text(e.val());
|
|
return sizer.width();
|
|
}
|
|
|
|
function syncCssClasses(dest, src, adapter) {
|
|
var classes, replacements = [], adapted;
|
|
|
|
classes = dest.attr("class");
|
|
if (classes) {
|
|
classes = '' + classes; // for IE which returns object
|
|
$(classes.split(" ")).each2(function () {
|
|
if (this.indexOf("select2-") === 0) {
|
|
replacements.push(this);
|
|
}
|
|
});
|
|
}
|
|
classes = src.attr("class");
|
|
if (classes) {
|
|
classes = '' + classes; // for IE which returns object
|
|
$(classes.split(" ")).each2(function () {
|
|
if (this.indexOf("select2-") !== 0) {
|
|
adapted = adapter(this);
|
|
if (adapted) {
|
|
replacements.push(this);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
dest.attr("class", replacements.join(" "));
|
|
}
|
|
|
|
|
|
function markMatch(text, term, markup, escapeMarkup) {
|
|
var match = text.toUpperCase().indexOf(term.toUpperCase()),
|
|
tl = term.length;
|
|
|
|
if (match < 0) {
|
|
markup.push(escapeMarkup(text));
|
|
return;
|
|
}
|
|
|
|
markup.push(escapeMarkup(text.substring(0, match)));
|
|
markup.push("<span class='select2-match'>");
|
|
markup.push(escapeMarkup(text.substring(match, match + tl)));
|
|
markup.push("</span>");
|
|
markup.push(escapeMarkup(text.substring(match + tl, text.length)));
|
|
}
|
|
|
|
function defaultEscapeMarkup(markup) {
|
|
var replace_map = {
|
|
'\\': '\',
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": ''',
|
|
"/": '/'
|
|
};
|
|
|
|
return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
|
|
return replace_map[match];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Produces an ajax-based query function
|
|
*
|
|
* @param options object containing configuration paramters
|
|
* @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
|
|
* @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
|
|
* @param options.url url for the data
|
|
* @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
|
|
* @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
|
|
* @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
|
|
* @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
|
|
* The expected format is an object containing the following keys:
|
|
* results array of objects that will be used as choices
|
|
* more (optional) boolean indicating whether there are more results available
|
|
* Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
|
|
*/
|
|
function ajax(options) {
|
|
var timeout, // current scheduled but not yet executed request
|
|
requestSequence = 0, // sequence used to drop out-of-order responses
|
|
handler = null,
|
|
quietMillis = options.quietMillis || 100,
|
|
ajaxUrl = options.url,
|
|
self = this;
|
|
|
|
return function (query) {
|
|
window.clearTimeout(timeout);
|
|
timeout = window.setTimeout(function () {
|
|
requestSequence += 1; // increment the sequence
|
|
var requestNumber = requestSequence, // this request's sequence number
|
|
data = options.data, // ajax data function
|
|
url = ajaxUrl, // ajax url string or function
|
|
transport = options.transport || $.fn.select2.ajaxDefaults.transport,
|
|
// deprecated - to be removed in 4.0 - use params instead
|
|
deprecated = {
|
|
type: options.type || 'GET', // set type of request (GET or POST)
|
|
cache: options.cache || false,
|
|
jsonpCallback: options.jsonpCallback || undefined,
|
|
dataType: options.dataType || "json"
|
|
},
|
|
params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
|
|
|
|
data = data ? data.call(self, query.term, query.page, query.context) : null;
|
|
url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
|
|
|
|
if (handler) {
|
|
handler.abort();
|
|
}
|
|
|
|
if (options.params) {
|
|
if ($.isFunction(options.params)) {
|
|
$.extend(params, options.params.call(self));
|
|
} else {
|
|
$.extend(params, options.params);
|
|
}
|
|
}
|
|
|
|
$.extend(params, {
|
|
url: url,
|
|
dataType: options.dataType,
|
|
data: data,
|
|
success: function (data) {
|
|
if (requestNumber < requestSequence) {
|
|
return;
|
|
}
|
|
// TODO - replace query.page with query so users have access to term, page, etc.
|
|
var results = options.results(data, query.page);
|
|
query.callback(results);
|
|
}
|
|
});
|
|
handler = transport.call(self, params);
|
|
}, quietMillis);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Produces a query function that works with a local array
|
|
*
|
|
* @param options object containing configuration parameters. The options parameter can either be an array or an
|
|
* object.
|
|
*
|
|
* If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
|
|
*
|
|
* If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
|
|
* an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
|
|
* key can either be a String in which case it is expected that each element in the 'data' array has a key with the
|
|
* value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
|
|
* the text.
|
|
*/
|
|
function local(options) {
|
|
var data = options, // data elements
|
|
dataText,
|
|
tmp,
|
|
text = function (item) {
|
|
return "" + item.text;
|
|
}; // function used to retrieve the text portion of a data item that is matched against the search
|
|
|
|
if ($.isArray(data)) {
|
|
tmp = data;
|
|
data = {results: tmp};
|
|
}
|
|
|
|
if ($.isFunction(data) === false) {
|
|
tmp = data;
|
|
data = function () {
|
|
return tmp;
|
|
};
|
|
}
|
|
|
|
var dataItem = data();
|
|
if (dataItem.text) {
|
|
text = dataItem.text;
|
|
// if text is not a function we assume it to be a key name
|
|
if (!$.isFunction(text)) {
|
|
dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
|
|
text = function (item) {
|
|
return item[dataText];
|
|
};
|
|
}
|
|
}
|
|
|
|
return function (query) {
|
|
var t = query.term, filtered = {results: []}, process;
|
|
if (t === "") {
|
|
query.callback(data());
|
|
return;
|
|
}
|
|
|
|
process = function (datum, collection) {
|
|
var group, attr;
|
|
datum = datum[0];
|
|
if (datum.children) {
|
|
group = {};
|
|
for (attr in datum) {
|
|
if (datum.hasOwnProperty(attr)) group[attr] = datum[attr];
|
|
}
|
|
group.children = [];
|
|
$(datum.children).each2(function (i, childDatum) {
|
|
process(childDatum, group.children);
|
|
});
|
|
if (group.children.length || query.matcher(t, text(group), datum)) {
|
|
collection.push(group);
|
|
}
|
|
} else {
|
|
if (query.matcher(t, text(datum), datum)) {
|
|
collection.push(datum);
|
|
}
|
|
}
|
|
};
|
|
|
|
$(data().results).each2(function (i, datum) {
|
|
process(datum, filtered.results);
|
|
});
|
|
query.callback(filtered);
|
|
};
|
|
}
|
|
|
|
// TODO javadoc
|
|
function tags(data) {
|
|
var isFunc = $.isFunction(data);
|
|
return function (query) {
|
|
var t = query.term, filtered = {results: []};
|
|
$(isFunc ? data() : data).each(function () {
|
|
var isObject = this.text !== undefined,
|
|
text = isObject ? this.text : this;
|
|
if (t === "" || query.matcher(t, text)) {
|
|
filtered.results.push(isObject ? this : {id: this, text: this});
|
|
}
|
|
});
|
|
query.callback(filtered);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Checks if the formatter function should be used.
|
|
*
|
|
* Throws an error if it is not a function. Returns true if it should be used,
|
|
* false if no formatting should be performed.
|
|
*
|
|
* @param formatter
|
|
*/
|
|
function checkFormatter(formatter, formatterName) {
|
|
if ($.isFunction(formatter)) return true;
|
|
if (!formatter) return false;
|
|
throw new Error(formatterName + " must be a function or a falsy value");
|
|
}
|
|
|
|
function evaluate(val) {
|
|
return $.isFunction(val) ? val() : val;
|
|
}
|
|
|
|
function countResults(results) {
|
|
var count = 0;
|
|
$.each(results, function (i, item) {
|
|
if (item.children) {
|
|
count += countResults(item.children);
|
|
} else {
|
|
count++;
|
|
}
|
|
});
|
|
return count;
|
|
}
|
|
|
|
/**
|
|
* Default tokenizer. This function uses breaks the input on substring match of any string from the
|
|
* opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
|
|
* two options have to be defined in order for the tokenizer to work.
|
|
*
|
|
* @param input text user has typed so far or pasted into the search field
|
|
* @param selection currently selected choices
|
|
* @param selectCallback function(choice) callback tho add the choice to selection
|
|
* @param opts select2's opts
|
|
* @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
|
|
*/
|
|
function defaultTokenizer(input, selection, selectCallback, opts) {
|
|
var original = input, // store the original so we can compare and know if we need to tell the search to update its text
|
|
dupe = false, // check for whether a token we extracted represents a duplicate selected choice
|
|
token, // token
|
|
index, // position at which the separator was found
|
|
i, l, // looping variables
|
|
separator; // the matched separator
|
|
|
|
if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
|
|
|
|
while (true) {
|
|
index = -1;
|
|
|
|
for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
|
|
separator = opts.tokenSeparators[i];
|
|
index = input.indexOf(separator);
|
|
if (index >= 0) break;
|
|
}
|
|
|
|
if (index < 0) break; // did not find any token separator in the input string, bail
|
|
|
|
token = input.substring(0, index);
|
|
input = input.substring(index + separator.length);
|
|
|
|
if (token.length > 0) {
|
|
token = opts.createSearchChoice.call(this, token, selection);
|
|
if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
|
|
dupe = false;
|
|
for (i = 0, l = selection.length; i < l; i++) {
|
|
if (equal(opts.id(token), opts.id(selection[i]))) {
|
|
dupe = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!dupe) selectCallback(token);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (original !== input) return input;
|
|
}
|
|
|
|
/**
|
|
* Creates a new class
|
|
*
|
|
* @param superClass
|
|
* @param methods
|
|
*/
|
|
function clazz(SuperClass, methods) {
|
|
var constructor = function () {
|
|
};
|
|
constructor.prototype = new SuperClass;
|
|
constructor.prototype.constructor = constructor;
|
|
constructor.prototype.parent = SuperClass.prototype;
|
|
constructor.prototype = $.extend(constructor.prototype, methods);
|
|
return constructor;
|
|
}
|
|
|
|
AbstractSelect2 = clazz(Object, {
|
|
|
|
// abstract
|
|
bind: function (func) {
|
|
var self = this;
|
|
return function () {
|
|
func.apply(self, arguments);
|
|
};
|
|
},
|
|
|
|
// abstract
|
|
init: function (opts) {
|
|
var results, search, resultsSelector = ".select2-results", disabled, readonly;
|
|
|
|
// prepare options
|
|
this.opts = opts = this.prepareOpts(opts);
|
|
|
|
this.id = opts.id;
|
|
|
|
// destroy if called on an existing component
|
|
if (opts.element.data("select2") !== undefined &&
|
|
opts.element.data("select2") !== null) {
|
|
opts.element.data("select2").destroy();
|
|
}
|
|
|
|
this.container = this.createContainer();
|
|
|
|
this.containerId = "s2id_" + (opts.element.attr("id") || "autogen" + nextUid());
|
|
this.containerSelector = "#" + this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
|
|
this.container.attr("id", this.containerId);
|
|
|
|
// cache the body so future lookups are cheap
|
|
this.body = thunk(function () {
|
|
return opts.element.closest("body");
|
|
});
|
|
|
|
syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
|
|
|
|
this.container.css(evaluate(opts.containerCss));
|
|
this.container.addClass(evaluate(opts.containerCssClass));
|
|
|
|
this.elementTabIndex = this.opts.element.attr("tabindex");
|
|
|
|
// swap container for the element
|
|
this.opts.element
|
|
.data("select2", this)
|
|
.attr("tabindex", "-1")
|
|
.before(this.container);
|
|
this.container.data("select2", this);
|
|
|
|
this.dropdown = this.container.find(".select2-drop");
|
|
this.dropdown.addClass(evaluate(opts.dropdownCssClass));
|
|
this.dropdown.data("select2", this);
|
|
|
|
this.results = results = this.container.find(resultsSelector);
|
|
this.search = search = this.container.find("input.select2-input");
|
|
|
|
this.resultsPage = 0;
|
|
this.context = null;
|
|
|
|
// initialize the container
|
|
this.initContainer();
|
|
|
|
installFilteredMouseMove(this.results);
|
|
this.dropdown.on("mousemove-filtered touchstart touchmove touchend", resultsSelector, this.bind(this.highlightUnderEvent));
|
|
|
|
installDebouncedScroll(80, this.results);
|
|
this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
|
|
|
|
// do not propagate change event from the search field out of the component
|
|
$(this.container).on("change", ".select2-input", function (e) {
|
|
e.stopPropagation();
|
|
});
|
|
$(this.dropdown).on("change", ".select2-input", function (e) {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
// if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
|
|
if ($.fn.mousewheel) {
|
|
results.mousewheel(function (e, delta, deltaX, deltaY) {
|
|
var top = results.scrollTop(), height;
|
|
if (deltaY > 0 && top - deltaY <= 0) {
|
|
results.scrollTop(0);
|
|
killEvent(e);
|
|
} else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
|
|
results.scrollTop(results.get(0).scrollHeight - results.height());
|
|
killEvent(e);
|
|
}
|
|
});
|
|
}
|
|
|
|
installKeyUpChangeEvent(search);
|
|
search.on("keyup-change input paste", this.bind(this.updateResults));
|
|
search.on("focus", function () {
|
|
search.addClass("select2-focused");
|
|
});
|
|
search.on("blur", function () {
|
|
search.removeClass("select2-focused");
|
|
});
|
|
|
|
this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
|
|
if ($(e.target).closest(".select2-result-selectable").length > 0) {
|
|
this.highlightUnderEvent(e);
|
|
this.selectHighlighted(e);
|
|
}
|
|
}));
|
|
|
|
// trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
|
|
// for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
|
|
// dom it will trigger the popup close, which is not what we want
|
|
this.dropdown.on("click mouseup mousedown", function (e) {
|
|
e.stopPropagation();
|
|
});
|
|
|
|
if ($.isFunction(this.opts.initSelection)) {
|
|
// initialize selection based on the current value of the source element
|
|
this.initSelection();
|
|
|
|
// if the user has provided a function that can set selection based on the value of the source element
|
|
// we monitor the change event on the element and trigger it, allowing for two way synchronization
|
|
this.monitorSource();
|
|
}
|
|
|
|
if (opts.maximumInputLength !== null) {
|
|
this.search.attr("maxlength", opts.maximumInputLength);
|
|
}
|
|
|
|
var disabled = opts.element.prop("disabled");
|
|
if (disabled === undefined) disabled = false;
|
|
this.enable(!disabled);
|
|
|
|
var readonly = opts.element.prop("readonly");
|
|
if (readonly === undefined) readonly = false;
|
|
this.readonly(readonly);
|
|
|
|
// Calculate size of scrollbar
|
|
scrollBarDimensions = scrollBarDimensions || measureScrollbar();
|
|
|
|
this.autofocus = opts.element.prop("autofocus")
|
|
opts.element.prop("autofocus", false);
|
|
if (this.autofocus) this.focus();
|
|
},
|
|
|
|
// abstract
|
|
destroy: function () {
|
|
var element = this.opts.element, select2 = element.data("select2");
|
|
|
|
if (this.propertyObserver) {
|
|
delete this.propertyObserver;
|
|
this.propertyObserver = null;
|
|
}
|
|
|
|
if (select2 !== undefined) {
|
|
select2.container.remove();
|
|
select2.dropdown.remove();
|
|
element
|
|
.removeClass("select2-offscreen")
|
|
.removeData("select2")
|
|
.off(".select2")
|
|
.prop("autofocus", this.autofocus || false);
|
|
if (this.elementTabIndex) {
|
|
element.attr({tabindex: this.elementTabIndex});
|
|
} else {
|
|
element.removeAttr("tabindex");
|
|
}
|
|
element.show();
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
optionToData: function (element) {
|
|
if (element.is("option")) {
|
|
return {
|
|
id: element.prop("value"),
|
|
text: element.text(),
|
|
element: element.get(),
|
|
css: element.attr("class"),
|
|
disabled: element.prop("disabled"),
|
|
locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
|
|
};
|
|
} else if (element.is("optgroup")) {
|
|
return {
|
|
text: element.attr("label"),
|
|
children: [],
|
|
element: element.get(),
|
|
css: element.attr("class")
|
|
};
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
prepareOpts: function (opts) {
|
|
var element, select, idKey, ajaxUrl, self = this;
|
|
|
|
element = opts.element;
|
|
|
|
if (element.get(0).tagName.toLowerCase() === "select") {
|
|
this.select = select = opts.element;
|
|
}
|
|
|
|
if (select) {
|
|
// these options are not allowed when attached to a select because they are picked up off the element itself
|
|
$.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
|
|
if (this in opts) {
|
|
throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
|
|
}
|
|
});
|
|
}
|
|
|
|
opts = $.extend({}, {
|
|
populateResults: function (container, results, query) {
|
|
var populate, data, result, children, id = this.opts.id;
|
|
|
|
populate = function (results, container, depth) {
|
|
|
|
var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
|
|
|
|
results = opts.sortResults(results, container, query);
|
|
|
|
for (i = 0, l = results.length; i < l; i = i + 1) {
|
|
|
|
result = results[i];
|
|
|
|
disabled = (result.disabled === true);
|
|
selectable = (!disabled) && (id(result) !== undefined);
|
|
|
|
compound = result.children && result.children.length > 0;
|
|
|
|
node = $("<li></li>");
|
|
node.addClass("select2-results-dept-" + depth);
|
|
node.addClass("select2-result");
|
|
node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
|
|
if (disabled) {
|
|
node.addClass("select2-disabled");
|
|
}
|
|
if (compound) {
|
|
node.addClass("select2-result-with-children");
|
|
}
|
|
node.addClass(self.opts.formatResultCssClass(result));
|
|
|
|
label = $(document.createElement("div"));
|
|
label.addClass("select2-result-label");
|
|
|
|
formatted = opts.formatResult(result, label, query, self.opts.escapeMarkup);
|
|
if (formatted !== undefined) {
|
|
label.html(formatted);
|
|
}
|
|
|
|
node.append(label);
|
|
|
|
if (compound) {
|
|
|
|
innerContainer = $("<ul></ul>");
|
|
innerContainer.addClass("select2-result-sub");
|
|
populate(result.children, innerContainer, depth + 1);
|
|
node.append(innerContainer);
|
|
}
|
|
|
|
node.data("select2-data", result);
|
|
container.append(node);
|
|
}
|
|
};
|
|
|
|
populate(results, container, 0);
|
|
}
|
|
}, $.fn.select2.defaults, opts);
|
|
|
|
if (typeof(opts.id) !== "function") {
|
|
idKey = opts.id;
|
|
opts.id = function (e) {
|
|
return e[idKey];
|
|
};
|
|
}
|
|
|
|
if ($.isArray(opts.element.data("select2Tags"))) {
|
|
if ("tags" in opts) {
|
|
throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
|
|
}
|
|
opts.tags = opts.element.data("select2Tags");
|
|
}
|
|
|
|
if (select) {
|
|
opts.query = this.bind(function (query) {
|
|
var data = {results: [], more: false},
|
|
term = query.term,
|
|
children, placeholderOption, process;
|
|
|
|
process = function (element, collection) {
|
|
var group;
|
|
if (element.is("option")) {
|
|
if (query.matcher(term, element.text(), element)) {
|
|
collection.push(self.optionToData(element));
|
|
}
|
|
} else if (element.is("optgroup")) {
|
|
group = self.optionToData(element);
|
|
element.children().each2(function (i, elm) {
|
|
process(elm, group.children);
|
|
});
|
|
if (group.children.length > 0) {
|
|
collection.push(group);
|
|
}
|
|
}
|
|
};
|
|
|
|
children = element.children();
|
|
|
|
// ignore the placeholder option if there is one
|
|
if (this.getPlaceholder() !== undefined && children.length > 0) {
|
|
placeholderOption = this.getPlaceholderOption();
|
|
if (placeholderOption) {
|
|
children = children.not(placeholderOption);
|
|
}
|
|
}
|
|
|
|
children.each2(function (i, elm) {
|
|
process(elm, data.results);
|
|
});
|
|
|
|
query.callback(data);
|
|
});
|
|
// this is needed because inside val() we construct choices from options and there id is hardcoded
|
|
opts.id = function (e) {
|
|
return e.id;
|
|
};
|
|
opts.formatResultCssClass = function (data) {
|
|
return data.css;
|
|
};
|
|
} else {
|
|
if (!("query" in opts)) {
|
|
|
|
if ("ajax" in opts) {
|
|
ajaxUrl = opts.element.data("ajax-url");
|
|
if (ajaxUrl && ajaxUrl.length > 0) {
|
|
opts.ajax.url = ajaxUrl;
|
|
}
|
|
opts.query = ajax.call(opts.element, opts.ajax);
|
|
} else if ("data" in opts) {
|
|
opts.query = local(opts.data);
|
|
} else if ("tags" in opts) {
|
|
opts.query = tags(opts.tags);
|
|
if (opts.createSearchChoice === undefined) {
|
|
opts.createSearchChoice = function (term) {
|
|
return {id: term, text: term};
|
|
};
|
|
}
|
|
if (opts.initSelection === undefined) {
|
|
opts.initSelection = function (element, callback) {
|
|
var data = [];
|
|
$(splitVal(element.val(), opts.separator)).each(function () {
|
|
var id = this, text = this, tags = opts.tags;
|
|
if ($.isFunction(tags)) tags = tags();
|
|
$(tags).each(function () {
|
|
if (equal(this.id, id)) {
|
|
text = this.text;
|
|
return false;
|
|
}
|
|
});
|
|
data.push({id: id, text: text});
|
|
});
|
|
|
|
callback(data);
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (typeof(opts.query) !== "function") {
|
|
throw "query function not defined for Select2 " + opts.element.attr("id");
|
|
}
|
|
|
|
return opts;
|
|
},
|
|
|
|
/**
|
|
* Monitor the original element for changes and update select2 accordingly
|
|
*/
|
|
// abstract
|
|
monitorSource: function () {
|
|
var el = this.opts.element, sync;
|
|
|
|
el.on("change.select2", this.bind(function (e) {
|
|
if (this.opts.element.data("select2-change-triggered") !== true) {
|
|
this.initSelection();
|
|
}
|
|
}));
|
|
|
|
sync = this.bind(function () {
|
|
|
|
var enabled, readonly, self = this;
|
|
|
|
// sync enabled state
|
|
var disabled = el.prop("disabled");
|
|
if (disabled === undefined) disabled = false;
|
|
this.enable(!disabled);
|
|
|
|
var readonly = el.prop("readonly");
|
|
if (readonly === undefined) readonly = false;
|
|
this.readonly(readonly);
|
|
|
|
syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
|
|
this.container.addClass(evaluate(this.opts.containerCssClass));
|
|
|
|
syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
|
|
this.dropdown.addClass(evaluate(this.opts.dropdownCssClass));
|
|
|
|
});
|
|
|
|
// mozilla and IE
|
|
el.on("propertychange.select2 DOMAttrModified.select2", sync);
|
|
|
|
|
|
// hold onto a reference of the callback to work around a chromium bug
|
|
if (this.mutationCallback === undefined) {
|
|
this.mutationCallback = function (mutations) {
|
|
mutations.forEach(sync);
|
|
}
|
|
}
|
|
|
|
// safari and chrome
|
|
if (typeof WebKitMutationObserver !== "undefined") {
|
|
if (this.propertyObserver) {
|
|
delete this.propertyObserver;
|
|
this.propertyObserver = null;
|
|
}
|
|
this.propertyObserver = new WebKitMutationObserver(this.mutationCallback);
|
|
this.propertyObserver.observe(el.get(0), {attributes: true, subtree: false});
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
triggerSelect: function (data) {
|
|
var evt = $.Event("select2-selecting", {val: this.id(data), object: data});
|
|
this.opts.element.trigger(evt);
|
|
return !evt.isDefaultPrevented();
|
|
},
|
|
|
|
/**
|
|
* Triggers the change event on the source element
|
|
*/
|
|
// abstract
|
|
triggerChange: function (details) {
|
|
|
|
details = details || {};
|
|
details = $.extend({}, details, {type: "change", val: this.val()});
|
|
// prevents recursive triggering
|
|
this.opts.element.data("select2-change-triggered", true);
|
|
this.opts.element.trigger(details);
|
|
this.opts.element.data("select2-change-triggered", false);
|
|
|
|
// some validation frameworks ignore the change event and listen instead to keyup, click for selects
|
|
// so here we trigger the click event manually
|
|
this.opts.element.click();
|
|
|
|
// ValidationEngine ignorea the change event and listens instead to blur
|
|
// so here we trigger the blur event manually if so desired
|
|
if (this.opts.blurOnChange)
|
|
this.opts.element.blur();
|
|
},
|
|
|
|
//abstract
|
|
isInterfaceEnabled: function () {
|
|
return this.enabledInterface === true;
|
|
},
|
|
|
|
// abstract
|
|
enableInterface: function () {
|
|
var enabled = this._enabled && !this._readonly,
|
|
disabled = !enabled;
|
|
|
|
if (enabled === this.enabledInterface) return false;
|
|
|
|
this.container.toggleClass("select2-container-disabled", disabled);
|
|
this.close();
|
|
this.enabledInterface = enabled;
|
|
|
|
return true;
|
|
},
|
|
|
|
// abstract
|
|
enable: function (enabled) {
|
|
if (enabled === undefined) enabled = true;
|
|
if (this._enabled === enabled) return false;
|
|
this._enabled = enabled;
|
|
|
|
this.opts.element.prop("disabled", !enabled);
|
|
this.enableInterface();
|
|
return true;
|
|
},
|
|
|
|
// abstract
|
|
readonly: function (enabled) {
|
|
if (enabled === undefined) enabled = false;
|
|
if (this._readonly === enabled) return false;
|
|
this._readonly = enabled;
|
|
|
|
this.opts.element.prop("readonly", enabled);
|
|
this.enableInterface();
|
|
return true;
|
|
},
|
|
|
|
// abstract
|
|
opened: function () {
|
|
return this.container.hasClass("select2-dropdown-open");
|
|
},
|
|
|
|
// abstract
|
|
positionDropdown: function () {
|
|
var $dropdown = this.dropdown,
|
|
offset = this.container.offset(),
|
|
height = this.container.outerHeight(false),
|
|
width = this.container.outerWidth(false),
|
|
dropHeight = $dropdown.outerHeight(false),
|
|
viewPortRight = $(window).scrollLeft() + $(window).width(),
|
|
viewportBottom = $(window).scrollTop() + $(window).height(),
|
|
dropTop = offset.top + height,
|
|
dropLeft = offset.left,
|
|
enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
|
|
enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(),
|
|
dropWidth = $dropdown.outerWidth(false),
|
|
enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
|
|
aboveNow = $dropdown.hasClass("select2-drop-above"),
|
|
bodyOffset,
|
|
above,
|
|
css,
|
|
resultsListNode;
|
|
|
|
if (this.opts.dropdownAutoWidth) {
|
|
resultsListNode = $('.select2-results', $dropdown)[0];
|
|
$dropdown.addClass('select2-drop-auto-width');
|
|
$dropdown.css('width', '');
|
|
// Add scrollbar width to dropdown if vertical scrollbar is present
|
|
dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
|
|
dropWidth > width ? width = dropWidth : dropWidth = width;
|
|
enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
|
|
}
|
|
else {
|
|
this.container.removeClass('select2-drop-auto-width');
|
|
}
|
|
|
|
//console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
|
|
//console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);
|
|
|
|
// fix positioning when body has an offset and is not position: static
|
|
if (this.body().css('position') !== 'static') {
|
|
bodyOffset = this.body().offset();
|
|
dropTop -= bodyOffset.top;
|
|
dropLeft -= bodyOffset.left;
|
|
}
|
|
|
|
// always prefer the current above/below alignment, unless there is not enough room
|
|
if (aboveNow) {
|
|
above = true;
|
|
if (!enoughRoomAbove && enoughRoomBelow) above = false;
|
|
} else {
|
|
above = false;
|
|
if (!enoughRoomBelow && enoughRoomAbove) above = true;
|
|
}
|
|
|
|
if (!enoughRoomOnRight) {
|
|
dropLeft = offset.left + width - dropWidth;
|
|
}
|
|
|
|
if (above) {
|
|
dropTop = offset.top - dropHeight;
|
|
this.container.addClass("select2-drop-above");
|
|
$dropdown.addClass("select2-drop-above");
|
|
}
|
|
else {
|
|
this.container.removeClass("select2-drop-above");
|
|
$dropdown.removeClass("select2-drop-above");
|
|
}
|
|
|
|
css = $.extend({
|
|
top: dropTop,
|
|
left: dropLeft,
|
|
width: width
|
|
}, evaluate(this.opts.dropdownCss));
|
|
|
|
$dropdown.css(css);
|
|
},
|
|
|
|
// abstract
|
|
shouldOpen: function () {
|
|
var event;
|
|
|
|
if (this.opened()) return false;
|
|
|
|
if (this._enabled === false || this._readonly === true) return false;
|
|
|
|
event = $.Event("select2-opening");
|
|
this.opts.element.trigger(event);
|
|
return !event.isDefaultPrevented();
|
|
},
|
|
|
|
// abstract
|
|
clearDropdownAlignmentPreference: function () {
|
|
// clear the classes used to figure out the preference of where the dropdown should be opened
|
|
this.container.removeClass("select2-drop-above");
|
|
this.dropdown.removeClass("select2-drop-above");
|
|
},
|
|
|
|
/**
|
|
* Opens the dropdown
|
|
*
|
|
* @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
|
|
* the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
|
|
*/
|
|
// abstract
|
|
open: function () {
|
|
|
|
if (!this.shouldOpen()) return false;
|
|
|
|
this.opening();
|
|
|
|
return true;
|
|
},
|
|
|
|
/**
|
|
* Performs the opening of the dropdown
|
|
*/
|
|
// abstract
|
|
opening: function () {
|
|
var cid = this.containerId,
|
|
scroll = "scroll." + cid,
|
|
resize = "resize." + cid,
|
|
orient = "orientationchange." + cid,
|
|
mask, maskCss;
|
|
|
|
this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
|
|
|
|
this.clearDropdownAlignmentPreference();
|
|
|
|
if (this.dropdown[0] !== this.body().children().last()[0]) {
|
|
this.dropdown.detach().appendTo(this.body());
|
|
}
|
|
|
|
// create the dropdown mask if doesnt already exist
|
|
mask = $("#select2-drop-mask");
|
|
if (mask.length == 0) {
|
|
mask = $(document.createElement("div"));
|
|
mask.attr("id", "select2-drop-mask").attr("class", "select2-drop-mask");
|
|
mask.hide();
|
|
mask.appendTo(this.body());
|
|
mask.on("mousedown touchstart click", function (e) {
|
|
var dropdown = $("#select2-drop"), self;
|
|
if (dropdown.length > 0) {
|
|
self = dropdown.data("select2");
|
|
if (self.opts.selectOnBlur) {
|
|
self.selectHighlighted({noFocus: true});
|
|
}
|
|
self.close();
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
});
|
|
}
|
|
|
|
// ensure the mask is always right before the dropdown
|
|
if (this.dropdown.prev()[0] !== mask[0]) {
|
|
this.dropdown.before(mask);
|
|
}
|
|
|
|
// move the global id to the correct dropdown
|
|
$("#select2-drop").removeAttr("id");
|
|
this.dropdown.attr("id", "select2-drop");
|
|
|
|
// show the elements
|
|
maskCss = _makeMaskCss();
|
|
|
|
mask.css(maskCss).show();
|
|
|
|
this.dropdown.show();
|
|
this.positionDropdown();
|
|
|
|
this.dropdown.addClass("select2-drop-active");
|
|
|
|
// attach listeners to events that can change the position of the container and thus require
|
|
// the position of the dropdown to be updated as well so it does not come unglued from the container
|
|
var that = this;
|
|
this.container.parents().add(window).each(function () {
|
|
$(this).on(resize + " " + scroll + " " + orient, function (e) {
|
|
var maskCss = _makeMaskCss();
|
|
$("#select2-drop-mask").css(maskCss);
|
|
that.positionDropdown();
|
|
});
|
|
});
|
|
|
|
function _makeMaskCss() {
|
|
return {
|
|
width: Math.max(document.documentElement.scrollWidth, $(window).width()),
|
|
height: Math.max(document.documentElement.scrollHeight, $(window).height())
|
|
}
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
close: function () {
|
|
if (!this.opened()) return;
|
|
|
|
var cid = this.containerId,
|
|
scroll = "scroll." + cid,
|
|
resize = "resize." + cid,
|
|
orient = "orientationchange." + cid;
|
|
|
|
// unbind event listeners
|
|
this.container.parents().add(window).each(function () {
|
|
$(this).off(scroll).off(resize).off(orient);
|
|
});
|
|
|
|
this.clearDropdownAlignmentPreference();
|
|
|
|
$("#select2-drop-mask").hide();
|
|
this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
|
|
this.dropdown.hide();
|
|
this.container.removeClass("select2-dropdown-open");
|
|
this.results.empty();
|
|
|
|
|
|
this.clearSearch();
|
|
this.search.removeClass("select2-active");
|
|
this.opts.element.trigger($.Event("select2-close"));
|
|
},
|
|
|
|
/**
|
|
* Opens control, sets input value, and updates results.
|
|
*/
|
|
// abstract
|
|
externalSearch: function (term) {
|
|
this.open();
|
|
this.search.val(term);
|
|
this.updateResults(false);
|
|
},
|
|
|
|
// abstract
|
|
clearSearch: function () {
|
|
|
|
},
|
|
|
|
//abstract
|
|
getMaximumSelectionSize: function () {
|
|
return evaluate(this.opts.maximumSelectionSize);
|
|
},
|
|
|
|
// abstract
|
|
ensureHighlightVisible: function () {
|
|
var results = this.results, children, index, child, hb, rb, y, more;
|
|
|
|
index = this.highlight();
|
|
|
|
if (index < 0) return;
|
|
|
|
if (index == 0) {
|
|
|
|
// if the first element is highlighted scroll all the way to the top,
|
|
// that way any unselectable headers above it will also be scrolled
|
|
// into view
|
|
|
|
results.scrollTop(0);
|
|
return;
|
|
}
|
|
|
|
children = this.findHighlightableChoices().find('.select2-result-label');
|
|
|
|
child = $(children[index]);
|
|
|
|
hb = child.offset().top + child.outerHeight(true);
|
|
|
|
// if this is the last child lets also make sure select2-more-results is visible
|
|
if (index === children.length - 1) {
|
|
more = results.find("li.select2-more-results");
|
|
if (more.length > 0) {
|
|
hb = more.offset().top + more.outerHeight(true);
|
|
}
|
|
}
|
|
|
|
rb = results.offset().top + results.outerHeight(true);
|
|
if (hb > rb) {
|
|
results.scrollTop(results.scrollTop() + (hb - rb));
|
|
}
|
|
y = child.offset().top - results.offset().top;
|
|
|
|
// make sure the top of the element is visible
|
|
if (y < 0 && child.css('display') != 'none') {
|
|
results.scrollTop(results.scrollTop() + y); // y is negative
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
findHighlightableChoices: function () {
|
|
return this.results.find(".select2-result-selectable:not(.select2-selected):not(.select2-disabled)");
|
|
},
|
|
|
|
// abstract
|
|
moveHighlight: function (delta) {
|
|
var choices = this.findHighlightableChoices(),
|
|
index = this.highlight();
|
|
|
|
while (index > -1 && index < choices.length) {
|
|
index += delta;
|
|
var choice = $(choices[index]);
|
|
if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
|
|
this.highlight(index);
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
highlight: function (index) {
|
|
var choices = this.findHighlightableChoices(),
|
|
choice,
|
|
data;
|
|
|
|
if (arguments.length === 0) {
|
|
return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
|
|
}
|
|
|
|
if (index >= choices.length) index = choices.length - 1;
|
|
if (index < 0) index = 0;
|
|
|
|
this.results.find(".select2-highlighted").removeClass("select2-highlighted");
|
|
|
|
choice = $(choices[index]);
|
|
choice.addClass("select2-highlighted");
|
|
|
|
this.ensureHighlightVisible();
|
|
|
|
data = choice.data("select2-data");
|
|
if (data) {
|
|
this.opts.element.trigger({type: "select2-highlight", val: this.id(data), choice: data});
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
countSelectableResults: function () {
|
|
return this.findHighlightableChoices().length;
|
|
},
|
|
|
|
// abstract
|
|
highlightUnderEvent: function (event) {
|
|
var el = $(event.target).closest(".select2-result-selectable");
|
|
if (el.length > 0 && !el.is(".select2-highlighted")) {
|
|
var choices = this.findHighlightableChoices();
|
|
this.highlight(choices.index(el));
|
|
} else if (el.length == 0) {
|
|
// if we are over an unselectable item remove al highlights
|
|
this.results.find(".select2-highlighted").removeClass("select2-highlighted");
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
loadMoreIfNeeded: function () {
|
|
var results = this.results,
|
|
more = results.find("li.select2-more-results"),
|
|
below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
|
|
offset = -1, // index of first element without data
|
|
page = this.resultsPage + 1,
|
|
self = this,
|
|
term = this.search.val(),
|
|
context = this.context;
|
|
|
|
if (more.length === 0) return;
|
|
below = more.offset().top - results.offset().top - results.height();
|
|
|
|
if (below <= this.opts.loadMorePadding) {
|
|
more.addClass("select2-active");
|
|
this.opts.query({
|
|
element: this.opts.element,
|
|
term: term,
|
|
page: page,
|
|
context: context,
|
|
matcher: this.opts.matcher,
|
|
callback: this.bind(function (data) {
|
|
|
|
// ignore a response if the select2 has been closed before it was received
|
|
if (!self.opened()) return;
|
|
|
|
|
|
self.opts.populateResults.call(this, results, data.results, {
|
|
term: term,
|
|
page: page,
|
|
context: context
|
|
});
|
|
self.postprocessResults(data, false, false);
|
|
|
|
if (data.more === true) {
|
|
more.detach().appendTo(results).text(self.opts.formatLoadMore(page + 1));
|
|
window.setTimeout(function () {
|
|
self.loadMoreIfNeeded();
|
|
}, 10);
|
|
} else {
|
|
more.remove();
|
|
}
|
|
self.positionDropdown();
|
|
self.resultsPage = page;
|
|
self.context = data.context;
|
|
})
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Default tokenizer function which does nothing
|
|
*/
|
|
tokenize: function () {
|
|
|
|
},
|
|
|
|
/**
|
|
* @param initial whether or not this is the call to this method right after the dropdown has been opened
|
|
*/
|
|
// abstract
|
|
updateResults: function (initial) {
|
|
var search = this.search,
|
|
results = this.results,
|
|
opts = this.opts,
|
|
data,
|
|
self = this,
|
|
input,
|
|
term = search.val(),
|
|
lastTerm = $.data(this.container, "select2-last-term");
|
|
|
|
// prevent duplicate queries against the same term
|
|
if (initial !== true && lastTerm && equal(term, lastTerm)) return;
|
|
|
|
$.data(this.container, "select2-last-term", term);
|
|
|
|
// if the search is currently hidden we do not alter the results
|
|
if (initial !== true && (this.showSearchInput === false || !this.opened())) {
|
|
return;
|
|
}
|
|
|
|
function postRender() {
|
|
search.removeClass("select2-active");
|
|
self.positionDropdown();
|
|
}
|
|
|
|
function render(html) {
|
|
results.html(html);
|
|
postRender();
|
|
}
|
|
|
|
var maxSelSize = this.getMaximumSelectionSize();
|
|
if (maxSelSize >= 1) {
|
|
data = this.data();
|
|
if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
|
|
render("<li class='select2-selection-limit'>" + opts.formatSelectionTooBig(maxSelSize) + "</li>");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (search.val().length < opts.minimumInputLength) {
|
|
if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
|
|
render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>");
|
|
} else {
|
|
render("");
|
|
}
|
|
if (initial && this.showSearch) this.showSearch(true);
|
|
return;
|
|
}
|
|
|
|
if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
|
|
if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
|
|
render("<li class='select2-no-results'>" + opts.formatInputTooLong(search.val(), opts.maximumInputLength) + "</li>");
|
|
} else {
|
|
render("");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
|
|
render("<li class='select2-searching'>" + opts.formatSearching() + "</li>");
|
|
}
|
|
|
|
search.addClass("select2-active");
|
|
|
|
// give the tokenizer a chance to pre-process the input
|
|
input = this.tokenize();
|
|
if (input != undefined && input != null) {
|
|
search.val(input);
|
|
}
|
|
|
|
this.resultsPage = 1;
|
|
|
|
opts.query({
|
|
element: opts.element,
|
|
term: search.val(),
|
|
page: this.resultsPage,
|
|
context: null,
|
|
matcher: opts.matcher,
|
|
callback: this.bind(function (data) {
|
|
var def; // default choice
|
|
|
|
// ignore a response if the select2 has been closed before it was received
|
|
if (!this.opened()) {
|
|
this.search.removeClass("select2-active");
|
|
return;
|
|
}
|
|
|
|
// save context, if any
|
|
this.context = (data.context === undefined) ? null : data.context;
|
|
// create a default choice and prepend it to the list
|
|
if (this.opts.createSearchChoice && search.val() !== "") {
|
|
def = this.opts.createSearchChoice.call(self, search.val(), data.results);
|
|
if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
|
|
if ($(data.results).filter(
|
|
function () {
|
|
return equal(self.id(this), self.id(def));
|
|
}).length === 0) {
|
|
data.results.unshift(def);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
|
|
render("<li class='select2-no-results'>" + opts.formatNoMatches(search.val()) + "</li>");
|
|
return;
|
|
}
|
|
|
|
results.empty();
|
|
self.opts.populateResults.call(this, results, data.results, {
|
|
term: search.val(),
|
|
page: this.resultsPage,
|
|
context: null
|
|
});
|
|
|
|
if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
|
|
results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(opts.formatLoadMore(this.resultsPage)) + "</li>");
|
|
window.setTimeout(function () {
|
|
self.loadMoreIfNeeded();
|
|
}, 10);
|
|
}
|
|
|
|
this.postprocessResults(data, initial);
|
|
|
|
postRender();
|
|
|
|
this.opts.element.trigger({type: "select2-loaded", items: data});
|
|
})
|
|
});
|
|
},
|
|
|
|
// abstract
|
|
cancel: function () {
|
|
this.close();
|
|
},
|
|
|
|
// abstract
|
|
blur: function () {
|
|
// if selectOnBlur == true, select the currently highlighted option
|
|
if (this.opts.selectOnBlur)
|
|
this.selectHighlighted({noFocus: true});
|
|
|
|
this.close();
|
|
this.container.removeClass("select2-container-active");
|
|
// synonymous to .is(':focus'), which is available in jquery >= 1.6
|
|
if (this.search[0] === document.activeElement) {
|
|
this.search.blur();
|
|
}
|
|
this.clearSearch();
|
|
this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
|
|
},
|
|
|
|
// abstract
|
|
focusSearch: function () {
|
|
focus(this.search);
|
|
},
|
|
|
|
// abstract
|
|
selectHighlighted: function (options) {
|
|
var index = this.highlight(),
|
|
highlighted = this.results.find(".select2-highlighted"),
|
|
data = highlighted.closest('.select2-result').data("select2-data");
|
|
|
|
if (data) {
|
|
this.highlight(index);
|
|
this.onSelect(data, options);
|
|
} else if (options && options.noFocus) {
|
|
this.close();
|
|
}
|
|
},
|
|
|
|
// abstract
|
|
getPlaceholder: function () {
|
|
var placeholderOption;
|
|
return this.opts.element.attr("placeholder") ||
|
|
this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
|
|
this.opts.element.data("placeholder") ||
|
|
this.opts.placeholder ||
|
|
((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
|
|
},
|
|
|
|
// abstract
|
|
getPlaceholderOption: function () {
|
|
if (this.select) {
|
|
var firstOption = this.select.children().first();
|
|
if (this.opts.placeholderOption !== undefined) {
|
|
//Determine the placeholder option based on the specified placeholderOption setting
|
|
return (this.opts.placeholderOption === "first" && firstOption) ||
|
|
(typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
|
|
} else if (firstOption.text() === "" && firstOption.val() === "") {
|
|
//No explicit placeholder option specified, use the first if it's blank
|
|
return firstOption;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get the desired width for the container element. This is
|
|
* derived first from option `width` passed to select2, then
|
|
* the inline 'style' on the original element, and finally
|
|
* falls back to the jQuery calculated element width.
|
|
*/
|
|
// abstract
|
|
initContainerWidth: function () {
|
|
function resolveContainerWidth() {
|
|
var style, attrs, matches, i, l;
|
|
|
|
if (this.opts.width === "off") {
|
|
return null;
|
|
} else if (this.opts.width === "element") {
|
|
return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
|
|
} else if (this.opts.width === "copy" || this.opts.width === "resolve") {
|
|
// check if there is inline style on the element that contains width
|
|
style = this.opts.element.attr('style');
|
|
if (style !== undefined) {
|
|
attrs = style.split(';');
|
|
for (i = 0, l = attrs.length; i < l; i = i + 1) {
|
|
matches = attrs[i].replace(/\s/g, '')
|
|
.match(/width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
|
|
if (matches !== null && matches.length >= 1)
|
|
return matches[1];
|
|
}
|
|
}
|
|
|
|
if (this.opts.width === "resolve") {
|
|
// next check if css('width') can resolve a width that is percent based, this is sometimes possible
|
|
// when attached to input type=hidden or elements hidden via css
|
|
style = this.opts.element.css('width');
|
|
if (style.indexOf("%") > 0) return style;
|
|
|
|
// finally, fallback on the calculated width of the element
|
|
return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
|
|
}
|
|
|
|
return null;
|
|
} else if ($.isFunction(this.opts.width)) {
|
|
return this.opts.width();
|
|
} else {
|
|
return this.opts.width;
|
|
}
|
|
};
|
|
|
|
var width = resolveContainerWidth.call(this);
|
|
if (width !== null) {
|
|
this.container.css("width", width);
|
|
}
|
|
}
|
|
});
|
|
|
|
SingleSelect2 = clazz(AbstractSelect2, {
|
|
|
|
// single
|
|
|
|
createContainer: function () {
|
|
var container = $(document.createElement("div")).attr({
|
|
"class": "select2-container"
|
|
}).html([
|
|
"<a href='javascript:void(0)' onclick='return false;' class='select2-choice' tabindex='-1'>",
|
|
" <span class='select2-chosen'> </span><abbr class='select2-search-choice-close'></abbr>",
|
|
" <span class='select2-arrow'><b></b></span>",
|
|
"</a>",
|
|
"<input class='select2-focusser select2-offscreen' type='text'/>",
|
|
"<div class='select2-drop select2-display-none'>",
|
|
" <div class='select2-search'>",
|
|
" <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'/>",
|
|
" </div>",
|
|
" <ul class='select2-results'>",
|
|
" </ul>",
|
|
"</div>"].join(""));
|
|
return container;
|
|
},
|
|
|
|
// single
|
|
enableInterface: function () {
|
|
if (this.parent.enableInterface.apply(this, arguments)) {
|
|
this.focusser.prop("disabled", !this.isInterfaceEnabled());
|
|
}
|
|
},
|
|
|
|
// single
|
|
opening: function () {
|
|
var el, range, len;
|
|
|
|
if (this.opts.minimumResultsForSearch >= 0) {
|
|
this.showSearch(true);
|
|
}
|
|
|
|
this.parent.opening.apply(this, arguments);
|
|
|
|
if (this.showSearchInput !== false) {
|
|
// IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
|
|
// all other browsers handle this just fine
|
|
|
|
this.search.val(this.focusser.val());
|
|
}
|
|
this.search.focus();
|
|
// move the cursor to the end after focussing, otherwise it will be at the beginning and
|
|
// new text will appear *before* focusser.val()
|
|
el = this.search.get(0);
|
|
if (el.createTextRange) {
|
|
range = el.createTextRange();
|
|
range.collapse(false);
|
|
range.select();
|
|
} else if (el.setSelectionRange) {
|
|
len = this.search.val().length;
|
|
el.setSelectionRange(len, len);
|
|
}
|
|
|
|
this.focusser.prop("disabled", true).val("");
|
|
this.updateResults(true);
|
|
this.opts.element.trigger($.Event("select2-open"));
|
|
},
|
|
|
|
// single
|
|
close: function () {
|
|
if (!this.opened()) return;
|
|
this.parent.close.apply(this, arguments);
|
|
this.focusser.removeAttr("disabled");
|
|
this.focusser.focus();
|
|
},
|
|
|
|
// single
|
|
focus: function () {
|
|
if (this.opened()) {
|
|
this.close();
|
|
} else {
|
|
this.focusser.removeAttr("disabled");
|
|
this.focusser.focus();
|
|
}
|
|
},
|
|
|
|
// single
|
|
isFocused: function () {
|
|
return this.container.hasClass("select2-container-active");
|
|
},
|
|
|
|
// single
|
|
cancel: function () {
|
|
this.parent.cancel.apply(this, arguments);
|
|
this.focusser.removeAttr("disabled");
|
|
this.focusser.focus();
|
|
},
|
|
|
|
// single
|
|
initContainer: function () {
|
|
|
|
var selection,
|
|
container = this.container,
|
|
dropdown = this.dropdown;
|
|
|
|
if (this.opts.minimumResultsForSearch < 0) {
|
|
this.showSearch(false);
|
|
} else {
|
|
this.showSearch(true);
|
|
}
|
|
|
|
this.selection = selection = container.find(".select2-choice");
|
|
|
|
this.focusser = container.find(".select2-focusser");
|
|
|
|
// rewrite labels from original element to focusser
|
|
this.focusser.attr("id", "s2id_autogen" + nextUid());
|
|
|
|
$("label[for='" + this.opts.element.attr("id") + "']")
|
|
.attr('for', this.focusser.attr('id'));
|
|
|
|
this.focusser.attr("tabindex", this.elementTabIndex);
|
|
|
|
this.search.on("keydown", this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
|
|
if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
|
|
// prevent the page from scrolling
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
|
|
switch (e.which) {
|
|
case KEY.UP:
|
|
case KEY.DOWN:
|
|
this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
|
|
killEvent(e);
|
|
return;
|
|
case KEY.ENTER:
|
|
this.selectHighlighted();
|
|
killEvent(e);
|
|
return;
|
|
case KEY.TAB:
|
|
this.selectHighlighted({noFocus: true});
|
|
return;
|
|
case KEY.ESC:
|
|
this.cancel(e);
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
}));
|
|
|
|
this.search.on("blur", this.bind(function (e) {
|
|
// a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
|
|
// without this the search field loses focus which is annoying
|
|
if (document.activeElement === this.body().get(0)) {
|
|
window.setTimeout(this.bind(function () {
|
|
this.search.focus();
|
|
}), 0);
|
|
}
|
|
}));
|
|
|
|
this.focusser.on("keydown", this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
|
|
if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
|
|
return;
|
|
}
|
|
|
|
if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
|
|
if (e.which == KEY.DOWN || e.which == KEY.UP
|
|
|| (e.which == KEY.ENTER && this.opts.openOnEnter)) {
|
|
|
|
if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
|
|
|
|
this.open();
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
|
|
if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
|
|
if (this.opts.allowClear) {
|
|
this.clear();
|
|
}
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
}));
|
|
|
|
|
|
installKeyUpChangeEvent(this.focusser);
|
|
this.focusser.on("keyup-change input", this.bind(function (e) {
|
|
if (this.opts.minimumResultsForSearch >= 0) {
|
|
e.stopPropagation();
|
|
if (this.opened()) return;
|
|
this.open();
|
|
}
|
|
}));
|
|
|
|
selection.on("mousedown", "abbr", this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
this.clear();
|
|
killEventImmediately(e);
|
|
this.close();
|
|
this.selection.focus();
|
|
}));
|
|
|
|
selection.on("mousedown", this.bind(function (e) {
|
|
|
|
if (!this.container.hasClass("select2-container-active")) {
|
|
this.opts.element.trigger($.Event("select2-focus"));
|
|
}
|
|
|
|
if (this.opened()) {
|
|
this.close();
|
|
} else if (this.isInterfaceEnabled()) {
|
|
this.open();
|
|
}
|
|
|
|
killEvent(e);
|
|
}));
|
|
|
|
dropdown.on("mousedown", this.bind(function () {
|
|
this.search.focus();
|
|
}));
|
|
|
|
selection.on("focus", this.bind(function (e) {
|
|
killEvent(e);
|
|
}));
|
|
|
|
this.focusser.on("focus", this.bind(function () {
|
|
if (!this.container.hasClass("select2-container-active")) {
|
|
this.opts.element.trigger($.Event("select2-focus"));
|
|
}
|
|
this.container.addClass("select2-container-active");
|
|
})).on("blur", this.bind(function () {
|
|
if (!this.opened()) {
|
|
this.container.removeClass("select2-container-active");
|
|
this.opts.element.trigger($.Event("select2-blur"));
|
|
}
|
|
}));
|
|
this.search.on("focus", this.bind(function () {
|
|
if (!this.container.hasClass("select2-container-active")) {
|
|
this.opts.element.trigger($.Event("select2-focus"));
|
|
}
|
|
this.container.addClass("select2-container-active");
|
|
}));
|
|
|
|
this.initContainerWidth();
|
|
this.opts.element.addClass("select2-offscreen");
|
|
this.setPlaceholder();
|
|
|
|
},
|
|
|
|
// single
|
|
clear: function (triggerChange) {
|
|
var data = this.selection.data("select2-data");
|
|
if (data) { // guard against queued quick consecutive clicks
|
|
var placeholderOption = this.getPlaceholderOption();
|
|
this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
|
|
this.selection.find(".select2-chosen").empty();
|
|
this.selection.removeData("select2-data");
|
|
this.setPlaceholder();
|
|
|
|
if (triggerChange !== false) {
|
|
this.opts.element.trigger({type: "select2-removed", val: this.id(data), choice: data});
|
|
this.triggerChange({removed: data});
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Sets selection based on source element's value
|
|
*/
|
|
// single
|
|
initSelection: function () {
|
|
var selected;
|
|
if (this.isPlaceholderOptionSelected()) {
|
|
this.updateSelection([]);
|
|
this.close();
|
|
this.setPlaceholder();
|
|
} else {
|
|
var self = this;
|
|
this.opts.initSelection.call(null, this.opts.element, function (selected) {
|
|
if (selected !== undefined && selected !== null) {
|
|
self.updateSelection(selected);
|
|
self.close();
|
|
self.setPlaceholder();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
isPlaceholderOptionSelected: function () {
|
|
var placeholderOption;
|
|
return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.is(':selected')) ||
|
|
(this.opts.element.val() === "") ||
|
|
(this.opts.element.val() === undefined) ||
|
|
(this.opts.element.val() === null);
|
|
},
|
|
|
|
// single
|
|
prepareOpts: function () {
|
|
var opts = this.parent.prepareOpts.apply(this, arguments),
|
|
self = this;
|
|
|
|
if (opts.element.get(0).tagName.toLowerCase() === "select") {
|
|
// install the selection initializer
|
|
opts.initSelection = function (element, callback) {
|
|
var selected = element.find(":selected");
|
|
// a single select box always has a value, no need to null check 'selected'
|
|
callback(self.optionToData(selected));
|
|
};
|
|
} else if ("data" in opts) {
|
|
// install default initSelection when applied to hidden input and data is local
|
|
opts.initSelection = opts.initSelection || function (element, callback) {
|
|
var id = element.val();
|
|
//search in data by id, storing the actual matching item
|
|
var match = null;
|
|
opts.query({
|
|
matcher: function (term, text, el) {
|
|
var is_match = equal(id, opts.id(el));
|
|
if (is_match) {
|
|
match = el;
|
|
}
|
|
return is_match;
|
|
},
|
|
callback: !$.isFunction(callback) ? $.noop : function () {
|
|
callback(match);
|
|
}
|
|
});
|
|
};
|
|
}
|
|
|
|
return opts;
|
|
},
|
|
|
|
// single
|
|
getPlaceholder: function () {
|
|
// if a placeholder is specified on a single select without a valid placeholder option ignore it
|
|
if (this.select) {
|
|
if (this.getPlaceholderOption() === undefined) {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
return this.parent.getPlaceholder.apply(this, arguments);
|
|
},
|
|
|
|
// single
|
|
setPlaceholder: function () {
|
|
var placeholder = this.getPlaceholder();
|
|
|
|
if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
|
|
|
|
// check for a placeholder option if attached to a select
|
|
if (this.select && this.getPlaceholderOption() === undefined) return;
|
|
|
|
this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
|
|
|
|
this.selection.addClass("select2-default");
|
|
|
|
this.container.removeClass("select2-allowclear");
|
|
}
|
|
},
|
|
|
|
// single
|
|
postprocessResults: function (data, initial, noHighlightUpdate) {
|
|
var selected = 0, self = this, showSearchInput = true;
|
|
|
|
// find the selected element in the result list
|
|
|
|
this.findHighlightableChoices().each2(function (i, elm) {
|
|
if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
|
|
selected = i;
|
|
return false;
|
|
}
|
|
});
|
|
|
|
// and highlight it
|
|
if (noHighlightUpdate !== false) {
|
|
if (initial === true && selected >= 0) {
|
|
this.highlight(selected);
|
|
} else {
|
|
this.highlight(0);
|
|
}
|
|
}
|
|
|
|
// hide the search box if this is the first we got the results and there are enough of them for search
|
|
|
|
if (initial === true) {
|
|
var min = this.opts.minimumResultsForSearch;
|
|
if (min >= 0) {
|
|
this.showSearch(countResults(data.results) >= min);
|
|
}
|
|
}
|
|
},
|
|
|
|
// single
|
|
showSearch: function (showSearchInput) {
|
|
if (this.showSearchInput === showSearchInput) return;
|
|
|
|
this.showSearchInput = showSearchInput;
|
|
|
|
this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
|
|
this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
|
|
//add "select2-with-searchbox" to the container if search box is shown
|
|
$(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
|
|
},
|
|
|
|
// single
|
|
onSelect: function (data, options) {
|
|
|
|
if (!this.triggerSelect(data)) {
|
|
return;
|
|
}
|
|
|
|
var old = this.opts.element.val(),
|
|
oldData = this.data();
|
|
|
|
this.opts.element.val(this.id(data));
|
|
this.updateSelection(data);
|
|
|
|
this.opts.element.trigger({type: "select2-selected", val: this.id(data), choice: data});
|
|
|
|
this.close();
|
|
|
|
if (!options || !options.noFocus)
|
|
this.selection.focus();
|
|
|
|
if (!equal(old, this.id(data))) {
|
|
this.triggerChange({added: data, removed: oldData});
|
|
}
|
|
},
|
|
|
|
// single
|
|
updateSelection: function (data) {
|
|
|
|
var container = this.selection.find(".select2-chosen"), formatted, cssClass;
|
|
|
|
this.selection.data("select2-data", data);
|
|
|
|
container.empty();
|
|
formatted = this.opts.formatSelection(data, container, this.opts.escapeMarkup);
|
|
if (formatted !== undefined) {
|
|
container.append(formatted);
|
|
}
|
|
cssClass = this.opts.formatSelectionCssClass(data, container);
|
|
if (cssClass !== undefined) {
|
|
container.addClass(cssClass);
|
|
}
|
|
|
|
this.selection.removeClass("select2-default");
|
|
|
|
if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
|
|
this.container.addClass("select2-allowclear");
|
|
}
|
|
},
|
|
|
|
// single
|
|
val: function () {
|
|
var val,
|
|
triggerChange = false,
|
|
data = null,
|
|
self = this,
|
|
oldData = this.data();
|
|
|
|
if (arguments.length === 0) {
|
|
return this.opts.element.val();
|
|
}
|
|
|
|
val = arguments[0];
|
|
|
|
if (arguments.length > 1) {
|
|
triggerChange = arguments[1];
|
|
}
|
|
|
|
if (this.select) {
|
|
this.select
|
|
.val(val)
|
|
.find(":selected").each2(function (i, elm) {
|
|
data = self.optionToData(elm);
|
|
return false;
|
|
});
|
|
this.updateSelection(data);
|
|
this.setPlaceholder();
|
|
if (triggerChange) {
|
|
this.triggerChange({added: data, removed: oldData});
|
|
}
|
|
} else {
|
|
// val is an id. !val is true for [undefined,null,'',0] - 0 is legal
|
|
if (!val && val !== 0) {
|
|
this.clear(triggerChange);
|
|
return;
|
|
}
|
|
if (this.opts.initSelection === undefined) {
|
|
throw new Error("cannot call val() if initSelection() is not defined");
|
|
}
|
|
this.opts.element.val(val);
|
|
this.opts.initSelection(this.opts.element, function (data) {
|
|
self.opts.element.val(!data ? "" : self.id(data));
|
|
self.updateSelection(data);
|
|
self.setPlaceholder();
|
|
if (triggerChange) {
|
|
self.triggerChange({added: data, removed: oldData});
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
// single
|
|
clearSearch: function () {
|
|
this.search.val("");
|
|
this.focusser.val("");
|
|
},
|
|
|
|
// single
|
|
data: function (value, triggerChange) {
|
|
var data;
|
|
|
|
if (arguments.length === 0) {
|
|
data = this.selection.data("select2-data");
|
|
if (data == undefined) data = null;
|
|
return data;
|
|
} else {
|
|
if (!value || value === "") {
|
|
this.clear(triggerChange);
|
|
} else {
|
|
data = this.data();
|
|
this.opts.element.val(!value ? "" : this.id(value));
|
|
this.updateSelection(value);
|
|
if (triggerChange) {
|
|
this.triggerChange({added: value, removed: data});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
MultiSelect2 = clazz(AbstractSelect2, {
|
|
|
|
// multi
|
|
createContainer: function () {
|
|
var container = $(document.createElement("div")).attr({
|
|
"class": "select2-container select2-container-multi"
|
|
}).html([
|
|
"<ul class='select2-choices'>",
|
|
" <li class='select2-search-field'>",
|
|
" <input type='text' autocomplete='off' autocorrect='off' autocapitilize='off' spellcheck='false' class='select2-input'>",
|
|
" </li>",
|
|
"</ul>",
|
|
"<div class='select2-drop select2-drop-multi select2-display-none'>",
|
|
" <ul class='select2-results'>",
|
|
" </ul>",
|
|
"</div>"].join(""));
|
|
return container;
|
|
},
|
|
|
|
// multi
|
|
prepareOpts: function () {
|
|
var opts = this.parent.prepareOpts.apply(this, arguments),
|
|
self = this;
|
|
|
|
// TODO validate placeholder is a string if specified
|
|
|
|
if (opts.element.get(0).tagName.toLowerCase() === "select") {
|
|
// install sthe selection initializer
|
|
opts.initSelection = function (element, callback) {
|
|
|
|
var data = [];
|
|
|
|
element.find(":selected").each2(function (i, elm) {
|
|
data.push(self.optionToData(elm));
|
|
});
|
|
callback(data);
|
|
};
|
|
} else if ("data" in opts) {
|
|
// install default initSelection when applied to hidden input and data is local
|
|
opts.initSelection = opts.initSelection || function (element, callback) {
|
|
var ids = splitVal(element.val(), opts.separator);
|
|
//search in data by array of ids, storing matching items in a list
|
|
var matches = [];
|
|
opts.query({
|
|
matcher: function (term, text, el) {
|
|
var is_match = $.grep(ids, function (id) {
|
|
return equal(id, opts.id(el));
|
|
}).length;
|
|
if (is_match) {
|
|
matches.push(el);
|
|
}
|
|
return is_match;
|
|
},
|
|
callback: !$.isFunction(callback) ? $.noop : function () {
|
|
// reorder matches based on the order they appear in the ids array because right now
|
|
// they are in the order in which they appear in data array
|
|
var ordered = [];
|
|
for (var i = 0; i < ids.length; i++) {
|
|
var id = ids[i];
|
|
for (var j = 0; j < matches.length; j++) {
|
|
var match = matches[j];
|
|
if (equal(id, opts.id(match))) {
|
|
ordered.push(match);
|
|
matches.splice(j, 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
callback(ordered);
|
|
}
|
|
});
|
|
};
|
|
}
|
|
|
|
return opts;
|
|
},
|
|
|
|
selectChoice: function (choice) {
|
|
|
|
var selected = this.container.find(".select2-search-choice-focus");
|
|
if (selected.length && choice && choice[0] == selected[0]) {
|
|
|
|
} else {
|
|
if (selected.length) {
|
|
this.opts.element.trigger("choice-deselected", selected);
|
|
}
|
|
selected.removeClass("select2-search-choice-focus");
|
|
if (choice && choice.length) {
|
|
this.close();
|
|
choice.addClass("select2-search-choice-focus");
|
|
this.opts.element.trigger("choice-selected", choice);
|
|
}
|
|
}
|
|
},
|
|
|
|
// multi
|
|
initContainer: function () {
|
|
|
|
var selector = ".select2-choices", selection;
|
|
|
|
this.searchContainer = this.container.find(".select2-search-field");
|
|
this.selection = selection = this.container.find(selector);
|
|
|
|
var _this = this;
|
|
this.selection.on("mousedown", ".select2-search-choice", function (e) {
|
|
//killEvent(e);
|
|
_this.search[0].focus();
|
|
_this.selectChoice($(this));
|
|
})
|
|
|
|
// rewrite labels from original element to focusser
|
|
this.search.attr("id", "s2id_autogen" + nextUid());
|
|
$("label[for='" + this.opts.element.attr("id") + "']")
|
|
.attr('for', this.search.attr('id'));
|
|
|
|
this.search.on("input paste", this.bind(function () {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
if (!this.opened()) {
|
|
this.open();
|
|
}
|
|
}));
|
|
|
|
this.search.attr("tabindex", this.elementTabIndex);
|
|
|
|
this.keydowns = 0;
|
|
this.search.on("keydown", this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
|
|
++this.keydowns;
|
|
var selected = selection.find(".select2-search-choice-focus");
|
|
var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
|
|
var next = selected.next(".select2-search-choice:not(.select2-locked)");
|
|
var pos = getCursorInfo(this.search);
|
|
|
|
if (selected.length &&
|
|
(e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
|
|
var selectedChoice = selected;
|
|
if (e.which == KEY.LEFT && prev.length) {
|
|
selectedChoice = prev;
|
|
}
|
|
else if (e.which == KEY.RIGHT) {
|
|
selectedChoice = next.length ? next : null;
|
|
}
|
|
else if (e.which === KEY.BACKSPACE) {
|
|
this.unselect(selected.first());
|
|
this.search.width(10);
|
|
selectedChoice = prev.length ? prev : next;
|
|
} else if (e.which == KEY.DELETE) {
|
|
this.unselect(selected.first());
|
|
this.search.width(10);
|
|
selectedChoice = next.length ? next : null;
|
|
} else if (e.which == KEY.ENTER) {
|
|
selectedChoice = null;
|
|
}
|
|
|
|
this.selectChoice(selectedChoice);
|
|
killEvent(e);
|
|
if (!selectedChoice || !selectedChoice.length) {
|
|
this.open();
|
|
}
|
|
return;
|
|
} else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
|
|
|| e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
|
|
|
|
this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
|
|
killEvent(e);
|
|
return;
|
|
} else {
|
|
this.selectChoice(null);
|
|
}
|
|
|
|
if (this.opened()) {
|
|
switch (e.which) {
|
|
case KEY.UP:
|
|
case KEY.DOWN:
|
|
this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
|
|
killEvent(e);
|
|
return;
|
|
case KEY.ENTER:
|
|
this.selectHighlighted();
|
|
killEvent(e);
|
|
return;
|
|
case KEY.TAB:
|
|
this.selectHighlighted({noFocus: true});
|
|
this.close();
|
|
return;
|
|
case KEY.ESC:
|
|
this.cancel(e);
|
|
killEvent(e);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
|
|
|| e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
|
|
return;
|
|
}
|
|
|
|
if (e.which === KEY.ENTER) {
|
|
if (this.opts.openOnEnter === false) {
|
|
return;
|
|
} else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.open();
|
|
|
|
if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
|
|
// prevent the page from scrolling
|
|
killEvent(e);
|
|
}
|
|
|
|
if (e.which === KEY.ENTER) {
|
|
// prevent form from being submitted
|
|
killEvent(e);
|
|
}
|
|
|
|
}));
|
|
|
|
this.search.on("keyup", this.bind(function (e) {
|
|
this.keydowns = 0;
|
|
this.resizeSearch();
|
|
})
|
|
);
|
|
|
|
this.search.on("blur", this.bind(function (e) {
|
|
this.container.removeClass("select2-container-active");
|
|
this.search.removeClass("select2-focused");
|
|
this.selectChoice(null);
|
|
if (!this.opened()) this.clearSearch();
|
|
e.stopImmediatePropagation();
|
|
this.opts.element.trigger($.Event("select2-blur"));
|
|
}));
|
|
|
|
this.container.on("click", selector, this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
if ($(e.target).closest(".select2-search-choice").length > 0) {
|
|
// clicked inside a select2 search choice, do not open
|
|
return;
|
|
}
|
|
this.selectChoice(null);
|
|
this.clearPlaceholder();
|
|
if (!this.container.hasClass("select2-container-active")) {
|
|
this.opts.element.trigger($.Event("select2-focus"));
|
|
}
|
|
this.open();
|
|
this.focusSearch();
|
|
e.preventDefault();
|
|
}));
|
|
|
|
this.container.on("focus", selector, this.bind(function () {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
if (!this.container.hasClass("select2-container-active")) {
|
|
this.opts.element.trigger($.Event("select2-focus"));
|
|
}
|
|
this.container.addClass("select2-container-active");
|
|
this.dropdown.addClass("select2-drop-active");
|
|
this.clearPlaceholder();
|
|
}));
|
|
|
|
this.initContainerWidth();
|
|
this.opts.element.addClass("select2-offscreen");
|
|
|
|
// set the placeholder if necessary
|
|
this.clearSearch();
|
|
},
|
|
|
|
// multi
|
|
enableInterface: function () {
|
|
if (this.parent.enableInterface.apply(this, arguments)) {
|
|
this.search.prop("disabled", !this.isInterfaceEnabled());
|
|
}
|
|
},
|
|
|
|
// multi
|
|
initSelection: function () {
|
|
var data;
|
|
if (this.opts.element.val() === "" && this.opts.element.text() === "") {
|
|
this.updateSelection([]);
|
|
this.close();
|
|
// set the placeholder if necessary
|
|
this.clearSearch();
|
|
}
|
|
if (this.select || this.opts.element.val() !== "") {
|
|
var self = this;
|
|
this.opts.initSelection.call(null, this.opts.element, function (data) {
|
|
if (data !== undefined && data !== null) {
|
|
self.updateSelection(data);
|
|
self.close();
|
|
// set the placeholder if necessary
|
|
self.clearSearch();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
// multi
|
|
clearSearch: function () {
|
|
var placeholder = this.getPlaceholder(),
|
|
maxWidth = this.getMaxSearchWidth();
|
|
|
|
if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
|
|
this.search.val(placeholder).addClass("select2-default");
|
|
// stretch the search box to full width of the container so as much of the placeholder is visible as possible
|
|
// we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
|
|
this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
|
|
} else {
|
|
this.search.val("").width(10);
|
|
}
|
|
},
|
|
|
|
// multi
|
|
clearPlaceholder: function () {
|
|
if (this.search.hasClass("select2-default")) {
|
|
this.search.val("").removeClass("select2-default");
|
|
}
|
|
},
|
|
|
|
// multi
|
|
opening: function () {
|
|
this.clearPlaceholder(); // should be done before super so placeholder is not used to search
|
|
this.resizeSearch();
|
|
|
|
this.parent.opening.apply(this, arguments);
|
|
|
|
this.focusSearch();
|
|
|
|
this.updateResults(true);
|
|
this.search.focus();
|
|
this.opts.element.trigger($.Event("select2-open"));
|
|
},
|
|
|
|
// multi
|
|
close: function () {
|
|
if (!this.opened()) return;
|
|
this.parent.close.apply(this, arguments);
|
|
},
|
|
|
|
// multi
|
|
focus: function () {
|
|
this.close();
|
|
this.search.focus();
|
|
},
|
|
|
|
// multi
|
|
isFocused: function () {
|
|
return this.search.hasClass("select2-focused");
|
|
},
|
|
|
|
// multi
|
|
updateSelection: function (data) {
|
|
var ids = [], filtered = [], self = this;
|
|
|
|
// filter out duplicates
|
|
$(data).each(function () {
|
|
if (indexOf(self.id(this), ids) < 0) {
|
|
ids.push(self.id(this));
|
|
filtered.push(this);
|
|
}
|
|
});
|
|
data = filtered;
|
|
|
|
this.selection.find(".select2-search-choice").remove();
|
|
$(data).each(function () {
|
|
self.addSelectedChoice(this);
|
|
});
|
|
self.postprocessResults();
|
|
},
|
|
|
|
// multi
|
|
tokenize: function () {
|
|
var input = this.search.val();
|
|
input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
|
|
if (input != null && input != undefined) {
|
|
this.search.val(input);
|
|
if (input.length > 0) {
|
|
this.open();
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
// multi
|
|
onSelect: function (data, options) {
|
|
|
|
if (!this.triggerSelect(data)) {
|
|
return;
|
|
}
|
|
|
|
this.addSelectedChoice(data);
|
|
|
|
this.opts.element.trigger({type: "selected", val: this.id(data), choice: data});
|
|
|
|
if (this.select || !this.opts.closeOnSelect) this.postprocessResults();
|
|
|
|
if (this.opts.closeOnSelect) {
|
|
this.close();
|
|
this.search.width(10);
|
|
} else {
|
|
if (this.countSelectableResults() > 0) {
|
|
this.search.width(10);
|
|
this.resizeSearch();
|
|
if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
|
|
// if we reached max selection size repaint the results so choices
|
|
// are replaced with the max selection reached message
|
|
this.updateResults(true);
|
|
}
|
|
this.positionDropdown();
|
|
} else {
|
|
// if nothing left to select close
|
|
this.close();
|
|
this.search.width(10);
|
|
}
|
|
}
|
|
|
|
// since its not possible to select an element that has already been
|
|
// added we do not need to check if this is a new element before firing change
|
|
this.triggerChange({added: data});
|
|
|
|
if (!options || !options.noFocus)
|
|
this.focusSearch();
|
|
},
|
|
|
|
// multi
|
|
cancel: function () {
|
|
this.close();
|
|
this.focusSearch();
|
|
},
|
|
|
|
addSelectedChoice: function (data) {
|
|
var enableChoice = !data.locked,
|
|
enabledItem = $(
|
|
"<li class='select2-search-choice'>" +
|
|
" <div></div>" +
|
|
" <a href='#' onclick='return false;' class='select2-search-choice-close' tabindex='-1'></a>" +
|
|
"</li>"),
|
|
disabledItem = $(
|
|
"<li class='select2-search-choice select2-locked'>" +
|
|
"<div></div>" +
|
|
"</li>");
|
|
var choice = enableChoice ? enabledItem : disabledItem,
|
|
id = this.id(data),
|
|
val = this.getVal(),
|
|
formatted,
|
|
cssClass;
|
|
|
|
formatted = this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
|
|
if (formatted != undefined) {
|
|
choice.find("div").replaceWith("<div>" + formatted + "</div>");
|
|
}
|
|
cssClass = this.opts.formatSelectionCssClass(data, choice.find("div"));
|
|
if (cssClass != undefined) {
|
|
choice.addClass(cssClass);
|
|
}
|
|
|
|
if (enableChoice) {
|
|
choice.find(".select2-search-choice-close")
|
|
.on("mousedown", killEvent)
|
|
.on("click dblclick", this.bind(function (e) {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
|
|
$(e.target).closest(".select2-search-choice").fadeOut('fast', this.bind(function () {
|
|
this.unselect($(e.target));
|
|
this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
|
|
this.close();
|
|
this.focusSearch();
|
|
})).dequeue();
|
|
killEvent(e);
|
|
})).on("focus", this.bind(function () {
|
|
if (!this.isInterfaceEnabled()) return;
|
|
this.container.addClass("select2-container-active");
|
|
this.dropdown.addClass("select2-drop-active");
|
|
}));
|
|
}
|
|
|
|
choice.data("select2-data", data);
|
|
choice.insertBefore(this.searchContainer);
|
|
|
|
val.push(id);
|
|
this.setVal(val);
|
|
},
|
|
|
|
// multi
|
|
unselect: function (selected) {
|
|
var val = this.getVal(),
|
|
data,
|
|
index;
|
|
|
|
selected = selected.closest(".select2-search-choice");
|
|
|
|
if (selected.length === 0) {
|
|
throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
|
|
}
|
|
|
|
data = selected.data("select2-data");
|
|
|
|
if (!data) {
|
|
// prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
|
|
// and invoked on an element already removed
|
|
return;
|
|
}
|
|
|
|
index = indexOf(this.id(data), val);
|
|
|
|
if (index >= 0) {
|
|
val.splice(index, 1);
|
|
this.setVal(val);
|
|
if (this.select) this.postprocessResults();
|
|
}
|
|
selected.remove();
|
|
|
|
this.opts.element.trigger({type: "removed", val: this.id(data), choice: data});
|
|
this.triggerChange({removed: data});
|
|
},
|
|
|
|
// multi
|
|
postprocessResults: function (data, initial, noHighlightUpdate) {
|
|
var val = this.getVal(),
|
|
choices = this.results.find(".select2-result"),
|
|
compound = this.results.find(".select2-result-with-children"),
|
|
self = this;
|
|
|
|
choices.each2(function (i, choice) {
|
|
var id = self.id(choice.data("select2-data"));
|
|
if (indexOf(id, val) >= 0) {
|
|
choice.addClass("select2-selected");
|
|
// mark all children of the selected parent as selected
|
|
choice.find(".select2-result-selectable").addClass("select2-selected");
|
|
}
|
|
});
|
|
|
|
compound.each2(function (i, choice) {
|
|
// hide an optgroup if it doesnt have any selectable children
|
|
if (!choice.is('.select2-result-selectable')
|
|
&& choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
|
|
choice.addClass("select2-selected");
|
|
}
|
|
});
|
|
|
|
if (this.highlight() == -1 && noHighlightUpdate !== false) {
|
|
self.highlight(0);
|
|
}
|
|
|
|
//If all results are chosen render formatNoMAtches
|
|
if (!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0) {
|
|
if (!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
|
|
if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
|
|
this.results.append("<li class='select2-no-results'>" + self.opts.formatNoMatches(self.search.val()) + "</li>");
|
|
}
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
// multi
|
|
getMaxSearchWidth: function () {
|
|
return this.selection.width() - getSideBorderPadding(this.search);
|
|
},
|
|
|
|
// multi
|
|
resizeSearch: function () {
|
|
var minimumWidth, left, maxWidth, containerLeft, searchWidth,
|
|
sideBorderPadding = getSideBorderPadding(this.search);
|
|
|
|
minimumWidth = measureTextWidth(this.search) + 10;
|
|
|
|
left = this.search.offset().left;
|
|
|
|
maxWidth = this.selection.width();
|
|
containerLeft = this.selection.offset().left;
|
|
|
|
searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
|
|
|
|
if (searchWidth < minimumWidth) {
|
|
searchWidth = maxWidth - sideBorderPadding;
|
|
}
|
|
|
|
if (searchWidth < 40) {
|
|
searchWidth = maxWidth - sideBorderPadding;
|
|
}
|
|
|
|
if (searchWidth <= 0) {
|
|
searchWidth = minimumWidth;
|
|
}
|
|
|
|
this.search.width(searchWidth);
|
|
},
|
|
|
|
// multi
|
|
getVal: function () {
|
|
var val;
|
|
if (this.select) {
|
|
val = this.select.val();
|
|
return val === null ? [] : val;
|
|
} else {
|
|
val = this.opts.element.val();
|
|
return splitVal(val, this.opts.separator);
|
|
}
|
|
},
|
|
|
|
// multi
|
|
setVal: function (val) {
|
|
var unique;
|
|
if (this.select) {
|
|
this.select.val(val);
|
|
} else {
|
|
unique = [];
|
|
// filter out duplicates
|
|
$(val).each(function () {
|
|
if (indexOf(this, unique) < 0) unique.push(this);
|
|
});
|
|
this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
|
|
}
|
|
},
|
|
|
|
// multi
|
|
buildChangeDetails: function (old, current) {
|
|
var current = current.slice(0),
|
|
old = old.slice(0);
|
|
|
|
// remove intersection from each array
|
|
for (var i = 0; i < current.length; i++) {
|
|
for (var j = 0; j < old.length; j++) {
|
|
if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
|
|
current.splice(i, 1);
|
|
i--;
|
|
old.splice(j, 1);
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {added: current, removed: old};
|
|
},
|
|
|
|
|
|
// multi
|
|
val: function (val, triggerChange) {
|
|
var oldData, self = this, changeDetails;
|
|
|
|
if (arguments.length === 0) {
|
|
return this.getVal();
|
|
}
|
|
|
|
oldData = this.data();
|
|
if (!oldData.length) oldData = [];
|
|
|
|
// val is an id. !val is true for [undefined,null,'',0] - 0 is legal
|
|
if (!val && val !== 0) {
|
|
this.opts.element.val("");
|
|
this.updateSelection([]);
|
|
this.clearSearch();
|
|
if (triggerChange) {
|
|
this.triggerChange({added: this.data(), removed: oldData});
|
|
}
|
|
return;
|
|
}
|
|
|
|
// val is a list of ids
|
|
this.setVal(val);
|
|
|
|
if (this.select) {
|
|
this.opts.initSelection(this.select, this.bind(this.updateSelection));
|
|
if (triggerChange) {
|
|
this.triggerChange(this.buildChangeDetails(oldData, this.data()));
|
|
}
|
|
} else {
|
|
if (this.opts.initSelection === undefined) {
|
|
throw new Error("val() cannot be called if initSelection() is not defined");
|
|
}
|
|
|
|
this.opts.initSelection(this.opts.element, function (data) {
|
|
var ids = $.map(data, self.id);
|
|
self.setVal(ids);
|
|
self.updateSelection(data);
|
|
self.clearSearch();
|
|
if (triggerChange) {
|
|
self.triggerChange(this.buildChangeDetails(oldData, this.data()));
|
|
}
|
|
});
|
|
}
|
|
this.clearSearch();
|
|
},
|
|
|
|
// multi
|
|
onSortStart: function () {
|
|
if (this.select) {
|
|
throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
|
|
}
|
|
|
|
// collapse search field into 0 width so its container can be collapsed as well
|
|
this.search.width(0);
|
|
// hide the container
|
|
this.searchContainer.hide();
|
|
},
|
|
|
|
// multi
|
|
onSortEnd: function () {
|
|
|
|
var val = [], self = this;
|
|
|
|
// show search and move it to the end of the list
|
|
this.searchContainer.show();
|
|
// make sure the search container is the last item in the list
|
|
this.searchContainer.appendTo(this.searchContainer.parent());
|
|
// since we collapsed the width in dragStarted, we resize it here
|
|
this.resizeSearch();
|
|
|
|
// update selection
|
|
this.selection.find(".select2-search-choice").each(function () {
|
|
val.push(self.opts.id($(this).data("select2-data")));
|
|
});
|
|
this.setVal(val);
|
|
this.triggerChange();
|
|
},
|
|
|
|
// multi
|
|
data: function (values, triggerChange) {
|
|
var self = this, ids, old;
|
|
if (arguments.length === 0) {
|
|
return this.selection
|
|
.find(".select2-search-choice")
|
|
.map(function () {
|
|
return $(this).data("select2-data");
|
|
})
|
|
.get();
|
|
} else {
|
|
old = this.data();
|
|
if (!values) {
|
|
values = [];
|
|
}
|
|
ids = $.map(values, function (e) {
|
|
return self.opts.id(e);
|
|
});
|
|
this.setVal(ids);
|
|
this.updateSelection(values);
|
|
this.clearSearch();
|
|
if (triggerChange) {
|
|
this.triggerChange(this.buildChangeDetails(old, this.data()));
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
$.fn.select2 = function () {
|
|
|
|
var args = Array.prototype.slice.call(arguments, 0),
|
|
opts,
|
|
select2,
|
|
method, value, multiple,
|
|
allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "readonly", "positionDropdown", "data", "search"],
|
|
valueMethods = ["val", "opened", "isFocused", "container", "data"],
|
|
methodsMap = {search: "externalSearch"};
|
|
|
|
this.each(function () {
|
|
if (args.length === 0 || typeof(args[0]) === "object") {
|
|
opts = args.length === 0 ? {} : $.extend({}, args[0]);
|
|
opts.element = $(this);
|
|
|
|
if (opts.element.get(0).tagName.toLowerCase() === "select") {
|
|
multiple = opts.element.prop("multiple");
|
|
} else {
|
|
multiple = opts.multiple || false;
|
|
if ("tags" in opts) {
|
|
opts.multiple = multiple = true;
|
|
}
|
|
}
|
|
|
|
select2 = multiple ? new MultiSelect2() : new SingleSelect2();
|
|
select2.init(opts);
|
|
} else if (typeof(args[0]) === "string") {
|
|
|
|
if (indexOf(args[0], allowedMethods) < 0) {
|
|
throw "Unknown method: " + args[0];
|
|
}
|
|
|
|
value = undefined;
|
|
select2 = $(this).data("select2");
|
|
if (select2 === undefined) return;
|
|
|
|
method = args[0];
|
|
|
|
if (method === "container") {
|
|
value = select2.container;
|
|
} else if (method === "dropdown") {
|
|
value = select2.dropdown;
|
|
} else {
|
|
if (methodsMap[method]) method = methodsMap[method];
|
|
|
|
value = select2[method].apply(select2, args.slice(1));
|
|
}
|
|
if (indexOf(args[0], valueMethods) >= 0) {
|
|
return false;
|
|
}
|
|
} else {
|
|
throw "Invalid arguments to select2 plugin: " + args;
|
|
}
|
|
});
|
|
return (value === undefined) ? this : value;
|
|
};
|
|
|
|
// plugin defaults, accessible to users
|
|
$.fn.select2.defaults = {
|
|
width: "copy",
|
|
loadMorePadding: 0,
|
|
closeOnSelect: true,
|
|
openOnEnter: true,
|
|
containerCss: {},
|
|
dropdownCss: {},
|
|
containerCssClass: "",
|
|
dropdownCssClass: "",
|
|
formatResult: function (result, container, query, escapeMarkup) {
|
|
var markup = [];
|
|
markMatch(result.text, query.term, markup, escapeMarkup);
|
|
return markup.join("");
|
|
},
|
|
formatSelection: function (data, container, escapeMarkup) {
|
|
return data ? escapeMarkup(data.text) : undefined;
|
|
},
|
|
sortResults: function (results, container, query) {
|
|
return results;
|
|
},
|
|
formatResultCssClass: function (data) {
|
|
return undefined;
|
|
},
|
|
formatSelectionCssClass: function (data, container) {
|
|
return undefined;
|
|
},
|
|
formatNoMatches: function () {
|
|
return "No matches found";
|
|
},
|
|
formatInputTooShort: function (input, min) {
|
|
var n = min - input.length;
|
|
return "Please enter " + n + " more character" + (n == 1 ? "" : "s");
|
|
},
|
|
formatInputTooLong: function (input, max) {
|
|
var n = input.length - max;
|
|
return "Please delete " + n + " character" + (n == 1 ? "" : "s");
|
|
},
|
|
formatSelectionTooBig: function (limit) {
|
|
return "You can only select " + limit + " item" + (limit == 1 ? "" : "s");
|
|
},
|
|
formatLoadMore: function (pageNumber) {
|
|
return "Loading more results...";
|
|
},
|
|
formatSearching: function () {
|
|
return "Searching...";
|
|
},
|
|
minimumResultsForSearch: 0,
|
|
minimumInputLength: 0,
|
|
maximumInputLength: null,
|
|
maximumSelectionSize: 0,
|
|
id: function (e) {
|
|
return e.id;
|
|
},
|
|
matcher: function (term, text) {
|
|
return ('' + text).toUpperCase().indexOf(('' + term).toUpperCase()) >= 0;
|
|
},
|
|
separator: ",",
|
|
tokenSeparators: [],
|
|
tokenizer: defaultTokenizer,
|
|
escapeMarkup: defaultEscapeMarkup,
|
|
blurOnChange: false,
|
|
selectOnBlur: false,
|
|
adaptContainerCssClass: function (c) {
|
|
return c;
|
|
},
|
|
adaptDropdownCssClass: function (c) {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
$.fn.select2.ajaxDefaults = {
|
|
transport: $.ajax,
|
|
params: {
|
|
type: "GET",
|
|
cache: false,
|
|
dataType: "json"
|
|
}
|
|
};
|
|
|
|
// exports
|
|
window.Select2 = {
|
|
query: {
|
|
ajax: ajax,
|
|
local: local,
|
|
tags: tags
|
|
}, util: {
|
|
debounce: debounce,
|
|
markMatch: markMatch,
|
|
escapeMarkup: defaultEscapeMarkup
|
|
}, "class": {
|
|
"abstract": AbstractSelect2,
|
|
"single": SingleSelect2,
|
|
"multi": MultiSelect2
|
|
}
|
|
};
|
|
|
|
}(jQuery));
|
|
|
|
/*! jQuery Timepicker Addon - v1.4.2 - 2013-11-23
|
|
* http://trentrichardson.com/examples/timepicker
|
|
* Copyright (c) 2013 Trent Richardson; Licensed MIT */
|
|
(function ($) {
|
|
|
|
/*
|
|
* Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded"
|
|
*/
|
|
$.ui.timepicker = $.ui.timepicker || {};
|
|
if ($.ui.timepicker.version) {
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* Extend jQueryUI, get it started with our version number
|
|
*/
|
|
$.extend($.ui, {
|
|
timepicker: {
|
|
version: "1.4.2"
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Timepicker manager.
|
|
* Use the singleton instance of this class, $.timepicker, to interact with the time picker.
|
|
* Settings for (groups of) time pickers are maintained in an instance object,
|
|
* allowing multiple different settings on the same page.
|
|
*/
|
|
var Timepicker = function () {
|
|
this.regional = []; // Available regional settings, indexed by language code
|
|
this.regional[''] = { // Default regional settings
|
|
currentText: 'Now',
|
|
closeText: 'Done',
|
|
amNames: ['AM', 'A'],
|
|
pmNames: ['PM', 'P'],
|
|
timeFormat: 'HH:mm',
|
|
timeSuffix: '',
|
|
timeOnlyTitle: 'Choose Time',
|
|
timeText: 'Time',
|
|
hourText: 'Hour',
|
|
minuteText: 'Minute',
|
|
secondText: 'Second',
|
|
millisecText: 'Millisecond',
|
|
microsecText: 'Microsecond',
|
|
timezoneText: 'Time Zone',
|
|
isRTL: false
|
|
};
|
|
this._defaults = { // Global defaults for all the datetime picker instances
|
|
showButtonPanel: true,
|
|
timeOnly: false,
|
|
showHour: null,
|
|
showMinute: null,
|
|
showSecond: null,
|
|
showMillisec: null,
|
|
showMicrosec: null,
|
|
showTimezone: null,
|
|
showTime: true,
|
|
stepHour: 1,
|
|
stepMinute: 1,
|
|
stepSecond: 1,
|
|
stepMillisec: 1,
|
|
stepMicrosec: 1,
|
|
hour: 0,
|
|
minute: 0,
|
|
second: 0,
|
|
millisec: 0,
|
|
microsec: 0,
|
|
timezone: null,
|
|
hourMin: 0,
|
|
minuteMin: 0,
|
|
secondMin: 0,
|
|
millisecMin: 0,
|
|
microsecMin: 0,
|
|
hourMax: 23,
|
|
minuteMax: 59,
|
|
secondMax: 59,
|
|
millisecMax: 999,
|
|
microsecMax: 999,
|
|
minDateTime: null,
|
|
maxDateTime: null,
|
|
onSelect: null,
|
|
hourGrid: 0,
|
|
minuteGrid: 0,
|
|
secondGrid: 0,
|
|
millisecGrid: 0,
|
|
microsecGrid: 0,
|
|
alwaysSetTime: true,
|
|
separator: ' ',
|
|
altFieldTimeOnly: true,
|
|
altTimeFormat: null,
|
|
altSeparator: null,
|
|
altTimeSuffix: null,
|
|
pickerTimeFormat: null,
|
|
pickerTimeSuffix: null,
|
|
showTimepicker: true,
|
|
timezoneList: null,
|
|
addSliderAccess: false,
|
|
sliderAccessArgs: null,
|
|
controlType: 'slider',
|
|
defaultValue: null,
|
|
parse: 'strict'
|
|
};
|
|
$.extend(this._defaults, this.regional['']);
|
|
};
|
|
|
|
$.extend(Timepicker.prototype, {
|
|
$input: null,
|
|
$altInput: null,
|
|
$timeObj: null,
|
|
inst: null,
|
|
hour_slider: null,
|
|
minute_slider: null,
|
|
second_slider: null,
|
|
millisec_slider: null,
|
|
microsec_slider: null,
|
|
timezone_select: null,
|
|
hour: 0,
|
|
minute: 0,
|
|
second: 0,
|
|
millisec: 0,
|
|
microsec: 0,
|
|
timezone: null,
|
|
hourMinOriginal: null,
|
|
minuteMinOriginal: null,
|
|
secondMinOriginal: null,
|
|
millisecMinOriginal: null,
|
|
microsecMinOriginal: null,
|
|
hourMaxOriginal: null,
|
|
minuteMaxOriginal: null,
|
|
secondMaxOriginal: null,
|
|
millisecMaxOriginal: null,
|
|
microsecMaxOriginal: null,
|
|
ampm: '',
|
|
formattedDate: '',
|
|
formattedTime: '',
|
|
formattedDateTime: '',
|
|
timezoneList: null,
|
|
units: ['hour', 'minute', 'second', 'millisec', 'microsec'],
|
|
support: {},
|
|
control: null,
|
|
|
|
/*
|
|
* Override the default settings for all instances of the time picker.
|
|
* @param {Object} settings object - the new settings to use as defaults (anonymous object)
|
|
* @return {Object} the manager object
|
|
*/
|
|
setDefaults: function (settings) {
|
|
extendRemove(this._defaults, settings || {});
|
|
return this;
|
|
},
|
|
|
|
/*
|
|
* Create a new Timepicker instance
|
|
*/
|
|
_newInst: function ($input, opts) {
|
|
var tp_inst = new Timepicker(),
|
|
inlineSettings = {},
|
|
fns = {},
|
|
overrides, i;
|
|
|
|
for (var attrName in this._defaults) {
|
|
if (this._defaults.hasOwnProperty(attrName)) {
|
|
var attrValue = $input.attr('time:' + attrName);
|
|
if (attrValue) {
|
|
try {
|
|
inlineSettings[attrName] = eval(attrValue);
|
|
} catch (err) {
|
|
inlineSettings[attrName] = attrValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
overrides = {
|
|
beforeShow: function (input, dp_inst) {
|
|
if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) {
|
|
return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst);
|
|
}
|
|
},
|
|
onChangeMonthYear: function (year, month, dp_inst) {
|
|
// Update the time as well : this prevents the time from disappearing from the $input field.
|
|
tp_inst._updateDateTime(dp_inst);
|
|
if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) {
|
|
tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);
|
|
}
|
|
},
|
|
onClose: function (dateText, dp_inst) {
|
|
if (tp_inst.timeDefined === true && $input.val() !== '') {
|
|
tp_inst._updateDateTime(dp_inst);
|
|
}
|
|
if ($.isFunction(tp_inst._defaults.evnts.onClose)) {
|
|
tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst);
|
|
}
|
|
}
|
|
};
|
|
for (i in overrides) {
|
|
if (overrides.hasOwnProperty(i)) {
|
|
fns[i] = opts[i] || null;
|
|
}
|
|
}
|
|
|
|
tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, {
|
|
evnts: fns,
|
|
timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');
|
|
});
|
|
tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) {
|
|
return val.toUpperCase();
|
|
});
|
|
tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) {
|
|
return val.toUpperCase();
|
|
});
|
|
|
|
// detect which units are supported
|
|
tp_inst.support = detectSupport(
|
|
tp_inst._defaults.timeFormat +
|
|
(tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') +
|
|
(tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : ''));
|
|
|
|
// controlType is string - key to our this._controls
|
|
if (typeof(tp_inst._defaults.controlType) === 'string') {
|
|
if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') {
|
|
tp_inst._defaults.controlType = 'select';
|
|
}
|
|
tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType];
|
|
}
|
|
// controlType is an object and must implement create, options, value methods
|
|
else {
|
|
tp_inst.control = tp_inst._defaults.controlType;
|
|
}
|
|
|
|
// prep the timezone options
|
|
var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60,
|
|
0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840];
|
|
if (tp_inst._defaults.timezoneList !== null) {
|
|
timezoneList = tp_inst._defaults.timezoneList;
|
|
}
|
|
var tzl = timezoneList.length, tzi = 0, tzv = null;
|
|
if (tzl > 0 && typeof timezoneList[0] !== 'object') {
|
|
for (; tzi < tzl; tzi++) {
|
|
tzv = timezoneList[tzi];
|
|
timezoneList[tzi] = {
|
|
value: tzv,
|
|
label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601)
|
|
};
|
|
}
|
|
}
|
|
tp_inst._defaults.timezoneList = timezoneList;
|
|
|
|
// set the default units
|
|
tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) :
|
|
((new Date()).getTimezoneOffset() * -1);
|
|
tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin :
|
|
tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour;
|
|
tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin :
|
|
tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute;
|
|
tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin :
|
|
tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second;
|
|
tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin :
|
|
tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec;
|
|
tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin :
|
|
tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec;
|
|
tp_inst.ampm = '';
|
|
tp_inst.$input = $input;
|
|
|
|
if (tp_inst._defaults.altField) {
|
|
tp_inst.$altInput = $(tp_inst._defaults.altField).css({
|
|
cursor: 'pointer'
|
|
}).focus(function () {
|
|
$input.trigger("focus");
|
|
});
|
|
}
|
|
|
|
if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) {
|
|
tp_inst._defaults.minDate = new Date();
|
|
}
|
|
if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) {
|
|
tp_inst._defaults.maxDate = new Date();
|
|
}
|
|
|
|
// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..
|
|
if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) {
|
|
tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());
|
|
}
|
|
if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) {
|
|
tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());
|
|
}
|
|
if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) {
|
|
tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());
|
|
}
|
|
if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) {
|
|
tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());
|
|
}
|
|
tp_inst.$input.bind('focus', function () {
|
|
tp_inst._onFocus();
|
|
});
|
|
|
|
return tp_inst;
|
|
},
|
|
|
|
/*
|
|
* add our sliders to the calendar
|
|
*/
|
|
_addTimePicker: function (dp_inst) {
|
|
var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val();
|
|
|
|
this.timeDefined = this._parseTime(currDT);
|
|
this._limitMinMaxDateTime(dp_inst, false);
|
|
this._injectTimePicker();
|
|
},
|
|
|
|
/*
|
|
* parse the time string from input value or _setTime
|
|
*/
|
|
_parseTime: function (timeString, withDate) {
|
|
if (!this.inst) {
|
|
this.inst = $.datepicker._getInst(this.$input[0]);
|
|
}
|
|
|
|
if (withDate || !this._defaults.timeOnly) {
|
|
var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');
|
|
try {
|
|
var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults);
|
|
if (!parseRes.timeObj) {
|
|
return false;
|
|
}
|
|
$.extend(this, parseRes.timeObj);
|
|
} catch (err) {
|
|
$.timepicker.log("Error parsing the date/time string: " + err +
|
|
"\ndate/time string = " + timeString +
|
|
"\ntimeFormat = " + this._defaults.timeFormat +
|
|
"\ndateFormat = " + dp_dateFormat);
|
|
return false;
|
|
}
|
|
return true;
|
|
} else {
|
|
var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults);
|
|
if (!timeObj) {
|
|
return false;
|
|
}
|
|
$.extend(this, timeObj);
|
|
return true;
|
|
}
|
|
},
|
|
|
|
/*
|
|
* generate and inject html for timepicker into ui datepicker
|
|
*/
|
|
_injectTimePicker: function () {
|
|
var $dp = this.inst.dpDiv,
|
|
o = this.inst.settings,
|
|
tp_inst = this,
|
|
litem = '',
|
|
uitem = '',
|
|
show = null,
|
|
max = {},
|
|
gridSize = {},
|
|
size = null,
|
|
i = 0,
|
|
l = 0;
|
|
|
|
// Prevent displaying twice
|
|
if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) {
|
|
var noDisplay = ' style="display:none;"',
|
|
html = '<div class="ui-timepicker-div' + (o.isRTL ? ' ui-timepicker-rtl' : '') + '"><dl>' + '<dt class="ui_tpicker_time_label"' + ((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +
|
|
'<dd class="ui_tpicker_time"' + ((o.showTime) ? '' : noDisplay) + '></dd>';
|
|
|
|
// Create the markup
|
|
for (i = 0, l = this.units.length; i < l; i++) {
|
|
litem = this.units[i];
|
|
uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
|
|
show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
|
|
|
|
// Added by Peter Medeiros:
|
|
// - Figure out what the hour/minute/second max should be based on the step values.
|
|
// - Example: if stepMinute is 15, then minMax is 45.
|
|
max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10);
|
|
gridSize[litem] = 0;
|
|
|
|
html += '<dt class="ui_tpicker_' + litem + '_label"' + (show ? '' : noDisplay) + '>' + o[litem + 'Text'] + '</dt>' +
|
|
'<dd class="ui_tpicker_' + litem + '"><div class="ui_tpicker_' + litem + '_slider"' + (show ? '' : noDisplay) + '></div>';
|
|
|
|
if (show && o[litem + 'Grid'] > 0) {
|
|
html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
|
|
|
|
if (litem === 'hour') {
|
|
for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) {
|
|
gridSize[litem]++;
|
|
var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o);
|
|
html += '<td data-for="' + litem + '">' + tmph + '</td>';
|
|
}
|
|
}
|
|
else {
|
|
for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) {
|
|
gridSize[litem]++;
|
|
html += '<td data-for="' + litem + '">' + ((m < 10) ? '0' : '') + m + '</td>';
|
|
}
|
|
}
|
|
|
|
html += '</tr></table></div>';
|
|
}
|
|
html += '</dd>';
|
|
}
|
|
|
|
// Timezone
|
|
var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone;
|
|
html += '<dt class="ui_tpicker_timezone_label"' + (showTz ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';
|
|
html += '<dd class="ui_tpicker_timezone" ' + (showTz ? '' : noDisplay) + '></dd>';
|
|
|
|
// Create the elements from string
|
|
html += '</dl></div>';
|
|
var $tp = $(html);
|
|
|
|
// if we only want time picker...
|
|
if (o.timeOnly === true) {
|
|
$tp.prepend('<div class="ui-widget-header ui-helper-clearfix ui-corner-all">' + '<div class="ui-datepicker-title">' + o.timeOnlyTitle + '</div>' + '</div>');
|
|
$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();
|
|
}
|
|
|
|
// add sliders, adjust grids, add events
|
|
for (i = 0, l = tp_inst.units.length; i < l; i++) {
|
|
litem = tp_inst.units[i];
|
|
uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1);
|
|
show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem];
|
|
|
|
// add the slider
|
|
tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]);
|
|
|
|
// adjust the grid and add click event
|
|
if (show && o[litem + 'Grid'] > 0) {
|
|
size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']);
|
|
$tp.find('.ui_tpicker_' + litem + ' table').css({
|
|
width: size + "%",
|
|
marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"),
|
|
marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0',
|
|
borderCollapse: 'collapse'
|
|
}).find("td").click(function (e) {
|
|
var $t = $(this),
|
|
h = $t.html(),
|
|
n = parseInt(h.replace(/[^0-9]/g), 10),
|
|
ap = h.replace(/[^apm]/ig),
|
|
f = $t.data('for'); // loses scope, so we use data-for
|
|
|
|
if (f === 'hour') {
|
|
if (ap.indexOf('p') !== -1 && n < 12) {
|
|
n += 12;
|
|
}
|
|
else {
|
|
if (ap.indexOf('a') !== -1 && n === 12) {
|
|
n = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n);
|
|
|
|
tp_inst._onTimeChange();
|
|
tp_inst._onSelectHandler();
|
|
}).css({
|
|
cursor: 'pointer',
|
|
width: (100 / gridSize[litem]) + '%',
|
|
textAlign: 'center',
|
|
overflow: 'hidden'
|
|
});
|
|
} // end if grid > 0
|
|
} // end for loop
|
|
|
|
// Add timezone options
|
|
this.timezone_select = $tp.find('.ui_tpicker_timezone').append('<select></select>').find("select");
|
|
$.fn.append.apply(this.timezone_select,
|
|
$.map(o.timezoneList, function (val, idx) {
|
|
return $("<option />").val(typeof val === "object" ? val.value : val).text(typeof val === "object" ? val.label : val);
|
|
}));
|
|
if (typeof(this.timezone) !== "undefined" && this.timezone !== null && this.timezone !== "") {
|
|
var local_timezone = (new Date(this.inst.selectedYear, this.inst.selectedMonth, this.inst.selectedDay, 12)).getTimezoneOffset() * -1;
|
|
if (local_timezone === this.timezone) {
|
|
selectLocalTimezone(tp_inst);
|
|
} else {
|
|
this.timezone_select.val(this.timezone);
|
|
}
|
|
} else {
|
|
if (typeof(this.hour) !== "undefined" && this.hour !== null && this.hour !== "") {
|
|
this.timezone_select.val(o.timezone);
|
|
} else {
|
|
selectLocalTimezone(tp_inst);
|
|
}
|
|
}
|
|
this.timezone_select.change(function () {
|
|
tp_inst._onTimeChange();
|
|
tp_inst._onSelectHandler();
|
|
});
|
|
// End timezone options
|
|
|
|
// inject timepicker into datepicker
|
|
var $buttonPanel = $dp.find('.ui-datepicker-buttonpane');
|
|
if ($buttonPanel.length) {
|
|
$buttonPanel.before($tp);
|
|
} else {
|
|
$dp.append($tp);
|
|
}
|
|
|
|
this.$timeObj = $tp.find('.ui_tpicker_time');
|
|
|
|
if (this.inst !== null) {
|
|
var timeDefined = this.timeDefined;
|
|
this._onTimeChange();
|
|
this.timeDefined = timeDefined;
|
|
}
|
|
|
|
// slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
|
|
if (this._defaults.addSliderAccess) {
|
|
var sliderAccessArgs = this._defaults.sliderAccessArgs,
|
|
rtl = this._defaults.isRTL;
|
|
sliderAccessArgs.isRTL = rtl;
|
|
|
|
setTimeout(function () { // fix for inline mode
|
|
if ($tp.find('.ui-slider-access').length === 0) {
|
|
$tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
|
|
|
|
// fix any grids since sliders are shorter
|
|
var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
|
|
if (sliderAccessWidth) {
|
|
$tp.find('table:visible').each(function () {
|
|
var $g = $(this),
|
|
oldWidth = $g.outerWidth(),
|
|
oldMarginLeft = $g.css(rtl ? 'marginRight' : 'marginLeft').toString().replace('%', ''),
|
|
newWidth = oldWidth - sliderAccessWidth,
|
|
newMarginLeft = ((oldMarginLeft * newWidth) / oldWidth) + '%',
|
|
css = {width: newWidth, marginRight: 0, marginLeft: 0};
|
|
css[rtl ? 'marginRight' : 'marginLeft'] = newMarginLeft;
|
|
$g.css(css);
|
|
});
|
|
}
|
|
}
|
|
}, 10);
|
|
}
|
|
// end slideAccess integration
|
|
|
|
tp_inst._limitMinMaxDateTime(this.inst, true);
|
|
}
|
|
},
|
|
|
|
/*
|
|
* This function tries to limit the ability to go outside the
|
|
* min/max date range
|
|
*/
|
|
_limitMinMaxDateTime: function (dp_inst, adjustSliders) {
|
|
var o = this._defaults,
|
|
dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);
|
|
|
|
if (!this._defaults.showTimepicker) {
|
|
return;
|
|
} // No time so nothing to check here
|
|
|
|
if ($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date) {
|
|
var minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),
|
|
minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
|
|
|
|
if (this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null || this.microsecMinOriginal === null) {
|
|
this.hourMinOriginal = o.hourMin;
|
|
this.minuteMinOriginal = o.minuteMin;
|
|
this.secondMinOriginal = o.secondMin;
|
|
this.millisecMinOriginal = o.millisecMin;
|
|
this.microsecMinOriginal = o.microsecMin;
|
|
}
|
|
|
|
if (dp_inst.settings.timeOnly || minDateTimeDate.getTime() === dp_date.getTime()) {
|
|
this._defaults.hourMin = minDateTime.getHours();
|
|
if (this.hour <= this._defaults.hourMin) {
|
|
this.hour = this._defaults.hourMin;
|
|
this._defaults.minuteMin = minDateTime.getMinutes();
|
|
if (this.minute <= this._defaults.minuteMin) {
|
|
this.minute = this._defaults.minuteMin;
|
|
this._defaults.secondMin = minDateTime.getSeconds();
|
|
if (this.second <= this._defaults.secondMin) {
|
|
this.second = this._defaults.secondMin;
|
|
this._defaults.millisecMin = minDateTime.getMilliseconds();
|
|
if (this.millisec <= this._defaults.millisecMin) {
|
|
this.millisec = this._defaults.millisecMin;
|
|
this._defaults.microsecMin = minDateTime.getMicroseconds();
|
|
} else {
|
|
if (this.microsec < this._defaults.microsecMin) {
|
|
this.microsec = this._defaults.microsecMin;
|
|
}
|
|
this._defaults.microsecMin = this.microsecMinOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.millisecMin = this.millisecMinOriginal;
|
|
this._defaults.microsecMin = this.microsecMinOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.secondMin = this.secondMinOriginal;
|
|
this._defaults.millisecMin = this.millisecMinOriginal;
|
|
this._defaults.microsecMin = this.microsecMinOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.minuteMin = this.minuteMinOriginal;
|
|
this._defaults.secondMin = this.secondMinOriginal;
|
|
this._defaults.millisecMin = this.millisecMinOriginal;
|
|
this._defaults.microsecMin = this.microsecMinOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.hourMin = this.hourMinOriginal;
|
|
this._defaults.minuteMin = this.minuteMinOriginal;
|
|
this._defaults.secondMin = this.secondMinOriginal;
|
|
this._defaults.millisecMin = this.millisecMinOriginal;
|
|
this._defaults.microsecMin = this.microsecMinOriginal;
|
|
}
|
|
}
|
|
|
|
if ($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date) {
|
|
var maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),
|
|
maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
|
|
|
|
if (this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null || this.millisecMaxOriginal === null) {
|
|
this.hourMaxOriginal = o.hourMax;
|
|
this.minuteMaxOriginal = o.minuteMax;
|
|
this.secondMaxOriginal = o.secondMax;
|
|
this.millisecMaxOriginal = o.millisecMax;
|
|
this.microsecMaxOriginal = o.microsecMax;
|
|
}
|
|
|
|
if (dp_inst.settings.timeOnly || maxDateTimeDate.getTime() === dp_date.getTime()) {
|
|
this._defaults.hourMax = maxDateTime.getHours();
|
|
if (this.hour >= this._defaults.hourMax) {
|
|
this.hour = this._defaults.hourMax;
|
|
this._defaults.minuteMax = maxDateTime.getMinutes();
|
|
if (this.minute >= this._defaults.minuteMax) {
|
|
this.minute = this._defaults.minuteMax;
|
|
this._defaults.secondMax = maxDateTime.getSeconds();
|
|
if (this.second >= this._defaults.secondMax) {
|
|
this.second = this._defaults.secondMax;
|
|
this._defaults.millisecMax = maxDateTime.getMilliseconds();
|
|
if (this.millisec >= this._defaults.millisecMax) {
|
|
this.millisec = this._defaults.millisecMax;
|
|
this._defaults.microsecMax = maxDateTime.getMicroseconds();
|
|
} else {
|
|
if (this.microsec > this._defaults.microsecMax) {
|
|
this.microsec = this._defaults.microsecMax;
|
|
}
|
|
this._defaults.microsecMax = this.microsecMaxOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.millisecMax = this.millisecMaxOriginal;
|
|
this._defaults.microsecMax = this.microsecMaxOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.secondMax = this.secondMaxOriginal;
|
|
this._defaults.millisecMax = this.millisecMaxOriginal;
|
|
this._defaults.microsecMax = this.microsecMaxOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.minuteMax = this.minuteMaxOriginal;
|
|
this._defaults.secondMax = this.secondMaxOriginal;
|
|
this._defaults.millisecMax = this.millisecMaxOriginal;
|
|
this._defaults.microsecMax = this.microsecMaxOriginal;
|
|
}
|
|
} else {
|
|
this._defaults.hourMax = this.hourMaxOriginal;
|
|
this._defaults.minuteMax = this.minuteMaxOriginal;
|
|
this._defaults.secondMax = this.secondMaxOriginal;
|
|
this._defaults.millisecMax = this.millisecMaxOriginal;
|
|
this._defaults.microsecMax = this.microsecMaxOriginal;
|
|
}
|
|
}
|
|
|
|
if (adjustSliders !== undefined && adjustSliders === true) {
|
|
var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)), 10),
|
|
minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)), 10),
|
|
secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)), 10),
|
|
millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)), 10),
|
|
microsecMax = parseInt((this._defaults.microsecMax - ((this._defaults.microsecMax - this._defaults.microsecMin) % this._defaults.stepMicrosec)), 10);
|
|
|
|
if (this.hour_slider) {
|
|
this.control.options(this, this.hour_slider, 'hour', {min: this._defaults.hourMin, max: hourMax});
|
|
this.control.value(this, this.hour_slider, 'hour', this.hour - (this.hour % this._defaults.stepHour));
|
|
}
|
|
if (this.minute_slider) {
|
|
this.control.options(this, this.minute_slider, 'minute', {
|
|
min: this._defaults.minuteMin,
|
|
max: minMax
|
|
});
|
|
this.control.value(this, this.minute_slider, 'minute', this.minute - (this.minute % this._defaults.stepMinute));
|
|
}
|
|
if (this.second_slider) {
|
|
this.control.options(this, this.second_slider, 'second', {
|
|
min: this._defaults.secondMin,
|
|
max: secMax
|
|
});
|
|
this.control.value(this, this.second_slider, 'second', this.second - (this.second % this._defaults.stepSecond));
|
|
}
|
|
if (this.millisec_slider) {
|
|
this.control.options(this, this.millisec_slider, 'millisec', {
|
|
min: this._defaults.millisecMin,
|
|
max: millisecMax
|
|
});
|
|
this.control.value(this, this.millisec_slider, 'millisec', this.millisec - (this.millisec % this._defaults.stepMillisec));
|
|
}
|
|
if (this.microsec_slider) {
|
|
this.control.options(this, this.microsec_slider, 'microsec', {
|
|
min: this._defaults.microsecMin,
|
|
max: microsecMax
|
|
});
|
|
this.control.value(this, this.microsec_slider, 'microsec', this.microsec - (this.microsec % this._defaults.stepMicrosec));
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
/*
|
|
* when a slider moves, set the internal time...
|
|
* on time change is also called when the time is updated in the text field
|
|
*/
|
|
_onTimeChange: function () {
|
|
if (!this._defaults.showTimepicker) {
|
|
return;
|
|
}
|
|
var hour = (this.hour_slider) ? this.control.value(this, this.hour_slider, 'hour') : false,
|
|
minute = (this.minute_slider) ? this.control.value(this, this.minute_slider, 'minute') : false,
|
|
second = (this.second_slider) ? this.control.value(this, this.second_slider, 'second') : false,
|
|
millisec = (this.millisec_slider) ? this.control.value(this, this.millisec_slider, 'millisec') : false,
|
|
microsec = (this.microsec_slider) ? this.control.value(this, this.microsec_slider, 'microsec') : false,
|
|
timezone = (this.timezone_select) ? this.timezone_select.val() : false,
|
|
o = this._defaults,
|
|
pickerTimeFormat = o.pickerTimeFormat || o.timeFormat,
|
|
pickerTimeSuffix = o.pickerTimeSuffix || o.timeSuffix;
|
|
|
|
if (typeof(hour) === 'object') {
|
|
hour = false;
|
|
}
|
|
if (typeof(minute) === 'object') {
|
|
minute = false;
|
|
}
|
|
if (typeof(second) === 'object') {
|
|
second = false;
|
|
}
|
|
if (typeof(millisec) === 'object') {
|
|
millisec = false;
|
|
}
|
|
if (typeof(microsec) === 'object') {
|
|
microsec = false;
|
|
}
|
|
if (typeof(timezone) === 'object') {
|
|
timezone = false;
|
|
}
|
|
|
|
if (hour !== false) {
|
|
hour = parseInt(hour, 10);
|
|
}
|
|
if (minute !== false) {
|
|
minute = parseInt(minute, 10);
|
|
}
|
|
if (second !== false) {
|
|
second = parseInt(second, 10);
|
|
}
|
|
if (millisec !== false) {
|
|
millisec = parseInt(millisec, 10);
|
|
}
|
|
if (microsec !== false) {
|
|
microsec = parseInt(microsec, 10);
|
|
}
|
|
if (timezone !== false) {
|
|
timezone = timezone.toString();
|
|
}
|
|
|
|
var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
|
|
|
|
// If the update was done in the input field, the input field should not be updated.
|
|
// If the update was done using the sliders, update the input field.
|
|
var hasChanged = (
|
|
hour !== parseInt(this.hour, 10) || // sliders should all be numeric
|
|
minute !== parseInt(this.minute, 10) ||
|
|
second !== parseInt(this.second, 10) ||
|
|
millisec !== parseInt(this.millisec, 10) ||
|
|
microsec !== parseInt(this.microsec, 10) ||
|
|
(this.ampm.length > 0 && (hour < 12) !== ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1)) ||
|
|
(this.timezone !== null && timezone !== this.timezone.toString()) // could be numeric or "EST" format, so use toString()
|
|
);
|
|
|
|
if (hasChanged) {
|
|
|
|
if (hour !== false) {
|
|
this.hour = hour;
|
|
}
|
|
if (minute !== false) {
|
|
this.minute = minute;
|
|
}
|
|
if (second !== false) {
|
|
this.second = second;
|
|
}
|
|
if (millisec !== false) {
|
|
this.millisec = millisec;
|
|
}
|
|
if (microsec !== false) {
|
|
this.microsec = microsec;
|
|
}
|
|
if (timezone !== false) {
|
|
this.timezone = timezone;
|
|
}
|
|
|
|
if (!this.inst) {
|
|
this.inst = $.datepicker._getInst(this.$input[0]);
|
|
}
|
|
|
|
this._limitMinMaxDateTime(this.inst, true);
|
|
}
|
|
if (this.support.ampm) {
|
|
this.ampm = ampm;
|
|
}
|
|
|
|
// Updates the time within the timepicker
|
|
this.formattedTime = $.datepicker.formatTime(o.timeFormat, this, o);
|
|
if (this.$timeObj) {
|
|
if (pickerTimeFormat === o.timeFormat) {
|
|
this.$timeObj.text(this.formattedTime + pickerTimeSuffix);
|
|
}
|
|
else {
|
|
this.$timeObj.text($.datepicker.formatTime(pickerTimeFormat, this, o) + pickerTimeSuffix);
|
|
}
|
|
}
|
|
|
|
this.timeDefined = true;
|
|
if (hasChanged) {
|
|
this._updateDateTime();
|
|
this.$input.focus();
|
|
}
|
|
},
|
|
|
|
/*
|
|
* call custom onSelect.
|
|
* bind to sliders slidestop, and grid click.
|
|
*/
|
|
_onSelectHandler: function () {
|
|
var onSelect = this._defaults.onSelect || this.inst.settings.onSelect;
|
|
var inputEl = this.$input ? this.$input[0] : null;
|
|
if (onSelect && inputEl) {
|
|
onSelect.apply(inputEl, [this.formattedDateTime, this]);
|
|
}
|
|
},
|
|
|
|
/*
|
|
* update our input with the new date time..
|
|
*/
|
|
_updateDateTime: function (dp_inst) {
|
|
dp_inst = this.inst || dp_inst;
|
|
var dtTmp = (dp_inst.currentYear > 0 ?
|
|
new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay) :
|
|
new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
|
|
dt = $.datepicker._daylightSavingAdjust(dtTmp),
|
|
//dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay)),
|
|
//dt = $.datepicker._daylightSavingAdjust(new Date(dp_inst.currentYear, dp_inst.currentMonth, dp_inst.currentDay)),
|
|
dateFmt = $.datepicker._get(dp_inst, 'dateFormat'),
|
|
formatCfg = $.datepicker._getFormatConfig(dp_inst),
|
|
timeAvailable = dt !== null && this.timeDefined;
|
|
this.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);
|
|
var formattedDateTime = this.formattedDate;
|
|
|
|
// if a slider was changed but datepicker doesn't have a value yet, set it
|
|
if (dp_inst.lastVal === "") {
|
|
dp_inst.currentYear = dp_inst.selectedYear;
|
|
dp_inst.currentMonth = dp_inst.selectedMonth;
|
|
dp_inst.currentDay = dp_inst.selectedDay;
|
|
}
|
|
|
|
/*
|
|
* remove following lines to force every changes in date picker to change the input value
|
|
* Bug descriptions: when an input field has a default value, and click on the field to pop up the date picker.
|
|
* If the user manually empty the value in the input field, the date picker will never change selected value.
|
|
*/
|
|
//if (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0)) {
|
|
// return;
|
|
//}
|
|
|
|
if (this._defaults.timeOnly === true) {
|
|
formattedDateTime = this.formattedTime;
|
|
} else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {
|
|
formattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;
|
|
}
|
|
|
|
this.formattedDateTime = formattedDateTime;
|
|
|
|
if (!this._defaults.showTimepicker) {
|
|
this.$input.val(this.formattedDate);
|
|
} else if (this.$altInput && this._defaults.timeOnly === false && this._defaults.altFieldTimeOnly === true) {
|
|
this.$altInput.val(this.formattedTime);
|
|
this.$input.val(this.formattedDate);
|
|
} else if (this.$altInput) {
|
|
this.$input.val(formattedDateTime);
|
|
var altFormattedDateTime = '',
|
|
altSeparator = this._defaults.altSeparator ? this._defaults.altSeparator : this._defaults.separator,
|
|
altTimeSuffix = this._defaults.altTimeSuffix ? this._defaults.altTimeSuffix : this._defaults.timeSuffix;
|
|
|
|
if (!this._defaults.timeOnly) {
|
|
if (this._defaults.altFormat) {
|
|
altFormattedDateTime = $.datepicker.formatDate(this._defaults.altFormat, (dt === null ? new Date() : dt), formatCfg);
|
|
}
|
|
else {
|
|
altFormattedDateTime = this.formattedDate;
|
|
}
|
|
|
|
if (altFormattedDateTime) {
|
|
altFormattedDateTime += altSeparator;
|
|
}
|
|
}
|
|
|
|
if (this._defaults.altTimeFormat) {
|
|
altFormattedDateTime += $.datepicker.formatTime(this._defaults.altTimeFormat, this, this._defaults) + altTimeSuffix;
|
|
}
|
|
else {
|
|
altFormattedDateTime += this.formattedTime + altTimeSuffix;
|
|
}
|
|
this.$altInput.val(altFormattedDateTime);
|
|
} else {
|
|
this.$input.val(formattedDateTime);
|
|
}
|
|
|
|
this.$input.trigger("change");
|
|
},
|
|
|
|
_onFocus: function () {
|
|
if (!this.$input.val() && this._defaults.defaultValue) {
|
|
this.$input.val(this._defaults.defaultValue);
|
|
var inst = $.datepicker._getInst(this.$input.get(0)),
|
|
tp_inst = $.datepicker._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
|
|
try {
|
|
$.datepicker._updateDatepicker(inst);
|
|
} catch (err) {
|
|
$.timepicker.log(err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
/*
|
|
* Small abstraction to control types
|
|
* We can add more, just be sure to follow the pattern: create, options, value
|
|
*/
|
|
_controls: {
|
|
// slider methods
|
|
slider: {
|
|
create: function (tp_inst, obj, unit, val, min, max, step) {
|
|
var rtl = tp_inst._defaults.isRTL; // if rtl go -60->0 instead of 0->60
|
|
return obj.prop('slide', null).slider({
|
|
orientation: "horizontal",
|
|
value: rtl ? val * -1 : val,
|
|
min: rtl ? max * -1 : min,
|
|
max: rtl ? min * -1 : max,
|
|
step: step,
|
|
slide: function (event, ui) {
|
|
tp_inst.control.value(tp_inst, $(this), unit, rtl ? ui.value * -1 : ui.value);
|
|
tp_inst._onTimeChange();
|
|
},
|
|
stop: function (event, ui) {
|
|
tp_inst._onSelectHandler();
|
|
}
|
|
});
|
|
},
|
|
options: function (tp_inst, obj, unit, opts, val) {
|
|
if (tp_inst._defaults.isRTL) {
|
|
if (typeof(opts) === 'string') {
|
|
if (opts === 'min' || opts === 'max') {
|
|
if (val !== undefined) {
|
|
return obj.slider(opts, val * -1);
|
|
}
|
|
return Math.abs(obj.slider(opts));
|
|
}
|
|
return obj.slider(opts);
|
|
}
|
|
var min = opts.min,
|
|
max = opts.max;
|
|
opts.min = opts.max = null;
|
|
if (min !== undefined) {
|
|
opts.max = min * -1;
|
|
}
|
|
if (max !== undefined) {
|
|
opts.min = max * -1;
|
|
}
|
|
return obj.slider(opts);
|
|
}
|
|
if (typeof(opts) === 'string' && val !== undefined) {
|
|
return obj.slider(opts, val);
|
|
}
|
|
return obj.slider(opts);
|
|
},
|
|
value: function (tp_inst, obj, unit, val) {
|
|
if (tp_inst._defaults.isRTL) {
|
|
if (val !== undefined) {
|
|
return obj.slider('value', val * -1);
|
|
}
|
|
return Math.abs(obj.slider('value'));
|
|
}
|
|
if (val !== undefined) {
|
|
return obj.slider('value', val);
|
|
}
|
|
return obj.slider('value');
|
|
}
|
|
},
|
|
// select methods
|
|
select: {
|
|
create: function (tp_inst, obj, unit, val, min, max, step) {
|
|
var sel = '<select class="ui-timepicker-select" data-unit="' + unit + '" data-min="' + min + '" data-max="' + max + '" data-step="' + step + '">',
|
|
format = tp_inst._defaults.pickerTimeFormat || tp_inst._defaults.timeFormat;
|
|
|
|
for (var i = min; i <= max; i += step) {
|
|
sel += '<option value="' + i + '"' + (i === val ? ' selected' : '') + '>';
|
|
if (unit === 'hour') {
|
|
sel += $.datepicker.formatTime($.trim(format.replace(/[^ht ]/ig, '')), {hour: i}, tp_inst._defaults);
|
|
}
|
|
else if (unit === 'millisec' || unit === 'microsec' || i >= 10) {
|
|
sel += i;
|
|
}
|
|
else {
|
|
sel += '0' + i.toString();
|
|
}
|
|
sel += '</option>';
|
|
}
|
|
sel += '</select>';
|
|
|
|
obj.children('select').remove();
|
|
|
|
$(sel).appendTo(obj).change(function (e) {
|
|
tp_inst._onTimeChange();
|
|
tp_inst._onSelectHandler();
|
|
});
|
|
|
|
return obj;
|
|
},
|
|
options: function (tp_inst, obj, unit, opts, val) {
|
|
var o = {},
|
|
$t = obj.children('select');
|
|
if (typeof(opts) === 'string') {
|
|
if (val === undefined) {
|
|
return $t.data(opts);
|
|
}
|
|
o[opts] = val;
|
|
}
|
|
else {
|
|
o = opts;
|
|
}
|
|
return tp_inst.control.create(tp_inst, obj, $t.data('unit'), $t.val(), o.min || $t.data('min'), o.max || $t.data('max'), o.step || $t.data('step'));
|
|
},
|
|
value: function (tp_inst, obj, unit, val) {
|
|
var $t = obj.children('select');
|
|
if (val !== undefined) {
|
|
return $t.val(val);
|
|
}
|
|
return $t.val();
|
|
}
|
|
}
|
|
} // end _controls
|
|
|
|
});
|
|
|
|
$.fn.extend({
|
|
/*
|
|
* shorthand just to use timepicker.
|
|
*/
|
|
timepicker: function (o) {
|
|
o = o || {};
|
|
var tmp_args = Array.prototype.slice.call(arguments);
|
|
|
|
if (typeof o === 'object') {
|
|
tmp_args[0] = $.extend(o, {
|
|
timeOnly: true
|
|
});
|
|
}
|
|
|
|
return $(this).each(function () {
|
|
$.fn.datetimepicker.apply($(this), tmp_args);
|
|
});
|
|
},
|
|
|
|
/*
|
|
* extend timepicker to datepicker
|
|
*/
|
|
datetimepicker: function (o) {
|
|
o = o || {};
|
|
var tmp_args = arguments;
|
|
|
|
if (typeof(o) === 'string') {
|
|
if (o === 'getDate') {
|
|
return $.fn.datepicker.apply($(this[0]), tmp_args);
|
|
} else {
|
|
return this.each(function () {
|
|
var $t = $(this);
|
|
$t.datepicker.apply($t, tmp_args);
|
|
});
|
|
}
|
|
} else {
|
|
return this.each(function () {
|
|
var $t = $(this);
|
|
$t.datepicker($.timepicker._newInst($t, o)._defaults);
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
/*
|
|
* Public Utility to parse date and time
|
|
*/
|
|
$.datepicker.parseDateTime = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
|
|
var parseRes = parseDateTimeInternal(dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings);
|
|
if (parseRes.timeObj) {
|
|
var t = parseRes.timeObj;
|
|
parseRes.date.setHours(t.hour, t.minute, t.second, t.millisec);
|
|
parseRes.date.setMicroseconds(t.microsec);
|
|
}
|
|
|
|
return parseRes.date;
|
|
};
|
|
|
|
/*
|
|
* Public utility to parse time
|
|
*/
|
|
$.datepicker.parseTime = function (timeFormat, timeString, options) {
|
|
var o = extendRemove(extendRemove({}, $.timepicker._defaults), options || {}),
|
|
iso8601 = (timeFormat.replace(/\'.*?\'/g, '').indexOf('Z') !== -1);
|
|
|
|
// Strict parse requires the timeString to match the timeFormat exactly
|
|
var strictParse = function (f, s, o) {
|
|
|
|
// pattern for standard and localized AM/PM markers
|
|
var getPatternAmpm = function (amNames, pmNames) {
|
|
var markers = [];
|
|
if (amNames) {
|
|
$.merge(markers, amNames);
|
|
}
|
|
if (pmNames) {
|
|
$.merge(markers, pmNames);
|
|
}
|
|
markers = $.map(markers, function (val) {
|
|
return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&');
|
|
});
|
|
return '(' + markers.join('|') + ')?';
|
|
};
|
|
|
|
// figure out position of time elements.. cause js cant do named captures
|
|
var getFormatPositions = function (timeFormat) {
|
|
var finds = timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|c{1}|t{1,2}|z|'.*?')/g),
|
|
orders = {
|
|
h: -1,
|
|
m: -1,
|
|
s: -1,
|
|
l: -1,
|
|
c: -1,
|
|
t: -1,
|
|
z: -1
|
|
};
|
|
|
|
if (finds) {
|
|
for (var i = 0; i < finds.length; i++) {
|
|
if (orders[finds[i].toString().charAt(0)] === -1) {
|
|
orders[finds[i].toString().charAt(0)] = i + 1;
|
|
}
|
|
}
|
|
}
|
|
return orders;
|
|
};
|
|
|
|
var regstr = '^' + f.toString()
|
|
.replace(/([hH]{1,2}|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
|
|
var ml = match.length;
|
|
switch (match.charAt(0).toLowerCase()) {
|
|
case 'h':
|
|
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
|
case 'm':
|
|
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
|
case 's':
|
|
return ml === 1 ? '(\\d?\\d)' : '(\\d{' + ml + '})';
|
|
case 'l':
|
|
return '(\\d?\\d?\\d)';
|
|
case 'c':
|
|
return '(\\d?\\d?\\d)';
|
|
case 'z':
|
|
return '(z|[-+]\\d\\d:?\\d\\d|\\S+)?';
|
|
case 't':
|
|
return getPatternAmpm(o.amNames, o.pmNames);
|
|
default: // literal escaped in quotes
|
|
return '(' + match.replace(/\'/g, "").replace(/(\.|\$|\^|\\|\/|\(|\)|\[|\]|\?|\+|\*)/g, function (m) {
|
|
return "\\" + m;
|
|
}) + ')?';
|
|
}
|
|
})
|
|
.replace(/\s/g, '\\s?') +
|
|
o.timeSuffix + '$',
|
|
order = getFormatPositions(f),
|
|
ampm = '',
|
|
treg;
|
|
|
|
treg = s.match(new RegExp(regstr, 'i'));
|
|
|
|
var resTime = {
|
|
hour: 0,
|
|
minute: 0,
|
|
second: 0,
|
|
millisec: 0,
|
|
microsec: 0
|
|
};
|
|
|
|
if (treg) {
|
|
if (order.t !== -1) {
|
|
if (treg[order.t] === undefined || treg[order.t].length === 0) {
|
|
ampm = '';
|
|
resTime.ampm = '';
|
|
} else {
|
|
ampm = $.inArray(treg[order.t].toUpperCase(), o.amNames) !== -1 ? 'AM' : 'PM';
|
|
resTime.ampm = o[ampm === 'AM' ? 'amNames' : 'pmNames'][0];
|
|
}
|
|
}
|
|
|
|
if (order.h !== -1) {
|
|
if (ampm === 'AM' && treg[order.h] === '12') {
|
|
resTime.hour = 0; // 12am = 0 hour
|
|
} else {
|
|
if (ampm === 'PM' && treg[order.h] !== '12') {
|
|
resTime.hour = parseInt(treg[order.h], 10) + 12; // 12pm = 12 hour, any other pm = hour + 12
|
|
} else {
|
|
resTime.hour = Number(treg[order.h]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (order.m !== -1) {
|
|
resTime.minute = Number(treg[order.m]);
|
|
}
|
|
if (order.s !== -1) {
|
|
resTime.second = Number(treg[order.s]);
|
|
}
|
|
if (order.l !== -1) {
|
|
resTime.millisec = Number(treg[order.l]);
|
|
}
|
|
if (order.c !== -1) {
|
|
resTime.microsec = Number(treg[order.c]);
|
|
}
|
|
if (order.z !== -1 && treg[order.z] !== undefined) {
|
|
resTime.timezone = $.timepicker.timezoneOffsetNumber(treg[order.z]);
|
|
}
|
|
|
|
|
|
return resTime;
|
|
}
|
|
return false;
|
|
};// end strictParse
|
|
|
|
// First try JS Date, if that fails, use strictParse
|
|
var looseParse = function (f, s, o) {
|
|
try {
|
|
var d = new Date('2012-01-01 ' + s);
|
|
if (isNaN(d.getTime())) {
|
|
d = new Date('2012-01-01T' + s);
|
|
if (isNaN(d.getTime())) {
|
|
d = new Date('01/01/2012 ' + s);
|
|
if (isNaN(d.getTime())) {
|
|
throw "Unable to parse time with native Date: " + s;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
hour: d.getHours(),
|
|
minute: d.getMinutes(),
|
|
second: d.getSeconds(),
|
|
millisec: d.getMilliseconds(),
|
|
microsec: d.getMicroseconds(),
|
|
timezone: d.getTimezoneOffset() * -1
|
|
};
|
|
}
|
|
catch (err) {
|
|
try {
|
|
return strictParse(f, s, o);
|
|
}
|
|
catch (err2) {
|
|
$.timepicker.log("Unable to parse \ntimeString: " + s + "\ntimeFormat: " + f);
|
|
}
|
|
}
|
|
return false;
|
|
}; // end looseParse
|
|
|
|
if (typeof o.parse === "function") {
|
|
return o.parse(timeFormat, timeString, o);
|
|
}
|
|
if (o.parse === 'loose') {
|
|
return looseParse(timeFormat, timeString, o);
|
|
}
|
|
return strictParse(timeFormat, timeString, o);
|
|
};
|
|
|
|
/**
|
|
* Public utility to format the time
|
|
* @param {string} format format of the time
|
|
* @param {Object} time Object not a Date for timezones
|
|
* @param {Object} [options] essentially the regional[].. amNames, pmNames, ampm
|
|
* @returns {string} the formatted time
|
|
*/
|
|
$.datepicker.formatTime = function (format, time, options) {
|
|
options = options || {};
|
|
options = $.extend({}, $.timepicker._defaults, options);
|
|
time = $.extend({
|
|
hour: 0,
|
|
minute: 0,
|
|
second: 0,
|
|
millisec: 0,
|
|
microsec: 0,
|
|
timezone: null
|
|
}, time);
|
|
|
|
var tmptime = format,
|
|
ampmName = options.amNames[0],
|
|
hour = parseInt(time.hour, 10);
|
|
|
|
if (hour > 11) {
|
|
ampmName = options.pmNames[0];
|
|
}
|
|
|
|
tmptime = tmptime.replace(/(?:HH?|hh?|mm?|ss?|[tT]{1,2}|[zZ]|[lc]|'.*?')/g, function (match) {
|
|
switch (match) {
|
|
case 'HH':
|
|
return ('0' + hour).slice(-2);
|
|
case 'H':
|
|
return hour;
|
|
case 'hh':
|
|
return ('0' + convert24to12(hour)).slice(-2);
|
|
case 'h':
|
|
return convert24to12(hour);
|
|
case 'mm':
|
|
return ('0' + time.minute).slice(-2);
|
|
case 'm':
|
|
return time.minute;
|
|
case 'ss':
|
|
return ('0' + time.second).slice(-2);
|
|
case 's':
|
|
return time.second;
|
|
case 'l':
|
|
return ('00' + time.millisec).slice(-3);
|
|
case 'c':
|
|
return ('00' + time.microsec).slice(-3);
|
|
case 'z':
|
|
return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, false);
|
|
case 'Z':
|
|
return $.timepicker.timezoneOffsetString(time.timezone === null ? options.timezone : time.timezone, true);
|
|
case 'T':
|
|
return ampmName.charAt(0).toUpperCase();
|
|
case 'TT':
|
|
return ampmName.toUpperCase();
|
|
case 't':
|
|
return ampmName.charAt(0).toLowerCase();
|
|
case 'tt':
|
|
return ampmName.toLowerCase();
|
|
default:
|
|
return match.replace(/'/g, "");
|
|
}
|
|
});
|
|
|
|
return tmptime;
|
|
};
|
|
|
|
/*
|
|
* the bad hack :/ override datepicker so it doesn't close on select
|
|
// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378
|
|
*/
|
|
$.datepicker._base_selectDate = $.datepicker._selectDate;
|
|
$.datepicker._selectDate = function (id, dateStr) {
|
|
var inst = this._getInst($(id)[0]),
|
|
tp_inst = this._get(inst, 'timepicker');
|
|
|
|
if (tp_inst) {
|
|
tp_inst._limitMinMaxDateTime(inst, true);
|
|
inst.inline = inst.stay_open = true;
|
|
//This way the onSelect handler called from calendarpicker get the full dateTime
|
|
this._base_selectDate(id, dateStr);
|
|
inst.inline = inst.stay_open = false;
|
|
this._notifyChange(inst);
|
|
this._updateDatepicker(inst);
|
|
} else {
|
|
this._base_selectDate(id, dateStr);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* second bad hack :/ override datepicker so it triggers an event when changing the input field
|
|
* and does not redraw the datepicker on every selectDate event
|
|
*/
|
|
$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
|
|
$.datepicker._updateDatepicker = function (inst) {
|
|
|
|
// don't popup the datepicker if there is another instance already opened
|
|
var input = inst.input[0];
|
|
if ($.datepicker._curInst && $.datepicker._curInst !== inst && $.datepicker._datepickerShowing && $.datepicker._lastInput !== input) {
|
|
return;
|
|
}
|
|
|
|
if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
|
|
|
|
this._base_updateDatepicker(inst);
|
|
|
|
// Reload the time control when changing something in the input text field.
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
tp_inst._addTimePicker(inst);
|
|
}
|
|
}
|
|
};
|
|
|
|
/*
|
|
* third bad hack :/ override datepicker so it allows spaces and colon in the input field
|
|
*/
|
|
$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;
|
|
$.datepicker._doKeyPress = function (event) {
|
|
var inst = $.datepicker._getInst(event.target),
|
|
tp_inst = $.datepicker._get(inst, 'timepicker');
|
|
|
|
if (tp_inst) {
|
|
if ($.datepicker._get(inst, 'constrainInput')) {
|
|
var ampm = tp_inst.support.ampm,
|
|
tz = tp_inst._defaults.showTimezone !== null ? tp_inst._defaults.showTimezone : tp_inst.support.timezone,
|
|
dateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),
|
|
datetimeChars = tp_inst._defaults.timeFormat.toString()
|
|
.replace(/[hms]/g, '')
|
|
.replace(/TT/g, ampm ? 'APM' : '')
|
|
.replace(/Tt/g, ampm ? 'AaPpMm' : '')
|
|
.replace(/tT/g, ampm ? 'AaPpMm' : '')
|
|
.replace(/T/g, ampm ? 'AP' : '')
|
|
.replace(/tt/g, ampm ? 'apm' : '')
|
|
.replace(/t/g, ampm ? 'ap' : '') +
|
|
" " + tp_inst._defaults.separator +
|
|
tp_inst._defaults.timeSuffix +
|
|
(tz ? tp_inst._defaults.timezoneList.join('') : '') +
|
|
(tp_inst._defaults.amNames.join('')) + (tp_inst._defaults.pmNames.join('')) +
|
|
dateChars,
|
|
chr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);
|
|
return event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);
|
|
}
|
|
}
|
|
|
|
return $.datepicker._base_doKeyPress(event);
|
|
};
|
|
|
|
/*
|
|
* Fourth bad hack :/ override _updateAlternate function used in inline mode to init altField
|
|
* Update any alternate field to synchronise with the main field.
|
|
*/
|
|
$.datepicker._base_updateAlternate = $.datepicker._updateAlternate;
|
|
$.datepicker._updateAlternate = function (inst) {
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
var altField = tp_inst._defaults.altField;
|
|
if (altField) { // update alternate field too
|
|
var altFormat = tp_inst._defaults.altFormat || tp_inst._defaults.dateFormat,
|
|
date = this._getDate(inst),
|
|
formatCfg = $.datepicker._getFormatConfig(inst),
|
|
altFormattedDateTime = '',
|
|
altSeparator = tp_inst._defaults.altSeparator ? tp_inst._defaults.altSeparator : tp_inst._defaults.separator,
|
|
altTimeSuffix = tp_inst._defaults.altTimeSuffix ? tp_inst._defaults.altTimeSuffix : tp_inst._defaults.timeSuffix,
|
|
altTimeFormat = tp_inst._defaults.altTimeFormat !== null ? tp_inst._defaults.altTimeFormat : tp_inst._defaults.timeFormat;
|
|
|
|
altFormattedDateTime += $.datepicker.formatTime(altTimeFormat, tp_inst, tp_inst._defaults) + altTimeSuffix;
|
|
if (!tp_inst._defaults.timeOnly && !tp_inst._defaults.altFieldTimeOnly && date !== null) {
|
|
if (tp_inst._defaults.altFormat) {
|
|
altFormattedDateTime = $.datepicker.formatDate(tp_inst._defaults.altFormat, date, formatCfg) + altSeparator + altFormattedDateTime;
|
|
}
|
|
else {
|
|
altFormattedDateTime = tp_inst.formattedDate + altSeparator + altFormattedDateTime;
|
|
}
|
|
}
|
|
$(altField).val(altFormattedDateTime);
|
|
}
|
|
}
|
|
else {
|
|
$.datepicker._base_updateAlternate(inst);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Override key up event to sync manual input changes.
|
|
*/
|
|
$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;
|
|
$.datepicker._doKeyUp = function (event) {
|
|
var inst = $.datepicker._getInst(event.target),
|
|
tp_inst = $.datepicker._get(inst, 'timepicker');
|
|
|
|
if (tp_inst) {
|
|
if (tp_inst._defaults.timeOnly && (inst.input.val() !== inst.lastVal)) {
|
|
try {
|
|
$.datepicker._updateDatepicker(inst);
|
|
} catch (err) {
|
|
$.timepicker.log(err);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $.datepicker._base_doKeyUp(event);
|
|
};
|
|
|
|
/*
|
|
* override "Today" button to also grab the time.
|
|
*/
|
|
$.datepicker._base_gotoToday = $.datepicker._gotoToday;
|
|
$.datepicker._gotoToday = function (id) {
|
|
var inst = this._getInst($(id)[0]),
|
|
$dp = inst.dpDiv;
|
|
this._base_gotoToday(id);
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
selectLocalTimezone(tp_inst);
|
|
var now = new Date();
|
|
this._setTime(inst, now);
|
|
$('.ui-datepicker-today', $dp).click();
|
|
};
|
|
|
|
/*
|
|
* Disable & enable the Time in the datetimepicker
|
|
*/
|
|
$.datepicker._disableTimepickerDatepicker = function (target) {
|
|
var inst = this._getInst(target);
|
|
if (!inst) {
|
|
return;
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
|
if (tp_inst) {
|
|
inst.settings.showTimepicker = false;
|
|
tp_inst._defaults.showTimepicker = false;
|
|
tp_inst._updateDateTime(inst);
|
|
}
|
|
};
|
|
|
|
$.datepicker._enableTimepickerDatepicker = function (target) {
|
|
var inst = this._getInst(target);
|
|
if (!inst) {
|
|
return;
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
$(target).datepicker('getDate'); // Init selected[Year|Month|Day]
|
|
if (tp_inst) {
|
|
inst.settings.showTimepicker = true;
|
|
tp_inst._defaults.showTimepicker = true;
|
|
tp_inst._addTimePicker(inst); // Could be disabled on page load
|
|
tp_inst._updateDateTime(inst);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Create our own set time function
|
|
*/
|
|
$.datepicker._setTime = function (inst, date) {
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
var defaults = tp_inst._defaults;
|
|
|
|
// calling _setTime with no date sets time to defaults
|
|
tp_inst.hour = date ? date.getHours() : defaults.hour;
|
|
tp_inst.minute = date ? date.getMinutes() : defaults.minute;
|
|
tp_inst.second = date ? date.getSeconds() : defaults.second;
|
|
tp_inst.millisec = date ? date.getMilliseconds() : defaults.millisec;
|
|
tp_inst.microsec = date ? date.getMicroseconds() : defaults.microsec;
|
|
|
|
//check if within min/max times..
|
|
tp_inst._limitMinMaxDateTime(inst, true);
|
|
|
|
tp_inst._onTimeChange();
|
|
tp_inst._updateDateTime(inst);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Create new public method to set only time, callable as $().datepicker('setTime', date)
|
|
*/
|
|
$.datepicker._setTimeDatepicker = function (target, date, withDate) {
|
|
var inst = this._getInst(target);
|
|
if (!inst) {
|
|
return;
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
|
|
if (tp_inst) {
|
|
this._setDateFromField(inst);
|
|
var tp_date;
|
|
if (date) {
|
|
if (typeof date === "string") {
|
|
tp_inst._parseTime(date, withDate);
|
|
tp_date = new Date();
|
|
tp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
|
|
tp_date.setMicroseconds(tp_inst.microsec);
|
|
} else {
|
|
tp_date = new Date(date.getTime());
|
|
tp_date.setMicroseconds(date.getMicroseconds());
|
|
}
|
|
if (tp_date.toString() === 'Invalid Date') {
|
|
tp_date = undefined;
|
|
}
|
|
this._setTime(inst, tp_date);
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
/*
|
|
* override setDate() to allow setting time too within Date object
|
|
*/
|
|
$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;
|
|
$.datepicker._setDateDatepicker = function (target, date) {
|
|
var inst = this._getInst(target);
|
|
if (!inst) {
|
|
return;
|
|
}
|
|
|
|
if (typeof(date) === 'string') {
|
|
date = new Date(date);
|
|
if (!date.getTime()) {
|
|
$.timepicker.log("Error creating Date object from string.");
|
|
}
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
var tp_date;
|
|
if (date instanceof Date) {
|
|
tp_date = new Date(date.getTime());
|
|
tp_date.setMicroseconds(date.getMicroseconds());
|
|
} else {
|
|
tp_date = date;
|
|
}
|
|
|
|
// This is important if you are using the timezone option, javascript's Date
|
|
// object will only return the timezone offset for the current locale, so we
|
|
// adjust it accordingly. If not using timezone option this won't matter..
|
|
// If a timezone is different in tp, keep the timezone as is
|
|
if (tp_inst) {
|
|
// look out for DST if tz wasn't specified
|
|
if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
|
|
tp_inst.timezone = tp_date.getTimezoneOffset() * -1;
|
|
}
|
|
date = $.timepicker.timezoneAdjust(date, tp_inst.timezone);
|
|
tp_date = $.timepicker.timezoneAdjust(tp_date, tp_inst.timezone);
|
|
}
|
|
|
|
this._updateDatepicker(inst);
|
|
this._base_setDateDatepicker.apply(this, arguments);
|
|
this._setTimeDatepicker(target, tp_date, true);
|
|
};
|
|
|
|
/*
|
|
* override getDate() to allow getting time too within Date object
|
|
*/
|
|
$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;
|
|
$.datepicker._getDateDatepicker = function (target, noDefault) {
|
|
var inst = this._getInst(target);
|
|
if (!inst) {
|
|
return;
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
|
|
if (tp_inst) {
|
|
// if it hasn't yet been defined, grab from field
|
|
if (inst.lastVal === undefined) {
|
|
this._setDateFromField(inst, noDefault);
|
|
}
|
|
|
|
var date = this._getDate(inst);
|
|
if (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) {
|
|
date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);
|
|
date.setMicroseconds(tp_inst.microsec);
|
|
|
|
// This is important if you are using the timezone option, javascript's Date
|
|
// object will only return the timezone offset for the current locale, so we
|
|
// adjust it accordingly. If not using timezone option this won't matter..
|
|
if (tp_inst.timezone != null) {
|
|
// look out for DST if tz wasn't specified
|
|
if (!tp_inst.support.timezone && tp_inst._defaults.timezone === null) {
|
|
tp_inst.timezone = date.getTimezoneOffset() * -1;
|
|
}
|
|
date = $.timepicker.timezoneAdjust(date, tp_inst.timezone);
|
|
}
|
|
}
|
|
return date;
|
|
}
|
|
return this._base_getDateDatepicker(target, noDefault);
|
|
};
|
|
|
|
/*
|
|
* override parseDate() because UI 1.8.14 throws an error about "Extra characters"
|
|
* An option in datapicker to ignore extra format characters would be nicer.
|
|
*/
|
|
$.datepicker._base_parseDate = $.datepicker.parseDate;
|
|
$.datepicker.parseDate = function (format, value, settings) {
|
|
var date;
|
|
try {
|
|
date = this._base_parseDate(format, value, settings);
|
|
} catch (err) {
|
|
// Hack! The error message ends with a colon, a space, and
|
|
// the "extra" characters. We rely on that instead of
|
|
// attempting to perfectly reproduce the parsing algorithm.
|
|
if (err.indexOf(":") >= 0) {
|
|
date = this._base_parseDate(format, value.substring(0, value.length - (err.length - err.indexOf(':') - 2)), settings);
|
|
$.timepicker.log("Error parsing the date string: " + err + "\ndate string = " + value + "\ndate format = " + format);
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
return date;
|
|
};
|
|
|
|
/*
|
|
* override formatDate to set date with time to the input
|
|
*/
|
|
$.datepicker._base_formatDate = $.datepicker._formatDate;
|
|
$.datepicker._formatDate = function (inst, day, month, year) {
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
tp_inst._updateDateTime(inst);
|
|
return tp_inst.$input.val();
|
|
}
|
|
return this._base_formatDate(inst);
|
|
};
|
|
|
|
/*
|
|
* override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
|
|
*/
|
|
$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
|
|
$.datepicker._optionDatepicker = function (target, name, value) {
|
|
var inst = this._getInst(target),
|
|
name_clone;
|
|
if (!inst) {
|
|
return null;
|
|
}
|
|
|
|
var tp_inst = this._get(inst, 'timepicker');
|
|
if (tp_inst) {
|
|
var min = null,
|
|
max = null,
|
|
onselect = null,
|
|
overrides = tp_inst._defaults.evnts,
|
|
fns = {},
|
|
prop;
|
|
if (typeof name === 'string') { // if min/max was set with the string
|
|
if (name === 'minDate' || name === 'minDateTime') {
|
|
min = value;
|
|
} else if (name === 'maxDate' || name === 'maxDateTime') {
|
|
max = value;
|
|
} else if (name === 'onSelect') {
|
|
onselect = value;
|
|
} else if (overrides.hasOwnProperty(name)) {
|
|
if (typeof (value) === 'undefined') {
|
|
return overrides[name];
|
|
}
|
|
fns[name] = value;
|
|
name_clone = {}; //empty results in exiting function after overrides updated
|
|
}
|
|
} else if (typeof name === 'object') { //if min/max was set with the JSON
|
|
if (name.minDate) {
|
|
min = name.minDate;
|
|
} else if (name.minDateTime) {
|
|
min = name.minDateTime;
|
|
} else if (name.maxDate) {
|
|
max = name.maxDate;
|
|
} else if (name.maxDateTime) {
|
|
max = name.maxDateTime;
|
|
}
|
|
for (prop in overrides) {
|
|
if (overrides.hasOwnProperty(prop) && name[prop]) {
|
|
fns[prop] = name[prop];
|
|
}
|
|
}
|
|
}
|
|
for (prop in fns) {
|
|
if (fns.hasOwnProperty(prop)) {
|
|
overrides[prop] = fns[prop];
|
|
if (!name_clone) {
|
|
name_clone = $.extend({}, name);
|
|
}
|
|
delete name_clone[prop];
|
|
}
|
|
}
|
|
if (name_clone && isEmptyObject(name_clone)) {
|
|
return;
|
|
}
|
|
if (min) { //if min was set
|
|
if (min === 0) {
|
|
min = new Date();
|
|
} else {
|
|
min = new Date(min);
|
|
}
|
|
tp_inst._defaults.minDate = min;
|
|
tp_inst._defaults.minDateTime = min;
|
|
} else if (max) { //if max was set
|
|
if (max === 0) {
|
|
max = new Date();
|
|
} else {
|
|
max = new Date(max);
|
|
}
|
|
tp_inst._defaults.maxDate = max;
|
|
tp_inst._defaults.maxDateTime = max;
|
|
} else if (onselect) {
|
|
tp_inst._defaults.onSelect = onselect;
|
|
}
|
|
}
|
|
if (value === undefined) {
|
|
return this._base_optionDatepicker.call($.datepicker, target, name);
|
|
}
|
|
return this._base_optionDatepicker.call($.datepicker, target, name_clone || name, value);
|
|
};
|
|
|
|
/*
|
|
* jQuery isEmptyObject does not check hasOwnProperty - if someone has added to the object prototype,
|
|
* it will return false for all objects
|
|
*/
|
|
var isEmptyObject = function (obj) {
|
|
var prop;
|
|
for (prop in obj) {
|
|
if (obj.hasOwnProperty(prop)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
|
|
/*
|
|
* jQuery extend now ignores nulls!
|
|
*/
|
|
var extendRemove = function (target, props) {
|
|
$.extend(target, props);
|
|
for (var name in props) {
|
|
if (props[name] === null || props[name] === undefined) {
|
|
target[name] = props[name];
|
|
}
|
|
}
|
|
return target;
|
|
};
|
|
|
|
/*
|
|
* Determine by the time format which units are supported
|
|
* Returns an object of booleans for each unit
|
|
*/
|
|
var detectSupport = function (timeFormat) {
|
|
var tf = timeFormat.replace(/'.*?'/g, '').toLowerCase(), // removes literals
|
|
isIn = function (f, t) { // does the format contain the token?
|
|
return f.indexOf(t) !== -1 ? true : false;
|
|
};
|
|
return {
|
|
hour: isIn(tf, 'h'),
|
|
minute: isIn(tf, 'm'),
|
|
second: isIn(tf, 's'),
|
|
millisec: isIn(tf, 'l'),
|
|
microsec: isIn(tf, 'c'),
|
|
timezone: isIn(tf, 'z'),
|
|
ampm: isIn(tf, 't') && isIn(timeFormat, 'h'),
|
|
iso8601: isIn(timeFormat, 'Z')
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Converts 24 hour format into 12 hour
|
|
* Returns 12 hour without leading 0
|
|
*/
|
|
var convert24to12 = function (hour) {
|
|
hour %= 12;
|
|
|
|
if (hour === 0) {
|
|
hour = 12;
|
|
}
|
|
|
|
return String(hour);
|
|
};
|
|
|
|
var computeEffectiveSetting = function (settings, property) {
|
|
return settings && settings[property] ? settings[property] : $.timepicker._defaults[property];
|
|
};
|
|
|
|
/*
|
|
* Splits datetime string into date and time substrings.
|
|
* Throws exception when date can't be parsed
|
|
* Returns {dateString: dateString, timeString: timeString}
|
|
*/
|
|
var splitDateTime = function (dateTimeString, timeSettings) {
|
|
// The idea is to get the number separator occurrences in datetime and the time format requested (since time has
|
|
// fewer unknowns, mostly numbers and am/pm). We will use the time pattern to split.
|
|
var separator = computeEffectiveSetting(timeSettings, 'separator'),
|
|
format = computeEffectiveSetting(timeSettings, 'timeFormat'),
|
|
timeParts = format.split(separator), // how many occurrences of separator may be in our format?
|
|
timePartsLen = timeParts.length,
|
|
allParts = dateTimeString.split(separator),
|
|
allPartsLen = allParts.length;
|
|
|
|
if (allPartsLen > 1) {
|
|
return {
|
|
dateString: allParts.splice(0, allPartsLen - timePartsLen).join(separator),
|
|
timeString: allParts.splice(0, timePartsLen).join(separator)
|
|
};
|
|
}
|
|
|
|
return {
|
|
dateString: dateTimeString,
|
|
timeString: ''
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Internal function to parse datetime interval
|
|
* Returns: {date: Date, timeObj: Object}, where
|
|
* date - parsed date without time (type Date)
|
|
* timeObj = {hour: , minute: , second: , millisec: , microsec: } - parsed time. Optional
|
|
*/
|
|
var parseDateTimeInternal = function (dateFormat, timeFormat, dateTimeString, dateSettings, timeSettings) {
|
|
var date,
|
|
parts,
|
|
parsedTime;
|
|
|
|
parts = splitDateTime(dateTimeString, timeSettings);
|
|
date = $.datepicker._base_parseDate(dateFormat, parts.dateString, dateSettings);
|
|
|
|
if (parts.timeString === '') {
|
|
return {
|
|
date: date
|
|
};
|
|
}
|
|
|
|
parsedTime = $.datepicker.parseTime(timeFormat, parts.timeString, timeSettings);
|
|
|
|
if (!parsedTime) {
|
|
throw 'Wrong time format';
|
|
}
|
|
|
|
return {
|
|
date: date,
|
|
timeObj: parsedTime
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Internal function to set timezone_select to the local timezone
|
|
*/
|
|
var selectLocalTimezone = function (tp_inst, date) {
|
|
if (tp_inst && tp_inst.timezone_select) {
|
|
var now = date || new Date();
|
|
tp_inst.timezone_select.val(-now.getTimezoneOffset());
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Create a Singleton Instance
|
|
*/
|
|
$.timepicker = new Timepicker();
|
|
|
|
/**
|
|
* Get the timezone offset as string from a date object (eg '+0530' for UTC+5.5)
|
|
* @param {number} tzMinutes if not a number, less than -720 (-1200), or greater than 840 (+1400) this value is returned
|
|
* @param {boolean} iso8601 if true formats in accordance to iso8601 "+12:45"
|
|
* @return {string}
|
|
*/
|
|
$.timepicker.timezoneOffsetString = function (tzMinutes, iso8601) {
|
|
if (isNaN(tzMinutes) || tzMinutes > 840 || tzMinutes < -720) {
|
|
return tzMinutes;
|
|
}
|
|
|
|
var off = tzMinutes,
|
|
minutes = off % 60,
|
|
hours = (off - minutes) / 60,
|
|
iso = iso8601 ? ':' : '',
|
|
tz = (off >= 0 ? '+' : '-') + ('0' + Math.abs(hours)).slice(-2) + iso + ('0' + Math.abs(minutes)).slice(-2);
|
|
|
|
if (tz === '+00:00') {
|
|
return 'Z';
|
|
}
|
|
return tz;
|
|
};
|
|
|
|
/**
|
|
* Get the number in minutes that represents a timezone string
|
|
* @param {string} tzString formatted like "+0500", "-1245", "Z"
|
|
* @return {number} the offset minutes or the original string if it doesn't match expectations
|
|
*/
|
|
$.timepicker.timezoneOffsetNumber = function (tzString) {
|
|
var normalized = tzString.toString().replace(':', ''); // excuse any iso8601, end up with "+1245"
|
|
|
|
if (normalized.toUpperCase() === 'Z') { // if iso8601 with Z, its 0 minute offset
|
|
return 0;
|
|
}
|
|
|
|
if (!/^(\-|\+)\d{4}$/.test(normalized)) { // possibly a user defined tz, so just give it back
|
|
return tzString;
|
|
}
|
|
|
|
return ((normalized.substr(0, 1) === '-' ? -1 : 1) * // plus or minus
|
|
((parseInt(normalized.substr(1, 2), 10) * 60) + // hours (converted to minutes)
|
|
parseInt(normalized.substr(3, 2), 10))); // minutes
|
|
};
|
|
|
|
/**
|
|
* No way to set timezone in js Date, so we must adjust the minutes to compensate. (think setDate, getDate)
|
|
* @param {Date} date
|
|
* @param {string} toTimezone formatted like "+0500", "-1245"
|
|
* @return {Date}
|
|
*/
|
|
$.timepicker.timezoneAdjust = function (date, toTimezone) {
|
|
var toTz = $.timepicker.timezoneOffsetNumber(toTimezone);
|
|
if (!isNaN(toTz)) {
|
|
date.setMinutes(date.getMinutes() + -date.getTimezoneOffset() - toTz);
|
|
}
|
|
return date;
|
|
};
|
|
|
|
/**
|
|
* Calls `timepicker()` on the `startTime` and `endTime` elements, and configures them to
|
|
* enforce date range limits.
|
|
* n.b. The input value must be correctly formatted (reformatting is not supported)
|
|
* @param {Element} startTime
|
|
* @param {Element} endTime
|
|
* @param {Object} options Options for the timepicker() call
|
|
* @return {jQuery}
|
|
*/
|
|
$.timepicker.timeRange = function (startTime, endTime, options) {
|
|
return $.timepicker.handleRange('timepicker', startTime, endTime, options);
|
|
};
|
|
|
|
/**
|
|
* Calls `datetimepicker` on the `startTime` and `endTime` elements, and configures them to
|
|
* enforce date range limits.
|
|
* @param {Element} startTime
|
|
* @param {Element} endTime
|
|
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
|
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
|
* @param {string} method Can be used to specify the type of picker to be added
|
|
* @return {jQuery}
|
|
*/
|
|
$.timepicker.datetimeRange = function (startTime, endTime, options) {
|
|
$.timepicker.handleRange('datetimepicker', startTime, endTime, options);
|
|
};
|
|
|
|
/**
|
|
* Calls `datepicker` on the `startTime` and `endTime` elements, and configures them to
|
|
* enforce date range limits.
|
|
* @param {Element} startTime
|
|
* @param {Element} endTime
|
|
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
|
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
|
* @return {jQuery}
|
|
*/
|
|
$.timepicker.dateRange = function (startTime, endTime, options) {
|
|
$.timepicker.handleRange('datepicker', startTime, endTime, options);
|
|
};
|
|
|
|
/**
|
|
* Calls `method` on the `startTime` and `endTime` elements, and configures them to
|
|
* enforce date range limits.
|
|
* @param {string} method Can be used to specify the type of picker to be added
|
|
* @param {Element} startTime
|
|
* @param {Element} endTime
|
|
* @param {Object} options Options for the `timepicker()` call. Also supports `reformat`,
|
|
* a boolean value that can be used to reformat the input values to the `dateFormat`.
|
|
* @return {jQuery}
|
|
*/
|
|
$.timepicker.handleRange = function (method, startTime, endTime, options) {
|
|
options = $.extend({}, {
|
|
minInterval: 0, // min allowed interval in milliseconds
|
|
maxInterval: 0, // max allowed interval in milliseconds
|
|
start: {}, // options for start picker
|
|
end: {} // options for end picker
|
|
}, options);
|
|
|
|
function checkDates(changed, other) {
|
|
var startdt = startTime[method]('getDate'),
|
|
enddt = endTime[method]('getDate'),
|
|
changeddt = changed[method]('getDate');
|
|
|
|
if (startdt !== null) {
|
|
var minDate = new Date(startdt.getTime()),
|
|
maxDate = new Date(startdt.getTime());
|
|
|
|
minDate.setMilliseconds(minDate.getMilliseconds() + options.minInterval);
|
|
maxDate.setMilliseconds(maxDate.getMilliseconds() + options.maxInterval);
|
|
|
|
if (options.minInterval > 0 && minDate > enddt) { // minInterval check
|
|
endTime[method]('setDate', minDate);
|
|
}
|
|
else if (options.maxInterval > 0 && maxDate < enddt) { // max interval check
|
|
endTime[method]('setDate', maxDate);
|
|
}
|
|
else if (startdt > enddt) {
|
|
other[method]('setDate', changeddt);
|
|
}
|
|
}
|
|
}
|
|
|
|
function selected(changed, other, option) {
|
|
if (!changed.val()) {
|
|
return;
|
|
}
|
|
var date = changed[method].call(changed, 'getDate');
|
|
if (date !== null && options.minInterval > 0) {
|
|
if (option === 'minDate') {
|
|
date.setMilliseconds(date.getMilliseconds() + options.minInterval);
|
|
}
|
|
if (option === 'maxDate') {
|
|
date.setMilliseconds(date.getMilliseconds() - options.minInterval);
|
|
}
|
|
}
|
|
if (date.getTime) {
|
|
other[method].call(other, 'option', option, date);
|
|
}
|
|
}
|
|
|
|
$.fn[method].call(startTime, $.extend({
|
|
onClose: function (dateText, inst) {
|
|
checkDates($(this), endTime);
|
|
},
|
|
onSelect: function (selectedDateTime) {
|
|
selected($(this), endTime, 'minDate');
|
|
}
|
|
}, options, options.start));
|
|
$.fn[method].call(endTime, $.extend({
|
|
onClose: function (dateText, inst) {
|
|
checkDates($(this), startTime);
|
|
},
|
|
onSelect: function (selectedDateTime) {
|
|
selected($(this), startTime, 'maxDate');
|
|
}
|
|
}, options, options.end));
|
|
|
|
checkDates(startTime, endTime);
|
|
selected(startTime, endTime, 'minDate');
|
|
selected(endTime, startTime, 'maxDate');
|
|
return $([startTime.get(0), endTime.get(0)]);
|
|
};
|
|
|
|
/**
|
|
* Log error or data to the console during error or debugging
|
|
* @param {Object} err pass any type object to log to the console during error or debugging
|
|
* @return {void}
|
|
*/
|
|
$.timepicker.log = function (err) {
|
|
if (window.console) {
|
|
window.console.log(err);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Add util object to allow access to private methods for testability.
|
|
*/
|
|
$.timepicker._util = {
|
|
_extendRemove: extendRemove,
|
|
_isEmptyObject: isEmptyObject,
|
|
_convert24to12: convert24to12,
|
|
_detectSupport: detectSupport,
|
|
_selectLocalTimezone: selectLocalTimezone,
|
|
_computeEffectiveSetting: computeEffectiveSetting,
|
|
_splitDateTime: splitDateTime,
|
|
_parseDateTimeInternal: parseDateTimeInternal
|
|
};
|
|
|
|
/*
|
|
* Microsecond support
|
|
*/
|
|
if (!Date.prototype.getMicroseconds) {
|
|
Date.prototype.microseconds = 0;
|
|
Date.prototype.getMicroseconds = function () {
|
|
return this.microseconds;
|
|
};
|
|
Date.prototype.setMicroseconds = function (m) {
|
|
this.setMilliseconds(this.getMilliseconds() + Math.floor(m / 1000));
|
|
this.microseconds = m % 1000;
|
|
return this;
|
|
};
|
|
}
|
|
|
|
/*
|
|
* Keep up with the version
|
|
*/
|
|
$.timepicker.version = "1.4.2";
|
|
|
|
})(jQuery);
|
|
// Released under MIT license
|
|
// Copyright (c) 2009-2010 Dominic Baggott
|
|
// Copyright (c) 2009-2010 Ash Berlin
|
|
// Copyright (c) 2011 Christoph Dorn <christoph@christophdorn.com> (http://www.christophdorn.com)
|
|
|
|
(function (expose) {
|
|
|
|
/**
|
|
* class Markdown
|
|
*
|
|
* Markdown processing in Javascript done right. We have very particular views
|
|
* on what constitutes 'right' which include:
|
|
*
|
|
* - produces well-formed HTML (this means that em and strong nesting is
|
|
* important)
|
|
*
|
|
* - has an intermediate representation to allow processing of parsed data (We
|
|
* in fact have two, both as [JsonML]: a markdown tree and an HTML tree).
|
|
*
|
|
* - is easily extensible to add new dialects without having to rewrite the
|
|
* entire parsing mechanics
|
|
*
|
|
* - has a good test suite
|
|
*
|
|
* This implementation fulfills all of these (except that the test suite could
|
|
* do with expanding to automatically run all the fixtures from other Markdown
|
|
* implementations.)
|
|
*
|
|
* ##### Intermediate Representation
|
|
*
|
|
* *TODO* Talk about this :) Its JsonML, but document the node names we use.
|
|
*
|
|
* [JsonML]: http://jsonml.org/ "JSON Markup Language"
|
|
**/
|
|
var Markdown = expose.Markdown = function Markdown(dialect) {
|
|
switch (typeof dialect) {
|
|
case "undefined":
|
|
this.dialect = Markdown.dialects.Gruber;
|
|
break;
|
|
case "object":
|
|
this.dialect = dialect;
|
|
break;
|
|
default:
|
|
if (dialect in Markdown.dialects) {
|
|
this.dialect = Markdown.dialects[dialect];
|
|
}
|
|
else {
|
|
throw new Error("Unknown Markdown dialect '" + String(dialect) + "'");
|
|
}
|
|
break;
|
|
}
|
|
this.em_state = [];
|
|
this.strong_state = [];
|
|
this.debug_indent = "";
|
|
};
|
|
|
|
/**
|
|
* parse( markdown, [dialect] ) -> JsonML
|
|
* - markdown (String): markdown string to parse
|
|
* - dialect (String | Dialect): the dialect to use, defaults to gruber
|
|
*
|
|
* Parse `markdown` and return a markdown document as a Markdown.JsonML tree.
|
|
**/
|
|
expose.parse = function (source, dialect) {
|
|
// dialect will default if undefined
|
|
var md = new Markdown(dialect);
|
|
return md.toTree(source);
|
|
};
|
|
|
|
/**
|
|
* toHTML( markdown, [dialect] ) -> String
|
|
* toHTML( md_tree ) -> String
|
|
* - markdown (String): markdown string to parse
|
|
* - md_tree (Markdown.JsonML): parsed markdown tree
|
|
*
|
|
* Take markdown (either as a string or as a JsonML tree) and run it through
|
|
* [[toHTMLTree]] then turn it into a well-formated HTML fragment.
|
|
**/
|
|
expose.toHTML = function toHTML(source, dialect, options) {
|
|
var input = expose.toHTMLTree(source, dialect, options);
|
|
|
|
return expose.renderJsonML(input);
|
|
};
|
|
|
|
/**
|
|
* toHTMLTree( markdown, [dialect] ) -> JsonML
|
|
* toHTMLTree( md_tree ) -> JsonML
|
|
* - markdown (String): markdown string to parse
|
|
* - dialect (String | Dialect): the dialect to use, defaults to gruber
|
|
* - md_tree (Markdown.JsonML): parsed markdown tree
|
|
*
|
|
* Turn markdown into HTML, represented as a JsonML tree. If a string is given
|
|
* to this function, it is first parsed into a markdown tree by calling
|
|
* [[parse]].
|
|
**/
|
|
expose.toHTMLTree = function toHTMLTree(input, dialect, options) {
|
|
// convert string input to an MD tree
|
|
if (typeof input === "string") input = this.parse(input, dialect);
|
|
|
|
// Now convert the MD tree to an HTML tree
|
|
|
|
// remove references from the tree
|
|
var attrs = extract_attr(input),
|
|
refs = {};
|
|
|
|
if (attrs && attrs.references) {
|
|
refs = attrs.references;
|
|
}
|
|
|
|
var html = convert_tree_to_html(input, refs, options);
|
|
merge_text_nodes(html);
|
|
return html;
|
|
};
|
|
|
|
// For Spidermonkey based engines
|
|
function mk_block_toSource() {
|
|
return "Markdown.mk_block( " +
|
|
uneval(this.toString()) +
|
|
", " +
|
|
uneval(this.trailing) +
|
|
", " +
|
|
uneval(this.lineNumber) +
|
|
" )";
|
|
}
|
|
|
|
// node
|
|
function mk_block_inspect() {
|
|
var util = require('util');
|
|
return "Markdown.mk_block( " +
|
|
util.inspect(this.toString()) +
|
|
", " +
|
|
util.inspect(this.trailing) +
|
|
", " +
|
|
util.inspect(this.lineNumber) +
|
|
" )";
|
|
|
|
}
|
|
|
|
var mk_block = Markdown.mk_block = function (block, trail, line) {
|
|
// Be helpful for default case in tests.
|
|
if (arguments.length == 1) trail = "\n\n";
|
|
|
|
var s = new String(block);
|
|
s.trailing = trail;
|
|
// To make it clear its not just a string
|
|
s.inspect = mk_block_inspect;
|
|
s.toSource = mk_block_toSource;
|
|
|
|
if (line != undefined)
|
|
s.lineNumber = line;
|
|
|
|
return s;
|
|
};
|
|
|
|
function count_lines(str) {
|
|
var n = 0, i = -1;
|
|
while ((i = str.indexOf('\n', i + 1)) !== -1) n++;
|
|
return n;
|
|
}
|
|
|
|
// Internal - split source into rough blocks
|
|
Markdown.prototype.split_blocks = function splitBlocks(input, startLine) {
|
|
// [\s\S] matches _anything_ (newline or space)
|
|
var re = /([\s\S]+?)($|\n(?:\s*\n|$)+)/g,
|
|
blocks = [],
|
|
m;
|
|
|
|
var line_no = 1;
|
|
|
|
if ((m = /^(\s*\n)/.exec(input)) != null) {
|
|
// skip (but count) leading blank lines
|
|
line_no += count_lines(m[0]);
|
|
re.lastIndex = m[0].length;
|
|
}
|
|
|
|
while ((m = re.exec(input)) !== null) {
|
|
blocks.push(mk_block(m[1], m[2], line_no));
|
|
line_no += count_lines(m[0]);
|
|
}
|
|
|
|
return blocks;
|
|
};
|
|
|
|
/**
|
|
* Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ]
|
|
* - block (String): the block to process
|
|
* - next (Array): the following blocks
|
|
*
|
|
* Process `block` and return an array of JsonML nodes representing `block`.
|
|
*
|
|
* It does this by asking each block level function in the dialect to process
|
|
* the block until one can. Succesful handling is indicated by returning an
|
|
* array (with zero or more JsonML nodes), failure by a false value.
|
|
*
|
|
* Blocks handlers are responsible for calling [[Markdown#processInline]]
|
|
* themselves as appropriate.
|
|
*
|
|
* If the blocks were split incorrectly or adjacent blocks need collapsing you
|
|
* can adjust `next` in place using shift/splice etc.
|
|
*
|
|
* If any of this default behaviour is not right for the dialect, you can
|
|
* define a `__call__` method on the dialect that will get invoked to handle
|
|
* the block processing.
|
|
*/
|
|
Markdown.prototype.processBlock = function processBlock(block, next) {
|
|
var cbs = this.dialect.block,
|
|
ord = cbs.__order__;
|
|
|
|
if ("__call__" in cbs) {
|
|
return cbs.__call__.call(this, block, next);
|
|
}
|
|
|
|
for (var i = 0; i < ord.length; i++) {
|
|
//D:this.debug( "Testing", ord[i] );
|
|
var res = cbs[ord[i]].call(this, block, next);
|
|
if (res) {
|
|
//D:this.debug(" matched");
|
|
if (!isArray(res) || (res.length > 0 && !(isArray(res[0]))))
|
|
this.debug(ord[i], "didn't return a proper array");
|
|
//D:this.debug( "" );
|
|
return res;
|
|
}
|
|
}
|
|
|
|
// Uhoh! no match! Should we throw an error?
|
|
return [];
|
|
};
|
|
|
|
Markdown.prototype.processInline = function processInline(block) {
|
|
return this.dialect.inline.__call__.call(this, String(block));
|
|
};
|
|
|
|
/**
|
|
* Markdown#toTree( source ) -> JsonML
|
|
* - source (String): markdown source to parse
|
|
*
|
|
* Parse `source` into a JsonML tree representing the markdown document.
|
|
**/
|
|
// custom_tree means set this.tree to `custom_tree` and restore old value on return
|
|
Markdown.prototype.toTree = function toTree(source, custom_root) {
|
|
var blocks = source instanceof Array ? source : this.split_blocks(source);
|
|
|
|
// Make tree a member variable so its easier to mess with in extensions
|
|
var old_tree = this.tree;
|
|
try {
|
|
this.tree = custom_root || this.tree || ["markdown"];
|
|
|
|
blocks:
|
|
while (blocks.length) {
|
|
var b = this.processBlock(blocks.shift(), blocks);
|
|
|
|
// Reference blocks and the like won't return any content
|
|
if (!b.length) continue blocks;
|
|
|
|
this.tree.push.apply(this.tree, b);
|
|
}
|
|
return this.tree;
|
|
}
|
|
finally {
|
|
if (custom_root) {
|
|
this.tree = old_tree;
|
|
}
|
|
}
|
|
};
|
|
|
|
// Noop by default
|
|
Markdown.prototype.debug = function () {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
args.unshift(this.debug_indent);
|
|
if (typeof print !== "undefined")
|
|
print.apply(print, args);
|
|
if (typeof console !== "undefined" && typeof console.log !== "undefined")
|
|
console.log.apply(null, args);
|
|
}
|
|
|
|
Markdown.prototype.loop_re_over_block = function (re, block, cb) {
|
|
// Dont use /g regexps with this
|
|
var m,
|
|
b = block.valueOf();
|
|
|
|
while (b.length && (m = re.exec(b)) != null) {
|
|
b = b.substr(m[0].length);
|
|
cb.call(this, m);
|
|
}
|
|
return b;
|
|
};
|
|
|
|
/**
|
|
* Markdown.dialects
|
|
*
|
|
* Namespace of built-in dialects.
|
|
**/
|
|
Markdown.dialects = {};
|
|
|
|
/**
|
|
* Markdown.dialects.Gruber
|
|
*
|
|
* The default dialect that follows the rules set out by John Gruber's
|
|
* markdown.pl as closely as possible. Well actually we follow the behaviour of
|
|
* that script which in some places is not exactly what the syntax web page
|
|
* says.
|
|
**/
|
|
Markdown.dialects.Gruber = {
|
|
block: {
|
|
atxHeader: function atxHeader(block, next) {
|
|
var m = block.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);
|
|
|
|
if (!m) return undefined;
|
|
|
|
var header = ["header", {level: m[1].length}];
|
|
Array.prototype.push.apply(header, this.processInline(m[2]));
|
|
|
|
if (m[0].length < block.length)
|
|
next.unshift(mk_block(block.substr(m[0].length), block.trailing, block.lineNumber + 2));
|
|
|
|
return [header];
|
|
},
|
|
|
|
setextHeader: function setextHeader(block, next) {
|
|
var m = block.match(/^(.*)\n([-=])\2\2+(?:\n|$)/);
|
|
|
|
if (!m) return undefined;
|
|
|
|
var level = (m[2] === "=") ? 1 : 2;
|
|
var header = ["header", {level: level}, m[1]];
|
|
|
|
if (m[0].length < block.length)
|
|
next.unshift(mk_block(block.substr(m[0].length), block.trailing, block.lineNumber + 2));
|
|
|
|
return [header];
|
|
},
|
|
|
|
code: function code(block, next) {
|
|
// | Foo
|
|
// |bar
|
|
// should be a code block followed by a paragraph. Fun
|
|
//
|
|
// There might also be adjacent code block to merge.
|
|
|
|
var ret = [],
|
|
re = /^(?: {0,3}\t| {4})(.*)\n?/,
|
|
lines;
|
|
|
|
// 4 spaces + content
|
|
if (!block.match(re)) return undefined;
|
|
|
|
block_search:
|
|
do {
|
|
// Now pull out the rest of the lines
|
|
var b = this.loop_re_over_block(
|
|
re, block.valueOf(), function (m) {
|
|
ret.push(m[1]);
|
|
});
|
|
|
|
if (b.length) {
|
|
// Case alluded to in first comment. push it back on as a new block
|
|
next.unshift(mk_block(b, block.trailing));
|
|
break block_search;
|
|
}
|
|
else if (next.length) {
|
|
// Check the next block - it might be code too
|
|
if (!next[0].match(re)) break block_search;
|
|
|
|
// Pull how how many blanks lines follow - minus two to account for .join
|
|
ret.push(block.trailing.replace(/[^\n]/g, '').substring(2));
|
|
|
|
block = next.shift();
|
|
}
|
|
else {
|
|
break block_search;
|
|
}
|
|
} while (true);
|
|
|
|
return [["code_block", ret.join("\n")]];
|
|
},
|
|
|
|
horizRule: function horizRule(block, next) {
|
|
// this needs to find any hr in the block to handle abutting blocks
|
|
var m = block.match(/^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/);
|
|
|
|
if (!m) {
|
|
return undefined;
|
|
}
|
|
|
|
var jsonml = [["hr"]];
|
|
|
|
// if there's a leading abutting block, process it
|
|
if (m[1]) {
|
|
jsonml.unshift.apply(jsonml, this.processBlock(m[1], []));
|
|
}
|
|
|
|
// if there's a trailing abutting block, stick it into next
|
|
if (m[3]) {
|
|
next.unshift(mk_block(m[3]));
|
|
}
|
|
|
|
return jsonml;
|
|
},
|
|
|
|
// There are two types of lists. Tight and loose. Tight lists have no whitespace
|
|
// between the items (and result in text just in the <li>) and loose lists,
|
|
// which have an empty line between list items, resulting in (one or more)
|
|
// paragraphs inside the <li>.
|
|
//
|
|
// There are all sorts weird edge cases about the original markdown.pl's
|
|
// handling of lists:
|
|
//
|
|
// * Nested lists are supposed to be indented by four chars per level. But
|
|
// if they aren't, you can get a nested list by indenting by less than
|
|
// four so long as the indent doesn't match an indent of an existing list
|
|
// item in the 'nest stack'.
|
|
//
|
|
// * The type of the list (bullet or number) is controlled just by the
|
|
// first item at the indent. Subsequent changes are ignored unless they
|
|
// are for nested lists
|
|
//
|
|
lists: (function () {
|
|
// Use a closure to hide a few variables.
|
|
var any_list = "[*+-]|\\d+\\.",
|
|
bullet_list = /[*+-]/,
|
|
number_list = /\d+\./,
|
|
// Capture leading indent as it matters for determining nested lists.
|
|
is_list_re = new RegExp("^( {0,3})(" + any_list + ")[ \t]+"),
|
|
indent_re = "(?: {0,3}\\t| {4})";
|
|
|
|
// TODO: Cache this regexp for certain depths.
|
|
// Create a regexp suitable for matching an li for a given stack depth
|
|
function regex_for_depth(depth) {
|
|
|
|
return new RegExp(
|
|
// m[1] = indent, m[2] = list_type
|
|
"(?:^(" + indent_re + "{0," + depth + "} {0,3})(" + any_list + ")\\s+)|" +
|
|
// m[3] = cont
|
|
"(^" + indent_re + "{0," + (depth - 1) + "}[ ]{0,4})"
|
|
);
|
|
}
|
|
|
|
function expand_tab(input) {
|
|
return input.replace(/ {0,3}\t/g, " ");
|
|
}
|
|
|
|
// Add inline content `inline` to `li`. inline comes from processInline
|
|
// so is an array of content
|
|
function add(li, loose, inline, nl) {
|
|
if (loose) {
|
|
li.push(["para"].concat(inline));
|
|
return;
|
|
}
|
|
// Hmmm, should this be any block level element or just paras?
|
|
var add_to = li[li.length - 1] instanceof Array && li[li.length - 1][0] == "para"
|
|
? li[li.length - 1]
|
|
: li;
|
|
|
|
// If there is already some content in this list, add the new line in
|
|
if (nl && li.length > 1) inline.unshift(nl);
|
|
|
|
for (var i = 0; i < inline.length; i++) {
|
|
var what = inline[i],
|
|
is_str = typeof what == "string";
|
|
if (is_str && add_to.length > 1 && typeof add_to[add_to.length - 1] == "string") {
|
|
add_to[add_to.length - 1] += what;
|
|
}
|
|
else {
|
|
add_to.push(what);
|
|
}
|
|
}
|
|
}
|
|
|
|
// contained means have an indent greater than the current one. On
|
|
// *every* line in the block
|
|
function get_contained_blocks(depth, blocks) {
|
|
|
|
var re = new RegExp("^(" + indent_re + "{" + depth + "}.*?\\n?)*$"),
|
|
replace = new RegExp("^" + indent_re + "{" + depth + "}", "gm"),
|
|
ret = [];
|
|
|
|
while (blocks.length > 0) {
|
|
if (re.exec(blocks[0])) {
|
|
var b = blocks.shift(),
|
|
// Now remove that indent
|
|
x = b.replace(replace, "");
|
|
|
|
ret.push(mk_block(x, b.trailing, b.lineNumber));
|
|
}
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// passed to stack.forEach to turn list items up the stack into paras
|
|
function paragraphify(s, i, stack) {
|
|
var list = s.list;
|
|
var last_li = list[list.length - 1];
|
|
|
|
if (last_li[1] instanceof Array && last_li[1][0] == "para") {
|
|
return;
|
|
}
|
|
if (i + 1 == stack.length) {
|
|
// Last stack frame
|
|
// Keep the same array, but replace the contents
|
|
last_li.push(["para"].concat(last_li.splice(1)));
|
|
}
|
|
else {
|
|
var sublist = last_li.pop();
|
|
last_li.push(["para"].concat(last_li.splice(1)), sublist);
|
|
}
|
|
}
|
|
|
|
// The matcher function
|
|
return function (block, next) {
|
|
var m = block.match(is_list_re);
|
|
if (!m) return undefined;
|
|
|
|
function make_list(m) {
|
|
var list = bullet_list.exec(m[2])
|
|
? ["bulletlist"]
|
|
: ["numberlist"];
|
|
|
|
stack.push({list: list, indent: m[1]});
|
|
return list;
|
|
}
|
|
|
|
|
|
var stack = [], // Stack of lists for nesting.
|
|
list = make_list(m),
|
|
last_li,
|
|
loose = false,
|
|
ret = [stack[0].list],
|
|
i;
|
|
|
|
// Loop to search over block looking for inner block elements and loose lists
|
|
loose_search:
|
|
while (true) {
|
|
// Split into lines preserving new lines at end of line
|
|
var lines = block.split(/(?=\n)/);
|
|
|
|
// We have to grab all lines for a li and call processInline on them
|
|
// once as there are some inline things that can span lines.
|
|
var li_accumulate = "";
|
|
|
|
// Loop over the lines in this block looking for tight lists.
|
|
tight_search:
|
|
for (var line_no = 0; line_no < lines.length; line_no++) {
|
|
var nl = "",
|
|
l = lines[line_no].replace(/^\n/, function (n) {
|
|
nl = n;
|
|
return "";
|
|
});
|
|
|
|
// TODO: really should cache this
|
|
var line_re = regex_for_depth(stack.length);
|
|
|
|
m = l.match(line_re);
|
|
//print( "line:", uneval(l), "\nline match:", uneval(m) );
|
|
|
|
// We have a list item
|
|
if (m[1] !== undefined) {
|
|
// Process the previous list item, if any
|
|
if (li_accumulate.length) {
|
|
add(last_li, loose, this.processInline(li_accumulate), nl);
|
|
// Loose mode will have been dealt with. Reset it
|
|
loose = false;
|
|
li_accumulate = "";
|
|
}
|
|
|
|
m[1] = expand_tab(m[1]);
|
|
var wanted_depth = Math.floor(m[1].length / 4) + 1;
|
|
//print( "want:", wanted_depth, "stack:", stack.length);
|
|
if (wanted_depth > stack.length) {
|
|
// Deep enough for a nested list outright
|
|
//print ( "new nested list" );
|
|
list = make_list(m);
|
|
last_li.push(list);
|
|
last_li = list[1] = ["listitem"];
|
|
}
|
|
else {
|
|
// We aren't deep enough to be strictly a new level. This is
|
|
// where Md.pl goes nuts. If the indent matches a level in the
|
|
// stack, put it there, else put it one deeper then the
|
|
// wanted_depth deserves.
|
|
var found = false;
|
|
for (i = 0; i < stack.length; i++) {
|
|
if (stack[i].indent != m[1]) continue;
|
|
list = stack[i].list;
|
|
stack.splice(i + 1);
|
|
found = true;
|
|
break;
|
|
}
|
|
|
|
if (!found) {
|
|
//print("not found. l:", uneval(l));
|
|
wanted_depth++;
|
|
if (wanted_depth <= stack.length) {
|
|
stack.splice(wanted_depth);
|
|
//print("Desired depth now", wanted_depth, "stack:", stack.length);
|
|
list = stack[wanted_depth - 1].list;
|
|
//print("list:", uneval(list) );
|
|
}
|
|
else {
|
|
//print ("made new stack for messy indent");
|
|
list = make_list(m);
|
|
last_li.push(list);
|
|
}
|
|
}
|
|
|
|
//print( uneval(list), "last", list === stack[stack.length-1].list );
|
|
last_li = ["listitem"];
|
|
list.push(last_li);
|
|
} // end depth of shenegains
|
|
nl = "";
|
|
}
|
|
|
|
// Add content
|
|
if (l.length > m[0].length) {
|
|
li_accumulate += nl + l.substr(m[0].length);
|
|
}
|
|
} // tight_search
|
|
|
|
if (li_accumulate.length) {
|
|
add(last_li, loose, this.processInline(li_accumulate), nl);
|
|
// Loose mode will have been dealt with. Reset it
|
|
loose = false;
|
|
li_accumulate = "";
|
|
}
|
|
|
|
// Look at the next block - we might have a loose list. Or an extra
|
|
// paragraph for the current li
|
|
var contained = get_contained_blocks(stack.length, next);
|
|
|
|
// Deal with code blocks or properly nested lists
|
|
if (contained.length > 0) {
|
|
// Make sure all listitems up the stack are paragraphs
|
|
forEach(stack, paragraphify, this);
|
|
|
|
last_li.push.apply(last_li, this.toTree(contained, []));
|
|
}
|
|
|
|
var next_block = next[0] && next[0].valueOf() || "";
|
|
|
|
if (next_block.match(is_list_re) || next_block.match(/^ /)) {
|
|
block = next.shift();
|
|
|
|
// Check for an HR following a list: features/lists/hr_abutting
|
|
var hr = this.dialect.block.horizRule(block, next);
|
|
|
|
if (hr) {
|
|
ret.push.apply(ret, hr);
|
|
break;
|
|
}
|
|
|
|
// Make sure all listitems up the stack are paragraphs
|
|
forEach(stack, paragraphify, this);
|
|
|
|
loose = true;
|
|
continue loose_search;
|
|
}
|
|
break;
|
|
} // loose_search
|
|
|
|
return ret;
|
|
};
|
|
})(),
|
|
|
|
blockquote: function blockquote(block, next) {
|
|
if (!block.match(/^>/m))
|
|
return undefined;
|
|
|
|
var jsonml = [];
|
|
|
|
// separate out the leading abutting block, if any
|
|
if (block[0] != ">") {
|
|
var lines = block.split(/\n/),
|
|
prev = [];
|
|
|
|
// keep shifting lines until you find a crotchet
|
|
while (lines.length && lines[0][0] != ">") {
|
|
prev.push(lines.shift());
|
|
}
|
|
|
|
// reassemble!
|
|
block = lines.join("\n");
|
|
jsonml.push.apply(jsonml, this.processBlock(prev.join("\n"), []));
|
|
}
|
|
|
|
// if the next block is also a blockquote merge it in
|
|
while (next.length && next[0][0] == ">") {
|
|
var b = next.shift();
|
|
block = new String(block + block.trailing + b);
|
|
block.trailing = b.trailing;
|
|
}
|
|
|
|
// Strip off the leading "> " and re-process as a block.
|
|
var input = block.replace(/^> ?/gm, ''),
|
|
old_tree = this.tree;
|
|
jsonml.push(this.toTree(input, ["blockquote"]));
|
|
|
|
return jsonml;
|
|
},
|
|
|
|
referenceDefn: function referenceDefn(block, next) {
|
|
var re = /^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;
|
|
// interesting matches are [ , ref_id, url, , title, title ]
|
|
|
|
if (!block.match(re))
|
|
return undefined;
|
|
|
|
// make an attribute node if it doesn't exist
|
|
if (!extract_attr(this.tree)) {
|
|
this.tree.splice(1, 0, {});
|
|
}
|
|
|
|
var attrs = extract_attr(this.tree);
|
|
|
|
// make a references hash if it doesn't exist
|
|
if (attrs.references === undefined) {
|
|
attrs.references = {};
|
|
}
|
|
|
|
var b = this.loop_re_over_block(re, block, function (m) {
|
|
|
|
if (m[2] && m[2][0] == '<' && m[2][m[2].length - 1] == '>')
|
|
m[2] = m[2].substring(1, m[2].length - 1);
|
|
|
|
var ref = attrs.references[m[1].toLowerCase()] = {
|
|
href: m[2]
|
|
};
|
|
|
|
if (m[4] !== undefined)
|
|
ref.title = m[4];
|
|
else if (m[5] !== undefined)
|
|
ref.title = m[5];
|
|
|
|
});
|
|
|
|
if (b.length)
|
|
next.unshift(mk_block(b, block.trailing));
|
|
|
|
return [];
|
|
},
|
|
|
|
para: function para(block, next) {
|
|
// everything's a para!
|
|
return [["para"].concat(this.processInline(block))];
|
|
}
|
|
}
|
|
};
|
|
|
|
Markdown.dialects.Gruber.inline = {
|
|
|
|
__oneElement__: function oneElement(text, patterns_or_re, previous_nodes) {
|
|
var m,
|
|
res,
|
|
lastIndex = 0;
|
|
|
|
patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__;
|
|
var re = new RegExp("([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")");
|
|
|
|
m = re.exec(text);
|
|
if (!m) {
|
|
// Just boring text
|
|
return [text.length, text];
|
|
}
|
|
else if (m[1]) {
|
|
// Some un-interesting text matched. Return that first
|
|
return [m[1].length, m[1]];
|
|
}
|
|
|
|
var res;
|
|
if (m[2] in this.dialect.inline) {
|
|
res = this.dialect.inline[m[2]].call(
|
|
this,
|
|
text.substr(m.index), m, previous_nodes || []);
|
|
}
|
|
// Default for now to make dev easier. just slurp special and output it.
|
|
res = res || [m[2].length, m[2]];
|
|
return res;
|
|
},
|
|
|
|
__call__: function inline(text, patterns) {
|
|
|
|
var out = [],
|
|
res;
|
|
|
|
function add(x) {
|
|
//D:self.debug(" adding output", uneval(x));
|
|
if (typeof x == "string" && typeof out[out.length - 1] == "string")
|
|
out[out.length - 1] += x;
|
|
else
|
|
out.push(x);
|
|
}
|
|
|
|
while (text.length > 0) {
|
|
res = this.dialect.inline.__oneElement__.call(this, text, patterns, out);
|
|
text = text.substr(res.shift());
|
|
forEach(res, add)
|
|
}
|
|
|
|
return out;
|
|
},
|
|
|
|
// These characters are intersting elsewhere, so have rules for them so that
|
|
// chunks of plain text blocks don't include them
|
|
"]": function () {
|
|
},
|
|
"}": function () {
|
|
},
|
|
|
|
"\\": function escaped(text) {
|
|
// [ length of input processed, node/children to add... ]
|
|
// Only esacape: \ ` * _ { } [ ] ( ) # * + - . !
|
|
if (text.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/))
|
|
return [2, text[1]];
|
|
else
|
|
// Not an esacpe
|
|
return [1, "\\"];
|
|
},
|
|
|
|
"![": function image(text) {
|
|
|
|
// Unlike images, alt text is plain text only. no other elements are
|
|
// allowed in there
|
|
|
|
// ![Alt text](/path/to/img.jpg "Optional title")
|
|
// 1 2 3 4 <--- captures
|
|
var m = text.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);
|
|
|
|
if (m) {
|
|
if (m[2] && m[2][0] == '<' && m[2][m[2].length - 1] == '>')
|
|
m[2] = m[2].substring(1, m[2].length - 1);
|
|
|
|
m[2] = this.dialect.inline.__call__.call(this, m[2], /\\/)[0];
|
|
|
|
var attrs = {alt: m[1], href: m[2] || ""};
|
|
if (m[4] !== undefined)
|
|
attrs.title = m[4];
|
|
|
|
return [m[0].length, ["img", attrs]];
|
|
}
|
|
|
|
// ![Alt text][id]
|
|
m = text.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/);
|
|
|
|
if (m) {
|
|
// We can't check if the reference is known here as it likely wont be
|
|
// found till after. Check it in md tree->hmtl tree conversion
|
|
return [m[0].length, ["img_ref", {alt: m[1], ref: m[2].toLowerCase(), original: m[0]}]];
|
|
}
|
|
|
|
// Just consume the '!['
|
|
return [2, "!["];
|
|
},
|
|
|
|
"[": function link(text) {
|
|
|
|
var orig = String(text);
|
|
// Inline content is possible inside `link text`
|
|
var res = Markdown.DialectHelpers.inline_until_char.call(this, text.substr(1), ']');
|
|
|
|
// No closing ']' found. Just consume the [
|
|
if (!res) return [1, '['];
|
|
|
|
var consumed = 1 + res[0],
|
|
children = res[1],
|
|
link,
|
|
attrs;
|
|
|
|
// At this point the first [...] has been parsed. See what follows to find
|
|
// out which kind of link we are (reference or direct url)
|
|
text = text.substr(consumed);
|
|
|
|
// [link text](/path/to/img.jpg "Optional title")
|
|
// 1 2 3 <--- captures
|
|
// This will capture up to the last paren in the block. We then pull
|
|
// back based on if there a matching ones in the url
|
|
// ([here](/url/(test))
|
|
// The parens have to be balanced
|
|
var m = text.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);
|
|
if (m) {
|
|
var url = m[1];
|
|
consumed += m[0].length;
|
|
|
|
if (url && url[0] == '<' && url[url.length - 1] == '>')
|
|
url = url.substring(1, url.length - 1);
|
|
|
|
// If there is a title we don't have to worry about parens in the url
|
|
if (!m[3]) {
|
|
var open_parens = 1; // One open that isn't in the capture
|
|
for (var len = 0; len < url.length; len++) {
|
|
switch (url[len]) {
|
|
case '(':
|
|
open_parens++;
|
|
break;
|
|
case ')':
|
|
if (--open_parens == 0) {
|
|
consumed -= url.length - len;
|
|
url = url.substring(0, len);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Process escapes only
|
|
url = this.dialect.inline.__call__.call(this, url, /\\/)[0];
|
|
|
|
attrs = {href: url || ""};
|
|
if (m[3] !== undefined)
|
|
attrs.title = m[3];
|
|
|
|
link = ["link", attrs].concat(children);
|
|
return [consumed, link];
|
|
}
|
|
|
|
// [Alt text][id]
|
|
// [Alt text] [id]
|
|
m = text.match(/^\s*\[(.*?)\]/);
|
|
|
|
if (m) {
|
|
|
|
consumed += m[0].length;
|
|
|
|
// [links][] uses links as its reference
|
|
attrs = {ref: (m[1] || String(children)).toLowerCase(), original: orig.substr(0, consumed)};
|
|
|
|
link = ["link_ref", attrs].concat(children);
|
|
|
|
// We can't check if the reference is known here as it likely wont be
|
|
// found till after. Check it in md tree->hmtl tree conversion.
|
|
// Store the original so that conversion can revert if the ref isn't found.
|
|
return [consumed, link];
|
|
}
|
|
|
|
// [id]
|
|
// Only if id is plain (no formatting.)
|
|
if (children.length == 1 && typeof children[0] == "string") {
|
|
|
|
attrs = {ref: children[0].toLowerCase(), original: orig.substr(0, consumed)};
|
|
link = ["link_ref", attrs, children[0]];
|
|
return [consumed, link];
|
|
}
|
|
|
|
// Just consume the '['
|
|
return [1, "["];
|
|
},
|
|
|
|
|
|
"<": function autoLink(text) {
|
|
var m;
|
|
|
|
if ((m = text.match(/^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/)) != null) {
|
|
if (m[3]) {
|
|
return [m[0].length, ["link", {href: "mailto:" + m[3]}, m[3]]];
|
|
|
|
}
|
|
else if (m[2] == "mailto") {
|
|
return [m[0].length, ["link", {href: m[1]}, m[1].substr("mailto:".length)]];
|
|
}
|
|
else
|
|
return [m[0].length, ["link", {href: m[1]}, m[1]]];
|
|
}
|
|
|
|
return [1, "<"];
|
|
},
|
|
|
|
"`": function inlineCode(text) {
|
|
// Inline code block. as many backticks as you like to start it
|
|
// Always skip over the opening ticks.
|
|
var m = text.match(/(`+)(([\s\S]*?)\1)/);
|
|
|
|
if (m && m[2])
|
|
return [m[1].length + m[2].length, ["inlinecode", m[3]]];
|
|
else {
|
|
// TODO: No matching end code found - warn!
|
|
return [1, "`"];
|
|
}
|
|
},
|
|
|
|
" \n": function lineBreak(text) {
|
|
return [3, ["linebreak"]];
|
|
}
|
|
|
|
};
|
|
|
|
// Meta Helper/generator method for em and strong handling
|
|
function strong_em(tag, md) {
|
|
|
|
var state_slot = tag + "_state",
|
|
other_slot = tag == "strong" ? "em_state" : "strong_state";
|
|
|
|
function CloseTag(len) {
|
|
this.len_after = len;
|
|
this.name = "close_" + md;
|
|
}
|
|
|
|
return function (text, orig_match) {
|
|
|
|
if (this[state_slot][0] == md) {
|
|
// Most recent em is of this type
|
|
//D:this.debug("closing", md);
|
|
this[state_slot].shift();
|
|
|
|
// "Consume" everything to go back to the recrusion in the else-block below
|
|
return [text.length, new CloseTag(text.length - md.length)];
|
|
}
|
|
else {
|
|
// Store a clone of the em/strong states
|
|
var other = this[other_slot].slice(),
|
|
state = this[state_slot].slice();
|
|
|
|
this[state_slot].unshift(md);
|
|
|
|
//D:this.debug_indent += " ";
|
|
|
|
// Recurse
|
|
var res = this.processInline(text.substr(md.length));
|
|
//D:this.debug_indent = this.debug_indent.substr(2);
|
|
|
|
var last = res[res.length - 1];
|
|
|
|
//D:this.debug("processInline from", tag + ": ", uneval( res ) );
|
|
|
|
var check = this[state_slot].shift();
|
|
if (last instanceof CloseTag) {
|
|
res.pop();
|
|
// We matched! Huzzah.
|
|
var consumed = text.length - last.len_after;
|
|
return [consumed, [tag].concat(res)];
|
|
}
|
|
else {
|
|
// Restore the state of the other kind. We might have mistakenly closed it.
|
|
this[other_slot] = other;
|
|
this[state_slot] = state;
|
|
|
|
// We can't reuse the processed result as it could have wrong parsing contexts in it.
|
|
return [md.length, md];
|
|
}
|
|
}
|
|
}; // End returned function
|
|
}
|
|
|
|
Markdown.dialects.Gruber.inline["**"] = strong_em("strong", "**");
|
|
Markdown.dialects.Gruber.inline["__"] = strong_em("strong", "__");
|
|
Markdown.dialects.Gruber.inline["*"] = strong_em("em", "*");
|
|
Markdown.dialects.Gruber.inline["_"] = strong_em("em", "_");
|
|
|
|
|
|
// Build default order from insertion order.
|
|
Markdown.buildBlockOrder = function (d) {
|
|
var ord = [];
|
|
for (var i in d) {
|
|
if (i == "__order__" || i == "__call__") continue;
|
|
ord.push(i);
|
|
}
|
|
d.__order__ = ord;
|
|
};
|
|
|
|
// Build patterns for inline matcher
|
|
Markdown.buildInlinePatterns = function (d) {
|
|
var patterns = [];
|
|
|
|
for (var i in d) {
|
|
// __foo__ is reserved and not a pattern
|
|
if (i.match(/^__.*__$/)) continue;
|
|
var l = i.replace(/([\\.*+?|()\[\]{}])/g, "\\$1")
|
|
.replace(/\n/, "\\n");
|
|
patterns.push(i.length == 1 ? l : "(?:" + l + ")");
|
|
}
|
|
|
|
patterns = patterns.join("|");
|
|
d.__patterns__ = patterns;
|
|
//print("patterns:", uneval( patterns ) );
|
|
|
|
var fn = d.__call__;
|
|
d.__call__ = function (text, pattern) {
|
|
if (pattern != undefined) {
|
|
return fn.call(this, text, pattern);
|
|
}
|
|
else {
|
|
return fn.call(this, text, patterns);
|
|
}
|
|
};
|
|
};
|
|
|
|
Markdown.DialectHelpers = {};
|
|
Markdown.DialectHelpers.inline_until_char = function (text, want) {
|
|
var consumed = 0,
|
|
nodes = [];
|
|
|
|
while (true) {
|
|
if (text[consumed] == want) {
|
|
// Found the character we were looking for
|
|
consumed++;
|
|
return [consumed, nodes];
|
|
}
|
|
|
|
if (consumed >= text.length) {
|
|
// No closing char found. Abort.
|
|
return null;
|
|
}
|
|
|
|
var res = this.dialect.inline.__oneElement__.call(this, text.substr(consumed));
|
|
consumed += res[0];
|
|
// Add any returned nodes.
|
|
nodes.push.apply(nodes, res.slice(1));
|
|
}
|
|
}
|
|
|
|
// Helper function to make sub-classing a dialect easier
|
|
Markdown.subclassDialect = function (d) {
|
|
function Block() {
|
|
}
|
|
|
|
Block.prototype = d.block;
|
|
|
|
function Inline() {
|
|
}
|
|
|
|
Inline.prototype = d.inline;
|
|
|
|
return {block: new Block(), inline: new Inline()};
|
|
};
|
|
|
|
Markdown.buildBlockOrder(Markdown.dialects.Gruber.block);
|
|
Markdown.buildInlinePatterns(Markdown.dialects.Gruber.inline);
|
|
|
|
Markdown.dialects.Maruku = Markdown.subclassDialect(Markdown.dialects.Gruber);
|
|
|
|
Markdown.dialects.Maruku.processMetaHash = function processMetaHash(meta_string) {
|
|
var meta = split_meta_hash(meta_string),
|
|
attr = {};
|
|
|
|
for (var i = 0; i < meta.length; ++i) {
|
|
// id: #foo
|
|
if (/^#/.test(meta[i])) {
|
|
attr.id = meta[i].substring(1);
|
|
}
|
|
// class: .foo
|
|
else if (/^\./.test(meta[i])) {
|
|
// if class already exists, append the new one
|
|
if (attr['class']) {
|
|
attr['class'] = attr['class'] + meta[i].replace(/./, " ");
|
|
}
|
|
else {
|
|
attr['class'] = meta[i].substring(1);
|
|
}
|
|
}
|
|
// attribute: foo=bar
|
|
else if (/\=/.test(meta[i])) {
|
|
var s = meta[i].split(/\=/);
|
|
attr[s[0]] = s[1];
|
|
}
|
|
}
|
|
|
|
return attr;
|
|
}
|
|
|
|
function split_meta_hash(meta_string) {
|
|
var meta = meta_string.split(""),
|
|
parts = [""],
|
|
in_quotes = false;
|
|
|
|
while (meta.length) {
|
|
var letter = meta.shift();
|
|
switch (letter) {
|
|
case " " :
|
|
// if we're in a quoted section, keep it
|
|
if (in_quotes) {
|
|
parts[parts.length - 1] += letter;
|
|
}
|
|
// otherwise make a new part
|
|
else {
|
|
parts.push("");
|
|
}
|
|
break;
|
|
case "'" :
|
|
case '"' :
|
|
// reverse the quotes and move straight on
|
|
in_quotes = !in_quotes;
|
|
break;
|
|
case "\\" :
|
|
// shift off the next letter to be used straight away.
|
|
// it was escaped so we'll keep it whatever it is
|
|
letter = meta.shift();
|
|
default :
|
|
parts[parts.length - 1] += letter;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return parts;
|
|
}
|
|
|
|
Markdown.dialects.Maruku.block.document_meta = function document_meta(block, next) {
|
|
// we're only interested in the first block
|
|
if (block.lineNumber > 1) return undefined;
|
|
|
|
// document_meta blocks consist of one or more lines of `Key: Value\n`
|
|
if (!block.match(/^(?:\w+:.*\n)*\w+:.*$/)) return undefined;
|
|
|
|
// make an attribute node if it doesn't exist
|
|
if (!extract_attr(this.tree)) {
|
|
this.tree.splice(1, 0, {});
|
|
}
|
|
|
|
var pairs = block.split(/\n/);
|
|
for (p in pairs) {
|
|
var m = pairs[p].match(/(\w+):\s*(.*)$/),
|
|
key = m[1].toLowerCase(),
|
|
value = m[2];
|
|
|
|
this.tree[1][key] = value;
|
|
}
|
|
|
|
// document_meta produces no content!
|
|
return [];
|
|
};
|
|
|
|
Markdown.dialects.Maruku.block.block_meta = function block_meta(block, next) {
|
|
// check if the last line of the block is an meta hash
|
|
var m = block.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);
|
|
if (!m) return undefined;
|
|
|
|
// process the meta hash
|
|
var attr = this.dialect.processMetaHash(m[2]);
|
|
|
|
var hash;
|
|
|
|
// if we matched ^ then we need to apply meta to the previous block
|
|
if (m[1] === "") {
|
|
var node = this.tree[this.tree.length - 1];
|
|
hash = extract_attr(node);
|
|
|
|
// if the node is a string (rather than JsonML), bail
|
|
if (typeof node === "string") return undefined;
|
|
|
|
// create the attribute hash if it doesn't exist
|
|
if (!hash) {
|
|
hash = {};
|
|
node.splice(1, 0, hash);
|
|
}
|
|
|
|
// add the attributes in
|
|
for (a in attr) {
|
|
hash[a] = attr[a];
|
|
}
|
|
|
|
// return nothing so the meta hash is removed
|
|
return [];
|
|
}
|
|
|
|
// pull the meta hash off the block and process what's left
|
|
var b = block.replace(/\n.*$/, ""),
|
|
result = this.processBlock(b, []);
|
|
|
|
// get or make the attributes hash
|
|
hash = extract_attr(result[0]);
|
|
if (!hash) {
|
|
hash = {};
|
|
result[0].splice(1, 0, hash);
|
|
}
|
|
|
|
// attach the attributes to the block
|
|
for (a in attr) {
|
|
hash[a] = attr[a];
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
Markdown.dialects.Maruku.block.definition_list = function definition_list(block, next) {
|
|
// one or more terms followed by one or more definitions, in a single block
|
|
var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,
|
|
list = ["dl"],
|
|
i;
|
|
|
|
// see if we're dealing with a tight or loose block
|
|
if ((m = block.match(tight))) {
|
|
// pull subsequent tight DL blocks out of `next`
|
|
var blocks = [block];
|
|
while (next.length && tight.exec(next[0])) {
|
|
blocks.push(next.shift());
|
|
}
|
|
|
|
for (var b = 0; b < blocks.length; ++b) {
|
|
var m = blocks[b].match(tight),
|
|
terms = m[1].replace(/\n$/, "").split(/\n/),
|
|
defns = m[2].split(/\n:\s+/);
|
|
|
|
// print( uneval( m ) );
|
|
|
|
for (i = 0; i < terms.length; ++i) {
|
|
list.push(["dt", terms[i]]);
|
|
}
|
|
|
|
for (i = 0; i < defns.length; ++i) {
|
|
// run inline processing over the definition
|
|
list.push(["dd"].concat(this.processInline(defns[i].replace(/(\n)\s+/, "$1"))));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
|
|
return [list];
|
|
};
|
|
|
|
Markdown.dialects.Maruku.inline["{:"] = function inline_meta(text, matches, out) {
|
|
if (!out.length) {
|
|
return [2, "{:"];
|
|
}
|
|
|
|
// get the preceeding element
|
|
var before = out[out.length - 1];
|
|
|
|
if (typeof before === "string") {
|
|
return [2, "{:"];
|
|
}
|
|
|
|
// match a meta hash
|
|
var m = text.match(/^\{:\s*((?:\\\}|[^\}])*)\s*\}/);
|
|
|
|
// no match, false alarm
|
|
if (!m) {
|
|
return [2, "{:"];
|
|
}
|
|
|
|
// attach the attributes to the preceeding element
|
|
var meta = this.dialect.processMetaHash(m[1]),
|
|
attr = extract_attr(before);
|
|
|
|
if (!attr) {
|
|
attr = {};
|
|
before.splice(1, 0, attr);
|
|
}
|
|
|
|
for (var k in meta) {
|
|
attr[k] = meta[k];
|
|
}
|
|
|
|
// cut out the string and replace it with nothing
|
|
return [m[0].length, ""];
|
|
};
|
|
|
|
Markdown.buildBlockOrder(Markdown.dialects.Maruku.block);
|
|
Markdown.buildInlinePatterns(Markdown.dialects.Maruku.inline);
|
|
|
|
var isArray = Array.isArray || function (obj) {
|
|
return Object.prototype.toString.call(obj) == '[object Array]';
|
|
};
|
|
|
|
var forEach;
|
|
// Don't mess with Array.prototype. Its not friendly
|
|
if (Array.prototype.forEach) {
|
|
forEach = function (arr, cb, thisp) {
|
|
return arr.forEach(cb, thisp);
|
|
};
|
|
}
|
|
else {
|
|
forEach = function (arr, cb, thisp) {
|
|
for (var i = 0; i < arr.length; i++) {
|
|
cb.call(thisp || arr, arr[i], i, arr);
|
|
}
|
|
}
|
|
}
|
|
|
|
function extract_attr(jsonml) {
|
|
return isArray(jsonml)
|
|
&& jsonml.length > 1
|
|
&& typeof jsonml[1] === "object"
|
|
&& !(isArray(jsonml[1]))
|
|
? jsonml[1]
|
|
: undefined;
|
|
}
|
|
|
|
|
|
/**
|
|
* renderJsonML( jsonml[, options] ) -> String
|
|
* - jsonml (Array): JsonML array to render to XML
|
|
* - options (Object): options
|
|
*
|
|
* Converts the given JsonML into well-formed XML.
|
|
*
|
|
* The options currently understood are:
|
|
*
|
|
* - root (Boolean): wether or not the root node should be included in the
|
|
* output, or just its children. The default `false` is to not include the
|
|
* root itself.
|
|
*/
|
|
expose.renderJsonML = function (jsonml, options) {
|
|
options = options || {};
|
|
// include the root element in the rendered output?
|
|
options.root = options.root || false;
|
|
|
|
var content = [];
|
|
|
|
if (options.root) {
|
|
content.push(render_tree(jsonml));
|
|
}
|
|
else {
|
|
jsonml.shift(); // get rid of the tag
|
|
if (jsonml.length && typeof jsonml[0] === "object" && !(jsonml[0] instanceof Array)) {
|
|
jsonml.shift(); // get rid of the attributes
|
|
}
|
|
|
|
while (jsonml.length) {
|
|
content.push(render_tree(jsonml.shift()));
|
|
}
|
|
}
|
|
|
|
return content.join("\n\n");
|
|
};
|
|
|
|
function escapeHTML(text) {
|
|
return text.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """)
|
|
.replace(/'/g, "'");
|
|
}
|
|
|
|
function render_tree(jsonml) {
|
|
// basic case
|
|
if (typeof jsonml === "string") {
|
|
return escapeHTML(jsonml);
|
|
}
|
|
|
|
var tag = jsonml.shift(),
|
|
attributes = {},
|
|
content = [];
|
|
|
|
if (jsonml.length && typeof jsonml[0] === "object" && !(jsonml[0] instanceof Array)) {
|
|
attributes = jsonml.shift();
|
|
}
|
|
|
|
while (jsonml.length) {
|
|
content.push(arguments.callee(jsonml.shift()));
|
|
}
|
|
|
|
var tag_attrs = "";
|
|
for (var a in attributes) {
|
|
tag_attrs += " " + a + '="' + escapeHTML(attributes[a]) + '"';
|
|
}
|
|
|
|
// be careful about adding whitespace here for inline elements
|
|
if (tag == "img" || tag == "br" || tag == "hr") {
|
|
return "<" + tag + tag_attrs + "/>";
|
|
}
|
|
else {
|
|
return "<" + tag + tag_attrs + ">" + content.join("") + "</" + tag + ">";
|
|
}
|
|
}
|
|
|
|
function convert_tree_to_html(tree, references, options) {
|
|
var i;
|
|
options = options || {};
|
|
|
|
// shallow clone
|
|
var jsonml = tree.slice(0);
|
|
|
|
if (typeof options.preprocessTreeNode === "function") {
|
|
jsonml = options.preprocessTreeNode(jsonml, references);
|
|
}
|
|
|
|
// Clone attributes if they exist
|
|
var attrs = extract_attr(jsonml);
|
|
if (attrs) {
|
|
jsonml[1] = {};
|
|
for (i in attrs) {
|
|
jsonml[1][i] = attrs[i];
|
|
}
|
|
attrs = jsonml[1];
|
|
}
|
|
|
|
// basic case
|
|
if (typeof jsonml === "string") {
|
|
return jsonml;
|
|
}
|
|
|
|
// convert this node
|
|
switch (jsonml[0]) {
|
|
case "header":
|
|
jsonml[0] = "h" + jsonml[1].level;
|
|
delete jsonml[1].level;
|
|
break;
|
|
case "bulletlist":
|
|
jsonml[0] = "ul";
|
|
break;
|
|
case "numberlist":
|
|
jsonml[0] = "ol";
|
|
break;
|
|
case "listitem":
|
|
jsonml[0] = "li";
|
|
break;
|
|
case "para":
|
|
jsonml[0] = "p";
|
|
break;
|
|
case "markdown":
|
|
jsonml[0] = "html";
|
|
if (attrs) delete attrs.references;
|
|
break;
|
|
case "code_block":
|
|
jsonml[0] = "pre";
|
|
i = attrs ? 2 : 1;
|
|
var code = ["code"];
|
|
code.push.apply(code, jsonml.splice(i));
|
|
jsonml[i] = code;
|
|
break;
|
|
case "inlinecode":
|
|
jsonml[0] = "code";
|
|
break;
|
|
case "img":
|
|
jsonml[1].src = jsonml[1].href;
|
|
delete jsonml[1].href;
|
|
break;
|
|
case "linebreak":
|
|
jsonml[0] = "br";
|
|
break;
|
|
case "link":
|
|
jsonml[0] = "a";
|
|
break;
|
|
case "link_ref":
|
|
jsonml[0] = "a";
|
|
|
|
// grab this ref and clean up the attribute node
|
|
var ref = references[attrs.ref];
|
|
|
|
// if the reference exists, make the link
|
|
if (ref) {
|
|
delete attrs.ref;
|
|
|
|
// add in the href and title, if present
|
|
attrs.href = ref.href;
|
|
if (ref.title) {
|
|
attrs.title = ref.title;
|
|
}
|
|
|
|
// get rid of the unneeded original text
|
|
delete attrs.original;
|
|
}
|
|
// the reference doesn't exist, so revert to plain text
|
|
else {
|
|
return attrs.original;
|
|
}
|
|
break;
|
|
case "img_ref":
|
|
jsonml[0] = "img";
|
|
|
|
// grab this ref and clean up the attribute node
|
|
var ref = references[attrs.ref];
|
|
|
|
// if the reference exists, make the link
|
|
if (ref) {
|
|
delete attrs.ref;
|
|
|
|
// add in the href and title, if present
|
|
attrs.src = ref.href;
|
|
if (ref.title) {
|
|
attrs.title = ref.title;
|
|
}
|
|
|
|
// get rid of the unneeded original text
|
|
delete attrs.original;
|
|
}
|
|
// the reference doesn't exist, so revert to plain text
|
|
else {
|
|
return attrs.original;
|
|
}
|
|
break;
|
|
}
|
|
|
|
// convert all the children
|
|
i = 1;
|
|
|
|
// deal with the attribute node, if it exists
|
|
if (attrs) {
|
|
// if there are keys, skip over it
|
|
for (var key in jsonml[1]) {
|
|
i = 2;
|
|
}
|
|
// if there aren't, remove it
|
|
if (i === 1) {
|
|
jsonml.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
for (; i < jsonml.length; ++i) {
|
|
jsonml[i] = arguments.callee(jsonml[i], references, options);
|
|
}
|
|
|
|
return jsonml;
|
|
}
|
|
|
|
|
|
// merges adjacent text nodes into a single node
|
|
function merge_text_nodes(jsonml) {
|
|
// skip the tag name and attribute hash
|
|
var i = extract_attr(jsonml) ? 2 : 1;
|
|
|
|
while (i < jsonml.length) {
|
|
// if it's a string check the next item too
|
|
if (typeof jsonml[i] === "string") {
|
|
if (i + 1 < jsonml.length && typeof jsonml[i + 1] === "string") {
|
|
// merge the second string into the first and remove it
|
|
jsonml[i] += jsonml.splice(i + 1, 1)[0];
|
|
}
|
|
else {
|
|
++i;
|
|
}
|
|
}
|
|
// if it's not a string recurse
|
|
else {
|
|
arguments.callee(jsonml[i]);
|
|
++i;
|
|
}
|
|
}
|
|
}
|
|
|
|
})((function () {
|
|
if (typeof exports === "undefined") {
|
|
window.markdown = {};
|
|
return window.markdown;
|
|
}
|
|
else {
|
|
return exports;
|
|
}
|
|
})());
|
|
// Knockout JavaScript library v2.2.0
|
|
// (c) Steven Sanderson - http://knockoutjs.com/
|
|
// License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
|
|
(function () {
|
|
function i(v) {
|
|
throw v;
|
|
}
|
|
|
|
var l = !0, n = null, q = !1;
|
|
|
|
function t(v) {
|
|
return function () {
|
|
return v
|
|
}
|
|
};var w = window, x = document, fa = navigator, E = window.jQuery, H = void 0;
|
|
|
|
function K(v) {
|
|
function ga(a, d, c, e, f) {
|
|
var g = [], a = b.j(function () {
|
|
var a = d(c, f) || [];
|
|
0 < g.length && (b.a.Xa(L(g), a), e && b.r.K(e, n, [c, a, f]));
|
|
g.splice(0, g.length);
|
|
b.a.P(g, a)
|
|
}, n, {
|
|
W: a, Ja: function () {
|
|
return 0 == g.length || !b.a.X(g[0])
|
|
}
|
|
});
|
|
return {M: g, j: a.oa() ? a : H}
|
|
}
|
|
|
|
function L(a) {
|
|
for (; a.length && !b.a.X(a[0]);) a.splice(0, 1);
|
|
if (1 < a.length) {
|
|
for (var d = a[0], c = a[a.length - 1], e = [d]; d !== c;) {
|
|
d = d.nextSibling;
|
|
if (!d) return;
|
|
e.push(d)
|
|
}
|
|
Array.prototype.splice.apply(a, [0, a.length].concat(e))
|
|
}
|
|
return a
|
|
}
|
|
|
|
function R(a, b, c, e, f) {
|
|
var g = Math.min,
|
|
h = Math.max, j = [], k, m = a.length, p, r = b.length, u = r - m || 1, F = m + r + 1, I, z, y;
|
|
for (k = 0; k <= m; k++) {
|
|
z = I;
|
|
j.push(I = []);
|
|
y = g(r, k + u);
|
|
for (p = h(0, k - 1); p <= y; p++) I[p] = p ? k ? a[k - 1] === b[p - 1] ? z[p - 1] : g(z[p] || F, I[p - 1] || F) + 1 : p + 1 : k + 1
|
|
}
|
|
g = [];
|
|
h = [];
|
|
u = [];
|
|
k = m;
|
|
for (p = r; k || p;) r = j[k][p] - 1, p && r === j[k][p - 1] ? h.push(g[g.length] = {
|
|
status: c,
|
|
value: b[--p],
|
|
index: p
|
|
}) : k && r === j[k - 1][p] ? u.push(g[g.length] = {
|
|
status: e,
|
|
value: a[--k],
|
|
index: k
|
|
}) : (g.push({status: "retained", value: b[--p]}), --k);
|
|
if (h.length && u.length) for (var a = 10 * m, s, b = c = 0; (f || b < a) && (s = h[c]); c++) {
|
|
for (e =
|
|
0; j = u[e]; e++) if (s.value === j.value) {
|
|
s.moved = j.index;
|
|
j.moved = s.index;
|
|
u.splice(e, 1);
|
|
b = e = 0;
|
|
break
|
|
}
|
|
b += e
|
|
}
|
|
return g.reverse()
|
|
}
|
|
|
|
function S(a, d, c, e, f) {
|
|
var f = f || {}, g = a && M(a), g = g && g.ownerDocument, h = f.templateEngine || N;
|
|
b.ya.ub(c, h, g);
|
|
c = h.renderTemplate(c, e, f, g);
|
|
("number" != typeof c.length || 0 < c.length && "number" != typeof c[0].nodeType) && i(Error("Template engine must return an array of DOM nodes"));
|
|
g = q;
|
|
switch (d) {
|
|
case "replaceChildren":
|
|
b.e.N(a, c);
|
|
g = l;
|
|
break;
|
|
case "replaceNode":
|
|
b.a.Xa(a, c);
|
|
g = l;
|
|
break;
|
|
case "ignoreTargetNode":
|
|
break;
|
|
default:
|
|
i(Error("Unknown renderMode: " + d))
|
|
}
|
|
g && (T(c, e), f.afterRender && b.r.K(f.afterRender, n, [c, e.$data]));
|
|
return c
|
|
}
|
|
|
|
function M(a) {
|
|
return a.nodeType ? a : 0 < a.length ? a[0] : n
|
|
}
|
|
|
|
function T(a, d) {
|
|
if (a.length) {
|
|
var c = a[0], e = a[a.length - 1];
|
|
U(c, e, function (a) {
|
|
b.Ca(d, a)
|
|
});
|
|
U(c, e, function (a) {
|
|
b.s.hb(a, [d])
|
|
})
|
|
}
|
|
}
|
|
|
|
function U(a, d, c) {
|
|
for (var e, d = b.e.nextSibling(d); a && (e = a) !== d;) a = b.e.nextSibling(e), (1 === e.nodeType || 8 === e.nodeType) && c(e)
|
|
}
|
|
|
|
function V(a, d, c) {
|
|
for (var a = b.g.aa(a), e = b.g.Q, f = 0; f < a.length; f++) {
|
|
var g = a[f].key;
|
|
if (e.hasOwnProperty(g)) {
|
|
var h =
|
|
e[g];
|
|
"function" === typeof h ? (g = h(a[f].value)) && i(Error(g)) : h || i(Error("This template engine does not support the '" + g + "' binding within its templates"))
|
|
}
|
|
}
|
|
a = "ko.__tr_ambtns(function($context,$element){return(function(){return{ " + b.g.ba(a) + " } })()})";
|
|
return c.createJavaScriptEvaluatorBlock(a) + d
|
|
}
|
|
|
|
function W(a, d, c, e) {
|
|
function f(a) {
|
|
return function () {
|
|
return j[a]
|
|
}
|
|
}
|
|
|
|
function g() {
|
|
return j
|
|
}
|
|
|
|
var h = 0, j, k;
|
|
b.j(function () {
|
|
var m = c && c instanceof b.z ? c : new b.z(b.a.d(c)), p = m.$data;
|
|
e && b.cb(a, m);
|
|
if (j = ("function" == typeof d ?
|
|
d(m, a) : d) || b.J.instance.getBindings(a, m)) {
|
|
if (0 === h) {
|
|
h = 1;
|
|
for (var r in j) {
|
|
var u = b.c[r];
|
|
u && 8 === a.nodeType && !b.e.I[r] && i(Error("The binding '" + r + "' cannot be used with virtual elements"));
|
|
if (u && "function" == typeof u.init && (u = (0, u.init)(a, f(r), g, p, m)) && u.controlsDescendantBindings) k !== H && i(Error("Multiple bindings (" + k + " and " + r + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.")), k = r
|
|
}
|
|
h = 2
|
|
}
|
|
if (2 === h) for (r in j) (u = b.c[r]) && "function" ==
|
|
typeof u.update && (0, u.update)(a, f(r), g, p, m)
|
|
}
|
|
}, n, {W: a});
|
|
return {Mb: k === H}
|
|
}
|
|
|
|
function X(a, d, c) {
|
|
var e = l, f = 1 === d.nodeType;
|
|
f && b.e.Sa(d);
|
|
if (f && c || b.J.instance.nodeHasBindings(d)) e = W(d, n, a, c).Mb;
|
|
e && Y(a, d, !f)
|
|
}
|
|
|
|
function Y(a, d, c) {
|
|
for (var e = b.e.firstChild(d); d = e;) e = b.e.nextSibling(d), X(a, d, c)
|
|
}
|
|
|
|
function Z(a, b) {
|
|
var c = $(a, b);
|
|
return c ? 0 < c.length ? c[c.length - 1].nextSibling : a.nextSibling : n
|
|
}
|
|
|
|
function $(a, b) {
|
|
for (var c = a, e = 1, f = []; c = c.nextSibling;) {
|
|
if (G(c) && (e--, 0 === e)) return f;
|
|
f.push(c);
|
|
A(c) && e++
|
|
}
|
|
b || i(Error("Cannot find closing comment tag to match: " +
|
|
a.nodeValue));
|
|
return n
|
|
}
|
|
|
|
function G(a) {
|
|
return 8 == a.nodeType && (J ? a.text : a.nodeValue).match(ha)
|
|
}
|
|
|
|
function A(a) {
|
|
return 8 == a.nodeType && (J ? a.text : a.nodeValue).match(ia)
|
|
}
|
|
|
|
function O(a, b) {
|
|
for (var c = n; a != c;) c = a, a = a.replace(ja, function (a, c) {
|
|
return b[c]
|
|
});
|
|
return a
|
|
}
|
|
|
|
function ka() {
|
|
var a = [], d = [];
|
|
this.save = function (c, e) {
|
|
var f = b.a.i(a, c);
|
|
0 <= f ? d[f] = e : (a.push(c), d.push(e))
|
|
};
|
|
this.get = function (c) {
|
|
c = b.a.i(a, c);
|
|
return 0 <= c ? d[c] : H
|
|
}
|
|
}
|
|
|
|
function aa(a, b, c) {
|
|
function e(e) {
|
|
var g = b(a[e]);
|
|
switch (typeof g) {
|
|
case "boolean":
|
|
case "number":
|
|
case "string":
|
|
case "function":
|
|
f[e] =
|
|
g;
|
|
break;
|
|
case "object":
|
|
case "undefined":
|
|
var h = c.get(g);
|
|
f[e] = h !== H ? h : aa(g, b, c)
|
|
}
|
|
}
|
|
|
|
c = c || new ka;
|
|
a = b(a);
|
|
if (!("object" == typeof a && a !== n && a !== H && !(a instanceof Date))) return a;
|
|
var f = a instanceof Array ? [] : {};
|
|
c.save(a, f);
|
|
var g = a;
|
|
if (g instanceof Array) {
|
|
for (var h = 0; h < g.length; h++) e(h);
|
|
"function" == typeof g.toJSON && e("toJSON")
|
|
} else for (h in g) e(h);
|
|
return f
|
|
}
|
|
|
|
function ba(a, d) {
|
|
if (a) if (8 == a.nodeType) {
|
|
var c = b.s.Ta(a.nodeValue);
|
|
c != n && d.push({rb: a, Eb: c})
|
|
} else if (1 == a.nodeType) for (var c = 0, e = a.childNodes, f = e.length; c < f; c++) ba(e[c],
|
|
d)
|
|
}
|
|
|
|
function P(a, d, c, e) {
|
|
b.c[a] = {
|
|
init: function (a) {
|
|
b.a.f.set(a, ca, {});
|
|
return {controlsDescendantBindings: l}
|
|
}, update: function (a, g, h, j, k) {
|
|
var h = b.a.f.get(a, ca), g = b.a.d(g()), j = !c !== !g, m = !h.Ya;
|
|
if (m || d || j !== h.pb) m && (h.Ya = b.a.Ha(b.e.childNodes(a), l)), j ? (m || b.e.N(a, b.a.Ha(h.Ya)), b.Da(e ? e(k, g) : k, a)) : b.e.Y(a), h.pb = j
|
|
}
|
|
};
|
|
b.g.Q[a] = q;
|
|
b.e.I[a] = l
|
|
}
|
|
|
|
function da(a, d, c) {
|
|
c && d !== b.k.q(a) && b.k.T(a, d);
|
|
d !== b.k.q(a) && b.r.K(b.a.Aa, n, [a, "change"])
|
|
}
|
|
|
|
var b = "undefined" !== typeof v ? v : {};
|
|
b.b = function (a, d) {
|
|
for (var c = a.split("."), e = b, f = 0; f <
|
|
c.length - 1; f++) e = e[c[f]];
|
|
e[c[c.length - 1]] = d
|
|
};
|
|
b.p = function (a, b, c) {
|
|
a[b] = c
|
|
};
|
|
b.version = "2.2.0";
|
|
b.b("version", b.version);
|
|
b.a = new function () {
|
|
function a(a, d) {
|
|
if ("input" !== b.a.u(a) || !a.type || "click" != d.toLowerCase()) return q;
|
|
var c = a.type;
|
|
return "checkbox" == c || "radio" == c
|
|
}
|
|
|
|
var d = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, c = {}, e = {};
|
|
c[/Firefox\/2/i.test(fa.userAgent) ? "KeyboardEvent" : "UIEvents"] = ["keyup", "keydown", "keypress"];
|
|
c.MouseEvents = "click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");
|
|
for (var f in c) {
|
|
var g = c[f];
|
|
if (g.length) for (var h = 0, j = g.length; h < j; h++) e[g[h]] = f
|
|
}
|
|
var k = {propertychange: l}, m, c = 3;
|
|
f = x.createElement("div");
|
|
for (g = f.getElementsByTagName("i"); f.innerHTML = "<\!--[if gt IE " + ++c + "]><i></i><![endif]--\>", g[0];) ;
|
|
m = 4 < c ? c : H;
|
|
return {
|
|
Ma: ["authenticity_token", /^__RequestVerificationToken(_.*)?$/], o: function (a, b) {
|
|
for (var d = 0, c = a.length; d < c; d++) b(a[d])
|
|
}, i: function (a, b) {
|
|
if ("function" == typeof Array.prototype.indexOf) return Array.prototype.indexOf.call(a, b);
|
|
for (var d = 0, c = a.length; d <
|
|
c; d++) if (a[d] === b) return d;
|
|
return -1
|
|
}, kb: function (a, b, d) {
|
|
for (var c = 0, e = a.length; c < e; c++) if (b.call(d, a[c])) return a[c];
|
|
return n
|
|
}, ga: function (a, d) {
|
|
var c = b.a.i(a, d);
|
|
0 <= c && a.splice(c, 1)
|
|
}, Fa: function (a) {
|
|
for (var a = a || [], d = [], c = 0, e = a.length; c < e; c++) 0 > b.a.i(d, a[c]) && d.push(a[c]);
|
|
return d
|
|
}, V: function (a, b) {
|
|
for (var a = a || [], d = [], c = 0, e = a.length; c < e; c++) d.push(b(a[c]));
|
|
return d
|
|
}, fa: function (a, b) {
|
|
for (var a = a || [], d = [], c = 0, e = a.length; c < e; c++) b(a[c]) && d.push(a[c]);
|
|
return d
|
|
}, P: function (a, b) {
|
|
if (b instanceof Array) a.push.apply(a,
|
|
b); else for (var d = 0, c = b.length; d < c; d++) a.push(b[d]);
|
|
return a
|
|
}, extend: function (a, b) {
|
|
if (b) for (var d in b) b.hasOwnProperty(d) && (a[d] = b[d]);
|
|
return a
|
|
}, ka: function (a) {
|
|
for (; a.firstChild;) b.removeNode(a.firstChild)
|
|
}, Gb: function (a) {
|
|
for (var a = b.a.L(a), d = x.createElement("div"), c = 0, e = a.length; c < e; c++) d.appendChild(b.A(a[c]));
|
|
return d
|
|
}, Ha: function (a, d) {
|
|
for (var c = 0, e = a.length, g = []; c < e; c++) {
|
|
var f = a[c].cloneNode(l);
|
|
g.push(d ? b.A(f) : f)
|
|
}
|
|
return g
|
|
}, N: function (a, d) {
|
|
b.a.ka(a);
|
|
if (d) for (var c = 0, e = d.length; c < e; c++) a.appendChild(d[c])
|
|
},
|
|
Xa: function (a, d) {
|
|
var c = a.nodeType ? [a] : a;
|
|
if (0 < c.length) {
|
|
for (var e = c[0], g = e.parentNode, f = 0, h = d.length; f < h; f++) g.insertBefore(d[f], e);
|
|
f = 0;
|
|
for (h = c.length; f < h; f++) b.removeNode(c[f])
|
|
}
|
|
}, ab: function (a, b) {
|
|
7 > m ? a.setAttribute("selected", b) : a.selected = b
|
|
}, D: function (a) {
|
|
return (a || "").replace(d, "")
|
|
}, Qb: function (a, d) {
|
|
for (var c = [], e = (a || "").split(d), f = 0, g = e.length; f < g; f++) {
|
|
var h = b.a.D(e[f]);
|
|
"" !== h && c.push(h)
|
|
}
|
|
return c
|
|
}, Nb: function (a, b) {
|
|
a = a || "";
|
|
return b.length > a.length ? q : a.substring(0, b.length) === b
|
|
}, sb: function (a, b) {
|
|
if (b.compareDocumentPosition) return 16 ==
|
|
(b.compareDocumentPosition(a) & 16);
|
|
for (; a != n;) {
|
|
if (a == b) return l;
|
|
a = a.parentNode
|
|
}
|
|
return q
|
|
}, X: function (a) {
|
|
return b.a.sb(a, a.ownerDocument)
|
|
}, u: function (a) {
|
|
return a && a.tagName && a.tagName.toLowerCase()
|
|
}, n: function (b, d, c) {
|
|
var e = m && k[d];
|
|
if (!e && "undefined" != typeof E) {
|
|
if (a(b, d)) var f = c, c = function (a, b) {
|
|
var d = this.checked;
|
|
b && (this.checked = b.mb !== l);
|
|
f.call(this, a);
|
|
this.checked = d
|
|
};
|
|
E(b).bind(d, c)
|
|
} else !e && "function" == typeof b.addEventListener ? b.addEventListener(d, c, q) : "undefined" != typeof b.attachEvent ? b.attachEvent("on" +
|
|
d, function (a) {
|
|
c.call(b, a)
|
|
}) : i(Error("Browser doesn't support addEventListener or attachEvent"))
|
|
}, Aa: function (b, d) {
|
|
(!b || !b.nodeType) && i(Error("element must be a DOM node when calling triggerEvent"));
|
|
if ("undefined" != typeof E) {
|
|
var c = [];
|
|
a(b, d) && c.push({mb: b.checked});
|
|
E(b).trigger(d, c)
|
|
} else "function" == typeof x.createEvent ? "function" == typeof b.dispatchEvent ? (c = x.createEvent(e[d] || "HTMLEvents"), c.initEvent(d, l, l, w, 0, 0, 0, 0, 0, q, q, q, q, 0, b), b.dispatchEvent(c)) : i(Error("The supplied element doesn't support dispatchEvent")) :
|
|
"undefined" != typeof b.fireEvent ? (a(b, d) && (b.checked = b.checked !== l), b.fireEvent("on" + d)) : i(Error("Browser doesn't support triggering events"))
|
|
}, d: function (a) {
|
|
return b.$(a) ? a() : a
|
|
}, ta: function (a) {
|
|
return b.$(a) ? a.t() : a
|
|
}, da: function (a, d, c) {
|
|
if (d) {
|
|
var e = /[\w-]+/g, f = a.className.match(e) || [];
|
|
b.a.o(d.match(e), function (a) {
|
|
var d = b.a.i(f, a);
|
|
0 <= d ? c || f.splice(d, 1) : c && f.push(a)
|
|
});
|
|
a.className = f.join(" ")
|
|
}
|
|
}, bb: function (a, d) {
|
|
var c = b.a.d(d);
|
|
if (c === n || c === H) c = "";
|
|
if (3 === a.nodeType) a.data = c; else {
|
|
var e = b.e.firstChild(a);
|
|
!e || 3 != e.nodeType || b.e.nextSibling(e) ? b.e.N(a, [x.createTextNode(c)]) : e.data = c;
|
|
b.a.vb(a)
|
|
}
|
|
}, $a: function (a, b) {
|
|
a.name = b;
|
|
if (7 >= m) try {
|
|
a.mergeAttributes(x.createElement("<input name='" + a.name + "'/>"), q)
|
|
} catch (d) {
|
|
}
|
|
}, vb: function (a) {
|
|
9 <= m && (a = 1 == a.nodeType ? a : a.parentNode, a.style && (a.style.zoom = a.style.zoom))
|
|
}, tb: function (a) {
|
|
if (9 <= m) {
|
|
var b = a.style.width;
|
|
a.style.width = 0;
|
|
a.style.width = b
|
|
}
|
|
}, Kb: function (a, d) {
|
|
for (var a = b.a.d(a), d = b.a.d(d), c = [], e = a; e <= d; e++) c.push(e);
|
|
return c
|
|
}, L: function (a) {
|
|
for (var b = [], d = 0, c = a.length; d <
|
|
c; d++) b.push(a[d]);
|
|
return b
|
|
}, Ob: 6 === m, Pb: 7 === m, Z: m, Na: function (a, d) {
|
|
for (var c = b.a.L(a.getElementsByTagName("input")).concat(b.a.L(a.getElementsByTagName("textarea"))), e = "string" == typeof d ? function (a) {
|
|
return a.name === d
|
|
} : function (a) {
|
|
return d.test(a.name)
|
|
}, f = [], g = c.length - 1; 0 <= g; g--) e(c[g]) && f.push(c[g]);
|
|
return f
|
|
}, Hb: function (a) {
|
|
return "string" == typeof a && (a = b.a.D(a)) ? w.JSON && w.JSON.parse ? w.JSON.parse(a) : (new Function("return " + a))() : n
|
|
}, wa: function (a, d, c) {
|
|
("undefined" == typeof JSON || "undefined" == typeof JSON.stringify) &&
|
|
i(Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"));
|
|
return JSON.stringify(b.a.d(a), d, c)
|
|
}, Ib: function (a, d, c) {
|
|
var c = c || {}, e = c.params || {}, f = c.includeFields || this.Ma, g = a;
|
|
if ("object" == typeof a && "form" === b.a.u(a)) for (var g = a.action, h = f.length - 1; 0 <= h; h--) for (var j = b.a.Na(a, f[h]), k = j.length - 1; 0 <= k; k--) e[j[k].name] = j[k].value;
|
|
var d = b.a.d(d), m = x.createElement("form");
|
|
m.style.display = "none";
|
|
m.action = g;
|
|
m.method = "post";
|
|
for (var v in d) a = x.createElement("input"), a.name = v, a.value = b.a.wa(b.a.d(d[v])), m.appendChild(a);
|
|
for (v in e) a = x.createElement("input"), a.name = v, a.value = e[v], m.appendChild(a);
|
|
x.body.appendChild(m);
|
|
c.submitter ? c.submitter(m) : m.submit();
|
|
setTimeout(function () {
|
|
m.parentNode.removeChild(m)
|
|
}, 0)
|
|
}
|
|
}
|
|
};
|
|
b.b("utils", b.a);
|
|
b.b("utils.arrayForEach", b.a.o);
|
|
b.b("utils.arrayFirst", b.a.kb);
|
|
b.b("utils.arrayFilter", b.a.fa);
|
|
b.b("utils.arrayGetDistinctValues", b.a.Fa);
|
|
b.b("utils.arrayIndexOf",
|
|
b.a.i);
|
|
b.b("utils.arrayMap", b.a.V);
|
|
b.b("utils.arrayPushAll", b.a.P);
|
|
b.b("utils.arrayRemoveItem", b.a.ga);
|
|
b.b("utils.extend", b.a.extend);
|
|
b.b("utils.fieldsIncludedWithJsonPost", b.a.Ma);
|
|
b.b("utils.getFormFields", b.a.Na);
|
|
b.b("utils.peekObservable", b.a.ta);
|
|
b.b("utils.postJson", b.a.Ib);
|
|
b.b("utils.parseJson", b.a.Hb);
|
|
b.b("utils.registerEventHandler", b.a.n);
|
|
b.b("utils.stringifyJson", b.a.wa);
|
|
b.b("utils.range", b.a.Kb);
|
|
b.b("utils.toggleDomNodeCssClass", b.a.da);
|
|
b.b("utils.triggerEvent", b.a.Aa);
|
|
b.b("utils.unwrapObservable",
|
|
b.a.d);
|
|
Function.prototype.bind || (Function.prototype.bind = function (a) {
|
|
var b = this, c = Array.prototype.slice.call(arguments), a = c.shift();
|
|
return function () {
|
|
return b.apply(a, c.concat(Array.prototype.slice.call(arguments)))
|
|
}
|
|
});
|
|
b.a.f = new function () {
|
|
var a = 0, d = "__ko__" + (new Date).getTime(), c = {};
|
|
return {
|
|
get: function (a, d) {
|
|
var c = b.a.f.getAll(a, q);
|
|
return c === H ? H : c[d]
|
|
}, set: function (a, d, c) {
|
|
c === H && b.a.f.getAll(a, q) === H || (b.a.f.getAll(a, l)[d] = c)
|
|
}, getAll: function (b, f) {
|
|
var g = b[d];
|
|
if (!g || !("null" !== g && c[g])) {
|
|
if (!f) return H;
|
|
g = b[d] = "ko" + a++;
|
|
c[g] = {}
|
|
}
|
|
return c[g]
|
|
}, clear: function (a) {
|
|
var b = a[d];
|
|
return b ? (delete c[b], a[d] = n, l) : q
|
|
}
|
|
}
|
|
};
|
|
b.b("utils.domData", b.a.f);
|
|
b.b("utils.domData.clear", b.a.f.clear);
|
|
b.a.F = new function () {
|
|
function a(a, d) {
|
|
var e = b.a.f.get(a, c);
|
|
e === H && d && (e = [], b.a.f.set(a, c, e));
|
|
return e
|
|
}
|
|
|
|
function d(c) {
|
|
var e = a(c, q);
|
|
if (e) for (var e = e.slice(0), j = 0; j < e.length; j++) e[j](c);
|
|
b.a.f.clear(c);
|
|
"function" == typeof E && "function" == typeof E.cleanData && E.cleanData([c]);
|
|
if (f[c.nodeType]) for (e = c.firstChild; c = e;) e = c.nextSibling, 8 === c.nodeType &&
|
|
d(c)
|
|
}
|
|
|
|
var c = "__ko_domNodeDisposal__" + (new Date).getTime(), e = {1: l, 8: l, 9: l}, f = {1: l, 9: l};
|
|
return {
|
|
Ba: function (b, d) {
|
|
"function" != typeof d && i(Error("Callback must be a function"));
|
|
a(b, l).push(d)
|
|
}, Wa: function (d, e) {
|
|
var f = a(d, q);
|
|
f && (b.a.ga(f, e), 0 == f.length && b.a.f.set(d, c, H))
|
|
}, A: function (a) {
|
|
if (e[a.nodeType] && (d(a), f[a.nodeType])) {
|
|
var c = [];
|
|
b.a.P(c, a.getElementsByTagName("*"));
|
|
for (var j = 0, k = c.length; j < k; j++) d(c[j])
|
|
}
|
|
return a
|
|
}, removeNode: function (a) {
|
|
b.A(a);
|
|
a.parentNode && a.parentNode.removeChild(a)
|
|
}
|
|
}
|
|
};
|
|
b.A = b.a.F.A;
|
|
b.removeNode = b.a.F.removeNode;
|
|
b.b("cleanNode", b.A);
|
|
b.b("removeNode", b.removeNode);
|
|
b.b("utils.domNodeDisposal", b.a.F);
|
|
b.b("utils.domNodeDisposal.addDisposeCallback", b.a.F.Ba);
|
|
b.b("utils.domNodeDisposal.removeDisposeCallback", b.a.F.Wa);
|
|
b.a.sa = function (a) {
|
|
var d;
|
|
if ("undefined" != typeof E) {
|
|
if ((d = E.clean([a])) && d[0]) {
|
|
for (a = d[0]; a.parentNode && 11 !== a.parentNode.nodeType;) a = a.parentNode;
|
|
a.parentNode && a.parentNode.removeChild(a)
|
|
}
|
|
} else {
|
|
var c = b.a.D(a).toLowerCase();
|
|
d = x.createElement("div");
|
|
c = c.match(/^<(thead|tbody|tfoot)/) &&
|
|
[1, "<table>", "</table>"] || !c.indexOf("<tr") && [2, "<table><tbody>", "</tbody></table>"] || (!c.indexOf("<td") || !c.indexOf("<th")) && [3, "<table><tbody><tr>", "</tr></tbody></table>"] || [0, "", ""];
|
|
a = "ignored<div>" + c[1] + a + c[2] + "</div>";
|
|
for ("function" == typeof w.innerShiv ? d.appendChild(w.innerShiv(a)) : d.innerHTML = a; c[0]--;) d = d.lastChild;
|
|
d = b.a.L(d.lastChild.childNodes)
|
|
}
|
|
return d
|
|
};
|
|
b.a.ca = function (a, d) {
|
|
b.a.ka(a);
|
|
d = b.a.d(d);
|
|
if (d !== n && d !== H) if ("string" != typeof d && (d = d.toString()), "undefined" != typeof E) E(a).html(d); else for (var c =
|
|
b.a.sa(d), e = 0; e < c.length; e++) a.appendChild(c[e])
|
|
};
|
|
b.b("utils.parseHtmlFragment", b.a.sa);
|
|
b.b("utils.setHtml", b.a.ca);
|
|
var Q = {};
|
|
b.s = {
|
|
qa: function (a) {
|
|
"function" != typeof a && i(Error("You can only pass a function to ko.memoization.memoize()"));
|
|
var b = (4294967296 * (1 + Math.random()) | 0).toString(16).substring(1) + (4294967296 * (1 + Math.random()) | 0).toString(16).substring(1);
|
|
Q[b] = a;
|
|
return "<\!--[ko_memo:" + b + "]--\>"
|
|
}, gb: function (a, b) {
|
|
var c = Q[a];
|
|
c === H && i(Error("Couldn't find any memo with ID " + a + ". Perhaps it's already been unmemoized."));
|
|
try {
|
|
return c.apply(n, b || []), l
|
|
} finally {
|
|
delete Q[a]
|
|
}
|
|
}, hb: function (a, d) {
|
|
var c = [];
|
|
ba(a, c);
|
|
for (var e = 0, f = c.length; e < f; e++) {
|
|
var g = c[e].rb, h = [g];
|
|
d && b.a.P(h, d);
|
|
b.s.gb(c[e].Eb, h);
|
|
g.nodeValue = "";
|
|
g.parentNode && g.parentNode.removeChild(g)
|
|
}
|
|
}, Ta: function (a) {
|
|
return (a = a.match(/^\[ko_memo\:(.*?)\]$/)) ? a[1] : n
|
|
}
|
|
};
|
|
b.b("memoization", b.s);
|
|
b.b("memoization.memoize", b.s.qa);
|
|
b.b("memoization.unmemoize", b.s.gb);
|
|
b.b("memoization.parseMemoText", b.s.Ta);
|
|
b.b("memoization.unmemoizeDomNodeAndDescendants", b.s.hb);
|
|
b.La = {
|
|
throttle: function (a,
|
|
d) {
|
|
a.throttleEvaluation = d;
|
|
var c = n;
|
|
return b.j({
|
|
read: a, write: function (b) {
|
|
clearTimeout(c);
|
|
c = setTimeout(function () {
|
|
a(b)
|
|
}, d)
|
|
}
|
|
})
|
|
}, notify: function (a, d) {
|
|
a.equalityComparer = "always" == d ? t(q) : b.m.fn.equalityComparer;
|
|
return a
|
|
}
|
|
};
|
|
b.b("extenders", b.La);
|
|
b.eb = function (a, d, c) {
|
|
this.target = a;
|
|
this.ha = d;
|
|
this.qb = c;
|
|
b.p(this, "dispose", this.B)
|
|
};
|
|
b.eb.prototype.B = function () {
|
|
this.Bb = l;
|
|
this.qb()
|
|
};
|
|
b.S = function () {
|
|
this.w = {};
|
|
b.a.extend(this, b.S.fn);
|
|
b.p(this, "subscribe", this.xa);
|
|
b.p(this, "extend", this.extend);
|
|
b.p(this, "getSubscriptionsCount",
|
|
this.xb)
|
|
};
|
|
b.S.fn = {
|
|
xa: function (a, d, c) {
|
|
var c = c || "change", a = d ? a.bind(d) : a, e = new b.eb(this, a, function () {
|
|
b.a.ga(this.w[c], e)
|
|
}.bind(this));
|
|
this.w[c] || (this.w[c] = []);
|
|
this.w[c].push(e);
|
|
return e
|
|
}, notifySubscribers: function (a, d) {
|
|
d = d || "change";
|
|
this.w[d] && b.r.K(function () {
|
|
b.a.o(this.w[d].slice(0), function (b) {
|
|
b && b.Bb !== l && b.ha(a)
|
|
})
|
|
}, this)
|
|
}, xb: function () {
|
|
var a = 0, b;
|
|
for (b in this.w) this.w.hasOwnProperty(b) && (a += this.w[b].length);
|
|
return a
|
|
}, extend: function (a) {
|
|
var d = this;
|
|
if (a) for (var c in a) {
|
|
var e = b.La[c];
|
|
"function" ==
|
|
typeof e && (d = e(d, a[c]))
|
|
}
|
|
return d
|
|
}
|
|
};
|
|
b.Pa = function (a) {
|
|
return "function" == typeof a.xa && "function" == typeof a.notifySubscribers
|
|
};
|
|
b.b("subscribable", b.S);
|
|
b.b("isSubscribable", b.Pa);
|
|
var B = [];
|
|
b.r = {
|
|
lb: function (a) {
|
|
B.push({ha: a, Ka: []})
|
|
}, end: function () {
|
|
B.pop()
|
|
}, Va: function (a) {
|
|
b.Pa(a) || i(Error("Only subscribable things can act as dependencies"));
|
|
if (0 < B.length) {
|
|
var d = B[B.length - 1];
|
|
d && !(0 <= b.a.i(d.Ka, a)) && (d.Ka.push(a), d.ha(a))
|
|
}
|
|
}, K: function (a, b, c) {
|
|
try {
|
|
return B.push(n), a.apply(b, c || [])
|
|
} finally {
|
|
B.pop()
|
|
}
|
|
}
|
|
};
|
|
var la = {
|
|
undefined: l,
|
|
"boolean": l, number: l, string: l
|
|
};
|
|
b.m = function (a) {
|
|
function d() {
|
|
if (0 < arguments.length) {
|
|
if (!d.equalityComparer || !d.equalityComparer(c, arguments[0])) d.H(), c = arguments[0], d.G();
|
|
return this
|
|
}
|
|
b.r.Va(d);
|
|
return c
|
|
}
|
|
|
|
var c = a;
|
|
b.S.call(d);
|
|
d.t = function () {
|
|
return c
|
|
};
|
|
d.G = function () {
|
|
d.notifySubscribers(c)
|
|
};
|
|
d.H = function () {
|
|
d.notifySubscribers(c, "beforeChange")
|
|
};
|
|
b.a.extend(d, b.m.fn);
|
|
b.p(d, "peek", d.t);
|
|
b.p(d, "valueHasMutated", d.G);
|
|
b.p(d, "valueWillMutate", d.H);
|
|
return d
|
|
};
|
|
b.m.fn = {
|
|
equalityComparer: function (a, b) {
|
|
return a === n || typeof a in
|
|
la ? a === b : q
|
|
}
|
|
};
|
|
var D = b.m.Jb = "__ko_proto__";
|
|
b.m.fn[D] = b.m;
|
|
b.la = function (a, d) {
|
|
return a === n || a === H || a[D] === H ? q : a[D] === d ? l : b.la(a[D], d)
|
|
};
|
|
b.$ = function (a) {
|
|
return b.la(a, b.m)
|
|
};
|
|
b.Qa = function (a) {
|
|
return "function" == typeof a && a[D] === b.m || "function" == typeof a && a[D] === b.j && a.yb ? l : q
|
|
};
|
|
b.b("observable", b.m);
|
|
b.b("isObservable", b.$);
|
|
b.b("isWriteableObservable", b.Qa);
|
|
b.R = function (a) {
|
|
0 == arguments.length && (a = []);
|
|
a !== n && (a !== H && !("length" in a)) && i(Error("The argument passed when initializing an observable array must be an array, or null, or undefined."));
|
|
var d = b.m(a);
|
|
b.a.extend(d, b.R.fn);
|
|
return d
|
|
};
|
|
b.R.fn = {
|
|
remove: function (a) {
|
|
for (var b = this.t(), c = [], e = "function" == typeof a ? a : function (b) {
|
|
return b === a
|
|
}, f = 0; f < b.length; f++) {
|
|
var g = b[f];
|
|
e(g) && (0 === c.length && this.H(), c.push(g), b.splice(f, 1), f--)
|
|
}
|
|
c.length && this.G();
|
|
return c
|
|
}, removeAll: function (a) {
|
|
if (a === H) {
|
|
var d = this.t(), c = d.slice(0);
|
|
this.H();
|
|
d.splice(0, d.length);
|
|
this.G();
|
|
return c
|
|
}
|
|
return !a ? [] : this.remove(function (d) {
|
|
return 0 <= b.a.i(a, d)
|
|
})
|
|
}, destroy: function (a) {
|
|
var b = this.t(), c = "function" == typeof a ? a : function (b) {
|
|
return b ===
|
|
a
|
|
};
|
|
this.H();
|
|
for (var e = b.length - 1; 0 <= e; e--) c(b[e]) && (b[e]._destroy = l);
|
|
this.G()
|
|
}, destroyAll: function (a) {
|
|
return a === H ? this.destroy(t(l)) : !a ? [] : this.destroy(function (d) {
|
|
return 0 <= b.a.i(a, d)
|
|
})
|
|
}, indexOf: function (a) {
|
|
var d = this();
|
|
return b.a.i(d, a)
|
|
}, replace: function (a, b) {
|
|
var c = this.indexOf(a);
|
|
0 <= c && (this.H(), this.t()[c] = b, this.G())
|
|
}
|
|
};
|
|
b.a.o("pop push reverse shift sort splice unshift".split(" "), function (a) {
|
|
b.R.fn[a] = function () {
|
|
var b = this.t();
|
|
this.H();
|
|
b = b[a].apply(b, arguments);
|
|
this.G();
|
|
return b
|
|
}
|
|
});
|
|
b.a.o(["slice"],
|
|
function (a) {
|
|
b.R.fn[a] = function () {
|
|
var b = this();
|
|
return b[a].apply(b, arguments)
|
|
}
|
|
});
|
|
b.b("observableArray", b.R);
|
|
b.j = function (a, d, c) {
|
|
function e() {
|
|
b.a.o(y, function (a) {
|
|
a.B()
|
|
});
|
|
y = []
|
|
}
|
|
|
|
function f() {
|
|
var a = h.throttleEvaluation;
|
|
a && 0 <= a ? (clearTimeout(s), s = setTimeout(g, a)) : g()
|
|
}
|
|
|
|
function g() {
|
|
if (!p) if (m && v()) z(); else {
|
|
p = l;
|
|
try {
|
|
var a = b.a.V(y, function (a) {
|
|
return a.target
|
|
});
|
|
b.r.lb(function (c) {
|
|
var d;
|
|
0 <= (d = b.a.i(a, c)) ? a[d] = H : y.push(c.xa(f))
|
|
});
|
|
for (var c = r.call(d), e = a.length - 1; 0 <= e; e--) a[e] && y.splice(e, 1)[0].B();
|
|
m = l;
|
|
h.notifySubscribers(k,
|
|
"beforeChange");
|
|
k = c
|
|
} finally {
|
|
b.r.end()
|
|
}
|
|
h.notifySubscribers(k);
|
|
p = q;
|
|
y.length || z()
|
|
}
|
|
}
|
|
|
|
function h() {
|
|
if (0 < arguments.length) return "function" === typeof u ? u.apply(d, arguments) : i(Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.")), this;
|
|
m || g();
|
|
b.r.Va(h);
|
|
return k
|
|
}
|
|
|
|
function j() {
|
|
return !m || 0 < y.length
|
|
}
|
|
|
|
var k, m = q, p = q, r = a;
|
|
r && "object" == typeof r ? (c = r, r = c.read) : (c = c || {}, r || (r = c.read));
|
|
"function" != typeof r && i(Error("Pass a function that returns the value of the ko.computed"));
|
|
var u = c.write, F = c.disposeWhenNodeIsRemoved || c.W || n, v = c.disposeWhen || c.Ja || t(q), z = e,
|
|
y = [], s = n;
|
|
d || (d = c.owner);
|
|
h.t = function () {
|
|
m || g();
|
|
return k
|
|
};
|
|
h.wb = function () {
|
|
return y.length
|
|
};
|
|
h.yb = "function" === typeof c.write;
|
|
h.B = function () {
|
|
z()
|
|
};
|
|
h.oa = j;
|
|
b.S.call(h);
|
|
b.a.extend(h, b.j.fn);
|
|
b.p(h, "peek", h.t);
|
|
b.p(h, "dispose", h.B);
|
|
b.p(h, "isActive", h.oa);
|
|
b.p(h, "getDependenciesCount", h.wb);
|
|
c.deferEvaluation !== l && g();
|
|
if (F && j()) {
|
|
z = function () {
|
|
b.a.F.Wa(F, arguments.callee);
|
|
e()
|
|
};
|
|
b.a.F.Ba(F, z);
|
|
var C = v, v = function () {
|
|
return !b.a.X(F) || C()
|
|
}
|
|
}
|
|
return h
|
|
};
|
|
b.Ab = function (a) {
|
|
return b.la(a, b.j)
|
|
};
|
|
v = b.m.Jb;
|
|
b.j[v] = b.m;
|
|
b.j.fn = {};
|
|
b.j.fn[v] = b.j;
|
|
b.b("dependentObservable", b.j);
|
|
b.b("computed", b.j);
|
|
b.b("isComputed", b.Ab);
|
|
b.fb = function (a) {
|
|
0 == arguments.length && i(Error("When calling ko.toJS, pass the object you want to convert."));
|
|
return aa(a, function (a) {
|
|
for (var c = 0; b.$(a) && 10 > c; c++) a = a();
|
|
return a
|
|
})
|
|
};
|
|
b.toJSON = function (a, d, c) {
|
|
a = b.fb(a);
|
|
return b.a.wa(a, d, c)
|
|
};
|
|
b.b("toJS", b.fb);
|
|
b.b("toJSON", b.toJSON);
|
|
b.k = {
|
|
q: function (a) {
|
|
switch (b.a.u(a)) {
|
|
case "option":
|
|
return a.__ko__hasDomDataOptionValue__ ===
|
|
l ? b.a.f.get(a, b.c.options.ra) : 7 >= b.a.Z ? a.getAttributeNode("value").specified ? a.value : a.text : a.value;
|
|
case "select":
|
|
return 0 <= a.selectedIndex ? b.k.q(a.options[a.selectedIndex]) : H;
|
|
default:
|
|
return a.value
|
|
}
|
|
}, T: function (a, d) {
|
|
switch (b.a.u(a)) {
|
|
case "option":
|
|
switch (typeof d) {
|
|
case "string":
|
|
b.a.f.set(a, b.c.options.ra, H);
|
|
"__ko__hasDomDataOptionValue__" in a && delete a.__ko__hasDomDataOptionValue__;
|
|
a.value = d;
|
|
break;
|
|
default:
|
|
b.a.f.set(a, b.c.options.ra, d), a.__ko__hasDomDataOptionValue__ = l, a.value = "number" === typeof d ?
|
|
d : ""
|
|
}
|
|
break;
|
|
case "select":
|
|
for (var c = a.options.length - 1; 0 <= c; c--) if (b.k.q(a.options[c]) == d) {
|
|
a.selectedIndex = c;
|
|
break
|
|
}
|
|
break;
|
|
default:
|
|
if (d === n || d === H) d = "";
|
|
a.value = d
|
|
}
|
|
}
|
|
};
|
|
b.b("selectExtensions", b.k);
|
|
b.b("selectExtensions.readValue", b.k.q);
|
|
b.b("selectExtensions.writeValue", b.k.T);
|
|
var ja = /\@ko_token_(\d+)\@/g, ma = ["true", "false"],
|
|
na = /^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;
|
|
b.g = {
|
|
Q: [], aa: function (a) {
|
|
var d = b.a.D(a);
|
|
if (3 > d.length) return [];
|
|
"{" === d.charAt(0) && (d = d.substring(1, d.length - 1));
|
|
for (var a = [],
|
|
c = n, e, f = 0; f < d.length; f++) {
|
|
var g = d.charAt(f);
|
|
if (c === n) switch (g) {
|
|
case '"':
|
|
case "'":
|
|
case "/":
|
|
c = f, e = g
|
|
} else if (g == e && "\\" !== d.charAt(f - 1)) {
|
|
g = d.substring(c, f + 1);
|
|
a.push(g);
|
|
var h = "@ko_token_" + (a.length - 1) + "@", d = d.substring(0, c) + h + d.substring(f + 1),
|
|
f = f - (g.length - h.length), c = n
|
|
}
|
|
}
|
|
e = c = n;
|
|
for (var j = 0, k = n, f = 0; f < d.length; f++) {
|
|
g = d.charAt(f);
|
|
if (c === n) switch (g) {
|
|
case "{":
|
|
c = f;
|
|
k = g;
|
|
e = "}";
|
|
break;
|
|
case "(":
|
|
c = f;
|
|
k = g;
|
|
e = ")";
|
|
break;
|
|
case "[":
|
|
c = f, k = g, e = "]"
|
|
}
|
|
g === k ? j++ : g === e && (j--, 0 === j && (g = d.substring(c, f + 1), a.push(g), h = "@ko_token_" + (a.length -
|
|
1) + "@", d = d.substring(0, c) + h + d.substring(f + 1), f -= g.length - h.length, c = n))
|
|
}
|
|
e = [];
|
|
d = d.split(",");
|
|
c = 0;
|
|
for (f = d.length; c < f; c++) j = d[c], k = j.indexOf(":"), 0 < k && k < j.length - 1 ? (g = j.substring(k + 1), e.push({
|
|
key: O(j.substring(0, k), a),
|
|
value: O(g, a)
|
|
})) : e.push({unknown: O(j, a)});
|
|
return e
|
|
}, ba: function (a) {
|
|
for (var d = "string" === typeof a ? b.g.aa(a) : a, c = [], a = [], e, f = 0; e = d[f]; f++) if (0 < c.length && c.push(","), e.key) {
|
|
var g;
|
|
a:{
|
|
g = e.key;
|
|
var h = b.a.D(g);
|
|
switch (h.length && h.charAt(0)) {
|
|
case "'":
|
|
case '"':
|
|
break a;
|
|
default:
|
|
g = "'" + h + "'"
|
|
}
|
|
}
|
|
e = e.value;
|
|
c.push(g);
|
|
c.push(":");
|
|
c.push(e);
|
|
e = b.a.D(e);
|
|
0 <= b.a.i(ma, b.a.D(e).toLowerCase()) ? e = q : (h = e.match(na), e = h === n ? q : h[1] ? "Object(" + h[1] + ")" + h[2] : e);
|
|
e && (0 < a.length && a.push(", "), a.push(g + " : function(__ko_value) { " + e + " = __ko_value; }"))
|
|
} else e.unknown && c.push(e.unknown);
|
|
d = c.join("");
|
|
0 < a.length && (d = d + ", '_ko_property_writers' : { " + a.join("") + " } ");
|
|
return d
|
|
}, Db: function (a, d) {
|
|
for (var c = 0; c < a.length; c++) if (b.a.D(a[c].key) == d) return l;
|
|
return q
|
|
}, ea: function (a, d, c, e, f) {
|
|
if (!a || !b.Qa(a)) {
|
|
if ((a = d()._ko_property_writers) &&
|
|
a[c]) a[c](e)
|
|
} else (!f || a.t() !== e) && a(e)
|
|
}
|
|
};
|
|
b.b("expressionRewriting", b.g);
|
|
b.b("expressionRewriting.bindingRewriteValidators", b.g.Q);
|
|
b.b("expressionRewriting.parseObjectLiteral", b.g.aa);
|
|
b.b("expressionRewriting.preProcessBindings", b.g.ba);
|
|
b.b("jsonExpressionRewriting", b.g);
|
|
b.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson", b.g.ba);
|
|
var J = "<\!--test--\>" === x.createComment("test").text,
|
|
ia = J ? /^<\!--\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*--\>$/ : /^\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*$/,
|
|
ha = J ? /^<\!--\s*\/ko\s*--\>$/ :
|
|
/^\s*\/ko\s*$/, oa = {ul: l, ol: l};
|
|
b.e = {
|
|
I: {}, childNodes: function (a) {
|
|
return A(a) ? $(a) : a.childNodes
|
|
}, Y: function (a) {
|
|
if (A(a)) for (var a = b.e.childNodes(a), d = 0, c = a.length; d < c; d++) b.removeNode(a[d]); else b.a.ka(a)
|
|
}, N: function (a, d) {
|
|
if (A(a)) {
|
|
b.e.Y(a);
|
|
for (var c = a.nextSibling, e = 0, f = d.length; e < f; e++) c.parentNode.insertBefore(d[e], c)
|
|
} else b.a.N(a, d)
|
|
}, Ua: function (a, b) {
|
|
A(a) ? a.parentNode.insertBefore(b, a.nextSibling) : a.firstChild ? a.insertBefore(b, a.firstChild) : a.appendChild(b)
|
|
}, Oa: function (a, d, c) {
|
|
c ? A(a) ? a.parentNode.insertBefore(d,
|
|
c.nextSibling) : c.nextSibling ? a.insertBefore(d, c.nextSibling) : a.appendChild(d) : b.e.Ua(a, d)
|
|
}, firstChild: function (a) {
|
|
return !A(a) ? a.firstChild : !a.nextSibling || G(a.nextSibling) ? n : a.nextSibling
|
|
}, nextSibling: function (a) {
|
|
A(a) && (a = Z(a));
|
|
return a.nextSibling && G(a.nextSibling) ? n : a.nextSibling
|
|
}, ib: function (a) {
|
|
return (a = A(a)) ? a[1] : n
|
|
}, Sa: function (a) {
|
|
if (oa[b.a.u(a)]) {
|
|
var d = a.firstChild;
|
|
if (d) {
|
|
do if (1 === d.nodeType) {
|
|
var c;
|
|
c = d.firstChild;
|
|
var e = n;
|
|
if (c) {
|
|
do if (e) e.push(c); else if (A(c)) {
|
|
var f = Z(c, l);
|
|
f ? c = f : e = [c]
|
|
} else G(c) &&
|
|
(e = [c]); while (c = c.nextSibling)
|
|
}
|
|
if (c = e) {
|
|
e = d.nextSibling;
|
|
for (f = 0; f < c.length; f++) e ? a.insertBefore(c[f], e) : a.appendChild(c[f])
|
|
}
|
|
} while (d = d.nextSibling)
|
|
}
|
|
}
|
|
}
|
|
};
|
|
b.b("virtualElements", b.e);
|
|
b.b("virtualElements.allowedBindings", b.e.I);
|
|
b.b("virtualElements.emptyNode", b.e.Y);
|
|
b.b("virtualElements.insertAfter", b.e.Oa);
|
|
b.b("virtualElements.prepend", b.e.Ua);
|
|
b.b("virtualElements.setDomNodeChildren", b.e.N);
|
|
b.J = function () {
|
|
this.Ga = {}
|
|
};
|
|
b.a.extend(b.J.prototype, {
|
|
nodeHasBindings: function (a) {
|
|
switch (a.nodeType) {
|
|
case 1:
|
|
return a.getAttribute("data-bind") !=
|
|
n;
|
|
case 8:
|
|
return b.e.ib(a) != n;
|
|
default:
|
|
return q
|
|
}
|
|
}, getBindings: function (a, b) {
|
|
var c = this.getBindingsString(a, b);
|
|
return c ? this.parseBindingsString(c, b, a) : n
|
|
}, getBindingsString: function (a) {
|
|
switch (a.nodeType) {
|
|
case 1:
|
|
return a.getAttribute("data-bind");
|
|
case 8:
|
|
return b.e.ib(a);
|
|
default:
|
|
return n
|
|
}
|
|
}, parseBindingsString: function (a, d, c) {
|
|
try {
|
|
var e;
|
|
if (!(e = this.Ga[a])) {
|
|
var f = this.Ga, g = "with($context){with($data||{}){return{" + b.g.ba(a) + "}}}";
|
|
e = f[a] = new Function("$context", "$element", g)
|
|
}
|
|
return e(d, c)
|
|
} catch (h) {
|
|
i(Error("Unable to parse bindings.\nMessage: " +
|
|
h + ";\nBindings value: " + a))
|
|
}
|
|
}
|
|
});
|
|
b.J.instance = new b.J;
|
|
b.b("bindingProvider", b.J);
|
|
b.c = {};
|
|
b.z = function (a, d, c) {
|
|
d ? (b.a.extend(this, d), this.$parentContext = d, this.$parent = d.$data, this.$parents = (d.$parents || []).slice(0), this.$parents.unshift(this.$parent)) : (this.$parents = [], this.$root = a, this.ko = b);
|
|
this.$data = a;
|
|
c && (this[c] = a)
|
|
};
|
|
b.z.prototype.createChildContext = function (a, d) {
|
|
return new b.z(a, this, d)
|
|
};
|
|
b.z.prototype.extend = function (a) {
|
|
var d = b.a.extend(new b.z, this);
|
|
return b.a.extend(d, a)
|
|
};
|
|
b.cb = function (a, d) {
|
|
if (2 ==
|
|
arguments.length) b.a.f.set(a, "__ko_bindingContext__", d); else return b.a.f.get(a, "__ko_bindingContext__")
|
|
};
|
|
b.Ea = function (a, d, c) {
|
|
1 === a.nodeType && b.e.Sa(a);
|
|
return W(a, d, c, l)
|
|
};
|
|
b.Da = function (a, b) {
|
|
(1 === b.nodeType || 8 === b.nodeType) && Y(a, b, l)
|
|
};
|
|
b.Ca = function (a, b) {
|
|
b && (1 !== b.nodeType && 8 !== b.nodeType) && i(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"));
|
|
b = b || w.document.body;
|
|
X(a, b, l)
|
|
};
|
|
b.ja = function (a) {
|
|
switch (a.nodeType) {
|
|
case 1:
|
|
case 8:
|
|
var d = b.cb(a);
|
|
if (d) return d;
|
|
if (a.parentNode) return b.ja(a.parentNode)
|
|
}
|
|
return H
|
|
};
|
|
b.ob = function (a) {
|
|
return (a = b.ja(a)) ? a.$data : H
|
|
};
|
|
b.b("bindingHandlers", b.c);
|
|
b.b("applyBindings", b.Ca);
|
|
b.b("applyBindingsToDescendants", b.Da);
|
|
b.b("applyBindingsToNode", b.Ea);
|
|
b.b("contextFor", b.ja);
|
|
b.b("dataFor", b.ob);
|
|
var ea = {"class": "className", "for": "htmlFor"};
|
|
b.c.attr = {
|
|
update: function (a, d) {
|
|
var c = b.a.d(d()) || {}, e;
|
|
for (e in c) if ("string" == typeof e) {
|
|
var f = b.a.d(c[e]), g = f === q || f === n || f === H;
|
|
g && a.removeAttribute(e);
|
|
8 >= b.a.Z && e in ea ? (e = ea[e], g ? a.removeAttribute(e) :
|
|
a[e] = f) : g || a.setAttribute(e, f.toString());
|
|
"name" === e && b.a.$a(a, g ? "" : f.toString())
|
|
}
|
|
}
|
|
};
|
|
b.c.checked = {
|
|
init: function (a, d, c) {
|
|
b.a.n(a, "click", function () {
|
|
var e;
|
|
if ("checkbox" == a.type) e = a.checked; else if ("radio" == a.type && a.checked) e = a.value; else return;
|
|
var f = d(), g = b.a.d(f);
|
|
"checkbox" == a.type && g instanceof Array ? (e = b.a.i(g, a.value), a.checked && 0 > e ? f.push(a.value) : !a.checked && 0 <= e && f.splice(e, 1)) : b.g.ea(f, c, "checked", e, l)
|
|
});
|
|
"radio" == a.type && !a.name && b.c.uniqueName.init(a, t(l))
|
|
}, update: function (a, d) {
|
|
var c = b.a.d(d());
|
|
"checkbox" == a.type ? a.checked = c instanceof Array ? 0 <= b.a.i(c, a.value) : c : "radio" == a.type && (a.checked = a.value == c)
|
|
}
|
|
};
|
|
b.c.css = {
|
|
update: function (a, d) {
|
|
var c = b.a.d(d());
|
|
if ("object" == typeof c) for (var e in c) {
|
|
var f = b.a.d(c[e]);
|
|
b.a.da(a, e, f)
|
|
} else c = String(c || ""), b.a.da(a, a.__ko__cssValue, q), a.__ko__cssValue = c, b.a.da(a, c, l)
|
|
}
|
|
};
|
|
b.c.enable = {
|
|
update: function (a, d) {
|
|
var c = b.a.d(d());
|
|
c && a.disabled ? a.removeAttribute("disabled") : !c && !a.disabled && (a.disabled = l)
|
|
}
|
|
};
|
|
b.c.disable = {
|
|
update: function (a, d) {
|
|
b.c.enable.update(a, function () {
|
|
return !b.a.d(d())
|
|
})
|
|
}
|
|
};
|
|
b.c.event = {
|
|
init: function (a, d, c, e) {
|
|
var f = d() || {}, g;
|
|
for (g in f) (function () {
|
|
var f = g;
|
|
"string" == typeof f && b.a.n(a, f, function (a) {
|
|
var g, m = d()[f];
|
|
if (m) {
|
|
var p = c();
|
|
try {
|
|
var r = b.a.L(arguments);
|
|
r.unshift(e);
|
|
g = m.apply(e, r)
|
|
} finally {
|
|
g !== l && (a.preventDefault ? a.preventDefault() : a.returnValue = q)
|
|
}
|
|
p[f + "Bubble"] === q && (a.cancelBubble = l, a.stopPropagation && a.stopPropagation())
|
|
}
|
|
})
|
|
})()
|
|
}
|
|
};
|
|
b.c.foreach = {
|
|
Ra: function (a) {
|
|
return function () {
|
|
var d = a(), c = b.a.ta(d);
|
|
if (!c || "number" == typeof c.length) return {foreach: d, templateEngine: b.C.na};
|
|
b.a.d(d);
|
|
return {
|
|
foreach: c.data,
|
|
as: c.as,
|
|
includeDestroyed: c.includeDestroyed,
|
|
afterAdd: c.afterAdd,
|
|
beforeRemove: c.beforeRemove,
|
|
afterRender: c.afterRender,
|
|
beforeMove: c.beforeMove,
|
|
afterMove: c.afterMove,
|
|
templateEngine: b.C.na
|
|
}
|
|
}
|
|
}, init: function (a, d) {
|
|
return b.c.template.init(a, b.c.foreach.Ra(d))
|
|
}, update: function (a, d, c, e, f) {
|
|
return b.c.template.update(a, b.c.foreach.Ra(d), c, e, f)
|
|
}
|
|
};
|
|
b.g.Q.foreach = q;
|
|
b.e.I.foreach = l;
|
|
b.c.hasfocus = {
|
|
init: function (a, d, c) {
|
|
function e(e) {
|
|
a.__ko_hasfocusUpdating = l;
|
|
var f = a.ownerDocument;
|
|
"activeElement" in
|
|
f && (e = f.activeElement === a);
|
|
f = d();
|
|
b.g.ea(f, c, "hasfocus", e, l);
|
|
a.__ko_hasfocusUpdating = q
|
|
}
|
|
|
|
var f = e.bind(n, l), g = e.bind(n, q);
|
|
b.a.n(a, "focus", f);
|
|
b.a.n(a, "focusin", f);
|
|
b.a.n(a, "blur", g);
|
|
b.a.n(a, "focusout", g)
|
|
}, update: function (a, d) {
|
|
var c = b.a.d(d());
|
|
a.__ko_hasfocusUpdating || (c ? a.focus() : a.blur(), b.r.K(b.a.Aa, n, [a, c ? "focusin" : "focusout"]))
|
|
}
|
|
};
|
|
b.c.html = {
|
|
init: function () {
|
|
return {controlsDescendantBindings: l}
|
|
}, update: function (a, d) {
|
|
b.a.ca(a, d())
|
|
}
|
|
};
|
|
var ca = "__ko_withIfBindingData";
|
|
P("if");
|
|
P("ifnot", q, l);
|
|
P("with", l, q, function (a,
|
|
b) {
|
|
return a.createChildContext(b)
|
|
});
|
|
b.c.options = {
|
|
update: function (a, d, c) {
|
|
"select" !== b.a.u(a) && i(Error("options binding applies only to SELECT elements"));
|
|
for (var e = 0 == a.length, f = b.a.V(b.a.fa(a.childNodes, function (a) {
|
|
return a.tagName && "option" === b.a.u(a) && a.selected
|
|
}), function (a) {
|
|
return b.k.q(a) || a.innerText || a.textContent
|
|
}), g = a.scrollTop, h = b.a.d(d()); 0 < a.length;) b.A(a.options[0]), a.remove(0);
|
|
if (h) {
|
|
var c = c(), j = c.optionsIncludeDestroyed;
|
|
"number" != typeof h.length && (h = [h]);
|
|
if (c.optionsCaption) {
|
|
var k = x.createElement("option");
|
|
b.a.ca(k, c.optionsCaption);
|
|
b.k.T(k, H);
|
|
a.appendChild(k)
|
|
}
|
|
for (var d = 0, m = h.length; d < m; d++) {
|
|
var p = h[d];
|
|
if (!p || !p._destroy || j) {
|
|
var k = x.createElement("option"), r = function (a, b, c) {
|
|
var d = typeof b;
|
|
return "function" == d ? b(a) : "string" == d ? a[b] : c
|
|
}, u = r(p, c.optionsValue, p);
|
|
b.k.T(k, b.a.d(u));
|
|
p = r(p, c.optionsText, u);
|
|
b.a.bb(k, p);
|
|
a.appendChild(k)
|
|
}
|
|
}
|
|
h = a.getElementsByTagName("option");
|
|
d = j = 0;
|
|
for (m = h.length; d < m; d++) 0 <= b.a.i(f, b.k.q(h[d])) && (b.a.ab(h[d], l), j++);
|
|
a.scrollTop = g;
|
|
e && "value" in c && da(a, b.a.ta(c.value), l);
|
|
b.a.tb(a)
|
|
}
|
|
}
|
|
};
|
|
b.c.options.ra = "__ko.optionValueDomData__";
|
|
b.c.selectedOptions = {
|
|
init: function (a, d, c) {
|
|
b.a.n(a, "change", function () {
|
|
var e = d(), f = [];
|
|
b.a.o(a.getElementsByTagName("option"), function (a) {
|
|
a.selected && f.push(b.k.q(a))
|
|
});
|
|
b.g.ea(e, c, "value", f)
|
|
})
|
|
}, update: function (a, d) {
|
|
"select" != b.a.u(a) && i(Error("values binding applies only to SELECT elements"));
|
|
var c = b.a.d(d());
|
|
c && "number" == typeof c.length && b.a.o(a.getElementsByTagName("option"), function (a) {
|
|
var d = 0 <= b.a.i(c, b.k.q(a));
|
|
b.a.ab(a, d)
|
|
})
|
|
}
|
|
};
|
|
b.c.style = {
|
|
update: function (a,
|
|
d) {
|
|
var c = b.a.d(d() || {}), e;
|
|
for (e in c) if ("string" == typeof e) {
|
|
var f = b.a.d(c[e]);
|
|
a.style[e] = f || ""
|
|
}
|
|
}
|
|
};
|
|
b.c.submit = {
|
|
init: function (a, d, c, e) {
|
|
"function" != typeof d() && i(Error("The value for a submit binding must be a function"));
|
|
b.a.n(a, "submit", function (b) {
|
|
var c, h = d();
|
|
try {
|
|
c = h.call(e, a)
|
|
} finally {
|
|
c !== l && (b.preventDefault ? b.preventDefault() : b.returnValue = q)
|
|
}
|
|
})
|
|
}
|
|
};
|
|
b.c.text = {
|
|
update: function (a, d) {
|
|
b.a.bb(a, d())
|
|
}
|
|
};
|
|
b.e.I.text = l;
|
|
b.c.uniqueName = {
|
|
init: function (a, d) {
|
|
if (d()) {
|
|
var c = "ko_unique_" + ++b.c.uniqueName.nb;
|
|
b.a.$a(a,
|
|
c)
|
|
}
|
|
}
|
|
};
|
|
b.c.uniqueName.nb = 0;
|
|
b.c.value = {
|
|
init: function (a, d, c) {
|
|
function e() {
|
|
h = q;
|
|
var e = d(), f = b.k.q(a);
|
|
b.g.ea(e, c, "value", f)
|
|
}
|
|
|
|
var f = ["change"], g = c().valueUpdate, h = q;
|
|
g && ("string" == typeof g && (g = [g]), b.a.P(f, g), f = b.a.Fa(f));
|
|
if (b.a.Z && ("input" == a.tagName.toLowerCase() && "text" == a.type && "off" != a.autocomplete && (!a.form || "off" != a.form.autocomplete)) && -1 == b.a.i(f, "propertychange")) b.a.n(a, "propertychange", function () {
|
|
h = l
|
|
}), b.a.n(a, "blur", function () {
|
|
h && e()
|
|
});
|
|
b.a.o(f, function (c) {
|
|
var d = e;
|
|
b.a.Nb(c, "after") && (d = function () {
|
|
setTimeout(e,
|
|
0)
|
|
}, c = c.substring(5));
|
|
b.a.n(a, c, d)
|
|
})
|
|
}, update: function (a, d) {
|
|
var c = "select" === b.a.u(a), e = b.a.d(d()), f = b.k.q(a), g = e != f;
|
|
0 === e && (0 !== f && "0" !== f) && (g = l);
|
|
g && (f = function () {
|
|
b.k.T(a, e)
|
|
}, f(), c && setTimeout(f, 0));
|
|
c && 0 < a.length && da(a, e, q)
|
|
}
|
|
};
|
|
b.c.visible = {
|
|
update: function (a, d) {
|
|
var c = b.a.d(d()), e = "none" != a.style.display;
|
|
c && !e ? a.style.display = "" : !c && e && (a.style.display = "none")
|
|
}
|
|
};
|
|
b.c.click = {
|
|
init: function (a, d, c, e) {
|
|
return b.c.event.init.call(this, a, function () {
|
|
var a = {};
|
|
a.click = d();
|
|
return a
|
|
}, c, e)
|
|
}
|
|
};
|
|
b.v = function () {
|
|
};
|
|
b.v.prototype.renderTemplateSource =
|
|
function () {
|
|
i(Error("Override renderTemplateSource"))
|
|
};
|
|
b.v.prototype.createJavaScriptEvaluatorBlock = function () {
|
|
i(Error("Override createJavaScriptEvaluatorBlock"))
|
|
};
|
|
b.v.prototype.makeTemplateSource = function (a, d) {
|
|
if ("string" == typeof a) {
|
|
var d = d || x, c = d.getElementById(a);
|
|
c || i(Error("Cannot find template with ID " + a));
|
|
return new b.l.h(c)
|
|
}
|
|
if (1 == a.nodeType || 8 == a.nodeType) return new b.l.O(a);
|
|
i(Error("Unknown template type: " + a))
|
|
};
|
|
b.v.prototype.renderTemplate = function (a, b, c, e) {
|
|
a = this.makeTemplateSource(a, e);
|
|
return this.renderTemplateSource(a, b, c)
|
|
};
|
|
b.v.prototype.isTemplateRewritten = function (a, b) {
|
|
return this.allowTemplateRewriting === q ? l : this.makeTemplateSource(a, b).data("isRewritten")
|
|
};
|
|
b.v.prototype.rewriteTemplate = function (a, b, c) {
|
|
a = this.makeTemplateSource(a, c);
|
|
b = b(a.text());
|
|
a.text(b);
|
|
a.data("isRewritten", l)
|
|
};
|
|
b.b("templateEngine", b.v);
|
|
var pa = /(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi,
|
|
qa = /<\!--\s*ko\b\s*([\s\S]*?)\s*--\>/g;
|
|
b.ya = {
|
|
ub: function (a,
|
|
d, c) {
|
|
d.isTemplateRewritten(a, c) || d.rewriteTemplate(a, function (a) {
|
|
return b.ya.Fb(a, d)
|
|
}, c)
|
|
}, Fb: function (a, b) {
|
|
return a.replace(pa, function (a, e, f, g, h, j, k) {
|
|
return V(k, e, b)
|
|
}).replace(qa, function (a, e) {
|
|
return V(e, "<\!-- ko --\>", b)
|
|
})
|
|
}, jb: function (a) {
|
|
return b.s.qa(function (d, c) {
|
|
d.nextSibling && b.Ea(d.nextSibling, a, c)
|
|
})
|
|
}
|
|
};
|
|
b.b("__tr_ambtns", b.ya.jb);
|
|
b.l = {};
|
|
b.l.h = function (a) {
|
|
this.h = a
|
|
};
|
|
b.l.h.prototype.text = function () {
|
|
var a = b.a.u(this.h), a = "script" === a ? "text" : "textarea" === a ? "value" : "innerHTML";
|
|
if (0 == arguments.length) return this.h[a];
|
|
var d = arguments[0];
|
|
"innerHTML" === a ? b.a.ca(this.h, d) : this.h[a] = d
|
|
};
|
|
b.l.h.prototype.data = function (a) {
|
|
if (1 === arguments.length) return b.a.f.get(this.h, "templateSourceData_" + a);
|
|
b.a.f.set(this.h, "templateSourceData_" + a, arguments[1])
|
|
};
|
|
b.l.O = function (a) {
|
|
this.h = a
|
|
};
|
|
b.l.O.prototype = new b.l.h;
|
|
b.l.O.prototype.text = function () {
|
|
if (0 == arguments.length) {
|
|
var a = b.a.f.get(this.h, "__ko_anon_template__") || {};
|
|
a.za === H && a.ia && (a.za = a.ia.innerHTML);
|
|
return a.za
|
|
}
|
|
b.a.f.set(this.h, "__ko_anon_template__", {za: arguments[0]})
|
|
};
|
|
b.l.h.prototype.nodes =
|
|
function () {
|
|
if (0 == arguments.length) return (b.a.f.get(this.h, "__ko_anon_template__") || {}).ia;
|
|
b.a.f.set(this.h, "__ko_anon_template__", {ia: arguments[0]})
|
|
};
|
|
b.b("templateSources", b.l);
|
|
b.b("templateSources.domElement", b.l.h);
|
|
b.b("templateSources.anonymousTemplate", b.l.O);
|
|
var N;
|
|
b.va = function (a) {
|
|
a != H && !(a instanceof b.v) && i(Error("templateEngine must inherit from ko.templateEngine"));
|
|
N = a
|
|
};
|
|
b.ua = function (a, d, c, e, f) {
|
|
c = c || {};
|
|
(c.templateEngine || N) == H && i(Error("Set a template engine before calling renderTemplate"));
|
|
f = f || "replaceChildren";
|
|
if (e) {
|
|
var g = M(e);
|
|
return b.j(function () {
|
|
var h = d && d instanceof b.z ? d : new b.z(b.a.d(d)),
|
|
j = "function" == typeof a ? a(h.$data, h) : a, h = S(e, f, j, h, c);
|
|
"replaceNode" == f && (e = h, g = M(e))
|
|
}, n, {
|
|
Ja: function () {
|
|
return !g || !b.a.X(g)
|
|
}, W: g && "replaceNode" == f ? g.parentNode : g
|
|
})
|
|
}
|
|
return b.s.qa(function (e) {
|
|
b.ua(a, d, c, e, "replaceNode")
|
|
})
|
|
};
|
|
b.Lb = function (a, d, c, e, f) {
|
|
function g(a, b) {
|
|
T(b, j);
|
|
c.afterRender && c.afterRender(b, a)
|
|
}
|
|
|
|
function h(d, e) {
|
|
j = f.createChildContext(b.a.d(d), c.as);
|
|
j.$index = e;
|
|
var g = "function" == typeof a ?
|
|
a(d, j) : a;
|
|
return S(n, "ignoreTargetNode", g, j, c)
|
|
}
|
|
|
|
var j;
|
|
return b.j(function () {
|
|
var a = b.a.d(d) || [];
|
|
"undefined" == typeof a.length && (a = [a]);
|
|
a = b.a.fa(a, function (a) {
|
|
return c.includeDestroyed || a === H || a === n || !b.a.d(a._destroy)
|
|
});
|
|
b.r.K(b.a.Za, n, [e, a, h, c, g])
|
|
}, n, {W: e})
|
|
};
|
|
b.c.template = {
|
|
init: function (a, d) {
|
|
var c = b.a.d(d());
|
|
if ("string" != typeof c && !c.name && (1 == a.nodeType || 8 == a.nodeType)) c = 1 == a.nodeType ? a.childNodes : b.e.childNodes(a), c = b.a.Gb(c), (new b.l.O(a)).nodes(c);
|
|
return {controlsDescendantBindings: l}
|
|
}, update: function (a,
|
|
d, c, e, f) {
|
|
var d = b.a.d(d()), c = {}, e = l, g, h = n;
|
|
"string" != typeof d && (c = d, d = c.name, "if" in c && (e = b.a.d(c["if"])), e && "ifnot" in c && (e = !b.a.d(c.ifnot)), g = b.a.d(c.data));
|
|
"foreach" in c ? h = b.Lb(d || a, e && c.foreach || [], c, a, f) : e ? (f = "data" in c ? f.createChildContext(g, c.as) : f, h = b.ua(d || a, f, c, a)) : b.e.Y(a);
|
|
f = h;
|
|
(g = b.a.f.get(a, "__ko__templateComputedDomDataKey__")) && "function" == typeof g.B && g.B();
|
|
b.a.f.set(a, "__ko__templateComputedDomDataKey__", f && f.oa() ? f : H)
|
|
}
|
|
};
|
|
b.g.Q.template = function (a) {
|
|
a = b.g.aa(a);
|
|
return 1 == a.length && a[0].unknown ||
|
|
b.g.Db(a, "name") ? n : "This template engine does not support anonymous templates nested within its templates"
|
|
};
|
|
b.e.I.template = l;
|
|
b.b("setTemplateEngine", b.va);
|
|
b.b("renderTemplate", b.ua);
|
|
b.a.Ia = function (a, b, c) {
|
|
a = a || [];
|
|
b = b || [];
|
|
return a.length <= b.length ? R(a, b, "added", "deleted", c) : R(b, a, "deleted", "added", c)
|
|
};
|
|
b.b("utils.compareArrays", b.a.Ia);
|
|
b.a.Za = function (a, d, c, e, f) {
|
|
function g(a, b) {
|
|
s = k[b];
|
|
v !== b && (y[a] = s);
|
|
s.ma(v++);
|
|
L(s.M);
|
|
r.push(s);
|
|
z.push(s)
|
|
}
|
|
|
|
function h(a, c) {
|
|
if (a) for (var d = 0, e = c.length; d < e; d++) c[d] && b.a.o(c[d].M,
|
|
function (b) {
|
|
a(b, d, c[d].U)
|
|
})
|
|
}
|
|
|
|
for (var d = d || [], e = e || {}, j = b.a.f.get(a, "setDomNodeChildrenFromArrayMapping_lastMappingResult") === H, k = b.a.f.get(a, "setDomNodeChildrenFromArrayMapping_lastMappingResult") || [], m = b.a.V(k, function (a) {
|
|
return a.U
|
|
}), p = b.a.Ia(m, d), r = [], u = 0, v = 0, A = [], z = [], d = [], y = [], m = [], s, C = 0, B, D; B = p[C]; C++) switch (D = B.moved, B.status) {
|
|
case "deleted":
|
|
D === H && (s = k[u], s.j && s.j.B(), A.push.apply(A, L(s.M)), e.beforeRemove && (d[C] = s, z.push(s)));
|
|
u++;
|
|
break;
|
|
case "retained":
|
|
g(C, u++);
|
|
break;
|
|
case "added":
|
|
D !== H ? g(C,
|
|
D) : (s = {U: B.value, ma: b.m(v++)}, r.push(s), z.push(s), j || (m[C] = s))
|
|
}
|
|
h(e.beforeMove, y);
|
|
b.a.o(A, e.beforeRemove ? b.A : b.removeNode);
|
|
for (var C = 0, j = b.e.firstChild(a), G; s = z[C]; C++) {
|
|
s.M || b.a.extend(s, ga(a, c, s.U, f, s.ma));
|
|
for (u = 0; p = s.M[u]; j = p.nextSibling, G = p, u++) p !== j && b.e.Oa(a, p, G);
|
|
!s.zb && f && (f(s.U, s.M, s.ma), s.zb = l)
|
|
}
|
|
h(e.beforeRemove, d);
|
|
h(e.afterMove, y);
|
|
h(e.afterAdd, m);
|
|
b.a.f.set(a, "setDomNodeChildrenFromArrayMapping_lastMappingResult", r)
|
|
};
|
|
b.b("utils.setDomNodeChildrenFromArrayMapping", b.a.Za);
|
|
b.C = function () {
|
|
this.allowTemplateRewriting =
|
|
q
|
|
};
|
|
b.C.prototype = new b.v;
|
|
b.C.prototype.renderTemplateSource = function (a) {
|
|
var d = !(9 > b.a.Z) && a.nodes ? a.nodes() : n;
|
|
if (d) return b.a.L(d.cloneNode(l).childNodes);
|
|
a = a.text();
|
|
return b.a.sa(a)
|
|
};
|
|
b.C.na = new b.C;
|
|
b.va(b.C.na);
|
|
b.b("nativeTemplateEngine", b.C);
|
|
b.pa = function () {
|
|
var a = this.Cb = function () {
|
|
if ("undefined" == typeof E || !E.tmpl) return 0;
|
|
try {
|
|
if (0 <= E.tmpl.tag.tmpl.open.toString().indexOf("__")) return 2
|
|
} catch (a) {
|
|
}
|
|
return 1
|
|
}();
|
|
this.renderTemplateSource = function (b, c, e) {
|
|
e = e || {};
|
|
2 > a && i(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));
|
|
var f = b.data("precompiled");
|
|
f || (f = b.text() || "", f = E.template(n, "{{ko_with $item.koBindingContext}}" + f + "{{/ko_with}}"), b.data("precompiled", f));
|
|
b = [c.$data];
|
|
c = E.extend({koBindingContext: c}, e.templateOptions);
|
|
c = E.tmpl(f, b, c);
|
|
c.appendTo(x.createElement("div"));
|
|
E.fragments = {};
|
|
return c
|
|
};
|
|
this.createJavaScriptEvaluatorBlock = function (a) {
|
|
return "{{ko_code ((function() { return " + a + " })()) }}"
|
|
};
|
|
this.addTemplate = function (a, b) {
|
|
x.write("<script type='text/html' id='" + a + "'>" + b + "<\/script>")
|
|
};
|
|
0 < a && (E.tmpl.tag.ko_code =
|
|
{open: "__.push($1 || '');"}, E.tmpl.tag.ko_with = {open: "with($1) {", close: "} "})
|
|
};
|
|
b.pa.prototype = new b.v;
|
|
v = new b.pa;
|
|
0 < v.Cb && b.va(v);
|
|
b.b("jqueryTmplTemplateEngine", b.pa)
|
|
}
|
|
|
|
"function" === typeof require && "object" === typeof exports && "object" === typeof module ? K(module.exports || exports) : "function" === typeof define && define.amd ? define(["exports"], K) : K(w.ko = {});
|
|
l;
|
|
})();
|
|
// Knockout Mapping plugin v1.0
|
|
// (c) 2011 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/
|
|
// License: Ms-Pl (http://www.opensource.org/licenses/ms-pl.html)
|
|
|
|
ko.exportSymbol = function (i, p) {
|
|
for (var j = i.split("."), r = window, k = 0; k < j.length - 1; k++) r = r[j[k]];
|
|
r[j[j.length - 1]] = p
|
|
};
|
|
ko.exportProperty = function (i, p, j) {
|
|
i[p] = j
|
|
};
|
|
(function () {
|
|
function i(a, c) {
|
|
for (var b in c) c.hasOwnProperty(b) && c[b] && (a[b] = c[b])
|
|
}
|
|
|
|
function p(a, c) {
|
|
var b = {};
|
|
i(b, a);
|
|
i(b, c);
|
|
return b
|
|
}
|
|
|
|
function j(a) {
|
|
if (a && typeof a === "object" && a.constructor == (new Date).constructor) return "date";
|
|
return typeof a
|
|
}
|
|
|
|
function r() {
|
|
ko.dependentObservable = function (a, c, b) {
|
|
b = b || {};
|
|
b.deferEvaluation = !0;
|
|
a = new v(a, c, b);
|
|
a.__ko_proto__ = v;
|
|
return a
|
|
}
|
|
}
|
|
|
|
function k(a, c, b, d, e, g) {
|
|
var l = ko.utils.unwrapObservable(c) instanceof Array;
|
|
if (ko.mapping.isMapped(a)) var h = ko.utils.unwrapObservable(a)[m], b =
|
|
p(h, b);
|
|
d = d || new x;
|
|
if (d.get(c)) return a;
|
|
e = e || "";
|
|
if (l) {
|
|
var g = [], f = function (a) {
|
|
return a
|
|
};
|
|
if (b[e] && b[e].key) f = b[e].key;
|
|
if (!ko.isObservable(a)) a = ko.observableArray([]), a.mappedRemove = function (b) {
|
|
var c = typeof b == "function" ? b : function (a) {
|
|
return a === f(b)
|
|
};
|
|
return a.remove(function (a) {
|
|
return c(f(a))
|
|
})
|
|
}, a.mappedRemoveAll = function (b) {
|
|
var c = s(b, f);
|
|
return a.remove(function (a) {
|
|
return ko.utils.arrayIndexOf(c, f(a)) != -1
|
|
})
|
|
}, a.mappedDestroy = function (b) {
|
|
var c = typeof b == "function" ? b : function (a) {
|
|
return a === f(b)
|
|
};
|
|
return a.destroy(function (a) {
|
|
return c(f(a))
|
|
})
|
|
},
|
|
a.mappedDestroyAll = function (b) {
|
|
var c = s(b, f);
|
|
return a.destroy(function (a) {
|
|
return ko.utils.arrayIndexOf(c, f(a)) != -1
|
|
})
|
|
}, a.mappedIndexOf = function (b) {
|
|
var c = s(a(), f), b = f(b);
|
|
return ko.utils.arrayIndexOf(c, b)
|
|
};
|
|
for (var l = s(ko.utils.unwrapObservable(a), f).sort(), h = s(c, f).sort(), l = ko.utils.compareArrays(l, h), h = [], i = 0, u = l.length; i < u; i++) {
|
|
var q = l[i], n;
|
|
switch (q.status) {
|
|
case "added":
|
|
var o = t(ko.utils.unwrapObservable(c), q.value, f);
|
|
n = ko.utils.unwrapObservable(k(void 0, o, b, d, e, a));
|
|
o = ko.utils.arrayIndexOf(ko.utils.unwrapObservable(c),
|
|
o);
|
|
h[o] = n;
|
|
break;
|
|
case "retained":
|
|
o = t(ko.utils.unwrapObservable(c), q.value, f);
|
|
n = t(a, q.value, f);
|
|
k(n, o, b, d, e, a);
|
|
o = ko.utils.arrayIndexOf(ko.utils.unwrapObservable(c), o);
|
|
h[o] = n;
|
|
break;
|
|
case "deleted":
|
|
n = t(a, q.value, f)
|
|
}
|
|
g.push({event: q.status, item: n})
|
|
}
|
|
a(h);
|
|
b[e] && b[e].arrayChanged && ko.utils.arrayForEach(g, function (a) {
|
|
b[e].arrayChanged(a.event, a.item)
|
|
})
|
|
} else if (w(c)) {
|
|
if (!a) if (b[e] && b[e].create instanceof Function) return r(), n = b[e].create({
|
|
data: c,
|
|
parent: g
|
|
}), ko.dependentObservable = v, n; else a = {};
|
|
d.save(c, a);
|
|
y(c,
|
|
function (f) {
|
|
var l = d.get(c[f]);
|
|
a[f] = l ? l : k(a[f], c[f], b, d, f, a);
|
|
b.mappedProperties[z(e, c, f)] = !0
|
|
})
|
|
} else switch (j(c)) {
|
|
case "function":
|
|
a = c;
|
|
break;
|
|
default:
|
|
ko.isWriteableObservable(a) ? a(ko.utils.unwrapObservable(c)) : a = ko.observable(ko.utils.unwrapObservable(c))
|
|
}
|
|
return a
|
|
}
|
|
|
|
function u(a, c) {
|
|
var b;
|
|
c && (b = c(a));
|
|
b || (b = a);
|
|
return ko.utils.unwrapObservable(b)
|
|
}
|
|
|
|
function t(a, c, b) {
|
|
a = ko.utils.arrayFilter(ko.utils.unwrapObservable(a), function (a) {
|
|
return u(a, b) == c
|
|
});
|
|
if (a.length == 0) throw Error("When calling ko.update*, the key '" +
|
|
c + "' was not found!");
|
|
if (a.length > 1 && w(a[0])) throw Error("When calling ko.update*, the key '" + c + "' was not unique!");
|
|
return a[0]
|
|
}
|
|
|
|
function s(a, c) {
|
|
return ko.utils.arrayMap(ko.utils.unwrapObservable(a), function (a) {
|
|
return c ? u(a, c) : a
|
|
})
|
|
}
|
|
|
|
function y(a, c) {
|
|
if (a instanceof Array) for (var b = 0; b < a.length; b++) c(b); else for (b in a) c(b)
|
|
}
|
|
|
|
function w(a) {
|
|
return j(a) == "object" && a !== null && a !== void 0
|
|
}
|
|
|
|
function z(a, c, b) {
|
|
var d = a || "";
|
|
c instanceof Array ? a && (d += "[" + b + "]") : (a && (d += "."), d += b);
|
|
return d
|
|
}
|
|
|
|
function x() {
|
|
var a = [], c = [];
|
|
this.save = function (b, d) {
|
|
var e = ko.utils.arrayIndexOf(a, b);
|
|
e >= 0 ? c[e] = d : (a.push(b), c.push(d))
|
|
};
|
|
this.get = function (b) {
|
|
b = ko.utils.arrayIndexOf(a, b);
|
|
return b >= 0 ? c[b] : void 0
|
|
}
|
|
}
|
|
|
|
ko.mapping = {};
|
|
var m = "__ko_mapping__", v = ko.dependentObservable, g;
|
|
ko.mapping.fromJS = function (a, c, b) {
|
|
if (arguments.length == 0) throw Error("When calling ko.fromJS, pass the object you want to convert.");
|
|
var d;
|
|
d = c || {};
|
|
if (d.create instanceof Function || d.key instanceof Function || d.arrayChanged instanceof Function) d = {"": d};
|
|
d.mappedProperties =
|
|
{};
|
|
c = d;
|
|
d = k(b, a, c);
|
|
d[m] = p(d[m], c);
|
|
return d
|
|
};
|
|
ko.mapping.fromJSON = function (a, c) {
|
|
var b = ko.utils.parseJson(a);
|
|
return ko.mapping.fromJS(b, c)
|
|
};
|
|
ko.mapping.isMapped = function (a) {
|
|
return (a = ko.utils.unwrapObservable(a)) && a[m]
|
|
};
|
|
ko.mapping.updateFromJS = function (a, c) {
|
|
if (arguments.length < 2) throw Error("When calling ko.updateFromJS, pass: the object to update and the object you want to update from.");
|
|
if (!a) throw Error("The object is undefined.");
|
|
if (!a[m]) throw Error("The object you are trying to update was not created by a 'fromJS' or 'fromJSON' mapping.");
|
|
return k(a, c, a[m])
|
|
};
|
|
ko.mapping.updateFromJSON = function (a, c, b) {
|
|
c = ko.utils.parseJson(c);
|
|
return ko.mapping.updateFromJS(a, c, b)
|
|
};
|
|
ko.mapping.toJS = function (a, c) {
|
|
g || ko.mapping.resetDefaultOptions();
|
|
if (arguments.length == 0) throw Error("When calling ko.mapping.toJS, pass the object you want to convert.");
|
|
if (!(g.ignore instanceof Array)) throw Error("ko.mapping.defaultOptions().ignore should be an array.");
|
|
if (!(g.include instanceof Array)) throw Error("ko.mapping.defaultOptions().include should be an array.");
|
|
c = c || {};
|
|
if (!(c.ignore instanceof Array)) c.ignore = [c.ignore];
|
|
c.ignore = c.ignore.concat(g.ignore);
|
|
if (!(c.include instanceof Array)) c.include = [c.include];
|
|
c.include = c.include.concat(g.include);
|
|
return ko.mapping.visitModel(a, function (a) {
|
|
return ko.utils.unwrapObservable(a)
|
|
}, c)
|
|
};
|
|
ko.mapping.toJSON = function (a, c) {
|
|
var b = ko.mapping.toJS(a, c);
|
|
return ko.utils.stringifyJson(b)
|
|
};
|
|
ko.mapping.defaultOptions = function () {
|
|
if (arguments.length > 0) g = arguments[0]; else return g
|
|
};
|
|
ko.mapping.resetDefaultOptions = function () {
|
|
g = {
|
|
include: ["_destroy"],
|
|
ignore: []
|
|
}
|
|
};
|
|
ko.mapping.visitModel = function (a, c, b) {
|
|
b = b || {};
|
|
b.visitedObjects = b.visitedObjects || new x;
|
|
var d, e = ko.utils.unwrapObservable(a);
|
|
if (w(e)) c(a, b.parentName), d = e instanceof Array ? [] : {}; else return c(a, b.parentName);
|
|
b.visitedObjects.save(a, d);
|
|
var g = b.parentName;
|
|
y(e, function (a) {
|
|
if (!(b.ignore && ko.utils.arrayIndexOf(b.ignore, a) != -1)) {
|
|
var h = e[a];
|
|
b.parentName = z(g, e, a);
|
|
if (!(b.include && ko.utils.arrayIndexOf(b.include, a) === -1) || !e[m] || !e[m].mappedProperties || e[m].mappedProperties[a] || e instanceof Array) switch (j(ko.utils.unwrapObservable(h))) {
|
|
case "object":
|
|
case "undefined":
|
|
var f =
|
|
b.visitedObjects.get(h);
|
|
d[a] = f !== void 0 ? f : ko.mapping.visitModel(h, c, b);
|
|
break;
|
|
default:
|
|
d[a] = c(h, b.parentName)
|
|
}
|
|
}
|
|
});
|
|
return d
|
|
};
|
|
ko.exportSymbol("ko.mapping", ko.mapping);
|
|
ko.exportSymbol("ko.mapping.fromJS", ko.mapping.fromJS);
|
|
ko.exportSymbol("ko.mapping.fromJSON", ko.mapping.fromJSON);
|
|
ko.exportSymbol("ko.mapping.isMapped", ko.mapping.isMapped);
|
|
ko.exportSymbol("ko.mapping.defaultOptions", ko.mapping.defaultOptions);
|
|
ko.exportSymbol("ko.mapping.toJS", ko.mapping.toJS);
|
|
ko.exportSymbol("ko.mapping.toJSON", ko.mapping.toJSON);
|
|
ko.exportSymbol("ko.mapping.updateFromJS", ko.mapping.updateFromJS);
|
|
ko.exportSymbol("ko.mapping.updateFromJSON", ko.mapping.updateFromJSON);
|
|
ko.exportSymbol("ko.mapping.visitModel", ko.mapping.visitModel)
|
|
})();
|
|
|
|
/**
|
|
* Knockout Notification plugin v1.1.0
|
|
* (c) 2011 Jan Hartigan - http://www.janhartigan.com
|
|
* License: dual (MIT, GPL)
|
|
*/
|
|
ko.bindingHandlers.notification = {
|
|
update: function (e, t, n, r) {
|
|
var i = t(), s = typeof i == "object" ? i : {message: i}, o = ko.utils.unwrapObservable(s.message),
|
|
u = s.duration !== undefined ? ko.utils.unwrapObservable(s.duration) : 5e3,
|
|
a = s.fadeoutDuration !== undefined ? ko.utils.unwrapObservable(s.fadeoutDuration) : 200,
|
|
f = s.hide !== undefined ? ko.utils.unwrapObservable(s.hide) : true,
|
|
l = s.fade !== undefined ? ko.utils.unwrapObservable(s.fade) : true,
|
|
c = s.callback !== undefined ? ko.utils.unwrapObservable(s.callback) : function () {
|
|
}, h = typeof jQuery != "undefined";
|
|
if (o === null || o === undefined) o = "";
|
|
e.innerHTML = o;
|
|
clearTimeout(e.notificationTimer);
|
|
if (o == "") {
|
|
e.style.display = "none";
|
|
return
|
|
}
|
|
if (h) jQuery(e).stop(true, true).show(); else e.style.display = "";
|
|
if (f) {
|
|
e.notificationTimer = setTimeout(function () {
|
|
if (h) {
|
|
if (l) jQuery(e).fadeOut(a, function () {
|
|
s.message("");
|
|
c()
|
|
}); else {
|
|
jQuery(e).hide();
|
|
s.message("");
|
|
c()
|
|
}
|
|
} else {
|
|
e.style.display = "none";
|
|
c()
|
|
}
|
|
}, u)
|
|
} else {
|
|
c()
|
|
}
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Extension to the knockoutjs mapping plugin
|
|
* http://github.com/janhartigan/knockout-mapping-updatedata
|
|
* Requires KnockoutJS and the mapping plugin
|
|
*
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* Jan Hartigan
|
|
*/
|
|
(function () {
|
|
/**
|
|
* A function that lets you "update from js" without overriding all the view model properties and methods. You just need to supply
|
|
* the viewModel, the original JS model on which you based your data (typically what you'd use in the mapping fromJS method), and the new JS
|
|
* object that has the updated information.
|
|
*
|
|
* @param Object viewModel
|
|
* @param Object dataModel
|
|
* @param Object jsObject
|
|
*
|
|
* @return Object (returns the viewModel)
|
|
*/
|
|
ko.mapping.updateData = function (viewModel, dataModel, jsObject) {
|
|
if (arguments.length < 3) throw new Error("When calling ko.updateData, pass: the view model, the data model, and the updated data.");
|
|
if (!viewModel) throw new Error("The view model is undefined.");
|
|
|
|
for (var i in dataModel) {
|
|
if (i in jsObject && i in viewModel && typeof dataModel[i] != 'function') {
|
|
viewModel[i](jsObject[i]);
|
|
}
|
|
}
|
|
|
|
return viewModel;
|
|
}
|
|
|
|
ko.exportSymbol('ko.mapping.updateData', ko.mapping.updateData);
|
|
})();
|
|
/*!
|
|
* accounting.js v0.3.2, copyright 2011 Joss Crowcroft, MIT license, http://josscrowcroft.github.com/accounting.js
|
|
*/
|
|
(function (p, z) {
|
|
function q(a) {
|
|
return !!("" === a || a && a.charCodeAt && a.substr)
|
|
}
|
|
|
|
function m(a) {
|
|
return u ? u(a) : "[object Array]" === v.call(a)
|
|
}
|
|
|
|
function r(a) {
|
|
return "[object Object]" === v.call(a)
|
|
}
|
|
|
|
function s(a, b) {
|
|
var d, a = a || {}, b = b || {};
|
|
for (d in b) b.hasOwnProperty(d) && null == a[d] && (a[d] = b[d]);
|
|
return a
|
|
}
|
|
|
|
function j(a, b, d) {
|
|
var c = [], e, h;
|
|
if (!a) return c;
|
|
if (w && a.map === w) return a.map(b, d);
|
|
for (e = 0, h = a.length; e < h; e++) c[e] = b.call(d, a[e], e, a);
|
|
return c
|
|
}
|
|
|
|
function n(a, b) {
|
|
a = Math.round(Math.abs(a));
|
|
return isNaN(a) ? b : a
|
|
}
|
|
|
|
function x(a) {
|
|
var b = c.settings.currency.format;
|
|
"function" === typeof a && (a = a());
|
|
return q(a) && a.match("%v") ? {
|
|
pos: a,
|
|
neg: a.replace("-", "").replace("%v", "-%v"),
|
|
zero: a
|
|
} : !a || !a.pos || !a.pos.match("%v") ? !q(b) ? b : c.settings.currency.format = {
|
|
pos: b,
|
|
neg: b.replace("%v", "-%v"),
|
|
zero: b
|
|
} : a
|
|
}
|
|
|
|
var c = {
|
|
version: "0.3.2",
|
|
settings: {
|
|
currency: {symbol: "$", format: "%s%v", decimal: ".", thousand: ",", precision: 2, grouping: 3},
|
|
number: {precision: 0, grouping: 3, thousand: ",", decimal: "."}
|
|
}
|
|
}, w = Array.prototype.map, u = Array.isArray, v = Object.prototype.toString,
|
|
o = c.unformat = c.parse = function (a, b) {
|
|
if (m(a)) return j(a, function (a) {
|
|
return o(a, b)
|
|
});
|
|
a = a || 0;
|
|
if ("number" === typeof a) return a;
|
|
var b = b || ".", c = RegExp("[^0-9-" + b + "]", ["g"]),
|
|
c = parseFloat(("" + a).replace(/\((.*)\)/, "-$1").replace(c, "").replace(b, "."));
|
|
return !isNaN(c) ? c : 0
|
|
}, y = c.toFixed = function (a, b) {
|
|
var b = n(b, c.settings.number.precision), d = Math.pow(10, b);
|
|
return (Math.round(c.unformat(a) * d) / d).toFixed(b)
|
|
}, t = c.formatNumber = function (a, b, d, i) {
|
|
if (m(a)) return j(a, function (a) {
|
|
return t(a, b, d, i)
|
|
});
|
|
var a = o(a), e = s(r(b) ? b : {precision: b, thousand: d, decimal: i}, c.settings.number), h = n(e.precision),
|
|
f = 0 > a ? "-" : "", g = parseInt(y(Math.abs(a || 0), h), 10) + "", l = 3 < g.length ? g.length % 3 : 0;
|
|
return f + (l ? g.substr(0, l) + e.thousand : "") + g.substr(l).replace(/(\d{3})(?=\d)/g, "$1" + e.thousand) + (h ? e.decimal + y(Math.abs(a), h).split(".")[1] : "")
|
|
}, A = c.formatMoney = function (a, b, d, i, e, h) {
|
|
if (m(a)) return j(a, function (a) {
|
|
return A(a, b, d, i, e, h)
|
|
});
|
|
var a = o(a),
|
|
f = s(r(b) ? b : {symbol: b, precision: d, thousand: i, decimal: e, format: h}, c.settings.currency),
|
|
g = x(f.format);
|
|
return (0 < a ? g.pos : 0 > a ? g.neg : g.zero).replace("%s", f.symbol).replace("%v", t(Math.abs(a), n(f.precision), f.thousand, f.decimal))
|
|
};
|
|
c.formatColumn = function (a, b, d, i, e, h) {
|
|
if (!a) return [];
|
|
var f = s(r(b) ? b : {symbol: b, precision: d, thousand: i, decimal: e, format: h}, c.settings.currency),
|
|
g = x(f.format), l = g.pos.indexOf("%s") < g.pos.indexOf("%v") ? !0 : !1, k = 0, a = j(a, function (a) {
|
|
if (m(a)) return c.formatColumn(a, f);
|
|
a = o(a);
|
|
a = (0 < a ? g.pos : 0 > a ? g.neg : g.zero).replace("%s", f.symbol).replace("%v", t(Math.abs(a), n(f.precision), f.thousand, f.decimal));
|
|
if (a.length > k) k = a.length;
|
|
return a
|
|
});
|
|
return j(a, function (a) {
|
|
return q(a) && a.length < k ? l ? a.replace(f.symbol, f.symbol + Array(k - a.length + 1).join(" ")) : Array(k - a.length + 1).join(" ") + a : a
|
|
})
|
|
};
|
|
if ("undefined" !== typeof exports) {
|
|
if ("undefined" !== typeof module && module.exports) exports = module.exports = c;
|
|
exports.accounting = c
|
|
} else "function" === typeof define && define.amd ? define([], function () {
|
|
return c
|
|
}) : (c.noConflict = function (a) {
|
|
return function () {
|
|
p.accounting = a;
|
|
c.noConflict = z;
|
|
return c
|
|
}
|
|
}(p.accounting), p.accounting = c)
|
|
})(this);
|
|
/*!
|
|
* Lightweight Colorpicker - jQuery Plugin
|
|
* Provides simple scalable colorpicker
|
|
*
|
|
* © 2012 Dmitriy Kubyshkin (http://kubyshkin.ru)
|
|
*
|
|
* Version: 1.0
|
|
* Requires: jQuery v1.7+
|
|
*
|
|
* Dual licensed under the MIT and GPL licenses:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
*/
|
|
(function () {
|
|
var a = typeof WebKitCSSMatrix != "undefined" && (new WebKitCSSMatrix).m11,
|
|
b = {start: "mousedown touchstart", move: "mousemove touchmove", end: "mouseup touchend"};
|
|
Function.prototype.bind || (Function.prototype.bind = function (a) {
|
|
var b = Array.prototype.slice.call(arguments, 2), c = this;
|
|
return function () {
|
|
return c.apply(a, b.concat(Array.prototype.slice.call(arguments)))
|
|
}
|
|
});
|
|
var c = function (a) {
|
|
var b = a[0].toString(16), c = a[1].toString(16), d = a[2].toString(16);
|
|
return b.length > 1 || (b = "0" + b), c.length > 1 || (c = "0" + c), d.length > 1 || (d = "0" + d), b + c + d
|
|
}, d = function (a) {
|
|
return a = a.replace("#", ""), a.length === 3 && (a = a[0] + a[0] + a[1] + a[1] + a[2] + a[2]), [parseInt(a.substring(0, 2), 16), parseInt(a.substring(2, 4), 16), parseInt(a.substring(4, 6), 16)]
|
|
}, e = function (a) {
|
|
var b = (a[0] - Math.floor(a[0])) * 6, c = b - Math.floor(b), d = a[2] * (1 - a[1]), e = a[2] * (1 - a[1] * c),
|
|
f = a[2] * (1 - a[1] * (1 - c)), g = 0, h = 0, i = 0;
|
|
switch (Math.floor(b)) {
|
|
case 0:
|
|
g = a[2] * 255 + .5, h = f * 255 + .5, i = d * 255 + .5;
|
|
break;
|
|
case 1:
|
|
g = e * 255 + .5, h = a[2] * 255 + .5, i = d * 255 + .5;
|
|
break;
|
|
case 2:
|
|
g = d * 255 + .5, h = a[2] * 255 + .5, i = f * 255 + .5;
|
|
break;
|
|
case 3:
|
|
g = d * 255 + .5, h = e * 255 + .5, i = a[2] * 255 + .5;
|
|
break;
|
|
case 4:
|
|
g = f * 255 + .5, h = d * 255 + .5, i = a[2] * 255 + .5;
|
|
break;
|
|
case 5:
|
|
g = a[2] * 255 + .5, h = d * 255 + .5, i = e * 255 + .5
|
|
}
|
|
return [Math.floor(g), Math.floor(h), Math.floor(i)]
|
|
}, f = function (a) {
|
|
var b = a[0] / 255, c = a[1] / 255, d = a[2] / 255, e = Math.max(b, c, d), f = Math.min(b, c, d), g, h, i = e,
|
|
j = e - f;
|
|
h = e == 0 ? 0 : j / e;
|
|
if (e == f) g = 0; else {
|
|
switch (e) {
|
|
case b:
|
|
g = (c - d) / j + (c < d ? 6 : 0);
|
|
break;
|
|
case c:
|
|
g = (d - b) / j + 2;
|
|
break;
|
|
case d:
|
|
g = (b - c) / j + 4
|
|
}
|
|
g /= 6
|
|
}
|
|
return [g, h, i]
|
|
}, g = function (a) {
|
|
this.dragStart = this.dragStart.bind(this), this.dragMove = this.dragMove.bind(this), this.dragEnd = this.dragEnd.bind(this), this.onChange = this.onChange.bind(this), this.dragging = !1, this.$input = $(a).on("change input", this.onChange), this.$el = $('<div class="lw-colorpicker"/>').html(g.template).on(b.start, function (a) {
|
|
return !1
|
|
}).on(b.start, ".lw-sb, .lw-h", this.dragStart).appendTo(document.body), this.onChange(), this.updatePosition()
|
|
};
|
|
g.template = '<div class="lw-sb"> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAABCAYAAAAxWXB3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEFJREFUeNpi/A8EDAwMIMxAgCYkhs4mho9LjBg5euJ/FMj/o7EYpXxamPmPDuFAjbihJyY1nZOSl4jNoxg0QIABAI+56gCQgk6WAAAAAElFTkSuQmCC"> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAEACAYAAAByPhyYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEFJREFUeNpiYIACRiYQyUQci1gJbFySxPBLkKRkkBBM1FPHNEAS9BAbeIuoLUGTJDBICEpyKJnFA+mFEVYWQIABAG2AAvsKiLR6AAAAAElFTkSuQmCC"> <div class="lw-handle"></div> </div> <div class="lw-h"> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAEACAIAAAD9XIvPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALxJREFUeNp00tkKhTAMBNB07/3/n7WL7U0hwhDSh8OkKjoEaRN5oggSy5DFUA2/y4wKZJH3oyQibVp+kfMv9zumGJDdyKMZiaxr+nq/GMoE3JMcnY1uT4H3GlmCzIYCqpHVOFvPfjJkgvx6RC65uJ9bvOdXTDBAh0QNUs8W69luGAr24u1ux6slH3jDESQli2IkqpdZn7Oakf429KLNXbm2pymGZJe5iwZ5PGp+1Pxc7jWlKwPwD7sD/QUYAMWijuyJPChnAAAAAElFTkSuQmCC"> <div class="lw-handle"></div> </div>', g.prototype.destroy = function () {
|
|
this.$el.remove()
|
|
}, g.prototype.dragStart = function (a) {
|
|
if (a.which !== 1) return;
|
|
var c = $(a.currentTarget), d = c.offset();
|
|
return this.area = "h", this.areaOffset = d, this.areaDimensions = {
|
|
width: c.width(),
|
|
height: c.height()
|
|
}, this.dragging = c.find(".lw-handle"), $(document.body).on(b.move, this.dragMove), $(document.body).on(b.end, this.dragEnd), c.hasClass("lw-sb") && (this.area = "sb"), this.dragMove(a), !1
|
|
}, g.prototype.dragMove = function (a) {
|
|
if (!this.dragging) return;
|
|
var b = {top: a.pageY - this.areaOffset.top, left: 0};
|
|
this.area === "sb" && (b.left = a.pageX - this.areaOffset.left), b.left >= 0 || (b.left = 0), b.top >= 0 || (b.top = 0), b.left <= this.areaDimensions.width || (b.left = this.areaDimensions.width), b.top <= this.areaDimensions.height || (b.top = this.areaDimensions.height), this.setPosition(this.dragging, b);
|
|
var d = this.getHSB();
|
|
return this.updateInput("#" + c(e(d))), d[1] = d[2] = 1, this.$el.find(".lw-sb").css("background", "#" + c(e(d))), !1
|
|
}, g.prototype.dragEnd = function (a) {
|
|
if (!this.dragging) return;
|
|
return this.dragging = null, $(document.body).unbind(b.move, this.dragMove), $(document.body).unbind(b.end, this.dragEnd), !1
|
|
}, g.prototype.onChange = function () {
|
|
if (this.dragging) return;
|
|
var a = this.$input.val();
|
|
a.match(/^\#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/) && this.setHex(a)
|
|
}, g.prototype.getHex = function () {
|
|
return c(this.getRGB())
|
|
}, g.prototype.setHex = function (a) {
|
|
this.setRGB(d(a))
|
|
}, g.prototype.getRGB = function () {
|
|
return e(this.getHSB())
|
|
}, g.prototype.setRGB = function (a) {
|
|
this.setHSB(f(a))
|
|
}, g.prototype.getHSB = function () {
|
|
var a = this.$el.find(".lw-sb"), b = this.$el.find(".lw-h"), c = this.getPosition(a.find(".lw-handle")),
|
|
d = this.getPosition(b.find(".lw-handle"));
|
|
return [1 - d.top / b.height(), c.left / a.width(), 1 - c.top / a.height()]
|
|
}, g.prototype.setHSB = function (a) {
|
|
var b = this.$el.find(".lw-sb"), d = this.$el.find(".lw-h");
|
|
this.setPosition(b.find(".lw-handle"), {
|
|
top: Math.floor((1 - a[2]) * b.height()),
|
|
left: Math.floor(a[1] * b.width())
|
|
}), this.setPosition(d.find(".lw-handle"), {
|
|
top: Math.floor((1 - a[0]) * d.height()),
|
|
left: 0
|
|
}), a[1] = a[2] = 1, this.$el.find(".lw-sb").css("background", "#" + c(e(a)))
|
|
}, g.prototype.updateInput = function (a) {
|
|
this.$input.val(a).trigger("change")
|
|
}, g.prototype.updatePosition = function () {
|
|
var a, b, c, d, e;
|
|
a = this.$input.offset(), e = this.$el.outerWidth(), d = this.$el.outerHeight(), b = a.left, $("body").width() > b + e ? this.$el.css({left: b}) : a.left > e ? this.$el.css({left: $("body").width() - e - 31}) : this.$el.css({left: b}), this.$el.removeClass("lw-opposite-vertical"), c = a.top + this.$input.outerHeight(), $(document).height() > c + d ? this.$el.css({top: c}) : a.top > d ? (this.$el.css({top: a.top - d}), this.$el.addClass("lw-opposite-vertical")) : this.$el.css({top: c})
|
|
}, a ? (g.prototype.getPosition = function (a) {
|
|
var b = a.get(0).style.webkitTransform, c = {top: 0, left: 0};
|
|
return b && (b = b.split("(")[1].split(","), c.left = parseInt(b[0]), c.top = parseInt(b[1])), c
|
|
}, g.prototype.setPosition = function (a, b) {
|
|
a.get(0).style.webkitTransform = "translate3d(" + b.left + "px," + b.top + "px,0)"
|
|
}) : (g.prototype.getPosition = function (a) {
|
|
return a.position()
|
|
}, g.prototype.setPosition = function (a, b) {
|
|
a.css(b)
|
|
}), $(function () {
|
|
$(document).on("focus", '[data-type="color"]', function (a) {
|
|
var b = $(a.target), c = new g(b), d = function () {
|
|
c.destroy(), b.off("blur", d)
|
|
};
|
|
b.on("blur", d)
|
|
})
|
|
})
|
|
})();
|
|
window.JSON || (window.JSON = {}), function () {
|
|
function f(a) {
|
|
return a < 10 ? "0" + a : a
|
|
}
|
|
|
|
function quote(a) {
|
|
return escapable.lastIndex = 0, escapable.test(a) ? '"' + a.replace(escapable, function (a) {
|
|
var b = meta[a];
|
|
return typeof b == "string" ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
|
|
}) + '"' : '"' + a + '"'
|
|
}
|
|
|
|
function str(a, b) {
|
|
var c, d, e, f, g = gap, h, i = b[a];
|
|
i && typeof i == "object" && typeof i.toJSON == "function" && (i = i.toJSON(a)), typeof rep == "function" && (i = rep.call(b, a, i));
|
|
switch (typeof i) {
|
|
case"string":
|
|
return quote(i);
|
|
case"number":
|
|
return isFinite(i) ? String(i) : "null";
|
|
case"boolean":
|
|
case"null":
|
|
return String(i);
|
|
case"object":
|
|
if (!i) return "null";
|
|
gap += indent, h = [];
|
|
if (Object.prototype.toString.apply(i) === "[object Array]") {
|
|
f = i.length;
|
|
for (c = 0; c < f; c += 1) h[c] = str(c, i) || "null";
|
|
return e = h.length === 0 ? "[]" : gap ? "[\n" + gap + h.join(",\n" + gap) + "\n" + g + "]" : "[" + h.join(",") + "]", gap = g, e
|
|
}
|
|
if (rep && typeof rep == "object") {
|
|
f = rep.length;
|
|
for (c = 0; c < f; c += 1) d = rep[c], typeof d == "string" && (e = str(d, i), e && h.push(quote(d) + (gap ? ": " : ":") + e))
|
|
} else for (d in i) Object.hasOwnProperty.call(i, d) && (e = str(d, i), e && h.push(quote(d) + (gap ? ": " : ":") + e));
|
|
return e = h.length === 0 ? "{}" : gap ? "{\n" + gap + h.join(",\n" + gap) + "\n" + g + "}" : "{" + h.join(",") + "}", gap = g, e
|
|
}
|
|
}
|
|
|
|
"use strict", typeof Date.prototype.toJSON != "function" && (Date.prototype.toJSON = function (a) {
|
|
return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null
|
|
}, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (a) {
|
|
return this.valueOf()
|
|
});
|
|
var JSON = window.JSON,
|
|
cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
gap, indent, meta = {"\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\"},
|
|
rep;
|
|
typeof JSON.stringify != "function" && (JSON.stringify = function (a, b, c) {
|
|
var d;
|
|
gap = "", indent = "";
|
|
if (typeof c == "number") for (d = 0; d < c; d += 1) indent += " "; else typeof c == "string" && (indent = c);
|
|
rep = b;
|
|
if (!b || typeof b == "function" || typeof b == "object" && typeof b.length == "number") return str("", {"": a});
|
|
throw new Error("JSON.stringify")
|
|
}), typeof JSON.parse != "function" && (JSON.parse = function (text, reviver) {
|
|
function walk(a, b) {
|
|
var c, d, e = a[b];
|
|
if (e && typeof e == "object") for (c in e) Object.hasOwnProperty.call(e, c) && (d = walk(e, c), d !== undefined ? e[c] = d : delete e[c]);
|
|
return reviver.call(a, b, e)
|
|
}
|
|
|
|
var j;
|
|
text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function (a) {
|
|
return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
|
|
}));
|
|
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return j = eval("(" + text + ")"), typeof reviver == "function" ? walk({"": j}, "") : j;
|
|
throw new SyntaxError("JSON.parse")
|
|
})
|
|
}(), function (a, b) {
|
|
"use strict";
|
|
var c = a.History = a.History || {};
|
|
if (typeof c.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded...");
|
|
c.Adapter = {
|
|
handlers: {}, _uid: 1, uid: function (a) {
|
|
return a._uid || (a._uid = c.Adapter._uid++)
|
|
}, bind: function (a, b, d) {
|
|
var e = c.Adapter.uid(a);
|
|
c.Adapter.handlers[e] = c.Adapter.handlers[e] || {}, c.Adapter.handlers[e][b] = c.Adapter.handlers[e][b] || [], c.Adapter.handlers[e][b].push(d), a["on" + b] = function (a, b) {
|
|
return function (d) {
|
|
c.Adapter.trigger(a, b, d)
|
|
}
|
|
}(a, b)
|
|
}, trigger: function (a, b, d) {
|
|
d = d || {};
|
|
var e = c.Adapter.uid(a), f, g;
|
|
c.Adapter.handlers[e] = c.Adapter.handlers[e] || {}, c.Adapter.handlers[e][b] = c.Adapter.handlers[e][b] || [];
|
|
for (f = 0, g = c.Adapter.handlers[e][b].length; f < g; ++f) c.Adapter.handlers[e][b][f].apply(this, [d])
|
|
}, extractEventData: function (a, c) {
|
|
var d = c && c[a] || b;
|
|
return d
|
|
}, onDomLoad: function (b) {
|
|
var c = a.setTimeout(function () {
|
|
b()
|
|
}, 2e3);
|
|
a.onload = function () {
|
|
clearTimeout(c), b()
|
|
}
|
|
}
|
|
}, typeof c.init != "undefined" && c.init()
|
|
}(window), function (a, b) {
|
|
"use strict";
|
|
var c = a.document, d = a.setTimeout || d, e = a.clearTimeout || e, f = a.setInterval || f,
|
|
g = a.History = a.History || {};
|
|
if (typeof g.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded...");
|
|
g.initHtml4 = function () {
|
|
if (typeof g.initHtml4.initialized != "undefined") return !1;
|
|
g.initHtml4.initialized = !0, g.enabled = !0, g.savedHashes = [], g.isLastHash = function (a) {
|
|
var b = g.getHashByIndex(), c;
|
|
return c = a === b, c
|
|
}, g.saveHash = function (a) {
|
|
return g.isLastHash(a) ? !1 : (g.savedHashes.push(a), !0)
|
|
}, g.getHashByIndex = function (a) {
|
|
var b = null;
|
|
return typeof a == "undefined" ? b = g.savedHashes[g.savedHashes.length - 1] : a < 0 ? b = g.savedHashes[g.savedHashes.length + a] : b = g.savedHashes[a], b
|
|
}, g.discardedHashes = {}, g.discardedStates = {}, g.discardState = function (a, b, c) {
|
|
var d = g.getHashByState(a), e;
|
|
return e = {discardedState: a, backState: c, forwardState: b}, g.discardedStates[d] = e, !0
|
|
}, g.discardHash = function (a, b, c) {
|
|
var d = {discardedHash: a, backState: c, forwardState: b};
|
|
return g.discardedHashes[a] = d, !0
|
|
}, g.discardedState = function (a) {
|
|
var b = g.getHashByState(a), c;
|
|
return c = g.discardedStates[b] || !1, c
|
|
}, g.discardedHash = function (a) {
|
|
var b = g.discardedHashes[a] || !1;
|
|
return b
|
|
}, g.recycleState = function (a) {
|
|
var b = g.getHashByState(a);
|
|
return g.discardedState(a) && delete g.discardedStates[b], !0
|
|
}, g.emulated.hashChange && (g.hashChangeInit = function () {
|
|
g.checkerFunction = null;
|
|
var b = "", d, e, h, i;
|
|
return g.isInternetExplorer() ? (d = "historyjs-iframe", e = c.createElement("iframe"), e.setAttribute("id", d), e.style.display = "none", c.body.appendChild(e), e.contentWindow.document.open(), e.contentWindow.document.close(), h = "", i = !1, g.checkerFunction = function () {
|
|
if (i) return !1;
|
|
i = !0;
|
|
var c = g.getHash() || "", d = g.unescapeHash(e.contentWindow.document.location.hash) || "";
|
|
return c !== b ? (b = c, d !== c && (h = d = c, e.contentWindow.document.open(), e.contentWindow.document.close(), e.contentWindow.document.location.hash = g.escapeHash(c)), g.Adapter.trigger(a, "hashchange")) : d !== h && (h = d, g.setHash(d, !1)), i = !1, !0
|
|
}) : g.checkerFunction = function () {
|
|
var c = g.getHash();
|
|
return c !== b && (b = c, g.Adapter.trigger(a, "hashchange")), !0
|
|
}, g.intervalList.push(f(g.checkerFunction, g.options.hashChangeInterval)), !0
|
|
}, g.Adapter.onDomLoad(g.hashChangeInit)), g.emulated.pushState && (g.onHashChange = function (b) {
|
|
var d = b && b.newURL || c.location.href, e = g.getHashByUrl(d), f = null, h = null, i = null, j;
|
|
return g.isLastHash(e) ? (g.busy(!1), !1) : (g.doubleCheckComplete(), g.saveHash(e), e && g.isTraditionalAnchor(e) ? (g.Adapter.trigger(a, "anchorchange"), g.busy(!1), !1) : (f = g.extractState(g.getFullUrl(e || c.location.href, !1), !0), g.isLastSavedState(f) ? (g.busy(!1), !1) : (h = g.getHashByState(f), j = g.discardedState(f), j ? (g.getHashByIndex(-2) === g.getHashByState(j.forwardState) ? g.back(!1) : g.forward(!1), !1) : (g.pushState(f.data, f.title, f.url, !1), !0))))
|
|
}, g.Adapter.bind(a, "hashchange", g.onHashChange), g.pushState = function (b, d, e, f) {
|
|
if (g.getHashByUrl(e)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
|
|
if (f !== !1 && g.busy()) return g.pushQueue({
|
|
scope: g,
|
|
callback: g.pushState,
|
|
args: arguments,
|
|
queue: f
|
|
}), !1;
|
|
g.busy(!0);
|
|
var h = g.createStateObject(b, d, e), i = g.getHashByState(h), j = g.getState(!1), k = g.getHashByState(j),
|
|
l = g.getHash();
|
|
return g.storeState(h), g.expectedStateId = h.id, g.recycleState(h), g.setTitle(h), i === k ? (g.busy(!1), !1) : i !== l && i !== g.getShortUrl(c.location.href) ? (g.setHash(i, !1), !1) : (g.saveState(h), g.Adapter.trigger(a, "statechange"), g.busy(!1), !0)
|
|
}, g.replaceState = function (a, b, c, d) {
|
|
if (g.getHashByUrl(c)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
|
|
if (d !== !1 && g.busy()) return g.pushQueue({
|
|
scope: g,
|
|
callback: g.replaceState,
|
|
args: arguments,
|
|
queue: d
|
|
}), !1;
|
|
g.busy(!0);
|
|
var e = g.createStateObject(a, b, c), f = g.getState(!1), h = g.getStateByIndex(-2);
|
|
return g.discardState(f, e, h), g.pushState(e.data, e.title, e.url, !1), !0
|
|
}), g.emulated.pushState && g.getHash() && !g.emulated.hashChange && g.Adapter.onDomLoad(function () {
|
|
g.Adapter.trigger(a, "hashchange")
|
|
})
|
|
}, typeof g.init != "undefined" && g.init()
|
|
}(window), function (a, b) {
|
|
"use strict";
|
|
var c = a.console || b, d = a.document, e = a.navigator, f = a.sessionStorage || !1, g = a.setTimeout,
|
|
h = a.clearTimeout, i = a.setInterval, j = a.clearInterval, k = a.JSON, l = a.alert,
|
|
m = a.History = a.History || {}, n = a.history;
|
|
k.stringify = k.stringify || k.encode, k.parse = k.parse || k.decode;
|
|
if (typeof m.init != "undefined") throw new Error("History.js Core has already been loaded...");
|
|
m.init = function () {
|
|
return typeof m.Adapter == "undefined" ? !1 : (typeof m.initCore != "undefined" && m.initCore(), typeof m.initHtml4 != "undefined" && m.initHtml4(), !0)
|
|
}, m.initCore = function () {
|
|
if (typeof m.initCore.initialized != "undefined") return !1;
|
|
m.initCore.initialized = !0, m.options = m.options || {}, m.options.hashChangeInterval = m.options.hashChangeInterval || 100, m.options.safariPollInterval = m.options.safariPollInterval || 500, m.options.doubleCheckInterval = m.options.doubleCheckInterval || 500, m.options.storeInterval = m.options.storeInterval || 1e3, m.options.busyDelay = m.options.busyDelay || 250, m.options.debug = m.options.debug || !1, m.options.initialTitle = m.options.initialTitle || d.title, m.intervalList = [], m.clearAllIntervals = function () {
|
|
var a, b = m.intervalList;
|
|
if (typeof b != "undefined" && b !== null) {
|
|
for (a = 0; a < b.length; a++) j(b[a]);
|
|
m.intervalList = null
|
|
}
|
|
}, m.debug = function () {
|
|
(m.options.debug || !1) && m.log.apply(m, arguments)
|
|
}, m.log = function () {
|
|
var a = typeof c != "undefined" && typeof c.log != "undefined" && typeof c.log.apply != "undefined",
|
|
b = d.getElementById("log"), e, f, g, h, i;
|
|
a ? (h = Array.prototype.slice.call(arguments), e = h.shift(), typeof c.debug != "undefined" ? c.debug.apply(c, [e, h]) : c.log.apply(c, [e, h])) : e = "\n" + arguments[0] + "\n";
|
|
for (f = 1, g = arguments.length; f < g; ++f) {
|
|
i = arguments[f];
|
|
if (typeof i == "object" && typeof k != "undefined") try {
|
|
i = k.stringify(i)
|
|
} catch (j) {
|
|
}
|
|
e += "\n" + i + "\n"
|
|
}
|
|
return b ? (b.value += e + "\n-----\n", b.scrollTop = b.scrollHeight - b.clientHeight) : a || l(e), !0
|
|
}, m.getInternetExplorerMajorVersion = function () {
|
|
var a = m.getInternetExplorerMajorVersion.cached = typeof m.getInternetExplorerMajorVersion.cached != "undefined" ? m.getInternetExplorerMajorVersion.cached : function () {
|
|
var a = 3, b = d.createElement("div"), c = b.getElementsByTagName("i");
|
|
while ((b.innerHTML = "<!--[if gt IE " + ++a + "]><i></i><![endif]-->") && c[0]) ;
|
|
return a > 4 ? a : !1
|
|
}();
|
|
return a
|
|
}, m.isInternetExplorer = function () {
|
|
var a = m.isInternetExplorer.cached = typeof m.isInternetExplorer.cached != "undefined" ? m.isInternetExplorer.cached : Boolean(m.getInternetExplorerMajorVersion());
|
|
return a
|
|
}, m.emulated = {
|
|
pushState: !Boolean(a.history && a.history.pushState && a.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent) && !/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),
|
|
hashChange: Boolean(!("onhashchange" in a || "onhashchange" in d) || m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8)
|
|
}, m.enabled = !m.emulated.pushState, m.bugs = {
|
|
setHash: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
|
|
safariPoll: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
|
|
ieDoubleCheck: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8),
|
|
hashEscape: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 7)
|
|
}, m.isEmptyObject = function (a) {
|
|
for (var b in a) return !1;
|
|
return !0
|
|
}, m.cloneObject = function (a) {
|
|
var b, c;
|
|
return a ? (b = k.stringify(a), c = k.parse(b)) : c = {}, c
|
|
}, m.getRootUrl = function () {
|
|
var a = d.location.protocol + "//" + (d.location.hostname || d.location.host);
|
|
if (d.location.port || !1) a += ":" + d.location.port;
|
|
return a += "/", a
|
|
}, m.getBaseHref = function () {
|
|
var a = d.getElementsByTagName("base"), b = null, c = "";
|
|
return a.length === 1 && (b = a[0], c = b.href.replace(/[^\/]+$/, "")), c = c.replace(/\/+$/, ""), c && (c += "/"), c
|
|
}, m.getBaseUrl = function () {
|
|
var a = m.getBaseHref() || m.getBasePageUrl() || m.getRootUrl();
|
|
return a
|
|
}, m.getPageUrl = function () {
|
|
var a = m.getState(!1, !1), b = (a || {}).url || d.location.href, c;
|
|
return c = b.replace(/\/+$/, "").replace(/[^\/]+$/, function (a, b, c) {
|
|
return /\./.test(a) ? a : a + "/"
|
|
}), c
|
|
}, m.getBasePageUrl = function () {
|
|
var a = d.location.href.replace(/[#\?].*/, "").replace(/[^\/]+$/, function (a, b, c) {
|
|
return /[^\/]$/.test(a) ? "" : a
|
|
}).replace(/\/+$/, "") + "/";
|
|
return a
|
|
}, m.getFullUrl = function (a, b) {
|
|
var c = a, d = a.substring(0, 1);
|
|
return b = typeof b == "undefined" ? !0 : b, /[a-z]+\:\/\//.test(a) || (d === "/" ? c = m.getRootUrl() + a.replace(/^\/+/, "") : d === "#" ? c = m.getPageUrl().replace(/#.*/, "") + a : d === "?" ? c = m.getPageUrl().replace(/[\?#].*/, "") + a : b ? c = m.getBaseUrl() + a.replace(/^(\.\/)+/, "") : c = m.getBasePageUrl() + a.replace(/^(\.\/)+/, "")), c.replace(/\#$/, "")
|
|
}, m.getShortUrl = function (a) {
|
|
var b = a, c = m.getBaseUrl(), d = m.getRootUrl();
|
|
return m.emulated.pushState && (b = b.replace(c, "")), b = b.replace(d, "/"), m.isTraditionalAnchor(b) && (b = "./" + b), b = b.replace(/^(\.\/)+/g, "./").replace(/\#$/, ""), b
|
|
}, m.store = {}, m.idToState = m.idToState || {}, m.stateToId = m.stateToId || {}, m.urlToId = m.urlToId || {}, m.storedStates = m.storedStates || [], m.savedStates = m.savedStates || [], m.normalizeStore = function () {
|
|
m.store.idToState = m.store.idToState || {}, m.store.urlToId = m.store.urlToId || {}, m.store.stateToId = m.store.stateToId || {}
|
|
}, m.getState = function (a, b) {
|
|
typeof a == "undefined" && (a = !0), typeof b == "undefined" && (b = !0);
|
|
var c = m.getLastSavedState();
|
|
return !c && b && (c = m.createStateObject()), a && (c = m.cloneObject(c), c.url = c.cleanUrl || c.url), c
|
|
}, m.getIdByState = function (a) {
|
|
var b = m.extractId(a.url), c;
|
|
if (!b) {
|
|
c = m.getStateString(a);
|
|
if (typeof m.stateToId[c] != "undefined") b = m.stateToId[c]; else if (typeof m.store.stateToId[c] != "undefined") b = m.store.stateToId[c]; else {
|
|
for (; ;) {
|
|
b = (new Date).getTime() + String(Math.random()).replace(/\D/g, "");
|
|
if (typeof m.idToState[b] == "undefined" && typeof m.store.idToState[b] == "undefined") break
|
|
}
|
|
m.stateToId[c] = b, m.idToState[b] = a
|
|
}
|
|
}
|
|
return b
|
|
}, m.normalizeState = function (a) {
|
|
var b, c;
|
|
if (!a || typeof a != "object") a = {};
|
|
if (typeof a.normalized != "undefined") return a;
|
|
if (!a.data || typeof a.data != "object") a.data = {};
|
|
b = {}, b.normalized = !0, b.title = a.title || "", b.url = m.getFullUrl(m.unescapeString(a.url || d.location.href)), b.hash = m.getShortUrl(b.url), b.data = m.cloneObject(a.data), b.id = m.getIdByState(b), b.cleanUrl = b.url.replace(/\??\&_suid.*/, ""), b.url = b.cleanUrl, c = !m.isEmptyObject(b.data);
|
|
if (b.title || c) b.hash = m.getShortUrl(b.url).replace(/\??\&_suid.*/, ""), /\?/.test(b.hash) || (b.hash += "?"), b.hash += "&_suid=" + b.id;
|
|
return b.hashedUrl = m.getFullUrl(b.hash), (m.emulated.pushState || m.bugs.safariPoll) && m.hasUrlDuplicate(b) && (b.url = b.hashedUrl), b
|
|
}, m.createStateObject = function (a, b, c) {
|
|
var d = {data: a, title: b, url: c};
|
|
return d = m.normalizeState(d), d
|
|
}, m.getStateById = function (a) {
|
|
a = String(a);
|
|
var c = m.idToState[a] || m.store.idToState[a] || b;
|
|
return c
|
|
}, m.getStateString = function (a) {
|
|
var b, c, d;
|
|
return b = m.normalizeState(a), c = {data: b.data, title: a.title, url: a.url}, d = k.stringify(c), d
|
|
}, m.getStateId = function (a) {
|
|
var b, c;
|
|
return b = m.normalizeState(a), c = b.id, c
|
|
}, m.getHashByState = function (a) {
|
|
var b, c;
|
|
return b = m.normalizeState(a), c = b.hash, c
|
|
}, m.extractId = function (a) {
|
|
var b, c, d;
|
|
return c = /(.*)\&_suid=([0-9]+)$/.exec(a), d = c ? c[1] || a : a, b = c ? String(c[2] || "") : "", b || !1
|
|
}, m.isTraditionalAnchor = function (a) {
|
|
var b = !/[\/\?\.]/.test(a);
|
|
return b
|
|
}, m.extractState = function (a, b) {
|
|
var c = null, d, e;
|
|
return b = b || !1, d = m.extractId(a), d && (c = m.getStateById(d)), c || (e = m.getFullUrl(a), d = m.getIdByUrl(e) || !1, d && (c = m.getStateById(d)), !c && b && !m.isTraditionalAnchor(a) && (c = m.createStateObject(null, null, e))), c
|
|
}, m.getIdByUrl = function (a) {
|
|
var c = m.urlToId[a] || m.store.urlToId[a] || b;
|
|
return c
|
|
}, m.getLastSavedState = function () {
|
|
return m.savedStates[m.savedStates.length - 1] || b
|
|
}, m.getLastStoredState = function () {
|
|
return m.storedStates[m.storedStates.length - 1] || b
|
|
}, m.hasUrlDuplicate = function (a) {
|
|
var b = !1, c;
|
|
return c = m.extractState(a.url), b = c && c.id !== a.id, b
|
|
}, m.storeState = function (a) {
|
|
return m.urlToId[a.url] = a.id, m.storedStates.push(m.cloneObject(a)), a
|
|
}, m.isLastSavedState = function (a) {
|
|
var b = !1, c, d, e;
|
|
return m.savedStates.length && (c = a.id, d = m.getLastSavedState(), e = d.id, b = c === e), b
|
|
}, m.saveState = function (a) {
|
|
return m.isLastSavedState(a) ? !1 : (m.savedStates.push(m.cloneObject(a)), !0)
|
|
}, m.getStateByIndex = function (a) {
|
|
var b = null;
|
|
return typeof a == "undefined" ? b = m.savedStates[m.savedStates.length - 1] : a < 0 ? b = m.savedStates[m.savedStates.length + a] : b = m.savedStates[a], b
|
|
}, m.getHash = function () {
|
|
var a = m.unescapeHash(d.location.hash);
|
|
return a
|
|
}, m.unescapeString = function (b) {
|
|
var c = b, d;
|
|
for (; ;) {
|
|
d = a.unescape(c);
|
|
if (d === c) break;
|
|
c = d
|
|
}
|
|
return c
|
|
}, m.unescapeHash = function (a) {
|
|
var b = m.normalizeHash(a);
|
|
return b = m.unescapeString(b), b
|
|
}, m.normalizeHash = function (a) {
|
|
var b = a.replace(/[^#]*#/, "").replace(/#.*/, "");
|
|
return b
|
|
}, m.setHash = function (a, b) {
|
|
var c, e, f;
|
|
return b !== !1 && m.busy() ? (m.pushQueue({
|
|
scope: m,
|
|
callback: m.setHash,
|
|
args: arguments,
|
|
queue: b
|
|
}), !1) : (c = m.escapeHash(a), m.busy(!0), e = m.extractState(a, !0), e && !m.emulated.pushState ? m.pushState(e.data, e.title, e.url, !1) : d.location.hash !== c && (m.bugs.setHash ? (f = m.getPageUrl(), m.pushState(null, null, f + "#" + c, !1)) : d.location.hash = c), m)
|
|
}, m.escapeHash = function (b) {
|
|
var c = m.normalizeHash(b);
|
|
return c = a.escape(c), m.bugs.hashEscape || (c = c.replace(/\%21/g, "!").replace(/\%26/g, "&").replace(/\%3D/g, "=").replace(/\%3F/g, "?")), c
|
|
}, m.getHashByUrl = function (a) {
|
|
var b = String(a).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2");
|
|
return b = m.unescapeHash(b), b
|
|
}, m.setTitle = function (a) {
|
|
var b = a.title, c;
|
|
b || (c = m.getStateByIndex(0), c && c.url === a.url && (b = c.title || m.options.initialTitle));
|
|
try {
|
|
d.getElementsByTagName("title")[0].innerHTML = b.replace("<", "<").replace(">", ">").replace(" & ", " & ")
|
|
} catch (e) {
|
|
}
|
|
return d.title = b, m
|
|
}, m.queues = [], m.busy = function (a) {
|
|
typeof a != "undefined" ? m.busy.flag = a : typeof m.busy.flag == "undefined" && (m.busy.flag = !1);
|
|
if (!m.busy.flag) {
|
|
h(m.busy.timeout);
|
|
var b = function () {
|
|
var a, c, d;
|
|
if (m.busy.flag) return;
|
|
for (a = m.queues.length - 1; a >= 0; --a) {
|
|
c = m.queues[a];
|
|
if (c.length === 0) continue;
|
|
d = c.shift(), m.fireQueueItem(d), m.busy.timeout = g(b, m.options.busyDelay)
|
|
}
|
|
};
|
|
m.busy.timeout = g(b, m.options.busyDelay)
|
|
}
|
|
return m.busy.flag
|
|
}, m.busy.flag = !1, m.fireQueueItem = function (a) {
|
|
return a.callback.apply(a.scope || m, a.args || [])
|
|
}, m.pushQueue = function (a) {
|
|
return m.queues[a.queue || 0] = m.queues[a.queue || 0] || [], m.queues[a.queue || 0].push(a), m
|
|
}, m.queue = function (a, b) {
|
|
return typeof a == "function" && (a = {callback: a}), typeof b != "undefined" && (a.queue = b), m.busy() ? m.pushQueue(a) : m.fireQueueItem(a), m
|
|
}, m.clearQueue = function () {
|
|
return m.busy.flag = !1, m.queues = [], m
|
|
}, m.stateChanged = !1, m.doubleChecker = !1, m.doubleCheckComplete = function () {
|
|
return m.stateChanged = !0, m.doubleCheckClear(), m
|
|
}, m.doubleCheckClear = function () {
|
|
return m.doubleChecker && (h(m.doubleChecker), m.doubleChecker = !1), m
|
|
}, m.doubleCheck = function (a) {
|
|
return m.stateChanged = !1, m.doubleCheckClear(), m.bugs.ieDoubleCheck && (m.doubleChecker = g(function () {
|
|
return m.doubleCheckClear(), m.stateChanged || a(), !0
|
|
}, m.options.doubleCheckInterval)), m
|
|
}, m.safariStatePoll = function () {
|
|
var b = m.extractState(d.location.href), c;
|
|
if (!m.isLastSavedState(b)) c = b; else return;
|
|
return c || (c = m.createStateObject()), m.Adapter.trigger(a, "popstate"), m
|
|
}, m.back = function (a) {
|
|
return a !== !1 && m.busy() ? (m.pushQueue({
|
|
scope: m,
|
|
callback: m.back,
|
|
args: arguments,
|
|
queue: a
|
|
}), !1) : (m.busy(!0), m.doubleCheck(function () {
|
|
m.back(!1)
|
|
}), n.go(-1), !0)
|
|
}, m.forward = function (a) {
|
|
return a !== !1 && m.busy() ? (m.pushQueue({
|
|
scope: m,
|
|
callback: m.forward,
|
|
args: arguments,
|
|
queue: a
|
|
}), !1) : (m.busy(!0), m.doubleCheck(function () {
|
|
m.forward(!1)
|
|
}), n.go(1), !0)
|
|
}, m.go = function (a, b) {
|
|
var c;
|
|
if (a > 0) for (c = 1; c <= a; ++c) m.forward(b); else {
|
|
if (!(a < 0)) throw new Error("History.go: History.go requires a positive or negative integer passed.");
|
|
for (c = -1; c >= a; --c) m.back(b)
|
|
}
|
|
return m
|
|
};
|
|
if (m.emulated.pushState) {
|
|
var o = function () {
|
|
};
|
|
m.pushState = m.pushState || o, m.replaceState = m.replaceState || o
|
|
} else m.onPopState = function (b, c) {
|
|
var e = !1, f = !1, g, h;
|
|
return m.doubleCheckComplete(), g = m.getHash(), g ? (h = m.extractState(g || d.location.href, !0), h ? m.replaceState(h.data, h.title, h.url, !1) : (m.Adapter.trigger(a, "anchorchange"), m.busy(!1)), m.expectedStateId = !1, !1) : (e = m.Adapter.extractEventData("state", b, c) || !1, e ? f = m.getStateById(e) : m.expectedStateId ? f = m.getStateById(m.expectedStateId) : f = m.extractState(d.location.href), f || (f = m.createStateObject(null, null, d.location.href)), m.expectedStateId = !1, m.isLastSavedState(f) ? (m.busy(!1), !1) : (m.storeState(f), m.saveState(f), m.setTitle(f), m.Adapter.trigger(a, "statechange"), m.busy(!1), !0))
|
|
}, m.Adapter.bind(a, "popstate", m.onPopState), m.pushState = function (b, c, d, e) {
|
|
if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
|
|
if (e !== !1 && m.busy()) return m.pushQueue({
|
|
scope: m,
|
|
callback: m.pushState,
|
|
args: arguments,
|
|
queue: e
|
|
}), !1;
|
|
m.busy(!0);
|
|
var f = m.createStateObject(b, c, d);
|
|
return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), m.expectedStateId = f.id, n.pushState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0
|
|
}, m.replaceState = function (b, c, d, e) {
|
|
if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
|
|
if (e !== !1 && m.busy()) return m.pushQueue({
|
|
scope: m,
|
|
callback: m.replaceState,
|
|
args: arguments,
|
|
queue: e
|
|
}), !1;
|
|
m.busy(!0);
|
|
var f = m.createStateObject(b, c, d);
|
|
return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), m.expectedStateId = f.id, n.replaceState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0
|
|
};
|
|
if (f) {
|
|
try {
|
|
m.store = k.parse(f.getItem("History.store")) || {}
|
|
} catch (p) {
|
|
m.store = {}
|
|
}
|
|
m.normalizeStore()
|
|
} else m.store = {}, m.normalizeStore();
|
|
m.Adapter.bind(a, "beforeunload", m.clearAllIntervals), m.Adapter.bind(a, "unload", m.clearAllIntervals), m.saveState(m.storeState(m.extractState(d.location.href, !0))), f && (m.onUnload = function () {
|
|
var a, b;
|
|
try {
|
|
a = k.parse(f.getItem("History.store")) || {}
|
|
} catch (c) {
|
|
a = {}
|
|
}
|
|
a.idToState = a.idToState || {}, a.urlToId = a.urlToId || {}, a.stateToId = a.stateToId || {};
|
|
for (b in m.idToState) {
|
|
if (!m.idToState.hasOwnProperty(b)) continue;
|
|
a.idToState[b] = m.idToState[b]
|
|
}
|
|
for (b in m.urlToId) {
|
|
if (!m.urlToId.hasOwnProperty(b)) continue;
|
|
a.urlToId[b] = m.urlToId[b]
|
|
}
|
|
for (b in m.stateToId) {
|
|
if (!m.stateToId.hasOwnProperty(b)) continue;
|
|
a.stateToId[b] = m.stateToId[b]
|
|
}
|
|
m.store = a, m.normalizeStore(), f.setItem("History.store", k.stringify(a))
|
|
}, m.intervalList.push(i(m.onUnload, m.options.storeInterval)), m.Adapter.bind(a, "beforeunload", m.onUnload), m.Adapter.bind(a, "unload", m.onUnload));
|
|
if (!m.emulated.pushState) {
|
|
m.bugs.safariPoll && m.intervalList.push(i(m.safariStatePoll, m.options.safariPollInterval));
|
|
if (e.vendor === "Apple Computer, Inc." || (e.appCodeName || "") === "Mozilla") m.Adapter.bind(a, "hashchange", function () {
|
|
m.Adapter.trigger(a, "popstate")
|
|
}), m.getHash() && m.Adapter.onDomLoad(function () {
|
|
m.Adapter.trigger(a, "hashchange")
|
|
})
|
|
}
|
|
}, m.init()
|
|
}(window);
|
|
|
|
//# sourceMappingURL=base.js.map
|