Skip to content

Instantly share code, notes, and snippets.

@Jason-Cooke
Created April 17, 2017 06:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jason-Cooke/945cb494821b2ea79cc82a1ec4872102 to your computer and use it in GitHub Desktop.
Save Jason-Cooke/945cb494821b2ea79cc82a1ec4872102 to your computer and use it in GitHub Desktop.
/*!
* FullCalendar v3.3.1
* Docs & License: https://fullcalendar.io/
* (c) 2017 Adam Shaw
*/
! function(t) {
"function" == typeof define && define.amd ? define(["jquery", "moment"], t) : "object" == typeof exports ? module.exports = t(require("jquery"), require("moment")) : t(jQuery, moment)
}(function(t, e) {
function n(t) {
return it(t, Qt)
}
function i(t, e) {
e.left && t.css({
"border-left-width": 1,
"margin-left": e.left - 1
}), e.right && t.css({
"border-right-width": 1,
"margin-right": e.right - 1
})
}
function r(t) {
t.css({
"margin-left": "",
"margin-right": "",
"border-left-width": "",
"border-right-width": ""
})
}
function s() {
t("body").addClass("fc-not-allowed")
}
function o() {
t("body").removeClass("fc-not-allowed")
}
function l(e, n, i) {
var r = Math.floor(n / e.length),
s = Math.floor(n - r * (e.length - 1)),
o = [],
l = [],
u = [],
c = 0;
a(e), e.each(function(n, i) {
var a = n === e.length - 1 ? s : r,
d = t(i).outerHeight(!0);
d < a ? (o.push(i), l.push(d), u.push(t(i).height())) : c += d
}), i && (n -= c, r = Math.floor(n / o.length), s = Math.floor(n - r * (o.length - 1))), t(o).each(function(e, n) {
var i = e === o.length - 1 ? s : r,
a = l[e],
c = u[e],
d = i - (a - c);
a < i && t(n).height(d)
})
}
function a(t) {
t.height("")
}
function u(e) {
var n = 0;
return e.find("> *").each(function(e, i) {
var r = t(i).outerWidth();
r > n && (n = r)
}), n++, e.width(n), n
}
function c(t, e) {
var n, i = t.add(e);
return i.css({
position: "relative",
left: -1
}), n = t.outerHeight() - e.outerHeight(), i.css({
position: "",
left: ""
}), n
}
function d(e) {
var n = e.css("position"),
i = e.parents().filter(function() {
var e = t(this);
return /(auto|scroll)/.test(e.css("overflow") + e.css("overflow-y") + e.css("overflow-x"))
}).eq(0);
return "fixed" !== n && i.length ? i : t(e[0].ownerDocument || document)
}
function h(t, e) {
var n = t.offset(),
i = n.left - (e ? e.left : 0),
r = n.top - (e ? e.top : 0);
return {
left: i,
right: i + t.outerWidth(),
top: r,
bottom: r + t.outerHeight()
}
}
function f(t, e) {
var n = t.offset(),
i = p(t),
r = n.left + S(t, "border-left-width") + i.left - (e ? e.left : 0),
s = n.top + S(t, "border-top-width") + i.top - (e ? e.top : 0);
return {
left: r,
right: r + t[0].clientWidth,
top: s,
bottom: s + t[0].clientHeight
}
}
function g(t, e) {
var n = t.offset(),
i = n.left + S(t, "border-left-width") + S(t, "padding-left") - (e ? e.left : 0),
r = n.top + S(t, "border-top-width") + S(t, "padding-top") - (e ? e.top : 0);
return {
left: i,
right: i + t.width(),
top: r,
bottom: r + t.height()
}
}
function p(t) {
var e, n = t[0].offsetWidth - t[0].clientWidth,
i = t[0].offsetHeight - t[0].clientHeight;
return n = v(n), i = v(i), e = {
left: 0,
right: 0,
top: 0,
bottom: i
}, m() && "rtl" == t.css("direction") ? e.left = n : e.right = n, e
}
function v(t) {
return t = Math.max(0, t), t = Math.round(t)
}
function m() {
return null === Xt && (Xt = y()), Xt
}
function y() {
var e = t("<div><div/></div>").css({
position: "absolute",
top: -1e3,
left: 0,
border: 0,
padding: 0,
overflow: "scroll",
direction: "rtl"
}).appendTo("body"),
n = e.children(),
i = n.offset().left > e.offset().left;
return e.remove(), i
}
function S(t, e) {
return parseFloat(t.css(e)) || 0
}
function w(t) {
return 1 == t.which && !t.ctrlKey
}
function b(t) {
var e = t.originalEvent.touches;
return e && e.length ? e[0].pageX : t.pageX
}
function E(t) {
var e = t.originalEvent.touches;
return e && e.length ? e[0].pageY : t.pageY
}
function D(t) {
return /^touch/.test(t.type)
}
function T(t) {
t.addClass("fc-unselectable").on("selectstart", H)
}
function C(t) {
t.removeClass("fc-unselectable").off("selectstart", H)
}
function H(t) {
t.preventDefault()
}
function R(t, e) {
var n = {
left: Math.max(t.left, e.left),
right: Math.min(t.right, e.right),
top: Math.max(t.top, e.top),
bottom: Math.min(t.bottom, e.bottom)
};
return n.left < n.right && n.top < n.bottom && n
}
function x(t, e) {
return {
left: Math.min(Math.max(t.left, e.left), e.right),
top: Math.min(Math.max(t.top, e.top), e.bottom)
}
}
function I(t) {
return {
left: (t.left + t.right) / 2,
top: (t.top + t.bottom) / 2
}
}
function k(t, e) {
return {
left: t.left - e.left,
top: t.top - e.top
}
}
function L(e) {
var n, i, r = [],
s = [];
for ("string" == typeof e ? s = e.split(/\s*,\s*/) : "function" == typeof e ? s = [e] : t.isArray(e) && (s = e), n = 0; n < s.length; n++) i = s[n], "string" == typeof i ? r.push("-" == i.charAt(0) ? {
field: i.substring(1),
order: -1
} : {
field: i,
order: 1
}) : "function" == typeof i && r.push({
func: i
});
return r
}
function M(t, e, n) {
var i, r;
for (i = 0; i < n.length; i++)
if (r = B(t, e, n[i])) return r;
return 0
}
function B(t, e, n) {
return n.func ? n.func(t, e) : F(t[n.field], e[n.field]) * (n.order || 1)
}
function F(e, n) {
return e || n ? null == n ? -1 : null == e ? 1 : "string" === t.type(e) || "string" === t.type(n) ? String(e).localeCompare(String(n)) : e - n : 0
}
function N(t, e) {
var n, i, r, s, o = t.start,
l = t.end,
a = e.start,
u = e.end;
if (l > a && o < u) return o >= a ? (n = o.clone(), r = !0) : (n = a.clone(), r = !1), l <= u ? (i = l.clone(), s = !0) : (i = u.clone(), s = !1), {
start: n,
end: i,
isStart: r,
isEnd: s
}
}
function z(t, n) {
return e.duration({
days: t.clone().stripTime().diff(n.clone().stripTime(), "days"),
ms: t.time() - n.time()
})
}
function A(t, n) {
return e.duration({
days: t.clone().stripTime().diff(n.clone().stripTime(), "days")
})
}
function G(t, n, i) {
return e.duration(Math.round(t.diff(n, i, !0)), i)
}
function O(t, e) {
var n, i, r;
for (n = 0; n < Jt.length && (i = Jt[n], r = P(i, t, e), !(r >= 1 && vt(r))); n++);
return i
}
function V(t, e) {
var n = O(t);
return "week" === n && "object" == typeof e && e.days && (n = "day"), n
}
function P(t, n, i) {
return null != i ? i.diff(n, t, !0) : e.isDuration(n) ? n.as(t) : n.end.diff(n.start, t, !0)
}
function _(t, e, n) {
var i;
return tt(n) ? (e - t) / n : (i = n.asMonths(), Math.abs(i) >= 1 && vt(i) ? e.diff(t, "months", !0) / i : e.diff(t, "days", !0) / n.asDays())
}
function Y(t, e) {
var n, i;
return tt(t) || tt(e) ? t / e : (n = t.asMonths(), i = e.asMonths(), Math.abs(n) >= 1 && vt(n) && Math.abs(i) >= 1 && vt(i) ? n / i : t.asDays() / e.asDays())
}
function W(t, n) {
var i;
return tt(t) ? e.duration(t * n) : (i = t.asMonths(), Math.abs(i) >= 1 && vt(i) ? e.duration({
months: i * n
}) : e.duration({
days: t.asDays() * n
}))
}
function U(t) {
return {
start: t.start.clone(),
end: t.end.clone()
}
}
function j(t, e) {
return t = U(t), e.start && (t.start = q(t.start, e)), e.end && (t.end = K(t.end, e.end)), t
}
function q(t, e) {
return t = t.clone(), e.start && (t = J(t, e.start)), e.end && t >= e.end && (t = e.end.clone().subtract(1)), t
}
function Z(t, e) {
return (!e.start || t >= e.start) && (!e.end || t < e.end)
}
function $(t, e) {
return (!e.start || t.end >= e.start) && (!e.end || t.start < e.end)
}
function Q(t, e) {
return (!e.start || t.start >= e.start) && (!e.end || t.end <= e.end)
}
function X(t, e) {
return (t.start && e.start && t.start.isSame(e.start) || !t.start && !e.start) && (t.end && e.end && t.end.isSame(e.end) || !t.end && !e.end)
}
function K(t, e) {
return (t.isBefore(e) ? t : e).clone()
}
function J(t, e) {
return (t.isAfter(e) ? t : e).clone()
}
function tt(t) {
return Boolean(t.hours() || t.minutes() || t.seconds() || t.milliseconds())
}
function et(t) {
return "[object Date]" === Object.prototype.toString.call(t) || t instanceof Date
}
function nt(t) {
return /^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)
}
function it(t, e) {
var n, i, r, s, o, l, a = {};
if (e)
for (n = 0; n < e.length; n++) {
for (i = e[n], r = [], s = t.length - 1; s >= 0; s--)
if (o = t[s][i], "object" == typeof o) r.unshift(o);
else if (void 0 !== o) {
a[i] = o;
break
}
r.length && (a[i] = it(r))
}
for (n = t.length - 1; n >= 0; n--) {
l = t[n];
for (i in l) i in a || (a[i] = l[i])
}
return a
}
function rt(t) {
var e = function() {};
return e.prototype = t, new e
}
function st(t, e) {
for (var n in t) ot(t, n) && (e[n] = t[n])
}
function ot(t, e) {
return te.call(t, e)
}
function lt(e) {
return /undefined|null|boolean|number|string/.test(t.type(e))
}
function at(e, n, i) {
if (t.isFunction(e) && (e = [e]), e) {
var r, s;
for (r = 0; r < e.length; r++) s = e[r].apply(n, i) || s;
return s
}
}
function ut() {
for (var t = 0; t < arguments.length; t++)
if (void 0 !== arguments[t]) return arguments[t]
}
function ct(t) {
return (t + "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "&#039;").replace(/"/g, "&quot;").replace(/\n/g, "<br />")
}
function dt(t) {
return t.replace(/&.*?;/g, "")
}
function ht(e) {
var n = [];
return t.each(e, function(t, e) {
null != e && n.push(t + ":" + e)
}), n.join(";")
}
function ft(e) {
var n = [];
return t.each(e, function(t, e) {
null != e && n.push(t + '="' + ct(e) + '"')
}), n.join(" ")
}
function gt(t) {
return t.charAt(0).toUpperCase() + t.slice(1)
}
function pt(t, e) {
return t - e
}
function vt(t) {
return t % 1 === 0
}
function mt(t, e) {
var n = t[e];
return function() {
return n.apply(t, arguments)
}
}
function yt(t, e, n) {
var i, r, s, o, l, a = function() {
var u = +new Date - o;
u < e ? i = setTimeout(a, e - u) : (i = null, n || (l = t.apply(s, r), s = r = null))
};
return function() {
s = this, r = arguments, o = +new Date;
var u = n && !i;
return i || (i = setTimeout(a, e)), u && (l = t.apply(s, r), s = r = null), l
}
}
function St(n, i, r) {
var s, o, l, a, u = n[0],
c = 1 == n.length && "string" == typeof u;
return e.isMoment(u) || et(u) || void 0 === u ? a = e.apply(null, n) : (s = !1, o = !1, c ? ee.test(u) ? (u += "-01", n = [u], s = !0, o = !0) : (l = ne.exec(u)) && (s = !l[5], o = !0) : t.isArray(u) && (o = !0), a = i || s ? e.utc.apply(e, n) : e.apply(null, n), s ? (a._ambigTime = !0, a._ambigZone = !0) : r && (o ? a._ambigZone = !0 : c && a.utcOffset(u))), a._fullCalendar = !0, a
}
function wt() {}
function bt(t, e) {
var n;
return ot(e, "constructor") && (n = e.constructor), "function" != typeof n && (n = e.constructor = function() {
t.apply(this, arguments)
}), n.prototype = rt(t.prototype), st(e, n.prototype), st(t, n), n
}
function Et(t, e) {
st(e, t.prototype)
}
function Dt(e) {
var n = t.Deferred(),
i = n.promise();
if ("function" == typeof e && e(function(t) {
Dt.immediate && (i._value = t), n.resolve(t)
}, function() {
n.reject()
}), Dt.immediate) {
var r = i.then;
i.then = function(t, e) {
var n = i.state();
if ("resolved" === n) {
if ("function" == typeof t) return Dt.resolve(t(i._value))
} else if ("rejected" === n && "function" == typeof e) return e(), i;
return r.call(i, t, e)
}
}
return i
}
function Tt(t) {
function e(t) {
return new Dt(function(e) {
var i = function() {
Dt.resolve(t()).then(e).then(function() {
n.shift(), n.length && n[0]()
})
};
n.push(i), 1 === n.length && i()
})
}
var n = [];
this.add = "number" == typeof t ? yt(e, t) : e, this.addQuickly = e
}
function Ct(t, e) {
return !t && !e || !(!t || !e) && (t.component === e.component && Ht(t, e) && Ht(e, t))
}
function Ht(t, e) {
for (var n in t)
if (!/^(component|left|right|top|bottom)$/.test(n) && t[n] !== e[n]) return !1;
return !0
}
function Rt(t) {
return {
start: t.start.clone(),
end: t.end ? t.end.clone() : null,
allDay: t.allDay
}
}
function xt(t) {
var e = kt(t);
return "background" === e || "inverse-background" === e
}
function It(t) {
return "inverse-background" === kt(t)
}
function kt(t) {
return ut((t.source || {}).rendering, t.rendering)
}
function Lt(t) {
var e, n, i = {};
for (e = 0; e < t.length; e++) n = t[e], (i[n._id] || (i[n._id] = [])).push(n);
return i
}
function Mt(t, e) {
return t.start - e.start
}
function Bt(n) {
var i, r, s, o, l = Zt.dataAttrPrefix;
return l && (l += "-"), i = n.data(l + "event") || null, i && (i = "object" == typeof i ? t.extend({}, i) : {}, r = i.start, null == r && (r = i.time), s = i.duration, o = i.stick, delete i.start, delete i.time, delete i.duration, delete i.stick), null == r && (r = n.data(l + "start")), null == r && (r = n.data(l + "time")), null == s && (s = n.data(l + "duration")), null == o && (o = n.data(l + "stick")), r = null != r ? e.duration(r) : null, s = null != s ? e.duration(s) : null, o = Boolean(o), {
eventProps: i,
startTime: r,
duration: s,
stick: o
}
}
function Ft(t, e) {
var n, i;
for (n = 0; n < e.length; n++)
if (i = e[n], i.leftCol <= t.rightCol && i.rightCol >= t.leftCol) return !0;
return !1
}
function Nt(t, e) {
return t.leftCol - e.leftCol
}
function zt(t) {
var e, n, i, r = [];
for (e = 0; e < t.length; e++) {
for (n = t[e], i = 0; i < r.length && Ot(n, r[i]).length; i++);
n.level = i, (r[i] || (r[i] = [])).push(n)
}
return r
}
function At(t) {
var e, n, i, r, s;
for (e = 0; e < t.length; e++)
for (n = t[e], i = 0; i < n.length; i++)
for (r = n[i], r.forwardSegs = [], s = e + 1; s < t.length; s++) Ot(r, t[s], r.forwardSegs)
}
function Gt(t) {
var e, n, i = t.forwardSegs,
r = 0;
if (void 0 === t.forwardPressure) {
for (e = 0; e < i.length; e++) n = i[e], Gt(n), r = Math.max(r, 1 + n.forwardPressure);
t.forwardPressure = r
}
}
function Ot(t, e, n) {
n = n || [];
for (var i = 0; i < e.length; i++) Vt(t, e[i]) && n.push(e[i]);
return n
}
function Vt(t, e) {
return t.bottom > e.top && t.top < e.bottom
}
function Pt(t) {
this.items = t || []
}
function _t(e, n) {
function i(t) {
n = t
}
function r() {
var i = n.layout;
p = e.options.theme ? "ui" : "fc", i ? (g ? g.empty() : g = this.el = t("<div class='fc-toolbar " + n.extraClasses + "'/>"), g.append(o("left")).append(o("right")).append(o("center")).append('<div class="fc-clear"/>')) : s()
}
function s() {
g && (g.remove(), g = f.el = null)
}
function o(i) {
var r = t('<div class="fc-' + i + '"/>'),
s = n.layout[i];
return s && t.each(s.split(" "), function(n) {
var i, s = t(),
o = !0;
t.each(this.split(","), function(n, i) {
var r, l, a, u, c, d, h, f, g, m;
"title" == i ? (s = s.add(t("<h2>&nbsp;</h2>")), o = !1) : ((r = (e.options.customButtons || {})[i]) ? (a = function(t) {
r.click && r.click.call(m[0], t)
}, u = "", c = r.text) : (l = e.getViewSpec(i)) ? (a = function() {
e.changeView(i)
}, v.push(i), u = l.buttonTextOverride, c = l.buttonTextDefault) : e[i] && (a = function() {
e[i]()
}, u = (e.overrides.buttonText || {})[i], c = e.options.buttonText[i]), a && (d = r ? r.themeIcon : e.options.themeButtonIcons[i], h = r ? r.icon : e.options.buttonIcons[i], f = u ? ct(u) : d && e.options.theme ? "<span class='ui-icon ui-icon-" + d + "'></span>" : h && !e.options.theme ? "<span class='fc-icon fc-icon-" + h + "'></span>" : ct(c), g = ["fc-" + i + "-button", p + "-button", p + "-state-default"], m = t('<button type="button" class="' + g.join(" ") + '">' + f + "</button>").click(function(t) {
m.hasClass(p + "-state-disabled") || (a(t), (m.hasClass(p + "-state-active") || m.hasClass(p + "-state-disabled")) && m.removeClass(p + "-state-hover"))
}).mousedown(function() {
m.not("." + p + "-state-active").not("." + p + "-state-disabled").addClass(p + "-state-down")
}).mouseup(function() {
m.removeClass(p + "-state-down")
}).hover(function() {
m.not("." + p + "-state-active").not("." + p + "-state-disabled").addClass(p + "-state-hover")
}, function() {
m.removeClass(p + "-state-hover").removeClass(p + "-state-down")
}), s = s.add(m)))
}), o && s.first().addClass(p + "-corner-left").end().last().addClass(p + "-corner-right").end(), s.length > 1 ? (i = t("<div/>"), o && i.addClass("fc-button-group"), i.append(s), r.append(i)) : r.append(s)
}), r
}
function l(t) {
g && g.find("h2").text(t)
}
function a(t) {
g && g.find(".fc-" + t + "-button").addClass(p + "-state-active")
}
function u(t) {
g && g.find(".fc-" + t + "-button").removeClass(p + "-state-active")
}
function c(t) {
g && g.find(".fc-" + t + "-button").prop("disabled", !0).addClass(p + "-state-disabled")
}
function d(t) {
g && g.find(".fc-" + t + "-button").prop("disabled", !1).removeClass(p + "-state-disabled")
}
function h() {
return v
}
var f = this;
f.setToolbarOptions = i, f.render = r, f.removeElement = s, f.updateTitle = l, f.activateButton = a, f.deactivateButton = u, f.disableButton = c, f.enableButton = d, f.getViewsWithButtons = h, f.el = null;
var g, p, v = []
}
function Yt(n, i) {
function r(t) {
t._locale = N
}
function s() {
O ? a() && (f(), u()) : o()
}
function o() {
n.addClass("fc"), n.on("click.fc", "a[data-goto]", function(e) {
var n = t(this),
i = n.data("goto"),
r = F.moment(i.date),
s = i.type,
o = P.opt("navLink" + gt(s) + "Click");
"function" == typeof o ? o(r, e) : ("string" == typeof o && (s = o), C(r, s))
}), F.bindOption("theme", function(t) {
V = t ? "ui" : "fc", n.toggleClass("ui-widget", t), n.toggleClass("fc-unthemed", !t)
}), F.bindOptions(["isRTL", "locale"], function(t) {
n.toggleClass("fc-ltr", !t), n.toggleClass("fc-rtl", t)
}), O = t("<div class='fc-view-container'/>").prependTo(n);
var e = y();
z = new Pt(e), A = F.header = e[0], G = F.footer = e[1], b(), E(), u(F.options.defaultView), F.options.handleWindowResize && (Y = yt(v, F.options.windowResizeDelay), t(window).resize(Y))
}
function l() {
P && P.removeElement(), z.proxyCall("removeElement"), O.remove(), n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"), n.off(".fc"), Y && t(window).unbind("resize", Y), pe.unneeded()
}
function a() {
return n.is(":visible")
}
function u(e, n) {
j++;
var i = P && e && P.type !== e;
i && (H(), c()), !P && e && (P = F.view = U[e] || (U[e] = F.instantiateView(e)), P.setElement(t("<div class='fc-view fc-" + e + "-view' />").appendTo(O)), z.proxyCall("activateButton", e)), P && a() && (n && P.captureInitialScroll(n), P.setDate(F.currentDate), F.currentDate = P.currentDate, n && P.releaseScroll()), i && R(), j--
}
function c() {
z.proxyCall("deactivateButton", P.type), P.removeElement(), P = F.view = null
}
function d() {
j++, H();
var t = P.type,
e = P.queryScroll();
c(), f(), u(t, e), R(), j--
}
function h(t) {
if (a()) return t && g(), j++, P.updateSize(!0), j--, !0
}
function f() {
a() && g()
}
function g() {
var t = F.options.contentHeight,
e = F.options.height;
_ = "number" == typeof t ? t : "function" == typeof t ? t() : "number" == typeof e ? e - p() : "function" == typeof e ? e() - p() : "parent" === e ? n.parent().height() - p() : Math.round(O.width() / Math.max(F.options.aspectRatio, .5))
}
function p() {
return z.items.reduce(function(t, e) {
var n = e.el ? e.el.outerHeight(!0) : 0;
return t + n
}, 0)
}
function v(t) {
!j && t.target === window && P.renderRange && h(!0) && P.publiclyTrigger("windowResize", W)
}
function m() {
a() && F.reportEventChange()
}
function y() {
return [new _t(F, S()), new _t(F, w())]
}
function S() {
return {
extraClasses: "fc-header-toolbar",
layout: F.options.header
}
}
function w() {
return {
extraClasses: "fc-footer-toolbar",
layout: F.options.footer
}
}
function b() {
A.setToolbarOptions(S()), A.render(), A.el && n.prepend(A.el)
}
function E() {
G.setToolbarOptions(w()), G.render(), G.el && n.append(G.el)
}
function D(t, e) {
P.select(F.buildSelectSpan.apply(F, arguments))
}
function T() {
P && P.unselect()
}
function C(t, e) {
var n;
e = e || "day", n = F.getViewSpec(e) || F.getUnitViewSpec(e), F.currentDate = t.clone(), u(n ? n.type : null)
}
function H() {
q++ || O.css({
width: "100%",
height: O.height(),
overflow: "hidden"
})
}
function R() {
--q || O.css({
width: "",
height: "",
overflow: ""
})
}
function x() {
return F
}
function I() {
return P
}
function k(t, e) {
var n;
if ("string" == typeof t) {
if (void 0 === e) return F.options[t];
n = {}, n[t] = e, L(n)
} else "object" == typeof t && L(t)
}
function L(t) {
var e, n = 0;
M(t);
for (e in t) n++;
if (1 === n) {
if ("height" === e || "contentHeight" === e || "aspectRatio" === e) return void h(!0);
if ("defaultDate" === e) return;
if ("businessHours" === e) return void(P && (P.unrenderBusinessHours(), P.renderBusinessHours()));
if ("timezone" === e) return F.rezoneArrayEventSources(), void F.refetchEvents()
}
b(), E(), U = {}, d()
}
function M(t) {
var e;
for (e in t) F.dynamicOverrides[e] = t[e];
F.viewSpecCache = {}, F.populateOptionsHash();
for (e in t) F.triggerOptionHandlers(e)
}
function B(t, e) {
var n = Array.prototype.slice.call(arguments, 2);
if (e = e || W, this.triggerWith(t, e, n), F.options[t]) return F.options[t].apply(e, n)
}
var F = this;
pe.needed(), F.render = s, F.destroy = l, F.rerenderEvents = m, F.select = D, F.unselect = T, F.zoomTo = C, F.getCalendar = x, F.getView = I, F.option = k, F.recordOptionOverrides = M, F.publiclyTrigger = B, F.dynamicOverrides = {}, F.viewSpecCache = {}, F.optionHandlers = {}, F.overrides = t.extend({}, i), F.populateOptionsHash();
var N;
F.bindOptions(["locale", "monthNames", "monthNamesShort", "dayNames", "dayNamesShort", "firstDay", "weekNumberCalculation"], function(t, e, n, i, s, o, l) {
if ("iso" === l && (l = "ISO"), N = rt(Ut(t)), e && (N._months = e), n && (N._monthsShort = n), i && (N._weekdays = i), s && (N._weekdaysShort = s), null == o && "ISO" === l && (o = 1), null != o) {
var a = rt(N._week);
a.dow = o, N._week = a
}
"ISO" !== l && "local" !== l && "function" != typeof l || (N._fullCalendar_weekCalc = l), F.currentDate && r(F.currentDate)
}), F.defaultAllDayEventDuration = e.duration(F.options.defaultAllDayEventDuration), F.defaultTimedEventDuration = e.duration(F.options.defaultTimedEventDuration), F.moment = function() {
var t;
return "local" === F.options.timezone ? (t = Zt.moment.apply(null, arguments), t.hasTime() && t.local()) : t = "UTC" === F.options.timezone ? Zt.moment.utc.apply(null, arguments) : Zt.moment.parseZone.apply(null, arguments), r(t), t
}, F.localizeMoment = r, F.getIsAmbigTimezone = function() {
return "local" !== F.options.timezone && "UTC" !== F.options.timezone
}, F.applyTimezone = function(t) {
if (!t.hasTime()) return t.clone();
var e, n = F.moment(t.toArray()),
i = t.time() - n.time();
return i && (e = n.clone().add(i), t.time() - e.time() === 0 && (n = e)), n
}, F.getNow = function() {
var t = F.options.now;
return "function" == typeof t && (t = t()), F.moment(t).stripZone()
}, F.getEventEnd = function(t) {
return t.end ? t.end.clone() : F.getDefaultEventEnd(t.allDay, t.start)
}, F.getDefaultEventEnd = function(t, e) {
var n = e.clone();
return t ? n.stripTime().add(F.defaultAllDayEventDuration) : n.add(F.defaultTimedEventDuration), F.getIsAmbigTimezone() && n.stripZone(), n
}, F.humanizeDuration = function(t) {
return t.locale(F.options.locale).humanize()
}, jt.call(F);
var z, A, G, O, V, P, _, Y, W = n[0],
U = {},
j = 0;
this.initCurrentDate(), F.renderView = u, F.getSuggestedViewHeight = function() {
return void 0 === _ && f(), _
}, F.isHeightAuto = function() {
return "auto" === F.options.contentHeight || "auto" === F.options.height
}, F.setToolbarsTitle = function(t) {
z.proxyCall("updateTitle", t)
}, F.updateToolbarButtons = function() {
var t = F.getNow(),
e = P.buildDateProfile(t),
n = P.buildPrevDateProfile(F.currentDate),
i = P.buildNextDateProfile(F.currentDate);
z.proxyCall(e.isValid && !Z(t, P.currentRange) ? "enableButton" : "disableButton", "today"), z.proxyCall(n.isValid ? "enableButton" : "disableButton", "prev"), z.proxyCall(i.isValid ? "enableButton" : "disableButton", "next")
}, F.freezeContentHeight = H, F.thawContentHeight = R;
var q = 0;
F.initialize()
}
function Wt(e) {
t.each(Re, function(t, n) {
null == e[t] && (e[t] = n(e))
})
}
function Ut(t) {
return e.localeData(t) || e.localeData("en")
}
function jt() {
function n(t, e) {
return !U.options.lazyFetching || s(t, e) ? o(t, e) : Dt.resolve(Z)
}
function i() {
Z = r(K), U.trigger("eventsReset", Z)
}
function r(t) {
var e, n, i = [];
for (e = 0; e < t.length; e++) n = t[e], n.start.clone().stripZone() < q && U.getEventEnd(n).stripZone() > j && i.push(n);
return i
}
function s(t, e) {
return !j || t < j || e > q
}
function o(t, e) {
return j = t, q = e, l()
}
function l() {
return u(Q, "reset")
}
function a(t) {
return u(b(t))
}
function u(t, e) {
var n, i;
for ("reset" === e ? K = [] : "add" !== e && (K = C(K, t)), n = 0; n < t.length; n++) i = t[n], "pending" !== i._status && X++, i._fetchId = (i._fetchId || 0) + 1, i._status = "pending";
for (n = 0; n < t.length; n++) i = t[n], c(i, i._fetchId);
return X ? new Dt(function(t) {
U.one("eventsReceived", t)
}) : Dt.resolve(Z)
}
function c(e, n) {
f(e, function(i) {
var r, s, o, l = t.isArray(e.events);
if (n === e._fetchId && "rejected" !== e._status) {
if (e._status = "resolved", i)
for (r = 0; r < i.length; r++) s = i[r], o = l ? s : N(s, e), o && K.push.apply(K, _(o));
h()
}
})
}
function d(t) {
var e = "pending" === t._status;
t._status = "rejected", e && h()
}
function h() {
X--, X || (i(K), U.trigger("eventsReceived", Z))
}
function f(e, n) {
var i, r, s = Zt.sourceFetchers;
for (i = 0; i < s.length; i++) {
if (r = s[i].call(U, e, j.clone(), q.clone(), U.options.timezone, n), r === !0) return;
if ("object" == typeof r) return void f(r, n)
}
var o = e.events;
if (o) t.isFunction(o) ? (U.pushLoading(), o.call(U, j.clone(), q.clone(), U.options.timezone, function(t) {
n(t), U.popLoading()
})) : t.isArray(o) ? n(o) : n();
else {
var l = e.url;
if (l) {
var a, u = e.success,
c = e.error,
d = e.complete;
a = t.isFunction(e.data) ? e.data() : e.data;
var h = t.extend({}, a || {}),
g = ut(e.startParam, U.options.startParam),
p = ut(e.endParam, U.options.endParam),
v = ut(e.timezoneParam, U.options.timezoneParam);
g && (h[g] = j.format()), p && (h[p] = q.format()), U.options.timezone && "local" != U.options.timezone && (h[v] = U.options.timezone), U.pushLoading(), t.ajax(t.extend({}, xe, e, {
data: h,
success: function(e) {
e = e || [];
var i = at(u, this, arguments);
t.isArray(i) && (e = i), n(e)
},
error: function() {
at(c, this, arguments), n()
},
complete: function() {
at(d, this, arguments), U.popLoading()
}
}))
} else n()
}
}
function g(t) {
var e = p(t);
e && (Q.push(e), u([e], "add"))
}
function p(e) {
var n, i, r = Zt.sourceNormalizers;
if (t.isFunction(e) || t.isArray(e) ? n = {
events: e
} : "string" == typeof e ? n = {
url: e
} : "object" == typeof e && (n = t.extend({}, e)), n) {
for (n.className ? "string" == typeof n.className && (n.className = n.className.split(/\s+/)) : n.className = [], t.isArray(n.events) && (n.origArray = n.events, n.events = t.map(n.events, function(t) {
return N(t, n)
})), i = 0; i < r.length; i++) r[i].call(U, n);
return n
}
}
function v(t) {
y(E(t))
}
function m(t) {
null == t ? y(Q, !0) : y(b(t))
}
function y(e, n) {
var r;
for (r = 0; r < e.length; r++) d(e[r]);
n ? (Q = [], K = []) : (Q = t.grep(Q, function(t) {
for (r = 0; r < e.length; r++)
if (t === e[r]) return !1;
return !0
}), K = C(K, e)), i()
}
function S() {
return Q.slice(1)
}
function w(e) {
return t.grep(Q, function(t) {
return t.id && t.id === e
})[0]
}
function b(e) {
e ? t.isArray(e) || (e = [e]) : e = [];
var n, i = [];
for (n = 0; n < e.length; n++) i.push.apply(i, E(e[n]));
return i
}
function E(e) {
var n, i;
for (n = 0; n < Q.length; n++)
if (i = Q[n], i === e) return [i];
return i = w(e), i ? [i] : t.grep(Q, function(t) {
return D(e, t)
})
}
function D(t, e) {
return t && e && T(t) == T(e)
}
function T(t) {
return ("object" == typeof t ? t.origArray || t.googleCalendarId || t.url || t.events : null) || t
}
function C(e, n) {
return t.grep(e, function(t) {
for (var e = 0; e < n.length; e++)
if (t.source === n[e]) return !1;
return !0
})
}
function H(t) {
R([t])
}
function R(t) {
var e, n;
for (e = 0; e < t.length; e++) n = t[e], n.start = U.moment(n.start), n.end ? n.end = U.moment(n.end) : n.end = null, Y(n, x(n));
i()
}
function x(e) {
var n = {};
return t.each(e, function(t, e) {
I(t) && void 0 !== e && lt(e) && (n[t] = e)
}), n
}
function I(t) {
return !/^_|^(id|allDay|start|end)$/.test(t)
}
function k(t, e) {
return L([t], e)
}
function L(t, e) {
var n, r, s, o, l, a = [];
for (s = 0; s < t.length; s++)
if (r = N(t[s])) {
for (n = _(r), o = 0; o < n.length; o++) l = n[o], l.source || (e && ($.events.push(l), l.source = $), K.push(l));
a = a.concat(n)
}
return a.length && i(), a
}
function M(e) {
var n, r;
for (null == e ? e = function() {
return !0
} : t.isFunction(e) || (n = e + "", e = function(t) {
return t._id == n
}), K = t.grep(K, e, !0), r = 0; r < Q.length; r++) t.isArray(Q[r].events) && (Q[r].events = t.grep(Q[r].events, e, !0));
i()
}
function B(e) {
return t.isFunction(e) ? t.grep(K, e) : null != e ? (e += "", t.grep(K, function(t) {
return t._id == e
})) : K
}
function F(t) {
t.start = U.moment(t.start), t.end && (t.end = U.moment(t.end)), qt(t)
}
function N(n, i) {
var r, s, o, l = {};
if (U.options.eventDataTransform && (n = U.options.eventDataTransform(n)), i && i.eventDataTransform && (n = i.eventDataTransform(n)), t.extend(l, n), i && (l.source = i), l._id = n._id || (void 0 === n.id ? "_fc" + Ie++ : n.id + ""), n.className ? "string" == typeof n.className ? l.className = n.className.split(/\s+/) : l.className = n.className : l.className = [], r = n.start || n.date, s = n.end, nt(r) && (r = e.duration(r)), nt(s) && (s = e.duration(s)), n.dow || e.isDuration(r) || e.isDuration(s)) l.start = r ? e.duration(r) : null, l.end = s ? e.duration(s) : null, l._recurring = !0;
else {
if (r && (r = U.moment(r), !r.isValid())) return !1;
s && (s = U.moment(s), s.isValid() || (s = null)), o = n.allDay, void 0 === o && (o = ut(i ? i.allDayDefault : void 0, U.options.allDayDefault)), O(r, s, o, l)
}
return U.normalizeEvent(l), l
}
function O(t, e, n, i) {
i.start = t, i.end = e, i.allDay = n, V(i), qt(i)
}
function V(t) {
P(t), t.end && !t.end.isAfter(t.start) && (t.end = null), t.end || (U.options.forceEventDuration ? t.end = U.getDefaultEventEnd(t.allDay, t.start) : t.end = null)
}
function P(t) {
null == t.allDay && (t.allDay = !(t.start.hasTime() || t.end && t.end.hasTime())), t.allDay ? (t.start.stripTime(), t.end && t.end.stripTime()) : (t.start.hasTime() || (t.start = U.applyTimezone(t.start.time(0))), t.end && !t.end.hasTime() && (t.end = U.applyTimezone(t.end.time(0))))
}
function _(e, n, i) {
var r, s, o, l, a, u, c, d, h, f = [];
if (n = n || j, i = i || q, e)
if (e._recurring) {
if (s = e.dow)
for (r = {}, o = 0; o < s.length; o++) r[s[o]] = !0;
for (l = n.clone().stripTime(); l.isBefore(i);) r && !r[l.day()] || (a = e.start, u = e.end, c = l.clone(), d = null, a && (c = c.time(a)), u && (d = l.clone().time(u)), h = t.extend({}, e), O(c, d, !a && !u, h), f.push(h)), l.add(1, "days")
} else f.push(e);
return f
}
function Y(e, n, i) {
function r(t, e) {
return i ? G(t, e, i) : n.allDay ? A(t, e) : z(t, e)
}
var s, o, l, a, u, c, d = {};
return n = n || {}, n.start || (n.start = e.start.clone()), void 0 === n.end && (n.end = e.end ? e.end.clone() : null), null == n.allDay && (n.allDay = e.allDay), V(n), s = {
start: e._start.clone(),
end: e._end ? e._end.clone() : U.getDefaultEventEnd(e._allDay, e._start),
allDay: n.allDay
}, V(s), o = null !== e._end && null === n.end, l = r(n.start, s.start), n.end ? (a = r(n.end, s.end), u = a.subtract(l)) : u = null, t.each(n, function(t, e) {
I(t) && void 0 !== e && (d[t] = e)
}), c = W(B(e._id), o, n.allDay, l, u, d), {
dateDelta: l,
durationDelta: u,
undo: c
}
}
function W(e, n, i, r, s, o) {
var l = U.getIsAmbigTimezone(),
a = [];
return r && !r.valueOf() && (r = null), s && !s.valueOf() && (s = null), t.each(e, function(e, u) {
var c, d;
c = {
start: u.start.clone(),
end: u.end ? u.end.clone() : null,
allDay: u.allDay
}, t.each(o, function(t) {
c[t] = u[t]
}), d = {
start: u._start,
end: u._end,
allDay: i
}, V(d), n ? d.end = null : s && !d.end && (d.end = U.getDefaultEventEnd(d.allDay, d.start)), r && (d.start.add(r), d.end && d.end.add(r)), s && d.end.add(s), l && !d.allDay && (r || s) && (d.start.stripZone(), d.end && d.end.stripZone()), t.extend(u, o, d), qt(u), a.push(function() {
t.extend(u, c), qt(u)
})
}),
function() {
for (var t = 0; t < a.length; t++) a[t]()
}
}
var U = this;
U.requestEvents = n, U.reportEventChange = i, U.isFetchNeeded = s, U.fetchEvents = o, U.fetchEventSources = u, U.refetchEvents = l, U.refetchEventSources = a, U.getEventSources = S, U.getEventSourceById = w, U.addEventSource = g, U.removeEventSource = v, U.removeEventSources = m, U.updateEvent = H, U.updateEvents = R, U.renderEvent = k, U.renderEvents = L, U.removeEvents = M, U.clientEvents = B, U.mutateEvent = Y, U.normalizeEventDates = V, U.normalizeEventTimes = P;
var j, q, Z, $ = {
events: []
},
Q = [$],
X = 0,
K = [];
t.each((U.options.events ? [U.options.events] : []).concat(U.options.eventSources || []), function(t, e) {
var n = p(e);
n && Q.push(n)
}), U.getEventCache = function() {
return K
}, U.getPrunedEventCache = function() {
return Z
}, U.rezoneArrayEventSources = function() {
var e, n, i;
for (e = 0; e < Q.length; e++)
if (n = Q[e].events, t.isArray(n))
for (i = 0; i < n.length; i++) F(n[i])
}, U.buildEventFromInput = N, U.expandEvent = _
}
function qt(t) {
t._allDay = t.allDay, t._start = t.start.clone(), t._end = t.end ? t.end.clone() : null
}
var Zt = t.fullCalendar = {
version: "3.3.1",
internalApiVersion: 9
},
$t = Zt.views = {};
t.fn.fullCalendar = function(e) {
var n = Array.prototype.slice.call(arguments, 1),
i = this;
return this.each(function(r, s) {
var o, l = t(s),
a = l.data("fullCalendar");
"string" == typeof e ? a && t.isFunction(a[e]) && (o = a[e].apply(a, n), r || (i = o), "destroy" === e && l.removeData("fullCalendar")) : a || (a = new De(l, e), l.data("fullCalendar", a), a.render())
}), i
};
var Qt = ["header", "footer", "buttonText", "buttonIcons", "themeButtonIcons"];
Zt.intersectRanges = N, Zt.applyAll = at, Zt.debounce = yt, Zt.isInt = vt, Zt.htmlEscape = ct, Zt.cssToStr = ht, Zt.proxy = mt, Zt.capitaliseFirstLetter = gt, Zt.getOuterRect = h, Zt.getClientRect = f, Zt.getContentRect = g, Zt.getScrollbarWidths = p;
var Xt = null;
Zt.preventDefault = H, Zt.intersectRects = R, Zt.parseFieldSpecs = L, Zt.compareByFieldSpecs = M, Zt.compareByFieldSpec = B, Zt.flexibleCompare = F, Zt.computeGreatestUnit = O, Zt.divideRangeByDuration = _, Zt.divideDurationByDuration = Y, Zt.multiplyDuration = W, Zt.durationHasTime = tt;
var Kt = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"],
Jt = ["year", "month", "week", "day", "hour", "minute", "second", "millisecond"];
Zt.log = function() {
var t = window.console;
if (t && t.log) return t.log.apply(t, arguments)
}, Zt.warn = function() {
var t = window.console;
return t && t.warn ? t.warn.apply(t, arguments) : Zt.log.apply(Zt, arguments)
};
var te = {}.hasOwnProperty;
Zt.createObject = rt;
var ee = /^\s*\d{4}-\d\d$/,
ne = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,
ie = e.fn,
re = t.extend({}, ie),
se = e.momentProperties;
se.push("_fullCalendar"), se.push("_ambigTime"), se.push("_ambigZone"), Zt.moment = function() {
return St(arguments)
}, Zt.moment.utc = function() {
var t = St(arguments, !0);
return t.hasTime() && t.utc(), t
}, Zt.moment.parseZone = function() {
return St(arguments, !0, !0)
}, ie.week = ie.weeks = function(t) {
var e = this._locale._fullCalendar_weekCalc;
return null == t && "function" == typeof e ? e(this) : "ISO" === e ? re.isoWeek.apply(this, arguments) : re.week.apply(this, arguments)
}, ie.time = function(t) {
if (!this._fullCalendar) return re.time.apply(this, arguments);
if (null == t) return e.duration({
hours: this.hours(),
minutes: this.minutes(),
seconds: this.seconds(),
milliseconds: this.milliseconds()
});
this._ambigTime = !1, e.isDuration(t) || e.isMoment(t) || (t = e.duration(t));
var n = 0;
return e.isDuration(t) && (n = 24 * Math.floor(t.asDays())), this.hours(n + t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())
}, ie.stripTime = function() {
return this._ambigTime || (this.utc(!0), this.set({
hours: 0,
minutes: 0,
seconds: 0,
ms: 0
}), this._ambigTime = !0, this._ambigZone = !0), this
}, ie.hasTime = function() {
return !this._ambigTime
}, ie.stripZone = function() {
var t;
return this._ambigZone || (t = this._ambigTime, this.utc(!0), this._ambigTime = t || !1, this._ambigZone = !0), this
}, ie.hasZone = function() {
return !this._ambigZone
}, ie.local = function(t) {
return re.local.call(this, this._ambigZone || t), this._ambigTime = !1, this._ambigZone = !1, this
}, ie.utc = function(t) {
return re.utc.call(this, t), this._ambigTime = !1, this._ambigZone = !1, this
}, ie.utcOffset = function(t) {
return null != t && (this._ambigTime = !1, this._ambigZone = !1), re.utcOffset.apply(this, arguments)
}, ie.format = function() {
return this._fullCalendar && arguments[0] ? oe(this, arguments[0]) : this._ambigTime ? ae(this, "YYYY-MM-DD") : this._ambigZone ? ae(this, "YYYY-MM-DD[T]HH:mm:ss") : re.format.apply(this, arguments)
}, ie.toISOString = function() {
return this._ambigTime ? ae(this, "YYYY-MM-DD") : this._ambigZone ? ae(this, "YYYY-MM-DD[T]HH:mm:ss") : re.toISOString.apply(this, arguments)
},
function() {
function t(t, e) {
return c(r(e).fakeFormatString, t)
}
function e(t, e) {
return re.format.call(t, e)
}
function n(t, e, n, s, o) {
var l;
return t = Zt.moment.parseZone(t), e = Zt.moment.parseZone(e), l = t.localeData(), n = l.longDateFormat(n) || n, i(r(n), t, e, s || " - ", o)
}
function i(t, e, n, i, r) {
var s, o, l, a = t.sameUnits,
u = e.clone().stripZone(),
c = n.clone().stripZone(),
f = d(t.fakeFormatString, e),
g = d(t.fakeFormatString, n),
p = "",
v = "",
m = "",
y = "",
S = "";
for (s = 0; s < a.length && (!a[s] || u.isSame(c, a[s])); s++) p += f[s];
for (o = a.length - 1; o > s && (!a[o] || u.isSame(c, a[o])) && (o - 1 !== s || "." !== f[o]); o--) v = f[o] + v;
for (l = s; l <= o; l++) m += f[l], y += g[l];
return (m || y) && (S = r ? y + i + m : m + i + y), h(p + S + v)
}
function r(t) {
return w[t] || (w[t] = s(t))
}
function s(t) {
var e = o(t);
return {
fakeFormatString: a(e),
sameUnits: u(e)
}
}
function o(t) {
for (var e, n = [], i = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g; e = i.exec(t);) e[1] ? n.push.apply(n, l(e[1])) : e[2] ? n.push({
maybe: o(e[2])
}) : e[3] ? n.push({
token: e[3]
}) : e[5] && n.push.apply(n, l(e[5]));
return n
}
function l(t) {
return ". " === t ? [".", " "] : [t]
}
function a(t) {
var e, n, i = [];
for (e = 0; e < t.length; e++) n = t[e], "string" == typeof n ? i.push("[" + n + "]") : n.token ? n.token in y ? i.push(p + "[" + n.token + "]") : i.push(n.token) : n.maybe && i.push(v + a(n.maybe) + v);
return i.join(g)
}
function u(t) {
var e, n, i, r = [];
for (e = 0; e < t.length; e++) n = t[e], n.token ? (i = S[n.token.charAt(0)], r.push(i ? i.unit : "second")) : n.maybe ? r.push.apply(r, u(n.maybe)) : r.push(null);
return r
}
function c(t, e) {
return h(d(t, e).join(""))
}
function d(t, n) {
var i, r, s = [],
o = e(n, t),
l = o.split(g);
for (i = 0; i < l.length; i++) r = l[i], r.charAt(0) === p ? s.push(y[r.substring(1)](n)) : s.push(r);
return s
}
function h(t) {
return t.replace(m, function(t, e) {
return e.match(/[1-9]/) ? e : ""
})
}
function f(t) {
var e, n, i, r, s = o(t);
for (e = 0; e < s.length; e++) n = s[e], n.token && (i = S[n.token.charAt(0)], i && (!r || i.value > r.value) && (r = i));
return r ? r.unit : null
}
Zt.formatDate = t, Zt.formatRange = n, Zt.oldMomentFormat = e, Zt.queryMostGranularFormatUnit = f;
var g = "\v",
p = "",
v = "",
m = new RegExp(v + "([^" + v + "]*)" + v, "g"),
y = {
t: function(t) {
return e(t, "a").charAt(0)
},
T: function(t) {
return e(t, "A").charAt(0)
}
},
S = {
Y: {
value: 1,
unit: "year"
},
M: {
value: 2,
unit: "month"
},
W: {
value: 3,
unit: "week"
},
w: {
value: 3,
unit: "week"
},
D: {
value: 4,
unit: "day"
},
d: {
value: 4,
unit: "day"
}
},
w = {}
}();
var oe = Zt.formatDate,
le = Zt.formatRange,
ae = Zt.oldMomentFormat;
Zt.Class = wt, wt.extend = function() {
var t, e, n = arguments.length;
for (t = 0; t < n; t++) e = arguments[t], t < n - 1 && Et(this, e);
return bt(this, e || {})
}, wt.mixin = function(t) {
Et(this, t)
}, Zt.Promise = Dt, Dt.immediate = !0, Dt.resolve = function(e) {
if (e && "function" == typeof e.resolve) return e.promise();
if (e && "function" == typeof e.then) return e;
var n = t.Deferred().resolve(e),
i = n.promise();
if (Dt.immediate) {
var r = i.then;
i._value = e, i.then = function(t, n) {
return "function" == typeof t ? Dt.resolve(t(e)) : r.call(i, t, n)
}
}
return i
}, Dt.reject = function() {
return t.Deferred().reject().promise()
}, Dt.all = function(e) {
var n, i, r, s = !1;
if (Dt.immediate)
for (s = !0, n = [], i = 0; i < e.length; i++)
if (r = e[i], r && "function" == typeof r.state && "resolved" === r.state() && "_value" in r) n.push(r._value);
else {
if (r && "function" == typeof r.then) {
s = !1;
break
}
n.push(r)
}
return s ? Dt.resolve(n) : t.when.apply(t.when, e).then(function() {
return t.when(t.makeArray(arguments))
})
}, Zt.TaskQueue = Tt;
var ue = Zt.EmitterMixin = {
on: function(e, n) {
return t(this).on(e, this._prepareIntercept(n)), this
},
one: function(e, n) {
return t(this).one(e, this._prepareIntercept(n)), this
},
_prepareIntercept: function(e) {
var n = function(t, n) {
return e.apply(n.context || this, n.args || [])
};
return e.guid || (e.guid = t.guid++), n.guid = e.guid, n
},
off: function(e, n) {
return t(this).off(e, n), this
},
trigger: function(e) {
var n = Array.prototype.slice.call(arguments, 1);
return t(this).triggerHandler(e, {
args: n
}), this
},
triggerWith: function(e, n, i) {
return t(this).triggerHandler(e, {
context: n,
args: i
}), this
}
},
ce = Zt.ListenerMixin = function() {
var e = 0,
n = {
listenerId: null,
listenTo: function(e, n, i) {
if ("object" == typeof n)
for (var r in n) n.hasOwnProperty(r) && this.listenTo(e, r, n[r]);
else "string" == typeof n && e.on(n + "." + this.getListenerNamespace(), t.proxy(i, this))
},
stopListeningTo: function(t, e) {
t.off((e || "") + "." + this.getListenerNamespace())
},
getListenerNamespace: function() {
return null == this.listenerId && (this.listenerId = e++), "_listener" + this.listenerId
}
};
return n
}(),
de = wt.extend(ce, {
isHidden: !0,
options: null,
el: null,
margin: 10,
constructor: function(t) {
this.options = t || {}
},
show: function() {
this.isHidden && (this.el || this.render(), this.el.show(), this.position(), this.isHidden = !1, this.trigger("show"))
},
hide: function() {
this.isHidden || (this.el.hide(), this.isHidden = !0, this.trigger("hide"))
},
render: function() {
var e = this,
n = this.options;
this.el = t('<div class="fc-popover"/>').addClass(n.className || "").css({
top: 0,
left: 0
}).append(n.content).appendTo(n.parentEl), this.el.on("click", ".fc-close", function() {
e.hide()
}), n.autoHide && this.listenTo(t(document), "mousedown", this.documentMousedown)
},
documentMousedown: function(e) {
this.el && !t(e.target).closest(this.el).length && this.hide()
},
removeElement: function() {
this.hide(), this.el && (this.el.remove(), this.el = null), this.stopListeningTo(t(document), "mousedown")
},
position: function() {
var e, n, i, r, s, o = this.options,
l = this.el.offsetParent().offset(),
a = this.el.outerWidth(),
u = this.el.outerHeight(),
c = t(window),
h = d(this.el);
r = o.top || 0, s = void 0 !== o.left ? o.left : void 0 !== o.right ? o.right - a : 0, h.is(window) || h.is(document) ? (h = c, e = 0, n = 0) : (i = h.offset(), e = i.top, n = i.left), e += c.scrollTop(), n += c.scrollLeft(), o.viewportConstrain !== !1 && (r = Math.min(r, e + h.outerHeight() - u - this.margin), r = Math.max(r, e + this.margin), s = Math.min(s, n + h.outerWidth() - a - this.margin), s = Math.max(s, n + this.margin)), this.el.css({
top: r - l.top,
left: s - l.left
})
},
trigger: function(t) {
this.options[t] && this.options[t].apply(this, Array.prototype.slice.call(arguments, 1))
}
}),
he = Zt.CoordCache = wt.extend({
els: null,
forcedOffsetParentEl: null,
origin: null,
boundingRect: null,
isHorizontal: !1,
isVertical: !1,
lefts: null,
rights: null,
tops: null,
bottoms: null,
constructor: function(e) {
this.els = t(e.els), this.isHorizontal = e.isHorizontal, this.isVertical = e.isVertical, this.forcedOffsetParentEl = e.offsetParent ? t(e.offsetParent) : null
},
build: function() {
var t = this.forcedOffsetParentEl;
!t && this.els.length > 0 && (t = this.els.eq(0).offsetParent()), this.origin = t ? t.offset() : null, this.boundingRect = this.queryBoundingRect(), this.isHorizontal && this.buildElHorizontals(), this.isVertical && this.buildElVerticals()
},
clear: function() {
this.origin = null, this.boundingRect = null, this.lefts = null, this.rights = null, this.tops = null, this.bottoms = null
},
ensureBuilt: function() {
this.origin || this.build()
},
buildElHorizontals: function() {
var e = [],
n = [];
this.els.each(function(i, r) {
var s = t(r),
o = s.offset().left,
l = s.outerWidth();
e.push(o), n.push(o + l)
}), this.lefts = e, this.rights = n
},
buildElVerticals: function() {
var e = [],
n = [];
this.els.each(function(i, r) {
var s = t(r),
o = s.offset().top,
l = s.outerHeight();
e.push(o), n.push(o + l)
}), this.tops = e, this.bottoms = n
},
getHorizontalIndex: function(t) {
this.ensureBuilt();
var e, n = this.lefts,
i = this.rights,
r = n.length;
for (e = 0; e < r; e++)
if (t >= n[e] && t < i[e]) return e
},
getVerticalIndex: function(t) {
this.ensureBuilt();
var e, n = this.tops,
i = this.bottoms,
r = n.length;
for (e = 0; e < r; e++)
if (t >= n[e] && t < i[e]) return e
},
getLeftOffset: function(t) {
return this.ensureBuilt(), this.lefts[t]
},
getLeftPosition: function(t) {
return this.ensureBuilt(), this.lefts[t] - this.origin.left
},
getRightOffset: function(t) {
return this.ensureBuilt(), this.rights[t]
},
getRightPosition: function(t) {
return this.ensureBuilt(), this.rights[t] - this.origin.left
},
getWidth: function(t) {
return this.ensureBuilt(), this.rights[t] - this.lefts[t]
},
getTopOffset: function(t) {
return this.ensureBuilt(), this.tops[t]
},
getTopPosition: function(t) {
return this.ensureBuilt(), this.tops[t] - this.origin.top
},
getBottomOffset: function(t) {
return this.ensureBuilt(), this.bottoms[t]
},
getBottomPosition: function(t) {
return this.ensureBuilt(), this.bottoms[t] - this.origin.top
},
getHeight: function(t) {
return this.ensureBuilt(), this.bottoms[t] - this.tops[t]
},
queryBoundingRect: function() {
var t;
return this.els.length > 0 && (t = d(this.els.eq(0)), !t.is(document)) ? f(t) : null
},
isPointInBounds: function(t, e) {
return this.isLeftInBounds(t) && this.isTopInBounds(e)
},
isLeftInBounds: function(t) {
return !this.boundingRect || t >= this.boundingRect.left && t < this.boundingRect.right
},
isTopInBounds: function(t) {
return !this.boundingRect || t >= this.boundingRect.top && t < this.boundingRect.bottom
}
}),
fe = Zt.DragListener = wt.extend(ce, {
options: null,
subjectEl: null,
originX: null,
originY: null,
scrollEl: null,
isInteracting: !1,
isDistanceSurpassed: !1,
isDelayEnded: !1,
isDragging: !1,
isTouch: !1,
isGeneric: !1,
delay: null,
delayTimeoutId: null,
minDistance: null,
shouldCancelTouchScroll: !0,
scrollAlwaysKills: !1,
constructor: function(t) {
this.options = t || {}
},
startInteraction: function(e, n) {
if ("mousedown" === e.type) {
if (pe.get().shouldIgnoreMouse()) return;
if (!w(e)) return;
e.preventDefault()
}
this.isInteracting || (n = n || {}, this.delay = ut(n.delay, this.options.delay, 0), this.minDistance = ut(n.distance, this.options.distance, 0), this.subjectEl = this.options.subjectEl, T(t("body")), this.isInteracting = !0, this.isTouch = D(e), this.isGeneric = "dragstart" === e.type, this.isDelayEnded = !1, this.isDistanceSurpassed = !1, this.originX = b(e), this.originY = E(e), this.scrollEl = d(t(e.target)), this.bindHandlers(), this.initAutoScroll(), this.handleInteractionStart(e), this.startDelay(e), this.minDistance || this.handleDistanceSurpassed(e))
},
handleInteractionStart: function(t) {
this.trigger("interactionStart", t)
},
endInteraction: function(e, n) {
this.isInteracting && (this.endDrag(e), this.delayTimeoutId && (clearTimeout(this.delayTimeoutId), this.delayTimeoutId = null), this.destroyAutoScroll(), this.unbindHandlers(), this.isInteracting = !1, this.handleInteractionEnd(e, n), C(t("body")))
},
handleInteractionEnd: function(t, e) {
this.trigger("interactionEnd", t, e || !1)
},
bindHandlers: function() {
var e = pe.get();
this.isGeneric ? this.listenTo(t(document), {
drag: this.handleMove,
dragstop: this.endInteraction
}) : this.isTouch ? this.listenTo(e, {
touchmove: this.handleTouchMove,
touchend: this.endInteraction,
scroll: this.handleTouchScroll
}) : this.listenTo(e, {
mousemove: this.handleMouseMove,
mouseup: this.endInteraction
}), this.listenTo(e, {
selectstart: H,
contextmenu: H
})
},
unbindHandlers: function() {
this.stopListeningTo(pe.get()), this.stopListeningTo(t(document))
},
startDrag: function(t, e) {
this.startInteraction(t, e), this.isDragging || (this.isDragging = !0, this.handleDragStart(t))
},
handleDragStart: function(t) {
this.trigger("dragStart", t)
},
handleMove: function(t) {
var e, n = b(t) - this.originX,
i = E(t) - this.originY,
r = this.minDistance;
this.isDistanceSurpassed || (e = n * n + i * i, e >= r * r && this.handleDistanceSurpassed(t)), this.isDragging && this.handleDrag(n, i, t)
},
handleDrag: function(t, e, n) {
this.trigger("drag", t, e, n), this.updateAutoScroll(n)
},
endDrag: function(t) {
this.isDragging && (this.isDragging = !1, this.handleDragEnd(t))
},
handleDragEnd: function(t) {
this.trigger("dragEnd", t)
},
startDelay: function(t) {
var e = this;
this.delay ? this.delayTimeoutId = setTimeout(function() {
e.handleDelayEnd(t)
}, this.delay) : this.handleDelayEnd(t)
},
handleDelayEnd: function(t) {
this.isDelayEnded = !0, this.isDistanceSurpassed && this.startDrag(t)
},
handleDistanceSurpassed: function(t) {
this.isDistanceSurpassed = !0, this.isDelayEnded && this.startDrag(t)
},
handleTouchMove: function(t) {
this.isDragging && this.shouldCancelTouchScroll && t.preventDefault(), this.handleMove(t)
},
handleMouseMove: function(t) {
this.handleMove(t)
},
handleTouchScroll: function(t) {
this.isDragging && !this.scrollAlwaysKills || this.endInteraction(t, !0)
},
trigger: function(t) {
this.options[t] && this.options[t].apply(this, Array.prototype.slice.call(arguments, 1)), this["_" + t] && this["_" + t].apply(this, Array.prototype.slice.call(arguments, 1))
}
});
fe.mixin({
isAutoScroll: !1,
scrollBounds: null,
scrollTopVel: null,
scrollLeftVel: null,
scrollIntervalId: null,
scrollSensitivity: 30,
scrollSpeed: 200,
scrollIntervalMs: 50,
initAutoScroll: function() {
var t = this.scrollEl;
this.isAutoScroll = this.options.scroll && t && !t.is(window) && !t.is(document), this.isAutoScroll && this.listenTo(t, "scroll", yt(this.handleDebouncedScroll, 100))
},
destroyAutoScroll: function() {
this.endAutoScroll(), this.isAutoScroll && this.stopListeningTo(this.scrollEl, "scroll")
},
computeScrollBounds: function() {
this.isAutoScroll && (this.scrollBounds = h(this.scrollEl))
},
updateAutoScroll: function(t) {
var e, n, i, r, s = this.scrollSensitivity,
o = this.scrollBounds,
l = 0,
a = 0;
o && (e = (s - (E(t) - o.top)) / s, n = (s - (o.bottom - E(t))) / s, i = (s - (b(t) - o.left)) / s, r = (s - (o.right - b(t))) / s, e >= 0 && e <= 1 ? l = e * this.scrollSpeed * -1 : n >= 0 && n <= 1 && (l = n * this.scrollSpeed), i >= 0 && i <= 1 ? a = i * this.scrollSpeed * -1 : r >= 0 && r <= 1 && (a = r * this.scrollSpeed)), this.setScrollVel(l, a)
},
setScrollVel: function(t, e) {
this.scrollTopVel = t, this.scrollLeftVel = e, this.constrainScrollVel(), !this.scrollTopVel && !this.scrollLeftVel || this.scrollIntervalId || (this.scrollIntervalId = setInterval(mt(this, "scrollIntervalFunc"), this.scrollIntervalMs))
},
constrainScrollVel: function() {
var t = this.scrollEl;
this.scrollTopVel < 0 ? t.scrollTop() <= 0 && (this.scrollTopVel = 0) : this.scrollTopVel > 0 && t.scrollTop() + t[0].clientHeight >= t[0].scrollHeight && (this.scrollTopVel = 0), this.scrollLeftVel < 0 ? t.scrollLeft() <= 0 && (this.scrollLeftVel = 0) : this.scrollLeftVel > 0 && t.scrollLeft() + t[0].clientWidth >= t[0].scrollWidth && (this.scrollLeftVel = 0)
},
scrollIntervalFunc: function() {
var t = this.scrollEl,
e = this.scrollIntervalMs / 1e3;
this.scrollTopVel && t.scrollTop(t.scrollTop() + this.scrollTopVel * e), this.scrollLeftVel && t.scrollLeft(t.scrollLeft() + this.scrollLeftVel * e), this.constrainScrollVel(), this.scrollTopVel || this.scrollLeftVel || this.endAutoScroll()
},
endAutoScroll: function() {
this.scrollIntervalId && (clearInterval(this.scrollIntervalId), this.scrollIntervalId = null, this.handleScrollEnd())
},
handleDebouncedScroll: function() {
this.scrollIntervalId || this.handleScrollEnd()
},
handleScrollEnd: function() {}
});
var ge = fe.extend({
component: null,
origHit: null,
hit: null,
coordAdjust: null,
constructor: function(t, e) {
fe.call(this, e), this.component = t
},
handleInteractionStart: function(t) {
var e, n, i, r = this.subjectEl;
this.component.hitsNeeded(), this.computeScrollBounds(), t ? (n = {
left: b(t),
top: E(t)
}, i = n, r && (e = h(r), i = x(i, e)), this.origHit = this.queryHit(i.left, i.top), r && this.options.subjectCenter && (this.origHit && (e = R(this.origHit, e) || e), i = I(e)), this.coordAdjust = k(i, n)) : (this.origHit = null, this.coordAdjust = null), fe.prototype.handleInteractionStart.apply(this, arguments)
},
handleDragStart: function(t) {
var e;
fe.prototype.handleDragStart.apply(this, arguments), e = this.queryHit(b(t), E(t)), e && this.handleHitOver(e)
},
handleDrag: function(t, e, n) {
var i;
fe.prototype.handleDrag.apply(this, arguments), i = this.queryHit(b(n), E(n)), Ct(i, this.hit) || (this.hit && this.handleHitOut(), i && this.handleHitOver(i))
},
handleDragEnd: function() {
this.handleHitDone(), fe.prototype.handleDragEnd.apply(this, arguments)
},
handleHitOver: function(t) {
var e = Ct(t, this.origHit);
this.hit = t, this.trigger("hitOver", this.hit, e, this.origHit)
},
handleHitOut: function() {
this.hit && (this.trigger("hitOut", this.hit), this.handleHitDone(), this.hit = null)
},
handleHitDone: function() {
this.hit && this.trigger("hitDone", this.hit)
},
handleInteractionEnd: function() {
fe.prototype.handleInteractionEnd.apply(this, arguments), this.origHit = null, this.hit = null, this.component.hitsNotNeeded()
},
handleScrollEnd: function() {
fe.prototype.handleScrollEnd.apply(this, arguments), this.isDragging && (this.component.releaseHits(), this.component.prepareHits())
},
queryHit: function(t, e) {
return this.coordAdjust && (t += this.coordAdjust.left, e += this.coordAdjust.top), this.component.queryHit(t, e)
}
});
Zt.touchMouseIgnoreWait = 500;
var pe = wt.extend(ce, ue, {
isTouching: !1,
mouseIgnoreDepth: 0,
handleScrollProxy: null,
bind: function() {
var e = this;
this.listenTo(t(document), {
touchstart: this.handleTouchStart,
touchcancel: this.handleTouchCancel,
touchend: this.handleTouchEnd,
mousedown: this.handleMouseDown,
mousemove: this.handleMouseMove,
mouseup: this.handleMouseUp,
click: this.handleClick,
selectstart: this.handleSelectStart,
contextmenu: this.handleContextMenu
}), window.addEventListener("touchmove", this.handleTouchMoveProxy = function(n) {
e.handleTouchMove(t.Event(n))
}, {
passive: !1
}), window.addEventListener("scroll", this.handleScrollProxy = function(n) {
e.handleScroll(t.Event(n))
}, !0)
},
unbind: function() {
this.stopListeningTo(t(document)), window.removeEventListener("touchmove", this.handleTouchMoveProxy), window.removeEventListener("scroll", this.handleScrollProxy, !0)
},
handleTouchStart: function(t) {
this.stopTouch(t, !0), this.isTouching = !0, this.trigger("touchstart", t)
},
handleTouchMove: function(t) {
this.isTouching && this.trigger("touchmove", t)
},
handleTouchCancel: function(t) {
this.isTouching && (this.trigger("touchcancel", t), this.stopTouch(t))
},
handleTouchEnd: function(t) {
this.stopTouch(t)
},
handleMouseDown: function(t) {
this.shouldIgnoreMouse() || this.trigger("mousedown", t)
},
handleMouseMove: function(t) {
this.shouldIgnoreMouse() || this.trigger("mousemove", t)
},
handleMouseUp: function(t) {
this.shouldIgnoreMouse() || this.trigger("mouseup", t)
},
handleClick: function(t) {
this.shouldIgnoreMouse() || this.trigger("click", t)
},
handleSelectStart: function(t) {
this.trigger("selectstart", t)
},
handleContextMenu: function(t) {
this.trigger("contextmenu", t)
},
handleScroll: function(t) {
this.trigger("scroll", t)
},
stopTouch: function(t, e) {
this.isTouching && (this.isTouching = !1, this.trigger("touchend", t), e || this.startTouchMouseIgnore())
},
startTouchMouseIgnore: function() {
var t = this,
e = Zt.touchMouseIgnoreWait;
e && (this.mouseIgnoreDepth++, setTimeout(function() {
t.mouseIgnoreDepth--
}, e))
},
shouldIgnoreMouse: function() {
return this.isTouching || Boolean(this.mouseIgnoreDepth)
}
});
! function() {
var t = null,
e = 0;
pe.get = function() {
return t || (t = new pe, t.bind()), t
}, pe.needed = function() {
pe.get(), e++
}, pe.unneeded = function() {
e--, e || (t.unbind(), t = null)
}
}();
var ve = wt.extend(ce, {
options: null,
sourceEl: null,
el: null,
parentEl: null,
top0: null,
left0: null,
y0: null,
x0: null,
topDelta: null,
leftDelta: null,
isFollowing: !1,
isHidden: !1,
isAnimating: !1,
constructor: function(e, n) {
this.options = n = n || {}, this.sourceEl = e, this.parentEl = n.parentEl ? t(n.parentEl) : e.parent()
},
start: function(e) {
this.isFollowing || (this.isFollowing = !0, this.y0 = E(e), this.x0 = b(e), this.topDelta = 0, this.leftDelta = 0, this.isHidden || this.updatePosition(), D(e) ? this.listenTo(t(document), "touchmove", this.handleMove) : this.listenTo(t(document), "mousemove", this.handleMove))
},
stop: function(e, n) {
function i() {
r.isAnimating = !1, r.removeElement(), r.top0 = r.left0 = null, n && n()
}
var r = this,
s = this.options.revertDuration;
this.isFollowing && !this.isAnimating && (this.isFollowing = !1, this.stopListeningTo(t(document)), e && s && !this.isHidden ? (this.isAnimating = !0, this.el.animate({
top: this.top0,
left: this.left0
}, {
duration: s,
complete: i
})) : i())
},
getEl: function() {
var t = this.el;
return t || (t = this.el = this.sourceEl.clone().addClass(this.options.additionalClass || "").css({
position: "absolute",
visibility: "",
display: this.isHidden ? "none" : "",
margin: 0,
right: "auto",
bottom: "auto",
width: this.sourceEl.width(),
height: this.sourceEl.height(),
opacity: this.options.opacity || "",
zIndex: this.options.zIndex
}), t.addClass("fc-unselectable"), t.appendTo(this.parentEl)), t
},
removeElement: function() {
this.el && (this.el.remove(), this.el = null)
},
updatePosition: function() {
var t, e;
this.getEl(), null === this.top0 && (t = this.sourceEl.offset(), e = this.el.offsetParent().offset(), this.top0 = t.top - e.top, this.left0 = t.left - e.left), this.el.css({
top: this.top0 + this.topDelta,
left: this.left0 + this.leftDelta
})
},
handleMove: function(t) {
this.topDelta = E(t) - this.y0, this.leftDelta = b(t) - this.x0, this.isHidden || this.updatePosition()
},
hide: function() {
this.isHidden || (this.isHidden = !0, this.el && this.el.hide())
},
show: function() {
this.isHidden && (this.isHidden = !1, this.updatePosition(), this.getEl().show())
}
}),
me = Zt.Grid = wt.extend(ce, {
hasDayInteractions: !0,
view: null,
isRTL: null,
start: null,
end: null,
el: null,
elsByFill: null,
eventTimeFormat: null,
displayEventTime: null,
displayEventEnd: null,
minResizeDuration: null,
largeUnit: null,
dayClickListener: null,
daySelectListener: null,
segDragListener: null,
segResizeListener: null,
externalDragListener: null,
constructor: function(t) {
this.view = t, this.isRTL = t.opt("isRTL"), this.elsByFill = {}, this.dayClickListener = this.buildDayClickListener(), this.daySelectListener = this.buildDaySelectListener()
},
computeEventTimeFormat: function() {
return this.view.opt("smallTimeFormat")
},
computeDisplayEventTime: function() {
return !0
},
computeDisplayEventEnd: function() {
return !0
},
setRange: function(t) {
this.start = t.start.clone(), this.end = t.end.clone(), this.rangeUpdated(), this.processRangeOptions()
},
rangeUpdated: function() {},
processRangeOptions: function() {
var t, e, n = this.view;
this.eventTimeFormat = n.opt("eventTimeFormat") || n.opt("timeFormat") || this.computeEventTimeFormat(), t = n.opt("displayEventTime"), null == t && (t = this.computeDisplayEventTime()), e = n.opt("displayEventEnd"), null == e && (e = this.computeDisplayEventEnd()), this.displayEventTime = t, this.displayEventEnd = e
},
spanToSegs: function(t) {},
diffDates: function(t, e) {
return this.largeUnit ? G(t, e, this.largeUnit) : z(t, e)
},
hitsNeededDepth: 0,
hitsNeeded: function() {
this.hitsNeededDepth++ || this.prepareHits()
},
hitsNotNeeded: function() {
this.hitsNeededDepth && !--this.hitsNeededDepth && this.releaseHits()
},
prepareHits: function() {},
releaseHits: function() {},
queryHit: function(t, e) {},
getSafeHitSpan: function(t) {
var e = this.getHitSpan(t);
return Q(e, this.view.activeRange) ? e : null
},
getHitSpan: function(t) {},
getHitEl: function(t) {},
setElement: function(t) {
this.el = t, this.hasDayInteractions && (T(t), this.bindDayHandler("touchstart", this.dayTouchStart), this.bindDayHandler("mousedown", this.dayMousedown)), this.bindSegHandlers(), this.bindGlobalHandlers()
},
bindDayHandler: function(e, n) {
var i = this;
this.el.on(e, function(e) {
if (!t(e.target).is(i.segSelector + "," + i.segSelector + " *,.fc-more,a[data-goto]")) return n.call(i, e)
})
},
removeElement: function() {
this.unbindGlobalHandlers(), this.clearDragListeners(), this.el.remove()
},
renderSkeleton: function() {},
renderDates: function() {},
unrenderDates: function() {},
bindGlobalHandlers: function() {
this.listenTo(t(document), {
dragstart: this.externalDragStart,
sortstart: this.externalDragStart
})
},
unbindGlobalHandlers: function() {
this.stopListeningTo(t(document))
},
dayMousedown: function(t) {
var e = this.view;
pe.get().shouldIgnoreMouse() || (this.dayClickListener.startInteraction(t), e.opt("selectable") && this.daySelectListener.startInteraction(t, {
distance: e.opt("selectMinDistance")
}))
},
dayTouchStart: function(t) {
var e, n = this.view;
n.isSelected || n.selectedEvent || (e = n.opt("selectLongPressDelay"), null == e && (e = n.opt("longPressDelay")), this.dayClickListener.startInteraction(t), n.opt("selectable") && this.daySelectListener.startInteraction(t, {
delay: e
}))
},
buildDayClickListener: function() {
var t, e = this,
n = this.view,
i = new ge(this, {
scroll: n.opt("dragScroll"),
interactionStart: function() {
t = i.origHit
},
hitOver: function(e, n, i) {
n || (t = null)
},
hitOut: function() {
t = null
},
interactionEnd: function(i, r) {
var s;
!r && t && (s = e.getSafeHitSpan(t), s && n.triggerDayClick(s, e.getHitEl(t), i))
}
});
return i.shouldCancelTouchScroll = !1, i.scrollAlwaysKills = !0, i
},
buildDaySelectListener: function() {
var t, e = this,
n = this.view,
i = new ge(this, {
scroll: n.opt("dragScroll"),
interactionStart: function() {
t = null
},
dragStart: function() {
n.unselect()
},
hitOver: function(n, i, r) {
var o, l;
r && (o = e.getSafeHitSpan(r), l = e.getSafeHitSpan(n), t = o && l ? e.computeSelection(o, l) : null, t ? e.renderSelection(t) : t === !1 && s())
},
hitOut: function() {
t = null, e.unrenderSelection()
},
hitDone: function() {
o()
},
interactionEnd: function(e, i) {
!i && t && n.reportSelection(t, e)
}
});
return i
},
clearDragListeners: function() {
this.dayClickListener.endInteraction(), this.daySelectListener.endInteraction(), this.segDragListener && this.segDragListener.endInteraction(), this.segResizeListener && this.segResizeListener.endInteraction(), this.externalDragListener && this.externalDragListener.endInteraction()
},
renderEventLocationHelper: function(t, e) {
var n = this.fabricateHelperEvent(t, e);
return this.renderHelper(n, e)
},
fabricateHelperEvent: function(t, e) {
var n = e ? rt(e.event) : {};
return n.start = t.start.clone(), n.end = t.end ? t.end.clone() : null, n.allDay = null, this.view.calendar.normalizeEventDates(n), n.className = (n.className || []).concat("fc-helper"), e || (n.editable = !1), n
},
renderHelper: function(t, e) {},
unrenderHelper: function() {},
renderSelection: function(t) {
this.renderHighlight(t)
},
unrenderSelection: function() {
this.unrenderHighlight()
},
computeSelection: function(t, e) {
var n = this.computeSelectionSpan(t, e);
return !(n && !this.view.calendar.isSelectionSpanAllowed(n)) && n
},
computeSelectionSpan: function(t, e) {
var n = [t.start, t.end, e.start, e.end];
return n.sort(pt), {
start: n[0].clone(),
end: n[3].clone()
}
},
renderHighlight: function(t) {
this.renderFill("highlight", this.spanToSegs(t))
},
unrenderHighlight: function() {
this.unrenderFill("highlight")
},
highlightSegClasses: function() {
return ["fc-highlight"]
},
renderBusinessHours: function() {},
unrenderBusinessHours: function() {},
getNowIndicatorUnit: function() {},
renderNowIndicator: function(t) {},
unrenderNowIndicator: function() {},
renderFill: function(t, e) {},
unrenderFill: function(t) {
var e = this.elsByFill[t];
e && (e.remove(), delete this.elsByFill[t])
},
renderFillSegEls: function(e, n) {
var i, r = this,
s = this[e + "SegEl"],
o = "",
l = [];
if (n.length) {
for (i = 0; i < n.length; i++) o += this.fillSegHtml(e, n[i]);
t(o).each(function(e, i) {
var o = n[e],
a = t(i);
s && (a = s.call(r, o, a)), a && (a = t(a), a.is(r.fillSegTag) && (o.el = a, l.push(o)))
})
}
return l
},
fillSegTag: "div",
fillSegHtml: function(t, e) {
var n = this[t + "SegClasses"],
i = this[t + "SegCss"],
r = n ? n.call(this, e) : [],
s = ht(i ? i.call(this, e) : {});
return "<" + this.fillSegTag + (r.length ? ' class="' + r.join(" ") + '"' : "") + (s ? ' style="' + s + '"' : "") + " />"
},
getDayClasses: function(t, e) {
var n, i = this.view,
r = [];
return Z(t, i.activeRange) ? (r.push("fc-" + Kt[t.day()]), 1 == i.currentRangeAs("months") && t.month() != i.currentRange.start.month() && r.push("fc-other-month"), n = i.calendar.getNow(), t.isSame(n, "day") ? (r.push("fc-today"), e !== !0 && r.push(i.highlightStateClass)) : t < n ? r.push("fc-past") : r.push("fc-future")) : r.push("fc-disabled-day"), r
}
});
me.mixin({
segSelector: ".fc-event-container > *",
mousedOverSeg: null,
isDraggingSeg: !1,
isResizingSeg: !1,
isDraggingExternal: !1,
segs: null,
renderEvents: function(t) {
var e, n = [],
i = [];
for (e = 0; e < t.length; e++)(xt(t[e]) ? n : i).push(t[e]);
this.segs = [].concat(this.renderBgEvents(n), this.renderFgEvents(i))
},
renderBgEvents: function(t) {
var e = this.eventsToSegs(t);
return this.renderBgSegs(e) || e
},
renderFgEvents: function(t) {
var e = this.eventsToSegs(t);
return this.renderFgSegs(e) || e
},
unrenderEvents: function() {
this.handleSegMouseout(), this.clearDragListeners(), this.unrenderFgSegs(), this.unrenderBgSegs(), this.segs = null
},
getEventSegs: function() {
return this.segs || []
},
renderFgSegs: function(t) {},
unrenderFgSegs: function() {},
renderFgSegEls: function(e, n) {
var i, r = this.view,
s = "",
o = [];
if (e.length) {
for (i = 0; i < e.length; i++) s += this.fgSegHtml(e[i], n);
t(s).each(function(n, i) {
var s = e[n],
l = r.resolveEventEl(s.event, t(i));
l && (l.data("fc-seg", s), s.el = l, o.push(s))
})
}
return o
},
fgSegHtml: function(t, e) {},
renderBgSegs: function(t) {
return this.renderFill("bgEvent", t)
},
unrenderBgSegs: function() {
this.unrenderFill("bgEvent")
},
bgEventSegEl: function(t, e) {
return this.view.resolveEventEl(t.event, e)
},
bgEventSegClasses: function(t) {
var e = t.event,
n = e.source || {};
return ["fc-bgevent"].concat(e.className, n.className || [])
},
bgEventSegCss: function(t) {
return {
"background-color": this.getSegSkinCss(t)["background-color"]
}
},
businessHoursSegClasses: function(t) {
return ["fc-nonbusiness", "fc-bgevent"]
},
buildBusinessHourSegs: function(t, e) {
return this.eventsToSegs(this.buildBusinessHourEvents(t, e))
},
buildBusinessHourEvents: function(e, n) {
var i, r = this.view.calendar;
return null == n && (n = r.options.businessHours), i = r.computeBusinessHourEvents(e, n), !i.length && n && (i = [t.extend({}, ke, {
start: this.view.activeRange.end,
end: this.view.activeRange.end,
dow: null
})]), i
},
bindSegHandlers: function() {
this.bindSegHandlersToEl(this.el)
},
bindSegHandlersToEl: function(t) {
this.bindSegHandlerToEl(t, "touchstart", this.handleSegTouchStart), this.bindSegHandlerToEl(t, "mouseenter", this.handleSegMouseover), this.bindSegHandlerToEl(t, "mouseleave", this.handleSegMouseout), this.bindSegHandlerToEl(t, "mousedown", this.handleSegMousedown), this.bindSegHandlerToEl(t, "click", this.handleSegClick)
},
bindSegHandlerToEl: function(e, n, i) {
var r = this;
e.on(n, this.segSelector, function(e) {
var n = t(this).data("fc-seg");
if (n && !r.isDraggingSeg && !r.isResizingSeg) return i.call(r, n, e)
})
},
handleSegClick: function(t, e) {
var n = this.view.publiclyTrigger("eventClick", t.el[0], t.event, e);
n === !1 && e.preventDefault()
},
handleSegMouseover: function(t, e) {
pe.get().shouldIgnoreMouse() || this.mousedOverSeg || (this.mousedOverSeg = t, this.view.isEventResizable(t.event) && t.el.addClass("fc-allow-mouse-resize"), this.view.publiclyTrigger("eventMouseover", t.el[0], t.event, e))
},
handleSegMouseout: function(t, e) {
e = e || {}, this.mousedOverSeg && (t = t || this.mousedOverSeg, this.mousedOverSeg = null, this.view.isEventResizable(t.event) && t.el.removeClass("fc-allow-mouse-resize"), this.view.publiclyTrigger("eventMouseout", t.el[0], t.event, e))
},
handleSegMousedown: function(t, e) {
var n = this.startSegResize(t, e, {
distance: 5
});
!n && this.view.isEventDraggable(t.event) && this.buildSegDragListener(t).startInteraction(e, {
distance: 5
})
},
handleSegTouchStart: function(t, e) {
var n, i, r = this.view,
s = t.event,
o = r.isEventSelected(s),
l = r.isEventDraggable(s),
a = r.isEventResizable(s),
u = !1;
o && a && (u = this.startSegResize(t, e)), u || !l && !a || (i = r.opt("eventLongPressDelay"), null == i && (i = r.opt("longPressDelay")), n = l ? this.buildSegDragListener(t) : this.buildSegSelectListener(t), n.startInteraction(e, {
delay: o ? 0 : i
}))
},
startSegResize: function(e, n, i) {
return !!t(n.target).is(".fc-resizer") && (this.buildSegResizeListener(e, t(n.target).is(".fc-start-resizer")).startInteraction(n, i), !0)
},
buildSegDragListener: function(t) {
var e, n, i, r = this,
l = this.view,
a = t.el,
u = t.event;
if (this.segDragListener) return this.segDragListener;
var c = this.segDragListener = new ge(l, {
scroll: l.opt("dragScroll"),
subjectEl: a,
subjectCenter: !0,
interactionStart: function(i) {
t.component = r, e = !1, n = new ve(t.el, {
additionalClass: "fc-dragging",
parentEl: l.el,
opacity: c.isTouch ? null : l.opt("dragOpacity"),
revertDuration: l.opt("dragRevertDuration"),
zIndex: 2
}), n.hide(), n.start(i)
},
dragStart: function(n) {
c.isTouch && !l.isEventSelected(u) && l.selectEvent(u), e = !0, r.handleSegMouseout(t, n), r.segDragStart(t, n), l.hideEvent(u)
},
hitOver: function(e, o, a) {
var d, h, f, g = !0;
t.hit && (a = t.hit), d = a.component.getSafeHitSpan(a), h = e.component.getSafeHitSpan(e), d && h ? (i = r.computeEventDrop(d, h, u), g = i && r.isEventLocationAllowed(i, u)) : g = !1, g || (i = null, s()), i && (f = l.renderDrag(i, t)) ? (f.addClass("fc-dragging"), c.isTouch || r.applyDragOpacity(f), n.hide()) : n.show(), o && (i = null)
},
hitOut: function() {
l.unrenderDrag(), n.show(), i = null
},
hitDone: function() {
o()
},
interactionEnd: function(s) {
delete t.component, n.stop(!i, function() {
e && (l.unrenderDrag(), r.segDragStop(t, s)), i ? l.reportSegDrop(t, i, r.largeUnit, a, s) : l.showEvent(u)
}), r.segDragListener = null
}
});
return c
},
buildSegSelectListener: function(t) {
var e = this,
n = this.view,
i = t.event;
if (this.segDragListener) return this.segDragListener;
var r = this.segDragListener = new fe({
dragStart: function(t) {
r.isTouch && !n.isEventSelected(i) && n.selectEvent(i)
},
interactionEnd: function(t) {
e.segDragListener = null
}
});
return r
},
segDragStart: function(t, e) {
this.isDraggingSeg = !0, this.view.publiclyTrigger("eventDragStart", t.el[0], t.event, e, {})
},
segDragStop: function(t, e) {
this.isDraggingSeg = !1, this.view.publiclyTrigger("eventDragStop", t.el[0], t.event, e, {})
},
computeEventDrop: function(t, e, n) {
var i, r, s = this.view.calendar,
o = t.start,
l = e.start;
return o.hasTime() === l.hasTime() ? (i = this.diffDates(l, o), n.allDay && tt(i) ? (r = {
start: n.start.clone(),
end: s.getEventEnd(n),
allDay: !1
}, s.normalizeEventTimes(r)) : r = Rt(n), r.start.add(i), r.end && r.end.add(i)) : r = {
start: l.clone(),
end: null,
allDay: !l.hasTime()
}, r
},
applyDragOpacity: function(t) {
var e = this.view.opt("dragOpacity");
null != e && t.css("opacity", e)
},
externalDragStart: function(e, n) {
var i, r, s = this.view;
s.opt("droppable") && (i = t((n ? n.item : null) || e.target), r = s.opt("dropAccept"), (t.isFunction(r) ? r.call(i[0], i) : i.is(r)) && (this.isDraggingExternal || this.listenToExternalDrag(i, e, n)))
},
listenToExternalDrag: function(t, e, n) {
var i, r = this,
l = this.view,
a = Bt(t),
u = r.externalDragListener = new ge(this, {
interactionStart: function() {
r.isDraggingExternal = !0
},
hitOver: function(t) {
var e = !0,
n = t.component.getSafeHitSpan(t);
n ? (i = r.computeExternalDrop(n, a), e = i && r.isExternalLocationAllowed(i, a.eventProps)) : e = !1, e || (i = null, s()), i && r.renderDrag(i)
},
hitOut: function() {
i = null
},
hitDone: function() {
o(), r.unrenderDrag()
},
interactionEnd: function(e) {
i && l.reportExternalDrop(a, i, t, e, n), r.isDraggingExternal = !1, r.externalDragListener = null
}
});
u.startDrag(e)
},
computeExternalDrop: function(t, e) {
var n = this.view.calendar,
i = {
start: n.applyTimezone(t.start),
end: null
};
return e.startTime && !i.start.hasTime() && i.start.time(e.startTime), e.duration && (i.end = i.start.clone().add(e.duration)), i
},
renderDrag: function(t, e) {},
unrenderDrag: function() {},
buildSegResizeListener: function(t, e) {
var n, i, r = this,
l = this.view,
a = l.calendar,
u = t.el,
c = t.event,
d = a.getEventEnd(c),
h = this.segResizeListener = new ge(this, {
scroll: l.opt("dragScroll"),
subjectEl: u,
interactionStart: function() {
n = !1
},
dragStart: function(e) {
n = !0, r.handleSegMouseout(t, e), r.segResizeStart(t, e)
},
hitOver: function(n, o, a) {
var u = !0,
h = r.getSafeHitSpan(a),
f = r.getSafeHitSpan(n);
h && f ? (i = e ? r.computeEventStartResize(h, f, c) : r.computeEventEndResize(h, f, c), u = i && r.isEventLocationAllowed(i, c)) : u = !1, u ? i.start.isSame(c.start.clone().stripZone()) && i.end.isSame(d.clone().stripZone()) && (i = null) : (i = null, s()), i && (l.hideEvent(c), r.renderEventResize(i, t))
},
hitOut: function() {
i = null, l.showEvent(c)
},
hitDone: function() {
r.unrenderEventResize(), o()
},
interactionEnd: function(e) {
n && r.segResizeStop(t, e), i ? l.reportSegResize(t, i, r.largeUnit, u, e) : l.showEvent(c), r.segResizeListener = null
}
});
return h
},
segResizeStart: function(t, e) {
this.isResizingSeg = !0, this.view.publiclyTrigger("eventResizeStart", t.el[0], t.event, e, {})
},
segResizeStop: function(t, e) {
this.isResizingSeg = !1, this.view.publiclyTrigger("eventResizeStop", t.el[0], t.event, e, {})
},
computeEventStartResize: function(t, e, n) {
return this.computeEventResize("start", t, e, n)
},
computeEventEndResize: function(t, e, n) {
return this.computeEventResize("end", t, e, n)
},
computeEventResize: function(t, e, n, i) {
var r, s, o = this.view.calendar,
l = this.diffDates(n[t], e[t]);
return r = {
start: i.start.clone(),
end: o.getEventEnd(i),
allDay: i.allDay
}, r.allDay && tt(l) && (r.allDay = !1, o.normalizeEventTimes(r)), r[t].add(l), r.start.isBefore(r.end) || (s = this.minResizeDuration || (i.allDay ? o.defaultAllDayEventDuration : o.defaultTimedEventDuration), "start" == t ? r.start = r.end.clone().subtract(s) : r.end = r.start.clone().add(s)), r
},
renderEventResize: function(t, e) {},
unrenderEventResize: function() {},
getEventTimeText: function(t, e, n) {
return null == e && (e = this.eventTimeFormat), null == n && (n = this.displayEventEnd), this.displayEventTime && t.start.hasTime() ? n && t.end ? this.view.formatRange(t, e) : t.start.format(e) : ""
},
getSegClasses: function(t, e, n) {
var i = this.view,
r = ["fc-event", t.isStart ? "fc-start" : "fc-not-start", t.isEnd ? "fc-end" : "fc-not-end"].concat(this.getSegCustomClasses(t));
return e && r.push("fc-draggable"), n && r.push("fc-resizable"), i.isEventSelected(t.event) && r.push("fc-selected"), r
},
getSegCustomClasses: function(t) {
var e = t.event;
return [].concat(e.className, e.source ? e.source.className : [])
},
getSegSkinCss: function(t) {
return {
"background-color": this.getSegBackgroundColor(t),
"border-color": this.getSegBorderColor(t),
color: this.getSegTextColor(t)
}
},
getSegBackgroundColor: function(t) {
return t.event.backgroundColor || t.event.color || this.getSegDefaultBackgroundColor(t)
},
getSegDefaultBackgroundColor: function(t) {
var e = t.event.source || {};
return e.backgroundColor || e.color || this.view.opt("eventBackgroundColor") || this.view.opt("eventColor")
},
getSegBorderColor: function(t) {
return t.event.borderColor || t.event.color || this.getSegDefaultBorderColor(t)
},
getSegDefaultBorderColor: function(t) {
var e = t.event.source || {};
return e.borderColor || e.color || this.view.opt("eventBorderColor") || this.view.opt("eventColor")
},
getSegTextColor: function(t) {
return t.event.textColor || this.getSegDefaultTextColor(t)
},
getSegDefaultTextColor: function(t) {
var e = t.event.source || {};
return e.textColor || this.view.opt("eventTextColor")
},
isEventLocationAllowed: function(t, e) {
if (this.isEventLocationInRange(t)) {
var n, i = this.view.calendar,
r = this.eventToSpans(t);
if (r.length) {
for (n = 0; n < r.length; n++)
if (!i.isEventSpanAllowed(r[n], e)) return !1;
return !0
}
}
return !1
},
isExternalLocationAllowed: function(t, e) {
if (this.isEventLocationInRange(t)) {
var n, i = this.view.calendar,
r = this.eventToSpans(t);
if (r.length) {
for (n = 0; n < r.length; n++)
if (!i.isExternalSpanAllowed(r[n], t, e)) return !1;
return !0
}
}
return !1
},
isEventLocationInRange: function(t) {
return Q(this.eventToRawRange(t), this.view.validRange)
},
eventToSegs: function(t) {
return this.eventsToSegs([t])
},
eventToSpans: function(t) {
var e = this.eventToRange(t);
return e ? this.eventRangeToSpans(e, t) : []
},
eventsToSegs: function(e, n) {
var i = this,
r = Lt(e),
s = [];
return t.each(r, function(t, e) {
var r, o, l = [],
a = [];
for (o = 0; o < e.length; o++) r = i.eventToRange(e[o]), r && (a.push(r), l.push(e[o]));
if (It(e[0]))
for (a = i.invertRanges(a), o = 0; o < a.length; o++) s.push.apply(s, i.eventRangeToSegs(a[o], e[0], n));
else
for (o = 0; o < a.length; o++) s.push.apply(s, i.eventRangeToSegs(a[o], l[o], n))
}), s
},
eventToRange: function(t) {
return this.refineRawEventRange(this.eventToRawRange(t))
},
refineRawEventRange: function(t) {
var e = this.view,
n = e.calendar,
i = N(t, e.activeRange);
if (i) return n.localizeMoment(i.start), n.localizeMoment(i.end), i
},
eventToRawRange: function(t) {
var e = this.view.calendar,
n = t.start.clone().stripZone(),
i = (t.end ? t.end.clone() : e.getDefaultEventEnd(null != t.allDay ? t.allDay : !t.start.hasTime(), t.start)).stripZone();
return {
start: n,
end: i
}
},
eventRangeToSegs: function(t, e, n) {
var i, r = this.eventRangeToSpans(t, e),
s = [];
for (i = 0; i < r.length; i++) s.push.apply(s, this.eventSpanToSegs(r[i], e, n));
return s
},
eventRangeToSpans: function(e, n) {
return [t.extend({}, e)]
},
eventSpanToSegs: function(t, e, n) {
var i, r, s = n ? n(t) : this.spanToSegs(t);
for (i = 0; i < s.length; i++) r = s[i], t.isStart || (r.isStart = !1), t.isEnd || (r.isEnd = !1), r.event = e, r.eventStartMS = +t.start, r.eventDurationMS = t.end - t.start;
return s
},
invertRanges: function(t) {
var e, n, i = this.view,
r = i.activeRange.start.clone(),
s = i.activeRange.end.clone(),
o = [],
l = r;
for (t.sort(Mt), e = 0; e < t.length; e++) n = t[e], n.start > l && o.push({
start: l,
end: n.start
}), l = n.end;
return l < s && o.push({
start: l,
end: s
}), o
},
sortEventSegs: function(t) {
t.sort(mt(this, "compareEventSegs"))
},
compareEventSegs: function(t, e) {
return t.eventStartMS - e.eventStartMS || e.eventDurationMS - t.eventDurationMS || e.event.allDay - t.event.allDay || M(t.event, e.event, this.view.eventOrderSpecs)
}
}), Zt.pluckEventDateProps = Rt, Zt.isBgEvent = xt, Zt.dataAttrPrefix = "";
var ye = Zt.DayTableMixin = {
breakOnWeeks: !1,
dayDates: null,
dayIndices: null,
daysPerRow: null,
rowCnt: null,
colCnt: null,
colHeadFormat: null,
updateDayTable: function() {
for (var t, e, n, i = this.view, r = this.start.clone(), s = -1, o = [], l = []; r.isBefore(this.end);) i.isHiddenDay(r) ? o.push(s + .5) : (s++, o.push(s), l.push(r.clone())), r.add(1, "days");
if (this.breakOnWeeks) {
for (e = l[0].day(), t = 1; t < l.length && l[t].day() != e; t++);
n = Math.ceil(l.length / t)
} else n = 1, t = l.length;
this.dayDates = l, this.dayIndices = o, this.daysPerRow = t, this.rowCnt = n, this.updateDayTableCols()
},
updateDayTableCols: function() {
this.colCnt = this.computeColCnt(), this.colHeadFormat = this.view.opt("columnFormat") || this.computeColHeadFormat()
},
computeColCnt: function() {
return this.daysPerRow
},
getCellDate: function(t, e) {
return this.dayDates[this.getCellDayIndex(t, e)].clone()
},
getCellRange: function(t, e) {
var n = this.getCellDate(t, e),
i = n.clone().add(1, "days");
return {
start: n,
end: i
}
},
getCellDayIndex: function(t, e) {
return t * this.daysPerRow + this.getColDayIndex(e)
},
getColDayIndex: function(t) {
return this.isRTL ? this.colCnt - 1 - t : t
},
getDateDayIndex: function(t) {
var e = this.dayIndices,
n = t.diff(this.start, "days");
return n < 0 ? e[0] - 1 : n >= e.length ? e[e.length - 1] + 1 : e[n]
},
computeColHeadFormat: function() {
return this.rowCnt > 1 || this.colCnt > 10 ? "ddd" : this.colCnt > 1 ? this.view.opt("dayOfMonthFormat") : "dddd"
},
sliceRangeByRow: function(t) {
var e, n, i, r, s, o = this.daysPerRow,
l = this.view.computeDayRange(t),
a = this.getDateDayIndex(l.start),
u = this.getDateDayIndex(l.end.clone().subtract(1, "days")),
c = [];
for (e = 0; e < this.rowCnt; e++) n = e * o, i = n + o - 1, r = Math.max(a, n), s = Math.min(u, i), r = Math.ceil(r), s = Math.floor(s), r <= s && c.push({
row: e,
firstRowDayIndex: r - n,
lastRowDayIndex: s - n,
isStart: r === a,
isEnd: s === u
});
return c
},
sliceRangeByDay: function(t) {
var e, n, i, r, s, o, l = this.daysPerRow,
a = this.view.computeDayRange(t),
u = this.getDateDayIndex(a.start),
c = this.getDateDayIndex(a.end.clone().subtract(1, "days")),
d = [];
for (e = 0; e < this.rowCnt; e++)
for (n = e * l, i = n + l - 1, r = n; r <= i; r++) s = Math.max(u, r), o = Math.min(c, r), s = Math.ceil(s), o = Math.floor(o), s <= o && d.push({
row: e,
firstRowDayIndex: s - n,
lastRowDayIndex: o - n,
isStart: s === u,
isEnd: o === c
});
return d
},
renderHeadHtml: function() {
var t = this.view;
return '<div class="fc-row ' + t.widgetHeaderClass + '"><table><thead>' + this.renderHeadTrHtml() + "</thead></table></div>"
},
renderHeadIntroHtml: function() {
return this.renderIntroHtml()
},
renderHeadTrHtml: function() {
return "<tr>" + (this.isRTL ? "" : this.renderHeadIntroHtml()) + this.renderHeadDateCellsHtml() + (this.isRTL ? this.renderHeadIntroHtml() : "") + "</tr>"
},
renderHeadDateCellsHtml: function() {
var t, e, n = [];
for (t = 0; t < this.colCnt; t++) e = this.getCellDate(0, t), n.push(this.renderHeadDateCellHtml(e));
return n.join("")
},
renderHeadDateCellHtml: function(t, e, n) {
var i = this.view,
r = Z(t, i.activeRange),
s = ["fc-day-header", i.widgetHeaderClass],
o = ct(t.format(this.colHeadFormat));
return 1 === this.rowCnt ? s = s.concat(this.getDayClasses(t, !0)) : s.push("fc-" + Kt[t.day()]), '<th class="' + s.join(" ") + '"' + (1 === (r && this.rowCnt) ? ' data-date="' + t.format("YYYY-MM-DD") + '"' : "") + (e > 1 ? ' colspan="' + e + '"' : "") + (n ? " " + n : "") + ">" + (r ? i.buildGotoAnchorHtml({
date: t,
forceOff: this.rowCnt > 1 || 1 === this.colCnt
}, o) : o) + "</th>"
},
renderBgTrHtml: function(t) {
return "<tr>" + (this.isRTL ? "" : this.renderBgIntroHtml(t)) + this.renderBgCellsHtml(t) + (this.isRTL ? this.renderBgIntroHtml(t) : "") + "</tr>"
},
renderBgIntroHtml: function(t) {
return this.renderIntroHtml()
},
renderBgCellsHtml: function(t) {
var e, n, i = [];
for (e = 0; e < this.colCnt; e++) n = this.getCellDate(t, e), i.push(this.renderBgCellHtml(n));
return i.join("")
},
renderBgCellHtml: function(t, e) {
var n = this.view,
i = Z(t, n.activeRange),
r = this.getDayClasses(t);
return r.unshift("fc-day", n.widgetContentClass), '<td class="' + r.join(" ") + '"' + (i ? ' data-date="' + t.format("YYYY-MM-DD") + '"' : "") + (e ? " " + e : "") + "></td>"
},
renderIntroHtml: function() {},
bookendCells: function(t) {
var e = this.renderIntroHtml();
e && (this.isRTL ? t.append(e) : t.prepend(e))
}
},
Se = Zt.DayGrid = me.extend(ye, {
numbersVisible: !1,
bottomCoordPadding: 0,
rowEls: null,
cellEls: null,
helperEls: null,
rowCoordCache: null,
colCoordCache: null,
renderDates: function(t) {
var e, n, i = this.view,
r = this.rowCnt,
s = this.colCnt,
o = "";
for (e = 0; e < r; e++) o += this.renderDayRowHtml(e, t);
for (this.el.html(o), this.rowEls = this.el.find(".fc-row"), this.cellEls = this.el.find(".fc-day, .fc-disabled-day"), this.rowCoordCache = new he({
els: this.rowEls,
isVertical: !0
}), this.colCoordCache = new he({
els: this.cellEls.slice(0, this.colCnt),
isHorizontal: !0
}), e = 0; e < r; e++)
for (n = 0; n < s; n++) i.publiclyTrigger("dayRender", null, this.getCellDate(e, n), this.getCellEl(e, n))
},
unrenderDates: function() {
this.removeSegPopover()
},
renderBusinessHours: function() {
var t = this.buildBusinessHourSegs(!0);
this.renderFill("businessHours", t, "bgevent")
},
unrenderBusinessHours: function() {
this.unrenderFill("businessHours")
},
renderDayRowHtml: function(t, e) {
var n = this.view,
i = ["fc-row", "fc-week", n.widgetContentClass];
return e && i.push("fc-rigid"), '<div class="' + i.join(" ") + '"><div class="fc-bg"><table>' + this.renderBgTrHtml(t) + '</table></div><div class="fc-content-skeleton"><table>' + (this.numbersVisible ? "<thead>" + this.renderNumberTrHtml(t) + "</thead>" : "") + "</table></div></div>"
},
renderNumberTrHtml: function(t) {
return "<tr>" + (this.isRTL ? "" : this.renderNumberIntroHtml(t)) + this.renderNumberCellsHtml(t) + (this.isRTL ? this.renderNumberIntroHtml(t) : "") + "</tr>"
},
renderNumberIntroHtml: function(t) {
return this.renderIntroHtml()
},
renderNumberCellsHtml: function(t) {
var e, n, i = [];
for (e = 0; e < this.colCnt; e++) n = this.getCellDate(t, e), i.push(this.renderNumberCellHtml(n));
return i.join("")
},
renderNumberCellHtml: function(t) {
var e, n, i = this.view,
r = "",
s = Z(t, i.activeRange),
o = i.dayNumbersVisible && s;
return o || i.cellWeekNumbersVisible ? (e = this.getDayClasses(t), e.unshift("fc-day-top"), i.cellWeekNumbersVisible && (n = "ISO" === t._locale._fullCalendar_weekCalc ? 1 : t._locale.firstDayOfWeek()), r += '<td class="' + e.join(" ") + '"' + (s ? ' data-date="' + t.format() + '"' : "") + ">", i.cellWeekNumbersVisible && t.day() == n && (r += i.buildGotoAnchorHtml({
date: t,
type: "week"
}, {
class: "fc-week-number"
}, t.format("w"))), o && (r += i.buildGotoAnchorHtml(t, {
class: "fc-day-number"
}, t.date())), r += "</td>") : "<td/>"
},
computeEventTimeFormat: function() {
return this.view.opt("extraSmallTimeFormat")
},
computeDisplayEventEnd: function() {
return 1 == this.colCnt
},
rangeUpdated: function() {
this.updateDayTable()
},
spanToSegs: function(t) {
var e, n, i = this.sliceRangeByRow(t);
for (e = 0; e < i.length; e++) n = i[e], this.isRTL ? (n.leftCol = this.daysPerRow - 1 - n.lastRowDayIndex, n.rightCol = this.daysPerRow - 1 - n.firstRowDayIndex) : (n.leftCol = n.firstRowDayIndex, n.rightCol = n.lastRowDayIndex);
return i
},
prepareHits: function() {
this.colCoordCache.build(), this.rowCoordCache.build(), this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding
},
releaseHits: function() {
this.colCoordCache.clear(), this.rowCoordCache.clear()
},
queryHit: function(t, e) {
if (this.colCoordCache.isLeftInBounds(t) && this.rowCoordCache.isTopInBounds(e)) {
var n = this.colCoordCache.getHorizontalIndex(t),
i = this.rowCoordCache.getVerticalIndex(e);
if (null != i && null != n) return this.getCellHit(i, n)
}
},
getHitSpan: function(t) {
return this.getCellRange(t.row, t.col)
},
getHitEl: function(t) {
return this.getCellEl(t.row, t.col)
},
getCellHit: function(t, e) {
return {
row: t,
col: e,
component: this,
left: this.colCoordCache.getLeftOffset(e),
right: this.colCoordCache.getRightOffset(e),
top: this.rowCoordCache.getTopOffset(t),
bottom: this.rowCoordCache.getBottomOffset(t)
}
},
getCellEl: function(t, e) {
return this.cellEls.eq(t * this.colCnt + e)
},
renderDrag: function(t, e) {
var n, i = this.eventToSpans(t);
for (n = 0; n < i.length; n++) this.renderHighlight(i[n]);
if (e && e.component !== this) return this.renderEventLocationHelper(t, e)
},
unrenderDrag: function() {
this.unrenderHighlight(), this.unrenderHelper()
},
renderEventResize: function(t, e) {
var n, i = this.eventToSpans(t);
for (n = 0; n < i.length; n++) this.renderHighlight(i[n]);
return this.renderEventLocationHelper(t, e)
},
unrenderEventResize: function() {
this.unrenderHighlight(), this.unrenderHelper()
},
renderHelper: function(e, n) {
var i, r = [],
s = this.eventToSegs(e);
return s = this.renderFgSegEls(s), i = this.renderSegRows(s), this.rowEls.each(function(e, s) {
var o, l = t(s),
a = t('<div class="fc-helper-skeleton"><table/></div>');
o = n && n.row === e ? n.el.position().top : l.find(".fc-content-skeleton tbody").position().top, a.css("top", o).find("table").append(i[e].tbodyEl), l.append(a), r.push(a[0])
}), this.helperEls = t(r)
},
unrenderHelper: function() {
this.helperEls && (this.helperEls.remove(), this.helperEls = null)
},
fillSegTag: "td",
renderFill: function(e, n, i) {
var r, s, o, l = [];
for (n = this.renderFillSegEls(e, n), r = 0; r < n.length; r++) s = n[r], o = this.renderFillRow(e, s, i), this.rowEls.eq(s.row).append(o), l.push(o[0]);
return this.elsByFill[e] = t(l), n
},
renderFillRow: function(e, n, i) {
var r, s, o = this.colCnt,
l = n.leftCol,
a = n.rightCol + 1;
return i = i || e.toLowerCase(), r = t('<div class="fc-' + i + '-skeleton"><table><tr/></table></div>'), s = r.find("tr"), l > 0 && s.append('<td colspan="' + l + '"/>'), s.append(n.el.attr("colspan", a - l)), a < o && s.append('<td colspan="' + (o - a) + '"/>'), this.bookendCells(s), r
}
});
Se.mixin({
rowStructs: null,
unrenderEvents: function() {
this.removeSegPopover(), me.prototype.unrenderEvents.apply(this, arguments)
},
getEventSegs: function() {
return me.prototype.getEventSegs.call(this).concat(this.popoverSegs || [])
},
renderBgSegs: function(e) {
var n = t.grep(e, function(t) {
return t.event.allDay
});
return me.prototype.renderBgSegs.call(this, n)
},
renderFgSegs: function(e) {
var n;
return e = this.renderFgSegEls(e), n = this.rowStructs = this.renderSegRows(e), this.rowEls.each(function(e, i) {
t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)
}), e
},
unrenderFgSegs: function() {
for (var t, e = this.rowStructs || []; t = e.pop();) t.tbodyEl.remove();
this.rowStructs = null
},
renderSegRows: function(t) {
var e, n, i = [];
for (e = this.groupSegRows(t), n = 0; n < e.length; n++) i.push(this.renderSegRow(n, e[n]));
return i
},
fgSegHtml: function(t, e) {
var n, i, r = this.view,
s = t.event,
o = r.isEventDraggable(s),
l = !e && s.allDay && t.isStart && r.isEventResizableFromStart(s),
a = !e && s.allDay && t.isEnd && r.isEventResizableFromEnd(s),
u = this.getSegClasses(t, o, l || a),
c = ht(this.getSegSkinCss(t)),
d = "";
return u.unshift("fc-day-grid-event", "fc-h-event"), t.isStart && (n = this.getEventTimeText(s), n && (d = '<span class="fc-time">' + ct(n) + "</span>")), i = '<span class="fc-title">' + (ct(s.title || "") || "&nbsp;") + "</span>", '<a class="' + u.join(" ") + '"' + (s.url ? ' href="' + ct(s.url) + '"' : "") + (c ? ' style="' + c + '"' : "") + '><div class="fc-content">' + (this.isRTL ? i + " " + d : d + " " + i) + "</div>" + (l ? '<div class="fc-resizer fc-start-resizer" />' : "") + (a ? '<div class="fc-resizer fc-end-resizer" />' : "") + "</a>"
},
renderSegRow: function(e, n) {
function i(e) {
for (; o < e;) c = (m[r - 1] || [])[o], c ? c.attr("rowspan", parseInt(c.attr("rowspan") || 1, 10) + 1) : (c = t("<td/>"), l.append(c)), v[r][o] = c, m[r][o] = c, o++
}
var r, s, o, l, a, u, c, d = this.colCnt,
h = this.buildSegLevels(n),
f = Math.max(1, h.length),
g = t("<tbody/>"),
p = [],
v = [],
m = [];
for (r = 0; r < f; r++) {
if (s = h[r], o = 0, l = t("<tr/>"), p.push([]), v.push([]), m.push([]), s)
for (a = 0; a < s.length; a++) {
for (u = s[a], i(u.leftCol), c = t('<td class="fc-event-container"/>').append(u.el), u.leftCol != u.rightCol ? c.attr("colspan", u.rightCol - u.leftCol + 1) : m[r][o] = c; o <= u.rightCol;) v[r][o] = c, p[r][o] = u, o++;
l.append(c)
}
i(d), this.bookendCells(l), g.append(l)
}
return {
row: e,
tbodyEl: g,
cellMatrix: v,
segMatrix: p,
segLevels: h,
segs: n
}
},
buildSegLevels: function(t) {
var e, n, i, r = [];
for (this.sortEventSegs(t), e = 0; e < t.length; e++) {
for (n = t[e], i = 0; i < r.length && Ft(n, r[i]); i++);
n.level = i, (r[i] || (r[i] = [])).push(n)
}
for (i = 0; i < r.length; i++) r[i].sort(Nt);
return r
},
groupSegRows: function(t) {
var e, n = [];
for (e = 0; e < this.rowCnt; e++) n.push([]);
for (e = 0; e < t.length; e++) n[t[e].row].push(t[e]);
return n
}
}), Se.mixin({
segPopover: null,
popoverSegs: null,
removeSegPopover: function() {
this.segPopover && this.segPopover.hide()
},
limitRows: function(t) {
var e, n, i = this.rowStructs || [];
for (e = 0; e < i.length; e++) this.unlimitRow(e), n = !!t && ("number" == typeof t ? t : this.computeRowLevelLimit(e)), n !== !1 && this.limitRow(e, n)
},
computeRowLevelLimit: function(e) {
function n(e, n) {
s = Math.max(s, t(n).outerHeight())
}
var i, r, s, o = this.rowEls.eq(e),
l = o.height(),
a = this.rowStructs[e].tbodyEl.children();
for (i = 0; i < a.length; i++)
if (r = a.eq(i).removeClass("fc-limited"), s = 0, r.find("> td > :first-child").each(n), r.position().top + s > l) return i;
return !1
},
limitRow: function(e, n) {
function i(i) {
for (; E < i;) u = S.getCellSegs(e, E, n), u.length && (h = s[n - 1][E], y = S.renderMoreLink(e, E, u), m = t("<div/>").append(y), h.append(m), b.push(m[0])), E++
}
var r, s, o, l, a, u, c, d, h, f, g, p, v, m, y, S = this,
w = this.rowStructs[e],
b = [],
E = 0;
if (n && n < w.segLevels.length) {
for (r = w.segLevels[n - 1], s = w.cellMatrix, o = w.tbodyEl.children().slice(n).addClass("fc-limited").get(), l = 0; l < r.length; l++) {
for (a = r[l], i(a.leftCol), d = [], c = 0; E <= a.rightCol;) u = this.getCellSegs(e, E, n), d.push(u), c += u.length, E++;
if (c) {
for (h = s[n - 1][a.leftCol], f = h.attr("rowspan") || 1, g = [], p = 0; p < d.length; p++) v = t('<td class="fc-more-cell"/>').attr("rowspan", f), u = d[p], y = this.renderMoreLink(e, a.leftCol + p, [a].concat(u)), m = t("<div/>").append(y), v.append(m), g.push(v[0]), b.push(v[0]);
h.addClass("fc-limited").after(t(g)), o.push(h[0])
}
}
i(this.colCnt), w.moreEls = t(b), w.limitedEls = t(o)
}
},
unlimitRow: function(t) {
var e = this.rowStructs[t];
e.moreEls && (e.moreEls.remove(), e.moreEls = null), e.limitedEls && (e.limitedEls.removeClass("fc-limited"), e.limitedEls = null)
},
renderMoreLink: function(e, n, i) {
var r = this,
s = this.view;
return t('<a class="fc-more"/>').text(this.getMoreLinkText(i.length)).on("click", function(o) {
var l = s.opt("eventLimitClick"),
a = r.getCellDate(e, n),
u = t(this),
c = r.getCellEl(e, n),
d = r.getCellSegs(e, n),
h = r.resliceDaySegs(d, a),
f = r.resliceDaySegs(i, a);
"function" == typeof l && (l = s.publiclyTrigger("eventLimitClick", null, {
date: a,
dayEl: c,
moreEl: u,
segs: h,
hiddenSegs: f
}, o)), "popover" === l ? r.showSegPopover(e, n, u, h) : "string" == typeof l && s.calendar.zoomTo(a, l)
})
},
showSegPopover: function(t, e, n, i) {
var r, s, o = this,
l = this.view,
a = n.parent();
r = 1 == this.rowCnt ? l.el : this.rowEls.eq(t), s = {
className: "fc-more-popover",
content: this.renderSegPopoverContent(t, e, i),
parentEl: this.view.el,
top: r.offset().top,
autoHide: !0,
viewportConstrain: l.opt("popoverViewportConstrain"),
hide: function() {
if (o.popoverSegs)
for (var t, e = 0; e < o.popoverSegs.length; ++e) t = o.popoverSegs[e], l.publiclyTrigger("eventDestroy", t.event, t.event, t.el);
o.segPopover.removeElement(), o.segPopover = null, o.popoverSegs = null
}
}, this.isRTL ? s.right = a.offset().left + a.outerWidth() + 1 : s.left = a.offset().left - 1, this.segPopover = new de(s), this.segPopover.show(), this.bindSegHandlersToEl(this.segPopover.el)
},
renderSegPopoverContent: function(e, n, i) {
var r, s = this.view,
o = s.opt("theme"),
l = this.getCellDate(e, n).format(s.opt("dayPopoverFormat")),
a = t('<div class="fc-header ' + s.widgetHeaderClass + '"><span class="fc-close ' + (o ? "ui-icon ui-icon-closethick" : "fc-icon fc-icon-x") + '"></span><span class="fc-title">' + ct(l) + '</span><div class="fc-clear"/></div><div class="fc-body ' + s.widgetContentClass + '"><div class="fc-event-container"></div></div>'),
u = a.find(".fc-event-container");
for (i = this.renderFgSegEls(i, !0), this.popoverSegs = i, r = 0; r < i.length; r++) this.hitsNeeded(), i[r].hit = this.getCellHit(e, n), this.hitsNotNeeded(), u.append(i[r].el);
return a
},
resliceDaySegs: function(e, n) {
var i = t.map(e, function(t) {
return t.event
}),
r = n.clone(),
s = r.clone().add(1, "days"),
o = {
start: r,
end: s
};
return e = this.eventsToSegs(i, function(t) {
var e = N(t, o);
return e ? [e] : []
}), this.sortEventSegs(e), e
},
getMoreLinkText: function(t) {
var e = this.view.opt("eventLimitText");
return "function" == typeof e ? e(t) : "+" + t + " " + e
},
getCellSegs: function(t, e, n) {
for (var i, r = this.rowStructs[t].segMatrix, s = n || 0, o = []; s < r.length;) i = r[s][e], i && o.push(i), s++;
return o
}
});
var we = Zt.TimeGrid = me.extend(ye, {
slotDuration: null,
snapDuration: null,
snapsPerSlot: null,
labelFormat: null,
labelInterval: null,
colEls: null,
slatContainerEl: null,
slatEls: null,
nowIndicatorEls: null,
colCoordCache: null,
slatCoordCache: null,
constructor: function() {
me.apply(this, arguments), this.processOptions()
},
renderDates: function() {
this.el.html(this.renderHtml()), this.colEls = this.el.find(".fc-day, .fc-disabled-day"), this.slatContainerEl = this.el.find(".fc-slats"), this.slatEls = this.slatContainerEl.find("tr"), this.colCoordCache = new he({
els: this.colEls,
isHorizontal: !0
}), this.slatCoordCache = new he({
els: this.slatEls,
isVertical: !0
}), this.renderContentSkeleton()
},
renderHtml: function() {
return '<div class="fc-bg"><table>' + this.renderBgTrHtml(0) + '</table></div><div class="fc-slats"><table>' + this.renderSlatRowHtml() + "</table></div>"
},
renderSlatRowHtml: function() {
for (var t, n, i, r = this.view, s = this.isRTL, o = "", l = e.duration(+this.view.minTime); l < this.view.maxTime;) t = this.start.clone().time(l), n = vt(Y(l, this.labelInterval)), i = '<td class="fc-axis fc-time ' + r.widgetContentClass + '" ' + r.axisStyleAttr() + ">" + (n ? "<span>" + ct(t.format(this.labelFormat)) + "</span>" : "") + "</td>", o += '<tr data-time="' + t.format("HH:mm:ss") + '"' + (n ? "" : ' class="fc-minor"') + ">" + (s ? "" : i) + '<td class="' + r.widgetContentClass + '"/>' + (s ? i : "") + "</tr>", l.add(this.slotDuration);
return o
},
processOptions: function() {
var n, i = this.view,
r = i.opt("slotDuration"),
s = i.opt("snapDuration");
r = e.duration(r), s = s ? e.duration(s) : r, this.slotDuration = r, this.snapDuration = s, this.snapsPerSlot = r / s, this.minResizeDuration = s, n = i.opt("slotLabelFormat"), t.isArray(n) && (n = n[n.length - 1]), this.labelFormat = n || i.opt("smallTimeFormat"), n = i.opt("slotLabelInterval"), this.labelInterval = n ? e.duration(n) : this.computeLabelInterval(r)
},
computeLabelInterval: function(t) {
var n, i, r;
for (n = Ge.length - 1; n >= 0; n--)
if (i = e.duration(Ge[n]), r = Y(i, t), vt(r) && r > 1) return i;
return e.duration(t)
},
computeEventTimeFormat: function() {
return this.view.opt("noMeridiemTimeFormat")
},
computeDisplayEventEnd: function() {
return !0
},
prepareHits: function() {
this.colCoordCache.build(), this.slatCoordCache.build()
},
releaseHits: function() {
this.colCoordCache.clear()
},
queryHit: function(t, e) {
var n = this.snapsPerSlot,
i = this.colCoordCache,
r = this.slatCoordCache;
if (i.isLeftInBounds(t) && r.isTopInBounds(e)) {
var s = i.getHorizontalIndex(t),
o = r.getVerticalIndex(e);
if (null != s && null != o) {
var l = r.getTopOffset(o),
a = r.getHeight(o),
u = (e - l) / a,
c = Math.floor(u * n),
d = o * n + c,
h = l + c / n * a,
f = l + (c + 1) / n * a;
return {
col: s,
snap: d,
component: this,
left: i.getLeftOffset(s),
right: i.getRightOffset(s),
top: h,
bottom: f
}
}
}
},
getHitSpan: function(t) {
var e, n = this.getCellDate(0, t.col),
i = this.computeSnapTime(t.snap);
return n.time(i), e = n.clone().add(this.snapDuration), {
start: n,
end: e
}
},
getHitEl: function(t) {
return this.colEls.eq(t.col)
},
rangeUpdated: function() {
this.updateDayTable()
},
computeSnapTime: function(t) {
return e.duration(this.view.minTime + this.snapDuration * t)
},
spanToSegs: function(t) {
var e, n = this.sliceRangeByTimes(t);
for (e = 0; e < n.length; e++) this.isRTL ? n[e].col = this.daysPerRow - 1 - n[e].dayIndex : n[e].col = n[e].dayIndex;
return n
},
sliceRangeByTimes: function(t) {
var e, n, i, r, s = [];
for (n = 0; n < this.daysPerRow; n++) i = this.dayDates[n].clone().time(0), r = {
start: i.clone().add(this.view.minTime),
end: i.clone().add(this.view.maxTime)
}, e = N(t, r), e && (e.dayIndex = n, s.push(e));
return s
},
updateSize: function(t) {
this.slatCoordCache.build(), t && this.updateSegVerticals([].concat(this.fgSegs || [], this.bgSegs || [], this.businessSegs || []))
},
getTotalSlatHeight: function() {
return this.slatContainerEl.outerHeight()
},
computeDateTop: function(t, n) {
return this.computeTimeTop(e.duration(t - n.clone().stripTime()))
},
computeTimeTop: function(t) {
var e, n, i = this.slatEls.length,
r = (t - this.view.minTime) / this.slotDuration;
return r = Math.max(0, r), r = Math.min(i, r), e = Math.floor(r), e = Math.min(e, i - 1), n = r - e, this.slatCoordCache.getTopPosition(e) + this.slatCoordCache.getHeight(e) * n
},
renderDrag: function(t, e) {
var n, i;
if (e) return this.renderEventLocationHelper(t, e);
for (n = this.eventToSpans(t), i = 0; i < n.length; i++) this.renderHighlight(n[i])
},
unrenderDrag: function() {
this.unrenderHelper(), this.unrenderHighlight()
},
renderEventResize: function(t, e) {
return this.renderEventLocationHelper(t, e)
},
unrenderEventResize: function() {
this.unrenderHelper()
},
renderHelper: function(t, e) {
return this.renderHelperSegs(this.eventToSegs(t), e)
},
unrenderHelper: function() {
this.unrenderHelperSegs()
},
renderBusinessHours: function() {
this.renderBusinessSegs(this.buildBusinessHourSegs())
},
unrenderBusinessHours: function() {
this.unrenderBusinessSegs()
},
getNowIndicatorUnit: function() {
return "minute"
},
renderNowIndicator: function(e) {
var n, i = this.spanToSegs({
start: e,
end: e
}),
r = this.computeDateTop(e, e),
s = [];
for (n = 0; n < i.length; n++) s.push(t('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top", r).appendTo(this.colContainerEls.eq(i[n].col))[0]);
i.length > 0 && s.push(t('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top", r).appendTo(this.el.find(".fc-content-skeleton"))[0]), this.nowIndicatorEls = t(s)
},
unrenderNowIndicator: function() {
this.nowIndicatorEls && (this.nowIndicatorEls.remove(), this.nowIndicatorEls = null)
},
renderSelection: function(t) {
this.view.opt("selectHelper") ? this.renderEventLocationHelper(t) : this.renderHighlight(t)
},
unrenderSelection: function() {
this.unrenderHelper(), this.unrenderHighlight()
},
renderHighlight: function(t) {
this.renderHighlightSegs(this.spanToSegs(t))
},
unrenderHighlight: function() {
this.unrenderHighlightSegs()
}
});
we.mixin({
colContainerEls: null,
fgContainerEls: null,
bgContainerEls: null,
helperContainerEls: null,
highlightContainerEls: null,
businessContainerEls: null,
fgSegs: null,
bgSegs: null,
helperSegs: null,
highlightSegs: null,
businessSegs: null,
renderContentSkeleton: function() {
var e, n, i = "";
for (e = 0; e < this.colCnt; e++) i += '<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';
n = t('<div class="fc-content-skeleton"><table><tr>' + i + "</tr></table></div>"), this.colContainerEls = n.find(".fc-content-col"), this.helperContainerEls = n.find(".fc-helper-container"), this.fgContainerEls = n.find(".fc-event-container:not(.fc-helper-container)"), this.bgContainerEls = n.find(".fc-bgevent-container"), this.highlightContainerEls = n.find(".fc-highlight-container"), this.businessContainerEls = n.find(".fc-business-container"), this.bookendCells(n.find("tr")), this.el.append(n)
},
renderFgSegs: function(t) {
return t = this.renderFgSegsIntoContainers(t, this.fgContainerEls), this.fgSegs = t, t
},
unrenderFgSegs: function() {
this.unrenderNamedSegs("fgSegs")
},
renderHelperSegs: function(e, n) {
var i, r, s, o = [];
for (e = this.renderFgSegsIntoContainers(e, this.helperContainerEls), i = 0; i < e.length; i++) r = e[i], n && n.col === r.col && (s = n.el, r.el.css({
left: s.css("left"),
right: s.css("right"),
"margin-left": s.css("margin-left"),
"margin-right": s.css("margin-right")
})), o.push(r.el[0]);
return this.helperSegs = e, t(o)
},
unrenderHelperSegs: function() {
this.unrenderNamedSegs("helperSegs")
},
renderBgSegs: function(t) {
return t = this.renderFillSegEls("bgEvent", t), this.updateSegVerticals(t), this.attachSegsByCol(this.groupSegsByCol(t), this.bgContainerEls), this.bgSegs = t, t
},
unrenderBgSegs: function() {
this.unrenderNamedSegs("bgSegs")
},
renderHighlightSegs: function(t) {
t = this.renderFillSegEls("highlight", t), this.updateSegVerticals(t), this.attachSegsByCol(this.groupSegsByCol(t), this.highlightContainerEls), this.highlightSegs = t
},
unrenderHighlightSegs: function() {
this.unrenderNamedSegs("highlightSegs")
},
renderBusinessSegs: function(t) {
t = this.renderFillSegEls("businessHours", t), this.updateSegVerticals(t), this.attachSegsByCol(this.groupSegsByCol(t), this.businessContainerEls), this.businessSegs = t
},
unrenderBusinessSegs: function() {
this.unrenderNamedSegs("businessSegs")
},
groupSegsByCol: function(t) {
var e, n = [];
for (e = 0; e < this.colCnt; e++) n.push([]);
for (e = 0; e < t.length; e++) n[t[e].col].push(t[e]);
return n
},
attachSegsByCol: function(t, e) {
var n, i, r;
for (n = 0; n < this.colCnt; n++)
for (i = t[n], r = 0; r < i.length; r++) e.eq(n).append(i[r].el)
},
unrenderNamedSegs: function(t) {
var e, n = this[t];
if (n) {
for (e = 0; e < n.length; e++) n[e].el.remove();
this[t] = null
}
},
renderFgSegsIntoContainers: function(t, e) {
var n, i;
for (t = this.renderFgSegEls(t), n = this.groupSegsByCol(t), i = 0; i < this.colCnt; i++) this.updateFgSegCoords(n[i]);
return this.attachSegsByCol(n, e), t
},
fgSegHtml: function(t, e) {
var n, i, r, s = this.view,
o = t.event,
l = s.isEventDraggable(o),
a = !e && t.isStart && s.isEventResizableFromStart(o),
u = !e && t.isEnd && s.isEventResizableFromEnd(o),
c = this.getSegClasses(t, l, a || u),
d = ht(this.getSegSkinCss(t));
return c.unshift("fc-time-grid-event", "fc-v-event"), s.isMultiDayEvent(o) ? (t.isStart || t.isEnd) && (n = this.getEventTimeText(t), i = this.getEventTimeText(t, "LT"), r = this.getEventTimeText(t, null, !1)) : (n = this.getEventTimeText(o), i = this.getEventTimeText(o, "LT"), r = this.getEventTimeText(o, null, !1)), '<a class="' + c.join(" ") + '"' + (o.url ? ' href="' + ct(o.url) + '"' : "") + (d ? ' style="' + d + '"' : "") + '><div class="fc-content">' + (n ? '<div class="fc-time" data-start="' + ct(r) + '" data-full="' + ct(i) + '"><span>' + ct(n) + "</span></div>" : "") + (o.title ? '<div class="fc-title">' + ct(o.title) + "</div>" : "") + '</div><div class="fc-bg"/>' + (u ? '<div class="fc-resizer fc-end-resizer" />' : "") + "</a>"
},
updateSegVerticals: function(t) {
this.computeSegVerticals(t), this.assignSegVerticals(t)
},
computeSegVerticals: function(t) {
var e, n, i;
for (e = 0; e < t.length; e++) n = t[e], i = this.dayDates[n.dayIndex], n.top = this.computeDateTop(n.start, i), n.bottom = this.computeDateTop(n.end, i)
},
assignSegVerticals: function(t) {
var e, n;
for (e = 0; e < t.length; e++) n = t[e], n.el.css(this.generateSegVerticalCss(n))
},
generateSegVerticalCss: function(t) {
return {
top: t.top,
bottom: -t.bottom
}
},
updateFgSegCoords: function(t) {
this.computeSegVerticals(t), this.computeFgSegHorizontals(t), this.assignSegVerticals(t), this.assignFgSegHorizontals(t)
},
computeFgSegHorizontals: function(t) {
var e, n, i;
if (this.sortEventSegs(t), e = zt(t), At(e), n = e[0]) {
for (i = 0; i < n.length; i++) Gt(n[i]);
for (i = 0; i < n.length; i++) this.computeFgSegForwardBack(n[i], 0, 0)
}
},
computeFgSegForwardBack: function(t, e, n) {
var i, r = t.forwardSegs;
if (void 0 === t.forwardCoord)
for (r.length ? (this.sortForwardSegs(r), this.computeFgSegForwardBack(r[0], e + 1, n), t.forwardCoord = r[0].backwardCoord) : t.forwardCoord = 1, t.backwardCoord = t.forwardCoord - (t.forwardCoord - n) / (e + 1), i = 0; i < r.length; i++) this.computeFgSegForwardBack(r[i], 0, t.forwardCoord)
},
sortForwardSegs: function(t) {
t.sort(mt(this, "compareForwardSegs"))
},
compareForwardSegs: function(t, e) {
return e.forwardPressure - t.forwardPressure || (t.backwardCoord || 0) - (e.backwardCoord || 0) || this.compareEventSegs(t, e)
},
assignFgSegHorizontals: function(t) {
var e, n;
for (e = 0; e < t.length; e++) n = t[e], n.el.css(this.generateFgSegHorizontalCss(n)), n.bottom - n.top < 30 && n.el.addClass("fc-short")
},
generateFgSegHorizontalCss: function(t) {
var e, n, i = this.view.opt("slotEventOverlap"),
r = t.backwardCoord,
s = t.forwardCoord,
o = this.generateSegVerticalCss(t);
return i && (s = Math.min(1, r + 2 * (s - r))), this.isRTL ? (e = 1 - s, n = r) : (e = r, n = 1 - s), o.zIndex = t.level + 1, o.left = 100 * e + "%", o.right = 100 * n + "%", i && t.forwardPressure && (o[this.isRTL ? "marginLeft" : "marginRight"] = 20), o
}
});
var be = Zt.View = wt.extend(ue, ce, {
type: null,
name: null,
title: null,
calendar: null,
viewSpec: null,
options: null,
el: null,
isDateSet: !1,
isDateRendered: !1,
dateRenderQueue: null,
isEventsBound: !1,
isEventsSet: !1,
isEventsRendered: !1,
eventRenderQueue: null,
isRTL: !1,
isSelected: !1,
selectedEvent: null,
eventOrderSpecs: null,
widgetHeaderClass: null,
widgetContentClass: null,
highlightStateClass: null,
nextDayThreshold: null,
isHiddenDayHash: null,
isNowIndicatorRendered: null,
initialNowDate: null,
initialNowQueriedMs: null,
nowIndicatorTimeoutID: null,
nowIndicatorIntervalID: null,
constructor: function(t, n) {
this.calendar = t, this.viewSpec = n, this.type = n.type, this.options = n.options, this.name = this.type, this.nextDayThreshold = e.duration(this.opt("nextDayThreshold")), this.initThemingProps(), this.initHiddenDays(), this.isRTL = this.opt("isRTL"), this.eventOrderSpecs = L(this.opt("eventOrder")), this.dateRenderQueue = new Tt, this.eventRenderQueue = new Tt(this.opt("eventRenderWait")), this.initialize()
},
initialize: function() {},
opt: function(t) {
return this.options[t]
},
publiclyTrigger: function(t, e) {
var n = this.calendar;
return n.publiclyTrigger.apply(n, [t, e || this].concat(Array.prototype.slice.call(arguments, 2), [this]))
},
rejectOn: function(t, e) {
var n = this;
return new Dt(function(i, r) {
function s() {
n.off(t, r)
}
n.one(t, r), e.then(function(t) {
s(), i(t)
}, function() {
s(), r()
})
})
},
updateTitle: function() {
this.title = this.computeTitle(), this.calendar.setToolbarsTitle(this.title)
},
computeTitle: function() {
var t;
return t = /^(year|month)$/.test(this.currentRangeUnit) ? this.currentRange : this.activeRange, this.formatRange({
start: this.calendar.applyTimezone(t.start),
end: this.calendar.applyTimezone(t.end)
}, this.opt("titleFormat") || this.computeTitleFormat(), this.opt("titleRangeSeparator"))
},
computeTitleFormat: function() {
return "year" == this.currentRangeUnit ? "YYYY" : "month" == this.currentRangeUnit ? this.opt("monthYearFormat") : this.currentRangeAs("days") > 1 ? "ll" : "LL"
},
formatRange: function(t, e, n) {
var i = t.end;
return i.hasTime() || (i = i.clone().subtract(1)), le(t.start, i, e, n, this.opt("isRTL"))
},
getAllDayHtml: function() {
return this.opt("allDayHtml") || ct(this.opt("allDayText"))
},
buildGotoAnchorHtml: function(e, n, i) {
var r, s, o, l;
return t.isPlainObject(e) ? (r = e.date, s = e.type, o = e.forceOff) : r = e, r = Zt.moment(r), l = {
date: r.format("YYYY-MM-DD"),
type: s || "day"
}, "string" == typeof n && (i = n, n = null), n = n ? " " + ft(n) : "", i = i || "", !o && this.opt("navLinks") ? "<a" + n + ' data-goto="' + ct(JSON.stringify(l)) + '">' + i + "</a>" : "<span" + n + ">" + i + "</span>"
},
setElement: function(t) {
this.el = t, this.bindGlobalHandlers(), this.renderSkeleton()
},
removeElement: function() {
this.unsetDate(), this.unrenderSkeleton(), this.unbindGlobalHandlers(), this.el.remove()
},
renderSkeleton: function() {},
unrenderSkeleton: function() {},
setDate: function(t) {
var e = this.isDateSet;
this.isDateSet = !0, this.handleRawDate(t), this.trigger(e ? "dateReset" : "dateSet", t)
},
unsetDate: function() {
this.isDateSet && (this.isDateSet = !1, this.handleDateUnset(), this.trigger("dateUnset"))
},
handleRawDate: function(t) {
var e = this,
n = this.buildDateProfile(t, null, !0);
this.isSameDateProfile(n) ? this.dateRenderQueue.add(function() {
e.isDateRendered || e.handleDate(n)
}) : this.handleDate(n)
},
handleDate: function(t) {
var e = this;
this.unbindEvents(), this.requestDateRender(t).then(function() {
e.bindEvents()
})
},
handleDateUnset: function() {
this.unbindEvents(), this.requestDateUnrender()
},
requestDateRender: function(t) {
var e = this;
return this.dateRenderQueue.add(function() {
return e.executeDateRender(t)
})
},
requestDateUnrender: function() {
var t = this;
return this.dateRenderQueue.add(function() {
return t.executeDateUnrender()
})
},
executeDateRender: function(t) {
var e = this;
return t && e.setDateProfile(t), this.updateTitle(), this.calendar.updateToolbarButtons(), t ? this.captureInitialScroll() : this.captureScroll(), this.freezeHeight(), this.executeDateUnrender().then(function() {
e.render && e.render(), e.renderDates(), e.updateSize(), e.renderBusinessHours(), e.startNowIndicator(), e.thawHeight(), e.releaseScroll(), e.isDateRendered = !0, e.onDateRender(), e.trigger("dateRender")
})
},
executeDateUnrender: function() {
var t = this;
return t.isDateRendered ? this.requestEventsUnrender().then(function() {
t.unselect(), t.stopNowIndicator(), t.triggerUnrender(), t.unrenderBusinessHours(), t.unrenderDates(), t.destroy && t.destroy(), t.isDateRendered = !1, t.trigger("dateUnrender")
}) : Dt.resolve()
},
onDateRender: function() {
this.triggerRender()
},
renderDates: function() {},
unrenderDates: function() {},
triggerRender: function() {
this.publiclyTrigger("viewRender", this, this, this.el)
},
triggerUnrender: function() {
this.publiclyTrigger("viewDestroy", this, this, this.el)
},
bindGlobalHandlers: function() {
this.listenTo(pe.get(), {
touchstart: this.processUnselect,
mousedown: this.handleDocumentMousedown
})
},
unbindGlobalHandlers: function() {
this.stopListeningTo(pe.get())
},
initThemingProps: function() {
var t = this.opt("theme") ? "ui" : "fc";
this.widgetHeaderClass = t + "-widget-header", this.widgetContentClass = t + "-widget-content", this.highlightStateClass = t + "-state-highlight"
},
renderBusinessHours: function() {},
unrenderBusinessHours: function() {},
startNowIndicator: function() {
var t, n, i, r = this;
this.opt("nowIndicator") && (t = this.getNowIndicatorUnit(), t && (n = mt(this, "updateNowIndicator"), this.initialNowDate = this.calendar.getNow(), this.initialNowQueriedMs = +new Date, this.renderNowIndicator(this.initialNowDate), this.isNowIndicatorRendered = !0, i = this.initialNowDate.clone().startOf(t).add(1, t) - this.initialNowDate, this.nowIndicatorTimeoutID = setTimeout(function() {
r.nowIndicatorTimeoutID = null, n(), i = +e.duration(1, t), i = Math.max(100, i), r.nowIndicatorIntervalID = setInterval(n, i)
}, i)))
},
updateNowIndicator: function() {
this.isNowIndicatorRendered && (this.unrenderNowIndicator(), this.renderNowIndicator(this.initialNowDate.clone().add(new Date - this.initialNowQueriedMs)))
},
stopNowIndicator: function() {
this.isNowIndicatorRendered && (this.nowIndicatorTimeoutID && (clearTimeout(this.nowIndicatorTimeoutID), this.nowIndicatorTimeoutID = null), this.nowIndicatorIntervalID && (clearTimeout(this.nowIndicatorIntervalID), this.nowIndicatorIntervalID = null), this.unrenderNowIndicator(), this.isNowIndicatorRendered = !1)
},
getNowIndicatorUnit: function() {},
renderNowIndicator: function(t) {},
unrenderNowIndicator: function() {},
updateSize: function(t) {
t && this.captureScroll(), this.updateHeight(t), this.updateWidth(t), this.updateNowIndicator(), t && this.releaseScroll()
},
updateWidth: function(t) {},
updateHeight: function(t) {
var e = this.calendar;
this.setHeight(e.getSuggestedViewHeight(), e.isHeightAuto())
},
setHeight: function(t, e) {},
capturedScroll: null,
capturedScrollDepth: 0,
captureScroll: function() {
return !this.capturedScrollDepth++ && (this.capturedScroll = this.isDateRendered ? this.queryScroll() : {}, !0)
},
captureInitialScroll: function(e) {
this.captureScroll() && (this.capturedScroll.isInitial = !0, e ? t.extend(this.capturedScroll, e) : this.capturedScroll.isComputed = !0)
},
releaseScroll: function() {
var e = this.capturedScroll,
n = this.discardScroll();
e.isComputed && (n ? t.extend(e, this.computeInitialScroll()) : e = null), e && (e.isInitial ? this.hardSetScroll(e) : this.setScroll(e))
},
discardScroll: function() {
return !--this.capturedScrollDepth && (this.capturedScroll = null, !0)
},
computeInitialScroll: function() {
return {}
},
queryScroll: function() {
return {}
},
hardSetScroll: function(t) {
var e = this,
n = function() {
e.setScroll(t)
};
n(), setTimeout(n, 0)
},
setScroll: function(t) {},
freezeHeight: function() {
this.calendar.freezeContentHeight()
},
thawHeight: function() {
this.calendar.thawContentHeight()
},
bindEvents: function() {
var t = this;
this.isEventsBound || (this.isEventsBound = !0, this.rejectOn("eventsUnbind", this.requestEvents()).then(function(e) {
t.listenTo(t.calendar, "eventsReset", t.setEvents), t.setEvents(e)
}))
},
unbindEvents: function() {
this.isEventsBound && (this.isEventsBound = !1, this.stopListeningTo(this.calendar, "eventsReset"), this.unsetEvents(), this.trigger("eventsUnbind"))
},
setEvents: function(t) {
var e = this.isEventSet;
this.isEventsSet = !0, this.handleEvents(t, e), this.trigger(e ? "eventsReset" : "eventsSet", t)
},
unsetEvents: function() {
this.isEventsSet && (this.isEventsSet = !1, this.handleEventsUnset(), this.trigger("eventsUnset"))
},
whenEventsSet: function() {
var t = this;
return this.isEventsSet ? Dt.resolve(this.getCurrentEvents()) : new Dt(function(e) {
t.one("eventsSet", e)
})
},
handleEvents: function(t, e) {
this.requestEventsRender(t)
},
handleEventsUnset: function() {
this.requestEventsUnrender()
},
requestEventsRender: function(t) {
var e = this;
return this.eventRenderQueue.add(function() {
return e.executeEventsRender(t)
})
},
requestEventsUnrender: function() {
var t = this;
return this.isEventsRendered ? this.eventRenderQueue.addQuickly(function() {
return t.executeEventsUnrender()
}) : Dt.resolve()
},
requestCurrentEventsRender: function() {
return this.isEventsSet ? void this.requestEventsRender(this.getCurrentEvents()) : Dt.reject()
},
executeEventsRender: function(t) {
var e = this;
return this.captureScroll(), this.freezeHeight(), this.executeEventsUnrender().then(function() {
e.renderEvents(t), e.thawHeight(), e.releaseScroll(), e.isEventsRendered = !0, e.onEventsRender(), e.trigger("eventsRender")
})
},
executeEventsUnrender: function() {
return this.isEventsRendered && (this.onBeforeEventsUnrender(), this.captureScroll(), this.freezeHeight(), this.destroyEvents && this.destroyEvents(), this.unrenderEvents(), this.thawHeight(), this.releaseScroll(), this.isEventsRendered = !1, this.trigger("eventsUnrender")), Dt.resolve()
},
onEventsRender: function() {
this.renderedEventSegEach(function(t) {
this.publiclyTrigger("eventAfterRender", t.event, t.event, t.el)
}), this.publiclyTrigger("eventAfterAllRender")
},
onBeforeEventsUnrender: function() {
this.renderedEventSegEach(function(t) {
this.publiclyTrigger("eventDestroy", t.event, t.event, t.el)
})
},
renderEvents: function(t) {},
unrenderEvents: function() {},
requestEvents: function() {
return this.calendar.requestEvents(this.activeRange.start, this.activeRange.end)
},
getCurrentEvents: function() {
return this.calendar.getPrunedEventCache()
},
resolveEventEl: function(e, n) {
var i = this.publiclyTrigger("eventRender", e, e, n);
return i === !1 ? n = null : i && i !== !0 && (n = t(i)), n
},
showEvent: function(t) {
this.renderedEventSegEach(function(t) {
t.el.css("visibility", "")
}, t)
},
hideEvent: function(t) {
this.renderedEventSegEach(function(t) {
t.el.css("visibility", "hidden")
}, t)
},
renderedEventSegEach: function(t, e) {
var n, i = this.getEventSegs();
for (n = 0; n < i.length; n++) e && i[n].event._id !== e._id || i[n].el && t.call(this, i[n])
},
getEventSegs: function() {
return []
},
isEventDraggable: function(t) {
return this.isEventStartEditable(t)
},
isEventStartEditable: function(t) {
return ut(t.startEditable, (t.source || {}).startEditable, this.opt("eventStartEditable"), this.isEventGenerallyEditable(t))
},
isEventGenerallyEditable: function(t) {
return ut(t.editable, (t.source || {}).editable, this.opt("editable"))
},
reportSegDrop: function(t, e, n, i, r) {
var s = this.calendar,
o = s.mutateSeg(t, e, n),
l = function() {
o.undo(), s.reportEventChange()
};
this.triggerEventDrop(t.event, o.dateDelta, l, i, r), s.reportEventChange()
},
triggerEventDrop: function(t, e, n, i, r) {
this.publiclyTrigger("eventDrop", i[0], t, e, n, r, {})
},
reportExternalDrop: function(e, n, i, r, s) {
var o, l, a = e.eventProps;
a && (o = t.extend({}, a, n), l = this.calendar.renderEvent(o, e.stick)[0]), this.triggerExternalDrop(l, n, i, r, s)
},
triggerExternalDrop: function(t, e, n, i, r) {
this.publiclyTrigger("drop", n[0], e.start, i, r), t && this.publiclyTrigger("eventReceive", null, t)
},
renderDrag: function(t, e) {},
unrenderDrag: function() {},
isEventResizableFromStart: function(t) {
return this.opt("eventResizableFromStart") && this.isEventResizable(t)
},
isEventResizableFromEnd: function(t) {
return this.isEventResizable(t)
},
isEventResizable: function(t) {
var e = t.source || {};
return ut(t.durationEditable, e.durationEditable, this.opt("eventDurationEditable"), t.editable, e.editable, this.opt("editable"))
},
reportSegResize: function(t, e, n, i, r) {
var s = this.calendar,
o = s.mutateSeg(t, e, n),
l = function() {
o.undo(), s.reportEventChange()
};
this.triggerEventResize(t.event, o.durationDelta, l, i, r), s.reportEventChange()
},
triggerEventResize: function(t, e, n, i, r) {
this.publiclyTrigger("eventResize", i[0], t, e, n, r, {})
},
select: function(t, e) {
this.unselect(e), this.renderSelection(t), this.reportSelection(t, e)
},
renderSelection: function(t) {},
reportSelection: function(t, e) {
this.isSelected = !0, this.triggerSelect(t, e)
},
triggerSelect: function(t, e) {
this.publiclyTrigger("select", null, this.calendar.applyTimezone(t.start), this.calendar.applyTimezone(t.end), e)
},
unselect: function(t) {
this.isSelected && (this.isSelected = !1, this.destroySelection && this.destroySelection(), this.unrenderSelection(), this.publiclyTrigger("unselect", null, t))
},
unrenderSelection: function() {},
selectEvent: function(t) {
this.selectedEvent && this.selectedEvent === t || (this.unselectEvent(), this.renderedEventSegEach(function(t) {
t.el.addClass("fc-selected")
}, t), this.selectedEvent = t)
},
unselectEvent: function() {
this.selectedEvent && (this.renderedEventSegEach(function(t) {
t.el.removeClass("fc-selected")
}, this.selectedEvent), this.selectedEvent = null)
},
isEventSelected: function(t) {
return this.selectedEvent && this.selectedEvent._id === t._id
},
handleDocumentMousedown: function(t) {
w(t) && this.processUnselect(t)
},
processUnselect: function(t) {
this.processRangeUnselect(t), this.processEventUnselect(t)
},
processRangeUnselect: function(e) {
var n;
this.isSelected && this.opt("unselectAuto") && (n = this.opt("unselectCancel"), n && t(e.target).closest(n).length || this.unselect(e))
},
processEventUnselect: function(e) {
this.selectedEvent && (t(e.target).closest(".fc-selected").length || this.unselectEvent())
},
triggerDayClick: function(t, e, n) {
this.publiclyTrigger("dayClick", e, this.calendar.applyTimezone(t.start), n)
},
computeDayRange: function(t) {
var e, n = t.start.clone().stripTime(),
i = t.end,
r = null;
return i && (r = i.clone().stripTime(), e = +i.time(), e && e >= this.nextDayThreshold && r.add(1, "days")), (!i || r <= n) && (r = n.clone().add(1, "days")), {
start: n,
end: r
}
},
isMultiDayEvent: function(t) {
var e = this.computeDayRange(t);
return e.end.diff(e.start, "days") > 1
}
});
be.mixin({
currentRange: null,
currentRangeUnit: null,
renderRange: null,
activeRange: null,
validRange: null,
dateIncrement: null,
currentDate: null,
minTime: null,
maxTime: null,
usesMinMaxTime: !1,
start: null,
end: null,
intervalStart: null,
intervalEnd: null,
isSameDateProfile: function(t) {
return this.activeRange && X(this.activeRange, t.activeRange)
},
setDateProfile: function(t) {
this.currentRange = t.currentRange, this.currentRangeUnit = t.currentRangeUnit, this.renderRange = t.renderRange, this.activeRange = t.activeRange, this.validRange = t.validRange, this.dateIncrement = t.dateIncrement, this.currentDate = t.date, this.minTime = t.minTime, this.maxTime = t.maxTime, this.start = t.activeRange.start, this.end = t.activeRange.end, this.intervalStart = t.currentRange.start, this.intervalEnd = t.currentRange.end
},
buildPrevDateProfile: function(t) {
var e = t.clone().startOf(this.currentRangeUnit).subtract(this.dateIncrement);
return this.buildDateProfile(e, -1)
},
buildNextDateProfile: function(t) {
var e = t.clone().startOf(this.currentRangeUnit).add(this.dateIncrement);
return this.buildDateProfile(e, 1)
},
buildDateProfile: function(t, n, i) {
var r, s, o, l, a = this.buildValidRange(),
u = null,
c = null;
return i && (t = q(t, a)), r = this.buildCurrentRangeInfo(t, n), s = this.buildRenderRange(r.range, r.unit), o = U(s), this.opt("showNonCurrentDates") || (o = j(o, r.range)), u = e.duration(this.opt("minTime")), c = e.duration(this.opt("maxTime")), this.adjustActiveRange(o, u, c), o = j(o, a), t = q(t, o), l = $(r.range, a), {
validRange: a,
currentRange: r.range,
currentRangeUnit: r.unit,
activeRange: o,
renderRange: s,
minTime: u,
maxTime: c,
isValid: l,
date: t,
dateIncrement: this.buildDateIncrement(r.duration)
}
},
buildValidRange: function() {
return this.getRangeOption("validRange", this.calendar.getNow()) || {}
},
buildCurrentRangeInfo: function(t, e) {
var n, i = null,
r = null,
s = null;
return this.viewSpec.duration ? (i = this.viewSpec.duration, r = this.viewSpec.durationUnit, s = this.buildRangeFromDuration(t, e, i, r)) : (n = this.opt("dayCount")) ? (r = "day", s = this.buildRangeFromDayCount(t, e, n)) : (s = this.buildCustomVisibleRange(t)) ? r = O(s.start, s.end) : (i = this.getFallbackDuration(), r = O(i), s = this.buildRangeFromDuration(t, e, i, r)), this.normalizeCurrentRange(s, r), {
duration: i,
unit: r,
range: s
}
},
getFallbackDuration: function() {
return e.duration({
days: 1
})
},
normalizeCurrentRange: function(t, e) {
/^(year|month|week|day)$/.test(e) ? (t.start.stripTime(), t.end.stripTime()) : (t.start.hasTime() || t.start.time(0), t.end.hasTime() || t.end.time(0))
},
adjustActiveRange: function(t, e, n) {
var i = !1;
this.usesMinMaxTime && (e < 0 && (t.start.time(0).add(e), i = !0), n > 864e5 && (t.end.time(n - 864e5), i = !0), i && (t.start.hasTime() || t.start.time(0), t.end.hasTime() || t.end.time(0)))
},
buildRangeFromDuration: function(t, n, i, r) {
var s, o, l, a = this.opt("dateAlignment"),
u = t.clone();
return i.as("days") <= 1 && this.isHiddenDay(u) && (u = this.skipHiddenDays(u, n), u.startOf("day")), a || (o = this.opt("dateIncrement"), o ? (l = e.duration(o), a = l < i ? V(l, o) : r) : a = r), u.startOf(a), s = u.clone().add(i), {
start: u,
end: s
}
},
buildRangeFromDayCount: function(t, e, n) {
var i, r = this.opt("dateAlignment"),
s = 0,
o = t.clone();
r && o.startOf(r), o.startOf("day"), o = this.skipHiddenDays(o, e), i = o.clone();
do i.add(1, "day"), this.isHiddenDay(i) || s++; while (s < n);
return {
start: o,
end: i
}
},
buildCustomVisibleRange: function(t) {
var e = this.getRangeOption("visibleRange", this.calendar.moment(t));
return !e || e.start && e.end ? e : null
},
buildRenderRange: function(t, e) {
return this.trimHiddenDays(t)
},
buildDateIncrement: function(t) {
var n, i = this.opt("dateIncrement");
return i ? e.duration(i) : (n = this.opt("dateAlignment")) ? e.duration(1, n) : t ? t : e.duration({
days: 1
})
},
trimHiddenDays: function(t) {
return {
start: this.skipHiddenDays(t.start),
end: this.skipHiddenDays(t.end, -1, !0)
}
},
currentRangeAs: function(t) {
var e = this.currentRange;
return e.end.diff(e.start, t, !0)
},
getRangeOption: function(t) {
var e = this.opt(t);
if ("function" == typeof e && (e = e.apply(null, Array.prototype.slice.call(arguments, 1))), e) return this.calendar.parseRange(e)
},
initHiddenDays: function() {
var e, n = this.opt("hiddenDays") || [],
i = [],
r = 0;
for (this.opt("weekends") === !1 && n.push(0, 6), e = 0; e < 7; e++)(i[e] = t.inArray(e, n) !== -1) || r++;
if (!r) throw "invalid hiddenDays";
this.isHiddenDayHash = i
},
isHiddenDay: function(t) {
return e.isMoment(t) && (t = t.day()), this.isHiddenDayHash[t]
},
skipHiddenDays: function(t, e, n) {
var i = t.clone();
for (e = e || 1; this.isHiddenDayHash[(i.day() + (n ? e : 0) + 7) % 7];) i.add(e, "days");
return i
}
});
var Ee = Zt.Scroller = wt.extend({
el: null,
scrollEl: null,
overflowX: null,
overflowY: null,
constructor: function(t) {
t = t || {}, this.overflowX = t.overflowX || t.overflow || "auto", this.overflowY = t.overflowY || t.overflow || "auto"
},
render: function() {
this.el = this.renderEl(), this.applyOverflow()
},
renderEl: function() {
return this.scrollEl = t('<div class="fc-scroller"></div>')
},
clear: function() {
this.setHeight("auto"), this.applyOverflow()
},
destroy: function() {
this.el.remove()
},
applyOverflow: function() {
this.scrollEl.css({
"overflow-x": this.overflowX,
"overflow-y": this.overflowY
})
},
lockOverflow: function(t) {
var e = this.overflowX,
n = this.overflowY;
t = t || this.getScrollbarWidths(), "auto" === e && (e = t.top || t.bottom || this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth ? "scroll" : "hidden"), "auto" === n && (n = t.left || t.right || this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight ? "scroll" : "hidden"), this.scrollEl.css({
"overflow-x": e,
"overflow-y": n
})
},
setHeight: function(t) {
this.scrollEl.height(t)
},
getScrollTop: function() {
return this.scrollEl.scrollTop()
},
setScrollTop: function(t) {
this.scrollEl.scrollTop(t)
},
getClientWidth: function() {
return this.scrollEl[0].clientWidth
},
getClientHeight: function() {
return this.scrollEl[0].clientHeight
},
getScrollbarWidths: function() {
return p(this.scrollEl)
}
});
Pt.prototype.proxyCall = function(t) {
var e = Array.prototype.slice.call(arguments, 1),
n = [];
return this.items.forEach(function(i) {
n.push(i[t].apply(i, e))
}), n
};
var De = Zt.Calendar = wt.extend({
dirDefaults: null,
localeDefaults: null,
overrides: null,
dynamicOverrides: null,
options: null,
viewSpecCache: null,
view: null,
currentDate: null,
header: null,
footer: null,
loadingLevel: 0,
constructor: Yt,
initialize: function() {},
populateOptionsHash: function() {
var t, e, i, r;
t = ut(this.dynamicOverrides.locale, this.overrides.locale), e = Te[t], e || (t = De.defaults.locale, e = Te[t] || {}), i = ut(this.dynamicOverrides.isRTL, this.overrides.isRTL, e.isRTL, De.defaults.isRTL), r = i ? De.rtlDefaults : {}, this.dirDefaults = r, this.localeDefaults = e, this.options = n([De.defaults, r, e, this.overrides, this.dynamicOverrides]), Wt(this.options)
},
getViewSpec: function(t) {
var e = this.viewSpecCache;
return e[t] || (e[t] = this.buildViewSpec(t))
},
getUnitViewSpec: function(e) {
var n, i, r;
if (t.inArray(e, Jt) != -1)
for (n = this.header.getViewsWithButtons(), t.each(Zt.views, function(t) {
n.push(t)
}), i = 0; i < n.length; i++)
if (r = this.getViewSpec(n[i]), r && r.singleUnit == e) return r
},
buildViewSpec: function(t) {
for (var i, r, s, o, l, a = this.overrides.views || {}, u = [], c = [], d = [], h = t; h;) i = $t[h], r = a[h], h = null, "function" == typeof i && (i = {
class: i
}), i && (u.unshift(i), c.unshift(i.defaults || {}), s = s || i.duration, h = h || i.type), r && (d.unshift(r), s = s || r.duration, h = h || r.type);
return i = it(u), i.type = t, !!i.class && (s = s || this.dynamicOverrides.duration || this.overrides.duration, s && (o = e.duration(s), o.valueOf() && (l = V(o, s), i.duration = o, i.durationUnit = l, 1 === o.as(l) && (i.singleUnit = l, d.unshift(a[l] || {})))), i.defaults = n(c), i.overrides = n(d), this.buildViewSpecOptions(i), this.buildViewSpecButtonText(i, t), i)
},
buildViewSpecOptions: function(t) {
t.options = n([De.defaults, t.defaults, this.dirDefaults, this.localeDefaults, this.overrides, t.overrides, this.dynamicOverrides]), Wt(t.options)
},
buildViewSpecButtonText: function(t, e) {
function n(n) {
var i = n.buttonText || {};
return i[e] || (t.buttonTextKey ? i[t.buttonTextKey] : null) || (t.singleUnit ? i[t.singleUnit] : null)
}
t.buttonTextOverride = n(this.dynamicOverrides) || n(this.overrides) || t.overrides.buttonText, t.buttonTextDefault = n(this.localeDefaults) || n(this.dirDefaults) || t.defaults.buttonText || n(De.defaults) || (t.duration ? this.humanizeDuration(t.duration) : null) || e
},
instantiateView: function(t) {
var e = this.getViewSpec(t);
return new e.class(this, e)
},
isValidViewType: function(t) {
return Boolean(this.getViewSpec(t))
},
pushLoading: function() {
this.loadingLevel++ || this.publiclyTrigger("loading", null, !0, this.view)
},
popLoading: function() {
--this.loadingLevel || this.publiclyTrigger("loading", null, !1, this.view)
},
buildSelectSpan: function(t, e) {
var n, i = this.moment(t).stripZone();
return n = e ? this.moment(e).stripZone() : i.hasTime() ? i.clone().add(this.defaultTimedEventDuration) : i.clone().add(this.defaultAllDayEventDuration), {
start: i,
end: n
}
},
initCurrentDate: function() {
null != this.options.defaultDate ? this.currentDate = this.moment(this.options.defaultDate).stripZone() : this.currentDate = this.getNow()
},
changeView: function(t, e) {
e && (e.start && e.end ? this.recordOptionOverrides({
visibleRange: e
}) : this.currentDate = this.moment(e).stripZone()), this.renderView(t)
},
prev: function() {
var t = this.view.buildPrevDateProfile(this.currentDate);
t.isValid && (this.currentDate = t.date, this.renderView())
},
next: function() {
var t = this.view.buildNextDateProfile(this.currentDate);
t.isValid && (this.currentDate = t.date, this.renderView())
},
prevYear: function() {
this.currentDate.add(-1, "years"), this.renderView()
},
nextYear: function() {
this.currentDate.add(1, "years"), this.renderView()
},
today: function() {
this.currentDate = this.getNow(), this.renderView()
},
gotoDate: function(t) {
this.currentDate = this.moment(t).stripZone(), this.renderView()
},
incrementDate: function(t) {
this.currentDate.add(e.duration(t)), this.renderView()
},
getDate: function() {
return this.applyTimezone(this.currentDate)
},
parseRange: function(t) {
var e = null,
n = null;
return t.start && (e = this.moment(t.start).stripZone()), t.end && (n = this.moment(t.end).stripZone()), e || n ? e && n && n.isBefore(e) ? null : {
start: e,
end: n
} : null
}
});
De.mixin(ue), De.mixin({
optionHandlers: null,
bindOption: function(t, e) {
this.bindOptions([t], e)
},
bindOptions: function(t, e) {
var n, i = {
func: e,
names: t
};
for (n = 0; n < t.length; n++) this.registerOptionHandlerObj(t[n], i);
this.triggerOptionHandlerObj(i)
},
registerOptionHandlerObj: function(t, e) {
(this.optionHandlers[t] || (this.optionHandlers[t] = [])).push(e)
},
triggerOptionHandlers: function(t) {
var e, n = this.optionHandlers[t] || [];
for (e = 0; e < n.length; e++) this.triggerOptionHandlerObj(n[e])
},
triggerOptionHandlerObj: function(t) {
var e, n = t.names,
i = [];
for (e = 0; e < n.length; e++) i.push(this.options[n[e]]);
t.func.apply(this, i)
}
}), De.defaults = {
titleRangeSeparator: " – ",
monthYearFormat: "MMMM YYYY",
defaultTimedEventDuration: "02:00:00",
defaultAllDayEventDuration: {
days: 1
},
forceEventDuration: !1,
nextDayThreshold: "09:00:00",
defaultView: "month",
aspectRatio: 1.35,
header: {
left: "title",
center: "",
right: "today prev,next"
},
weekends: !0,
weekNumbers: !1,
weekNumberTitle: "W",
weekNumberCalculation: "local",
scrollTime: "06:00:00",
minTime: "00:00:00",
maxTime: "24:00:00",
showNonCurrentDates: !0,
lazyFetching: !0,
startParam: "start",
endParam: "end",
timezoneParam: "timezone",
timezone: !1,
isRTL: !1,
buttonText: {
prev: "prev",
next: "next",
prevYear: "prev year",
nextYear: "next year",
year: "year",
today: "today",
month: "month",
week: "week",
day: "day"
},
buttonIcons: {
prev: "left-single-arrow",
next: "right-single-arrow",
prevYear: "left-double-arrow",
nextYear: "right-double-arrow"
},
allDayText: "all-day",
theme: !1,
themeButtonIcons: {
prev: "circle-triangle-w",
next: "circle-triangle-e",
prevYear: "seek-prev",
nextYear: "seek-next"
},
dragOpacity: .75,
dragRevertDuration: 500,
dragScroll: !0,
unselectAuto: !0,
dropAccept: "*",
eventOrder: "title",
eventLimit: !1,
eventLimitText: "more",
eventLimitClick: "popover",
dayPopoverFormat: "LL",
handleWindowResize: !0,
windowResizeDelay: 100,
longPressDelay: 1e3
}, De.englishDefaults = {
dayPopoverFormat: "dddd, MMMM D"
}, De.rtlDefaults = {
header: {
left: "next,prev today",
center: "",
right: "title"
},
buttonIcons: {
prev: "right-single-arrow",
next: "left-single-arrow",
prevYear: "right-double-arrow",
nextYear: "left-double-arrow"
},
themeButtonIcons: {
prev: "circle-triangle-e",
next: "circle-triangle-w",
nextYear: "seek-prev",
prevYear: "seek-next"
}
};
var Te = Zt.locales = {};
Zt.datepickerLocale = function(e, n, i) {
var r = Te[e] || (Te[e] = {});
r.isRTL = i.isRTL, r.weekNumberTitle = i.weekHeader, t.each(Ce, function(t, e) {
r[t] = e(i)
}), t.datepicker && (t.datepicker.regional[n] = t.datepicker.regional[e] = i, t.datepicker.regional.en = t.datepicker.regional[""], t.datepicker.setDefaults(i))
}, Zt.locale = function(e, i) {
var r, s;
r = Te[e] || (Te[e] = {}), i && (r = Te[e] = n([r, i])), s = Ut(e), t.each(He, function(t, e) {
null == r[t] && (r[t] = e(s, r))
}), De.defaults.locale = e
};
var Ce = {
buttonText: function(t) {
return {
prev: dt(t.prevText),
next: dt(t.nextText),
today: dt(t.currentText)
}
},
monthYearFormat: function(t) {
return t.showMonthAfterYear ? "YYYY[" + t.yearSuffix + "] MMMM" : "MMMM YYYY[" + t.yearSuffix + "]"
}
},
He = {
dayOfMonthFormat: function(t, e) {
var n = t.longDateFormat("l");
return n = n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g, ""), e.isRTL ? n += " ddd" : n = "ddd " + n, n
},
mediumTimeFormat: function(t) {
return t.longDateFormat("LT").replace(/\s*a$/i, "a")
},
smallTimeFormat: function(t) {
return t.longDateFormat("LT").replace(":mm", "(:mm)").replace(/(\Wmm)$/, "($1)").replace(/\s*a$/i, "a")
},
extraSmallTimeFormat: function(t) {
return t.longDateFormat("LT").replace(":mm", "(:mm)").replace(/(\Wmm)$/, "($1)").replace(/\s*a$/i, "t")
},
hourFormat: function(t) {
return t.longDateFormat("LT").replace(":mm", "").replace(/(\Wmm)$/, "").replace(/\s*a$/i, "a")
},
noMeridiemTimeFormat: function(t) {
return t.longDateFormat("LT").replace(/\s*a$/i, "")
}
},
Re = {
smallDayDateFormat: function(t) {
return t.isRTL ? "D dd" : "dd D"
},
weekFormat: function(t) {
return t.isRTL ? "w[ " + t.weekNumberTitle + "]" : "[" + t.weekNumberTitle + " ]w"
},
smallWeekFormat: function(t) {
return t.isRTL ? "w[" + t.weekNumberTitle + "]" : "[" + t.weekNumberTitle + "]w"
}
};
Zt.locale("en", De.englishDefaults), Zt.sourceNormalizers = [], Zt.sourceFetchers = [];
var xe = {
dataType: "json",
cache: !1
},
Ie = 1;
De.prototype.mutateSeg = function(t, e) {
return this.mutateEvent(t.event, e)
}, De.prototype.normalizeEvent = function(t) {}, De.prototype.spanContainsSpan = function(t, e) {
var n = t.start.clone().stripZone(),
i = this.getEventEnd(t).stripZone();
return e.start >= n && e.end <= i
}, De.prototype.getPeerEvents = function(t, e) {
var n, i, r = this.getEventCache(),
s = [];
for (n = 0; n < r.length; n++) i = r[n], e && e._id === i._id || s.push(i);
return s
}, De.prototype.isEventSpanAllowed = function(t, e) {
var n = e.source || {},
i = ut(e.constraint, n.constraint, this.options.eventConstraint),
r = ut(e.overlap, n.overlap, this.options.eventOverlap);
return this.isSpanAllowed(t, i, r, e) && (!this.options.eventAllow || this.options.eventAllow(t, e) !== !1)
}, De.prototype.isExternalSpanAllowed = function(e, n, i) {
var r, s;
return i && (r = t.extend({}, i, n), s = this.expandEvent(this.buildEventFromInput(r))[0]), s ? this.isEventSpanAllowed(e, s) : this.isSelectionSpanAllowed(e)
}, De.prototype.isSelectionSpanAllowed = function(t) {
return this.isSpanAllowed(t, this.options.selectConstraint, this.options.selectOverlap) && (!this.options.selectAllow || this.options.selectAllow(t) !== !1)
}, De.prototype.isSpanAllowed = function(t, e, n, i) {
var r, s, o, l, a, u;
if (null != e && (r = this.constraintToEvents(e))) {
for (s = !1, l = 0; l < r.length; l++)
if (this.spanContainsSpan(r[l], t)) {
s = !0;
break
}
if (!s) return !1
}
for (o = this.getPeerEvents(t, i), l = 0; l < o.length; l++)
if (a = o[l], this.eventIntersectsRange(a, t)) {
if (n === !1) return !1;
if ("function" == typeof n && !n(a, i)) return !1;
if (i) {
if (u = ut(a.overlap, (a.source || {}).overlap), u === !1) return !1;
if ("function" == typeof u && !u(i, a)) return !1
}
}
return !0
}, De.prototype.constraintToEvents = function(t) {
return "businessHours" === t ? this.getCurrentBusinessHourEvents() : "object" == typeof t ? null != t.start ? this.expandEvent(this.buildEventFromInput(t)) : null : this.clientEvents(t)
}, De.prototype.eventIntersectsRange = function(t, e) {
var n = t.start.clone().stripZone(),
i = this.getEventEnd(t).stripZone();
return e.start < i && e.end > n
};
var ke = {
id: "_fcBusinessHours",
start: "09:00",
end: "17:00",
dow: [1, 2, 3, 4, 5],
rendering: "inverse-background"
};
De.prototype.getCurrentBusinessHourEvents = function(t) {
return this.computeBusinessHourEvents(t, this.options.businessHours)
}, De.prototype.computeBusinessHourEvents = function(e, n) {
return n === !0 ? this.expandBusinessHourEvents(e, [{}]) : t.isPlainObject(n) ? this.expandBusinessHourEvents(e, [n]) : t.isArray(n) ? this.expandBusinessHourEvents(e, n, !0) : []
}, De.prototype.expandBusinessHourEvents = function(e, n, i) {
var r, s, o = this.getView(),
l = [];
for (r = 0; r < n.length; r++) s = n[r], i && !s.dow || (s = t.extend({}, ke, s), e && (s.start = null, s.end = null), l.push.apply(l, this.expandEvent(this.buildEventFromInput(s), o.activeRange.start, o.activeRange.end)));
return l
};
var Le = Zt.BasicView = be.extend({
scroller: null,
dayGridClass: Se,
dayGrid: null,
dayNumbersVisible: !1,
colWeekNumbersVisible: !1,
cellWeekNumbersVisible: !1,
weekNumberWidth: null,
headContainerEl: null,
headRowEl: null,
initialize: function() {
this.dayGrid = this.instantiateDayGrid(), this.scroller = new Ee({
overflowX: "hidden",
overflowY: "auto"
})
},
instantiateDayGrid: function() {
var t = this.dayGridClass.extend(Me);
return new t(this)
},
buildRenderRange: function(t, e) {
var n = be.prototype.buildRenderRange.apply(this, arguments);
return /^(year|month)$/.test(e) && (n.start.startOf("week"), n.end.weekday() && n.end.add(1, "week").startOf("week")), this.trimHiddenDays(n)
},
renderDates: function() {
this.dayGrid.breakOnWeeks = /year|month|week/.test(this.currentRangeUnit), this.dayGrid.setRange(this.renderRange), this.dayNumbersVisible = this.dayGrid.rowCnt > 1, this.opt("weekNumbers") && (this.opt("weekNumbersWithinDays") ? (this.cellWeekNumbersVisible = !0, this.colWeekNumbersVisible = !1) : (this.cellWeekNumbersVisible = !1, this.colWeekNumbersVisible = !0)), this.dayGrid.numbersVisible = this.dayNumbersVisible || this.cellWeekNumbersVisible || this.colWeekNumbersVisible, this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()), this.renderHead(), this.scroller.render();
var e = this.scroller.el.addClass("fc-day-grid-container"),
n = t('<div class="fc-day-grid" />').appendTo(e);
this.el.find(".fc-body > tr > td").append(e), this.dayGrid.setElement(n), this.dayGrid.renderDates(this.hasRigidRows())
},
renderHead: function() {
this.headContainerEl = this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()), this.headRowEl = this.headContainerEl.find(".fc-row")
},
unrenderDates: function() {
this.dayGrid.unrenderDates(), this.dayGrid.removeElement(), this.scroller.destroy()
},
renderBusinessHours: function() {
this.dayGrid.renderBusinessHours()
},
unrenderBusinessHours: function() {
this.dayGrid.unrenderBusinessHours()
},
renderSkeletonHtml: function() {
return '<table><thead class="fc-head"><tr><td class="fc-head-container ' + this.widgetHeaderClass + '"></td></tr></thead><tbody class="fc-body"><tr><td class="' + this.widgetContentClass + '"></td></tr></tbody></table>'
},
weekNumberStyleAttr: function() {
return null !== this.weekNumberWidth ? 'style="width:' + this.weekNumberWidth + 'px"' : ""
},
hasRigidRows: function() {
var t = this.opt("eventLimit");
return t && "number" != typeof t
},
updateWidth: function() {
this.colWeekNumbersVisible && (this.weekNumberWidth = u(this.el.find(".fc-week-number")))
},
setHeight: function(t, e) {
var n, s, o = this.opt("eventLimit");
this.scroller.clear(), r(this.headRowEl), this.dayGrid.removeSegPopover(), o && "number" == typeof o && this.dayGrid.limitRows(o), n = this.computeScrollerHeight(t), this.setGridHeight(n, e), o && "number" != typeof o && this.dayGrid.limitRows(o), e || (this.scroller.setHeight(n), s = this.scroller.getScrollbarWidths(), (s.left || s.right) && (i(this.headRowEl, s), n = this.computeScrollerHeight(t), this.scroller.setHeight(n)), this.scroller.lockOverflow(s))
},
computeScrollerHeight: function(t) {
return t - c(this.el, this.scroller.el)
},
setGridHeight: function(t, e) {
e ? a(this.dayGrid.rowEls) : l(this.dayGrid.rowEls, t, !0)
},
computeInitialScroll: function() {
return {
top: 0
}
},
queryScroll: function() {
return {
top: this.scroller.getScrollTop()
}
},
setScroll: function(t) {
this.scroller.setScrollTop(t.top)
},
hitsNeeded: function() {
this.dayGrid.hitsNeeded()
},
hitsNotNeeded: function() {
this.dayGrid.hitsNotNeeded()
},
prepareHits: function() {
this.dayGrid.prepareHits()
},
releaseHits: function() {
this.dayGrid.releaseHits()
},
queryHit: function(t, e) {
return this.dayGrid.queryHit(t, e)
},
getHitSpan: function(t) {
return this.dayGrid.getHitSpan(t)
},
getHitEl: function(t) {
return this.dayGrid.getHitEl(t)
},
renderEvents: function(t) {
this.dayGrid.renderEvents(t), this.updateHeight()
},
getEventSegs: function() {
return this.dayGrid.getEventSegs()
},
unrenderEvents: function() {
this.dayGrid.unrenderEvents()
},
renderDrag: function(t, e) {
return this.dayGrid.renderDrag(t, e)
},
unrenderDrag: function() {
this.dayGrid.unrenderDrag()
},
renderSelection: function(t) {
this.dayGrid.renderSelection(t)
},
unrenderSelection: function() {
this.dayGrid.unrenderSelection()
}
}),
Me = {
renderHeadIntroHtml: function() {
var t = this.view;
return t.colWeekNumbersVisible ? '<th class="fc-week-number ' + t.widgetHeaderClass + '" ' + t.weekNumberStyleAttr() + "><span>" + ct(t.opt("weekNumberTitle")) + "</span></th>" : ""
},
renderNumberIntroHtml: function(t) {
var e = this.view,
n = this.getCellDate(t, 0);
return e.colWeekNumbersVisible ? '<td class="fc-week-number" ' + e.weekNumberStyleAttr() + ">" + e.buildGotoAnchorHtml({
date: n,
type: "week",
forceOff: 1 === this.colCnt
}, n.format("w")) + "</td>" : ""
},
renderBgIntroHtml: function() {
var t = this.view;
return t.colWeekNumbersVisible ? '<td class="fc-week-number ' + t.widgetContentClass + '" ' + t.weekNumberStyleAttr() + "></td>" : ""
},
renderIntroHtml: function() {
var t = this.view;
return t.colWeekNumbersVisible ? '<td class="fc-week-number" ' + t.weekNumberStyleAttr() + "></td>" : ""
}
},
Be = Zt.MonthView = Le.extend({
buildRenderRange: function() {
var t, e = Le.prototype.buildRenderRange.apply(this, arguments);
return this.isFixedWeeks() && (t = Math.ceil(e.end.diff(e.start, "weeks", !0)), e.end.add(6 - t, "weeks")), e
},
setGridHeight: function(t, e) {
e && (t *= this.rowCnt / 6), l(this.dayGrid.rowEls, t, !e)
},
isFixedWeeks: function() {
return this.opt("fixedWeekCount")
}
});
$t.basic = {
class: Le
}, $t.basicDay = {
type: "basic",
duration: {
days: 1
}
}, $t.basicWeek = {
type: "basic",
duration: {
weeks: 1
}
}, $t.month = {
class: Be,
duration: {
months: 1
},
defaults: {
fixedWeekCount: !0
}
};
var Fe = Zt.AgendaView = be.extend({
scroller: null,
timeGridClass: we,
timeGrid: null,
dayGridClass: Se,
dayGrid: null,
axisWidth: null,
headContainerEl: null,
noScrollRowEls: null,
bottomRuleEl: null,
usesMinMaxTime: !0,
initialize: function() {
this.timeGrid = this.instantiateTimeGrid(), this.opt("allDaySlot") && (this.dayGrid = this.instantiateDayGrid()), this.scroller = new Ee({
overflowX: "hidden",
overflowY: "auto"
})
},
instantiateTimeGrid: function() {
var t = this.timeGridClass.extend(Ne);
return new t(this)
},
instantiateDayGrid: function() {
var t = this.dayGridClass.extend(ze);
return new t(this)
},
renderDates: function() {
this.timeGrid.setRange(this.renderRange), this.dayGrid && this.dayGrid.setRange(this.renderRange), this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()), this.renderHead(), this.scroller.render();
var e = this.scroller.el.addClass("fc-time-grid-container"),
n = t('<div class="fc-time-grid" />').appendTo(e);
this.el.find(".fc-body > tr > td").append(e), this.timeGrid.setElement(n), this.timeGrid.renderDates(), this.bottomRuleEl = t('<hr class="fc-divider ' + this.widgetHeaderClass + '"/>').appendTo(this.timeGrid.el), this.dayGrid && (this.dayGrid.setElement(this.el.find(".fc-day-grid")), this.dayGrid.renderDates(), this.dayGrid.bottomCoordPadding = this.dayGrid.el.next("hr").outerHeight()), this.noScrollRowEls = this.el.find(".fc-row:not(.fc-scroller *)")
},
renderHead: function() {
this.headContainerEl = this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())
},
unrenderDates: function() {
this.timeGrid.unrenderDates(), this.timeGrid.removeElement(), this.dayGrid && (this.dayGrid.unrenderDates(), this.dayGrid.removeElement()), this.scroller.destroy()
},
renderSkeletonHtml: function() {
return '<table><thead class="fc-head"><tr><td class="fc-head-container ' + this.widgetHeaderClass + '"></td></tr></thead><tbody class="fc-body"><tr><td class="' + this.widgetContentClass + '">' + (this.dayGrid ? '<div class="fc-day-grid"/><hr class="fc-divider ' + this.widgetHeaderClass + '"/>' : "") + "</td></tr></tbody></table>"
},
axisStyleAttr: function() {
return null !== this.axisWidth ? 'style="width:' + this.axisWidth + 'px"' : ""
},
renderBusinessHours: function() {
this.timeGrid.renderBusinessHours(), this.dayGrid && this.dayGrid.renderBusinessHours()
},
unrenderBusinessHours: function() {
this.timeGrid.unrenderBusinessHours(), this.dayGrid && this.dayGrid.unrenderBusinessHours()
},
getNowIndicatorUnit: function() {
return this.timeGrid.getNowIndicatorUnit()
},
renderNowIndicator: function(t) {
this.timeGrid.renderNowIndicator(t)
},
unrenderNowIndicator: function() {
this.timeGrid.unrenderNowIndicator()
},
updateSize: function(t) {
this.timeGrid.updateSize(t), be.prototype.updateSize.call(this, t)
},
updateWidth: function() {
this.axisWidth = u(this.el.find(".fc-axis"))
},
setHeight: function(t, e) {
var n, s, o;
this.bottomRuleEl.hide(), this.scroller.clear(), r(this.noScrollRowEls), this.dayGrid && (this.dayGrid.removeSegPopover(), n = this.opt("eventLimit"), n && "number" != typeof n && (n = Ae), n && this.dayGrid.limitRows(n)), e || (s = this.computeScrollerHeight(t), this.scroller.setHeight(s), o = this.scroller.getScrollbarWidths(), (o.left || o.right) && (i(this.noScrollRowEls, o), s = this.computeScrollerHeight(t), this.scroller.setHeight(s)), this.scroller.lockOverflow(o), this.timeGrid.getTotalSlatHeight() < s && this.bottomRuleEl.show())
},
computeScrollerHeight: function(t) {
return t - c(this.el, this.scroller.el)
},
computeInitialScroll: function() {
var t = e.duration(this.opt("scrollTime")),
n = this.timeGrid.computeTimeTop(t);
return n = Math.ceil(n), n && n++, {
top: n
}
},
queryScroll: function() {
return {
top: this.scroller.getScrollTop()
}
},
setScroll: function(t) {
this.scroller.setScrollTop(t.top)
},
hitsNeeded: function() {
this.timeGrid.hitsNeeded(), this.dayGrid && this.dayGrid.hitsNeeded()
},
hitsNotNeeded: function() {
this.timeGrid.hitsNotNeeded(), this.dayGrid && this.dayGrid.hitsNotNeeded()
},
prepareHits: function() {
this.timeGrid.prepareHits(), this.dayGrid && this.dayGrid.prepareHits()
},
releaseHits: function() {
this.timeGrid.releaseHits(), this.dayGrid && this.dayGrid.releaseHits()
},
queryHit: function(t, e) {
var n = this.timeGrid.queryHit(t, e);
return !n && this.dayGrid && (n = this.dayGrid.queryHit(t, e)), n
},
getHitSpan: function(t) {
return t.component.getHitSpan(t)
},
getHitEl: function(t) {
return t.component.getHitEl(t)
},
renderEvents: function(t) {
var e, n, i = [],
r = [],
s = [];
for (n = 0; n < t.length; n++) t[n].allDay ? i.push(t[n]) : r.push(t[n]);
e = this.timeGrid.renderEvents(r), this.dayGrid && (s = this.dayGrid.renderEvents(i)), this.updateHeight()
},
getEventSegs: function() {
return this.timeGrid.getEventSegs().concat(this.dayGrid ? this.dayGrid.getEventSegs() : [])
},
unrenderEvents: function() {
this.timeGrid.unrenderEvents(), this.dayGrid && this.dayGrid.unrenderEvents()
},
renderDrag: function(t, e) {
return t.start.hasTime() ? this.timeGrid.renderDrag(t, e) : this.dayGrid ? this.dayGrid.renderDrag(t, e) : void 0
},
unrenderDrag: function() {
this.timeGrid.unrenderDrag(), this.dayGrid && this.dayGrid.unrenderDrag()
},
renderSelection: function(t) {
t.start.hasTime() || t.end.hasTime() ? this.timeGrid.renderSelection(t) : this.dayGrid && this.dayGrid.renderSelection(t)
},
unrenderSelection: function() {
this.timeGrid.unrenderSelection(), this.dayGrid && this.dayGrid.unrenderSelection()
}
}),
Ne = {
renderHeadIntroHtml: function() {
var t, e = this.view;
return e.opt("weekNumbers") ? (t = this.start.format(e.opt("smallWeekFormat")), '<th class="fc-axis fc-week-number ' + e.widgetHeaderClass + '" ' + e.axisStyleAttr() + ">" + e.buildGotoAnchorHtml({
date: this.start,
type: "week",
forceOff: this.colCnt > 1
}, ct(t)) + "</th>") : '<th class="fc-axis ' + e.widgetHeaderClass + '" ' + e.axisStyleAttr() + "></th>"
},
renderBgIntroHtml: function() {
var t = this.view;
return '<td class="fc-axis ' + t.widgetContentClass + '" ' + t.axisStyleAttr() + "></td>"
},
renderIntroHtml: function() {
var t = this.view;
return '<td class="fc-axis" ' + t.axisStyleAttr() + "></td>"
}
},
ze = {
renderBgIntroHtml: function() {
var t = this.view;
return '<td class="fc-axis ' + t.widgetContentClass + '" ' + t.axisStyleAttr() + "><span>" + t.getAllDayHtml() + "</span></td>"
},
renderIntroHtml: function() {
var t = this.view;
return '<td class="fc-axis" ' + t.axisStyleAttr() + "></td>"
}
},
Ae = 5,
Ge = [{
hours: 1
}, {
minutes: 30
}, {
minutes: 15
}, {
seconds: 30
}, {
seconds: 15
}];
$t.agenda = {
class: Fe,
defaults: {
allDaySlot: !0,
slotDuration: "00:30:00",
slotEventOverlap: !0
}
}, $t.agendaDay = {
type: "agenda",
duration: {
days: 1
}
}, $t.agendaWeek = {
type: "agenda",
duration: {
weeks: 1
}
};
var Oe = be.extend({
grid: null,
scroller: null,
initialize: function() {
this.grid = new Ve(this), this.scroller = new Ee({
overflowX: "hidden",
overflowY: "auto"
})
},
renderSkeleton: function() {
this.el.addClass("fc-list-view " + this.widgetContentClass), this.scroller.render(), this.scroller.el.appendTo(this.el), this.grid.setElement(this.scroller.scrollEl)
},
unrenderSkeleton: function() {
this.scroller.destroy()
},
setHeight: function(t, e) {
this.scroller.setHeight(this.computeScrollerHeight(t))
},
computeScrollerHeight: function(t) {
return t - c(this.el, this.scroller.el)
},
renderDates: function() {
this.grid.setRange(this.renderRange)
},
renderEvents: function(t) {
this.grid.renderEvents(t)
},
unrenderEvents: function() {
this.grid.unrenderEvents()
},
isEventResizable: function(t) {
return !1
},
isEventDraggable: function(t) {
return !1
}
}),
Ve = me.extend({
segSelector: ".fc-list-item",
hasDayInteractions: !1,
spanToSegs: function(t) {
for (var e, n = this.view, i = n.renderRange.start.clone().time(0), r = 0, s = []; i < n.renderRange.end;)
if (e = N(t, {
start: i,
end: i.clone().add(1, "day")
}), e && (e.dayIndex = r, s.push(e)), i.add(1, "day"), r++, e && !e.isEnd && t.end.hasTime() && t.end < i.clone().add(this.view.nextDayThreshold)) {
e.end = t.end.clone(), e.isEnd = !0;
break
}
return s
},
computeEventTimeFormat: function() {
return this.view.opt("mediumTimeFormat")
},
handleSegClick: function(e, n) {
var i;
me.prototype.handleSegClick.apply(this, arguments), t(n.target).closest("a[href]").length || (i = e.event.url, i && !n.isDefaultPrevented() && (window.location.href = i))
},
renderFgSegs: function(t) {
return t = this.renderFgSegEls(t), t.length ? this.renderSegList(t) : this.renderEmptyMessage(), t
},
renderEmptyMessage: function() {
this.el.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">' + ct(this.view.opt("noEventsMessage")) + "</div></div></div>")
},
renderSegList: function(e) {
var n, i, r, s = this.groupSegsByDay(e),
o = t('<table class="fc-list-table"><tbody/></table>'),
l = o.find("tbody");
for (n = 0; n < s.length; n++)
if (i = s[n])
for (l.append(this.dayHeaderHtml(this.view.renderRange.start.clone().add(n, "days"))), this.sortEventSegs(i), r = 0; r < i.length; r++) l.append(i[r].el);
this.el.empty().append(o)
},
groupSegsByDay: function(t) {
var e, n, i = [];
for (e = 0; e < t.length; e++) n = t[e], (i[n.dayIndex] || (i[n.dayIndex] = [])).push(n);
return i
},
dayHeaderHtml: function(t) {
var e = this.view,
n = e.opt("listDayFormat"),
i = e.opt("listDayAltFormat");
return '<tr class="fc-list-heading" data-date="' + t.format("YYYY-MM-DD") + '"><td class="' + e.widgetHeaderClass + '" colspan="3">' + (n ? e.buildGotoAnchorHtml(t, {
class: "fc-list-heading-main"
}, ct(t.format(n))) : "") + (i ? e.buildGotoAnchorHtml(t, {
class: "fc-list-heading-alt"
}, ct(t.format(i))) : "") + "</td></tr>"
},
fgSegHtml: function(t) {
var e, n = this.view,
i = ["fc-list-item"].concat(this.getSegCustomClasses(t)),
r = this.getSegBackgroundColor(t),
s = t.event,
o = s.url;
return e = s.allDay ? n.getAllDayHtml() : n.isMultiDayEvent(s) ? t.isStart || t.isEnd ? ct(this.getEventTimeText(t)) : n.getAllDayHtml() : ct(this.getEventTimeText(s)), o && i.push("fc-has-url"), '<tr class="' + i.join(" ") + '">' + (this.displayEventTime ? '<td class="fc-list-item-time ' + n.widgetContentClass + '">' + (e || "") + "</td>" : "") + '<td class="fc-list-item-marker ' + n.widgetContentClass + '"><span class="fc-event-dot"' + (r ? ' style="background-color:' + r + '"' : "") + '></span></td><td class="fc-list-item-title ' + n.widgetContentClass + '"><a' + (o ? ' href="' + ct(o) + '"' : "") + ">" + ct(t.event.title || "") + "</a></td></tr>"
}
});
return $t.list = {
class: Oe,
buttonTextKey: "list",
defaults: {
buttonText: "list",
listDayFormat: "LL",
noEventsMessage: "No events to display"
}
}, $t.listDay = {
type: "list",
duration: {
days: 1
},
defaults: {
listDayFormat: "dddd"
}
}, $t.listWeek = {
type: "list",
duration: {
weeks: 1
},
defaults: {
listDayFormat: "dddd",
listDayAltFormat: "LL"
}
}, $t.listMonth = {
type: "list",
duration: {
month: 1
},
defaults: {
listDayAltFormat: "dddd"
}
}, $t.listYear = {
type: "list",
duration: {
year: 1
},
defaults: {
listDayAltFormat: "dddd"
}
}, Zt
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment