Skip to content

Instantly share code, notes, and snippets.

@eyecatchup
Created June 6, 2017 19:26
Show Gist options
  • Save eyecatchup/bb62b99a7cc0ce3d3a33ad80e9991a73 to your computer and use it in GitHub Desktop.
Save eyecatchup/bb62b99a7cc0ce3d3a33ad80e9991a73 to your computer and use it in GitHub Desktop.
var requirejs, require, define;
(function(e) {
function h(e, t) {
return f.call(e, t)
}
function p(e, t) {
var n, r, i, s, o, a, f, l, h, p, d, v = t && t.split("/"), m = u.map, g = m && m["*"] || {};
if (e && e.charAt(0) === ".")
if (t) {
v = v.slice(0, v.length - 1),
e = e.split("/"),
o = e.length - 1,
u.nodeIdCompat && c.test(e[o]) && (e[o] = e[o].replace(c, "")),
e = v.concat(e);
for (h = 0; h < e.length; h += 1) {
d = e[h];
if (d === ".")
e.splice(h, 1),
h -= 1;
else if (d === "..") {
if (h === 1 && (e[2] === ".." || e[0] === ".."))
break;
h > 0 && (e.splice(h - 1, 2),
h -= 2)
}
}
e = e.join("/")
} else
e.indexOf("./") === 0 && (e = e.substring(2));
if ((v || g) && m) {
n = e.split("/");
for (h = n.length; h > 0; h -= 1) {
r = n.slice(0, h).join("/");
if (v)
for (p = v.length; p > 0; p -= 1) {
i = m[v.slice(0, p).join("/")];
if (i) {
i = i[r];
if (i) {
s = i,
a = h;
break
}
}
}
if (s)
break;
!f && g && g[r] && (f = g[r],
l = h)
}
!s && f && (s = f,
a = l),
s && (n.splice(0, a, s),
e = n.join("/"))
}
return e
}
function d(t, r) {
return function() {
var i = l.call(arguments, 0);
return typeof i[0] != "string" && i.length === 1 && i.push(null),
n.apply(e, i.concat([t, r]))
}
}
function v(e) {
return function(t) {
return p(t, e)
}
}
function m(e) {
return function(t) {
s[e] = t
}
}
function g(n) {
if (h(o, n)) {
var r = o[n];
delete o[n],
a[n] = !0,
t.apply(e, r)
}
if (!h(s, n) && !h(a, n))
throw new Error("No " + n);
return s[n]
}
function y(e) {
var t, n = e ? e.indexOf("!") : -1;
return n > -1 && (t = e.substring(0, n),
e = e.substring(n + 1, e.length)),
[t, e]
}
function b(e) {
return function() {
return u && u.config && u.config[e] || {}
}
}
var t, n, r, i, s = {}, o = {}, u = {}, a = {}, f = Object.prototype.hasOwnProperty, l = [].slice, c = /\.js$/;
r = function(e, t) {
var n, r = y(e), i = r[0];
return e = r[1],
i && (i = p(i, t),
n = g(i)),
i ? n && n.normalize ? e = n.normalize(e, v(t)) : e = p(e, t) : (e = p(e, t),
r = y(e),
i = r[0],
e = r[1],
i && (n = g(i))),
{
f: i ? i + "!" + e : e,
n: e,
pr: i,
p: n
}
}
,
i = {
require: function(e) {
return d(e)
},
exports: function(e) {
var t = s[e];
return typeof t != "undefined" ? t : s[e] = {}
},
module: function(e) {
return {
id: e,
uri: "",
exports: s[e],
config: b(e)
}
}
},
t = function(t, n, u, f) {
var l, c, p, v, y, b = [], w = typeof u, E;
f = f || t;
if (w === "undefined" || w === "function") {
n = !n.length && u.length ? ["require", "exports", "module"] : n;
for (y = 0; y < n.length; y += 1) {
v = r(n[y], f),
c = v.f;
if (c === "require")
b[y] = i.require(t);
else if (c === "exports")
b[y] = i.exports(t),
E = !0;
else if (c === "module")
l = b[y] = i.module(t);
else if (h(s, c) || h(o, c) || h(a, c))
b[y] = g(c);
else {
if (!v.p)
throw new Error(t + " missing " + c);
v.p.load(v.n, d(f, !0), m(c), {}),
b[y] = s[c]
}
}
p = u ? u.apply(s[t], b) : undefined;
if (t)
if (l && l.exports !== e && l.exports !== s[t])
s[t] = l.exports;
else if (p !== e || !E)
s[t] = p
} else
t && (s[t] = u)
}
,
requirejs = require = n = function(s, o, a, f, l) {
if (typeof s == "string")
return i[s] ? i[s](o) : g(r(s, o).f);
if (!s.splice) {
u = s,
u.deps && n(u.deps, u.callback);
if (!o)
return;
o.splice ? (s = o,
o = a,
a = null) : s = e
}
return o = o || function() {}
,
typeof a == "function" && (a = f,
f = l),
f ? t(e, s, o, a) : setTimeout(function() {
t(e, s, o, a)
}, 4),
n
}
,
n.config = function(e) {
return n(e)
}
,
requirejs._defined = s,
define = function(e, t, n) {
t.splice || (n = t,
t = []),
!h(s, e) && !h(o, e) && (o[e] = [e, t, n])
}
,
define.amd = {
jQuery: !0
}
})(),
define("../../../libs/requirejs/almond", function() {}),
function(e, t) {
typeof module == "object" && typeof module.exports == "object" ? module.exports = e.document ? t(e, !0) : function(e) {
if (!e.document)
throw new Error("jQuery requires a window with a document");
return t(e)
}
: t(e)
}(typeof window != "undefined" ? window : this, function(window, noGlobal) {
function isArrayLike(e) {
var t = !!e && "length"in e && e.length
, n = jQuery.type(e);
return n === "function" || jQuery.isWindow(e) ? !1 : n === "array" || t === 0 || typeof t == "number" && t > 0 && t - 1 in e
}
function winnow(e, t, n) {
if (jQuery.isFunction(t))
return jQuery.grep(e, function(e, r) {
return !!t.call(e, r, e) !== n
});
if (t.nodeType)
return jQuery.grep(e, function(e) {
return e === t !== n
});
if (typeof t == "string") {
if (risSimple.test(t))
return jQuery.filter(t, e, n);
t = jQuery.filter(t, e)
}
return jQuery.grep(e, function(e) {
return indexOf.call(t, e) > -1 !== n
})
}
function sibling(e, t) {
while ((e = e[t]) && e.nodeType !== 1)
;
return e
}
function createOptions(e) {
var t = {};
return jQuery.each(e.match(rnotwhite) || [], function(e, n) {
t[n] = !0
}),
t
}
function completed() {
document.removeEventListener("DOMContentLoaded", completed),
window.removeEventListener("load", completed),
jQuery.ready()
}
function Data() {
this.expando = jQuery.expando + Data.uid++
}
function dataAttr(e, t, n) {
var r;
if (n === undefined && e.nodeType === 1) {
r = "data-" + t.replace(rmultiDash, "-$&").toLowerCase(),
n = e.getAttribute(r);
if (typeof n == "string") {
try {
n = n === "true" ? !0 : n === "false" ? !1 : n === "null" ? null : +n + "" === n ? +n : rbrace.test(n) ? jQuery.parseJSON(n) : n
} catch (i) {}
dataUser.set(e, t, n)
} else
n = undefined
}
return n
}
function adjustCSS(e, t, n, r) {
var i, s = 1, o = 20, u = r ? function() {
return r.cur()
}
: function() {
return jQuery.css(e, t, "")
}
, a = u(), f = n && n[3] || (jQuery.cssNumber[t] ? "" : "px"), l = (jQuery.cssNumber[t] || f !== "px" && +a) && rcssNum.exec(jQuery.css(e, t));
if (l && l[3] !== f) {
f = f || l[3],
n = n || [],
l = +a || 1;
do
s = s || ".5",
l /= s,
jQuery.style(e, t, l + f);
while (s !== (s = u() / a) && s !== 1 && --o)
}
return n && (l = +l || +a || 0,
i = n[1] ? l + (n[1] + 1) * n[2] : +n[2],
r && (r.unit = f,
r.start = l,
r.end = i)),
i
}
function getAll(e, t) {
var n = typeof e.getElementsByTagName != "undefined" ? e.getElementsByTagName(t || "*") : typeof e.querySelectorAll != "undefined" ? e.querySelectorAll(t || "*") : [];
return t === undefined || t && jQuery.nodeName(e, t) ? jQuery.merge([e], n) : n
}
function setGlobalEval(e, t) {
var n = 0
, r = e.length;
for (; n < r; n++)
dataPriv.set(e[n], "globalEval", !t || dataPriv.get(t[n], "globalEval"))
}
function buildFragment(e, t, n, r, i) {
var s, o, u, a, f, l, c = t.createDocumentFragment(), h = [], p = 0, d = e.length;
for (; p < d; p++) {
s = e[p];
if (s || s === 0)
if (jQuery.type(s) === "object")
jQuery.merge(h, s.nodeType ? [s] : s);
else if (!rhtml.test(s))
h.push(t.createTextNode(s));
else {
o = o || c.appendChild(t.createElement("div")),
u = (rtagName.exec(s) || ["", ""])[1].toLowerCase(),
a = wrapMap[u] || wrapMap._default,
o.innerHTML = a[1] + jQuery.htmlPrefilter(s) + a[2],
l = a[0];
while (l--)
o = o.lastChild;
jQuery.merge(h, o.childNodes),
o = c.firstChild,
o.textContent = ""
}
}
c.textContent = "",
p = 0;
while (s = h[p++]) {
if (r && jQuery.inArray(s, r) > -1) {
i && i.push(s);
continue
}
f = jQuery.contains(s.ownerDocument, s),
o = getAll(c.appendChild(s), "script"),
f && setGlobalEval(o);
if (n) {
l = 0;
while (s = o[l++])
rscriptType.test(s.type || "") && n.push(s)
}
}
return c
}
function returnTrue() {
return !0
}
function returnFalse() {
return !1
}
function safeActiveElement() {
try {
return document.activeElement
} catch (e) {}
}
function on(e, t, n, r, i, s) {
var o, u;
if (typeof t == "object") {
typeof n != "string" && (r = r || n,
n = undefined);
for (u in t)
on(e, u, n, r, t[u], s);
return e
}
r == null && i == null ? (i = n,
r = n = undefined) : i == null && (typeof n == "string" ? (i = r,
r = undefined) : (i = r,
r = n,
n = undefined));
if (i === !1)
i = returnFalse;
else if (!i)
return this;
return s === 1 && (o = i,
i = function(e) {
return jQuery().off(e),
o.apply(this, arguments)
}
,
i.guid = o.guid || (o.guid = jQuery.guid++)),
e.each(function() {
jQuery.event.add(this, t, i, r, n)
})
}
function manipulationTarget(e, t) {
return jQuery.nodeName(e, "table") && jQuery.nodeName(t.nodeType !== 11 ? t : t.firstChild, "tr") ? e.getElementsByTagName("tbody")[0] || e : e
}
function disableScript(e) {
return e.type = (e.getAttribute("type") !== null) + "/" + e.type,
e
}
function restoreScript(e) {
var t = rscriptTypeMasked.exec(e.type);
return t ? e.type = t[1] : e.removeAttribute("type"),
e
}
function cloneCopyEvent(e, t) {
var n, r, i, s, o, u, a, f;
if (t.nodeType !== 1)
return;
if (dataPriv.hasData(e)) {
s = dataPriv.access(e),
o = dataPriv.set(t, s),
f = s.events;
if (f) {
delete o.handle,
o.events = {};
for (i in f)
for (n = 0,
r = f[i].length; n < r; n++)
jQuery.event.add(t, i, f[i][n])
}
}
dataUser.hasData(e) && (u = dataUser.access(e),
a = jQuery.extend({}, u),
dataUser.set(t, a))
}
function fixInput(e, t) {
var n = t.nodeName.toLowerCase();
if (n === "input" && rcheckableType.test(e.type))
t.checked = e.checked;
else if (n === "input" || n === "textarea")
t.defaultValue = e.defaultValue
}
function domManip(e, t, n, r) {
t = concat.apply([], t);
var i, s, o, u, a, f, l = 0, c = e.length, h = c - 1, p = t[0], d = jQuery.isFunction(p);
if (d || c > 1 && typeof p == "string" && !support.checkClone && rchecked.test(p))
return e.each(function(i) {
var s = e.eq(i);
d && (t[0] = p.call(this, i, s.html())),
domManip(s, t, n, r)
});
if (c) {
i = buildFragment(t, e[0].ownerDocument, !1, e, r),
s = i.firstChild,
i.childNodes.length === 1 && (i = s);
if (s || r) {
o = jQuery.map(getAll(i, "script"), disableScript),
u = o.length;
for (; l < c; l++)
a = i,
l !== h && (a = jQuery.clone(a, !0, !0),
u && jQuery.merge(o, getAll(a, "script"))),
n.call(e[l], a, l);
if (u) {
f = o[o.length - 1].ownerDocument,
jQuery.map(o, restoreScript);
for (l = 0; l < u; l++)
a = o[l],
rscriptType.test(a.type || "") && !dataPriv.access(a, "globalEval") && jQuery.contains(f, a) && (a.src ? jQuery._evalUrl && jQuery._evalUrl(a.src) : jQuery.globalEval(a.textContent.replace(rcleanScript, "")))
}
}
}
return e
}
function remove(e, t, n) {
var r, i = t ? jQuery.filter(t, e) : e, s = 0;
for (; (r = i[s]) != null; s++)
!n && r.nodeType === 1 && jQuery.cleanData(getAll(r)),
r.parentNode && (n && jQuery.contains(r.ownerDocument, r) && setGlobalEval(getAll(r, "script")),
r.parentNode.removeChild(r));
return e
}
function actualDisplay(e, t) {
var n = jQuery(t.createElement(e)).appendTo(t.body)
, r = jQuery.css(n[0], "display");
return n.detach(),
r
}
function defaultDisplay(e) {
var t = document
, n = elemdisplay[e];
if (!n) {
n = actualDisplay(e, t);
if (n === "none" || !n)
iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),
t = iframe[0].contentDocument,
t.write(),
t.close(),
n = actualDisplay(e, t),
iframe.detach();
elemdisplay[e] = n
}
return n
}
function curCSS(e, t, n) {
var r, i, s, o, u = e.style;
return n = n || getStyles(e),
n && (o = n.getPropertyValue(t) || n[t],
o === "" && !jQuery.contains(e.ownerDocument, e) && (o = jQuery.style(e, t)),
!support.pixelMarginRight() && rnumnonpx.test(o) && rmargin.test(t) && (r = u.width,
i = u.minWidth,
s = u.maxWidth,
u.minWidth = u.maxWidth = u.width = o,
o = n.width,
u.width = r,
u.minWidth = i,
u.maxWidth = s)),
o !== undefined ? o + "" : o
}
function addGetHookIf(e, t) {
return {
get: function() {
if (e()) {
delete this.get;
return
}
return (this.get = t).apply(this, arguments)
}
}
}
function vendorPropName(e) {
if (e in emptyStyle)
return e;
var t = e[0].toUpperCase() + e.slice(1)
, n = cssPrefixes.length;
while (n--) {
e = cssPrefixes[n] + t;
if (e in emptyStyle)
return e
}
}
function setPositiveNumber(e, t, n) {
var r = rcssNum.exec(t);
return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t
}
function augmentWidthOrHeight(e, t, n, r, i) {
var s = n === (r ? "border" : "content") ? 4 : t === "width" ? 1 : 0
, o = 0;
for (; s < 4; s += 2)
n === "margin" && (o += jQuery.css(e, n + cssExpand[s], !0, i)),
r ? (n === "content" && (o -= jQuery.css(e, "padding" + cssExpand[s], !0, i)),
n !== "margin" && (o -= jQuery.css(e, "border" + cssExpand[s] + "Width", !0, i))) : (o += jQuery.css(e, "padding" + cssExpand[s], !0, i),
n !== "padding" && (o += jQuery.css(e, "border" + cssExpand[s] + "Width", !0, i)));
return o
}
function getWidthOrHeight(e, t, n) {
var r = !0
, i = t === "width" ? e.offsetWidth : e.offsetHeight
, s = getStyles(e)
, o = jQuery.css(e, "boxSizing", !1, s) === "border-box";
document.msFullscreenElement && window.top !== window && e.getClientRects().length && (i = Math.round(e.getBoundingClientRect()[t] * 100));
if (i <= 0 || i == null) {
i = curCSS(e, t, s);
if (i < 0 || i == null)
i = e.style[t];
if (rnumnonpx.test(i))
return i;
r = o && (support.boxSizingReliable() || i === e.style[t]),
i = parseFloat(i) || 0
}
return i + augmentWidthOrHeight(e, t, n || (o ? "border" : "content"), r, s) + "px"
}
function showHide(e, t) {
var n, r, i, s = [], o = 0, u = e.length;
for (; o < u; o++) {
r = e[o];
if (!r.style)
continue;
s[o] = dataPriv.get(r, "olddisplay"),
n = r.style.display,
t ? (!s[o] && n === "none" && (r.style.display = ""),
r.style.display === "" && isHidden(r) && (s[o] = dataPriv.access(r, "olddisplay", defaultDisplay(r.nodeName)))) : (i = isHidden(r),
(n !== "none" || !i) && dataPriv.set(r, "olddisplay", i ? n : jQuery.css(r, "display")))
}
for (o = 0; o < u; o++) {
r = e[o];
if (!r.style)
continue;
if (!t || r.style.display === "none" || r.style.display === "")
r.style.display = t ? s[o] || "" : "none"
}
return e
}
function Tween(e, t, n, r, i) {
return new Tween.prototype.init(e,t,n,r,i)
}
function createFxNow() {
return window.setTimeout(function() {
fxNow = undefined
}),
fxNow = jQuery.now()
}
function genFx(e, t) {
var n, r = 0, i = {
height: e
};
t = t ? 1 : 0;
for (; r < 4; r += 2 - t)
n = cssExpand[r],
i["margin" + n] = i["padding" + n] = e;
return t && (i.opacity = i.width = e),
i
}
function createTween(e, t, n) {
var r, i = (Animation.tweeners[t] || []).concat(Animation.tweeners["*"]), s = 0, o = i.length;
for (; s < o; s++)
if (r = i[s].call(n, t, e))
return r
}
function defaultPrefilter(e, t, n) {
var r, i, s, o, u, a, f, l, c = this, h = {}, p = e.style, d = e.nodeType && isHidden(e), v = dataPriv.get(e, "fxshow");
n.queue || (u = jQuery._queueHooks(e, "fx"),
u.unqueued == null && (u.unqueued = 0,
a = u.empty.fire,
u.empty.fire = function() {
u.unqueued || a()
}
),
u.unqueued++,
c.always(function() {
c.always(function() {
u.unqueued--,
jQuery.queue(e, "fx").length || u.empty.fire()
})
})),
e.nodeType === 1 && ("height"in t || "width"in t) && (n.overflow = [p.overflow, p.overflowX, p.overflowY],
f = jQuery.css(e, "display"),
l = f === "none" ? dataPriv.get(e, "olddisplay") || defaultDisplay(e.nodeName) : f,
l === "inline" && jQuery.css(e, "float") === "none" && (p.display = "inline-block")),
n.overflow && (p.overflow = "hidden",
c.always(function() {
p.overflow = n.overflow[0],
p.overflowX = n.overflow[1],
p.overflowY = n.overflow[2]
}));
for (r in t) {
i = t[r];
if (rfxtypes.exec(i)) {
delete t[r],
s = s || i === "toggle";
if (i === (d ? "hide" : "show")) {
if (i !== "show" || !v || v[r] === undefined)
continue;
d = !0
}
h[r] = v && v[r] || jQuery.style(e, r)
} else
f = undefined
}
if (!jQuery.isEmptyObject(h)) {
v ? "hidden"in v && (d = v.hidden) : v = dataPriv.access(e, "fxshow", {}),
s && (v.hidden = !d),
d ? jQuery(e).show() : c.done(function() {
jQuery(e).hide()
}),
c.done(function() {
var t;
dataPriv.remove(e, "fxshow");
for (t in h)
jQuery.style(e, t, h[t])
});
for (r in h)
o = createTween(d ? v[r] : 0, r, c),
r in v || (v[r] = o.start,
d && (o.end = o.start,
o.start = r === "width" || r === "height" ? 1 : 0))
} else
(f === "none" ? defaultDisplay(e.nodeName) : f) === "inline" && (p.display = f)
}
function propFilter(e, t) {
var n, r, i, s, o;
for (n in e) {
r = jQuery.camelCase(n),
i = t[r],
s = e[n],
jQuery.isArray(s) && (i = s[1],
s = e[n] = s[0]),
n !== r && (e[r] = s,
delete e[n]),
o = jQuery.cssHooks[r];
if (o && "expand"in o) {
s = o.expand(s),
delete e[r];
for (n in s)
n in e || (e[n] = s[n],
t[n] = i)
} else
t[r] = i
}
}
function Animation(e, t, n) {
var r, i, s = 0, o = Animation.prefilters.length, u = jQuery.Deferred().always(function() {
delete a.elem
}), a = function() {
if (i)
return !1;
var t = fxNow || createFxNow()
, n = Math.max(0, f.startTime + f.duration - t)
, r = n / f.duration || 0
, s = 1 - r
, o = 0
, a = f.tweens.length;
for (; o < a; o++)
f.tweens[o].run(s);
return u.notifyWith(e, [f, s, n]),
s < 1 && a ? n : (u.resolveWith(e, [f]),
!1)
}, f = u.promise({
elem: e,
props: jQuery.extend({}, t),
opts: jQuery.extend(!0, {
specialEasing: {},
easing: jQuery.easing._default
}, n),
originalProperties: t,
originalOptions: n,
startTime: fxNow || createFxNow(),
duration: n.duration,
tweens: [],
createTween: function(t, n) {
var r = jQuery.Tween(e, f.opts, t, n, f.opts.specialEasing[t] || f.opts.easing);
return f.tweens.push(r),
r
},
stop: function(t) {
var n = 0
, r = t ? f.tweens.length : 0;
if (i)
return this;
i = !0;
for (; n < r; n++)
f.tweens[n].run(1);
return t ? (u.notifyWith(e, [f, 1, 0]),
u.resolveWith(e, [f, t])) : u.rejectWith(e, [f, t]),
this
}
}), l = f.props;
propFilter(l, f.opts.specialEasing);
for (; s < o; s++) {
r = Animation.prefilters[s].call(f, e, l, f.opts);
if (r)
return jQuery.isFunction(r.stop) && (jQuery._queueHooks(f.elem, f.opts.queue).stop = jQuery.proxy(r.stop, r)),
r
}
return jQuery.map(l, createTween, f),
jQuery.isFunction(f.opts.start) && f.opts.start.call(e, f),
jQuery.fx.timer(jQuery.extend(a, {
elem: e,
anim: f,
queue: f.opts.queue
})),
f.progress(f.opts.progress).done(f.opts.done, f.opts.complete).fail(f.opts.fail).always(f.opts.always)
}
function getClass(e) {
return e.getAttribute && e.getAttribute("class") || ""
}
function addToPrefiltersOrTransports(e) {
return function(t, n) {
typeof t != "string" && (n = t,
t = "*");
var r, i = 0, s = t.toLowerCase().match(rnotwhite) || [];
if (jQuery.isFunction(n))
while (r = s[i++])
r[0] === "+" ? (r = r.slice(1) || "*",
(e[r] = e[r] || []).unshift(n)) : (e[r] = e[r] || []).push(n)
}
}
function inspectPrefiltersOrTransports(e, t, n, r) {
function o(u) {
var a;
return i[u] = !0,
jQuery.each(e[u] || [], function(e, u) {
var f = u(t, n, r);
if (typeof f == "string" && !s && !i[f])
return t.dataTypes.unshift(f),
o(f),
!1;
if (s)
return !(a = f)
}),
a
}
var i = {}
, s = e === transports;
return o(t.dataTypes[0]) || !i["*"] && o("*")
}
function ajaxExtend(e, t) {
var n, r, i = jQuery.ajaxSettings.flatOptions || {};
for (n in t)
t[n] !== undefined && ((i[n] ? e : r || (r = {}))[n] = t[n]);
return r && jQuery.extend(!0, e, r),
e
}
function ajaxHandleResponses(e, t, n) {
var r, i, s, o, u = e.contents, a = e.dataTypes;
while (a[0] === "*")
a.shift(),
r === undefined && (r = e.mimeType || t.getResponseHeader("Content-Type"));
if (r)
for (i in u)
if (u[i] && u[i].test(r)) {
a.unshift(i);
break
}
if (a[0]in n)
s = a[0];
else {
for (i in n) {
if (!a[0] || e.converters[i + " " + a[0]]) {
s = i;
break
}
o || (o = i)
}
s = s || o
}
if (s)
return s !== a[0] && a.unshift(s),
n[s]
}
function ajaxConvert(e, t, n, r) {
var i, s, o, u, a, f = {}, l = e.dataTypes.slice();
if (l[1])
for (o in e.converters)
f[o.toLowerCase()] = e.converters[o];
s = l.shift();
while (s) {
e.responseFields[s] && (n[e.responseFields[s]] = t),
!a && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)),
a = s,
s = l.shift();
if (s)
if (s === "*")
s = a;
else if (a !== "*" && a !== s) {
o = f[a + " " + s] || f["* " + s];
if (!o)
for (i in f) {
u = i.split(" ");
if (u[1] === s) {
o = f[a + " " + u[0]] || f["* " + u[0]];
if (o) {
o === !0 ? o = f[i] : f[i] !== !0 && (s = u[0],
l.unshift(u[1]));
break
}
}
}
if (o !== !0)
if (o && e.throws)
t = o(t);
else
try {
t = o(t)
} catch (c) {
return {
state: "parsererror",
error: o ? c : "No conversion from " + a + " to " + s
}
}
}
}
return {
state: "success",
data: t
}
}
function buildParams(e, t, n, r) {
var i;
if (jQuery.isArray(t))
jQuery.each(t, function(t, i) {
n || rbracket.test(e) ? r(e, i) : buildParams(e + "[" + (typeof i == "object" && i != null ? t : "") + "]", i, n, r)
});
else if (!n && jQuery.type(t) === "object")
for (i in t)
buildParams(e + "[" + i + "]", t[i], n, r);
else
r(e, t)
}
function getWindow(e) {
return jQuery.isWindow(e) ? e : e.nodeType === 9 && e.defaultView
}
var arr = []
, document = window.document
, slice = arr.slice
, concat = arr.concat
, push = arr.push
, indexOf = arr.indexOf
, class2type = {}
, toString = class2type.toString
, hasOwn = class2type.hasOwnProperty
, support = {}
, version = "2.2.0"
, jQuery = function(e, t) {
return new jQuery.fn.init(e,t)
}
, rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g
, rmsPrefix = /^-ms-/
, rdashAlpha = /-([\da-z])/gi
, fcamelCase = function(e, t) {
return t.toUpperCase()
};
jQuery.fn = jQuery.prototype = {
jquery: version,
constructor: jQuery,
selector: "",
length: 0,
toArray: function() {
return slice.call(this)
},
get: function(e) {
return e != null ? e < 0 ? this[e + this.length] : this[e] : slice.call(this)
},
pushStack: function(e) {
var t = jQuery.merge(this.constructor(), e);
return t.prevObject = this,
t.context = this.context,
t
},
each: function(e) {
return jQuery.each(this, e)
},
map: function(e) {
return this.pushStack(jQuery.map(this, function(t, n) {
return e.call(t, n, t)
}))
},
slice: function() {
return this.pushStack(slice.apply(this, arguments))
},
first: function() {
return this.eq(0)
},
last: function() {
return this.eq(-1)
},
eq: function(e) {
var t = this.length
, n = +e + (e < 0 ? t : 0);
return this.pushStack(n >= 0 && n < t ? [this[n]] : [])
},
end: function() {
return this.prevObject || this.constructor()
},
push: push,
sort: arr.sort,
splice: arr.splice
},
jQuery.extend = jQuery.fn.extend = function() {
var e, t, n, r, i, s, o = arguments[0] || {}, u = 1, a = arguments.length, f = !1;
typeof o == "boolean" && (f = o,
o = arguments[u] || {},
u++),
typeof o != "object" && !jQuery.isFunction(o) && (o = {}),
u === a && (o = this,
u--);
for (; u < a; u++)
if ((e = arguments[u]) != null)
for (t in e) {
n = o[t],
r = e[t];
if (o === r)
continue;
f && r && (jQuery.isPlainObject(r) || (i = jQuery.isArray(r))) ? (i ? (i = !1,
s = n && jQuery.isArray(n) ? n : []) : s = n && jQuery.isPlainObject(n) ? n : {},
o[t] = jQuery.extend(f, s, r)) : r !== undefined && (o[t] = r)
}
return o
}
,
jQuery.extend({
expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
isReady: !0,
error: function(e) {
throw new Error(e)
},
noop: function() {},
isFunction: function(e) {
return jQuery.type(e) === "function"
},
isArray: Array.isArray,
isWindow: function(e) {
return e != null && e === e.window
},
isNumeric: function(e) {
var t = e && e.toString();
return !jQuery.isArray(e) && t - parseFloat(t) + 1 >= 0
},
isPlainObject: function(e) {
return jQuery.type(e) !== "object" || e.nodeType || jQuery.isWindow(e) ? !1 : e.constructor && !hasOwn.call(e.constructor.prototype, "isPrototypeOf") ? !1 : !0
},
isEmptyObject: function(e) {
var t;
for (t in e)
return !1;
return !0
},
type: function(e) {
return e == null ? e + "" : typeof e == "object" || typeof e == "function" ? class2type[toString.call(e)] || "object" : typeof e
},
globalEval: function(code) {
var script, indirect = eval;
code = jQuery.trim(code),
code && (code.indexOf("use strict") === 1 ? (script = document.createElement("script"),
script.text = code,
document.head.appendChild(script).parentNode.removeChild(script)) : indirect(code))
},
camelCase: function(e) {
return e.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase)
},
nodeName: function(e, t) {
return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase()
},
each: function(e, t) {
var n, r = 0;
if (isArrayLike(e)) {
n = e.length;
for (; r < n; r++)
if (t.call(e[r], r, e[r]) === !1)
break
} else
for (r in e)
if (t.call(e[r], r, e[r]) === !1)
break;
return e
},
trim: function(e) {
return e == null ? "" : (e + "").replace(rtrim, "")
},
makeArray: function(e, t) {
var n = t || [];
return e != null && (isArrayLike(Object(e)) ? jQuery.merge(n, typeof e == "string" ? [e] : e) : push.call(n, e)),
n
},
inArray: function(e, t, n) {
return t == null ? -1 : indexOf.call(t, e, n)
},
merge: function(e, t) {
var n = +t.length
, r = 0
, i = e.length;
for (; r < n; r++)
e[i++] = t[r];
return e.length = i,
e
},
grep: function(e, t, n) {
var r, i = [], s = 0, o = e.length, u = !n;
for (; s < o; s++)
r = !t(e[s], s),
r !== u && i.push(e[s]);
return i
},
map: function(e, t, n) {
var r, i, s = 0, o = [];
if (isArrayLike(e)) {
r = e.length;
for (; s < r; s++)
i = t(e[s], s, n),
i != null && o.push(i)
} else
for (s in e)
i = t(e[s], s, n),
i != null && o.push(i);
return concat.apply([], o)
},
guid: 1,
proxy: function(e, t) {
var n, r, i;
return typeof t == "string" && (n = e[t],
t = e,
e = n),
jQuery.isFunction(e) ? (r = slice.call(arguments, 2),
i = function() {
return e.apply(t || this, r.concat(slice.call(arguments)))
}
,
i.guid = e.guid = e.guid || jQuery.guid++,
i) : undefined
},
now: Date.now,
support: support
}),
typeof Symbol == "function" && (jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]),
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(e, t) {
class2type["[object " + t + "]"] = t.toLowerCase()
});
var Sizzle = function(e) {
function st(e, t, r, i) {
var s, u, f, l, c, d, g, y, S = t && t.ownerDocument, x = t ? t.nodeType : 9;
r = r || [];
if (typeof e != "string" || !e || x !== 1 && x !== 9 && x !== 11)
return r;
if (!i) {
(t ? t.ownerDocument || t : E) !== p && h(t),
t = t || p;
if (v) {
if (x !== 11 && (d = Y.exec(e)))
if (s = d[1]) {
if (x === 9) {
if (!(f = t.getElementById(s)))
return r;
if (f.id === s)
return r.push(f),
r
} else if (S && (f = S.getElementById(s)) && b(t, f) && f.id === s)
return r.push(f),
r
} else {
if (d[2])
return D.apply(r, t.getElementsByTagName(e)),
r;
if ((s = d[3]) && n.getElementsByClassName && t.getElementsByClassName)
return D.apply(r, t.getElementsByClassName(s)),
r
}
if (n.qsa && !C[e + " "] && (!m || !m.test(e))) {
if (x !== 1)
S = t,
y = e;
else if (t.nodeName.toLowerCase() !== "object") {
(l = t.getAttribute("id")) ? l = l.replace(et, "\\$&") : t.setAttribute("id", l = w),
g = o(e),
u = g.length,
c = $.test(l) ? "#" + l : "[id='" + l + "']";
while (u--)
g[u] = c + " " + mt(g[u]);
y = g.join(","),
S = Z.test(e) && dt(t.parentNode) || t
}
if (y)
try {
return D.apply(r, S.querySelectorAll(y)),
r
} catch (T) {} finally {
l === w && t.removeAttribute("id")
}
}
}
}
return a(e.replace(U, "$1"), t, r, i)
}
function ot() {
function t(n, i) {
return e.push(n + " ") > r.cacheLength && delete t[e.shift()],
t[n + " "] = i
}
var e = [];
return t
}
function ut(e) {
return e[w] = !0,
e
}
function at(e) {
var t = p.createElement("div");
try {
return !!e(t)
} catch (n) {
return !1
} finally {
t.parentNode && t.parentNode.removeChild(t),
t = null
}
}
function ft(e, t) {
var n = e.split("|")
, i = n.length;
while (i--)
r.attrHandle[n[i]] = t
}
function lt(e, t) {
var n = t && e
, r = n && e.nodeType === 1 && t.nodeType === 1 && (~t.sourceIndex || L) - (~e.sourceIndex || L);
if (r)
return r;
if (n)
while (n = n.nextSibling)
if (n === t)
return -1;
return e ? 1 : -1
}
function ct(e) {
return function(t) {
var n = t.nodeName.toLowerCase();
return n === "input" && t.type === e
}
}
function ht(e) {
return function(t) {
var n = t.nodeName.toLowerCase();
return (n === "input" || n === "button") && t.type === e
}
}
function pt(e) {
return ut(function(t) {
return t = +t,
ut(function(n, r) {
var i, s = e([], n.length, t), o = s.length;
while (o--)
n[i = s[o]] && (n[i] = !(r[i] = n[i]))
})
})
}
function dt(e) {
return e && typeof e.getElementsByTagName != "undefined" && e
}
function vt() {}
function mt(e) {
var t = 0
, n = e.length
, r = "";
for (; t < n; t++)
r += e[t].value;
return r
}
function gt(e, t, n) {
var r = t.dir
, i = n && r === "parentNode"
, s = x++;
return t.first ? function(t, n, s) {
while (t = t[r])
if (t.nodeType === 1 || i)
return e(t, n, s)
}
: function(t, n, o) {
var u, a, f, l = [S, s];
if (o) {
while (t = t[r])
if (t.nodeType === 1 || i)
if (e(t, n, o))
return !0
} else
while (t = t[r])
if (t.nodeType === 1 || i) {
f = t[w] || (t[w] = {}),
a = f[t.uniqueID] || (f[t.uniqueID] = {});
if ((u = a[r]) && u[0] === S && u[1] === s)
return l[2] = u[2];
a[r] = l;
if (l[2] = e(t, n, o))
return !0
}
}
}
function yt(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 bt(e, t, n) {
var r = 0
, i = t.length;
for (; r < i; r++)
st(e, t[r], n);
return n
}
function wt(e, t, n, r, i) {
var s, o = [], u = 0, a = e.length, f = t != null;
for (; u < a; u++)
if (s = e[u])
if (!n || n(s, r, i))
o.push(s),
f && t.push(u);
return o
}
function Et(e, t, n, r, i, s) {
return r && !r[w] && (r = Et(r)),
i && !i[w] && (i = Et(i, s)),
ut(function(s, o, u, a) {
var f, l, c, h = [], p = [], d = o.length, v = s || bt(t || "*", u.nodeType ? [u] : u, []), m = e && (s || !t) ? wt(v, h, e, u, a) : v, g = n ? i || (s ? e : d || r) ? [] : o : m;
n && n(m, g, u, a);
if (r) {
f = wt(g, p),
r(f, [], u, a),
l = f.length;
while (l--)
if (c = f[l])
g[p[l]] = !(m[p[l]] = c)
}
if (s) {
if (i || e) {
if (i) {
f = [],
l = g.length;
while (l--)
(c = g[l]) && f.push(m[l] = c);
i(null, g = [], f, a)
}
l = g.length;
while (l--)
(c = g[l]) && (f = i ? H(s, c) : h[l]) > -1 && (s[f] = !(o[f] = c))
}
} else
g = wt(g === o ? g.splice(d, g.length) : g),
i ? i(null, o, g, a) : D.apply(o, g)
})
}
function St(e) {
var t, n, i, s = e.length, o = r.relative[e[0].type], u = o || r.relative[" "], a = o ? 1 : 0, l = gt(function(e) {
return e === t
}, u, !0), c = gt(function(e) {
return H(t, e) > -1
}, u, !0), h = [function(e, n, r) {
var i = !o && (r || n !== f) || ((t = n).nodeType ? l(e, n, r) : c(e, n, r));
return t = null,
i
}
];
for (; a < s; a++)
if (n = r.relative[e[a].type])
h = [gt(yt(h), n)];
else {
n = r.filter[e[a].type].apply(null, e[a].matches);
if (n[w]) {
i = ++a;
for (; i < s; i++)
if (r.relative[e[i].type])
break;
return Et(a > 1 && yt(h), a > 1 && mt(e.slice(0, a - 1).concat({
value: e[a - 2].type === " " ? "*" : ""
})).replace(U, "$1"), n, a < i && St(e.slice(a, i)), i < s && St(e = e.slice(i)), i < s && mt(e))
}
h.push(n)
}
return yt(h)
}
function xt(e, t) {
var n = t.length > 0
, i = e.length > 0
, s = function(s, o, u, a, l) {
var c, d, m, g = 0, y = "0", b = s && [], w = [], E = f, x = s || i && r.find.TAG("*", l), T = S += E == null ? 1 : Math.random() || .1, N = x.length;
l && (f = o === p || o || l);
for (; y !== N && (c = x[y]) != null; y++) {
if (i && c) {
d = 0,
!o && c.ownerDocument !== p && (h(c),
u = !v);
while (m = e[d++])
if (m(c, o || p, u)) {
a.push(c);
break
}
l && (S = T)
}
n && ((c = !m && c) && g--,
s && b.push(c))
}
g += y;
if (n && y !== g) {
d = 0;
while (m = t[d++])
m(b, w, o, u);
if (s) {
if (g > 0)
while (y--)
!b[y] && !w[y] && (w[y] = M.call(a));
w = wt(w)
}
D.apply(a, w),
l && !s && w.length > 0 && g + t.length > 1 && st.uniqueSort(a)
}
return l && (S = T,
f = E),
b
};
return n ? ut(s) : s
}
var t, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w = "sizzle" + 1 * new Date, E = e.document, S = 0, x = 0, T = ot(), N = ot(), C = ot(), k = function(e, t) {
return e === t && (c = !0),
0
}, L = 1 << 31, A = {}.hasOwnProperty, O = [], M = O.pop, _ = O.push, D = O.push, P = O.slice, H = function(e, t) {
var n = 0
, r = e.length;
for (; n < r; n++)
if (e[n] === t)
return n;
return -1
}, B = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", j = "[\\x20\\t\\r\\n\\f]", F = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", I = "\\[" + j + "*(" + F + ")(?:" + j + "*([*^$|!~]?=)" + j + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + F + "))|)" + j + "*\\]", q = ":(" + F + ")(?:\\((" + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + "((?:\\\\.|[^\\\\()[\\]]|" + I + ")*)|" + ".*" + ")\\)|)", R = new RegExp(j + "+","g"), U = new RegExp("^" + j + "+|((?:^|[^\\\\])(?:\\\\.)*)" + j + "+$","g"), z = new RegExp("^" + j + "*," + j + "*"), W = new RegExp("^" + j + "*([>+~]|" + j + ")" + j + "*"), X = new RegExp("=" + j + "*([^\\]'\"]*?)" + j + "*\\]","g"), V = new RegExp(q), $ = new RegExp("^" + F + "$"), J = {
ID: new RegExp("^#(" + F + ")"),
CLASS: new RegExp("^\\.(" + F + ")"),
TAG: new RegExp("^(" + F + "|[*])"),
ATTR: new RegExp("^" + I),
PSEUDO: new RegExp("^" + q),
CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + j + "*(even|odd|(([+-]|)(\\d*)n|)" + j + "*(?:([+-]|)" + j + "*(\\d+)|))" + j + "*\\)|)","i"),
bool: new RegExp("^(?:" + B + ")$","i"),
needsContext: new RegExp("^" + j + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + j + "*((?:-\\d)?\\d*)" + j + "*\\)|)(?=[^-]|$)","i")
}, K = /^(?:input|select|textarea|button)$/i, Q = /^h\d$/i, G = /^[^{]+\{\s*\[native \w/, Y = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, Z = /[+~]/, et = /'|\\/g, tt = new RegExp("\\\\([\\da-f]{1,6}" + j + "?|(" + j + ")|.)","ig"), nt = function(e, t, n) {
var r = "0x" + t - 65536;
return r !== r || n ? t : r < 0 ? String.fromCharCode(r + 65536) : String.fromCharCode(r >> 10 | 55296, r & 1023 | 56320)
}, rt = function() {
h()
};
try {
D.apply(O = P.call(E.childNodes), E.childNodes),
O[E.childNodes.length].nodeType
} catch (it) {
D = {
apply: O.length ? function(e, t) {
_.apply(e, P.call(t))
}
: function(e, t) {
var n = e.length
, r = 0;
while (e[n++] = t[r++])
;
e.length = n - 1
}
}
}
n = st.support = {},
s = st.isXML = function(e) {
var t = e && (e.ownerDocument || e).documentElement;
return t ? t.nodeName !== "HTML" : !1
}
,
h = st.setDocument = function(e) {
var t, i, o = e ? e.ownerDocument || e : E;
if (o === p || o.nodeType !== 9 || !o.documentElement)
return p;
p = o,
d = p.documentElement,
v = !s(p),
(i = p.defaultView) && i.top !== i && (i.addEventListener ? i.addEventListener("unload", rt, !1) : i.attachEvent && i.attachEvent("onunload", rt)),
n.attributes = at(function(e) {
return e.className = "i",
!e.getAttribute("className")
}),
n.getElementsByTagName = at(function(e) {
return e.appendChild(p.createComment("")),
!e.getElementsByTagName("*").length
}),
n.getElementsByClassName = G.test(p.getElementsByClassName),
n.getById = at(function(e) {
return d.appendChild(e).id = w,
!p.getElementsByName || !p.getElementsByName(w).length
}),
n.getById ? (r.find.ID = function(e, t) {
if (typeof t.getElementById != "undefined" && v) {
var n = t.getElementById(e);
return n ? [n] : []
}
}
,
r.filter.ID = function(e) {
var t = e.replace(tt, nt);
return function(e) {
return e.getAttribute("id") === t
}
}
) : (delete r.find.ID,
r.filter.ID = function(e) {
var t = e.replace(tt, nt);
return function(e) {
var n = typeof e.getAttributeNode != "undefined" && e.getAttributeNode("id");
return n && n.value === t
}
}
),
r.find.TAG = n.getElementsByTagName ? function(e, t) {
if (typeof t.getElementsByTagName != "undefined")
return t.getElementsByTagName(e);
if (n.qsa)
return t.querySelectorAll(e)
}
: function(e, t) {
var n, r = [], i = 0, s = t.getElementsByTagName(e);
if (e === "*") {
while (n = s[i++])
n.nodeType === 1 && r.push(n);
return r
}
return s
}
,
r.find.CLASS = n.getElementsByClassName && function(e, t) {
if (typeof t.getElementsByClassName != "undefined" && v)
return t.getElementsByClassName(e)
}
,
g = [],
m = [];
if (n.qsa = G.test(p.querySelectorAll))
at(function(e) {
d.appendChild(e).innerHTML = "<a id='" + w + "'></a>" + "<select id='" + w + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>",
e.querySelectorAll("[msallowcapture^='']").length && m.push("[*^$]=" + j + "*(?:''|\"\")"),
e.querySelectorAll("[selected]").length || m.push("\\[" + j + "*(?:value|" + B + ")"),
e.querySelectorAll("[id~=" + w + "-]").length || m.push("~="),
e.querySelectorAll(":checked").length || m.push(":checked"),
e.querySelectorAll("a#" + w + "+*").length || m.push(".#.+[+~]")
}),
at(function(e) {
var t = p.createElement("input");
t.setAttribute("type", "hidden"),
e.appendChild(t).setAttribute("name", "D"),
e.querySelectorAll("[name=d]").length && m.push("name" + j + "*[*^$|!~]?="),
e.querySelectorAll(":enabled").length || m.push(":enabled", ":disabled"),
e.querySelectorAll("*,:x"),
m.push(",.*:")
});
return (n.matchesSelector = G.test(y = d.matches || d.webkitMatchesSelector || d.mozMatchesSelector || d.oMatchesSelector || d.msMatchesSelector)) && at(function(e) {
n.disconnectedMatch = y.call(e, "div"),
y.call(e, "[s!='']:x"),
g.push("!=", q)
}),
m = m.length && new RegExp(m.join("|")),
g = g.length && new RegExp(g.join("|")),
t = G.test(d.compareDocumentPosition),
b = t || G.test(d.contains) ? function(e, t) {
var n = e.nodeType === 9 ? e.documentElement : e
, r = t && t.parentNode;
return e === r || !!r && r.nodeType === 1 && !!(n.contains ? n.contains(r) : e.compareDocumentPosition && e.compareDocumentPosition(r) & 16)
}
: function(e, t) {
if (t)
while (t = t.parentNode)
if (t === e)
return !0;
return !1
}
,
k = t ? function(e, t) {
if (e === t)
return c = !0,
0;
var r = !e.compareDocumentPosition - !t.compareDocumentPosition;
return r ? r : (r = (e.ownerDocument || e) === (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1,
r & 1 || !n.sortDetached && t.compareDocumentPosition(e) === r ? e === p || e.ownerDocument === E && b(E, e) ? -1 : t === p || t.ownerDocument === E && b(E, t) ? 1 : l ? H(l, e) - H(l, t) : 0 : r & 4 ? -1 : 1)
}
: function(e, t) {
if (e === t)
return c = !0,
0;
var n, r = 0, i = e.parentNode, s = t.parentNode, o = [e], u = [t];
if (!i || !s)
return e === p ? -1 : t === p ? 1 : i ? -1 : s ? 1 : l ? H(l, e) - H(l, t) : 0;
if (i === s)
return lt(e, t);
n = e;
while (n = n.parentNode)
o.unshift(n);
n = t;
while (n = n.parentNode)
u.unshift(n);
while (o[r] === u[r])
r++;
return r ? lt(o[r], u[r]) : o[r] === E ? -1 : u[r] === E ? 1 : 0
}
,
p
}
,
st.matches = function(e, t) {
return st(e, null, null, t)
}
,
st.matchesSelector = function(e, t) {
(e.ownerDocument || e) !== p && h(e),
t = t.replace(X, "='$1']");
if (n.matchesSelector && v && !C[t + " "] && (!g || !g.test(t)) && (!m || !m.test(t)))
try {
var r = y.call(e, t);
if (r || n.disconnectedMatch || e.document && e.document.nodeType !== 11)
return r
} catch (i) {}
return st(t, p, null, [e]).length > 0
}
,
st.contains = function(e, t) {
return (e.ownerDocument || e) !== p && h(e),
b(e, t)
}
,
st.attr = function(e, t) {
(e.ownerDocument || e) !== p && h(e);
var i = r.attrHandle[t.toLowerCase()]
, s = i && A.call(r.attrHandle, t.toLowerCase()) ? i(e, t, !v) : undefined;
return s !== undefined ? s : n.attributes || !v ? e.getAttribute(t) : (s = e.getAttributeNode(t)) && s.specified ? s.value : null
}
,
st.error = function(e) {
throw new Error("Syntax error, unrecognized expression: " + e)
}
,
st.uniqueSort = function(e) {
var t, r = [], i = 0, s = 0;
c = !n.detectDuplicates,
l = !n.sortStable && e.slice(0),
e.sort(k);
if (c) {
while (t = e[s++])
t === e[s] && (i = r.push(s));
while (i--)
e.splice(r[i], 1)
}
return l = null,
e
}
,
i = st.getText = function(e) {
var t, n = "", r = 0, s = e.nodeType;
if (!s)
while (t = e[r++])
n += i(t);
else if (s === 1 || s === 9 || s === 11) {
if (typeof e.textContent == "string")
return e.textContent;
for (e = e.firstChild; e; e = e.nextSibling)
n += i(e)
} else if (s === 3 || s === 4)
return e.nodeValue;
return n
}
,
r = st.selectors = {
cacheLength: 50,
createPseudo: ut,
match: J,
attrHandle: {},
find: {},
relative: {
">": {
dir: "parentNode",
first: !0
},
" ": {
dir: "parentNode"
},
"+": {
dir: "previousSibling",
first: !0
},
"~": {
dir: "previousSibling"
}
},
preFilter: {
ATTR: function(e) {
return e[1] = e[1].replace(tt, nt),
e[3] = (e[3] || e[4] || e[5] || "").replace(tt, nt),
e[2] === "~=" && (e[3] = " " + e[3] + " "),
e.slice(0, 4)
},
CHILD: function(e) {
return e[1] = e[1].toLowerCase(),
e[1].slice(0, 3) === "nth" ? (e[3] || st.error(e[0]),
e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * (e[3] === "even" || e[3] === "odd")),
e[5] = +(e[7] + e[8] || e[3] === "odd")) : e[3] && st.error(e[0]),
e
},
PSEUDO: function(e) {
var t, n = !e[6] && e[2];
return J.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && V.test(n) && (t = o(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t),
e[2] = n.slice(0, t)),
e.slice(0, 3))
}
},
filter: {
TAG: function(e) {
var t = e.replace(tt, nt).toLowerCase();
return e === "*" ? function() {
return !0
}
: function(e) {
return e.nodeName && e.nodeName.toLowerCase() === t
}
},
CLASS: function(e) {
var t = T[e + " "];
return t || (t = new RegExp("(^|" + j + ")" + e + "(" + j + "|$)")) && T(e, function(e) {
return t.test(typeof e.className == "string" && e.className || typeof e.getAttribute != "undefined" && e.getAttribute("class") || "")
})
},
ATTR: function(e, t, n) {
return function(r) {
var i = st.attr(r, e);
return i == null ? t === "!=" : t ? (i += "",
t === "=" ? i === n : t === "!=" ? i !== n : t === "^=" ? n && i.indexOf(n) === 0 : t === "*=" ? n && i.indexOf(n) > -1 : t === "$=" ? n && i.slice(-n.length) === n : t === "~=" ? (" " + i.replace(R, " ") + " ").indexOf(n) > -1 : t === "|=" ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0
}
},
CHILD: function(e, t, n, r, i) {
var s = e.slice(0, 3) !== "nth"
, o = e.slice(-4) !== "last"
, u = t === "of-type";
return r === 1 && i === 0 ? function(e) {
return !!e.parentNode
}
: function(t, n, a) {
var f, l, c, h, p, d, v = s !== o ? "nextSibling" : "previousSibling", m = t.parentNode, g = u && t.nodeName.toLowerCase(), y = !a && !u, b = !1;
if (m) {
if (s) {
while (v) {
h = t;
while (h = h[v])
if (u ? h.nodeName.toLowerCase() === g : h.nodeType === 1)
return !1;
d = v = e === "only" && !d && "nextSibling"
}
return !0
}
d = [o ? m.firstChild : m.lastChild];
if (o && y) {
h = m,
c = h[w] || (h[w] = {}),
l = c[h.uniqueID] || (c[h.uniqueID] = {}),
f = l[e] || [],
p = f[0] === S && f[1],
b = p && f[2],
h = p && m.childNodes[p];
while (h = ++p && h && h[v] || (b = p = 0) || d.pop())
if (h.nodeType === 1 && ++b && h === t) {
l[e] = [S, p, b];
break
}
} else {
y && (h = t,
c = h[w] || (h[w] = {}),
l = c[h.uniqueID] || (c[h.uniqueID] = {}),
f = l[e] || [],
p = f[0] === S && f[1],
b = p);
if (b === !1)
while (h = ++p && h && h[v] || (b = p = 0) || d.pop())
if ((u ? h.nodeName.toLowerCase() === g : h.nodeType === 1) && ++b) {
y && (c = h[w] || (h[w] = {}),
l = c[h.uniqueID] || (c[h.uniqueID] = {}),
l[e] = [S, b]);
if (h === t)
break
}
}
return b -= i,
b === r || b % r === 0 && b / r >= 0
}
}
},
PSEUDO: function(e, t) {
var n, i = r.pseudos[e] || r.setFilters[e.toLowerCase()] || st.error("unsupported pseudo: " + e);
return i[w] ? i(t) : i.length > 1 ? (n = [e, e, "", t],
r.setFilters.hasOwnProperty(e.toLowerCase()) ? ut(function(e, n) {
var r, s = i(e, t), o = s.length;
while (o--)
r = H(e, s[o]),
e[r] = !(n[r] = s[o])
}) : function(e) {
return i(e, 0, n)
}
) : i
}
},
pseudos: {
not: ut(function(e) {
var t = []
, n = []
, r = u(e.replace(U, "$1"));
return r[w] ? ut(function(e, t, n, i) {
var s, o = r(e, null, i, []), u = e.length;
while (u--)
if (s = o[u])
e[u] = !(t[u] = s)
}) : function(e, i, s) {
return t[0] = e,
r(t, null, s, n),
t[0] = null,
!n.pop()
}
}),
has: ut(function(e) {
return function(t) {
return st(e, t).length > 0
}
}),
contains: ut(function(e) {
return e = e.replace(tt, nt),
function(t) {
return (t.textContent || t.innerText || i(t)).indexOf(e) > -1
}
}),
lang: ut(function(e) {
return $.test(e || "") || st.error("unsupported lang: " + e),
e = e.replace(tt, nt).toLowerCase(),
function(t) {
var n;
do
if (n = v ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang"))
return n = n.toLowerCase(),
n === e || n.indexOf(e + "-") === 0;
while ((t = t.parentNode) && t.nodeType === 1);return !1
}
}),
target: function(t) {
var n = e.location && e.location.hash;
return n && n.slice(1) === t.id
},
root: function(e) {
return e === d
},
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 t === "input" && !!e.checked || t === "option" && !!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.nodeType < 6)
return !1;
return !0
},
parent: function(e) {
return !r.pseudos.empty(e)
},
header: function(e) {
return Q.test(e.nodeName)
},
input: function(e) {
return K.test(e.nodeName)
},
button: function(e) {
var t = e.nodeName.toLowerCase();
return t === "input" && e.type === "button" || t === "button"
},
text: function(e) {
var t;
return e.nodeName.toLowerCase() === "input" && e.type === "text" && ((t = e.getAttribute("type")) == null || t.toLowerCase() === "text")
},
first: pt(function() {
return [0]
}),
last: pt(function(e, t) {
return [t - 1]
}),
eq: pt(function(e, t, n) {
return [n < 0 ? n + t : n]
}),
even: pt(function(e, t) {
var n = 0;
for (; n < t; n += 2)
e.push(n);
return e
}),
odd: pt(function(e, t) {
var n = 1;
for (; n < t; n += 2)
e.push(n);
return e
}),
lt: pt(function(e, t, n) {
var r = n < 0 ? n + t : n;
for (; --r >= 0; )
e.push(r);
return e
}),
gt: pt(function(e, t, n) {
var r = n < 0 ? n + t : n;
for (; ++r < t; )
e.push(r);
return e
})
}
},
r.pseudos.nth = r.pseudos.eq;
for (t in {
radio: !0,
checkbox: !0,
file: !0,
password: !0,
image: !0
})
r.pseudos[t] = ct(t);
for (t in {
submit: !0,
reset: !0
})
r.pseudos[t] = ht(t);
return vt.prototype = r.filters = r.pseudos,
r.setFilters = new vt,
o = st.tokenize = function(e, t) {
var n, i, s, o, u, a, f, l = N[e + " "];
if (l)
return t ? 0 : l.slice(0);
u = e,
a = [],
f = r.preFilter;
while (u) {
if (!n || (i = z.exec(u)))
i && (u = u.slice(i[0].length) || u),
a.push(s = []);
n = !1;
if (i = W.exec(u))
n = i.shift(),
s.push({
value: n,
type: i[0].replace(U, " ")
}),
u = u.slice(n.length);
for (o in r.filter)
(i = J[o].exec(u)) && (!f[o] || (i = f[o](i))) && (n = i.shift(),
s.push({
value: n,
type: o,
matches: i
}),
u = u.slice(n.length));
if (!n)
break
}
return t ? u.length : u ? st.error(e) : N(e, a).slice(0)
}
,
u = st.compile = function(e, t) {
var n, r = [], i = [], s = C[e + " "];
if (!s) {
t || (t = o(e)),
n = t.length;
while (n--)
s = St(t[n]),
s[w] ? r.push(s) : i.push(s);
s = C(e, xt(i, r)),
s.selector = e
}
return s
}
,
a = st.select = function(e, t, i, s) {
var a, f, l, c, h, p = typeof e == "function" && e, d = !s && o(e = p.selector || e);
i = i || [];
if (d.length === 1) {
f = d[0] = d[0].slice(0);
if (f.length > 2 && (l = f[0]).type === "ID" && n.getById && t.nodeType === 9 && v && r.relative[f[1].type]) {
t = (r.find.ID(l.matches[0].replace(tt, nt), t) || [])[0];
if (!t)
return i;
p && (t = t.parentNode),
e = e.slice(f.shift().value.length)
}
a = J.needsContext.test(e) ? 0 : f.length;
while (a--) {
l = f[a];
if (r.relative[c = l.type])
break;
if (h = r.find[c])
if (s = h(l.matches[0].replace(tt, nt), Z.test(f[0].type) && dt(t.parentNode) || t)) {
f.splice(a, 1),
e = s.length && mt(f);
if (!e)
return D.apply(i, s),
i;
break
}
}
}
return (p || u(e, d))(s, t, !v, i, !t || Z.test(e) && dt(t.parentNode) || t),
i
}
,
n.sortStable = w.split("").sort(k).join("") === w,
n.detectDuplicates = !!c,
h(),
n.sortDetached = at(function(e) {
return e.compareDocumentPosition(p.createElement("div")) & 1
}),
at(function(e) {
return e.innerHTML = "<a href='#'></a>",
e.firstChild.getAttribute("href") === "#"
}) || ft("type|href|height|width", function(e, t, n) {
if (!n)
return e.getAttribute(t, t.toLowerCase() === "type" ? 1 : 2)
}),
(!n.attributes || !at(function(e) {
return e.innerHTML = "<input/>",
e.firstChild.setAttribute("value", ""),
e.firstChild.getAttribute("value") === ""
})) && ft("value", function(e, t, n) {
if (!n && e.nodeName.toLowerCase() === "input")
return e.defaultValue
}),
at(function(e) {
return e.getAttribute("disabled") == null
}) || ft(B, function(e, t, n) {
var r;
if (!n)
return e[t] === !0 ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null
}),
st
}(window);
jQuery.find = Sizzle,
jQuery.expr = Sizzle.selectors,
jQuery.expr[":"] = jQuery.expr.pseudos,
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort,
jQuery.text = Sizzle.getText,
jQuery.isXMLDoc = Sizzle.isXML,
jQuery.contains = Sizzle.contains;
var dir = function(e, t, n) {
var r = []
, i = n !== undefined;
while ((e = e[t]) && e.nodeType !== 9)
if (e.nodeType === 1) {
if (i && jQuery(e).is(n))
break;
r.push(e)
}
return r
}
, siblings = function(e, t) {
var n = [];
for (; e; e = e.nextSibling)
e.nodeType === 1 && e !== t && n.push(e);
return n
}
, rneedsContext = jQuery.expr.match.needsContext
, rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/
, risSimple = /^.[^:#\[\.,]*$/;
jQuery.filter = function(e, t, n) {
var r = t[0];
return n && (e = ":not(" + e + ")"),
t.length === 1 && r.nodeType === 1 ? jQuery.find.matchesSelector(r, e) ? [r] : [] : jQuery.find.matches(e, jQuery.grep(t, function(e) {
return e.nodeType === 1
}))
}
,
jQuery.fn.extend({
find: function(e) {
var t, n = this.length, r = [], i = this;
if (typeof e != "string")
return this.pushStack(jQuery(e).filter(function() {
for (t = 0; t < n; t++)
if (jQuery.contains(i[t], this))
return !0
}));
for (t = 0; t < n; t++)
jQuery.find(e, i[t], r);
return r = this.pushStack(n > 1 ? jQuery.unique(r) : r),
r.selector = this.selector ? this.selector + " " + e : e,
r
},
filter: function(e) {
return this.pushStack(winnow(this, e || [], !1))
},
not: function(e) {
return this.pushStack(winnow(this, e || [], !0))
},
is: function(e) {
return !!winnow(this, typeof e == "string" && rneedsContext.test(e) ? jQuery(e) : e || [], !1).length
}
});
var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, init = jQuery.fn.init = function(e, t, n) {
var r, i;
if (!e)
return this;
n = n || rootjQuery;
if (typeof e == "string") {
e[0] === "<" && e[e.length - 1] === ">" && e.length >= 3 ? r = [null, e, null] : r = rquickExpr.exec(e);
if (r && (r[1] || !t)) {
if (r[1]) {
t = t instanceof jQuery ? t[0] : t,
jQuery.merge(this, jQuery.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : document, !0));
if (rsingleTag.test(r[1]) && jQuery.isPlainObject(t))
for (r in t)
jQuery.isFunction(this[r]) ? this[r](t[r]) : this.attr(r, t[r]);
return this
}
return i = document.getElementById(r[2]),
i && i.parentNode && (this.length = 1,
this[0] = i),
this.context = document,
this.selector = e,
this
}
return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e)
}
return e.nodeType ? (this.context = this[0] = e,
this.length = 1,
this) : jQuery.isFunction(e) ? n.ready !== undefined ? n.ready(e) : e(jQuery) : (e.selector !== undefined && (this.selector = e.selector,
this.context = e.context),
jQuery.makeArray(e, this))
}
;
init.prototype = jQuery.fn,
rootjQuery = jQuery(document);
var rparentsprev = /^(?:parents|prev(?:Until|All))/
, guaranteedUnique = {
children: !0,
contents: !0,
next: !0,
prev: !0
};
jQuery.fn.extend({
has: function(e) {
var t = jQuery(e, this)
, n = t.length;
return this.filter(function() {
var e = 0;
for (; e < n; e++)
if (jQuery.contains(this, t[e]))
return !0
})
},
closest: function(e, t) {
var n, r = 0, i = this.length, s = [], o = rneedsContext.test(e) || typeof e != "string" ? jQuery(e, t || this.context) : 0;
for (; r < i; r++)
for (n = this[r]; n && n !== t; n = n.parentNode)
if (n.nodeType < 11 && (o ? o.index(n) > -1 : n.nodeType === 1 && jQuery.find.matchesSelector(n, e))) {
s.push(n);
break
}
return this.pushStack(s.length > 1 ? jQuery.uniqueSort(s) : s)
},
index: function(e) {
return e ? typeof e == "string" ? indexOf.call(jQuery(e), this[0]) : indexOf.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
},
add: function(e, t) {
return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(e, t))))
},
addBack: function(e) {
return this.add(e == null ? this.prevObject : this.prevObject.filter(e))
}
}),
jQuery.each({
parent: function(e) {
var t = e.parentNode;
return t && t.nodeType !== 11 ? t : null
},
parents: function(e) {
return dir(e, "parentNode")
},
parentsUntil: function(e, t, n) {
return dir(e, "parentNode", n)
},
next: function(e) {
return sibling(e, "nextSibling")
},
prev: function(e) {
return sibling(e, "previousSibling")
},
nextAll: function(e) {
return dir(e, "nextSibling")
},
prevAll: function(e) {
return dir(e, "previousSibling")
},
nextUntil: function(e, t, n) {
return dir(e, "nextSibling", n)
},
prevUntil: function(e, t, n) {
return dir(e, "previousSibling", n)
},
siblings: function(e) {
return siblings((e.parentNode || {}).firstChild, e)
},
children: function(e) {
return siblings(e.firstChild)
},
contents: function(e) {
return e.contentDocument || jQuery.merge([], e.childNodes)
}
}, function(e, t) {
jQuery.fn[e] = function(n, r) {
var i = jQuery.map(this, t, n);
return e.slice(-5) !== "Until" && (r = n),
r && typeof r == "string" && (i = jQuery.filter(r, i)),
this.length > 1 && (guaranteedUnique[e] || jQuery.uniqueSort(i),
rparentsprev.test(e) && i.reverse()),
this.pushStack(i)
}
});
var rnotwhite = /\S+/g;
jQuery.Callbacks = function(e) {
e = typeof e == "string" ? createOptions(e) : jQuery.extend({}, e);
var t, n, r, i, s = [], o = [], u = -1, a = function() {
i = e.once,
r = t = !0;
for (; o.length; u = -1) {
n = o.shift();
while (++u < s.length)
s[u].apply(n[0], n[1]) === !1 && e.stopOnFalse && (u = s.length,
n = !1)
}
e.memory || (n = !1),
t = !1,
i && (n ? s = [] : s = "")
}, f = {
add: function() {
return s && (n && !t && (u = s.length - 1,
o.push(n)),
function r(t) {
jQuery.each(t, function(t, n) {
jQuery.isFunction(n) ? (!e.unique || !f.has(n)) && s.push(n) : n && n.length && jQuery.type(n) !== "string" && r(n)
})
}(arguments),
n && !t && a()),
this
},
remove: function() {
return jQuery.each(arguments, function(e, t) {
var n;
while ((n = jQuery.inArray(t, s, n)) > -1)
s.splice(n, 1),
n <= u && u--
}),
this
},
has: function(e) {
return e ? jQuery.inArray(e, s) > -1 : s.length > 0
},
empty: function() {
return s && (s = []),
this
},
disable: function() {
return i = o = [],
s = n = "",
this
},
disabled: function() {
return !s
},
lock: function() {
return i = o = [],
n || (s = n = ""),
this
},
locked: function() {
return !!i
},
fireWith: function(e, n) {
return i || (n = n || [],
n = [e, n.slice ? n.slice() : n],
o.push(n),
t || a()),
this
},
fire: function() {
return f.fireWith(this, arguments),
this
},
fired: function() {
return !!r
}
};
return f
}
,
jQuery.extend({
Deferred: function(e) {
var t = [["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]]
, n = "pending"
, r = {
state: function() {
return n
},
always: function() {
return i.done(arguments).fail(arguments),
this
},
then: function() {
var e = arguments;
return jQuery.Deferred(function(n) {
jQuery.each(t, function(t, s) {
var o = jQuery.isFunction(e[t]) && e[t];
i[s[1]](function() {
var e = o && o.apply(this, arguments);
e && jQuery.isFunction(e.promise) ? e.promise().progress(n.notify).done(n.resolve).fail(n.reject) : n[s[0] + "With"](this === r ? n.promise() : this, o ? [e] : arguments)
})
}),
e = null
}).promise()
},
promise: function(e) {
return e != null ? jQuery.extend(e, r) : r
}
}
, i = {};
return r.pipe = r.then,
jQuery.each(t, function(e, s) {
var o = s[2]
, u = s[3];
r[s[1]] = o.add,
u && o.add(function() {
n = u
}, t[e ^ 1][2].disable, t[2][2].lock),
i[s[0]] = function() {
return i[s[0] + "With"](this === i ? r : this, arguments),
this
}
,
i[s[0] + "With"] = o.fireWith
}),
r.promise(i),
e && e.call(i, i),
i
},
when: function(e) {
var t = 0, n = slice.call(arguments), r = n.length, i = r !== 1 || e && jQuery.isFunction(e.promise) ? r : 0, s = i === 1 ? e : jQuery.Deferred(), o = function(e, t, n) {
return function(r) {
t[e] = this,
n[e] = arguments.length > 1 ? slice.call(arguments) : r,
n === u ? s.notifyWith(t, n) : --i || s.resolveWith(t, n)
}
}, u, a, f;
if (r > 1) {
u = new Array(r),
a = new Array(r),
f = new Array(r);
for (; t < r; t++)
n[t] && jQuery.isFunction(n[t].promise) ? n[t].promise().progress(o(t, a, u)).done(o(t, f, n)).fail(s.reject) : --i
}
return i || s.resolveWith(f, n),
s.promise()
}
});
var readyList;
jQuery.fn.ready = function(e) {
return jQuery.ready.promise().done(e),
this
}
,
jQuery.extend({
isReady: !1,
readyWait: 1,
holdReady: function(e) {
e ? jQuery.readyWait++ : jQuery.ready(!0)
},
ready: function(e) {
if (e === !0 ? --jQuery.readyWait : jQuery.isReady)
return;
jQuery.isReady = !0;
if (e !== !0 && --jQuery.readyWait > 0)
return;
readyList.resolveWith(document, [jQuery]),
jQuery.fn.triggerHandler && (jQuery(document).triggerHandler("ready"),
jQuery(document).off("ready"))
}
}),
jQuery.ready.promise = function(e) {
return readyList || (readyList = jQuery.Deferred(),
document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll ? window.setTimeout(jQuery.ready) : (document.addEventListener("DOMContentLoaded", completed),
window.addEventListener("load", completed))),
readyList.promise(e)
}
,
jQuery.ready.promise();
var access = function(e, t, n, r, i, s, o) {
var u = 0
, a = e.length
, f = n == null;
if (jQuery.type(n) === "object") {
i = !0;
for (u in n)
access(e, t, u, n[u], !0, s, o)
} else if (r !== undefined) {
i = !0,
jQuery.isFunction(r) || (o = !0),
f && (o ? (t.call(e, r),
t = null) : (f = t,
t = function(e, t, n) {
return f.call(jQuery(e), n)
}
));
if (t)
for (; u < a; u++)
t(e[u], n, o ? r : r.call(e[u], u, t(e[u], n)))
}
return i ? e : f ? t.call(e) : a ? t(e[0], n) : s
}
, acceptData = function(e) {
return e.nodeType === 1 || e.nodeType === 9 || !+e.nodeType
};
Data.uid = 1,
Data.prototype = {
register: function(e, t) {
var n = t || {};
return e.nodeType ? e[this.expando] = n : Object.defineProperty(e, this.expando, {
value: n,
writable: !0,
configurable: !0
}),
e[this.expando]
},
cache: function(e) {
if (!acceptData(e))
return {};
var t = e[this.expando];
return t || (t = {},
acceptData(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, {
value: t,
configurable: !0
}))),
t
},
set: function(e, t, n) {
var r, i = this.cache(e);
if (typeof t == "string")
i[t] = n;
else
for (r in t)
i[r] = t[r];
return i
},
get: function(e, t) {
return t === undefined ? this.cache(e) : e[this.expando] && e[this.expando][t]
},
access: function(e, t, n) {
var r;
return t === undefined || t && typeof t == "string" && n === undefined ? (r = this.get(e, t),
r !== undefined ? r : this.get(e, jQuery.camelCase(t))) : (this.set(e, t, n),
n !== undefined ? n : t)
},
remove: function(e, t) {
var n, r, i, s = e[this.expando];
if (s === undefined)
return;
if (t === undefined)
this.register(e);
else {
jQuery.isArray(t) ? r = t.concat(t.map(jQuery.camelCase)) : (i = jQuery.camelCase(t),
t in s ? r = [t, i] : (r = i,
r = r in s ? [r] : r.match(rnotwhite) || [])),
n = r.length;
while (n--)
delete s[r[n]]
}
if (t === undefined || jQuery.isEmptyObject(s))
e.nodeType ? e[this.expando] = undefined : delete e[this.expando]
},
hasData: function(e) {
var t = e[this.expando];
return t !== undefined && !jQuery.isEmptyObject(t)
}
};
var dataPriv = new Data
, dataUser = new Data
, rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/
, rmultiDash = /[A-Z]/g;
jQuery.extend({
hasData: function(e) {
return dataUser.hasData(e) || dataPriv.hasData(e)
},
data: function(e, t, n) {
return dataUser.access(e, t, n)
},
removeData: function(e, t) {
dataUser.remove(e, t)
},
_data: function(e, t, n) {
return dataPriv.access(e, t, n)
},
_removeData: function(e, t) {
dataPriv.remove(e, t)
}
}),
jQuery.fn.extend({
data: function(e, t) {
var n, r, i, s = this[0], o = s && s.attributes;
if (e === undefined) {
if (this.length) {
i = dataUser.get(s);
if (s.nodeType === 1 && !dataPriv.get(s, "hasDataAttrs")) {
n = o.length;
while (n--)
o[n] && (r = o[n].name,
r.indexOf("data-") === 0 && (r = jQuery.camelCase(r.slice(5)),
dataAttr(s, r, i[r])));
dataPriv.set(s, "hasDataAttrs", !0)
}
}
return i
}
return typeof e == "object" ? this.each(function() {
dataUser.set(this, e)
}) : access(this, function(t) {
var n, r;
if (s && t === undefined) {
n = dataUser.get(s, e) || dataUser.get(s, e.replace(rmultiDash, "-$&").toLowerCase());
if (n !== undefined)
return n;
r = jQuery.camelCase(e),
n = dataUser.get(s, r);
if (n !== undefined)
return n;
n = dataAttr(s, r, undefined);
if (n !== undefined)
return n;
return
}
r = jQuery.camelCase(e),
this.each(function() {
var n = dataUser.get(this, r);
dataUser.set(this, r, t),
e.indexOf("-") > -1 && n !== undefined && dataUser.set(this, e, t)
})
}, null, t, arguments.length > 1, null, !0)
},
removeData: function(e) {
return this.each(function() {
dataUser.remove(this, e)
})
}
}),
jQuery.extend({
queue: function(e, t, n) {
var r;
if (e)
return t = (t || "fx") + "queue",
r = dataPriv.get(e, t),
n && (!r || jQuery.isArray(n) ? r = dataPriv.access(e, t, jQuery.makeArray(n)) : r.push(n)),
r || []
},
dequeue: function(e, t) {
t = t || "fx";
var n = jQuery.queue(e, t)
, r = n.length
, i = n.shift()
, s = jQuery._queueHooks(e, t)
, o = function() {
jQuery.dequeue(e, t)
};
i === "inprogress" && (i = n.shift(),
r--),
i && (t === "fx" && n.unshift("inprogress"),
delete s.stop,
i.call(e, o, s)),
!r && s && s.empty.fire()
},
_queueHooks: function(e, t) {
var n = t + "queueHooks";
return dataPriv.get(e, n) || dataPriv.access(e, n, {
empty: jQuery.Callbacks("once memory").add(function() {
dataPriv.remove(e, [t + "queue", n])
})
})
}
}),
jQuery.fn.extend({
queue: function(e, t) {
var n = 2;
return typeof e != "string" && (t = e,
e = "fx",
n--),
arguments.length < n ? jQuery.queue(this[0], e) : t === undefined ? this : this.each(function() {
var n = jQuery.queue(this, e, t);
jQuery._queueHooks(this, e),
e === "fx" && n[0] !== "inprogress" && jQuery.dequeue(this, e)
})
},
dequeue: function(e) {
return this.each(function() {
jQuery.dequeue(this, e)
})
},
clearQueue: function(e) {
return this.queue(e || "fx", [])
},
promise: function(e, t) {
var n, r = 1, i = jQuery.Deferred(), s = this, o = this.length, u = function() {
--r || i.resolveWith(s, [s])
};
typeof e != "string" && (t = e,
e = undefined),
e = e || "fx";
while (o--)
n = dataPriv.get(s[o], e + "queueHooks"),
n && n.empty && (r++,
n.empty.add(u));
return u(),
i.promise(t)
}
});
var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source
, rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$","i")
, cssExpand = ["Top", "Right", "Bottom", "Left"]
, isHidden = function(e, t) {
return e = t || e,
jQuery.css(e, "display") === "none" || !jQuery.contains(e.ownerDocument, e)
}
, rcheckableType = /^(?:checkbox|radio)$/i
, rtagName = /<([\w:-]+)/
, rscriptType = /^$|\/(?:java|ecma)script/i
, wrapMap = {
option: [1, "<select multiple='multiple'>", "</select>"],
thead: [1, "<table>", "</table>"],
col: [2, "<table><colgroup>", "</colgroup></table>"],
tr: [2, "<table><tbody>", "</tbody></table>"],
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
_default: [0, "", ""]
};
wrapMap.optgroup = wrapMap.option,
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead,
wrapMap.th = wrapMap.td;
var rhtml = /<|&#?\w+;/;
(function() {
var e = document.createDocumentFragment()
, t = e.appendChild(document.createElement("div"))
, n = document.createElement("input");
n.setAttribute("type", "radio"),
n.setAttribute("checked", "checked"),
n.setAttribute("name", "t"),
t.appendChild(n),
support.checkClone = t.cloneNode(!0).cloneNode(!0).lastChild.checked,
t.innerHTML = "<textarea>x</textarea>",
support.noCloneChecked = !!t.cloneNode(!0).lastChild.defaultValue
})();
var rkeyEvent = /^key/
, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/
, rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
jQuery.event = {
global: {},
add: function(e, t, n, r, i) {
var s, o, u, a, f, l, c, h, p, d, v, m = dataPriv.get(e);
if (!m)
return;
n.handler && (s = n,
n = s.handler,
i = s.selector),
n.guid || (n.guid = jQuery.guid++),
(a = m.events) || (a = m.events = {}),
(o = m.handle) || (o = m.handle = function(t) {
return typeof jQuery != "undefined" && jQuery.event.triggered !== t.type ? jQuery.event.dispatch.apply(e, arguments) : undefined
}
),
t = (t || "").match(rnotwhite) || [""],
f = t.length;
while (f--) {
u = rtypenamespace.exec(t[f]) || [],
p = v = u[1],
d = (u[2] || "").split(".").sort();
if (!p)
continue;
c = jQuery.event.special[p] || {},
p = (i ? c.delegateType : c.bindType) || p,
c = jQuery.event.special[p] || {},
l = jQuery.extend({
type: p,
origType: v,
data: r,
handler: n,
guid: n.guid,
selector: i,
needsContext: i && jQuery.expr.match.needsContext.test(i),
namespace: d.join(".")
}, s),
(h = a[p]) || (h = a[p] = [],
h.delegateCount = 0,
(!c.setup || c.setup.call(e, r, d, o) === !1) && e.addEventListener && e.addEventListener(p, o)),
c.add && (c.add.call(e, l),
l.handler.guid || (l.handler.guid = n.guid)),
i ? h.splice(h.delegateCount++, 0, l) : h.push(l),
jQuery.event.global[p] = !0
}
},
remove: function(e, t, n, r, i) {
var s, o, u, a, f, l, c, h, p, d, v, m = dataPriv.hasData(e) && dataPriv.get(e);
if (!m || !(a = m.events))
return;
t = (t || "").match(rnotwhite) || [""],
f = t.length;
while (f--) {
u = rtypenamespace.exec(t[f]) || [],
p = v = u[1],
d = (u[2] || "").split(".").sort();
if (!p) {
for (p in a)
jQuery.event.remove(e, p + t[f], n, r, !0);
continue
}
c = jQuery.event.special[p] || {},
p = (r ? c.delegateType : c.bindType) || p,
h = a[p] || [],
u = u[2] && new RegExp("(^|\\.)" + d.join("\\.(?:.*\\.|)") + "(\\.|$)"),
o = s = h.length;
while (s--)
l = h[s],
(i || v === l.origType) && (!n || n.guid === l.guid) && (!u || u.test(l.namespace)) && (!r || r === l.selector || r === "**" && l.selector) && (h.splice(s, 1),
l.selector && h.delegateCount--,
c.remove && c.remove.call(e, l));
o && !h.length && ((!c.teardown || c.teardown.call(e, d, m.handle) === !1) && jQuery.removeEvent(e, p, m.handle),
delete a[p])
}
jQuery.isEmptyObject(a) && dataPriv.remove(e, "handle events")
},
dispatch: function(e) {
e = jQuery.event.fix(e);
var t, n, r, i, s, o = [], u = slice.call(arguments), a = (dataPriv.get(this, "events") || {})[e.type] || [], f = jQuery.event.special[e.type] || {};
u[0] = e,
e.delegateTarget = this;
if (f.preDispatch && f.preDispatch.call(this, e) === !1)
return;
o = jQuery.event.handlers.call(this, e, a),
t = 0;
while ((i = o[t++]) && !e.isPropagationStopped()) {
e.currentTarget = i.elem,
n = 0;
while ((s = i.handlers[n++]) && !e.isImmediatePropagationStopped())
if (!e.rnamespace || e.rnamespace.test(s.namespace))
e.handleObj = s,
e.data = s.data,
r = ((jQuery.event.special[s.origType] || {}).handle || s.handler).apply(i.elem, u),
r !== undefined && (e.result = r) === !1 && (e.preventDefault(),
e.stopPropagation())
}
return f.postDispatch && f.postDispatch.call(this, e),
e.result
},
handlers: function(e, t) {
var n, r, i, s, o = [], u = t.delegateCount, a = e.target;
if (u && a.nodeType && (e.type !== "click" || isNaN(e.button) || e.button < 1))
for (; a !== this; a = a.parentNode || this)
if (a.nodeType === 1 && (a.disabled !== !0 || e.type !== "click")) {
r = [];
for (n = 0; n < u; n++)
s = t[n],
i = s.selector + " ",
r[i] === undefined && (r[i] = s.needsContext ? jQuery(i, this).index(a) > -1 : jQuery.find(i, this, null, [a]).length),
r[i] && r.push(s);
r.length && o.push({
elem: a,
handlers: r
})
}
return u < t.length && o.push({
elem: this,
handlers: t.slice(u)
}),
o
},
props: "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
fixHooks: {},
keyHooks: {
props: "char charCode key keyCode".split(" "),
filter: function(e, t) {
return e.which == null && (e.which = t.charCode != null ? t.charCode : t.keyCode),
e
}
},
mouseHooks: {
props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
filter: function(e, t) {
var n, r, i, s = t.button;
return e.pageX == null && t.clientX != null && (n = e.target.ownerDocument || document,
r = n.documentElement,
i = n.body,
e.pageX = t.clientX + (r && r.scrollLeft || i && i.scrollLeft || 0) - (r && r.clientLeft || i && i.clientLeft || 0),
e.pageY = t.clientY + (r && r.scrollTop || i && i.scrollTop || 0) - (r && r.clientTop || i && i.clientTop || 0)),
!e.which && s !== undefined && (e.which = s & 1 ? 1 : s & 2 ? 3 : s & 4 ? 2 : 0),
e
}
},
fix: function(e) {
if (e[jQuery.expando])
return e;
var t, n, r, i = e.type, s = e, o = this.fixHooks[i];
o || (this.fixHooks[i] = o = rmouseEvent.test(i) ? this.mouseHooks : rkeyEvent.test(i) ? this.keyHooks : {}),
r = o.props ? this.props.concat(o.props) : this.props,
e = new jQuery.Event(s),
t = r.length;
while (t--)
n = r[t],
e[n] = s[n];
return e.target || (e.target = document),
e.target.nodeType === 3 && (e.target = e.target.parentNode),
o.filter ? o.filter(e, s) : e
},
special: {
load: {
noBubble: !0
},
focus: {
trigger: function() {
if (this !== safeActiveElement() && this.focus)
return this.focus(),
!1
},
delegateType: "focusin"
},
blur: {
trigger: function() {
if (this === safeActiveElement() && this.blur)
return this.blur(),
!1
},
delegateType: "focusout"
},
click: {
trigger: function() {
if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input"))
return this.click(),
!1
},
_default: function(e) {
return jQuery.nodeName(e.target, "a")
}
},
beforeunload: {
postDispatch: function(e) {
e.result !== undefined && e.originalEvent && (e.originalEvent.returnValue = e.result)
}
}
}
},
jQuery.removeEvent = function(e, t, n) {
e.removeEventListener && e.removeEventListener(t, n)
}
,
jQuery.Event = function(e, t) {
if (!(this instanceof jQuery.Event))
return new jQuery.Event(e,t);
e && e.type ? (this.originalEvent = e,
this.type = e.type,
this.isDefaultPrevented = e.defaultPrevented || e.defaultPrevented === undefined && e.returnValue === !1 ? returnTrue : returnFalse) : this.type = e,
t && jQuery.extend(this, t),
this.timeStamp = e && e.timeStamp || jQuery.now(),
this[jQuery.expando] = !0
}
,
jQuery.Event.prototype = {
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue,
e && e.preventDefault()
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue,
e && e.stopPropagation()
},
stopImmediatePropagation: function() {
var e = this.originalEvent;
this.isImmediatePropagationStopped = returnTrue,
e && e.stopImmediatePropagation(),
this.stopPropagation()
}
},
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function(e, t) {
jQuery.event.special[e] = {
delegateType: t,
bindType: t,
handle: function(e) {
var n, r = this, i = e.relatedTarget, s = e.handleObj;
if (!i || i !== r && !jQuery.contains(r, i))
e.type = s.origType,
n = s.handler.apply(this, arguments),
e.type = t;
return n
}
}
}),
jQuery.fn.extend({
on: function(e, t, n, r) {
return on(this, e, t, n, r)
},
one: function(e, t, n, r) {
return on(this, e, t, n, r, 1)
},
off: function(e, t, n) {
var r, i;
if (e && e.preventDefault && e.handleObj)
return r = e.handleObj,
jQuery(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler),
this;
if (typeof e == "object") {
for (i in e)
this.off(i, t, e[i]);
return this
}
if (t === !1 || typeof t == "function")
n = t,
t = undefined;
return n === !1 && (n = returnFalse),
this.each(function() {
jQuery.event.remove(this, e, n, t)
})
}
});
var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi
, rnoInnerhtml = /<script|<style|<link/i
, rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i
, rscriptTypeMasked = /^true\/(.*)/
, rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
jQuery.extend({
htmlPrefilter: function(e) {
return e.replace(rxhtmlTag, "<$1></$2>")
},
clone: function(e, t, n) {
var r, i, s, o, u = e.cloneNode(!0), a = jQuery.contains(e.ownerDocument, e);
if (!support.noCloneChecked && (e.nodeType === 1 || e.nodeType === 11) && !jQuery.isXMLDoc(e)) {
o = getAll(u),
s = getAll(e);
for (r = 0,
i = s.length; r < i; r++)
fixInput(s[r], o[r])
}
if (t)
if (n) {
s = s || getAll(e),
o = o || getAll(u);
for (r = 0,
i = s.length; r < i; r++)
cloneCopyEvent(s[r], o[r])
} else
cloneCopyEvent(e, u);
return o = getAll(u, "script"),
o.length > 0 && setGlobalEval(o, !a && getAll(e, "script")),
u
},
cleanData: function(e) {
var t, n, r, i = jQuery.event.special, s = 0;
for (; (n = e[s]) !== undefined; s++)
if (acceptData(n)) {
if (t = n[dataPriv.expando]) {
if (t.events)
for (r in t.events)
i[r] ? jQuery.event.remove(n, r) : jQuery.removeEvent(n, r, t.handle);
n[dataPriv.expando] = undefined
}
n[dataUser.expando] && (n[dataUser.expando] = undefined)
}
}
}),
jQuery.fn.extend({
domManip: domManip,
detach: function(e) {
return remove(this, e, !0)
},
remove: function(e) {
return remove(this, e)
},
text: function(e) {
return access(this, function(e) {
return e === undefined ? jQuery.text(this) : this.empty().each(function() {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9)
this.textContent = e
})
}, null, e, arguments.length)
},
append: function() {
return domManip(this, arguments, function(e) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var t = manipulationTarget(this, e);
t.appendChild(e)
}
})
},
prepend: function() {
return domManip(this, arguments, function(e) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var t = manipulationTarget(this, e);
t.insertBefore(e, t.firstChild)
}
})
},
before: function() {
return domManip(this, arguments, function(e) {
this.parentNode && this.parentNode.insertBefore(e, this)
})
},
after: function() {
return domManip(this, arguments, function(e) {
this.parentNode && this.parentNode.insertBefore(e, this.nextSibling)
})
},
empty: function() {
var e, t = 0;
for (; (e = this[t]) != null; t++)
e.nodeType === 1 && (jQuery.cleanData(getAll(e, !1)),
e.textContent = "");
return this
},
clone: function(e, t) {
return e = e == null ? !1 : e,
t = t == null ? e : t,
this.map(function() {
return jQuery.clone(this, e, t)
})
},
html: function(e) {
return access(this, function(e) {
var t = this[0] || {}
, n = 0
, r = this.length;
if (e === undefined && t.nodeType === 1)
return t.innerHTML;
if (typeof e == "string" && !rnoInnerhtml.test(e) && !wrapMap[(rtagName.exec(e) || ["", ""])[1].toLowerCase()]) {
e = jQuery.htmlPrefilter(e);
try {
for (; n < r; n++)
t = this[n] || {},
t.nodeType === 1 && (jQuery.cleanData(getAll(t, !1)),
t.innerHTML = e);
t = 0
} catch (i) {}
}
t && this.empty().append(e)
}, null, e, arguments.length)
},
replaceWith: function() {
var e = [];
return domManip(this, arguments, function(t) {
var n = this.parentNode;
jQuery.inArray(this, e) < 0 && (jQuery.cleanData(getAll(this)),
n && n.replaceChild(t, this))
}, e)
}
}),
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(e, t) {
jQuery.fn[e] = function(e) {
var n, r = [], i = jQuery(e), s = i.length - 1, o = 0;
for (; o <= s; o++)
n = o === s ? this : this.clone(!0),
jQuery(i[o])[t](n),
push.apply(r, n.get());
return this.pushStack(r)
}
});
var iframe, elemdisplay = {
HTML: "block",
BODY: "block"
}, rmargin = /^margin/, rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$","i"), getStyles = function(e) {
var t = e.ownerDocument.defaultView;
return t.opener || (t = window),
t.getComputedStyle(e)
}, swap = function(e, t, n, r) {
var i, s, o = {};
for (s in t)
o[s] = e.style[s],
e.style[s] = t[s];
i = n.apply(e, r || []);
for (s in t)
e.style[s] = o[s];
return i
}, documentElement = document.documentElement;
(function() {
function o() {
s.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",
s.innerHTML = "",
documentElement.appendChild(i);
var o = window.getComputedStyle(s);
e = o.top !== "1%",
r = o.marginLeft === "2px",
t = o.width === "4px",
s.style.marginRight = "50%",
n = o.marginRight === "4px",
documentElement.removeChild(i)
}
var e, t, n, r, i = document.createElement("div"), s = document.createElement("div");
if (!s.style)
return;
s.style.backgroundClip = "content-box",
s.cloneNode(!0).style.backgroundClip = "",
support.clearCloneStyle = s.style.backgroundClip === "content-box",
i.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",
i.appendChild(s),
jQuery.extend(support, {
pixelPosition: function() {
return o(),
e
},
boxSizingReliable: function() {
return t == null && o(),
t
},
pixelMarginRight: function() {
return t == null && o(),
n
},
reliableMarginLeft: function() {
return t == null && o(),
r
},
reliableMarginRight: function() {
var e, t = s.appendChild(document.createElement("div"));
return t.style.cssText = s.style.cssText = "-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",
t.style.marginRight = t.style.width = "0",
s.style.width = "1px",
documentElement.appendChild(i),
e = !parseFloat(window.getComputedStyle(t).marginRight),
documentElement.removeChild(i),
s.removeChild(t),
e
}
})
})();
var rdisplayswap = /^(none|table(?!-c[ea]).+)/
, cssShow = {
position: "absolute",
visibility: "hidden",
display: "block"
}
, cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
}
, cssPrefixes = ["Webkit", "O", "Moz", "ms"]
, emptyStyle = document.createElement("div").style;
jQuery.extend({
cssHooks: {
opacity: {
get: function(e, t) {
if (t) {
var n = curCSS(e, "opacity");
return n === "" ? "1" : n
}
}
}
},
cssNumber: {
animationIterationCount: !0,
columnCount: !0,
fillOpacity: !0,
flexGrow: !0,
flexShrink: !0,
fontWeight: !0,
lineHeight: !0,
opacity: !0,
order: !0,
orphans: !0,
widows: !0,
zIndex: !0,
zoom: !0
},
cssProps: {
"float": "cssFloat"
},
style: function(e, t, n, r) {
if (!e || e.nodeType === 3 || e.nodeType === 8 || !e.style)
return;
var i, s, o, u = jQuery.camelCase(t), a = e.style;
t = jQuery.cssProps[u] || (jQuery.cssProps[u] = vendorPropName(u) || u),
o = jQuery.cssHooks[t] || jQuery.cssHooks[u];
if (n === undefined)
return o && "get"in o && (i = o.get(e, !1, r)) !== undefined ? i : a[t];
s = typeof n,
s === "string" && (i = rcssNum.exec(n)) && i[1] && (n = adjustCSS(e, t, i),
s = "number");
if (n == null || n !== n)
return;
s === "number" && (n += i && i[3] || (jQuery.cssNumber[u] ? "" : "px")),
!support.clearCloneStyle && n === "" && t.indexOf("background") === 0 && (a[t] = "inherit");
if (!o || !("set"in o) || (n = o.set(e, n, r)) !== undefined)
a[t] = n
},
css: function(e, t, n, r) {
var i, s, o, u = jQuery.camelCase(t);
return t = jQuery.cssProps[u] || (jQuery.cssProps[u] = vendorPropName(u) || u),
o = jQuery.cssHooks[t] || jQuery.cssHooks[u],
o && "get"in o && (i = o.get(e, !0, n)),
i === undefined && (i = curCSS(e, t, r)),
i === "normal" && t in cssNormalTransform && (i = cssNormalTransform[t]),
n === "" || n ? (s = parseFloat(i),
n === !0 || isFinite(s) ? s || 0 : i) : i
}
}),
jQuery.each(["height", "width"], function(e, t) {
jQuery.cssHooks[t] = {
get: function(e, n, r) {
if (n)
return rdisplayswap.test(jQuery.css(e, "display")) && e.offsetWidth === 0 ? swap(e, cssShow, function() {
return getWidthOrHeight(e, t, r)
}) : getWidthOrHeight(e, t, r)
},
set: function(e, n, r) {
var i, s = r && getStyles(e), o = r && augmentWidthOrHeight(e, t, r, jQuery.css(e, "boxSizing", !1, s) === "border-box", s);
return o && (i = rcssNum.exec(n)) && (i[3] || "px") !== "px" && (e.style[t] = n,
n = jQuery.css(e, t)),
setPositiveNumber(e, n, o)
}
}
}),
jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function(e, t) {
if (t)
return (parseFloat(curCSS(e, "marginLeft")) || e.getBoundingClientRect().left - swap(e, {
marginLeft: 0
}, function() {
return e.getBoundingClientRect().left
})) + "px"
}),
jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function(e, t) {
if (t)
return swap(e, {
display: "inline-block"
}, curCSS, [e, "marginRight"])
}),
jQuery.each({
margin: "",
padding: "",
border: "Width"
}, function(e, t) {
jQuery.cssHooks[e + t] = {
expand: function(n) {
var r = 0
, i = {}
, s = typeof n == "string" ? n.split(" ") : [n];
for (; r < 4; r++)
i[e + cssExpand[r] + t] = s[r] || s[r - 2] || s[0];
return i
}
},
rmargin.test(e) || (jQuery.cssHooks[e + t].set = setPositiveNumber)
}),
jQuery.fn.extend({
css: function(e, t) {
return access(this, function(e, t, n) {
var r, i, s = {}, o = 0;
if (jQuery.isArray(t)) {
r = getStyles(e),
i = t.length;
for (; o < i; o++)
s[t[o]] = jQuery.css(e, t[o], !1, r);
return s
}
return n !== undefined ? jQuery.style(e, t, n) : jQuery.css(e, t)
}, e, t, arguments.length > 1)
},
show: function() {
return showHide(this, !0)
},
hide: function() {
return showHide(this)
},
toggle: function(e) {
return typeof e == "boolean" ? e ? this.show() : this.hide() : this.each(function() {
isHidden(this) ? jQuery(this).show() : jQuery(this).hide()
})
}
}),
jQuery.Tween = Tween,
Tween.prototype = {
constructor: Tween,
init: function(e, t, n, r, i, s) {
this.elem = e,
this.prop = n,
this.easing = i || jQuery.easing._default,
this.options = t,
this.start = this.now = this.cur(),
this.end = r,
this.unit = s || (jQuery.cssNumber[n] ? "" : "px")
},
cur: function() {
var e = Tween.propHooks[this.prop];
return e && e.get ? e.get(this) : Tween.propHooks._default.get(this)
},
run: function(e) {
var t, n = Tween.propHooks[this.prop];
return this.options.duration ? this.pos = t = jQuery.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e,
this.now = (this.end - this.start) * t + this.start,
this.options.step && this.options.step.call(this.elem, this.now, this),
n && n.set ? n.set(this) : Tween.propHooks._default.set(this),
this
}
},
Tween.prototype.init.prototype = Tween.prototype,
Tween.propHooks = {
_default: {
get: function(e) {
var t;
return e.elem.nodeType !== 1 || e.elem[e.prop] != null && e.elem.style[e.prop] == null ? e.elem[e.prop] : (t = jQuery.css(e.elem, e.prop, ""),
!t || t === "auto" ? 0 : t)
},
set: function(e) {
jQuery.fx.step[e.prop] ? jQuery.fx.step[e.prop](e) : e.elem.nodeType !== 1 || e.elem.style[jQuery.cssProps[e.prop]] == null && !jQuery.cssHooks[e.prop] ? e.elem[e.prop] = e.now : jQuery.style(e.elem, e.prop, e.now + e.unit)
}
}
},
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function(e) {
e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now)
}
},
jQuery.easing = {
linear: function(e) {
return e
},
swing: function(e) {
return .5 - Math.cos(e * Math.PI) / 2
},
_default: "swing"
},
jQuery.fx = Tween.prototype.init,
jQuery.fx.step = {};
var fxNow, timerId, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/;
jQuery.Animation = jQuery.extend(Animation, {
tweeners: {
"*": [function(e, t) {
var n = this.createTween(e, t);
return adjustCSS(n.elem, e, rcssNum.exec(t), n),
n
}
]
},
tweener: function(e, t) {
jQuery.isFunction(e) ? (t = e,
e = ["*"]) : e = e.match(rnotwhite);
var n, r = 0, i = e.length;
for (; r < i; r++)
n = e[r],
Animation.tweeners[n] = Animation.tweeners[n] || [],
Animation.tweeners[n].unshift(t)
},
prefilters: [defaultPrefilter],
prefilter: function(e, t) {
t ? Animation.prefilters.unshift(e) : Animation.prefilters.push(e)
}
}),
jQuery.speed = function(e, t, n) {
var r = e && typeof e == "object" ? jQuery.extend({}, e) : {
complete: n || !n && t || jQuery.isFunction(e) && e,
duration: e,
easing: n && t || t && !jQuery.isFunction(t) && t
};
r.duration = jQuery.fx.off ? 0 : typeof r.duration == "number" ? r.duration : r.duration in jQuery.fx.speeds ? jQuery.fx.speeds[r.duration] : jQuery.fx.speeds._default;
if (r.queue == null || r.queue === !0)
r.queue = "fx";
return r.old = r.complete,
r.complete = function() {
jQuery.isFunction(r.old) && r.old.call(this),
r.queue && jQuery.dequeue(this, r.queue)
}
,
r
}
,
jQuery.fn.extend({
fadeTo: function(e, t, n, r) {
return this.filter(isHidden).css("opacity", 0).show().end().animate({
opacity: t
}, e, n, r)
},
animate: function(e, t, n, r) {
var i = jQuery.isEmptyObject(e)
, s = jQuery.speed(t, n, r)
, o = function() {
var t = Animation(this, jQuery.extend({}, e), s);
(i || dataPriv.get(this, "finish")) && t.stop(!0)
};
return o.finish = o,
i || s.queue === !1 ? this.each(o) : this.queue(s.queue, o)
},
stop: function(e, t, n) {
var r = function(e) {
var t = e.stop;
delete e.stop,
t(n)
};
return typeof e != "string" && (n = t,
t = e,
e = undefined),
t && e !== !1 && this.queue(e || "fx", []),
this.each(function() {
var t = !0
, i = e != null && e + "queueHooks"
, s = jQuery.timers
, o = dataPriv.get(this);
if (i)
o[i] && o[i].stop && r(o[i]);
else
for (i in o)
o[i] && o[i].stop && rrun.test(i) && r(o[i]);
for (i = s.length; i--; )
s[i].elem === this && (e == null || s[i].queue === e) && (s[i].anim.stop(n),
t = !1,
s.splice(i, 1));
(t || !n) && jQuery.dequeue(this, e)
})
},
finish: function(e) {
return e !== !1 && (e = e || "fx"),
this.each(function() {
var t, n = dataPriv.get(this), r = n[e + "queue"], i = n[e + "queueHooks"], s = jQuery.timers, o = r ? r.length : 0;
n.finish = !0,
jQuery.queue(this, e, []),
i && i.stop && i.stop.call(this, !0);
for (t = s.length; t--; )
s[t].elem === this && s[t].queue === e && (s[t].anim.stop(!0),
s.splice(t, 1));
for (t = 0; t < o; t++)
r[t] && r[t].finish && r[t].finish.call(this);
delete n.finish
})
}
}),
jQuery.each(["toggle", "show", "hide"], function(e, t) {
var n = jQuery.fn[t];
jQuery.fn[t] = function(e, r, i) {
return e == null || typeof e == "boolean" ? n.apply(this, arguments) : this.animate(genFx(t, !0), e, r, i)
}
}),
jQuery.each({
slideDown: genFx("show"),
slideUp: genFx("hide"),
slideToggle: genFx("toggle"),
fadeIn: {
opacity: "show"
},
fadeOut: {
opacity: "hide"
},
fadeToggle: {
opacity: "toggle"
}
}, function(e, t) {
jQuery.fn[e] = function(e, n, r) {
return this.animate(t, e, n, r)
}
}),
jQuery.timers = [],
jQuery.fx.tick = function() {
var e, t = 0, n = jQuery.timers;
fxNow = jQuery.now();
for (; t < n.length; t++)
e = n[t],
!e() && n[t] === e && n.splice(t--, 1);
n.length || jQuery.fx.stop(),
fxNow = undefined
}
,
jQuery.fx.timer = function(e) {
jQuery.timers.push(e),
e() ? jQuery.fx.start() : jQuery.timers.pop()
}
,
jQuery.fx.interval = 13,
jQuery.fx.start = function() {
timerId || (timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval))
}
,
jQuery.fx.stop = function() {
window.clearInterval(timerId),
timerId = null
}
,
jQuery.fx.speeds = {
slow: 600,
fast: 200,
_default: 400
},
jQuery.fn.delay = function(e, t) {
return e = jQuery.fx ? jQuery.fx.speeds[e] || e : e,
t = t || "fx",
this.queue(t, function(t, n) {
var r = window.setTimeout(t, e);
n.stop = function() {
window.clearTimeout(r)
}
})
}
,
function() {
var e = document.createElement("input")
, t = document.createElement("select")
, n = t.appendChild(document.createElement("option"));
e.type = "checkbox",
support.checkOn = e.value !== "",
support.optSelected = n.selected,
t.disabled = !0,
support.optDisabled = !n.disabled,
e = document.createElement("input"),
e.value = "t",
e.type = "radio",
support.radioValue = e.value === "t"
}();
var boolHook, attrHandle = jQuery.expr.attrHandle;
jQuery.fn.extend({
attr: function(e, t) {
return access(this, jQuery.attr, e, t, arguments.length > 1)
},
removeAttr: function(e) {
return this.each(function() {
jQuery.removeAttr(this, e)
})
}
}),
jQuery.extend({
attr: function(e, t, n) {
var r, i, s = e.nodeType;
if (s === 3 || s === 8 || s === 2)
return;
if (typeof e.getAttribute == "undefined")
return jQuery.prop(e, t, n);
if (s !== 1 || !jQuery.isXMLDoc(e))
t = t.toLowerCase(),
i = jQuery.attrHooks[t] || (jQuery.expr.match.bool.test(t) ? boolHook : undefined);
if (n !== undefined) {
if (n === null) {
jQuery.removeAttr(e, t);
return
}
return i && "set"in i && (r = i.set(e, n, t)) !== undefined ? r : (e.setAttribute(t, n + ""),
n)
}
return i && "get"in i && (r = i.get(e, t)) !== null ? r : (r = jQuery.find.attr(e, t),
r == null ? undefined : r)
},
attrHooks: {
type: {
set: function(e, t) {
if (!support.radioValue && t === "radio" && jQuery.nodeName(e, "input")) {
var n = e.value;
return e.setAttribute("type", t),
n && (e.value = n),
t
}
}
}
},
removeAttr: function(e, t) {
var n, r, i = 0, s = t && t.match(rnotwhite);
if (s && e.nodeType === 1)
while (n = s[i++])
r = jQuery.propFix[n] || n,
jQuery.expr.match.bool.test(n) && (e[r] = !1),
e.removeAttribute(n)
}
}),
boolHook = {
set: function(e, t, n) {
return t === !1 ? jQuery.removeAttr(e, n) : e.setAttribute(n, n),
n
}
},
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(e, t) {
var n = attrHandle[t] || jQuery.find.attr;
attrHandle[t] = function(e, t, r) {
var i, s;
return r || (s = attrHandle[t],
attrHandle[t] = i,
i = n(e, t, r) != null ? t.toLowerCase() : null,
attrHandle[t] = s),
i
}
});
var rfocusable = /^(?:input|select|textarea|button)$/i
, rclickable = /^(?:a|area)$/i;
jQuery.fn.extend({
prop: function(e, t) {
return access(this, jQuery.prop, e, t, arguments.length > 1)
},
removeProp: function(e) {
return this.each(function() {
delete this[jQuery.propFix[e] || e]
})
}
}),
jQuery.extend({
prop: function(e, t, n) {
var r, i, s = e.nodeType;
if (s === 3 || s === 8 || s === 2)
return;
if (s !== 1 || !jQuery.isXMLDoc(e))
t = jQuery.propFix[t] || t,
i = jQuery.propHooks[t];
return n !== undefined ? i && "set"in i && (r = i.set(e, n, t)) !== undefined ? r : e[t] = n : i && "get"in i && (r = i.get(e, t)) !== null ? r : e[t]
},
propHooks: {
tabIndex: {
get: function(e) {
var t = jQuery.find.attr(e, "tabindex");
return t ? parseInt(t, 10) : rfocusable.test(e.nodeName) || rclickable.test(e.nodeName) && e.href ? 0 : -1
}
}
},
propFix: {
"for": "htmlFor",
"class": "className"
}
}),
support.optSelected || (jQuery.propHooks.selected = {
get: function(e) {
var t = e.parentNode;
return t && t.parentNode && t.parentNode.selectedIndex,
null
}
}),
jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() {
jQuery.propFix[this.toLowerCase()] = this
});
var rclass = /[\t\r\n\f]/g;
jQuery.fn.extend({
addClass: function(e) {
var t, n, r, i, s, o, u, a = 0;
if (jQuery.isFunction(e))
return this.each(function(t) {
jQuery(this).addClass(e.call(this, t, getClass(this)))
});
if (typeof e == "string" && e) {
t = e.match(rnotwhite) || [];
while (n = this[a++]) {
i = getClass(n),
r = n.nodeType === 1 && (" " + i + " ").replace(rclass, " ");
if (r) {
o = 0;
while (s = t[o++])
r.indexOf(" " + s + " ") < 0 && (r += s + " ");
u = jQuery.trim(r),
i !== u && n.setAttribute("class", u)
}
}
}
return this
},
removeClass: function(e) {
var t, n, r, i, s, o, u, a = 0;
if (jQuery.isFunction(e))
return this.each(function(t) {
jQuery(this).removeClass(e.call(this, t, getClass(this)))
});
if (!arguments.length)
return this.attr("class", "");
if (typeof e == "string" && e) {
t = e.match(rnotwhite) || [];
while (n = this[a++]) {
i = getClass(n),
r = n.nodeType === 1 && (" " + i + " ").replace(rclass, " ");
if (r) {
o = 0;
while (s = t[o++])
while (r.indexOf(" " + s + " ") > -1)
r = r.replace(" " + s + " ", " ");
u = jQuery.trim(r),
i !== u && n.setAttribute("class", u)
}
}
}
return this
},
toggleClass: function(e, t) {
var n = typeof e;
return typeof t == "boolean" && n === "string" ? t ? this.addClass(e) : this.removeClass(e) : jQuery.isFunction(e) ? this.each(function(n) {
jQuery(this).toggleClass(e.call(this, n, getClass(this), t), t)
}) : this.each(function() {
var t, r, i, s;
if (n === "string") {
r = 0,
i = jQuery(this),
s = e.match(rnotwhite) || [];
while (t = s[r++])
i.hasClass(t) ? i.removeClass(t) : i.addClass(t)
} else if (e === undefined || n === "boolean")
t = getClass(this),
t && dataPriv.set(this, "__className__", t),
this.setAttribute && this.setAttribute("class", t || e === !1 ? "" : dataPriv.get(this, "__className__") || "")
})
},
hasClass: function(e) {
var t, n, r = 0;
t = " " + e + " ";
while (n = this[r++])
if (n.nodeType === 1 && (" " + getClass(n) + " ").replace(rclass, " ").indexOf(t) > -1)
return !0;
return !1
}
});
var rreturn = /\r/g;
jQuery.fn.extend({
val: function(e) {
var t, n, r, i = this[0];
if (!arguments.length) {
if (i)
return t = jQuery.valHooks[i.type] || jQuery.valHooks[i.nodeName.toLowerCase()],
t && "get"in t && (n = t.get(i, "value")) !== undefined ? n : (n = i.value,
typeof n == "string" ? n.replace(rreturn, "") : n == null ? "" : n);
return
}
return r = jQuery.isFunction(e),
this.each(function(n) {
var i;
if (this.nodeType !== 1)
return;
r ? i = e.call(this, n, jQuery(this).val()) : i = e,
i == null ? i = "" : typeof i == "number" ? i += "" : jQuery.isArray(i) && (i = jQuery.map(i, function(e) {
return e == null ? "" : e + ""
})),
t = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
if (!t || !("set"in t) || t.set(this, i, "value") === undefined)
this.value = i
})
}
}),
jQuery.extend({
valHooks: {
option: {
get: function(e) {
return jQuery.trim(e.value)
}
},
select: {
get: function(e) {
var t, n, r = e.options, i = e.selectedIndex, s = e.type === "select-one" || i < 0, o = s ? null : [], u = s ? i + 1 : r.length, a = i < 0 ? u : s ? i : 0;
for (; a < u; a++) {
n = r[a];
if ((n.selected || a === i) && (support.optDisabled ? !n.disabled : n.getAttribute("disabled") === null) && (!n.parentNode.disabled || !jQuery.nodeName(n.parentNode, "optgroup"))) {
t = jQuery(n).val();
if (s)
return t;
o.push(t)
}
}
return o
},
set: function(e, t) {
var n, r, i = e.options, s = jQuery.makeArray(t), o = i.length;
while (o--) {
r = i[o];
if (r.selected = jQuery.inArray(jQuery.valHooks.option.get(r), s) > -1)
n = !0
}
return n || (e.selectedIndex = -1),
s
}
}
}
}),
jQuery.each(["radio", "checkbox"], function() {
jQuery.valHooks[this] = {
set: function(e, t) {
if (jQuery.isArray(t))
return e.checked = jQuery.inArray(jQuery(e).val(), t) > -1
}
},
support.checkOn || (jQuery.valHooks[this].get = function(e) {
return e.getAttribute("value") === null ? "on" : e.value
}
)
});
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
jQuery.extend(jQuery.event, {
trigger: function(e, t, n, r) {
var i, s, o, u, a, f, l, c = [n || document], h = hasOwn.call(e, "type") ? e.type : e, p = hasOwn.call(e, "namespace") ? e.namespace.split(".") : [];
s = o = n = n || document;
if (n.nodeType === 3 || n.nodeType === 8)
return;
if (rfocusMorph.test(h + jQuery.event.triggered))
return;
h.indexOf(".") > -1 && (p = h.split("."),
h = p.shift(),
p.sort()),
a = h.indexOf(":") < 0 && "on" + h,
e = e[jQuery.expando] ? e : new jQuery.Event(h,typeof e == "object" && e),
e.isTrigger = r ? 2 : 3,
e.namespace = p.join("."),
e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)") : null,
e.result = undefined,
e.target || (e.target = n),
t = t == null ? [e] : jQuery.makeArray(t, [e]),
l = jQuery.event.special[h] || {};
if (!r && l.trigger && l.trigger.apply(n, t) === !1)
return;
if (!r && !l.noBubble && !jQuery.isWindow(n)) {
u = l.delegateType || h,
rfocusMorph.test(u + h) || (s = s.parentNode);
for (; s; s = s.parentNode)
c.push(s),
o = s;
o === (n.ownerDocument || document) && c.push(o.defaultView || o.parentWindow || window)
}
i = 0;
while ((s = c[i++]) && !e.isPropagationStopped())
e.type = i > 1 ? u : l.bindType || h,
f = (dataPriv.get(s, "events") || {})[e.type] && dataPriv.get(s, "handle"),
f && f.apply(s, t),
f = a && s[a],
f && f.apply && acceptData(s) && (e.result = f.apply(s, t),
e.result === !1 && e.preventDefault());
return e.type = h,
!r && !e.isDefaultPrevented() && (!l._default || l._default.apply(c.pop(), t) === !1) && acceptData(n) && a && jQuery.isFunction(n[h]) && !jQuery.isWindow(n) && (o = n[a],
o && (n[a] = null),
jQuery.event.triggered = h,
n[h](),
jQuery.event.triggered = undefined,
o && (n[a] = o)),
e.result
},
simulate: function(e, t, n) {
var r = jQuery.extend(new jQuery.Event, n, {
type: e,
isSimulated: !0
});
jQuery.event.trigger(r, null, t),
r.isDefaultPrevented() && n.preventDefault()
}
}),
jQuery.fn.extend({
trigger: function(e, t) {
return this.each(function() {
jQuery.event.trigger(e, t, this)
})
},
triggerHandler: function(e, t) {
var n = this[0];
if (n)
return jQuery.event.trigger(e, t, n, !0)
}
}),
jQuery.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) {
jQuery.fn[t] = function(e, n) {
return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t)
}
}),
jQuery.fn.extend({
hover: function(e, t) {
return this.mouseenter(e).mouseleave(t || e)
}
}),
support.focusin = "onfocusin"in window,
support.focusin || jQuery.each({
focus: "focusin",
blur: "focusout"
}, function(e, t) {
var n = function(e) {
jQuery.event.simulate(t, e.target, jQuery.event.fix(e))
};
jQuery.event.special[t] = {
setup: function() {
var r = this.ownerDocument || this
, i = dataPriv.access(r, t);
i || r.addEventListener(e, n, !0),
dataPriv.access(r, t, (i || 0) + 1)
},
teardown: function() {
var r = this.ownerDocument || this
, i = dataPriv.access(r, t) - 1;
i ? dataPriv.access(r, t, i) : (r.removeEventListener(e, n, !0),
dataPriv.remove(r, t))
}
}
});
var location = window.location
, nonce = jQuery.now()
, rquery = /\?/;
jQuery.parseJSON = function(e) {
return JSON.parse(e + "")
}
,
jQuery.parseXML = function(e) {
var t;
if (!e || typeof e != "string")
return null;
try {
t = (new window.DOMParser).parseFromString(e, "text/xml")
} catch (n) {
t = undefined
}
return (!t || t.getElementsByTagName("parsererror").length) && jQuery.error("Invalid XML: " + e),
t
}
;
var rhash = /#.*$/
, rts = /([?&])_=[^&]*/
, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg
, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/
, rnoContent = /^(?:GET|HEAD)$/
, rprotocol = /^\/\//
, prefilters = {}
, transports = {}
, allTypes = "*/".concat("*")
, originAnchor = document.createElement("a");
originAnchor.href = location.href,
jQuery.extend({
active: 0,
lastModified: {},
etag: {},
ajaxSettings: {
url: location.href,
type: "GET",
isLocal: rlocalProtocol.test(location.protocol),
global: !0,
processData: !0,
async: !0,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
converters: {
"* text": String,
"text html": !0,
"text json": jQuery.parseJSON,
"text xml": jQuery.parseXML
},
flatOptions: {
url: !0,
context: !0
}
},
ajaxSetup: function(e, t) {
return t ? ajaxExtend(ajaxExtend(e, jQuery.ajaxSettings), t) : ajaxExtend(jQuery.ajaxSettings, e)
},
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
ajaxTransport: addToPrefiltersOrTransports(transports),
ajax: function(e, t) {
function S(e, t, s, u) {
var f, m, g, b, E, S = t;
if (y === 2)
return;
y = 2,
o && window.clearTimeout(o),
n = undefined,
i = u || "",
w.readyState = e > 0 ? 4 : 0,
f = e >= 200 && e < 300 || e === 304,
s && (b = ajaxHandleResponses(l, w, s)),
b = ajaxConvert(l, b, w, f);
if (f)
l.ifModified && (E = w.getResponseHeader("Last-Modified"),
E && (jQuery.lastModified[r] = E),
E = w.getResponseHeader("etag"),
E && (jQuery.etag[r] = E)),
e === 204 || l.type === "HEAD" ? S = "nocontent" : e === 304 ? S = "notmodified" : (S = b.state,
m = b.data,
g = b.error,
f = !g);
else {
g = S;
if (e || !S)
S = "error",
e < 0 && (e = 0)
}
w.status = e,
w.statusText = (t || S) + "",
f ? p.resolveWith(c, [m, S, w]) : p.rejectWith(c, [w, S, g]),
w.statusCode(v),
v = undefined,
a && h.trigger(f ? "ajaxSuccess" : "ajaxError", [w, l, f ? m : g]),
d.fireWith(c, [w, S]),
a && (h.trigger("ajaxComplete", [w, l]),
--jQuery.active || jQuery.event.trigger("ajaxStop"))
}
typeof e == "object" && (t = e,
e = undefined),
t = t || {};
var n, r, i, s, o, u, a, f, l = jQuery.ajaxSetup({}, t), c = l.context || l, h = l.context && (c.nodeType || c.jquery) ? jQuery(c) : jQuery.event, p = jQuery.Deferred(), d = jQuery.Callbacks("once memory"), v = l.statusCode || {}, m = {}, g = {}, y = 0, b = "canceled", w = {
readyState: 0,
getResponseHeader: function(e) {
var t;
if (y === 2) {
if (!s) {
s = {};
while (t = rheaders.exec(i))
s[t[1].toLowerCase()] = t[2]
}
t = s[e.toLowerCase()]
}
return t == null ? null : t
},
getAllResponseHeaders: function() {
return y === 2 ? i : null
},
setRequestHeader: function(e, t) {
var n = e.toLowerCase();
return y || (e = g[n] = g[n] || e,
m[e] = t),
this
},
overrideMimeType: function(e) {
return y || (l.mimeType = e),
this
},
statusCode: function(e) {
var t;
if (e)
if (y < 2)
for (t in e)
v[t] = [v[t], e[t]];
else
w.always(e[w.status]);
return this
},
abort: function(e) {
var t = e || b;
return n && n.abort(t),
S(0, t),
this
}
};
p.promise(w).complete = d.add,
w.success = w.done,
w.error = w.fail,
l.url = ((e || l.url || location.href) + "").replace(rhash, "").replace(rprotocol, location.protocol + "//"),
l.type = t.method || t.type || l.method || l.type,
l.dataTypes = jQuery.trim(l.dataType || "*").toLowerCase().match(rnotwhite) || [""];
if (l.crossDomain == null) {
u = document.createElement("a");
try {
u.href = l.url,
u.href = u.href,
l.crossDomain = originAnchor.protocol + "//" + originAnchor.host != u.protocol + "//" + u.host
} catch (E) {
l.crossDomain = !0
}
}
l.data && l.processData && typeof l.data != "string" && (l.data = jQuery.param(l.data, l.traditional)),
inspectPrefiltersOrTransports(prefilters, l, t, w);
if (y === 2)
return w;
a = jQuery.event && l.global,
a && jQuery.active++ === 0 && jQuery.event.trigger("ajaxStart"),
l.type = l.type.toUpperCase(),
l.hasContent = !rnoContent.test(l.type),
r = l.url,
l.hasContent || (l.data && (r = l.url += (rquery.test(r) ? "&" : "?") + l.data,
delete l.data),
l.cache === !1 && (l.url = rts.test(r) ? r.replace(rts, "$1_=" + nonce++) : r + (rquery.test(r) ? "&" : "?") + "_=" + nonce++)),
l.ifModified && (jQuery.lastModified[r] && w.setRequestHeader("If-Modified-Since", jQuery.lastModified[r]),
jQuery.etag[r] && w.setRequestHeader("If-None-Match", jQuery.etag[r])),
(l.data && l.hasContent && l.contentType !== !1 || t.contentType) && w.setRequestHeader("Content-Type", l.contentType),
w.setRequestHeader("Accept", l.dataTypes[0] && l.accepts[l.dataTypes[0]] ? l.accepts[l.dataTypes[0]] + (l.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : l.accepts["*"]);
for (f in l.headers)
w.setRequestHeader(f, l.headers[f]);
if (!l.beforeSend || l.beforeSend.call(c, w, l) !== !1 && y !== 2) {
b = "abort";
for (f in {
success: 1,
error: 1,
complete: 1
})
w[f](l[f]);
n = inspectPrefiltersOrTransports(transports, l, t, w);
if (!n)
S(-1, "No Transport");
else {
w.readyState = 1,
a && h.trigger("ajaxSend", [w, l]);
if (y === 2)
return w;
l.async && l.timeout > 0 && (o = window.setTimeout(function() {
w.abort("timeout")
}, l.timeout));
try {
y = 1,
n.send(m, S)
} catch (E) {
if (!(y < 2))
throw E;
S(-1, E)
}
}
return w
}
return w.abort()
},
getJSON: function(e, t, n) {
return jQuery.get(e, t, n, "json")
},
getScript: function(e, t) {
return jQuery.get(e, undefined, t, "script")
}
}),
jQuery.each(["get", "post"], function(e, t) {
jQuery[t] = function(e, n, r, i) {
return jQuery.isFunction(n) && (i = i || r,
r = n,
n = undefined),
jQuery.ajax(jQuery.extend({
url: e,
type: t,
dataType: i,
data: n,
success: r
}, jQuery.isPlainObject(e) && e))
}
}),
jQuery._evalUrl = function(e) {
return jQuery.ajax({
url: e,
type: "GET",
dataType: "script",
async: !1,
global: !1,
"throws": !0
})
}
,
jQuery.fn.extend({
wrapAll: function(e) {
var t;
return jQuery.isFunction(e) ? this.each(function(t) {
jQuery(this).wrapAll(e.call(this, t))
}) : (this[0] && (t = jQuery(e, this[0].ownerDocument).eq(0).clone(!0),
this[0].parentNode && t.insertBefore(this[0]),
t.map(function() {
var e = this;
while (e.firstElementChild)
e = e.firstElementChild;
return e
}).append(this)),
this)
},
wrapInner: function(e) {
return jQuery.isFunction(e) ? this.each(function(t) {
jQuery(this).wrapInner(e.call(this, t))
}) : this.each(function() {
var t = jQuery(this)
, n = t.contents();
n.length ? n.wrapAll(e) : t.append(e)
})
},
wrap: function(e) {
var t = jQuery.isFunction(e);
return this.each(function(n) {
jQuery(this).wrapAll(t ? e.call(this, n) : e)
})
},
unwrap: function() {
return this.parent().each(function() {
jQuery.nodeName(this, "body") || jQuery(this).replaceWith(this.childNodes)
}).end()
}
}),
jQuery.expr.filters.hidden = function(e) {
return !jQuery.expr.filters.visible(e)
}
,
jQuery.expr.filters.visible = function(e) {
return e.offsetWidth > 0 || e.offsetHeight > 0 || e.getClientRects().length > 0
}
;
var r20 = /%20/g
, rbracket = /\[\]$/
, rCRLF = /\r?\n/g
, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i
, rsubmittable = /^(?:input|select|textarea|keygen)/i;
jQuery.param = function(e, t) {
var n, r = [], i = function(e, t) {
t = jQuery.isFunction(t) ? t() : t == null ? "" : t,
r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t)
};
t === undefined && (t = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional);
if (jQuery.isArray(e) || e.jquery && !jQuery.isPlainObject(e))
jQuery.each(e, function() {
i(this.name, this.value)
});
else
for (n in e)
buildParams(n, e[n], t, i);
return r.join("&").replace(r20, "+")
}
,
jQuery.fn.extend({
serialize: function() {
return jQuery.param(this.serializeArray())
},
serializeArray: function() {
return this.map(function() {
var e = jQuery.prop(this, "elements");
return e ? jQuery.makeArray(e) : this
}).filter(function() {
var e = this.type;
return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(e) && (this.checked || !rcheckableType.test(e))
}).map(function(e, t) {
var n = jQuery(this).val();
return n == null ? null : jQuery.isArray(n) ? jQuery.map(n, function(e) {
return {
name: t.name,
value: e.replace(rCRLF, "\r\n")
}
}) : {
name: t.name,
value: n.replace(rCRLF, "\r\n")
}
}).get()
}
}),
jQuery.ajaxSettings.xhr = function() {
try {
return new window.XMLHttpRequest
} catch (e) {}
}
;
var xhrSuccessStatus = {
0: 200,
1223: 204
}
, xhrSupported = jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported && "withCredentials"in xhrSupported,
support.ajax = xhrSupported = !!xhrSupported,
jQuery.ajaxTransport(function(e) {
var t, n;
if (support.cors || xhrSupported && !e.crossDomain)
return {
send: function(r, i) {
var s, o = e.xhr();
o.open(e.type, e.url, e.async, e.username, e.password);
if (e.xhrFields)
for (s in e.xhrFields)
o[s] = e.xhrFields[s];
e.mimeType && o.overrideMimeType && o.overrideMimeType(e.mimeType),
!e.crossDomain && !r["X-Requested-With"] && (r["X-Requested-With"] = "XMLHttpRequest");
for (s in r)
o.setRequestHeader(s, r[s]);
t = function(e) {
return function() {
t && (t = n = o.onload = o.onerror = o.onabort = o.onreadystatechange = null,
e === "abort" ? o.abort() : e === "error" ? typeof o.status != "number" ? i(0, "error") : i(o.status, o.statusText) : i(xhrSuccessStatus[o.status] || o.status, o.statusText, (o.responseType || "text") !== "text" || typeof o.responseText != "string" ? {
binary: o.response
} : {
text: o.responseText
}, o.getAllResponseHeaders()))
}
}
,
o.onload = t(),
n = o.onerror = t("error"),
o.onabort !== undefined ? o.onabort = n : o.onreadystatechange = function() {
o.readyState === 4 && window.setTimeout(function() {
t && n()
})
}
,
t = t("abort");
try {
o.send(e.hasContent && e.data || null)
} catch (u) {
if (t)
throw u
}
},
abort: function() {
t && t()
}
}
}),
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function(e) {
return jQuery.globalEval(e),
e
}
}
}),
jQuery.ajaxPrefilter("script", function(e) {
e.cache === undefined && (e.cache = !1),
e.crossDomain && (e.type = "GET")
}),
jQuery.ajaxTransport("script", function(e) {
if (e.crossDomain) {
var t, n;
return {
send: function(r, i) {
t = jQuery("<script>").prop({
charset: e.scriptCharset,
src: e.url
}).on("load error", n = function(e) {
t.remove(),
n = null,
e && i(e.type === "error" ? 404 : 200, e.type)
}
),
document.head.appendChild(t[0])
},
abort: function() {
n && n()
}
}
}
});
var oldCallbacks = []
, rjsonp = /(=)\?(?=&|$)|\?\?/;
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
var e = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
return this[e] = !0,
e
}
}),
jQuery.ajaxPrefilter("json jsonp", function(e, t, n) {
var r, i, s, o = e.jsonp !== !1 && (rjsonp.test(e.url) ? "url" : typeof e.data == "string" && (e.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(e.data) && "data");
if (o || e.dataTypes[0] === "jsonp")
return r = e.jsonpCallback = jQuery.isFunction(e.jsonpCallback) ? e.jsonpCallback() : e.jsonpCallback,
o ? e[o] = e[o].replace(rjsonp, "$1" + r) : e.jsonp !== !1 && (e.url += (rquery.test(e.url) ? "&" : "?") + e.jsonp + "=" + r),
e.converters["script json"] = function() {
return s || jQuery.error(r + " was not called"),
s[0]
}
,
e.dataTypes[0] = "json",
i = window[r],
window[r] = function() {
s = arguments
}
,
n.always(function() {
i === undefined ? jQuery(window).removeProp(r) : window[r] = i,
e[r] && (e.jsonpCallback = t.jsonpCallback,
oldCallbacks.push(r)),
s && jQuery.isFunction(i) && i(s[0]),
s = i = undefined
}),
"script"
}),
support.createHTMLDocument = function() {
var e = document.implementation.createHTMLDocument("").body;
return e.innerHTML = "<form></form><form></form>",
e.childNodes.length === 2
}(),
jQuery.parseHTML = function(e, t, n) {
if (!e || typeof e != "string")
return null;
typeof t == "boolean" && (n = t,
t = !1),
t = t || (support.createHTMLDocument ? document.implementation.createHTMLDocument("") : document);
var r = rsingleTag.exec(e)
, i = !n && [];
return r ? [t.createElement(r[1])] : (r = buildFragment([e], t, i),
i && i.length && jQuery(i).remove(),
jQuery.merge([], r.childNodes))
}
;
var _load = jQuery.fn.load;
jQuery.fn.load = function(e, t, n) {
if (typeof e != "string" && _load)
return _load.apply(this, arguments);
var r, i, s, o = this, u = e.indexOf(" ");
return u > -1 && (r = jQuery.trim(e.slice(u)),
e = e.slice(0, u)),
jQuery.isFunction(t) ? (n = t,
t = undefined) : t && typeof t == "object" && (i = "POST"),
o.length > 0 && jQuery.ajax({
url: e,
type: i || "GET",
dataType: "html",
data: t
}).done(function(e) {
s = arguments,
o.html(r ? jQuery("<div>").append(jQuery.parseHTML(e)).find(r) : e)
}).always(n && function(e, t) {
o.each(function() {
n.apply(o, s || [e.responseText, t, e])
})
}
),
this
}
,
jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(e, t) {
jQuery.fn[t] = function(e) {
return this.on(t, e)
}
}),
jQuery.expr.filters.animated = function(e) {
return jQuery.grep(jQuery.timers, function(t) {
return e === t.elem
}).length
}
,
jQuery.offset = {
setOffset: function(e, t, n) {
var r, i, s, o, u, a, f, l = jQuery.css(e, "position"), c = jQuery(e), h = {};
l === "static" && (e.style.position = "relative"),
u = c.offset(),
s = jQuery.css(e, "top"),
a = jQuery.css(e, "left"),
f = (l === "absolute" || l === "fixed") && (s + a).indexOf("auto") > -1,
f ? (r = c.position(),
o = r.top,
i = r.left) : (o = parseFloat(s) || 0,
i = parseFloat(a) || 0),
jQuery.isFunction(t) && (t = t.call(e, n, jQuery.extend({}, u))),
t.top != null && (h.top = t.top - u.top + o),
t.left != null && (h.left = t.left - u.left + i),
"using"in t ? t.using.call(e, h) : c.css(h)
}
},
jQuery.fn.extend({
offset: function(e) {
if (arguments.length)
return e === undefined ? this : this.each(function(t) {
jQuery.offset.setOffset(this, e, t)
});
var t, n, r = this[0], i = {
top: 0,
left: 0
}, s = r && r.ownerDocument;
if (!s)
return;
return t = s.documentElement,
jQuery.contains(t, r) ? (i = r.getBoundingClientRect(),
n = getWindow(s),
{
top: i.top + n.pageYOffset - t.clientTop,
left: i.left + n.pageXOffset - t.clientLeft
}) : i
},
position: function() {
if (!this[0])
return;
var e, t, n = this[0], r = {
top: 0,
left: 0
};
return jQuery.css(n, "position") === "fixed" ? t = n.getBoundingClientRect() : (e = this.offsetParent(),
t = this.offset(),
jQuery.nodeName(e[0], "html") || (r = e.offset()),
r.top += jQuery.css(e[0], "borderTopWidth", !0) - e.scrollTop(),
r.left += jQuery.css(e[0], "borderLeftWidth", !0) - e.scrollLeft()),
{
top: t.top - r.top - jQuery.css(n, "marginTop", !0),
left: t.left - r.left - jQuery.css(n, "marginLeft", !0)
}
},
offsetParent: function() {
return this.map(function() {
var e = this.offsetParent;
while (e && jQuery.css(e, "position") === "static")
e = e.offsetParent;
return e || documentElement
})
}
}),
jQuery.each({
scrollLeft: "pageXOffset",
scrollTop: "pageYOffset"
}, function(e, t) {
var n = "pageYOffset" === t;
jQuery.fn[e] = function(r) {
return access(this, function(e, r, i) {
var s = getWindow(e);
if (i === undefined)
return s ? s[t] : e[r];
s ? s.scrollTo(n ? s.pageXOffset : i, n ? i : s.pageYOffset) : e[r] = i
}, e, r, arguments.length)
}
}),
jQuery.each(["top", "left"], function(e, t) {
jQuery.cssHooks[t] = addGetHookIf(support.pixelPosition, function(e, n) {
if (n)
return n = curCSS(e, t),
rnumnonpx.test(n) ? jQuery(e).position()[t] + "px" : n
})
}),
jQuery.each({
Height: "height",
Width: "width"
}, function(e, t) {
jQuery.each({
padding: "inner" + e,
content: t,
"": "outer" + e
}, function(n, r) {
jQuery.fn[r] = function(r, i) {
var s = arguments.length && (n || typeof r != "boolean")
, o = n || (r === !0 || i === !0 ? "margin" : "border");
return access(this, function(t, n, r) {
var i;
return jQuery.isWindow(t) ? t.document.documentElement["client" + e] : t.nodeType === 9 ? (i = t.documentElement,
Math.max(t.body["scroll" + e], i["scroll" + e], t.body["offset" + e], i["offset" + e], i["client" + e])) : r === undefined ? jQuery.css(t, n, o) : jQuery.style(t, n, r, o)
}, t, s ? r : undefined, s, null)
}
})
}),
jQuery.fn.extend({
bind: function(e, t, n) {
return this.on(e, null, t, n)
},
unbind: function(e, t) {
return this.off(e, null, t)
},
delegate: function(e, t, n, r) {
return this.on(t, e, n, r)
},
undelegate: function(e, t, n) {
return arguments.length === 1 ? this.off(e, "**") : this.off(t, e || "**", n)
},
size: function() {
return this.length
}
}),
jQuery.fn.andSelf = jQuery.fn.addBack,
typeof define == "function" && define.amd && define("jquery", [], function() {
return jQuery
});
var _jQuery = window.jQuery
, _$ = window.$;
return jQuery.noConflict = function(e) {
return window.$ === jQuery && (window.$ = _$),
e && window.jQuery === jQuery && (window.jQuery = _jQuery),
jQuery
}
,
noGlobal || (window.jQuery = window.$ = jQuery),
jQuery
}),
function() {
function x(e) {
function t(t, n, r, i, s, o) {
for (; s >= 0 && s < o; s += e) {
var u = i ? i[s] : s;
r = n(r, t[u], u, t)
}
return r
}
return function(n, r, i, s) {
r = v(r, s, 4);
var o = !S(n) && d.keys(n)
, u = (o || n).length
, a = e > 0 ? 0 : u - 1;
return arguments.length < 3 && (i = n[o ? o[a] : a],
a += e),
t(n, r, i, o, a, u)
}
}
function C(e) {
return function(t, n, r) {
n = m(n, r);
var i = E(t)
, s = e > 0 ? 0 : i - 1;
for (; s >= 0 && s < i; s += e)
if (n(t[s], s, t))
return s;
return -1
}
}
function k(e, t, n) {
return function(r, i, s) {
var u = 0
, a = E(r);
if (typeof s == "number")
e > 0 ? u = s >= 0 ? s : Math.max(s + a, u) : a = s >= 0 ? Math.min(s + 1, a) : s + a + 1;
else if (n && s && a)
return s = n(r, i),
r[s] === i ? s : -1;
if (i !== i)
return s = t(o.call(r, u, a), d.isNaN),
s >= 0 ? s + u : -1;
for (s = e > 0 ? u : a - 1; s >= 0 && s < a; s += e)
if (r[s] === i)
return s;
return -1
}
}
function M(e, t) {
var n = O.length
, i = e.constructor
, s = d.isFunction(i) && i.prototype || r
, o = "constructor";
d.has(e, o) && !d.contains(t, o) && t.push(o);
while (n--)
o = O[n],
o in e && e[o] !== s[o] && !d.contains(t, o) && t.push(o)
}
var e = this
, t = e._
, n = Array.prototype
, r = Object.prototype
, i = Function.prototype
, s = n.push
, o = n.slice
, u = r.toString
, a = r.hasOwnProperty
, f = Array.isArray
, l = Object.keys
, c = i.bind
, h = Object.create
, p = function() {}
, d = function(e) {
if (e instanceof d)
return e;
if (!(this instanceof d))
return new d(e);
this._wrapped = e
};
typeof exports != "undefined" ? (typeof module != "undefined" && module.exports && (exports = module.exports = d),
exports._ = d) : e._ = d,
d.VERSION = "1.8.3";
var v = function(e, t, n) {
if (t === void 0)
return e;
switch (n == null ? 3 : n) {
case 1:
return function(n) {
return e.call(t, n)
}
;
case 2:
return function(n, r) {
return e.call(t, n, r)
}
;
case 3:
return function(n, r, i) {
return e.call(t, n, r, i)
}
;
case 4:
return function(n, r, i, s) {
return e.call(t, n, r, i, s)
}
}
return function() {
return e.apply(t, arguments)
}
}
, m = function(e, t, n) {
return e == null ? d.identity : d.isFunction(e) ? v(e, t, n) : d.isObject(e) ? d.matcher(e) : d.property(e)
};
d.iteratee = function(e, t) {
return m(e, t, Infinity)
}
;
var g = function(e, t) {
return function(n) {
var r = arguments.length;
if (r < 2 || n == null)
return n;
for (var i = 1; i < r; i++) {
var s = arguments[i]
, o = e(s)
, u = o.length;
for (var a = 0; a < u; a++) {
var f = o[a];
if (!t || n[f] === void 0)
n[f] = s[f]
}
}
return n
}
}
, y = function(e) {
if (!d.isObject(e))
return {};
if (h)
return h(e);
p.prototype = e;
var t = new p;
return p.prototype = null,
t
}
, b = function(e) {
return function(t) {
return t == null ? void 0 : t[e]
}
}
, w = Math.pow(2, 53) - 1
, E = b("length")
, S = function(e) {
var t = E(e);
return typeof t == "number" && t >= 0 && t <= w
};
d.each = d.forEach = function(e, t, n) {
t = v(t, n);
var r, i;
if (S(e))
for (r = 0,
i = e.length; r < i; r++)
t(e[r], r, e);
else {
var s = d.keys(e);
for (r = 0,
i = s.length; r < i; r++)
t(e[s[r]], s[r], e)
}
return e
}
,
d.map = d.collect = function(e, t, n) {
t = m(t, n);
var r = !S(e) && d.keys(e)
, i = (r || e).length
, s = Array(i);
for (var o = 0; o < i; o++) {
var u = r ? r[o] : o;
s[o] = t(e[u], u, e)
}
return s
}
,
d.reduce = d.foldl = d.inject = x(1),
d.reduceRight = d.foldr = x(-1),
d.find = d.detect = function(e, t, n) {
var r;
S(e) ? r = d.findIndex(e, t, n) : r = d.findKey(e, t, n);
if (r !== void 0 && r !== -1)
return e[r]
}
,
d.filter = d.select = function(e, t, n) {
var r = [];
return t = m(t, n),
d.each(e, function(e, n, i) {
t(e, n, i) && r.push(e)
}),
r
}
,
d.reject = function(e, t, n) {
return d.filter(e, d.negate(m(t)), n)
}
,
d.every = d.all = function(e, t, n) {
t = m(t, n);
var r = !S(e) && d.keys(e)
, i = (r || e).length;
for (var s = 0; s < i; s++) {
var o = r ? r[s] : s;
if (!t(e[o], o, e))
return !1
}
return !0
}
,
d.some = d.any = function(e, t, n) {
t = m(t, n);
var r = !S(e) && d.keys(e)
, i = (r || e).length;
for (var s = 0; s < i; s++) {
var o = r ? r[s] : s;
if (t(e[o], o, e))
return !0
}
return !1
}
,
d.contains = d.includes = d.include = function(e, t, n, r) {
S(e) || (e = d.values(e));
if (typeof n != "number" || r)
n = 0;
return d.indexOf(e, t, n) >= 0
}
,
d.invoke = function(e, t) {
var n = o.call(arguments, 2)
, r = d.isFunction(t);
return d.map(e, function(e) {
var i = r ? t : e[t];
return i == null ? i : i.apply(e, n)
})
}
,
d.pluck = function(e, t) {
return d.map(e, d.property(t))
}
,
d.where = function(e, t) {
return d.filter(e, d.matcher(t))
}
,
d.findWhere = function(e, t) {
return d.find(e, d.matcher(t))
}
,
d.max = function(e, t, n) {
var r = -Infinity, i = -Infinity, s, o;
if (t == null && e != null) {
e = S(e) ? e : d.values(e);
for (var u = 0, a = e.length; u < a; u++)
s = e[u],
s > r && (r = s)
} else
t = m(t, n),
d.each(e, function(e, n, s) {
o = t(e, n, s);
if (o > i || o === -Infinity && r === -Infinity)
r = e,
i = o
});
return r
}
,
d.min = function(e, t, n) {
var r = Infinity, i = Infinity, s, o;
if (t == null && e != null) {
e = S(e) ? e : d.values(e);
for (var u = 0, a = e.length; u < a; u++)
s = e[u],
s < r && (r = s)
} else
t = m(t, n),
d.each(e, function(e, n, s) {
o = t(e, n, s);
if (o < i || o === Infinity && r === Infinity)
r = e,
i = o
});
return r
}
,
d.shuffle = function(e) {
var t = S(e) ? e : d.values(e)
, n = t.length
, r = Array(n);
for (var i = 0, s; i < n; i++)
s = d.random(0, i),
s !== i && (r[i] = r[s]),
r[s] = t[i];
return r
}
,
d.sample = function(e, t, n) {
return t == null || n ? (S(e) || (e = d.values(e)),
e[d.random(e.length - 1)]) : d.shuffle(e).slice(0, Math.max(0, t))
}
,
d.sortBy = function(e, t, n) {
return t = m(t, n),
d.pluck(d.map(e, function(e, n, r) {
return {
value: e,
index: n,
criteria: t(e, n, r)
}
}).sort(function(e, t) {
var n = e.criteria
, r = t.criteria;
if (n !== r) {
if (n > r || n === void 0)
return 1;
if (n < r || r === void 0)
return -1
}
return e.index - t.index
}), "value")
}
;
var T = function(e) {
return function(t, n, r) {
var i = {};
return n = m(n, r),
d.each(t, function(r, s) {
var o = n(r, s, t);
e(i, r, o)
}),
i
}
};
d.groupBy = T(function(e, t, n) {
d.has(e, n) ? e[n].push(t) : e[n] = [t]
}),
d.indexBy = T(function(e, t, n) {
e[n] = t
}),
d.countBy = T(function(e, t, n) {
d.has(e, n) ? e[n]++ : e[n] = 1
}),
d.toArray = function(e) {
return e ? d.isArray(e) ? o.call(e) : S(e) ? d.map(e, d.identity) : d.values(e) : []
}
,
d.size = function(e) {
return e == null ? 0 : S(e) ? e.length : d.keys(e).length
}
,
d.partition = function(e, t, n) {
t = m(t, n);
var r = []
, i = [];
return d.each(e, function(e, n, s) {
(t(e, n, s) ? r : i).push(e)
}),
[r, i]
}
,
d.first = d.head = d.take = function(e, t, n) {
return e == null ? void 0 : t == null || n ? e[0] : d.initial(e, e.length - t)
}
,
d.initial = function(e, t, n) {
return o.call(e, 0, Math.max(0, e.length - (t == null || n ? 1 : t)))
}
,
d.last = function(e, t, n) {
return e == null ? void 0 : t == null || n ? e[e.length - 1] : d.rest(e, Math.max(0, e.length - t))
}
,
d.rest = d.tail = d.drop = function(e, t, n) {
return o.call(e, t == null || n ? 1 : t)
}
,
d.compact = function(e) {
return d.filter(e, d.identity)
}
;
var N = function(e, t, n, r) {
var i = []
, s = 0;
for (var o = r || 0, u = E(e); o < u; o++) {
var a = e[o];
if (S(a) && (d.isArray(a) || d.isArguments(a))) {
t || (a = N(a, t, n));
var f = 0
, l = a.length;
i.length += l;
while (f < l)
i[s++] = a[f++]
} else
n || (i[s++] = a)
}
return i
};
d.flatten = function(e, t) {
return N(e, t, !1)
}
,
d.without = function(e) {
return d.difference(e, o.call(arguments, 1))
}
,
d.uniq = d.unique = function(e, t, n, r) {
d.isBoolean(t) || (r = n,
n = t,
t = !1),
n != null && (n = m(n, r));
var i = []
, s = [];
for (var o = 0, u = E(e); o < u; o++) {
var a = e[o]
, f = n ? n(a, o, e) : a;
t ? ((!o || s !== f) && i.push(a),
s = f) : n ? d.contains(s, f) || (s.push(f),
i.push(a)) : d.contains(i, a) || i.push(a)
}
return i
}
,
d.union = function() {
return d.uniq(N(arguments, !0, !0))
}
,
d.intersection = function(e) {
var t = []
, n = arguments.length;
for (var r = 0, i = E(e); r < i; r++) {
var s = e[r];
if (d.contains(t, s))
continue;
for (var o = 1; o < n; o++)
if (!d.contains(arguments[o], s))
break;
o === n && t.push(s)
}
return t
}
,
d.difference = function(e) {
var t = N(arguments, !0, !0, 1);
return d.filter(e, function(e) {
return !d.contains(t, e)
})
}
,
d.zip = function() {
return d.unzip(arguments)
}
,
d.unzip = function(e) {
var t = e && d.max(e, E).length || 0
, n = Array(t);
for (var r = 0; r < t; r++)
n[r] = d.pluck(e, r);
return n
}
,
d.object = function(e, t) {
var n = {};
for (var r = 0, i = E(e); r < i; r++)
t ? n[e[r]] = t[r] : n[e[r][0]] = e[r][1];
return n
}
,
d.findIndex = C(1),
d.findLastIndex = C(-1),
d.sortedIndex = function(e, t, n, r) {
n = m(n, r, 1);
var i = n(t)
, s = 0
, o = E(e);
while (s < o) {
var u = Math.floor((s + o) / 2);
n(e[u]) < i ? s = u + 1 : o = u
}
return s
}
,
d.indexOf = k(1, d.findIndex, d.sortedIndex),
d.lastIndexOf = k(-1, d.findLastIndex),
d.range = function(e, t, n) {
t == null && (t = e || 0,
e = 0),
n = n || 1;
var r = Math.max(Math.ceil((t - e) / n), 0)
, i = Array(r);
for (var s = 0; s < r; s++,
e += n)
i[s] = e;
return i
}
;
var L = function(e, t, n, r, i) {
if (r instanceof t) {
var s = y(e.prototype)
, o = e.apply(s, i);
return d.isObject(o) ? o : s
}
return e.apply(n, i)
};
d.bind = function(e, t) {
if (c && e.bind === c)
return c.apply(e, o.call(arguments, 1));
if (!d.isFunction(e))
throw new TypeError("Bind must be called on a function");
var n = o.call(arguments, 2)
, r = function() {
return L(e, r, t, this, n.concat(o.call(arguments)))
};
return r
}
,
d.partial = function(e) {
var t = o.call(arguments, 1)
, n = function() {
var r = 0
, i = t.length
, s = Array(i);
for (var o = 0; o < i; o++)
s[o] = t[o] === d ? arguments[r++] : t[o];
while (r < arguments.length)
s.push(arguments[r++]);
return L(e, n, this, this, s)
};
return n
}
,
d.bindAll = function(e) {
var t, n = arguments.length, r;
if (n <= 1)
throw new Error("bindAll must be passed function names");
for (t = 1; t < n; t++)
r = arguments[t],
e[r] = d.bind(e[r], e);
return e
}
,
d.memoize = function(e, t) {
var n = function(r) {
var i = n.cache
, s = "" + (t ? t.apply(this, arguments) : r);
return d.has(i, s) || (i[s] = e.apply(this, arguments)),
i[s]
};
return n.cache = {},
n
}
,
d.delay = function(e, t) {
var n = o.call(arguments, 2);
return setTimeout(function() {
return e.apply(null, n)
}, t)
}
,
d.defer = d.partial(d.delay, d, 1),
d.throttle = function(e, t, n) {
var r, i, s, o = null, u = 0;
n || (n = {});
var a = function() {
u = n.leading === !1 ? 0 : d.now(),
o = null,
s = e.apply(r, i),
o || (r = i = null)
};
return function() {
var f = d.now();
!u && n.leading === !1 && (u = f);
var l = t - (f - u);
return r = this,
i = arguments,
l <= 0 || l > t ? (o && (clearTimeout(o),
o = null),
u = f,
s = e.apply(r, i),
o || (r = i = null)) : !o && n.trailing !== !1 && (o = setTimeout(a, l)),
s
}
}
,
d.debounce = function(e, t, n) {
var r, i, s, o, u, a = function() {
var f = d.now() - o;
f < t && f >= 0 ? r = setTimeout(a, t - f) : (r = null,
n || (u = e.apply(s, i),
r || (s = i = null)))
};
return function() {
s = this,
i = arguments,
o = d.now();
var f = n && !r;
return r || (r = setTimeout(a, t)),
f && (u = e.apply(s, i),
s = i = null),
u
}
}
,
d.wrap = function(e, t) {
return d.partial(t, e)
}
,
d.negate = function(e) {
return function() {
return !e.apply(this, arguments)
}
}
,
d.compose = function() {
var e = arguments
, t = e.length - 1;
return function() {
var n = t
, r = e[t].apply(this, arguments);
while (n--)
r = e[n].call(this, r);
return r
}
}
,
d.after = function(e, t) {
return function() {
if (--e < 1)
return t.apply(this, arguments)
}
}
,
d.before = function(e, t) {
var n;
return function() {
return --e > 0 && (n = t.apply(this, arguments)),
e <= 1 && (t = null),
n
}
}
,
d.once = d.partial(d.before, 2);
var A = !{
toString: null
}.propertyIsEnumerable("toString")
, O = ["valueOf", "isPrototypeOf", "toString", "propertyIsEnumerable", "hasOwnProperty", "toLocaleString"];
d.keys = function(e) {
if (!d.isObject(e))
return [];
if (l)
return l(e);
var t = [];
for (var n in e)
d.has(e, n) && t.push(n);
return A && M(e, t),
t
}
,
d.allKeys = function(e) {
if (!d.isObject(e))
return [];
var t = [];
for (var n in e)
t.push(n);
return A && M(e, t),
t
}
,
d.values = function(e) {
var t = d.keys(e)
, n = t.length
, r = Array(n);
for (var i = 0; i < n; i++)
r[i] = e[t[i]];
return r
}
,
d.mapObject = function(e, t, n) {
t = m(t, n);
var r = d.keys(e), i = r.length, s = {}, o;
for (var u = 0; u < i; u++)
o = r[u],
s[o] = t(e[o], o, e);
return s
}
,
d.pairs = function(e) {
var t = d.keys(e)
, n = t.length
, r = Array(n);
for (var i = 0; i < n; i++)
r[i] = [t[i], e[t[i]]];
return r
}
,
d.invert = function(e) {
var t = {}
, n = d.keys(e);
for (var r = 0, i = n.length; r < i; r++)
t[e[n[r]]] = n[r];
return t
}
,
d.functions = d.methods = function(e) {
var t = [];
for (var n in e)
d.isFunction(e[n]) && t.push(n);
return t.sort()
}
,
d.extend = g(d.allKeys),
d.extendOwn = d.assign = g(d.keys),
d.findKey = function(e, t, n) {
t = m(t, n);
var r = d.keys(e), i;
for (var s = 0, o = r.length; s < o; s++) {
i = r[s];
if (t(e[i], i, e))
return i
}
}
,
d.pick = function(e, t, n) {
var r = {}, i = e, s, o;
if (i == null)
return r;
d.isFunction(t) ? (o = d.allKeys(i),
s = v(t, n)) : (o = N(arguments, !1, !1, 1),
s = function(e, t, n) {
return t in n
}
,
i = Object(i));
for (var u = 0, a = o.length; u < a; u++) {
var f = o[u]
, l = i[f];
s(l, f, i) && (r[f] = l)
}
return r
}
,
d.omit = function(e, t, n) {
if (d.isFunction(t))
t = d.negate(t);
else {
var r = d.map(N(arguments, !1, !1, 1), String);
t = function(e, t) {
return !d.contains(r, t)
}
}
return d.pick(e, t, n)
}
,
d.defaults = g(d.allKeys, !0),
d.create = function(e, t) {
var n = y(e);
return t && d.extendOwn(n, t),
n
}
,
d.clone = function(e) {
return d.isObject(e) ? d.isArray(e) ? e.slice() : d.extend({}, e) : e
}
,
d.tap = function(e, t) {
return t(e),
e
}
,
d.isMatch = function(e, t) {
var n = d.keys(t)
, r = n.length;
if (e == null)
return !r;
var i = Object(e);
for (var s = 0; s < r; s++) {
var o = n[s];
if (t[o] !== i[o] || !(o in i))
return !1
}
return !0
}
;
var _ = function(e, t, n, r) {
if (e === t)
return e !== 0 || 1 / e === 1 / t;
if (e == null || t == null)
return e === t;
e instanceof d && (e = e._wrapped),
t instanceof d && (t = t._wrapped);
var i = u.call(e);
if (i !== u.call(t))
return !1;
switch (i) {
case "[object RegExp]":
case "[object String]":
return "" + e == "" + t;
case "[object Number]":
if (+e !== +e)
return +t !== +t;
return +e === 0 ? 1 / +e === 1 / t : +e === +t;
case "[object Date]":
case "[object Boolean]":
return +e === +t
}
var s = i === "[object Array]";
if (!s) {
if (typeof e != "object" || typeof t != "object")
return !1;
var o = e.constructor
, a = t.constructor;
if (o !== a && !(d.isFunction(o) && o instanceof o && d.isFunction(a) && a instanceof a) && "constructor"in e && "constructor"in t)
return !1
}
n = n || [],
r = r || [];
var f = n.length;
while (f--)
if (n[f] === e)
return r[f] === t;
n.push(e),
r.push(t);
if (s) {
f = e.length;
if (f !== t.length)
return !1;
while (f--)
if (!_(e[f], t[f], n, r))
return !1
} else {
var l = d.keys(e), c;
f = l.length;
if (d.keys(t).length !== f)
return !1;
while (f--) {
c = l[f];
if (!d.has(t, c) || !_(e[c], t[c], n, r))
return !1
}
}
return n.pop(),
r.pop(),
!0
};
d.isEqual = function(e, t) {
return _(e, t)
}
,
d.isEmpty = function(e) {
return e == null ? !0 : S(e) && (d.isArray(e) || d.isString(e) || d.isArguments(e)) ? e.length === 0 : d.keys(e).length === 0
}
,
d.isElement = function(e) {
return !!e && e.nodeType === 1
}
,
d.isArray = f || function(e) {
return u.call(e) === "[object Array]"
}
,
d.isObject = function(e) {
var t = typeof e;
return t === "function" || t === "object" && !!e
}
,
d.each(["Arguments", "Function", "String", "Number", "Date", "RegExp", "Error"], function(e) {
d["is" + e] = function(t) {
return u.call(t) === "[object " + e + "]"
}
}),
d.isArguments(arguments) || (d.isArguments = function(e) {
return d.has(e, "callee")
}
),
typeof /./ != "function" && typeof Int8Array != "object" && (d.isFunction = function(e) {
return typeof e == "function" || !1
}
),
d.isFinite = function(e) {
return isFinite(e) && !isNaN(parseFloat(e))
}
,
d.isNaN = function(e) {
return d.isNumber(e) && e !== +e
}
,
d.isBoolean = function(e) {
return e === !0 || e === !1 || u.call(e) === "[object Boolean]"
}
,
d.isNull = function(e) {
return e === null
}
,
d.isUndefined = function(e) {
return e === void 0
}
,
d.has = function(e, t) {
return e != null && a.call(e, t)
}
,
d.noConflict = function() {
return e._ = t,
this
}
,
d.identity = function(e) {
return e
}
,
d.constant = function(e) {
return function() {
return e
}
}
,
d.noop = function() {}
,
d.property = b,
d.propertyOf = function(e) {
return e == null ? function() {}
: function(t) {
return e[t]
}
}
,
d.matcher = d.matches = function(e) {
return e = d.extendOwn({}, e),
function(t) {
return d.isMatch(t, e)
}
}
,
d.times = function(e, t, n) {
var r = Array(Math.max(0, e));
t = v(t, n, 1);
for (var i = 0; i < e; i++)
r[i] = t(i);
return r
}
,
d.random = function(e, t) {
return t == null && (t = e,
e = 0),
e + Math.floor(Math.random() * (t - e + 1))
}
,
d.now = Date.now || function() {
return (new Date).getTime()
}
;
var D = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"`": "&#x60;"
}
, P = d.invert(D)
, H = function(e) {
var t = function(t) {
return e[t]
}
, n = "(?:" + d.keys(e).join("|") + ")"
, r = RegExp(n)
, i = RegExp(n, "g");
return function(e) {
return e = e == null ? "" : "" + e,
r.test(e) ? e.replace(i, t) : e
}
};
d.escape = H(D),
d.unescape = H(P),
d.result = function(e, t, n) {
var r = e == null ? void 0 : e[t];
return r === void 0 && (r = n),
d.isFunction(r) ? r.call(e) : r
}
;
var B = 0;
d.uniqueId = function(e) {
var t = ++B + "";
return e ? e + t : t
}
,
d.templateSettings = {
evaluate: /<%([\s\S]+?)%>/g,
interpolate: /<%=([\s\S]+?)%>/g,
escape: /<%-([\s\S]+?)%>/g
};
var j = /(.)^/
, F = {
"'": "'",
"\\": "\\",
"\r": "r",
"\n": "n",
"\u2028": "u2028",
"\u2029": "u2029"
}
, I = /\\|'|\r|\n|\u2028|\u2029/g
, q = function(e) {
return "\\" + F[e]
};
d.template = function(e, t, n) {
!t && n && (t = n),
t = d.defaults({}, t, d.templateSettings);
var r = RegExp([(t.escape || j).source, (t.interpolate || j).source, (t.evaluate || j).source].join("|") + "|$", "g")
, i = 0
, s = "__p+='";
e.replace(r, function(t, n, r, o, u) {
return s += e.slice(i, u).replace(I, q),
i = u + t.length,
n ? s += "'+\n((__t=(" + n + "))==null?'':_.escape(__t))+\n'" : r ? s += "'+\n((__t=(" + r + "))==null?'':__t)+\n'" : o && (s += "';\n" + o + "\n__p+='"),
t
}),
s += "';\n",
t.variable || (s = "with(obj||{}){\n" + s + "}\n"),
s = "var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n" + s + "return __p;\n";
try {
var o = new Function(t.variable || "obj","_",s)
} catch (u) {
throw u.source = s,
u
}
var a = function(e) {
return o.call(this, e, d)
}
, f = t.variable || "obj";
return a.source = "function(" + f + "){\n" + s + "}",
a
}
,
d.chain = function(e) {
var t = d(e);
return t._chain = !0,
t
}
;
var R = function(e, t) {
return e._chain ? d(t).chain() : t
};
d.mixin = function(e) {
d.each(d.functions(e), function(t) {
var n = d[t] = e[t];
d.prototype[t] = function() {
var e = [this._wrapped];
return s.apply(e, arguments),
R(this, n.apply(d, e))
}
})
}
,
d.mixin(d),
d.each(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function(e) {
var t = n[e];
d.prototype[e] = function() {
var n = this._wrapped;
return t.apply(n, arguments),
(e === "shift" || e === "splice") && n.length === 0 && delete n[0],
R(this, n)
}
}),
d.each(["concat", "join", "slice"], function(e) {
var t = n[e];
d.prototype[e] = function() {
return R(this, t.apply(this._wrapped, arguments))
}
}),
d.prototype.value = function() {
return this._wrapped
}
,
d.prototype.valueOf = d.prototype.toJSON = d.prototype.value,
d.prototype.toString = function() {
return "" + this._wrapped
}
,
typeof define == "function" && define.amd && define("underscore", [], function() {
return d
})
}
.call(this),
define("underscore.mixin", ["underscore"], function(e) {
"use strict";
var t = {
abbreviate: function(t, n, r) {
r = r || "...";
if (!t)
return r;
if (t.length > n) {
var i = "[" + r + "]"
, s = i.length
, o = (n - s) / 2
, u = n - s - o;
t = t.substring(0, o) + i + t.slice(-u)
}
return e.escape(t)
},
extendEvents: function(t, n) {
return t = e.isFunction(t) ? t() : t,
function() {
if (!n || !n.prototype || !e.keys(e.result(n.prototype, "events")).length)
return t;
var r = e.result(n.prototype, "events")
, i = e.extend(e.clone(r), t)
, s = e.intersection(e.keys(r), e.keys(t));
return e.each(s, function(s) {
i[s] = function(i) {
e.extend(i, {
isDelegationStopped: e.constant(!1),
stopDelegation: function() {
this.isDelegationStopped = e.constant(!0)
}
});
var o = s;
o = e.isFunction(o) ? o : t[s],
o = e.isFunction(o) ? o : this[t[s]];
var u = o.apply(this, arguments);
if (!e.result(i, "isDelegationStopped")) {
var a = r[s]
, f = a;
f = e.isFunction(f) ? f : n.prototype[a],
u = f.apply(this, arguments)
}
return u
}
}),
i
}
}
};
return e.mixin(t),
e
}),
function(e, t) {
if (typeof define == "function" && define.amd)
define("backbone", ["underscore", "jquery", "exports"], function(n, r, i) {
e.Backbone = t(e, i, n, r)
});
else if (typeof exports != "undefined") {
var n = require("underscore");
t(e, exports, n)
} else
e.Backbone = t(e, {}, e._, e.jQuery || e.Zepto || e.ender || e.$)
}(this, function(e, t, n, r) {
var i = e.Backbone
, s = []
, o = s.push
, u = s.slice
, a = s.splice;
t.VERSION = "1.1.2",
t.$ = r,
t.noConflict = function() {
return e.Backbone = i,
this
}
,
t.emulateHTTP = !1,
t.emulateJSON = !1;
var f = t.Events = {
on: function(e, t, n) {
if (!c(this, "on", e, [t, n]) || !t)
return this;
this._events || (this._events = {});
var r = this._events[e] || (this._events[e] = []);
return r.push({
callback: t,
context: n,
ctx: n || this
}),
this
},
once: function(e, t, r) {
if (!c(this, "once", e, [t, r]) || !t)
return this;
var i = this
, s = n.once(function() {
i.off(e, s),
t.apply(this, arguments)
});
return s._callback = t,
this.on(e, s, r)
},
off: function(e, t, r) {
var i, s, o, u, a, f, l, h;
if (!this._events || !c(this, "off", e, [t, r]))
return this;
if (!e && !t && !r)
return this._events = void 0,
this;
u = e ? [e] : n.keys(this._events);
for (a = 0,
f = u.length; a < f; a++) {
e = u[a];
if (o = this._events[e]) {
this._events[e] = i = [];
if (t || r)
for (l = 0,
h = o.length; l < h; l++)
s = o[l],
(t && t !== s.callback && t !== s.callback._callback || r && r !== s.context) && i.push(s);
i.length || delete this._events[e]
}
}
return this
},
trigger: function(e) {
if (!this._events)
return this;
var t = u.call(arguments, 1);
if (!c(this, "trigger", e, t))
return this;
var n = this._events[e]
, r = this._events.all;
return n && h(n, t),
r && h(r, arguments),
this
},
stopListening: function(e, t, r) {
var i = this._listeningTo;
if (!i)
return this;
var s = !t && !r;
!r && typeof t == "object" && (r = this),
e && ((i = {})[e._listenId] = e);
for (var o in i)
e = i[o],
e.off(t, r, this),
(s || n.isEmpty(e._events)) && delete this._listeningTo[o];
return this
}
}
, l = /\s+/
, c = function(e, t, n, r) {
if (!n)
return !0;
if (typeof n == "object") {
for (var i in n)
e[t].apply(e, [i, n[i]].concat(r));
return !1
}
if (l.test(n)) {
var s = n.split(l);
for (var o = 0, u = s.length; o < u; o++)
e[t].apply(e, [s[o]].concat(r));
return !1
}
return !0
}
, h = function(e, t) {
var n, r = -1, i = e.length, s = t[0], o = t[1], u = t[2];
switch (t.length) {
case 0:
while (++r < i)
(n = e[r]).callback.call(n.ctx);
return;
case 1:
while (++r < i)
(n = e[r]).callback.call(n.ctx, s);
return;
case 2:
while (++r < i)
(n = e[r]).callback.call(n.ctx, s, o);
return;
case 3:
while (++r < i)
(n = e[r]).callback.call(n.ctx, s, o, u);
return;
default:
while (++r < i)
(n = e[r]).callback.apply(n.ctx, t);
return
}
}
, p = {
listenTo: "on",
listenToOnce: "once"
};
n.each(p, function(e, t) {
f[t] = function(t, r, i) {
var s = this._listeningTo || (this._listeningTo = {})
, o = t._listenId || (t._listenId = n.uniqueId("l"));
return s[o] = t,
!i && typeof r == "object" && (i = this),
t[e](r, i, this),
this
}
}),
f.bind = f.on,
f.unbind = f.off,
n.extend(t, f);
var d = t.Model = function(e, t) {
var r = e || {};
t || (t = {}),
this.cid = n.uniqueId("c"),
this.attributes = {},
t.collection && (this.collection = t.collection),
t.parse && (r = this.parse(r, t) || {}),
r = n.defaults({}, r, n.result(this, "defaults")),
this.set(r, t),
this.changed = {},
this.initialize.apply(this, arguments)
}
;
n.extend(d.prototype, f, {
changed: null,
validationError: null,
idAttribute: "id",
initialize: function() {},
toJSON: function(e) {
return n.clone(this.attributes)
},
sync: function() {
return t.sync.apply(this, arguments)
},
get: function(e) {
return this.attributes[e]
},
escape: function(e) {
return n.escape(this.get(e))
},
has: function(e) {
return this.get(e) != null
},
set: function(e, t, r) {
var i, s, o, u, a, f, l, c;
if (e == null)
return this;
typeof e == "object" ? (s = e,
r = t) : (s = {})[e] = t,
r || (r = {});
if (!this._validate(s, r))
return !1;
o = r.unset,
a = r.silent,
u = [],
f = this._changing,
this._changing = !0,
f || (this._previousAttributes = n.clone(this.attributes),
this.changed = {}),
c = this.attributes,
l = this._previousAttributes,
this.idAttribute in s && (this.id = s[this.idAttribute]);
for (i in s)
t = s[i],
n.isEqual(c[i], t) || u.push(i),
n.isEqual(l[i], t) ? delete this.changed[i] : this.changed[i] = t,
o ? delete c[i] : c[i] = t;
if (!a) {
u.length && (this._pending = r);
for (var h = 0, p = u.length; h < p; h++)
this.trigger("change:" + u[h], this, c[u[h]], r)
}
if (f)
return this;
if (!a)
while (this._pending)
r = this._pending,
this._pending = !1,
this.trigger("change", this, r);
return this._pending = !1,
this._changing = !1,
this
},
unset: function(e, t) {
return this.set(e, void 0, n.extend({}, t, {
unset: !0
}))
},
clear: function(e) {
var t = {};
for (var r in this.attributes)
t[r] = void 0;
return this.set(t, n.extend({}, e, {
unset: !0
}))
},
hasChanged: function(e) {
return e == null ? !n.isEmpty(this.changed) : n.has(this.changed, e)
},
changedAttributes: function(e) {
if (!e)
return this.hasChanged() ? n.clone(this.changed) : !1;
var t, r = !1, i = this._changing ? this._previousAttributes : this.attributes;
for (var s in e) {
if (n.isEqual(i[s], t = e[s]))
continue;
(r || (r = {}))[s] = t
}
return r
},
previous: function(e) {
return e == null || !this._previousAttributes ? null : this._previousAttributes[e]
},
previousAttributes: function() {
return n.clone(this._previousAttributes)
},
fetch: function(e) {
e = e ? n.clone(e) : {},
e.parse === void 0 && (e.parse = !0);
var t = this
, r = e.success;
return e.success = function(n) {
if (!t.set(t.parse(n, e), e))
return !1;
r && r(t, n, e),
t.trigger("sync", t, n, e)
}
,
I(this, e),
this.sync("read", this, e)
},
save: function(e, t, r) {
var i, s, o, u = this.attributes;
e == null || typeof e == "object" ? (i = e,
r = t) : (i = {})[e] = t,
r = n.extend({
validate: !0
}, r);
if (i && !r.wait) {
if (!this.set(i, r))
return !1
} else if (!this._validate(i, r))
return !1;
i && r.wait && (this.attributes = n.extend({}, u, i)),
r.parse === void 0 && (r.parse = !0);
var a = this
, f = r.success;
return r.success = function(e) {
a.attributes = u;
var t = a.parse(e, r);
r.wait && (t = n.extend(i || {}, t));
if (n.isObject(t) && !a.set(t, r))
return !1;
f && f(a, e, r),
a.trigger("sync", a, e, r)
}
,
I(this, r),
s = this.isNew() ? "create" : r.patch ? "patch" : "update",
s === "patch" && (r.attrs = i),
o = this.sync(s, this, r),
i && r.wait && (this.attributes = u),
o
},
destroy: function(e) {
e = e ? n.clone(e) : {};
var t = this
, r = e.success
, i = function() {
t.trigger("destroy", t, t.collection, e)
};
e.success = function(n) {
(e.wait || t.isNew()) && i(),
r && r(t, n, e),
t.isNew() || t.trigger("sync", t, n, e)
}
;
if (this.isNew())
return e.success(),
!1;
I(this, e);
var s = this.sync("delete", this, e);
return e.wait || i(),
s
},
url: function() {
var e = n.result(this, "urlRoot") || n.result(this.collection, "url") || F();
return this.isNew() ? e : e.replace(/([^\/])$/, "$1/") + encodeURIComponent(this.id)
},
parse: function(e, t) {
return e
},
clone: function() {
return new this.constructor(this.attributes)
},
isNew: function() {
return !this.has(this.idAttribute)
},
isValid: function(e) {
return this._validate({}, n.extend(e || {}, {
validate: !0
}))
},
_validate: function(e, t) {
if (!t.validate || !this.validate)
return !0;
e = n.extend({}, this.attributes, e);
var r = this.validationError = this.validate(e, t) || null;
return r ? (this.trigger("invalid", this, r, n.extend(t, {
validationError: r
})),
!1) : !0
}
});
var v = ["keys", "values", "pairs", "invert", "pick", "omit"];
n.each(v, function(e) {
d.prototype[e] = function() {
var t = u.call(arguments);
return t.unshift(this.attributes),
n[e].apply(n, t)
}
});
var m = t.Collection = function(e, t) {
t || (t = {}),
t.model && (this.model = t.model),
t.comparator !== void 0 && (this.comparator = t.comparator),
this._reset(),
this.initialize.apply(this, arguments),
e && this.reset(e, n.extend({
silent: !0
}, t))
}
, g = {
add: !0,
remove: !0,
merge: !0
}
, y = {
add: !0,
remove: !1
};
n.extend(m.prototype, f, {
model: d,
initialize: function() {},
toJSON: function(e) {
return this.map(function(t) {
return t.toJSON(e)
})
},
sync: function() {
return t.sync.apply(this, arguments)
},
add: function(e, t) {
return this.set(e, n.extend({
merge: !1
}, t, y))
},
remove: function(e, t) {
var r = !n.isArray(e);
e = r ? [e] : n.clone(e),
t || (t = {});
var i, s, o, u;
for (i = 0,
s = e.length; i < s; i++) {
u = e[i] = this.get(e[i]);
if (!u)
continue;
delete this._byId[u.id],
delete this._byId[u.cid],
o = this.indexOf(u),
this.models.splice(o, 1),
this.length--,
t.silent || (t.index = o,
u.trigger("remove", u, this, t)),
this._removeReference(u, t)
}
return r ? e[0] : e
},
set: function(e, t) {
t = n.defaults({}, t, g),
t.parse && (e = this.parse(e, t));
var r = !n.isArray(e);
e = r ? e ? [e] : [] : n.clone(e);
var i, s, o, u, a, f, l, c = t.at, h = this.model, p = this.comparator && c == null && t.sort !== !1, v = n.isString(this.comparator) ? this.comparator : null, m = [], y = [], b = {}, w = t.add, E = t.merge, S = t.remove, x = !p && w && S ? [] : !1;
for (i = 0,
s = e.length; i < s; i++) {
a = e[i] || {},
a instanceof d ? o = u = a : o = a[h.prototype.idAttribute || "id"];
if (f = this.get(o))
S && (b[f.cid] = !0),
E && (a = a === u ? u.attributes : a,
t.parse && (a = f.parse(a, t)),
f.set(a, t),
p && !l && f.hasChanged(v) && (l = !0)),
e[i] = f;
else if (w) {
u = e[i] = this._prepareModel(a, t);
if (!u)
continue;
m.push(u),
this._addReference(u, t)
}
u = f || u,
x && (u.isNew() || !b[u.id]) && x.push(u),
b[u.id] = !0
}
if (S) {
for (i = 0,
s = this.length; i < s; ++i)
b[(u = this.models[i]).cid] || y.push(u);
y.length && this.remove(y, t)
}
if (m.length || x && x.length) {
p && (l = !0),
this.length += m.length;
if (c != null)
for (i = 0,
s = m.length; i < s; i++)
this.models.splice(c + i, 0, m[i]);
else {
x && (this.models.length = 0);
var T = x || m;
for (i = 0,
s = T.length; i < s; i++)
this.models.push(T[i])
}
}
l && this.sort({
silent: !0
});
if (!t.silent) {
for (i = 0,
s = m.length; i < s; i++)
(u = m[i]).trigger("add", u, this, t);
(l || x && x.length) && this.trigger("sort", this, t)
}
return r ? e[0] : e
},
reset: function(e, t) {
t || (t = {});
for (var r = 0, i = this.models.length; r < i; r++)
this._removeReference(this.models[r], t);
return t.previousModels = this.models,
this._reset(),
e = this.add(e, n.extend({
silent: !0
}, t)),
t.silent || this.trigger("reset", this, t),
e
},
push: function(e, t) {
return this.add(e, n.extend({
at: this.length
}, t))
},
pop: function(e) {
var t = this.at(this.length - 1);
return this.remove(t, e),
t
},
unshift: function(e, t) {
return this.add(e, n.extend({
at: 0
}, t))
},
shift: function(e) {
var t = this.at(0);
return this.remove(t, e),
t
},
slice: function() {
return u.apply(this.models, arguments)
},
get: function(e) {
return e == null ? void 0 : this._byId[e] || this._byId[e.id] || this._byId[e.cid]
},
at: function(e) {
return this.models[e]
},
where: function(e, t) {
return n.isEmpty(e) ? t ? void 0 : [] : this[t ? "find" : "filter"](function(t) {
for (var n in e)
if (e[n] !== t.get(n))
return !1;
return !0
})
},
findWhere: function(e) {
return this.where(e, !0)
},
sort: function(e) {
if (!this.comparator)
throw new Error("Cannot sort a set without a comparator");
return e || (e = {}),
n.isString(this.comparator) || this.comparator.length === 1 ? this.models = this.sortBy(this.comparator, this) : this.models.sort(n.bind(this.comparator, this)),
e.silent || this.trigger("sort", this, e),
this
},
pluck: function(e) {
return n.invoke(this.models, "get", e)
},
fetch: function(e) {
e = e ? n.clone(e) : {},
e.parse === void 0 && (e.parse = !0);
var t = e.success
, r = this;
return e.success = function(n) {
var i = e.reset ? "reset" : "set";
r[i](n, e),
t && t(r, n, e),
r.trigger("sync", r, n, e)
}
,
I(this, e),
this.sync("read", this, e)
},
create: function(e, t) {
t = t ? n.clone(t) : {};
if (!(e = this._prepareModel(e, t)))
return !1;
t.wait || this.add(e, t);
var r = this
, i = t.success;
return t.success = function(e, n) {
t.wait && r.add(e, t),
i && i(e, n, t)
}
,
e.save(null, t),
e
},
parse: function(e, t) {
return e
},
clone: function() {
return new this.constructor(this.models)
},
_reset: function() {
this.length = 0,
this.models = [],
this._byId = {}
},
_prepareModel: function(e, t) {
if (e instanceof d)
return e;
t = t ? n.clone(t) : {},
t.collection = this;
var r = new this.model(e,t);
return r.validationError ? (this.trigger("invalid", this, r.validationError, t),
!1) : r
},
_addReference: function(e, t) {
this._byId[e.cid] = e,
e.id != null && (this._byId[e.id] = e),
e.collection || (e.collection = this),
e.on("all", this._onModelEvent, this)
},
_removeReference: function(e, t) {
this === e.collection && delete e.collection,
e.off("all", this._onModelEvent, this)
},
_onModelEvent: function(e, t, n, r) {
if ((e === "add" || e === "remove") && n !== this)
return;
e === "destroy" && this.remove(t, r),
t && e === "change:" + t.idAttribute && (delete this._byId[t.previous(t.idAttribute)],
t.id != null && (this._byId[t.id] = t)),
this.trigger.apply(this, arguments)
}
});
var b = ["forEach", "each", "map", "collect", "reduce", "foldl", "inject", "reduceRight", "foldr", "find", "detect", "filter", "select", "reject", "every", "all", "some", "any", "include", "contains", "invoke", "max", "min", "toArray", "size", "first", "head", "take", "initial", "rest", "tail", "drop", "last", "without", "difference", "indexOf", "shuffle", "lastIndexOf", "isEmpty", "chain", "sample"];
n.each(b, function(e) {
m.prototype[e] = function() {
var t = u.call(arguments);
return t.unshift(this.models),
n[e].apply(n, t)
}
});
var w = ["groupBy", "countBy", "sortBy", "indexBy"];
n.each(w, function(e) {
m.prototype[e] = function(t, r) {
var i = n.isFunction(t) ? t : function(e) {
return e.get(t)
}
;
return n[e](this.models, i, r)
}
});
var E = t.View = function(e) {
this.cid = n.uniqueId("view"),
e || (e = {}),
n.extend(this, n.pick(e, x)),
this._ensureElement(),
this.initialize.apply(this, arguments),
this.delegateEvents()
}
, S = /^(\S+)\s*(.*)$/
, x = ["model", "collection", "el", "id", "attributes", "className", "tagName", "events"];
n.extend(E.prototype, f, {
tagName: "div",
$: function(e) {
return this.$el.find(e)
},
initialize: function() {},
render: function() {
return this
},
remove: function() {
return this.$el.remove(),
this.stopListening(),
this
},
setElement: function(e, n) {
return this.$el && this.undelegateEvents(),
this.$el = e instanceof t.$ ? e : t.$(e),
this.el = this.$el[0],
n !== !1 && this.delegateEvents(),
this
},
delegateEvents: function(e) {
if (!e && !(e = n.result(this, "events")))
return this;
this.undelegateEvents();
for (var t in e) {
var r = e[t];
n.isFunction(r) || (r = this[e[t]]);
if (!r)
continue;
var i = t.match(S)
, s = i[1]
, o = i[2];
r = n.bind(r, this),
s += ".delegateEvents" + this.cid,
o === "" ? this.$el.on(s, r) : this.$el.on(s, o, r)
}
return this
},
undelegateEvents: function() {
return this.$el.off(".delegateEvents" + this.cid),
this
},
_ensureElement: function() {
if (!this.el) {
var e = n.extend({}, n.result(this, "attributes"));
this.id && (e.id = n.result(this, "id")),
this.className && (e["class"] = n.result(this, "className"));
var r = t.$("<" + n.result(this, "tagName") + ">").attr(e);
this.setElement(r, !1)
} else
this.setElement(n.result(this, "el"), !1)
}
}),
t.sync = function(e, r, i) {
var s = N[e];
n.defaults(i || (i = {}), {
emulateHTTP: t.emulateHTTP,
emulateJSON: t.emulateJSON
});
var o = {
type: s,
dataType: "json"
};
i.url || (o.url = n.result(r, "url") || F()),
i.data == null && r && (e === "create" || e === "update" || e === "patch") && (o.contentType = "application/json",
o.data = JSON.stringify(i.attrs || r.toJSON(i))),
i.emulateJSON && (o.contentType = "application/x-www-form-urlencoded",
o.data = o.data ? {
model: o.data
} : {});
if (i.emulateHTTP && (s === "PUT" || s === "DELETE" || s === "PATCH")) {
o.type = "POST",
i.emulateJSON && (o.data._method = s);
var u = i.beforeSend;
i.beforeSend = function(e) {
e.setRequestHeader("X-HTTP-Method-Override", s);
if (u)
return u.apply(this, arguments)
}
}
o.type !== "GET" && !i.emulateJSON && (o.processData = !1),
o.type === "PATCH" && T && (o.xhr = function() {
return new ActiveXObject("Microsoft.XMLHTTP")
}
);
var a = i.xhr = t.ajax(n.extend(o, i));
return r.trigger("request", r, a, i),
a
}
;
var T = typeof window != "undefined" && !!window.ActiveXObject && (!window.XMLHttpRequest || !(new XMLHttpRequest).dispatchEvent)
, N = {
create: "POST",
update: "PUT",
patch: "PATCH",
"delete": "DELETE",
read: "GET"
};
t.ajax = function() {
return t.$.ajax.apply(t.$, arguments)
}
;
var C = t.Router = function(e) {
e || (e = {}),
e.routes && (this.routes = e.routes),
this._bindRoutes(),
this.initialize.apply(this, arguments)
}
, k = /\((.*?)\)/g
, L = /(\(\?)?:\w+/g
, A = /\*\w+/g
, O = /[\-{}\[\]+?.,\\\^$|#\s]/g;
n.extend(C.prototype, f, {
initialize: function() {},
route: function(e, r, i) {
n.isRegExp(e) || (e = this._routeToRegExp(e)),
n.isFunction(r) && (i = r,
r = ""),
i || (i = this[r]);
var s = this;
return t.history.route(e, function(n) {
var o = s._extractParameters(e, n);
s.execute(i, o),
s.trigger.apply(s, ["route:" + r].concat(o)),
s.trigger("route", r, o),
t.history.trigger("route", s, r, o)
}),
this
},
execute: function(e, t) {
e && e.apply(this, t)
},
navigate: function(e, n) {
return t.history.navigate(e, n),
this
},
_bindRoutes: function() {
if (!this.routes)
return;
this.routes = n.result(this, "routes");
var e, t = n.keys(this.routes);
while ((e = t.pop()) != null)
this.route(e, this.routes[e])
},
_routeToRegExp: function(e) {
return e = e.replace(O, "\\$&").replace(k, "(?:$1)?").replace(L, function(e, t) {
return t ? e : "([^/?]+)"
}).replace(A, "([^?]*?)"),
new RegExp("^" + e + "(?:\\?([\\s\\S]*))?$")
},
_extractParameters: function(e, t) {
var r = e.exec(t).slice(1);
return n.map(r, function(e, t) {
return t === r.length - 1 ? e || null : e ? decodeURIComponent(e) : null
})
}
});
var M = t.History = function() {
this.handlers = [],
n.bindAll(this, "checkUrl"),
typeof window != "undefined" && (this.location = window.location,
this.history = window.history)
}
, _ = /^[#\/]|\s+$/g
, D = /^\/+|\/+$/g
, P = /msie [\w.]+/
, H = /\/$/
, B = /#.*$/;
M.started = !1,
n.extend(M.prototype, f, {
interval: 50,
atRoot: function() {
return this.location.pathname.replace(/[^\/]$/, "$&/") === this.root
},
getHash: function(e) {
var t = (e || this).location.href.match(/#(.*)$/);
return t ? t[1] : ""
},
getFragment: function(e, t) {
if (e == null)
if (this._hasPushState || !this._wantsHashChange || t) {
e = decodeURI(this.location.pathname + this.location.search);
var n = this.root.replace(H, "");
e.indexOf(n) || (e = e.slice(n.length))
} else
e = this.getHash();
return e.replace(_, "")
},
start: function(e) {
if (M.started)
throw new Error("Backbone.history has already been started");
M.started = !0,
this.options = n.extend({
root: "/"
}, this.options, e),
this.root = this.options.root,
this._wantsHashChange = this.options.hashChange !== !1,
this._wantsPushState = !!this.options.pushState,
this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState);
var r = this.getFragment()
, i = document.documentMode
, s = P.exec(navigator.userAgent.toLowerCase()) && (!i || i <= 7);
this.root = ("/" + this.root + "/").replace(D, "/");
if (s && this._wantsHashChange) {
var o = t.$('<iframe src="javascript:0" tabindex="-1">');
this.iframe = o.hide().appendTo("body")[0].contentWindow,
this.navigate(r)
}
this._hasPushState ? t.$(window).on("popstate", this.checkUrl) : this._wantsHashChange && "onhashchange"in window && !s ? t.$(window).on("hashchange", this.checkUrl) : this._wantsHashChange && (this._checkUrlInterval = setInterval(this.checkUrl, this.interval)),
this.fragment = r;
var u = this.location;
if (this._wantsHashChange && this._wantsPushState) {
if (!this._hasPushState && !this.atRoot())
return this.fragment = this.getFragment(null, !0),
this.location.replace(this.root + "#" + this.fragment),
!0;
this._hasPushState && this.atRoot() && u.hash && (this.fragment = this.getHash().replace(_, ""),
this.history.replaceState({}, document.title, this.root + this.fragment))
}
if (!this.options.silent)
return this.loadUrl()
},
stop: function() {
t.$(window).off("popstate", this.checkUrl).off("hashchange", this.checkUrl),
this._checkUrlInterval && clearInterval(this._checkUrlInterval),
M.started = !1
},
route: function(e, t) {
this.handlers.unshift({
route: e,
callback: t
})
},
checkUrl: function(e) {
var t = this.getFragment();
t === this.fragment && this.iframe && (t = this.getFragment(this.getHash(this.iframe)));
if (t === this.fragment)
return !1;
this.iframe && this.navigate(t),
this.loadUrl()
},
loadUrl: function(e) {
return e = this.fragment = this.getFragment(e),
n.any(this.handlers, function(t) {
if (t.route.test(e))
return t.callback(e),
!0
})
},
navigate: function(e, t) {
if (!M.started)
return !1;
if (!t || t === !0)
t = {
trigger: !!t
};
var n = this.root + (e = this.getFragment(e || ""));
e = e.replace(B, "");
if (this.fragment === e)
return;
this.fragment = e,
e === "" && n !== "/" && (n = n.slice(0, -1));
if (this._hasPushState)
this.history[t.replace ? "replaceState" : "pushState"]({}, document.title, n);
else {
if (!this._wantsHashChange)
return this.location.assign(n);
this._updateHash(this.location, e, t.replace),
this.iframe && e !== this.getFragment(this.getHash(this.iframe)) && (t.replace || this.iframe.document.open().close(),
this._updateHash(this.iframe.location, e, t.replace))
}
if (t.trigger)
return this.loadUrl(e)
},
_updateHash: function(e, t, n) {
if (n) {
var r = e.href.replace(/(javascript:|#).*$/, "");
e.replace(r + "#" + t)
} else
e.hash = "#" + t
}
}),
t.history = new M;
var j = function(e, t) {
var r = this, i;
e && n.has(e, "constructor") ? i = e.constructor : i = function() {
return r.apply(this, arguments)
}
,
n.extend(i, r, t);
var s = function() {
this.constructor = i
};
return s.prototype = r.prototype,
i.prototype = new s,
e && n.extend(i.prototype, e),
i.__super__ = r.prototype,
i
};
d.extend = m.extend = C.extend = E.extend = M.extend = j;
var F = function() {
throw new Error('A "url" property or function must be specified')
}
, I = function(e, t) {
var n = t.error;
t.error = function(r) {
n && n(e, r, t),
e.trigger("error", e, r, t)
}
};
return t
}),
define("text", ["module"], function(e) {
"use strict";
var t, n, r, i, s, o = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP", "Msxml2.XMLHTTP.4.0"], u = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, a = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im, f = typeof location != "undefined" && location.href, l = f && location.protocol && location.protocol.replace(/\:/, ""), c = f && location.hostname, h = f && (location.port || undefined), p = {}, d = e.config && e.config() || {};
t = {
version: "2.0.14",
strip: function(e) {
if (e) {
e = e.replace(u, "");
var t = e.match(a);
t && (e = t[1])
} else
e = "";
return e
},
jsEscape: function(e) {
return e.replace(/(['\\])/g, "\\$1").replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n").replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r").replace(/[\u2028]/g, "\\u2028").replace(/[\u2029]/g, "\\u2029")
},
createXhr: d.createXhr || function() {
var e, t, n;
if (typeof XMLHttpRequest != "undefined")
return new XMLHttpRequest;
if (typeof ActiveXObject != "undefined")
for (t = 0; t < 3; t += 1) {
n = o[t];
try {
e = new ActiveXObject(n)
} catch (r) {}
if (e) {
o = [n];
break
}
}
return e
}
,
parseName: function(e) {
var t, n, r, i = !1, s = e.lastIndexOf("."), o = e.indexOf("./") === 0 || e.indexOf("../") === 0;
return s !== -1 && (!o || s > 1) ? (t = e.substring(0, s),
n = e.substring(s + 1)) : t = e,
r = n || t,
s = r.indexOf("!"),
s !== -1 && (i = r.substring(s + 1) === "strip",
r = r.substring(0, s),
n ? n = r : t = r),
{
moduleName: t,
ext: n,
strip: i
}
},
xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
useXhr: function(e, n, r, i) {
var s, o, u, a = t.xdRegExp.exec(e);
return a ? (s = a[2],
o = a[3],
o = o.split(":"),
u = o[1],
o = o[0],
(!s || s === n) && (!o || o.toLowerCase() === r.toLowerCase()) && (!u && !o || u === i)) : !0
},
finishLoad: function(e, n, r, i) {
r = n ? t.strip(r) : r,
d.isBuild && (p[e] = r),
i(r)
},
load: function(e, n, r, i) {
if (i && i.isBuild && !i.inlineText) {
r();
return
}
d.isBuild = i && i.isBuild;
var s = t.parseName(e)
, o = s.moduleName + (s.ext ? "." + s.ext : "")
, u = n.toUrl(o)
, a = d.useXhr || t.useXhr;
if (u.indexOf("empty:") === 0) {
r();
return
}
!f || a(u, l, c, h) ? t.get(u, function(n) {
t.finishLoad(e, s.strip, n, r)
}, function(e) {
r.error && r.error(e)
}) : n([o], function(e) {
t.finishLoad(s.moduleName + "." + s.ext, s.strip, e, r)
})
},
write: function(e, n, r, i) {
if (p.hasOwnProperty(n)) {
var s = t.jsEscape(p[n]);
r.asModule(e + "!" + n, "define(function () { return '" + s + "';});\n")
}
},
writeFile: function(e, n, r, i, s) {
var o = t.parseName(n)
, u = o.ext ? "." + o.ext : ""
, a = o.moduleName + u
, f = r.toUrl(o.moduleName + u) + ".js";
t.load(a, r, function(n) {
var r = function(e) {
return i(f, e)
};
r.asModule = function(e, t) {
return i.asModule(e, f, t)
}
,
t.write(e, a, r, s)
}, s)
}
};
if (d.env === "node" || !d.env && typeof process != "undefined" && process.versions && !!process.versions.node && !process.versions["node-webkit"] && !process.versions["atom-shell"])
n = require.nodeRequire("fs"),
t.get = function(e, t, r) {
try {
var i = n.readFileSync(e, "utf8");
i[0] === "" && (i = i.substring(1)),
t(i)
} catch (s) {
r && r(s)
}
}
;
else if (d.env === "xhr" || !d.env && t.createXhr())
t.get = function(e, n, r, i) {
var s = t.createXhr(), o;
s.open("GET", e, !0);
if (i)
for (o in i)
i.hasOwnProperty(o) && s.setRequestHeader(o.toLowerCase(), i[o]);
d.onXhr && d.onXhr(s, e),
s.onreadystatechange = function(t) {
var i, o;
s.readyState === 4 && (i = s.status || 0,
i > 399 && i < 600 ? (o = new Error(e + " HTTP status: " + i),
o.xhr = s,
r && r(o)) : n(s.responseText),
d.onXhrComplete && d.onXhrComplete(s, e))
}
,
s.send(null)
}
;
else if (d.env === "rhino" || !d.env && typeof Packages != "undefined" && typeof java != "undefined")
t.get = function(e, t) {
var n, r, i = "utf-8", s = new java.io.File(e), o = java.lang.System.getProperty("line.separator"), u = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(s),i)), a = "";
try {
n = new java.lang.StringBuffer,
r = u.readLine(),
r && r.length() && r.charAt(0) === 65279 && (r = r.substring(1)),
r !== null && n.append(r);
while ((r = u.readLine()) !== null)
n.append(o),
n.append(r);
a = String(n.toString())
} finally {
u.close()
}
t(a)
}
;
else if (d.env === "xpconnect" || !d.env && typeof Components != "undefined" && Components.classes && Components.interfaces)
r = Components.classes,
i = Components.interfaces,
Components.utils["import"]("resource://gre/modules/FileUtils.jsm"),
s = "@mozilla.org/windows-registry-key;1"in r,
t.get = function(e, t) {
var n, o, u, a = {};
s && (e = e.replace(/\//g, "\\")),
u = new FileUtils.File(e);
try {
n = r["@mozilla.org/network/file-input-stream;1"].createInstance(i.nsIFileInputStream),
n.init(u, 1, 0, !1),
o = r["@mozilla.org/intl/converter-input-stream;1"].createInstance(i.nsIConverterInputStream),
o.init(n, "utf-8", n.available(), i.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER),
o.readString(n.available(), a),
o.close(),
n.close(),
t(a.value)
} catch (f) {
throw new Error((u && u.path || "") + ": " + f)
}
}
;
return t
}),
define("json", ["text"], function(text) {
function cacheBust(e) {
return e = e.replace(CACHE_BUST_FLAG, ""),
e += e.indexOf("?") < 0 ? "?" : "&",
e + CACHE_BUST_QUERY_PARAM + "=" + Math.round(2147483647 * Math.random())
}
var CACHE_BUST_QUERY_PARAM = "bust"
, CACHE_BUST_FLAG = "!bust"
, jsonParse = typeof JSON != "undefined" && typeof JSON.parse == "function" ? JSON.parse : function(val) {
return eval("(" + val + ")")
}
, buildMap = {};
return {
load: function(e, t, n, r) {
r.isBuild && (r.inlineJSON === !1 || e.indexOf(CACHE_BUST_QUERY_PARAM + "=") !== -1) || t.toUrl(e).indexOf("empty:") === 0 ? n(null) : text.get(t.toUrl(e), function(t) {
r.isBuild ? (buildMap[e] = t,
n(t)) : n(jsonParse(t))
}, n.error, {
accept: "application/json"
})
},
normalize: function(e, t) {
return e.indexOf(CACHE_BUST_FLAG) !== -1 && (e = cacheBust(e)),
t(e)
},
write: function(e, t, n) {
if (t in buildMap) {
var r = buildMap[t];
n('define("' + e + "!" + t + '", function(){ return ' + r + ";});\n")
}
}
}
}),
define("json!languageFiles/languageFile.json", function() {
return {
de: {
"app.title": "MagentaCLOUD",
asc: "aufsteigend",
"confirm.cancel": "Abbrechen",
"confirm.ok": "Ok",
copyright: "© Telekom Deutschland GmbH",
desc: "absteigend",
details: "Details",
"encrypted.main": "Die Daten, auf die Sie zugreifen möchten, sind verschlüsselt.",
"error.401": "Nicht autorisiert",
"error.404": "Die Seite, nach der Sie suchen, können wir leider nicht finden.",
"error.410": "Dieser Freigabe-Link ist bereits abgelaufen.",
"error.500": "Ein Fehler ist aufgetreten.",
"error.503": "Die Funktion steht vorübergehend nicht zur Verfügung.",
"error.expired": "Die Sitzung ist abgelaufen. Bitte loggen Sie sich erneut ein.",
"error.password": "Das angegebene Passwort ist ungültig",
"error.password_empty": "Bitte geben Sie ein Passwort ein.",
"file.details.bitdepth": "Bittiefe",
"file.details.datetaken": "Aufnahmedatum",
"file.details.dimensions": "Abmessungen",
"file.details.exposuretime": "Belichtungszeit",
"file.details.fnumber": "Blendenzahl",
"file.details.focallength": "Brennweite",
"file.details.iso": "Iso",
"file.details.manufacturer": "Kamerahersteller",
"file.details.model": "Modell",
"file.download": "Herunterladen",
"file.name": "Name",
"file.size": "Größe",
"file.size.unit.Bytes": "Bytes",
"file.size.unit.GB": "GB",
"file.size.unit.KB": "KB",
"file.size.unit.MB": "MB",
"file.size.unit.PB": "PB",
"file.size.unit.TB": "TB",
"file.type": "Typ",
"file.type.dir": "Ordner",
"file.type.fileitem": "Datei",
"filemanager.delete.error.all": "Beim Löschen von {0} Element(en) ist ein Fehler aufgetreten.",
"filemanager.delete.error.one": '"{0}" konnte nicht gelöscht werden.',
"filemanager.delete.error.some": "{0} Element(e) wurden gelöscht. Beim Löschen von {1} Element(en) ist ein Fehler aufgetreten.",
"filemanager.delete.prompt.cancel": "Abbrechen",
"filemanager.delete.prompt.multi": "Möchten Sie diese {0} Elemente wirklich löschen?",
"filemanager.delete.prompt.ok": "Löschen",
"filemanager.delete.prompt.single": 'Möchten Sie "{0}" wirklich löschen?',
"filemanager.deselectAll": "Auswahl aufheben",
"filemanager.dnd.invitation": "Ziehen Sie Ihre Dateien in diesen Bereich.",
"filemanager.download_dir.error.404": 'Der Ordner "{0}" existiert nicht mehr.',
"filemanager.download.archiveprefix": "magentacloud",
"filemanager.download.error.404": 'Die Datei "{0}" existiert nicht mehr',
"filemanager.download.error.common": 'Beim Laden der Datei "{0}" ist ein Fehler aufgetreten.',
"filemanager.downloadAll": "Alle Dateien herunterladen",
"filemanager.downloadSelected": "Auswahl herunterladen",
"filemanager.newfolder.defaultname": "Neuer Ordner",
"filemanager.newfolder.error.common": "Beim Erstellen des neuen Ordners ist ein Fehler aufgetreten.",
"filemanager.noFiles": "Keine Dateien oder Ordner.",
"filemanager.selectall": "Alles auswählen",
"filesviewer.close": "Schließen",
"fileview.default.button.download": "Herunterladen",
"fileview.default.changed": "{0}, geändert am {1}",
"fileview.default.text": "Diese Datei kann nicht angezeigt werden.",
"fileview.default.timeFormat": "d. M Y",
"folder.loaderror.common": "Beim Laden von {0} ist ein Fehler aufgetreten.",
"format.decimal": ",",
"format.thousand": ".",
"header.teaser.import.button": "Jetzt speichern",
"header.teaser.import.text": "Sie können diese empfangene Freigabe in Ihrer MagentaCLOUD speichern.",
"header.teaser.text1": "Willkommen in der {0}.",
"header.teaser.text2": "Hier ist noch Platz für Sie!",
"header.teaser.url": "https://cloud.telekom-dienste.de",
"help.and.faq.title": "Hilfe & FAQ",
"help.and.faq.url": "https://cloud.telekom-dienste.de/hilfe",
"imprint.title": "Impressum",
"imprint.url": "http://www.telekom.de/impressum",
"js.activate": "Aktivieren Sie bitte JavaScript um MagentaCLOUD im Webrowser benutzen zu können.",
"lang.monthsList.short": "Jan.,Feb.,Mär.,Apr.,Mai.,Jun.,Jul.,Aug.,Sep.,Okt.,Nov.,Dez.",
"lang.name": "Deutsch",
"lang.timeFormat": "d. M Y H:i",
"login.accept": "Login",
"login.header": "Die Freigabe ist passwortgeschützt.",
"login.passwordLabel": "Passwort",
"menubar.delete": "Löschen",
"menubar.newfolder": "Neuer Ordner",
"menubar.select": "Auswählen",
"menubar.select.download": "Herunterladen",
"menubar.unselect": "Abbrechen",
"menubar.upload": "Hochladen",
"pdfview.documenttoolbar.page": "Seite",
"poweredBy.url": "https://cloud.telekom-dienste.de/hilfe?frage=erste-schritte-strato",
"privacy.title": "Datenschutz",
"privacy.url": "http://www.telekom.de/datenschutz",
"statusbar.delete": "Löschen",
"statusbar.download": "Herunterladen",
"teaser.register.text": "Jetzt informieren",
"teaser.register.url": "https://cloud.telekom-dienste.de/",
"teaser.text": "Die {0} ist der sichere und kostenlose Online-Speicher der Telekom. Ideal für Ihre Fotos, Videos und alle anderen Dateien, die Sie sicher speichern wollen. Sie können Ihre Daten direkt vom Smartphone, Tablet oder PC hochladen, von überall abrufen und ganz einfach mit Familie und Freunden teilen.",
"tmcshare.logo.text1": "Magenta",
"tmcshare.logo.text2": "CLOUD",
"upload.detail.cancelAll": "Alle Abbrechen",
"upload.detail.close": "Schließen",
"upload.detail.item.status.aborted": "— Abgebrochen",
"upload.detail.item.status.transferred": "{0} von {1}",
"upload.detail.moreuploads": "Weitere Dateien hochladen",
"upload.detail.title.done.multi": "hochgeladen",
"upload.detail.title.done.single": "hochgeladen",
"upload.detail.title.progress.multi": "{1} Dateien werden hochgeladen …",
"upload.detail.title.progress.single": "1 Datei wird hochgeladen …",
"viewAndSorting.date": "Datum",
"viewAndSorting.name": "Name",
"viewAndSorting.size": "Größe",
"viewAndSorting.sortedBy": "Sortiert nach",
"viewAndSorting.title": "Ansicht",
"viewAndSorting.type": "Typ"
},
en: {
"app.title": "MagentaCLOUD",
asc: "Ascending",
"confirm.cancel": "Cancel",
"confirm.ok": "Ok",
copyright: "© Telekom Deutschland GmbH",
desc: "Descending",
details: "Details",
"encrypted.main": "The data you are attempting to access are encrypted.",
"error.401": "Not authorised",
"error.404": "Unfortunately we could not find the site you are looking for.",
"error.410": "This share link already expired.",
"error.500": "An unexpected error has occurred.",
"error.503": "Function temporary unavailable.",
"error.expired": "The session has expired. Please log in again.",
"error.password": "The password entered is invalid.",
"error.password_empty": "Please enter a password.",
"file.details.bitdepth": "Bit depth",
"file.details.datetaken": "Date of photo",
"file.details.dimensions": "Dimensions",
"file.details.exposuretime": "Exposure time",
"file.details.fnumber": "F-number",
"file.details.focallength": "Focal length",
"file.details.iso": "Iso",
"file.details.manufacturer": "Camera manufacturer",
"file.details.model": "Model",
"file.download": "Download",
"file.name": "Name",
"file.size": "Size",
"file.size.unit.Bytes": "Bytes",
"file.size.unit.GB": "GB",
"file.size.unit.KB": "KB",
"file.size.unit.MB": "MB",
"file.size.unit.PB": "PB",
"file.size.unit.TB": "TB",
"file.type": "Type",
"file.type.dir": "Folders",
"file.type.fileitem": "File",
"filemanager.delete.error.all": "An error occurred while deleting {0} item(s).",
"filemanager.delete.error.one": 'Could not delete "{0}".',
"filemanager.delete.error.some": "{0} item(s) deleted. An error occurred while deleting {1} item(s).",
"filemanager.delete.prompt.cancel": "Cancel",
"filemanager.delete.prompt.multi": "Do you really want to delete these {0} items?",
"filemanager.delete.prompt.ok": "Delete",
"filemanager.delete.prompt.single": 'Do you really want to delete "{0}"?',
"filemanager.deselectAll": "Cancel selection",
"filemanager.dnd.invitation": "Drag your files into this area.",
"filemanager.download_dir.error.404": 'The folder "{0}" no longer exists',
"filemanager.download.archiveprefix": "magentacloud",
"filemanager.download.error.404": 'The file "{0}" no longer exists.',
"filemanager.download.error.common": 'An error occurred while loading the file "{0}".',
"filemanager.downloadAll": "Download all files",
"filemanager.downloadSelected": "Download selected items",
"filemanager.newfolder.defaultname": "New folder",
"filemanager.newfolder.error.common": "An error occurred when creating the new folder.",
"filemanager.noFiles": "This folder is empty.",
"filemanager.selectall": "Select all",
"filesviewer.close": "Close",
"fileview.default.button.download": "Download",
"fileview.default.changed": "{0}, modified on {1}",
"fileview.default.text": "Cannot display file.",
"fileview.default.timeFormat": "M d. Y",
"folder.loaderror.common": 'An error occurred while loading "{0}".',
"format.decimal": ".",
"format.thousand": ",",
"header.teaser.import.button": "Import now",
"header.teaser.import.text": "You can save the received share in your MagentaCLOUD.",
"header.teaser.text1": "Welcome to {0}.",
"header.teaser.text2": "There is still room for you!",
"header.teaser.url": "https://cloud.telekom-dienste.de",
"help.and.faq.title": "Help & FAQ",
"help.and.faq.url": "https://cloud.telekom-dienste.de/hilfe",
"imprint.title": "Publication details",
"imprint.url": "http://www.telekom.de/impressum",
"js.activate": "Please activate JavaScript to use MagentaCLOUD in your web browser.",
"lang.monthsList.short": "Jan.,Feb.,Mar.,Apr.,May,Jun.,Jul.,Aug.,Sep.,Oct.,Nov.,Dec.",
"lang.name": "English",
"lang.timeFormat": "m/d/y H:i",
"login.accept": "Login",
"login.header": "This share is password protected.",
"login.passwordLabel": "Password",
"menubar.delete": "Delete",
"menubar.newfolder": "New folder",
"menubar.select": "Select",
"menubar.select.download": "Download",
"menubar.unselect": "Cancel",
"menubar.upload": "Upload",
"pdfview.documenttoolbar.page": "Page",
"poweredBy.url": "https://cloud.telekom-dienste.de/hilfe?frage=erste-schritte-strato",
"privacy.title": "Data protection",
"privacy.url": "http://www.telekom.de/datenschutz",
"statusbar.delete": "Delete",
"statusbar.download": "Download",
"teaser.register.text": "More information",
"teaser.register.url": "https://cloud.telekom-dienste.de/",
"teaser.text": "{0} is the safe and free online storage of Telekom. Ideal for your photos, videos and any other files that you want to store safely. Upload your data directly from your smartphone, tablet or PC and retrieve them from anywhere or share them easily with family and friends.",
"tmcshare.logo.text1": "Magenta",
"tmcshare.logo.text2": "CLOUD",
"upload.detail.cancelAll": "Cancel all",
"upload.detail.close": "Close",
"upload.detail.item.status.aborted": "— Canceled",
"upload.detail.item.status.transferred": "{0} of {1}",
"upload.detail.moreuploads": "Upload additional files",
"upload.detail.title.done.multi": "Uploaded",
"upload.detail.title.done.single": "Uploaded",
"upload.detail.title.progress.multi": "Uploading {1} files…",
"upload.detail.title.progress.single": "Uploading 1 file...",
"viewAndSorting.date": "Date",
"viewAndSorting.name": "Name",
"viewAndSorting.size": "Size",
"viewAndSorting.sortedBy": "Sort according to",
"viewAndSorting.title": "View",
"viewAndSorting.type": "Type"
}
}
}),
define("lang/models/langModel", ["underscore", "backbone"], function(e, t) {
return t.Model.extend({
storageKey: "lang",
initialize: function(e) {
this._languageFileData = e
},
setLang: function(t) {
if (!t)
throw new Error("no language given to set in langModel");
var n = this._languageFileData;
if (!(t in n))
throw new Error('Language "' + t + '" is not defined in languageFileData');
if (!e.keys(n[t]).length)
throw new Error('No keys in language "' + t + '" defined');
this.language = t,
this.clear({
silent: !0
}),
this.set(n[this.language])
},
getLang: function() {
return this.language
},
getLanguages: function() {
return e.keys(this._languageFileData)
},
get: function(t, n) {
var r, i = this.attributes[t], s, o, u, a;
if (!i)
return "MISSING PROPERTY '" + t + "' in language '" + this.language + "'";
s = i.match(/{\d+}/g);
if (!s)
return i;
if (e.isUndefined(n))
return "MISSING ALL VALUES FOR '" + i + "'";
e.isArray(n) || (n = [n]),
o = e.map(s, function(e) {
return parseInt(e.substring(1), 10)
}),
u = e.max(o) + 1 - n.length;
if (u > 0)
return "MISSING " + u + " VALUE(S) FOR '" + i + "'";
for (r = 0; r < s.length; r++)
a = o[r],
e.isUndefined(n[a]) || (i = i.replace(s[r], n[a]));
return i
},
exists: function(t) {
return e.has(this.attributes, t)
},
bind: function(t, n) {
return e.bind(this.get, this, t, n)
},
getInLang: function(e, t) {
var n = this._languageFileData;
if (!n[t])
throw new Error("language '" + t + "' not defined in getInLang()");
if (!n[t][e])
throw new Error("key not defined: " + t + "/" + e);
return n[t][e]
}
})
}),
define("lang/main", ["json!languageFiles/languageFile.json", "./models/langModel"], function(e, t) {
return new t(e)
}),
define("lang", ["lang/main"], function(e) {
return e
}),
define("modules/window", [], function() {
function e() {
return window.URL && window.URL.createObjectURL ? window.URL.createObjectURL : null
}
return {
setLocation: function(e) {
window.location.href = e
},
getLocation: function() {
return window.location
},
getPathname: function() {
return window.location.pathname
},
open: function(e, t) {
window.open(e, t || "_blank")
},
getAnchor: function() {
var e = window.location.href;
return /#[^#]+$/.test(e) ? e.split("#")[1] : ""
},
getNavigatorLang: function() {
var e = window.navigator;
return e.language || e.userLanguage || null
},
isCreateObjectURLSpported: function() {
return !!e()
},
createObjectURL: function(t) {
var n = e();
if (!n)
throw new Error("createObjectURL() not supported");
return n(t)
},
getViewportHeight: function() {
return document.body.clientHeight
},
getDocumentScrollHeight: function() {
return document.body.scrollHeight
},
getDocumentScrollTop: function() {
return document.body.scrollTop
},
setTitle: function(e) {
document.title = e
}
}
}),
define("lang/views/langToggleView", ["jquery", "backbone", "lang"], function(e, t, n) {
var r = t.View.extend({
tagName: "span",
className: "language-toggle",
events: {
click: "onSelect"
},
render: function() {
var e = n.getLanguages()
, t = e[(e.indexOf(n.getLang()) + 1) % e.length];
return this.$el.html(n.getInLang("lang.name", t)).attr("data-lang", t),
this
},
onSelect: function(t) {
var n = e(t.currentTarget).attr("data-lang");
this.trigger("selected", n)
}
});
return r
}),
define("base/object", ["underscore", "backbone"], function(e, t) {
var n = function() {
this.cid = e.uniqueId(this.cidPrefix),
this.initialize.apply(this, arguments)
};
return e.extend(n.prototype, t.Events, {
cidPrefix: "o",
initialize: function() {}
}),
n.extend = t.Model.extend,
n
}),
define("formatters", ["underscore", "lang"], function(e, t) {
function r(e) {
return ("0" + e).slice(-2)
}
function i(e) {
switch (e) {
case 0:
return t.get("file.size.unit.Bytes");
case 1:
return t.get("file.size.unit.KB");
case 2:
return t.get("file.size.unit.MB");
case 3:
return t.get("file.size.unit.GB");
case 4:
return t.get("file.size.unit.TB");
default:
return t.get("file.size.unit.PB")
}
}
function s(e) {
var n, r, i, s = "";
if (typeof e != "number" || isNaN(e))
return s;
n = e.toString().split("."),
r = t.get("format.thousand"),
s = n[0];
if (r && s.length > 3) {
i = /(\d+)(\d{3})/;
while (i.test(s))
s = s.replace(i, "$1" + r + "$2")
}
return n.length > 1 && (s += t.get("format.decimal") + n[1]),
s
}
var n = {
d: function(e) {
return r(e.getDate())
},
j: function(e) {
return e.getDate()
},
m: function(e) {
return r(e.getMonth() + 1)
},
F: function(e) {
return t.get("lang.monthsList.long").split(",")[e.getMonth()]
},
M: function(e) {
return t.get("lang.monthsList.short").split(",")[e.getMonth()]
},
n: function(e) {
return e.getMonth() + 1
},
Y: function(e) {
return e.getFullYear()
},
y: function(e) {
return ("" + e.getFullYear()).substr(2)
},
a: function(e) {
return e.getHours() < 12 ? "am" : "pm"
},
A: function(e) {
return e.getHours() < 12 ? "AM" : "PM"
},
g: function(e) {
return e.getHours() % 12 || 12
},
G: function(e) {
return e.getHours()
},
h: function(e) {
return r(e.getHours() % 12 || 12)
},
H: function(e) {
return r(e.getHours())
},
i: function(e) {
return r(e.getMinutes())
},
s: function(e) {
return r(e.getSeconds())
}
};
return {
date: function(e, t) {
e = Number(e);
if (isNaN(e))
throw new Error("time input parameter is not a number");
if (typeof t == "undefined")
throw new Error("formatstring missing");
t = String(t);
var r = new Date(e * 1e3);
return t.replace(/[djmnYyaAgGhHisFM]/g, function(e) {
return e in n ? n[e](r) : e.substring(1)
})
},
size: function(e, t) {
var n = t ? t : 1
, r = parseInt(Math.floor(Math.log(Math.max(e, n)) / Math.log(1024)), 10);
if (isNaN(e))
throw new Error("input parameter is not a number");
return r === 0 ? s(e) + " " + i(0) : s(Math.round(e / Math.pow(1024, r) * 10) / 10) + " " + i(r)
},
number: s,
escapedBreakable: function(t) {
return e.escape(this.breakable(t))
},
breakable: function(e) {
return e.split("").join("​")
}
}
}),
define("modules/config", ["underscore", "base/object"], function(e, t) {
return t.extend({
initialize: function() {
this.config = e.clone(window.Config || {})
},
get: function(e) {
return this.config[e]
}
})
}),
define("modules/configInst", ["modules/config"], function(e) {
return new e
}),
define("base/view", ["underscore", "backbone", "lang", "formatters", "modules/configInst"], function(e, t, n, r, i) {
return t.View.extend({
constructor: function(n) {
e.has(n, "template") && (this.template = n.template),
e.has(n, "subviews") && (this.subviews = n.subviews),
e.has(n, "templateData") && (this.templateData = n.templateData),
this._subviews = {},
t.View.apply(this, arguments),
this._buildSubviews()
},
empty: function() {
this.el.innerHTML = ""
},
renderTemplate: function() {
if (!this.template)
return this;
var t = this.template
, s = {
lang: n,
formatters: r,
config: i
}
, o = {};
return this.model && (s.model = this.model),
this.collection && (s.collection = this.collection),
o = e.extend(s, e.result(this, "templateData", {})),
e.isFunction(t) && (t = t.call(this, o)),
this.el.innerHTML = t,
this
},
renderSubviews: function() {
return e.each(this._subviews, function(e) {
if (e.target) {
var t = this.$(e.target), n;
t.length && (n = e.view.render().$el,
e.appendToTarget ? t.append(n) : t.replaceWith(n))
}
}, this),
this
},
registerSubview: function(e, t, n) {
return this._registerSubviewByName(e.cid, e, t, n),
this
},
getSubview: function(t) {
return e.has(this._subviews, t) ? this._subviews[t].view : null
},
render: function() {
return this.onBeforeRender(),
this.renderTemplate(),
this.renderSubviews(),
this.onAfterRender(),
this
},
remove: function() {
return this._removeSubviews(),
t.View.prototype.remove.call(this)
},
onBeforeRender: function() {},
onAfterRender: function() {},
_buildSubviews: function() {
var t = e.result(this, "subviews", {});
e.isEmpty(t) || e.each(t, function(t, n) {
var r = new t.klass(t.options || {});
e.each(t.listeners || {}, function(e, t) {
this.listenTo(r, t, e)
}, this),
this._registerSubviewByName(n, r, t.target, t.appendToTarget)
}, this)
},
_registerSubviewByName: function(e, t, n, r) {
this._subviews[e] = {
view: t,
target: n,
appendToTarget: !!r
}
},
_removeSubviews: function() {
e.each(this._subviews, function(e) {
var t = e.view;
this.stopListening(t),
t.remove()
}, this),
this._subviews = {}
}
})
}),
define("base/viewSwitcher", ["underscore", "backbone"], function(e, t) {
return t.View.extend({
initialize: function(t) {
if (!e.isObject(t))
throw new Error("No or invalid options where provided");
if (!e.has(t, "subviews") || !e.keys(t.subviews).length)
throw new Error("No subviews defined in ViewSwitcher");
if (!e.has(t, "defaultView"))
throw new Error("No default view defined in ViewSwitcher");
if (!e.has(t.subviews, t.defaultView))
throw new Error("Defined default does not exist in subviews");
this.viewsConfig = t.subviews,
this.views = {},
this.keepInstances = !!t.keepInstances,
this.current = this.defaultView = t.defaultView
},
getCurrentViewName: function() {
return this.current
},
show: function(e, t) {
if (t || e !== this.current)
this.current = e,
this._renderCurrentView();
return this.currentView
},
showDefault: function() {
return this.show(this.defaultView)
},
render: function() {
return this.current = this.defaultView,
this._renderCurrentView(),
this
},
clear: function() {
return this.current = null,
this._clearCurrentView(),
this
},
_renderCurrentView: function() {
var t = this.viewsConfig[this.current], n;
this._clearCurrentView(),
e.has(this.views, this.current) || (this.views[this.current] = new t.klass(e.result(t, "options"))),
n = this.currentView = this.views[this.current],
e.each(t.listeners || {}, function(e, t) {
this.listenTo(n, t, e)
}, this),
this.$el.contents().detach(),
this.$el.append(n.render().$el)
},
_clearCurrentView: function() {
this.currentView && (this.stopListening(this.currentView),
this.keepInstances || (this.currentView.remove(),
this.views = {}),
this.currentView = null)
},
remove: function() {
e.invoke(this.views, "remove"),
this.views = null,
this.currentView = null,
t.View.prototype.remove.apply(this, arguments)
}
})
}),
define("base/main", ["./object", "./view", "./viewSwitcher"], function(e, t, n) {
return {
Object: e,
View: t,
ViewSwitcher: n
}
}),
define("base", ["base/main"], function(e) {
return e
}),
define("modules/constants", [], function() {
return {
statusPages: {
ssoError: "sso.error",
mailSuccess: "mail.success",
mailError: "mail.error"
},
userFields: ["alias", "account", "email", "descr", "language", "statusmail", "is_admin", "is_owner", "home", "home_id"].join(","),
authContext: {
"default": "default",
deviceBackups: "deviceBackups",
sharePrefix: "share-",
shareLinkPrefix: "lnk-"
},
deviceBackups: {
statusValid: "valid",
statusInvalid: "invalid",
statusRunning: "running",
trashFolder: ".trash"
},
authRefreshTime: 27e5,
doubleClickDelay: 301
}
}),
define("auth/registry", ["underscore", "modules/constants"], function(e, t) {
var n = function() {
this._registered = [],
this._instances = {}
};
return e.extend(n.prototype, {
register: function(t, n) {
if (!e.isString(t) && !e.isRegExp(t))
throw new Error("matcher argument needs to be a string or regex.");
if (!e.isFunction(n))
throw new Error("factory argument needs to be function.");
e.isRegExp(t) || (t = new RegExp("^" + t + "$")),
this._registered.push([t, n])
},
get: function(n) {
var r;
n = n || t.authContext.default,
r = e.find(this._registered, function(e) {
return e[0].test(n)
});
if (!r)
throw new Error('no auth class for context "' + n + '" found.');
return this._instances[n] || (this._instances[n] = r[1](n)),
this._instances[n]
}
}),
n
}),
define("auth/main", ["./registry"], function(e) {
return new e
}),
define("auth", ["auth/main"], function(e) {
return e
}),
define("api/helpers/sync", ["jquery", "underscore", "backbone", "auth"], function(e, t, n, r) {
var i = {
create: "POST",
update: "PUT",
"delete": "DELETE",
read: "GET"
};
return function(e, n, s) {
var o, u;
if (!i[e])
throw new Error("Undefined method '" + e + "'.");
o = {
type: i[e],
dataType: "json"
};
if (!s.url) {
o.url = t.result(this, "url");
if (!o.url)
throw new Error("No 'url' attribute or function defined")
}
return n && t.contains(["create", "update", "patch"], e) && (o.contentType = "application/json",
o.data = JSON.stringify(s.attrs || n.toJSON(s))),
u = s.xhr = r.get(n.getContext()).ajax(t.extend(o, s)),
n.trigger("request", n, u, s || {}),
u
}
}),
define("api/helpers/encoding", [], function() {
return {
urlDecode: function(e) {
try {
return decodeURIComponent(e)
} catch (t) {
try {
return unescape(e)
} catch (n) {
return e
}
}
}
}
}),
define("api/models/baseModel", ["jquery", "underscore", "backbone", "auth", "../helpers/sync", "../helpers/encoding", "modules/constants"], function(e, t, n, r, i, s, o) {
return n.Model.extend({
initialize: function(e, t) {
this._context = (t || {}).context || o.authContext.default
},
getContext: function() {
return this._context
},
clone: function() {
return new this.constructor(this.attributes,{
context: this.getContext()
})
},
sync: function() {
return i.apply(this, arguments)
},
urlDecode: function(e) {
return this.has(e) ? s.urlDecode(this.get(e)) : !1
}
})
}),
define("api/helpers/filegroups", ["underscore"], function(e) {
var t = {
thumb: ["bmp", "gif", "jpeg", "jpg", "png"],
image: ["ai", "cdr", "eps", "nef", "ps", "psd", "raw", "svg", "tif"],
audio: ["aac", "aif", "ape", "flac", "m4a", "mid", "mp3", "ram", "ra", "wav", "wma"],
video: ["avi", "flv", "mkv", "mov", "mp4", "mpg", "mpeg", "ogg", "ogv", "qt", "rm", "rmvb", "rv", "swf", "webm", "wmv"],
archive: ["dmg", "img", "iso", "mdf"],
compressed: ["bz2", "bzip", "chm", "gz", "rar", "rpm", "tar", "tgz", "zip"],
document: ["doc", "docm", "docx", "dot", "dotm", "dotx", "odt", "pgs", "rtf", "sxw"],
text: ["txt"],
pdf: ["pdf"],
slide: ["key", "odp", "pot", "potm", "potx", "ppam", "pps", "ppsm", "ppsx", "ppt", "pptm", "pptx", "sldm", "sldx", "thmx"],
spreadsheet: ["csv", "num", "ods", "sxc", "xlam", "xls", "xlsb", "xlsm", "xlsx", "xlt", "xltm", "xltx"],
code: ["css", "htm", "html", "js", "php", "pl", "pm", "rb", "sh", "vb", "xml"],
system: ["app", "bat", "com", "dll", "exe"]
}
, n = {};
return e.each(t, function(t, r) {
e.each(t, function(e) {
n[e] = r
})
}),
{
get: function(e) {
return e = String(e),
n[e.toLowerCase()] || "default"
}
}
}),
define("api/models/fileModel", ["underscore", "./baseModel", "../helpers/encoding", "../helpers/filegroups"], function(e, t, n, r) {
return t.extend({
defaults: {
name: "",
type: "",
path: "",
width: 0,
height: 0
},
pathSeparator: "/",
isDir: function() {
return this.get("type") === "dir"
},
isSymlink: function() {
return this.get("type") === "symlink"
},
getPid: function() {
return this.id
},
getItemType: function() {
return "FileItem-" + this.getContext()
},
parse: function(t) {
var i = e.clone(t), s, o, u = "";
return i.path = i.path || "",
this.pathSeparator ? (s = i.path.split(this.pathSeparator),
i.name = e.last(s),
s[0] === "root" && (s.shift(),
s.unshift("")),
i.path = s.join(this.pathSeparator)) : i.name = i.path,
i.type === "dir" ? i.group = "dir" : i.type === "symlink" ? i.group = "symlink" : (o = i.name.lastIndexOf("."),
o > 0 && o < i.name.length - 1 ? (u = i.name.substr(o + 1),
i.group = r.get(u)) : i.group = "default"),
i.ext = u,
i.isTempUploadFile = i.ext === "webupload",
i.display_name = n.urlDecode(i.name),
i.base_name = i.group === "dir" ? i.display_name : i.display_name.replace(/(.+)\.[^\.]+$/, "$1"),
i
},
setName: function(t) {
var n = this.get("path");
n = n.split("/").slice(0, -1).join("/"),
n += "/" + encodeURIComponent(t),
this.set(this.parse(e.extend({}, this.attributes, {
path: n
})))
},
getMeta: function(e) {
var t = require("api");
return t.getMeta({
context: this.getContext(),
pid: this.getPid(),
fields: e
})
}
})
}),
define("api/models/shareItem", ["jquery", "underscore", "auth", "./fileModel", "modules/window"], function(e, t, n, r, i) {
return r.extend({
getPid: function() {
return this.get("pid")
},
getItemType: function() {
return "ShareItem"
},
parse: function(e) {
return t.has(e, "file_type") && (e.type = e.file_type),
e = r.prototype.parse.apply(this, arguments),
e.type === "file" && typeof e.remaining == "undefined" && e.maxcount && (e.remaining = e.maxcount - (e.count || 0)),
e
},
removeShare: function() {
var t = this.get("share_type") === "sharedir" ? "/api/share" : "/api/sharelink"
, r = new e.Deferred;
return n.get().ajax({
type: "DELETE",
url: t,
data: {
id: this.get("id")
}
}).done(function(e) {
r.resolve(e)
}).fail(function(e, t, n) {
e.status === 404 ? r.resolve("") : r.reject(e, t, n)
}),
r
},
updateShare: function(e) {
var r, i = t.extend({}, {
id: this.get("id")
}, e);
return this.get("share_type") === "sharelink" ? r = "/api/sharelink" : r = "/api/share",
n.get().ajax({
type: "PUT",
url: r,
data: i
}).done(t.bind(function(e) {
t.extend(e, {
type: this.get("type")
}),
e = this.parse(e),
this.set(e);
var n = t.pick(this.omit(t.keys(e)), "has_password", "password", "ttl", "maxcount", "remaining");
this.set(n, {
unset: !0
})
}, this))
},
getPreviewUri: function() {
var e = i.getLocation()
, t = e.protocol + "//" + e.host + e.pathname.replace(/\/$/, "");
return t += this.get("share_type") === "sharedir" ? "/share/" : "/lnk/",
t += this.id,
t
},
invite: function(r, i, s) {
var o, u;
t.isArray(r) || (r = [r]),
r = t.filter(r, function(e) {
return typeof e == "string"
});
if (!r.length)
throw new Error("no emails given for invite");
if (i && !t.isString(i))
throw new Error("msg should be a string");
return u = {
id: this.get("id"),
recipient: r,
msg: i
},
s && t.isString(s.lang) && (u.lang = s.lang),
this.get("share_type") === "sharelink" ? o = "/api/sharelink/invite" : o = "/api/share/invite",
n.get().ajax({
type: "POST",
url: o,
traditional: !0,
data: u
}).then(t.bind(function(t, n, r) {
return t && t.failed && t.failed.length ? e.Deferred().reject(r, "error", "error") : (this.trigger("invite:success"),
e.Deferred().resolve(t, n, r))
}, this)).then(null, t.bind(function(e) {
var n = e.responseJSON || {
done: [],
failed: []
}
, r = {
done: t.pluck(n.done, "to"),
failed: t.pluck(n.failed, "to")
};
return this.trigger("invite:error", r),
r
}, this))
}
})
}),
define("api/models/externalShareModel", ["./shareItem", "underscore"], function(e, t) {
return e.extend({
pathSeparator: null,
parse: function(t) {
return t.path = String(t.label),
t.share_type = t.type,
t.type = t.share_type === "sharedir" ? "dir" : "file",
e.prototype.parse.call(this, t)
},
setName: function(e) {
this.set(this.parse(t.extend({}, this.attributes, {
label: e
})))
}
})
}),
define("api/apiWrapper.addExternalShare", ["jquery", "underscore", "auth", "api/models/externalShareModel"], function(e, t, n, r) {
return {
addExternalShare: function(i, s, o) {
var u = e.Deferred();
if (!t.isString(i))
throw new Error("addExternalShare requires share-id");
if (!t.isString(s))
throw new Error("addExternalShare requires share-type");
if (s !== "sharedir" && s !== "sharelink")
throw new Error("sharelink or sharedir required for share-type");
return n.get().ajax({
url: "/api/share/external",
method: "POST",
data: t.extend({}, o, {
id: i,
type: s
})
}).done(t.bind(function(e) {
var t = new r(e,{
parse: !0
});
this.trigger("addExternalShare:added", t),
u.resolve()
}, this)).fail(function(e) {
e.status === 409 ? u.resolve() : u.reject(e)
}),
u.promise()
}
}
}),
define("api/apiWrapper.copyFiles", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
copyFiles: function(i, s) {
var o = this
, u = t.pluck(s, "id")
, a = []
, f = []
, l = e.Deferred()
, c = i.getContext();
if (t.some(s, function(e) {
return e.getContext() !== c
}))
throw new Error("context of source and target must be the same in copyFiles");
return n.get(c).ajax({
method: "POST",
url: "/api/fs/copy",
traditional: !0,
data: {
src_id: u,
dst_id: i.get("id"),
on_exist: "autoname"
}
}).done(function(e) {
a = t.map(e.done, function(e) {
return new r(e,{
parse: !0,
context: c
})
}),
f = t.map(e.failed, function(e) {
return t.find(s, function(t) {
return t.get("id") === e.src_id
})
}),
o.trigger("copyFiles:done", i.get("path"), a),
f.length > 0 ? o.trigger("copyFiles:error", f, a) : o.trigger("copyFiles:success", i, a),
a.length === 0 ? l.reject(f) : l.resolve(f, a)
}).fail(function() {
f = s,
o.trigger("copyFiles:error", f, []),
l.reject(f)
}),
l.promise()
}
}
}),
define("api/apiWrapper.deleteExternalShare", ["jquery", "underscore", "auth", "api/models/externalShareModel"], function(e, t, n, r) {
return {
deleteExternalShare: function(i) {
var s = e.Deferred();
if (i instanceof r)
return this.trigger("deleteExternalShare:start", i),
n.get().ajax({
method: "DELETE",
url: "/api/share/external",
data: {
id: i.get("id"),
type: i.get("share_type")
}
}).done(t.bind(function() {
this.trigger("deleteExternalShare:success", i),
s.resolve(i)
}, this)).fail(t.bind(function(e) {
e.status === 404 ? (this.trigger("deleteExternalShare:success", i),
s.resolve(i)) : (this.trigger("deleteExternalShare:error", i),
s.reject(i, e))
}, this)),
s.promise();
throw new Error("deleteExternalShare requires an ExternalShareModel")
}
}
}),
define("modules/deleteList", ["underscore", "backbone", "base"], function(e, t, n) {
return n.Object.extend({
initialize: function() {
this.queues = {}
},
_checkType: function(t) {
return e.isString(t)
},
_checkArray: function(t) {
return e.isArray(t)
},
_testForInvalidModels: function(n) {
var r = e.find(n, function(e) {
return !(e instanceof t.Model)
});
return !!r
},
_getQueue: function(e) {
return this.queues[e] || (this.queues[e] = new t.Collection),
this.queues[e]
},
_remove: function(t, n, r) {
var i = {
silent: !0
};
return n = e.compact(this._getQueue(t).remove(n, i)),
n.length && this.trigger(r, t, n),
n
},
add: function(t, n) {
var r = {
silent: !0
}, i;
if (!this._checkType(t))
throw new Error("invalid type in DeleteList.add()");
if (!this._checkArray(n))
throw new Error("no models array given in DeleteList.add()");
if (this._testForInvalidModels(n))
throw new Error("not only models in array given in DeleteList.add()");
return i = e.map(n, function(e) {
return e.clone()
}),
i = this._getQueue(t).add(i, r),
this.trigger("added", t, i),
i
},
recover: function(e, t) {
if (!this._checkType(e))
throw new Error("invalid type in DeleteList.recover()");
if (!this._checkArray(t))
throw new Error("no models array given in DeleteList.recover()");
return this._remove(e, t, "recovered")
},
drop: function(e, t) {
if (!this._checkType(e))
throw new Error("invalid type in DeleteList.drop()");
if (!this._checkArray(t))
throw new Error("no models array given in DeleteList.drop()");
return this._remove(e, t, "dropped")
},
findByType: function(t, n) {
if (!this._checkType(t))
throw new Error("invalid type in DeleteList.findByType()");
if (e.isUndefined(n))
throw new Error("missing model in DeleteList.findByType()");
return this._getQueue(t).get(n)
},
filterByType: function(t, n) {
var r;
if (!this._checkType(t))
throw new Error("invalid type in DeleteList.filterByType()");
return typeof n == "function" ? r = e.filter(this._getQueue(t).models, n) : r = e.where(this._getQueue(t).models, n),
r
}
})
}),
define("deleteListInst", ["modules/deleteList"], function(e) {
return new e
}),
define("api/apiWrapper.deleteFiles", ["jquery", "underscore", "auth", "deleteListInst"], function(e, t, n, r) {
return {
deleteFiles: function(i) {
var s = this, o, u = e.Deferred(), a;
if (!t.isArray(i))
throw new Error("deleteFiles accepts only an array");
if (i.length === 0)
return u.resolve([], []),
u.promise();
a = i[0].getContext(),
o = i[0].getItemType();
if (t.some(i, function(e) {
return e.getContext() !== a
}))
throw new Error("context of all files must be the same in deleteFiles");
if (t.some(i, function(e) {
return e.getItemType() !== o
}))
throw new Error("itemType of all files must be the same in deleteFiles");
return i = r.add(o, i),
n.get(a).ajax({
url: "/api/fs/delete",
method: "POST",
data: {
pid: t.pluck(i, "id"),
recursive: !0
},
traditional: !0
}).always(function(e) {
var n = []
, a = [];
e.responseJSON && (e = e.responseJSON),
e.done && e.failed ? (t.each(e.failed, function(e) {
e.code === "404" ? a.push(t.find(i, {
id: e.id
})) : n.push(t.find(i, {
id: e.id
}))
}),
t.each(e.done, function(e) {
a.push(t.find(i, {
id: e.id
}))
})) : n = i,
a.length && r.drop(o, a),
n.length && r.recover(o, n),
n.length && s.trigger("deleteFiles:error", n, a),
a.length ? u.resolve(n, a) : u.reject(n)
}),
u.promise()
}
}
}),
define("api/models/shareLinkModel", ["jquery", "underscore", "./fileModel"], function(e, t, n) {
return n.extend({
pathSeparator: null,
parse: function(e, r) {
return e.path = e.name,
e.type = "file",
e.ttl > 0 && (e.expirytime = Date.now() / 1e3 + e.ttl | 0),
t.isUndefined(e.readable) && (e.readable = !0),
n.prototype.parse.call(this, e, r)
},
getMeta: function() {
var n = e.Deferred()
, r = {
readable: !0,
image: {}
};
return t.defer(function() {
n.resolve(r)
}),
n.promise()
}
})
}),
define("api/apiWrapper.download", ["jquery", "underscore", "auth", "modules/window", "api/models/shareLinkModel"], function(e, t, n, r, i) {
return {
download: function(e, s, o) {
var u, a, f, l, c, h = [];
o = o || {},
t.isArray(e) || (e = [e]);
if (!e.length)
throw new Error("models argument missing for download");
if (e.length > 1 && !s)
throw new Error("base (parent) required to download more than one item");
return e.length > 1 ? (a = !0,
f = s.getPid(),
l = s.get("name"),
c = s) : e[0].isDir() ? (a = !0,
f = e[0].getPid(),
l = e[0].get("name"),
c = e[0]) : (a = !1,
c = e[0]),
c instanceof i ? this.downloadSharelink(c) : (a ? (u = "/api/file/archive/download?src_id=" + t.map(e, function(e) {
return e.getPid()
}).join("&src_id=") + "&base_id=" + f,
o.archivePrefix && h.push(o.archivePrefix),
o.archiveName ? h.push(encodeURIComponent(o.archiveName.replace(/\/|\n|\r/g, ""))) : h.length && l !== "" && h.push(l),
h.length && (u += "&filename=" + h.join("-") + ".zip")) : (u = "/api/file?attachment=true",
u += "&pid=" + e[0].getPid()),
c.getMeta().done(t.bind(function() {
r.setLocation(n.get(c.getContext()).addAuthToUrl(u))
}, this)).fail(t.bind(function(t) {
this.trigger("download:error", e, t)
}, this)))
}
}
}),
define("api/apiWrapper.downloadShareLink", ["jquery", "underscore", "auth", "modules/window"], function(e, t, n, r) {
return {
downloadSharelink: function(i) {
function s() {
return n.get(i.getContext()).ajax({
method: "POST",
url: "/api/sharelink/info",
data: {
fields: "remaining,download_code"
}
})
}
function o(t) {
return t.remaining >= 1 ? e.Deferred().resolve(t.download_code) : e.Deferred().reject()
}
function u(t) {
var n = "/api/sharelink/download"
, s = {
id: i.get("id"),
download_code: t
};
r.setLocation(n + "?" + e.param(s))
}
function a() {
this.trigger("downloadSharelink:error", i)
}
return s(i).then(o).then(u, t.bind(a, this)).promise()
}
}
}),
define("api/apiWrapper.getDir", ["jquery", "underscore", "auth"], function(e, t, n) {
return {
getDir: function(r, i, s, o) {
function h() {
var e = c.length;
s = t.clone(s),
s.limit = [e, f].join(","),
n.get(i).ajax({
type: "GET",
dataType: "json",
url: "/api/dir?path=" + r,
data: s
}).then(function(e) {
if (t.isFunction(o)) {
o(function() {
a = !0
}, e);
if (a)
return
}
t.isArray(e.members) && (c = c.concat(e.members)),
l = t.omit(e, "members"),
t.isArray(e.members) && e.members.length === f ? h() : (l.members = c,
u.resolve(l))
}, function(e, t, n) {
u.reject(e, t, n)
})
}
var u = e.Deferred()
, a = !1
, f = 5e3
, l = {}
, c = [];
return h(),
u.promise()
}
}
}),
define("api/apiWrapper.getFile", ["auth"], function(e) {
return {
getFile: function(t, n) {
return e.get(n).ajax({
url: "/api/file",
method: "GET",
data: {
path: t
}
})
}
}
}),
define("api/apiWrapper.getMeta", ["underscore", "auth"], function(e, t) {
return {
getMeta: function(n) {
var r;
if (!e.isObject(n))
throw new Error("getMeta: options object required");
if (!n.context)
throw new Error("getMeta: context required");
if (!n.path && !n.pid)
throw new Error("getMeta: either pid or path are required");
if (n.fields && !e.isArray(n.fields))
throw new Error("getMeta: fields option must be an array");
return r = e.pick(n, "path", "pid"),
n.fields && n.fields.length && (r.fields = n.fields.join(",")),
t.get(n.context).ajax({
url: "/api/meta",
data: r
})
}
}
}),
define("api/apiWrapper.getThumbnail", ["jquery", "underscore", "auth", "api/models/fileModel", "api/models/shareLinkModel"], function(e, t, n, r, i) {
function s(r, i) {
var s = "/api/file/thumbnail?pid=" + r.getPid()
, o = e.Deferred();
return t.isObject(i) && (i.width && (s += "&width=" + Math.ceil(i.width)),
i.height && (s += "&height=" + Math.ceil(i.height))),
s = n.get(r.getContext()).addAuthToUrl(s),
o.resolve(s).promise()
}
function o(e, r) {
var i = {};
return t.isObject(r) && (r.width && (i.width = Math.ceil(r.width)),
r.height && (i.height = Math.ceil(r.height))),
n.get(e.getContext()).ajax({
url: "/api/sharelink/thumbnail",
method: "POST",
dataType: "blob",
data: i
})
}
return {
getThumbnail: function(e, t) {
var n;
if (e instanceof i)
n = o(e, t);
else {
if (!(e instanceof r))
throw new Error("expecting ShareLinkModel or FileModel");
n = s(e, t)
}
return n
}
}
}),
define("api/apiWrapper.getShareLinkThumbnail", ["jquery", "underscore", "modules/window"], function(e, t, n) {
return {
getShareLinkThumbnail: function(r, i) {
var s = e.Deferred()
, o = {
id: r
}
, u = new XMLHttpRequest
, a = "/api/sharelink/thumbnail";
if (!n.isCreateObjectURLSpported())
return s.reject(r, null, "noblob").promise();
if (!t.isString(r))
throw new Error("shareId parameter to getShareLinkThumbnail() has to be a string");
!isNaN(Number(i.width)) && i.width > 0 && (o.width = i.width),
!isNaN(Number(i.height)) && i.height > 0 && (o.height = i.height);
if (!o.height && !o.width)
throw new Error("At least width or height should be passed");
return i.password && (o.password = i.password),
u.open("POST", a, !0),
u.responseType = "blob",
u.setRequestHeader("Content-type", "application/x-www-form-urlencoded"),
u.onload = function() {
u.status === 200 ? s.resolve(n.createObjectURL(u.response)) : s.reject(r, u, "error")
}
,
u.send(e.param(o)),
s.promise()
}
}
}),
define("api/apiWrapper.moveFiles", ["jquery", "underscore", "auth", "deleteListInst", "api/models/fileModel"], function(e, t, n, r, i) {
return {
moveFiles: function(s, o) {
var u = s.getItemType()
, a = t.pluck(o, "id")
, f = []
, l = []
, c = e.Deferred()
, h = s.getContext();
if (t.some(o, function(e) {
return e.getContext() !== h
}))
throw new Error("context of source and target must be the same in moveFiles");
if (t.some(o, function(e) {
return e.getItemType() !== u
}))
throw new Error("itemType of source and target must be the same in moveFiles");
return r.add(u, o),
n.get(h).ajax({
method: "POST",
url: "/api/fs/move",
traditional: !0,
data: {
src_id: a,
dst_id: s.get("id"),
on_exist: "autoname"
}
}).done(t.bind(function(e) {
var n;
f = t.map(e.done, function(e) {
return new i(e,{
parse: !0,
context: h
})
}, this),
l = t.map(e.failed, function(e) {
return t.find(o, function(t) {
return t.get("id") === e.src_id
})
}),
n = t.difference(o, l),
l.length && r.recover(u, l),
n.length && r.drop(u, n),
this.trigger("moveFiles:done", s.get("path"), f),
l.length > 0 ? (this.trigger("moveFiles:error", l, f),
c.reject(l, f)) : (this.trigger("moveFiles:success", s, f),
c.resolve(f))
}, this)).fail(t.bind(function() {
l = o,
r.recover(u, l),
this.trigger("moveFiles:error", l, []),
c.reject(l, [])
}, this)),
c.promise()
}
}
}),
define("api/apiWrapper.newFile", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
newFile: function(i, s) {
var o = e.Deferred(), u, a, f = o.promise();
f.abort = e.noop;
if (i instanceof r) {
if (!t.isString(s))
throw new Error("newFile needs a file name");
return u = i.get("path"),
a = {
dir_id: i.get("id"),
name: s,
on_exist: "autoname"
},
n.get(i.getContext()).ajax({
method: "POST",
url: "/api/file?" + e.param(a),
beforeSend: function(e) {
f.abort = e.abort
}
}).done(t.bind(function(e) {
var t = new r(e,{
parse: !0,
context: i.getContext()
});
this.trigger("newFile:created", u, t),
o.resolve(t)
}, this)).fail(function(e, t) {
o.reject(i, e, t)
}),
f
}
throw new Error("newFile needs a valid target folder")
}
}
}),
define("api/apiWrapper.newFolder", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
newFolder: function(i, s, o) {
var u = e.Deferred(), a = i.get("path"), f;
if (!t.isObject(i))
throw new Error("newFolder needs a target folder");
if (!t.isString(s))
throw new Error("newFolder needs a new folder name");
return f = {
pid: i.get("id"),
path: s
},
o && t.extend(f, {
on_exist: "autoname"
}),
n.get(i.getContext()).ajax({
method: "POST",
url: "/api/dir",
data: f
}).done(t.bind(function(e) {
var t = new r(e,{
parse: !0,
context: i.getContext()
});
this.trigger("newFolder:created", a, t),
u.resolve(t)
}, this)).fail(function(e) {
u.reject(i, e)
}),
u.promise()
}
}
}),
define("api/apiWrapper.patchFile", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
patchFile: function(i, s, o, u) {
var a = e.Deferred()
, f = a.promise();
f.abort = e.noop;
if (i instanceof r) {
if (!t.isNumber(o))
throw new Error("offset parameter to patchFile() should be a number");
if (o < 0)
throw new Error("offset parameter to patchFile() should be >= 0");
if (s instanceof window.Blob)
return n.get(i.getContext()).ajax({
method: "PATCH",
url: "/api/file?" + e.param({
pid: i.getPid(),
offset: o
}),
timeout: 0,
processData: !1,
contentType: !1,
data: s,
xhr: function() {
var n = e.ajaxSettings.xhr();
return t.isFunction(u) && (n.upload.onprogress = u),
n
},
beforeSend: function(e) {
f.abort = e.abort
}
}).done(function(e) {
a.resolve(e)
}).fail(function(e, t) {
a.reject(i, e, t)
}),
f;
throw new Error("chunk parameter to patchFile() should be instance of Blob")
}
throw new Error("model parameter to patchFile() should be a FileModel")
}
}
}),
define("api/apiWrapper.rename", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
rename: function(i, s, o) {
var u = e.Deferred(), a, f, l, c, h;
if (i instanceof r != 1)
throw new Error("FileItem Model required to rename");
if (!t.isString(s))
throw new Error("new name of type string required by rename");
if (o && ["autoname", "overwrite"].indexOf(o) < 0)
throw new Error("invalid conflict decision given to rename");
if (o === "overwrite" && i.isDir())
throw new Error("overwrite not possible for directories on rename");
return f = o,
a = i.clone(),
a.setName(s),
l = t.bind(function(e, t, n) {
a.set(a.parse(e)),
this.trigger("rename:success", i, a, n),
u.resolve(i, a, e, t, n)
}, this),
c = t.bind(function(e, t, n) {
this.trigger("rename:error", i, a, e),
u.reject(i, a, e, t, n)
}, this),
(s.indexOf("/") >= 0 || s.match(/^\.{1,2}$/)) && c({
status: 400,
statusText: "invalid name"
}, "invalid name", 400),
i.get("display_name") === s && l(a.attributes, "success", {
status: 200,
statusText: "OK"
}),
this.trigger("rename:start", i, a),
u.notify(i, a),
h = i.isDir() ? "/api/dir/rename" : "/api/file/rename",
u.state() === "pending" && n.get(i.getContext()).ajax({
type: "POST",
url: h,
data: {
pid: a.get("id"),
name: a.get("display_name"),
on_exist: f
}
}).done(l).fail(c),
u.promise()
}
}
}),
define("api/apiWrapper.setExternalShareLabel", ["jquery", "underscore", "auth", "api/models/externalShareModel"], function(e, t, n, r) {
return {
setExternalShareLabel: function(i, s) {
var o = e.Deferred(), u;
if (i instanceof r) {
if (!s)
throw new Error("label should be provided to setExternalShareLabel");
return u = i.clone(),
u.setName(s),
this.trigger("setExternalShareLabel:start", i, u),
n.get().ajax({
method: "PUT",
url: "/api/share/external",
data: {
id: i.get("id"),
type: i.get("share_type"),
label: s
}
}).done(t.bind(function(e) {
u.set(u.parse(e)),
this.trigger("setExternalShareLabel:success", i, u),
o.resolve(i, u)
}, this)).fail(t.bind(function(e) {
this.trigger("setExternalShareLabel:error", i, u),
o.reject(i, u, e)
}, this)),
o.promise()
}
throw new Error("setExternalShareLabel requires an ExternalShareModel")
}
}
}),
define("api/apiWrapper.setExternalSharePassword", ["jquery", "underscore", "auth", "api/models/externalShareModel"], function(e, t, n, r) {
return {
setExternalSharePassword: function(i, s) {
var o = e.Deferred();
if (i instanceof r) {
if (t.isUndefined(s))
throw new Error("password should be provided to setExternalSharePassword");
return n.get().ajax({
method: "PUT",
url: "/api/share/external",
data: {
id: i.get("id"),
type: i.get("share_type"),
password: s
}
}).done(t.bind(function() {
this.trigger("setExternalSharePassword:success", i),
o.resolve(i)
}, this)).fail(t.bind(function(e) {
this.trigger("setExternalSharePassword:error", i),
o.reject(i, e)
}, this)),
o.promise()
}
throw new Error("setExternalSharePassword requires an ExternalShareModel")
}
}
}),
define("api/apiWrapper.unzip", ["jquery", "underscore", "auth"], function(e, t, n) {
return {
unzip: function(r, i) {
var s = e.Deferred();
if (!t.isObject(r))
throw new Error("unzip needs a valid file");
if (!t.isObject(i))
throw new Error("unzip needs a valid destination folder");
if (r.getContext() !== i.getContext())
throw new Error("context of source file and destination must be the same in unzip");
return n.get(i.getContext()).ajax({
method: "POST",
url: "/api/file/archive/inflate",
data: {
pid: r.id,
dst_id: i.id,
exists: "skipall",
forbidden: "skipall",
unprocessable: "skipall"
}
}).done(function(e) {
s.resolve(e)
}).fail(function(e) {
s.reject(r, e)
}),
s.promise()
}
}
}),
define("api/apiWrapper.updateUser", ["jquery", "underscore", "auth"], function(e, t, n) {
return {
updateUser: function(r, i) {
var s = e.Deferred();
if (!r)
throw new Error("accountId required for updateUser()");
if (!i || t.isEmpty(i))
throw new Error("attributes should not be empty for updateUser()");
return n.get().ajax({
type: "PUT",
url: "/api/user",
data: t.extend(i, {
account: r
})
}).done(function(e) {
s.resolve(e)
}).fail(function(e) {
s.reject(r, e)
}),
s.promise()
}
}
}),
define("api/apiWrapper.zip", ["jquery", "underscore", "auth", "api/models/fileModel"], function(e, t, n, r) {
return {
zip: function(i, s) {
var o = e.Deferred(), u, a;
if (!t.isArray(i) || !i.length)
throw new Error("zip needs valid source files array.");
if (!!s && s instanceof r) {
a = s.getContext();
if (t.some(i, function(e) {
return e.getContext() !== a
}))
throw new Error("context of source files and destination must be the same in zip");
return u = t.map(i, function(e) {
return e.urlDecode("path")
}),
n.get(a).ajax({
method: "POST",
url: "/api/file/archive/deflate",
traditional: !0,
data: {
dst: s.urlDecode("path"),
src: u
}
}).always(function(e, n, r) {
var u = [], a = [], f, l;
e.responseJSON ? l = e.responseJSON : l = e,
t.each(l.done, function(e) {
a.push(t.find(i, function(t) {
return t.get("path") === e.src
}))
}),
a.length === 0 ? u = i : t.each(l.failed, function(e) {
u.push(t.find(i, function(t) {
return t.get("path") === e.src
}))
}),
l.file && s.set(s.parse(l.file)),
f = e.status || r.status,
a.length === 0 ? o.reject(u, a, s, f) : o.resolve(u, a, s, f)
}),
o.promise()
}
throw new Error("zip needs valid destination file.")
}
}
}),
define("api/apiWrapper.zipInfo", ["jquery", "auth", "api/models/fileModel"], function(e, t, n) {
return {
zipInfo: function(r) {
var i = e.Deferred();
if (r instanceof n) {
if (r.get("ext") !== "zip")
throw new Error(".zip extension required for zipInfo");
return t.get(r.getContext()).ajax({
url: "/api/file/archive",
method: "GET",
data: {
pid: r.id
}
}).done(function(e) {
i.resolve(e)
}).fail(function(e) {
i.reject(r, e)
}),
i.promise()
}
throw new Error("FileModel required for zipInfo")
}
}
}),
define("api/apiWrapper", ["underscore", "base", "./apiWrapper.addExternalShare", "./apiWrapper.copyFiles", "./apiWrapper.deleteExternalShare", "./apiWrapper.deleteFiles", "./apiWrapper.download", "./apiWrapper.downloadShareLink", "./apiWrapper.getDir", "./apiWrapper.getFile", "./apiWrapper.getMeta", "./apiWrapper.getThumbnail", "./apiWrapper.getShareLinkThumbnail", "./apiWrapper.moveFiles", "./apiWrapper.newFile", "./apiWrapper.newFolder", "./apiWrapper.patchFile", "./apiWrapper.rename", "./apiWrapper.setExternalShareLabel", "./apiWrapper.setExternalSharePassword", "./apiWrapper.unzip", "./apiWrapper.updateUser", "./apiWrapper.zip", "./apiWrapper.zipInfo"], function(e, t, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w, E, S, x) {
var T = {};
return e.extend(T, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w, E, S, x),
t.Object.extend(T)
}),
define("api/collections/baseCollection", ["jquery", "underscore", "backbone", "../helpers/sync", "modules/constants"], function(e, t, n, r, i) {
return n.Collection.extend({
initialize: function(e, t) {
this._context = (t || {}).context || i.authContext.default
},
getContext: function() {
return this._context
},
_prepareModel: function(e, r) {
return r = t.extend({}, r, {
context: this.getContext()
}),
n.Collection.prototype._prepareModel.call(this, e, r)
},
sync: function(e, t, n) {
return r.call(this, e, t, n)
}
})
}),
define("api/models/zoneModel", ["jquery", "underscore", "auth", "./baseModel"], function(e, t, n, r) {
return r.extend({
idAttribute: "name",
url: "/api/zone",
defaults: {
quota: 0,
available: 0,
used: 0,
usedbysnapshots: 0,
usedbyfiles: 0,
sched_interval: null,
sched_ttl: null
},
parse: function(e) {
var n = [null, null], r;
return t.isArray(e) ? (r = t.findWhere(e, {
parent: null
}),
r.usedbysnapshots = t.reduce(e, function(e, t) {
return e + t.usedbysnapshots
}, 0)) : r = e,
t.has(r, "name") && (r.name = r.name.replace(/^root(\/|$)/, "/")),
r.usedbyfiles = r.used - r.usedbysnapshots,
r && r.sched && (n = r.sched.split(":"),
delete r.sched),
t.extend(r, {
sched_interval: n[0],
sched_ttl: n[1]
}),
r
},
checkSchedFormat: function(e) {
return /^\d+[dDwWmMyY]$/.test(e)
},
updateSchedule: function(r, i) {
var s = {
name: this.get("name")
};
if (t.isUndefined(r) || t.isUndefined(i))
return e.Deferred().reject();
if (r === "" && i === "")
s.sched = "";
else {
if (!this.checkSchedFormat(r) || !this.checkSchedFormat(i))
return e.Deferred().reject();
s.sched = r + ":" + i
}
return n.get().ajax({
type: "PUT",
url: this.url,
data: s
}).done(t.bind(function(e) {
this.set(this.parse(e))
}, this)).fail(t.bind(function() {
this.trigger("updateSchedule:error")
}, this))
}
})
}),
define("api/collections/zones", ["./baseCollection", "../models/zoneModel"], function(e, t) {
return e.extend({
url: "/api/zone",
model: t
})
}),
define("lang/helper/localeDetector", ["underscore", "modules/window"], function(e, t) {
function n(e) {
return e.indexOf("-") !== -1 ? e.split("-")[0] : e
}
return function(e, r) {
var i = t.getNavigatorLang();
if (i) {
i = n(i);
if (e.indexOf(i) !== -1)
return i
}
return r && e.indexOf(r) !== -1 ? r : e[0]
}
}),
define("localstorage/main", ["jquery", "modules/configInst"], function(e, t) {
function r(e) {
return t.get("app").name + "." + e
}
var n = window;
return {
setScope: function(e) {
n = e
},
put: function(t, i) {
try {
(n.localStorage || {
setItem: e.noop
}).setItem(r(t), i)
} catch (s) {
console.error("Error: cannot put '" + t + "' to localStorage: " + s)
}
},
get: function(t) {
try {
return (n.localStorage || {
getItem: e.noop
}).getItem(r(t))
} catch (i) {
return console.error("Error: cannot get '" + t + "' from localStorage: " + i),
null
}
},
remove: function(t) {
try {
(n.localStorage || {
removeItem: e.noop
}).removeItem(r(t))
} catch (i) {
console.error("Error: cannot remove '" + t + "' from localStorage: " + i)
}
}
}
}),
define("localstorage", ["localstorage/main"], function(e) {
return e
}),
define("api/router", ["underscore", "backbone", "lang/helper/localeDetector", "localstorage", "lang", "auth", "modules/window"], function(e, t, n, r, i, s, o) {
var u = t.Router.extend({
defaults: {
langStorageKey: "lang",
lang: "en"
},
_extractParameters: function(t, n) {
var r = t.exec(n).slice(1);
return e.map(r, function(e) {
return e ? e : null
})
},
_setTitle: function() {
var e = i.get("app.title");
o.setTitle(e)
},
initialize: function() {
var e = this.defaults.langStorageKey
, t = n(i.getLanguages(), this.defaults.lang)
, o = r.get(e);
try {
i.setLang(o || t)
} catch (u) {
i.setLang(t),
r.remove(e)
}
this._setTitle(),
this.auth = s.get()
},
setLanguage: function(e) {
i.setLang(e),
this._setTitle(),
r.put(this.defaults.langStorageKey, e)
}
});
return u
}),
define("api/helpers/fileUrl", ["underscore", "./encoding"], function(e, t) {
return function(n, r) {
var i = t.urlDecode(n.split("/").pop()) || r;
return function() {
var t = e.escape(e.isFunction(i) ? i() : i);
return ['<a href="#$' + n + '">', t, "</a>"].join("")
}
}
}),
define("api/main", ["underscore", "./apiWrapper", "./models/fileModel", "./collections/zones", "./models/zoneModel", "./router", "./helpers/encoding", "./helpers/filegroups", "./helpers/fileUrl"], function(e, t, n, r, i, s, o, u, a) {
return e.extend(new t, {
FileModel: n,
ZonesCollection: r,
ZoneModel: i,
Router: s,
Encoding: o,
Filegroups: u,
fileUrl: a
})
}),
define("api", ["api/main"], function(e) {
return e
}),
define("api/helpers/base64", [], function() {
function t(t) {
if (/([^\u0000-\u00ff])/.test(t))
throw new Error("Can't base64 encode non-ASCII characters.");
var n = 0, r, i, s, o = [];
while (n < t.length) {
r = t.charCodeAt(n),
s = n % 3;
switch (s) {
case 0:
o.push(e.charAt(r >> 2));
break;
case 1:
o.push(e.charAt((i & 3) << 4 | r >> 4));
break;
case 2:
o.push(e.charAt((i & 15) << 2 | r >> 6)),
o.push(e.charAt(r & 63))
}
i = r,
n++
}
return s === 0 ? (o.push(e.charAt((i & 3) << 4)),
o.push("==")) : s === 1 && (o.push(e.charAt((i & 15) << 2)),
o.push("=")),
o.join("")
}
function n(t) {
t = t.replace(/\s/g, "");
if (!r(t))
throw new Error("Not a base64-encoded string.");
var n, i, s, o = 0, u = [];
t = t.replace(/\=/g, "");
while (o < t.length) {
n = e.indexOf(t.charAt(o)),
s = o % 4;
switch (s) {
case 1:
u.push(String.fromCharCode(i << 2 | n >> 4));
break;
case 2:
u.push(String.fromCharCode((i & 15) << 4 | n >> 2));
break;
case 3:
u.push(String.fromCharCode((i & 3) << 6 | n))
}
i = n,
o++
}
return u.join("")
}
function r(e) {
return typeof e == "string" && e.length % 4 === 0 && /^[a-z0-9+/\s]+\={0,2}$/i.test(e)
}
var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
return {
encode: t,
decode: n,
isValid: r
}
}),
define("tracker/main", ["underscore", "lang", "modules/configInst"], function(e, t, n) {
function r() {
function i() {
var e = window.location.href.split("#");
e = e.length > 1 ? e[1] : "";
var t;
switch (!0) {
case /^\$/.test(e):
t = "files";
break;
case /^shares$/.test(e):
t = "shares";
break;
case /^downloads$/.test(e):
t = "downloads";
break;
case /^login$/.test(e):
t = "login";
break;
case /^password$/.test(e):
t = "password";
break;
default:
t = "unknown"
}
return t
}
function s(s) {
if (!n.get("hasTracking"))
return;
if (!s)
throw new Error("track() must have an object to track as parameter");
var o = n.get("app");
e.extend(s, {
namespace: o.name,
version: o.version,
lang: t.getLang(),
page: i()
}),
r.length && e.each(r, function(e) {
"track"in e && e.track(s)
})
}
function o(e) {
r.push(e)
}
function u() {
r = []
}
var r = [];
this.track = s,
this.addAdapter = o,
this.clear = u
}
return new r
}),
define("tracker", ["tracker/main"], function(e) {
return e
}),
define("mixins/trackable", ["underscore", "backbone", "tracker"], function(e, t, n) {
var r = {
bind: function(i, s) {
function a() {
n.track(o())
}
var o, u;
if (!i || !(i instanceof t.View))
throw new Error("first argument needs to be a Backbone view.");
if (!e.isObject(s))
throw new Error("options has to be an object.");
o = s.data,
e.isFunction(o) || (o = e.constant(o)),
u = s.event,
u && i.on(u, a, r),
i.track = a
},
unbind: function(e) {
e.off(null, null, r),
delete e.track
}
};
return r
}),
define("actionManager/actionManager", ["underscore", "base"], function(e, t) {
return t.Object.extend({
initialize: function() {
this.actions = {}
},
register: function(e, t, n) {
if (this.isRegistered(e))
throw new Error('an action with the name "' + e + '" is already registered.');
this.actions[e] = {
callback: t,
config: n,
state: {
"": !0
}
}
},
unregister: function(e) {
this._ensureActionIsRegistered(e),
delete this.actions[e],
this.off("state:" + e)
},
isRegistered: function(e) {
return this.actions.hasOwnProperty(this._parseName(e).name)
},
execute: function(t) {
var n = this._parseName(t), r = e.rest(arguments), i;
return this._ensureActionIsRegistered(n.name),
i = this.actions[n.name],
typeof i.config != "undefined" && (r = r.concat([i.config])),
this.trigger("execute", n.name),
i.callback.apply(i.callback, r)
},
getState: function(e) {
var t = this._parseName(e), n;
return this._ensureActionIsRegistered(t.name),
n = this.actions[t.name].state,
t.namespace in n || (n[t.namespace] = n[""]),
n[t.namespace]
},
setState: function(t, n) {
var r = this._parseName(t), i;
this._ensureActionIsRegistered(r.name),
r.namespace === "*" ? (i = e.keys(this.actions[r.name].state),
e.each(i, function(e) {
this._setNamespaceState(r.name, e, n)
}, this)) : this._setNamespaceState(r.name, r.namespace, n)
},
registerAll: function(t) {
e.each(t, e.bind(function(e, t) {
this.register(t, e.callback, e.config)
}, this))
},
_setNamespaceState: function(e, t, n) {
var r = this.actions[e].state
, i = e + (t === "" ? "" : ":" + t);
n = !!n;
if (!(t in r) || r[t] !== n)
r[t] = n,
this.trigger("state:" + i, n)
},
_ensureActionIsRegistered: function(e) {
if (!this.isRegistered(e))
throw new Error('no action with the name "' + e + '" is registered.')
},
_parseName: function(e) {
var t = e.indexOf(":")
, n = t > -1;
return {
name: n ? e.substr(0, t) : e,
namespace: n ? e.substr(t + 1) : ""
}
}
})
}),
define("actionManager/main", ["./actionManager"], function(e) {
return new e
}),
define("actionManager", ["actionManager/main"], function(e) {
return e
}),
define("gui/activatable", ["underscore", "backbone", "mixins/trackable", "actionManager"], function(e, t, n, r) {
return t.View.extend({
events: {
click: "_onClick"
},
constructor: function(i) {
i = e.isObject(i) ? i : {},
this.hasAction = !1,
this.hasTracking = !1,
e.has(i, "action") && r.isRegistered(i.action) && (this.hasAction = !0,
this.action = i.action,
e.has(i, "actionData") && (this.actionData = i.actionData),
this.listenTo(r, "state:" + this.action, this.onActionState)),
e.has(i, "tracking") && (n.bind(this, {
data: i.tracking,
event: "executed"
}),
this.hasTracking = !0),
t.View.call(this, i)
},
remove: function() {
return this.hasTracking && n.unbind(this),
t.View.prototype.remove.call(this)
},
execute: function() {
if (this.hasAction && this.getActionState()) {
if (e.isUndefined(this.actionData))
r.execute(this.action);
else {
var t = e.result(this, "actionData");
r.execute(this.action, t)
}
this.trigger("executed")
}
},
getActionState: function() {
return this.hasAction ? r.getState(this.action) : undefined
},
onActionState: function(e) {
this.trigger("state", e)
},
_onClick: function(e) {
this.execute(),
this.trigger("click", e)
}
})
}),
define("gui/button/button", ["underscore", "../activatable"], function(e, t) {
return t.extend({
tagName: "button",
defaults: {
secondary: !1,
alternative: !1
},
_labelTpl: e.template('<span class="label"><%- str %></span>'),
initialize: function(t) {
this.config = e.extend({}, this.defaults, t),
this.listenTo(this, "state", this.setState)
},
setText: function(e) {
return this.config.text = e,
this.render(),
this
},
setState: function(e) {
this.$el.toggleClass("sj-button-disabled", !e),
this.$el.prop("disabled", !e)
},
disable: function() {
return this.setState(!1),
this
},
isDisabled: function() {
return this.$el.hasClass("sj-button-disabled")
},
enable: function() {
return this.setState(!0),
this
},
render: function() {
return this.$el.empty().addClass("sj-button").addClass(this.config.className).toggleClass("secondary", this.config.secondary).toggleClass("alternative", this.config.alternative).prepend(this._labelTpl({
str: e.result(this.config, "text")
})).attr("title", this.config.text),
this.hasAction ? this.setState(this.getActionState()) : this.setState(!this.config.disabled),
this.delegateEvents(),
this
}
})
}),
define("z-index-mgr", [], function() {
var e = 42;
return function() {
return e++
}
}),
define("gui/overlay/views/overlayManager", ["underscore", "base"], function(e, t) {
var n = t.Object.extend({
initialize: function() {
this._overlaysOpened = 0
},
push: function() {
this._overlaysOpened++,
this.trigger("pushed"),
this._overlaysOpened === 1 && this.trigger("pushed:first")
},
pop: function() {
if (this._overlaysOpened === 0)
throw new Error("OverlayManager.pop() called while there aren't any open overlays?!");
this._overlaysOpened--,
this.trigger("popped"),
this._overlaysOpened === 0 && this.trigger("popped:last")
}
});
return n.instance = function() {
return n._instance || (n._instance = new n),
n._instance
}
,
n
}),
define("text!gui/overlay/views/overlayView.html", [], function() {
return '<% if (options.isModal) { %>\n <div class="sj-overlay-cover"></div>\n<% } %>\n<div class="sj-overlay-helper"></div>\n<div class="sj-overlay-content">\n <% if (options.canClose) { %>\n <span data-action="close-overlay" class="sj-overlay-close icon-overlay-close"></span>\n <% } %>\n <div class="sj-overlay-body">\n\n </div>\n</div>\n<div class="sj-overlay-helper"></div>\n'
}),
define("gui/overlay/views/overlayView", ["jquery", "backbone", "underscore", "z-index-mgr", "./overlayManager", "text!./overlayView.html"], function(e, t, n, r, i, s) {
return t.View.extend({
overlayClasses: "sj-overlay dialog-overlay",
events: {
"click .sj-overlay-close": "onClose"
},
defaults: {
canClose: !0,
isModal: !0
},
initialize: function(e) {
var t = n.omit(e, "ContentViewClass", "ContentViewOptions")
, r = e.ContentViewOptions || {};
this.options = n.extend({}, this.defaults, t),
this.contentView = new e.ContentViewClass(r),
this.listenTo(this.contentView, "all", this.trigger),
this.listenTo(this.contentView, "close-self", this.remove)
},
remove: function() {
return this.contentView.remove(),
t.View.prototype.remove.call(this),
this._overlayPushed && (i.instance().pop(),
this._overlayPushed = !1),
this.trigger("removed"),
this
},
render: function() {
return this.$el.html(n.template(s)({
options: this.options
})),
this.$el.addClass(this.overlayClasses),
this.$el.css("z-index", r()),
this.$content = this.contentView.render().$el,
this.$(".sj-overlay-body").append(this.$content),
this._overlayPushed || (i.instance().push(),
this._overlayPushed = !0),
this.trigger("rendered"),
this
},
onClose: function() {
n.isFunction(this.contentView.onBeforeClose) && this.contentView.onBeforeClose(),
this.remove()
}
})
}),
define("text!gui/overlay/views/error.html", [], function() {
return '<span class="icon icon-overlay-error"></span>\n<p><%= message %></p>\n<div class="ok-button-target"></div>\n'
}),
define("gui/overlay/views/baseOverlayView", ["jquery", "underscore", "backbone", "base", "z-index-mgr", "gui/button/button", "./overlayManager", "./overlayView", "text!./overlayView.html", "text!./error.html"], function(e, t, n, r, i, s, o, u, a, f) {
return n.View.extend({
overlayClasses: "sj-overlay dialog-overlay",
overlayTemplate: t.template(a),
overlayContentContainer: ".sj-overlay-body",
canClose: !0,
isModal: !0,
resultPromise: null,
constructor: function() {
this._createOverlayElement(),
n.View.prototype.constructor.apply(this, arguments)
},
templateData: function() {
return {
options: {
canClose: this.canClose,
isModal: this.isModal
}
}
},
open: function() {
var n = t.result(this, "templateData", {});
return this.$overlayEl.html(this.overlayTemplate(n)).css("z-index", i()).appendTo("body"),
this.render().$el.appendTo(this.$overlayEl.find(this.overlayContentContainer)),
this._overlayPushed || (o.instance().push(),
this._overlayPushed = !0),
this.trigger("opened"),
this.onAfterOpen(),
this.resultPromise = e.Deferred(),
this.resultPromise.promise()
},
onAfterOpen: function() {},
close: function() {
t.isFunction(this.onBeforeClose) && this.onBeforeClose.apply(this, arguments),
this._overlayPushed && (o.instance().pop(),
this._overlayPushed = !1),
this.remove(),
this.resultPromise && this.resultPromise.resolve.apply(this.resultPromise, arguments)
},
setVisible: function(e) {
this.$overlayEl.toggleClass("sj-overlay-hidden", !e)
},
showError: function(e) {
var n = new r.View({
className: "sj-overlay-error",
template: t.template(f),
templateData: {
message: e.message
},
subviews: {
okButton: {
klass: s,
target: ".ok-button-target",
options: {
text: e.okButtonText
},
listeners: {
click: function() {
n.remove()
}
}
}
}
});
this.$overlayEl.find(".sj-overlay-content").append(n.render().$el)
},
remove: function() {
return this.$overlayEl.remove(),
n.View.prototype.remove.call(this),
this.trigger("removed"),
this
},
_createOverlayElement: function() {
this.$overlayEl = e("<div/>").addClass(this.overlayClasses).on("click", "[data-action~='close-overlay']", t.bind(this._onCloseOverlay, this))
},
_onCloseOverlay: function() {
this.close()
}
})
}),
define("text!templates/gui/overlay/confirm.html", [], function() {
return '<span class="overlay-text"><%= message %></span>\n<div class="overlay-buttons">\n <span class="cancel-target"></span>\n <span class="ok-target"></span>\n</div>\n'
}),
define("gui/overlay/views/confirmOverlayView", ["underscore", "lang", "gui/button/button", "./baseOverlayView", "text!templates/gui/overlay/confirm.html"], function(e, t, n, r, i) {
return r.extend({
template: e.template(i),
initialize: function(e) {
this.data = e,
this.okButton = new n({
className: "confirm-overlay-ok",
text: this.data.okButtonText || t.get("confirm.ok")
}),
this.listenTo(this.okButton, "click", this.onOk),
this.cancelButton = new n({
className: "confirm-overlay-cancel",
text: this.data.cancelButtonText || t.get("confirm.cancel"),
secondary: !0
}),
this.listenTo(this.cancelButton, "click", this.onCancel)
},
render: function() {
this.$overlayEl.addClass("confirm-overlay"),
this.$el.html(this.template({
message: e.result(this.data, "message"),
title: e.result(this.data, "title")
}));
var t = this.$(".ok-target");
t.length && t.replaceWith(this.okButton.render().$el);
var n = this.$(".cancel-target");
return n.length && n.replaceWith(this.cancelButton.render().$el),
this
},
remove: function() {
return this.okButton.remove(),
this.cancelButton.remove(),
r.prototype.remove.apply(this, arguments)
},
onOk: function() {
this.close(!0)
},
onCancel: function() {
this.close(!1)
}
})
}),
define("text!templates/gui/overlay/alert.html", [], function() {
return '<span class="overlay-text"><%= message %></span>\n<div class="overlay-buttons">\n <span class="ok-target"></span>\n</div>\n'
}),
define("gui/overlay/views/alertOverlayView", ["underscore", "lang", "gui/button/button", "./baseOverlayView", "text!templates/gui/overlay/alert.html"], function(e, t, n, r, i) {
return r.extend({
template: e.template(i),
initialize: function(e) {
this.data = e,
this.okButton = new n({
className: "alert-overlay-ok",
text: this.data.buttonText || t.get("confirm.ok")
}),
this.listenTo(this.okButton, "click", this.onOk)
},
render: function() {
this.$overlayEl.addClass("alert-overlay"),
this.$el.html(this.template({
title: e.result(this.data, "title"),
message: e.result(this.data, "message")
}));
var t = this.$(".ok-target");
return t.length && t.replaceWith(this.okButton.render().$el),
this
},
remove: function() {
return this.okButton.remove(),
r.prototype.remove.apply(this, arguments)
},
onOk: function() {
this.close(!0)
}
})
}),
define("dialogs", ["underscore", "gui/overlay/views/confirmOverlayView", "gui/overlay/views/alertOverlayView"], function(e, t, n) {
return {
confirm: function(n) {
if (!e.isObject(n) || !n.message)
throw new Error("No message for the confirm-dialog was provided.");
var r = e.pick(n, "message", "title", "okButtonText", "cancelButtonText");
return (new t(r)).open()
},
alert: function(t) {
var r = e.pick(t, "title", "message", "buttonText");
if (!r.message)
throw new Error("No message for the alert-dialog was provided.");
return (new n(r)).open()
}
}
}),
define("text!views/login.html", [], function() {
return '<form class="password-dialog">\n <div class="label">\n <h2 class="password-header"><%= lang.get("login.header", shareName) %></h2>\n <% if (error) { %>\n <span class="error sj-selectable">\n <%= error %>\n </span>\n <% } %>\n </div>\n <div class="input">\n <div class="input-field">\n <input class="password-value" id="password" name="password" type="password" placeholder="<%= lang.get("login.passwordLabel") %>">\n </div>\n <button href="javascript:void(0);" class="sj-button password-accept" type="submit"><%= lang.get("login.accept") %></button>\n </div>\n</form>\n'
}),
function(e) {
define("jquery-watermark", ["jquery"], function() {
return function() {
(function(e) {
var t = /MSIE [1-7]\./.test(navigator.userAgent);
e.watermarker = function() {}
,
e.extend(e.watermarker, {
defaults: {
left: 0,
top: 0,
fallback: !1,
animDuration: 300,
minOpacity: 1
},
setDefaults: function(t) {
e.extend(e.watermarker.defaults, t)
},
checkVal: function(t, n) {
return t.length === 0 ? e(n).show() : e(n).hide(),
t.length > 0
},
html5_support: function() {
var e = document.createElement("input");
return "placeholder"in e
},
fallbackNot: function(e) {
if (e)
return e.test(navigator.userAgent)
}
}),
e.fn.watermark = function(n, r) {
return r || (r = n,
n = undefined),
r = e.extend({}, e.watermarker.defaults, r),
e.watermarker.fallbackNot(r.fallbackNot) && delete r.fallback,
r.fallback && e.watermarker.html5_support() ? this : (this.filter("textarea, input:not(:checkbox,:radio,:file,:submit,:reset)").each(function() {
var i, s, o, u, a, f, l, c = 0, h;
i = e(this),
f = i.attr("id");
if (i.attr("data-jq-watermark") === "processed")
return;
s = i.attr("placeholder") !== undefined && i.attr("placeholder") !== "" ? "placeholder" : "title",
o = n === undefined || n === "" ? i.attr(s) : n,
u = e('<span class="watermark_container"></span>').addClass(i.attr("class")),
a = e('<label class="watermark" for="' + f + '">').text(o),
s === "placeholder" && i.removeAttr("placeholder"),
u.css({
display: "inline-block",
position: "relative"
}),
i.attr("data-percent-width") === "true" && u.css("width", "100%"),
i.attr("data-percent-height") === "true" && u.css("height", "100%"),
t && u.css({
zoom: 1,
display: "inline"
}),
i.wrap(u).attr("data-jq-watermark", "processed"),
a.css({
position: "absolute",
display: "block",
textAlign: "left",
pointerEvents: "none",
whiteSpace: "pre-line"
}),
e.watermarker.checkVal(i.val(), a),
f || a.data("jq_watermark_element", i).click(function() {
e(e(this).data("jq_watermark_element")).trigger("click").trigger("focus")
}),
i.before(a).on("focus.jq_watermark", function() {
e.watermarker.checkVal(e(this).val(), a) || a.stop().fadeTo(r.animDuration, r.minOpacity)
}).on("blur.jq_watermark change.jq_watermark input.jq_watermark", function() {
e.watermarker.checkVal(e(this).val(), a) || a.stop().fadeTo(r.animDuration, 1)
}).on("keydown.jq_watermark paste.jq_watermark", function(t) {
e(a).hide()
}).on("keyup.jq_watermark", function(t) {
e.watermarker.checkVal(e(this).val(), a)
})
}),
this)
}
,
e(function() {
e(".jq_watermark").watermark()
})
})(jQuery)
}
.apply(e, arguments)
})
}(this),
define("views/login", ["underscore", "backbone", "lang", "text!./login.html", "jquery-watermark"], function(e, t, n, r, i) {
return t.View.extend({
className: "password-page",
template: e.template(r),
events: {
submit: "login"
},
initialize: function(e) {
this.loginCallback = e.loginCallback
},
_disableSubmitBtn: function() {
this.$('button[type="submit"]').attr("disabled", "")
},
render: function(e) {
var t, r;
return e && (t = e.error),
!t || (t === "empty" ? r = n.get("error.password_empty") : t === "expired" ? r = n.get("error.expired") : t === "password" ? r = n.get("error.password") : r = n.get("error.500")),
this.$el.html(this.template({
lang: n,
shareName: "???",
error: r
})),
this.$(".password-value").watermark(),
this
},
login: function(t) {
t.preventDefault(),
this._disableSubmitBtn();
var n = this.$("#password").val();
n === "" ? this.render({
error: "empty"
}) : e.isFunction(this.loginCallback) && this.loginCallback({
password: n
})
}
})
}),
define("text!views/loadingView.html", [], function() {
return '<span class="loading"></span>\n'
}),
define("views/loadingView", ["underscore", "backbone", "text!./loadingView.html"], function(e, t, n) {
return t.View.extend({
className: "loading-page",
template: e.template(n),
render: function() {
return this.$el.html(this.template()),
this
}
})
}),
define("text!templates/httpErrorView.html", [], function() {
return '<span class="error-<%= mappedCode %>"></span><%= message %>\n'
}),
define("modules/httpErrorView", ["underscore", "backbone", "lang", "text!templates/httpErrorView.html"], function(e, t, n, r) {
return t.View.extend({
className: "error-page",
template: e.template(r),
defaults: {
errorCode: 500
},
render: function(e) {
e || (e = {
code: this.defaults.errorCode
});
var t = e.code, r = {
400: [n.get("error.404"), 404],
401: [n.get("error.401"), 500],
403: [n.get("error.403"), 500],
404: [n.get("error.404"), 404],
410: [n.get("error.410"), 410],
500: [n.get("error.500"), 500],
503: [n.get("error.503"), 500]
}, i, s;
return r[t] || (t = this.defaults.errorCode),
i = r[t][0],
s = r[t][1],
this.$el.html(this.template({
code: t,
message: i,
mappedCode: s
})),
this
}
})
}),
define("text!views/encryptedView.html", [], function() {
return '<span class="encrypted"></span><%= lang.get("encrypted.main") %>\n'
}),
define("views/encryptedView", ["underscore", "backbone", "lang", "text!./encryptedView.html"], function(e, t, n, r) {
return t.View.extend({
className: "encrypted-page sj-selectable",
template: e.template(r),
render: function() {
return this.$el.html(this.template({
lang: n
})),
this
}
})
}),
define("text!views/teaser.html", [], function() {
return '<%= lang.get("teaser.text", tpl) %>\n<a class="register-button" href="<%= lang.get(\'teaser.register.url\') %>">\n <span class="icon-teaser-register"></span>\n <span class="label"><%= lang.get("teaser.register.text") %></span>\n</a>\n'
}),
define("text!views/logo.html", [], function() {
return '<span class="logo-text1"><%= lang.get("tmcshare.logo.text1") %></span><span class="logo-text2"><%= lang.get("tmcshare.logo.text2") %></span>\n'
}),
define("views/teaser", ["underscore", "backbone", "lang", "text!./teaser.html", "text!./logo.html"], function(e, t, n, r, i) {
return t.View.extend({
className: "teaser sj-selectable",
_template: e.template(r),
_logoTemplate: e.template(i),
initialize: function() {},
render: function() {
return this.$el.html(this._template({
lang: n,
tpl: this._logoTemplate({
lang: n
})
})),
this
}
})
}),
define("gui/button/iconButton", ["underscore", "backbone", "./button"], function(e, t, n) {
return n.extend({
tagName: t.View.prototype.tagName,
defaults: e.extend({
iconClass: ""
}, n.prototype.defaults),
inputType: "button",
render: function() {
return n.prototype.render.apply(this, arguments),
this.$el.addClass("sj-icon-button icon-container").prepend('<span class="' + ("icon " + this.config.iconClass).trim() + '">'),
this
}
})
}),
define("gui/dropdown/simple", ["jquery", "underscore", "backbone"], function(e, t, n) {
return n.View.extend({
tagName: "select",
className: "sj-simpleDropdown",
events: {
change: "_onChange"
},
initialize: function(e) {
if (t.isUndefined(e) && !t.isObject(e))
throw new Error("opts required for SimpleDropdown");
if (!t.isArray(e.items) || !e.items.length)
throw new Error("items required for SimpleDropdown");
this.items = e.items,
!t.isUndefined(e.initialValue) && t.findWhere(this.items, {
value: e.initialValue
}) ? this.initialValue = e.initialValue : this.initialValue = this.items[0].value
},
getValue: function() {
return this.$el.val()
},
setValue: function(t) {
var n = this.$("option").filter(function() {
return e(this).attr("value") === t
});
return n.length === 1 && this.getValue() !== t && !this.isDisabledValue(t) && (this.$el.val(t),
this._onChange()),
this.getValue()
},
_setDisabled: function(e, n) {
t.isArray(e) || (e = [e]);
var r = t.filter(this.items, function(t) {
return e.indexOf(t.value) > -1
}, this);
return t.each(r, function(e) {
this.$el.find("[value='" + e.value + "']").prop("disabled", n)
}, this),
t.pluck(r, "value")
},
_setNextPossibleValue: function() {
var e = this.$(":selected");
e.is(":disabled") && this.setValue(this.$("option").not(":disabled")[0].value)
},
disableValues: function(e) {
var t = this._setDisabled(e, !0);
return this._setNextPossibleValue(),
t
},
enableValues: function(e) {
return this._setDisabled(e, !1)
},
isDisabledValue: function(t) {
var n = this.$("option").filter(function() {
return e(this).attr("value") === t
});
return n.is(":disabled")
},
isDirty: function() {
return this.getValue() !== this.initialValue
},
render: function() {
return this.$el.empty(),
t.each(this.items, function(e) {
this.$el.append('<option value="' + t.escape(e.value) + '">' + t.escape(e.text) + "</option>")
}, this),
this.$el.val(this.initialValue),
this
},
_onChange: function() {
this.trigger("change", this.getValue())
}
})
}),
define("gui/grid/models/item", ["backbone"], function(e) {
return e.Model.extend({})
}),
define("gui/grid/collections/items", ["backbone", "../models/item"], function(e, t) {
return e.Collection.extend({
model: t
})
}),
define("gui/grid/views/itemView", ["underscore", "backbone", "lang", "formatters", "api"], function(e, t, n, r, i) {
return t.View.extend({
className: "sj-item",
template: e.template(""),
initialize: function(e) {
e = e || {},
e.template && (this.template = e.template),
e.dragdropEnabled && (this.dragdropEnabled = e.dragdropEnabled),
this.$el.data("mid", this.model.id)
},
render: function() {
return this.el.innerHTML = this.template(this.templateData()),
this
},
templateData: function() {
return {
model: this.model,
_: e,
lang: n,
formatters: r,
API: i
}
}
})
}),
define("gui/grid/views/emptyView", ["underscore", "backbone", "lang"], function(e, t, n) {
return t.View.extend({
className: "empty-view",
template: function() {},
render: function() {
return this.$el.html(this.template({
lang: n
})),
this
}
})
}),
define("gui/grid/views/headerView", ["underscore", "jquery", "backbone", "lang"], function(e, t, n, r) {
var i = n.View.extend({
className: "sj-item",
events: {
"click .sortable": "onSortClick"
},
template: t.noop,
initialize: function(t) {
this.sortableCollection() && this.listenTo(this.collection, "sortBy", this.onSort),
t && t.template && (this.template = e.template(t.template))
},
sortableCollection: function() {
return this.collection && this.collection.sortable && this.collection.sortable.sortBy
},
onSortClick: function(e) {
if (this.sortableCollection()) {
var n = t(e.currentTarget)
, r = n.attr("data-field")
, i = n.hasClass("asc") ? "desc" : "asc";
this.collection.sortable.sortBy(r, i)
}
},
onSort: function(e, t) {
this.$(".sortable").removeClass("sorted").removeClass("asc desc").filter('[data-field="' + e + '"]').addClass("sorted").addClass(t)
},
render: function() {
var t = this.sortableCollection();
return this.$el.html(this.template({
_: e,
lang: r,
sortable: t
})),
t && this.onSort(this.collection.sortable.getKey(), this.collection.sortable.getDir()),
this.delegateEvents(),
this
}
});
return i
}),
define("isTouchDevice", [], function() {
return "ontouchstart"in document.documentElement || "onmspointerdown"in document.documentElement || "onpointerdown"in document.documentElement
}),
define("mixins/droppable", ["underscore", "jquery", "backbone"], function(e, t, n) {
function r(e) {
try {
if (e.relatedTarget.nodeType === 3 && e.relatedTarget.parentNode === e.target)
return !1
} catch (t) {}
return e.target !== e.relatedTarget
}
function i(e, n, r, i) {
var s = n;
while (s && s.nodeType === 1) {
if (t.find.matchesSelector(s, r) && i(s))
return s;
s = s !== e ? s.parentNode : null
}
return null
}
function s(e) {
return ".droppable-" + e.cid
}
return {
bind: function(t, o) {
function c(e) {
f && (l && l !== "none" && (e.originalEvent.dataTransfer.dropEffect = l),
e.preventDefault(),
e.stopPropagation())
}
function h() {
a = [],
f = null
}
function p(n, r) {
if (e.has(o, "eventData")) {
var i = o.eventData.call(t, f, r);
t.trigger(n, f, r, i)
} else
t.trigger(n, f, r)
}
var u, a, f, l;
if (!t || !(t instanceof n.View))
throw new Error("first argument needs to be a Backbone view.");
if (!e.isUndefined(o) && !e.isObject(o))
throw new Error("options has to be an object.");
u = s(t),
o = e.extend({
targetSelector: "",
canDrop: !0
}, o),
e.isFunction(o.canDrop) || (o.canDrop = e.constant(o.canDrop)),
e.has(o, "eventData") && (e.isFunction(o.eventData) || (o.eventData = e.constant(o.eventData))),
h(),
t.$el.on("dragenter" + u, function(n) {
if (!r(n))
return;
a.length === 0 && t.trigger("drag:enter"),
e.contains(a, n.target) || a.push(n.target);
var s = n.originalEvent.dataTransfer
, u = function(e) {
return !!o.canDrop.call(t, e, s)
}
, h = i(t.el, n.target, o.targetSelector, u);
f !== h && (f = h,
p("drag:over", s),
l = s.dropEffect),
c(n)
}),
t.$el.on("dragleave" + u, function(n) {
if (!r(n))
return;
a = e.without(a, n.target),
a.length === 0 && (h(),
t.trigger("drag:leave"))
}),
t.$el.on("dragover" + u, c),
t.$el.on("drop" + u, function(e) {
f && (e.stopPropagation(),
e.preventDefault(),
p("drop", e.originalEvent.dataTransfer)),
h(),
t.trigger("drag:leave")
})
},
unbind: function(e) {
e.$el.off(s(e))
}
}
}),
define("gui/grid/views/gridView", ["jquery", "underscore", "backbone", "./itemView", "./emptyView", "./headerView", "isTouchDevice", "mixins/droppable", "tracker"], function(e, t, n, r, i, s, o, u, a) {
function l() {}
var f = 201;
return n.View.extend({
className: "sj-grid-wrapper",
itemViewClass: r,
itemViewOpts: {},
emptyViewClass: i,
headerViewClass: s,
itemViews: null,
events: {
click: "delegateEvent",
"click .content .sj-item .selecticon": "select",
"click .content .sj-item": "delegateEvent",
"longpress .content .sj-item": "delegateEvent",
"touchstart .content .sj-item .selecticon": "selectTouchStart",
"touchstart .content .sj-item": "touchstart",
"touchend .content .sj-item .selecticon": "prevent",
"touchend .content .sj-item": "touchend",
"touchmove .content .sj-item": "touchmove",
"MSPointerDown .content .sj-item .selecticon": "selectTouchStart",
"MSPointerDown .content .sj-item": "touchstart",
"MSPointerMove .content .sj-item": "touchmoveMsPointerMove",
"MSPointerUp .content .sj-item .selecticon": "selectMsPointerUp",
"MSPointerUp .content .sj-item": "touchend",
"pointerdown .content .sj-item .selecticon": "onPointerEvent",
"pointerdown .content .sj-item": "onPointerEvent",
"pointermove .content .sj-item": "onPointerEvent",
"pointerup .content .sj-item .selecticon": "onPointerEvent",
"pointerup .content .sj-item": "onPointerEvent",
contextmenu: "contextmenu",
MSHoldVisual: "prevent",
"dragstart .content .sj-item": "_onDragStart",
"dragend .content": "_onDragEnd"
},
initialize: function(r) {
r = t.extend({}, r),
this.$headerEl = e('<div class="sj-grid header" />'),
this.$contentEl = e('<div class="sj-grid content" />'),
this.itemViews = new n.Collection,
this.dragdropEnabled = !!r.dragdropEnabled,
this.listenTo(this.collection, "add", this._renderOne),
this.listenTo(this.collection, "add:end", this._onAddEnd),
this.listenTo(this.collection, "remove", this.syncItemViewsRemove),
this.listenTo(this.collection, "remove:end", this._onRemoveEnd),
this.listenTo(this.collection, "reset", this.onReset),
this.listenTo(this.collection, "sort", this.syncItemViewsSort),
this._initializeItemViewsComparator(),
r.itemViewClass && (this.itemViewClass = r.itemViewClass),
r.itemTpl && (this.itemViewOpts = {
template: t.template(r.itemTpl)
}),
r.emptyTpl && (this.emptyViewClass = i.extend({
template: t.template(r.emptyTpl)
})),
this.emptyView = new this.emptyViewClass,
this.headerView = new this.headerViewClass({
collection: this.collection,
template: r.headerTpl || null
});
if (t.has(r, "canDrop")) {
var s = r.canDrop;
t.isFunction(s) || (s = t.constant(s)),
u.bind(this, {
targetSelector: ".content, .sj-item",
canDrop: t.bind(function(e, t) {
var n = this.findModelForElement(e);
return s(e, t, n)
}, this),
eventData: t.bind(this.findModelForElement, this)
})
}
return this
},
_initializeItemViewsComparator: function() {
var e = this.collection.comparator;
typeof e == "function" ? this.itemViews.comparator = function(t, n) {
return e(t.get("view").model, n.get("view").model)
}
: this.itemViews.comparator = null
},
_sortItemViews: function() {
this._initializeItemViewsComparator(),
this.itemViews.comparator && this.itemViews.sort()
},
syncItemViewsSort: function() {
this._sortItemViews(),
this._appendAll()
},
syncItemViewsRemove: function(e) {
var t = this.itemViews.get(e.cid);
t.get("view").remove(),
this.itemViews.remove(t),
this._appendEmpty()
},
_onAddEnd: function(e) {
t.each(e, function(e) {
this._renderOne(this.collection.get(e.id))
}, this),
this._appendAll()
},
_onRemoveEnd: function(e) {
var n = [], r;
t.each(e, function(e) {
r = this.itemViews.get(e.cid),
n.push(r),
r.get("view").remove()
}, this),
this.itemViews.remove(n, {
silent: !0
}),
this.itemViews.trigger("remove:end", n),
this._appendEmpty()
},
onReset: function() {
this.emptyView.remove(),
this.itemViews.each(function(e) {
e.get("view").remove()
}, this),
this.itemViews.reset(),
this.render()
},
contextmenu: function(e) {
var t = e.target.className || ""
, n = /sj-grid/.test(t) ? "body" : "item"
, r = this.findModelForElement(e.target);
a.track({
op: "contextmenu",
target: "grid-" + n
}),
r ? this.trigger("contextmenu", e, r) : this.trigger("contextmenu", e),
this.prevent(e)
},
scrollIntoView: function(t) {
var n = this.collection.get(t), r, i, s, o, u;
n && (r = this.getItemViewByModel(n)),
r && (i = e([window, document]).add("body"),
s = r.$el,
o = this.itemViews.first().get("view").$el.offset().top - s.offsetParent().offset().top,
u = s.position().top - o,
e("<div>").css("top", i.scrollTop()).animate({
top: u
}, {
step: function(e) {
i.scrollTop(e)
}
}))
},
onPointerEvent: function() {},
prevent: function(e) {
l("prevent", e),
e.preventDefault(),
e.stopPropagation()
},
delegateEvent: function(e) {
l("delegateEvent", (new Date).getTime(), e, this);
var t = this.findModelForElement(e.currentTarget);
return this.trigger(e.type, t, e),
!1
},
select: function(e) {
l("select", (new Date).getTime(), e, this),
e.preventDefault(),
e.stopPropagation();
var t = this.findModelForElement(e.currentTarget);
return this.trigger("select", t, e),
!1
},
selectTouchStart: function() {
this.touchTime = new Date
},
selectMsPointerUp: function(e) {
l("selectMsPointerUp", e.originalEvent);
var t = e.originalEvent;
t.pointerType === t.MSPOINTER_TYPE_TOUCH && (this.select(e),
e.preventDefault(),
e.stopPropagation())
},
touchstart: function(n) {
l("touchstart", (new Date).getTime(), this.touchTimeout, this),
this.touchTime = new Date,
this.is_ms(n) || (this.touchTimeout = setTimeout(t.bind(function() {
this.touchTimeout ? (l("executing timeout", (new Date).getTime(), this.touchTimeout, this),
e(n.target).trigger("longpress", n),
this.touchTime = null) : l("timeout aborted", (new Date).getTime(), this.touchTimeout, this)
}, this), f),
l("setting new timeout", (new Date).getTime(), this.touchTimeout, this))
},
touchmove: function() {
l("touchmove", (new Date).getTime(), this.touchTimeout, this),
this.touchTimeout && (clearTimeout(this.touchTimeout),
this.touchTimeout = null),
this.touchTime = null
},
touchmoveMsPointerMove: function(e) {
l("MsPointerMove", e)
},
touchend: function(t) {
l("touchend", (new Date).getTime(), this.touchTimeout, this),
this.touchTimeout && (l("timeout aborted touchend", (new Date).getTime(), this.touchTimeout, this),
clearTimeout(this.touchTimeout),
this.touchTimeout = null);
var n = this.touchTime ? (new Date).getTime() - this.touchTime : 0;
if (n && n < f) {
if (!this.is_ms(t) || this.ms_isTouchPointer(t))
l("touchend", "click detected"),
e(t.target).trigger("click", t)
} else
n >= f && (l("touchend", "longpress detected"),
e(t.target).trigger("longpress", t));
this.touchTime = null
},
ms_isTouchPointer: function(e) {
var n = e.originalEvent;
return this.is_ms(e) && t.contains([n.MSPOINTER_TYPE_TOUCH, n.MSPOINTER_TYPE_PEN, "touch", "pen"], n.pointerType)
},
is_ms: function(e) {
var t = e.originalEvent;
return (t || {}).pointerType
},
_appendEmpty: function() {
this.itemViews.length || (this.$contentEl.has(this.emptyView.$el).length || (this.$headerEl.empty(),
this.$contentEl.empty()),
this.$contentEl.append(this.emptyView.render().$el))
},
_appendAll: function() {
this._appendEmpty(),
this.itemViews.length && (this.$contentEl.has(this.emptyView.$el).length && this.emptyView.remove(),
this.$headerEl.append(this.headerView.render().$el),
this.$contentEl.append(t.pluck(this.itemViews.pluck("view"), "$el")))
},
render: function() {
return this.$el.append(this.$headerEl),
this.$el.append(this.$contentEl),
this.itemViews.comparator = null,
this.collection.each(function(e) {
this._renderOne(e)
}, this),
this._sortItemViews(),
this._appendAll(),
this.delegateEvents(),
this
},
_renderOne: function(e) {
this.itemViews.length || this.$contentEl.empty();
var n = t.extend({}, this.itemViewOpts, {
model: e,
dragdropEnabled: this.dragdropEnabled
})
, r = (new this.itemViewClass(n)).render();
this.itemViews.add({
id: e.cid,
view: r
}),
e.selected && r.$el.addClass("selected")
},
getItemViewByModel: function(e) {
var t = this.itemViews.get(e.cid);
return t ? t.get("view") : null
},
findModelForElement: function(n) {
n instanceof e && (n = n.get(0));
if (!n)
return null;
var r = t.find(this.itemViews.pluck("view"), function(e) {
var t = e.el;
return t.parentNode && (t === n || t.contains(n))
});
return r ? r.model : null
},
remove: function() {
this.emptyView.remove(),
this.headerView.remove(),
u.unbind(this),
t.each(this.itemViews.pluck("view"), function(e) {
e.remove()
}),
this.itemViews.reset([], {
silent: !0
}),
n.View.prototype.remove.apply(this)
},
_onDragStart: function(t) {
e(t.target).attr("draggable") && this.trigger("drag:start", t, this.findModelForElement(t.target))
},
_onDragEnd: function(e) {
this.trigger("drag:end", e)
}
})
}),
define("gui/grid/grid", ["jquery", "underscore", "backbone", "./collections/items", "./views/gridView"], function(e, t, n, r, i) {
return function(e) {
return (new i(e)).render()
}
}),
define("modules/helpers/image", ["jquery"], function(e) {
return {
preload: function(t) {
var n = e.Deferred()
, r = new Image;
return r.onload = function() {
r.onload = null,
n.resolve(r)
}
,
r.onerror = n.reject,
r.src = t,
n.promise()
}
}
}),
define("gui/grid/lazyGrid", ["jquery", "underscore", "backbone", "./collections/items", "./views/gridView", "api", "modules/helpers/image"], function(e, t, n, r, i, s, o) {
var u = i.extend({
namespace: null,
container: null,
$container: null,
initialize: function(n) {
i.prototype.initialize.apply(this, arguments),
this._lazyLoad = t.throttle(this._lazyLoad, 750, {
leading: !1,
trailing: !0
}),
this.listenTo(this.collection, "load", this._lazyLoad),
this.listenTo(this.collection, "sort", this._lazyLoad),
this.listenTo(this.collection, "remove:end add:end", this._lazyLoad),
this.listenTo(this.itemViews, "change:load", this.onVisible),
this.listenTo(this, "viewmode", this._lazyLoad),
this.namespace = (new Date).getTime(),
n.container ? e(n.container).length ? this._setContainerAndBind(n.container) : e(this.container).length ? this._setContainerAndBind(this.container) : this.container = n.container : this._setContainerAndBind(window)
},
_setContainerAndBind: function(n) {
this.$container = e(n).on("scroll." + this.namespace + " resize." + this.namespace, t.bind(this._lazyLoad, this))
},
remove: function() {
e(this.$container || this.container || window).off("." + this.namespace),
i.prototype.remove.apply(this, arguments)
},
_lazyLoad: function() {
this.$container || this._setContainerAndBind(this.container);
var e = this.$container.scrollTop()
, t = this.$container.height() + e;
this.itemViews.find(function(n) {
if (n.get("load"))
return !1;
var r = n.get("view").$el
, i = r.position().top - r.parent().position().top
, s = r.height();
return i + s < e ? !1 : i >= t ? !0 : (n.set({
load: !0
}),
!1)
})
},
onVisible: function(e, n, r, i) {
var u = e.get("view")
, a = u.model
, f = i ? i.width : 210
, l = i ? i.height : 210
, c = !i;
a.get("group") === "thumb" && s.getThumbnail(a, {
width: f,
height: l
}).then(t.bind(function(n) {
n && o.preload(n).then(t.bind(function(t) {
this._applyThumbnailImage(e, t, c)
}, this))
}, this))
},
_applyThumbnailImage: function(t, n, r) {
var i = n.width, s = n.height, o = n.src, u = t.get("view").$el, a = e(".itemcontent .file-item-icon", u), f = e("<div />").css("background-image", "url(" + o + ")"), l, c, h, p, d;
u.addClass("isthumbnail"),
r && this._adjustThumbnail(t, f, n, 140, 210),
l = i >= s,
c = i >= 140,
h = i >= 120,
p = s >= 140,
d = s >= 120,
i < 40 && s < 40 ? f.css("background-size", "inherit") : l && p ? f.addClass("m_by") : !l && c ? f.addClass("m_bx") : !l && !c && d ? f.addClass("m_y") : l && !p && h && f.addClass("m_x"),
a.empty().append(f).addClass("file-item-image-preview").removeClass("file-item-image-icon")
},
_loadThumbnail: function(e, t) {
this.onVisible(e, undefined, undefined, t)
},
_adjustThumbnail: function(e, t, n, r, i) {
var s = r
, o = r
, u = "";
n.width === i && n.height < o && (s = Math.ceil(i * o / n.height),
u = s + "px " + o + "px",
this._loadThumbnail(e, {
height: o
})),
n.height === i && n.width < s && (o = Math.ceil(i * s / n.width),
u = s + "px " + o + "px",
this._loadThumbnail(e, {
width: s
})),
u.length && t.css("background-size", u)
}
});
return u
}),
define("text!templates/gui/breadcrumb/breadcrumb.html", [], function() {
return '<%\nif (segments.length> 1) {\n// root\nvar root = segments.shift();\n%>\n <div class="root segment">\n <%\n if (root.icon) {\n %>\n <span class="icon <%= root.icon.className %>" title="<%= root.icon.title %>"></span>\n <%\n }\n %>\n <a href="<%= root.href %>" class="link text" title="<%- root.title %>">\n <%- root.name %>\n </a>\n <% if (segments.length> 0) { %>\n <span class="bg-sprite arrow"></span>\n <% } %>\n </div>\n<% } %>\n\n<div class="inner">\n<%\nvar slength = segments.length -1,\n predecessor;\n_.each(segments.reverse(), function(segment, index) {\n var current = !index,\n last = slength == index;\n // to generate the ...> link\n predecessor = segments[index+1];\n%>\n <div class="segment <% if (current) { print(\'current\'); } else if(last) { print(\'last\'); }%>">\n <% if (!last && predecessor) { %>\n <a href="<%= predecessor.href %>" class="hellip link" title="<%- predecessor.title || predecessor.name %>">&hellip;</a>\n <span class="bg-sprite arrow"></span>\n <% } %>\n <%\n if (segment.icon) {\n %>\n <span class="icon <%= segment.icon.className %>" title="<%= segment.icon.title %>"></span>\n <%\n }\n %>\n <a <% if (!current) { %>href="<%= segment.href %>"<% } %> class="<% if(!current) { %>link<% } %> text" title="<%- segment.title || segment.name %>">\n <%- segment.name %>\n </a>\n </div>\n<%\n});\n%>\n\n</div>\n'
}),
define("gui/breadcrumb/breadcrumb", ["jquery", "underscore.mixin", "backbone", "text!templates/gui/breadcrumb/breadcrumb.html"], function(e, t, n, r) {
return n.View.extend({
className: "sj-breadcrumb",
segments: [],
events: {
"click .link": "_onLinkClick",
"click .icon": "_onIconClick"
},
defaults: {
single_segment_length: 19,
path_max_length: 70,
prefix: ""
},
initialize: function(e) {
this.config = t.extend({}, this.defaults, e)
},
template: t.template([r].join("")),
render: function() {
return this.$el.empty().append(this.template({
segments: t.clone(this.segments)
}, this)),
this
},
_onLinkClick: function(t) {
t.preventDefault();
var n = e(t.target).attr("href"), r = e(t.target).hasClass("level-up"), i;
n || (n = e(t.currentTarget).attr("href"));
if (!n)
return;
r || (r = e(t.currentTarget).hasClass("level-up")),
n = n.replace(this.config.prefix, ""),
i = r ? "breadcrumb-arrow" : "breadcrumb-path",
this.trigger("click", n, i)
},
_onIconClick: function(e) {
this.trigger("iconclick", e)
},
setSegments: function(e) {
return t.each(e, function(e) {
e.href = this.config.prefix + e.href
}, this),
this.segments = e,
this.render()
},
addSegment: function(e) {
return this.segments.push(e),
this.render()
}
})
}),
define("text!gui/toast/views/toastView.html", [], function() {
return '<div class="toast-body sj-selectable">\n <span class="toast-close icon-container">\n <span class="icon-toast-close"></span>\n </span>\n <span class="message"><%= msg %></span>\n</div>\n'
}),
define("gui/toast/views/toastView", ["underscore", "backbone", "jquery", "lang", "z-index-mgr", "text!./toastView.html"], function(e, t, n, r, i, s) {
return t.View.extend({
className: "toast",
events: {
"click .toast-close": "onToastClose",
mouseover: "stopTimeOut",
mouseout: "restartTimeOut"
},
types: ["positive", "negative"],
defaultType: "negative",
initialize: function() {
this.messages = [],
this._currentMessage = null,
this.listenTo(r, "change", this.onLanguageChange)
},
render: function(t) {
if (e.isString(t) || e.isFunction(t))
t = {
msg: t
};
if (e.isUndefined(t.type) || !e.contains(this.types, t.type))
t.type = this.defaultType;
return t = e.defaults(t, {
unescape: !1
}),
this.messages.push(t),
this._renderNext(),
this
},
_renderNext: function() {
delete this._currentMessage;
if (!this.messages.length)
return;
this._timeout || (this._currentMessage = this.messages.shift(),
this._renderBody(),
this._startTimeout(this._currentMessage.type !== this.defaultType ? 3e3 : 11e3))
},
onLanguageChange: function() {
this._renderBody()
},
_renderBody: function() {
var t = this._currentMessage;
if (!t)
return;
var r = e.result(t, "msg");
t.unescape || (r = e.escape(r)),
this.$el.removeClass(this.types.join(" ")).addClass(t.type);
var o = n(e.template(s)({
msg: r
})).hide();
this.$el.css("z-index", i()),
this.$el.prependTo("body").html(o),
this.$(".toast-body").fadeIn(500)
},
_hide: function(e) {
var t = this;
this.$(".toast-body").fadeOut(500, function() {
t.$el.detach(),
e && e()
})
},
stopTimeOut: function() {
clearTimeout(this._timeout),
delete this._timeout
},
restartTimeOut: function() {
this._startTimeout(3e3)
},
onToastClose: function() {
clearTimeout(this._timeout),
delete this._timeout,
this._hideAndContinue()
},
_hideAndContinue: function() {
this._hide(e.bind(function() {
this._renderNext()
}, this))
},
_startTimeout: function(t) {
this._timeout = setTimeout(e.bind(function() {
delete this._timeout,
this._hideAndContinue()
}, this), t)
}
})
}),
define("gui/toast/toast", ["./views/toastView"], function(e) {
return e
}),
define("text!gui/tooltip/views/tooltipView.html", [], function() {
return '<div class="sj-tooltip-body sj-selectable"><%= body %></div>\n<div class="sj-tooltip-tip"></div>\n'
}),
define("gui/tooltip/views/tooltipView", ["jquery", "underscore", "backbone", "z-index-mgr", "text!./tooltipView.html"], function(e, t, n, r, i) {
return n.View.extend({
className: "sj-tooltip",
tpl: t.template(i),
initialize: function(t) {
this._html = t.html,
this._extraClasses = t.extraClasses || "",
this._namespace = String((new Date).getTime()),
this._$relatedEl = e(t.relatedEl)
},
show: function() {
this.$el.css({
"z-index": r()
}),
this.$el.show(),
this.align()
},
hide: function() {
this.$el.hide()
},
render: function() {
return e(window).on("resize." + this._namespace, t.throttle(t.bind(this.align, this), 250)),
this.$el.html(this.tpl({
body: this._html
})).addClass(this._extraClasses),
this.$el.appendTo("body"),
this.hide(),
this
},
align: function() {
if (!this.$el.is(":visible"))
return;
if (!this._$relatedEl.length)
return;
var e = parseInt(this.$el.css("margin-bottom"), 10) || 0
, t = this._$relatedEl.offset();
this.$el.css({
left: t.left,
top: t.top - e - this.$el.height()
});
return
},
remove: function() {
return delete this.$relatedEl,
e(window).off("resize." + this._namespace),
n.View.prototype.remove.call(this),
this
}
})
}),
define("gui/tooltip/tooltip", ["./views/tooltipView"], function(e) {
return e
}),
define("gui/tooltip/views/infoTooltip", ["jquery", "underscore", "backbone", "./tooltipView"], function(e, t, n, r) {
return n.View.extend({
tagName: "span",
className: "sj-info-tooltip",
events: {
click: "_onClick"
},
initialize: function(e) {
this.options = t.extend({}, e),
this._isTooltipVisible = !1,
this.tooltip = new r({
relatedEl: this.$el,
html: this.options.contentHtml
})
},
render: function() {
return this.tooltip.render(),
this.$el.addClass("icon icon-info-tooltip"),
this.options.iconClassname && this.$el.addClass(this.options.iconClassname),
this
},
_onClick: function() {
this._isTooltipVisible || this.tooltipShow()
},
tooltipShow: function() {
e(document).on("click." + this.cid, t.bind(function(t) {
!e(t.target).closest(this.$el).length && !e(t.target).closest(this.tooltip.$el).length && this.tooltipHide()
}, this)),
this.tooltip.show(),
this._isTooltipVisible = !0
},
_unbindDocumentClick: function() {
e(document).off("click." + this.cid)
},
tooltipHide: function() {
this.tooltip.hide(),
this._unbindDocumentClick(),
this._isTooltipVisible = !1
},
remove: function() {
this.tooltip.remove(),
this._unbindDocumentClick(),
n.View.prototype.remove.apply(this)
}
})
}),
define("gui/flyout/views/flyoutView", ["jquery", "backbone"], function(e, t) {
return t.View.extend({
className: "sj-flyout",
initialize: function(e) {
e && e.className && (this.className = e.className)
},
toggle: function() {
this.$el.hasClass("open") ? this.close() : this.open()
},
open: function() {
var t = this;
this.$el.addClass("open"),
e(document).on("mousedown.sj-flyout", function(n) {
e(n.target).closest(t.$el).length || t.close()
})
},
close: function() {
this.$el.removeClass("open"),
e(document).off("mousedown.sj-flyout")
},
render: function() {
return this.triggerView ? this.contentView ? (this.triggerView instanceof t.View ? this.$el.append(this.triggerView.render().$el.addClass("trigger")) : this.$el.append(this.triggerView.addClass("trigger")),
this.$el.append(this.contentView.render().$el),
this) : (console.error("contentView is mandatory"),
this) : (console.error("triggerView is mandatory"),
this)
},
remove: function() {
return this.triggerView && this.triggerView.remove(),
this.contentView && this.contentView.remove(),
t.View.prototype.remove.apply(this, arguments)
}
})
}),
define("gui/flyout/flyout", ["./views/flyoutView"], function(e) {
return e
}),
define("gui/overlay/overlay", ["./views/overlayView"], function(e) {
return e
}),
define("gui/overlay/waitOverlay", ["underscore", "./views/baseOverlayView"], function(e, t) {
var n = t.extend({
defaults: {
message: ""
},
initialize: function(t) {
this.options = e.extend(this.defaults, t)
},
render: function() {
return this.$overlayEl.addClass("sj-wait-overlay sj-selectable"),
this.$el.html('<span class="icon icon-loading"></span><span class="wait-overlay-message">' + this.options.message + "</span>"),
this
}
});
return n
}),
define("gui/editor/views/editor", ["jquery", "underscore", "backbone", "../../tooltip/tooltip", "jquery-watermark"], function(e, t, n, r, i) {
return n.View.extend({
inputTpl: t.template('<input type="text">'),
events: {
"keypress input": "_onKeypress",
"keyup input": "_onKeyup",
focusin: "_onFocusIn",
focusout: "_onFocusOut",
"focus input": "_onFocus",
"blur input": "_onBlur"
},
defaults: {
showValidationErrorIcon: !0,
selectOnFocus: !1,
leftIcon: null,
rightIcon: null
},
initialValue: null,
config: null,
placeholder: null,
initialize: function(n) {
this.config = t.extend({}, this.defaults, n),
this.config.filter && (this.config.filter instanceof RegExp || (this.config.filter = null,
console.error("EditorView expected a regex as filter in constructor config"))),
this.config.filterTooltipHtml && (this._tooltip = (new r({
relatedEl: this.$el,
html: this.config.filterTooltipHtml
})).render()),
this.$input = e(this.inputTpl(this)),
this.config.name && this.$input.attr("name", this.config.name),
this.config.placeholder && (this.placeholder = this.config.placeholder),
this.setValue("", !0)
},
_onKeypress: function(e) {
this.config.filter && this.filterText(e)
},
_onKeyup: function(e) {
e.keyCode === 27 && (this.setValue(this.tempValue),
this.$input.focusout().blur())
},
_onFocusIn: function(n) {
this.trigger("focusIn", n),
this.$el.addClass("sj-editor-focused"),
e(n.target).is("input") && (this.tempValue = this.$input.val()),
this.config.selectOnFocus && t.delay(t.bind(this.setSelection, this))
},
_onFocus: function() {
this.trigger("focus")
},
_onFocusOut: function(e) {
this.trigger("focusOut", e),
this.$el.removeClass("sj-editor-focused"),
t.isFunction(this.config.validationFunc) && this._validateOnBlur()
},
_validateOnBlur: function() {
this.validate(this.getValue())
},
_onBlur: function() {
this.trigger("blur")
},
render: function() {
return this.$el.html(this.$input),
this.delegateEvents(),
this.$el.addClass("sj-editor"),
this.config.leftIcon && this.setLeftIcon(this.config.leftIcon),
this.config.rightIcon && this.setRightIcon(this.config.rightIcon),
this
},
setValue: function(e, n) {
return t.isUndefined(e) && (e = ""),
this.$input.val(e),
n && (this.initialValue = e),
this
},
getValue: function() {
return this.$input.val()
},
setPlaceholder: function(e) {
var t = e || this.placeholder;
if (t) {
var n = this.$input.closest(".watermark_container");
n.length && (n.parent().append(this.$input),
n.remove(),
this.$input.off(".jq_watermark"),
this.$input.removeAttr("data-jq-watermark")),
this.$input.attr("placeholder", t),
this.$input.watermark()
}
},
setLeftIcon: function(t) {
this.$("span.icon:first-child").remove(),
t && (e("<span />").prependTo(this.$el).attr("class", "icon " + t),
this.$el.addClass("sj-editor-icon"))
},
setRightIcon: function(t) {
this.$("span.icon:last-child").remove(),
t && (e("<span />").appendTo(this.$el).attr("class", "icon " + t),
this.$el.addClass("sj-editor-icon"))
},
remove: function() {
return this._tooltip && this._tooltip.remove(),
n.View.prototype.remove.call(this),
this
},
showTooltip: function() {
this._tooltip && this._tooltip.show()
},
hideTooltip: function() {
this._tooltip && this._tooltip.hide()
},
filterText: function(e) {
var t = String.fromCharCode(e.which || e.keyCode);
this.config.filter.test(t) && (e.preventDefault(),
this.trigger("filter:error", t))
},
setSelection: function(e) {
e || (e = this.getValue().length),
this.$el.hasClass("sj-editor-focused") || this.$input.focus(),
this.$input[0].setSelectionRange(0, e)
},
isDirty: function() {
return this.getValue() !== this.initialValue
},
validate: function() {
var n = e.Deferred(), r = this.getValue(), i;
if (this.config.required && r.length === 0)
i = n.reject().promise();
else if (t.isFunction(this.config.validationFunc) && this.isDirty()) {
i = this.config.validationFunc(r, this);
if (!i || !t.isFunction(i.then))
throw new Error("The validation function doesn't return a promise.")
} else
i = n.resolve().promise();
return i.done(t.bind(function() {
this.trigger("validate:success", r),
this.toggleError(!1)
}, this)).fail(t.bind(function() {
this.trigger("validate:error", r),
this.toggleError(!0)
}, this))
},
toggleError: function(e) {
this.$el.toggleClass("error", e),
this.config.showValidationErrorIcon && this.setRightIcon(e ? "icon-validation-error" : null)
},
getInput: function() {
return this.$input
}
})
}),
define("gui/editor/views/inlineEditor", ["underscore", "./editor"], function(e, t) {
return t.extend({
inputTpl: e.template('<textarea rows="1"></textarea>'),
tooltipAutohideTimeout: 3e3,
events: e.extend({}, t.prototype.events, {
"keypress textarea": "_onKeypress",
"click textarea": "_stopPropagation",
"dblclick textarea": "_stopPropagation",
"touchstart textarea": "_stopPropagation",
"touchend textarea": "_stopPropagation",
"longpress textarea": "_stopPropagation",
"mouseup textarea": "_stopPropagation",
"mousedown textarea": "_stopPropagation",
"MSPointerDown textarea": "_stopPropagation",
"MSPointerUp textarea": "_stopPropagation",
"MSHoldVisual textarea": "_stopPropagation",
"pointerup textarea": "_stopPropagation",
"pointerdown textarea": "_stopPropagation",
"contextmenu textarea": "_stopPropagation",
"blur textarea": "_blur",
"focus textarea": "_constrainDimensions",
"keyup textarea": "_keyup",
"paste textarea": "_paste"
}),
initialize: function() {
t.prototype.initialize.apply(this, arguments),
this.config.pasteFilter && (this.config.pasteFilter instanceof RegExp || (this.config.pasteFilter = null,
console.error("Config ignored: 'pasteFilter' config should be a Regular Expression!"))),
this.listenTo(this, "filter:error", this.onFilter)
},
render: function() {
return t.prototype.render.apply(this, arguments),
this.$el.addClass("sj-inline-editor"),
this
},
remove: function() {
return this._tooltip && this._stopTooltipAutohide(),
t.prototype.remove.call(this),
this
},
save: function(e) {
this.trigger("done", e)
},
_paste: function(e) {
var t;
if (!this.config.pasteFilter)
return;
e.preventDefault();
if (e.originalEvent.clipboardData)
t = e.originalEvent.clipboardData.getData("text/plain");
else {
if (!window.clipboardData)
return;
t = window.clipboardData.getData("Text")
}
t = t.replace(this.config.pasteFilter, " "),
this._insert(t),
this.trigger("paste", e)
},
_insert: function(e) {
var t, n, r = this.$input.val(), i = this.$input[0];
t = i.selectionStart,
n = i.selectionEnd,
this.$input.val(r.substring(0, t) + e + r.substring(n)),
i.selectionStart = t + e.length,
i.selectionEnd = t + e.length
},
_onKeypress: function(e) {
e.which === 13 && e.preventDefault(),
t.prototype._onKeypress.apply(this, arguments),
this._constrainDimensions()
},
_constrainDimensions: function() {
var e = this.$input[0];
e.scrollWidth === e.clientWidth && this.$input.css("width", ""),
e.scrollHeight === e.clientHeight && this.$input.css("height", ""),
e.scrollWidth > e.clientWidth && this.$input.css("width", e.scrollWidth),
e.scrollHeight > e.clientHeight && this.$input.css("height", e.scrollHeight)
},
_blur: function(e) {
this.save(e)
},
_stopPropagation: function(e) {
e.stopPropagation()
},
_keyup: function(e) {
e.which === 13 ? this.save(e) : e.which === 27 ? this.trigger("abort", e) : this._constrainDimensions()
},
_stopTooltipAutohide: function() {
this._autoHideTimeout && (clearTimeout(this._autoHideTimeout),
this._autoHideTimeout = null)
},
onFilter: function() {
this.showTooltip(),
this._autoHideTimeout = setTimeout(e.bind(this.hideTooltip, this), this.tooltipAutohideTimeout)
}
})
}),
define("gui/editor/views/textEditor", ["./editor"], function(e) {
return e.extend({
initialize: function(t) {
e.prototype.initialize.apply(this, arguments),
t && (t.readonly && (this.$input.prop("readonly", !0),
this.$el.addClass("sj-text-editor-readonly")),
t.disabled && this.setDisabled(!0))
},
render: function() {
return e.prototype.render.apply(this, arguments),
this.$el.addClass("sj-text-editor"),
this
},
setDisabled: function(e) {
this.$input.prop("disabled", e === !0),
this.$el.toggleClass("sj-text-editor-disabled", e === !0),
e === !0 && this.toggleError(!1)
},
getDisabled: function() {
return this.$input.prop("disabled")
}
})
}),
define("gui/editor/views/passwordEditor", ["underscore", "./textEditor"], function(e, t) {
return t.extend({
initialDisabled: null,
initialize: function(e) {
t.prototype.initialize.apply(this, arguments),
this.$input.attr("type", "password"),
this.initialDisabled = !!e && !!e.disabled
},
isDirty: function() {
var e = t.prototype.isDirty.call(this);
return e || this.initialDisabled !== this.getDisabled()
},
_validateOnBlur: function() {
this.getValue() !== "" ? this.validate(this.getValue()) : this.toggleError(!1)
}
})
}),
define("keycodes/keycodes", ["underscore"], function(e) {
var t = {
shift: [16, !0],
ctrl: [17, !0],
alt: [18, !0],
altGr: [225, !0],
capsLock: [20, !0],
meta1: [91, !0],
meta2: [92, !0],
meta3: [93, !0],
backspace: 8,
tab: 9,
enter: 13,
pause: 19,
escape: 27,
pageUp: 33,
pageDown: 34,
end: 35,
home: 36,
leftArrow: 37,
upArrow: 38,
rightArrow: 39,
downArrow: 40,
insert: 45,
"delete": 46
}
, n = e.chain(t);
return e.extend({
keyCodes: n.map(function(t) {
return e.isArray(t) ? t[0] : t
}).value(),
modifierKeys: n.filter(function(t) {
return e.isArray(t) && t[1]
}).map(function(t) {
return e.isArray(t) ? t[0] : t
}),
scrollKeys: [t.pageUp, t.pageDown, t.end, t.home, t.upArrow, t.downArrow]
}, t)
}),
define("keycodes", ["keycodes/keycodes"], function(e) {
return e
}),
define("gui/editor/views/taglistEditor", ["underscore", "./textEditor", "keycodes", "jquery"], function(e, t, n, r) {
return t.extend({
_tags: undefined,
_separator: /[\s,;]+/,
defaults: e.extend({
submitOnEnter: !0
}, t.prototype.defaults),
events: e.extendEvents({
"keypress input": "_onKeypress",
"keyup .tag button": "onKeyupTag",
"keydown .tag button": "onKeyDownTag",
"keydown input": "_onKeydown",
"click .icon-removetag": "onRemoveTag",
"click .tag": "onClickTag",
click: "onClick",
"focus .tag button": "onFocusButtonTag",
"blur .tag button": "onBlurButtonTag",
"keyup input": "_onKeyup",
"blur input": "_onBlur"
}, t),
initialize: function() {
t.prototype.initialize.apply(this, arguments),
this._tags = [],
this._tagCreationEnabled = !0
},
render: function() {
return t.prototype.render.apply(this, arguments),
this.$el.addClass("taglist"),
e.each(this._tags, e.bind(function(e) {
r(this._tagTpl({
value: e
})).insertBefore(this.$input)
}, this)),
this
},
_tagTpl: e.template('<span class="tag" title="<%- value %>"><button type="button"><%- value %></button><span class="icon-removetag" /></span>'),
setValue: function(t) {
var n, r = this._getEditorValue();
e.isArray(t) || (t = [t]);
do
n = this.$(".tag").first(),
this.removeTag(n);
while (n.length);return t = r.split(this._separator).concat(t),
this._buildTags(t),
this
},
_setEditorValue: function() {
t.prototype.setValue.apply(this, arguments)
},
_getEditorValue: function() {
return t.prototype.getValue.call(this)
},
createTags: function() {
return this._buildTags(this._getEditorValue().split(this._separator))
},
_buildTags: function(t) {
t = e.uniq(e.compact(t)),
this._setEditorValue("");
if (!t.length)
return r.Deferred().resolve().promise();
var n = e.map(t, e.bind(function(t) {
var n = r.Deferred();
return this.validateTag(t).done(e.bind(function() {
this.createTag(t),
n.resolve()
}, this)).fail(e.bind(function() {
n.reject(t)
}, this)),
n
}, this))
, i = r.Deferred()
, s = {
all: n.length,
failed: 0,
done: 0,
notCreatedTags: []
};
return e.each(n, e.bind(function(e) {
e.done(function() {
s.done++
}).fail(function(e) {
s.notCreatedTags.push(e),
s.failed++
})
}, this)),
s.failed ? (this._setEditorValue(s.notCreatedTags.join(" ")),
this.trigger("validate:error"),
this.toggleError(!0),
i.reject(s)) : (this.trigger("validate:success"),
this.toggleError(!1),
i.resolve(s)),
i
},
createTag: function(e) {
var t = !1, n;
return e && this._tags.indexOf(e) < 0 && (this._tags.push(e),
n = this.$input.parent(".watermark_container")[0] || this.$input,
r(this._tagTpl({
value: e
})).insertBefore(n),
this.$el.addClass("has-tags"),
t = !0),
t
},
validateTag: function(t) {
var n = r.Deferred(), i;
return n.done(e.bind(function() {
this.trigger("tag:success", t)
}, this)).fail(e.bind(function() {
this.trigger("tag:error", t)
}, this)),
e.isFunction(this.config.tagValidationFunc) ? (i = this.config.tagValidationFunc(t, this),
i.then && e.isFunction(i.then) ? n = i : i ? n.resolve() : n.reject()) : n.resolve(),
n
},
onKeyDownTag: function(e) {
e.keyCode === n.backspace && e.preventDefault()
},
onKeyupTag: function(e) {
var t = this.$(e.target).closest(".tag");
switch (e.keyCode) {
case n.leftArrow:
t.prev().find("button").focus();
break;
case n.rightArrow:
var r = t.next().find("button");
r = r.length ? r : this.$input,
r.focus();
break;
case n.backspace:
this.removeTag(t.prev(), !0);
break;
case n.delete:
this.removeTag(t, !1);
break;
case n.escape:
this.$(e.target).blur()
}
},
onRemoveTag: function(e) {
this.removeTag(this.$(e.target).closest(".tag"))
},
removeTag: function(e, t) {
if (e.length) {
var n = e.text()
, r = e.next().find("button");
r = r.length ? r : this.$input,
this._tags.splice(this._tags.indexOf(n), 1),
e.remove(),
this.validate(),
r.focus(),
this._tags.length === 0 && this.$el.removeClass("has-tags")
} else
t || this.$input.focus()
},
_onKeydown: function(e) {
if (this._tags.length && !e.shiftKey && (e.keyCode === n.leftArrow || e.keyCode === n.backspace)) {
var t;
if ("selectionStart"in e.target)
t = e.target.selectionStart;
else if (document.selection) {
e.target.focus();
var r = document.selection.createRange()
, i = document.selection.createRange().text.length;
r.moveStart("character", -e.target.value.length),
t = r.text.length - i
}
t === 0 && (this._caretOut = !0)
} else
delete this._caretOut
},
_onKeyup: function(e) {
this._caretOut && (delete this._caretOut,
e.keyCode === n.backspace ? this.removeTag(this.$(".tag:last"), !0) : this.$(".tag:last button").focus()),
this.trigger("keyup", e)
},
_onKeypress: function(e) {
var t = String.fromCharCode(e.which || e.keyCode)
, r = !this.config.submitOnEnter;
if (this._separator.test(t)) {
e.stopDelegation();
if (!this._tagCreationEnabled) {
e.keyCode === n.enter && r && e.preventDefault();
return
}
this.createTags().always(function(t) {
(r || e.keyCode !== n.enter || t) && e.preventDefault()
})
}
},
setTagCreationEnabled: function(e) {
this._tagCreationEnabled = !!e
},
_onBlur: function() {
this.createTags()
},
onFocusButtonTag: function(e) {
this.$(e.target).closest(".tag").addClass("tag-focused")
},
onBlurButtonTag: function(e) {
this.$(e.target).closest(".tag").removeClass("tag-focused")
},
onClickTag: function(e) {
e.stopPropagation()
},
onClick: function() {
this.$input.focus()
},
remove: function() {
return r.removeData(this.$input, "width"),
t.prototype.remove.apply(this, arguments)
},
getValue: function() {
return e.clone(this._tags)
},
setSelection: function(n) {
e.isUndefined(n) && (n = this.$input.val().length),
t.prototype.setSelection.call(this, n)
},
validate: function() {
return this.createTags().then(e.bind(function() {
return t.prototype.validate.apply(this, arguments)
}, this))
}
})
}),
define("text!templates/gui/toggle/toggle.html", [], function() {
return '<label>\n <input type="checkbox">\n <div class="checkbox">\n <span class="box icon-checkbox-outer"></span>\n <span class="check icon-checkbox-arrow"></span>\n </div>\n <%= text %>\n</label>\n'
}),
define("gui/toggle/views/toggle", ["jquery", "backbone", "underscore", "text!templates/gui/toggle/toggle.html"], function(e, t, n, r) {
return t.View.extend({
className: "sj-toggle",
events: {
"change :checkbox": "_check"
},
defaults: {
enabled: !1,
checked: !1,
text: ""
},
_template: n.template(r),
initialize: function(e) {
this.options = n.defaults(e || {}, this.defaults),
this._enabled = n.defaults(this.options, this.defaults).enabled,
this._checked = n.defaults(this.options, this.defaults).checked
},
render: function() {
return this._enabled || this.$el.addClass("disabled"),
this.$el.html(this._template({
text: n.result(this.options, "text")
})),
this.$input = this.$el.find("input"),
this.$input.attr("name", this.options.name),
this.$input.prop("checked", this._checked),
this.delegateEvents(),
this
},
toggle: function(e) {
this._enabled = n.isUndefined(e) ? !this._enabled : e,
this.$el.toggleClass("disabled", !this._enabled),
this.trigger("toggle", this._enabled)
},
setChecked: function(e) {
this._checked = e === !0,
this.$input.prop("checked", this._checked)
},
getValue: function() {
return this._checked
},
_check: function(t) {
this._checked = e(t.target).prop("checked"),
this.trigger("check", this._checked)
}
})
}),
define("gui/menubar/views/menubarView", ["jquery", "backbone", "underscore"], function(e, t, n) {
return t.View.extend({
className: "menubar",
defaults: {
items: {}
},
initialize: function(e) {
this.options = n.defaults(e || {}, this.defaults),
this._createItems(this.options.items)
},
_toggleClass: function(e, t) {
var n = e.$el;
n.toggleClass("disabled", t),
n.prev().toggleClass("disabled", t)
},
toggle: function(e, t) {
n.each(this.items, function(n, r) {
r.match(e) && this._toggleClass(n, !t)
}, this)
},
enable: function(e) {
this.toggle(e, !0)
},
disable: function(e) {
this.toggle(e, !1)
},
disableAll: function() {
n.each(this.items, n.bind(function(e) {
this._toggleClass(e, !0)
}, this))
},
setActive: function(e) {
this.$el.toggleClass("active", e)
},
setItems: function(e) {
this._createItems(e),
this.render()
},
render: function() {
var t = n.keys(this.items);
return this.$el.contents().detach(),
n.each(t, function(t, r) {
var i = this.items[t];
r > 0 && this.$el.append(e('<div class="menubar-separator" />')),
this.$el.append(i.render().$el),
n.isFunction(i.isDisabled) && this._toggleClass(i, i.isDisabled()),
i.delegateEvents()
}, this),
this
},
remove: function() {
return this._removeItems(),
t.View.prototype.remove.apply(this, arguments)
},
_createItems: function(e) {
this._removeItems(),
this.items = n.clone(e),
n.each(this.items, function(e) {
if (!(e instanceof t.View))
throw new Error("nothing else than Backbone.View based menubar items allowed");
this.listenTo(e, "state", n.bind(function(t) {
this._toggleClass(e, !t)
}, this))
}, this)
},
_removeItems: function() {
n.each(this.items, function(e) {
this.stopListening(e),
e.remove()
}, this)
}
})
}),
define("gui/menu/positioning", ["underscore", "jquery"], function(e, t) {
function n(t) {
var n;
if (!e.isString(t))
throw new Error("Only strings are allowed as position values.");
n = e.uniq(t.trim().split(/ +/));
if (n.length !== 2)
throw new Error("A position should consist of exactly two values");
if (e.difference(n, ["top", "right", "bottom", "left"]).length)
throw new Error("A position only supports top, right, bottom and left.");
return n
}
function r(e, t, n) {
var r;
return e <= t ? r = e / 2 - t / 2 : n + t > e ? r = Math.max(0, e / 2 - t / 2, n - t) : r = n,
r
}
function i(e, t, n) {
return {
left: r(t.width, e.width, n.left),
top: r(t.height, e.height, n.top)
}
}
function s(e, n, r, i) {
var s = t(window).width()
, o = t(window).height()
, u = n.indexOf("left") > -1 ? e.left : e.right
, a = n.indexOf("top") > -1 ? e.top : e.bottom
, f = {};
return u += i.h,
a += i.v,
r.indexOf("left") > -1 ? (f.left = u,
f.width = s - u) : (f.right = s - u,
f.width = u),
r.indexOf("top") > -1 ? (f.top = a,
f.height = o - a) : (f.bottom = o - a,
f.height = a),
f
}
return {
position: function(e, n) {
return e.length ? i(e[0].getBoundingClientRect(), {
width: t(window).width(),
height: t(window).height()
}, n) : n
},
align: function(r, i, o, u) {
var a;
if (!r)
throw new Error("Anchor element required for alignment");
a = t(r);
if (!a.length)
throw new Error("No anchor element could be matched");
i = n(i),
o = n(o),
u || (u = {}),
u = e.defaults(u, {
v: 0,
h: 0
});
if (!e.isNumber(u.h) || !e.isFinite(u.h))
throw new Error("Horizontal offset offset.h should be a finite number");
if (!e.isNumber(u.v) || !e.isFinite(u.v))
throw new Error("Vertical offset offset.v should be a finite number");
return s(a[0].getBoundingClientRect(), i, o, u)
}
}
}),
define("gui/menu/menuItemView", ["underscore", "../activatable"], function(e, t) {
return t.extend({
events: e.extend({}, t.prototype.events, {
mousemove: "_onMouseMove",
mouseleave: "_onMouseLeave"
}),
initialize: function(e) {
this.text = e.text;
if (!this.hasAction)
throw new Error("no action was provided.");
this.listenTo(this, "state", this.onChangeActionState),
this._selected = !1
},
render: function() {
return this.$el.empty().html(e.result(this, "text")).addClass("sj-menuitem"),
this.renderActionState(this.getActionState()),
this
},
renderActionState: function(e) {
this.$el.toggleClass("sj-menuitem-disabled", !e)
},
isDisabled: function() {
return this.$el.hasClass("sj-menuitem-disabled")
},
canSelect: function() {
return !!this.getActionState()
},
isSelected: function() {
return this._selected
},
setSelected: function(e) {
e = !!e,
e !== this.isSelected() && (!e || this.canSelect()) && (this._selected = e,
this.$el.toggleClass("sj-menuitem-selected", this._selected),
this.trigger("selected", this._selected))
},
_onMouseMove: function() {
this.setSelected(!0)
},
_onMouseLeave: function() {
this.setSelected(!1)
},
onChangeActionState: function(e) {
!e && this.isSelected() && this.setSelected(!1),
this.renderActionState(e)
}
})
}),
define("gui/menu/menuView", ["jquery", "underscore", "backbone", "keycodes", "./positioning", "./menuItemView"], function(e, t, n, r, i, s) {
return n.View.extend({
itemClass: s,
initialize: function(e) {
e = t.isObject(e) ? e : {},
e.itemClass && (this.itemClass = e.itemClass),
this._isDisabled = !0,
this._createItems(e.items || []),
this._eventSuffix = ".menu" + this.cid,
this._registeredGlobalEvents = !1
},
render: function() {
return this.$el.contents().detach(),
this.$el.addClass("sj-menu"),
t.each(this.items, t.bind(function(e) {
this.$el.append(e.render().$el)
}, this)),
this
},
remove: function() {
return this._removeItems(),
this._unregisterGlobalEvents(),
n.View.prototype.remove.apply(this, arguments)
},
isDisabled: function() {
return this._isDisabled
},
open: function(e) {
var n;
e = t.extend({}, {
left: 0,
top: 0
}, e),
this.render().$el.appendTo(e.parent || "body"),
e.anchor ? e = i.align(e.anchor, e.alignment || "left bottom", e.origin || "left top", e.offset) : e = i.position(this.$el, e),
n = t.pick(e, "top", "left", "bottom", "right"),
n = t.extend(n, {
"max-height": e.height || "",
"max-width": e.width || ""
}),
this.$el.css(n),
this.trigger("open"),
this._registerGlobalEvents()
},
close: function() {
this.$el.detach(),
this.trigger("close"),
this._unregisterGlobalEvents()
},
setItems: function(e) {
this._createItems(e),
this.render()
},
_removeItems: function() {
t.each(this.items, t.bind(function(e) {
e.remove(),
this.stopListening(e)
}, this))
},
_createItems: function(e) {
var n = this.itemClass;
this._removeItems(),
this.items = t.map(e, t.bind(function(e) {
var r = new n(e);
return this.listenTo(r, "executed", this._onItemExecuted),
this.listenTo(r, "selected", t.partial(this._onItemSelected, r)),
this.listenTo(r, "state", this._onItemState),
r
}, this)),
this._onItemState(),
this._selectedItem = null
},
_registerGlobalEvents: function() {
if (this._registeredGlobalEvents)
return;
var n = t.map(["wheel", "contextmenu"], function(e) {
return e + this._eventSuffix
}, this);
e(document).on("mousedown" + this._eventSuffix, t.bind(this._handleMousedown, this)).on("keydown" + this._eventSuffix, t.bind(this._handleKeydown, this)).on("keyup" + this._eventSuffix, t.bind(this._handleKeyup, this)).on(n.join(" "), t.bind(this._preventEvent, this)),
e(window).on("resize" + this._eventSuffix, t.bind(this._handleResize, this)),
this._registeredGlobalEvents = !0
},
_unregisterGlobalEvents: function() {
if (!this._registeredGlobalEvents)
return;
e(document).off(this._eventSuffix),
e(window).off(this._eventSuffix),
this._registeredGlobalEvents = !1
},
_preventEvent: function(e) {
return e.preventDefault(),
!1
},
_handleMousedown: function(t) {
e(t.target).closest(this.$el).length || this.close()
},
_handleKeyup: function(e) {
e.which === r.enter && this._selectedItem && (e.preventDefault(),
this._selectedItem.execute())
},
_handleKeydown: function(e) {
t.contains(r.scrollKeys, e.which) && e.preventDefault(),
e.which === r.escape ? this.close() : e.which === r.upArrow ? this._selectPreviousItem() : e.which === r.downArrow ? this._selectNextItem() : e.which === r.tab ? (e.shiftKey ? this._selectPreviousItem() : this._selectNextItem(),
e.preventDefault()) : e.which === r.pageUp || e.which === r.home ? this._selectFirstItem() : (e.which === r.pageDown || e.which === r.end) && this._selectLastItem()
},
_handleResize: function() {
this.close()
},
_getSelectableItems: function() {
return t.filter(this.items, function(e) {
return e.canSelect()
})
},
_selectNextItem: function() {
var e = this._getSelectableItems()
, t = e.indexOf(this._selectedItem)
, n = t < e.length - 1 ? t + 1 : 0;
n > -1 && n < e.length && e[n].setSelected(!0)
},
_selectPreviousItem: function() {
var e = this._getSelectableItems()
, t = e.indexOf(this._selectedItem)
, n = t > 0 ? t - 1 : e.length - 1;
n > -1 && n < e.length && e[n].setSelected(!0)
},
_selectFirstItem: function() {
var e = this._getSelectableItems();
e.length && e[0].setSelected(!0)
},
_selectLastItem: function() {
var e = this._getSelectableItems();
e.length && e[e.length - 1].setSelected(!0)
},
_onItemExecuted: function() {
this.close()
},
_onItemState: function() {
var e = t.some(this.items, function(e) {
return t.isFunction(e.isDisabled) ? !e.isDisabled() : !0
})
, n = this._isDisabled;
this._isDisabled = !e,
this.$el.toggleClass("sj-menu-disabled", this._isDisabled),
n !== this._isDisabled && this.trigger("state", !this._isDisabled)
},
_onItemSelected: function(e, t) {
t ? (this._selectedItem && this._selectedItem.setSelected(!1),
this._selectedItem = e) : this._selectedItem === e && (this._selectedItem = null)
}
})
}),
define("gui/charts/segmentCalculator", ["underscore"], function(e) {
return function(t) {
var n = 0
, r = e.reduce(t, function(t, n) {
e.isObject(n) || (n = {
value: n
});
var r = e.extend({}, n, {
value: Math.max(0, n.value) || 0,
percent: 0
});
return t.totalSum += r.value,
t.segments.push(r),
t
}, {
totalSum: 0,
segments: []
});
return r.totalSum > 0 && e.each(r.segments, function(e, t) {
var i;
e.value > 0 && (t === r.segments.length - 1 ? i = 100 - n : (i = Math.round(e.value / r.totalSum * 1e3) / 10,
n += i),
e.percent = i)
}),
r
}
}),
define("gui/charts/barChartView", ["jquery", "underscore", "backbone", "./segmentCalculator"], function(e, t, n, r) {
return n.View.extend({
className: "sj-barchart",
initialize: function(e) {
e = e || {},
t.has(e, "values") && this.setValues(e.values)
},
render: function() {
return this.$el.empty(),
this._data && this._data.totalSum > 0 && t.each(this._data.segments, function(n) {
var r = e('<span class="sj-barchart-segment" />');
t.has(n, "className") && r.addClass(n.className),
r.css("width", n.percent.toFixed(1) + "%"),
r.appendTo(this.$el)
}, this),
this
},
setValues: function(e) {
if (!t.isArray(e))
throw new Error("Provided values need to be an array.");
this._data = r(e)
}
})
}),
define("gui/highlight", ["underscore"], function(e) {
return {
highlightMatches: function(t, n) {
if (t === "" || n === "")
return n;
t = t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
var r = new RegExp(t,"gi")
, i = e.uniq(n.match(r));
return e.each(i, function(e) {
r = new RegExp(e,"g"),
n = n.replace(r, "<>" + e + "</>")
}),
n.replace(/<>/g, "<em>").replace(/<\/>/g, "</em>")
}
}
}),
define("gui/main", ["./button/button", "./button/iconButton", "./dropdown/simple", "./grid/grid", "./grid/lazyGrid", "./breadcrumb/breadcrumb", "./toast/toast", "./tooltip/tooltip", "./tooltip/views/infoTooltip", "./flyout/flyout", "./overlay/views/overlayManager", "./overlay/views/baseOverlayView", "./overlay/overlay", "./overlay/waitOverlay", "./editor/views/editor", "./editor/views/inlineEditor", "./editor/views/textEditor", "./editor/views/passwordEditor", "./editor/views/taglistEditor", "./toggle/views/toggle", "./menubar/views/menubarView", "./menu/menuView", "./charts/barChartView", "./highlight"], function(e, t, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w, E, S, x) {
return {
Button: e,
IconButton: t,
SimpleDropdown: n,
Grid: r,
LazyGrid: i,
Breadcrumb: s,
Toast: o,
Tooltip: u,
InfoTooltip: a,
Flyout: f,
OverlayManager: l,
BaseOverlayView: c,
Overlay: h,
WaitOverlay: p,
Editor: d,
InlineEditor: v,
TextEditor: m,
PasswordEditor: g,
TaglistEditor: y,
Toggle: b,
Menubar: w,
Menu: E,
BarChart: S,
highlight: x
}
}),
define("gui", ["gui/main"], function(e) {
return e
}),
define("views/filemanagerFooter", ["backbone", "gui", "lang", "api", "tracker"], function(e, t, n, r, i) {
return e.View.extend({
className: "filemanager-footer",
initialize: function() {
this.listenTo(this.model.files, "load add add:end remove remove:end", this.render),
this.downloadAllButton = new t.IconButton({
className: "sj-button-highlighted filemanager-downloadall",
text: n.bind("filemanager.downloadAll"),
iconClass: "icon-downloadall"
}),
this.listenTo(this.downloadAllButton, "click", this.onDownloadAllClick)
},
remove: function() {
return this.downloadAllButton.remove(),
e.View.prototype.remove.apply(this, arguments)
},
render: function() {
return this.$el.empty(),
this.model.files.length && this.downloadAllButton.render().$el.appendTo(this.$el),
this
},
onDownloadAllClick: function() {
i.track({
op: "download",
target: "all"
}),
r.download([this.model], this.model, {
archivePrefix: n.get("filemanager.download.archiveprefix")
})
}
})
}),
define("gui/thumbnail/thumbnail", ["jquery", "backbone", "underscore"], function(e, t, n) {
function r(e) {
return e.width / e.height
}
return t.View.extend({
className: "sj-thumbnail",
initialize: function(e) {
e = e || {};
if (!e.size)
throw new Error("Missing size config");
this.size = {},
!isNaN(Number(e.size.width)) && e.size.width > 0 && (this.size.width = e.size.width),
!isNaN(Number(e.size.height)) && e.size.height > 0 && (this.size.height = e.size.height);
if (n.isEmpty(this.size))
throw new Error("size.width and/or size.height did no pass the check");
this.imageUrl = e.imageUrl,
this._imageSize = null
},
_load: function(t) {
var n = e.Deferred()
, r = new Image;
return r.onload = function() {
n.resolve({
width: r.width,
height: r.height
}, t)
}
,
r.src = t,
n.promise()
},
renderImage: function(e, t) {
this._imageSize = e,
this.$el.css({
"background-image": "url(" + t + ")"
}),
this.resizeImage(e)
},
resizeImage: function() {
var e, t, n = r(this._imageSize), i = {
width: this.$el.parent().width(),
height: this.$el.parent().height()
};
n >= r(i) ? (t = i.width / n,
e = i.width) : (e = i.height * n,
t = i.height),
e = Math.min(e, this._imageSize.width),
t = Math.min(t, this._imageSize.height),
this.$el.css({
width: e,
height: t
})
},
_toggleLoading: function(e) {
this.$el.toggleClass("sj-thumbnail-loading", e)
},
render: function() {
return this._imageSize ? (this.resizeImage(),
this) : (this._toggleLoading(!0),
this.imageUrl(this.size).then(this._load).done(n.bind(this._toggleLoading, this, !1)).then(n.bind(this.renderImage, this)),
this)
}
})
}),
define("text!views/filepreview/filePreview.html", [], function() {
return '<div class="filesviewer">\n <div class="filesviewer-container">\n <div class="filesviewer-content imageview">\n\n </div>\n </div>\n <div class="statusview">\n <div class="left">\n <span class="display-name sj-selectable" title="<%- file.get(\'base_name\') %>"><%- file.get("base_name") %></span>\n </div>\n <div class="action-close">\n <span class="icon icon-filesviewer-close"></span>\n <span class="label"><%= lang.get("filesviewer.close") %></span>\n </div>\n </div>\n</div>\n'
}),
define("views/filepreview/filePreview", ["underscore", "backbone", "jquery", "gui/overlay/overlay", "gui/overlay/views/overlayManager", "z-index-mgr", "lang", "gui/thumbnail/thumbnail", "text!./filePreview.html"], function(e, t, n, r, i, s, o, u, a) {
return r.extend({
className: "filesviewer-overlay",
template: e.template(a),
events: {
"click .action-close": "remove"
},
initialize: function(t) {
this.options = n.extend({}, t || {}),
this._onResize = e.throttle(e.bind(this._onResize, this), 250, {
leading: !1
}),
this.render().$el.appendTo("body")
},
remove: function() {
return n(window).off("resize.filepreview"),
this._thumbnail.remove(),
this._overlayPushed && (i.instance().pop(),
this._overlayPushed = !1),
this.trigger("removed"),
t.View.prototype.remove.call(this)
},
_onResize: function() {
this._thumbnail.render()
},
render: function() {
return this.$el.addClass(this.overlayClasses),
n(window).on("resize.filepreview", this._onResize),
this.$el.css("z-index", s()),
this.$el.html(this.template({
lang: o,
file: this.model
})),
this._thumbnail || (this._thumbnail = new u({
size: {
width: 640,
height: 640
},
imageUrl: e.bind(this.options.url, this)
})),
this._thumbnail.render(),
this._thumbnail.$el.appendTo(this.$el),
this.trigger("rendered"),
this._overlayPushed || (i.instance().push(),
this._overlayPushed = !0),
this
}
})
}),
define("text!views/fileitem.html", [], function() {
return '<% if(model.get("readable")) { %>\n<div class="selecticon icon-item-selector">\n <div class="icon-item-selected"></div>\n</div>\n<% } %>\n<div class="itemcontent <%= model.get("type") %> <% if(!model.get("readable")) { %>notReadable<% } %> ">\n\n <span class="file-item-icon sj-unselectable icon-mimetype-group-<%= model.get("group") %>\n unselectable="on"\n data-field="group">\n <span class="label-text group"></span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-displayname"\n unselectable="on"\n data-field="display_name"\n title="<%- model.get("display_name") %>">\n <span class="label-text display_name">\n <%- model.get("display_name") %>\n </span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-size"\n unselectable="on"\n data-field="size">\n <span class="label-text size">\n <% if(model.has("size")) { %>\n <%= formatters.size(parseInt(model.get("size"), 10)) %>\n <% } %>\n </span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-download"\n unselectable="on">\n <span class="icon-container" data-action="download">\n <span class="icon-toolbar-download"></span>\n </span>\n </span>\n</div>\n'
}),
define("text!views/fileitemHeader.html", [], function() {
return '<div class="itemcontent">\n <span class="file-item-icon sj-unselectable" unselectable="on" data-field="group"></span>\n <span class="file-item-label file-item-displayname sj-unselectable <% if (sortable) print("sortable") %>" unselectable="on" data-field="display_name">\n <%= lang.get("file.name") %>\n </span>\n <span class="file-item-label sj-unselectable file-item-size <% if (sortable) print("sortable") %>" unselectable="on" data-field="size">\n <%= lang.get("file.size") %>\n </span>\n <span class="file-item-label sj-unselectable file-item-download" unselectable="on">\n <%= lang.get("file.download") %>\n </span>\n</div>\n'
}),
define("views/shareLinkView", ["underscore", "jquery", "backbone", "api", "gui", "modules/window", "api/models/shareLinkModel", "./login", "./filepreview/filePreview", "text!./fileitem.html", "text!./fileitemHeader.html"], function(e, t, n, r, i, s, o, u, a, f, l) {
return n.View.extend({
className: "shlnk",
sid: null,
hasPassword: !1,
password: null,
infoPromise: null,
loginError: null,
thumbnailAvailable: !1,
initialize: function() {
this.collection = new n.Collection([],{
model: o
}),
this.grid = new i.Grid({
collection: this.collection,
headerTpl: l,
itemTpl: f
}),
this.listenTo(this.grid, "click", this.onItemClick)
},
render: function(t) {
return this.$el.contents().detach(),
this.collection.reset(),
t && t.sid && (this.sid = t.sid),
this.sid && this.getShareInfo().then(e.bind(this.authenticate, this)).then(e.bind(this.getShareData, this)).then(e.bind(this._triggerShareLinkData, this)).then(e.bind(this.showGrid, this)).fail(e.bind(this.showError, this)),
this
},
remove: function() {
return this.grid.remove(),
n.View.prototype.remove.apply(this, arguments)
},
getShareInfo: function() {
return this.infoPromise || (this.infoPromise = t.get("/api/sharelink/info", {
id: this.sid
})),
this.infoPromise
},
authenticate: function(e) {
return e.has_password && !this.password ? (this.hasPassword = !0,
this.showLogin()) : null
},
getShareData: function() {
var e = "/api/sharelink/info"
, n = {
id: this.sid,
fields: "name,type,size"
};
return this.hasPassword && (n.password = this.password,
n.fields += ",download_code"),
t.post(e, n)
},
_triggerShareLinkData: function(e) {
var t = {
id: this.sid,
type: "sharelink",
name: e.name
};
return this.hasPassword && (t.pw = this.password),
this.trigger("sharelinkData", t),
e
},
refreshDownloadCode: function(n) {
var r = "/api/sharelink/info"
, i = {
id: this.sid,
password: this.password,
fields: "download_code"
};
t.post(r, i).done(function(e) {
n.set("download_code", e.download_code)
}).fail(e.bind(this.showError, this))
},
showLogin: function() {
var n = t.Deferred()
, r = new u({
loginCallback: e.bind(function(e) {
this.password = e.password,
n.resolve()
}, this)
});
return this.$el.html(r.render({
error: this.loginError
}).$el),
n.promise()
},
showGrid: function(e) {
this.item = this.collection.add(e, {
parse: !0
}),
this.$el.html(t('<div class="filemanager-body" />').append(t('<div class="fm-grid isList" />').append(this.grid.render().$el))),
this.item.get("group") === "thumb" && this.showThumbnail()
},
showThumbnail: function(n) {
var r = n ? n.width : 210
, i = n ? n.height : 210
, s = !n;
this.getThumbnailUrl(r, i).done(e.bind(function(n) {
this.thumbnailAvailable = !0;
var r, i = e.bind(function() {
var e = r[0].width
, i = r[0].height
, o = this.$(".sj-grid.content .itemcontent .file-item-icon")
, u = t("<div />").css("background-image", "url(" + n + ")");
this.$(".fm-grid .sj-grid.content .sj-item").addClass("isthumbnail"),
s && this._adjustThumbnail(u, r[0], 140, 210);
var a = e >= i
, f = e >= 120
, l = e >= 140
, c = i >= 140
, h = i >= 120;
e < 40 && i < 40 ? u.css("background-size", "inherit") : a && c ? u.addClass("m_by") : !a && l ? u.addClass("m_bx") : !a && !l && h ? u.addClass("m_y") : a && !c && f && u.addClass("m_x"),
o.empty().append(u).addClass("file-item-image-preview").removeClass("file-item-image-icon").removeClass("bg-sprite")
}, this);
r = t("<img />").load(i).attr("src", n)
}, this))
},
_adjustThumbnail: function(e, t, n, r) {
var i = n
, s = n
, o = "";
t.width === r && t.height < s && (i = Math.ceil(r * s / t.height),
o = i + "px " + s + "px",
this.showThumbnail({
height: s
})),
t.height === r && t.width < i && (s = Math.ceil(r * i / t.width),
o = i + "px " + s + "px",
this.showThumbnail({
width: i
})),
o.length && e.css("background-size", o)
},
getThumbnailUrl: function(e, t) {
var n = {
width: e,
height: t
};
return this.password && (n.password = this.password),
r.getShareLinkThumbnail(this.sid, n)
},
showError: function(e) {
this.hasPassword && e.status === 401 ? (this.password = null,
this.loginError = "password",
this.render()) : this.trigger("error", e.status)
},
onItemClick: function(n, r) {
if (t(r.target).closest("[data-action=download]").length) {
var i = "/api/sharelink/download"
, o = {
id: this.sid
};
n.get("download_code") && (o.download_code = n.get("download_code")),
s.setLocation(i + "?" + t.param(o)),
this.hasPassword && this.refreshDownloadCode(n)
} else if (this.thumbnailAvailable) {
var u = window.innerWidth
, f = window.innerHeight;
new a({
model: this.item,
width: u,
height: f,
url: e.bind(function() {
return this.getThumbnailUrl(u, f)
}, this)
})
}
}
})
}),
define("text!templates/poweredBy.html", [], function() {
return '<div class="inner-wrapper">\n <a href="<%= lang.get("poweredBy.url") %>" target="_blank"\n class="powered-by-icon bg-sprite icon-powered-by-logo">\n </a>\n</div>\n'
}),
define("views/poweredByView", ["underscore", "backbone", "lang", "text!templates/poweredBy.html"], function(e, t, n, r) {
return t.View.extend({
className: "powered-by",
template: e.template(r),
render: function() {
return this.$el.html(this.template({
lang: n
})),
this
}
})
}),
define("text!filemanager/js/views/filemanager.html", [], function() {
return '<div class="filemanager-body">\n <span class="filemanager-loader" />\n <div class="grid-target" />\n</div>\n'
}),
define("mixins/selection", ["jquery", "underscore"], function(e, t) {
return {
bindCollection: function(e, n) {
n = n || {},
e.on("deselectAll", function() {
e.prev = undefined
});
var r = function(e, r, i) {
if (!t.isFunction(n.filter) || n.filter(e)) {
var s = !!e.selected;
e.selected = t.isBoolean(r) ? r : !s,
!i && e.selected !== s && e.trigger("change:selected", e)
}
}
, i = function(t) {
r(t, !0),
e.prev = t,
e.each(function(e) {
e !== t && r(e, !1)
})
}
, s = function() {
e.each(function(e) {
r(e, !1, !0)
}),
e.prev = undefined,
e.trigger("deselectAll")
};
e.on("remove", function(e) {
r(e, !1),
delete e.selected
}),
e.on("remove:end", function(e) {
t.each(e, function(e) {
delete e.selected
})
}),
e.on("select", function(n, s) {
if (!s)
n.selected ? e.prev = undefined : e.prev = n,
r(n);
else if (t.isUndefined(e.prev))
i(n);
else {
var o = e.indexOf(e.prev)
, u = e.indexOf(n)
, a = Math.min(o, u)
, f = Math.max(o, u);
e.each(function(e, t) {
e.selected || r(e, t >= a && t <= f)
})
}
}),
e.on("reset sync", s),
t.extend(e, {
deselectAll: s,
selectAll: function() {
e.each(function(e) {
r(e, !0, !0)
}),
e.trigger("selectAll")
},
getSelected: function() {
return t.filter(e.models, function(e) {
return e.selected
})
},
firstSelected: function() {
return t.find(e.models, function(e) {
return e.selected
})
},
select: function(e) {
r(e, !0)
}
})
},
unbindCollection: function(e) {
e.off("remove remove:end"),
e.off("select"),
e.off("deselectAll"),
e.off("reset sync", e.deselectAll),
delete e.deselectAll,
delete e.select
}
}
}),
define("mixins/sortBy", ["underscore"], function(e) {
return {
bindCollection: function(t, n) {
if (!e.isUndefined(t.sortable))
throw new Error("cannot extend collection, sortable exist");
var r = null
, i = "asc";
n && n.key && (r = n.key),
n && n.direction && (i = n.direction);
var s = function(e, n) {
if (!t.comparators || t.comparators.length === 0)
return;
var r = t.comparators[e];
if (!r)
throw new Error("comparator '" + e + "'not defined");
n === "desc" ? t.comparator = function(e, t) {
return r.call(this, t, e)
}
: t.comparator = r,
t.sortable.key = e,
t.sortable.direction = n
};
e.extend(t, {
sortable: {
key: r,
direction: i,
getKey: function() {
return t.sortable.key
},
getDir: function() {
return t.sortable.direction
},
sortBy: function(e, n) {
if (!t.comparators)
throw new Error("no comparators defined in collection");
n = n || t.sortable.direction,
e = e || t.sortable.key,
s(e, n),
t.sort(),
t.trigger("sortBy", e, n)
}
}
}),
s(r, i)
}
}
}),
define("modules/filemanager/js/helpers/compareHelper", [], function() {
return {
isDir: function(e) {
return e.get("type") === "dir"
},
compareType: function(e, t) {
return this.isDir(t) - this.isDir(e)
},
compare: function(e, t, n) {
var r = this.compareType(e, t);
return r ? r : (r = n ? n(e, t) : r,
r ? r : (r = this.compareString(e.get("display_name"), t.get("display_name")),
r ? r : this.compareString(e.id, t.id)))
},
compareString: function(e, t) {
var n = function(e) {
return e === null || typeof e == "undefined" ? "" : String(e)
}
, r = n(e).toLowerCase()
, i = n(t).toLowerCase();
return r === i ? 0 : r > i ? 1 : -1
},
compareDisplayNames: function(e, t) {
return this.compareString(e.get("display_name"), t.get("display_name"))
}
}
}),
define("filemanager/js/collections/fileitems", ["underscore", "api/collections/baseCollection", "api/models/fileModel", "mixins/selection", "mixins/sortBy", "lang", "modules/filemanager/js/helpers/compareHelper"], function(e, t, n, r, i, s, o) {
return t.extend({
model: n,
defaults: {
itemfilter: function(e) {
return e
},
sortCol: "display_name",
sortDir: "asc"
},
comparators: {
display_name: function(e, t) {
return o.compare(e, t)
},
type: function(e, t) {
return o.compare(e, t, function(e, t) {
return o.compareString(e.get("ext"), t.get("ext"))
})
},
size: function(e, t) {
return o.compare(e, t, function(e, t) {
var n = e.has("size") ? parseInt(e.get("size"), 10) : 0
, r = t.has("size") ? parseInt(t.get("size"), 10) : 0;
return n - r
})
},
mtime: function(e, t) {
return o.compare(e, t, function(e, t) {
var n = e.has("mtime") ? e.get("mtime") - (new Date(e.get("mtime") * 1e3)).getSeconds() : 0
, r = t.has("mtime") ? t.get("mtime") - (new Date(t.get("mtime") * 1e3)).getSeconds() : 0;
return n - r
})
}
},
initialize: function(n, s) {
t.prototype.initialize.apply(this, arguments),
this.options = e.extend({}, this.defaults, s),
this.comparator = this.comparators.display_name,
r.bindCollection(this, {
filter: function(e) {
return e.get("readable")
}
}),
i.bindCollection(this, {
key: this.options.sortCol,
direction: this.options.sortDir
})
},
parse: function(t) {
e.isArray(t) || (t = new Array(t));
for (var n = 0; n < t.length; n++) {
var r = t[n];
r.path && r.path.indexOf("root/") === 0 && (r.path = r.path.replace(/root\//, "/"))
}
return this.options.itemfilter && (t = e.filter(t, this.options.itemfilter, this)),
t
}
})
}),
define("filemanager/js/models/folder", ["underscore", "api", "../collections/fileitems", "deleteListInst"], function(e, t, n, r) {
return t.FileModel.extend({
defaults: {
path: "",
id: "",
type: "dir"
},
files: null,
delayTimer: null,
itemfilter: function() {
return !0
},
isDir: function() {
return !0
},
initialize: function(i) {
t.FileModel.prototype.initialize.call(this, [], i),
this.options = e.extend({}, this.defaults, i),
this.files = new n([],{
context: this.getContext(),
itemfilter: e.bind(this.itemfilter, this),
sortCol: this.options.sortCol || "display_name",
sortDir: this.options.sortDir || "asc"
}),
this.listenTo(t, "newFolder:created newFile:created copyFiles:done moveFiles:done", this._onCreatedNewItem),
this.listenTo(this.files, "add", this.onAdd),
this.listenTo(this.files, "change", this._onFileItemUpdate),
this.listenTo(r, "added", this._onDeleteListAdded),
this.listenTo(r, "recovered", this._onDeleteListRecovered)
},
waitInMilliSeconds: 1e3,
getParent: function() {
var e = this.get("path"), t, n, r = /^(\/.*)\/[^\/]+$/.exec(e);
return r ? (this.set("parentName", r[1].split("/").pop()),
n = this.urlDecode("parentName"),
t = r[1],
{
path: t,
name: n
}) : null
},
_clearLoadDelayTimeout: function() {
this.delayTimer && (clearTimeout(this.delayTimer),
this.delayTimer = null)
},
_setLoadDelayTimeout: function() {
var e = this;
this._clearLoadDelayTimeout(),
this.delayTimer = setTimeout(function() {
e.files.trigger("load:delay")
}, this.waitInMilliSeconds)
},
_onCreatedNewItem: function(t, n) {
var r = [].concat(n)
, i = this.getContext();
this.get("path") === t && e.every(r, function(e) {
return i === e.getContext()
}) && this.files.add(n)
},
_onFileItemUpdate: function(e) {
this.getPid() === e.get("parent_id") && this.getContext() === e.getContext() && (this.files.remove(e),
this.files.add(e))
},
onAdd: function(e) {
e && e.set({
movable: this.get("writable")
}, {
silent: !0
})
},
load: function(t) {
var n = e.clone(this.queryData) || {
fields: []
}, r;
this.options.queryData && (r = this.options.queryData,
e.isFunction(r) ? n = r.call(this, n) : e.extend(n, r)),
n.fields = n.fields.join(","),
this.requestedPath = t,
this._setLoadDelayTimeout(),
this.files.trigger("load:start"),
this.fetch({
data: n,
path: t,
success: e.bind(function(e) {
this._clearLoadDelayTimeout(),
this.files.reset(e.get("members"), {
parse: !0
}),
this.files.trigger("load"),
this.trigger("load")
}, this),
error: e.bind(function(e, t, n) {
this._clearLoadDelayTimeout(),
this.files.trigger("load:error", t, n),
this.trigger("load:error", t, n)
}, this),
progress: e.bind(function(e, t) {
this.requestedPath !== t.path && e()
}, this)
})
},
fetch: function(n) {
t.getDir(this.requestedPath, this.getContext(), n.data, n.progress).done(e.bind(function(e) {
if (!this.set(this.parse(e, n), n))
return;
this.trigger("sync", this, e, n),
n.success(this, e, n)
}, this)).fail(e.bind(function(e) {
n.error(this, e, n),
this.trigger("error", this, e, n)
}, this))
},
parse: function(n) {
var i, s;
return n = e.clone(n),
n.type = "dir",
n = t.FileModel.prototype.parse.apply(this, arguments),
n.writable && e.each(n.members, function(e) {
e.movable = !0
}),
i = r.filterByType(this.getItemType(), e.bind(function(e) {
return e.get("parent_id") === this.id
}, this)),
s = e.pluck(i, "id"),
n.members = e.filter(n.members, function(e) {
return s.indexOf(e.id) < 0
}),
n
},
reset: function(t) {
var n = e.extend({}, this.defaults, t)
, r = e.omit(this.attributes, e.keys(n));
this.set(n),
this.set(r, {
unset: !0
}),
this.files.reset([])
},
getPath: function(e) {
return this.get("path") + (this.get("path") === "/" ? "" : "/") + e.get("name")
},
onChangePath: function(e) {
this.load(e.get("path"))
},
getFileCount: function() {
return this.files.where({
isDir: !1
}).length
},
sort: function() {},
_onDeleteListAdded: function(t, n) {
var r, i;
if (t === this.getItemType()) {
r = n.filter(e.bind(function(e) {
return e.get("parent_id") === this.get("id")
}, this));
if (!r.length)
return;
i = e.compact(this.files.remove(r, {
silent: !0
})),
i.length && this.files.trigger("remove:end", i)
}
},
_onDeleteListRecovered: function(t, n) {
var r;
if (t === this.getItemType()) {
r = n.filter(e.bind(function(e) {
return e.get("parent_id") === this.get("id")
}, this));
if (!r.length)
return;
this.files.add(r, {
silent: !0
}),
this.files.trigger("add:end", r)
}
}
})
}),
define("text!filemanager/js/views/emptyView.html", [], function() {
return '<div class="flx">\n <div class="top"></div>\n <div class="empty-text">\n <p class="sj-selectable"><%= lang.get("filemanager.noFiles") %></p>\n <div class="drop-invitation">\n <p><%= lang.get("filemanager.dnd.invitation") %></p>\n </div>\n </div>\n <div class="bottom"></div>\n</div>\n'
}),
define("plugins/jquery/jquery.mouseSelect", ["jquery"], function(e) {
var t = 150, n, r = function() {
return "mousesel-" + (new Date).getTime() % 1e5 + Math.floor(Math.random() * 1e5)
};
e.fn.mouseSelect = function(i) {
function s(t) {
n = undefined,
e(t).children(".mouse-select").remove(),
e(t).each(function() {
var t = e(this)
, n = t.data("mouseselNs");
t.off(".mouseSelector"),
e("html").off(".mouseSelector." + n),
t.removeData("mouseselNs")
});
return
}
(i && i.off || i === "off") && s(this),
i && (n = i.rect || [0, 0, e(this).outerWidth(), e(this).outerHeight()],
t = i.delay || 150);
if (i && i.selector && i.onSelect)
return s(this),
this.each(function() {
var s = this, o = e(this), u = o.parent(), a = !1, f, l, c, h, p, d, v, m, g, y, b = o.children(".mouse-select").length ? o.children(".mouse-select") : e("<a>").appendTo(o).css({
border: "1px dashed #666",
position: "absolute"
}).addClass("mouse-select").hide(), w = r();
o.data("mouseselNs", w).on("MSPointerDown.mouseSelector pointerdown.mouseSelector", function(e) {
var t = e.originalEvent;
a = t && (t.pointerType == t.MSPOINTER_TYPE_TOUCH || t.pointerType == t.MSPOINTER_TYPE_PEN)
}).on("mousedown.mouseSelector", function(t) {
f = undefined;
if (a) {
t.preventDefault();
return
}
if (i.ignoreSelector && e(t.target).closest(i.ignoreSelector).length)
return;
n = [0, 0, e(this).outerWidth(), e(this).outerHeight()],
m = u.scrollTop(),
g = u.offset().top + parseInt(e(this).css("margin-top"), 10),
y = u.offset().left + parseInt(e(this).css("margin-left"), 10),
l = t.pageX - y,
c = t.pageY + m - g,
d = o.innerHeight(),
v = u.innerHeight();
if (!n || !(l < n[0] || l > n[2] || c < n[1] || c > n[3]))
f = (new Date).getTime();
t.preventDefault()
}).on("MSHoldVisual contextmenu", function(e) {
e.preventDefault()
}),
e("html").on("MSPointerDown.mouseSelector." + w + " pointerdown.mouseSelector." + w, function(e) {
var t = e.originalEvent;
a = t && [t.MSPOINTER_TYPE_TOUCH, t.MSPOINTER_TYPE_PEN, "pen", "touch"].indexOf(t.pointerType) > -1
}).on("mouseup.mouseSelector." + w, function(t) {
function n() {
f = undefined,
a = !1,
b.css({
top: 0,
left: 0,
width: 0,
height: 0
}).hide()
}
if (!f || a || !e(t.target).closest(s).length) {
n();
return
}
if (b && b.is(":visible")) {
t.stopImmediatePropagation();
var r = u.scrollTop();
h = t.pageX - y,
p = t.pageY + r - g;
if (i && i.selector) {
var o = [Math.min(l, h), Math.min(c, p), Math.max(l, h), Math.max(c, p)]
, d = e.grep(e(i.selector), function(t, n) {
var i = e(t)
, s = i.offset()
, u = [s.left - y, s.top + r - g, s.left + i.width() - y, s.top + i.height() + r - g];
return !(o[0] > u[2] || o[2] < u[0] || o[1] > u[3] || o[3] < u[1])
});
i.onSelect !== undefined && d && setTimeout(function() {
i.onSelect.apply(s, [d])
})
}
}
n()
}).on("mousemove.mouseSelector." + w, function(e) {
if (!f || a)
return;
var r = (new Date).getTime()
, m = u.scrollTop();
h = e.pageX - y,
p = e.pageY + m - g;
var w = b.is(":visible");
if (b && w || r - f > t || Math.abs(l - h) * Math.abs(l - h) + Math.abs(c - p) * Math.abs(c - p) > 2500) {
if (n === undefined)
return;
var E = Math.max(n[0], Math.min(l, h))
, S = Math.max(n[1], Math.min(c, p))
, x = Math.min(Math.abs(l - h), n[2] - E)
, T = p > c ? Math.min(p - c, n[3] - S) : Math.min(c - p, c);
b.css({
top: S,
left: E,
width: x - 2,
height: T - 2
}).show(),
!w && i.onStartSelect && i.onStartSelect.apply(s, []);
var N = e.pageY > g + v
, C = e.pageY < o.parent().offset().top;
if (N || C) {
if (o.scrolling)
return;
o.scrolling = !0;
var k = N ? d - v : 0
, L = N ? d - v - m : m;
u.animate({
scrollTop: k
}, L, function() {
o.scrolling = !1
})
} else
u.stop(!0, !1),
o.scrolling = !1
}
})
})
}
}),
define("filemanager/js/views/fileitem", ["underscore", "gui/grid/views/itemView"], function(e, t) {
return t.extend({
render: function() {
return t.prototype.render.call(this),
this.toggleDraggable(!0),
this
},
templateData: function() {
return e.extend({}, t.prototype.templateData.call(this), {
draggable: this._isDraggable()
})
},
_isDraggable: function() {
return this.dragdropEnabled && this.model.get("movable") && this.model.get("readable")
},
toggleDraggable: function(e) {
this.$el.attr("draggable", e && this._isDraggable() ? "true" : null)
}
})
}),
define("text!filemanager/js/views/fileitem.html", [], function() {
return '<% if(model.get("readable")) { %>\n<div class="selecticon icon-item-selector">\n <div class="icon-item-selected"></div>\n</div>\n<% } %>\n<div class="itemcontent <%= model.get("type") %> <% if(!model.get("readable")) { %>notReadable<% } %> ">\n\n <span class="file-item-icon sj-unselectable icon-mimetype-group-<%= model.get("group") %>"\n unselectable="on"\n data-field="group">\n <span class="label-text group"></span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-displayname"\n unselectable="on"\n data-field="display_name"\n title="<%- model.get("display_name") %>">\n <% if (model.get("share")) { %>\n <span class="icon-item-shared is-shared-icon"\n data-action="share-info"\n title="<% print(model.get(\'type\') === \'dir\' ? lang.get(\'filemanager.share.dir.tooltip\') : lang.get(\'filemanager.share.fileitem.tooltip\')); %>"></span>\n <% } %>\n <span class="label-text display_name">\n <%- model.get("display_name") %>\n </span>\n </span>\n\n <span class="file-item-share-icon sj-unselectable <% if(model.get("share")) { %> icon-item-shared <% } %>"\n unselectable="on"\n <% if (model.get("share")) { %>\n data-action="share-info"\n title="<% print(model.get(\'type\') === \'dir\' ? lang.get(\'filemanager.share.dir.tooltip\') : lang.get(\'filemanager.share.fileitem.tooltip\')); %>"\n <% } %>\n data-field="shared">\n <span class="label-text shared"></span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-ext"\n unselectable="on"\n data-field="type">\n <span class="label-text type">\n <% if(model.get("type") === "dir") { %>\n <%= lang.get("file.type.dir") %>\n <% } else {\n var ext = model.urlDecode("ext");\n if (ext) {\n %>\n .<%- ext %>\n <% } else { %>\n <%= lang.get("file.type.fileitem") %>\n <% }\n } %>\n </span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-size"\n unselectable="on"\n data-field="size">\n <span class="label-text size">\n <% if(model.has("size")) { %>\n <%= formatters.size(parseInt(model.get("size"), 10)) %>\n <% } %>\n </span>\n </span>\n\n <span class="file-item-label sj-unselectable file-item-date"\n unselectable="on"\n data-field="mtime">\n <span class="label-text mtime">\n <% if(model.has("mtime")) { %>\n <%= formatters.date(model.get("mtime"), lang.get("lang.timeFormat")) %>\n <% } %>\n </span>\n\n </span>\n\n</div>\n'
}),
define("text!filemanager/js/views/itemHeader.html", [], function() {
return '<div class="itemcontent">\n <span class="file-item-icon sj-unselectable" unselectable="on" data-field="group"></span>\n <span class="file-item-label file-item-displayname sj-unselectable" unselectable="on" data-field="display_name">\n <%= lang.get("file.name") %>\n </span>\n <span class="file-item-label file-item-ext sj-unselectable" unselectable="on" data-field="type">\n <%= lang.get("file.type") %>\n </span>\n <span class="file-item-label file-item-size sj-unselectable" unselectable="on" data-field="size">\n <%= lang.get("file.size") %>\n </span>\n <span class="file-item-label file-item-date sj-unselectable" unselectable="on" data-field="mtime">\n <%= lang.get("file.update") %>\n </span>\n</div>\n'
}),
define("text!filemanager/js/views/renameTooltip.html", [], function() {
return '<%- Lang.get("filemanager.rename.toast.error.badChars") %> <b><%- chars %></b>\n'
}),
define("filemanager/js/views/fileitemgrid", ["jquery", "underscore", "backbone", "text!./emptyView.html", "lang", "mixins/selection", "plugins/jquery/jquery.mouseSelect", "gui", "gui/grid/views/gridView", "./fileitem", "text!./fileitem.html", "text!./itemHeader.html", "text!./renameTooltip.html", "tracker", "modules/constants"], function(e, t, n, r, i, s, o, u, a, f, l, c, h, p, d) {
return n.View.extend({
className: "fm-grid",
viewHeight: 0,
scrollTop: 0,
defaults: {
selectmodeEnabled: !0,
lazyLoadingEnabled: !0,
editEnabled: !0,
headerTpl: c,
itemTpl: l,
emptyTpl: r
},
initialize: function(e) {
var n;
t.defaults(this, e, this.defaults),
this.mouseSelectRunning = !1,
this.lazyLoadingEnabled ? n = u.LazyGrid : n = a,
this.grid = (new n({
collection: this.collection,
itemTpl: this.itemTpl,
itemViewClass: f,
headerTpl: this.headerTpl,
container: e.container,
emptyTpl: this.emptyTpl,
canDrop: e.canDrop,
dragdropEnabled: !!this.dragdropEnabled
})).render(),
this.listenTo(this.grid, "click", this.onItemClick),
this.listenTo(this.grid, "contextmenu", this.onContextmenu),
this.selectmodeEnabled && (this.listenTo(this.grid, "select", this.onItemSelect),
this.listenTo(this.grid, "longpress", this.onItemSelect)),
this.listenTo(this.collection, "add remove remove:end reset", this.checkEmpty),
this.listenTo(this.collection, "load:start", this.onLoadStart),
this.listenTo(this.collection, "change:selected", this.onChangeSelected),
this.listenTo(this.collection, "selectAll", this.onSelectAll),
this.listenTo(this.collection, "deselectAll", this.onDeselectAll),
this.listenTo(this.collection, "remove:end", this.onRemoveEnd),
this.on("scroll", function() {
this.grid.trigger.apply(this.grid, t.union(["scroll"], arguments))
}, this),
this.on("scrollIntoView", function(e) {
this.grid.scrollIntoView(e)
}, this),
this._editor = null,
this._editingModel = null,
this._editingStopped = !1,
this._itemToEdit = null,
this._selectMode = !1
},
checkEmpty: function() {
var e = this;
this.$el.toggleClass("isEmpty", !this.collection.length),
this.selectmodeEnabled && (this.$el.mouseSelect("off"),
this.collection.length && this.$el.mouseSelect({
selector: ".sj-item:visible",
onSelect: function(t) {
e.onMouseSelect(t),
e.mouseSelectRunning = !1
},
onStartSelect: function() {
e.mouseSelectRunning = !0
},
ignoreSelector: this.dragdropEnabled ? ".sj-item.selected, .draggable" : ""
}))
},
render: function() {
return this.setViewMode(this.viewMode),
this.selectmodeEnabled && this._renderSelectMode(),
this.$el.append(this.grid.$el),
this.checkEmpty(),
this
},
_renderSelectMode: function() {
this.$el.toggleClass("selected", this._selectMode)
},
getSelectMode: function() {
return this._selectMode
},
setSelectMode: function(e) {
e = !!e,
this.selectmodeEnabled && this._selectMode !== e && (this._selectMode = e,
this._renderSelectMode(),
this.trigger("selectmode", this._selectMode))
},
setViewMode: function(e) {
e && (this.viewMode = e),
this.viewMode === "grid" ? this.$el.addClass("isGrid").removeClass("isList") : this.$el.addClass("isList").removeClass("isGrid"),
this.grid.trigger("viewmode", this.viewMode)
},
startEditor: function(e) {
var n = this.grid.getItemViewByModel(e), r, s = "/", o = "\\t\\n\\r", a = t.template(h)({
Lang: i,
chars: s
});
if (!n) {
console.error("Cannot start editor: view not found by model", e);
return
}
this._editor && (p.track({
op: "rename-end",
target: "accident"
}),
this._completeEditing()),
this._editingModel = e,
n.$el.addClass("editing"),
n.toggleDraggable(!1),
r = n.$el.find(".file-item-displayname"),
this._editor = new u.InlineEditor({
pasteFilter: new RegExp("[" + s + o + "]","g"),
filter: new RegExp("[" + s + "]"),
filterTooltipHtml: a
}),
this._editor.render().$el.appendTo(r),
this._editor.$input.css("white-space") === "nowrap" && this._editor.$input.attr("wrap", "off"),
this.listenTo(this._editor, "done", this._saveEdit),
this.listenTo(this._editor, "abort", this._abortEdit),
this.listenTo(this._editor, "paste", this._editorPaste),
this._editor.setValue(e.get("display_name")),
this._editor.$input.focus(),
this._editor.setSelection(e.get("base_name").length)
},
_completeEditing: function() {
var e = this.grid.getItemViewByModel(this._editingModel);
e && (e.$el.removeClass("editing"),
e.toggleDraggable(!0)),
this._editor.remove(),
this.stopListening(this._editor, "abort done paste"),
this._editor = null,
this._editingModel = null
},
_saveEdit: function(e) {
var t, n = this._editor.getValue();
e && (e.type === "blur" || e.type === "focusout" ? t = "blur" : e.type === "keyup" && e.which === 13 ? t = "enter" : e.type === "click" && (t = "click")),
t && p.track({
op: "rename-end",
target: t
}),
n && n !== this._editingModel.get("display_name") && (this.model.rename(this._editingModel, n),
this.collection.getSelected().length === 1 && this.collection.deselectAll()),
this._completeEditing()
},
_abortEdit: function() {
p.track({
op: "rename-end",
target: "abort"
}),
this._completeEditing()
},
_editorPaste: function() {
p.track({
op: "rename",
target: "paste"
})
},
stopEditing: function(e) {
return this._editor ? (this._saveEdit(e),
!0) : !1
},
onItemClick: function(n, r) {
this._editingStopped || (this._editingStopped = this.stopEditing(r));
if (!n) {
this._itemToEdit = null;
return
}
if (!n.get("readable")) {
this._itemToEdit = null;
return
}
if (this.mouseSelectRunning) {
this._itemToEdit = null;
return
}
if (!this.editEnabled || !this.model.get("writable") || !n.get("writable")) {
this._itemToEdit = null,
this._actionOrSelect(n, r);
return
}
if (!e(r.target).closest(".label-text.display_name").length) {
this._itemToEdit = null,
this._dblclick_timeout && (clearTimeout(this._dblclick_timeout),
this._dblclick_timeout = null);
if (this._editingStopped) {
this._editingStopped = !1;
return
}
this._actionOrSelect(n, r);
return
}
if (this._itemToEdit && this._itemToEdit !== n) {
this._dblclick_timeout && (clearTimeout(this._dblclick_timeout),
this._dblclick_timeout = null),
this._itemToEdit = null;
return
}
this._dblclick_timeout && this._itemToEdit === n ? (clearTimeout(this._dblclick_timeout),
this._dblclick_timeout = null,
this._itemToEdit = null,
this._rename(n),
p.track({
op: "rename-start",
target: "dblclick",
viewmode: this.viewMode
}),
this._editingStopped = !1) : (this._itemToEdit = n,
this._dblclick_timeout = setTimeout(t.bind(function() {
this._dblclick_timeout = null,
this._itemToEdit = null,
this._editingStopped ? this._editingStopped = !1 : this._actionOrSelect(n, r)
}, this), d.doubleClickDelay))
},
onContextmenu: function(e, t) {
this.selectmodeEnabled && (t && !t.selected ? (this.collection.firstSelected() && this.collection.deselectAll(),
this.collection.select(t)) : t || this.collection.deselectAll()),
this.trigger("contextmenu", e, t)
},
_actionOrSelect: function(t, n) {
e(n.target).is(".icon-item-shared") && p.track({
op: "share-info",
target: "file-shareicon"
});
var r = e(n.target).closest("[data-action]")
, i = r.data("action");
r && i ? this.trigger("action:" + i, t) : this.collection.firstSelected() || this._selectMode ? this.onItemSelect(t, n, !0) : t.isDir() ? (this._trackNavigation(t, n),
this.model.load(t.get("path"))) : t.get("type") !== "symlink" && this.trigger("open", t)
},
_trackNavigation: function(t, n) {
var r = "sj-item";
n && (e(n.target).closest(".file-item-icon").length ? r = "sj-item-icon" : e(n.target).closest(".file-item-label").length && (r = "sj-item-title")),
p.track({
op: "navigate",
target: r,
viewmode: this.viewMode
})
},
_rename: function(e) {
this.trigger("rename", e)
},
_isMoreThenOneSelected: function() {
var e = !1;
return this.collection.find(function(t) {
return e ? t.selected : (e = t.selected,
!1)
})
},
onItemSelect: function(e, n, r) {
if (this.stopEditing())
return;
if (!e.get("readable"))
return;
var i = this.viewMode
, s = t.bind(function(t) {
e.selected ? this._isMoreThenOneSelected() ? p.track({
op: "select-remove",
target: t,
viewmode: i
}) : p.track({
op: "select-end",
target: t,
viewmode: i
}) : p.track({
op: "select-add",
target: t,
viewmode: i
})
}, this);
r ? s("icon") : this.collection.firstSelected() ? s("checkbox") : p.track({
op: "select-start",
target: "checkbox",
viewmode: i
}),
e.trigger("select", e, n.shiftKey, n.ctrlKey)
},
onLoadStart: function() {
this.$el.contents().detach(),
this.$el.mouseSelect("off")
},
remove: function() {
return this.$el.mouseSelect("off"),
this.grid.remove(),
n.View.prototype.remove.apply(this, arguments)
},
onMouseSelect: function(e) {
t.each(e, function(e) {
var t = this.grid.findModelForElement(e);
t && this.collection.select(t)
}, this)
},
_renderItemSelection: function(e) {
var t = this.grid.getItemViewByModel(e);
t && t.$el.toggleClass("selected", e.selected === !0)
},
onChangeSelected: function(e) {
this._renderItemSelection(e),
this.setSelectMode(!!this.collection.firstSelected())
},
onSelectAll: function() {
t.each(this.collection.getSelected(), function(e) {
this._renderItemSelection(e)
}, this),
this.setSelectMode(!0)
},
onDeselectAll: function() {
this.collection.each(function(e) {
this._renderItemSelection(e)
}, this),
this.setSelectMode(!1)
},
onRemoveEnd: function(e) {
t.each(e, function(e) {
this._renderItemSelection(e)
}, this),
this.collection.firstSelected() || this.setSelectMode(!1)
}
})
}),
define("filemanager/js/views/filemanager", ["jquery", "underscore", "backbone", "text!./filemanager.html", "../models/folder", "./fileitemgrid", "gui", "api", "lang", "tracker"], function(e, t, n, r, i, s, o, u, a, f) {
return n.View.extend({
className: "filemanager",
template: t.template(r),
downloadArchivePrefix: null,
initialize: function(e) {
this.downloadArchivePrefix = e.downloadArchivePrefix,
this.dragdropEnabled = !!e.dragdropEnabled,
this.uploadEnabled = !!e.uploadEnabled,
this.dropUploadEnabled = !0,
this.uploadItems = e.uploadItems,
this.model = this.model || new i({
itemfilter: e.itemfilter,
itemparser: e.itemparser
}),
t.defaults(this, t.pick(e, "rootPath"), {
rootPath: "/"
}),
this.listenTo(this.model, "download", this.onDownload),
this.listenTo(this.model.files, "download", this.onSingleDownload),
this.listenTo(this.model.files, "load", this._onLoad),
this.listenTo(this.model.files, "add", this.onAdd),
this.listenTo(this.model.files, "load:start", this._onLoadStart);
var n = {
model: this.model,
collection: this.model.files,
container: e.container,
lazyLoadingEnabled: e.lazyLoadingEnabled,
selectmodeEnabled: e.selectmodeEnabled,
editEnabled: e.editEnabled,
headerTpl: e.headerTpl,
itemTpl: e.itemTpl,
emptyTpl: e.emptyTpl,
dragdropEnabled: this.dragdropEnabled,
viewMode: e.viewMode || "grid"
};
if (this.dragdropEnabled || this.uploadEnabled)
n.canDrop = t.bind(this._canDrop, this);
this.grid = new s(n),
this._dragItemsIds = [],
this.listenTo(this.grid, "rename", this.rename),
this.listenTo(this.grid, "action:share-info", this.onShareInfo),
this.listenTo(this.grid, "action:download", this.onSingleDownload),
this.listenTo(this.grid, "contextmenu", this.onContextmenu),
this.listenTo(this.grid, "selectmode", this.onSelectMode),
this.listenTo(this.grid, "open", this.onOpen),
this.dragdropEnabled && (this.listenTo(this.grid.grid, "drag:start", this._onDragStart),
this.listenTo(this.grid.grid, "drag:end", this._onDragEnd));
if (this.dragdropEnabled || this.uploadEnabled)
this.listenTo(this.grid.grid, "drag:over", this._onDragOver),
this.listenTo(this.grid.grid, "drag:leave", this._onDragLeave),
this.listenTo(this.grid.grid, "drop", this._onDrop)
},
render: function() {
return this.$el.contents().detach(),
this.$el.append(e(this.template())),
this.$(".grid-target").replaceWith(this.grid.$el),
this._onLoadStart(),
this
},
setViewMode: function(e) {
this.grid.setViewMode(e),
this.loading || this.grid.render()
},
_onLoad: function() {
this.grid.render(),
this._setLoadingState(!1),
this._updateDropState(!0),
this.model.get("path") && this.trigger("navigate", this.model.get("path"))
},
_updateDropState: function(e) {
this.canDropUpload = e && !!this.uploadItems && !!this.model.get("writable"),
this.grid.$el.toggleClass("canDropUpload", this.canDropUpload)
},
remove: function() {
this.grid.remove(),
n.View.prototype.remove.apply(this, arguments)
},
_onLoadStart: function() {
if (this.loading)
return;
this._updateDropState(!1),
this._setLoadingState(!0)
},
_setLoadingState: function(e) {
this.loading = e,
this.$el.toggleClass("filemanager-loading", e)
},
scrollIntoView: function(e) {
this.grid.trigger("scrollIntoView", e)
},
rename: function(e) {
e || (e = this.model.files.firstSelected()),
this.grid.startEditor(e)
},
getSelectMode: function() {
return this.grid.getSelectMode()
},
setSelectMode: function(e) {
this.grid.setSelectMode(e)
},
onShareInfo: function(e) {
this.model.trigger("share-info", e)
},
onDownload: function() {
var e = this.model, t = e.files, n = t.getSelected(), r;
n.length && n.length < t.length ? r = n : r = [this.model],
n.length ? n.length === 1 && n[0].isDir() ? f.track({
op: "download",
target: "folder"
}) : n.length === 1 && !n[0].isDir() ? f.track({
op: "download",
target: "file"
}) : f.track({
op: "download",
target: "selection"
}) : f.track({
op: "download",
target: "all"
}),
u.download(r, this.model, {
archivePrefix: this.downloadArchivePrefix
}),
this.model.files.deselectAll()
},
onSingleDownload: function(e) {
u.download(e, this.model, {
archivePrefix: this.downloadArchivePrefix
})
},
onContextmenu: function(e, t) {
this.trigger("contextmenu", e, t)
},
onSelectMode: function(e) {
this.trigger("selectmode", e)
},
onOpen: function(e) {
this.trigger("open", e)
},
_canDrop: function(e, n, r) {
var i = !1
, s = !!this._dragItemsIds.length
, o = t.contains(n.types, "Files");
return r ? s && !t.contains(this._dragItemsIds, r.id) && (i = r.isDir() && r.get("writable") && !r.selected) : this.dropUploadEnabled && this.canDropUpload && o && (n.dropEffect = "copy",
i = !0),
i
},
_onDragStart: function(e, n) {
var r = n.get("id")
, i = [r]
, s = t.pluck(this.model.files.getSelected(), "id");
s.length && (t.contains(s, r) ? i = s : this.model.files.deselectAll()),
this._dragItemsIds = i,
e.originalEvent.dataTransfer.effectAllowed = "all",
e.originalEvent.dataTransfer.dropEffect = "move",
e.originalEvent.dataTransfer.setData("Text", JSON.stringify(i))
},
_onDragOver: function(t, n, r) {
this.grid.$el.toggleClass("isDraggedOver", !!t && !r),
this.grid.grid.$(".sj-dragged-over").removeClass("sj-dragged-over"),
t && r && e(t).addClass("sj-dragged-over")
},
_onDragLeave: function() {
this.grid.$el.removeClass("isDraggedOver"),
this.grid.grid.$(".sj-dragged-over").removeClass("sj-dragged-over")
},
_onDrop: function(e, t, n) {
if (n) {
var r = this.model.files.filter(function(e) {
return this._dragItemsIds.indexOf(e.id) > -1
}, this);
if (!r.length)
return;
this.trigger("move", n, r)
} else
t && t.files.length && (this.uploadItems.addFiles(this.model, t.files),
this._trackDrop(t))
},
_onDragEnd: function() {
this._dragItemsIds = []
},
_trackDrop: function(e) {
var n = "unknown"
, r = t.chain(e.types);
r.contains("Files").value() && !r.contains("text/x-moz-url").value() ? n = "files" : n = r.without("Files").map(function(e) {
return e.split("/")[0]
}).uniq().value().sort().join(","),
f.track({
op: "drop",
target: "filemanager",
data: n
})
},
setDropUploadEnabled: function(e) {
this.dropUploadEnabled = !!e
}
})
}),
define("filemanager/main", ["./js/views/filemanager"], function(e) {
return function(t) {
return new e(t)
}
}),
define("filemanager", ["filemanager/main"], function(e) {
return e
}),
define("filemanager/js/views/folderBreadcrumb", ["underscore", "gui", "api", "lang"], function(e, t, n, r) {
return t.Breadcrumb.extend({
className: "folder-breadcrumb sj-breadcrumb",
initialize: function() {
t.Breadcrumb.prototype.initialize.apply(this, arguments);
if (this.config.leadInSegment) {
if (!this.config.leadInSegment.name)
throw new Error("lead-in segment must define a name");
if (!this.config.leadInSegment.href)
throw new Error("lead-in segment must define a href");
if (!this.config.leadInSegment.title)
throw new Error("lead-in segment must define a title")
}
this.listenTo(this.model, "change:share", this.updateSegments),
this.listenTo(this.model.files, "load", this.renderSegments),
this.buildSegments()
},
buildSegments: function() {
var t = this.model.get("path");
t = t.replace(/\/$/, "");
var i = t.split("/")
, s = []
, o = ""
, u = this.config.rootName;
this.config.leadInSegment && s.push(this.config.leadInSegment),
e.each(i, function(e) {
var t = o += (o === "/" || o + e === u ? "" : "/") + e
, r = n.Encoding.urlDecode(t);
if (e === "") {
if (!u)
return;
e = u
}
var i = n.Encoding.urlDecode(e);
s.push({
name: i,
href: this.config.prefix + t,
title: r
})
}, this),
this.model.get("share") && (s[s.length - 1].icon = {
className: "share icon-breadcrumb-shared",
title: r.get("filemanager.share.tooltip")
}),
this.segments = s
},
updateSegments: function() {
this.segments.length && this.renderSegments()
},
renderSegments: function() {
return this.buildSegments(),
this.render()
},
setRoot: function(e) {
this.config.rootName = e,
this.renderSegments()
}
})
}),
define("gui/bar/barView", ["backbone"], function(e) {
return e.View.extend({
className: "bar",
render: function(e) {
return this.$el.width(e + "%"),
this
}
})
}),
define("filemanager/js/models/uploadItem", ["jquery", "underscore", "backbone", "api", "formatters"], function(e, t, n, r, i) {
var s = {
QUEUED: "queued",
WAITING: "waiting",
RUNNING: "running",
COMPLETE: "complete",
CANCELLED: "cancelled",
FAILED: "failed"
}
, o = 0;
return n.Model.extend({
defaults: {
progress: 0,
completed: 0,
status: s.QUEUED,
error: null
},
initialize: function(e) {
var t = e.file, n = "", i = e.folder, s = e.eventId, u;
delete e.folderId,
delete e.file,
delete e.eventId,
this.data = null,
this._file = t,
this._folder = i,
this._eventId = s,
u = t.name.split("."),
u.length > 1 && u[0] !== "" && (n = u.pop()),
this.set({
id: ++o,
name: t.name,
size: t.size,
modified: t.lastModifiedDate,
type: t.type,
group: r.Filegroups.get(n)
}),
this.listenTo(this, "change:status", this.onChangeStatus)
},
_getTmpFilename: function() {
var e = new Date
, t = "YmdHis"
, n = i.date(e.getTime() / 1e3, t);
return [this._file.name, n, "webupload"].join(".")
},
upload: function() {
function f(n, s) {
var o = r.newFile(n, s);
return t._xhrAbort = o.abort,
o.then(function(e) {
i = e.clone()
}, function(t, n, r) {
return e.Deferred().reject(r).promise()
})
}
function l() {
var n, s = [], f = 0, l = 0, c = Math.ceil(u.size / o), p;
for (; f < c; f++)
p = Math.min(l + o, u.size),
s.push(u.slice(l, p)),
l = p;
return n = s.reduce(function(e, n, s) {
return e.then(function() {
a = s * o;
var e = r.patchFile(i, n, s * o, h);
return t._xhrAbort = e.abort,
e
})
}, e.Deferred().resolve()),
n.then(null, function(t, n, r) {
return e.Deferred().reject(r).promise()
})
}
function c() {
return r.rename(i, t.get("name"), t.get("on_exist")).then(function(t, n) {
return e.Deferred().resolve(n.attributes).promise()
}, function(t, n, r, i) {
return e.Deferred().reject(i).promise()
})
}
function h(e) {
var n = a + e.loaded;
t.set({
completed: n,
size: u.size,
progress: Math.min(1, +(n / u.size).toFixed(3))
})
}
function p() {
i && r.deleteFiles([i])
}
var t = this, n = this._getTmpFilename(), i, o = 15728640, u = this._file, a = 0;
return this.set({
status: s.RUNNING
}),
f(this.getFolder(), n).then(l).fail(p).then(c).then(function(e) {
return t._onSuccess(e, "success")
}, function(e) {
return t._onError(e)
})
},
_onSuccess: function(t) {
var n = e.Deferred();
return this.data = t,
this.set({
progress: 1,
status: s.COMPLETE
}),
n.resolve(this, "success"),
n.promise()
},
_onError: function(n) {
var r, i = e.Deferred();
return n === "abort" ? (i.resolve(this, "abort"),
i.promise()) : (r = {
progress: 1,
error: n
},
this.get("status") !== s.CANCELLED && t.extend(r, {
status: s.FAILED
}),
this.set(r),
i.reject(this, n),
i.promise())
},
onChangeStatus: function(e) {
var n = [s.CANCELLED, s.COMPLETE, s.FAILED];
t.contains(n, e) && (this.destroyItemReferences(),
this.stopListening(this, "change:status", this.onChangeStatus))
},
cancel: function() {
var e = [s.FAILED, s.CANCELLED, s.COMPLETE];
if (t.contains(e, this.get("status")))
return;
this._xhrAbort && this._xhrAbort(),
this.set("status", s.CANCELLED)
},
destroy: function() {
this.set({
id: null
}),
n.Model.prototype.destroy.apply(this, arguments)
},
destroyItemReferences: function() {
delete this._file,
delete this._xhrAbort
},
getFolder: function() {
return this._folder
},
getEventId: function() {
return this._eventId
}
}, {
STATUS: s
})
}),
define("text!templates/filemanager/uploadItemView.html", [], function() {
return '<div class="upload-item">\n <div class="upload-item-mimetype upload-overlay-group-icon icon-mimetype-group-<%= model.get("group") %>"></div>\n <div class="upload-item-infos">\n <div class="upload-item-details sj-selectable">\n <div class="upload-item-name" title="<%- model.get("name") %>"><%- model.get("name") %></div>\n <div class="upload-item-size-status">\n <span class="upload-item-size-progress"></span>\n <span class="upload-item-status"><%- lang.get("upload.detail.item.status.aborted") %></span>\n </div>\n </div>\n <div class="upload-item-progress progressbar-container">\n </div>\n </div>\n <div class="upload-item-controls">\n <button class="icon-container upload-item-cancel" data-action="cancel" data-track-op="upload-cancel" data-track-target="item">\n <span class="icon-upload-cancel"></span>\n </button>\n </div>\n</div>\n'
}),
define("filemanager/js/views/uploadItemView", ["underscore", "gui/grid/views/itemView", "gui/bar/barView", "../models/uploadItem", "text!templates/filemanager/uploadItemView.html", "lang", "formatters"], function(e, t, n, r, i, s, o) {
var u = e.values(r.STATUS), a, f = function(e) {
return "upload-status-" + e
};
return a = e.map(u, f).join(" "),
t.extend({
template: e.template(i),
initialize: function() {
t.prototype.initialize.apply(this, arguments),
this.progressBar = new n,
this.listenTo(this.model, "change:status", this.updateProgress),
this.listenTo(this.model, "change:progress", this.updateProgress)
},
render: function() {
return t.prototype.render.call(this),
this.updateProgress(),
this
},
remove: function() {
return this.progressBar.remove(),
t.prototype.remove.apply(this, arguments)
},
_addStatusClasses: function() {
var e = this.model.get("status");
this.$el.removeClass(a),
this.$el.addClass(f(e))
},
updateProgress: function() {
this._renderProgressBar(),
this._addStatusClasses(),
this.$(".upload-item-size-progress").length && this._renderProgressSize()
},
_renderProgressBar: function() {
var e = this.$(".progressbar-container");
if (e.length) {
var t = this.model.get("progress") * 100;
this.progressBar.render(t),
e.html(this.progressBar.$el)
}
},
_renderProgressSize: function() {
var e, t = o.size(this.model.get("size"));
if (this.model.get("progress") < 1) {
var n = o.size(this.model.get("completed"));
e = s.get("upload.detail.item.status.transferred", [n, t])
} else
e = t;
this.$(".upload-item-size-progress").text(e)
}
})
}),
define("text!templates/filemanager/uploadDetailTitle.html", [], function() {
return "<%= progress %>\n"
}),
define("filemanager/js/views/uploadDetailTitleView", ["underscore", "backbone", "lang", "../models/uploadItem", "text!templates/filemanager/uploadDetailTitle.html"], function(e, t, n, r, i) {
return t.View.extend({
tagName: "span",
template: e.template(i),
initialize: function() {
this.listenTo(this.collection, "add remove change:status reset", this.render)
},
render: function() {
var e, t = this.collection.length, r = this.collection.filter(this.remainingUploadsFilter), i = r.length > 0;
return i ? e = r.length === 1 ? n.get("upload.detail.title.progress.single", [t, r.length]) : n.get("upload.detail.title.progress.multi", [t, r.length]) : e = t === 1 ? n.get("upload.detail.title.done.single", [t]) : n.get("upload.detail.title.done.multi", [t]),
this.$el.html(this.template({
lang: n,
progress: e
})),
this
},
remainingUploadsFilter: function(t) {
var n = [r.STATUS.RUNNING, r.STATUS.WAITING, r.STATUS.QUEUED];
return e.contains(n, t.get("status"))
}
})
}),
define("text!templates/filemanager/uploadStats.html", [], function() {
return ""
}),
define("filemanager/js/views/uploadStatsView", ["underscore", "backbone", "lang", "filemanager/js/models/uploadItem", "gui/bar/barView", "text!templates/filemanager/uploadStats.html"], function(e, t, n, r, i, s) {
return t.View.extend({
className: "upload-stats",
_template: e.template(s),
events: {
click: "onClick",
"click .close": "onClose"
},
initialize: function() {
this.listenTo(this.collection, "update-stats", this._renderStats),
this.listenTo(this.collection, "change:progress change:status", this._renderProgressBar),
this.progressBarView = new i
},
onClick: function() {
this.trigger("click")
},
onClose: function(e) {
e.stopPropagation(),
this.collection.removeFinished(),
this.trigger("close")
},
render: function() {
return this.$el.html(this._template()),
this._renderStats(this.collection.getStats()),
this._renderProgressBar(),
this
},
_renderStats: function(e) {
var t = e.all - e.completed - e.failed - e.cancelled;
this.$(".uploads-ok-text").text(n.get("upload.detail.stats.transfer", [e.completed, e.all])),
this.$(".uploads-error-text").text(n.get("upload.detail.stats.error", [e.failed, e.all])),
this.$el.toggleClass("running", !!t),
this.$el.toggleClass("error", !!e.failed),
this.$el.toggleClass("completed", !!e.completed && !t)
},
_renderProgressBar: function() {
var t = this.$(".progress-bar");
if (t.length) {
var n = 0;
this.collection.each(function(t) {
e.indexOf([r.STATUS.CANCELLED, r.STATUS.FAILED], t.get("status")) < 0 && (n += t.get("progress"))
});
var i = n * 100 / (this.collection.getStats().all || 1);
t.html(this.progressBarView.render(i).$el)
}
}
})
}),
define("filemanager/js/views/uploadButtonView", ["jquery", "backbone", "underscore", "gui", "actionManager"], function(e, t, n, r, i) {
return r.IconButton.extend({
_singleUploadOnlyUserAgentRegEx: /^.*Mac.*AppleWebKit\/.*Mobile\/.*$/,
getInputAttributes: function(e) {
return {
name: "anyname",
multiple: !e
}
},
events: {
"change input": "onChange",
"click input": "onClick"
},
inputType: "file",
render: function() {
r.IconButton.prototype.render.apply(this, arguments);
var t = this._singleUploadOnlyUserAgentRegEx.test(navigator.userAgent)
, n = e('<input type="' + this.inputType + '" />').attr(this.getInputAttributes(t));
return this.$el.append(n),
this
},
onClick: function() {
this.trigger("click")
},
onChange: function() {
var e = this.$("input")
, t = n.toArray(e[0].files) || [{
name: e.val().split(/\\/).pop(),
file: !1
}];
this.config.action && i.execute(this.config.action, t),
this.trigger("add", t),
this.render(),
this.delegateEvents()
}
})
}),
define("text!templates/filemanager/uploadDetailView.html", [], function() {
return '<div class="overlay-title">\n <div class="title-target"></div>\n</div>\n\n<div class="grid-target"></div>\n\n<div class="overlay-buttons">\n <div class="button-close"></div>\n\n <div class="button-cancel-all"></div>\n\n <div class="button-more-uploads"></div>\n</div>\n'
}),
define("filemanager/js/views/uploadDetailView", ["jquery", "underscore", "gui", "tracker", "lang", "./uploadItemView", "./uploadDetailTitleView", "./uploadStatsView", "./uploadButtonView", "../models/uploadItem", "text!templates/filemanager/uploadDetailView.html"], function(e, t, n, r, i, s, o, u, a, f, l) {
return n.BaseOverlayView.extend({
template: t.template(l),
autoClose: !1,
events: {
"click .cancel-all": "onCancelAll"
},
initialize: function(e) {
e && e.autoClose && (this.autoClose = !0),
t.has(e, "canClose") && (this.canClose = e.canClose),
this.grid = new n.Grid({
collection: this.collection,
itemViewClass: s
}),
this.title = new o({
collection: this.collection
}),
this.statsView = new u({
collection: this.collection
}),
this.closeButton = new n.Button({
text: i.get("upload.detail.close"),
secondary: !0
}),
this.listenTo(this.closeButton, "click", this.close),
this.upload = new a({
text: i.bind("upload.detail.moreuploads"),
iconClass: "icon-upload",
disabled: !this.model.get("writable")
}),
this.listenTo(this.upload, "click", this._trackUpload),
this.cancelAllButton = new n.Button({
text: i.get("upload.detail.cancelAll"),
secondary: !0
}),
this.listenTo(this.cancelAllButton, "click", this.onCancelAll),
this.listenTo(this.grid, "click", this.onGridClick),
this.listenTo(this.collection, "update-stats", this.onUploadStats)
},
render: function() {
this.$overlayEl.addClass("uploaddetail-overlay"),
this.$el.html(this.template({
lang: i
}));
var e = this.$(".grid-target");
e.length && e.replaceWith(this.grid.$el);
var t = this.$(".title-target");
t.length && t.replaceWith(this.title.render().$el);
var n = this.$(".stats-target");
n.length && n.replaceWith(this.statsView.render().$el);
var r = this.$(".button-close");
r.length && r.append(this.closeButton.render().$el);
var s = this.$(".button-more-uploads");
s.length && (s.append(this.upload.render().$el),
this.listenTo(this.upload, "add", this.addUpload));
var o = this.$(".button-cancel-all");
return o.length && o.append(this.cancelAllButton.render().$el),
this.renderUploadStats(this.collection.getStats()),
this
},
renderUploadStats: function(e) {
this.$overlayEl.toggleClass("uploads-running", e.remaining > 0)
},
remove: function() {
return this.grid.remove(),
this.title.remove(),
this.statsView.remove(),
this.closeButton.remove(),
this.cancelAllButton.remove(),
this.upload.remove(),
n.BaseOverlayView.prototype.remove.apply(this, arguments)
},
onBeforeClose: function() {
this.collection.getStats().remaining || this.collection.removeFinished(),
r.track({
op: "upload-status-hide",
target: "overlay"
})
},
addUpload: function(e) {
this.collection.addFiles(this.model, e)
},
_trackUpload: function() {
r.track({
op: "upload",
target: "overlay"
})
},
onCancelAction: function(e, t) {
t.data = e.get("status"),
this.collection.cancel(e)
},
onCancelAll: function() {
this.collection.abort()
},
onGridClick: function(n, i) {
if (n) {
var s = e(i.target).closest("[data-action]"), o, u, a, f = {}, l = {
cancel: "onCancelAction"
};
if (!s.length)
return;
u = s.data("track-op"),
a = s.data("track-target"),
u && a && (f = {
op: u,
target: a
}),
o = this[l[s.data("action")]],
t.isFunction(o) && o.call(this, n, f),
f.op && f.target && r.track(f)
}
},
onUploadStats: function(e) {
this.renderUploadStats(e),
this.autoClose && e.remaining === 0 && e.failed === 0 && this.close()
}
})
}),
define("filemanager/js/collections/uploadItems", ["jquery", "underscore", "backbone", "filemanager/js/models/uploadItem", "api/models/fileModel"], function(e, t, n, r, i) {
var s = r.STATUS;
return n.Collection.extend({
model: r,
comparator: function(e, t) {
return e.id > t.id ? 1 : -1
},
onError: function() {
return !1
},
initialize: function(e, n) {
n = n || {};
if (!t.isFunction(n.onBeforeStart))
throw new Error("Upload queue requires a onBeforeStart handler that calls the passed continuation callback");
this.onBeforeStart = n.onBeforeStart,
t.isFunction(n.onError) && (this.onError = n.onError),
this.listenTo(this, "add", this._onAdd),
this.listenTo(this, "add reset change:status remove", this._updateStats),
this._stats = t.extend({}, this._emptyStats)
},
_onAdd: function() {
this._alreadyCancelled = !1,
this._next()
},
_emptyStats: {
all: 0,
completed: 0,
running: 0,
failed: 0,
cancelled: 0,
remaining: 0
},
_updateStats: function() {
var e = function(e, t) {
var n = t.get("status");
return e.all++,
n === s.COMPLETE ? e.completed++ : n === s.FAILED ? e.failed++ : n === s.CANCELLED ? e.cancelled++ : n === s.RUNNING ? (e.running++,
e.remaining++) : e.remaining++,
e
};
this._stats = t.extend({}, this._emptyStats),
this._stats = t.reduce(this.toArray(), e, this._stats),
this.trigger("update-stats", this._stats)
},
getStats: function() {
return this._stats
},
_cancelQueued: function() {
this._alreadyCancelled = !0,
t.each(this.filter(function(e) {
return t.contains([s.QUEUED, s.WAITING], e.get("status"))
}), function(e) {
e.set({
status: s.CANCELLED,
progress: 0,
error: "CANCELLED"
})
}),
this.trigger("cancelled")
},
_findByStatus: function(e) {
return this.findWhere({
status: e
})
},
_findByAnyStatus: function(e) {
return this.find(function(n) {
return t.contains(e, n.get("status"))
})
},
_next: function() {
var e = this._findByStatus(r.STATUS.RUNNING) || this._findByStatus(r.STATUS.WAITING);
if (e)
return;
e = this._findByStatus(r.STATUS.QUEUED),
e ? this._beforeUpload(e) : this.trigger("complete")
},
_beforeUpload: function(e) {
var n = this;
e.set("status", s.WAITING),
this.onBeforeStart(e, function() {
n._upload(e)
}, function() {
e.destroy(),
n._next()
}, function() {
var i = e.getEventId(), o;
o = n.filter(function(e) {
return e.getEventId() === i && t.contains([s.QUEUED, s.WAITING], e.get("status"))
});
while (o.length > 0)
o.shift().destroy();
n._next()
}, function() {
e.set("status", r.STATUS.FAILED),
n._next()
})
},
_onUploadDone: function(e, t) {
if (t === "abort" || t === "success") {
this._next();
return
}
this.onError(e, t) === !0 ? this._alreadyCancelled || this._cancelQueued() : this._next()
},
_upload: function(e) {
if (e.get("status") !== s.WAITING)
return;
e.upload().always(t.bind(this._onUploadDone, this)),
this.trigger("upload", e)
},
cancel: function(e) {
return e ? (e.cancel(),
this._next(),
this) : this
},
abort: function() {
return this._cancelQueued(),
this.cancel(this._findByStatus(r.STATUS.RUNNING)),
this
},
removeFinished: function() {
var e = this.filter(function(e) {
return t.contains([r.STATUS.COMPLETE, r.STATUS.FAILED, r.STATUS.CANCELLED], e.get("status"))
});
this.remove(e)
},
reset: function() {
var e = [r.STATUS.RUNNING, r.STATUS.WAITING];
if (this._findByAnyStatus(e))
throw new Error("Refusing to reset: there's one item in running or waiting state");
n.Collection.prototype.reset.apply(this, arguments)
},
addFiles: function(e, n) {
var r = {
eventId: (new Date).getTime(),
folder: new i(e.attributes,{
parse: !0,
context: e.getContext()
})
};
t.each(n, function(e) {
this.add(t.extend({
file: e
}, r))
}, this)
}
})
}),
define("filemanager/js/models/baseFolder", ["underscore", "jquery", "./folder", "auth", "api"], function(e, t, n, r, i) {
return n.extend({
initialize: function(e) {
n.prototype.initialize.call(this, e),
this._shareVisitor = (e || {}).shareVisitorFn || t.noop,
this.listenTo(i, "rename:success", this._onRenameSuccess)
},
parse: function(t) {
var r;
t = n.prototype.parse.apply(this, arguments);
if (!t)
return null;
var i = function(t, n) {
var r = e.find(t, function(e) {
return e.share_type === n
});
return r ? r.id : null
}
, s = e.bind(function(t, n, r, i) {
return this._shareVisitor(e.extend({
pid: t,
type: n,
path: r
}, i))
}, this);
return t.rshare ? (r = e.filter(t.rshare, function(e) {
return e.share_type === "sharedir"
}),
r.length > 0 && s(t.id, "dir", t.path, r[0]) !== !1 ? t.share = i(t.rshare, "sharedir") : t.share = null,
delete t.rshare) : t.share = null,
e.each(t.members, function(t) {
t.rshare && (r = e.filter(t.rshare, function(e) {
return ["sharedir", "sharelink"].indexOf(e.share_type) > -1
}),
r.length > 0 && s(t.id, t.type, t.path, r[0]) !== !1 && (t.type === "dir" ? t.share = i(t.rshare, "sharedir") : t.share = i(t.rshare, "sharelink")),
delete t.rshare)
}, this),
t
},
queryData: {
fields: ["id", "path", "writable", "rshare", "members.id", "members.parent_id", "members.name", "members.ctime", "members.mtime", "members.path", "members.readable", "members.writable", "members.type", "members.size", "members.rshare"],
members: "all"
},
rename: function(t, n) {
if (!t)
throw new Error("no model to rename defined");
if (t instanceof this.files.model != 1)
throw new Error("FileItem Model required to rename");
if (e.isUndefined(n))
throw new Error("new name required in rename");
if (!e.isString(n))
throw new Error("new name must be of type string in rename");
return this.modelToRename = t,
i.rename(t, n).progress(e.bind(function(e, t) {
this.files.remove(e),
this.files.add(t)
}, this)).fail(e.bind(function(e, t) {
this.files.remove(t),
this.files.add(e)
}, this)).always(e.bind(function() {
this.modelToRename = null
}))
},
_onRenameSuccess: function(e, t) {
this.files.get(e.id) && e !== this.modelToRename && (this.files.remove(e),
this.files.remove(this.files.where({
path: t.get("path")
})),
this.files.add(t))
}
})
}),
define("filemanager/js/models/shareFolder", ["underscore", "./folder", "./baseFolder"], function(e, t, n) {
return n.extend({
itemfilter: function(e) {
return e.readable && e.type !== "symlink"
},
parse: function(e) {
return e = t.prototype.parse.apply(this, arguments),
e ? (e.path && e.path.indexOf("/") !== 0 && (e.path = "/" + e.path),
e) : null
},
queryData: {
fields: ["id", "path", "writable", "members.id", "members.parent_id", "members.name", "members.mtime", "members.path", "members.readable", "members.writable", "members.type", "members.image.width", "members.image.height", "members.size"],
members: "all"
}
})
}),
define("plugins/jquery/jquery.getscrollbarwidth", ["jquery"], function(e) {
var t;
e.getScrollbarWidth = function() {
if (typeof t == "undefined") {
var n = e("<div />").css({
width: 100,
height: 100,
overflow: "auto",
position: "absolute",
top: -1e3,
left: -1e3
}).prependTo("body").append("<div />").find("div").css({
width: "100%",
height: 200
});
t = 100 - n.width(),
n.parent().remove()
}
return e(document).height() > e(window).height() ? t : 0
}
}),
define("text!views/appView.html", [], function() {
return '<div id="header">\n <a href="<%= lang.get(\'header.teaser.url\') %>" class="header-teaser noimport" target="_blank">\n <div class="header-teaser-img bg-sprite"></div>\n <div class="header-teaser-text">\n <span class="header-teaser-text1"><%= lang.get("header.teaser.text1", logo) %></span>\n <span class="header-teaser-text2"><%= lang.get("header.teaser.text2") %></span>\n </div>\n </a>\n\n <div class="header-teaser import">\n <div class="header-teaser-img bg-sprite"></div>\n <div class="header-teaser-text">\n <span class="header-teaser-text1"><%= lang.get("header.teaser.import.text") %></span>\n <span class="import-target"></span>\n </div>\n </div>\n\n <div class="flex-wrapper">\n <div class="menubar-wrapper">\n <div class="container">\n <div class="logo">\n <span class="icon-logo bg-sprite"></span>\n <%= logo %>\n </div>\n\n <div class="menubar-target"></div>\n <div class="menubar-select-target"></div>\n </div>\n </div>\n\n <div class="breadcrumb-wrapper">\n <div class="container">\n <div class="breadcrumb-target"></div>\n <div class="toolbar-target"></div>\n </div>\n </div>\n </div>\n</div>\n\n<div id="content" class="container"></div>\n<div id="footer">\n <div class="footer-content container">\n <div class="footer-copyright">\n <span><%= lang.get("copyright") %></span>\n </div>\n <div class="footer-links">\n <div class="language-toggle-target"></div>\n <a href="<%= lang.get(\'imprint.url\') %>" class="imprint" target="_blank">\n <%= lang.get("imprint.title") %>\n </a>\n <a href="<%= lang.get(\'privacy.url\') %>" class="privacy_policy" target="_blank">\n <%= lang.get("privacy.title") %>\n </a>\n <a href="<%= lang.get(\'help.and.faq.url\') %>" class="help_contact" target="_blank">\n <%= lang.get("help.and.faq.title") %>\n </a>\n </div>\n </div>\n</div>\n'
}),
define("tracker/tealiumAdapter", ["jquery", "underscore", "modules/configInst"], function(e, t, n) {
var r = null
, i = "magentacloud.de"
, s = "alle";
return {
trackView: function(o) {
var u, a;
if (!o)
return;
u = o.replace(/^#/, "").replace(/^\$\/.*/, "files").replace(/^\$.[^/]*$/, "").replace(/^\$[^/]+\/.*/, "external-files").replace(/\//g, ".").toLowerCase();
if (u === "")
return;
a = [i, s, u].join("."),
r || (window.utag_data = {
page_content_id: a
},
r = e.getScript(n.get("tealium_uri"))),
r.then(function() {
window.utag && t.isFunction(window.utag.view) && window.utag.view({
page_content_id: a
})
})
},
reset: function() {
r = null
}
}
}),
define("views/appView", ["jquery", "underscore", "backbone", "lang", "lang/views/langToggleView", "api", "api/helpers/base64", "auth", "dialogs", "./login", "./loadingView", "modules/httpErrorView", "./encryptedView", "./teaser", "./filemanagerFooter", "./shareLinkView", "./poweredByView", "filemanager", "filemanager/js/views/folderBreadcrumb", "filemanager/js/views/uploadDetailView", "filemanager/js/collections/uploadItems", "filemanager/js/views/uploadButtonView", "gui", "filemanager/js/models/shareFolder", "plugins/jquery/jquery.getscrollbarwidth", "text!./appView.html", "text!./logo.html", "text!./fileitem.html", "text!./fileitemHeader.html", "localstorage", "tracker/tealiumAdapter", "actionManager"], function(e, t, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m, g, y, b, w, E, S, x, T, N, C, k, L, A, O, M) {
return n.View.extend({
template: t.template(N),
logoTemplate: t.template(C),
openOverlays: 0,
uploadDetailsOpen: !1,
initialize: function() {
var e, n, o, a, b, T, N, C, O;
this.state = {
page: undefined,
shareInfo: {},
views: []
},
this.views = {},
e = A.get("fm_sort_key"),
n = A.get("fm_sort_dir"),
this.uploadItems = new w([],{
onBeforeStart: function(e, t) {
e.set("on_exist", "autoname"),
t()
},
onError: function() {
return !0
}
}),
this.listenTo(this.uploadItems, "change:status", this.onChangeUploadItems),
this.listenTo(this.uploadItems, "add", this.onUploadAdded),
this._filemanagerModel = new x({
sortCol: e,
sortDir: n
}),
this.listenTo(this._filemanagerModel, "load:error", this.onLoadError),
this.listenTo(this._filemanagerModel.files, "sortBy", this.onSortBy),
this.listenTo(this._filemanagerModel.files, "load:start", this.onLoadStart),
this.listenTo(s, "download:error", this.onDownloadError),
this.listenTo(M, "execute", this.onActionExecute),
this.listenTo(S.OverlayManager.instance(), "pushed:first", this.onOverlayRendered),
this.listenTo(S.OverlayManager.instance(), "popped:last", this.onOverlayRemoved),
o = new S.IconButton({
text: r.bind("menubar.select"),
className: "select",
iconClass: "icon-select"
}),
this.listenTo(o, "click", this.onEnterSelectMode),
a = new S.IconButton({
text: r.bind("menubar.delete"),
className: "delete",
iconClass: "icon-delete",
action: "deleteFiles:menuItem",
actionData: t.bind(function() {
return this._filemanagerModel.files.getSelected()
}, this)
}),
b = new E({
text: r.bind("menubar.upload"),
iconClass: "icon-upload"
}),
this.listenTo(b, "add", this.onSelectFiles),
T = new S.IconButton({
text: r.bind("menubar.newfolder"),
iconClass: "icon-new-folder",
action: "newFolder:menuItem",
actionData: t.bind(function() {
return {
folder: this._filemanagerModel,
targetView: this.views.filemanager
}
}, this),
tracking: {
op: "new-folder",
target: "toolbar"
}
}),
N = new S.IconButton({
text: r.bind("menubar.unselect"),
className: "cancel"
}),
this.listenTo(N, "click", this.onDeselectAll),
C = new S.IconButton({
text: r.bind("menubar.unselect"),
className: "cancel"
}),
this.listenTo(C, "click", this.onDeselectAll),
O = new S.IconButton({
text: r.bind("menubar.select.download"),
iconClass: "icon-download-selection"
}),
this.listenTo(O, "click", this.onDownload),
this.externalShareImportButton = new S.Button({
className: "import-btn",
text: r.bind("header.teaser.import.button"),
action: "sendDataViaUrl:app",
actionData: t.bind(function() {
return {
target: "_blank",
prefix: "/#external-shares/import=",
data: this.state.shareInfo
}
}, this)
}),
M.setState("sendDataViaUrl:app", !1),
this.viewsConfig = {
login: {
klass: f,
config: {
loginCallback: t.bind(function(e) {
u.get().login(e).then(t.bind(function(e) {
this.trigger("loginSuccess", e)
}, this), t.bind(function(e) {
this.trigger("loginError", e)
}, this))
}, this)
}
},
loading: {
klass: l
},
error: {
klass: c
},
encrypted: {
klass: h
},
filemanager: {
klass: g,
config: {
model: this._filemanagerModel,
uploadItems: this.uploadItems,
editEnabled: !1,
headerTpl: L,
itemTpl: k,
downloadArchivePrefix: r.get("filemanager.download.archiveprefix"),
dragdropEnabled: !1,
uploadEnabled: !0,
viewMode: "list"
},
listeners: {
navigate: function(e) {
this.trigger("navigate", "$" + e)
},
selectmode: this.updateMenubars,
open: this.onOpen
}
},
filemanagerFooter: {
klass: d,
config: {
model: this._filemanagerModel
}
},
shareLink: {
klass: v,
listeners: {
error: function(e) {
this.trigger("error", e)
},
sharelinkData: function(e) {
this.setData(e)
}
}
},
teaser: {
klass: p
},
poweredBy: {
klass: m
},
breadcrumb: {
klass: y,
target: ".breadcrumb-target",
config: {
model: this._filemanagerModel,
prefix: "#$"
},
listeners: {
click: this.onBreadcrumbClick
}
}
},
this.langToggle = new i,
this.listenTo(this.langToggle, "selected", this.onLanguageChange),
this.menubar = new S.Menubar({
items: {
upload: b,
newFolder: T,
"actual/select": o,
unselect: N
}
}),
this.menubarSelect = new S.Menubar({
className: "menubar select container",
items: {
unselect: C,
"select/delete": a,
"select/download": O
}
}),
this.listenTo(this._filemanagerModel.files, "load add add:end change:selected selectAll deselectAll remove remove:end", this.updateMenubars),
this.listenTo(this._filemanagerModel, "change", this.updateMenubars)
},
onEnterSelectMode: function() {
this.views.filemanager.setSelectMode(!0)
},
onDeselectAll: function() {
this._filemanagerModel.files.deselectAll()
},
onUploadAdded: function() {
if (!this.uploadDetailsOpen) {
var e = new b({
collection: this.uploadItems,
model: this._filemanagerModel,
autoClose: !0
});
e.once("removed", function() {
this.uploadDetailsOpen = !1
}, this),
e.open(),
this.uploadDetailsOpen = !0
}
},
_onMessage: function(e) {
M.execute("showToast", e)
},
onLoadError: function(e, t) {
if (!this._filemanagerModel.get("path")) {
if (t.path === this.views.filemanager.rootPath) {
this.trigger("error");
return
}
this._filemanagerModel.load(this.views.filemanager.rootPath)
} else
this.views.filemanager.render(),
this.updateMenubars();
this._onMessage({
msg: r.bind("folder.loaderror.common", s.Encoding.urlDecode(t.path))
})
},
onDownloadError: function(e, t) {
var n = e[0]
, i = n.urlDecode("path");
this._onMessage({
msg: t.status === 404 ? n.files ? r.bind("filemanager.download_dir.error.404", i) : r.bind("filemanager.download.error.404", i) : r.bind("filemanager.download.error.common", i)
})
},
onSelectFiles: function(e) {
this.uploadItems.addFiles(this._filemanagerModel, e)
},
onChangeUploadItems: function(e) {
e.get("status") === this.uploadItems.model.STATUS.COMPLETE && e.data && this._filemanagerModel.get("id") === e.getFolder().get("id") && this._filemanagerModel.files.add(e.data, {
parse: !0
})
},
createViews: function() {
t.each(this.viewsConfig, function(e, n) {
this.views[n] = new e.klass(e.config),
e.listeners && t.each(e.listeners, function(e, t) {
this.listenTo(this.views[n], t, e)
}, this)
}, this)
},
onLoadStart: function() {
this.menubar.setActive(!1)
},
updateMenubars: function() {
var e = this.views.filemanager
, n = e.getSelectMode()
, r = this._filemanagerModel.files.getSelected()
, i = this._filemanagerModel.get("writable")
, s = t.some(this._filemanagerModel.files.getSelected(), function(e) {
return e.get("isTempUploadFile")
});
this.menubar.toggle(/upload/, !n && i),
this.menubar.toggle(/unselect/, n),
this.menubar.toggle(/actual\//, !n && !!this._filemanagerModel.files.length),
this.menubarSelect.toggle(/select\/download/, r.length && !s),
M.setState("deleteFiles:menuItem", !!r.length && i),
M.setState("newFolder:menuItem", !n && i),
this.menubar.setActive(!0),
this.menubarSelect.setActive(n)
},
onSortBy: function(e, t) {
A.put("fm_sort_key", e),
A.put("fm_sort_dir", t)
},
render: function() {
return this.$el.contents().detach(),
this.$el.html(this.template({
lang: r,
logo: this.logoTemplate({
lang: r
}).trim()
})),
t.isEmpty(this.views) && this.createViews(),
t.each(this.views, function(e, t) {
this.viewsConfig[t].target ? this.$(this.viewsConfig[t].target).replaceWith(e.render().$el.hide()) : this.$("#content").append(e.render().$el.hide())
}, this),
this.$(".import-target").replaceWith(this.externalShareImportButton.render().$el),
this.$(".language-toggle-target").replaceWith(this.langToggle.render().$el),
this.$(".menubar-target").replaceWith(this.menubar.render().$el),
this.$(".menubar-select-target").replaceWith(this.menubarSelect.render().$el),
this.$(".footer-content").append((new m).render().$el),
O.trackView("guestview"),
this
},
show: function(e, t) {
t = t || {},
e !== this.state.page && (this._hideCurrentPage(e),
this.menubar.setActive(!1),
this.menubarSelect.setActive(!1),
this.setImportState(!1));
switch (e) {
case "error":
this._showViews(["error", "teaser", "poweredBy"], t);
break;
case "encrypted":
this._showViews(["encrypted", "teaser", "poweredBy"]);
break;
case "login":
this._showViews(["login", "teaser", "poweredBy"], t);
break;
case "filemanager":
this._showViews(["breadcrumb", "teaser", "filemanager", "filemanagerFooter", "poweredBy"]),
t.path && this._filemanagerModel.load(t.path),
this.setData();
break;
case "loading":
this._showViews(["loading", "teaser", "poweredBy"], t);
break;
case "shareLink":
this._showViews(["shareLink", "teaser", "poweredBy"], t)
}
},
_hideCurrentPage: function(e) {
while (!t.isEmpty(this.state.views)) {
var n = this.getView(this.state.views.pop());
n.clear && n.clear(),
n.$el.hide()
}
this.state.page = e
},
_showView: function(e, t) {
return this.getView(e).render(t).$el.show(),
this
},
_showViews: function(e, n) {
var r = this;
t.each(e, function(e) {
r._showView(e, n).state.views.push(e)
})
},
getView: function(e) {
if (!this.views[e])
throw new Error("unknown alias in appView: " + e);
return this.views[e]
},
clear: function() {
t.each(this.views, function(e, t) {
this.stopListening(e),
e.remove(),
delete this.views[t]
}, this),
this.openOverlays = 0
},
setData: function(e) {
t.isObject(e) && (this.state.shareInfo = e),
this.getView("breadcrumb").setRoot(this.state.shareInfo.name),
t.delay(t.bind(this.setImportState, this, !0), 1e3)
},
setImportState: function(e) {
M.setState("sendDataViaUrl:app", e),
this.$("#header").toggleClass("import-enabled", e)
},
onOverlayRendered: function() {
this.openOverlays++;
if (this.openOverlays !== 1)
return;
this.views.filemanager && this.getView("filemanager").$(".header").css({
marginRight: e.getScrollbarWidth()
}),
this.$("#content").css({
top: -e(document).scrollTop(),
marginRight: e.getScrollbarWidth()
}).addClass("overlayed")
},
onOverlayRemoved: function() {
this.openOverlays--;
if (this.openOverlays !== 0)
return;
var t = -parseInt(this.$("#content").css("top"), 10);
this.$("#content").removeClass("overlayed").css({
top: "",
marginRight: ""
}),
this.views.filemanager && this.getView("filemanager").$(".header").css({
marginRight: ""
}),
e(document).scrollTop(t)
},
onOpen: function(e) {
M.execute("showFile", e)
},
onDownload: function() {
this._filemanagerModel.trigger("download")
},
onBreadcrumbClick: function(e) {
this._filemanagerModel.load(e)
},
onLanguageChange: function(e) {
this.trigger("navigate", "lang/" + e, {
trigger: !0
})
},
onActionExecute: function(e) {
e === "showFile" && O.trackView("guestview.view")
}
})
}),
define("modules/helpers/streakDetector", ["base"], function(e) {
return e.Object.extend({
initialize: function(e, t) {
if (typeof e != "number" || e < 2)
throw new Error("length must be number greater 1");
if (typeof t != "number" || t < 1)
throw new Error("interval must be number greater 0");
this._length = e,
this._interval = t,
this.reset()
},
update: function() {
this._streak.push((new Date).getTime()),
this._streak.length > this._length && this._streak.shift()
},
hasStreak: function() {
var e;
if (this._streak.length === this._length) {
e = this._streak[this._length - 1] - this._streak[0];
if (e <= this._interval)
return !0
}
return !1
},
reset: function() {
this._streak = []
}
})
}),
define("auth/baseAuth", ["jquery", "underscore", "base", "modules/helpers/streakDetector"], function(e, t, n, r) {
return n.Object.extend({
REAUTH_STREAK_LENGTH: 5,
REAUTH_STREAK_INTERVAL: 1e4,
initialize: function() {
this._reauthStreakDetector = new r(this.REAUTH_STREAK_LENGTH,this.REAUTH_STREAK_INTERVAL),
this._access_token = null,
this._reauth_fn = null
},
init: function(e) {
e.reauth_fn && (this._reauth_fn = e.reauth_fn),
e.access_token && (this._access_token = e.access_token)
},
getAccessToken: function() {
return this._access_token
},
isAuthorized: function() {
return !!this._access_token
},
_invalidateAuthorization: function() {
this._access_token = null
},
addAuthToUrl: function(e) {
return this.getAccessToken() ? (e = e.replace(/[\?&]access_token=[^&]+/, ""),
e.indexOf("?") !== -1 ? /&$/.test(e) || (e += "&") : e += "?",
e += "access_token=" + this.getAccessToken(),
e) : ""
},
addAuthToXhr: function(e, n) {
if (!this.getAccessToken())
return;
e.beforeSend = t.bind(function(e) {
e.setRequestHeader("Authorization", "Bearer " + this._access_token),
n && n(e)
}, this)
},
ajax: function(n) {
if (!this.isAuthorized())
throw new Error("not logged in");
var r = {
timeout: 9e4,
retry: !0
}, i, s, o, u;
return n = n || {},
i = e.extend(!0, {}, r, t.omit(n, "error")),
this.addAuthToXhr(i, n.beforeSend),
s = e.ajax(i),
o = t.bind(function() {
return this._reauthStreakDetector.reset(),
s
}, this),
u = t.bind(function(r, o) {
var u = n.error || e.noop
, a = n.context || this;
return o === "timeout" ? (u.apply(a, arguments),
s) : this._shouldReauth(r, i) ? (this._invalidateAuthorization(),
this._reauth_fn().then(t.bind(this.ajax, this, n), function() {
return s
})) : (u.apply(a, arguments),
s)
}, this),
t.extend({}, s, s.then(o, u))
},
_shouldReauth: function(e, t) {
return e.status !== 401 ? !1 : t.retry ? this._reauth_fn ? (this._reauthStreakDetector.update(),
this._reauthStreakDetector.hasStreak() ? !1 : !0) : !1 : !1
}
})
}),
define("auth/shareAuth", ["underscore", "jquery", "auth/baseAuth"], function(e, t, n) {
return n.extend({
initialize: function() {
this._sid = null,
this._password_login = !1,
n.prototype.initialize.apply(this, arguments)
},
init: function(e) {
e.sid && (this._sid = e.sid),
n.prototype.init.apply(this, arguments)
},
_invalidateAuthorization: function() {
this._password_login = !1,
n.prototype._invalidateAuthorization.apply(this)
},
hasPassword: function() {
return this._password_login
},
getShareInfo: function() {
return t.get("/api/share/info", {
id: this._sid
})
},
getUser: function() {
return {
home: "/"
}
},
login: function(n) {
var r = {
id: this._sid
}
, i = {
password: null
};
return n = e.extend(i, n),
n.password && (e.extend(r, {
password: n.password
}),
this._password_login = !0),
t.ajax({
url: "/api/share/token",
method: "POST",
data: r
}).then(e.bind(function(e) {
return this._access_token = e.access_token,
r.password && (e.password = r.password),
this.trigger("login:success", e),
e
}, this), e.bind(function(e) {
return this._password_login = !1,
this.trigger("login:error", e.status),
e
}, this)).always(e.bind(function() {
this.trigger("auth")
}, this))
},
logout: function() {
return this.ajax({
url: "/api/share/token",
method: "DELETE"
}).done(e.bind(function() {
this._invalidateAuthorization(),
this.trigger("logout:success"),
this.trigger("auth")
}, this))
}
})
}),
define("router", ["underscore", "jquery", "backbone", "lang", "modules/window", "./views/appView", "api", "modules/constants", "auth", "auth/shareAuth"], function(e, t, n, r, i, s, o, u, a, f) {
var l = o.Router.extend({
sid: null,
routesHit: 0,
views: {},
_startFragment: "",
routes: {
"$*path": "path",
"!:error": "error",
"lang/:lang": "language",
"login(/:state)": "login",
logout: "logout",
encrypted: "encrypted",
file: "shareLink"
},
initialize: function() {
a.register(u.authContext.default, function() {
return new f
}),
o.Router.prototype.initialize.apply(this, arguments),
n.history.on("route", function() {
this.routesHit++
}, this),
this.buildViews()
},
start: function() {
var e = i.getLocation()
, t = e.pathname.match(/(share|lnk)\/([^\/]+)\/?$/);
this._startFragment = i.getAnchor(),
this.navigate(),
t ? (this.sid = t[2],
t[1] === "lnk" ? this.navigate("file", {
replace: !0,
trigger: !0
}) : this.authenticate()) : this.navigate("!404", !0)
},
authenticate: function() {
var t = this
, n = function(e) {
e.status === 401 ? t.navigate("login/expired", {
trigger: !0,
replace: !0
}) : e.status === 404 ? t.navigate("!404", !0) : t.navigate("!500", !0)
};
this.auth.init({
sid: this.sid,
reauth_fn: function() {
return t.auth.login().fail(n)
}
}),
this.auth.getShareInfo().done(function(n) {
n.is_encrypted ? t.navigate("encrypted", !0) : n.has_password ? t.navigate("login", !0) : t.auth.login().then(e.bind(t.onLoginSuccess, t), e.bind(t.onLoginError, t))
}).fail(function(e) {
var n = e.status;
n === 400 && (n = 404),
t.navigate("!" + n, !0)
})
},
restart: function(e) {
this.buildViews(),
e && this.back(e)
},
buildViews: function() {
this.appView ? (this.appView.clear(),
this.appView.render()) : (this.appView = new s,
this.listenTo(this.appView, "navigate", this.navigate),
this.listenTo(this.appView, "error", this.error),
this.listenTo(this.appView, "loginError", this.onLoginError),
this.listenTo(this.appView, "loginSuccess", this.onLoginSuccess),
t("body").html(this.appView.render().$el)),
this.appView.show("loading")
},
language: function(e) {
var n = this;
t("body").fadeOut("fast", function() {
try {
n.setLanguage(e),
n.restart(1),
t("body").show()
} catch (r) {
t("body").show()
}
})
},
login: function(e) {
this.appView.show("login", {
error: e
})
},
logout: function() {
this.navigate("login")
},
path: function(e) {
this.auth.isAuthorized() ? this.appView.show("filemanager", {
path: e
}) : this.navigate("login", !0)
},
error: function(e) {
this.appView.show("error", {
code: e
})
},
encrypted: function() {
this.appView.show("encrypted")
},
shareLink: function() {
this.appView.show("shareLink", {
sid: this.sid
})
},
back: function(e) {
this.routesHit > e ? window.history.go(0 - e) : this.navigate("$/", {
trigger: !0,
replace: !0
})
},
onLoginError: function(e) {
if (i.getAnchor() === "login") {
var t = 500;
if (e.status === 403 || e.status === 401)
t = "password";
this.appView.show("login", {
error: t
})
} else
e.status === 401 ? this.navigate("login", {
trigger: !0,
replace: !1
}) : this.navigate("!" + e.status, {
trigger: !0,
replace: !1
})
},
onLoginSuccess: function(e) {
var t = {
id: this.sid,
name: e.root_name,
type: "sharedir"
};
e.password && (t.pw = e.password),
this.appView.setData(t);
var n = /^[^$\/].*/
, r = this._startFragment.replace(n, "$/") || "$/";
this.navigate(r, {
trigger: !0,
replace: !1
})
}
});
return l
}),
define("actions/deleteFiles", ["underscore", "formatters", "lang", "dialogs", "tracker", "actionManager", "api"], function(e, t, n, r, i, s, o) {
var u = function(e, r) {
var i;
e.length && (r && r.length ? i = n.bind("filemanager.delete.error.some", [r.length, e.length]) : i = e.length === 1 ? n.bind("filemanager.delete.error.one", t.breakable(e[0].get("display_name"))) : n.bind("filemanager.delete.error.all", e.length),
s.execute("showToast", {
msg: i
}))
};
return function(a) {
var f;
a.length === 1 ? f = n.get("filemanager.delete.prompt.single", t.escapedBreakable(a[0].get("display_name"))) : f = n.get("filemanager.delete.prompt.multi", a.length),
r.confirm({
message: f,
okButtonText: n.get("filemanager.delete.prompt.ok"),
cancelButtonText: n.get("filemanager.delete.prompt.cancel")
}).then(e.bind(function(e) {
e ? o.deleteFiles(a).always(u) : i.track({
op: "delete-abort",
target: "confirm-dialog",
data: a.length
})
}, this))
}
}),
define("actions/newFolder", ["underscore", "lang", "tracker", "actionManager", "api"], function(e, t, n, r, i) {
return function(s) {
var o = s.folder;
i.newFolder(o, t.get("filemanager.newfolder.defaultname"), !0).done(function(e) {
var t = s.targetView;
n.track({
op: "new-folder",
data: "created"
}),
e = o.files.get(e);
if (!e)
return;
r.execute("rename", {
model: e,
view: t
})
}).fail(e.bind(function(e, i) {
n.track({
op: "new-folder",
data: "error.code." + i.status
}),
r.execute("showToast", {
msg: t.bind("filemanager.newfolder.error.common")
})
}, this))
}
}),
define("actions/rename", ["underscore", "backbone"], function(e, t) {
return function(n) {
var r, i;
if (!n || !e.isObject(n))
throw new Error("The action needs a valid params-object.");
r = n.model,
i = n.view;
if (!i)
throw new Error("A valid view needs to be provided.");
if (!(r instanceof t.Model))
throw new Error("A valid model needs to be provided.");
if (!e.isFunction(i.rename))
throw new Error('The provided view needs to have a "rename" method.');
e.isFunction(i.scrollIntoView) && i.scrollIntoView(r.id),
i.rename(r)
}
}),
define("actions/sendDataViaUrl", ["underscore", "api/helpers/base64", "modules/window"], function(e, t, n) {
return function(r) {
var i = ""
, s = {
target: "_top",
prefix: ""
};
if (!e.isObject(r))
throw new Error("config object required in sendDataViaUrl");
if (!e.has(r, "data"))
throw new Error("data property required in config object for sendDataViaUrl");
s = e.extend(s, r),
i += s.prefix,
i += t.encode(JSON.stringify(s.data)),
n.open(i, s.target)
}
}),
define("text!templates/filesviewer/fileView.html", [], function() {
return '<div class="filesviewer-group-icon icon-mimetype-group-<%= file.get("group") %>"></div>\n<div class="filesviewer-filename"><%- file.get("base_name") %></div>\n<div class="filesviewer-properties">\n <%=\n lang.get("fileview.default.changed", [\n formatters.size(file.get("size")),\n formatters.date(file.get("mtime"), lang.get("fileview.default.timeFormat"))\n ])\n %>\n</div>\n'
}),
define("filesviewer/js/views/fileView", ["jquery", "underscore", "backbone", "gui/button/iconButton", "lang", "formatters", "text!templates/filesviewer/fileView.html", "api", "auth"], function(e, t, n, r, i, s, o, u, a) {
return n.View.extend({
_template: undefined,
_defTemplate: t.template(o),
autoPlay: !1,
initialize: function(e) {
this.downloadButton = new r({
alternative: !0,
text: i.get("fileview.default.button.download"),
iconClass: "icon-filesviewer-download"
}),
this.listenTo(this.downloadButton, "click", this._onDownload),
e && (e.tpl && (this._template = this._defTemplate = t.template(e.tpl)),
e.defTpl && (this._defTemplate = t.template(e.defTpl)),
e.autoPlay && (this.autoPlay = e.autoPlay === !0)),
this._downloading = !1
},
getMetaFields: function() {},
getInfoMetaFields: function() {
return []
},
_render: function() {
return this.$el.empty().addClass("fileview").append(this._defTemplate({
file: this.model,
lang: i,
formatters: s
})),
this
},
render: function() {
return this._render(),
this.$(".download-button-target").replaceWith(this.downloadButton.render().$el),
this.next(),
this
},
remove: function() {
this.downloadButton.remove(),
n.View.prototype.remove.call(this)
},
_onDownload: function() {
this._downloading || (this._downloading = !0,
u.download(this.model).always(t.bind(function() {
this._downloading = !1
}, this)))
},
showError: function() {
return this._render().next()
},
play: function() {
this.next()
},
pause: function() {},
seek: function() {},
next: function(e) {
return this.trigger.apply(this, t.compact(["ended", e])),
this
},
getStreamUrl: function() {
var e = this.model
, n = {
pid: e.getPid()
};
return a.get(e.getContext()).ajax({
url: "/api/file/url",
data: n,
dataFilter: function(n) {
try {
var r = JSON.parse(n);
return r.url ? JSON.stringify(t.extend(r, {
url: r.url + "/" + e.get("name")
})) : n
} catch (i) {
return n
}
}
})
},
getFileUrl: function() {
var e = "/api/file?pid=" + this.model.getPid();
return a.get(this.model.getContext()).addAuthToUrl(e)
}
})
}),
define("filesviewer/js/helpers/sizeCalculation", ["underscore"], function(e) {
function n(n) {
return e.find(t, function(e, r) {
return r === t.length - 1 || n <= e && n > t[r + 1] || n > e
})
}
var t = [1280, 640, 210];
return {
calc: function(e, t, r, i) {
if (!r || !i)
throw new Error("displayWidth and displayHeight need to be filled!");
var s = {}
, o = e / t
, u = r / i;
return !e || !t ? (s.width = n(r),
s.height = n(i),
s.shouldScale = !0) : o < u ? (s.height = n(Math.min(t, i)),
s.shouldScale = t > i) : (s.width = n(Math.min(e, r)),
s.shouldScale = e > r),
s
}
}
}),
define("filesviewer/js/views/imageView", ["jquery", "backbone", "underscore", "./fileView", "api", "../helpers/sizeCalculation", "modules/helpers/image"], function(e, t, n, r, i, s, o) {
return r.extend({
className: "imageview",
imageSize: null,
lastThumbSize: null,
renderId: 0,
initialize: function() {
this.resize = n.throttle(n.bind(this._onResize, this), 250),
r.prototype.initialize.apply(this, arguments)
},
getMetaFields: function() {
return ["image.width", "image.height"]
},
getInfoMetaFields: function() {
return ["image.exif"]
},
render: function(e, t, n) {
return e && e.image ? (this.$el.html('<div class="placeholder"></div><span class="filesviewer-loader icon-loading"></span>'),
this.$placeholder = this.$(".placeholder"),
this.imageSize = e.image,
this._renderImage(t, n)) : r.prototype.render.apply(this, arguments),
this
},
remove: function() {
return this.renderId = -1,
r.prototype.remove.apply(this, arguments)
},
_onResize: function(e, t) {
this.imageSize && this._renderImage(e, t)
},
_renderImage: function(t, u) {
var a = s.calc(this.imageSize.width, this.imageSize.height, t, u), f = !this.lastThumbSize, l = this.lastThumbSize || {}, c, h, p, d, v, m;
if (!f && n.isEqual(l, a))
return;
this._hasKnownImageSize() && this._updateScaling(a, this.imageSize.width, this.imageSize.height),
this.lastThumbSize = a,
c = f || (a.width || 0) > (l.width || 0) || (a.height || 0) > (l.height || 0);
if (!c)
return;
h = i.getThumbnail(this.model, n.pick(a, "width", "height")).then(o.preload),
p = ++this.renderId,
f && !this._hasKnownImageSize() ? v = e.Deferred().reject().promise() : (d = f ? {
width: 210,
height: 210
} : n.pick(l, "width", "height"),
v = i.getThumbnail(this.model, d)),
m = this.$(".filesviewer-loader"),
f && m.show(),
v.then(n.bind(function(e) {
if (h.state() === "resolved" || p !== this.renderId)
return;
this.$placeholder.css("background-image", "url(" + e + ")"),
f ? this.$placeholder.fadeIn() : this.$placeholder.show()
}, this)),
h.then(n.bind(function(e) {
return !this._hasKnownImageSize() && p === this.renderId && (a = s.calc(e.width, e.height, t, u),
this._updateScaling(a, e.width, e.height),
a.shouldScale || (this.imageSize = n.pick(e, "width", "height"))),
e
}, this)).then(n.bind(function(e) {
p === this.renderId && (this.$el.css("background-image", "url(" + e.src + ")"),
m.hide(),
this.$placeholder.stop(!0).fadeOut(),
this.next(6e3))
}, this), n.bind(function() {
r.prototype.render.call(this, this.metaData)
}, this))
},
_updateScaling: function(e, t, n) {
var r;
e.shouldScale ? (this.$placeholder.css("background-size", "contain"),
this.$el.css("background-size", "contain")) : (r = (e.width ? t + "px" : "auto") + " " + (e.height ? n + "px" : "auto"),
this.$placeholder.css("background-size", r),
this.$el.css("background-size", ""))
},
_hasKnownImageSize: function() {
return !!this.imageSize.width || !!this.imageSize.height
}
})
}),
define("filesviewer/js/views/mediaView", ["jquery", "backbone", "underscore", "lang", "formatters", "./fileView"], function(e, t, n, r, i, s) {
return s.extend({
mediaType: "",
getMetaFields: function() {
return ["mime_type"]
},
_streamUrl: undefined,
_template: undefined,
render: function(t) {
return this.trigger("canPlay", !1),
this.metaData = t,
this._streamUrl = this.getStreamUrl().done(n.bind(function(s) {
if (!s.url) {
this.showError();
return
}
var o = e(this._template({
_: n,
file: this.model,
lang: r,
formatters: i
}));
this.player = o.find(this.mediaType).andSelf().filter(this.mediaType)[0],
t.mime_type && this.player.canPlayType(t.mime_type) !== "" ? (this._createPlayer(s.url, o),
this.trigger("canPlay", !0)) : this._renderDefaultView()
}, this)).fail(n.bind(function() {
this.showError()
}, this)),
this
},
_createPlayer: function(t, n) {
this._bindPlayerEvents(),
this.player.src = t,
e(this.player).prop("autoplay", this.autoPlay),
this.$el.html(n)
},
_bindPlayerEvents: function() {
e(this.player).on("error", n.bind(function() {
this.trigger("canPlay", !1),
this._renderDefaultView()
}, this)),
e(this.player).on("loadedmetadata", n.bind(function(e) {
this.trigger("loadedmetadata", e),
this.trigger("setDuration", this.player.duration)
}, this)),
e(this.player).on("play", n.bind(function(e) {
this.trigger("playing", e)
}, this)),
e(this.player).on("pause", n.bind(function(e) {
this.trigger("pause", e)
}, this)),
e(this.player).on("timeupdate", n.bind(function() {
this.trigger("timeupdate", this.player.currentTime)
}, this)),
e(this.player).on("ended", n.bind(function() {
this.next(1e3)
}, this))
},
_renderDefaultView: function() {
this.trigger("setDuration", 0),
s.prototype.render.call(this, this.metaData)
},
remove: function() {
this._streamUrl && this._streamUrl.abort(),
this.player && (this.player.src = "",
this.player.load()),
s.prototype.remove.call(this)
},
play: function() {
this.player.play()
},
pause: function() {
this.player.pause()
},
seek: function(e) {
this.player.currentTime = e
}
})
}),
define("text!templates/filesviewer/videoPlayer.html", [], function() {
return "<video></video>\n"
}),
define("filesviewer/js/views/videoView", ["backbone", "underscore", "./mediaView", "text!templates/filesviewer/videoPlayer.html"], function(e, t, n, r) {
return n.extend({
className: "videoview",
mediaType: "video",
_template: t.template(r),
initialize: function() {
n.prototype.initialize.apply(this, arguments),
this.listenTo(this, "loadedmetadata", this._onLoadedMetadata)
},
_onLoadedMetadata: function(e) {
var t = e.target;
t.width = t.width || Math.max(t.videoWidth || 0, 300),
t.height = t.height || Math.max(t.videoHeight || 0, 150)
}
})
}),
define("text!templates/filesviewer/audioPlayer.html", [], function() {
return '<audio></audio>\n<div class="audio-visualization"></div>\n<div class="audio-metadata">\n <div class="audio-filename"><%= file.get("base_name") %></div>\n <div class="audio-properties">\n <%=\n lang.get("fileview.default.changed", [\n formatters.size(file.get("size")),\n formatters.date(file.get("mtime"), lang.get("fileview.default.timeFormat"))\n ])\n %>\n\n </div>\n</div>\n'
}),
define("filesviewer/js/views/audioView", ["backbone", "underscore", "./mediaView", "text!templates/filesviewer/audioPlayer.html"], function(e, t, n, r) {
return n.extend({
className: "audioview",
mediaType: "audio",
_template: t.template(r)
})
}),
define("filesviewer/js/views/textView", ["jquery", "underscore", "./fileView", "api"], function(e, t, n, r) {
return n.extend({
className: "textview",
bytesSizeLimit: 102400,
getMetaFields: function() {
return ["size"]
},
render: function(i) {
return i.size && i.size <= this.bytesSizeLimit ? (r.getFile(this.model.get("path"), this.model.getContext()).done(t.bind(function(t) {
var n = document.createElement("div")
, r = document.createElement("textarea");
n.className = "text-content",
r.readOnly = !0,
e(r).text(t),
n.appendChild(r),
this.$el.append(n),
this.next()
}, this)).fail(t.bind(function() {
this.showError()
}, this)),
this) : n.prototype.render.call(this)
}
})
}),
define("modules/browser", ["jquery"], function(e) {
function t() {
var t = navigator.mimeTypes
, n = navigator.plugins;
this.getMimeTypes = function() {
return t
}
,
this.getPlugins = function() {
return n
}
,
this.supportPdf = function() {
var t = e.Deferred()
, n = this.getMimeTypes()["application/pdf"];
n && t.resolve(),
n = this.getPlugins()["Adobe Acrobat"],
n && t.resolve();
try {
n = new ActiveXObject("AcroPDF.PDF"),
n || (n = new ActiveXObject("PDF.PdfCtrl"))
} catch (r) {}
return n ? t.resolve() : t.reject(),
t.promise()
}
}
return t
}),
define("browser", ["modules/browser"], function(e) {
return new e
}),
define("text!templates/filesviewer/pdfView.html", [], function() {
return '<object></object>\n<div class="filesviewer-loader icon-loading"></div>\n'
}),
define("filesviewer/js/views/pdfView", ["jquery", "underscore", "browser", "modules/configInst", "./fileView", "../helpers/sizeCalculation", "text!templates/filesviewer/pdfView.html", "lang"], function(e, t, n, r, i, s, o, u) {
function f(e) {
return e && e.state() === "resolved" ? e : null
}
function l(t) {
var n = e.Deferred();
return t.then(n.resolve, n.reject),
n.promise()
}
var a;
return i.extend({
className: "pdfview",
_renderId: 0,
_pdf: undefined,
_pdfPro: undefined,
_page: undefined,
_pagePro: undefined,
_htmlPro: undefined,
_drawPro: undefined,
_onFirstResize: undefined,
_onLastResize: undefined,
_currentPage: undefined,
_rejectedPro: e.Deferred().reject().promise(),
_template: t.template(o),
events: {
"click button.pdf-next-page": "onNextPage",
"click button.pdf-prev-page": "onPrevPage",
"change input.current-page": "onPageChange"
},
initialize: function(e) {
this._currentPage = 1,
this.onFirstResize = t.debounce(this._onResizeStart, 300, !0),
this.onLastResize = t.debounce(this._onResizeEnd, 300),
e && e.tpl && (this._template = t.template(e.tpl)),
i.prototype.initialize.apply(this, arguments)
},
remove: function() {
return this._pdf && this._pdf.destroy(),
this._page && this._page.destroy(),
delete this._newPage,
delete this._newCanvas,
delete this._newDrawnScale,
this._renderId = -1,
i.prototype.remove.apply(this, arguments)
},
render: function(r, s, o) {
return this.$el.html(this._template({
lang: u,
pdfInfo: null
})),
this.$("canvas").length ? (this._renderId++,
s && (this._width = s),
o && (this._height = o),
this._chain()) : this.$("object").length && n.supportPdf().then(t.bind(function() {
return this.getStreamUrl().done(t.bind(function(t) {
var n = e("<div></div>").html(this._template({
lang: u,
pdfInfo: null
}));
e("object", n).attr("type", "application/pdf"),
e("object", n).attr("data", t.url),
e(".filesviewer-loader", n).hide(),
this.$el.html(n.html()),
this.next(16e3)
}, this))
}, this)).fail(t.bind(function() {
i.prototype.render.apply(this, arguments)
}, this)),
this
},
_chain: function() {
this.$("canvas").length && this._loadScripts().then(t.bind(this._loadPdf, this, this._renderId)).then(t.bind(this._loadPage, this, this._renderId)).then(t.bind(this._showHtml, this, this._renderId)).then(t.bind(this._drawPage, this, this._renderId)).then(t.bind(this._postDraw, this, this._renderId, this._canvas)).fail(t.bind(this.showError, this, this._renderId, this._canvas))
},
_loadScripts: function() {
var t = r.get("cacheBuster") || "";
return t !== "" && (t += "/"),
this.$(".filesviewer-loader").show(),
a = f(a) || e.when(e.getScript(t + "external/pdfjs/pdf.js"), e.getScript(t + "external/pdfjs/compatibility.js")).done(function() {
PDFJS.workerSrc = t + "external/pdfjs/pdf.worker.js",
PDFJS.disableFontFace = !0
}),
a
},
_loadPdf: function(e) {
return this._renderId !== e ? this._rejectedPro : (PDFJS.disableAutoFetch = !0,
this._pdfPro = f(this._pdfPro) || l(PDFJS.getDocument(this.getFileUrl())),
this._pdfPro)
},
_loadPage: function(e, t) {
return this._renderId !== e ? (this._pdfPro = this._rejectedPro,
t && t.destroy(),
this._rejectedPro) : (this._pdf = t,
this._pagePro = f(this._pagePro) || l(t.getPage(this._currentPage)),
this._pagePro)
},
_showHtml: function(n, r) {
return this._renderId !== n ? (this._pagePro = this._rejectedPro,
r && r.destroy(),
this._rejectedPro) : (this._htmlPro = f(this._htmlPro) || e.Deferred(t.bind(function() {
this.$el.html(this._template({
lang: u,
pdfInfo: {
currentPage: this._currentPage,
totalPages: this._pdf.pdfInfo.numPages
}
}))
}, this)).resolve(r),
this._htmlPro)
},
_drawPage: function(t, n) {
var r, i, s, o, u;
return this._renderId !== t ? (this._pagePro = this._rejectedPro,
n && n.destroy(),
this._rejectedPro) : (this._newPage = n,
this._page = this._page || this._newPage,
this._newCanvas = e("<canvas>")[0],
this._canvas = this._canvas || this._newCanvas,
r = this.getViewProperties(),
this._newDrawnScale = r.scale,
this._drawnScale = this._drawnScale || this._newDrawnScale,
i = n.getViewport(r.scale),
s = this._newCanvas.getContext("2d"),
u = this.$("canvas")[0],
u.height = this._newCanvas.height = i.height,
u.width = this._newCanvas.width = i.width,
this.$el.css({
marginTop: (r.height - i.height) / 2,
width: i.width
}),
o = {
canvasContext: s,
viewport: i
},
this._drawPro = f(this._drawPro) || l(n.render(o)),
this._drawPro)
},
_postDraw: function(e) {
return this._renderId !== e ? (this._drawPro = this._rejectedPro,
this._rejectedPro) : (this._page = this._newPage,
this._canvas = this._newCanvas,
this._drawnScale = this._newDrawnScale,
delete this._newPage,
delete this._newCanvas,
delete this._newDrawnScale,
this.$("canvas").replaceWith(this._canvas),
this.$(".filesviewer-loader").hide(),
this.next(),
null)
},
showError: function(t, n) {
if (this._renderId !== t)
return this._rejectedPro;
var r = n || this._canvas;
return delete this._newPage,
delete this._newCanvas,
delete this._newDrawnScale,
e(r).replaceWith("<canvas>"),
this.$(".filesviewer-loader").hide(),
i.prototype.render.apply(this, arguments)
},
_onResizeStart: function() {
this._renderId++
},
_onResizeEnd: function() {
this._drawPro = this._rejectedPro,
this._chain()
},
getViewProperties: function() {
var e = this._page.getViewport(1), t = this._width, n = this._height - this.$(".document-toolbar").height(), r = s.calc(e.width, e.height, t, n), i;
return r.width ? i = t / e.width : i = n / e.height,
{
width: t,
height: n,
scale: i
}
},
resize: function(e, t) {
if (this._width === e && this._height === t)
return;
this._width = e,
this._height = t,
this.onFirstResize(),
this.onLastResize();
if (!this._page || !this._drawnScale)
return;
var n = this.getViewProperties()
, r = n.scale / this._drawnScale;
this.$el.css({
marginTop: (n.height - this._canvas.height * r) / 2,
width: this._canvas.width * r
})
},
_checkedSetCurrentPage: function(e) {
if (!e || e < 1 || e > this._pdf.pdfInfo.numPages || e === this._currentPage)
return;
this._currentPage = e,
this._htmlPro = this._pagePro = this._drawPro = this._rejectedPro,
this.render()
},
onNextPage: function() {
this._checkedSetCurrentPage(this._currentPage + 1)
},
onPrevPage: function() {
this._checkedSetCurrentPage(this._currentPage - 1)
},
onPageChange: function(t) {
this._checkedSetCurrentPage(parseInt(e(t.target).val(), 10))
}
})
}),
define("filesviewer/js/helpers/exposureTimeFormatter", [], function() {
return function(e) {
if (isNaN(e))
throw new Error("Argument needs to be a number!");
return e >= 1 ? e.toFixed(1) : "1/" + (1 / e).toFixed(0)
}
}),
define("text!templates/filesviewer/detailView.html", [], function() {
return '<h1><%= lang.get("details") %></h1>\n\n<h4><%= lang.get("file.name") %></h4>\n<p class="detail_displayname" title="<%- model.get(\'display_name\') %>"><%- formatters.breakable(model.get("display_name")) %></p>\n\n<% if(detail.mime_type) { %>\n <h4><%= lang.get("file.type") %></h4>\n <p class="detail_mimetype"><%- detail.mime_type %></p>\n<% } %>\n\n<% if(detail.image) { %>\n <h4><%= lang.get("file.details.dimensions") %></h4>\n <p class="detail_dimensions"><%- detail.image.width %> x <%- detail.image.height %></p>\n<% } %>\n\n<% if(detail.size) { %>\n <h4><%= lang.get("file.size") %></h4>\n <p class="detail_size"><%- detail.size %></p>\n<% } %>\n\n<% if(detail.mtime) { %>\n <h4><%= lang.get("file.update") %></h4>\n <p class="detail_mtime"><%- detail.mtime %></p>\n<% } %>\n\n<% if(detail.image && detail.image.exif) { %>\n <% if (detail.image.exif.Model) { %>\n <h4><%= lang.get("file.details.model") %></h4>\n <p class="exif_model"><%- detail.image.exif.Model %></p>\n <% } %>\n\n <% if (detail.image.exif.BitsPerSample) { %>\n <h4><%= lang.get("file.details.bitdepth") %></h4>\n <p class="exif_bitspersample"><%- detail.image.exif.BitsPerSample %></p>\n <% } %>\n\n <% if (detail.image.exif.DateTimeOriginal) { %>\n <h4><%= lang.get("file.details.datetaken") %></h4>\n <p class="exif_datetimeoriginal"><%- detail.image.exif.DateTimeOriginal %></p>\n <% } %>\n\n <% if (detail.image.exif.Make) { %>\n <h4><%= lang.get("file.details.manufacturer") %></h4>\n <p class="exif_make"><%- detail.image.exif.Make %></p>\n <% } %>\n\n <% if (detail.image.exif.Aperture) { %>\n <h4><%= lang.get("file.details.fnumber") %></h4>\n <p class="exif_aperture"><%- detail.image.exif.Aperture %></p>\n <% } %>\n\n <% if (detail.image.exif.ExposureTime) { %>\n <h4><%= lang.get("file.details.exposuretime") %></h4>\n <p class="exif_exposuretime"><%- exposureTimeFormatter(detail.image.exif.ExposureTime) %></p>\n <% } %>\n\n <% if (detail.image.exif.FocalLength) { %>\n <h4><%= lang.get("file.details.focallength") %></h4>\n <p class="exif_focallength"><%- detail.image.exif.FocalLength %></p>\n <% } %>\n\n <% if (detail.image.exif.ISO) { %>\n <h4><%= lang.get("file.details.iso") %></h4>\n <p class="exif_iso"><%- detail.image.exif.ISO %></p>\n <% } %>\n<% } %>\n'
}),
define("filesviewer/js/views/detailView", ["underscore", "underscore.mixin", "backbone", "lang", "formatters", "../helpers/exposureTimeFormatter", "text!templates/filesviewer/detailView.html"], function(e, t, n, r, i, s, o) {
return n.View.extend({
className: "detailView",
_details: null,
_template: e.template(o),
initialize: function() {
this.listenTo(this.model, "change:meta", this.render)
},
render: function() {
return this.$el.html(this._template({
formatters: i,
model: this.model.get("currentModel"),
detail: this._formatDetails(),
lang: r,
exposureTimeFormatter: s
})),
this
},
_formatDetails: function() {
var t = e.clone(this.model.get("meta"));
return e.isObject(t) && (t.size && (t.size = i.size(t.size)),
t.mtime && (t.mtime = i.date(t.mtime, r.get("lang.timeFormat")))),
t || {}
}
})
}),
define("text!templates/filesviewer/statusView.html", [], function() {
return '<div class="left">\n <span class="display-name sj-selectable" title="<%- model.get(\'base_name\') %>"><%- model.get("base_name") %></span>\n</div>\n<div class="center">\n <div class="control-buttons">\n <% if (canNavigate) { %>\n <span class="previous icon icon-filesviewer-previous"></span>\n <% } %>\n <span class="play icon icon-filesviewer-play"></span>\n <span class="pause icon icon-filesviewer-pause"></span>\n <% if (canNavigate) { %>\n <span class="next icon icon-filesviewer-next"></span>\n <% } %>\n </div>\n</div>\n<div class="right">\n <div class="more-menu"></div>\n <div class="action-close">\n <span class="icon icon-filesviewer-close"></span>\n <span class="label"><%= lang.get("filesviewer.close") %></span>\n </div>\n</div>\n<div class="progress-bar-container">\n <span class="progress-current"></span>\n <div class="progress-bar"></div>\n <span class="progress-total"></span>\n</div>\n'
}),
define("gui/bar/sliderView", ["backbone", "underscore"], function(e, t) {
return e.View.extend({
template: t.template("<div class='bar'></div><input class='handle' type='range' max='100' min='0' step='0.01' />"),
events: {
"change .handle": "_onHandleChange",
"input .handle": "_onHandleChange",
"mousedown .handle": "_onMouseDown",
"mouseup .handle": "_onMouseUp"
},
render: function() {
return this.$el.html(this.template()),
this.update(0),
this.delegateEvents(),
this
},
update: function(e) {
this.value = "" + e.toFixed(2),
this.$(".bar").width(this.value + "%"),
this.$(".handle").prop("value", this.value)
},
_onHandleChange: function() {
var e = parseFloat(this.$(".handle").prop("value")).toFixed(2);
e !== this.value && (this.value = e,
this.trigger("change", this.value))
},
_onMouseDown: function() {
this.trigger("drag:start")
},
_onMouseUp: function() {
this.trigger("drag:stop")
}
})
}),
define("text!templates/filesviewer/moreMenu.html", [], function() {
return '<li class="action-download"><%= lang.get("statusbar.download") %></li>\n<li class="action-delete"><%= lang.get("statusbar.delete") %></li>\n'
}),
define("filesviewer/js/views/moreMenu", ["jquery", "underscore", "backbone", "gui", "lang", "text!templates/filesviewer/moreMenu.html"], function(e, t, n, r, i, s) {
var o = n.View.extend({
tagName: "ul",
className: "content",
tpl: t.template(s),
render: function() {
return this.$el.html(this.tpl({
model: this.model,
lang: i
})),
this
}
});
return r.Flyout.extend({
events: {
"click .trigger": "toggle"
},
tpl: t.template(['<a class="trigger">', '<span class="icon icon-filesviewer-toolbar"></span>', "</a>"].join("")),
initialize: function() {
this.triggerView = e(this.tpl({
lang: i
})),
this.contentView = new o({
model: this.model
}),
this.listenTo(this, "mousestopped", this.close)
}
})
}),
define("filesviewer/js/views/statusView", ["underscore", "backbone", "lang", "api", "actionManager", "text!templates/filesviewer/statusView.html", "gui/bar/sliderView", "./moreMenu"], function(e, t, n, r, i, s, o, u) {
return t.View.extend({
className: "statusview",
events: {
"click .action-download": "onDownload",
"click .action-info": "onInfo",
"click .action-delete": "onDelete",
"click .action-close": "onClose",
"click .control-buttons .play": "onPlay",
"click .control-buttons .pause": "onPause",
"click .control-buttons .next": "onNext",
"click .control-buttons .previous": "onPrevious",
mouseenter: "onMouseEnter",
mouseleave: "onMouseLeave",
mousemove: "onMouseMove"
},
currentModel: null,
_template: e.template(s),
initialize: function() {
this._progressBarView = new o,
this.listenTo(this.model, "change:currentModel", this.onChangeCurrentModel),
this.listenTo(this._progressBarView, "change", this.onChangeSlider),
this.listenTo(this._progressBarView, "drag:start", this.onPause),
this.listenTo(this._progressBarView, "drag:stop", this.onPlay),
this.listenTo(this.model, "change:mouseMove", this._onModelMouseMove),
this.onChangeCurrentModel(null, this.model.get("currentModel")),
this.listenTo(this.model, "change:meta", this.setButtons),
this.listenTo(this.model, "change:playing", this.setPlayState),
this.listenTo(this.model, "change:diashow", this.setPlayState),
this.listenTo(this.model, "change:canPlay", this.setPlayState),
this.listenTo(this.model, "change:canNavigate", this.setPlayState),
this.listenTo(this.model, "change:duration", this._onDurationChange),
this.listenTo(this.model, "change:currentTime", this._onCurrentTimeChange),
this._downloading = !1
},
clear: function() {
this._moreMenu.remove()
},
remove: function() {
return this.clear(),
this._progressBarView.remove(),
t.View.prototype.remove.apply(this, arguments)
},
onChangeCurrentModel: function(e, t) {
if (!t)
return;
this.currentModel && (this.stopListening(this.currentModel),
this.clear()),
this.currentModel = t,
this.listenTo(this.currentModel, "change", this.render),
this.render()
},
setButtons: function() {
var e = !!(this.model.get("meta") || {}).readable
, t = !!this.model.get("currentModel").get("movable")
, n = t && i.isRegistered("deleteFiles");
this.$(".action-download").toggleClass("enabled", e),
this.$(".action-info").toggleClass("enabled", e),
this.$(".action-delete").toggleClass("enabled", n)
},
_clearMouseTimer: function() {
this._mouseWithinTimer && (clearTimeout(this._mouseWithinTimer),
this._mouseWithinTimer = null)
},
_startMouseTimer: function() {
this._clearMouseTimer(),
this._mouseWithinTimer = setTimeout(e.bind(function() {
this._isMouseWithin || (this.$el.removeClass("mousemoved"),
this.$el.addClass("mousestopped"),
this._moreMenu.trigger("mousestopped"))
}, this), 2e3)
},
_onModelMouseMove: function() {
this._setMouseClasses(),
this._startMouseTimer()
},
_setMouseClasses: function() {
this.$el.hasClass("mousemoved") || (this.$el.removeClass("mousestopped"),
this.$el.addClass("mousemoved"))
},
onMouseMove: function(e) {
e.stopPropagation()
},
onMouseEnter: function() {
this._isMouseWithin = !0,
this._setMouseClasses(),
this._clearMouseTimer()
},
onMouseLeave: function() {
this._isMouseWithin = !1,
this._startMouseTimer()
},
onDownload: function() {
this._downloading || (this._downloading = !0,
r.download(this.currentModel).always(e.bind(function() {
this._downloading = !1
}, this)))
},
onDelete: function() {
i.execute("deleteFiles", [this.currentModel])
},
onPlay: function() {
this.trigger("play")
},
onPause: function() {
this.trigger("pause")
},
setPlayState: function() {
var e = this.model.get("playing") === !0 || this.model.get("diashow") === !0
, t = this.model.get("canPlay") === !0 || this.model.get("canNavigate") === !0;
this.$(".control-buttons .play").toggleClass("disabled", !t || e),
this.$(".control-buttons .pause").toggleClass("disabled", !t || !e)
},
onPrevious: function() {
this.trigger("previous")
},
onNext: function() {
this.trigger("next")
},
onInfo: function() {
this.trigger("info:open")
},
onClose: function() {
this.trigger("close")
},
render: function() {
this._moreMenu = new u({
model: this.currentModel
}),
this.$el.html(this._template({
lang: n,
model: this.currentModel,
index: this.model.get("currentIndex") + 1,
count: this.collection.length,
canNavigate: this.model.get("canNavigate")
})),
this.$(".more-menu").html(this._moreMenu.render().$el);
var e = this.$(".progress-bar");
return e.length && e.html(this._progressBarView.render().$el),
this.setButtons(),
this.setPlayState(),
this
},
_formatTime: function(e) {
var t, n, r;
return isNaN(e) ? e : (t = Math.floor(e / 3600),
n = Math.floor((e - t * 3600) / 60),
r = Math.floor(e - t * 3600 - n * 60),
r < 10 && (r = "0" + r),
t > 0 ? (n < 10 && (n = "0" + n),
t + ":" + n + ":" + r) : n + ":" + r)
},
_onDurationChange: function(e, t) {
t > 0 ? (this.$(".progress-current").text(this._formatTime(0)),
this.$(".progress-total").text(this._formatTime(t))) : (this.$(".progress-current").empty(),
this.$(".progress-total").empty()),
this._progressBarView.update(0)
},
_onCurrentTimeChange: function(e, t) {
var n = this.model.get("duration")
, r = 0;
n > 0 && (r = t / n * 100,
this.$(".progress-current").text(this._formatTime(t))),
this._progressBarView.update(r)
},
onChangeSlider: function(e) {
var t = this.model.get("duration") * e / 100;
this.trigger("seek", t)
}
})
}),
define("text!templates/filesviewer/filesViewer.html", [], function() {
return '<div class="filesviewer">\n <div class="filesviewer-container">\n <div class="filesviewer-content"></div>\n </div>\n</div>\n'
}),
define("filesviewer/js/views/filesViewer", ["underscore", "backbone", "jquery", "gui/overlay/overlay", "gui/overlay/views/overlayManager", "z-index-mgr", "deleteListInst", "api/models/shareLinkModel", "./fileView", "./imageView", "./videoView", "./audioView", "./textView", "./pdfView", "./detailView", "./statusView", "text!templates/filesviewer/filesViewer.html"], function(e, t, n, r, i, s, o, u, a, f, l, c, h, p, d, v, m) {
return r.extend({
className: "filesviewer-overlay",
template: e.template(m),
events: {
"click .filesviewer-overlay-close": "remove",
"click .next-button": "gotoNext",
"click .previous-button": "gotoPrevious"
},
minMouseMovePixels: 5,
autoPlay: !1,
autoContinue: !1,
initialize: function(r) {
var i, s, u;
if (!this.model)
throw new Error("model missing in FilesViewer");
this.itemType = this.model.getItemType(),
s = this.model.get("group"),
this.contentViewTemplates = {},
r && (e.has(r, "autoPlay") && (this.autoPlay = r.autoPlay),
e.has(r, "autoContinue") && (this.autoContinue = r.autoContinue)),
this.model.collection ? i = this.model.collection.models : i = [this.model],
u = e.filter(i, function(e) {
return e.get("type") === "file" && e.get("readable") && (!r.filtered || e.get("group") === s)
}, this);
if (!u.length)
throw new Error("no models to show in FilesViewer");
if (e.some(u, function(e) {
return e.getItemType() !== this.itemType
}, this))
throw new Error("models differ in itemType/authContext");
this.collection = new t.Collection(u),
this.allowedGroups = ["thumb", "audio", "video"],
this.state = new t.Model({
meta: {},
extendedMeta: !1,
currentModel: this.model,
currentIndex: this.collection.indexOf(this.model),
canNavigate: this.collection.length > 1 && (!r.filtered || e.contains(this.allowedGroups, s)),
canPlay: !1,
mouseMove: !1,
playing: !1,
diashow: !1
}),
this.listenTo(this.state, "change:currentModel", this._renderContentView),
this.statusView = new v({
model: this.state,
collection: this.collection
}),
n(window).on("resize.filesviewer", e.bind(this._onResize, this)),
this.listenTo(this.statusView, "info:open", this._toggleDetailView),
this.listenTo(this.statusView, "play", this._onPlay),
this.listenTo(this.statusView, "pause", this._onPause),
this.listenTo(this.statusView, "next", this.gotoNext),
this.listenTo(this.statusView, "previous", this.gotoPrevious),
this.listenTo(this.statusView, "seek", this._onSeek),
this.listenTo(this.statusView, "close", this.remove),
this.lastMousePosition = {
X: 0,
Y: 0
},
this.$el.on("mousemove click", e.throttle(e.bind(function(e) {
if (e.type === "click" || Math.abs(this.lastMousePosition.X - e.clientX) > this.minMouseMovePixels || Math.abs(this.lastMousePosition.Y - e.clientY) > this.minMouseMovePixels)
this.state.set({
mouseMove: !this.state.get("mouseMove")
}),
this.lastMousePosition.X = e.clientX,
this.lastMousePosition.Y = e.clientY
}, this), 200, {
leading: !0
})),
this.listenTo(o, "added", this._onFileDelete),
this.render().$el.appendTo("body")
},
render: function() {
return this.$el.addClass(this.overlayClasses),
this.$el.css("z-index", s()),
this.$el.html(this.template({
showNavButtons: this.state.get("canNavigate")
})),
this._renderContentView(),
this.$(".filesviewer").append(this.statusView.render().$el),
this.trigger("rendered"),
this._overlayPushed || (i.instance().push(),
this._overlayPushed = !0),
this
},
_getMeta: function(t) {
return t = e.union(t, ["readable", "mtime", "name"]),
this.state.get("currentModel").getMeta(t)
},
clearContent: function() {
this.contentView && (this.stopListening(this.contentView),
this.contentView.remove())
},
remove: function() {
return this.statusView.remove(),
this._removeDetailView(),
this.clearContent(),
this.$el.off(),
n(window).off(".filesviewer"),
this._overlayPushed && (i.instance().pop(),
this._overlayPushed = !1),
this.trigger("removed"),
t.View.prototype.remove.call(this)
},
_getNextIndex: function(t, n, r) {
var i, s, o;
return t = t.slice(0),
r = r.slice(0),
i = r.indexOf(n) > -1,
i && r.splice(r.indexOf(n), 1),
s = e.difference(t, r),
o = s.indexOf(n),
i && (s.splice(o, 1),
o = o < s.length - 1 ? o : s.length - 1),
o
},
_onFileDelete: function(t, n) {
if (t !== this.itemType)
return;
var r = this.state.get("currentModel")
, i = e.map(n, function(e) {
return this.collection.get(e.id)
}, this)
, s = this._getNextIndex(this.collection.models, r, i);
this.collection.remove(n),
this.collection.length === 1 && this.state.set({
diashow: !1,
canNavigate: !1
}),
this.collection.models.length ? this._gotoIndex(s) : this.remove()
},
_clearResume: function() {
this._resumeTimeout && clearTimeout(this._resumeTimeout)
},
_resume: function(t) {
this._clearResume(),
t = t || 5e3,
this._resumeTimeout = e.delay(e.bind(function() {
this.state.get("diashow") && this._next()
}, this), t)
},
_next: function() {
var e = this.state.get("currentIndex") || 0
, t = e < this.collection.length - 1 ? e + 1 : 0;
this._gotoIndex(t)
},
gotoNext: function() {
this.state.set({
playing: !1,
diashow: !1
}),
this._next()
},
gotoPrevious: function() {
var e = this.state.get("currentIndex") || 0
, t = e > 0 ? e - 1 : this.collection.length - 1;
this.state.set({
playing: !1,
diashow: !1
}),
this._gotoIndex(t)
},
_gotoIndex: function(t) {
this._clearResume();
var n = this.state.get("currentModel")
, r = this.collection.at(t)
, i = e.without(e.keys(this.state.attributes), "currentIndex", "currentModel", "canNavigate", "diashow", "mouseMove");
e.each(i, function(e) {
this.state.unset(e)
}, this),
this.state.set({
currentIndex: t,
currentModel: r
}),
r === n && this.state.trigger("change:currentModel", this.state, r)
},
_meta: undefined,
_renderContentView: function() {
var t = this.state.get("currentModel"), n;
this.clearContent(),
n = this.$(".filesviewer-content"),
this.contentView = this._getContentView(),
this._bindContentViewEvents(),
this._meta && this._meta.abort(),
this.$(".filesviewer-overlay-filename").text(t.get("base_name")),
this.$el.removeClass("has-duration"),
this._meta = this._getMeta(this.contentView.getMetaFields()).done(e.bind(function(e) {
this.state.set({
meta: e
}),
this.contentView.render(e, n.width(), n.height()),
n.html(this.contentView.$el),
this.detailView && this._getExtendedMeta()
}, this)).fail(e.bind(function(e, t) {
t !== "abort" && n.html(this.contentView.showError().$el)
}, this))
},
_bindContentViewEvents: function() {
this.listenTo(this.contentView, "playing", this._onPlaying),
this.listenTo(this.contentView, "pause", this._onPaused),
this.listenTo(this.contentView, "setDuration", this._onSetDuration),
this.listenTo(this.contentView, "timeupdate", this._onTimeUpdate),
this.listenTo(this.contentView, "ended", this._resume),
this.listenTo(this.contentView, "canPlay", this._onCanPlay)
},
_getContentView: function() {
var t = this.state.get("currentModel"), n = t.get("group"), r, i = {
thumb: f,
video: l,
audio: c,
text: h,
pdf: p
};
return t instanceof u && (n = n === "thumb" ? "thumb" : "default"),
e.has(i, n) ? r = i[n] : r = a,
new r({
model: t,
tpl: this.contentViewTemplates[n],
defTpl: this.contentViewTemplates["default"],
autoPlay: this.autoPlay
})
},
_onResize: function() {
if (this.contentView && e.isFunction(this.contentView.resize)) {
var t = this.$(".filesviewer-content")
, n = t.width()
, r = t.height();
if (!n || !r)
return;
this.contentView.resize(n, r)
}
},
_onCanPlay: function(e) {
this.state.set("canPlay", e)
},
_onPlay: function() {
this.state.set({
playing: !0,
diashow: !0
}),
this.contentView.play()
},
_onPause: function() {
this.state.set({
playing: !1,
diashow: !1
}),
this.contentView.pause()
},
_onPlaying: function() {
this.state.set("playing", !0),
this.autoContinue && this.state.set("diashow", !0)
},
_onPaused: function() {
this.state.set("playing", !1)
},
_onSetDuration: function(e) {
this.state.set("duration", e),
e > 0 && this.$el.addClass("has-duration")
},
_onTimeUpdate: function(e) {
this.state.set("currentTime", e)
},
_onSeek: function(e) {
this.contentView.seek(e)
},
_toggleDetailView: function() {
this.detailView ? this._hideDetailView() : this._renderDetailView()
},
_renderDetailView: function() {
this._clearDetailsViewTransitionTimer(),
this.detailView = new d({
model: this.state
}),
this._getExtendedMeta(),
this.$(".filesviewer-wrapper").append(this.detailView.render().$el),
this.$el.addClass("detailview-active"),
setTimeout(e.bind(function() {
this.detailView.$el.addClass("active")
}, this), 0),
this._detailsViewTransitionTimer = setTimeout(e.bind(function() {
this._detailsViewTransitionTimer = null,
this._onResize()
}, this), 200)
},
_clearDetailsViewTransitionTimer: function() {
this._detailsViewTransitionTimer && (this._removeDetailView(),
clearTimeout(this._detailsViewTransitionTimer),
this._detailsViewTransitionTimer = null)
},
_hideDetailView: function() {
this.detailView.$el.removeClass("active"),
this.$el.removeClass("detailview-active"),
this._clearDetailsViewTransitionTimer(),
this._detailsViewTransitionTimer = setTimeout(e.bind(function() {
this._removeDetailView(),
this._onResize()
}, this), 200)
},
_removeDetailView: function() {
this.detailView && (this.detailView.remove(),
delete this.detailView)
},
_getExtendedMeta: function() {
var t = this.contentView.getInfoMetaFields()
, r = this.state.get("currentModel");
t.length && !this.state.get("extendedMeta") && (this.meta = this._getMeta(t).done(e.bind(function(e) {
r.getPid() === this.state.get("currentModel").getPid() && this.state.set({
meta: n.extend(!0, {}, this.state.get("meta"), e),
extendedMeta: !0
})
}, this)))
}
})
}),
define("filesviewer/main", ["./js/views/filesViewer"], function(e) {
return e
}),
define("filesviewer", ["filesviewer/main"], function(e) {
return e
}),
define("actions/showFile", ["underscore", "tracker", "filesviewer"], function(e, t, n) {
return function(r, i) {
var s = r.get("ext");
return s && t.track({
op: "open",
target: s
}),
new n(e.extend({}, i, {
model: r
}))
}
}),
define("actions/showToast", ["gui"], function(e) {
var t = new e.Toast;
return function(e) {
t.render(e)
}
}),
define("appActions", ["actionManager", "actions/deleteFiles", "actions/newFolder", "actions/rename", "actions/sendDataViaUrl", "actions/showFile", "actions/showToast"], function(e, t, n, r, i, s, o) {
var u = {};
u.deleteFiles = {
callback: t
},
u.newFolder = {
callback: n
},
u.rename = {
callback: r
},
u.sendDataViaUrl = {
callback: i
},
u.showFile = {
callback: s,
config: {
filtered: !1,
autoPlay: !0,
autoContinue: !0
}
},
u.showToast = {
callback: o
},
e.registerAll(u)
}),
define("plugins/backbone/backbone.touch", ["jquery", "underscore", "backbone", "isTouchDevice"], function(e, t, n, r) {
(function() {
r && (n.EventMgr = function(n) {
var r = []
, i = {
x: -1e4,
y: -1e4
};
return e(document).on("touchstart touchmove", function(e) {
var t = e.originalEvent.touches[0];
i = {
x: t.clientX,
y: t.clientY
}
}).on("MSPointerUp pointerup", function(e) {
var t = e.originalEvent;
i = {
x: t.clientX,
y: t.clientY
}
}),
{
addTouchEnd: function(e) {
if (e && (e.type === "touchend" || e.type === "MSPointerUp" || e.type === "pointerup")) {
var n = e.originalEvent
, s = (n || {}).pointerType
, o = s && t.contains([n.MSPOINTER_TYPE_TOUCH, n.MSPOINTER_TYPE_PEN], n.pointerType);
if (e.type === "touchend" || o) {
var u = {}
, u = e.type === "touchend" ? t.clone(i) : {
x: e.originalEvent.clientX,
y: e.originalEvent.clientY
};
r.push(u),
t.delay(function() {
r = t.without(r, u)
}, 2500)
}
}
},
filterClick: function(e, n) {
if (e && e.type === "click") {
var i = t.find(r, function(t) {
return Math.abs(t.x - e.clientX) < 25 && Math.abs(t.y - e.clientY) < 25
});
if (i)
return r = t.without(r, i),
e.preventDefault(),
e.stopImmediatePropagation(),
e.stopPropagation(),
!1
}
return n()
}
}
}(),
n.View.prototype._delegateEvents = n.View.prototype.delegateEvents,
n.View.prototype.delegateEvents = function(e) {
var r = this
, i = /^(\S+)\s*(.*)$/;
e = e || t.result(this, "events") || {},
t.each(e, function(e, s) {
if (t.isString(e)) {
var o = s.match(i)
, u = o[1]
, a = o[2];
if (u === "touchend" || u === "MSPointerUp" || u === "pointerup") {
var f = r[e];
r[e] = function(e) {
var t = Array.prototype.slice.call(arguments);
return n.EventMgr.addTouchEnd(e),
f.apply(r, t)
}
}
if (u === "click") {
var l = r[e];
r[e] = function(e) {
var t = Array.prototype.slice.call(arguments);
return n.EventMgr.filterClick(e, function() {
return l.apply(r, t)
})
}
}
}
}),
n.View.prototype._delegateEvents.apply(r, [e])
}
)
})()
}),
require.config(window.requireConfig || {}),
require(["jquery", "backbone", "./router", "appActions", "plugins/backbone/backbone.touch"], function(e, t, n, r, i) {
window.console = window.console || {
assert: e.noop,
clear: e.noop,
count: e.noop,
debug: e.noop,
dir: e.noop,
dirxml: e.noop,
error: e.noop,
exception: e.noop,
group: e.noop,
groupCollapsed: e.noop,
groupEnd: e.noop,
info: e.noop,
log: e.noop,
markTimeline: e.noop,
memory: e.noop,
profile: e.noop,
profileEnd: e.noop,
table: e.noop,
time: e.noop,
timeEnd: e.noop,
timeStamp: e.noop,
trace: e.noop,
warn: e.noop
},
e(document).ready(function() {
var e = window.router = new n;
t.history.start({
silent: !0
}),
e.start()
}),
e(document).on("dragenter dragover drop", function(e) {
var t = e.originalEvent.dataTransfer;
t && (t.dropEffect = "none"),
e.preventDefault()
})
}),
define("main", function() {});
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement("style");
msViewportStyle.appendChild(document.createTextNode("@-ms-viewport{width:auto!important}")),
document.getElementsByTagName("head")[0].appendChild(msViewportStyle)
}
define("../../../libs/polyfills/ie10MobileDeviceWidth.js", function() {});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment